gtkwave-3.3.86/0000775000175000017500000000000013166335473012604 5ustar bybellbybellgtkwave-3.3.86/autogen.sh0000775000175000017500000000131713166335473014607 0ustar bybellbybell#! /bin/sh # # $Id: autogen.sh,v 1.2 2008/11/23 06:38:55 gtkwave Exp $ # # Run the various GNU autotools to bootstrap the build # system. Should only need to be done once. # for now avoid using bash as not everyone has that installed CONFIG_SHELL=/bin/sh export CONFIG_SHELL echo "Running aclocal..." aclocal $ACLOCAL_FLAGS || exit 1 echo "Done with aclocal" echo "Running autoheader..." autoheader || exit 1 echo "Done with autoheader" echo "Running automake..." automake -a -c --foreign || exit 1 echo "Done with automake" echo "builtin(include,./tcl.m4)" >>aclocal.m4 echo "Running autoconf..." autoconf || exit 1 echo "Done with autoconf" echo "You must now run configure" echo "All done with autogen.sh" gtkwave-3.3.86/man/0000775000175000017500000000000013166335473013357 5ustar bybellbybellgtkwave-3.3.86/man/vcd2lxt2.10000664000175000017500000000374213166335473015117 0ustar bybellbybell.TH "VCD2LXT2" "1" "1.3.42" "Anthony Bybell" "Filetype Conversion" .SH "NAME" .LP vcd2lxt2 \- Converts VCD files to LXT2 files .SH "SYNTAX" .LP vcd2lxt2 [\fIoption\fP]... [\fIVCDFILE\fP] [\fILXTFILE\fP] .SH "DESCRIPTION" .LP Converts VCD files to LXT2 files. .SH "OPTIONS" .LP .TP \fB\-v,\-\-vcdname\fR <\fIfilename\fP> Specify VCD input filename. .TP \fB\-l,\-\-lxtname\fR <\fIfilename\fP> Specify LXT2 output filename. .TP \fB\-d,\-\-depth\fR <\fIvalue\fP> Specify 0..9 gzip compression depth, default is 4. .TP \fB\-m,\-\-maxgranule\fR <\fIvalue\fP> Specify number of granules per section, default is 8. One granule is equal to 32 timsteps. .TP \fB\-b,\-\-break\fR <\fIvalue\fP> Specify break size (default = 0 = off). When the break size is exceeded, the LXT2 dumper will dump all state information at the next convenient granule plus dictionary boundary. .TP \fB\-p,\-\-partialmode\fR <\fImode\fP> Specify partial zip mode 0 = monolithic, 1 = separation. Using a value of 1 expands LXT2 filesize but provides fast access for very large traces. Note that the default mode is neither monolithic nor separation: partial zip is disabled. .TP \fB\-c,\-\-checkpoint\fR <\fImode\fP> Specify checkpoint mode. 0 is on which is default, and 1 is off. This is disabled when the break size is active. .TP \fB\-h,\-\-help\fR Show help screen. .TP .SH "EXAMPLES" .LP Note that you should specify dumpfile.vcd directly or use "\-" for stdin. .TP vcd2lxt dumpfile.vcd dumpfile.lxt \-\-depth 9 \-\-break 1073741824 This sets the compression level to 9 and sets the break size to 1GB. .TP vcd2lxt dumpfile.vcd dumpfile.lxt \-\-depth 9 \-\-maxgranule 256 Allows more granules per section which allows for greater compression. .SH "LIMITATIONS" \fIvcd2lxt2\fP does not store glitches as these are coalesced together into one value change during the writing of the LXT2 file. .LP .SH "AUTHORS" .LP Anthony Bybell .SH "SEE ALSO" .LP \fIlxt2vcd\fP(1) \fIvcd2lxt2\fP(1) \fIgtkwave\fP(1) gtkwave-3.3.86/man/gtkwave.10000664000175000017500000002570313166335473015120 0ustar bybellbybell.TH "GTKWAVE" "1" "3.3.74" "Anthony Bybell" "Simulation Wave Viewer" .SH "NAME" .LP gtkwave \- Visualization tool for VCD, LXT, LXT2, VZT, FST, and GHW files .SH "SYNTAX" .LP gtkwave [\fIoption\fP]... [\fIDUMPFILE\fP] [\fISAVEFILE\fP] [\fIRCFILE\fP] .SH "DESCRIPTION" .LP Visualization tool for VCD, LXT, LXT2, VZT, FST, and GHW. VCD is an industry standard simulation dump format. LXT, LXT2, VZT, and FST have been designed specifically for use with gtkwave. GHW is the native VHDL format generated by GHDL. Native dumpers exist in Icarus Verilog and the open source version of VeriWell for the LXT formats so conversion with \fIvcd2lxt\fP(1) or \fIvcd2lxt2\fP(1) is not necessary to take direct advantage of LXT with those simulators. AET2 files can also be processed provided that libae2rw is available but this is only of interest to people who use IBM EDA toolsets. .SH "OPTIONS" .LP .TP \fB\-n\fR,\fB\-\-nocli\fR <\fIdirectory name\fP> Use file requester for dumpfile name. .TP \fB\-f\fR,\fB\-\-dump\fR <\fIfilename\fP> Specify dumpfile name. .TP \fB\-F\fR,\fB\-\-fastload\fR generate/use VCD recoder fastload files. This is similar to the \fB\-g\fR,\fB\-\-giga\fR option, however the spill file generated is not deleted. Reloading the VCD file another time (either through pressing the reload button or by re-invoking gtkwave at a later time) will use this generated spill file rather than read the value change section of the VCD file. This will speed up reloads on large files greatly as only the variable declaration section needs to be parsed. Note that the spill file contains the file size and modification date of the VCD file in order to detect if it is stale and needs to be regenerated. .TP \fB\-o\fR,\fB\-\-optimize\fR optimize VCD to FST. This will automatically call \fIvcd2fst\fP(1) to perform the file conversion. This option is highly recommended with large VCD files in order to cut down on the memory usage required for file viewing. Can be used in conjunction with \fB\-v\fR,\fB\-\-vcd\fR. .TP \fB\-a\fR,\fB\-\-save\fR <\fIfilename\fP> Specify savefile name. Useful suffixes for desktop integration are .gtkw and .sav (deprecated). .TP \fB\-A\fR,\fB\-\-autosavename\fR Assume savefile is suffix modified dumpfile name (i.e., remove and replace with ".gtkw"). .TP \fB\-r\fR,\fB\-\-rcfile\fR <\fIfilename\fP> Specify override \fI.gtkwaverc\fP filename. .TP \fB\-l\fR,\fB\-\-logfile\fR <\fIfilename\fP> Specify simulation logfile name. Multiple logfiles may be specified by preceding each with the command flag. By selecting the numbers in the text widget, the marker will immediately zoom to the specific time value. .TP \fB\-d\fR,\fB\-\-defaultskip\fR If there is not a \fI.gtkwaverc\fP file in the home directory or current directory and it is not explicitly specified on the command line, when this option is enabled, do not use an implicit configuration file and instead default to the old "whitescreen" behavior. .TP \fB\-D\fR,\fB\-\-dualid\fR <\fIwhich\fP> Specify multisession identifier information. The format of "which" is m+nnnnnnnn where m is the session number 0 or 1 and nnnnnnnn is a hexadecimal value indicating the shared memory ID of an array of two gtkwave_dual_ipc_t data structures. The intended use of this flag is for front ends such as \fItwinwave\fP(1). .TP \fB\-s\fR,\fB\-\-start\fR <\fItime\fP> Specify start time for LXT2/VZT block skip. .TP \fB\-e\fR,\fB\-\-end\fR <\fItime\fP> Specify end time for LXT2/VZT block skip. .TP \fB\-t\fR,\fB\-\-stems\fR <\fIfilename\fP> Specify stems file for source code annotation. This will automatically launch the \fIrtlbrowse\fP(1) helper process. See \fIvermin\fP(1) for information on stems file generation. .TP \fB\-c\fR,\fB\-\-cpu\fR <\fInumcpus\fP> Specify number of CPUs available for parallelizable ops (e.g., block prefetching on VZT reads). .TP \fB\-N\fR,\fB\-\-nowm\fR Disable window manager for most windows. The intended use of this is to be used in conjunction with the \fB\-\-script\fR option, however this also can be used to reparent into an alternate window manager. .TP \fB\-M\fR,\fB\-\-nomenus\fR Do not render menubar. This is mainly used for making a restricted applet that cannot initiate file I/O on its own, however it also can be used as a workaround in earlier versions of GTK+ that do not handle GTKSocket/GTKPlug focus interactions properly. .TP \fB\-S\fR,\fB\-\-script\fR <\fIfilename\fP> Specify Tcl command script file for execution. .TP \fB\-T\fR,\fB\-\-tcl_init\fR <\fIfilename\fP> Specify Tcl command script to be loaded on startup. Implies \-\-wish command flag. .TP \fB\-W\fR,\fB\-\-wish\fR Enable Tcl command line on stdio. All script commands can be typed in on stdin. .TP \fB\-R\fR,\fB\-\-repscript\fR <\fIfilename\fP> Specify Tcl command script for periodic execution. .TP \fB\-P\fR,\fB\-\-repperiod\fR <\fIvalue\fP> Specifies delay in milliseconds between successive executions of the repscript. Default is 500. .TP \fB\-X\fR,\fB\-\-xid\fR <\fIXID\fP> Specify XID (in hexadecimal) of window for a GtkPlug to connect to. GTKWave does not directly render to a window but instead renders into a GtkPlug expecting a GtkSocket at the other end. Note that there are issues with accelerators working properly so menus are disabled in the componentized version of GTKWave when it functions as a plug-in. .TP \fB\-1\fR,\fB\-\-rpcid\fR <\fIRPCID\fP> Specify RPCID of GConf session. This is a decimal value zero or greater and is the identifier used by GConf to know what update data to listen to. This option only works if \fB\-\-with-gconf\fR was specified during \fI./configure\fP. .TP \fB\-2\fR,\fB\-\-chdir\fR <\fIDIRNAME\fP> Specify new current working directory. This is typically used in OSX to run gtkwave if it was compiled and placed in an .app bundle. Note that if the environment variable GTKWAVE_CHDIR is defined, the argument is a dummy argument. This is to support OSX in that the open command has difficulty in passing spaces as command line arguments and it is possible for \fIpwd\fP(1) to return spaces. .TP \fB\-3\fR,\fB\-\-restore\fR Restore previous default (0) or \fB\-\-rpcid\fR RPCID numbered session. This only works for one dumpfile, savefile, rcfile, and current working directory so it has the effect of restoring the most recently loaded file. If used in conjunction with the \fB\-\-rpcid\fR option, that option must be specified earlier in the command line than the \fB\-\-restore\fR option. If RPCID is not specified, then the default of 0 is used. This option only works if \fB\-\-with-gconf\fR was specified during \fI./configure\fP. .TP \fB\-4\fR,\fB\-\-rcvar\fR Specify single rc variable values individually. These take effect after any other rc variables have been loaded from internal defaults or from configuration files. .TP \fB\-I\fR,\fB\-\-interactive\fR Specifies that "interactive" VCD mode is to be used which allows a viewer to navigate a VCD trace while GTKWave is processing the VCD file. When this option is used, the filename is overloaded such that it is the hexadecimal value for the shared memory ID of a writer. Note that the shared memory ID can be passed straight from stdin by using the \fB\-\-vcd\fR option; see the manpage for \fIshmidcat\fP(1) for more details. .TP \fB\-L\fR,\fB\-\-legacy\fR Specifies that the viewer should use legacy VCD mode rather than the VCD recoder. Note that using legacy mode will require considerably more memory than the recoder and its use is discouraged for very large traces. .TP \fB\-g\fR,\fB\-\-giga\fR Specifies that the viewer should use gigabyte mempacking when recoding (possibly slower). This is equivalent to setting the vlist_spill and vlist_prepack flags in the rc file. .TP \fB\-C\fR,\fB\-\-comphier\fR Specifies that the viewer should use compressed hierarchy names when loading the dumpfile (available for VCD recoder, LXT, LXT2, and VZT). This will use less memory at the expense of compression/decompression delay. .TP \fB\-v\fR,\fB\-\-vcd\fR Use stdin as a VCD dumpfile. .TP \fB-O,\fB\-\-output\fR <\fIfilename\fP> Specify filename for stdout/stderr redirect. To disable messages to the console, use /dev/null as the filename. .TP \fB\-z\fR,\fB\-\-slider-zoom\fR Enable slider stretch zoom for the horizontal time slider. Clicking then dragging the very left or right edge of the slider can be used to provide fine-grained real-time zooming. .TP \fB\-V\fR,\fB\-\-version\fR Display version banner then exit. .TP \fB\-h\fR,\fB\-\-help\fR Display help then exit. .TP \fB\-x\fR,\fB\-\-exit\fR Exit after loading trace (for loader benchmarking). .SH "FILES" .LP \fI~/.gtkwaverc\fP (see manpage \fIgtkwaverc\fP(5)) .SH "EXAMPLES" .TP To run this program the standard way type: gtkwave dumpfile.vcd .TP Alternatively you can run it with a save file as: gtkwave dumpfile.vcd dumpfile.gtkw .TP To run interactively using shared memory handle 0x00050003: gtkwave \-I 00050003 dumpfile.gtkw .TP To pick up a dumpfile automatically from a save file (e.g., when launching from an icon): gtkwave \-\-save dumpfile.gtkw .TP To run from the app bundle gtkwave.app in OSX using /bin/sh: GTKWAVE_CHDIR=\`pwd\`;export GTKWAVE_CHDIR;open \-n \-W \-a gtkwave \-\-args \-\-chdir dummy \-\-dump des.vzt \-\-save des.gtkw .TP Alternatively, run the following Perl script gtkwave.app/Contents/Resources/bin/gtkwave to process command line arguments from OSX shell scripts. .TP Note that to pass non-flag items which start with a dash, that it is required to specify \-\- in order to turn off flag parsing. A second \-\- will disable parsing of any following arguments such that they can be passed on to Tcl scripts and retrieved via gtkwave::getArgv. .LP Command line options are not necessary for representing the dumpfile, savefile, and rcfile names. They are merely provided to allow specifying them out of order. .SH "BUGS" .TP AIX requires \-bmaxdata:0x80000000 (\-bmaxdata:0xd0000000/dsa for AIX 5.3) to be added to your list of compiler flags for xlc if you want GTKWave to be able to access more than 256MB of virtual memory. The value shown allows the VMM to use up to 2GB (3.25GB AIX5.3). This may be necessary for very large traces. .TP Shift and Page operations using the wave window hscrollbar may be nonfunctional as you move away from the dump start for very large traces. A trace that goes out to 45 billion ticks has been known to exhibit this problem. This stems from using the gfloat element of the horizontal slider to encode the time value for the left margin. The result is a loss of precision for very large values. Use the hotkeys or buttons at the top of the screen if this is a problem. .TP When running under Cygwin, it is required to enable Cygserver if shared memory IPC is being used. Specifically, this occurs when \fIrtlbrowse\fP(1) is launched as a helper process. See the Cygwin documentation for more information on how to enable Cygserver. .SH "AUTHORS" .LP Anthony Bybell .SH "SEE ALSO" .LP \fIgtkwaverc\fP(5) \fIlxt2vcd\fP(1) \fIvcd2lxt\fP(1) \fIvcd2lxt2\fP(1) \fIvzt2vcd\fP(1) \fIvcd2vzt\fP(1) \fIvermin\fP(1) \fIrtlbrowse\fP(1) \fItwinwave\fP(1) \fIshmidcat\fP(1) gtkwave-3.3.86/man/Makefile.am0000664000175000017500000000036013166335473015412 0ustar bybellbybell## -*- makefile -*- ## dist_man_MANS= evcd2vcd.1 fst2vcd.1 ghwdump.1 gtkwave.1 gtkwaverc.5 lxt2miner.1 \ lxt2vcd.1 rtlbrowse.1 shmidcat.1 \ twinwave.1 vcd2fst.1 vcd2lxt.1 vcd2lxt2.1 \ vcd2vzt.1 vermin.1 vzt2vcd.1 vztminer.1 fstminer.1 gtkwave-3.3.86/man/fst2vcd.10000664000175000017500000000174613166335473015024 0ustar bybellbybell.TH "FST2VCD" "1" "3.3.52" "Anthony Bybell" "Filetype Conversion" .SH "NAME" .LP fst2vcd \- Converts FST files to VCD .SH "SYNTAX" .LP fst2vcd [\fIoption\fP]... [\fIFSTFILE\fP] .SH "DESCRIPTION" .LP Converts FST files to VCD files. If an output filename is not specified, the VCD is emitted to stdout. .SH "OPTIONS" .LP .TP \fB\-f,\-\-fstname\fR <\fIfilename\fP> Specify FST input filename. .TP \fB\-o,\-\-output\fR <\fIfilename\fP> Specify optional VCD output filename. .TP \fB\-e,\-\-extensions\Fr Emit FST extensions to VCD. Enabling this may create VCD files unreadable by other tools. This is generally intended to be used as a debugging tool when developing FST writer interfaces to simulators. .TP \fB\-h,\-\-help\fR Display help then exit. .SH "EXAMPLES" .LP To run this program the standard way type: .TP fst2vcd filename.fst The VCD conversion is emitted to stdout. .SH "AUTHORS" .LP Anthony Bybell .SH "SEE ALSO" .LP \fIvcd2fst\fP(1) \fIgtkwave\fP(1) gtkwave-3.3.86/man/ghwdump.10000664000175000017500000000111313166335473015110 0ustar bybellbybell.TH "GHWDUMP" "1" "1.0" "Tristan Gingold" "GHW File Debugging Information" .SH "NAME" .LP ghwdump \- Dumps info contained in GHW files .SH "SYNTAX" .LP ghwdump [\fIoption\fP]... \fIGHWFILE\fP [[\fIGHWFILE\fP]...] .SH "DESCRIPTION" .LP Dumps information contained in GHW files for debugging purposes. .SH "OPTIONS" .LP .TP \fB\-t\fR Display types .TP \fB\-h\fR Display hierarchy .TP \fB\-T\fR Display time .TP \fB\-s\fR Display signals (and time) .TP \fB\-l\fR Display list of sections .TP \fB\-v\fR Verbose .SH "AUTHORS" .LP Tristan Gingold .SH "SEE ALSO" .LP \fIgtkwave\fP(1) gtkwave-3.3.86/man/vcd2fst.10000664000175000017500000000330313166335473015013 0ustar bybellbybell.TH "VCD2FST" "1" "3.3.53" "Anthony Bybell" "Filetype Conversion" .SH "NAME" .LP vcd2fst \- Converts VCD files to FST files .SH "SYNTAX" .LP vcd2fst [\fIoption\fP]... [\fIVCDFILE\fP] [\fIFSTFILE\fP] .SH "DESCRIPTION" .LP Converts VCD files to FST files. .SH "OPTIONS" .LP .TP \fB\-v,\-\-vcdname\fR <\fIfilename\fP> Specify VCD/FSDB/VPD/WLF input filename. Processing of filetypes other than VCD requires that the appropriate 2vcd converter was found during ./configure. .TP \fB\-f,\-\-fstname\fR <\fIfilename\fP> Specify FST output filename. .TP \fB\-4,\-\-fourpack\fR Indicates that LZ4 should be used for value change data (default). .TP \fB\-F,\-\-fastpack\fR Indicates that fastlz should be used instead of LZ4 for value change data. .TP \fB\-4,\-\-zlibpack\fR Indicates that zlib should be used instead of LZ4 for value change data. .TP \fB\-c,\-\-compress\fR Indicates that the entire file should be run through gzip on close. This results in much smaller files at the expense of a one-time decompression penalty on file open during reads. .TP \fB\-p,\-\-parallel\fR Indicates that parallel mode should be enabled. This spawns a worker thread to continue with FST block processing while conversion continues on the main thread for new FST block data. .TP \fB\-h,\-\-help\fR Show help screen. .TP .SH "EXAMPLES" .LP Note that you should specify dumpfile.vcd directly or use "\-" for stdin. .TP vcd2fst dumpfile.vcd dumpfile.fst \-\-compress This indicates that the FST file should be post-compressed on close. .SH "AUTHORS" .LP Anthony Bybell .SH "SEE ALSO" .LP \fIfst2vcd\fP(1) \fIvcd2lxt\fP(1) \fIvcd2lxt2\fP(1) \fIlxt2vcd\fP(1) \fIvcd2vzt\fP(1) \fIvzt2vcd\fP(1) \fIgtkwave\fP(1) gtkwave-3.3.86/man/vztminer.10000664000175000017500000000363613166335473015327 0ustar bybellbybell.TH "VZTMINER" "1" "3.2.1" "Anthony Bybell" "Dumpfile Data Mining" .SH "NAME" .LP vztminer \- Data mining of VZT files .SH "SYNTAX" .LP vztminer [\fIoption\fP]... [\fIVZTFILE\fP] .SH "DESCRIPTION" .LP Mines VZT files for specific data values and generates gtkwave save files to stdout for future reload. .SH "OPTIONS" .LP .TP \fB\-d,\-\-dumpfile\fR <\fIfilename\fP> Specify VZT input dumpfile. .TP \fB\-m,\-\-match\fR <\fIvalue\fP> Specifies "bitwise" match data (binary, real, string) .TP \fB\-x,\-\-hex\fR <\fIvalue\fP> Specifies hexadecimal match data that will automatically be converted to binary for searches .TP \fB\-n,\-\-namesonly\fR Indicates that only facnames should be printed in a gtkwave savefile compatible format. By doing this, the file can be used to specify which traces are to be imported into gtkwave. .TP \fB\-c,\-\-comprehensive\fR Indicates that results are not to stop after the first match. This can be used to extract all the matching values in the trace. .TP \fB\-h,\-\-help\fR Show help screen. .SH "EXAMPLES" .LP vztminer dumpfile.vzt \-\-hex 20470000 \-n .TP This attempts to match the hex value 20470000 across all facilities and when the value is encountered, the facname only is printed to stdout in order to generate a gtkwave compatible save file. .SH "LIMITATIONS" \fIvztminer\fP only prints the first time a value is encountered for a specific net. This is done in order to cut down on the size of output files and to aid in following data such as addresses through a simulation model. Note also that the reader algorithm attempts to reconstruct bitblasted nets back into their original vectors but this is not always successful, specifically in the case where the individual bitstrands are dumped in non-sequential order. .LP .SH "AUTHORS" .LP Anthony Bybell .SH "SEE ALSO" .LP \fIlxt2miner\fP(1) \fIvzt2vcd\fP(1) \fIlxt2vcd\fP(1) \fIvcd2lxt2\fP(1) \fIgtkwave\fP(1) gtkwave-3.3.86/man/rtlbrowse.10000664000175000017500000000330713166335473015467 0ustar bybellbybell.TH "RTLBROWSE" "1" "3.3.28" "Anthony Bybell" "File Viewing" .SH "NAME" .LP rtlbrowse \- Allows hierarchical browsing of Verilog HDL source code and library design files. .SH "SYNTAX" .LP rtlbrowse <\fIstemsfilename\fP> .SH "DESCRIPTION" .LP Allows hierarchical browsing of Verilog HDL source code and library design files. Navigation through the hierarchy may be done by clicking open areas of the tree widget and clicking on the individual levels of hierarchy. Inside the source code, selecting the module instantiation name by double clicking or selecting part of the name through drag-clicking will descend deeper into the RTL hierarchy. Note that it performs optional source code annotation when called as a helper application by \fIgtkwave\fP(1) and when the primary marker is set. Source code annotation is not available for all supported dumpfile types. It is directly available for LXT2, VZT, FST, and AET2. For VCD, use the \fB\-o\fR,\fB\-\-optimize\fR option of \fIgtkwave\fP(1) in order to optimize the VCD file into FST. All other dumpfile types (LXT, GHW) are unsupported at this time. .SH "EXAMPLES" .LP To run this program the standard way type: .TP rtlbrowse stemsfile The RTL is then brought up in a GTK tree viewer. Stems must have been previously generated with \fIvermin\fP(1) or some other tool capable of generating compatible stemsfiles. Note that \fIgtkwave\fP(1) will bring up this program as a client application for source code annotation. It does that by bringing up the viewer with the shared memory ID of a segment of memory in the viewer rather than using a stems filename. .SH "AUTHORS" .LP Anthony Bybell .SH "SEE ALSO" .LP \fIvermin\fP(1) \fIgtkwave\fP(1) gtkwave-3.3.86/man/Makefile.in0000664000175000017500000004253613166335473015436 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = man DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(dist_man_MANS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man5dir)" man5dir = $(mandir)/man5 NROFF = nroff MANS = $(dist_man_MANS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ dist_man_MANS = evcd2vcd.1 fst2vcd.1 ghwdump.1 gtkwave.1 gtkwaverc.5 lxt2miner.1 \ lxt2vcd.1 rtlbrowse.1 shmidcat.1 \ twinwave.1 vcd2fst.1 vcd2lxt.1 vcd2lxt2.1 \ vcd2vzt.1 vermin.1 vzt2vcd.1 vztminer.1 fstminer.1 all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign man/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign man/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-man1: $(dist_man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(dist_man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-man5: $(dist_man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(dist_man_MANS)'; \ test -n "$(man5dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man5dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man5dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.5[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man5dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man5dir)" || exit $$?; }; \ done; } uninstall-man5: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man5dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.5[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man5dir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(MANS) installdirs: for dir in "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man5dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-man5 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 uninstall-man5 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-man1 install-man5 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-man uninstall-man1 uninstall-man5 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/man/lxt2miner.10000664000175000017500000000327013166335473015367 0ustar bybellbybell.TH "LXT2MINER" "1" "3.2.1" "Anthony Bybell" "Dumpfile Data Mining" .SH "NAME" .LP lxt2miner \- Data mining of LXT2 files .SH "SYNTAX" .LP lxt2miner [\fIoption\fP]... [\fILXT2FILE\fP] .SH "DESCRIPTION" .LP Mines LXT2 files for specific data values and generates gtkwave save files to stdout for future reload. .SH "OPTIONS" .LP .TP \fB\-d,\-\-dumpfile\fR <\fIfilename\fP> Specify LXT2 input dumpfile. .TP \fB\-m,\-\-match\fR <\fIvalue\fP> Specifies "bitwise" match data (binary, real, string) .TP \fB\-x,\-\-hex\fR <\fIvalue\fP> Specifies hexadecimal match data that will automatically be converted to binary for searches .TP \fB\-n,\-\-namesonly\fR Indicates that only facnames should be printed in a gtkwave savefile compatible format. By doing this, the file can be used to specify which traces are to be imported into gtkwave. .TP \fB\-c,\-\-comprehensive\fR Indicates that results are not to stop after the first match. This can be used to extract all the matching values in the trace. .TP \fB\-h,\-\-help\fR Show help screen. .SH "EXAMPLES" .LP lxt2miner dumpfile.lxt2 \-\-hex 20470000 \-n .TP This attempts to match the hex value 20470000 across all facilities and when the value is encountered, the facname only is printed to stdout in order to generate a gtkwave compatible save file. .SH "LIMITATIONS" \fIlxt2miner\fP only prints the first time a value is encountered for a specific net. This is done in order to cut down on the size of output files and to aid in following data such as addresses through a simulation model. .LP .SH "AUTHORS" .LP Anthony Bybell .SH "SEE ALSO" .LP \fIvztminer\fP(1) \fIvzt2vcd\fP(1) \fIlxt2vcd\fP(1) \fIvcd2lxt2\fP(1) \fIgtkwave\fP(1) gtkwave-3.3.86/man/vcd2lxt.10000664000175000017500000000366613166335473015042 0ustar bybellbybell.TH "VCD2LXT" "1" "1.3.34" "Anthony Bybell" "Filetype Conversion" .SH "NAME" .LP vcd2lxt \- Converts VCD files to interlaced or linear LXT files .SH "SYNTAX" .LP vcd2lxt [\fIVCDFILE\fP] [\fILXTFILE\fP] [\fIoption\fP]... .SH "DESCRIPTION" .LP Converts VCD files to interlaced or linear LXT files. Noncompressed interlaced files will provide the fastest access, linear files will provide the slowest yet have the greatest compression ratios. .SH "OPTIONS" .LP .TP \fB\-stats\fR Prints out statistics on all nets in VCD file in addition to performing the conversion. .TP \fB\-clockpack\fR Apply two\-way subtraction algorithm in order to identify nets whose value changes by a constant XOR or whose value increases/decreases by a constant amount per constant unit of time. This option can reduce dumpfile size dramatically as value changes can be represented by an equation rather than explicitly as a triple of time, net, and value. .TP \fB\-chgpack\fR Emit data to file after being filtered through zlib (gzip). .TP \fB\-linear\fR Write out LXT in "linear" format with no backpointers. These are re\-generated during initialization in \fIgtkwave\fP. Additionally, use libbz2 (bzip2) as the compression filter. .TP \fB\-dictpack\fR <\fIsize\fP> Store value changes greater than or equal to \fIsize\fP bits as an index into a dictionary. Experimentation shows that a value of 18 is optimal for most cases. .SH "EXAMPLES" .LP Note that you should specify dumpfile.vcd directly or use "\-" for stdin. .TP vcd2lxt dumpfile.vcd dumpfile.lxt \-clockpack \-chgpack \-dictpack 18 This turns on clock packing, zlib compression, and enables the dictionary encoding. Note that using no options writes out a normal LXT file. .TP vcd2lxt dumpfile.vcd dumpfile.lxt \-clockpack \-linear \-dictpack 18 Uses linear mode for even smaller files. .SH "AUTHORS" .LP Anthony Bybell .SH "SEE ALSO" .LP \fIlxt2vcd\fP(1) \fIvcd2lxt2\fP(1) \fIgtkwave\fP(1) gtkwave-3.3.86/man/lxt2vcd.10000664000175000017500000000310013166335473015021 0ustar bybellbybell.TH "LXT2VCD" "1" "3.3.39" "Anthony Bybell" "Filetype Conversion" .SH "NAME" .LP lxt2vcd \- Converts LXT2 files to VCD .SH "SYNTAX" .LP lxt2vcd [\fIoption\fP]... [\fILXT2FILE\fP] .SH "DESCRIPTION" .LP Converts LXT2 files to VCD files on stdout. If an output filename is not specified, the VCD is emitted to stdout. Note that "regular" LXT2 files will convert to VCD files with monotonically increasing time values. LXT2 files which are dumped with the "partial" option (to speed up access in wave viewers) will dump with monotonically increasing time values per 2k block of nets. This may be fixed in later versions of \fIlxt2vcd\fP. .SH "OPTIONS" .LP .TP \fB\-l,\-\-lxtname\fR <\fIfilename\fP> Specify LXT2 input filename. .TP \fB\-o,\-\-output\fR <\fIfilename\fP> Specify optional VCD output filename. .TP \fB\-f,\-\-flatearth\fR Emit flattened hierarchies. .TP .TP \fB\-n,\-\-notruncate\fR Do not shorten bitvectors. This disables binary value compression as described in the IEEE-1364 specification. (i.e., all values except for '1' left propagate as a sign bit on vectors which do not fill up their entire declared width) .TP \fB\-h,\-\-help\fR Display help then exit. .SH "EXAMPLES" .LP To run this program the standard way type: .TP lxt2vcd filename.lxt The VCD conversion is emitted to stdout. .SH "LIMITATIONS" \fIlxt2vcd\fP does not re-create glitches as these are coalesced together into one value change during the writing of the LXT2 file. .LP .SH "AUTHORS" .LP Anthony Bybell .SH "SEE ALSO" .LP \fIvcd2lxt2\fP(1) \fIvcd2lxt\fP(1) \fIgtkwave\fP(1) gtkwave-3.3.86/man/fstminer.10000664000175000017500000000326213166335473015273 0ustar bybellbybell.TH "FSTMINER" "1" "3.3.38" "Anthony Bybell" "Dumpfile Data Mining" .SH "NAME" .LP fst2miner \- Data mining of FST files .SH "SYNTAX" .LP fstminer [\fIoption\fP]... [\fIFSTFILE\fP] .SH "DESCRIPTION" .LP Mines FST files for specific data values and generates gtkwave save files to stdout for future reload. .SH "OPTIONS" .LP .TP \fB\-d,\-\-dumpfile\fR <\fIfilename\fP> Specify FST input dumpfile. .TP \fB\-m,\-\-match\fR <\fIvalue\fP> Specifies "bitwise" match data (binary, real, string) .TP \fB\-x,\-\-hex\fR <\fIvalue\fP> Specifies hexadecimal match data that will automatically be converted to binary for searches .TP \fB\-n,\-\-namesonly\fR Indicates that only facnames should be printed in a gtkwave savefile compatible format. By doing this, the file can be used to specify which traces are to be imported into gtkwave. .TP \fB\-c,\-\-comprehensive\fR Indicates that results are not to stop after the first match. This can be used to extract all the matching values in the trace. .TP \fB\-h,\-\-help\fR Show help screen. .SH "EXAMPLES" .LP fstminer dumpfile.fst \-\-hex 20470000 \-n .TP This attempts to match the hex value 20470000 across all facilities and when the value is encountered, the facname only is printed to stdout in order to generate a gtkwave compatible save file. .SH "LIMITATIONS" \fIfstminer\fP only prints the first time a value is encountered for a specific net. This is done in order to cut down on the size of output files and to aid in following data such as addresses through a simulation model. .LP .SH "AUTHORS" .LP Anthony Bybell .SH "SEE ALSO" .LP \fIvztminer\fP(1) \fIlxt2miner\fP(1) \fIfst2vcd\fP(1) \fIvcd2fst2\fP(1) \fIgtkwave\fP(1) gtkwave-3.3.86/man/shmidcat.10000664000175000017500000000235213166335473015237 0ustar bybellbybell.TH "SHMIDCAT" "1" "3.0.8" "Anthony Bybell" "Shared Memory Trampoline" .SH "NAME" .LP shmidcat \- Copies stdin/file to a shared memory block for \fIgtkwave\fP(1) .SH "SYNTAX" .LP shmidcat [\fIVCDFILE\fP] .SH "DESCRIPTION" .LP Copies either the file specified at the command line or stdin (if no file specified) line by line to a shared memory block. stdout will contain a shared memory ID which should be passed on to \fIgtkwave\fP(1). .SH "EXAMPLES" .LP To run this program the standard way type: .TP cat whatever.vcd | shmidcat The shared memory ID is emitted to stdout. .TP shmidcat whatever.vcd | gtkwave \-v \-I whatever.sav GTKWave directly grabs the ID from stdin. .SH "LIMITATIONS" This program is mainly for illustrative and testing purposes only. Its primary use is for people who wish to write interactive VCD dumpers for \fIgtkwave\fP(1) as its source code may be examined, particularly the emit_string() function. It can also be used to test if an existing VCD file will load properly in interactive mode. Note that it can also be used to redirect VCD files which are written into a pipe to \fIgtkwave\fP(1) in a non-blocking fashion. .LP .SH "AUTHORS" .LP Anthony Bybell .SH "SEE ALSO" .LP \fIgtkwave\fP(1) gtkwave-3.3.86/man/evcd2vcd.10000664000175000017500000000146113166335473015143 0ustar bybellbybell.TH "EVCD2VCD" "1" "3.2.2" "Anthony Bybell" "Filetype Conversion" .SH "NAME" .LP evcd2vcd \- Converts EVCD files to VCD files .SH "SYNTAX" .LP evcd2vcd [\fIoption\fP]... [\fIEVCDFILE\fP] .SH "DESCRIPTION" .LP Converts EVCD files with bidirectional port definitions to VCD files with separate in and out ports. .SH "OPTIONS" .LP .TP \fB\-f,\-\-filename\fR <\fIfilename\fP> Specify EVCD input filename. .TP \fB\-h,\-\-help\fR Show help screen. .TP .SH "EXAMPLES" .LP Note that you should specify dumpfile.vcd directly or use "\-" for stdin. .TP evcd2vcd dumpfile.evcd VCD is emitted to stdout. .SH "AUTHORS" .LP Anthony Bybell .SH "SEE ALSO" .LP \fIvcd2fst\fP(1) \fIfst2vcd\fP(1) \fIvcd2lxt\fP(1) \fIvcd2lxt2\fP(1) \fIlxt2vcd\fP(1) \fIvcd2vzt\fP(1) \fIvzt2vcd\fP(1) \fIgtkwave\fP(1) gtkwave-3.3.86/man/vermin.10000664000175000017500000000367313166335473014752 0ustar bybellbybell.TH "VERMIN" "1" "0.1.1" "Anthony Bybell" "Verilog Compilation" .SH "NAME" .LP vermin \- Parses and processes Verilog HDL files .SH "SYNTAX" .LP vermin [\fIVERILOGFILE\fP]... [\fIoption\fP]... .SH "DESCRIPTION" .LP Parses Verilog HDL files for use by other tools. The Verilog grammar used is 1364-1995. .SH "OPTIONS" .LP .TP \fB\-h[elp]\fR Prints out help screen. .TP \fB\-emitmono \fIfname\fP\fR Emit monolithic (parser view of) file to \fIfname\fP. .TP \fB\-emitstems\fR Emit source code stems to stdout. .TP \fB\-emitvars\fR Emit source code variables to stdout. .TP \fB\-D\fIx\fP=\fIy\fP Equivalent to `define \fIX Y\fP in source. .TP \fB\+define+\fIx\fP=\fIy\fP\fR Equivalent to `define \fIX Y\fP in source. .TP \fB\+incdir+\fIdirname\fP\fR Add \fIdirname\fP to include search path. .TP \fB\+libext+\fIext\fP\fR Add \fIext\fP to filename when searching for files. .TP \fB\-pragma \fIname\fP\fR Add \fIname\fP (synopsys, verilint, vertex) to accepted pragmas. Note that "vertex" is for legacy reasons; the executable name has since changed to avoid name clashes with an existing 3D modeling program. .TP \fB\-y \fIdirname\fP\fR Add directory \fIdirname\fP to source input path. .TP \fB\-yi \fIdirname\fP\fR Add directory \fIdirname\fP to source input path (case insensitive search). .TP \fB\-f \fIfilename\fP\fR Insert args from filename. Does not work recursively. .SH "EXAMPLES" .LP The following indicates that the library extension is .v and that the include directory is the current working directory and that the library directory is also the current working directory. Stems generation is enabled to generate a stems file for use with other tools. Various compile-time defines are also defined on the command line. .TP vermin XYZ450AC6V1.v \-emitstems \-y . \+incdir+. \+libext+.v \-DUTLB_OutputData=0 \-D__PORTALS_VERILOG__ .SH "AUTHORS" .LP Anthony Bybell .SH "SEE ALSO" .LP \fIrtlbrowse\fP(1) \fIgtkwave\fP(1) gtkwave-3.3.86/man/gtkwaverc.50000664000175000017500000005537413166335473015460 0ustar bybellbybell.TH "GTKWAVERC" "5" "3.3.81" "Anthony Bybell" "GTKWave Configuration File" .SH "NAME" .LP gtkwaverc \- GTKWave Configuration File .SH "SYNTAX" .LP option <\fIvalue\fP> .TP The configuration file is a series of option and value pairs. Comment lines marked with an initial '#' character are permissible. Blank lines are ignored. .SH "DESCRIPTION" .LP Configuration file for \fIgtkwave\fP(1). The search path for the configuration file (if unspecified) is the current working directory followed by the user's home directory. .SH "OPTIONS" .LP .TP \fBaccel\fR <\fI"pathvalue" accelerator\fP> This allows replacement of menu accelerator keys. See the .gtkwaverc file in the source distribution for examples on pathvalue and accelerator syntax. The special accelerator value of \fI(null)\fP means that no accelerator is bound to the menu item. .TP \fBalt_hier_delimeter\fR <\fIvalue\fP> This allows another character in addition to the hier_delimeter to be used to delimit levels in the hierarchy for VCD. Only the first character in the value is significant. Note that this is normally off. The intended use is to resolve the hierarchies of netlist based models that often contain slashes to delimit hierarchy inside of $var statements. .TP \fBalt_wheel_mode\fR <\fIvalue\fP> Default is on. Scrollwheel alone pans along a quarter at a time rather than a full page, so you don't get lost. Ctrl+wheel zooms in/out around the mouse cursor position, not the marker position. Alt+wheel edges left/right based on the currently selected signal. This makes measuring deltas easier. .TP \fBanalog_redraw_skip_count\fR <\fIvalue\fP> Specifies how many overlapping analog segments can be drawn for a given X position onscreen. (Default: 20) If there are gaps in analog traces, this value is too low. .TP \fBappend_vcd_hier\fR <\fIvalue\fP> Allows the specification of a prefix hierarchy for VCD files. This can be done in "pieces," so that multiple layers of hierarchy are prepended to symbol names with the most significant addition occurring first (see .gtkwaverc in the examples/vcd directory). The intended use of this is to have the ability to add "project" prefixes which allow easier selection of everything from the tree hierarchy. .TP \fBatomic_vectors\fR <\fIvalue\fP> Speeds up vcd loading and takes up less memory. This option is deprecated; it is currently the default. .TP \fBautocoalesce\fR <\fIvalue\fP> A nonzero value enables autocoalescing of VCD vectors when applicable. This may be toggled dynamically during wave viewer usage. .TP \fBautocoalesce_reversal\fR <\fIvalue\fP> causes split vectors to be reconstructed in reverse order (only if autocoalesce is also active). .TP \fBautoname_bundles\fR <\fIvalue\fP> A nonzero value indicates that GTKWave will create its own bundle names rather than prompting the user for them. .TP \fBclipboard_mouseover\fR <\fIvalue\fP> A nonzero value indicates that when mouseover is enabled, all values generated for the tooltips will be automatically copied into the clipboard so they may be pasted into other programs such as text editors, etc. .TP \fBcolor_0\fR <\fIvalue\fP> trace color when 0. .TP \fBcolor_1\fR <\fIvalue\fP> trace color when 1. .TP \fBcolor_1fill\fR <\fIvalue\fP> trace color (inside of box) when 1. .TP \fBcolor_back\fR <\fIvalue\fP> background color. .TP \fBcolor_baseline\fR <\fIvalue\fP> middle mouse button marker color. .TP \fBcolor_black\fR <\fIvalue\fP> color value for "black" in signal window. .TP \fBcolor_brkred\fE <\fIvalue\fP> brick red color for comments. .TP \fBcolor_dash\fR <\fIvalue\fP> trace color when don't care ("-"). .TP \fBcolor_dashfill\fR <\fIvalue\fP> trace color (inside of box) when don't care ("-"). .TP \fBcolor_dkblue\fR <\fIvalue\fP> color value for "dark blue" in signal window. .TP \fBcolor_dkgray\fR <\fIvalue\fP> color value for "dark gray" in signal window. .TP \fBcolor_gmstrd\fR <\fIvalue\fP> color value for trace groupings. .TP \fBcolor_grid\fR <\fIvalue\fP> grid color (use Alt-G/Shift-Alt-G to show/hide grid). This is also the color used for \fBhighlight_wavewindow\fR when enabled. .TP \fBcolor_grid2\fR <\fIvalue\fP> grid color for secondary pattern search. .TP \fBcolor_high\fR <\fIvalue\fP> trace color when high ("H"). .TP \fBcolor_highfill\fR <\fIvalue\fP> trace color (inside of box) when high ("H"). .TP \fBcolor_low\fR <\fIvalue\fP> trace color when low ("L"). .TP \fBcolor_ltblue\fR <\fIvalue\fP> color for shadowed traces. .TP \fBcolor_ltgray\fR <\fIvalue\fP> color value for "light gray" in signal window. .TP \fBcolor_mark\fR <\fIvalue\fP> color of the named markers. .TP \fBcolor_mdgray\fR <\fIvalue\fP> color value for "medium gray" in signal window. .TP \fBcolor_mid\fR <\fIvalue\fP> trace color when floating ("Z"). .TP \fBcolor_normal\fR <\fIvalue\fP> color value for "normal" GTK state in signal window. .TP \fBcolor_time\fR <\fIvalue\fP> text color for timebar. .TP \fBcolor_timeb\fR <\fIvalue\fP> text color for timebar's background. .TP \fBcolor_trans\fR <\fIvalue\fP> trace color when transitioning. .TP \fBcolor_u\fR <\fIvalue\fP> trace color when undefined ("U"). .TP \fBcolor_ufill\fR <\fIvalue\fP> trace color (inside of box) when undefined ("U"). .TP \fBcolor_umark\fR <\fIvalue\fP> color of the unnamed (primary) marker. .TP \fBcolor_value\fR <\fIvalue\fP> text color for vector values. .TP \fBcolor_vbox\fR <\fIvalue\fP> vector color (horizontal). .TP \fBcolor_vtrans\fR <\fIvalue\fP> vector color (verticals/transitions). .TP \fBcolor_w\fR <\fIvalue\fP> trace color when weak ("W"). .TP \fBcolor_wfill\fR <\fIvalue\fP> trace color (inside of box) when weak ("W"). .TP \fBcolor_white\fR <\fIvalue\fP> color value for "white" in signal window. .TP \fBcolor_x\fR <\fIvalue\fP> trace color when undefined ("X") (collision for VHDL). .TP \fBcolor_xfill\fR <\fIvalue\fP> trace color (inside of box) when undefined ("X") (collision for VHDL). .TP \fBconstant_marker_update\fR <\fIvalue\fP> A nonzero value indicates that the values for traces listed in the signal window are to be updated constantly when the left mouse button is being held down rather than only when it is first pressed then when released (which is the default). .TP \fBcontext_tabposition\fR <\fIvalue\fP> Use zero for tabbed viewing with named tabs at the top. Nonzero places numerically indexed tabs at the left. .TP \fBconvert_to_reals\fR <\fIvalue\fP> Converts all integer and parameter VCD declarations to real-valued ones when set to a nonzero/yes value. The positive aspect of this is that integers and parameters will take up less space in memory and will automatically display in decimal format. The negative aspect of this is that integers and parameters will only be displayable as decimals and can't be bit reversed, inverted, etc. .TP \fBcursor_snap\fR <\fIvalue\fP> A nonzero value indicates the number of pixels the marker should snap to for the nearest signal transition. .TP \fBdisable_ae2_alias\fR <\fIvalue\fP> A nonzero value indicates that the AE2 loader is to ignore the aliasdb keyword and is not to construct facility aliases. .TP \fBdisable_auto_comphier\fR <\fIvalue\fP> A nonzero value indicates that the loaders that support compressed hierarchies should not automatically turn on compression if the threshold count of signals (500000) has been reached. .TP \fBdisable_empty_gui\fR <\fIvalue\fP> A nonzero value indicates that if gtkwave is invoked without a dumpfile name, then an empty gtkwave session is to be suppressed. Default is a zero value: to bring up an empty session which needs a file loaded or dragged into it. .TP \fBdisable_mouseover\fR <\fIvalue\fP> A nonzero value indicates that signal/value tooltip pop up bubbles on mouse button presses should be disabled in the value window. A zero value indicates that value tooltips should be active (default is disabled). .TP \fBdisable_tooltips\fR <\fIvalue\fP> A nonzero value indicates that tooltip pop up bubbles should be disabled. A zero value indicates that tooltips should be active (default). .TP \fBdo_initial_zoom_fit\fR <\fIvalue\fP> A nonzero value indicates that the trace should initially be crunched to fit the screen. A zero value indicates that the initial zoom should be zero (default). .TP \fBdragzoom_threshold\fR <\fIvalue\fP> A nonzero value indicates the number of pixels in the x direction the marker must move in order for a dragzoom to be triggered. This is largely to handle noisy input devices. .TP \fBdynamic_resizing\fR <\fIvalue\fP> A nonzero value indicates that dynamic resizing should be initially enabled (default). A zero value indicates that dynamic resizing should be initially disabled. .TP \fBeditor\fR <\fI"value"\fP> This is used to specify a string (quotes mandatory) for when gtkwave invokes a text editor (e.g., Open Source Definition). Examples are: editor "vimx -g +%d %s", editor "gedit +%d %s", editor "emacs +%d %s", and for OSX, editor "mate -l %d %s". The %d may be combined with other characters in a string such as +, etc. The %s argument must stand by itself. Note that if this rc variable is not set, then the environment variable GTKWAVE_EDITOR will be consulted next, then finally gedit will be used (if found). .TP \fBenable_fast_exit\fR <\fIvalue\fP> Allows exit without bringing up a confirmation requester. The default is nonzero/yes. .TP \fBenable_ghost_marker\fR <\fIvalue\fP> lets the user turn on/off the ghost marker during primary marker dragging. Default is enabled. .TP \fBenable_horiz_grid\fR <\fIvalue\fP> A nonzero value indicates that when grid drawing is enabled, horizontal lines are to be drawn. This is the default. .TP \fBenable_vcd_autosave\fR <\fIvalue\fP> causes the vcd loader to automatically generate a .sav file (vcd_autosave.sav ) in the cwd if a save file is not specified on the command line. Note that this mirrors the VCD $var defs and no attempt is made to coalesce split bitvectors back together. .TP \fBenable_vert_grid\fR <\fIvalue\fP> A nonzero value indicates that when grid drawing is enabled, vertical lines are to be drawn. This is the default. Note that all possible combinations of enable_horiz_grid and enable_vert_grid values are acceptable. .TP \fBfill_waveform\fR <\fIvalue\fP> A zero value indicates that the waveform should not be filled for 1/H values. This is the default. .TP \fBfontname_logfile\fR <\fIvalue\fP> When followed by an argument, this indicates the name of the X11 font that you wish to use for the logfile browser. You may generate appropriate fontnames using the xfontsel program. .TP \fBfontname_signals\fR <\fIvalue\fP> When followed by an argument, this indicates the name of the X11 font that you wish to use for signals. You may generate appropriate fontnames using the xfontsel program. .TP \fBfontname_waves\fR <\fIvalue\fP> When followed by an argument, this indicates the name of the X11 font that you wish to use for waves. You may generate appropriate fontnames using the xfontsel program. Note that the signal font must be taller than the wave font or the viewer will complain then terminate. .TP \fBforce_toolbars\fR <\fIvalue\fP> When enabled, this forces everything above the signal and wave windows to be rendered as toolbars. This allows for them to be detached which allows for more usable wave viewer space. By default this is off. .TP \fBhide_sst\fR <\fIvalue\fP> Hides the Signal Search Tree widget for GTK2.4 and greater such that it is not embedded into the main viewer window. It is still reachable as an external widget through the menus. .TP \fBhier_delimeter\fR <\fIvalue\fP> This allows characters other than '/' to be used to delimit levels in the hierarchy. Only the first character in the value is significant. .TP \fBhier_grouping\fR <\fIvalue\fP> For the tree widgets, this allows the hierarchies to be grouped in a single place rather than spread among the netnames. .TP \fBhier_ignore_escapes\fR <\fIvalue\fP> A nonzero value indicates that the signal pane ignores escapes in identifiers when determining the hierarchy maximum depth. Default is disabled so that escapes are examined. .TP \fBhier_max_level\fR <\fIvalue\fP> Sets the maximum hierarchy depth (from the right side) to display for trace names. Note that a value of zero displays the full hierarchy name. .TP \fBhighlight_wavewindow\fR <\fIvalue\fP> When enabled, this causes traces highlighted in the signal window also to be highlighted in the wave window. .TP \fBhpane_pack\fR <\fIvalue\fP> A nonzero value indicates that the horizontal pane should be constructed using the gtk_paned_pack functions (default and recommended). A zero value indicates that gtk_paned_add will be used instead. .TP \fBignore_savefile_pane_pos\fR <\fIvalue\fP> If nonzero, specifies that the pane position attributes (i.e., signal window width size, SST is expanded, etc.) are to be ignored during savefile loading and is to be skipped during saving. Default is that the attribute is used. .TP \fBignore_savefile_pos\fR <\fIvalue\fP> If nonzero, specifies that the window position attribute is to be ignored during savefile loading and is to be skipped during saving. Default is that the position attribute is used. .TP \fBignore_savefile_size\fR <\fIvalue\fP> If nonzero, specifies that the window size attribute is to be ignored during savefile loading and is to be skipped during saving. Default is that the size attribute is used. .TP \fBinitial_signal_window_width\fR <\fIvalue\fP> Sets the creation width for the signal pane on GUI initialization. Also sets another potential minimum value for dynamic resizing. .TP \fBinitial_window_x\fR <\fIvalue\fP> Sets the size of the initial width of the wave viewer window. Values less than or equal to zero will set the initial width equal to \-1 which will let GTK determine the minimum size. .TP \fBinitial_window_xpos\fR <\fIvalue\fP> Sets the size of the initial x coordinate of the wave viewer window. \-1 will let the window manager determine the position. .TP \fBinitial_window_y\fR <\fIvalue\fP> Sets the size of the initial height of the wave viewer window. Values less than or equal to zero will set the initial width equal to \-1 which will let GTK determine the minimum size. .TP \fBinitial_window_ypos\fR <\fIvalue\fP> Sets the size of the initial y coordinate of the wave viewer window. \-1 will let the window manager determine the position. .TP \fBkeep_xz_colors\fR <\fIvalue\fP> When nonzero, indicates that the original color scheme for non 0/1 signal values is to be used when Color Format overrides are in effect. Default is off. .TP \fBleft_justify_sigs\fR <\fIvalue\fP> When nonzero, indicates that the signal window signal name justification should default to left, else the justification is to the right (default). .TP \fBlxt_clock_compress_to_z\fR <\fIvalue\fP> For LXT (not LXT2) allows clocks to compress to a 'z' value so that regular/periodic value changes may be noted. .TP \fBmax_fsdb_trees\fR <\fIvalue\fP> sets the maximum number of hierarchy and signal trees to process for an FSDB file. Default = 0 = unlimited. The intent of this is to work around sim environments that accidentally call fsdbDumpVars multiple times. .TP \fBpage_divisor\fR <\fIvalue\fP> Sets the scroll amount for page left and right operations. (The buttons, not the hscrollbar.) Values over 1.0 are taken as 1/x and values equal to and less than 1.0 are taken literally. (i.e., 2 gives a half-page scroll and .67 gives 2/3). The default is 1.0. .TP \fBps_maxveclen\fR <\fIvalue\fP> sets the maximum number of characters that can be printed for a value in the signal window portion of a postscript file (not including the net name itself). Legal values are 4 through 66 (default). .TP \fBruler_origin\fR <\fIvalue\fP> sets the zero origin for alternate time tick marks. .TP \fBruler_step\fR <\fIvalue\fP> sets the left/right step value for the alternate time tick marks from the origin. When this value is zero, alternate time tick marks are disabled. .TP \fBscale_to_time_dimension\fR <\fIvalue\fP> The value can be any of the characters m, u, n, f, p, or s, which indicates which time dimension to convert the time values to. The default for this is * which means that time dimension conversion is disabled. .TP \fBshow_base_symbols\fR <\fIvalue\fP> A nonzero value (default) indicates that the numeric base symbols for hexadecimal ('$'), binary ('%'), and octal ('#') should be rendered. Otherwise they will be omitted. .TP \fBshow_grid\fR <\fIvalue\fP> A nonzero value (default) indicates that a grid should be drawn behind the traces. A zero indicates that no grid should be drawn. .TP \fBsplash_disable\fR <\fIvalue\fP> Turning this off enables the splash screen with the GTKWave mascot when loading a trace. Default is on. .TP \fBsst_dynamic_filter\fR <\fIvalue\fP> When true (default) allows the SST dialog signal filter to filter signals while keys are being pressed, otherwise enter must be pressed to cause the filter to go active. .TP \fBsst_expanded\fR <\fIvalue\fP> When true allows the SST dialog (when not hidden) to come up already expanded. .TP \fBstrace_repeat_count\fR <\fIvalue\fP> Determines how many times that edge search and pattern search will iterate on a search. This allows, for example, skipping ahead 10 clock edges instead of 1. .TP \fBuse_big_fonts\fR <\fIvalue\fP> A nonzero value indicates that any text rendered into the wave window will use fonts that are four points larger in size than normal. This can enhance readability. A zero value indicates that normal font sizes should be used. .TP \fBuse_frequency_delta\fR <\fIvalue\fP> allows you to switch between the delta time and frequency display in the upper right corner of the main window when measuring distances between markers. Default behavior is that the delta time is displayed (off). .TP \fBuse_full_precision\fR <\fIvalue\fP> does not round time values when the number of ticks per pixel onscreen is greater than 10 when active. The default is that this feature is disabled. .TP \fBuse_maxtime_display\fR <\fIvalue\fP> A nonzero value indicates that the maximum time will be displayed in the upper right corner of the screen. Otherwise, the current primary (unnamed) marker time will be displayed. This can be toggled at any time with the Toggle Max-Marker menu option. .TP \fBuse_nonprop_fonts\fR <\fIvalue\fP> Allows accelerated redraws of the signalwindow that can be done because the font width is constant. Default is off. .TP \fBuse_pango_fonts\fR <\fIvalue\fP> Uses anti-aliased pango fonts (GTK2) rather than bitmapped X11 ones. Default is on. .TP \fBuse_roundcaps\fR <\fIvalue\fP> A nonzero value indicates that vector traces should be drawn with rounded caps rather than perpendicular ones. The default for this is zero. .TP \fBuse_scrollbar_only\fR <\fIvalue\fP> A nonzero value indicates that the page, shift, fetch, and discard buttons should not be drawn (i.e., time manipulations should be through the scrollbar only rather than front panel buttons). The default for this is zero. .TP \fBuse_scrollwheel_as_y\fR <\fIvalue\fP> A nonzero value indicates that the scroll wheel on the mouse should be used to scroll the signals up and down rather than scrolling the time value from left to right. .TP \fBuse_standard_clicking\fR <\fIvalue\fP> This option no longer has any effect in gtkwave: normal GTK click semantics are used in the signalwindow. .TP \fBuse_standard_trace_select\fR <\fIvalue\fP> A nonzero value keeps the currently selected traces from deselecting on mouse button press. This allows drag and drop to function more smoothly. As this behavior is not how GTK normally functions, it is by default disabled. .TP \fBuse_toolbutton_interface\fR <\fIvalue\fP> A nonzero value indicates that a toolbar with buttons should be at the top of the screen instead of the traditional style gtkwave button groups. Default is on. .TP \fBvcd_explicit_zero_subscripts\fR <\fIvalue\fP> indicates that signal names should be stored internally as name.bitnumber when enabled. When disabled, a more "normal" ordering of name[bitnumber] is used. Note that when disabled, the Bundle Up and Bundle Down options are disabled in the Signal Search Regexp, Signal Search Hierarchy, and Signal Search Tree options. This is necessary as the internal data structures for signals are represented with one "less" level of hierarchy than when enabled and those functions would not work properly. This should not be an issue if atomic_vectors are enabled. Default for vcd_explicit_zero_subscripts is disabled. .TP \fBvcd_preserve_glitches\fR <\fIvalue\fP> indicates that any repeat equal values for a net spanning different time values in the VCD/FST file are not to be compressed into a single value change but should remain in order to allow glitches to be present for this case. Default for vcd_preserve_glitches is disabled. .TP \fBvcd_preserve_glitches_real\fR <\fIvalue\fP> indicates that any repeat equal values for a real net spanning different time values in the VCD/FST file are not to be compressed into a single value change but should remain for this case. Default for vcd_preserve_glitches is disabled. The intended use is for when viewing analog interpolated data such that removing duplicate values would incorrectly deform the interpolation. .TP \fBvcd_warning_filesize\fR <\fIvalue\fP> produces a warning message if the VCD filesize is greater than the argument's size in MB. Set to zero to disable this. .TP \fBvector_padding\fR <\fIvalue\fP> indicates the number of pixels of extra whitespace that should be added to any strings for the purpose of calculating text in vectors. Permissible values are 0 to 16 with the default being 4. .TP \fBvlist_compression\fR <\fIvalue\fP> indicates the value to pass to zlib during vlist processing (which is used in the VCD recoder). \-1 disables compression, 0-9 correspond to the value zlib expects. 4 is default. .TP \fBvlist_prepack\fR <\fIvalue\fP> indicates that the VCD recoder should pre-compress data going into the value change vlists in order to reduce memory usage. This is done before potential zlib packing. Default is off. .TP \fBvlist_spill\fR <\fIvalue\fP> indicates that the VCD recoder should spill all generated vlists to a tempfile on disk in order to reduce memory usage. Default is off. .TP \fBwave_scrolling\fR <\fIvalue\fP> a nonzero value enables scrolling by dragging the marker off the left or right sides of the wave window. A zero value disables it. .TP \fBzoom_base\fR <\fIvalue\fP> allows setting of the zoom base with a value between 1.5 and 10.0. Default is 2.0. .TP \fBzoom_center\fR <\fIvalue\fP> a nonzero value enables center zooming, a zero value disables it. .TP \fBzoom_dynamic\fR <\fIvalue\fP> a nonzero value enables dynamic full zooming when using the partial VCD (incremental) loader, a zero value disables it. .TP \fBzoom_dynamic_end\fR <\fIvalue\fP> a nonzero value enables dynamic zoom to the end when using the partial VCD (incremental) loader, a zero value disables it. .TP \fBzoom_pow10_snap\fR <\fIvalue\fP> corresponds to the Zoom Pow10 Snap menu option. Default for this is disabled (zero). .SH "AUTHORS" .LP Anthony Bybell .SH "SEE ALSO" .LP \fIgtkwave\fP(1) gtkwave-3.3.86/man/vcd2vzt.10000664000175000017500000000463113166335473015047 0ustar bybellbybell.TH "VCD2VZT" "1" "3.1.21" "Anthony Bybell" "Filetype Conversion" .SH "NAME" .LP vcd2vzt \- Converts VCD files to VZT files .SH "SYNTAX" .LP vcd2vzt [\fIoption\fP]... [\fIVCDFILE\fP] [\fIVZTFILE\fP] .SH "DESCRIPTION" .LP Converts VCD files to VZT files. .SH "OPTIONS" .LP .TP \fB\-v,\-\-vcdname\fR <\fIfilename\fP> Specify VCD input filename. .TP \fB\-l,\-\-vztname\fR <\fIfilename\fP> Specify VZT output filename. .TP \fB\-d,\-\-depth\fR <\fIvalue\fP> Specify 0..9 gzip compression depth, default is 4. .TP \fB\-m,\-\-maxgranule\fR <\fIvalue\fP> Specify number of granules per section, default is 8. One granule is equal to 32 timesteps. .TP \fB\-b,\-\-break\fR <\fIvalue\fP> Specify break size (default = 0 = off). When the break size is exceeded, the VZT dumper will dump all state information at the next convenient granule plus dictionary boundary. .TP \fB\-z,\-\-ziptype\fR <\fIvalue\fP> Specify zip type (default = 0 gzip, 1 = bzip2, 2 = lzma). This allows you to override the default compression algorithm to use a more effective one at the expense of greater runtime. Note that bzip2 does not decompress as fast as gzip so the viewer will be about two times slower when decompressing blocks. .TP \fB\-t,\-\-twostate\fR Forces MVL2 twostate mode (default is MVL4). When enabled, the trace will only store 0/1 values for binary facilities. This is useful for functional simulation and will speed up dumping as well as make traces somewhat smaller. .TP \fB\-r, \-\-rle\fR Uses an bitwise RLE compression on the value table. Default is off. When enabled, this causes the trace data table to be stored using an alternate representation which can improve compression in many cases. .TP \fB\-h,\-\-help\fR Show help screen. .TP .SH "EXAMPLES" .LP Note that you should specify dumpfile.vcd directly or use "\-" for stdin. .TP vcd2vzt dumpfile.vcd dumpfile.lxt \-\-depth 9 \-\-break 1073741824 This sets the compression level to 9 and sets the break size to 1GB. .TP vcd2vzt dumpfile.vcd dumpfile.lxt \-\-depth 9 \-\-maxgranule 512 Allows more granules per section which allows for greater compression at the expense of memory usage. .SH "LIMITATIONS" \fIvcd2vzt\fP does not store glitches as these are coalesced together into one value change during the writing of the VZT file. .LP .SH "AUTHORS" .LP Anthony Bybell .SH "SEE ALSO" .LP \fIvzt2vcd\fP(1) \fIlxt2vcd\fP(1) \fIvcd2lxt2\fP(1) \fIgtkwave\fP(1) gtkwave-3.3.86/man/vzt2vcd.10000664000175000017500000000246613166335473015053 0ustar bybellbybell.TH "VZT2VCD" "1" "3.3.39" "Anthony Bybell" "Filetype Conversion" .SH "NAME" .LP vzt2vcd \- Converts VZT files to VCD .SH "SYNTAX" .LP vzt2vcd [\fIoption\fP]... [\fIVZTFILE\fP] .SH "DESCRIPTION" .LP Converts VZT files to VCD files. If an output filename is not specified, the VCD is emitted to stdout. .SH "OPTIONS" .LP .TP \fB\-v,\-\-vztname\fR <\fIfilename\fP> Specify VZT input filename. .TP \fB\-o,\-\-output\fR <\fIfilename\fP> Specify optional VCD output filename. .TP \fB\-f,\-\-flatearth\fR Emit flattened hierarchies. .TP \fB\-c,\-\-coalesce\fR Coalesce bitblasted vectors. .TP \fB\-n,\-\-notruncate\fR Do not shorten bitvectors. This disables binary value compression as described in the IEEE-1364 specification. (i.e., all values except for '1' left propagate as a sign bit on vectors which do not fill up their entire declared width) .TP \fB\-h,\-\-help\fR Display help then exit. .SH "EXAMPLES" .LP To run this program the standard way type: .TP vzt2vcd filename.vzt The VCD conversion is emitted to stdout. .SH "LIMITATIONS" \fIvzt2vcd\fP does not re-create glitches as these are coalesced together into one value change during the writing of the VZT file. .LP .SH "AUTHORS" .LP Anthony Bybell .SH "SEE ALSO" .LP \fIvcd2lxt2\fP(1) \fIvcd2lxt\fP(1) \fIlxt2vcd\fP(1) \fIgtkwave\fP(1) gtkwave-3.3.86/man/twinwave.10000664000175000017500000000320313166335473015303 0ustar bybellbybell.TH "TWINWAVE" "1" "3.3.79" "Anthony Bybell" "Simulation Wave Viewer Multiplexer" .SH "NAME" .LP twinwave \- Wraps multiple GTKWave sessions in one window or two synchronized windows .SH "SYNTAX" .LP twinwave <\fIarglist1\fP> <\fIseparator\fP> <\fIarglist2\fP> .SH "DESCRIPTION" .LP Wraps multiple GTKWave sessions with synchronized markers, horizontal scrolling, and zooming. .SH "EXAMPLES" .LP To run this program the standard way type: .TP twinwave filename1.vcd filename1.sav + filename2.vcd filename2.sav Two synchronized viewers are then opened in one window. Note that accelerator keys for menus will be disabled as some window managers have focus issues and route keystrokes to the wrong part of the window. .TP twinwave filename1.vcd filename1.sav ++ filename2.vcd filename2.sav Two synchronized viewers are then opened in two windows. .SH "LIMITATIONS" \fItwinwave\fP uses the GtkSocket/GtkPlug mechanism to embed two \fIgtkwave\fP(1) sessions into one window. The amount of coupling is currently limited to communication of temporal information. Other than that, the two gtkwave processes are isolated from each other as if the viewers were spawned separately. Keep in mind that using the same save file for each session may cause unintended behavior problems if the save file is written back to disk: only the session written last will be saved. (i.e., the save file isn't cloned and made unique to each session.) Note that \fItwinwave\fP compiled against Quartz (not X11) on OSX as well as MinGW does not place both sessions in a single window. .LP .SH "AUTHORS" .LP Anthony Bybell .SH "SEE ALSO" .LP \fIgtkwave\fP(1) gtkwave-3.3.86/NEWS0000664000175000017500000000000013166335473013271 0ustar bybellbybellgtkwave-3.3.86/aclocal.m40000664000175000017500000013560613166335473014457 0ustar bybellbybell# generated automatically by aclocal 1.13.4 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # 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. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # PKG_INSTALLDIR(DIRECTORY) # ------------------------- # Substitutes the variable pkgconfigdir as the location where a module # should install pkg-config .pc files. By default the directory is # $libdir/pkgconfig, but the default can be changed by passing # DIRECTORY. The user can override through the --with-pkgconfigdir # parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ]) dnl PKG_INSTALLDIR # PKG_NOARCH_INSTALLDIR(DIRECTORY) # ------------------------- # Substitutes the variable noarch_pkgconfigdir as the location where a # module should install arch-independent pkg-config .pc files. By # default the directory is $datadir/pkgconfig, but the default can be # changed by passing DIRECTORY. The user can override through the # --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ]) dnl PKG_NOARCH_INSTALLDIR # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.13' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.13.4], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.13.4])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_CC_C_O # -------------- # Like AC_PROG_CC_C_O, but changed for automake. AC_DEFUN([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC_C_O])dnl AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl # FIXME: we rely on the cache variable name because # there is no other way. set dummy $CC am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o if test "$am_t" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi dnl Make sure AC_PROG_CC is never called again, or it will override our dnl setting of CC. m4_define([AC_PROG_CC], [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR builtin(include,./tcl.m4) gtkwave-3.3.86/install-sh0000775000175000017500000003325513166335473014620 0ustar bybellbybell#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: gtkwave-3.3.86/ylwrap0000775000175000017500000001553613166335473014062 0ustar bybellbybell#! /bin/sh # ylwrap - wrapper for lex/yacc invocations. scriptversion=2012-12-21.17; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # Written by Tom Tromey . # # 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, 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . get_dirname () { case $1 in */*|*\\*) printf '%s\n' "$1" | sed -e 's|\([\\/]\)[^\\/]*$|\1|';; # Otherwise, we want the empty string (not "."). esac } # guard FILE # ---------- # The CPP macro used to guard inclusion of FILE. guard() { printf '%s\n' "$1" \ | sed \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g' \ -e 's/__*/_/g' } # quote_for_sed [STRING] # ---------------------- # Return STRING (or stdin) quoted to be used as a sed pattern. quote_for_sed () { case $# in 0) cat;; 1) printf '%s\n' "$1";; esac \ | sed -e 's|[][\\.*]|\\&|g' } case "$1" in '') echo "$0: No files given. Try '$0 --help' for more information." 1>&2 exit 1 ;; --basedir) basedir=$2 shift 2 ;; -h|--h*) cat <<\EOF Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]... Wrapper for lex/yacc invocations, renaming files as desired. INPUT is the input file OUTPUT is one file PROG generates DESIRED is the file we actually want instead of OUTPUT PROGRAM is program to run ARGS are passed to PROG Any number of OUTPUT,DESIRED pairs may be used. Report bugs to . EOF exit $? ;; -v|--v*) echo "ylwrap $scriptversion" exit $? ;; esac # The input. input="$1" shift # We'll later need for a correct munging of "#line" directives. input_sub_rx=`get_dirname "$input" | quote_for_sed` case "$input" in [\\/]* | ?:[\\/]*) # Absolute path; do nothing. ;; *) # Relative path. Make it absolute. input="`pwd`/$input" ;; esac input_rx=`get_dirname "$input" | quote_for_sed` # Since DOS filename conventions don't allow two dots, # the DOS version of Bison writes out y_tab.c instead of y.tab.c # and y_tab.h instead of y.tab.h. Test to see if this is the case. y_tab_nodot=false if test -f y_tab.c || test -f y_tab.h; then y_tab_nodot=true fi # The parser itself, the first file, is the destination of the .y.c # rule in the Makefile. parser=$1 # A sed program to s/FROM/TO/g for all the FROM/TO so that, for # instance, we rename #include "y.tab.h" into #include "parse.h" # during the conversion from y.tab.c to parse.c. sed_fix_filenames= # Also rename header guards, as Bison 2.7 for instance uses its header # guard in its implementation file. sed_fix_header_guards= while test "$#" -ne 0; do if test "$1" = "--"; then shift break fi from=$1 # Handle y_tab.c and y_tab.h output by DOS if $y_tab_nodot; then case $from in "y.tab.c") from=y_tab.c;; "y.tab.h") from=y_tab.h;; esac fi shift to=$1 shift sed_fix_filenames="${sed_fix_filenames}s|"`quote_for_sed "$from"`"|$to|g;" sed_fix_header_guards="${sed_fix_header_guards}s|"`guard "$from"`"|"`guard "$to"`"|g;" done # The program to run. prog="$1" shift # Make any relative path in $prog absolute. case "$prog" in [\\/]* | ?:[\\/]*) ;; *[\\/]*) prog="`pwd`/$prog" ;; esac # FIXME: add hostname here for parallel makes that run commands on # other machines. But that might take us over the 14-char limit. dirname=ylwrap$$ do_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 mkdir $dirname || exit 1 cd $dirname case $# in 0) "$prog" "$input" ;; *) "$prog" "$@" "$input" ;; esac ret=$? if test $ret -eq 0; then for from in * do to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"` if test -f "$from"; then # If $2 is an absolute path name, then just use that, # otherwise prepend '../'. case $to in [\\/]* | ?:[\\/]*) target=$to;; *) target="../$to";; esac # Do not overwrite unchanged header files to avoid useless # recompilations. Always update the parser itself: it is the # destination of the .y.c rule in the Makefile. Divert the # output of all other files to a temporary file so we can # compare them to existing versions. if test $from != $parser; then realtarget="$target" target=tmp-`printf '%s\n' "$target" | sed 's|.*[\\/]||g'` fi # Munge "#line" or "#" directives. Don't let the resulting # debug information point at an absolute srcdir. Use the real # output file name, not yy.lex.c for instance. Adjust the # include guards too. sed -e "/^#/!b" \ -e "s|$input_rx|$input_sub_rx|" \ -e "$sed_fix_filenames" \ -e "$sed_fix_header_guards" \ "$from" >"$target" || ret=$? # Check whether files must be updated. if test "$from" != "$parser"; then if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then echo "$to is unchanged" rm -f "$target" else echo "updating $to" mv -f "$target" "$realtarget" fi fi else # A missing file is only an error for the parser. This is a # blatant hack to let us support using "yacc -d". If -d is not # specified, don't fail when the header file is "missing". if test "$from" = "$parser"; then ret=1 fi fi done fi # Remove the directory. cd .. rm -rf $dirname exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: gtkwave-3.3.86/examples/0000775000175000017500000000000013166335473014422 5ustar bybellbybellgtkwave-3.3.86/examples/des.tcl0000664000175000017500000000220113166335473015674 0ustar bybellbybell# # simple example of using tcl with gtkwave: # 1) query the dumpfile for signals with "clk" or # [1:48] in the signal name # 2) show full signal hierarchy # 3) zoom full # 4) set marker to 128 units # 5) generate the postscript to a file # 6) exit gtkwave # set nfacs [ gtkwave::getNumFacs ] set dumpname [ gtkwave::getDumpFileName ] set dmt [ gtkwave::getDumpType ] puts "number of signals in dumpfile '$dumpname' of type $dmt: $nfacs" set clk48 [list] for {set i 0} {$i < $nfacs } {incr i} { set facname [ gtkwave::getFacName $i ] set indx [ string first "\[1:48\]" $facname ] if {$indx == -1} { set indx [ string first clk $facname ] } if {$indx != -1} { lappend clk48 "$facname" } } set ll [ llength $clk48 ] puts "number of signals found matching either 'clk' or '\[1:48\]': $ll" set num_added [ gtkwave::addSignalsFromList $clk48 ] puts "num signals added: $num_added" gtkwave::/Edit/Set_Trace_Max_Hier 0 gtkwave::/Time/Zoom/Zoom_Full gtkwave::setMarker 128 gtkwave::setNamedMarker A 400 "Example Named Marker" gtkwave::/File/Print_To_File PS {Letter (8.5" x 11")} Full $dumpname.ps gtkwave::/File/Quit gtkwave-3.3.86/examples/gtkwaverc0000664000175000017500000002537713166335473016360 0ustar bybellbybell# # sample rc file # (rename to .gtkwaverc and copy # to home directory to be loaded automatically) # # NOTE: env var GTKWAVE_EDITOR can also be used for this, however the rc file overrides it # %d is line number (can be combined inside a string as shown for vimx) # %s is filename (must stand by itself, can't add anything to it) # # editor "vimx -g +%d %s" # editor "gedit +%d %s" # editor "emacs +%d %s" # For OSX # editor "mate -l %d %s" dragzoom_threshold 0 use_standard_trace_select no highlight_wavewindow no fill_waveform no alt_wheel_mode yes vcd_preserve_glitches no vcd_preserve_glitches_real no ignore_savefile_pane_pos no ignore_savefile_pos no ignore_savefile_size no ruler_origin 0 ruler_step 0 disable_ae2_alias no keep_xz_colors no disable_auto_comphier no strace_repeat_count 1 enable_fast_exit yes disable_empty_gui off analog_redraw_skip_count 20 splash_disable off hide_sst off sst_dynamic_filter on use_standard_clicking on use_toolbutton_interface on use_pango_fonts on use_scrollwheel_as_y off scale_to_time_dimension * zoom_dynamic off zoom_dynamic_end off vlist_spill off vlist_prepack off vlist_compression 4 hier_max_level 1 force_toolbars 0 #cursor_snap 8 zoom_pow10_snap on dynamic_resizing 1 hpane_pack 1 #initial_window_x 1000 #initial_window_y 600 #initial_window_xpos 50 #initial_window_ypos 50 use_maxtime_display 0 enable_vcd_autosave 0 use_roundcaps 1 use_nonprop_fonts yes enable_horiz_grid yes use_big_fonts no constant_marker_update yes show_grid yes show_base_symbols no atomic_vectors yes vcd_explicit_zero_subscripts no disable_mouseover no clipboard_mouseover yes # # color additions # color_back 000000 color_baseline ffffff color_grid 202070 color_grid2 6a5acd color_high 79f6f2 color_highfill 4ca09d color_low 5dbebb color_1 00ff00 color_1fill 004d00 color_0 008000 color_trans 00c000 color_mid c0c000 color_value ffffff color_vbox 00ff00 color_vtrans 00c000 color_x ff0000 color_xfill 400000 color_u cc0000 color_ufill 200000 color_w 79f6f2 color_wfill 3f817f color_dash edf508 color_dashfill 7d8104 color_umark ff8080 color_mark ffff80 color_time ffffff color_timeb 000000 color_brkred cc0000 color_ltblue 5dbebb color_gmstrd 7d8104 # # menu accelerators # accel "/File/Open New Window" N accel "/File/Open New Tab" T accel "/File/Reload Waveform" R accel "/File/Export/Write VCD File As" (null) accel "/File/Export/Write LXT File As" (null) accel "/File/Export/Write TIM File As" (null) accel "/File/Close" W accel "/File/" (null) accel "/File/Print To File" P accel "/File/Grab To File" (null) accel "/File/" (null) accel "/File/Read Save File" O accel "/File/Write Save File" S accel "/File/Write Save File As" S accel "/File/" (null) accel "/File/Read Sim Logfile" L accel "/File/" (null) accel "/File/Read Verilog Stemsfile" (null) accel "/File/" (null) accel "/File/Read Tcl Script File" (null) accel "/File/" (null) accel "/File/Quit" Q accel "/Edit/Set Trace Max Hier" (null) accel "/Edit/Toggle Trace Hier" H accel "/Edit/" (null) accel "/Edit/Insert Blank" B accel "/Edit/Insert Comment" (null) accel "/Edit/Insert Analog Height Extension" (null) accel "/Edit/Cut" X accel "/Edit/Copy" C accel "/Edit/Paste" V accel "/Edit/Delete" Delete accel "/Edit/" (null) accel "/Edit/Alias Highlighted Trace" A accel "/Edit/Remove Highlighted Aliases" A accel "/Edit/" (null) accel "/Edit/Expand" F3 accel "/Edit/Combine Down" F4 accel "/Edit/Combine Up" F5 accel "/Edit/" (null) accel "/Edit/Data Format/Hex" X accel "/Edit/Data Format/Decimal" D accel "/Edit/Data Format/Signed Decimal" (null) accel "/Edit/Data Format/Binary" B accel "/Edit/Data Format/Octal" O accel "/Edit/Data Format/ASCII" (null) accel "/Edit/Data Format/BitsToReal" (null) accel "/Edit/Data Format/RealToBits/On" (null) accel "/Edit/Data Format/RealToBits/Off" (null) accel "/Edit/Data Format/Right Justify/On" J accel "/Edit/Data Format/Right Justify/Off" J accel "/Edit/Data Format/Invert/On" I accel "/Edit/Data Format/Invert/Off" I accel "/Edit/Data Format/Reverse Bits/On" V accel "/Edit/Data Format/Reverse Bits/Off" V accel "/Edit/Data Format/Translate Filter File/Disable" (null) accel "/Edit/Data Format/Translate Filter File/Enable and Select" (null) accel "/Edit/Data Format/Translate Filter Process/Disable" (null) accel "/Edit/Data Format/Translate Filter Process/Enable and Select" (null) accel "/Edit/Data Format/Transaction Filter Process/Disable" (null) accel "/Edit/Data Format/Transaction Filter Process/Enable and Select" (null) accel "/Edit/Data Format/Analog/Off" (null) accel "/Edit/Data Format/Analog/Step" (null) accel "/Edit/Data Format/Analog/Interpolated" (null) accel "/Edit/Data Format/Analog/Interpolated Annotated" (null) accel "/Edit/Data Format/Analog/Resizing/Screen Data" (null) accel "/Edit/Data Format/Analog/Resizing/All Data" (null) accel "/Edit/Data Format/Range Fill/With 0s" (null) accel "/Edit/Data Format/Range Fill/With 1s" (null) accel "/Edit/Data Format/Range Fill/Off" (null) accel "/Edit/Data Format/Gray Filters/To Gray" (null) accel "/Edit/Data Format/Gray Filters/From Gray" (null) accel "/Edit/Data Format/Gray Filters/None" (null) accel "/Edit/Color Format/Normal" (null) accel "/Edit/Color Format/Red" (null) accel "/Edit/Color Format/Orange" (null) accel "/Edit/Color Format/Yellow" (null) accel "/Edit/Color Format/Green" (null) accel "/Edit/Color Format/Blue" (null) accel "/Edit/Color Format/Indigo" (null) accel "/Edit/Color Format/Violet" (null) accel "/Edit/Color Format/Cycle" (null) accel "/Edit/Color Format/" (null) accel "/Edit/Color Format/Keep xz Colors" (null) accel "/Edit/Show-Change All Highlighted" (null) accel "/Edit/Show-Change First Highlighted" F accel "/Edit/" (null) accel "/Edit/Time Warp/Warp Marked" (null) accel "/Edit/Time Warp/Unwarp Marked" (null) accel "/Edit/Time Warp/Unwarp All" (null) accel "/Edit/" (null) accel "/Edit/Exclude" E accel "/Edit/Show" S accel "/Edit/" (null) accel "/Edit/Toggle Group Open|Close" T accel "/Edit/Create Group" G accel "/Edit/" (null) accel "/Edit/Highlight Regexp" R accel "/Edit/UnHighlight Regexp" R accel "/Edit/Highlight All" A accel "/Edit/UnHighlight All" A accel "/Edit/" (null) accel "/Edit/Sort/Alphabetize All" (null) accel "/Edit/Sort/Alphabetize All (CaseIns)" (null) accel "/Edit/Sort/Sigsort All" (null) accel "/Edit/Sort/Reverse All" (null) accel "/Search/Pattern Search 1" (null) accel "/Search/Pattern Search 2" (null) accel "/Search/" (null) accel "/Search/Signal Search Regexp" S accel "/Search/Signal Search Hierarchy" T accel "/Search/Signal Search Tree" T accel "/Search/" (null) accel "/Search/Open Source Definition" (null) accel "/Search/Open Source Instantiation" (null) accel "/Search/Open Scope" (null) accel "/Search/" (null) accel "/Search/Autocoalesce" (null) accel "/Search/Autocoalesce Reversal" (null) accel "/Search/Autoname Bundles" (null) accel "/Search/Search Hierarchy Grouping" (null) accel "/Search/" (null) accel "/Search/Set Pattern Search Repeat Count" (null) accel "/Time/Move To Time" F1 accel "/Time/Zoom/Zoom Amount" F2 accel "/Time/Zoom/Zoom Base" F2 accel "/Time/Zoom/Zoom In" Z accel "/Time/Zoom/Zoom Out" Z accel "/Time/Zoom/Zoom Full" F accel "/Time/Zoom/Zoom Best Fit" F accel "/Time/Zoom/Zoom To Start" Home accel "/Time/Zoom/Zoom To End" End accel "/Time/Zoom/Undo Zoom" U accel "/Time/Fetch/Fetch Size" F7 accel "/Time/Fetch/Fetch ->" 2 accel "/Time/Fetch/Fetch <-" 1 accel "/Time/Discard/Discard ->" 4 accel "/Time/Discard/Discard <-" 3 accel "/Time/Shift/Shift ->" 6 accel "/Time/Shift/Shift <-" 5 accel "/Time/Page/Page ->" 8 accel "/Time/Page/Page <-" 7 accel "/Markers/Show-Change Marker Data" M accel "/Markers/Drop Named Marker" N accel "/Markers/Collect Named Marker" N accel "/Markers/Collect All Named Markers" N accel "/Markers/Copy Primary->B Marker" (null) accel "/Markers/Copy Primary->B Marker" B accel "/Markers/Delete Primary Marker" M accel "/Markers/" (null) accel "/Markers/Find Previous Edge" (null) accel "/Markers/Find Next Edge" (null) accel "/Markers/" (null) accel "/Markers/Alternate Wheel Mode" (null) accel "/Markers/" (null) accel "/Markers/Wave Scrolling" F9 accel "/Markers/Locking/Lock to Lesser Named Marker" Q accel "/Markers/Locking/Lock to Greater Named Marker" W accel "/Markers/Locking/Unlock from Named Marker" O accel "/View/Show Grid" G accel "/View/" (null) accel "/View/Show Wave Highlight" (null) accel "/View/Show Filled High Values" (null) accel "/View/" (null) accel "/View/Show Mouseover" (null) accel "/View/Mouseover Copies To Clipboard" (null) accel "/View/" (null) accel "/View/Show Base Symbols" F1 accel "/View/" (null) accel "/View/Standard Trace Select" (null) accel "/View/" (null) accel "/View/Dynamic Resize" 9 accel "/View/" (null) accel "/View/Center Zooms" F8 accel "/View/" (null) accel "/View/Toggle Delta-Frequency" (null) accel "/View/Toggle Max-Marker" F10 accel "/View/" (null) accel "/View/Constant Marker Update" F11 accel "/View/" (null) accel "/View/Draw Roundcapped Vectors" F2 accel "/View/" (null) accel "/View/Left Justified Signals" Home accel "/View/Right Justified Signals" End accel "/View/" (null) accel "/View/Zoom Pow10 Snap" Pause accel "/View/Partial VCD Dynamic Zoom Full" (null) accel "/View/Partial VCD Dynamic Zoom To End" (null) accel "/View/Full Precision" Pause accel "/View/" (null) accel "/View/Define Time Ruler Marks" (null) accel "/View/Remove Pattern Marks" (null) accel "/View/" (null) accel "/View/Use Color" (null) accel "/View/Use Black and White" (null) accel "/View/" (null) accel "/View/LXT Clock Compress to Z" (null) accel "/View/" (null) accel "/View/Scale To Time Dimension/None" (null) accel "/View/Scale To Time Dimension/sec" (null) accel "/View/Scale To Time Dimension/ms" (null) accel "/View/Scale To Time Dimension/us" (null) accel "/View/Scale To Time Dimension/ns" (null) accel "/View/Scale To Time Dimension/ps" (null) accel "/View/Scale To Time Dimension/fs" (null) accel "/Help/WAVE Help" H accel "/Help/WAVE User Manual" (null) accel "/Help/Wave Version" (null) gtkwave-3.3.86/examples/des.v0000664000175000017500000013557313166335473015402 0ustar bybellbybell// // Name: testbench1.vhdl // // Author: Chris Eilbeck, chris@yordas.demon.co.uk // // Purpose: VHDL testbench for a DES encryptor. // // IP Status: Free use is hereby granted for all civil use including personal, educational and commercial use. // The use of this code for military, diplomatic or governmental purposes is specifically forbidden. // // Warranty: There is absolutely no warranty given with this code. You accept all responsibility for the use // of this code and any damage so caused. // // Vers Info: v0.1 14/11/1998 - Creation. // 14/11/1999 - Converted to Verilog (ajb) // module top; reg clk; reg [1:64] pt, key; wire [1:64] ct; integer i; des des(pt, key, ct, clk); initial begin $dumpfile("des.vcd"); $dumpvars(0, top); key = 64'h0000000000000000; pt = 64'h0000000000000000; for(i=0;i<16;i=i+1) begin #1 clk=0; #1 clk=1; end key = 64'hffffffffffffffff; pt = 64'hffffffffffffffff; for(i=0;i<16;i=i+1) begin #1 clk=0; #1 clk=1; end key = 64'h3000000000000000; pt = 64'h1000000000000001; for(i=0;i<16;i=i+1) begin #1 clk=0; #1 clk=1; end key = 64'h1111111111111111; pt = 64'h1111111111111111; for(i=0;i<16;i=i+1) begin #1 clk=0; #1 clk=1; end key = 64'h0123456789abcdef; pt = 64'h1111111111111111; for(i=0;i<16;i=i+1) begin #1 clk=0; #1 clk=1; end key = 64'h1111111111111111; pt = 64'h0123456789abcdef; for(i=0;i<16;i=i+1) begin #1 clk=0; #1 clk=1; end key = 64'h0000000000000000; pt = 64'h0000000000000000; for(i=0;i<16;i=i+1) begin #1 clk=0; #1 clk=1; end key = 64'hfedcba9876543210; pt = 64'h0123456789abcdef; for(i=0;i<16;i=i+1) begin #1 clk=0; #1 clk=1; end key = 64'h7ca110454a1a6e57; pt = 64'h01a1d6d039776742; for(i=0;i<16;i=i+1) begin #1 clk=0; #1 clk=1; end key = 64'h0131d9619dc1376e; pt = 64'h5cd54ca83def57da; for(i=0;i<16;i=i+1) begin #1 clk=0; #1 clk=1; end key = 64'h07a1133e4a0b2686; pt = 64'h0248d43806f67172; for(i=0;i<16;i=i+1) begin #1 clk=0; #1 clk=1; end key = 64'h3849674c2602319e; pt = 64'h51454b582ddf440a; for(i=0;i<16;i=i+1) begin #1 clk=0; #1 clk=1; end key = 64'h04b915ba43feb5b6; pt = 64'h42fd443059577fa2; for(i=0;i<16;i=i+1) begin #1 clk=0; #1 clk=1; end key = 64'h0113b970fd34f2ce; pt = 64'h059b5e0851cf143a; for(i=0;i<16;i=i+1) begin #1 clk=0; #1 clk=1; end key = 64'h0170f175468fb5e6; pt = 64'h0756d8e0774761d2; for(i=0;i<16;i=i+1) begin #1 clk=0; #1 clk=1; end key = 64'h43297fad38e373fe; pt = 64'h762514b829bf486a; for(i=0;i<16;i=i+1) begin #1 clk=0; #1 clk=1; end key = 64'h07a7137045da2a16; pt = 64'h3bdd119049372802; for(i=0;i<16;i=i+1) begin #1 clk=0; #1 clk=1; end key = 64'h04689104c2fd3b2f; pt = 64'h26955f6835af609a; for(i=0;i<16;i=i+1) begin #1 clk=0; #1 clk=1; end key = 64'h37d06bb516cb7546; pt = 64'h164d5e404f275232; for(i=0;i<16;i=i+1) begin #1 clk=0; #1 clk=1; end key = 64'h1f08260d1ac2465e; pt = 64'h6b056e18759f5cca; for(i=0;i<16;i=i+1) begin #1 clk=0; #1 clk=1; end key = 64'h584023641aba6176; pt = 64'h004bd6ef09176062; for(i=0;i<16;i=i+1) begin #1 clk=0; #1 clk=1; end key = 64'h025816164629b007; pt = 64'h480d39006ee762f2; for(i=0;i<16;i=i+1) begin #1 clk=0; #1 clk=1; end /* int testkeys[]= // key, pt, ct { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x8ca64de9, 0xc1b123a7, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x7359b216, 0x3e4edc58, 0x30000000, 0x00000000, 0x10000000, 0x00000001, 0x958e6e62, 0x7a05557b, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0xf40379ab, 0x9e0ec533, 0x01234567, 0x89abcdef, 0x11111111, 0x11111111, 0x17668dfc, 0x7292532d, 0x11111111, 0x11111111, 0x01234567, 0x89abcdef, 0x8a5ae1f8, 0x1ab8f2dd, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x8ca64de9, 0xc1b123a7, 0xfedcba98, 0x76543210, 0x01234567, 0x89abcdef, 0xed39d950, 0xfa74bcc4, 0x7ca11045, 0x4a1a6e57, 0x01a1d6d0, 0x39776742, 0x690f5b0d, 0x9a26939b, 0x0131d961, 0x9dc1376e, 0x5cd54ca8, 0x3def57da, 0x7a389d10, 0x354bd271, 0x07a1133e, 0x4a0b2686, 0x0248d438, 0x06f67172, 0x868ebb51, 0xcab4599a, 0x3849674c, 0x2602319e, 0x51454b58, 0x2ddf440a, 0x7178876e, 0x01f19b2a, 0x04b915ba, 0x43feb5b6, 0x42fd4430, 0x59577fa2, 0xaf37fb42, 0x1f8c4095, 0x0113b970, 0xfd34f2ce, 0x059b5e08, 0x51cf143a, 0x86a560f1, 0x0ec6d85b, 0x0170f175, 0x468fb5e6, 0x0756d8e0, 0x774761d2, 0x0cd3da02, 0x0021dc09, 0x43297fad, 0x38e373fe, 0x762514b8, 0x29bf486a, 0xea676b2c, 0xb7db2b7a, 0x07a71370, 0x45da2a16, 0x3bdd1190, 0x49372802, 0xdfd64a81, 0x5caf1a0f, 0x04689104, 0xc2fd3b2f, 0x26955f68, 0x35af609a, 0x5c513c9c, 0x4886c088, 0x37d06bb5, 0x16cb7546, 0x164d5e40, 0x4f275232, 0x0a2aeeae, 0x3ff4ab77, 0x1f08260d, 0x1ac2465e, 0x6b056e18, 0x759f5cca, 0xef1bf03e, 0x5dfa575a, 0x58402364, 0x1aba6176, 0x004bd6ef, 0x09176062, 0x88bf0db6, 0xd70dee56, 0x02581616, 0x4629b007, 0x480d3900, 0x6ee762f2, 0xa1f99155, 0x41020b56, 0x49793ebc, 0x79b3258f, 0x437540c8, 0x698f3cfa, 0x6fbf1caf, 0xcffd0556, 0x4fb05e15, 0x15ab73a7, 0x072d43a0, 0x77075292, 0x2f22e49b, 0xab7ca1ac, 0x49e95d6d, 0x4ca229bf, 0x02fe5577, 0x8117f12a, 0x5a6b612c, 0xc26cce4a, 0x018310dc, 0x409b26d6, 0x1d9d5c50, 0x18f728c2, 0x5f4c038e, 0xd12b2e41, 0x1c587f1c, 0x13924fef, 0x30553228, 0x6d6f295a, 0x63fac0d0, 0x34d9f793, 0x01010101, 0x01010101, 0x01234567, 0x89abcdef, 0x617b3a0c, 0xe8f07100, 0x1f1f1f1f, 0x0e0e0e0e, 0x01234567, 0x89abcdef, 0xdb958605, 0xf8c8c606, 0xe0fee0fe, 0xf1fef1fe, 0x01234567, 0x89abcdef, 0xedbfd1c6, 0x6c29ccc7, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x355550b2, 0x150e2451, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0xcaaaaf4d, 0xeaf1dbae, 0x01234567, 0x89abcdef, 0x00000000, 0x00000000, 0xd5d44ff7, 0x20683d0d, 0xfedcba98, 0x76543210, 0xffffffff, 0xffffffff, 0x2a2bb008, 0xdf97c2f2, }; */ end endmodule module des(pt, key, ct, clk); input [1:64] pt; input [1:64] key; output [1:64] ct; input clk; wire [1:48] k1x,k2x,k3x,k4x,k5x,k6x,k7x,k8x,k9x,k10x,k11x,k12x,k13x,k14x,k15x,k16x; wire [1:32] l0x,l1x,l2x,l3x,l4x,l5x,l6x,l7x,l8x,l9x,l10x,l11x,l12x,l13x,l14x,l15x,l16x; wire [1:32] r0x,r1x,r2x,r3x,r4x,r5x,r6x,r7x,r8x,r9x,r10x,r11x,r12x,r13x,r14x,r15x,r16x; keysched keysched(key, k1x,k2x,k3x,k4x,k5x,k6x,k7x,k8x,k9x,k10x,k11x,k12x,k13x,k14x,k15x,k16x); ip ip(pt, l0x, r0x); roundfunc round1(clk, l0x, r0x, l1x, r1x, k1x); roundfunc round2(clk, l1x, r1x, l2x, r2x, k2x); roundfunc round3(clk, l2x, r2x, l3x, r3x, k3x); roundfunc round4(clk, l3x, r3x, l4x, r4x, k4x); roundfunc round5(clk, l4x, r4x, l5x, r5x, k5x); roundfunc round6(clk, l5x, r5x, l6x, r6x, k6x); roundfunc round7(clk, l6x, r6x, l7x, r7x, k7x); roundfunc round8(clk, l7x, r7x, l8x, r8x, k8x); roundfunc round9(clk, l8x, r8x, l9x, r9x, k9x); roundfunc round10(clk, l9x, r9x, l10x, r10x, k10x); roundfunc round11(clk, l10x, r10x, l11x, r11x, k11x); roundfunc round12(clk, l11x, r11x, l12x, r12x, k12x); roundfunc round13(clk, l12x, r12x, l13x, r13x, k13x); roundfunc round14(clk, l13x, r13x, l14x, r14x, k14x); roundfunc round15(clk, l14x, r14x, l15x, r15x, k15x); roundfunc round16(clk, l15x, r15x, l16x, r16x, k16x); fp fp(r16x, l16x, ct); endmodule module pc1(key, c0x, d0x); input [1:64] key; output [1:28] c0x, d0x; wire [1:56] XX; assign XX[1]=key[57]; assign XX[2]=key[49]; assign XX[3]=key[41]; assign XX[4]=key[33]; assign XX[5]=key[25]; assign XX[6]=key[17]; assign XX[7]=key[9]; assign XX[8]=key[1]; assign XX[9]=key[58]; assign XX[10]=key[50]; assign XX[11]=key[42]; assign XX[12]=key[34]; assign XX[13]=key[26]; assign XX[14]=key[18]; assign XX[15]=key[10]; assign XX[16]=key[2]; assign XX[17]=key[59]; assign XX[18]=key[51]; assign XX[19]=key[43]; assign XX[20]=key[35]; assign XX[21]=key[27]; assign XX[22]=key[19]; assign XX[23]=key[11]; assign XX[24]=key[3]; assign XX[25]=key[60]; assign XX[26]=key[52]; assign XX[27]=key[44]; assign XX[28]=key[36]; assign XX[29]=key[63]; assign XX[30]=key[55]; assign XX[31]=key[47]; assign XX[32]=key[39]; assign XX[33]=key[31]; assign XX[34]=key[23]; assign XX[35]=key[15]; assign XX[36]=key[7]; assign XX[37]=key[62]; assign XX[38]=key[54]; assign XX[39]=key[46]; assign XX[40]=key[38]; assign XX[41]=key[30]; assign XX[42]=key[22]; assign XX[43]=key[14]; assign XX[44]=key[6]; assign XX[45]=key[61]; assign XX[46]=key[53]; assign XX[47]=key[45]; assign XX[48]=key[37]; assign XX[49]=key[29]; assign XX[50]=key[21]; assign XX[51]=key[13]; assign XX[52]=key[5]; assign XX[53]=key[28]; assign XX[54]=key[20]; assign XX[55]=key[12]; assign XX[56]=key[4]; assign c0x=XX[1:28]; assign d0x=XX[29:56]; endmodule module pc2(c,d,k); input [1:28] c,d; output [1:48] k; wire [1:56] YY; assign YY[1:28]=c; assign YY[29:56]=d; assign k[1]=YY[14]; assign k[2]=YY[17]; assign k[3]=YY[11]; assign k[4]=YY[24]; assign k[5]=YY[1]; assign k[6]=YY[5]; assign k[7]=YY[3]; assign k[8]=YY[28]; assign k[9]=YY[15]; assign k[10]=YY[6]; assign k[11]=YY[21]; assign k[12]=YY[10]; assign k[13]=YY[23]; assign k[14]=YY[19]; assign k[15]=YY[12]; assign k[16]=YY[4]; assign k[17]=YY[26]; assign k[18]=YY[8]; assign k[19]=YY[16]; assign k[20]=YY[7]; assign k[21]=YY[27]; assign k[22]=YY[20]; assign k[23]=YY[13]; assign k[24]=YY[2]; assign k[25]=YY[41]; assign k[26]=YY[52]; assign k[27]=YY[31]; assign k[28]=YY[37]; assign k[29]=YY[47]; assign k[30]=YY[55]; assign k[31]=YY[30]; assign k[32]=YY[40]; assign k[33]=YY[51]; assign k[34]=YY[45]; assign k[35]=YY[33]; assign k[36]=YY[48]; assign k[37]=YY[44]; assign k[38]=YY[49]; assign k[39]=YY[39]; assign k[40]=YY[56]; assign k[41]=YY[34]; assign k[42]=YY[53]; assign k[43]=YY[46]; assign k[44]=YY[42]; assign k[45]=YY[50]; assign k[46]=YY[36]; assign k[47]=YY[29]; assign k[48]=YY[32]; endmodule module rol1(o, i); output [1:28] o; input [1:28] i; assign o={i[2:28],i[1]}; endmodule module rol2(o, i); output [1:28] o; input [1:28] i; assign o={i[3:28],i[1:2]}; endmodule module keysched(key,k1x,k2x,k3x,k4x,k5x,k6x,k7x,k8x,k9x,k10x,k11x,k12x,k13x,k14x,k15x,k16x); input [1:64] key; output [1:48] k1x,k2x,k3x,k4x,k5x,k6x,k7x,k8x,k9x,k10x,k11x,k12x,k13x,k14x,k15x,k16x; wire [1:28] c0x,c1x,c2x,c3x,c4x,c5x,c6x,c7x,c8x,c9x,c10x,c11x,c12x,c13x,c14x,c15x,c16x; wire [1:28] d0x,d1x,d2x,d3x,d4x,d5x,d6x,d7x,d8x,d9x,d10x,d11x,d12x,d13x,d14x,d15x,d16x; pc1 pc1(key, c0x, d0x); rol1 rc1(c1x, c0x); rol1 rd1(d1x, d0x); rol1 rc2(c2x, c1x); rol1 rd2(d2x, d1x); rol2 rc3(c3x, c2x); rol2 rd3(d3x, d2x); rol2 rc4(c4x, c3x); rol2 rd4(d4x, d3x); rol2 rc5(c5x, c4x); rol2 rd5(d5x, d4x); rol2 rc6(c6x, c5x); rol2 rd6(d6x, d5x); rol2 rc7(c7x, c6x); rol2 rd7(d7x, d6x); rol2 rc8(c8x, c7x); rol2 rd8(d8x, d7x); rol1 rc9(c9x, c8x); rol1 rd9(d9x, d8x); rol2 rca(c10x, c9x); rol2 rda(d10x, d9x); rol2 rcb(c11x, c10x); rol2 rdb(d11x, d10x); rol2 rcc(c12x, c11x); rol2 rdc(d12x, d11x); rol2 rcd(c13x, c12x); rol2 rdd(d13x, d12x); rol2 rce(c14x, c13x); rol2 rde(d14x, d13x); rol2 rcf(c15x, c14x); rol2 rdf(d15x, d14x); rol1 rcg(c16x, c15x); rol1 rdg(d16x, d15x); pc2 pc2x1(c1x,d1x,k1x); pc2 pc2x2(c2x,d2x,k2x); pc2 pc2x3(c3x,d3x,k3x); pc2 pc2x4(c4x,d4x,k4x); pc2 pc2x5(c5x,d5x,k5x); pc2 pc2x6(c6x,d6x,k6x); pc2 pc2x7(c7x,d7x,k7x); pc2 pc2x8(c8x,d8x,k8x); pc2 pc2x9(c9x,d9x,k9x); pc2 pc2x10(c10x,d10x,k10x); pc2 pc2x11(c11x,d11x,k11x); pc2 pc2x12(c12x,d12x,k12x); pc2 pc2x13(c13x,d13x,k13x); pc2 pc2x14(c14x,d14x,k14x); pc2 pc2x15(c15x,d15x,k15x); pc2 pc2x16(c16x,d16x,k16x); endmodule module s1(clk, b, so); input clk; input [1:6] b; output [1:4] so; reg [1:4] so; always @(posedge clk) casex(b) 6'b000000 : so=4'he; 6'b000010 : so=4'h4; 6'b000100 : so=4'hd; 6'b000110 : so=4'h1; 6'b001000 : so=4'h2; 6'b001010 : so=4'hf; 6'b001100 : so=4'hb; 6'b001110 : so=4'h8; 6'b010000 : so=4'h3; 6'b010010 : so=4'ha; 6'b010100 : so=4'h6; 6'b010110 : so=4'hc; 6'b011000 : so=4'h5; 6'b011010 : so=4'h9; 6'b011100 : so=4'h0; 6'b011110 : so=4'h7; 6'b000001 : so=4'h0; 6'b000011 : so=4'hf; 6'b000101 : so=4'h7; 6'b000111 : so=4'h4; 6'b001001 : so=4'he; 6'b001011 : so=4'h2; 6'b001101 : so=4'hd; 6'b001111 : so=4'h1; 6'b010001 : so=4'ha; 6'b010011 : so=4'h6; 6'b010101 : so=4'hc; 6'b010111 : so=4'hb; 6'b011001 : so=4'h9; 6'b011011 : so=4'h5; 6'b011101 : so=4'h3; 6'b011111 : so=4'h8; 6'b100000 : so=4'h4; 6'b100010 : so=4'h1; 6'b100100 : so=4'he; 6'b100110 : so=4'h8; 6'b101000 : so=4'hd; 6'b101010 : so=4'h6; 6'b101100 : so=4'h2; 6'b101110 : so=4'hb; 6'b110000 : so=4'hf; 6'b110010 : so=4'hc; 6'b110100 : so=4'h9; 6'b110110 : so=4'h7; 6'b111000 : so=4'h3; 6'b111010 : so=4'ha; 6'b111100 : so=4'h5; 6'b111110 : so=4'h0; 6'b100001 : so=4'hf; 6'b100011 : so=4'hc; 6'b100101 : so=4'h8; 6'b100111 : so=4'h2; 6'b101001 : so=4'h4; 6'b101011 : so=4'h9; 6'b101101 : so=4'h1; 6'b101111 : so=4'h7; 6'b110001 : so=4'h5; 6'b110011 : so=4'hb; 6'b110101 : so=4'h3; 6'b110111 : so=4'he; 6'b111001 : so=4'ha; 6'b111011 : so=4'h0; 6'b111101 : so=4'h6; default so=4'hd; endcase endmodule module s2(clk, b, so); input clk; input [1:6] b; output [1:4] so; reg [1:4] so; always @(posedge clk) casex(b) 6'b000000 : so=4'hf; 6'b000010 : so=4'h1; 6'b000100 : so=4'h8; 6'b000110 : so=4'he; 6'b001000 : so=4'h6; 6'b001010 : so=4'hb; 6'b001100 : so=4'h3; 6'b001110 : so=4'h4; 6'b010000 : so=4'h9; 6'b010010 : so=4'h7; 6'b010100 : so=4'h2; 6'b010110 : so=4'hd; 6'b011000 : so=4'hc; 6'b011010 : so=4'h0; 6'b011100 : so=4'h5; 6'b011110 : so=4'ha; 6'b000001 : so=4'h3; 6'b000011 : so=4'hd; 6'b000101 : so=4'h4; 6'b000111 : so=4'h7; 6'b001001 : so=4'hf; 6'b001011 : so=4'h2; 6'b001101 : so=4'h8; 6'b001111 : so=4'he; 6'b010001 : so=4'hc; 6'b010011 : so=4'h0; 6'b010101 : so=4'h1; 6'b010111 : so=4'ha; 6'b011001 : so=4'h6; 6'b011011 : so=4'h9; 6'b011101 : so=4'hb; 6'b011111 : so=4'h5; 6'b100000 : so=4'h0; 6'b100010 : so=4'he; 6'b100100 : so=4'h7; 6'b100110 : so=4'hb; 6'b101000 : so=4'ha; 6'b101010 : so=4'h4; 6'b101100 : so=4'hd; 6'b101110 : so=4'h1; 6'b110000 : so=4'h5; 6'b110010 : so=4'h8; 6'b110100 : so=4'hc; 6'b110110 : so=4'h6; 6'b111000 : so=4'h9; 6'b111010 : so=4'h3; 6'b111100 : so=4'h2; 6'b111110 : so=4'hf; 6'b100001 : so=4'hd; 6'b100011 : so=4'h8; 6'b100101 : so=4'ha; 6'b100111 : so=4'h1; 6'b101001 : so=4'h3; 6'b101011 : so=4'hf; 6'b101101 : so=4'h4; 6'b101111 : so=4'h2; 6'b110001 : so=4'hb; 6'b110011 : so=4'h6; 6'b110101 : so=4'h7; 6'b110111 : so=4'hc; 6'b111001 : so=4'h0; 6'b111011 : so=4'h5; 6'b111101 : so=4'he; default so=4'h9; endcase endmodule module s3(clk, b, so); input clk; input [1:6] b; output [1:4] so; reg [1:4] so; always @(posedge clk) casex(b) 6'b000000 : so=4'ha; 6'b000010 : so=4'h0; 6'b000100 : so=4'h9; 6'b000110 : so=4'he; 6'b001000 : so=4'h6; 6'b001010 : so=4'h3; 6'b001100 : so=4'hf; 6'b001110 : so=4'h5; 6'b010000 : so=4'h1; 6'b010010 : so=4'hd; 6'b010100 : so=4'hc; 6'b010110 : so=4'h7; 6'b011000 : so=4'hb; 6'b011010 : so=4'h4; 6'b011100 : so=4'h2; 6'b011110 : so=4'h8; 6'b000001 : so=4'hd; 6'b000011 : so=4'h7; 6'b000101 : so=4'h0; 6'b000111 : so=4'h9; 6'b001001 : so=4'h3; 6'b001011 : so=4'h4; 6'b001101 : so=4'h6; 6'b001111 : so=4'ha; 6'b010001 : so=4'h2; 6'b010011 : so=4'h8; 6'b010101 : so=4'h5; 6'b010111 : so=4'he; 6'b011001 : so=4'hc; 6'b011011 : so=4'hb; 6'b011101 : so=4'hf; 6'b011111 : so=4'h1; 6'b100000 : so=4'hd; 6'b100010 : so=4'h6; 6'b100100 : so=4'h4; 6'b100110 : so=4'h9; 6'b101000 : so=4'h8; 6'b101010 : so=4'hf; 6'b101100 : so=4'h3; 6'b101110 : so=4'h0; 6'b110000 : so=4'hb; 6'b110010 : so=4'h1; 6'b110100 : so=4'h2; 6'b110110 : so=4'hc; 6'b111000 : so=4'h5; 6'b111010 : so=4'ha; 6'b111100 : so=4'he; 6'b111110 : so=4'h7; 6'b100001 : so=4'h1; 6'b100011 : so=4'ha; 6'b100101 : so=4'hd; 6'b100111 : so=4'h0; 6'b101001 : so=4'h6; 6'b101011 : so=4'h9; 6'b101101 : so=4'h8; 6'b101111 : so=4'h7; 6'b110001 : so=4'h4; 6'b110011 : so=4'hf; 6'b110101 : so=4'he; 6'b110111 : so=4'h3; 6'b111001 : so=4'hb; 6'b111011 : so=4'h5; 6'b111101 : so=4'h2; default so=4'hc; endcase endmodule module s4(clk, b, so); input clk; input [1:6] b; output [1:4] so; reg [1:4] so; always @(posedge clk) casex(b) 6'b000000 : so=4'h7; 6'b000010 : so=4'hd; 6'b000100 : so=4'he; 6'b000110 : so=4'h3; 6'b001000 : so=4'h0; 6'b001010 : so=4'h6; 6'b001100 : so=4'h9; 6'b001110 : so=4'ha; 6'b010000 : so=4'h1; 6'b010010 : so=4'h2; 6'b010100 : so=4'h8; 6'b010110 : so=4'h5; 6'b011000 : so=4'hb; 6'b011010 : so=4'hc; 6'b011100 : so=4'h4; 6'b011110 : so=4'hf; 6'b000001 : so=4'hd; 6'b000011 : so=4'h8; 6'b000101 : so=4'hb; 6'b000111 : so=4'h5; 6'b001001 : so=4'h6; 6'b001011 : so=4'hf; 6'b001101 : so=4'h0; 6'b001111 : so=4'h3; 6'b010001 : so=4'h4; 6'b010011 : so=4'h7; 6'b010101 : so=4'h2; 6'b010111 : so=4'hc; 6'b011001 : so=4'h1; 6'b011011 : so=4'ha; 6'b011101 : so=4'he; 6'b011111 : so=4'h9; 6'b100000 : so=4'ha; 6'b100010 : so=4'h6; 6'b100100 : so=4'h9; 6'b100110 : so=4'h0; 6'b101000 : so=4'hc; 6'b101010 : so=4'hb; 6'b101100 : so=4'h7; 6'b101110 : so=4'hd; 6'b110000 : so=4'hf; 6'b110010 : so=4'h1; 6'b110100 : so=4'h3; 6'b110110 : so=4'he; 6'b111000 : so=4'h5; 6'b111010 : so=4'h2; 6'b111100 : so=4'h8; 6'b111110 : so=4'h4; 6'b100001 : so=4'h3; 6'b100011 : so=4'hf; 6'b100101 : so=4'h0; 6'b100111 : so=4'h6; 6'b101001 : so=4'ha; 6'b101011 : so=4'h1; 6'b101101 : so=4'hd; 6'b101111 : so=4'h8; 6'b110001 : so=4'h9; 6'b110011 : so=4'h4; 6'b110101 : so=4'h5; 6'b110111 : so=4'hb; 6'b111001 : so=4'hc; 6'b111011 : so=4'h7; 6'b111101 : so=4'h2; default so=4'he; endcase endmodule module s5(clk, b, so); input clk; input [1:6] b; output [1:4] so; reg [1:4] so; always @(posedge clk) casex(b) 6'b000000 : so=4'h2; 6'b000010 : so=4'hc; 6'b000100 : so=4'h4; 6'b000110 : so=4'h1; 6'b001000 : so=4'h7; 6'b001010 : so=4'ha; 6'b001100 : so=4'hb; 6'b001110 : so=4'h6; 6'b010000 : so=4'h8; 6'b010010 : so=4'h5; 6'b010100 : so=4'h3; 6'b010110 : so=4'hf; 6'b011000 : so=4'hd; 6'b011010 : so=4'h0; 6'b011100 : so=4'he; 6'b011110 : so=4'h9; 6'b000001 : so=4'he; 6'b000011 : so=4'hb; 6'b000101 : so=4'h2; 6'b000111 : so=4'hc; 6'b001001 : so=4'h4; 6'b001011 : so=4'h7; 6'b001101 : so=4'hd; 6'b001111 : so=4'h1; 6'b010001 : so=4'h5; 6'b010011 : so=4'h0; 6'b010101 : so=4'hf; 6'b010111 : so=4'ha; 6'b011001 : so=4'h3; 6'b011011 : so=4'h9; 6'b011101 : so=4'h8; 6'b011111 : so=4'h6; 6'b100000 : so=4'h4; 6'b100010 : so=4'h2; 6'b100100 : so=4'h1; 6'b100110 : so=4'hb; 6'b101000 : so=4'ha; 6'b101010 : so=4'hd; 6'b101100 : so=4'h7; 6'b101110 : so=4'h8; 6'b110000 : so=4'hf; 6'b110010 : so=4'h9; 6'b110100 : so=4'hc; 6'b110110 : so=4'h5; 6'b111000 : so=4'h6; 6'b111010 : so=4'h3; 6'b111100 : so=4'h0; 6'b111110 : so=4'he; 6'b100001 : so=4'hb; 6'b100011 : so=4'h8; 6'b100101 : so=4'hc; 6'b100111 : so=4'h7; 6'b101001 : so=4'h1; 6'b101011 : so=4'he; 6'b101101 : so=4'h2; 6'b101111 : so=4'hd; 6'b110001 : so=4'h6; 6'b110011 : so=4'hf; 6'b110101 : so=4'h0; 6'b110111 : so=4'h9; 6'b111001 : so=4'ha; 6'b111011 : so=4'h4; 6'b111101 : so=4'h5; default so=4'h3; endcase endmodule module s6(clk, b, so); input clk; input [1:6] b; output [1:4] so; reg [1:4] so; always @(posedge clk) casex(b) 6'b000000 : so=4'hc; 6'b000010 : so=4'h1; 6'b000100 : so=4'ha; 6'b000110 : so=4'hf; 6'b001000 : so=4'h9; 6'b001010 : so=4'h2; 6'b001100 : so=4'h6; 6'b001110 : so=4'h8; 6'b010000 : so=4'h0; 6'b010010 : so=4'hd; 6'b010100 : so=4'h3; 6'b010110 : so=4'h4; 6'b011000 : so=4'he; 6'b011010 : so=4'h7; 6'b011100 : so=4'h5; 6'b011110 : so=4'hb; 6'b000001 : so=4'ha; 6'b000011 : so=4'hf; 6'b000101 : so=4'h4; 6'b000111 : so=4'h2; 6'b001001 : so=4'h7; 6'b001011 : so=4'hc; 6'b001101 : so=4'h9; 6'b001111 : so=4'h5; 6'b010001 : so=4'h6; 6'b010011 : so=4'h1; 6'b010101 : so=4'hd; 6'b010111 : so=4'he; 6'b011001 : so=4'h0; 6'b011011 : so=4'hb; 6'b011101 : so=4'h3; 6'b011111 : so=4'h8; 6'b100000 : so=4'h9; 6'b100010 : so=4'he; 6'b100100 : so=4'hf; 6'b100110 : so=4'h5; 6'b101000 : so=4'h2; 6'b101010 : so=4'h8; 6'b101100 : so=4'hc; 6'b101110 : so=4'h3; 6'b110000 : so=4'h7; 6'b110010 : so=4'h0; 6'b110100 : so=4'h4; 6'b110110 : so=4'ha; 6'b111000 : so=4'h1; 6'b111010 : so=4'hd; 6'b111100 : so=4'hb; 6'b111110 : so=4'h6; 6'b100001 : so=4'h4; 6'b100011 : so=4'h3; 6'b100101 : so=4'h2; 6'b100111 : so=4'hc; 6'b101001 : so=4'h9; 6'b101011 : so=4'h5; 6'b101101 : so=4'hf; 6'b101111 : so=4'ha; 6'b110001 : so=4'hb; 6'b110011 : so=4'he; 6'b110101 : so=4'h1; 6'b110111 : so=4'h7; 6'b111001 : so=4'h6; 6'b111011 : so=4'h0; 6'b111101 : so=4'h8; default so=4'hd; endcase endmodule module s7(clk, b, so); input clk; input [1:6] b; output [1:4] so; reg [1:4] so; always @(posedge clk) casex(b) 6'b000000 : so=4'h4; 6'b000010 : so=4'hb; 6'b000100 : so=4'h2; 6'b000110 : so=4'he; 6'b001000 : so=4'hf; 6'b001010 : so=4'h0; 6'b001100 : so=4'h8; 6'b001110 : so=4'hd; 6'b010000 : so=4'h3; 6'b010010 : so=4'hc; 6'b010100 : so=4'h9; 6'b010110 : so=4'h7; 6'b011000 : so=4'h5; 6'b011010 : so=4'ha; 6'b011100 : so=4'h6; 6'b011110 : so=4'h1; 6'b000001 : so=4'hd; 6'b000011 : so=4'h0; 6'b000101 : so=4'hb; 6'b000111 : so=4'h7; 6'b001001 : so=4'h4; 6'b001011 : so=4'h9; 6'b001101 : so=4'h1; 6'b001111 : so=4'ha; 6'b010001 : so=4'he; 6'b010011 : so=4'h3; 6'b010101 : so=4'h5; 6'b010111 : so=4'hc; 6'b011001 : so=4'h2; 6'b011011 : so=4'hf; 6'b011101 : so=4'h8; 6'b011111 : so=4'h6; 6'b100000 : so=4'h1; 6'b100010 : so=4'h4; 6'b100100 : so=4'hb; 6'b100110 : so=4'hd; 6'b101000 : so=4'hc; 6'b101010 : so=4'h3; 6'b101100 : so=4'h7; 6'b101110 : so=4'he; 6'b110000 : so=4'ha; 6'b110010 : so=4'hf; 6'b110100 : so=4'h6; 6'b110110 : so=4'h8; 6'b111000 : so=4'h0; 6'b111010 : so=4'h5; 6'b111100 : so=4'h9; 6'b111110 : so=4'h2; 6'b100001 : so=4'h6; 6'b100011 : so=4'hb; 6'b100101 : so=4'hd; 6'b100111 : so=4'h8; 6'b101001 : so=4'h1; 6'b101011 : so=4'h4; 6'b101101 : so=4'ha; 6'b101111 : so=4'h7; 6'b110001 : so=4'h9; 6'b110011 : so=4'h5; 6'b110101 : so=4'h0; 6'b110111 : so=4'hf; 6'b111001 : so=4'he; 6'b111011 : so=4'h2; 6'b111101 : so=4'h3; default so=4'hc; endcase endmodule module s8(clk, b, so); input clk; input [1:6] b; output [1:4] so; reg [1:4] so; always @(posedge clk) casex(b) 6'b000000 : so=4'hd; 6'b000010 : so=4'h2; 6'b000100 : so=4'h8; 6'b000110 : so=4'h4; 6'b001000 : so=4'h6; 6'b001010 : so=4'hf; 6'b001100 : so=4'hb; 6'b001110 : so=4'h1; 6'b010000 : so=4'ha; 6'b010010 : so=4'h9; 6'b010100 : so=4'h3; 6'b010110 : so=4'he; 6'b011000 : so=4'h5; 6'b011010 : so=4'h0; 6'b011100 : so=4'hc; 6'b011110 : so=4'h7; 6'b000001 : so=4'h1; 6'b000011 : so=4'hf; 6'b000101 : so=4'hd; 6'b000111 : so=4'h8; 6'b001001 : so=4'ha; 6'b001011 : so=4'h3; 6'b001101 : so=4'h7; 6'b001111 : so=4'h4; 6'b010001 : so=4'hc; 6'b010011 : so=4'h5; 6'b010101 : so=4'h6; 6'b010111 : so=4'hb; 6'b011001 : so=4'h0; 6'b011011 : so=4'he; 6'b011101 : so=4'h9; 6'b011111 : so=4'h2; 6'b100000 : so=4'h7; 6'b100010 : so=4'hb; 6'b100100 : so=4'h4; 6'b100110 : so=4'h1; 6'b101000 : so=4'h9; 6'b101010 : so=4'hc; 6'b101100 : so=4'he; 6'b101110 : so=4'h2; 6'b110000 : so=4'h0; 6'b110010 : so=4'h6; 6'b110100 : so=4'ha; 6'b110110 : so=4'hd; 6'b111000 : so=4'hf; 6'b111010 : so=4'h3; 6'b111100 : so=4'h5; 6'b111110 : so=4'h8; 6'b100001 : so=4'h2; 6'b100011 : so=4'h1; 6'b100101 : so=4'he; 6'b100111 : so=4'h7; 6'b101001 : so=4'h4; 6'b101011 : so=4'ha; 6'b101101 : so=4'h8; 6'b101111 : so=4'hd; 6'b110001 : so=4'hf; 6'b110011 : so=4'hc; 6'b110101 : so=4'h9; 6'b110111 : so=4'h0; 6'b111001 : so=4'h3; 6'b111011 : so=4'h5; 6'b111101 : so=4'h6; default so=4'hb; endcase endmodule module ip(pt, l0x, r0x); input [1:64] pt; output [1:32] l0x, r0x; assign l0x[1]=pt[58]; assign l0x[2]=pt[50]; assign l0x[3]=pt[42]; assign l0x[4]=pt[34]; assign l0x[5]=pt[26]; assign l0x[6]=pt[18]; assign l0x[7]=pt[10]; assign l0x[8]=pt[2]; assign l0x[9]=pt[60]; assign l0x[10]=pt[52]; assign l0x[11]=pt[44]; assign l0x[12]=pt[36]; assign l0x[13]=pt[28]; assign l0x[14]=pt[20]; assign l0x[15]=pt[12]; assign l0x[16]=pt[4]; assign l0x[17]=pt[62]; assign l0x[18]=pt[54]; assign l0x[19]=pt[46]; assign l0x[20]=pt[38]; assign l0x[21]=pt[30]; assign l0x[22]=pt[22]; assign l0x[23]=pt[14]; assign l0x[24]=pt[6]; assign l0x[25]=pt[64]; assign l0x[26]=pt[56]; assign l0x[27]=pt[48]; assign l0x[28]=pt[40]; assign l0x[29]=pt[32]; assign l0x[30]=pt[24]; assign l0x[31]=pt[16]; assign l0x[32]=pt[8]; assign r0x[1]=pt[57]; assign r0x[2]=pt[49]; assign r0x[3]=pt[41]; assign r0x[4]=pt[33]; assign r0x[5]=pt[25]; assign r0x[6]=pt[17]; assign r0x[7]=pt[9]; assign r0x[8]=pt[1]; assign r0x[9]=pt[59]; assign r0x[10]=pt[51]; assign r0x[11]=pt[43]; assign r0x[12]=pt[35]; assign r0x[13]=pt[27]; assign r0x[14]=pt[19]; assign r0x[15]=pt[11]; assign r0x[16]=pt[3]; assign r0x[17]=pt[61]; assign r0x[18]=pt[53]; assign r0x[19]=pt[45]; assign r0x[20]=pt[37]; assign r0x[21]=pt[29]; assign r0x[22]=pt[21]; assign r0x[23]=pt[13]; assign r0x[24]=pt[5]; assign r0x[25]=pt[63]; assign r0x[26]=pt[55]; assign r0x[27]=pt[47]; assign r0x[28]=pt[39]; assign r0x[29]=pt[31]; assign r0x[30]=pt[23]; assign r0x[31]=pt[15]; assign r0x[32]=pt[7]; endmodule module xp(ri, e); input [1:32] ri; output [1:48] e; assign e[1]=ri[32]; assign e[2]=ri[1]; assign e[3]=ri[2]; assign e[4]=ri[3]; assign e[5]=ri[4]; assign e[6]=ri[5]; assign e[7]=ri[4]; assign e[8]=ri[5]; assign e[9]=ri[6]; assign e[10]=ri[7]; assign e[11]=ri[8]; assign e[12]=ri[9]; assign e[13]=ri[8]; assign e[14]=ri[9]; assign e[15]=ri[10]; assign e[16]=ri[11]; assign e[17]=ri[12]; assign e[18]=ri[13]; assign e[19]=ri[12]; assign e[20]=ri[13]; assign e[21]=ri[14]; assign e[22]=ri[15]; assign e[23]=ri[16]; assign e[24]=ri[17]; assign e[25]=ri[16]; assign e[26]=ri[17]; assign e[27]=ri[18]; assign e[28]=ri[19]; assign e[29]=ri[20]; assign e[30]=ri[21]; assign e[31]=ri[20]; assign e[32]=ri[21]; assign e[33]=ri[22]; assign e[34]=ri[23]; assign e[35]=ri[24]; assign e[36]=ri[25]; assign e[37]=ri[24]; assign e[38]=ri[25]; assign e[39]=ri[26]; assign e[40]=ri[27]; assign e[41]=ri[28]; assign e[42]=ri[29]; assign e[43]=ri[28]; assign e[44]=ri[29]; assign e[45]=ri[30]; assign e[46]=ri[31]; assign e[47]=ri[32]; assign e[48]=ri[1]; endmodule module desxor1(e,b1x,b2x,b3x,b4x,b5x,b6x,b7x,b8x,k); input [1:48] e; output [1:6] b1x,b2x,b3x,b4x,b5x,b6x,b7x,b8x; input [1:48] k; wire [1:48] XX; assign XX = k ^ e; assign b1x = XX[1:6]; assign b2x = XX[7:12]; assign b3x = XX[13:18]; assign b4x = XX[19:24]; assign b5x = XX[25:30]; assign b6x = XX[31:36]; assign b7x = XX[37:42]; assign b8x = XX[43:48]; endmodule module pp(so1x,so2x,so3x,so4x,so5x,so6x,so7x,so8x,ppo); input [1:4] so1x,so2x,so3x,so4x,so5x,so6x,so7x,so8x; output [1:32] ppo; wire [1:32] XX; assign XX[1:4]=so1x; assign XX[5:8]=so2x; assign XX[9:12]=so3x; assign XX[13:16]=so4x; assign XX[17:20]=so5x; assign XX[21:24]=so6x; assign XX[25:28]=so7x; assign XX[29:32]=so8x; assign ppo[1]=XX[16]; assign ppo[2]=XX[7]; assign ppo[3]=XX[20]; assign ppo[4]=XX[21]; assign ppo[5]=XX[29]; assign ppo[6]=XX[12]; assign ppo[7]=XX[28]; assign ppo[8]=XX[17]; assign ppo[9]=XX[1]; assign ppo[10]=XX[15]; assign ppo[11]=XX[23]; assign ppo[12]=XX[26]; assign ppo[13]=XX[5]; assign ppo[14]=XX[18]; assign ppo[15]=XX[31]; assign ppo[16]=XX[10]; assign ppo[17]=XX[2]; assign ppo[18]=XX[8]; assign ppo[19]=XX[24]; assign ppo[20]=XX[14]; assign ppo[21]=XX[32]; assign ppo[22]=XX[27]; assign ppo[23]=XX[3]; assign ppo[24]=XX[9]; assign ppo[25]=XX[19]; assign ppo[26]=XX[13]; assign ppo[27]=XX[30]; assign ppo[28]=XX[6]; assign ppo[29]=XX[22]; assign ppo[30]=XX[11]; assign ppo[31]=XX[4]; assign ppo[32]=XX[25]; endmodule module desxor2(d,l,q); input [1:32] d,l; output [1:32] q; assign q = d ^ l; endmodule module roundfunc(clk, li, ri, lo, ro, k); input clk; input [1:32] li, ri; input [1:48] k; output [1:32] lo, ro; wire [1:48] e; wire [1:6] b1x,b2x,b3x,b4x,b5x,b6x,b7x,b8x; wire [1:4] so1x,so2x,so3x,so4x,so5x,so6x,so7x,so8x; wire [1:32] ppo; xp xp(ri, e); desxor1 desxor1(e, b1x, b2x, b3x, b4x, b5x, b6x, b7x, b8x, k); s1 s1(clk, b1x, so1x); s2 s2(clk, b2x, so2x); s3 s3(clk, b3x, so3x); s4 s4(clk, b4x, so4x); s5 s5(clk, b5x, so5x); s6 s6(clk, b6x, so6x); s7 s7(clk, b7x, so7x); s8 s8(clk, b8x, so8x); pp pp(so1x,so2x,so3x,so4x,so5x,so6x,so7x,so8x, ppo); desxor2 desxor2(ppo, li, ro); assign lo=ri; endmodule module fp(l,r,ct); input [1:32] l,r; output [1:64] ct; assign ct[1]=r[8]; assign ct[2]=l[8]; assign ct[3]=r[16]; assign ct[4]=l[16]; assign ct[5]=r[24]; assign ct[6]=l[24]; assign ct[7]=r[32]; assign ct[8]=l[32]; assign ct[9]=r[7]; assign ct[10]=l[7]; assign ct[11]=r[15]; assign ct[12]=l[15]; assign ct[13]=r[23]; assign ct[14]=l[23]; assign ct[15]=r[31]; assign ct[16]=l[31]; assign ct[17]=r[6]; assign ct[18]=l[6]; assign ct[19]=r[14]; assign ct[20]=l[14]; assign ct[21]=r[22]; assign ct[22]=l[22]; assign ct[23]=r[30]; assign ct[24]=l[30]; assign ct[25]=r[5]; assign ct[26]=l[5]; assign ct[27]=r[13]; assign ct[28]=l[13]; assign ct[29]=r[21]; assign ct[30]=l[21]; assign ct[31]=r[29]; assign ct[32]=l[29]; assign ct[33]=r[4]; assign ct[34]=l[4]; assign ct[35]=r[12]; assign ct[36]=l[12]; assign ct[37]=r[20]; assign ct[38]=l[20]; assign ct[39]=r[28]; assign ct[40]=l[28]; assign ct[41]=r[3]; assign ct[42]=l[3]; assign ct[43]=r[11]; assign ct[44]=l[11]; assign ct[45]=r[19]; assign ct[46]=l[19]; assign ct[47]=r[27]; assign ct[48]=l[27]; assign ct[49]=r[2]; assign ct[50]=l[2]; assign ct[51]=r[10]; assign ct[52]=l[10]; assign ct[53]=r[18]; assign ct[54]=l[18]; assign ct[55]=r[26]; assign ct[56]=l[26]; assign ct[57]=r[1]; assign ct[58]=l[1]; assign ct[59]=r[9]; assign ct[60]=l[9]; assign ct[61]=r[17]; assign ct[62]=l[17]; assign ct[63]=r[25]; assign ct[64]=l[25]; endmodule gtkwave-3.3.86/examples/transaction.fst0000664000175000017500000000554013166335473017471 0ustar bybellbybellþ _,‹íXpÕ' ã´…þ ´£r±Ú‰©££¡5¹¬S´èPYm°)&¢­šBܪ!$—»ÝZÿÀ)S£ 4r;tÁ›­ùqµ7pñ®d¹[ !çåØÛæîö–½½·Û·»w ™©3m§áMæÞݾ¼÷¾ßÏ÷óý|¿wsæ#ï>sÎŽ«~¦ÕT~kûÕÌUwé¿tq%o¶ägG½½î¶úÇ~™}þß¹ûòLMþýŸÉÏ¿#yñð¯øGù·-[¾ìêË7ü›G‰Å¯Ìx ‘4æ/ÏZ° ¯!;òÖ=÷†*þôÛoõV.¾gccч?îéþæÀs·?zÃ/^xhÑÎý…£ïüÞÛ÷®]{ãC‡mþë‡×,:²ðÛU_}ÛKï>Ê;?©Æ6'es¼vF{¯ˆ\H6»šI®Œqâš#ž‰Èl¢9\í%H¯‹)gìøTæ|£&Mì †ç{û½[]XY5áŽ;¦äÉ„'L¡å¤7œW¦+ÓÿÖ¤n‘›I¤œh8Áà¸ô'Ä©Æ3@'„0R¤©²üÉ=¸ «ÛÕ©ÄûK@0ló–z®"¤Ú.K¬×›hmRÀO›&Q¥V¸R>°7ϥüМ ºÜ–ø”³œk¡,™Ù$ ¡ 2†H”âˆ4î´5ˆÙO*rXS?Árn2ÝBËã|”,;ǪãÆ6TM*µŠóÚíZ°²“(< ^.Uψ½ŒèGYGܧÀµ$`A­[¤%:ãR´@©ãµå}\1o‚·‚$8H)Ú•‰¨~TàRuÄêŠ`<ð@Ç|´µ…>Pí@%Ú•ª ¢”mó¹b+‰RÝV¢ßØp‰=ZRõûðx t—aÄ$e6£]º[”îD:"‘n®N«E¥¶–8ZQ.ÒÆ¿¸Õ[9;Ë¥#Ð^µ‡sgq+¡Õ=d¼ƒ\ •Ç ‰>­—Rî¸ãº{\ KЃAl×=ÐêÕ^.ÄìÁ¬b–@%Š!EŸ€8è¨Oõ)6T1’(°naø¤q„RÌâe19¨ $,Œ5éèD (®x-×CãÃGÈÔ(™b3µ˜dC¡óŸS £µ®Vm Ï«µð²Šò`süh…Z—†þŒ¡²ŸUýŒŸB'à¶TjŠ*ú~T ÞˆA¡Œ3¤âG8>¢\ÊIð`yã Ž2)›ˆš”ºñ4 „A‚õ7%Ö C­ÚK+4àƒ4®Ø*»2 e¸^ÀÀK¤¨7Ø0ª% 0ņÉO2¨ŸˆrL›°MDzA(¸ŽH ÄÜ oE!ûð0´‹Œa }…Ž’i.F «dwcð\è¿ZGDk‘Æû mÁ!Wº­´bB8mª fåaô »0^ '¢£‰Gu·ˆ>Ý ×"ÐÈ[&J¦Ç£QÁà ^hUx%‹› w¡A/^ÕÃH)XS—Tù tOåÕ‚eŒŒî ¸Âëy·•huDZY‡Õ'µÅ ]È #öH9 3˜¬+Ûg9gâe¡'(Wˆ°ë¬4ЉAP ¹T$LE9OÁàƒšlÂC‘ „÷»bm̬àR:Ÿ|à¦i91™«æQ ·‘ÚmìGoSá8(CÛ2A\QÞ6,ï•{‘F#˜ÀY·ÄŠuÜù™X=v2WŒH«9Èl&;¸4á”ö:LA×㪦T¿ '=/³AË4Ÿdê•IŒõÁÔ53Þ`¦O¿Ÿ-ï ÿ +µzNáí}¯“J×2C&åLi1”Nö 4ßÄ<ŒJ0ëuM02V'  )ŒÈfsqÂWÅ­ÙÇ=ðÅ“óåbŽf••Ôã< Õ¤ð6Sorj ò¨ye<•%ɲޔ9fϴЄD%V*µšl?Àd¥'”2³Åíº¾‘†¼æŒÁ$ÚdNî`˜Nšm³Ø`R ^‡Lb ò˜ø¬áýHVú}¢%\šUl˜ô‘ðx 7”ÝP`¯ê ¡þó„š]ìf–+½U« à ›€Kz »CøLÐ,zÙg0º’“™$xR«/×ëQ. 1w\/7¨À|ýÕ­ºˆCëÂÌ^¬ç5öY¦Y3ç)îbu„FS–ŽF3xI/d6;´ ³c’°ë…¾C¯k¹ò9S©ôbu³<ÐMÉÔ0ND¯‘/Y¥ÖÅ vNYp~´Ù $d5¼–°Gí À¨i‡ž¾~ØŸ;&,˜ÑP RRš›Vž÷@æÁ„%Ì%e€—#£ÆNWËYš;2MºŒÞ “ЦIøry)Fh¼U¤½ªO?ƒo¨鶘Ѥ@êóˆVBXÀŒì1Ëþì&Íh%r-â%iň0f(Â^ÕÏ…8{¿ÙDBs8B]1K›4Ýõèüs[{$׿@žùŒftZ f4TÓ„¾,1ÀC7”ó ]mac¯_Ks˜.SPùrýg׉:ݧõ˜ýh6ÎàRñ»âÑø„bæAÒŒ%¾~ÿÌW¬/4iLHÕî“ûÿœåezC³,X¼j÷Üìo$y cüéÕÏ—}eÞÐÀ ÔVÏýk¯]½k·¿³ýQ›eѼ›–3åd——œ_üÿ<oš)!|8¼©lY·üw!~V;N!VÂê×0ëÕÒâÀu\D¾¹6ãܹG³—§ï\Ú…†½½™¬×%K;‡[åâMêæö…Ãv÷†cHà̦[B]âˆxÁö•3×a|4ŸÂy¼Ziò?OÇiíb\/h/J¼^UÉœÞÓå?»np×N$ ¼ß#}?0iû2ª|äÁ‰ÖÞ©Ø—91à~ºÖz7ÝÁ,öÅÀBeO’mU(Îå6=!v¥J·tÌß°½RÙ㺮ËÍy]EòTâ ›ó/%åÄ`ͺD;X3ù´Ø’.»#4˜ëà^^Œb^Òÿ|wÚCs…ÑLrÉäñXPþµÕõñöu²§¶&*ÆÄýs¨øGõnr¢ÛÄ×ÊNÕ½T˜ôŸK6ü™9raÍúæÐÓ#Tªòˆwµwufkx¥øNzÒ^µ¹cIàì:â¡Wý¥ç‹¾¶*¯ÆÙë+«Þ\¸ y*°7DÕ#–hÞ©@òs´€C@u Tu¡l8 ¦×à§\ Ù3+À!æ…Ý] `™†‰›x1eϼI ¨æX?8¸u­òÑùPåào¬øÉÀÍçžÝví$G#?l/·)Uï)G:/8K‰ Ñ®WÅ·&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = examples DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(dist_examples_DATA) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(examplesdir)" DATA = $(dist_examples_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ dist_examples_DATA = des.gtkw des.tcl des.v des.fst transaction.fst transaction.gtkw transaction.c gtkwaverc examplesdir = $(pkgdatadir)/examples all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign examples/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign examples/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-dist_examplesDATA: $(dist_examples_DATA) @$(NORMAL_INSTALL) @list='$(dist_examples_DATA)'; test -n "$(examplesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(examplesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(examplesdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(examplesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(examplesdir)" || exit $$?; \ done uninstall-dist_examplesDATA: @$(NORMAL_UNINSTALL) @list='$(dist_examples_DATA)'; test -n "$(examplesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(examplesdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(examplesdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dist_examplesDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_examplesDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dist_examplesDATA install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-dist_examplesDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/examples/des.fst0000664000175000017500000046462613166335473015735 0ustar bybellbybellIÀiW‹ ¿@˜Icarus VerilogSun Oct 27 18:53:04 2013 a÷Àýj‰³-‡ xÚíÁ  ÚoÀ©}ú ‡ Zšx^¥”Y8Š…³[!4‘c ÉPD±mdH…¶Ù¶… '*2³$%„” ídVB†2–Y‘12„¢¶¡¸çá>Þ·û?­Çõ}ÿú“ßÿ 6ý—ÿ666ªÑþ²‹å÷SíÈ×{¯ŸÐùÅ kªKþZRbßÁ»þPÏ+ÝÒYÇRŒ½êë‹Ábô+§§¡2k[Ò-Ãä­8PªD; 7ïð ¾!rÞ›qNj´n²CÌÏã+5#gáE)ä% XiÒ² §j IJå7äùcš0‰öìU¡æ—å;Ñd^÷™-·<^ô‹f-¼—K ößÉp&¢LÅ–ÍKI­"PQ }0Î× Ç–ÀëÔÂýï Ú¿:6£¢‡áÀÃ¯Ò ÀŸÐü$Å´c/쌤Ïîó' ë@Õ¦³L[ p@ßî(>žd޵Ž^Ì6Ó¯ô¿Å‘ǽRúwC!"¹&ÓÊX¿­&² Ö⇩{n¼u×Y,mözŸ³^â2·É¼±ßw”4=ôdÊô»„ðnP„û®“Õ*ÀŤü$ÙE‡ ô&ÇÍï$•ëÐóÙŽï9ɬwé~NO¯™Àš¨÷šãXÉίo‹™þÛ'ØÕ¨že\Ó72kcšñ´„7+(ƒ'çØ0Å:PqtoÌ×Ë)GCÅRB—wòõ;ðWN}ˆ¢X²`p6SáúK!Shº8> þ´ÔÆ¢áyy¹â-`t–Û-…-žÂjJÓ.o¢ëqßós½…Çf'RWïgVrg&ÁÇ2›^¨Ÿ/ [SYŸ?5ÆêѦÐx›óbžþ«%ÛáÛVÂÍÁ¬7è=ÍM’ôü”Žø“ã4jÅbbŽ»9ÚÌ `KWo™-)‹Æ„£¶óøfµ\ä»ÿV<Ø áTŸ4%%˜ís÷ðÛó)פþ±‹Z†ÓQµŸ H†¨ôTaýRð³“,+Ô¸Ýauˆ*»úsçôD®2°›fÅ9D}öY7x•Vª‰¬ÇäÃÓ*Ðu\(¦oG­ha•sp£¤ñÒ•‰¯~ißùJÄÞOkƒ»E†—l÷Ã7†“|Å»—ŽŽ49'’[¨u‰.å²'2P~7¯ÂwÐßàŸÅ2:Þ묢ï$o1 ;˜NùZ²o±x–<*] ¯Ù»†ïÉuC]30oþ6‘Ùá÷¬Ÿˆù¾A»î×ðg!A›1{¤ŸiÃóE=¾ú•ËÄÞžºEç×"ã Wy9Tq³«6¦&ÒõüŸó,‚k—Í/+½ª˜¯¤O9½ß„ß4ºÎµ.€à;ož¥&å¬x1^>ÑÕöƵ"÷¶ ­5Õ®ží^]m½¯±Šw¾I&vÛF ó”ÀãÖ\š*p(ùCœ{#ÔøÇ¡nMå¸+Ùy e¤—‰Gm`ÿp°¾–’‡'LŸVË¿LƒiQŽKDºEÆV‚®W#ð…·h`‹¼8îq†|ûñhô ÏŸ ‡²þÓõÐB »5”“BËdªQ:`áD`à‰¬ÃÚñ–×È, xgüty A:¢áÎΘ编|ºl5©8²½m'z-V.<š%«>ï?z½ û8äFm˜èG‘Áž>qM “ ¥¢ Síß܈¾)J2Ž{ C¿zŒuD­À»Éïǧ‘61°°R2>}y¿ÿ(äÊßù Ô8\Õ奈–Œå†hÍm»@߯ÙjÊç‚LVa…RÕÂŒ¿©K1)ûøíóf—¶|€DhWÍ`¦£ú=RM—ï®ãËjtÛìþ;ZpššocˆÆt`¶Oì” ‘ÉuºÄZÌÜÖ80…ƒ|{çç¶wìÇôáNá…å<•e!(VÒV!(8Z<㼯ž×nôŸÕEÎøÂ>jv5 Œíq~S–ÎÙBóájAÎÕ)ïkop$òð‚ßBõNú…¡b˜k–‹ß万¶ñíBa’àñó§§A›ÖNð~_øD£ÄKC¡F–]òd½¬žw÷ä|/;„ ‘ñëÚÁ°šÔl’mMìGÍáiëà9/[è'ÆšíûQeÏ›ý¬»)l¤Â*QpXœøCs†œNªAéTôý~fœíº7î/3ù-â¿ÆCD¬Hp5ÈãžÜ|AêO¿è™Ïݦ£g¾HJ§É²ƒ…ÙŠ±/JaíØÈéÐ=‰pßA¡ûǺÏâ®Çû„Õ±cÅ.OÐÞIfëŽR“±2npJ:sXòÁ«9œQ©Z2 ®gÃF˜3ÑüIÑì¿§О>¸†d-y6 ùI=Š}ØB~è•§¾œ­ $¡g0¨z宾 ìM"vÆ“^ÃñouŸ¾,-ßiü\“±zvMèØ ¤-v=­;&¯Ï=Þ.M”4z?SÊ ªû¢-I€.˜{ŠßL}†›ï»ayå÷…íæëhÙÚ½?eއÆ“óÎìS’$p)†¼ræï„0‘[€Íî$7ùÊ7±ìÝ€ðQ…[®{Dq?|Ïh£'ظæi“ ¢ûaá—RÊ*–Ø ‰Ì3!œ=!žz€º;¡Þ ]ª?ÇtŒ‚æ¶Q¢™C-÷¸=©Qýp/!Åü®ý6€–pX+<˜®ÚŒ‚*%Ý<šd‹BÝ_U¨ŠÈwHXV\F’°˜Î¦Kp8`g+왎hK7V Ýs6šaÜ+©ãÉÅFæ-¿jÁJ%ôoñlš°Æf1 åç­Èì 1d0ÌQ.zÚwl¹< W*üåŠ`+—W¾oaÞÅyŸØØB³#`ÉM¡Û½.Á Íu­‘[]Wï7;­aœ ŠE—ù*Ù.‰—h¥*Ø=žkM=ÓÇ­†6½ÑıܒèY9[dLö½½l³å‡»% \üèŽNJ&ò'Ÿ³AWAg}ÕCÅfñ¸•}Gí¦ÐÖN,¨ ÎYZÃ/%²~¤ÊkÄ ÿó ’ðú’ä e ¯xuP4þUpË)I"•o Š¿“Ø&¾cŸCM—‘ŽüÚ:¼{Í sA½¸Ø7.Û© Ý%ëÈæ™S8œ±gÐÜ•¢¯Þfýˆ.`±¶ü…l©‰2>³Ó;Î ³åDû6»{͈©Úú(‘uÃÊç ~Ï+CøD¬À㢲Eü&3å\ z†mÖ1îÑ|#H¢ùÉ©Šwp„OI§`’FÇfmÊi™Yë +lCCk3ipM‘5â÷†‹ÕkÑ%lnhMWœÉÁMµ¼±7'©çPó‹÷ªd)sØ•Õ+"ëN‰#˜}»Ã—šŽ}ø\YϬCà2EÆJ‚¹Ýâ?Ö¾]~Áx^cda…£pèBô ÂÆx^c`€‡ÿPà`„Fe×ôÎÕgß#DàºþÝÙ5£,ÄHÀ¡f¡€«—T^¸£áÍĹÍóØ Ûyq«µ9Xx¦û¨1Îs`Ù)ºËùßÖmŒÂ; þš|:çÀXð±Ô­ë3gÍúµ‹ÿ9°/.p½¥%æÀ’1‘åÐ_k}ó Ù[ÅN—º9Ès¨ñJr‹sˆpPN‘Ú•XæÀ!&榹ÐA>¾x^c`€‡ÿPà `t„‚FFe×ôÎÕgß;ÀUÃE^»`YžîäsÕg…íûð[LW,ؾ9ºzGèÞwárpúëb^¿ÈuvGày+ö°ÊÝ/9”©ŠìÐÜï‘å`}Wp‚§¹“ƒÚÔø Óõ ³Ä|ãüÕƒŒ²Yó$JçÇœr`ð¾öžSm>âM:p²ðqCÁv‰òQ3!Ï,BIW ²Ø}nÖóχÁ± %Ptâ.z|™Ï1{tÑ š!;â|¯­ÓFà±×’êÐݸ—_1®ç-+°–‹Êð:¡ð ruøDàf[βx2Lx'þ†–ñèq´ˆ)6°VÊÇñ­ÚZFñ ÞEø~}Ï&ÌD Íhe-óº>É~¨ACÌ2Ý\îg„(rJ2Õþã›óƒÔ.¾Û–t Ó?wÁØØÄÎ c&JO7ÃH/µ™ )C`ûú¹Æu„}{5ª÷T\Õ²„ûæ¾eøÇ·Ûs^{Òàì3 ôh¬{ ³JA]tè%Ì <”èà°£¾ôÌqMÛMñî€\JVð°BªÂàö>:…«A÷Ɉöt‘3‘d ÄÍUˆ_ùfê )Rr—lÑuv‘Èø–"ÈZ‰¿`‚“!„@AßìÓ´»?Š“/›ñƒòÓTêžWão>±e~§ èÍAݧ_CôV¼3 •,j‚ÅXHZ €\S„ÝbÓ¤jx¬û½^¡;rZEœÓ̉À×/OÃVfÕ *×!o"z¡(Ðë§á÷üøy(Yÿ^ðrJêžë`øæûxÚk* 8e‡«ne—GD˜ÿ`mØKsy8ül Kð9#ö‡òãÖßán~Síý#L8ƒ[) ¡×Q:>‹ßp#6tþX ïçⓈ¯CzK.«–@n›h¥O=±?ƒ‡Tí I?§d…žéU™j"dæö\x›wÉ ôN®]x'ì(ŠНóýP=[q9•ìI,îmèW!ƒØéS.9^óâ_zhž©.<6|{g§±þÔ9 –B×c œbÂÚ´•/ÛMñ@ÑÆrÀߊaoz>Øô€L´{RvÀDíÁ>/ù-H÷.’à(Жˆ±:Ú…Ø_î¦B%J6!†¶B¯UUÇHËÍwÕX.ÈFVn}!útÌ6ˆš¨^p-~ý2® º5°þÝdF¡ ä6tƒõj˜H4*åCãÕÜ *öÿRÐ ÿC×AìÜ"ò Ý^„¢{{áÚHàüÞN_Z„„‡°™ØB[5%ïƒ(ÿÑ·ÖÃízÌ]y¤Bvo<›mÝXÓqt¬Î=ìsÍÉÀ„Z©ƒ¾‰Á%›2UŽkq\‡ª©¡6ìõà†û·²ŸÂ¿y ƒ—ÜôPo4=ÄLüH5ä†êij1úФˆ™Í«ÅMíè¾ ,¬Æ`äØNh7Ì+`hxプ£<›Ò°*äÏ($á³½·ã¥üC>‚23ûhAó&}¤‹|^Á$—·üû0š àªk~AíÖmÈN È+?–4GT‡~!©w(™ð[†q-úS8¡çŸÃgíW8þÆð¤›(ÏRh0áúv±IZÿ¦ÕçP%©p`ün„“£Á€Ð‚ƒG±Ä7~JLc·ÉÃÎê\TÌuÏF½Áñ¶­Ô¢¶•Û…§=_D8à’5 ¥˜ŸF|ëb¸ùøêmÈ`;GC–ë°·Œ)ƉºŒ‹(Iñ[;þA•Š”åƒI¿¬w‚ÛkeF4•KeļÅ<ÿ>ÄÈ`§ÛTDx1¿âOÜÆHx¿4w@Æ×Aòvò>¬Šá(àüã4¨ýMV¤Y·ú¹3„ü–Æ"“ Ãú8Ë TúFµáIR—–ª‹Ž{ëšz4V.‹CÄ C‹WÉpm/“Ò„ÅO•z£œ$á6C§±ûR †ÞH¤°9˜Ò?`Ö©wްթ–csn¿ayt»cGª6ÍÏn%‚;MƒS׈êÐï ³[ÝÕ¶Idà›­Gœ÷kð1¼¸ %7*Õà 9塵lxV ßð³ŠZ4Õ˜ÊïÈE^yÈq8-\…^¦œ‰RAŸtΞ-0FH®=ÍE†…£MLÔܱÙï…œ‹å=ͯŸ–-€×]?!¡Qçe@e `áþ÷“õ`×FP~Áô ɇ?ÜEÔ‹Ïã¥b× Ý'[öx^…ý/pƽ<I˜9»¼nß¼3–·Ó,j^æå6/a‹¸aDN¬ÉKÃ…sa"oy+ÌûË,yÙns­£Œ;±®Ð-TL%oIóôüðìóãóydÓþˆDïGN*(‰FE0Ÿ¹ˆæíâ~yèEä(©}®ÿºÚù°9 ¹ ëú&üwE³h ÿæ®sɳÑìàyðcM@~l +/1¬Íúy4õ5Ü0³vvŒ‡qø¤¶¨B38ˆ‹èجt³EímyGâ+Ú.FÊžç¤tJ4а0¼ éºúœâVg`B26õƒ+͸©1ahÆGXiŽ À=õúd©Šû] 2 ä Ú*ààŒŒ“&8®Ìn<­(i€´>¹‹PÓ¹G 4ö…BÓŸn=¹‹h‹™IG»jT<ò¼³“‰!,X˜µQRÂŽrR¬KŸƒRãÅF&ä ú¤(Dâ E;ÃaTˆyV¨M‰3À³ó†ËPÛ2ábÅǼ•HªFÀé( f1'²óe"LGÑ‚p6»ö'ŒÚKn‘\ûö M¯ÁÇ3¡nœœ7p]|„ƒ8ž'"Ú|I¥IXeiîPýbÐrì¡= {Žº­\4ç‰kˆRxrtl“† G›é/ëm9ä;Ýž P)âúȽ:¢.ÈêõøƒÌØ—sh–jƒ1ðÊ;ö=˜Ñ=È%Û|F.–φ#Z0n wöǰ¼š\6•\…ÄËB"êœÀH{LJ½‘l4EªPÁXëçô(ÌWî ~]0Šw¥í§£š¿¢Ž9»Qxó3âA‰¢;“þ顸 y§ñ],4w}|6}–»2# xi ’áò•\²³ A–”§€f—…m0Xô@8­â—–”I‚M×lÑûâC®ö§Òá3®ƒèII/~³ã,ñÕSþþ_r·5ß’x^…ÎéKÓq`ÔÏh8—Vž¡nŽrjßh¡d´p2„´”)j…ÚZbæÙA‡Óyá¹YK‡–æ91QtÃ<Ê +qä¡8ýyNóÈ£7½ïù #é`ll²Ô…bU‹ˆ>%}…lŠ<šËay+let&Ë íIEd\ˆ:͆y›ß’¼gÍŸ@*3ñd®*›MŒ»ˆOŽ€ñ‡À]ÞÉ…YO„Ÿ)aà…‡v£W’TÐÞ)&²ÄÆbèv»âñÆØQWl&+hCÉV_ Ý¢Çaqߢ»™\¨(×NÄzü[]²Ó²0áüí=ŽÉ8Æè(Yã£õËóMô’Z2»‘ãK3ç³øHßá‚F Œ„¥ß«~,;xdj›…q›å,¨ó?£lU²…õvŽÕµE„UAÕÃ}­6·™^°pÓC.aÖÃ…Ò™“jŽJ aòp%lžê~À;WMØÂcd™PN¤4ÐC~K}!,X›E¨àðÝ75÷'‰=|¢U­àë×ãe§Y4xœr-&yåVäÈý¡k0Œú»"¥†-G»Óñ£hÙóÛÆ!k™€œoº— —¡y.îeÿZ¬P‚ËŸ †´7¦ž4ö$ª7å+Fw—8 ·†Ù"¨§½ùÛ_¿IFëÄM÷¶ #‚9…¯#&i`&ùØÓFo#¼Yº㎠Pä(+pZ`HÄå½_ 8žÓï“"EÝ”¯Mãj¾¡ÁŒåŽÒñ {BVÌÈ<]KÛi{ B‰m8#F¥¨dXù"¡[”I‚%Ae¸áãÉÆjþƒ„l šÛÇGOð¾é_ŒRM¤x^…ÍÏOÒq‡q„·©sX•“¦[¹™|œ"µRq+˜kÉ (3³Ì!1¨%±–1§n6Y‡Ì™k¸èh3[®™hIÍoKÌ2Ya’V®Z@¯Ós{šþ´?°wžC@jg ¦b^Fnz2öý-Ôœš˜Å3Å´áëÖY¹¨¬È²,uË.–_WïVš˜i V²×DÌbY•+¾‹Eß×­Ýä±oWËÄõ,ÅÅ_ú!vLÿµ<’åu–ú–%òªX„ú¾šmúQÉÒ­ôEƒåL¤Á>–[ïBùM.2ºñ±œÞÒùˆåWØ– ÜJœ&M­Y´æs±\4ýÁ²mÆ— &ö±›–³ôZ»O`©óü§Çò•qm“ÉÛ ÇY¸ª\ÛX¶•ëd)ý2ÑÙÄ,bËg™M÷y[Yþ}åå11ÙíÇå`YÄòþ³ÎzfzG›ÉÙL,]MëKYšø±ÌÍ)7ñË+b9=o5KÑ—ÿ?XþØ…K›,jw’bqù#ÍR’È,Ë7g‰“íœ,ëšò¶²d¾:îÏrÓÖé¥IPó –TÃÿí,-Ö›Xr[Z|LÊnÜseÙts;‹•é –QÓÖ˜ÿÕ±¥^û¡)Ë.|e–ËÓ”;Cà¶hÒx^c¬ Xnܸ½‡å¹Õ[ ‰£B@,–½›ì,¶Ê7Šm==øŽe—˜ÍÒçW²ì_&qÅŸçE‹Åäˆ+,Ë™W<´_áͲ{ët ˆ)âdŸ²ÎQXÏ"¿ñÉ9‹‡™, ,]Þï˜Y&Ýoа0›ªÃò¬pÍ/–uŠÂv —ä³Èô®Žaùñöl«ÅÑê ,ê—W³L¶_ÍmaøÔÕå£É…,å»’žY\ÿ0o!‹Ü¼ÖI, ;žÿ¶8—àûŽ%aÍï^–G)Oc-ÜÚ%ýY„ŽXä°ŒQo±xÜÖÓÂòiûŠ(–<ù¨‹cìKXœ™×‡°0ÜÏg¶XÄv5˜å’÷²¹,&“ö|²˜¢î¾ˆe†q©)Ëý{±Ï-Š™W½a‰‰»ÑÆòþW‡…ó±ò0–¦) j,¦_eØ“bîx^c¬ Xnܸ½ÇF]]ÅÙáÆÍÛ6,wïܶ°¹«tÛ¥*ùÄýµœlÉ8±¼;=·ÁFét`=D‡È qg–»-¼·lþîXÆâ)ÌlhãôGÀ€…“m¹¢ ‡åa–o®³QT™“eÙÛÆ‡6ûöM]ÂrøŠ‚MC…r!‹m¦/³ÍwMiG–­ogÙtMþy“…£ütÍíÒs¥,«X¶.¶ù²wÁ"³Èé‚6*\ÓEYz:,Ú°›V,`y½µƒÕæÃËK<,Š™'Úܽ,ÛËÒ-–ùFÔgs¶ x^…Ä{<†ÀqÖÏã£î(ÏŠbá:·RZYÓÕBÂÒyœš”WEVyæ óØ$Ĺ)ªµrN©¤ÌeÕ.kªÐÓ]Øñ(×󠤣BwÞÿî÷¯rôÿÒŸþ§‰6Ã6Ƭ¶3T‘¼œ¢l„´D < ödOÖ›?¸°;¬ô"s›+j½ åbÞ­*¦2í'xÞ=m¡qÚ·æå¡;øšöGð“¿«!sm­€ ¶Ñõœ~|MŒøú—FT»Ôà»CéËŒ:úWBíVmà¨j~#o#…ÈK•VÒöpg'Áµé çžþÀD×÷ª¤_š3JBŠkõ M¶Ð`ûÃîžØ„£IVe•CôìZñóŒ/ù&ðÕØ7K³è xš‡c~D#wo›U3ôoO{Š*DçÑs–²]ÇS±ÛŽRîÈçkD`§û€;­ßËñKŽ[ÆnãŒÑòÚJ}ÆŒ„e6\xœ¸—=¡¤ôy\E12¢ƒ¦C‚˜V¿ã<]e“ŽïÐÔ>ªÔÍa¡‡f õ«nNqiµŠ£“Ë$}îïAÀpë§4,ö`µÛ>K ‚§™¿fv8¹1³$,’ ­Æ7"̧þª!*ìFOð¨Ç±„¬EÚMô¶ªaù‘ÚL$¦N¯0¹bnÄü’¥©¨­½›Ã`æA/º\¿KÔήéôísC }#™õºÆgéØãÈ£²À•ä=~~šwÞïÙqÆ÷2…{KÐ z¦Ë]WGSvn?XIÅœ[8œWvA_ã©%·õÔ~âÄ“ð—Ä/™ÆÍ.ñBâ²ÃüÔî›NOö{™(_4ʇAÖqÎXg¿°E5時ä€#‘¬óŒq¦8­ÙAO0j°“ª2û 7l·{³BÿÅ&FÓ®R½ç?+y¸É-Ñó.gIs‰Íû­‚¶mJå4¨Õ×òpü„ãRÓöjžíæº^ã~×ò2æî‹QĶºÄ¢¥ñ̘›ÅK´‰7Jx“ØAŽ|}o—×°øöñZ®Ï^†h\K„w´ _ª,½ùZ'_ÈÏ“G¶rÂþï"N5Òcn¹t>f•EŒ…hüŒOÀIuž¾QQYðg¼®¯ÀµYR1Ö‡µ2 2Ž÷¨ñ#¾JrŠ$£ªk)ºG‡ÆÙï7ËýŸ£ÄÇ ùkx %t[÷h¡üÞò¡a¦¸ªÇ‘¼´7‡†õ“Í,z¹›xÓÛ•xæÎ‹f°mã.¸¦\çAêô ¢æ¥|Mmvh'ëlþlÎÖëæ„œ*™Ã¶ö¿õ£8.\aŸ¢EÛIêÿrL„³4~˜Oß.2Cv§Î{­ã§pº¦n[Mj3M²P}þÌÿöW;pðì«Aíw¯Tº`¹DØÒæ)ËeÍüšY.çJͲr&[Ê6Ó"R¢ëÜÍ2–Ÿ3PæÞÎ×kÈëH+¤\àäÏÖ‚¦1|ŸœZЇzó>nlªÒfÔñqÊ¿e YcïÍz÷ôð1˜ÿŠkÓ-«Ìl&5äêbV‡/,ò¦u8ê åV©b¤W(ÀðìŠ|ü*Ó–1­¥£”VYcuÍoýð}ìuÚ‹÷$ô|ÀÙþ¦ý¸è ëøe½ë%†÷¿âÜ“Ä:'5Ä ‘ >`îß˱Ãr)î®»”°Ø _„Žq±5)MY§”åܽå0„ü33Ì7Ï”‘V–0ÊËf±;sGUµ©ýgÄüE- ‘Œ)»#9ãœÊâðÁ¼É½Œ¹¯ï!fË»í¸sÜG ‘Ûûa¦ºÁ¸Ð@‚é5_)§5 â$ÂLñ¶›mAÿÀ2òióO5š ×Ò™Dµð-zÕU•xyxR…ð‘«PÏÞ"#)a«œào6Ú²5áõ1DÑëòèùcŸ —}øüŠ×=ÎÞTêÃ0¡ËÕ½+ªy•¶_7†$ÚÆîïiiân¢ªm¾@Ç}¥ û0+-^¢ÓÈå}!ãüëQÝ}âÏî"¹×­—ÐÐgù:X$±Ö3ĉþ á÷%ó1UKSÂÅ}LKkO°Ñªh€qúI1#dûDz b•Ÿì×Dá‘t¿ÿr¶c¬ x^…’û;†€•—Ê-Jä9î‰ ‘ûãVI.™šŒqèÃÓRK’[uÖäh›"êK¹Å£™KaÌÄÔDE|gŠBF'K+—uö<ç—óÛyxÿ÷]÷@â/þGóýêýë>zMŒ“›.ÉS†-è uxy^B…y»¶Xè¤XStÌ&…rYkcÖ¯®Ê¡~\¾×UÓöŽõòÎT×ëÿJlø‰`ÄcQ1d´*† èÒ‘ÍîÛsª weSdC¼Éñ~ :#ÿíãõH©þ¤ÌQߎWHæó á–¸e3Úœöüf ÉfB–6¿`¥rª#‡oŠp2µ:úÏisT)úWR³,Ɇ*Qn¼ù¼ÔkÆÿ¬Ý÷K/$†~¸}ôqÞÉȹá*¾Êj£’d2‹'É4³«fŸ]Ìk²Tl}È2Vû Ÿ{iåüxm¥ e¶JRèm-ý£+©Ñ †9F£)mò3[6FÿÄXY.‰ ¶ÄîI}Ä’¨—Þ¨ËÈ1ð‰Ê#EWUhŠ´ˆF$ó~=•«»yâSw¬îû#ެ÷E'2¶œÙ£Zw8ß×4ʩČyVˆ­dhÊ;ÙLê)Ç÷hîòàuìeWDRveL}¦7Žùw…èŽÌg2òc¤!¹‡ŒþÛ#vüŽ=2ñî_c^wo+u¤÷”s,am¼ÁuÏ6’h-cÊã2éRnw²;³ª‘:߈íX}º Î¥¨œh)Aí§ÈŒ÷‡^HWn@ÆÏe†â[¥,=ól“ìv'&~Ù¬ÇÍž‚¿£‘¯¶úosëyÛóÀ_¿Y|:Ûɹ¯ßHfI¸:ùoé{˜ú‹G=%x~h-É÷jз)NÝhª—š#lP>Í:9GjÃ]>'³XADWÎL6£‚bôº%-1ÖQ5À5Ó „­å_Äf%¸É«žåÓe– ¸{:;ÐR'Üöd7âÊwwñE[Ñ_‹V+)`Úû·n´¤¥²Pû¢G›®…Â(¦ œS£÷¯K8 ¥".œè!Ø<Ñ‹ç[¼lÍNÅKG§ñ\<{s¯œ`Ï\K2C¿ç’3ß]…Æ>ûH ò{Û¸eÓZˆrÄÂVe÷;8þîùW4ZÛØ‘§"‰i¯ÀºÂ¦†ñå·3[™`J°f¿Š]yXl ãœuvÇÒÞ?dÅĪÂ-É3íáÚ -FÊ,ƒèßáo€÷ÞánšÝ=ðüÈ—#—ö )ÐR“åi]C© )FLÏ݈à ÙÜ „Ë÷?ám¸Ï‹¼VÞåCÛ¾(tÞ À럿ã";FFŸîf–‡„'b"±ú:½E'qÁCÏ•©úÐ_¾IŸ á»8_,¯åä´dë/¸0¾¢ÎµÇ_±M»Uøì.OŒÆ|/á·öKÚö×,`tê{ÆW !ß(JGYto†ƒˆ +l%vrS×Wù'ñ]׌.õ¯ÛIžñ¾Ë¦ñ¼x66‡I‘aq‰Ói³yÜq ”cç½,Jm7аU~«CU×àŸ˜šX¶ÐÞk}€ùö¤hÝo›%Ý8¡’UÏjÏŒsyp„”ŠŠZ,Ö•™²f궈 ÿ|$ZljIµ€[õ®›î:[]šV$4Í*ÐäÕW?_|ŽgªÛe#W›Y¿\=n¼SJ$ÏN)“²–Ó£Ôˆ vrJßñMærXäÚ¡J£ð›büÚ÷Kâæ|º™‚ãƒ1˜WËÕð2zÇ-r¦wùgð£.šÏéí afU2<ÐÔRCÐ4´˜Ïf ž²í[{{þ!¹Ž ·£µ&2ƒeªwbðN7•æ°²B9õzs¨¸ð$µÆõ8D ½àÚ-¤µÆ• «¬ÀX¥yÿÈM"—­cŽð«!·KZ9â<ö åmNœ ^ÃÆréiu[Oû¢Éë¸Gw÷ÝÎÂo™z"«†¢¦”þ߯Ç5v£0MÓÍÄêا–lB+Ëk.¶Am{˜S_$Ê‘Ùu*œô:JdÐ<¢k"½íPsaáÃo>c]c™#S£¡‚ŒšœëKK*Ùå³âm’Æl¿¢§‡ó LÕê&I 0En;FÑhS2&s%ÞàúB­)… ‚Ÿ~ÞdcªTœªÆ%Sz_.R¢èö›"ù˜áR£;—fK-‰+8~ž±Å9|×ZcI{WÞkÖ?Çwùp‡uÔŠX_íà Ô*ôˆ2,­uçoúÈûôŽå)¨;œü˜á"U™o^’±«§=—ÿŠ\ô„9ZfkÅvüÀ'Ý–qTûû9 UÑ-[ñýÄò2¹öúVÔW){ ¿ö,k®e†eöÑ,Z…ë¦WŒXˆœÔ†ýè¬ír¤qç¨=)vº­”©Š¬Æ×üõ¤ðëwÊ•èk¥¬ bBþ9QÊ\zö¶ !übéê)dÇ~GöôîÃxD¬k?JËb>·–¬fIi¨¿dÍßÂʳbcBRóÔhÙŠ•’æ.ÿŠy‘ ýhîpÛŠîvŸzâΗ«ñóµ}1òX–Ì©êæHrýæqóæX'µY>J¸_¹žÄ…ÊAô8¤Ì W¥2æìÜ3„öµ3˸6ª‘ÅF›’[4É­*ÁùâeVlêÀÇ­.‘fE÷ù¸mÈ+ài§êSvJ×riæÀŸ‚¨Ê·}´¾JÃOüÐ#ö{íÀÔ-çC‚šÚÿ@¢["ËÆ‚Ï©HÃß´B‚—¯ÇʸØlbÅ×]—wPø£T§kõ„'ôxœ]O˜QãMÄÌÝnqlÂ܇¢Y]Y¼Çó‰¹ýÉ·llsøŠ 3¡s¹·2ª’ŒG½ªèjë¡$ëE/’Ú™ï„ó»ÿdµ¸^•»ãiÈò¼ËDÏl.oM{vqú»#z²±l« p[° ê[̦aųNÄnÜx í©dI•Ú &MÒÊX›&÷òK×lk ÿ2¹©Ž |1<2ˆ¨“Ê+FÚÝäÔý™`vˆô½F¨›‘¥;F?„ÇÅa.L›…¬âs›EÝÂäÛ–òËM7Z®bÇÙ¾y9zR·™pOã^6›ôY£gòÕfTRmh ­{G×ç^×·Gãd¨ÛA°ýí!¦Äa«pdq;%:ƒgX^j™ÇÌÒ4ceò 97ôî5jŠ÷íð«6!@ºk/¡¹³VÈvyˆÉ@­&‰Uƒô&øê 6ž~<Ñ^mMµÈ_{ñjÛTDâáØe$4yËuoÎJöOßí$&÷N ýÁ;QkË–°ëú4&í»Ïœ”°>öÈdóo^s¶Ú x^…Ðû_ÍÀqñ©çµú¾\2©hŽÖ±ÉZê´ÐDÈë1¢í8#)Õœ³.GŒdÑmŠu6%tãZ÷Nkí9rXEª-iSY.iréJ¹µö<ŸÞÀÇ âÿĵkú ¸<öü—)½)Ü|&­Ç ð†Š¿ÆSöå‚xLÅ76“òÖ[*†=Mé<æ?oßìåBn–Ï)7oŸì|„o¿ðYK†âv<#G†®¢«ÌU!:k‚E¥l#§ŸßdÔËôÕ,ÜÔÔÂVI‡3Š‚ôt!úe\ –ž&±À¦OɈ+vu¯À3ÜëÁí²>g´ ãhfQõ$ík¬µKž¢~·€­ŠN¶¾_­÷Ôè 8îö;mùš"vï0ÏÂmð¤!gÜ‘œ™>‘ä9?z0v¶C-…§o0ç‹öÐfTÛÉAµùKaýU¿r&$©#§T\¬~ñ¢#Ný+ÓHGüJ-»ñr±|s™û=Îj†¿Bär¹†®W8“RL¢ù‹©ôHÅþÉ¢c®ì x^…”ù;Ô Æ·™·–BßÐHIÓ–³sRvR#Ú Ó±Q’+4‘ÆQMȤl»±rÌFf+’[‰žq´äf”[¹‹H5#Z6kŸýöóÓûã{<Ï;÷?à›9°ë•áG8Ly¦"MÛ?\Æqsô!‘‰’æa $>=Œ‹3ÓJHµ6¢ƒ¾Cˆ*SïMþU¨k}€Óºäp¼ÊÄwQA[O¯E±Ì*¤2¨ã§ÉhÜò ¥Â×õèðøFŒŽŽc„ªP7Æc’OU† àÅ(3½‚Þ <ÐWÄôËRäeyÐ}Ð÷=<çY¨îVÛk±HµàxÏÖ;.Ý‹ØçŠõP(áz¡‘63†‡ó‡Ž¢{(6.Sá<Œ©,9¯«´çPàf?ƒ‰Dt¥7ëA¬2é-í–\ü¬}/ ¹·D+@É{‹Ë°—DxA•Á§Â¬)‘…Ëo6…ŸøŒJöÔ- n! ýY-Ú0ï:•îN3yt휬‡Á.(l¶â#êÕj98½žùGDA[QkÔz:öÿõw’å^ˆòëyfàþ®Qƒ„GhJ³@u¼«%dÙ=~ ùLTCÑ.L–å ·Ô)6hŒÒgàãÁåš„¢pÊ6">l/Pþ„SöáµX4mŒÖ”5‹[ΣÀöúhšÊ$rÕè÷|;Žt‘u;Žä¤Ë½™¯ˆÌ›ÐêÿÐn[­·#ä79T·HéȨ ¶Å6‡P Ì:Š}ÐW–€TŸÞùÛPé¾;E$,T΂H·©âkx²>éºB/sàmÄ~ ™††;.Ü‘ÏÁ%Ç~„h'k@Óm:·‡‚7ÔÖ®U"Tzo¬ÀiR |{RÝÆäΠoš´â¯Jnø£WD†Ðáá,Þ[­¢bMùEÎÞàŽÐA61»O$ÅeI0¤ùe ê.•ŃqßõK3Åà‘3tá½Ì5’,þTµíÀÊAnФÓl¼Í Þç+wo³uvo`™œü ¼sy'¡vׯ#nÙë…ÆCš=.Cyø¶öäfâ§Šh™:`¥î‰=0 DŒ Þƒ½iq j™!ʸº«-Ì [HCri8噎›9*þ>Ô Ça¾'hÁOÄ8t†Ä†Rkïr"“F•ƒ+•‘ì³#Ð K\…¡5d(K\ ±‰9ˆv´qáãÑfŒ²=õ$4¼ëäÁw_<‹¤R.¡G3áb–nÕ½ÍT ˆòðÝÐy`±"¾ ÙZ ðoAHärx¦5LáKÓç½¾/ij¯ÎDàpŒ(m+=Å»â¥PÐŽÁ¯a0‘_爆”¼0ø”¶ÈÁ·òi+FIƒý¸¾¹à >ï`` "ø3ñÃ!ãt˜-Ë!©ŠS…’ò-û‘”Jf¡i$l?’ËÌкh4Ú½[5=Ñæ˜gûc2z|áM´i1@ÐbôžâMlx'­€ò¶¶:˜ F®Ì]Å :%ZŽPØãu¦Ö6pšx°•é”i§Ëœ ŠÙyç½Îb“çöKp)dÁnÄÐK\94NäàƒVŠ4={Њf#‘d8ço_~št'omBÀvá!ùšÅjpîØñþLvZôbï¯y2˜Ì» ý^*ò)µx`¹ 'ãÊpÑôÄaÈÐbþq 3ˆ x^…Ó?Ó Çqß‹jÝh¿!î†nå¡ótMž’4tuÛòЋ•žVQ‹Ëêu˜rt-åZ±vyšj5O—RÊ\…ŽÙ)‹™WJÑ$Õ•»^¯ûîý'|^¯~Òÿ€ÞgðòœDצs†(’Ìœ»é£9¸‰V¸üBSïÔįqF^¨‡î/º19žLLâ„þ“¯²g ¥ýÊÇ&GÆ]q;v¶:¯€ºVÚ€Â;—VÀx"(qö‡ö`8Èò"Ö,PÔAð!ŠÐÜþð ´tÜJ©©Ä¶wóÀcÕ˜#&ñž cvk QwÈ­ÒÅL OûpÂB¬¼º;ú!î}·Mr(l.Ëñ÷ôWØ4vtâ°…ë5÷ÇÙk”6,\ç@tÝLw€<ÈtaGMXHíJ‹‡šÒÕ‰{ ñxŒ#ÖUÖwò8LÙ<’!¾pn5ÈŒ-D#Ûuûó¨PÏOKÁ‡Ê|вfú-žmÓ¶¡: OÆB=Ñ•#6S¥GDº5‚AÓ²àª_À‡(¥t£ƒFk±î2m7V¿¶’aã²]¯‘##,Ñò)ªUkâào¾ãÄ…|ïç0¼Á#Á£?e)Zë@{и-Þ.=¹ "²þ§Ýؾ»S;á½µÕLÆË"د—¿« !„}¬â|ù&ò”TÜÍ”!¦Èˆ„„î\Ìl…(–Т¤÷t.$"UÛ•–°N‹.@p)̓Hœ¥ç1ï²?Nȇó±u6ߪg:ôÅè Àqy¿Îáp^5«#C°d»ž„§W©þ¿ï !š x^…Ðm4Õ€qêѺ•Ž5µ¿´4u„­6v{s{AiÕ‰VWI̪EeC¥”¸dI³JÜ,¥XÖ¦K¢u%¯!„ë‹vvξïùôûühîùŸxöìy>-6+دӆ¬ßg+nòð*ÂÆ˜VbT›Ïi©½¿5&c\á.Ô˜gG~ñ¯Píú; Ÿ ‘uZG‚ÙûŠn~ÐÊó.n/š#F’mQJ’Ru¾OʧµÄ,çðÐO‡‰}±)‚º´QbßIÇÚYÔCËV³ ‚¼¾[‹–NÙ~–G¸xLóßöÀVÙÖ¥L~®gE¡Èª„àf³O‰˜¬V’féz–Câ š+×)‘wv5k8%©ÎìY_…35%ÔÍáñç¨WÛNÅÕ(#í¶ þð¶§MfÛ€ßêµBòHÔ“¢–Ùñ2&:È ñˆ¿/†¶š™Á˜•Œ‰DrIÁÓÁ£œÿ»ñ$,í)÷Läˆ%C8Ì%w¥v1'–ÿº—žñ9ä6ÉpzŸE¯©&qjÁ¿EßG³ÂŸÙRI`A“5Bon0yůÌÙéºÛ+»~GŠÂï Ô[ún¤LT… u—?ÁR·8ÄÑñ]„|»Ë«¦ä÷\ tŤ<4‚ßΡ%º7¹VónæßÌ ¤3q¼«Tr Ì¿„·Mçëº3ÜÄÒM³O7MÊ©W®Ö¼«p ¦ÉÃ~SÇ?¦÷Æ+PÙV'±hs›”Ö"óFœŽk¿æÏ).æÜÐû¼‘îŽ)†Üß>YNà Å.ªwŸñÂ2÷Î`áƒUºzTíx¬UN¤1Õ«–ÉØ… 6­w§öŽ^‡DºÈT))øµ†ø¥é13Éûkï7¬ÉT‹HW<¢Gns‹œ@+r*®õ“¨i§KŸW•1;.ºáv©¿ðáG÷,8UÕ9s¢ý¥.PðÒ¹c=ÍIÚØY…´Ýãù63v^ÝiLrË÷ ‘ów~Ù?ÿˆh\¤9ãîJ£ä,jõÒ¯pûú*+MÖ|íïíÜpªÐdI¡ZD_vÅ*ÝêzŽ:tíaFÏ6+neJy¬*[ŽãĻɈûfy!;w2•NÆ[Á{¬— Ï»I/w|ÿ—ÖÔcšÚ;‰Kɤ•z>fÊ>aëõ6)8ÿK{!‰Ÿ\hlîM¿Æ¸ç}~ì y=—Fë3\3§¬‹–¡|&Š ¦CÇ“Q÷ ÃÊ:V_w,T7Sq¯<¿ Aœ­ íûD ‚û›Gh7‘˜à0¯ìÆÙ}Œdv¤Dyå23KÎö Çu¥#Dh–>Æ÷˜V\ª¹¾xŒ+s¡sv7½ ÖfÔ²…G lCQ˜g-lÊõÃ>ÿÎ ºjµ7En<´,ñ Ñ/K›Ô«?w“’$æÍ›†t™'üN¹¾dÙ?s{ó€ex^c`‡ÿ@àb`ü°êÃ*0ÓÌâ+xâ°Êbï•\ö,qh:ôÐA©aÝ2‡ž–Í»,tàJ ^è°¨rÍR†b_ˆ¾]êÀsBjÂ/â-++pjx^c`‡ÿ@àÀÀÈÐàÀðŸáã†3@>HÌzc“Rìðüry‘ó7&ùšEæåUiE&×RþM3.t8¨«nä ¤¯dîà3ÍÜÌ!‘ÃÕŠ2c‡s*:V[ŒÔ”„(Žšx^c`‡ÿ`àd6y BLL N¾TÛa ãAUÚ›‰Ýt?æÀ%udÃ+i‡"—×Ì‹"š\8ÞívX.0cžÇ‡M—S]Oíwxv~’³Q„Ãâ#?OE:심æÓ›ã ôDC>Ú¡˜=1ÉIÞÁØÃ®óL´ƒ€„Ѽ7ó¸£7ÏÈtPndàu«§79šx^c`‡ÿ`àÀ ä8,`bjdpï°ÈyÚãAU®(?>YªÎÁÀ²ÛýÅF‡ÃÜ2;ZNðÿµÂAó²‡ÉE‡´å›n?Np˜rúß¾#ÞÝŽ>Jpø~>ÐôfC‚â,æÜ~Ìmæ+nÚûdãðáìæ‡œÑ,68ð0/˜»Y0g>Æšx^c`‡ÿ`àÀÀÄÀÀÁàÐРÔÀ!àÃ2•ëÉ1ªròאָҖš§›8#¾;¬qÑeH,qHô`¸Rïp*ÈYºÚËáé©ya'/|iyXâð>„±'0ÈáIé﨤:Í3\/þtX~D†¥è³CSÝÊ‘Þ "«¢«òø®nâŒðshv8¿p;Ïšx^c`‡ÿ`àÐâ(884(0x(8(«ÊÙ´ºÂxP•wn=<\µËáðoÙ=VŠUü‘  ,Î5ó;Ú¦'¼c³tÈXS>ç|·C±X.„“ƒ™z½/—ƒæÿª·rŒY œãlŽ8Ä(ï‘èsX«QïºÂsÇñé"jX,XRÿà-º5 šx^c`‡ÿ`àÀÀ À ÀààÀ à`ó‚Y|Ù!ªò°øŸ‘¶>S3÷é9ÈÝh“f±v`ØÈuøyžÃ‘"ƒ {š’ör½:öÌay»­‹µCÏÏIYÏ”^ýrŸ¸t—ƒÛ\.–ãúFs'¨é9tEØ{}w8ÅÁzyoŸÃ™pÇ}L ‚éÏÐ8Ášx^c`‡ÿ`àæp80¨°pˆp8u^ZÚãAUö–éFÕ®pð*x8¡Ò!½éJ¼‰§ÞM thà+Q8üÆ¡æßš/®“_oËØ7É¡øTÉŠ-žÍÏKºâàóLà÷ÄC©Im?18ð5ç¬ê=éÀƪt¸ÖAi»Ñ‚Æ '¶uW[Wœ<§šx^c`‡ÿ`àÀÀÀÄ -®Wº¶h\‚ñ *wi—z_×uhËs µ¼ápUDºaŇC,â¹§¨Ü+tq8µæïÓSWO<\°&Çá‰Èi‘¥gî|³š—‘épH'B]-ÖaaOôLŇ2áKŸ:ˆ$Hܯ<èðåW˜¥ƒÃ‚†RKýÃs=7šx^c`‡ÿ`àå p48488d.‹TÍRƒñ rÓ"—ÝšzÓa‰E›·ƒÅò.‚),&y‡·;péñ³q;ÄïѨ?æP(ú7dc‚ƒåv»°Cn·Öýñ_ì c£päåd‡ˆÊaþrlߨ.]wàà¸ÂϾßáEÏ76'm‡@¥ôc)H5íšx^c`‡ÿ`àÀÀÁÀä 0t¸088p3¥Ïö\ ãAU~ù;#e[”CÁ©öÓÜ„ò%øÝXª Ó.ê1-ßÍãP¸ô“`®C¾Úþco•Ò‹™S·æwÛú9µ:%sx&°PÑ3Ïá@¥¹ºŠƒ€çþ|½Õ_¨âð‚á¡r.üq5šx^c`‡ÿ`à d32802t°0:8œ²eÞQ`ãAUšúãÞÖA@Êê—¤²ÃãÌ&ñ.-]6Çf4´}<:Ù!Oo¦Íº`Îò~ñ /‡S¯š÷29;¼·Y²éÊ<%-)kŽgIç;fRvؾaÂ^ÎóÊ ŸîNwpÞ¢õC°Ù¡­qî‚ëN8½šx^c`‡ÿ`àæ09p2t°029l›ÈÊ%¶ƃªôÌûõõ¥—ÃG‘CzeÁs¦K,kWp`q6+›éаfå!…ja÷óîÅëmä—·ª8LškÝn,èPñ¿·¬ÅÒa"û¡}¬¢ìvù÷3&}vÐn(J«vx)»„É$؉Eïšá¬š3¶šx^c`‡ÿ`àÀÀÀ¡äq30*129„8ok¼Ó ãAU®ÞãY§\äÀ¸mõÚ5Ý·’¶4opvØØpsu¿ƒ§¦FiD£ÃÜGO;Îw[m̼1Ø!æñ’fÎÙ·óþ:ì0ñÃBIõÕ¦rÚH;Ü*òÚÍ}Ò¡Ù‰éï¯Fá4uÓŽNž ÂÞü9šx^c`‡ÿ`àÀd+08°12*)0:L‡àèU¼S¾œ¡îqÓá±Ï"­Óÿ¼\ÃüÇÁ‘ûáãkSŠ9S zw8ôÍ{s-m«CKCæ õSVž PúæÄ!òËy#8Ä=àšx^c`‡ÿ`àÀá±8 0(4:¤íÀœëêÿÀApñ½áL‡i|¶;]ß80¹±Ì~”í ìvr¢¢–ƒ¡‚DÃѽÅ4ÿšx^c`‡ÿ`àÀÀ ÀÀÄà  à ÀÄâ0ñ1{²lŒU™'ócΣ^‰Š˜ïbB?²lÜÊàÀáÍð?FÔAŽé‚ãå‹ÑÉâ2wêv³oܨãp×»-xŠŒÃúäÜŸ…fD:Ì¿`æpòFãuÁ.‡5Š[ü¿‰8,Qpy~Ña¯áÙä ŽæèG4*9nx^c`‡ÿÿÿp`à²*€DkX„–mÿµr‚ÃŽõm^fl sÒß98¸ö.yà0µô¸‚ƒW™hƒƒ@iûu‡ é6>ªµ:8LŠ]wÀálÿº‰Þ%‚%o±ú(Anx^c`‡ÿÿÿp``²l€„ Ój ,{øoȇ˜ðà ªÒÌ~Æß”Ž]*pðÚõx‚ƒª5׫ÃÔ'O3p¸a<ÏÁ¡b²ÓO½ë iǯ8ð¸]RpàØUV%/%@ÿÿÿð@@@ϪÀ@@@0ÿU0@—ðÀ@ FÀÐ@“ŒýÀ@ȱ´@R®¸à@ N°@‚°ð@Éäå€@6 ç@ž$Р@’KµÐ@Ù±õÀ@ƒ´€@Â.nx^c`‡ÿÿÿpÒ@È|€ÁÁø€Ö ,{ÆþªƒƒêѧÀ *í Štr¦¬^gàp(xÇÍk Œ*-|›-8,ï4QpH™ô¶ÀÁ,§¶ÀAáPqA÷òÙƒ'’@ÿÿÿð@@ð@Ìð  @ð@@3õP@Éq_@Дl@É8ÏÐ@œ‹@@å*ë€@°”ì @ø ë@ŒžNP@“`Îp@©âM@Ù$»P@Í›P@ˆ1@@œ"éÐ@ÿÿÿð@@<@³< @<@@LÃýP@2\WÀ@4%@rN3ð@'"ÆÐ@9Jºà@¬%;@>:À@c'“@äØ3@*x“@@vI.Ð@sfÇÐ@" FÐ@gºp@ÿÿÿð@@@¬Ï @@@S0ÿP@ —ð@ FÀ@Ü“Œð@Iȱ°@ŽR®°@+ NÀ@‚°@XÉäà@y6 à@ ž$Ð@]’K°@\Ù±ð@Hƒ°@ÙÂ.nx^c`‡ÿÿÿp1€ó‡ÕÆ ,°lÈû ‡U80;npø®òØÀáR‘N‚Ãã)«8p ÞàpøAó‡iF•ó|› œ–w8\O™ôÀáºYNÃ%…# eÝ Vq+@ÿÿÿð@ @à@U™à@à@@ªfà@á’â°@¡(Ð@û’q@i90@qÊUÐ@…a)Ð@aðAÐ@Ë<@Ï&Á@¡SÄ@k²Ip@ë›60@ib0@;8EÐ@ÿÿÿð@@ð@ªÌð@ð@@U3ð@ðÉqP@ÀД`@ýÉ8À@´œ‹@¸å*à@°”à@°ø à@匞@@ç“`À@Щâ@@µÙ$°@õÍ›@´ˆ1@œ"ànx^c`‡ÿÿÿph±€DChZ”–]5³ýƒÃ” 2¼ êžÌIp¸åçÚàS4µÀ!1«À!¢F À¡è˜¿‚CñÉ !n½™àðëÙÙ‡[. ~ç z=+>nx^c`‡ÿÿÿpP±008ˆF΃²À²¯–%~pØ'©§àpCJ¨ÁaþNu³É®Ë, p¸&4Ááš<‹€Ãœ“8Ìù”#à0KÔÆÁ¡l·Ê»›Ì&²)8\ÞܸP&Ùnx^c`‡ÿÿÿpà±*@kXz„–ýµrFÃú6ï3¶–éï<8ô.yàPz\3À¡L(VÚ~ÁA]'åƒCºÍlµV‡Øu'ú×å\*vlp(yóP»õ'önx^c`‡ÿÿÿp`±ä@cèÌXöߪ4퇓8ô6.Tpü=©À!9ÓRÀ!¶ðT€ÃÜÖDÙÄ'OK8HžW;àà¹0ø€ÃôìMɯg8(g $8ÄZ[8 %Ënx^c`‡ÿÿÿp`h²ØADChZ„–­_5³Á¡ëGʇŠÇêžLpˆ¸åçàS4Áayb„ƒ{D€Ã§¢clÅ'78e„|pP½õf‚Ã_Ï8tÜrp÷;'Q>*¨nx^c`‡ÿÿÿp`P²‰¢‘ ,°¬ü«e öI*8hÜp(œ¿SÁAÌlò‡Ðë2 4o„ 88^“gp°™³q‚ÃÁ9ŸŽÌ5pð,Û­à`f·sƒC’ÙD×Ë›Í:'3nx^c`‡ÿÿÿp`h²*€D({[„–]õ£r‚àbR5—&8¨²48h=a(p(-lp°³[vÀ!]]åƒÃÿ\wÕ@Á…† '8¨­ 7p`òdgpøÉà` Ä0k"ùnx^c`‡ÿÿÿp`p²l€„Vóa ,{µÆæ€CÀ î£)—685q88L-b0p°Ú½â€ƒ¼|p‚ÃæÉ“ ê·-žà ´¢ãÃŽ8LY=ÁQ¥¹Áá·N³‚à A’Ÿ&Înx^c`‡ÿÿÿp`²øÄ©@X`YÓx~‡)VLÎ,5YàÀ² IÀáiLƒߺWíǯ\pxóäɇø·+8´¬R2pÐS31pH¹ªõÀÁSáÃ¾Ó ÔXÜ%'¬@ÿÿÿð@@À@2¨<0@À@@ÍWÃÀ@e€°@³)M @A( €@9W @뺀@añõ0@{99 @—ûj0@á*ˆ€@ˉ@™5J°@€H0@/²È0@I@ÿÿÿð@@ð@̪@ð@@3Uðð@ÙC  @¬ÊS@@J @UÈ@0êî @Ø|}@@žÎN@@åþÚ€@8J¢ @2âc@@æMR @à’@Ëì²@`Dnx^c`‡ÿÿÿpÒ@È`Ãà`¬Õ|ÂËž¹Zcà°-àƒƒ¶Ñ” -BM ÌS‹z¬v/p0“—pPßœYeeùC?80Ýt^à`²æT€C“€ƒC_è‡W¯8\¹QSàðdÞ9‡Oÿ]pP²ðª3z”à õÌ7ÀAáË…Óo688%8_È*@nx^c`‡ÿÿÿp2 *ÒB ,°lûÌUs^p˜–ªààÈ¡ÊààÀ®õÀ¡T¢´ÀáUŽC‘º‚Õ¢ÿ ‚2ªR’…S‹Õ8L(`rp˜ú-ÀAÓ@i…"ê@ÿÿÿð@ @à@•@@à@@áæj°@@[(p@¦•™@@B @@ʰ@ÝFP@ú›€@œ“ÙÀ@µ¿Ð@DG P@Ɔ\@@¥\É @$@d}@ˆLnx^c`‡ÿÿÿph±*@{[j„–ýQ9kñSšKÓXšž0-p(lp°[vøƒºÊ·‡\wý‚‡ NpXn”ààÉΠàÉŸà Ä0™}l#nx^c`‡ÿÿÿpP±ä@„ãÙXvŸ\Ú‡ÖM ^™‘Y&8ìdYà{%ñ‚CÿÊ Nž´àp;ðô‡—‚ >©V…ž™à0ÉñƒÃ4Çé8T­R(±nx^c`‡ÿÿÿpà±Ø€D@EZ„–]ß>sƒ,c· Ya Ž ëØÂK% ¿Ê1p(*òOpøv¥èƒC¨ Œ‚ƒ°”dCÖÔb•  ©R?80)p¤!únx^c`‡ÿÿÿp`±‰9É XvõÃg íÑ S–Mà0EÀ (6ñ€ÃÕ»n?~Ífp˜3gò‡¿[e68Luqgp8r¬-ÀaÖÒ˜œ*2 7S$ t09>(„°x^c`€‡ÿàÀÀÀä2i† üάâZsž·©ç7ýlðßé¦ózžé¢&kNÅðrº94 xñß™ÜãÐÀzÚóÄF‡W¯^÷­s¸r£¦F›ÓÏáɼsÞüM|+žþ»qò‰ƒ’…׺J3£G¹\óT´žùFÇNòvPxÀ2?ææF…Óov{4 :8%xÞ<¤Aö°x^c`€‡ÿàÀÀÀä2iÆ rg†ˆFÎc„óaêåÒV¿Z–øÏuS»Ÿ¤ž¶Cfä”RB½, SäwªK:0Ȭž6yb²Ã•Ä«×e–Æ:¬ÜðãG˜Ð\‡“¶s¦É³È:žþ»gãä“.S}>åH:d¤9%jãézfÖ²Ý*ÓpêíÜœìà8ýfÚD6e‡•Í›[bÕAp°x^c`€‡ÿàÀä±ã9 "'91t&œS¿úá³Ä«ÒÚ¢õ´Nr˜²lê¤ÞÆ…SœØ%OrX=ñ`r¦¥ÃÕ»n¢±…§~üšÍ4·5ÑaΜÉWd?8üÝ*³ùäiI‡©.î<’çÕŽk‹ñ\ì0kiÌ‘éÙ›8Ud˜“_Ïv¸™"Y¦œ)àp ƒÉ%ÖÚ"iB«°x^c`€‡ÿàÀä±{C¨H‹` K‡óaê×·Ï\þkå YÆœëÛ¼‚f…e™±µ88r褿ótXçÀ®Ú»ä‰Cx©DiéqM‡Ç¯r¬ÊD[ŠŠüJÛ:|»Rô_]'Å!TPF!Ýf¶ƒ°”d¡Z«¿CÖÔb¥Øu'T&ðö¯ËqHú£w‰£“§aÉ›‡m=§°x^c`€‡ÿà ä±ƒã íøpf€hä<8¦~Ÿ\ÚúWËJX75í“ÔsðÊŒœqCJÈÁ‘Eaâüê;d–™Mžè{%ñêu™¥ý+7ü¼&äpò¤íÄkò,·Oÿ™³q²CˆKÁÄ9Ÿr|2R̵qXzffÙn‡IŽØìvnv˜æ8ý’ÙD6Ž•£—7·à"D@°x^c`€‡ÿàÐä±C;ˆfoK M«€óaêTÎZ¿jf»Ã±SR?Rv8h.M NÈðr`h «{2Çá CÑŠ[~®åíá1ESì–~žáå ®ò­<¢FÀ!×]ÿSÑ1‡@ÁCaÅ'78.œ.”òÑae¸Qê­7“<Ù4~=;ëÉŸqËEÂA‰a2»ß9A Av°x^c`€‡ÿàd+øää$§:†Î|çÃÔ?|–µoUš¼ƒC´FõÃI–MéÛ¸PÃAÀ‰Óó÷¤B‡ Œ§6gZŠ9Üu“-<êðk6ok¢¦ÃœÉ7Ï&~ptØ*³ÿæiIwÎÈój޵Åx. >â°4æäòìMž*2 “_Ï6sH‘¬œ)äÐÁäÃkmá à@˰x^c`€‡ÿàdw€ø  ìi¡¬aé p>L}ûÌU¿VΨw`ÌYx¿Í»ËaVXª[ËbGUöwžÇصÞ.yáP*QZz\3ÜáUŽ™hËr‡"ÿtÕöƒìWŠþ§ë¤|r”Q ·™Íæ %YhÖê/ä0µXmíº“ª ˜ü×åÜp˜ú-v‰c‡ƒ§Ê›‡âÚ¾>°x^c`€‡ÿàÀÀÀä²iæ 6‡VXm¶a‚óaêmΆõ9ü×;•¯Ç(&ÜáÒfMUiG ý"?cËp]u¥c+¯ÞgéµË!8ñã‡5ªÖ“ª-mì8¬Oÿ™¬>Ù¡ã¡Vç“ÆNw¶hULvX=ÓÔ·ÌSÏ¡¹AÈ·8í¸C³þ¦³JpÁù0õŸMãYù¿:èN±b8Yïàuf©Á…)9Š, zOZœw`xÓ2§[Úa1ߺOµ^;ø¶¿´aÊÏ7OüPxíÐÿviÏLý™«5&gì¯:l xÁ¬z´ÆAÛhÊe§À -BMì*혧1éä:ôXí^9°x^c`€‡ÿàÀ ä 080ðé §|8ók œSoÏoÌÿ5ØaŠÓÍÂx‡3KMLÉáu`YÐ$iqþŽÃÓ˜žniO¾u¯Lµ^÷9´¿raÊm‡7OžÌPxÍïÿvÅ›y~-«”ŒÎU:è©™X>òårH¹ªõRew¬ƒ§ÂÛÙò1ûN+œ0”öpPcqQzy&B2°x^c`€‡ÿàÀàâ¡ ó­æÃÆ´6Ãù0õWklÎØ_õqxÁz´ÆÈÁhÊ¥ML„š8\Û9L-b0ÒÉUw°Ú½âÈêu–òòÁIÁÖ8lž<© yCý¶Å“*-“„Vt¼m¶|â°cÆ…ã&Z“CVO™ô¶ÌQ¥¹-§¶Øá·N³Â‘\%‡‚ ÝËÓÎBb°x^c`€‡ÿàÀÐä5080T00°éPö¶ô†Ð48¦~ÕÊõ«f:,¼ vºëGŠCªæÒ”Å ª,Çêž8h=a(‰¸åçPZØSä`g·ìÈòćtu•ì5ÿsÝU>sP <ÍV|Ò¡Ðpá|¡Œµ•á–ª·Þ80y²óÜøõÌá[$[`Ç-%†‰â~ç ½A xxxxЀà@`@Ð@@@ @€@Ð@€@ @ð€°@ @à@@Ð@ð@°xxxx@ÀЀ@@@€@ @Ð@0@@ @@@ð@`@ @@°@0@à@P+x^c¬– L Œ Y `zPtP¬,“ É0x^c¬…Æ8\²@"€dƒƒ˜àPà`šc·xxxxpÀ@`@à@p@@@ð@€@ð@@@À@°@P@ @0@`@ @Àxxxx €Ð@@0@à@ €Ð@P@ð@ @@@@€à@`@@@p@Ð@€xxxxð€P@Ð@ð@@@p@°@p@@À@°€À@ @à@Ð@@0xxxxàÀÐ@@@@à@À@0@Ð@P@ð@°@€@ð@P@`@Ð@0@ð@0@°‹x^c¬ Xnܸ½§ñîÝÛ;ªæœ°vк°×Aét`½HÆA°å ªÃRýt'‡wW/;øñ¾}çpòÈçk[Ö¹99pî×0pðÞwïµÃɨ7N;´§Oq¨:¿@Ýá’/ßd»³ÿÌtÂõW;TMŠ>±C@x^c`‡ÿ`àá`¬ "(×Êc=¼„KœÃ!Ôñcü~F‡ ÓXC90,ŒŸÊáp ,D+œÙA „1ô*ÃѦ S—;Lýþ_”ɡՙiU-“ÃçÏW§r;4ˆ2p]_åpaõ׽ܬӸCcÄWpý_+¦0@@€”@T@@<@¸@@@@¸@(@ @0@Ð@”@8@@à@0@@@@˜@P@@0@d@@L@à@d@¬@l@„@ì@Ä@@@@D@Ì@@€Ð@„@@¨@t@ì@˜@@@t@ä@@@4@|@€@<@ô@@@D@˜@<@@@4@D@|@ø@Ø@@p@t@è@ô@|@H@ @è@@@ @œ@t@@4@@x@P@Œ@Ä@4@\@`@@H@<@ˆ@ô@ @@€@@$@\@@Œ@”@8@t@è@|@,@@@@4@Ä@ @H@x@@€À@„@@¸@@@Ô@t@H@@@Ü@(@(@D@”@@ @L@@@@@@h@@Œ@t@@ð@À@¸@|@(@Ä@ô@4@@@À@Ô@¸šx^c`ÅÁÀ¤:\¸™Òg{.uȽk'* SÒ÷â¬Üb~‡RÎÓkyÂÁóÜ7¸;|¼R—rÔá Þâz,;Ù?ÞpËs¨/:+{딃ƂéÅÓ;Y0£DÃÇá«`û ¹/fÁA_î¤:8äø×~ès8`ðÈ‹…ÕáªÉ^…/;ÄW¼¾sÊ82‹x^c¬ XÞ/×ñm`|ý¯Ã}†˜»®f[î9Ì}'2Í$ãppÁ‰Ë›—•®ÇÜpˆþ‘jëð}ýC‡’QJ=‡ý~ó<ûïÍݘíóÔJËáVRä<;çŒË"m .•¾wØÜc Ãr@‘x^%=‘Å0 „s3[¸¸"T¸x Á !\^†`†`†pŸü2cE?»ÒJ?|z•Â¥SU7öQ¼’¦2ùÁ«d²5]ü52“J¶¤¨EÜÀFjYÍS7¶à= ›ßšŽÐUC´»ìڃי±ì¦“s:¸¤7TX5cs¹¦øù*p¶Ç9Fj³½Ó庬ï-Ànf¥ßB碙㺞kÏDÞ©íÉ·ªMÐO§ß{éFEÿm[Ù ò´Ûo5°É÷•à "¸s_!ª¿Î$ëèf¾™kð› t¡ÅÜúuý~W•þ*ýa*x^-M±Ä „yU}às@€€w@Ç=FB$D€„Hˆ„ý†ÚT…0韙¿ŠÞ8/e=ºþ§†šº’‚^7u­øF:AM«œ‹{‹'}·šåXѨ0Ø2^ô’óÁ Ö¨ =$ÁH–ÁÎìÁ7ë°“îs<àžhò-Ï]9ÙÜiº®×à$»ãà>`T¾]Ù¸§É`žeà¾s;Ûge"ó)ÕbçF¦Ó3åíÔaò—,g—Ï¥ó?$Å! ¬‚-ÐSŠ%¢‹Z §€$‰vß`Sy‹ÎëØt™ÌD®`س6ÕÑÞ7c¶CÝÑç)ÚÞŽ î Yf|Ø:YÛ§Øo÷ÞxôIWøq gWè’ÌF\-ô|»‹¾ ¶tO+n-ìúà]*h¶"M£ú¦ ìY¶ê£ÓŸÛÜEEϵœµË‚÷Ù¢Ss/¼©Õý‚ƒû¤×ãú*Oc x^-9‘Ä0D5U8‚ †`‚à A AÁ Áöµf§Êãï¾þñù姬¾E5íºu©kü<[Ñܪ^YÍQ/ô}c>…3?üÃkèÊüú –jLí[q½#u8 ¦ïÈwflõsÏ%ÓñwMfx^A­! „yÉ8" $ a%¬$ìñ‘€$  +a% áÿ I:N§ýûçikÆWEMKAS½f~¯>*—¢æNuƒ^ʱiØÒ+YЭçµo]q‘¢ÙD!ñs®A·ÀJLYqÚ¦2•ÑÙÔ_ØËihT°J­)™Ïužw»K&Ú€¿‰@>áMx‰úCîÝ…æÛR`nxù¸ª ËeŸP|[0#‡hGË'gKì|—èjî?zÞ³Ý}nÑpUÉø'¿)»±µ_ÅõúAð`ä—ΓÇ·YbÊ…x^%AÄ E»3ÿÃ* $T* =î±€„J@B%  ûÒ2“|’ÇŸKC»•oÕª©V.5mvÙI6üTUV²Œ:‰¯ºµ(õ‹ŠO%ĉš¤KZ·¡® =úš_Üdò¢ Õ¨÷R§oG9¡eèõ:YtÛŽƒè²J8ú°6^(œ)Ü{ƒ1at²‚†SFÜÇ+«qã=& ;ÙT¦o<^vΘ‚õ`Wê²"k¾ò¯Ë›3kúÛót[BGÌþ“Å”ð»²OòÎpîîèƒôLÿ6ßaJ¶x^…Ï}3ÛpY¾Ö´Ýæ¡l~±Z‰§Fz½1T[‡­fêZOkËÕ\«ÎCê虇[Uµ©‡h”¢TÄ21ê©°N¬5£„.˜‡\CHÅÎlSûc/`Ÿwð!]ý˜œœCé¦þÒÀ*~Ô!SþÐcvÑq\mÝ÷é/píÙf<Ú„žáº3žðªwä@0å,†~Ænøí#¯Dg§Ð»a¡E´2|Â’ëø‘Ëß"˜…tJ§PN<°„$ë( ±ûÆs¡N7Ü@–í™4xèÚ}…óî_è‰ ’Rž9@lq'Yý›ÛeDáŽ:;GxæÀLýÛKý¶|œJ”5"À&UC°ö´àhb|F;d]¨,Ìr„kâÛŸ°$^lF^Ž)…‹sQdcð-†Ã^ÿ0F¾™è x^•T;O" †Ã‡Of ÔÄL¢ `±66D×ÐØˆ.ÃË]°ÙD¡ÐÆä‹‘eÔÐØh!˜Ðø…Aeãc”ØÐh¡˜Ø@c‚X*>Áù¦ÙðÝæ47÷Þsî¹Wòïÿ Œ5ǼoK®-ð0ñÏ{¼¦t +Ôã—r¥3¿]YãÙ€Æ-dâ?`$ü3«ôžP?éuŒDA\…+i“qo¸i’æÝC˜åM1dËïƒ:$_W:rC¼@@µ±|ëŸû8;zDF÷$ã)Ú¥®’%‹0*?²ä4S3i1][ž@Y&>· á£m¹W¤òƒtëÈrdÀçBáä¥ÔóïA.­mí8 ·1?à‹>iš~žc˜×mæ5„¦g„„:ža hnZ?-Gá‹ãð,¡w'èH“pßÁÑ튶âÄXìµÓR Çáë×Ã7\ïÛdì ( •ѽâ4]¦˜G,\¬NzvÄ*&ÍÒ*†ÍŒiÆNû/Ì p[B¼Ž»"ÓC[²ä¢`ÜÂ{»Y­3ø‚‰}|ßãíàîH=(µsá`寺+ìc¶Á‰~ÕV§W‚ñ@Ìe°÷i÷-}"ÔËùÕ¤t+úƒMø h»8’š´h\ÎUª’u+èoÑ$fÞøÂÍžuôÈK¾U¸ÙpkW “œ4;ú†Âm¡¥w­ÜëWk„¡Ü܆Œ5ë»Â ôæ/Ÿuôœ¡&TÀÅm5“0ʰ>)Á)1”!¬ÐF…›éN¨”>Œ|¹ÔŸ¶"O|ܨkPLž "£±Þt»èŒ4f4 Àd"œ6ï÷ü"F߯®^ e{ÊêI ‰a©Pê©GBJ]ï;qYÙ¢–äðTu¸´ÁB.ÄJ`“G1Ü™;XÂB“T%¿ *¸£ïèg¥¼®‚T¯%2eG©ÝúþI&Ê.0é–¹ørÖ³Ûmh?ßCRüsKÓ3²îâxÐJšbãeG#òÔÝjÔÖ3!Œ³¥]Ë# ±Òp{ ,3”É;aÈÉ~*0¨³ªŸØÍ ezvpß#¿ì]§ç¤razZ6ææ_¡w×ø•f¼KK\­(«IÖôÏrì] …¤e×í‚  kfh¹³u¤m¸l¬˜N>è¾»Úk±ƒ¾ÛÁÍÚàóÊïcõø][ÖGá¶XK3 ÊŽÐì´ñ‡ù+ Õð¼|Q‹N†ŒxVÐÚãâËe:¥âÍ/âdŽˆNÀ¼ÆÖ$qŸ|))º%Œ2ÓçÓW¥ i*KÔˆ7M.ë \3ŠPCçùgŽ¡}z´Ž”àSÕµ,1(,*ŽD³SiƸ¸…Ö«Ÿ½Q¢ N#R™YÑ‹b±‚­™_Âá&,ÅélX?*§ÏŽÉ£Q )òQP¹p®ÛÒ6 ˜ÌÉÏzë! ÖQ’:ü:±ûºKø•_íß—«ôR´ªˆOWE>üYùª¾ˆ>cc‘þ$ 7Wœ8ÜFŸÊzî–aoŸ·( %63WOð÷ü:$A±/‚a ™ÛÏÀ7L'ÔçÎD_Ríq4OÕµ© Vú·YŒLb¸}3ÛU ͱ}Œ­Ãi{µq?±crnä'îã.þ@À²7â8X£Y6ÂxðœŸ|@ëïâp. ý¢c^\£ã·à8RÇø`¹P—h.Z³ó‰;–Ú:þpÈ4NÓÞ˜®™OzqË è]ÿ=+ôSnTó–K¼ÜoNB¾a6¨°5u ¥KçLR«ðˆ,l*©x^‘‘{BQ‡Ûó¼p!ƒA8‚A°?`paA0‚ \ƒAAA0‚ ‚`Á`ìÝÎyî9ç;ßïüÎû{Õûo<ÛßXòB• Ÿd‘Õ±å¼'}VŒØB”8“p¤¥jLƉE¬yàIÝ€L(Óˆeî)y*hS£U†¤®<ÛaámYô™ê}äF·‰½À0&|9ï=›sp½áu¯¦ô¸8nHc©ÓµÄ9o;³QEŠÜ:4å_E¨™ë³”ð KB+VúôÍîôÜóèØŠ™”{RwOæ›âÖ\Éj‹F]çµðÓ«-Ã\‚.Õø6j[ÑØÜše³ù®uîTu/qQ1ô]FF]é{$1õý*¬U­"WQ‹¢à&S9ðkL~D¯or©x^xBa‡Ûó¼Ap  ‚`Ap!‚`ƒ`ƒAƒ ƒ`AA„A ƒ½u¿ç~÷;ç÷ýþœûп?¬\ìy"¥É•u¬k)Eœ˜1§$öÍ0Šœ©YÕ™åÀ,æ|²‘ŸÚûaH›ˆ«ÕÑÕ¡Ê…w9­hŠ¬Ø©Þ¡+»¯KI·ºxbï"ÆR½#=ßÁ]ÍÅŠHj}Öy%¿E#¦,ùbä½G;Uï#q1•öŽäÉÆ znõ¹wMœÄ/MYóæ [÷LÀ‚²Œ¶J5uúœc|›Oí“ß™&îñjÖȫʮ°<Ïž›êTõé2f{Â{SÌÍ”sÊB”Ewf«ûDzb'JqRi©úL~N~ÂDß[¶®uM~ÁsùoWqŽ¥x^XCa†ëy^¸p!‚ ƒ` ƒÁ ‚A0¸à Á…Á Á` ‚ A0 ‚A0‚ ‚ ƒAÐût8çÿÏ÷½çœ{XüÜxÚ¤ éóÅi¤Ý”3F<°!3᎟˜ZŸÓð=5>Òä&³ä”wö,¬iEÁLç7+r®9§¢=}K:ҟͦI+zLeìÈì²×›J»{eR›v-Å/ ôÌhñá4—<ÇÄø­cC­º´K+Î9’e¿S¹9ý“=Ãä@ýVç€7ŽãÕ,ãUÅ—YÇç²*»-ä—²jwÛÆ˜OK.¼O¤çœÄõ–º…37XÓvÓDڿƹ³©"‘Z»!¿RuÏYì¤/ô¯¤7Ô>ŽÛÔ²½ûÏ­¯£T“»Õµ/[§Z“üg„f:©x^ŸŸÂpÇw¯×‚ƒ`<A ‚ƒ/Ap88è‚AAp ‚ Á`ƒÁà ÁÁÁð ¸wm¯½öüúüxž—ùóÑ™÷¨¾ 5ÖVΜsªÉB½ÉÓ@#¾Â 9}ª£R©Nê1¿·ŠÞF*7Ít'ÍñÿÕ¡QRé5-‚?# Õ‚c®­=¼¾èUikÝ3Ü)*^µPiWð\pRà*Pf%¸7Åjâgª‘ÅhxZQ›¨«„Nd¸s m}é‡þØ ;¸^á(fî[ øj­ueê:ÖA>X_¢>~nöÁæ¹ípW‘·Ph£¿TÏ2ü¾9fbxC°° ®)»ÎØf 6±'Jè…x©5àuÙþÎü‰ÞÆÚT n·I•ý2¯l–¥x^tÃ`…Ïι( …Â`0(…@aP( …A P‚ƒB¡P ƒÂ P ƒ@! B P úeyçÏyÿ{÷Ý{ÿw·øÿ4#v/ÚëAý@UŠtÒ“³ÑA¥Åtyz䦒ëÇBmUs7ÎZKò¡½*ѳúY)…§Omìt4‚ÍU  G˜L…®z‡-_ÛR`æšRé©Mßµ9ýùèÕº'fêX÷QŸøIÒ/µ² ª‘VÊxEr©‹AÃY¢“¢ZÑûhùD¦µðyR§É™ô@8V‘çúÒ7ê”ÞÐ2érBëk`{6ÖÕ8îj@½eSð1.vÊ1½5\ã¸æE ü;^{Õ8os6Üs|{l aÿ]ò ®1»¸ÜC"oºï x^•Ðù;Ô ÇñQÛäV;™ê‹œ*µŽIÒl*b#S‰P¤\aI¦E¤ljY¢béÔ ;j3‘‡æ)×бŒ‘d˜Å8Š,ÍîóìÓ°ï_^¿¿åbþg8±lüD—oTÔß¼T7׺ÏÜ:9¸v)$É”ø}‘ùð°íèFÇX0 •õÞöÃÒ3ùñö;H"ù+7À¨§É—}Á€ÆÒá`_D†ps(åÍ ç<½S¹‘D;%˜ŠëHÈYÃ)”ø£N,iy2‰^»òÏT‰D+…÷ ¨•’< `­¦@òêË΢y)6ìTœ+ƒB«Ø|xóKŠlJQÇu`&ø¢µ½z`»ÞfW¨Ç"ï4²cqCç–m=F'½ÎAñðøPA<´zŠÒ,×@±°¬RS—_T>.HÆ…©bVß;ŒÒ< 9YذÈ/º‡`.zúB\Â/"#™\~¯1 +ãÌÝš­ç1[I¥$Obƒ“K‹Ík{Mã~C_hHµjÖ9%°w¤Ø' ˜º9…žg^7|$ãÛÊaPÿ)TVPÙ¬±7DÇö›_EÎ;ü±+v ¹±ƒ•¡ºÖÿÒ“¢o“_å+ÆOw@ÇŒ^^˜­´}õ»Þ@ðþFä)L1Ü–óÿD±îþ[ #Hˆ9–ð5Ú´ËXSƈ;]±P‰ÑƒÒÜÞsDªüÒ­Ž˜_43’ð^j¾ Bª13óÚ¨‡Û‰ˆ/WŠ=ØØÜ^üfÔÍE#$4gÈMFhì$еˆSgUŒõTÀ:Vv»º•E£ä`Ãc„±½Pò7ÝLŠ¿*Æ¥c©íø×/,åÉèùŠ8ÞéÁvƒ¡ÄžÊ ^ÓʹäQÌôIgÿ奰TM4ŒšG%\½jÍŸ‘ÑÄxÈXÌ< `šLA“ŠRšªÈ=œJ) 2õÈ-.„?½½íŒ>®ót¿žéÅé…Æ;ôq‘ÒñGc4øW„’ãÉØ—ÜqvÄ‚òÄGmFX5æPM„t&R„$óîvCY×4û[qÜжFOˆzCó‡Sn6âßÏÀC5¢dtg¦r2ð¹ÊìͧpT•äfjgBIÙ’¬hŒÙGÓÓ »Ê»¼=±àuâ|Òq:Ûõ§½©x`RŽÁ^Ø-™hËcâë¨_˜oìÜÆÛ`÷ËԾܓà»û…I“qy–td"‹ð¢­¤p1Èß`Eÿ€÷:]I4¬Ng²ì4ДÖåÙIEv“IG"ëR[?~Ý]†nì²*<+88‚| n¡ç 1¤·Ñ—ü-Ý'ÒЪºìM7žò[‚öÆâ¹¹µÒdîZL §©0ŠÕ‰À¨ß‚JÞ!Ïâ„ߊ“ÈÒÝd•¹Žp _ÉHá!šºÂz´§¨\'3DçU‡64#øÈ¶ h*}t¿á³\[mPöÀ4f¥½òÏ @«â˜«ñÎ s:6ifÓù^XíÎ þ9*‚l¦!†T»oºéÂ*<+aK',|tÄ;cñãê·/ÕXd¨Ñš%_qL& âH W"Hoç}¡3⵩‘" ºš«’ØËQ^]c?MEsÿˆ)¿Í| i—:¾ëv ÿ´W«›6}À-='Ùa1ÆØ=/Yý´¾›W:ð*ýëPÜ¢RR6þ{W¡õúÇÐÄ\¨jÆ~óZ{BѱeÓKLˆ2Š?òÿ1Ÿý¶x^…Ï‹7ÕÀqå+‘^¬lõ+v)«qݤ(y¬ÕZœ•¸[jn¡µ]ç¦ÅñZBq¸…pÜlíÜä^š^s׃…^Óeªqëf·ØÎþ}þƒÏ¸oþΡDÔå OŒ[?sÑÉüØZGag—ÓjËž`PUQi|deÒ㫨7÷¥Jä)C’{}K Í.\.’M¢Úæï·dÈvW +|Cï§Z®q“ßaÑNà¾[ݸM•âlï5‚¿¢+€’”3z†â.Má¸Oél’êEBáéZ:6YbºK÷ˆ•«Å&ø7Í‹e™âY Z}G ïݷډ錀SĽ,‰FÁÉ\%Fz4t»Ê¦­‡z×Bœ]GY`ÃfìRMº9盌—eÖ}ÁàØO«É òá§hËÌhUþy’¥û5ƒÈǽ(@uÛޚׄŒÿæÂÙËR)¶ŽšÝÕàñá‘ļ?#?ŸâBN¿¶Y@¡b–7Š.‘„I{Ϻ 6{æzqFØ!š;º_fäÉÇ‹EMœéó“¹xcs¶-»H€&G‚¶ÜZ0+8¹` Í\Ž'ÇÊìh¯LÇÄLËñ }±çln+õ¥lø(/‹'#[„%Û²Ôp¢_M}y jÍA Ù/=ê˜ß{q;Çh”r'øý«&ȹ18j/œOù¹—cK–ã[rê­}ݶ\9ä=Ä—«‚eø ሠÞ(] oÑœº{ +í¶°e²câ ­œ’ÏÚÇ Ó÷Ò…¥Qþ)Vfé¬Ù`™Cec‰ïŒ£vÓ™êJÅôW‰„þèxxá*aÓS%J©¼‡ÔçûÍ‘ É&6-MJÓ÷5 \[8¿´á|ë_SͯÑÞùÂF'Ÿz+=9ÿ²öFÓ‡YQ½3×½ê0\&§§: ¹ñÄø¶U k—?¼Gˆ$² í@Y9³Wï°äÅö #²&Ö½!Q¹"‚ÜDwk¢‡Ê[…lÿ@˜©©ý‡Î­èdhþ²ˆ$*ìr?m9‰:NimU4ô´~²<ÂÍÞþ޵µx^=‘1‘Å0 Dóg¶p™Rņ†WBÊ+Á Á ! Áîɹ¹Ì$’VÒjgóùáÑ£C‘÷RÑ®©¦Mó;QG%Ħm„ÄÄ ~ X·C÷ÊÕ6òal§¼3‰»2±Øn˜›*³Þy4­€dتËoÐ;,Óoz`+aЯ֖B0ÞžPì&/°Oö’z@¹õ¶ÊwÀиÐÙIrÎA§8ƒEò Òé¼z²Nî–¥d,i©© U-¼JÝœ²Ê W噼°µáSð»îW‹6ÿøêbt—ðÀp3¼ªÆòÍ+gGÓ®笆‡ÜÿËãôìÅepþ«x^1±!D¹ª 7$Ø + øˆ„“€„•€$  ÷š­šéén>ÿ|–lÛeÍw?¬Úcõ¯Û²a_öÛÅ…hÛ «T;Œ&k·—ûË ØË…etÒUÀ3mÜ ^¡4­ŸÙ5NÑ'ðs1Á…Æ~£ê@æ5BBqÍÊM£«Z Ž¼æ£­ ¯•p±’®\Nî¾áµîÅOGCʉ>iÉ{Á[¦ð~Ög›< ë$Œ~}<*#:½]Í+O Wïñ¥ü Ìfæ¤Í/Lä%ñèR¦Ë+1¯vGørìè”Çt+ÿs¸Û†×©üôanN­x^-½‘Ä …Ù\Hà€(\À”àpC—@ .Á%P%P‚KØïéngƒô~¤÷úð³aG¬Ö­Å`·¶~/{¬Ú´ÝJ<éì[¶»bç\–©ç4½wþàì0fzxŸ0µ_j%휓jÓéôXi0ÝÆ›•ÈÂçØNîÃ=èîß•˜‡ûÍ9Pxü5S‘•úïÖ¨–4Lò+»Þʯ¿ý‚¸àô­îT@54‚íéðûíºbVöºÝйœ­D@gí­$¥Aš[£?ùkÍt1ù‰QÞàRö\ä<3eÕIB;hse© ªå/Æ l>¯x^-±Å0 Cs€ ¿H©âÁ#d„”Wf—¿ôÁ#xà2‚G¸Gß` E‰ÔχÏ+–©Éõ²nßLí`ÅNká±hå=C²ôPšæâw::u³úÊ~Úm ]·"ÊêNذ3l¨nèn6%^‘†^´qm¼@v‹lí™{ƒ6jej„Íï?¿R8l÷¹f<+nB¶é®èÕŽ‡×”²ü¤•£(©o¨§¶® $SþÓs¿}ßZ\·¨K;©' “ÙuÉAP¢ÎTXW¿?`º@ÖWòíÕLÉoºüéFúÿ»$3/hÓ ÷rYÿ¶\jN±x^%=±!„çª& $$Ø HX xÁJ |!p€$  ÷ »U°óÓ3ÝôçŸO‹6Í*:u}µ?zRÏy¸o²¾§?4‚ìÔò2ygà vœ¢;¼•AGÎü0–ϼ¸ÄLa~ë6]Õæ…zå_ƒ€OGÃ`S9˜ª®ÃÜÁÍ£­j7âÂvï6øuUâ¬Éuzt.¢£dr:;k4¾FÞÙ™©šv 7·?šMc¢[á½ÕüWuºbó¡_ ̃¥Æ‰8äµ @œá#û2ˆhŽ2ùÍoö«•*ot‹š½å}‡ùko‘+Á7œ9ÐÕXçxôgn¹x^-=‘!„yUn8Á °V ¸`%^ˆ$  HX H@Â}MU0=ÓÍ|~9Ö¬[°ÃŠM{íÂk?Ïö‚öðÞ©Ù²Lî&ûp}ÉVõÁÌi ²«÷y÷w&¼V}Àpý£SrltçX7Ï•­ÚôSjâE,5ZvE!*•ÜA÷€cuKðËf _.“” &½èÛHôì¬þxãþ⋹¢¦’i¼Å×F­=;cˆŽöd%jCik_iQ½ì}œÙü¦¯l¦K±é/ËÕ!e=Ú“ø‚w¢´ýIe5Tõ¸¢¸¥rÐßàžü¸ó>¦.)ø+s.¹x^½‘Å „ýf*¸€(^¸ )Á%¸—@ ”@ .á¾3ühY­Vúü±ìµÇšÖÙ'Q³ËÊïÍû°eÛ¾`Š^/iwYæÞ¼N¯6ˆªMv&cÂo +=(V+Äh÷‰ÊEÖ„wònèQ·€×àUþš_¨ÎØ|ñÑöo(<áXŽ:NŠÄ;){ )·ógÄÿ¶Œciß°žèè†!ç:__`tìÉ=A‡¿T›à9ݨ ¸ÝUm€œªŸ©Ý@Ä/ñHS.}Ë qá>ÓŠiä˜Ä"[½¨G\2£KsøRtìrváOóÙ0r*.gß$¦T‹Õ’mê±x^%±‘Å Dýg\@¨àJp ”@x¡K ü!%PÂ/Á%¸J Jøo9ÏȈÕjYéõæ³i% »8« {ÈÆY8í¶Q­ƒ?¬Ø)`‘£#û¢þØ ÍNtºžà›v 6Š~ÑsˆÃ­vjÃcøçTj}+Vú3>*ü‡Þ~¡ÃMýùE'ú ç“÷ð‡Âr哎hòÓ7ZP”ŸÈ]ó ÚüæÌ{:MÖCâM›aÊ“pu%öDêkdçv÷¸¶£} 4õR†Q=â }‚ îtM“Pê°õ/¡þ^{ÏÈÚƒ¶áBÒžZ{îéMš$Œíýü¹€pޤ x^…Ћ7ÕÀqæ+Z‰ÂñÓ¬J¥ë5Rtj‘‰•©4KÔŠVé`ëÁÖ]ÔŠFÈ£Œ–K©ÛÊãʰBJGÜâ¶*tc*e;gÿÀ>ÂGuïÿ µõ‘ŒîE}+‰›Y<Šx=n´ŸsÙžüaüÓ#¶<®û†®y£6¿[LÌÛLÑšÀÙ"îÅwsïÌ‘µ¤âMŽÜ¸-r¸#ú*/½L"([/—±Y1_e  aË̶¡\ð}7¡íùXW…}°Ø–dE”/·tãc!O`ÇûõI8(‰%Ìjÿa e$˰Üqä<é]ÎÃx…ºEWm©v3GÇzƒ+‡"*‰ÓÌS0ùâ– 2m¾îîÞìIReôqìÆ?–²9[^O{gukm¿÷Ãu£x­<Êõƒ'4׿ZëÝVŽh±W4òàñ‚aU¾:ÏÓÞ1&\ð%j[å^>aÓØÐK~¢É d—OË(l£I3ö8¯E –}—ù pV=!=¹4ÿ`XÉïî³ùµk£˜dÿÛy•0yáý'-y¼b±Ê%qB9ÚZÈÇ×vSW“èCªµ±„§:¡¤Û¤C]ÃìŒm3š™¨êuŸu“4ÛÙ]¶tH0¬JG¾GÉ㳌ªH«é»­¾•ˆÕvC™ô[:'Tf±PlçOËúèYXÎ\ì)ñ©%wZbNs¾žMY\m!ùƒÝjxþ3Qƒ®o?­ ®'Ï U–pÛ?*Hp–^\È­3Ëü8·=ûCçö¨à5c®.¶bu7ªûïâý„ ማڒ¼µqÖÒÒHAžbr‹$Û>ô«’^!êüì2>o›¥(3½j°j°î ±¡8”S 3è ./e¿Nã !4HÓ—çÚ· xè•*¥70@€¯Q/á–!¬°—ÜÞx•Ÿ7-AËÅ# »Ô³? YºÃ§qOã‹Hw3 ÓŸ90]é}ˆ¸ãM ÄgÛë˜Ój”NuÿV*vU%áð Phs­U20Ëͧ2SÖ¬­Ùˆ¢LKÀ$LZÈù/s~aÿ¨*/ÞÈ Zõ×3ûTV½p~àˆ>êK[œ°ðð0#QÃPÁ@y^ê*i;‰KÁ¥Ã/qK¤S«—""õ$ñBÙ¾Ô nå{ A”r[Q]¬ú 9R¤$9$íÉuÇ–sÁ¡™â‘ÇßÖqJ׊­ž£_>¬áÃÊ £¼yLWÆçõZ5'ÃB¾²à½Gñmp„—p›|òZÂÚ“wáì ^‚³Ë&”)‹±|ÇÉ0²í=3ƒ Dèž{Ü:ç7éGòX•¤P¬Ó.wÙ?ªâE½n‘5–´71J‘e4( ‰*„üÓÉÕ\=ª CBÚUx|„F€ ¢âY‘ È"d ’a?2à ¼w1µÉ²(j·®RkÍÝן úGô ËÅ÷V þëVôœßÌXüÒÏÙÀŸ¥V¸ŒÖÍ3EòÔæÅáÛ‹Âp8•Win‹0D ¯»]ç<€(E\ºÜ×åèVvêo Lœ(È{HL[ÜFá jƒ&ïÔfÀÖT›Ü©`Ô3ušoÑÞº•—‹Ê&dʨk€ÿÁHŽ)˜×¬§Ý!Téù=úÖáõ‡_†ð/O“„l/Ê¡Ê?æÖU8ñ›ôÇ`_,'g¢vsðè÷ú<&v¹Õä üÉÖñ÷lèë½WVr­«ü3Šglzp{T{ßNF _o}gnDx 2²ÒÅ£³ÁÙóu­Éyüyiéá ý¶™K6E¡?F[)H×5±!‡èhtÏb9ù˜qÏ€•%w:²ƒç)ì9ù¸o 72enP¥MS‚©é4Mõ{Ð9¸e#0ÎIbþ=£d¬{®ó= 'ÃÙÏmÚ>>!âá·Ï0I“ï#pyCæë¦›^ócñneÚð5/œ·Ã.,3 hº.Ç$ÍtzQ‚Ù`‰wGÐvQÝ"Ûw<|ë¶ÂL«Ä5²ùŸµL@©Ý³´¨³‡Ø°Ûõ]GZÎd£³HgC“Ré‡S'ƒÕÀ߯;Ä;ÛD6ŽÛ?Oü»ÙÿL§ÙLËx^-”Q†Ûs~x°°\XX‚ ‚pa!\‚ ‚``a ‚ ‚ ‚`a!‚ýš³ïœ÷Þ}÷¿ÿÿßwŸâz©ÒH=µ”*Q©» •V¶K½k¬ gW±Šô¬‘ 5$#rt§Tf=݈;Zòz¬‚=´Ê¿ºèE{îDWR«È¼êÅ•¬ÆrüR}‚Çô‘ë›Üìboà®@;Ź/Ïœ+M©ð>¨é:¶Qü^Lw¡›É·c­8¦öĹVî¦vVs©‡nD)êW› |¢§®ÇÞ€wí 39XgÎ$Lm²'&t‡¹ÃÛ'ª4¶•T„ðÎxFtÛåt¸À¹E& :ÂÚšÿ¯ºb¾j¿EÚ»Œú9ˆ¨»Á€ùx÷™¶ÇDÖüPxy¨oñHømÆÄ‰þ©zŠÑx^tÃpÅ»s. ƒÂƒA!0( …@ 0( À P(…B¡P … 0(ƒÁ …À`P(ý-9'ÿó¾î»÷¾‡¨þTh§¹ºš8ž4Tf™ŸéS½è¢+=W¥|•ö§©¾©v4¦ÓU[=m­¯¥ör˜\jÁ6_•ž­”¨J'­˜ ùoÌVJ4¢òÅvŽNÍ·"{¤¿VfK6ÕÙylKÕ¤ò¦X}ÞÀÖpǰÏÑêñÈ›€³ëX«pap”ÛN›ÚÙ^?ú€7¦{± ù„]5ˆ*â‘R‹4€õßÉ -!jÚºÚPU\!óN¯´7¯\ë87¸Zµ³ ¥\‰ àÌñ¸²#q‹ÍÈ]#” LúåŠ9îCöÌЕꀇx=EL—t ›¢ä¤3n› ‚ ‚ ‚……Áƒ AAAAÁBÁÂÂB A.„A A°_½wæÌÌÿßÿÞ;÷¥ÿü8ÒaD1m®‡qŭ@Ž;=j Xò™Ÿñdyuo± K)$ÔÒ+~H9QýÍ9däyã@“_*Ô½Y‡H¥: .2¿Ê¸Uq¦ò¤Õ¸ªâËu$¶šˆmq¦*îêd‹fx›Ó3cè¹Â>,U]ê òžfʇ¯¹‡žnÖVFÎ?TcñµPæÁ‘¡Äcªä9%o“½ªCß¾ØKè…¶.sj—™èñ¦‡*Qèx>éabýâj˜G? Íb._VLá™Î–vرãOÖ¹ìÛgF ú½‰KLò ÿƒ½ʾubj{u&þ=§r!¯ƒ¶oèË„s]»CÓ)ŠNYmˆ_Ù±øv=tËx^”QÆwÏù` .A00 Á@ Á`A0 ÁÂ@,A0,,aÁBA AÐï5sÞy3÷~îw߇¯G}%úÒÖòÕPIå–G+ݵ§ÚWQc^é¢a)V[eMèøTr˜U ÁÔ5ÒT¦›o®ÄŠJUUH-S¤® ^`‘Ú ´Fq¤?:œÊ:éò_s­¨84ü‡œnCWX]þ–*ÙC-Ð3”SÐ{}ÂL,£_WŒÂŒz¾Ìb]&ôIàɼD±ÕàÜtF/S…9Þð¯Ú™ÄG}3UHâµ¶°¦ÖÃqGÎLIì¶qµy;2{¥#[Ë´µ;N>ƒ×n*t ò-W“,št=Õ\ß~ÙF µ%³¸ EpÌ6`ZðzT\Ƨm Ü& &àÇxøÚÙ;%ùæ7qðÙêv®Ñx^xÃP…»ï;P( … P(…B!P Â`P À Ba( ƒA 0( ƒBa0(ì_“ï½äž{ι罇èþh¯ƒrUŠ4P¡™2%–Œ-u‘i®ZúЂêlìB+M•*K¨gæPq™È¥—¢ÌY² .qŸÓ[éU'ûÑHòfÆCŸ2­¯«{¬¡|þL-Ëñ68®Î:ñÀ‰ìª/&O˜÷-ݳÍTâZ15цtc­Õ—£›Ý´Õ‹žp©IÑ„{qÖ¸†pD¦#Î[ô[[0eÖÑYs²ö5´_í`f,#•K÷ª}rŽYr”¯‡Ï³-ñjs¦þmtY6«ÁÍ¥œ«‹nƒOf’LAzzGÿÆ2Öå‘M7Fã‘%°˜Ê'ûEƒ<]ИäØÿí” UÚ#uÂÑx^xÃP…·ï;P(  ƒÂ`P…@!P( À P(… P B!P ƒA¡0ƒÂƒB`Pì_“ï}ï½sÏ=çÜw_>Mõª½b}i¡G½©”3×wòt¯L-}ëÆH§¶ÓAg8#Øk˜%ò­õàÕj¨R¶RÓÖt§À©uÇ9·Z}}¨á¡3n8úw°^.nÜþÏf½ãÚÝ¢:S ±­¸ Õ6yŸÔS„W¥çIÛìg8-;ÓßåæÃO4'ã@=sš …ÛBqB¿¯½¥(®X7L‘ƒ8N™uõ‰Òœ´9šj™BRø—Lö+Áª´§ùý°¶°#=X‡ÎŒW+u>U×ä“®I¦ˆ© õŒrÉôn5µDK;Ò±A­"‘éÞQÂ;N˜=ñP Ș*ùØê|6Óx^‘\aÇ×çó…   ÁÁ ƒA0‚ ƒAp0‚ƒƒ ‚  Á`Á0‚ÁÁ ƒ¾ë>Ÿ÷î}Ÿ{žß¿÷ ûx§Ë€O×m¦ŒH"é%<Óâš9§¼ñË+f±$ñ|Cƒ;“;;Œ'RÑw¥â\1¦•³¢7s&|ûÿ,J‘v„=)C÷¯r&Qçžµ]A‡ž}/rwcDÝ}A©º±|-Y®c¬²o©‰YkʲŒµç­z*õºx·Œ+•]ê+çI¾`éî2nnÉ—±ñV²úhùn›CÊ «nUÚTYñ¯}Å"rffv,âLä/S™0TO•)ŽÄÛ3T~Û&Ù4…Gû?Ì~aI{7;“ÎÌ}Ë™ý©ŽûºÙˆµ¿…¥Ø ?VštÓx^‘tBa‡·sAð  ƒ ‚`pa ‚ Ap! A ‚ ƒ ƒ`ƒ  ‚ .ìY¾s¾ß÷û÷¾÷<=}<²§D ò,9|µ@&Z勿|3õ%‹£Üjžs³Ì“x¦@k_^ÙŠ6YÑîÄû2:z?Óй /ìôýô6TÓf`ÞŒ G™ÿNÕ=…xgÂØV/÷NwàÒÍdöD]¤è KÿՇЩñļ­éY.3õ“õá’š‚ x^•‘ÙWÓF¥ó±cC™ˆ?¤ð0ìÙ‹)X  „ƒBA‚‚FV1²"kБ$a‘¥ ¶ ¢6!²”D+¢¤¶êHc±ÁQ ™žÓ3À|/÷í>ÜO#ëÿŽËå­`þâdg\½ÛJ7Óy­§p#¬wÆ ëÚ!dl2nƒa]‡?g’.º¹H Å7­iµK0ð;í–‰?àCðoÛ-CU§\#Á¥`õQ2¾Z=tŠ¢©I˜Z_0T‡ãÎzÅOcñüÍ»â]‘¸±_SÅÀ}Úêtퟠ¬ä⥪#Gðówåg<Ç€º#»þß·[ó1V¹ë non~$-À–é¨MŸZ`¾k¿f!^¶üÎløüä`ZkéζDÑý³”Z_ê”Ò?líPbn-r8B>ÉmÅÌh ç· ïFBÁX0Lî§.ìÌ„l#Â¥kÀ)¿â9*9ÍÃäÅÿýp#¨Ìr7´ ¯Ê.cµ©ä‡m;¡±§Ða²Eÿx±4ú{É6~ƒÒõÊoé'b|«´@BÅé¦Bý&XûgbÆȲÂf^Äõ¯íEË^ê:e<“‡ p®I)@Ùñ±Ï¹ˆ‰ñüMÏÔ1+ºÕhœªI3¡j½¹ V£WÏq kmÜzRLÜ{¯/ŸÇ–2·¿i`¬ìÒ«ìlx}QÕ0g g=÷¿~›¸½ò>zŠ×2?\Š %.µc>S–[ é¡Ú†‹±eñH¦çcbòrÞ…º«à’ã×7@øl’ÆiGÎvËò*ÔWìÖä°þê/ìXR-Ø i³sÜ 5©Ì‘Š´ú³ä3Í ¥³M×õˆª aô³˜úqîÔ¥gÐ8azø×<$6Ö:ašU€±i6N§Ýøz# ¾QÓº1ˆOÜe’`Õû@“ ÌZÝÉ e@~âNtˆ%Ñøa—Ë- rÞj(èç£äZ|”ýkß”gÆÕhéÖÁÌõè •@¬Õ’Õ*Á­+EÝJÈÞwkhµÿ.£i Ö ›š³N<ïÉ«”dîƒ|]ƒÉŒäJ4.ëhc\¦) Ez“Úi‰yé²ò .âoD {I7k—4]Eã6}MK°7r&É[5´¤ÚwÈrp^“*p%·òC‰¾³ 5ƒ‹øwhåš0÷rFv.áê§.Ÿí·c”7-ˆtîïä¡ï¶÷І,œßªö÷]wôw‡+>£ËÀ¡:6ºF³§Ù`•þþSœv¯=*LÃTSê{áqLpS_KÁ‹­9Çdƒìê~Þ7ô—ÅÓĘ{“’47Ï„±×°Õ²M›‚¿¤º§å#²ÄiÁ»gF0¸‰#.Cå߀äl½Ã­+-7BˆÛQ’?r~~°é’/A£\è²ApóÇ ‡‹ /ùd<,nîŒßQ ¢Êý³½åA9uðm(±Ó|Ó/¬ô ¸o¾‹Òô&^6[Ó‹R Ý(×ÞÊ@ü9JòÙìmPZ«÷úõ‚aò]¿ƒ)’zÄ_Í`ðë”æœßžzjd/ž¤'îø|+µ¥~–‚÷×GÊßp·þ¢In‘5¢9Ô[‡ö¬æ .å~áÁ.T„¥tL¼:•®d׋XrÒ£6Çck7Oå^ê¹Õ`WÖk¾d"1KœICµG$ý€ˆ`\;Ø’ñáZV\(JNUC)¼ßÞ;mf ñµJ&ÅÑPÏ;O08Î)2;‡$GqÙÏ“øÒi@&±GvXB?‹Ë£uò‰|sÙ³€8*d?UïÁ'}sìnÈ7ïӞůÿõœT”ˆ”_ Rôy™AucÚ«{~}>Bû[ûK 01:k{ö—ÿÀØc¤ x^…Ðý7Õ€qºÖÛ0ßdªå$kEq©ã%NÓ¨Û¥•NcåeX “W»u/& ·7å-Ò¢4SÉËɸ‘³)/+Å$oµCeÛÙ?°çøüð¨GþO¼ÈùxÛJSGñÔPèШm,Ã?qŸ‚®­yD´/:Gç:·{TÇ©¢¼ýÔœ¦ìGÒ-¡ÙIR~ ì¿@ë§÷žb. ¯ä¦ú©ãZ8‰¹æW¬@ª^¼žtÏgƒÜñZµšNï”aÊÅ”el™drÿðù’ýxn4HáæÑÚPÞ ZʶCƒIzÕ4Îã¼ÃóX»¸è®0ªÝLäH²@EÐûçÕp.åMµÊ™ÈpËføàVž3Œw^–9)—+°”&j ƒ\»¸äÔLtËOY¨:›yÕ‡(öÈnzÔå³yyÕÎRÛ2=‚Û¯›Ñ–r¾V®<\…¾Œé’“Ø«]ýï®Æ |Š]û‘WºX2á5-—ãŠ3¼úÙý·D´¤è‡ûv¡öû"zN†™0ùɶ5„ÉòB˜>ô}Ê’{È"ƒ{èM¶#üY‰H05w•ã\j—K‡(ú5‘ïœÞ€ášíïRcëp›kOôÛYÐfÓΉ Öð‰lÅ\ÚP'Ìv^¹{µPJg7“@Tå 7)+ò‹ââ©Ìlz›kåxéÙ>ÇnËæhtTIñB—o|.ÏÅ!ĤÍÙGLÉk1Í&›vÐ÷Õkr¹ëR}E*áôÛ`´4L¯ðFóƒÝÂ@̨!¹Óü¤ÂBΉk ŒŸç hï –ç×ïåô[ÝÓ4ùé=D³-ÞŽ­^£Âüs¥Dõåpg½Z>Ú÷/·¾TçYêñÎÜJp*dç@Qâ-óóÐ\œÁQáÖZáfK¡V²†A\\R'M,HÏh)`jCôN¼Sž|Ä =Q¤-fÙ™ç¯X[%ÊÇÔ¬Øc¶ª‰úØ(s†æ^¢»ÛÖžád!ÒC+ÿDk4¢…_TŠÌŽë2Ƥܩ_¸S­h%Çô;"­KŒÍ˜‹•¶(¸8¥9——þ‹Ú‚ÑÖFw¤Ýn Ä(naÓf9È3Û½h9xÙcu;G…^žê3¢­;”ˆ‹OçñÐxàøÀ´“¶l¹ CgÔS¯–ø5iýé¼ ¹àFE½ß”S¯âQ¯haSò„3ÒYF]BXYp!þ»·»Ri"ZMPÝ4 IÇ4£è½®‹C˜…Ý5¢ Zý›ûPÎ à™áذP]¬óš]%‡Œ1Ñ>ŠîÛ3©ë›§2VƒÉžŸ·’ºyQ&Çjv5°Ç\ß ß³ãŽ‚¤jÇþ῎ÃBˆâ¶¾Ø ä§ñè˱ašLÖЙp—Ì¿ÿÆã÷ã.X\Êôù4ï¸áx^-‘±‘Å D}3: ¸à—à\á…”@øC•@ ”@ .(Á%Ü>Ï`–•´+ÄׇO#ì2uºuj×£ü;A”Ø7M5âg¼”5ùFÆ­+ç Ô¨­dNE¼ÁˆçUq‚{Üa;ØÈõ!ž”QïD*¹ueTÖÔßêó\Z;›ú·-½F´À¹¯iΘw ÓX •¤;ýWp}W7ؼ:7rqµá˜öÒÔÿêòäìœv²Ïx^M1uÀ0 DÓ÷4hèÁC‡à±£!xìh†`†``†Ðžš÷’H'ét§_¾lX±Óª¥ýŸ?·-käѲMª7èeOóA”¬ùE¥Ø4ñ€ /ö€v… 2á¨Ô¶×R˜|S Î.Ÿ6»2Pe™÷™Ù“‰òOÇe+ ²—¸±kñÏìÔ>)ˆp žºÑ´µ$°¬˜ú Òít¹<ˆµ¡¡clOck”æÎD k—ÔË.í8ôÛ•ßÚÏÔaKô­_ؤÀ‘¾Äß6–·g]ï²7¨³o‡ºà£öÝQ%—ÒA~ûÞéžT*\rRðV¹ÃüÒéï7Fr^Ãx^%‘;‘Ä0DuUL°A ÁÁ0‡‚ ‚!‚!‚ Ü«Ö3nµÞ|öçË£lQUņvêºUk:ȃ]ºíPÙß¿S™ø¨)¨m]eªèEm6u¦¢+Oä,à¾ÒA¼åþaGd5åÝ5¡ïP:ïš1rã<ÈÜwh¤@½@sÕt.Î4Ýku4æiÄ‘vÔ¸n\Và:#Ãx‰Ñ:]fŸWIâÇ=ÍðÙ•N(œ˜wæÔÌ÷»Eö4?¯ªy÷ÞE´úékL•ÜÕ©~S¡BÄ—i\?É7&ê´’ÜãU Z^ûõJ-]¨t#ŸÆÿßL†Þÿiرoeþ\|g¢Ûx^-‘±‘Ä C¹„lH ”à®—àpC—à(Á%P%¸J¸'ö#ϯW"»J&Nzê¨â93›‰k­ué¼êk@ŒÑòüH;XhmC¾÷ÊZvÖ/[…ü‡¬8ÄÕ<1ð:Fø3Êñ/¾ÐÀúÎØ f8'bº§xczõè_fw‚ýG&e"Ù‘ŽÈÿŸ,Þë˜\Bd®ðH8¹­Ý–Õ×V‰ðMðÑáTäx9ª/ÅbŒëz ¬ÊʬEêé4Þ¶ÒØ¨Jqn¿7móZî Oä²ÌL[°›§;c1KÒfà›ÚDo<þ™O¼ÝXÜÛ“¹™ÎD³T°ÙiîG~—h/Ÿ6u'2ݲxµl\ iy=Žd•‹¨ÄÄ×¾ s†VØaÚa4ŽÂàžOL¶à2Qí÷§b¨ |ôªdIí` ¡]f“¨2Égd`4›·>^Ílý8ë&F«“# ÝJ”L-ž&ÕÕË©(¶Š¢2&uûÕH%¡ß{Å!»àà‚¤kn³5¥ÊŒ ¹{°r¸7„·*>)ò¸RBbÜ'¦4• .šû.‘7ö²!Ú=.–ÜóíD4e­„а¾l®»c†yÛ9}VQ5@m®Ö9|܈‘è kê6<¥©"á¶‹ç¹ãg"Ãßþª%GïÜë¦Tjz„Ÿ·Ï>ø™£ËÊ®R`¬‘‡±Un`÷ZÏ‚áž7åFÔT»Ð’ÒŠŸ 9)oE11µ„Á?ީәó×âmæÜá…_êdùË‹Ýgòqî±yÃâ¿ó¼yhBÄ«ë°0xâ…’­J7OD7ìé0í%tøZÉÓžóþT«–3?¥ø ù Œª›†`ý2!•–ýž•ëì¥ÊÁ-6ßàÔ+NPßx˜JÏyÓ°Ö“Èÿýäð™Žx^••»ObÅy,|À8Z˜mL ml&*¨±¡”ÈŒ`c¢X@cò…ˆ Æ†F pŸGà£cll Ih´™øÀQÎwr“ûÜÝïd¯¬ßZ[øÏÿ9üw°ÃA™9KoãH^¸;èûFÎÁiS¼Œ™Š=v–ßChݶT—cóáÅå'¸<¶Ûž±îÝí¿i\ži­ºg¨¦¥Ðª2«jì%Ú-+úêÆ@â¬ûdÜý Ý8½òÉ·ÝŽ‹Î_Ï F8W¥d3vs/Y2Ǫ˜ù ŠŽn„sˆ+…›ñpÍe/M8õ”:º,8a²!þN1ó˜·ÂëøîБCÇœ–BdÛ-Áø¼N%ØCŒ–®Ÿ1“ý‰íýçv«Ù"”Á>d5h·Ê‘3öÈ:;Má«<ÿ 'ZYÙC›BhW"¦))åûðæôŽ» h/÷}ËSØP5PÝ{ù¡ O‚d¥>µTµÁ'¢W0ñQìsAöŠÂcê%1Xάª¾ ÞU«8ÌzžÈÂ4\a¡=M¢¿&Zw‡°ží½ª3óem·ÙÂÞxˆ;GiF9ÐkÑT¾‚Ù‘Ö w‚Eqcéj ÙÕWAGÌÜ™8Ác¬Åâ"ν*×lèÈ„í¤ùípÖè…m=UÁ€!.|‚^6o¼áÁÔ½¥Ûc¿SE'lègvbUl×#Ûù7¨rGc€“ “ñ6ÉÖøè3á5¼L4õw•ê›9#•¨àì~j1dEçÊs´ëÑ홀wH?FŠ–[©åÈŽ¾y5AœÛKRÞ•uã‡sÍŠ¸¿²}1IŒÛîôÐÐÒ!Äâ½®¸­Æ`Å(Àzí x[µ5“Hö4ÛU2H/£Åû&xh+͆Çÿ’ö?átÅÐ&!©6´AìÙòz$G%\änÛ .cºMÛà›“Øè:RõƒÛZŽ.skýÛË5G8BØ4“v!áÙ: ô‹WÔá5ôÚ¡V‰¨U^ûªé†açâàFAÃU‡Üû„þUqr©ËÊÓøÒ¼‚ö»#([ló" fÒ)¾ËtÆ Š”Œ­Ñ6¨SÇ!ÏìªM Ö&a>Nw¹ð<äŽ|¹ äž—ÔüO̲/iÍÆU'‹Þd3ÝJpÑÓº…³€~æ×þˆ>“ŠI(ëScw»P'^¿“ÇX,ˆ†›áb£×‰7rîáÆÿò 9@ÉmJæ[!a>“:»lq:Høì6vnJï6àqŽ©Œü€*\?z‡oTtš“¢-s2£(¡ƒànVͰ0–¨h_ßß, 0O{çh¤‡ÊN· }~½½K@Dçƒtv45'MC)' ‡[ãR™Õ"/«5hÙ¸žà¹Þßp@ïŸ}Û‡¶fz˘5U¢š=žÝ¦NÅœ/½·g¬„ލ¶{HÜog3”WUuÞŒ?îWõèþ°²r^ŒJbj,|€YUyì¾tݺ.h@ûõdœý΂dvî+OryñØdMÉ¡ ¡VSc[ïÿý¶x‚į·ÔÍxô7µÎË&™‡+>–¦.p{]ßȈÑy_ßX !úK–b#PÎ×È®wÄ»•òOØÔ²bà„ Ý'ŽÉoƒ@þ¥áfrHŒôe5BJx¼U°ƒéîOtn‰(öÅ—º”¡WA:i ¸ ×ÆèÂ?R¡)œ‰ÅY£”p.¸–›áè õLC²úø2îõLl¾ pu´9ødz2ë‘  "5×XFK½$…öú´]õTíð;ßɶ;®˜ >ôF_2ĸáëzíI&<ãe0c¨v¸IôÉ!È™ÑÉ„¢Wèü‘X7kMÒ_2è®ÊZ‚'r`ÊÞÝ Ë‚ì‘·j£ŠÞjÇûKk‚&ÎC_B¾T×H’æÿŠÛVò×Ч™8AS?(£àXº4þ äŸ~?í[}Aàw“ A«bÏ™6FŽ•„Û‰h*.ú²#«ûx^‘|B…Ûï÷ÁƒApáÁ Á ‚ ƒA A0‚  ƒ` ÂÁ ‚Á`A0‚ <ömÞ{÷Ï9÷ÜsÏÿ^¹ Ãœ MöÀYdŒ17 Ør`Ç'mÊöì"¥äCqMŠŒX2еñÔ¸,ßÚþ )UÒhÙñ.Ï ßä<È:å˜=9oÆ=ßñwN¶Fƒ>o¬ÔÕ7nss39]³m™‡<;¡K':ª¨˜Yqë¼?*›Q“ge%qZW¾®[Ì.*jj+@CHW«”›[V +qêEÑžR1‡ýÎnëUkÛCE¨ æ—:Ì+J[òì€Ü˜‘“£%gÎUÙ6R}ÓÃ55üŒŠ=jÍ33Þ AÕ‘èÛGz¤èk¢¥Î¬©YجR[â.ƒ™(ÒÈvØ7%”f¤‚X‰œÏô¦Â´pTãe€Ç\=SzŒ u¾vö «ÀÏ•;—슷 Ðq{õOˆc¢ö :75´>bè9§5ä­ì陚’ܱ Á?'[ˆFýx^˜Q…Ûï;Á…`!‚ ‚ ‚ ‚…… ‚ ‚… ‚ X‚ ‚ ö¯yß¼y÷¾3çœ{Þ&¯G9µÔQïÚh@åk%ßü¶§LC™úÚ© ©šª‚*X¤(?UÂz¨Ë›ÓŸF¶×VyµU“n¡žN0¶Ò' ‰~Á–kÆ}G ;s ©ê„Nƒý©[Dçƒ*CùOcº)ª=såñMqØ¢—ÈEa Þ¹D·«o¼ áŠs[뢇ï¥>3ÎáM-¡vÀ55B½ [¦º~ÆëêãµUÑPF]ç Ó@Á4³+uCn†/· æºØ–»J8 P½²ûÿ†û§&®cú}r‹Õ±/ù¯†û,ŽO_æ‘á ÿ’;àò9ÅFG« ¶g–>ü!;&o©dwòyæë1}J;Ò‹uµ:> ½œÖ`fÌýÂ9‚ýx^‘”a…gϹ0 <‚`!XXX‚…`a!‚`a!‚ XX‚ ‚ ‚…… XX~öÛ:§s^÷¼{ï÷¿nÆ×<•*V_;9}ªÐ\Î\Û)Ñ õ¤RG(D -V¥–~u¯[=ëïçÑ*½èŽý›ŽÙÓŒ¬µåÚè ÿ\²f8'´$¶À5#%TDžƒ¢bË™ÔÁaìwÈo«Žú¨%ûzÒV¹†ôLÉyÓ^ Ûi©Z©¾’þ„d£×W%¥AÇAkzS«ë= )brdùplÊ{Z¼F´Eè¨ Õì‚>z¾LdgevÄ—Ó7‚ËGÉIKåY“Î=î¦4CZzµ${¾g2*Ú\5潦 ¿Gjr‘‚æ] ‰èúw´aïèWÀS¦“.(Ûëå2õTYÉ% æwJRïúÿd–q§MK]|š×tÿNêÿx^xÃ`…»ç9(. ÃÁ`(‚…B¡P B` ƒ@¡P Á P(…B (ƒB¡PØ›&O~îýÎ=çý¾‡è~©¥›r™6r4W¥T¥–ú=ºµSO‰~tV¦­¦v¡>ª-_¹zBõ«Z7ËxW>3k¸b žž=Ò›BêÀêhWê|ºš—gŽcx*Eìö„‡1Ø’©=³-îˆÕ³º$l„êzw=‘_C—à5·’:Ä×'³!>Óï©´'_i £­Ë¤¡LàÜs%ô!$K<#fû@ïsš}—Þ ]®–忲‡„°¡Ñ÷?yºƒûx^‘”Æ»÷>X8X‚ƒ ‚  ‚… X‚ƒ ‚àà`!‚ƒàà ‚ƒ XX‚ è÷vß›y;;óý™Ù—¸|TQª\})S÷¶ZŠ-cõJíÑíJÚP¯Y®‰NTñ¡ºú ¶j[@®Ê—«3¸þt¥zXz¥½"]TèFg gbXrT‡%_êGo(»höUw¦t¶2­õPÍB}Ã3#RÈתb|VlÌ·Lÿº+ÀKyYFöÔÑ‘¸£è€.Tµ®–p4é­4ë3ÿ)³ üû$ä5, îOꘑgÌuQ4ð›’[p‘‡Þµ`×'W¦~Õ´+[´˜m”ª70>wºØÆ¥†NŒzŽ*®9lááñ¬l.M0#[ÂÀ²ç¾9W9)·ñË{ÙµF¸x/P˜árΨÜ3%Œ¿zäö;¶qÙ¢·avNo¦ô }ö•x^•’ù?Ô ÇƱjy}Ýd¶'›«¦i{µJ¹ÖÊ3µŽÉ­a]!WOR GMIÑußËèIåq̰Ñ+ÒvEBˆ(·b43ϾžçõüÏû—÷ð~‹GýŸ@ì? P ÌTWv·‘ðÌqYÔç‚ê~’(¡õ†5|±Ïpâ¹Ìßr@a¬Ø~64¦×3=qüT·ˆèx¯nCñ_™GÅ3hfœb h?•CÁÀÕ@àˆ|g)Z¦'v oµ¯ašYkÇÜÝTòåùuT‹È- ¸ß¾©iÖ§å®9É¢dzyЩ¡‰’"Ëub¶o^ä}§ãç.±0”8?˜ßÓQ²ÌnK6²(h°líAòKîå•‹ØVEmžÃ³š›ÃHÆa=s2Í5¼…ñjN’ ÓksEã«h®ø¨Ãð‚f„%‡V“Šo÷{:@ÑýpÛ=YŒQíïV`“7¼ ïï'(´üyRÙëøªÁ€% “´CO·*@¨1>)MÌ}ý`~éj4.ë$£¸UåòVCt¸4·ù¾E˜þý™‚m˜`fÇ1ǵ1xs +Óõfrqð6szüqÓŠ'Vû@mQJaèã<{‚ROü´JÓÇàl±»3åæ?‰PÄyöËÍ|Q-"%I \7 &®ˆ9Ê#œçªÛ^‹Qž‚;³m¢$/ªN8¹þ/•â.+e*Lئۈà9¤nWhm·qºËÀ6õÖ‘ÄMüìîɆß$oÕgÍ~ZºZ. ¨ deÛ[tdDúÝ™÷uÆ–åèQ7ÂR½·¸vµw†·ãÑn%GØZO¦o¸cÃa,%Ôq½*^;Ý!bÕí°þ;/éÌ©çH}…ft Ÿ^C8x7ëFJ!W{òÚX &"Ó½J±³X­3’ ª¼­]>Å¥š”»ÒÈÈŸ§ÈÖáôˆ¨p&¥vº¾+p,j-÷eàªö‘ÕÇ% ´,îž!x¢p,³ªŒØ%Ña²Œ”(²HHð>°³»úndZo ôrb‰î¹7K Ä "ëw2á«÷—@­QZzfzØppÁšt©›ÐÌnæt|‰öð5(ƒêÃÚ7­Ë0‘<÷×ú÷— ˜:$Þ5ãJ<·X¿8 ƒózË;¦ÿJ5»^i!?½ÅÊY!üx›B-<s󨰏ñ Ãqö0¬ñÐf{  ÓÙ•»Ž-¦b‚¶£(ë[ø¤ìEÝ%³’þ^Õ(1™‘(·@m{!cu}m©ŒÞpŒ‰ë¥!\®þ’„YÌáÐ(&2‡ö ÷+Ѿ;Æ‘®ça…I±á"8˜ÕJé"rìò§ì¶¢{Áõtfû†'’¡ávëÝ«tfw}qîæ˱˜)Û½cW<ȃO]®`t›ÿÚÉ$ݼÿð7Ban°ë©·ˆ¦þ@¿’F‡w])VÀöýÙ¯ÇÝÀøWXìV{„ùœÛ#ƒaNæñwrÐîð5*ǰ‰ÿ=-O(ÑÛ^_.†Ë|hÞª+>}¼Ù³‡ÕΧê[ÄÁ¢<<æÃ!Tš¾› sI»#‡ƒ} 6É:R_¶t ±KÚÕ ûDC“*޼Á–º´Í²˜Û´ ÿOþ ÉÝ<«œEô—×§¾çãë75Cu÷÷+©f°½øòíÍdXœ‰©ŽÂ«Ôø°âÿ-NŸŒàðó‹q h $´ŸÅ\ºxËd–5+üÆ>gŸ)ô|c.câ宇ֲíñŒE.lfÐyÿ%ª^U¥H³t-Täu)öÍ;%̹]TÌ…š«2èîì³!¡bÛ_´íšôÅBbΨQǼê"WS‘_p¿À|¤Ç/Géú~›DOJb«Ø˜Î÷ÍÇñHœ.$ {”tˆ†P-/Ë h—¦n›Gbˆ»§xºÊ_‚X]¼wPx/ ‚pYeJ¶&—°Ã»9´ÀgƬQêf¿ƒØÏEŽO±êžLdêššÆÉ2žÿ¹Z‰1\8§ž*˶ôHMøÐ›¦ÔDÜ¢!$‡<²¨œ²9Ø»_û£×ëypÏE‡øôVa¥\ᙥ-ÕyˆžbqôÄKò'k3qs¸¯eà¢4õ­˜ëejO¸šz%‘îåô)¼ðäå”üX<†M“r;ÇìÕ=˜ßü³"=ëêQ¶y$‡ö­°MœÙá?‹¦óJ®ê’g$Ñ:&¡yÔ]–,½ABà‡ç¸%#hs{ÀsÝ®æÞÂs…Û䨵Useƒ§?o_‰²pjySû{Ëë§l (32؆}ÛÕaÜ å­ òUŸ²•b˪“ˆ~ª{­z}1K^k½ ÕdŠNƒK»«ŠÔI7ü1Ÿ<u ²t^ œ½ŒuêûÆ…DÏ 1fÌ””ÑöF¶–Ö«É™¨ÌøYÕ 4gŽU“×óî-5b‹…¯hÊ Ä ô®ŠàûAçNþY¥­ÏÙõÔÚ{™Nœ>†êƱ^’]†;ùrG« ®9“¤Ôæ&¢“)UÌOfÙBZNívÖÐ#5F0ãdñìhÒž¥×&þ&šÂ–Üg '_e~ãä|œ½–ÜÇ9ÕÉÎy¯ ' ƒIÂOq1âæ¬UÏè±"çðb}½ŽÑ>$‘ãO«o'ˆw[£Šq_¿ÁÆîóÈêº)$*Ȧ¡Ó躓ÙÍÌIÛåÊÇg7i00X¤A(üÆéÓ:Xô\AÜ>’‹AÜÐ)¢%V£BJSüú'üfQ×õ© Õ'—Ò½ÇzÇÅötŸâµV´˜íñDQkz€ˆÞÙÒˆ®•) a ¶¼’¤î+ÇI›«±ž”ÐìrMõ 1ë ÂåíG&ø{8‘þU^±‰5æ‘FG©m~‹j™ÍØ*œžKGüåï(M ­!ã ÊDQ1åÈ–,:ÍãÕFûYØß†nÞÌšßzÿ Ä÷C‰x^5‘1‘Æ „s3[PüÅ+N@$DRœ€HHy%€$D ÷-3—ì[vßÂ×/ŸF uU…nŒG¯.ÍŸ]x/)k€Úãæ?µÃ˰+ø©¢¦m©dÔNjÓ ææ˜?P>A]xŒè •ݶQ ÕôjÆÂLÍŠ vAáÅc²¦Ö;õìžÒ®ÞÙïRýôt°.aÍÕ›S¥‡TãBc[Š•Î~À } ‰†Ó:½{n¬®˜‰awƒžü;èC‚ú¯«™Ìw¢WVÏŒƒªç±nv[ÎæsvqÒï¬F¿sõëj0žu¦Sq6ߺÎS䄸ùÍìã÷¨¼SÃݧ¬ùÀ‡›œŠ”ËÛ'/†;rŠ×/õd}ö‡x^-1±Ä0 DýgT¸T†ò—†òJC0„@0C„@„{«ÜÍœ¯vµ+ý}øYÉnÕ›9eÝåµbm¶s–Üí6¥ÙËÛø{ÜÓ.kž¸Å½A ßÍÎPl>x7d-Ÿ ÎW¿mÀ¯ÁêÜ…>ª_'UéV0¸§¯hVòT å/ü\Nmä'úà ¯û7å†nÂ?è©ä§;ý¾çõ뤤+îšhÙî˜bpN^íÒSë8JOZ@ÌÃG©O*7õž¡PÒ•»â£v¦SVe?o¦~Gl_½ŽØ˜/Š4YÛÔȺ¤à6ÔJ©}ªgaöJæw»Ú¥6tGÛL±%}çÁý ¡’&÷x^QA±! ãÏäÐc% a%  HàøH@€„•°ð’îÌB iš–¿~8vñá£YÅBÁÆS:.^â‘L¬âþa2Z¶‘0x“Èiž™›"§p§£$Ì/ž”[U"¬êRoPf•»VðPé²^#wÑSá~Èso8þ’=ÉÝö û óX¦b#Ö¹2«S%ªm²?“+õ—éý"›“9¨í&LïáºÅ)s•Lõ½ÈUÕfoœ q¹¾¦“‡uVý0¯Ùám•?ÞzÜÐÈSÝk“n9š·|ÈbÏ.¾›&5©ðF÷dú„f./;´Ô…f4|¡›ÞA³)áx1úü¢ð\óµ®iR)ÿ30wÖýx^‘=‘Å0 „}3*\¼BÅ`†.€ ¤¼2 Á! ! á¾uf’ègWÖ®þx¬d·ia§%{í"zøö_çßòcÃ*ýJ·Øë—¥D |µnËnîËÜÔ+| µû´åís1õ ¯àzãûºŽjULPÝyw<˜Ðv-6&8w-»òM­ÃÒþM°o8ÿØûO&_LšyØÊšÝáJSxeZ§ï\;69èœpÝÞOƒß¶ª°áB9ø¢ÌtV£C††;/jÞ³½Iö¸ãׄ}R‹,-d® qƒ/N‘VÞä±J›Èqüߥ0ðÓ¹݈ԇkù&G…ž[»Ó‘~mÝö¦L.ã­÷¬»‘j& E¨éd~Ö‰x^%‘1‘Å0 D}3*RüBÅ`†`.À‡òJC0„@0„@0C„{«Ÿ™$’¼Ú•Ö?í´ÛÒOå>­x³µcjaÃoʦuðÛ^kѹ;T –©y¿2Êÿ â%»¼Å ;<[¢ëÁ{ U/œÑÈ;ʱùÊÃéÝÑÁáéêº{Y‰ ïÝõÅÛö/ðN6˜P1»Ð &ª.®jVô¿”ëžZ“&ò‰Âs‚V6VÉ«—X(,;>‡vÀD^§\™fºÁÆ®U¿ˆù¹pÚP|ö© ÒRíPŽâ‹½¬½Ý²qä'ŠŸTêÕ]«Í0 ›ž>\ÞÕCõÏ'M}Æ…x^%‘;‘Ä0D}U(Ø`‚ ‚ €!8¼P Áa!‚!½ֺÊúôÌt÷Œ~þø4Ó¥ªíòÙ{ý½•µ©œ©¤G¡ÏÊkê:¸ß¬]ƒµEUKè\õ(ˆj˜¡ÂSØÍq±«¿äÑi®48ÍÅ\Ú4ÃÞÉÙÑ( •sÓH\IJ: '»Ùvb+(w7|¦ øü:+1¨nDvw`½Ë,Vrùíê\*ì±²­S¹Mî9ÜsIŽŸLÒS¹ÐðòšÍÆêI1GÝïx9Ó?µ ÎÚÃŽ%÷5W¶ýLD¬uòk ¿T˜Óýt½¸áÿm«z ~¥FÇî°ÐÙ׃»ñÄì—ýýxu}6‡x^%‘1‘Å0 Ds3[¸Tq! Á !商††ð!Ü[ýÌÈ‘µÒj%ÿüñi•½tÝjºK¨«j¶£T- =ÅgÓ£Cí·ã-]šœ§œ1Aöþ"ƒ¬©·L°S[LîgflpÞx3†6½X£â¿ˆ6"3îìd °¿B'H×,®ïd^²â]-Rwvi…žÉ6tÅÃù¦Úüå¶àBiTÎ=¹­À}*þ­ˆ…öÚ¸/"Ö]5â«¶ÜŠ{XýVXñ=û'õx=<ï‰ÕŒŽÔkÖ7øø6n‘szg§zx Wسnò6V\ÅSxO_´Q{Àdí[NUåiWÉ}ÅNî÷õ¼#«eçÞâoMåîØòå^lSÿÀ†ñ x^…Ð;Ó pã[­g™"½ÜcE8«ó’yœº^½LÖ‹ ׋£ä¼¿\á*za‹![ݘHW… 3wÅÉ$/#a ë’BˆçòÖ=Ïý÷ù>¤3ÿry÷dKÿ(*/jè!‘q¿^=¦é°;­ #æo盈IŒ Þ:اû::§ÆÃPðÀÒj¥–ÖV(éFT¸X•0!¹ñÄ ëF ‘>÷Œ çÔ>Ž×¶büÑq/ìPŒÁ®êÎY´ÐaÔè–J ×ÍÜ à©ˆ,ÐPz© q˜õ€Û-ëpu¶\¹¥™±4Ï ‡os_î‰½Û ›Œé…˜©M" Œ4;!ž]M‚7Ûn6!൮? ‡¥G2@’SÂPÚŸ‡à†XÔE6 ÙçŠ-f7îÂx‰úKBtù;6l¡˜â‘1û Үуq¸®[‰5÷Øtü’TU ZL}#\kîßÄ_¬¢‘Ô¿[‚ÞªQŽyÉåÁ—ipì=Z*¹P†{|†…-Ï^Üh2v½?Q rOd8ÞÈm:Ñ]9{4ñ*8Éÿ—Hì{«v¥îø¡×6à–™ÆùÓȿ„ó¢ŒZÍÞæ:)꜕"éí¯ƒù΃{ÐÈz îòÜv¢!×=}Ììhrô…xÂsLFÖ+ª)Vt®Fa@×'ðzÊ&a0ìc„—ásT䨿¢ßzÓSx}?H”\ÓvÀ'ú·a¢Zõ*ΫI±ëÃbôñÑ÷m’d ZUÕ#åg?!©d¼“±¨˜žwÍ‚sMƒPã?kÀ­2†æëÖäÔ¡ì® }WàSéªb¤MÔQPØ}h9´%"1dÊyœWugo ñ °Z ±_°Œý–0j˜ÞÛ/"nàʆè: ˆ9Y<œS‚öƒ•_ êóˆIlçÑÅ!êÆr"@)™G¯0¿!™1t¨Y³ÅP[1 {á4”:ŽXËÉ[„°Šm¡¨RAð•øLT[×t þùÉBÝšCƒþŒå ”K®[b«¬æ!^+òñtìõØ´9b ®Ã\Õd¶ctMLÎ<íuéö20ùYùDâÔ²4Ô™I]ׯÁäàü06+«†¡O¿ž‡÷¿¢ÆÞ›~öŒ’FáuµÂÌ9ìà_`3ŠvOX½Šó@; R=ô °qSå"¾¨6v}ë›Àä};‹õ£;`zÈÞBÆbød E„¾Ên_lÚfŒ›±='‘YJß sª ¿¿aäb3kã4L¦¦àÆÎ-F½nÔW0ÄúšpYT>†5¦]ˆýo)^Ý5òàXó£ñðÏ»šÐÞÐÌ„BÖ‹9…„ÆÏºÑà8ûÿ†ºöDɆx8——žJœÍ54†nŽ8|Ñg´°Ã#¡ÕJwÃpºöˆ{& iTzAØTÞw÷æ£8h¢’€=Ç´*À*ûRLè9}™†|$¯¹+mæ¸77ªŽYA"*a8#!Üð"YF¸\üÉ¢Áøž,j†·~ ¦o ׂl-GV‚QÞ9;9¡DD­'ïU,æ&ÕJ ß`iKV ñÕÜdŽS.™À»‹"@Éû~U¼Ë¸‰iCÇN,Ó©üeí9«Š˜˜µµãª¤©³cß@êÃnûÍÓA+šx^•T»Obßå±AÐSȘØhc"X@Cc`@ˆ Gàx±1…6&¿ÄØØh1hB#舼l¦1"ŒÆÆF ‘„FÅtDÁsϽ7÷¸_·³“½öz|‹ÿÏÿ9àýg°Í¢3†Úóª]”|”õ?•q¤¬ªZ1‘ äpŸ„f3U\~ÌîÃà©z¾àYbosQ¬¢.êüŠÝbÚŠâtIͲXóAúCʺÚH´çŸ„E ß»4f‡å&!â`EþÚQŸ÷vÙ-7òÞ–’/‰Zb¹¦ é(šK˜{¯õíAû£5ð5Õ•Ýìf þ^íMDQ?Ìðm¸ïݯ* ¢rF„‘/§®CÈ·Wò™ ¤ÙýKš„?ËÞ)kPÓÔà´Òåóe‚'îË‚i¶Õú êk‡´£„»i‘Ç^!K¤h`³ º ”#øùò[Á)uGl˜QVç?)¦>7Ø0Ü_‚*–½ÃHæZXo+T©ãTeÆü DÚ4¾ÿÏ?Í©õ°Áévó¦éJmþ>n§Â˜d%daÇï_5¿sf:Ž@ß~íD Qìï¹>=Uhvᆾ¿¬àþ:¨øÀ<3¾nl¢ã$k bÂtàºvB-|Y˾Cu¨¦š!òˆ/¦ê¸;µ±4‰Œ»ÐÇy[x¶Üèì­K@à̺ÍÍ érÇ(EBµE,5šåY‰š¡ÕeúÆË`ÌÉüJ‡ÑˆjùÆkW,Ãýúd·<õ êë°Ñ÷ŒÎX圗àDNÞšÃ(žðÉåÌMÙ‰v9 <™Hσt©L¦_‰Ëˆ]JÑÈg†„ olç7"LN9IÎ÷¢Ž4<Ù ¾jF¨yßÛVÚÖ7­ê]0øxê-Œ䤱е'[Ñ$@ù!¼º2Ê%¯™ðŽkKU‹ñ ÚÓjÆÑfåꬃ*Y¿¡Š™ô›w „{C]tÖ‚Ë›ª+#ÆE¡’ßb1ÛYäCÁ öùÅ—äÓ(ú c†¼ ¯;5Nº2å¡Pò6²… ݹء „ò‚ÜÅß…Vèl¸Ô»Ö¦“˜=æ(dcoÞ8€N2¹d…Ê<î5¢›½ï+A ìlð†q¸Ì“žrw)G‡~íòáÛ Ã\éHi»†Ÿ€¿ ÷<ÕPðJ˜é]ôOS Ì dÒÈùž¶…Ïè÷Ñ—>V=tyz‡ð+w‚ÂxK*çŠ2H˜Õ¸¾K0h‚"^FQàZ}…ÇЬ ÃÝñq±)‚×(¾S†¡]l»O¿"f²®Ÿ¾ ÿÌÑÉí_!]ךX"–[boÞ„×ãvP ÎÉ> fêÉ .ú³žÆ !„ùÔþ½ Šû”Äe·¡±Áô’èßßoþÄ\F4ëáãBrÜ`ùo‡'–ŽÎl=ÝÌÏ®,‰îÈ3•J€üÚ¬ý*áz^09q¥—ñ·ïÎA•䯻ÅFüm{ÄŠ˜¹­h|ÁÝMå‚iëù©1'Q«‡÷ÌnÙÝÅ3Qx%¢Xã?»9!ËÙ1Ññ_(Ò¶ò ˆ–8ØãèÜ`¨ “ž9¹ ªmÄÞ±êkÖp¹Ä| ¨sñ¼òw‹¤4WÁ-5<ïc éYÌËDà2'´+!(žF¶ûÞq¸åt ¬Hg1œß9\±ábóÛ|jój}WÖä@ú¿l}WÊÄ¿ùõ,î_±vt êÚ¨Œ°¬@Ãy{eëá ñ[ß”TÕ<=_nÂüg©çK=ö–<A'Ìp¯(FÞ‰Ïf¸j¾iEé¸ã»!Z‘ðf‡L˜«Y§.þ/7 2ú§x^‘tÃPÆ»s>(>(  0(@¡0(†…B!0( …ÀƒB!P B P …À P ƒBa¿4çäßwïýþÜ÷0¿_jh©'嫯³VŠt'g\àkJ­M-W‡wK# «‹¶jÊ‚UÊT€^µQnÝø_+ÕlÍôDƪÌ@%|–g¨_PQ/Ð*M‚ò€¿N&T}ÞtÂÃNrT°.ý¹vT®fÌ·æ#œ3t>q4Ô»RÓÄÙ/ž²æ7‰^`ÍÍB?p…$Ü¢¿Ó7ª%,™ñxïÉ÷ÎÎøº‘ÉÁnMå­þîÉcz,ý¹GèÏðëØž¿Àuƒ3Ta2xЩû³8X¡,S{O™®¨·éj ÖgznJ¸NdŽõÌ\HË.RmŒ~íºÞ׆D÷3zU×8°ú–ÜXÞ©>pÐ’·B­o35àÙÅÁœIÞg¹zpe|%œNÍò`-Àë4º§ÿÉA’¡x^‘˜Q…Ûï;0\‚`aa!‚ ‚… XXX‚`àÁBA,ÁB0 ÁBA° ÁÀþÍÌ÷æÝwß¹çœ{çaP<*i eš{e=*U•Œ3×tº©¦@M½è[%荒zrþ ü›òQ¢?åšê`{öOýjM¶¦¶žõUTDæk©™²Þ5#kZ 4䦢±:hžÑÚ²—`ªƒsö„§¥úÜÞ+ |HtQn=yœÜ‡h¯«ßÍ¡Yç΃5Š8yµµ²ö0xêRS¥§ï}«£á¡ð Õ¢§Ø.8hk.yÖ†åƒÍåÙP;²1õla½×ãØŽdFà8èâ&WC¯è¥8¨À·â\‘jNTÂGj1=7™Ûžî"\\Qm1¥–½SÛ§&@eߪ˜ÚH k;Ð;Þ9õøC±ºþ ýØ)ìm&´f~'tbKq?†ÝÇÇ Šç™ Ö «ƒ‹œLB' Øë?Ö›†â¡x^‘tBQÇÛ9x0øÁ` ‚Á ‚ ‚A0A0ƒ`0ƒ`0A Á  ‚` ‚Á ‚}^ïžóν¿ß÷ßïÞ“þñ£À;·d$ì)sÏš/þÈ"«Ï(qN“>pI߉S6Ñá‚oæI:éò wEæ,ElEÖYYÛò t#qªz=é°Õi/ò6Z<ÓP}NM§„žCY¤öûöÆöò¿d^™å:öŒ’Yr µ—ñAOæ]TåÍ\©™Ë´Xø?Ó¯gžvúôy¥£BWdK§4žõ¸´špÇDŸÍ±¾¤ߪ ̸ò”ZŠl»›:åáÜy ~¸ñ¼5ˆüœ§ÚÿU3O÷iêû(˜+W+{ß{Þ’<݆vìÌ´3ÿÈ *zx󞚌M¶4ÓÀ^Çš¨\³WèÉX©žßã˜kÑŽè¸ðåºæy••ùF%yON5‰Pk!&sÚ±ªk5BµNäwÝ–·Òwê*Yo¨Wüv+ª¥x^‘tÃ`…»s. ? Á P…À P …B¡0( ƒAa …B`(…@!P(…À`0( }iÎÉùßûß{÷Þwÿ»ùíSK]¹ò´Õ@3Ez•­X…)üB‰NzRÀ£®]éÏL¬©Î*‰ê©Ö\GµéIÍQ©|n¯Úé“z[9k M /"Uúån¢oÎ3##pwº%!7àùàgh^@™Ò»`ºÑwP_y(p@RµBý´yjRújxcx'h¬àtAL¥=Ñ­9‘.Ä6giB<(èY‘ûT—¡èžžD-³2´ïÑÃâÉ1s]öêÀ0‹ŸMfJ”?‚”£Ð…ý„~Ûôñf©1üknV×g|¸¯lò‡Þ#S-5{W:Ü—9¾%5ä­)ô󿄹M6.ÍPüŽGkæg8’ÈÒj|¢Ò4~4ï0éÀY£4gÚEÏ8{ÁïöÊ!ûÓ÷ö ‘¾§x^‘˜Q…Ûï;‚ XX‚……` ‚…` ‚…`!‚`!‚ X‚ ‚`aa` Ø¿Þ÷î}çÜsèþ©"S®¶.zÔD+õ¥ƒšÖt›úQ É×€^]‰®Êäim™\EjhLßWÉù¡-ˆ¾UÕ§úÓB;jƬˆ»g®RTÚÔ) ½HÆK€ÒåR1nZ¸Ø«‡‡ü;ØÄAŽÞô‚fG[[kÉÔ=ælT û oÈKÂa~ O÷ û-å›Ç{ŽK}‚YÑ3u*Çr06ý…‘sËðqUWÏf8pÀ Ñ×ÝÇ‘3QnNN¨Wð+\f$±»³UWS]2i¨Jßç<[Ks.ð fÄäS•õH¡4ÃÁ­Tk¶;klsx !Û¬8§8­£º»ë'àb²Z™’·£'^Æü¯=s«x›±áDß7uì“ûˆ<}ÝþàŸ%yºp{d•Ð ˜×frH¢ƒwòŒ¦¡x^‘tÃP†»s~.…B P …@¡ ƒB! @¡0…A`0 ƒAaP ƒA!P …}'Éy/÷ÝûÞÿ÷å&kµô§«žµR¡Ú¹ª§ŽRKƒT®ÚŠ4`ΨezÐDkÕvÑ\G¥šéžèªšü»nµ¶šÕT¾Lw 5"·EåQ;ÛêV£rÒÕY¿ìzµ#óI þ+ÅJß=KsÞ€q”•‡âEmËÐz"h O‡ìÜ©5³$gÔôŽ>„;u­O;ö%tS¢»Ð†s] ©Ô°O©ø&ÄTšZªªéz­ú¨a a¯•[®/¼'P»ä<<G7Dœq!õÓ&*m¯Ö޳¡¾Cõ¤!ZCó¡ð¹=…úÄ+!Z(°wq_1ù1ngºu©D6nT]ˆ=î!B¹àùz3LD¯i¤3k¬©R¢D-[)Л>•é•èWïªðp%;“骾‰Úgͩ髲¹^Ð]pœC¨àt ƒ!Âó¨o9¨3ö‘vji&×öZâ\Áë™u Ø"]9u¹Ûm$8–°ý°­a›ÐûNÛ”®?èiÅV%79mͬY‡›tCrÛ5®‰9°–¸¤¼ÿý_¨ÓÑBËÐOÉ+¡82Û”ó˜J••8l¨ê@Ú JAOWV³#!îâ«KõÆ3YK:Éòê¬L#Ø5¬@y‚2ªÿ‡fÌ_Õáï4‰RT9U32Sf4Ô³-˜ÌåÓŠ î£ìÓùÌn9¯èÆÇáÊÙþÅò©ŒŽ¨x^•’ý?Ô Ç=|Lœ1}ë0%"ILu•PÙòØf<Ä”‡PBv#¢öqY·B¦µd̘^š™”êØ%ÆÕ"®ZSj#ÓÐxÌ3eÊÌîëîuÀ½yÿï·ê¹ÿ¨ü”+aÐËÅöÔy›2£d»ñ4ZÊoÑ(8ÍÓòÓAh3;®e Oü³¢8¤.¥F!â;ÍÀXu1¯Eî½+:G8Äåèü‡Ú9pN›½ZÎFMkÀÓð#ØÌRýÒ”Œb?wkrTÛRÀ£òÑo¡Á¨Xbjµ„„p–rÌXbáô~ŽR±e"\!f±‰X¥0'«ž#Œ¨|F¬"¤7ù&úzIÒjˆ~¬¶PQï¯õ$ôYømÓ–ã|ªbùö¼sg…(Ô­ì.gb4fFg@+µØ¸…YÓÏ'ê'Ó»RðØÞÃU*ñ÷ƒ.4^¯¾àiE>´¹Új$j$Ü£VÁãÀë5&…¯ÔÝ»g¹Œ¡­Imµ¨f¼éif@×5Ế?0!,’£ûô ¾´ä¾ì\„>L7bã  9y¾}z‹%‹ ‹¹ï“}P(Vˆ´>ÁÒÿÐI@ÓäÃlUp„¼ïd¢A±ò¾TËç»g ‹Apâ"Qr‘¡áT‰8½€1KT(fïêùbÊÚ„ÇÄiË¥o~(‰V\Urª_AÛw* {µ•iКøŽÑ<]ˆq ±ì+tüø¿š!K)¤ô9䮸»_â c3˜wGës ý/sË”o{3—+Q$Hz¥ËÃ<‘åÙª…Sù} ÎB<^•ûH Ìþ}MdOåUÙ„®Oü^ÑEäÉüqcô&-NoNOìbà‘nºÄ¤Æî?Á2Ú7oާBJòŽâÏNÓv¥7Г±üÍÐ,˜QÌ)ƒÏhàù_¾ÃÄõfþ«PDèáTWÁ»&«GÒ1ëÕäå²ÝÞÞŠ¶8P9tJë ¿lÌMËÂ/·]žYZ`Öªî¸ÈM\ê[dzXqÛû“z*è·ß&¶šâ×õÖ‡Ä(&OlHyþ½Då6"W*þȬBiù¶&×Xu½g÷Ó˜m|U¹Í‚¤§Ýïk8˜(bÜÄOç–/‚"93ù .¶§õçÏC5;§ò ³{Œ,¢¾Ò<ù²UYÒL‘f5ﻑ‡\öÛ{¸õ›¼½â¼#UMƒ\qbîS±©1¦fŒ*îâaɼsUZ¸rѼReÂï¿{cóŠ`z#žîTÞÏz‡ >›M½ð¹Îž7Bý$¶ŸiAÕk²†Ylk¬…ç0W(Û{ëŽ>BìÑE¡ÙCDΩºç†ÁœÂ}pevuüæu }CZvžù8÷räUp½ªíòD¸P3O»Å"´v·k&¿@P_Y²ák´%îYãñŸ­ Ê6¡p} u! …’ÇÒ dÔ·Ç¡pCyïõ ˜=½œ7#–«a*lëc¾ ÿ –޵SMŸÁa—Ôh;q›) 'e€ohŒ î3«,UœÅÖ´•&‰Ü¿„þŽgnúxá}y÷ÝwØŸùq£ óÒ-—ÀVF›”â|Üsªí0:V¦Ïj×AVrި݉5yìûcÌÍ)£ÜVšœê®éVC­¥1b\ šiÿìj“£¬¶éºjúC=#$¤\<Š ÿûŸŨàƒBÒᲄY—Fð/6G\šÆêŒæÀ¨BlêâòÜöÒU£,2ušïÁN[φæ2ÀíÝbJZ?EÚ?½õh—ø!ÖX:æ£ÕC¦®´BbÒ$)úÆÝîÄêFâoí K[Ž£¶ÞèEÑ)¢ë^´Ýf/œ)Í'`~v¿·† ×­‚zÒ6·×B«¾•ç„kõ_Ñ^Ã-ñÎÜÊ#Xë AêS™m@ƒÉCÚÉa\Ñ,hyI…ºÍ®[n„`žÞqç¶F¯×âMÅÐàáŸñÌdÒÓl!U’dÆÃîzNàMûÄb‰!ÖÛ¸í†Yÿà^sW|M_gHnDü[ºl“ÃÝ6ÁºóÎ^ÎñukYV®(—ŠéâýlÊJuï`÷U ¹­¢3TïkyGŽÇ1' †jP”R¨™C‚ªZ¯”‡ü±SV_Ôˆœ)$_Þ[0­…£Ï÷H9ªÄ1'ŸÒCðï±°ì\r.}¢E™}ÑJ“j|qåþ6>­§%lB®ÒÊù˜ŒÚÝi¬Žåʈ%PŠì…ox8Æ sP'ŽIë¯DvíÎÙrbM6Ñéèˆô ú€óm Û¬ö‹öÀò=oÑ}X, øÑ‘dl¢»³šT»Sp ™kj@{Ÿç4ë*ë'ΓÈ^{W¯ïÃõÝ-©àe­‘¤ü`™W¦ñ x^…Ð 7• €aÕ)ŽÏDIZ´*E†"…”t(1¤ÅÔµµ':“Hi¥n–ÐF¤®ˆ\[«H%¥[(î-JH¢l£NHËÌ™?0ÏOxúþ:Ò¦9 šÒ>Fi÷j7âµÈs'Eý·ÝŹZ±”«’¦äK*¡S¶ažsJö`›$^@ÊÄXÇ¥&Ï8b¾mø8¬UžÌ£®|uá"gdC*œ(=šÒÃûš_íØ¸f>Îí&‰Tv>ÃÛ’£Y É8é'kV– /r¤ZÖ¸W‹$oü€¥…SÉí»Æïfåù,Ÿ=«¿BÏ 4~?’ó6‡ôIøË˜¨îÝÄ‹žîÚ5VÚ&_Cu÷s5êÏe©p,·/ Ï®"ò¼-ïS¹?²ßè Z²Ý¸wòž#×ì A²T”.8ØXc„dŒ½˜˜|nùŸâxZn*é¥ù¸Æ†ËéËûZO”ÝÝß°³—ؘ¤[Äu¯yVŒÎY?Yh2Ø‘Híì6/ŸjÔâÚäʨ£õÛqÙ]gAÌ÷e Ô%W&“×úÇ{Å?oñãé• ¦‹Š½pM˜'oáÆh±ß4µÿäuU`ݦ‡Ð±G”†mDê š[ƒžE™Å+x£³ U¿±g(.ñÚ,°õ²Õ½é<6Wò´‘?¹mJgäÏQnÏ(Â4øi“ßÖ‡Ò"+¥²`À%‚ü º‘…(w Ùt­ð³Cç9­æ: ø·””ÐÖ¿ÚŸ¿HÛ—=mù48òÕ[ĉpïrÖ¯ˆ•à¶,l!ñ)•~¼tùì+™…'¢î•PÍ]‹AsÉ‘‰Ý¤°ª?Ñ'' u¤×‡BI!]~ÓO`zëÝ32ãâëñßÔ–‚÷håBÞ£-{ .ŸñƒúâÉÙ8vØE«UM'‹Â+Œˆšž}„ŒJ-©†v¡*Ÿ8€ëÁ|y"êISI¶36!‹SEv~4î\kËÉ~–\ÉPv"õ†miîeØ•9)Ñ1X!+ËYueÈ?û– «Û§¨òõãÆ‹ô»ï·ƒº†Äý”'6TáнXƒ5CK +•yÑbü¬…ko¸ã;ê0$MÓ¶§âþºc‚¾Ï#_r=M °6ïÎ¥íbÎB­ ñ$jçÆ¶t=†ÔÄÅrQÙ\Â'fwRåæŽèë/3t¶e€0ÌèìkìçÅ)’ZüY΋{#ø‘ÌÓü ,}õï}šÛÌý<\¤Ì›ódF“ö êíQ€O(úØxBt§x^%QA‘À ëÍä±}  H@*ç=‘P •€$TNÂ%Kg˜Yv“lH~ùáCA¶„ŠÃnl<(­ñžxoû‘¯«ú°­ò]ݺ˜&vÇQm¸\ÌFäég¼¨Ø¾x¬»;z7Õnr‹_œ5ö?nyQL9é^9™¡9MÎîN.-ñ6»z[³Â𬴉×ÉDV$“Æ C{…­±_zÝF*ác‡Ò$ÿåIrí›Þ¤¤<ô~å$ŽÊK9’ÑÉç‹M™üùYeªËsŽÌª°|ÿmÒk‘ÖŽ„–fžX·ƒ½|‘G?>‰“û[N•"ù‡î.›ÊH~•«¢ÿàe5ÙïTÕl}WÂb}œœ®œ•JþÃ"ƒš±x^-‘=±Ä0 „}3*\¸pñB €+ !\¾ÒÁ! Áá¾Õ%3þ‰¤•vׯ>{Ûm9ÞVmٰͲĦåÏâ܉,r“ªË‘ÓºÕ¬ Öãðè…©‘ålå¶@_±ƒIÕBoÞ©pê~éL…ªl‘Ù•W‡Læ ¢òŸùö¾ì¹›™½Ð)0½€r%q–®¦36tUê–í©z­0·G`ÆëšF<á˜ó«ÞsÝ7"¨…MøÕ¿ò¸3=Ú¸‹µ4Œth½ <´*óÔ%Ó±ú‹Ë•ìgêîÈÎZV-õl°3;lꏢߔ#‹«”ÊQ鞸©n^r›Þþ†ËUáJқ轥QÊ©é¹-éEåøEM¦&›8²¾¨[…©x^%‘A‘Å D³U}àÀ H@ö ‘ã‘€„/ ‘€$D¾槊==3ÝÃÏŸݱ(+qjªáÑû›¹ÝZšêñ¿tjqš°øìïIƒUbgw êZS‹ZÈØ•;± ïàßô¦ÞB äa%²†Þèængx‚ï“Jy+™ÜÖVçÞ§>  (—{½ Ü:—ùĦì¢PÕj›ÝöxÁ:Ép¹aÂﮌj»ÈD+Ü1£èØÊ]á$»Š/Ì#TêTú_ FÚžÌâ\ÂÍßS²ËçxÊýù˜ý;³YC´*3U¿Šu87×vÓ÷òT?{¿uÆïä¿Sî~ƒ= ë̱â(í¹,¢ŽÎk¨w_¿»X…]8cþ8¿‡ú­x^-‘;‘Æ0 „s3*\¨0C¸Â~.¯4„@0C0„@„@¸ou—"£ÇjW^}ýðY±ËFºlZ%ÞüOËÖm?vÛJGä¨N‘­\ì±×5åȦš_0LƒÎ\›¬¦™3ý΄˜FTüÔü¤"íƒz¦£êN˶ -î ⃢8*~€jä=e&ÄXCù¥sƒ–J%ŸÁÚüñbgzÈOæþêâ-pmxþøË¿Ú€£’g—š6eÅ‹X¯z‰ïÜ™[ÁVc«F}Ê5Ïð-{›%)®pïõeWÄ9¼»èT´^vÐ&òD—hÄmºìq©´¶}`œàsLv—[Bê½r „·|q]L:šrš[êÝË?&äRŽ»ã7{ÊñÞž Ÿ8Ê/ H‡º¥x^%‘9‘Ä0EµUt @Á0C€ Ánh‚ †`‚`†°ï÷L•5êë­Ÿ?~ÖmXódÝ_n/q±ÍúgXµÝ†?ć%»¬ÙI=åNüÐ{Ó±8•mÌpÏ‹ÜÁ}r*Ë郎šê8‹Ú¢RÉÞ .K¿oL0*yt”ØŠ®è<\“ÅμwXPâä'®dŽüRS$;SgÔΚ…Rmú fhÞýÊ[àtX§Éâá°äb·Ë½´&P.÷BƒÐOaðÊÔd¦€Þ²|蓊¸ùiËÊ [ì-iÇÌXV>ÂO!«]igi:²6©=ˆ»ðu°üxñN܄̬öû“âØ®^R,8 m°Q{ÃXu~ßvϺËç ó÷•ÞÇ?åo†&—x^-QA•Å cßËas@B% ¡€„÷ˆ$| •€$  ›Ìß¾W(™I¦?¿|ðÁ‹dDzuÜu¡àÁð‚[;2NÞ¸ÈΨÜ7¿1‘°½òÖMDçN†¾ß+u„\¡ÿಪz~©9‰Œà&® Ânÿ`3éµuÖ’ß컨ú„ãÆ“:\"ŸR%â‡Z™Š 3+…ÜÈ÷7»“›}F¥FŠÊ/÷a‡jÊ,'šÐ͉îHÜ}i¾(vÈ— Sò¯4ŸÁ¬.ÓÿS%¡ø0uQ¦0¹•rùCUŠ«x^%‘A‘! DÙª8p@ÂH H@æ¸Ç‘0€$  HØ×Ù_•?$éNšæç—ŸVâ´`‹˜ö{mÖÏnëĦ¶­€ ô¦Ýé²FíP˦s1a?Î5m¾~öêþg0›,e«dâ¾Ô›xȳµ4|ïCÿ}±©ðEOîÿHr©øè¢kC*°狘pœá¨' )mËowȤñ²‘ºk_ÄE­3/ðß芥î¥]ލ·˜Ü’8 ú¢6†¨óÎ7˜n'¾~3©Óæ“øìø ïDõ@¥Eþ1s»wÃÑÝ+ð¤üßL<ðÑ•\¹|“3âÈ“FÇݺMg†bê]¼SaÈùÔÉt^·µI õªÛu°5ît[åM£3›4£ü¼pŠŠŸx^=‘±‘Å D}3 ~”@ ”@pPá….Á%¸—@ .Á%P½•çÎ3­Ø•ñõÃgµ8mcï¬j§] ü½[²-$»m‘d[©¿ÌÛvk0×ÇfÓ šêü“Õ<"ÏYB£k¡°OØwT½TRçÓ²3/˨*HU¤YpÞh¢SýÝUÅjPå œm‹Ùè2ÜE!‚¸Uö:ÙBtXN˹Õî0œ!wpâŸ:±:µhÁ¨(Žç þ{R­$ù¾@:oA³ê^³Ç÷Þò=ý¶ª§úÝ5L1ȯÄêLN3ViN˜Ã4±dgÒd2HÎÀøVf~Ä‘ÿáSx;ëv=&×êéhòÿ ™áúÈT-t¦ùfQƒ Ú x^…’‹;Õ@»íò»èšG6Cš(­—R«éÚ­µ±ôX*±YY%ÝÒn}YåÎ#Ó\3ÔÒƒ•B_I_4•WÒ°<ÊRâÊUa}ûvþ„sŽHþ?PW÷°ˆv—ίPŒÍ1Ó±¾˜e„âûÑ©D5ö‘¸C¢ùÅgY¤z ?¼È˜†ºê»èYfxñô’öcÚÂþ^Âz=Y5BæÁ¯Ð¿œ<›çŸc¹Éq>GIL"zTS*ÏëH«í²Ë7oãQÊ oOç™h奉8Ý•YFc¹¶±~lw™éÞ—p1¹Ǻì’.ê<êßPZz¨•6Íf«Ú†~ËçõDÆ.‹fúœ?,ãVù0ûe¿HlþúÞ[Ê´x^••½O"]Ƹð‡B4±ÁÆD±ÀÆÆ¨ Æ†FP…Æd ·1ybV56Û`!’Ð,º|"44FÝØØHšÐ¸Í&‚…貎À¼Ó<À{š“œä>wÎ}ý®ëþý?Ö{^Ö·ÞP)Õ6ë›Ç)ÛãÙw¬2Q &žzÔÆ+ÄY;fHe¾’)éóÌ?Ð}Xà.iX}¯¡Ç>åÙ±õô{În$sçP{ãZõô›~ÛµkI+\„3Þu:щ´óX¾ß…gæM7«ª?4~£oŠMíDptB!²¦„Å[‡$s”Ù©ŒÚ+¸í­ªKR¬íˆnΠ˜“Ðç*é9Ÿ9%°ø:F™3-O£ŠÂYhSG›üŸ#ðWæL0SÇòÞŒLÆfÏôX‹7i›ÄËZ¼žîªrò~á{áRF{<à¶`ï|ùùþHþ-#ÖkÂH kÛ-ÌÙƒ#ÐÅ­µ˜€okO `Í4é ù ?OÀj4Ø¥Û¾>’ÈíDG¢Rè\±õøöâKëùU|»êè÷±$Kׯ{ßẠ”\R[-£…>_ú‹€QÄZ¸½§r"þÑvQÙ‚Îûf3¯ æxM+¤Ð÷ 3‚èÌ2»m@vûÏ×')ÊFQÑs$¦NȹžÐÚJ“l³;}ìûs>[Ó?Š&Åe¤ žU¯§V”‚šü2n³¯/Ž_±ší‚Bª±÷·ŒÅ«IbtrÕ;ÜëAõþSúæŠM7ãHçW™ƒy| ‡| ®ï¿é¨Í¯{ àáG+]öUß\ã­”7Œ g‡ÂPO˜ÍùP‹Ü,-EÁµ–Öî(ÐtxOA“³Fëµ@Éqy §°½<C¦lØ4†ÁnY<ù:~Ò«žÌl8=Q…k[zëf!/PEŽ£ŽÙ[x.èÕWüÙÝ’ ©s“ëÊ‚OÞN›OLÖÊæ2׎¾‹“ô6‰bžýðD„®à”ŽM…¡Ûé\w¿AûƒPFkxø¼ÊhÍ`õZÃÀ ›á‘Jæãד,´œôÚGãæ.yÿ ¯³½Òk"½&Þ¯àG¾|ÇϳÖט)÷òÃ>A@³ÏSÎEG&ø[&OöfXˆ¯j³.Zs@#Œa×EÛ¶º°F',<­œ»*'’ÈôPÅÁ#hžê7[Ç$[hÚ/D¸u¶vŸÌ5ËæJ‘r@ýå7OÒçF;œß\O–Â{îÌ€½îC}ÔÏ˸Zp6“lë ®ÞúÍUßžxŠT†Ž1rnÐåÉL¦ž5…á™¶Ö\GЕro ¡R„+±P\Èœgzb’=,Jcd2õV1Åî ër›ðÀ­èâIìÑÁ~ç*Öó{[ŒÝEG2$ßÈ`ë®’~c§mûRãþžy”›T6C;|L)ÄôÆ‹$蛨ôï/¿U‘†1[JæTK_ú†ÿ¾µPlÕào„,ùW(ÌL`¼öG™-#ÃÍx•ê­“Éíê@á"zö¼â²Ú·…Rû^VPÏ™­ ¢AÍÇ ’Í(e6!)¨RS] „Ñ~~vB«ˆïõð›ÃÉæ*8"ìK!¾Ê‹¤‡–Y?¬ÂÖÓåÏÒpüñ ­"7ÊÏŽ°¦å~ªAw›³æCh ]ž! |ö^ø¼ »ƒñO&™?uš±é¶æòKðß[Ëw ¾„ØÉ›+Ûž›–¶¨(WÀãý³'2ÁuoÙ}4‰½è³ _̶ӆŸ—âÙØoŒž×¬Ž¤÷Ûö2BøUÂÓXF3Â4ÏÙõÇ%ÝÕ;ï¸HöncWÿ(JA(?¼¦‹dêœÐ-øUh(Ÿ"¨äÃ)•Ï]ŠÝ_BJ³¨P´Aï3ll…e"å­0&m_€^ôFIÀÙC[ŸpÅÙäwÂ2­‡mÊØçÃfÇ@IFÚB%1N9½|¬ïźOÁËueè¬os×"~:"Ù3ôWAõŽ#­6&€¦G’tf‡üã+Ø™ê¨0 ¥}¡8½È«òž!?ˆ8Œdái~—/· ñ‡/`3b‹hNM£ß$å:œ¥ðž¤xk[c’Œãe“™5RØÈÖs;M|š^™–¡?Jª¼$Ÿ¦õ\KnXÈ´CeO¬¹;ÈAë.ù)¹Ì·Sß‘±Þ˜®–ŒÞ"}ÿ—âѸþT3íÐ~ Ùµ1(…‘b¶Ìu+²ð)eýeúƒ‘ÐFY¯ÏÿM˜õc;‡xتÌu2û1:ࣶ״ñ6èŽo®É†f‚¾RE¬ @髪†£¸)wŒò­w èóÖŒ]÷ t3¦Mc£÷퓪‰‡nKš^ƬëÅ©}æ0(¿8ü ©Š˜Éx^‘˜ÂpÆ»çyaðÁà`ÁAA0‚Á ‚Aƒà 8‚ƒAAA08‚ ‚ƒ 8‚ ¸ß¶ÿ³=Û÷½ï÷¾ï·—a~é¢ÎT ù*:ïj+Q¬ÐB?T¤²êZj¯¹URªŠÖ:X‰¯“'ÒJ-ÕTð#ÛæxWUNÆIòtP ³]¨ßtå.k†jlÀó[+k‚\ãÂ¥> ÞÐN[…—½HŸ(þÐ ^Õ×]3ó˜3†wCíI·¢#Z±šª›ËŒTCò\a†`Òv¨µíŽo—Nµ#¸iî2s01ÌmŒ¯.sQ™ií^Ð$5ï Õ3ÎSxuæ.-áÍ…ÙË=¼ásŠãú_F>v²¤ÿT 8ªÁ—Y '9æI¹ÁiŸ4U¶…îŽðiB%ÑŒ=n÷&Ò¸ü“XvTÂUFµŽUQÍöñU‚Wƒ7¥»VlYú>»jÓOqží­ÏC-Ð"ÿ“]ê#2¸Ý£1×à ìv k Ï×bʧ'mþÉöÏx^‘œÂ`Æ»ßïÁ ÁAA0‚ ‚` ‚ ‚AA0‚ ÁA0ƒ` ‚àþÛöÛ·oßû<Ïû<ïžfå¥_…Ü?òÔÖQ®>TU )´Ð½êU1gÕT]C¥úÖR-U·Á~*_‰*ÚèÁ*ù¶Ó;ÌŽÊ´Ö gª…ö6.ê¢ÖÑˆŠ£æVŽ@Å($8™ê®¾B»©Ã£Чo±zvQÁùÔtnÔîMËÙtªá!5 a¦ y&Ö'Gƒý½9'KR8*œ{æ«…Ö‡)}úˆ¯TÏ:Ú„Õå$!÷h£rc>™úvGÏÅý ¿k´¶¨@^™É‰óX{°ž|w-k€,| l írr'ÖùºÌu‚—+©à¹k¸‰lΜ¼,ÉW…_dë‹Õ³7z?ÊüóÎaÕñõÚ±5»5j&‚ ©Õx" þîRþÓx^‘˜ÂpÇwÏó…à…ƒ`0ƒ ‚ƒ aƒ ƒà`Aƒà ‚ ‚ ‚`÷Yû=϶wï÷ßûîeð¼tT“èG{U•k§›räšÛðx&ªè[ùiº­»êØQ é{úT¬«ÖÔ-¸'E6B! òà:šÃÞª£ ¡m`µQŒ¨*¸nÔ÷&Wc‹PÊ釸æê’§‹JŒk9Õd‚Ç‚ã<Ó:h' xæm‚n‘v&Õ+_[j©L}TMâžÂ™‚ùп&¹c4»$.‘4¢î1Cnwô0çÓâuÁÃgŽ3,©½«ÌFÖÏm9íínE/Òø3Ê!9N ËPì2o™iËä;㙡2×Êfð3°þ>Å&›høêÛo5ʾÅ? KjUøv3ƒßw [(ÏvÌW"W±ÏÜ©ê$HàåÌpgv^›,¿dˆáÅÅŸø¥ÒŸ:Ïx^’”a…Ûs.‚` XX‚ ‚… ‚ ‚ ‚…` ‚ ‚Å… ‚`a XXö«Þ93ýÿ{ï¾ï¾z‰ž‘ÞT¨$—çŸRít¶sg¢@‰q÷Á3ÒJ™nš;mÕ×þ††(xjëWÒÉÆ:+G!Ô\ôn*s*Êk˩٪¦«~tTGKô2mtW͆¨¨_Ðl“ ÐZÉ‘Û ª‚®©NOÝŒ\U…Pô8׈*]!÷3ÜÔ!©©/tt®¸ Qö_‹áê2#çí“Í©š¡_’c.|-Ü%Š™ú ïBŸr˜Û¶2º{\ß©÷éºQ{ׯ.g¼¶På[_k¨ÌRHN'”ĚΡ¬¨g†Î•}ìØò•Û#Š3xzšá=†ÎÇÅò˜¾-ÜS¶Ö¤û«ËV¾ÑБ’uTÇÃO"±‡Ê S~Å•EÌM™tÐ;SÅiwþĦ8y· °·;>B*M.óº8{0·ØŠɞʔÿ@éåÝ™ŽÏx^‘œÂ`Ç»Ï烃`pAƒ ‚ 8‚AƒA0‚ÁA‡ƒ AÁA0ƒ ‚ûv½Ÿµ÷}Þß¿çÙÛôÿ§½Î¬†u•ª®*¬ðöjë] 0OjŠõ£L70ßÖåüäîSm´¢š¢seïÛFG-ÕÑZØ ûTSÚéa¿¼XŽš<H“¯ ûØbrÌÑ[â¶P½2wS•HsÄi‡6ç‰@ayÚÙ‰»ïW/ …p[àÚº+²9 3zò8ྠÆ:Z®¡ìBòoá†ê“ÿûb} H™g¬W¯úph)·š9 \å8>Ñ™‘a£ž]AÜ@eÎfˆÎ—Šy°=nfôSgWçÜ“ãVC)Å!'³K΄úˆõ.Y„nÚ¥«=ÏY7wuɸf~> ÊLì ¯D¢Œ ·mE½ ~&Õ¯³z ¹g&NNs.=ŸIÕä6½¥úbN“r¨¬Ð«âpQ Í3ø×—>ñœJ>š‹?‚.ŸÇx^‘˜Q…Ûï;0pa ‚` ‚ ‚ ‚ ‚ ‚ ‚ ‚ XX‚ X‚ X‚ý›yðÞÜwï9ÿ½ïm}ê*aÝ5ÐI•åj¤X ÔI=´fùœ:Ù9&ke'õTSª…òtÕ^öª’£“݈ǚjBä[[Î娚ȳ¦.úÁ­NýBMêzúÓÿŽÛÒ\mÔÖY~‚ÂR¿vÕ0ËÝA°Ã£†–‹rA‰0D°ï‰¶4V§š{Um¢/Ü xxÎM3åÉ8ãu¶>ú'˜sðÜU!îdK;0•‹ NÕ3=Dðq í‚ú =!»s[ óP+õ5¶;N-²Ru±6Z),±½|Šx<˜á…“‹þ·²¶¶ÎúŒPÛÑwµͱžî˜¾b˜a‡4BñAnìÌ]–' T+(nÑõy™µŽú¤"%Û˜È,<¨wjØŒ©™ÿ‹oÃÍë…t8…¿ q“<Ÿêˆ•£Ï{^%›ÃöÎ’̯îTØCÔKÿw˜’’Ïx^-’”a…Ûs.‚ ‚…` ‚ ‚…`!‚ ‚0XXÂ` ‚ X‚ ‚ý¦³ÓùÏÿÏýï»÷¾7½ÏG©<~¿:ËÔÓA+…œ[:Ø¡sP¦‹†¬%xU%Sñ®‹55KÀêk¯µ:«¯«µ•Ë×NýpªRáËÕ7>™ tÅm¤#!{Èm2ÐÈRÐWÖ”ÚX7¼<¼Iå ÿ¹žjdÉäpr°6V¤Oô ?à4Õ5¡îdéZ†KS'zóHè«„òí¦R p*q“9£K§€N.:ZŽ^ üöì §{¶¤,ºNéÕa¹ŠÐú iŒòÎc&Áh3ĹÅ{·ag=TF½ÀS=Ê{ÐÌ1#wŽúR_¨ÍH¾#É„NÆÌ+T—¤'üfy/´PÙ+¶ ˜Áj‘Õ!…÷t:1Ã:wõbÞh-p‰`Ep}úØØΜ÷9QŸ›-9f¨w-ä«ÿ€„y=@˜ì1Nms™î÷î+¾ã«õäê›JÉx^‘œÂ`Ç»ÏçÁƒ ‚ƒ`ppA ‚à 88Á Á 8A0‚ƒƒƒà ‚à ÁApß½ÛgÛû¾Ïóû÷ì!r—¦ºr'*UÓM'Õ5ЋBùæ÷|ùškKíOMeú¤ÚÐ^¯2‹¨EÿM+*]xBÅnÚ—¾uÑ’èóL¨µÄ¹]µÔ‡<­ÙMÕÓ]côªþ̆ôð7P¼ðýUÁû™ºojm±f`:ôT«L#Ý­R˜k‡Ë3«…c/•‚ÍÇuM¬8wp)=C2”dÏÀtíwj%ݾðÏa\ ïéˆÛg\HY›“™—]O ÃX;%0UÈ÷Pç`iÇÚš`ò37#ò‘é)æ!,Œz&ûbÒgˆ?-¼* ™Â/2Óh—HŽ‘áA¯-†danTðYK¿òõb‘"&Ëù ªáZñÊújXÖÂlÌYZ=a#aÎÊYÅ»(EØ0ÿtí¯ðâH"ð!M)$#Rz^O ÂKŸëIÈ:T¼á’5n×Ú¶ñ2‰ÆÕO^d-´ Êß ©c@vd8û¶S¶;ÔÑ1_¿XHp#ïÆ‚,0åŠuã°ç‘ɬeG&æ”àL)%ïGd=µÌ7Ô犓¾hší@kx]–iÁ·\¡,âzÞ*P²Vì!Àæ¶²Ú8 á÷\»$f„Åàå!Üœ˜ƒ¤/4¦#V=gS¤Å`'+’AâÀá©mw­¡ŸóÇÅ0ÀþâQ€¬d¶ò¡"ÂŒÂvãY@‘¹ñ¢t&Ì r¦¸ÅhgÚˬHB¦!¯ó0µc扞#Æ“Yú\;´×‹'¥pð¡`Þ©N¥cX—4ƒöBÛ$ýütÐ!I]Ž$IŠÐ?ÂCË[ûz@=#Ë}¨„­IS½ÝðògùoEäDõ¤Ž?|õ¾ðÁªzUh…:Ô/=zUÉ…´á`¤8‘£#܇¿Á×@¡÷}²&h‰âoÁ mR˜ÁêØÔ¤Ž*qxpîLq4È~VÅçTZQtä¦2êì—º¾hb¹•¯Œ¡ye­¯ü7Ê%„!¼9ÓEÓ›]YôëàäH¦4ùaÒuù²—/n÷[¨ýüeäM¯7ðQÉnÛGh]r7;Œúwò:¯Ì@z4ÐÔ]Š© T8íÙTÅÿ€›µÿÑ~‚ô¬Š;r•XGß>- %1C·¬m=~€‚_¥¢Q\Ò3ž©R°©BÁD¡fß–_È“!¢F‚b:C0eÓ=¶]ÓCé‘ÈÜÙ»^vÄK•>ê_ÁºãjcÉýxÿƒÉ¨d.øÝQ‡ùG¥ß#I»³Š¿aÍR4¦vú¶p”P’/¡ -Û)ž Q.èTüxÑLÞt9Á¡ÛtË‚°HÓ°}«…ˆg*é¬hètö^;®)A{ø5zôb¶Mw¡IúßýÝaÐá^‰Ï DËÁþ§éªà=óÙ§Š ¤ø(M%éÇjÊÇw‘e÷á›òôƒ zè’Û×ËÕÁ^9—Ýùn¸jÖ\±r{å½OZ¹!¿}ßr˜>͵ŠìÜ}ÓúÐ$RÃÇwb#Ëyâ`fÒSì¼Bžê¹åÕ[ÈëNäXz‘kº®ílÜOiWÉÂóop¸t`1QW“ÚÓc$?WÙöµ[Þs©´yØÑît܇‚Ç­-éøòœzÌri•lã–õ5Ê´œvð5<è*ánÊ_D.‹˜Í0Ï}玈¿ùMga¯lž–ñ# smÈž(êÏzéк)©ÆI³T"Ö¡ ³ƒæ±ÆI 9woAD‡/PÖű£Œè¾V4UkÌý‰œ!aJöM3ud='º­d :¨¹U7v‹;û:2Úø‡‘3ê´ö•½vAÜï Å.~ÒÜ×ñ´;ô"£SQ†³­^PÐHœˆJDÖdZøé0xœV­á ï&FT,J·|ëì–¶BPݬb¾[ÁfÕå;í+Øocn2"„ý§EƒXÅðÑfÙÇYƒõ ÃèX¾;™“ZòÛœœ86Xf9EòË`¤}¡0Çí¼õ=üYpv­¯$—J/ê%öžHÒ9c€s?¹Sºj¸ûÇ*½Ãøäš>›OÃÞþ¶mÿÝÁu0>ºkÈÀ4²~ ÓÝCgíë*ñy¡žÙ%QSï\™Íxä¼—jŠÑ¬©Z*F¯%htRˆRÛQêàK8ÝçÜ» ¥ÕÃ÷š`vã0Nã!ñ0T4º[>ýn|×J'¯6c<öØæ~w|8yHúZ.ÆÓ8.û¡¤]'v Êmq6IÀ‹Þ2OÑsx1|Ù±Y ÄÉKSÆ~(*U[ºÞ[r¯ûÂP~ꚟÒ´°n<Ù}6Ú’d5¼œ‰Wì%^¶äë¼#¡êÅ<ýo>‚æEUú²{W áo ŠÉ4Å·R{æö9å¡é¨è÷GÍáZ!d´P÷9‰¢¿ÂhˆYIµEУEWçtTØæR0QâŸ%/À?›%2ÿ¿,»™FÚ x^…Ð;Õ‡Àñ¦o!?Z/^RÖ›yÙ=OBv5%9tèÅä•!ݲJÞ_r:Qϸw“ÉX&…ÑʲHytŒGLVRŠ8K •sö´ZåÞgÿÀ>Âç½Ø¿Á³R‘ÒÚ\5›¦¥ÏÖ¹>ý‚)é§616¼z„í“¢2F_µ8áQ¸vÆŸTS9kþztÒ{yܘã-òÂúvŸ;òåU»0«±cjžÁ']d9¯—ºh\ó”Hb¦•cîÊ“ê* &Wd ~^(L ×Lg§…Mç¿åÙ¼7„ÈÒ²xhþ­‚αŸÎq䬭.›bÓ%è¦5¢VÌRòdÔ‡Ný‡](FÕ¥ÂÖ ¼$Zç¶ãŸF§¼1Yóy «ËÓЩ‘â)œSˆGð2rqD&ùµõùä&|^ycS™çEZUÅß ~ãj ƒLt¨[¥r§;5¹Š0³ì|¤ûifî5~K[½mδYE]æªhà ®Kïü‚Ù3{º]Sê…H×å"<*_#²PÜBM“UѦŠÑùR®E±§É8J”¦|7­Ì×4Sµ»Á†›WÛR—{Åï¯]!ðô‰Exõ ¹X<ö]4aö4Ún68&ä/äêÌ+½ßÕÄ–Ô¹¡)üqú& “»™×]i 6ó§CÇí3á´›Öa¼eª0þÓãïEü„¾ Zq‰¡8ŸIþÞ•ÆWpßõ`&÷·ºÅu›5z¥î#d™—·b½ï€mÿëóSø£®OÅàœ½®|–ÿ’ Åɨ%CŠ÷A–¹±ìŽ"š;3œaeí†Èݺ‡NSÿ"›Æv ¯ß,õG[Ï¥žm*GîÇ«ö )/¶BKf;Aܘ4‚øÐÏU„\.û‘Ô¯äE8›yüÄô[¹1dËg`)ö¬'šOñú¢pŽtßÐ*´Â&ÛY³÷R·G–Ðûr¾3QÍb=‚ÒNDr»+sÊ-Ý×pYé©Í´©õVÍ*,ýÚvÐ/[`Á'}.È:÷`¢üPy¸};F‡óùèyn*³÷Hg`[á¥äùÒU‹Ùøæâ·c›YÞ(¼¼÷1Ùs’‚ ¹ôÿ¡ËºÆI™¿ñ&3/EeóÇ¥uG¹nßœ‚ÑË÷qúeãb4 Í>Øõ˜²C!ÕØ®ºmÁ°³ADÔLnGœ1·£Ç!*¾u £DwR0/hÌÇ_Ôý1æ1¥MDŒ«†™gáN¦þq&µVSîéfÏ–ÖÄÛÜýÕÑd·úhÒÕ§áHt­ÐÔQ…CbìM¢?4K¥Ç>÷O?Mk&á¥^ *Û£•,óc—{r›{SžÒl†%*¢Éò(>@Xø…a~Cˆ‚à£ux=cà^W1’¼ÝmØÇ~ð{ïWó®gm_Œæ©aëS,Öeö¡¼)ÿ¥^MõË[œ„ª‚þ¸˜ã0“he¬”û,ˆ™)j§{NH Ÿ¥JLÙlx–ÓGó( 5 nÁÝƒäˆæQW„ýJ›}ÿ2SRMÁx^-‘1‘Å0 Ds3*Tü"Å0CHye ‚Ë+! ! Á Áî­r&_²%í®Ö_¿ülXþ ;ì±ÛN>ÎVm³ü3É‹]äÉëü_Ô»=ßXm·Fu‡%.ï ìÜ5ÐoE(·eŸT/΋Ê`~DG¡Úr±ÞL.—Š„ŠG§ÐWé|™â¤íeð ÞI¼Å…>Ý6ª;”2_amÁÑÄï‰OœãsÀ±“-ú ÕdÓv`šÎñ¿]!/h(Üè¼YõJ–Ç”+â¨ÉÔõp:å§7;\¸rîå[£kwí.ÕÓµ‘\:]}„ÎD"_¡»+²aFE ä_a*¼ôÆœ\Ð6Ú,…ŸrXŽO*ñÒ¬÷–£zGjìÐÇŒ“Ò,”›ÿâB×VRŸé‘®[òâåŽÍx^%‘1‘Å0 D}3*T¤0C0¸" !商†`÷Vù3?¶W«ÕJúùãgÍÞí°dÝw»lò_V­ÿÞvØNô²Ì÷¶>­xõI¤ñÊ6ì±ô´Æ©—Ot÷äïpÑãµ»ôïÎÙPl(¨Ê)Ô^o`ÝtÏäTN6± :ÈúÀ_pïÜ>Fá<¼¡ØàdK~€©ê.f8Zá¿ÂT‡ò:É[qÞ0]7{\ÜÉKÑâ·p—Û‚Ÿé' ª© ©N"xËBÕ׃֗½è]Þ?/«’XÑ['1ùíÜk(BµÂ)-¦³‘JÁD·ÅW3gW®¹îÙ-ã©F÷l–^4ƒ{J66©°W._rª¼ÌRŽ`ù·y‘æAìŠÕg6u¿Ç–¦êýõ¾¿x^-‘1‘Å0 Ds3[¨ø…!‚!À/ ÁR^iB B B ½õ¿Ì$±¥Õ®´úùåÑ¥ãÕõ(뉤¢¦Ç»hã¶9KìÒ®ÊwS}”tê~ªDqÎQøVu¥¯ÛH8o]œ'ÕGìüO¸np‰ÜˆÌ}ê‚¡€ÄÌ{RkôÒgg*ÿ•l×ÓÜ .®ÿŒ›¾Ì° *›Œoœ'3T5ê .«ìîL æ¢Ús<ѵºAË*œ£woûâ|d\[cPù˼F[Ùü ¦Ä\]glÜ¢î$¯i6ªsøå^ûòÕ'“ :¹ÜëÒ3ÚÞçå~3{XÁ6;áî¹ÿ;bc‘Ãܳ}U‡vnîá[UˆŽÅÝК±‡ýk0UPvÁþøMá}|÷î¹½_oÖªxûÞ‰îÏx^%‘AÑÅ „ùgrÈငJ@*ã;" •€„J@B%TÂÿm^g $Y–ÍæïËgÅægÛaÓöÁÚìmÅN6-Û¢6‰”aÉ›Ý ›] *ÕL<¬/pÓëœð˜BœìôÛÄyÁW›ꦂNï•åw¼•ÉÉ“þWÔ )\Aå ¥ÔÃû¡oƒÓüöÐMMpšá¼¸\.]_·Ë»~ð2ÿ‚D‘ŽÁx^-’A±Æ „y39äð*¡* H@Çw¬$ ¡€„J@Âû6ÿë  ›ÍnèÏ/Ÿ {>Ã+vx±dÙ.{-—nÛnkä+Ù¢Ùð æáþ!w²_~X':mR?©¬ŽA®Fý¤:Ûé‰s'›¸¿ÕÕà(BûM qe/T蔨€‘.7¨J2>þ-ÎçéÒðÒC,…Í67QƇ:W0 ¯=0¡Ö*eD34MG¯K{‚­ƒÛò*_‘]šA(QÿÆ®µ™šÊ÷^èäÅ*¥g…çgñmkþÕ—ÄANš*¨îg¸¸l}äU³ òç 师©\ÿsêbueôÌn¹ÒKê=NÏ_^5C˜ñ«NLéæf¿O&ºÁÚ}Å[«ƒ*5—øSØ«­?ö†ÞÍx^-‘1‘Å0 Ds3*T¤C¸Â Á商†`†÷Vÿÿ™?^G«]­üóÇÏ^›{µaɲ5«vÙWK¿Ùn{¸ 8xRŸ¶‰ã/• ÞÍmyç¨d;ý©k³N]Z—‰q[¡sz+ŒÃNî'ìÌ·ŽÒõÐ*¡Z©;<í ÜÂAª3jRhþpCGõÎÙ¹_¦) Ž:õ}¡Ô"«ØEî¾l£„öMpC—=²„ƒ&¾nÚI£¿¸p9;ìEî4|âx3ÃÇuD¢Èåçþ„²²‰¸‡[2ÍZíuÍ–é9¨áã¼çöÝG&½„ز“'Þ@¯¡‰Î˜†i½¢”HÉMª+W±sפrìÚ#ç„©ô¾ÞJYLùv¥wJÊåÚõŠ4/gûB‡îÕx^-‘1‘Å0 D}3*TüÂÁà`.¯ „@0C0„@0„@¸·Êe&ŽbI»«ÕÏ/-;>·=¶ÙIœì¶nÍŠ­oöÉ÷²ƒìɹYµæÓ‡wþ37Ýv'Þ|ѽ/›`Üô&j&gµÛ/ï®›Ta.Õ€·¨¹Mç^öD^ÿ¼>«ÀrðÖÐðM°‡WzÑ<ÍjtVX y©[Ô—˜¦RqpÂéõÂWç:4Ácò#ô)~{91tX3½”~-{\Ω¦ØÎlg(Ï|¯Ðªéؘ³ë8`úëµTtŸÚ©NáàóÉd‡ËGi¹P*µb–nùÚ\.jâTzÙxÍ3ÕR+u ÉN*áWÕÛc–Œ×fpuXÏØ| çµ3Mw¢\Ñ›-P¹ÙÁéD»‘N¾ x^…Ðû?Ö‡Àq—Ϝ—”ÑŠEE¡\Š˜E’ËSDK’K‡ŠgÓMˆX’xUN‹×”´”åÎ’âatA “JÉ*©ÉÒAëœ×ùÎç÷÷/yÉÿ‰®®ßk\þjÝÔØ»?.c×?³x%§ßÌîbìJ„Ž–jîj2Âþ¥ïaÞ‰³ƒÙé8£“ÇåEÉÎÏËó H‘Ÿ:Á!ïÖŠÓàñÌ ¥Ê}ɘK]†¿¼HÃ(ÙË /Õ{)4Fy´14gD…™+¦BR4:-&s|=yØg'拇±«Ù_&ÿ Ë]%ê¬Ò—–£öo;~pK÷gèŽ}Ò”-ÿ•^‹´É‘³ ¤­^A½Ëfì™Ûï"\8uýJ+òøfc¨+Ý*r6æ5°8[ºš’…ƒ3è¾rv‘Rã Xû좡ÃãÙÍ7sÉÚïýžYòÃZ¨÷5¥ ÚÓŒð:¶­š^©ÙIäÇíx^bü3­&¦H¾tªѼ}Û™ué×X¸mØ•­vó9ŸkFÖ‹¦*­üV¨+y½Ñ H´Kk7aÝ—! %S g£§í.x߬Äz­_<%&êD¨ÌÁ7Ø­‘“O=©é¿@JÝÍ ÿm¾}§ã€~Jê%üî\™¤;P|C™f4oWu×ó}~D<…›ÇN1ä¤<——Ë'¹XV¶Ù1³ß±©¯¹F¹Ì[‘ýu1U¨¤l6#tMȬ˜˜]Â+Ñ}}>Üð?Ãe5VXåóRcø)†{Ž EllC»u ’ˆ~?bT~êE”¸IC°0YÐHXë€5áû <¹?Å’²êâ@̶}ö†EfNÙ4{ödDÛv›K“Äß}É^“?ûP5yò¥ú±VvüS–"¨ÛV¿çH†BVŸ§¾æû½¶U mÔ:‡wúys¢ßuµ¡`Õ«IåÕö ŒG•óÄzþQ¾ 4¥è©Œôž¶ßhúÚQOˆözó{O£¨õVIfîjU.Wtëbê¾ùO$*vѸ:ÈFgµÆ*NÿÃq}Õ·WK­>Ò™á)"òvhòŠ~¾ÂÙèÎE|:ÓǂڽyqLæ©ïG1W¦ÉñíGPÕÆ,iöIÍÕêHS»Ò(|Ö„nlZ ns¥¼Ö6pãî’¿…ÚûZÜüø•„UË<†YYñXŒÃ’Ù³È8o9ï´9O8h[掞‡R-¾¹kc©7ôGoK¦6éw•mˆðŒc<³i0©|È“ÌÇš¹˜ïéœÇ­ƒíi(Sò£å½m1¿Ú9Ob»iw=¬åW\ø“;®ò~÷h;ôÃn«j*!ª–Ë76Ûí…¡%?â–g]H‚bFÏÎÄn&hd™;µZK¸æ&ÁÜC<Éü`Ÿ©Ä_;ÑοƊ©hû»…(]Ã4Ž¿{AïºÁ=3árùk8_î—JÖ¥“;820Ý Y\Öe6œè¨#1=«ÿ[_‡²r´xÖŸ$’𬉋¢éÖ,–)/bšUv¨ð•Zz Õ-º¼N¶÷ám{¤5gÚ¦0ýŒ‹ëVLj¬÷Šš&4opqF§2e)¹ÅÆ,>½¶oÁ#§v%¡qšùÛojðùßî„-ýböÞõ· p/$();‰FÏû‰LÛ±f9U–CYd›{X¡™,màÚy…n*¬ÈÇy¡F© 5Ъ…ܘy¢Gþ‘Ü -À¡ßñ9ñNŽÖ)æÒÚèR>„ÿ5Š«ZVÚ.'®sx·Ë:þˆò©`²~º„èØ˜ÛBÈhâ"¶ÊD¨äiGàðâAáçÖ’ÜüÖ€¢žÝÉèGšyDß/÷>?š>ÓΧÆû¹&Êëgµ“U#f°Ï\Oȹ˜zŒXÿÂ|Î9Yä°KiF­GÕ½°Í܃¾ÃÂNœû°¯ß×…Åìª Î)ž¾ŽÁÂ74õnû…-e:Œ­6ù]ÈÚÀx^•V;LjÛÝÀ@E(DmLŽXHCCP~±±ñÇݧ€Æä…è566R°5±= |hl ˆcc£…hB£‰p PÄûíäå5·»«Y™3«sÎ1Æ\œÿüËGû‹céë—ÄÓ4ó—€ÜØ4»@ßExð¾Û¡éõc ciuÎÕ½ôJJbw"ðt·w,m†Tÿ;ö#C3×· ’“dÈ(` ûsTû¿ëáé<ÇóGî^!,òàÂ&‘Ƈ+(OU“œÂ =¡àMAþœ ù¡:uhC(†m*÷oô™‹Dø‘Ÿå!ªY^eý×ÒsUåæ4H^Óðm­EugòÞú¡MÕã«$’±ø\’ŸíʨþXð>­”tR»X×JçÞ‘è “?àMB•ŒA™kõÖpmËGPõ‡ÉC\š¾³ù(Že6•¾¡%È+*ªûØÖ†—lâ¿/ðnrÍ4[JÃv¿×L,^·"HZ‚÷ x`‘EÇ1,/•OË`ÒeRm…Û'Lçʰ„¬Å:çDƒé¤Rs>Ô"p\ojÁ7~a¸G|¦áC›.[VÙöè*;‹¸Ôû ß :¶„‰è~ùUZ1¨PmxþBIMC/è\&ºomÐd*i“‘ÑàêìÂø9GÐÝkÏÜ1Ø†Žª“ùFqÛ4ôgƒýÖÞ v¨)jKˆÎô›ªmǼ½Äß1vŒåg.œËÁ¡_x¼°>¶1PžOHVß@ôD¼†OH~|d|ÄÿYà ·ô¥8ȶ½zóTOýˆ¨_,+­ªë‰gº£/°öËžýÑ€´»âÿQGæ¶5ñ÷i¨!^18`>‹ŽÂeú”Èk,܃K*„®°]ÇNLSª¾üwüd xòD‹¡FT = FÜg.ëÞ12'ŒÈ&‘_‰?,Æ!Y jŸ‹ÒN¯IExT×\÷,W¾Ëz1®z[¤§ãÇ+yÒžú޶.nl­çFЕ´b&ºwü§,xT¸vV›¯þÔHîÞ¶|OuîF´^Ÿ­ÓXA§Ô~}Kàì¼¾Î|ƒî÷wi^á i—ùj'ºVý ÏËN}ŒEVªèã*o“ÖKxÐDOJŠãrOê7qêÛ=ãW¹}Ø·bë["t-Š\Ä!n˜Fæ~bTÛx’ï^_ 7ê ÃàFó¦è#‘t ¼ƒV3Žq®‘o²Ê‰¥Wm˜m«o¬L¢ÃWñ¤C‚«Í8ÓZnñ¤b줭IˆÕÍy³Þü¡‚ ›¦q™âÛçyx\š>>ýFçO!í;ÄU{s¾ÚŒ›_!åY öL͵YÓ¯~¬ý€‚&-ÉFèï‚gT°fžœU°À#ÄKe¬Q¯ ó4¤¤ý*< Ü2ðÿ1gé:+Ñ@G*Œ8-rqlh|ºÝõ|¨ð|AA5‘´ ÎöªDÆ¥];dûò©røíSnNŸ±£· G* É×Àèêi]}\“×-¸e5‡4 2õ¾ó§ ÃÒ÷ü®Óc¬‘%[éz g¼–Î-1º{¾Ër#¶9ßgÔ6ªÅîP…Þ¯Ù{EúØ'Wß±8Ž>Ý¡´ÎZü÷£lÔâû¶‘¤ó¢™$'†wï)ÛÖå©…Û(¤©˜?5÷²ùº‡µ¼g{&åÇÌÎ0¬'Íêm8v‡gœh­EÃ4ô¨;2‚uèt;iëÓr+†–¦f4SpVÊù]A÷’Mqaƒ#gìÈ“x q=f1õ·®Ú†~Æ/—'qeŠvhïZ׿ÃPÉÊ3wU ’£3deÃë†,ŠË­ø»æƒ«L6¼ÊRž’Xcÿ,¡Ú0oú/@YÇ€ùx^’”aÅÛs.<‚…` ‚……… ‚ ‚ ‚ ‚`!‚` ‚…… ‚ ‚…… ØßÔwNͼ÷îŸw¿^FÏ®ÏSÐ\55õ«#Ïž&:Ë7¿ÞáÍUY}mªµB%*23ÔÙª«ÌR3¥T7ZhG?RÑjQ-ÒŸR9Ð)ð›s}êj28ÇrèœôjÈÄHtó©¬TתêÁoø{ pï›Gw sGï8N™º(ÀíSÇΨôèÌàÞé6ÄG_3ë£ÓEuÄž±¾pãd ›á9×ß¡q‚ǽƒ~_m4L›S]ë[QPÞ€^|y¶Y„q€»% TN›=Bs`ú{ã,ÙÛeº w‹ Ž“ýŒ Õ Ž"¶YÁSgnA· ‹*cÞånΠVTnêáj@:™pŒyvptÇÉTfe¦¶(‡ JÔ\yÞ'6ˆ-"£ù P÷PŸp¯ùM%y¢ÖÔþykùþ;<5`MÑuØ2±ßPyÒ)øˆ\ðŸä¶·jcð:Wþ¹C÷I¾þ¡Jùx^‘˜a†ïžçƒ ‚ ‚ 8XXXX‚`!‚ ‚ X‚Ãà`!‚ 8‚… ‚ 8‚ îÝÝÿyöŸæ›o¾™y矮ùÙÈÑP‘Žª+Ö§j)²È‹ôE¬«š55“éI,ÖŸzjY¨‘‘¾~ôÿ¢˜ ¯†¼:ãßi®2U"­õPÆ™Z¢P¿dŸ¸×*½…­­JÞÌצš\TùD¦0´äš‡*Ÿz|E-U‚×AAU`çZÙË×DXÎ5 f šrl‡òö'ôUùKoä¬Ô±܈œX7<0èí‡o6¦nÿ“S¢b“Âÿ´±@ TŽÑœ øLŽ ðìmsó@Åžy”™AH~ˆö¶¹¨òéf‚®”h‡‹~Ž£mQáà?°‰'˜þ SÔw¬ îJÆ–¹·•Í-â]„å®—½è#ag:¨³×lÖ]ªmØÌ’ixØžÄð@ÏéÆA±›sÍx—¸÷àÊX1ž¢ª1¯=\òív¹‡ls‚®VÇ×''ë}ÊD=.Ö –Ý?k¶¢F÷x^’”Q†gÏùáB°,,AA AA0A0, A0 A°ÁB°0 ,,, A,ì×ôNoæ½wïÿ÷¾yš?}£¥¡¦Z(Ñò´ÕMnÀêK#v/r謵jŠ˜Gº•šìgªù¢íÔæ½®ƒ–VfÞ)”1fºj¬‡\u««¯’b|«¨-Ѱ3U ÅÕ¦:rúßFoÍÈÊÏx¶’KlƼEwÂó Ï ëÜJÄ'ŒW8r2»jೄ/WËÆT&/Ó¾&óI{(vjØžê"]|3¸âª(¤°\¬Ã®ŸOM¸¶Œˆè›æ*[¶gµByHΆ…Úv¥Ú„ŽNÙßC÷N®‘‡jWŽ…Ô•‘}§»Ã‚è@¯·t+VÏwS.¨Cf‡,—^t¨æ$åˆúZ‘Ñ¢‡.1µüâ>´3>g"0þ¡n(eúdv4²”uÝç.n>Õúø{ÜUl~AÓG)DcÎÙ…7õZ%‹q¹ó÷¸ÿ „›â{¨3WjGT¢GϨ;Å!‚÷B'±Í€×¦Îõx^’˜Q…Ûï;p!‚…`aa!‚ ‚ ‚ ‚… ‚… ‚ ‚ ‚ ‚ öïÍûfæÍ}ç{ÎyóÒs—:n4ÕR o­]-uÒ^u«ûuÕ§rVU0}*§¤§ÈB%š3ý€)¨*Q×@[dOқƚi&Sæ?EºX˖V…¯¢È•|Íí¨W¨Ô†#Õ/ó ìcÑtBEÑñMTV÷-WæÊÛ t›™ÇÊŽÚ†õ2ª~+° o/cU슟®C§*o[×3»‘b©«ƒJöÏ¡:Ôõ€B¦¡N¹N(~j¦ïñk\|lψûG¯:Ɉܒ›ã[Z Ï:ö««5ê¦9 ’k;²ÎÔ6OèO´i»¢˜Ï鵊¬#Ú·ò¨ko®ÝãçÀÛÌc@¯Õ޶ì6:[Ó [ªT.Ï=Ñ­"k:)½ÌcκPepùÍ¥ˆËÅw½JÊ$VV£ÃäãR×Ì"$çƒ.º6eîLè f#§ÑrX'hxv‚¢Öç9·‡ºÑ,L‘~Ñí·ýåœ>°Fñd' Ö !½døgä4ïìÛJ|öº‡&¡‡WMÑßò^ð˜ÚŒX…Wń׼Ñ )l]´\[¶ßDãâéÃ3ÿþDwÿ Âóx^‘”a…wϹð` X‚…` ‚``!Xƒ ‚` ‚` ‚ ‚… ‚ ‚` ‚ý¦:MÿëÝwï×û_ƒçK¿Ï÷»fʵV…“¯¡ÚêÊ3Ï÷øí[Uµ”«­~85W¨“|{ÑM}y(}è UCª7ÉRNUh§(rû(|9)µP¾}’t eÔ)±RM­…ß›êú$çÊÌ®š2ó,ׯ#ýš¤1ùsÎ Ú/­‰ã†nÆ'&Yú£ö¡ŸhOª«2nSh¯Ð,ảAP³¬úKÒ"8Sff¨B=T5—ü“eBöQì&Âa` Îu(®*¡>ÛÇ’f6´ŒR±«ç¬-ž (2çFÞ†9”MTíÐÕ5'1ç_mp½3ϿǡÃ3(nÂNt·Åô…ë¦@«ç ”¬ÍL±‡w–°ƒ„tÈí3±e¶‹_Î3ö·B3¦.ÁqÑÍöhöÊL¤ñIè,ðJ`Úñ]Üë gŸ~™z‰zÍl`gÖð—ቡ:’xa.wýð«¶ûx^‘˜QÅg¿ïÀƒ```a1‚… ‚ ‚ ‚…… X‚ X‚ X‚0X‚`!‚ýÍ›÷çž{ιç½Lí§‘ý]5ÔÔJŽÆz×UžÎrŒ8šk¯¾.J4ÓÒÜF…2õÌ@¾"}è•Z¤OýÀІÁ×I™q`mªT]=MÙ'ì#õGjbÅ 9'à]Ô†š¡î¡žÂ\§ærµÖæ .Ô*NÇøZXOœŸôóP Õ>l¾y¨«_ë1A+£¶a X;º™³¾è qµã®Ðô˜©6ÜdôÞèpêÀv‡§`:ÁôÔØ qpÆ·‹b€×_µ'{zç(øÊ™z¡Ü¤L”Ñ;‘aÚ~SÒiï “ÛεžÆ³‰ÏpåÃÙ†§ÎšÒQ*0¥––÷ªç*ÑœiàR¦=’íG[’­’®ôÇøÜž9€¬^hÄ\RhÓ?㼤^˜=YtHwÊ©AÞ°ÉÜ!SÊôÀŨ.é­áøýŒ¸ ¨vÑz²Ï™©„½k_q‚«ï7¹³ïPIÿC‚úî|†œ–Îx^•’i4Š…OΖƒ£dÈË]^·Wæ:2gNÆ2ë”ÌCD4HÆ„Ôu%™Éá"Q‘)™Kr( © ™3å¶Þ[ïÏû÷öŸo­½öÚöÞvéÿ¼vÏ{®ý8ƒYOO fÆêš©Fºv)ù§¢E¨ \-®UÞ„wXVmè(„L?7¾öfUð²ƒW#»ŸžFâÖ랪­N曑þµÃÑt2¯+®EAâ$X‹åú%±`¸€e(Ô nÁ›G«i8hyˆHƒØx®c~ëM¼Ô 0G·U Ê„”Å^Œ÷%=7 Ÿ¸}m µ.›”$[œ$²÷l‘l‰!úŒ-Èö&0²p¼Æ¿0ÔW«… ] ±Ç=J+ŒŠ³*B™½pœ÷ã÷l„ixïr]Äñ}&¿:ïVǨÖü剈„Í<ø&I\.¬Ê¾ 5Åè0÷œ¤£š¯GU$b„Õ!³rpÇ-)~ãÆÁâŒ+ÕŸ±6eÅüC BÛ™„¹1V|—ÏæŽÏ€û­¤¾®qdíšQ¬=[ÞÊWÃqÉ9šØ Z™wVl©aJáÔºˆ.èk$cº²Ã©ÃÏŸœÑ Õ6pÒŒÜvr:¢7^¨²àxmà©P\Õ}îá«,ù(qÜÉ¡ –Ñ{MDUgóýô]J¡)ín báÀüÉ<ì‰ÜÇ89†Ï3 sd‡^WÍ€¹jha‘$(Ncô˜A›ü›à4·èRΡ‡U¯á´UlºˆóHw³sKfÃÞÚEEKT³J'©¿FeYg‚wH®žÈ†m†y¶@©·ä [A´ Vsœ"+ŒÂ?!Û¼Üo¦ø+$G¢!¬âìx-¾á3•½Ä] ¶ThoÛ &ö”#tpæJÕ`yádý#¤>]ÔfzˆåsÅmU Ÿ(¢hüYy¦¯•°’·;6צù35aÝYPNZüQ—sd&êž‹Ÿé¬}í~Ø…æ…G 0@O:|qîæJfí0èoÏÌÆó£NÒŸ–±È']O)A¡¸³VÛOÌT§IFmA§ª›‰Å×EûB‰7Úd[a’(«5’Mêeª¾ûì=b’x—Ï}€‡‹‘Ültè{>Pà ¤ü%þå ÊÕd½®Bóù¨ì´8Þ‹i>„˜úf·0Lë'5™¾ã œX0è’ý§¦m|8„®i=~Šêz.rS8i)|üå`¾aO¶njcyxAÍãxê™:¬GLM°É1êŸæ k-ò³ ˜“nù CU‡“Ð/e¼¿¥ ü'8;Rï‚Y¢†.—·íÓå´ÃØÚÐßÝÖï’OaV1ä%Îϸÿ¼õƒz½z`&©ðÞôãUôÙÀ£“<ÿÇ©I'…fÜŒ³2~¾ Ыr2ðDiÝPž ¼V)±gðíeãÞþvÐÒhß›0+™Îœ+‹£J”`ÁHÝé²îÀõëNÆNrÒ¹›¾£‰O;KmäÀ\’L®Cÿ¬3%ÅTy¦Ïf·Ò߀a‹ç´Ñ(*ÛZâ¾<Ä¥–{Nü`Éhï0†HEê}²>¨©u•B3iU™öFè^wçŽ H´R¦}Ëa©¯ùnô×¶E{fЗ–$QV–ªL1¿‘,ȾÝÌóŸÎñóÿ1BËéþaŒä·Çî00þÏù à ¸a …2þ€2²(Œy[¼zƒæC—ù†ãa¸Ý¯ÈÈùëü"`±>è|' ÉÒûãÎ BÃÙ\F’d¾B·4é)j\t.dS×.¯b3ƒ-+ŠI© h\Úè‹Z€ÛÆöE¬QXýwÂÖžÃþ>¦v[ß/nCoäR`gÙ2u£—àŸµ5Va‡ìÓköì;p÷áˆÝw’ðeŸÑïðœ¾Ò1Є‘¿š;¥£l½¹Cº^!Ü¥­h¡†Ÿ•~ îßM- Ï=ðxÌÇL‚;(`åØ+!%4LJȖ·ãÁ7ä;2p‰øüGn\ v}Õ€2­ˆ/ÿ›|Ф¾ x^…”ý;ևƙÏy|#ž”ll^z$iêb”ÅM‡å­D$£·)‰ˆ=­°6ŽDÞ¶–zòN©&…lÅs8Ék)Õ*KÒ˱HÌ™j®óœû‡û×ûºîëú|cþOø½ØÔ ÿ‹9¯¦÷Ý–ò_-;¬óÚN¢þ¢m<ѽïȧóz•¯szż "—ùÞbÉÐfüæ0¾ÉyªÂÐt™[nnÐnÚ^ðÅæ›t{ŽÅÌ8J ÝL†ƒ¬Vr˜Ì:üo„J0Ö—t±=Ú»™y¦&ì.é0¥eL°|¯q¹¡%ŽÒ¡Î•ÄŸ¿s]‘Ÿ6>ùÅœ:Ò‡ë²Ï“©¶°l&I{v*šMÃ(Ô'ÕSe˜OecF?»>ÐÿNxúKe+N›šø¸,k*ƒk#’iþT#é©+è2yþ‚ìmþÃLÛo»ƒâ@™#-WçÛ¢ö`è+¶Ø«]¤Wê%¤‰ZOã¹°‰³Yᥒܵ–«¦Òk“ªLsù]áI’Ò#Îèés£µ}‚A­õ_ {ÖzŽyaÓÂqººù1Ú>1¥h:ùÏDôðË X„„ØpSÕ¥Œ¾uÎÑyZÁö· z«ñâ€ÙûÈí†bþ¬„Ê0ÏExµ×hpA!®–9¯Ÿ!Éð³½<ã£jÝo©úµ°ƒŸõ.ž&ýÖí ª³ë?¬ôƒØ¨æ{ƒß¯ªÜrÿ#veu…’S=iÿÉí#Æ VÊ&“a)[ù8#ÖüKWë;¾ P…°˜73(õUÌ>­ÝI{…·)_êt_£À!SÌàć㘪\ZÌbϪöl/lÃzÇÒq6¦ A|_õ&këœÙRS|›¾ËFŸ°ëhUŒš¾™F;;KÞÆnÅ×RTªÍ®3p>©ŸéÅv°ù½ž:½mc¿a\:§Æ_¢|¥³ˆ´úˆcô1uDõªý)åæºÞ͘N¶’n®.ã׿`¤^ó»~ Ù½y zÎ5hLl=‹´?:›uáYÿSð¡áß ÌvM46Xù  [pà:[»ÿl¦Jª—ÊkY¼ó<{Ÿ§Ÿ‰‚™œ–Ëä­ƒôF[ª2¼¬KLLlêרX<a=‘ËÊ×Ûó„´w“¾æî…éÀ ”(Ù£÷¹Ü‚D'Y;>XL¨ÚòHæJ*ÈùN½žýk¬eË(Èwm°Çü.ÝÓÖû ûý>(C¶vÁ\öjÝégD[A‡¢¥ò\2.~ƒÚÞýhß_‹ÞAŸF†|»g ¼Ï ”®9ÍÆXGÿl —ˆ°qî^%ˆ‡÷”eÜ@ õÞ^iÍ!о&±ê7FÙÕ}…âX£í23&O'Ç1ìaû © Ï_Qôe´ ŸÚO¤v–éÞc¯è°Mm"óÖ•3ÈoÊ*ytop5¹©=1EÀXÞò-¨üôÉ<^χž}ÈFÖœ$ÆU½IXíZÐÌ»¾ÔnÎig~ϷŹ>øÝÔzòšæåT,ÏE(}r­År ¯5®dÒS%€‡=Æ$¥EIQˆt b^‡Ž •;' yÞª¥lÑ]>‡™i³Úٲ٥ÝK2‰Ú™Á¦qƒlÝ•q›c3‘“û½)o˜üD‘Ë@¢¶”½]¿êgðæðd"ĘA®Ð’É^¼ˆòkìætr؈ìêyYÿE½Kiù²Xo®ü[D¿·˜fT”Bu¤½ë䘨ö¤¹W}—˜þн^M@Huu¬z•ø÷ÿ =ª’ìþã:–2õx^-‘1‘Å0 Ds3*\ü" !\|†)¯4„@0C„@0„@¸·›ËŒ[Ò®¤õÏ/_\ë-–˜Ñã WngŒï¿‰Ÿ¾—ÑÒˆêû“6êKdlâp3l¿§‡x£vÓ Þá:ÕßÄ/[v§ ÏãÈBUÑÓÍÿåì®Ù9WüÄ÷ÞÌpa™œ*uÖœ:ðu?À7f¾@ |×.i…¥zÞ#M2KÔ´ÇI´z–×§%M'ΖT½ü#k §Û[.ôR÷ݸb2V‡+C^ü@™Â÷x^5’A‘! E{«rÈaH@8Œ€–°8î±%´$  Hh #aß³SÅ$„äç'¿¿~ùYK§ [ö¶f?–ìžvÛõ:íÁ&¢gÄök»ð§V±Èa;ñ¦uj&'GæôÂíyª½íyq.ê^“_úÇ/Qa4mø$cS?U«cÆë Ö`Wè7¨íäëà5°5ò5ÍýqŸ`M¿]—ü-®Ínç« çˆïdUO1‰Õ枣ïkBVÖˆÌ=;ì­¸XèíÁ¢%fÓÆë‡[†ý"²L;èài7ó³á7Í?âžð‡L m´)G_ßóiÒ­ÅÒ¿"Ú‘´Õ´5:! }¼c“â/†#ÔUŠhÿƒº]µw’KUˆ‡:ë›@ï.…T¹¿€8êªóMü%•‚ïx^-’=±1 „/3*\¼Â Á®Lià2¥!‚!ÂA0C8ï[]2cEÿÚ•îõåg#N;­Y²eÑ2zA–Þ9$›ö±j‡ÝxnrvF;ø¿È¼e9mÕ-äFÊ¿è®\õhx=B¶Æ«ôQe!²°š•PÉlŽåðÚÍÜí/&mº÷äŸ/jjltj6ƒXLüÑ«55{Æ+Ç*k9:¡IXÅyE÷'ßÇíÈ4[h„¿S·ÑRØÎQÌ UsEËÄÅCsú¶3l©"ùÕHŠÝE¦ðˆKuTþÚzC~uŠ IXBÑȊȇ—í_õî-œä¶ ôÚ}å©“j5™[¡}: a'7y¶™|u÷á8´_}ߨ.®›èRBö°Þ6ÿºo¿1ÓU´!qêlëÄ7þ )˜¢ïx^-’1‘Ä0 Es3*Tla†)¯4Cpy¥!B B ‚!Âý§ìÎØ‘,ý/ékþô³•6;<[·lëv[³ûwY’Úf»îìݦ-»d7{d嫲š¾#¢C¯]wŽh1¸Åáä7e'´Ãpz n*z©"è¤ðf½²“î.ÔmÕ‹ ¿äb¾„IzﲪøŽÈ¤ç':ªúq ÅŸð“8Wt#vY—ò™¦{ï¡¯Ø ñköŽÃ+’s÷¾Da?fßÎE¨Iò\úNgŽJ—ó_òÃmy¢‡Á¤ÙŒKxg¼­Ç¤ ¦iŠÐÞhB§"¯´ˆ—lxcQÕdOEƒÏØ]}º2)JùÐ*Ñþ],³OF¿w“l­ùÎ@­D5|»o ü[X¨ûJ ɵ͊mçÏ.˜"8žöïzÔÿ9©~ÿY¨2YÖþÙv R¢ x^…’‹?†€É—WYJ+±hŠò(ä4*IÑ))¦Ý¼ÓX«œ¬ÂÄØQJy^¹.%óÈÕcqOÊ#o­ÕÜäqŠ5‹&Q—<»ûÝà~ÿÁ÷û>ÙãÿÚÚ:$ªy¥‹(©œýˆ«‘ïäé‹óÛ¹4ñ)ûlç+‘'©ùÓX™!êî VS¬­v ùÁŒØXTHor¡Bµ×ôb¡˜}îwóˆ;§~™ÑÊðXºÿ–¨„‡ÿÍX~ŽIs%9_:,W$óJ}L‚[æul©¿t…£7Ç"P5x¡NÀÊÉ‹Ì ~2‚–Kÿ¢P0ãö'«”yægAÑ×Õxæ¼wçYbÃ2ÔÊnÆm²¯“é²-Xt<àlBÞCV†Ê%)Ù¬Ï3Ý%ä5³¤˜~¼HÈeWßÛ(æYy‘`]ŒÞPŠ:mÛS”Y÷©®'9 (Ò¹ÒfóøUçi"G4µzä^Í­Ymh ŒÏ-¿ÉS×lБù ™ï÷»qäpõI˜È©a“©*x|²[…óJ[­©·V!3Óqkš†1SS©g§“Œˆ–ICxÆë/F´{±#»†Xò¿õøÍ|¸ö~›~çyxÿüŸâ?ñ?Éé'ýUdž„?Ø=(h~˜$ ”£ÞëÃÎñ2lç».â¬{v1UA &H>½"³qا!‘u邃sü5úÞavj„¿„¹˜ÚXMevê<´Æ‹²÷V„³g‰’n¢”P+†\éÄ›6ù­¾2hêpx=‚ܺŽîª ;!ާ/_)¶¥,~w³ùµZ˜ˆÂ+xn”ADã÷®(mˆÕêÔu®%áÔ-aA9ð8• ¾·{I÷ÜKªh- 9‚§[hÓ5!þ›t8ãÍåt4Bƒ¡>A [þï“lFWHþuÆÇ™¤¥„ÑC…ì;V6Ì/Ûó \Uû( 1©·¶©òÉx ö±ÚÙRNB#tGÿ†Ð~A`‹7«cj©ÐÏãʲßG18±¼+»H‡}Ö=¤yÆ-å d£äŸ†w ñ¦ÅŒ¬¥¼9ÐŽNw{VßÊWšÜˆ  ‡ “iSÞ'“ÂÑ;¿Þ«!´T¹[/ã,Ïüñ/Àõ¼W @º òŸ¼äßÄ7fÈýL†8ĽÀÐË Õ:g“ÖÉî,Ëö2*îÿþ/¢ÄÌš­è2(¸’؉(Ùàj´rßCB5T¹ÒW!Öƒ„‹]uå|üPOäï›Ì€•¡xZ&â~)=ìÏšÎm-z×Ôà À«ÿäôq­d›§ëzX»j§©ÙÿòrÆjkN¼†5ÖŠ÷y1òc|×oÉÕwÅ%ÇK¶Ày£ø3AiyõŒ…`Õê\Y-Œ7»q–™ï GÕq'‹œäIôñ?Øè;®ž÷Òzl1QÅÅ4¬L„~ÜÁ mfëUØTŸŒ<-<ãÇ!' u#¸à^]ß—- ê•+vÇq`]£.¦âB³%У¡aw¾ù5Ù¦Ö¦OR Xy‚4{„Çüäv„¾#%ð2!ù’jG’1Ɖ¼Xv„^]óÌú cTÝëÔrݾ‹}{èS 9Lï’ÏKf\­uxnäGª+甜'‰NÄe9ão>u ä‹xŸù]†Ý”báåÆ Â„q³n„<:¸|Cÿ¸14VÇýšAIÌAè&“´ ©Aæß…ª{&ãþ÷ÁÒ›ótHG䣄8/€áY× ä•™‰=ØüÐD¹'‘õ:޾[ÁUû…ÐîˆAþIXMXN‡³UŽöôªáß;:$;Ç.ïúHOÔ@'*÷«b”…Õ|Û®Z×b ™– c€·Î¾tOÃh)-^±¹A²´ÔþAg@bûïòõ4Ì©×àXé”DyÞŠ•q“œª"?Ô^b[ö3é¦NmH9¶ùccy½q÷^ú&„ ¯ƒºãOª˜^@qmfGMøòÕ\ZUøñÉÆ;·ÔA¡C&Úˆ²°euß ¼¸§ãƒ$Âù¿6n.‹|¢|.¾‘@¡9Žw"3ÐÜÐãE[¼£Ì˜tÍ«žfQÓWrC$¾ÄÂN'p•\8-¢v)‘)?@ÈLb‡ÎæôÉR §?ç­Ò]ddóªÛ|Þà{œjLéÊÞ±<Ïü“Ë2¨G‚”±,mS2ó˜r:Ý"’bZWAgr!0(AüúÈÉ×᳆ÉR(o÷‰¥7P#LFÖ»*l–iÑÉ™o øœâ-FMHŒTò2#¨mµlõý…Îsàah&Ç~@êÜ©Lx¸,æ¶^4¬ç!lú™{–†-Õqò¤EæÑ$Õ“P°¦^YÙ(i…¶{¯âÄUÔé JÐáæ'FÙRâ6ÝG©'ŒþusÆwˆ‚s.+`Ecf5 ,ÊÚä®Yô;È4'3Ù±2Å1ü[Iñaôïzð7-xpú†ô`ýú¤udSûCù†)ž1¡ÝÁæ¯ú0Åeá­$: 8/z$P5ÌÙÆ_ôƾk-!xæÜ «±º|„ÑÝÔpÕ=—îù@¿”¦¥û ¬;“eýÕÉü1Ö5â‰9 k‚‚7.‰·ºÞ`ÿU'4óXއµ°¢o1œãñtL„œ² ªp|¾‹Gu´&·I䨹ŒLä ä³´÷¼ˆÇ?—LôÃuŒ»ë£É5tSw:Ђ~¾På2CU›€áT‘öPÇ(0‘ð×îVöœ¹n×åÍ&lù–­ŽÏî— nQ&á!Z'‹öólÀ=ím¾!”•ôÅ8O}Ô®«ÿ}då–C>µœúöáˆßÑ诇z DT˜5ÀlMW¡­Ç–eUxcswNú.÷ J®²Ds+¿W’-©vá™hÏI -Ž©as{8ÃôøÊÞÁ¦®gîW§Ž´£b(Æ…ö6Ý9'±‰ßeWªÒìGš‘ ׇy3xø)(eç ·j†¹ª‡·5ÊQ V¶w=·óÊâÃÀÔ¾B*Œ¥N^¿bE@‡,¨}˜4÷Ð<¤o ôQëh‡7Q[s´lA,¡ìßÿŠÞ[ôRPJöì 9oª(͘ÅÜôuW ¼Ø—ì.mjÞÜ'h ¸;XˆEøl MK3G]èhN¿˜ëhQ#¸wäFDF°´©¸sŽñæ] ©N93<æºÆ~‚ã1ù1o†Ê5T‡°¤àŸX5øúèIÑ£hFÞl—iY( LMB4ÿ'Êd®@mb‡0ßø¦«Š'a Sf}¡O›é{D·Ì×7ý a{qîáÈ¿“ºü_‘Û€Ó¥úζÀÜã쑱‚¡x^’œÂ`Æï~¿>‚  ‚ ‚ 8ƒà 8Á Á`A0‚`p0‚`pƒƒAAppÿ­~û¾oïû<Ïû|ï»×yõÓKõ/h ±êœ»ê鬓bM5xzÓU‘šÈV¨;È™>o%æ[Ò‡¾ÔÐ'ël¦&øBCž§jpùrexÛë¨!X‡ø Ïšó/Zm]”ÙRûˆ—÷Tè—ºvC¦P‹Ú>.®0.(º° êgYz'bÐâkkEÎSoIÌÓûÅ`²{*Äj˜!n|"™6DïìSp;b]ª­áŨìPsAt´6=uð*¢û¦ìœ*cÖŸÜ#ÓWOœçø¹ã|†R£ê§E4ÄoSîß+P,œÅêƒØrÛr" TËlD _mÐzÕñ%]ìãÞb?уZ•lz‘ sDÑ_+ðZÞöŠÿ…SÎaÙàfÜ5¢N9‡ŒœƒÃ«ª5à\C+åt®:“‚s¶™CŠÎ7þ ³á¹ü2jÄ9ùz~5 N ¿§jš}ü>üI½¤Þ¡x^’tÃPÆ»s>ƒ@ P …B!0 … PƒB¡P( …@ ( B¡B!0Aa¿$=yy÷¾ûý¹·ïaÞ„¯Ä{—Ý^mªë¾Lj,r¾êYDZÁ’£Õ¦« |¢”úov6kü@#¼MÀ÷Á·èyS@üLÆBï—ïuË{"ÐI¢O¸¦pù†dGd}0õD:¸£ð Óž¹íàë€õ©ž©0®tRëùÌoˆB¿Cgµ/p•Ì c_öàaøÓ® b¿qáÑ‘Pvù÷®øõ!º9ÓNìÑœŸ3ûzî20÷æÆÜP y-ëéG¸6˜¶ÉìB*ëiíè6gŠ]ôÍÆ‹MthîWAÎByÏ É1Ñ%(¤2£x^‘œÂ`Æ»ßïAƒAA0‚`0 ‚Á ‚`0‚AAÁ 88‚ƒ 8‚AÁÁý¿m¿íû¾÷}žç}Ÿ÷{™–*å[¨.KSíµÐHUÖHG… û‘.ꨯ–œ2ÚÒ—œ þkÝäêI, êjκ¿ÑD¯ŠQð9}ƒŠek¬6Œx#›Äh[ªQç¬?-•£û`í+%’Ãó4DíÊ;&cQá@µ„©{g·UW=ö54{ìw¸˜€v4#;ÖÜP j.kîÊ?!óò TÖPú>Š>§]vpPákÐg‹Ê-v3¾*˜ ¾‡¢qW'’¡ä¢œêÏs¼TP>áÑ#“kÊgB7ôîÌb'Û é9†Ÿ²ö@Ìaš ²š/¢¾8·qÕ$fº^ó­ØY Î¸º1Z=¸…ÕÅ{Š‹ šu¸¦ö€»;Q¿ÂW?Á¥aÅhtQZ0Ë#Î"tÏä…ã,¦vÂMpg£´ÅÃÄžÓ'î wÌ+Ò;‘CÉi‚2ý†¥3‡º Õ²«rvù'¹%S9¢›±© •pg)qç|1¡®Ÿx^‘˜Â`Ç»çùBA ‚`p Ap ‚à ƒAA ƒƒ  ‚ÁÁ ‚ƒ ‚ ^8î³¶çy÷¾¿÷ûûþùí%|>ª<__+%2êi'‹}WÒ’³qNJÙÔ’§WÙr´Ö;ëBmíµÕ›Žêh®±fjÒë÷dïÀ±§ãÆú«³ 8zêƒ.`©°»ë ¥*«¥ ýT5}ƒrèpŽ”SïÂ+…9ƒo¢![þ ßT!Þ>qSQT *<•É|0;ôz8ÀNu%K¬Áyêš»Iî `ºø±` P5 B²´p8„Éæt$o–†èú8¨üÑáÑâjÆÉhƒÛ#È1ÊC’x¬6u ?"Ç'fò`1\ Rÿ=½mt®POÐÜ‚Íéš’Ð0åÎ>Ì.»r¾ºY.¤sA¶Iž(ðY~mþ[‡‰Ô@Ĩ%úÀo9é-l[OÞ+>bôÖ°Ü`ɘKÊ}@‡ö?!½sîVœËù®X#ª9:åÄרˆ£ªÏœý Ù„3Â¥¡×¦ÇÃ{LÂ;®,]ÿ?Ú­¶™x^‘œÂ`Ç»Ïç/„A08‚ƒƒàà` AÁ 8A0Appƒà ‚Aƒ` ‚Ap÷ÝÛ>{÷ö>¿ç÷çyŸBûSÍ>…Þ´Ö‹:¼vÏêC¹r7W¢­-4ÕJ?òuÓAô´ùç¨Ï®=’tÖž® wªNc¹0æòÀxjð,䙚ÆÊà½RÝ€­ÁrWß–n—óTLmà0tIŸ(Gx õ OG3x8-Q 舩|3X6x\â'Ù#›KW_s˜ÏÔð\¨Ï`=Â~ÃÁOû¦ºtÌÀT¸–Ã…Þ ªã/Ÿ‚ø‘‘êŒÇwæâ “6EÛÁÃö@¡iÚ à¯Ãu›’¬J;Ò…9 q~ UizT÷®½™à(2I<¦~%CßšÌXw–åAeŒ³ÈÎÂ¥veb2ÜùðvŽ z'*1¬ ³ûE±bíqº299oø‚ØÐWÀW€ôÁ(¤ôG¨ÕàJPš[t‡7&oצ.Y÷ÜÌÕ}õé™àÝ!oõD%a}Ã{ õWœW7¢±RóP¾¯>¡x^’˜ÂpÇwÏó…Áà`0‚ƒƒ ‚`A A0ƒ`AA ‚ƒ ‚ ‚à`p088Üç·öüÖö¾ßï[OIõ‘U]S]ÔÖA MTjÅÛU®~OoÚê[7ª{tÔ\ u”êY¯œT%0}ÍdƒXÓrd´0S})Óº>“—è¿*“¡ÐÇÛL`66#o†÷ ÖP-²ŒÙÛþä[M&sÁx÷IPPTØ:[IØÎÎ;¸Ï=ú¸ 1}×”jÀŽS~Ÿ 9~½O}N`ÿ89½ØWpfº }‰ CœËøíÙâiÆäÈèÔ©™L!§[mq¦¾í2«‹rD7䓹§Æì#Ø]-ÔÏ(™Ì%]­ú_lpòØM¬O2,˜å·ÉÝfW&mÉû \D5©ö¹æûç€C„ó€9Ú²þhçŽáx^•”i8І-ߨ÷%EY+Ì$ÒB“%9r+N c©PÔ Q ÙÆŒ¥¤"1ö­•1rœÇ=KR‘µÕ4tœ£·ç>÷þ¹ÿîûç}¾ÿßó ‡ýŸ@èßü˜óò_Ñõà»td®È-a ¡þPz´8Rzo+ì˜ÃÉšë,¡2,źy5 S"Úðá3ºânkQäÑÇr)4ô€ªÁ'wö<<™Bá?ÚîÈt9[J€Cí\J¿$¸“2Ö¥‹«w"K1è"uAD9"âcés¨N¿mÂ*Â㮪-¶Rå ¥¸üðsúâ7ËGnº׉PÇKtÞäÇ8å¯c8 Æe¸B!ê«CßÄ$ííß›¢Ñ”Y{­¶±=´iØpN8Dü²¤`j¤i:6qÛñ@¸g„ÊÇ5C ‘j$g¼´Yü,’ÅxL 5Ó*àÃYmERDdÜÀdÆ*³‚‚¬Áz‹î\ö}Œ »éµ‚U7+aÚ†ú¨¯"¨°¤Ö~>‚é:±§OM±ÓÂýãns°\¤yú' D).ËFå{lg –åÅêW@°p3sôÆkQF’?T$MWСE™5uÝŠÁz º>ž%s 3l|½)òr ñŠK ÐøÐkÅ´G°H°&e®0‡Xâ_¯1S1“¤/¥šcu‘ü–ã/~”Ü€Ögèõ Oáh—&÷=&9ÑÊR –V{@"©×fÞ†{ÛÞ×Òçï¡@r%/¸bÉ–#¿(ŠÇV‚×jòØN<¦~…Õ½Pˆ/•Öý´°E®ªÍ@¾éÚI¢+"HåDIð9R…éT„LR2¡Îp2YR¨²Lvþî[¬ˆ¡Â_å[E£ÛosÙ²D¿È &1ro‡²Q^/_ìۆѸŶ=G1[Æî£XR“ »uêÖòœµW U*×ôŒÏLn›{N¨š8ùZ.ùêÀŸpø6Ø ÎÓߌ%CÏó29¨ö£0L áéçþñØqøÿáK„—»ÙÕå¡Hwe»MÄö÷y^7.¹€ô¢58;þTë´|}Ø^YD8ìNãšêB«¨9d£1:™UÜìÿIZá½K`þç4ÞêÕ9sày)ÿdîÇh/F¡±uóx2dÔF÷µÝÂ?­.Ý—‚ 1Y÷Š0ôš^ðœ>AFH›ãt§­£ÊÈó¨jì–5ö„aMĪæü0èVê–‚…²Ù6gª\J=w ’Αô©,[v©¸…€™¥Õ™[‹ÚÀʯlV'<'ÓþB7â*úÙ(#:˜4äC?v‡öÒFÑÔÛ0Aµ?k‘YŽVDF&*­íS¸¾°·°õ¯k¾Ìj•¤Z¼®Øá ñ¦•Õ,3ˆ/SìªmÃ[ÕI¦JêL+t?\Ñ5ACõì¶î4|´Œ‹@F¥ŸöÞòNl ( þÈZL²ªê€¥M¼÷÷F¸2‡å~÷‚›auΦÖAŠUÙ ÕëWÑ0 ÆÌå‘‘Ibv@"*\³§MN_ Ë€’h¢Ü‰lpTŸ«¤uàym„06LܘæâÚtº¨*Ç[”·qOHmÿ‚žéŒŠ‘[E§?æÕg¿ñ ø˜“gÂfðÉ8³„î†Òiÿ™'P¾µ>L‘‡‡rk{·(6•±w—/BgÚê‰Ó7ÔË,»ðë/“R*1>;̋܉ÛùÑÇÖMÁ/䲩‚2Cúj¦°QO‡÷ë8^zeE¬Â¸nÔ£6UìtS(cF;ìiøNXŒiF{ñ°òùõãU˜¹gI¿Ƀ=«ÖýŠÐÄáâ­õ¨ÑêfØM@½ad¡ïø~1æ e°jBŒlùpŽ‘m¬€§HÜÝŸu»µt1¶D,ÚPËdb¢å>‰Ãú$GøZ­oR¿Î€–y³–úµ~•ðì7 ìD=wí[ƒe´Yÿ¶O|Rì0W NBû]›Qú%‹c‚ÇLÊuZ¤Ô4’/¾qŠéì&H-Qi¶ùàǸ½ YÁ—+¿´ … \ËŽŸ…ž/Ž»‚¾‡óœÅà ³åVMd£š(nÏÈ…gÍAAì#”ÇÉ©Ó"âa`‚}QožiÙB¼tçdžºmþÒƒkôÎæØ!¤¤r¾âÕ/w!˜ú}djwܳi‡°šª- ðH¿\y6 µÞ ×ìù~¸F½Ž‡Ì”@#m?h{\:ÿ*m5l*'àz:ÒØº¦ŽfÝ;ú²óF>ÿ1°}e"8ÉÁs¯pøe2¡°œ—=ÎÃ/`7¨k2šÁ-ÃÑ3}Xp ÕNBÂÞW)‰aØ—ÛOhø©XÕ‘¨çDCöØZ²n(Ô:cúŽèâÑgëSW[A¿ìU©kް Zåf?Ëd4€îØA×Ë™ì¼ü•Í ÞÙb^ȆYNö‹DoÐ|,烰jo«„N;Rï¦/vàX®ßS)=%›çyÃNcËòM4ÌëoJÐÊ€ˆþñTÁìÿ&ÆöDZ¿Û±áÆ+5 )@+ïÇÂf(ŸŽMÃ2;îa½#ˆk‘ùLÇÊy»m¸Ô]–u±뾊ÙíÚˆ"ór¥9KˆM]ÎÅ Ž@¢Qá’<ï@„N•ä q¯ÊÃèz#œI”XŸ€4éÞ3ßµñ0¸Oö7´ tt1 —• YN=Øø8žqn­Ú¯hæk 龜¾S: eƉŸ3NBû–µ‘1øú*¬ë,\¼Ÿ›U_F¶ƒöA….½2”m~ã#ѦÏÀD±ïzÁ"õ–Ÿ¹‡ªSaçCá¤Äó>…«ÓŒÔà5ˆ8K²lïGWšö[Ý“`v;ø4´\TÒdÁ?­G\ïN„ÇÜ„<ùÕû#á<½&k6…©Ã<éç §ž¢Ž\„P`‚¥`à_`êR¢ x^…” ;ˆ†;y]ÝÊDÒÉ:&Ò´áª0B I’3…HGR„–éÜ$5‰æh‘’lÇIÓ"n"ŠS)=ô‘Ö3§Üžûî÷Þ÷}>Aìÿ¯ÎÎpŸ(-âðb+}Rö7æõwÍ£èëp•0RÓ­™Å½HR\>ìæˆOý,lïF>@”÷q5ÆÏÆ9n0ªØÎ…ù“Wd=5–<ýpâÊM†I\w⥢ªb•Û/ãùîY5WN6büáèDtôŸù±$W@WhX?ò9'ŒèP^Ã}„šKÖFWs½q5 ç7µ˜Oˆj`È.E §¶Ô©H3Ò7Ðá6I‰ß‹÷p³ Ð“ÛùßsL¦ÏÖ‚9~<—õXaüº¼‘<ÓU–Ý>J¼âëhÆ?ï´GÙëm'Ü^À±nç~zïiF·Çm:#¦Ø2¾ݒÃÇs¦¬ç]%_‘ðHL©ªU~ >©ºd¡;J8‡3¯üÅ©Kk©;0°W OòMùR¡uk0¬»ë“ Îä¦i°Í«i=«vŽ®fnw[7?m–‹hÿ¨L÷ÊZ5ü\‹Å¶ô`\¢6¼öj°|jþ^ÏìÑ`ǨFNßÛâÍ^çÝL葆ҫRo¯ÙE$IFEÿóÁõF÷(ÏŠxÄ/O´è?½V@تàƒt™¤û£õ¤µGEEâ Ùøg9çÆ-·9)\q…O¹;Ãè”ÍàbgÐHÊ»S9Þòì2Þâüì }›Ï¬”;/ø¹øÆ*äE7’tv9;©ío^úB²ÜtÚLÎOŠìâg¬>s©;3–*w[šl·í:ÉÐd[æäÅé2(ߪÁâ5†óÛeüøg ÒôZK>:\»Jë©%ÃèÈœA!S?…½Ï±ålÿ~Š¿þæVæ©l«ÄÚ¤h Fé^¦ü„Œò*úçÅüÊ·šÂuœ(V0 Ë<‡¦žºç]” Nª¾LŸÜБk“ìSöŸÌë; ±ð(’Á†0Þ‹C•¿tP¦ë¨«løUÞMê dÔ_vnâFs埴¨M¥ÉâÒŸ˜Êø×碯ثò‹!În·O2Ø®ãAËr©Á½ÓrÈìž[Oµþ™Ü2]ÈŽ¿=ž3%)åZ«Àû¶ß\göMs}$wTjð‰oA„é˜4zçHSΡaºF60½÷qn“ ‰´O,âÔˤóï5_EVtÙ"´ßS¥rhß ›LJnRhu$„põ|ï~þ-€·s‡XÖ9ñösoÆFU§‹è+ÁaLM˜y•s’5ëpX]ÀºÒ~¤V›W³(Á¥ü—I}§ßÈŽl»Ó¤|tâÂJ!«¿ioáRd#щá:ˆ$َ˸BDÇ[c6G—Œ§Þ8×÷)‚BI³ÄaÆhù‚@-Ò’çÇaÒd8„ή ÝÌνûŒdí&;.íòLEê±ô™r½ÙXÛ¬ˆ$hèÍ”ÄsŽ“à‘Í‹k 1?e²õ•N„ˆ^ýIÔ¬])D eSœš3 ±ýCúíþú'¦†9aÜS6ŠˆÄëoÊÅaÜX¯¶c7Õ0vzH`ü>9!¥Æ ¼³]#Teè-…»«Œ nÌ¡U–VÂ{òC‚cžŠ ghJ¼RUŸôÂ݉ڎ˜æð>X9]oÑX3? V‹çmÉ]ÌoñåZözCZýî­þx^õq¼²4ÿ´}12XŸÎ¹ùºý /šñò½vaÉ« ¨« òâfPˆÀß,¼‘ÕºÆ ?˜€ÃM><4–úÒ0¯jf ½kp u]Ž@Û:áXŸ2ö8(ÁB;6 £û¢ƒTì®÷åiì~ФZ< ·ZsK£L™’ÏáïYµYM÷nÝ5ž¾˜NLeâg.©ôÐQ–YKÓá–Y$í;3Çjél|ËŽšSšžgÆöãêº\hÍÜH°õrÚ „ó‰«×øòòp;R•rD %8pèì#MVJ.óîp~¤¾èyü;žd‹^¼ÌÕúé¿n:­6Nx^c¬– , ŒlXlX6Ø\`°i`1²Ø°²l8€el>y€¢ X>8Ø$¸Øl`Y`“àÀÀ’˜exxxx@ð|€@ < <@80°4Ø\ò±K‚ ‹PÆÁ¦åX<€…ˆ .Ø8l`)Ê å'Ø8°l°1Á_Wx^c¬–– 5,l6°Ø|`¹`3È`™ÄlXl°é– ¿,VT½¨KH3Ø8°<Ê Ø<`YÈŠÊxxxx °€P<àô½TlGÐx^c¬ °ä‹}̯ýi3á%ß„&6‡|±Ïï3²äïû™ŸùÑæýJÖü,~{gö§b¢£_1±Ød-áobe)½~~£Í„°°UÚÿ`¦tMûÀõŠ%뾯6õ{?¬Z˲TcYCæ"…ð\Œ XZ5x^2Ù´2~þаŒ%Tœù½m¬ÍMNÿŸX.\>`Ïlõ¯×^N–„ºŒ m0È^Ì2uÐÒl6¿^õg1³D­ ,ÝóÕæhÈòÿvŸYX™×?Í^`ó>{õÓëY®:pFíe·©šúû‚(+ˬCŸO½Xd3¡!ÔëÅ*–£Säm™m^®Ú/ÊÀòµvõQn›*ñàW‘,œ—5Ô,¶y¿oYÿžh׌5¦öœñã”åxxxxxxä<ä@äÄ<< <¸ˆ<<øä<|°`³€Åˆ+l–°ü±ÑÒ*@ñ,s¥ fxxxxxxÜ<Ü@Ø@ød<Ø<ÀÌ<ˆÜ<È<¸ˆ<„<<|<<Ì<\ð<4D,=6+€ü ,wlDXŽù"6sXl€r&@q–67Xl6°¬°Q`™cÓÄ>,@þ ›7,-6/Xs)xxxxxxÄ<Ä@Ìä<¿ÏüÉ’¿ïg~æG›ÿ [õ_ù³è{·/æaö4î@KM4Óù %›„$&W–Ô{×ûmm&„…­Òþ3Læ|Ø…úû,?Ÿ®»¯­cs»µQìádFkÇ”æØH|ðô8²·È4›FÓÛóœY•µÿ½²Y ¬îðã'˃»¥ç-9l2¯šVƳØjÈ?úÝf£¯Ë­Ã,ïö­ÿ(™fs8.çæ W–d¹|åºÍ6ò¿¢7i°Ü_¼¢†Ùæpx·¢–ËÏÍy!Sl”Tn´E‰²*¾0gù&›¾¶Å>Vµ,·'-“|ņãaÝ¡ý,KëO±o±™4{é¦"‰ómv6ûÖµ¼¨šÅ"RÑôó/œCóx^c¬ XÞ/×ñe‰Þ9ýsMô¯f–ИYý6—_—‰°è° ¨ÙŒÿ´ˆ¥Åö—´M\&»/Ë옾‰6OŽÞ«ë°qV=tˆ…«vBMe­òS–7¥y<6r×X8Xj*Tm^Õ÷°¤ôб¹ø­u3‹ÅÓÛlÞ1Ý»Ä"d>û€Î†Hþlm¾oÏe‰ÞQcã™Uw‹åñóKëm¾÷מgáÚUtØF¯{Ó1– ‹ÄlNùó‹±H¶qa©âf¹7SÊæ1ƒ‹°âæ0›’uF,åYVmîLe¾yx^ Œ11/3[|iÁ¥Š/Á ÁeŠð! Á‚!D*THZ=^‹J¾Ë™tžšGÓ—AÕÍ&5˜lé®Lu'ËíE³7çËdhrçfxwÑÇPú©èc¢¨ñ3]ü´þ݃ ^|x^Œ1 Å0Sé†?B tôÐ! ¡2v „B(„B(„@(„á[ñ`Y¶ÎËiQ r_†27MƒÂ§ƒDWå!ovÝ[pQ´sÌ|»/†/3‰¡•á4ó•—Ýmö…:×Pú=zùHݬ$_|x^ Œ1À Cá.Âø$T—ðÇŽH@*¡* HèËË%ï’o¤W1rRX!«º´›+Y¨Ò=êdZ6sM¸$š-×`­êš ³ågRáËmAoî¦$x^‹1À Cï2tD3t@ÀȈ„J@B% ¡P üá].?ï¨:xÜhõEÁ¼:_t41bp®>ÑÔzåÁ,š6yoãÎ ñ\¾ÁË4:<Û rÖÎX–ÿÇ-#.{x^Œ1 !ùd  _^AqBI‰$  /)HøåŠÍfn²OÓQ”6ˆt+åañZ$P,‰ßTÏ5Ë$ê?}3e8Ûªò²¤þÊÞ²Áºx0×â§]gXwLúŸî|x^Œ1Ä0/3[¤4CøRe B`|ipÁÁ áõ¹jG+Ýöõ‘ÜDß]LŠ:Á¥‡Bj2:·†k§Â<”û2¥]ÒÜ^vÕ½ÿþt¾¼óA5'ž÷{{íT£þ†,"û}x^Œ1€0afD¾ü"E$ !()(" ‘ð Hˆޝnö÷n=uL‚ruÌo’ƒ×wªÈÆCñ†~Ð"Aó¡ï#Çè>•‹Wµ"O¥D‘ѵ5ewªlËIÖ"ú÷^-Ùé$tx^‹; Å0iÂAp¹Å†`†peJC„@0„@x!Þ)[Œ´¿ýHñÐç>0Ýtª‚IÑ׋®…¥T–·/+z’§[¶…àTã&4s²ì†^æÁ•ÿ`ûؼrý3CÏÜx^c¬ Xnܸ½‡å¹Õ[–f¥ R‹ÕD±<âéj`q6Í:iÑÞ÷±å¢óÕÿ,f&iY¯k>'³tžHùÁrµ‚×Úbïö£R,.˺¬X¶Ýf·ð,_¼†eõj}c°Qfï´´X*M’°œçŠÕ·8dø]’¥Õ˸Ÿeòß0;‹C›ô³<æùØÈ2“·Uâ©îò–Ê+êßXä*uë,´¯+d¹±¤þOØ’û›¾º™ÖÓC[;,¼DgÎ'©wTnßÎl‚KN²«Øšé÷}T*^”}ØKj¦§‹gÍ67J·šÄh0˜ÚöšVE~ð¥ýB «~„•Ö"åóÌé? ÊÎ|gj_•nýYÐè°W1ûÚÉ…üÈ»·qa‰Nø£Ö'+ŠÀ`…4«Nîê¤Ñ…x^Œ!‚PDᜈD¢ '~  ? —ðÃ,€h0 –@0ˆ@4²Þqâ̽“†ø«ˆxhÂóÖŠc×—žR-‹íOVuD[/t8ykÝ©iŒÙ)ôáÄMŽ–M›Y½‘/¼Y3A”3"]9ÛÃ@Fr­D$æ…x^Œƒ`…ÏÎyp Áƒ ¼8aІAÐ ‚Áðƒa0ô#Â`A0 öž.Þû°\°È`±a‰±`ñaÙ`ñƒ¥e‹…Ë–#@‘?,9wXXXD,\X¾°0E"X–X¬aé`‘šc`ã´…hz ‹Å  ),+Xç”&Úƒx^c¬––‹–56 X<,ö°Ä°ì°0ayÃ2Åb Ë  ¬ KPä Ë ˆK ‡Å–,,Xj€ì5,),6oX°\°0`É`I±`i`éÊ~`é°ð`ñaѱ°aiª¬ªü`ÑÀbÁ’a¡4óÌ%ªƒx^c¬–#,W,®8aIaá±aÑa °¨`a‘°Ha™Á"cáÁ²(ÂbÂaÁâÃòÆâË–‹– – –3,;,X X,tXe18×Tç#Ä’y›[RØâÂä ký§±lh-NÿdÍò!PÏvÓ1 {s‡÷•ù,·ddœ`I½+p!x–EãõÓ†RYB'eßœÆ"~(…ßÜ¢FÉDÐÉœåÚ£ÆlC–=wõMI°Øš´)„eGå÷O*+X¾¿YÖ‘jqÐ'ij+’¥ñIŒÏé,г–꜌³Ð´åwbòn/”cyrd'‡‘£EÜC±ú–#,·÷¥^Èbù=ïɇcç,Î5ñ6çI°ÜÎøn©ëÃÒ(ú/³RТáßÿÇ,®dF-qbñš’ÿ×l$ØmÜx^c¬ XÞ/×ñe‰Þ9ý3Kk»PEçu!–,ÆAeç-NN}(Äþ~Í2C‰ø‹êþËwXz¹—ê°ÈMî{jqõâ½,–onì,Ÿ—h¶HzôÜeÏÁÉûÁFYìŠgQnøíÃ"½µe¿EúQö,Û—6±ìM?Wb±‰Sù3‹wëÇ ,ÏèXä®O cÙ¶êg‹Ì/þZ‹§\þ±l^›¿’e×é­ó>ÖcQ ±ýÊ2WzŠ…Øw÷»,µ[²ØXf+¹`á-¿Í†åü#Ž{,%²6,“?°˜,t©g©øÛùÜBëÒUg–íÜ|'YòôÃ,>yÄ °x©°°¨}(»n¡»DÀˆ¥Ø~»:Ëâ;ç-6NM´`){b|‡…!’í£Å®/V–²Õ¹Ü,>OøöXøEVd±Ðúñˆe±/NF…¡x^1C!DÉÌ+(‘€Š+R¤ˆ$ "EJ$  '!¾$ !;ÿŠ»y;»·¯†+&ü3pË"ÊËy[¡Òt™ŽÛf1ÉÒ'ƒdòIÉ–Ä Ö¾ý‹Í¹ý‡bSÔÅKŸUþçóRºZÀc°ÁO][í®þ¬dV²ý<Ô,²§x^1Ã0“™-\>APñEʇ`‚"EJA0CAAŸýÍÍÍýí½ÿ:b3ʯñe‘¼ð’6é‰1¼ËWÂO“âUé¤û ©až˜[òÐ÷PºÈúï."Áô]^ÜG§è¦TKjßÜæ‡\PÕ/ZËZɤ±k3?ÔE½Óˆ+"¥x^1C!É{SP"!(®H‰$ !EŠ”H@—€„/!N²@3ÜÞ¼½ÇW;.üS¸È/j…Ý2o2ípà6xXâ$i.ÊÃ*·ò¥Ämªi{êÓ¯Y§iŸ,àj(g¿Ž—Ø×šXåWqŠº¾Íã9ý±S/Ò¡x^Œ1! D¹÷¦ \ HØ"%€Š+®\ H@ÂI@B$  ÷/M23?óú0Jñ’¿“.MU[qkØ–«¡’Jtk([ªÚÖõÕÈGl(p-~ iµ G]꦳àÿ»¾Cœì|/{Hiµv ÝÔíÀ’å å?ul-ò£x^%M; Å0 Ì“nèÐ!!à ! !Ã:B B B B ¼“ž%Ë>û>ŸG…v,䯆ƈ…ȤáÂ/öeB72Iø?&EìÎŒ©û*ÉåÖߤ(ÜrOú±&»X®´ Ý‚ÑÏJS’k¥‰¨,GÅø\,"›x^Œ1Ä0 ó3[¤4„@p¡"¥ ÂCø2åC0C0C0C0„œT褹½û<Ú¹O¢±mòçÂ-vå²Â`ÓíËâ`Ø!-ä»H§‰ˆÛ#ÕåN²Z–4ønƒ$Ýö“ï$µmýÉœÈWËÑ-¿Šó»ž®l;i/UP.Ò£x^-;Å EófN‘ ‘@±EJ$ !(S" ‘€$  Hx—L¶Ø½ßß­aî…v Ã&›E:‰jN»m©4+x²ð*}²¥îÂŽþùƒ)ƒçL4ú¹¸Œ—WŒ²“œ“KÞøÞÕ…‡=¿MA_Q‚×͈Ð)ò¥x^11 CÝ÷þÐñ  n „B„;t„@8PŃeYÒÓë«a¾ýwh‘)œÌèLœ…E§„ñÐðx0)U'ÅÔH[e?ÜÒmÝB%®*u‰Ùΰ”ÎjñrOr¸ÜS¸ýM­¶?òïäýšt*¢Àx^c¬ Xnܸ½‡Ã(³Ú‡eg=¿D —§øM–UH?‘É–oW0^À1ÅW&1Ÿ¼Øê»Ã™?HgfItÈ †0¿œu3&,²<­v DM­³^R²ežÚZèãïWÇwµ)z±@¥ßL“Tý¶æ³À½’Úi0E¯~DE|™ÒéDjÝ>–K¢Þ=ãd}wXÚR¦{.ÄöŸÚÞY•q-®qOæ„r¨xÿX44®­x^ŒÂ`†×9Á`?#¸ƒ ‚`Á ÜO|0 ƒÁ`8Á ƒ0Á~@ïéÂ}ιïsßYò<"‹Ö^¸UJÏÈÅ|:Rsܹ±´XÊ+¹*ÄŽ7½¼3f5{<Ýç2#û²àAc-N½¡M|Ø0بþßb弘……b!¿fKLfOí#¹zZ}T?H5v¯x^Âp„×ó¼0 ÃAÐ8 †Ã0A ‚Á`†ƒ` Âpƒ`ÃàÁ ö«“ƒ{ïn”þ…ÇIá…93žj)€N "#’Ç”œJ7j#}"¶$*9’ÒèjyD¯Ž c Fw|Ôs ी'Þ‚ßC¡‡íæ,­'ö´ qÄœµ¦¤ÁWlžèn­NŽ•=Õ_˜2N­x^Œ‘…뜃`Ð# . ‚A„Á †ƒp8 {€Á A„Á „ƒ0†ÝÓOÿ½ç»ß´üftêÒžŽŠµZJ7­¾ÜÈ”ò¡L ·µ¹â®'ÄÊøÚ¨a¤u¿ 0÷²åmK­ˆÄ‹½JÛW57u¥Wljàâ<š+´¥qÎTú;)ô.'Òƒ%çû…2z«x^Œ‘Â`…ëœïÂÁ0†Ã`8 öƒÁ°Â0ÂA ‚ ÂA Áð‡îéÊ=çžï~óúf| Y a Òš–'¥Z&ÎLÊ T|täÅÅäÁ²T›d†$M½Ž~×tlܽ͑öˆˆN­é•®¶ßÈl}xoT’»cÛ*ÿNZpg—ÆÄ”êMÃðÛ¼36­x^ÂpÅëœaöÂÃ?A‚Aƒp8‚> ƒ`ô‚àA0ƒAÐ==xïs÷Þaú|ñæ§Ó×YÏ›‰ÕdØY¥½bkSrN"_@ÊÝFÜć–p¥$·¦"“?áCaÊà„ÄRǶd&cNÚ…ÈBgž±§×-yЪuB!®U[ ecsjò°G7^¯x^Â`…ëœûƒ |\ ‚A0î„A0‚ ‚ ?A„ÃAƒ0Â{O¯Üóžûœçö«ÿÑ㈓›8Æ$´ÊYò`¨‚¶:R°×œ)W#3èN„Ã+2CL­¥ñ±nm¨ð4–oࣙõk¾ FyRûO,8KÆwär<Íÿ²¼1²Ý`žÒvkZªBG/Výx^•ŽùK“q‡çøàðˆPÈ"Êc5uRõ)¨o¢d-¯¥æÂö†‚-Õº[±&ï,”’¢ÔåÄ«rS—]bµò+T´ ›iN<*LE'¶ÌE@Ï/Ïoݹÿ¬? Ì†µ&Tó¥3ù«ª…ú €2ÍS2gx,—û….¢×”0HHÜ„¡Ï7 ªbZf‡þpmàé í‰$ÙI)Ov ¹`*\áÕêÛÈQùw‰öS<›²Â/nɇµ„$)ÍLþDA]ÕbOä™)³†Òͬ <—é­ùô¿¥¨ÜGM ×+„Œ†ÇóŽ5IÀá—g²Én}éÍ+X龪ØÅ–± —²QéÝäMVÔ¼o¡»Á¶)yùpmËZ†™1·f¼ÊüLIé²ìÜqƒKB9\Ýgó93Äcâšµp z&‹ŠAs·Ïû!¬º³Õ$É4Ìu ¡¨µ^ݵºxlðtÃK‘þ³9‚äò£¸Ë…˜TÇî¥d°o5êeA˜Y÷Í­‹d4sÌ%8sêiY:. úB½J1wg£†n'ß^›ê~—ºdÛ·Ø ûx„Ùï> §ü ¼èVã!T;!‘8óȘ}t+ê¤Óo"Ì lA‡åâ”x#£Ù©Z+âR‡îKÅÄ¿M“¾¦CɇËÄixÑÜ)Õ`´¦ÐqPK6‰<Ó6ãÉ=u u;ƒ}•MØfäsÃyäVj{oÄ ,ŽöT6˜Ð¸PtZí Iý«¯‰^DÞ87ÕÂÈ^òG/k_qˆçÃjšªû6“ Àx^c¬ XÞ/×ñåÐ|'/È¢sø^v‰Î9•,rÂRÕ,ž«ÿgÙ÷=XË$ÿâ¹4–†þsŒ,Fz~³æ7A¿X^LxÉÂaùþÉDÓÊË,¿ƒvk²h>›XÁâ~sž É‡©_´Y)¹?f¹kÿŠeŽ-§’‰cÌTG–m!+Y}¯³Ü<“`âùåo–€^s–¢mÓXXNÇ1ºÈ-ÏR`Ô•Åâµ®À%êÙú÷&âW«âXÖd[±ð¾‘ªgáÝâöÙdâù‘,Û„ÕìX~<’}Îüó ¾ gƒ‹Rã=n_§],ä¾”šLü}‘%óÛ­c,öoö³±¨‰ŸÛirÁ¡{&Khˆá^–÷ï.8³¤ÍzÚj¢kcæÀRþ§0›eëž©Ò,_Ϙ¨Ìºº‚ED¢Ð†e…O¶*ËV¯z=“¾_ÄXXfIG³”:ö5²ì|jddÂdbíÇ2¹eÕ"–­W÷ýg©X}£ Ô|ºÍÍx^Ž1! E¹™_P" )VV(®¸ H@€$¬„{ Eȼy?ÉçÇÓòAUñ{ëÑ–Y×PWR3Yz®$ƒe9[UNÑ’ V8~€X柸Ýù7ÛmPÙ‚×è˜m¤´½³ª›iI™iól-–}=WÌ“[ìŒØ+Ú»eC¬’àº@ý>L5&Ãx^Ž;1 D™W¸<†°Å0C0)RC0C„ƒp !ëhfõYI+½>6r<È„÷âbÑÎAã ©2è.M‚ã¢èFžAɾS/sWÉi˜kÆín0»èº¶êÎÕcà¶î§™ê=ßI'ªiÅg+(³÷晜5ÊùýßÍþiÄ…~´1Áx^Ž1! DÿŸÙ‚ HHAq%€„+‰$œ$  H@Â\f›l²ÙïÐp[CÏ”ÕTc'w™¼Э½‚¼ž8©Ò™µFÎú¨Ù¢³T´­ƒ‚ û ¦ÓIl pµ­ªà&\º2¸iªŒ^&ž‹Ý„R ›üÍy»©Îkh൯ñ:ªŽ3–Éx^%Ž1 Ä0 E}Ò:B ü¡¡¡Ã 7B!B B B!ôUÉqlë=çóã(/I‡â{Êêj®ºÔ—ðAeíšÎ*:‰ÍýŸ0;q­YMUv0!+ûâJªn8n˜Ž-óNšk@UµQÝ*~wtœ·ß} Kò\*T‚ßéüÊPk¸Ð ˆðFçµÖo'0Õx^ŽKÄ D³U}Èq$DBKˆ$ ã‘ ‘€$  HØÇR5ôôïó娜SY«„ªŠ.uO-5~Ý!ƒTM?š:t+|))¶ÂÖƒf9ÁÚï˨ô2›즚 2˜Ã ¿ì›ûeŸ=ÈØ.^°”þØ"£ºÃ Ù…„l½ðOø$ºL<èõþ‹9†Ïx^Ž;Ä D¹™-R"!¶ˆ$  )®¸ H@ ‘€„{ ììýü8êÛ­¥ò]jJ.¼UYÑ;¨(êtÓDƒuBIÚU@'8;‚–.-O”¬!ãó6`Ɇ/úæ®ôÙÔT>ªüöšÜÀuÓuêÁ;ÞJ&°(Àvô·=«Á%u~}öFœ—æx6Ãx^Ž1Å EûÏyCF$DB† @B%TcG$TB%T€$ü[X¸ 7/ü.ަÝÊòk¨«î®Ê]bj¨À‡îÅ9Š’æçF· .ÑuèQ(íjQ±»µpªŒñ0;E %lúdnlÉøØúªAV]iN¯ûcš¯—×: ãä'®ò5—þˆ 5¦¿x^Ž1ƒ!ƒé{nD2vü%  :" H@ÂI@ÐP¦Kr|¹×WÛú'ˆ,p‹8¬˜8¨ÜHVäm:º’†jÅÚ{Ho¹ŠtdÖ¿!¹Ätd^VTêìâÆ›óöŠ!~ư$BÂe©éù7»ô”Ûx)G|×}SsÅúÍ$2–©x^…ÍiOp` _[ ¦…+ KçZ—ýeÙÌRbb@%Jõ‚$›¹„eºVÁf §ÎÙ2cEYNñ`v° V´©5›@‡2-ç&s©ejËìE ç Aá>Œæ¬pŠ1ýó¼ÉZ×g›0pF Îâ"3mÄÙG­ÚhÅ¥Þvç3_lÓg†Üß¼Jw`!¢ö×`£E‹‘g‹—>Eì#Çî„}Ll×@-ÃæŽCX7¶Ky.äãfQKnWëWœ äô“Ò†vÕä\úu¶¦}Ãh€¯i5­³µô`$&ƒ·Oy=ÅE#ÙÚ ºÐã4&I‚(¼,¤?Ù¶¦ µQçÞ¡ n Àv†÷P˜&“iã¦Ã·t¦àå 8º°‚Õ rz+HZd›í&÷Ü—ÎÞÚ®Êõ¸ Û["7óNC+8ÄvñÝç‘\.q½3û­<-伪tkAWýv%wZgSYˆÝwØ9a'Ì·K¦Áº8“J.Äù°”®âVõXm’ • ç*ƒ•‚*Ä Í¼N-pÚÏ1ûbPÄëw;Uâ.`ôÆ€F*Ôðñ0(é |逨±oûE»Ì^2Ï„r`X:s4™0¡¡©ŽöGq_<:uˆQÊ—÷MÒÇ?{N _Ùÿªz“Ö*¿p‘©ß¾Ò9؎ϷʼùaÌÈ,ácl š¡Î ' O šr$EýÈ%Fc×x^ŽqÅkæAAƒà0 ‚ ‚ƒ ‚0‚ƒƒ0‚àAAaAØ›vfwgö}mqú/ dT qàM™M刘69™Ñई&jŒt ¡ÂКˆ99K^ºÚ%1töó$ׄÈ~wb <±v­:3\•ñ"-=TqêÞÌž6lÄfùø–ÐÕØé-÷H%ºÌüSPß9©ýn |¹°bj4³:aùìk8ÞÕx^Ž…kæƒ~@ÁAðà0‚à ‚ <‚ ú‡aЃ ‚ ‚08‚ W;³»3oö{o«‹QáסÂnÈ‘³‹VÍ8ÒæŒT#ôÎ9kMéûÒDá9tg:±!%f¢.on\(•ð±Ë†µÚ\­æ¼4gE@Anb`;7è‘1b©Øù; õˆìq ÖÝÜž¾i™x°%Uj‡‰¡žŒú¤¥:Z“ø y]<Óx^Â`…ëy^ƒpƒà‡Á aÁ  AA0AÐO‚`0‚0‚ ìÔ¥sÏ}ϹÍô?48rÀ7?j3gGIf FÔJÝäï­fM‹«‹µWl•È•Ýáì˜%Žö’ ù¸” SNr*†¢Ÿj]‘©#$¶˜·p}}Ûñàcg)7…8R‘¾’&¾¤'>—s·™.]qÎ<9oõ6,P /å×£9n×x^Ž!‚PEuæÁ`p‚áE#Ñà H  @tƒÁè‚`0 ÁxÇþ¼?sϹožý‡+&›‚‰gR;âà:5úE¬IlɯåÙŠÅÝyãØ“‚” ‘Åœ¨e)ÌÑ{¥¢¶’œ½¨\¾¥ŒØNdO(ËC´Œ6¨)—¹5W­/Ê%òúT–ªkÐV*—é‚y"b;{)]àÒÿ„L=*Ùx^XĆëy^‚ ‚Á`ða A08Aƒ  ƒá A ‚p0Áààð ïéÇïyÿ÷=Îÿ#Îh‰Å=·Ü0iņ{vdŠ)¼œ2ª6wÉ~èüSšÚòN¥…©sj–êyå‰X{¾ì;°Váå„+­ix´/PBÊ‹ë¡>Ýx¶%Õ|»}ç횈’2s$´š]ÈmÆý-?ÊYØ3(dÅìÿòž:f×x^Žqů™Að‡ ‚ƒ ƒà0‚?„A‡AÐ88‚ƒ Â>@aôjgvvç½·ïmcù/^8sC‡q Gm¹fɓؓ3$²= [¡±õÄÌYè&dÂY{l+bnì(,SQóîA/¬f&ÇH~-Ry8Ž6PRBÜ/¥¹s¥k3.JkQÙ[Ì”1ÞædÒ§4Íq’Z ,¯n[_¾÷öû1cÍç Ü;6>×x^ŽÂ…ëœÃAƒ x0‚ ‚A0 ƒý€A a„AA°ŸÃAÃAЭïÝ{Îûî{Ýì_tøp¤±fÚÐÐãLÜ(ˆè›/?' ´75úx¶eÏEÄ™ +–lmCIÌ Ç®ê%+D¸J™YH…Ç ìÀƒyËpDTŒmÍS[GíÕš?—+¯ŠYJÂ]ln'] YHí*¹åj‘r}š«îŠq¾œ;òÕx^ŽÂ†ë½‚`A0 ‚ ‚ ƒ ‚ AA0‚` ‚ aA0‚Á°ÿupwï{÷ÿÿƒQ $%²¨ÑàE•Ôø¥˜‹ùp¢ÌÞº:â‰åäÔñ¥¨°!(a™x ‡¹Í5SÑ‚=¨‰6‰í+‡.mî¶cÆ€ ™miûŠx$æ1dDç°<êx^•‘ý/p‡“OEòÒyë®5²ä%Ü—rÊtµZzqX©Sy Ó!áä–Bs·«ä®¢/)y;za+j7tÕͤ²êŒæ$dÞ•Z­? ç—ç×g{´’ÿ,ù AS•BSQ¦­@M“ÞSJþÊ«¦iÓ˜Ÿôfú€|ŸNvh®kƒÖô.·ª Ow^T0ŽkØöÜ˜Ž lÃú í¨‹]Ðß-‚,9@åûŽ4f³^•|ºw+ÓOìý"ãeX¥ÔvlU Ûk*þ‘3ùøDbΠŠßeÔÎêØ:¨À:{Ô&Z™ått™cÎñíj0w~2(5–7*G½¶J×;õÈ¿j3YQ¨7L¿2 ¯rüa8¼CU}†aX¾£X§›A¦Ì_vlM„¿öµ‹'7Â=åE’m/ŒËO¸›¨bŸÑåDÎÐ9-.ð(³M?•‡a»–ê|dgñ†GÜ¡u¥ýò(‡ô¸üÐ,€Å•ïC"9X.þåyÍpX¼NsC­BÞ-&ãBDL"¢øÛ’°“ÝÄNM‡gm[P£Ê5áüER”^¡Ø½g–˜ÎP0˜ë;ˆ¦¶XªÆ4Gw™Ãc2Ûÿ¶Ú!­VJÕ ¨\˾˜p‡¥©Â‘Ù)Ôx3‰š Ï@µ§’Pc i·1Xý¦D*%{ôK'¡ v oÂ@4Õ©TƒÉÙGÎjø\­ÝÛk„\'³¶¬/d£…Ô #rWÃç04¥·}Ä{‹VÏ÷"¿~A²SIžÕ߬ÙÿÂì¸Ö4ØìafáBÝU{I(ë#Å~?zèÁµb".ïV-×%û\5w,À'wìWú ÇZ,~#Š`­¡û]Wò~ª@ÜÆ¿æXƒÞ_Ö™Æçé}\ò:ìøO)&B§œr~B`¹‚£œ€¿ânÞs ^×O*—',†÷ûÓLµ¬£$ "xKƒ0AÓª¾ËZÑÕjIÿ/\¼[@©x^…ÍJ“QÐfjZ®Â"mK&b ‡Þa¸V±jH[a™?ik³•sk›9ØÎF2›ÖfX©™°¡VRÛ²&餱)³¤’‚&š!e¢s½@çMÿXè䜈gÿHÛÇR«6uBŒÆv1H_vþ† ™ß¦ÐEWÝU¢¼rÙˆ·íÁ'Ô¿6‚)ñ$ãƒf 5,[’ì}ÏðJÎkÃò •¦p# ßg½{T¸Ù‡;JQQ{| ¿Š¤§Hœp` ´âNrŽä‹áÏ|œP€yñEÌÄ<ÜàägÃ)•ßÂÍþ¼‹˜ãfî'záH7Žq~¨xj0åÛcU=I(Om ^»6ÁÑa!Íøh ¹›½Ídr¶ÝžfO Þ[ÜZPÊ­YPäͯÇü¸Ä‰v¤7%aüÌ¥iøK>]'w­Ÿ¿c]n]Ì`ŠÑZûŽ*{ˆìEKAyÓà5”-HŒh(^ÜMæ«Ý3 ñ·Ã9X¯Äãq± éÞÔ\b(øG9³†9«ü+ «ºB˜Žeh½Â*=±Òa/??éÝÉ0iÍn2ÒÃóa¶è^úD‘#û¢…¹eÃYRR(9i êŒ?ùÊóÓön•‚rý« ç+ÒŸB7æŠbì’û}¯Û˜íx^ŽAÅ Cù39pDBì H@BüCÿX H@€„J¨„ÿf€d³›ÍçÇÑRÖÁíJ_ÿ_=ÊÖvõTÍ'Z 5  ιÒéZ²~ë‚Móâ²TmÅêT µAíÖc'o¢«±åÀ¹o¬êˆ¾»ä€ê¹ºy.X,–ôâ6q$KLWLÂxããsmO][_l+z³'àù®ð:*ñx^%1Ä D¹÷¦ D Ø ‘ ¸‚òÊHX Hˆ„• ‘€„û\(ØÇÌ0^_–6M ù§k(qu»UÕq6…%íjxG ”@ëšVPßšÙ éAæm;sâܺÌQ*úéhÿ6¦M¹NœCnÁþNôȃ®D·ëZ¾ª=¼Åè5åõ’ÑUr««ï‚@Æ‹»ë/6r‚p«ØÃï¨í†ž9j÷x^NA! ۛɃ'Ѐ{ôyO$¬$  H@.™Ò´MÒ~~|˜ðP0àß2²=¬;6’½ˆD3$SΨT¼dfuœ8“¯Ò!~S¹äMœ0ìЯPKâÆIuÖØ=TtÓö Më½ ‘áX¦bmLÞ°µ'D²¶0ӽш—è9Lw‰×²êÆ8xþW€=ºíx^Ž1! Dù3[P"_ÀI8 H ü%NÂI@B$  'á¿3!Éfwg??ž². þÕ“Vll¡žªšÔ*¦GÁ·tëÐâ¾Ê–¡15fTÜ›¶žRÕ_<(¡Üx¤x• ÚÀ.l]”•$s;4`߯rÔG e‡‘‹Ï¶½Þ$‹Uç::HðžßDw¯¬YޏÁN4žÙ“™ò0”@Zóx^%ŽA! ¹ªyðŒä$¬„p}Þ H@ÂI@°®Ù£*T2ô„y}8ºÔt(Pö¾ešÏtú¥/}ÒÒtC™ÌA ÝÔâPñ[UYÆ<±gЕܟnÓ "éTˆÃ ^ƒ®¨áùÓö›(‹2ö5˜¦‚{;GL츼kƨú„Kuè&Â<á3E^ÿ»}Fïøë¾}§O;Õèã=öíx^Ž1! Dù3[\‰PPœ$œ$Püâ—' '!p€„ÿ€™dw³ÉçÇÓ#““'ž¯©.fº ¡*‹SEY¯¦Z¼ÕQ'ðžP H@Ï{" + H@pi™i I› Ÿ.&»%Ç M^DV—Eµó0åx'ެ†¹E|8°QÝE]ÄE Mç7Ǽ¡Žç·H§jÜâžq/÷vަÑ[ïËœ 7Oöî³úTfˆbÙÓ%nÙœå46ÓÁþÿò%>Êùx^-ŽA D! DÙdÿˆô€„/ ØÇ="áK¨„•€$  ;C–„¤}ÓiçõáÃB¹&¾ðwa‘ðÀ-4t䜮A2Ь£’Òa›õ„ë“'dzgÙ–b93»h÷-H¦Ù[7m]ò:ºîÒnG²Fí¦7pzòf„òt‹‡K}/T*¹²tjóŸ,°¶XûIP™l“Vyž¡Bª—x^…ÎyKÓqà–±Ö5T<æ4–}¨+kº‚+2KÌ‘ÜX©C›ó')é"§­òÀœRZÑ'hZv˜97fÞ¹æd¨Å,Jz=¯à¡ýffæ°Â[K„¿Ë(WÞůÞ|'huט׻‹'S±ÑþÀÛ*åG"ô êh,Do–î#ÊKé48–³Ïc“÷È€ð¡LnPÞßÐå#"õ{Y\öð¿êÆ1~ Åü_Qy9â11ÎQ ÔíÖ*qëèg9–|W3 Ðø& ¼a›A†,óV¸¸ŠQo|ÏÓ´è*Ò¦ìš+ž=é†9Ï¥ì‹s€¥Sw”ä?ï&AkëAö¨·d°•v"ªGØŽñûc*“‚¢PRÆJ@¥  òD4×1°¥T}Ä÷U‚Mô ¸¬Dº“IµeU%Èš‘ë+2ÀÚ·­2/ÒÀ×e!æÅb†}Z/#IÇ=¦ÆU†AZVY93á@XKØœ:¡^1Ç>†V"žES¼¬‰˜ú2†>×Ú4ؘÉãÐ (6o葈¨Y%Ëžü)ðŸÅç"=ÞÈ…!Ô¯úˆe š‹ºÉÍþõ|LH6-Éì?‹â%„sÉëR˜\-É$VîY hû2pgšõ ²rî¬I×kÐc5½#ö¾‘lìwê=†tµz~Bê'Œo#[±QÀn#»–8—g¸‚Y»ä¼æÍCº0R€—ÂQ;‰£ç±aR8 HM8Ýfï4¶ó¡ªN±ý»ß }œx^•’±O ‡ø]U|ƒ@Ò¥]H/‘…¥±‚ (õ—&•d1iŒ¤qaJâ"¶ xPèâÒ<<ô…¥‹ å™°¼.M€EÅóîxÞÞï?øò}’׿ Ö5WëoîÐnö6Œ3‡í" gnV} ë«”PŸ“ sH4[_µM´¾¿;,½ V#eÏ\C `/e6•©£Z-GYgž×þq!Àg¬¼O.vÙ56ï.ý'Œ´ðò¼Â=Æhû†ëlP\ó]L¸± 9öŠ ´ÂîÏü¼|ÚÀ¤LôóÚV-öÎ÷׺dŸÂyc¨SîöËÓ<.LW«ñ¥gÛ¤l=/W;1˜%J,ÇO'… ð¿QªÑ­7D¬Ï)ü³$äôMÌ üïrs·¨Ïú*—E¬ž>K$F¨›+ï8 -©ÎÞã;áÎ)AdåŒ ˆ„9z!n/>DiOb}¢Ø‹“°/.îeØ’+í¸Dg_Ì!Z“Uã å…€0†½`Æ~OYïþ%åìjÏ0*óYR"¡U¶²/(û$¹@_!5ßýþU„œwøOûx<>Z·\£némLåP6µ›2Êf9ؤGÀm}h¿s¢·=¬ )/MÇ=-D³r¨]P‰Ññ¾µK°spZüfjCæùx^ŽtÃ`†Ós ƒ@°0¸b¡0ƒÂ 0( B¡…Â`ø°P…Â0Pö®—îyÎû7XÝ7ÞÙàb—&8ÿÄŠ&ž0#畃|ÓêË ¬aΈ'μø¤|à,ä ýx¶»ó–Ê":vüX ~a¡ôÂ*yså”DvUÿŸ ÙJÿ¨-Ê3BŽ¢%žýÿ¦†ˆÌ~åo™Ò³Tëœ'^[':&÷KÔñÀÒF¬YjáMΆ+'-ŒðþÛ>ƒx^ŽÂP†Oç<„à AƒAA Â`0á`}€ Á`0Ãp0 ‚ è­+÷Þ÷+ørXPX1É(hÓ%áh5)[®6a<éQ _3`ÉÔ2"F¼äv¹sys·¾+r ˜³WCÒ޺׌é0°Dšœ³Ø£-˜ñá&în¹ºb¦œ¤ ”X*ÝÁSfªÄ®ØÆP‹PÿÚJ2Lº-¡íÕéíáX¨%?´&²>mi´t¥ÞT^Ÿ+í/¡}Gjýx^ÂPÆëy~0‚þ€` ƒ`0A„A ‚0 ‚ ‚ ‚AƒA„Á0‚`ÐûtåÞó~÷ÖçÿÔ--RK{)]ÆD<8[.tÆ c󨓳±ŒŠá•·Ðý–?µ¶æ&OBO¬³¤c/1‘òBKÄ_•ã[)ä„ÏXš®cmOuYs–¦²›¼.%ŽÞ;V$ê4‘¦;ÔžXù>ä¹0R[¥©MÁQš—¼}õòõ·>;uÈ´¿Ç—€ã0nGÞƒx^‘Âp…뜂 A<‚0 ‚ a0A@0‚A„Á`0Á ‚ ‚ ÝúÁ;ïýν÷}¯ºø?ŽôÒÅ7àóÒÜÄð, Å†- zvåN¡•DÌ©pâiÆÜ¤ñä®KsàL†#ýˆ„‹êÚRRÊ\ÚG]‡Bÿ®¼);z¤ÊL ‰µ{i‘ª£­.-«ˆe"Ä2qÆÊqÉìÍG»öä”Ê E1•¾PN“¶È3ûݱiÎKÞ’OQo-Vò»¨ö æIƒx^QFëœ aЂ` ‚àAaA û‚0‚ XXXXXX‚`!‚ ‚ úêÁ;3wæ¾ó½²ÿ?ÌxÒ¦…3×͹Ð!â¤1]«‹…L9à[ÀŽšœ€Ðš¼øÐ“ïÄ# J@j‘Xƒì7±C™ u±íIXbÜTÚÙ2’Û]s,g£LwÖ–r¤"û¡ý6)1o½°²Ž¬ gÕ{qŸ±&gúS•çi¶±Œ¾r½qÌm©œNš ÌtÏõ‡„É®óFF£x^•ÏmPtÇñ›ü0žŽ!#±àBÊBž6äA0/Á±ƒ r Ôtìh°Ý›,£™T@Þ‘6R¢Á $ŠlœFÛ€RF &²tàhŽ`ö¢»Þ÷}óyý¥¼û?ÃQêâQ‘¦ùe¾<1-Õ^™< ö4#‰³¤SÈ¿0‡9&F± CKêbÔuêëÕø&ë™á]¸Õw±\¾IÁ­:] ±WUèÎó&”$uú¡œ²ïU-¢Då’Í"ðîUO€©•çOͼu²>(ê÷jȤiñ/{€põ­ŠüØšrR0Ád‹à>/TèvH!gLæ_(ƒç@Àƒ¦uÒˆ‘3ßàKñ‘úç7n× µÉÞ.ˬU'ÏýxZÕĤ¸aØõ\ì"^Z¯ý7&|ÙÝ[–Eƒñ«D5ô^û£úa—î¾3z/Ößí_ÙªBÅG ¢O¯6þ‰T¦¹MCàÀ³ ¹ qâëh׺kÓcg%èÌŽ–zÉž©)ß‹öÈrÔ­ŒÚãm¾¿›|e #}§k[ÛÐeFå¤ýI¿KÁIôTÜ#>A¨ýÚ{6ÅÛ¢2¸#ïanw‚Àÿº<Òê^Ñ}QóájÏ:ýiqøû×Ñr¢xGâ(ruçBdH?D{E¶>Ôßk®‚ì–¶„=/ÆÄÊŒRÌ”lSä„à÷IC•YyÒð2ò}\¸¯F… ÔÑ ¹ßQÂ-äß|ˆ ;ý–y/sΈF±†iš'*—©œ­ÍаǟӰáx\p…®«¨cC;Œa’†ãV(oþB 0úƒ²—­P͇lrhƒ’SrÐkß©Kyè¦~èSÚŠºya¶³aLÅ/T"ß’P §®¾E[8~=ï›WK¼-v;Ú§{ÅEz—Àû[†wr‹BñæšîÖ3PÒÇU<>&kî<ÿ™i|C÷r5¦`eŸ Üuõ¦ÚÜgŒêÎBdÕ§’Ð%8ÏJ’løòÁ°ÛX&¢åÇ\JFZž›iÝŸE•ûÀúÓë6’ÍÛ±˜à4}®ž&²Ç@ãvXfsNDÁî¦lÞÆ”u® #5xÑÉõ¯+\¼VšÍ~IB‹‹´æEËßõsÄ1mìw³Ùh×ÃÏ‚ÞOŽÐRŸ¢0è:Å!÷ºµ—â—x^…Îý/pàð9ÇtÃ…äˆ6SË×TÖpÝNf¥]]5c#•.GÊ]ÎÛ7±vׄ6 µ;·®shÃÜ-oçë¼D·%7?$ ]nVÚµõôü]Á`SI¸Hîo° ž"¥cÚ-ð1z(¦ tÈŒµ‚>90ËÛÀИ\¨Mý‰ºÁF”޹Ä9vß*zɧPÂÌE©Yãf1û"4³ZB¶õޏµ} ã\ZL¬WÜRW¢¨®»œÔHí&‘1Ôá†ü71cH‰œF™¸¥ÚÑ ±M}=ž÷hª!û>d…Ñ^øëߊTßv»€€'ÕÂŽÀzO »¹oé(ž³B&Â!W>Tb£½tV¿ÑÈ3©0:Óç‰"åC+ôöëBÔŽõž@¤Ê#?¦é>ð$ÍU¤‰ÿè °ÖÅg (•Â…|·Õ ¾wGî“(•¿+ÆñF"Õ]àðÃÑ—£*‡Â:RO6^c¥à¹ÁìP&Îôeàm4Ç’¹ILšÜIÕ6Œ› ’aT`Jö½2Žê% l[x·Ÿñ –Ùˆ¦nQ5h.½õðÓ…0ÉLÅÎò¸¾0„y"8k—b¡>kСôó^9¬9™þÝ®¸’ãäŠÜ$‡«èþ&ÀKê2…,]g\BQhgâlRwx«gA\¬KÃÕ’LâuÞ|sbª–´OxÂÒ!ö`Ï8fšûbÈï~:üx_XÇô <ͧB.=R ûÔYNiGÖ½Ër´¹¬Ñpº,k¶ŠÄð‚wýIp % ¡ì8\螈—EP…LU¢¶5@ðkèB™x^1Å0 Cûï4d,„Œ:B!‚ü!ã ¡¡ ¡ !þssçK"K–üùqtk-®¡Mþ ¹ªN5uÛuÑs­:–]Á¯–[a“vð«øÒtdå.·F¾d²Î;«êaÖÄÄAämªÔMz,4Ã)3RÕ^ݰ÷4Au;ÀWL¤xuy‰×«á“IšmÊ$lE¿âüð;a©üÕÌðØ怷•NŠtj RÿÈÂIŽŸx^-±­Ã0 à.Rh—,Rh \¦üeJ 4‚Gð!#h„åoÀÉGœŽŸ²æ4ßY_Uí*º4^E§UQ3R¥•v±ŸÕH:Ù®?ÒÀî®h‰¬R—­Ûñ_û­Á«P"Óa…Ù\„ Óú"Ô)ŸùVW2g',kÝÎMé9 î6q8—ÕÁKwwa8É:ì;ÇÖ·õ»ýÆLWéüÚx_öÃöI>™x^1Å Dù3[P"’"E$  øå/# H@" ‘ðß…n÷v÷îóãh©ùª[]÷·iÈiªhli+ëIQ ¬ñ_Ši½LÐiZ¸…v(šCÚ ½æ3’£s«¢¼Rƒ‹ÜLSÆaPKÄÓÐi*\&*ü}1}áZÞEU|'a¨’œQDØs‚õ÷_Ȳ™2 â7•Ãs$Ã:=–ã’uÛæ•wͳ+Sì?ø[G^—x^-1D! D¹™-(‘@™â $  ¸â—W" Hø H@ÂmøGv’—Mòúò!¢û`õÓ°QÞ×ÉeL$)Ô‰zC1ŘÅÚ„C–‡h¬W’ 7Y#·4ª‹œ2[$²‹ÿñRTÙ¸TIÏ3mÊãÕÉ9t1>úMÞ‰žŠù\r3Þÿ©s&o`Dc”Ù„Š(ÖGeŽgs=Û^µèµé¡dý—Ì´N©EZ‹x^1!ùª >8 „\€$ ~xpð€„“ð TQ,»3=µ¯/GUÍÝ*ªŸ ¤Á Öü¡K[,1ïrèšUeýq ôÇžÕ¥º¿5¬ë¡N(·Ø‚æ«uŸð:¤ yÝ"?;’xŸ‰z*â˜d7fmÑð8üs³æ;Ó}H¸ GªÄÛlmÓÐí”3Ó {“«S;­}¦eæªCã˜{D*™x^» Ä D9iBJ ÜÀK J ¼ðB—@ .\%¸—po„XÍì|øü8:5cÕTWþÞ*º5´«o,i}`¦i)›£5fÚ™ƒ*hz™ÀÞ¾¸—-œÓ‡¹{Áu(+Yá­(h³ª  ‡ŽâBÏ©~2Ã[e†!÷&'ÃUv šFF{uøÃoŠ7Yæ­»¼W£QƒiþOv¦ ¼Ÿ×‡lótÇiÝþoüEx^%1C!D“™-(‘@I‘âK@¾€”)‘ H@Nù3÷ávo—…ç‡OKÝ™Š¦ò{¨ÉäõU^ìñJ±²ïÔ ¿â%sM…1=þjœrlüŠz:¦âvÃ:ƒëxÚ+7ª0W˜0‰Õè–ëøuö9Î]Çaû¶}îQí žž”1“cPgž¼c;ÃÌÃÝÊ.Ðò‚œ»4Ò2lWsWä%Àæßã¿%Nn™x^= !…¹ä”H ¤Øb$  ¸bË+‘€$¬$¬$¬„ûX’™÷ ŸGKÅWEUµ¯)¨ëÑ<†.SPSOöÖ)Ç ©Â5§¬– s„$µ£¿:CQRËÚü­AÆÐdʤƴ艨"èJ—¿¹ª‰+à/àAÎ`@žft¸ýZO’.ŸqTæÆ¶Ð®4È™¯ò‘¥FGÇA /ŸoÚ€ÅMâf×ë4¶=?û¯ÛI®ûx^…΋3pð²¯Í£’è.'•yÜO*–.f’‹°–®‡Ç%V*gwÎQ”°¸fT•î*=¨»Ôhyœ÷°c©åòÈ¥Zd]Ýõôù >‹ÏþŠQ &whBMyýž8ÊIú´ §[ ”%KN§H`zÎÙ án–5¸]°Ÿƒ5õ¿¨p|?w‚?¯–’ºÇìxÔÞp˜ɦ&d¥I LBaQæ •ûMâ¸Á†v|µÚM7|ݪlEC%˜!£;ÐîíŸN¹…x.xÁî]`’ÌÃÑ™~ÒÅì2P'Ü™Ä)¡kåhÃå|/ÞMg÷ƒæîÇ·Pçþ¯Kfµ«M°§éôlU=iFUØÌ š³(ÁSîâà‰Óà)Ü÷Ƴ34ðN,ÎŻϪ †"Å%Û¡Í‹ #ÔuQE éÏ?.b@[«¦b¯Qû6‹»â‘à0ƒ\(Pàî˜Ë.D°Ö؃]¿Ùêe¬(ø¿æXC<®O#ÊW^È»<ÒfOŽƒºyc,’Šêà‘9zÊGˆ>N] 9á. ÈX÷Ôè4³U๳ÃCTˆlbQâ0ò8ñ¨x^•’»O" Åy|ࢷM¶Ñf“6qÂËÝØÐˆÂ€l6Q(´1¹!<†»±±‘BÜ„Fð9 +ccC| ƆFŠ…Â›M G‘•E`.ÉÍþ÷4_¾æ|ù~çÿþŸÂòÀã²÷÷ŸÁ\íSOµôžXj0ò‡Q þ Óµ‚$(ýwUŽÑÿ·a•ªox¦ðÖÚb]]øâJì‹Bá¯< Ð E|5-Cf©iPÆß¬…ÅBÑ86BbC)3\î ,"—Õ ’|ÔhIÀ˜‹gÍ÷á‘ÆÐ§9þŽ’ÂMT~–f1¤­\3€»ÿ)2ƒQ¼'XªŠG·'Õ·çwŠ.$CNp€¬¯ê°v‚ã-ëÚNlÇgWÎwðV)lÎ ZÒ!,`Ž…- ûDëb3þZšQ´€ÑÓ}}l‚Í*?óç[ Óq¡@ßo¡,U,î^{lX£C4ƒ‰´`ŒÜÇMãÑ ißkBåÝ%6”Uƒ¿i®{Ž©aƒ(\-Üê‚qÈOSNe9Ú~ŸGªlÓ»‰àb—ü*r`OB˜P/Z’ê„GšÒÒvˆÞ@AM¿šAy,L±EL0/œÈ‰ zŸ19PÉÄ¢m ôX@ˆlLôwb}p'd>÷=tf"VäìM;ÔëÜÑ—ÅLæëãQ´lf‹ƒS, ¦°ö£3;È šÏ({ ýUâ¢$ož‘;­Ø/OŸü¨cXmÓŸFdàµÐoÿuÖÀ˜0¤’#Ä͈Y‘b‘lÐ:Q$ütPnÄdƒëóÅ.‘y;._sê}ê&±¦h%=lh•æ }—2§†FæT\6³xíu Ôôñ ·1£îLL¬k­)ͶéJFÓ½ØTÈ!§”­_ h²wmJõ{ëŒÃI¼ò›2Âíëe2p‹U?Ãã8o½·cØÅsšÏH–Iãe ì¹Yåù…¤<±½e'äŽ;ŸAê¥^’‚?£?(yd¯Dktc$ûpVÃð๠›F‰×FÈÓ»·º ÅîÕ­CŒd~×3nÎû8jÎËx¡(Ä~¾÷Â5é•42Þ æòQ‡Ò…Ö‘¡Í¨¶Ú½ž‡Áoå}QÜÝ·"ÖÈù'J^ƒ4m–z9¢`f¹Ð!ÂKL¨ü )]_†îA¶Ä?XÁÜ'"lŸÎW­u¸S,wO£ãÖê8¹Ðìr“Ä;ùwU팦ô5|Èw¯ÈiðâÖIÀUfšòHþÊeÓA«x^xA„Ûïûá ppP( …ƒB (‹B P( …Ã…âA!P …B¡p@ X:Í.Í›™7³{>=¶¾-f…^ O‡g^)˜kÏ‘ÌìŽïFÜP‘ðÉR_Œø¡LZ:*ÌI‰žm­Š ¬>0VN—Ü8aAOc.¨÷„TsÍÔª ÷,´æÎjÌ¥riTØð­‰[DyãŽ\©;~JúÙ?pFKp¯•} /\ÙÙ(òßæÌ9{>´v‡£ß&¿r­Ö³·Þ[Riæ-™!z61×u³Ú;3ª?ÝR’«x^xÃ`E·ï;0( †ƒÂàA P(…`qP…Ap8 …Ba0…AaÅÂ`Pvºÿ§÷îy÷ÝwYý?’`ëìŽ{RZެ&GnX0²Jâ@EΞ¾©cDŸg~™0å3®¹eÀA¶Ð%Óñ‘¡Sª1“LUR;ƒH˜ë‘I÷YÄÄ~Ø æ1µÛS]òqbk¦'¹-yœý3:fòû¨ÙÉ<Ènï8™ìx¡ˆ†w®Ô/¨©bLJW&-iÝÐé¹ô*Ó›úœ,÷žV²QAýÍ*Ò™±'Þ°ùÃçQ2©x^sQ†·3`!p P( …@!ÐP, @! ÁB±P(,……@¡P @ŸöÞ™{çœ÷ã¼ç¢ø?|z¯1'‹,ͬö¹[Q؃ÜôUmèѰ„©Oª ¬-¯Œ“ª‚Ø|1‡RÖpäPÈÛ‘×^žERʱâf™(cBQR;qg!N ž»5)£/m‹HYFÒxÔé€Ü¢”•oÍC{užÿ3¸š/a'‹-cé&ò8êgzÄ? íWb«x^xA…Óïûáà  …` p( …âA¡( B¡pƒÀA! ÅB¡P8<(öov¿Ù™·óÞÛ“â¸Ø»k>Èh£´ä”ܰbÂ2>ðË÷~Œx$Œ7ô¢b‘dœq`)VZ.d)ùeìÄ=vrì­¾8ŸF¢Öš%•91§ª]Q¨?‹g_åb}sS6Îß3·SÇ«:ÉQ{#ËŠ‘J…½-sç:Õ¯uYQFË—ÆAžßÅv"Ý»•oÆÐ? £–¯=óÜFn·Ñiêï‰åRÇß:lþB)Qf­x^‘{ÃPÅ»ïûA¡0( ƒÂ…@ P( …A ƒÂ PxX(…@¡(Šý A`0ƒA`0ØiÞûÜsïùÝóVía¡{Ä'™›8–x¼`Ì)mFž”•iø£Ï›ÞØŽ\¤Fªä–’óÄ£8qvTíä‡ü©êüà¤Õ¢LÅ¥¬ñm¨]>gj2»hך’ÏÄòyL¸jÞã×Цwu#%Ìí•TɆ|+{h VâêØZħÒtÉ4é!±<÷ê¦d 'Ñky7ëŸ 3‘út­b'—HK;‰R°W2Gó¨_M:¶x^•’ùOÓGK÷áVæä'“CøZÊ:Ž@G €@®M)¢“– †r(вq£"ÐÌÉPˆØd-…‚L)—„鈱"7là8dÆqŠ‚0¹Ê–,þ{¿¼Ÿ_ò4’ÿ'ˆ7~Ÿ¶úNòå—ÛAy¿!ä-Ø[2¹ mÜ*øO^­ÜKÎd¯ýÄOýs„¾‰®•–Þ5miÁ¼<ÒֲʪØM–U5ÁšWYÝ… ÕšÎoÃĉ„ ?PªéªGu0Ë.8+ážq®‡=¼<ö×ó£×sä’Vì£dblÔÆÌDv˜µ`PŠD÷¨îC÷alx\þ$ m½ïyQÿZÒ-(M†¤–¦p7J;­Ó¶ú·q Ng$鹘àc»”Wu(©¶Ìáž¼ï² PB’ßÒPcO:9ÿ½`F‡RÕ½EêU%éJEæPè»ö"NËÚ ý Œ3Aؘ{ôéñH§ÄÌ( 1äÓ~HŒcÚ×Ûl<¡uª;ª„¨˜úØêÂÊ\Ä]¤ ÂÙÒÊIK¢tݤæöG$’±ñÇ¥L[Œ:± m¯QùtäiÚ"¤&Ev.'{XΖ¨( 7D$#ç×TöäÐö§Èóò ëÉ¿‰KDÊö‰ð iûæVΦãö3r€]2fåA¤a¨øAÓ4Bé?7 ¥åâËô½qá¼ò«žY¨âæzç•(ãŠîü…/s|ÇMàèCÓ^¶/!¥×[´ì™)bhÁK+À.»=þcSð[{æÍ¤À,Þg`ƒŒµ‡»ïxMh­–ÕZ\£­ÇŽæ1é[.ö@ø`Uc\&®ê¿ˆ[ÃÞ)r”æ&ö h'åpã³MŽbŽCœ:XS"ø)£:—Éœ­¼Pßþ 5?]¹ÁÊ𘋃3uq)Œ$]I$¸u`~þÃ’­âX-\3 ÓÉ”AW¶lº!E¡ ™¤œ~_+…ÃáaÐëó\_WßYõõU„~[ï|DBmó¬~,PÌvoÃÅ~C›uL²¿Ð ÔÅ-zÛ£šVTÖÚ=‡›[’&Ç6µWìžÂTÙä6 ¶•2¡ãÈmýé„iqôþ6pA¥.ôy`yæÈ½Bg°b7%èÂÄVðº}$ŒfCŸÆCoHÍÑ.%z³v¯>™Æ•Sq]3ºfZ¼òÃ#èeϪ̞£ zzƒR$£Ý«Š]D†¿«ñ"†oÊÿ×òö*âXïr“r(ŠvÖ1‘êóR8¤‰•&ÓNððSÌâûx^…΋S pð¸o5+§¢­]»¨ýô­\ ‹Å¦ä.¡eêtÒ¥k¹Ý¼¦ÖcY2¥§²+yë\£:7ÝÒe‹,㮹º¤.–)ÄÀç/ø,þ¦Zƒâ |xåE´æÖ£à?Kj€B–ˆ–Q8*ÚŽ[`XÇ‹ÐÐàæ‹éÐØ$èe{_ ÷xÊ;rmÑU?<&Äf÷à'ø^?Fä®gÈ“ê¸,áT¯Ë»!g­€Y YO§ƒ6_œ^ ŸÕO³È¡Ž‰n<ñôžAÙî‰8ˆTÔÁyå3!ø ×ë(XÏ«"Ém—XÈu9#+yõRXÌ·(ðs“1Õ¿Ãï_—(SØhËÿ ã÷®+ 3!ÜðXc›…¨®‹€=1v´¹rhˆ¿‡V‰ƒ>ué$t×;˜õNsǯTôÚ{óatb*p¤¯6†@Ã[ÂË9͆wH38ÝרšTt´¨òmXNÕXPÇ! k'e DÑ Éö Å|§¿éªé,p^³g¡°S”¤"Å’Á)?;8ú–Œ¿xÊйR¤±0Y%õ$ѹ­2æ2x;µaФ¨7à‘Wá ¸üíxÉò "‡ÅùsÈ.y¥b}¢<=ç1¦/åcšÓ“†Éš<:¹A¹cÃp^D^¨ŒZ„­á0bTa~úà 6 1}Iaû¶&´Ç˜úPy2Ä‡Žœ‡ú ³ #éå¿àñŠE G­þ˜¯\:ƒÌÔ!%n_±›ÉGàTÉþ@D?XëAê¯~²A®=³š¯¿ßc,ê¦q{£ñ…º1ì¾Ïå¤ÑÑü§÷ê#MDHYór05çªP|·8©¢rõ_Oã2¹x^O1! äg¶ ¸ )¾ø ' W¼Ê/‘€$  ‘€$üfÉfw^?è•P‘qcÜSG‚Âù%Ù„!A¦o(h>H$»`ú€ˆ-‰¬D‡™Ê†Å~ed )d9"ƒˆ¢ˆUV<ú‰©-ëÔOø8¤J ‚/€ðCJp .(Á%¸—ð+3#¤Ó݉קònÊ ª*ߤCíšêºµÌç™êÔ'&;@˜j™[£Ït .Ssñ(Tr±ñè&âï6¢³›.xÕB<À*ÛÜJÝÐí(M;ázX¸ãb»Ð/0÷(lvr¢Ÿ ~iWÚòƒíZqØvƒã÷$\&[ºG4à¹gµhm;õãͤ㒩ÑsGO~çZþ¿à¬?í…Hò½x^%=•Æ EÙs^A±RL‘2" ŸÊ-# ‘ Hˆ$ aïðq0?ïò†Ÿ?–úoЫMIçgÕØÕ4uXÓCý!;9ƒ]ºõÕ6Õ=«Â²ª¡b•¸*£NXú`M;Ðn°S)–=©Å—JÑf7ú€C_l1wLÎPMƒø¥{s5|šßKq©3ÕŠbæîÌ|‘ Ô=™bÆ¼Ò xU^É(2ŽÓÜé\]ÿǽ»c§ü}Ktæú¿Óu9ÁÆæóü!¡PR³x^P1±!»?“b‹_œŠ-®DpÅ@ùJ$  + H@^Xf` »É&ü}¹þ#6"쳤àâm¢cjÀ+ †ÂjÑŽ •»yµ5$ 2&–âõðXÍ0]<Éö< Anª $Ýät Ù24±çõ‰•Z]êgÞ$³#¸fªKT“èè¤ÛÌJ¦Îá]D“^d¾]N4¼uw›ØßÔ§ˆs™e;n>¹´urÜÔÊs»‹î‰ì9¿Qè)~<ÖOR»x^%1y!DÉ÷MA‘â$Plñ—' H ˆÊ”H@p€„“¡öíÎ0|ý²T®©¤[ñ§*êÕ¥¦®ñqÐ(§æÔ ¦Ý@§Qªª qZVQenÞ-}´•úµ å8ú­ Çë9þüµxx†TÎaYÅGeŸð¥ÏLeOÊŸ¥íU˜]8_ÖwFߨyÕþùN²5·m긅ó³AŽÄYÑOHµ¦áwêm–ÐMª›ñ);ù¶¶û`S•ÙuœËCPr·x^1Ä Es3¿ ¸"(¶¸ H@B\‘òÊH@" H@B$Ü[2“°ÀÿïæõãQ{!©|“²6Me«zT©Švz,ëfíJìQØÆý&'§ª5íÔNs‹vÂÞJáÑfÎ>™ÔØy æÔDy©>YêÐÛ©Ö¿ÑÝÍë9ŠÖWεüú¹¼§ÎxVDïî=Dfkï=£Ì [=Ù.Ö´ÿÉ;ÍpeõæÉxªý$.PÒ¹x^%1! E¹™_P\Š”H@(Nå•H@°€$Ü'·3›Mæÿ¼Ÿ}}ùà¼'<ʧ!ccbÁÁÀ…ÁÙØÄ¾Ë¹=}Z ‘SAÅà÷ȤÚȈxè(²lQF»~Id>|ëÂI·'n“Ù;n/ò®ÛhJU–“¨÷xdÛ™4èݪš{©4vÑf²7š<ô]j¢#Â˽sÐ×µÙT³êçV²w‹Þ½…7ÕV&&ñv2c£X¦þ§ÿçþ¶Gò·x^%O1D! û÷^†7 áþˆ$ ñFÆ‘€$  H@.å MHÒ¾¾‹ÍèlçÝÍO2ßx^…ÑýSt€qˆG^ÎÉiš$÷54ÔaáJI‘—|A#…Q@úË&bmsã@Žà¸ãE*8FR79OZaFÓ@CBÔ )šÀ¦8yQ‰Ôºþžÿàs³ú¢¿ÿÆ·OìÔñgØOhê|[±ýüBï—W›•Ï›J.²xÞý&&ÂéhÚçÁ)Ã…d×Fb(Ÿ2vS§º+žÑj¸*=©gAãÎ2¼Ï˜Üˆ^i¥ÑâÝ÷òÏõ¬Þ¦°‰.Ë'lðO~–¢k%F|z_>ÄѵçÎ#KÊq¡ÁØfFg\ó»èJP†oµ6#‰¶°‘ÂíÈ …q1¢iQ¯ÉÝZÕ Y~Õó X1'žœ¾ýß_–žÃ2øq×ÑÊ=xºB ×\nÀeVõ¿»áb+нŒ /ÄëS¶“Uty&bd´âé= *ã0óŠR+‰ïIû§ò_/Bõ–F§™Ù+¥ZÑ„Vž¦UÈ—5±²²ón!Бlé=(8¬º¥`ŒÖ¡e;GÆUC äªzHq í€GŠ´0ù¤]àm0EêÔ±Ç*­ƒÁ#2Õ´«AÉé â¼Åô©…ÆÅ‘"¤ìB)Z›Xe`z^ö°S·Úë7KðÌ6òüƒ‚jv!ë[L‹vŠ šmž¯ðŽ56”½ ßrk *†ö§ªŒð@͵ÿÚÊU’ŸËw;"nRNy½‹Óû¦äQ5öFÓ?yÌ­8/žÔð̬ꠣ馰…àRÏ¥/‡µ¶ÍqôÉýÝÅÙ73둎Üȯ^Ÿ“+xz­Ê$´å¬÷Xs¦3vü„ÚnΦ œ‡e%ÄæZ5Ë-FÝt5“¯YXÎ@²¤ÅR¾Þy–ÓÐ;¯Bö:*ámÙ÷7âš >ïç¾fñŽ‹—n\á&èÏÙù³œ:rIûÃGÏ™xvï…Ĥ€ËR{/߀ž­?µ¸1GvLë5îâÐÞ¶‰~ù×…‡GT3†BMá9ÁÉYÒ%OaÈôëô^‚^pLè%l5±ÕNnͬù0Þ†ø­®ó¥!ú7WºŠPÃí¾·<—r>U·/‹ óN©êQÆY…æÓÊOÓx^t‚a†Û9üƒ ¸ƒ üƒ ƒA0~‚ ƒ ƒ`8‚pƒà‡ ƒÁ ØSßwî=÷=÷Þ÷}ïÕàò(øk9òÆ>öéœ57ôÌ9ãê„à›hM7ʼ³¢IJ›ˆ&}Z4˜çâ%'ë¾ÆòX8™sÍ'w¤î·˜òÊu÷ïcÄÐn—gþôQ’>J¢ _òd±à@ÆH½*ÑÒÙÜþJ„­8go¯­‡ Å8s/tšÊŸ3Š*¨½aéDJMýÌkNîO½·¿º*ZýP–µÙÅí“\5•J‘ˆÆ£|/Dxƒ·õôWHvÑåV¦†1cËì¼TÖÑx^xÃP…»ïû!P…Â…à P< ÅB!P( À`0…á ð ƒÁ  ƒB`0v–÷äÝïžóßóîY:FºGcNxó®eËœVܲ6GÅ/,HƒÐ¶,™±æ…/92;ªv$"Äô$ñ©*á$Ž·d oˆ@®©ê Q{î¹’3¶FÝœVî9oÔë}§i+M0&ö,ÿ^ó#j9½eœË™«çDilOÉOêxZƒIPJ}Ãud¤Ò.éƒÚf|kn?$ë”u']!Ö©Ò]ŠÕéòy®éí]U­í씿 Ò&FÒ†"T¼²°±ÿ+J ÿ¯|\ZÓx^xÃP…»ïû!P ÁA¡P ÁB`P( ƒA!0(ƒA¡0 …a`P(ƒB! ƒÁ`PØùúÞ÷î»ïÞsî=ïžÝŸïonxeÈH£dlCãhIE®wÄ><°%ѵñ–Ž4H׈=ScÄ'­6Ίg~ü*]ñëgÍ;]å|™{tí}*% 0îè»ÏR!$ŒÜýÍÝZÅ®34¯âÃ]ºšØ?:[Û¶”’U¤ ÈŒø¥£•󑽕ù=ö#+© Y¨O×Ș±5>1Uí¿¬6bÆÎù­Õí˜pë]ZOâÈ çî_’)0³ò4 órÍmg,‚ÂSëýUáZîÓx^xÃP…»çy!ÁÂ`0( …Á 0¸0(Aa0¸ Á`0…Â`P …Á`X;Éýèû¹ç=çdÑ?ª–)3¼ù+ôF\sà VóÃ'^Ó‚ÊKrº³o*ìžšRû{ýh,&Ó6aÃ3)æüé¢âL ÆÑ2u^{Õ•úM1Ó ¶ˆƒæ{Ñׄ8ó4œ‹¼;¡¶¨ÒŽ´Úz]yÑþ–Ô•fÍ\”Èæ¼‹ü$GKîØZ«ß¿êŽJ¼°Ž4ë“~Ée%/¹’”R¹”§±8e§›±§Ll(ס[e,-שÏUÅ?ɬY†Óx^xÃP…³ïû±0, ƒA!P(…Aa0… P(baX(…@aP …@ 0,ÀNóÜûιï?ï=DÝÂÑžoÄ4ÖL*–|pÆÃw· øeH(m‹g¹N9r_äl,V-x%a%¿µŠ¦ùLúN¼«¸Jþ8q$²ƒnï•S‹Rw¼°Ë¥§6íx Wz|à›ËMï[Jq¥¶'Ò\Å“¸‰[ð#’#¯=° #¥Ÿ¥ÌY˜Ã'­’פøôÍ”:RW3¡´€‹êI„£”ÊžÅ.õîD©+»¨ÏÄŠEÌù²±Hï"7ªsËôóžúöNÃùOË^:×x^‘{BQ‡Ûó¼pa\A„A°?`Á… ƒÁ „Á…`ƒÁàÂ` ‚`\‚Ax!{ë8ç|Ïûûý¾ïÜL¯‹†ûï´©£Ô¾lYñKÅ6–t¹ãdõ…9ÝX0‘>óÉ5U$<óÈ‘”Œ?Ê(¬äsšB>U¿‘É$Nô¼wôÈ]õm;è±6¯d9‰ê#Oº&¤QéôÅ‚K_söñÍŒÂ$Øé²2ï–½n;«)ÃÈtÙðæ«%“™×ö~ÏÒ´WN±’Tuœ'÷wšÖr»FŸ¡y#½fŒiüHw\¦×x^%xBa†Ûó¼0A88xaƒ`0‚Á ƒ`ƒ`A ‚à .Á A0 ‚ ƒ½ÝÝûÜ{ÿóßýÎûŸ³n~QðîP$åÀ:ÖµOôsAÆ#YdLXR盹õWØû-QãÎR AmÍ‘®ŸóL…„)-~MœqÏVomóRÞùô™«Ï(GŸ*;‹ÜØ©oVý‰·¹¿gΫëS^S^TvYZGLÌ=ʺÑ'u 8]©V)3ˆ “»ö;—éóŽt¶}wxˆ²¹{õÔ9L˜ÇÎý¦oåhq‰óØðázèIÒ8˜×‘÷è™/I¢aÕt‹†?ÝÆ`–Õx^˜Q…·ïûa``` ‚ ÁÂ@ð X‚` ‚`aa ‚……`0‚Áp XX‚ X‚`aaO½÷}÷Ý{î»çœÛÈî‡ÝŠ6?ÌðÍïù„tÉ…î’Y‚Ç1ú8Û±çÈ„Ž€‰ý²R¯E¤g[S i“ˆu*Æ[à,lÉåŠ>¥‹ec•ª@ÜϪöäÒ;2ÓI±$±’TYHSý fµø3yËÙðÍÔœð…fÖø¼³´÷•W¡¡G6パüµá‰Øúšòä.U]SٓЈ¦k9u¶Òiû ÒÙÚ@lNžß¤p•¿æ}—ù?Èoj Þ\Y©‹ðãX¾É x^•ÐýSÒÇqÌi21Ñù´2Vßy7-Xó)›YWÉìLMða™Šy¶t×Ü2uš+­,SH< 0-õò‘p+­«d>ËŠ0Ê 4sZVf-Lv·]ÀÞ¿¼~›ýø?éß>¢¹·ÝÔF-ÈLÀ&jBó³ŒÈ¼¡ˆcVÖ9HüŽø¶-}Îâà8>ÕDZ„6`íªi†y0d{ÂC2]Aò¹…Ô€î甚’.†yèôøi2ÌçžžˆxV¥Ò.ƒuŽ¥¾-·Ì^·gràò²k½ FIDnŽÜþiºS */T85€•Ci4s$:yGŽýŠ~µ×©8O´$»ÞõÑ™ÉÕ}„¬Þ3¹Löi-9T0~öX:ŠzêðyÓS¬½ó¹¡ >y|Äš\©À ÉSŽNÄ4Õu7Vš Úìå®"ò~p*6¹Ñ!xs3yv9Ý\ù+B—?ÁïÉB©Ïc7á1"B}rñF ŒÈ‹éFDøj,-P)н·G‰G-k¶XT Ú÷æåßßà­Ü–*B„þtÔI!¡¾ÈÍMc÷Â+Æv|gd¯ö/‡cúú‹h¸Ð Wïœ@â!nÁª¼~÷›çv/¸O©Uk;‰±²‰ÛùEsv{¨—!=lbh&]!­ȱ(Þ\›‚fGã w_Œgo`O©aþŒ7Á<<›[Z„$Ú«Ü£~(x Øê¼ $‡û%¨Z+xÅ XÍ^úÇc.îìD±wøJ;A÷Ýi-Cwž«ÇÌ›¬1Òº­LÃ_!Éêåeå 8¬Åª^G .möƒÈwçbu4‘QHÛæ£èÕùúÁlM ñyXú¤¾ðëTÄÈSâèÿ¢âD¡†Ò°è>øÝZØÍ+ ¸œ®¹–è[8ÌÂ:ªw¬ÿ="bNÍ4!Nø÷ÁzLONJ*1:Òʪ†¦Ü/]* 6ˆ:¡Ïú¡Á)x¶Ä×¶cë_ŒmI‰ Ôf]H ÀóU½×;põ—ÛoÙ±`ê4­ï$*.|rÓ¥c;jR ‹ñeÆ[{žÌÍ«K Ëð:AÉ©ê„WÑ_ÖƒôlQä9Z?D„hˆ--—VáM÷3°„Ïﻇ«Ûë€C‡õá.¨á6š»óð&Fµ±ì dÊIC|Öeë@Øãù¬\¿w1Ã;(Cvø^!hltÅ7æE¶1ä+ï±aC{„²n]*AYªš8²¾ÎfZ‡-¿m¨Ì…½ ä”È›xÇ¡3™ö3 'c…àmrXªH¤ÃîÿL²<ßx^…Ï OÒyðį²\¥9—=!ý<õrvjš&.„ë¯ÎÝâL:/2šeÁ²rXš)i:òaž]ø”š…ö(V믕ZZQ-µ(ÆÐÊ4{°µõú¼ƒSÖO`¼90aNÊÆß%ðϘ‰@cˇCƒ˜\NÜ:<€½‡%k÷/Âñº ŽÙìè6eè¶·¿‡<Π':U@¨É4\)ß²÷-q`Šºž£qY¦8©+<°ð³,ˆ r[Zv™Q ‹Ä2ƒòâ»X9r ó=«&ðèÏý.(·Iƒ ÝY¹†÷~µ`Þ¼ ¾–“‡V½T/]ŽìE/Üÿµæ‘-·ihb¨RðtAa!X–¦sèI0-†ˆ–ó„ aý‰^gÍÇÁWÉl¸Vüæ §ë &î³e@Qĵ'0Îpoá{¢‚ —Á$ñ9ŠÀ(Ö7Ôð–ÜFd÷v éÿ~S9º ðSÈfç):Ȫ çZÕP§õa;Vô™ràи¾ ò(1Fi›}‘<–š˜«ø‚_¶b­ò(¼ç]…Î~¦‹xY/Ak…°ð‚rÞžÕðN2»¡6‰y´ºXÉ' Ù‘8o.³@Þ&¶AŸ%jƒÒü,¾¾Ž(Tñ­züåéFšN#þ‘w©±´'|†¥|HmÈÇ[YŽ~Ç4Å>"âßwç*Ë7tBÒ‘x¡‡"Ô¨h-rCæ6—Õ(y¸\m_¼9ñzöJŒ„¿ Æ M®¨§%ñTW—¢.waBMÏúðpôt>iv ŸFë´ Tw»ýöÃý¨º8&ÆÙÿc5hœ HZ¡:B4'Ó¯‚ý˜î‚ÉÁè,¤G„5âݼí3“YPð&xÝÉ=C Æ/Fœ=>¼Ÿ£x©xµéf’¶mœÂ¥ÊT.¸×w#ÇÆ¸G¶(¥H«öÀ;Z§ÄГ9\|mðê€ôÓ£ÂLÄnp#ž\Ÿ0Ш]LñÿÀ,Z6%«ZuØGUÎE8•¿¥¬ÎçÄS¬‡lÃK(´Mà(ró20~óÍ6'øÙO¥ƒÓèó3¬Z^Ùx^%A‘Å D³U}àðH˜C !Àaä¸G$D€$ !ö ?U3dšžîN~þx4?IE‡²†ìwª*‡ª²Î v…¥®G¯MΦ¤¥—þÚã];Ü4¬ï·ä`Î2¶*{7J·\ï8 =n…ÙUƒ+ãZq}aFʇÕíâªöí6˜#9ïí–Ù¨áR"é°IžÎæ½9IÑÈÅÙ¿îÜDkZ¡o·NºažÌÿAaÎpd‡;ÔÉVláãe°ðÚšThh,PA'aåÇþ%vÃñÖ¾ÞHép‡BOL$zŽUñ¡uRâ_2L wœÇÚîTñ¸3³5ÞF/Ðåçò€ÿ{¸_Ùx^%;‘Ä0DuU(¸@&pp¡!‚!(X 7AC„… †po´®jϯ«{F?o>Íß ©’æ«é–¢FﲡS™I¡Zñ´K9µãÒ°¹³ ÇP¨jvë¡jà‰UÓ>Ä“iVÐÐâ…šñïJñ¶º½œ?ŽîÐX0ŒØ¬ÓYàkÆü7ðIh%õ£¦“ia×nÎÌ»ë·L6ø2:j~OÅ#‘È–’ù•a{<Û7YfŸµ]†Úa:c‡á×wñÁaúŽ1˜_“ý5¨;ºö+Q†áx^%1•! „¹÷¦ ¸ )~H@°å•+ HX HX H@Âÿ…Û‚ÀL&3ÙŸ?>ÙoÖVVUÐl¦NmœÆ™Ô>ƒ{‹ž¢`›¾¢6N½¬krÛ®–³Ëv\ºyupÓ´W5öÃ5ÐÇŠz¼pL>Q·%º‡]zP»c¯ð¼›Éçƒu­1oi0ã&QÑKíÊÑùÛH€kÅoþg4¿»ß¨…-Õ_wUyŽÂ÷î ŽLö¶³å‹fiFÏ0x£µ€bž\Îg5’ø_lÞ —´¿í¶Zvßx^1Ñ! „ïͤ D¿$ á$P¾’ò/‘€„“€$ á$ á}áf€ì&ÙlîóÏg5N“å¾·EK¶ì6E¢ËhÁŽ¿Ì-ëàdçÖ$Þ6ìu¸© t…BÇð ò‹.¿/˜W®2¨ÞÁµ‹Þ£9­ UÈd)dð¦n[¶¨j $vU!\ ¬;ªÜ(¨Ï™¸1õ‰GmÁd\°Ÿ3kHg?v>*®Ð™²ÏJm#ïîF¸õ„N§³îdJTÉÜýÙÆšüuöü-NýÃVöÕx^%1‘Å0 D}3[¨ø…!¨€@0„@HqR^``†`†pOþ™qœ]­V«üüñ¨~ÝÊ:•T›M+šjÚ½Ãïz5@CEÃЩKœ·oq÷¥xUéß½)Ù ÷àèªj‹ÎCÙ‹Mt8œ>‚£¾ã~ã|û0Îèôço’ uäškfdº¢²uy© ¼3…Œ–莬RdkßÌ8Õ­-7&Xg«èKœT•T ïI½€ÙÕäóN u]N}µÎÆü¾3›?êÿߘXáx^1! E÷f~AqRœ€•€$Pœ€-¯DVÂJ@€„{agÂÏÏKàõãÓz?š:tªèøVbã¿´P.»ÉÄPÕ8Ý2+zˆÜÝq%-øö©±¶ˆ»*úRÖñ©¬EW¢²=(Í E´ 7Á FÅt>]‡\Ï7ëÂ1¨H*ôˆô»™í„eC'_w_œ–UÃÚŽËç"ÿe¯ðÛ™“ýNb$3Í÷AmÚ]'S×™"á:t›Ï<à8uѳ³û¤Nõ7KÖ´BÛ/äôø„½[fçx^%=‘! †¹™· ø $¤8HX H 8[^‰$  HX HX ÷„Û6™÷/™|ýòiЦ^%Þø¹µõhÅNMÖTA+|éV7×M9ÞtÁutIã(&XC3ÉÀÓ5¾_œ(á³Ýe‹®€T#+t ŒÉ'iZP9òwÆê¾ÉO8“ù´ÚÁ3ý6Okgû:5@ô¨ÑÝ$soö|to4Û žXIð-›\gûJͼ~R¼ïJ†Šù¥þo’ñdUó)#Îs‡…¹ô çB×tXfÈx^…3ÕÀ}Äù™J-Ä׿*]±í4[‡QOì)aË2ÌaŒSö&ЧüÎVùÑVÓÂÚH“1C칄)?Nó6¿jѹ'ó³91ÖíØçøÜç£vâ@©hÐ}ð4±9–x£¹ô4ÑF¾6¸%×¼N^«¦nÀ9…fu~™¯ ¬»eHkIv ‹{è(îS2|E’OtÞœGš„Á&bÒ_­Èîd… ky ±”-o_æW#ÎDˆ5¨ËÑ!(þk_üÏ¿;*$4M|Á̲õ:—S‹0?› žû½µYø)Æ—‹¼‡hÚúéÂÃ¥á4ÄÍJY©n’a¡Š°c"Øë¥›Íd覦_C:ÖËñ°énÁ«¢[Dñ¡{&N%ñ§mF/ª‡IfVÉCÕÐϳvÂ$&ÚH l”¢7£¾…¯DŽ >Ö2Ÿàäèr.KÅó× TØ¢ÐGk­óv:‚‚åF<:¬Ø¡Ód‹ÙÕ‘Æž”ûEîCuìâ3¶V9R'r´ šÇRpÚ6Љÿ÷í2~ýd!fÍ+îXô™’(vÑæ’Qö%înbD¸ï'i ümq5÷༯þ[Öä%–qá›Á2BŒd LÔc%ôž« R?Ù‰Õ¨lzm"CÞ5Ŷ]®¢J¼·€4•ž>a+ñv u‡Ä?﹟„fcêY&_fn=mÏvÿ«ø™çóÀb¥Ÿõ#îÈ#u‡„››‚µ©8Üý˜ù(Lžoðû½}'k6VíbÝMÅZTßÕΡ°”mêo/ôÑqF¾Hù§ó%L:z†jiʬ ¢lÙ™ßÑÅêk-E¨î•Ø %I‹·°r¼ŽÅð[³´Löóãú«Ÿñ’ì%$/N‹J÷&¼+ÎG˜pù¼gù=®X<àõŒÕ‹Éȯ”P¸šÝC“·n0¿™å½,è„8.à9UæC¦õ“8 ‹âûQˆ%"Ô¶øäÒ~0-‡ðŽôkX;*l”ÉבpBþÉ_ÛLñ|‰yóm†¢èb"Í&’ñ¶ºAôÒ{…ä)±ãV.=t2÷€.Þ<„2ÞE‹¯k3”ŽO­¡ìxOò¿ g‹VÎ x^•S;O" äñÐ5Ù†)ÖDÙB›<„ØÐ,"Ȫ³‰Î» ÉAgÔlc#£ ÍŠ¯…¢Wcc£…h² Û˜ø(@ˆÌÜ›ý÷kNNr’s¾ÇQüõ?â_ü)¹iG úä)°÷ýâ‹ë¤«Ðïd«Ðßå¬Cp*K6FnUµenÄö_‡ sÌ)¨–Ê”XCóömfÚCcŒ~ýŒyïO¾¥†ãEo&‘ñ:å‹xcwgÆSosÊüUšq}¡us5Å's=š}•LdímÊ#E „råWO#‘81UFŸ¯ü5wó6Ø––Ξ ÿü|x± Ñë'{Üýôô-ÄtÖºŒÃK¢ûòÄB:"Ð,qÖ@2ŽçÂÞ0èOkò ûa~ÄA¤lKèáb飖 ˆ‘ûï¾&°Ì]nWo3ɃH2œ¿KÈ,¯£D ™Î‡ìçutsëéÞ§º äÆ\äDZ§örc"7ˆÑªÀYb877mÅþhfzûÊ”À™ºêê`ò=vÉJhŽhaèmh½N!?öHµ`ˆâ{&Ó˜tàMA6éžÌ†ü¦—$òÚÙ0—wyö†ÙbáßœqQ±DÊÜmÕeþT[Ë+iLóÄÊ’&·Þ݇“^D…'›y•±ÀRˆ†©µjºö£ï²±k_…ö‹”~à¹FS-€àÙÏt[6‡¿}¿L~ãŸØN/Œž~6äAPQIÝ€R T,:PŸHgÃ(úê¢Ü3‚FýïÅ &*‚ð€î—á¯Êr‹I÷—áÚÕ¨5¨yë*rž‘-yd®ú"/ʰj¦mÍJ͵Ó`²(©š<#¤óDÝ·@!œtoÆ›¤–ô–AH–R·G ÃLéͰÔsw.Ûïr蘅A|o‘$ï=ÈNO—dñÂu¢•-żƒ ¦i¼×çC8–nÅY Žš0Öçìúæi ÆlQ¥,Aá;Úù˲­¦A\{3Þ"ÄiÂè¤&ºSFfr„ËÖ Ùö†ÍqüºöýI¨L-§+8›2^Éu¨ûNoq¼»FEÒ`^áº5…(fQ •gˆì§:!jÓaswØvZ~–¢k„ÛªÆm7ÉõªÙ7ú¬5¥ƒþò!÷7½¡}ºtny뺌¥Þ”¡W€(ªØFùñJíã4œÖdž¿! ÖÀÒä#&¨d¥%±§’¶k0ÏÇXo=¾åj"³Œ‰±µOü‹7Aœ]Eñ$}hÖ"Ïð{Ir~ÃÉi@¶.sñ%|û¾ŒtÇý¦½†àTÊj½A+½ZC­Ï›Ÿpxñ|Õöå½§Qã¹væŽÚd;ñá<äå”ÏÎèìd®&Õ_X ‰•ìË+0öÂÌ \\º”‰“ýäœ#Æðõ¨¼‹ì =1çîG"­Ù;l^ÈV è&’W>\§Úã1ÐÉÑø ŽDýyMKF-¿=÷h7ÓçW.ð=”S¡ÁûÙ¥nqU·¦”óÒQ2N©a%üV»,+W2-Tae‡þܶDqýx^tBa†Û9\ ƒàƒ ƒ ‚ A0A †ƒAƒÁ… ‚ A0ƒ` ‚ ØsîÏÿý÷¼ïû½ï÷ÿWOù¢àWåÄš?†¤‘6R®9óÀÑ:Ÿ—W27¼1ç–/6öŒäª ¨pY¨³ F™„,.LØÑÒ£OJ[çOŠì¹#s¯¬ëXž¯vxT[ŒšúRî>ÔeÃ"j+öMD»æoãœgÍœ$1aD™Ê‰óuž˜Œ¶ê’yu:ªç cÏ=ÿ¦¹ö—Z,ÙÊõT6M­‘¥šžÝYLM¾÷'^tï°‹¦ç’±s_Ä DÌMÓð–}JI=žå|ÝËÎùN+ª¾Ë·lÝyO@úòøgÖÿx^tBqÆ·s~ð`0‚àb ƒÁƒ`0 ‚ ‚0xð`A0‚Á ‚`A AAÁ~§÷?ïœ{¾ûÝï~߽ͮ7¾5^¹pâçôÌ—u¶Ø:ØѣÑOlY‘ÇFFB•%RŽõ…‰œ7æ4èÅ…™½“*ïì骽V-xfÁ†_7|D&^W1¡æTðU¶ ìDê#×]Sƈx•¿˜:Ý‘­_;m–±¢ìž=K¦ª-DšªBáB P, B¡XA ( …AaP<(Š…B!P @a(…Â`¿³¼sOîËýþÜ/÷‹ÿGwœoí5–ÓLÎ\è´Sª­>4¡+UØYG­˜^´T­X¹Šäƒ™Q­2m¯!·phg©újô î gS½Óç #}JJM*P 0†Ýia'îWx}N‹Ra?|éàÕ`(<š±Y¬›æh;oe>zž­¨2¸éD¦öÔZf5¾¾²OJÚ‹ý‚x±Ä§b§Ÿˆw¢¥‹ÕÙNˆ×÷ ïÎ&­žaxÔ•]†èùK É#0¥U$;w„~æ%6!o£'v«q˵ý¯dùx^tÃP…³s> …Aà‡À P…@ 0( … P ÁA¡0( ƒB P ‚AaP(…@ Pôžä¼÷Îÿßûß{ß]Ö~8Zÿ¼ðLÄ/®¹Ã7*Ýéi¿gàÇ$œt —ÓØ˜5ñG—+[KxW§ÂcLH!LIAÊ^¨œ&o¸¸?âž„ZY®N–)K|1S[2dMŸ€ŽößRMø¤á"ÌY½ÌvÌ„zhkG ßÑ©«ðÅ«u™Q)ÕY¨…ä±'ÝRnÖr~µHI>¤È÷HÙ}ù‹ÑQõ±Õ¿XÉJn=©8ú7mÅmßaצŸPxn,•X¦t¬gÏBþf|kÞÜj¹ÅÙ(cŸ'ÊJeÎÿx^tB‡·s>‚AƒAA<Á A‚`„Áƒ A0Að`á` ‚}õÞ¹÷¾{Ïýý¹ï~t{¸óM8q¦Éž<òF΄ovæ z´¢T)r´NøàÊ´Ø:)³4*qrwÄ!¹ó%½¨ÚÍÅe¬ÅÔä>¸±wÍsw.òÔÝzfÊ—“"Y o¼¯¢*F‰}œióçdªÎ“_o‘Û}Ú õܦÁ,V²”h:,t¼„GyrƬÌï”"qôÂ̺¡ï ;}\oÌd™[+±V9Q&x‘·?òôýC)j×tœ0!dOéªY‰±*3oü‘g¢§E´Ä´¸è­ëÖˆ_/OíÆtÓ5’ýÑeb÷x^tÃP…³s>x(……Á 0 Aa0( A!(ÃBaP ÅB¡0  0(@`7KÎ;çå½û÷Þ\eÿžÞîYóFhar¤å‹wRf¶˜2áZ§S;ñƒÑ°fŒO ¨g*­Wœf&¢9žˆ¥)(Evb ˜»‹4 K¸áVªJÔ™NFöËIÚß|*ш̉äØc¯$¹H¥m8³ÒíPîwJXÊRÄ£t2dl,V†B½ç d ËuçËkÍ‹v9{ë«q$çRì¹ú­ë½•*•³‰YÙR wZCZb¶“"•"áè|>¬Ö×Xüî¯ä"wžhzmñ\l­TšäÝWûÕñø`âÿx^tÃP†»s> ƒÀàB P @¡P( ƒ@`( …À` …BaP ƒÂ 8 …A P( û§yç¼¼ûîÿßïÝ{7¿}´´^¸ðGEIji˜’Ðå_| ·%#Ö´ o[,O%Ï#Géîñ¥©¤ð8é.fk¾2=¶ü³P…ÔìÅpycÔT·•2Ôc:ªŸR[I‡¦ZÅY„Ô.bþhx¥ÉÖ¶VnG΄)ß¼[Kï;1×M!ÞŒ/+tŽDÊ´·ÕãЪГ/ቡö£5=utÞ‹Wh¹5„D¼H¬‰Üž¹ú»šÃ§X¥4¾™^¨ÏLwžÙØLÑ”Vò.¥=Û@ OÓ©w¥î[ÂÎ oS3MѹŽNaÞýx^tÃP†·s> …ƒ ƒB¡P( …A¡0 Á@!0( ‚ƒÁ`0( B!P ƒB¡P Áþ³¼ó’wîß÷ÿ7·ÉÿÃVÉBmo~êIÈèrà™Zjß&4 ø`˜Ô¥=‘S±æ^;`Om^§ 1¯¢½ób{ Æ"m¤,¥xë°“G-Æ™¹N©8òHOj†¾­äªþ©îÍUƒ‘!߆cëíÉ­«ï›\N8eø!´V¼’ˆ­2Ÿ’YO”‰:Æ´ªV\-ѧ®¾h b YÉ;VÆ“’ Z&O§ŽˆOU¾XØJ³UüÊ1P¦”­íä±Ö„3îDi)-×ô(­h‰º"K•ê¢UèÌÄ,­Ð$¹Èù9y¹?KƒaêÜ x^•Óù;Ô Çqô‰U¡Æ•}ÛgÓ!Ò±ÎEÊQŠÜ瘡è†j‡vW»jkŒÕ :0‘åÊT$W¦2Ù¶ew£q<ކaŒs{vŸþ€}ÿòúýó<yúÿ rÿö™¡çBíRP;dOæ –9çÖñ¶wgÆ,ÔŽŽ mÉp^$YÂÈ#þcÇ'RyH°Îkæ,saBX7å5c–I~hÞ˜÷§Ö .ûð45æ!Èô±,º 9­€Ué±j§‡åQ.aéæfuŒ‹ KyJ 6žV‰Ò&ƒ3´èo[E˜8LYeÜÂâÅò®‹¸ VäÚ,CB2'é̤âN1ñcŽ®Oäs”w;¾¥ñÑžOrË#·Tñ‡cpkzoÑÆ GÑùëXB ¨»7ƒOu”Õ[@ëTFÛB8»Ë¢øA`”ø\)’ÁÖ’d;…ÉÒÇwÕäªUŒÜd‰¾·*¨t±W2n3‹ì3pÀ+äütïºTmòÝÁ7‰wJì$`¾Q9¹à”+¯y0Š„þ›å$Úäჵjy¡ççÕˆEF[Q·TÒ¡j!#“¯L!0#5½n§ßÊ Ç_”‘·‘mð6õÑ FÐ]ŽDvÝÕ‡&Dó!v¢ö=ÇÚŽìFð¸-}šW[ïéÁ—ƒaü‡`Þ6a +á,:´öÛUpV}ºÿ £e‡OØ4½4eUôvåÎã§M¥7»•°Ó]{Û9˜÷m ‚/×iY}õ}ÛÈ PJsà–‹±U©Ì ¤˜PÖÆ5£PC3Ž5 ©Ý£‚dgtÚi *ÐiØ#µ!VÛ‘µÒð½ýñZØ=ð(ß~ÔêЇËRÂöû¾ƒ”—£üJš]±öÏ ß¢Ë#[L= =Zª„zÔÓ»OÀX1“wª Ö¬Pžî9bJ)BŽ<ˆ¯èfJјÜà,Áe85:§Åî©Tr5H£7öºà=óÈf²FתØ{ÀšÞή&´zÓÔEžðk>¨*‹‹¬]eJø#z{S `j<[ªÙň/p÷mï•¡Uí€ã.Ö5\¼D&â§©ïL'qssÉ »º‚) Š/žUŽ¿‹ãB§²àñ’ÑK^JňßÌË«¸ÿªÀ‘–i?-a«61±{§¢Õ×Xµ ·Öäl²@ÌZãÐÊLT«¬3Vâ£;ð啨T¨ö¸N]ƒáïÆî‚ »žÿšõ‚`©û¶(Ã7²ôlˆôªÕ纱rùJŽ/\Î;fKxøU}·E  £`_üF_®r ð‹Ü/MáæVOlû ìÑœåSV«ëmrš˜eñõ4t0ù*·k}-”iõ ﱋÖÒõ¸ß¿~QÈЗe+M¼OÔ\H{ºÏêAlåМ‘Òzüy`?·¸tަ¬Šq ºr‡ ௗ¥(·ìFÃÁwrx–Ò8$ú‚(o7üÃÁúæM˜ Õ CU{$%•‰é0+qZ„¥©”W‘ÕˆYÙ¡ôFìo;¢šÚN$­$Í­†8úË,íAô&½z³½íu¿¢ºLsý£2Ø®Œ5Üû{«k?=Àë£þ¿õ½5g3HDet˜tŠ5Ô~®*j½œâ £pÃ\ö?w(:\Æñ"É:óÐMòÛŠ³Ø /±$Awƒç“ä5ÿœèVeÈx^…Ï‹SÓp8¾…c ÂŽ¸µ Ž—p¡L—¶Ò¡É°­%B<7Ø"¤Áy Ý:’œzã¸ÚdX˜pÈÏA€1Ø®¶€$a ÇpòFD±»þ>ÿÁÇ1ÿàYõŽë±¡Bèe/˱àÉ%-áÖàÈ„Jk §¨´{èÈï©‚ý¹#‹‚& /ÿ¸Š>N@$*W3F1e vÁ;,ýñ)ÓŽ”ZCËdHmN-Có´¨ ¤!Ò#øNm‘!9‡ïmN9Äu ´FþGZPxirBy‰2_b$¬¬øN‡£Ò_RI芿 õï–Â{‚eD]ÛºÛí¨APcw Úk_êÀv‰åAÊœ&^wmBO~ýãV fë¯1@ù³7·”•ŸBN;Ƀ*80ý¿ ñœü·¹‡“û±¦L~%½´!K ¼ŸÈ_GW}ŠÖãkÇIŸ¶Äà‘Ov âc¹I›å\$çBó,¢6#õÔ],T§7ð†èº…8e÷n@¯¨Ôšm8 ¸ßß÷´ çhg;4E 8œ™7¢þ›£³Äöó×3 ô,R"Ëê¦Â½‘I_ÃmÙë)D9azT•ݳÁkW…Œ0Iƒj ¬›q„åæ-8Kï¼ÀãCn pÄ|:hÃÿ§æ“ü´æÀ“wx•àý ðä^ˆàýÝÕjà}Ânñð@ ðxIc'ÀîVïS¼pZ€J€'ÀK;vµx—8ðÂÃ5(ž/iìxØÕjà}Æþ2@€J€'ÀK;vµxŸsà…?kàà ð’ÆN€‡]­Þ[ xòÌ¢RÂ;á]ÒÔ ï°«Õ¼{›ñNYTJx'¼Kš:ávµšwï0ÞÉ‹J ï„wIS'¼Ã®Vóî]Æ;y`Q)áð.iê„wØÕjÞ½Çx'Ï+*%¼Þ%Mð»ZÍ»÷ïÂGHï@ ï„wIS'¼Ã®VóîÆ»ðñ7Â;PÂ;á]ÒÔ ï°«Õ¼ûñ.|t—ð”ðNx—4uÂ;ìj+ï®vÊPÐ3bgtkwave-3.3.86/examples/des.gtkw0000664000175000017500000000123713166335473016076 0ustar bybellbybell[*] [*] GTKWave Analyzer v3.3.51 (w)1999-2013 BSI [*] Sun Oct 27 23:53:49 2013 [*] [dumpfile] "/home/bybell/gtkwave/gtkwave-code/gtkwave3/examples/des.fst" [dumpfile_mtime] "Sun Oct 27 23:53:05 2013" [dumpfile_size] 158102 [savefile] "/home/bybell/gtkwave/gtkwave-code/gtkwave3/examples/des.gtkw" [timestart] 0 [size] 1000 600 [pos] -1 -1 *-3.973790 10 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 [sst_width] 220 [signals_width] 107 [sst_expanded] 1 [sst_vpaned_height] 152 @28 top.clk @22 [color] 1 top.ct[1:64] [color] 3 top.key[1:64] [color] 4 top.pt[1:64] [color] 5 top.ct[1:64] [color] 7 top.clk [pattern_trace] 1 [pattern_trace] 0 gtkwave-3.3.86/examples/transaction.c0000664000175000017500000002140213166335473017112 0ustar bybellbybell/* * Copyright (c) 2010 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ /* * to compile: gcc -o transaction transaction.c -DHAVE_INTTYPES_H * then in this directory run: gtkwave transaction.gtkw */ #include #include #include #ifdef HAVE_INTTYPES_H #include #endif #define OPTIONAL_DEBUG if(1) /* * some structs we'll be using for event harvesting from the VCD that * gtkwave sends via stdin into this executable */ struct tim_t { struct tim_t *next; uint64_t tim; int val; int delta; }; struct event_t { struct event_t *next; uint64_t tim; char *name; }; int main(void) { uint64_t min_time = 0, max_time = 0; uint64_t tim = 0; int prevtim = 0; int prevval = 255; struct tim_t *t_head = NULL, *t_curr = NULL; struct tim_t *t_tmp; int hcnt; uint64_t control_start = 0, control_end = 0; int blks; int my_arg = 0; struct event_t *hdr_head = NULL, *hdr_curr = NULL; struct event_t *data_head = NULL, *data_curr = NULL; OPTIONAL_DEBUG { fprintf(stderr, "*** t_filter executable init ***\n"); } top: /* main control loop */ hcnt = 0; control_start = 0; control_end = 0; blks = 0; while(1) /* reading input from stdin until data_end comment received */ { char buf[1025]; char *pnt = NULL; buf[0] = 0; pnt = fgets(buf, 1024, stdin); /* CACHE (VIA puts()) THIS INPUT TO A FILE TO DEVELOP YOUR CLIENT OFFLINE FROM GTKWAVE! */ if(buf[0]) { pnt = buf; while(*pnt) /* strip off end of line character */ { if(*pnt != '\n') { pnt++; } else { *pnt = 0; break; } } if(buf[0] == '#') /* look for and extract time value */ { char *str = buf+1; unsigned char ch; tim=0; while((ch=*(str++))) { if((ch>='0')&&(ch<='9')) { tim=(tim*10+(ch&15)); } } } else if(buf[0] == 'b') /* extract the binary value of the "val" symbol */ { int collect = 0; pnt = buf+1; while(*pnt && (*pnt != ' ')) { collect <<= 1; collect |= ((*pnt) & 1); pnt++; } if((prevval ^ collect) & 128) { t_tmp = calloc(1, sizeof(struct tim_t)); t_tmp->tim = tim; t_tmp->val = collect; t_tmp->delta = tim - prevtim; prevtim = tim; if(!t_curr) { t_head = t_curr = t_tmp; } else { t_curr = t_curr->next = t_tmp; } } prevval = collect; } else if(buf[0] == '$') /* directive processing */ { if(strstr(buf, "$comment")) { if((pnt = strstr(buf, "args"))) { char *lhq = strchr(pnt, '\"'); if(lhq) my_arg = atoi(lhq+1); OPTIONAL_DEBUG { fprintf(stderr, "args: %s\n", buf); } } else if((pnt = strstr(buf, "min_time"))) { sscanf(pnt + 9, "%"SCNu64, &min_time); OPTIONAL_DEBUG { fprintf(stderr, "min: %d\n", (int)min_time); } } else if((pnt = strstr(buf, "max_time"))) { sscanf(pnt + 9, "%"SCNu64, &max_time); OPTIONAL_DEBUG { fprintf(stderr, "max: %d\n", (int)max_time); } } else if(strstr(buf, "data_end")) { break; } } } } if(feof(stdin)) /* broken pipe coming up */ { OPTIONAL_DEBUG { fprintf(stderr, "*** Terminated t_filter executable\n"); } exit(0); } } printf("$name Decoded FSK\n"); /* 1st trace name */ printf("#0\n"); { uint64_t p_tim = 0; int state = 0; int byte_remain = 0; int bcnt = 0; t_tmp = t_head; while(t_tmp) { if(t_tmp->delta == 16) { int sync_cnt = 0; uint64_t t_start = p_tim; int i; for(i=0;i<16;i++) { if(t_tmp->delta == 16) { sync_cnt++; p_tim = t_tmp->tim; t_tmp = t_tmp->next; } else { break; } } if(sync_cnt==16) { if(!my_arg) { printf("#%"PRIu64" ?darkblue?Sync\n", t_start); /* write out sync xact */ } else { printf("#%"PRIu64" ?blue?Sync\n", t_start); /* write out sync xact */ } printf("#%"PRIu64"\n", p_tim - 4); /* 'z' midline is no value after time */ printf("MA%"PRIu64" Start\n", t_start); /* set position/name for marker A */ control_start = t_start; goto found_sync; } continue; } p_tim = t_tmp->tim; t_tmp = t_tmp->next; } found_sync: state = 0; byte_remain = 11; /* printf("MB%"PRIu64" Num Blocks\n", p_tim); */ while(t_tmp) { int i; int collect = 0; uint64_t t_start = p_tim; if((state == 0) && (byte_remain == 10)) { struct event_t *evt = calloc(1, sizeof(struct event_t)); char buf[32]; evt->tim = p_tim; sprintf(buf, "H%d", hcnt/2); evt->name = strdup(buf); if(!control_end) { control_end = p_tim; } if(!hdr_head) { hdr_head = hdr_curr = evt; } else { hdr_curr = hdr_curr->next = evt; } /**/ if(data_curr) { evt = calloc(1, sizeof(struct event_t)); evt->tim = p_tim; evt->name = NULL; data_curr = data_curr->next = evt; } } if((state == 1) && (byte_remain == 64)) { struct event_t *evt = calloc(1, sizeof(struct event_t)); char buf[32]; evt->tim = p_tim; sprintf(buf, "D%d:", hcnt/2); evt->name = calloc(1, 74); strcpy(evt->name, buf); if(!data_head) { data_head = data_curr = evt; } else { data_curr = data_curr->next = evt; } /**/ if(hdr_curr) { evt = calloc(1, sizeof(struct event_t)); evt->tim = p_tim; evt->name = NULL; hdr_curr = hdr_curr->next = evt; } hcnt++; } for(i=0;(t_tmp) && (i<8);i++) { collect <<= 1; if(t_tmp->delta == 16) { collect |= 1; t_tmp = t_tmp->next; } else { } p_tim = t_tmp->tim; t_tmp = t_tmp->next; } if(!bcnt) { printf("#%"PRIu64" ?gray24?%02X\n", t_start, collect); blks = collect; bcnt++; } else { if(state == 1) { char conv = ((collect < ' ') || (collect >= 127)) ? '.' : collect; int slen = strlen(data_curr->name); data_curr->name[slen] = conv; if((collect >= ' ') && (collect < 127)) { printf("#%"PRIu64" ?darkgreen?%c\n", t_start, (unsigned char)collect); } else { printf("#%"PRIu64" ?darkred?%02X\n", t_start, collect); } } else { printf("#%"PRIu64" ?purple3?%02X\n", t_start, collect); } } printf("#%"PRIu64"\n", p_tim - 4); byte_remain--; if(!byte_remain) { if(state == 0) { state = 1; byte_remain = 64; } else { state = 0; byte_remain = 10; } } } } t_tmp = t_head; /* free up memory allocated */ while(t_tmp) { t_curr = t_tmp->next; free(t_tmp); t_tmp = t_curr; } t_head = t_curr = NULL; printf("$next\n"); /* indicate there is a next trace */ printf("$name Control\n"); /* next trace name */ printf("#0\n"); if(!my_arg) { printf("#%"PRIu64" ?darkblue?%02X blks\n", control_start, blks); } else { printf("#%"PRIu64" ?blue?%02X blks\n", control_start, blks); } printf("#%"PRIu64"\n", control_end); printf("$next\n"); /* indicate there is a next trace */ printf("$name Headers\n"); /* next trace name */ printf("#0\n"); while(hdr_head) { if(hdr_head->name) { printf("#%"PRIu64" ?purple3?%s\n", hdr_head->tim, hdr_head->name); free(hdr_head->name); } else { printf("#%"PRIu64"\n", hdr_head->tim); } hdr_curr = hdr_head->next; free(hdr_head); hdr_head = hdr_curr; } printf("$next\n"); /* indicate there is a next trace */ printf("$name Data Payload\n"); /* next trace name */ printf("#0\n"); while(data_head) { if(data_head->name) { printf("#%"PRIu64" ?darkgreen?%s\n", data_head->tim, data_head->name); free(data_head->name); } else { printf("#%"PRIu64"\n", data_head->tim); } data_curr = data_head->next; free(data_head); data_head = data_curr; } printf("$finish\n"); /* directive to return control to gtkwave */ fflush(stdout); /* ensure nothing is stuck in output buffers which could hang gtkwave */ OPTIONAL_DEBUG { fprintf(stderr, "back to gtkwave...\n"); } goto top; /* loop forever in order to process next xact query */ return(0); } gtkwave-3.3.86/examples/Makefile.am0000664000175000017500000000025113166335473016454 0ustar bybellbybell## -*- makefile -*- ## dist_examples_DATA= des.gtkw des.tcl des.v des.fst transaction.fst transaction.gtkw transaction.c gtkwaverc examplesdir= $(pkgdatadir)/examples gtkwave-3.3.86/configure0000775000175000017500000124766113166335473014534 0ustar bybellbybell#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for gtkwave 3.3.86. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: bybell@rocketmail.com about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='gtkwave' PACKAGE_TARNAME='gtkwave' PACKAGE_VERSION='3.3.86' PACKAGE_STRING='gtkwave 3.3.86' PACKAGE_BUGREPORT='bybell@rocketmail.com' PACKAGE_URL='' ac_unique_file="src/vcd.c" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS TK_LDADD TCL_DEFADD TCL_LDADD MINGW_LDADD POW_LIB LIBOBJS ALLOCA EGREP GREP CPP GTK_UNIX_PRINT_LIBS GTK_UNIX_PRINT_CFLAGS GCONF_LIBS GCONF_CFLAGS COCOA_GTK_LDFLAGS COCOA_GTK_LDADD COCOA_GTK_CFLAGS GTK_MAC_LIBS GTK_MAC_CFLAGS GTK_LIBS GTK_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG GTK_CONFIG LIBJUDY_CFLAGS LIBJUDY_LDADD FASTTREE_CFLAGS LIBXZ_CFLAGS LIBXZ_LDADD LIBBZ2_DIR LIBBZ2_LDADD LIBBZ2_CFLAGS LIBZ_DIR LIBZ_LDADD LIBZ_CFLAGS GPERF EXTLOAD_CFLAGS EXTDEBUG4 EXTDEBUG3 EXTDEBUG2 EXTDEBUG GEDIT_CFLAGS GEDITTEST RANLIB LEXLIB LEX_OUTPUT_ROOT LEX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX FSDB_LDADD FSDB_CFLAGS AET2_LDADD AET2_CFLAGS TK_INCLUDE_SPEC TK_STUB_LIB_SPEC TK_STUB_LIB_FLAG TK_STUB_LIB_FILE TK_LIB_SPEC TK_LIB_FLAG TK_LIB_FILE TK_SRC_DIR TK_BIN_DIR TK_VERSION TCL_MINOR_VERSION TCL_MAJOR_VERSION TCL_INCLUDE_SPEC TCL_STUB_LIB_SPEC TCL_STUB_LIB_FLAG TCL_STUB_LIB_FILE TCL_LIB_SPEC TCL_LIB_FLAG TCL_LIB_FILE TCL_SRC_DIR TCL_BIN_DIR TCL_PATCH_LEVEL TCL_VERSION STRUCT_PACK FDO_MIME_FALSE FDO_MIME_TRUE UPDATE_DESKTOP_DATABASE UPDATE_MIME_DATABASE XDGDATADIR MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_maintainer_mode with_gconf with_xdgdatadir enable_mime_update enable_struct_pack enable_tcl with_tcl with_tk enable_stubify enable_gtk1 enable_fatlines enable_manymarkers enable_ae2 enable_fsdb enable_dependency_tracking enable_local_libz enable_local_libbz2 enable_xz enable_fasttree enable_judy enable_largefile ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR GTK_CFLAGS GTK_LIBS GTK_MAC_CFLAGS GTK_MAC_LIBS GCONF_CFLAGS GCONF_LIBS GTK_UNIX_PRINT_CFLAGS GTK_UNIX_PRINT_LIBS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures gtkwave 3.3.86 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/gtkwave] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of gtkwave 3.3.86:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --disable-mime-update Disables MIME type and desktop/icon updating --enable-struct-pack Enables C language structure packing pragmas intended for use on architectures which support misaligned loads and stores (x86/x86_64/AVR32/ M68K/PowerPC/S390). This can reduce memory on traces with very many signals. --disable-tcl Disables Tcl if found --enable-stubify Causes the Tcl/Tk libraries to be dynamically loaded. --enable-gtk1 Causes the GTK+ frontend to be built with gtk1 instead of gtk2. --enable-fatlines Renders lines as double width in gtkwave. --enable-manymarkers Expands named marker count from 26 to 702. --enable-ae2 Compiles in AE2 from env var SIMARAMA_BASE location. --enable-fsdb Compiles in FsdbReader from env vars FSDBREADER_HDRS header and FSDBREADER_LIBS library directories. --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-local-libz Use the bundled libz instead of any libz which may already be installed on your system. Default is to first look for an installed libz and fall back to using the bundled one. --enable-local-libbz2 Use the bundled libbz2 instead of any libbz2 which may already be installed on your system. Default is to first look for an installed libbz2 and fall back to using the bundled one. --disable-xz Disables LZMA support for VZT --disable-fasttree Disables experimental Fast SST Tree widget code --enable-judy Enables Judy array support --disable-largefile omit support for large files Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gconf Use GConf to store preferences --with-xdgdatadir=path Change where the theme icons and mime registrations are installed [DATADIR] --with-tcl directory containing tcl configuration (tclConfig.sh) --with-tk directory containing tk configuration (tkConfig.sh) Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path GTK_CFLAGS C compiler flags for GTK, overriding pkg-config GTK_LIBS linker flags for GTK, overriding pkg-config GTK_MAC_CFLAGS C compiler flags for GTK_MAC, overriding pkg-config GTK_MAC_LIBS linker flags for GTK_MAC, overriding pkg-config GCONF_CFLAGS C compiler flags for GCONF, overriding pkg-config GCONF_LIBS linker flags for GCONF, overriding pkg-config GTK_UNIX_PRINT_CFLAGS C compiler flags for GTK_UNIX_PRINT, overriding pkg-config GTK_UNIX_PRINT_LIBS linker flags for GTK_UNIX_PRINT, overriding pkg-config CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF gtkwave configure 3.3.86 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------------ ## ## Report this to bybell@rocketmail.com ## ## ------------------------------------ ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by gtkwave $as_me 3.3.86, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_list " stdlib.h" as_fn_append ac_header_list " unistd.h" as_fn_append ac_header_list " sys/param.h" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.13' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='gtkwave' VERSION='3.3.86' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' ac_config_headers="$ac_config_headers config.h" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE # ------------- GCONF ------------------- # Check whether --with-gconf was given. if test "${with_gconf+set}" = set; then : withval=$with_gconf; else with_gconf=check fi # ------------- XDG ------------------- # Check whether --with-xdgdatadir was given. if test "${with_xdgdatadir+set}" = set; then : withval=$with_xdgdatadir; opt_xdgdatadir=$withval fi if test x$opt_xdgdatadir = x; then # path was not specified with --with-xdgdatadir XDGDATADIR='${datadir}' else # path WAS specified with --with-xdgdatadir XDGDATADIR="$opt_xdgdatadir" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if MIME and desktop updates should be disabled" >&5 $as_echo_n "checking if MIME and desktop updates should be disabled... " >&6; } EMIM=yes DMIM=no # Check whether --enable-mime_update was given. if test "${enable_mime_update+set}" = set; then : enableval=$enable_mime_update; if test "X$enable_mime_update" = "Xno" ; then EMIM=no DMIM=yes else EMIM=yes DMIM=no fi else EMIM=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DMIM" >&5 $as_echo "$DMIM" >&6; } # Extract the first word of "update-mime-database", so it can be a program name with args. set dummy update-mime-database; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_UPDATE_MIME_DATABASE+:} false; then : $as_echo_n "(cached) " >&6 else case $UPDATE_MIME_DATABASE in [\\/]* | ?:[\\/]*) ac_cv_path_UPDATE_MIME_DATABASE="$UPDATE_MIME_DATABASE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_UPDATE_MIME_DATABASE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_UPDATE_MIME_DATABASE" && ac_cv_path_UPDATE_MIME_DATABASE="no" ;; esac fi UPDATE_MIME_DATABASE=$ac_cv_path_UPDATE_MIME_DATABASE if test -n "$UPDATE_MIME_DATABASE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UPDATE_MIME_DATABASE" >&5 $as_echo "$UPDATE_MIME_DATABASE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "update-desktop-database", so it can be a program name with args. set dummy update-desktop-database; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_UPDATE_DESKTOP_DATABASE+:} false; then : $as_echo_n "(cached) " >&6 else case $UPDATE_DESKTOP_DATABASE in [\\/]* | ?:[\\/]*) ac_cv_path_UPDATE_DESKTOP_DATABASE="$UPDATE_DESKTOP_DATABASE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_UPDATE_DESKTOP_DATABASE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_UPDATE_DESKTOP_DATABASE" && ac_cv_path_UPDATE_DESKTOP_DATABASE="no" ;; esac fi UPDATE_DESKTOP_DATABASE=$ac_cv_path_UPDATE_DESKTOP_DATABASE if test -n "$UPDATE_DESKTOP_DATABASE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UPDATE_DESKTOP_DATABASE" >&5 $as_echo "$UPDATE_DESKTOP_DATABASE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "X$DMIM" = "Xyes" ; then UPDATE_MIME_DATABASE=: UPDATE_DESKTOP_DATABASE=: fi if test x$UPDATE_MIME_DATABASE != xno -a x$UPDATE_DESKTOP_DATABASE != xno; then FDO_MIME_TRUE= FDO_MIME_FALSE='#' else FDO_MIME_TRUE='#' FDO_MIME_FALSE= fi # ------------- Set simarama base ------------------- if test "X$SIMARAMA_BASE" = "X" ; then SIMARAMA_BASE="/afs/awd/projects/simarama/releases/latest" fi # ------------- Set fsdbreader base ------------------- if test "X$FSDBREADER_HDRS" = "X" ; then FSDBREADER_HDRS="/pub/FsdbReader" fi if test "X$FSDBREADER_LIBS" = "X" ; then FSDBREADER_LIBS="/pub/FsdbReader" fi # Checks for build options # ------------- Structure Packing ------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if structure packing should be enabled" >&5 $as_echo_n "checking if structure packing should be enabled... " >&6; } ESTP=no STRUCT_PACK= # Check whether --enable-struct_pack was given. if test "${enable_struct_pack+set}" = set; then : enableval=$enable_struct_pack; if test "X$enable_struct_pack" = "Xyes" ; then ESTP=yes STRUCT_PACK=-DWAVE_USE_STRUCT_PACKING fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ESTP" >&5 $as_echo "$ESTP" >&6; } # ------------- Tcl ------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Tcl usage should be disabled" >&5 $as_echo_n "checking if Tcl usage should be disabled... " >&6; } ETCL=yes DTCL=no # Check whether --enable-tcl was given. if test "${enable_tcl+set}" = set; then : enableval=$enable_tcl; if test "X$enable_tcl" = "Xno" ; then ETCL=no DTCL=yes else ETCL=yes DTCL=no fi else ETCL=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DTCL" >&5 $as_echo "$DTCL" >&6; } if test "X$ETCL" = "Xyes" ; then # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true # Check whether --with-tcl was given. if test "${with_tcl+set}" = set; then : withval=$with_tcl; with_tclconfig="${withval}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl configuration" >&5 $as_echo_n "checking for Tcl configuration... " >&6; } if ${ac_cv_c_tclconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&5 $as_echo "$as_me: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&2;} with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else as_fn_error $? "${with_tclconfig} directory doesn't contain tclConfig.sh" "$LINENO" 5 fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9]* 2>/dev/null` ; do if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9]* 2>/dev/null` ; do if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi fi if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" as_fn_error $? "Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh" "$LINENO" 5 else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: found ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "found ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi fi if test "X$TCL_BIN_DIR" = "X# no Tcl configs found" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Tcl not found, skipping." >&5 $as_echo "$as_me: WARNING: Tcl not found, skipping." >&2;} ETCL=no DTCL=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for existence of ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo_n "checking for existence of ${TCL_BIN_DIR}/tclConfig.sh... " >&6; } if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: loading" >&5 $as_echo "loading" >&6; } . "${TCL_BIN_DIR}/tclConfig.sh" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "could not find ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" if test "$TCL_MAJOR_VERSION" -lt "8" ; then as_fn_error $? "Upgrade to at least Tcl version 8.4." "$LINENO" 5 else if test "$TCL_MAJOR_VERSION" -eq "8" ; then if test "$TCL_MINOR_VERSION" -lt "4" ; then as_fn_error $? "Upgrade to at least Tcl version 8.4." "$LINENO" 5 fi fi fi fi fi if test "X$ETCL" = "Xyes" ; then # # Ok, lets find the tk configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tk # if test x"${no_tk}" = x ; then # we reset no_tk in case something fails here no_tk=true # Check whether --with-tk was given. if test "${with_tk+set}" = set; then : withval=$with_tk; with_tkconfig="${withval}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tk configuration" >&5 $as_echo_n "checking for Tk configuration... " >&6; } if ${ac_cv_c_tkconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-tkconfig was specified. if test x"${with_tkconfig}" != x ; then case "${with_tkconfig}" in */tkConfig.sh ) if test -f "${with_tkconfig}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself" >&5 $as_echo "$as_me: WARNING: --with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself" >&2;} with_tkconfig="`echo "${with_tkconfig}" | sed 's!/tkConfig\.sh$!!'`" fi ;; esac if test -f "${with_tkconfig}/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd "${with_tkconfig}"; pwd)`" else as_fn_error $? "${with_tkconfig} directory doesn't contain tkConfig.sh" "$LINENO" 5 fi fi # then check for a private Tk library if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ../tk \ `ls -dr ../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../tk[8-9].[0-9]* 2>/dev/null` \ ../../tk \ `ls -dr ../../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../tk[8-9].[0-9]* 2>/dev/null` \ ../../../tk \ `ls -dr ../../../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../../tk[8-9].[0-9]* 2>/dev/null` ; do if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tk.framework/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/Tk.framework; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ${srcdir}/../tk \ `ls -dr ${srcdir}/../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ${srcdir}/../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ${srcdir}/../tk[8-9].[0-9]* 2>/dev/null` ; do if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi fi if test x"${ac_cv_c_tkconfig}" = x ; then TK_BIN_DIR="# no Tk configs found" as_fn_error $? "Can't find Tk configuration definitions. Use --with-tk to specify a directory containing tkConfig.sh" "$LINENO" 5 else no_tk= TK_BIN_DIR="${ac_cv_c_tkconfig}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: found ${TK_BIN_DIR}/tkConfig.sh" >&5 $as_echo "found ${TK_BIN_DIR}/tkConfig.sh" >&6; } fi fi if test "X$TK_BIN_DIR" = "X# no Tk configs found" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Tk not found, skipping." >&5 $as_echo "$as_me: WARNING: Tk not found, skipping." >&2;} ETCL=no DTCL=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for existence of ${TK_BIN_DIR}/tkConfig.sh" >&5 $as_echo_n "checking for existence of ${TK_BIN_DIR}/tkConfig.sh... " >&6; } if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: loading" >&5 $as_echo "loading" >&6; } . "${TK_BIN_DIR}/tkConfig.sh" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find ${TK_BIN_DIR}/tkConfig.sh" >&5 $as_echo "could not find ${TK_BIN_DIR}/tkConfig.sh" >&6; } fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" # If the TK_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TK_LIB_SPEC will be set to the value # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC # instead of TK_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TK_BIN_DIR}/Makefile" ; then TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}" TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}" TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tk.framework installed in an arbitrary location. case ${TK_DEFS} in *TK_FRAMEWORK*) if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then for i in "`cd "${TK_BIN_DIR}"; pwd`" \ "`cd "${TK_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then TK_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TK_LIB_FILE}" break fi done fi if test -f "${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"; then TK_STUB_LIB_SPEC="-L` echo "${TK_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TK_STUB_LIB_FLAG}" TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Tcl/Tk (if present) should be stubified" >&5 $as_echo_n "checking if Tcl/Tk (if present) should be stubified... " >&6; } STUBIFY=no # Check whether --enable-stubify was given. if test "${enable_stubify+set}" = set; then : enableval=$enable_stubify; if test "X$enable_stubify" = "Xno" ; then STUBIFY=no else STUBIFY=yes fi else STUBIFY=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STUBIFY" >&5 $as_echo "$STUBIFY" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if gtk1 or gtk2 should be used" >&5 $as_echo_n "checking if gtk1 or gtk2 should be used... " >&6; } GTK1=no # Check whether --enable-gtk1 was given. if test "${enable_gtk1+set}" = set; then : enableval=$enable_gtk1; if test "X$enable_gtk1" = "Xno" ; then GTK1=no else GTK1=yes fi else GTK1=no fi if test "X$GTK1" = "Xyes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: gtk1" >&5 $as_echo "gtk1" >&6; } CPPFLAGS="$CPPFLAGS" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: gtk2" >&5 $as_echo "gtk2" >&6; } CPPFLAGS="-DWAVE_USE_GTK2 $CPPFLAGS" fi # check for "fisher price" (simvision rendering style) mode { $as_echo "$as_me:${as_lineno-$LINENO}: checking if fatlines should be used" >&5 $as_echo_n "checking if fatlines should be used... " >&6; } FLN=no # Check whether --enable-fatlines was given. if test "${enable_fatlines+set}" = set; then : enableval=$enable_fatlines; if test "X$enable_fatlines" = "Xno" ; then FLN=no else FLN=yes fi else FLN=no fi if test "X$FLN" = "Xno" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CPPFLAGS="-DWAVE_DOUBLE_LINE_WIDTH_MODE $CPPFLAGS" fi # check for massive amounts of named markers enabled { $as_echo "$as_me:${as_lineno-$LINENO}: checking if manymarkers should be used" >&5 $as_echo_n "checking if manymarkers should be used... " >&6; } MMC=no # Check whether --enable-manymarkers was given. if test "${enable_manymarkers+set}" = set; then : enableval=$enable_manymarkers; if test "X$enable_manymarkers" = "Xno" ; then MMC=no else MMC=yes fi else MMC=no fi if test "X$MMC" = "Xno" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CPPFLAGS="-DWAVE_MANYMARKERS_MODE $CPPFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ae2 support should be used" >&5 $as_echo_n "checking if ae2 support should be used... " >&6; } AE2_CFLAGS= AET2_LDADD= AE2=no # Check whether --enable-ae2 was given. if test "${enable_ae2+set}" = set; then : enableval=$enable_ae2; if test "X$enable_ae2" = "Xno" ; then AE2=no else AE2=yes fi else AE2=no fi if test "X$AE2" = "Xyes" ; then as_ac_File=`$as_echo "ac_cv_file_"$SIMARAMA_BASE/libae2rw.so"" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for \"$SIMARAMA_BASE/libae2rw.so\"" >&5 $as_echo_n "checking for \"$SIMARAMA_BASE/libae2rw.so\"... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r ""$SIMARAMA_BASE/libae2rw.so""; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : AET2_SO=yes else AET2_SO=no fi if test "X$AET2_SO" = "Xyes" ; then AET2_CFLAGS="-DAET2_IS_PRESENT -I$SIMARAMA_BASE" AET2_LDADD="$SIMARAMA_BASE/libae2rw.so" else as_ac_File=`$as_echo "ac_cv_file_"$SIMARAMA_BASE/libae2rw.a"" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for \"$SIMARAMA_BASE/libae2rw.a\"" >&5 $as_echo_n "checking for \"$SIMARAMA_BASE/libae2rw.a\"... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r ""$SIMARAMA_BASE/libae2rw.a""; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : AET2_A=yes else AET2_A=no fi if test "X$AET2_A" = "Xyes" ; then AET2_CFLAGS="-DAET2_IS_PRESENT -I$SIMARAMA_BASE" AET2_LDADD="$SIMARAMA_BASE/libae2rw.a" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: AET2 library not found, skipping." >&5 $as_echo "$as_me: WARNING: AET2 library not found, skipping." >&2;} fi fi as_ac_File=`$as_echo "ac_cv_file_"$SIMARAMA_BASE/libaliasdb.so"" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for \"$SIMARAMA_BASE/libaliasdb.so\"" >&5 $as_echo_n "checking for \"$SIMARAMA_BASE/libaliasdb.so\"... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r ""$SIMARAMA_BASE/libaliasdb.so""; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : AAET2_SO=yes else AAET2_SO=no fi if test "X$AAET2_SO" = "Xyes" ; then as_ac_File=`$as_echo "ac_cv_file_"$SIMARAMA_BASE/aliasdb.h"" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for \"$SIMARAMA_BASE/aliasdb.h\"" >&5 $as_echo_n "checking for \"$SIMARAMA_BASE/aliasdb.h\"... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r ""$SIMARAMA_BASE/aliasdb.h""; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : AAET2_SOY=yes else AAET2_SOY=no fi if test "X$AAET2_SOY" = "Xyes" ; then AET2_CFLAGS="-DAET2_ALIASDB_IS_PRESENT $AET2_CFLAGS" AET2_LDADD="$SIMARAMA_BASE/libaliasdb.so $AET2_LDADD" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: AET2 alias header not found, skipping." >&5 $as_echo "$as_me: WARNING: AET2 alias header not found, skipping." >&2;} fi else as_ac_File=`$as_echo "ac_cv_file_"$SIMARAMA_BASE/libaliasdb.a"" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for \"$SIMARAMA_BASE/libaliasdb.a\"" >&5 $as_echo_n "checking for \"$SIMARAMA_BASE/libaliasdb.a\"... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r ""$SIMARAMA_BASE/libaliasdb.a""; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : AET2_A=yes else AET2_A=no fi if test "X$AAET2_A" = "Xyes" ; then as_ac_File=`$as_echo "ac_cv_file_"$SIMARAMA_BASE/aliasdb.h"" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for \"$SIMARAMA_BASE/aliasdb.h\"" >&5 $as_echo_n "checking for \"$SIMARAMA_BASE/aliasdb.h\"... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r ""$SIMARAMA_BASE/aliasdb.h""; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : AAET2_SOY=yes else AAET2_SOY=no fi if test "X$AAET2_SOY" = "Xyes" ; then AET2_CFLAGS="-DAET2_ALIASDB_IS_PRESENT $AET2_CFLAGS" AET2_LDADD="$SIMARAMA_BASE/libaliasdb.a $AET2_LDADD" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: AET2 alias header not found, skipping." >&5 $as_echo "$as_me: WARNING: AET2 alias header not found, skipping." >&2;} fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: AET2 alias library not found, skipping." >&5 $as_echo "$as_me: WARNING: AET2 alias library not found, skipping." >&2;} fi fi as_ac_File=`$as_echo "ac_cv_file_"$SIMARAMA_BASE/ae2rw.h"" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for \"$SIMARAMA_BASE/ae2rw.h\"" >&5 $as_echo_n "checking for \"$SIMARAMA_BASE/ae2rw.h\"... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r ""$SIMARAMA_BASE/ae2rw.h""; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : AET2_SOY=yes else AET2_SOY=no fi if test "X$AET2_SOY" = "Xno" ; then AET2_CFLAGS= AET2_LDADD= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: AET2 header not found, skipping." >&5 $as_echo "$as_me: WARNING: AET2 header not found, skipping." >&2;} fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if FsdbReader support should be used" >&5 $as_echo_n "checking if FsdbReader support should be used... " >&6; } FFR_CFLAGS= FSDB_LDADD= FFR=no # Check whether --enable-fsdb was given. if test "${enable_fsdb+set}" = set; then : enableval=$enable_fsdb; if test "X$enable_fsdb" = "Xno" ; then FFR=no else FFR=yes fi else FFR=no fi EXTLOAD_CFLAGS= if test "X$FFR" = "Xyes" ; then as_ac_File=`$as_echo "ac_cv_file_"$FSDBREADER_LIBS/libnffr.so"" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for \"$FSDBREADER_LIBS/libnffr.so\"" >&5 $as_echo_n "checking for \"$FSDBREADER_LIBS/libnffr.so\"... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r ""$FSDBREADER_LIBS/libnffr.so""; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : FSDB_SO=yes else FSDB_SO=no fi if test "X$FSDB_SO" = "Xyes" ; then FSDB_CFLAGS="-DFSDB_IS_PRESENT -I$FSDBREADER_HDRS" FSDB_LDADD="$FSDBREADER_LIBS/libnffr.so" EXTLOAD_CFLAGS="-DEXTLOAD_SUFFIX=\\\"fsdb\\\"" else as_ac_File=`$as_echo "ac_cv_file_"$FSDBREADER_LIBS/libnffr.a"" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for \"$FSDBREADER_LIBS/libnffr.a\"" >&5 $as_echo_n "checking for \"$FSDBREADER_LIBS/libnffr.a\"... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r ""$FSDBREADER_LIBS/libnffr.a""; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : FSDB_A=yes else FSDB_A=no fi if test "X$FSDB_A" = "Xyes" ; then FSDB_CFLAGS="-DFSDB_IS_PRESENT -I$FSDBREADER_HDRS" FSDB_LDADD="$FSDBREADER_LIBS/libnffr.a" EXTLOAD_CFLAGS="-DEXTLOAD_SUFFIX=\\\"fsdb\\\"" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: FSDB reader library not found, skipping." >&5 $as_echo "$as_me: WARNING: FSDB reader library not found, skipping." >&2;} fi fi as_ac_File=`$as_echo "ac_cv_file_"$FSDBREADER_LIBS/libnsys.so"" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for \"$FSDBREADER_LIBS/libnsys.so\"" >&5 $as_echo_n "checking for \"$FSDBREADER_LIBS/libnsys.so\"... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r ""$FSDBREADER_LIBS/libnsys.so""; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : AFSDB_SO=yes else AFSDB_SO=no fi if test "X$AFSDB_SO" = "Xyes" ; then FSDB_CFLAGS="-DFSDB_NSYS_IS_PRESENT $FSDB_CFLAGS" FSDB_LDADD="$FSDBREADER_LIBS/libnsys.so $FSDB_LDADD" EXTLOAD_CFLAGS="-DEXTLOAD_SUFFIX=\\\"fsdb\\\"" else as_ac_File=`$as_echo "ac_cv_file_"$FSDBREADER_LIBS/libnsys.a"" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for \"$FSDBREADER_LIBS/libnsys.a\"" >&5 $as_echo_n "checking for \"$FSDBREADER_LIBS/libnsys.a\"... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r ""$FSDBREADER_LIBS/libnsys.a""; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : AFSDB_A=yes else AFSDB_A=no fi if test "X$AFSDB_A" = "Xyes" ; then FSDB_CFLAGS="-DFSDB_NSYS_IS_PRESENT $FSDB_CFLAGS" FSDB_LDADD="$FSDB_LDADD $FSDBREADER_LIBS/libnsys.a" EXTLOAD_CFLAGS="-DEXTLOAD_SUFFIX=\\\"fsdb\\\"" else FSDB_CFLAGS= FSDB_LDADD= EXTLOAD_CFLAGS= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: FSDB system library not found, skipping." >&5 $as_echo "$as_me: WARNING: FSDB system library not found, skipping." >&2;} fi fi as_ac_File=`$as_echo "ac_cv_file_"$FSDBREADER_HDRS/ffrAPI.h"" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for \"$FSDBREADER_HDRS/ffrAPI.h\"" >&5 $as_echo_n "checking for \"$FSDBREADER_HDRS/ffrAPI.h\"... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r ""$FSDBREADER_HDRS/ffrAPI.h""; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : FSDB_SOY=yes else FSDB_SOY=no fi if test "X$FSDB_SOY" = "Xno" ; then FSDB_CFLAGS= FSDB_LDADD= EXTLOAD_CFLAGS= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: FSDB header not found, skipping." >&5 $as_echo "$as_me: WARNING: FSDB header not found, skipping." >&2;} fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Checks for programs. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi for ac_prog in flex lex do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LEX"; then ac_cv_prog_LEX="$LEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LEX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LEX=$ac_cv_prog_LEX if test -n "$LEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 $as_echo "$LEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$LEX" && break done test -n "$LEX" || LEX=":" if test "x$LEX" != "x:"; then cat >conftest.l <<_ACEOF %% a { ECHO; } b { REJECT; } c { yymore (); } d { yyless (1); } e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ yyless ((input () != 0)); } f { unput (yytext[0]); } . { BEGIN INITIAL; } %% #ifdef YYTEXT_POINTER extern char *yytext; #endif int main (void) { return ! yylex () + ! yywrap (); } _ACEOF { { ac_try="$LEX conftest.l" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$LEX conftest.l") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 $as_echo_n "checking lex output file root... " >&6; } if ${ac_cv_prog_lex_root+:} false; then : $as_echo_n "(cached) " >&6 else if test -f lex.yy.c; then ac_cv_prog_lex_root=lex.yy elif test -f lexyy.c; then ac_cv_prog_lex_root=lexyy else as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 $as_echo "$ac_cv_prog_lex_root" >&6; } LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root if test -z "${LEXLIB+set}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 $as_echo_n "checking lex library... " >&6; } if ${ac_cv_lib_lex+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS=$LIBS ac_cv_lib_lex='none needed' for ac_lib in '' -lfl -ll; do LIBS="$ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lex=$ac_lib fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_lib_lex" != 'none needed' && break done LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 $as_echo "$ac_cv_lib_lex" >&6; } test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 $as_echo_n "checking whether yytext is a pointer... " >&6; } if ${ac_cv_prog_lex_yytext_pointer+:} false; then : $as_echo_n "(cached) " >&6 else # POSIX says lex can declare yytext either as a pointer or an array; the # default is implementation-dependent. Figure out which it is, since # not all implementations provide the %pointer and %array declarations. ac_cv_prog_lex_yytext_pointer=no ac_save_LIBS=$LIBS LIBS="$LEXLIB $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define YYTEXT_POINTER 1 `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_lex_yytext_pointer=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 $as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then $as_echo "#define YYTEXT_POINTER 1" >>confdefs.h fi rm -f conftest.l $LEX_OUTPUT_ROOT.c fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi if test "x$CC" != xcc; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 $as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 $as_echo_n "checking whether cc understands -c and -o together... " >&6; } fi set dummy $CC; ac_cc=`$as_echo "$2" | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # We do the test twice because some compilers refuse to overwrite an # existing .o file with -o, though they will create one. ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -f conftest2.$ac_objext && { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then eval ac_cv_prog_cc_${ac_cc}_c_o=yes if test "x$CC" != xcc; then # Test first that cc exists at all. if { ac_try='cc -c conftest.$ac_ext >&5' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -f conftest2.$ac_objext && { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # cc works too. : else # cc exists but doesn't like -o. eval ac_cv_prog_cc_${ac_cc}_c_o=no fi fi fi else eval ac_cv_prog_cc_${ac_cc}_c_o=no fi rm -f core conftest* fi if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h fi # FIXME: we rely on the cache variable name because # there is no other way. set dummy $CC am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o if test "$am_t" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi # # for "Open Hierarchy Source" # # Extract the first word of "gedit", so it can be a program name with args. set dummy gedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GEDITTEST+:} false; then : $as_echo_n "(cached) " >&6 else case $GEDITTEST in [\\/]* | ?:[\\/]*) ac_cv_path_GEDITTEST="$GEDITTEST" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GEDITTEST="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GEDITTEST" && ac_cv_path_GEDITTEST="notfound" ;; esac fi GEDITTEST=$ac_cv_path_GEDITTEST if test -n "$GEDITTEST"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GEDITTEST" >&5 $as_echo "$GEDITTEST" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$GEDITTEST" = "notfound" ; then GEDIT_CFLAGS= else GEDIT_CFLAGS="-DGEDIT_PATH=\\\"$GEDITTEST\\\"" fi # # only needed if user wishes to process various files with an external reader # # Extract the first word of "fsdbdebug", so it can be a program name with args. set dummy fsdbdebug; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_EXTDEBUG+:} false; then : $as_echo_n "(cached) " >&6 else case $EXTDEBUG in [\\/]* | ?:[\\/]*) ac_cv_path_EXTDEBUG="$EXTDEBUG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_EXTDEBUG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_EXTDEBUG" && ac_cv_path_EXTDEBUG="notfound" ;; esac fi EXTDEBUG=$ac_cv_path_EXTDEBUG if test -n "$EXTDEBUG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $EXTDEBUG" >&5 $as_echo "$EXTDEBUG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$EXTDEBUG" = "notfound" ; then EXTLOAD_CFLAGS="$EXTLOAD_CFLAGS" else EXTLOAD_CFLAGS="-DEXTLOAD_PATH=\\\"$EXTDEBUG\\\" -DEXTLOAD_SUFFIX=\\\"fsdb\\\"" fi # enables .fsdb as input filetype in vcd2fst, and also gtkwave -o # Extract the first word of "fsdb2vcd", so it can be a program name with args. set dummy fsdb2vcd; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_EXTDEBUG2+:} false; then : $as_echo_n "(cached) " >&6 else case $EXTDEBUG2 in [\\/]* | ?:[\\/]*) ac_cv_path_EXTDEBUG2="$EXTDEBUG2" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_EXTDEBUG2="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_EXTDEBUG2" && ac_cv_path_EXTDEBUG2="notfound" ;; esac fi EXTDEBUG2=$ac_cv_path_EXTDEBUG2 if test -n "$EXTDEBUG2"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $EXTDEBUG2" >&5 $as_echo "$EXTDEBUG2" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$EXTDEBUG2" != "notfound" ; then EXTLOAD_CFLAGS="$EXTLOAD_CFLAGS -DEXTCONV_PATH=\\\"$EXTDEBUG2\\\"" fi # enables .vpd as input filetype in vcd2fst, and also gtkwave -o # Extract the first word of "vpd2vcd", so it can be a program name with args. set dummy vpd2vcd; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_EXTDEBUG3+:} false; then : $as_echo_n "(cached) " >&6 else case $EXTDEBUG3 in [\\/]* | ?:[\\/]*) ac_cv_path_EXTDEBUG3="$EXTDEBUG3" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_EXTDEBUG3="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_EXTDEBUG3" && ac_cv_path_EXTDEBUG3="notfound" ;; esac fi EXTDEBUG3=$ac_cv_path_EXTDEBUG3 if test -n "$EXTDEBUG3"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $EXTDEBUG3" >&5 $as_echo "$EXTDEBUG3" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$EXTDEBUG3" != "notfound" ; then EXTLOAD_CFLAGS="$EXTLOAD_CFLAGS -DEXT2CONV_PATH=\\\"$EXTDEBUG3\\\" -DEXT2LOAD_SUFFIX=\\\"vpd\\\"" fi # enables .wlf as input filetype in vcd2fst, and also gtkwave -o # Extract the first word of "wlf2vcd", so it can be a program name with args. set dummy wlf2vcd; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_EXTDEBUG4+:} false; then : $as_echo_n "(cached) " >&6 else case $EXTDEBUG4 in [\\/]* | ?:[\\/]*) ac_cv_path_EXTDEBUG4="$EXTDEBUG4" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_EXTDEBUG4="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_EXTDEBUG4" && ac_cv_path_EXTDEBUG4="notfound" ;; esac fi EXTDEBUG4=$ac_cv_path_EXTDEBUG4 if test -n "$EXTDEBUG4"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $EXTDEBUG4" >&5 $as_echo "$EXTDEBUG4" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$EXTDEBUG4" != "notfound" ; then EXTLOAD_CFLAGS="$EXTLOAD_CFLAGS -DEXT3CONV_PATH=\\\"$EXTDEBUG4\\\" -DEXT3LOAD_SUFFIX=\\\"wlf\\\"" fi # # gperf only needed if the user updates the gperf data # files which only developers will be doing... # # Extract the first word of "gperf", so it can be a program name with args. set dummy gperf; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GPERF+:} false; then : $as_echo_n "(cached) " >&6 else case $GPERF in [\\/]* | ?:[\\/]*) ac_cv_path_GPERF="$GPERF" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GPERF="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GPERF" && ac_cv_path_GPERF="notfound" ;; esac fi GPERF=$ac_cv_path_GPERF if test -n "$GPERF"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GPERF" >&5 $as_echo "$GPERF" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$GPERF" = "notfound" ; then as_fn_error $? "Couldn't find a usable gperf program. Please install gperf which is available from ftp://ftp.gnu.org/pub/gnu/gperf/ " "$LINENO" 5 fi # Checks for libraries. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDL 1 _ACEOF LIBS="-ldl $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrt in -lm" >&5 $as_echo_n "checking for sqrt in -lm... " >&6; } if ${ac_cv_lib_m_sqrt+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sqrt (); int main () { return sqrt (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_sqrt=yes else ac_cv_lib_m_sqrt=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sqrt" >&5 $as_echo "$ac_cv_lib_m_sqrt" >&6; } if test "x$ac_cv_lib_m_sqrt" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 _ACEOF LIBS="-lm $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lpthread" >&5 $as_echo_n "checking for main in -lpthread... " >&6; } if ${ac_cv_lib_pthread_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_main=yes else ac_cv_lib_pthread_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_main" >&5 $as_echo "$ac_cv_lib_pthread_main" >&6; } if test "x$ac_cv_lib_pthread_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBPTHREAD 1 _ACEOF LIBS="-lpthread $LIBS" fi # included or system libz and libbz2. By default, we search for the # system libz and libbz2. If not found, build the included ones. # The --enable-local-libz and --enable-local_libbz2 arguments can be # used to force the use of the included libs. --disable-local-libz # and --disable-local-libbz2 can be used to force the use of system # libs # Check whether --enable-local-libz was given. if test "${enable_local_libz+set}" = set; then : enableval=$enable_local_libz; if test "X$enable_local_libz" = "Xno" ; then force_system_libz=yes else force_bundled_libz=yes fi fi need_libz=no LIBZ_LDADD= LIBZ_CFLAGS= if test "X$force_bundled_libz" != "Xyes" ; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { gzdopen(0,"rb"); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else need_libz=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "$need_libz" = "yes" -a "X$force_system_libz" = "Xyes" ; then as_fn_error $? " You have disabled building the bundled libz but no system libz headers could be found. Either allow building the bundled libz (by not using --disable-local-libz) or make sure your system has a libz installed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gzread in -lz" >&5 $as_echo_n "checking for gzread in -lz... " >&6; } if ${ac_cv_lib_z_gzread+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gzread (); int main () { return gzread (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_gzread=yes else ac_cv_lib_z_gzread=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gzread" >&5 $as_echo "$ac_cv_lib_z_gzread" >&6; } if test "x$ac_cv_lib_z_gzread" = xyes; then : LIBZ_LDADD=-lz else need_libz=yes fi if test "$need_libz" = "yes" -a "X$force_system_libz" = "Xyes" ; then as_fn_error $? " You have disabled building the bundled libz but no system libz could be found. Either allow building the bundled libz (by not using --disable-local-libz) or make sure your system has a libz installed" "$LINENO" 5 fi else need_libz=yes fi # Check whether --enable-local-libbz2 was given. if test "${enable_local_libbz2+set}" = set; then : enableval=$enable_local_libbz2; if test "X$enable_local_libbz2" = "Xno" ; then force_system_libbz2=yes else force_bundled_libbz2=yes fi fi need_libbz2=no LIBBZ2_LDADD= LIBBZ2_CFLAGS= if test "X$force_bundled_libbz2" != "Xyes" ; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { BZ2_bzdopen(0,"rb"); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else need_libbz2=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "$need_libbz2" = "yes" -a "X$force_system_libbz2" = "Xyes" ; then as_fn_error $? " You have disabled building the bundled libbz2 but no system libbz2 headers could be found. Either allow building the bundled libbz2 (by not using --disable-local-libbz2) or make sure your system has a libbz2 installed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BZ2_bzread in -lbz2" >&5 $as_echo_n "checking for BZ2_bzread in -lbz2... " >&6; } if ${ac_cv_lib_bz2_BZ2_bzread+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbz2 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char BZ2_bzread (); int main () { return BZ2_bzread (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bz2_BZ2_bzread=yes else ac_cv_lib_bz2_BZ2_bzread=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bz2_BZ2_bzread" >&5 $as_echo "$ac_cv_lib_bz2_BZ2_bzread" >&6; } if test "x$ac_cv_lib_bz2_BZ2_bzread" = xyes; then : LIBBZ2_LDADD=-lbz2 else need_libbz2=yes fi if test "$need_libbz2" = "yes" -a "X$force_system_libbz2" = "Xyes" ; then as_fn_error $? " You have disabled building the bundled libbz2 but no system libbz2 could be found. Either allow building the bundled libbz2 (by not using --disable-local-libbz2) or make sure your system has a libbz2 installed" "$LINENO" 5 fi else need_libbz2=yes fi LIBZ_DIR= if test "$need_libz" = "yes" ; then LIBZ_CFLAGS='-I$(top_srcdir)/src/libz' LIBZ_LDADD='$(top_builddir)/src/libz/libz.a' LIBZ_DIR=libz fi LIBBZ2_DIR= if test "$need_libbz2" = "yes" ; then LIBBZ2_CFLAGS='-I$(top_srcdir)/src/libbz2' LIBBZ2_LDADD='$(top_builddir)/src/libbz2/libbz2.a' LIBBZ2_DIR=libbz2 fi # ------------- LZMA / XZ ------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if XZ should be enabled" >&5 $as_echo_n "checking if XZ should be enabled... " >&6; } EXZ=yes # Check whether --enable-xz was given. if test "${enable_xz+set}" = set; then : enableval=$enable_xz; if test "X$enable_xz" = "Xno" ; then EXZ=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $EXZ" >&5 $as_echo "$EXZ" >&6; } LIBXZ_LDADD= LIBXZ_CFLAGS= if test "X$EXZ" == "Xyes"; then have_liblzma=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { lzma_end(NULL); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else have_liblzma=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lzma_end in -llzma" >&5 $as_echo_n "checking for lzma_end in -llzma... " >&6; } if ${ac_cv_lib_lzma_lzma_end+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-llzma $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char lzma_end (); int main () { return lzma_end (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lzma_lzma_end=yes else ac_cv_lib_lzma_lzma_end=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lzma_lzma_end" >&5 $as_echo "$ac_cv_lib_lzma_lzma_end" >&6; } if test "x$ac_cv_lib_lzma_lzma_end" = xyes; then : LIBLZMA_LDADD=-llzma else have_liblzma=yes fi if test "$have_liblzma" = "yes" ; then as_fn_error $? "LZMA support for VZT is enabled, but xz could not be found. Please install the xz-devel package, see the http://tukaani.org/xz website, or use the --disable-xz flag." "$LINENO" 5 fi LIBXZ_LDADD='-llzma' LIBXZ_CFLAGS='-D_WAVE_HAVE_XZ' fi # ------------- Fast Tree ------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fast SST Tree should be enabled" >&5 $as_echo_n "checking if Fast SST Tree should be enabled... " >&6; } FASTTREE=yes # Check whether --enable-fasttree was given. if test "${enable_fasttree+set}" = set; then : enableval=$enable_fasttree; if test "X$enable_fasttree" = "Xno" ; then FASTTREE=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FASTTREE" >&5 $as_echo "$FASTTREE" >&6; } FASTTREE_CFLAGS= if test "X$FASTTREE" == "Xno"; then FASTTREE_CFLAGS='-DWAVE_DISABLE_FAST_TREE' fi # ------------- Judy ------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Judy array support should be enabled" >&5 $as_echo_n "checking if Judy array support should be enabled... " >&6; } EJUDY=no # Check whether --enable-judy was given. if test "${enable_judy+set}" = set; then : enableval=$enable_judy; if test "X$enable_judy" = "Xno" ; then EJUDY=no else EJUDY=yes fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $EJUDY" >&5 $as_echo "$EJUDY" >&6; } LIBJUDY_LDADD= LIBJUDY_CFLAGS= if test "X$EJUDY" == "Xyes"; then have_libjudy=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { JudySLIns (NULL, NULL, NULL); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else have_libjudy=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JudySLIns in -lJudy" >&5 $as_echo_n "checking for JudySLIns in -lJudy... " >&6; } if ${ac_cv_lib_Judy_JudySLIns+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lJudy $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char JudySLIns (); int main () { return JudySLIns (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_Judy_JudySLIns=yes else ac_cv_lib_Judy_JudySLIns=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Judy_JudySLIns" >&5 $as_echo "$ac_cv_lib_Judy_JudySLIns" >&6; } if test "x$ac_cv_lib_Judy_JudySLIns" = xyes; then : LIBJUDY_LDADD=-lJudy else have_libjudy=yes fi if test "$have_libjudy" = "yes" ; then as_fn_error $? "Judy support is enabled, but could not be found. Please install Judy, see the http://judy.sourceforge.net website or use the --disable-judy flag." "$LINENO" 5 fi LIBJUDY_LDADD='-lJudy' LIBJUDY_CFLAGS='-D_WAVE_HAVE_JUDY' fi # ------------- GTK ------------------- if test "X$GTK1" = "Xyes" ; then # Extract the first word of "gtk-config", so it can be a program name with args. set dummy gtk-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GTK_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $GTK_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GTK_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GTK_CONFIG" && ac_cv_path_GTK_CONFIG="notfound" ;; esac fi GTK_CONFIG=$ac_cv_path_GTK_CONFIG if test -n "$GTK_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTK_CONFIG" >&5 $as_echo "$GTK_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$GTK_CONFIG" = "notfound"; then as_fn_error $? "You must have gtk installed on your system" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking gtk1 version" >&5 $as_echo_n "checking gtk1 version... " >&6; } GTK_VER=`$GTK_CONFIG --version` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTK_VER" >&5 $as_echo "$GTK_VER" >&6; } case $GTK_VER in 1.2.* ) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gtk1 CFLAGS" >&5 $as_echo_n "checking for gtk1 CFLAGS... " >&6; } GTK_CFLAGS=`$GTK_CONFIG --cflags` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTK_CFLAGS" >&5 $as_echo "$GTK_CFLAGS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gtk1 libs" >&5 $as_echo_n "checking for gtk1 libs... " >&6; } GTK_LIBS=`$GTK_CONFIG --libs` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTK_LIBS" >&5 $as_echo "$GTK_LIBS" >&6; } ;; * ) as_fn_error $? "when building with gtk1, you need version 1.2.*" "$LINENO" 5 ;; esac fi else if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK" >&5 $as_echo_n "checking for GTK... " >&6; } if test -n "$GTK_CFLAGS"; then pkg_cv_GTK_CFLAGS="$GTK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "gtk+-2.0 >= 2.2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTK_LIBS"; then pkg_cv_GTK_LIBS="$GTK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "gtk+-2.0 >= 2.2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-2.0 >= 2.2.0" 2>&1` else GTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-2.0 >= 2.2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTK_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (gtk+-2.0 >= 2.2.0) were not met: $GTK_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GTK_CFLAGS and GTK_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GTK_CFLAGS and GTK_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GTK_CFLAGS=$pkg_cv_GTK_CFLAGS GTK_LIBS=$pkg_cv_GTK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi GTK_VER=`$PKG_CONFIG gtk+-2.0 --modversion` _gdk_tgt=`$PKG_CONFIG --variable=target gdk-2.0` # removed...causes problems with gtk-1.2... # AM_CONDITIONAL([GDK_TARGET_QUARTZ], [test x$_gdk_tgt = xquartz]) if test "x$_gdk_tgt" = xquartz; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK_MAC" >&5 $as_echo_n "checking for GTK_MAC... " >&6; } if test -n "$GTK_MAC_CFLAGS"; then pkg_cv_GTK_MAC_CFLAGS="$GTK_MAC_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-mac-integration >= 2.0.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk-mac-integration >= 2.0.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_MAC_CFLAGS=`$PKG_CONFIG --cflags "gtk-mac-integration >= 2.0.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTK_MAC_LIBS"; then pkg_cv_GTK_MAC_LIBS="$GTK_MAC_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-mac-integration >= 2.0.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk-mac-integration >= 2.0.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_MAC_LIBS=`$PKG_CONFIG --libs "gtk-mac-integration >= 2.0.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTK_MAC_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk-mac-integration >= 2.0.0" 2>&1` else GTK_MAC_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk-mac-integration >= 2.0.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTK_MAC_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (gtk-mac-integration >= 2.0.0) were not met: $GTK_MAC_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GTK_MAC_CFLAGS and GTK_MAC_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GTK_MAC_CFLAGS and GTK_MAC_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GTK_MAC_CFLAGS=$pkg_cv_GTK_MAC_CFLAGS GTK_MAC_LIBS=$pkg_cv_GTK_MAC_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi COCOA_GTK_CFLAGS="-xobjective-c -DWAVE_COCOA_GTK" COCOA_GTK_LDADD="-lobjc" COCOA_GTK_LDFLAGS="-framework Cocoa -framework ApplicationServices" fi if test x$with_gconf = xyes; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GCONF" >&5 $as_echo_n "checking for GCONF... " >&6; } if test -n "$GCONF_CFLAGS"; then pkg_cv_GCONF_CFLAGS="$GCONF_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gconf-2.0 >= 2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gconf-2.0 >= 2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GCONF_CFLAGS=`$PKG_CONFIG --cflags "gconf-2.0 >= 2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GCONF_LIBS"; then pkg_cv_GCONF_LIBS="$GCONF_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gconf-2.0 >= 2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gconf-2.0 >= 2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GCONF_LIBS=`$PKG_CONFIG --libs "gconf-2.0 >= 2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GCONF_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gconf-2.0 >= 2.0" 2>&1` else GCONF_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gconf-2.0 >= 2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GCONF_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (gconf-2.0 >= 2.0) were not met: $GCONF_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GCONF_CFLAGS and GCONF_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GCONF_CFLAGS and GCONF_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GCONF_CFLAGS=$pkg_cv_GCONF_CFLAGS GCONF_LIBS=$pkg_cv_GCONF_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi GCONF_CFLAGS="-DWAVE_HAVE_GCONF $GCONF_CFLAGS" fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK_UNIX_PRINT" >&5 $as_echo_n "checking for GTK_UNIX_PRINT... " >&6; } if test -n "$GTK_UNIX_PRINT_CFLAGS"; then pkg_cv_GTK_UNIX_PRINT_CFLAGS="$GTK_UNIX_PRINT_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-unix-print-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-unix-print-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_UNIX_PRINT_CFLAGS=`$PKG_CONFIG --cflags "gtk+-unix-print-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTK_UNIX_PRINT_LIBS"; then pkg_cv_GTK_UNIX_PRINT_LIBS="$GTK_UNIX_PRINT_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-unix-print-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-unix-print-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_UNIX_PRINT_LIBS=`$PKG_CONFIG --libs "gtk+-unix-print-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTK_UNIX_PRINT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-unix-print-2.0" 2>&1` else GTK_UNIX_PRINT_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-unix-print-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTK_UNIX_PRINT_PKG_ERRORS" >&5 GUP_F="no" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } GUP_F="no" else GTK_UNIX_PRINT_CFLAGS=$pkg_cv_GTK_UNIX_PRINT_CFLAGS GTK_UNIX_PRINT_LIBS=$pkg_cv_GTK_UNIX_PRINT_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } GUP_F="yes" fi if test "x$GUP_F" = xyes; then GTK_UNIX_PRINT_CFLAGS="${GTK_UNIX_PRINT_CFLAGS} -DWAVE_GTK_UNIX_PRINT" fi fi # Checks for header files. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 $as_echo_n "checking for working alloca.h... " >&6; } if ${ac_cv_working_alloca_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *) alloca (2 * sizeof (int)); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_working_alloca_h=yes else ac_cv_working_alloca_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 $as_echo "$ac_cv_working_alloca_h" >&6; } if test $ac_cv_working_alloca_h = yes; then $as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 $as_echo_n "checking for alloca... " >&6; } if ${ac_cv_func_alloca_works+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __GNUC__ # define alloca __builtin_alloca #else # ifdef _MSC_VER # include # define alloca _alloca # else # ifdef HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ void *alloca (size_t); # endif # endif # endif # endif #endif int main () { char *p = (char *) alloca (1); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_func_alloca_works=yes else ac_cv_func_alloca_works=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 $as_echo "$ac_cv_func_alloca_works" >&6; } if test $ac_cv_func_alloca_works = yes; then $as_echo "#define HAVE_ALLOCA 1" >>confdefs.h else # The SVR3 libPW and SVR4 libucb both contain 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. ALLOCA=\${LIBOBJDIR}alloca.$ac_objext $as_echo "#define C_ALLOCA 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 $as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } if ${ac_cv_os_cray+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined CRAY && ! defined CRAY2 webecray #else wenotbecray #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "webecray" >/dev/null 2>&1; then : ac_cv_os_cray=yes else ac_cv_os_cray=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 $as_echo "$ac_cv_os_cray" >&6; } if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define CRAY_STACKSEG_END $ac_func _ACEOF break fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 $as_echo_n "checking stack direction for C alloca... " >&6; } if ${ac_cv_c_stack_direction+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_c_stack_direction=0 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int find_stack_direction (int *addr, int depth) { int dir, dummy = 0; if (! addr) addr = &dummy; *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; dir = depth ? find_stack_direction (addr, depth - 1) : 0; return dir + dummy; } int main (int argc, char **argv) { return find_stack_direction (0, argc + !argv + 20) < 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_stack_direction=1 else ac_cv_c_stack_direction=-1 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 $as_echo "$ac_cv_c_stack_direction" >&6; } cat >>confdefs.h <<_ACEOF #define STACK_DIRECTION $ac_cv_c_stack_direction _ACEOF fi ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if eval \${$as_ac_Header+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5 $as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; } if ${ac_cv_header_sys_wait_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif int main () { int s; wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_sys_wait_h=yes else ac_cv_header_sys_wait_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5 $as_echo "$ac_cv_header_sys_wait_h" >&6; } if test $ac_cv_header_sys_wait_h = yes; then $as_echo "#define HAVE_SYS_WAIT_H 1" >>confdefs.h fi for ac_header in fcntl.h inttypes.h libintl.h limits.h malloc.h stddef.h stdint.h stdlib.h string.h strings.h sys/time.h unistd.h wchar.h wctype.h getopt.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # rpc workaround for cygwin for ac_header in rpc/types.h rpc/xdr.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#ifdef HAVE_RPC_TYPES_H # include #endif " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Checks for operand sizes. # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5 $as_echo_n "checking size of void *... " >&6; } if ${ac_cv_sizeof_void_p+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then : else if test "$ac_cv_type_void_p" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (void *) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_void_p=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5 $as_echo "$ac_cv_sizeof_void_p" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_VOID_P $ac_cv_sizeof_void_p _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5 $as_echo_n "checking size of double... " >&6; } if ${ac_cv_sizeof_double+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double" "$ac_includes_default"; then : else if test "$ac_cv_type_double" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (double) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_double=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double" >&5 $as_echo "$ac_cv_sizeof_double" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_DOUBLE $ac_cv_sizeof_double _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 $as_echo_n "checking size of long... " >&6; } if ${ac_cv_sizeof_long+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : else if test "$ac_cv_type_long" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 $as_echo "$ac_cv_sizeof_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG $ac_cv_sizeof_long _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 $as_echo_n "checking size of int... " >&6; } if ${ac_cv_sizeof_int+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : else if test "$ac_cv_type_int" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (int) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_int=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 $as_echo "$ac_cv_sizeof_int" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_INT $ac_cv_sizeof_int _ACEOF # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } if ${ac_cv_header_stdbool_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; /* See body of main program for 'e'. */ char f[(_Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ _Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; /* Catch a bug in an HP-UX C compiler. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ _Bool q = true; _Bool *pq = &q; int main () { bool e = &s; *pq |= q; *pq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdbool_h=yes else ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 $as_echo "$ac_cv_header_stdbool_h" >&6; } ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__BOOL 1 _ACEOF fi if test $ac_cv_header_stdbool_h = yes; then $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" if test "x$ac_cv_type_off_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define off_t long int _ACEOF fi ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default" if test "x$ac_cv_type_pid_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTRDIFF_T 1 _ACEOF fi # Check whether --enable-largefile was given. if test "${enable_largefile+set}" = set; then : enableval=$enable_largefile; fi if test "$enable_largefile" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 $as_echo_n "checking for special C compiler options needed for large files... " >&6; } if ${ac_cv_sys_largefile_CC+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : break fi rm -f core conftest.err conftest.$ac_objext CC="$CC -n32" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_largefile_CC=' -n32'; break fi rm -f core conftest.err conftest.$ac_objext break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 $as_echo "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 $as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } if ${ac_cv_sys_file_offset_bits+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=64; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 $as_echo "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits _ACEOF ;; esac rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 $as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } if ${ac_cv_sys_large_files+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=1; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 $as_echo "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGE_FILES $ac_cv_sys_large_files _ACEOF ;; esac rm -rf conftest* fi fi # Checks for library functions. (malloc/realloc removed to get rid of rpl_xxx substitutions) # AC_FUNC_MALLOC # AC_FUNC_REALLOC { $as_echo "$as_me:${as_lineno-$LINENO}: checking for error_at_line" >&5 $as_echo_n "checking for error_at_line... " >&6; } if ${ac_cv_lib_error_at_line+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { error_at_line (0, 0, "", 0, "an error occurred"); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_error_at_line=yes else ac_cv_lib_error_at_line=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_error_at_line" >&5 $as_echo "$ac_cv_lib_error_at_line" >&6; } if test $ac_cv_lib_error_at_line = no; then case " $LIBOBJS " in *" error.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS error.$ac_objext" ;; esac fi for ac_header in vfork.h do : ac_fn_c_check_header_mongrel "$LINENO" "vfork.h" "ac_cv_header_vfork_h" "$ac_includes_default" if test "x$ac_cv_header_vfork_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VFORK_H 1 _ACEOF fi done for ac_func in fork vfork do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "x$ac_cv_func_fork" = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fork" >&5 $as_echo_n "checking for working fork... " >&6; } if ${ac_cv_func_fork_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_fork_works=cross else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* By Ruediger Kuhlmann. */ return fork () < 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_fork_works=yes else ac_cv_func_fork_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fork_works" >&5 $as_echo "$ac_cv_func_fork_works" >&6; } else ac_cv_func_fork_works=$ac_cv_func_fork fi if test "x$ac_cv_func_fork_works" = xcross; then case $host in *-*-amigaos* | *-*-msdosdjgpp*) # Override, as these systems have only a dummy fork() stub ac_cv_func_fork_works=no ;; *) ac_cv_func_fork_works=yes ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5 $as_echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;} fi ac_cv_func_vfork_works=$ac_cv_func_vfork if test "x$ac_cv_func_vfork" = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vfork" >&5 $as_echo_n "checking for working vfork... " >&6; } if ${ac_cv_func_vfork_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_vfork_works=cross else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Thanks to Paul Eggert for this test. */ $ac_includes_default #include #ifdef HAVE_VFORK_H # include #endif /* On some sparc systems, changes by the child to local and incoming argument registers are propagated back to the parent. The compiler is told about this with #include , but some compilers (e.g. gcc -O) don't grok . Test for this by using a static variable whose address is put into a register that is clobbered by the vfork. */ static void #ifdef __cplusplus sparc_address_test (int arg) # else sparc_address_test (arg) int arg; #endif { static pid_t child; if (!child) { child = vfork (); if (child < 0) { perror ("vfork"); _exit(2); } if (!child) { arg = getpid(); write(-1, "", 0); _exit (arg); } } } int main () { pid_t parent = getpid (); pid_t child; sparc_address_test (0); child = vfork (); if (child == 0) { /* Here is another test for sparc vfork register problems. This test uses lots of local variables, at least as many local variables as main has allocated so far including compiler temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should reuse the register of parent for one of the local variables, since it will think that parent can't possibly be used any more in this routine. Assigning to the local variable will thus munge parent in the parent process. */ pid_t p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); /* Convince the compiler that p..p7 are live; otherwise, it might use the same hardware register for all 8 local variables. */ if (p != p1 || p != p2 || p != p3 || p != p4 || p != p5 || p != p6 || p != p7) _exit(1); /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent from child file descriptors. If the child closes a descriptor before it execs or exits, this munges the parent's descriptor as well. Test for this by closing stdout in the child. */ _exit(close(fileno(stdout)) != 0); } else { int status; struct stat st; while (wait(&status) != child) ; return ( /* Was there some problem with vforking? */ child < 0 /* Did the child fail? (This shouldn't happen.) */ || status /* Did the vfork/compiler bug occur? */ || parent != getpid() /* Did the file descriptor bug occur? */ || fstat(fileno(stdout), &st) != 0 ); } } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_vfork_works=yes else ac_cv_func_vfork_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vfork_works" >&5 $as_echo "$ac_cv_func_vfork_works" >&6; } fi; if test "x$ac_cv_func_fork_works" = xcross; then ac_cv_func_vfork_works=$ac_cv_func_vfork { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5 $as_echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;} fi if test "x$ac_cv_func_vfork_works" = xyes; then $as_echo "#define HAVE_WORKING_VFORK 1" >>confdefs.h else $as_echo "#define vfork fork" >>confdefs.h fi if test "x$ac_cv_func_fork_works" = xyes; then $as_echo "#define HAVE_WORKING_FORK 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5 $as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; } if ${ac_cv_sys_largefile_source+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=no; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE_SOURCE 1 #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=1; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_cv_sys_largefile_source=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5 $as_echo "$ac_cv_sys_largefile_source" >&6; } case $ac_cv_sys_largefile_source in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source _ACEOF ;; esac rm -rf conftest* # We used to try defining _XOPEN_SOURCE=500 too, to work around a bug # in glibc 2.1.3, but that breaks too many other things. # If you want fseeko and ftello with glibc, upgrade to a fixed glibc. if test $ac_cv_sys_largefile_source != unknown; then $as_echo "#define HAVE_FSEEKO 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working memcmp" >&5 $as_echo_n "checking for working memcmp... " >&6; } if ${ac_cv_func_memcmp_working+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_memcmp_working=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Some versions of memcmp are not 8-bit clean. */ char c0 = '\100', c1 = '\200', c2 = '\201'; if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0) return 1; /* The Next x86 OpenStep bug shows up only when comparing 16 bytes or more and with at least one buffer not starting on a 4-byte boundary. William Lewis provided this test program. */ { char foo[21]; char bar[21]; int i; for (i = 0; i < 4; i++) { char *a = foo + i; char *b = bar + i; strcpy (a, "--------01111111"); strcpy (b, "--------10000000"); if (memcmp (a, b, 16) >= 0) return 1; } return 0; } ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_memcmp_working=yes else ac_cv_func_memcmp_working=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_memcmp_working" >&5 $as_echo "$ac_cv_func_memcmp_working" >&6; } test $ac_cv_func_memcmp_working = no && case " $LIBOBJS " in *" memcmp.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS memcmp.$ac_objext" ;; esac for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in getpagesize do : ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize" if test "x$ac_cv_func_getpagesize" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETPAGESIZE 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 $as_echo_n "checking for working mmap... " >&6; } if ${ac_cv_func_mmap_fixed_mapped+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_mmap_fixed_mapped=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default /* malloc might have been renamed as rpl_malloc. */ #undef malloc /* Thanks to Mike Haertel and Jim Avera for this test. Here is a matrix of mmap possibilities: mmap private not fixed mmap private fixed at somewhere currently unmapped mmap private fixed at somewhere already mapped mmap shared not fixed mmap shared fixed at somewhere currently unmapped mmap shared fixed at somewhere already mapped For private mappings, we should verify that changes cannot be read() back from the file, nor mmap's back from the file at a different address. (There have been systems where private was not correctly implemented like the infamous i386 svr4.0, and systems where the VM page cache was not coherent with the file system buffer cache like early versions of FreeBSD and possibly contemporary NetBSD.) For shared mappings, we should conversely verify that changes get propagated back to all the places they're supposed to be. Grep wants private fixed already mapped. The main things grep needs to know about mmap are: * does it exist and is it safe to write into the mmap'd area * how to use it (BSD variants) */ #include #include #if !defined STDC_HEADERS && !defined HAVE_STDLIB_H char *malloc (); #endif /* This mess was copied from the GNU getpagesize.h. */ #ifndef HAVE_GETPAGESIZE # ifdef _SC_PAGESIZE # define getpagesize() sysconf(_SC_PAGESIZE) # else /* no _SC_PAGESIZE */ # ifdef HAVE_SYS_PARAM_H # include # ifdef EXEC_PAGESIZE # define getpagesize() EXEC_PAGESIZE # else /* no EXEC_PAGESIZE */ # ifdef NBPG # define getpagesize() NBPG * CLSIZE # ifndef CLSIZE # define CLSIZE 1 # endif /* no CLSIZE */ # else /* no NBPG */ # ifdef NBPC # define getpagesize() NBPC # else /* no NBPC */ # ifdef PAGESIZE # define getpagesize() PAGESIZE # endif /* PAGESIZE */ # endif /* no NBPC */ # endif /* no NBPG */ # endif /* no EXEC_PAGESIZE */ # else /* no HAVE_SYS_PARAM_H */ # define getpagesize() 8192 /* punt totally */ # endif /* no HAVE_SYS_PARAM_H */ # endif /* no _SC_PAGESIZE */ #endif /* no HAVE_GETPAGESIZE */ int main () { char *data, *data2, *data3; const char *cdata2; int i, pagesize; int fd, fd2; pagesize = getpagesize (); /* First, make a file with some known garbage in it. */ data = (char *) malloc (pagesize); if (!data) return 1; for (i = 0; i < pagesize; ++i) *(data + i) = rand (); umask (0); fd = creat ("conftest.mmap", 0600); if (fd < 0) return 2; if (write (fd, data, pagesize) != pagesize) return 3; close (fd); /* Next, check that the tail of a page is zero-filled. File must have non-zero length, otherwise we risk SIGBUS for entire page. */ fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600); if (fd2 < 0) return 4; cdata2 = ""; if (write (fd2, cdata2, 1) != 1) return 5; data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L); if (data2 == MAP_FAILED) return 6; for (i = 0; i < pagesize; ++i) if (*(data2 + i)) return 7; close (fd2); if (munmap (data2, pagesize)) return 8; /* Next, try to mmap the file at a fixed address which already has something else allocated at it. If we can, also make sure that we see the same garbage. */ fd = open ("conftest.mmap", O_RDWR); if (fd < 0) return 9; if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0L)) return 10; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data2 + i)) return 11; /* Finally, make sure that changes to the mapped area do not percolate back to the file as seen by read(). (This is a bug on some variants of i386 svr4.0.) */ for (i = 0; i < pagesize; ++i) *(data2 + i) = *(data2 + i) + 1; data3 = (char *) malloc (pagesize); if (!data3) return 12; if (read (fd, data3, pagesize) != pagesize) return 13; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data3 + i)) return 14; close (fd); return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_mmap_fixed_mapped=yes else ac_cv_func_mmap_fixed_mapped=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 $as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; } if test $ac_cv_func_mmap_fixed_mapped = yes; then $as_echo "#define HAVE_MMAP 1" >>confdefs.h fi rm -f conftest.mmap conftest.txt for ac_header in sys/select.h sys/socket.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking types of arguments for select" >&5 $as_echo_n "checking types of arguments for select... " >&6; } if ${ac_cv_func_select_args+:} false; then : $as_echo_n "(cached) " >&6 else for ac_arg234 in 'fd_set *' 'int *' 'void *'; do for ac_arg1 in 'int' 'size_t' 'unsigned long int' 'unsigned int'; do for ac_arg5 in 'struct timeval *' 'const struct timeval *'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #ifdef HAVE_SYS_SELECT_H # include #endif #ifdef HAVE_SYS_SOCKET_H # include #endif int main () { extern int select ($ac_arg1, $ac_arg234, $ac_arg234, $ac_arg234, $ac_arg5); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_select_args="$ac_arg1,$ac_arg234,$ac_arg5"; break 3 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done done done # Provide a safe default value. : "${ac_cv_func_select_args=int,int *,struct timeval *}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_select_args" >&5 $as_echo "$ac_cv_func_select_args" >&6; } ac_save_IFS=$IFS; IFS=',' set dummy `echo "$ac_cv_func_select_args" | sed 's/\*/\*/g'` IFS=$ac_save_IFS shift cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG1 $1 _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG234 ($2) _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG5 ($3) _ACEOF rm -f conftest* if ${ac_cv_func_setvbuf_reversed+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_func_setvbuf_reversed=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5 $as_echo_n "checking whether lstat correctly handles trailing slash... " >&6; } if ${ac_cv_func_lstat_dereferences_slashed_symlink+:} false; then : $as_echo_n "(cached) " >&6 else rm -f conftest.sym conftest.file echo >conftest.file if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then if test "$cross_compiling" = yes; then : ac_cv_func_lstat_dereferences_slashed_symlink=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; /* Linux will dereference the symlink and fail, as required by POSIX. That is better in the sense that it means we will not have to compile and use the lstat wrapper. */ return lstat ("conftest.sym/", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_lstat_dereferences_slashed_symlink=yes else ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else # If the `ln -s' command failed, then we probably don't even # have an lstat function. ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f conftest.sym conftest.file fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 $as_echo "$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; } test $ac_cv_func_lstat_dereferences_slashed_symlink = yes && cat >>confdefs.h <<_ACEOF #define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 _ACEOF if test "x$ac_cv_func_lstat_dereferences_slashed_symlink" = xno; then case " $LIBOBJS " in *" lstat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat accepts an empty string" >&5 $as_echo_n "checking whether stat accepts an empty string... " >&6; } if ${ac_cv_func_stat_empty_string_bug+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_stat_empty_string_bug=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; return stat ("", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_stat_empty_string_bug=no else ac_cv_func_stat_empty_string_bug=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_stat_empty_string_bug" >&5 $as_echo "$ac_cv_func_stat_empty_string_bug" >&6; } if test $ac_cv_func_stat_empty_string_bug = yes; then case " $LIBOBJS " in *" stat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS stat.$ac_objext" ;; esac cat >>confdefs.h <<_ACEOF #define HAVE_STAT_EMPTY_STRING_BUG 1 _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strtod" >&5 $as_echo_n "checking for working strtod... " >&6; } if ${ac_cv_func_strtod+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_strtod=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #ifndef strtod double strtod (); #endif int main() { { /* Some versions of Linux strtod mis-parse strings with leading '+'. */ char *string = " +69"; char *term; double value; value = strtod (string, &term); if (value != 69 || term != (string + 4)) return 1; } { /* Under Solaris 2.4, strtod returns the wrong value for the terminating character under some conditions. */ char *string = "NaN"; char *term; strtod (string, &term); if (term != string && *(term - 1) == 0) return 1; } return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_strtod=yes else ac_cv_func_strtod=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strtod" >&5 $as_echo "$ac_cv_func_strtod" >&6; } if test $ac_cv_func_strtod = no; then case " $LIBOBJS " in *" strtod.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS strtod.$ac_objext" ;; esac ac_fn_c_check_func "$LINENO" "pow" "ac_cv_func_pow" if test "x$ac_cv_func_pow" = xyes; then : fi if test $ac_cv_func_pow = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pow in -lm" >&5 $as_echo_n "checking for pow in -lm... " >&6; } if ${ac_cv_lib_m_pow+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pow (); int main () { return pow (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_pow=yes else ac_cv_lib_m_pow=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_pow" >&5 $as_echo "$ac_cv_lib_m_pow" >&6; } if test "x$ac_cv_lib_m_pow" = xyes; then : POW_LIB=-lm else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot find library containing definition of pow" >&5 $as_echo "$as_me: WARNING: cannot find library containing definition of pow" >&2;} fi fi fi for ac_func in vprintf do : ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf" if test "x$ac_cv_func_vprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VPRINTF 1 _ACEOF ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" if test "x$ac_cv_func__doprnt" = xyes; then : $as_echo "#define HAVE_DOPRNT 1" >>confdefs.h fi fi done for ac_func in atexit btowc bzero dup2 memmove memset munmap pow putenv re_comp realpath regcomp select setenv strcasecmp strchr strdup strerror strncasecmp strrchr strstr getopt_long setenv unsetenv do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xdrmem_create in -lnsl" >&5 $as_echo_n "checking for xdrmem_create in -lnsl... " >&6; } if ${ac_cv_lib_nsl_xdrmem_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char xdrmem_create (); int main () { return xdrmem_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_xdrmem_create=yes else ac_cv_lib_nsl_xdrmem_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_xdrmem_create" >&5 $as_echo "$ac_cv_lib_nsl_xdrmem_create" >&6; } if test "x$ac_cv_lib_nsl_xdrmem_create" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBNSL 1 _ACEOF LIBS="-lnsl $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xdrmem_create in -lrpc" >&5 $as_echo_n "checking for xdrmem_create in -lrpc... " >&6; } if ${ac_cv_lib_rpc_xdrmem_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lrpc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char xdrmem_create (); int main () { return xdrmem_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_rpc_xdrmem_create=yes else ac_cv_lib_rpc_xdrmem_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rpc_xdrmem_create" >&5 $as_echo "$ac_cv_lib_rpc_xdrmem_create" >&6; } if test "x$ac_cv_lib_rpc_xdrmem_create" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBRPC 1 _ACEOF LIBS="-lrpc $LIBS" fi # some AIX adds (linker flag for 32 bit compiles) if test "X$OSTYPE" = "Xaix" ; then if test "X$MACHTYPE" = "Xrs6000" ; then CFLAGS="${CFLAGS} -D_WAVE_BE32" if test "X$CC" = "Xxlc" ; then LDFLAGS="${LDFLAGS} -bmaxdata:0xd0000000/dsa" else LDFLAGS="${LDFLAGS} -Wl,-bmaxdata:0xd0000000/dsa" fi fi fi CFLAGS="${CFLAGS} ${STRUCT_PACK}" if test "X$OSTYPE" = "Xmsys" ; then # add library for common dialog found in file.c MINGW_LDADD="-lcomdlg32" else # there are conflicts with struct timespec in pthreads vs mingw CFLAGS="${CFLAGS} -DFST_WRITER_PARALLEL" fi if test "X$ETCL" = "Xyes" ; then if test "X$OSTYPE" = "Xcygwin" ; then # skip Tcl_CreateInterp check on cygwin... if test "X$STUBIFY" = "Xyes" ; then TCL_DEFADD="-DHAVE_LIBTCL -DWAVE_TCL_STUBIFY -DUSE_TCL_STUBS -DUSE_TK_STUBS" TCL_LDADD="${TCL_STUB_LIB_SPEC}" TK_LDADD="${TK_STUB_LIB_SPEC}" else TCL_DEFADD="-DHAVE_LIBTCL" TCL_LDADD="${TCL_LIB_SPEC}" TK_LDADD="${TK_LIB_SPEC}" # cygwin tkConfig.sh has issues... if test "X$TK_LDADD" = "X" ; then TK_LDADD="${TK_BUILD_LIB_SPEC}" fi fi else if test "X$OSTYPE" = "Xdarwin" ; then # skip Tcl_CreateInterp check on darwin (until we figure out)... if test "X$STUBIFY" = "Xyes" ; then TCL_DEFADD="-DHAVE_LIBTCL -DWAVE_TCL_STUBIFY -DUSE_TCL_STUBS -DUSE_TK_STUBS" TCL_LDADD="${TCL_STUB_LIB_SPEC}" TK_LDADD="${TK_STUB_LIB_SPEC}" else TCL_DEFADD="-DHAVE_LIBTCL" TCL_LDADD="${TCL_LIB_SPEC}" TK_LDADD="${TK_LIB_SPEC}" fi else if test "X$OSTYPE" = "Xmsys" ; then # skip Tcl_CreateInterp check on mingw (until we figure out)... if test "X$STUBIFY" = "Xyes" ; then TCL_DEFADD="-DHAVE_LIBTCL -DWAVE_TCL_STUBIFY -DUSE_TCL_STUBS -DUSE_TK_STUBS" TCL_LDADD="${TCL_STUB_LIB_SPEC}" TK_LDADD="${TK_STUB_LIB_SPEC}" else TCL_DEFADD="-DHAVE_LIBTCL" TCL_LDADD="${TCL_LIB_SPEC}" TK_LDADD="${TK_LIB_SPEC}" fi else OLD_LDFLAGS="${LDFLAGS}" TCLSPEC_LHS="${TCL_LIB_SPEC% *}" TKLSPEC_LHS="${TK_LIB_SPEC% *}" LDFLAGS="${LDFLAGS} ${TCLSPEC_LHS} ${TKLSPEC_LHS}" as_ac_Lib=`$as_echo "ac_cv_lib_tcl${TCL_VERSION}''_Tcl_CreateInterp" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl_CreateInterp in -ltcl${TCL_VERSION}" >&5 $as_echo_n "checking for Tcl_CreateInterp in -ltcl${TCL_VERSION}... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ltcl${TCL_VERSION} $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char Tcl_CreateInterp (); int main () { return Tcl_CreateInterp (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : TCL_LDADD=${TCL_LIB_SPEC} else need_tcl=yes fi if test "$need_tcl" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Tcl support not enabled." >&5 $as_echo "$as_me: WARNING: Tcl support not enabled." >&2;} else if test "X$STUBIFY" = "Xyes" ; then TCL_DEFADD="-DHAVE_LIBTCL -DWAVE_TCL_STUBIFY -DUSE_TCL_STUBS -DUSE_TK_STUBS" TCL_LDADD="${TCL_STUB_LIB_SPEC}" TK_LDADD="${TK_STUB_LIB_SPEC}" else TCL_DEFADD="-DHAVE_LIBTCL" TCL_LDADD="${TCL_LIB_SPEC}" TK_LDADD="${TK_LIB_SPEC}" fi fi LDFLAGS="${OLD_LDFLAGS}" fi fi fi fi ac_config_files="$ac_config_files Makefile doc/Makefile contrib/Makefile contrib/pccts/IBM_VISUAL_AGE_PROJECTS/Makefile contrib/pccts/Makefile contrib/pccts/antlr/Makefile contrib/pccts/dlg/Makefile contrib/pccts/h/Makefile contrib/pccts/sorcerer/Makefile contrib/pccts/sorcerer/h/Makefile contrib/pccts/sorcerer/lib/Makefile contrib/pccts/sorcerer/test/Makefile contrib/pccts/sorcerer/test/test7/Makefile contrib/pccts/sorcerer/testcpp/Makefile contrib/pccts/support/DECmms/Makefile contrib/pccts/support/Makefile contrib/pccts/support/genmk/Makefile contrib/pccts/support/rexpr/Makefile contrib/pccts/support/set/Makefile contrib/pccts/support/sym/Makefile contrib/pccts/testcpp/Makefile contrib/rtlbrowse/Makefile contrib/vermin/Makefile contrib/bundle_for_osx/Makefile contrib/fst_jni/Makefile contrib/wlf2vcd/Makefile contrib/fsdb2vcd/Makefile examples/Makefile man/Makefile src/Makefile src/cocoa/Makefile src/helpers/Makefile src/liblzma/Makefile src/libbz2/Makefile src/libz/Makefile src/helpers/fst/Makefile share/Makefile share/mime/Makefile share/mime/packages/Makefile share/icons/Makefile share/icons/gnome/Makefile share/icons/gnome/16x16/Makefile share/icons/gnome/16x16/mimetypes/Makefile share/icons/gnome/32x32/Makefile share/icons/gnome/32x32/mimetypes/Makefile share/icons/gnome/48x48/Makefile share/icons/gnome/48x48/mimetypes/Makefile share/icons/hicolor/Makefile share/icons/hicolor/scalable/Makefile share/icons/hicolor/scalable/apps/Makefile share/applications/Makefile share/appdata/Makefile" { $as_echo "$as_me:${as_lineno-$LINENO}: -------------------------------------------- Configuration summary: FASTTREE_CFLAGS : $FASTTREE_CFLAGS gtk1 : $GTK1 gtk version : $GTK_VER GTK_CFLAGS : $GTK_CFLAGS GTK_LIBS : $GTK_LIBS LIBZ_CFLAGS : $LIBZ_CFLAGS LIBZ_LDADD : $LIBZ_LDADD LIBBZ2_CFLAGS : $LIBBZ2_CFLAGS LIBBZ2_LDADD : $LIBBZ2_LDADD LIBXZ_CFLAGS : $LIBXZ_CFLAGS LIBXZ_LDADD : $LIBXZ_LDADD LIBJUDY_CFLAGS : $LIBJUDY_CFLAGS LIBJUDY_LDADD : $LIBJUDY_LDADD AET2_CFLAGS : $AET2_CFLAGS AET2_LDADD : $AET2_LDADD FSDB_CFLAGS : $FSDB_CFLAGS FSDB_LDADD : $FSDB_LDADD EXTLOAD_CFLAGS : $EXTLOAD_CFLAGS TCL_INCLUDE_SPEC : $TCL_INCLUDE_SPEC TCL_LIB_SPEC : $TCL_LIB_SPEC TCL_LDADD : $TCL_LDADD TCL_DEFADD : $TCL_DEFADD TK_INCLUDE_SPEC : $TK_INCLUDE_SPEC TK_LIB_SPEC : $TK_LIB_SPEC TK_LDADD : $TK_LDADD CPPFLAGS : $CPPFLAGS CFLAGS : $CFLAGS LDFLAGS : $LDFLAGS LIBS : $LIBS MINGW_LDADD : $MINGW_LDADD GTK_MAC_CFLAGS : $GTK_MAC_CFLAGS GTK_MAC_LIBS : $GTK_MAC_LIBS COCOA_GTK_CFLAGS : $COCOA_GTK_CFLAGS COCOA_GTK_LDADD : $COCOA_GTK_LDADD COCOA_GTK_LDFLAGS : $COCOA_GTK_LDFLAGS GCONF_CFLAGS : $GCONF_CFLAGS GCONF_LIBS : $GCONF_LIBS GTK_UNIX_PRINT_CFLAGS : $GTK_UNIX_PRINT_CFLAGS GTK_UNIX_PRINT_LIBS : $GTK_UNIX_PRINT_LIBS GEDIT_CFLAGS : $GEDIT_CFLAGS -------------------------------------------- " >&5 $as_echo "$as_me: -------------------------------------------- Configuration summary: FASTTREE_CFLAGS : $FASTTREE_CFLAGS gtk1 : $GTK1 gtk version : $GTK_VER GTK_CFLAGS : $GTK_CFLAGS GTK_LIBS : $GTK_LIBS LIBZ_CFLAGS : $LIBZ_CFLAGS LIBZ_LDADD : $LIBZ_LDADD LIBBZ2_CFLAGS : $LIBBZ2_CFLAGS LIBBZ2_LDADD : $LIBBZ2_LDADD LIBXZ_CFLAGS : $LIBXZ_CFLAGS LIBXZ_LDADD : $LIBXZ_LDADD LIBJUDY_CFLAGS : $LIBJUDY_CFLAGS LIBJUDY_LDADD : $LIBJUDY_LDADD AET2_CFLAGS : $AET2_CFLAGS AET2_LDADD : $AET2_LDADD FSDB_CFLAGS : $FSDB_CFLAGS FSDB_LDADD : $FSDB_LDADD EXTLOAD_CFLAGS : $EXTLOAD_CFLAGS TCL_INCLUDE_SPEC : $TCL_INCLUDE_SPEC TCL_LIB_SPEC : $TCL_LIB_SPEC TCL_LDADD : $TCL_LDADD TCL_DEFADD : $TCL_DEFADD TK_INCLUDE_SPEC : $TK_INCLUDE_SPEC TK_LIB_SPEC : $TK_LIB_SPEC TK_LDADD : $TK_LDADD CPPFLAGS : $CPPFLAGS CFLAGS : $CFLAGS LDFLAGS : $LDFLAGS LIBS : $LIBS MINGW_LDADD : $MINGW_LDADD GTK_MAC_CFLAGS : $GTK_MAC_CFLAGS GTK_MAC_LIBS : $GTK_MAC_LIBS COCOA_GTK_CFLAGS : $COCOA_GTK_CFLAGS COCOA_GTK_LDADD : $COCOA_GTK_LDADD COCOA_GTK_LDFLAGS : $COCOA_GTK_LDFLAGS GCONF_CFLAGS : $GCONF_CFLAGS GCONF_LIBS : $GCONF_LIBS GTK_UNIX_PRINT_CFLAGS : $GTK_UNIX_PRINT_CFLAGS GTK_UNIX_PRINT_LIBS : $GTK_UNIX_PRINT_LIBS GEDIT_CFLAGS : $GEDIT_CFLAGS -------------------------------------------- " >&6;} cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${FDO_MIME_TRUE}" && test -z "${FDO_MIME_FALSE}"; then as_fn_error $? "conditional \"FDO_MIME\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by gtkwave $as_me 3.3.86, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ gtkwave config.status 3.3.86 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "contrib/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/Makefile" ;; "contrib/pccts/IBM_VISUAL_AGE_PROJECTS/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/pccts/IBM_VISUAL_AGE_PROJECTS/Makefile" ;; "contrib/pccts/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/pccts/Makefile" ;; "contrib/pccts/antlr/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/pccts/antlr/Makefile" ;; "contrib/pccts/dlg/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/pccts/dlg/Makefile" ;; "contrib/pccts/h/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/pccts/h/Makefile" ;; "contrib/pccts/sorcerer/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/pccts/sorcerer/Makefile" ;; "contrib/pccts/sorcerer/h/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/pccts/sorcerer/h/Makefile" ;; "contrib/pccts/sorcerer/lib/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/pccts/sorcerer/lib/Makefile" ;; "contrib/pccts/sorcerer/test/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/pccts/sorcerer/test/Makefile" ;; "contrib/pccts/sorcerer/test/test7/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/pccts/sorcerer/test/test7/Makefile" ;; "contrib/pccts/sorcerer/testcpp/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/pccts/sorcerer/testcpp/Makefile" ;; "contrib/pccts/support/DECmms/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/pccts/support/DECmms/Makefile" ;; "contrib/pccts/support/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/pccts/support/Makefile" ;; "contrib/pccts/support/genmk/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/pccts/support/genmk/Makefile" ;; "contrib/pccts/support/rexpr/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/pccts/support/rexpr/Makefile" ;; "contrib/pccts/support/set/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/pccts/support/set/Makefile" ;; "contrib/pccts/support/sym/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/pccts/support/sym/Makefile" ;; "contrib/pccts/testcpp/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/pccts/testcpp/Makefile" ;; "contrib/rtlbrowse/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/rtlbrowse/Makefile" ;; "contrib/vermin/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/vermin/Makefile" ;; "contrib/bundle_for_osx/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/bundle_for_osx/Makefile" ;; "contrib/fst_jni/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/fst_jni/Makefile" ;; "contrib/wlf2vcd/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/wlf2vcd/Makefile" ;; "contrib/fsdb2vcd/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/fsdb2vcd/Makefile" ;; "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/cocoa/Makefile") CONFIG_FILES="$CONFIG_FILES src/cocoa/Makefile" ;; "src/helpers/Makefile") CONFIG_FILES="$CONFIG_FILES src/helpers/Makefile" ;; "src/liblzma/Makefile") CONFIG_FILES="$CONFIG_FILES src/liblzma/Makefile" ;; "src/libbz2/Makefile") CONFIG_FILES="$CONFIG_FILES src/libbz2/Makefile" ;; "src/libz/Makefile") CONFIG_FILES="$CONFIG_FILES src/libz/Makefile" ;; "src/helpers/fst/Makefile") CONFIG_FILES="$CONFIG_FILES src/helpers/fst/Makefile" ;; "share/Makefile") CONFIG_FILES="$CONFIG_FILES share/Makefile" ;; "share/mime/Makefile") CONFIG_FILES="$CONFIG_FILES share/mime/Makefile" ;; "share/mime/packages/Makefile") CONFIG_FILES="$CONFIG_FILES share/mime/packages/Makefile" ;; "share/icons/Makefile") CONFIG_FILES="$CONFIG_FILES share/icons/Makefile" ;; "share/icons/gnome/Makefile") CONFIG_FILES="$CONFIG_FILES share/icons/gnome/Makefile" ;; "share/icons/gnome/16x16/Makefile") CONFIG_FILES="$CONFIG_FILES share/icons/gnome/16x16/Makefile" ;; "share/icons/gnome/16x16/mimetypes/Makefile") CONFIG_FILES="$CONFIG_FILES share/icons/gnome/16x16/mimetypes/Makefile" ;; "share/icons/gnome/32x32/Makefile") CONFIG_FILES="$CONFIG_FILES share/icons/gnome/32x32/Makefile" ;; "share/icons/gnome/32x32/mimetypes/Makefile") CONFIG_FILES="$CONFIG_FILES share/icons/gnome/32x32/mimetypes/Makefile" ;; "share/icons/gnome/48x48/Makefile") CONFIG_FILES="$CONFIG_FILES share/icons/gnome/48x48/Makefile" ;; "share/icons/gnome/48x48/mimetypes/Makefile") CONFIG_FILES="$CONFIG_FILES share/icons/gnome/48x48/mimetypes/Makefile" ;; "share/icons/hicolor/Makefile") CONFIG_FILES="$CONFIG_FILES share/icons/hicolor/Makefile" ;; "share/icons/hicolor/scalable/Makefile") CONFIG_FILES="$CONFIG_FILES share/icons/hicolor/scalable/Makefile" ;; "share/icons/hicolor/scalable/apps/Makefile") CONFIG_FILES="$CONFIG_FILES share/icons/hicolor/scalable/apps/Makefile" ;; "share/applications/Makefile") CONFIG_FILES="$CONFIG_FILES share/applications/Makefile" ;; "share/appdata/Makefile") CONFIG_FILES="$CONFIG_FILES share/appdata/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi gtkwave-3.3.86/Makefile.in0000664000175000017500000006224313166335473014660 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = . DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in AUTHORS COPYING ChangeLog INSTALL NEWS \ README compile config.guess config.sub depcomp install-sh \ missing ylwrap ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = doc examples man src contrib share EXTRA_DIST = ChangeLog COPYING INSTALL LICENSE.TXT README NEWS AUTHORS \ autogen.sh wave_locale.h tcl.m4 all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile config.h installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) all install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-generic distclean-hdr \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/AUTHORS0000664000175000017500000000220113166335473013647 0ustar bybellbybellGTKWave Wave Viewer is Copyright (C) 1999-2016 Tony Bybell. Windows compatibility and PS/MIF routines are Copyright (C) 1999-2016 Udi Finkelstein. Context support is Copyright (C) 2007-2016 Kermin Elliott Fleming. Trace group support is Copyright (C) 2009-2016 Donald Baltus. GHW and additional GUI support is Copyright (C) 2005-2016 Tristan Gingold. Analog support is Copyright (C) 2005-2016 Thomas Sailer. External DnD support is Copyright (C) 2008-2016 Concept Engineering GmbH. FastLZ is Copyright (C) 2005-2016 Ariya Hidayat. PCCTS 1.33MR is Copyright (C) 1989-2016 Terence Parr, Russell Quong, Will Cohen, Hank Dietz, and Thomas Moog. Some public domain clip art by contributors at http://www.sxc.hu/ website. Hierarchy marker icons from the Silk icons set by Mark James found at the http://www.famfamfam.com/lab/icons/silk/ website. Portions of the TCL implementation, tcl_np.c and tcl_np.h are copyrighted by the Regents of the University of California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState Corporation, and other parties. NSAlert is Copyright (C) 2011-2016 Philipp Mayerhofer. LZ4 is Copyright (C) 2011-2016 Yann Collet. gtkwave-3.3.86/distro_from_svn.sh0000775000175000017500000000057713166335473016371 0ustar bybellbybell#!/bin/sh echo "Cleaning out SVN directories..." find . | grep '\.svn' | tac | awk '{print "rm -rf "$0}' | sh echo "Making distribution tarball from SVN directory..." cd ../ cat ./gtkwave3/configure.ac | grep AC_INIT | awk '{print $2}' | sed 's/,//' | \ awk '{print "mv gtkwave3 gtkwave-"$0" ; tar cvf gtkwave-"$0".tar gtkwave-"$0" ; gzip -9 gtkwave-"$0".tar"}' | sh echo "Done!" gtkwave-3.3.86/depcomp0000775000175000017500000005570313166335473014173 0ustar bybellbybell#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2012-10-18.11; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # 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, 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: gtkwave-3.3.86/ChangeLog0000664000175000017500000023706513166335473014373 0ustar bybellbybell3.0.0 01may06 Initial release after promotion from 1.3.86 in order to reduce confusion with 2.x series. Added user's manual pdf file to distribution in doc/. Added vertex and rtlbrowse for sourcecode annotation. 3.0.1 09may06 Automatically add extensions to save filenames in gtkwave. Cygwin compile fixes. Add Cygwin functionality for fork() related ops that do in fact work properly. 3.0.2 09may06 More fixes for full function (except pthreads) in Cygwin. Requires usage of Cygserver if rtlbrowse is to work. Fixed fonts for Cygwin to improve readability. The Courier font is very bad looking and blitter mangled under cygwin. 3.0.3 29may06 Changed yylineno references in vlex.l in rtlbrowse to my_yylineno as newer versions of flex automatically define this and cause duplicate symbols. Saw there were still problems with courier on debian. Also check for misc-fixed on non-cygwin systems just in case. 3.0.4 30may06 Added busy watch (hourglass) for long ops that lock the GUI. Fixed replace function in treesearch_gtk2 so it doesn't simply replace with the last signal. (Iterator shouldn't be used the way it was.) 3.0.5 08jun06 Reworked tree structure code to handle new tree layout such that strings are embedded at the end of struct. This reduces memory usage overall. Added in implicit hierarchy split on pipe character in symbol names as these only really happen in netlists that have escaped identifiers. For vzt and lxt2 loaders added block allocation of symbols and nodes during init in order to allow denser memory allocation as the bookkeeping overhead between allocations internal to malloc() is unnecessary as the number of elements is known at the outset. Also removed hashing in aet2, lxt, lxt2, vzt as sym[hv] is unused on sorted facs. Removed unnecessary strlen() calls after sprintf() in the dumpfile loaders as the string length is known from the rc of sprintf. Fixed T_SCOPE rule in vcd.c as dotted hierarchies would throw off the parser as hierarchies themselves are (in practice) never really escaped. In tree.c, treenamefix() would recurse more than necessary such that some dotted hierarchies would cause an order of n squared recursion and as such never complete running due to the size of the hierarchy. Found non _2 versions of memory allocate/free being used in various non-library places. Fixed signal aliasing problems in GHW traces that have memories or aliased signals in ghw.c. Added handling for e8 datatypes and arrays in ghwlib.c and ghw.c. Updated ghwlib.c and main.c in order to handle gzip or bzip2 compressed files. Extension can be .ghw, .ghw.gz, or .ghw.bz2 and the file will be handled properly. Note that as the matchword is consulted, just .ghw can be used to specify a gzip or bzip2 file implicitly. Added ghwdump and ghwdump.1 to the distribution (from ghdl) as it is helpful for debugging ghw file failures. 3.0.6 14jul06 Added "Real" option for data type display as passing around real numbers in Verilog across modules needs to be done with $realtobits and $bitstoreal. Added scripting command flag --script in order to allow autosetup of things that are outside of config file control. This also allows doing things such as automated print jobs. Added --nowm to remove window manager control on most windows the viewer brings up. Added --xid to allow turning the viewer into a plug-in for calling by foreign applications. This will allow integration of the viewer into a single window for example, with IDEs. Added --nomenus to remove menus for the case when used in conjunction with --xid and it is desired to create an embedded wave viewer applet that cannot initiate file I/O on its own. Note that earlier versions of GTK+ cannot handle menu events properly from a GtkPlug. Fixed problem with dead memory allocations for GtkColor structs in color.c as found by Valgrind. Moved .odt version of the user's guide into doc/ rather than the pdf version as this is a sourcecode distribution so the original word processor document should be there. The .pdf will still be up on the homepage on the website. Added example script (for use with the -S option) in the examples/ directory that prints some waves then exits. Found problem with directive-based string embedding in older gcc compiler versions. GTK+-1.2 doesn't handle GtkPlug. 3.0.7 17jul06 Added support for dualview of waveforms using GtkPlug and shared memory IPC through use of the "twinwave" front end. Updated documentation to add a section on twinwave. 3.0.8 04aug06 Modified order of flags in twinwave as appending flags does not work when longopt isn't used. Subscripted GtkItemFactoryEntry menu_items for AIX compile. More AIX fixes such as conditional alloca.h usage and not including getopt.h. Removed unused "bus" element from struct fac. Added interactive loading of vcd files with the routines in vcd_partial.c. Added shmidcat to the distribition to test this new interactive loading functionality. Added real_parameter vartype (Riviera Aldec 2006.6) in all vcd loaders. 3.0.9 10aug06 Fixing compiler warnings across various systems. Minor speedup in sigcmp() in bitvec.c for EOS detection. Fix in vcd_partial.c loader that crashed on interactive loads when blank traces are present in the save file. 3.0.10 13aug06 Found inadvertant 64/32 bit conversion in regex.c that was from not including "debug.h" header file. Missing headers for gcc-3.2.x and earlier dealing with select(). Converted fgetmalloc() to use vlists in order to cut down on the backflips and traversal required for the old one character per struct method. Added VCD recoder that stores the VCD in memory using a new recoding scheme rather than histents. HistEnt structs are created as needed. The old VCD loader is still used for --interactive, or if --legacy is used at the command line. Added dynamic zlib compression support to VCD recoder and vlist_compression_depth rc variable. -1 disables, 0-9 mirror zlib compression depths. 3.0.11 12sep06 Updated documentation to include section on VCD recoding strategy and LXT (version 1) file format. Removed unnecessary mallocs and functions in vcd_recoder.c. Cleanup of all warnings with gcc -pedantic in gcc3 excluding long long integer constant and string constant length warnings. Disabled splash screen when loading VCD from stdin. Cygwin compile fixes (3.0.10 broke the compile). 3.0.12 19sep06 Updated production rule in verilog.g to handle compiling parameterized components in opensparc without dying. Integrated a lot of compatibility fixes from Peter O'Gorman. Actually use config.h for better compatibility now. Check for endianness in vzt read/write if XDRs not available rather than assuming windows will byte reverse. Fixed single time read in vzt_read.c as it wasn't working properly in rtlbrowse. Added -f (insert args from file) option to vertex. 3.0.13 06oct06 Updated odt file documentation to make chapter-like page breaks. Updated lxt2vcd and vzt2vcd to emit proper VCD headers for other tools that expect them. Added attempt_vecmatch() in bitvec.c to match vectors based on numbers inside nets in order to match on vectors inside of flattened netlist latches (e.g., top.xyz[0:7]_Z). Fixed regex compare on illegal regexs that caused viewer crash (e.g., when comparing on a single left bracket or any other illegal regex). 3.0.14 17oct06 Fixed vztminer and lxt2miner so not specifying -n actually works. Updated manpages and UM for those executables to fix description errors. Now can snap cursor to named markers--this was overlooked. Changed recoder scheme for single bits slightly in order to pack 2 more bits in for 0/1 transitions. This implies that 0..31 timesteps can be encoded in 1 byte for the common case. 3.0.15 27oct06 Added getopt_long from GNU project. Fixed broken compile under GTK1 for rtlbrowse makefile. Now can recoalesce bitblasted vectors in rtlbrowse. Updated finalize in vcd recoder to add fake 'x' vch for non-aliased facilities. Normally all facs are initialized, but noticed that libvcddump doesn't do this. 3.0.16 13nov06 Patches to remove some compile warnings under Cygwin. Changed maxdata linker flag for AIX to allow 3.25GB of data segment area for AIX5.3. Changed unsigned integer splay comparisons in vzt_write.c for a slight speedup. Updated configure patch scripts to patch over a "LEX = :" glitch for AIX5.3 and also to use gcc in AIX for the pccts compile because of xlc incompatibilities with it. Fixed bug in draw_hptr_trace_vector_analog() that would cause crashes on pure real vectors when zoomed out fully. Added dynamic tooltips on current marker values for both the left and middle mouse buttons (not tested for Win32 yet so disabled there). Added preliminary support for changing menu accelerators through the rc file with an "accel" statement. 3.0.17 27nov06 Fix in vcd recoder for SystemC which doesn't emit time zero in the initial dumpvars. (would be needed anyway for dumpers that for some reason don't as the 1st value change collapses into the second) 3.0.18 28nov06 Fix in vcd saver for when units are in seconds: keeps timescale of "ss" being used instead of just "s". Locale problem in printing of floating point numbers fixed by setting up a local fixer routine in config.h for availability across all executables. Fix in all vcd loaders to handle "port" (along with other keywords) that appear in non-keyword parts of the $VAR declaration sequence. Fixed long standing LXT bug with integer datatype on trivial LXT files. (Overflow in lt_buf decoder buffer.) 3.0.19 21dec06 More locale fixing with LC_ALL. Added user patches from NIIBE Yutaka to remove requirement for the GTK_ENABLE_BROKEN flag in GTK2 compilation. 3.0.20 21jan07 Fixed string/real handling in VCD recoder as it did not properly add the right-hand side endcaps which would crash pattern search. Made vcd recoder more robust to be able to handle 'b' value changes for string data as well as wires with 's' type data (for FlashSim). Updated strace.c to allow forward/backward on strings and reals. 3.0.21 02feb07 Added support for in/out/inout evcd ports generated by dumpports in ModelSim. Fixed problem with hierarchy being out of order as treegraft needed to be followed by treesort. This mostly impacted recursive hierarchy imports by only allowing two signals to import rather than all of them. Also there was an inconsistency with the signal ordering with VCD vs the database formats because of this. 3.0.22 19feb07 Bumped up hash size from 65519 to 500009 entries for VCD parsers. Bumped up max VCDID fastindex size to 8M entries. Now use gperf for verilog datatypes for some speedup in gtkwave vcd loaders. create_sorted_table() changed to deallocate long names in vcd converters as the names are no longer needed once the writer has them. Fixed GTK1 makefile in src/ as twinwave had pkg-config for GTK2. Stray getopt.h include in v2l_analyzer_lxt2.h needed to be #ifdef'ed with HAVE_GETOPT_H for Solaris. XDR library -lnsl explicitly listed for Solaris. PATH_MAX set if not defined in verilog.g for Vertex. Regenerated configure for setenv()/unsetenv() presence which impacts Solaris (use putenv() instead). Regenerated configure to handle auto detect of -lnsl, -lrpc, and -lpthread. Added -c to file install in top-level makefile (Solaris). Use _LARGEFILE_SOURCE value from configure with linux rather than assuming it is always 1 with linux. Fix to preproc.c in vertex as it was attempting to parse directories. This works ok under linux with EOF but causes problems under AIX. 3.0.23 19mar07 Added corresponding va_end() for all va_start(). Added optional frequency display between markers, also added rc variable of use_frequency_display and menu options to support this. Placed mainbox for marker text label widgets inside an event box as this seems to fix the centering problems with GTK2. 3.0.24 02apr07 Fixed makefile generation so 32bit AIX will use >256MB in src/helpers. Updated vzt2vcd and lxt2vcd so it handles the zero index of bitblasted vectors (from ncsim). Updated vzt reader so it can re-coalesce bitblasted vectors provided the dumped bits are adjacent/in order. Minor bugfixes to vztminer and lxt2miner with respect to dumpon/dumpoff (don't emit $dumpon/$dumpoff strings as that code was leftover from the vzt2vcd). Updated manpages for vzt2vcd, lxt2vcd, and vztminer. On concatenated vector loads ('#'/':' in savefile), attempts to do a load of a monolithic vector on fail. This is somewhat related to the re-coalesce vectors feature above. Implemented reverse of this for monolithic vectors into the '#' bitstrand variants. 3.0.25 10apr07 System Verilog with MTI fix for VCD declarations of form $var reg 64 >w #implicit-var###VarElem:ram_di[0.0] [63:0] $end ...debussy implicitly escapes the varname during loading so gtkwave does it too now for all VCD loaders. More System Verilog with MTI fixes: VCD (parameter) vars of length zero are representative of reals with MTI: they don't use real_parameter like Riviera does. Updated vcd_saver.c to handle saving these implicit-var facilities correctly. Likewise updated lxt-write.c, lxt2_write.c, and vzt_write.c to handle correct bracket stripping for the [0.0] semantics. Modified dynamic resize routine so large escaped names don't cause issues with the signal window crowding out the wave window. 3.0.26 18apr07 Fixed various compiler warnings discovered from looking at Fedora Core compile logs and later compiling against Centos/RHEL5. Commented out GTK_CAN_FOCUS for scollbars in wavewindow as it was causing rendering problems with newer versions of GTK. 3.0.27 27apr07 Renamed vertex to vermin to avoid name clashes with existing 3D "vertex" package on debian systems. Reverted back to using Open Office 2 Beta rather than Open Office 2 as it was causing .odt docs corruption. 3.0.28 30apr07 Changed anonymous union in struct Node as it is a gcc extension. Fixed some vcd parser memory leaks found by Valgrind. Moved errno check in vcd parser as it seems that the GTK event loop called in splash_sync() calls it on gnome 2.18 for some reason (reported by Gentoo gtkwave package maintainer). 3.0.29 27may07 Added viewer support for arrays (currently AE2 only). Integrated (standard) ./configure scheme thanks to Dan McMahill Added strdup_2 to debug.c for memory tracking (found stray strdup() instances in ghw.c). 3.0.30 24jul07 Removed variable declaration in menu.h that tcc complained about (should have been an extern). Updated configure.ac to use AC_SYS_LARGEFILE for > 2GB file compatibility with older linux systems. (This was accidentally left out in 3.0.29.) Added ignore_savefile_pos and ignore_savefile_size rc variables. (Requested by Edward Ash.) Added ability to specify trace background color in filter processes by prefixing the return string with ?color? as in "?CadetBlue?xor r0,r0,r0". The colors used must already be specified in the rgb.c file. Removed check for c++ compiler presence in the autoconf. Fixed LIBBZ_CFLAGS in .am files that really should be LIBBZ2_CFLAGS. 3.1.0 25aug07 Moved to a global context variable management scheme for future code expansion. Reload waveform function added which uses context management. Update user manual to include references to reload capability. 3.1.1 20sep07 Fixed crash in hierarchy search reload. (Wrong pointer type introduced from code cleanup.) Adding start of tabbed browsing support. Put in window select focus switching between tabs (e.g., on search windows). Added locking in main iteration loop to detect unexpected context switches and fix/report them (wrong operation if it occurs). 3.1.2 24dec07 Compiler warning cleanups from Sun compile logs. Added named parameter support to vermin parser. Added check for gperf back into configure.ac. Added vlist_spill rc variable to control new feature of spilling vlists to a tempfile on disk. Fixed vcd loader status bar on files > 2GB. Removed non-growable vlists and also finalize aliases in order to be compatible with spill. Changed vlist allocation scheme to allocate only half as much per-block, then the rest when the half-way point is reached. This reduces memory wastage to an average of 12.5% rather than 25% on uncompressed blocks. Added code to pre-process data in vlists through an LZ-based compressor. The can cut down on memory usage ever further. This can be enabled with the vlist_prepack rc variable. Added --giga option to turn on vlist_spill and vlist_prepack from the command line. 3.1.3 13jan08 Added dynamic keypress detection in the Pattern Search Requester so users do not need to press enter for search strings. Likewise, added the rc variable sst_dynamic_filter to enable the same type behavior for the signal name filter in the GTK2 signal search tree. Fixed bug where filtered signal names did not reappear on reload. Updated user manual as necessary. Added "edge" left/right buttons for handy single signal edge detection due to user requests. Fixed long-standing backward edge seek bug in pattern search. (It would miss the preceeding edge if the marker isn't already on one.) Added use_standard_clicking rc variable in order to enable "normal GTK" shift/click semantics in the signal window. Collapse/uncollapse is now shift-ctrl when use_standard_clicking is active. Added prelim dnd for use_standard_clicking mode. use_standard_clicking disabled in GTK-1.2 as there are dnd issues. Recalculate signal width on reload as sometimes it was missed. Added input focus capability to signalwindow. Moving menu options to standard GTK accelerator keys. Added Ctrl-A/Shift-Ctrl-A handler to the treeview so it acts like the signal window. Added left/right scrolling hotkeys in signal window. Added use_toolbutton_interface environment variable which enables new user interface at the top of screen. More modifications to handle globals swapping in multi-tab mode. Update configure.ac to handle library order problem with cygwin in rtlbrowse. Added scrollwheel support in signal window when focused and standard clicking is active. Added "Use Color" and "Use Black and White" (for screendumps) View menu options from user requests. Fixed help window so it is not editable. Also do an implicit click-to-front for window managers that automatically move windows to front when their insides (not decorations) are clicked on. 3.1.4 30jan08 Added fix for how dnd gets killed after reload on new versions of GTK (e.g., 2.10.14). Added dirty_kick in MaxSignalLength that forces usize if width is dirty. For interpolated analog traces, fixed interpolation at end of line so it doesn't cause endpoint to go offscreen. Experimenting with track-and-hold fixing. Integrated spice3f5 poly interpolation routines, but are currently unused. Now allow both interpolated+step simultaneously for analog. Integrating signal window popup menu code. Fixed rendering bugs in coalesced vectors displayed as analog. Added resizing options that are windowed to either the screen or across all trace data. Added enter=OK as a default file chooser response. Added DND and standard clicking to GTK1 compiles. 3.1.5 14feb08 Fixed bug in rtlbrowse that causes lxt2 dumps not to be value annotated. (signal match worked for bitblasted nets only) Updated rtlbrowse so that it can update dynamically with the marker position. Added anti-aliased font rendering code. Added use_pango_fonts rc variable. Updated edge buttons so they can handle multiply selected signals. Logfile(s) now update on waveform reload. MinGW compile fixes. MinGW crash on reload fixed. 3.1.6 27feb08 Added additional #ifdefs that disable Pango on GTK versions less than 2.8.0. Added support for optional sideband .aetinfo files when using .aet files. Update interface to rtlbrowse to translate time value back to original aet ones. Improved x vs X (z vs Z, etc) handling at signal boundaries. Changed color scheme where red marks X data similar to how it marks U for VHDL. Fixed longstanding bug in linear lxts that only occurs if integers are present in the lxt dump (length is failed to be promoted to 32 during re-chaining). Fixed shift-clicking when use_standard_clicking is active such that shift-clicks past the last trace when the signalwindow isn't fully populated count as a shift-click on the last trace. 3.1.7 23mar08 Updated file.c to remove potential file chooser crash in the case of a missing save file at the command line followed by "write save file as". Fixed problem in black and white mode where process filter could possible cause colors to be displayed when ?color? value escaping is used. Fixed problem where primary marker was listed as 0 sec on init instead of -- if not set initially from a save file. 3.1.8 06apr08 Added Range Fill option in the data format menu so that vectors like address[31:2] will display as a human expects to read them. Fill in can be zeros or ones. Added trace flags display at right hand side of signal name in mouseover popup window. Added more visual feedback in signal D&D window in order for users to determine more easily where a drop will insert. Reduced visual noise on D&D by not updating screen after a cut if a paste also occurs. Fixed problem where primary marker was filtered through time_trunc() on initialization. Removed other time_trunc() calls causing similar problems as necessary. 3.1.9 20apr08 Added missing init_filetrans_data() to reload function. Updated manfiles to get them in line with Debian lintian. 3.1.10 14may08 Added missing adjustment of t->shift in mouseover.c in order to allow the mouseover on shifted traces to display properly. Fixed problem with edgebutton going back two edges on a combined vector. (Cut and paste typo from strace.c.) Added support for DND from regex search window to the signal/waveareas. 3.1.11 18jun08 Compile fix for tla2vcd in MinGW. Added #ifdef for HAVE_BZERO for MinGW. Compiler warning fixes. Added time = -1 endcaps in LXT2+VZT+AET loaders. 3.1.12 14jul08 Compiler warning fixes. Fixed crash in vcd recoder for b vs 01xz mixups in malformed VCD files. Fixed abort on VCD load for malformed size vs [msi:lsi] syntax. NC does this on arrays of wires. Fix to vlist reader with --giga enabled in order to handle reads which go off the end of the file. (Possible due to how only the amount used in a block is actually written to the file in order to save space, so the vlist blocks can be overlapping yet usable.) 3.1.13 20aug08 Adding compressed hierarchy handling in order to reduce memory usage on large bitblasted models. This is currently only enabled for the VCD recoder, LXT, LXT2, and VZT loaders. Fixed some buffer overflows in vectorization code (and when vectorization is enabled) in vzt_read.c. Modification to autoconf handling for rpc.h. Fix for DnD to directly under an expanded comment trace. Make step_increment equal to 1/10 page_increment for the horizontal scroller in the wavewindow. Added sticky click semantics for clicks in signal window. To do this in the treesearch_gtk2 file will require some additional future work with view_selection_func() and/or signal handling and trapping. 3.2.0 16feb09 Fix for strings ('s' type) in recoder. Added timestart command to savefiles which indicates what the leftmost position should be on reload. Added support for as/zs small timescales as well as 0.1/0.01/0.001 multipliers which simvision can emit. Adding signal name DnD support from external apps. Force open tree nodes on initial .sav file read. Yet more new warning (-Wall) cleanups. Fixed ExtractNodeSingleBit for vectors which do not have a zero in either the msb or lsb (e.g., [1:9]). Added support for dragging files into the viewer (i.e., dumpfile, savefile, stems file) Added DnD of signal names from RTLBrowse source code windows directly into gtkwave. GTK1 compiler compatibility fixes. Improved search performance from rtlbrowse initiated DnD searches. Fixed wave_locale.h for MinGW. Fixed longstanding bug with blackout regions rendering. Integrating embedded Tcl interpreter. Fixed bug with unformat time when base time is in seconds. Added tcl example in examples/ directory. Updated -f argument file handling in vermin. Updated tcl_helper code so that signalwindow drags of bit- blasted vectors are properly re-coalesced for client code for the drag. Updated task definition in vermin so that identifiers with dots in them can be used as task enable names. Fixed problem in vermin preprocessor where defines in 0x0d0a terminated lines would insert the carriage return into the sourcecode. Added synthesis pragmas which mirror synopsys ones to vermin. Used gtk_window_set_default_size instead of gtk_widget_set_usize in rtlbrowse in order to allow window to shrink appropriately. Made size_tag values smaller in logfile.c in gtkwave/rtlbrowse. Allow dragging from rtlbrowse window without needing to high- light signals first. This allows single signal drags. GCC-4.1.3 with -O3 flag fix for x86_64 on xchgb instruction assembler intrinsic. Use gtk_window_set_transient_for() on simplereq windows. Starting to update environment for rtlbrowse into a single integrated window. Adjust xthickness/ythickness in toolbars to make images take up less space. Preliminary support for text searching in rtlbrowse. Added rtlbrowse case (in)sensitive searching both directions. Fix re-entrancy on file names for file.c file requester in gtkwave. Add --with-tcl to configure script via tcl.m4 macro. Cut down on visual noise during reload. Added fix using TCL_INCLUDE_SPEC to get to compile under Ubuntu. Fixed lost num_cpus variable that wasn't passing through reload. Added Cut/Copy/Paste functionality that allows multiple pastes rather than destroying the cut buffer on paste. Cut buffer contents will survive after a reload operation. Removed translate filter process from mingw32 menu as it is disabled in the compile by #ifdef'ing in empty functions. Updated shmidcat so it restarts properly when VCD is being looked at while sim is running and gtkwave gets ahead of the generated VCD. Fix crash on invalid node for force tree open during load. Added Partial VCD Dynamic Zoom and related zoom_dynamic rc variables. Added prelim support for export to TimingAnalyzer file format. Added mouseover support in signal window which shows full facility name. Added dynamic update on strings for marker values which keeps user from having to press enter explicitly for each one. Now allow support for named markers using optional user names rather than just 'A'-'Z' labels. Added countdown timer to remove dnd cursor if it is onscreen longer than 5 seconds. Added support for setting optional user names for named markers via Tcl scripts. Added prelim auto-scrolling code for trace adds/copies. Added support for Tcl repscripts. Removed warnings found when compiling with -Wshadow. Fix for stack crash in treesort() on dumpfiles with an extremely large number of signals (e.g., 5 million). Compile fixes for rtlbrowse in older versions of GTK2. Remove stray tempfiles created by --giga writer under MinGW. Removed stray file descriptor from lxt on reload. Fixed repeat error problem in lxt.c introduced by -Wshadow fix. Added prelim version of scale_to_time_dimension rc variable and appropriate menu options. Beginning to update user manual to reflect new 3.2 features. Added Partial VCD Dynamic Zoom To End and related zoom_dynamic_end rc variables. More mingw compile fixes: the whole tarball compiles now. Use old file chooser (for now) in mingw as the new one seems not to be re-sizeable. Added "copy traces" to toolbar in gtkwave as copy function now exists. Added check for "server" in env var CYGWIN before printing warning about using shared memory. Added vpi client lxt/lxt2/vzt writers in contrib/vpi, but these currently are not built. Compatibility fix for gcc 3.x. Added extload capability which grabs data via popen(). This allows adding loaders for unsupported formats via data mining. Added Tcl command setBaselineMarker. Extload hardening on reload. Added extload filetype to DnD. Fixed window close when tabs active so it would update the titlebar, times, etc., to the current tab. 3.2.1 09apr09 Add more information for users if gtk can't initialize on MacOS. Added possibility for vlist.c to write out the spill file in a machine independent fashion. Added --fastload option to gtkwave. Fixed autoconf so Tcl works in cygwin. Updated cygwin "Bad system call" warning text to include more possible fixes. Fixed warning message in strace.c ("Named Marker xx not in use") which spanned multiple lines because of multiple status_text() calls. Fixed STATUS_ACCESS_VIOLATION in cygwin for both vztminer and lxt2miner and added the --comprehensive option in each. Also added behavior that no search string specified matches all value changes across all nets. Updated documentation description for collapsible groups to indicate that shift-control is required, not control (as previously). Adjusted brightnesses for mdgray and dkgray so collapsed traces are visible on some monitors. Fixed dkgray->mdgray for "Time" background as brightnesses have changes. Made AN_NORMAL/AN_REVERSE const declarations also static in order to avoid unnecessary stack pushing. Fixing reloader crashes in vcd_build_symbols(). Adding experimental support for bringing up gtkwave without a trace like "every other" GUI app. This is currently disabled pending more testing. Sort filename lists from DnD in order to allow both a dumpfile and a savefile to be dragged into the viewer and processed in a logical order (i.e., the dumpfile before the save file.) Added disable_empty_gui rc file variable. Working with ergonomic features of empty gui handling. Fixed & to && in if() comparison in lxt_write.c Added support for PDF output via ps2pdf. Added support in VZT file format for LZMA compression. Fixed calling to install_keypress_handler() as it only needs to be done once. Add menu blackouts on empty gui. 3.2.2 02aug09 Changed some instances of exit() in main.c to vcd_exit() in order to keep failed loads in tabs from killing the whole session. Update VCD ID generation in VCD writers to use XL-style identifier sequencing. Fix MinGW printf format strings for helper apps. Ported shmidcat and partial VCD loader function to MinGW. Added twinwave support in MinGW. This currently has some problems with D&D as well as window decorations being present due to various system incompatibilities. Added rtlbrowse support in MinGW. Fixed rtlbrowse on reload, now allows to respawn. Fixed rtlbrowse in cygwin as kill() does not work the same as posix kill. Added clearing of t->minmax_valid in dataformat() in case sign bit changes for analog vectors when TR_ANALOG_FULLSCALE is in use. This allows dynamically changing from/to "signed decimal" and other modes and removes any y-scale artifacts from having stale minmax data. For rtlbrowse kill, step through all contexts in atexit() handler. More exit fixes for rtlbrowse killing. Warning fixes for printf format strings in lxt2/vzt/ghw. Updated VCD parser to handle names like "a[1] [3:0]". Added VCDNAM_ESCAPE cases in lxt, lxt2, and vzt loaders. Updated VCD writers so they put spaces before bracketed signal ranges. Added extra message for help requester if file type is MISSING_FILE in order to direct users what to do. Fixed segfault caused by improper search/replace and malloc length in renderopt.c for ps2pdf. Beginning to integrate FST file format support. Optimize rtlbrowse somewhat by not redoing fac finding every time the cursor moves. Beginning to integrate FST into rtlbrowse. Added vcd2fst and fst2vcd helper utils. Added option to FST to allow monolithic post-compress for much smaller file sizes. Documentation updates. Added capability in GHW reader for negative indices on bitstrands. Added variable type support to VCD + impulse arrows for depicting events on VCD (other formats will migrate in the future). Added vartype info (if avail in trace, now FST+VCD). Added module type info (if avail, now FST+VCD+GHW only) by decorating the hierarchy tree info appropriately. Changed build_tree_from_name() to perform move to front for hier names in order to work better with decorated trees. Add EVCD support to vcd2fst, fst2vcd, and FST loader. Fix longstanding bug in vcd parsers where evcd did not parse correctly if standard VCD IDs were used. Fixed "f" value in EVCD files so it converts to z, not x. Convert capitalization usage on hex values to match that of verilog. (i.e., x = all bits are x, X means some but not all bits are x.) Change magic number 3 to AN_1 in vtype2(). This was skipped by an earlier sourcecode conversion. Change file requester handling so old names are copied to the new tab and the directory used on an unspecified entry is derived from the loaded file name directory. Added type information to mouseover in signal window. Added --enable-fatlines ./configure flag which enables gtkwave to render lines in "Fisher Price" (aka Simvision) double- width style. Added evcd2vcd to the distribution. 3.2.3 03sep09 Set iconify icon for gtkwave with gtk_window_set_icon(). Ensure -d flag survives across reloads/new tab. Added LIBZ_CFLAGS to helpers/fst AM_CFLAGS for MinGW. Added gtk_window_set_resizable for pWindowMain in file.c as some distros need this. Changed some strace.c globals to "signed char" to remove warnings under AIX compiles. AIX ./configure fixes. Added malform_eof_fix() to recoder and regular VCD loader. Fix to attempt_vecmatch_2 when no suffix encountered. 3.3.0 25dec09 Modified unformat_time() so it can also handle floating- point exponential format. Integration of a large amount of group handling sourcecode from Don Baltus / Bluespec, Inc. Re-integrated original Simpod repscript handling. Reworked force open tree node and moved to tcl_support_commands.c. Renamed liblzma to libgwlzma for now: liblzma is present on some systems and causing conflicts. Fix for tk library issue on Cygwin. (Use TK_BUILD_LIB_SPEC if TK_LIB_SPEC is a null string.) Added --enable-stubify ./configure option to make Tcl/Tk library usage be completely dynamic. Generate anonymous name for groups to prevent crashes when group name is unspecified. Added EnsureGroupsMatch() on various parsewavline() code sections to enforce legitimate group formations. Applied gtk+-1.2 compile fixes as compile was getting out of sync as it hadn't been tested recently. Allow more events in GuiDoEvent() to prevent hangs. Made --wish and --vcd mutually exclusive as they both require input on stdin. Enabled gc caching on linux to help with rendering extremely dense traces. Removed memcpy() ops in baseconvert.c and changed them into pointer copies as the copied string is never modified. Resequenced enum WV_MenuItems in menu.h which lost ordering from Bluespec menu item adds. Added gray code conversion ops. Added FST detection to gtkwave::getDumpType. Added missing context change variables in context_swapper(). Added gtkwave::setTabActive and gtkwave::getNumTabs MinGW tcl compile fixes. Cygwin fix for optimized vcd -o option. Disabled reload on optimized vcd from stdin. Removed --wish when building under MinGW and when specifying --enable-stubify for configure (for now, the fail is with TkMainEx). Removed tempfile generation for Tcl script execution; now use alloca based scheme. Also removed old-style "script" file support as it is obsolete: all scripts are Tcl scripts now. Integrated user-provided rework of rgb.c. Removed local lzma library and now use system xz if available. Old VZT files using -z 2 are no longer readable but can be converted using vzt2vcd from an old version of gtkwave. Various warnings fixes. 3.3.1 03jan10 Fixed Makefile.am files to allow builds into different directories than the current one. GHW crash fixes. In fstapi.c now use tmpfile() to generate tempfiles in order to speed up operation on networked filesystems. Fixed problem in fstapi.c with conflict between off_t and unsigned longs on some 32-bit systems which cause a "tsec uncompress" failure on reads. Fixed missing dependencies in various Makefile.am files. 3.3.2 05jan10 Emergency fix for ghw.c as it was missing a close comment causing problems with iterative generate. 3.3.3 18feb10 Fix for Pattern Search where end marker time was not used for dropping down a marker: for clock counts this would mean that the clock count was off by one. Added locking/unlocking of named markers against the primary marker with 1/2/0 keys. Fixed broken "make distclean". Added patch for move to time against named markers. Added a secondary pattern search function. Added sanity checking on WAVE_NUM_STRACE_WINDOWS. Added fix for broken bsearch_facs() when characters like "$" are in a facname and it matches a hierarchy boundary. Removed tla2vcd from distribution because of incompatibility with some TLA700 traces. Removed obsolete helper executables. Activated preliminary line clipping for analog rendering as line clipping in GTK does not always work for extreme value ranges. Hang in gtkwave on backtracking time fix (usually caused by truncated files). Replaced Tcl_GetStringResult() in tcl_np.c with Tcl_GetVar() on Tk init fail. Added AC_CHECK_LIB([dl], [dlopen]) (Fedora requirement). Added --disable-xz (requested by Gentoo). Added extern "C" { } bookends to headers for C++. 3.3.4 07mar10 Change slope calculation "m" in clipping.c to all doubles in order to avoid integer overflow errors. Change main resync loop name from gtkwave_gtk_main_iteration to gtkwave_main_iteration. (Start of separation of GUI code from functional code.) More fixes to analog clipping: yt0/yt1 were reversed, also added analog_redraw_skip_count env var. Added support for "realtime" VCD variable. GTK1 compile compatibility fixes for pattern trace. Removed "Reduce Single Bit Vectors" menu option. Added defensive re-link of t_prev on prepend and cut ops. Fix for analog stretch traces when analog trace was expanded and then collapsed. Fix to LZMA_write_compress to detect xz compression failures. 3.3.5 19mar10 Fix for usage of deallocated next pointer in the force_open_tree_nodes loop (spotted using an alternate allocator). Added optional preliminary Judy array support. Fixed compiler warnings. Fixed toggle max hier so it toggles back and forth between the most previously set hierarchy depth. Added ".lxt2" to list of suffixes allowed by gtkwave. Remove name field from struct fac. Added missing hierarchy boundary sort for FST in order to allow compatibility with compressed names (-C flag). Removed resolve_lxt_alias_to field from struct fac. Removed lxt-only lastchange field from struct fac. Removed unused h field in struct symbol. Removed nextinaet field if unused, recoded to symchain when used. Fixed && used in logical operation for generating ExtNode. Removed ExtNode, made inline with Node. Deallocate symbol hash table after no longer needed. Only allocate hash when necessary. Added marker vs maxtime marker conflict check in kick_partial_vcd() to ensure signal window values reflect data value rather than x when maxtime scrolls over the marker time and makes the marker visible. More Judy array adds for VCD. Removed sym->selected member and replaced with 1-bit Judy array if enabled. 3.3.6 01may10 Added RealToBits menu options for displaying real numbers as binary values. Added missing break statements to terminate cases in bits2vector(). Fixed cut and paste error on FILE_FILTER_MAX versus PROC_FILTER_MAX. Reduced FILE_FILTER_MAX from 1024 down to 128. Added preliminary transaction filter support. Added transaction parser in examples/ directory. Updated time warp handling. Updated print routine to use populateBuffer(). Added raise to front when filename selected in filter dialogs as this helps with some window managers. Remove color for translated/transaction traces in black and white mode. Copy gc_grid_wavewindow_c_1 from gccache on reload as this was accidentally overwritten with gc_grid2_wavewindow_c_1 without adding back gc_grid_wavewindow_c_1. Added fstWriterSetTimescaleFromString() to fstapi.c which allows usage of strings such as "1ns" for the timescale. Incorporated FST writer optimizations. Incorporated some fixes suggested by cppcheck. 3.3.7 03jun10 Made enable_fast_exit rc variable default to yes. Compiler warning fix in lxt_write.c/fstapi.c for Open Solaris. Added fstWriterGetDumpSizeLimitReached() to fstapi.c. Fixes to Tcl string handling. Applied user-supplied fixes for null pointer crashes in rtlbrowse. Moved gtk_grab_add() after gtk_widget_show() in order to work with newer versions of GTK. Use PRId64/PRId32 in lxt2_read.h and vzt_read.h to remove printf format warnings. Fixed "format not a string literal and no format arguments" warnings. Added missing HAVE_INTTYPES_H in compile note for transaction.c. Disable autocoalesce if Icarus Verilog is detected. Added units forward scan in logfile.c. 3.3.8 25jun10 Added failure check on tempfile create in fstReaderInit(). Added strace_repeat_count and appropriate menu option. Removed the "/File/Quit/Don't Quit" menu item if fast exit is enabled. Added dnd of signals from gtkwave into rtlbrowse: now the appropriate verilog code sections automatically are imported. More warnings cleanups. 3.3.9 06jul10 Changed accelerator for Quit to conform to Gnome standard menus guidelines. Update local libz and libbz2 to current versions. Moved version string out to version.h to keep from having the CVS data updating in currenttime.h. Fix crash that can occur in RemoveTrace. Header file cleanups. Fixed actual result of crash in RemoveTrace: defensive re-linking in PasteBuffer didn't always relink the back pointers properly. 3.3.10 16jul10 Fix in vermin Makefile.am for parallel build failures involving shred.c depending on tokens.h. Added missing dependencies in various Makefile.am files. Fix for free to non-malloc'd address problem in main.c and menu.c due to context changing in Tcl scripts when gtkwave::/File/Open_New_Tab is invoked. Updated vcd2fst so it is compatible with VerilatedVcd writer. Read hierarchy reconstruction hardening for fstapi.c. Check return code for hierarchy generation in fst2vcd.c. Updated example to reflect Quit name change. Updated repscript_timer so it prints stack trace. Use setvbuf (as with MinGW) for fstapi.c to fix for OS X. 3.3.11 17aug10 Added tcl functions gtkwave::installFileFilter, gtkwave::installProcFilter, gtkwave::installTransFilter, gtkwave::setCurrentTranslateFile, gtkwave::setCurrentTranslateProc, gtkwave::setCurrentTranslateTransProc, and gtkwave::setCurrentTranslateEnums to give Tcl access to these features. Add write combining in fstWriterEmitValueChange to speed up execution on Cygwin. Nested `ifdef fix for Vermin. Fix for free to non-malloc'd address problem in repscripts due to context changing in Tcl scripts when reload occurs. Added gtkwavetcl_setvar() for starting to build a framework to support Tcl variable change callbacks. This can be used to closely monitor how a user manipulates the gtkwave GUI. Fix for 0 millisecond Tcl timer causing 100% CPU usage. Added CVS versus ModelSim compatibility fixes for Bluespec savefiles. Fix for atoi_64 when value is zero followed by a legitimate nonzero value after some garbage non-numerics. 3.3.12 29aug10 Compile fix for --disable-tcl or systems which do not have Tcl installed. Added support for process filters in MinGW. Added support for transaction filters in MinGW. Added support for Open New Window to MinGW. 3.3.13 23sep10 Reduce memory footprint of VectorEnt on 32-bit architecture by struct reordering. Added warnings for options that are non-functional for some configurations. (They are not disabled in order to allow compatibility across systems.) Fixed dangling fnam malloc in fst.c. Reduced temporary memory usage during file init for lxt2, vzt, and fst files by using F_NAME_MODULUS wrap on f_name. Sparse vs non-sparse array crash fix for ae2 loader. Suppress decorated treebuild for fst when compressed facs are being used: this was causing duplicate tree entries. Fixed renderhash problems in print.c caused by disparity in eqns used in wavewindow vs print.c (need realx, not just x). Upgrade local libbz2 to 1.0.6 for uncompress security fix. Added experimental dynamic SST building code which speeds up initialization time for trees with extremely large number of scopes. 3.3.14 26oct10 Fixed force_open_tree_node() for dynamic SST trees when unbuilt nodes are encountered during traversal. Allow VCD files where start = end time. Compiler warning fixes. Added preliminary RPC mechanism to gtkwave. Added --disable-inline-asm ./configure flag. Added initial_signal_window_width rc var. 3.3.15 10nov10 Added check in fstapi.c for corner case where fstWriterEmitSectionHeader could make a file unusable if.hier is not present. Added more checks in fstapi reader to prevent crashes on malformed files. Add config.h #include to the fstapi.c code. Add detection in vcd2fst for Verilog XL-style VCD identifiers to speed up reading VCD files from those simulators. Speedup in fst writer by ensuring checkpoint is not written to for every fstWriterEmitValueChange call. The --optimize flag now uses fst instead of lxt2 as its default file format use vcd2lxt2 directly if old behavior (e.g., converting flat signal names to hierarchies) is desired. 3.3.16 24nov10 Remove unused JError variables and replace with PJE0 macro. Added experimental dynamic alias detection in fst writer if Judy arrays are detected. (Judy not required for reading.) Added Jenkins hash routine to enable dynamic alias detection for when Judy not available. 3.3.17 28nov10 Added sanity check in dynamic alias reconstruct routine in FST reader and also fixed bug where alias reconstruction in current blocks doesn't overwrite previous, old block data. 3.3.18 24dec10 Added extra allocation in fstWriterEmitValueChange in case users modify the FST_BREAK_ADD_SIZE to a very small value. Fixed in lxt.c that --disable-inline-asm did not propagate into its compile. Fixed x86_64 assembler =q vs =Q problem in lxt.c. Preliminary support for variable length records in FST files. Added fstUtilityBinToEsc and fstUtilityEscToBin for conversion of binary data to C-style strings. Now allow escaped strings in VCD files to encode a richer set of data for non-standard "s" VCD records. To comply with fst2vcd, vcd readers now handle "string" variable type keyword. Scaled back multipler from 95 to 94 for VCD ID processing as !..~ is a distance of 94. Add detection for Verilog XL-style VCD identifiers in all vcd loaders in gtkwave in order to aid in indexing. Added --enable-struct-pack configure flag. More warnings fixes. Fix mif_draw_string so it does not emit escaped character codes. Added gtkwave_server to distro but it is not currently in automake as it is not ready for use. 3.3.19 03feb11 Added more NULL pointer checking to vcd2fst to prevent crashes on malformed files. Rewrote support for compressed signal handling. Currently this is for FST only. Modified shmidcat to exit on EOF. Added sys_fst.c VPI source for NC Verilog and XL. Added component typename dumping into sys_fst.c so that NC can dump component names. Added component type names in gtk2 tree. Currently the FST loader is the only one that will populate this field. For 64-bit architectures, doubles are stored in HistEnt fields directly to conserve on memory usage. Fixed top/bottom pane resizing bug after reload in SST window. Fixed crashes in hierarchy search widget for GHW where standard, textio, std_logic_1164, etc. were selectable. Fixed reload scroll position for bottom TreeView in SST window. 3.3.20 21feb11 Fixed uninitialized mat variable in compress_facility(). Added --slider-zoom option to gtkwave to enable experimental horizontal slider zoom feature (GTK2). Fix vcd2fst so it can handle 0 length VCD event variables in their declarations (MTI). 3.3.21 28apr11 Fixed crash in LXT2 reader on malformed files. Fixed reload crash when -o flag used on non-VCD files. 3.3.22 03jun11 Optimize tree build so it can handle large amounts of component instantiations (netlists) without undue slowdown. Added gcc -Wformat and -Wformat-security related fixes. Update hier_decompress_flagged so it can also decompress into its own static buffer in order to speed up temporary usage cases. Fix FST reader iterator to work better with --begin flag. Fixed missing facname decompression for FST files on single trace import (backup case that should never happen). Added support for user-specified timescale ruler using the ruler_origin and ruler_step rc variables. Added "/View/Define Time Ruler Marks" menu option. Removed indirect file support as is unneeded for 64-bit. Removed obsolete CVS modification log comments. Handle vcd saver case of dot at end of signal name. 3.3.23 01jul11 Fixed ItemFactory callbacks as their argument lists did not reflect the correct callback argument type/order for callback_type=1. This is a longstanding hidden bug. (Would prevent pattern search from working on 64-bit big-endian architectures.) Fixed broken "replace" signal option. 3.3.24 03aug11 Improve the searching for the TCL libraries (when using stubs). Fixed bug where Tcl_GetString was substituted with brace removal preprocessing when unnecessary (would break addSignalsFromList, etc.) 3.3.25 15sep11 Replaced calloc_2 with histent_calloc in loaders where applicable. Updated tcl.m4 so /usr/lib64 can be automatically used. Fixed TR_ANALOG_STEP line clipping problem. Checked in fix for modelsim signal bit nets that are defined as [0] as some tools emit signals without the [0] and it causes savefile compatibility problems. Add visible filter pattern in fileselbox() as well as selectable "*" pattern overrides. Added custom filters to GtkFileChooser dialogue. Fix in lxt2_read.c/.h for negative msb/lsb indices. Fix in vzt_read.c/.h for negative msb/lsb indices. 3.3.26 25sep11 Mac OSX fixes: removed restrictions for twinwave on OSX, OSX compile fixes for Tcl detection, printf warning fixes (xcode gcc uses stricter warnings). More generic warning fixes from recent feature adds. 3.3.27 20oct11 Fixes of suspicious NULL pointer warnings from scan-build. Fixed inline function linker errors when using Clang. Optimization of more [1] cases found in analyzer.h when -DWAVE_USE_STRUCT_PACKING is active. In process_url_list() use g_malloc/g_free as context can or will change when files are loaded. Added fix for DnD crash when Quartz is the GDK back-end on Mac OSX. Enable fix with --enable-quartz in configure. Fixed fstWriterFlushContext() such that invocations outside the fstapi are synced with time changes. Modify main window size for twinwave on Quartz: GtkPlug window does not fit into GtkSocket as with X11. 3.3.28 11nov11 Use larger more readable Apple fonts for Quartz. Added support for colorful traces using the /Edit/Color Format/... menu options. Fixed rendertimes bug where times did not always display when grid is turned off. Added keep_xz_colors gtkwaverc variable. 3.3.29 31dec11 << short descriptions >> Added OSX integration when compiled against gtk-osx. Added mime types and icons for file types and desktop menus. Changed .sav (deprecated but not removed) to .gtkw, with .gtkw itself being able to bring up the original dumpfile. Numerous bug fixes. Preliminary GConf support supporting session ID-based restore. Preliminary GConf support to emulate OSX "open" functionality such that dumpfiles/savefiles can be targeted to an open gtkwave viewer / session ID. << long descriptions >> Fixed size of declaration of render_mutex_renderopt_c_1 as it was one element too short. Added transition code for shifting away from using GtkItemFactoryEntry (also will help with OSX menubar integration which expects menu shells). Added support for native Quartz menu bars. Removed --enable-quartz as it is auto detected now if PKG_CHECK_MODULES(GTK_MAC, gtk-mac-integration) is true and GDK is compiled against Quartz. Fixed pointer crashes on NULL returned on gtk_entry_get_text() on OSX/Quartz. Recommended usage for Quartz is now jhbuild with gtk-mac-integration, not MacPorts. Added mac bundle info in contrib/bundle_for_osx. Added gtkwave_argv0_cached as Open New Window does not work if "gtkwave" is not in path or is something like gtkwave-bin as in an OSX bundle. Detect context swapping in file chooser from DnD to prevent possible crashes. Block DnD while file chooser is active. Migrate OSX to OSX key accelerators. Fix for tcl code opening the root node. Fix time warp cmd->control mapping for OSX. Fix for time warped traces not rendering properly when x-coordinate overdraw is detected. Added WAVE_ALLOW_QUARTZ_FLUSH_WORKAROUND temporarily which needs to be set at compile time which gates redraw. Add GLOBALS->force_hide_show to force redraws in OSX. Added osx_timer() which controls forced redraw. Abort GHW read when nbr_el<0: indicates malformed file from variable/signal construct of form (7 to 0) rather than downto. Crash fix for non-string len zero facilities in vcd2fst. Fixed overflow in draw_hptr_trace_vector_analog(). Added rtlbrowse and vcd2fst binary path finding code to OSX. Changed ps2pdf to pstopdf on Mac. Fixed broken wave_script_args. Reverted to 3.3.26 code in menu_func() as the renderbox requester did not work from TCL anymore. Catch NSApplicationOpenFile so files can be opened from Finder. Added --chdir command line option to support open for OSX so that gtkwave can be run at the command line directly from its installed gtkwave.app. Fix window resizing / repositioning to work in OSX: block once viewer is on second tab, however. Added sst_width, sst_vpaned_height, sst_expanded, and signals_width tags into save file to allow pane size and expander settings to be saved to the save file. Add ignore_savefile_pane_pos .gtkwaverc variable. Added dumpfile tag to save files. OSX Finder uses these to find the original dumpfile. This can be done from the command line also by specifying --save but not specifying a dump file. Added .gtkw as a new save file extension. When either .sav or .gtkw is encountered, the rest of a tab's session adaptively follows in expecting it as the save file suffix. Added [savefile] tag to save files. The intended use is to allow reconstruction of relative paths between dump and save file. Fixed --autosavename to use .gtkw as a suffix rather than the .sav suffix. Reworked wave_info and wave_alert icons. wave_info now matches gtkwave.icns. Renamed .sav examples to .gtkw. Added relative path comparisons for --save so when dumpfiles and savefiles move in tandem, a successful load can be attempted. Added [dumpfile_mtime] and [dumpfile_size] tags to save file. Can now specify just an augmented save file at the command line and gtkwave will load both the dump file and the save file: this makes launching from desktops easier on Linux. Added mime types, desktops, and icons in share/ for gnome. Added percentage progress during load for most file types in window title bar when splash screen not active. Preliminary add of interfacing with GConf via the /com.geda.gtkwave directory for keys in GConf. Memory overrun fix to symbol.c for Bluespec add from 3.3.11. Added --restore command line option to gtkwave. 3.3.30 17jan12 Updated ./configure to add --disable-mime-update flag. Fix --optimize for --restore. Add [optimize_vcd] savefile tag. Disable analog during mutually incompatible mode selection (binary, filters, etc). Added F/P/T flags to mouseover for the filters. Fix problem where ungrab doesn't occur if button pressed + simultaneous reload accelerator key occurs. Fix combine direction in transaction filter to down. Fix vector analog render/print routine to use skipcnt. Fixed transaction filter to cache hptr node if converted (i.e., do not place bitblasted in save file if avoidable). Fixed min/max of cached autoscaling sizing when number of extension traces changes. 3.3.31 30jan12 Added support for native file requesters in OSX Quartz. Added support for native alert dialogs in OSX Quartz. Clang warning fixes. Added missing config.guess and config.sub. Allow drag of .gtkw (when viewer still does not have a file loaded) to load the corresponding dump file. Fix MinGW compiles broken from recent changes. Documentation updates. Fixed broken ifdef in signalwindow.c that degated savefile loading .gtkw dump+save properly if not gconf2 or Mac. 3.3.32 13feb12 Turn off loader messages when Tcl is executing a command. Added gtk_print_unix_dialog support for printing to real printers by using the "UNIX" type. Automatically kill splash screen on reload/new tab. Added transaction_args savefile tag and support for passing args to transaction filters via the args $comment. Added string value of \000 which renders as high-z. Integrated alt_wheel_mode code provided by Tom Browne. Fixes for some rc file variables to keep them from getting clobbered on 2nd tab opening. Warning fixes when compiled on Ubuntu. 3.3.33 27feb12 Scan-build fix in vcd_recoder.c. Added $timezero tag to VCD files which allows offsetting all the values in a trace to provide ability for negative time values. Currently only VCD, LXT, LXT2, VZT, and FST support this. Fix for timescale 10s and 100s. 3.3.34 12mar12 Fix for marker time deltas when $timezero is used. Reduced size of alert requester icons to 64x64 pixels. 3.3.35 04apr12 Polarity fix for vcd_preserve_glitches in rcfile. Default is no/off. Use yes in the rcfile to enable (e.g., for viewing interpolated analog waveforms). Added vcd_preserve_glitches support to FST as --optimize uses FST. Added vcd_preserve_glitches_real (for VCD/FST) rcfile variable that turns off deglitching only for real signals. This removes the need for #define TRACK_AND_HOLD_FIX and prevents the case where interpolation of an analog waveform is deformed as significant data points were removed by the VCD or FST loader. Fix for do_initial_zoom_fit when file requester used. Changed contact address for bug reports. Enable mouseover for MinGW. Added fstWriterSetParallelMode(). 3.3.36 04may12 Fixed destructive string convert in fstUtilityBinToEsc(). Added support for 01xzhuwl- in fst.c callback interface, vcd2fst.c, and lxt.c. Added adaptive buffer resizing in FST writer for Linux and Mac OSX. Fix for realpath() 2nd argument NULL on Leopard. Fix for doubles stored in HistEnt fields in ghw introduced in 3.3.19. 3.3.37 10jun12 Added patch for savefile.c that corrects an issue in which the parser for process filter lines assumed the associated id number was always a single digit. Added patch to bitvec.c catches one more case when locating bitblasted signals in vcd files created by modelsim. Fix that kills stray pipeio_create() processes on pipeio_destroy(). Additions to extload to handle hier types, component types, and signal types. Added support for extload files as input filetype in vcd2fst. Added -o for extload files to convert to FST. 3.3.38 10jul12 Upgrading vermin parser to handle some > 1995 constructs. Propagate -o option into "Open New Window" menu option. Change invert function so it does not incorrectly expand into the whole nybble when it is < 4 bits. That is, inverting the two bit quantity 10 now displays as 0x1, not 0xD. Added fstminer. MinGW warnings fixes. Fixed relative pathnames for gtkw save files in MinGW. Fix fstapi reader so it does not leave stray hier tmpfiles around in MinGW if reader is never closed. Changed twinwave for MinGW so that it does not target two panes in a single window. Something is apparently now broken in the GtkSocket/GtkPlug implementation for Win32. 3.3.39 08aug12 Fixed relative pathnames when generated in MinGW and used back on Linux. Added --output filename option to fst2vcd, vzt2vcd, and lxt2vcd. Fix crash on OSX if gtk_widget_set_sensitive is called on a separator. Fixed OSX version so it looks for .gtkwaverc in the home directory and if not found, probes the resource bundle for Contents/Resources/examples/gtkwaverc (no dot in the name). Added GTKWave User's Guide option to help menu on OSX. Added + vs ++ separators for twinwave. Dynamic resize fixes. 3.3.40 10sep12 Fixed y-size of splash screen on MinGW with newest version of GTK2 (as it could be verified on that version). Fixed off-by-one buffer string allocation write overflow in calloc_2() call in maketraces(). 3.3.41 30sep12 Fix for gtkwave::addSignalsFromList when encountering signals of form a.b.MyBus[7:0] and a.b.MyBus[15:8] such that brackets aren't stripped. Added experimental highlight_wavewindow rc variable which allows signals also to be highlighted in the wave window using the value for color_grid. Added use_standard_trace_select rc variable and related menu option. 3.3.42 28nov12 Fix to prevent missing group openings from keeping other signals in the viewer that follow from displaying. Adding more support for newer constructs in Vermin. Added scrollwheel support to rtlbrowse code windows. Added fseeko() return checking in fstapi.c to prevent errors with dynamically updated files. 3.3.43 26jan13 Fix for rtlbrowse for gtk_adjustment_get_page_increment and gtk_adjustment_get_step_increment introduced in 2.14. Added VPD support via vpd2vcd. To use, specify -o at the command line. (e.g., gtkwave -o test.vpd) Added autodetect for LXT, LXT2, VZT, FST regardless of the filename suffix. Crash fix for gtkwave::getDisplayedSignals, specifically removing the extra free_2() in WAVE_OE_ME. Added conditional compile for stat() being available. 3.3.44 16feb13 gdk_draw_layout assertion `GDK_IS_DRAWABLE (drawable)' assertion fix. 3.3.45 28feb13 Fix for VCDNAM_ESCAPE character in treesearch window. This sometimes occurs for structure identifiers. 3.3.46 29apr13 Upgraded to autoconf 2.69. Fixed as of yet undetected hdr_incomplete bug when running off end of FST file. (e.g., while file is being written) Fixed problem with is_gtkw_save_file getting wiped out on reload. Updated Mac bundle info to reflect new autoconf filenames. 3.3.47 14may13 Fix for crash in 64-bit mode with array accesses in deprecated loader. Partial VCD loader fix for small files. Added preliminary do-nothing generate support in vermin. Fixed minmax_valid for partial VCD loader: affects scaling on floating-point traces. 3.3.48 04aug13 Fixed infinite loop hang on various helpers executables when extra arguments are specified. Delete changed marker name if it exists when marker is removed. Added "Open Hierarchy" option that will expand the SST and select the hierarchy for a given signal selected in the Signals window. Added preliminary support for FsdbReader. FSDB fix for generate created hierarchies. FSDB fix for new debug info output style to be parsed. Added generate as scope type to VCD/FST/FSDB. Preliminary add for module port direction for FSDB and FST. Display signal direction column in SST if not all signals are declared as FST_VD_IMPLICIT. Fixed GTK warning when hide_sst is enabled and SST is opened then closed. Added extraction of in/out/inout from FSDB into FST with vcd2fst helper executable. (It also converts FSDB to FST.) Added support for SV structures, unions, classes, packages, programs, and interfaces. Updated signal parsing in FST/FSDB to handle NC declarations for arrays in VCD. (i.e., bitranges are missing) Use vcd2fst or the -o option to read NC VCD files with arrays properly. Preliminary support for SV datatypes of bit, logic, int, shortint, longint, byte, enum, and shortreal in VCD and FST. Added sparse array datatype to FST (currently unused by gtkwave). Added support for attribute begin/end in FST. (Currently unused by gtkwave.) This allows embedding of various data inside the structure tree. Added autoraise on entry window on keystrokes or periodically when it exists. Added ability to store $comment in FST files via the attribute mechanism (FST_AT_MISC/FST_MT_COMMENT). 3.3.49 11sep13 Fix crashed caused by X11 protocol limitation for pixmap size. Potential buffer overflow fix in vcd2fst. Added ability to store environment variable information in FST files (FST_MT_ENVVAR). Fixed bad enum for FST_PT_MAX. Added contrib/fst_jni directory to distribution. Fixed broken "make dist" variants. Added buffer and linkage data directions (future expansion for VHDL) in FST and gtkwave. Removed requirement for fsdbdebug in path when FsdbReader is present. Fixed ordering of static FSDB libraries for when dynamic ones are not present. Added direction filters to SST name filter search. That is, adding +I+, +O+, +IO+, +B+, or +L+ before the regular expression adds additional filtering criteria. Direction filters are case-insensitive. Relax FSDB loader to allow VHDL and mixed-language files. Added VHDL hierarchy types to FST, internal VCD loaders and also vcdfst/fst2vcd. Added in VHDL to FST (which will also allow other languages): gtkwave can process these types (e.g., signal + std_ulogic), but there are currently no simulators supporting them. These are written by using fstWriterCreateVar2(). 3.3.50 15oct13 Limit number of rows that can be displayed in mouseover in order to prevent potential X11 crashes on extremely wide signals. Added "/File/Grab To File" PNG image grab menu option. Added missing $dumpvars emission in fst2vcd. Added missing atto and zepto time prefix parsing in vcd2fst. Added VHDL package type to FST. Added red box around 'U' vector values for VHDL similar to 'X' for Verilog. Used FST "attribute name" for variable types if specified. CRLF fix for save file reading on LF-only systems. Fix Valgrind hit in fst.c that was causing crashes on OSX. Added fstWriterSetFiletype() and fstReaderGetFiletype() to provide sim language hint to gtkwave for language- appropriate formatting of various data. Added fstWriterSetSourceStem() so writers can embed source stems in the FST file. Specify before the appropriate hierarchy or variable declaration. Added gtkwave_bin_launcher.sh script to set up environment variables on OSX for running the bin/ directory files from a terminal rather than as an app invocation. 3.3.51 27oct13 MAINTAINERS: Please add gedit to the list of dependencies for gtkwave in order to enable new function that Icarus Verilog dumps into FST files. Fix "/File/Grab To File" on OSX with an OSX patch as the _gdk_quartz_image_copy_to_image() function in the GTK toolkit for Quartz is broken. Updated examples/gtkwaverc accel options to reflect the current state of the gtkwave main window main menu. Added "Open Source Definition" and "Open Source Instantiation" options that invoke .gtkwaverc variable "editor" (or $GTKWAVE_EDITOR or gedit or open -t [OSX]) on sourcecode when source stems are present in the dumpfile (currently FST only). Fixed timezero in vcd2fst as it was only parsing unsigned numbers. Fixed Open Hierarchy crash on blank signals. 3.3.52 11nov13 Added LZ4 as compression type for FST. When enabled with --fourpack in vcd2fst, this compresses both signal data and the hierarchy using LZ4. Added WLF support via wlf2vcd. To use, specify -o at the command line. (e.g., gtkwave -o test.wlf) Changed left/right arrow function in signal/wave windows to find next transition of selected signal(s). Re-enabled DnD scroll beyond top/bottom of Signals pane. Added debounce for baseline (middle) mouse button. Another partial VCD loader fix. Now use libcomdlg32 file requesters on MinGW. Added --extensions flag to fstvcd to enable emission of FST extensions/attributes to VCD files. This is to keep FST attributes from making VCD files unparseable with other tools. Fix in FsdbReader interface for version 1.x files. Many warnings fixes found from gcc -Wextra flag. Fixed thread-unsafe static allocations in fstapi.c. 3.3.53 15dec13 Made LZ4 the default compression routine selected for vcd2fst. Fixes to EVCD parsing in vcd2fst and evcd2vcd. Automatically invoke --optimize if VPD or WLF is detected; invoke on FSDB if FsdbReader is missing. Standardized export feature to write vcd using lower case for non 0/1 values. Added perror() on errno-related exits in vcd loaders. Added experimental wlf2vcd in contrib. It is not currently compiled or used. Corrected non-functional typos in documentation. 3.3.54 02jan14 Added LZ4 double compression on hierarchy tree for FST when hierarchy size exceeds 4MB. Fix to regular expression filtering when +I+ form expressions are encountered in the SST. Previously, the wrong value of regex match was used on 32-bit architectures due to the stack layout. Removed --disable-inline-asm ./configure flag as inline assembly has been removed because it is generating incorrectly in some cases on x86_64. 3.3.55 06feb14 Fixed problem with FST_DYNAMIC_ALIAS_DISABLE enabled when Judy arrays are not present. FST writer performance tweaks for traces with millions of signal declarations. Keep FSDB_VT_STREAM (FSDB transaction type) traces from attempting to be read (for now) as they aren't yet processed. Added more space efficient FST dynamic alias encoding. Tempfile creation fix for Windows. Using tmpnam() is not enough and fails depending on user permissions. Make vcd2fst use FastLZ instead of LZ4 as a default compression type if an EVCD file is being processed as it (re-)compresses much better. Using -4/-F/-Z still gives expected results. Changed double printf formatting for FSDB to "%.16g" to match VCD formatting. Added very fast I/O write capability to fst2vcd. Added support for FSDB_BYTES_PER_BIT_2B (EVCD) in FSDB loader. Added experimental fsdb2vcd in contrib. It is not currently compiled or used. Fix to treesearch to remove duplicate signal names because of faulty dumpers. Repscript fix for if -R starts without a dumpfile name. 3.3.56 12feb14 Added another crash fix patch for GTK-OSX. Fix to regex search to remove duplicate signal names because of faulty dumpers. Fix to configure.ac for MSYS not adding -lcomdlg32 when Tcl is disabled. Valgrind fix on deallocated context: old GLOBALS pointer could be examined in set_GLOBALS_x(). Minor cleanup in treesearch_gtk2.c: removed redundant show widget invocation. Added missing compressBound() for compress2() dest mallocs. 3.3.57 13feb14 Fix for Electric Fence crash in vlist_freeze(). Updated LZ4 for version r113. 3.3.58 16mar14 Added /Data Format/Popcnt function for ones counting. Warnings fixes from new Clang 3.4 scan-build. Updated VCD ID generation in various helpers to use a faster, equivalent algorithm. Change [1] at end of struct to C99 [] notation with appropriate allocation size modification. System_profiler speed fix for OSX. 3.3.59 26apr14 Use Duff's Device for 8 byte -> 1 byte binary value compression algorithm in FST writer. Warnings fixes from cppcheck. Moved MinGW for FST to using different windows tempfile generation instead of tmpfile(). Removed fflush() in FST for MinGW in places that can cause crashes with read only files. Updated man page for gtkwave.1 indicating that XID is in hex. Allow decimal conversions on popcnt filtered vectors that are greater than 64 bits (they will never overflow). 3.3.60 14may14 Fix MinGW tmpfile_open() patch from previous release as it was using the wrong filename. Harden fsdb reader against xtags that move backward in time. 3.3.61 27jun14 Parameterized number of named markers, so that --enable-manymarkers at configure time allows up to 702 named markers instead of 26 (disabled by default). Updated LZ4 for version r118. Fixed broken VCD/TIM export in Windows (broken by new file requester). 3.3.62 29aug14 Added zoom_full, zoom_size, and move_to_time to the dbus interface (dbus enabled by --with-gconf). Updated LZ4 to version r120 (r121 files are the same). Compiler warnings fixes for gtk+-1.2 (-Wall -Wshadow -Wextra). 3.3.63 06nov14 Updated LZ4 for version r123. Added fine horiz scrolling in wavewindow (when using the wheel on a mouse) if shift pressed. Timescale fix for Verilator where it emits 0ps as a timescale. Added sample gtkwave.appdata.xml file in share/appdata. 3.3.64 25nov14 Fix to FileChooser to prevent requester from blocking on asking for a directory if a dumpfile is loaded without some amount of absolute/relative pathname. Updated LZ4 for version r124. Fix for x-windows OSX compiles. 3.3.65 01apr15 Added --, -I-, etc. option to port filtering in SST. Using -- for example filters all non-ports from search results. Updated LZ4 for version r126. Minor warnings fixes. Moved TCL_LDADD/TK_LDADD before FSDB_LDADD to avoid stale Tcl library version conflicts. Removed appending [31:0] to vcd loaded integer names. Reduced recursion depth in GHW signal loader to prevent stack overflow crashes. Added support for synthetic clocks in FST file. Update timetrace marking so it runs quicker for large traces. 3.3.66 05jul15 Faster fsdb initialization. Fix vcd recoder loader crash for malformed vcd if signal is declared as bits and a real valued change is encountered for the value change. Fixed crash in vcd2vzt for vcd files with no value changes (likely a malformed vcd). Added fsdbReaderResetSignalList() to prevent signals from loading over and over when unnecessary. Compile fixes for renamed functions and defines in gtk osx. 3.3.67 24sep15 Updated LZ4 for version r131. Fixed right justify ascii datatype display. 3.3.68 18nov15 Update copyright date. Added named markers capability to From: and To: time value input boxes. Added support for fixed point binary numbers for both signed and unsigned decimal display types. 3.3.69 03feb16 Added missing EXTLOAD_CFLAGS declarations in configure.ac for FSDB detection when only .a files are present (necessary for Ubuntu). Fixed valgrind warning in fst.c for dead memory allocation. Fixed signed fixed point binary number shift for negative numbers. Added ghw patch for missing enum crash in ghw files. 3.3.70 14feb16 Various warnings fixes from new version of scan-build. Crash fix in Windows for transaction traces (broken since VCD/TIM export in 3.3.61). 3.3.71 06apr16 Printf format warnings fixes in lxt2_write.c. Added SVG gtkwave icon in share/icons/hicolor/scalable/apps/gtkwave.svg directory. Make gtkwave interpret values as double precision FP for plotting when BitsToReal is enabled. Also keeps analog mode enabled when selecting numerical formats (which allows enabling/disabling BitsToReal without going out of analog mode). Disabling analog mode can be done using the existing Analog->Off menu option. Fix broken non-canonical bit ordering (IBM) single bit extraction in process_tcl_list(). Fixed gtkwave::gtkwave::addSignalsFromList so it can handle subset and forward/reverse extractions on signals. Remove FST_WRITER_PARALLEL from MinGW CFLAGS as some recent versions of MinGW have issues with struct timespec when pthread.h is included. Added /Edit/Delete to destroy traces without affecting the existing cut buffer. 3.3.72 13apr16 Revert to old gtkwave.appdata.xml as the new one is causing problems with appstream-util validation. 3.3.73 11jun16 Added dragzoom_threshold rc variable to accommodate input devices that have a noisy 3rd mouse button. Fix emission of all filter names so they are emitted in canonical fashion so as to avoid growing strings of ../ in savefiles. 3.3.74 27jul16 Fix for when a signal name is used as a hierarchy name at the same level of scope. (Affects fsdb.) Added --rcvar command line option to insert rc variable changes individually without needing to point to a configuration file. Change to combine traces down/up routines to handle 2D vector name generation. Allow FSDB files to contain ".gz" and ".bz2" suffixes as the libnffr loader can handle those. If a variable is declared in the dumpfile as an integer, then it is imported to the waveform display as an integer instead of a hex value. This works for dump file formats that show the datatype in the SST window. Added code that should prevent the primary marker from disappearing unexpectedly as well as dynamic resizing being stuck in the unset marker width. 3.3.75 02aug16 Fix crash when -S and -W are used in tandem. 3.3.76 13aug16 Fix for --disable-tcl in ./configure caused by 3.3.75 fix. Crash fix in fstapi.c on read value at time accessing of FST files that use new dynamic aliases, FastLZ, or LZ4. This primarily affects rtlbrowse. 3.3.77 03oct16 Updated documentation to include an appendix on FST implementation details. Removed '!A || (A && B)' is equivalent to '!A || B' redundant condition checks where found in source. Added hier_ignore_escapes rc variable. Dynamic resizing tweaks for when it is turned off. Added HUWL-? value types to signal_change_list() to keep GHW files from crashing Tcl scripts. 3.3.78 26oct16 Fixed crash when using multiple pattern searches. 3.3.79 31dec16 Disable accelerator keys in twinwave single window mode to avoid focus conflicts. Fixes for -fstrict-aliasing and other recent warnings. Added fill_waveform rc variable and corresponding menu option (/View/Show Filled High Values) to allow filling in the lower portion of high values for increased visibility. 3.3.80 17mar17 Added "/View/Mouseover Copies To Clipboard" menu option to allow copying values into the clipboard so they can be pasted into text editors, etc. 3.3.81 09jun17 Added max_fsdb_trees environment variable. Fixed -C option so it is persistent across new tabs. Integrated updated GHW reader code. 3.3.82 02jul17 Get sys_fst working with VCS VPI. Added string concatenations for vectors. Added asserts to ghwlib.c to make scan-view clean. 3.3.83 04aug17 Preserve search type for regex search across reloads or close/reopens of regex search widget. Update local libz to current version. 3.3.84 03sep17 Updated FSDB reader with experimental FST tree build routines for faster init. Removed warnings found when compiling with -Wshadow. Automatically enable --comphier for FST/FSDB/AE2 if facility count reaches 500000. This is to reduce memory consumption for traces with very many signals. Added disable_auto_comphier to override this behavior. Fix null pointer sent to gtk_clipboard_set_text() for mouseover to clipboard cut ops. 3.3.85 06sep17 Fix integer type in GHW loader so integer value changes are not stored as a string. This then allows bitwise manipulations of integers. 3.3.86 03oct17 Added recurse import function (found before only in the hier search) into the SST. Removed obsolete bundle functionality from SST as recurse import more accurately imports recursively. Made entrybox taller (using -1) as recent versions of gnome have taller window titlebars and the widget was not tall enough. gtkwave-3.3.86/src/0000775000175000017500000000000013166335473013373 5ustar bybellbybellgtkwave-3.3.86/src/ghw.h0000664000175000017500000000101013166335473014321 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2005. * * 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. */ #include "globals.h" #ifndef GHW_H #define GHW_H #include #include "tree.h" #include "vcd.h" #define WAVE_GHW_DUMMYFACNAME "!!__(dummy)__!!" TimeType ghw_main(char *fname); int strand_pnt(char *s); #endif gtkwave-3.3.86/src/fgetdynamic.c0000664000175000017500000000424413166335473016035 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2013. * * 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. */ #include "globals.h" #include #include #include #include "fgetdynamic.h" #include "debug.h" char *fgetmalloc(FILE *handle) { struct vlist_t *v; char *pnt = NULL; int i, ch; v = vlist_create(sizeof(char)); do { for(;;) { ch=fgetc(handle); if((ch==EOF)||(ch==0x00)||(ch=='\n')||(ch=='\r')) break; pnt = (char *)vlist_alloc(&v, 0); *pnt = (char)ch; } } while(!pnt && ((ch=='\n')||(ch=='\r'))); /* fix for \n\r on \n systems */ GLOBALS->fgetmalloc_len = vlist_size(v); if(!GLOBALS->fgetmalloc_len) { pnt = NULL; } else { pnt=malloc_2(GLOBALS->fgetmalloc_len+1); for(i=0;ifgetmalloc_len;i++) { pnt[i] = *((char *)vlist_locate(v, i)); } pnt[i] = 0; } vlist_destroy(v); return(pnt); } /* * remove any leading and trailing spaces */ static char *stripspaces(char *s) { int len; if(s) { char *s2 = s + strlen(s) - 1; while(isspace((int)(unsigned char)*s2) && (s2 != s)) { *s2 = 0; s2--; } s2 = s; while(*s2 && isspace((int)(unsigned char)*s2)) { s2++; } if((len = strlen(s2))) { char *s3 = malloc_2(len + 1); strcpy(s3, s2); free_2(s); s = s3; GLOBALS->fgetmalloc_len = len; } else { free_2(s); s = NULL; GLOBALS->fgetmalloc_len = 0; } } return(s); } char *fgetmalloc_stripspaces(FILE *handle) { char *s = fgetmalloc(handle); return(stripspaces(s)); } /* * variants for tcl argument passing which really aren't fgetdynamic-ish functions... * the struct wave_script_args * passed in was generated in tcl_helper.c. */ char *wave_script_args_fgetmalloc(struct wave_script_args *w) { char *pnt; if((!w)||(!w->curr)) return(NULL); pnt = malloc_2(strlen(w->curr->payload)+1); strcpy(pnt, w->curr->payload); w->curr = w->curr->next; return(pnt); } char *wave_script_args_fgetmalloc_stripspaces(struct wave_script_args *w) { char *s = wave_script_args_fgetmalloc(w); return(stripspaces(s)); } gtkwave-3.3.86/src/tcl_support_commands.c0000664000175000017500000004210313166335473017776 0ustar bybellbybell/* * Copyright (c) Yiftach Tzori 2009-2012. * * 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. */ #include #include "globals.h" #include #include #include #include #include "gtk12compat.h" #include "analyzer.h" #include "tree.h" #include "symbol.h" #include "vcd.h" #include "lx2.h" #include "busy.h" #include "debug.h" #include "hierpack.h" #include "tcl_helper.h" #include "tcl_support_commands.h" /* ** * Search for a tree node that is associated with the hierarchical path * return pointer to this node or NULL */ GtkCTreeNode *SST_find_node_by_path(GtkCTreeRow *root, char *path) { char *s = strdup_2(path) ; char *p = s ; char *p1 ; GtkCTreeRow *gctr = root ; GtkCTreeNode *node = gctr->parent ; struct tree *t ; int i ; /* in the cases of path that where generated inside a `generate-for' block * path name will contain '[]'. This will prompt TCL to soround PATH with * '{' and '}' */ if (*p == '{' && (p1 = strrchr(p, '}'))) { p++ ; *p1 = '\0' ; } while (gctr) { if ((p1 = strchr(p, '.'))) *p1 = '\0' ; t = (struct tree *)(gctr->row.data) ; i = 0 ; while (strcmp(t->name, p)) { /* name mis-match */ if (!(node = gctr->sibling)) { /* no more siblings */ gctr = NULL ; break ; } else { gctr = GTK_CTREE_ROW(node); t = (struct tree *)(gctr->row.data) ; } i++ ; } if (gctr) { /* normal exit from the above */ if(!p1) {/* first/last in chain */ if(i == 0) /* first */ if(gctr->children) node = GTK_CTREE_ROW(gctr->children)->parent ; break ; } else { /* keep going down the hierarchy */ if (!(node = gctr->children)) break ; else { gctr = GTK_CTREE_ROW(gctr->children) ; p = p1 + 1 ; } } } } free_2(s) ; return node ; } /* ** * Open the hierarchy tree, starting from 'node' up to the root */ int SST_open_path(GtkCTree *ctree, GtkCTreeNode *node) { GtkCTreeRow *row ; for(row = GTK_CTREE_ROW(node) ; row->parent; row = GTK_CTREE_ROW(row->parent)) { if(row->parent) gtk_ctree_expand(ctree, row->parent); else break ; } return 0 ; } /* ** * Main function called by gtkwavetcl_forceOpenTreeNode * Inputs: * char *name :: hierachical path to open * Output: * One of: * SST_NODE_FOUND - if path is in the dump file * SST_NODE_NOT_EXIST - is path is not in the dump * SST_TREE_NOT_EXIST - is Tree widget does not exist * Side effects: * If path is in the dump then its tree is opened and scrolled * to be it to display. Node is selected and associated signals * are displayed. * No change in any other case */ int SST_open_node(char *name) { int rv ; #ifdef WAVE_USE_GTK2 GtkCTree *ctree = GLOBALS->ctree_main; if (ctree) { GtkCTreeRow *gctr; GtkCTreeNode *target_node ; for(gctr = GTK_CTREE_ROW(GLOBALS->any_tree_node); gctr->parent; gctr = GTK_CTREE_ROW(gctr->parent)) ; if ((target_node = SST_find_node_by_path(gctr, name))) { struct tree *t ; rv = SST_NODE_FOUND ; gtk_ctree_collapse_recursive(ctree, gctr->parent) ; SST_open_path(ctree, target_node) ; gtk_ctree_node_moveto(ctree, target_node, 0, 0.5, 0.5); gtk_ctree_select(ctree, target_node); gctr = GTK_CTREE_ROW(target_node) ; t = (struct tree *)(gctr->row.data) ; GLOBALS->sig_root_treesearch_gtk2_c_1 = t->child; fill_sig_store (); } else { rv = SST_NODE_NOT_EXIST ; } } else { rv = SST_TREE_NOT_EXIST ; } #else (void)name; rv = SST_TREE_NOT_EXIST ; #endif return rv ; } /* ===== Double link lists */ llist_p *llist_new(llist_u v, ll_elem_type type, int arg) { llist_p *p = (llist_p *)malloc_2(sizeof(llist_p)) ; p->next = p->prev = NULL ; switch(type) { case LL_INT: p->u.i = v.i ; break ; case LL_UINT: p->u.u = v.u ; break ; case LL_TIMETYPE: p->u.tt = v.tt ; break ; case LL_CHAR: p->u.c = v.c ; break ; case LL_SHORT: p->u.s = v.s ; break ; case LL_STR: if(arg == -1) p->u.str = strdup_2(v.str) ; else { p->u.str = (char *)malloc_2(arg) ; strncpy(p->u.str, v.str, arg) ; p->u.str[arg] = '\0' ; } break ; case LL_VOID_P: p->u.p = v.p ; break ; default: fprintf(stderr, "Internal error in llist_new(), type: %d\n", type); exit(255); } return p ; } /* * append llist_p element ELEM to the of the list whose first member is HEAD amd * last is TAIL. and return the head of the list. * if HEAD is NULL ELEM is returned. * if TAIL is defined then ELEM is chained to it and TAIL is set to point to * ELEM */ llist_p *llist_append(llist_p *head, llist_p *elem, llist_p **tail) { llist_p *p ; if (*tail) { p = tail[0] ; p->next = elem ; elem->prev = p ; tail[0] = elem ; } else { if (head) { for(p = head ; p->next; p = p->next) ; p->next = elem ; elem ->prev = p ; } else { head = elem ; } } return head ; } /* * Remove the last element from list whose first member is HEAD * if TYPE is LL_STR the memory allocated for this string is freed. * if the TYPE is LL_VOID_P that the caller supplied function pointer F() is * is executed (if not NULL) * HEAD and TAIL are updated. */ llist_p *llist_remove_last(llist_p *head, llist_p **tail, ll_elem_type type, void *f(void *) ) { if (head) { llist_p *p = tail[0] ; switch(type) { case LL_STR: free_2(p->u.str) ; break ; case LL_VOID_P: if (f) f(p->u.p) ; break ; default: fprintf(stderr, "Internal error in llist_remove_last(), type: %d\n", type); exit(255); } if (p->prev) { tail[0] = p->prev ; } else { head = tail[0] = NULL ; } free_2(p) ; } return head ; } /* Destroy the list whose first member is HEAD * function pointer F() is called in type is LL_VOID_P * if TYPE is LL_STR then string is freed */ void llist_free(llist_p *head, ll_elem_type type, void *f(void *)) { llist_p *p = head, *p1 ; while(p) { p1 = p->next ; switch(type) { case LL_STR: free_2(p->u.str) ; break ; case LL_VOID_P: if (f) f(p->u.p) ; break ; default: fprintf(stderr, "Internal error in llist_free(), type: %d\n", type); exit(255); } free_2(p) ; p = p1 ; } } /* ===================================================== */ /* Create a Trptr structure that contains the bit-vector VEC * This is based on the function AddVector() */ Trptr BitVector_to_Trptr(bvptr vec) { Trptr t; int n; GLOBALS->signalwindow_width_dirty=1; n = vec->nbits; t = (Trptr) calloc_2(1, sizeof( TraceEnt ) ); if( t == NULL ) { fprintf( stderr, "Out of memory, can't add %s to analyzer\n", vec->bvname ); return( 0 ); } t->name = vec->bvname; if(GLOBALS->hier_max_level) t->name = hier_extract(t->name, GLOBALS->hier_max_level); t->flags = ( n > 3 ) ? TR_HEX|TR_RJUSTIFY : TR_BIN|TR_RJUSTIFY; t->vector = TRUE; t->n.vec = vec; /* AddTrace( t ); */ return( t ); } Trptr find_first_highlighted_trace(void) { Trptr t=GLOBALS->traces.first; while(t) { if(t->flags&TR_HIGHLIGHT) { if(!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { break; } } t=t->t_next; } return(t); } /* Find is signal named NAME is on display and return is Trptr value * or NULL * NAME is a full hierarchical name, but may not in include range '[..:..]' * information. */ Trptr is_signal_displayed(char *name) { Trptr t=GLOBALS->traces.first ; char *p = strchr(name, '['), *p1 ; unsigned int len, len1 ; if(p) *p = '\0' ; len = strlen(name) ; while(t) { int was_packed = HIER_DEPACK_ALLOC; int cc; if(t->vector) { p = t->n.vec->bvname; } else { if(t->n.vec) { p = hier_decompress_flagged(t->n.nd->nname, &was_packed); } else { p = NULL; } } if(p) { p1 = strchr(p,'[') ; len1 = (p1) ? (unsigned int)(p1 - p) : strlen(p) ; cc = ((len == len1) && !strncmp(name, p, len)); if(was_packed) free_2(p); if(cc) break ; } t = t->t_next ; } return t ; } /* Create a Trptr structure for ND and return its value * This is based on the function AddNodeTraceReturn() */ Trptr Node_to_Trptr(nptr nd) { Trptr t = NULL; hptr histpnt; hptr *harray; int histcount; int i; if(nd->mv.mvlfac) import_trace(nd); GLOBALS->signalwindow_width_dirty=1; if( (t = (Trptr) calloc_2( 1, sizeof( TraceEnt ))) == NULL ) { fprintf( stderr, "Out of memory, can't add to analyzer\n" ); return( 0 ); } if(!nd->harray) { /* make quick array lookup for aet display */ histpnt=&(nd->head); histcount=0; while(histpnt) { histcount++; histpnt=histpnt->next; } nd->numhist=histcount; if(!(nd->harray=harray=(hptr *)malloc_2(histcount*sizeof(hptr)))) { fprintf( stderr, "Out of memory, can't add to analyzer\n" ); free_2(t); return(0); } histpnt=&(nd->head); for(i=0;inext; } } if(!GLOBALS->hier_max_level) { int flagged = HIER_DEPACK_ALLOC; t->name = hier_decompress_flagged(nd->nname, &flagged); t->is_depacked = (flagged != 0); } else { int flagged = HIER_DEPACK_ALLOC; char *tbuff = hier_decompress_flagged(nd->nname, &flagged); if(!flagged) { t->name = hier_extract(nd->nname, GLOBALS->hier_max_level); } else { t->name = strdup_2(hier_extract(tbuff, GLOBALS->hier_max_level)); free_2(tbuff); t->is_depacked = 1; } } if(nd->extvals) { /* expansion vectors */ int n; n = nd->msi - nd->lsi; if(n<0)n=-n; n++; t->flags = (( n > 3 )||( n < -3 )) ? TR_HEX|TR_RJUSTIFY : TR_BIN|TR_RJUSTIFY; } else { t->flags |= TR_BIN; /* binary */ } t->vector = FALSE; t->n.nd = nd; /* if(tret) *tret = t; ... for expand */ return t ; } /* * Search for the signal named (full path) NAME in the signal data base and * create a Trptr structure for it * NAME is a full hierarchy name, but may not include range information. * Return the structure created or NULL */ Trptr sig_name_to_Trptr(char *name) { Trptr t = NULL ; int was_packed = HIER_DEPACK_ALLOC; int i, name_len; char *hfacname = NULL; struct symbol *s = NULL, *s2 ; int len = 0 ; bvptr v = NULL; bptr b = NULL; int pre_import = 0; if(name) { name_len = strlen(name); for(i=0;inumfacs;i++) { hfacname = hier_decompress_flagged(GLOBALS->facs[i]->name, &was_packed); if(!strcmp(name, hfacname) || ((!strncmp(name, hfacname, name_len) && hfacname[name_len] == '['))) { s = GLOBALS->facs[i]; if((s2 = s->vec_root)) { s = s2; } else { s2 = s; } if(GLOBALS->is_lx2) { while(s2) { if(s2->n->mv.mvlfac) /* the node doesn't exist yet! */ { lx2_set_fac_process_mask(s2->n); pre_import++; } s2 = s2->vec_chain; len++; } } else { while(s2) { s2 = s2->vec_chain; len++; } } if(was_packed) { free_2(hfacname); } break; } if(was_packed) { free_2(hfacname); } s = NULL; } if(s) { if(pre_import) { lx2_import_masked(); /* import any missing nodes */ } if(len > 1) { if ((b = makevec_chain(NULL, s, len))) { if((v=bits2vector(b))) { t = BitVector_to_Trptr(v) ; } else { free_2(b->name); if(b->attribs) free_2(b->attribs); free_2(b); } } } else { nptr node = s->n ; t = Node_to_Trptr(node) ; } } } return t ; } /* Return the base prefix for the signal value */ char *signal_value_prefix(int flags) { if(flags & TR_BIN) return "0b" ; if(flags & TR_HEX) return "0x" ; if(flags & TR_OCT) return "0" ; return "" ; } /* ===================================================== */ llist_p *signal_change_list(char *sig_name, int dir, TimeType start_time, TimeType end_time, int max_elements) { llist_p *l0_head = NULL, *l0_tail = NULL, *l1_head = NULL,*l_elem, *lp ; llist_p *l1_tail = NULL ; char *s, s1[1024] ; hptr h_ptr ; Trptr t = NULL ; Trptr t_created = NULL; if(!sig_name) { t = (Trptr)find_first_highlighted_trace(); } else { /* case of sig name, find the representing Trptr structure */ if (!(t = is_signal_displayed(sig_name))) t = t_created = sig_name_to_Trptr(sig_name) ; } if (t) { /* we have a signal */ /* create a list of value change structs (hptrs or vptrs */ int nelem = 0 /* , bw = -1 */ ; /* scan-build */ TimeType tstart = (dir == STRACE_FORWARD) ? start_time : end_time ; TimeType tend = (dir == STRACE_FORWARD) ? end_time : start_time ; if ((dir == STRACE_BACKWARD) && (max_elements == 1)) { max_elements++; } if (!t->vector) { hptr h, h1; int len = 0 ; /* scan-build : if(t->n.nd->extvals) { bw = abs(t->n.nd->msi - t->n.nd->lsi) + 1 ; } */ h = bsearch_node(t->n.nd, tstart - t->shift) ; for(h1 = h; h1; h1 = h1->next) { if (h1->time <= tend) { if (len++ < max_elements) { llist_u llp; llp.p = h1; l_elem = llist_new(llp, LL_VOID_P, -1) ; l0_head = llist_append(l0_head, l_elem, &l0_tail) ; if(!l0_tail) l0_tail = l0_head ; } else { if(dir == STRACE_FORWARD) break ; else { if(!l0_head) /* null pointer deref found by scan-build */ { llist_u llp; llp.p = h1; l_elem = llist_new(llp, LL_VOID_P, -1) ; l0_head = llist_append(l0_head, l_elem, &l0_tail) ; if(!l0_tail) l0_tail = l0_head ; } l_elem = l0_head ; l0_head = l0_head->next ; /* what scan-build flagged as null */ l0_head->prev = NULL ; l_elem->u.p = (void *)h1 ; l_elem->next = NULL ; l_elem->prev = l0_tail ; l0_tail->next = l_elem ; l0_tail = l_elem ; } } } } } else { vptr v, v1; v = bsearch_vector(t->n.vec, tstart - t->shift) ; for(v1 = v; v1; v1 = v1->next) { if (v1->time <= tend) { llist_u llp; llp.p = v1; l_elem = llist_new(llp, LL_VOID_P, -1) ; l0_head = llist_append(l0_head, l_elem, &l0_tail) ; if(!l0_tail) l0_tail = l0_head ; } } } lp = (start_time < end_time) ? l0_head : l0_tail ; /* now create a linked list of time,value.. */ while (lp && (nelem++ < max_elements)) { llist_u llp; llp.tt = ((t->vector) ? ((vptr)lp->u.p)->time: ((hptr)lp->u.p)->time); l_elem = llist_new(llp, LL_TIMETYPE, -1) ; l1_head = llist_append(l1_head, l_elem, &l1_tail) ; if(!l1_tail) l1_tail = l1_head ; if(t->vector == 0) { if(!t->n.nd->extvals) { /* really single bit */ switch(((hptr)lp->u.p)->v.h_val) { case '0': case AN_0: llp.str = "0"; l_elem = llist_new(llp, LL_STR, -1) ; break ; case '1': case AN_1: llp.str = "1"; l_elem = llist_new(llp, LL_STR, -1) ; break ; case 'x': case 'X': case AN_X: llp.str = "x"; l_elem = llist_new(llp, LL_STR, -1) ; break ; case 'z': case 'Z': case AN_Z: llp.str = "z"; l_elem = llist_new(llp, LL_STR, -1) ; break ; case 'h': case 'H': case AN_H: llp.str = "h"; l_elem = llist_new(llp, LL_STR, -1) ; break ; /* added for GHW... */ case 'u': case 'U': case AN_U: llp.str = "u"; l_elem = llist_new(llp, LL_STR, -1) ; break ; case 'w': case 'W': case AN_W: llp.str = "w"; l_elem = llist_new(llp, LL_STR, -1) ; break ; case 'l': case 'L': case AN_L: llp.str = "l"; l_elem = llist_new(llp, LL_STR, -1) ; break ; case '-': case AN_DASH: llp.str = "-"; l_elem = llist_new(llp, LL_STR, -1) ; break ; default: llp.str = "?"; l_elem = llist_new(llp, LL_STR, -1) ; break ; /* ...added for GHW */ } } else { /* this is still an array */ h_ptr = (hptr)lp->u.p ; if(h_ptr->flags&HIST_REAL) { if(!(h_ptr->flags&HIST_STRING)) { #ifdef WAVE_HAS_H_DOUBLE s=convert_ascii_real(t, &h_ptr->v.h_double); #else s=convert_ascii_real(t, (double *)h_ptr->v.h_vector); #endif } else { s=convert_ascii_string((char *)h_ptr->v.h_vector); } } else { s=convert_ascii_vec(t,h_ptr->v.h_vector); } if(s) { sprintf(s1,"%s%s", signal_value_prefix(t->flags), s) ; llp.str = s1; l_elem = llist_new(llp, LL_STR, -1) ; } else { l1_head = llist_remove_last(l1_head, &l1_tail, LL_INT, NULL) ; } } } else { sprintf(s1, "%s%s", signal_value_prefix(t->flags), convert_ascii(t, (vptr)lp->u.p)) ; llp.str = s1 ; l_elem = llist_new(llp, LL_STR, -1) ; } l1_head = llist_append(l1_head, l_elem, &l1_tail) ; lp = (start_time < end_time) ? lp->next : lp->prev ; } llist_free(l0_head, LL_VOID_P, NULL) ; } if(t_created) { FreeTrace(t_created); } return l1_head ; } gtkwave-3.3.86/src/fgetdynamic.h0000664000175000017500000000147713166335473016047 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2009. * * 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. */ #include "globals.h" #ifndef FGET_DYNAMIC_H #define FGET_DYNAMIC_H #include "vlist.h" /* using alloca avoids having to preserve across contexts */ struct wave_script_args { struct wave_script_args *curr; struct wave_script_args *next; char payload[]; /* C99 */ }; char *fgetmalloc(FILE *handle); char *fgetmalloc_stripspaces(FILE *handle); char *wave_script_args_fgetmalloc(struct wave_script_args *wave_script_args); char *wave_script_args_fgetmalloc_stripspaces(struct wave_script_args *wave_script_args); #endif gtkwave-3.3.86/src/tcl_support_commands.h0000664000175000017500000000216213166335473020004 0ustar bybellbybell/* * Copyright (c) Yiftach Tzori 2009. * * 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. */ #ifndef WAVE_TCL_SUPPORT_CMDS_H #define WAVE_TCL_SUPPORT_CMDS_H #include #include "debug.h" GtkCTreeNode *SST_find_node_by_path(GtkCTreeRow *root, char *path); int SST_open_path(GtkCTree *ctree, GtkCTreeNode *node); void fill_sig_store (void); int SST_open_node(char *name); llist_p *llist_new(llist_u v, ll_elem_type type, int arg); llist_p *llist_append(llist_p *head, llist_p *elem, llist_p **tail); llist_p *llist_remove_last(llist_p *head, llist_p **tail, ll_elem_type type, void *f(void *) ); void llist_free(llist_p *head, ll_elem_type type, void *f(void *)); llist_p *signal_change_list(char *sig_name, int dir, TimeType start_time, TimeType end_time, int max_elements); #define SST_NODE_FOUND 0 #define SST_NODE_CURRENT 2 #define SST_NODE_NOT_EXIST 1 #define SST_TREE_NOT_EXIST -1 #endif gtkwave-3.3.86/src/lx2.c0000664000175000017500000005265713166335473014263 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2003-2012. * * 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. */ #include "globals.h" #include #include #include "lx2.h" #ifndef _MSC_VER #include #endif #include #include #include #include "symbol.h" #include "vcd.h" #include "lxt.h" #include "vzt.h" #include "lxt2_read.h" #include "debug.h" #include "busy.h" #include "hierpack.h" #include "fst.h" /* * mainline */ TimeType lx2_main(char *fname, char *skip_start, char *skip_end) { int i; struct Node *n; struct symbol *s, *prevsymroot=NULL, *prevsym=NULL; signed char scale; unsigned int numalias = 0; struct symbol *sym_block = NULL; struct Node *node_block = NULL; char **f_name = NULL; GLOBALS->lx2_lx2_c_1 = lxt2_rd_init(fname); if(!GLOBALS->lx2_lx2_c_1) { return(LLDescriptor(0)); /* look at GLOBALS->lx2_lx2_c_1 in caller for success status... */ } /* SPLASH */ splash_create(); /* lxt2_rd_set_max_block_mem_usage(lx2, 0); */ scale=(signed char)lxt2_rd_get_timescale(GLOBALS->lx2_lx2_c_1); exponent_to_time_scale(scale); GLOBALS->global_time_offset = lxt2_rd_get_timezero(GLOBALS->lx2_lx2_c_1); GLOBALS->numfacs=lxt2_rd_get_num_facs(GLOBALS->lx2_lx2_c_1); GLOBALS->mvlfacs_lx2_c_1=(struct fac *)calloc_2(GLOBALS->numfacs,sizeof(struct fac)); f_name = calloc_2(F_NAME_MODULUS+1,sizeof(char *)); GLOBALS->lx2_table_lx2_c_1=(struct lx2_entry *)calloc_2(GLOBALS->numfacs, sizeof(struct lx2_entry)); sym_block = (struct symbol *)calloc_2(GLOBALS->numfacs, sizeof(struct symbol)); node_block=(struct Node *)calloc_2(GLOBALS->numfacs,sizeof(struct Node)); for(i=0;inumfacs;i++) { GLOBALS->mvlfacs_lx2_c_1[i].node_alias=lxt2_rd_get_fac_rows(GLOBALS->lx2_lx2_c_1, i); node_block[i].msi=lxt2_rd_get_fac_msb(GLOBALS->lx2_lx2_c_1, i); node_block[i].lsi=lxt2_rd_get_fac_lsb(GLOBALS->lx2_lx2_c_1, i); GLOBALS->mvlfacs_lx2_c_1[i].flags=lxt2_rd_get_fac_flags(GLOBALS->lx2_lx2_c_1, i); GLOBALS->mvlfacs_lx2_c_1[i].len=lxt2_rd_get_fac_len(GLOBALS->lx2_lx2_c_1, i); } fprintf(stderr, LXT2_RDLOAD"Finished building %d facs.\n", GLOBALS->numfacs); /* SPLASH */ splash_sync(1, 5); GLOBALS->first_cycle_lx2_c_1 = (TimeType) lxt2_rd_get_start_time(GLOBALS->lx2_lx2_c_1) * GLOBALS->time_scale; GLOBALS->last_cycle_lx2_c_1 = (TimeType) lxt2_rd_get_end_time(GLOBALS->lx2_lx2_c_1) * GLOBALS->time_scale; GLOBALS->total_cycles_lx2_c_1 = GLOBALS->last_cycle_lx2_c_1 - GLOBALS->first_cycle_lx2_c_1 + 1; /* do your stuff here..all useful info has been initialized by now */ if(!GLOBALS->hier_was_explicitly_set) /* set default hierarchy split char */ { GLOBALS->hier_delimeter='.'; } if(GLOBALS->numfacs) { char *fnam = lxt2_rd_get_facname(GLOBALS->lx2_lx2_c_1, 0); int flen = strlen(fnam); f_name[0]=malloc_2(flen+1); strcpy(f_name[0], fnam); } for(i=0;inumfacs;i++) { char buf[65537]; char *str; struct fac *f; if(i!=(GLOBALS->numfacs-1)) { char *fnam = lxt2_rd_get_facname(GLOBALS->lx2_lx2_c_1, i+1); int flen = strlen(fnam); f_name[(i+1)&F_NAME_MODULUS]=malloc_2(flen+1); strcpy(f_name[(i+1)&F_NAME_MODULUS], fnam); } if(i>1) { free_2(f_name[(i-2)&F_NAME_MODULUS]); f_name[(i-2)&F_NAME_MODULUS] = NULL; } if(GLOBALS->mvlfacs_lx2_c_1[i].flags&LXT2_RD_SYM_F_ALIAS) { int alias = GLOBALS->mvlfacs_lx2_c_1[i].node_alias; f=GLOBALS->mvlfacs_lx2_c_1+alias; while(f->flags&LXT2_RD_SYM_F_ALIAS) { f=GLOBALS->mvlfacs_lx2_c_1+f->node_alias; } numalias++; } else { f=GLOBALS->mvlfacs_lx2_c_1+i; } if((f->len>1)&& (!(f->flags&(LXT2_RD_SYM_F_INTEGER|LXT2_RD_SYM_F_DOUBLE|LXT2_RD_SYM_F_STRING))) ) { int len = sprintf(buf, "%s[%d:%d]", f_name[(i)&F_NAME_MODULUS],node_block[i].msi, node_block[i].lsi); str=malloc_2(len+1); if(!GLOBALS->alt_hier_delimeter) { strcpy(str, buf); } else { strcpy_vcdalt(str, buf, GLOBALS->alt_hier_delimeter); } s=&sym_block[i]; symadd_name_exists_sym_exists(s,str,0); prevsymroot = prevsym = NULL; } else { int gatecmp = (f->len==1) && (!(f->flags&(LXT2_RD_SYM_F_INTEGER|LXT2_RD_SYM_F_DOUBLE|LXT2_RD_SYM_F_STRING))) && (node_block[i].msi!=-1) && (node_block[i].lsi!=-1); int revcmp = gatecmp && (i) && (!strcmp(f_name[(i)&F_NAME_MODULUS], f_name[(i-1)&F_NAME_MODULUS])); if(gatecmp) { int len = sprintf(buf, "%s[%d]", f_name[(i)&F_NAME_MODULUS],node_block[i].msi); str=malloc_2(len+1); if(!GLOBALS->alt_hier_delimeter) { strcpy(str, buf); } else { strcpy_vcdalt(str, buf, GLOBALS->alt_hier_delimeter); } s=&sym_block[i]; symadd_name_exists_sym_exists(s,str,0); if((prevsym)&&(revcmp)&&(!strchr(f_name[(i)&F_NAME_MODULUS], '\\'))) /* allow chaining for search functions.. */ { prevsym->vec_root = prevsymroot; prevsym->vec_chain = s; s->vec_root = prevsymroot; prevsym = s; } else { prevsymroot = prevsym = s; } } else { str=malloc_2(strlen(f_name[(i)&F_NAME_MODULUS])+1); if(!GLOBALS->alt_hier_delimeter) { strcpy(str, f_name[(i)&F_NAME_MODULUS]); } else { strcpy_vcdalt(str, f_name[(i)&F_NAME_MODULUS], GLOBALS->alt_hier_delimeter); } s=&sym_block[i]; symadd_name_exists_sym_exists(s,str,0); prevsymroot = prevsym = NULL; if(f->flags&LXT2_RD_SYM_F_INTEGER) { node_block[i].msi=31; node_block[i].lsi=0; GLOBALS->mvlfacs_lx2_c_1[i].len=32; } } } n=&node_block[i]; n->nname=s->name; n->mv.mvlfac = GLOBALS->mvlfacs_lx2_c_1+i; GLOBALS->mvlfacs_lx2_c_1[i].working_node = n; if((f->len>1)||(f->flags&(LXT2_RD_SYM_F_DOUBLE|LXT2_RD_SYM_F_STRING))) { n->extvals = 1; } n->head.time=-1; /* mark 1st node as negative time */ n->head.v.h_val=AN_X; s->n=n; } for(i=0;i<=F_NAME_MODULUS;i++) { if(f_name[(i)&F_NAME_MODULUS]) { free_2(f_name[(i)&F_NAME_MODULUS]); f_name[(i)&F_NAME_MODULUS] = NULL; } } free_2(f_name); f_name = NULL; /* SPLASH */ splash_sync(2, 5); GLOBALS->facs=(struct symbol **)malloc_2(GLOBALS->numfacs*sizeof(struct symbol *)); if(GLOBALS->fast_tree_sort) { for(i=0;inumfacs;i++) { int len; GLOBALS->facs[i]=&sym_block[i]; if((len=strlen(GLOBALS->facs[i]->name))>GLOBALS->longestname) GLOBALS->longestname=len; } if(numalias) { int idx_lft = 0; int idx_lftmax = GLOBALS->numfacs - numalias; int idx_rgh = GLOBALS->numfacs - numalias; struct symbol **facs_merge=(struct symbol **)malloc_2(GLOBALS->numfacs*sizeof(struct symbol *)); fprintf(stderr, LXT2_RDLOAD"Merging in %d aliases.\n", numalias); for(i=0;inumfacs;i++) /* fix possible tail appended aliases by remerging in partial one pass merge sort */ { if(strcmp(GLOBALS->facs[idx_lft]->name, GLOBALS->facs[idx_rgh]->name) <= 0) { facs_merge[i] = GLOBALS->facs[idx_lft++]; if(idx_lft == idx_lftmax) { for(i++;inumfacs;i++) { facs_merge[i] = GLOBALS->facs[idx_rgh++]; } } } else { facs_merge[i] = GLOBALS->facs[idx_rgh++]; if(idx_rgh == GLOBALS->numfacs) { for(i++;inumfacs;i++) { facs_merge[i] = GLOBALS->facs[idx_lft++]; } } } } free_2(GLOBALS->facs); GLOBALS->facs = facs_merge; } /* SPLASH */ splash_sync(3, 5); fprintf(stderr, LXT2_RDLOAD"Building facility hierarchy tree.\n"); init_tree(); for(i=0;inumfacs;i++) { int esc = 0; char *subst = GLOBALS->facs[i]->name; char ch; while((ch=(*subst))) { if(ch==GLOBALS->hier_delimeter) { if(esc) *subst = VCDNAM_ESCAPE; } else if(ch=='\\') { esc = 1; GLOBALS->escaped_names_found_vcd_c_1 = 1; } subst++; } build_tree_from_name(GLOBALS->facs[i]->name, i); } /* SPLASH */ splash_sync(4, 5); if(GLOBALS->escaped_names_found_vcd_c_1) { for(i=0;inumfacs;i++) { char *subst, ch; subst=GLOBALS->facs[i]->name; while((ch=(*subst))) { if(ch==VCDNAM_ESCAPE) { *subst=GLOBALS->hier_delimeter; } /* restore back to normal */ subst++; } } } treegraft(&GLOBALS->treeroot); fprintf(stderr, LXT2_RDLOAD"Sorting facility hierarchy tree.\n"); treesort(GLOBALS->treeroot, NULL); /* SPLASH */ splash_sync(5, 5); order_facs_from_treesort(GLOBALS->treeroot, &GLOBALS->facs); if(GLOBALS->escaped_names_found_vcd_c_1) { treenamefix(GLOBALS->treeroot); } GLOBALS->facs_are_sorted=1; } else { for(i=0;inumfacs;i++) { char *subst, ch; int len; int esc = 0; GLOBALS->facs[i]=&sym_block[i]; if((len=strlen(subst=GLOBALS->facs[i]->name))>GLOBALS->longestname) GLOBALS->longestname=len; while((ch=(*subst))) { #ifdef WAVE_HIERFIX if(ch==GLOBALS->hier_delimeter) { *subst=(!esc) ? VCDNAM_HIERSORT : VCDNAM_ESCAPE; } /* forces sort at hier boundaries */ #else if((ch==GLOBALS->hier_delimeter)&&(esc)) { *subst = VCDNAM_ESCAPE; } /* forces sort at hier boundaries */ #endif else if(ch=='\\') { esc = 1; GLOBALS->escaped_names_found_vcd_c_1 = 1; } subst++; } } /* SPLASH */ splash_sync(3, 5); fprintf(stderr, LXT2_RDLOAD"Sorting facilities at hierarchy boundaries.\n"); wave_heapsort(GLOBALS->facs,GLOBALS->numfacs); #ifdef WAVE_HIERFIX for(i=0;inumfacs;i++) { char *subst, ch; subst=GLOBALS->facs[i]->name; while((ch=(*subst))) { if(ch==VCDNAM_HIERSORT) { *subst=GLOBALS->hier_delimeter; } /* restore back to normal */ subst++; } } #endif GLOBALS->facs_are_sorted=1; /* SPLASH */ splash_sync(4, 5); fprintf(stderr, LXT2_RDLOAD"Building facility hierarchy tree.\n"); init_tree(); for(i=0;inumfacs;i++) { char *nf = GLOBALS->facs[i]->name; build_tree_from_name(nf, i); } /* SPLASH */ splash_sync(5, 5); if(GLOBALS->escaped_names_found_vcd_c_1) { for(i=0;inumfacs;i++) { char *subst, ch; subst=GLOBALS->facs[i]->name; while((ch=(*subst))) { if(ch==VCDNAM_ESCAPE) { *subst=GLOBALS->hier_delimeter; } /* restore back to normal */ subst++; } } } treegraft(&GLOBALS->treeroot); treesort(GLOBALS->treeroot, NULL); if(GLOBALS->escaped_names_found_vcd_c_1) { treenamefix(GLOBALS->treeroot); } } GLOBALS->min_time = GLOBALS->first_cycle_lx2_c_1; GLOBALS->max_time=GLOBALS->last_cycle_lx2_c_1; GLOBALS->is_lx2 = LXT2_IS_LXT2; if(skip_start || skip_end) { TimeType b_start, b_end; if(!skip_start) b_start = GLOBALS->min_time; else b_start = unformat_time(skip_start, GLOBALS->time_dimension); if(!skip_end) b_end = GLOBALS->max_time; else b_end = unformat_time(skip_end, GLOBALS->time_dimension); if(b_startmin_time) b_start = GLOBALS->min_time; else if(b_start>GLOBALS->max_time) b_start = GLOBALS->max_time; if(b_endmin_time) b_end = GLOBALS->min_time; else if(b_end>GLOBALS->max_time) b_end = GLOBALS->max_time; if(b_start > b_end) { TimeType tmp_time = b_start; b_start = b_end; b_end = tmp_time; } if(!lxt2_rd_limit_time_range(GLOBALS->lx2_lx2_c_1, b_start, b_end)) { fprintf(stderr, LXT2_RDLOAD"--begin/--end options yield zero blocks, ignoring.\n"); lxt2_rd_unlimit_time_range(GLOBALS->lx2_lx2_c_1); } else { GLOBALS->min_time = b_start; GLOBALS->max_time = b_end; } } /* SPLASH */ splash_finalize(); return(GLOBALS->max_time); } /* * lx2 callback (only does bits for now) */ static void lx2_callback(struct lxt2_rd_trace **lt, lxtint64_t *tim, lxtint32_t *facidx, char **value) { (void)lt; struct HistEnt *htemp = histent_calloc(); struct lx2_entry *l2e = GLOBALS->lx2_table_lx2_c_1+(*facidx); struct fac *f = GLOBALS->mvlfacs_lx2_c_1+(*facidx); GLOBALS->busycnt_lx2_c_1++; if(GLOBALS->busycnt_lx2_c_1==WAVE_BUSY_ITER) { busy_window_refresh(); GLOBALS->busycnt_lx2_c_1 = 0; } /* fprintf(stderr, "%lld %d %s\n", *tim, *facidx, *value); */ if(!(f->flags&(LXT2_RD_SYM_F_DOUBLE|LXT2_RD_SYM_F_STRING))) { if(f->len>1) { htemp->v.h_vector = (char *)malloc_2(f->len); memcpy(htemp->v.h_vector, *value, f->len); } else { switch(**value) { case '0': htemp->v.h_val = AN_0; break; case '1': htemp->v.h_val = AN_1; break; case 'Z': case 'z': htemp->v.h_val = AN_Z; break; default: htemp->v.h_val = AN_X; break; } } } else if(f->flags&LXT2_RD_SYM_F_DOUBLE) { #ifdef WAVE_HAS_H_DOUBLE sscanf(*value, "%lg", &htemp->v.h_double); #else double *d = malloc_2(sizeof(double)); sscanf(*value, "%lg", d); htemp->v.h_vector = (char *)d; #endif htemp->flags = HIST_REAL; } else /* string */ { char *s = malloc_2(strlen(*value)+1); strcpy(s, *value); htemp->v.h_vector = s; htemp->flags = HIST_REAL|HIST_STRING; } htemp->time = (*tim) * (GLOBALS->time_scale); if(l2e->histent_head) { l2e->histent_curr->next = htemp; l2e->histent_curr = htemp; } else { l2e->histent_head = l2e->histent_curr = htemp; } l2e->numtrans++; } /* * this is the black magic that handles aliased signals... */ static void lx2_resolver(nptr np, nptr resolve) { np->extvals = resolve->extvals; np->msi = resolve->msi; np->lsi = resolve->lsi; memcpy(&np->head, &resolve->head, sizeof(struct HistEnt)); np->curr = resolve->curr; np->harray = resolve->harray; np->numhist = resolve->numhist; np->mv.mvlfac=NULL; } /* * actually import an lx2 trace but don't do it if it's already been imported */ void import_lx2_trace(nptr np) { struct HistEnt *htemp, *histent_tail; int len, i; struct fac *f; int txidx; nptr nold = np; switch(GLOBALS->is_lx2) { #ifdef AET2_IS_PRESENT case LXT2_IS_AET2: import_ae2_trace(np); return; #endif case LXT2_IS_VZT: import_vzt_trace(np); return; case LXT2_IS_VLIST: import_vcd_trace(np); return; case LXT2_IS_FST: import_fst_trace(np); return; case LXT2_IS_FSDB: import_extload_trace(np); return; default: break; /* fallthrough */ } if(!(f=np->mv.mvlfac)) return; /* already imported */ txidx = f - GLOBALS->mvlfacs_lx2_c_1; if(np->mv.mvlfac->flags&LXT2_RD_SYM_F_ALIAS) { txidx = lxt2_rd_get_alias_root(GLOBALS->lx2_lx2_c_1, txidx); np = GLOBALS->mvlfacs_lx2_c_1[txidx].working_node; if(!(f=np->mv.mvlfac)) { lx2_resolver(nold, np); return; /* already imported */ } } fprintf(stderr, "Import: %s\n", np->nname); /* new stuff */ len = np->mv.mvlfac->len; if(f->node_alias <= 1) /* sorry, arrays not supported, but lx2 doesn't support them yet either */ { lxt2_rd_set_fac_process_mask(GLOBALS->lx2_lx2_c_1, txidx); lxt2_rd_iter_blocks(GLOBALS->lx2_lx2_c_1, lx2_callback, NULL); lxt2_rd_clr_fac_process_mask(GLOBALS->lx2_lx2_c_1, txidx); } histent_tail = htemp = histent_calloc(); if(len>1) { htemp->v.h_vector = (char *)malloc_2(len); for(i=0;iv.h_vector[i] = AN_Z; } else { htemp->v.h_val = AN_Z; /* z */ } htemp->time = MAX_HISTENT_TIME; htemp = histent_calloc(); if(len>1) { htemp->v.h_vector = (char *)malloc_2(len); for(i=0;iv.h_vector[i] = AN_X; } else { htemp->v.h_val = AN_X; /* x */ } htemp->time = MAX_HISTENT_TIME-1; htemp->next = histent_tail; if(GLOBALS->lx2_table_lx2_c_1[txidx].histent_curr) { GLOBALS->lx2_table_lx2_c_1[txidx].histent_curr->next = htemp; htemp = GLOBALS->lx2_table_lx2_c_1[txidx].histent_head; } if(!(f->flags&(LXT2_RD_SYM_F_DOUBLE|LXT2_RD_SYM_F_STRING))) { if(len>1) { np->head.v.h_vector = (char *)malloc_2(len); for(i=0;ihead.v.h_vector[i] = AN_X; } else { np->head.v.h_val = AN_X; /* x */ } } else { np->head.flags = HIST_REAL; if(f->flags&LXT2_RD_SYM_F_STRING) np->head.flags |= HIST_STRING; } { struct HistEnt *htemp2 = histent_calloc(); htemp2->time = -1; if(len>1) { htemp2->v.h_vector = htemp->v.h_vector; } else { htemp2->v.h_val = htemp->v.h_val; } htemp2->next = htemp; htemp = htemp2; GLOBALS->lx2_table_lx2_c_1[txidx].numtrans++; } np->head.time = -2; np->head.next = htemp; np->numhist=GLOBALS->lx2_table_lx2_c_1[txidx].numtrans +2 /*endcap*/ +1 /*frontcap*/; memset(GLOBALS->lx2_table_lx2_c_1+txidx, 0, sizeof(struct lx2_entry)); /* zero it out */ np->curr = histent_tail; np->mv.mvlfac = NULL; /* it's imported and cached so we can forget it's an mvlfac now */ if(nold!=np) { lx2_resolver(nold, np); } } /* * pre-import many traces at once so function above doesn't have to iterate... */ void lx2_set_fac_process_mask(nptr np) { struct fac *f; int txidx; switch(GLOBALS->is_lx2) { #ifdef AET2_IS_PRESENT case LXT2_IS_AET2: ae2_set_fac_process_mask(np); return; #endif case LXT2_IS_VZT: vzt_set_fac_process_mask(np); return; case LXT2_IS_VLIST: vcd_set_fac_process_mask(np); return; case LXT2_IS_FST: fst_set_fac_process_mask(np); return; case LXT2_IS_FSDB: fsdb_set_fac_process_mask(np); return; default: break; /* fallthrough */ } if(!(f=np->mv.mvlfac)) return; /* already imported */ txidx = f-GLOBALS->mvlfacs_lx2_c_1; if(np->mv.mvlfac->flags&LXT2_RD_SYM_F_ALIAS) { txidx = lxt2_rd_get_alias_root(GLOBALS->lx2_lx2_c_1, txidx); np = GLOBALS->mvlfacs_lx2_c_1[txidx].working_node; if(!(np->mv.mvlfac)) return; /* already imported */ } if(np->mv.mvlfac->node_alias <= 1) /* sorry, arrays not supported, but lx2 doesn't support them yet either */ { lxt2_rd_set_fac_process_mask(GLOBALS->lx2_lx2_c_1, txidx); GLOBALS->lx2_table_lx2_c_1[txidx].np = np; } } void lx2_import_masked(void) { int txidx, i, cnt; switch(GLOBALS->is_lx2) { #ifdef AET2_IS_PRESENT case LXT2_IS_AET2: ae2_import_masked(); return; #endif case LXT2_IS_VZT: vzt_import_masked(); return; case LXT2_IS_VLIST: vcd_import_masked(); return; case LXT2_IS_FST: fst_import_masked(); return; case LXT2_IS_FSDB: fsdb_import_masked(); return; default: break; /* fallthrough */ } cnt = 0; for(txidx=0;txidxnumfacs;txidx++) { if(lxt2_rd_get_fac_process_mask(GLOBALS->lx2_lx2_c_1, txidx)) { cnt++; } } if(!cnt) return; if(cnt>100) { fprintf(stderr, LXT2_RDLOAD"Extracting %d traces\n", cnt); } set_window_busy(NULL); lxt2_rd_iter_blocks(GLOBALS->lx2_lx2_c_1, lx2_callback, NULL); set_window_idle(NULL); for(txidx=0;txidxnumfacs;txidx++) { if(lxt2_rd_get_fac_process_mask(GLOBALS->lx2_lx2_c_1, txidx)) { struct HistEnt *htemp, *histent_tail; struct fac *f = GLOBALS->mvlfacs_lx2_c_1+txidx; int len = f->len; nptr np = GLOBALS->lx2_table_lx2_c_1[txidx].np; histent_tail = htemp = histent_calloc(); if(len>1) { htemp->v.h_vector = (char *)malloc_2(len); for(i=0;iv.h_vector[i] = AN_Z; } else { htemp->v.h_val = AN_Z; /* z */ } htemp->time = MAX_HISTENT_TIME; htemp = histent_calloc(); if(len>1) { htemp->v.h_vector = (char *)malloc_2(len); for(i=0;iv.h_vector[i] = AN_X; } else { htemp->v.h_val = AN_X; /* x */ } htemp->time = MAX_HISTENT_TIME-1; htemp->next = histent_tail; if(GLOBALS->lx2_table_lx2_c_1[txidx].histent_curr) { GLOBALS->lx2_table_lx2_c_1[txidx].histent_curr->next = htemp; htemp = GLOBALS->lx2_table_lx2_c_1[txidx].histent_head; } if(!(f->flags&(LXT2_RD_SYM_F_DOUBLE|LXT2_RD_SYM_F_STRING))) { if(len>1) { np->head.v.h_vector = (char *)malloc_2(len); for(i=0;ihead.v.h_vector[i] = AN_X; } else { np->head.v.h_val = AN_X; /* x */ } } else { np->head.flags = HIST_REAL; if(f->flags&LXT2_RD_SYM_F_STRING) np->head.flags |= HIST_STRING; } { struct HistEnt *htemp2 = histent_calloc(); htemp2->time = -1; if(len>1) { htemp2->v.h_vector = htemp->v.h_vector; } else { htemp2->v.h_val = htemp->v.h_val; } htemp2->next = htemp; htemp = htemp2; GLOBALS->lx2_table_lx2_c_1[txidx].numtrans++; } np->head.time = -2; np->head.next = htemp; np->numhist=GLOBALS->lx2_table_lx2_c_1[txidx].numtrans +2 /*endcap*/ +1 /*frontcap*/; memset(GLOBALS->lx2_table_lx2_c_1+txidx, 0, sizeof(struct lx2_entry)); /* zero it out */ np->curr = histent_tail; np->mv.mvlfac = NULL; /* it's imported and cached so we can forget it's an mvlfac now */ lxt2_rd_clr_fac_process_mask(GLOBALS->lx2_lx2_c_1, txidx); } } } gtkwave-3.3.86/src/clipping.c0000664000175000017500000000423713166335473015352 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2005-2010 * * 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. */ #include "globals.h" #include #include #include #define x1 coords[0] #define y1 coords[1] #define x2 coords[2] #define y2 coords[3] #define rx1 rect[0] #define ry1 rect[1] #define rx2 rect[2] #define ry2 rect[3] int wave_lineclip(int *coords, int *rect) { int msk1, msk2; /* these comparisons assume the bounding rectangle is set up as follows: rx1 rx2 ry1 +--------+ | | ry2 +--------+ */ msk1 = (x1rx2)<<1; msk1|= (y1ry2)<<3; msk2 = (x2rx2)<<1; msk2|= (y2ry2)<<3; if(!(msk1|msk2)) return(1); /* trivial accept, all points are inside rectangle */ if(msk1&msk2) return(0); /* trivial reject, common x or y out of range */ if(y1==y2) { if(x1rx2) x1 = rx2; if(x2rx2) x2 = rx2; } else if(x1==x2) { if(y1ry2) y1 = ry2; if(y2ry2) y2 = ry2; } else { double dx1 = x1, dy1 = y1, dx2 = x2, dy2 = y2; double m = (dy2-dy1)/(dx2-dx1); double b = dy1 - m*dx1; if((x1=rx1)) { dx1 = rx1; dy1 = m*dx1 + b; } else if((x1>rx2)&&(x2<=rx2)) { dx1 = rx2; dy1 = m*dx1 + b; } if((y1=ry1)) { dy1 = ry1; dx1 = (dy1 - b) / m; } else if((y1>ry2)&&(y2<=ry2)) { dy1 = ry2; dx1 = (dy1 - b) / m; } if((x2=rx1)) { dx2 = rx1; dy2 = m*dx2 + b; } else if((x2>rx2)&&(x1<=rx2)) { dx2 = rx2; dy2 = m*dx2 + b; } if((y2=ry1)) { dy2 = ry1; dx2 = (dy2 - b) / m; } else if((y2>ry2)&&(y1<=ry2)) { dy2 = ry2; dx2 = (dy2 - b) / m; } x1 = dx1; y1 = dy1; x2 = dx2; y2 = dy2; } msk1 = (x1rx2)<<1; msk1|= (y1ry2)<<3; msk2 = (x2rx2)<<1; msk2|= (y2ry2)<<3; return(!msk1 && !msk2); /* see if points are really inside */ } gtkwave-3.3.86/src/lx2.h0000664000175000017500000000200113166335473014242 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2003-2010. * * 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. */ #include "globals.h" #ifndef WAVE_LX2RDR_H #define WAVE_LX2RDR_H #ifdef HAVE_INTTYPES_H #include #endif #include "vcd.h" #include "ae2.h" #define F_NAME_MODULUS (3) enum LXT2_Loader_Type_Encodings { LXT2_IS_INACTIVE, LXT2_IS_LXT2, LXT2_IS_VZT, LXT2_IS_AET2, LXT2_IS_VLIST, LXT2_IS_FST, LXT2_IS_FSDB }; #ifdef WAVE_USE_STRUCT_PACKING #pragma pack(push) #pragma pack(1) #endif struct lx2_entry { struct HistEnt *histent_head, *histent_curr; int numtrans; nptr np; }; #ifdef WAVE_USE_STRUCT_PACKING #pragma pack(pop) #endif TimeType lx2_main(char *fname, char *skip_start, char *skip_end); void import_lx2_trace(nptr np); void lx2_set_fac_process_mask(nptr np); void lx2_import_masked(void); #endif gtkwave-3.3.86/src/clipping.h0000664000175000017500000000117013166335473015350 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2005 * * 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. */ #ifndef WAVE_CLIP_H #define WAVE_CLIP_H /* pack points into, out of an array */ #define CLIP_PACK(z, a, b, c, d) do{z[0]=a;z[1]=b;z[2]=c;z[3]=d;}while(0) #define CLIP_UNPACK(z, a, b, c, d) do{a=z[0];b=z[1];c=z[2];d=z[3];}while(0) /* returns true if line is visible in rectangle */ int wave_lineclip(int *coords, int *rect); #endif gtkwave-3.3.86/src/bitvec.c0000664000175000017500000013705213166335473015023 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2017. * * 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. */ /* AIX may need this for alloca to work */ #if defined _AIX #pragma alloca #endif #include "globals.h" #include #include "analyzer.h" #include "symbol.h" #include "lxt.h" #include "lx2.h" #include "lxt2_read.h" #include "vcd.h" #include "extload.h" #include "debug.h" #include "bsearch.h" #include "strace.h" #include "translate.h" #include "ptranslate.h" #include "ttranslate.h" #include "main.h" #include "menu.h" #include "busy.h" #include "hierpack.h" #include /* * attempt to match top vs bottom rather than emit */ char *attempt_vecmatch_2(char *s1, char *s2) { char *s; char *p1, *p2; char *n1=NULL, *n2=NULL; int n1len = 0, n2len = 0; char *pfx = NULL; int pfxlen = 0; int pfxstate = 0; char *sfx = NULL; int sfxlen = 0; int totlen; int idx; if(!strcmp(s1, s2)) { s = malloc_2(strlen(s1)+1); strcpy(s, s1); return(s); } p1 = s1; p2 = s2; while(*p1 && *p2) { if(pfxstate==0) { if(*p1 == *p2) { pfx = p1; pfxlen = p1 - s1 + 1; p1++; p2++; continue; } if(!pfx) return(NULL); if(isdigit((int)(unsigned char)*p1)&&isdigit((int)(unsigned char)*p2)) { n1 = p1; n2 = p2; while(*p1) { if(isdigit((int)(unsigned char)*p1)) { n1len++; } else { break; } p1++; } while(*p2) { if(isdigit((int)(unsigned char)*p2)) { n2len++; } else { break; } p2++; } if(*p1 && *p2) { pfxstate = 1; sfx = p1; continue; } else { break; } } } if(pfxstate==1) { if(*p1 == *p2) { sfxlen++; p1++; p2++; continue; } else { return(NULL); } } return(NULL); } if((*p1)||(*p2)) return(NULL); if((!n1)||(!n2)) return(NULL); /* scan-build : null pointer on strcpy below */ while(pfxlen>1) /* backup if matching a sequence like 20..24 where the 2 matches outside of the left bracket */ { if(isdigit((int)(unsigned char)s1[pfxlen-1])) { pfxlen--; n1--; n1len++; n2--; n2len++; } else { break; } } totlen = pfxlen + 1 + n1len + 1 + n2len + 1 + sfxlen + 1; s = malloc_2(totlen); memcpy(s, s1, pfxlen); idx = pfxlen; if(!(pfxlen && (s1[pfxlen-1]=='['))) { s[idx] = '['; idx++; } memcpy(s+idx, n1, n1len); idx += n1len; s[idx] = ':'; idx++; memcpy(s+idx, n2, n2len); idx += n2len; if((!sfx) || (*sfx != ']')) { s[idx] = ']'; idx++; } if(sfxlen) { memcpy(s+idx, sfx, sfxlen); idx+=sfxlen; } s[idx] = 0; return(s); } char *attempt_vecmatch(char *s1, char *s2) { char *pnt = NULL; if(!s1 || !s2) { return(pnt); } else { int ns1_was_decompressed = HIER_DEPACK_ALLOC; char *ns1 = hier_decompress_flagged(s1, &ns1_was_decompressed); int ns2_was_decompressed = HIER_DEPACK_ALLOC; char *ns2 = hier_decompress_flagged(s2, &ns2_was_decompressed); if(*ns1 && *ns2) { pnt = attempt_vecmatch_2(ns1, ns2); } if(ns1_was_decompressed) free_2(ns1); if(ns2_was_decompressed) free_2(ns2); return(pnt); } } /* * mvlfac resolution */ void import_trace(nptr np) { set_window_busy(NULL); if(GLOBALS->is_lxt) { import_lxt_trace(np); } else if(GLOBALS->extload) /*needs to be ahead of is_lx2 as now can be is_lx2 with FsdbReader */ { import_extload_trace(np); } else if(GLOBALS->is_lx2) { import_lx2_trace(np); } else { fprintf(stderr, "Internal error with mvlfac trace handling, exiting.\n"); exit(255); } set_window_idle(NULL); } /* * turn a Bits structure into a vector with deltas for faster displaying */ bvptr bits2vector(struct Bits *b) { int i; int regions=0; struct Node *n; hptr *h; vptr vhead=NULL, vcurr=NULL, vadd; int numextrabytes; TimeType mintime, lasttime=-1; bvptr bitvec=NULL; TimeType tshift, tmod; int is_string; int string_len; if(!b) return(NULL); h=(hptr *)calloc_2(b->nnbits, sizeof(hptr)); numextrabytes=b->nnbits; for(i=0;innbits;i++) { n=b->nodes[i]; h[i]=&(n->head); } while(h[0]) /* should never exit through this point the way we set up histents with trailers now */ { mintime=MAX_HISTENT_TIME; vadd=(vptr)calloc_2(1,sizeof(struct VectorEnt)+numextrabytes); for(i=0;innbits;i++) /* was 1...big mistake */ { tshift = (b->attribs) ? b->attribs[i].shift : 0; if(h[i]->next) { if((h[i]->next->time >= 0) && (h[i]->next->time < MAX_HISTENT_TIME-2)) { tmod = h[i]->next->time+tshift; if(tmod < 0) tmod = 0; if(tmod > MAX_HISTENT_TIME-2) tmod = MAX_HISTENT_TIME-2; } else { tmod = h[i]->next->time; /* don't timeshift endcaps */ } if(tmod < mintime) { mintime = tmod; } } } vadd->time=lasttime; lasttime=mintime; regions++; is_string = 1; string_len = 0; for(i=0;innbits;i++) { if((h[i]->flags & HIST_STRING)) { if(h[i]->time >= 0) { if(h[i]->v.h_vector) { if((GLOBALS->loaded_file_type == GHW_FILE) && (h[i]->v.h_vector[0] == '\'') && (h[i]->v.h_vector[1]) && (h[i]->v.h_vector[2] == '\'')) { string_len++; } else { string_len += strlen(h[i]->v.h_vector); } } } } else { is_string = 0; break; } } if(is_string) { vadd->flags |= HIST_STRING; vadd=(vptr)realloc_2(vadd,sizeof(struct VectorEnt)+string_len+1); vadd->v[0] = 0; } for(i=0;innbits;i++) { unsigned char enc; tshift = (b->attribs) ? b->attribs[i].shift : 0; if(!is_string) { if((b->attribs)&&(b->attribs[i].flags & TR_INVERT)) { enc = ((unsigned char)(h[i]->v.h_val)); switch(enc) /* don't remember if it's preconverted in all cases; being conservative is OK */ { case AN_0: case '0': enc = AN_1; break; case AN_1: case '1': enc = AN_0; break; case AN_H: case 'h': case 'H': enc = AN_L; break; case AN_L: case 'l': case 'L': enc = AN_H; break; case 'x': case 'X': enc = AN_X; break; case 'z': case 'Z': enc = AN_Z; break; case 'u': case 'U': enc = AN_U; break; case 'w': case 'W': enc = AN_W; break; default: enc = enc & AN_MSK; break; } } else { enc = ((unsigned char)(h[i]->v.h_val)) & AN_MSK; } vadd->v[i] = enc; } else { if(h[i]->time >= 0) { if(h[i]->v.h_vector) { if((GLOBALS->loaded_file_type == GHW_FILE) && (h[i]->v.h_vector[0] == '\'') && (h[i]->v.h_vector[1]) && (h[i]->v.h_vector[2] == '\'')) { char ghw_str[2] = {h[i]->v.h_vector[1], 0}; strcat(vadd->v, ghw_str); } else { strcat(vadd->v, h[i]->v.h_vector); } } } } if(h[i]->next) { if((h[i]->next->time >= 0) && (h[i]->next->time < MAX_HISTENT_TIME-2)) { tmod = h[i]->next->time+tshift; if(tmod < 0) tmod = 0; if(tmod > MAX_HISTENT_TIME-2) tmod = MAX_HISTENT_TIME-2; } else { tmod = h[i]->next->time; /* don't timeshift endcaps */ } if(tmod < mintime) { mintime = tmod; } if(tmod == mintime) { h[i]=h[i]->next; } } } if(vhead) { vcurr->next=vadd; vcurr=vadd; } else { vhead=vcurr=vadd; } if(mintime==MAX_HISTENT_TIME) break; /* normal bail part */ } vadd=(vptr)calloc_2(1,sizeof(struct VectorEnt)+numextrabytes); vadd->time=MAX_HISTENT_TIME; for(i=0;iv[i]=AN_U; /* formerly 0x55 */ if(vcurr) { vcurr->next=vadd; } /* scan-build */ regions++; bitvec=(bvptr)calloc_2(1,sizeof(struct BitVector)+((regions)*sizeof(vptr))); /* ajb : found "regions" by manual inspection, changed to "regions-1" as array is already [1] */ /* C99, back to regions with [] */ strcpy(bitvec->bvname=(char *)malloc_2(strlen(b->name)+1),b->name); bitvec->nbits=b->nnbits; bitvec->numregions=regions; vcurr=vhead; for(i=0;ivectors[i]=vcurr; if(vcurr) { vcurr=vcurr->next; } /* scan-build */ } return(bitvec); } /* * Make solitary traces from wildcarded signals... */ int maketraces(char *str, char *alias, int quick_return) { char *pnt, *wild; char ch, wild_active=0; int len; int i; int made=0; unsigned int rows = 0; pnt=str; while((ch=*pnt)) { if(ch=='*') { wild_active=1; break; } pnt++; } if(!wild_active) /* short circuit wildcard evaluation with bsearch */ { struct symbol *s; nptr nexp; if(str[0]=='(') { for(i=1;;i++) { if(str[i]==0) return(0); if((str[i]==')')&&(str[i+1])) {i++; break; } } s=symfind(str+i, &rows); if(s) { nexp = ExtractNodeSingleBit(&s->n[rows], atoi(str+1)); if(nexp) { AddNode(nexp, alias); return(~0); } } return(0); } else { if((s=symfind(str, &rows))) { AddNode(&s->n[rows],alias); return(~0); } else { /* in case its a 1-bit bit-blasted signal */ char *str2; int l = strlen(str); str2 = calloc_2(1,l+4); strcpy(str2, str); str2[l] = '['; str2[l+1] = '0'; str2[l+2] = ']'; str2[l+3] = 0; if((s=symfind(str2, &rows))) { AddNode(&s->n[rows],alias); return(~0); } else return(0); } } } while(1) { pnt=str; len=0; while(1) { ch=*pnt++; if(isspace((int)(unsigned char)ch)||(!ch)) break; len++; } if(len) { wild=(char *)calloc_2(1,len+1); memcpy(wild,str,len); wave_regex_compile(wild, WAVE_REGEX_WILD); for(i=0;inumfacs;i++) { if(wave_regex_match(GLOBALS->facs[i]->name, WAVE_REGEX_WILD)) { AddNode(GLOBALS->facs[i]->n,NULL); made=~0; if(quick_return) break; } } free_2(wild); } if(!ch) break; str=pnt; } return(made); } /* * Create a vector from wildcarded signals... */ struct Bits *makevec(char *vec, char *str) { char *pnt, *pnt2, *wild=NULL; char ch, ch2, wild_active; int len, nodepnt=0; int i; struct Node *n[BITATTRIBUTES_MAX]; struct Bits *b=NULL; unsigned int rows = 0; while(1) { pnt=str; len=0; while(1) { ch=*pnt++; if(isspace((int)(unsigned char)ch)||(!ch)) break; len++; } if(len) { wild=(char *)calloc_2(1,len+1); memcpy(wild,str,len); DEBUG(printf("WILD: %s\n",wild)); wild_active=0; pnt2=wild; while((ch2=*pnt2)) { if(ch2=='*') { wild_active=1; break; } pnt2++; } if(!wild_active) /* short circuit wildcard evaluation with bsearch */ { struct symbol *s; if(wild[0]=='(') { nptr nexp; for(i=1;;i++) { if(wild[i]==0) break; if((wild[i]==')')&&(wild[i+1])) { i++; s=symfind(wild+i, &rows); if(s) { nexp = ExtractNodeSingleBit(&s->n[rows], atoi(wild+1)); if(nexp) { n[nodepnt++]=nexp; if(nodepnt==BITATTRIBUTES_MAX) { free_2(wild); goto ifnode; } } } else { char *lp = strrchr(wild+i, '['); if(lp) { char *ns = malloc_2(strlen(wild+i) + 32); char *colon = strchr(lp+1, ':'); int msi, lsi, bval, actual; *lp = 0; bval = atoi(wild+1); if(colon) { msi = atoi(lp+1); lsi = atoi(colon+1); if(lsi > msi) { actual = msi + bval; } else { actual = msi - bval; } } else { actual = bval; /* punt */ } sprintf(ns, "%s[%d]", wild+i, actual); *lp = '['; s=symfind(ns, &rows); if(s) { nexp =&s->n[rows]; if(nexp) { n[nodepnt++]=nexp; if(nodepnt==BITATTRIBUTES_MAX) { free_2(wild); goto ifnode; } } } free_2(ns); } } break; } } } else { if((s=symfind(wild, &rows))) { n[nodepnt++]=&s->n[rows]; if(nodepnt==BITATTRIBUTES_MAX) { free_2(wild); goto ifnode; } } } } else { wave_regex_compile(wild, WAVE_REGEX_WILD); for(i=GLOBALS->numfacs-1;i>=0;i--) /* to keep vectors in little endian hi..lo order */ { if(wave_regex_match(GLOBALS->facs[i]->name, WAVE_REGEX_WILD)) { n[nodepnt++]=GLOBALS->facs[i]->n; if(nodepnt==BITATTRIBUTES_MAX) { free_2(wild); goto ifnode; } } } } free_2(wild); } if(!ch) break; str=pnt; } ifnode: if(nodepnt) { b=(struct Bits *)calloc_2(1,sizeof(struct Bits)+(nodepnt)*sizeof(struct Node *)); for(i=0;inodes[i]=n[i]; if(n[i]->mv.mvlfac) import_trace(n[i]); } b->nnbits=nodepnt; strcpy(b->name=(char *)malloc_2(strlen(vec)+1),vec); } return(b); } /* * Create an annotated (b->attribs) vector from stranded signals... */ struct Bits *makevec_annotated(char *vec, char *str) { char *pnt, *wild=NULL; char ch; int len, nodepnt=0; int i; struct Node *n[BITATTRIBUTES_MAX]; struct BitAttributes ba[BITATTRIBUTES_MAX]; struct Bits *b=NULL; int state = 0; unsigned int rows = 0; memset(ba, 0, sizeof(ba)); /* scan-build */ while(1) { pnt=str; len=0; while(1) { ch=*pnt++; if(isspace((int)(unsigned char)ch)||(!ch)) break; len++; } if(len) { wild=(char *)calloc_2(1,len+1); memcpy(wild,str,len); DEBUG(printf("WILD: %s\n",wild)); if(state==1) { ba[nodepnt-1].shift = atoi_64(wild); state++; goto fw; } else if(state==2) { sscanf(wild, "%x", &ba[nodepnt-1].flags); state = 0; goto fw; } state++; /* no wildcards for annotated! */ { struct symbol *s; if(nodepnt==BITATTRIBUTES_MAX) { free_2(wild); goto ifnode; } if(wild[0]=='(') { nptr nexp; for(i=1;;i++) { if(wild[i]==0) break; if((wild[i]==')')&&(wild[i+1])) { i++; s=symfind(wild+i, &rows); if(s) { nexp = ExtractNodeSingleBit(&s->n[rows], atoi(wild+1)); if(nexp) { n[nodepnt++]=nexp; if(nodepnt==BITATTRIBUTES_MAX) { free_2(wild); goto ifnode; } } } else { char *lp = strrchr(wild+i, '['); if(lp) { char *ns = malloc_2(strlen(wild+i) + 32); char *colon = strchr(lp+1, ':'); int msi, lsi, bval, actual; *lp = 0; bval = atoi(wild+1); if(colon) { msi = atoi(lp+1); lsi = atoi(colon+1); if(lsi > msi) { actual = msi + bval; } else { actual = msi - bval; } } else { actual = bval; /* punt */ } sprintf(ns, "%s[%d]", wild+i, actual); *lp = '['; s=symfind(ns, &rows); if(s) { nexp =&s->n[rows]; if(nexp) { n[nodepnt++]=nexp; if(nodepnt==BITATTRIBUTES_MAX) { free_2(wild); goto ifnode; } } } free_2(ns); } } break; } } } else { if((s=symfind(wild, &rows))) { n[nodepnt++]=&s->n[rows]; } } } fw: free_2(wild); } if(!ch) break; str=pnt; } ifnode: if(nodepnt) { b=(struct Bits *)calloc_2(1,sizeof(struct Bits)+(nodepnt)*sizeof(struct Node *)); b->attribs = calloc_2(nodepnt, sizeof(struct BitAttributes)); for(i=0;inodes[i]=n[i]; if(n[i]->mv.mvlfac) import_trace(n[i]); b->attribs[i].shift = ba[i].shift; b->attribs[i].flags = ba[i].flags; } b->nnbits=nodepnt; strcpy(b->name=(char *)malloc_2(strlen(vec)+1),vec); } return(b); } /* * Create a vector from selected_status signals... */ struct Bits *makevec_selected(char *vec, int numrows, char direction) { int nodepnt=0; int i; struct Node *n[BITATTRIBUTES_MAX]; struct Bits *b=NULL; if(!direction) for(i=GLOBALS->numfacs-1;i>=0;i--) /* to keep vectors in hi..lo order */ { if(get_s_selected(GLOBALS->facs[i])) { n[nodepnt++]=GLOBALS->facs[i]->n; if((nodepnt==BITATTRIBUTES_MAX)||(numrows==nodepnt)) break; } } else for(i=0;inumfacs;i++) /* to keep vectors in lo..hi order */ { if(get_s_selected(GLOBALS->facs[i])) { n[nodepnt++]=GLOBALS->facs[i]->n; if((nodepnt==BITATTRIBUTES_MAX)||(numrows==nodepnt)) break; } } if(nodepnt) { b=(struct Bits *)calloc_2(1,sizeof(struct Bits)+(nodepnt)*sizeof(struct Node *)); for(i=0;inodes[i]=n[i]; if(n[i]->mv.mvlfac) import_trace(n[i]); } b->nnbits=nodepnt; strcpy(b->name=(char *)malloc_2(strlen(vec)+1),vec); } return(b); } /* * add vector made in previous function */ int add_vector_selected(char *alias, int numrows, char direction) { bvptr v=NULL; bptr b=NULL; if((b=makevec_selected(alias, numrows, direction))) { if((v=bits2vector(b))) { v->bits=b; /* only needed for savefile function */ AddVector(v, NULL); free_2(b->name); b->name=NULL; return(v!=NULL); } else { free_2(b->name); if(b->attribs) free_2(b->attribs); free_2(b); } } return(v!=NULL); } /***********************************************************************************/ /* * Create a vector from a range of signals...currently the single * bit facility_name[x] case never gets hit, but may be used in the * future... */ struct Bits *makevec_chain(char *vec, struct symbol *sym, int len) { int nodepnt=0, nodepnt_rev; int i; struct Node **n; struct Bits *b=NULL; struct symbol *symhi = NULL, *symlo = NULL; char hier_delimeter2; if(!GLOBALS->vcd_explicit_zero_subscripts) /* 0==yes, -1==no */ { hier_delimeter2=GLOBALS->hier_delimeter; } else { hier_delimeter2='['; } n=(struct Node **)wave_alloca(len*sizeof(struct Node *)); memset(n, 0, len*sizeof(struct Node *)); /* scan-build */ if(!GLOBALS->autocoalesce_reversal) /* normal case for MTI */ { symhi=sym; while(sym) { symlo=sym; n[nodepnt++]=sym->n; sym=sym->vec_chain; } } else /* for verilog XL */ { nodepnt_rev=len; symlo=sym; while(sym) { nodepnt++; symhi=sym; n[--nodepnt_rev]=sym->n; sym=sym->vec_chain; } } if(nodepnt) { b=(struct Bits *)calloc_2(1,sizeof(struct Bits)+(nodepnt)*sizeof(struct Node *)); for(i=0;inodes[i]=n[i]; if(n[i]->mv.mvlfac) import_trace(n[i]); } b->nnbits=nodepnt; if(vec) { strcpy(b->name=(char *)malloc_2(strlen(vec)+1),vec); } else { char *s1, *s2; int s1_was_packed = HIER_DEPACK_ALLOC, s2_was_packed = HIER_DEPACK_ALLOC; int root1len=0, root2len=0; int l1, l2; s1=symhi->n->nname; s2=symlo->n->nname; if(GLOBALS->do_hier_compress) { s1 = hier_decompress_flagged(s1, &s1_was_packed); s2 = hier_decompress_flagged(s2, &s2_was_packed); } l1=strlen(s1); for(i=l1-1;i>=0;i--) { if(s1[i]==hier_delimeter2) { root1len=i+1; break; } } l2=strlen(s2); for(i=l2-1;i>=0;i--) { if(s2[i]==hier_delimeter2) { root2len=i+1; break; } } if((root1len!=root2len)||(!root1len)||(!root2len)|| (strncasecmp(s1,s2,root1len))) { if(symlo!=symhi) { if(!b->attribs) { char *aname = attempt_vecmatch(s1, s2); if(aname) b->name = aname; else { strcpy(b->name=(char *)malloc_2(8+1),""); } } else { char *aname = attempt_vecmatch(s1, s2); if(aname) b->name = aname; else { strcpy(b->name=(char *)malloc_2(15+1),""); } } } else { strcpy(b->name=(char *)malloc_2(l1+1),s1); } } else { int add1, add2, totallen; add1=l1-root1len; add2=l2-root2len; if(GLOBALS->vcd_explicit_zero_subscripts==-1) { add1--; add2--; } if(symlo!=symhi) { unsigned char fixup1 = 0, fixup2 = 0; totallen= root1len -1 /* zap HIER_DELIMETER */ +1 /* add [ */ +add1 /* left value */ +1 /* add : */ +add2 /* right value */ +1 /* add ] */ +1 /* add 0x00 */ ; if(GLOBALS->vcd_explicit_zero_subscripts==-1) { fixup1=*(s1+l1-1); *(s1+l1-1)=0; fixup2=*(s2+l2-1); *(s2+l2-1)=0; } b->name=(char *)malloc_2(totallen); strncpy(b->name,s1,root1len-1); sprintf(b->name+root1len-1,"[%s:%s]",s1+root1len, s2+root2len); if(GLOBALS->vcd_explicit_zero_subscripts==-1) { *(s1+l1-1)=fixup1; *(s2+l2-1)=fixup2; } } else { unsigned char fixup1 = 0; totallen= root1len -1 /* zap HIER_DELIMETER */ +1 /* add [ */ +add1 /* left value */ +1 /* add ] */ +1 /* add 0x00 */ ; if(GLOBALS->vcd_explicit_zero_subscripts==-1) { fixup1=*(s1+l1-1); *(s1+l1-1)=0; } b->name=(char *)malloc_2(totallen); strncpy(b->name,s1,root1len-1); sprintf(b->name+root1len-1,"[%s]",s1+root1len); if(GLOBALS->vcd_explicit_zero_subscripts==-1) { *(s1+l1-1)=fixup1; } } } if(GLOBALS->do_hier_compress) { if(s2_was_packed) free_2(s2); if(s1_was_packed) free_2(s1); } } } return(b); } /* * add vector made in previous function */ int add_vector_chain(struct symbol *s, int len) { bvptr v=NULL; bptr b=NULL; if(len>1) { if((b=makevec_chain(NULL, s, len))) { if((v=bits2vector(b))) { v->bits=b; /* only needed for savefile function */ AddVector(v, NULL); free_2(b->name); b->name=NULL; return(v!=NULL); } else { free_2(b->name); if(b->attribs) free_2(b->attribs); free_2(b); } } return(v!=NULL); } else { return(AddNode(s->n,NULL)); } } /***********************************************************************************/ /* * Create a vector from a range of signals...currently the single * bit facility_name[x] case never gets hit, but may be used in the * future... */ struct Bits *makevec_range(char *vec, int lo, int hi, char direction) { int nodepnt=0; int i; struct Node *n[BITATTRIBUTES_MAX]; struct Bits *b=NULL; if(!direction) for(i=hi;i>=lo;i--) /* to keep vectors in hi..lo order */ { n[nodepnt++]=GLOBALS->facs[i]->n; if(nodepnt==BITATTRIBUTES_MAX) break; } else for(i=lo;i<=hi;i++) /* to keep vectors in lo..hi order */ { n[nodepnt++]=GLOBALS->facs[i]->n; if(nodepnt==BITATTRIBUTES_MAX) break; } if(nodepnt) { b=(struct Bits *)calloc_2(1,sizeof(struct Bits)+(nodepnt)*sizeof(struct Node *)); for(i=0;inodes[i]=n[i]; if(n[i]->mv.mvlfac) import_trace(n[i]); } b->nnbits=nodepnt; if(vec) { strcpy(b->name=(char *)malloc_2(strlen(vec)+1),vec); } else { char *s1, *s2; int s1_was_packed = HIER_DEPACK_ALLOC, s2_was_packed = HIER_DEPACK_ALLOC; int root1len=0, root2len=0; int l1, l2; if(!direction) { s1=GLOBALS->facs[hi]->n->nname; s2=GLOBALS->facs[lo]->n->nname; } else { s1=GLOBALS->facs[lo]->n->nname; s2=GLOBALS->facs[hi]->n->nname; } if(GLOBALS->do_hier_compress) { s1 = hier_decompress_flagged(s1, &s1_was_packed); s2 = hier_decompress_flagged(s2, &s2_was_packed); } l1=strlen(s1); for(i=l1-1;i>=0;i--) { if(s1[i]==GLOBALS->hier_delimeter) { root1len=i+1; break; } } l2=strlen(s2); for(i=l2-1;i>=0;i--) { if(s2[i]==GLOBALS->hier_delimeter) { root2len=i+1; break; } } if((root1len!=root2len)||(!root1len)||(!root2len)|| (strncasecmp(s1,s2,root1len))) { if(lo!=hi) { if(!b->attribs) { char *aname = attempt_vecmatch(s1, s2); if(aname) b->name = aname; else { strcpy(b->name=(char *)malloc_2(8+1),""); } } else { char *aname = attempt_vecmatch(s1, s2); if(aname) b->name = aname; else { strcpy(b->name=(char *)malloc_2(15+1),""); } } } else { strcpy(b->name=(char *)malloc_2(l1+1),s1); } } else { int add1, add2, totallen; add1=l1-root1len; add2=l2-root2len; if(lo!=hi) { totallen= root1len -1 /* zap HIER_DELIMETER */ +1 /* add [ */ +add1 /* left value */ +1 /* add : */ +add2 /* right value */ +1 /* add ] */ +1 /* add 0x00 */ ; b->name=(char *)malloc_2(totallen); strncpy(b->name,s1,root1len-1); sprintf(b->name+root1len-1,"[%s:%s]",s1+root1len, s2+root2len); } else { totallen= root1len -1 /* zap HIER_DELIMETER */ +1 /* add [ */ +add1 /* left value */ +1 /* add ] */ +1 /* add 0x00 */ ; b->name=(char *)malloc_2(totallen); strncpy(b->name,s1,root1len-1); sprintf(b->name+root1len-1,"[%s]",s1+root1len); } } if(GLOBALS->do_hier_compress) { if(s2_was_packed) free_2(s2); if(s1_was_packed) free_2(s1); } } } return(b); } /* * add vector made in previous function */ int add_vector_range(char *alias, int lo, int hi, char direction) { bvptr v=NULL; bptr b=NULL; if(lo!=hi) { if((b=makevec_range(alias, lo, hi, direction))) { if((v=bits2vector(b))) { v->bits=b; /* only needed for savefile function */ AddVector(v, NULL); free_2(b->name); b->name=NULL; return(v!=NULL); } else { free_2(b->name); if(b->attribs) free_2(b->attribs); free_2(b); } } return(v!=NULL); } else { return(AddNode(GLOBALS->facs[lo]->n,NULL)); } } /* * splits facility name into signal and bitnumber */ void facsplit(char *str, int *len, int *number) { char *ptr; char *numptr=NULL; char ch; ptr=str; while((ch=*ptr)) { if((ch>='0')&&(ch<='9')) { if(!numptr) numptr=ptr; } else numptr=NULL; ptr++; } if(numptr) { *number=atoi(numptr); *len=numptr-str; } else { *number=0; *len=ptr-str; } } /* * compares two facilities a la strcmp but preserves * numbers for comparisons * * there are two flavors..the slow and accurate to any * arbitrary number of digits version (first) and the * fast one good to 2**31-1. we default to the faster * version since there's probably no real need to * process ints larger than two billion anyway... */ #ifdef WAVE_USE_SIGCMP_INFINITE_PRECISION #if __STDC_VERSION__ < 199901L inline #endif int sigcmp_2(char *s1, char *s2) { char *n1, *n2; unsigned char c1, c2; int len1, len2; for(;;) { c1=(unsigned char)*s1; c2=(unsigned char)*s2; if((c1==0)&&(c2==0)) return(0); if((c1>='0')&&(c1<='9')&&(c2>='0')&&(c2<='9')) { n1=s1; n2=s2; len1=len2=0; do { len1++; c1=(unsigned char)*(n1++); } while((c1>='0')&&(c1<='9')); if(!c1) n1--; do { len2++; c2=(unsigned char)*(n2++); } while((c2>='0')&&(c2<='9')); if(!c2) n2--; do { if(len1==len2) { c1=(unsigned char)*(s1++); len1--; c2=(unsigned char)*(s2++); len2--; } else if(len1='0')&&(c1>='0')) { u1=(int)(c1&15); u2=(int)(c2&15); while(((c2=(unsigned char)*s2)>='0')&&(c2<='9')) { u2*=10; u2+=(unsigned int)(c2&15); s2++; } while(((c2=(unsigned char)*s1)>='0')&&(c2<='9')) { u1*=10; u1+=(unsigned int)(c2&15); s1++; } if(u1==u2) continue; else return((int)u1-(int)u2); } else { if(c1!=c2) return((int)c1-(int)c2); } } } #endif int sigcmp(char *s1, char *s2) { int rc = sigcmp_2(s1, s2); if(!rc) { rc = strcmp(s1, s2); /* to handle leading zero "0" vs "00" cases ... we provide a definite order so bsearch doesn't fail */ } return(rc); } #ifndef __linux__ /* * heapsort algorithm. this typically outperforms quicksort. note * that glibc will use a modified mergesort if memory is available, so * under linux use the stock qsort instead. */ static struct symbol **hp; static void heapify(int i, int heap_size) { int l, r; int largest; struct symbol *t; int maxele=heap_size/2-1; /* points to where heapswaps don't matter anymore */ for(;;) { l=2*i+1; r=l+1; if((lname,hp[i]->name)>0)) { largest=l; } else { largest=i; } if((rname,hp[largest]->name)>0)) { largest=r; } if(i!=largest) { t=hp[i]; hp[i]=hp[largest]; hp[largest]=t; if(largest<=maxele) { i=largest; } else { break; } } else { break; } } } void wave_heapsort(struct symbol **a, int num) { int i; int indx=num-1; struct symbol *t; hp=a; for(i=(num/2-1);i>0;i--) /* build facs into having heap property */ { heapify(i,num); } for(;;) { if(indx) heapify(0,indx+1); DEBUG(printf("%s\n", a[0]->name)); if(indx!=0) { t=a[0]; /* sort in place by doing a REVERSE sort and */ a[0]=a[indx]; /* swapping the front and back of the tree.. */ a[indx--]=t; } else { break; } } } #else static int qssigcomp(const void *v1, const void *v2) { struct symbol *a1 = *((struct symbol **)v1); struct symbol *a2 = *((struct symbol **)v2); return(sigcmp(a1->name, a2->name)); } void wave_heapsort(struct symbol **a, int num) { qsort(a, num, sizeof(struct symbol *), qssigcomp); } #endif /* * Malloc/Create a name from a range of signals starting from vec_root...currently the single * bit facility_name[x] case never gets hit, but may be used in the * future... */ char *makename_chain(struct symbol *sym) { int i; struct symbol *symhi = NULL, *symlo = NULL; char hier_delimeter2; char *name=NULL; char *s1, *s2; int s1_was_packed = HIER_DEPACK_ALLOC, s2_was_packed = HIER_DEPACK_ALLOC; int root1len=0, root2len=0; int l1, l2; if(!sym) { fprintf(stderr, "Internal error '%s' line %d, exiting.\n", __FILE__, __LINE__); exit(255); } if(!GLOBALS->vcd_explicit_zero_subscripts) /* 0==yes, -1==no */ { hier_delimeter2=GLOBALS->hier_delimeter; } else { hier_delimeter2='['; } if(!GLOBALS->autocoalesce_reversal) /* normal case for MTI */ { symhi=sym; symlo=sym; /* scan-build */ while(sym) { symlo=sym; sym=sym->vec_chain; } } else /* for verilog XL */ { symlo=sym; symhi=sym; /* scan-build */ while(sym) { symhi=sym; sym=sym->vec_chain; } } s1=hier_decompress_flagged(symhi->n->nname, &s1_was_packed); s2=hier_decompress_flagged(symlo->n->nname, &s2_was_packed); l1=strlen(s1); for(i=l1-1;i>=0;i--) { if(s1[i]==hier_delimeter2) { root1len=i+1; break; } } l2=strlen(s2); for(i=l2-1;i>=0;i--) { if(s2[i]==hier_delimeter2) { root2len=i+1; break; } } if((root1len!=root2len)||(!root1len)||(!root2len)|| (strncasecmp(s1,s2,root1len))) { if(symlo!=symhi) { char *aname = attempt_vecmatch(s1, s2); if(aname) name = aname; else { strcpy(name=(char *)malloc_2(8+1),""); } } else { strcpy(name=(char *)malloc_2(l1+1),s1); } } else { int add1, add2, totallen; add1=l1-root1len; add2=l2-root2len; if(GLOBALS->vcd_explicit_zero_subscripts==-1) { add1--; add2--; } if(symlo!=symhi) { unsigned char fixup1 = 0, fixup2 = 0; totallen= root1len -1 /* zap HIER_DELIMETER */ +1 /* add [ */ +add1 /* left value */ +1 /* add : */ +add2 /* right value */ +1 /* add ] */ +1 /* add 0x00 */ ; if(GLOBALS->vcd_explicit_zero_subscripts==-1) { fixup1=*(s1+l1-1); *(s1+l1-1)=0; fixup2=*(s2+l2-1); *(s2+l2-1)=0; } name=(char *)malloc_2(totallen); strncpy(name,s1,root1len-1); sprintf(name+root1len-1,"[%s:%s]",s1+root1len, s2+root2len); if(GLOBALS->vcd_explicit_zero_subscripts==-1) { *(s1+l1-1)=fixup1; *(s2+l2-1)=fixup2; } } else { unsigned char fixup1 = 0; totallen= root1len -1 /* zap HIER_DELIMETER */ +1 /* add [ */ +add1 /* left value */ +1 /* add ] */ +1 /* add 0x00 */ ; if(GLOBALS->vcd_explicit_zero_subscripts==-1) { fixup1=*(s1+l1-1); *(s1+l1-1)=0; } name=(char *)malloc_2(totallen); strncpy(name,s1,root1len-1); sprintf(name+root1len-1,"[%s]",s1+root1len); if(GLOBALS->vcd_explicit_zero_subscripts==-1) { *(s1+l1-1)=fixup1; } } } if(s1_was_packed) { free_2(s1); } if(s2_was_packed) { free_2(s2); } return(name); } /******************************************************************/ eptr ExpandNode(nptr n) { int width; int msb, lsb, delta; int actual; hptr h, htemp; int i, j; nptr *narray; char *nam; int offset, len; eptr rc=NULL; exptr exp1; int row_hi = 0, row_lo = 0, new_msi = 0, new_lsi = 0; int row_delta = 0, bit_delta = 0; int curr_row = 0, curr_bit = 0; int is_2d = 0; if(n->mv.mvlfac) import_trace(n); if(!n->extvals) { DEBUG(fprintf(stderr, "Nothing to expand\n")); } else { char *namex; int was_packed = HIER_DEPACK_ALLOC; msb = n->msi; lsb = n->lsi; if(msb>lsb) { width = msb - lsb + 1; delta = -1; } else { width = lsb - msb + 1; delta = 1; } actual = msb; narray=(nptr *)malloc_2(width*sizeof(nptr)); rc = malloc_2(sizeof(ExpandInfo)); rc->narray = narray; rc->msb = msb; rc->lsb = lsb; rc->width = width; if(GLOBALS->do_hier_compress) { namex = hier_decompress_flagged(n->nname, &was_packed); } else { namex = n->nname; } offset = strlen(namex); for(i=offset-1;i>=0;i--) { if(namex[i]=='[') break; } if(i>-1) offset=i; if(i>3) { if(namex[i-1]==']') { int colon_seen = 0; j = i-2; for(;j>=0;j--) { if(namex[j]=='[') break; if(namex[j]==':') colon_seen = 1; } if((j>-1)&&(colon_seen)) { int items = sscanf(namex+j, "[%d:%d][%d:%d]", &row_hi, &row_lo, &new_msi, &new_lsi); if(items == 4) { /* printf(">> %d %d %d %d (items = %d)\n", row_hi, row_lo, new_msi, new_lsi, items); */ row_delta = (row_hi > row_lo) ? -1 : 1; bit_delta = (new_msi > new_lsi) ? -1 : 1; curr_row = row_hi; curr_bit = new_msi; is_2d = (((row_lo - row_hi) * row_delta) + 1) * (((new_lsi - new_msi) * bit_delta) + 1) == width; if(is_2d) offset = j; } } } } nam=(char *)wave_alloca(offset+20+30); memcpy(nam, namex, offset); if(was_packed) { free_2(namex); } if(!n->harray) /* make quick array lookup for aet display--normally this is done in addnode */ { hptr histpnt; int histcount; hptr *harray; histpnt=&(n->head); histcount=0; while(histpnt) { histcount++; histpnt=histpnt->next; } n->numhist=histcount; if(!(n->harray=harray=(hptr *)malloc_2(histcount*sizeof(hptr)))) { fprintf( stderr, "Out of memory, can't add to analyzer\n"); return(NULL); } histpnt=&(n->head); for(i=0;inext; } } h=&(n->head); while(h) { if(h->flags & (HIST_REAL|HIST_STRING)) return(NULL); h=h->next; } DEBUG(fprintf(stderr, "Expanding: (%d to %d) for %d bits over %d entries.\n", msb, lsb, width, n->numhist)); for(i=0;iarray_height) { len = offset + strlen(nam+offset); sprintf(nam+len, "{%d}", n->this_row); } #endif len = offset + strlen(nam+offset); narray[i]->nname = (char *)malloc_2(len+1); strcpy(narray[i]->nname, nam); exp1 = (exptr) calloc_2(1, sizeof(struct ExpandReferences)); exp1->parent=n; /* point to parent */ exp1->parentbit=i; exp1->actual = actual; actual += delta; narray[i]->expansion = exp1; /* can be safely deleted if expansion set like here */ } for(i=0;inumhist;i++) { h=n->harray[i]; if((h->timemin_time)||(h->time>GLOBALS->max_time)) { for(j=0;jcurr) { htemp = (hptr) calloc_2(1, sizeof(struct HistEnt)); htemp->v.h_val = AN_X; /* 'x' */ htemp->time = h->time; narray[j]->curr->next = htemp; narray[j]->curr = htemp; } else { narray[j]->head.v.h_val = AN_X; /* 'x' */ narray[j]->head.time = h->time; narray[j]->curr = &(narray[j]->head); } narray[j]->numhist++; } } else { for(j=0;jv.h_vector[j]; switch(val) { case '0': val = AN_0; break; case '1': val = AN_1; break; case 'x': case 'X': val = AN_X; break; case 'z': case 'Z': val = AN_Z; break; case 'h': case 'H': val = AN_H; break; case 'l': case 'L': val = AN_L; break; case 'u': case 'U': val = AN_U; break; case 'w': case 'W': val = AN_W; break; case '-': val = AN_DASH; break; default: break; /* leave val alone as it's been converted already.. */ } if(narray[j]->curr->v.h_val != val) /* curr will have been established already by 'x' at time: -1 */ { htemp = (hptr) calloc_2(1, sizeof(struct HistEnt)); htemp->v.h_val = val; htemp->time = h->time; narray[j]->curr->next = htemp; narray[j]->curr = htemp; narray[j]->numhist++; } } } } for(i=0;iharray = (hptr *)calloc_2(narray[i]->numhist, sizeof(hptr)); htemp = &(narray[i]->head); for(j=0;jnumhist;j++) { narray[i]->harray[j] = htemp; htemp = htemp->next; } } } return(rc); } /******************************************************************/ nptr ExtractNodeSingleBit(nptr n, int bit) { int lft, rgh; hptr h, htemp; int i, j; int actual; nptr np; char *nam; int offset, len, width; exptr exp1; int row_hi = 0, row_lo = 0, new_msi = 0, new_lsi = 0; int row_delta = 0, bit_delta = 0; int curr_row = 0, curr_bit = 0; int is_2d = 0; if(n->mv.mvlfac) import_trace(n); if(!n->extvals) { DEBUG(fprintf(stderr, "Nothing to expand\n")); return(NULL); } else { char *namex; int was_packed = HIER_DEPACK_ALLOC; if(n->lsi > n->msi) { width = n->lsi - n->msi + 1; rgh = n->lsi; lft = n->msi; actual = n->msi + bit; } else { width = n->msi - n->lsi + 1; rgh = n->msi; lft = n->lsi; actual = n->msi - bit; } if((actual>rgh)||(actualdo_hier_compress) { namex = hier_decompress_flagged(n->nname, &was_packed); } else { namex = n->nname; } offset = strlen(namex); for(i=offset-1;i>=0;i--) { if(namex[i]=='[') break; } if(i>-1) offset=i; if(i>3) { if(namex[i-1]==']') { int colon_seen = 0; j = i-2; for(;j>=0;j--) { if(namex[j]=='[') break; if(namex[j]==':') colon_seen = 1; } if((j>-1)&&(colon_seen)) { int items = sscanf(namex+j, "[%d:%d][%d:%d]", &row_hi, &row_lo, &new_msi, &new_lsi); if(items == 4) { /* printf("bit >> %d %d %d %d (items = %d)\n", row_hi, row_lo, new_msi, new_lsi, items); */ row_delta = (row_hi > row_lo) ? -1 : 1; bit_delta = (new_msi > new_lsi) ? -1 : 1; curr_row = row_hi; curr_bit = new_msi; is_2d = (((row_lo - row_hi) * row_delta) + 1) * (((new_lsi - new_msi) * bit_delta) + 1) == width; if(is_2d) offset = j; } } } } nam=(char *)wave_alloca(offset+20); memcpy(nam, namex, offset); if(was_packed) { free_2(namex); } if(!n->harray) /* make quick array lookup for aet display--normally this is done in addnode */ { hptr histpnt; int histcount; hptr *harray; histpnt=&(n->head); histcount=0; while(histpnt) { histcount++; histpnt=histpnt->next; } n->numhist=histcount; if(!(n->harray=harray=(hptr *)malloc_2(histcount*sizeof(hptr)))) { DEBUG(fprintf( stderr, "Out of memory, can't add to analyzer\n")); return(NULL); } histpnt=&(n->head); for(i=0;inext; } } h=&(n->head); while(h) { if(h->flags & (HIST_REAL|HIST_STRING)) return(NULL); h=h->next; } DEBUG(fprintf(stderr, "Extracting: (%d to %d) for offset #%d over %d entries.\n", n->msi, n->lsi, bit, n->numhist)); np = (nptr)calloc_2(1, sizeof(struct Node)); if(!is_2d) { sprintf(nam+offset, "[%d]", actual); } else { for(i=0;iarray_height) { len = offset + strlen(nam+offset); sprintf(nam+len, "{%d}", n->this_row); } #endif len = offset + strlen(nam+offset); np->nname = (char *)malloc_2(len+1); strcpy(np->nname, nam); exp1 = (exptr) calloc_2(1, sizeof(struct ExpandReferences)); exp1->parent=n; /* point to parent */ exp1->parentbit=bit; exp1->actual=actual; /* actual bitnum in [] */ np->expansion = exp1; /* can be safely deleted if expansion set like here */ for(i=0;inumhist;i++) { h=n->harray[i]; if((h->timemin_time)||(h->time>GLOBALS->max_time)) { if(np->curr) { htemp = (hptr) calloc_2(1, sizeof(struct HistEnt)); htemp->v.h_val = AN_X; /* 'x' */ htemp->time = h->time; np->curr->next = htemp; np->curr = htemp; } else { np->head.v.h_val = AN_X; /* 'x' */ np->head.time = h->time; np->curr = &(np->head); } np->numhist++; } else { unsigned char val = h->v.h_vector[bit]; switch(val) { case '0': val = AN_0; break; case '1': val = AN_1; break; case 'x': case 'X': val = AN_X; break; case 'z': case 'Z': val = AN_Z; break; case 'h': case 'H': val = AN_H; break; case 'l': case 'L': val = AN_L; break; case 'u': case 'U': val = AN_U; break; case 'w': case 'W': val = AN_W; break; case '-': val = AN_DASH; break; default: break; /* leave val alone as it's been converted already.. */ } if(np->curr->v.h_val != val) /* curr will have been established already by 'x' at time: -1 */ { htemp = (hptr) calloc_2(1, sizeof(struct HistEnt)); htemp->v.h_val = val; htemp->time = h->time; np->curr->next = htemp; np->curr = htemp; np->numhist++; } } } np->harray = (hptr *)calloc_2(np->numhist, sizeof(hptr)); htemp = &(np->head); for(j=0;jnumhist;j++) { np->harray[j] = htemp; htemp = htemp->next; } return(np); } } /******************************************************************/ /* * this only frees nodes created via expansion in ExpandNode() functions above! */ void DeleteNode(nptr n) { int i; if(n->expansion) { if(n->expansion->refcnt==0) { for(i=1;inumhist;i++) /* 1st is actually part of the Node! */ { free_2(n->harray[i]); } free_2(n->harray); free_2(n->expansion); free_2(n->nname); free_2(n); } else { n->expansion->refcnt--; } } } gtkwave-3.3.86/src/hiersearch.c0000664000175000017500000007364213166335473015670 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2011. * * 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. */ /* AIX may need this for alloca to work */ #if defined _AIX #pragma alloca #endif #include "globals.h" #include #include #include "gtk12compat.h" #include "analyzer.h" #include "symbol.h" #include "lx2.h" #include "vcd.h" #include "busy.h" #include "debug.h" int hier_searchbox_is_active(void) { return(GLOBALS->is_active_hiersearch_c_1); } void refresh_hier_tree(struct tree *t) { struct tree *t2; GtkCList *cl; int len; int row; int pixlen=0, maxpixlen=0; static char *dotdot=".."; struct treechain *tc; gtk_clist_freeze(cl=GTK_CLIST(GLOBALS->clist_hiersearch_c_1)); gtk_clist_clear(cl); GLOBALS->num_rows_hiersearch_c_1=0; if(t!=GLOBALS->treeroot) { maxpixlen=font_engine_string_measure(GLOBALS->signalfont,(gchar *)(dotdot)); } if(!GLOBALS->hier_grouping) { char *tmp, *tmp2, *tmp3; t2=t; while(t2) { { if(t2->child) { tmp=wave_alloca(strlen(t2->name)+5); strcpy(tmp, "(+) "); strcpy(tmp+4, t2->name); } else if(t2->t_which >= 0) { if(GLOBALS->facs[t2->t_which]->vec_root) { if(GLOBALS->autocoalesce) { if(GLOBALS->facs[t2->t_which]->vec_root!=GLOBALS->facs[t2->t_which]) { t2=t2->next; continue; } tmp2=makename_chain(GLOBALS->facs[t2->t_which]); tmp3=leastsig_hiername(tmp2); tmp=wave_alloca(strlen(tmp3)+4); strcpy(tmp, "[] "); strcpy(tmp+3, tmp3); free_2(tmp2); } else { tmp=wave_alloca(strlen(t2->name)+4); strcpy(tmp, "[] "); strcpy(tmp+3, t2->name); } } else { tmp=t2->name; } } else { /* tmp=t2->name; */ goto skip_node; /* GHW */ } row=gtk_clist_prepend(cl,(gchar **)&tmp); pixlen=font_engine_string_measure(GLOBALS->signalfont,(gchar *)(tmp)); } maxpixlen=(pixlen>maxpixlen)?pixlen:maxpixlen; gtk_clist_set_row_data(cl, row,t2); GLOBALS->num_rows_hiersearch_c_1++; skip_node: t2=t2->next; } } else { char *tmp, *tmp2, *tmp3; t2=t; while(t2) { if(!t2->child) { if(t2->t_which >= 0) { if(GLOBALS->facs[t2->t_which]->vec_root) { if(GLOBALS->autocoalesce) { if(GLOBALS->facs[t2->t_which]->vec_root!=GLOBALS->facs[t2->t_which]) { t2=t2->next; continue; } tmp2=makename_chain(GLOBALS->facs[t2->t_which]); tmp3=leastsig_hiername(tmp2); tmp=wave_alloca(strlen(tmp3)+4); strcpy(tmp, "[] "); strcpy(tmp+3, tmp3); free_2(tmp2); } else { tmp=wave_alloca(strlen(t2->name)+4); strcpy(tmp, "[] "); strcpy(tmp+3, t2->name); } } else { tmp=t2->name; } } else { /* tmp=t2->name; */ goto skip_node_2; /* GHW */ } row=gtk_clist_prepend(cl,(gchar **)&tmp); pixlen=font_engine_string_measure(GLOBALS->signalfont,(gchar *)(tmp)); maxpixlen=(pixlen>maxpixlen)?pixlen:maxpixlen; gtk_clist_set_row_data(cl, row,t2); GLOBALS->num_rows_hiersearch_c_1++; } skip_node_2: t2=t2->next; } t2=t; while(t2) { if(t2->child) { tmp=wave_alloca(strlen(t2->name)+5); strcpy(tmp, "(+) "); strcpy(tmp+4, t2->name); row=gtk_clist_prepend(cl,(gchar **)&tmp); pixlen=font_engine_string_measure(GLOBALS->signalfont,(gchar *)(tmp)); maxpixlen=(pixlen>maxpixlen)?pixlen:maxpixlen; gtk_clist_set_row_data(cl, row,t2); GLOBALS->num_rows_hiersearch_c_1++; } t2=t2->next; } } if(t!=GLOBALS->treeroot) { row=gtk_clist_prepend(cl,(gchar **)&dotdot); gtk_clist_set_row_data(cl, row,NULL); GLOBALS->num_rows_hiersearch_c_1++; } if(maxpixlen)gtk_clist_set_column_width(GTK_CLIST(GLOBALS->clist_hiersearch_c_1),0,maxpixlen); gtk_clist_thaw(cl); if((tc=GLOBALS->treechain_hiersearch_c_1)) { char *buf; char hier_str[2]; len=1; while(tc) { len+=strlen(tc->label->name); if(tc->next) len++; tc=tc->next; } buf=calloc_2(1,len); hier_str[0]=GLOBALS->hier_delimeter; hier_str[1]=0; tc=GLOBALS->treechain_hiersearch_c_1; while(tc) { strcat(buf,tc->label->name); if(tc->next) strcat(buf,hier_str); tc=tc->next; } gtk_entry_set_text(GTK_ENTRY(GLOBALS->entry_main_hiersearch_c_1), buf); free_2(buf); } else { gtk_entry_set_text(GTK_ENTRY(GLOBALS->entry_main_hiersearch_c_1),""); } } static void enter_callback_e(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; G_CONST_RETURN gchar *entry_text; int len; entry_text = gtk_entry_get_text(GTK_ENTRY(GLOBALS->entry_hiersearch_c_2)); entry_text = entry_text ? entry_text : ""; DEBUG(printf("Entry contents: %s\n", entry_text)); if(!(len=strlen(entry_text))) GLOBALS->entrybox_text_local_hiersearch_c_1=NULL; else strcpy((GLOBALS->entrybox_text_local_hiersearch_c_1=(char *)malloc_2(len+1)),entry_text); wave_gtk_grab_remove(GLOBALS->window1_hiersearch_c_1); gtk_widget_destroy(GLOBALS->window1_hiersearch_c_1); GLOBALS->window1_hiersearch_c_1 = NULL; GLOBALS->cleanup_e_hiersearch_c_1(); } static void destroy_callback_e(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; DEBUG(printf("Entry Cancel\n")); GLOBALS->entrybox_text_local_hiersearch_c_1=NULL; wave_gtk_grab_remove(GLOBALS->window1_hiersearch_c_1); gtk_widget_destroy(GLOBALS->window1_hiersearch_c_1); GLOBALS->window1_hiersearch_c_1 = NULL; } static void entrybox_local(char *title, int width, char *default_text, int maxch, GtkSignalFunc func) { GtkWidget *vbox, *hbox; GtkWidget *button1, *button2; GLOBALS->cleanup_e_hiersearch_c_1=func; /* fix problem where ungrab doesn't occur if button pressed + simultaneous accelerator key occurs */ if(GLOBALS->in_button_press_wavewindow_c_1) { gdk_pointer_ungrab(GDK_CURRENT_TIME); } /* create a new modal window */ GLOBALS->window1_hiersearch_c_1 = gtk_window_new(GLOBALS->disable_window_manager ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL); install_focus_cb(GLOBALS->window1_hiersearch_c_1, ((char *)&GLOBALS->window1_hiersearch_c_1) - ((char *)GLOBALS)); gtk_widget_set_usize( GTK_WIDGET (GLOBALS->window1_hiersearch_c_1), width, 60); gtk_window_set_title(GTK_WINDOW (GLOBALS->window1_hiersearch_c_1), title); gtkwave_signal_connect(GTK_OBJECT (GLOBALS->window1_hiersearch_c_1), "delete_event",(GtkSignalFunc) destroy_callback_e, NULL); vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (GLOBALS->window1_hiersearch_c_1), vbox); gtk_widget_show (vbox); GLOBALS->entry_hiersearch_c_2 = gtk_entry_new_with_max_length (maxch); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->entry_hiersearch_c_2), "activate",GTK_SIGNAL_FUNC(enter_callback_e),GLOBALS->entry_hiersearch_c_2); gtk_entry_set_text (GTK_ENTRY (GLOBALS->entry_hiersearch_c_2), default_text); gtk_entry_select_region (GTK_ENTRY (GLOBALS->entry_hiersearch_c_2),0, GTK_ENTRY(GLOBALS->entry_hiersearch_c_2)->text_length); gtk_box_pack_start (GTK_BOX (vbox), GLOBALS->entry_hiersearch_c_2, TRUE, TRUE, 0); gtk_widget_show (GLOBALS->entry_hiersearch_c_2); hbox = gtk_hbox_new (FALSE, 1); gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0); gtk_widget_show (hbox); button1 = gtk_button_new_with_label ("OK"); gtk_widget_set_usize(button1, 100, -1); gtkwave_signal_connect(GTK_OBJECT (button1), "clicked", GTK_SIGNAL_FUNC(enter_callback_e), NULL); gtk_widget_show (button1); gtk_container_add (GTK_CONTAINER (hbox), button1); GTK_WIDGET_SET_FLAGS (button1, GTK_CAN_DEFAULT); gtkwave_signal_connect_object (GTK_OBJECT (button1), "realize", (GtkSignalFunc) gtk_widget_grab_default, GTK_OBJECT (button1)); button2 = gtk_button_new_with_label ("Cancel"); gtk_widget_set_usize(button2, 100, -1); gtkwave_signal_connect(GTK_OBJECT (button2), "clicked", GTK_SIGNAL_FUNC(destroy_callback_e), NULL); GTK_WIDGET_SET_FLAGS (button2, GTK_CAN_DEFAULT); gtk_widget_show (button2); gtk_container_add (GTK_CONTAINER (hbox), button2); gtk_widget_show(GLOBALS->window1_hiersearch_c_1); wave_gtk_grab_add(GLOBALS->window1_hiersearch_c_1); } /***************************************************************************/ void recurse_fetch_high_low(struct tree *t) { top: if(t->t_which >= 0) { if(t->t_which > GLOBALS->fetchhigh) GLOBALS->fetchhigh = t->t_which; if(GLOBALS->fetchlow < 0) { GLOBALS->fetchlow = t->t_which; } else if(t->t_which < GLOBALS->fetchlow) { GLOBALS->fetchlow = t->t_which; } } if(t->child) { recurse_fetch_high_low(t->child); } if(t->next) { t = t->next; goto top; } } /* Get the highest signal from T. */ struct tree *fetchhigh(struct tree *t) { while(t->child) t=t->child; return(t); } /* Get the lowest signal from T. */ struct tree *fetchlow(struct tree *t) { if(t->child) { t=t->child; for(;;) { while(t->next) t=t->next; if(t->child) t=t->child; else break; } } return(t); } static void fetchvex2(struct tree *t, char direction, char level) { while(t) { if(t->child) { if(t->child->child) { fetchvex2(t->child, direction, 1); } else { add_vector_range(NULL, fetchlow(t)->t_which, fetchhigh(t)->t_which, direction); } } if(level) { t=t->next; } else { break; } } } void fetchvex(struct tree *t, char direction) { if(t) { if(t->child) { fetchvex2(t, direction, 0); } else { add_vector_range(NULL, fetchlow(t)->t_which, fetchhigh(t)->t_which, direction); } } } static void ok_callback(GtkWidget *widget, GtkWidget *nothing) { (void)nothing; int i; if((!GLOBALS->h_selectedtree_hiersearch_c_1)||(!GLOBALS->h_selectedtree_hiersearch_c_1->child)) return; set_window_busy(widget); GLOBALS->fetchlow = GLOBALS->fetchhigh = -1; recurse_fetch_high_low(GLOBALS->h_selectedtree_hiersearch_c_1->child); for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { struct symbol *s; if(i<0) break; /* GHW */ s=GLOBALS->facs[i]; if(s->vec_root) { set_s_selected(s->vec_root, GLOBALS->autocoalesce); } } /* LX2 */ if(GLOBALS->is_lx2) { int pre_import = 0; for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { struct symbol *s, *t; if(i<0) break; /* GHW */ s=GLOBALS->facs[i]; t=s->vec_root; if((t)&&(GLOBALS->autocoalesce)) { if(get_s_selected(t)) { while(t) { if(t->n->mv.mvlfac) { lx2_set_fac_process_mask(t->n); pre_import++; } t=t->vec_chain; } } } else { if(s->n->mv.mvlfac) { lx2_set_fac_process_mask(s->n); pre_import++; } } } if(pre_import) { lx2_import_masked(); } } /* LX2 */ for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { int len; struct symbol *s, *t; if(i<0) break; /* GHW */ s=GLOBALS->facs[i]; t=s->vec_root; if((t)&&(GLOBALS->autocoalesce)) { if(get_s_selected(t)) { set_s_selected(t, 0); len=0; while(t) { len++; t=t->vec_chain; } if(len) add_vector_chain(s->vec_root, len); } } else { AddNodeUnroll(s->n, NULL); } } set_window_idle(widget); GLOBALS->traces.scroll_top = GLOBALS->traces.scroll_bottom = GLOBALS->traces.last; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } static void insert_callback(GtkWidget *widget, GtkWidget *nothing) { (void)nothing; Traces tcache; int i; if((!GLOBALS->h_selectedtree_hiersearch_c_1)||(!GLOBALS->h_selectedtree_hiersearch_c_1->child)) return; memcpy(&tcache,&GLOBALS->traces,sizeof(Traces)); GLOBALS->traces.total=0; GLOBALS->traces.first=GLOBALS->traces.last=NULL; set_window_busy(widget); GLOBALS->fetchlow = GLOBALS->fetchhigh = -1; recurse_fetch_high_low(GLOBALS->h_selectedtree_hiersearch_c_1->child); for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { struct symbol *s; if(i<0) break; /* GHW */ s=GLOBALS->facs[i]; if(s->vec_root) { set_s_selected(s->vec_root, GLOBALS->autocoalesce); } } /* LX2 */ if(GLOBALS->is_lx2) { int pre_import = 0; for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { struct symbol *s, *t; if(i<0) break; /* GHW */ s=GLOBALS->facs[i]; t=s->vec_root; if((t)&&(GLOBALS->autocoalesce)) { if(get_s_selected(t)) { while(t) { if(t->n->mv.mvlfac) { lx2_set_fac_process_mask(t->n); pre_import++; } t=t->vec_chain; } } } else { if(s->n->mv.mvlfac) { lx2_set_fac_process_mask(s->n); pre_import++; } } } if(pre_import) { lx2_import_masked(); } } /* LX2 */ for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { int len; struct symbol *s, *t; if(i<0) break; /* GHW */ s=GLOBALS->facs[i]; t=s->vec_root; if((t)&&(GLOBALS->autocoalesce)) { if(get_s_selected(t)) { set_s_selected(t, 0); len=0; while(t) { len++; t=t->vec_chain; } if(len) add_vector_chain(s->vec_root, len); } } else { AddNodeUnroll(s->n, NULL); } } set_window_idle(widget); GLOBALS->traces.buffercount=GLOBALS->traces.total; GLOBALS->traces.buffer=GLOBALS->traces.first; GLOBALS->traces.bufferlast=GLOBALS->traces.last; GLOBALS->traces.first=tcache.first; GLOBALS->traces.last=tcache.last; GLOBALS->traces.total=tcache.total; PasteBuffer(); GLOBALS->traces.buffercount=tcache.buffercount; GLOBALS->traces.buffer=tcache.buffer; GLOBALS->traces.bufferlast=tcache.bufferlast; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } static void replace_callback(GtkWidget *widget, GtkWidget *nothing) { (void)nothing; Traces tcache; int i; Trptr tfirst=NULL, tlast=NULL; if((!GLOBALS->h_selectedtree_hiersearch_c_1)||(!GLOBALS->h_selectedtree_hiersearch_c_1->child)) return; memcpy(&tcache,&GLOBALS->traces,sizeof(Traces)); GLOBALS->traces.total=0; GLOBALS->traces.first=GLOBALS->traces.last=NULL; set_window_busy(widget); GLOBALS->fetchlow = GLOBALS->fetchhigh = -1; recurse_fetch_high_low(GLOBALS->h_selectedtree_hiersearch_c_1->child); for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { struct symbol *s; if(i<0) break; /* GHW */ s=GLOBALS->facs[i]; if(s->vec_root) { set_s_selected(s->vec_root, GLOBALS->autocoalesce); } } /* LX2 */ if(GLOBALS->is_lx2) { int pre_import = 0; for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { struct symbol *s, *t; if(i<0) break; /* GHW */ s=GLOBALS->facs[i]; t=s->vec_root; if((t)&&(GLOBALS->autocoalesce)) { if(get_s_selected(t)) { while(t) { if(t->n->mv.mvlfac) { lx2_set_fac_process_mask(t->n); pre_import++; } t=t->vec_chain; } } } else { if(s->n->mv.mvlfac) { lx2_set_fac_process_mask(s->n); pre_import++; } } } if(pre_import) { lx2_import_masked(); } } /* LX2 */ for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { int len; struct symbol *s, *t; if(i<0) break; /* GHW */ s=GLOBALS->facs[i]; t=s->vec_root; if((t)&&(GLOBALS->autocoalesce)) { if(get_s_selected(t)) { set_s_selected(t, 0); len=0; while(t) { len++; t=t->vec_chain; } if(len) add_vector_chain(s->vec_root, len); } } else { AddNodeUnroll(s->n, NULL); } } set_window_idle(widget); tfirst=GLOBALS->traces.first; tlast=GLOBALS->traces.last; /* cache for highlighting */ GLOBALS->traces.buffercount=GLOBALS->traces.total; GLOBALS->traces.buffer=GLOBALS->traces.first; GLOBALS->traces.bufferlast=GLOBALS->traces.last; GLOBALS->traces.first=tcache.first; GLOBALS->traces.last=tcache.last; GLOBALS->traces.total=tcache.total; { Trptr t = GLOBALS->traces.first; Trptr *tp = NULL; int numhigh = 0; int it; while(t) { if(t->flags & TR_HIGHLIGHT) { numhigh++; } t = t->t_next; } if(numhigh) { tp = calloc_2(numhigh, sizeof(Trptr)); t = GLOBALS->traces.first; it = 0; while(t) { if(t->flags & TR_HIGHLIGHT) { tp[it++] = t; } t = t->t_next; } } PasteBuffer(); GLOBALS->traces.buffercount=tcache.buffercount; GLOBALS->traces.buffer=tcache.buffer; GLOBALS->traces.bufferlast=tcache.bufferlast; for(i=0;iflags |= TR_HIGHLIGHT; } t = tfirst; while(t) { t->flags &= ~TR_HIGHLIGHT; if(t==tlast) break; t=t->t_next; } CutBuffer(); while(tfirst) { tfirst->flags |= TR_HIGHLIGHT; if(tfirst==tlast) break; tfirst=tfirst->t_next; } if(tp) { free_2(tp); } } MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } static void bundle_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; if(GLOBALS->entrybox_text_local_hiersearch_c_1) { char *efix; if(!strlen(GLOBALS->entrybox_text_local_hiersearch_c_1)) { DEBUG(printf("Bundle name is not specified--recursing into hierarchy.\n")); fetchvex(GLOBALS->h_selectedtree_hiersearch_c_1, GLOBALS->bundle_direction_hiersearch_c_1); } else { efix=GLOBALS->entrybox_text_local_hiersearch_c_1; while(*efix) { if(*efix==' ') { *efix='_'; } efix++; } DEBUG(printf("Bundle name is: %s\n",GLOBALS->entrybox_text_local_hiersearch_c_1)); add_vector_range(GLOBALS->entrybox_text_local_hiersearch_c_1, fetchlow(GLOBALS->h_selectedtree_hiersearch_c_1)->t_which, fetchhigh(GLOBALS->h_selectedtree_hiersearch_c_1)->t_which, GLOBALS->bundle_direction_hiersearch_c_1); } free_2(GLOBALS->entrybox_text_local_hiersearch_c_1); } else { DEBUG(printf("Bundle name is not specified--recursing into hierarchy.\n")); fetchvex(GLOBALS->h_selectedtree_hiersearch_c_1, GLOBALS->bundle_direction_hiersearch_c_1); } MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } static void bundle_callback_generic(void) { if(!GLOBALS->autoname_bundles) { entrybox_local("Enter Bundle Name",300,"",128,GTK_SIGNAL_FUNC(bundle_cleanup)); } else { GLOBALS->entrybox_text_local_hiersearch_c_1=NULL; bundle_cleanup(NULL, NULL); } } static void bundle_callback_up(GtkWidget *widget, gpointer data) { (void)widget; (void)data; GLOBALS->bundle_direction_hiersearch_c_1=0; bundle_callback_generic(); } static void bundle_callback_down(GtkWidget *widget, gpointer data) { (void)widget; (void)data; GLOBALS->bundle_direction_hiersearch_c_1=1; bundle_callback_generic(); } /****************************************************************************/ static void select_row_callback(GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data) { (void)widget; (void)column; (void)event; (void)data; struct tree *t; t=(struct tree *)gtk_clist_get_row_data(GTK_CLIST(GLOBALS->clist_hiersearch_c_1), row); if(t) { GLOBALS->h_selectedtree_hiersearch_c_1=t; DEBUG(printf("Selected: %s\n",t->name)); if(t->child) { struct treechain *tc, *tc2; tc=GLOBALS->treechain_hiersearch_c_1; if(tc) { while(tc->next) tc=tc->next; tc2=calloc_2(1,sizeof(struct treechain)); tc2->label=t; tc2->tree=GLOBALS->current_tree_hiersearch_c_1; tc->next=tc2; } else { GLOBALS->treechain_hiersearch_c_1=calloc_2(1,sizeof(struct treechain)); GLOBALS->treechain_hiersearch_c_1->tree=GLOBALS->current_tree_hiersearch_c_1; GLOBALS->treechain_hiersearch_c_1->label=t; } GLOBALS->current_tree_hiersearch_c_1=t->child; refresh_hier_tree(GLOBALS->current_tree_hiersearch_c_1); } } else { struct treechain *tc; GLOBALS->h_selectedtree_hiersearch_c_1=NULL; tc=GLOBALS->treechain_hiersearch_c_1; if(tc) { for(;;) { if(tc->next) { if(tc->next->next) { tc=tc->next; continue; } else { GLOBALS->current_tree_hiersearch_c_1=tc->next->tree; free_2(tc->next); tc->next=NULL; break; } } else { free_2(tc); GLOBALS->treechain_hiersearch_c_1=NULL; GLOBALS->current_tree_hiersearch_c_1=GLOBALS->treeroot; break; } } refresh_hier_tree(GLOBALS->current_tree_hiersearch_c_1); } } } static void unselect_row_callback(GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data) { (void)widget; (void)column; (void)event; (void)data; struct tree *t; t=(struct tree *)gtk_clist_get_row_data(GTK_CLIST(GLOBALS->clist_hiersearch_c_1), row); GLOBALS->h_selectedtree_hiersearch_c_1=NULL; if(t) { DEBUG(printf("Unselected: %s\n",t->name)); } else { /* just ignore */ } } static void destroy_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; GLOBALS->is_active_hiersearch_c_1=0; gtk_widget_destroy(GLOBALS->window_hiersearch_c_3); GLOBALS->window_hiersearch_c_3 = NULL; } /* * mainline.. */ void hier_searchbox(char *title, GtkSignalFunc func) { GtkWidget *scrolled_win; GtkWidget *vbox1, *hbox; GtkWidget *button1, *button2, *button3, *button3a, *button4, *button5; GtkWidget *label; gchar *titles[]={"Children"}; GtkWidget *frame1, *frame2, *frameh; GtkWidget *table; GtkTooltips *tooltips; /* fix problem where ungrab doesn't occur if button pressed + simultaneous accelerator key occurs */ if(GLOBALS->in_button_press_wavewindow_c_1) { gdk_pointer_ungrab(GDK_CURRENT_TIME); } if(GLOBALS->is_active_hiersearch_c_1) { gdk_window_raise(GLOBALS->window_hiersearch_c_3->window); return; } GLOBALS->is_active_hiersearch_c_1=1; GLOBALS->cleanup_hiersearch_c_3=func; GLOBALS->num_rows_hiersearch_c_1=GLOBALS->selected_rows_hiersearch_c_1=0; /* create a new modal window */ GLOBALS->window_hiersearch_c_3 = gtk_window_new(GLOBALS->disable_window_manager ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL); install_focus_cb(GLOBALS->window_hiersearch_c_3, ((char *)&GLOBALS->window_hiersearch_c_3) - ((char *)GLOBALS)); gtk_window_set_title(GTK_WINDOW (GLOBALS->window_hiersearch_c_3), title); gtkwave_signal_connect(GTK_OBJECT (GLOBALS->window_hiersearch_c_3), "delete_event",(GtkSignalFunc) destroy_callback, NULL); tooltips=gtk_tooltips_new_2(); table = gtk_table_new (256, 1, FALSE); gtk_widget_show (table); vbox1 = gtk_vbox_new (FALSE, 0); gtk_container_border_width (GTK_CONTAINER (vbox1), 3); gtk_widget_show (vbox1); frame1 = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (frame1), 3); gtk_widget_show(frame1); gtk_table_attach (GTK_TABLE (table), frame1, 0, 1, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); label=gtk_label_new("Signal Hierarchy"); gtk_widget_show(label); gtk_box_pack_start (GTK_BOX (vbox1), label, TRUE, TRUE, 0); GLOBALS->entry_main_hiersearch_c_1 = gtk_entry_new(); gtk_entry_set_editable(GTK_ENTRY(GLOBALS->entry_main_hiersearch_c_1), FALSE); gtk_widget_show (GLOBALS->entry_main_hiersearch_c_1); gtk_tooltips_set_tip_2(tooltips, GLOBALS->entry_main_hiersearch_c_1, "The hierarchy is built here by clicking on the appropriate " "items below in the scrollable window. Click on \"..\" to " "go up a level." ,NULL); gtk_box_pack_start (GTK_BOX (vbox1), GLOBALS->entry_main_hiersearch_c_1, TRUE, TRUE, 0); gtk_container_add (GTK_CONTAINER (frame1), vbox1); frame2 = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (frame2), 3); gtk_widget_show(frame2); gtk_table_attach (GTK_TABLE (table), frame2, 0, 1, 1, 254, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); GLOBALS->clist_hiersearch_c_1=gtk_clist_new_with_titles(1,titles); gtk_clist_column_titles_passive(GTK_CLIST(GLOBALS->clist_hiersearch_c_1)); gtk_clist_set_selection_mode(GTK_CLIST(GLOBALS->clist_hiersearch_c_1), GTK_SELECTION_SINGLE); gtkwave_signal_connect_object (GTK_OBJECT (GLOBALS->clist_hiersearch_c_1), "select_row",GTK_SIGNAL_FUNC(select_row_callback),NULL); gtkwave_signal_connect_object (GTK_OBJECT (GLOBALS->clist_hiersearch_c_1), "unselect_row",GTK_SIGNAL_FUNC(unselect_row_callback),NULL); gtk_widget_show (GLOBALS->clist_hiersearch_c_1); scrolled_win = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_set_usize( GTK_WIDGET (scrolled_win), -1, 300); gtk_widget_show(scrolled_win); /* gtk_scrolled_window_add_with_viewport doesn't seen to work right here.. */ gtk_container_add (GTK_CONTAINER (scrolled_win), GLOBALS->clist_hiersearch_c_1); gtk_container_add (GTK_CONTAINER (frame2), scrolled_win); frameh = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (frameh), 3); gtk_widget_show(frameh); gtk_table_attach (GTK_TABLE (table), frameh, 0, 1, 255, 256, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); hbox = gtk_hbox_new (FALSE, 1); gtk_widget_show (hbox); button1 = gtk_button_new_with_label ("Append"); gtk_container_border_width (GTK_CONTAINER (button1), 3); gtkwave_signal_connect_object (GTK_OBJECT (button1), "clicked",GTK_SIGNAL_FUNC(ok_callback),GTK_OBJECT (GLOBALS->window_hiersearch_c_3)); gtk_widget_show (button1); gtk_tooltips_set_tip_2(tooltips, button1, "Add selected signals to end of the display on the main window.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button1, TRUE, FALSE, 0); button2 = gtk_button_new_with_label (" Insert "); gtk_container_border_width (GTK_CONTAINER (button2), 3); gtkwave_signal_connect_object (GTK_OBJECT (button2), "clicked",GTK_SIGNAL_FUNC(insert_callback),GTK_OBJECT (GLOBALS->window_hiersearch_c_3)); gtk_widget_show (button2); gtk_tooltips_set_tip_2(tooltips, button2, "Add children after last highlighted signal on the main window.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button2, TRUE, FALSE, 0); if(GLOBALS->vcd_explicit_zero_subscripts>=0) { button3 = gtk_button_new_with_label (" Bundle Up "); gtk_container_border_width (GTK_CONTAINER (button3), 3); gtkwave_signal_connect_object (GTK_OBJECT (button3), "clicked",GTK_SIGNAL_FUNC(bundle_callback_up),GTK_OBJECT (GLOBALS->window_hiersearch_c_3)); gtk_widget_show (button3); gtk_tooltips_set_tip_2(tooltips, button3, "Bundle children into a single bit vector with the topmost signal as the LSB and the lowest as the MSB.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button3, TRUE, FALSE, 0); button3a = gtk_button_new_with_label (" Bundle Down "); gtk_container_border_width (GTK_CONTAINER (button3a), 3); gtkwave_signal_connect_object (GTK_OBJECT (button3a), "clicked",GTK_SIGNAL_FUNC(bundle_callback_down),GTK_OBJECT (GLOBALS->window_hiersearch_c_3)); gtk_widget_show (button3a); gtk_tooltips_set_tip_2(tooltips, button3a, "Bundle children into a single bit vector with the topmost signal as the MSB and the lowest as the LSB.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button3a, TRUE, FALSE, 0); } button4 = gtk_button_new_with_label (" Replace "); gtk_container_border_width (GTK_CONTAINER (button4), 3); gtkwave_signal_connect_object (GTK_OBJECT (button4), "clicked",GTK_SIGNAL_FUNC(replace_callback),GTK_OBJECT (GLOBALS->window_hiersearch_c_3)); gtk_widget_show (button4); gtk_tooltips_set_tip_2(tooltips, button4, "Replace highlighted signals on the main window with children shown above.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button4, TRUE, FALSE, 0); button5 = gtk_button_new_with_label (" Exit "); gtk_container_border_width (GTK_CONTAINER (button5), 3); gtkwave_signal_connect_object (GTK_OBJECT (button5), "clicked",GTK_SIGNAL_FUNC(destroy_callback),GTK_OBJECT (GLOBALS->window_hiersearch_c_3)); gtk_tooltips_set_tip_2(tooltips, button5, "Do nothing and return to the main window.",NULL); gtk_widget_show (button5); gtk_box_pack_start (GTK_BOX (hbox), button5, TRUE, FALSE, 0); gtk_container_add (GTK_CONTAINER (frameh), hbox); gtk_container_add (GTK_CONTAINER (GLOBALS->window_hiersearch_c_3), table); gtk_widget_show(GLOBALS->window_hiersearch_c_3); if(!GLOBALS->current_tree_hiersearch_c_1) { GLOBALS->current_tree_hiersearch_c_1=GLOBALS->treeroot; GLOBALS->h_selectedtree_hiersearch_c_1=NULL; } refresh_hier_tree(GLOBALS->current_tree_hiersearch_c_1); } gtkwave-3.3.86/src/hiersearch.h0000664000175000017500000000123313166335473015660 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010-2017 * * 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. */ #ifndef WAVE_HIERSEARCH_H #define WAVE_HIERSEARCH_H void hier_searchbox(char *title, GtkSignalFunc func); void refresh_hier_tree(struct tree *t); int hier_searchbox_is_active(void); void recurse_fetch_high_low(struct tree *t); struct tree *fetchhigh(struct tree *t); struct tree *fetchlow(struct tree *t); void fetchvex(struct tree *t, char direction); #endif gtkwave-3.3.86/src/globals.c0000664000175000017500000027124113166335473015171 0ustar bybellbybell/* * Copyright (c) Kermin Elliott Fleming 2007-2017. * * 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. */ #include "globals.h" #include "analyzer.h" #include "bsearch.h" #include "busy.h" #include "clipping.h" #include "color.h" #include "currenttime.h" #include "debug.h" #include "fgetdynamic.h" #include "ghw.h" #include "globals.h" #include "gnu-getopt.h" #include "gnu_regex.h" #include "gtk12compat.h" #include "lx2.h" #include "lxt.h" #include "main.h" #include "menu.h" #include "pipeio.h" #include "pixmaps.h" #include "print.h" #include "ptranslate.h" #include "ttranslate.h" #include "rc.h" #include "regex_wave.h" #include "strace.h" #include "symbol.h" #include "translate.h" #include "tree.h" #include "vcd.h" #include "vcd_saver.h" #include "vlist.h" #include "vzt.h" #include "wavealloca.h" #include "lxt2_read.h" #include "vzt_read.h" #include "fst.h" #include "hierpack.h" #include "fsdb_wrapper_api.h" #ifdef __MINGW32__ #define sleep(x) Sleep(x) #endif #if !defined __MINGW32__ && !defined _MSC_VER #include #include #else #include #include #endif struct Global *GLOBALS = NULL; /* make this const so if we try to write to it we coredump */ static const struct Global globals_base_values = { /* * ae2.c */ #ifdef AET2_IS_PRESENT #ifdef AET2_ALIASDB_IS_PRESENT NULL, /* adb_alias_stream_file */ 0, /* adb */ 0, /* adb_max_terms */ NULL, /* adb_terms */ NULL, /* adb_aliases */ NULL, /* adb_num_terms */ NULL, /* adb_idx_first */ NULL, /* adb_idx_last */ NULL, /* adb_alloc_pool_base */ 0, /* adb_alloc_idx */ #endif 0, /* ae2_num_facs */ 0, /* ae2_num_aliases */ 0, /* ae2_num_sections */ NULL, /* ae2_lx2_table */ NULL, /* ae2_f */ NULL, /* ae2 */ NULL, /* ae2_fr */ LLDescriptor(0), /* ae2_start_limit_cyc */ LLDescriptor(0), /* ae2_end_limit_cyc */ NULL, /* ae2_process_mask */ #endif LLDescriptor(0), /* ae2_start_cyc */ LLDescriptor(0), /* ae2_end_cyc */ NULL, /* ae2_time_xlate */ 0, /* disable_ae2_alias */ /* * analyzer.c */ TR_RJUSTIFY, /* default_flags 5 */ 0, /* default_fpshift */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0}, /* tims 6 */ {0, 0, NULL, NULL, NULL, NULL, 0, NULL, NULL, 0}, /* traces 9 */ 0, /* hier_max_level 8 */ 0, /* hier_max_level_shadow */ 0, /* timestart_from_savefile */ 0, /* timestart_from_savefile_valid */ 0, /* group_depth */ 0, /* hier_ignore_escapes */ /* * baseconvert.c */ 0, /* color_active_in_filter 9 */ /* * bsearch.c */ LLDescriptor(0), /* shift_timebase 10 */ LLDescriptor(0), /* shift_timebase_default_for_add 11 */ 0, /* max_compare_time_tc_bsearch_c_1 12 */ 0, /* max_compare_pos_tc_bsearch_c_1 13 */ 0, /* max_compare_time_bsearch_c_1 14 */ 0, /* max_compare_pos_bsearch_c_1 15 */ 0, /* max_compare_index 16 */ 0, /* vmax_compare_time_bsearch_c_1 17 */ 0, /* vmax_compare_pos_bsearch_c_1 18 */ 0, /* vmax_compare_index 19 */ 0, /* maxlen_trunc 20 */ 0, /* maxlen_trunc_pos_bsearch_c_1 21 */ 0, /* trunc_asciibase_bsearch_c_1 22 */ /* * busy.c */ NULL, /* busycursor_busy_c_1 23 */ 0, /* busy_busy_c_1 24 */ /* * color.c */ 0, /* keep_xz_colors */ NULL, /* wave_gcchain */ -1, /* color_back 25 */ -1, /* color_baseline 26 */ -1, /* color_grid 27 */ -1, /* color_grid2 27 */ -1, /* color_high 28 */ -1, /* color_low 29 */ -1, /* color_mark 30 */ -1, /* color_mid 31 */ -1, /* color_time 32 */ -1, /* color_timeb 33 */ -1, /* color_trans 34 */ -1, /* color_umark 35 */ -1, /* color_value 36 */ -1, /* color_vbox 37 */ -1, /* color_vtrans 38 */ -1, /* color_x 39 */ -1, /* color_xfill 40 */ -1, /* color_0 41 */ -1, /* color_1 42 */ -1, /* color_ufill 43 */ -1, /* color_u 44 */ -1, /* color_wfill 45 */ -1, /* color_w 46 */ -1, /* color_dashfill 47 */ -1, /* color_dash 48 */ -1, /* color_white 49 */ -1, /* color_black 50 */ -1, /* color_ltgray 51 */ -1, /* color_normal 52 */ -1, /* color_mdgray 53 */ -1, /* color_dkgray 54 */ -1, /* color_dkblue 55 */ -1, /* color_brkred */ -1, /* color_ltblue */ -1, /* color_gmstrd */ -1, /* color_highfill */ -1, /* color_1fill */ /* * currenttime.c */ LLDescriptor(0), /* global_time_offset */ 0, /* is_vcd 56 */ 0, /* partial_vcd */ 1, /* use_maxtime_display 57 */ 0, /* use_frequency_delta 58 */ NULL, /* max_or_marker_label_currenttime_c_1 59 */ NULL, /* base_or_curtime_label_currenttime_c_1 60 */ 0, /* cached_currenttimeval_currenttime_c_1 61 */ 0, /* currenttime 62 */ 0, /* max_time 63 */ -1, /* min_time 64 */ ~0, /* display_grid 65 */ 1, /* time_scale 66 */ 'n', /* time_dimension 67 */ 0, /* scale_to_time_dimension */ 0, /* maxtimewid_currenttime_c_1 69 */ 0, /* curtimewid_currenttime_c_1 70 */ 0, /* maxtext_currenttime_c_1 71 */ 0, /* curtext_currenttime_c_1 72 */ 1, /* time_trunc_val_currenttime_c_1 76 */ 0, /* use_full_precision 77 */ /* * debug.c */ NULL, /* alloc2_chain */ 0, /* outstanding */ NULL, /* atoi_cont_ptr 78 */ 0, /* disable_tooltips 79 */ /* * entry.c */ 0, /* window_entry_c_1 80 */ 0, /* entry_entry_c_1 81 */ NULL, /* entrybox_text 82 */ 0, /* cleanup_entry_c_1 83 */ 0, /* entry_raise_timer */ /* * extload.c */ 0, /* extload_ffr_import_count */ NULL, /* extload_ffr_ctx */ NULL, /* extload */ NULL, /* extload_idcodes */ NULL, /* extload_inv_idcodes */ #if !defined __MINGW32__ && !defined _MSC_VER 0, /* extload_lastmod */ 0, /* extload_already_errored */ #endif NULL, /* extload_namecache */ NULL, /* extload_namecache_max */ NULL, /* extload_namecache_lens */ NULL, /* extload_namecache_patched */ NULL, /* extload_sym_block */ NULL, /* extload_node_block */ NULL, /* extload_xc */ NULL, /* extload_prevsymroot */ NULL, /* extload_prevsym */ NULL, /* extload_npar */ 0, /* extload_i */ 0, /* extload_hlen */ 0, /* extload_vt_prev */ 0, /* extload_vd_prev */ 0, /* f_name_build_buf_len */ NULL, /* f_name_build_buf */ 0, /* extload_max_tree */ 0, /* extload_curr_tree */ /* * fetchbuttons.c */ 100, /* fetchwindow 84 */ /* * fgetdynamic.c */ 0, /* fgetmalloc_len 85 */ /* * file.c */ #if GTK_CHECK_VERSION(2,4,0) NULL, /* pFileChoose */ NULL, /* pFileChooseFilterName */ NULL, /* pPatternSpec */ #endif 0, /* fs_file_c_1 86 */ NULL, /* fileselbox_text 87 */ 0, /* filesel_ok 88 */ 0, /* cleanup_file_c_2 89 */ 0, /* bad_cleanup_file_c1 */ /* * fonts.c */ NULL, /* fontname_signals 90 */ NULL, /* fontname_waves 91 */ #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) && GTK_CHECK_VERSION(2,8,0) NULL, /* fonts_renderer */ NULL, /* fonts_gc */ NULL, /* fonts_screen */ NULL, /* fonts_context */ NULL, /* fonts_layout */ #endif 1, /* use_pango_fonts */ /* * fst.c */ NULL, /* fst_fst_c_1 */ NULL, /* fst_scope_name */ 0, /* fst_scope_name_len */ 0, /* first_cycle_fst_c_3 */ 0, /* last_cycle_fst_c_3 */ 0, /* total_cycles_fst_c_3 */ NULL, /* fst_table_fst_c_1 */ NULL, /* mvlfacs_fst_c_3 */ NULL, /* mvlfacs_fst_alias */ NULL, /* mvlfacs_fst_rvs_alias */ 0, /* fst_maxhandle */ 0, /* busycnt_fst_c_2 */ NULL, /* double_curr_fst */ NULL, /* double_fini_fst */ 0, /* nonimplicit_direction_encountered */ 0, /* supplemental_datatypes_encountered */ 0, /* supplemental_vartypes_encountered */ 0, /* is_vhdl_component_format */ NULL, /* subvar_jrb */ 0, /* subvar_jrb_count */ NULL, /* subvar_pnt */ 0, /* fst_filetype */ 0, /* subvar_jrb_count_locked */ 0, /* stem_file_idx */ 0, /* stem_line_number */ NULL, /* stem_path_string_table */ NULL, /* stem_struct_base */ NULL, /* istem_struct_base */ 0, /* stem_path_string_table_siz */ 0, /* stem_path_string_table_alloc */ 0, /* stem_struct_base_siz */ 0, /* stem_struct_base_siz_alloc */ 0, /* istem_struct_base_siz */ 0, /* istem_struct_base_siz_alloc */ 0, /* stem_valid */ 0, /* istem_valid */ NULL, /* fst_synclock_str */ NULL, /* synclock_jrb */ /* * ghw.c */ 0, /* nxp_ghw_c_1 93 */ 0, /* sym_which_ghw_c_1 95 */ NULL, /* gwt_ghw_c_1 96 */ NULL, /* gwt_corr_ghw_c_1 97 */ 1, /* xlat_1164_ghw_c_1 98 */ 0, /* is_ghw 99 */ NULL, /* asbuf */ 0, /* nbr_sig_ref_ghw_c_1 101 */ 0, /* num_glitches_ghw_c_1 102 */ 0, /* num_glitch_regions_ghw_c_1 */ 0, /* fac_name_ghw_c_1 104 */ 0, /* fac_name_len_ghw_c_1 105 */ 0, /* fac_name_max_ghw_c_1 106 */ 0, /* last_fac_ghw_c_1 107 */ 0, /* warned_ghw_c_1 108 */ /* * globals.c */ NULL, /* dead_context */ NULL, /* gtk_context_bridge_ptr */ /* * help.c */ 0, /* helpbox_is_active 110 */ 0, /* text_help_c_1 111 */ 0, /* vscrollbar_help_c_1 112 */ #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) {NULL, NULL, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, NULL}, /* iter_help_c_1 113 */ 0, /* bold_tag_help_c_1 114 */ #endif 0, /* window_help_c_2 115 */ /* * hierpack.c */ NULL, /* hp_buf */ NULL, /* hp_offs */ 0, /* hp_prev */ 0, /* hp_buf_siz */ NULL, /* fmem_buf */ 0, /* fmem_buf_siz */ 0, /* fmem_buf_offs */ 0, /* fmem_uncompressed_siz */ 0, /* disable_auto_comphier */ /* * hiersearch.c */ 1, /* hier_grouping 116 */ 0, /* window_hiersearch_c_3 117 */ 0, /* entry_main_hiersearch_c_1 118 */ 0, /* clist_hiersearch_c_1 119 */ 0, /* bundle_direction_hiersearch_c_1 120 */ 0, /* cleanup_hiersearch_c_3 121 */ 0, /* num_rows_hiersearch_c_1 122 */ 0, /* selected_rows_hiersearch_c_1 123 */ 0, /* window1_hiersearch_c_1 124 */ 0, /* entry_hiersearch_c_2 125 */ NULL, /* entrybox_text_local_hiersearch_c_1 126 */ NULL, /* cleanup_e_hiersearch_c_1 127 */ NULL, /* h_selectedtree_hiersearch_c_1 128 */ NULL, /* current_tree_hiersearch_c_1 129 */ NULL, /* treechain_hiersearch_c_1 130 */ 0, /* is_active_hiersearch_c_1 131 */ /* * logfile.c */ NULL, /* logfiles */ NULL, /* fontname_logfile 133 */ NULL, /* font_logfile_c_1 134 */ #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) {NULL, NULL, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, NULL}, /* iter_logfile_c_2 135 */ NULL, /* bold_tag_logfile_c_2 136 */ NULL, /* mono_tag_logfile_c_1 137 */ NULL, /* size_tag_logfile_c_1 138 */ #endif /* * lx2.c */ LXT2_IS_INACTIVE, /* is_lx2 139 */ NULL, /* lx2_lx2_c_1 140 */ 0, /* first_cycle_lx2_c_1 141 */ 0, /* last_cycle */ 0, /* total_cycles */ NULL, /* lx2_table_lx2_c_1 142 */ NULL, /* mvlfacs_lx2_c_1 143 */ 0, /* busycnt_lx2_c_1 144 */ /* * lxt.c */ NULL, /* mm_lxt_mmap_addr */ 0, /* mm_lxt_mmap_len */ #if defined __MINGW32__ || defined _MSC_VER NULL, /* HANDLE hIn */ NULL, /* HANDLE hInMap */ NULL, /* char *win_fname = NULL; */ #endif 0, /* fpos_lxt_c_1 145 */ 0, /* is_lxt 146 */ 0, /* lxt_clock_compress_to_z 147 */ NULL, /* mm_lxt_c_1 148 */ NULL, /* mmcache_lxt_c_1 */ 0, /* version_lxt_c_1 149 */ NULL, /* mvlfacs_lxt_c_2 150 */ 0, /* first_cycle_lxt_c_2 151 */ 0, /* last_cycle */ 0, /* total_cycles */ 0, /* maxchange_lxt_c_1 152 */ 0, /* maxindex */ 0, /* f_len_lxt_c_1 153 */ NULL, /* positional_information_lxt_c_1 154 */ NULL, /* time_information 155 */ 0, /* change_field_offset_lxt_c_1 156 */ 0, /* facname_offset_lxt_c_1 157 */ 0, /* facgeometry_offset_lxt_c_1 158 */ 0, /* time_table_offset_lxt_c_1 159 */ 0, /* time_table_offset64_lxt_c_1 160 */ 0, /* sync_table_offset_lxt_c_1 161 */ 0, /* initial_value_offset_lxt_c_1 162 */ 0, /* timescale_offset_lxt_c_1 163 */ 0, /* double_test_offset_lxt_c_1 164 */ 0, /* zdictionary_offset_lxt_c_1 165 */ 0, /* zfacname_predec_size_lxt_c_1 166 */ 0, /* zfacname_size_lxt_c_1 167 */ 0, /* zfacgeometry_size_lxt_c_1 168 */ 0, /* zsync_table_size_lxt_c_1 169 */ 0, /* ztime_table_size_lxt_c_1 170 */ 0, /* zchg_predec_size_lxt_c_1 171 */ 0, /* zchg_size_lxt_c_1 172 */ 0, /* zdictionary_predec_size_lxt_c_1 173 */ AN_X, /* initial_value_lxt_c_1 174 */ 0, /* dict_num_entries_lxt_c_1 175 */ 0, /* dict_string_mem_required_lxt_c_1 176 */ 0, /* dict_16_offset_lxt_c_1 177 */ 0, /* dict_24_offset_lxt_c_1 178 */ 0, /* dict_32_offset_lxt_c_1 179 */ 0, /* dict_width_lxt_c_1 180 */ NULL, /* dict_string_mem_array_lxt_c_1 181 */ 0, /* exclude_offset_lxt_c_1 182 */ 0, /* lxt_timezero_offset */ NULL, /* lt_buf_lxt_c_1 183 */ 0, /* lt_len_lxt_c_1 184 */ -1, /* fd_lxt_c_1 185 */ {0,0,0,0,0,0,0,0}, /* double_mask_lxt_c_1 186 */ 0, /* double_is_native_lxt_c_1 187 */ 0, /* max_compare_time_tc_lxt_c_2 189 */ 0, /* max_compare_pos_tc_lxt_c_2 */ NULL, /* resolve_lxt_alias_to */ NULL, /* lastchange */ /* * main.c */ 1, /* is_gtkw_save_file */ 0, /* dumpfile_is_modified */ NULL, /* missing_file_toolbar */ NULL, /* argvlist */ #if defined(HAVE_LIBTCL) NULL, /* interp */ #endif NULL, /* repscript_name */ 500, /* repscript_period */ NULL, /* tcl_init_cmd */ 0, /* tcl_running */ 0, /* block_xy_update */ NULL, /* winname */ 0, /* num_notebook_pages */ 1, /* num_notebook_pages_cumulative */ 0, /* context_tabposition */ 0, /* this_context_page */ 0, /* second_page_created */ NULL, /* contexts */ NULL, /* notebook */ NULL, /* loaded_file_name */ NULL, /* unoptimized_vcd_file_name */ NULL, /* skip_start */ NULL, /* skip_end */ MISSING_FILE, /* loaded_file_type */ 0, /* is_optimized_stdin_vcd */ NULL, /* whoami 190 */ NULL, /* logfile 191 */ NULL, /* stems_name 192 */ WAVE_ANNO_NONE, /* stems_type 193 */ NULL, /* aet_name 194 */ NULL, /* anno_ctx 195 */ NULL, /* dual_ctx 196 */ 0, /* dual_id 197 */ 0, /* dual_attach_id_main_c_1 198 */ 0, /* dual_race_lock 199 */ NULL, /* mainwindow 200 */ NULL, /* signalwindow 201 */ NULL, /* wavewindow 202 */ NULL, /* toppanedwindow 203 */ NULL, /* panedwindow */ 0, /* toppanedwindow_size_cache */ 0, /* panedwindow_size_cache */ 0, /* vpanedwindow_size_cache */ NULL, /* sstpane 204 */ NULL, /* expanderwindow 205 */ 0, /* disable_window_manager 206 */ 0, /* disable_empty_gui */ 1, /* paned_pack_semantics 207 */ 0, /* zoom_was_explicitly_set 208 */ 1000, /* initial_window_x 209 */ 600, /* initial_window_y */ -1, /* initial_window_width */ -1, /* initial_window_height 210 */ 0, /* xy_ignore_main_c_1 211 */ 0, /* optimize_vcd 212 */ 1, /* num_cpus 213 */ -1, /* initial_window_xpos 214 */ -1, /* initial_window_ypos 214 */ 0, /* initial_window_set_valid 215 */ -1, /* initial_window_xpos_set 216 */ -1, /* initial_window_ypos_set */ 0, /* initial_window_get_valid 217 */ -1, /* initial_window_xpos_get 218 */ -1, /* initial_window_ypos_get 218 */ 0, /* xpos_delta 219 */ 0, /* ypos_delta 219 */ 0, /* use_scrollbar_only 220 */ 0, /* force_toolbars 221 */ 0, /* hide_sst 222 */ 1, /* sst_expanded 223 */ #ifdef WAVE_USE_GTK2 0, /* socket_xid 224 */ #endif 0, /* disable_menus 225 */ NULL, /* ftext_main_main_c_1 226 */ #ifdef WAVE_USE_GTK2 1, /* use_toolbutton_interface */ #else 0, /* use_toolbutton_interface */ #endif /* * markerbox.c */ NULL, /* window_markerbox_c_4 231 */ {0}, /* entries_markerbox_c_1 232 */ NULL, /* cleanup_markerbox_c_4 233 */ 0, /* dirty_markerbox_c_1 234 */ {0}, /* shadow_markers_markerbox_c_1 235 */ {NULL}, /* marker_names */ {NULL}, /* shadow_marker_names */ /* * menu.c */ NULL, /* cutcopylist */ 0, /* enable_fast_exit 236 */ 0, /* quiet_checkmenu */ NULL, /* wave_script_args 237 */ 0, /* ignore_savefile_pane_pos */ 0, /* ignore_savefile_pos 238 */ 0, /* ignore_savefile_size 239 */ #ifndef WAVE_USE_MLIST_T NULL, /* item_factory_menu_c_1 241 */ #endif NULL, /* regexp_string_menu_c_1 242 */ NULL, /* trace_to_alias_menu_c_1 243 */ NULL, /* showchangeall_menu_c_1 244 */ NULL, /* filesel_newviewer_menu_c_1 245 */ NULL, /* filesel_logfile_menu_c_1 246 */ NULL, /* filesel_scriptfile_menu */ NULL, /* filesel_writesave 247 */ NULL, /* filesel_imagegrab */ 0, /* save_success_menu_c_1 248 */ NULL, /* filesel_vcd_writesave 249 */ NULL, /* filesel_lxt_writesave 250 */ NULL, /* filesel_tim_writesave */ 0, /* lock_menu_c_1 251 */ 0, /* lock_menu_c_2 252 */ NULL, /* buf_menu_c_1 253 128 */ NULL, /* signal_popup_menu */ NULL, /* sst_signal_popup_menu */ /* * mouseover.c */ 1, /* disable_mouseover 254 */ 0, /* clipboard_mouseover */ NULL, /* mouseover_mouseover_c_1 255 */ NULL, /* mo_area_mouseover_c_1 256 */ NULL, /* mo_pixmap_mouseover_c_1 257 */ NULL, /* mo_dk_gray_mouseover_c_1 258 */ NULL, /* mo_black_mouseover_c_1 259 */ 0, /* mo_width_mouseover_c_1 260 */ 0, /* mo_height_mouseover_c_1 260 */ /* * pagebuttons.c */ 1.0, /* page_divisor 261 */ /* * pixmaps.c */ NULL, /* redo_pixmap */ NULL, /* redo_mask */ NULL, /* larrow_pixmap 263 */ NULL, /* larrow_mask 264 */ NULL, /* rarrow_pixmap 266 */ NULL, /* rarrow_mask 267 */ NULL, /* zoomin_pixmap 269 */ NULL, /* zoomin_mask 270 */ NULL, /* zoomout_pixmap 272 */ NULL, /* zoomout_mask 273 */ NULL, /* zoomfit_pixmap 275 */ NULL, /* zoomfit_mask 276 */ NULL, /* zoomundo_pixmap 278 */ NULL, /* zoomundo_mask 279 */ NULL, /* zoom_larrow_pixmap 281 */ NULL, /* zoom_larrow_mask 282 */ NULL, /* zoom_rarrow_pixmap 284 */ NULL, /* zoom_rarrow_mask 285 */ NULL, /* prev_page_pixmap 287 */ NULL, /* prev_page_mask 288 */ NULL, /* next_page_pixmap 290 */ NULL, /* next_page_mask 291 */ NULL, /* wave_info_pixmap 293 */ NULL, /* wave_info_mask 294 */ NULL, /* wave_alert_pixmap 296 */ NULL, /* wave_alert_mask 297 */ NULL, /* hiericon_module_pixmap */ NULL, /* hiericon_module_mask */ NULL, /* hiericon_task_pixmap */ NULL, /* hiericon_task_mask */ NULL, /* hiericon_function_pixmap */ NULL, /* hiericon_function_mask */ NULL, /* hiericon_begin_pixmap */ NULL, /* hiericon_begin_mask */ NULL, /* hiericon_fork_pixmap */ NULL, /* hiericon_fork_mask */ NULL, /* hiericon_interface_pixmap */ NULL, /* hiericon_interface_mask */ NULL, /* hiericon_svpackage_pixmap */ NULL, /* hiericon_svpackage_mask */ NULL, /* hiericon_program_pixmap */ NULL, /* hiericon_program_mask */ NULL, /* hiericon_class_pixmap */ NULL, /* hiericon_class_mask */ NULL, /* hiericon_record_pixmap */ NULL, /* hiericon_record_mask */ NULL, /* hiericon_generate_pixmap */ NULL, /* hiericon_generate_mask */ NULL, /* hiericon_design_pixmap */ NULL, /* hiericon_design_mask */ NULL, /* hiericon_block_pixmap */ NULL, /* hiericon_block_mask */ NULL, /* hiericon_generateif_pixmap */ NULL, /* hiericon_generateif_mask */ NULL, /* hiericon_generatefor_pixmap */ NULL, /* hiericon_generatefor_mask */ NULL, /* hiericon_instance_pixmap */ NULL, /* hiericon_instance_mask */ NULL, /* hiericon_package_pixmap */ NULL, /* hiericon_package_mask */ NULL, /* hiericon_signal_pixmap */ NULL, /* hiericon_signal_mask */ NULL, /* hiericon_portin_pixmap */ NULL, /* hiericon_portin_mask */ NULL, /* hiericon_portout_pixmap */ NULL, /* hiericon_portout_mask */ NULL, /* hiericon_portinout_pixmap */ NULL, /* hiericon_portinout_mask */ NULL, /* hiericon_buffer_pixmap */ NULL, /* hiericon_buffer_mask */ NULL, /* hiericon_linkage_pixmap */ NULL, /* hiericon_linkage_mask */ /* * print.c */ 72, /* inch_print_c_1 298 */ 1.0, /* ps_chwidth_print_c_1 299 */ 0, /* ybound_print_c_1 300 */ 0, /* pr_signal_fill_width_print_c_1 301 */ 0, /* ps_nummaxchars_print_c_1 302 */ 1, /* ps_fullpage 303 */ 66, /* ps_maxveclen 304 */ 0, /* liney_max 305 */ /* * ptranslate.c */ 0, /* current_translate_proc 308 */ 0, /* current_filter_ptranslate_c_1 309 */ 0, /* num_proc_filters 310 */ NULL, /* procsel_filter 311 */ NULL, /* proc_filter 312 */ 0, /* is_active_ptranslate_c_2 313 */ NULL, /* fcurr_ptranslate_c_1 314 */ NULL, /* window_ptranslate_c_5 315 */ NULL, /* clist_ptranslate_c_2 316 */ /* * rc.c */ 0, /* rc_line_no 318 */ 1, /* possibly_use_rc_defaults 319 */ NULL, /* editor_string */ /* * regex.c */ NULL, /* preg_regex_c_1 321 */ NULL, /* regex_ok_regex_c_1 322 */ /* * renderopt.c */ #ifdef WAVE_GTK_UNIX_PRINT NULL, /* gprs */ NULL, /* gps */ NULL, /* gp_tfn */ #endif 0, /* is_active_renderopt_c_3 323 */ 0, /* window_renderopt_c_6 324 */ NULL, /* filesel_print_pdf_renderopt_c_1 */ NULL, /* filesel_print_ps_renderopt_c_1 325 */ NULL, /* filesel_print_mif_renderopt_c_1 326 */ {0,0,0,0}, /* target_mutex_renderopt_c_1 328 */ {0,0,0,0,0}, /* page_mutex_renderopt_c_1 330 */ {0,0,0}, /* render_mutex_renderopt_c_1 332 */ 0, /* page_size_type_renderopt_c_1 333 */ /* * savefile.c */ NULL, /* sfn */ NULL, /* lcname */ /* * search.c */ {NULL,NULL,NULL,NULL,NULL}, /* menuitem_search */ NULL, /* window1_search_c_2 340 */ NULL, /* entry_a_search_c_1 341 */ NULL, /* entrybox_text_local_search_c_2 342 */ NULL, /* cleanup_e_search_c_2 343 */ NULL, /* pdata 344 */ 0, /* is_active_search_c_4 345 */ 0, /* is_insert_running_search_c_1 346 */ 0, /* is_replace_running_search_c_1 347 */ 0, /* is_append_running_search_c_1 348 */ 0, /* is_searching_running_search_c_1 349 */ {0,0,0,0,0}, /* regex_mutex_search_c_1 352 */ 0, /* regex_which_search_c_1 353 */ NULL, /* window_search_c_7 354 */ NULL, /* entry_search_c_3 355 */ NULL, /* clist_search_c_3 356 */ NULL, /* searchbox_text_search_c_1 358 */ 0, /* bundle_direction_search_c_2 359 */ NULL, /* cleanup_search_c_5 360 */ 0, /* num_rows_search_c_2 361 */ 0, /* selected_rows_search_c_2 362 */ /* * showchange.c */ NULL, /* button1_showchange_c_1 363 */ NULL, /* button1_showchange_c_2 363 */ NULL, /* button1_showchange_c_3 363 */ NULL, /* button1_showchange_c_4 363 */ NULL, /* button1_showchange_c_5 363 */ NULL, /* button1_showchange_c_6 363 */ NULL, /* toggle1_showchange_c_1 364 */ NULL, /* toggle2_showchange_c_1 364 */ NULL, /* toggle3_showchange_c_1 364 */ NULL, /* toggle4_showchange_c_1 364 */ NULL, /* window_showchange_c_8 365 */ NULL, /* cleanup_showchange_c_6 366 */ NULL, /* tcache_showchange_c_1 367 */ 0, /* flags_showchange_c_1 368 */ /* * signalwindow.c */ NULL, /* signalarea 369 */ NULL, /* signalfont 370 */ NULL, /* signalpixmap 371 */ #ifdef WAVE_ALLOW_QUARTZ_FLUSH_WORKAROUND 0, /* force_hide_show */ #endif 0, /* max_signal_name_pixel_width 372 */ 0, /* signal_pixmap_width 373 */ 0, /* signal_fill_width 374 */ 0, /* old_signal_fill_width 375 */ 0, /* old_signal_fill_height */ 1, /* right_align_active */ 1, /* fontheight 376 */ 0, /* dnd_state 377 */ 0, /* dnd_cursor_timer */ NULL, /* hscroll_signalwindow_c_1 378 */ NULL, /* signal_hslider 379 */ 0, /* cachedhiflag_signalwindow_c_1 380 */ -1, /* cachedwhich_signalwindow_c_1 381 */ NULL, /* cachedtrace 382 */ NULL, /* shift_click_trace 383 */ 0, /* trtarget_signalwindow_c_1 384 */ NULL, /* starting_unshifted_trace */ 0, /* standard_trace_dnd_degate */ 0, /* use_standard_trace_select */ 1, /* use_standard_clicking */ 0, /* std_collapse_pressed */ 0, /* std_dnd_tgt_on_signalarea */ 0, /* std_dnd_tgt_on_wavearea */ 0, /* signalarea_has_focus */ NULL, /* signalarea_event_box */ 0, /* keypress_handler_id */ 0, /* cached_mouseover_x */ 0, /* cached_mouseover_y */ 0, /* mouseover_counter */ 0, /* button2_debounce_flag */ 0, /* dragzoom_threshold */ /* * simplereq.c */ NULL, /* window_simplereq_c_9 385 */ NULL, /* cleanup 386 */ /* * splash.c */ 0, /* splash_is_loading */ 0, /* splash_fix_win_title */ 1, /* splash_disable 387 */ NULL, /* wave_splash_pixmap 389 */ NULL, /* wave_splash_mask 390 */ NULL, /* splash_splash_c_1 391 */ NULL, /* darea_splash_c_1 392 */ NULL, /* gt_splash_c_1 393 */ 0, /* timeout_tag 394 */ 0, /* load_complete_splash_c_1 395 */ 2, /* cnt_splash_c_1 396 */ 0, /* prev_bar_x_splash_c_1 397 */ /* * status.c */ NULL, /* text_status_c_2 398 */ NULL, /* vscrollbar_status_c_2 399 */ #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) {NULL, NULL, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, NULL}, /* iter_status_c_3 400 */ NULL, /* bold_tag_status_c_3 401 */ #endif /* * strace.c */ NULL, /* strace_ctx (defined in strace.h for multiple strace sessions) */ { {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,{0,0,0,0,0,0},{0,0,0,0,0,0},0,0,0,0,0,0,0}, /* strace_windows[0] */ #ifdef WAVE_USE_GTK2 {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,{0,0,0,0,0,0},{0,0,0,0,0,0},0,0,0,0,0,0,0} #endif }, /* strace_windows[1] */ #if WAVE_NUM_STRACE_WINDOWS != 2 #ifdef WAVE_USE_GTK2 #error the number of strace windows as defined in strace.h does not match globals.c! #else #if WAVE_NUM_STRACE_WINDOWS != 1 #error gtk1 only supports 1 strace window, sorry! #endif #endif #endif 0, /* strace_current_window */ 1, /* strace_repeat_count */ /* * symbol.c */ #ifdef _WAVE_HAVE_JUDY NULL, /* sym_judy */ NULL, /* s_selected */ #endif NULL, /* sym_hash 424 */ NULL, /* facs 425 */ 0, /* facs_are_sorted 426 */ 0, /* facs_have_symbols_state_machine */ 0, /* numfacs 427 */ 0, /* regions 428 */ 0, /* longestname 429 */ NULL, /* firstnode 430 */ NULL, /* curnode 431 */ 0, /* hashcache 432 */ /* * tcl_commands.c */ NULL, /* previous_braced_tcl_string */ /* * tcl_helper.c */ 0, /* in_tcl_callback */ /* * timeentry.c */ NULL, /* from_entry 433 */ NULL, /* to_entry */ /* * translate.c */ 0, /* current_translate_file 434 */ 0, /* current_filter_translate_c_2 435 */ 0, /* num_file_filters 436 */ NULL, /* filesel_filter 437 */ NULL, /* xl_file_filter 438 */ 0, /* is_active_translate_c_5 439 */ NULL, /* fcurr_translate_c_2 440 */ NULL, /* window_translate_c_11 441 */ NULL, /* clist_translate_c_4 442 */ /* * tree.c */ #ifdef _WAVE_HAVE_JUDY NULL, /* sym_tree */ NULL, /* sym_tree_addresses */ #endif NULL, /* treeroot 443 */ NULL, /* mod_tree_parent */ NULL, /* module_tree_c_1 444 */ 0, /* module_len_tree_c_1 445 */ NULL, /* terminals_tchain_tree_c_1 446 */ '.', /* hier_delimeter 447 */ 0, /* hier_was_explicitly_set 448 */ 0x00, /* alt_hier_delimeter 449 */ 1, /* fast_tree_sort 450 */ NULL, /* facs2_tree_c_1 451 */ 0, /* facs2_pos_tree_c_1 452 */ NULL, /* talloc_pool_base */ 0, /* talloc_idx */ /* * tree_component.c */ #ifdef _WAVE_HAVE_JUDY NULL, /* comp_name_judy */ #else NULL, /* comp_name_jrb */ #endif NULL, /* comp_name_idx */ 0, /* comp_name_serial */ 0, /* comp_name_total_stringmem */ 0, /* comp_name_longest */ /* * treesearch_gtk1.c */ NULL, /* GtkWidget *window1_treesearch_gtk1_c; */ NULL, /* GtkWidget *entry_a_treesearch_gtk1_c; */ NULL, /* char *entrybox_text_local_treesearch_gtk1_c; */ NULL, /* void (*cleanup_e_treesearch_gtk1_c)(); */ NULL, /* struct tree *selectedtree_treesearch_gtk1_c; */ 0, /* int is_active_treesearch_gtk1_c; */ NULL, /* GtkWidget *window_treesearch_gtk1_c; */ NULL, /* GtkWidget *tree_treesearch_gtk1_c; */ 0, /* char bundle_direction_treesearch_gtk1_c; */ NULL, /* void (*cleanup_treesearch_gtk1_c)(); */ /* * treesearch_gtk2.c */ #ifdef MAC_INTEGRATION NULL, /* dnd_helper_quartz */ #endif NULL, /* treeopen_chain_head */ NULL, /* treeopen_chain_curr */ 0, /* tree_dnd_begin */ 0, /* tree_dnd_requested */ 1, /* do_dynamic_treefilter */ NULL, /* treesearch_gtk2_window_vbox */ NULL, /* selected_hierarchy_name */ NULL, /* selected_sig_name */ NULL, /* gtk2_tree_frame */ NULL, /* filter_entry */ NULL, /* any_tree_node */ NULL, /* open_tree_nodes */ 0, /* autoname_bundles 453 */ NULL, /* window1_treesearch_gtk2_c_3 454 */ NULL, /* entry_a_treesearch_gtk2_c_2 455 */ NULL, /* entrybox_text_local_treesearch_gtk2_c_3 456 */ NULL, /* cleanup_e_treesearch_gtk2_c_3 457 */ NULL, /* sig_root_treesearch_gtk2_c_1 458 */ NULL, /* sst_sig_root_treesearch_gtk2_c_1 */ NULL, /* filter_str_treesearch_gtk2_c_1 459 */ ND_DIR_UNSPECIFIED, /* filter_typ_treesearch_gtk2_c_1 */ 0, /* filter_typ_polarity_treesearch_gtk2_c_1 */ 0, /* filter_matlen_treesearch_gtk2_c_1 */ 0, /* filter_noregex_treesearch_gtk2_c_1 */ #if defined(WAVE_USE_GTK2) NULL, /* sig_store_treesearch_gtk2_c_1 460 */ NULL, /* sig_selection_treesearch_gtk2_c_1 461 */ #endif 0, /* is_active_treesearch_gtk2_c_6 462 */ NULL, /* ctree_main 463 */ NULL, /* afl_treesearch_gtk2_c_1 464 */ NULL, /* window_treesearch_gtk2_c_12 465 */ NULL, /* tree_treesearch_gtk2_c_1 466 */ NULL, /* cleanup_treesearch_gtk2_c_8 468 */ 0, /* pre_import_treesearch_gtk2_c_1 469 */ {0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0}, /* tcache_treesearch_gtk2_c_2 470 */ 0, /* dnd_tgt_on_signalarea_treesearch_gtk2_c_1 471 */ 0, /* dnd_tgt_on_wavearea_treesearch_gtk2_c_1 */ NULL, /* dnd_sigview */ NULL, /* sst_vpaned */ 0, /* fetchlow */ 0, /* fetchhigh */ /* * ttranslate.c */ 0, /* current_translate_ttrans */ 0, /* current_filter_ttranslate_c_1 */ 0, /* num_ttrans_filters */ NULL, /* ttranssel_filter */ NULL, /* ttrans_filter */ 0, /* is_active_ttranslate_c_2 */ NULL, /* fcurr_ttranslate_c_1 */ NULL, /* window_ttranslate_c_5 */ NULL, /* clist_ttranslate_c_2 */ NULL, /* ttranslate_args */ /* * vcd.c */ 0, /* do_hier_compress */ NULL, /* prev_hier_uncompressed_name */ NULL, /* vcd_jmp_buf */ -1, /* vcd_warning_filesize 472 */ 1, /* autocoalesce 473 */ 0, /* autocoalesce_reversal */ -1, /* vcd_explicit_zero_subscripts 474 */ 0, /* convert_to_reals 475 */ 1, /* atomic_vectors 476 */ 0, /* make_vcd_save_file 477 */ 0, /* vcd_preserve_glitches 478 */ 0, /* vcd_preserve_glitches_real */ NULL, /* vcd_save_handle 479 */ NULL, /* vcd_handle_vcd_c_1 480 */ 0, /* vcd_is_compressed_vcd_c_1 481 */ 0, /* vcdbyteno_vcd_c_1 482 */ 0, /* error_count_vcd_c_1 483 */ 0, /* header_over_vcd_c_1 484 */ 0, /* dumping_off_vcd_c_1 485 */ -1, /* start_time_vcd_c_1 486 */ -1, /* end_time_vcd_c_1 487 */ -1, /* current_time_vcd_c_1 488 */ 0, /* num_glitches_vcd_c_2 489 */ 0, /* num_glitch_regions_vcd_c_2 490 */ {0, 0}, /* vcd_hier_delimeter 491 */ NULL, /* pv_vcd_c_1 492 */ NULL, /* rootv_vcd_c_1 */ NULL, /* vcdbuf_vcd_c_1 493 */ NULL, /* vst */ NULL, /* vend */ 0, /* escaped_names_found_vcd_c_1 494 */ NULL, /* slistroot 495 */ NULL, /* slistcurr */ NULL, /* slisthier 496 */ 0, /* slisthier_len 497x */ 1024, /* T_MAX_STR_vcd_c_1 499 */ NULL, /* yytext_vcd_c_1 500 */ 0, /* yylen_vcd_c_1 501 */ 0, /* yylen_cache */ NULL, /* vcdsymroot_vcd_c_1 502 */ NULL, /* vcdsymcurr */ NULL, /* sorted_vcd_c_1 503 */ NULL, /* indexed_vcd_c_1 504 */ 0, /* numsyms_vcd_c_1 505 */ NULL, /* he_curr_vcd_c_1 506 */ NULL, /* he_fini */ ~0, /* vcd_minid_vcd_c_1 508 */ 0, /* vcd_maxid_vcd_c_1 509 */ 0, /* err_vcd_c_1 510 */ 0, /* vcd_fsiz_vcd_c_1 511 */ NULL, /* varsplit_vcd_c_1 512 */ NULL, /* varsplitcurr */ 0, /* var_prevch_vcd_c_1 513 */ /* * vcd_partial.c */ 0, /* vcdbyteno_vcd_partial_c_2 516 */ 0, /* error_count_vcd_partial_c_2 517 */ 0, /* header_over_vcd_partial_c_2 518 */ 0, /* dumping_off_vcd_partial_c_2 519 */ -1, /* start_time_vcd_partial_c_2 520 */ -1, /* end_time_vcd_partial_c_2 521 */ -1, /* current_time_vcd_partial_c_2 522 */ 0, /* num_glitches_vcd_partial_c_3 523 */ 0, /* num_glitch_regions_vcd_partial_c_3 524 */ NULL, /* pv_vcd_partial_c_2 525 */ NULL, /* rootv */ NULL, /* vcdbuf_vcd_partial_c_2 526 */ NULL, /* vst */ NULL, /* vend */ NULL, /* consume_ptr_vcd_partial_c_1 527 */ NULL, /* buf_vcd_partial_c_2 528 */ 100000, /* consume_countdown_vcd_partial_c_1 529 */ 1024, /* T_MAX_STR_vcd_partial_c_2 531 */ NULL, /* yytext_vcd_partial_c_2 532 */ 0, /* yylen_vcd_partial_c_2 533 */ 0, /* yylen_cache */ NULL, /* vcdsymroot_vcd_partial_c_2 534 */ NULL, /* vcdsymcurr */ NULL, /* sorted_vcd_partial_c_2 535 */ NULL, /* indexed_vcd_partial_c_2 536 */ 0, /* numsyms_vcd_partial_c_2 538 */ ~0, /* vcd_minid_vcd_partial_c_2 540 */ 0, /* vcd_maxid_vcd_partial_c_2 541 */ 0, /* err_vcd_partial_c_2 542 */ NULL, /* varsplit_vcd_partial_c_2 543 */ NULL, /* vsplitcurr */ 0, /* var_prevch_vcd_partial_c_2 544 */ 0, /* timeset_vcd_partial_c_1 547 */ /* * vcd_recoder.c */ NULL, /* time_vlist_vcd_recoder_c_1 548 */ NULL, /* time_vlist_vcd_recoder_write */ NULL, /* fastload_depacked */ NULL, /* fastload_current */ 0, /* time_vlist_count_vcd_recoder_c_1 549 */ NULL, /* vcd_handle_vcd_recoder_c_2 550 */ 0, /* vcd_is_compressed_vcd_recoder_c_2 551 */ VCD_FSL_NONE, /* use_fastload */ 0, /* vcdbyteno_vcd_recoder_c_3 552 */ 0, /* error_count_vcd_recoder_c_3 553 */ 0, /* header_over_vcd_recoder_c_3 554 */ 0, /* dumping_off_vcd_recoder_c_3 555 */ -1, /* start_time_vcd_recoder_c_3 556 */ -1, /* end_time_vcd_recoder_c_3 557 */ -1, /* current_time_vcd_recoder_c_3 558 */ 0, /* num_glitches_vcd_recoder_c_4 559 */ 0, /* num_glitch_regions_vcd_recoder_c_4 560 */ NULL, /* pv_vcd_recoder_c_3 561 */ NULL, /* rootv */ NULL, /* vcdbuf_vcd_recoder_c_3 562 */ NULL, /* vst */ NULL, /* vend */ 1024, /* T_MAX_STR_vcd_recoder_c_3 564 */ NULL, /* yytext_vcd_recoder_c_3 565 */ 0, /* yylen_vcd_recoder_c_3 566 */ 0, /* yylen_cache */ NULL, /* vcdsymroot_vcd_recoder_c_3 567 */ NULL, /* vcdsymcurr */ NULL, /* sorted_vcd_recoder_c_3 568 */ NULL, /* indexed_vcd_recoder_c_3 569 */ 0, /* numsyms_vcd_recoder_c_3 570 */ ~0, /* vcd_minid_vcd_recoder_c_3 571 */ 0, /* vcd_maxid_vcd_recoder_c_3 572 */ 0, /* err_vcd_recoder_c_3 573 */ 0, /* vcd_fsiz_vcd_recoder_c_2 574 */ NULL, /* varsplit_vcd_recoder_c_3 575 */ NULL, /* vsplitcurr */ 0, /* var_prevch_vcd_recoder_c_3 576 */ 0, /* vcd_hash_max */ 0, /* vcd_hash_kill */ /* * vcd_saver.c */ NULL, /* f_vcd_saver_c_1 579 */ {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0}, /* buf_vcd_saver_c_3 580 */ NULL, /* hp_vcd_saver_c_1 581 */ NULL, /* nhold_vcd_saver_c_1 582 */ /* * vlist.c */ 0, /* vlist_spill_to_disk */ 0, /* vlist_prepack */ NULL, /* vlist_handle */ 0, /* vlist_bytes_written */ 4, /* vlist_compression_depth 583 */ /* * vzt.c */ NULL, /* vzt_vzt_c_1 584 */ 0, /* first_cycle_vzt_c_3 585 */ 0, /* last_cycle */ 0, /* total_cycles */ NULL, /* vzt_table_vzt_c_1 586 */ NULL, /* mvlfacs_vzt_c_3 587 */ 0, /* busycnt_vzt_c_2 588 */ /* * wavewindow.c */ 0, /* highlight_wavewindow */ 1, /* alt_wheel_mode */ 0, /* use_scrollwheel_as_y */ 0, /* enable_slider_zoom */ 0, /* m1x_wavewindow_c_1 589 */ 0, /* m2x_wavewindow_c_1 */ 0, /* black_and_white */ 1, /* signalwindow_width_dirty 590 */ 1, /* enable_ghost_marker 591 */ 1, /* enable_horiz_grid 592 */ 1, /* enable_vert_grid 593 */ 0, /* use_big_fonts 594 */ 0, /* use_nonprop_fonts */ ~0, /* do_resize_signals 595 */ ~0, /* first_unsized_signals */ 0, /* initial_signal_window_width */ 0, /* constant_marker_update 596 */ 0, /* use_roundcaps 597 */ ~0, /* show_base 598 */ ~0, /* wave_scrolling 599 */ 4, /* vector_padding 600 */ 0, /* in_button_press_wavewindow_c_1 601 */ 0, /* left_justify_sigs 602 */ 0, /* zoom_pow10_snap 603 */ 0, /* zoom_dyn */ 0, /* zoom_dyne */ 0, /* cursor_snap 604 */ -1.0, /* old_wvalue 605 */ NULL, /* blackout_regions 606 */ 0, /* zoom 607 */ 1, /* scale */ 1, /* nsperframe */ 1, /* pixelsperframe 608 */ 1.0, /* hashstep 609 */ -1, /* prevtim_wavewindow_c_1 610 */ 1.0, /* pxns 611 */ 1.0, /* nspx */ 2.0, /* zoombase 612 */ NULL, /* topmost_trace 613 */ 1, /* waveheight 614 */ 0, /* wavecrosspiece */ 1, /* wavewidth 615 */ NULL, /* wavefont 616 */ NULL, /* wavefont_smaller 617 */ NULL, /* wavearea 618 */ NULL, /* vscroll_wavewindow_c_1 619 */ NULL, /* hscroll_wavewindow_c_2 620 */ NULL, /* wavepixmap_wavewindow_c_1 621 */ NULL, /* wave_vslider 622 */ NULL, /* wave_hslider */ {0}, /* named_markers 623 */ -1, /* named_marker_lock_idx */ 0, /* made_gc_contexts_wavewindow_c_1 624 */ 0, /* which_t_color */ NULL, /* gc_white 650 */ NULL, /* gc_black 651 */ {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}, /* gc */ WAVE_RAINBOW_INITIALIZER, /* gc_rainbow */ 0, /* made_sgc_contexts_wavewindow_c_1 649 */ 0, /* fill_in_smaller_rgb_areas_wavewindow_c_1 659 */ -1, /* prev_markertime */ {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}, /* gccache */ 20, /* analog_redraw_skip_count */ 0, /* str_wid_x */ 0, /* str_wid_width */ 0, /* str_wid_bigw */ 0, /* str_wid_state */ 0, /* str_wid_slider */ 0, /* str_wid_height */ 0, /* ruler_origin */ 0, /* ruler_step */ 0, /* fill_waveform */ /* * zoombuttons.c */ 1, /* do_zoom_center 660 */ 0, /* do_initial_zoom_fit 661 */ 0, /* do_initial_zoom_fit_used */ }; /* * prototypes (because of struct Global header recursion issues */ void *calloc_2_into_context(struct Global *g, size_t nmemb, size_t size); /* * context manipulation functions */ struct Global *initialize_globals(void) { struct Global *g = calloc(1,sizeof(struct Global)); /* allocate viewer context */ memcpy(g, &globals_base_values, sizeof(struct Global)); /* fill in the blanks */ g->gtk_context_bridge_ptr = calloc(1, sizeof(struct Global *)); *(g->gtk_context_bridge_ptr) = g; g->buf_menu_c_1 = calloc_2_into_context(g, 1, 65537); /* do remaining mallocs into new ctx */ g->regexp_string_menu_c_1 = calloc_2_into_context(g, 1, 129); g->regex_ok_regex_c_1 = calloc_2_into_context(g, WAVE_REGEX_TOTAL, sizeof(int)); g->preg_regex_c_1 = calloc_2_into_context(g, WAVE_REGEX_TOTAL, sizeof(regex_t)); g->strace_ctx = &g->strace_windows[0]; /* arbitrarily point to first one */ return(g); /* what to do with ctx is at discretion of caller */ } void strcpy2_into_new_context(struct Global *g, char **newstrref, char **oldstrref) { char *o = *oldstrref; char *n; if(o) /* only allocate + copy string if nonnull pointer */ { n = calloc_2_into_context(g, 1, strlen(o) + 1); strcpy(n, o); *newstrref = n; } } /* * widget destruction functions */ static void widget_ungrab_destroy(GtkWidget **wp) { if(*wp) { wave_gtk_grab_remove(*wp); gtk_widget_destroy(*wp); *wp = NULL; } } static void widget_only_destroy(GtkWidget **wp) { if(*wp) { gtk_widget_destroy(*wp); *wp = NULL; } } /* * setjump to avoid -Wclobbered issues */ static int handle_setjmp(void) { struct Global *setjmp_globals; int load_was_success = 0; GLOBALS->vcd_jmp_buf = calloc(1, sizeof(jmp_buf)); setjmp_globals = calloc(1,sizeof(struct Global)); /* allocate yet another copy of viewer context */ memcpy(setjmp_globals, GLOBALS, sizeof(struct Global)); /* clone */ GLOBALS->alloc2_chain = NULL; /* will merge this in after load if successful */ GLOBALS->outstanding = 0; /* zero out count of chunks in this ctx */ if(!setjmp(*(GLOBALS->vcd_jmp_buf))) /* loader exception handling */ { switch(GLOBALS->loaded_file_type) /* on fail, longjmp called in these loaders */ { case LXT_FILE: lxt_main(GLOBALS->loaded_file_name); break; case VCD_FILE: vcd_main(GLOBALS->loaded_file_name); break; case VCD_RECODER_FILE: vcd_recoder_main(GLOBALS->loaded_file_name); break; default: break; } #ifdef _WAVE_HAVE_JUDY { Pvoid_t PJArray = (Pvoid_t)setjmp_globals->alloc2_chain; int rcValue; Word_t Index; Index = 0; for (rcValue = Judy1First(PJArray, &Index, PJE0); rcValue != 0; rcValue = Judy1Next(PJArray, &Index, PJE0)) { Judy1Set ((Pvoid_t)&GLOBALS->alloc2_chain, Index, PJE0); } GLOBALS->outstanding += setjmp_globals->outstanding; Judy1FreeArray(&PJArray, PJE0); } #else { void **t, **t2; t = (void **)setjmp_globals->alloc2_chain; while(t) { t2 = (void **) *(t+1); if(t2) { t = t2; } else { *(t+1) = GLOBALS->alloc2_chain; if(GLOBALS->alloc2_chain) { t2 = (void **)GLOBALS->alloc2_chain; *(t2+0) = t; } GLOBALS->alloc2_chain = setjmp_globals->alloc2_chain; GLOBALS->outstanding += setjmp_globals->outstanding; break; } } } #endif free(GLOBALS->vcd_jmp_buf); GLOBALS->vcd_jmp_buf = NULL; free(setjmp_globals); setjmp_globals = NULL; load_was_success = 1; } else { free(GLOBALS->vcd_jmp_buf); GLOBALS->vcd_jmp_buf = NULL; if(GLOBALS->vcd_handle_vcd_c_1) { if(GLOBALS->vcd_is_compressed_vcd_c_1) { pclose(GLOBALS->vcd_handle_vcd_c_1); GLOBALS->vcd_handle_vcd_c_1 = NULL; } else { fclose(GLOBALS->vcd_handle_vcd_c_1); GLOBALS->vcd_handle_vcd_c_1 = NULL; } } if(GLOBALS->vcd_handle_vcd_recoder_c_2) { if(GLOBALS->vcd_is_compressed_vcd_recoder_c_2) { pclose(GLOBALS->vcd_handle_vcd_recoder_c_2); GLOBALS->vcd_handle_vcd_recoder_c_2 = NULL; } else { fclose(GLOBALS->vcd_handle_vcd_recoder_c_2); GLOBALS->vcd_handle_vcd_recoder_c_2 = NULL; } } if(GLOBALS->vlist_handle) { fclose(GLOBALS->vlist_handle); GLOBALS->vlist_handle = NULL; } if(GLOBALS->mm_lxt_mmap_addr) { munmap(GLOBALS->mm_lxt_mmap_addr, GLOBALS->mm_lxt_mmap_len); GLOBALS->mm_lxt_mmap_addr = NULL; } free_outstanding(); /* free anything allocated in loader ctx */ memcpy(GLOBALS, setjmp_globals, sizeof(struct Global)); /* copy over old ctx */ free(setjmp_globals); /* remove cached old ctx */ /* now try again, jump through recovery sequence below */ } return(load_was_success); } /* * reload from old into the new context */ void reload_into_new_context_2(void) { FILE *statefile; struct Global *new_globals; /* gint tree_frame_x = -1; */ /* scan-build */ #if WAVE_USE_GTK2 gint tree_frame_y = -1; gdouble tree_vadj_value = 0.0; gdouble tree_hadj_value = 0.0; gdouble treeview_vadj_value = 0.0; gdouble treeview_hadj_value = 0.0; #endif int fix_from_time = 0, fix_to_time = 0; TimeType from_time = LLDescriptor(0), to_time = LLDescriptor(0); char timestr[32]; struct stringchain_t *hier_head = NULL, *hier_curr = NULL; int load_was_success = 0; int reload_fail_delay = 1; char *save_tmpfilename = NULL; char *reload_tmpfilename = NULL; int fd_dummy = -1; int s_ctx_iter; /* save these in case we decide to write out the rc file later as a user option */ char cached_ignore_savefile_pane_pos = GLOBALS->ignore_savefile_pane_pos; char cached_ignore_savefile_pos = GLOBALS->ignore_savefile_pos; char cached_ignore_savefile_size = GLOBALS->ignore_savefile_size; char cached_splash_disable = GLOBALS->splash_disable; if((GLOBALS->loaded_file_type == MISSING_FILE)||(GLOBALS->is_optimized_stdin_vcd)) { fprintf(stderr, "GTKWAVE | Nothing to reload!\n"); return; } logbox_reload(); /* kill any pending splash screens (e.g., from Tcl "wish") */ splash_button_press_event(NULL, NULL); /* fix problem where ungrab doesn't occur if button pressed + simultaneous reload accelerator key occurs */ if(GLOBALS->in_button_press_wavewindow_c_1) { gdk_pointer_ungrab(GDK_CURRENT_TIME); } /* let all GTK/X events spin through in order to keep menus from freezing open during reload */ #ifndef MAC_INTEGRATION if(GLOBALS->text_status_c_2) { wave_gtk_grab_add(GLOBALS->text_status_c_2); /* grab focus to a known widget with no real side effects */ gtkwave_main_iteration(); /* spin on GTK event loop */ wave_gtk_grab_remove(GLOBALS->text_status_c_2); /* ungrab focus */ } #endif printf("GTKWAVE | Reloading waveform...\n"); gtkwavetcl_setvar(WAVE_TCLCB_RELOAD_BEGIN, GLOBALS->loaded_file_name, WAVE_TCLCB_RELOAD_BEGIN_FLAGS); /* Save state to file */ save_tmpfilename = tmpnam_2(NULL, &fd_dummy); statefile = save_tmpfilename ? fopen(save_tmpfilename,"wb") : NULL; if(statefile == NULL) { fprintf(stderr, "Failed to create temp file required for file reload.\n"); if(save_tmpfilename) { perror("Why"); free_2(save_tmpfilename); } gtkwavetcl_setvar_nonblocking(WAVE_TCLCB_ERROR,"reload failed",WAVE_TCLCB_ERROR_FLAGS); return; } if(fd_dummy >=0) close(fd_dummy); write_save_helper(save_tmpfilename, statefile); fclose(statefile); reload_tmpfilename = strdup(save_tmpfilename); free_2(save_tmpfilename); /* save off size of tree frame if active */ #if WAVE_USE_GTK2 if(GLOBALS->gtk2_tree_frame) { /* upper tree */ GtkCList *cl = GTK_CLIST(GLOBALS->ctree_main); GtkAdjustment *vadj = gtk_clist_get_vadjustment(cl); GtkAdjustment *hadj = gtk_clist_get_hadjustment(cl); if(vadj) tree_vadj_value = vadj->value; if(hadj) tree_hadj_value = hadj->value; /* tree_frame_x = (GLOBALS->gtk2_tree_frame)->allocation.width; */ /* scan-build */ tree_frame_y = (GLOBALS->gtk2_tree_frame)->allocation.height; /* lower signal set */ vadj = gtk_tree_view_get_vadjustment((GtkTreeView *)GLOBALS->dnd_sigview); hadj = gtk_tree_view_get_hadjustment((GtkTreeView *)GLOBALS->dnd_sigview); if(vadj) treeview_vadj_value = vadj->value; if(hadj) treeview_hadj_value = hadj->value; } #endif /* Kill any open processes */ remove_all_proc_filters(); remove_all_ttrans_filters(); /* Instantiate new global status */ new_globals = initialize_globals(); free(new_globals->gtk_context_bridge_ptr); /* don't need this one as we're copying over the old one... */ new_globals->gtk_context_bridge_ptr = GLOBALS->gtk_context_bridge_ptr; /* SMP */ new_globals->num_cpus = GLOBALS->num_cpus; /* tcl interpreter */ #if defined(HAVE_LIBTCL) new_globals->interp = GLOBALS->interp; #endif /* lxt.c */ if(GLOBALS->fd_lxt_c_1 >= 0) { close(GLOBALS->fd_lxt_c_1); GLOBALS->fd_lxt_c_1 = -1; } /* Marker positions */ memcpy(new_globals->named_markers, GLOBALS->named_markers, sizeof(GLOBALS->named_markers)); new_globals->named_marker_lock_idx = GLOBALS->named_marker_lock_idx; /* notebook page flipping */ new_globals->num_notebook_pages = GLOBALS->num_notebook_pages; new_globals->num_notebook_pages_cumulative = GLOBALS->num_notebook_pages_cumulative; new_globals->this_context_page = GLOBALS->this_context_page; new_globals->contexts = GLOBALS->contexts; /* this value is a *** chameleon! malloc'd region is outside debug.c control! */ new_globals->notebook = GLOBALS->notebook; new_globals->second_page_created = GLOBALS->second_page_created; (*new_globals->contexts)[new_globals->this_context_page] = new_globals; new_globals->dead_context = GLOBALS->dead_context; /* this value is a ** chameleon! malloc'd region is outside debug.c control! */ /* to cut down on temporary visual noise from incorrect zoom factor on reload */ new_globals->pixelsperframe = GLOBALS->pixelsperframe; new_globals->nsperframe = GLOBALS->nsperframe; new_globals->pxns = GLOBALS->pxns; new_globals->nspx = GLOBALS->nspx; new_globals->nspx = GLOBALS->nspx; new_globals->zoom = GLOBALS->zoom; /* Default colors, X contexts, pixmaps, drawables, etc from signalwindow.c and wavewindow.c */ new_globals->possibly_use_rc_defaults = GLOBALS->possibly_use_rc_defaults; new_globals->signalarea_event_box = GLOBALS->signalarea_event_box; new_globals->keypress_handler_id = GLOBALS->keypress_handler_id; new_globals->signalarea = GLOBALS->signalarea; new_globals->wavearea = GLOBALS->wavearea; new_globals->wavepixmap_wavewindow_c_1 = GLOBALS->wavepixmap_wavewindow_c_1; new_globals->signalpixmap = GLOBALS->signalpixmap; new_globals->wave_splash_pixmap = GLOBALS->wave_splash_pixmap; new_globals->wave_splash_mask = GLOBALS->wave_splash_mask; new_globals->black_and_white = GLOBALS->black_and_white; new_globals->gc_white = GLOBALS->gc_white; new_globals->gc_black = GLOBALS->gc_black; memcpy(&new_globals->gc, &GLOBALS->gc, sizeof(struct wave_gcmaster_t)); new_globals->made_sgc_contexts_wavewindow_c_1 = GLOBALS->made_sgc_contexts_wavewindow_c_1; new_globals->made_gc_contexts_wavewindow_c_1 = GLOBALS->made_gc_contexts_wavewindow_c_1; memcpy(&new_globals->gccache, &GLOBALS->gccache, sizeof(struct wave_gcmaster_t)); memcpy(&new_globals->gc_rainbow, &GLOBALS->gc_rainbow, 2 * WAVE_NUM_RAINBOW * sizeof(GdkGC *)); new_globals->mainwindow = GLOBALS->mainwindow; new_globals->signalwindow = GLOBALS->signalwindow; new_globals->wavewindow = GLOBALS->wavewindow; new_globals->toppanedwindow = GLOBALS->toppanedwindow; new_globals->panedwindow = GLOBALS->panedwindow; new_globals->sstpane = GLOBALS->sstpane; new_globals->sst_vpaned = GLOBALS->sst_vpaned; new_globals->expanderwindow = GLOBALS->expanderwindow; new_globals->signal_hslider = GLOBALS->signal_hslider; new_globals->wave_vslider = GLOBALS->wave_vslider; new_globals->wave_hslider = GLOBALS->wave_hslider; new_globals->hscroll_wavewindow_c_2 = GLOBALS->hscroll_wavewindow_c_2; new_globals->max_or_marker_label_currenttime_c_1 = GLOBALS->max_or_marker_label_currenttime_c_1; new_globals->maxtext_currenttime_c_1 = (char *) calloc_2_into_context(new_globals,1,40); memcpy(new_globals->maxtext_currenttime_c_1, GLOBALS->maxtext_currenttime_c_1,40); new_globals->maxtimewid_currenttime_c_1 = GLOBALS->maxtimewid_currenttime_c_1; new_globals->curtext_currenttime_c_1 = (char *) calloc_2_into_context(new_globals,1,40); memcpy(new_globals->curtext_currenttime_c_1, GLOBALS->curtext_currenttime_c_1, 40); new_globals->base_or_curtime_label_currenttime_c_1 = GLOBALS->base_or_curtime_label_currenttime_c_1; new_globals->curtimewid_currenttime_c_1 = GLOBALS->curtimewid_currenttime_c_1; new_globals->from_entry = GLOBALS->from_entry; new_globals->to_entry = GLOBALS->to_entry; new_globals->fontheight = GLOBALS->fontheight; new_globals->wavecrosspiece = GLOBALS->wavecrosspiece; new_globals->signalfont = calloc_2_into_context(new_globals, 1, sizeof(struct font_engine_font_t)); memcpy(new_globals->signalfont, GLOBALS->signalfont, sizeof(struct font_engine_font_t)); new_globals->wavefont = calloc_2_into_context(new_globals, 1, sizeof(struct font_engine_font_t)); memcpy(new_globals->wavefont, GLOBALS->wavefont, sizeof(struct font_engine_font_t)); new_globals->wavefont_smaller = calloc_2_into_context(new_globals, 1, sizeof(struct font_engine_font_t)); memcpy(new_globals->wavefont_smaller, GLOBALS->wavefont_smaller, sizeof(struct font_engine_font_t)); #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) && GTK_CHECK_VERSION(2,8,0) new_globals->fonts_renderer = GLOBALS->fonts_renderer; new_globals->fonts_gc = GLOBALS->fonts_gc; new_globals->fonts_screen = GLOBALS->fonts_screen; new_globals->fonts_context = GLOBALS->fonts_context; new_globals->fonts_layout = GLOBALS->fonts_layout; #endif new_globals->use_pango_fonts = GLOBALS->use_pango_fonts; new_globals->ruler_origin = GLOBALS->ruler_origin; new_globals->ruler_step = GLOBALS->ruler_step; /* busy.c */ new_globals->busycursor_busy_c_1 = GLOBALS->busycursor_busy_c_1; new_globals->busy_busy_c_1 = GLOBALS->busy_busy_c_1; /* pixmaps.c */ new_globals->redo_pixmap = GLOBALS->redo_pixmap; new_globals->larrow_pixmap = GLOBALS->larrow_pixmap; new_globals->rarrow_pixmap = GLOBALS->rarrow_pixmap; new_globals->zoomout_pixmap = GLOBALS->zoomout_pixmap; new_globals->zoomin_pixmap = GLOBALS->zoomin_pixmap; new_globals->zoomfit_pixmap = GLOBALS->zoomfit_pixmap; new_globals->zoomundo_pixmap = GLOBALS->zoomundo_pixmap; new_globals->zoom_larrow_pixmap = GLOBALS->zoom_larrow_pixmap; new_globals->zoom_rarrow_pixmap = GLOBALS->zoom_rarrow_pixmap; new_globals->prev_page_pixmap = GLOBALS->prev_page_pixmap; new_globals->next_page_pixmap = GLOBALS->next_page_pixmap; new_globals->wave_info_pixmap = GLOBALS->wave_info_pixmap; new_globals->wave_alert_pixmap = GLOBALS->wave_alert_pixmap; clone_icon_pointers_across_contexts(new_globals, GLOBALS); /* rc.c */ new_globals->scale_to_time_dimension = GLOBALS->scale_to_time_dimension; new_globals->zoom_dyn = GLOBALS->zoom_dyn; new_globals->zoom_dyne = GLOBALS->zoom_dyne; new_globals->use_scrollwheel_as_y = GLOBALS->use_scrollwheel_as_y; new_globals->enable_slider_zoom = GLOBALS->enable_slider_zoom; new_globals->context_tabposition = GLOBALS->context_tabposition; new_globals->use_standard_clicking = GLOBALS->use_standard_clicking; new_globals->dragzoom_threshold = GLOBALS->dragzoom_threshold; new_globals->ignore_savefile_pane_pos = 1; /* to keep window from resizing/jumping */ new_globals->ignore_savefile_pos = 1; /* to keep window from resizing/jumping */ new_globals->ignore_savefile_size = 1; /* to keep window from resizing/jumping */ new_globals->color_back = GLOBALS->color_back; new_globals->color_baseline = GLOBALS->color_baseline; new_globals->color_grid = GLOBALS->color_grid; new_globals->color_grid2 = GLOBALS->color_grid2; new_globals->color_high = GLOBALS->color_high; new_globals->color_highfill = GLOBALS->color_highfill; new_globals->color_low = GLOBALS->color_low; new_globals->color_1 = GLOBALS->color_1; new_globals->color_1fill = GLOBALS->color_1fill; new_globals->color_0 = GLOBALS->color_0; new_globals->color_mark = GLOBALS->color_mark; new_globals->color_mid = GLOBALS->color_mid; new_globals->color_time = GLOBALS->color_time; new_globals->color_timeb = GLOBALS->color_timeb; new_globals->color_trans = GLOBALS->color_trans; new_globals->color_umark = GLOBALS->color_umark; new_globals->color_value = GLOBALS->color_value; new_globals->color_vbox = GLOBALS->color_vbox; new_globals->color_vtrans = GLOBALS->color_vtrans; new_globals->color_x = GLOBALS->color_x; new_globals->color_xfill = GLOBALS->color_xfill; new_globals->color_u = GLOBALS->color_u; new_globals->color_ufill = GLOBALS->color_ufill; new_globals->color_w = GLOBALS->color_w; new_globals->color_wfill = GLOBALS->color_wfill; new_globals->color_dash = GLOBALS->color_dash; new_globals->color_dashfill = GLOBALS->color_dashfill; new_globals->color_white = GLOBALS->color_white; new_globals->color_black = GLOBALS->color_black; new_globals->color_ltgray = GLOBALS->color_ltgray; new_globals->color_normal = GLOBALS->color_normal; new_globals->color_mdgray = GLOBALS->color_mdgray; new_globals->color_dkgray = GLOBALS->color_dkgray; new_globals->color_dkblue = GLOBALS->color_dkblue; new_globals->color_brkred = GLOBALS->color_brkred; new_globals->color_ltblue = GLOBALS->color_ltblue; new_globals->color_gmstrd = GLOBALS->color_gmstrd; new_globals->atomic_vectors = GLOBALS->atomic_vectors; new_globals->autoname_bundles = GLOBALS->autoname_bundles; new_globals->autocoalesce = GLOBALS->autocoalesce; new_globals->autocoalesce_reversal = GLOBALS->autocoalesce_reversal; new_globals->constant_marker_update = GLOBALS->constant_marker_update; new_globals->convert_to_reals = GLOBALS->convert_to_reals; new_globals->disable_mouseover = GLOBALS->disable_mouseover; new_globals->clipboard_mouseover = GLOBALS->clipboard_mouseover; new_globals->keep_xz_colors = GLOBALS->keep_xz_colors; new_globals->disable_tooltips = GLOBALS->disable_tooltips; new_globals->do_hier_compress = GLOBALS->do_hier_compress; new_globals->disable_auto_comphier = GLOBALS->disable_auto_comphier; new_globals->do_initial_zoom_fit = GLOBALS->do_initial_zoom_fit; new_globals->do_initial_zoom_fit_used = GLOBALS->do_initial_zoom_fit_used; new_globals->do_resize_signals = GLOBALS->do_resize_signals; new_globals->alt_wheel_mode = GLOBALS->alt_wheel_mode; new_globals->initial_signal_window_width = GLOBALS->initial_signal_window_width; new_globals->enable_fast_exit = GLOBALS->enable_fast_exit; new_globals->enable_ghost_marker = GLOBALS->enable_ghost_marker; new_globals->enable_horiz_grid = GLOBALS->enable_horiz_grid; new_globals->make_vcd_save_file = GLOBALS->make_vcd_save_file; new_globals->enable_vert_grid = GLOBALS->enable_vert_grid; new_globals->force_toolbars = GLOBALS->force_toolbars; new_globals->hide_sst = GLOBALS->hide_sst; new_globals->sst_expanded = GLOBALS->sst_expanded; new_globals->hier_grouping = GLOBALS->hier_grouping; new_globals->hier_max_level = GLOBALS->hier_max_level; new_globals->hier_max_level_shadow = GLOBALS->hier_max_level_shadow; new_globals->paned_pack_semantics = GLOBALS->paned_pack_semantics; new_globals->left_justify_sigs = GLOBALS->left_justify_sigs; new_globals->lxt_clock_compress_to_z = GLOBALS->lxt_clock_compress_to_z; new_globals->extload_max_tree = GLOBALS->extload_max_tree; new_globals->ps_maxveclen = GLOBALS->ps_maxveclen; new_globals->show_base = GLOBALS->show_base; new_globals->display_grid = GLOBALS->display_grid; new_globals->highlight_wavewindow = GLOBALS->highlight_wavewindow; new_globals->fill_waveform = GLOBALS->fill_waveform; new_globals->use_standard_trace_select = GLOBALS->use_standard_trace_select; new_globals->use_big_fonts = GLOBALS->use_big_fonts; new_globals->use_full_precision = GLOBALS->use_full_precision; new_globals->use_frequency_delta = GLOBALS->use_frequency_delta; new_globals->use_maxtime_display = GLOBALS->use_maxtime_display; new_globals->use_nonprop_fonts = GLOBALS->use_nonprop_fonts; new_globals->use_roundcaps = GLOBALS->use_roundcaps; new_globals->use_scrollbar_only = GLOBALS->use_scrollbar_only; new_globals->vcd_explicit_zero_subscripts = GLOBALS->vcd_explicit_zero_subscripts; new_globals->vcd_preserve_glitches = GLOBALS->vcd_preserve_glitches; new_globals->vcd_preserve_glitches_real = GLOBALS->vcd_preserve_glitches_real; new_globals->vcd_warning_filesize = GLOBALS->vcd_warning_filesize; new_globals->vector_padding = GLOBALS->vector_padding; new_globals->vlist_prepack = GLOBALS->vlist_prepack; new_globals->vlist_spill_to_disk = GLOBALS->vlist_spill_to_disk; new_globals->vlist_compression_depth = GLOBALS->vlist_compression_depth; new_globals->wave_scrolling = GLOBALS->wave_scrolling; new_globals->do_zoom_center = GLOBALS->do_zoom_center; new_globals->zoom_pow10_snap = GLOBALS->zoom_pow10_snap; new_globals->alt_hier_delimeter = GLOBALS->alt_hier_delimeter; new_globals->cursor_snap = GLOBALS->cursor_snap; new_globals->hier_delimeter = GLOBALS->hier_delimeter; new_globals->hier_was_explicitly_set = GLOBALS->hier_was_explicitly_set; new_globals->page_divisor = GLOBALS->page_divisor; new_globals->ps_maxveclen = GLOBALS->ps_maxveclen; new_globals->vector_padding = GLOBALS->vector_padding; new_globals->zoombase = GLOBALS->zoombase; new_globals->disable_ae2_alias = GLOBALS->disable_ae2_alias; new_globals->hier_ignore_escapes = GLOBALS->hier_ignore_escapes; new_globals->splash_disable = 1; /* to disable splash for reload */ new_globals->strace_repeat_count = GLOBALS->strace_repeat_count; /* for edgebuttons and also strace */ new_globals->logfiles = GLOBALS->logfiles; /* this value is a ** chameleon! malloc'd region is outside debug.c control! */ strcpy2_into_new_context(new_globals, &new_globals->argvlist, &GLOBALS->argvlist); strcpy2_into_new_context(new_globals, &new_globals->editor_name, &GLOBALS->editor_name); strcpy2_into_new_context(new_globals, &new_globals->fontname_logfile, &GLOBALS->fontname_logfile); strcpy2_into_new_context(new_globals, &new_globals->fontname_signals, &GLOBALS->fontname_signals); strcpy2_into_new_context(new_globals, &new_globals->fontname_waves, &GLOBALS->fontname_waves); strcpy2_into_new_context(new_globals, &new_globals->cutcopylist, &GLOBALS->cutcopylist); strcpy2_into_new_context(new_globals, &new_globals->tcl_init_cmd, &GLOBALS->tcl_init_cmd); strcpy2_into_new_context(new_globals, &new_globals->repscript_name, &GLOBALS->repscript_name); new_globals->repscript_period = GLOBALS->repscript_period; #if GTK_CHECK_VERSION(2,4,0) strcpy2_into_new_context(new_globals, &new_globals->pFileChooseFilterName, &GLOBALS->pFileChooseFilterName); #endif /* search.c */ new_globals->regex_which_search_c_1 = GLOBALS->regex_which_search_c_1; /* preserve search type */ /* ttranslate.c */ strcpy2_into_new_context(new_globals, &new_globals->ttranslate_args, &GLOBALS->ttranslate_args); /* vlist.c */ if(GLOBALS->vlist_handle) { vlist_kill_spillfile(); new_globals->use_fastload = (GLOBALS->use_fastload != VCD_FSL_NONE) ? VCD_FSL_WRITE : VCD_FSL_NONE; } /* lxt2.c / vzt.c / ae2.c */ strcpy2_into_new_context(new_globals, &new_globals->skip_start, &GLOBALS->skip_start); strcpy2_into_new_context(new_globals, &new_globals->skip_end, &GLOBALS->skip_end); /* main.c */ new_globals->missing_file_toolbar = GLOBALS->missing_file_toolbar; new_globals->is_gtkw_save_file = GLOBALS->is_gtkw_save_file; new_globals->use_toolbutton_interface = GLOBALS->use_toolbutton_interface; new_globals->optimize_vcd = GLOBALS->optimize_vcd; strcpy2_into_new_context(new_globals, &new_globals->winname, &GLOBALS->winname); /* for page swapping */ /* menu.c */ new_globals->wave_script_args = GLOBALS->wave_script_args; #ifndef WAVE_USE_MLIST_T new_globals->item_factory_menu_c_1 = GLOBALS->item_factory_menu_c_1; #endif strcpy2_into_new_context(new_globals, &new_globals->filesel_writesave, &GLOBALS->filesel_writesave); new_globals->save_success_menu_c_1 = GLOBALS->save_success_menu_c_1; new_globals->signal_popup_menu = GLOBALS->signal_popup_menu; new_globals->sst_signal_popup_menu = GLOBALS->sst_signal_popup_menu; strcpy2_into_new_context(new_globals, &new_globals->filesel_vcd_writesave, &GLOBALS->filesel_vcd_writesave); strcpy2_into_new_context(new_globals, &new_globals->filesel_lxt_writesave, &GLOBALS->filesel_lxt_writesave); strcpy2_into_new_context(new_globals, &new_globals->filesel_tim_writesave, &GLOBALS->filesel_tim_writesave); strcpy2_into_new_context(new_globals, &new_globals->stems_name, &GLOBALS->stems_name); /* remaining fileselbox() vars not handled elsewhere */ strcpy2_into_new_context(new_globals, &new_globals->filesel_logfile_menu_c_1, &GLOBALS->filesel_logfile_menu_c_1); strcpy2_into_new_context(new_globals, &new_globals->filesel_scriptfile_menu, &GLOBALS->filesel_scriptfile_menu); strcpy2_into_new_context(new_globals, &new_globals->fcurr_ttranslate_c_1, &GLOBALS->fcurr_ttranslate_c_1); strcpy2_into_new_context(new_globals, &new_globals->fcurr_ptranslate_c_1, &GLOBALS->fcurr_ptranslate_c_1); strcpy2_into_new_context(new_globals, &new_globals->fcurr_translate_c_2, &GLOBALS->fcurr_translate_c_2); strcpy2_into_new_context(new_globals, &new_globals->filesel_imagegrab, &GLOBALS->filesel_imagegrab); /* renderopt.c */ #ifdef WAVE_GTK_UNIX_PRINT new_globals->gprs = GLOBALS->gprs; new_globals->gps = GLOBALS->gps; #endif /* status.c */ new_globals->text_status_c_2 = GLOBALS->text_status_c_2; #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) memcpy(&new_globals->iter_status_c_3, &GLOBALS->iter_status_c_3, sizeof(GtkTextIter)); #endif /* treesearch_gtk2.c */ new_globals->do_dynamic_treefilter = GLOBALS->do_dynamic_treefilter; new_globals->treesearch_gtk2_window_vbox = GLOBALS->treesearch_gtk2_window_vbox; new_globals->window_treesearch_gtk2_c_12 = GLOBALS->window_treesearch_gtk2_c_12; new_globals->dnd_sigview = GLOBALS->dnd_sigview; strcpy2_into_new_context(new_globals, &new_globals->filter_str_treesearch_gtk2_c_1, &GLOBALS->filter_str_treesearch_gtk2_c_1); strcpy2_into_new_context(new_globals, &new_globals->selected_hierarchy_name, &GLOBALS->selected_hierarchy_name); new_globals->filter_typ_treesearch_gtk2_c_1 = GLOBALS->filter_typ_treesearch_gtk2_c_1; new_globals->filter_matlen_treesearch_gtk2_c_1 = GLOBALS->filter_matlen_treesearch_gtk2_c_1; new_globals->filter_noregex_treesearch_gtk2_c_1 = GLOBALS->filter_noregex_treesearch_gtk2_c_1; /* timeentry.c */ new_globals->from_entry = GLOBALS->from_entry; new_globals->to_entry = GLOBALS->to_entry; if(GLOBALS->tims.first != GLOBALS->min_time) { fix_from_time = 1; from_time = GLOBALS->tims.first; } if(GLOBALS->tims.last != GLOBALS->max_time) { fix_to_time = 1; to_time = GLOBALS->tims.last; } /* twinwave stuff */ new_globals->dual_attach_id_main_c_1 = GLOBALS->dual_attach_id_main_c_1; new_globals->dual_id = GLOBALS->dual_id; #ifdef WAVE_USE_GTK2 new_globals->socket_xid = GLOBALS->socket_xid; #endif new_globals->dual_ctx = GLOBALS->dual_ctx; /* Times struct */ memcpy(&(new_globals->tims), &(GLOBALS->tims), sizeof(Times)); /* File name and type */ new_globals->loaded_file_type = GLOBALS->loaded_file_type; strcpy2_into_new_context(new_globals, &new_globals->loaded_file_name, &GLOBALS->loaded_file_name); if(new_globals->optimize_vcd) { strcpy2_into_new_context(new_globals, &new_globals->unoptimized_vcd_file_name, &GLOBALS->unoptimized_vcd_file_name); } /* fst.c, though might be others later */ if(GLOBALS->subvar_jrb) { jrb_free_tree(GLOBALS->subvar_jrb); GLOBALS->subvar_jrb = NULL; GLOBALS->subvar_jrb_count = 0; } if(GLOBALS->synclock_jrb) { jrb_free_tree(GLOBALS->synclock_jrb); GLOBALS->synclock_jrb = NULL; } /* deallocate any loader-related stuff */ switch(GLOBALS->loaded_file_type) { case LXT_FILE: if(GLOBALS->mm_lxt_mmap_addr) { munmap(GLOBALS->mm_lxt_mmap_addr, GLOBALS->mm_lxt_mmap_len); } break; case LX2_FILE: lxt2_rd_close(GLOBALS->lx2_lx2_c_1); break; case VZT_FILE: vzt_rd_close(GLOBALS->vzt_vzt_c_1); break; case FST_FILE: fstReaderClose(GLOBALS->fst_fst_c_1); GLOBALS->fst_fst_c_1 = NULL; break; case AE2_FILE: #ifdef AET2_IS_PRESENT #ifdef AET2_ALIASDB_IS_PRESENT if(GLOBALS->adb) { adb_close_db(GLOBALS->adb); GLOBALS->adb = 0; } /* if(GLOBALS->m_alias_stream_file) { fclose(GLOBALS->m_alias_stream_file); GLOBALS->m_alias_stream_file = NULL; } */ ae2_read_end(GLOBALS->ae2); fclose(GLOBALS->ae2_f); #endif #endif break; #ifdef EXTLOAD_SUFFIX case EXTLOAD_FILE: if(GLOBALS->extload_ffr_ctx) { #ifdef WAVE_FSDB_READER_IS_PRESENT fsdbReaderClose(GLOBALS->extload_ffr_ctx); #endif GLOBALS->extload_ffr_ctx = NULL; } break; #endif case MISSING_FILE: case DUMPLESS_FILE: case GHW_FILE: case VCD_FILE: case VCD_RECODER_FILE: default: /* do nothing */ break; } /* window destruction (of windows that aren't the parent window) */ #if !defined _MSC_VER kill_stems_browser(); /* for now, need to rework the stems browser dumpfile access routines to support this properly */ new_globals->stems_type = GLOBALS->stems_type; strcpy2_into_new_context(new_globals, &new_globals->aet_name, &GLOBALS->aet_name); #endif /* remaining windows which are completely destroyed and haven't migrated over */ widget_only_destroy(&GLOBALS->window_ptranslate_c_5); /* ptranslate.c */ WAVE_STRACE_ITERATOR(s_ctx_iter) { GLOBALS->strace_ctx = &GLOBALS->strace_windows[GLOBALS->strace_current_window = s_ctx_iter]; widget_only_destroy(&GLOBALS->strace_ctx->window_strace_c_10); /* strace.c */ } widget_only_destroy(&GLOBALS->window_translate_c_11); /* translate.c */ widget_only_destroy(&GLOBALS->window_treesearch_gtk1_c); /* treesearch_gtk1.c */ widget_only_destroy(&GLOBALS->window_help_c_2); /* help.c : reload is gated off during help so this should never execute */ /* windows which in theory should never destroy as they will have grab focus which means reload will not be called */ widget_ungrab_destroy(&GLOBALS->window_entry_c_1); /* entry.c */ widget_ungrab_destroy(&GLOBALS->window1_hiersearch_c_1); /* hiersearch.c */ widget_ungrab_destroy(&GLOBALS->window_markerbox_c_4); /* markerbox.c */ widget_ungrab_destroy(&GLOBALS->window1_search_c_2); /* search.c */ widget_ungrab_destroy(&GLOBALS->window_showchange_c_8); /* showchange.c */ widget_ungrab_destroy(&GLOBALS->window_simplereq_c_9); /* simplereq.c */ widget_ungrab_destroy(&GLOBALS->window1_treesearch_gtk1_c); /* treesearch_gtk1.c */ widget_ungrab_destroy(&GLOBALS->window1_treesearch_gtk2_c_3); /* treesearch_gtk2.c */ /* supported migration of window contexts... */ if(GLOBALS->window_hiersearch_c_3) { struct treechain *tc = GLOBALS->treechain_hiersearch_c_1; while(tc) { char *tclname; if(!hier_curr) { hier_head = hier_curr = calloc_2_into_context(new_globals,1,sizeof(struct stringchain_t)); } else { hier_curr->next = calloc_2_into_context(new_globals,1,sizeof(struct stringchain_t)); hier_curr = hier_curr->next; } tclname = &tc->label->name[0]; strcpy2_into_new_context(new_globals, &hier_curr->name, &tclname); tc = tc->next; } new_globals->window_hiersearch_c_3 = GLOBALS->window_hiersearch_c_3; new_globals->entry_main_hiersearch_c_1 = GLOBALS->entry_main_hiersearch_c_1; new_globals->clist_hiersearch_c_1 = GLOBALS->clist_hiersearch_c_1; new_globals->bundle_direction_hiersearch_c_1 = GLOBALS->bundle_direction_hiersearch_c_1; new_globals->cleanup_hiersearch_c_3 = GLOBALS->cleanup_hiersearch_c_3; new_globals->is_active_hiersearch_c_1 = GLOBALS->is_active_hiersearch_c_1; } if(GLOBALS->mouseover_mouseover_c_1) /* mouseover regenerates as the pointer moves so no real context lost */ { gtk_widget_destroy(GLOBALS->mouseover_mouseover_c_1); GLOBALS->mouseover_mouseover_c_1 = NULL; gdk_pixmap_unref(GLOBALS->mo_pixmap_mouseover_c_1); GLOBALS->mo_pixmap_mouseover_c_1 = NULL; } if(GLOBALS->window_renderopt_c_6) { new_globals->is_active_renderopt_c_3 = GLOBALS->is_active_renderopt_c_3; new_globals->window_renderopt_c_6 = GLOBALS->window_renderopt_c_6; memcpy(new_globals->target_mutex_renderopt_c_1, GLOBALS->target_mutex_renderopt_c_1, sizeof(GLOBALS->target_mutex_renderopt_c_1)); memcpy(new_globals->page_mutex_renderopt_c_1, GLOBALS->page_mutex_renderopt_c_1, sizeof(GLOBALS->page_mutex_renderopt_c_1)); memcpy(new_globals->render_mutex_renderopt_c_1, GLOBALS->render_mutex_renderopt_c_1, sizeof(GLOBALS->render_mutex_renderopt_c_1)); strcpy2_into_new_context(new_globals, &new_globals->filesel_print_pdf_renderopt_c_1, &GLOBALS->filesel_print_pdf_renderopt_c_1); strcpy2_into_new_context(new_globals, &new_globals->filesel_print_ps_renderopt_c_1, &GLOBALS->filesel_print_ps_renderopt_c_1); strcpy2_into_new_context(new_globals, &new_globals->filesel_print_mif_renderopt_c_1, &GLOBALS->filesel_print_mif_renderopt_c_1); new_globals->page_size_type_renderopt_c_1 = GLOBALS->page_size_type_renderopt_c_1; } if(GLOBALS->window_search_c_7) { int i; new_globals->pdata = calloc_2_into_context(new_globals, 1, sizeof(SearchProgressData)); memcpy(new_globals->pdata, GLOBALS->pdata, sizeof(SearchProgressData)); new_globals->is_active_search_c_4 = GLOBALS->is_active_search_c_4; new_globals->regex_which_search_c_1 = GLOBALS->regex_which_search_c_1; new_globals->window_search_c_7 = GLOBALS->window_search_c_7; new_globals->entry_search_c_3 = GLOBALS->entry_search_c_3; new_globals->clist_search_c_3 = GLOBALS->clist_search_c_3; strcpy2_into_new_context(new_globals, &new_globals->searchbox_text_search_c_1, &GLOBALS->searchbox_text_search_c_1); for(i=0;i<5;i++) { new_globals->menuitem_search[i] = GLOBALS->menuitem_search[i]; new_globals->regex_mutex_search_c_1[i] = GLOBALS->regex_mutex_search_c_1[i]; } } /* erase any old tabbed contexts if they exist... */ dead_context_sweep(); /* let any destructors finalize on GLOBALS dereferences... (commented out for now) */ /* gtkwave_main_iteration(); */ /* Free the old context */ free_outstanding(); /* Free the old globals struct, memsetting it to zero in the hope of forcing crashes. */ memset(GLOBALS, 0, sizeof(struct Global)); free(GLOBALS); GLOBALS = NULL; /* valgrind fix */ /* Set the GLOBALS pointer to the newly allocated struct. */ set_GLOBALS(new_globals); *(GLOBALS->gtk_context_bridge_ptr) = GLOBALS; init_filetrans_data(); init_proctrans_data(); init_ttrans_data(); /* load_all_fonts(); */ /* attempt to reload file and recover on loader errors until successful */ for(;;) { set_window_busy(NULL); /* Check to see if we need to reload a vcd file */ #if !defined _MSC_VER && !defined __MINGW32__ if(GLOBALS->optimize_vcd) { optimize_vcd_file(); } #endif /* Load new file from disk, no reload on partial vcd or vcd from stdin. */ switch(GLOBALS->loaded_file_type) { #ifdef EXTLOAD_SUFFIX case EXTLOAD_FILE: extload_main(GLOBALS->loaded_file_name, GLOBALS->skip_start, GLOBALS->skip_end); load_was_success = (GLOBALS->extload != NULL) && (!GLOBALS->extload_already_errored); GLOBALS->extload_already_errored = 0; GLOBALS->extload_lastmod = 0; break; #endif case LX2_FILE: lx2_main(GLOBALS->loaded_file_name,GLOBALS->skip_start,GLOBALS->skip_end); load_was_success = (GLOBALS->lx2_lx2_c_1 != NULL); break; case VZT_FILE: vzt_main(GLOBALS->loaded_file_name,GLOBALS->skip_start,GLOBALS->skip_end); load_was_success = (GLOBALS->vzt_vzt_c_1 != NULL); break; case FST_FILE: fst_main(GLOBALS->loaded_file_name,GLOBALS->skip_start,GLOBALS->skip_end); load_was_success = (GLOBALS->fst_fst_c_1 != NULL); break; case AE2_FILE: #ifdef AET2_IS_PRESENT ae2_main(GLOBALS->loaded_file_name,GLOBALS->skip_start,GLOBALS->skip_end); load_was_success = (GLOBALS->ae2 != NULL); #else load_was_success = 0; /* never executes as AE2_FILE won't be set */ #endif break; case GHW_FILE: load_was_success = (ghw_main(GLOBALS->loaded_file_name) != 0); break; case LXT_FILE: case VCD_FILE: case VCD_RECODER_FILE: load_was_success = handle_setjmp(); break; default: break; } set_window_idle(NULL); if(load_was_success) { break; } else { /* recovery sequence */ printf("GTKWAVE | Reload failure, reattempt in %d second%s...\n", reload_fail_delay, (reload_fail_delay==1) ? "" : "s"); fflush(stdout); sleep(reload_fail_delay); switch(reload_fail_delay) { case 1: reload_fail_delay = 2; break; case 2: reload_fail_delay = 5; break; case 5: reload_fail_delay = 10; break; case 10: reload_fail_delay = 30; break; case 30: reload_fail_delay = 60; break; default: break; } } } /* deallocate the symbol hash table */ sym_hash_destroy(GLOBALS); /* Setup timings we probably need to redraw here */ GLOBALS->tims.last=GLOBALS->max_time; GLOBALS->tims.first=GLOBALS->min_time; if(fix_from_time) { if((from_time >= GLOBALS->min_time) && (from_time <= GLOBALS->max_time)) { GLOBALS->tims.first = from_time; } } if(fix_to_time) { if((to_time >= GLOBALS->min_time) && (to_time <= GLOBALS->max_time) && (to_time > GLOBALS->tims.first)) { GLOBALS->tims.last = to_time; } } if(GLOBALS->tims.start < GLOBALS->tims.first) { GLOBALS->tims.start = GLOBALS->tims.first; } if(GLOBALS->tims.end > GLOBALS->tims.last) { GLOBALS->tims.end = GLOBALS->tims.last; } if(GLOBALS->tims.marker < GLOBALS->tims.first) { GLOBALS->tims.marker = GLOBALS->tims.first; } if(GLOBALS->tims.marker > GLOBALS->tims.last) { GLOBALS->tims.marker = GLOBALS->tims.last; } if(GLOBALS->tims.prevmarker < GLOBALS->tims.first) { GLOBALS->tims.prevmarker = GLOBALS->tims.first; } if(GLOBALS->tims.prevmarker > GLOBALS->tims.last) { GLOBALS->tims.prevmarker = GLOBALS->tims.last; } if(GLOBALS->tims.laststart < GLOBALS->tims.first) { GLOBALS->tims.laststart = GLOBALS->tims.first; } if(GLOBALS->tims.laststart > GLOBALS->tims.last) { GLOBALS->tims.laststart = GLOBALS->tims.last; } reformat_time(timestr, GLOBALS->tims.first + GLOBALS->global_time_offset, GLOBALS->time_dimension); gtk_entry_set_text(GTK_ENTRY(GLOBALS->from_entry),timestr); reformat_time(timestr, GLOBALS->tims.last + GLOBALS->global_time_offset, GLOBALS->time_dimension); gtk_entry_set_text(GTK_ENTRY(GLOBALS->to_entry),timestr); /* Change SST - if it exists */ /* XXX need to destroy/free the old tree widgets. */ #if GTK_CHECK_VERSION(2,4,0) if(!GLOBALS->hide_sst) { gint pane_pos = gtk_paned_get_position(GLOBALS->sst_vpaned); gtk_widget_hide(GLOBALS->expanderwindow); gtk_container_remove(GTK_CONTAINER(GLOBALS->expanderwindow), GLOBALS->sstpane); GLOBALS->sstpane = treeboxframe("SST", GTK_SIGNAL_FUNC(mkmenu_treesearch_cleanup)); gtk_container_add(GTK_CONTAINER(GLOBALS->expanderwindow), GLOBALS->sstpane); gtk_paned_set_position(GLOBALS->sst_vpaned, pane_pos); gtk_widget_show(GLOBALS->expanderwindow); if(GLOBALS->dnd_sigview) { dnd_setup(GLOBALS->dnd_sigview, GLOBALS->signalarea, 0); } if(GLOBALS->clist_search_c_3) { dnd_setup(GLOBALS->clist_search_c_3, GLOBALS->signalarea, 0); } } #endif #if WAVE_USE_GTK2 if(GLOBALS->window_treesearch_gtk2_c_12) { gtk_container_remove(GTK_CONTAINER(GLOBALS->window_treesearch_gtk2_c_12), GLOBALS->treesearch_gtk2_window_vbox); treebox(NULL, GTK_SIGNAL_FUNC(mkmenu_treesearch_cleanup), GLOBALS->window_treesearch_gtk2_c_12); } if((GLOBALS->filter_str_treesearch_gtk2_c_1) && (GLOBALS->filter_entry)) { gtk_entry_set_text(GTK_ENTRY(GLOBALS->filter_entry), GLOBALS->filter_str_treesearch_gtk2_c_1); wave_regex_compile(GLOBALS->filter_str_treesearch_gtk2_c_1 + GLOBALS->filter_matlen_treesearch_gtk2_c_1, WAVE_REGEX_TREE); } #endif /* Reload state from file */ { char is_gtkw_save_file_cached = GLOBALS->is_gtkw_save_file; read_save_helper(reload_tmpfilename, NULL, NULL, NULL, NULL, NULL); GLOBALS->is_gtkw_save_file = is_gtkw_save_file_cached; } /* again doing this here (read_save_helper does it) seems to be necessary in order to keep display in sync */ GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); /* unlink temp */ unlink(reload_tmpfilename); free(reload_tmpfilename); /* intentional use of free(), of strdup'd string from earlier */ /* part 2 of SST (which needs to be done after the tree is expanded from loading the savefile...) */ #if WAVE_USE_GTK2 if((!GLOBALS->hide_sst)||(GLOBALS->window_treesearch_gtk2_c_12)) { GtkCList *cl = GTK_CLIST(GLOBALS->ctree_main); char *hiername_cache = NULL; /* some strange race condition side effect in gtk selecting/deselecting blows this out so cache it */ if(GLOBALS->selected_hierarchy_name) { hiername_cache = strdup_2(GLOBALS->selected_hierarchy_name); select_tree_node(GLOBALS->selected_hierarchy_name); } if(tree_vadj_value != 0.0) { GtkAdjustment *vadj = gtk_clist_get_vadjustment(cl); if((vadj) && (tree_vadj_value >= vadj->lower) && (tree_vadj_value <= vadj->upper)) { vadj->value = tree_vadj_value; gtk_clist_set_vadjustment(cl, vadj); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(vadj)), "changed"); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(vadj)), "value_changed"); } } if(tree_hadj_value != 0.0) { GtkAdjustment *hadj = gtk_clist_get_hadjustment(cl); if((hadj) && (tree_hadj_value >= hadj->lower) && (tree_hadj_value <= hadj->upper)) { hadj->value = tree_hadj_value; gtk_clist_set_hadjustment(cl, hadj); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(hadj)), "changed"); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(hadj)), "value_changed"); } } if(hiername_cache) { if(GLOBALS->selected_hierarchy_name) { free_2(GLOBALS->selected_hierarchy_name); } GLOBALS->selected_hierarchy_name = hiername_cache; } if(tree_frame_y != -1) { /* this doesn't work...this sets the *minimum* size */ /* gtk_widget_set_size_request(GLOBALS->gtk2_tree_frame, -1, tree_frame_y); */ } if(GLOBALS->filter_entry) { gtk_signal_emit_by_name (GTK_OBJECT (GLOBALS->filter_entry), "activate"); } } #endif /* part 2 of search (which needs to be done after the new dumpfile is loaded) */ if(GLOBALS->window_search_c_7) { search_enter_callback(GLOBALS->entry_search_c_3, NULL); } /* part 2 of hier search (which needs to be done after the new dumpfile is loaded) */ if(GLOBALS->window_hiersearch_c_3) { if(!hier_curr) { GLOBALS->current_tree_hiersearch_c_1=GLOBALS->treeroot; GLOBALS->h_selectedtree_hiersearch_c_1=NULL; } else { struct tree *t = GLOBALS->treeroot; hier_curr = hier_head; while((hier_curr)&&(t)) { if(!strcmp(hier_curr->name, t->name)) { if(t->child) { struct treechain *tc, *tc2; tc=GLOBALS->treechain_hiersearch_c_1; if(tc) { while(tc->next) tc=tc->next; tc2=calloc_2(1,sizeof(struct treechain)); tc2->label=t; tc2->tree=GLOBALS->current_tree_hiersearch_c_1; tc->next=tc2; } else { GLOBALS->treechain_hiersearch_c_1=calloc_2(1,sizeof(struct treechain)); GLOBALS->treechain_hiersearch_c_1->tree=GLOBALS->current_tree_hiersearch_c_1; GLOBALS->treechain_hiersearch_c_1->label=t; } GLOBALS->current_tree_hiersearch_c_1=t->child; } t = t->child; hier_curr = hier_curr->next; continue; } t = t->next; } hier_curr = hier_head; while(hier_head) { hier_head = hier_curr->next; free_2(hier_curr->name); free_2(hier_curr); hier_curr = hier_head; } } refresh_hier_tree(GLOBALS->current_tree_hiersearch_c_1); } /* restore these in case we decide to write out the rc file later as a user option */ GLOBALS->ignore_savefile_pane_pos = cached_ignore_savefile_pane_pos; GLOBALS->ignore_savefile_pos = cached_ignore_savefile_pos; GLOBALS->ignore_savefile_size = cached_ignore_savefile_size; GLOBALS->splash_disable = cached_splash_disable; printf("GTKWAVE | ...waveform reloaded\n"); gtkwavetcl_setvar(WAVE_TCLCB_RELOAD_END, GLOBALS->loaded_file_name, WAVE_TCLCB_RELOAD_END_FLAGS); /* update lower signal set in SST to correct position */ #if WAVE_USE_GTK2 if((GLOBALS->dnd_sigview) && ((treeview_vadj_value != 0.0) || (treeview_hadj_value != 0.0))) { struct Global *G2 = GLOBALS; gtk_events_pending_gtk_main_iteration(); if((G2 == GLOBALS)&&(GLOBALS->dnd_sigview)) { if(treeview_vadj_value != 0.0) { GtkAdjustment *vadj = gtk_tree_view_get_vadjustment((GtkTreeView *)GLOBALS->dnd_sigview); if((vadj) && (treeview_vadj_value >= vadj->lower) && (treeview_vadj_value <= vadj->upper)) { vadj->value = treeview_vadj_value; gtk_tree_view_set_vadjustment((GtkTreeView *)GLOBALS->dnd_sigview, vadj); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(vadj)), "changed"); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(vadj)), "value_changed"); } } if(treeview_hadj_value != 0.0) { GtkAdjustment *hadj = gtk_tree_view_get_hadjustment((GtkTreeView *)GLOBALS->dnd_sigview); if((hadj) && (treeview_hadj_value >= hadj->lower) && (treeview_hadj_value <= hadj->upper)) { hadj->value = treeview_hadj_value; gtk_tree_view_set_hadjustment((GtkTreeView *)GLOBALS->dnd_sigview, hadj); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(hadj)), "changed"); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(hadj)), "value_changed"); } } } } #endif } void reload_into_new_context(void) { static int reloading = 0; if(!reloading) { #ifdef MAC_INTEGRATION osx_menu_sensitivity(FALSE); #endif reload_into_new_context_2(); reloading = 0; #ifdef MAC_INTEGRATION if(GLOBALS->loaded_file_type != MISSING_FILE) { osx_menu_sensitivity(TRUE); } #endif } } /* * for notebook page closing */ void free_and_destroy_page_context(void) { int s_ctx_iter; /* deallocate any loader-related stuff */ switch(GLOBALS->loaded_file_type) { case LXT_FILE: if(GLOBALS->mm_lxt_mmap_addr) { munmap(GLOBALS->mm_lxt_mmap_addr, GLOBALS->mm_lxt_mmap_len); } break; case LX2_FILE: lxt2_rd_close(GLOBALS->lx2_lx2_c_1); break; case VZT_FILE: vzt_rd_close(GLOBALS->vzt_vzt_c_1); break; case FST_FILE: fstReaderClose(GLOBALS->fst_fst_c_1); GLOBALS->fst_fst_c_1 = NULL; break; case AE2_FILE: #ifdef AET2_IS_PRESENT #ifdef AET2_ALIASDB_IS_PRESENT if(GLOBALS->adb) { adb_close_db(GLOBALS->adb); GLOBALS->adb = 0; } /* if(GLOBALS->adb_alias_stream_file) { fclose(GLOBALS->adb_alias_stream_file); GLOBALS->adb_alias_stream_file = NULL; } */ ae2_read_end(GLOBALS->ae2); fclose(GLOBALS->ae2_f); #endif #endif break; #ifdef EXTLOAD_SUFFIX case EXTLOAD_FILE: if(GLOBALS->extload_ffr_ctx) { #ifdef WAVE_FSDB_READER_IS_PRESENT fsdbReaderClose(GLOBALS->extload_ffr_ctx); #endif GLOBALS->extload_ffr_ctx = NULL; } break; #endif case MISSING_FILE: case DUMPLESS_FILE: case GHW_FILE: case VCD_FILE: case VCD_RECODER_FILE: default: /* do nothing */ break; } /* window destruction (of windows that aren't the parent window) */ widget_only_destroy(&GLOBALS->window_ptranslate_c_5); /* ptranslate.c */ WAVE_STRACE_ITERATOR(s_ctx_iter) { GLOBALS->strace_ctx = &GLOBALS->strace_windows[GLOBALS->strace_current_window = s_ctx_iter]; widget_only_destroy(&GLOBALS->strace_ctx->window_strace_c_10); /* strace.c */ } widget_only_destroy(&GLOBALS->window_translate_c_11); /* translate.c */ widget_only_destroy(&GLOBALS->window_treesearch_gtk1_c); /* treesearch_gtk1.c */ widget_only_destroy(&GLOBALS->window_treesearch_gtk2_c_12); /* treesearch_gtk2.c */ widget_only_destroy(&GLOBALS->window_help_c_2); /* help.c : reload is gated off during help so this should never execute */ /* windows which in theory should never destroy as they will have grab focus which means reload will not be called */ widget_ungrab_destroy(&GLOBALS->window_entry_c_1); /* entry.c */ widget_ungrab_destroy(&GLOBALS->window1_hiersearch_c_1); /* hiersearch.c */ widget_ungrab_destroy(&GLOBALS->window_markerbox_c_4); /* markerbox.c */ widget_ungrab_destroy(&GLOBALS->window1_search_c_2); /* search.c */ widget_ungrab_destroy(&GLOBALS->window_showchange_c_8); /* showchange.c */ widget_ungrab_destroy(&GLOBALS->window_simplereq_c_9); /* simplereq.c */ widget_ungrab_destroy(&GLOBALS->window1_treesearch_gtk1_c); /* treesearch_gtk1.c */ widget_ungrab_destroy(&GLOBALS->window1_treesearch_gtk2_c_3); /* treesearch_gtk2.c */ /* supported migration of window contexts... */ widget_only_destroy(&GLOBALS->window_hiersearch_c_3); if(GLOBALS->mouseover_mouseover_c_1) /* mouseover regenerates as the pointer moves so no real context lost */ { gtk_widget_destroy(GLOBALS->mouseover_mouseover_c_1); GLOBALS->mouseover_mouseover_c_1 = NULL; gdk_pixmap_unref(GLOBALS->mo_pixmap_mouseover_c_1); GLOBALS->mo_pixmap_mouseover_c_1 = NULL; } widget_only_destroy(&GLOBALS->window_renderopt_c_6); widget_only_destroy(&GLOBALS->window_search_c_7); (*GLOBALS->dead_context)[0] = GLOBALS; /* let any destructors finalize on GLOBALS dereferences... */ gtkwave_main_iteration(); } /* * part 2 of free_and_destroy_page_context() as some context data seems to be used later by * gtk (i.e., the destroys might be deferred slightly causing corruption) */ void dead_context_sweep(void) { struct Global *gp = (*GLOBALS->dead_context)[0]; struct Global *g_curr; if(gp) { g_curr = GLOBALS; set_GLOBALS(gp); (*GLOBALS->dead_context)[0] = NULL; /* remove the bridge pointer */ if(GLOBALS->gtk_context_bridge_ptr) { free(GLOBALS->gtk_context_bridge_ptr); GLOBALS->gtk_context_bridge_ptr = NULL; } /* Free all gcs */ dealloc_all_gcs(); /* Free the context */ free_outstanding(); /* Free the old globals struct, memsetting it to zero in the hope of forcing crashes. */ memset(GLOBALS, 0, sizeof(struct Global)); free(GLOBALS); GLOBALS = NULL; /* valgrind fix */ set_GLOBALS(g_curr); } } /* * focus directed context switching of GLOBALS in multiple tabs mode */ static gint context_swapper(GtkWindow *w, GdkEvent *event, void *data) { GdkEventType type; if(ignore_context_swap()) /* block context swap if explicitly directed (e.g., during loading) */ { return(FALSE); } type = event->type; /* printf("Window: %08x GtkEvent: %08x gpointer: %08x, type: %d\n", w, event, data, type); */ switch(type) { case GDK_ENTER_NOTIFY: case GDK_FOCUS_CHANGE: if(GLOBALS->num_notebook_pages >= 2) { unsigned int i; void **vp; GtkWindow *wcmp; for(i=0;inum_notebook_pages;i++) { struct Global *test_g = (*GLOBALS->contexts)[i]; vp = (void **)(((char *)test_g) + (long)data); wcmp = (GtkWindow *)(*vp); if(wcmp != NULL) { if(wcmp == w) { if(i!=GLOBALS->this_context_page) { struct Global *g_old = GLOBALS; /* printf("Switching to: %d %08x\n", i, GTK_WINDOW(wcmp)); */ set_GLOBALS((*GLOBALS->contexts)[i]); GLOBALS->lxt_clock_compress_to_z = g_old->lxt_clock_compress_to_z; GLOBALS->autoname_bundles = g_old->autoname_bundles; GLOBALS->autocoalesce_reversal = g_old->autocoalesce_reversal; GLOBALS->autocoalesce = g_old->autocoalesce; GLOBALS->hier_grouping = g_old->hier_grouping; GLOBALS->wave_scrolling = g_old->wave_scrolling; GLOBALS->constant_marker_update = g_old->constant_marker_update; GLOBALS->do_zoom_center = g_old->do_zoom_center; GLOBALS->use_roundcaps = g_old->use_roundcaps; GLOBALS->do_resize_signals = g_old->do_resize_signals; GLOBALS->alt_wheel_mode = g_old->alt_wheel_mode; GLOBALS->initial_signal_window_width = g_old->initial_signal_window_width; GLOBALS->use_full_precision = g_old->use_full_precision; GLOBALS->show_base = g_old->show_base; GLOBALS->display_grid = g_old->display_grid; GLOBALS->highlight_wavewindow = g_old->highlight_wavewindow; GLOBALS->fill_waveform = g_old->fill_waveform; GLOBALS->use_standard_trace_select = g_old->use_standard_trace_select; GLOBALS->disable_mouseover = g_old->disable_mouseover; GLOBALS->clipboard_mouseover = g_old->clipboard_mouseover; GLOBALS->keep_xz_colors = g_old->keep_xz_colors; GLOBALS->zoom_pow10_snap = g_old->zoom_pow10_snap; GLOBALS->scale_to_time_dimension = g_old->scale_to_time_dimension; GLOBALS->zoom_dyn = g_old->zoom_dyn; GLOBALS->zoom_dyne = g_old->zoom_dyne; GLOBALS->ignore_savefile_pane_pos = g_old->ignore_savefile_pane_pos; GLOBALS->ignore_savefile_pos = g_old->ignore_savefile_pos; GLOBALS->ignore_savefile_size = g_old->ignore_savefile_size; GLOBALS->hier_ignore_escapes = g_old->hier_ignore_escapes; gtk_notebook_set_current_page(GTK_NOTEBOOK(GLOBALS->notebook), GLOBALS->this_context_page); } return(FALSE); } } } } break; default: break; } return(FALSE); } void install_focus_cb(GtkWidget *w, unsigned long ptr_offset) { gtk_signal_connect (GTK_OBJECT(w), "enter_notify_event", GTK_SIGNAL_FUNC(context_swapper), (void *)ptr_offset); gtk_signal_connect (GTK_OBJECT(w), "focus_in_event", GTK_SIGNAL_FUNC(context_swapper), (void *)ptr_offset); } /* * wrapped gtk_signal_connect/gtk_signal_connect_object functions for context watchdog monitoring... * note that this false triggers on configure_event as gtk sends events to multiple tabs and not * just the visible one! */ static gint ctx_swap_watchdog(struct Global **w) { struct Global *watch = *w; if(GLOBALS->gtk_context_bridge_ptr != w) { #ifdef GTKWAVE_SIGNAL_CONNECT_DEBUG fprintf(stderr, "GTKWAVE | WARNING: globals change caught by ctx_swap_watchdog()! %p vs %p, session %d vs %d\n", (void *)GLOBALS->gtk_context_bridge_ptr,(void *)w, (*GLOBALS->gtk_context_bridge_ptr)->this_context_page, watch->this_context_page); #endif set_GLOBALS(watch); } return(0); } static gint ctx_prints(char *s) { printf(">>> %s\n", s); return(0); } static gint ctx_printd(int d) { printf(">>>\t%d\n", d); return(0); } gulong gtkwave_signal_connect_x(GtkObject *object, const gchar *name, GtkSignalFunc func, gpointer data, char *f, unsigned long line) { gulong rc; if(f) { gtk_signal_connect_object(object, name, (GtkSignalFunc)ctx_prints, (GtkObject *)f); gtk_signal_connect_object(object, name, (GtkSignalFunc)ctx_printd, (GtkObject *)line); } gtk_signal_connect_object(object, name, (GtkSignalFunc)ctx_swap_watchdog, (GtkObject *)GLOBALS->gtk_context_bridge_ptr); rc = gtk_signal_connect(object, name, func, data); return(rc); } gulong gtkwave_signal_connect_object_x(GtkObject *object, const gchar *name, GtkSignalFunc func, gpointer data, char *f, unsigned long line) { gulong rc; if(f) { gtk_signal_connect_object(object, name, (GtkSignalFunc)ctx_prints, (GtkObject *)f); gtk_signal_connect_object(object, name, (GtkSignalFunc)ctx_printd, (GtkObject *)line); } gtk_signal_connect_object(object, name, (GtkSignalFunc)ctx_swap_watchdog, (GtkObject *)GLOBALS->gtk_context_bridge_ptr); rc = gtk_signal_connect_object(object, name, func, data); return(rc); } void set_GLOBALS_x(struct Global *g, const char *file, int line) { char sstr[32]; if(line) { printf("Globals old %p -> new %p (%s: %d)\n", (void *)GLOBALS, (void *)g, file, line); } if(GLOBALS != g) { /* fix problem where ungrab doesn't occur if button pressed + simultaneous context swap occurs */ if(GLOBALS && GLOBALS->in_button_press_wavewindow_c_1) { gdk_pointer_ungrab(GDK_CURRENT_TIME); } GLOBALS = g; sprintf(sstr, "%d", GLOBALS->this_context_page); gtkwavetcl_setvar(WAVE_TCLCB_CURRENT_ACTIVE_TAB, sstr, WAVE_TCLCB_CURRENT_ACTIVE_TAB_FLAGS); } } /* * for ensuring continuity of pixmap/mask pointers */ void clone_icon_pointers_across_contexts(struct Global *a, struct Global *b) { if(!a || !b) return; a->hiericon_module_pixmap = b->hiericon_module_pixmap; a->hiericon_module_mask = b->hiericon_module_mask; a->hiericon_task_pixmap = b->hiericon_task_pixmap; a->hiericon_task_mask = b->hiericon_task_mask; a->hiericon_function_pixmap = b->hiericon_function_pixmap; a->hiericon_function_mask = b->hiericon_function_mask; a->hiericon_begin_pixmap = b->hiericon_begin_pixmap; a->hiericon_begin_mask = b->hiericon_begin_mask; a->hiericon_fork_pixmap = b->hiericon_fork_pixmap; a->hiericon_fork_mask = b->hiericon_fork_mask; a->hiericon_interface_pixmap = b->hiericon_interface_pixmap; a->hiericon_interface_mask = b->hiericon_interface_mask; a->hiericon_svpackage_pixmap = b->hiericon_svpackage_pixmap; a->hiericon_svpackage_mask = b->hiericon_svpackage_mask; a->hiericon_program_pixmap = b->hiericon_program_pixmap; a->hiericon_program_mask = b->hiericon_program_mask; a->hiericon_class_pixmap = b->hiericon_class_pixmap; a->hiericon_class_mask = b->hiericon_class_mask; a->hiericon_record_pixmap = b->hiericon_record_pixmap; a->hiericon_record_mask = b->hiericon_record_mask; a->hiericon_generate_pixmap = b->hiericon_generate_pixmap; a->hiericon_generate_mask = b->hiericon_generate_mask; a->hiericon_design_pixmap = b->hiericon_design_pixmap; a->hiericon_design_mask = b->hiericon_design_mask; a->hiericon_block_pixmap = b->hiericon_block_pixmap; a->hiericon_block_mask = b->hiericon_block_mask; a->hiericon_generateif_pixmap = b->hiericon_generateif_pixmap; a->hiericon_generateif_mask = b->hiericon_generateif_mask; a->hiericon_generatefor_pixmap = b->hiericon_generatefor_pixmap; a->hiericon_generatefor_mask = b->hiericon_generatefor_mask; a->hiericon_instance_pixmap = b->hiericon_instance_pixmap; a->hiericon_instance_mask = b->hiericon_instance_mask; a->hiericon_package_pixmap = b->hiericon_package_pixmap; a->hiericon_package_mask = b->hiericon_package_mask; a->hiericon_signal_pixmap = b->hiericon_signal_pixmap; a->hiericon_signal_mask = b->hiericon_signal_mask; a->hiericon_portin_pixmap = b->hiericon_portin_pixmap; a->hiericon_portin_mask = b->hiericon_portin_mask; a->hiericon_portout_pixmap = b->hiericon_portout_pixmap; a->hiericon_portout_mask = b->hiericon_portout_mask; a->hiericon_portinout_pixmap = b->hiericon_portinout_pixmap; a->hiericon_portinout_mask = b->hiericon_portinout_mask; a->hiericon_buffer_pixmap = b->hiericon_buffer_pixmap; a->hiericon_buffer_mask = b->hiericon_buffer_mask; a->hiericon_linkage_pixmap = b->hiericon_linkage_pixmap; a->hiericon_linkage_mask = b->hiericon_linkage_mask; } gtkwave-3.3.86/src/main.c0000664000175000017500000026464113166335473014500 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2017. * * 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. */ /* AIX may need this for alloca to work */ #if defined _AIX #pragma alloca #endif #include "globals.h" #include #include #include #include #ifdef __MINGW32__ #include #endif #include "fsdb_wrapper_api.h" /* #define WAVE_CRASH_ON_GTK_WARNING */ #include "wave_locale.h" #if !defined _MSC_VER && !defined __MINGW32__ #include #include #include #include #include #endif #if !defined _MSC_VER && defined WAVE_USE_GTK2 #define WAVE_USE_XID #else #undef WAVE_USE_XID #endif #ifdef HAVE_GETOPT_LONG #include #else #include "gnu-getopt.h" #ifndef _MSC_VER #include #else #define strcasecmp _stricmp #endif #endif #include "symbol.h" #include "lx2.h" #include "ae2.h" #include "vzt.h" #include "ghw.h" #include "fst.h" #include "main.h" #include "menu.h" #include "vcd.h" #include "lxt.h" #include "lxt2_read.h" #include "vzt_read.h" #include "pixmaps.h" #include "currenttime.h" #include "fgetdynamic.h" #include "rc.h" #include "translate.h" #include "ptranslate.h" #include "ttranslate.h" #include "tcl_helper.h" #if defined(HAVE_LIBTCL) #include #include #endif #ifdef MAC_INTEGRATION #include #endif char *gtkwave_argv0_cached = NULL; static void switch_page(GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer user_data) { (void)notebook; (void)page; (void)user_data; char timestr[32]; struct Global *g_old = GLOBALS; set_GLOBALS((*GLOBALS->contexts)[page_num]); GLOBALS->lxt_clock_compress_to_z = g_old->lxt_clock_compress_to_z; GLOBALS->autoname_bundles = g_old->autoname_bundles; GLOBALS->autocoalesce_reversal = g_old->autocoalesce_reversal; GLOBALS->autocoalesce = g_old->autocoalesce; GLOBALS->hier_grouping = g_old->hier_grouping; GLOBALS->wave_scrolling = g_old->wave_scrolling; GLOBALS->constant_marker_update = g_old->constant_marker_update; GLOBALS->do_zoom_center = g_old->do_zoom_center; GLOBALS->use_roundcaps = g_old->use_roundcaps; GLOBALS->do_resize_signals = g_old->do_resize_signals; GLOBALS->alt_wheel_mode = g_old->alt_wheel_mode; GLOBALS->initial_signal_window_width = g_old->initial_signal_window_width; GLOBALS->scale_to_time_dimension = g_old->scale_to_time_dimension; GLOBALS->use_full_precision = g_old->use_full_precision; GLOBALS->show_base = g_old->show_base; GLOBALS->display_grid = g_old->display_grid; GLOBALS->highlight_wavewindow = g_old->highlight_wavewindow; GLOBALS->fill_waveform = g_old->fill_waveform; GLOBALS->use_standard_trace_select = g_old->use_standard_trace_select; GLOBALS->disable_mouseover = g_old->disable_mouseover; GLOBALS->clipboard_mouseover = g_old->clipboard_mouseover; GLOBALS->keep_xz_colors = g_old->keep_xz_colors; GLOBALS->zoom_pow10_snap = g_old->zoom_pow10_snap; GLOBALS->zoom_dyn = g_old->zoom_dyn; GLOBALS->zoom_dyne = g_old->zoom_dyne; GLOBALS->hier_ignore_escapes = g_old->hier_ignore_escapes; reformat_time(timestr, GLOBALS->tims.first + GLOBALS->global_time_offset, GLOBALS->time_dimension); gtk_entry_set_text(GTK_ENTRY(GLOBALS->from_entry),timestr); reformat_time(timestr, GLOBALS->tims.last + GLOBALS->global_time_offset, GLOBALS->time_dimension); gtk_entry_set_text(GTK_ENTRY(GLOBALS->to_entry),timestr); update_maxmarker_labels(); update_basetime(GLOBALS->tims.baseline); GLOBALS->keypress_handler_id = g_old->keypress_handler_id; if(GLOBALS->second_page_created) { wave_gtk_window_set_title(GTK_WINDOW(GLOBALS->mainwindow), GLOBALS->winname, GLOBALS->dumpfile_is_modified ? WAVE_SET_TITLE_MODIFIED: WAVE_SET_TITLE_NONE, 0); MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } void kill_stems_browser_single(void *V) { struct Global *G = (struct Global *)V; #if !defined _MSC_VER if(G && G->anno_ctx) { #ifdef __MINGW32__ if(G->anno_ctx->browser_process) { TerminateProcess(G->anno_ctx->browser_process, 0); CloseHandle(G->anno_ctx->browser_process); G->anno_ctx->browser_process = 0; } #else if(G->anno_ctx->browser_process) { #ifdef __CYGWIN__ G->anno_ctx->cygwin_remote_kill = 1; /* let cygwin child exit() on its own */ #else kill(G->anno_ctx->browser_process, SIGKILL); #endif G->anno_ctx->browser_process = (pid_t)0; } #endif G->anno_ctx = NULL; } #endif } #if !defined _MSC_VER void kill_stems_browser(void) { unsigned int ix; for(ix=0;ixnum_notebook_pages;ix++) { struct Global *G = (*GLOBALS->contexts)[ix]; kill_stems_browser_single(G); } } #endif #ifdef WAVE_USE_XID static int plug_destroy (GtkWidget *widget, gpointer data) { (void)widget; (void)data; exit(0); return(FALSE); } #endif #if defined __MINGW32__ static void close_all_fst_files(void) /* so mingw does delete of reader tempfiles */ { unsigned int i; for(i=0;inum_notebook_pages;i++) { if((*GLOBALS->contexts)[i]->fst_fst_c_1) { fstReaderClose((*GLOBALS->contexts)[i]->fst_fst_c_1); (*GLOBALS->contexts)[i]->fst_fst_c_1 = NULL; } } } #endif #ifdef WAVE_FSDB_READER_IS_PRESENT static void close_all_fsdb_files(void) /* otherwise fsdb can leave around stray files if .gz/.bz2 was in use */ { unsigned int i; for(i=0;inum_notebook_pages;i++) { if((*GLOBALS->contexts)[i]->extload_ffr_ctx) { fsdbReaderClose((*GLOBALS->contexts)[i]->extload_ffr_ctx); (*GLOBALS->contexts)[i]->extload_ffr_ctx = NULL; } } } #endif static void print_help(char *nam) { #if defined(EXTLOAD_SUFFIX) && defined(EXTCONV_PATH) int slen = strlen(EXTLOAD_SUFFIX); char *ucase_ext = wave_alloca(slen+1); int i; for(i=0;i.\n",nam #if !defined _MSC_VER && !defined __MINGW32__ #if defined(EXTLOAD_SUFFIX) && defined(EXTCONV_PATH) ,ucase_ext #endif #endif ); exit(0); } /* * file selection for -n/--nocli flag */ static void wave_get_filename_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; gtk_main_quit(); /* do nothing but exit gtk loop */ } static char *wave_get_filename(char *dfile) { if(dfile) { int len = strlen(dfile); GLOBALS->ftext_main_main_c_1 = malloc_2(strlen(dfile)+2); strcpy(GLOBALS->ftext_main_main_c_1, dfile); #if !defined _MSC_VER && !defined __MINGW32__ if((len)&&(dfile[len-1]!='/')) { strcpy(GLOBALS->ftext_main_main_c_1 + len, "/"); } #else if((len)&&(dfile[len-1]!='\\')) { strcpy(GLOBALS->ftext_main_main_c_1 + len, "\\"); } #endif } fileselbox_old("GTKWave: Select a dumpfile...",&GLOBALS->ftext_main_main_c_1,GTK_SIGNAL_FUNC(wave_get_filename_cleanup), GTK_SIGNAL_FUNC(wave_get_filename_cleanup), NULL, 0); gtk_main(); return(GLOBALS->ftext_main_main_c_1); } /* * Modify the name of the executable (argv[0]) handed to Tk_MainEx; * The new executable name has _[pid] appended. This gives a unique * (and known) name to the interpreter (for use with send). */ void addPidToExecutableName(int argc, char* argv[], char* argv_mod[]) { char* pos; char* buffer; int i; for(i=0;ilogfiles = calloc(1, sizeof(void *)); /* calloc is deliberate! */ } else { old_g = GLOBALS; set_GLOBALS(initialize_globals()); GLOBALS->second_page_created = old_g->second_page_created = 1; GLOBALS->notebook = old_g->notebook; GLOBALS->num_notebook_pages = old_g->num_notebook_pages; GLOBALS->num_notebook_pages_cumulative = old_g->num_notebook_pages_cumulative; GLOBALS->contexts = old_g->contexts; GLOBALS->mainwindow = old_g->mainwindow; splash_disable_rc_override = 1; /* busy.c */ GLOBALS->busycursor_busy_c_1 = old_g->busycursor_busy_c_1; /* logfiles.c */ GLOBALS->logfiles = old_g->logfiles; /* menu.c */ #if defined(HAVE_LIBTCL) GLOBALS->interp = old_g->interp; #endif #ifndef WAVE_USE_MLIST_T GLOBALS->item_factory_menu_c_1 = old_g->item_factory_menu_c_1; #endif GLOBALS->vcd_jmp_buf = old_g->vcd_jmp_buf; /* currenttime.c */ GLOBALS->max_or_marker_label_currenttime_c_1 = old_g->max_or_marker_label_currenttime_c_1; GLOBALS->maxtext_currenttime_c_1=(char *)malloc_2(40); GLOBALS->maxtimewid_currenttime_c_1 = old_g->maxtimewid_currenttime_c_1; GLOBALS->curtext_currenttime_c_1 = old_g->curtext_currenttime_c_1; GLOBALS->base_or_curtime_label_currenttime_c_1 = old_g->base_or_curtime_label_currenttime_c_1; GLOBALS->curtimewid_currenttime_c_1 = old_g->curtimewid_currenttime_c_1; /* status.c */ GLOBALS->text_status_c_2 = old_g->text_status_c_2; GLOBALS->vscrollbar_status_c_2 = old_g->vscrollbar_status_c_2; #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) GLOBALS->iter_status_c_3 = old_g->iter_status_c_3; GLOBALS->bold_tag_status_c_3 = old_g->bold_tag_status_c_3; #endif /* timeentry.c */ GLOBALS->from_entry = old_g->from_entry; GLOBALS->to_entry = old_g->to_entry; /* rc.c */ GLOBALS->possibly_use_rc_defaults = old_g->possibly_use_rc_defaults; GLOBALS->ignore_savefile_pane_pos = old_g->ignore_savefile_pane_pos; GLOBALS->ignore_savefile_pos = old_g->ignore_savefile_pos; GLOBALS->ignore_savefile_size = old_g->ignore_savefile_size; GLOBALS->color_back = old_g->color_back; GLOBALS->color_baseline = old_g->color_baseline; GLOBALS->color_grid = old_g->color_grid; GLOBALS->color_grid2 = old_g->color_grid2; GLOBALS->color_high = old_g->color_high; GLOBALS->color_highfill = old_g->color_highfill; GLOBALS->color_low = old_g->color_low; GLOBALS->color_1 = old_g->color_1; GLOBALS->color_1fill = old_g->color_1fill; GLOBALS->color_0 = old_g->color_0; GLOBALS->color_mark = old_g->color_mark; GLOBALS->color_mid = old_g->color_mid; GLOBALS->color_time = old_g->color_time; GLOBALS->color_timeb = old_g->color_timeb; GLOBALS->color_trans = old_g->color_trans; GLOBALS->color_umark = old_g->color_umark; GLOBALS->color_value = old_g->color_value; GLOBALS->color_vbox = old_g->color_vbox; GLOBALS->color_vtrans = old_g->color_vtrans; GLOBALS->color_x = old_g->color_x; GLOBALS->color_xfill = old_g->color_xfill; GLOBALS->color_u = old_g->color_u; GLOBALS->color_ufill = old_g->color_ufill; GLOBALS->color_w = old_g->color_w; GLOBALS->color_wfill = old_g->color_wfill; GLOBALS->color_dash = old_g->color_dash; GLOBALS->color_dashfill = old_g->color_dashfill; GLOBALS->color_white = old_g->color_white; GLOBALS->color_black = old_g->color_black; GLOBALS->color_ltgray = old_g->color_ltgray; GLOBALS->color_normal = old_g->color_normal; GLOBALS->color_mdgray = old_g->color_mdgray; GLOBALS->color_dkgray = old_g->color_dkgray; GLOBALS->color_dkblue = old_g->color_dkblue; GLOBALS->color_brkred = old_g->color_brkred; GLOBALS->color_ltblue = old_g->color_ltblue; GLOBALS->color_gmstrd = old_g->color_gmstrd; GLOBALS->atomic_vectors = old_g->atomic_vectors; GLOBALS->autoname_bundles = old_g->autoname_bundles; GLOBALS->autocoalesce = old_g->autocoalesce; GLOBALS->autocoalesce_reversal = old_g->autocoalesce_reversal; GLOBALS->constant_marker_update = old_g->constant_marker_update; GLOBALS->convert_to_reals = old_g->convert_to_reals; GLOBALS->disable_mouseover = old_g->disable_mouseover; GLOBALS->clipboard_mouseover = old_g->clipboard_mouseover; GLOBALS->keep_xz_colors = old_g->keep_xz_colors; GLOBALS->disable_tooltips = old_g->disable_tooltips; GLOBALS->do_initial_zoom_fit = old_g->do_initial_zoom_fit; GLOBALS->do_resize_signals = old_g->do_resize_signals; GLOBALS->alt_wheel_mode = old_g->alt_wheel_mode; GLOBALS->initial_signal_window_width = old_g->initial_signal_window_width; GLOBALS->scale_to_time_dimension = old_g->scale_to_time_dimension; GLOBALS->enable_fast_exit = old_g->enable_fast_exit; GLOBALS->enable_ghost_marker = old_g->enable_ghost_marker; GLOBALS->enable_horiz_grid = old_g->enable_horiz_grid; GLOBALS->fill_waveform = old_g->fill_waveform; GLOBALS->make_vcd_save_file = old_g->make_vcd_save_file; GLOBALS->enable_vert_grid = old_g->enable_vert_grid; GLOBALS->force_toolbars = old_g->force_toolbars; GLOBALS->hide_sst = old_g->hide_sst; GLOBALS->sst_expanded = old_g->sst_expanded; GLOBALS->hier_grouping = old_g->hier_grouping; GLOBALS->hier_max_level = old_g->hier_max_level; GLOBALS->hier_max_level_shadow = old_g->hier_max_level_shadow; GLOBALS->paned_pack_semantics = old_g->paned_pack_semantics; GLOBALS->left_justify_sigs = old_g->left_justify_sigs; GLOBALS->lxt_clock_compress_to_z = old_g->lxt_clock_compress_to_z; GLOBALS->ps_maxveclen = old_g->ps_maxveclen; GLOBALS->show_base = old_g->show_base; GLOBALS->display_grid = old_g->display_grid; GLOBALS->highlight_wavewindow = old_g->highlight_wavewindow; GLOBALS->fill_waveform = old_g->fill_waveform; GLOBALS->use_standard_trace_select = old_g->use_standard_trace_select; GLOBALS->use_big_fonts = old_g->use_big_fonts; GLOBALS->use_full_precision = old_g->use_full_precision; GLOBALS->use_frequency_delta = old_g->use_frequency_delta; GLOBALS->use_maxtime_display = old_g->use_maxtime_display; GLOBALS->use_nonprop_fonts = old_g->use_nonprop_fonts; GLOBALS->use_roundcaps = old_g->use_roundcaps; GLOBALS->use_scrollbar_only = old_g->use_scrollbar_only; GLOBALS->vcd_explicit_zero_subscripts = old_g->vcd_explicit_zero_subscripts; GLOBALS->vcd_preserve_glitches = old_g->vcd_preserve_glitches; GLOBALS->vcd_preserve_glitches_real = old_g->vcd_preserve_glitches_real; GLOBALS->vcd_warning_filesize = old_g->vcd_warning_filesize; GLOBALS->vector_padding = old_g->vector_padding; GLOBALS->vlist_compression_depth = old_g->vlist_compression_depth; GLOBALS->wave_scrolling = old_g->wave_scrolling; GLOBALS->do_zoom_center = old_g->do_zoom_center; GLOBALS->zoom_pow10_snap = old_g->zoom_pow10_snap; GLOBALS->zoom_dyn = old_g->zoom_dyn; GLOBALS->zoom_dyne = old_g->zoom_dyne; GLOBALS->alt_hier_delimeter = old_g->alt_hier_delimeter; GLOBALS->cursor_snap = old_g->cursor_snap; GLOBALS->hier_delimeter = old_g->hier_delimeter; GLOBALS->hier_was_explicitly_set = old_g->hier_was_explicitly_set; GLOBALS->page_divisor = old_g->page_divisor; GLOBALS->ps_maxveclen = old_g->ps_maxveclen; GLOBALS->vector_padding = old_g->vector_padding; GLOBALS->vlist_compression_depth = old_g->vlist_compression_depth; GLOBALS->zoombase = old_g->zoombase; GLOBALS->splash_disable = old_g->splash_disable; GLOBALS->use_pango_fonts = old_g->use_pango_fonts; GLOBALS->hier_ignore_escapes = old_g->hier_ignore_escapes; GLOBALS->ruler_origin = old_g->ruler_origin; GLOBALS->ruler_step = old_g->ruler_step; GLOBALS->disable_ae2_alias = old_g->disable_ae2_alias; GLOBALS->vlist_spill_to_disk = old_g->vlist_spill_to_disk; GLOBALS->vlist_prepack = old_g->vlist_prepack; GLOBALS->do_dynamic_treefilter = old_g->do_dynamic_treefilter; GLOBALS->use_standard_clicking = old_g->use_standard_clicking; GLOBALS->dragzoom_threshold = old_g->dragzoom_threshold; GLOBALS->use_toolbutton_interface = old_g->use_toolbutton_interface; GLOBALS->use_scrollwheel_as_y = old_g->use_scrollwheel_as_y; GLOBALS->enable_slider_zoom = old_g->enable_slider_zoom; GLOBALS->missing_file_toolbar = old_g->missing_file_toolbar; GLOBALS->analog_redraw_skip_count = old_g->analog_redraw_skip_count; GLOBALS->context_tabposition = old_g->context_tabposition; GLOBALS->disable_empty_gui = old_g->disable_empty_gui; GLOBALS->make_vcd_save_file = old_g->make_vcd_save_file; GLOBALS->strace_repeat_count = old_g->strace_repeat_count; GLOBALS->extload_max_tree = old_g->extload_max_tree; GLOBALS->do_hier_compress = old_g->do_hier_compress; GLOBALS->disable_auto_comphier = old_g->disable_auto_comphier; strcpy2_into_new_context(GLOBALS, &GLOBALS->editor_name, &old_g->editor_name); strcpy2_into_new_context(GLOBALS, &GLOBALS->fontname_logfile, &old_g->fontname_logfile); strcpy2_into_new_context(GLOBALS, &GLOBALS->fontname_signals, &old_g->fontname_signals); strcpy2_into_new_context(GLOBALS, &GLOBALS->fontname_waves, &old_g->fontname_waves); strcpy2_into_new_context(GLOBALS, &GLOBALS->argvlist, &old_g->argvlist); mainwindow_already_built = 1; } GLOBALS->whoami=malloc_2(strlen(argv[0])+1); /* cache name in case we fork later */ strcpy(GLOBALS->whoami, argv[0]); if(!mainwindow_already_built) { #ifdef __MINGW32__ gtk_disable_setlocale(); #endif if(!gtk_init_check(&argc, &argv)) { #if defined(__APPLE__) #ifndef MAC_INTEGRATION if(!getenv("DISPLAY")) { fprintf(stderr, "DISPLAY environment variable is not set. Have you ensured\n"); fprintf(stderr, "that x11 has been initialized through open-x11, launching\n"); fprintf(stderr, "gtkwave in an xterm or x11 window, etc?\n\n"); fprintf(stderr, "Attempting to initialize using DISPLAY=:0.0 value...\n\n"); setenv("DISPLAY", ":0.0", 0); if(gtk_init_check(&argc, &argv)) { goto do_primary_inits; } } #endif #endif fprintf(stderr, "Could not initialize GTK! Is DISPLAY env var/xhost set?\n\n"); print_help(argv[0]); } #ifdef WAVE_CRASH_ON_GTK_WARNING g_log_set_always_fatal(G_LOG_LEVEL_CRITICAL|G_LOG_LEVEL_WARNING); #endif } #if defined(__APPLE__) #ifndef MAC_INTEGRATION do_primary_inits: #endif #endif if(!mainwindow_already_built) { wave_gconf_init(argc, argv); } if(!gtkwave_argv0_cached) gtkwave_argv0_cached = argv[0]; /* for new window option */ init_filetrans_data(); /* for file translation splay trees */ init_proctrans_data(); /* for proc translation structs */ init_ttrans_data(); /* for transaction proc translation structs */ if(!mainwindow_already_built) { atexit(remove_all_proc_filters); atexit(remove_all_ttrans_filters); #if defined __MINGW32__ atexit(close_all_fst_files); #endif #ifdef WAVE_FSDB_READER_IS_PRESENT atexit(close_all_fsdb_files); #endif } if(mainwindow_already_built) { optind = 1; } else while (1) { int option_index = 0; static struct option long_options[] = { {"dump", 1, 0, 'f'}, {"fastload", 0, 0, 'F'}, {"optimize", 0, 0, 'o'}, {"nocli", 1, 0, 'n'}, {"save", 1, 0, 'a'}, {"autosavename", 0, 0, 'A'}, {"rcfile", 1, 0, 'r'}, {"defaultskip", 0, 0, 'd'}, {"logfile", 1, 0, 'l'}, {"start", 1, 0, 's'}, {"end", 1, 0, 'e'}, {"cpus", 1, 0, 'c'}, {"stems", 1, 0, 't'}, {"nowm", 0, 0, 'N'}, {"script", 1, 0, 'S'}, {"vcd", 0, 0, 'v'}, {"version", 0, 0, 'V'}, {"help", 0, 0, 'h'}, {"exit", 0, 0, 'x'}, {"xid", 1, 0, 'X'}, {"nomenus", 0, 0, 'M'}, {"dualid", 1, 0, 'D'}, {"interactive", 0, 0, 'I'}, {"giga", 0, 0, 'g'}, {"comphier", 0, 0, 'C'}, {"legacy", 0, 0, 'L'}, {"tcl_init", 1, 0, 'T'}, {"wish", 0, 0, 'W'}, {"repscript", 1, 0, 'R'}, {"repperiod", 1, 0, 'P'}, {"output", 1, 0, 'O' }, {"slider-zoom", 0, 0, 'z'}, {"rpcid", 1, 0, '1' }, {"chdir", 1, 0, '2'}, {"restore", 0, 0, '3'}, {"rcvar", 1, 0, '4'}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "zf:Fon:a:Ar:dl:s:e:c:t:NS:vVhxX:MD:IgCLR:P:O:WT:1:2:34:", long_options, &option_index); if (c == -1) break; /* no more args */ switch (c) { case 'V': printf( WAVE_VERSION_INFO"\n\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" ); exit(0); case 'W': #if defined(HAVE_LIBTCL) #if defined(WIN32) && defined(USE_TCL_STUBS) #else is_wish = 1; #endif #else fprintf(stderr, "GTKWAVE | Tcl support not compiled into this executable, exiting.\n"); exit(255); #endif break; case 'I': #if !defined _MSC_VER is_interactive = 1; #endif break; case 'L': is_legacy = 1; break; case 'D': #if !defined _MSC_VER { char *s = optarg; char *plus = strchr(s, '+'); if((plus)&&(*(plus+1))) { sscanf(plus+1, "%x", &GLOBALS->dual_attach_id_main_c_1); if(plus != s) { char p = *(plus-1); if(p=='0') { GLOBALS->dual_id = 0; break; } else if(p=='1') { GLOBALS->dual_id = 1; break; } } } fprintf(stderr, "Malformed dual session ID. Must be of form m+nnnnnnnn where m is 0 or 1,\n" "and n is a hexadecimal shared memory ID for use with shmat()\n"); exit(255); } #else { fprintf(stderr, "Dual operation not implemented for Win32, exiting.\n"); exit(255); } #endif break; case 'A': is_smartsave = 1; break; case 'v': is_vcd = 1; if(GLOBALS->loaded_file_name) free_2(GLOBALS->loaded_file_name); GLOBALS->loaded_file_name = malloc_2(4+1); strcpy(GLOBALS->loaded_file_name, "-vcd"); break; case 'o': opt_vcd = 1; break; case 'n': wave_get_filename(optarg); if(GLOBALS->filesel_ok) { if(GLOBALS->loaded_file_name) free_2(GLOBALS->loaded_file_name); GLOBALS->loaded_file_name = GLOBALS->ftext_main_main_c_1; GLOBALS->ftext_main_main_c_1 = NULL; } break; case 'h': print_help(argv[0]); break; #ifdef WAVE_USE_XID case 'X': sscanf(optarg, "%x", &GLOBALS->socket_xid); splash_disable_rc_override = 1; break; #endif case '1': sscanf(optarg, "%d", &wave_rpc_id); if(wave_rpc_id < 0) wave_rpc_id = 0; break; case '2': #ifndef _MSC_VER { char *chdir_env = getenv("GTKWAVE_CHDIR"); if(chdir_cache) { free_2(chdir_cache); } chdir_cache = strdup_2(chdir_env ? chdir_env : optarg); if(chdir(chdir_cache) < 0) { fprintf(stderr, "GTKWAVE | Could not chdir '%s', exiting.\n", chdir_cache); perror("Why"); exit(255); } } #endif break; case '3': #ifdef WAVE_HAVE_GCONF { is_vcd = 0; wave_gconf_restore(&GLOBALS->loaded_file_name, &wname, &override_rc, &chdir_cache, &opt_vcd); if(chdir_cache) { if(chdir(chdir_cache) < 0) { fprintf(stderr, "GTKWAVE | Could not chdir '%s', exiting.\n", chdir_cache); perror("Why"); exit(255); } } fprintf(stderr, "GTKWAVE | restore cwd '%s'\n", chdir_cache ? chdir_cache : "(none)"); fprintf(stderr, "GTKWAVE | restore dumpfile '%s'\n", GLOBALS->loaded_file_name ? GLOBALS->loaded_file_name : "(none)"); fprintf(stderr, "GTKWAVE | restore savefile '%s'\n", wname ? wname : "(none)"); fprintf(stderr, "GTKWAVE | restore rcfile '%s'\n", override_rc ? override_rc : "(none)"); fprintf(stderr, "GTKWAVE | restore optimize '%s'\n", opt_vcd ? "yes" : "no"); } #endif break; case 'M': GLOBALS->disable_menus = 1; break; case 'x': fast_exit = 1; splash_disable_rc_override = 1; break; case 'd': GLOBALS->possibly_use_rc_defaults = 0; break; case 'f': is_vcd = 0; if(GLOBALS->loaded_file_name) free_2(GLOBALS->loaded_file_name); GLOBALS->loaded_file_name = malloc_2(strlen(optarg)+1); strcpy(GLOBALS->loaded_file_name, optarg); break; case 'F': is_fastload = VCD_FSL_WRITE; is_giga = 1; break; case 'a': if(wname) free_2(wname); wname = malloc_2(strlen(optarg)+1); strcpy(wname, optarg); break; case 'r': if(override_rc) free_2(override_rc); override_rc = malloc_2(strlen(optarg)+1); strcpy(override_rc, optarg); break; case '4': { struct rc_override *rco = calloc_2(1, sizeof(struct rc_override)); rco->str = strdup_2(optarg); if(rc_override_curr) { rc_override_curr->next = rco; rc_override_curr = rco; } else { rc_override_head = rc_override_curr = rco; } } break; case 's': if(GLOBALS->skip_start) free_2(GLOBALS->skip_start); GLOBALS->skip_start = malloc_2(strlen(optarg)+1); strcpy(GLOBALS->skip_start, optarg); break; case 'e': if(GLOBALS->skip_end) free_2(GLOBALS->skip_end); GLOBALS->skip_end = malloc_2(strlen(optarg)+1); strcpy(GLOBALS->skip_end, optarg); break; case 't': #if !defined _MSC_VER if(GLOBALS->stems_name) free_2(GLOBALS->stems_name); GLOBALS->stems_name = malloc_2(strlen(optarg)+1); strcpy(GLOBALS->stems_name, optarg); #else fprintf(stderr, "GTKWAVE | Warning: '%c' option does not exist in this executable\n", c); #endif break; case 'c': #if !defined _MSC_VER && !defined __MINGW32__ && !defined __FreeBSD__ && !defined __CYGWIN__ GLOBALS->num_cpus = atoi(optarg); if(GLOBALS->num_cpus<1) GLOBALS->num_cpus = 1; if(GLOBALS->num_cpus>8) GLOBALS->num_cpus = 8; #else fprintf(stderr, "GTKWAVE | Warning: '%c' option does not exist in this executable\n", c); #endif break; case 'N': GLOBALS->disable_window_manager = 1; break; case 'S': if(scriptfile) free_2(scriptfile); scriptfile = malloc_2(strlen(optarg)+1); strcpy(scriptfile, optarg); splash_disable_rc_override = 1; break; case 'l': { struct logfile_chain *l = calloc_2(1, sizeof(struct logfile_chain)); struct logfile_chain *ltraverse; l->name = malloc_2(strlen(optarg)+1); strcpy(l->name, optarg); if(GLOBALS->logfile) { ltraverse = GLOBALS->logfile; while(ltraverse->next) ltraverse = ltraverse->next; ltraverse->next = l; } else { GLOBALS->logfile = l; } } break; case 'g': is_giga = 1; break; case 'C': GLOBALS->do_hier_compress = 1; break; case 'R': if(GLOBALS->repscript_name) free_2(GLOBALS->repscript_name); GLOBALS->repscript_name = malloc_2(strlen(optarg)+1); strcpy(GLOBALS->repscript_name, optarg); break; case 'P': { int pd = atoi(optarg); if(pd > 0) { GLOBALS->repscript_period = pd; } } break; case 'T': #if defined(WIN32) && defined(USE_TCL_STUBS) fprintf(stderr, "GTKWAVE | Warning: '%c' option does not exist in this executable\n", c); #else { char* pos; is_wish = 1; if(GLOBALS->tcl_init_cmd) { int length = strlen(GLOBALS->tcl_init_cmd)+9+strlen(optarg); char* buffer = malloc_2(strlen(GLOBALS->tcl_init_cmd)+1); strcpy(buffer, GLOBALS->tcl_init_cmd); free_2(GLOBALS->tcl_init_cmd); GLOBALS->tcl_init_cmd = malloc_2(length+1); strcpy(GLOBALS->tcl_init_cmd, buffer); pos = GLOBALS->tcl_init_cmd + strlen(GLOBALS->tcl_init_cmd); free_2(buffer); } else { int length = 9+strlen(optarg); GLOBALS->tcl_init_cmd = malloc_2(length+1); pos = GLOBALS->tcl_init_cmd; } strcpy(pos, "; source "); pos = GLOBALS->tcl_init_cmd + strlen(GLOBALS->tcl_init_cmd); strcpy(pos, optarg); } #endif break; case 'O': if(output_name) free_2(output_name); output_name = malloc_2(strlen(optarg)+1); strcpy(output_name, optarg); break; case 'z': GLOBALS->enable_slider_zoom = 1; break; case '?': opt_errors_encountered=1; break; default: /* unreachable */ break; } } /* ...while(1) */ if(opt_errors_encountered) { print_help(argv[0]); } if (optind < argc) { while (optind < argc) { if(argv[optind][0] == '-') { if(!strcmp(argv[optind], "--")) { break; } } if(!GLOBALS->loaded_file_name) { is_vcd = 0; GLOBALS->loaded_file_name = malloc_2(strlen(argv[optind])+1); strcpy(GLOBALS->loaded_file_name, argv[optind++]); } else if(!wname) { wname = malloc_2(strlen(argv[optind])+1); strcpy(wname, argv[optind++]); } else if(!override_rc) { override_rc = malloc_2(strlen(argv[optind])+1); strcpy(override_rc, argv[optind++]); break; /* skip any extra args */ } } } if(is_wish && is_vcd) { fprintf(stderr, "GTKWAVE | Cannot use --vcd and --wish options together as both use stdin,\n" "GTKWAVE | exiting!\n"); exit(255); } #if defined(EXTLOAD_SUFFIX) && defined(EXTCONV_PATH) #if !defined(FSDB_IS_PRESENT) || !defined(FSDB_NSYS_IS_PRESENT) if(GLOBALS->loaded_file_name && suffix_check(GLOBALS->loaded_file_name, "."EXTLOAD_SUFFIX)) { opt_vcd = 1; } #endif #endif #if defined(EXT2LOAD_SUFFIX) && defined(EXT2CONV_PATH) if(GLOBALS->loaded_file_name && suffix_check(GLOBALS->loaded_file_name, "."EXT2LOAD_SUFFIX)) { opt_vcd = 1; } #endif #if defined(EXT3LOAD_SUFFIX) && defined(EXT3CONV_PATH) if(GLOBALS->loaded_file_name && suffix_check(GLOBALS->loaded_file_name, "."EXT3LOAD_SUFFIX)) { opt_vcd = 1; } #endif /* attempt to load a dump+save file if only a savefile is specified at the command line */ if((GLOBALS->loaded_file_name) && (!wname) && (suffix_check(GLOBALS->loaded_file_name, ".gtkw") || suffix_check(GLOBALS->loaded_file_name, ".sav"))) { char *extracted_name = extract_dumpname_from_save_file(GLOBALS->loaded_file_name, &GLOBALS->dumpfile_is_modified, &opt_vcd); if(extracted_name) { if(mainwindow_already_built) { deal_with_rpc_open_2(GLOBALS->loaded_file_name, NULL, TRUE); GLOBALS->loaded_file_name = extracted_name; /* wname is still NULL */ } else { wname = GLOBALS->loaded_file_name; GLOBALS->loaded_file_name = extracted_name; } } } else /* same as above but with --save specified */ if((!GLOBALS->loaded_file_name) && wname) { GLOBALS->loaded_file_name = extract_dumpname_from_save_file(wname, &GLOBALS->dumpfile_is_modified, &opt_vcd); /* still can be NULL if file not found... */ } if(!old_g) /* copy all variables earlier when old_g is set */ { read_rc_file(override_rc); } GLOBALS->splash_disable |= splash_disable_rc_override; if(!GLOBALS->loaded_file_name) { /* if rc can gates off gui, default is not to disable */ if(GLOBALS->disable_empty_gui) { print_help(argv[0]); } } if(is_giga) { GLOBALS->vlist_spill_to_disk = 1; GLOBALS->vlist_prepack = 1; } if(output_name) { #if !defined _MSC_VER && !defined __MINGW32__ int iarg; time_t walltime; int fd_replace = open(output_name, O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR|S_IWUSR); if(fd_replace<0) { fprintf(stderr, "Could not open redirect file, exiting.\n"); perror("Why"); exit(255); } dup2(fd_replace, 1); dup2(fd_replace, 2); time(&walltime); printf(WAVE_VERSION_INFO"\nDate: %s\n\n",asctime(localtime(&walltime))); for(iarg=0;iargstr); rco_succ = insert_rc_variable(rc_override_head->str); fprintf(stderr, "RCVAR | '%s' %s\n", rco_copy_str, rco_succ ? "FOUND" : "NOT FOUND"); free_2(rco_copy_str); rc_override_curr = rc_override_head->next; free_2(rc_override_head->str); free_2(rc_override_head); rc_override_head = rc_override_curr; } } if(!is_wish) { if(tcl_interpreter_needs_making) { GLOBALS->argvlist = zMergeTclList(argc, (const char**)argv); make_tcl_interpreter(argv); } } if((!wname)&&(GLOBALS->make_vcd_save_file)) { vcd_save_handle_cached = GLOBALS->vcd_save_handle=fopen(vcd_autosave_name,"wb"); errno=0; /* just in case */ is_smartsave = (GLOBALS->vcd_save_handle != NULL); /* use smartsave if for some reason can't open auto savefile */ } if(!GLOBALS->loaded_file_name) { GLOBALS->loaded_file_name = strdup_2("[no file loaded]"); is_missing_file = 1; GLOBALS->min_time=LLDescriptor(0); GLOBALS->max_time=LLDescriptor(0); if(!is_wish) { fprintf(stderr, "GTKWAVE | Use the -h, --help command line flags to display help.\n"); } } /* load either the vcd or aet file depending on suffix then mode setting */ if(is_vcd) { GLOBALS->winname=malloc_2(strlen(winstd)+4+1); strcpy(GLOBALS->winname,winstd); } else { if(!is_interactive) { GLOBALS->winname=malloc_2(strlen(GLOBALS->loaded_file_name)+strlen(winprefix)+1); strcpy(GLOBALS->winname,winprefix); } else { char *iact = "GTKWave - Interactive Shared Memory ID "; GLOBALS->winname=malloc_2(strlen(GLOBALS->loaded_file_name)+strlen(iact)+1); strcpy(GLOBALS->winname,iact); } } strcat(GLOBALS->winname,GLOBALS->loaded_file_name); loader_check_head: if(!is_missing_file) { magic_word_filetype = determine_gtkwave_filetype(GLOBALS->loaded_file_name); } if(is_missing_file) { GLOBALS->loaded_file_type = MISSING_FILE; } else #if defined(EXTLOAD_SUFFIX) if( (suffix_check(GLOBALS->loaded_file_name, "."EXTLOAD_SUFFIX ) && !opt_vcd) || (suffix_check(GLOBALS->loaded_file_name, "."EXTLOAD_SUFFIX".gz" ) && !opt_vcd) || /* loader automatically does gzip -cd */ (suffix_check(GLOBALS->loaded_file_name, "."EXTLOAD_SUFFIX".bz2") && !opt_vcd) /* loader automatically does bzip2 -cd */ ) { TimeType extload_max; GLOBALS->loaded_file_type = EXTLOAD_FILE; extload_max = extload_main(GLOBALS->loaded_file_name, GLOBALS->skip_start, GLOBALS->skip_end); if((!GLOBALS->extload) || (GLOBALS->extload_already_errored) || (!extload_max)) { fprintf(stderr, "GTKWAVE | Could not initialize '%s'%s.\n", GLOBALS->loaded_file_name, GLOBALS->vcd_jmp_buf ? "" : ", exiting"); vcd_exit(255); } } else #endif if((magic_word_filetype == G_FT_LXT) || (magic_word_filetype == G_FT_LXT2) || suffix_check(GLOBALS->loaded_file_name, ".lxt") || suffix_check(GLOBALS->loaded_file_name, ".lx2") || suffix_check(GLOBALS->loaded_file_name, ".lxt2")) { FILE *f = fopen(GLOBALS->loaded_file_name, "rb"); int typ = 0; if(f) { char buf[2]; unsigned int matchword; if(fread(buf, 2, 1, f)) { matchword = (((unsigned int)buf[0])<<8) | ((unsigned int)buf[1]); if(matchword == LT_HDRID) typ = 1; } fclose(f); } if(typ) { GLOBALS->loaded_file_type = LXT_FILE; lxt_main(GLOBALS->loaded_file_name); } else { #if !defined _MSC_VER GLOBALS->stems_type = WAVE_ANNO_LXT2; GLOBALS->aet_name = malloc_2(strlen(GLOBALS->loaded_file_name)+1); strcpy(GLOBALS->aet_name, GLOBALS->loaded_file_name); #endif GLOBALS->loaded_file_type = LX2_FILE; lx2_main(GLOBALS->loaded_file_name, GLOBALS->skip_start, GLOBALS->skip_end); if(!GLOBALS->lx2_lx2_c_1) { fprintf(stderr, "GTKWAVE | Could not initialize '%s'%s.\n", GLOBALS->loaded_file_name, GLOBALS->vcd_jmp_buf ? "" : ", exiting"); vcd_exit(255); } } } else if((magic_word_filetype == G_FT_FST) || suffix_check(GLOBALS->loaded_file_name, ".fst")) { #if !defined _MSC_VER GLOBALS->stems_type = WAVE_ANNO_FST; GLOBALS->aet_name = malloc_2(strlen(GLOBALS->loaded_file_name)+1); strcpy(GLOBALS->aet_name, GLOBALS->loaded_file_name); #endif GLOBALS->loaded_file_type = FST_FILE; fst_main(GLOBALS->loaded_file_name, GLOBALS->skip_start, GLOBALS->skip_end); if(!GLOBALS->fst_fst_c_1) { fprintf(stderr, "GTKWAVE | Could not initialize '%s'%s.\n", GLOBALS->loaded_file_name, GLOBALS->vcd_jmp_buf ? "" : ", exiting"); vcd_exit(255); } } else if((magic_word_filetype == G_FT_VZT) || suffix_check(GLOBALS->loaded_file_name, ".vzt")) { #if !defined _MSC_VER GLOBALS->stems_type = WAVE_ANNO_VZT; GLOBALS->aet_name = malloc_2(strlen(GLOBALS->loaded_file_name)+1); strcpy(GLOBALS->aet_name, GLOBALS->loaded_file_name); #endif GLOBALS->loaded_file_type = VZT_FILE; vzt_main(GLOBALS->loaded_file_name, GLOBALS->skip_start, GLOBALS->skip_end); if(!GLOBALS->vzt_vzt_c_1) { fprintf(stderr, "GTKWAVE | Could not initialize '%s'%s.\n", GLOBALS->loaded_file_name, GLOBALS->vcd_jmp_buf ? "" : ", exiting"); vcd_exit(255); } } else if(suffix_check(GLOBALS->loaded_file_name, ".aet") || suffix_check(GLOBALS->loaded_file_name, ".ae2")) { #if !defined _MSC_VER GLOBALS->stems_type = WAVE_ANNO_AE2; GLOBALS->aet_name = malloc_2(strlen(GLOBALS->loaded_file_name)+1); strcpy(GLOBALS->aet_name, GLOBALS->loaded_file_name); #endif GLOBALS->loaded_file_type = AE2_FILE; ae2_main(GLOBALS->loaded_file_name, GLOBALS->skip_start, GLOBALS->skip_end); #ifdef AET2_IS_PRESENT if(!GLOBALS->ae2) { fprintf(stderr, "GTKWAVE | Could not initialize '%s'%s.\n", GLOBALS->loaded_file_name, GLOBALS->vcd_jmp_buf ? "" : ", exiting"); vcd_exit(255); } #else /* fails in stubbed out ae2_main() */ #endif } else if (suffix_check(GLOBALS->loaded_file_name, ".ghw") || suffix_check(GLOBALS->loaded_file_name, ".ghw.gz") || suffix_check(GLOBALS->loaded_file_name, ".ghw.bz2")) { GLOBALS->loaded_file_type = GHW_FILE; if(!ghw_main(GLOBALS->loaded_file_name)) { /* error message printed in ghw_main() */ vcd_exit(255); } } else if (strlen(GLOBALS->loaded_file_name)>4) /* case for .aet? type filenames */ { char sufbuf[5]; memcpy(sufbuf, GLOBALS->loaded_file_name+strlen(GLOBALS->loaded_file_name)-5, 4); sufbuf[4] = 0; if(!strcasecmp(sufbuf, ".aet")) /* strncasecmp() in windows? */ { #if !defined _MSC_VER GLOBALS->stems_type = WAVE_ANNO_AE2; GLOBALS->aet_name = malloc_2(strlen(GLOBALS->loaded_file_name)+1); strcpy(GLOBALS->aet_name, GLOBALS->loaded_file_name); #endif GLOBALS->loaded_file_type = AE2_FILE; #ifdef AET2_IS_PRESENT ae2_main(GLOBALS->loaded_file_name, GLOBALS->skip_start, GLOBALS->skip_end); if(!GLOBALS->ae2) { fprintf(stderr, "GTKWAVE | Could not initialize '%s'%s.\n", GLOBALS->loaded_file_name, GLOBALS->vcd_jmp_buf ? "" : ", exiting"); vcd_exit(255); } #else /* fails in stubbed out ae2_main() */ #endif } else { goto load_vcd; } } else /* nothing else left so default to "something" */ { load_vcd: #if !defined _MSC_VER && !defined __MINGW32__ if(opt_vcd) { GLOBALS->unoptimized_vcd_file_name = calloc_2(1,strlen(GLOBALS->loaded_file_name) + 1); strcpy(GLOBALS->unoptimized_vcd_file_name, GLOBALS->loaded_file_name); optimize_vcd_file(); /* is_vcd = 0; */ /* scan-build */ GLOBALS->optimize_vcd = 1; goto loader_check_head; } #endif #if !defined _MSC_VER if(is_interactive) { GLOBALS->loaded_file_type = DUMPLESS_FILE; vcd_partial_main(GLOBALS->loaded_file_name); } else #endif { if(is_legacy) { GLOBALS->loaded_file_type = (strcmp(GLOBALS->loaded_file_name, "-vcd")) ? VCD_FILE : DUMPLESS_FILE; vcd_main(GLOBALS->loaded_file_name); } else { if(strcmp(GLOBALS->loaded_file_name, "-vcd")) { GLOBALS->loaded_file_type = VCD_RECODER_FILE; GLOBALS->use_fastload = is_fastload; } else { GLOBALS->loaded_file_type = DUMPLESS_FILE; GLOBALS->use_fastload = VCD_FSL_NONE; } vcd_recoder_main(GLOBALS->loaded_file_name); } } } if(((GLOBALS->loaded_file_type != FST_FILE) && (GLOBALS->loaded_file_type != AE2_FILE) #if defined(EXTLOAD_SUFFIX) && (GLOBALS->loaded_file_type != EXTLOAD_FILE) #endif ) || (!GLOBALS->fast_tree_sort)) { GLOBALS->do_hier_compress = 0; /* for now, add more file formats in the future */ } /* deallocate the symbol hash table */ sym_hash_destroy(GLOBALS); /* reset/initialize various markers and time values */ for(i=0;inamed_markers[i]=-1; /* reset all named markers */ GLOBALS->tims.last=GLOBALS->max_time; GLOBALS->tims.end=GLOBALS->tims.last; /* until the configure_event of wavearea */ GLOBALS->tims.first=GLOBALS->tims.start=GLOBALS->tims.laststart=GLOBALS->min_time; GLOBALS->tims.zoom=GLOBALS->tims.prevzoom=0; /* 1 pixel/ns default */ GLOBALS->tims.marker=GLOBALS->tims.lmbcache=-1; /* uninitialized at first */ GLOBALS->tims.baseline=-1; /* middle button toggle marker */ if((wname)||(vcd_save_handle_cached)||(is_smartsave)) { int wave_is_compressed; char *str = NULL; GLOBALS->is_gtkw_save_file = (!wname) || suffix_check(wname, ".gtkw"); if(vcd_save_handle_cached) { wname=vcd_autosave_name; GLOBALS->do_initial_zoom_fit=1; } else if((!wname) /* && (is_smartsave) */) { char *pnt = wave_alloca(strlen(GLOBALS->loaded_file_name) + 1); char *pnt2; strcpy(pnt, GLOBALS->loaded_file_name); if((strlen(pnt)>2)&&(!strcasecmp(pnt+strlen(pnt)-3,".gz"))) { pnt[strlen(pnt)-3] = 0x00; } else if ((strlen(pnt)>3)&&(!strcasecmp(pnt+strlen(pnt)-4,".zip"))) { pnt[strlen(pnt)-4] = 0x00; } pnt2 = pnt + strlen(pnt); if(pnt != pnt2) { do { if(*pnt2 == '.') { *pnt2 = 0x00; break; } } while(pnt2-- != pnt); } wname = malloc_2(strlen(pnt) + 6); strcpy(wname, pnt); strcat(wname, ".gtkw"); } if(((strlen(wname)>2)&&(!strcasecmp(wname+strlen(wname)-3,".gz")))|| ((strlen(wname)>3)&&(!strcasecmp(wname+strlen(wname)-4,".zip")))) { int dlen; dlen=strlen(WAVE_DECOMPRESSOR); str=wave_alloca(strlen(wname)+dlen+1); strcpy(str,WAVE_DECOMPRESSOR); strcpy(str+dlen,wname); wave=popen(str,"r"); wave_is_compressed=~0; } else { wave=fopen(wname,"rb"); wave_is_compressed=0; GLOBALS->filesel_writesave = malloc_2(strlen(wname)+1); /* don't handle compressed files */ strcpy(GLOBALS->filesel_writesave, wname); } if(!wave) { fprintf(stderr, "** WARNING: Error opening save file '%s', skipping.\n",wname); } else { char *iline; int s_ctx_iter; WAVE_STRACE_ITERATOR(s_ctx_iter) { GLOBALS->strace_ctx = &GLOBALS->strace_windows[GLOBALS->strace_current_window = s_ctx_iter]; GLOBALS->strace_ctx->shadow_encountered_parsewavline = 0; } if(GLOBALS->is_lx2) { while((iline=fgetmalloc(wave))) { parsewavline_lx2(iline, NULL, 0); free_2(iline); } switch(GLOBALS->is_lx2) { case LXT2_IS_LXT2: lx2_import_masked(); break; case LXT2_IS_AET2: ae2_import_masked(); break; case LXT2_IS_VZT: vzt_import_masked(); break; case LXT2_IS_VLIST: vcd_import_masked(); break; case LXT2_IS_FST: fst_import_masked(); break; case LXT2_IS_FSDB: fsdb_import_masked(); break; } if(wave_is_compressed) { pclose(wave); wave=popen(str,"r"); } else { fclose(wave); wave=fopen(wname,"rb"); } if(!wave) { fprintf(stderr, "** WARNING: Error opening save file '%s', skipping.\n",wname); EnsureGroupsMatch(); goto savefile_bail; } } read_save_helper_relative_init(wname); GLOBALS->default_flags=TR_RJUSTIFY; GLOBALS->default_fpshift = 0; GLOBALS->shift_timebase_default_for_add=LLDescriptor(0); GLOBALS->strace_current_window = 0; /* in case there are shadow traces */ GLOBALS->which_t_color = 0; while((iline=fgetmalloc(wave))) { parsewavline(iline, NULL, 0); GLOBALS->strace_ctx->shadow_encountered_parsewavline |= GLOBALS->strace_ctx->shadow_active; free_2(iline); } GLOBALS->which_t_color = 0; GLOBALS->default_flags=TR_RJUSTIFY; GLOBALS->default_fpshift = 0; GLOBALS->shift_timebase_default_for_add=LLDescriptor(0); if(wave_is_compressed) pclose(wave); else fclose(wave); EnsureGroupsMatch(); WAVE_STRACE_ITERATOR(s_ctx_iter) { GLOBALS->strace_ctx = &GLOBALS->strace_windows[GLOBALS->strace_current_window = s_ctx_iter]; if(GLOBALS->strace_ctx->shadow_encountered_parsewavline) { GLOBALS->strace_ctx->shadow_encountered_parsewavline = 0; if(GLOBALS->strace_ctx->shadow_straces) { GLOBALS->strace_ctx->shadow_active = 1; swap_strace_contexts(); strace_maketimetrace(1); swap_strace_contexts(); GLOBALS->strace_ctx->shadow_active = 0; } } } } } savefile_bail: GLOBALS->current_translate_file = 0; if(fast_exit) { printf("Exiting early because of --exit request.\n"); exit(0); } if ((GLOBALS->loaded_file_type != MISSING_FILE) && (!GLOBALS->zoom_was_explicitly_set) && ((GLOBALS->tims.last-GLOBALS->tims.first)<=400)) GLOBALS->do_initial_zoom_fit=1; /* force zoom on small traces */ calczoom(GLOBALS->tims.zoom); if(!mainwindow_already_built) { #ifdef WAVE_USE_XID if(!GLOBALS->socket_xid) #endif { GLOBALS->mainwindow = gtk_window_new(GLOBALS->disable_window_manager ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL); wave_gtk_window_set_title(GTK_WINDOW(GLOBALS->mainwindow), GLOBALS->winname, GLOBALS->dumpfile_is_modified ? WAVE_SET_TITLE_MODIFIED: WAVE_SET_TITLE_NONE, 0); if((GLOBALS->initial_window_width>0)&&(GLOBALS->initial_window_height>0)) { gtk_window_set_default_size(GTK_WINDOW (GLOBALS->mainwindow), GLOBALS->initial_window_width, GLOBALS->initial_window_height); } else { gtk_window_set_default_size(GTK_WINDOW(GLOBALS->mainwindow), GLOBALS->initial_window_x, GLOBALS->initial_window_y); } gtk_signal_connect(GTK_OBJECT(GLOBALS->mainwindow), "delete_event", /* formerly was "destroy" */GTK_SIGNAL_FUNC(file_quit_cmd_callback), "WM destroy"); gtk_widget_show(GLOBALS->mainwindow); } #ifdef WAVE_USE_XID else { GLOBALS->mainwindow = gtk_plug_new(GLOBALS->socket_xid); gtk_widget_show(GLOBALS->mainwindow); gtk_signal_connect(GTK_OBJECT(GLOBALS->mainwindow), "destroy", /* formerly was "destroy" */GTK_SIGNAL_FUNC(plug_destroy),"Plug destroy"); } #endif } #ifdef MAC_INTEGRATION dock_pb = #endif make_pixmaps(GLOBALS->mainwindow); #ifdef WAVE_USE_GTK2 if(GLOBALS->use_toolbutton_interface) { GtkWidget *tb; GtkWidget *stock; GtkStyle *style; int tb_pos; if(!mainwindow_already_built) { main_vbox = gtk_vbox_new(FALSE, 5); gtk_container_border_width(GTK_CONTAINER(main_vbox), 1); gtk_container_add(GTK_CONTAINER(GLOBALS->mainwindow), main_vbox); gtk_widget_show(main_vbox); if(!GLOBALS->disable_menus) { #ifdef WAVE_USE_XID if(GLOBALS->socket_xid) kill_main_menu_accelerators(); #endif #ifdef WAVE_USE_MLIST_T menubar = alt_menu_top(GLOBALS->mainwindow); #else get_main_menu(GLOBALS->mainwindow, &menubar); #endif gtk_widget_show(menubar); #ifdef MAC_INTEGRATION { GtkosxApplication *theApp = g_object_new(GTKOSX_TYPE_APPLICATION, NULL); gtk_widget_hide(menubar); gtkosx_application_set_menu_bar(theApp, GTK_MENU_SHELL(menubar)); gtkosx_application_set_use_quartz_accelerators(theApp, TRUE); gtkosx_application_ready(theApp); gtkosx_application_set_dock_icon_pixbuf(theApp, dock_pb); if(GLOBALS->loaded_file_type == MISSING_FILE) { gtkosx_application_attention_request(theApp, INFO_REQUEST); } g_signal_connect(theApp, "NSApplicationOpenFile", G_CALLBACK(deal_with_finder_open), NULL); g_signal_connect(theApp, "NSApplicationBlockTermination", G_CALLBACK(deal_with_termination), NULL); } #endif if(GLOBALS->force_toolbars) { toolhandle=gtk_handle_box_new(); gtk_widget_show(toolhandle); gtk_container_add(GTK_CONTAINER(toolhandle), menubar); gtk_box_pack_start(GTK_BOX(main_vbox), toolhandle, FALSE, TRUE, 0); } else { gtk_box_pack_start(GTK_BOX(main_vbox), menubar, FALSE, TRUE, 0); } } whole_table = gtk_table_new (256, 16, FALSE); tb = gtk_toolbar_new(); top_table = tb; /* export this as our top widget rather than a table */ gtk_toolbar_set_style(GTK_TOOLBAR(tb), GTK_TOOLBAR_ICONS); tb_pos = 0; if(GLOBALS->force_toolbars) { toolhandle=gtk_handle_box_new(); gtk_widget_show(toolhandle); gtk_container_add(GTK_CONTAINER(toolhandle), top_table); } stock = gtk_toolbar_insert_stock(GTK_TOOLBAR(tb), GTK_STOCK_CUT, "Cut Traces", NULL, GTK_SIGNAL_FUNC(menu_cut_traces), NULL, tb_pos++); style = gtk_widget_get_style(stock); style->xthickness = style->ythickness = 0; gtk_widget_set_style (stock, style); gtk_widget_show(stock); stock = gtk_toolbar_insert_stock(GTK_TOOLBAR(tb), GTK_STOCK_COPY, "Copy Traces", NULL, GTK_SIGNAL_FUNC(menu_copy_traces), NULL, tb_pos++); style = gtk_widget_get_style(stock); style->xthickness = style->ythickness = 0; gtk_widget_set_style (stock, style); gtk_widget_show(stock); stock = gtk_toolbar_insert_stock(GTK_TOOLBAR(tb), GTK_STOCK_PASTE, "Paste Traces", NULL, GTK_SIGNAL_FUNC(menu_paste_traces), NULL, tb_pos++); style = gtk_widget_get_style(stock); style->xthickness = style->ythickness = 0; gtk_widget_set_style (stock, style); gtk_widget_show(stock); gtk_toolbar_insert_space(GTK_TOOLBAR(tb), tb_pos++); stock = gtk_toolbar_insert_stock(GTK_TOOLBAR(tb), GTK_STOCK_ZOOM_FIT, "Zoom Fit", NULL, GTK_SIGNAL_FUNC(service_zoom_fit), NULL, tb_pos++); style = gtk_widget_get_style(stock); style->xthickness = style->ythickness = 0; gtk_widget_set_style (stock, style); gtk_widget_show(stock); stock = gtk_toolbar_insert_stock(GTK_TOOLBAR(tb), GTK_STOCK_ZOOM_IN, "Zoom In", NULL, GTK_SIGNAL_FUNC(service_zoom_in), NULL, tb_pos++); style = gtk_widget_get_style(stock); style->xthickness = style->ythickness = 0; gtk_widget_set_style (stock, style); gtk_widget_show(stock); stock = gtk_toolbar_insert_stock(GTK_TOOLBAR(tb), GTK_STOCK_ZOOM_OUT, "Zoom Out", NULL, GTK_SIGNAL_FUNC(service_zoom_out), NULL, tb_pos++); style = gtk_widget_get_style(stock); style->xthickness = style->ythickness = 0; gtk_widget_set_style (stock, style); gtk_widget_show(stock); stock = gtk_toolbar_insert_stock(GTK_TOOLBAR(tb), GTK_STOCK_UNDO, "Zoom Undo", NULL, GTK_SIGNAL_FUNC(service_zoom_undo), NULL, tb_pos++); style = gtk_widget_get_style(stock); style->xthickness = style->ythickness = 0; gtk_widget_set_style (stock, style); gtk_widget_show(stock); stock = gtk_toolbar_insert_stock(GTK_TOOLBAR(tb), GTK_STOCK_GOTO_FIRST, "Zoom to Start", NULL, GTK_SIGNAL_FUNC(service_zoom_left), NULL, tb_pos++); style = gtk_widget_get_style(stock); style->xthickness = style->ythickness = 0; gtk_widget_set_style (stock, style); gtk_widget_show(stock); stock = gtk_toolbar_insert_stock(GTK_TOOLBAR(tb), GTK_STOCK_GOTO_LAST, "Zoom to End", NULL, GTK_SIGNAL_FUNC(service_zoom_right), NULL, tb_pos++); style = gtk_widget_get_style(stock); style->xthickness = style->ythickness = 0; gtk_widget_set_style (stock, style); gtk_widget_show(stock); gtk_toolbar_insert_space(GTK_TOOLBAR(tb), tb_pos++); stock = gtk_toolbar_insert_stock(GTK_TOOLBAR(tb), GTK_STOCK_GO_BACK, "Find Previous Edge", NULL, GTK_SIGNAL_FUNC(service_left_edge), NULL, tb_pos++); style = gtk_widget_get_style(stock); style->xthickness = style->ythickness = 0; gtk_widget_set_style (stock, style); gtk_widget_show(stock); stock = gtk_toolbar_insert_stock(GTK_TOOLBAR(tb), GTK_STOCK_GO_FORWARD, "Find Next Edge", NULL, GTK_SIGNAL_FUNC(service_right_edge), NULL, tb_pos++); style = gtk_widget_get_style(stock); style->xthickness = style->ythickness = 0; gtk_widget_set_style (stock, style); gtk_widget_show(stock); gtk_toolbar_insert_space(GTK_TOOLBAR(tb), tb_pos++); entry = create_entry_box(); gtk_widget_show(entry); gtk_toolbar_insert_widget(GTK_TOOLBAR(tb), entry, NULL, NULL, tb_pos++); gtk_toolbar_insert_space(GTK_TOOLBAR(tb), tb_pos++); if((GLOBALS->loaded_file_type != DUMPLESS_FILE)&&(!GLOBALS->disable_menus)) { stock = gtk_toolbar_insert_stock(GTK_TOOLBAR(tb), GTK_STOCK_REFRESH, "Reload", NULL, GTK_SIGNAL_FUNC(menu_reload_waveform_marshal), NULL, tb_pos++); style = gtk_widget_get_style(stock); style->xthickness = style->ythickness = 0; gtk_widget_set_style (stock, style); gtk_widget_show(stock); gtk_toolbar_insert_space(GTK_TOOLBAR(tb), tb_pos++); } timebox = create_time_box(); gtk_widget_show (timebox); gtk_toolbar_insert_widget(GTK_TOOLBAR(tb), timebox, NULL, NULL, tb_pos /* ++ */); /* scan-build */ GLOBALS->missing_file_toolbar = tb; if(GLOBALS->loaded_file_type == MISSING_FILE) { gtk_widget_set_sensitive(GLOBALS->missing_file_toolbar, FALSE); } } /* of ...if(mainwindow_already_built) */ } else #endif { if(!mainwindow_already_built) { main_vbox = gtk_vbox_new(FALSE, 5); gtk_container_border_width(GTK_CONTAINER(main_vbox), 1); gtk_container_add(GTK_CONTAINER(GLOBALS->mainwindow), main_vbox); gtk_widget_show(main_vbox); if(!GLOBALS->disable_menus) { #ifdef WAVE_USE_MLIST_T menubar = alt_menu_top(GLOBALS->mainwindow); #else get_main_menu(GLOBALS->mainwindow, &menubar); #endif gtk_widget_show(menubar); #ifdef MAC_INTEGRATION { GtkosxApplication *theApp = g_object_new(GTKOSX_TYPE_APPLICATION, NULL); gtk_widget_hide(menubar); gtkosx_application_set_menu_bar(theApp, GTK_MENU_SHELL(menubar)); gtkosx_application_set_use_quartz_accelerators(theApp, TRUE); gtkosx_application_ready(theApp); gtkosx_application_set_dock_icon_pixbuf(theApp, dock_pb); if(GLOBALS->loaded_file_type == MISSING_FILE) { gtkosx_application_attention_request(theApp, INFO_REQUEST); } g_signal_connect(theApp, "NSApplicationOpenFile", G_CALLBACK(deal_with_finder_open), NULL); g_signal_connect(theApp, "NSApplicationBlockTermination", G_CALLBACK(deal_with_termination), NULL); } #endif if(GLOBALS->force_toolbars) { toolhandle=gtk_handle_box_new(); gtk_widget_show(toolhandle); gtk_container_add(GTK_CONTAINER(toolhandle), menubar); gtk_box_pack_start(GTK_BOX(main_vbox), toolhandle, FALSE, TRUE, 0); } else { gtk_box_pack_start(GTK_BOX(main_vbox), menubar, FALSE, TRUE, 0); } } top_table = gtk_table_new (1, 284, FALSE); if(GLOBALS->force_toolbars) { toolhandle=gtk_handle_box_new(); gtk_widget_show(toolhandle); gtk_container_add(GTK_CONTAINER(toolhandle), top_table); } whole_table = gtk_table_new (256, 16, FALSE); text1 = create_text (); gtk_table_attach (GTK_TABLE (top_table), text1, 0, 141, 0, 1, GTK_FILL, GTK_FILL | GTK_SHRINK, 0, 0); gtk_widget_set_usize(GTK_WIDGET(text1), 200, -1); gtk_widget_show (text1); dummy1=gtk_label_new(""); gtk_table_attach (GTK_TABLE (top_table), dummy1, 141, 171, 0, 1, GTK_FILL, GTK_SHRINK, 0, 0); gtk_widget_show (dummy1); zoombuttons = create_zoom_buttons (); gtk_table_attach (GTK_TABLE (top_table), zoombuttons, 171, 173, 0, 1, GTK_FILL, GTK_SHRINK, 0, 0); gtk_widget_show (zoombuttons); if(!GLOBALS->use_scrollbar_only) { pagebuttons = create_page_buttons (); gtk_table_attach (GTK_TABLE (top_table), pagebuttons, 173, 174, 0, 1, GTK_FILL, GTK_SHRINK, 0, 0); gtk_widget_show (pagebuttons); fetchbuttons = create_fetch_buttons (); gtk_table_attach (GTK_TABLE (top_table), fetchbuttons, 174, 175, 0, 1, GTK_FILL, GTK_SHRINK, 0, 0); gtk_widget_show (fetchbuttons); discardbuttons = create_discard_buttons (); gtk_table_attach (GTK_TABLE (top_table), discardbuttons, 175, 176, 0, 1, GTK_FILL, GTK_SHRINK, 0, 0); gtk_widget_show (discardbuttons); shiftbuttons = create_shift_buttons (); gtk_table_attach (GTK_TABLE (top_table), shiftbuttons, 176, 177, 0, 1, GTK_FILL, GTK_SHRINK, 0, 0); gtk_widget_show (shiftbuttons); } edgebuttons = create_edge_buttons (); gtk_table_attach (GTK_TABLE (top_table), edgebuttons, 177, 178, 0, 1, GTK_FILL, GTK_SHRINK, 0, 0); gtk_widget_show (edgebuttons); dummy2=gtk_label_new(""); gtk_table_attach (GTK_TABLE (top_table), dummy2, 178, 215, 0, 1, GTK_FILL, GTK_SHRINK, 0, 0); gtk_widget_show (dummy2); entry = create_entry_box(); gtk_table_attach (GTK_TABLE (top_table), entry, 215, 216, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0); gtk_widget_show(entry); timebox = create_time_box(); gtk_table_attach (GTK_TABLE (top_table), timebox, 216, 284, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 20, 0); gtk_widget_show (timebox); if((GLOBALS->loaded_file_type != DUMPLESS_FILE)&&(!GLOBALS->disable_menus)) { GtkWidget *r_pixmap = gtk_pixmap_new(GLOBALS->redo_pixmap, GLOBALS->redo_mask); GtkWidget *main_vbox1; GtkWidget *table, *table2; GtkWidget *b1, *frame; GtkTooltips *tooltips; gtk_widget_show(r_pixmap); tooltips=gtk_tooltips_new_2(); gtk_tooltips_set_delay_2(tooltips,1500); table = gtk_table_new (1, 1, FALSE); main_vbox1 = gtk_vbox_new (FALSE, 1); gtk_container_border_width (GTK_CONTAINER (main_vbox1), 1); gtk_container_add (GTK_CONTAINER (table), main_vbox1); frame = gtk_frame_new ("Reload "); gtk_box_pack_start (GTK_BOX (main_vbox1), frame, TRUE, TRUE, 0); gtk_widget_show (frame); gtk_widget_show (main_vbox1); table2 = gtk_table_new (2, 1, FALSE); b1 = gtk_button_new(); gtk_container_add(GTK_CONTAINER(b1), r_pixmap); gtk_table_attach (GTK_TABLE (table2), b1, 0, 1, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); gtk_signal_connect_object (GTK_OBJECT (b1), "clicked", GTK_SIGNAL_FUNC(menu_reload_waveform_marshal), GTK_OBJECT (table2)); gtk_tooltips_set_tip_2(tooltips, b1, "Reload waveform", NULL); gtk_widget_show(b1); gtk_container_add (GTK_CONTAINER (frame), table2); gtk_widget_show(table2); gtk_table_attach (GTK_TABLE (top_table), table, 284, 285, 0, 1, 0, 0, 2, 0); gtk_widget_show (table); } } /* of ...if(mainwindow_already_built) */ } GLOBALS->wavewindow = create_wavewindow(); load_all_fonts(); /* must be done before create_signalwindow() */ gtk_widget_show(GLOBALS->wavewindow); GLOBALS->signalwindow = create_signalwindow(); if(GLOBALS->do_resize_signals) { int os; if(GLOBALS->initial_signal_window_width > GLOBALS->max_signal_name_pixel_width) { os=GLOBALS->initial_signal_window_width; } else { os=GLOBALS->max_signal_name_pixel_width; } os=(os<48)?48:os; gtk_widget_set_usize(GTK_WIDGET(GLOBALS->signalwindow), os+30, -1); } else { if(GLOBALS->initial_signal_window_width) { int os; os=GLOBALS->initial_signal_window_width; os=(os<48)?48:os; gtk_widget_set_usize(GTK_WIDGET(GLOBALS->signalwindow), os+30, -1); } } gtk_widget_show(GLOBALS->signalwindow); #if GTK_CHECK_VERSION(2,4,0) if((!GLOBALS->hide_sst)&&(GLOBALS->loaded_file_type != MISSING_FILE)) { GLOBALS->toppanedwindow = gtk_hpaned_new(); GLOBALS->sstpane = treeboxframe("SST", GTK_SIGNAL_FUNC(mkmenu_treesearch_cleanup)); GLOBALS->expanderwindow = gtk_expander_new_with_mnemonic("_SST"); gtk_expander_set_expanded(GTK_EXPANDER(GLOBALS->expanderwindow), (GLOBALS->sst_expanded==TRUE)); if(GLOBALS->toppanedwindow_size_cache) { gtk_paned_set_position(GTK_PANED(GLOBALS->toppanedwindow), GLOBALS->toppanedwindow_size_cache); GLOBALS->toppanedwindow_size_cache = 0; } gtk_container_add(GTK_CONTAINER(GLOBALS->expanderwindow), GLOBALS->sstpane); gtk_widget_show(GLOBALS->expanderwindow); } #endif GLOBALS->panedwindow = panedwindow = gtk_hpaned_new(); if(GLOBALS->panedwindow_size_cache) { gtk_paned_set_position(GTK_PANED(GLOBALS->panedwindow), GLOBALS->panedwindow_size_cache); GLOBALS->panedwindow_size_cache = 0; } #ifdef HAVE_PANED_PACK if(GLOBALS->paned_pack_semantics) { gtk_paned_pack1(GTK_PANED(panedwindow), GLOBALS->signalwindow, 0, 0); gtk_paned_pack2(GTK_PANED(panedwindow), GLOBALS->wavewindow, ~0, 0); } else #endif { gtk_paned_add1(GTK_PANED(panedwindow), GLOBALS->signalwindow); gtk_paned_add2(GTK_PANED(panedwindow), GLOBALS->wavewindow); } gtk_widget_show(panedwindow); if(GLOBALS->dnd_sigview) { dnd_setup(GLOBALS->dnd_sigview, GLOBALS->signalarea, 1); } else { dnd_setup(NULL, GLOBALS->signalarea, 1); } /* dnd_setup(GLOBALS->signalarea, GLOBALS->signalarea); */ dnd_setup(GLOBALS->signalarea, GLOBALS->wavearea, 1); #if GTK_CHECK_VERSION(2,4,0) if((!GLOBALS->hide_sst)&&(GLOBALS->loaded_file_type != MISSING_FILE)) { gtk_paned_pack1(GTK_PANED(GLOBALS->toppanedwindow), GLOBALS->expanderwindow, 0, 0); gtk_paned_pack2(GTK_PANED(GLOBALS->toppanedwindow), panedwindow, ~0, 0); gtk_widget_show(GLOBALS->toppanedwindow); } #endif #if WAVE_USE_GTK2 if(GLOBALS->treeopen_chain_head) { struct string_chain_t *t = GLOBALS->treeopen_chain_head; struct string_chain_t *t2; while(t) { if(GLOBALS->ctree_main) { force_open_tree_node(t->str, 0, NULL); } t2 = t->next; if(t->str) free_2(t->str); free_2(t); t = t2; } GLOBALS->treeopen_chain_head = GLOBALS->treeopen_chain_curr = NULL; } #endif if(!mainwindow_already_built) { gtk_widget_show(top_table); gtk_table_attach (GTK_TABLE (whole_table), GLOBALS->force_toolbars?toolhandle:top_table, 0, 16, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 0); if(!GLOBALS->do_resize_signals) { int dri; for(dri=0;dri<2;dri++) { GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } } if(!GLOBALS->notebook) { GLOBALS->num_notebook_pages = 1; GLOBALS->this_context_page = 0; GLOBALS->contexts = calloc(1, sizeof(struct Global **)); /* calloc is deliberate! */ /* scan-build */ *GLOBALS->contexts = calloc(1, sizeof(struct Global *)); /* calloc is deliberate! */ /* scan-build */ (*GLOBALS->contexts)[0] = GLOBALS; GLOBALS->dead_context = calloc(1, sizeof(struct Global **)); /* calloc is deliberate! */ /* scan-build */ *GLOBALS->dead_context = calloc(1, sizeof(struct Global *)); /* calloc is deliberate! */ /* scan-build */ *(GLOBALS->dead_context)[0] = NULL; GLOBALS->notebook = gtk_notebook_new(); gtk_notebook_set_tab_pos(GTK_NOTEBOOK(GLOBALS->notebook), GLOBALS->context_tabposition ? GTK_POS_LEFT : GTK_POS_TOP); gtk_widget_show(GLOBALS->notebook); gtk_notebook_set_show_tabs(GTK_NOTEBOOK(GLOBALS->notebook), 0); /* hide for first time until next tabs */ gtk_notebook_set_show_border(GTK_NOTEBOOK(GLOBALS->notebook), 0); /* hide for first time until next tabs */ gtk_signal_connect(GTK_OBJECT(GLOBALS->notebook), "switch-page", GTK_SIGNAL_FUNC(switch_page), NULL); } else { unsigned int ix; GLOBALS->this_context_page = GLOBALS->num_notebook_pages; GLOBALS->num_notebook_pages++; GLOBALS->num_notebook_pages_cumulative++; /* this never decreases, acts as an incrementing flipper id for side tabs */ *GLOBALS->contexts = realloc(*GLOBALS->contexts, GLOBALS->num_notebook_pages * sizeof(struct Global *)); /* realloc is deliberate! */ /* scan-build */ (*GLOBALS->contexts)[GLOBALS->this_context_page] = GLOBALS; for(ix=0;ixnum_notebook_pages;ix++) { (*GLOBALS->contexts)[ix]->num_notebook_pages = GLOBALS->num_notebook_pages; (*GLOBALS->contexts)[ix]->num_notebook_pages_cumulative = GLOBALS->num_notebook_pages_cumulative; (*GLOBALS->contexts)[ix]->dead_context = (*GLOBALS->contexts)[0]->dead_context; /* mirroring this is OK as page 0 always has value! */ } gtk_notebook_set_show_tabs(GTK_NOTEBOOK(GLOBALS->notebook), ~0); /* then appear */ gtk_notebook_set_show_border(GTK_NOTEBOOK(GLOBALS->notebook), ~0); /* then appear */ gtk_notebook_set_scrollable(GTK_NOTEBOOK(GLOBALS->notebook), ~0); } if(!GLOBALS->context_tabposition) { gtk_notebook_append_page(GTK_NOTEBOOK(GLOBALS->notebook), GLOBALS->toppanedwindow ? GLOBALS->toppanedwindow : panedwindow, gtk_label_new(GLOBALS->loaded_file_name)); } else { char buf[40]; sprintf(buf, "%d", GLOBALS->num_notebook_pages_cumulative); gtk_notebook_append_page(GTK_NOTEBOOK(GLOBALS->notebook), GLOBALS->toppanedwindow ? GLOBALS->toppanedwindow : panedwindow, gtk_label_new(buf)); } if(mainwindow_already_built) { gtk_notebook_set_current_page(GTK_NOTEBOOK(GLOBALS->notebook), GLOBALS->this_context_page); return(0); } gtk_table_attach (GTK_TABLE (whole_table), GLOBALS->notebook, 0, 16, 1, 256, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 0); gtk_widget_show(whole_table); gtk_container_add (GTK_CONTAINER (main_vbox), whole_table); if(GLOBALS->tims.marker != -1) { if(GLOBALS->tims.markertims.first) GLOBALS->tims.marker=GLOBALS->tims.first; } update_markertime(GLOBALS->tims.marker); set_window_xypos(GLOBALS->initial_window_xpos, GLOBALS->initial_window_ypos); GLOBALS->xy_ignore_main_c_1 = 1; if(GLOBALS->logfile) { struct logfile_chain *lprev; char buf[50]; int which = 1; while(GLOBALS->logfile) { sprintf(buf, "Logfile viewer [%d]", which++); logbox(buf, 480, GLOBALS->logfile->name); lprev = GLOBALS->logfile; GLOBALS->logfile = GLOBALS->logfile->next; free_2(lprev->name); free_2(lprev); } } activate_stems_reader(GLOBALS->stems_name); gtk_events_pending_gtk_main_iteration(); if(1) /* here in order to calculate window manager delta if present... window is completely rendered by here */ { int dummy_x, dummy_y; get_window_xypos(&dummy_x, &dummy_y); } init_busy(); if(scriptfile #if defined(HAVE_LIBTCL) && GLOBALS->interp #endif ) { execute_script(scriptfile, 1); /* deallocate the name in the script because context might swap out from under us! */ scriptfile=NULL; } #ifdef WAVE_HAVE_GCONF if(GLOBALS->loaded_file_type != MISSING_FILE) { if(!chdir_cache) { wave_gconf_client_set_string("/current/pwd", getenv("PWD")); } wave_gconf_client_set_string("/current/dumpfile", GLOBALS->optimize_vcd ? GLOBALS->unoptimized_vcd_file_name : GLOBALS->loaded_file_name); wave_gconf_client_set_string("/current/optimized_vcd", GLOBALS->optimize_vcd ? "1" : "0"); wave_gconf_client_set_string("/current/savefile", GLOBALS->filesel_writesave); } #endif #if !defined _MSC_VER if(GLOBALS->dual_attach_id_main_c_1) { fprintf(stderr, "GTKWAVE | Attaching %08X as dual head session %d\n", GLOBALS->dual_attach_id_main_c_1, GLOBALS->dual_id); #ifdef __MINGW32__ { HANDLE hMapFile; char mapName[257]; sprintf(mapName, "twinwave%d", GLOBALS->dual_attach_id_main_c_1); hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, mapName); if(hMapFile == NULL) { fprintf(stderr, "Could not attach shared memory map name '%s', exiting.\n", mapName); exit(255); } GLOBALS->dual_ctx = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 2 * sizeof(struct gtkwave_dual_ipc_t)); if(GLOBALS->dual_ctx == NULL) { fprintf(stderr, "Could not map view of file '%s', exiting.\n", mapName); exit(255); } } #else GLOBALS->dual_ctx = shmat(GLOBALS->dual_attach_id_main_c_1, NULL, 0); #endif if(GLOBALS->dual_ctx) { if(memcmp(GLOBALS->dual_ctx[GLOBALS->dual_id].matchword, DUAL_MATCHWORD, 4)) { fprintf(stderr, "Not a valid shared memory ID for dual head operation, exiting.\n"); exit(255); } GLOBALS->dual_ctx[GLOBALS->dual_id].viewer_is_initialized = 1; for(;;) { GtkAdjustment *hadj; TimeType pageinc, gt; #ifndef __MINGW32__ struct timeval tv; #endif if(GLOBALS->dual_ctx[1-GLOBALS->dual_id].use_new_times) { GLOBALS->dual_race_lock = 1; gt = GLOBALS->dual_ctx[GLOBALS->dual_id].left_margin_time = GLOBALS->dual_ctx[1-GLOBALS->dual_id].left_margin_time; GLOBALS->dual_ctx[GLOBALS->dual_id].marker = GLOBALS->dual_ctx[1-GLOBALS->dual_id].marker; GLOBALS->dual_ctx[GLOBALS->dual_id].baseline = GLOBALS->dual_ctx[1-GLOBALS->dual_id].baseline; GLOBALS->dual_ctx[GLOBALS->dual_id].zoom = GLOBALS->dual_ctx[1-GLOBALS->dual_id].zoom; GLOBALS->dual_ctx[1-GLOBALS->dual_id].use_new_times = 0; GLOBALS->dual_ctx[GLOBALS->dual_id].use_new_times = 0; if(GLOBALS->dual_ctx[GLOBALS->dual_id].baseline != GLOBALS->tims.baseline) { if((GLOBALS->tims.marker != -1) && (GLOBALS->dual_ctx[GLOBALS->dual_id].marker == -1)) { Trptr t; for(t=GLOBALS->traces.first;t;t=t->t_next) { if(t->asciivalue) { free_2(t->asciivalue); t->asciivalue=NULL; } } for(t=GLOBALS->traces.buffer;t;t=t->t_next) { if(t->asciivalue) { free_2(t->asciivalue); t->asciivalue=NULL; } } } GLOBALS->tims.marker = GLOBALS->dual_ctx[GLOBALS->dual_id].marker; GLOBALS->tims.baseline = GLOBALS->dual_ctx[GLOBALS->dual_id].baseline; update_basetime(GLOBALS->tims.baseline); update_markertime(GLOBALS->tims.marker); GLOBALS->signalwindow_width_dirty = 1; button_press_release_common(); } else if(GLOBALS->dual_ctx[GLOBALS->dual_id].marker != GLOBALS->tims.marker) { if((GLOBALS->tims.marker != -1) && (GLOBALS->dual_ctx[GLOBALS->dual_id].marker == -1)) { Trptr t; for(t=GLOBALS->traces.first;t;t=t->t_next) { if(t->asciivalue) { free_2(t->asciivalue); t->asciivalue=NULL; } } for(t=GLOBALS->traces.buffer;t;t=t->t_next) { if(t->asciivalue) { free_2(t->asciivalue); t->asciivalue=NULL; } } } GLOBALS->tims.marker = GLOBALS->dual_ctx[GLOBALS->dual_id].marker; update_markertime(GLOBALS->tims.marker); GLOBALS->signalwindow_width_dirty = 1; button_press_release_common(); } GLOBALS->tims.prevzoom=GLOBALS->tims.zoom; GLOBALS->tims.zoom=GLOBALS->dual_ctx[GLOBALS->dual_id].zoom; if(gttims.first) gt=GLOBALS->tims.first; else if(gt>GLOBALS->tims.last) gt=GLOBALS->tims.last; hadj=GTK_ADJUSTMENT(GLOBALS->wave_hslider); hadj->value=gt; pageinc=(TimeType)(((gdouble)GLOBALS->wavewidth)*GLOBALS->nspx); if(gt<(GLOBALS->tims.last-pageinc+1)) GLOBALS->tims.timecache=gt; else { GLOBALS->tims.timecache=GLOBALS->tims.last-pageinc+1; if(GLOBALS->tims.timecachetims.first) GLOBALS->tims.timecache=GLOBALS->tims.first; } time_update(); } if(is_interactive) { kick_partial_vcd(); } else { while (gtk_events_pending()) gtk_main_iteration(); } GLOBALS->dual_race_lock = 0; #ifdef __MINGW32__ Sleep(1000 / 25); #else tv.tv_sec = 0; tv.tv_usec = 1000000 / 25; select(0, NULL, NULL, NULL, &tv); #endif } } else { fprintf(stderr, "Could not attach to %08X, exiting.\n", GLOBALS->dual_attach_id_main_c_1); exit(255); } } else #endif if(is_interactive) { for(;;) { kick_partial_vcd(); } } else { #if defined(HAVE_LIBTCL) if(is_wish) { char* argv_mod[1]; set_globals_interp(argv[0], 1); addPidToExecutableName(1, argv, argv_mod); Tk_MainEx(1, argv_mod, gtkwaveInterpreterInit, GLOBALS->interp); /* note: for(kk=0;kkmainwindow), x, y); #else *x = GLOBALS->initial_window_x; *y = GLOBALS->initial_window_y; #endif } void set_window_size (int x, int y) { if(GLOBALS->block_xy_update) { return; } if (GLOBALS->mainwindow == NULL) { GLOBALS->initial_window_width = x; GLOBALS->initial_window_height = y; } else { #ifdef WAVE_USE_XID if(!GLOBALS->socket_xid) #endif { #ifdef MAC_INTEGRATION gtk_window_resize(GTK_WINDOW (GLOBALS->mainwindow), x, y); #else gtk_window_set_default_size(GTK_WINDOW (GLOBALS->mainwindow), x, y); #endif } } } void get_window_xypos(int *root_x, int *root_y) { if(!GLOBALS->mainwindow) return; #ifdef WAVE_USE_GTK2 gtk_window_get_position(GTK_WINDOW(GLOBALS->mainwindow), root_x, root_y); if(!GLOBALS->initial_window_get_valid) { if((GLOBALS->mainwindow->window)) { GLOBALS->initial_window_get_valid = 1; GLOBALS->initial_window_xpos_get = *root_x; GLOBALS->initial_window_ypos_get = *root_y; GLOBALS->xpos_delta = GLOBALS->initial_window_xpos_set - GLOBALS->initial_window_xpos_get; GLOBALS->ypos_delta = GLOBALS->initial_window_ypos_set - GLOBALS->initial_window_ypos_get; } } #else *root_x = *root_y = -1; #endif } void set_window_xypos(int root_x, int root_y) { #ifdef MAC_INTEGRATION if(GLOBALS->num_notebook_pages > 1) return; #else if(GLOBALS->xy_ignore_main_c_1) return; #endif #if !defined __MINGW32__ && !defined _MSC_VER GLOBALS->initial_window_xpos = root_x; GLOBALS->initial_window_ypos = root_y; if(!GLOBALS->mainwindow) return; if((GLOBALS->initial_window_xpos>=0)||(GLOBALS->initial_window_ypos>=0)) { if (GLOBALS->initial_window_xpos<0) { GLOBALS->initial_window_xpos = 0; } if (GLOBALS->initial_window_ypos<0) { GLOBALS->initial_window_ypos = 0; } #ifdef WAVE_USE_GTK2 gtk_window_move(GTK_WINDOW(GLOBALS->mainwindow), GLOBALS->initial_window_xpos, GLOBALS->initial_window_ypos); #else gtk_window_reposition(GTK_WINDOW(GLOBALS->mainwindow), GLOBALS->initial_window_xpos, GLOBALS->initial_window_ypos); #endif if(!GLOBALS->initial_window_set_valid) { GLOBALS->initial_window_set_valid = 1; GLOBALS->initial_window_xpos_set = GLOBALS->initial_window_xpos; GLOBALS->initial_window_ypos_set = GLOBALS->initial_window_ypos; } } #endif } /* * bring up stems browser */ #if !defined _MSC_VER int stems_are_active(void) { #ifdef __MINGW32__ if(GLOBALS->anno_ctx && GLOBALS->anno_ctx->browser_process) { /* nothing */ return(1); } #else if(GLOBALS->anno_ctx && GLOBALS->anno_ctx->browser_process) { int mystat =0; pid_t pid = waitpid(GLOBALS->anno_ctx->browser_process, &mystat, WNOHANG); if(!pid) { status_text("Stems reader already active.\n"); return(1); } else { shmdt((void *)GLOBALS->anno_ctx); GLOBALS->anno_ctx = NULL; } } #endif return(0); } #endif void activate_stems_reader(char *stems_name) { #if !defined _MSC_VER #ifdef __CYGWIN__ /* ajb : ok static as this is a one-time warning message... */ static int cyg_called = 0; #endif if(!stems_name) return; #ifdef __CYGWIN__ if(GLOBALS->stems_type != WAVE_ANNO_NONE) { if(!cyg_called) { char *cygserver_env = getenv("CYGWIN"); gboolean found = cygserver_env && (strstr(cygserver_env, "server") != NULL); if(!found) { fprintf(stderr, "GTKWAVE | =================================================================\n"); fprintf(stderr, "GTKWAVE | If the viewer crashes with a Bad system call error,\n"); fprintf(stderr, "GTKWAVE | make sure that Cygserver is enabled.\n"); fprintf(stderr, "GTKWAVE | The Cygserver services are used by Cygwin applications only\n"); fprintf(stderr, "GTKWAVE | if you set the environment variable CYGWIN to contain the\n"); fprintf(stderr, "GTKWAVE | string \"server\". You must do this before starting this program.\n"); fprintf(stderr, "GTKWAVE |\n"); fprintf(stderr, "GTKWAVE | If this still does not work, you may have to enable the cygserver\n"); fprintf(stderr, "GTKWAVE | by entering \"cygserver-config\" and answering \"yes\" followed by\n"); fprintf(stderr, "GTKWAVE | \"net start cygserver\".\n"); fprintf(stderr, "GTKWAVE | =================================================================\n"); } cyg_called = 1; } } #endif if(GLOBALS->stems_type != WAVE_ANNO_NONE) { #ifdef __MINGW32__ int shmid = getpid(); char mapName[257]; HANDLE hMapFile; STARTUPINFO si; PROCESS_INFORMATION pi; BOOL rc; memset(&si, 0, sizeof(STARTUPINFO)); memset(&pi, 0, sizeof(PROCESS_INFORMATION)); si.cb = sizeof(si); sprintf(mapName, "rtlbrowse%d", shmid); hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(struct gtkwave_annotate_ipc_t), mapName); if(hMapFile != NULL) { GLOBALS->anno_ctx = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(struct gtkwave_annotate_ipc_t)); if(GLOBALS->anno_ctx) { char mylist[257]; sprintf(mylist, "rtlbrowse.exe %08x", shmid); memset(GLOBALS->anno_ctx, 0, sizeof(struct gtkwave_annotate_ipc_t)); memcpy(GLOBALS->anno_ctx->matchword, WAVE_MATCHWORD, 4); GLOBALS->anno_ctx->aet_type = GLOBALS->stems_type; strcpy(GLOBALS->anno_ctx->aet_name, GLOBALS->aet_name); strcpy(GLOBALS->anno_ctx->stems_name, stems_name); update_markertime(GLOBALS->tims.marker); rc = CreateProcess( "rtlbrowse.exe", mylist, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); if(!rc) { UnmapViewOfFile(GLOBALS->anno_ctx); CloseHandle(hMapFile); GLOBALS->anno_ctx = NULL; GLOBALS->stems_type = WAVE_ANNO_NONE; } else { GLOBALS->anno_ctx->browser_process = pi.hProcess; } } else { CloseHandle(hMapFile); GLOBALS->stems_type = WAVE_ANNO_NONE; } } #else int shmid = shmget(0, sizeof(struct gtkwave_annotate_ipc_t), IPC_CREAT | 0600 ); if(shmid >=0) { struct shmid_ds ds; GLOBALS->anno_ctx = shmat(shmid, NULL, 0); if(GLOBALS->anno_ctx) { pid_t pid; memset(GLOBALS->anno_ctx, 0, sizeof(struct gtkwave_annotate_ipc_t)); memcpy(GLOBALS->anno_ctx->matchword, WAVE_MATCHWORD, 4); GLOBALS->anno_ctx->aet_type = GLOBALS->stems_type; strcpy(GLOBALS->anno_ctx->aet_name, GLOBALS->aet_name); strcpy(GLOBALS->anno_ctx->stems_name, stems_name); GLOBALS->anno_ctx->gtkwave_process = getpid(); update_markertime(GLOBALS->tims.marker); #ifdef __linux__ shmctl(shmid, IPC_RMID, &ds); /* mark for destroy */ #endif pid=fork(); if(((int)pid) < 0) { /* can't do anything about this */ } else { if(pid) /* parent==original server_pid */ { #ifndef __CYGWIN__ static int kill_installed = 0; if(!kill_installed) { kill_installed = 1; atexit(kill_stems_browser); } #endif GLOBALS->anno_ctx->browser_process = pid; #ifndef __linux__ sleep(2); shmctl(shmid, IPC_RMID, &ds); /* mark for destroy */ #endif } else { char buf[64]; #ifdef MAC_INTEGRATION const gchar *p = gtkosx_application_get_executable_path(); #endif sprintf(buf, "%08x", shmid); #ifdef MAC_INTEGRATION if(p && strstr(p, "Contents/")) { const char *xec = "../Resources/bin/rtlbrowse"; char *res = strdup_2(p); char *slsh = strrchr(res, '/'); if(slsh) { *(slsh+1) = 0; res = realloc_2(res, strlen(res) + strlen(xec) + 1); strcat(res, xec); execlp(res, "rtlbrowse", buf, NULL); fprintf(stderr, "GTKWAVE | Could not find '%s' in .app!\n", res); free_2(res); } } #endif execlp("rtlbrowse", "rtlbrowse", buf, NULL); fprintf(stderr, "GTKWAVE | Could not find rtlbrowse executable, exiting!\n"); exit(255); /* control never gets here if successful */ } } } else { shmctl(shmid, IPC_RMID, &ds); /* actually destroy */ GLOBALS->stems_type = WAVE_ANNO_NONE; } } #endif } else { fprintf(stderr, "GTKWAVE | Unsupported dumpfile type for rtlbrowse.\n"); } #endif } #if !defined _MSC_VER && !defined __MINGW32__ void optimize_vcd_file(void) { if(!strcmp("-vcd", GLOBALS->unoptimized_vcd_file_name)) { #ifdef __CYGWIN__ char *buf = strdup_2("vcd2fst -- - vcd.fst"); system(buf); free_2(buf); GLOBALS->loaded_file_name = strdup_2("vcd.fst"); GLOBALS->is_optimized_stdin_vcd = 1; #else pid_t pid; char *buf = malloc_2(strlen("vcd") + 4 + 1); sprintf(buf, "%s.fst", "vcd"); pid = fork(); if(((int)pid) < 0) { /* can't do anything about this */ } else { if(pid) { int mystat; int rc = waitpid(pid, &mystat, 0); if(rc > 0) { free_2(GLOBALS->loaded_file_name); GLOBALS->loaded_file_name = buf; GLOBALS->is_optimized_stdin_vcd = 1; } } else { execlp("vcd2fst", "vcd2fst", "--", "-", buf, NULL); exit(255); } } #endif } else { #ifdef __CYGWIN__ char *buf = malloc_2(9 + (strlen(GLOBALS->unoptimized_vcd_file_name) + 1) + (strlen(GLOBALS->unoptimized_vcd_file_name) + 4 + 1)); sprintf(buf, "vcd2fst %s %s.fst", GLOBALS->unoptimized_vcd_file_name, GLOBALS->unoptimized_vcd_file_name); system(buf); free_2(buf); buf = malloc_2(strlen(GLOBALS->unoptimized_vcd_file_name) + 4 + 1); sprintf(buf, "%s.fst", GLOBALS->unoptimized_vcd_file_name); GLOBALS->loaded_file_name = buf; #else pid_t pid; char *buf = malloc_2(strlen(GLOBALS->unoptimized_vcd_file_name) + 4 + 1); sprintf(buf, "%s.fst", GLOBALS->unoptimized_vcd_file_name); pid = fork(); if(((int)pid) < 0) { /* can't do anything about this */ } else { if(pid) { int mystat; int rc = waitpid(pid, &mystat, 0); if(rc > 0) { free_2(GLOBALS->loaded_file_name); GLOBALS->loaded_file_name = buf; } } else { #ifdef MAC_INTEGRATION const gchar *p = gtkosx_application_get_executable_path(); if(p && strstr(p, "Contents/")) { const char *xec = "../Resources/bin/vcd2fst"; char *res = strdup_2(p); char *slsh = strrchr(res, '/'); if(slsh) { *(slsh+1) = 0; res = realloc_2(res, strlen(res) + strlen(xec) + 1); strcat(res, xec); execlp(res, "vcd2fst", GLOBALS->unoptimized_vcd_file_name, buf, NULL); fprintf(stderr, "GTKWAVE | Could not find '%s' in .app!\n", res); free_2(res); } } #endif execlp("vcd2fst", "vcd2fst", GLOBALS->unoptimized_vcd_file_name, buf, NULL); fprintf(stderr, "GTKWAVE | Could not find vcd2fst executable, exiting!\n"); exit(255); } } #endif } } #endif gtkwave-3.3.86/src/tcl_callbacks.h0000664000175000017500000001503213166335473016326 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010. * * 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. */ #ifndef WAVE_TCLCB_H #define WAVE_TCLCB_H #include #ifdef HAVE_LIBTCL #include #include #include "debug.h" #define WAVE_TCL_LIST_ELEMENT (TCL_LIST_ELEMENT) #define WAVE_TCL_APPEND_VALUE (TCL_APPEND_VALUE) #define WAVE_TCL_GLOBAL_ONLY (TCL_GLOBAL_ONLY) #else #define WAVE_TCL_LIST_ELEMENT (0) #define WAVE_TCL_APPEND_VALUE (0) #define WAVE_TCL_GLOBAL_ONLY (0) #endif #define WAVE_TCLCB_FLAGS_NONE (WAVE_TCL_LIST_ELEMENT|WAVE_TCL_GLOBAL_ONLY) #define WAVE_TCLCB_FLAGS_APPEND (WAVE_TCL_LIST_ELEMENT|WAVE_TCL_GLOBAL_ONLY|WAVE_TCL_APPEND_VALUE) /* ################################################################ */ #define WAVE_TCLCB_ERROR "gtkwave::cbError" #define WAVE_TCLCB_ERROR_FLAGS WAVE_TCLCB_FLAGS_NONE #define WAVE_TCLCB_ERROR_INIT "" #define WAVE_TCLCB_TIMER_PERIOD "gtkwave::cbTimerPeriod" #define WAVE_TCLCB_TIMER_PERIOD_FLAGS WAVE_TCLCB_FLAGS_NONE #define WAVE_TCLCB_TIMER_PERIOD_INIT "250" #define WAVE_TCLCB_CURRENT_ACTIVE_TAB "gtkwave::cbCurrentActiveTab" #define WAVE_TCLCB_CURRENT_ACTIVE_TAB_FLAGS WAVE_TCLCB_FLAGS_NONE #define WAVE_TCLCB_CURRENT_ACTIVE_INIT "" #define WAVE_TCLCB_QUIT_PROGRAM "gtkwave::cbQuitProgram" #define WAVE_TCLCB_QUIT_PROGRAM_FLAGS WAVE_TCLCB_FLAGS_NONE #define WAVE_TCLCB_QUIT_PROGRAM_INIT "" #define WAVE_TCLCB_CLOSE_TAB_NUMBER "gtkwave::cbCloseTabNumber" #define WAVE_TCLCB_CLOSE_TAB_NUMBER_FLAGS WAVE_TCLCB_FLAGS_NONE #define WAVE_TCLCB_CLOSE_TAB_NUMBER_INIT "" #define WAVE_TCLCB_RELOAD_BEGIN "gtkwave::cbReloadBegin" #define WAVE_TCLCB_RELOAD_BEGIN_FLAGS WAVE_TCLCB_FLAGS_NONE #define WAVE_TCLCB_RELOAD_BEGIN_INIT "" #define WAVE_TCLCB_RELOAD_END "gtkwave::cbReloadEnd" #define WAVE_TCLCB_RELOAD_END_FLAGS WAVE_TCLCB_FLAGS_NONE #define WAVE_TCLCB_RELOAD_END_INIT "" #define WAVE_TCLCB_TREE_EXPAND "gtkwave::cbTreeExpand" #define WAVE_TCLCB_TREE_EXPAND_FLAGS WAVE_TCLCB_FLAGS_NONE #define WAVE_TCLCB_TREE_EXPAND_INIT "" #define WAVE_TCLCB_TREE_COLLAPSE "gtkwave::cbTreeCollapse" #define WAVE_TCLCB_TREE_COLLAPSE_FLAGS WAVE_TCLCB_FLAGS_NONE #define WAVE_TCLCB_TREE_COLLAPSE_INIT "" #define WAVE_TCLCB_TREE_SELECT "gtkwave::cbTreeSelect" #define WAVE_TCLCB_TREE_SELECT_FLAGS WAVE_TCLCB_FLAGS_NONE #define WAVE_TCLCB_TREE_SELECT_INIT "" #define WAVE_TCLCB_TREE_UNSELECT "gtkwave::cbTreeUnselect" #define WAVE_TCLCB_TREE_UNSELECT_FLAGS WAVE_TCLCB_FLAGS_NONE #define WAVE_TCLCB_TREE_UNSELECT_INIT "" #define WAVE_TCLCB_TREE_SIG_SELECT "gtkwave::cbTreeSigSelect" #define WAVE_TCLCB_TREE_SIG_SELECT_FLAGS WAVE_TCLCB_FLAGS_NONE #define WAVE_TCLCB_TREE_SIG_SELECT_INIT "" #define WAVE_TCLCB_TREE_SIG_UNSELECT "gtkwave::cbTreeSigUnselect" #define WAVE_TCLCB_TREE_SIG_UNSELECT_FLAGS WAVE_TCLCB_FLAGS_NONE #define WAVE_TCLCB_TREE_SIG_UNSELECT_INIT "" #define WAVE_TCLCB_TREE_SIG_DOUBLE_CLICK "gtkwave::cbTreeSigDoubleClick" #define WAVE_TCLCB_TREE_SIG_DOUBLE_CLICK_FLAGS WAVE_TCLCB_FLAGS_NONE #define WAVE_TCLCB_TREE_SIG_DOUBLE_CLICK_INIT "" #define WAVE_TCLCB_OPEN_TRACE_GROUP "gtkwave::cbOpenTraceGroup" #define WAVE_TCLCB_OPEN_TRACE_GROUP_FLAGS WAVE_TCLCB_FLAGS_NONE #define WAVE_TCLCB_OPEN_TRACE_GROUP_INIT "" #define WAVE_TCLCB_CLOSE_TRACE_GROUP "gtkwave::cbCloseTraceGroup" #define WAVE_TCLCB_CLOSE_TRACE_GROUP_FLAGS WAVE_TCLCB_FLAGS_NONE #define WAVE_TCLCB_CLOSE_TRACE_GROUP_INIT "" #define WAVE_TCLCB_TRACES_UPDATED "gtkwave::cbTracesUpdated" #define WAVE_TCLCB_TRACES_UPDATED_FLAGS WAVE_TCLCB_FLAGS_NONE #define WAVE_TCLCB_TRACES_UPDATED_INIT "" #define WAVE_TCLCB_FROM_ENTRY_UPDATED "gtkwave::cbFromEntryUpdated" #define WAVE_TCLCB_FROM_ENTRY_UPDATED_FLAGS WAVE_TCLCB_FLAGS_NONE #define WAVE_TCLCB_FROM_ENTRY_UPDATED_INIT "" #define WAVE_TCLCB_TO_ENTRY_UPDATED "gtkwave::cbToEntryUpdated" #define WAVE_TCLCB_TO_ENTRY_UPDATED_FLAGS WAVE_TCLCB_FLAGS_NONE #define WAVE_TCLCB_TO_ENTRY_UPDATED_INIT "" #define WAVE_TCLCB_STATUS_TEXT "gtkwave::cbStatusText" #define WAVE_TCLCB_STATUS_TEXT_FLAGS WAVE_TCLCB_FLAGS_NONE #define WAVE_TCLCB_STATUS_TEXT_INIT "" /* ################################################################ */ #define WAVE_TCLCB_MACRO_EXPANSION \ WAVE_TCLCB_M(WAVE_TCLCB_ERROR, WAVE_TCLCB_ERROR_FLAGS, WAVE_TCLCB_ERROR_INIT),\ WAVE_TCLCB_M(WAVE_TCLCB_TIMER_PERIOD, WAVE_TCLCB_TIMER_PERIOD_FLAGS, WAVE_TCLCB_TIMER_PERIOD_INIT),\ WAVE_TCLCB_M(WAVE_TCLCB_CURRENT_ACTIVE_TAB, WAVE_TCLCB_CURRENT_ACTIVE_TAB_FLAGS, WAVE_TCLCB_CURRENT_ACTIVE_INIT),\ WAVE_TCLCB_M(WAVE_TCLCB_QUIT_PROGRAM, WAVE_TCLCB_QUIT_PROGRAM_FLAGS, WAVE_TCLCB_QUIT_PROGRAM_INIT),\ WAVE_TCLCB_M(WAVE_TCLCB_CLOSE_TAB_NUMBER, WAVE_TCLCB_CLOSE_TAB_NUMBER_FLAGS, WAVE_TCLCB_CLOSE_TAB_NUMBER_INIT),\ WAVE_TCLCB_M(WAVE_TCLCB_RELOAD_BEGIN, WAVE_TCLCB_RELOAD_BEGIN_FLAGS, WAVE_TCLCB_RELOAD_BEGIN_INIT),\ WAVE_TCLCB_M(WAVE_TCLCB_RELOAD_END, WAVE_TCLCB_RELOAD_END_FLAGS, WAVE_TCLCB_RELOAD_END_INIT),\ WAVE_TCLCB_M(WAVE_TCLCB_TREE_EXPAND, WAVE_TCLCB_TREE_EXPAND_FLAGS, WAVE_TCLCB_TREE_EXPAND_INIT),\ WAVE_TCLCB_M(WAVE_TCLCB_TREE_COLLAPSE, WAVE_TCLCB_TREE_COLLAPSE_FLAGS, WAVE_TCLCB_TREE_COLLAPSE_INIT),\ WAVE_TCLCB_M(WAVE_TCLCB_TREE_SELECT, WAVE_TCLCB_TREE_SELECT_FLAGS, WAVE_TCLCB_TREE_SELECT_INIT),\ WAVE_TCLCB_M(WAVE_TCLCB_TREE_UNSELECT, WAVE_TCLCB_TREE_UNSELECT_FLAGS, WAVE_TCLCB_TREE_UNSELECT_INIT),\ WAVE_TCLCB_M(WAVE_TCLCB_TREE_SIG_SELECT, WAVE_TCLCB_TREE_SIG_SELECT_FLAGS, WAVE_TCLCB_TREE_SIG_SELECT_INIT),\ WAVE_TCLCB_M(WAVE_TCLCB_TREE_SIG_UNSELECT, WAVE_TCLCB_TREE_SIG_UNSELECT_FLAGS, WAVE_TCLCB_TREE_SIG_UNSELECT_INIT),\ WAVE_TCLCB_M(WAVE_TCLCB_TREE_SIG_DOUBLE_CLICK, WAVE_TCLCB_TREE_SIG_DOUBLE_CLICK_FLAGS, WAVE_TCLCB_TREE_SIG_DOUBLE_CLICK_INIT),\ WAVE_TCLCB_M(WAVE_TCLCB_OPEN_TRACE_GROUP, WAVE_TCLCB_OPEN_TRACE_GROUP_FLAGS, WAVE_TCLCB_OPEN_TRACE_GROUP_INIT),\ WAVE_TCLCB_M(WAVE_TCLCB_CLOSE_TRACE_GROUP, WAVE_TCLCB_CLOSE_TRACE_GROUP_FLAGS, WAVE_TCLCB_CLOSE_TRACE_GROUP_INIT),\ WAVE_TCLCB_M(WAVE_TCLCB_TRACES_UPDATED, WAVE_TCLCB_TRACES_UPDATED_FLAGS, WAVE_TCLCB_TRACES_UPDATED_INIT),\ WAVE_TCLCB_M(WAVE_TCLCB_FROM_ENTRY_UPDATED, WAVE_TCLCB_FROM_ENTRY_UPDATED_FLAGS, WAVE_TCLCB_FROM_ENTRY_UPDATED_INIT),\ WAVE_TCLCB_M(WAVE_TCLCB_TO_ENTRY_UPDATED, WAVE_TCLCB_TO_ENTRY_UPDATED_FLAGS, WAVE_TCLCB_TO_ENTRY_UPDATED_INIT),\ WAVE_TCLCB_M(WAVE_TCLCB_STATUS_TEXT, WAVE_TCLCB_STATUS_TEXT_FLAGS, WAVE_TCLCB_STATUS_TEXT_INIT),\ WAVE_TCLCB_M("",-1,"") /* ################################################################ */ #endif gtkwave-3.3.86/src/globals.h0000664000175000017500000014172713166335473015203 0ustar bybellbybell/* * Copyright (c) Kermin Elliott Fleming 2007-2017. * * 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. */ #ifndef GLOBALS_H #define GLOBALS_H #include #include #if defined __MINGW32__ || defined _MSC_VER #include #include #endif #include "ae2.h" #include "analyzer.h" #include "bsearch.h" #include "busy.h" #include "clipping.h" #include "color.h" #include "currenttime.h" #include "debug.h" #include "fgetdynamic.h" #include "fonts.h" #include "fstapi.h" #include "gconf.h" #include "ghw.h" #include "globals.h" #include "gnu_regex.h" #include "gtk12compat.h" #include "lx2.h" #include "lxt.h" #include "main.h" #include "memory.h" #include "menu.h" #include "pipeio.h" #include "pixmaps.h" #include "print.h" #include "ptranslate.h" #include "ttranslate.h" #include "rc.h" #include "regex_wave.h" #include "savefile.h" #include "strace.h" #include "symbol.h" #include "tcl_helper.h" #include "translate.h" #include "tree.h" #include "vcd.h" #include "vcd_saver.h" #include "vlist.h" #include "vzt.h" #include "version.h" #include "wavealloca.h" #include "jrb.h" #include "extload.h" #ifdef _WAVE_HAVE_JUDY #include #endif struct Global{ /* * ae2.c */ #ifdef AET2_IS_PRESENT #ifdef AET2_ALIASDB_IS_PRESENT FILE *adb_alias_stream_file; ADB_DB adb; unsigned long adb_max_terms; ADB_TERM *adb_terms; ADB_TERM **adb_aliases; unsigned short *adb_num_terms; unsigned short *adb_idx_first; unsigned short *adb_idx_last; unsigned char *adb_alloc_pool_base; size_t adb_alloc_idx; #endif unsigned long ae2_num_facs; unsigned long ae2_num_aliases; unsigned long ae2_num_sections; struct lx2_entry **ae2_lx2_table; FILE *ae2_f; AE2_HANDLE *ae2; AE2_FACREF *ae2_fr; TimeType ae2_start_limit_cyc; TimeType ae2_end_limit_cyc; char *ae2_process_mask; #endif TimeType ae2_start_cyc; TimeType ae2_end_cyc; TimeType *ae2_time_xlate; char disable_ae2_alias; /* * analyzer.c */ unsigned int default_flags; /* from analyzer.c 5 */ unsigned int default_fpshift; Times tims; /* from analyzer.c 6 */ Traces traces; /* from analyzer.c 7 */ int hier_max_level; /* from analyzer.c 8 */ int hier_max_level_shadow; /* from analyzer.c */ TimeType timestart_from_savefile; char timestart_from_savefile_valid; int group_depth; char hier_ignore_escapes; /* * baseconvert.c */ char color_active_in_filter; /* from baseconvert.c 9 */ /* * bsearch.c */ TimeType shift_timebase; /* from bsearch.c 10 */ TimeType shift_timebase_default_for_add; /* from bsearch.c 11 */ TimeType max_compare_time_tc_bsearch_c_1; /* from bsearch.c 12 */ TimeType *max_compare_pos_tc_bsearch_c_1; /* from bsearch.c 13 */ TimeType max_compare_time_bsearch_c_1; /* from bsearch.c 14 */ struct HistEnt *max_compare_pos_bsearch_c_1; /* from bsearch.c 15 */ struct HistEnt **max_compare_index; /* from bsearch.c 16 */ TimeType vmax_compare_time_bsearch_c_1; /* from bsearch.c 17 */ struct VectorEnt *vmax_compare_pos_bsearch_c_1; /* from bsearch.c 18 */ struct VectorEnt **vmax_compare_index; /* from bsearch.c 19 */ int maxlen_trunc; /* from bsearch.c 20 */ char *maxlen_trunc_pos_bsearch_c_1; /* from bsearch.c 21 */ char *trunc_asciibase_bsearch_c_1; /* from bsearch.c 22 */ /* * busy.c */ GdkCursor *busycursor_busy_c_1; /* from busy.c 23 */ int busy_busy_c_1; /* from busy.c 24 */ /* * color.c */ char keep_xz_colors; struct wave_gcchain_t *wave_gcchain; int color_back; /* from color.c 25 */ int color_baseline; /* from color.c 26 */ int color_grid; /* from color.c 27 */ int color_grid2; /* from color.c */ int color_high; /* from color.c 28 */ int color_low; /* from color.c 29 */ int color_mark; /* from color.c 30 */ int color_mid; /* from color.c 31 */ int color_time; /* from color.c 32 */ int color_timeb; /* from color.c 33 */ int color_trans; /* from color.c 34 */ int color_umark; /* from color.c 35 */ int color_value; /* from color.c 36 */ int color_vbox; /* from color.c 37 */ int color_vtrans; /* from color.c 38 */ int color_x; /* from color.c 39 */ int color_xfill; /* from color.c 40 */ int color_0; /* from color.c 41 */ int color_1; /* from color.c 42 */ int color_ufill; /* from color.c 43 */ int color_u; /* from color.c 44 */ int color_wfill; /* from color.c 45 */ int color_w; /* from color.c 46 */ int color_dashfill; /* from color.c 47 */ int color_dash; /* from color.c 48 */ int color_white; /* from color.c 49 */ int color_black; /* from color.c 50 */ int color_ltgray; /* from color.c 51 */ int color_normal; /* from color.c 52 */ int color_mdgray; /* from color.c 53 */ int color_dkgray; /* from color.c 54 */ int color_dkblue; /* from color.c 55 */ int color_brkred; int color_ltblue; int color_gmstrd; int color_highfill; int color_1fill; /* * currenttime.c */ TimeType global_time_offset; char is_vcd; /* from currenttime.c 56 */ char partial_vcd; /* from currenttime.c 57 */ char use_maxtime_display; /* from currenttime.c 58 */ char use_frequency_delta; /* from currenttime.c 59 */ GtkWidget *max_or_marker_label_currenttime_c_1; /* from currenttime.c 60 */ GtkWidget *base_or_curtime_label_currenttime_c_1; /* from currenttime.c 61 */ TimeType cached_currenttimeval_currenttime_c_1; /* from currenttime.c 62 */ TimeType currenttime; /* from currenttime.c 63 */ TimeType max_time; /* from currenttime.c 64 */ TimeType min_time; /* from currenttime.c 65 */ char display_grid; /* from currenttime.c 66 */ TimeType time_scale; /* from currenttime.c 67 */ char time_dimension; /* from currenttime.c 68 */ char scale_to_time_dimension; /* from currenttime.c */ GtkWidget *maxtimewid_currenttime_c_1; /* from currenttime.c 70 */ GtkWidget *curtimewid_currenttime_c_1; /* from currenttime.c 71 */ char *maxtext_currenttime_c_1; /* from currenttime.c 72 */ char *curtext_currenttime_c_1; /* from currenttime.c 73 */ TimeType time_trunc_val_currenttime_c_1; /* from currenttime.c 77 */ char use_full_precision; /* from currenttime.c 78 */ /* * debug.c */ void **alloc2_chain; /* from debug.c */ int outstanding; /* from debug.c */ const char *atoi_cont_ptr; /* from debug.c 79 */ char disable_tooltips; /* from debug.c 80 */ /* * entry.c */ GtkWidget *window_entry_c_1; /* from entry.c 81 */ GtkWidget *entry_entry_c_1; /* from entry.c 82 */ char *entrybox_text; /* from entry.c 83 */ void (*cleanup_entry_c_1)(void); /* from entry.c 84 */ int entry_raise_timer; /* extload.c */ unsigned int extload_ffr_import_count; /* from extload.c */ void *extload_ffr_ctx; /* from extload.c */ FILE *extload; /* from extload.c */ unsigned int *extload_idcodes; /* from extload.c */ int *extload_inv_idcodes; /* from extload.c */ #if !defined __MINGW32__ && !defined _MSC_VER time_t extload_lastmod; /* from extload.c */ char extload_already_errored; /* from extload.c */ #endif char **extload_namecache; int *extload_namecache_max; int *extload_namecache_lens; int *extload_namecache_patched; struct symbol *extload_sym_block; struct Node *extload_node_block; void *extload_xc; struct symbol *extload_prevsymroot; struct symbol *extload_prevsym; struct tree **extload_npar; int extload_i; int extload_hlen; unsigned char extload_vt_prev; unsigned char extload_vd_prev; int f_name_build_buf_len; char *f_name_build_buf; unsigned int extload_max_tree; unsigned int extload_curr_tree; /* * fetchbuttons.c */ TimeType fetchwindow; /* from fetchbuttons.c 85 */ /* * fgetdynamic.c */ int fgetmalloc_len; /* from fgetdynamic.c 86 */ /* * file.c */ #if GTK_CHECK_VERSION(2,4,0) GtkWidget *pFileChoose; char *pFileChooseFilterName; GPatternSpec *pPatternSpec; #endif GtkWidget *fs_file_c_1; /* from file.c 87 */ char **fileselbox_text; /* from file.c 88 */ char filesel_ok; /* from file.c 89 */ void (*cleanup_file_c_2)(void); /* from file.c 90 */ void (*bad_cleanup_file_c_1)(void); /* from file.c 91 */ /* * fonts.c */ char *fontname_signals; /* from fonts.c 92 */ char *fontname_waves; /* from fonts.c 93 */ #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) && GTK_CHECK_VERSION(2,8,0) PangoRenderer *fonts_renderer; GdkGC *fonts_gc; GdkScreen *fonts_screen; PangoContext *fonts_context; PangoLayout *fonts_layout; #endif char use_pango_fonts; /* * fst.c */ void *fst_fst_c_1; const char *fst_scope_name; int fst_scope_name_len; TimeType first_cycle_fst_c_3; TimeType last_cycle_fst_c_3; TimeType total_cycles_fst_c_3; struct lx2_entry *fst_table_fst_c_1; struct fac *mvlfacs_fst_c_3; fstHandle *mvlfacs_fst_alias; fstHandle *mvlfacs_fst_rvs_alias; fstHandle fst_maxhandle; int busycnt_fst_c_2; double *double_curr_fst; double *double_fini_fst; char nonimplicit_direction_encountered; char supplemental_datatypes_encountered; char supplemental_vartypes_encountered; char is_vhdl_component_format; JRB subvar_jrb; unsigned int subvar_jrb_count; char **subvar_pnt; unsigned char fst_filetype; unsigned subvar_jrb_count_locked : 1; uint32_t stem_file_idx; uint32_t stem_line_number; char **stem_path_string_table; struct stem_struct_t *stem_struct_base; struct stem_struct_t *istem_struct_base; uint32_t stem_path_string_table_siz; uint32_t stem_path_string_table_alloc; uint32_t stem_struct_base_siz; uint32_t stem_struct_base_siz_alloc; uint32_t istem_struct_base_siz; uint32_t istem_struct_base_siz_alloc; unsigned stem_valid : 1; unsigned istem_valid : 1; char *fst_synclock_str; JRB synclock_jrb; /* * ghw.c */ struct Node **nxp_ghw_c_1; /* from ghw.c 95 */ int sym_which_ghw_c_1; /* from ghw.c 98 */ struct ghw_tree_node *gwt_ghw_c_1; /* from ghw.c 99 */ struct ghw_tree_node *gwt_corr_ghw_c_1; /* from ghw.c 100 */ int xlat_1164_ghw_c_1; /* from ghw.c 101 */ char is_ghw; /* from ghw.c 102 */ char *asbuf; /* from ghw.c 103 */ int nbr_sig_ref_ghw_c_1; /* from ghw.c 104 */ int num_glitches_ghw_c_1; /* from ghw.c 105 */ int num_glitch_regions_ghw_c_1; /* from ghw.c 106 */ char *fac_name_ghw_c_1; /* from ghw.c 108 */ int fac_name_len_ghw_c_1; /* from ghw.c 109 */ int fac_name_max_ghw_c_1; /* from ghw.c 110 */ int last_fac_ghw_c_1; /* from ghw.c 111 */ int warned_ghw_c_1; /* from ghw.c 112 */ /* * globals.c */ struct Global ***dead_context; /* for deallocating tabbed contexts later (when no race conditions exist) */ struct Global **gtk_context_bridge_ptr; /* from globals.c, migrates to reloaded contexts to link buttons to ctx */ /* * help.c */ int helpbox_is_active; /* from help.c 114 */ GtkWidget *text_help_c_1; /* from help.c 115 */ GtkWidget *vscrollbar_help_c_1; /* from help.c 116 */ #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) GtkTextIter iter_help_c_1; /* from help.c 117 */ GtkTextTag *bold_tag_help_c_1; /* from help.c 118 */ #endif GtkWidget *window_help_c_2; /* from help.c 119 */ /* * hierpack.c */ unsigned char *hp_buf; size_t *hp_offs; size_t hp_prev; size_t hp_buf_siz; unsigned char *fmem_buf; size_t fmem_buf_siz; size_t fmem_buf_offs; size_t fmem_uncompressed_siz; char disable_auto_comphier; /* * hiersearch.c */ char hier_grouping; /* from hiersearch.c 120 */ GtkWidget *window_hiersearch_c_3; /* from hiersearch.c 121 */ GtkWidget *entry_main_hiersearch_c_1; /* from hiersearch.c 122 */ GtkWidget *clist_hiersearch_c_1; /* from hiersearch.c 123 */ char bundle_direction_hiersearch_c_1; /* from hiersearch.c 124 */ void (*cleanup_hiersearch_c_3)(void); /* from hiersearch.c 125 */ int num_rows_hiersearch_c_1; /* from hiersearch.c 126 */ int selected_rows_hiersearch_c_1; /* from hiersearch.c 127 */ GtkWidget *window1_hiersearch_c_1; /* from hiersearch.c 128 */ GtkWidget *entry_hiersearch_c_2; /* from hiersearch.c 129 */ char *entrybox_text_local_hiersearch_c_1; /* from hiersearch.c 130 */ void (*cleanup_e_hiersearch_c_1)(void); /* from hiersearch.c 131 */ struct tree *h_selectedtree_hiersearch_c_1; /* from hiersearch.c 132 */ struct tree *current_tree_hiersearch_c_1; /* from hiersearch.c 133 */ struct treechain *treechain_hiersearch_c_1; /* from hiersearch.c 134 */ int is_active_hiersearch_c_1; /* from hiersearch.c 135 */ /* * logfile.c */ void **logfiles; char *fontname_logfile; /* from logfile.c 137 */ GdkFont *font_logfile_c_1; /* from logfile.c 138 */ #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) GtkTextIter iter_logfile_c_2; /* from logfile.c 139 */ GtkTextTag *bold_tag_logfile_c_2; /* from logfile.c 140 */ GtkTextTag *mono_tag_logfile_c_1; /* from logfile.c 141 */ GtkTextTag *size_tag_logfile_c_1; /* from logfile.c 142 */ #endif /* * lx2.c */ unsigned char is_lx2; /* from lx2.c 143 */ struct lxt2_rd_trace *lx2_lx2_c_1; /* from lx2.c 144 */ TimeType first_cycle_lx2_c_1; /* from lx2.c 145 */ TimeType last_cycle_lx2_c_1; /* from lx2.c 146 */ TimeType total_cycles_lx2_c_1; /* from lx2.c 147 */ struct lx2_entry *lx2_table_lx2_c_1; /* from lx2.c 148 */ struct fac *mvlfacs_lx2_c_1; /* from lx2.c 149 */ int busycnt_lx2_c_1; /* from lx2.c 150 */ /* * lxt.c */ char *mm_lxt_mmap_addr; size_t mm_lxt_mmap_len; #if defined __MINGW32__ || defined _MSC_VER HANDLE hIn, hInMap; char *win_fname; #endif int fpos_lxt_c_1; /* from lxt.c 151 */ char is_lxt; /* from lxt.c 152 */ char lxt_clock_compress_to_z; /* from lxt.c 153 */ void *mm_lxt_c_1; /* from lxt.c 154 */ void *mmcache_lxt_c_1; /* from lxt.c 155 */ int version_lxt_c_1; /* from lxt.c 156 */ struct fac *mvlfacs_lxt_c_2; /* from lxt.c 157 */ TimeType first_cycle_lxt_c_2; /* from lxt.c 158 */ TimeType last_cycle_lxt_c_2; /* from lxt.c 159 */ TimeType total_cycles_lxt_c_2; /* from lxt.c 160 */ int maxchange_lxt_c_1; /* from lxt.c 161 */ int maxindex_lxt_c_1; /* from lxt.c 162 */ int f_len_lxt_c_1; /* from lxt.c 163 */ int *positional_information_lxt_c_1; /* from lxt.c 164 */ TimeType *time_information; /* from lxt.c 165 */ int change_field_offset_lxt_c_1; /* from lxt.c 166 */ int facname_offset_lxt_c_1; /* from lxt.c 167 */ int facgeometry_offset_lxt_c_1; /* from lxt.c 168 */ int time_table_offset_lxt_c_1; /* from lxt.c 169 */ int time_table_offset64_lxt_c_1; /* from lxt.c 170 */ int sync_table_offset_lxt_c_1; /* from lxt.c 171 */ int initial_value_offset_lxt_c_1; /* from lxt.c 172 */ int timescale_offset_lxt_c_1; /* from lxt.c 173 */ int double_test_offset_lxt_c_1; /* from lxt.c 174 */ int zdictionary_offset_lxt_c_1; /* from lxt.c 175 */ unsigned int zfacname_predec_size_lxt_c_1; /* from lxt.c 176 */ unsigned int zfacname_size_lxt_c_1; /* from lxt.c 177 */ unsigned int zfacgeometry_size_lxt_c_1; /* from lxt.c 178 */ unsigned int zsync_table_size_lxt_c_1; /* from lxt.c 179 */ unsigned int ztime_table_size_lxt_c_1; /* from lxt.c 180 */ unsigned int zchg_predec_size_lxt_c_1; /* from lxt.c 181 */ unsigned int zchg_size_lxt_c_1; /* from lxt.c 182 */ unsigned int zdictionary_predec_size_lxt_c_1; /* from lxt.c 183 */ unsigned char initial_value_lxt_c_1; /* from lxt.c 184 */ unsigned int dict_num_entries_lxt_c_1; /* from lxt.c 185 */ unsigned int dict_string_mem_required_lxt_c_1; /* from lxt.c 186 */ int dict_16_offset_lxt_c_1; /* from lxt.c 187 */ int dict_24_offset_lxt_c_1; /* from lxt.c 188 */ int dict_32_offset_lxt_c_1; /* from lxt.c 189 */ unsigned int dict_width_lxt_c_1; /* from lxt.c 190 */ char **dict_string_mem_array_lxt_c_1; /* from lxt.c 191 */ int exclude_offset_lxt_c_1; /* from lxt.c 192 */ int lxt_timezero_offset; char *lt_buf_lxt_c_1; /* from lxt.c 193 */ int lt_len_lxt_c_1; /* from lxt.c 194 */ int fd_lxt_c_1; /* from lxt.c 195 */ unsigned char double_mask_lxt_c_1[8]; /* from lxt.c 196 */ char double_is_native_lxt_c_1; /* from lxt.c 197 */ int max_compare_time_tc_lxt_c_2; /* from lxt.c 199 */ int max_compare_pos_tc_lxt_c_2; /* from lxt.c 200 */ struct Node **resolve_lxt_alias_to; unsigned int *lastchange; /* * main.c */ char is_gtkw_save_file; gboolean dumpfile_is_modified; GtkWidget *missing_file_toolbar; char *argvlist; #ifdef HAVE_LIBTCL Tcl_Interp *interp; #endif char *repscript_name; unsigned int repscript_period; char *tcl_init_cmd; char tcl_running; char block_xy_update; char *winname; unsigned int num_notebook_pages; unsigned int num_notebook_pages_cumulative; unsigned char context_tabposition; unsigned int this_context_page; unsigned char second_page_created; struct Global ***contexts; GtkWidget *notebook; char *loaded_file_name; char *unoptimized_vcd_file_name; char *skip_start; char *skip_end; enum FileType loaded_file_type; char is_optimized_stdin_vcd; char *whoami; /* from main.c 201 */ struct logfile_chain *logfile; /* from main.c 202 */ char *stems_name; /* from main.c 203 */ int stems_type; /* from main.c 204 */ char *aet_name; /* from main.c 205 */ struct gtkwave_annotate_ipc_t *anno_ctx; /* from main.c 206 */ struct gtkwave_dual_ipc_t *dual_ctx; /* from main.c 207 */ int dual_id; /* from main.c 208 */ unsigned int dual_attach_id_main_c_1; /* from main.c 209 */ int dual_race_lock; /* from main.c 210 */ GtkWidget *mainwindow; /* from main.c 211 */ GtkWidget *signalwindow; /* from main.c 212 */ GtkWidget *wavewindow; /* from main.c 213 */ GtkWidget *toppanedwindow; /* from main.c 214 */ GtkWidget *panedwindow; gint toppanedwindow_size_cache; gint panedwindow_size_cache; gint vpanedwindow_size_cache; GtkWidget *sstpane; /* from main.c 215 */ GtkWidget *expanderwindow; /* from main.c 216 */ char disable_window_manager; /* from main.c 217 */ char disable_empty_gui; /* from main.c */ char paned_pack_semantics; /* from main.c 218 */ char zoom_was_explicitly_set; /* from main.c 219 */ int initial_window_x; /* from main.c 220 */ int initial_window_y; /* from main.c 221 */ int initial_window_width; /* from main.c 222 */ int initial_window_height; /* from main.c 223 */ int xy_ignore_main_c_1; /* from main.c 224 */ int optimize_vcd; /* from main.c 225 */ int num_cpus; /* from main.c 226 */ int initial_window_xpos; /* from main.c 227 */ int initial_window_ypos; /* from main.c 228 */ int initial_window_set_valid; /* from main.c 229 */ int initial_window_xpos_set; /* from main.c 230 */ int initial_window_ypos_set; /* from main.c 231 */ int initial_window_get_valid; /* from main.c 232 */ int initial_window_xpos_get; /* from main.c 233 */ int initial_window_ypos_get; /* from main.c 234 */ int xpos_delta; /* from main.c 235 */ int ypos_delta; /* from main.c 236 */ char use_scrollbar_only; /* from main.c 237 */ char force_toolbars; /* from main.c 238 */ int hide_sst; /* from main.c 239 */ int sst_expanded; /* from main.c 240 */ #ifdef WAVE_USE_GTK2 GdkNativeWindow socket_xid; /* from main.c 241 */ #endif int disable_menus; /* from main.c 242 */ char *ftext_main_main_c_1; /* from main.c 243 */ char use_toolbutton_interface; /* from main.c */ /* * markerbox.c */ GtkWidget *window_markerbox_c_4; /* from markerbox.c 248 */ GtkWidget *entries_markerbox_c_1[WAVE_NUM_NAMED_MARKERS]; /* from markerbox.c 249 */ void (*cleanup_markerbox_c_4)(void); /* from markerbox.c 250 */ int dirty_markerbox_c_1; /* from markerbox.c 251 */ TimeType shadow_markers_markerbox_c_1[WAVE_NUM_NAMED_MARKERS]; /* from markerbox.c 252 */ char *marker_names[WAVE_NUM_NAMED_MARKERS]; /* from markerbox.c */ char *shadow_marker_names[WAVE_NUM_NAMED_MARKERS]; /* from markerbox.c */ /* * menu.c */ char *cutcopylist; /* from menu.c */ char enable_fast_exit; /* from menu.c 253 */ char quiet_checkmenu; struct wave_script_args *wave_script_args; /* from tcl_helper.c */ char ignore_savefile_pane_pos; char ignore_savefile_pos; /* from menu.c 255 */ char ignore_savefile_size; /* from menu.c 256 */ #ifndef WAVE_USE_MLIST_T GtkItemFactory *item_factory_menu_c_1; /* from menu.c 258 */ #endif char *regexp_string_menu_c_1; /* from menu.c 259 */ struct TraceEnt *trace_to_alias_menu_c_1; /* from menu.c 260 */ struct TraceEnt *showchangeall_menu_c_1; /* from menu.c 261 */ char *filesel_newviewer_menu_c_1; /* from menu.c 262 */ char *filesel_logfile_menu_c_1; /* from menu.c 263 */ char *filesel_scriptfile_menu; /* from menu.c */ char *filesel_writesave; /* from menu.c 264 */ char *filesel_imagegrab; /* from menu.c */ char save_success_menu_c_1; /* from menu.c 265 */ char *filesel_vcd_writesave; /* from menu.c 266 */ char *filesel_lxt_writesave; /* from menu.c 267 */ char *filesel_tim_writesave; /* from menu.c */ int lock_menu_c_1; /* from menu.c 268 */ int lock_menu_c_2; /* from menu.c 269 */ char *buf_menu_c_1; /* from menu.c 270 */ GtkWidget *signal_popup_menu; /* from menu.c */ GtkWidget *sst_signal_popup_menu; /* from menu.c */ /* * mouseover.c */ char disable_mouseover; /* from mouseover.c 271 */ char clipboard_mouseover; /* from mouseover.c */ GtkWidget *mouseover_mouseover_c_1; /* from mouseover.c 272 */ GtkWidget *mo_area_mouseover_c_1; /* from mouseover.c 273 */ GdkDrawable *mo_pixmap_mouseover_c_1; /* from mouseover.c 274 */ GdkGC *mo_dk_gray_mouseover_c_1; /* from mouseover.c 275 */ GdkGC *mo_black_mouseover_c_1; /* from mouseover.c 276 */ int mo_width_mouseover_c_1; /* from mouseover.c 277 */ int mo_height_mouseover_c_1; /* from mouseover.c 278 */ /* * pagebuttons.c */ double page_divisor; /* from pagebuttons.c 279 */ /* * pixmaps.c */ GdkDrawable *redo_pixmap; /* from pixmaps.c */ GdkDrawable *redo_mask; /* from pixmaps.c */ GdkDrawable *larrow_pixmap; /* from pixmaps.c 281 */ GdkDrawable *larrow_mask; /* from pixmaps.c 282 */ GdkDrawable *rarrow_pixmap; /* from pixmaps.c 284 */ GdkDrawable *rarrow_mask; /* from pixmaps.c 285 */ GdkDrawable *zoomin_pixmap; /* from pixmaps.c 287 */ GdkDrawable *zoomin_mask; /* from pixmaps.c 288 */ GdkDrawable *zoomout_pixmap; /* from pixmaps.c 290 */ GdkDrawable *zoomout_mask; /* from pixmaps.c 291 */ GdkDrawable *zoomfit_pixmap; /* from pixmaps.c 293 */ GdkDrawable *zoomfit_mask; /* from pixmaps.c 294 */ GdkDrawable *zoomundo_pixmap; /* from pixmaps.c 296 */ GdkDrawable *zoomundo_mask; /* from pixmaps.c 297 */ GdkDrawable *zoom_larrow_pixmap; /* from pixmaps.c 299 */ GdkDrawable *zoom_larrow_mask; /* from pixmaps.c 300 */ GdkDrawable *zoom_rarrow_pixmap; /* from pixmaps.c 302 */ GdkDrawable *zoom_rarrow_mask; /* from pixmaps.c 303 */ GdkDrawable *prev_page_pixmap; /* from pixmaps.c 305 */ GdkDrawable *prev_page_mask; /* from pixmaps.c 306 */ GdkDrawable *next_page_pixmap; /* from pixmaps.c 308 */ GdkDrawable *next_page_mask; /* from pixmaps.c 309 */ GdkDrawable *wave_info_pixmap; /* from pixmaps.c 311 */ GdkDrawable *wave_info_mask; /* from pixmaps.c 312 */ GdkDrawable *wave_alert_pixmap; /* from pixmaps.c 314 */ GdkDrawable *wave_alert_mask; /* from pixmaps.c 315 */ GdkDrawable *hiericon_module_pixmap; /* from pixmaps.c */ GdkDrawable *hiericon_module_mask; /* from pixmaps.c */ GdkDrawable *hiericon_task_pixmap; /* from pixmaps.c */ GdkDrawable *hiericon_task_mask; /* from pixmaps.c */ GdkDrawable *hiericon_function_pixmap; /* from pixmaps.c */ GdkDrawable *hiericon_function_mask; /* from pixmaps.c */ GdkDrawable *hiericon_begin_pixmap; /* from pixmaps.c */ GdkDrawable *hiericon_begin_mask; /* from pixmaps.c */ GdkDrawable *hiericon_fork_pixmap; /* from pixmaps.c */ GdkDrawable *hiericon_fork_mask; /* from pixmaps.c */ GdkDrawable *hiericon_interface_pixmap; GdkDrawable *hiericon_interface_mask; GdkDrawable *hiericon_svpackage_pixmap; GdkDrawable *hiericon_svpackage_mask; GdkDrawable *hiericon_program_pixmap; GdkDrawable *hiericon_program_mask; GdkDrawable *hiericon_class_pixmap; GdkDrawable *hiericon_class_mask; GdkDrawable *hiericon_record_pixmap; GdkDrawable *hiericon_record_mask; GdkDrawable *hiericon_generate_pixmap; GdkDrawable *hiericon_generate_mask; GdkDrawable *hiericon_design_pixmap; GdkDrawable *hiericon_design_mask; GdkDrawable *hiericon_block_pixmap; GdkDrawable *hiericon_block_mask; GdkDrawable *hiericon_generateif_pixmap; GdkDrawable *hiericon_generateif_mask; GdkDrawable *hiericon_generatefor_pixmap; GdkDrawable *hiericon_generatefor_mask; GdkDrawable *hiericon_instance_pixmap; GdkDrawable *hiericon_instance_mask; GdkDrawable *hiericon_package_pixmap; GdkDrawable *hiericon_package_mask; GdkDrawable *hiericon_signal_pixmap; GdkDrawable *hiericon_signal_mask; GdkDrawable *hiericon_portin_pixmap; GdkDrawable *hiericon_portin_mask; GdkDrawable *hiericon_portout_pixmap; GdkDrawable *hiericon_portout_mask; GdkDrawable *hiericon_portinout_pixmap; GdkDrawable *hiericon_portinout_mask; GdkDrawable *hiericon_buffer_pixmap; GdkDrawable *hiericon_buffer_mask; GdkDrawable *hiericon_linkage_pixmap; GdkDrawable *hiericon_linkage_mask; /* * print.c */ int inch_print_c_1; /* from print.c 316 */ double ps_chwidth_print_c_1; /* from print.c 317 */ double ybound_print_c_1; /* from print.c 318 */ int pr_signal_fill_width_print_c_1; /* from print.c 319 */ int ps_nummaxchars_print_c_1; /* from print.c 320 */ char ps_fullpage; /* from print.c 321 */ int ps_maxveclen; /* from print.c 322 */ int liney_max; /* from print.c 323 */ /* * ptranslate.c */ int current_translate_proc; /* from ptranslate.c 326 */ int current_filter_ptranslate_c_1; /* from ptranslate.c 327 */ int num_proc_filters; /* from ptranslate.c 328 */ char **procsel_filter; /* from ptranslate.c 329 */ struct pipe_ctx **proc_filter; /* from ptranslate.c 330 */ int is_active_ptranslate_c_2; /* from ptranslate.c 331 */ char *fcurr_ptranslate_c_1; /* from ptranslate.c 332 */ GtkWidget *window_ptranslate_c_5; /* from ptranslate.c 333 */ GtkWidget *clist_ptranslate_c_2; /* from ptranslate.c 334 */ /* * rc.c */ int rc_line_no; /* from rc.c 336 */ int possibly_use_rc_defaults; /* from rc.c 337 */ char *editor_name; /* from rc.c */ /* * regex.c */ struct re_pattern_buffer *preg_regex_c_1; /* from regex.c 339 */ int *regex_ok_regex_c_1; /* from regex.c 340 */ /* * renderopt.c */ #ifdef WAVE_GTK_UNIX_PRINT GtkPrintSettings *gprs; GtkPageSetup *gps; char *gp_tfn; #endif char is_active_renderopt_c_3; /* from renderopt.c 341 */ GtkWidget *window_renderopt_c_6; /* from renderopt.c 342 */ char *filesel_print_pdf_renderopt_c_1; /* from renderopt.c */ char *filesel_print_ps_renderopt_c_1; /* from renderopt.c 343 */ char *filesel_print_mif_renderopt_c_1; /* from renderopt.c 344 */ char target_mutex_renderopt_c_1[4]; /* from renderopt.c 346 */ char page_mutex_renderopt_c_1[5]; /* from renderopt.c 348 */ char render_mutex_renderopt_c_1[3]; /* from renderopt.c 350 */ int page_size_type_renderopt_c_1; /* from renderopt.c 351 */ /* * savefile.c */ char *sfn; char *lcname; /* * search.c */ GtkWidget *menuitem_search[5]; /* from search.c */ GtkWidget *window1_search_c_2; /* from search.c 359 */ GtkWidget *entry_a_search_c_1; /* from search.c 360 */ char *entrybox_text_local_search_c_2; /* from search.c 361 */ void (*cleanup_e_search_c_2)(void); /* from search.c 362 */ SearchProgressData *pdata; /* from search.c 363 */ int is_active_search_c_4; /* from search.c 364 */ char is_insert_running_search_c_1; /* from search.c 365 */ char is_replace_running_search_c_1; /* from search.c 366 */ char is_append_running_search_c_1; /* from search.c 367 */ char is_searching_running_search_c_1; /* from search.c 368 */ char regex_mutex_search_c_1[5]; /* from search.c 371 */ int regex_which_search_c_1; /* from search.c 372 */ GtkWidget *window_search_c_7; /* from search.c 373 */ GtkWidget *entry_search_c_3; /* from search.c 374 */ GtkWidget *clist_search_c_3; /* from search.c 375 */ char *searchbox_text_search_c_1; /* from search.c 377 */ char bundle_direction_search_c_2; /* from search.c 378 */ void (*cleanup_search_c_5)(void); /* from search.c 379 */ int num_rows_search_c_2; /* from search.c 380 */ int selected_rows_search_c_2; /* from search.c 381 */ /* * showchange.c */ GtkWidget *button1_showchange_c_1; /* from showchange.c 382 */ GtkWidget *button2_showchange_c_1; /* from showchange.c 383 */ GtkWidget *button3_showchange_c_1; /* from showchange.c 384 */ GtkWidget *button4_showchange_c_1; /* from showchange.c 385 */ GtkWidget *button5_showchange_c_1; /* from showchange.c 386 */ GtkWidget *button6_showchange_c_1; /* from showchange.c 387 */ GtkWidget *toggle1_showchange_c_1; /* from showchange.c 388 */ GtkWidget *toggle2_showchange_c_1; /* from showchange.c 389 */ GtkWidget *toggle3_showchange_c_1; /* from showchange.c 390 */ GtkWidget *toggle4_showchange_c_1; /* from showchange.c 391 */ GtkWidget *window_showchange_c_8; /* from showchange.c 392 */ void (*cleanup_showchange_c_6)(void); /* from showchange.c 393 */ struct TraceEnt *tcache_showchange_c_1; /* from showchange.c 394 */ unsigned int flags_showchange_c_1; /* from showchange.c 395 */ /* * signalwindow.c */ GtkWidget *signalarea; /* from signalwindow.c 396 */ struct font_engine_font_t *signalfont; /* from signalwindow.c 397 */ GdkDrawable *signalpixmap; /* from signalwindow.c 398 */ #ifdef WAVE_ALLOW_QUARTZ_FLUSH_WORKAROUND char force_hide_show; #endif int max_signal_name_pixel_width; /* from signalwindow.c 399 */ int signal_pixmap_width; /* from signalwindow.c 400 */ int signal_fill_width; /* from signalwindow.c 401 */ int old_signal_fill_width; /* from signalwindow.c 402 */ int old_signal_fill_height; /* from signalwindow.c 403 */ int right_align_active; /* from signalwindow.c */ int fontheight; /* from signalwindow.c 404 */ char dnd_state; /* from signalwindow.c 405 */ unsigned int dnd_cursor_timer; /* from signalwindow.c */ GtkWidget *hscroll_signalwindow_c_1; /* from signalwindow.c 406 */ GtkObject *signal_hslider; /* from signalwindow.c 407 */ unsigned int cachedhiflag_signalwindow_c_1; /* from signalwindow.c 408 */ int cachedwhich_signalwindow_c_1; /* from signalwindow.c 409 */ struct TraceEnt *cachedtrace; /* from signalwindow.c 410 */ struct TraceEnt *shift_click_trace; /* from signalwindow.c 411 */ int trtarget_signalwindow_c_1; /* from signalwindow.c 412 */ Trptr starting_unshifted_trace; /* from signalwindow.c */ unsigned char standard_trace_dnd_degate; /* from signalwindow.c */ unsigned char use_standard_trace_select; /* from signalwindow.c */ unsigned char use_standard_clicking; /* from signalwindow.c */ unsigned char std_collapse_pressed; /* from signalwindow.c */ unsigned char std_dnd_tgt_on_signalarea; /* from signalwindow.c */ unsigned char std_dnd_tgt_on_wavearea; /* from signalwindow.c */ unsigned char signalarea_has_focus; /* from signalwindow.c */ GtkWidget *signalarea_event_box; /* from signalwindow.c */ gint keypress_handler_id; /* from signalwindow.c */ gint cached_mouseover_x; /* from signalwindow.c */ gint cached_mouseover_y; /* from signalwindow.c */ gint mouseover_counter; /* from signalwindow.c */ unsigned button2_debounce_flag : 1; int dragzoom_threshold; /* * simplereq.c */ GtkWidget *window_simplereq_c_9; /* from simplereq.c 413 */ void (*cleanup)(GtkWidget *, void *); /* from simplereq.c 414 */ /* * splash.c */ char splash_is_loading; char splash_fix_win_title; char splash_disable; /* from splash.c 415 */ GdkDrawable *wave_splash_pixmap; /* from splash.c 417 */ GdkDrawable *wave_splash_mask; /* from splash.c 418 */ GtkWidget *splash_splash_c_1; /* from splash.c 419 */ GtkWidget *darea_splash_c_1; /* from splash.c 420 */ GTimer *gt_splash_c_1; /* from splash.c 421 */ int timeout_tag; /* from splash.c 422 */ int load_complete_splash_c_1; /* from splash.c 423 */ int cnt_splash_c_1; /* from splash.c 424 */ int prev_bar_x_splash_c_1; /* from splash.c 425 */ /* * status.c */ GtkWidget *text_status_c_2; /* from status.c 426 */ GtkWidget *vscrollbar_status_c_2; /* from status.c 427 */ #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) GtkTextIter iter_status_c_3; /* from status.c 428 */ GtkTextTag *bold_tag_status_c_3; /* from status.c 429 */ #endif /* * strace.c */ struct strace_ctx_t *strace_ctx; /* moved to strace.h */ struct strace_ctx_t strace_windows[WAVE_NUM_STRACE_WINDOWS]; int strace_current_window; int strace_repeat_count; /* * symbol.c */ #ifdef _WAVE_HAVE_JUDY Pvoid_t sym_judy; /* from symbol.c */ Pvoid_t s_selected; /* from symbol.c */ #endif struct symbol **sym_hash; /* from symbol.c 453 */ struct symbol **facs; /* from symbol.c 454 */ char facs_are_sorted; /* from symbol.c 455 */ char facs_have_symbols_state_machine; /* from symbol.c */ int numfacs; /* from symbol.c 456 */ int regions; /* from symbol.c 457 */ int longestname; /* from symbol.c 458 */ struct symchain *firstnode; /* from symbol.c 459 */ struct symchain *curnode; /* from symbol.c 460 */ int hashcache; /* from symbol.c 461 */ /* * tcl_commands.c */ char *previous_braced_tcl_string; /* * tcl_helper.c */ char in_tcl_callback; /* * timeentry.c */ GtkWidget *from_entry; /* from timeentry.c 462 */ GtkWidget *to_entry; /* from timeentry.c 463 */ /* * translate.c */ int current_translate_file; /* from translate.c 464 */ int current_filter_translate_c_2; /* from translate.c 465 */ int num_file_filters; /* from translate.c 466 */ char **filesel_filter; /* from translate.c 467 */ struct xl_tree_node **xl_file_filter; /* from translate.c 468 */ int is_active_translate_c_5; /* from translate.c 469 */ char *fcurr_translate_c_2; /* from translate.c 470 */ GtkWidget *window_translate_c_11; /* from translate.c 471 */ GtkWidget *clist_translate_c_4; /* from translate.c 472 */ /* * tree.c */ #ifdef _WAVE_HAVE_JUDY Pvoid_t sym_tree; Pvoid_t sym_tree_addresses; #endif struct tree *treeroot; /* from tree.c 473 */ struct tree *mod_tree_parent; /* from tree.c */ char *module_tree_c_1; /* from tree.c 474 */ int module_len_tree_c_1; /* from tree.c 475 */ struct tree *terminals_tchain_tree_c_1; /* from tree.c 476 */ char hier_delimeter; /* from tree.c 477 */ char hier_was_explicitly_set; /* from tree.c 478 */ char alt_hier_delimeter; /* from tree.c 479 */ int fast_tree_sort; /* from tree.c 480 */ struct symbol **facs2_tree_c_1; /* from tree.c 481 */ int facs2_pos_tree_c_1; /* from tree.c 482 */ unsigned char *talloc_pool_base; size_t talloc_idx; /* * tree_component.c */ #ifdef _WAVE_HAVE_JUDY Pvoid_t comp_name_judy; #else JRB comp_name_jrb; #endif char **comp_name_idx; int comp_name_serial; size_t comp_name_total_stringmem; int comp_name_longest; /* * treesearch_gtk1.c */ GtkWidget *window1_treesearch_gtk1_c; /* manual adds by ajb... */ GtkWidget *entry_a_treesearch_gtk1_c; char *entrybox_text_local_treesearch_gtk1_c; void (*cleanup_e_treesearch_gtk1_c)(void); struct tree *selectedtree_treesearch_gtk1_c; int is_active_treesearch_gtk1_c; GtkWidget *window_treesearch_gtk1_c; GtkWidget *tree_treesearch_gtk1_c; char bundle_direction_treesearch_gtk1_c; void (*cleanup_treesearch_gtk1_c)(void); /* ...end of manual adds */ /* * treesearch_gtk2.c */ #ifdef MAC_INTEGRATION char *dnd_helper_quartz; #endif struct string_chain_t *treeopen_chain_head; /* from bitvec.c */ struct string_chain_t *treeopen_chain_curr; /* from bitvec.c */ char tree_dnd_begin; /* from treesearch_gtk2.c */ char tree_dnd_requested; /* from treesearch_gtk2.c */ char do_dynamic_treefilter; /* from treesearch_gtk2.c */ GtkWidget *treesearch_gtk2_window_vbox; /* from treesearch_gtk2.c */ char *selected_hierarchy_name; /* from treesearch_gtk2.c */ char *selected_sig_name; /* from treesearch_gtk2.c */ GtkWidget *gtk2_tree_frame; /* from treesearch_gtk2.c */ GtkWidget *filter_entry; /* from treesearch_gtk2.c */ GtkCTreeNode *any_tree_node; /* from treesearch_gtk2.c */ struct xl_tree_node *open_tree_nodes; /* from treesearch_gtk2.c */ char autoname_bundles; /* from treesearch_gtk2.c 483 */ GtkWidget *window1_treesearch_gtk2_c_3; /* from treesearch_gtk2.c 484 */ GtkWidget *entry_a_treesearch_gtk2_c_2; /* from treesearch_gtk2.c 485 */ char *entrybox_text_local_treesearch_gtk2_c_3; /* from treesearch_gtk2.c 486 */ void (*cleanup_e_treesearch_gtk2_c_3)(void); /* from treesearch_gtk2.c 487 */ struct tree *sig_root_treesearch_gtk2_c_1; /* from treesearch_gtk2.c 488 */ struct tree *sst_sig_root_treesearch_gtk2_c_1; /* from treesearch_gtk2.c */ char *filter_str_treesearch_gtk2_c_1; /* from treesearch_gtk2.c 489 */ int filter_typ_treesearch_gtk2_c_1; int filter_typ_polarity_treesearch_gtk2_c_1; int filter_matlen_treesearch_gtk2_c_1; unsigned char filter_noregex_treesearch_gtk2_c_1; #if defined(WAVE_USE_GTK2) GtkListStore *sig_store_treesearch_gtk2_c_1; /* from treesearch_gtk2.c 490 */ GtkTreeSelection *sig_selection_treesearch_gtk2_c_1; /* from treesearch_gtk2.c 491 */ #endif int is_active_treesearch_gtk2_c_6; /* from treesearch_gtk2.c 492 */ GtkCTree *ctree_main; /* from treesearch_gtk2.c 493 */ struct autocoalesce_free_list *afl_treesearch_gtk2_c_1; /* from treesearch_gtk2.c 494 */ GtkWidget *window_treesearch_gtk2_c_12; /* from treesearch_gtk2.c 495 */ GtkWidget *tree_treesearch_gtk2_c_1; /* from treesearch_gtk2.c 496 */ void (*cleanup_treesearch_gtk2_c_8)(void); /* from treesearch_gtk2.c 498 */ int pre_import_treesearch_gtk2_c_1; /* from treesearch_gtk2.c 499 */ Traces tcache_treesearch_gtk2_c_2; /* from treesearch_gtk2.c 500 */ unsigned char dnd_tgt_on_signalarea_treesearch_gtk2_c_1; /* from treesearch_gtk2.c 501 */ unsigned char dnd_tgt_on_wavearea_treesearch_gtk2_c_1; /* from treesearch_gtk2.c */ GtkWidget *dnd_sigview; /* from treesearch_gtk2.c */ GtkPaned *sst_vpaned; /* from treesearch_gtk2.c */ int fetchlow; int fetchhigh; /* * ttranslate.c */ int current_translate_ttrans; int current_filter_ttranslate_c_1; int num_ttrans_filters; char **ttranssel_filter; struct pipe_ctx **ttrans_filter; int is_active_ttranslate_c_2; char *fcurr_ttranslate_c_1; GtkWidget *window_ttranslate_c_5; GtkWidget *clist_ttranslate_c_2; char *ttranslate_args; /* * vcd.c */ unsigned char do_hier_compress; /* from vcd.c */ char *prev_hier_uncompressed_name; /* from vcd.c */ jmp_buf *vcd_jmp_buf; /* from vcd.c */ int vcd_warning_filesize; /* from vcd.c 502 */ char autocoalesce; /* from vcd.c 503 */ char autocoalesce_reversal; /* from vcd.c 504 */ int vcd_explicit_zero_subscripts; /* from vcd.c 505 */ char convert_to_reals; /* from vcd.c 506 */ char atomic_vectors; /* from vcd.c 507 */ char make_vcd_save_file; /* from vcd.c 508 */ char vcd_preserve_glitches; /* from vcd.c 509 */ char vcd_preserve_glitches_real; FILE *vcd_save_handle; /* from vcd.c 510 */ FILE *vcd_handle_vcd_c_1; /* from vcd.c 511 */ char vcd_is_compressed_vcd_c_1; /* from vcd.c 512 */ off_t vcdbyteno_vcd_c_1; /* from vcd.c 513 */ int error_count_vcd_c_1; /* from vcd.c 514 */ int header_over_vcd_c_1; /* from vcd.c 515 */ int dumping_off_vcd_c_1; /* from vcd.c 516 */ TimeType start_time_vcd_c_1; /* from vcd.c 517 */ TimeType end_time_vcd_c_1; /* from vcd.c 518 */ TimeType current_time_vcd_c_1; /* from vcd.c 519 */ int num_glitches_vcd_c_2; /* from vcd.c 520 */ int num_glitch_regions_vcd_c_2; /* from vcd.c 521 */ char vcd_hier_delimeter[2]; /* from vcd.c 522 */ struct vcdsymbol *pv_vcd_c_1; /* from vcd.c 523 */ struct vcdsymbol *rootv_vcd_c_1; /* from vcd.c 524 */ char *vcdbuf_vcd_c_1; /* from vcd.c 525 */ char *vst_vcd_c_1; /* from vcd.c 526 */ char *vend_vcd_c_1; /* from vcd.c 527 */ int escaped_names_found_vcd_c_1; /* from vcd.c 528 */ struct slist *slistroot; /* from vcd.c 529 */ struct slist *slistcurr; /* from vcd.c 530 */ char *slisthier; /* from vcd.c 531 */ int slisthier_len; /* from vcd.c 532 */ int T_MAX_STR_vcd_c_1; /* from vcd.c 534 */ char *yytext_vcd_c_1; /* from vcd.c 535 */ int yylen_vcd_c_1; /* from vcd.c 536 */ int yylen_cache_vcd_c_1; /* from vcd.c 537 */ struct vcdsymbol *vcdsymroot_vcd_c_1; /* from vcd.c 538 */ struct vcdsymbol *vcdsymcurr_vcd_c_1; /* from vcd.c 539 */ struct vcdsymbol **sorted_vcd_c_1; /* from vcd.c 540 */ struct vcdsymbol **indexed_vcd_c_1; /* from vcd.c 541 */ int numsyms_vcd_c_1; /* from vcd.c 542 */ struct HistEnt *he_curr_vcd_c_1; /* from vcd.c 543 */ struct HistEnt *he_fini_vcd_c_1; /* from vcd.c 544 */ unsigned int vcd_minid_vcd_c_1; /* from vcd.c 546 */ unsigned int vcd_maxid_vcd_c_1; /* from vcd.c 547 */ int err_vcd_c_1; /* from vcd.c 548 */ off_t vcd_fsiz_vcd_c_1; /* from vcd.c 549 */ char *varsplit_vcd_c_1; /* from vcd.c 550 */ char *vsplitcurr_vcd_c_1; /* from vcd.c 551 */ int var_prevch_vcd_c_1; /* from vcd.c 552 */ /* * vcd_partial.c */ off_t vcdbyteno_vcd_partial_c_2; /* from vcd_partial.c 555 */ int error_count_vcd_partial_c_2; /* from vcd_partial.c 556 */ int header_over_vcd_partial_c_2; /* from vcd_partial.c 557 */ int dumping_off_vcd_partial_c_2; /* from vcd_partial.c 558 */ TimeType start_time_vcd_partial_c_2; /* from vcd_partial.c 559 */ TimeType end_time_vcd_partial_c_2; /* from vcd_partial.c 560 */ TimeType current_time_vcd_partial_c_2; /* from vcd_partial.c 561 */ int num_glitches_vcd_partial_c_3; /* from vcd_partial.c 562 */ int num_glitch_regions_vcd_partial_c_3; /* from vcd_partial.c 563 */ struct vcdsymbol *pv_vcd_partial_c_2; /* from vcd_partial.c 564 */ struct vcdsymbol *rootv_vcd_partial_c_2; /* from vcd_partial.c 565 */ char *vcdbuf_vcd_partial_c_2; /* from vcd_partial.c 566 */ char *vst_vcd_partial_c_2; /* from vcd_partial.c 567 */ char *vend_vcd_partial_c_2; /* from vcd_partial.c 568 */ char *consume_ptr_vcd_partial_c_1; /* from vcd_partial.c 569 */ char *buf_vcd_partial_c_2; /* from vcd_partial.c 570 */ int consume_countdown_vcd_partial_c_1; /* from vcd_partial.c 571 */ int T_MAX_STR_vcd_partial_c_2; /* from vcd_partial.c 573 */ char *yytext_vcd_partial_c_2; /* from vcd_partial.c 574 */ int yylen_vcd_partial_c_2; /* from vcd_partial.c 575 */ int yylen_cache_vcd_partial_c_2; /* from vcd_partial.c 576 */ struct vcdsymbol *vcdsymroot_vcd_partial_c_2; /* from vcd_partial.c 577 */ struct vcdsymbol *vcdsymcurr_vcd_partial_c_2; /* from vcd_partial.c 578 */ struct vcdsymbol **sorted_vcd_partial_c_2; /* from vcd_partial.c 579 */ struct vcdsymbol **indexed_vcd_partial_c_2; /* from vcd_partial.c 580 */ int numsyms_vcd_partial_c_2; /* from vcd_partial.c 582 */ unsigned int vcd_minid_vcd_partial_c_2; /* from vcd_partial.c 584 */ unsigned int vcd_maxid_vcd_partial_c_2; /* from vcd_partial.c 585 */ int err_vcd_partial_c_2; /* from vcd_partial.c 586 */ char *varsplit_vcd_partial_c_2; /* from vcd_partial.c 587 */ char *vsplitcurr_vcd_partial_c_2; /* from vcd_partial.c 588 */ int var_prevch_vcd_partial_c_2; /* from vcd_partial.c 589 */ int timeset_vcd_partial_c_1; /* from vcd_partial.c 592 */ /* * vcd_recoder.c */ struct vlist_t *time_vlist_vcd_recoder_c_1; /* from vcd_recoder.c 593 */ struct vlist_t *time_vlist_vcd_recoder_write; /* from vcd_recoder.c */ char *fastload_depacked; /* from vcd_recoder.c */ char *fastload_current; /* from vcd_recoder.c */ unsigned int time_vlist_count_vcd_recoder_c_1; /* from vcd_recoder.c 594 */ FILE *vcd_handle_vcd_recoder_c_2; /* from vcd_recoder.c 595 */ char vcd_is_compressed_vcd_recoder_c_2; /* from vcd_recoder.c 596 */ char use_fastload; off_t vcdbyteno_vcd_recoder_c_3; /* from vcd_recoder.c 597 */ int error_count_vcd_recoder_c_3; /* from vcd_recoder.c 598 */ int header_over_vcd_recoder_c_3; /* from vcd_recoder.c 599 */ int dumping_off_vcd_recoder_c_3; /* from vcd_recoder.c 600 */ TimeType start_time_vcd_recoder_c_3; /* from vcd_recoder.c 601 */ TimeType end_time_vcd_recoder_c_3; /* from vcd_recoder.c 602 */ TimeType current_time_vcd_recoder_c_3; /* from vcd_recoder.c 603 */ int num_glitches_vcd_recoder_c_4; /* from vcd_recoder.c 604 */ int num_glitch_regions_vcd_recoder_c_4; /* from vcd_recoder.c 605 */ struct vcdsymbol *pv_vcd_recoder_c_3; /* from vcd_recoder.c 606 */ struct vcdsymbol *rootv_vcd_recoder_c_3; /* from vcd_recoder.c 607 */ char *vcdbuf_vcd_recoder_c_3; /* from vcd_recoder.c 608 */ char *vst_vcd_recoder_c_3; /* from vcd_recoder.c 609 */ char *vend_vcd_recoder_c_3; /* from vcd_recoder.c 610 */ int T_MAX_STR_vcd_recoder_c_3; /* from vcd_recoder.c 612 */ char *yytext_vcd_recoder_c_3; /* from vcd_recoder.c 613 */ int yylen_vcd_recoder_c_3; /* from vcd_recoder.c 614 */ int yylen_cache_vcd_recoder_c_3; /* from vcd_recoder.c 615 */ struct vcdsymbol *vcdsymroot_vcd_recoder_c_3; /* from vcd_recoder.c 616 */ struct vcdsymbol *vcdsymcurr_vcd_recoder_c_3; /* from vcd_recoder.c 617 */ struct vcdsymbol **sorted_vcd_recoder_c_3; /* from vcd_recoder.c 618 */ struct vcdsymbol **indexed_vcd_recoder_c_3; /* from vcd_recoder.c 619 */ int numsyms_vcd_recoder_c_3; /* from vcd_recoder.c 620 */ unsigned int vcd_minid_vcd_recoder_c_3; /* from vcd_recoder.c 621 */ unsigned int vcd_maxid_vcd_recoder_c_3; /* from vcd_recoder.c 622 */ int err_vcd_recoder_c_3; /* from vcd_recoder.c 623 */ off_t vcd_fsiz_vcd_recoder_c_2; /* from vcd_recoder.c 624 */ char *varsplit_vcd_recoder_c_3; /* from vcd_recoder.c 625 */ char *vsplitcurr_vcd_recoder_c_3; /* from vcd_recoder.c 626 */ int var_prevch_vcd_recoder_c_3; /* from vcd_recoder.c 627 */ unsigned int vcd_hash_max; /* from vcd_recoder.c */ int vcd_hash_kill; /* from vcd_recoder.c */ /* * vcd_saver.c */ FILE *f_vcd_saver_c_1; /* from vcd_saver.c 630 */ char buf_vcd_saver_c_3[16]; /* from vcd_saver.c 631 */ struct vcdsav_tree_node **hp_vcd_saver_c_1; /* from vcd_saver.c 632 */ struct namehier *nhold_vcd_saver_c_1; /* from vcd_saver.c 633 */ /* * vlist.c */ char vlist_spill_to_disk; char vlist_prepack; FILE *vlist_handle; off_t vlist_bytes_written; int vlist_compression_depth; /* from vlist.c 634 */ /* * vzt.c */ struct vzt_rd_trace *vzt_vzt_c_1; /* from vzt.c 635 */ TimeType first_cycle_vzt_c_3; /* from vzt.c 636 */ TimeType last_cycle_vzt_c_3; /* from vzt.c 637 */ TimeType total_cycles_vzt_c_3; /* from vzt.c 638 */ struct lx2_entry *vzt_table_vzt_c_1; /* from vzt.c 639 */ struct fac *mvlfacs_vzt_c_3; /* from vzt.c 640 */ int busycnt_vzt_c_2; /* from vzt.c 641 */ /* * wavewindow.c */ char highlight_wavewindow; /* from wavewindow.c */ char alt_wheel_mode; /* from wavewindow.c */ char use_scrollwheel_as_y; /* from wavewindow.c */ char enable_slider_zoom; /* from wavewindow.c */ int m1x_wavewindow_c_1; /* from wavewindow.c 642 */ int m2x_wavewindow_c_1; /* from wavewindow.c 643 */ char black_and_white; /* from wavewindow.c */ char signalwindow_width_dirty; /* from wavewindow.c 644 */ char enable_ghost_marker; /* from wavewindow.c 645 */ char enable_horiz_grid; /* from wavewindow.c 646 */ char enable_vert_grid; /* from wavewindow.c 647 */ char use_big_fonts; /* from wavewindow.c 648 */ char use_nonprop_fonts; /* from wavewindow.c 649 */ char do_resize_signals; /* from wavewindow.c 650 */ char first_unsized_signals; int initial_signal_window_width; char constant_marker_update; /* from wavewindow.c 651 */ char use_roundcaps; /* from wavewindow.c 652 */ char show_base; /* from wavewindow.c 653 */ char wave_scrolling; /* from wavewindow.c 654 */ int vector_padding; /* from wavewindow.c 655 */ unsigned int in_button_press_wavewindow_c_1; /* from wavewindow.c 656 */ char left_justify_sigs; /* from wavewindow.c 657 */ char zoom_pow10_snap; /* from wavewindow.c 658 */ char zoom_dyn; /* from menu.c */ char zoom_dyne; /* from menu.c */ int cursor_snap; /* from wavewindow.c 659 */ float old_wvalue; /* from wavewindow.c 660 */ struct blackout_region_t *blackout_regions; /* from wavewindow.c 661 */ TimeType zoom; /* from wavewindow.c 662 */ TimeType scale; /* from wavewindow.c 663 */ TimeType nsperframe; /* from wavewindow.c 664 */ double pixelsperframe; /* from wavewindow.c 665 */ double hashstep; /* from wavewindow.c 666 */ TimeType prevtim_wavewindow_c_1; /* from wavewindow.c 667 */ double pxns; /* from wavewindow.c 668 */ double nspx; /* from wavewindow.c 669 */ double zoombase; /* from wavewindow.c 670 */ struct TraceEnt *topmost_trace; /* from wavewindow.c 671 */ int waveheight; /* from wavewindow.c 672 */ int wavecrosspiece; /* from wavewindow.c 673 */ int wavewidth; /* from wavewindow.c 674 */ struct font_engine_font_t *wavefont; /* from wavewindow.c 675 */ struct font_engine_font_t *wavefont_smaller; /* from wavewindow.c 676 */ GtkWidget *wavearea; /* from wavewindow.c 677 */ GtkWidget *vscroll_wavewindow_c_1; /* from wavewindow.c 678 */ GtkWidget *hscroll_wavewindow_c_2; /* from wavewindow.c 679 */ GdkDrawable *wavepixmap_wavewindow_c_1; /* from wavewindow.c 680 */ GtkObject *wave_vslider; /* from wavewindow.c 681 */ GtkObject *wave_hslider; /* from wavewindow.c 682 */ TimeType named_markers[WAVE_NUM_NAMED_MARKERS]; /* from wavewindow.c 683 */ int named_marker_lock_idx; /* from menu.c */ char made_gc_contexts_wavewindow_c_1; /* from wavewindow.c 684 */ int which_t_color; GdkGC *gc_white; /* from wavewindow.c 710 */ GdkGC *gc_black; /* from wavewindow.c 711 */ struct wave_gcmaster_t gc; GdkGC *gc_rainbow[2*WAVE_NUM_RAINBOW]; char made_sgc_contexts_wavewindow_c_1; /* from wavewindow.c 709 */ char fill_in_smaller_rgb_areas_wavewindow_c_1; /* from wavewindow.c 719 */ TimeType prev_markertime; /* from wavewindow.c */ struct wave_gcmaster_t gccache; int analog_redraw_skip_count; /* from wavewindow.c */ int str_wid_x; int str_wid_width; int str_wid_bigw; int str_wid_state; int str_wid_slider; int str_wid_height; TimeType ruler_origin; TimeType ruler_step; char fill_waveform; /* * zoombuttons.c */ char do_zoom_center; /* from zoombuttons.c 720 */ char do_initial_zoom_fit; /* from zoombuttons.c 721 */ char do_initial_zoom_fit_used; }; struct Global *initialize_globals(void); void reload_into_new_context(void); void strcpy2_into_new_context(struct Global *g, char **newstrref, char **oldstrref); void free_and_destroy_page_context(void); void dead_context_sweep(void); void install_focus_cb(GtkWidget *w, unsigned long ptr_offset); gulong gtkwave_signal_connect_x(GtkObject *object, const gchar *name, GtkSignalFunc func, gpointer data, char *f, unsigned long line); gulong gtkwave_signal_connect_object_x(GtkObject *object, const gchar *name, GtkSignalFunc func, gpointer data, char *f, unsigned long line); #ifdef GTKWAVE_SIGNAL_CONNECT_DEBUG #define gtkwave_signal_connect(a,b,c,d) gtkwave_signal_connect_x(a,b,c,d,__FILE__,__LINE__) #define gtkwave_signal_connect_object(a,b,c,d) gtkwave_signal_connect_object_x(a,b,c,d,__FILE__,__LINE__) #else #define gtkwave_signal_connect(a,b,c,d) gtkwave_signal_connect_x(a,b,c,d,NULL,0) #define gtkwave_signal_connect_object(a,b,c,d) gtkwave_signal_connect_object_x(a,b,c,d,NULL,0) #endif void set_GLOBALS_x(struct Global *g, const char *file, int line); #ifdef GTKWAVE_GLOBALS_DEBUG #define set_GLOBALS(a) set_GLOBALS_x(a,__FILE__,__LINE__) #else #define set_GLOBALS(a) set_GLOBALS_x(a,NULL,0) #endif void logbox_reload(void); void clone_icon_pointers_across_contexts(struct Global *a, struct Global *b); extern struct Global *GLOBALS; #endif gtkwave-3.3.86/src/main.h0000664000175000017500000000347613166335473014502 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2012. * * 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. */ #include "globals.h" #ifndef __MFMAIN_H__ #define __MFMAIN_H__ #include "busy.h" #define HAVE_PANED_PACK /* undefine this if you have an older GTK */ struct logfile_chain { struct logfile_chain *next; char *name; }; int main_2(int opt_vcd, int argc, char *argv[]); GtkWidget *create_text(void); GtkWidget *create_zoom_buttons(void); GtkWidget *create_page_buttons(void); GtkWidget *create_fetch_buttons(void); GtkWidget *create_discard_buttons(void); GtkWidget *create_edge_buttons(void); GtkWidget *create_shift_buttons(void); GtkWidget *create_entry_box(void); GtkWidget *create_time_box(void); GtkWidget *create_wavewindow(void); GtkWidget *create_signalwindow(void); /* Get/set the current size of the window. */ extern void get_window_size (int *x, int *y); extern void set_window_size (int x, int y); /* Get/set the x/y pos of the window */ void get_window_xypos(int *root_x, int *root_y); void set_window_xypos(int root_x, int root_y); /* stems helper activation */ int stems_are_active(void); void activate_stems_reader(char *stems_name); #if !defined _MSC_VER void kill_stems_browser(void); #endif void kill_stems_browser_single(void *G); /* prototype only used in main.c */ void menu_reload_waveform_marshal(GtkWidget *widget, gpointer data); /* function for spawning vcd conversions */ void optimize_vcd_file(void); enum FileType { MISSING_FILE, LXT_FILE, LX2_FILE, VZT_FILE, AE2_FILE, GHW_FILE, VCD_FILE, VCD_RECODER_FILE, #ifdef EXTLOAD_SUFFIX EXTLOAD_FILE, #endif FST_FILE, DUMPLESS_FILE }; #endif gtkwave-3.3.86/src/entry.c0000664000175000017500000001367713166335473014716 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2013. * * 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. */ #include "globals.h" #include #include #include "gtk12compat.h" #include "menu.h" #include "debug.h" #include #include #ifdef MAC_INTEGRATION /* disabled for now as we can't get it to auto enable when it comes up */ #define WAVE_MAC_USE_ENTRY #endif #ifndef WAVE_MAC_USE_ENTRY static gint keypress_local(GtkWidget *widget, GdkEventKey *event, gpointer data) { (void)widget; (void)event; (void)data; if(GLOBALS->window_entry_c_1) { gdk_window_raise(GLOBALS->window_entry_c_1->window); } return(FALSE); } #endif #ifndef WAVE_MAC_USE_ENTRY static void enter_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; G_CONST_RETURN gchar *entry_text; int len; entry_text = gtk_entry_get_text(GTK_ENTRY(GLOBALS->entry_entry_c_1)); entry_text = entry_text ? entry_text : ""; DEBUG(printf("Entry contents: %s\n", entry_text)); if(!(len=strlen(entry_text))) GLOBALS->entrybox_text=NULL; else strcpy((GLOBALS->entrybox_text=(char *)malloc_2(len+1)),entry_text); wave_gtk_grab_remove(GLOBALS->window_entry_c_1); gtk_widget_destroy(GLOBALS->window_entry_c_1); GLOBALS->window_entry_c_1 = NULL; GLOBALS->cleanup_entry_c_1(); } static void destroy_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; DEBUG(printf("Entry Cancel\n")); GLOBALS->entrybox_text=NULL; wave_gtk_grab_remove(GLOBALS->window_entry_c_1); gtk_widget_destroy(GLOBALS->window_entry_c_1); GLOBALS->window_entry_c_1 = NULL; } #endif void entrybox(char *title, int width, char *dflt_text, char *comment, int maxch, GtkSignalFunc func) { #ifndef WAVE_MAC_USE_ENTRY GtkWidget *vbox, *hbox; GtkWidget *button1, *button2; /* int height = (comment) ? 75 : 60; */ int height = -1; /* changed as recent gnome themes have taller window title bars so 75 is not enough */ #endif GLOBALS->cleanup_entry_c_1=func; /* fix problem where ungrab doesn't occur if button pressed + simultaneous accelerator key occurs */ if(GLOBALS->in_button_press_wavewindow_c_1) { gdk_pointer_ungrab(GDK_CURRENT_TIME); } if(GLOBALS->wave_script_args) { char *s = NULL; while((!s)&&(GLOBALS->wave_script_args->curr)) s = wave_script_args_fgetmalloc_stripspaces(GLOBALS->wave_script_args); if(s) { fprintf(stderr, "GTKWAVE | Entry '%s'\n", s); GLOBALS->entrybox_text = s; GLOBALS->cleanup_entry_c_1(); } else { GLOBALS->entrybox_text = NULL; } return; } #ifdef WAVE_MAC_USE_ENTRY { char *out_text_entry = NULL; entrybox_req_bridge(title, width, dflt_text, comment, maxch, &out_text_entry); if(out_text_entry) { int len=strlen(out_text_entry); if(!len) GLOBALS->entrybox_text=NULL; else strcpy((GLOBALS->entrybox_text=(char *)malloc_2(len+1)),out_text_entry); free(out_text_entry); GLOBALS->cleanup_entry_c_1(); } else { GLOBALS->entrybox_text = NULL; } return; } #else /* create a new modal window */ GLOBALS->window_entry_c_1 = gtk_window_new(GLOBALS->disable_window_manager ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL); install_focus_cb(GLOBALS->window_entry_c_1, ((char *)&GLOBALS->window_entry_c_1) - ((char *)GLOBALS)); gtk_widget_set_usize( GTK_WIDGET (GLOBALS->window_entry_c_1), width, height); gtk_window_set_title(GTK_WINDOW (GLOBALS->window_entry_c_1), title); gtkwave_signal_connect(GTK_OBJECT (GLOBALS->window_entry_c_1), "delete_event",(GtkSignalFunc) destroy_callback, NULL); gtk_window_set_policy(GTK_WINDOW(GLOBALS->window_entry_c_1), FALSE, FALSE, FALSE); vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (GLOBALS->window_entry_c_1), vbox); gtk_widget_show (vbox); if (comment) { GtkWidget *label, *cbox; cbox = gtk_hbox_new (FALSE, 1); gtk_box_pack_start (GTK_BOX (vbox), cbox, FALSE, FALSE, 0); gtk_widget_show (cbox); label = gtk_label_new(comment); gtk_widget_show (label); gtk_container_add (GTK_CONTAINER (cbox), label); GTK_WIDGET_SET_FLAGS (label, GTK_CAN_DEFAULT); } GLOBALS->entry_entry_c_1 = gtk_entry_new_with_max_length (maxch); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->entry_entry_c_1), "activate",GTK_SIGNAL_FUNC(enter_callback),GLOBALS->entry_entry_c_1); gtk_entry_set_text (GTK_ENTRY (GLOBALS->entry_entry_c_1), dflt_text); gtk_entry_select_region (GTK_ENTRY (GLOBALS->entry_entry_c_1),0, GTK_ENTRY(GLOBALS->entry_entry_c_1)->text_length); gtk_box_pack_start (GTK_BOX (vbox), GLOBALS->entry_entry_c_1, FALSE, FALSE, 0); gtk_widget_show (GLOBALS->entry_entry_c_1); hbox = gtk_hbox_new (FALSE, 1); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); gtk_widget_show (hbox); button1 = gtk_button_new_with_label ("OK"); gtk_widget_set_usize(button1, 100, -1); gtkwave_signal_connect(GTK_OBJECT (button1), "clicked", GTK_SIGNAL_FUNC(enter_callback), NULL); gtk_widget_show (button1); gtk_container_add (GTK_CONTAINER (hbox), button1); GTK_WIDGET_SET_FLAGS (button1, GTK_CAN_DEFAULT); gtkwave_signal_connect_object (GTK_OBJECT (button1), "realize", (GtkSignalFunc) gtk_widget_grab_default, GTK_OBJECT (button1)); button2 = gtk_button_new_with_label ("Cancel"); gtk_widget_set_usize(button2, 100, -1); gtkwave_signal_connect(GTK_OBJECT (button2), "clicked", GTK_SIGNAL_FUNC(destroy_callback), NULL); GTK_WIDGET_SET_FLAGS (button2, GTK_CAN_DEFAULT); gtk_widget_show (button2); gtk_container_add (GTK_CONTAINER (hbox), button2); gtk_widget_show(GLOBALS->window_entry_c_1); wave_gtk_grab_add(GLOBALS->window_entry_c_1); gdk_window_raise(GLOBALS->window_entry_c_1->window); gtk_signal_connect(GTK_OBJECT(GLOBALS->window_entry_c_1), "key_press_event",GTK_SIGNAL_FUNC(keypress_local), NULL); #endif } gtkwave-3.3.86/src/entry.h0000664000175000017500000000070313166335473014705 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010 * * 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. */ #ifndef WAVE_ENTRY_H #define WAVE_ENTRY_H void entrybox(char *title, int width, char *dflt_text, char *comment, int maxch, GtkSignalFunc func); #endif gtkwave-3.3.86/src/fsdb_wrapper_api.cc0000664000175000017500000006211613166335473017217 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2013-2017. * * 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. */ #include #include #include "fsdb_wrapper_api.h" #ifdef WAVE_FSDB_READER_IS_PRESENT #ifdef NOVAS_FSDB #undef NOVAS_FSDB #endif #include "ffrAPI.h" #include #include #ifdef HAVE_INTTYPES_H #include #endif #define FSDBR_FXT2U64(xt) (((uint64_t)(xt).hltag.H << 32) | ((uint64_t)(xt).hltag.L)) #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif static bool_T __TreeCB(fsdbTreeCBType cb_type, void *client_data, void *tree_cb_data) { return(TRUE); /* currently unused along with var/scope traversal */ } static bool_T __MyTreeCB(fsdbTreeCBType cb_type, void *client_data, void *tree_cb_data); extern "C" void *fsdbReaderOpenFile(char *nam) { fsdbFileType ft; uint_T blk_idx = 0; if(!ffrObject::ffrIsFSDB(nam)) { return(NULL); } ffrFSDBInfo fsdb_info; ffrObject::ffrGetFSDBInfo(nam, fsdb_info); if((fsdb_info.file_type != FSDB_FT_VERILOG) && (fsdb_info.file_type != FSDB_FT_VERILOG_VHDL) && (fsdb_info.file_type != FSDB_FT_VHDL)) { return(NULL); } ffrObject *fsdb_obj = ffrObject::ffrOpen3(nam); if(!fsdb_obj) { return(NULL); } fsdb_obj->ffrSetTreeCBFunc(__TreeCB, NULL); ft = fsdb_obj->ffrGetFileType(); if((ft != FSDB_FT_VERILOG) && (ft != FSDB_FT_VERILOG_VHDL) && (ft != FSDB_FT_VHDL)) { fsdb_obj->ffrClose(); return(NULL); } fsdb_obj->ffrReadDataTypeDefByBlkIdx(blk_idx); /* necessary if FSDB file has transaction data ... we don't process this but it prevents possible crashes */ return((void *)fsdb_obj); } extern "C" void fsdbReaderReadScopeVarTree(void *ctx,void (*cb)(void *)) { ffrObject *fsdb_obj = (ffrObject *)ctx; fsdb_obj->ffrSetTreeCBFunc(__MyTreeCB, (void *) cb); fsdb_obj->ffrReadScopeVarTree(); } extern "C" int fsdbReaderGetMaxVarIdcode(void *ctx) { ffrObject *fsdb_obj = (ffrObject *)ctx; fsdbVarIdcode max_var_idcode = fsdb_obj->ffrGetMaxVarIdcode(); return(max_var_idcode); } extern "C" void fsdbReaderAddToSignalList(void *ctx, int i) { ffrObject *fsdb_obj = (ffrObject *)ctx; fsdb_obj->ffrAddToSignalList(i); } extern "C" void fsdbReaderResetSignalList(void *ctx) { ffrObject *fsdb_obj = (ffrObject *)ctx; fsdb_obj->ffrResetSignalList(); } extern "C" void fsdbReaderLoadSignals(void *ctx) { ffrObject *fsdb_obj = (ffrObject *)ctx; fsdb_obj->ffrLoadSignals(); } extern "C" void *fsdbReaderCreateVCTraverseHandle(void *ctx, int i) { ffrObject *fsdb_obj = (ffrObject *)ctx; ffrVCTrvsHdl hdl = fsdb_obj->ffrCreateVCTraverseHandle(i); return((void *)hdl); } extern "C" int fsdbReaderHasIncoreVC(void *ctx, void *hdl) { ffrObject *fsdb_obj = (ffrObject *)ctx; ffrVCTrvsHdl fsdb_hdl = (ffrVCTrvsHdl)hdl; return(fsdb_hdl->ffrHasIncoreVC() == TRUE); } extern "C" void fsdbReaderFree(void *ctx, void *hdl) { ffrObject *fsdb_obj = (ffrObject *)ctx; ffrVCTrvsHdl fsdb_hdl = (ffrVCTrvsHdl)hdl; fsdb_hdl->ffrFree(); } extern "C" uint64_t fsdbReaderGetMinXTag(void *ctx, void *hdl) { ffrObject *fsdb_obj = (ffrObject *)ctx; ffrVCTrvsHdl fsdb_hdl = (ffrVCTrvsHdl)hdl; fsdbTag64 timetag; fsdb_hdl->ffrGetMinXTag((void*)&timetag); uint64_t rv = (((uint64_t)timetag.H) << 32) | ((uint64_t)timetag.L); return(rv); } extern "C" uint64_t fsdbReaderGetMaxXTag(void *ctx, void *hdl) { ffrObject *fsdb_obj = (ffrObject *)ctx; ffrVCTrvsHdl fsdb_hdl = (ffrVCTrvsHdl)hdl; fsdbTag64 timetag; fsdb_hdl->ffrGetMaxXTag((void*)&timetag); uint64_t rv = (((uint64_t)timetag.H) << 32) | ((uint64_t)timetag.L); return(rv); } extern "C" int fsdbReaderGotoXTag(void *ctx, void *hdl, uint64_t tim) { ffrObject *fsdb_obj = (ffrObject *)ctx; ffrVCTrvsHdl fsdb_hdl = (ffrVCTrvsHdl)hdl; fsdbTag64 timetag; timetag.H = (uint32_t)(tim >> 32); timetag.L = (uint32_t)(tim & 0xFFFFFFFFUL); return(fsdb_hdl->ffrGotoXTag((void*)&timetag) == FSDB_RC_SUCCESS); } extern "C" uint64_t fsdbReaderGetXTag(void *ctx, void *hdl, int *rc) { ffrObject *fsdb_obj = (ffrObject *)ctx; ffrVCTrvsHdl fsdb_hdl = (ffrVCTrvsHdl)hdl; fsdbTag64 timetag; *rc = (fsdb_hdl->ffrGetXTag((void*)&timetag) == FSDB_RC_SUCCESS); uint64_t rv = (((uint64_t)timetag.H) << 32) | ((uint64_t)timetag.L); return(rv); } extern "C" int fsdbReaderGetVC(void *ctx, void *hdl, void **val_ptr) { ffrObject *fsdb_obj = (ffrObject *)ctx; ffrVCTrvsHdl fsdb_hdl = (ffrVCTrvsHdl)hdl; return(fsdb_hdl->ffrGetVC((byte_T**)val_ptr) == FSDB_RC_SUCCESS); } extern "C" int fsdbReaderGotoNextVC(void *ctx, void *hdl) { ffrObject *fsdb_obj = (ffrObject *)ctx; ffrVCTrvsHdl fsdb_hdl = (ffrVCTrvsHdl)hdl; return(fsdb_hdl->ffrGotoNextVC() == FSDB_RC_SUCCESS); } extern "C" void fsdbReaderUnloadSignals(void *ctx) { ffrObject *fsdb_obj = (ffrObject *)ctx; fsdb_obj->ffrUnloadSignals(); } extern "C" void fsdbReaderClose(void *ctx) { ffrObject *fsdb_obj = (ffrObject *)ctx; fsdb_obj->ffrClose(); } extern "C" int fsdbReaderGetBytesPerBit(void *hdl) { ffrVCTrvsHdl fsdb_hdl = (ffrVCTrvsHdl)hdl; return(fsdb_hdl->ffrGetBytesPerBit()); } extern "C" int fsdbReaderGetBitSize(void *hdl) { ffrVCTrvsHdl fsdb_hdl = (ffrVCTrvsHdl)hdl; return(fsdb_hdl->ffrGetBitSize()); } extern "C" int fsdbReaderGetVarType(void *hdl) { ffrVCTrvsHdl fsdb_hdl = (ffrVCTrvsHdl)hdl; return(fsdb_hdl->ffrGetVarType()); } extern "C" char *fsdbReaderTranslateVC(void *hdl, void *val_ptr) { ffrVCTrvsHdl vc_trvs_hdl = (ffrVCTrvsHdl)hdl; byte_T *vc_ptr = (byte_T *)val_ptr; static byte_T buffer[FSDB_MAX_BIT_SIZE+1]; uint_T i; fsdbVarType var_type; switch (vc_trvs_hdl->ffrGetBytesPerBit()) { case FSDB_BYTES_PER_BIT_1B: for (i = 0; i < vc_trvs_hdl->ffrGetBitSize(); i++) { switch(vc_ptr[i]) { case FSDB_BT_VCD_0: buffer[i] = '0'; break; case FSDB_BT_VCD_1: buffer[i] = '1'; break; case FSDB_BT_VCD_Z: buffer[i] = 'z'; break; case FSDB_BT_VCD_X: default: buffer[i] = 'x'; break; } } buffer[i] = 0; break; case FSDB_BYTES_PER_BIT_2B: for (i = 0; i < vc_trvs_hdl->ffrGetBitSize(); i++) { switch(vc_ptr[i * 2]) { case FSDB_BT_EVCD_D: case FSDB_BT_EVCD_d: case FSDB_BT_EVCD_L: case FSDB_BT_EVCD_l: case FSDB_BT_EVCD_0: buffer[i] = '0'; break; case FSDB_BT_EVCD_U: case FSDB_BT_EVCD_u: case FSDB_BT_EVCD_H: case FSDB_BT_EVCD_h: case FSDB_BT_EVCD_1: buffer[i] = '1'; break; case FSDB_BT_EVCD_Z: case FSDB_BT_EVCD_T: case FSDB_BT_EVCD_F: case FSDB_BT_EVCD_f: buffer[i] = 'z'; break; case FSDB_BT_EVCD_N: case FSDB_BT_EVCD_X: case FSDB_BT_EVCD_QSTN: case FSDB_BT_EVCD_A: case FSDB_BT_EVCD_a: case FSDB_BT_EVCD_B: case FSDB_BT_EVCD_b: case FSDB_BT_EVCD_C: case FSDB_BT_EVCD_c: default: buffer[i] = 'x'; break; } } buffer[i] = 0; break; case FSDB_BYTES_PER_BIT_4B: var_type = vc_trvs_hdl->ffrGetVarType(); switch(var_type) { case FSDB_VT_VCD_MEMORY_DEPTH: case FSDB_VT_VHDL_MEMORY_DEPTH: buffer[0] = 0; break; default: vc_trvs_hdl->ffrGetVC(&vc_ptr); sprintf((char *)buffer, "%f", *((float*)vc_ptr)); break; } break; case FSDB_BYTES_PER_BIT_8B: sprintf((char *)buffer, "%.16g", *((double*)vc_ptr)); break; default: buffer[0] = 0; break; } return((char *)buffer); } extern "C" int fsdbReaderExtractScaleUnit(void *ctx, int *mult, char *scale) { ffrObject *fsdb_obj = (ffrObject *)ctx; uint_T digit; char *unit; str_T su = fsdb_obj->ffrGetScaleUnit(); fsdbRC rc = fsdb_obj->ffrExtractScaleUnit(su, digit, unit); if(rc == FSDB_RC_SUCCESS) { *mult = digit ? ((int)digit) : 1; /* in case digit is zero */ *scale = unit[0]; } return(rc == FSDB_RC_SUCCESS); } extern "C" int fsdbReaderGetMinFsdbTag64(void *ctx, uint64_t *tim) { ffrObject *fsdb_obj = (ffrObject *)ctx; fsdbTag64 tag64; fsdbRC rc = fsdb_obj->ffrGetMinFsdbTag64(&tag64); if(rc == FSDB_RC_SUCCESS) { *tim = (((uint64_t)tag64.H) << 32) | ((uint64_t)tag64.L); } return(rc == FSDB_RC_SUCCESS); } extern "C" int fsdbReaderGetMaxFsdbTag64(void *ctx, uint64_t *tim) { ffrObject *fsdb_obj = (ffrObject *)ctx; fsdbTag64 tag64; fsdbRC rc = fsdb_obj->ffrGetMaxFsdbTag64(&tag64); if(rc == FSDB_RC_SUCCESS) { *tim = (((uint64_t)tag64.H) << 32) | ((uint64_t)tag64.L); } return(rc == FSDB_RC_SUCCESS); } static bool_T __fsdbReaderGetStatisticsCB(fsdbTreeCBType cb_type, void *client_data, void *tree_cb_data) { struct fsdbReaderGetStatistics_t *gs = (struct fsdbReaderGetStatistics_t *)client_data; switch (cb_type) { case FSDB_TREE_CBT_VAR: gs->varCount++; break; case FSDB_TREE_CBT_STRUCT_BEGIN: case FSDB_TREE_CBT_SCOPE: gs->scopeCount++; break; default: break; } return(TRUE); } extern "C" struct fsdbReaderGetStatistics_t *fsdbReaderGetStatistics(void *ctx) { ffrObject *fsdb_obj = (ffrObject *)ctx; struct fsdbReaderGetStatistics_t *gs = (struct fsdbReaderGetStatistics_t *)calloc(1, sizeof(struct fsdbReaderGetStatistics_t)); fsdb_obj->ffrSetTreeCBFunc(__fsdbReaderGetStatisticsCB, gs); fsdb_obj->ffrReadScopeVarTree(); return(gs); } static void __DumpScope(fsdbTreeCBDataScope* scope, void (*cb)(void *)) { str_T type; char bf[65537]; switch (scope->type) { case FSDB_ST_VCD_MODULE: type = (str_T) "vcd_module"; break; case FSDB_ST_VCD_TASK: type = (str_T) "vcd_task"; break; case FSDB_ST_VCD_FUNCTION: type = (str_T) "vcd_function"; break; case FSDB_ST_VCD_BEGIN: type = (str_T) "vcd_begin"; break; case FSDB_ST_VCD_FORK: type = (str_T) "vcd_fork"; break; case FSDB_ST_VCD_GENERATE: type = (str_T) "vcd_generate"; break; case FSDB_ST_SV_INTERFACE: type = (str_T) "sv_interface"; break; case FSDB_ST_VHDL_ARCHITECTURE: type = (str_T) "vhdl_architecture"; break; case FSDB_ST_VHDL_PROCEDURE: type = (str_T) "vhdl_procedure"; break; case FSDB_ST_VHDL_FUNCTION: type = (str_T) "vhdl_function"; break; case FSDB_ST_VHDL_RECORD: type = (str_T) "vhdl_record"; break; case FSDB_ST_VHDL_PROCESS: type = (str_T) "vhdl_process"; break; case FSDB_ST_VHDL_BLOCK: type = (str_T) "vhdl_block"; break; case FSDB_ST_VHDL_FOR_GENERATE: type = (str_T) "vhdl_for_generate"; break; case FSDB_ST_VHDL_IF_GENERATE: type = (str_T) "vhdl_if_generate"; break; case FSDB_ST_VHDL_GENERATE: type = (str_T) "vhdl_generate"; break; default: type = (str_T) "unknown_scope_type"; break; } sprintf(bf, "Scope: %s %s %s", type, scope->name, scope->module ? scope->module : "NULL"); cb(bf); } static char* itoa_2(int value, char* result) { char* ptr = result, *ptr1 = result, tmp_char; int tmp_value; do { tmp_value = value; value /= 10; *ptr++ = "9876543210123456789" [9 + (tmp_value - value * 10)]; } while ( value ); if (tmp_value < 0) *ptr++ = '-'; result = ptr; *ptr-- = '\0'; while(ptr1 < ptr) { tmp_char = *ptr; *ptr--= *ptr1; *ptr1++ = tmp_char; } return(result); } static void __DumpVar(fsdbTreeCBDataVar *var, void (*cb)(void *)) { str_T type; str_T bpb; str_T direction; char *pnt; int len; int typelen; int dirlen; char bf[65537]; switch(var->bytes_per_bit) { case FSDB_BYTES_PER_BIT_1B: bpb = (str_T) "1B"; break; case FSDB_BYTES_PER_BIT_2B: bpb = (str_T) "2B"; break; case FSDB_BYTES_PER_BIT_4B: bpb = (str_T) "4B"; break; case FSDB_BYTES_PER_BIT_8B: bpb = (str_T) "8B"; break; default: bpb = (str_T) "XB"; break; } switch (var->type) { case FSDB_VT_VCD_EVENT: type = (str_T) "vcd_event"; typelen = 9; break; case FSDB_VT_VCD_INTEGER: type = (str_T) "vcd_integer"; typelen = 11; break; case FSDB_VT_VCD_PARAMETER: type = (str_T) "vcd_parameter"; typelen = 13; break; case FSDB_VT_VCD_REAL: type = (str_T) "vcd_real"; typelen = 8; break; case FSDB_VT_VCD_REG: type = (str_T) "vcd_reg"; typelen = 7; break; case FSDB_VT_VCD_SUPPLY0: type = (str_T) "vcd_supply0"; typelen = 11; break; case FSDB_VT_VCD_SUPPLY1: type = (str_T) "vcd_supply1"; typelen = 11; break; case FSDB_VT_VCD_TIME: type = (str_T) "vcd_time"; typelen = 8; break; case FSDB_VT_VCD_TRI: type = (str_T) "vcd_tri"; typelen = 7; break; case FSDB_VT_VCD_TRIAND: type = (str_T) "vcd_triand"; typelen = 10; break; case FSDB_VT_VCD_TRIOR: type = (str_T) "vcd_trior"; typelen = 9; break; case FSDB_VT_VCD_TRIREG: type = (str_T) "vcd_trireg"; typelen = 10; break; case FSDB_VT_VCD_TRI0: type = (str_T) "vcd_tri0"; typelen = 8; break; case FSDB_VT_VCD_TRI1: type = (str_T) "vcd_tri1"; typelen = 8; break; case FSDB_VT_VCD_WAND: type = (str_T) "vcd_wand"; typelen = 8; break; case FSDB_VT_VCD_WIRE: type = (str_T) "vcd_wire"; typelen = 8; break; case FSDB_VT_VCD_WOR: type = (str_T) "vcd_wor"; typelen = 7; break; case FSDB_VT_VCD_PORT: type = (str_T) "vcd_port"; typelen = 8; break; case FSDB_VT_VHDL_SIGNAL: case FSDB_VT_VHDL_VARIABLE: case FSDB_VT_VHDL_CONSTANT: case FSDB_VT_VHDL_FILE: case FSDB_VT_VCD_MEMORY: case FSDB_VT_VHDL_MEMORY: case FSDB_VT_VCD_MEMORY_DEPTH: case FSDB_VT_VHDL_MEMORY_DEPTH: switch(var->vc_dt) { case FSDB_VC_DT_FLOAT: case FSDB_VC_DT_DOUBLE: type = (str_T) "vcd_real"; typelen = 8; break; case FSDB_VC_DT_UNKNOWN: case FSDB_VC_DT_BYTE: case FSDB_VC_DT_SHORT: case FSDB_VC_DT_INT: case FSDB_VC_DT_LONG: case FSDB_VC_DT_HL_INT: case FSDB_VC_DT_PHYSICAL: default: if(var->type == FSDB_VT_VHDL_SIGNAL) { type = (str_T) "vcd_wire"; typelen = 8; } else { type = (str_T) "vcd_reg"; typelen = 7; } break; } break; case FSDB_VT_STREAM: /* these hold transactions: not yet supported */ type = (str_T) "stream"; typelen = 6; break; default: type = (str_T) "vcd_wire"; typelen = 8; break; } switch(var->direction) { case FSDB_VD_INPUT: direction = (str_T) "input"; dirlen = 5; break; case FSDB_VD_OUTPUT: direction = (str_T) "output"; dirlen = 6; break; case FSDB_VD_INOUT: direction = (str_T) "inout"; dirlen = 5; break; case FSDB_VD_BUFFER: direction = (str_T) "buffer"; dirlen = 6; break; case FSDB_VD_LINKAGE: direction = (str_T) "linkage"; dirlen = 7; break; case FSDB_VD_IMPLICIT: default: direction = (str_T) "implicit"; dirlen = 8; break; } /* sprintf(bf, "Var: %s %s l:%d r:%d %s %d %s %d", type, var->name, var->lbitnum, var->rbitnum, direction, var->u.idcode, bpb, var->dtidcode); */ memcpy(bf, "Var: ", 5); pnt = bf+5; len = typelen; /* strlen(type) */ memcpy(pnt, type, len); pnt += len; *(pnt++) = ' '; len = strlen(var->name); memcpy(pnt, var->name, len); pnt += len; memcpy(pnt, " l:", 3); pnt += 3; pnt = itoa_2(var->lbitnum, pnt); memcpy(pnt, " r:", 3); pnt += 3; pnt = itoa_2(var->rbitnum, pnt); *(pnt++) = ' '; len = dirlen; /* strlen(direction) */ memcpy(pnt, direction, len); pnt += len; *(pnt++) = ' '; pnt = itoa_2(var->u.idcode, pnt); *(pnt++) = ' '; len = 2; /* strlen(bpb) */ memcpy(pnt, bpb, len); pnt += len; *(pnt++) = ' '; pnt = itoa_2(var->dtidcode, pnt); *(pnt) = 0; cb(bf); } static void __DumpStruct(fsdbTreeCBDataStructBegin* str, void (*cb)(void *)) { char bf[65537]; /* printf("NAME: %s FIELDS: %d TYPE: %d is_partial_dumped: %d\n", str->name, (int)str->fieldCount, (int)str->type, (int)str->is_partial_dumped); */ sprintf(bf, "Scope: vcd_struct %s %s", str->name, "NULL"); cb(bf); } static void __DumpArray(fsdbTreeCBDataArrayBegin* arr, void (*cb)(void *)) { /* printf("NAME: %s SIZE: %d is_partial_dumped: %d\n", arr->name, (int)arr->size, (int)arr->is_partial_dumped); */ } static bool_T __MyTreeCB(fsdbTreeCBType cb_type, void *client_data, void *tree_cb_data) { void (*cb)(void *) = (void (*)(void *))client_data; char bf[16]; switch (cb_type) { case FSDB_TREE_CBT_BEGIN_TREE: /* fprintf(stderr, "Begin Tree:\n"); */ break; case FSDB_TREE_CBT_SCOPE: __DumpScope((fsdbTreeCBDataScope*)tree_cb_data, cb); break; case FSDB_TREE_CBT_VAR: __DumpVar((fsdbTreeCBDataVar*)tree_cb_data, cb); break; case FSDB_TREE_CBT_UPSCOPE: strcpy(bf, "Upscope:"); cb(bf); break; case FSDB_TREE_CBT_END_TREE: strcpy(bf, "End Tree:"); cb(bf); break; case FSDB_TREE_CBT_STRUCT_BEGIN: __DumpStruct((fsdbTreeCBDataStructBegin*)tree_cb_data, cb); break; case FSDB_TREE_CBT_STRUCT_END: strcpy(bf, "Upscope:"); cb(bf); break; /* not yet supported */ case FSDB_TREE_CBT_ARRAY_BEGIN: __DumpArray((fsdbTreeCBDataArrayBegin*)tree_cb_data, cb); break; case FSDB_TREE_CBT_ARRAY_END: break; case FSDB_TREE_CBT_FILE_TYPE: case FSDB_TREE_CBT_SIMULATOR_VERSION: case FSDB_TREE_CBT_SIMULATION_DATE: case FSDB_TREE_CBT_X_AXIS_SCALE: case FSDB_TREE_CBT_END_ALL_TREE: case FSDB_TREE_CBT_RECORD_BEGIN: case FSDB_TREE_CBT_RECORD_END: break; default: return(FALSE); } return(TRUE); } /* * $dumpoff/$dumpon support */ extern "C" unsigned int fsdbReaderGetDumpOffRange(void *ctx, struct fsdbReaderBlackoutChain_t **r) { ffrObject *fsdb_obj = (ffrObject *)ctx; if(fsdb_obj->ffrHasDumpOffRange()) { uint_T count; fsdbDumpOffRange *fdr = NULL; if(FSDB_RC_SUCCESS == fsdb_obj->ffrGetDumpOffRange(count, fdr)) { uint_T i; *r = (struct fsdbReaderBlackoutChain_t *)calloc(count * 2, sizeof(struct fsdbReaderBlackoutChain_t)); for(i=0;iffrGetTransInfo((fsdbTransId)idx, info); *trans_info = info; return(rc != FSDB_RC_FAILURE); } /* * Reformat FSDB hierarchy info into FST's format (for use with WAVE_USE_FSDB_FST_BRIDGE) */ static void __DumpScope2(fsdbTreeCBDataScope* scope, void (*cb)(void *)) { unsigned char typ; struct fstHier fh; switch (scope->type) { case FSDB_ST_VCD_MODULE: typ = FST_ST_VCD_MODULE; break; case FSDB_ST_VCD_TASK: typ = FST_ST_VCD_TASK; break; case FSDB_ST_VCD_FUNCTION: typ = FST_ST_VCD_FUNCTION; break; case FSDB_ST_VCD_BEGIN: typ = FST_ST_VCD_BEGIN; break; case FSDB_ST_VCD_FORK: typ = FST_ST_VCD_FORK; break; case FSDB_ST_VCD_GENERATE: typ = FST_ST_VCD_GENERATE; break; case FSDB_ST_SV_INTERFACE: typ = FST_ST_VCD_INTERFACE; break; case FSDB_ST_VHDL_ARCHITECTURE: typ = FST_ST_VHDL_ARCHITECTURE; break; case FSDB_ST_VHDL_PROCEDURE: typ = FST_ST_VHDL_PROCEDURE; break; case FSDB_ST_VHDL_FUNCTION: typ = FST_ST_VHDL_FUNCTION; break; case FSDB_ST_VHDL_RECORD: typ = FST_ST_VHDL_RECORD; break; case FSDB_ST_VHDL_PROCESS: typ = FST_ST_VHDL_PROCESS; break; case FSDB_ST_VHDL_BLOCK: typ = FST_ST_VHDL_BLOCK; break; case FSDB_ST_VHDL_FOR_GENERATE: typ = FST_ST_VHDL_FOR_GENERATE; break; case FSDB_ST_VHDL_IF_GENERATE: typ = FST_ST_VHDL_IF_GENERATE; break; case FSDB_ST_VHDL_GENERATE: typ = FST_ST_VHDL_GENERATE; break; default: typ = FST_ST_VCD_MODULE; break; } fh.htyp = FST_HT_SCOPE; fh.u.scope.typ = typ; fh.u.scope.name = scope->name; fh.u.scope.name_length = strlen(fh.u.scope.name); if(scope->module) { fh.u.scope.component = scope->module; fh.u.scope.component_length = strlen(fh.u.scope.component); } else { fh.u.scope.component = NULL; fh.u.scope.component_length = 0; } cb(&fh); } static void __DumpVar2(fsdbTreeCBDataVar *var, void (*cb)(void *)) { unsigned char typ; unsigned char dir; struct fstHier fh; switch (var->type) { case FSDB_VT_VCD_EVENT: typ = FST_VT_VCD_EVENT; break; case FSDB_VT_VCD_INTEGER: typ = FST_VT_VCD_INTEGER; break; case FSDB_VT_VCD_PARAMETER: typ = FST_VT_VCD_PARAMETER; break; case FSDB_VT_VCD_REAL: typ = FST_VT_VCD_REAL; break; case FSDB_VT_VCD_REG: typ = FST_VT_VCD_REG; break; case FSDB_VT_VCD_SUPPLY0: typ = FST_VT_VCD_SUPPLY0; break; case FSDB_VT_VCD_SUPPLY1: typ = FST_VT_VCD_SUPPLY1; break; case FSDB_VT_VCD_TIME: typ = FST_VT_VCD_TIME; break; case FSDB_VT_VCD_TRI: typ = FST_VT_VCD_TRI; break; case FSDB_VT_VCD_TRIAND: typ = FST_VT_VCD_TRIAND; break; case FSDB_VT_VCD_TRIOR: typ = FST_VT_VCD_TRIOR; break; case FSDB_VT_VCD_TRIREG: typ = FST_VT_VCD_TRIREG; break; case FSDB_VT_VCD_TRI0: typ = FST_VT_VCD_TRI0; break; case FSDB_VT_VCD_TRI1: typ = FST_VT_VCD_TRI1; break; case FSDB_VT_VCD_WAND: typ = FST_VT_VCD_WAND; break; case FSDB_VT_VCD_WIRE: typ = FST_VT_VCD_WIRE; break; case FSDB_VT_VCD_WOR: typ = FST_VT_VCD_WOR; break; case FSDB_VT_VCD_PORT: typ = FST_VT_VCD_PORT; break; case FSDB_VT_VHDL_SIGNAL: case FSDB_VT_VHDL_VARIABLE: case FSDB_VT_VHDL_CONSTANT: case FSDB_VT_VHDL_FILE: case FSDB_VT_VCD_MEMORY: case FSDB_VT_VHDL_MEMORY: case FSDB_VT_VCD_MEMORY_DEPTH: case FSDB_VT_VHDL_MEMORY_DEPTH: switch(var->vc_dt) { case FSDB_VC_DT_FLOAT: case FSDB_VC_DT_DOUBLE: typ = FST_VT_VCD_REAL; break; case FSDB_VC_DT_UNKNOWN: case FSDB_VC_DT_BYTE: case FSDB_VC_DT_SHORT: case FSDB_VC_DT_INT: case FSDB_VC_DT_LONG: case FSDB_VC_DT_HL_INT: case FSDB_VC_DT_PHYSICAL: default: if(var->type == FSDB_VT_VHDL_SIGNAL) { typ = FST_VT_VCD_WIRE; } else { typ = FST_VT_VCD_REG; } break; } break; case FSDB_VT_STREAM: /* these hold transactions: not yet supported */ typ = FST_VT_GEN_STRING; break; default: typ = FST_VT_VCD_WIRE; break; } switch(var->direction) { case FSDB_VD_INPUT: dir = FST_VD_INPUT; break; case FSDB_VD_OUTPUT: dir = FST_VD_OUTPUT; break; case FSDB_VD_INOUT: dir = FST_VD_INOUT; break; case FSDB_VD_BUFFER: dir = FST_VD_BUFFER; break; case FSDB_VD_LINKAGE: dir = FST_VD_LINKAGE; break; case FSDB_VD_IMPLICIT: default: dir = FST_VD_IMPLICIT; break; } fh.htyp = FST_HT_VAR; fh.u.var.typ = typ; fh.u.var.direction = dir; fh.u.var.svt_workspace = 0; fh.u.var.sdt_workspace = 0; fh.u.var.sxt_workspace = 0; fh.u.var.name = var->name; fh.u.var.length = (var->lbitnum > var->rbitnum) ? (var->lbitnum - var->rbitnum + 1) : (var->rbitnum - var->lbitnum + 1); fh.u.var.handle = var->u.idcode; fh.u.var.name_length = strlen(fh.u.var.name); fh.u.var.is_alias = 0; // for now cb(&fh); } static void __DumpStruct2(fsdbTreeCBDataStructBegin* str, void (*cb)(void *)) { struct fstHier fh; fh.htyp = FST_HT_SCOPE; fh.u.scope.typ = FST_ST_VCD_STRUCT; fh.u.scope.name = str->name; fh.u.scope.name_length = strlen(fh.u.scope.name); fh.u.scope.component = NULL; fh.u.scope.component_length = 0; cb(&fh); } static void __DumpArray2(fsdbTreeCBDataArrayBegin* arr, void (*cb)(void *)) { /* printf("NAME: %s SIZE: %d is_partial_dumped: %d\n", arr->name, (int)arr->size, (int)arr->is_partial_dumped); */ } static bool_T __MyTreeCB2(fsdbTreeCBType cb_type, void *client_data, void *tree_cb_data) { void (*cb)(void *) = (void (*)(void *))client_data; struct fstHier fh; char bf[16]; switch (cb_type) { case FSDB_TREE_CBT_BEGIN_TREE: /* fprintf(stderr, "Begin Tree:\n"); */ break; case FSDB_TREE_CBT_SCOPE: __DumpScope2((fsdbTreeCBDataScope*)tree_cb_data, cb); break; case FSDB_TREE_CBT_VAR: __DumpVar2((fsdbTreeCBDataVar*)tree_cb_data, cb); break; case FSDB_TREE_CBT_UPSCOPE: case FSDB_TREE_CBT_STRUCT_END: fh.htyp = FST_HT_UPSCOPE; cb(&fh); break; case FSDB_TREE_CBT_END_TREE: fh.htyp = FST_HT_TREEEND; cb(&fh); break; case FSDB_TREE_CBT_STRUCT_BEGIN: __DumpStruct2((fsdbTreeCBDataStructBegin*)tree_cb_data, cb); break; /* not yet supported */ case FSDB_TREE_CBT_ARRAY_BEGIN: __DumpArray2((fsdbTreeCBDataArrayBegin*)tree_cb_data, cb); break; case FSDB_TREE_CBT_ARRAY_END: break; case FSDB_TREE_CBT_FILE_TYPE: case FSDB_TREE_CBT_SIMULATOR_VERSION: case FSDB_TREE_CBT_SIMULATION_DATE: case FSDB_TREE_CBT_X_AXIS_SCALE: case FSDB_TREE_CBT_END_ALL_TREE: case FSDB_TREE_CBT_RECORD_BEGIN: case FSDB_TREE_CBT_RECORD_END: break; default: return(FALSE); } return(TRUE); } extern "C" void fsdbReaderReadScopeVarTree2(void *ctx,void (*cb)(void *)) { ffrObject *fsdb_obj = (ffrObject *)ctx; fsdb_obj->ffrSetTreeCBFunc(__MyTreeCB2, (void *) cb); fsdb_obj->ffrReadScopeVarTree(); } #else static void dummy_compilation_unit(void) { } #endif gtkwave-3.3.86/src/fsdb_wrapper_api.h0000664000175000017500000000436113166335473017057 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2013-2015. * * 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. */ #ifndef FSDB_WRAPPER_API_H #define FSDB_WRAPPER_API_H #if defined(FSDB_IS_PRESENT) && defined(FSDB_NSYS_IS_PRESENT) #define WAVE_FSDB_READER_IS_PRESENT #endif #ifdef __cplusplus extern "C" { #endif #include #include #include #include #ifdef HAVE_INTTYPES_H #include #endif struct fsdbReaderGetStatistics_t { int varCount; int scopeCount; }; struct fsdbReaderBlackoutChain_t { uint64_t tim; unsigned active : 1; }; void *fsdbReaderOpenFile(char *nam); void fsdbReaderReadScopeVarTree(void *ctx,void (*cb)(void *)); int fsdbReaderGetMaxVarIdcode(void *ctx); struct fsdbReaderGetStatistics_t *fsdbReaderGetStatistics(void *ctx); void fsdbReaderAddToSignalList(void *ctx, int i); void fsdbReaderResetSignalList(void *ctx); void fsdbReaderLoadSignals(void *ctx); void *fsdbReaderCreateVCTraverseHandle(void *ctx, int i); int fsdbReaderHasIncoreVC(void *ctx, void *hdl); void fsdbReaderFree(void *ctx, void *hdl); uint64_t fsdbReaderGetMinXTag(void *ctx, void *hdl); uint64_t fsdbReaderGetMaxXTag(void *ctx, void *hdl); int fsdbReaderGotoXTag(void *ctx, void *hdl, uint64_t tim); uint64_t fsdbReaderGetXTag(void *ctx, void *hdl, int *rc); int fsdbReaderGetVC(void *ctx, void *hdl, void **val_ptr); int fsdbReaderGotoNextVC(void *ctx, void *hdl); void fsdbReaderUnloadSignals(void *ctx); void fsdbReaderClose(void *ctx); int fsdbReaderGetBytesPerBit(void *hdl); int fsdbReaderGetBitSize(void *hdl); int fsdbReaderGetVarType(void *hdl); char *fsdbReaderTranslateVC(void *hdl, void *val_ptr); int fsdbReaderExtractScaleUnit(void *ctx, int *mult, char *scale); int fsdbReaderGetMinFsdbTag64(void *ctx, uint64_t *tim); int fsdbReaderGetMaxFsdbTag64(void *ctx, uint64_t *tim); unsigned int fsdbReaderGetDumpOffRange(void *ctx, struct fsdbReaderBlackoutChain_t **r); int fsdbReaderGetTransInfo(void *ctx, int idx, void **trans_info); void fsdbReaderReadScopeVarTree2(void *ctx,void (*cb)(void *)); #ifdef __cplusplus } #endif #endif gtkwave-3.3.86/src/treesearch_gtk2.c0000664000175000017500000022353713166335473016627 0ustar bybellbybell/* * Copyright (c) Tristan Gingold and Tony Bybell 2006-2017. * * 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. */ #include #include "globals.h" #include #include #include #include #include "gtk12compat.h" #include "analyzer.h" #include "tree.h" #include "symbol.h" #include "vcd.h" #include "lx2.h" #include "busy.h" #include "debug.h" #include "hierpack.h" #include "tcl_helper.h" WAVE_NODEVARTYPE_STR WAVE_NODEVARDIR_STR WAVE_NODEVARDATATYPE_STR enum { VIEW_DRAG_INACTIVE, TREE_TO_VIEW_DRAG_ACTIVE, SEARCH_TO_VIEW_DRAG_ACTIVE }; /* Treesearch is a pop-up window used to select signals. It is composed of two main areas: * A tree area to select the hierarchy [tree area] * The (filtered) list of signals contained in the hierarchy [signal area]. */ /* SIG_ROOT is the branch currently selected. Signals of SIG_ROOT are displayed in the signals window. */ /* Only signals which match the filter are displayed in the signal area. */ /* The signal area is based on a tree view which requires a store model. This store model contains the list of signals to be displayed. */ enum { NAME_COLUMN, TREE_COLUMN, TYPE_COLUMN, DIR_COLUMN, DTYPE_COLUMN, N_COLUMNS }; /* list of autocoalesced (synthesized) filter names that need to be freed at some point) */ void free_afl(void) { struct autocoalesce_free_list *at; while(GLOBALS->afl_treesearch_gtk2_c_1) { if(GLOBALS->afl_treesearch_gtk2_c_1->name) free_2(GLOBALS->afl_treesearch_gtk2_c_1->name); at = GLOBALS->afl_treesearch_gtk2_c_1->next; free_2(GLOBALS->afl_treesearch_gtk2_c_1); GLOBALS->afl_treesearch_gtk2_c_1 = at; } } /* point to pure signame (remove hierarchy) for fill_sig_store() */ static char *prune_hierarchy(char *nam) { char cmpchar = GLOBALS->alt_hier_delimeter ? GLOBALS->alt_hier_delimeter : '.'; char *t = nam; char *lastmatch = NULL; while(t && *t) { if(*t == cmpchar) { lastmatch = t+1; } t++; } return(lastmatch ? lastmatch : nam); } /* fix escaped signal names */ static void *fix_escaped_names(char *s, int do_free) { char *s2 = s; int found = 0; while(*s2) { if((*s2) == VCDNAM_ESCAPE) { found = 1; break; } s2++; } if(found) { s2 = strdup_2(s); if(do_free) free_2(s); s = s2; while(*s2) { if(*s2 == VCDNAM_ESCAPE) { *s2 = GLOBALS->hier_delimeter; } /* restore back to normal */ s2++; } } return(s); } /* truncate VHDL types to string directly after final '.' */ char *varxt_fix(char *s) { char *pnt = strrchr(s, '.'); return(pnt ? (pnt+1) : s); } /* Fill the store model using current SIG_ROOT and FILTER_STR. */ void fill_sig_store (void) { struct tree *t; struct tree *t_prev = NULL; GtkTreeIter iter; if(GLOBALS->selected_sig_name) { free_2(GLOBALS->selected_sig_name); GLOBALS->selected_sig_name = NULL; } free_afl(); gtk_list_store_clear (GLOBALS->sig_store_treesearch_gtk2_c_1); for (t = GLOBALS->sig_root_treesearch_gtk2_c_1; t != NULL; t = t->next) { int i = t->t_which; char *s, *tmp2; int vartype; int vardir; int is_tname = 0; int wrexm; int vardt; unsigned int varxt; char *varxt_pnt; if(i < 0) { t_prev = NULL; continue; } if(t_prev) /* duplicates removal for faulty dumpers */ { if(!strcmp(t_prev->name, t->name)) { continue; } } t_prev = t; varxt = GLOBALS->facs[i]->n->varxt; varxt_pnt = varxt ? varxt_fix(GLOBALS->subvar_pnt[varxt]) : NULL; vartype = GLOBALS->facs[i]->n->vartype; if((vartype < 0) || (vartype > ND_VARTYPE_MAX)) { vartype = 0; } vardir = GLOBALS->facs[i]->n->vardir; /* two bit already chops down to 0..3, but this doesn't hurt */ if((vardir < 0) || (vardir > ND_DIR_MAX)) { vardir = 0; } vardt = GLOBALS->facs[i]->n->vardt; if((vardt < 0) || (vardt > ND_VDT_MAX)) { vardt = 0; } if(!GLOBALS->facs[i]->vec_root) { is_tname = 1; s = t->name; s = fix_escaped_names(s, 0); } else { if(GLOBALS->autocoalesce) { char *p; if(GLOBALS->facs[i]->vec_root!=GLOBALS->facs[i]) continue; tmp2=makename_chain(GLOBALS->facs[i]); p = prune_hierarchy(tmp2); s=(char *)malloc_2(strlen(p)+4); strcpy(s,"[] "); strcpy(s+3, p); s = fix_escaped_names(s, 1); free_2(tmp2); } else { char *p = prune_hierarchy(GLOBALS->facs[i]->name); s=(char *)malloc_2(strlen(p)+4); strcpy(s,"[] "); strcpy(s+3, p); s = fix_escaped_names(s, 1); } } wrexm = 0; if ( (GLOBALS->filter_str_treesearch_gtk2_c_1 == NULL) || ((!GLOBALS->filter_noregex_treesearch_gtk2_c_1) && (wrexm = wave_regex_match(t->name, WAVE_REGEX_TREE)) && (!GLOBALS->filter_matlen_treesearch_gtk2_c_1)) || (GLOBALS->filter_matlen_treesearch_gtk2_c_1 && ((GLOBALS->filter_typ_treesearch_gtk2_c_1 == vardir) ^ GLOBALS->filter_typ_polarity_treesearch_gtk2_c_1) && (wrexm || (wrexm = wave_regex_match(t->name, WAVE_REGEX_TREE))) ) ) { gtk_list_store_prepend (GLOBALS->sig_store_treesearch_gtk2_c_1, &iter); if(is_tname) { gtk_list_store_set (GLOBALS->sig_store_treesearch_gtk2_c_1, &iter, NAME_COLUMN, s, TREE_COLUMN, t, TYPE_COLUMN, (((GLOBALS->supplemental_datatypes_encountered) && (!GLOBALS->supplemental_vartypes_encountered)) ? (varxt ? varxt_pnt : vardatatype_strings[vardt]) : vartype_strings[vartype]), DIR_COLUMN, vardir_strings[vardir], DTYPE_COLUMN, varxt ? varxt_pnt : vardatatype_strings[vardt], -1); if(s != t->name) { free_2(s); } } else { struct autocoalesce_free_list *a = calloc_2(1, sizeof(struct autocoalesce_free_list)); a->name = s; a->next = GLOBALS->afl_treesearch_gtk2_c_1; GLOBALS->afl_treesearch_gtk2_c_1 = a; gtk_list_store_set (GLOBALS->sig_store_treesearch_gtk2_c_1, &iter, NAME_COLUMN, s, TREE_COLUMN, t, TYPE_COLUMN, (((GLOBALS->supplemental_datatypes_encountered) && (!GLOBALS->supplemental_vartypes_encountered)) ? (varxt ? varxt_pnt : vardatatype_strings[vardt]) : vartype_strings[vartype]), DIR_COLUMN, vardir_strings[vardir], DTYPE_COLUMN, varxt ? varxt_pnt : vardatatype_strings[vardt], -1); } } else { if(s != t->name) { free_2(s); } } } } /* * tree open/close handling */ static void create_sst_nodes_if_necessary(GtkCTreeNode *node) { #ifndef WAVE_DISABLE_FAST_TREE if(node) { GtkCTreeRow *gctr = GTK_CTREE_ROW(node); struct tree *t = (struct tree *)(gctr->row.data); if(t->child) { GtkCTree *ctree = GLOBALS->ctree_main; GtkCTreeNode *n = gctr->children; gtk_clist_freeze(GTK_CLIST(ctree)); while(n) { GtkCTreeRow *g = GTK_CTREE_ROW(n); t = (struct tree *)(g->row.data); if(t->t_which < 0) { if(!t->children_in_gui) { t->children_in_gui = 1; maketree2(n, t, 0, n); } } n = GTK_CTREE_NODE_NEXT(n); } gtk_clist_thaw(GTK_CLIST(ctree)); } } #endif } int force_open_tree_node(char *name, int keep_path_nodes_open, struct tree **t_pnt) { GtkCTree *ctree = GLOBALS->ctree_main; int rv = 1 ; /* can possible open */ if(ctree && GLOBALS->any_tree_node) { int namlen = strlen(name); char *namecache = wave_alloca(namlen+1); char *name_end = name + namlen - 1; char *zap = name; GtkCTreeNode *node = GLOBALS->any_tree_node; GtkCTreeRow *gctr = GTK_CTREE_ROW(node); int depth = 1; strcpy(namecache, name); while(gctr->parent) { node = gctr->parent; gctr = GTK_CTREE_ROW(node); } for(;;) { struct tree *t = gctr->row.data; if(t_pnt) { *t_pnt = t; } while(*zap) { if(*zap != GLOBALS->hier_delimeter) { zap++; } else { *zap = 0; break; } } if(!strcmp(t->name, name)) { if(zap == name_end) { GtkCTreeNode **nodehist = wave_alloca(depth * sizeof(GtkCTreeNode *)); int *exp1 = wave_alloca(depth * sizeof(int)); int i = depth-1; nodehist[i] = node; exp1[i--] = 1; /* now work backwards up to parent getting the node open/close history*/ gctr = GTK_CTREE_ROW(node); while(gctr->parent) { node = gctr->parent; gctr = GTK_CTREE_ROW(node); nodehist[i] = node; exp1[i--] = gctr->expanded || (keep_path_nodes_open != 0); } gtk_clist_freeze(GTK_CLIST(ctree)); /* fully expand down */ for(i=0;i=0;i--) { if(exp1[i]) { gtk_ctree_expand(ctree, nodehist[i]); } else { gtk_ctree_collapse(ctree, nodehist[i]); } } gtk_clist_thaw(GTK_CLIST(ctree)); gtk_ctree_node_moveto(ctree, nodehist[depth-1], depth /*column*/, 0.5 /*row_align*/, 0.5 /*col_align*/); /* printf("[treeopennode] '%s' ok\n", name); */ rv = 0 ; /* opened */ GLOBALS->open_tree_nodes = xl_insert(namecache, GLOBALS->open_tree_nodes, NULL); return rv; } else { depth++; create_sst_nodes_if_necessary(node); node = gctr->children; if(!node) break; gctr = GTK_CTREE_ROW(node); if(!gctr) break; name = ++zap; continue; } } node = gctr->sibling; if(!node) break; gctr = GTK_CTREE_ROW(node); } /* printf("[treeopennode] '%s' failed\n", name); */ } else { rv = -1 ; /* tree does not exist */ } return rv ; } void dump_open_tree_nodes(FILE *wave, xl_Tree *t) { if(t->left) { dump_open_tree_nodes(wave, t->left); } fprintf(wave, "[treeopen] %s\n", t->item); if(t->right) { dump_open_tree_nodes(wave, t->right); } } static void generic_tree_expand_collapse_callback(int is_expand, GtkCTreeNode *node) { GtkCTreeRow **gctr; int depth, i; int len = 1; char *tstring; char hier_suffix[2]; int found; hier_suffix[0] = GLOBALS->hier_delimeter; hier_suffix[1] = 0; if(!node) return; depth = GTK_CTREE_ROW(node)->level; gctr = wave_alloca(depth * sizeof(GtkCTreeRow *)); for(i=depth-1;i>=0;i--) { struct tree *t; gctr[i] = GTK_CTREE_ROW(node); t = gctr[i]->row.data; len += (strlen(t->name) + 1); node = gctr[i]->parent; } tstring = wave_alloca(len); memset(tstring, 0, len); for(i=0;irow.data; strcat(tstring, t->name); strcat(tstring, hier_suffix); } if(GLOBALS->open_tree_nodes) /* cut down on chatter to Tcl clients */ { GLOBALS->open_tree_nodes = xl_splay(tstring, GLOBALS->open_tree_nodes); if(!strcmp(GLOBALS->open_tree_nodes->item, tstring)) { found = 1; } else { found = 0; } } else { found = 0; } if(is_expand) { GLOBALS->open_tree_nodes = xl_insert(tstring, GLOBALS->open_tree_nodes, NULL); if(!found) { gtkwavetcl_setvar(WAVE_TCLCB_TREE_EXPAND, tstring, WAVE_TCLCB_TREE_EXPAND_FLAGS); } } else { GLOBALS->open_tree_nodes = xl_delete(tstring, GLOBALS->open_tree_nodes); if(found) { gtkwavetcl_setvar(WAVE_TCLCB_TREE_COLLAPSE, tstring, WAVE_TCLCB_TREE_COLLAPSE_FLAGS); } } } static void tree_expand_callback(GtkCTree *ctree, GtkCTreeNode *node, gpointer user_data) { (void)ctree; (void)user_data; create_sst_nodes_if_necessary(node); generic_tree_expand_collapse_callback(1, node); #ifdef WAVE_ALLOW_QUARTZ_FLUSH_WORKAROUND #ifdef MAC_INTEGRATION /* workaround for ctree not rendering properly in OSX */ gtk_widget_hide(GTK_WIDGET(GLOBALS->tree_treesearch_gtk2_c_1)); gtk_widget_show(GTK_WIDGET(GLOBALS->tree_treesearch_gtk2_c_1)); #endif #endif } static void tree_collapse_callback(GtkCTree *ctree, GtkCTreeNode *node, gpointer user_data) { (void)ctree; (void)user_data; generic_tree_expand_collapse_callback(0, node); #ifdef WAVE_ALLOW_QUARTZ_FLUSH_WORKAROUND #ifdef MAC_INTEGRATION /* workaround for ctree not rendering properly in OSX */ gtk_widget_hide(GTK_WIDGET(GLOBALS->tree_treesearch_gtk2_c_1)); gtk_widget_show(GTK_WIDGET(GLOBALS->tree_treesearch_gtk2_c_1)); #endif #endif } void select_tree_node(char *name) { GtkCTree *ctree = GLOBALS->ctree_main; if(ctree && GLOBALS->any_tree_node) { int namlen = strlen(name); char *namecache = wave_alloca(namlen+1); char *name_end = name + namlen - 1; char *zap = name; GtkCTreeNode *node = GLOBALS->any_tree_node; GtkCTreeRow *gctr = GTK_CTREE_ROW(node); strcpy(namecache, name); while(gctr->parent) { node = gctr->parent; gctr = GTK_CTREE_ROW(node); } for(;;) { struct tree *t = gctr->row.data; while(*zap) { if(*zap != GLOBALS->hier_delimeter) { zap++; } else { *zap = 0; break; } } if(!strcmp(t->name, name)) { if(zap == name_end) { /* printf("[treeselectnode] '%s' ok\n", name); */ gtk_ctree_select(ctree, node); GLOBALS->sst_sig_root_treesearch_gtk2_c_1 = t; GLOBALS->sig_root_treesearch_gtk2_c_1 = t->child; fill_sig_store (); return; } else { node = gctr->children; gctr = GTK_CTREE_ROW(node); if(!gctr) break; name = ++zap; continue; } } node = gctr->sibling; if(!node) break; gctr = GTK_CTREE_ROW(node); } /* printf("[treeselectnode] '%s' failed\n", name); */ } } /* Callbacks for tree area when a row is selected/deselected. */ static void select_row_callback(GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data) { (void)widget; (void)column; (void)event; (void)data; struct tree *t; GtkCTreeNode* node = gtk_ctree_node_nth(GLOBALS->ctree_main, row); if(node) { GtkCTreeRow **gctr; int depth, i; int len = 1; char *tstring; char hier_suffix[2]; hier_suffix[0] = GLOBALS->hier_delimeter; hier_suffix[1] = 0; depth = GTK_CTREE_ROW(node)->level; gctr = wave_alloca(depth * sizeof(GtkCTreeRow *)); for(i=depth-1;i>=0;i--) { gctr[i] = GTK_CTREE_ROW(node); t = gctr[i]->row.data; len += (strlen(t->name) + 1); node = gctr[i]->parent; } tstring = wave_alloca(len); memset(tstring, 0, len); for(i=0;irow.data; strcat(tstring, t->name); strcat(tstring, hier_suffix); } if(GLOBALS->selected_hierarchy_name) { free_2(GLOBALS->selected_hierarchy_name); } GLOBALS->selected_hierarchy_name = strdup_2(tstring); } t=(struct tree *)gtk_clist_get_row_data(GTK_CLIST(GLOBALS->ctree_main), row); DEBUG(printf("TS: %08x %s\n",t,t->name)); GLOBALS->sst_sig_root_treesearch_gtk2_c_1 = t; GLOBALS->sig_root_treesearch_gtk2_c_1 = t->child; fill_sig_store (); gtkwavetcl_setvar(WAVE_TCLCB_TREE_SELECT, GLOBALS->selected_hierarchy_name, WAVE_TCLCB_TREE_SELECT_FLAGS); } static void unselect_row_callback(GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data) { (void)widget; (void)column; (void)event; (void)data; struct tree *t; if(GLOBALS->selected_hierarchy_name) { gtkwavetcl_setvar(WAVE_TCLCB_TREE_UNSELECT, GLOBALS->selected_hierarchy_name, WAVE_TCLCB_TREE_UNSELECT_FLAGS); free_2(GLOBALS->selected_hierarchy_name); GLOBALS->selected_hierarchy_name = NULL; } t=(struct tree *)gtk_clist_get_row_data(GTK_CLIST(GLOBALS->ctree_main), row); if(t) { /* unused */ } DEBUG(printf("TU: %08x %s\n",t,t->name)); GLOBALS->sst_sig_root_treesearch_gtk2_c_1 = NULL; GLOBALS->sig_root_treesearch_gtk2_c_1 = GLOBALS->treeroot; fill_sig_store (); } /* Signal callback for the filter widget. This catch the return key to update the signal area. */ static gboolean filter_edit_cb (GtkWidget *widget, GdkEventKey *ev, gpointer *data) { (void)data; /* Maybe this test is too strong ? */ if (ev->keyval == GDK_Return) { const char *t; /* Get the filter string, save it and change the store. */ if(GLOBALS->filter_str_treesearch_gtk2_c_1) { free_2((char *)GLOBALS->filter_str_treesearch_gtk2_c_1); GLOBALS->filter_str_treesearch_gtk2_c_1 = NULL; } t = gtk_entry_get_text (GTK_ENTRY (widget)); if (t == NULL || *t == 0) GLOBALS->filter_str_treesearch_gtk2_c_1 = NULL; else { int i; GLOBALS->filter_str_treesearch_gtk2_c_1 = malloc_2(strlen(t) + 1); strcpy(GLOBALS->filter_str_treesearch_gtk2_c_1, t); GLOBALS->filter_typ_treesearch_gtk2_c_1 = ND_DIR_UNSPECIFIED; GLOBALS->filter_typ_polarity_treesearch_gtk2_c_1 = 0; GLOBALS->filter_matlen_treesearch_gtk2_c_1 = 0; GLOBALS->filter_noregex_treesearch_gtk2_c_1 = 0; if(GLOBALS->filter_str_treesearch_gtk2_c_1[0] == '+') { for(i=0;i<=ND_DIR_MAX;i++) { int tlen = strlen(vardir_strings[i]); if(!strncasecmp(vardir_strings[i], GLOBALS->filter_str_treesearch_gtk2_c_1 + 1, tlen)) { if(GLOBALS->filter_str_treesearch_gtk2_c_1[tlen + 1] == '+') { GLOBALS->filter_matlen_treesearch_gtk2_c_1 = tlen + 2; GLOBALS->filter_typ_treesearch_gtk2_c_1 = i; if(GLOBALS->filter_str_treesearch_gtk2_c_1[tlen + 2] == 0) { GLOBALS->filter_noregex_treesearch_gtk2_c_1 = 1; } } } } } else if(GLOBALS->filter_str_treesearch_gtk2_c_1[0] == '-') { for(i=0;i<=ND_DIR_MAX;i++) { int tlen = strlen(vardir_strings[i]); if(!strncasecmp(vardir_strings[i], GLOBALS->filter_str_treesearch_gtk2_c_1 + 1, tlen)) { if(GLOBALS->filter_str_treesearch_gtk2_c_1[tlen + 1] == '-') { GLOBALS->filter_matlen_treesearch_gtk2_c_1 = tlen + 2; GLOBALS->filter_typ_treesearch_gtk2_c_1 = i; GLOBALS->filter_typ_polarity_treesearch_gtk2_c_1 = 1; /* invert via XOR with 1 */ if(GLOBALS->filter_str_treesearch_gtk2_c_1[tlen + 2] == 0) { GLOBALS->filter_noregex_treesearch_gtk2_c_1 = 1; } } } } } wave_regex_compile(GLOBALS->filter_str_treesearch_gtk2_c_1 + GLOBALS->filter_matlen_treesearch_gtk2_c_1, WAVE_REGEX_TREE); } fill_sig_store (); } return FALSE; } /* * for dynamic updates, simply fake the return key to the function above */ static void press_callback (GtkWidget *widget, gpointer *data) { GdkEventKey ev; ev.keyval = GDK_Return; filter_edit_cb (widget, &ev, data); } /* * select/unselect all in treeview */ void treeview_select_all_callback(void) { GtkTreeSelection* ts = gtk_tree_view_get_selection(GTK_TREE_VIEW(GLOBALS->dnd_sigview)); gtk_tree_selection_select_all(ts); } void treeview_unselect_all_callback(void) { GtkTreeSelection* ts = gtk_tree_view_get_selection(GTK_TREE_VIEW(GLOBALS->dnd_sigview)); gtk_tree_selection_unselect_all(ts); } int treebox_is_active(void) { return(GLOBALS->is_active_treesearch_gtk2_c_6); } static void enter_callback_e(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; G_CONST_RETURN gchar *entry_text; int len; entry_text = gtk_entry_get_text(GTK_ENTRY(GLOBALS->entry_a_treesearch_gtk2_c_2)); entry_text = entry_text ? entry_text : ""; DEBUG(printf("Entry contents: %s\n", entry_text)); if(!(len=strlen(entry_text))) GLOBALS->entrybox_text_local_treesearch_gtk2_c_3=NULL; else strcpy((GLOBALS->entrybox_text_local_treesearch_gtk2_c_3=(char *)malloc_2(len+1)),entry_text); wave_gtk_grab_remove(GLOBALS->window1_treesearch_gtk2_c_3); gtk_widget_destroy(GLOBALS->window1_treesearch_gtk2_c_3); GLOBALS->window1_treesearch_gtk2_c_3 = NULL; GLOBALS->cleanup_e_treesearch_gtk2_c_3(); } static void destroy_callback_e(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; DEBUG(printf("Entry Cancel\n")); GLOBALS->entrybox_text_local_treesearch_gtk2_c_3=NULL; wave_gtk_grab_remove(GLOBALS->window1_treesearch_gtk2_c_3); gtk_widget_destroy(GLOBALS->window1_treesearch_gtk2_c_3); GLOBALS->window1_treesearch_gtk2_c_3 = NULL; } static void entrybox_local(char *title, int width, char *default_text, int maxch, GtkSignalFunc func) { GtkWidget *vbox, *hbox; GtkWidget *button1, *button2; GLOBALS->cleanup_e_treesearch_gtk2_c_3=func; /* fix problem where ungrab doesn't occur if button pressed + simultaneous accelerator key occurs */ if(GLOBALS->in_button_press_wavewindow_c_1) { gdk_pointer_ungrab(GDK_CURRENT_TIME); } /* create a new modal window */ GLOBALS->window1_treesearch_gtk2_c_3 = gtk_window_new(GLOBALS->disable_window_manager ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL); install_focus_cb(GLOBALS->window1_treesearch_gtk2_c_3, ((char *)&GLOBALS->window1_treesearch_gtk2_c_3) - ((char *)GLOBALS)); gtk_widget_set_usize( GTK_WIDGET (GLOBALS->window1_treesearch_gtk2_c_3), width, 60); gtk_window_set_title(GTK_WINDOW (GLOBALS->window1_treesearch_gtk2_c_3), title); gtkwave_signal_connect(GTK_OBJECT (GLOBALS->window1_treesearch_gtk2_c_3), "delete_event",(GtkSignalFunc) destroy_callback_e, NULL); vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (GLOBALS->window1_treesearch_gtk2_c_3), vbox); gtk_widget_show (vbox); GLOBALS->entry_a_treesearch_gtk2_c_2 = gtk_entry_new_with_max_length (maxch); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->entry_a_treesearch_gtk2_c_2), "activate",GTK_SIGNAL_FUNC(enter_callback_e),GLOBALS->entry_a_treesearch_gtk2_c_2); gtk_entry_set_text (GTK_ENTRY (GLOBALS->entry_a_treesearch_gtk2_c_2), default_text); gtk_entry_select_region (GTK_ENTRY (GLOBALS->entry_a_treesearch_gtk2_c_2),0, GTK_ENTRY(GLOBALS->entry_a_treesearch_gtk2_c_2)->text_length); gtk_box_pack_start (GTK_BOX (vbox), GLOBALS->entry_a_treesearch_gtk2_c_2, TRUE, TRUE, 0); gtk_widget_show (GLOBALS->entry_a_treesearch_gtk2_c_2); hbox = gtk_hbox_new (FALSE, 1); gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0); gtk_widget_show (hbox); button1 = gtk_button_new_with_label ("OK"); gtk_widget_set_usize(button1, 100, -1); gtkwave_signal_connect(GTK_OBJECT (button1), "clicked", GTK_SIGNAL_FUNC(enter_callback_e), NULL); gtk_widget_show (button1); gtk_container_add (GTK_CONTAINER (hbox), button1); GTK_WIDGET_SET_FLAGS (button1, GTK_CAN_DEFAULT); gtkwave_signal_connect_object (GTK_OBJECT (button1), "realize", (GtkSignalFunc) gtk_widget_grab_default, GTK_OBJECT (button1)); button2 = gtk_button_new_with_label ("Cancel"); gtk_widget_set_usize(button2, 100, -1); gtkwave_signal_connect(GTK_OBJECT (button2), "clicked", GTK_SIGNAL_FUNC(destroy_callback_e), NULL); GTK_WIDGET_SET_FLAGS (button2, GTK_CAN_DEFAULT); gtk_widget_show (button2); gtk_container_add (GTK_CONTAINER (hbox), button2); gtk_widget_show(GLOBALS->window1_treesearch_gtk2_c_3); wave_gtk_grab_add(GLOBALS->window1_treesearch_gtk2_c_3); } /***************************************************************************/ /* Callback for insert/replace/append buttions. This call-back is called for every signal selected. */ enum cb_action { ACTION_INSERT, ACTION_REPLACE, ACTION_APPEND, ACTION_PREPEND }; static void sig_selection_foreach (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { (void)path; (void)data; struct tree *sel; /* const enum cb_action action = (enum cb_action)data; */ int i; int low, high; /* Get the tree. */ gtk_tree_model_get (model, iter, TREE_COLUMN, &sel, -1); if(!sel) return; low = fetchlow(sel)->t_which; high = fetchhigh(sel)->t_which; /* Add signals and vectors. */ for(i=low;i<=high;i++) { int len; struct symbol *s, *t; s=GLOBALS->facs[i]; t=s->vec_root; if((t)&&(GLOBALS->autocoalesce)) { if(get_s_selected(t)) { set_s_selected(t,0); len=0; while(t) { len++; t=t->vec_chain; } if(len) add_vector_chain(s->vec_root, len); } } else { AddNodeUnroll(s->n, NULL); } } } static void sig_selection_foreach_finalize (gpointer data) { const enum cb_action action = (enum cb_action)data; if (action == ACTION_REPLACE || action == ACTION_INSERT || action == ACTION_PREPEND) { Trptr tfirst=NULL, tlast=NULL; Trptr t; Trptr *tp = NULL; int numhigh = 0; int it; if (action == ACTION_REPLACE) { tfirst=GLOBALS->traces.first; tlast=GLOBALS->traces.last; /* cache for highlighting */ } GLOBALS->traces.buffercount=GLOBALS->traces.total; GLOBALS->traces.buffer=GLOBALS->traces.first; GLOBALS->traces.bufferlast=GLOBALS->traces.last; GLOBALS->traces.first=GLOBALS->tcache_treesearch_gtk2_c_2.first; GLOBALS->traces.last=GLOBALS->tcache_treesearch_gtk2_c_2.last; GLOBALS->traces.total=GLOBALS->tcache_treesearch_gtk2_c_2.total; if (action == ACTION_REPLACE) { t = GLOBALS->traces.first; while(t) { if(t->flags & TR_HIGHLIGHT) { numhigh++; } t = t->t_next; } if(numhigh) { tp = calloc_2(numhigh, sizeof(Trptr)); t = GLOBALS->traces.first; it = 0; while(t) { if(t->flags & TR_HIGHLIGHT) { tp[it++] = t; } t = t->t_next; } } } if(action == ACTION_PREPEND) { PrependBuffer(); } else { PasteBuffer(); } GLOBALS->traces.buffercount=GLOBALS->tcache_treesearch_gtk2_c_2.buffercount; GLOBALS->traces.buffer=GLOBALS->tcache_treesearch_gtk2_c_2.buffer; GLOBALS->traces.bufferlast=GLOBALS->tcache_treesearch_gtk2_c_2.bufferlast; if (action == ACTION_REPLACE) { for(it=0;itflags |= TR_HIGHLIGHT; } t = tfirst; while(t) { t->flags &= ~TR_HIGHLIGHT; if(t==tlast) break; t=t->t_next; } CutBuffer(); while(tfirst) { tfirst->flags |= TR_HIGHLIGHT; if(tfirst==tlast) break; tfirst=tfirst->t_next; } if(tp) { free_2(tp); } } } } static void sig_selection_foreach_preload_lx2 (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { (void)path; (void)data; struct tree *sel; /* const enum cb_action action = (enum cb_action)data; */ int i; int low, high; /* Get the tree. */ gtk_tree_model_get (model, iter, TREE_COLUMN, &sel, -1); if(!sel) return; low = fetchlow(sel)->t_which; high = fetchhigh(sel)->t_which; /* If signals are vectors, coalesces vectors if so. */ for(i=low;i<=high;i++) { struct symbol *s; s=GLOBALS->facs[i]; if(s->vec_root) { set_s_selected(s->vec_root, GLOBALS->autocoalesce); } } /* LX2 */ if(GLOBALS->is_lx2) { for(i=low;i<=high;i++) { struct symbol *s, *t; s=GLOBALS->facs[i]; t=s->vec_root; if((t)&&(GLOBALS->autocoalesce)) { if(get_s_selected(t)) { while(t) { if(t->n->mv.mvlfac) { lx2_set_fac_process_mask(t->n); GLOBALS->pre_import_treesearch_gtk2_c_1++; } t=t->vec_chain; } } } else { if(s->n->mv.mvlfac) { lx2_set_fac_process_mask(s->n); GLOBALS->pre_import_treesearch_gtk2_c_1++; } } } } /* LX2 */ } static void action_callback(enum cb_action action) { GLOBALS->pre_import_treesearch_gtk2_c_1 = 0; /* once through to mass gather lx2 traces... */ gtk_tree_selection_selected_foreach (GLOBALS->sig_selection_treesearch_gtk2_c_1, &sig_selection_foreach_preload_lx2, (void *)action); if(GLOBALS->pre_import_treesearch_gtk2_c_1) { lx2_import_masked(); } /* then do */ if (action == ACTION_INSERT || action == ACTION_REPLACE || action == ACTION_PREPEND) { /* Save and clear current traces. */ memcpy(&GLOBALS->tcache_treesearch_gtk2_c_2,&GLOBALS->traces,sizeof(Traces)); GLOBALS->traces.total=0; GLOBALS->traces.first=GLOBALS->traces.last=NULL; } gtk_tree_selection_selected_foreach (GLOBALS->sig_selection_treesearch_gtk2_c_1, &sig_selection_foreach, (void *)action); sig_selection_foreach_finalize((void *)action); if(action == ACTION_APPEND) { GLOBALS->traces.scroll_top = GLOBALS->traces.scroll_bottom = GLOBALS->traces.last; } MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } static void insert_callback(GtkWidget *widget, GtkWidget *nothing) { (void)nothing; set_window_busy(widget); action_callback (ACTION_INSERT); set_window_idle(widget); } static void replace_callback(GtkWidget *widget, GtkWidget *nothing) { (void)nothing; set_window_busy(widget); action_callback (ACTION_REPLACE); set_window_idle(widget); } static void ok_callback(GtkWidget *widget, GtkWidget *nothing) { (void)nothing; set_window_busy(widget); action_callback (ACTION_APPEND); set_window_idle(widget); } static void destroy_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; GLOBALS->is_active_treesearch_gtk2_c_6=0; gtk_widget_destroy(GLOBALS->window_treesearch_gtk2_c_12); GLOBALS->window_treesearch_gtk2_c_12 = NULL; GLOBALS->dnd_sigview = NULL; GLOBALS->gtk2_tree_frame = NULL; GLOBALS->ctree_main = NULL; GLOBALS->filter_entry = NULL; /* when treebox() SST goes away after closed and rc hide_sst is true */ free_afl(); if(GLOBALS->selected_hierarchy_name) { free_2(GLOBALS->selected_hierarchy_name); GLOBALS->selected_hierarchy_name = NULL; } } /**********************************************************************/ static gboolean view_selection_func (GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, gpointer userdata) { (void)selection; (void)userdata; GtkTreeIter iter; if (gtk_tree_model_get_iter(model, &iter, path)) { gchar *name; gtk_tree_model_get(model, &iter, 0, &name, -1); if(GLOBALS->selected_sig_name) { free_2(GLOBALS->selected_sig_name); GLOBALS->selected_sig_name = NULL; } if (!path_currently_selected) { GLOBALS->selected_sig_name = strdup_2(name); gtkwavetcl_setvar(WAVE_TCLCB_TREE_SIG_SELECT, name, WAVE_TCLCB_TREE_SIG_SELECT_FLAGS); } else { gtkwavetcl_setvar(WAVE_TCLCB_TREE_SIG_UNSELECT, name, WAVE_TCLCB_TREE_SIG_UNSELECT_FLAGS); } g_free(name); } return TRUE; /* allow selection state to change */ } /**********************************************************************/ static gint button_press_event_std(GtkWidget *widget, GdkEventButton *event) { (void)widget; if(event->type == GDK_2BUTTON_PRESS) { if(GLOBALS->selected_hierarchy_name && GLOBALS->selected_sig_name) { char *sstr = wave_alloca(strlen(GLOBALS->selected_hierarchy_name) + strlen(GLOBALS->selected_sig_name) + 1); strcpy(sstr, GLOBALS->selected_hierarchy_name); strcat(sstr, GLOBALS->selected_sig_name); gtkwavetcl_setvar(WAVE_TCLCB_TREE_SIG_DOUBLE_CLICK, sstr, WAVE_TCLCB_TREE_SIG_DOUBLE_CLICK_FLAGS); } } return(FALSE); } static gint hier_top_button_press_event_std(GtkWidget *widget, GdkEventButton *event) { if((event->button == 3) && (event->type == GDK_BUTTON_PRESS)) { if(GLOBALS->sst_sig_root_treesearch_gtk2_c_1) { do_sst_popup_menu (widget, event); return(TRUE); } } return(FALSE); } /**********************************************************************/ /* * mainline.. */ void treebox(char *title, GtkSignalFunc func, GtkWidget *old_window) { GtkWidget *scrolled_win, *sig_scroll_win; GtkWidget *hbox; GtkWidget *button1, *button2, *button3, *button3a, *button4, *button5; GtkWidget *frameh, *sig_frame; GtkWidget *vbox, *vpan, *filter_hbox; GtkWidget *filter_label; GtkWidget *sig_view; GtkTooltips *tooltips; GtkCList *clist; /* fix problem where ungrab doesn't occur if button pressed + simultaneous accelerator key occurs */ if(GLOBALS->in_button_press_wavewindow_c_1) { gdk_pointer_ungrab(GDK_CURRENT_TIME); } if(old_window) { GLOBALS->is_active_treesearch_gtk2_c_6=1; GLOBALS->cleanup_treesearch_gtk2_c_8=func; goto do_tooltips; } if(GLOBALS->is_active_treesearch_gtk2_c_6) { if(GLOBALS->window_treesearch_gtk2_c_12) { gdk_window_raise(GLOBALS->window_treesearch_gtk2_c_12->window); } else { #if GTK_CHECK_VERSION(2,4,0) if(GLOBALS->expanderwindow) { gtk_expander_set_expanded(GTK_EXPANDER(GLOBALS->expanderwindow), TRUE); } #endif } return; } GLOBALS->is_active_treesearch_gtk2_c_6=1; GLOBALS->cleanup_treesearch_gtk2_c_8=func; /* create a new modal window */ GLOBALS->window_treesearch_gtk2_c_12 = gtk_window_new(GLOBALS->disable_window_manager ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL); install_focus_cb(GLOBALS->window_treesearch_gtk2_c_12, ((char *)&GLOBALS->window_treesearch_gtk2_c_12) - ((char *)GLOBALS)); gtk_window_set_title(GTK_WINDOW (GLOBALS->window_treesearch_gtk2_c_12), title); gtkwave_signal_connect(GTK_OBJECT (GLOBALS->window_treesearch_gtk2_c_12), "delete_event",(GtkSignalFunc) destroy_callback, NULL); do_tooltips: tooltips=gtk_tooltips_new_2(); GLOBALS->treesearch_gtk2_window_vbox = vbox = gtk_vbox_new (FALSE, 1); gtk_widget_show (vbox); gtkwave_signal_connect(GTK_OBJECT(vbox), "button_press_event",GTK_SIGNAL_FUNC(hier_top_button_press_event_std), NULL); vpan = gtk_vpaned_new (); gtk_widget_show (vpan); gtk_box_pack_start (GTK_BOX (vbox), vpan, TRUE, TRUE, 1); /* Hierarchy. */ GLOBALS->gtk2_tree_frame = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (GLOBALS->gtk2_tree_frame), 3); gtk_widget_show(GLOBALS->gtk2_tree_frame); gtk_paned_pack1 (GTK_PANED (vpan), GLOBALS->gtk2_tree_frame, TRUE, FALSE); GLOBALS->tree_treesearch_gtk2_c_1=gtk_ctree_new(1,0); GLOBALS->ctree_main=GTK_CTREE(GLOBALS->tree_treesearch_gtk2_c_1); gtk_clist_set_column_auto_resize (GTK_CLIST (GLOBALS->tree_treesearch_gtk2_c_1), 0, TRUE); gtk_widget_show(GLOBALS->tree_treesearch_gtk2_c_1); gtk_clist_set_use_drag_icons(GTK_CLIST (GLOBALS->tree_treesearch_gtk2_c_1), FALSE); clist=GTK_CLIST(GLOBALS->tree_treesearch_gtk2_c_1); gtkwave_signal_connect_object (GTK_OBJECT (clist), "select_row", GTK_SIGNAL_FUNC(select_row_callback), NULL); gtkwave_signal_connect_object (GTK_OBJECT (clist), "unselect_row", GTK_SIGNAL_FUNC(unselect_row_callback), NULL); gtkwave_signal_connect_object (GTK_OBJECT (clist), "tree_expand", GTK_SIGNAL_FUNC(tree_expand_callback), NULL); gtkwave_signal_connect_object (GTK_OBJECT (clist), "tree_collapse", GTK_SIGNAL_FUNC(tree_collapse_callback), NULL); gtk_clist_freeze(clist); gtk_clist_clear(clist); decorated_module_cleanup(); maketree(NULL, GLOBALS->treeroot); gtk_clist_thaw(clist); scrolled_win = gtk_scrolled_window_new (NULL, NULL); gtk_widget_set_usize( GTK_WIDGET (scrolled_win), -1, 50); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_show(scrolled_win); gtk_container_add (GTK_CONTAINER (scrolled_win), GTK_WIDGET (GLOBALS->tree_treesearch_gtk2_c_1)); gtk_container_add (GTK_CONTAINER (GLOBALS->gtk2_tree_frame), scrolled_win); /* Signal names. */ GLOBALS->sig_store_treesearch_gtk2_c_1 = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); GLOBALS->sst_sig_root_treesearch_gtk2_c_1 = NULL; GLOBALS->sig_root_treesearch_gtk2_c_1 = GLOBALS->treeroot; fill_sig_store (); sig_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (GLOBALS->sig_store_treesearch_gtk2_c_1)); gtkwave_signal_connect(GTK_OBJECT(sig_view), "button_press_event",GTK_SIGNAL_FUNC(hier_top_button_press_event_std), NULL); /* The view now holds a reference. We can get rid of our own reference */ g_object_unref (G_OBJECT (GLOBALS->sig_store_treesearch_gtk2_c_1)); { GtkCellRenderer *renderer; GtkTreeViewColumn *column; renderer = gtk_cell_renderer_text_new (); switch(GLOBALS->loaded_file_type) { #ifdef EXTLOAD_SUFFIX case EXTLOAD_FILE: #endif case FST_FILE: /* fallthrough for Dir is deliberate for extload and FST */ if(GLOBALS->nonimplicit_direction_encountered) { column = gtk_tree_view_column_new_with_attributes ("Dir", renderer, "text", DIR_COLUMN, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (sig_view), column); } case AE2_FILE: case VCD_FILE: case VCD_RECODER_FILE: case DUMPLESS_FILE: column = gtk_tree_view_column_new_with_attributes (((GLOBALS->supplemental_datatypes_encountered) && (GLOBALS->supplemental_vartypes_encountered)) ? "VType" : "Type", renderer, "text", TYPE_COLUMN, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (sig_view), column); if((GLOBALS->supplemental_datatypes_encountered) && (GLOBALS->supplemental_vartypes_encountered)) { column = gtk_tree_view_column_new_with_attributes ("DType", renderer, "text", DTYPE_COLUMN, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (sig_view), column); } break; default: break; } column = gtk_tree_view_column_new_with_attributes ("Signals", renderer, "text", NAME_COLUMN, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (sig_view), column); /* Setup the selection handler */ GLOBALS->sig_selection_treesearch_gtk2_c_1 = gtk_tree_view_get_selection (GTK_TREE_VIEW (sig_view)); gtk_tree_selection_set_mode (GLOBALS->sig_selection_treesearch_gtk2_c_1, GTK_SELECTION_MULTIPLE); gtk_tree_selection_set_select_function (GLOBALS->sig_selection_treesearch_gtk2_c_1, view_selection_func, NULL, NULL); gtkwave_signal_connect(GTK_OBJECT(sig_view), "button_press_event",GTK_SIGNAL_FUNC(button_press_event_std), NULL); } GLOBALS->dnd_sigview = sig_view; dnd_setup(GLOBALS->dnd_sigview, GLOBALS->signalarea, 0); sig_frame = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (sig_frame), 3); gtk_widget_show(sig_frame); gtk_paned_pack2 (GTK_PANED (vpan), sig_frame, TRUE, FALSE); sig_scroll_win = gtk_scrolled_window_new (NULL, NULL); gtk_widget_set_usize (GTK_WIDGET (sig_scroll_win), 80, 100); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sig_scroll_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_show(sig_scroll_win); gtk_container_add (GTK_CONTAINER (sig_frame), sig_scroll_win); gtk_container_add (GTK_CONTAINER (sig_scroll_win), sig_view); gtk_widget_show (sig_view); /* Filter. */ filter_hbox = gtk_hbox_new (FALSE, 1); gtk_widget_show (filter_hbox); filter_label = gtk_label_new ("Filter:"); gtk_widget_show (filter_label); gtk_box_pack_start (GTK_BOX (filter_hbox), filter_label, FALSE, FALSE, 1); GLOBALS->filter_entry = gtk_entry_new (); if(GLOBALS->filter_str_treesearch_gtk2_c_1) { gtk_entry_set_text(GTK_ENTRY(GLOBALS->filter_entry), GLOBALS->filter_str_treesearch_gtk2_c_1); } gtk_widget_show (GLOBALS->filter_entry); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->filter_entry), "activate", GTK_SIGNAL_FUNC(press_callback), NULL); if(!GLOBALS->do_dynamic_treefilter) { gtkwave_signal_connect(GTK_OBJECT (GLOBALS->filter_entry), "key_press_event", (GtkSignalFunc) filter_edit_cb, NULL); } else { gtkwave_signal_connect(GTK_OBJECT(GLOBALS->filter_entry), "changed", GTK_SIGNAL_FUNC(press_callback), NULL); } gtk_tooltips_set_tip_2(tooltips, GLOBALS->filter_entry, "Add a POSIX filter. " "'.*' matches any number of characters," " '.' matches any character. Hit Return to apply." " The filter may be preceded with the port direction if it exists such as ++ (show only non-port), +I+, +O+, +IO+, etc." " Use -- to exclude all non-ports (i.e., show only all ports), -I- to exclude all input ports, etc.", NULL); gtk_box_pack_start (GTK_BOX (filter_hbox), GLOBALS->filter_entry, FALSE, FALSE, 1); gtk_box_pack_start (GTK_BOX (vbox), filter_hbox, FALSE, FALSE, 1); /* Buttons. */ frameh = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (frameh), 3); gtk_widget_show(frameh); gtk_box_pack_start (GTK_BOX (vbox), frameh, FALSE, FALSE, 1); hbox = gtk_hbox_new (FALSE, 1); gtk_widget_show (hbox); button1 = gtk_button_new_with_label ("Append"); gtk_container_border_width (GTK_CONTAINER (button1), 3); gtkwave_signal_connect_object (GTK_OBJECT (button1), "clicked",GTK_SIGNAL_FUNC(ok_callback),GTK_OBJECT (GLOBALS->window_treesearch_gtk2_c_12)); gtk_widget_show (button1); gtk_tooltips_set_tip_2(tooltips, button1, "Add selected signal hierarchy to end of the display on the main window.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button1, TRUE, FALSE, 0); button2 = gtk_button_new_with_label (" Insert "); gtk_container_border_width (GTK_CONTAINER (button2), 3); gtkwave_signal_connect_object (GTK_OBJECT (button2), "clicked",GTK_SIGNAL_FUNC(insert_callback),GTK_OBJECT (GLOBALS->window_treesearch_gtk2_c_12)); gtk_widget_show (button2); gtk_tooltips_set_tip_2(tooltips, button2, "Add selected signal hierarchy after last highlighted signal on the main window.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button2, TRUE, FALSE, 0); button4 = gtk_button_new_with_label (" Replace "); gtk_container_border_width (GTK_CONTAINER (button4), 3); gtkwave_signal_connect_object (GTK_OBJECT (button4), "clicked",GTK_SIGNAL_FUNC(replace_callback),GTK_OBJECT (GLOBALS->window_treesearch_gtk2_c_12)); gtk_widget_show (button4); gtk_tooltips_set_tip_2(tooltips, button4, "Replace highlighted signals on the main window with signals selected above.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button4, TRUE, FALSE, 0); button5 = gtk_button_new_with_label (" Exit "); gtk_container_border_width (GTK_CONTAINER (button5), 3); gtkwave_signal_connect_object (GTK_OBJECT (button5), "clicked",GTK_SIGNAL_FUNC(destroy_callback),GTK_OBJECT (GLOBALS->window_treesearch_gtk2_c_12)); gtk_tooltips_set_tip_2(tooltips, button5, "Do nothing and return to the main window.",NULL); gtk_widget_show (button5); gtk_box_pack_start (GTK_BOX (hbox), button5, TRUE, FALSE, 0); gtk_container_add (GTK_CONTAINER (frameh), hbox); gtk_container_add (GTK_CONTAINER (GLOBALS->window_treesearch_gtk2_c_12), vbox); gtk_window_set_default_size (GTK_WINDOW (GLOBALS->window_treesearch_gtk2_c_12), 200, 400); gtk_widget_show(GLOBALS->window_treesearch_gtk2_c_12); } /* * for use with expander in gtk2.4 and higher... */ GtkWidget* treeboxframe(char *title, GtkSignalFunc func) { (void)title; GtkWidget *scrolled_win, *sig_scroll_win; GtkWidget *hbox; GtkWidget *button1, *button2, *button3, *button3a, *button4; GtkWidget *frameh, *sig_frame; GtkWidget *vbox, *vpan, *filter_hbox; GtkWidget *filter_label; GtkWidget *sig_view; GtkTooltips *tooltips; GtkCList *clist; GLOBALS->is_active_treesearch_gtk2_c_6=1; GLOBALS->cleanup_treesearch_gtk2_c_8=func; /* create a new modal window */ tooltips=gtk_tooltips_new_2(); vbox = gtk_vbox_new (FALSE, 1); gtk_widget_show (vbox); gtkwave_signal_connect(GTK_OBJECT(vbox), "button_press_event",GTK_SIGNAL_FUNC(hier_top_button_press_event_std), NULL); vpan = gtk_vpaned_new (); /* GLOBALS->sst_vpaned is to be used to clone position over during reload */ GLOBALS->sst_vpaned = (GtkPaned *)vpan; if(GLOBALS->vpanedwindow_size_cache) { gtk_paned_set_position(GTK_PANED(GLOBALS->sst_vpaned), GLOBALS->vpanedwindow_size_cache); GLOBALS->vpanedwindow_size_cache = 0; } gtk_widget_show (vpan); gtk_box_pack_start (GTK_BOX (vbox), vpan, TRUE, TRUE, 1); /* Hierarchy. */ GLOBALS->gtk2_tree_frame = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (GLOBALS->gtk2_tree_frame), 3); gtk_widget_show(GLOBALS->gtk2_tree_frame); gtk_paned_pack1 (GTK_PANED (vpan), GLOBALS->gtk2_tree_frame, TRUE, FALSE); GLOBALS->tree_treesearch_gtk2_c_1=gtk_ctree_new(1,0); GLOBALS->ctree_main=GTK_CTREE(GLOBALS->tree_treesearch_gtk2_c_1); gtk_clist_set_column_auto_resize (GTK_CLIST (GLOBALS->tree_treesearch_gtk2_c_1), 0, TRUE); gtk_widget_show(GLOBALS->tree_treesearch_gtk2_c_1); clist=GTK_CLIST(GLOBALS->tree_treesearch_gtk2_c_1); gtkwave_signal_connect_object (GTK_OBJECT (clist), "select_row", GTK_SIGNAL_FUNC(select_row_callback), NULL); gtkwave_signal_connect_object (GTK_OBJECT (clist), "unselect_row", GTK_SIGNAL_FUNC(unselect_row_callback), NULL); gtkwave_signal_connect_object (GTK_OBJECT (clist), "tree_expand", GTK_SIGNAL_FUNC(tree_expand_callback), NULL); gtkwave_signal_connect_object (GTK_OBJECT (clist), "tree_collapse", GTK_SIGNAL_FUNC(tree_collapse_callback), NULL); gtk_clist_freeze(clist); gtk_clist_clear(clist); decorated_module_cleanup(); maketree(NULL, GLOBALS->treeroot); gtk_clist_thaw(clist); scrolled_win = gtk_scrolled_window_new (NULL, NULL); gtk_widget_set_usize( GTK_WIDGET (scrolled_win), -1, 50); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_show(scrolled_win); gtk_container_add (GTK_CONTAINER (scrolled_win), GTK_WIDGET (GLOBALS->tree_treesearch_gtk2_c_1)); gtk_container_add (GTK_CONTAINER (GLOBALS->gtk2_tree_frame), scrolled_win); /* Signal names. */ GLOBALS->sig_store_treesearch_gtk2_c_1 = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); GLOBALS->sst_sig_root_treesearch_gtk2_c_1 = NULL; GLOBALS->sig_root_treesearch_gtk2_c_1 = GLOBALS->treeroot; fill_sig_store (); sig_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (GLOBALS->sig_store_treesearch_gtk2_c_1)); gtkwave_signal_connect(GTK_OBJECT(sig_view), "button_press_event",GTK_SIGNAL_FUNC(hier_top_button_press_event_std), NULL); /* The view now holds a reference. We can get rid of our own reference */ g_object_unref (G_OBJECT (GLOBALS->sig_store_treesearch_gtk2_c_1)); { GtkCellRenderer *renderer; GtkTreeViewColumn *column; renderer = gtk_cell_renderer_text_new (); switch(GLOBALS->loaded_file_type) { #ifdef EXTLOAD_SUFFIX case EXTLOAD_FILE: #endif case FST_FILE: /* fallthrough for Dir is deliberate for extload and FST */ if(GLOBALS->nonimplicit_direction_encountered) { column = gtk_tree_view_column_new_with_attributes ("Dir", renderer, "text", DIR_COLUMN, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (sig_view), column); } case AE2_FILE: case VCD_FILE: case VCD_RECODER_FILE: case DUMPLESS_FILE: column = gtk_tree_view_column_new_with_attributes (((GLOBALS->supplemental_datatypes_encountered) && (GLOBALS->supplemental_vartypes_encountered)) ? "VType" : "Type", renderer, "text", TYPE_COLUMN, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (sig_view), column); if((GLOBALS->supplemental_datatypes_encountered) && (GLOBALS->supplemental_vartypes_encountered)) { column = gtk_tree_view_column_new_with_attributes ("DType", renderer, "text", DTYPE_COLUMN, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (sig_view), column); } break; default: break; } column = gtk_tree_view_column_new_with_attributes ("Signals", renderer, "text", NAME_COLUMN, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (sig_view), column); /* Setup the selection handler */ GLOBALS->sig_selection_treesearch_gtk2_c_1 = gtk_tree_view_get_selection (GTK_TREE_VIEW (sig_view)); gtk_tree_selection_set_mode (GLOBALS->sig_selection_treesearch_gtk2_c_1, GTK_SELECTION_MULTIPLE); gtk_tree_selection_set_select_function (GLOBALS->sig_selection_treesearch_gtk2_c_1, view_selection_func, NULL, NULL); gtkwave_signal_connect(GTK_OBJECT(sig_view), "button_press_event",GTK_SIGNAL_FUNC(button_press_event_std), NULL); } GLOBALS->dnd_sigview = sig_view; sig_frame = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (sig_frame), 3); gtk_widget_show(sig_frame); gtk_paned_pack2 (GTK_PANED (vpan), sig_frame, TRUE, FALSE); sig_scroll_win = gtk_scrolled_window_new (NULL, NULL); gtk_widget_set_usize (GTK_WIDGET (sig_scroll_win), 80, 100); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sig_scroll_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_show(sig_scroll_win); gtk_container_add (GTK_CONTAINER (sig_frame), sig_scroll_win); gtk_container_add (GTK_CONTAINER (sig_scroll_win), sig_view); gtk_widget_show (sig_view); /* Filter. */ filter_hbox = gtk_hbox_new (FALSE, 1); gtk_widget_show (filter_hbox); filter_label = gtk_label_new ("Filter:"); gtk_widget_show (filter_label); gtk_box_pack_start (GTK_BOX (filter_hbox), filter_label, FALSE, FALSE, 1); GLOBALS->filter_entry = gtk_entry_new (); if(GLOBALS->filter_str_treesearch_gtk2_c_1) { gtk_entry_set_text(GTK_ENTRY(GLOBALS->filter_entry), GLOBALS->filter_str_treesearch_gtk2_c_1); } gtk_widget_show (GLOBALS->filter_entry); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->filter_entry), "activate", GTK_SIGNAL_FUNC(press_callback), NULL); if(!GLOBALS->do_dynamic_treefilter) { gtkwave_signal_connect(GTK_OBJECT (GLOBALS->filter_entry), "key_press_event", (GtkSignalFunc) filter_edit_cb, NULL); } else { gtkwave_signal_connect(GTK_OBJECT(GLOBALS->filter_entry), "changed", GTK_SIGNAL_FUNC(press_callback), NULL); } gtk_tooltips_set_tip_2(tooltips, GLOBALS->filter_entry, "Add a POSIX filter. " "'.*' matches any number of characters," " '.' matches any character. Hit Return to apply." " The filter may be preceded with the port direction if it exists such as ++ (show only non-port), +I+, +O+, +IO+, etc." " Use -- to exclude all non-ports (i.e., show only all ports), -I- to exclude all input ports, etc.", NULL); gtk_box_pack_start (GTK_BOX (filter_hbox), GLOBALS->filter_entry, FALSE, FALSE, 1); gtk_box_pack_start (GTK_BOX (vbox), filter_hbox, FALSE, FALSE, 1); /* Buttons. */ frameh = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (frameh), 3); gtk_widget_show(frameh); gtk_box_pack_start (GTK_BOX (vbox), frameh, FALSE, FALSE, 1); hbox = gtk_hbox_new (FALSE, 1); gtk_widget_show (hbox); button1 = gtk_button_new_with_label ("Append"); gtk_container_border_width (GTK_CONTAINER (button1), 3); gtkwave_signal_connect_object (GTK_OBJECT (button1), "clicked", GTK_SIGNAL_FUNC(ok_callback), GTK_OBJECT (GLOBALS->gtk2_tree_frame)); gtk_widget_show (button1); gtk_tooltips_set_tip_2(tooltips, button1, "Add selected signal hierarchy to end of the display on the main window.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button1, TRUE, FALSE, 0); button2 = gtk_button_new_with_label (" Insert "); gtk_container_border_width (GTK_CONTAINER (button2), 3); gtkwave_signal_connect_object (GTK_OBJECT (button2), "clicked", GTK_SIGNAL_FUNC(insert_callback), GTK_OBJECT (GLOBALS->gtk2_tree_frame)); gtk_widget_show (button2); gtk_tooltips_set_tip_2(tooltips, button2, "Add selected signal hierarchy after last highlighted signal on the main window.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button2, TRUE, FALSE, 0); button4 = gtk_button_new_with_label (" Replace "); gtk_container_border_width (GTK_CONTAINER (button4), 3); gtkwave_signal_connect_object (GTK_OBJECT (button4), "clicked", GTK_SIGNAL_FUNC(replace_callback), GTK_OBJECT (GLOBALS->gtk2_tree_frame)); gtk_widget_show (button4); gtk_tooltips_set_tip_2(tooltips, button4, "Replace highlighted signals on the main window with signals selected above.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button4, TRUE, FALSE, 0); gtk_container_add (GTK_CONTAINER (frameh), hbox); return vbox; } /**************************************************************** ** ** dnd ** ****************************************************************/ /* * DND "drag_begin" handler, this is called whenever a drag starts. */ static void DNDBeginCB( GtkWidget *widget, GdkDragContext *dc, gpointer data ) { (void)data; if((widget == NULL) || (dc == NULL)) return; /* Put any needed drag begin setup code here. */ if(!GLOBALS->dnd_state) { if(widget == GLOBALS->clist_search_c_3) { GLOBALS->tree_dnd_begin = SEARCH_TO_VIEW_DRAG_ACTIVE; } else { GLOBALS->tree_dnd_begin = TREE_TO_VIEW_DRAG_ACTIVE; } } } /* * DND "drag_end" handler, this is called when a drag and drop has * completed. So this function is the last one to be called in * any given DND operation. */ static void DNDEndCB_2( GtkWidget *widget, GdkDragContext *dc, gpointer data ) { (void)widget; (void)dc; (void)data; Trptr t; int trwhich, trtarget; GdkModifierType state; gdouble x, y; #ifdef WAVE_USE_GTK2 gint xi, yi; #endif /* Put any needed drag end cleanup code here. */ if(GLOBALS->dnd_tgt_on_signalarea_treesearch_gtk2_c_1) { WAVE_GDK_GET_POINTER(GLOBALS->signalarea->window, &x, &y, &xi, &yi, &state); WAVE_GDK_GET_POINTER_COPY; if((x<0)||(y<0)||(x>=GLOBALS->signalarea->allocation.width)||(y>=GLOBALS->signalarea->allocation.height)) return; } else if(GLOBALS->dnd_tgt_on_wavearea_treesearch_gtk2_c_1) { WAVE_GDK_GET_POINTER(GLOBALS->wavearea->window, &x, &y, &xi, &yi, &state); WAVE_GDK_GET_POINTER_COPY; if((x<0)||(y<0)||(x>=GLOBALS->wavearea->allocation.width)||(y>=GLOBALS->wavearea->allocation.height)) return; } else { return; } if((t=GLOBALS->traces.first)) { while(t) { t->flags&=~TR_HIGHLIGHT; t=t->t_next; } signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } trtarget = ((int)y / (int)GLOBALS->fontheight) - 2; if(trtarget < 0) { Trptr tp = GLOBALS->topmost_trace ? GivePrevTrace(GLOBALS->topmost_trace): NULL; trtarget = 0; if(tp) { t = tp; } else { if(GLOBALS->tree_dnd_begin == SEARCH_TO_VIEW_DRAG_ACTIVE) { if(GLOBALS->window_search_c_7) { search_insert_callback(GLOBALS->window_search_c_7, 1 /* is prepend */); } } else { action_callback(ACTION_PREPEND); /* prepend in this widget only ever used by this function call */ } goto dnd_import_fini; } } else { t=GLOBALS->topmost_trace; } trwhich=0; while(t) { if((trwhichflags |= TR_HIGHLIGHT; } if(GLOBALS->tree_dnd_begin == SEARCH_TO_VIEW_DRAG_ACTIVE) { if(GLOBALS->window_search_c_7) { search_insert_callback(GLOBALS->window_search_c_7, 0 /* is insert */); } } else { action_callback (ACTION_INSERT); } if(t) { t->flags &= ~TR_HIGHLIGHT; } dnd_import_fini: MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } static void DNDEndCB( GtkWidget *widget, GdkDragContext *dc, gpointer data ) { if((widget == NULL) || (dc == NULL)) { GLOBALS->tree_dnd_begin = VIEW_DRAG_INACTIVE; return; } if(GLOBALS->tree_dnd_begin == VIEW_DRAG_INACTIVE) { return; /* to keep cut and paste in signalwindow from conflicting */ } if(GLOBALS->tree_dnd_requested) { GLOBALS->tree_dnd_requested = 0; if(GLOBALS->is_lx2 == LXT2_IS_VLIST) { set_window_busy(NULL); } DNDEndCB_2(widget, dc, data); if(GLOBALS->is_lx2 == LXT2_IS_VLIST) { set_window_idle(NULL); } } GLOBALS->tree_dnd_begin = VIEW_DRAG_INACTIVE; } /* * DND "drag_motion" handler, this is called whenever the * pointer is dragging over the target widget. */ static gboolean DNDDragMotionCB( GtkWidget *widget, GdkDragContext *dc, gint x, gint y, guint t, gpointer data ) { (void)x; (void)y; (void)data; gboolean same_widget; GdkDragAction suggested_action; GtkWidget *src_widget, *tar_widget; if((widget == NULL) || (dc == NULL)) { gdk_drag_status(dc, 0, t); return(FALSE); } /* Get source widget and target widget. */ src_widget = gtk_drag_get_source_widget(dc); tar_widget = widget; /* Note if source widget is the same as the target. */ same_widget = (src_widget == tar_widget) ? TRUE : FALSE; GLOBALS->dnd_tgt_on_signalarea_treesearch_gtk2_c_1 = (tar_widget == GLOBALS->signalarea); GLOBALS->dnd_tgt_on_wavearea_treesearch_gtk2_c_1 = (tar_widget == GLOBALS->wavearea); /* If this is the same widget, our suggested action should be * move. For all other case we assume copy. */ if(same_widget) suggested_action = GDK_ACTION_MOVE; else suggested_action = GDK_ACTION_COPY; /* Respond with default drag action (status). First we check * the dc's list of actions. If the list only contains * move, copy, or link then we select just that, otherwise we * return with our default suggested action. * If no valid actions are listed then we respond with 0. */ /* Only move? */ if(dc->actions == GDK_ACTION_MOVE) gdk_drag_status(dc, GDK_ACTION_MOVE, t); /* Only copy? */ else if(dc->actions == GDK_ACTION_COPY) gdk_drag_status(dc, GDK_ACTION_COPY, t); /* Only link? */ else if(dc->actions == GDK_ACTION_LINK) gdk_drag_status(dc, GDK_ACTION_LINK, t); /* Other action, check if listed in our actions list? */ else if(dc->actions & suggested_action) gdk_drag_status(dc, suggested_action, t); /* All else respond with 0. */ else gdk_drag_status(dc, 0, t); return(FALSE); } /* * DND "drag_data_get" handler, for handling requests for DND * data on the specified widget. This function is called when * there is need for DND data on the source, so this function is * responsable for setting up the dynamic data exchange buffer * (DDE as sometimes it is called) and sending it out. */ static void DNDDataRequestCB( GtkWidget *widget, GdkDragContext *dc, GtkSelectionData *selection_data, guint info, guint t, gpointer data ) { (void)dc; (void)info; (void)t; (void)data; int upd = 0; GLOBALS->tree_dnd_requested = 1; /* indicate that a request for data occurred... */ if(widget == GLOBALS->clist_search_c_3) /* from search */ { char *text = add_dnd_from_searchbox(); if(text) { gtk_selection_data_set(selection_data,GDK_SELECTION_TYPE_STRING, 8, (guchar*)text, strlen(text)); free_2(text); } upd = 1; } else if(widget == GLOBALS->signalarea) { char *text = add_dnd_from_signal_window(); if(text) { char *text2 = emit_gtkwave_savefile_formatted_entries_in_tcl_list(GLOBALS->traces.first, TRUE); if(text2) { int textlen = strlen(text); int text2len = strlen(text2); char *pnt = calloc_2(1, textlen + text2len + 1); memcpy(pnt, text, textlen); memcpy(pnt + textlen, text2, text2len); free_2(text2); free_2(text); text = pnt; } gtk_selection_data_set(selection_data,GDK_SELECTION_TYPE_STRING, 8, (guchar*)text, strlen(text)); free_2(text); } upd = 1; } else if(widget == GLOBALS->dnd_sigview) { char *text = add_dnd_from_tree_window(); if(text) { gtk_selection_data_set(selection_data,GDK_SELECTION_TYPE_STRING, 8, (guchar*)text, strlen(text)); free_2(text); } upd = 1; } if(upd) { MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } /* * DND "drag_data_received" handler. When DNDDataRequestCB() * calls gtk_selection_data_set() to send out the data, this function * receives it and is responsible for handling it. * * This is also the only DND callback function where the given * inputs may reflect those of the drop target so we need to check * if this is the same structure or not. */ static void DNDDataReceivedCB( GtkWidget *widget, GdkDragContext *dc, gint x, gint y, GtkSelectionData *selection_data, guint info, guint t, gpointer data) { (void)x; (void)y; (void)t; gboolean same; GtkWidget *source_widget; if((widget == NULL) || (data == NULL) || (dc == NULL)) return; /* Important, check if we actually got data. Sometimes errors * occure and selection_data will be NULL. */ if(selection_data == NULL) return; if(selection_data->length < 0) return; /* Source and target widgets are the same? */ source_widget = gtk_drag_get_source_widget(dc); same = (source_widget == widget) ? TRUE : FALSE; if(same) { /* unused */ } if(source_widget) if((source_widget == GLOBALS->clist_search_c_3) || /* from search */ (source_widget == GLOBALS->signalarea) || (source_widget == GLOBALS->dnd_sigview)) { /* use internal mechanism instead of passing names around... */ return; } GLOBALS->dnd_state = 0; GLOBALS->tree_dnd_requested = 0; /* Now check if the data format type is one that we support * (remember, data format type, not data type). * * We check this by testing if info matches one of the info * values that we have defined. * * Note that we can also iterate through the atoms in: * GList *glist = dc->targets; * * while(glist != NULL) * { * gchar *name = gdk_atom_name((GdkAtom)glist->data); * * strcmp the name to see if it matches * * one that we support * * * glist = glist->next; * } */ if((info == WAVE_DRAG_TAR_INFO_0) || (info == WAVE_DRAG_TAR_INFO_1) || (info == WAVE_DRAG_TAR_INFO_2)) { /* printf("XXX %08x '%s'\n", selection_data->data, selection_data->data); */ #ifndef MAC_INTEGRATION DND_helper_quartz((char *)selection_data->data); #else if(!GLOBALS->dnd_helper_quartz) { GLOBALS->dnd_helper_quartz = strdup_2((const char *)selection_data->data); } #endif } } void DND_helper_quartz(char *data) { int num_found; if(!GLOBALS->splash_is_loading) { #if GTK_CHECK_VERSION(2,4,0) if(!GLOBALS->pFileChoose) #endif { if(!(num_found = process_url_list(data))) { num_found = process_tcl_list(data, TRUE); } if(num_found) { MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } #if GTK_CHECK_VERSION(2,4,0) else { MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } #endif } } /* * DND "drag_data_delete" handler, this function is called when * the data on the source `should' be deleted (ie if the DND was * a move). */ static void DNDDataDeleteCB( GtkWidget *widget, GdkDragContext *dc, gpointer data ) { (void)widget; (void)dc; (void)data; /* nothing */ } /***********************/ void dnd_setup(GtkWidget *src, GtkWidget *w, int enable_receive) { GtkWidget *win = w; GtkTargetEntry target_entry[3]; /* Realize the clist widget and make sure it has a window, * this will be for DND setup. */ if(!GTK_WIDGET_NO_WINDOW(w)) { /* DND: Set up the clist as a potential DND destination. * First we set up target_entry which is a sequence of of * structure which specify the kinds (which we define) of * drops accepted on this widget. */ /* Set up the list of data format types that our DND * callbacks will accept. */ target_entry[0].target = WAVE_DRAG_TAR_NAME_0; target_entry[0].flags = 0; target_entry[0].info = WAVE_DRAG_TAR_INFO_0; target_entry[1].target = WAVE_DRAG_TAR_NAME_1; target_entry[1].flags = 0; target_entry[1].info = WAVE_DRAG_TAR_INFO_1; target_entry[2].target = WAVE_DRAG_TAR_NAME_2; target_entry[2].flags = 0; target_entry[2].info = WAVE_DRAG_TAR_INFO_2; /* Set the drag destination for this widget, using the * above target entry types, accept move's and coppies'. */ gtk_drag_dest_set( w, GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP, target_entry, sizeof(target_entry) / sizeof(GtkTargetEntry), GDK_ACTION_MOVE | GDK_ACTION_COPY ); gtkwave_signal_connect(GTK_OBJECT(w), "drag_motion", GTK_SIGNAL_FUNC(DNDDragMotionCB), win); /* Set the drag source for this widget, allowing the user * to drag items off of this clist. */ if(src) { gtk_drag_source_set( src, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK, target_entry, sizeof(target_entry) / sizeof(GtkTargetEntry), GDK_ACTION_MOVE | GDK_ACTION_COPY ); /* Set DND signals on clist. */ gtkwave_signal_connect(GTK_OBJECT(src), "drag_begin", GTK_SIGNAL_FUNC(DNDBeginCB), win); gtkwave_signal_connect(GTK_OBJECT(src), "drag_end", GTK_SIGNAL_FUNC(DNDEndCB), win); gtkwave_signal_connect(GTK_OBJECT(src), "drag_data_get", GTK_SIGNAL_FUNC(DNDDataRequestCB), win); gtkwave_signal_connect(GTK_OBJECT(src), "drag_data_delete", GTK_SIGNAL_FUNC(DNDDataDeleteCB), win); } if(enable_receive) gtkwave_signal_connect(GTK_OBJECT(w), "drag_data_received", GTK_SIGNAL_FUNC(DNDDataReceivedCB), win); } } /***************************************************************************/ static void recurse_append_callback(GtkWidget *widget, gpointer data) { int i; if(!GLOBALS->sst_sig_root_treesearch_gtk2_c_1 || !data) return; set_window_busy(widget); for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { struct symbol *s; if(i<0) break; /* GHW */ s=GLOBALS->facs[i]; if(s->vec_root) { set_s_selected(s->vec_root, GLOBALS->autocoalesce); } } /* LX2 */ if(GLOBALS->is_lx2) { int pre_import = 0; for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { struct symbol *s, *t; if(i<0) break; /* GHW */ s=GLOBALS->facs[i]; t=s->vec_root; if((t)&&(GLOBALS->autocoalesce)) { if(get_s_selected(t)) { while(t) { if(t->n->mv.mvlfac) { lx2_set_fac_process_mask(t->n); pre_import++; } t=t->vec_chain; } } } else { if(s->n->mv.mvlfac) { lx2_set_fac_process_mask(s->n); pre_import++; } } } if(pre_import) { lx2_import_masked(); } } /* LX2 */ for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { int len; struct symbol *s, *t; if(i<0) break; /* GHW */ s=GLOBALS->facs[i]; t=s->vec_root; if((t)&&(GLOBALS->autocoalesce)) { if(get_s_selected(t)) { set_s_selected(t, 0); len=0; while(t) { len++; t=t->vec_chain; } if(len) add_vector_chain(s->vec_root, len); } } else { AddNodeUnroll(s->n, NULL); } } set_window_idle(widget); GLOBALS->traces.scroll_top = GLOBALS->traces.scroll_bottom = GLOBALS->traces.last; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } static void recurse_insert_callback(GtkWidget *widget, gpointer data) { Traces tcache; int i; if(!GLOBALS->sst_sig_root_treesearch_gtk2_c_1 || !data) return; memcpy(&tcache,&GLOBALS->traces,sizeof(Traces)); GLOBALS->traces.total=0; GLOBALS->traces.first=GLOBALS->traces.last=NULL; set_window_busy(widget); for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { struct symbol *s; if(i<0) break; /* GHW */ s=GLOBALS->facs[i]; if(s->vec_root) { set_s_selected(s->vec_root, GLOBALS->autocoalesce); } } /* LX2 */ if(GLOBALS->is_lx2) { int pre_import = 0; for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { struct symbol *s, *t; if(i<0) break; /* GHW */ s=GLOBALS->facs[i]; t=s->vec_root; if((t)&&(GLOBALS->autocoalesce)) { if(get_s_selected(t)) { while(t) { if(t->n->mv.mvlfac) { lx2_set_fac_process_mask(t->n); pre_import++; } t=t->vec_chain; } } } else { if(s->n->mv.mvlfac) { lx2_set_fac_process_mask(s->n); pre_import++; } } } if(pre_import) { lx2_import_masked(); } } /* LX2 */ for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { int len; struct symbol *s, *t; if(i<0) break; /* GHW */ s=GLOBALS->facs[i]; t=s->vec_root; if((t)&&(GLOBALS->autocoalesce)) { if(get_s_selected(t)) { set_s_selected(t, 0); len=0; while(t) { len++; t=t->vec_chain; } if(len) add_vector_chain(s->vec_root, len); } } else { AddNodeUnroll(s->n, NULL); } } set_window_idle(widget); GLOBALS->traces.buffercount=GLOBALS->traces.total; GLOBALS->traces.buffer=GLOBALS->traces.first; GLOBALS->traces.bufferlast=GLOBALS->traces.last; GLOBALS->traces.first=tcache.first; GLOBALS->traces.last=tcache.last; GLOBALS->traces.total=tcache.total; PasteBuffer(); GLOBALS->traces.buffercount=tcache.buffercount; GLOBALS->traces.buffer=tcache.buffer; GLOBALS->traces.bufferlast=tcache.bufferlast; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } static void recurse_replace_callback(GtkWidget *widget, gpointer data) { Traces tcache; int i; Trptr tfirst=NULL, tlast=NULL; if(!GLOBALS->sst_sig_root_treesearch_gtk2_c_1 || !data) return; memcpy(&tcache,&GLOBALS->traces,sizeof(Traces)); GLOBALS->traces.total=0; GLOBALS->traces.first=GLOBALS->traces.last=NULL; set_window_busy(widget); for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { struct symbol *s; if(i<0) break; /* GHW */ s=GLOBALS->facs[i]; if(s->vec_root) { set_s_selected(s->vec_root, GLOBALS->autocoalesce); } } /* LX2 */ if(GLOBALS->is_lx2) { int pre_import = 0; for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { struct symbol *s, *t; if(i<0) break; /* GHW */ s=GLOBALS->facs[i]; t=s->vec_root; if((t)&&(GLOBALS->autocoalesce)) { if(get_s_selected(t)) { while(t) { if(t->n->mv.mvlfac) { lx2_set_fac_process_mask(t->n); pre_import++; } t=t->vec_chain; } } } else { if(s->n->mv.mvlfac) { lx2_set_fac_process_mask(s->n); pre_import++; } } } if(pre_import) { lx2_import_masked(); } } /* LX2 */ for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { int len; struct symbol *s, *t; if(i<0) break; /* GHW */ s=GLOBALS->facs[i]; t=s->vec_root; if((t)&&(GLOBALS->autocoalesce)) { if(get_s_selected(t)) { set_s_selected(t, 0); len=0; while(t) { len++; t=t->vec_chain; } if(len) add_vector_chain(s->vec_root, len); } } else { AddNodeUnroll(s->n, NULL); } } set_window_idle(widget); tfirst=GLOBALS->traces.first; tlast=GLOBALS->traces.last; /* cache for highlighting */ GLOBALS->traces.buffercount=GLOBALS->traces.total; GLOBALS->traces.buffer=GLOBALS->traces.first; GLOBALS->traces.bufferlast=GLOBALS->traces.last; GLOBALS->traces.first=tcache.first; GLOBALS->traces.last=tcache.last; GLOBALS->traces.total=tcache.total; { Trptr t = GLOBALS->traces.first; Trptr *tp = NULL; int numhigh = 0; int it; while(t) { if(t->flags & TR_HIGHLIGHT) { numhigh++; } t = t->t_next; } if(numhigh) { tp = calloc_2(numhigh, sizeof(Trptr)); t = GLOBALS->traces.first; it = 0; while(t) { if(t->flags & TR_HIGHLIGHT) { tp[it++] = t; } t = t->t_next; } } PasteBuffer(); GLOBALS->traces.buffercount=tcache.buffercount; GLOBALS->traces.buffer=tcache.buffer; GLOBALS->traces.bufferlast=tcache.bufferlast; for(i=0;iflags |= TR_HIGHLIGHT; } t = tfirst; while(t) { t->flags &= ~TR_HIGHLIGHT; if(t==tlast) break; t=t->t_next; } CutBuffer(); while(tfirst) { tfirst->flags |= TR_HIGHLIGHT; if(tfirst==tlast) break; tfirst=tfirst->t_next; } if(tp) { free_2(tp); } } MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } void recurse_import(GtkWidget *widget, guint callback_action) { if(GLOBALS->sst_sig_root_treesearch_gtk2_c_1) { int fz; GLOBALS->fetchlow = GLOBALS->fetchhigh = -1; if(GLOBALS->sst_sig_root_treesearch_gtk2_c_1->child) recurse_fetch_high_low(GLOBALS->sst_sig_root_treesearch_gtk2_c_1->child); fz = GLOBALS->fetchhigh - GLOBALS->fetchlow + 1; void (*func)(GtkWidget *, gpointer); switch(callback_action) { case WV_RECURSE_INSERT: func = recurse_insert_callback; break; case WV_RECURSE_REPLACE: func = recurse_replace_callback; break; case WV_RECURSE_APPEND: default: func = recurse_append_callback; break; } if((GLOBALS->fetchlow >= 0) && (GLOBALS->fetchhigh >= 0)) { widget = GLOBALS->mainwindow; /* otherwise using widget passed from the menu item crashes on OSX */ if(fz > WV_RECURSE_IMPORT_WARN) { char recwarn[128]; sprintf(recwarn, "Really import %d facilit%s?", fz, (fz==1)?"y":"ies"); simplereqbox("Recurse Warning",300,recwarn,"Yes", "No", GTK_SIGNAL_FUNC(func), 0); } else { func(widget, (gpointer)1); } } } } /***************************************************************************/ gtkwave-3.3.86/src/strace.c0000664000175000017500000013067213166335473015031 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2013. * * 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. */ #include #include "globals.h" #include #include "gtk12compat.h" #include "strace.h" #include "currenttime.h" #include "hierpack.h" #define WV_STRACE_CTX "strace_ctx" /* need to do this every time you connect a signal */ #ifdef WAVE_USE_GTK2 #define WV_STRACE_CURWIN(x) g_object_set_data(G_OBJECT(x), WV_STRACE_CTX, (gpointer)GLOBALS->strace_ctx) #else #define WV_STRACE_CURWIN(x) do { } while(0 && (x)) #endif /* need to do this at top of every entry point function where a signal is connected */ #ifdef WAVE_USE_GTK2 #define GET_WV_STRACE_CURWIN(x) GLOBALS->strace_ctx=g_object_get_data(G_OBJECT(x), WV_STRACE_CTX) #else #define GET_WV_STRACE_CURWIN(x) do { } while(0 && (x)) #endif static char *logical[]= {"AND", "OR", "XOR", "NAND", "NOR", "XNOR"}; static char *stype[WAVE_STYPE_COUNT]= {"Don't Care", "High", "Z (Mid)", "X", "Low", "String", "Rising Edge", "Falling Edge", "Any Edge"}; static struct item_mark_string item_mark_start_strings[]= { { "Start of Time", 0 }, { "Named Marker A", 0 }, { "Named Marker B", 0 }, { "Named Marker C", 0 }, { "Named Marker D", 0 }, { "Named Marker E", 0 }, { "Named Marker F", 0 }, { "Named Marker G", 0 }, { "Named Marker H", 0 }, { "Named Marker I", 0 }, { "Named Marker J", 0 }, { "Named Marker K", 0 }, { "Named Marker L", 0 }, { "Named Marker M", 0 }, { "Named Marker N", 0 }, { "Named Marker O", 0 }, { "Named Marker P", 0 }, { "Named Marker Q", 0 }, { "Named Marker R", 0 }, { "Named Marker S", 0 }, { "Named Marker T", 0 }, { "Named Marker U", 0 }, { "Named Marker V", 0 }, { "Named Marker W", 0 }, { "Named Marker X", 0 }, { "Named Marker Y", 0 }, { "Named Marker Z", 0 } }; static struct item_mark_string item_mark_end_strings[]= { { "End of Time", 0 }, { "Named Marker A", 0 }, { "Named Marker B", 0 }, { "Named Marker C", 0 }, { "Named Marker D", 0 }, { "Named Marker E", 0 }, { "Named Marker F", 0 }, { "Named Marker G", 0 }, { "Named Marker H", 0 }, { "Named Marker I", 0 }, { "Named Marker J", 0 }, { "Named Marker K", 0 }, { "Named Marker L", 0 }, { "Named Marker M", 0 }, { "Named Marker N", 0 }, { "Named Marker O", 0 }, { "Named Marker P", 0 }, { "Named Marker Q", 0 }, { "Named Marker R", 0 }, { "Named Marker S", 0 }, { "Named Marker T", 0 }, { "Named Marker U", 0 }, { "Named Marker V", 0 }, { "Named Marker W", 0 }, { "Named Marker X", 0 }, { "Named Marker Y", 0 }, { "Named Marker Z", 0 } }; /* * naive nonoptimized case insensitive strstr */ char *strstr_i(char *hay, char *needle) { char *ht, *nt; while (*hay) { int offs = 0; ht = hay; nt = needle; while(*nt) { if(toupper((int)(unsigned char)*(ht+offs)) != toupper((int)(unsigned char)*nt)) break; offs++; nt++; } if(!*nt) return(hay); hay++; } return(*hay ? hay : NULL); } /* * trap timescale overflows */ TimeType strace_adjust(TimeType a, TimeType b) { TimeType res=a+b; if((b>LLDescriptor(0))&&(resstrace_windows[s_ctx_iter]; if(strace_ctx->window_strace_c_10) activ++; } return(activ); } /* * free the straces... */ static void free_straces(void) { struct strace *s, *skill; int i; struct strace_defer_free *sd, *sd2; s=GLOBALS->strace_ctx->straces; while(s) { for(i=0;iback[i]) free_2(s->back[i]); } if(s->string) free_2(s->string); skill=s; s=s->next; free_2(skill); } GLOBALS->strace_ctx->straces=NULL; if(count_active_straces() <= 1) /* only free up traces if there is only one pattern search active. we could splice across multiple strace_ctx but it's not worth the effort here */ { sd = GLOBALS->strace_ctx->strace_defer_free_head; while(sd) { FreeTrace(sd->defer); sd2 = sd->next; free_2(sd); sd = sd2; } GLOBALS->strace_ctx->strace_defer_free_head = NULL; /* moved inside if() so it frees eventually and doesn't stay around until context cleanup */ } } /* * button/menu/entry activations.. */ static void logical_clicked(GtkWidget *widget, gpointer which) { int i; char *which_char; GET_WV_STRACE_CURWIN(widget); for(i=0;i<6;i++) GLOBALS->strace_ctx->logical_mutex[i]=0; which_char=(char *)which; *which_char=1; /* mark our choice */ } static void stype_clicked(GtkWidget *widget, gpointer back) { struct strace_back *b; struct strace *s; GET_WV_STRACE_CURWIN(widget); b=(struct strace_back *)back; s=b->parent; s->value=b->which; DEBUG(printf("Trace %s Search Type: %s\n", s->trace->name, stype[(int)s->value])); } static void start_clicked(GtkWidget *widget, gpointer which) { GET_WV_STRACE_CURWIN(widget); GLOBALS->strace_ctx->mark_idx_start=((struct item_mark_string*)which)->idx; if (GLOBALS->strace_ctx->mark_idx_start<0 || GLOBALS->strace_ctx->mark_idx_start>=(int)(sizeof(item_mark_start_strings)/sizeof(struct item_mark_string))) { fprintf(stderr, "Internal error: GLOBALS->mark_idx_start out of range %d\n", GLOBALS->strace_ctx->mark_idx_start); exit(255); } DEBUG(printf("start: %s\n", ((struct item_mark_string*)which)->str)); } static void end_clicked(GtkWidget *widget, gpointer which) { GET_WV_STRACE_CURWIN(widget); GLOBALS->strace_ctx->mark_idx_end=((struct item_mark_string*)which)->idx; if (GLOBALS->strace_ctx->mark_idx_end<0 || GLOBALS->strace_ctx->mark_idx_end>=(int)(sizeof(item_mark_end_strings)/sizeof(struct item_mark_string))) { fprintf(stderr, "Internal error: GLOBALS->mark_idx_end out of range %d\n",GLOBALS->strace_ctx->mark_idx_end); exit(255); } DEBUG(printf("end: %s\n", ((struct item_mark_string*)which)->str)); } static void enter_callback(GtkWidget *widget, gpointer strace_tmp) { G_CONST_RETURN gchar *entry_text; struct strace *s; int i, len; GET_WV_STRACE_CURWIN(widget); s=(struct strace *)strace_tmp; if(s->string) { free_2(s->string); s->string=NULL; } entry_text = gtk_entry_get_text(GTK_ENTRY(widget)); entry_text = entry_text ? entry_text : ""; DEBUG(printf("Trace %s Entry contents: %s\n", s->trace->name, entry_text)); if(!(len=strlen(entry_text))) return; gtk_entry_select_region (GTK_ENTRY (widget), 0, GTK_ENTRY(widget)->text_length); strcpy((s->string=(char *)malloc_2(len+1)),entry_text); for(i=0;istring[i]; if((ch>='a')&&(ch<='z')) s->string[i]=ch-('a'-'A'); } } static void forwards_callback(GtkWidget *widget, GtkWidget *nothing) { (void)nothing; GET_WV_STRACE_CURWIN(widget); /* no cleanup necessary, but do real search */ DEBUG(printf("Searching Forward..\n")); strace_search(STRACE_FORWARD); } static void backwards_callback(GtkWidget *widget, GtkWidget *nothing) { (void)nothing; GET_WV_STRACE_CURWIN(widget); /* no cleanup necessary, but do real search */ DEBUG(printf("Searching Backward..\n")); strace_search(STRACE_BACKWARD); } static void mark_callback(GtkWidget *widget, GtkWidget *nothing) { (void)nothing; GET_WV_STRACE_CURWIN(widget); DEBUG(printf("Marking..\n")); if(GLOBALS->strace_ctx->shadow_straces) { delete_strace_context(); } strace_maketimetrace(1); cache_actual_pattern_mark_traces(); MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } static void clear_callback(GtkWidget *widget, GtkWidget *nothing) { (void)nothing; GET_WV_STRACE_CURWIN(widget); DEBUG(printf("Clearing..\n")); if(GLOBALS->strace_ctx->shadow_straces) { delete_strace_context(); } strace_maketimetrace(0); MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } static void destroy_callback(GtkWidget *widget, GtkWidget *nothing) { (void)nothing; GET_WV_STRACE_CURWIN(widget); free_straces(); GLOBALS->strace_ctx->ptr_mark_count_label_strace_c_1=NULL; gtk_widget_destroy(GLOBALS->strace_ctx->window_strace_c_10); GLOBALS->strace_ctx->window_strace_c_10 = NULL; } /* update mark count label on pattern search dialog */ static void update_mark_count_label(void) { if(GLOBALS->strace_ctx->ptr_mark_count_label_strace_c_1) { char mark_count_buf[64]; sprintf (mark_count_buf, "Mark Count: %d", GLOBALS->strace_ctx->timearray_size); gtk_label_set_text (GTK_LABEL(GLOBALS->strace_ctx->ptr_mark_count_label_strace_c_1), mark_count_buf); } } void tracesearchbox(const char *title, GtkSignalFunc func, gpointer data) { GtkWidget *menu, *menuitem, *optionmenu; GSList *group; GtkWidget *entry; GtkWidget *vbox, *hbox, *small_hbox, *vbox_g, *label; GtkWidget *button1, *button1a, *button1b, *button1c, *button2, *scrolled_win, *frame, *separator; Trptr t; int i; int numtraces; GLOBALS->strace_current_window = (int)(intptr_t)data; /* arg for which search box going in */ GLOBALS->strace_ctx = &GLOBALS->strace_windows[GLOBALS->strace_current_window]; /* fix problem where ungrab doesn't occur if button pressed + simultaneous accelerator key occurs */ if(GLOBALS->in_button_press_wavewindow_c_1) { gdk_pointer_ungrab(GDK_CURRENT_TIME); } if(GLOBALS->strace_ctx->straces) { gdk_window_raise(GLOBALS->strace_ctx->window_strace_c_10->window); return; /* is already active */ } GLOBALS->strace_ctx->cleanup_strace_c_7=func; numtraces=0; /* create a new window */ GLOBALS->strace_ctx->window_strace_c_10 = gtk_window_new(GLOBALS->disable_window_manager ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL); GLOBALS->strace_windows[GLOBALS->strace_current_window].window_strace_c_10 = gtk_window_new(GLOBALS->disable_window_manager ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL); install_focus_cb(GLOBALS->strace_windows[GLOBALS->strace_current_window].window_strace_c_10, ((char *)&GLOBALS->strace_windows[GLOBALS->strace_current_window].window_strace_c_10) - ((char *)GLOBALS)); gtk_window_set_title(GTK_WINDOW (GLOBALS->strace_ctx->window_strace_c_10), title); gtk_widget_set_usize( GTK_WIDGET (GLOBALS->strace_ctx->window_strace_c_10), 420, -1); gtkwave_signal_connect(GTK_OBJECT (GLOBALS->strace_ctx->window_strace_c_10), "delete_event",(GtkSignalFunc) destroy_callback, NULL); WV_STRACE_CURWIN(GLOBALS->strace_ctx->window_strace_c_10); vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (GLOBALS->strace_ctx->window_strace_c_10), vbox); gtk_widget_show (vbox); vbox_g = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox_g); frame = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (frame), 3); gtk_widget_show(frame); small_hbox = gtk_hbox_new (TRUE, 0); gtk_widget_show (small_hbox); label=gtk_label_new("Logical Operation"); gtk_widget_show (label); gtk_box_pack_start (GTK_BOX (small_hbox), label, TRUE, FALSE, 0); menu = gtk_menu_new (); group=NULL; for(i=0;i<6;i++) { menuitem = gtk_radio_menu_item_new_with_label (group, logical[i]); group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem)); gtk_menu_append (GTK_MENU (menu), menuitem); gtk_widget_show (menuitem); gtkwave_signal_connect(GTK_OBJECT (menuitem), "activate", GTK_SIGNAL_FUNC(logical_clicked), &GLOBALS->strace_ctx->logical_mutex[i]); WV_STRACE_CURWIN(menuitem); GLOBALS->strace_ctx->logical_mutex[i]=0; } GLOBALS->strace_ctx->logical_mutex[0]=1; /* "and" */ optionmenu = gtk_option_menu_new (); gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu); gtk_box_pack_start (GTK_BOX (small_hbox), optionmenu, TRUE, FALSE, 0); gtk_widget_show (optionmenu); gtk_box_pack_start (GTK_BOX (vbox), small_hbox, FALSE, FALSE, 0); scrolled_win = gtk_scrolled_window_new (NULL, NULL); gtk_widget_set_usize( GTK_WIDGET (scrolled_win), -1, 300); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_show(scrolled_win); gtk_container_add (GTK_CONTAINER (frame), scrolled_win); gtk_container_add (GTK_CONTAINER (vbox), frame); for(t=GLOBALS->traces.first;t;t=t->t_next) { struct strace *s; if ((t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))||(!(t->flags&TR_HIGHLIGHT))||(!(t->name))) continue; numtraces++; if(numtraces==500) { status_text("Limiting waveform display search to 500 traces.\n"); break; } s=(struct strace *)calloc_2(1,sizeof(struct strace)); s->next=GLOBALS->strace_ctx->straces; GLOBALS->strace_ctx->straces=s; s->trace=t; if(t!=GLOBALS->traces.first) { separator = gtk_hseparator_new (); gtk_widget_show (separator); gtk_box_pack_start (GTK_BOX (vbox_g), separator, FALSE, FALSE, 0); } small_hbox = gtk_hbox_new (TRUE, 0); gtk_widget_show (small_hbox); label=gtk_label_new(t->name); gtk_widget_show (label); gtk_box_pack_start (GTK_BOX (vbox_g), label, FALSE, FALSE, 0); menu = gtk_menu_new (); group=NULL; for(i=0;iparent=s; b->which=i; s->back[i]=b; menuitem = gtk_radio_menu_item_new_with_label (group, stype[i]); group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem)); gtk_menu_append (GTK_MENU (menu), menuitem); gtk_widget_show (menuitem); gtkwave_signal_connect(GTK_OBJECT (menuitem), "activate", GTK_SIGNAL_FUNC(stype_clicked), b); WV_STRACE_CURWIN(menuitem); } optionmenu = gtk_option_menu_new (); gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu); gtk_box_pack_start (GTK_BOX (small_hbox), optionmenu, TRUE, FALSE, 0); gtk_widget_show (optionmenu); entry = gtk_entry_new_with_max_length (257); /* %+256ch */ gtkwave_signal_connect(GTK_OBJECT(entry), "activate", GTK_SIGNAL_FUNC(enter_callback), s); gtkwave_signal_connect(GTK_OBJECT(entry), "changed", GTK_SIGNAL_FUNC(enter_callback), s); WV_STRACE_CURWIN(entry); gtk_box_pack_start (GTK_BOX (small_hbox), entry, TRUE, FALSE, 0); gtk_widget_show (entry); gtk_box_pack_start (GTK_BOX (vbox_g), small_hbox, FALSE, FALSE, 0); } gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_win), vbox_g); do /* add GUI elements for displaying mark count and mark count start/end */ { unsigned int idx; GtkWidget *ptr_mark_start_label, *ptr_mark_end_label; GtkWidget *mark_count_hbox_start, *mark_count_hbox_end; GtkWidget *count_vbox_left, *count_vbox_right, *count_vbox, *count_hbox; GtkWidget *ptr_mark_count_start, *ptr_mark_count_end; count_hbox=gtk_hbox_new (TRUE, 0); gtk_widget_show (count_hbox); gtk_box_pack_start (GTK_BOX(vbox),count_hbox,FALSE,FALSE,0); /* add a vertical box to display the mark count GUI elements */ count_vbox_left=gtk_vbox_new (TRUE, 0); gtk_widget_show (count_vbox_left); gtk_box_pack_start (GTK_BOX(count_hbox),count_vbox_left,FALSE,FALSE,0); count_vbox=gtk_vbox_new (TRUE, 0); gtk_widget_show (count_vbox); gtk_box_pack_start (GTK_BOX(count_hbox),count_vbox,FALSE,FALSE,0); count_vbox_right=gtk_vbox_new (TRUE, 0); gtk_widget_show (count_vbox_right); gtk_box_pack_start (GTK_BOX(count_hbox),count_vbox_right,FALSE,FALSE,0); /* add mark start GUI element */ mark_count_hbox_start=gtk_hbox_new (TRUE, 0); gtk_widget_show (mark_count_hbox_start); gtk_box_pack_start (GTK_BOX(count_vbox),mark_count_hbox_start,FALSE,FALSE,0); ptr_mark_start_label=gtk_label_new ("Marking Begins at:"); gtk_widget_show (ptr_mark_start_label); gtk_box_pack_start (GTK_BOX (mark_count_hbox_start),ptr_mark_start_label,TRUE,FALSE,0); ptr_mark_count_start = gtk_menu_new (); group=NULL; for(idx=0; idxstrace_ctx->mark_idx_start); /* add mark end GUI element */ mark_count_hbox_end=gtk_hbox_new (TRUE, 0); gtk_widget_show (mark_count_hbox_end); gtk_box_pack_start (GTK_BOX(count_vbox),mark_count_hbox_end,FALSE,FALSE,0); ptr_mark_end_label=gtk_label_new ("Marking Stops at:"); gtk_widget_show (ptr_mark_end_label); gtk_box_pack_start (GTK_BOX (mark_count_hbox_end),ptr_mark_end_label,TRUE,FALSE,0); ptr_mark_count_end = gtk_menu_new (); group=NULL; for(idx=0; idxstrace_ctx->mark_idx_end); /* add mark count GUI element */ GLOBALS->strace_ctx->ptr_mark_count_label_strace_c_1=gtk_label_new (""); gtk_widget_show (GLOBALS->strace_ctx->ptr_mark_count_label_strace_c_1); gtk_box_pack_start (GTK_BOX (count_vbox),GLOBALS->strace_ctx->ptr_mark_count_label_strace_c_1,TRUE,FALSE,0); update_mark_count_label (); } while (0); hbox = gtk_hbox_new (FALSE, 1); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); gtk_widget_show (hbox); button1 = gtk_button_new_with_label ("Fwd"); gtk_widget_set_usize(button1, 75, -1); gtkwave_signal_connect(GTK_OBJECT (button1), "clicked", GTK_SIGNAL_FUNC(forwards_callback), NULL); WV_STRACE_CURWIN(button1); gtk_widget_show (button1); gtk_container_add (GTK_CONTAINER (hbox), button1); GTK_WIDGET_SET_FLAGS (button1, GTK_CAN_DEFAULT); gtkwave_signal_connect_object (GTK_OBJECT (button1), "realize", (GtkSignalFunc) gtk_widget_grab_default, GTK_OBJECT (button1)); button1a = gtk_button_new_with_label ("Bkwd"); gtk_widget_set_usize(button1a, 75, -1); gtkwave_signal_connect(GTK_OBJECT (button1a), "clicked", GTK_SIGNAL_FUNC(backwards_callback), NULL); WV_STRACE_CURWIN(button1a); gtk_widget_show (button1a); gtk_container_add (GTK_CONTAINER (hbox), button1a); GTK_WIDGET_SET_FLAGS (button1a, GTK_CAN_DEFAULT); button1b = gtk_button_new_with_label ("Mark"); gtk_widget_set_usize(button1b, 75, -1); gtkwave_signal_connect(GTK_OBJECT (button1b), "clicked", GTK_SIGNAL_FUNC(mark_callback), NULL); WV_STRACE_CURWIN(button1b); gtk_widget_show (button1b); gtk_container_add (GTK_CONTAINER (hbox), button1b); GTK_WIDGET_SET_FLAGS (button1b, GTK_CAN_DEFAULT); button1c = gtk_button_new_with_label ("Clear"); gtk_widget_set_usize(button1c, 75, -1); gtkwave_signal_connect(GTK_OBJECT (button1c), "clicked", GTK_SIGNAL_FUNC(clear_callback), NULL); WV_STRACE_CURWIN(button1c); gtk_widget_show (button1c); gtk_container_add (GTK_CONTAINER (hbox), button1c); GTK_WIDGET_SET_FLAGS (button1c, GTK_CAN_DEFAULT); button2 = gtk_button_new_with_label ("Exit"); gtk_widget_set_usize(button2, 75, -1); gtkwave_signal_connect(GTK_OBJECT (button2), "clicked", GTK_SIGNAL_FUNC(destroy_callback), NULL); WV_STRACE_CURWIN(button2); GTK_WIDGET_SET_FLAGS (button2, GTK_CAN_DEFAULT); gtk_widget_show (button2); gtk_container_add (GTK_CONTAINER (hbox), button2); gtk_widget_show(GLOBALS->strace_ctx->window_strace_c_10); } /* * strace backward or forward.. */ static void strace_search_2(int direction, int is_last_iteration) { struct strace *s; TimeType basetime, maxbase, sttim, fintim; Trptr t; int totaltraces, passcount; int whichpass; TimeType middle=0, width; if(direction==STRACE_BACKWARD) /* backwards */ { if(GLOBALS->tims.marker<0) { basetime=MAX_HISTENT_TIME; } else { basetime=GLOBALS->tims.marker; } } else /* go forwards */ { if(GLOBALS->tims.marker<0) { basetime=GLOBALS->tims.first; } else { basetime=GLOBALS->tims.marker; } } sttim=GLOBALS->tims.first; fintim=GLOBALS->tims.last; for(whichpass=0;;whichpass++) { if(direction==STRACE_BACKWARD) /* backwards */ { maxbase=-1; s=GLOBALS->strace_ctx->straces; while(s) { t=s->trace; GLOBALS->shift_timebase=t->shift; if(!(t->vector)) { hptr h; hptr *hp; UTimeType utt; TimeType tt; /* h= */ bsearch_node(t->n.nd, basetime - t->shift); /* scan-build */ hp=GLOBALS->max_compare_index; if((hp==&(t->n.nd->harray[1]))||(hp==&(t->n.nd->harray[0]))) return; if(basetime == ((*hp)->time+GLOBALS->shift_timebase)) hp--; h=*hp; s->his.h=h; utt=strace_adjust(h->time,GLOBALS->shift_timebase); tt=utt; if(tt > maxbase) maxbase=tt; } else { vptr v; vptr *vp; UTimeType utt; TimeType tt; /* v= */ bsearch_vector(t->n.vec, basetime - t->shift); /* scan-build */ vp=GLOBALS->vmax_compare_index; if((vp==&(t->n.vec->vectors[1]))||(vp==&(t->n.vec->vectors[0]))) return; if(basetime == ((*vp)->time+GLOBALS->shift_timebase)) vp--; v=*vp; s->his.v=v; utt=strace_adjust(v->time,GLOBALS->shift_timebase); tt=utt; if(tt > maxbase) maxbase=tt; } s=s->next; } } else /* go forward */ { maxbase=MAX_HISTENT_TIME; s=GLOBALS->strace_ctx->straces; while(s) { t=s->trace; GLOBALS->shift_timebase=t->shift; if(!(t->vector)) { hptr h; UTimeType utt; TimeType tt; h=bsearch_node(t->n.nd, basetime - t->shift); while(h->next && h->time==h->next->time) h=h->next; if((whichpass)||(GLOBALS->tims.marker>=0)) h=h->next; if(!h) return; s->his.h=h; utt=strace_adjust(h->time,GLOBALS->shift_timebase); tt=utt; if(tt < maxbase) maxbase=tt; } else { vptr v; UTimeType utt; TimeType tt; v=bsearch_vector(t->n.vec, basetime - t->shift); while(v->next && v->time==v->next->time) v=v->next; if((whichpass)||(GLOBALS->tims.marker>=0)) v=v->next; if(!v) return; s->his.v=v; utt=strace_adjust(v->time,GLOBALS->shift_timebase); tt=utt; if(tt < maxbase) maxbase=tt; } s=s->next; } } s=GLOBALS->strace_ctx->straces; totaltraces=0; /* increment when not don't care */ while(s) { char str[2]; t=s->trace; s->search_result=0; /* explicitly must set this */ GLOBALS->shift_timebase=t->shift; if((!t->vector)&&(!(t->n.nd->extvals))) { if(strace_adjust(s->his.h->time,GLOBALS->shift_timebase)!=maxbase) { s->his.h=bsearch_node(t->n.nd, maxbase - t->shift); while(s->his.h->next && s->his.h->time==s->his.h->next->time) s->his.h=s->his.h->next; } if(t->flags&TR_INVERT) { str[0]=AN_STR_INV[s->his.h->v.h_val]; } else { str[0]=AN_STR[s->his.h->v.h_val]; } str[1]=0x00; switch(s->value) { case ST_DC: break; case ST_HIGH: totaltraces++; if((str[0]=='1')||(str[0]=='h')||(str[0]=='H')) s->search_result=1; break; case ST_RISE: if((str[0]=='1')||(str[0]=='h')||(str[0]=='H')) s->search_result=1; totaltraces++; break; case ST_LOW: totaltraces++; if((str[0]=='0')||(str[0]=='l')||(str[0]=='L')) s->search_result=1; break; case ST_FALL: totaltraces++; if((str[0]=='0')||(str[0]=='l')||(str[0]=='L')) s->search_result=1; break; case ST_MID: totaltraces++; if((str[0]=='z')||(str[0]=='Z')) s->search_result=1; break; case ST_X: totaltraces++; if((str[0]=='x')||(str[0]=='X')) s->search_result=1; break; case ST_ANY: totaltraces++; s->search_result=1; break; case ST_STRING: totaltraces++; if(s->string) if(strstr_i(s->string,str)) s->search_result=1; break; default: fprintf(stderr, "Internal error: st_type of %d\n",s->value); exit(255); } } else { char *chval, *chval2; char ch; if(t->vector) { if(strace_adjust(s->his.v->time,GLOBALS->shift_timebase)!=maxbase) { s->his.v=bsearch_vector(t->n.vec, maxbase - t->shift); while(s->his.v->next && s->his.v->time==s->his.v->next->time) s->his.v=s->his.v->next; } chval=convert_ascii(t,s->his.v); } else { if(strace_adjust(s->his.h->time,GLOBALS->shift_timebase)!=maxbase) { s->his.h=bsearch_node(t->n.nd, maxbase - t->shift); while(s->his.h->next && s->his.h->time==s->his.h->next->time) s->his.h=s->his.h->next; } if(s->his.h->flags&HIST_REAL) { if(!(s->his.h->flags&HIST_STRING)) { #ifdef WAVE_HAS_H_DOUBLE chval=convert_ascii_real(t, &s->his.h->v.h_double); #else chval=convert_ascii_real(t, (double *)s->his.h->v.h_vector); #endif } else { chval=convert_ascii_string((char *)s->his.h->v.h_vector); chval2=chval; while((ch=*chval2)) /* toupper() the string */ { if((ch>='a')&&(ch<='z')) { *chval2= ch-('a'-'A'); } chval2++; } } } else { chval=convert_ascii_vec(t,s->his.h->v.h_vector); } } switch(s->value) { case ST_DC: break; case ST_RISE: case ST_FALL: totaltraces++; break; case ST_HIGH: totaltraces++; if((chval2=chval)) while((ch=*(chval2++))) { if(((ch>='1')&&(ch<='9'))||(ch=='h')||(ch=='H')||((ch>='A')&&(ch<='F'))) { s->search_result=1; break; } } break; case ST_LOW: totaltraces++; if((chval2=chval)) { s->search_result=1; while((ch=*(chval2++))) { if((ch!='0')&&(ch!='l')&&(ch!='L')) { s->search_result=0; break; } } } break; case ST_MID: totaltraces++; if((chval2=chval)) { s->search_result=1; while((ch=*(chval2++))) { if((ch!='z')&&(ch!='Z')) { s->search_result=0; break; } } } break; case ST_X: totaltraces++; if((chval2=chval)) { s->search_result=1; while((ch=*(chval2++))) { if((ch!='x')&&(ch!='w')&&(ch!='X')&&(ch!='W')) { s->search_result=0; break; } } } break; case ST_ANY: totaltraces++; s->search_result=1; break; case ST_STRING: totaltraces++; if(s->string) if(strstr_i(chval, s->string)) s->search_result=1; break; default: fprintf(stderr, "Internal error: st_type of %d\n",s->value); exit(255); } free_2(chval); } s=s->next; } if((maxbasefintim)) return; DEBUG(printf("Maxbase: "TTFormat", total traces: %d\n",maxbase, totaltraces)); s=GLOBALS->strace_ctx->straces; passcount=0; while(s) { DEBUG(printf("\tPass: %d, Name: %s\n",s->search_result, s->trace->name)); if(s->search_result) passcount++; s=s->next; } if(totaltraces) { if(GLOBALS->strace_ctx->logical_mutex[0]) /* and */ { if(totaltraces==passcount) break; } else if(GLOBALS->strace_ctx->logical_mutex[1]) /* or */ { if(passcount) break; } else if(GLOBALS->strace_ctx->logical_mutex[2]) /* xor */ { if(passcount&1) break; } else if(GLOBALS->strace_ctx->logical_mutex[3]) /* nand */ { if(totaltraces!=passcount) break; } else if(GLOBALS->strace_ctx->logical_mutex[4]) /* nor */ { if(!passcount) break; } else if(GLOBALS->strace_ctx->logical_mutex[5]) /* xnor */ { if(!(passcount&1)) break; } } basetime=maxbase; } GLOBALS->tims.marker=maxbase; if(is_last_iteration) { update_markertime(GLOBALS->tims.marker); width=(TimeType)(((gdouble)GLOBALS->wavewidth)*GLOBALS->nspx); if((GLOBALS->tims.markertims.start)||(GLOBALS->tims.marker>=GLOBALS->tims.start+width)) { if((GLOBALS->tims.marker<0)||(GLOBALS->tims.markertims.first)||(GLOBALS->tims.marker>GLOBALS->tims.last)) { if(GLOBALS->tims.end>GLOBALS->tims.last) GLOBALS->tims.end=GLOBALS->tims.last; middle=(GLOBALS->tims.start/2)+(GLOBALS->tims.end/2); if((GLOBALS->tims.start&1)&&(GLOBALS->tims.end&1)) middle++; } else { middle=GLOBALS->tims.marker; } GLOBALS->tims.start=time_trunc(middle-(width/2)); if(GLOBALS->tims.start+width>GLOBALS->tims.last) GLOBALS->tims.start=GLOBALS->tims.last-width; if(GLOBALS->tims.starttims.first) GLOBALS->tims.start=GLOBALS->tims.first; GTK_ADJUSTMENT(GLOBALS->wave_hslider)->value=GLOBALS->tims.timecache=GLOBALS->tims.start; } MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } void strace_search(int direction) { int i; int i_high_cnt = ((GLOBALS->strace_repeat_count > 0) ? GLOBALS->strace_repeat_count : 1) - 1; for(i=0;i<=i_high_cnt;i++) { strace_search_2(direction, (i == i_high_cnt)); } } /*********************************************/ /* * strace forward to make the timetrace */ TimeType strace_timetrace(TimeType basetime, int notfirst) { struct strace *s; TimeType maxbase, fintim; Trptr t; int totaltraces, passcount; int whichpass; fintim=GLOBALS->tims.last; for(whichpass=0;;whichpass++) { maxbase=MAX_HISTENT_TIME; s=GLOBALS->strace_ctx->straces; while(s) { t=s->trace; GLOBALS->shift_timebase=t->shift; if(!(t->vector)) { hptr h; UTimeType utt; TimeType tt; h=bsearch_node(t->n.nd, basetime - t->shift); s->his.h=h; while(h->time==h->next->time) h=h->next; if((whichpass)||(notfirst)) h=h->next; if(!h) return(MAX_HISTENT_TIME); utt=strace_adjust(h->time,GLOBALS->shift_timebase); tt=utt; if(tt < maxbase) maxbase=tt; } else { vptr v; UTimeType utt; TimeType tt; v=bsearch_vector(t->n.vec, basetime - t->shift); if((whichpass)||(notfirst)) v=v->next; if(!v) return(MAX_HISTENT_TIME); s->his.v=v; utt=strace_adjust(v->time,GLOBALS->shift_timebase); tt=utt; if(tt < maxbase) maxbase=tt; } s=s->next; } s=GLOBALS->strace_ctx->straces; totaltraces=0; /* increment when not don't care */ while(s) { char str[2]; t=s->trace; s->search_result=0; /* explicitly must set this */ GLOBALS->shift_timebase=t->shift; if((!t->vector)&&(!(t->n.nd->extvals))) { if(strace_adjust(s->his.h->time,GLOBALS->shift_timebase)!=maxbase) { s->his.h=bsearch_node(t->n.nd, maxbase - t->shift); while(s->his.h->next && s->his.h->time==s->his.h->next->time) s->his.h=s->his.h->next; } if(t->flags&TR_INVERT) { str[0]=AN_STR_INV[s->his.h->v.h_val]; } else { str[0]=AN_STR[s->his.h->v.h_val]; } str[1]=0x00; switch(s->value) { case ST_DC: break; case ST_HIGH: totaltraces++; if((str[0]=='1')||(str[0]=='h')||(str[0]=='H')) s->search_result=1; break; case ST_RISE: totaltraces++; if(((str[0]=='1')||(str[0]=='h')||(str[0]=='H'))&&(strace_adjust(s->his.h->time,GLOBALS->shift_timebase)==maxbase)) s->search_result=1; break; case ST_LOW: totaltraces++; if((str[0]=='0')||(str[0]=='l')||(str[0]=='L')) s->search_result=1; break; case ST_FALL: totaltraces++; if(((str[0]=='0')||(str[0]=='l')||(str[0]=='L'))&&(strace_adjust(s->his.h->time,GLOBALS->shift_timebase)==maxbase)) s->search_result=1; break; case ST_MID: totaltraces++; if((str[0]=='z')||(str[0]=='Z')) s->search_result=1; break; case ST_X: totaltraces++; if((str[0]=='x')||(str[0]=='X')) s->search_result=1; break; case ST_ANY: totaltraces++; if(strace_adjust(s->his.h->time,GLOBALS->shift_timebase)==maxbase)s->search_result=1; break; case ST_STRING: totaltraces++; if(s->string) if(strstr_i(s->string,str)) s->search_result=1; break; default: fprintf(stderr, "Internal error: st_type of %d\n",s->value); exit(255); } } else { char *chval, *chval2; char ch; if(t->vector) { if(strace_adjust(s->his.v->time,GLOBALS->shift_timebase)!=maxbase) { s->his.v=bsearch_vector(t->n.vec, maxbase - t->shift); while(s->his.v->next && s->his.v->time==s->his.v->next->time) s->his.v=s->his.v->next; } chval=convert_ascii(t,s->his.v); } else { if(strace_adjust(s->his.h->time,GLOBALS->shift_timebase)!=maxbase) { s->his.h=bsearch_node(t->n.nd, maxbase - t->shift); while(s->his.h->next && s->his.h->time==s->his.h->next->time) s->his.h=s->his.h->next; } if(s->his.h->flags&HIST_REAL) { if(!(s->his.h->flags&HIST_STRING)) { #ifdef WAVE_HAS_H_DOUBLE chval=convert_ascii_real(t, &s->his.h->v.h_double); #else chval=convert_ascii_real(t, (double *)s->his.h->v.h_vector); #endif } else { chval=convert_ascii_string((char *)s->his.h->v.h_vector); chval2=chval; while((ch=*chval2)) /* toupper() the string */ { if((ch>='a')&&(ch<='z')) { *chval2= ch-('a'-'A'); } chval2++; } } } else { chval=convert_ascii_vec(t,s->his.h->v.h_vector); } } switch(s->value) { case ST_DC: break; case ST_RISE: case ST_FALL: totaltraces++; break; case ST_HIGH: totaltraces++; if((chval2=chval)) while((ch=*(chval2++))) { if(((ch>='1')&&(ch<='9'))||(ch=='h')||(ch=='H')||((ch>='A')&&(ch<='F'))) { s->search_result=1; break; } } break; case ST_LOW: totaltraces++; if((chval2=chval)) { s->search_result=1; while((ch=*(chval2++))) { if((ch!='0')&&(ch!='l')&&(ch!='L')) { s->search_result=0; break; } } } break; case ST_MID: totaltraces++; if((chval2=chval)) { s->search_result=1; while((ch=*(chval2++))) { if((ch!='z')&&(ch!='Z')) { s->search_result=0; break; } } } break; case ST_X: totaltraces++; if((chval2=chval)) { s->search_result=1; while((ch=*(chval2++))) { if((ch!='x')&&(ch!='w')&&(ch!='X')&&(ch!='W')) { s->search_result=0; break; } } } break; case ST_ANY: totaltraces++; if(strace_adjust(s->his.v->time,GLOBALS->shift_timebase)==maxbase) s->search_result=1; break; case ST_STRING: totaltraces++; if(s->string) if(strstr_i(chval, s->string)) s->search_result=1; break; default: fprintf(stderr, "Internal error: st_type of %d\n",s->value); exit(255); } free_2(chval); } s=s->next; } if(maxbase>fintim) return(MAX_HISTENT_TIME); DEBUG(printf("Maxbase: "TTFormat", total traces: %d\n",maxbase, totaltraces)); s=GLOBALS->strace_ctx->straces; passcount=0; while(s) { DEBUG(printf("\tPass: %d, Name: %s\n",s->search_result, s->trace->name)); if(s->search_result) passcount++; s=s->next; } if(totaltraces) { if(GLOBALS->strace_ctx->logical_mutex[0]) /* and */ { if(totaltraces==passcount) break; } else if(GLOBALS->strace_ctx->logical_mutex[1]) /* or */ { if(passcount) break; } else if(GLOBALS->strace_ctx->logical_mutex[2]) /* xor */ { if(passcount&1) break; } else if(GLOBALS->strace_ctx->logical_mutex[3]) /* nand */ { if(totaltraces!=passcount) break; } else if(GLOBALS->strace_ctx->logical_mutex[4]) /* nor */ { if(!passcount) break; } else if(GLOBALS->strace_ctx->logical_mutex[5]) /* xnor */ { if(!(passcount&1)) break; } } basetime=maxbase; } return(maxbase); } void strace_maketimetrace(int mode) { TimeType basetime=GLOBALS->tims.first; TimeType endtime =MAX_HISTENT_TIME; int notfirst=0; TimeType *t; int t_allocated; if(GLOBALS->strace_ctx->timearray) { free_2(GLOBALS->strace_ctx->timearray); GLOBALS->strace_ctx->timearray=NULL; } GLOBALS->strace_ctx->timearray_size=0; if((!mode)&&(!GLOBALS->strace_ctx->shadow_active)) { update_mark_count_label(); delete_mprintf(); return; /* merely free stuff up */ } if(GLOBALS->strace_ctx->mark_idx_start>0) { if(GLOBALS->named_markers[GLOBALS->strace_ctx->mark_idx_start-1]>=0) basetime=GLOBALS->named_markers[GLOBALS->strace_ctx->mark_idx_start-1]; else { char notused[129]; sprintf(notused, "%s not in use.\n", item_mark_start_strings[(unsigned int)GLOBALS->strace_ctx->mark_idx_start].str); status_text(notused); } } if(GLOBALS->strace_ctx->mark_idx_end>0) { if(GLOBALS->named_markers[GLOBALS->strace_ctx->mark_idx_end-1]>=0) endtime=GLOBALS->named_markers[GLOBALS->strace_ctx->mark_idx_end-1]; else { char notused[129]; sprintf(notused, "%s not in use.\n", item_mark_end_strings[(unsigned int)GLOBALS->strace_ctx->mark_idx_end].str); status_text(notused); } } if(basetime>endtime) { TimeType tmp=basetime; basetime =endtime; endtime =tmp; } t_allocated = 1; t = malloc_2(sizeof(TimeType) * t_allocated); while(1) { basetime=strace_timetrace(basetime, notfirst); notfirst=1; if(endtime==MAX_HISTENT_TIME) { if(basetime==MAX_HISTENT_TIME) break; } else { if(basetime>endtime) break; /* formerly was >= which didn't mark the endpoint if true which is incorrect */ } /* i.e., if start is markable, end should be also */ t[GLOBALS->strace_ctx->timearray_size] = basetime; GLOBALS->strace_ctx->timearray_size++; if(GLOBALS->strace_ctx->timearray_size == t_allocated) { t_allocated *= 2; t = realloc_2(t, sizeof(TimeType) * t_allocated); } } if(GLOBALS->strace_ctx->timearray_size) { GLOBALS->strace_ctx->timearray = realloc_2(t, sizeof(TimeType) * GLOBALS->strace_ctx->timearray_size); } else { free_2(t); GLOBALS->strace_ctx->timearray = NULL; } if(!GLOBALS->strace_ctx->shadow_active) update_mark_count_label(); } /* * swap context for mark during trace load... */ void swap_strace_contexts(void) { struct strace *stemp; char logical_mutex_temp[6]; char mark_idx_start_temp, mark_idx_end_temp; stemp = GLOBALS->strace_ctx->straces; GLOBALS->strace_ctx->straces = GLOBALS->strace_ctx->shadow_straces; GLOBALS->strace_ctx->shadow_straces = stemp; memcpy(logical_mutex_temp, GLOBALS->strace_ctx->logical_mutex, 6); memcpy(GLOBALS->strace_ctx->logical_mutex, GLOBALS->strace_ctx->shadow_logical_mutex, 6); memcpy(GLOBALS->strace_ctx->shadow_logical_mutex, logical_mutex_temp, 6); mark_idx_start_temp = GLOBALS->strace_ctx->mark_idx_start; GLOBALS->strace_ctx->mark_idx_start = GLOBALS->strace_ctx->shadow_mark_idx_start; GLOBALS->strace_ctx->shadow_mark_idx_start = mark_idx_start_temp; mark_idx_end_temp = GLOBALS->strace_ctx->mark_idx_end; GLOBALS->strace_ctx->mark_idx_end = GLOBALS->strace_ctx->shadow_mark_idx_end; GLOBALS->strace_ctx->shadow_mark_idx_end = mark_idx_end_temp; } /* * delete context */ void delete_strace_context(void) { int i; struct strace *stemp; struct strace *strace_cache; for(i=0;i<6;i++) { GLOBALS->strace_ctx->shadow_logical_mutex[i] = 0; } GLOBALS->strace_ctx->shadow_mark_idx_start = 0; GLOBALS->strace_ctx->shadow_mark_idx_end = 0; strace_cache = GLOBALS->strace_ctx->straces; /* so the trace actually deletes */ GLOBALS->strace_ctx->straces=NULL; stemp = GLOBALS->strace_ctx->shadow_straces; while(stemp) { GLOBALS->strace_ctx->shadow_straces = stemp->next; if(stemp->string) free_2(stemp->string); FreeTrace(stemp->trace); free_2(stemp); stemp = GLOBALS->strace_ctx->shadow_straces; } if(GLOBALS->strace_ctx->shadow_string) { free_2(GLOBALS->strace_ctx->shadow_string); GLOBALS->strace_ctx->shadow_string = NULL; } GLOBALS->strace_ctx->straces = strace_cache; } /*************************************************************************/ /* * printf to memory.. */ int mprintf(const char *fmt, ... ) { int len; int rc; va_list args; struct mprintf_buff_t *bt = (struct mprintf_buff_t *)calloc_2(1, sizeof(struct mprintf_buff_t)); char buff[65537]; va_start(args, fmt); rc=vsprintf(buff, fmt, args); len = strlen(buff); bt->str = malloc_2(len+1); strcpy(bt->str, buff); if(!GLOBALS->strace_ctx->mprintf_buff_current) { GLOBALS->strace_ctx->mprintf_buff_head = GLOBALS->strace_ctx->mprintf_buff_current = bt; } else { GLOBALS->strace_ctx->mprintf_buff_current->next = bt; GLOBALS->strace_ctx->mprintf_buff_current = bt; } va_end(args); return(rc); } /* * kill mprint buffer */ void delete_mprintf(void) { if(GLOBALS->strace_ctx->mprintf_buff_head) { struct mprintf_buff_t *mb = GLOBALS->strace_ctx->mprintf_buff_head; struct mprintf_buff_t *mbt; while(mb) { free_2(mb->str); mbt = mb->next; free_2(mb); mb = mbt; } GLOBALS->strace_ctx->mprintf_buff_head = GLOBALS->strace_ctx->mprintf_buff_current = NULL; } } /* * so we can (later) write out the traces which are actually marked... */ void cache_actual_pattern_mark_traces(void) { Trptr t; unsigned int def=0; TimeType prevshift=LLDescriptor(0); struct strace *st; delete_mprintf(); if(GLOBALS->strace_ctx->timearray) { mprintf("!%d%d%d%d%d%d%c%c\n", GLOBALS->strace_ctx->logical_mutex[0], GLOBALS->strace_ctx->logical_mutex[1], GLOBALS->strace_ctx->logical_mutex[2], GLOBALS->strace_ctx->logical_mutex[3], GLOBALS->strace_ctx->logical_mutex[4], GLOBALS->strace_ctx->logical_mutex[5], '@'+GLOBALS->strace_ctx->mark_idx_start, '@'+GLOBALS->strace_ctx->mark_idx_end); st=GLOBALS->strace_ctx->straces; while(st) { if(st->value==ST_STRING) { mprintf("?\"%s\n", st->string ? st->string : ""); /* search type for this trace is string.. */ } else { mprintf("?%02x\n", (unsigned char)st->value); /* else search type for this trace.. */ } t=st->trace; if((t->flags!=def)||(st==GLOBALS->strace_ctx->straces)) { mprintf("@%x\n",def=t->flags); } if((t->shift)||((prevshift)&&(!t->shift))) { mprintf(">"TTFormat"\n", t->shift); } prevshift=t->shift; if(!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { if(t->vector) { int i; nptr *nodes; if(HasAlias(t)) { mprintf("+{%s} ",t->name_full); } mprintf("#{%s}",t->name); nodes=t->n.vec->bits->nodes; for(i=0;in.vec->bits->nnbits;i++) { int was_packed = HIER_DEPACK_STATIC; char *namex; if(nodes[i]->expansion) { namex = hier_decompress_flagged(nodes[i]->expansion->parent->nname, &was_packed); mprintf(" (%d)%s",nodes[i]->expansion->parentbit, namex); /* if(was_packed) free_2(namex); ...not needed for HIER_DEPACK_STATIC */ } else { /* namex = */ hier_decompress_flagged(nodes[i]->nname, &was_packed); /* scan-build */ mprintf(" %s",nodes[i]->nname); /* if(was_packed) free_2(namex); ...not needed for HIER_DEPACK_STATIC */ } } mprintf("\n"); } else { int was_packed = HIER_DEPACK_STATIC; char *namex; if(HasAlias(t)) { if(t->n.nd->expansion) { namex = hier_decompress_flagged(t->n.nd->expansion->parent->nname, &was_packed); mprintf("+{%s} (%d)%s\n",t->name+2,t->n.nd->expansion->parentbit, namex); /* if(was_packed) free_2(namex); ...not needed for HIER_DEPACK_STATIC */ } else { namex = hier_decompress_flagged(t->n.nd->nname, &was_packed); mprintf("+{%s} %s\n",t->name+2,namex); /* if(was_packed) free_2(namex); ...not needed for HIER_DEPACK_STATIC */ } } else { if(t->n.nd->expansion) { namex = hier_decompress_flagged(t->n.nd->expansion->parent->nname, &was_packed); mprintf("(%d)%s\n",t->n.nd->expansion->parentbit, namex); /* if(was_packed) free_2(namex); ...not needed for HIER_DEPACK_STATIC */ } else { namex = hier_decompress_flagged(t->n.nd->nname, &was_packed); mprintf("%s\n",namex); /* if(was_packed) free_2(namex); ...not needed for HIER_DEPACK_STATIC*/ } } } } st=st->next; } /* while(st)... */ mprintf("!!\n"); /* mark end of strace region */ } } gtkwave-3.3.86/src/ttranslate.c0000664000175000017500000005556113166335473015734 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010-2014. * * 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. */ #include "globals.h" #include #include #include "gtk12compat.h" #include "symbol.h" #include "ttranslate.h" #include "pipeio.h" #include "debug.h" #ifdef _MSC_VER #define strcasecmp _stricmp #endif static void args_entry_callback(GtkWidget *widget, GtkWidget *entry) { (void)widget; G_CONST_RETURN gchar *entry_text; entry_text=gtk_entry_get_text(GTK_ENTRY(entry)); entry_text = entry_text ? entry_text : ""; if(GLOBALS->ttranslate_args) { free_2(GLOBALS->ttranslate_args); } GLOBALS->ttranslate_args = strdup_2(entry_text); DEBUG(printf("Args Entry contents: %s\n",entry_text)); } void init_ttrans_data(void) { int i; if(!GLOBALS->ttranssel_filter) { GLOBALS->ttranssel_filter = calloc_2(TTRANS_FILTER_MAX+1, sizeof(char *)); } if(!GLOBALS->ttrans_filter) { GLOBALS->ttrans_filter = calloc_2(TTRANS_FILTER_MAX+1, sizeof(struct pipe_ctx *)); } for(i=0;ittranssel_filter[i] = NULL; GLOBALS->ttrans_filter[i] = NULL; } } void remove_all_ttrans_filters(void) { struct Global *GLOBALS_cache = GLOBALS; unsigned int i, j; for(j=0;jnum_notebook_pages;j++) { GLOBALS = (*GLOBALS->contexts)[j]; for(i=1;ittrans_filter[i]) { pipeio_destroy(GLOBALS->ttrans_filter[i]); GLOBALS->ttrans_filter[i] = NULL; } if(GLOBALS->ttranssel_filter[i]) { free_2(GLOBALS->ttranssel_filter[i]); GLOBALS->ttranssel_filter[i] = NULL; } } GLOBALS = GLOBALS_cache; } } int traverse_vector_nodes(Trptr t); static void regen_display(void) { if(GLOBALS->signalarea && GLOBALS->wavearea) { GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } /* * this is likely obsolete */ #if 0 static void remove_ttrans_filter(int which, int regen) { if(GLOBALS->ttrans_filter[which]) { pipeio_destroy(GLOBALS->ttrans_filter[which]); GLOBALS->ttrans_filter[which] = NULL; if(regen) { regen_display(); } } } #endif static void load_ttrans_filter(int which, char *name) { FILE *stream; char *cmd; char exec_name[1025]; char abs_path [1025]; char* arg, end; int result; exec_name[0] = 0; abs_path[0] = 0; /* if name has arguments grab only the first word (the name of the executable)*/ sscanf(name, "%s ", exec_name); arg = name + strlen(exec_name); /* remove leading spaces from argument */ while (isspace((int)(unsigned char)arg[0])) { arg++; } /* remove trailing spaces from argument */ if (strlen(arg) > 0) { end = strlen(arg) - 1; while (arg[(int)end] == ' ') { arg[(int)end] = 0; end--; } } /* turn the exec_name into an absolute path */ #if !defined __MINGW32__ && !defined _MSC_VER cmd = (char *)malloc_2(strlen(exec_name)+6+1); sprintf(cmd, "which %s", exec_name); stream = popen(cmd, "r"); result = fscanf(stream, "%s", abs_path); if((strlen(abs_path) == 0)||(!result)) { status_text("Could not find transaction filter process!\n"); pclose(stream); /* cppcheck */ return; } pclose(stream); free_2(cmd); #else strcpy(abs_path, exec_name); #endif /* remove_ttrans_filter(which, 0); ... should never happen from GUI, but perhaps possible from save files or other weirdness */ if(!GLOBALS->ttrans_filter[which]) { GLOBALS->ttrans_filter[which] = pipeio_create(abs_path, arg); } } int install_ttrans_filter(int which) { int found = 0; if((which<0)||(which>=(PROC_FILTER_MAX+1))) { which = 0; } if(GLOBALS->traces.first) { Trptr t = GLOBALS->traces.first; while(t) { if(t->flags&TR_HIGHLIGHT) { if((!t->vector) && (which)) { bvptr v = combine_traces(1, t); /* down: make single signal a vector */ if(v) { v->transaction_nd = t->n.nd; /* cache for savefile, disable */ t->vector = 1; t->n.vec = v; /* splice in */ } } if((t->vector) && (!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH)))) { t->t_filter = which; t->t_filter_converted = 0; /* back out allocation to revert (if any) */ if(t->n.vec->transaction_cache) { int i; bvptr bv = t->n.vec; bvptr bv2; nptr ndcache = NULL; t->n.vec = bv->transaction_cache; if((t->n.vec->transaction_nd) && (!which)) { ndcache = t->n.vec->transaction_nd; } while(bv) { bv2 = bv->transaction_chain; if(bv->bvname) { free_2(bv->bvname); } for(i=0;inumregions;i++) { free_2(bv->vectors[i]); } free_2(bv); bv = bv2; } t->name = t->n.vec->bvname; if(GLOBALS->hier_max_level) t->name = hier_extract(t->name, GLOBALS->hier_max_level); if(ndcache) { t->n.nd = ndcache; t->vector = 0; /* still need to deallocate old t->n.vec! */ } } if(!which) { t->flags &= (~(TR_TTRANSLATED|TR_ANALOGMASK)); } else { t->flags &= (~(TR_ANALOGMASK)); t->flags |= TR_TTRANSLATED; if(t->transaction_args) free_2(t->transaction_args); if(GLOBALS->ttranslate_args) { t->transaction_args = strdup_2(GLOBALS->ttranslate_args); } else { t->transaction_args = NULL; } traverse_vector_nodes(t); } found++; if(t->t_match) { Trptr curr_trace = t; t = t->t_next; while(t && (t->t_match != curr_trace)) { t = t->t_next; } } } } t=GiveNextTrace(t); } } if(found) { regen_display(); } return(found); } /************************************************************************/ static void destroy_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; GLOBALS->is_active_ttranslate_c_2=0; gtk_widget_destroy(GLOBALS->window_ttranslate_c_5); GLOBALS->window_ttranslate_c_5 = NULL; } static void ok_callback(GtkWidget *widget, GtkWidget *nothing) { install_ttrans_filter(GLOBALS->current_filter_ttranslate_c_1); destroy_callback(widget, nothing); } static void select_row_callback(GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data) { (void)widget; (void)column; (void)event; (void)data; GLOBALS->current_filter_ttranslate_c_1 = row + 1; } static void unselect_row_callback(GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data) { (void)widget; (void)row; (void)column; (void)event; (void)data; GLOBALS->current_filter_ttranslate_c_1 = 0; /* none */ } static void add_filter_callback_2(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; int i; GtkCList *cl; if(!GLOBALS->filesel_ok) { return; } if(*GLOBALS->fileselbox_text) { for(i=0;inum_ttrans_filters;i++) { if(GLOBALS->ttranssel_filter[i]) { if(!strcmp(GLOBALS->ttranssel_filter[i], *GLOBALS->fileselbox_text)) { status_text("Filter already imported.\n"); if(GLOBALS->is_active_ttranslate_c_2) gdk_window_raise(GLOBALS->window_ttranslate_c_5->window); return; } } } } GLOBALS->num_ttrans_filters++; load_ttrans_filter(GLOBALS->num_ttrans_filters, *GLOBALS->fileselbox_text); if(GLOBALS->ttrans_filter[GLOBALS->num_ttrans_filters]) { if(GLOBALS->ttranssel_filter[GLOBALS->num_ttrans_filters]) free_2(GLOBALS->ttranssel_filter[GLOBALS->num_ttrans_filters]); GLOBALS->ttranssel_filter[GLOBALS->num_ttrans_filters] = malloc_2(strlen(*GLOBALS->fileselbox_text) + 1); strcpy(GLOBALS->ttranssel_filter[GLOBALS->num_ttrans_filters], *GLOBALS->fileselbox_text); cl=GTK_CLIST(GLOBALS->clist_ttranslate_c_2); gtk_clist_freeze(cl); gtk_clist_append(cl,(gchar **)&(GLOBALS->ttranssel_filter[GLOBALS->num_ttrans_filters])); gtk_clist_set_column_width(cl,0,gtk_clist_optimal_column_width(cl,0)); gtk_clist_thaw(cl); } else { GLOBALS->num_ttrans_filters--; } if(GLOBALS->is_active_ttranslate_c_2) gdk_window_raise(GLOBALS->window_ttranslate_c_5->window); } static void add_filter_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; if(GLOBALS->num_ttrans_filters == TTRANS_FILTER_MAX) { status_text("Max number of transaction filters processes installed already.\n"); return; } fileselbox("Select Transaction Filter Process",&GLOBALS->fcurr_ttranslate_c_1,GTK_SIGNAL_FUNC(add_filter_callback_2), GTK_SIGNAL_FUNC(NULL),"*", 0); } /* * mainline.. */ void ttrans_searchbox(char *title) { int i; GtkWidget *scrolled_win; GtkWidget *vbox1, *hbox, *hbox0; GtkWidget *button1, *button5, *button6; gchar *titles[]={"Transaction Process Filter Select"}; GtkWidget *frame2, *frameh, *frameh0; GtkWidget *table; GtkTooltips *tooltips; GtkWidget *label; GtkWidget *entry; if(GLOBALS->is_active_ttranslate_c_2) { gdk_window_raise(GLOBALS->window_ttranslate_c_5->window); return; } GLOBALS->is_active_ttranslate_c_2=1; GLOBALS->current_filter_ttranslate_c_1 = 0; /* create a new modal window */ GLOBALS->window_ttranslate_c_5 = gtk_window_new(GLOBALS->disable_window_manager ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL); install_focus_cb(GLOBALS->window_ttranslate_c_5, ((char *)&GLOBALS->window_ttranslate_c_5) - ((char *)GLOBALS)); gtk_window_set_title(GTK_WINDOW (GLOBALS->window_ttranslate_c_5), title); gtkwave_signal_connect(GTK_OBJECT (GLOBALS->window_ttranslate_c_5), "delete_event",(GtkSignalFunc) destroy_callback, NULL); tooltips=gtk_tooltips_new_2(); table = gtk_table_new (256, 1, FALSE); gtk_widget_show (table); vbox1 = gtk_vbox_new (FALSE, 0); gtk_container_border_width (GTK_CONTAINER (vbox1), 3); gtk_widget_show (vbox1); frame2 = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (frame2), 3); gtk_widget_show(frame2); gtk_table_attach (GTK_TABLE (table), frame2, 0, 1, 0, 253, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); GLOBALS->clist_ttranslate_c_2=gtk_clist_new_with_titles(1,titles); gtk_clist_column_titles_passive(GTK_CLIST(GLOBALS->clist_ttranslate_c_2)); gtk_clist_set_selection_mode(GTK_CLIST(GLOBALS->clist_ttranslate_c_2), GTK_SELECTION_EXTENDED); gtkwave_signal_connect_object (GTK_OBJECT (GLOBALS->clist_ttranslate_c_2), "select_row",GTK_SIGNAL_FUNC(select_row_callback),NULL); gtkwave_signal_connect_object (GTK_OBJECT (GLOBALS->clist_ttranslate_c_2), "unselect_row",GTK_SIGNAL_FUNC(unselect_row_callback),NULL); for(i=0;inum_ttrans_filters;i++) { gtk_clist_append(GTK_CLIST(GLOBALS->clist_ttranslate_c_2),(gchar **)&(GLOBALS->ttranssel_filter[i+1])); } gtk_clist_set_column_width(GTK_CLIST(GLOBALS->clist_ttranslate_c_2),0,gtk_clist_optimal_column_width(GTK_CLIST(GLOBALS->clist_ttranslate_c_2),0)); gtk_widget_show (GLOBALS->clist_ttranslate_c_2); scrolled_win = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_set_usize( GTK_WIDGET (scrolled_win), -1, 300); gtk_widget_show(scrolled_win); /* gtk_scrolled_window_add_with_viewport doesn't seen to work right here.. */ gtk_container_add (GTK_CONTAINER (scrolled_win), GLOBALS->clist_ttranslate_c_2); gtk_container_add (GTK_CONTAINER (frame2), scrolled_win); frameh0 = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (frameh0), 3); gtk_widget_show(frameh0); gtk_table_attach (GTK_TABLE (table), frameh0, 0, 1, 253, 254, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); hbox0 = gtk_hbox_new (FALSE, 1); gtk_widget_show (hbox0); button6 = gtk_button_new_with_label (" Add Trans Filter to List "); gtk_container_border_width (GTK_CONTAINER (button6), 3); gtkwave_signal_connect_object (GTK_OBJECT (button6), "clicked",GTK_SIGNAL_FUNC(add_filter_callback),GTK_OBJECT (GLOBALS->window_ttranslate_c_5)); gtk_widget_show (button6); gtk_tooltips_set_tip_2(tooltips, button6, "Bring up a file requester to add a transaction process filter to the filter select window.",NULL); gtk_box_pack_start (GTK_BOX (hbox0), button6, TRUE, FALSE, 0); gtk_container_add (GTK_CONTAINER (frameh0), hbox0); /* args entry box */ { Trptr t=GLOBALS->traces.first; while(t) { if(t->flags&TR_HIGHLIGHT) { if(t->transaction_args) { if(GLOBALS->ttranslate_args) free_2(GLOBALS->ttranslate_args); GLOBALS->ttranslate_args = strdup_2(t->transaction_args); break; } } t=t->t_next; } frameh0 = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (frameh0), 3); gtk_widget_show(frameh0); gtk_table_attach (GTK_TABLE (table), frameh0, 0, 1, 254, 255, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); label=gtk_label_new("Args:"); entry=gtk_entry_new_with_max_length(1025); gtk_entry_set_text(GTK_ENTRY(entry), GLOBALS->ttranslate_args ? GLOBALS->ttranslate_args : ""); gtk_signal_connect (GTK_OBJECT (entry), "activate",GTK_SIGNAL_FUNC (args_entry_callback), entry); gtk_signal_connect (GTK_OBJECT (entry), "changed",GTK_SIGNAL_FUNC (args_entry_callback), entry); hbox0=gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox0), label, FALSE, FALSE, 0); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox0), entry, TRUE, TRUE, 0); gtk_widget_show(entry); gtk_widget_show(hbox0); gtk_container_add (GTK_CONTAINER (frameh0), hbox0); } /* bottom OK/Cancel part */ frameh = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (frameh), 3); gtk_widget_show(frameh); gtk_table_attach (GTK_TABLE (table), frameh, 0, 1, 255, 256, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); hbox = gtk_hbox_new (FALSE, 1); gtk_widget_show (hbox); button1 = gtk_button_new_with_label (" OK "); gtk_container_border_width (GTK_CONTAINER (button1), 3); gtkwave_signal_connect_object (GTK_OBJECT (button1), "clicked",GTK_SIGNAL_FUNC(ok_callback),GTK_OBJECT (GLOBALS->window_ttranslate_c_5)); gtk_widget_show (button1); gtk_tooltips_set_tip_2(tooltips, button1, "Add selected signals to end of the display on the main window.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button1, TRUE, FALSE, 0); button5 = gtk_button_new_with_label (" Cancel "); gtk_container_border_width (GTK_CONTAINER (button5), 3); gtkwave_signal_connect_object (GTK_OBJECT (button5), "clicked",GTK_SIGNAL_FUNC(destroy_callback),GTK_OBJECT (GLOBALS->window_ttranslate_c_5)); gtk_tooltips_set_tip_2(tooltips, button5, "Do nothing and return to the main window.",NULL); gtk_widget_show (button5); gtk_box_pack_start (GTK_BOX (hbox), button5, TRUE, FALSE, 0); gtk_container_add (GTK_CONTAINER (frameh), hbox); gtk_container_add (GTK_CONTAINER (GLOBALS->window_ttranslate_c_5), table); gtk_widget_set_usize(GTK_WIDGET(GLOBALS->window_ttranslate_c_5), 400, 400); gtk_widget_show(GLOBALS->window_ttranslate_c_5); } /* * currently only called by parsewavline */ void set_current_translate_ttrans(char *name) { int i; for(i=1;inum_ttrans_filters+1;i++) { if(!strcmp(GLOBALS->ttranssel_filter[i], name)) { GLOBALS->current_translate_ttrans = i; return; } } if(GLOBALS->num_ttrans_filters < TTRANS_FILTER_MAX) { GLOBALS->num_ttrans_filters++; load_ttrans_filter(GLOBALS->num_ttrans_filters, name); if(!GLOBALS->ttrans_filter[GLOBALS->num_ttrans_filters]) { GLOBALS->num_ttrans_filters--; GLOBALS->current_translate_ttrans = 0; } else { if(GLOBALS->ttranssel_filter[GLOBALS->num_ttrans_filters]) free_2(GLOBALS->ttranssel_filter[GLOBALS->num_ttrans_filters]); GLOBALS->ttranssel_filter[GLOBALS->num_ttrans_filters] = malloc_2(strlen(name) + 1); strcpy(GLOBALS->ttranssel_filter[GLOBALS->num_ttrans_filters], name); GLOBALS->current_translate_ttrans = GLOBALS->num_ttrans_filters; } } } int traverse_vector_nodes(Trptr t) { int i; int cvt_ok = 0; if((t->t_filter) && (t->flags & TR_TTRANSLATED) && (t->vector) && (!t->t_filter_converted)) { #if !defined _MSC_VER && !defined __MINGW32__ int rc = save_nodes_to_trans(GLOBALS->ttrans_filter[t->t_filter]->sout, t); #else int rc = save_nodes_to_trans((FILE *)(GLOBALS->ttrans_filter[t->t_filter]->g_hChildStd_IN_Wr), t); #endif if(rc == VCDSAV_OK) { int is_finish = 0; bvptr prev_transaction_trace = NULL; while(!is_finish) { struct VectorEnt *vt_head = NULL, *vt_curr = NULL; struct VectorEnt *vt; struct VectorEnt *vprev; bvptr bv; int regions = 2; TimeType prev_tim = LLDescriptor(-1); char *trace_name = NULL; char *orig_name = t->n.vec->bvname; cvt_ok = 1; vt_head = vt_curr = vt = calloc_2(1, sizeof(struct VectorEnt) + 1); vt->time = LLDescriptor(-2); vprev = vt; /* for duplicate removal */ vt_curr = vt_curr->next = vt = calloc_2(1, sizeof(struct VectorEnt) + 1); vt->time = LLDescriptor(-1); for(;;) { char buf[1025]; char *pnt, *rtn; #if !defined _MSC_VER && !defined __MINGW32__ if(feof(GLOBALS->ttrans_filter[t->t_filter]->sin)) break; /* should never happen */ buf[0] = 0; pnt = fgets(buf, 1024, GLOBALS->ttrans_filter[t->t_filter]->sin); if(!pnt) break; rtn = pnt; while(*rtn) { if((*rtn == '\n') || (*rtn == '\r')) { *rtn = 0; break; } rtn++; } #else { BOOL bSuccess; DWORD dwRead; int n; for(n=0;n<1024;n++) { do { bSuccess = ReadFile(GLOBALS->ttrans_filter[t->t_filter]->g_hChildStd_OUT_Rd, buf+n, 1, &dwRead, NULL); if((!bSuccess)||(buf[n]=='\n')) { goto ex; } } while(buf[n]=='\r'); } ex: buf[n] = 0; pnt = buf; } #endif while(*pnt) { if(isspace((int)(unsigned char)*pnt)) pnt++; else break;} if(*pnt=='#') { TimeType tim = atoi_64(pnt+1) * GLOBALS->time_scale; int slen; char *sp; while(*pnt) { if(!isspace((int)(unsigned char)*pnt)) pnt++; else break; } while(*pnt) { if(isspace((int)(unsigned char)*pnt)) pnt++; else break; } sp = pnt; slen = strlen(sp); if(slen) { pnt = sp + slen - 1; do { if(isspace((int)(unsigned char)*pnt)) { *pnt = 0; pnt--; slen--; } else { break; } } while(pnt != (sp-1)); } vt = calloc_2(1, sizeof(struct VectorEnt) + slen + 1); if(sp) strcpy((char *)vt->v, sp); if(tim > prev_tim) { prev_tim = vt->time = tim; vt_curr->next = vt; vt_curr = vt; vprev = vprev->next; /* bump forward the -2 node pointer */ regions++; } else if(tim == prev_tim) { vt->time = prev_tim; free_2(vt_curr); vt_curr = vprev->next = vt; /* splice new one in -1 node place */ } else { free_2(vt); /* throw it away */ } continue; } else if((*pnt=='M')||(*pnt=='m')) { int mlen; pnt++; mlen = bijective_marker_id_string_len(pnt); if(mlen) { int which_marker = bijective_marker_id_string_hash(pnt); if((which_marker >= 0) && (which_marker < WAVE_NUM_NAMED_MARKERS)) { TimeType tim = atoi_64(pnt+mlen) * GLOBALS->time_scale; int slen; char *sp; if(tim < LLDescriptor(0)) tim = LLDescriptor(-1); GLOBALS->named_markers[which_marker] = tim; while(*pnt) { if(!isspace((int)(unsigned char)*pnt)) pnt++; else break; } while(*pnt) { if(isspace((int)(unsigned char)*pnt)) pnt++; else break; } sp = pnt; slen = strlen(sp); if(slen) { pnt = sp + slen - 1; do { if(isspace((int)(unsigned char)*pnt)) { *pnt = 0; pnt--; slen--; } else { break; } } while(pnt != (sp-1)); } if(GLOBALS->marker_names[which_marker]) free_2(GLOBALS->marker_names[which_marker]); GLOBALS->marker_names[which_marker] = (sp && (*sp) && (tim >= LLDescriptor(0))) ? strdup_2(sp) : NULL; } } continue; } else if(*pnt == '$') { if(!strncmp(pnt+1, "finish", 6)) { is_finish = 1; break; } else if(!strncmp(pnt+1, "next", 4)) { break; } else if(!strncmp(pnt+1, "name", 4)) { int slen; char *sp; pnt+=5; while(*pnt) { if(isspace((int)(unsigned char)*pnt)) pnt++; else break; } sp = pnt; slen = strlen(sp); if(slen) { pnt = sp + slen - 1; do { if(isspace((int)(unsigned char)*pnt)) { *pnt = 0; pnt--; slen--; } else { break; } } while(pnt != (sp-1)); } if(sp && *sp) { if(trace_name) free_2(trace_name); trace_name = strdup_2(sp); } } } } vt_curr = vt_curr->next = vt = calloc_2(1, sizeof(struct VectorEnt) + 1); vt->time = MAX_HISTENT_TIME - 1; regions++; /* vt_curr = */ vt_curr->next = vt = calloc_2(1, sizeof(struct VectorEnt) + 1); /* scan-build */ vt->time = MAX_HISTENT_TIME; regions++; bv = calloc_2(1, sizeof(struct BitVector) + (sizeof(vptr) * (regions))); bv->bvname = strdup_2(trace_name ? trace_name : orig_name); bv->nbits = 1; bv->numregions = regions; bv->bits = t->n.vec->bits; vt = vt_head; for(i=0;ivectors[i] = vt; vt = vt->next; } if(!prev_transaction_trace) { prev_transaction_trace = bv; bv->transaction_cache = t->n.vec; /* for possible restore later */ t->n.vec = bv; t->t_filter_converted = 1; if(trace_name) /* if NULL, no need to regen display as trace name didn't change */ { t->name = t->n.vec->bvname; if(GLOBALS->hier_max_level) t->name = hier_extract(t->name, GLOBALS->hier_max_level); regen_display(); } } else { prev_transaction_trace->transaction_chain = bv; prev_transaction_trace = bv; } } } else { /* failed */ t->flags &= ~(TR_TTRANSLATED|TR_ANALOGMASK); } } return(cvt_ok); } gtkwave-3.3.86/src/debug.c0000664000175000017500000003251013166335473014626 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2014. * * 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. */ /* * debug.c 01feb99ajb * malloc debugs added on 13jul99ajb * malloc tracking added on 05aug07ajb for 3.1 series */ #include #include #include #include #include "globals.h" #include "debug.h" #ifdef _WAVE_HAVE_JUDY #include #endif #ifdef HAVE_SYS_STAT_H #include #include "fstapi.h" #include "lxt2_read.h" #include "lxt.h" #include "vzt_read.h" #endif #undef free_2 #undef malloc_2 #undef realloc_2 #undef calloc_2 #ifdef _WAVE_HAVE_JUDY void free_outstanding(void) { Pvoid_t PJArray = (Pvoid_t)GLOBALS->alloc2_chain; int rcValue; Word_t Index; #ifdef DEBUG_PRINTF int ctr = 0; printf("\n*** cleanup ***\n"); printf("Freeing %d chunks\n", GLOBALS->outstanding); system("date"); #endif if(GLOBALS->s_selected) { destroy_s_selected(); } Index = 0; for (rcValue = Judy1First(PJArray, &Index, PJE0); rcValue != 0; rcValue = Judy1Next(PJArray, &Index, PJE0)) { free((void *)Index); #ifdef DEBUG_PRINTF ctr++; #endif } Judy1FreeArray(&PJArray, PJE0); GLOBALS->alloc2_chain = NULL; GLOBALS->outstanding = 0; #ifdef DEBUG_PRINTF printf("Freed %d chunks\n", ctr); system("date"); #endif } #else void free_outstanding(void) { void **t = (void **)GLOBALS->alloc2_chain; void **t2; int ctr = 0; #ifdef DEBUG_PRINTF printf("\n*** cleanup ***\n"); printf("Freeing %d chunks\n", GLOBALS->outstanding); system("date"); #endif while(t) { t2 = (void **) *(t+1); free(t); t = t2; ctr++; } GLOBALS->alloc2_chain = NULL; GLOBALS->outstanding = 0; #ifdef DEBUG_PRINTF printf("Freed %d chunks\n", ctr); system("date"); #endif } #endif /* * wrapped malloc family... */ #ifdef _WAVE_HAVE_JUDY void *malloc_2(size_t size #ifdef DEBUG_MALLOC_LINES , char *filename, int lineno #endif ) { void *ret; ret=malloc(size); if(ret) { Judy1Set ((Pvoid_t)&GLOBALS->alloc2_chain, (Word_t)ret, PJE0); GLOBALS->outstanding++; return(ret); } else { #ifdef DEBUG_MALLOC_LINES fprintf(stderr, "FATAL ERROR: malloc_2() Out of memory, sorry. ['%s', %d]\n", filename, lineno); #else fprintf(stderr, "FATAL ERROR: malloc_2() Out of memory, sorry.\n"); #endif exit(1); } } #else void *malloc_2(size_t size #ifdef DEBUG_MALLOC_LINES , char *filename, int lineno #endif ) { void *ret; ret=malloc(size + 2*sizeof(void *)); if(ret) { void **ret2 = (void **)ret; *(ret2+0) = NULL; *(ret2+1) = GLOBALS->alloc2_chain; if(GLOBALS->alloc2_chain) { *(GLOBALS->alloc2_chain+0) = ret2; } GLOBALS->alloc2_chain = ret2; GLOBALS->outstanding++; return((char *)ret + 2*sizeof(void *)); } else { #ifdef DEBUG_MALLOC_LINES fprintf(stderr, "FATAL ERROR: malloc_2() Out of memory, sorry. ['%s', %d]\n", filename, lineno); #else fprintf(stderr, "FATAL ERROR: malloc_2() Out of memory, sorry.\n"); #endif exit(1); } } #endif #ifdef _WAVE_HAVE_JUDY void *realloc_2(void *ptr, size_t size #ifdef DEBUG_MALLOC_LINES , char *filename, int lineno #endif ) { void *ret=realloc(ptr, size); if(ret) { if(ptr != ret) { Judy1Unset ((Pvoid_t)&GLOBALS->alloc2_chain, (Word_t)ptr, PJE0); Judy1Set ((Pvoid_t)&GLOBALS->alloc2_chain, (Word_t)ret, PJE0); } return(ret); } else { #ifdef DEBUG_MALLOC_LINES fprintf(stderr, "FATAL ERROR: realloc_2() Out of memory, sorry. ['%s', %d]\n", filename, lineno); #else fprintf(stderr, "FATAL ERROR: realloc_2() Out of memory, sorry.\n"); #endif exit(1); } } #else void *realloc_2(void *ptr, size_t size #ifdef DEBUG_MALLOC_LINES , char *filename, int lineno #endif ) { void *ret; void **ret2 = ((void **)ptr) - 2; void **prv = (void **)*(ret2+0); void **nxt = (void **)*(ret2+1); if(prv) { *(prv+1) = nxt; } else { GLOBALS->alloc2_chain = nxt; } if(nxt) { *(nxt+0) = prv; } ret=realloc((char *)ptr - 2*sizeof(void *), size + 2*sizeof(void *)); ret2 = (void **)ret; *(ret2+0) = NULL; *(ret2+1) = GLOBALS->alloc2_chain; if(GLOBALS->alloc2_chain) { *(GLOBALS->alloc2_chain+0) = ret2; } GLOBALS->alloc2_chain = ret2; if(ret) { return((char *)ret + 2*sizeof(void *)); } else { #ifdef DEBUG_MALLOC_LINES fprintf(stderr, "FATAL ERROR: realloc_2() Out of memory, sorry. ['%s', %d]\n", filename, lineno); #else fprintf(stderr, "FATAL ERROR: realloc_2() Out of memory, sorry.\n"); #endif exit(1); } } #endif #ifdef _WAVE_HAVE_JUDY void *calloc_2_into_context(struct Global *g, size_t nmemb, size_t size #ifdef DEBUG_MALLOC_LINES , char *filename, int lineno #endif ) { void *ret; ret=calloc(nmemb, size); if(ret) { Judy1Set ((Pvoid_t)&g->alloc2_chain, (Word_t)ret, PJE0); g->outstanding++; return(ret); } else { #ifdef DEBUG_MALLOC_LINES fprintf(stderr, "FATAL ERROR: calloc_2() Out of memory, sorry. ['%s', %d]\n", filename, lineno); #else fprintf(stderr, "FATAL ERROR: calloc_2() Out of memory, sorry.\n"); #endif exit(1); } } #else void *calloc_2_into_context(struct Global *g, size_t nmemb, size_t size #ifdef DEBUG_MALLOC_LINES , char *filename, int lineno #endif ) { void *ret; ret=calloc(1, (nmemb * size) + 2*sizeof(void *)); if(ret) { void **ret2 = (void **)ret; *(ret2+0) = NULL; *(ret2+1) = g->alloc2_chain; if(g->alloc2_chain) { *(g->alloc2_chain+0) = ret2; } g->alloc2_chain = ret2; g->outstanding++; return((char *)ret + 2*sizeof(void *)); } else { #ifdef DEBUG_MALLOC_LINES fprintf(stderr, "FATAL ERROR: calloc_2() Out of memory, sorry. ['%s', %d]\n", filename, lineno); #else fprintf(stderr, "FATAL ERROR: calloc_2() Out of memory, sorry.\n"); #endif exit(1); } } #endif void *calloc_2(size_t nmemb, size_t size #ifdef DEBUG_MALLOC_LINES , char *filename, int lineno #endif ) { return(calloc_2_into_context(GLOBALS, nmemb, size #ifdef DEBUG_MALLOC_LINES , filename, lineno #endif )); } #ifdef _WAVE_HAVE_JUDY void free_2(void *ptr #ifdef DEBUG_MALLOC_LINES , char *filename, int lineno #endif ) { if(ptr) { int delstat = Judy1Unset ((Pvoid_t)&GLOBALS->alloc2_chain, (Word_t)ptr, PJE0); if(delstat) { GLOBALS->outstanding--; free(ptr); } else { #ifdef DEBUG_MALLOC_LINES printf("JUDYMEM | free to non-malloc'd address %p blocked ['%s', %d]\n", ptr, filename, lineno); #else printf("JUDYMEM | free to non-malloc'd address %p blocked\n", ptr); #endif } } else { #ifdef DEBUG_MALLOC_LINES fprintf(stderr, "WARNING: Attempt to free NULL pointer caught. ['%s', %d]\n", filename, lineno); #else fprintf(stderr, "WARNING: Attempt to free NULL pointer caught.\n"); #endif } } #else void free_2(void *ptr #ifdef DEBUG_MALLOC_LINES , char *filename, int lineno #endif ) { if(ptr) { void **ret2 = ((void **)ptr) - 2; void **prv = (void **)*(ret2+0); void **nxt = (void **)*(ret2+1); if(prv) { *(prv+1) = nxt; } else { GLOBALS->alloc2_chain = nxt; } if(nxt) { *(nxt+0) = prv; } GLOBALS->outstanding--; free((char *)ptr - 2*sizeof(void *)); } else { #ifdef DEBUG_MALLOC_LINES fprintf(stderr, "WARNING: Attempt to free NULL pointer caught. ['%s', %d]\n", filename, lineno); #else fprintf(stderr, "WARNING: Attempt to free NULL pointer caught.\n"); #endif } } #endif #ifdef DEBUG_MALLOC_LINES #define malloc_2(x) malloc_2((x),__FILE__,__LINE__) #endif char *strdup_2(const char *s) { char *s2 = NULL; if(s) { int nbytes = strlen(s) + 1; s2 = malloc_2(nbytes); memcpy(s2, s, nbytes); } return(s2); } char *strdup_2s(const char *s) { char *s2 = NULL; if(s) { int len = strlen(s); s2 = malloc(len+2); memcpy(s2, s, len); s2[len++] = ' '; s2[len] = 0; } return(s2); } /* * atoi 64-bit version.. * y/on default to '1' * n/nonnum default to '0' */ TimeType atoi_64(const char *str) { TimeType val=0; unsigned char ch, nflag=0; int consumed = 0; GLOBALS->atoi_cont_ptr=NULL; switch(*str) { case 'y': case 'Y': return(LLDescriptor(1)); case 'o': case 'O': str++; ch=*str; if((ch=='n')||(ch=='N')) return(LLDescriptor(1)); else return(LLDescriptor(0)); case 'n': case 'N': return(LLDescriptor(0)); break; default: break; } while((ch=*(str++))) { if((ch>='0')&&(ch<='9')) { val=(val*10+(ch&15)); consumed = 1; } else if((ch=='-')&&(val==0)&&(!nflag)) { nflag=1; consumed = 1; } else if(consumed) { GLOBALS->atoi_cont_ptr=str-1; break; } } return(nflag?(-val):val); } /* * wrapped tooltips */ void gtk_tooltips_set_tip_2(GtkTooltips *tooltips, GtkWidget *widget, const gchar *tip_text, const gchar *tip_private) { if(!GLOBALS->disable_tooltips) { gtk_tooltips_set_tip(tooltips, widget, tip_text, tip_private); } } void gtk_tooltips_set_delay_2(GtkTooltips *tooltips, guint delay) { if(!GLOBALS->disable_tooltips) { gtk_tooltips_set_delay(tooltips, delay); } } GtkTooltips* gtk_tooltips_new_2(void) { if(!GLOBALS->disable_tooltips) { return(gtk_tooltips_new()); } else { return(NULL); } } char *tmpnam_2(char *s, int *fd) { (void)s; #if defined _MSC_VER || defined __MINGW32__ char *fname = NULL; TCHAR szTempFileName[MAX_PATH]; TCHAR lpTempPathBuffer[MAX_PATH]; DWORD dwRetVal = 0; UINT uRetVal = 0; *fd = -1; dwRetVal = GetTempPath(MAX_PATH, lpTempPathBuffer); if((dwRetVal > MAX_PATH) || (dwRetVal == 0)) { fprintf(stderr, "GetTempPath() failed\n"); } else { uRetVal = GetTempFileName(lpTempPathBuffer, TEXT("GTKW"), 0, szTempFileName); if (uRetVal == 0) { fprintf(stderr, "GetTempFileName() failed\n"); } else { fname = strdup_2(szTempFileName); } } return(fname); #else char *backpath = "gtkwaveXXXXXX"; char *tmpspace; int len = strlen(P_tmpdir); int i; unsigned char slash = '/'; for(i=0;iloaded_file_name, "."EXTLOAD_SUFFIX)) { return(rc); } #endif #ifdef AET2_IS_PRESENT if(suffix_check(GLOBALS->loaded_file_name, ".aet") || suffix_check(GLOBALS->loaded_file_name, ".ae2")) { return(rc); } #endif memset(&buf, 0, sizeof(struct stat)); if(stat(path, &buf) == 0) { if(S_ISREG(buf.st_mode)) { FILE *f = fopen(path, "rb"); if(f) { int hdr[2] = { 0, 0 }; unsigned int magic_word; hdr[0] = fgetc(f); hdr[1] = fgetc(f); if((hdr[0] != EOF) && (hdr[1] != EOF)) { magic_word = (hdr[0] * 256) + hdr[1]; switch(magic_word) { case LT_HDRID: rc = G_FT_LXT; break; case LXT2_RD_HDRID: rc = G_FT_LXT2; break; case VZT_RD_HDRID: rc = G_FT_VZT; break; default: break; } if(rc == G_FT_UNKNOWN) { if(hdr[0] == FST_BL_ZWRAPPER) { rc = G_FT_FST; } else if(hdr[0] == FST_BL_HDR) { unsigned char e_ch[8]; int i, c; double fst_real_test = (2.7182818284590452354); int nfa, nfb; for(i=0;i<23;i++) { if(fgetc(f) == EOF) goto chk_ex; } for(i=0;i<8;i++) { e_ch[i] = c = fgetc(f); if(c == EOF) goto chk_ex; } nfa = nfb = 0; for(i=0;i<8;i++) { if(e_ch[i] == ((unsigned char *)&fst_real_test)[i]) { nfa++; } if(e_ch[7-i] == ((unsigned char *)&fst_real_test)[i]) { nfb++; } } if((nfa == 8) || (nfb == 8)) { rc = G_FT_FST; } } } } chk_ex: fclose(f); } } } errno = 0; return(rc); } #else int determine_gtkwave_filetype(const char *path) { return(G_FT_UNKNOWN); } #endif /******************************************************/ gtkwave-3.3.86/src/ttranslate.h0000664000175000017500000000130313166335473015722 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010. * * 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. */ #include "globals.h" #ifndef WAVE_TTRANSLATE_H #define WAVE_TTRANSLATE_H #include #include #include #include "fgetdynamic.h" #include "debug.h" #define TTRANS_FILTER_MAX (128) void ttrans_searchbox(char *title); void init_ttrans_data(void); int install_ttrans_filter(int which); void set_current_translate_ttrans(char *name); void remove_all_ttrans_filters(void); #endif gtkwave-3.3.86/src/showchange.c0000664000175000017500000002571213166335473015674 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999. * * 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 file extracted from the GTK tutorial. */ /* radiobuttons.c */ #include "globals.h" #include #include #include "analyzer.h" #include "symbol.h" #include "debug.h" static void toggle_generic(GtkWidget *widget, Ulong msk) { if(GTK_TOGGLE_BUTTON(widget)->active) { GLOBALS->flags_showchange_c_1|=msk; } else { GLOBALS->flags_showchange_c_1&=(~msk); } } static void toggle1_callback(GtkWidget *widget, GtkWidget *nothing) { (void)nothing; toggle_generic(widget, TR_RJUSTIFY); } static void toggle2_callback(GtkWidget *widget, GtkWidget *nothing) { (void)nothing; toggle_generic(widget, TR_INVERT); } static void toggle3_callback(GtkWidget *widget, GtkWidget *nothing) { (void)nothing; toggle_generic(widget, TR_REVERSE); } static void toggle4_callback(GtkWidget *widget, GtkWidget *nothing) { (void)nothing; toggle_generic(widget, TR_EXCLUDE); } static void enter_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; GLOBALS->flags_showchange_c_1=GLOBALS->flags_showchange_c_1&(~(TR_HIGHLIGHT|TR_NUMMASK)); if(GTK_TOGGLE_BUTTON(GLOBALS->button1_showchange_c_1)->active) { GLOBALS->flags_showchange_c_1|=TR_HEX; } else if(GTK_TOGGLE_BUTTON(GLOBALS->button2_showchange_c_1)->active) { GLOBALS->flags_showchange_c_1|=TR_DEC; } else if(GTK_TOGGLE_BUTTON(GLOBALS->button3_showchange_c_1)->active) { GLOBALS->flags_showchange_c_1|=TR_BIN; } else if(GTK_TOGGLE_BUTTON(GLOBALS->button4_showchange_c_1)->active) { GLOBALS->flags_showchange_c_1|=TR_OCT; } else if(GTK_TOGGLE_BUTTON(GLOBALS->button5_showchange_c_1)->active) { GLOBALS->flags_showchange_c_1|=TR_SIGNED; } else if(GTK_TOGGLE_BUTTON(GLOBALS->button6_showchange_c_1)->active) { GLOBALS->flags_showchange_c_1|=TR_ASCII; } GLOBALS->tcache_showchange_c_1->flags=GLOBALS->flags_showchange_c_1; wave_gtk_grab_remove(GLOBALS->window_showchange_c_8); gtk_widget_destroy(GLOBALS->window_showchange_c_8); GLOBALS->window_showchange_c_8 = NULL; GLOBALS->cleanup_showchange_c_6(); } static void destroy_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; wave_gtk_grab_remove(GLOBALS->window_showchange_c_8); gtk_widget_destroy(GLOBALS->window_showchange_c_8); GLOBALS->window_showchange_c_8 = NULL; } void showchange(char *title, Trptr t, GtkSignalFunc func) { GtkWidget *main_vbox; GtkWidget *ok_hbox; GtkWidget *hbox; GtkWidget *box1; GtkWidget *box2; GtkWidget *label; GtkWidget *button; GtkWidget *separator; GSList *group; GtkWidget *frame1, *frame2; GLOBALS->cleanup_showchange_c_6=func; GLOBALS->tcache_showchange_c_1=t; GLOBALS->flags_showchange_c_1=t->flags; /* fix problem where ungrab doesn't occur if button pressed + simultaneous accelerator key occurs */ if(GLOBALS->in_button_press_wavewindow_c_1) { gdk_pointer_ungrab(GDK_CURRENT_TIME); } GLOBALS->window_showchange_c_8 = gtk_window_new (GLOBALS->disable_window_manager ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL); install_focus_cb(GLOBALS->window_showchange_c_8, ((char *)&GLOBALS->window_showchange_c_8) - ((char *)GLOBALS)); gtkwave_signal_connect (GTK_OBJECT (GLOBALS->window_showchange_c_8), "delete_event",GTK_SIGNAL_FUNC(destroy_callback),NULL); gtk_window_set_title (GTK_WINDOW (GLOBALS->window_showchange_c_8), title); gtk_container_border_width (GTK_CONTAINER (GLOBALS->window_showchange_c_8), 0); main_vbox = gtk_vbox_new (FALSE, 1); gtk_container_border_width (GTK_CONTAINER (main_vbox), 1); gtk_widget_show (main_vbox); label=gtk_label_new(t->name); gtk_box_pack_start (GTK_BOX (main_vbox), label, FALSE, TRUE, 0); gtk_widget_show (label); separator = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (main_vbox), separator, FALSE, TRUE, 0); gtk_widget_show (separator); hbox = gtk_hbutton_box_new (); gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END); gtk_button_box_set_spacing(GTK_BUTTON_BOX(hbox), 5); gtk_widget_show (hbox); box2 = gtk_vbox_new (FALSE, 5); gtk_container_border_width (GTK_CONTAINER (box2), 5); gtk_widget_show (box2); GLOBALS->button1_showchange_c_1 = gtk_radio_button_new_with_label (NULL, "Hex"); gtk_box_pack_start (GTK_BOX (box2), GLOBALS->button1_showchange_c_1, TRUE, TRUE, 0); if(GLOBALS->flags_showchange_c_1&TR_HEX) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (GLOBALS->button1_showchange_c_1), TRUE); gtk_widget_show (GLOBALS->button1_showchange_c_1); group = gtk_radio_button_group (GTK_RADIO_BUTTON (GLOBALS->button1_showchange_c_1)); GLOBALS->button2_showchange_c_1 = gtk_radio_button_new_with_label(group, "Decimal"); gtk_box_pack_start (GTK_BOX (box2), GLOBALS->button2_showchange_c_1, TRUE, TRUE, 0); if(GLOBALS->flags_showchange_c_1&TR_DEC) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (GLOBALS->button2_showchange_c_1), TRUE); gtk_widget_show (GLOBALS->button2_showchange_c_1); group = gtk_radio_button_group (GTK_RADIO_BUTTON (GLOBALS->button2_showchange_c_1)); GLOBALS->button5_showchange_c_1 = gtk_radio_button_new_with_label(group, "Signed Decimal"); gtk_box_pack_start (GTK_BOX (box2), GLOBALS->button5_showchange_c_1, TRUE, TRUE, 0); if(GLOBALS->flags_showchange_c_1&TR_SIGNED) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (GLOBALS->button5_showchange_c_1), TRUE); gtk_widget_show (GLOBALS->button5_showchange_c_1); group = gtk_radio_button_group (GTK_RADIO_BUTTON (GLOBALS->button5_showchange_c_1)); GLOBALS->button3_showchange_c_1 = gtk_radio_button_new_with_label(group, "Binary"); gtk_box_pack_start (GTK_BOX (box2), GLOBALS->button3_showchange_c_1, TRUE, TRUE, 0); if(GLOBALS->flags_showchange_c_1&TR_BIN) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (GLOBALS->button3_showchange_c_1), TRUE); gtk_widget_show (GLOBALS->button3_showchange_c_1); group = gtk_radio_button_group (GTK_RADIO_BUTTON (GLOBALS->button3_showchange_c_1)); GLOBALS->button4_showchange_c_1 = gtk_radio_button_new_with_label(group, "Octal"); gtk_box_pack_start (GTK_BOX (box2), GLOBALS->button4_showchange_c_1, TRUE, TRUE, 0); if(GLOBALS->flags_showchange_c_1&TR_OCT) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (GLOBALS->button4_showchange_c_1), TRUE); gtk_widget_show (GLOBALS->button4_showchange_c_1); group = gtk_radio_button_group (GTK_RADIO_BUTTON (GLOBALS->button4_showchange_c_1)); GLOBALS->button6_showchange_c_1 = gtk_radio_button_new_with_label(group, "ASCII"); gtk_box_pack_start (GTK_BOX (box2), GLOBALS->button6_showchange_c_1, TRUE, TRUE, 0); if(GLOBALS->flags_showchange_c_1&TR_ASCII) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (GLOBALS->button6_showchange_c_1), TRUE); gtk_widget_show (GLOBALS->button6_showchange_c_1); frame2 = gtk_frame_new ("Base"); gtk_container_border_width (GTK_CONTAINER (frame2), 3); gtk_container_add (GTK_CONTAINER (frame2), box2); gtk_widget_show (frame2); gtk_box_pack_start(GTK_BOX (hbox), frame2, TRUE, TRUE, 0); /****************************************************************************************************/ box1 = gtk_vbox_new (FALSE, 5); gtk_container_border_width (GTK_CONTAINER (box1), 5); gtk_widget_show (box1); frame1 = gtk_frame_new ("Attributes"); gtk_container_border_width (GTK_CONTAINER (frame1), 3); gtk_container_add (GTK_CONTAINER (frame1), box1); gtk_box_pack_start(GTK_BOX (hbox), frame1, TRUE, TRUE, 0); gtk_widget_show (frame1); GLOBALS->toggle1_showchange_c_1=gtk_check_button_new_with_label("Right Justify"); gtk_box_pack_start (GTK_BOX (box1), GLOBALS->toggle1_showchange_c_1, TRUE, TRUE, 0); if(GLOBALS->flags_showchange_c_1&TR_RJUSTIFY)gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(GLOBALS->toggle1_showchange_c_1), TRUE); gtk_widget_show (GLOBALS->toggle1_showchange_c_1); gtkwave_signal_connect (GTK_OBJECT (GLOBALS->toggle1_showchange_c_1), "toggled", GTK_SIGNAL_FUNC(toggle1_callback), NULL); GLOBALS->toggle2_showchange_c_1=gtk_check_button_new_with_label("Invert"); gtk_box_pack_start (GTK_BOX (box1), GLOBALS->toggle2_showchange_c_1, TRUE, TRUE, 0); if(GLOBALS->flags_showchange_c_1&TR_INVERT)gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(GLOBALS->toggle2_showchange_c_1), TRUE); gtk_widget_show (GLOBALS->toggle2_showchange_c_1); gtkwave_signal_connect (GTK_OBJECT (GLOBALS->toggle2_showchange_c_1), "toggled", GTK_SIGNAL_FUNC(toggle2_callback), NULL); GLOBALS->toggle3_showchange_c_1=gtk_check_button_new_with_label("Reverse"); gtk_box_pack_start (GTK_BOX (box1), GLOBALS->toggle3_showchange_c_1, TRUE, TRUE, 0); if(GLOBALS->flags_showchange_c_1&TR_REVERSE)gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(GLOBALS->toggle3_showchange_c_1), TRUE); gtk_widget_show (GLOBALS->toggle3_showchange_c_1); gtkwave_signal_connect (GTK_OBJECT (GLOBALS->toggle3_showchange_c_1), "toggled", GTK_SIGNAL_FUNC(toggle3_callback), NULL); GLOBALS->toggle4_showchange_c_1=gtk_check_button_new_with_label("Exclude"); gtk_box_pack_start (GTK_BOX (box1), GLOBALS->toggle4_showchange_c_1, TRUE, TRUE, 0); if(GLOBALS->flags_showchange_c_1&TR_EXCLUDE)gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(GLOBALS->toggle4_showchange_c_1), TRUE); gtk_widget_show (GLOBALS->toggle4_showchange_c_1); gtkwave_signal_connect (GTK_OBJECT (GLOBALS->toggle4_showchange_c_1), "toggled", GTK_SIGNAL_FUNC(toggle4_callback), NULL); gtk_container_add (GTK_CONTAINER (main_vbox), hbox); separator = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (main_vbox), separator, FALSE, TRUE, 0); gtk_widget_show (separator); /****************************************************************************************************/ ok_hbox = gtk_hbox_new (FALSE, 1); gtk_container_border_width (GTK_CONTAINER (ok_hbox), 1); gtk_widget_show (ok_hbox); button = gtk_button_new_with_label ("Cancel"); gtkwave_signal_connect_object (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC(destroy_callback),GTK_OBJECT (GLOBALS->window_showchange_c_8)); gtk_box_pack_end (GTK_BOX (ok_hbox), button, TRUE, TRUE, 0); GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); gtk_widget_show (button); gtk_container_add (GTK_CONTAINER (main_vbox), ok_hbox); button = gtk_button_new_with_label (" OK "); gtkwave_signal_connect_object (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC(enter_callback),GTK_OBJECT (GLOBALS->window_showchange_c_8)); gtkwave_signal_connect_object (GTK_OBJECT (button), "realize", (GtkSignalFunc) gtk_widget_grab_default, GTK_OBJECT (button)); gtk_box_pack_end (GTK_BOX (ok_hbox), button, TRUE, TRUE, 0); GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); gtk_widget_show (button); /****************************************************************************************************/ gtk_container_add (GTK_CONTAINER (GLOBALS->window_showchange_c_8), main_vbox); gtk_widget_show (GLOBALS->window_showchange_c_8); wave_gtk_grab_add(GLOBALS->window_showchange_c_8); } gtkwave-3.3.86/src/strace.h0000664000175000017500000000543413166335473015033 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2010. * * 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. */ #include "globals.h" #ifndef GTKWAVE_STRACE_H #define GTKWAVE_STRACE_H #include #include #include #include "debug.h" #include "analyzer.h" #include "currenttime.h" #include "bsearch.h" #if WAVE_USE_GTK2 #define WAVE_NUM_STRACE_WINDOWS (2) #else #define WAVE_NUM_STRACE_WINDOWS (1) #endif #define WAVE_STRACE_ITERATOR(x) for((x)=((WAVE_NUM_STRACE_WINDOWS)-1); (x)>=0 ; (x)--) #define WAVE_STRACE_ITERATOR_FWD(x) for((x)=0;(x)<(WAVE_NUM_STRACE_WINDOWS);(x)++) enum strace_directions { STRACE_BACKWARD, STRACE_FORWARD }; enum st_stype {ST_DC, ST_HIGH, ST_MID, ST_X, ST_LOW, ST_STRING, ST_RISE, ST_FALL, ST_ANY, WAVE_STYPE_COUNT}; struct strace_defer_free { struct strace_defer_free *next; Trptr defer; }; struct strace_back { struct strace *parent; int which; }; struct strace { struct strace *next; char *string; /* unmalloc this when all's done! */ Trptr trace; char value; char search_result; union { hptr h; /* what makes up this trace */ vptr v; } his; struct strace_back *back[WAVE_STYPE_COUNT]; /* dealloc these too! */ }; struct timechain { struct timechain *next; TimeType t; }; struct mprintf_buff_t { struct mprintf_buff_t *next; char *str; }; struct item_mark_string { char *str; unsigned char idx; }; /* for being able to handle multiple strace sessions at once, context is moved here */ struct strace_ctx_t { GtkWidget *ptr_mark_count_label_strace_c_1; struct strace *straces; struct strace *shadow_straces; struct strace_defer_free *strace_defer_free_head; GtkWidget *window_strace_c_10; void (*cleanup_strace_c_7)(void); struct mprintf_buff_t *mprintf_buff_head; struct mprintf_buff_t *mprintf_buff_current; char *shadow_string; TimeType *timearray; int timearray_size; char logical_mutex[6]; char shadow_logical_mutex[6]; char shadow_active; char shadow_encountered_parsewavline; char shadow_type; signed char mark_idx_start; signed char mark_idx_end; signed char shadow_mark_idx_start; signed char shadow_mark_idx_end; }; void strace_search(int direction); void strace_maketimetrace(int mode); /* 1=create, zero=delete */ TimeType strace_adjust(TimeType a, TimeType b); void swap_strace_contexts(void); void delete_strace_context(void); void cache_actual_pattern_mark_traces(void); void edge_search(int direction); /* from edgebuttons.c */ int mprintf(const char *fmt, ... ); void delete_mprintf(void); void tracesearchbox(const char *title, GtkSignalFunc func, gpointer data); #endif gtkwave-3.3.86/src/discardbuttons.c0000664000175000017500000000433513166335473016574 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999. * * 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. */ #include "globals.h" #include #include "currenttime.h" #include "pixmaps.h" #include "debug.h" /* Create actual buttons */ GtkWidget * create_discard_buttons (void) { GtkWidget *table; GtkWidget *table2; GtkWidget *frame; GtkWidget *main_vbox; GtkWidget *b1; GtkWidget *b2; GtkWidget *pixmapwid1, *pixmapwid2; GtkTooltips *tooltips; tooltips=gtk_tooltips_new_2(); gtk_tooltips_set_delay_2(tooltips,1500); pixmapwid1=gtk_pixmap_new(GLOBALS->larrow_pixmap, GLOBALS->larrow_mask); gtk_widget_show(pixmapwid1); pixmapwid2=gtk_pixmap_new(GLOBALS->rarrow_pixmap, GLOBALS->rarrow_mask); gtk_widget_show(pixmapwid2); /* Create a table to hold the text widget and scrollbars */ table = gtk_table_new (1, 1, FALSE); main_vbox = gtk_vbox_new (FALSE, 1); gtk_container_border_width (GTK_CONTAINER (main_vbox), 1); gtk_container_add (GTK_CONTAINER (table), main_vbox); frame = gtk_frame_new ("Disc "); gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0); gtk_widget_show (frame); gtk_widget_show (main_vbox); table2 = gtk_table_new (2, 1, FALSE); b1 = gtk_button_new(); gtk_container_add(GTK_CONTAINER(b1), pixmapwid1); gtk_table_attach (GTK_TABLE (table2), b1, 0, 1, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); gtk_signal_connect_object (GTK_OBJECT (b1), "clicked", GTK_SIGNAL_FUNC(discard_left), GTK_OBJECT (table2)); gtk_tooltips_set_tip_2(tooltips, b1, "Increase 'From' Time", NULL); gtk_widget_show(b1); b2 = gtk_button_new(); gtk_container_add(GTK_CONTAINER(b2), pixmapwid2); gtk_table_attach (GTK_TABLE (table2), b2, 0, 1, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); gtk_signal_connect_object (GTK_OBJECT (b2), "clicked", GTK_SIGNAL_FUNC(discard_right), GTK_OBJECT (table2)); gtk_tooltips_set_tip_2(tooltips, b2, "Decrease 'To' Time", NULL); gtk_widget_show(b2); gtk_container_add (GTK_CONTAINER (frame), table2); gtk_widget_show(table2); return(table); } gtkwave-3.3.86/src/splash.c0000664000175000017500000143041513166335473015041 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2005-2012 * * 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. */ #include "globals.h" #include #include "symbol.h" #include "pixmaps.h" /* requires further testing */ /* #if !defined _MSC_VER && !defined __MINGW32__ && !defined __CYGWIN__ */ #define SPLASH_ADDED_LOADER_MESSAGES /* #endif */ #ifdef WAVE_USE_GTK2 /* XPM */ static const char * wave_splash_xpm[] = { "512 384 257 2", " c None", ". c #020202", "+ c #7CB5A1", "@ c #042B1B", "# c #0A673D", "$ c #459371", "% c #8AC8B1", "& c #5D5D5D", "* c #5C897C", "= c #C0E1E5", "- c #5C7B67", "; c #AB9485", "> c #4A3A31", ", c #2C865D", "' c #124F39", ") c #DFDEDD", "! c #809486", "~ c #A68A79", "{ c #E3EDEF", "] c #052216", "^ c #957F71", "/ c #2A7653", "( c #BDC7BA", "_ c #5B6C5E", ": c #24282A", "< c #A7B09D", "[ c #3C5E51", "} c #051E13", "| c #353562", "1 c #868681", "2 c #817267", "3 c #22473B", "4 c #85AAA1", "5 c #817D70", "6 c #96948E", "7 c #0B1A15", "8 c #E5FAFC", "9 c #CACBC9", "0 c #485C5B", "a c #706D6E", "b c #747A79", "c c #CDB5A1", "d c #03160B", "e c #434369", "f c #728674", "g c #538172", "h c #D69D86", "i c #89A69F", "j c #486653", "k c #5C7463", "l c #223C34", "m c #3D765D", "n c #A6B8A7", "o c #849C8A", "p c #174939", "q c #09120F", "r c #826357", "s c #474A61", "t c #59977C", "u c #F6F6F4", "v c #2C5347", "w c #6E7E7A", "x c #34345E", "y c #CE9A7F", "z c #CBD5D4", "A c #D6F4F8", "B c #748695", "C c #675143", "D c #B3B8B5", "E c #D0E2E4", "F c #8BB29E", "G c #979C8D", "H c #658086", "I c #CA987E", "J c #50745E", "K c #154030", "L c #304540", "M c #6A6D72", "N c #BCDAE0", "O c #484842", "P c #3C6853", "Q c #070E0B", "R c #66746E", "S c #39312F", "T c #716158", "U c #4D6E58", "V c #448063", "W c #AAA190", "X c #657C6B", "Y c #96C2BB", "Z c #8E948E", "` c #649683", " . c #23312F", ".. c #9ECAC5", "+. c #61545F", "@. c #7E8A83", "#. c #8E9E96", "$. c #5E635F", "%. c #BF806F", "&. c #D5D5D3", "*. c #646A70", "=. c #CA8B77", "-. c #ECECEB", ";. c #B17465", ">. c #BCD6DA", ",. c #49736E", "'. c #51665A", "). c #1D5F42", "!. c #F0FDFD", "~. c #D3EEF3", "{. c #143A2C", "]. c #313C3A", "^. c #7A9496", "/. c #70A895", "(. c #9A8A7F", "_. c #97A496", ":. c #8BB3B3", "<. c #5C4A3D", "[. c #1C2224", "}. c #505073", "|. c #191E20", "1. c #F2F2F1", "2. c #7F9C9A", "3. c #738B78", "4. c #E3E4E3", "5. c #B5BFAC", "6. c #39805F", "7. c #90AAA6", "8. c #A6A7A6", "9. c #FCFDFC", "0. c #070A09", "a. c #ACD7D6", "b. c #97BEBC", "c. c #B9B0B4", "d. c #2A6E4E", "e. c #676567", "f. c #70A291", "g. c #3E4268", "h. c #A27167", "i. c #8A9494", "j. c #37524A", "k. c #1E1A1C", "l. c #132A23", "m. c #62747C", "n. c #96897E", "o. c #445256", "p. c #5D7486", "q. c #74969C", "r. c #2C324D", "s. c #668278", "t. c #54646A", "u. c #BCD2D4", "v. c #B47D6D", "w. c #4D5346", "x. c #D2EAEF", "y. c #656E74", "z. c #727465", "A. c #4F8E72", "B. c #889C9B", "C. c #52746F", "D. c #3E4646", "E. c #ACCAB2", "F. c #15362A", "G. c #A6B9BA", "H. c #748087", "I. c #4F5458", "J. c #9AB1B2", "K. c #2E3232", "L. c #5C7C78", "M. c #678876", "N. c #6E7F91", "O. c #286A4B", "P. c #7E8082", "Q. c #535C60", "R. c #72948A", "S. c #7A8C82", "T. c #1F1616", "U. c #333C53", "V. c #C49479", "W. c #393156", "X. c #878D96", "Y. c #547A74", "Z. c #E6BAA6", "`. c #D9DAD9", " + c #5C656C", ".+ c #7E8C91", "++ c #97A4A4", "@+ c #378964", "#+ c #667C79", "$+ c #215142", "%+ c #BC8B73", "&+ c #1B1217", "*+ c #A7C2C3", "=+ c #C59D84", "-+ c #DAE0DF", ";+ c #99BABB", ">+ c #BEC0BD", ",+ c #566E69", "'+ c #678885", ")+ c #829495", "!+ c #807399", "~+ c #2D2227", "{+ c #E1CBBF", "]+ c #8A9485", "^+ c #957267", "/+ c #526A6B", "(+ c #B2B1AD", "_+ c #AC7E6D", ":+ c #ADCACD", "<+ c #364752", "[+ c #5D6B71", "}+ c #728682", "|+ c #3B3D39", "1+ c #62656A", "2+ c #3A3C65", "3+ c #99B1A0", "4+ c #758C94", "5+ c #5E5E6B", "6+ c #56473A", "7+ c #3F6962", "8+ c #719E89", "9+ c #5C7471", "0+ c #2F1E1F", "a+ c #738C85", "b+ c #A7B0AF", "c+ c #928A81", "d+ c #2E5D4D", "e+ c #3E6060", "f+ c #BDC9CA", "g+ c #2E2848", "h+ c #5C827A", "i+ c #C5C0BD", "j+ c #B9A7A8", "k+ c #969D9C", "l+ c #486762", "m+ c #153226", "n+ c #697379", "o+ c #B5C0BF", "p+ c #AFD2D6", "q+ c #EBE5E4", "r+ c #89A29E", "s+ c #C4EBEC", "t+ c #0F0505", "u+ c #4F8A6F", "v+ c #448A69", "w+ c #4C6E68", "x+ c #3A4543", "y+ c #3B525A", "z+ c #707579", "A+ c #9AAAA5", "B+ c #111616", "C+ c #8EA0A5", "D+ c #160E0E", "E+ c #748079", "F+ c #2F664D", "G+ c #868D86", "H+ c #7A8683", "P P F+F+P F+P F+O.F+F+/ d./ d./ / / d./ / / / / / / / / / / / / 6.6.6.6., / , , 6., , 6., 6., , 6., , @+, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , @+6.@+V v+v+u+u+* A.* A.A.u+u+u+v+v+v+V v+6.@+6.V V V V V Y.m ,.,.7+l+l+w+,+,+,+[+9+9+9+9+9+9+m.m.R n+n+m.9+m.y.n+m.y.y.n+m.y.n+n+n+y.y.y.y.y.y.y.y.m.y.y.y.y.y.y.y.y.y.y.[+y.[+*.*.*.*.*.*.*.*.*.*.*.y.[+y.*.*.*.*.*.y.y.y.y.M y.y.M *.*.*.y.y.y.y.y.y.y.y.y.y.y.y.y.*.y.y.M y.y.M M y.y.M y.y.y.y.y.M M y.y.y.y.y.y.y.y.y.y.y.*.*.y.*.y.y.y.*.*.*.*.y.y.y.y.*.y.[+*.*.[+*.*.*.y.[+1+ +[+*.1+*.1+e.1+[+ + + + + + + +1+ + + + +[+t.*.[+ + + + + +t. + + + + + + + + + +[+[+m.y.y.9+p.9+,+,+/+7+7+e+d+d+v ).$+$+$+$+$+' p 3 3 3 v j.[ j '._ M z+b w P.P.1 X.G+c+X.G+G+1 1 1 1 P.1 1 1 G+X.i.B.k+k+++++8.++++++k+B.)+@.N.X C.l+[ v $+p K F.F.@ @ @ @ @ @ @ ] @ @ ] @ @ @ m+F.].x+O w.& T a 2 2 5 5 5 5 5 z+z.R y.y._ $.'.$._ y.R z.b b 5 P.b 5 z+z.a *.$.+.w.O |+K.: [.k.q 0.0.. . . . . . . . t+. t+. . t+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "F+F+P d.F+d.P / 7+d./ d./ / / / / / / / / / / / / / / / / 6./ , / , / , , , , / , 6., , 6., , 6., 6.6., , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , 6.6.6.6.6.v+V g g u+* M.` * A.A.A.u+u+V v+v+V u+V v+v+V g V m Y.Y.J w+,.l+l+'./+[+,+,+y.,+y.m.y.R y.m.y.y.y.y.y.y.y.y.*.n+y.y.y.R y.y.y.a M y.y.y.y.m.y.y.y.y.y.y.y.y.y.y.[+y.[+*.y.*.y.[+*. +*.*.[+[+[+[+[+y. +y.y.y.[+[+*.*.*.*.*.[+[+y.y.*.M *.*.*.y.y.*.y.*.*.*.*.M *.y.*.M *.M *.*.y.y.M y.*.y.y.y.M M y.y.y.y.y.R m.y.y.y.*.*.*.y.*.*.e.*.*.y.y.*.M *.*.*.*.*.*.*.*.*.[+y.*.*.[+*.*.*.*. +*.[+[+1+ +1+[+[+[+ +*. + +[+ + +[+ + +[+t. + + + + + + +t. + + +1+ + + + +[+/+[+[+p.p.[+y.p.C./+w+l+l+P e+[ d+d+d+d+).v $+$+$+$+3 $+$+v j.0 '. +_ _ R z+b P.P.1 1 1 1 1 1 1 1 P.P.1 P.P.P.1 1 G+i.Z k+k+++++++8.k+k+k+i..+a+H C.l+P d+' ' K {.{.{.{.@ {.@ @ @ @ @ @ @ @ @ @ m+l L O w.C T T r 2 5 ^ ^ ^ 5 5 5 z.z.z.y.*._ $._ *.R z.b 5 5 5 5 P.5 5 2 z.a & Q.I.O |+S : [.7 D+0.. . . . . . . . . . . . t+. . . . . . . . . . . . . . . . . . . . . . . t+. . . . . . . . . . . . . . ", "d.7+/ m / / d./ m / m / / / / / / / / / / / m / / 6./ 6./ , 6., / , , / , , , , , , 6., , , , , , , , 6., , , , , , , , , , , / , , / , , , , , , , , , , , , , , , , 6., 6.6.6.6.6.V g V h+M.M.g M.* M.* u+u+u+u+V u+g u+V g u+V Y.g Y.Y.J w+/+l+j 0 0 t.$.t.[+[+[+[+y.,+M y.y.R y.y.n+R y.M M *.n+y.y.y.y.y.n+y.y.M M y.y.*.y.y.*.y.y.*.*.y.*.y.y.*.y.[+*.[+*.*.[+y.[+[+1+[+1+[+[+ +[+*. +*.[+y.[+*.y.*.*.*.*.*.*.y.*.*.[+y.[+y.y.*.y.y.y.*.*.M *.M *.M *.M M M y.n+y.M n+y.y.n+R y.y.R M y.y.y.y.y.*.y.*.y.M *.*.*.M *.*.*.y.y.M y.*.*.a *.*.y.y.y.y.y._ y.[+y.[+[+y.*.1+1+[+*.[+*.[+ +[+ +[+[+ +/+ + + + +1+[+ + + + + +[+ + +[+ + + +[+ + +[+ +[+[+[+[+[+p.p.p.p.C.,+w+/+l+7+7+P e+F+F+d+F+d+d+$+$+$+3 L 3 v v j.0 j $.$._ M R b b P.P.1 P.P.P.P.P.5 P.5 P.P.1 P.1 1 X.Z k+k+k+k+++8.++k+C+)+^.a+s.L.w+7+F+$+' ' K {.{.K {.{.{.{.{.{.{.{.K K K K l L O w.w.T T a 2 2 ^ 5 ^ ^ ^ P.P.b R R a _ _ *._ a a z.z.5 5 1 1 1 P.P.b z.a T I.w.D.|+K.: [.B+q 0.. . . . . . . . . t+. . . . . . . . . . . . . . . . . t+. . . . . . . . . . . . . . . . . . . . . . . ", "m / / / / m / / / / / / , / , / , / , 6., / , , , / , , , / , , , , , , , , , , , , , 6., , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , 6., , , 6.6.6.6.V m - V g - - X M.A.M.M.* * M.* * u+g u+g g g g g Y.J J J U /+/+/+0 0 0 Q.t.t.$. + +[+*.*.y.y.y.y.y.y.*.*.y.*.m.y.y.y.y.y.y.n+y.M y.y.y.y.y.y.y.[+y.y.[+y.y.y.y.*.*.y.[+*.[+*.[+[+ +[+ + +*. +[+ + +[+*.[+*.1+1+*.y.*.e.*.y.*.*.[+[+[+[+[+y.*.y.[+y.y.*.y.*.y.y.y.y.y.y.y.y.y.M M M y.*.n+y.y.n+y.y.y.y.M y.R y.y.y.y.y.y.M *.1+*.*.*.e.M *.y.*.*.y.*.y.y.*.*.*.*.*.*.y.*.R *.y.y.M *.*.*.y.y.1+[+*.*.1+1+1+[+[+ +[+[+t.[+[+ + + +*.*.[+ +[+ +[+ + + +1+[+ +[+*.t.[+[+[+y.[+p.p.9+9+p.p.p.p.,+w+w+w+w+7+7+P F+F+F+d+d+d+v v $+$+3 3 j.j.j.0 j $._ $.y.R z.b 5 P.5 P.P.5 P.5 5 P.P.P.P.P.@.X.X.i.B.k+++k+++k+C+B.B.4+a+'+L.,.7+F+).).' ' ' ' K K ' K K ' K K ' K K K K 3 j.w.& $.T 2 2 2 ^ ^ ^ ^ ^ 5 1 5 5 z.z.z._ a _ e._ z.z.b 5 1 1 ^ c+c+P.5 2 z.e.& w.O ].S : |.B+q 0.. . . . . . . . . . . t+. . t+. . . . . . . . . . . . t+. . . . t+. . . . . . . . . . . . . . . . . . ", "m / m / 6., / 6.6./ , / / , / , , / , / , , / , , , / 6., , / , , 6., , , 6., , 6., , , , , , 6., , , , , , , , , / , , / , , , , , , , , , , , , , , , , , , , , 6.6.6.6.6.m m Y.V J - - - - X M.M.M.M.M.M.* * g * g g u+g g Y.Y.J ,.,+/+_ t.'.t.0 o.o.I.Q.Q.Q.$.$.$.1+*.[+y.[+[+y.M M y.y.y.n+*.M y.y.M y.y.M a y.y.y.y.y.m.y.y.y.n+[+y.*.y.[+y.y.*.*.e.*.*.e.*. +[+[+ +*. +[+ + + +[+ +[+*. +1+ +*.*.1+*.y.[+[+[+*.y.[+[+*.*.*.[+[+y.M M *.y.M *.M M M y.y.M y.M n+*.y.y.y.M M n+M m.y.y.R R y.R *.y.y.*.y.*.M *.y.*.*.*.y.a y.y.M *.*.M M M y.y.y.y.*.y.M y.y.M y.R *.y.a *.y.*.*.*.*.[+ + +[+ +[+ +1+*.[+*.[+ +[+[+[+[+[+[+ +*.y.1+y.[+y.p.y.p.*.y.p.n+m.n+n+m.z+m.m.#+p.p.C.C.C.,.U w+P P P P F+F+d+v $+$+3 l 3 3 L L j.j.0 0 & $._ *.y.z.b 2 5 !+b z+5 P.b P.P.P.P..+.+X.B.6 C+++C+k+C+B.2.^.a+'+h+Y.7+d.).).' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' $+x+w.w.T T z.2 ^+^ ^ ^ n.n.^ ^ P.5 b z.R R k _ z.a z.z.z.5 5 5 1 1 ^ 1 ^ P.!+z.e.& w.O |+: [.|.q Q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . t+. . . . . . . . . . . . . . . . ", ", 6., , 6./ , , , , , , , , , , / , , , , , , , / , , , 6., , 6., , , , , , , , , , , 6.@+, , , , 6., , 6., , , , , , , , , , , , , , , , , , , , , , , 6., 6., 6., 6.6.6./ m m J U J J k - X X X X M.M.M.* M.s.* g - h+h+X - k k C.U /+'.t.'.Q.0 o.y+O o.o.I.I.Q.Q.5+$. + +[+[+y.*.y.y.y.y.M y.M M M M y.M y.n+n+y.y.y.y.*.*.y.y.y.*.y.y.y.*.M y.*.y.*.*.*.1+[+[+*.1+ +[+ + + +[+ +*. +[+1+1+*.*.*.[+*.[+*.*.[+[+n+[+*.*.*.[+y.y.y.y.*.*.*.y.y.y.y.*.y.M y.y.R M R *.R M y.y.M M M R M n+y.y.y.y.M y.y.*.y.*.*.*.*.*.*.y.y.*.M *.M y.y.y.y.y.y.M M *.M y.y.y.y.R R R y.y.y.y.y.*.y.y.*.y.1+[+[+[+[+ +*.*.[+ +p.[+p.[+[+1+p.[+y.y.p.y.p.y.y.m.M m.p.p.m.m.#+b N.b N.N.H.N.n+#+#+m.C.C.,+,.m J m P P [ [ d+d+v $+3 3 l K l l l l L L x+w.w.w.t.$.e.y.M z.z.z+z+z+b n+#+w E+E+B .+)+)+B.B.C+r+B.#.)+R.a+M.g Y.V 7+d.# ' # ' ' ' ' ' ' ' ' ' ' ' ' ' p v d+[ $._ z.2 ^ ^ ^ _+~ ~ n.n.^ 5 5 5 z.X z.a k z.z.z.2 5 2 ^ 1 ^ 1 1 ^ 5 5 z.a e.& w.O |+K.[.7 d Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "6.6., 6., , 6./ , / , / , / , , , , , / , , / , , , @+, , , , , , 6., , , 6.6., , , , , , , @+6., , , , , , , , , , , , , , , , , , , , , , , , , , , , 6., 6.6.6.6.6./ m m m m U U U k _ _ z.k X E+3.3.3.M.* * h+g - - - - - k k /+/+/+/+'.Q.Q.o.j.x+x+x+O o.s I.I.Q.& $.& + +*.*.*.[+*.y.*.y.*.y.M M *.M *.y.y.y.y.y.y.y.M y.y.y.y.M *.M y.*.y.*.*.*.*.y. + + +1+1+ + +_ +1+ +*.[+ +*.[+*.[+[+*.*.*.*.[+*.M *.*.*.M *.y.y.y.y.*.*.M M M M *.*.y.R y.*.M y.m.*.y.*.y.y.M y.n+y.y.y.y.R y.y.y.y.y.y.y.*.y.*.y.*.*.*.1+*.*.y.M M M M y.y.y.M M y.M y.M M R M y.y.M M n+M n+n+y.y.*.*.y.y.y.p.*.*.p.[+p.*.p.M *.y.p.m.p.n+M y.p.y.n+n+z+z+n+n+z+!+N.N.N.N.N.N.b N.P.N.b N.H.#+b #+m.L.9+,+C.,.U m P P P [ d+v $+$+3 K l {.F.F. .F.l l L O O O w.0 w.& $.$.$.1+_ _ *.y.R R n+E+H.@.4+^.^.)+2.2.o ^.a+'+M.L.Y.m d.d.# # # # # ' # ' # ' # # ' # ).).$+d+w.j T z.^+^ ^ ~ ~ ~ ~ ~ ~ (.(.^ 5 5 b z.R k a z.z.5 2 5 5 ^ 5 ^ ^ 1 1 ^ P.b a e.& w.O ].K.[.7 q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . t+. . . . . . . . . . . . . . ", ", 6.@+@+6.@+6., , , , , , , , , , , , , , , , , 6., 6.@+, , 6., , , , 6., , @+, @+@+, , , , , , , , 6., , , , , , , , , , , , , , , , , , , , , , , @+@+@+6.@+, 6.6.m V m m m P U j '.'._ _ _ z.E+f 3.R.R.R.R.M.s.- - s.X L.k C.,+/+/+'.'.Q.Q.o.j.L ].].U.x+x+D.O s I.I.I.5+$.$.$. +e.*.*.[+y.y.*.*.*.y.M M y.y.*.*.y.M *.y.M *.y.*.*.y.M M *.y.*.y.y.[+*. +*.*.*. +[+[+[+ +[+ +*. +*. + + +[+1+*.[+1+*.[+*.M *.[+y.*.*.y.y.M *.*.y.y.y.y.y.M M M M M *.M y.*.y.y.y.y.y.y.M y.y.y.y.R y.*.M y.y.y.y.y.y.M *.y.y.y.*.*.n+*.y.M *.*.*.R M y.y.y.y.R y.y.M R y.n+M n+m.n+n+n+n+M n+p.n+n+y.M y.n+y.p.y.M n+z+z+p.n+n+p.z+N.z+N.N.z+z+N.N.z+N.!+z+z+b b b N.b N.N.N.H.H.H.H.b N.b N.b H p.9+9+C.J J m m P P P [ d+v 3 3 K K F.m+l.@ : l. . .K.].L |+O O O O 0 w.w.0 Q.0 $.'.,+,+9+X #+E+H+a+R.a+.+! a+R.M.h+V J m d.O.# # ' # # # # # # # ' # # ).).).).[ j _ z.2 ^ ~ ~ %+; ; %+; ; ~ n.n.1 5 5 z.z.k z.z.z.5 5 ^ 5 ^ ^ 1 ^ ^ 1 2 2 a e.& +.w.x+S .[.7 q Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . t+. t+. . . . . . . . . . . ", "v+A.v+$ v+$ @+v+@+, , , , , , / , , , , , , , @+, , , @+@+, , , , , , , @+, , , , @+, , , , @+, , , , , , , , , , , , , , , , , , , , , , , , , @+6.6.6.6.6.6.6.6.6.m m m P m P j j [ & '.$._ z.X @.@.! ! R.3.3.M.M.- - - - k ,+,+/+'.t.t.0 0 j.].l r. .K.r.].L x+D.s I.I.I.Q.Q. + +1+1+*.[+e.*.*.*.M y.y.M *.y.M y.M y.y.M M M M M y.y.y.M M y.*.*.y.*.y.*.*.1+*.e.1+*.[+ + +1+[+*.*. + +1+*.*.*.y.*.*.y.*.*.*.y.y.M *.y.*.y.y.*.M y.y.M M M *.y.*.M y.M y.y.y.y.y.y.y.y.M y.y.y.y.y.y.y.M M M y.y.[+y.*.*.*.*.y.*.*.y.[+y.y.M y.y.y.y.y.*.R M M M M M R R R n+z+n+n+n+n+z+z+z+z+z+z+z+n+n+N.n+z+p.n+n+N.z+N.N.N.z+N.N.z+N.b H.N.!+b z+N.N.H.N.N.N.N.H+H.H.H.P.H.B H+B b N.N.N.H.N.H #+#+X Y.C.J U U P P [ [ v $+3 l l {.F.m+@ l.l.l.m+: .].K.].].].].|+L x+x+O j.j.j.0 j e+U ,+C.Y.L.h+h+H * '+* h+g m m d.O.O.# # # # # # ' # # # # # ).O.O.F+F+j _ z.^ ^ ^ _+%+%+V.V.V.%+; ; (.n.1 b E+z.z._ k z.2 ^ 5 c+^ (.^ (.n.^ 1 5 2 a e.& w.O x+K. .|.d q Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . t+t+. . . . . . . . . ", "$ * t A.A.A.A.$ $ $ @+, , , , , , , , , @+, @+@+@+@+@+@+@+@+@+@+, @+, 6.6.@+@+, @+, @+@+, , , @+, , , , , , , , , , , , , , , , , , , , , @+, @+6.@+6.6.@+6.6.6.m 6.V m m P P P [ d+w.[ w.$._ R E+H+G+! ! ! R.R.a+s.s.#+- 9+_ k /+'.'.'.0 0 <+L . .[.l.[. . .r.].|+x+D.o.I.I.Q.Q.Q.$. + +1+*.*.*.*.*.*.*.y.y.y.y.y.y.M M M *.y.y.n+y.M y.y.y.M M M *.*.*.y.*.*.1+*.e.1+1+*.*.*.[+ +y.*.*.*.[+[+y.[+[+[+[+y.y.[+y.y.*.y.*.y.y.y.M y.M M M *.y.y.y.M y.*.*.y.y.M y.M y.M y.*.y.M M M y.y.M y.M M *.y.y.y.M M y.M *.y.*.y.y.[+y.[+k _ R y.M z.M R y.R n+n+n+n+n+n+z+b H.H.z+N.z+N.H.N.N.N.!+z+z+N.N.N.z+N.N.N.!+b N.H.b H.N.!+b H.H.N.N.H.H.b P.b b N.H.B X..+B B 1 1 X.1 P.N.N.P.B a+H.#+#+#+X h+Y.J J U j j d+d+v $+p K {.F.m+m+@ l.l.l.l. . .K.K.S ].].].K.K.].l ].].l L j.v j.[ 0 P U U ,.,.J ,.U m U m d.O.# O.).# # # # # # # # # # # # # O.O.d.U z.5 ^ _+~ ~ %+%+%+; %+; %+; ~ (.n.1 z.z.z.k z.z.z.5 1 ^ (.(.~ (.(.n.^ ^ 2 a e.& w.O L K. .@ } d Q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . t+. . . . t+. t+. . . . . . ", "t ` ` ` ` ` t * A.$ $ @+, , , , , , @+@+@+$ @+$ $ @+v+@+@+@+@+@+, @+, , , @+@+, @+@+, @+@+@+, @+, , , , , , , , , , , , , , , , , , , , @+6.@+6.6.6.V V V V 6.V m m m m P P [ F+d+[ j.[ 0 '.k X w f 3.S.S.! ! ! R.M.* - X - k k _ t.'.'.o.j.]. .l.7 |.} } |.[.: .r.|+|+<+D.s I.I.Q.Q.Q. + +1+1+[+[+*.y.*.y.y.*.y.M n+y.M M *.y.y.M M M M y.y.y.M M y.M e.*.*.y.[+*.*.*.[+*.*.*.y.*.[+1+*.*.*.*.*.*.y.y.y.y.y.y.y.y.a y.y.M M a y.y.y.M M M M *.M y.R M *.a *.*.M y._ a y.y.y.y.y.a y.y.M y.R M y.y.y.y.y.*.*.M *.y.y.*.y.y.R y.n+y.R R n+n+n+n+a z+z+z+z+b b #+z+b b P.P.H.H.P.H.P.H.H.N.H.b b b N.N.b b H.b N.H.B H.H.H.N.H.P.P.H.b b H.P.P.B H.H.B .+X.X.B B B 4+X.)+.+N.B B H+.+H+N.N.H.#+s.h+- - J U U [ d+j.$+$+K {.{.F.@ m+@ m+@ l.m+ . . .K.K. .K.l . .m+l l l {.3 L j.v j.v d+d+F+F+[ P P F+F+F+F+O.O.).# # # # # # # # # # # # # O.O.O.P J X ^ ^ ~ _+%+~ %+%+V.%+%+_+(.n.^ 1 5 f z._ _ z.z.5 ^+^ (.~ (.~ ~ ^ (.^ 1 5 2 T +.w.O ].K. .] } d q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . t+. t+. t+. . . . . . ", "R.R.R.q.` q.` ` ` t A.$ @+, , , , @+v+$ $ $ $ $ A.$ $ $ $ $ @+@+@+, @+v+@+@+@+@+v+v+@+$ @+@+@+@+, , , , , , , , , , , , , , , , @+, @+@+, @+6.6.V 6.6.6.V m 6.m 6.m m m P P P [ d+v d+[ [ U ,+_ X w E+S.i.i.B.B.2.3.#+- C.k C.,+,+'.j y+j.l F.l.7 d q q q 7 } |.l. . .].].x+D.O I.o.Q.5+Q.$.t. +*.*.[+[+*.*.M y.*.M y.y.y.y.y.y.y.*.n+M M n+y.n+y.M M M M M y.y.*.*.y.y.y.*.*.*.*.*.*.*.*.M *.y.y.*.*.y.[+y.y.y.y.M *.M M a *.M y.y.y.n+n+R y.y.y.*.y.*.*.y.a y.R M R y.M R y.y.*.y.y.y.y.y.M *.y.y.y.y.y.y.y.n+M y.n+y.R m.n+n+m.m.n+n+z+z+z+z+b z+b b b b H.b b H.P.H.P.H.H.H.P.H.H.P.H.b N.!+b H.P.H.B H.H.P.B P.B P.H.P.N.4+.+P.B H.N.B X..+P.B H+4+)+)+X.X..+.+)+)+X..+4+.+4+.+.+4+a+}+}+M.s.- - V J U P [ v v $+p p K {.{.{.F.m+m+F.m+m+F. . . .K.l . .F. .m+F.{.l l p 3 3 j.v j.v j.d+F+d+[ F+F+F+O.).O.O.O.# O.# # # # # # # # # O.# O.O.U k f ~ ~ _+~ %+%+%+%+%+%+%+_+^ ^ 5 5 z.z.k z._ _ z.2 5 ^ ^ ~ ~ ~ ~ ~ (.1 ^ 5 2 *.& w.x+L . .l.} d q d Q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . t+. . . t+. . . ", "o 8+o o 2.8+8+R.` * A.u+v+6.V v+v+v+A.A.` ` t t t t t t $ $ $ v+v+@+@+@+v+v+$ A.$ $ v+$ $ $ @+v+@+@+, , , , , , , , , , , , , , @+, , @+@+@+V @+V V 6.V V V V m m m P m P P [ F+d+d+v d+[ j U ,+- s.H+! )+B.r+r+8+* Y.Y.J ,.7+U j [ [ L 3 m+] } q . . . . Q q q 7 |.l.: r.].L x+D.s w.I.Q.Q. +t. +*.*.[+y.*.*.M y.M M y.y.y.y.y.M y.n+n+y.M y.y.M M M *.*.*.*.*.y.*.*.*.y.*.y.[+*.y.*.*.*.*.*.*.p.*.y.y.y.p.y.M n+y.n+M M a y.M *.M M M y.y.y.y.R *.M M a R *.*.y.y.y.y.y.y.*.R a M y.m.[+y.n+y.M M y.n+y.y.n+m.n+n+m.n+n+z+#+z+n+#+n+b w H.b b N.b N.b N.H.H.H.H.H.P.H.P.H.P.H.H.H.H.P.H.H.H.b N.H.P.1 P.H.H.N..+.+.+1 B P.B B X.B P.B P.B X.X..+B 1 .+)+B.)+)+^.)+)+B.B.X..+.+^..+^..+.+4+S.a+'+s.s.h+g J m F+d+v v $+3 p K K {.{.{.F.{. .l l l l l .l {. .{.F.F.{.l K 3 3 $+3 v v d+d+[ d+d+d+[ d+F+F+O.O.# O.# d.# # / # # # # # # # # # O.O.P J z.~ ~ %+%+%+%+%+%+%+%+_+_+_+^+5 z.z._ _ _ _ _ z.2 ^ ^ ^ ^ _+^ _+^ ^ 5 5 z.z.e.& w.x+L F.m+] ] } d d q Q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "G o o o o #.! 2.R.R.* v+v+V 6.v+u+u+* ` ` 8+8+8+8+t 8+` t t A.v+v+v+@+v+v+A.A.t t t t t $ A.t $ @+$ , , , , , , , , , , , , , , @+, 6., 6.v+6.V 6.6.6.m V m m 6.6.m m d.m d.P F+F+d+d+F+P l+,.C.#+H.a+)+B.r+i r+` * Y.U P P e+F+[ j.L 3 m+l.} Q 0.. . . . . 0.Q q d 7 [.: : K.r.|+x+s o.o.Q.Q.$. + + +*.[+y.y.y.y.y.y.y.y.n+n+y.y.M M y.y.y.y.y.y.y.y.M M y.y.y.y.M y.y.y.y.y.y.y.*.y.y.y.y.y.m.y.y.y.m.y.y.y.y.y.M a M y.M a M M y.y.y.y.y.R y.M M n+y.y.y.y.R y.M y.R y.m.y.m.n+n+n+M R n+n+n+b n+z+n+n+n+m.b m.b z+n+z+#+b w H.b N.b b b H.H.H.H.b H.b H.H.H.H.P.H.H.H.H+.+B P.H.H.N.1 B H.N.b H.B B .+1 P.P.B .+.+X.B H+B .+)+X.X.B B X.X.)+X.X..+)+)+2.2.i.i.B.2.B.)+)+i.)+)+^.q.^.2.)+^.^.R.M.M.* g - J m P d+d+$+$+' ' K p K K K l K l l {.l {.l .F.K {.K K {.K K 3 3 $+$+d+d+v [ d+d+F+F+F+F+F+F+O.O.O./ # / # / # # , # # # # d.# ).# O.P J 5 ]+%+%+V.%+V.V.V.%+%+%+_+^ ^ 2 z.T _ $.'.$.z.z.2 2 ^+^ ^ ~ _+^ ^ ^ 2 2 a T $.0 w.D.]. .m+@ @ ] } d d d q q Q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . t+. t+. . . . . ", "G G G #.G o ! ! 3.` * g V g u+u+* ` 3.R.8+o o f.o 8+8+8+t ` t A.v+v+v+u+A.` M.8+` 8+f.8+8+t t t $ $ @+, , , , , , , , , , , , , , @+@+@+6.@+6.6.6.6.V 6.V 6.m m 6.m m m m d.P F+F+F+F+F+P U Y.- '+}+R.2.r+4 i f.` g J m P [ [ j.j.$+3 l l.] } Q 0.. . . . . . . 0.Q q B+[.[. . .].].x+o.w.I.I.t.$.[+ +[+*.*.y.y.y.M M y.y.y.y.y.y.y.y.y.n+M M y.m.*.M n+n+R M M y.y.n+y.y.y.y.y.y.y.y.y.y.y.*.y.y.y.y.y.[+y.y.y.y.y.y.M n+M M n+M M n+M R y.M y.R y.n+M M R n+n+n+n+R n+n+m.n+n+n+z+b #+n+n+n+n+z+b b b #+z+#+b z+N.b #+b b b N.b N.H.b b H.b P.H.H.b H.b H.P.B H.P.H.H.H.P..+.+P.H.H.H.P..+1 H.H.B 1 .+X..+.+B X..+)+X.X..+X..+)+)+)+X..+^.)+^.)+i.)+)+i.B.C+C+C+C+C+C+2.)+B.B.B.)+2.^.^.2.)+^.8+a+* * * u+- V m F+F+d+$+$+' ' ' $+p p 3 K K l 3 K l 3 K l K K K K K p p p $+$+v d+d+d+d+F+F+F+F+F+F+[ F+O.d.O.O.# / # / # # , # , # # # # O.# ).O.U X ~ ; V.V.V.V.V.V.V.%+~ ~ ^ 5 z.z._ _ '._ '._ 2 ^ ^ ^+^+^ ^ _+^ h.^+2 r $.& w.O j.L K .F.@ @ ] ] ] } d d d q q Q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . t+. . . . . . . ", "6 G G 6 6 ]+]+G+@.M.s.h+g g u+M.3.3.! ]+o o _.i i i 8+o R.` ` A.u+u+u+A.` 3.` o 8+o 8+8+8+8+` t A.$ v+, , , , , , , , , , , @+, , , 6.@+6.6.6.6.6.m 6.m 6.6.6.6.m 6./ / m / d.d.F+F+F+P m Y.- h+'+q.^.r+4 4 /.8+* g J l+P [ [ d+j.L 3 F.m+] d Q 0.. . . . . . . . 0.Q Q q [.[. . .].].x+s o.0 I.t.t. +1+[+y.y.y.M y.n+y.y.M y.y.y.y.n+M M y.y.y.y.y.y.y.y.y.R n+y.y.y.y.y.y.y.y.y.y.M p.y.y.y.y.n+y.y.m.m.y.9+y.y.M y.M M a n+M M M M R m.M n+R n+n+n+#+#+n+z+n+z+z+z+#+b b b z+b w !+b H.N.z+b b b N.b b #+b b N.b b N.z+N.b b w H.N.H.N.b H.N.H.B P.H.H.H.H.B .+P.P.B H..+.+B .+B P.B 4+X.1 B P.B 4+4+X.)+X.X.4+^.)+B.)+)+)+^.2.)+)+2.)+)+)+B.)+)+)+C+C+C+2.C+2.C+2.C+C+2.^.q.q.2.^.^.^.^.^.8+q.` ` M.* u+- V m m F+F+d+).).).$+$+$+$+3 3 $+3 3 $+p 3 3 3 l K K p p 3 $+$+v ).).d+F+F+F+j F+F+F+P F+d.d.O.O.O.d./ # / # , # # / # # / # # ).).).F+P - 5 ; V.V.I y y V.V.%+~ _+^+^+z.$.T '.w.j $._ z.^+2 ^ ^ _+^ ^ ^ ^ ^+2 a T C w.j.|+L l {.F.@ @ @ @ @ @ ] ] ] } d d Q q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . t+. . . . . ", "6 6 6 ]+c+G+S.@.E+s.- h+M.s.3.3.! ! o G _._._._.G _.o o ! 3.` M.g M.* M.` ! o o _.o 4 o o 8+8+t ` A.v+v+, , , , , , , , , , , , , @+, @+6.6., m , 6.6.6.6.6.6.6.m 6.6.6./ 6./ / d.d.d.m m 6.* M.R.8+f.i 4 + f.` u+V ,.U P [ [ j.j.j.l F.m+] } q 0.. . . . . . . . . . 0.Q q 7 |.: .K.].D.O I.I.Q.$. +1+1+*.*.*.y.y.n+y.n+y.n+y.y.y.n+y.y.y.y.y.y.y.m.y.y.y.y.n+*.y.n+*.n+y.y.y.m.y.y.y.y.y.y.*.p.[+y.y.9+y.m.[+m.M n+M n+n+M z+z+n+n+n+n+w b #+#+n+b b H.E+H.b n+N.b N.H.N.H.w N.H.H.H.H.P.b N.b N.z+b N.b #+z+n+z+b N.b b z+b b N.H.P.H.P.H.H.H+.+1 B P.B P.B X.4+B 1 P.B X..+.+.+1 .+4+4+.+X.X.1 X.^.X.)+)+i.i.)+B.B.B.B.C+)+B.B.)+C+2.C+2.C+B.2.q.)+2.2.2.2.2.q.2.2.q.q.4+4+4+^.^.^.^.q.^.q.q.R.` * * A.* u+V V m d.F+).d+).$+d+v ).$+v $+$+$+$+3 $+p $+$+$+p $+' $+$+$+d+d+F+F+F+P F+P d.P P d.d.P d.O.d.d./ d./ # / # , # / # / # # # ).).).).F+U z.n.V.y V.y y y V.%+~ ~ ^ 2 z.$.Q.j w.j j _ 2 ^ ^+^+^ ^ ~ _+^ ^ ^+2 z.T w.w.x+L l l K {.{.{.{.@ @ @ @ @ @ @ ] ] d d d Q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "c+c+G+c+1 1 f 5 E+X X X f 3.3.]+]+G G _.W W _._._.G o o o 8+M.M.M.M.3.3.]+o G _._._._.i o o ! R.` * v+@+, , , , , , , , , , , , , , , , , , 6.6., 6.6.6.6.6.6./ , , , / , / / / / d./ / 6.u+u+` q.2././././.` t u+V m m U P [ [ v L 3 l @ @ } d q 0.. . . . . . . . . . . Q q 7 |.: .].L x+o.I.I.Q.t. +[+[+[+y.y.y.y.n+y.m.y.n+y.y.y.M M *.n+y.y.n+y.y.n+y.m.y.m.m.y.y.y.m.p.n+y.y.y.[+p.y.y.y.[+m.9+y.[+m.n+m.n+m.n+n+z+n+b z+z+z+z+z+b H.H.H.N.N.b H.P.H.H.H.H.b H.P.P.P.H.P.b H.P.b P.N.N.N.z+b b N.b N.b N.z+N.z+b P.N.N.N.w H.H+B .+H.H.H.B 4+.+H+B B H+.+.+)+X..+X..+4+^.^.X.X.X.X.)+X..+X.)+)+)+^.)+B.B.C+C+C+B.)+^.B.2.C+2.2.q.q.q.)+2.2.)+q.q.q.q.C+q.q.2.4+^.)+^.4+4+'+4+^.2.q.^.8+q.R.8+8+` ` t M.u+A.V m m d.d.F+F+F+).F+d+).v d+v v v ).$+v $+$+$+$+$+$+v d+).d+F+F+P d.m d.m m / m / d.d.d.d./ # / # / , # / # , # / / d.d.# # ).).F+F+j k f %+V.y h I =+V.V.%+~ ^+2 T $.[ w.j.j.w.'.k 2 ^ ^ ^ ^ ^ (.n.^+5 2 r _ & w.j.j.l 3 {.K {.{.K K K {.{.{.@ @ @ @ @ @ ] } q q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "1 5 5 5 5 z.z.z.z.E+f 3.! ]+G G G W G W _._.W G G G ]+o ! 3.3.M.M.3.! ]+]+G _.W 3+_._._.o o o 3.` * g 6.6., , , , , , , , , , , , , , 6.6.6., / , 6.6., , , , 6., , , , , , / / / / / / 6.v+A.t 8+/././.f.t t A.v+V J m U m P [ d+v 3 l m+@ } d d Q 0.. . . . . . . . . . 0.0.d 7 7 : .].|+O o.I.Q.Q.t.$.*.*.*.y.y.y.y.y.n+y.n+y.y.n+y.n+y.*.y.y.y.y.*.y.y.y.y.y.m.m.y.y.*.m.y.y.y.y.y.p.*.p.n+[+m.9+n+n+m.z+n+#+z+b z+b b N.H.b N.#+N.N.H.H.B H.}+N.H.H+H+H.P.H.P.H.H.H.P.H.H.P.b P.H.P.H.H.H.b N.z+N.b H.H.P.b b N.N.H.H.H.H.H.H.B H+.+H+.+P..+4+X..+.+X..+X.4+^.X.^.i.)+)+^.)+^.i.)+B.)+)+^.)+X.)+B.^.)+q.)+2.2.2.C+2.q.^.q.B.2.2.)+^.)+q.)+2.)+q.)+q.)+B.B.^.^.^.4+.+q.4+4+'+a+a+2.q.2.2.8+8+q.8+` ` t t A.A.u+V 6.m m d.d.F+F+F+F+F+F+d+d+d+d+d+).d+d+).d+).).).).d+F+F+F+d.U d.m m / m / m / / / / # / / / / # / / , # / / # / # d.# O.).).F+F+j '.z.n.%+V.h y y I V.~ ~ ^ z.T & w.[ j.j.j.w.'.2 ^ _+^ ^ ~ ^ ^ ^ 2 2 a $.& w.j.L 3 3 K K K K K K K K {.K K {.{.@ {.@ @ ] } d q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "5 2 z.a a a z.5 5 c+]+]+G G G _.W < W W W G W G G G G ]+! 3.f 3.3.]+]+G G W W W W _.W W G ]+! 3.M.g V 6., / , , , , , , , , , , , , , , , , , , , , / 6., , , , , , , , , , , , , , / @+6.v+@+$ t t t t t t A.v+V V V m m U j F+v v 3 K F.@ ] ] d d Q Q . . . . . . . . . . 0.Q q 7 l.: .].].x+s w.0 & Q.$. + +*.*.[+y.y.y.m.y.m.n+y.M y.y.y.M y.y.m.y.9+y.y.y.n+m.y.y.y.n+n+n+n+p.p.n+m.n+n+n+#+m.z+#+#+#+b H.N.N.b #+b b P.P.H.P.H.w H.H+H+H+a+B P.H+H+P.H+.+B 4+P.P.H.H+H+H+B P.H.P.H.P.H.H.H.b H.b H.H.N.H.N.b H.H.H.H.H.P.P.a+B 4+.+.+.+X..+.+4+)+)+)+)+)+)+^.2.)+i.B.)+)+)+)+2.2.2.2.q.^.^.q..+.+B.)+q.q.)+q.2.)+q.)+X.X.^.)+)+q.^.4+q.2.B.2.)+q.q.2.)+2.)+.+^.^.)+)+^.4+4+4+R.R.2.8+2.8+2.8+8+f.` t t A.A.v+v+6.6.m m m d.m d.P F+F+P F+F+d+F+F+F+).F+).F+F+F+F+F+F+P d.d.m m m m 6.6./ / , / / , # / / / , # , # , # / / / / d.O.O.).).d+F+P j k k X n.~ =+=+=+=+=+; ^ ^ z.$.0 w.j.O L j.w.[ _ z.^+^ ^ ^ n.n.^ 5 2 2 _ 0 w.w.j.L p K ' K ' K ' ' ' K ' ' ' p p K K F.m+l.] d Q Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "a T T & $.T a 5 1 (.W G W W < < W < < _.G G G 6 ]+]+]+]+S.@.c+]+]+; G G W W _.W W W G ]+]+]+3.f - J m / 6./ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , / , , , , @+@+$ $ $ $ $ $ $ v+v+V V V m m m P [ d+v 3 K K @ @ @ ] } d d Q 0.. . . . . . . . . . Q q |.[.l. .].L x+o.o.Q.Q.Q.$. + +[+[+y.y.y.y.y.[+y.y.y.y.y.m.y.n+y.9+y.m.*.n+n+y.n+m.m.m.m.n+n+n+n+n+n+n+n+n+z+N.w b b #+b b H.H.H.N.b N.N.H.P.P.H.H.H.H.P..+H+H+4+H+H+B 1 P.H+H+.+H+.+H.1 B P..+P.H.B B B B P.H.H.H.H.P.H.H.H.}+H.H.}+B H+B H+1 @..+H+4+X.)+i.)+)+)+)+)+i.B.B.B.2.)+2.)+B.B.2.2.^.^.^.)+2.^.^.4+4+^.4+^.)+q.)+)+^.B.)+)+^.^.^.^.B.2.)+^.^.^.q.)+B.B.q.q.q.2.C+C+)+)+^.)+)+)+^.4+a+4+8+q.8+2.r+f.8+8+f.8+t t t t v+u+V 6.6.m 6.m m m m U / m P d.U F+P O.P O.F+F+d.F+d.d.d.m m 6.6.6.6.6.6./ 6./ , / , / , / # , # , / / / , / / / / d.O.O.F+O.d+F+P j U k X f 3.; G W W G ~ 1 5 z.$.& w.j.j.x+x+O w.& _ 2 ^ ^ ^ ~ ^ ^ 5 2 a T j w.j.v v 3 3 p ' ' ' ' ' ' ' ' ' ' ' $+L L l K .l.l.d d q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "& w.w.<.w.T 2 ^ G G W < < < < < c < W W G n.n.]+n.]+c+1 c+]+(.]+; G G W W W W G G G (.]+n.f z.k k ,.m m , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , @+@+@+@+@+$ $ $ $ @+v+@+@+V V V m m P F+F+v $+3 K K {.@ @ ] ] } d q q Q Q . . . . . . . 0.Q d } [.: .K.|+x+O o.I.Q.Q.Q. + +1+ +y.[+y.y.m.y.y.y.*.y.y.m.[+y.y.y.9+n+M n+R m.n+w n+#+n+b N.N.H.H.b #+b w H.H.H.b N.b H.H.P.H+H.N.#+H.H.H.H+B B }+.+B B H+.+.+B 1 .+B .+1 B 4+H+1 B 1 .+4+B H+B H+H+H+B B B P.H.P.H+}+H+B H+.+H+}+H.B @..+.+.+.+^.^.^.)+)+2.2.2.^.)+^.2.)+)+2.2.^.2.)+^.)+2.^.4+.+4+^.)+)+4+4+4+4+)+)+)+^..+)+^.2.2.)+)+^.^.2.2.2.C+)+)+q.2.2.C+B.2.2.2.2.2.C+)+2.)+2.B.B.)+^.R.R.q.2./.r+f./.f.8+f.t t t A.$ u+v+@+6.6.6.V 6.V 6.6.m m m m m m m m / m m m m m m m 6./ 6.V 6.6.6.6.6.@+, , , , / , , , , / , / / , / / / / / d.d.d.O.O.F+O.j j k k z.X 5 f n.]+G G G c+1 z.z._ '.w.w.w.O j.O w.w.& z.5 ^ n.n.1 ^ 5 5 z._ '.[ j.j.v 3 $+' p ' ' ' ' ' ' ' ).).d+d+d+j.j.L l .l.l.d d Q Q 0.0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "D.|+> 6+w.r 5 6 ; W W < =+< c < j+< < G ]+1 5 5 5 5 c+c+n.G G W G W W W G _.G 6 n.c+5 5 z.z._ _ j j P m / , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , @+@+@+$ $ @+$ @+v+$ @+V @+6.V 6.6.m / P P F+d+d+$+3 3 K {.{.@ @ ] ] } d q q Q 0.0.. 0.0.. 0.0.Q q } |.l. .r.].x+<+D.o.0 I.Q.$. + + + +*.*.y.n+y.n+m.y.y.n+m.m.m.m.m.#+n+z+z+w b H.N.#+#+b H.N.H.H.b N.b N.b H.H.N.N.#+b N.P.P.P.H.H.P.H.P.P.H+B B H+H+.+H+B .+4+.+.+1 .+.+.+.+.+X..+X..+4+B H+.+.+X..+a+B @..+.+.+.+B H+B B .+.+4+a+4+B a+4+.+.+4+^.4+^.)+)+)+2.2.2.^.^.2.)+^.2.^.^.)+^.)+2.2.^.^.^.^.)+)+)+.+4+4+^.2.)+2.)+)+)+2.C+2.B.B.^.2.2.C+r+2.2.2.2.2.2.2.2.2.f.r+r+r+C+B.2.2.2.2.2.)+q.R.q.8+q.8+f.f./.t f.t t t $ $ v+v+@+V 6.V 6.V V V 6.V 6.m m V m m 6.m m m m 6.6.6.6.6.V V V v+v+v+@+v+, , , , , , # , # , # , / / / , / , / / m d.P P P F+P j U k k X f 5 ]+]+]+; G ]+]+1 5 z.e.$.w.w.j.O O w.w.& $.T z.z.^ n.c+n.5 5 z.y.$.'.w.j.j.$+$+$+' ' ' ' ' # ' ).d+F+[ [ j w.j.j.L l .l.] d d q Q Q Q Q 0.0.. . . . . . . . . . . . . . . . . . . . . . . . . . ", "S S |+6+& z.n.6 W W < W < < < (+< W < G 3.5 z.z.z.5 c+n.G ; W W W W W W W G ; ]+f 5 z.z.T $.& w.0 j 7+m m , , , , , , , , $ , , , @+@+, @+, , , , , , , , , , , , , , , @+, , , , @+, @+@+@+@+$ @+v+$ v+@+@+v+V @+6.6.6.m m d.m F+F+d+v v $+L 3 K K F.F.@ ] ] ] d d d q q Q 0.0.0.0.0.q B+7 [.: . .].x+<+D.D.o.o.I.Q.Q.t.[+*.y.y.y.m.y.m.m.n+n+m.n+m.b b z+n+m.b N.P.P.H.N.b #+E+B H.P.H.N.n+b b H.B H.w N.H.H.H.H+H+}+N.H.H+B @.B H+a+4+H+.+X..+.+4+4+.+X.X.X.4+B .+X.i.X.X..+4+.+)+)+)+.+.+@..+4+^.4+.+R.4+a+B a+4+a+4+a+a+H.B a+4+4+4+^.4+)+^.^.2.B.^.)+)+)+2.2.2.2.)+)+^.)+2.B.B.)+^.^.^.)+)+^.X.^.)+^.C+B.2.)+)+^.2.C+C+2.C+B.2.2.2.C+2.2.2.r+f.r+r+r+q.2.2.2.B.B.)+2.o )+! 2.! q.q.R.f.f.t f.f.f./.t t t $ $ $ v+@+v+6.@+V V V V V V V V V V V 6.6.6.6.V 6.V 6.V V v+V v+v+v+v+v+v+v+@+, , , , , , , , , , / , , / , / m 6.6.m m U d.P j P U U k - 5 5 f 1 G+]+G ; 6 ]+c+5 z.z._ $.w.w.w.w.6+w.w.& $.e.a 5 H+G+c+G+5 E+R _ '.j [ [ j.v $+$+$+' ).).' ).).F+P U j j U w.j.D.L . .l.] d d q Q Q Q Q 0.Q . . . . . . . . . . . . . . . . . . . . . . . . . ", ": K.S 6+T z.n.]+G W W W W W W < j+W _.]+k '.& $.z.5 n.; G W ; W W W G G ; G ]+^ 5 z.T $.w.w.w.w.w.[ P m m 6., , @+$ , , , , $ , $ @+, @+, @+@+, @+, , , , , , , $ , , $ , @+@+@+@+@+@+@+@+@+@+@+$ @+$ $ v+v+@+v+@+@+6.6.6.m m d.P P P [ d+j.v v 3 l K K F.m+@ @ ] ] } d d q q Q 0.0.0.Q Q q d ] : : m+K.].L <+D.o.o.I.Q.Q. +1+*.y.m.m.n+#+m.m.n+n+b #+H.H.b n+n+n+b P.P.B H.b #+b B H+H.H.w b b b H.H+P.w N.E+P.B H+P.B N.H.1 H+H+4+B B @..+X..+^..+4+4+)+i.)+)+.+@.4+.+)+)+)+i.^.4+^.^.^.^.q.4+.+a+.+4+.+.+a+a+N.a+H+B }+'+4+}+N.}+4+@.4+^.4+)+)+)+)+B.B.)+)+2.2.2.2.B.2.2.2.B.2.2.C+B.)+^.2.2.2.2.)+q.)+)+2.2.C+C+2.B.2.2.C+2.2.2.2.r+2.r+2.2.f.2.f.f.q.f.2.q.2.2.q.2.)+^.2.! ^.2.^.2.R.R.` q.t t t t t t t $ $ $ v+@+@+v+@+@+@+V V V V V V V V V V V V V V v+V V v+v+V v+v+v+v+$ $ $ @+$ @+@+, , , , , , , / , / , 6.6.V 6.V m m m m m P U U U U _ k X f E+1 c+]+]+G G ]+]+1 5 z.a T $.w.w.6+w.w.w.C $.T _ a z.E+@.]+Z 1 H+E+R _ _ j [ [ v d+v ).$+' ).$+).d+F+P U U _ U Q.[ O x+L .m+l.} d d d q q q Q q Q Q 0.. . . . . . . . . . . . . . . . . . . . . . ", "|.: > O T z.5 ^ G+]+]+G G _.G _.W _.o k w.O O T 2 ^ c+G ; G G G W G W G G 6 ]+5 z.$.T w.6+O j.x+[ [ P m m 6.@+, , $ , $ $ @+@+@+@+@+@+$ , $ @+@+$ , $ , $ , $ , $ , , @+@+, @+, @+@+@+@+@+@+v+@+$ $ v+$ v+v+v+@+v+V @+6.6.6.m m m P P [ [ [ [ j.v j.$+l K {.F.m+m+l.l.] ] } d q q Q Q 0.Q q q B+} [.[.m+ . .K.].x+<+y+o.Q. +[+[+[+y.#+b H.w n+m.n+n+z+b N.b z+z+z+N.P.H+P.N.z+b N.P.H+@.B N.N.H.P.P.H.B H.H.B H+H+1 a+}+}+B H+X..+@.@.B 4+)+)+)+)+4+4+4+X.)+)+^.q.^.4+^..+)+^.^.^.R.4+4+^.^..+^.a+4+@.a+.+S..+a+a+H.H.H.}+a+'+B }+H }+4+.+^.)+.+)+)+2.B.B.r+C+B.B.2.r+r+B.B.2.2.2.i r+r+r+2.2.2.2.r+C+2.2.2.2.2.r+2.r+B.2.r+2.r+r+r+2.2.f.f.2.f.q.2.q.q.q.f.q.q.q.q.^.^.2.! ! ^.R.S.^.R.` q.` ` t t t t t $ t $ $ $ $ $ v+@+@+@+@+v+V v+6.V V V V V V V v+v+v+V v+v+v+v+A.v+A.$ A.v+$ $ $ $ $ $ $ , , , , , , , / , 6.6.m V 6.J V m m J P m U U J J z.z.b 5 H+@.c+]+6 6 6 6 G+G+P.z.a a & & w.O O <.w.w.& T e.M z.b @.G+6 ]+1 E+w X _ _ j [ [ [ d+v ).$+).).).).P P U k k _ _ w.w.j.L l .l.] } } d d q q d q q q Q q q Q 0.. . . . . . . . . . . . . . . . . . ", "k.: ].O w._ z.z.f 5 5 @.1 G+c+]+o 3.- j.|+O 6+$.z.5 c+c+]+(.G 6 G 6 ; ]+(.]+1 z._ w.w.6+O > O O j.[ j m m V @+@+$ @+$ @+@+$ $ @+$ $ @+$ @+$ , $ @+$ , $ , $ , $ , $ , @+@+@+@+, @+6.@+v+@+v+$ v+u+v+$ A.$ A.v+v+v+v+V @+V V V m J J U U P j j [ [ j.v v L l K l {.F.F.l.l.] } d d q Q Q Q 0.Q Q q d 7 |.[.l. . .r.x+y+O o.Q.t. +[+y.n+n+H.E+#+y.m.n+z+P.H.N.#+#+b H.P.H+H+B N.H.H.H+H+H+H+H.b H.H.H+H+H.H.H.H+.+)+X.@.B H.H+.+X.X.^..+.+4+^.)+)+)+^.q.4+.+^.4+R.a+a+a+4+B .+^.^..+4+a+a+@.a+.+^.^.4+S.a+@.4+@.4+a+H+B H.}+B a+4+4+H.B a+.+^.B.)+B.B.2.C+C+r+C+B.r+r+r+i i C+r+r+2.r+r+r+r+2.2.2.2.2.2.2.2.2.q.2.r+2.2.B.2.2.2.2.2.2.q.2.q.2.q.2.f.q.f.q.` q.q.R.a+R.a+a+a+a+a+a+R.S.S.a+a+R.R.` ` t $ $ $ $ $ $ v+$ @+@+$ v+v+v+v+v+V v+V v+V v+V v+v+V v+V v+v+V v+u+u+v+A.A.$ A.A.$ $ $ $ $ @+$ , $ , , , , , 6.6./ 6.6.V 6.V V J m m U P U U k - X E+5 1 1 c+G+Z G G 6 6 c+G+1 z.z.T T w.C w.<.w.C C w.& & T a z.H+G+Z k+G+@.w X X k k j [ [ [ d+d+d+v d+F+F+P U U - X k _ '.w.O L l m+ .l.} } d d d d d d d d d q q q q Q . . . . . . . . . . . . . . . . . ", "B+~+K.|+w.w.w.$.'._ k z.X z.E+f E+U L ].K.|+w.T z.z.5 5 5 c+c+c+n.G+]+]+]+G+X k C w.O 6+|+|+x+j.w.[ P 7+m V @+@+$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ , $ $ , $ , $ $ @+$ @+@+v+@+@+@+v+v+v+v+u+v+A.u+$ A.A.v+v+v+v+v+v+V V - V V V J J U U j j [ [ [ j.v j.L 3 l ].l l m+l.l.] d d d Q 0.Q 0.0.Q Q Q q 7 7 [.m+ . .].j.o.0 Q.t.t.y.n+b w H.m.R m.#+z+b H.H.b m.N.H.P.P.H+H.w H.H+1 1 .+H+N.w H.@.X..+@.a+N.P..+X.)+.+a+B B 4+.+^.4+^.a+a+4+4+4+^.^.4+4+a+}+a+4+4+4+a+B H+a+@..+^.S.^.4+4+G+)+S.^.^.^..+4+.+^..+.+S.B a+}+}+a+^.@.a+4+4+^.^.B.C+B.B.B.r+i r+i i C+2.r+2.4 4 r+2.r+f.f./.r+r+2.8+2.8+q.2.2.q.2.q.q.2.2.2.)+^.^.^.q.2.2.q.q.q.q.q.q.` q.` ` '+'+'+'+'+3.M.a+'+a+a+3.a+3.S.a+a+R.R.'+` t t A.$ v+$ $ v+$ $ @+@+@+@+@+@+v+6.v+6.@+6.V v+V v+v+u+v+u+v+v+v+u+A.u+v+A.$ $ $ $ $ $ $ $ $ @+@+, @+, @+6.6.6.6.6.6.6.V V V V m J d.U U U k X b E+@.G+G+]+Z G 6 k+#.6 6 1 5 z.a _ T & w.w.<.<.O C C & & $.1+z.E+G+i.Z Z G+@.f w X k k j j [ [ v d+).).d+F+P U - k E+b z._ Q.w.D.].l l.l.] } } } } } } d } } } } d d d q q Q . . . . . . . . . . . . . . . ", "D+|.[.: l |+L x+O w.w.j $.U $.'.0 x+K. .K.|+O & $.T z.z.z.z.X 5 5 5 5 5 1 f _ $.w.6+6+|+|+> x+x+O v P P m V v+v+$ $ $ $ $ $ t t t t t t t $ /.$ $ $ $ $ $ $ $ $ $ $ $ @+$ @+v+v+@+v+V v+v+v+v+u+A.A.A.A.A.A.A.A.v+u+u+u+v+v+V - - - V - - J J J j j j [ v j.j.j.j.L L L l .m+l.] 7 d d Q 0.Q 0.. . . Q q q B+} l.m+].<+<+o.o.t.Q.[+m.b H.E+#+9+y.z+b H.H.H.b n+w B .+X.@.H.H.H.P..+X.X.S.}+H.H.@..+.+.+S.a+H.4+4+4+.+4+}+'+}+B a+4+4+4+a+}+a+}+a+a+a+'+B }+}+a+4+B a+a+H+B .+.+.+a+^.^.^..+)+)+)+)+2.)+! ^.R.^.^.)+4+4+4+B 4+R.^.^.R.4+q.q.2.B.C+B.B.B.i r+r+r+r+B.r+2.2.f.2.r+2.2.q.2.8+2.2.8+q.2.q.q.8+^.q.R.R.q.R.2.q.R.^.^.a+a+a+a+R.R.a+` a+* '+` a+* a+M.s.s.s.s.3.f 3.3.a+@.a+! a+a+R.R.` * t A.A.A.v+A.@+$ @+v+$ $ @+@+v+@+@+6.v+@+@+v+6.@+v+u+v+u+v+$ u+v+v+v+A.v+v+$ A.$ $ $ @+$ , $ , $ , $ , @+@+@+@+6.v+6.V V 6.V m V m U m U U J k E+E+1 c+6 6 6 6 k+G k+k+6 G+c+1 2 a T T & C C w.<.<.w.C C & C $.*.b H+i.B.Z G+@.}+E+X X k J U P P d+d+d+F+[ P m U - X s.E+b z._ w.j.x+l F.l.@ ] } } d } } } ] ] ] |.] } } d d q Q 0.. . . . . . . . . . . . . ", "q B+|.[.: K.K.l l L |+x+O j.j.j.|+ .: [.[. .].x+w.& w.'.T _ _ z.z.z.z.z.z._ $.$.w.w.> > |+|+|+x+j.[ [ 7+Y.V u+t A.t t t f.t /././././.+ /././.+ /././././.$ /.$ $ $ $ $ $ $ v+v+v+u+v+u+v+u+* A.* t * t t A.A.A.A.A.u+v+u+u+u+u+- M.- - - - J J U P j j F+[ d+j.j.j.j.3 3 l l m+l.] ] d d d Q 0.0.0.0.. 0.Q q q 7 l. .].<+<+o.0 t.y.#+b H.w m.y.m.n+H.P.P.N.b b b P.@..+.+@.H.H.@..+^.^..+a+N.B a+.+.+^.4+4+}+B }+a+a+a+a+}+'+H.a+a+4+a+4+'+}+H }+B 4+a+'+B }+H+H+4+4+4+^.S..+S.^.^.! )+)+! X.)+)+B.B.)+)+)+^.)+! ^.)+.+4+a+a+4+a+4+4+^.^.^.)+2.2.r+r+r+q.2.r+2.4 2.2.q.f.q.f.8+q.8+q.8+q.8+q.^.8+R.R.q.R.R.R.R.a+a+'+3.a+a+3.f 3.M.3.'+3.M.'+a+'+R.'+'+'+M.* s.M.s.s.s.s.}+3.S.S.a+S.a+S.R.3.R.R.` 3.` A.A.v+v+v+v+v+v+@+@+$ @+@+@+v+@+@+@+@+@+v+v+V v+v+$ u+v+A.v+A.v+v+$ $ v+$ @+$ $ $ $ $ $ , $ , @+@+, @+v+6.@+@+6.V 6.6.6.V m m m P m U k k E+f 1 c+X.6 ; k+k+; G 6 6 c+1 5 5 a e.T & C w.<.w.<.<.<.C C & & e.z.P.G+6 Z i.G+S.f M.X - k U j j j [ F+P P P U Y.- E+f 3.f X R '.0 j.L l {.l.@ @ ] ] ] ] ] ] ] l.l.l.l.] } d d q Q Q Q . . . . . . . . . . 0.", "0.q B+[.[.l. . . . .].].].|+].]. .m+[.7 ] [. .S |+O O O w.w.w.0 '._ _ _ $.T $.$.w.w.O > |+|+x+x+x+d+[ P V V A.t f./././././.+ /.+ + + + + + + + + + + /./.+ /././././.t t t $ A.$ A.A.A.A.A.t t * t ` t t t ` A.v+u+u+u+u+u+- u+M.- u+M.- - - J J U P j j [ j [ [ [ j.j.v L l l {.m+@ ] } d d q Q 0.0.. . 0.Q 0.Q } l. .L x+o.0 t.y.b B @.B m.m.R z+H.H+H+H.H.H.H.4+@.4+.+@.H+H.}+H+4+a+B a+'+H }+4+H+a+.+a+}+H }+B B .+a+B a+N.H+@.4+a+4+a+a+'+a+B 4+a+a+a+4+a+H+}+.+4+^.^.^.^..+^.^.)+2.B.i.)+)+2.2.B.2.B.o 2.2.q.8+^.R.a+4+a+` R.R.^.^.q.^.q.2.2.2.B.2.2.2.q.f.2.2.q.q.R.q.R.` a+'+* * ` '+'+a+` '+'+'+'+'+'+a+* '+f s.'+f s.f E+E+s.f M.M.M.M.M.'+M.M.M.M.- s.- - - X s.M.3.a+S.S.R.3.a+a+3.3.` * * A.A.u+u+v+v+v+v+v+v+@+$ @+@+@+@+v+v+@+@+v+@+v+v+v+v+$ A.A.v+A.v+A.v+$ $ $ $ $ , $ , $ , $ , $ , @+, @+@+V V V v+V V 6.V V m m m P m U k k X 5 G+G+c+6 k+G k+6 k+(.X.1 5 2 z.a T & C C C <.<.w.C <.w.<.C & T R b @.Z k+G ]+S.S.E+s.X - k U U j P P P U U J - M.3.S.@.H+E+R _ 0 j.L 3 K {.m+F.m+@ @ ] @ l.F.m+ .: l.[.l.7 ] 7 d d q q Q 0.0.0.0.. 0.Q Q Q ", "0.Q B+] [.: l. . .K.K.K.K.]. . .: l.7 B+B+|.: K.K.|+|+|+|+|+O O O w.w.w.& & '.& w.O |+> > |+|+|+j.j.[ ,.,.* t f.f./.+ + + % + + % % + % % % % % + % + % + + + + + /./././././.t f.t t t t t ` t 8+` ` ` t t A.A.A.u+u+u+u+u+u+M.u+f f - M.X - J J J U U j j j j j [ [ j.j.j.L L l F.F.m+] ] } d d q Q Q 0.. . . 0.q ] m+ .<+o.Q.[+m.H.H+@.}+H.n+n+#+w B }+H+w w w w '+H+a+B }+}+H H.H.H.a+a+H.N.H.H.}+4+.+4+4+a+}+}+@.4+a+a+}+a+B @.H+.+4+4+4+4+a+}+B a+4+R.4+.+4+4+R.R.q.2.^.)+^.)+)+2.B.2.B.2.2.B.2.2.2.B.^.2.q.R.^.R.^.a+a+'+'+'+a+a+R.4+4+^.^.q.2.q.q.q.2.^.q.8+R.R.a+'+* '+* * '+* * * * h+* M.M.M.M.f M.M.M.M.s.s.s.s.w s.s.E+s.X s.E+s.M.M.M.M.M.M.M.h+M.h+s.- X - X M.3.3.3.a+3.3.a+3.3.` 3.M.3.M.u+u+u+V v+v+v+v+v+v+@+$ @+$ @+@+@+v+@+@+v+$ @+v+v+v+$ A.A.$ $ v+A.@+@+@+, $ $ $ , $ , , $ , @+, @+@+6.V v+V v+V u+V V V V V m m U U J - s.f G+G+6 6 W 6 W W 6 6 1 5 5 z.z.T $.T w.<.<.<.<.6+6+<.<.C C C $.a 5 G+i.G 6 #.]+G+3.3.X - - J U U P U U J V - M.3.^.! S.3.f b *.'.[ j.L 3 3 K l l .F.F.m+F. .l l . .m+: l.] [.] ] } d 7 d q Q Q q q Q Q D+", "0.q q |.[.m+: K.].K.].].].].S m+: [.7 B+B+B+[.K.S ].|+|+|+|+L |+x+O w.w.& w.$.'.6+O |+].S K.|+].L j.F+m u+` f./.+ + :.% b.% % % % % % % % % % % % % % % % % % + % + + + + /./././././././.f./.f././.8+8+t t t t t A.u+u+A.M.A.M.M.M.M.- - - J - J J J U U m U j j j j [ j.[ j.j.L 3 l {.F.l.] ] 7 d q q Q Q 0.. . Q 7 m+L o.Q. +n+b B 4+S.@.}+w n+#+#+w H }+w #+L.m.#+w }+}+'+H w w N.H+}+4+a+}+}+H+@.^..+.+a+4+4+a+.+.+4+4+4+a+.+.+4+@.4+4+4+4+4+4+a+a+4+4+R.^..+.+4+^.q.^.^.2.^.q.^.^.)+2.i.B.o 2.2.2.2.r+2.^.^.R.a+R.R.a+'+'+H H '+'+'+'+'+'+a+R.R.R.a+a+R.a+a+'+'+* * '+h+h+g g g g L.- g L.h+s.h+s.s.s.M.s.E+s.M.X s.s.s.X s.X s.s.s.s.X X M.* M.s.s.s.- - - - J - Y.- L.M.3.3.M.a+a+a+a+M.M.M.* M.- M.V u+V V u+v+v+v+v+v+v+@+$ $ @+$ @+$ @+@+$ $ v+$ v+v+$ v+u+v+$ A.$ $ $ $ , $ , $ $ $ , , , @+, 6.6.6.6.V V V V V V V V J V U m U U J R X E+H+G+c+6 6 6 6 6 6 c+1 2 z+T e.T C w.<.<.<.<.6+6+<.<.<.<.w.& T a z.G+c+#.k+#.G ! 3.3.f M.- - J m P J - - * M.8+2.r+r+o a+'+s.k _ j [ j.j.j.3 L 3 L 3 l K K L L x+].]. . . .: l.l.l.l.l.l.7 7 7 d q B+q B+B+", "0.Q B+] [. .K.l ].|+|+x+|+|+K. .[.[.B+q q k.[.~+ .K.].|+].].].|+L O O w.w.& & Q.w.O > S K.K.].L L [ 7+Y.* f.4 :.:.b.Y ........p+a.a.a.a.a.a.a.% a.a.% % % % % % % % % % + % + + + + + + + + 4 + + + + + /.f.8+8+t $ t t A.A.3.A.M.u+- - V - J V J m J J U U U U U j j j j w.[ j.j.v L l ].{. .m+] ] } d q Q 0.0.0.Q 7 l.l y+t.,+m.s.}+@.4+4+a+H #+m.m.#+s.w N.#+L.#+#+w H.}+B H.N.s.H.B @.@.H+a+B B @..+)+^.4+4+a+^..+4+4+R.a+4+)+^..+^.^.^.R.R.^.4+4+a+4+R.a+^.R.q.^.R.R.R.q.^.^.! R.R.R.^.2.)+^.^.! R.2.R.2.2.R.a+a+'+* '+'+L.h+h+h+g * * * * '+h+s.s.M.3.}+f M.f M.s.L.L.Y.Y.Y.g Y.Y.- - - h+X h+s.s.s.s.s.s.s.s.X s.X X X X X X X X - X X X - - X - X - - - - - J J J J Y.g * M.'+3.M.` M.M.* M.M.- M.- - - V - V V V v+v+v+v+v+@+@+@+@+, $ @+v+@+@+v+v+v+A.v+v+A.v+v+@+@+$ , $ , $ $ , , , $ , , , 6., 6.6.6.6.m V V V V V V m m m m P U J k X E+@.G+X.6 6 6 6 6 c+1 5 z.a T & w.C 6+6+6+6+6+> 6+6+6+6+<.<.C T a 2 P.G+Z #.G ]+o o 3.3.X - J J U m V * 3.` 2.B.F ;+A+B.o a+s.L.,+/+j e+[ j.j.j.j.j.L L L 3 L L j.D.x+x+K.K. . . .F. .m+ . .l.[.|.7 7 B+B+|.", "q q 7 l.: .].|+O O O O |+|+|+K.l.] q q q B+[.: K.S |+S ].S |+|+|+x+O O w.& w.0 w.|+S S . .].L v P C.* q.4 :.Y ....p+p+a.N a.a.= = s+a.s+a.s+s+a.a.s+a.s+a.a.a.% a.% % ..% % ..% % % b.% % Y % b.+ + + + /./.t t t t A.t u+u+M.u+- u+- V - J J U J J J J J J U U U j j j [ F+w.[ j.j.j.L l l l m+l.@ ] } d d d q d } m+L y+t.9+n+N.B @.@.4+.+'+#+m.n+n+H w w N.#+m.#+H N.}+a+}+N.}+H.H+.+.+.+a+@.4+^.)+4+^.q.R.4+^.^.^..+! ^.a+^.^.^..+)+4+R.4+R.4+a+4+'+'+4+a+^.^.R.R.R.a+R.R.R.4+a+'+a+a+R.! )+R.^.a+R.R.a+R.` '+'+'+L.L.L.L.Y.Y.Y.C.C.Y.L.L.h+h+h+w w #+s.E+s.X X s.- Y.J J J J J Y.J - J - - - - X s.h+s.s.X s.X X s.X - X X X X X - X X X - - X - - - - - J - J J J J J J - s.h+M.M.M.M.* s.g g - - - - - V - V u+- V u+u+u+u+v+v+$ @+$ @+$ v+$ v+v+$ v+v+v+v+v+$ v+$ $ , $ , $ , $ $ , $ , , , , , / m m m m m m m m J m V J m m U P U U J - w P.@.G+1 6 c+X.X.1 1 5 a a C & <.6+6+> > > 6+> > > 6+6+6+6+& T a 2 5 1 G+]+o ]+]+! 3.M.M.- g J m U V ` ! f.4 7.n *+G.A+r+2.M.h+J ,.w+l+j l+j 0 0 0 [ j.j.j.j.j.j.o.O D.|+|+L L L <+].].l K. .l.[.[.[.[.|.[.", "d 7 7 l. .].x+x+O O 6+O O 6+|+S .|.d q d 7 [.: S ].|+|+|+|+|+|+|+L O O w.w.0 w.O |+S .S .].j.e+C.* q.+ :.Y ..p+a.N = = = = s+= s+s+s+s+a.s+s+s+s+s+a.s+a.s+a.a.a.a.a.a.a.a...a.................% % % % + + /./.t t $ M.A.A.u+v+- - V J J m J J U J J J J J J J U U U U U j j [ j.w.j.j.j.L ].l l m+l.l.] ] d d } l. .L y+'.m.w H+.+)+)+)+)+.+s.#+m.w w N.}+s.N.#+#+H.}+B H+B a+}+.+.+.+4+4+.+4+^.^.)+)+R.^.^.q.q.)+^.R.4+a+4+R.^.)+.+4+q.'+4+4+R.R.'+a+a+'+R.^.^.q.R.4+` '+'+'+'+'+'+'+'+'+'+3.a+a+a+a+a+M.'+s.M.'+L.L.- - Y.C.k C.Y.Y.C.k Y.- L.X s.X s.s.X X X L.k g k Y.Y.J J J ,.J J J - k - - - - X - - s.X X X k - - k - J k - Y.k k k k k k - - X - J - J J J J U J J V - h+h+- * * h+h+g g V - V J J - V - V - V - V u+V v+u+@+v+v+v+@+v+@+v+$ V $ v+v+v+v+v+$ @+, $ , , , $ , $ , , , , , 6./ 6.m m m m m U m m m J m m P P P P P U U k X E+}+H+H+1 G+G+1 P.5 z.a T & w.<.6+6+> > > > > > > > > > 6+C T a z.5 5 P.H+S.R.! 8+3.3.X g - m J J V ` 2.7.3+Y *+*+( G.A+B.2.'+g C.C.k C./+/+,+/+'.'.'.j 0 [ 0 0 I.w.o.O x+x+x+j.y+o.j.O x+].K. .: [.[.[.[.", "} ] .m+].O O w.w.w.w.w.6+O |+].: ] d q d 7 [. .S ].|+|+|+|+|+|+O O O j.w.w.w.w.|+S : : K.].x+0 ,+h+q.r+:.;+..p+= = s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+= = = = a.a.= a.= a.a.a.a.a.a.E.E.% % % + + /.t t $ A.u+M.u+V V V V J m J m J J J J U m J J J J U U U j j j j j w.w.j.j.j.x+L L l {. .@ l.l.] l.F.3 o.0 ,+#+P.@..+B.i.B.B.^.a+'+L.#+E+}+}+N.H.H H B @.S.@.}+a+4+R.^.^.^.^.^.^.^.2.q.^.^.q.R.R.R.R.q.R.a+'+'+'+4+q.R.a+R.a+'+'+'+` '+'+'+a+a+R.a+R.R.a+'+'+* * g L.L.h+h+h+#+w w E+M.s.E+s.E+s.#+X L.- 9+9+Y.C.J C.J C.C.- C.- - - X w X w X X X - k k J J J J J U J J J k J k k - - - X - - - - - X k k - k k - J J - J - k - X k k - - - - - - k J J U J J Y.- g h+h+- h+- g - J J U m J J U J J V - V - - V - u+v+u+v+u+v+v+v+v+V v+v+v+v+v+v+v+@+@+@+@+@+$ , $ , $ , , , , , , 6./ / m d.m P m m P m m m U U m U P U P j l+,+- #+E+H+H.P.P.P.b b a e.$.& w.<.O > > |+> > > > > > > 6+> 6+<.T 2 2 1 ^ 1 P.H+3.f 3.` 3.X - - J m J V ` 4 ;+b.E.p+:+u.:+b+i o R.* g L.#+- X X X X R _ '.U '.'.0 Q.0 0 I.I.O o.o.Q.Q.Q.Q.I.w.D.|+].K. .~+: [.", "] @ .l x+w.w.$.& & w.C w.w.O ]. .] } d 7 ] l. .].|+|+O 6+O > O |+x+O O w.O w.x+|+K. .K.].j.j C.H q.2.7.;+:+p+N E = x.= s+x.s+s+s+A s+s+A s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+= = = a.= a.a.a.E.% + + /.8+t A.v+u+v+V v+V V m m J m U J m U J J J - U J J J U k U U '.j j j j [ [ w.j.j.L L L l l l l F.{.l j.[ ,+9+H.@..+i.B.C+C+B.)+4+'+w w }+B H+}+a+a+}+H+^..+.+4+a+4+4+^.)+^.)+^.4+R.a+q.2.R.q.'+'+'+a+a+R.'+'+'+'+'+'+` '+'+'+'+* '+'+'+'+'+a+'+'+'+'+'+'+'+'+h+g Y.Y.Y.Y.m.9+L.X #+s.w E+s.s.s.w s.s.X L.- - k C.C.,+C.Y.k k - 9+- X X X X X w X X - k k J ,+J J J J U U U U k k J k k k - k - - - - - X - k J J J U U J J J J k k - - R k - - J k - J V J m U J J Y.g - g - V J J m U m U P U U J k J V J V u+V - u+V u+V u+u+u+u+v+u+u+u+v+u+v+v+v+v+@+$ , , $ , , $ , $ , , , , / / m / m P P P j P U P j P m m U P P e+j e+j l+,+9+#+b w b R z.R M $.& w.O O |+].S S S S S > S > > > > > 6+<.C T z.5 1 1 1 1 E+M.M.M.M.X - - m J m u+` 4 Y E.p+>.>.u.u.*+;+4 q.a+* * '+'+s.s.E+}+w R m.k y._ _ '.& Q.Q.I.I.o.0 '. +e. +$.I.w.O |+K.S .~+: ", "m+F.l ].O w.T _ T & & & C w.O |+l l.} d } [. . .|+O O O O O O O O O O O L j.x+L K. .].L j.'.,+H 4+r+7.;+*+u.N = s+= s+= = = s+s+s+s+s+A s+A s+A s+A s+s+s+s+s+s+s+s+A s+s+A s+s+s+s+s+s+s+s+= s+= s+a.a.a.E.% + /.t t v+v+V v+V V @+V V m m J m J J J J U J J k U k k k J J J U _ U '.'.'.j j w.[ [ w.j.j.L L L l L v o./+m.w B )+B.k+C+A+A+++2.)+a+'+a+4+.+^.@.@.a+a+a+.+R.)+@.4+4+4+^.^.^.^.R.a+4+R.R.q.R.` a+'+'+'+'+'+* '+H * h+h+* h+H h+h+h+h+h+* s.'+'+'+'+'+'+'+'+s.h+L.g C.C.C.J k 9+- X X X w w E+w s.s.X X X X - - C.k J J k J Y.Y.- - 9+L.X X X X R X R X k k k k ,+J U J J ,+J U J k k k - k - k - - - Y.- k - k k J J J U ,.U J J J k - - - X - - - k - J - J V J m U m J V Y.J V m m U P P P U P U U U U J J - J - V - - - u+- - u+V - V u+V V v+V v+v+v+@+@+@+$ , , $ , , , , , , 6./ m m P P U P j j j P P j j P P U P j e+0 [ [ [ j '.C.[+9+R *.1+'.Q.w.O O |+S S : ~+~+~+0+0+0+~+S S S > > > 6+C T 2 5 1 c+G+G+3.E+s.M.M.- - J J m U u+` 4 ..a.= E E z >.u.*+F f.2.` '+` a+4+4+! i..+a+b #+R R [+/+$.Q.& w.I.I.Q.9+R z+z.a e.& w.O |+S K.: K.", "F.l L v O & _ T $.$.C & w.6+O L l l.] ] ] l. .].|+O w.w.w.O 6+O O O w.w.O L l K.l ].L 0 '.p.4+q.C+J.;+o+u.>.N a.N a.N N = = N = = = s+s+s+s+s+s+s+s+A s+A s+A A A A A A A A A A A s+s+s+s+s+s+s+s+s+s+a.a.E.% % + t $ v+V @+V @+V 6.6.m V V 6.m m m J U J U J J - J J k k k k J k U k _ _ '.'.j j 0 [ w.j.j.x+j.j.j.[ j k w }+i.Z C+++A+J.J.7.r+2.q.a+a+^.R.^.^.4+a+B a+R.^..+^.S.R.a+a+^.^.q.4+R.'+'+` '+'+'+'+'+* h+h+h+h+g h+L.h+L.L.g L.L.g L.L.h+L.h+* M.a+3.M.'+s.s.'+H L.L.g C.C.C.9+k k R R b X w X s.s.w s.s.L.X L.k - Y.k C.k k k k k k X X X X X X X X X R X X k k J k k J J J k k k - k - k - k - - - - - k - k k k J U U U U U J J J - k k - - k - - J - - J J J J J J J m U m m 7+w+7+F+P F+F+P P P j U U U U J J J - - - - - u+V - u+V u+- u+u+- V V 6.6.$ , , , , , , , $ , , , 6.6.m d.d.P F+j [ 0 [ 0 0 j j j j j j P j e+[ o.[ y+0 0 '.'. +'.'.Q.w.O |+]. .[.[.[.|.k.k.k.0+k.0+0+0+0+0+0+S > > 6+& T 2 1 G+G+! G+3.M.s.- g - J m U m g ` + Y >.= x.x.E N u.:+;+7.8+q.8+R.R.^.! B.i.B.i.S.}+s.b X *._ +Q.I.I.I.t.m.H.P.P.b a T +.w.> |+S S : ", "l L L O 0 $._ _ T '.& & w.w.O L L m+] ] @ m+l L x+w.C & w.w.w.C w.w.w.w.j.|+l l L j.0 ,+#+4+)+++J.*+p+p+>.p+p+p+....:+:+p+p+a.a.a.a.a.N a.= = = = s+s+s+s+s+s+A A A A A A A A A A A s+s+s+s+s+s+s+s+= = a.E.% + /.$ $ 6.6.6.6.@+6.6.6.6.m m 6.J m J m J J U k U k - k - k k k k k k k k U k _ _ _ '.j j j j w.j 0 0 '.,+#+3..+#.C+++A+J.J.J.7.r+2.R.a+a+^.! ^.q.R.R.a+@.a+R.R.R.4+a+R.a+R.'+R.'+'+` '+* * h+h+h+H g L.Y.Y.,.C.L.Y.g C.C.L.Y.Y.L.g - h+s.s.M.3.3.a+3.a+}+'+M.'+s.L.L.C.J J ,+[+k R R X X w w X s.X X X #+X X - R - - k - k - - - - - R - X X X X X X b X X X X k - X k X k k k k - k - k - k - J - - - - k k J k J J J 7+m U U J U J - k - X - X - - J - V - J m U U m m P 7+P F+F+F+F+F+d+F+d+[ P P j j U U U J J J V J - J - - V - V V V m V V V V 6.6.6., , , , , , , , , , , / 6./ m P P [ j [ w.0 [ w.0 0 0 0 j 0 [ [ 0 0 o.0 j.0 o.0 0 0 I.w.w.D.L K.: [.T.q D+0.0.t+t+D+D+D+&+k.0+0+0+0+S S > <.& a 5 c+]+o ]+S.3.M.- g - J U P m V ` /.b.p+= E ~.E N p+:+Y :.4 8+q.8+q.o B.r+r+#.B.]+! H+E+w n+y.$. +Q.Q.I.t.#+B X.c+1 P.a e.+.O > ].S S ", "L L L w.w.$.'.'.& w.w.w.w.O j.L l l.@ @ F. .].|+w.w.$.& T w.C w.& w.w.w.j.3 L D.[ /+9+N.q.C+J.G.u.>.N N a...Y b.Y Y Y *+Y *+..:+:+p+..p+a.a.a.N a.a.N = s+s+s+s+A A A A A A A A s+A A ~.s+A ~.~.~.s+= = a...% + t u+6.6.6.6.6.6.@+6.@+6.V 6.6.V V m J J J J k J k J J k J - - k - k k k - k k k U k k _ '.'.j j '.U k X }+S.o B.++J.J.J.J.:.7.i 2.)+R.R.R.! ^.^.a+a+a+a+S.a+a+a+a+a+a+a+'+* * * '+* h+* L.Y.Y.Y.Y.g Y.C.C.Y.Y.C.9+C.L.- Y.L.L.X L.- h+s.f M.3.a+3.a+3.a+a+'+M.s.s.L.- J C.J C.k k X z.X X X X E+X s.s.s.X L.X - - k X k - R k R X k X - X X X X X X X X X X X X - X X - - - - - - X X X - - - h+X - X X - - k k k J J J U J J J J J - - k - - - - g J - J J Y.J m U U P m P P F+F+d+d+).d+d+d+d+d+[ F+F+j j U J U k J J J - V - J V J J J m J m J V m m 6.6., , , , , , , , , / / m d.P P e+[ [ 0 o.o.o.0 w.o.o.[ 0 y+0 [ [ o.[ y+o.o.o.o.o.w.w.O x+|+S K.: T.Q 0.0.. t+. . 0.. t+. t+D+D+&+T.0+~+> > 6+& *.H+6 Z ! a+}+s.- C.w+U 7+P 7+Y.` /.;+E.= x.x.x.N u...b.:./.8+f.q.8+2.o i _.C+#.B.i..+S.E+b R *.$.& Q.Q.t.#+H+X.i.c+1 2 *.$.I.O |+K.K.", "].L L w.w.j w.w.w.w.w.w.w.w.j.L K F.l.m+{.l L x+w.'.$.& w.& w.C & w.& Q.j.j.j.0 ,+- a+)+i G.:+u.N E = p+..:.b.:.b.:.b.:.;+;+;+b.;+*+Y Y ......p+p+a.a.a.= = s+s+A A A A A A A A s+s+s+s+s+s+~.x.s+s+>.a.E.% F f.t V d.m / 6.6.6.6.6.6.@+6.6.V 6.6.V m V J U J J k k k - k k - k - - - - X X k X k k - k k k k k k k X s.a+! #.i ++J.3+J.3+7.4 i 8+)+^.^.^.R.R.R.R.a+R.a+R.a+a+a+a+a+a+a+'+h+'+H H * H h+L.L.L.C.Y.Y.Y.Y.C.,.Y.Y.C.L.Y.L.L.- h+s.M.s.M.M.f '+a+a+a+! R.R.R.a+M.M.M.L.L.C.k k k k k X R w X f X s.X X X X s.- X X X - X X - X X X X - X - X X X X X X X X X X s.X X X X X s.X X X s.X - X s.X X - s.h+s.s.X s.X X X k - J J J J J - - - - - - - - - - - J J J J J J m P P P F+d+d+).$+).$+d+v d+d+d+d+F+F+[ P P U U U U J U J J J J J J m m m m m m m m / m / / 6., , , , / / m m d.d.m P e+[ o.o.y+o.w.o.o.o.o.o.o.o.o.o.y+o.o.o.j.D.j.j.O j.O j.D.|+]. .[.7 D+0.t+. . . . . . . . . . t+t+t+D+T.0+S S > 6+$.X G+]+]+}+E+s.- C.,.7+P F+P J * 8+F Y N = E E N f+Y ;+4 /.f.` 8+8+2.r+i A+++r+B.B.! .+f b z+*.$.Q.I.Q.t.L..+6 i.6 X.P.2 e.+.w.D.S S ", "l L L L j.w.j.j.j.O w.j.j.D.L L F.m+F.F.l l v w.& $.'.$.'.Q.& w.w.Q.& _ j 0 '.L.'+^.B.J.G.:+>.N = = ....:.:.4 4 :.:.:.:.4 :.:.:.:.:.;+;+;+b.Y Y ....p+a.N = s+s+s+A A A s+s+s+s+= s+= = s+s+s+= = >.N p+..F /.t V m P d./ / / m 6.6.6.6.v+6.6.V 6.J V J V J J U U k J J k - - z.- z.- X X z.X X 5 X X 5 X X X X X w s.f R.! r+i 7.3+J.J.3+4 r+8+^.8+R.! R.! R.3.a+a+S.a+3.M.f f 3.3.a+3.M.'+}+M.'+'+'+s.s.L.H s.L.L.Y.Y.Y.- Y.- L.- Y.X h+s.s.s.s.M.s.M.3.3.3.! ! S.! ! ! R.a+f s.M.X - k k k X k X X X w X f X s.s.E+E+X s.s.s.X X s.X X X X X X X X X X X s.X s.s.s.E+X w X f s.s.M.s.f E+s.f E+s.s.M.X * M.M.s.f s.s.M.s.s.s.w X X X k - - - - - - X X X X X X - - - J - J J J U m 7+P P F+d+$+d+).$+v ).d+d+d+v d+d+[ [ F+j j j U U U k J J J J m U U m m U d.m d.m m / / / d./ d./ / / / m P P F+[ [ [ 0 j.o.o.o.o.o.w.o.w.o.o.o.y+o.o.o.y+O j.x+x+<+x+D.x+|+].K.: [.|.q . . . . . . . . . . . . . t+t+t+D+T.0+0+> > C M }+.+@.}+s.#+9+C.w+7+P d+F+,.* R.r+b.E.N E E z u.*+:.4 f.` ` ` q.r+#.i ++7._.r+2.o ! H+E+X a 1+& Q.I.$.N.4+k+k+6 6 1 b a & <.O |+K.", " .l L L l L ].].L L x+L L L l l .m+m+l l L j.j _ _ $.$.j w.Q.& w.$._ C.,.9+H 4+)+++J.o+>.N E N N a...+ :./.4 2.2.4 r+/.2.q.2.C+4 4 :.:.:.;+;+b.....p+a.a.= s+s+s+~.s+s+s+s+s+= N = = N = = = = N u.E...F /.t m O.F+O.O.d.d./ 6.6.6.6.6.6.6.6.6.6.6.V m V J J V k J U k k k J - - - z.X - f X f f X f f f 5 f E+f E+3.3.R.! o i 7.7.F 4 i r+2.8+! R.R.! R.R.R.3.3.S.S.3.S.a+3.a+a+3.}+a+f a+}+S.3.f a+a+a+E+'+M.s.h+X h+h+- h+X - #+s.X M.s.M.M.M.f f M.a+S.! ! o ! o ! R.8+R.R.M.M.s.X - X X X X X b b X X f X f s.s.f s.s.f f f w f f f w E+X X E+X s.s.X X X f X s.X f f X f s.f f s.M.f f M.f f s.M.s.s.s.s.s.f f M.f M.s.s.s.X X s.- X X X X X M.X M.M.X M.X - - - J J J J J U U P P F+d+d+).$+).$+d+v v d+d+d+d+d+d+[ [ j j j U U '.U _ U U U U m P P P P P d.F+d.d.d.P / d./ d.m d.P d.P O.F+F+d+j.j.o.j.j.O O o.o.o.o.s O o.O D.o.O y+j.D.D.<+x+L L x+].].K. .[.7 D+0.. . . . . . . . . . . . . . t+t+t+0+0+0+S > w.e.E+G+@.B w L.C.,+w+7+e+d+d+7+h+R.o 3+*+u.>.>.a.:+Y 7./.q.` ` q.R.2.B.i ++i ++r+2.)+! H+P.R y._ t.Q.Q.t.n+4+k+k+k+6 1 P.M $.w.O |+K.", "l. .m+ .F.m+F.F.K.].l ].l l .m+F.m+F. .L j.w.k - X k _ 0 j w.0 $.y.s.H H 4+^.C+J.*+u.N E = N N p+Y b.:.4 C+r+f.2.2.C+q.q.q.q.q.q.q.2.4 :.:.b.b.b.....p+>.>.= = s+s+A s+s+s+a.= a.a.N = N N N u.p+:+Y :.f.* m F+v d+d+F+F+d.d.d./ 6.6.6.6.@+@+6.6.6.V V V V J J J J J J J k - k - - - - X X f X f f X f f f f f f 3.3.3.! ! o o o i r+r+o 8+! R.R.! R.! ! S.S.R.R.S.S.a+S.S.S.S.@.@.S.H+@.H+G+S.@.3.S.3.S.a+f M.s.s.M.s.s.M.X * s.M.s.M.M.f f f 3.3.a+3.3.R.3.! ! o 2.o o ! ! R.3.3.M.s.s.X w X X X s.E+E+s.X f s.s.M.s.E+f f s.f f f f f f f f M.f X f s.f s.s.X f s.s.X f f f f s.s.f f s.s.f s.f f f M.M.M.M.3.M.M.f M.s.M.s.f M.f s.s.M.X X M.f X f X M.f f M.X h+X - - J U U U ,.P P [ [ v d+v d+).d+d+d+[ d+[ d+[ d+d+F+[ F+j j j U U U j j j P P P P P F+F+F+P F+F+O.d.F+d.P d.F+d.F+F+F+[ j.j.j.j.<+x+x+D.<+D.O O O O D.s D.O y+D.<+O D.D.x+x+].].K. .l . .l.|.7 Q . . . . . . . . . . . . . . . t+t+t+t+0+0+S > w._ E+.+i.a+H.#+9+w+l+P e+v v e+C.a+)+#.n *+f+:+*+Y :.4 q.q.* t '+R.^.2.r+7.i r+B.#.i.)+@.E+b y. +& Q.Q. +N.B k+8.8.6 1 P.z+5++.O |+S ", "|.] l.[.] [.[.l.[. .l. .l.l.l.l.l. .F.l L j k @.! 3.- k '.j 0 j _ H R.'+^.C+J.G.f+z E s+s+= a.p+..;+;+:.:.4 2.q.q.C+2.q.q.h+H * B q.q.2.4 :.:.b.Y :+..p+a.N = s+x.s+s+= N a.N a.= N >.>.>.a.p+E...Y :.q.u+7+v $+$+$+).d+).O.d.d./ / 6.6.6.6.V @+@+6.V 6.V V V J J J J J J k J k - - X X X X f 5 f f f 5 f f f 3.@.@.S.3.! ! o 8+o o o 8+! o ! ! ! ! ! R.! ! G+S.! ! S.G+G+S.G+3.H+H+@.H+@.@.S.S.S.S.S.a+S.S.a+3.3.f M.M.s.M.s.s.s.f f E+M.3.M.3.3.a+3.R.S.! R.! o o o o o o ! 8+3.S.3.f 3.f f f f E+f X f s.s.f f f f M.M.f 3.f 3.f 3.3.3.f 3.f 3.3.f M.X f X X X f X M.s.s.s.f f f f M.f f f f f M.f f f 3.3.M.3.3.f f 3.f 3.f M.M.f f f f f f f f f f f f f f f f M.X - - k J U U U j P [ F+[ d+d+v v d+d+d+d+[ d+[ d+[ [ F+[ F+P j [ j j j j j j [ P d+F+d+F+d+F+d+).F+F+F+F+O.F+F+F+F+d+d+v v v v L L L |+L |+x+|+2+x+x+D.D.D.<+x+D.O y+D.<+x+x+].].]. . . .m+[.] B+d Q . . . . . . . . . . . . . . . . t+t+&+T.0+S |+w._ f ! i.2.4+s.L.,.l+l+[ d+d+[ J '+]+Z A+n 5.o+b+7.i 8+'+* g h+* ` R.2.B.C+_.r+2.2.i.! @.E+b R *.Q.& Q.t.#+B k+k+k+6 (.1 2 e.+.O |+K.", "} 7 d B+d 7 7 } 7 7 |.} [.] l.[.l.l. .L 0 _ f i F o 3.- J j /+9+H R.q.2.C+J.o+>.N x.x.= = p+p+:+*+*+;+:.:.7.4 2.2.C+2.q.* g H H * B q.f.C+:.b.Y ....p+p+a.>.= x.s+s+= = = a.N = N >.u.u.u.p+p+..;+4 ` V [ $+3 $+p $+$+$+d+).O.d.d./ 6.6.6.6.V @+@+@+v+V V 6.V V V J J J J U J k U k - - X - X X 5 f 5 3.f H+3.3.3.S.S.! 3.S.! ! ! ! o o 2.! ! ! ! R.! ! ! R.! ! S.S.! S.G+G+@.@.3.3.3.3.f H+H+H+@.@.S.! ! ! ! ! R.3.f 3.M.M.3.3.3.M.f 3.3.3.3.3.3.R.R.3.! R.! ! o o o o o o o ! ! ! R.S.S.f f 3.f f f f s.f f s.f f f 3.f 3.3.@.3.S.3.3.G+3.S.3.3.3.3.3.3.f f f M.f f X f f f f f f f f f M.f 3.f f 3.3.f f M.3.f 3.3.3.3.3.3.f f 3.f f M.f 3.3.f 3.3.f 3.f 3.f 3.f f f s.X - k J ,.U j j P [ F+d+d+d+d+d+v d+[ d+[ [ d+d+[ [ [ [ d+[ P j j j j j [ j [ [ [ d+d+v v d+).v ).$+).).d+).d+d+v v v $+3 3 L l ].].K.].K.].|+U.U.|+|+x+|+U.x+x+x+<+U.x+U.].].K. . .l.[.|.7 d 0.. . . . . . . . . . . . . . . . . t+t+t+&+0+~+].w.,+E+)+C+#.^.a+H C.,.l+[ j.j.[ +#+@.o G C+;+n J.i 2.R.'+g Y.g '+'+a+^.o r+B.B.o 2.! )+S.E+R a e. +Q.Q. +N..+k+8.8.6 X.P.z+e.& O x+S ", "7 7 d q 0.0.Q Q q q Q q q q } d } ] m+<+'.w G D E.F 8+'+Y.,.C.* a+2.C+J.G.f+z E x.x.s+N a.p+:+:+..;+;+J.:.7.C+C+C+4 2.q.B H H '+q.q.q.7.:.;+*+:+:+p+p+p+N = = x.= = N a.a.a.a.>.a.p+u.u.p+:+b.:./.* 7+d+3 3 3 3 $+$+$+).).F+).F+d.P / 6.6.6.6.6.v+6.v+6.V V V V V 6.V J J J J J - J - - X - X X X M.f f f E+f f 3.S.3.S.! 3.! ! R.! ! ! o R.! R.! ! ! R.! S.S.S.! @.! S.! @.@.@.H+H+5 f f H+H+f 1 @.S.! o ! ! ! ! ! 3.3.3.3.3.3.3.3.3.3.3.a+a+R.S.3.! S.! ! o o o r+#.o #.o o o ! ! ! 3.S.S.3.3.3.f f f f f f f f f f 3.3.@.3.G+G+G+! S.! ! ! ! 3.! 3.3.f 3.M.f s.f M.f f X f f X f f M.f f M.f f f 3.3.3.f 3.M.M.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.! 3.3.]+3.S.3.3.f f f f X X X k J J U U j j j [ [ [ [ d+[ j.d+[ [ [ d+[ d+[ [ [ [ j [ j P [ j [ [ [ [ d+d+v $+d+v $+$+$+d+$+$+$+v $+v v $+3 3 l ]. . . . . .m+ .g+K.K.K.K.r.x ].].K.].].].].].].].].]. . .: l.] ] d q Q . . . . . . . . . . . . . . . . . . t+D+D+: : |+w.J M.^.r+i C+^.a+L.C.w+F+d+j.0 $.R P.G+6 6 B.A+A+B.q.a+* Y.,.C.g '+'+R.)+o 2.2.)+2.^.^.S.P.b R 1+$.5+t./+N.B C+++8.k+6 ^ z+e.& 6+D.S ", "] 7 d 0.. . . . . . 0.. 0.0.Q q d l.l [ [+.+++9 u.*+4 R.* g * 4+2.7.;+o+u.N s+x.= = a.p+:+:+:+:+*+;+:.J.7.:.7.7.7.4 q.q.'+H B B q.C+7.J.*+*+:+p+a.>.N = = = s+= = a.a.N N N N >.u.>.u.:+:+b.:.f.h+O.v 3 3 p 3 $+p 3 ' $+v ).).F+F+d.d.m / 6.6.6.6.v+@+v+@+v+V 6.V m J 6.J J J J U J J J - - - X X - X X X f E+f f f f 3.3.S.3.3.! R.! R.! ! R.! R.R.3.S.3.@.@.S.@.G+@.G+@.@.@.3.H+f E+E+E+5 P.H+@.S.! ]+B.B.o o o R.3.R.3.S.S.3.S.S.S.S.3.S.R.S.S.S.3.R.! R.! ]+o G o _.#.#.#.o o ! ! ! ! 3.3.3.3.S.f 3.3.f s.f f f f f @.3.! 3.! ! ! ]+! ! ! ! ! ! ! 3.3.3.f f f f f f f f f f f X f f s.X f f M.f f f M.3.f 3.3.M.3.3.3.3.3.3.3.3.3.3.f ! 3.3.3.3.! ! 1 3.]+S.@.3.3.H+f f f X X X k k U U U j j j j [ [ [ d+[ [ d+d+[ d+[ d+d+[ [ [ j [ [ j [ j [ [ d+[ d+d+d+v v ).$+$+$+$+$+$+$+$+$+3 3 l l .m+l.l.[.[.|.[.[.: [.: : : . .: K.r.K.r.K.].l l r.]. .l . .m+l.7 d d 0.. . . . . . . . . . . . . . . . . . . 0.B+|.: L 0 R }+^.2.r+B.q.R.* g w+e+[ j.[ _ R b 1 ]+6 G+! 2.2.a+* L.Y.,.,.- h+'+a+^.2.2.^.2.! ^.@.a+}+z+y.*. +Q.Q.[+N.X.k+++W k+6 X.2 a +.o.> |+", " .l.[.q . . . . . . . . . . 0.0.q ] <+Q.b Z D -+= :+:.f.q.` q.i J.G.f+>.E E s+= a.a.:+:+:+:+p+:+;+:.7.:.J.J.J.J.:.r+q.q.q.B q.q.C+4 J.*+p+p+>.= = = = E s+x.= = a.N a.N a.>.N >.p+p+f+:+b.:.` V e+v 3 3 $+$+3 $+$+$+$+$+$+d+d+).F+F+d.m m m 6.V 6.@+V v+V v+V 6.V 6.V 6.V m m m J J J J - J V - - - - X h+- s.X f f 3.f 3.3.3.f 3.3.3.3.3.S.3.3.3.3.3.3.3.@.H+f H+@.3.1 3.5 f E+E+f b b X E+E+E+H+G+! ]+#._.#.o o o S.! 3.3.S.S.! ! R.! ! 3.R.3.S.S.@.3.! ! ! ! o #.#.o #.o o #.o ! ! R.R.! 3.3.3.3.3.f 3.3.f f f f 3.1 f 3.3.3.]+! o o o o ]+o ! 3.! 3.3.3.3.3.f f f f f f f f f f X f f s.M.X f M.X f f M.f f 3.f M.f 3.3.3.f 3.3.3.3.3.3.! ! ! G+3.3.]+3.G+3.G+@.@.3.1 f f E+X X - - k ,+J U U U j U j j [ [ w.d+d+[ j.[ [ F+[ [ F+j P [ j [ [ [ [ [ j.d+d+d+d+v $+v $+$+$+$+$+p p p l K F.F.: l.[.} 7 k.B+B+B+|.k.|.[.|.k.[.[.[.: : : .: . . .].l ].l K. .m+l.} d q 0.. . . . . . . . . . . . . . . . . 0.0.D+] .L [ X 3.^.q.f.2.2.R.'+g ,.P [ [ 0 _ z.z.5 1 G+G+P.E+M.s.g C.J J ,.Y.h+a+a+R.^.2.R.R.R.R.@.H.E+w z.*. +$.t.[+N.^.k+++8.6 6 (.!+a & +.|+|+", "j.L l ] q . . . . . . . . . . 0.Q : j.[+b k+9 { E >.*+:.f.2.:.*+:+N E E s+s+= a.p+:+:+:+:+p+..b.:.:.7.J.J.J.;+:.4 4 q.q.q.q.q.4 7.;+:+p+>.= E x.x.x.x.~.s+= = = N N = N N >.p+>.u.p+..;+4 ` ,.d+v 3 j.v L $+v v v $+v $+).v d+F+[ F+d.P d./ 6.6.6.6.v+6.v+v+v+v+v+V V m 6.m V V m m m m m J V J V J V - - X X s.X s.s.s.M.f f f f 3.f 3.3.f 3.f f 3.E+E+E+E+E+H+f 5 E+f E+E+f E+E+z.X z.X b X 5 H+@.]+i.o #.r+#.o ! R.3.3.S.S.3.3.3.S.3.3.S.3.R.3.3.3.3.3.3.! ! ]+G o _.#.G #.o o o R.3.3.3.3.3.3.3.3.3.3.f f f f f f f 3.3.! 3.! ]+]+o ]+o o o ! o o ! ! G+3.3.3.f f f f f E+f X f f f X f X M.X X M.s.X s.s.s.s.M.f M.f f f @.f 3.3.3.3.3.3.3.G+3.! G+3.]+3.3.3.3.@.3.@.H+f f E+f X k X k k k _ U U '.j j j j [ [ [ [ [ d+[ [ F+[ [ P [ j [ j [ [ [ [ [ [ j.d+v d+d+v $+$+$+3 p 3 3 3 K l l.l.l.7 d B+q Q Q D+Q 0.Q B+D+&+k.7 k.k.7 [.[.[.: : .l ].].L L ].K. . .@ ] d q Q 0.. . . . . . . . . . . . . . . 0.q 7 [.m+L j #+a+R.^.2.q.R.q.* g ,.7+[ [ j _ z.b P.P.1 G+1 w R J ,.,.,.w+k C.h+M.a+! R.! ^.R.a+R.a+}+b z+n+y. +Q.t.[+N.)+C+8.8.k+6 c+^ a & <.D.> ", "t.j y+l ] Q . . . . . . . . . . B+ .y+[+1 8.&.A s+a.Y :.:.;+*+>.E x.A ~.s+N p+....*+:+:+:+:+Y b.:.C+7.:.:.;+:.4 2.2.f.q.q.2.7.:.G.:+>.N E x.x.~.A A ~.s+s+= N = a.= N N >.>.>.>.p+:+;+/.'+,.e+v v v v v v j.v v j.d+d+v d+v d+d+F+[ F+d.P U / 6.V 6.v+v+v+u+v+v+v+V 6.6.6.m m m m m m m J m m m J J m J V - J g - X h+s.s.s.s.s.s.M.E+s.E+E+E+E+w E+E+w E+E+E+E+E+E+E+E+E+X X z.- R R y._ z.R E+E+S..+]+o 2.o #.o o R.R.3.3.S.S.S.3.S.S.3.S.3.3.3.3.3.3.S.3.R.! ! ]+o G o o o ]+! ! 3.3.3.3.3.3.3.f f f f f f f f f f f f f ! 3.]+o ]+o G G ]+o ! ! 3.! 3.3.3.@.3.3.3.@.f 3.f f f E+X f X X X X X X X X X - X X X X X s.M.f f f f 1 3.S.3.3.3.3.]+3.G+3.f G+3.G+3.3.1 3.3.f f f f E+f X X R k - k k k k k '.j j j j [ [ [ j [ j j j j j j j F+j F+[ [ [ [ d+[ d+v j.d+v v $+$+$+3 3 3 l {.F. .[.7 B+q Q t+t+. t+t+t+0.0.0.0.t+0.D+q D+d B+7 [.[.: .U.L x+<+<+L ].l l m+] ] d d d Q 0.. . . . . . . . . 0.0.Q q d } l.{.3 j h+4+2.! 2.8+a+` * u+,.m P P _ _ z.5 1 1 c+G+@.E+X J U U m ,.C.k L.M.a+a+^.R.^.! )+a+H+}+w R y.[+[+Q.t.p.B )+++b+8.k+; X.^ a T }.O S ", "4+w w+j. .B+0.. . . . . . . . . d l y+m.i.o+E ~.= a.Y b.*+u.E { A 8 A s+N a...*+Y :+..p+:+..;+;+:.7.7.J.:.:.:.4 :.4 q.C+2.:.:.G.:+>.= E x.x.{ A A A ~.s+= = = = = = = >.z >.u.p+:+;+f.* w+[ j.j.j.j.j.[ j.d+[ d+[ [ d+[ d+[ d+[ [ P P F+m m m m 6.V V V v+v+u+v+v+v+v+V V V 6.m V m m V m J m m m m 6.m J V J g g - - h+h+L.X L.X X #+X X w X #+#+X X R R R z.b b E+E+b b z.R R _ _ _ $._ $.R b E+H+! )+)+o 2.o o o ! 3.3.3.3.3.@.S.S.G+3.3.f 3.M.E+s.E+f 3.3.! ! o G ]+#.G ]+! ! R.3.3.M.M.3.M.f 3.f f f X M.X f f X f f 3.3.! o ]+]+o o G o o o ! ! 3.! 3.S.3.3.3.3.@.@.f f f f 5 f X X X X g - - - - - - - - X X s.X f X f f f f 3.f 3.1 3.3.f 3.f 3.3.3.3.f 3.3.3.3.1 3.E+f f f X E+X X X z.X k k _ k k k _ j j j j j [ P j j j j P j j j [ [ [ [ [ [ [ [ [ [ d+v v v v v 3 $+3 K l l m+l.] |.d q Q Q 0.t+0.t+. t+t+. . t+t+. 0.0.0.Q Q q 7 : l L O j.o.o.j.j.L l l {.m+@ ] } d d d q Q 0.Q Q q q d q d d d } ] l.{.3 [ g R.2.B.2.q.` '+* L.V ,.m U _ z.5 5 1 G+G+1 @.H+w k w+7+J C.X #+w E+a+a+S.a+R.R.^..+a+H.b n+*.y. + +Q.p.N.C+C+b+8.8.6 c+P.2 T +.O > ", "++B.H e+L l.q . . . . . . . . 0.7 U.e+#+C+:+= = a.p+..:+>.E ~.8 8 A A = a...Y *+*+:+:+p+....Y ;+;+;+:.7.7.7.7.:.7.4 C+4 7.J.*+:+>.N E s+x.~.~.~.~.s+s+= = = = = = = N N >.>.p+*+:.2.h+7+0 [ o.[ [ [ 0 [ 0 [ w.[ [ [ [ [ [ [ P [ P P j P j U U m V V V u+u+u+u+A.A.v+v+V V 6.V m m V m m m m m m m m m 6.m m V V V g - g g g X - 9+- m.R 9+R R m.9+R R R R R n+z.z.z.z.R X R R R y._ $.'.'. +_ X b H.B G+)+)+2.2.)+^.3.3.M.E+f f 3.f f f f f E+s.s.s.s.X f f }+S.S.! ]+]+]+o ! R.3.3.s.s.s.s.M.s.X X X M.X f f - X X X M.f f 3.3.]+o ]+G o ]+]+]+! R.! 3.3.3.3.f f f @.f f 3.f 5 M.X f f X X X - - - k - k k - - - - X - f X f X f 5 f f f f f 3.f 1 3.f 1 f 3.f f 5 f f f f f X f f X E+f X X X X z.X k z.k k k _ U U j j U j j j j j j j j j P j F+[ j [ [ [ [ [ [ [ j.v v $+3 3 3 K l m+: l.] 7 7 B+D+D+&+D+D+D+D+D+t+D+0.0.t+. . t+t+. . 0.B+l.r.j.o.Q.'.Q.Q.0 y+j.L L l {.m+l.l.] } } d d } d ] ] ] ] ] l.] ] @ m+K $+d+Y.R.2.C+r+2.8+'+* * Y.Y.V k J X E+f c+]+c+G+3.f M.- J ,.V h+s.M.3.a+! )+S.a+'+a+R.a+S.E+#+R *.1+$.Q.t.p.N.q.8.8.8.k+6 X.^ 2 e.+.O O ", ":+;+2.Y.y+ .7 . . . . . . . . 0.} l 0 H r+*+a.a.p+..p+N x.A 8 8 A A s+= p+..*+b.*+....:+:+..*+*+;+;+:.:.7.:.J.:.:.J.:.;+*+*+:+>.N = = x.~.~.A s+~.s+= = s+s+s+E E N N >.>.p+*+;+q.h+/+0 o.0 [ 0 0 j 0 Q.j j j j 0 j j [ j [ j j [ j j j P m U J J J V - u+M.t t t A.u+u+u+V V V V m V V 6.m 6.6./ 6.6.m 6.V m - V g g h+- - g - 9+k R 9+R [+y.[+y.y.y.m.R n+M n+R R n+z.M R y.y.[+_ _ $.t. +m.z+#+E+@..+X.)+i.)+! a+3.s.w f s.f E+f f f E+X s.w X X X s.w s.E+3.S.@.]+S.! S.R.3.M.M.h+X X X X - M.X M.- X - - M.- - - - - f 3.3.3.3.! o ]+]+]+o 3.3.3.3.3.f f f f f f 1 f f f f f f X z.f X - - - k J k J J J k - k X X X f X f X f X f f f f f f f f f f f f f 3.f f f f f f f X X f X X f f 5 X X z.X k k k k k U _ U U j _ U U U U U U j j P j j j [ P [ j j 0 [ [ d+j.j.v $+3 p l F.m+l.[.] 7 k.B+k.k.T.0+k.k.k.T.k.T.T.T.D+D+D+. t+. . . q l.].y+o.t. +,+/+U '.0 [ j.L L l {.F.l.l.l.] @ ] @ @ l.m+F.F.m+{.F.{.{.p $+d+,.* 8+4 i i q.8+* u+V g L.* M.f G+]+o G ]+G+H+f s.g V Y.g * a+a+S.i.)+i.i.R.'+a+'+a+a+H.R m.y.[+t. +t.[+4+2.++c.8.8.6 1 5 a e.+.6+> ", "u.:+i '+e+3 ] 0.. . . . . . . Q ] l e+'+f.;+Y ..:+>.E ~.A A A A A s+= a.p+p+..:+*+..:+:+:+:+:+*+b.*+;+J.;+J.;+;+;+*+*+:+:+>.N E x.x.s+x.A ~.~.s+s+x.x.s+x.= = = = z >.u.p+*+:.q.Y./+j '.Q.'.'.j j j '.'.'.'.'.'.'.'.j j U j j j j '.U j j U U U m J V - u+M.t 8+t t M.A.u+v+V u+V V J V V V m V V m 6.V V g v+g u+g g g - - C.C.,+,+*._ [+[+[+k ,+y.[+[+*.R y.y.y.y.y.y.M y.*.y. + + +t. + +y.z+w H.H+.+.+)+^.^.a+}+s.w #+w b f b E+5 E+f b X X X X - X #+X w f f }+S.S.S.3.f M.s.- - - - - - - - - - - - - - - - - - - - M.f 3.]+]+]+]+]+]+3.]+3.3.f s.X s.X f f f f f f f f f 5 f X X X X - k - J k k _ k J k - X X X E+X X f X f X M.M.f f M.f f f f f f f f M.M.X f X f f f f X f f X X f f f X f X z.X k k k U k k J J _ k J k k U J U U j j j j j j j j j 0 [ [ j.j.v 3 3 3 K l {.m+l.[.[.B+k.k.k.0+0+~+0+0+~+~+0+~+~+~+0+T.T.D+0.t+. . Q l.].o.Q._ y.z.9+,+/+U j [ j.j.L l 3 {.{.F.{.F.{.{.K l l ].].].l K l 3 p v d+m u+R./.4 4 f.8+` * u+u+* R.R.o #._.A+8._.o @.M.h+g g V h+* a+q.! B.#.#.6 )+R.R.R.a+a+H.#+R [+*.t.$. +p.B C+J.b+c.8.6 (.!+2 e.+.6+> ", "N :+:.H e+3 ] 0.. . . . . . 0.q l.3 7+* f.:.Y :+>.x.A A A ~.s+s+= = = N p+:+:+:+:+:+:+p+>.p+:+:+:+*+*+*+b.;+;+*+*+:+p+>.N N = = x.~.~.~.~.s+s+s+s+s+x.x.s+x.E N >.N u.:+G.i R.Y.'.'.$.$.'.'.'.'._ U '._ _ U '.U _ './+j '.'.j _ '.'.'._ j j '.U U J U u+M.3.` ! 8+8+t M.u+u+u+g u+g V g V V g V V V v+V g u+u+u+* M.g h+g Y.- k ,+,+[+ +[+[+[+[+[+[+[+*.*.[+*.y.[+[+[+y.*.*.*. +*. + +$. +y.y.#+w H.B a+.+@.B }+}+H #+X R z.X R E+X E+X X w X X 9+- 9+9+9+L.#+#+s.E+}+}+}+}+s.X - g J J J - J - J - J V - V J J J V J V - - X f f G+3.G+]+G+G+f 3.s.X X - X - - X X X - f f X X X X f X X X - - k k U _ J _ k k z.X 5 X 5 f X f f X X X - X X X f X M.f X f X f - X M.X M.X X - X X X X f f X f X 5 X X X z.- z.- k k U k k k k k k k k k k U U j j j j j j j j j 0 w.[ d+j.v $+3 K K m+l.l.7 7 |.|.[.0+0+S S S > S > S S : S ~+0+0+T.D+D+. 0.q l.].o.t.[+z+n+z+R k U '.'.[ w.d+j.L 3 3 K K K K 3 3 L L v L v O 3 v $+d+F+P U g '+8+4 i r+8+` t u+* ` 8+i 7.F n 5.*+n ++o a+M.- g g h+` 2.! B.#.C+++r+i.! S.S..+H+}+E+R y.[+ +t.t.p.B C+++b+b+j+k+c+1 a T +.O 6+", "a.b.f.H e+{.] Q . . . . 0.Q d ] K e+p.4+4 *+p+E x.A A ~.= = a.N N N N a.p+p+:+..:+p+u.N N N p+p+:+:+:+:+..*+*+:+u.>.= = = E x.~.A A A A s+s+x.s+x.s+x.x.x.= = N z >.:+b.4 * p./+$._ _ _ _ _ _ _ _ k _ U _ _ _ '._ U '.U '._ '._ U '.j '.'.'.'.$._ U k - M.3.8+o 8+8+8+A.M.M.g - u+g u+u+g u+g u+v+u+u+u+u+* * * * * M.g - - k 9+[+/+_ +[+*.1+1+*.*.[+[+*._ [+[+[+*.[+_ _ +_ 1+*. +_ y.*.y.y.m.#+H.H.B }+B H.w w m.#+m.n+z+b R b X b b X b k X R R 9+9+k 9+R #+w #+w s.s.s.s.- - - Y.J J J J J - J J J J - J - J J U J J - M.X f f ]+S.S.! f s.X - J - - - - - - - X X - X X f f X X f X X X - - k J ,+J k k X R X E+E+5 f X 5 X X X X X M.X - M.- M.X - f X X M.X X X M.X X M.- M.X - X X X X f f f X X z.X z.- k k k k - k X k X - k k k _ U U j U U '.'.'.'.'.j [ [ j.j.j.L 3 l {.m+l.] l.7 |.[.~+S S S > > > > > > > > > S S 0+0+&+D+0.Q q l.].y+'.m.#+w w w #+Y.J U U [ [ [ j.v v $+3 3 3 v v v j.j.j.j.j.j.j.v d+P U U g M.R.i i f.o ` * A.t 8+4 F ;+o+*+:+f+( b+4 2.` * u+* M.` 2.#.#.++++A+++#.^.q.R.^.@.H.w b M *.$. +t.p.N.C+J.b+b+++k+(.1 2 e.+.6+> ", "..:.q.,.$+F.} Q q Q 0.Q q 7 @ K d+,.'+C+;+f+-+x.~.A s+N a.....p+p+p+p+:+p+:+p+p+p+>.N = N N N p+p+p+p+:+:+*+:+p+N x.= x.x.~.A 8 8 8 A ~.~.x.s+x.x.x.x.s+E = N N >...:.f.h+,+_ _ _ _ k _ _ J k k J _ k J _ J k _ U /+U _ U '.U _ _ _ '.'.'.'.w.j 0 j U J X f ! o i 4 8+` u+u+u+- g - g - g g g * u+* A.` ` ` 3.` ` M.s.M.s.L.9+,+[+*. +*. +[+[+[+*.1+[+[+[+*. + +$. + +1+$. +$. + +[+1+1+*.y.n+n+z+n+b N.b N.b z+m.z+n+R z+R z+X R R b R X R R R 9+9+9+9+9+9+#+R #+#+b w s.s.#+#+k J J J J - k J J - - J J U J J J J J J J - - X f f f f 3.f f X - J U U U U J k J - - - - X - - X f X X E+X b X R k k J ,+J R X E+f E+f f 5 5 X X X - - - - X X - - - X - - M.- X X - - - - - - - - X X X f X f X X 5 f f X X X z.k - z.k k X z.- - z.- z.k U k _ U U '.'.j '.'.j j w.[ j.v j.3 3 K F.m+l.l.7 7 [.: 0+S > > > <.<.<.C <.<.<.6+> S S 0+T.&+Q 0.q l.].y+t.[+n+w H #+X - k J U U j j [ [ [ j.v j.v j.j.[ w.j [ j w.[ [ [ P U J J - h+M.` o 8+R.` A.* t f.4 b.*+:+>.u.u.u.o+7.r+R.* * * ` 8+2.i ++A+3+8.3+C+r+! S.! )+H.#+z+R [+1+Q.t.p.4+C+J.b+j+8.6 6 5 a T +.O O ", "4 q.V 7+p @ } d q q q d } @ 3 e+Y.q.4 G.>.E { A ~.s+a...Y Y b.b.Y :+:+:+..:+:+u.N E = = = = = >.>.>.>.p+p+p+u.N E s+x.s+~.{ 8 8 8 A A s+~.~.A ~.~.~.x.E = E >.p+:+:.q.H C. +_ k R k k k _ k k k k J k k k _ k _ _ J _ ,+,+_ '.'.'._ '.'.Q.Q.w.j w.j _ k f f ! o o i 8+3.M.X - M.- - u+X u+M.g M.` ` ` R.8+8+8+3.` 3.M.s.w X R [+ +*. +*.1+*.[+ +y.*.[+ +1+*.*. +t.t.5+t.t.$.'.t.$. + + +[+y.M M n+n+#+#+z+z+n+z+m.n+z+n+z+R n+z+z+n+R z+z+R m.R m.R y.9+m.9+9+R #+#+w H #+#+X X R J J J J J J k J k J - J J J U U J U J J - - X f f 5 E+E+- - J J U P j U U U J J - J - - - - - X - X X X X X X X k k k _ k R X 5 E+5 1 E+f f 5 X X - - - J - - - - - - - - - - - - X - - - - - X - X u+X X X M.f f X X X X z.X X z.X - X z.- X z.X z.X - k k k _ '.U '.j j '.'.0 j [ [ j.v L 3 L l l m+l.l.7 |.: : S > > 6+<.C C C C C C C C <.> > S 0+T.&+Q q l. .j.Q.,+m.w H H - L.C.J J U U U U j j j [ [ [ [ d+[ j j '.j j j j j P J J - - M.f 3.3.R.3.M.* * t /.:...>.N N N >.>.p+G.4 f.` ` * 8+8+2.i _.8.b+b+< C+i 2.)+.+! H+w n+n+[+$.5+t.p.B B.J.G.c.8.k+(.^ z+T +.6+> ", "* Y.e+p F.@ } } } } ] @ F.$+F+p.q.7.*+>.x.~.A s+= a...:.:.4 4 :.;+b...*+*+*+:+>.E s+= = = = = N N N N = N >.= = s+x.x.8 8 !.8 8 8 A A { A A A A { x.x.E N u.p+b.4 R.Y./+_ ,+k k k k R - X k k - - R k k k k J J k _ ,+_ ,+U k U '.'.'.Q.j [ w.j.w.w.'._ z.3.! o o o 8+` A.- - - u+- - X g M.` M.` R.o 8+o o o R.! a+M.E+#+9+[+_ *.[+1+ +[+ +[+y.[+1+*.*.y.1+_ + +Q.t.Q.Q.t.Q.t.Q.'. +_ [+y.y.n+n+z+n+n+n+n+b m.z+n+n+n+n+M n+n+n+n+R M n+R R m.R 9+[+R [+9+n+#+#+n+#+#+#+H L.C.9+k k k J k k J k U k U k J J J J U J J J - - - X X s.E+X X C.U U U j P U j U U J J k - J - - - k - X X f w X X k 9+k C.C.k X X E+E+f 5 1 5 f f X X k k k - J - - - - - - - - - - - - - - - - - - - X X M.M.X f X X X X X X X X X X X X X X X X X X X f z.z.z.k _ k _ _ '.j Q.j w.[ j.j.j.L v 3 3 l {. .l.] l.[.k.S S > > <.C C r C r C C r C C <.> > 0+0+T.q q |.F.<+e+t.9+p.#+L.9+Y.Y.J J J - - k k k U U P [ P j j j _ _ _ _ U j U U J J - X M.3.3.3.3.M.M.h+h+` /.+ ..N E x.x.`.a.:+*+:.r+q.` ` ` 2.o _.++J.b+b+++i 2.r+)+! .+.+P.z+a e.1+t.t.p.B C+J.b+b+8.6 c+1 2 5+<.O 6+", "7+).$+K m+@ @ ] ] ] m+K v ,.'+q.;+:+z x.A ~.s+a...b.:.:./.f.q.2.:.;+;+*+b.*+:+>.E = = = = = = = N E = s+= E s+x.x.A A 8 !.8 8 8 8 A 8 8 8 8 { A { x.E = >.:+;+i '+C.J _ k k k R R X k X X X X - X X - - - k R k k k k J k _ _ _ U _ j '.w.[ x+v j.w.j k R E+! o o ! R.M.X - - k - - - M.X M.3.! o o o o #.o o ! R.3.f b m.R *. + +*.*.1+*.e.y.[+[+*.*.1+_ 1+$.t.t.Q.Q.Q.Q.Q.Q.Q.Q. +$. + +[+M M n+m.z+n+n+n+z+m.n+n+M n+n+n+n+n+z.a n+n+n+M n+y.y.m.m.9+y.m.y.n+#+n+#+n+#+n+9+9+,+,+,+_ J k k _ k J k J k J J k U J J U J k k k z.k - R R k ,+w+l+7+P P P j J U k J J J J J J J - - X - X X w X R R k C.k R z.w E+5 @.f 1 5 5 X z.- - U J J k - J - - - J - - - J - - - J - - - - - X X X f X E+f E+E+X X X X - - k X X X z.X X X z.X X X X X z.k U U _ '.j j 0 [ [ [ j.v j.3 3 3 L l l F.: ] [.: : > > <.C C r C r r r r r C r <.> > 0+0+T.d d 7 l.l y+e+/+C.C.C.,.J m J J J - - - - X - - J U P U U U - X - X - J V J J - - X M.M.3.M.M.M.- u+h+` /.Y p+= ~.A A x.= p+..:.4 8+` ` 8+f.r+i ++3+< n A+_.o 2.o )+a+a+H.w n+*.e.Q.t.p.B )+8.b+8.8.k+c+P.2 e.<.O > ", "$+p K {.@ @ @ @ F.K p e+,.B C+;+p+E ~.A s+s+N p+..:.:.4 2.q.q.C+:.;+b.;+;+*+:+u.= = = N = = = = x.x.~.x.s+s+x.x.A 8 !.8 !.8 8 8 8 8 8 !.!.8 8 A ~.E = p+:+:.2.* 9+C.k k k R X X X #+X X w #+X s.s.s.X #+X X X X X X X R R k k k U _ '.'.[ j.j.O j.0 '.R E+3.S.! ! R.3.M.- k k J k k - h+M.R.R.o o #._._.#.r+#.]+@.a+H R m.[+_ *.*.[+[+*.*.[+*.*.y.*.e.y.1+ +$.t.t.t.0 0 0 Q.Q.Q.5+$.$. +[+*.y.M n+n+n+z+z+n+n+n+n+n+n+n+n+M a M M n+M n+M n+n+R 9+y.n+y.n+y.n+n+n+m.n+m.m.R R m.m.m.9+R y.k k k k k k k U k _ J k J k k k R k X X R R k 9+,+,+l+l+j j j j U U U U U J J J J - J k k - X X w X m.R m.9+9+k k X E+f @.1 1 1 f f X - - k J J J J J J V - J - J - J - J - k - k J - - X s.M.f f f E+X E+E+X X k - k - - - - - X X X X z.X X X z.k k z.k _ _ '.j [ j w.[ j.j.j.L $+v 3 v 3 L ].l . . .S > <.C C C r r r r r r r C r C 6+6+S : |.B+B+7 l.F.3 v e+l+l+w+l+7+7+m m J - - M.M.M.X - - J J V - X f f 3.3.3.M.M.- - M.- X M.3.3.3.X s.h+- h+t + Y p+s+A 8 !.1.x.>...:.+ f.` 8+8+r+i _.A+J.n b+< ++#.2.)+^.@.H.H.b z+M 1+t.t.p.B C+J.b+c.k+6 c+5 a 5++.O D.", "p K {.K {.{.{.K p $+7+H q.4 *+>.x.A A A = a.....b.:.:.:.4 q.2.7.:.:.:.;+;+*+:+>.>.N N = = = E x.~.A A ~.~.s+~.{ 8 !.!.!.!.8 8 8 !.8 8 8 !.8 8 x.x.= >.:+:.q.H 9+R R X X X w E+s.E+s.M.M.f 3.f M.M.M.s.s.w X w w E+w f E+E+X X R X k k _ Q.w.w.w.j.0 _ k X f a+a+R.R.M.h+- J J k - - s.M.3.! o _._.A+A+A+_._.o ]+H+w #+y.y.1+ + +1+*._ *.*.[+*.*.*.y.*.y.*. +1+$.Q.t.Q.Q.Q.Q.Q.Q.Q.Q. + +1+*.y.y.M n+M n+n+n+n+M n+n+M n+n+n+n+n+n+n+n+n+M M n+n+n+y.R *.y.y.y.m.n+n+n+n+n+n+y.y.[+R [+R [+y._ k _ _ _ R _ k k J _ _ J _ J k R R X m.R 9+9+,+,+w+U l+j U U '.J k J k k k J U J J - k - X X X #+X 9+R 9+9+m.X b E+E+@.@.@.1 5 f - k J U J J J - J - - J - J J J - J J - U J J J - - X X X E+f E+f X X X z.X k k k k k k k - - - z.- z.X - - - X k k _ _ '.j & w.[ [ [ v v $+L v j.j.j.L x+j.L |+].|+> 6+6+<.C r r r r r r r r r C C <.6+> ~+0+7 d d ] m+K 3 v d+d+[ [ F+P 7+m J V h+M.f f M.X - - J - u+3.8+o o o o ! ` ` M.M.- X X M.f 3.M.s.u+- * t /.Y a.E 8 8 !.!.{ = p+Y /.f.f.` f.r+i 7.A+< G.b+3+++r+o ! ^.S.}+w b m.*.1+t.t.m.B B.++G.8.8.X.1 !+a +.<.6+|+", "K K K K K K p $+e+,.'+q.J.o+N ~.A A s+= a.....Y ;+;+:.:.4 r+C+7.:.:.:.;+b.*+:+p+>.N N N N = x.{ { A A A A ~.8 8 !.!.8 8 !.8 8 !.8 8 8 !.A { ~.x.= u.*+7.^.s.X X X w X w E+s.f f f 3.}+3.3.3.3.3.f f f E+f E+E+f E+f 5 H+H+E+E+E+5 f z.k U j 0 0 w.0 /+k #+H.}+a+a+M.M.h+J k J k - s.f 3.! G _._.3+< 8.8._.k+i.S.H.z+y.*.[+[+*.1+[+1+1+[+*.*.*.*.*.y.M [+*.*.t.$. +Q.t.Q.t.Q.Q.Q.Q.$. + +*.*.y.M n+n+n+M n+n+n+n+M n+n+M M n+n+M n+n+n+n+z+n+M M n+n+y.y.n+n+R y.n+n+n+n+y.y.R 9+R y.m.y.R y.9+9+m.m.9+[+9+k ,+,+k k [+k k 9+9+m.m.R #+9+9+C.,+w+/+'.'.j '.U _ U k U U U _ U k J J k k - X m.X m.9+9+9+C.- R X 5 f 5 1 1 3.E+X - k J U U J J U J k J J V J - J - J J J J J J J - - X f E+E+f E+E+f X X X k k k U _ U k k k k J - - - k k k k k z.k U _ '.j j [ j.v v L v 3 3 $+v j.[ [ j.j.w.j.O O 6+6+C C C C r r r r r r r r r C <.> > S [.|.7 ] ] @ m+K p $+$+$+v v d+P m J g M.M.3.3.M.M.- - - u+M.R.o G F F 3+i o ! ` M.M.X - X f 3.3.3.M.* '+/.:.% a.s+A 8 !.8 { E p+b.+ f.` 8+2.r+i _.3+J.D b+A+i r+r+#.! a+}+b n+M *. +Q. +p.B C+8.b+c.8.6 c+5 T $.<.D.> ", "3 $+p 3 $+v F+,.g 4+4 ;+p+E { 8 A A s+a.....*+:+*+*+;+;+J.:.:.:.7.J.J.;+*+:+:+:+u.>.= E E x.x.A { A A A 8 8 !.!.!.!.!.8 !.8 8 8 8 8 A A A { = N p+b.4 R.#+X b b w E+E+f f f 3.3.a+a+S..+! ^.! S.S.S.3.f 3.f H+f 1 f 1 c+@.1 f 1 f 1 @.5 X _ _ '._ _ _ k X s.'+'+a+M.s.- k k k X X 3.S.o #._.8.< < (+< 8._.Z X.E+R M *. + + +[+1+[+*.*.[+*.*.y.*.M *.M *.*.*.[+ + + + +t.t.t.5+$. +5+t. +*.*.y.M M n+n+M n+n+n+z+n+n+n+n+M n+n+M n+n+n+n+n+n+n+y.a n+n+y.m.m.n+y.y.n+y.n+m.m.y.y.y.y.R y.m.y.*.M y.y.9+[+m.y.n+y.y.m.R [+9+[+m.R #+n+m.9+9+C.,+w+/+'.,+U _ J k U k k k J k U _ J J J k - #+X R R 9+9+R 9+- X X E+H+1 f E+f X X k U U U U U U J J J J J k J J J J J J J J U J U J - - X E+E+E+X X E+X - - k J k k U k U k k k k k k k k k k k U k k _ U '.j [ w.[ j.v 3 $+$+$+v j.[ j '.'.j Q.Q.w.w.w.C C C r r r r r r r r r r T C C 6+|+]. .l.[.@ l.l.m+F.{.K 3 p 3 $+d+P ,.- M.R.R.o ! 3.M.u+- M.M.` 8+i _.F 3+n F i o ! M.g - - - M.3.o R.o 8+f.:.Y ..a.s+A 8 8 A ~.E p+b.+ f.t t 8+i 4 7.3+< n b+8.#.8+o 2.i.@.}+H.b y.1+$.Q. +n+B B.++b+8.++X.1 !+e.& <.D.> ", "y+v y+d+e+,.Y.'+q.:.*+p+E ~.~.A A s+a.:+..:+..:+:+:+:+*+:.7.:.J.:.J.;+*+:+:+:+:+:+p+>.= x.x.A 8 8 8 8 8 !.!.!.!.!.!.8 !.!.8 8 8 A A A ~.x.x.N :+;+r+R.E+E+E+E+f f 3.3.H+S.@.a+3.S.! ]+o ]+]+]+o ! G+@.@.f 3.f 1 f 1 1 1 1 1 1 @.c+G+G+! f z.z.k k _ R X s.s.f }+M.'+X X - - s.X 3.! o G _.< n (+(+D < 8.B.^.H+#+R *._ *.*.*.1+[+1+*.*.*.*.*.*.*.M y.y.*.y.y.*.y.*. +$.$. + + +t. +[+1+*.y.*.M n+n+n+n+n+n+n+M n+y.n+n+M M n+n+z+n+n+M M n+n+n+n+n+y.y.y.y.M y.n+n+y.m.n+y.y.n+n+R m.y.m.y.m.n+n+y.R y.R M y.y.m.9+y.[+m.n+R m.n+m.n+n+p.9+[+,+,+/+,+/+,+_ _ _ _ k _ k k U k J ,+_ C.9+m.m.9+#+#+m.9+9+9+R R z.X 5 E+E+E+b X k J U U P U U U J J J J J J J J k U J U J U U U J J k z.X X b E+b X X X k k J k k U k k U _ _ k U k U J k k U k J _ _ U '.j j [ [ j.v v v 3 3 v v e+j _ _ _ $.e._ $.$.$.T T T r r r r r r r r r T r T & <.w.|+]. . .m+m+{.{.K K {.{.K K p d+P J g M.3.o o o 8+R.M.M.g ` 8+f.F 3+b.n b.3+3+o o ` M.- J J - R.R.r+C+C+4 :...p+= s+A 8 A ~.s+N p+;+/.f.t 8+f.i 7.7.J.b+n n 3+r+o 2.)+)+@.H.w z+y.*.t.Q.t.p.B B.8.c.8.W X.P.z+e.& 6+O |+", "[ e+7+,.p.'+q.7.G.f+N x.A s+s+s+s+= a.p+:+p+p+p+>.p+:+*+;+J.J.J.J.G.*+:+p+p+:+:+:+>.>.= x.~.A 8 8 !.!.!.!.!.!.!.!.!.!.!.8 8 8 8 ~.x.x.x.= p+..:.8+'+f f S.@.@.@.@.@.S.@.@.@.S.! ! ! o #._.#.G 6 o ! G+S.3.H+f E+5 f n.1 f 5 5 1 G+]+G o ]+f E+z.f X E+X E+f 3.}+}+M.M.#+s.E+3.S.S.o _.8.< D D 5.D < A+B.G+H.n+y.y.*.[+_ +_ 1+*.1+1+*.*.y.*.*.y.*.*.y.*.M y.y.[+*.*.*.e. + +1+ +1+*.*.*.M y.y.n+n+M n+M n+n+n+n+n+n+n+n+n+n+n+n+n+z+n+z+M n+n+n+n+n+n+n+m.n+n+n+n+n+y.n+n+n+n+y.y.R y.n+y.y.y.n+y.M M y.n+n+y.y.9+n+y.m.n+y.n+n+n+R n+n+9+m.y.m.[+,+[+9+[+k k _ ,+_ _ _ _ _ J k _ C.k k 9+9+9+9+9+9+9+9+9+X R b b E+E+X X R k U j U j U U U U J J J J J J U J J U U U U U U U J - k w E+E+f b X R - k k J k U k _ U k U U U k U k U _ J U k U U _ U j j j d+j.j.j.3 L 3 3 v [ j /+_ R R R z.z.e._ e.a T 2 r 2 2 2 2 2 2 z.2 a a T $.& I.w.y+<+3 U.3 3 l l K 3 l K 3 3 d+7+Y.M.R.! o o #.o 8+3.` * ` 4 F Y E.E.E.:+G.3+i o 3.h+Y.J J - 3.8+r+7.3+;+*+:+u.N E A A { = >...% :./.` A.t f.4 i 3+n G.*+b+3+++r+2.! ^..+P.b z+y.1+ +Q. +y.B )+J.b+b+8.(.1 z+e.I.6+|+|+", "w+C.L.'+q.7.;+:+>.E x.~.s+s+= a.a.N a.p+:+p+p+>.N a.:+*+b.b.;+;+;+*+:+u.p+p+:+:+p+p+N E ~.8 !.8 !.!.!.!.9.!.!.!.!.!.!.!.!.8 8 A x.E E >.p+*+F q.3.f 3.G+S.! ]+G+! ! ! S.R.S.! S.! o ]+o #._.G o ]+! 3.@.f f E+E+5 z.5 5 z.5 5 1 c+G G #.o ! 3.3.E+H+f @.S.S.S.a+a+}+M.M.f a+S.]+k+C+< n D D 5.D b+8.#.)+}+b R *.1+*.1+1+1+1+*.[+[+y.*.*.*.M *.M y.*.M M y.M *.M y.y.M y.y.y.*.*.y.y.y.M M n+M n+M n+M n+M n+M n+n+y.n+n+y.y.n+n+n+n+n+n+n+n+n+M n+n+n+n+n+n+y.n+n+n+n+n+z+n+n+n+n+M n+n+R n+n+y.y.n+n+n+y.y.y.n+y.y.n+y.m.n+y.n+n+n+9+m.M [+y.*.y.y.R _ m.[+[+R ,+k C.k k _ ,+/+C.[+9+,+y.m.[+9+[+9+9+[+9+R R X X b b w R k _ J P U P U U U U J J J U U J J J U J U J P U j U J k X X E+w E+w b X k J U U U U U J U k k U k U U k J U k U U U U _ j j [ w.[ [ v v v 3 $+$+v [ j C.#+X w w b z.5 z.z.z.z.z.5 2 5 5 5 5 5 5 5 5 z.z.M *.1+Q.0 y+y+v y+<+$+3 3 3 K 3 p v F+m - M.3.8+o _.F i o o 3.` /.4 Y E.>.N = = u.*+3+2.a+- J U 7+g R.2.i 7.J.*+*+:+>.N s+x.A A E p+..:./.f.t A.t 8+i 7.7.J.n D n 3+4 o o ! ^.a+E+w z+y.1+Q.Q.t.p.B C+8.G.c.8.6 1 z.e.I.O |+|+", "L.'+q.i J.*+>.E ~.A A s+= a...p+p+p+p+..:+p+p+N N N p+:+*+*+;+;+b.*+p+>.N N p+p+p+p+N { { 8 !.!.!.!.!.9.9.9.9.9.9.!.!.!.8 8 ~.~.E = >.:+;+4 R.'+S.G+! ! ]+! ! ! ! R.! S.3.3.R.S.! ]+]+G G _.G G ]+]+@.f f E+X z.X z._ _ T z.z.f c+G _.#.G o o ]+]+]+]+]+o 6 G ! ! S.3.3.! ! #.i 8.3+(+D >+o+5.G.3+#..+E+R y.[+*.1+*.*.[+ + +*.*.1+*.*.*.*.y.*.M y.y.M M M M M y.M M *.[+y.y.y.*.y.M M *.y.n+*.M n+y.p.M y.m.M M n+M n+n+n+n+y.n+M n+n+n+n+n+n+n+m.n+n+n+n+n+n+n+n+n+n+n+n+n+a n+n+n+M n+n+n+y.n+y.y.y.n+n+m.y.n+n+m.y.y.m.n+n+y.n+M y.n+n+y.n+y.y.y.y.y.y.y.[+y.y.*.,+,+y.[+y.[+_ ,+[+9+[+m.y.9+,+[+9+9+9+#+R z+z+X X X R k ,+J j U j U U U U J J J J U U U J U U U P U U U U k - X w E+w E+X R k k J j j U U U U U k U _ U k U U k U U k U U U j j j j d+d+d+j.v $+3 3 $+d+[ l+k b E+E+P.1 P.P.5 5 5 5 5 E+^ 5 c+1 1 5 1 5 1 P.P.b R n+*./+/+e+e+e+y+y+$+<+3 3 3 p v [ J - M.8+o i o 4 4 f.o 8+8+/.b...N s+~.{ x.E u.*+4 q.'+,.w+7+Y.R.i :.;+*+*+u.u.u.>.N = s+~.x.p+Y + /.` t A.t f./.7.7.;+;+o+G.A+i r+2.! a+}+s.b n+y.[+Q.Q.Q.p.4+C+b+b+b+8.X.1 a 5++.O |+> ", "q.r+J.*+u.N x.A 8 A s+s+a.a...*+..:+....:+:+p+>.a.:+..:+..b.;+;+G.o+u.N = N a.a.p+>.E A !.!.!.!.!.9.!.9.!.!.9.!.!.!.!.!.8 8 x.x.= p+..:.8+a+f S.! ! ]+o o ! o ! ! ! R.! S.R.S.R.! ]+o G W W G ]+]+1 f f z.X k k '.& w.w.w.$.z.5 G+o o #.#._._.i G G _._._._.G o o ! ! ! B.#._.< n D 5.>+o+o+D 3+#..+E+#+9+[+[+ +[+[+_ [+*.y.e.*.*.*.*.*.*.*.[+y.*.*.y.y.y.M M *.y.*.M n+[+y.y.y.M y.y.n+y.y.M m.y.M M m.M M n+n+n+n+y.n+n+y.n+M z+n+n+n+n+M n+M n+n+n+z+n+z+n+z+z+n+z+n+n+n+z+z+n+n+z+n+n+n+m.n+n+m.m.n+m.y.m.n+m.n+M n+y.y.y.n+n+m.n+n+n+y.y.n+y.m.n+y.R y.R y.[+y.y.y.[+[+y.[+y.*.m.[+9+y.[+y.[+9+/+m.,+y.R w w w n+m.9+k k U U j U _ J J J U U J U k J U U U U U U U U U J k R X w X b b z.X k U U U U j j U k U U U U U k U U _ U J U U U U U j j [ [ j.j.L v v $+v $+v P w+9+w a+@.@.G+G+G+H+H+E+E+5 1 1 c+1 c+c+G+c+G+1 G+H+H+P.z+n+m.p.p./+t.e+d+y+y+$+3 3 3 d+P U M.M.! 8+4 f.o 8+f.8+8+/.+ % E.= ~.A 8 8 x.E :+J.r+'+C.7+7+g 8+4 *+*+:+N >.>.>.p+u.a.N = = p+;+:.f.` u+u+t 8+i F 3+n G.G.D 3+#.2.^.^..+N.#+#+M *. +5+I.t.p.4+C+J.c.j+8.6 P.z.$.I.O |+K.", "7.;+:+>.x.{ 8 A A s+s+a.p+Y b.b.Y Y Y *+..p+a.>.p+b.b.*+b.:.:.:.;+:+>.= = = = = = = { 8 !.!.!.9.!.9.!.9.9.!.9.9.9.!.!.8 { { E N p+b.4 R.'+3.a+! ]+o o o o ! o ! ! ! R.3.3.3.3.3.S.]+6 G W W G ]+! 3.f f X k '.& w.O L x+O w._ k E+3.^.]+#._._.7._._.W _._._._.G _.r+#.#._.3+< n 5.>+>+>+5.n 8.B.^.E+n+y.y.y.[+1+1+1+1+*. +*.*.y.*.*.*.y.[+y.[+y.M M M a M y.M M M M y.n+y.y.y.y.M M M y.y.n+M y.n+y.y.y.y.M M M n+n+y.m.n+n+m.n+M n+M n+z+n+n+n+n+n+z+z+z+n+z+z+z+z+b z+n+z+z+z+z+n+z+n+n+z+n+n+y.y.y.n+n+n+y.n+y.n+m.n+n+n+m.y.n+n+n+n+n+y.n+n+M y.n+y.n+y.m.y.y.m.y.m.m.[+m.[+*.*.y.*.[+m.,+9+[+[+[+[+9+m.m.R #+w w R [+,+[+,+,+'.'._ _ J k U U J J _ U k U U U U j U U U U k X R b X b w z.R k ,+U j U U U j U U k U U U U U J J U k J J U U U P j [ [ d+d+v v $+3 v v [ e+w+9+w }+@.G+G+G+G+@.G+1 @.@.@.G+G+G+G+6 X.Z Z X.X.X..+.+B N.H p.p.p.p.t.0 e+y+$+$+$+$+d+j Y.M.` o f.F o /.o 8+t 8+8+F % a.= ~.A 8 8 8 E >.G.4 * h+w+7+g f.;+:+>.= E x.x.`.p+:+..........b./.f.t v+u+t f.4 :.;+n *+*+G.J.++o 2.R.! E+n+m.9+[+t.Q.I.Q.p.B C+G.G.c.++6 ^ !+& I.O |+S ", ":+u.N x.A A 8 A A = a.p+..Y b.b.;+*+b.b.*+>.p+..;+:.;+b.:.4 C+7.G.:+N E = = = s+E ~.8 !.!.9.!.9.9.9.9.9.9.9.!.!.!.!.!.8 ~.x.N :+;+/.a+'+3.S.! ! o o ! o o o ! ! ! ! R.R.3.3.R.S.! ! G _.W _.G ]+@.@.f X k _ '.[ j.x+].l l j.[ /+R w 3.! o _.i _._._.W 8.< < W 8._._.A+_.3+b+G.>+>+>+>+5.G.A+r+@.w R y.1+[+[+*.[+1+y.[+*.y.y.*.*.*.*.*.*.[+y.y.y.y.y.M y.n+M n+y.M M M M M *.M y.M y.M n+n+y.y.y.y.m.M y.n+y.n+n+M M n+n+y.n+n+n+n+n+n+n+n+M n+n+n+z+n+z+z+z+z+z+z+z+#+z+z+z+z+z+z+z+z+n+z+n+n+n+n+n+n+n+y.n+m.n+m.y.n+n+n+n+n+n+z+z+n+M n+n+M n+n+n+n+n+y.y.y.y.y.y.*.*.*.y.[+y.y.y.[+y.y.[+[+[+y.y.[+y.[+y.m.m.n+9+p.9+p.,+,+/+/+_ _ U J _ U k k _ _ U k U _ J '.U U U U U C.k k X b z.X z+R J _ '.P P j j U U U U U J U U k U U J U U U U U U j j j [ [ d+v d+v v v $+v d+j /+C.#+E+@.S.G+G+]+@.@.S.@.G+G+G+i.Z Z i.k+i.i.i.i.i.)+^..+@.B 4+4+N.#+p./+e+y+y+v $+$+[ m - M.! o F _.F 4 8+8+` 8+/.+ % a.s+A A 8 8 A E >.b.4 R.g 7+w+g 2.;+u.E x.A { { x.N p+Y + + + /./.f.* u+V g t 8+/.3+:.n *+D *+3+7.r+2.R.a+}+#+m.y.t.Q.0 0 0 w+4+C+J.c.c.8.6 P.z.e.6+O |+|+", "N x.x.A A 8 A A s+a.a.....b.:.b.b.b.:.*+*+p+p+:.i J.;+;+4 q.C+7.o+>.= x.s+x.~.~.A 8 !.!.!.9.9.!.9.9.9.9.!.9.9.!.!.8 { ~.= u...:.q.a+M.3.! ! o o o o o o o o o ! ! ! ! R.3.3.S.! ! ]+_._.8.G ]+]+]+S.S.f X k _ & w.O L x+L x+[ '.k #+a+! B.r+_.i #._.< 8.< 3+A+3+8.3+3+< n D 5.( f+( o+n A+B.@.w m.y.y.*.*._ 1+[+[+*.[+*.*._ y.y.y.*.*.[+*.y.y.*.y.n+M a M M M n+M M M M M y.n+M M y.M M y.p.y.y.y.m.y.m.M M M n+n+M M n+M M n+M M n+M n+n+M n+n+M n+n+z+z+z+b b H.!+b z+z+z+b b z+z+z+z+z+z+z+z+n+n+n+m.n+n+m.n+n+n+n+n+n+n+n+n+n+z+n+n+n+z+n+n+n+n+m.n+n+y.y.m.y.n+y.y.n+n+y.y.y.9+,+y.[+y.y.[+[+[+[+y.,+[+m.R y.m.y.[+9+[+[+[+/+_ _ _ k _ _ _ J _ _ _ _ J _ U _ './+/+,+,+C.R R X X #+z+#+R k w+U j j U j U U U U U U U U U U U k U U J U U P U P P F+[ [ v d+v v v v v [ e+U k R E+}+a+@.@.@.}+H+H+@..+.+)+i.i.Z i.B.6 B.B.)+B.)+2.^.^..+4+4+4+N.m.[+/+e+v j.v v P U g 3.8+o F F F _./.8+8+8++ b...a.s+A A A A s+N p+b.4 '+Y.d.,.* f.b.p+E { 8 !.!.{ E p+Y 4 f.t $ v+v+6.6.,.6.u+f.4 :.3+;+G.*+G.J.i r+o ! a+H.b R y. +t.Q.0 Q.p.'+C+G.G.c.8.k+P.z+$.}.O |+S ", "x.s+~.A A A s+s+= a.p+p+....:.:.b.:.:.;+:+p+Y 4 q.C+:.:.2.q.2.J.:+p+= E x.A 8 8 8 !.!.!.9.9.!.9.9.9.9.9.9.!.!.!.!.{ x.= u.Y 4 R.M.E+3.! ! o ! o 2.o o o o o o o 8+! ! ! R.! ! ! ]+o _._._.G G ]+]+]+G+3.f X _ '.j w.w.j.w.j.0 ,+k E+a+! o r+r+o _.A+8.< < < 8.8.< 3+b+n 5.o+( ( ( >+(+++B.@.w n+y.y.*.*.[+*.*.y.1+_ *.*.*.*.*.*.*.y.y.y.y.*.y.y.*.*.y.y.n+y.M M M M M y.M M M M M n+y.M y.y.y.p.n+y.M M n+n+n+M M n+n+n+n+n+M n+n+M m.M n+m.n+M z+n+z+z+z+N.z+z+z+b b b b b z+z+z+b b z+z+z+b n+b n+n+b R n+n+n+m.n+m.n+m.z+z+N.z+z+z+z+z+z+n+n+n+M M y.n+n+M M n+y.n+n+y.y.[+y.y.y.y.y.y.y.*.y.m.y.y.y.m.m.[+[+y.y.[+m.[+y.[+,+y.,+[+[+_ J _ _ _ _ _ _ _ _ _ _ _ U _ ,+/+,+,+C.9+#+#+R #+R 9+,+,+U U j j j '.U k U J U U U J U U k U U U U U j P j [ [ [ [ [ j.d+[ [ j.[ d+e+l+,+9+#+E+S.@.}+}+f }+N.H.a+)+i.i.B.B.C+i.B.)+)+B.q.B.B.B.i.2.2.2.4+B H p./+e+y+v v d+P J - 3.o o _.3+F F F 4 /./.F % a.= A A 8 8 ~.s+a...:.f.* ,.7+,.* f.:.:+= ~.{ 8 8 8 E p+..+ f.t g 6.,.m m m 6.A.` f.F :.n n *+G.3+++2.2.2.@.'+#+R [+[+Q.Q.}.e+p.B C+G.D c.8.6 P.a & w.D.|+].", "s+s+s+s+A A s+s+a.a.p+p+..Y b.b.b.:.:.*+:+p+b.4 2.:.J.:.2.q.C+J.*+p+N x.{ 8 !.!.!.!.!.!.!.9.9.9.9.!.!.9.9.!.!.8 A x.= :+;+2.'+'+3.3.! o o o o ! 8+o ! o o o o o o ]+o ]+! ! ! o o G _.G _._.G G ]+]+]+]+S.3.X z.U _ w.[ j j '.k X E+a+^.o o r+o _._.< < 8.< 3+< < n n o+:+>+( >+o+n A+)+a+H m.R *.*.*.[+*.[+_ *.e.1+*.y.y.*.*.y.*.*.y.M y.*.M M y.y.M M n+y.M M M M M y.M M m.M M M n+M y.m.M *.M n+n+M a M n+n+M a M n+M n+M M n+M m.M M M n+p.n+n+n+n+n+b z+b b b #+z+z+b b b z+z+b b b z+b z+b #+z+z+b z+z+z+n+n+z+z+#+b n+z+z+z+z+z+z+z+z+z+z+n+n+n+n+m.n+y.n+n+y.m.y.n+m.y.y.y.y.y.y.y.y.*.y.[+y.[+y.m.y.[+y.y.y.y.y.m.*.y.y.y.[+[+,+[+9+y._ ,+y._ *.y._ ,+[+[+ +_ /+,+[+9+9+m.w #+#+n+m.,+_ l+U j U '.U j U _ U U k U _ U _ U U U U U U j j P [ [ [ [ [ [ j.[ [ j.j.[ [ j U C.X w w E+w b X X s.H.a+.+)+B.)+B.2.)+2.)+^.^.^.^.^.2.B.)+2.2.^.4+H 9+/+l+[ v v [ U J M.M.8+4 _.F _.F 4 F F b.% a.= s+A 8 8 8 8 x.>.b.i ` g 7+F+d.'+2.;+:+N ~.{ { ~.x.= u.*+:.q.A.,.6.,.O.d.7+m * ` 4 7.;+;+*+G.*+3+i r+2.^.S.}+#+R *. +Q.Q.I.Q.,+4+C+J.G.c.8.6 P.a $.<.D.S |+", "= = = s+s+s+s+a.N = = a.p+Y Y b.;+:.;+*+p+..;+4 :.7.:.:.:.C+i ;+..p+E ~.8 !.!.!.!.9.9.9.9.9.9.9.9.9.9.!.!.!.8 A x.N :+:.q.'+f f S.! ! ! ! ]+! o ! R.o ! o o o _.o _.#._.#.o o o o o o ]+G W G G G ]+G G G ]+3.X z.k z._ _ _ k k s.3.3.! o o o o _.A+< < 3+8.< n n 5.>+>+( f+>+o+G.++)+a+n+R y.*.y.y.1+ +*.1+*.[+*.*.[+_ *.*.*.*.e.M *.*.*.M M y.y.M M M M M y.y.y.M p.M y.y.M M *.n+M M n+y.y.y.n+m.a n+z+n+M n+n+n+n+M n+M M n+M m.M n+n+n+n+M n+n+n+n+N.z+z+z+z+n+z+z+z+n+z+z+b b b z+b b b b b z+z+b z+#+b b z+b n+b z+z+N.b z+z+#+N.b n+b z+n+b z+n+z+n+n+n+n+M n+M n+n+M y.n+y.n+y.y.y.*.M y.y.[+n+*.[+y.m.[+m.y.[+y.y.y.y.y.*.m.[+y.[+[+[+y.[+[+y.[+[+[+[+y.[+[+ +[+[+,+9+9+m.#+z+z+n+9+[+,+U j j '._ _ _ _ k U _ U _ U U U U U U U U U j j P P [ [ [ [ w.[ [ w.0 [ [ [ e+'.,+9+X b R R R ,+,+9+L.E+a+S.)+)+^.)+q.4+4+4+4+4+4+^.4+^.^.^.^.a+}+h+p./+e+[ d+d+F+U - M.3.o o 4 F o /./.+ b.Y E.a.A A 8 !.9.9.8 ~.N *+4 q.g 7+d+m * /.;+:+N x.8 8 x.= a...b./.q.u+6./ 7+d.7+d.m u+` f.F ;+n G.*+n :.4 r+o 2.)+}+w R y.$.Q.0 }.0 [+B C+G.G.b+8.6 1 z.5+I.D.|+S ", "a.a.a.s+s+s+a.N = s+s+= a.....*+..Y :+:+p+:+b.:.;+;+;+:.:.:.:.;+:+>.x.8 !.9.9.9.!.9.!.9.9.!.9.9.9.!.!.!.!.8 ~.E >.*+4 a+w w f @.G+! 2.! o ! ! ! ! ! R.R.! o _._.3+3+3+3+_._.o o ]+o G G G G G ]+]+]+]+G W _.o 3.3.f X z.X X f X f 3.a+! 2.8+o o o #.r+i 3+A+3+D 5.*+( ( f+( o+b+++i.H.w y.y.y.[+*._ [+y.[+*.*.1+*.*.*.*.*.*.y.y.*.*.y.M e.*.M *.y.M y.M M M M y.m.M n+M n+M M n+M M M y.M n+y.y.y.n+M M z+z+a M n+M n+M n+z+M n+M n+M M M a n+M m.n+n+n+n+m.n+n+z+z+z+z+z+m.b z+b N.z+z+b b b n+z+b z+z+z+b n+#+n+b z+n+b z+z+z+N.z+b n+b N.n+b z+n+#+z+n+n+z+n+n+n+z+n+M n+n+M y.y.y.y.y.y.y.M y.y.y.y.y.y.y.y.*.y.m.y.*.y.[+*.y.*.y.m.y.y.y.[+y.*.[+[+[+[+y.[+*.*.y.*.[+y./+[+9+9+9+m.m.y.9+[+/+t._ _ '._ U U _ U U _ U _ U _ _ U k _ j U j U j [ j [ [ [ [ [ 0 [ [ w.[ j.[ [ j '.,+k R y._ [+/+'.k 9+#+s.}+4+S.4+a+4+a+H '+h+'+s.}+'+B a+a+'+B w L.C.t.[ j.[ v F+U J M.3.o o F 4 /.F _.F % E.a.s+A A !.!.9.9.!.8 = :+7.q.Y.7+d+d.'+2.;+p+E x.{ !.-.E p+*+:./.q.V ,.7+O.F+F+7+/ * q.2.7.;+n *+*+G.7.r+f.B.^.S.H+w R y. +Q.Q.0 Q.p.B 2.b+G.b+8.6 1 z+& s O |+].", "..a.N = s+= a.= = s+s+= a.:+:+p+p+p+p+>.a.p+:+*+*+:+*+*+;+;+G.:+u.E 8 !.9.!.!.9.9.9.9.9.9.9.9.!.9.9.!.!.8 A E a.b.4 }+#+X E+@.S.! ! R.! S.a+a+3.R.3.R.! o o _.< < < < < < < _.G o ]+]+]+6 G ]+S.n.6 G W _.3+G o G+G+S.@.@.f f S.S.3.! S.R.! ! ! o o o #._.3+n 5.o+( f+f+( o+b+++! E+#+y.y.[+[+*.1+y.1+[+*.*.1+y.*.*.*.y.M *.*.*.y.y.*.*.y.*.*.M *.n+M M y.M n+M M M *.M M M n+M M M y.y.m.y.n+m.m.n+n+n+M a z+n+M !+n+p.n+y.M M n+M p.n+n+n+n+m.y.y.M M n+n+z+z+z+z+n+n+n+n+n+z+z+z+H.b N.b b b b z+b b b z+b z+z+z+z+N.b b b b z+z+b b b b H.N.b b z+z+z+z+z+z+z+z+n+n+n+n+y.n+n+n+m.n+M n+M y.y.y.*.y.y.y.y.y.n+y.y.*.m.y.y.y.y.y.[+y.y.*.y.y.*.*.*.*.e.y.y.[+[+*.[+[+y.*.*.[+y.y.[+9+[+,+/+[+/+/+t.$.'.'.$._ '.'._ '._ j '._ _ j _ U U '.j j j j j P w.j w.j Q.0 w.0 j.0 [ [ [ j '._ _ _ _ '.Q.Q.t.9+m.#+#+}+}+}+'+s.L.Y.C.9+C.C.9+#+L.H H s.H #+C./+l+d+d+v d+P J u+M.8+o /._.F i f.F F Y a.= s+8 8 !.9.!.!.!.{ N *+:.q.,.7+v F+g q.;+:+= A !.!.u { = p+Y /.q.v+m d.e+F+F+O.7+V ` f.i 3+;+G.G.G.A+r+r+2.2.a+H.H.M y. +Q.Q.I.0 p.B C+J.c.b+8.6 P.a & w.D.|+S ", "..p+= s+s+= a.N E s+~.= N a.>.= = = = N N p+p+:+>.>.p+p+:+p+p+N E { 8 !.9.9.9.9.9.9.!.9.9.9.9.9.!.!.!.A ~.= p+:.q.h+R X E+f S.3.S.S.S.R.S.S.3.3.f f f 3.! o G 8.5.(+(+< < W _.o o ! @.G+]+1 5 X 5 c+G W < 3+_.o o o ]+]+! G+]+! ]+! R.! R.! R.! o 8+i 7.3+< *+o+>+( ( o+D J.#..+H.n+y.[+*.*. +[+1+[+*.1+e.y.*.*.*.*.*.*.M *.M *.*.*.*.y.[+y.*.y.*.M n+M y.M M y.*.M y.m.n+y.n+y.p.a y.y.n+y.y.m.M n+M n+n+n+M n+M n+n+n+n+n+n+y.n+M M M M M M n+M n+m.M n+n+n+n+n+n+n+n+z+n+n+z+b b b !+b b b b N.z+z+z+n+z+z+z+b #+z+z+z+b z+H.b z+N.z+z+z+z+b z+z+b z+z+z+z+z+n+n+z+z+z+z+n+n+n+n+M n+M n+y.M n+n+y.n+y.y.n+y.y.y.y.y.y.n+y.y.y.y.y.[+*.y.[+y.*.*.[+y.1+*.y.y.[+[+[+[+ +[+[+[+/+p.[+9+y.*.[+1+ +[+/+[+1+_ $._ _ '._ '._ _ '.U _ '.'.'.U _ '.j '.j 0 j [ j 0 '.Q.j 0 j w.o.j.0 [ j 0 /+ +$.t.Q.0 j.0 '.[+R #+H s.w H L.9+,.w+w+w+w+,+C.9+9+9+9+9+C.,+l+e+d+v d+d+P J M.3.o /.F F F F /.F Y E.a.= A 8 !.9.9.!.8 8 s+N *+/.` ,.O.v 7+g ` ;+p+E A !.!.9.!.x.= p+:.f.* g 7+F+F+F+7+7+V '+2.i J.;+G.*+;+7.r+2.2.#.@.H.w n+y. +Q.Q.0 Q.,+B C+G.G.c.k+X.!+M & <.e |+S ", "..a.N = N N a.N = s+= = = = = E = s+x.x.x.= >.u.N = E N = E x.x.8 8 !.!.!.!.9.9.9.9.9.9.9.9.9.9.!.!.8 ~.N :+4 '+C.9+X w f 3.a+3.3.3.3.3.a+a+M.f M.M.M.3.R.]+_.< 5.( (+< < _._.]+! @.f 5 z._ T _ z.5 ]+_.7._._._._.o o o ]+G o G o o o ! o ! ! o o r+_.3+b+n 5.( f+( o+5.3+#.4+w R *._ *.*.*.M *.*.*.[+[+*._ *.y.*.*.*.y.*.*.*.y.y.*.*.*.y.*.y.y.y.y.M y.M *.M y.y.M y.M y.y.M M M M M M y.M m.y.n+M z+n+n+M z+n+z+n+z+p.n+n+n+n+M n+n+n+n+y.M M n+m.M n+M M n+y.M n+n+n+n+n+n+n+#+n+b b b b b b z+b b b b z+z+n+n+z+b b b P.z+z+z+b b #+b b b b b b z+N.b #+n+#+z+z+n+z+n+n+n+n+n+a n+M n+M n+n+*.y.n+m.n+n+y.n+n+m.p.y.n+M n+m.y.y.*.m.y.*.*.*.[+[+[+*.y.[+*.*.[+y.*.*.y.y.[+[+[+[+[+*.[+*.1+[+[+ + + + +t.'.'.$.$.'.$.'.'._ '.$.$.'._ '.'.'.'.j 0 '.0 j Q.'.Q.'.Q.j 0 0 0 [ j.o.[ 0 [ '.0 w.w.o.j.j.[ t.9+n+#+#+m.9+k J l+P [ [ j l+/+k k 9+k C./+l+7+d+v v d+F+J - A.! o o _.F 3+F F F Y E.N x.8 8 9.9.9.!.8 A = p+;+2.* ,.d+).F+g ` :.:+= A !.9.9.9.!.x.N p+:.f.* ,.7+F+F+7+7+g ` f.i 7.n *+;+J.7.r+2.2.2.X.w w n+*. + +0 0 Q.p.4+C+J.b+b+8.c+P.a & w.D.|+].", ":+p+N = a.a.p+p+p+a.N = = = = x.s+x.x.~.s+= >.>.E x.x.x.~.~.A 8 !.!.!.9.9.9.9.9.9.9.9.9.9.!.!.!.!.A E N ../.* w+/+R w E+E+3.3.3.3.3.f 3.f f s.s.s.M.M.3.R.]+_.D i+5.< < W _.G ! f f k j w.O w.w._ z.H+]+o #._.3+3+3+_._._._._._._._.i o o 8+! o i 7.A+n 5.5.>+f+( >+n b+B.a+m.y.[+*. +1+ +1+1+1+1+1+*._ *.[+*.*.y.*.M y.y.y.*.*.*.*.*.*.*.*.*.*.*.*.y.*.M y.y.y.y.*.y.y.p.M m.y.y.m.M y.y.M n+p.n+m.M M n+n+M n+z+n+N.M z+M n+n+M n+n+M n+z+n+M M M M p.n+y.n+n+y.y.n+m.n+n+m.n+z+z+b z+z+b b b b #+n+n+n+b #+z+z+z+z+z+N.!+b b n+n+z+z+z+z+b b #+N.n+z+z+b z+n+z+n+n+z+n+n+n+z+n+z+z+M z+M y.n+n+m.M n+n+n+n+n+n+M m.n+n+n+n+M y.m.y.y.y.y.*.y.*.y.y.*.*.[+*.[+[+*.*.[+ +y.[+*.[+*.[+ +[+[+ +*.[+[+[+t. + +$.t.t.$.Q.$.& '.Q.'.$.$.'.$.'.'.'.'.'.j '.Q.j Q.'.'.$.'.$.'.0 0 [ [ o.[ j.j.0 0 o.j.x+x+L 3 [ /+n+n+9+9+,+/+7+e+[ [ y+[ e+j /+,+/+/+l+l+e+e+d+$+$+d+P J M.M.8+o F _.F F F F + Y a.= ~.8 !.9.9.9.9.!.{ E :+J.q.Y.7+y+d+7+* f.:.p+E A !.!.9.9.9.8 x.p+b.4 t u+,.7+F+7+m g q.2.A+J.J.G.G.7.4 f.2.! ^.! P.b n+M $.Q.I.0 t.p.B C+G.c.b+k+6 P.a 5+<.e > S ", "..p+a.N a.p+..b.b...p+N N s+= = x.x.A A ~.s+N >.= x.A 8 !.8 !.!.!.!.!.!.!.9.!.9.!.9.!.9.!.9.!.!.A x.a.b.q.Y.l+U k X E+f M.M.3.M.f M.}+M.E+M.E+s.s.s.f 3.G+#.8.c 5.< < W _.G ]+3.f k j O L ].l L w.'.k E+3.o _.< < n < < _.W < W < _._._.o o o i _.3+n G.o+( ( ( >+D ++)+H+m.R *.[+1+e. +1+ + +[+*.e.*.*._ y.*.*.*.M *.*.y.y.M M M *.M *.*.*.y.y.y.M y.M M y.M m.*.M M M M m.M M M M n+y.n+n+M n+n+n+n+n+n+a z+z+n+n+z+z+n+z+n+M m.!+M n+n+n+n+n+n+n+n+n+n+y.n+y.n+y.y.y.y.n+n+n+m.n+z+b b b z+z+z+n+#+n+#+n+n+#+b z+z+b z+b z+N.b z+n+#+m.n+n+z+n+m.z+n+z+n+n+b n+z+z+n+n+z+M z+M a n+z+M n+n+M n+n+z+n+n+n+z+n+n+z+m.n+n+n+M n+M M y.y.y.[+y.*.*. +[+ +[+*.*.y.y.[+*.*.y.[+[+[+[+y. +[+*.*.[+[+ + + + + +t.t.Q.Q.Q.Q.0 Q.Q.'.Q.Q.'.& t.& $.t.t.t.'.Q.'.Q.Q.j Q.'.& Q.Q.Q.w.0 o.[ o.0 o.j.j.j.<+L l l 3 $+e+,+,+,+,+/+j e+d+d+j.v v [ d+e+U l+j P [ [ d+v $+$+F+U J M.3.o o F F _.4 F F + E.a.s+A !.9.9.9.9.9.9.{ = f+:.q.h+7+e+$+7+h+2.;+:+E ~.!.9.9.9.9.u { N *+:.f.t V m m 7+,.u+q.r+i A+G.G.*+b+r+2.2.2.R.a+B b M [+t.Q.Q.Q.Q.p.4+++G.o+c.k+i.P.M & w.D.|+|+", ":+p+N N a.p+b.+ :.:.b.p+N = >.N = s+~.A ~.= p+p+E { 8 !.!.8 8 8 8 8 8 8 8 !.!.!.!.9.9.9.!.!.8 A E >.;+8+C./+_ _ R E+M.f E+E+M.}+}+3.}+3.}+3.3.f 3.a+S.! ]+_.< n n < < < G o ]+@.5 k '.w.l .l l L [ j R f ! _.< n 3+< _.< < < W < W < i i _.#.3+3+< 5.o+( 9 >+5.n A+)+H+n+*.[+e. +1+1+ +*._ +_ *.1+*.e.[+*.*.*.y.*.y.e.*.*.*.*.*.*.*.y.y.1+*.*.y.y.m.y.y.y.M y.y.M y.y.*.y.M M M *.M y.y.y.M M y.m.m.n+p.n+n+!+z+z+z+z+z+!+n+n+n+n+n+n+n+!+n+N.z+n+m.n+n+n+m.n+n+n+n+m.y.n+n+n+z+z+n+z+z+N.z+z+z+n+n+n+z+n+n+n+b b z+b z+z+n+n+m.n+n+n+b n+m.z+z+n+#+n+n+z+n+m.n+n+n+n+n+z+n+z+n+n+z+n+n+n+n+M n+m.n+z+n+z+z+z+n+z+n+n+n+z+n+z+M n+y.y.y.*.[+y.*.[+[+*. +*.[+[+[+*.*.[+*.y.y.*.[+y.[+[+[+y.[+[+*.1+ +t.t.Q.t.t.Q.0 I.0 I.I.Q.Q.Q.Q.Q.t.Q.Q.t.t.t. +$.t.$.t.$.Q.'.'.$.'.Q.0 0 w.[ j.j.j.x+L L 3 3 l F. .K v e+/+l+l+l+e+[ v v $+v $+L d+v [ j [ [ d+v v v $+v F+J k f 3.o _.F 3+F 8+F F % E.= s+8 !.9.9.9.9.9.9.{ x.:+;+q.H 7+e+v 7+* f.*+a.E A !.!.9.9.9.!.{ N :+:.2.` u+,.m m V * 8+r+7.J.n G.G.J.C+)+^.)+.+}+s.E+a e.Q.I.I.0 Q.p.B 7.G.o+D 8.X.5 *.5+w.O |+S ", "p+a.a.= a...:./.r+:.;+:+>.a.p+p+N = s+A s+= a.p+E 8 !.8 8 8 8 A A 8 A 8 8 8 8 !.!.9.!.!.!.!.~.E p+:.R.C.,+_ k b E+M.E+M.}+3.3.3.3.a+3.a+R.! )+! ! ! ! ! o _._._._.< W W G ]+]+G+G+f X _ j.L ].L x+j.'.- E+o _.3+n 3+< < W < < < W < _.3+i _.7.A+n 5.>+f+( >+o+b+C+)+}+R y.*.1+[+ + +1+e. +1+*.*.[+*.e.y.*.M *.*.*.y.*.y.*.*.e.*.*.*.*.*.*.y.*.y.y.[+y.y.y.y.y.y.y.y.y.y.M M p.y.y.y.y.M y.y.n+m.n+y.n+M n+n+n+z+n+z+N.z+z+n+N.n+n+n+z+n+n+z+z+z+n+n+n+n+z+M m.n+m.y.y.M m.y.n+n+m.z+z+b z+z+z+n+n+z+z+n+n+n+n+n+n+n+z+b b z+z+n+n+n+n+m.n+z+n+n+z+n+n+n+z+n+n+n+n+y.m.n+M n+n+n+n+n+M M n+m.n+m.n+n+z+n+z+n+z+n+z+z+n+z+n+z+z+n+z+M n+y.*.p.*.*.*.*.[+[+*.[+1+p.*. +p.[+ + +[+[+[+ +1+[+*. +[+[+*. + +t.5+t.0 o.I.o.I.I.I.I.o.I.o.I.I.Q.Q.$.Q.t.$.t.t. +'.t.t. +Q.& Q.Q.Q.Q.o.0 w.[ w.x+v L 3 l F.F.{.F.l K v e+e+7+e+[ v v v $+p v $+v v v v d+[ v v $+$+3 $+[ U - M.3.o _.< 3+F 4 F 3+% E.s+A 8 9.9.9.9.9.9.!.8 E :+:.q.H e+d+v 7+* 4 Y >.x.8 !.9.9.9.9.9.{ E :+;+/.f.u+V V m g ` q.4 7.A+J.G.G.J.++i.8+q.)+H+b b M +t.Q.0 Q.t.p..+C+G.o+c.8.c+!+a & +.6+D.S ", "p+a.p+N a.p+:.q.q.7.J.:+>.a.....p+N x.A s+= a.N x.8 8 8 8 A s+~.~.~.s+A A 8 8 8 !.!.!.!.8 ~.E p+:.a+k k z.b X E+f 3.f 3.S.3.a+S.S.! ! ]+r+r+_._._._.i r+o o o o G G < W G ]+]+]+]+G ]+3.U [ j.j.j.j _ s.3.! _.A+n < _.< W < < W < < W 3+3+_.3+n D o+( ( f+5.b+_.G+w R y.*.*. +*. + +_ 1+1+1+1+*.[+[+*.*.*.y.*.a *.*.*.*.*.y.e.*.*.*.1+1+*.y.[+[+y.[+y.y.y.y.*.y.y.y.y.y.y.M M M M M y.*.y.y.y.y.M M n+M n+n+z+z+n+z+z+b z+z+z+z+n+z+z+z+z+z+z+z+z+z+z+n+z+n+m.n+n+a m.n+n+m.m.n+n+z+n+#+z+z+z+n+n+n+z+m.n+n+n+n+n+n+n+z+z+z+z+n+n+M n+n+y.n+n+n+y.n+n+M M y.y.y.n+y.n+n+M n+M n+n+m.z+y.M n+m.n+n+n+z+n+b n+z+n+#+z+n+z+n+z+z+z+z+n+m.n+*.y.[+p.1+[+ +[+*. + +[+y.*.1+*.*.*.[+[+y.[+[+[+y.[+*.[+*.[+ +t.Q.Q.0 0 o.s o.y+y+y+o.o.o.I.}.Q.Q.t.Q.t.5+$.t.$.$.t.t. +t.t.Q.t.0 Q.0 o.o.j.j.j.3 3 l 3 {.{.{.{.K 3 $+d+[ e+y+[ d+v v $+$+$+$+v v d+v v d+v v $+$+$+$+d+U - f ! o F < 3+3+F F E.E.a.s+A !.9.9.9.9.9.9.!.A E :+:.q.L.7+d+d+,.* /...N ~.8 !.9.9.9.9.9.u x.p+;+/.q.$ ,.6.V u+t /.:.:.b+G.n J.7.r+2.^.R.)+.+H.#+n+ +Q.I.o.I. +m..+C+G.o+c.8.6 5 M & I.O |+|+", "a.p+p+p+p+Y 4 2.2.7.;+p+N a.p+..p+= ~.s+A = = x.A 8 8 8 A s+a.N s+s+s+s+A A A 8 !.!.!.8 x.= :+4 3.X R b f f @.S.@.a+S.@.S.S.@.S.! ! #._.A+< n n n n < 3+i o ]+]+6 G G G G+n.]+6 G G < o X '.'.j j '.- E+S.]+_._.3+_._.< W < < W _._.< A+3+3+n D ( 9 ( ( D b+C+.+w R y.*.1+ +1+ +1+1+1+[+[+ +*. +*.y.[+y.M a M y.*.a *.*.*.1+y.1+*.*.y.*.1+1+*.*.*.y.[+[+*.*.y.y.y.y.M M y.M y.*.M M M M M y.y.M n+n+y.n+y.n+n+#+b b b b b z+z+z+z+n+z+z+z+z+n+!+z+N.z+z+n+z+n+z+n+z+n+n+n+n+n+n+n+n+n+n+n+z+n+z+n+n+m.n+m.m.n+M z+z+z+n+b n+n+z+n+n+M y.n+m.y.y.m.y.y.m.n+n+m.y.*.y.y.y.n+M M y.M n+y.n+m.y.y.y.y.n+n+n+n+b n+z+n+n+z+m.z+n+n+n+n+M y.*.y.[+[+[+[+[+[+[+[+[+[+*.[+[+y.[+[+[+ +[+[+*.*.[+[+[+[+1+[+ + +t.Q.Q.I.}.o.y+<+<+D.D.<+y+s o.I.I.I.Q.Q.5+t. +t.t. +$.t.$.5+$. +Q.Q.Q.Q.Q.o.w.j.j.j.L 3 K K {.K K 3 3 L v [ [ e+[ d+d+v v v v v d+v d+v d+d+d+v d+v v v F+U - f 3.o _.3+5.n n Y E.a.E A 8 9.9.9.9.9.9.!.!.~.N :+:.q.g e+d+e+,.'+4 ..N A !.!.9.9.9.9.9.!.{ >.b./.q.u+v+m m u+8+4 :.n *+G.G.G.7.2.R.R.a+R.G+P.z+n+1+5+0 o.0 Q.N.4+++G.o+c.8.X.P.a $.<.O > S ", "p+p+p+a.p+Y :.2.C+:.G.:+a.p+p+p+= s+A ~.A s+s+~.A 8 A s+s+= a.a.N N >.= A A A 8 8 8 A x.>.*+4 * X E+H+@.@.G+G+! S.! S.S.a+S.S.@.S.! #.A+n D >+5.5.5.5.< _.o ! c+G+6 ]+1 5 ^ c+]+; < 5.3+o M.X k R - s.S.! o _.A+_._._._._._._._._._.3+3+< n 5.5.( ( ( >+b+#.a+#+y.*.*.[+*._ +1+$.e.e.1+*. +y.1+*.*.*.M M y.a M *.*.*.[+[+*.*.e.*.1+*.y.y.M *.y.y.y.*.*.*.y.*.y.y.M y.M M n+M n+n+y.p.M y.y.M M M n+n+n+M M n+z+z+b N.!+b b z+z+z+z+z+b b b b b z+z+z+z+n+z+n+z+n+n+n+n+n+z+m.n+n+z+n+n+n+z+n+z+n+n+b n+n+n+n+n+n+n+n+n+n+z+n+n+y.n+n+y.y.m.y.y.m.y.y.y.y.y.m.y.*.*.y.y.y.y.M n+y.m.y.y.y.m.p.n+y.m.[+n+n+n+m.n+m.n+z+R n+n+n+z+y.n+n+y.p. +[+[+ +[+ + +[+ +[+[+p.[+[+*.*.[+[+ +[+[+*.*.*.[+*.[+[+[+ +t.Q.0 }.o.o.o.y+<+<+D.<+<+y+o.y+o.}.Q.Q.5+5+t. +t.t. +t.$.5+t.t.t.t.Q.0 o.y+y+j.j.L v L K p K 3 3 3 v <+v y+[ e+e+[ [ d+d+d+d+v d+d+d+d+d+v d+d+d+v d+j.F+P J X 3.o _.n n 5.Y E.E.= E 8 !.9.9.9.9.9.9.!.1.E p+b.4 q.g 7+e+m h+q.:.:+= A !.!.9.9.9.9.9.!.A >.*+:.t u+V m V A.f.4 ;+n G.*+5.G.J.r+q.R.4+a+a+@.P.n+ +5+0 I.o.t.p.4+J.G.o+G.8.X.b e.Q.}.O D.> ", "p+p+>.a.a.Y :.4 7.;+:+p+>.N = E x.A s+A A A A 8 A A s+s+= N p+>.N N N E { A 8 { 8 A x.p+b.q.'+X E+3.G+]+G+! ! S.S.3.! a+3.a+3.3.S.! G _.(+( ( ( i+i+5.n 3+o 3.f f 1 5 z.z.5 1 c+W D 5.n o o ! 3.M.f G+S.o o _.4 _.o _.o o o o _._.A+3+< n n >+( i+>+D A+B.a+m.*.1+1+1+1+1+ +1+1+1+*. +*. +*.*.*.1+*.*.y.y.M y.M *.*.*.*.*.1+M *.*.M M *.*.1+M *.*.*.y.y.y.*.y.*.M p.M n+n+y.!+y.M n+M M M M n+n+n+n+y.n+z+z+n+z+z+z+z+b b z+z+z+z+z+z+N.b b z+#+b b z+z+b z+n+n+z+n+z+z+n+n+z+n+n+n+M m.m.n+n+n+R z+n+z+n+n+n+n+z+n+n+a n+n+n+M n+m.*.m.[+[+y.m.y.y.y.m.y.*.*.y.*.y.y.y.p.m.m.y.y.M M y.y.*.y.y.y.y.m.y.n+n+n+n+n+m.n+n+n+y.n+M n+M y.*.[+y.[+*.*. +[+[+[+[+ + +[+[+[+[+[+*.*.*. +[+ + + + +[+1+ + + + +t.Q.0 o.s y+D.<+y+<+<+<+<+s o.0 0 Q.Q.t.t. + + + + +t.5+ +Q.Q.Q.Q.Q.I.0 I.o.y+y+j.j.v v $+v 3 <+<+3 j.j.j.y+[ [ e+e+[ [ d+d+F+[ d+[ d+d+[ d+j.[ d+d+[ [ j J - f ! o F n 5.5.5.u.z x.{ !.9.9.9.9.9.9.!.{ E u.*+4 q.H ,.7+,.'+2.;+>.s+8 !.!.!.9.9.9.!.8 ~.N ..4 f.u+v+V V A.8+4 :.;+*+*+*+o+n C+^.R.^.H+#+s.w n+y.Q.I.o.I.t.p.q.++G.>+D 8.X.b ++.<.O |+|+", "a.N N = a.:+Y ;+;+*+:+>.= E s+~.A 8 A A A 8 A 8 A s+a.N N >.>.>.E E = x.{ A 8 { x.= p+:.R.w b E+@.S.! S.S.S.! ! S.S.S.a+3.M.M.f 3.a+]+_.D 9 9 ( 5.i+5.n o ! f z.z._ w.<.& T X 1 G < ;+3+3+3+4 o ! o #.#._.3+_.F G o o o ]+]+o o _._.3+< 5.5.>+o+D b+++i.N.z+y.y.[+ +*. +e.1+ +1+ +1+1+*.1+*.[+*.*.y.y.*.M M y.y.*.a *.y.y.*.y.*.*.1+M *.M e.M *.*.*.*.*.y.p.y.y.M n+M M n+M n+n+M n+n+M y.M M M M n+M n+n+n+z+z+z+b z+z+z+z+N.n+z+N.z+z+z+z+z+z+n+b m.z+b z+z+n+n+z+n+z+z+n+n+n+n+n+n+n+n+n+n+n+n+z+R n+z+z+n+m.n+n+z+a n+n+n+M M n+M n+n+m.y.y.n+y.M y.n+*.M y.y.y.y.y.y.y.*.y.y.p.M y.m.y.y.n+y.m.y.y.p.m.R n+y.R [+y.n+y.n+y.y.y.y.*.[+[+[+[+*. +*. + +[+ + + +[+*.*.[+ +*.*.*.*.p.*.*.[+[+[+[+ + + +t.Q.}.I.o.o.o.o.o.y+D.y+y+<+s I.0 Q.Q. +t. + +t. + +t. +t.t.t.5+Q.t.Q.0 o.I.0 [ j e+e+[ v d+d+j.j.j.y+j.[ 0 [ e+e+j [ P P [ [ [ [ [ [ d+F+[ d+[ d+[ [ [ [ U J - 3.! _.F n 5.E.E.z = { !.9.9.9.9.9.9.!.{ E u.o+7.q.'+p.,.g q.:.*+N ~.8 !.9.9.9.!.!.8 A s+a.Y /.t u+6.6.u+t /.+ 3+b.5.*+*+*+J.i ^.R.^.X.H.#+z+n+*.$.Q.0 I.Q.m.^.7.G.i+c.8.6 5 1+I.w.O > |+", "N s+= = >.p+p+:+:+:+>.= E x.~.A A 8 8 8 8 8 A A s+= a.>.= = N E x.x.x.{ 8 8 ~.x.>...4 '+X w f S.S.R.3.! ! ! 3.3.S.a+a+3.M.'+#+M.}+S.]+8.i+( 5.5.5.(+n < o M.k j w.x+|+L O w._ E+]+2.#.A+n E.n F A+A+< n n n < < 3+_.o o o o o _.7.3+3+G.D o+5.D J.#.! E+R [+*. +1+[+ +*.1+*.*.*.1+e. +e.*.1+e.*.y.*.a *.M *.*.y.*.e.y.*.*.*.1+M M *.*.M *.y.*.*.*.y.y.*.*.y.y.y.n+y.n+n+n+z+n+z+n+!+M n+n+z+n+n+z+n+n+n+M z+M n+m.n+z+z+z+z+z+z+n+n+n+z+z+z+z+n+b n+b n+n+z+n+z+z+n+z+z+z+z+z+z+n+n+n+n+n+n+z+n+b z+z+z+n+n+n+z+n+n+n+n+z+z+n+z+n+M M y.y.y.y.M M M y.y.y.y.y.y.y.y.y.y.y.y.p.y.y.y.y.y.y.*.y.y.[+y.[+y.y.y.y.y.9+[+m.m.y.y.y.y.y. +p.[+[+*.[+ +[+[+ +*.*. +[+*.[+ +[+[+[+*.[+[+ +*.*.*.[+ +[+ + +*. + + +5+0 Q.Q.I.o.o.o.o.o.s o.o.0 }.0 Q.t.5+ + + + +t.t. +t.5+t.Q.Q.Q.Q.I.0 o.0 l+,+[+,+l+/+l+e+[ [ 0 [ 0 o.[ 0 j j l+l+U 7+U m 7+d.P F+P [ [ d+[ d+[ d+[ P [ j U - M.o #.A+3+D 5.E.E.>.= A 8 9.9.9.9.9.!.{ E z o+(+C+4+Y.,.h+8+:.f+z { !.9.9.9.9.9.9.8 s+a...+ /.t u+6.V v+8+/.3+Y G.*+*+*+*+7.r+2.a+a+^.P.n+R y.[+5+I.I.o.t.p.4+++G.D D 8.c+5 1+Q.6+e |+S ", "= s+= = N = N >.p+>.N = x.A 8 8 8 8 8 8 8 A s+s+s+= >.N E = x.x.A A ~.{ { A x.>.b.2.L.k X H+S.! S.R.3.R.S.! ! ! S.3.3.f f M.s.M.3.! Z A+5.n n < < < 8._.3.X '.j.L l : m+K.l j.j X a+)+b+o+:+( E.n n 5.5.i+5.5.n n < o o o o i _._.< D D >+D b+8.B.H+#+n+*. +*. +1+ +*._ +1+e.*.[+e.[+1+1+*.*.e.*.*.y.a a M *.*.y.*.y.*.*.*.*.*.y.*.*.M M y.M M *.*.M *.*.*.y.y.n+n+m.z+n+z+n+z+M n+M z+a z+n+M n+z+z+z+M n+n+z+n+z+b z+z+z+n+z+b n+z+z+z+z+N.z+z+#+z+n+n+z+z+n+z+z+N.n+z+z+z+z+z+n+n+n+n+R n+n+n+b z+z+z+n+z+n+n+z+z+n+z+M z+n+n+n+n+n+n+y.n+n+M n+n+y.n+y.*.y.y.*.m.y.y.*.y.m.M p.M M y.p.*.y.y.p.y.y.y.y.y.*.9+[+y.y.y.[+*.y.y.*.*.[+*.*.[+ +[+[+[+ +[+ +[+[+[+[+[+ +[+ + +y. + +[+[+[+ +[+[+ + + + +t. + +Q.0 Q.Q.I.}.Q.I.Q.I.I.0 Q.t.Q.t.t. +[+ + + +t. + +t.t.t.Q.Q.Q.Q.0 o.t.[+#+N.H H L.C.,+/+j '.0 0 0 0 j j j w+C.Y.Y.J - J J U j P F+F+[ [ d+[ [ [ [ P P U k f ! _.< < *+D ( o+E.E.z s+{ !.!.!.!.{ x.E u.:+G.++2.'+L.* 2.;+p+E A 9.9.9.9.9.9.9.8 E p+Y /.f.v+V ,.6.u+f.+ Y E.*+E.( :+E.J.r+8+q.'+a+4+w m.M *.t.Q.I.0 Q.p.4+++G.o+c.++X.!+1+I.O D.|+S ", "= E = >.= E s+= = N x.x.A A 8 8 8 8 8 8 A ~.s+x.s+= = = E ~.{ 8 8 { 8 8 A E p+;+q.L.- X E+S.G+S.! ! R.! R.! R.! ! R.a+a+3.'+}+f 3.! o A+A+A+_._._._._.]+3.k '.w.L . .: : .].j.l+#+)+++G.:+E.E.5.5.i+( 5.i+5.5.5.n F o o i _.7.n n D 5.5.n A+i.P.m.y. +*.*. + + +1+ +e.1+[+1+1+*.1+1+*.e.*.e.*.*.y.*.*.M *.y.*.*.y.y.*.y.*.*.*.*.y.*.*.*.e.M M *.*.*.M M y.M y.M n+n+n+n+z+z+z+z+z+n+a z+a z+n+z+n+a n+n+z+n+n+z+m.z+z+z+b z+b n+z+n+n+n+n+z+n+z+z+m.z+n+n+n+z+n+z+n+z+z+z+n+n+n+M M R n+n+z+z+b z+z+#+n+z+n+z+z+z+n+z+z+z+z+z+a n+y.M y.n+n+M n+n+y.n+y.y.p.y.y.y.y.M y.M y.M y.*.y.y.n+y.y.y.[+y.y.y.y.[+y.p.[+y.[+y.[+y.y.*.*.*. +*. +*.[+[+*. + +p. +[+ +[+[+[+[+*.*.p.*.*.[+*. +[+ +*.[+ +p.[+t.[+[+ + +t.t.t.Q.t.Q.Q.Q.Q.5+t.Q.Q.5+t.t. + + + + + + + + + + +t.t.t.0 }.o.t./+#+4+^.)+4+}+s.Y.J '.j '.'.j '.j '.U J - X X s.M.#+- k U P [ [ d+[ [ [ d+[ F+[ [ U k f ! G 8.n 5.o+D G.b+;+Y Y a.N = s+x.E N u.u.o+G.8.)+B * * 8+:.:+E 8 !.9.9.9.9.9.9.u E p+b./.q.A.V 6.V v+f.+ ..E.E.:+:+f+:+G.i q.^.s.'+'+b R R 1+5+I.o.}.t.p.q.J.G.o+b+k+1 z+$.I.O > |+S ", "= = N p+= x.~.s+x.= x.~.A 8 8 8 8 8 8 A A s+s+x.x.x.= E x.{ 8 8 !.8 { x.E :+:.R.X X w S.S.! ! ! S.! ! ! ! ! ]+! o o o ! ]+! ! R.! ! o o o G _._._.]+]+3.5 X X '.[ x+3 l .l L j./+#+! ++n o+( *+D 5.9 z ( ( ( 5.5.n F F o F _.< n 5.o+D b+++o }+R [+y.e.[+*.*.1+ +e.[+*.1+*.*.1+*.1+*.*.1+*._ *.*.*.*.*.M *.y.y. +*.*.*.*.*.*.*.*.*.*.*.y.*.*.*.y.y.M y.y.y.M M M n+n+z+n+z+n+n+z+z+z+n+z+z+z+z+n+z+M z+n+n+n+n+z+n+z+N.n+b b z+n+z+n+z+n+z+z+n+z+z+n+#+n+z+n+z+n+z+z+n+z+z+z+n+z+z+n+M n+n+z+n+#+b z+z+z+z+z+z+z+z+z+z+z+z+n+z+M n+n+n+M M n+M n+z+n+n+n+y.M y.y.y.y.n+p.M y.n+M y.y.y.y.y.y.n+y.[+y.m.n+y.*.y.[+y.[+y.y.[+*.y.[+y.*.*. +[+[+[+[+ +y.*.*.y. +[+ +[+[+ + +[+ +[+[+[+[+[+[+*. + + +*. + +[+[+ + +t.t. + +t. +Q. +5+t.t.t. + + +[+1+1+ + + + + +t.t. +Q.Q.t.Q.0 0 t.p.4+B.++C+C+^.a+'+L.k U _ '.'.'.j /+,+k s.M.f f f w X k U U F+[ d+d+v j.v d+d+[ [ U k X @.#.W b+D 5.D b+++r+2.8+/./.+ :.% Y *+*+*+D D 8.B..+'+* ` 4 ..N A !.9.9.9.9.9.9.8 E p+b.:.t A.g 6.V A./.+ b.*+:+( f+:+( *+3+r+2.@.#+L.w m.[+ +5+Q.I.I.t.y.4+J.o+o+D 8.X.z+5+I.O |+K.K.", "N N a.p+= x.A A ~.A A 8 8 8 8 8 8 8 A ~.s+= x.~.~.x.= x.~.8 8 !.8 1.x.= *+4 a+s.f H+H+G+! ! ! ! ! ]+! ! o G o o #.#.r+#.o o o ]+! ]+! ]+o G G W ]+]+@.c+G+c+]+@.k j w.j.j.j.j.[ U s.R.B.J.b.5.n 5.( 9 9 ( 5.5.( 5.n 3+4 _.A+n 5.5.o+D n ++i.H.n+R y.[+*.*.*.[+[+*. + +*.[+[+1+*.1+*. +1+*.*.*.*.*.*.*.*.*.*.*.y.[+*.*.y.*.*.*.*.*.*.[+*.*.M *.M *.*.*.*.y.n+M n+n+M a n+M n+n+a M M z+z+z+a z+a n+z+n+n+M n+M n+n+z+n+z+z+z+n+N.z+z+n+n+z+M z+z+n+b z+n+z+n+a n+n+n+z+z+n+n+n+n+m.z+n+n+n+z+n+z+n+n+z+z+n+z+n+z+n+z+z+z+z+z+n+z+z+n+n+n+n+n+M n+z+n+n+n+m.M p.y.p.*.y.*.M n+n+M n+n+n+M M y.y.y.*.y.*.y.y.*.y.*.y.[+y.[+y.[+p.[+*.[+[+[+[+[+[+[+ +[+[+[+*.[+y.y.[+[+ +p.[+ +p. + + + +*. + + +*.[+ +[+[+ + +*.1+ +[+ + + + +5+ + + + +t. + + + +[+ +[+ +[+ + + + +t.t.Q.Q.0 }.0 /+H 2.J.G.b+J.i 2.R.'+L.k J U /+U '.l+,+X w E+H+a+@.f #+k U j [ d+v $+).$+v v v v d+P J s..+i.++8.(+(+8._.#.^.a+L.g g g * A.` f.7.A+;+b+A+r+! '+M.* f.F p+E A !.!.!.!.!.!.8 E p+b.:.f.A.u+g g A.f.4 ;+E.*+E.:+E.*+;+3+i 8+)+}+m.9+R m.*.t.Q.0 }. +p.q.++G.f+c.k+1 z+& O 2+S K.: ", "= >.p+>.E x.A A 8 8 8 8 8 8 8 8 8 A s+~.~.x.~.A x.s+E x.A u 8 8 A x.>.*+4 R.P.@.G+]+! ]+]+G o #.o o G ! o #.r+_.3+< < < < _.A+#.o ]+! ]+]+]+G G n.5 1 c+]+G G _.3.k '.j Q.0 0 j J #+! o A+;+3+3+D ( ( 5.5.5.< 5.5.n F F 3+< D 5.o+5.b+A+)+a+m.*.*.*._ 1+ +1+1+*.1+*.1+1+e.*.e.*.*.*.*.1+*._ *.e.*.*.*.*.*.*.1+y.y.y.e.*.[+[+*.*.*.1+[+e.*.1+*.*.*.M M y.y.y.a M n+M M n+a n+z+n+z+n+a z+z+z+z+n+n+n+n+m.M n+n+n+n+z+z+b z+!+b z+z+n+z+z+z+z+z+z+n+z+z+z+z+n+z+z+z+m.n+n+z+z+z+n+n+n+n+n+n+z+z+z+z+z+z+n+n+z+n+z+z+z+z+b z+n+n+z+n+n+z+n+n+z+n+z+z+z+z+n+n+M n+M M y.y.y.y.M n+n+n+M n+p.n+y.y.y.*.y.y.y.m.y.m.y.y.y.y.[+[+y.*.y.*.[+[+*. +[+[+[+[+y.[+[+*.[+[+[+y.[+[+ +[+[+ +[+[+p. +[+[+ + + + + +[+[+[+ +[+1+ +[+t.[+ +[+ + +1+ + +[+[+/+[+ +[+ + + + +[+ +t.t.t.t.5+Q.0 o.e+p.B r+G.o+o+G.G.++i 8+a+'+X C.U U l+U J k w E+f @.@.H+w R /+j [ v $+p ' p p $+$+$+v d+U X a+Z k+8.8.b+k+6 ^.3.h+C.,.w+7+,.,.Y.H ^.B.++++++_.! a+M.* ` f...>.E A A A 8 A A ~.= :+;+/.f.t t A.* ` 4 + ;+;+*+..E.*+3+F r+r+2.^.S.b R 9+[+*.t.Q.0 0 t.p.B.++G.o+D k+X.a 5+O |+K.: : ", "N N >.N = x.~.A 8 8 8 8 8 8 8 A A s+x.s+x.~.~.~.x.s+x.{ { 8 8 { E u.;+r+! G+]+o G G #.#.#.#.#.o o o o o ]+o r+A+n D 5.5.D D < < #.o ! S.G+(.G ]+5 5 5 c+~ W (+n o f X k k k k k X f S.o i 7.F _.3+n F 3+3+< n 3+n 3+3+< 3+D o+o+D b+A+)+}+z+n+y.*.*.*.*.*.[+1+1+*.1+*.*.[+y.*.e.*.y.1+*.1+*.*.*.*.e.e.*.*.*.*. +*.*.*.*.*.*.y.*.*.[+*.*.*.*.*.*.*.y.M M M M n+M n+n+R a n+M M n+n+n+z+z+z+z+z+z+n+n+n+n+z+m.M a z+z+z+z+b b z+!+z+n+z+z+z+z+n+z+z+n+z+z+n+z+n+n+n+n+n+n+n+n+n+z+n+n+a z+n+a n+z+z+n+a z+n+n+n+n+#+z+z+z+n+z+M z+a n+n+n+M z+z+z+z+z+b z+z+n+m.y.p.*.y.M M n+M M p.z+M M M m.y.y.y.y.y.y.M y.y.y.p.*.p.y.y.[+p.*.[+p.[+[+p. +[+[+[+*.*.[+[+y.[+[+*.[+1+p. +[+*. + + +[+[+[+[+[+ +[+[+t. +[+[+ +[+[+[+[+[+[+ +*. +*.*.[+ +[+[+ +[+ +/+ + + + + + + +Q.Q.Q.Q.}.0 t.#+^.J.G.f+f+o+*+b.J.4 r+2.R.a+s.9+C.,+C.- w f S.G+G+@.E+R U [ [ v $+p p p p p p 3 3 v [ ,+w .+Z k+8.8.k+i.H+s.- ,.7+7+7+7+,.L.s.}+! r+C+_.B.2.M.* h+* 8+F Y a.z N N a.= a.N p+b.:.f.q.` ` q.8+f.4 F ;+;+J.n *+*+n i 8+8+2.^.H+w #+z.R 1+ +t.5+Q.t.N.q.b+G.D c.k+1 M +.D.S ~+: [.", "N a.>.N E x.x.A 8 8 8 8 8 A A A s+= = x.x.s+x.x.x.x.x.{ 8 { A = :+J.#.i.G+6 G G _.r+#.G #.G #.o Z i.! o )+#._.< 5.9 9 ( 5.5.5.D 3+o ! @.@.1 1 5 T z.2 5 6 < c 5.i ! 3.f f X E+E+f S..+o B.r+r+r+o i o o o _.3+3+F 3+3+n D 5.5.D b+8.o H.R y.*.*.*.*.*._ 1+*.*.*.*.[+*.*.1+y.*.e.e.y.y.y.e.e.*.1+*.*.*.*.*.*.*.[+*.*.1+*.y.*.*.*.*.*.*.*.y.*.y.*.*.*.*.n+n+M n+a M y.y.y.n+y.M M M n+n+n+z+a z+z+n+z+n+n+n+n+n+M z+z+z+z+z+b z+z+n+z+z+!+z+z+z+!+z+z+z+z+n+n+n+z+n+z+n+n+b z+z+z+z+z+n+a n+n+z+a n+n+n+n+n+z+n+n+z+z+n+z+n+z+n+n+n+n+a n+n+n+n+z+b z+z+z+z+z+M n+y.*.y.y.M n+!+n+M z+n+n+M y.m.y.y.y.m.n+n+n+n+y.y.y.*.y.y.y.y.*.y.y.*.*.*.*.*. + +[+ +*.*.*.*.[+*.*.*.[+ +[+[+[+y. + +[+ + + + + +[+[+ + +*. + +[+1+ +*.*. +*. + +[+[+ + +[+ +[+ +[+[+[+t. +[+ +t. +5+t.Q.0 0 /+B B.G.o+f+u.f+:+:+*+;+J.7.7.i 2.R.h+m.k - #+E+f H+G+H+E+R _ j [ d+$+$+p p K K K p 3 3 v e+_ f @.i.B.++C+X.E+#+C.U 7+P 7+,.g '+}+@.i.#.G B.o R.a+* h+* R.4 n *+( 5.b.;+b.+ :.b.+ f.f.q.q.f.2.4 i F 3+n F 3+7.:.n J.C+R.R.^.! 3.H+E+z+n+*. +t.t.t.t.p.^.++c.G.8.k+!+*.s |+K.: [.[.", "= N N = = = x.A 8 8 8 A s+s+s+s+= N E E = E = x.x.x.{ 8 { x.N *+4 o i.Z G #._.r+G _.#.r+o #.B.o o ! ! ^.R.o r+< ( &.&.9 9 ( i+5.n #.3.E+5 z.k T w.& T 2 n._.n n _.F o 3.@.f 3.f ! ]+o o o o o o o ! ! ! o 8+o #.7.3+n D o+D b+n ++i.w #+R y.*.y.*.[+*.e.*.*.*.1+*.e.e.*.*.1+y.y.y.*.*.*.*.1+_ *.*.*.*.*.1+*.*.*.1+*.y.*.*.*.*.*.*.*.*.*.*.[+*.y.y.y.y.y.M n+n+z+n+M n+n+y.n+y.n+z+M z+M n+z+a z+z+n+n+M z+n+z+z+n+z+z+b z+z+z+!+z+n+n+n+z+b z+b b !+z+z+z+n+n+n+z+n+n+n+z+z+z+z+z+z+M z+n+M a z+z+z+z+z+n+z+n+z+n+n+n+n+z+z+z+z+n+n+n+n+n+z+n+n+z+n+b z+n+n+n+y.y.p.y.n+n+n+n+n+z+M M n+n+M M M M m.n+M n+n+M y.p.y.p.y.y.p.p.y.M p.[+[+[+*.[+*.*.*.[+[+[+*.[+*. +*.*.*.[+[+[+[+[+[+[+[+ + +[+[+t. + +[+ +[+[+*.[+[+*. +[+*.*. +[+*. + +p.[+[+ +[+ + + + +[+t. +t.t.t.Q.}.0 t.p.4+7.*+f+u.u.u.u.u.:+:+:+*+*+;+7.o q.'+#+9+9+X w E+f @.E+R _ j j.v 3 p 3 K p K p K 3 L j.y+j _ z+H.H+.+)+S.s.k w+7+j P P J h+a+]+! #.G i.R.a+` * g - - R.o A+n n < i 2.8+/.t ` q.` * '+8+2.r+i 7.7.7.3+3+i i r+7.7.r+a+R.^.)+X.G+@.1 b z+e. +t.5+ +p.B 7.G.c.b+6 P.$.w.|+: [.] [.", "= = = = = s+x.A 8 8 8 s+= = E = N N = E = = E x.{ A { A x.u.;+B.S.G+]+G k+#._._.#.o G #.o #.#.! o ! ! a+! o _.(+9 `.9 i+( i+( i+5._.3.X a $.& w.6+O w._ 5 ]+r+i 8.*+3+o R.S.! ]+o G _.A+#.#.o o R.o ! ! o o o i A+< 5.5.5.D 8._..+w y.*.*.y._ *.e.1+*.*. +*.*.*.y.*.*.*.y.*.M *.*.*.*._ *.e.*.*.e.*.*.*.*.y.*.*.*.[+*.*.[+*.*.*.*. +*.*.*.*.[+y.y.y.y.n+a n+z+n+n+a y.n+y.n+y.n+n+n+z+n+n+z+z+n+z+z+n+n+a n+n+z+z+z+z+z+z+z+n+n+n+n+z+n+z+z+z+z+z+z+n+z+n+n+n+n+n+n+n+n+z+z+z+z+z+z+n+n+n+z+n+n+z+n+z+z+z+z+n+z+n+z+z+n+n+M M a n+n+m.n+n+n+n+n+z+n+z+n+z+n+n+y.y.n+p.y.n+M n+n+n+z+M n+m.y.p.y.M M n+M m.n+z+M y.M y.y.y.y.y.*.*.y.y.*.[+*.[+[+[+ +p.1+[+*.[+*.*.[+[+*.[+*.*. +[+*.*.[+[+[+ +[+[+ +t.[+ +*.[+ +[+[+[+*.[+ +*.*. +[+[+ + +[+[+[+ +[+ + +t.t. + +t.5+l+0 }.0 t.H )+b+*+f+9 z u.u.>.>.u.u.u.f+:+G.7.2.R.s.Y.,.k - X - s.s.R /+j j.j.$+3 p K p K K 3 $+v w.0 Q.'.$.y.k 9+L.H L.C./+P [ e+j J M.! Z Z #.k+6 ^.3.h+g g g g ` r+7.< n 8._.^.a+` * t * * u+'+^.#._.3+3+3+++#.#.2.R.R.R.2.o 3.a+a+o i.i.i.X.P.b M + +5+t.p.N.q.C+8.++6 P.5+O S [.|.|.} ", "= = x.s+~.x.A 8 8 A A s+N >.s+x.N N x.= = = x.{ 8 { x.N :+7.R.a+G+! Z #.#._.#.#.#.r+#.#.#.#.B.o i.! ! ! ^.o _.D &.z ( 5.5.i+9 &.5._.G+z.z.k $.0 O |+|+w.,+w G+#.< E.Y 4 o ! ! G _.8.< n < F o ! ! ! 8+R.o o r+_.3+5.5.5.b+< r+a+w R y.*.[+*.*.*.*.*.*.*.y.*.*.*. +*.*.M *.*.*.*.*.y.y.y.*.[+*.*.y._ *.*.1+1+ +*.1+1+[+*.1+M 1+*.*.y.*.*.[+*.y.y.*.n+n+M n+z+z.z.n+z+n+M n+y.n+y.M n+n+n+z+z+a z+z+z+n+M n+n+M n+n+n+n+z+z+n+z+z+a n+n+z+z+z+z+z+n+z+a z+n+n+n+n+M n+z+z+z+z+!+z+z+n+z+n+n+n+n+z+z+z+z+n+z+z+a n+n+n+n+n+z+z+z+z+n+z+n+n+n+n+n+z+n+n+n+n+M y.M p.y.y.M m.y.z+M n+n+M m.y.y.y.*.m.n+n+n+b b z+n+n+n+M p.p.y.y.y.y.p.M M y.*.*.*.*.*.*.*. +[+ +*.[+*.1+p.*.*.[+ +*.*. +[+*. +[+ +[+ +[+[+ + + + +[+ +[+[+ +*.[+ +[+[+*. +[+[+ + +[+[+[+ + + +t.t.t.5+5+Q.Q.}.0 C.N.7.G.f+>.>.>.>.= = E E E E = z :+G.C+^.s.C.w+w+,+,+,+J ,+U j [ [ v 3 p 3 p p 3 3 3 v 0 '._ *.M n+z+H.#+L.L.C.J U 7+j P U Y.f ! G k+++8.B.G+M.X Y.Y.g * a+o _.J.< 3+B.R.a+* * u+L.g * 3.o _.3+< D < 8.#.^.a+M.- g L.s.#+h+a+S.i.i.Z X.G+b y. +t.t. +*.p.B )+C+6 c+z+5+|+K.[.k.7 k.", "E x.x.x.A 8 A A s+s+s+>.u.z E = N E E E E x.x.{ A x.>.*+4 ! E+S.G+o B.o #.o #.#.G r+G #.#.#.G #.#.#.r+r+_.7.< 5.5.n < < (+5.{+z 5.G ]+1 1 G+G+5 j |+].L 0 _ H+#.b+f+E.F i o G G 8.< D 5.5.n F o ! ! o o o r+A+< D 5.>+5.++#.@.n+y.[+,+*._ [+e.*.*._ 1+*.y.M *._ *.*.*.*.*.*.*.*.*.*.*.*.*.*.[+*.*.1+*.*.*.*.*.*.*.1+*.*.1+*.*.*.*.*.*.*.*.*.*.M *.y.m.n+z+n+z+z+n+M n+a n+n+n+n+M z+z+z+z+b z+z+z+z+z+n+n+n+z+n+z+z+n+z+n+a n+n+M M n+M n+n+z+z+n+z+n+n+n+n+n+n+M n+z+z+z+b z+z+z+n+M n+m.n+m.n+z+z+z+n+z+z+z+n+n+n+n+n+z+z+z+z+n+z+n+n+n+n+M n+n+n+n+n+n+p.m.y.p.p.M p.n+m.n+n+n+y.n+y.y.y.y.y.y.n+M n+m.n+M n+n+M M n+y.n+n+y.y.y.*.y.y.[+[+[+[+ +*.[+[+*.*.[+1+1+[+ +*.*.*.*.*.[+ +*.[+ +[+ + + +[+[+ +[+[+ + + +[+ +[+[+[+[+ +[+ +[+[+[+[+[+ +[+ + +5+t.t.t.t.t.0 e+0 0 p.q.A+*+f+>.u.>.>.N E x.x.{ { { 4.z *+A+2.'+C.l+P l+U '.'.'./+j j [ d+v $+$+$+$+p $+j.j ,+_ b E+H+! B.B.B.4+'+L.,.J P j j l+- w S.i.G k+W k+G+'+L.J ,.g M.! #.++8.A+++Z a+'+* h+u+- g M.R.]+_.b+D 5.5.b+G f X C.C.U ,+C.C.- '+a+i.i.B.6 X.z+M +t.t. +[+p.N.N.4+X.B a & |+: k.7 7 7 ", "= x.~.8 8 A A s+= = = N >.= = `.N >.= E x.{ { x.E u.*+i )+@.! i.#.++_.Z ]+]+#.#._._.A+_._._._._.< < < < < n n n n _._.W < < {+9 < G ]+(.G W W < X j.].x+o.,+H.k+J.5.*+;+i G _.W < D c i+( 5.3+i R.o o r+_.A+< n 5.D D b+B.H+R [+y.*. +1+1+_ + +*.*.y.*.*.y.M *.*.*.*.*.y.y.y.y.*.*.y.*.1+[+*.*.*.y.*.*.a *.*.y.y.*.*.*.*.*.*.*.*.y.*.*.*.*.y.y.M n+n+a z.n+n+n+n+n+R n+M M M M n+n+z+n+z+n+z+z+!+z+z+n+n+z+z+z+n+z+a z+n+n+M M n+m.M m.n+M n+#+n+z+n+n+n+n+M n+z+n+n+R z+n+z+n+#+n+n+n+n+y.z+n+n+n+z+a z+z.n+z+n+z+n+z+z+z+z+z+z+z+n+M n+M M n+n+n+M m.m.n+M n+p.n+n+n+m.m.n+y.y.n+y.y.y.y.[+m.m.M n+n+z+n+n+n+y.m.y.y.m.y.!+M p.M p.*.p.[+[+ +[+[+ + +p. +[+*.*.1+*.*. +[+[+[+[+[+ + +[+[+ +[+ + + + +[+ + +[+[+[+ +[+[+ +[+[+*.[+[+ +[+ + +[+[+ + + + + +t.t.t.5+t.}.0 /+p.2.G.f+u.u.>.z = E x.x.{ A 8 8 { -+u.;+2.'+C.7+[ e+j l+'.'.0 j [ 0 j.d+d+d+F+[ d+[ e+_ R w P.G+6 ++b+D A+B.R.'+L.J ,.U J k k s.S.]+Z G k+#.S.w - J ,.Y.'+S.i.++++++k+i.E+- g g - u+- M.! #.++< D o+D (+k+H+9+/+j j j l+/+,.h+R.)+B.6 i.X.b [+t.0 Q.Q.Q.t.p.p.N.b n+1+I.|+: k.B+7 |.", "x.x.A 8 A A E = u.>.z N z E = >.>.z `.x.{ ~.x.z :+;+r+o i.i.#.8.(+< ++B.]+6 G k+_.< b+J.++C+A+< D i+( i+5.c 5.5.< _._.#.W j+5.< (.(.n.; W c ( ( ! j j.j.0 J E+o A+n b.3+#.G W < j+(+( 9 {+( n 4 o o _.3+n 5.5.D o+D ++B.}+n+R [+[+*.[+[+ +[+*.*.*.*.*.*.*.*.*.a a *.*.*.*.*.*.M _ *.*.y.*.1+*.*.*.M *.*.*.*.*.*.y.*.*.*.*.*.*.M *.M *. +*.y.y.n+M a n+y.a z+n+n+n+M M a M n+z+M n+z+z+z+z+z+z+b z+z+z+z+z+z+n+z+z+z+z+a n+z+z+M n+n+n+n+n+z+n+z+m.z+n+n+n+n+M m.n+n+z+z+z+n+z+z+n+n+n+M n+n+n+z+z+z+z+z+a n+n+a n+z+n+z+z+b z+z+z+z+z+n+n+n+M M M n+m.M p.n+M M y.n+M M n+m.n+n+y.y.p.y.p.[+y.y.m.M M M n+n+n+y.y.y.y.y.m.y.n+M M M p.y.*.*.*.*.p. +*.*.*.*.*.*.*.*.*.*.*.[+*.[+*.*.*.p. + + +[+[+[+[+t.[+y. +[+ +p.t.[+[+[+[+t.[+t.[+[+[+ +[+[+ +[+ +[+t. +t.5+t.t.0 e+e+p.'+7.*+f+9 z >.>.= E x.A 1.8 8 !.u 4.u.G.C+'+,.7+d+[ e+e+'.'.t.'.j j 0 [ U ,.J ,+'._ _ X P.G+6 k+8.(+o+>+G.++)+R.h+Y.J /+,+k X s.S.G+G+i.i.i.}+L.,.l+,.Y.a+)+B.++8.++B..+#+C.J Y.V - - f ! G W 8.(+D D (+k+1 9+j [ d+e+j '.k w a+i.B.k+k+X.b t.[ y+y+e+[ 0 l+/+m.n+*.5+w.|+: 7 d B+7 ", "x.A { A x.s+= :+f+>.= >.>.N E = N E x.4.x.x.N :+3+#.B.#.#._.++b+>+5.A+i.i.i.G ++b+D f+( ;+4 ++< i+9 9 i+5.i+( ( n _.o o ]+G G 1 5 5 5 c+W 5.{+E.o s.j 0 '.k '+o C+3+n F #._.8.j+< < (+5.5.E.n 3+i _.< D >+( >+D b+A+B.H.R M *.*.*.*.1+*.*. +1+1+*.1+*.M *.a *.M *.a *.*.*.*.a *.*.y.*.*.*.y.y.*.M M a a M y.M y.M y.y.M *.M y.y.*.*.*.y.y.y.M *.y.n+y.n+n+n+a n+M M n+n+n+n+a n+z+z+z+z+z+z+b z+b z+b z+z+z+z+z+!+z+z+n+z+a n+n+a n+n+M N.n+z+n+b m.n+y.n+n+z+n+n+z+n+n+R n+n+n+n+n+n+m.n+n+n+n+n+z+n+n+z+M n+n+n+n+z+b b z+b z+z+n+n+M n+M n+z+p.y.y.n+y.n+p.p.p.n+n+p.y.m.p.y.y.y.y.*.y.[+[+y.y.n+n+n+M M M n+y.y.y.y.n+y.n+n+M M M M *.[+[+[+*.p.*.*. +[+*.[+[+p.*.*.*.*. +[+*. + +[+*.[+ + + + +[+[+ + +p. +[+ + +[+[+[+[+[+ +p.t.[+[+[+ +[+*. + +[+ +t.5+t.t.t.Q.0 t.p.q.++f+u.N >.>.N = E { { 8 u 8 8 8 x.z *+4 * ,.e+d+d+P 0 j 0 '.t.'.j j l+Y.w #+z.R y.R P.]+#.8.b+D o+f+f+D A+2.a+'+- J ,+J k R w E+f H+S.S.3.s.k w+7+w+L.a+B.C+8.b+++k+G+#+l+7+m J g k L.! B.W 8.8.(+c.k+G+E+[+[ j.j.v d+j [+#+H.X.i.k+k+X.n+t.y+3 3 3 <+v j.[ '. + +& O |+: B+q q 7 ", "{ 8 A x.= >.p+*+:+u.>.u.z N -+E E -+x.x.`.u.*+3+r+B.#._.++_.8.D >+*+#.G+.+]+i._.G.9 E E *+7._.D 9 &.9 5.i+c i+( 5._.! G+3.f z.T $.T z.^ 6 (+5.n #.o 3.X R X a+2._.3+3+7._._._._._.< < 5.5.n n i _.3+>+9 ( 9 ( D A+]+s.m.y.[+*._ +_ e.*._ _ 1+e.*.*.y.*.*.a e.*.a *.*.M *.*.a M *.*.*.1+*.*.y.*.M *.M a M M a M M M y.M y.y.y.*.y.*.y.y.*.y.y.y.y.a M M a n+a M n+y.n+y.M n+n+n+z+n+n+n+z+z+z+z+b z+b z+z+z+z+z+z.z+z+z+!+n+n+z+M z+z+m.z+b N.n+n+m.n+n+y.n+n+n+n+z+n+z+n+n+n+n+n+M n+M M z+z+n+n+n+z+n+n+n+n+M n+z+z+z+b b z+z+z+n+n+M m.y.n+y.n+n+m.n+y.n+n+M n+p.M n+y.y.p.m.y.y.n+M y.m.[+y.9+y.y.n+n+m.M y.y.y.p.y.y.M p.n+y.y.p.M p.y.*.*.*. +*.p.*.[+[+[+*.1+*.*.[+*.[+[+ +p.1+[+ +*.[+ +[+ +[+[+ + +[+ +[+[+[+t.[+t.[+ +[+ +[+[+ +*.[+ +[+ + + +5+t.t.t.Q.0 Q.0 /+H 2.G.f+z z >.>.N s+x.x.{ 8 u !.!.{ E u.*+4 4+m e+d+[ P e+'.'.'._ ,+/+U ,+M.S.}+P.b z.b P.6 8.(+D o+u.>.z f+G.i ^.'+Y.C.,+_ U _ k R X X w w #+k /+P e+,.X a+B.++A+b+b+8.i.w w+e+P 7+Y.J C.}+Z ++W 8.8.(+; P.R t.y+L 3 3 v e+_ b E+1 .+)+i.H+y.0 j.3 {.K l K 3 3 [ o.o.w.x+K.[.B+q Q q ", "A A E = u.:+:+*+:+u.>.>.z N E x.{ x.E >.:+n C+#.#.#._.A+_.++++(+D ++G+@.G+G+)+k+D `.-.4.>.F _.D 9 9 5.< < c i+( 5._.3.E+z._ w.w.<.w.$.z.@.Z B.B._.3+4 R.3.a+! _.3+3+n _.3+_._.G o o _._.3+n 3+3+3+5.( 9 z ( D ++)+E+M *._ 1+ + +[+e.*.[+*.1+1+*.*.y.*.a *.*.*.*.*.*.*.y.M M *.a *.M e.y.*.y.*.y.y.n+*.R M y.M M M n+n+M a M y.M *.y.y.y.y.*.n+M y.m.M M y.M M y.*.y.y.n+n+n+n+a a n+n+n+z+z+z+z+z+z+n+z+z+b z+z+z+z+z+z+z+z+z+z+z+n+#+z+z+z+n+b b z+m.n+n+n+z+z+z+z+z+z+z+n+n+n+y.n+M z+z+M z+n+z+n+z+M n+M M n+n+n+n+z+z+z+z+z+z+z+n+y.M n+y.m.y.p.M y.n+p.M p.M M p.n+n+y.p.y.m.p.y.y.y.y.y.[+y.y.n+y.y.M M y.y.n+M n+n+n+M p.!+M M y.M *.p.[+p.*.*.[+ +p.*.[+[+!+ +[+*.[+*.*.1+p.1+p. +[+ + + +[+ + +[+p. +[+ +p.t.[+[+1+[+[+ +[+ +[+*. +[+1+[+[+t. + +t.t.t.t.Q.0 e+p.4+7.*+u.>.>.z >.= E ~.{ 8 8 !.!.!.{ E p+;+2.* m 7+P 7+P l+l+/+_ ,+k k k C.'+! G+1 5 5 z.P.Z (+D D o+f+u.= 9 *+7.2.'+#+J '.'.'.'.'./+_ _ k J k J 7+l+7+w+#+H+)+C+A+b+;+8.i.E+/+e+d+P U /+l+- a+i.k+k+8.8.k+b _ j j.L 3 3 3 v l+R H.H+1 X.X.5 +y+<+{.m+m+F.F.F.3 3 j.D.L ]. .|.d 0.Q d ", "~.x.= p+u.:+*+*+:+u.>.u.>.`.E x.E N u.:+J.#.B.#.#.C+++++_.++#.++B..+H+H+.+X.Z k+>+`.{ E >.n A+D 5.n _.G W < (+5.3+o f z.$.w.6+|+> > O w._ R P.i.8.G.G.7.r+_.< D 5.5.5.5.5.3+i ! ! o o i 4 4 3+n 5.f+z 9 9 5.3+]+w n+y.*.1+*.*.*. +*.e. +*.[+1+ +*.*._ e.*.y.y.*.y.*.a y.y.*.e.M 1+y.*.y.y.y.*.*.*.M M M a a n+a M a n+n+z+M M M y.*.y.M M M n+n+M y.n+M y.n+y.y.n+y.M a M M n+n+a n+n+n+a z+z+z+z+z+z+z+z+b z+z+z+z+z+z+!+z+z+z+n+z+z+#+b b b z+z+z+n+n+n+n+z+z+z+z+z+z+z+n+n+n+n+n+n+n+n+n+z+z+n+n+n+M M n+a n+n+n+z+z+z+n+z+z+n+n+z+n+y.y.y.m.M n+n+n+y.n+y.n+y.y.n+m.m.y.[+y.y.*.*.y.[+y.y.y.m.y.y.n+n+m.n+n+y.n+n+M n+n+n+y.y.y.n+y.M M p.*.y.*.p.*.p.1+*.*.[+ +*.*.*.[+[+[+*. +*.*. +*. + + +p. +[+ +[+ +[+[+[+[+ +*. + + +[+t.[+ +*.*. +*. + +[+[+t.t.t.5+e+}.0 t.p.q.J.f+u.z >.>.>.= x.{ 8 !.!.u !.!.{ -+p+;+4 '+V 7+7+w+,.U /+U C.R #+#+X R a+B.k+6 G+1 2 5 G+8.D D G.*+:+p+:+*+7.2.` L.C. +t.'.'.t.'.j j t.j j l+U l+j k s.@.i.k+k+++8.++)+w ,+[ v v d+j 0 j y.w H+G+)+B.6 H.[+j j.L 3 v x+v [ _ z+H.P.X..+b 5+y+].{.m+@ m+m+l.m+{.L l ]. .l.|.Q 0.0.q ", "E = u.:+:+f+:+o+f+z E N E E E E z f+;+7.G B.#.A+++A+n n A+B.)+G+@.@.@.)+Z B.B.++D f+E = u.G.i A+i o ! ]+_._.< _.]+3.X _ j O x+].].|+S O w.$.#+G+++D E.G.n 5.( 9 9 i+9 9 ( 5._.8+3.3.! 8+o r+3+n ( z 9 ( D A+.+b n+a [+*.*. +_ 1+y.1+1+*.1+1+*.*.e.a *.y.y.*.*.*.*.*.*.*.a y.y.*.*.*.*.y.*.y.M y.y.M M a z+n+M n+n+y.a a a a n+n+M n+n+n+M n+a a M n+a M M y.y.M M n+n+y.n+n+R n+n+a M n+n+a n+n+z+z+z+z+z+z+z+z+z+z+n+z+b n+z+z+z+z+b z+z+b b b z+z+n+n+b z+z+b b b b b z+z+z+z+M M M n+z+z+n+n+z+n+z+z+z+M M n+n+n+n+n+n+b z+z+z+M n+y.y.M n+M n+y.y.y.M p.n+M y.m.n+y.m.p.n+m.[+p.y.*.*.y.y.y.y.y.n+M n+n+M n+n+m.n+z+n+n+M y.!+M M M y.M M p.*.p.*.p.*.p.*.[+p.[+ +[+[+ +[+[+[+*.[+[+ +[+*. + + +p.[+[+[+ +p. +[+[+ +[+ +[+ + +[+ +[+ +[+*. +[+ +t. +[+t.t.t.5+e+0 w+B 2.G.f+u.z >.u.N E x.A 1.8 !.!.!.u { `.u.;+r+` Y.,.,.J U U J U w+k - w b s.3.B.W k+(.n.5 5 1 ++D G.b+J.:.;+Y + 4 q.* g J ,+'.j Q.'.0 0 j j e+j 7+P U /+C.b H+)+6 k+k+++k+1 9+l+v $+$+v j.j.w.Q.Q.*.y.n+#+H.#+/+0 j.3 3 L x+L j.0 [+n+#+b P.z+Q.<+3 m+m+@ @ @ m+m+F. . . . .l.7 d . 0.q ", ">.u.:+o+f+:+*+*+>.z E E x.E z u.*+7.#.i.i.#.k+_._.8.G.o+++]+4+@..+i.k+++(+b+J.C+A+G.o+o+:+*+o o ! ! ! S.o o o ! 3.E+X _ w.j.x+].].l K.|+x+w.R @.k+b+*+5.n ( &.) &.{+&.{+z ( F ` M.M.3.o o 8.n ( 9 ( ( 5.C+S.#+n+y.*.*.*.e.1+[+ +y.*. +1+1+1+*.*.e.a *.a *.*.*.a *.*.*.*.*.*.y.y.*.y.y.R y.y.M y.R y.n+M a n+y.y.n+n+z+z+z+a M y.M M a z+z.M M M a n+M M *.y.y.*.y.y.n+y.M a M M n+n+a n+n+M M n+z+n+n+N.n+z+z+n+z+z+n+b b z+z+b z+z+z+b z+z+b b z+z+m.n+n+b z+b b z+b z+z+z+z+n+z+z+n+n+n+z+b n+z+!+z+n+z+n+n+n+n+n+n+z+n+z+n+n+n+n+n+n+y.M n+y.p.n+n+p.n+p.n+n+y.p.n+M y.y.*.y.y.y.y.p.1+[+*.*.y.y.n+M M n+n+n+z+n+z+n+n+z+n+n+y.y.p.!+[+p.n+M !+y.!+*.M *.p. +*. +p. + +[+[+ +[+[+[+ +*. +1+*. +[+ + +*.p. + +[+ + +[+[+[+ + +[+5+[+ + +[+ +[+ +[+ +t. + +5+t.0 }.e+p.4+7.*+u.z z >.>.N E ~.{ u 8 !.8 !.8 x.z *+J.2.q.h+- C.- k C.k C.J J Y.- #+s.! B.k+G (.n.5 2 1 k+b+D J.7.4 f.f.f.t * g ,.w+/+'.j 0 '.j 0 [ j e+P P 7+l+j '.9+E+@.)+6 k+k+k+P.[+0 j.3 l 3 L v j.Q.w.w.w.I.0 [ '.j d+j.3 3 v x+x+D.w.Q.Q./+[+[+[+Q.D.l .@ @ @ l.@ l.m+F. .l.[.7 d q 0.. Q ", "u.u.:+:+f+f+f+f+u.E 4.E E z u.*+i )+! B.#.#._._.++8.n b+B.@.i.X.i.6 8.D f+u.G.7.^.B.3+b+D ;+2.^.R.S.3.S.3.3.3.M.E+X k _ [ w.x+|+].].].].x+w._ H.^.7.J.n 5.9 q+) &.9 9 9 &.( 3+* - M.R.o A+n i+9 ( ( n r+@.#+y.*.M *.*.*.*.[+*._ +*. +[+_ *.1+*.e.*.*.e.y.*.*.*.*.[+*.*.*.[+e.y.y.*.y.y.*.*.y.M y.M M M n+M M y.M z+M z+n+n+M n+n+z+#+a n+n+n+z+n+a M n+y.y.*.y.y.n+M n+n+n+R n+y.M y.M n+m.z+a z+z+n+n+n+n+n+n+n+n+n+n+n+m.N.n+n+N.b z+N.#+z+N.n+b n+n+b z+z+b b b z+b z+z+n+z+n+n+z+n+n+z+z+z+b n+!+n+n+n+M n+n+z+n+n+n+z+z+z+n+!+n+y.n+y.y.y.y.y.!+y.y.n+y.p.n+y.y.n+y.m.y.[+p.[+[+*.p.*.y.y.M n+n+n+n+z+z+n+z+b n+!+n+n+z+n+M y.*.n+M n+y.p.y.p.p.!+*.p.*.p.[+*.*.*. + +[+ +[+[+[+[+*. +*. + +[+*. +*.*.[+[+[+*. + + +[+ + + +[+[+ +[+[+[+ + + +[+ + +t.t.0 }.e+t.p.^.;+f+9 z >.p+>.= x.{ 8 !.!.8 u 8 -.x.z *+:.2.a+M.X w X w X - - k Y.- L.#+w ! Z 6 X.1 5 2 2 5 6 ++G.b+7.2.` * * g V ,.m U 7+j j 0 0 0 j j e+j P e+U l+'.j $.R n+H..+.+.+X.P.t.[ <+l K 3 3 j.o.w.+.w.I.o.D.<+j.j.j.$+j.$+3 j.D.j.w.w.w.0 o.y+<+v 3 r.m+m+l.@ @ l.@ l.l.l.l.l.} q Q . 0.0.", ">.z :+f+:+f+p+u.`.`.E `.N u.;+A+o )+i.B.#.#.C+o #.++b+#.X.G+i.6 6 6 8.>+9 z :+n ^.^.B.A+b+3+o ! ! ! ! S.S.S.f f M.w R _ j 0 j.x+L L L L L j./+- a+r+7.3+D 9 ) z E.5.5.5.5.E.i - - 3.o A+D ( ( ( 5.n C+a+n+M y.y.y.*.*.*.*.*.e.*.*.*.1+e.1+y.e.*.*.*.M *.*.*.y._ *.[+1+[+*.y.1+*.y.M y.y.y.y.M M y.y.n+*.M z.M y.a z+n+M M n+M n+n+n+z+n+z+z+z.a z+a M M M y.R y.a n+a a a a y.n+m.n+m.y.n+n+n+z+n+z+n+n+n+n+n+M n+n+z+b z+z+z+n+#+z+n+z+z+n+z+b n+b m.z+z+z+b !+z.H.z+b z+!+z+n+z+z+z+z+#+z+#+z+b z+z+n+z+n+n+n+n+z+z+b z+z+n+z+!+n+n+n+n+n+n+y.n+p.m.n+M n+M !+y.n+y.M y.p.y.y.[+[+[+*. +*.y.p.M M n+n+M a n+z+z+b n+z+z+n+n+z+n+n+n+M !+p.M !+n+n+n+p.M y.y.p. +[+[+[+[+[+ + +[+ +[+[+[+[+ +p.1+*.*.[+[+ +[+ + + + + +[+[+ +t. +[+5+[+ +t. + + +[+t. +t.t.t.t.}.0 /+N.C+G.>.z z u.u.>.E ~.{ 8 u !.!.u { { N f+G.7.q.'+s.w X b X b X - L.- M.h+s.s.! k+6 c+5 a T a 5 G+6 J.G.J.2.q.* g Y.,.,.,.U P P P [ P [ e+j j P 7+P U ,+'.t.Q.$.$. +R m.#+H #+t.y+v K l j.[ o.j $.e.e.$.t.0 j.j.j.j.j.L v j.j.w.Q.I.w.O O D.x+]. .{.m+l.l.m+l.@ l.l.@ l.l.} 7 } d q . . . ", "z >.f+f+f+>.z N E E z u.o+J.i i.i.B.#.#.++++++++k+6 B.i.i.i.X.i.i.i.8.>+9 f+o+J..+.+B.C+A+i B.i.o i.! ! ! ! ! a+f E+E+X _ _ 0 [ j.v L v v 0 j ,+'+)+f.#.n ( E.E.n 3+< < 3+i ` g 3.o A+D ( ( ( D b+i.}+n+M *.*.1+*.*.*.*.*.1+*.*.*.*.*.e._ *.y.*.a *.M *.M *.*.y.[+e.[+*.*. +*.*.*.y.*.*.*.R y.*.y.y.M a R *.M M y.a M a n+y.M y.n+n+z+a z.n+n+z+n+y.y.*.*.y.y.n+n+a n+z+n+n+n+y.y.y.M n+n+n+z+z+b z+n+z+n+M M n+n+n+z+n+N.z+#+N.z+n+z+z+z+z+n+n+n+n+z+n+z+b z+b b z+b z+b z+n+z+z+z+z+z+z+b z+b z+z+z+n+n+n+n+n+z+n+b z+b z+z+z+n+n+n+n+y.n+n+n+M y.n+n+n+n+n+n+p.M y.n+n+y.y.p.y.y.y.y.p.y.*.y.y.M M n+n+z+n+n+#+z+b z+z+z+n+!+n+n+p.m.M n+z+z+n+!+y.!+p.M [+!+p.*.[+ +[+[+[+ +[+[+*.[+*. +1+*. +[+[+[+*.*.*.[+ + +*. +t.[+ +t.5+[+t. +[+ +[+t. + +t.t.t.5+Q.0 }.0 p.q.J.f+>.z u.u.p+>.E ~.8 !.8 u !.8 { E >.:+:.f.a+'+#+X R X b E+w X s.M.M.}+s.H..+Z 6 1 5 2 T T z.X.i.C+J.r+q.'+* g ,.Y.m 7+U P j j P [ [ P [ e+P P j w+k k $.$.I.I.w.I.I.0 0 [ [ v 3 {.3 [ '._ _ b E+b z.y.Q.j.j.j.j.v v j.j.j _ _ *.5+w.o.x+]. .m+m+l.@ @ @ @ l.] @ ] ] ] ] ] } q Q 0.0.. ", "u.u.:+f+f+z `.E `.N f+*+J.k+B.#.#._.A+J.;+J.< 8.++G )+G+G+i.@.X.X.X.C+G.G.G.G.J.^.)+#.k+++++#.B.B.G o i.i.i.]+i.! @.E+E+X k _ j Q.[ [ j.j.j /+9+'+R.R.o 3+n n F o o 8+o 8+M.h+s.3._.D ( ( i+*+++)+w y.y.*.1+[+e.*.a *.*.*.*._ *._ *.y.*.*.*.*.e.*.y.M *.*.*.*.[+[+*.*.*.*.*.[+*.*.M y.y.*.y.M *.y.y.R M M *.M y.y.R y.y.M n+y.M n+R n+y.M a n+z+M y.y.y.y.y.M n+n+z.a n+a z.M M n+n+a n+n+n+z+z+b z+n+z+z+n+y.n+n+n+n+n+z+z+n+n+b n+n+n+n+N.n+n+m.m.z+n+z+z+z+z+n+z+n+n+#+z+n+n+z+z+z+b z+z+n+z+z+n+z+n+n+n+n+z+z+z+z+z+b b b z+z+z+M n+!+n+n+n+n+n+p.n+n+n+n+M n+n+p.y.M y.y.y.y.*.y.[+[+p. +y.y.y.M M M n+n+z+n+n+n+n+n+n+n+n+n+n+n+n+n+n+z+z+z+n+M y.y.M p.*.*.*. +[+[+[+ +p.5+[+ +*.*.*.[+[+[+[+[+ + + +[+ +[+ + +[+ + +t.p.t.t. +[+t. +[+t. + + +t.t.t.t.0 }.e+p.)+G.u.z z >.f+a.N x.{ 1.8 !.!.1.{ x.z :+;+r+q.h+L.R R k R R X w X h+3.3.a+3.a+.+i.X.1 2 *.& T *.5 i.C+A+i q.'+L.g ,.,.m J ,.7+P P P P [ F+P [ [ P 7+J L.E+R M $.Q.0 w.O L L 3 3 l {.{.3 l+y.R b E+G+G+X.P.y.0 j.L j.j.j.j.[ ,+X P.b a e.O U.K. .l.l.l.@ l.l.] l.l.@ l.@ ] } d } d q Q 0.. ", "N >.>.u.z N = z >.f+*+A+B.B.B.#._.++J.J.3+b+b+++G G+@.P.H.P.H+P.H+@.X.)+k+++A+r+2.C+6 i.#.B.#.G k+k+G #.#.#.#.o ]+]+]+@.5 f X _ '.j j j j l+/+9+3.* M.8+4 F F /.o ` h+- - g M.S._.n >+f+>+5.3+! w y.*.e.[+_ 1+*.e.*.*.*.*.*.*.*.y.*.*.*.*.a *.M *.*.*.*.*.*.[+[+[+*.*.*.e.1+*.y.M *.M y.M *.n+y.y.M M M *.a y.y.*.*.y.y.y.y.y.n+M y.M n+n+n+a M n+y.[+y.y.y.R R n+n+z+a n+M M R y.M n+a z+z+#+#+z+b b n+n+n+n+M M z+z+z+b z+b b N.z+z+n+z+m.z+n+n+z+n+n+n+n+z+z+z+m.n+z+n+z+M n+z+n+#+z+z+z+z+z+n+z+n+n+n+n+n+n+n+n+N.b n+n+z+z+z+z+n+n+n+m.!+z+z+n+n+n+n+n+M n+n+M y.M n+M y.y.*.y.p.y.y.y.y.y.y.y.M y.n+y.M n+n+n+z+z+n+n+M n+m.n+n+n+n+z+z+M z+n+n+n+p.*.!+*.*.p.5+p. +[+ +[+ +p.*.[+ +[+ +[+ +[+[+[+[+ +*.5+p. + + + +t. + +t. + +t.[+t. +t.t.t. +t.t.5+0 }.0 t.B C+o+>.z z u.p+p+= x.A !.!.8 8 8 { `.:+G.4 ` h+C.C.J C._ k k z.X - s.M.}+a+G+]+B.Z G+E+a & w.w.& z+H+C+J.7.q.'+g ,.,.J J J J m U j P [ P [ [ [ P [ w+C.f S.f 5 a a 1+$.I.D.].l l l {.{.3 w+#+E+H.! i.C+++i.z.'.j.v L v j.d+/+s.@.G+1 P.z+& s l .l.@ l.@ l.] l.@ l.] ] ] |.] ] d d q Q Q Q ", "E E z E E `.E u.f+G.++k+#._.A+A+J.b+D 5.D n < k+C+Z H+w b H.}+H.}+w b B X.)+i ++B.#.B.B.B.i.B.B.i ++#.#.Z Z G #.#.]+]+! @.f f X k _ U l+l+w+C.L.* h+M.! 4 4 /.8+` - m U k X ^._.D >+i+( D A+a+n+R M y.1+e.1+1+*.e.e.*.*.*.*.y.*.*.a *.a *.*.*.*.*.y.*._ [+[+y._ [+*.*.y.*.*.*.*.M y.y.m.y.y.a M *.M *.a y.*.M M y.y.*.y.y.y.y.n+n+n+M n+R m.n+M n+y.y.*.M y.M M M z.n+M n+n+y.M m.M n+n+z.z+a z+z+z+z+n+n+M n+n+n+z+z+z+b z+z+z+z+z+z+n+n+n+n+n+n+z+M n+n+n+n+z+z+n+n+n+n+z+n+n+z+n+n+b m.z+n+z+n+M n+y.n+y.n+z+z+n+n+z+b n+z+n+a n+n+n+z+N.n+b !+n+z+n+n+n+y.M p.n+m.n+z+n+m.n+y.p.*.y.y.y.*.[+*.y.*.y.y.m.y.[+n+y.y.M M n+y.y.n+n+n+n+n+n+z+n+z+z+z+y.M y.*.[+y.*.*. +*.[+[+p.[+[+*.*.*.[+[+[+[+ +[+[+ + +*.[+5+ +p.5+[+[+t. + + +t. +t. + + +[+ +5+t.t.5+e+}.e+p.4+J.f+N E >.u.u.>.E x.{ 8 u 8 1.{ x.E *+J.2.h+,.m l+w+w+/+,+,+k X R w E+f .+i.#.++++6 E+1+w.> |+D.0 9+^.;+J.2.` H Y.,.,.Y.Y.J J m l+P P P [ [ [ F+[ ,.s.@.1 @.@.P.5 b a $.o.L l l K {.{.3 7+}+@..+o r+A+J.k+z+t.o.$+L $+j.v k }+Z 6 X.G+P.1+s U. .l.l.l.l.l.@ l.l.] l.l.] ] } ] d d d q Q q ", "E E E E -+z u.f+b+A+++A+b+b+D D 5.f+f+>+>+c.k+++7.7.)+G+}+a+E+}+G+E+}+m.B ^.C+C+)+i.)+)+i.i.i.B.C+C+G B.i.o ]+#.]+G o ]+1 @.@.3.f - 9+k ,.C.Y.L.h+* M.8+o /.4 8+` g J Y.s.S.k+D >+( ( G.A+a+n+R *.y.[+1+*. +1+1+*.y.*._ *.*.*.y.*.*.*.*.y.*.*.*.*.*.*.*.y.[+*.y.*.*.*.*.*.*.e.*.*.*.y.y.y.M n+y.M a n+y.M *.*.y.*.*.M *.*.*.M *.M M M M y.R y.n+y.n+*.y.y.y.R R n+M n+n+M M *.M y.n+a z+n+z+b z+z+z+z+z+n+n+n+M z+n+b N.b b b #+z+z+z+z+n+M n+n+n+n+n+z+M n+n+n+M n+n+n+n+n+n+n+n+z+n+n+z+z+z+n+n+n+y.m.y.m.n+n+z+n+n+n+n+z+n+M z+a M M z+z+b n+N.z+n+y.!+n+n+n+y.p.n+n+n+z+n+M n+y.y.p.y.y.y.y.y.y.y.y.y.y.m.m.y.*.m.n+n+n+m.m.y.M n+n+M M n+M n+y.M n+M M p.p.*.*.*. +[+[+ +[+ +p.[+[+[+ + +[+[+ + +[+[+ + + +[+5+ +[+ +[+ +t./+5+p. + + +t. +t.t.t.5+t.Q.}.0 0 p.q.G.u.`.`.u.p+p+= x.{ 8 u 8 { 8 { E u.G.4 '+g 7+7+w+J ,+J J J ,+k k X f a+]+_.8.D (+G 5 _ O ].l ].D.e+* i :.r+^.* g Y.J J k X C.J U P [ [ F+F+e+[ [ ,.a+B.6 G+]+G+G+H+b e.Q.D.L 3 K l l K [ L.4+)+B.i 7.J.8.P._ [ L 3 L 3 v ,.4+B.k+c+Z P.n+& <+U.r.m+@ l.@ l.] @ l.@ @ ] ] ] } ] } d d d |.", "4.E E E z f+*+;+++++8.(+D D o+f+f+( z ( ( >+b+8.k+A+7.k+P.b n+N.w z+w H r+A+++B.B.i.B.)+)+B.#.r+3+k+G o )+)+i.o ]+]+]+o G+G+G+S.@.s.X - C.C.g Y.g * ` 8+F 8+8+8+` M.X f ! ++D o+5.>+n r+3.#+y.M *.y.[+*.*. +1+*.*.*.*.*.*.M *.*.*.M y.*.*.*.a *.*.*.y.y.*._ *.*.*.*.*.*.M M M M n+y.M z.y.y.n+M M a M M a M M y.y.y.y.y.y.y.y.y.*.y.y.y.y.R y.y.y.y.M M M M M M a a M R y.M y.y.R n+a z+a n+z+z+z+z+z+n+n+M n+M n+n+z+b b b z+b n+n+n+M n+n+p.M M p.y.n+y.n+M n+M y.y.n+n+n+z+n+z+z+n+n+n+n+n+M n+n+n+y.y.p.n+n+n+n+n+n+n+n+n+n+n+y.n+n+n+z+z+z+!+z+n+n+M m.y.n+M n+z+a n+z+z+!+n+n+n+y.n+y.y.m.M y.y.y.y.[+*.*.[+*.y.y.y.y.y.m.y.M M M n+M n+M n+M y.*.*.y.*.*.*.[+[+p. + +p. +[+*. +*. +[+*. + +[+[+t. + + +p.5+ +[+5+ +t.t. +p.5+t.t.[+5+t. +5+t.t.5+t.e+}.e+t.N.r+*+z N z >.p+p+= x.8 8 8 u 8 { x.`.:+J.2.'+,.,.,.C.k X R R k 9+C.C.Y.#+R.#.< o+( >+W 1 _ O K. . .L j.L.q.2.2.q.a+s.9+k k k X k C.l+P [ d+d+d+d+d+d+7+M.B.6 i.i.Z Z X.P.*.Q.o.y+j.v v L 3 v w+'+^.B.7.7.7.J.X.y.j j.3 L 3 v P * q.k+X.)+X.n+ +o.x+l . .m+l.l.l.l.@ l.@ l.] ] } } } } ] [.: ", "4.4.E z u.:+D 8.8.8.8.(+D o+o+f+f+9 f+>+D D 5.b+A+J.B.G H+w w s.H+B .+B.G.D D k+B._.B.#.++3+++C+++#.i.B.)+! ! )+! ]+]+]+o ! G+]+! S.'+L.L.Y.Y.- - 3.8+o /.4 /.o 8+R.^.#.8.(+>+( 5.n _.}+n+M M *.*.*.y.e.*.*.*.e.*.M *.*.y.M *.y.*.y.*.*.*.*.*.y._ y.[+_ [+*.*.*.*.y.*.a *.M M M M M a M M a *.n+M a n+y.y.y.y.*.y.y.y.y.*.*.y.y.y.*.y.y.M *.m.[+[+y.M y.y.y.y.*.y.y.R y.y.y.a M y.y.a a n+z.n+n+z.z+n+n+M n+M n+n+n+z+z+z+z+b z+n+n+p.M n+M p.n+n+M m.y.n+y.y.M z+n+m.n+n+!+n+z+z+n+b n+z+M n+n+M y.y.n+n+y.m.n+n+n+m.M n+n+n+n+p.y.m.n+z+z+b z+z+n+z+n+n+M y.y.M M n+z+z+n+n+n+n+n+n+n+y.M y.y.M n+y.y.*.n+y.y.y.y.[+[+[+y.y.y.n+y.n+n+M n+y.y.*.M p.y.y.*.*.*. + + + + +[+ +p. +p.*.[+*. +[+ + + +[+t. +5+5+ +[+ + +[+[+ +p.}.[+ + +t.t.[+t.t.t.5+t.t.Q.}.0 0 ,+4+7.f+N -+N p+p+>.E ~.1.8 1.8 { { E u.*+:.4+Y.,.,.C.9+X #+#+#+b X - k J - a+r+o+9 `.9 D c+_ j.l .F.].[ p.4+q.a+a+'+#+R R R w w z._ l+[ d+v v $+$+v d+P g 2.C+i.)+i.)+)+X.n+$.e+/+w+/+e+y+L L [ C.3.q.2.i i i ! m.'.j.j.3 <+v v C.'+^..+.+.+H.M 5+e L U. .m+m+l.l.l.l.l.l.@ l.] ] ] @ |.: .K.", "`.>.9 o+G.A+A+8.G.o+>+D o+o+o+o+( f+( >+b+8.8.8.G X..+)+.+}+B 4+R.@.4+7.f+f+9 D b+8.8.A+b+b+< b+;+C+)+B.r+B.! )+! ! Z G ]+o ]+G+o ]+! 3.X L.- * M.8+o F 8+/.o f.o i _.< 5.5.>+>+J.)+H.z+M M y.[+*.*.*.1+1+e.*.*.M M y.*.*.M *.M M a *.*.a e.*.*.y.*.y.*.*.y.y.y.[+y.y.y.n+y.M y.M n+a n+y.n+y.y.n+a M n+M n+y.[+[+R y.M M M y.y.*.y.*.y.y.M n+n+y.y.y.y.M *.y.[+[+*.M R y.y.n+*.M M n+a M n+z+M n+n+n+R *.y.y.M n+n+n+z+z+z+n+n+z+M n+y.M M n+n+m.M y.y.y.y.p.M M M M n+n+z+z+N.z+z+z+n+n+M n+n+n+n+m.n+n+n+y.n+n+n+n+y.n+y.y.M y.M y.m.n+n+z+z+n+n+z+a n+M y.n+y.M m.M z+z+z+z+z+a n+n+M y.y.y.M M n+n+y.n+*.y.y.[+m.y.y.y.M y.n+n+n+n+y.n+n+M y.y.*.*.[+[+ +*.1+ +*.p. +[+ +*.*.5+*.p.5+p. +[+ + + +t.p.5+ +[+5+ +p.5+t.t.[+ +[+t.t. +[+5+t. +t.t.t.t.0 }.0 t.p.^.G.f+z N z :+p+= x.A !.8 u 8 A { N f+;+2.* ,.w+C.X #+w f E+E+w #+- - J Y.M.#.n 9 `.&.i+G z.O K. .F.l j.w+'+^.'+H s.X 9+R z.X E+b _ '.[ v $+$+' ' $+$+v 7+h+4+.+@..+.+4+.+b /+/+#+}+b [+0 y+<+j.l+M.8+2.q.^.q.a+#+'.0 0 e+[ [ v 7+h+'+4+'+B H.n+*.I.<+L ].F.F.m+m+m+m+F.m+m+l.l.@ l.m+m+K.K.S ", "f+o+o+J.A+++8.G.( z 9 f+o+G.G.b+G.o+D o+D b+A+++C+#.^.^.^.)+.+^.C+^.C+*+9 9 9 z 9 D ++8.b+b+b+b+o+< C+C+A+#.)+^.! )+o Z o G #.o Z ]+! a+M.M.* M.8+8+_./.o /.o 4 3+n 5.o+( >+D b+B.E+b n+n+R *.e.e.e. + +1+*.*.M M a *.*._ y.*.*.y.*.a *.*.y.M y.y.y.*.*.M *.*.*.y.M *.*.y.M y.M n+y.n+M M a y.a y.M n+a n+M y.R R y.y.y.y.y.M *.*.y.y.*.*.y.y.y.M n+y.M *.*.y.M y.y.y.y.y.y.*.y.y.9+*.y.n+M y.M n+M M y.y.y.M y.M M z+n+z+z+n+M M y.M M p.y.y.*.M y.y.*.m.y.M y.y.n+n+n+z+z+z+z+!+z+z+n+z+n+M n+M n+M M M n+n+n+n+y.y.n+M n+y.p.M m.n+n+n+n+z+m.z+n+n+z+n+p.y.y.y.y.M n+M M a a z+n+M M y.p.n+n+n+n+n+M y.y.[+y.y.y.*.y.y.n+n+n+n+n+M n+M y.n+p.y.y.y.*.[+[+*.*.*.5+ +[+ +[+ +p. +*. +*.[+[+ + +[+[+[+}.[+t.5+[+t.5+ +t.5+[+ +t. + +[+t.t.[+ +t.t. +t.Q.Q.e+}.l+B C+*+z N z u.p+u.N x.{ !.!.8 { -.x.N f+J.q.g 7+w+k 9+X E+P.@.@.E+b X k w+U s.o b+( &.9 i+k+E+[ l m+l 3 3 e+L.'+s.H - 9+R _ R R E+b k j d+$+$+3 3 p p 3 $+v 7+V L.L.L.L.s.N.b [+C.a+.+P.M 1+w.j.O j M.2.o o R.E+#+C.t.'./+/+/+e+e+7+Y.h+h+#+H #+z+1+Q.o.D.<+]. .m+F.l 3 3 l l l F.m+ . .K.K.S S ", "b+A+++k+k+++8.D f+`.9 i+5.(+b+8.J.G.b+b+b+8.b+J.++++++J.n 8.C+C+J.A+8.G.9 9 9 f+o+D k+k+A+D (+n G.b+++A+++A+++B.^..+o Z Z #.G o #.B.o o ! M.M.3.o 4 F /.o o i 3+(+( f+>+( >+3+)+}+n+M M M y.y.*.y.y.*.*.*.*.*.*.*.*.*.M *.*.*.a e.*.M *.*.y.M y.y.*.M y.*.*.y.*.y.y.M *.y.y.M y.M M z+n+y.M y.M n+M y.n+M M M y.y.R n+y.y.*.M y.M M *.M M M *.y.*.y.y.y.y.*.y.y.y.y.*.*.y.M y.M *.[+y.*.y.M n+*.M y.y.y.y.m.M n+y.y.M M M n+n+n+n+m.n+M M M y.y.y.y.y.*.M *.y.y.*.M M z+z+z+b z+b b z+n+n+n+y.m.M n+n+n+n+n+n+m.n+n+y.p.y.y.y.p.M n+n+M M n+n+n+n+z+n+n+y.n+y.y.p.n+M z+n+n+z+n+a z+M y.y.M a M z+M z+n+M n+y.y.y.y.y.[+y.y.n+M n+z+M z+n+n+z+a y.y.[+y.p. +[+ +!+ +[+ + +p.5+ + +*. +p.5+[+[+ +[+ +[+ + +[+t. +[+5+t.[+t. +t. + + +t. +t.5+5+5+t.5+5+0 0 }.e+p.q.J.f+`.z u.:+:+>.E { 8 !.!.!.{ { -+u.*+C+4+,.7+l+C.X #+w E+H+S.E+w X k ,+l+- ! ++D ( i+D i.E+j L l l 3 $+v 7+Y.,.C.,./+/+'.'._ k z.R '.0 v $+p p 3 p 3 $+p v d+d+e+e+7+w+C.L.,+,+4+k+1 z+*.& w.O j a+r+]+! S.#+*.'.'.'.k w X ,.,.C.H #+L.H R 9+#+1+t.I.D.<+L ].l L j.[ /+j [ o.x+].l ].K.K. .K.", "B.B.B.C+A+b+b+(+5.i+D D b+b+8.++++++A+J.G.J.A+A+;+b+J.A+J.A+J.++C+C+A+D o+G.G.8.++++k+Z #.8.8.(+b+A+A+8.b+A+++B.S.^.)+! B.#.#.G #.Z i.]+! ! 3.3.o o _.F f._.3+n ( z 9 ( D < B.E+z+z+R n+R M *.y.y.*.y.*.y.a *.M M a *._ *.*.M _ M a *.*._ y.y.M y.M M *.a M M *.*.*.y.y.y.y.y.y.M M y.M M y.y.M *.M a y.n+y.y.a n+y.M y.M a *.*.M *.M e.M *.M M y.y.y.y.y.y.*.*.y.y.y.y.[+y.y.m.*.y.y.y.y.y.y.y.n+y.*.y.y.y.m.y.n+y.n+M n+y.y.n+M M y.y.n+y.y.y.M p.M p.y.p.*.[+y.y.n+n+z+z+!+b z+z+z+z+M M M y.y.M M z+n+n+n+n+n+M p.y.y.y.n+n+m.n+M n+n+z+n+z+n+n+p.y.n+y.y.M n+M n+m.M y.y.n+n+M M y.*.*.M n+M z+n+n+m.y.y.y.y.[+y.y.y.M a n+z+n+n+n+M M !+p.!+p.[+[+[+*.[+ + +p. +[+5+[+[+5+p.5+ +[+[+5+p. + +5+[+ +t.[+ + +t.[+t. +[+ +[+ + + + +t.[+[+t.t.5+t.5+0 0 0 l+H C+*+>.`.N u.:+p+N x.A !.!.!.u 8 { E u.G.2.H w+F+w+C.R X X X s.E+f w R - J J 9+}+B.A+D D 8.! s.U [ $+3 3 $+$+v F+7+P e+[ [ [ [ [ j J /+j [ j.$+3 3 3 3 $+3 3 3 3 $+$+$+$+d+7+/+,+/+a+B.6 z.T I.O D.Q.S.++B.G+H+z._ t.Q.,+#+a+E+k J * R.H.9+w #+R n+_ Q.o.o.j.x+l ].j.'.#+E+P.z+$.w.D.|+].K.K.: .", "k+6 B.++b+G.G.(+b+D D 8.7.J.++++A+++C+++G.G.b+8.A+J.G.b+A+b+G.b+8.A+b+J.b+G.8.6 i.)+C+C+)+C+A+8.A+++k+8.8.A+C+B.)+! 2.i.#._.r+_._._.B.#.#.o o o o o F _.F < n ( 9 9 f+( A+i.H.w z+z.n+a y.*.*.*.M *.y.*.*.*.*.M *.*.M M *.*.*._ *.M M *.*.M _ M y._ M *.M *.M a *.a a *.*.y.M y.y.M y.n+M y.y.M y.y.M y.R M y.M n+n+M y.y.M M *.y.y.M *.y.M *.M *.y.*.y.[+y.*.y.*.y.y.y.y.y.*.[+y.*.y.*.y.*.y.*.M y.y.y.y.y.y.y.m.y.n+*.y.y.y.m.m.M y.y.y.y.y.*.y.y.*.*.M *.y.[+y.M y.n+!+z+z+z+!+n+n+n+M y.y.y.p.y.n+M z+n+n+n+m.M M n+p.M y.M n+!+n+z+n+n+n+n+n+n+n+M n+p.y.M n+n+M n+M n+M M n+n+y.*.p.y.*.n+n+M M M n+n+y.y.y.p.*.y.n+n+z+a z+a M n+n+M M M y.y.y.[+[+[+[+[+ + + +*.[+ +[+ +[+5+[+ + +p.5+ +p.5+[+t.[+5+ + + +t.t.t. + + + + +t. + + +t. +t.t.Q.t.}.e+}.C.4+J.p+`.= z :+:+p+N x.1.u !.8 8 { { z :+J.q.L.7+7+/+k R X X R - - - - 9+C.k C.R w }+)+i 7.i ! M.J j [ j.$+$+$+3 $+$+$+$+v v j.j.v j.[ [ [ j.v v v v v v v v v v 3 3 p 3 3 v l+l+/+/+#+)+Z P.T C O > w.a+8.k+H+E+R +Q.0 /+X ^..+X Y.* o G+R B b y.R 1+& o.D.D.<+<+<+[ p.^.Z Z G+z.& w.|+].K. . . .", "A+b+b+b+G.b+b+b+D D b+b+b+A+A+A+++++C+7.J.G.G.++B.B.A+8.G.b+b+A+A+G.G.G.J.8.C+i.)+C+C+A+b+++++J.A+++A+++C+C+++++++r+B.B.B.#._._._._.#.o G o o o o _.3+< 5.5.( 9 z f+5.b+B.E+P.b b n+n+n+n+a M M M R y.y.*.a M *.a y.*._ y.*.*.*.R z.z.z.z.z+z.R M 1+*.*.*.M M y.y.*.*.y.M y.y.y.M n+y.y.m.M y.n+y.M M y.*.y.M y.n+y.*.y.[+y.*.y.y.y.y.y.y.*.y.y.M M M *.*.*.*.*.*.*.y.y.y.y.y.y.*.y.*.M y.y.y.y.*.y.*.*.*.y.m.y.y.y.y.y.n+y.M M y.M M y.M y.y.p.*.y.y.y.*.p.*.p.y.n+n+z.z+z+z.z+z+a z+a m.m.y.y.y.M n+z+z+z+!+n+z+n+n+M M p.y.n+z+z+z+n+!+z+z+z+z+n+M y.M m.n+n+M n+m.n+n+n+y.n+M y.y.y.y.y.y.y.y.y.n+n+y.y.y.y.y.*.y.*.y.M M n+M y.n+y.y.n+n+n+p.p.*.[+[+*. +p.*. +p. + +t.t. +[+ +p. +5+[+ + +5+[+t.t.[+t.[+5+ + +t. + + +t.5+ +t. +5+ +t.5+t.5+Q.0 y+e+e+p.2.G.u.E `.>.:+:+p+E { 8 !.8 u 8 A 4.N *+i 4+C.w+l+,+k R R R R k 9+9+C.J J Y.X X w E+w H+a+R.M.s.- J j [ v v $+$+p p ' $+3 $+$+$+v v v [ [ [ d+d+[ v [ [ [ [ j.v j.v <+$+v l+l+'.'.y.w S.@.z+$.O > |+O L.C+k+@.#+_ Q.0 o.j k a+^.s.J u+2.X.b }+H+n+*.[+Q.s o.D.<+<+y+t.#+C+b+8.6 5 & w.|+S : K.: K.", "b+b+8.J.8.b+G.D D o+G.G.b+8.++k+C+C+J.++A+G.b+k+i.C+:.A+G.b+G.b+b+b+b+b+b+++C+8.C+C+++b+(+D G.D o+G.b+J.++A+A+++++_.r+r+#.B.k+_.++_._.#._._._._._.< < 5.( ( ( i+f+5._.i.P.b b b z+n+z.a n+M a y.M *.y.y.*.*.M y.*.*.*.*.1+*.a a z+b P.5 P.5 5 z+R e.1+*.y.y.*.*._ y.*.*.1+y.y.*.*.y.y.*.y.n+y.y.R M y.y.M *.y.*.y.y.y.y.y.y.*.[+y.m.y.*.y.*.*.*.*.y.*.M *.*.*.y.*.y.y._ y.*.M y.*.y.y.a *.[+*.M y.y.M M M y.y.y.y.y.p.[+p.y.y.p.n+n+y.p.*.y.y.y.y.y.p.y.p.[+*.y.[+n+y.n+z+n+n+n+n+M n+M M y.y.y.m.M z+z+b z+z+z+z+a p.m.y.p.n+n+z+z+z+z+z+b z+z+n+n+m.m.n+n+n+z+z+M M n+n+z+y.m.y.y.p.[+[+y.y.y.y.y.y.y.y.n+y.y.y.y.y.*.M n+a M M *.M M *.M M M M *.*.*.[+[+*. +*.p.5+ + + +p.5+ +5+5+[+t.[+ +p. + +[+ +t. +p.5+5+t.t. +5+5+t.t.5+t.[+5+5+[+t.5+t.Q.Q.}.y+l+N.4 :+E E N u.:+:+p+E x.{ 8 u 8 { { x.z *+r+* ,.w+J R R z.R R R R R k C.J Y.- s.#+E+E+P.H.s.'+* * * - J P d+v p $+p $+p $+3 $+v v d+j.[ [ [ 0 [ [ j j 0 '.'.'.j 0 0 [ j.d+[ l+[+ +'.R E+H+b e.+.O > S O k o B.@.#+/+0 w.v j.l+Y.M.s.C.g R.S.b w H.b M +Q.o.D.D.<+o.o. +N.i D (+8.c+e.<.D.].K.K. . .", "b+G.J.b+J.b+G.D G.(+D o+b+++++C+C+++J.++++;+o+8.C+C+J.8.b+*+o+G.8.b+(+b+8.C+C+C+J.o+A+A+b+D c.G.o+>+D b+++8.8.A+++++A+_.C+C+C+_.++_._._._.8._.3+3+n 5.9 9 9 9 ( D 3+i.H+H.P.b b z+z+n+z+R R n+R y.y.y.M M *.*.*.a *.*. +t.1+*.M z+z+z+z+z+z+z+a e.$.1+_ *.*.y.y.*.1+1+*.*.M *.*.*.*.*.y.y.y.R y.y.n+M y.M y.y.M M *.*.y.[+[+y.*.*.*.*.M y.y.*.y.*.y.y.*.*.*.[+y.y.*.y.y.*.[+y.*.*.y.y.*.y.n+y.y.*.*.*.*.*.M y.y.y.*.[+y.*.p.y.M y.y.*.M p.p.M p.y.y.*.*.y.y.y.y.y.y.y.M R n+a y.n+m.y.y.y.*.y.y.M z+a z+z+z+b b z+n+y.M M y.y.n+n+z+z+z+z+z+z+z+z+n+n+n+n+z+z+z+z+z+z+n+n+n+n+M p.*.*.[+y.*.*.[+y.y.[+y.p.y.y.[+p.y.y.y.M *.M n+M M *.*.y.y.*.*.p.*.[+*.[+ +p.*.5+[+5+p. +5+ +[+[+[+5+p. +t. +[+5+p. +5+ +5+ + + +t.5+ +t.t.t.t.t.}.t.t.t.t.}.t.5+Q.y+0 e+p.q.J.f+E E z :+:+:+>.x.{ { { { { 8 { -+>.;+2.g ,.w+C.X E+E+b b b X R R - Y.Y.- L.s.#+E+a+H+H.3.R.` ` ` g ,.d+v $+p p p 3 v j.d+[ [ 0 j 0 j j '.'./+/+/+_ _ _ ,+'.'.'.0 '.j 7+C.R _ +9+P.G+z.$.<.S S S w.R .+)+^.w ,+j j.j.j.[ l+Y.Y.J ,.* a+}+w w b y.1++.o.<+D.D.y+Q.y.4+C+G.D 8.6 z+Q.|+S S . .K.", ">+D b+J.J.b+b+G.o+f+o+b+8.C+++C+7.C+++C+C+J.:+o+G.b+G.G.8.o+o+o+8.C+k+i.J.J.b+J.J.b+G.*+o+G.(+b+D G.b+A+++A+b+A+++++A+3+A+A+_.++++++_.A+8.< < n (+5.( z z 9 9 n _.)+@.P.P.b b !+z+z+n+z+M n+M z.y.y.y.y.M *.M _ a a *._ t.Q.t.Q.t.5+Q.Q.Q.Q.5+t.Q.t.1+*.*.*._ y.*.y._ *.1+*.*.*.y.[+*.y.y.M M y.y.y.y.M M *.*.e.M y.y.y.y.*.*.y.n+y.y.y.y.y.y.y.M e.*.y.*.e.*.y.y.y.y.*.y.*.*.*.e.*.y.y.y.y.y.M y.M y.y.y.y.*.*.y.y.*.y.[+*.y.n+n+y.p.M *.*.M *.[+y.*.p.[+p.*.y.y.n+n+y.y.y.y.*.y.m.[+[+y.[+y.y.M n+a n+n+n+n+n+n+n+n+y.y.n+n+n+n+n+n+z+z+b b b n+n+M n+z+z+z+z+m.z+n+n+z+!+M y.y.y.y.p.y.n+M y.y.m.*.y.*.y.y.[+y.[+y.y.y.y.y.m.m.y.y.*. +[+*.*.[+*.[+*.[+[+ +*.[+[+ + + + +[+t. +[+[+5+ +p.5+[+ +5+[+ + + + +t. + +t.5+t.t.t.}./+t.t.5+5+t.t.t.Q.0 }.y+0 H C+*+`.E E u.:+:+:+N x.~.A { { x.{ { -+u.;+r+* ,.C.X E+E+5 b X b E+X R k J - - L.L.L.X a+! )+2.r+o 8+R.- J F+v $+p p $+v [ [ [ 0 j j _ '._ _ _ _ _ k k _ _ _ k _ '.U '.U '.U - #+R 1+k w P.2 & 6+> S S w.E+G+E+}+M.,+j [ j.v v d+e+P P l+g s.a+@.w #+n+ +Q.w.x+x+D.o.Q.n+.+A+G.o+b+6 !+& D.S K. .: .", "o+D A+b+b+G.o+:+f+f+u.o+G.++C+C+C+++J.J.J.G.o+o+D o+f+c.G.G.G.G.++++++J.G.o+o+D G.b+b+o+D b+b+b+G.b+J.A+b+J.A+A+b+J.b+< 8.++3+8._.8._.8.3+< D D 5.9 z z 9 ( 5.A+)+1 H+H+P.P.b b b z+z+n+n+R n+M R *.R M y.M n+M *.*.*. +t.t.o.o.y+y+<+o.<+y+o.I.Q.$.1+*.*.*._ *.*.*.*.[+[+*.R [+y.y._ y.y.y.n+M M y.y.*.*.*.*.y.*.y.*.y.*.*.y.y.*.y.y.*.y.y.y.*.*.y.M M *.y.*.*.*.[+*.*.*.[+y.*.y.y.y.y.y.y.y.n+y.y.*.y.*.M [+y.y.y.y.y.*.y.M y.y.y.*.M M p.*.p.*.*.y.y.y.y.y.y.9+y.*.y.y.[+*.M *.[+[+y.[+p.y.*.y.y.M M R M n+n+n+y.y.M y.y.*.y.y.M n+a z+z+z+z+z+n+n+n+z+z+z+n+z+n+n+n+n+n+n+n+[+p.[+y.n+n+n+n+*.*.y.y.y.[+y.[+[+y.p.[+y.y.y.*.*.*.[+*.[+[+ +[+p. +*. + + +p. + + +p. + +[+ + +t. +[+ +5+[+[+[+ +[+5+p. +t.t.5+ +5+ + +5+t.5+[+}.t.t.t.t.5+Q.Q.Q.o.}.y+l+N.7.:+-+E E >.*+:+>.E x.{ { x.x.x.~.{ x.f+;+2.'+g - s.E+E+5 X z.z.b b k - Y.Y.Y.g L.9+Y.'+i.#.7.3+F o 8+* J e+d+$+p $+v [ 0 j j '._ _ _ k y.k _ k k _ y.k _ k U _ U _ U _ U ,+9+s.R _ $.y.R y.<.> S S ~+w.w i.P.E+}+k /+j 0 j.d+d+d+[ d+P Y.#+.+i.H.b n+ +& s x+x+<+y+t.m.C+G.f+f+D G b & O ].K.K.K.K.", "f+D b+G.G.o+o+o+f+f+f+o+o+o+G.G.G.J.o+f+f+f+>+D G.o+f+o+G.D o+D J.J.G.o+o+o+o+c.++++7.J.c.b+D D D b+b+b+G.b+b+D D b+n b+< 8.3+8.++_.++8.< < 5.>+9 &.9 z 9 n k+X.X.P.P.H.P.P.H.H.b 5 z+b z+a z+n+z.M M y.*.y.R M y.M *.1+$.'.Q.I.w.o.o.o.o.o.I.Q.$.[+1+*.y.*.*.y.*.*.*.*.*.*.y.[+y.M y.y.y.M R n+M y.y.*.*.M 1+*.*.y.*.*.y.[+y.[+y.y.y.*.y.[+y.*.*.*.M M *.*.*.*.y.*.y.y.y.*.y.*.*.y.*.y.y.*.*.M y.p.*.y.*.M *.y.y.y.[+y.p.y.M y.y.p.*.y.*.*.*.*.y.*.m.y.y.y.y.y.*.y.y.y.y.y.y.y.M [+*. +[+*.*.*.*.y.[+y.*.[+y.y.y.y.M M y.y.*.y.[+y.n+M n+n+n+n+n+n+M n+z+z+z+n+n+n+n+n+z+n+M M y.*.*.y.n+n+n+z+n+M y.y.y.[+y.*.*.*.M y.M M n+y.*.*.*.[+ +[+ +*. +[+ +*.p. + +*. +p.5+ + + + + +p.5+[+[+ + + +[+[+ +[+5+ +p.5+t.p.}. + +t.t.5+t.t.t.}.t.5+t.t.}.0 }.y+y+/+4+G.z x.-+z :+*+:+N x.x.x.4.x.E E x.{ -+u.G.2.'+* - M.f f E+z.k _ k k J J J J U m m w+,.h+2.7.3+< 3+i o u+J F+v $+3 $+d+0 j '._ _ k k _ R _ k y._ _ _ _ U /+j U j j j j '.U k s.f #+/+0 0 Q.0 O > 0+0+~+|+k .+H+N.a+#+_ U j 0 [ [ d+j.d+P '+#+a+C+H+H.#+[+& I.<+D.<+y+l+#+C+o+i+9 i+; !+& O S K.K.K.].", "f+i+o+o+f+f+f+f+o+f+o+o+o+o+o+f+o+{ ) c.o+c.o+D f+) 9 9 o+o+o+c.o+o+D o+D D o+c.++J.k+C+C+b+D G.o+o+G.G.b+b+b+b+G.D (+D b+A+8.3+8.8.< b+n D >+( 9 &.9 ( 5.k+G+.+H+1 1 H+H+P.P.b P.b b z+z+z+n+z.n+z.R a a M y.y.M y.y.y.[+[+ +$.t.Q.I.Q.& 5+$. + +1+*._ 1+*.*.*._ *.*.*.*.e.y.*.y.y.M y.*.y.a y.y.y.y.y.M *.y.y.*.*.y.M 1+y.[+y.y.y.M y.y.*.y.M y.y.*.*.M *.*.y.*.y.y.*.[+y.*.y.M y.M y.y.y.y.M *.M M *.*.*.[+[+y.y.y.*.y.y.p.M y.y.n+y.y.p.y.y.y.y.*.p.y.y.n+y.y.y.1+y.y.*.[+[+[+y.*.y.*.*.*.y.y.y.m.[+*.y.[+p.y.M p.y.*.[+y.[+y.y.*.y.M n+y.n+M M n+n+n+n+n+n+n+z+m.z+n+n+n+n+y.m.y.m.n+n+z+n+z+n+M y.*.*.*.y.y.y.y.y.n+n+M n+M M +*.[+[+[+ + +[+*. +*. +[+[+ +[+ +[+[+ + +5+p.t. +[+ +p. +5+p. +[+t.5+t.[+5+ +[+t.5+t.t.t.5+5+t.t.Q.Q.0 t.Q.Q.y+y+y+p.C+*+&.x.E >.:+*+p+E ~.{ { ~.-+x.x.4.x.E f+;+4 R.M.M.M.M.f w X k J /+U U U U 7+7+P P F+P Y.^.3+n 5.3+_.R.X m [ $+3 $+$+[ j j '.k k k k k _ k _ _ '.U '.j [ [ [ [ [ [ [ [ P j Y.M.w R '.j.D.].l .[.0+k.: K.y+- E+w a+E+X k J U j j j j e+P }+z+w ++X.H.n+*.t.I.o.D.<+s 0 H J.o+&.9 i+W P.5+O |+K.].].|+", "z 9 9 o+f+f+f+f+o+o+o+o+o+D o+o+f+9 9 i+o+b+G.o+`.) &.9 f+o+o+G.D o+o+o+8.C+G.f+G.*+b+8.7.G.(+G.o+o+D b+b+G.G.8.b+b+b+b+D b+b+b+3+b+n D >+9 9 9 9 z 9 D _.P.P.1 H+B 1 H.H.P.P.H.P.H.b b b z+z+z+z+z+n+n+z.a n+*.y.*.*.*.*.y.*.1+e.1+$.$.$.1+1+*.[+*.e.[+*.*.*.*.y.*.y.y.y.*.y.y.y.y.M M a *.*.M *.*.y.y.M M *.y.[+e.y.n+*.*.[+[+*.y.*.*.y.*.y.*.*.y.y.[+M *.[+y.*.*.y.y.y.y.*.*.*.m.y.M y.*.[+*.y.M y.y.*.*.*.[+y.*.y.y.p.y.y.y.y.y.p.M y.y.M y.p.y.y.p.y.y.y.y.y.y.*.*.[+*.*.*.*.y.[+y.p.*.y.y.[+*.[+[+*.[+[+[+[+y.*.y.*.[+y.y.[+*.y.y.y.y.*.y.y.M a n+a n+y.n+n+n+n+n+a M y.y.y.y.y.M M n+a n+M z+M y.y.[+[+*.p.y.m.n+z+n+M M *.*. + +[+ +[+ +[+[+[+*.*.p. + +*. +p.5+ + +[+t.5+ +p.5+ + + +[+5+[+ +[+[+t.t.t. + +t.t.t.5+t.t.t.t.Q.t.t.Q.Q.Q.}.y+o.0 H i p+x.4.N :+*+*+N x.8 8 { ~.{ E { { -+E f+J.r+R.3.M.3.M.M.f X k J U l+P P P F+d+d+v d+P L.! A+*+o+n _.R.- P d+$+p $+v j U _ j k k _ _ J /+U '.'.j [ [ [ [ d+v d+v v d+v d+d+m M.w y.Q.j.]. .[.7 q t+D+D+ .K.d+w+C.s.}+E+X k k J _ j U j J '+P.w )+X.H.#+n+[+I.o.y+D.o.t.p.4 :+9 9 i+W !+& D.|+x |+|+|+", "f+f+f+z f+f+u.f+f+o+o+o+o+G.o+o+o+f+i+o+o+o+:+f+u.9 -+&.9 9 f+o+o+o+o+o+f+c.G.f+o+f+f+o+o+G.b+(+G.D G.G.G.b+D D J.b+J.b+b+b+b+b+b+n D >+( z &.z ( >+>+n H+n+P.1 1 1 P.P.P.P..+P.H.P.P.z+z+z+2 z+b z+z.z+n+M M z.y.a M *.[+*.*.*.1+1+ + +*.*.*.*.*.*.*.*.*.*.y.y.*.*.*.*.*.*.*.*.*.y.M R M *.M y.*.M y.y.*.M *.*.y.y.y.y.*.*.*.[+[+y.y.*.*.y.*.*.[+*.[+e.*.*.y.y.y.[+y.y.*.[+[+y.*.*.*.y.y.y.y.y.y.y.p.y.p.*.y.y.[+y.[+[+y.*.y.y.y.y.M y.M y.M M M y.M y.y.n+y.y.[+[+*.*.*.[+y.*.*.[+*.y.M n+M *.*.[+*.*.*.*.y.*.*.*.*.p.y.[+*.*.1+*.*.[+[+y.[+*.*.*.*.M y.M n+a y.y.y.M m.[+y.y.y.y.M y.n+n+a z+z+M z+M y.*.1+y.[+[+y.n+n+z+z+M *.[+[+[+t.[+[+ + +*. +*. +*.[+*. +[+ +[+ + +[+ +[+ +t.[+[+ +t.[+t.[+t.t.[+t. +[+ + + + +t.t.5+5+t.t.}.5+t.5+0 0 y+s y+/+q.J.z x.4.N p+b...= ~.u !.8 A { A { x.E u.*+J.2.R.M.M.M.s.w X X k _ J U U P e+[ d+v $+$+e+#+! _.n 5.3+i R.J P v $+p p d+U '.'.U - _ _ j j e+e+[ y+d+v j.v $+$+$+$+' $+$+$+$+v P M.E+_ w.x+{.[.7 Q 0.. . Q } .l j.P w+- w X X X k k k ,+k 9+M.}+a+a+4+H.n+y. +Q.o.s y+0 [+N.2.G.:+o+b+k+b +.O |+x+|+|+K.", "o+o+o+D >+f+u.9 f+f+o+o+o+o+o+o+o+f+f+>+o+o+o+f+9 { u -.&.`.9 f+f+f+>+f+f+f+f+f+f+9 f+>+f+c.J.G.G.G.D G.G.G.G.o+G.b+b+J.b+b+b+(+b+D f+9 z z z ( n 8.8.B.y.1+M b P.X.1 B H.P.H.P.P.b P.b b b z+z+z+z+z+z+z+z.M a n+n+M M y.y.*.*.*.*.*.*.*.y.*.M y.*.*.*.*.*.*.y.*.M M M *.a M M M M *.R M y.y.M *.*.M y.y.y.y.M y.y.*.[+*.*.1+1+[+*.y.y.*.y.*.y.y.y.[+*.y.*.*.y.R *.*.*.y.y.y.y.y.[+y.y.*.*.M M y.*.M y.y.*.*.y.*.p.*.*.y.p.y.y.y.*.y.p.M *.M y.M y.n+m.y.n+y.y.m.[+y.[+[+[+[+[+*.y.y.[+M y.n+M y.y.[+*.*.*.[+y.y.p.1+[+*.[+*.p.*.y.y.*.[+[+[+*. +y.*.y.y.M y.y.y.*.y.*.[+[+[+[+[+y.y.M M n+M n+n+M n+M *.y.*.*.y.M M z+z+z+z+M *.[+ + + +[+ + + +*.*.!+ +*.*.*.*. + + + +[+t. +t. +[+t. + +p.5+t.t.[+t.t. + +t. + +[+5+t.[+t.5+t.5+t.Q.Q.Q.Q.}.o.y+0 p.C+*+E x.E u.:+*+p+x.A !.!.u 8 { 8 -.x.z f+:.r+R.a+M.M.s.X X - k J ,+/+/+U U P P d+d+$+$+[ w 6 W 8.b+#.S.s.l+F+$+3 $+$+[ U _ $.'.- k j [ F+d+d+d+v v $+$+3 $+3 p $+' 3 $+$+$+$+d+m s._ j L F.l.d q 0.. . 0.d ] l L j.e+U k - k - - k k J - L.E+}+B.X.a+N.p.,+ +Q.o.<+y+0 p.B C+G.:+*+8.6 b Q.s D.|+|+K.K.", "o+o+o+o+o+f+9 f+f+>+o+o+f+o+o+*+f+9 f+f+o+o+f+f+f+9 9 9 9 9 9 9 9 9 f+>+f+f+f+>+o+f+9 o+9 f+o+o+o+o+o+o+o+9 &.D o+D b+b+n D G.D o+f+9 z z &.9 D Z i.G+b $.5+ +M N.P.P.P.1 P.H.P.H.P.H.b z+z+b z+!+a z+z+z+n+n+n+M a R a *.y.*.y.y.M M M M *.*.*.*.M a a y.M M y.a y.y.y.y.y.y.*.*.y.M *.R *.M M M M *.M *.*.y.*.a y.y.[+[+*.y.*.[+y.y.[+y.y.*.y.y.n+n+y.*.*.y.*.[+y.y.*.M *.*.*.1+m.y.y.M M n+M M p.y.*.y.y.y.*.[+y.[+p.y.y.M y.*.y.M *.[+y.y.y.M y.M M y.y.*.y.y.y. +[+*.1+*.*.*.*.*.y.*.y.y.M p.y.y.*.*.[+*.[+[+*.y.[+*.y.[+[+[+[+[+[+*.*.*.[+[+[+*.*.M *.*.[+y.*.*.[+[+ +[+*.y.[+y.y.y.y.M a M M M M *. + +*.y.y.a a b z+z+n+y.*. +[+[+ +[+ +*. + +[+*.*.*.[+*.*.[+ + + +[+5+p. + +t.t.5+[+ + +[+t.[+ + + +t.t. +t.[+t.t.t.t.t.t.5+Q.t.5+0 }.y+y+e+B J.f+-+4.E :+b.*+u.x.!.9.!.8 8 8 8 u -+p+:.2.R.'+3.f f f f X k R J U U ,+_ U U l+P d+j.v [ m.c+6 ++8.6 E+k P v 3 ' K $+[ k _ U U _ _ j [ v v $+$+$+$+$+$+$+3 $+p p p $+3 p ' p $+P J k 0 j.l l.] q q Q Q q d ] l.3 j.d+P U U k J J k J J J s.E+}+C+i.H+E+y.[+t.0 D.<+<+o.p.4+J.o+u.o+b+i.z+& }.> x+S ]. .", "o+o+o+o+o+f+>+>+o+o+f+f+o+f+o+f+f+f+f+9 f+f+f+9 9 f+9 f+f+f+f+u.9 9 9 f+f+f+z 9 f+f+9 9 f+9 9 f+o+f+>+f+9 o+9 >+>+>+D G.b+G.D o+( 9 &.&.z `.( _.E+E+w y.t.Q.Q. +*.b H.b B P.P.P.b P.N.b !+z+!+z+z.z+z+z+n+z+n+z+n+M n+M *.y.*.*.y.y.M M z.n+y.y.M R *.a M M *.R R *.*.*.*.M y.M a y.M *.y.M M y.y.*.M M M M n+M *.*.y.[+y.*.y.*.y.*.y.[+[+*.*.y.*.y.n+y.[+*.*.y.y.[+y.*.*.[+y.y.*.y.y.y.y.M M n+y.n+y.y.y.M *.y.*.y.[+[+*.*.y.y.*.p.*.*.[+p.*.M *.*.y.*.y.y.*.[+[+y.[+[+*.*.[+[+p.[+*.y.y.*.y.y.y.y.y.[+*.*.*.*.y.y.y.y.*.*.y.[+[+[+1+*.*.[+ + +[+y.[+*.*.y.*.*.*.[+ + +[+ +[+[+y.*.*.y.*.y.*.*.M y.[+1+ +*.[+*.y.n+n+a z+z+a z+M *. +t.t.[+ + +1+*.*.[+*.p.*.*.*.*. + +[+[+ + +5+t. +5+[+t. +t.t. + + +t. +[+ +t. +5+[+t. +t.t.t.t.t.t.Q.5+0 o.y+y+p.^.*+N x.E >.:+*+:+= A 8 !.!.!.!.!.!.8 E f+4 * g '+S.1 1 @.@.E+X _ U /+j J ,+_ J /+j e+d+j.[ _ 1 c+i.B..+X /+[ v p p p v j k _ _ U k _ j d+v $+$+$+3 $+3 $+$+3 3 $+3 p p 3 3 $+$+d+U J k _ 0 j.l l.} d q d d ] ] m+3 j.j.[ e+e+j j l+j l+l+J h+S.}+i ++X.H+n+*.t.Q.o.x+<+y+[+q.*+z `.z D k+5 5+w.|+|+U.].K.", "G.o+G.G.*+o+f+o+o+f+u.f+i+o+o+f+f+f+9 f+9 >+x.4.9 9 9 f+f+z -+9 z 9 f+9 f+9 z 9 9 9 z 9 f+f+f+f+9 9 9 i+o+>+>+f+f+>+D o+(+G.D D f+9 9 9 z 9 D i.E+P.P.R $.Q.Q.5+ +e.M M z+z+z+z+z+z+z+b b b b z+z+z+z+z+z+n+z+n+M y.M R M *.[+y.M M M M *.M *.y.m.y.M *.a *.M a y.*.*.y.*.*.*.*.*.M y.y.M y.R M *.M M *.*.*.y.y.[+m.y.y.[+y.[+*.*.y.*.*.*.[+y.*.y.a M y.y.*.[+[+[+y.y.[+y.y.*.*.y.*.y.y.p.M y.m.y.y.y.*.y.y.y.y.y.*.[+*.[+*.*.*.*.*.[+*.*.*.y.*.y.*.*.y.*. +*.*. +[+ + +[+[+[+[+*.[+p.[+p.y.M y.*.[+1+p.[+[+*.*.p.*.[+[+*.y.*.[+*.[+y.*.[+1+1+[+ +[+y.y.M M *.*.*.1+*.[+ +*.1+*.*.y.[+[+*.[+y.*.*.[+1+1+[+ +[+[+*.*.M n+M M z+M M [+ + + + + + + + +*.*.1+*.*.*. +[+ + +5+p.t.t. +t.t.t.t.t. + + + + + +t.5+t. +t.t.t.t.5+t.t. +5+5+Q.t.Q.Q.}.}.y+0 H ++f+-+x.E p+b.b.p+E 8 !.9.!.!.!.!.!.1.N ;+q.g Y.f 1 c+]+c+c+E+R k e+P [ P l+,+J J U j [ [ 0 _ a z.z.w #+w+e+v $+3 ' p v j z._ $.k k '.[ d+$+p p p $+$+$+$+v d+v v $+3 $+p $+p $+d+_ f f X X _ j.l l.] ] ] l.] @ {.$+P 7+U j P [ F+P [ F+[ e+g i.@..+C+i..+b *.5+I.o.<+y+y+l+4+*+N ) &.9 W P.& O D.x+x+].K.", "J.b+G.J.G.*+o+>+o+o+f+o+f+o+o+o+f+f+f+f+u.f+u.&.&.9 u.9 f+u.&.&.9 9 f+u.9 9 9 o+o+o+z z 9 9 f+9 z z z 9 f+f+f+f+( D D G.(+b+D D f+f+z 9 z o+A+@.b P.P.z+y.$.Q.Q.5+Q.& I.5++.$.1+ +1+*.y.y.M M a M z+z+z+z.a a y.n+y.a M R *.*.y.y.M y.y.*.z.*.*.y.y.y.y.y.M *.a y.y.*.*.*.*.*.*.*.*.y._ M *.*.y.y.*.a M M *.y.*.*.*.*.*.y.y.[+[+*.*.y.*.y.*.y.y.*.y.*.1+[+*.*.*.[+[+[+[+[+y.[+[+y.*.*.*.*.y.y.y.n+M M *.y.y.[+[+y.[+*.*.*.[+*.*.*.*.*.[+p.*.[+*.*.*.*.*.*. +[+*.1+y.*.1+*.*.*.[+*.*.*.[+*.y.y.y.*.p. +1+ +[+1+*.*.*.M *. +[+[+*.y.[+p.*.*.*.1+p.1+[+y.*.*.*. +*.*.1+1+*.[+*.*.y.[+*.1+ +1+ +[+*.1+[+[+ +[+ + +[+[+ +*.M M M M *.*. + +5+t.5+ + +1+*.1+*.*.*. + +*. + + + + +5+t. + + +5+t. +t.t. +5+ + +t. +5+t.t.t.t. +5+ +t.t.t.5+e+t.5+0 }.o.y+[+4+J.N { x.z :+b...>.x.!.!.!.!.!.!.!.9.u z ;+q.Y.C.3.]+6 6 G ; 1 z.'.[ d+v ).F+j /+J ,+U j j '.$.a a R R _ e+v v p p 3 $+d+_ z._ $.k k j [ d+$+' ' p 3 p $+d+0 j 0 [ [ j.$+p 3 p $+[ - E+]+]+o 5 j j.l m+l.F.l K K v P ` ! M.- J U P P [ d+d+d+C.B.i.H.^.X.1 H.M $.I.s O o.o.l+B b.&.`.&.i+8.!+& s O D.O x+S ", "A+A+J.J.G.G.*+*+*+o+o+o+o+f+>+>+f+f+f+f+9 u.9 u.9 z z z 9 z z 9 9 9 9 9 f+f+i+>+o+o+u.9 &.9 f+9 9 z 9 9 f+9 z 9 f+>+D G.b+b+b+b+b+D ( 9 >+D G P.z+b w b z+ +& I.I.w.}.o.s o.O s O s w.I.I.Q.Q.Q.1+e.e.e.a M M M *.y.M M *.y.*.M y.y.y.*.y.*.*.y.M y.*.y.y.y.*.*.M M *.y.*.e.*.*.*.M *.M y.y.*.y.M M 1+*.M M *.*.[+[+*.y.*.y.M 1+[+*.1+*.*.[+*.*.[+*.*.[+1+ +[+*.*.1+*.*.1+[+*.*.*.y.y.y.*.*.M y.M n+y.y.M *.*.y.[+*.*.*.*.*. +[+ +[+*.*.*.*.*.*.*.*.y.[+*.*.1+[+[+*.*.*.[+p.*.p.y.p.y.y.y.y.y.y.y.[+*.p.y.[+[+p.*.*. + +p.*.1+p.[+[+*.[+[+*.[+[+y.[+[+y.*.p.*.[+*.*.*.[+*. +*.[+*. +*.*.[+[+1+ +[+ + + + + + + + +[+ + +1+ +*.*. +[+t.[+5+5+ + +5+[+*.*. + + + + +5+ + +t.t.[+t. +5+ +t.5+5+t.5+ + +5+ + +t.t.5+t.5+t.5+t.t.5+5+t.5+t.Q.Q.Q.y+s 0 p.2.:+E 4.x.>.*+;+:+= A !.!.!.!.!.!.!.!.{ p+:.'+Y.X E+]+6 G ; 6 c+R /+j.v $+$+$+d+[ j U j j '.'.1+_ a E+w [+j v 3 3 p 3 3 [ z._ _ U z._ j [ v $+p p 3 p ' v j k T _ $.j [ v p p 3 $+[ - 3.G < < 6 e.w.O ].l 3 [ j e+7+` 3+8.6 3.X s.s.- U F+v [ ,.8+i.@.s.H+H.b n+ +Q.I.o.}.Q. +N.7.u.9 f+(+k+b +.o.I.w.D.x+K.", "b+G.;+G.G.o+o+o+:+o+o+o+o+o+o+o+f+>+u.9 f+9 z -+z z 9 z 9 z z z 9 9 9 f+f+f+o+o+o+f+u.9 z 9 9 z 9 z &.9 9 9 9 9 f+>+D D ++++++++++8.G.o+n k+i.w z.z.n+z+E+R Q.I.w.O O O O D.D.D.|+|+D.D.|+|+D.x+D.o.o.o.I.I.Q.$.& [+$.e.1+*.*.e.*.*.*.e.*.*.e._ *.*.$.*.1+*.e.*.R a *.*._ 1+*.M _ *.y.*.*.y.*.*.*.y.e.*.*.M *.M *.R y.y.*.y.M M *.y.*.*.*.*.*.y. +*.[+[+[+1+[+[+,+*.1+y.*.[+*.[+[+y.y.*.*.*.y.y.*.M *.y.y.*.[+[+y.*. +p.*.*.[+p.*. +p.*.*.*.*.*.p.*.y.*.*.*.1+[+[+*. +*.*.*.*.*.[+y.y.y.p.[+y.y.y.[+[+[+*.*.[+*.*.p.*.[+[+1+*.*.[+y.[+y.[+*.*.[+*.[+*.[+*. +1+*.*.*.*.*.y.*.1+[+y.[+1+1+ +y. + +[+ +1+ +t. + + + + + + +1+ + +*. + +t. +t.5+5+[+ + +[+ + +t.[+5+ +5+ +t.t. +5+t.t.5+t. +t.t.t.t.5+t.t. +5+t.[+ +t.t.t.t.t.t.t.e+5+t.t.5+Q.}.y+<+e+B J.u.x.{ E :+;+;+p+x.1.!.!.!.!.!.!.9.!.4.:+4 * Y.- E+G+]+]+]+]+c+k '.d+v $+$+$+$+$+d+[ e+e+U '.$._ z+G+H+n+l+v 3 p p $+$+j z.z.$._ k k j w.$+$+p p p p $+j._ z.5 z.2 z.& [ $+$+3 $+d+k 3._.D D G 5 & <.O O j 3.o M.M.i *+5.W 6 @.! ]+! s.J P ,.- R.i.i.H.E+b M [+Q.I.I.o.Q. +*.B C+*+*+*+b+i.b $.I.I.w.> ].K.", "*+o+o+f+o+f+o+f+f+u.f+f+f+f+o+o+o+f+9 u.z z &.z `.&.&.&.z 9 9 9 u.9 f+9 9 9 f+f+f+f+9 f+9 9 u.u.9 &.z 9 u.f+f+f+>+>+D 8.k+++++B.i.k+A+G.W Z )+E+n+n+R b P.z+1+& I.w.s w.e O O > |+|+|+S |+].S K.S K.r.K.K.L U.x+D.D.s o.I.& & t.e.& $.*.1+ +*.$._ +*.1+_ 1+*.1+*.y.y.*.1+_ *.M *.y.*.y.M *.a *.y.*.*.*.*.e.*.*.[+[+*.y.y.*.y.*.*.y.*.*.*.[+*.1+*.*.e.1+*.[+1+1+*.[+*. +[+*.1+*.*.*.*.y. +[+ +p.y.*.y. +[+[+*.y.*.[+*.*.*.[+[+[+*.*.*.[+*.*.*.*.*.y. +[+*. +[+*.[+[+*.*.[+p.y.y.[+n+y.[+*.y.*.p.*.[+p.[+1+p.*.*.*.*.y.[+[+y.*.p.y.[+p.[+*.[+[+*.*.*.*.*. +[+[+ + + + +p.*.*.*. + +1+[+[+*.1+[+ + + +[+ + +t.5+ + + + + + + +*. +[+t. +t.t.5+ + + + + +[+5+t.t.t.5+5+t.t.5+ + +t.t. +t.5+t.5+t.t.t.t.t.5+[+ +t.t.5+5+5+t.5+t.5+t.Q.Q.Q.Q.Q.I.o.y+/+4+G.`.{ { N :+;+*+>.~.!.9.!.!.!.!.9.!.1.E *+r+* J g X f f 1 f f z.k j j.$+$+$+$+$+$+$+v v d+0 t.'.t.X )+X.y.'.d+p 3 K 3 j.U z.T _ _ z._ j [ $+p p ' p ' p d+_ 5 5 5 1 z._ w.v 3 $+$+d+U X o n (+c+z._ <.w.O _ 3+o+++r+F o+i+W ]+G+G < 3+]+h+J * R.a+S.)+@.H.z+y.& 0 o.o.o.0 t.p.4+J.*+:+o+A+X.z+ +5+I.O |+].].", "f+f+o+o+f+u.o+f+9 u.i+f+u.f+f+f+f+f+u.f+9 z `.`.z `.z &.9 z 9 f+9 f+f+f+f+f+f+f+f+i+9 f+z 9 i+u.9 z &.9 9 i+f+f+f+>+b+k+k+B.k+B.i.k+k+k+k+Z i.H+z+z+R R z+z+n+e.& I.w.w.O O s O D.|+|+|+S ].S K.K.K.: : : : : : .K.: K.S |+x+D.O o.I.Q.Q.Q.& $. +$.1+1+ + +1+$. +e.*._ *.*._ *. +*.*.1+*.*.M *.y. +[+1+M M *.*.*.y.[+*.*.*.[+*.*.y.*.y.*.*.*.[+ +[+[+1+1+[+[+ +*.[+y. + +[+ +*.*.*.*.*.1+*.[+*.*.*.y.[+*.y.[+y.y.y.[+*.*.*.*.*.y.y.M *.*.*.*.y.*.y.*. +y.*.[+1+*.[+[+*.[+y.[+p.[+y.y.y.*.[+*.*.*.y.*.y.[+ +[+*.*.[+[+[+y.*.*.*.[+*.[+p.1+y.y.y.*.[+[+p.*.*.*.*.[+[+ + +*.[+[+[+*. + +[+y.[+1+1+1+ +[+ + +t.t.t. + + + + + + +1+ + + +t.5+5+t.5+ + +t.t. +5+t. +t.t.t.t.t.t.5+t.t. + +t.t.t.t.t.5+t. +/+5+ +5+[+t.t.t.5+t.Q.5+}.Q.t.Q.Q.Q.y+<+y+p.2.f+x.~.{ u.*+;+:+= A !.!.!.!.!.!.9.9.8 >.;+q.* J J - - X X k - '.P d+$+$+' 3 ' $+$+$+$+v $+j.[ o.0 ,+.+X.m.l+v 3 p 3 p d+z.f z.U k z.'.j v v $+p $+p $+$+d+U 5 1 G+c+5 z.[ j.3 $+v [ P ,+s.o G 1 e.w.<.6+6+_ *+&.b+C+F n b+W G+@.G D D _.M.g ` _.]+}+r+X.w n+1+I.w.y+D.o.o.t.p.q.o+z z 9 (+i.!+1+& s x+K.].L ", "f+f+f+f+u.9 u.z &.f+>.f+z -+9 f+>.z 9 &.z z z z &.9 9 9 i+i+>+f+f+i+i+f+f+9 9 i+f+o+f+z 9 9 9 f+9 9 u.9 >+f+f+>+>+D b+k+C+k+6 B.B.i.i.)+X.)+@.P.b z+n+z.R R M *.& & I.+.I.I.w.}.O e D.|+|+U.S K.K.S g+: : : : : [.[.[.[.[.: : : .K.K.K.].|+D.s I.Q.Q.& Q.$.t.$.$. +1+_ +*.1+e._ 1+*.1+e.*.*.M *.y. +*.M n+*.*.*.*.*.1+[+*.1+ +y.*.*.[+y.*. +1+_ *.1+1+*. + +*. +*. +[+*.1+*.[+*.*.*.*.y.*.*.[+*.y.[+[+*.[+[+y.p.*.*.p.M *. +p.M p.*.p.*.[+*.*.p.*.*.p.[+*.[+y.p.[+*.[+*.[+y.M y.p.y.y.p.y.1+p.y.*.p.*.*.p.*.*.*.y.[+*.[+[+*.y.M y.*. +p.*.[+*.[+*.*.*.[+[+[+ + +[+[+*.p.*.*.[+ +t.[+[+[+*.*.[+ +[+ + +t.t.t. + + + + + + +[+ + + +t.t.t. +t. + +5+t.t.t.t.t.5+t.5+t.t.t.t.t.5+t.t.5+t.t.}.t.t.t.5+t.t.t.t.t.t.t.t.t.5+Q.t.Q.5+0 Q.Q.0 Q.o.<+e+H J.N { { E p+;+;+p+E 8 !.!.!.8 !.!.9.!.4.u.:.` g V J J J J J U j F+d+d+$+' $+p $+p p 3 $+3 3 $+j.j.j.e+h+a+m.l+v $+p 3 $+d+z.z.$._ k z._ [ v $+p p p ' p p $+j - 1 f 3.f z.[ j.p $+F+C.U /+,+#+3.z.w.O > > |+0 7.z c.#.2.2.o G+X z.3.< n A+3.v+8+3+6 H.2.G P.n+$.I.O O <+o.0 t.p.C+p+-+) &.D 6 P.$.6+D.K.].x+w.", "f+f+f+f+9 i+f+f+9 9 z z 9 z 9 9 z z z z `.4.&.z f+f+f+o+(+b+b+G.f+u.9 f+f+f+u.9 o+o+z &.9 9 f+9 9 z 9 z >+D D D (+W 1 H.H..+N.C+6 .+.+)+H+H.4+b b R *. +1+1+$.Q.Q.Q.I.I.& *.n+*.w.O O s O x+|+S K.S K.S ~+: ~+[.~+[.|.k.B+T.k.B+k.k.k.|.k.[.: .K.].].x+x+O o.o.I.Q.& $. +1+$.$.1+$.e. +1+e.1+ +1+*. +1+e.1+e.y.*. +[+1+1+e.*.*.y.[+e. +*.*.*.*.*.[+*.1+*.*. +1+1+*. + +[+[+*.[+[+1+*.[+[+ +*.[+*.*.1+[+*.[+ +*.[+*.y.*.M y.*.1+*.*.*.*.*.*.*.*.*.*.*.*.[+y.p.[+[+[+[+p.[+y.[+y.y.*.y.y.[+y.*.*.[+*.*.*.y.*.[+p.*.*.*.*.*.*.*.*.y.p.y.*.*.*.*.*.*.*. +*.[+[+[+p. + +[+*. + +[+[+p. +[+ +[+ +*.*. + + + +t. + + +t. + + + + + + +[+ +5+ +5+ + + + + + +5+ + + +t.5+5+t.5+t.5+t.t.t.t.t. +5+t.t.5+t.}. +5+ +5+5+5+5+t.5+t.5+}.5+Q.Q.Q.0 }.o.o.y+/+^.o+E { { E b.J.b.>.x.!.9.9.!.8 8 !.!.!.E *+2.'+Y.- - - J U P P F+d+v $+$+$+' p $+$+' p $+3 3 p 3 3 $+v e+,.l+e+$+3 p 3 3 [ 5 z._ _ z.k '.[ v $+p ' p $+$+$+p d+U f f 5 X k j d+d+d+g s.R '._ }+E+R w.> ~+S S x+s.;+G.k+'+s.L.J '.j _ ! i #.3.g A.:.k+E+R.C+1 z+ +Q.O O s w.0 t.L.2.p+x.) &.D 6 a +.D.|+].x+o.I.", "f+u.u.9 u.u.f+u.u.z z z E ) 9 u.z z &.z E -+`.9 D o+f+D G.G.b+G.o+f+f+9 u.9 9 9 9 z 9 u.9 f+9 9 z &.z &.9 (+6 B B.H.H.N.4+4+^.B X.)+H.H.H..+#.P.z+n+R y.'.t.Q.Q.I.I.I.Q.P.(+D B.Q.O [+#+n+O |+x+D.|+].S .S : : [.[.[.k.|.k.T.B+&+B+q D+Q &+Q q B+k.|.[.[.l.[. .K.].x+D.o.I.I.Q.Q.& $. +$. + + +t.t. + + +1+[+1+ + +1+1+*.*. + +1+*.*.*.1+y.1+1+*.*.1+*.1+ +1+[+1+[+[+y.*.[+*.y.1+*.1+1+ +[+[+*.[+1+*.1+*.*.[+ +*.*.*.M *.*.*.*.*.*.*.*. +*.*.*.[+*.*.*.*. +[+*.y.*.1+*.y.1+*.*.*.y.y.y.y.y.*.*.*.[+p.[+[+*.*.*.*.*.p.*.[+ +p.y.*.*.p.*.*.[+[+ +p.*.p.[+[+[+ +*. +[+ + +[+[+ + +1+p. +[+ +*. + + + +[+ + +1+ + + + + + + + +t.t. + +t.t.5+5+ + + +5+ +5+ +5+[+t.t.t.t.t.t.t.5+t.5+t.5+ +t.5+t. + +t.}.t.5+ +t.t.t.5+t.5+t.0 5+}.Q.Q.}.0 o.<+y+L.++u.{ !.x.>.;+;+*+= 8 9.!.!.u 8 !.!.!.{ z ;+q.h+s.M.3.3.s.- J [ d+).d+).' $+$+' p p p p p $+p 3 p 3 3 3 $+d+d+v v 3 v 3 $+P z.z._ U z.z.'.[ v p ' p p p p p $+v P - f M.- J U P d+F+` P.R t.L._._.1 & > S S S ].j R.r+2.w ,+'.j.v j.j J M.M.L.,.g 8+i.w #+^.@.b [+I.o.D.o.0 t.p.B 2.*+z z >+8.1 e.s ].K.x+O I.w.", "f+9 f+9 z z u.9 z 9 z 9 9 9 9 z `.`.z &.`.`.&.&.9 9 f+i+o+o+f+f+u.9 f+f+9 z z z 9 9 z &.`.E `.z z &.&.9 f+f+k+X.C+)+B 4+B }+.+.+.+B.)+i.H+B @.B.P.R R y._ $.Q.& Q.Q.I.1+8.9 `.7.Q.z+D &.:+Q.O *.@.b O K.K.|+].: ~+: : k.[.|.k.k.B+B+B+&+Q B+D+Q Q Q q q q B+q 7 7 7 [.: : K.K.|+x+g.}.I.I.Q.& & & 5+$. + +$. +$.$.$.1+1+ +*. +*.e.1+*.*.1+*.[+$.1+*.1+e.1+[+ +[+1+ +[+[+*.*.1+M *.[+*.[+1+[+[+1+*.[+[+*.[+*.[+ +[+*.*.*.p.1+*.*.p. + +[+[+[+p.*.[+*.[+y.y.*.p.[+[+p.[+*.p. +*.p. +[+*.*.y.y.y.p.*.[+*.*.p.[+ +*.*.*.*.*.y.*. +y.y.y.M p.*.*.*. + +[+[+*.[+[+[+*.*.p.[+*.[+ +[+[+[+[+ +[+ + + +[+ + +[+t.t. + + + + +t. + + + + + + + + +5+t.5+ +[+5+[+5+p.t.t. + + +5+t.}.t.t.t.t.t. + +5+t.5+t.5+t.t.t.5+5+t.5+t.t.t.5+Q.t.5+Q.Q.Q.}.o.y+y+e+'+J.N { { E :+J.;+p+x.8 9.!.!.{ 8 !.!.8 x.:+4 ` h+f G+]+6 G+E+- j d+v $+$+' $+' ' ' $+' 3 p p 3 3 p p 3 $+3 $+$+$+' $+3 3 $+U 5 z.$.U z.z.j j.$+3 $+$+p ' $+$+$+$+F+J X M.- J U U P U ` S.R '.'+n >+G a w.> S S O k B.B.4+#+'.[ j.L $+j.d+P P 7+j 7+u+a+m.9+s.@.b *.I.D.U.o.Q.,+#+.+C+:.*+:+J.k+b 5+O |+L o.O O |+", "o+f+z u.u.9 9 z f+z z z 9 u.u.z E `.`.E -+-+&.&.-+-+`.`.`.-+9 z z z z `.`.&.9 &.9 &.z `.&.&.&.&.&.9 &.&.9 i+D ++++k+B.B.)+B.B.^.H+4+.+^.)+.+4+B w b n+,+t.Q.Q.t.Q.$. +z+8.*+o+}+5+6 &.{ u.Q.a D 4.z /+|+$.w b w.K.: K.K.: |.|.k.k.k.T.B+B+&+Q D+D+D+0.D+0.D+Q Q Q Q Q Q B+B+|.|.[.: K.K.U.x+D.D.o.I.I.Q.Q.& & Q. +5+ +1+1+$.e.e. +[+ +t.[+ +$. +[+*.*.*.*. + +1+$.1+1+1+1+[+*.[+[+*.*.1+[+1+ +*.*.[+*. +[+ + +[+ + + +*.*.y.*.*.*.*.[+*.[+*.*.*.p.[+y.*.y.*.*. +*.*.[+*.*.*.1+[+p.*.*.p.*.p.*.*.*.[+[+y.*.*.y.[+[+*.*.y.*.[+*.p.y.*.y.y.y. + +p.[+*.[+*.*.*. +[+*.*. +*. + +p.*.[+[+*.[+[+[+[+ + + + + +t.5+ +5+ +5+ + + +[+[+ + +[+t.t.t.t.t.5+t.5+5+t. +5+ + +5+t.t.t.t.5+t.}.t.5+[+ +t.t.t.5+[+t.t.5+t. +t.t.5+5+5+5+t.0 Q.Q.Q.Q.0 y+g.<+/+2.f+x.8 { N *+:.*+z ~.!.9.9.!.{ 8 !.!.{ u.:.` g g 3.]+G G ; ]+5 k P d+$+).$+' $+' p p $+' p p $+p p p 3 p $+' $+' $+3 v 3 d+k 5 T _ k X k 0 d+$+' p 3 ' p p $+$+d+U - M.- X - - V J Y.` ! R l+#+G.i+W 2 C <.6+> O ]+D b+@.}+,+j v $+L 3 v $+v d+v d+w+L.s.H.#+P.b 1+Q.s ].L o.t.N.^.7.J.G.;+A+)+b $.s O O s O ].K.", "o+f+f+9 z z 9 z 9 z z z 9 9 z z &.&.`.&.`.-+-+`.`.-+`.&.z &.&.z &.&.&.`.`.`.z &.z `.z `.`.`.`.&.&.9 f+i+9 >+D ++++++k+i.B.i.A+G.++B.B.i.B.i.k+B.@.}+#+n+[+ +Q.t.Q.Q.$.z+k+++.+Q.M k+>+u.^.I.6 `.1.E '.e.i+4.z X ].Q.S.! 0 [.[. .K.[.k.B+&+B+B+B+Q B+0.D+0.D+0.0.D+0.0.t+0.0.0.Q d Q k.7 |.[.[.: : .r.].|+e I.I.& & Q.5+1+ +5+1+$. + + + + + + + + +_ 1+*.*.1+1+1+*.[+[+*.[+[+ +[+ +y.*.[+*. + + +[+y.*.*.y.[+y.,+y.*.*.*.*.[+*.[+*.[+[+[+*. +*.*. +p.*.y.y.y.[+[+[+[+[+y.y.[+*.[+y.y.y.*.*.*.p.1+*.p.*.[+p.*.*.[+[+*.p.*.p.*.y.y.*.*.[+p.*. +*.[+*.*.[+[+ +[+*. +*. +*.[+ + +*.[+[+*. + + + +[+ +*. +*. + +t.5+t.5+5+ + +[+5+ + + + + + + + +5+t.t. + +[+5+ +t. +5+5+t.t.t.5+t.[+t.5+t.t.5+t.t.t.5+5+t.5+5+ + +t.5+t.Q.Q.Q.Q.Q.Q.Q.}.y+L y+p.7.u.{ !.{ u.;+:.p+x.8 9.9.!.8 { 8 !.!.~.:+i g ,.,.f c+; G W ; G+k j d+v $+$+' ' ' ' p p $+' p p p 3 p p p 3 $+p p ' p $+$+[ X z._ j k z._ [ v p ' ' p ' p $+d+[ U X f f - - J U J - g * R.w j /+^.< 6 M w.6+> 6+w.i 9 D H+.+R '.[ v v v 3 $+3 $+$+d+p.R '+)+}+H.b *.Q.D.].l <+0 p.q.J.:+u.f+D 8.X.z+& I.w.O |+: : ", "f+f+z z 9 u.u.z z N `.z z z z z z -+&.E `.`.-+-+) `.E `.`.`.&.z `.`.`.`.z &.`.&.&.&.`.&.z &.`.&.9 9 D ++++8.8.8.J.J.6 B.++7.J.o+k+i.)+C+B.C+i.i.^.X.G+H.b n+R y.n+n+M P.W Z [+5+1+6 k+X.Q.5+6 D u.B.s 1 `.u x.'.w.(+-.-.R. .I.@.k+C.[.[. .K.: 7 &+D+B+D+Q D+Q D+0.0.0.Q t+0.0.t+t+0.0.Q . Q Q D+B+B+7 k.[.: K.].K.x+O }.I.I.Q.Q.Q.t.$.$. + + + + +1+$. +*. +1+1+*.e.1+ +[+ + +[+t. +1+1+1+ +*.*.*.[+*.*.[+*.1+*.y. +*.[+[+[+[+ +*.*.p.[+[+*.y. + +*.*.[+y.*.*.[+[+[+*.[+[+[+[+[+t.[+[+[+y.*.*.1+p.y.[+[+*.*.*. +[+[+ +[+1+*.y.y.y.[+p.*.*.*.y.*.y.[+[+*.[+y. +*.*. + +*.[+[+[+ +[+ + +[+ +[+*.*.[+ + +*. + +t. + + +5+ +t. +[+[+ +5+t. +t.5+[+ +t.5+ +t. + + + +t.t.t.}.t.5+t.t.5+t.t. +t.t.t.5+t.t.t.t.5+t.5+5+5+t.5+5+Q.Q.0 Q.Q.I.o.<+<+e+4+;+E 8 { = *+J.:.p+{ !.!.!.1.{ ~.{ 9.!.x.*+` Y.P J X @.c+n.]+G 1 b l+F+$+).$+$+p $+p $+$+p $+p 3 p p $+3 p $+' 3 $+p ' p 3 j z.5 T j X z.'.[ v $+3 p p ' $+v [ k 5 3.]+! f - U U m J * 8+R.s.'.y+l+9+_ w.> S > S |+^.o+>+G+R.E+J j j [ j.d+j.v v $+e+a+b }+8.P.H.n+$.I.s U.U.3 <+l+B J.>.E E &.f+W P.e.& O K.K. .l ", "z u.z `.z 9 z z z `.`.z 9 z z `.z -+4.-+-+`.-+`.z &.-+`.`.&.`.`.`.E `.E `.E `.`.-+`.`.&.&.z `.z f+j+k+k+++++++A+b+o+b+++A+A+A+b+8.++i ++C+C+++++++k+X.H+H+P.z+*.*.1+1+b 6 X.Q.Q.e.6 6 +}.& 6 k+@.o.s P.b+o+2.x+e.( 1.{ #+x+W -.9.*+ .D.)+b+B .k.[. . .|.Q B+D+q D+0.Q 0.0.Q 0.0.t+0.0.0.0.0.. t+0.0.0.0.Q B+&+k.|.[.: K.K.x D.O y+o.I.I.Q.& t.Q.$.1+$. +[+1+[+ +*.*.[+e.*. + +[+[+1+1+*.1+1+ +e.[+1+1+ +*.1+[+y.*.*.*. + +y.*.[+*.[+[+[+*.y.p. +*.*.*.p.[+[+[+*.y.[+*.y.*.p.y.y.[+[+[+[+*.y.*.*.y.y.*.*.[+*.[+[+[+[+p. +*.[+[+*.[+[+p.*.*.*.*.*.y.[+*.[+*.[+[+p.*.[+*. +*.*.[+[+[+ +[+ +[+ +*. +*. +[+ + + + + +[+ + +t.t.[+t.[+ +5+t.[+t. +5+/+t. + +[+t. +t.5+t.[+t. +t.5+t.t.5+t. +5+ + +t.5+}.t.5+t.5+t.t.Q.t.5+Q.t.Q.Q.}.0 }.y+<+<+/+^.:+x.!.8 N ;+7.;+= 8 9.9.!.8 { ~.8 !.1.>.:.* 7+F+7+J X f z.5 3.1 k j d+$+$+$+$+$+' ' ' $+p $+' $+p p p 3 p p ' p 3 p $+$+$+U f z.'.j X - j d+$+' p p p p $+d+U 5 n.; G G 1 - P d+F+P ` i o w '.x+L L . .k.k.0+0+K.'.o ++H+a+}+s.k _ J j j j [ [ [ ,.f.1 #+++X.H.n+$.I.o.|+].l <+y+Y.J.z { -.q+&.j+c+e.}.|+K.K.].D.", "9 9 u.z z z 9 z N z &.z u.z z z E -+-+-+4.`.`.&.`.E -+-+-+4.-+`.-+&.-+`.&.&.z z &.`.`.&.z &.`.&.D k+i.)+B 4+J.G.++C+o+o+++k+k+C+++A+b+++k+++k+k+Z G+H+H.b y. +$.t.t. +b 6 E+Q.I.e.c+1 w.o.+.c+; [+O w.P.G B o.|+a ++G.r+U.+.D 1.u 2.].c+-.9.N L r.H.J.++U.B+: ]. .|.q D+D+D+0.0.0.0.0.t+0.. 0.0.0.. 0.. t+t+0.0.0.0.D+&+B+k.|.[.[.: . .].].x+s I.I.I.& & 5+ + + + + +*.[+ + +[+ + +*.*.1+1+1+e./+1+ +*.*.[+y. + +*. +*.[+[+*.*.*.[+[+[+[+1+*.*.p.*. + +*.*. +1+t.y.[+y.[+[+*.[+[+[+ +*.[+*.y.y.*.*.*.[+[+*.*. +*.*.[+[+[+ +*.*. +*.*.*.*.p.*.p.*.*.*.*.*. +*.*.y. +*. + +*. +*.*. + + +[+ +[+ +[+ +*.*. + +*. + + +*.t. + + +[+ + +[+ + +t.5+[+5+t. +5+[+ + + +t.t. +t.5+5+t.5+t.[+5+ + +5+t. +t.t.t.t.t.t.t.5+t.Q.t.Q.Q.5+5+Q.Q.o.<+y+y+H 7.>.{ u x.u.:.7.:+E !.!.9.!.{ x.x.{ { { :+2.g F+d+F+P j U k k k k ,+[ d+d+$+$+' $+$+$+$+' $+p 3 p p p 3 p p p 3 p $+$+3 p v U 5 z._ _ z._ j v $+' p ' ' ' $+j.- ^ n.~ W W (.k [ ).$+).` 3+o E+Q.l m+] 7 Q D+t+D+D+[.].e+C.9+Y.s.f s.f X - J U U j J h+C+1 *.'+X.B n+ +Q.o.D.g.<+y+e+/+2.u.4.4.) &.j+P.& |+K.K.D.6+w.", "u.9 z 9 z z z z z `.`.&.z E E &.z -+-+-+-+-+-+`.-+-+) -+E 4.`.-+-+`.4.) `.`.`.`.E `.`.9 z 9 9 9 c.++b+++C+*+D 6 X.C+)+X.X..+.+4+^.)+++i.1 .+B .+H..+B ^.H.R [+t.t.[+n+H+X.z+Q.Q.y.X.P.w.o.5+6 (.t.O }.5 W a |+x+e.; H+y+K.& 6 b+4 <+D.8.4.1.J.K.2 q+9.8 [ : P.D J.0 B+|. .].: Q Q 0.Q 0.0.t+. 0.t+0.0.. 0.. . t+0.. 0.t+0.. 0.0.Q D+B+B+7 |.[.: K.K.U.x+D.I.I.I.5+$. + + + +$.$.1+1+1+1+1+*.1+1+ +[+ + + +*.*.*.[+*.*. +[+[+[+*.*. +[+[+p.1+*.1+[+*.*.*.*.y.y.y.[+*.p. +1+[+*.*.[+p. + +p.*.[+*.p.*.*.*.[+ +*. +*.*.*.*.[+[+[+[+ +[+p.*.y.[+ +y.[+*.[+[+[+[+[+*.*.[+y.*.*.*. +[+[+[+[+ +[+[+/+[+ + + +[+[+ +[+[+ + + + +[+t. + + +[+5+ + +t.[+ +5+5+[+t. +t. + + + +t.[+t.t. + +t./+t.5+t.t.t.t.t. +t.Q.t.5+t.Q.t.5+Q.Q.t.Q.5+Q.Q.o.g.<+e+4+;+x.!.!.E *+:.J.p+x.!.9.9.!.{ { ~.A x.z ;+'+7+).).$+).F+d+[ P j j [ d+v $+).$+' $+$+' $+' $+$+' $+$+$+p p $+p $+3 3 $+$+$+d+X 5 k j k X _ [ v $+$+' ' p p p v U f 5 n.]+W ; k [ $+p $+* ++G+R w. .|.d Q . . . . . q [.l L [ U Y.M.f f f s.s.X X k - M.B.1 +9+'+.+H.[+Q.I.o.w.o.Q. +p.4+;+f+f+f+(+6 a I.D.x+o.I.I.w.", "9 u.f+u.u.z z z z N `.z z z &.z `.E -+`.-+-+-+`.`.4.4.) ) -+4.) ) -+4.) 4.-+`.`.`.&.z `.`.`.&.9 8.b+o+f+8.:+(+X.X.^..+4+)+)+^.4+2.C+)+C+C+.+.+w N.N.^.++Z y.[+[+[+[+H+B.B.m.0 t.z+]+n+Q.I.e.6 G+I.O I.^ 6 & |+D.2 ; b |+K.+.6 G+o.K.D.c+++B.y+ .X.&.{ :+r.+.) 9.!.H [.*.D o+#+|.k. .U. .q 0.Q Q . t+. 0.0.. 0.. . t+. . . . t+. 0.t+t+0.D+D+D+D+D+B+B+|.[.: K.K.U.<+I.}.I.& Q.Q.5+Q.5+5+1+1+ + +1+1+t.[+[+1+ +[+[+*.*.*. +*.*.[+ +*. + +*.y.*.*.*.p.*.[+[+ +[+[+ +y.*.*.[+ +[+*. +[+ + + +[+*.*.*.p.[+*.*. + +[+*.[+*.*. + +*.[+*.*.*.y.[+y.y.y.[+[+[+[+[+[+[+*.[+ + + +*.[+ +*.[+[+ +p.[+ + + + + + +[+ +[+ +[+ +*. +[+t.[+ +t. +[+ + +5+t.5+ +t.t. + + + +t.t.5+5+5+t.t.t.5+ +[+t. +t.t.t.t.t. +t.t.5+e+5+5+t.}.t.t.Q.0 Q.t.}.o.y+<+y+/+2.f+x.8 { N ;+7.*+N { !.9.9.!.{ { { { x.:+2.g F+v $+v ).v ).).d+).d+d+d+).' $+$+' $+$+$+$+v $+v $+$+3 p $+$+p $+p $+$+$+$+v [ f 5 T j z.X '.F+$+$+p ' p p ' $+$+[ _ z.z.5 ]+c+_ j.$+p ' m 8+X '.L l.} q 0.. 0.. . . q } l.l 3 [ J - - X s.s.s.f s.#+f S.a+H.m.p.m.}+P.*.Q.s s o.Q. +y.b B 2.++J.k+B.P.e.& I.Q.& & }.|+", "z z 9 9 z z z `.`.&.E `.E -+-+`.-+-+-+`.`.-+4.-+-+4.4.4.4.4.4.4.-+-+4.4.-+-+-+&.z `.&.z z z &.9 o+C+++G.8.u.8.i.)+)+X.C+^.B.C+C+C+i.)+C+A+.+w B 4+4+4+.+H+n+[+/+p..+J.(+J.H t.[+)+++w Q.Q.z+G H+I.o.Q.n.c+Q.D.D.2 ; e.|+K.+.; ^ K.: D.n.(.I.: K.z.k+B.0 : e.f+4.E <+U.i+9.9.7.l.I.D 9 ++ .B+: s L |.0.0.t+0.0.0.. . . . . . . . . . t+. t+0.t+0.t+0.D+0.0.D+B+k.|.|.: K.K.U.|+g.O s Q.5++.Q.5+Q.1+5+ +5+t. + + + + + +[+ + + +*. +*.*.*.*.*.*.*.*.*.*.*.*.*.*.y.*.[+1+*.1+ + +[+ +[+[+*.*.[+y.*.*.*.*.*.*. +*.1+*.[+*.p.*.*.*.[+[+*.[+[+p.*.*.*.[+[+[+ +*.*.y.[+[+[+[+*.y.[+ + + +[+ + +p. +[+ + + + +[+ + +[+ +*. +p. +[+ +t.t. +t.5+t. +t.5+t. +t.5+t.t.t.5+t.t.t.t.t.t.t. + + +5+ + +5+5+t.t.t.t.t.5+t.t.t.t.t.t.Q.Q.Q.5+5+Q.}.<+<+e+N.:.E !.!.{ :+7.:.p+x.!.9.9.!.!.{ 8 { { z G.'+7+).v $+).$+v $+$+v $+).$+$+).$+).$+$+$+' $+v ).$+v $+$+$+$+$+$+3 $+$+3 v v d+[ j f 5 _ [ X z.j [ $+p p ' ' p p ' ' v F+j j j k k j j.$+p ' d+,.w+d+l @ d d Q . . . . . Q d } m+3 j.j U J J k - - - X - '+a+w #+a+.+#+#+b *.Q.w.D.o.Q.*.N.P.X.i.i.i.X.P.z+ +1+e.$.& C ]. .", "9 z `.E `.&.&.`.E `.E -+-+-+) x.4.4.4.-+4.4.4.4.4.) 4.{ 4.4.4.4.{ 4.4.) ) ) `.`.-+-+&.&.z `.-+`.&.9 8.C+k+b+C+J.k+q.q.)+B.2.C+C+X.X.A+++X..+4+4+)+B N.H b #+p.#+)+b+b+G.J.m.p..+b+f+a+t.[+i.D )+Q.w.e.G+G+Q.O I.5 G & |+|+$.~ a K.K.6+~ (.|+: g+2 ; $.: [.& 6 B.,+[.s b+-+E ,+: 6 u 9.E .r.k+z ( y+0.[.L <+: 0.t+Q Q 0.0.. . . t+. . . . . t+. . t+t+t+t+t+D+&+D+Q D+&+T.k.|.[.: .r.<+D.D.s }.I.5+Q.Q.5+5+5+ + + + + +t.t.5+ +*. + + + + + +*.*. + + +*.*.*.*. +1+[+*. +[+ +*. + +*.p.[+*.*.p.*.*.y.*.*.*.[+ + +*.p.*.*. +*. + +[+*.y.y.*.p.*. +[+ +[+ +[+[+y.[+*. + +[+[+[+ +[+[+*. + +/+ + + +[+ +*. + + +[+ +*. +[+ +[+t.[+5+t.t.5+ +}.t. +}.t.t.t.t.5+t.t.}.t.}.t.5+5+ + + + + +t.t.t.t.t.5+t.5+t.t.5+t.5+5+5+t.t.Q.Q.5+Q.o.<+<+e+q.o+-+!.8 E *+C+:.z A !.9.9.!.{ A { 8 { >.7.L.F+$+$+$+$+$+).$+).$+v $+$+).$+$+$+$+$+$+$+$+v v d+d+v d+$+$+v $+v v v [ [ [ j _ z.f 5 _ U X z.j v $+$+' p p p p ' p ' $+v d+j.[ [ d+$+' ' p ' ).d+3 {.] ] d q q Q 0.0.Q q q } @ l v v [ F+P P j j /+J C.- ^.#+,+i ++P.m.m.$.o.D.x+<+y+Q.m.4+i.J.b+b+++i.H+a a *.& w.|+K.K.", "`.E -+-+`.`.`.-+`.`.) ) -+4.4.4.4.4.4.4.{ 4.4.4.x.) 4.{ q+{ 4.4.4.4.4.-+`.-+`.`.-+4.`.-+-+-+-+-+`.&.9 f+8.C+:+9 X.X.q.C+C+7.2.J.)+q.J.*+b+J.A+C+B H.N.N.N.N.B )+J.b+b+J.^.n+H.8.o+;+m.[+H.o+z i Q.Q.X.D 8.t.w.5+(.G Q.D.|+a (.& S K.I.(.5 S : K.2 ~ O [.: T ; 2 .[.D.c+B.m.: K.6 u.-+^.|.*.q+9.u 0 : P.z x.}+q k.x+I.L q t+Q q q Q t+. . . . t+t+t+t+. t+t+t+D+t+t+0.D+D+0.0.Q q B+k.[.|.: .K.K.|+2+O }.I.Q.5+ +5+ + +5+Q.5+5+t.t. + + +[+ + +*. +[+*.*.*.*.*. + + +[+ +[+ +*. + +*.*.[+[+*.[+p.*.*.y.[+*.*. + +*.*.*.*. +y.p.*.*.y.y.y.M *.*.[+ +[+ +[+ +[+*.[+ +[+ + +[+ +*. + +[+[+ + + +[+ + + + + +1+*. +[+ +[+ +[+t.t.t.t.t.t.}.t.}.t.}.t.}.t.}./+}.t.t.t.t.t.t.t. + + + + + + +5+t.t.t.t.t. + +t.5+t.t.t.t.t.Q.t.Q.0 }.<+<+y+p.C+>.A !.{ u.:.i b.= 8 9.!.9.!.8 8 { !.{ f+2.,.v $+$+$+' $+$+$+$+$+$+$+$+$+$+).$+$+).$+v $+$+$+v d+v d+v d+e+[ j j j _ _ z.k z.f 5 z.- k f z.[ v p 3 ' ' p p p ' p p $+' $+$+$+$+$+' 3 $+p p ' $+p {.@ ] } } d d d q q d d ] m+K $+v v $+d+d+d+d+[ [ P l+R.G+ +2.b+1 #+[+ +o.D.x+x+<+y+Q.#+C+f+z 9 9 D k+5 *.& w.|+K.K.|+", "`.`.) -+-+-+-+-+`.E 4.-+4.4.4.4.4.4.{ { q+4.{ 4.4.-+4.4.4.4.4.4.4.4.4.) -+) ) `.`.`.&.-+-+4.4.4.) `.&.&.9 8.>.&.c.B.7.G.J.C+++)+)+;+8.k+k+8.b+*+++.+H.H B 4+)+++b+b+J.++N.N.i.G.G.2.n+N.b+f+f+^. +H.D `.*+$.Q.@.>+5.& D.w.5 6 & ].|+& (.a K.K.|+^ n.|+~+: a =+r |.k.O ~ ^ r.B+K.5 6 w .|.M o+z ;+[.x+9 9.9.i 7 5+f+{ o+l.B+].Q.Q.: . 0.Q D+t+. t+t+. t+. . t+t+t+t+t+t+t+t+t+t+t+0.0.Q D+&+&+T.k.k.[.: .].r.U.s I.}.Q.Q.Q.Q.5+5+t.t.5+ + + +t.5+*.1+ + +1+ +*. + +[+ + +*.[+[+[+*. +[+ + + + + +y.[+[+y.*.*.*. +*.p.*.*.*.*.y.[+*.p.*.p.*.p.*.[+t.[+[+[+ + + +[+ +[+[+[+ + +[+ +[+ + + +[+ + +t.5+[+ + +5+ + + + +[+t.[+t.5+t.}.t.}.0 }.y+}.y+}.y+y+}.y+y+}.}.}.}.t.}.t.5+ + + +5+t.5+[+t.t.t. + +t.5+t.t.t.t.5+t.Q.5+0 Q.Q.s <+U.y+H b+N 1.!.~.p+:.4 :+x.!.9.9.!.!.!.!.!.!.x.;+4+7+$+$+$+$+$+).$+$+).$+$+$+$+$+$+$+$+v $+d+v v d+d+d+d+e+7+l+/+U k k k z.X z.5 f 5 f 3.5 z.- X U [ v $+' p p p ' ' p p ' p p p ' p $+$+' ' p $+' p ' 3 K @ @ @ ] ] ] } } ] ] ] @ K L v v v d+$+$+v v v v v d+8+k+*.p.^.b y.[+ +Q.I.s D.x+<+y+w+2.u.4.q+&.9 j+5 & O S K.x+D.o.", ") `.-+-+4.4.4.4.) 4.-.4.4.4.4.{ 4.q+q+{ { q+q+4.4.x.q+4.4.-+4.4.-+-+4.{ 4.-+-+`.`.`.`.`.E 4.-+) ) ) `.`.&.9 b+c.C+++J.J.b+C+8.++G.i.n+N.N.'+.+J.z 8.n+B ^.C+J.J.J.G.J.)+N..+8.*+G.4+N.k+f+f+7.p.n+8.z z 7.t.n+D 4.u.$.s z+>+z n+|+D.z.W k K.S D.^ 5 ].: S 2 ; C [.[.<.; 5 ~+k.K.^ ~ D.B+|.& G+N.3 D+s 8.u.:+<+[.W u 9.z l.|+D -.-+'.. : 0 y.|+0.. 0.D+D+t+. 0.0.. t+. t+t+t+t+t+t+t+t+t+t+D+D+0.D+D+T.&+q k.[.[.l.: .r.U.L g.s o.Q.Q.Q.t. + +t.5+5+ +5+ +5+ + +1+ + + + + + + + + + +[+[+[+ +*.[+[+y.y.y. +y.M + +*.*.*.[+[+*.*.p.*.y.*.*.[+*.[+[+[+[+ +*.*. +*. +[+ +[+t.[+ +[+[+ + +t. +t. +[+[+5+[+ +*. + +[+ +t.t.[+t.t.t.}.}.y+y+g.U.3 2+U.U.U.3 g.<+y+y+y+}.t.}.t.5+5+5+t.t.[+t.5+t.5+t.t. +t.t.5+t.5+t.t.t.Q.t.Q.}.Q.s L L t.q.:+x.u { z ;+7.:.p+x.!.9.9.!.!.9.9.9.9.4.;+H d+$+$+$+$+$+$+$+$+$+$+).$+$+v $+v d+v $+d+e+e+e+e+/+w+,+k R X X b E+f f f f f 1 3.5 f X z.z.k '.[ $+3 p p ' ' K ' ' p p p ' p $+3 p 3 p p p p 3 p p K K {.@ F.F.F.@ @ @ @ @ m+{.v j J J j [ [ d+v $+$+v $+v q.b+a D.e+e+t.t.t.t.Q.Q.I.O D.s e+4+*+N `.9 D 6 a s K. .<+w.w.O ", "`.`.`.`.E 4.-+4.) E 4.-+4.4.{ q+4.{ q+4.q+q+{ 4.4.4.-+-+4.-+`.-+-+4.4.4.-+-+-+-+`.`.&.`.&.-+&.`.-+) ) &.`.9 o+o+D i.i.J.G.c.i.)+G.6 H.H N.B 4+C+b+k+4+i 8.i.++b+G.G.b+X.B C+b+G.++B B b+o+*+.+m.X.o+z *+4+n+8.-+E i t.[+(+{ 4.#+x+$.b+z ! ].].$.G 5 |+: |+2 n.D.[.~+& ~ & [.|.S ^ ~ K.T.k.T ~ I.B+q > G+G+0 B+l..+*+z H q a q+9.8 e+|.Z 4.1.A+B+B+y+,+I.k.. 0.Q B+0.. t+t+t+t+t+t+. . t+. t+t+t+t+D+t+t+t+t+B+k.q B+q B+7 B+l.: .r.g.<+s I.}.}.0 Q.5+5+5+ +5+ + + + + + + + + + + +*. +y. +[+ +[+*. + +*.*.[+*.*.*.[+ +p.[+[+*.*.y.*.y.[+p.*.p.y. +p.*.p.*.*. +[+ + +[+t. +[+[+ +[+[+[+[+[+[+ + +t.[+[+ + +[+ +[+[+[+t. +[+}.0 y+<+<+U.U.3 U.3 U.3 U.l g.3 U.g.3 <+}.}.t.t.t.t.5+[+ +t.[+ +t.5+ +t.t.5+Q.t.t.t.5+t.5+0 Q.0 o.<+U.<+p.J.z 8 !.A u.:.C+G.N 8 !.9.!.!.!.!.9.9.!.= i p.v $+$+$+$+$+$+).v $+$+v $+d+v d+d+d+e+7+7+l+/+,+9+R #+X w E+1 f 1 f 1 3.5 f f f 5 X z.k _ j j [ v $+p ' ' ' p ' ' p $+p $+K p ' $+$+p ' 3 $+p $+p 3 3 p K K {.$+P F+$+{.{.F.l j.f G _.W ]+f k U P [ d+v $+d+* A+n+y+U.3 L j.o.Q. + +& I.o.}.0 H B.G.(+8.6 5 & x+].].Q.& s |+", "-+-+E ) -+-+-+4.) 4.4.4.x.4.q+{ 4.4.4.4.{ 4.4.4.4.4.{ 4.q+4.4.x.4.q+4.4.) ) `.&.z -+-+-+-+4.4.-+-+4.4.&.&.&.z &.>+k+J.G.o+o+D G.b+P.4+B N.H N.N.B 1 q.4+.+X.C+J.G.G.++.+C+C+++7.4+N.i.G.G.*+.+N.++o+:+7.N..+f+`.:+#+[+6 -+{ *+t.Q.k+-.{ ^.x+s 8.-+B.|+K.w.G+6 O : .T ; w.~+: O 5 r : B+|.r ; > &+q 6+~ 2 [.0.~+a G+t.|.q 1+b+u.7.] 2+9 9.!.7.7 e.`.u E l Q ].*.R ].0.Q B+B+D+. 0.t+0.. . t+. t+t+t+t+. t+t+0.0.D+&+D+t+0.t+D+0.q B+B+|.[. .F.r.U.e }.I.}.t.5+t. + +5+5+ + + + + + +*. +*. +[+y.[+ +[+[+[+ +[+[+[+ +p.*.*.p.[+ +y.y.[+[+*.p.*.*.*.y.*.*.[+[+*.[+ + +[+ +[+ +*.[+ +[+[+[+t.t.t.[+*.p. + +*. +[+t.[+ + +[+[+ +t.0 y+g.<+3 U.l U.3 U.3 U.3 U.L U.3 U.3 <+y+}.e+t.t.[+ +5+t.5+t. + +5+t.t.t.t.5+5+5+t.t.5+Q.Q.}.o.L 3 [ H ;+E !.9.E :+7.7.:+x.8 9.9.!.u 8 !.9.9.9.E 4 Y.d+v v v d+d+v v d+d+d+d+d+e+e+7+l+p.,+9+#+#+#+w E+E+H+@.S.3.1 3.f f f f f X X k U U U j P [ d+v $+p p p p ' p p ' $+p $+$+' p $+$+$+$+p $+3 p 3 p p 3 p p K p g 3+#.R w.j.j.w._ W ( {+c < W G ]+3.s.J F+d+7+'+^.w o.x+K.F.L L y+0 $. +$.& $. +n+B 4+X.B z+ +I.o.O O Q.w.|+[.", "-+-+4.4.`.-+-+-+4.4.4.) 4.q+-.4.4.{ q+4.q+4.4.q+{ q+4.{ { q+4.4.4.{ 4.-+4.-+`.`.-+-+`.-+-+-+) `.`.) `.`.z `.&.9 9 f+u.u.z 9 u.9 9 k+B N.N.H N.#+B 4+C+b+C+^.X.C+J.++C+C+b+G.++C+.+)+J.b+b+.+N.i.o+f+*+4+N.A+9 >.7.m.N.f+4.>.4+t.X.&.{ N p.o..+-+1.r+].x+P.&.u.o.: x+H+W & : K.<.1 e.: |.: 2 ^ K.B+&+6+V.r &+0.: ^+_+K.0.q +.1 M r.t+|+Z D G.<+|.k+-.9.-+ .].>+u 1.a+Q [.Q.#+o.k.. Q B+B+Q . . . . t+. . . . . t+0.t+t+. . t+t+t+t+0.t+t+D+D+Q B+} [. .r.K.U.<+s }.I.}. +t.5+5+ + +5+ + + + + +[+ +[+ + +*.[+ +[+*.*.[+[+ +[+[+[+[+[+*. +[+*.p.*.*.*.p.[+p. +[+ + + +5+[+[+[+[+[+[+[+[+[+[+t.t. + +*.*.[+ + +[+[+ +[+ +t.t.t.t.}.y+<+g.3 3 U.l l U.l U.l U.l L U.U.U.3 g.y+}.t.5+ + +[+t.[+5+5+ + +t.5+5+Q.t.t.t.5+5+5+Q.0 o.<+U.<+t.C+u.A 8 8 N :.4 ;+>.A !.9.9.u ~.A 8 !.9.u z 7.h+l+d+v v v v d+d+d+d+P l+l+,+9+R R b w E+E+f @.@.@.S.G+3.@.f f f E+X k k U U j P j [ d+v v v v v $+$+p p p p p ' 3 ' $+$+$+d+v $+$+v $+p 3 p $+$+$+$+$+$+3 3 $+F x.`._.5 _ T _ 5 5.) {+i+c j+j+< _.7.M.J m ` ! ^.M./+I.s D.x+|+L <+y+Q.5+[+y.b B )+B.)+P.z+*.$.5+& I.O |+[.q ", "4.4.4.4.4.) `.-+4.4.1.4.4.{ -.q+4.4.{ 4.q+4.4.4.{ -.q+q+{ q+4.4.) -+`.`.&.&.z `.`.-+-+4.4.-+-+-+`.-+`.{ ) `.`.&.`.`.&.`.&.9 9 f+u.9 8.4+N.2.A+)+)+)+2.*+c.b+J.C+C+++C+C+G.G.++B B i.J.++C+N.^.b+o+o+7.B C+f+u.f+4+N.A+`.E ..#+N.D q+E i /+b 9 1.E H <+y.9 1.N j.K._ z E R : ].M _.E+~+|.S 2 ^ : B+k.+.~ 6+B+D+g+^ ^+k.0.B+T V.w.0.. K.2 P.L Q k.z+b+:+w Q $.`.9.!.H 7 G+-.9.u. .q O w b K.0.. Q q 0.t+. . . . t+. . . . . . . t+t+. t+. 0.t+t+0.0.0.B+d B+B+7 |.: .x ].<+<+y+}.Q.}.Q.5+5+ + +*. + + +t. +*. + +[+ + +[+ +y.*. +[+ +*.*.*.*.*.[+[+*.p.1+*.[+ + +t.p.5+ + +[+[+[+[+ +*. +[+ +[+[+[+[+[+ +[+ +[+*.[+ + + + +5+t.e+y+<+L U.l 3 U.l U.l l 3 U.U.3 U.3 U.<+<+y+}.t.t. +5+t.t.t.t. +t.t. +t.5+t.5+t.5+t.t.Q.}.Q.o.<+U.v C.7.`.!.!.x.:+7.4 *+= !.9.9.9.u ~.{ !.9.!.{ f+C+4+9+U P e+P P 7+w+C.C.k X X w E+f H+@.@.]+@.G+G+@.3.3.f E+f X k k J J U j F+d+d+v ).$+v $+$+$+p $+p $+$+$+' $+p $+p $+$+v P J m U j [ d+d+$+3 p $+$+$+$+v v v d+3+8 q+< ^ ^ 5 2 n.9 u q+5.; G < c 5.( o h+g F n b+i.R Q.+.I.+.D.S ].].<+I.t.n+4+++o+o+o+8.k+1 z.a & O g+|.k.7 ", "{ -.-.{ 4.-+`.&.x.4.4.4.4.4.4.-+4.-+4.4.4.4.4.{ -.{ q+{ -.q+{ 4.4.) -+`.`.&.-+-+-+) E 4.4.) -+4.-+`.&.&.`.`.`.`.&.) 4.&.9 >+o+9 z &.9 b+J.:+D 1 !+N.7.o+++++G.++C+B.C+C+G.f+6 N.B )+C+q.N.B )+J.G.J.4+C+o+f+f+:.4+B.u.z `.7.p.++-+{ N H n+b+{ { :.t.t.8.{ { i o.0 8.1.A C.].Q.f+-.J.: : Q.k+]+K.k.[.e.^ O &+q S ^ T B+t+B+T %+> . 0.S ~ r 7 . B+& n.$.[.0.D.B.G.A+l. .j+!.9.f+7 s 9 u u #+0. .$.z+o.q . 0.&+Q . . . . . . . t+. . . . . . . . . . t+t+t+t+D+0.0.Q Q q q B+|.[.: r.U.2+g.}.}.5+5+5+ + +1+ +t. + +t.[+[+ + + + + + + +[+ +p.[+[+*.*.*.y.*.[+p. +[+ +[+[+[+ +*.*.p.y.p. + +[+[+ + + + + + +[+*. + + + + + +t. +t.Q.Q.y+<+g.<+U.U.l U.3 U.l 3 U.3 U.3 <+<+<+y+e+t.t.t.t.5+ + +t. +1+ +t.t.t.5+t.5+5+Q.5+Q.0 }.<+L U.Q.q.*+s+8 !.-+;+2.7.p+x.!.9.9.!.8 A 8 !.9.u E ;+2.a+E+k ,+J C.R X X w E+3.f @.@.S.G+G+G+3.3.S.3.f f f X X - J J J l+j P [ [ v $+$+$+$+' $+p p p $+p p $+3 p $+p ' 3 $+$+$+g 8+3+o 3.! 3.M.U d+$+$+3 $+$+$+d+[ 0 j /.-+9 G 5 2 ^+5 (.z 9.u W X z._.5.5.( _.* A.+ z 9 8.P._ $.T & 6+|+K.].l <+0 [+4+*+x.{ 4.&.i+6 5 5+O : d q B+|.", "-.-.-.-.{ ) `.`.E -+{ 4.`.`.-+-+4.4.4.4.4.x.q+{ q+-.-.-.-.q+{ 4.4.4.`.E 4.-+-+) 4.4.4.4.x.4.4.-+4.4.4.`.-+-+`.-+`.) &.9 f+>+f+z 9 &.9 9 >+8.C+z+p.H ;+8.X.X.C+C+)+B.i.C+J.k+P.N.B 4+q.4+B B .+^.q.4+B 8.o+f+o+q.i.f+z z *+4+)+z -+-+:+#+)+-+{ 4.q.t.N.9 A u.H o.)+-+{ G.0 y+k+u !.7. .|+k+q+:+x+[.O 6 8.w.7 [.w.^ $.D+0.k.r ^ : . t+|+~ T t+. &+r %+|+. 0.> n.a .0.: H.A+G.l+0.M ) !.1.0 |.8.u 9.( [.|.Q.G+H. .. . Q B+Q . . . . . . . . . . . . . . . . . . . t+. 0.. Q 0.Q q q B+|.[.l. .r.U.g.s }.5+Q.5+5+t.t.t.5+t.5+t. +[+ + + +[+*.*. +p. +y.p.*.*. +[+*.*. +*. + +y.*. +*.*.[+t. +[+*. +t.[+ +5+ + + + + + +*. + +[+ + +t.Q.y+<+<+3 <+g.L U.L U.<+<+<+<+<+<+y+<+s }.t.t.t.t. +t.5+t.5+ +5+ + + +t.t. +t.5+t.0 Q.}.<+L <+w+C+z u !.A p+J.C+:.N { 9.9.9.!.8 u !.9.9.1.:+/.a+'+S.M.w E+E+f @.S.! G+! ]+]+]+3.3.3.f E+s.X - - J k ,.U P P P 7+P d+d+d+$+$+$+$+$+$+$+' $+' p p $+p $+$+$+$+3 $+p 3 $+F+i ( 5.< G W < n _.- d+3 p 3 v P J u+X X 4 ( _.5 $.T T T z.5.1.-.W T '.X W _.3+o * u++ E { 5.c+z.*.e.& I.o.x+x+x+x+j.0 B *+{ 9.!.q+&.W !+6+: Q . 0.7 [.", "-.-.-.-.q+4.-+z `.`.-+{ 4.-+-+E { 4.4.4.4.{ 1.-.-.{ q+{ -.-.q+4.4.q+4.4.-+) ) 4.4.4.4.4.4.) `.-+-+-+) -+-+-+&.9 &.`.`.9 i+f+z &.&.z &.9 8.B .+2.C+J.o+X.N.B B.C+C+C+^.C+++1 N.p.N.N.4+N.B ^..+4+B B 4+7.J.J.2.)+A+f+z u.C+.+f+`.-+E )+4+o+4.4.N N.#+o+{ -.*+t.N.>+x.= q.y+H.4.u E Y.U.b ) u *+y+].i.u { l+k. .1 ( @.7 Q .5 2 : 0.Q 6+^ 6+0.. k.^+_+~+. . 6+%+T 0.. 0+a 5 D.Q Q O i.8.^.B+r.D 1.9.J.q I.4.9.!./+. K.M B I.q . 0.B+q . . . . . . . . . . . . . . . . . . . . . t+0.0.0.Q 0.q q B+|.l.m+U.U.g.0 }.}.5+5+Q.t.5+5+5+ +t. + +t.5+ +*. + + + +[+*.[+ +[+5+*.[+ + +[+ +t.[+*.*. +*.[+5+ +[+ +t.5+p. +[+*. +[+[+[+ + + + + +t.o.o.s 3 <+<+<+<+<+<+<+<+<+<+y+y+0 y+t.}.t.t.t.t. +t.t. + + + + + + + + +5+Q.Q.Q.o.y+U.<+y+H :.p+A 8 { *+4 :...s+!.9.9.9.!.8 !.!.9.9.!.u.r+R.3.3.3.3.3.! S.! ! S.! G+3.3.f f w X k J J U 7+w+7+7+F+e+d+F+e+d+d+d+).v ).).$+$+$+$+$+$+$+' $+$+p $+$+$+$+3 v $+$+$+p P 3+i+5.G 1 G 5.) 9 G j $+3 p d+R.:.n G.3+n 5.]+z.w.6+> 6+w.f 3+5.5 j w.U X M.M.* J Y.f.>.-+D i.H+@.b M $.& I.I.I.s o.0 [+B.f+`.&.9 8.5 O [.Q . . . q B+", "u -.-.-.-.q+4.4.-+-+E 4.4.4.) 4.4.{ 4.4.q+4.-.-.-.-.-.-.-.-.-.{ 4.4.4.-+x.4.4.-+4.4.q+4.4.) -+`.) ) ) `.`.) `.`.`.&.&.`.&.z -+-+) `.`.&.9 >+*+*+u.f+8.X.4+J.C+C+q.B.q.C+C+B N.L.N.C+i.N.B B B ^.N.B ^.2.q.4+4+)+J.;+*+4 4+4+*+u.z ;+)+o+E 4.E i H.++-+-.x.2.[+G.-.1.N m. +b+{ ~.;+t.0 o+{ x.r+y+t.&.9.~.e+l.[+4.9.n 7 k.I.8._.K.0.B++.5 D.0.0.: ^+2 D+. 0.<._+6+. . : ^ ^+[.. 0.D.^ & [.. : w B.C+L B+#+4.9.-.y+[.8.9.9.f+7 |.t.k+.+ .. . Q B+Q . . . . . . . . . . . . . . . . t+. . t+. 0.. t+0.0.0.0.7 B+l. . .r.g.<+s }.e+Q.5+ + +5+[+5+5+ +5+ +[+ +5+ +[+[+[+t.*.5+[+[+[+*.[+ + + + + +[+5+ + + +[+ +5+ + +*.p.5+[+*.[+ +*. +1+ +t.Q.0 }.y+<+y+y+<+y+y+y+o.}.o.Q.5+t.t.t.}.t.5+t. + + + + + + +[+ +5+ + +t.5+t.5+I.<+<+L e+k+u.{ A s+>.;+C+;+p+{ !.9.9.9.!.!.!.!.9.!.{ :+#.M.M.s.s.s.f 3.3.S.S.3.f s.X X J J U j P e+[ [ d+,.* 8+* * ,.7+d+d+v $+).$+).).F+O.O.).).).d+$+$+v $+v v d+d+v v v v $+3 F+o _.6 E+'._ #.) q+5.X $+$+$+j 2.G.9 z z z z 5.W 1 6+S : O j.U J j w.[ d+w.P [ P [ F+Y./.G.k+H.@.++6 P.b n+*. +*.*.[+t.t.L.q.C+B.X.!+5+r.D+. . . . 0.Q ", "-.1.-.-.{ -.-+&.-+) `.x.4.4.q+4.4.4.{ { { 4.{ 4.{ { { -.{ -.4.q+4.4.) -+4.-+4.-+4.4.{ 4.4.-+4.q+4.4.-+4.) -+`.`.&.&.-+`.&.-+-+) 4.`.`.&.&.9 9 D D c.X.B C+)+X.)+2.C+C+++8.k+B B 4+.+B 4+B B ^.++B.B.2.4+N.N..+2.2.J.:.2.4+H q.2.2.q.++*+E E *+4+C+&.x.4.*+N.C+) -.-.;+[+)+`.1.E q.t.k+4.{ u.'+0 8.u !.A+y+y+b+9.8 2.l.r.D 9.~.<+Q |+k+( '.0.B+S 5 a B+. q C ^ S . . ~+_+r D+. 0.C ~ 6+0.. k.2 ^ U.0.0.}.X.J.'+q .b+{ !.7.B+I.{ 9.!.C.0.r.#+X.t.q . 0.B+|.0.. . . . . . . . . . . . . . t+. . . . . . . . 0.0.0.Q q B+|.l.x r.2+2+s }.5+5+t. +5+ + +t.t.t.5+ +[+ + + + + + +[+5+[+t. + + + +5+[+t.5+ + + +*.[+5+5+*.[+ +[+ + +[+*. +t.t.t.5+Q.Q.0 I.Q.0 Q.0 0 0 t.t.e+t.5+t.t.t.t.t.t.t. +t.t.[+*.*. +1+ + + +t.5+Q.Q.y+<+U.y+/+q.:+1.9.{ Y r+4 ;+= !.9.9.9.!.!.!.9.9.9.8 z J.R.* J J J - - X X s.s.- J J U P P F+d+d+$+d+d+v v ` *+u.u.:+:.'+F+).d+d+F+O.P P m m m V m P P P P F+F+,.* * * J 7+[ v v ' d+g E+k w.j.0 f E.-.&.3.P $+v 0 L.2.i J.o+f+9 ( ( (+C 0+~+].|+j.L j.j j.v $+3 $+3 v $+v 7+g C.e+p.k+X.H.H.H.b E+H+.+)+b [+[+p.N.m.n+$.e [.0.. . . . . . ", "-.1.-.-.-.-.{ 4.-+4.4.-+-+{ { 4.{ q+q+q+-.-.-.1.q+-.-.q+{ -.{ { 4.) ) -+4.4.4.4.4.4.4.4.4.`.4.4.4.) ) -+-+) -+`.&.`.) 4.4.4.) `.`.`.&.9 `.9 9 9 c.k+B )+B B q.q.2.C+B.C+++++C+++)+4+4+i.++++b+o+8.A+J.i '+B 4+B.C+C+;+7.2.'+H 4+4+2.J.:.;+;+^.4+J.`.E :+^.)+`.{ { >.'+.+z { { *+p.B -+!.!.G.,+X.4.!.E C.<+H.1.9.N e+U.a+1.9.E y+l.X.1.!.9+Q |.R D _.[.. [.a 5 K.. . K.^ +.0.. 0.+._+S . . [._+_+|.. 0.6+^ & |.. : z+i.C+L Q y.`.!.-.<+[.D 9.9.f+7 B+t.)+G+ .. . 0.B+q . . . . . . . . . . . . . . . . . . . . . . t+. t+D+B+q B+7 7 [.r.U.g.g.}.}.Q.}.t.[+5+ + + + +5+t. +t.t.t.5+t.[+ + + + +5+ +t.5+5+t. + + +t. +[+[+[+ + +[+ + +t.t.t.[+Q.t.t.Q.t. +t.t.t.Q. + +t.5+5+t.t.t.5+t.5+t.5+t.[+ +p.!+p.1+ + +5+t.Q.0 }.y+<+<+t.B.:+x.~.A = ;+2.i :+~.!.9.9.9.!.8 !.9.9.9.~.Y ` V m 7+P P P P U U m J U P P d+d+v v $+).$+$+v v v 3.( -+-.4.z ++C.7+d.m m V v+u+A.t M.A.A.u+g - - X 3.7.E.f+( _.^.M.P v $+$+d+j j w.j.& X < ( ( o J F+j 0 t.9+p.H 4+B.r+C+A+_.& ~+|. .l x+ .K U _ [ v 3 3 K l K {.K K p l 3 ,.9+t.[+[+m.H.X.++G.k+N.z+n+N.H.b *.& S &+. . . . . . ", "{ -.1.1.-.-.q+{ 4.4.-+4.4.4.4.{ 4.-.{ 4.{ -.1.-.-.q+{ -.q+{ q+4.4.4.4.-+`.`.{ { 4.{ q+4.) `.x.{ 4.4.) `.) ) -+4.E 4.-+-+) 9 9 ) `.9 i+i+9 &.&.9 o+f+c.J.C+J.b+B.4+C+)+q.7.7.++++B.X.i.B.C+C+C+b+J.++b+J.2.B 4+4+^.B.r+7.7.2.4+4+)+A+J.:.r+a+4+B.J.*+i 4+B ++N 4.= 7.4+f+-.1.x.q.N.f+1.u x.B N.z 9.9.p+t.t.`.9.!.i <+0 9 9.8 i v Q.&.9.{ e+d j.9 9.u.l q x+8.5.y+0.B+O n._ Q . B+T 2 : . . : ^ r D+. t+& _+> . . ~+2 a U.. 0.s P.C+H B+K.D { !.J.q o.4.9.!.m.0. .m.H.I.B+. 0.q q 0.. . 0.0.0.D+. . . . . . . . . . . . . . . t+0.0.Q 7 B+q B+7 |.l.r.| 2+s }.}.5+5+t.5+5+ +5+5+5+ +5+[+*. + +t.t.5+t.}.t.5+ +5+t.5+t.[+[+[+ +[+ +t.*. +t. + + + +t.[+t.5+ +t. + + + +t.t.t.[+t.t.t.}.t.t.5+5+ + +*.*.M + +5+t.Q.Q.Q.o.<+l y+p.2.f+u !.8 p+i 2.:.u.A 9.9.9.!.8 !.!.9.9.9.{ ;+'+V U m d.P P O.O.P 7+P F+d+d+d+v ).$+$+$+$+$+$+$+v @.n 9 9 &.9 < M.u+g u+u+t t ` ` ` ` ` ` M.` 3.3.o _.5.&.&.9 (+3+G 9+j [ [ d+d+v v v j - 3.3+F o ` g J _ Q.t.[+/+y.m.n+m.z+R w.|.7 .m+L l L - i M.[ j.K 3 K l @ @ @ ] @ @ F.p 3 3 [ e+,+N.)+++6 H.N.B .+k+X.1 b +W.q . . . . 0.", "-.{ -.-.-.-.-.-.-+-+4.{ 4.4.4.-.4.q+{ 4.4.-.1.-.{ 4.4.-.q+4.4.{ 4.4.) -+-+`.) { q+{ q+4.4.-+4.4.-+4.q+-+) 4.) `.-+q+4.-+-+&.`.`.`.4.{ 9 9 z &.9 f+f+f+>+f+f+8.X.N.q.^.)+++A+C+B.)+C+C+i.i.)+B B 4+i.J.b+C+N.4+4+4+^.r+7.7.r+^.2.C+7.3+3+4 ^.@.++J.n 7.a+.+A+*+J.q.N.^.f+x.x.G.B ++-.1.u :.N.G.u !.u i /+++!.9.{ H y+A+8 9.E p.y+A+9.8 4 l : 2.u 9.*+l.l.X.1.!.9+} .i.9 ++B+0.: b 2 : . 0.S n.C 0.. Q & ^+: . . K._+r B+. . 6+5 I.7 . |.b X.^.U.Q *.`.!.u y+|.8.!.9.u.|.Q I.6 i.U.. Q B+|.B+|.Q . . . . . . . . . . . . . . . . . . D+B+. 0.t+t+D+Q Q Q [.g+g+U.| g.y+}.5+t.t.5+t.5+5+5+5+ + +t.t.t.t.}.t.t.t.t. +t. +*.*. +[+ + + +*.[+ + + + + + +t.t. + + + + + + +t.t. +t.[+t.[+t.t.5+t. + +*. +*. +t.t.t.t.}.Q.s L U.y+'+J...N A 8 f+2.2.:.E 8 9.9.9.9.{ 8 9.9.9.9.u :+q.* h+- g V J m U P d.7+P d+d+).d+v d+).$+).$+d+d+v ! 5.( 5.5.D < 8+` * t ` ` ` ` ` ` 3.M.A.M.M.3.3.]+W W < 8.W G ++++@.k l+U P P d+v v v P - 3.` 8+8+8+X k m.[+[+[+[+[+[+ +$.Q.K.q 7 [.] l ].j.R.N < h+j v <+3 l @ @ ] } } } ] @ @ m+l 3 v e+C.'+N.p.n+n+B X.X..+1 !+I.g+0.. . . 0.", "-.-.-.-.1.1.1.-.4.4.4.4.{ { { { -.{ q+{ { -.-.q+4.4.{ { 4.4.4.q+4.-+) ) ) -+4.q+{ q+{ 4.4.4.4.4.) 4.) `.-+) 4.`.-+4.) -.u -.`.`.`.1.q+&.9 f+&.`.&.&.9 f+o+f+D J.J.J.G.J.J.A+++7.C+B.C+C+4+N.B B !+B C+A+B.B '+4+^.2.2.r+2.)+2.X.B.#.++7.i 2.^.k+++A+J.B.)+8.n n 4+4+C+o+*+2.H a+G.x.~.u.4+X.4.u u = H ^.{ 9.!.>./+b { 9.9.u.e+B 1.9.x.C. .Q.&.9.~.Y.l.I.f+u { p.l.H u 9.f+m+B+ +>+o+K.. 0.O 1 $.0.. D+& 2 |.. . |+^ +.0.. 0.& _+|+. . |.2 2 K.0.. x+.+C+4+} [.++{ !.G.q <+4.9.9.B 0.r.n+)+p.g+0.0.q |.0.. . . . . . . . . . . . . . D+t+. . . . . . 0.0.Q q Q Q q B+|.l.g+F.2+e e }.5+ +5+5+5+5+ +t.5+t.t.t.t. + +t.[+ + +[+ + + +*.[+ + +[+*.*.[+[+*.t.t.[+ + +[+ +[+ +5+[+ +[+[+t. +t.t.t.t. + + + + + +t.5+t.Q.o.y+U.U.y+2.z !.!.s+p+;+f.i ;+E 9.9.9.9.!.8 8 8 !.9.!.4.*+f.R.` ` R.3.` M.* h+g ,.m 7+O.F+F+).d+d+F+F+P P P [ _.`.4.) z 9 n o 8+` t M.A.M.t M.` ` M.- J J - - f @.@.b X k 9+g o B.3.M.s.M.- J P d+d+d+d+m g * ` 7.a+2.A+A+C+^.H.#+n+[+ +w.: q d } } l.L e+` A f+#.s.J [ j.U.m+@ @ ] @ ] ] @ @ l.m+F.3 <+$+v e+e+e+/+[+L.,+[+/+ +|+[.Q 0.Q q Q ", "-.-.1.-.-.1.-.-.-.{ { 4.-.q+4.-.-.{ -.-.{ { 1.{ 4.4.q+{ 4.-+{ q+) 4.4.) -+-+4.4.{ q+{ -.-.4.4.-+-+) -+`.`.-+`.-+4.-+`.-.q+4.`.z f+z 9 z 9 f+9 &.&.&.&.9 9 f+i+f+f+D c.++J.8.X.C+.+^.2.7.++J.f+b+.+.+)+2.4+B B ^.2.2.r+i 2.^.^..+++3+3+b+7.o ^.B.k+A+A+3+r+)+++3+_.! #.b+n i }+B.b+f+i '+H C+E { E C+N.>+9.9.1.'+m.f+9.9.{ '+[+u.9.9.N 0 <+7.1.!.*+y+g.k+{ A *+e+<+o+9.9.:+l <+9 9.x.l 0.: G+&.]+d Q : 2 a k.. 0.O n.6+. . 0.& ^+: . . ~+(.^+B+. . > ^ I.|.. [.a X..+<+0.Q.u.1.u t.q k+9.9.{ <+q <+.+i.<+. . 0.B+D+. . . . . . . . . B+. . . . . . . . . . . t+t+. . 0.0.0.Q 7 ] g+l.| | g.}.}.}.}.t.t.t. +5+t.}.t. +5+5+t. + + + +[+[+[+ + + +[+ + + + + +t.[+ + + +*. +t.5+t.[+5+t.5+t.5+ +t. +5+ + + +5+t.5+t.Q.y+<+L L e+'+4 = 8 !.>.2.2.:.:+= 8 9.9.9.8 8 8 !.9.!.s+*+f.` ` R.` 8+8+R.R.8+3.R.M.* * g Y.m ,.m ,.Y.V g u+- j 3.( &.`.`.`.5.o u+g V V V J u+M.! o o f - U P P j U '.0 '.w B.4 n ;+r+2.3.` 3.M.- U [ d+$+v P U u+! 3.*+{ 1.{ E f+o+J.C+B t. .d d d } @ K e+R.s+z b.r+R.X /+j.3 m+@ @ @ @ @ @ m+F.{.F.{.l 3 3 3 <+j.[ y+y+y+<+l U.l.7 0.. 0.0.0.", "{ 1.1.-.{ { 1.1.-.4.-.-.-.-.4.{ -.-.-.-.-.-.-.-.-.-.{ q+q+) -+{ -+) -+) &.-+-+4.4.{ 4.4.4.{ 4.) ) -+`.`.-+`.4.) -+`.&.-+4.q+`.`.9 >+>+9 9 i+f+>+z `.9 &.`.f+9 9 9 f+f+o+G.i.)+^.^.q.C+7.;+o+D k+C+^.4+B '+'+R.4+^.2.2.)+^..+)+2.++b+D o+>+f+o+G.A+++A+A+8.#.i._.3+_.i.C+< < i.B.< G.b+a+.+A+( ;+a+H .+( A x.;+H C+u 9.!.;+/+b+u 9.9.7.y+p.{ 9.!.2.y+4+-+9.x.'+3 H { 9.~.^.r..+!.9.*+l.q Q.) 9.;+B+} R ( 3+[.. Q & (.I.. . &+T 2 [.. . : ^+T Q . 0.w._+O . . |.r 2 U.0.. ].P.^.B .|.k+4.9.E F.: 9 9.9.(+Q B+Q.)+m.[.. . Q |.B+. . . B+0.. . . . . . . . . . . . . . . . . . . 0.. 0.0.Q q 7 @ r.r.r.2+}.}.}.t.t.t.t.t.}.5+t.t. + + +/+t.t. +t.t.t. +t. + +[+t.t.[+ + + +t.t.t.[+t.t.t. + +t.5+t.t.t.5+ +t.t.Q.t.0 <+U.U.y+)+N { s+N N :+2.r+;+>.A 8 !.9.9.9.!.8 !.!.u *+'+,.m J g M.M.3.` R.o 8+8+o 8+R.R.R.` * M.A.M.M.M.* R.X _ X ! o #.7._.- m P F+F+P d.M.]+; W ; n.5 5 k j [ [ v j.l+R.*+z E z u.;+3.M.t ` ` u+J P d+$+' d+e+C.,+A+E { u 9.9.!.1.{ z .+ .} ] } } m+3 w+:.~.!.{ z o+3+G+n+0 3 l F.F.F.F.{.F.F.F.{.{.{.l l K v 0 o.0 y+<+ .l.7 Q 0.. . . . . ", "{ { -.-.u -.-.{ -.4.{ { -.-.q+-.-.-.-.-.-.{ -.-.{ q+4.4.4.4.4.4.4.) -+-+&.-+4.-+q+q+4.-+4.q+q+) ) ) -+`.4.) -+-+-+4.) -+4.4.) ) `.9 o+z f+f+f+o+z -+`.9 i+9 z u.&.&.&.z 9 f+o+G.J.*+u.z z o+i..+i.B B 4+B 4+^.q.^.2.2.)+)+)+i.C+G.o+*+o+o+o+>+f+f+>+k+r+C+A+o i.++A+A+! C+3+< #.#.3+< A+G+++n G.a+9+.+n *+R.L.4+J.E { p+'+H.-+9.9.x.,+N.u.9.9.E l+t.z 9.9.>.0 p.`.!.9.*+e+y+>+9.{ p.|.r.b+!.8 '+7 L f+9.z .0.F.b+-+#+. . : 5 5 [.. 0.S 2 <.0.. 0.<.^+K.. . |.^ _+k.. . |+^ & |.0.q Q.H.B.t.0.g.f+u !.B.0.y.1.9.u o.0.r.B 8.[+Q . 0.: r.0.. . t+. . . . . . . . . . . . . . . . . . . . . . . 0.Q q 7 ] l.r.| 2+g.}.e+}.5+t.5+t.Q.5+t.Q.t.t.5+t.t.t. +/+t.t. +5+5+t.t. + + +t.[+t.t.t. +[+5+5+0 5+t.Q.t.5+t.0 t.0 <+3 <+y+p.;+x.9.!.N 2.2.7.*+= !.!.9.!.!.!.9.9.!.!.8 b.'+w+P P d.m J J V g M.3.R.R.R.8+R.8+8+8+8+8+` ` M.- 3.z.Q.w.j.o.[ [ l+e+d+d+v ).v 7+E+c+^ ^ ^ ^+^ ~ ^ z.'.[ v $+[ ` ;+..a.N >.*+M.J * M.t t M.V j $+p p $+v [ L.^.q.i *+u.-+{ 1.!.c.<+] ] ] ] {.3 /+n { u 9.9.9.u -+D 1 0 y+3 U.{.{.{.F.{.F.l F.l {.l 3 y+t.Q.Q.I.o.r.7 q 0.0.0.0.. . . ", "-.-.-.-.1.1.q+-.{ -.q+-.-.{ 4.{ -.-.-.-.-.-.4.4.4.) `.-+-+4.4.4.4.) ) ) E 4.`.-+4.-+`.`.) -+) -+`.&.`.`.-+) ) 4.4.{ 4.4.4.q+-.q+) `.9 o+&.4.9 o+i+D f+>+G.o+f+9 z 9 z &.z i+f+f+f+9 &.&.9 8.i.B m.N.H ^..+^.B 4+2..+4+a+a+4+4+i.(+b+8.B..+.+B k+>+f+G.H+_.++< ]+i._.< _.)+k+3+< ! ]+8.n o ! _.n r+s.i.n J.a+a+< ;+;+i '+N.B.z 8 x.r+#+b+9.9.!.2.t.b+!.9.u 2.y+++9.9.!.q.0 i.{ 9.:+v l.t.4.!.u.y+l.N.-.!.2.l.7 #+u 9.B.Q q '.i+o+ .. Q O 1 & 0.. q +.2 : . . ~+^ r T.. . O %++.0.. 0.T 2 U.Q . [.P.)+)+r.0.z+-+!.{ U.Q 8.9.9.z |.0.<+++J.g.. . 0.B+B+. . . . . . . . . . . . . . . . . . . . . . . . . . 0.0.Q q 7 |.[.l.r.| g.y+}.5+Q.Q.t.5+t.t.t.t.t.t.5+t.}.[+t.t.[+ + +t. +t. + + +t. +t.t.t.5+t.Q.t.t.Q.Q.}.y+U.<+y+L.:.:.b.p+A x.r+2.;+>.~.8 !.9.9.!.8 A !.9.9.u :+R.g Y.J ,.U m P U P m J g - M.M.3.3.R.R.` ` ` * - J J k _ w.O x+x+L $+v $+$+' $+).P w b 1+I.O O +._+; n.E+k P d+7+f.b.+ % Y Y + h+F+m - ` t t t J v 3 3 3 L 3 #+)+/+y+0 e+C.'+2.;+4+U.m+@ @ @ F.3 w.@._.n ( z -+-+{ -.>+P.[+0 0 y+<+p U.{.{.l {.F.F.F.l j _ Q.o.I.w.U.[.d Q q 7 B+0.. . ", "-.-.1.{ -.1.-.-.1.-.-.-.-.4.4.{ -.-.-.-.-.-.-.4.4.) `.4.) -+4.4.4.4.-+`.`.) `.&.`.`.-+`.`.`.`.4.) `.) `.`.-+) ) `.4.4.q+4.{ { -.q+) &.9 &.) i+o+>+D f+D D D G.f+f+9 >+D (+b+G.f+f+f+9 &.i+k+++J.A+C+B 7.B.X.H 2.*+i.#+L.L.#+H 4+7.2.#+p.[+p.[+m.)+b+A+H )+k+b+i ! )+3+++^.i.n A+2.! < < B.i.< < o ! A+3+2.R._.3+2.B.3+3+A+3+;+7.4+#+B.:+x.A :+C.m.`.9.!.>.l+H { 9.9.u.e+p.&.9.9.J.l y+D x.{ ;+y+0 f+9.= e+7 L f+9.!.'+d r.*+9.-+ .. l.G+9 i.q 0.m+z.5 l.. . S ~ T Q . . <._+O . . Q a _+: . . [.^ 1+: . 0.s 1 )+p.0.|.++{ !.o+Q r.&.9.9.C+. B+5+k+p.|.. . B+B+0.. . . . . . . . . . . . . . . . . . . . . . . . . . 0.0.Q q B+|.[.r.| g.y+}.Q.5+t.t.Q.}.t.t.t. +5+t.}.[+ +5+5+ + +[+5+t.t.[+5+t.t.Q.Q.t.0 0 0 }.y+U.<+y+H u.!.!.~.b.:.2.C+;+= !.9.!.!.8 !.9.!.8 !.!.{ *+q.M.* s.- - - Y.J J m 7+U P 7+m Y.Y.g M.M.* - J l+[ j R e.+.w.w.o.j.v ).$+d+$+$+v d+'.$.w.O x+|+x+a 6 ~ G 3.h+Y.` ..a.a.% % b./.g d+d+m A.` t 3.V v {.K l L L '+( P.D.U.l l l r.3 v {.{.F.F.F.F.l x+z.1 c+c+]+6 k+8.(+++P.!+z+n+y. +t.v l l F.{.{.{.{.l y+'.Q.0 w.w.].[.d } ] K.S q . . ", "{ { -.-.-.-.4.`.4.-.4.{ -.-.{ 4.-.-.{ -.{ 4.) `.`.`.-+-+4.4.4.4.4.) 4.4.4.) 4.4.`.4.) 4.`.-+-+`.`.) -+) `.`.`.4.q+{ { -.-.q+q+q+4.) &.&.z 9 9 i+>+f+f+c.J.G.b+o+i+u.f+D b+i.f+9 9 9 9 z 9 D 8.7.b+i.H.B B 4+H 2.i.H.#+H N.#+L.B 2.B..+B B B )+)+)+B.4+'+a+#.++o 4+_._.#.! _.3+r+i.< < r+! < < r+! < 3+o R._.F r+R.3+3+A+i ++b+D 5.c ( 9 z ;+h+[+L.2.....'+e+C+u 9.!.4+0 b+!.9.8 H <+4+1.9.A '+t.b+1.!.u.U.|.[+4.!.= 0 ] H 1.9.b.l.Q 0 4.9.7.q 7 m.9 G.K.. 0.j.^ $.Q . Q & ^ |+. . B+2 ^ [.. . : ^ T 0.. . +.^ s q . q 1+B )+y+. x+f+1.9..+0.*.u 9.1.s . g+B ++t.0.. 0.D+B+0.. . . . . . . . . . . . . . . . . . . . . . . . . . 0.Q q q 7 |.r.U.g.g.}.t.5+t.5+t.5+5+t.5+}.5+t.5+5+5+t.t.5+ +t.t.5+t.5+t.Q.Q.0 y+L l <+e+C.h+4 s+!.x.2.4+i o+N 8 !.9.9.!.8 !.!.9.9.!.8 ..f.R.` M.* h+* X X X f R.R.R.` M.g m U ,.,.w+P P e+v M.E+_ $.*.$.$.'.7+P O.F+F+F+v v [ d+w.w.O w.w.$.2 P.f f L.L.:.A !.8 8 A s+a.k v v P t 8+t t J 3 K F.F.F.L 9+o+1 o.K.K.r. .l.[.m+K K K K {.K l.x+a 5 ^ 1 ^ ^ 2 2 P.2 e.e.5+5+1+z+X.p.<+| F.F.F.F.F.K $+w.Q.Q.Q.I.|+[.} d l.x+|+k.. . ", "q+4.{ -.{ 4.`.&.z -+4.{ -.4.&.&.-+{ -.q+-.4.4.-+-+) &.&.-+4.-+-+) 4.4.q+{ 4.`.`.) 4.4.q+4.`.`.-+`.`.-+`.4.) `.4.q+q+-.-.-.-.-.-.q+-.4.`.`.9 9 f+>+9 o+b+J.f+(+G.b+D f+f+f+o+o+9 f+f+>+o+9 >+X.q.r+B.N.H B 4+^.^.B N.4+4+L.p.Y.H q.^.^.B.#.r+C+B.^.4+H 4+_.#.B..+)+i B.! #.A+r+! _.J.i ! _.n i ! A+< i ! A+3+#.S._.< r+! 3+) u q+`.{+{+`.1.u 8+w H.s.L.Y.p./+h+4 Y :.l+H E 9.9.>.0 N.-+9.9.*+e+p.{ 9.9.b.L U.J.1.8 *+L <+b+u x.p.} .7.9.8 C.d l z 9.x.l . B+E+&.Z q 0.|.a 1 |+. . k.2 a T.. . K.^ C . . . e.V.> . . q a r r.0.. : n+)+i U.7 B 4.!.u U.Q b+9.9.`.7 . g..+X.2+. . 0.q q . . . . . . . . . . . . . . . . . . . . . . . . . 0.. Q Q d d 7 [.g+r.| y+}.y+Q.e+}.}.t.}.t.}.t.t.5+t.5+t.t.t.}.0 y+}.o.s U.l <+'+E 1.x...:.*+q.q.J.p+{ !.8 8 !.!.!.8 8 !.!.9.u E.f.o 8+` M.J J C.- s.3+( 4.1.{ x.E b.` ,.7+P d+d+d+Y.:+_.w R b f _.R.u+u+V V V V J l+0 j.j.j.0 w.w.j j '.U U ,.w+` E !.9.9.9.9.u B v v m t 8+8+t J 3 F.m+m+F.L /+i.P.w.S r.|+ .l.7 l.{.K K 3 l K : x+z.^ ^ 5 5 5 5 2 a T +.O K.K.U.I.G+1 Q.l {.F.F.F.F.l j.o.o.w.w.Q.O [.d q ] ].|+B+. . ", "4.4.4.4.4.`.&.z z `.`.) `.&.`.&.z ) { -.4.4.) ) `.-+-+-+`.&.&.&.`.-+4.q+-.-.-.4.) -+-+{ q+4.) `.4.`.`.4.) 4.4.4.4.4.-.-.1.-.-.-.q+{ q+q+`.`.`.9 o+9 >+c.z 9 G.++++G.b+f+&.o+o+o+>+f+c.X.:+(+X.2.G.8..+4+4+^.4+b N.L.H n+p.C.p.'+4+'+'+a+4+4+H '+w L.s.)+B.! .+o r+B.)+#.++_.i.r+3+7.o _.n A+]+_.n 3+! #.n 7.! _.n r+R.3.`.) &.< H+z.2 6 ) 9.`./+a+}+L.,.7+7+7+7+7+7+e+'+u.= p+h+y+)+1.9.8 '+0 G.9.9.1.H y+B -.9.u '+y+4+x.!.u.y+[.o.&.!.u.<+} p.1.9.f+l q L `.9.J.B+Q y+>+-+t.. . K.1 z.|.. t+|+^ O . . Q a ~ : . . T.^ 2 k.. . : ^ I.g+0.: }.H+C+4+0.|.G.-.9.9 q g+`.9.9.i.. 0.Q.i.p.|.. . 0.D+0.. . . . . . . . . . . . . . . . . . . . . . B+B+B+Q Q Q Q q 7 [.g+r.2+<+y+}.t.Q.t.}.t.}.0 +t.t.0 }.y+U.L r. .F.U.3 e+h+u.!.!.E q.4+C+J.:+A 9.9.!.x.= !.9.9.9.!.!.~.;+f.8+o 8+R.g P F+P Y.E.4.u 9.9.9.9.9.{ 7.Y.e+[ d+d+* z b+P.#+S.3+= *+f.t t * ` R.3.S.E+X k _ j j [ j.j.v v v v v l+B.:.N ~.{ 8 4.b d+[ V 8+t 8+` U 3 l m+m+l j.R 5 z+6+K.: K.].[.7 l.{.K p K K F.l.w._.5.D D j+W 6 ^ 5 T & O K.l.: ._ P.Q.3 F.F.m+F.F.{.j.w.0 w.Q.+.D.: B+d ] ].O B+. . ", "4.-+4.4.) &.9 9 9 z &.z 9 &.z &.&.&.&.`.`.-+) ) `.) -+-+-+`.`.`.-+`.4.4.-.-.-.-.4.) 4.{ q+q+4.4.4.) ) 4.-+4.4.-+4.-+4.q+-.-.-.-.-.-.{ -.) ) 9 i+f+9 f+o+G.c.8.++G.b+++f+f+f+o+G.o+D c.8.*+8.C+G.(+k+}+^.4+B..+H N.H N.H H H H '+'+4+4+a+4+'+N.H H H a+)+B.^.i.C+#.)+B.++C+#._.3+++B._.< 3+r+_.n A+#.#.n 3+]+o D 3+3.3.S.&.D b |+K.: .|+G 9.{ j U C.,.,.7+7+7+7+l+/+p.2.n * 7+[ e+C.2.:.q.e+L.E 9.9.u.0 p.x.9.9.p+y+/+o+9.9.:.L l C+E { J.U.<+G.!.{ L.l.[.4+{ { L.] ] C+9.!.H d 7 m.&.D [.. q I.1 D.0.. B+2 2 k.. . |.^+r Q . . > ~ O 0.. B+C 2 D.B+. q n+^.J.Q.0.y+z 1.9.X.. }.1.9.!.}.. |.*.X.Q.0.. . 0.0.. . . . . . . . . . . . . . . . . 0.0.B+[.B+. . . . 0.0.0.q q |.|.r.| <+2+}.0 }.y+}.y+<+U. .[.] 7 7 : <+L.J.4 q.f.:+x.i '+7.*+>.s+A !.!.{ *+..s+A 9.9.9.= F r+o /.4 f.3.P v d+,.f+-+z ( 5.5.E u 9.4.^.l+[ d+e+,.2.q.,+,+a+*+E *+` ` ` ` R.8+o W c 5.(+W ]+f k j [ d+j.j.v 3 v #+w ^.i 7.4 q.l+d+[ u+t /.8+A.j 3 l m+K j.Q.a 2 e.O |+K.: K.|.] F.K l p 3 K F.l.k -+9.9.9.1.-.) i+8.5 e.I.D.|+K.].j.$.o.l F.F.F.F.{.{.<+o.w.I.0 w.S [.7 d ] ].> B+. . ", ") 4.-+-+&.9 9 9 z z z &.&.9 z z `.&.E `.4.4.4.) `.-+) `.`.`.-+-+`.-+) { -.-.-.q+4.q+{ -.q+{ 4.q+4.4.) -+4.4.4.4.) `.`.-+4.4.-.-.-.-.) { -.) `.9 f+o+o+f+f+b+B C+J.G.G.b+D o+i+&.6 B q.7.o+>+G.z 9 k+^.^.^.4+'+N.#+H H p.L.N.4+4+R.R.4+q.4+H.'+'+H 4+)+)+B.B.C+#.i.i._.A+#.B.++< #.B.A+n #.#._.D _.]+8.< n ! G < 5.! X 3.]+_.E+w.|+|+> e.{+9.z J 7+7+w+7+,.7+7+w+l+C.f #.3+i l+v d+7+7+7+e+e+H :+= p+'+o.A+9.9.!.4+e+b+!.9.8 N.l [+-+9.!.H y+B.u 9.>.y+[.<+G.{ p+y+7 y+u.9.{ t.7 <+z 9.E .0.S k+( +. . [.5 1 : . . .^ C 0.. . D.^ > . . 0.e.%+g+. . Q 2 e.r.0.. : b )+C+U.0.H+4.9.!.s . k+!.9.z [.. |.*.!+| . . . 0.0.. . . . . . . . . . . . . . . [.. . . . . . . . . . . 0.7 d 7 [.l U.F.g+] } 7 Q Q 0.. 0.@ U.[+u.!.!.E 4 B 4+q.J.*+x.!.!.8 E E 8 8 s+s+= = E n /.o f.o /.4 8+g F+v P F ( _.C.j.$+P F !.9.b+7+d+[ d+d+P e+v e+7+'+8+'+g V * 3.3.]+o < c c.(+< 8.< 5.F '+w+[ v j.L e+R m.H.)+X.L.[ v v F+M.t 8+t M.F+l . .L '.R a e.C I.6+6+S : 7 F.L v v $+3 3 m+m+k z u 9.9.9.9.9.9.q+D b I.x+l l l ].3 l F.F.F.m+F.F.F.K L x+D.x+]. .} d } ] l ].B+. . ", "`.-+) -+-+`.z 9 9 &.&.`.&.&.z &.`.`.z -+4.{ 4.4.4.) 4.4.) `.-+4.q+4.-.q+-.1.-.-.-.1.-.1.-.-.-.{ -.{ 4.-+4.{ 4.4.4.q+4.) 4.-+q+4.q+-.) -.-.) `.&.9 D o+o+b+X.7.J.G.i+8.8.J.G.X.X.8.X.^.;+G.>+b+8.D k+A+^.q.B 4+H H H #+#+B i J.)+4+q.4+'+'+B B 4+4+)+B..+X.)+C+#.)+k+++< i.++++3+A+6 A+< n G A+< 5._.o 8.< n S.G < n ! - X E+5 1 G+W n 5.) { n m m ,.,.,.,.,.,.,.,.C.k 3.o 3+}+l+7+7+7+7+v l+#.3+R.7+d+e+i E = :.0 C.-+9.9.>.0 0 f+9.9.N y+0 z 9.9.u.3 .4+x.-.;+l m+4+u 8 ;+<+[.4+1.9.G. .] B 9.9.H . q t.( 9 |+. . |+1 & . . t+w.2 |+. . Q a ^+|.. . k.^ r B+. . : 2 I.[.. . <+H+A+C+q B+D u 9.) B+D+o+!.9.8.0.0.| z+n+[.. . . 0.0.. . . . . . . . . B+. . . . . . . . . . . . . . . . Q q Q 0.0.0.0.0.0.0.0.0.d m+m+l L.*+x.E 4+p.4 ;+>.N A !.9.{ :+x.9.9.9.8 i '+* * * M.` 8+8+4 R.- F+[ V ! ]+E+y.Q.o.s.E 1.b+l+d+y+d+v v p p v d+F+e+O.e+F+7+J J s.3.G 1 _ $.'._ G -.1.N 4 C.e+e+Y.2.i.}+w .+)+n+j.3 3 F+A.8+8+8+u+[ v l .j S.]+5 a e.e.e.e.O K.|.3 j U U U j j.].].[ f ! 7.*+f+E { !.9.q+6 o.l l F.{.F.K {.F.F.F.m+F.F.F.F.{.l {. .m+l.] 7 } ] .[.Q . . ", "z `.-+-+-+`.&.z z 9 9 z &.&.&.`.z `.-+-+{ -.q+4.`.`.-+4.4.4.4.4.-.{ q+-.-.-.u u u -.1.1.1.-.-.1.-.-.q+4.) ) 4.4.4.q+-+4.`.4.4.4.{ -.-.-.-.4.&.9 i+>+f+o+c.J.f+f+f+f+b+G.b+D )+4+q.)+B 4+*+u.9 f+D i..+2.i 4+'+4+2.C+N.N.B 4+)+)+)+)+4+4+N.N.B 4+.+)+B.)+^.B.C+++B.B.C+++n B.++++< A+k+3+< 5.]+A+< 5._.! 3+< n ! G n n f _ '.k X G+G n 5.Y E.b.- ,.Y.g h+* L.C.C.C.C.C._ #.A+R.C.7+l+7+e+e+3.7.q.C.d+v L.F 4 '+7+[ p.:+x.p+'+e+b { 9.9.2.y+r+!.9.!.q.U.0 ) 9.!.r+r.t.`.u u 4+m+U.o+!.8 N.l.U.b+9.E o.q [.o+9.{ y+0.Q y.9 Z 0.. d & 1 ].. . T.2 T k.. . [.^+& 0.. . S ^ O 0.. . |+a s |.. 0.p.)+G.B . r.z 9.9.b+. : `.!.u y.. 0.g.n+5+B+. . . 0.. . . . 0.. . . . . . . . . . . . . . . . . . . . 0.. . . [.g+. . Q l.[.7 m+3 w+4+'+p.7.:+!.{ s+~.A A x.= s+~.8 { ^.l+[ P P U J M.R.o 4 8+M.P F+P J k X b y.S.b+*+2.,.e+d+v y+3 p p $+$+p ' $+d+d+).[ F+[ U 3.z.0 x+K.l U E 9.9.E q.g * F z G.X.#+^.J.b L 3 3 [ /.E.= E.5.! k 0 [ ;+E >+8.6 G+G+G+G+e.K.l.v m g - J U [ L L O <+L L j.y+t.#+q.J.*+b x+l F.{.l F.F.F.{.{.m+F.F.F.F.F.m+ .m+m+l.l.} } d ] ] d q 0.. ", "z z z z z 9 9 9 9 z 9 z 9 `.z &.E -+`.) 4.4.4.q+q+4.`.`.) 4.4.q+q+{ q+{ -.-.u 1.u -.-.1.u 1.1.1.1.-.-.-.-.) -+) { q+4.4.4.4.4.) q+-.1.-.-.`.4.`.9 f+i+f+o+o+f+f+o+o+c.G.o+D b+)+4+7.B.4+C+b+9 >+>+k+B B '+q.4+4+2.B 4+B B 4+.+^.)+)+)+^.q.4+4+4+4+)+)+B.6 X.B.k+++B.k+C+8.8.B.++A+< A+k+8.n n ]+A+< ( ]+o _.n < f G < < E+_ _ _ - o 3+F % 3+% R.- - L.L.'+s.#+#+#+X J G+n o a+Y.,./+7+P L.F o M.,.e+,+i 4 a+C.d+7+! 3+r+'+p./+N.2.:.++,+t.z 9.9.x.t.0 G.9.9.E 7+l C+!.9.8 /+<+B.u 9.x./+r.B 1.u i r.d t.{ 9.`.<+q F.`.9.G.0.. : ++9 o.. . : z.a B+. . : 2 6+0.. . |+^+> . . . +.^ S 0.. 0.e.e.2+Q . |.b C+o+o.0.Q.4.9.9.M . }.{ 9.-.2+. Q s p.2+0.. . B+B+. . . . . . . . . . . . . . . . . . . . . 0.. 2+o.q Q |.l.7 } @ l.F.p w+B i :+x.!.9.!.x.N !.9.!.!.~.:.p.d+v d+d+F+F+J g M.8+i o 3.m v d+[ [ j j U '+;+f+*+2.C./+e+y+d+d+$+$+$+$+$+v v $+v v v d+P _ _ $.j '.k i u.x.>.o M.R.4 b.7.}+[+a+;+b L 3 $+[ o z A !.!.!.1.-+9 { 9.!.z u.f+>+>+f+(+I. .d+J J - J U j j.x+x+]. . .F.l l U.L y+y+U.l {.l F.F.F.{.{.{.{.{.{.{.l {.l F. .m+m+l.l.} } } d } d Q Q 0.", "9 z 9 9 9 u.9 z u.9 9 9 z 9 z z `.4.) -+-+) 4.{ 1.-.q+4.4.4.{ { -.-.-.1.u u 1.1.1.1.u -.-.u 1.1.-.1.-.-.q+4.) -+4.{ 4.`.-+4.4.4.4.q+q+1.q+`.-.) &.9 f+>+f+f+f+i+f+o+o+G.f+o+o+b+B 4+G.k+^.*+z 9 D G+H L.H :.o+B..+N.4+N.B C+B n+B 4+^.)+4+4+N.B B .+)+)+B.A+i.i.k+++i.B.#.3+_.i.#.A+n #.#.< 5._.]+< E._.! #.5.< f ]+9 -.4.9 5.G ]+3+% n % n 4 R.M.s.M.M.'+f 3.! S.X E+n i ! s.Y.,.,.w+U 3+i '+Y.w+j ! 7.a+* C.e+s.3+4 2.i.G+@.H.p.w+C.H 2.*+~.= 2.e+B.8 9.9.r+y+H { 9.9.G.L 0 &.9.9.u.y+,+`.9.!.4+l.[.++!.8 2. .7 B u !.B Q Q +u 9.t.. q 0 b+( : . . |+5 }.0.. . 6+2 |+. . . +.r r.. . B+^+^+k.. . k.2 +.r.0.. U.B ++f+r.. B.1.9.9.r.. !+-.u >+B+. B+0 [+g+. . . . 0.. . . . . . . . . . . . . 0.0.q Q r.<+g+|.l.7 Q d } m+ .m+y+B J.{ x.= A 9.!.>...N A !.u C+e+v d+v v d+d+F+P J M.R.i o R.V [ d+d+v v v '+{ 9.9.-+G c+G+H.p.p.7+e+d+v $+$+v $+$+$+$+3 $+d+w.j w.j '.J M.8+a+g g L.* * h+C.l+w+g /+3 3 L [ U X R.o n z E { !.9.9.9.9.9.!.!.8 !.u W ].v P j [ [ [ O L x+l .m+[. . .].<+L <+l m+l l K {.{.K {.{.{.K K K l 3 K l F.l F. .m+@ ] } } ] d d d d 7 ", "&.z z 9 9 f+z &.z z z &.z z z z `.E &.`.4.4.4.) 4.{ q+{ q+q+-.-.q+{ q+-.-.1.1.1.1.-.u 1.-.1.1.1.-.1.-.-.-.-.q+4.4.4.4.) -+`.-+) 4.`.&.&.&.&.4.q+q+&.i+o+o+i+9 f+>+b+b+b+o+f+9 >+b+7.C+i.7.G.u.&.f+k+)+^.H q.b+i.q.B 4+N.B X.B N.N.N.N.N.H }+n+N.N.B B 4+B.f+++X.B.++i.)+6 ++C+)+i.< A+#.#.n < r+o (+n _.o n n o S.< c ) q+1.u 9.u E.n E.E.F 8+R.M.s.M.}+a+S.S.3.w E+< < o 3.M.s.- w+J r+3+! M.,.7+M.3+8+* C.w+R 3+i ! o B.]+S.E+b @.r+7.7.7.7.'+C.'+F a.~.= Y.y+7.9.9.!.L.<+J.!.9.!.H <+4+8 9.!.#+l.y+o+1.{ p.7 <+f+9.>.j.0.l.D 9.z .. : :+9.8 : . Q M 9 1 . . B+5+5 |+. . Q e.T : . . : ^+C &+. . : %++.0.. . S 2 s l.. . o.)+o+o+0.0.o+9.9.) D+0.k+-.u ++0.. r.5+Q.[.. . . . . . . . . . . 0.B+r.r.B+0.q q Q q 7 q 7 7 @ @ l.<+H r+~.9.!.~.= E 8 x.E N a.*+B e+v d+d+d+v d+d+e+P ,.g M.8+#.8+s.j d+d+j.j.'+z !.9.4.++W ; W G 8.:+J.'+d+v d+v $+v $+v $+3 $+$+$+v j.d+j.d+e+d+d+F+e+P e+7+7+7+7+d+v 3 $+v j.[ _ k k X E+a+.+^.7.J.= 8 u 9.9.9.9.9.4.*.y+L 3 K L l l l ]. .l.l.: m+U.j.o.y+x+r.m+{.l l K l K K K 3 v y+[ 0 0 j.j.L L l . .m+@ ] ] l.l.l.m+ . .", "`.&.&.9 f+f+E -+`.`.-+&.9 9 f+9 z `.4.-+-+) ) 4.4.q+{ q+4.-.-.-.-.-.{ -.-.-.-.-.u 1.1.-.-.-.1.1.u 1.1.1.-.-.-.4.4.q+4.4.) `.) -+`.`.&.9 `.) `.) 4.`.i+f+f+f+f+f+>+D G.f+D f+9 i+b+(+i.4+)+++o+&.9 D k+^.q.N.4+^.C+4+4+N.'+B N.N.N.N.H m.N.4+4+^.4+4+B .+)+B.X.)+k+C+)+i.A+A+C+k+A+b+++k+< < A+G < n _.o < n 7.! W (+(+j+c c i+&.-.( % E.F i o a+3.3.S.^.S.]+P.E+]+< n o f L.X #+k J 3.3+o a+- ,.X 3+i R.L.J J _.A+! ! }+]+++D 9 z &.i+#.'+2.B.3.R.;+Y ..b.` 7+e+L.:.*+7.0 e+`.9.9.`.e+t.z 9.9.z y+r.)+9.9.x.y+ .B.z u :+r.Q Q.{ !.r+] 0.0 { 9.z .. .z 9.C+0.. [.Z 9 s . . B+e.T [.D+Q K.5 C 0.. . g+_+C t+. . > ^ > 0.. . > a I.: . Q n+k+u.k+. |.-+9.9.>+. Q o+1.q+M . . . . . . . . . 0.q q Q [.|.. . 0.. 0.q q q 7 ] l.l.] 3 7.:+p+x.!.9.9.:+:+{ !.9.u ;+p.d+v v y+v d+v d+F+P P 7+Y.M.R.o _.R.,.d+e+j Q.m.^.C+@.5 6 ; W 8.`.9.!.f+l+$+v v d+$+d+v $+v $+v v v v j.v v v d+d+d+).v d+F+F+e+e+v v $+3 v j.0 '.t. +1+[+y.9+y.[+p.* /.Y >.x.{ x.A z [+x+l .F.m+F.l.l.l m+ . . .K.0 _ $.o.U.l.m+l K 3 K 3 $+v [ e+U U J k k k _ '.0 0 j.L ].].l l l ].L L |+L ", "-+&.`.&.9 u.&.-+`.&.z `.9 z `.z z `.`.-+-+-+) ) 4.4.4.-.-.-.-.-.1.1.1.u 1.1.-.-.1.1.-.1.1.1.1.1.1.1.-.1.1.-.-.q+4.{ ) 4.) 4.4.) `.&.&.&.E 4.4.`.`.`.9 i+i+9 &.i+9 9 z 9 c.G.f+f+c.J.G.B.C+4+7.f+i+8.)+B.w H a+a+H '+R.4+'+'+'+B N.B 4+4+N.B B B B 4+B )+)+)+X.B.B.B.i.++++C+B.++A+++_.< n ++o < 5.3+! A+n 3+! _.< j+c c c c c c n.G E.n F 8+! S.a+! i.#.8.f+-.9.9.1.q+_.k X - k C.s.F i ` M.Y.J _.3+! 3.- l+! n ! M.^.z z &.< S.E+Z i+( Z w+a+r+3+E.E.E.E.F s.e+e+C.w+7+e+l+'+:.;+'+y+N.!.9.9.C+<+[+E 9.9.7.m+s = 9.9.7.} : G.u 1.p.|.d .+9.{ C+l.Q #+1.!.p.0.0.0 1.!.Q.. . K.Z k+: . 0.U.b I.t+. . |+^+> . . . O _+S . . . & ^+g+0.. 0.& e.g.B+. |.B J.`.*.. g.u !.9.!+. . . . . . . . . 0.0.0.0.0.0.. . 0.0.Q d Q 0.Q q ] ] 7 <+o+!.!.x.E N x.-+*+;+p+x.{ k+0 y+d+$+d+v ).$+d+e+e+e+e+P 7+- ` o 4 R.k 9+Q.o.o.D.].].> <.T r 5 D { 9.4.p.$+v v d+d+F+d+d+e+[ [ [ [ [ d+j 7+,.g g Y.m 7+7+F+7+F+d+d+v $+$+v j.0 Q.t.Q.$.5+t.t.t.t.l+g * ` ` f.f.* * H [ 3 {.m+l.l.l.@ m+ .m+|+]. .K.x+o.Q.D.: ] m+K {.K $+d+w+,.J J - k - k k k _ k U '.j [ j.w.j.j.L x+L l ].m+", "`.&.&.&.z z `.-+) -+`.&.-+E `.`.-+&.-+) `.`.-+-+4.4.{ -.-.1.1.1.1.1.-.-.-.{ 1.-.u 1.1.-.1.-.-.1.1.1.1.-.-.1.1.-.{ -.q+4.q+4.) `.`.`.`.-+`.`.4.4.`.`.&.&.i+z z 9 9 f+&.i+o+c.o+f+f+c.f+o+k+B i *+f+D i..+i )+q.^..+'+4+7.++B.B.q.4+^.i )+2.^.B N.H.N.4+4+4+B )+B.)+X.C+C+k+i.++3+C+B.A+n ++#.A+n 3+o 3+n 3+o W 5.c c c i+Z.5.c ]+T 3.n /.! ! ! ! o ! 8.-.9.9.9.9.9.9.9.9.@.s.3.X k #.3+M.M.s.- 3.n R.3.s.J X < o M.s.< 9.++_ S : : K.w.(+D E+[ f o 3+E.E.n n _.a+9+#+N.N.N.p.,.l+7+e+[ '+N { :+C.y+J.9.9.u /+U.B.u 9.{ w+[.t.4.9.{ /+|.<+)+E { B 7 .u.!.z y+0.|.B.!.{ L . Q C+9.z [.. . D.k+1 0.. . O 2 |+. . . I.^+: . . . T r ~+. . t+a r |.. . 0.1+5+s &+. r.++o+`.g.. . . . . . . . . 0.. . . . . . . 0.0.7 7 0.0.0.Q Q q q l ^.{ 9.9.8 E u.{ 9.!.{ E ;+N.e+v $+d+$+v d+$+v d+d+F+e+d+[ F+J M.o _.! w t.w.D. .[.k.~+0+~+S S o.p.4 C+t.$+v v d+d+7+L.a+! G ; c+5 E+f R.R.8+8+` ` t ` * g g ,.m e+d+v v v j.t. +t. +$. + +1+ +t.l+L.A.* ` ` R./+K p K l F.F.m+l.l.l.m+L D.w.6+S K. .].L U.] [.m+{.K 3 d+U J - V J k J U j 0 [ j j '._ '.'.'.[ O O L l .l.} 7 ", "-+&.&.&.&.`.z &.`.) -+&.&.E -+) ) ) 4.) ) ) ) ) 4.q+q+{ -.-.1.1.1.1.1.-.-.-.-.-.-.-.-.4.-.-.-.1.1.1.1.1.-.-.-.q+q+-.-.-.4.q+4.) -+`.) 4.4.) 4.4.) `.&.`.z &.z z 9 f+i+o+G.G.D o+9 G.>+i+>+8..+C+o+9 u.f+f+o+D J.b '+4+7.8.H.N.'+H 2.++N.^.2.r+:.D i..+4+4+^.i.)+.+)+C+C+B.#.A+++#.++b+3+#._.5.< #._.5.n o G z u u u 1.-.) {+~ T $.- 8+M.M.M.3.s.3.! u 9.9.9 5 e.a j+u 9.4.0 f S.! _.n s.J X f o < 3+X ,+s.]+n ! U C.! &.G Q.: k.T.k.O G+++@.v L.3.o A+5.i+{+{+{+i+8.#.}+M.@.B N.L.l+[ 2.F R.C.e+y+w+4 b.7.y+t.4.9.9.z <+<+:+9.9.z <+l.^.1.9.E 0 r.N.-+u *+U.Q s { !.++l.0.r.9 9.G.7 0.B+G.9.D q . q n+D 1+. . 0.& T : . . 0.T T &+. . 0.2 r D+. . k.2 I.|.. . B+I. +s 0.. . . . . . . . . . . . . . . . . 0.} l.q 0.. . 0.0.0.7 ].9+:.x.9.9.9.!.= :+x.!.!.z [+e+7+d+d+d+e+d+d+d+v d+e+d+v v v [ 7+h+i .+#.o+b+H+D.K.~+k.0+T.T.k.[.].<+y+e+y+$+$+$+d+p.8+i B.W h Z.Z.c W _.o 8+f.8+8+` 8+8+` ` t * * g J P [ @.n (+3+++B.H+w z+n+ +'.C.* * ` ` ` s.y+3 l {.F.m+@ m+l.l.l 0 '.Q.w.O S K.K. .[.} @ m+K 3 3 P - V - J U j [ [ j.j.3 j.j.j.0 0 0 w.[ x+l : ] 7 q 0.. ", "`.-+`.&.-+`.`.`.) 4.) &.&.&.E 4.4.4.4.q+4.4.) 4.q+{ q+4.q+-.1.-.-.1.-.-.-.-.1.1.u u u -.1.-.1.1.-.-.-.-.-.-.-.-.{ -.-.-.-.q+4.4.) `.-+4.q+4.) ) ) -+-+&.&.&.&.9 i+f+o+o+>+o+*+o+z i+o+G.D b+D C+++++f+9 &.&.9 D A+J.;+D P.H '+'+N.^.o+++w '+^.2.C+++7.r+B.B.2.B.r+C+r+)+B.++++k+k+A+3+C+++n n _.o n n _.o < W D {+) -.9.9.) r C w.k s.j J C.9+- L.i.9.9.G+K.~+[.~+: 8.9.9.R k f f ]+5.! s.L.s.! #.3+n f X o 3+n 3.j J X _.-.`.D (+z u u D R w+g 3.3.]+Z.q+-.Z.=+; j+D >+#.,+s.#+H 9+#+3+4+7+e+[ e+d+e+e+e+d+l+..{ x.^.<+N.9.9.9.7.L o.E 9.9.G.r.<+9 9.9.G. .[.p.b+z H [.B+H.9.!.N.q 0.y+{ 9.B.q 0.].-+9..+. . B+*.8.S . . B+a & B+. . k.r +.0.. . [.^ <.0.. . k.T +.[.. . . . . . . . . . . . . . . . . . q 7 d Q . Q Q Q 0.Q [.x+Q.b C+u.{ 9.9.9.x.;+7.b.C+/+7+,.7+7+7+7+e+e+e+d+e+d+d+d+v d+v v M.J.E+u.9.u i+& w.w.w.> S S O D.<+U.<+e+7+v $+$+F+X #+l+<+g.6+^+c Z.=+_.o 8+8+` ` t * ` ` ` ` 8+` ` t Y./+n { u 9.u -.4.9 D k+B '.e+P h+` R.8+` h+<+K 3 {.F.F.F.m+F.0 _ e.& C w.O |+ .[.7 } m+3 L v j J - - - - [ j.v L 3 l l m+F.K l l L L ]. .7 d Q 0.0.. . ", "`.`.`.&.&.&.-+-+) -+-.4.-+&.`.-+4.4.-+4.4.4.q+4.4.q+{ q+-.-.1.-.1.-.-.-.-.-.-.1.-.-.1.-.u 1.-.u -.-.-.-.{ 4.-.-.-.-.1.1.-.-.q+) 4.) ) 4.4.4.`.`.`.4.-+`.`.&.&.9 f+i+i+D 8.G.o+c.b+i.)+;+o+b+G.o+G.C+*+f+z &.9 9 9 >+o+D 8.^.i J.H.4+G.D H.'+4+^.2.4+4+q.B.2.J.b+B.o ^.)+i C+B.B.J.A+++_.J.< i _.n n r+#.3+n 5 5 2 ^ ~ W 9 < w.C & '.3.X - L.C.C.C.w D 1.i+a O S O 2 4.9.-.k _ X E+< n ! 3.f M.f ]+G _.5.f z.#.3+n ! [ j U X #.n >+o+E.J.a+7+m Y.* X @.c =+& K.0+~+S *.>+i+G+n+H.H+G+_.n 3+C.[ 7+w+,.7+7+7+d+L.;+r+'+C.e+L.= 8 u.y.<+C+9.9.!.4+r.m.1.9.!.N.l.2+z 9.9.N.|.U.b+-.4.0 7 B+A+9.1.y.Q Q N.9.9.[+0.0.I.4.!.o.. . |.G+6 |.. . .2 w.. . . K.2 D.. . . ~+r C 0.. . . . . . . . . . . . . . . . . . 0.Q Q Q Q q q q q q ] x+Q. +y.H.^.*+1.9.9.9.E i N.,+l+w+p.p.4+q.2.q.L.C.w+7+[ e+e+d+d+v w+a+9+f+!.9.j+& w.w.w.C w.c+z z o+t.y+,+p.l+v p d+/+[+<+l.B+7 k.> ; ; 6 3.g * - ,.U ,.,.g u+* A.` ` t J j b S.A+o+`.{ u !.1.-.f+b y+$+U ` ` 8+8+M.j.3 3 K {.{.{.F.j.S.H+a $.& & +.O S : 7 ] 3 [ l+U J - M.M.3.- [ L 3 3 3 {.m+@ l.F.F.F. .l.l.l.7 d Q . . . . ", "`.`.&.z -+E 4.q+-+4.{ q+) `.&.E 4.4.q+4.4.q+-.{ { -.-.{ -.{ 1.u 1.-.-.-.-.-.-.-.1.-.-.1.1.-.1.1.1.-.-.q+q+q+q+-.1.-.-.-.{ q+{ 4.) 4.) 4.4.`.&.`.) ) 4.`.4.) &.9 i+f+f+c.++J.J.b+X.4+B.G.8.8.G.o+>+o+>+z &.&.f+9 9 f+>+D 8.i.G.W B q..+@.w s.'+4+)+}+'+4+R..+a+)+)+^.^.r+r+2.o 7.A+++B.A+n ++#.A+n A+o _.n #.z.z.2 ^+2 2 2 k C & 1 '.b S.3.s.s.- C.9+X E+< `.`.4.4.4.{ -+_.k J _ G n o a+R.a+f S.3.o o < 5.3.s.o _.n R.P l+7+7+l+7+7+l+w+7+7+P P P U J W _ : 0+[.k.k.> >+4.-.4.) &.i+D D D n C.l+g Y.Y.Y.w+7+r+4 R.L.l+y+! ;+q.Y.e+y+w+J.u.:+t.l+z 9.9.`.0 .@.!.9.{ o.|.m.9.!.1.y+B+}.A+{ E t.q : z 9.E U.0.7 ++9.1.U.. . M 1.4.|.. . r.6 e.t+. . x+2 > 0.. . S T > . . . . . . . . . . . . . . . . . . 0.d d ] ] ] } } } } ] ] L Q.'.Q.t.t.p.q.u.!.9.9.9.E r+q.2.u.x.!.9.!.9.`.(+)+L.w+,.w+e+d+v d+e+Q._ z+H+& O & C & & I.( u 9.u A+Q.,+4+p.e+3 p [ j _ w.|+: ~+].a n.E+'.U 7+P d+d+d+d+d+e+7+U l+J J j.j.o.w.I.o.Q.t.m.)+b+E E P.<+3 P 8+8+8+8+* j.3 3 3 K l l l 3.5._.H+X b y.y.M Q.g.l.[.$+P J J - g - - - U 0 j.v L L l m+] .[ 0 O O ]. .[.7 d d Q 0.. . ", "`.4.) `.`.-+4.4.4.4.{ -.4.) `.-+x.q+4.4.{ { -.1.q+-.-.-.q+4.-.-.-.{ -.-.-.-.-.-.1.1.1.1.u 1.1.-.1.{ -.{ q+{ q+-.1.-.1.1.-.q+q+4.q+{ 4.4.) `.&.&.&.`.) `.) `.&.f+9 &.>+8.C+C+G.(+i.4+C+J.J.G.f+>+f+f+D 8.b+f+D 8.f+&.9 o+b+A+o+G.B.C+H+H H H '+'+'+'+q.*+G+a+R.R.^.2.o o 2.)+r+7.i #.++J.A+B.A+n _.o _.< _.! z.5 6 ~ 2 a $.$.w.T 3+X 3.]+Z G+H+3.E+#+X X R _ R R f ! R.3.Y.J /+G+< o ! f M.}+M.f f 3.G+o < 5.G+X o A+n o J J ,.J C.,.,.m ,.,.m 7+P [ P '.z.z.<.|+|+w.a 9 -.1.9.9.9.9.9.u 4.( 5.s.,.'+H h+,+a+3+3.'+#+w+C.7.o s.w+e+e+v d+e+e+[ '+a.A !.J.s 0 1.9.9.:+g.r.G.9.9.z U.7 C+!.9.4.U.l.t.b+4.f+U.0.<+4.9.o+[.0.|.b+9.9 B+. Q X.u k+. . . Q.k+& . . . I.T S . . . . . . . . . . . . . . . . 0.Q d } ] l.K j.j.j.j.L K K [ R - m.#+R m.m.H :.x.8 8 1.;+3+z 9.9.9.-.`.>+8.j+c < w ,.7+e+e+e+F+e+o.O |+K.[.k.[.~+S |+> ]+{ 9.9.8.t./+i B [ 3 3 $+v v [ w.w.O Q._ k _ [ F+e+d+d+v v v v v $+v v j.j.L L K.K.|+<+x+D.<+L x+o.t.0 3 $+m 8+t 8+8+- v 3 p 3 K l p L R.u.u.f+A+#.! .+)+B.H.x+[.v P w+J k J U U j 0 [ j.j j.j.L .l.].k R $.w.O |+K.: d q 0.0.. . ", "-+4.q+4.`.`.-+4.4.4.-.-.-.-.4.) ) { 4.{ q+q+-.-.-.q+-.4.-.-.4.1.-.-.q+-.-.1.u 1.-.1.-.u 1.u -.1.-.-.-.-.-.-.{ -.-.u -.-.-.{ { q+4.) ) 4.) ) ) -+`.) ) ) `.) &.&.`.&.9 9 8.i.C+J.J.7.J.c.o+k+i.i.J.z 9 (+B.o+i+o+>+k+b+o+o+f+8.k+G.b+)+J.i.'+a+}+^.#.4+B.@.a+^.R.4+B.2.o ! r+7.i C+_.3+3+r+7.n 3+r+_.n 3+#.H+X ^ (.^ 5 T '.$.'._ k b ]+G G G _.6 #.]+S.w X k R k k k C.J J k z.< A+! s.9+9+C.#+X X X f ! ]+3+5.G+s.o o o i i 8+R.M.h+L.- L.g Y.,.Y.P [ [ [ j k 5 6 c+5 n.~ (.W j+9 `.1.9.9.{ A+5.S.C.'+'+s.A+3+- h+h+k ! 3+'+'+L.C./+7+l+e+7+l+4 Y b./.Y.[ /+u.!.{ .+].w u 9.9.C+r.l `.9.9.G.r.r.G.!.9.G. .|.t.b+f+)+7 0.Q.4.9.B 7 . K.-+9.i.0.. B+++1.k+0.. Q 5+k+X.0.. . . . . . . . . . . . . . . . q } l.{.L j.j.j '.'. +k X E+@.}+s.w #+w N.}+4+q.f.q.8+a+'+n u -.G 0 L . .L H+W k+.+L.Y.,.w+/+0 |+ .l.|.0.D+0.D+T.k.~+x+ +m.B.B 0 e+7.^.y+3 3 3 3 3 $+v v v j.[ [ [ 7+e+l+7+e+e+d+d+d+v v 3 3 l 3 l .l.l. .L 0 o.y+<+L .l j.v d+J 8+8+8+8+- v 3 3 K 3 K l 3 v C.^.*+u.z f+u.N { E 1 L L [ e+e+j 0 [ j.j.j.j.y+_ <+L ]. .l.F.w.e.a $.+.w.O K.k.d q 0.. . ", "-+4.4.q+4.4.4.{ q+q+-.-.-.{ -.4.4.q+q+q+{ q+{ q+{ -.-.{ q+-.4.{ -.1.-.-.-.-.1.-.4.{ -.1.1.1.-.1.1.-.-.-.-.-.-.-.-.1.1.-.-.q+{ q+q+4.) 4.) ) ) -+`.4.) ) ) `.) 9 f+&.f+) D ++i.C+*+9 o+o+o+b+C+^.7.++D b+)+;+f+f+i+b+H+++++o+f+D (+A+o+f+k+.+2.'+4+^.B.A+^.C+@.a+R.^.2.2.2.i r+o r+3+3+#._.n 3+i #.n < _.]+f 5 1 1 ^ 1 1 k w.L j.j.R ! #.#.G _._.W _.8.G #.@.G+G+G+S.f X X 3.< _.3.X J J C./+w+,+J U ,+X f o _.n ]+3.R.3.3.3.3.` R.i 4 /.R.` s.J J ,.U U P [ l+X G+c+1 (.; 6 ; ; ; W W c 9 n )+_.5.! k a+! r+n _._ s.! o n S.,+L.h+L.p.C.C.H 3.F E.Y i ,.P L.3+:.L.e+y+0 J.z -+#+l ++9.9.u m.r.t.4.9.!.b l.g.E 9.9.X.Q |.B q+&.}.0.0.z+{ -.5+0.. s 1.9.k+r.0.|.D u 1.|.. . . . . . . . . 0.0.. . . . . Q d d ] F.[ '.k X f X b E+f f S.)+#.o o S.a+H L.C.w+l+l+C.s._.z 8.D.|.B+D+|.w.P.< 5.3+o ` X k o.K.[.] B+. . . t+. t+D+].|+L y+v e+e+,.l+v $+$+$+$+3 3 3 $+v L v v v e+a+7.C+.+y.0 y+[ y+v 3 3 l l . .[.[. .j.'.'.'./+o. . .L v v u+8+8+8+8+J v 3 K p 3 p 3 3 l m+K $+e+h+q.J.N E E k+s L v j.j.v v v 3 j.j.o.0 '.x+ . .F. . .l x+O & $.<.|+: 7 d d q . . ", "4.4.4.4.) 4.4.q+-.{ 1.-.-.q+q+{ q+4.{ { -.-.-.-.q+-.-.-.-.-.-.4.q+-.-.-.u -.{ -.-.-.-.4.{ -.1.1.1.1.-.-.-.-.1.1.-.-.-.q+q+{ q+{ 4.) -.-.4.4.-+4.4.) 4.) ) `.&.9 i+>+>+D f+f+o+b+b+G.b+b+G.b+C+)+++4+C+k+N.q.++(+u.9 G.++f+o+(+f+o+D ( 9 D J.7.G.f+f+o+G.f+f+G+R.^.2.^.! 7.J.#.o J.3+r+r+n 5.7.#.3+n 7.#.! H+G+c+G+6 < ( G _ j.3 [ 9+S.]+6 _.c i+9 &.&.9 i+W _.@.3.G+]+G A+_.A+o M.C.C.C.C.L.w+l+Q.j U '.k X ! 3.R.! o 3+7.r+o ! R.M.s.s.3.R.o 4 i ` ,.l+U ,.l+_ b 1 (.(.(.; 6 ; W ; W 6 P.z.s.! i n o J R.! G n 3+k f ! _.n ! C.s.h+s.#+L.#+a+o F E.b./.J h+4 Y 8+w+e+v e+e+l+o.y+N.f+{ `.o.L f+9.9.-.o.[.m.u 9.{ +q g.1.9.-.s B+[.4+-+:+e 0.q ++!.u }.x+|.x+-.9.u }.0.. . . . . . . . q |.k.Q . Q d q d } ] ] K d+j /+k X E+! #.}+9+s.s.a+a+^.! 2.B.2.H l+7+e+P ,.X _.< G+e.X 5 c+W 5.5.A+/.r+f y.& |+: d 0.. . . . . . B+ .K. .].3 $+d+v v p p 3 $+p $+3 3 3 3 $+3 v v C.*+x.x.z i.*.$.t.Q.0 o.D.x+L ].l.[.l. .x+'.t.[+R o. .l L $+[ M.8+8+8+8+J v $+3 3 3 3 3 K l.@ ] @ @ m+K p v d+e+y+l 3 <+3 v j.j.j.y+X X R +$.s K.: : l l . . . .: [.k.B+d d q q Q . ", "{ { -.{ 4.4.{ -.-.-.1.-.-.{ q+q+{ q+-.-.-.-.-.-.-.-.-.-.q+{ -.-.q+{ -.q+-.q+4.4.q+-.-.-.-.-.1.1.1.u 1.1.-.-.-.-.-.-.-.-.q+q+4.q+4.) 4.q+4.4.4.4.4.4.4.) ) ) `.&.f+9 9 i+8.8.b+i.G.G.D o+f+c.J.A+4+B q.C+N.q.J..+J.8.J.o+D b+B.b+o+f+f+9 i+>+D o+o+8.k+k+G.>+i.C+B.2.B.r+G.n A+++G.3+#.3+n 3+_.3+n 3+_.]+1 G _.6 G (+4.u E.0 x+L e+X }+@.9 u 9.1.&.q+9.9.9.9.-.i+n < 7.o o ! 3.3.E+X k C./+R .+_.8.++f _ /+'._ - s.M.M.f f 3.o o _.3+_.o ! 3.3.M.3.3+4 U J h+k R b n.(.; ; ; W ; W ; ; n.e.1+k f ! o 5._.'.M.! ]+3+< k X ^.o n G /+s.'+s.'+M.s.a+o i n % 4 J - r+F i R.C.e+j.e+[ y+[ /+/+e+<+y+^.-+8 f+g.<+`.9.9.9 2+[.N.9.9.`.g.q t.4.u `.r.0.r.6 `.f+<+B+o.b+9.9.9.X.: Q 0.. . . . . . 7 |.&+k.0+k.|.] ] ] @ @ 3 v $+v j.l+- s.f _.]+,+/+C.9+L.L.H '+'+r+3.l+e+e+[ F+e+J f H+G G ]+5 f f M.s.i H+$.w.].[.d . . . . . . . B+ .K.l L y+e+e+d+v $+$+$+$+3 ' $+$+$+p $+3 $+j.4+E !.!.-.8.a T *.T $.$.$.Q.<.O ].K.].|+0 X .+w o.l m+l 3 v [ M.8+8+8+` j $+$+3 3 3 3 3 3 @ @ ] ] @ ] @ @ @ @ ] @ {.l 3 L L L 3 3 e+r+S.[+w.$.z+0 ].[.: F.l ].l F.m+[.} 7 d d q Q 0.. ", "q+q+q+q+-.-.-.1.1.1.-.{ q+4.q+{ ) { -.-.-.-.-.-.-.-.-.-.-.q+q+{ -.u -.{ -.-.-.-.{ -.-.1.-.1.-.1.1.1.-.-.-.-.1.-.{ q+4.q+{ 4.q+4.4.`.{ -.-.q+4.q+{ q+4.4.) ) `.`.) i+f+9 9 9 o+8.G.u.9 &.>+c.++b+G.G.C+J.k+m.B 2.++B.C+A+8.A+8.J.G.f+9 z i+i.B.++k+C+C+G.A+++B.*+D ++i r+7.#.A+3+3+++A+;+7._.7.n 3+A+_.]+#.z 5.]+D ) 9.9.-._ j.$+J 3.@.i+u 9.{+n.6+6+2 &.9.9.9.q+_.o ! 3.M.3.M.X s.s.- ,+y.8.1.!.9.9.{ f+#.k j U k X X X 3.3.3.3.M.s.M.3.o 3+_.X 3.o 3+3+k J s.f ^ c+; 6 W ; ; W ; ; c+2 & $.k k X 3.]+n < _ X R.]+< < k X R.o < _.k s.a+}+H+3.3.3.o o n E.F M.J a+R.R.o i 4 r+R.L.0 y+v y+e+v e+,+/+t.j.y+J.{ !.J.r.0 9 9.9.k+U.[.k+9.9.9 [.B+M D b+k+r.Q U.9 9.9.9.&.o.|.Q Q Q Q 0.Q d T.0+> r <.> S K. .{.{.K d+/+l+e+l+l+C.9+s.f G _.k l+w+w+7+w+,.h+}+o G k 0 [ [ j.v d+[ [ U j j U U U U l+'.D. .[.|.|.q . . . . . . q ].x+L '.p.q.p.v $+$+$+$+$+$+p p p ' $+' $+3 j.3+9.9.9.9.8.2 2 a a T T T T $.C & 5 G #.Z y.Q.O ].[.l.K j.j - ` 8+8+8+M.e+v 3 3 3 3 3 3 l m+@ ] ] ] } ] ] ] } ] @ F.3 l K l l l L 3 ,+y+x+].O y.E+& S : : l l l l m+l.} d q q 0.0.. . ", "{ -.{ q+{ q+-.-.-.-.-.-.-.4.4.4.4.4.1.1.1.1.1.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.4.q+4.-.q+q+4.) -.1.-.1.1.1.-.-.1.-.-.{ 4.4.4.{ q+4.q+4.{ -.4.4.-.1.-.q+4.4.4.`.`.`.9 9 z z 9 9 z i+D o+D z >+D ++)+A+i.N.;+f+.+p.r+4+C+7.*+b+G.b+J.D o+9 z D X.J.o+Z i J.k+@.2.2.J.A+i.n ++7.#.i i C+_.3+J._._.n 3+A+_.G ]+#._.@.G+G.{ u 9.9.3+[ j.J E+H+9 {+W > S 0+~+S <.) 9.9.5.3.X X X C.k C.k k C.U k < u u 9.9.9.9.9.= ^./+l+,.9+}+}+H+H+E+b s.f 3.M.f S.< < R 3.o 3+F X H+< i+i+c c.j+j+W W W 6 1 e.w.& R 9+s.3.S.]+< 5.z.X 3.! 5.G '.s.! ! n A+k X a+.+S.a+3.! 8+o n E.n R.J s.M.a+a+a+^.! 2.r+A+A+a+s./+j.<+3 j.d+v 0 /+/+t.y+4 !.9.9.P.r.Q.4.9.9.X.|.g+b+9.9.b+|.q N.4.!.9.9.9.>+U.] } } d q d } : S 0+0+t+D+T.~+: {.<+K $+e+7+7+7+l+C.9+C.#+}+o A+X 7+w+w+w+l+w+L.a+_.n G S.s.C.'.j j [ [ F+[ [ e+[ e+e+j L } d q Q Q . . . . . . |.O O D.'.)+Y r+e+p p p $+3 $+3 ' 3 ' $+p $+$+[ r+-+9.9.9.j+2 2 2 2 a a a z.T z.T A+z -+-+( P.x+ .7 l J M.` 3.8+8+8+8+M.P $+3 3 3 3 3 3 3 l.l.m+l.@ @ ] @ ] ] @ F.{.K K l 3 l {.l 3 y+L K. .].0 w R w.K.|.l. .l r.m+[.} } q Q 0.0.. . ", "q+-.-.-.-.-.{ -.-.1.-.-.4.4.4.4.4.q+-.-.-.-.-.-.-.q+{ -.1.-.-.-.q+-.q+q+-.-.-.-.-.-.4.4.4.-.-.1.-.1.1.1.-.-.-.-.4.) 4.4.4.4.4.4.4.4.q+q+q+-.1.1.-.{ 4.q+q+) ) `.&.`.9 i+>+o+c.z 9 9 9 &.z D 6 N.4+B.4+r+J.i.^.4+2.++C+o+b+o+++B.b+G.f+9 (+B.J.o+b+C+++B.a+^.7._..+2.^.2.B.A+i B.r+A+3+A+3+;+n 3+< < < 8.8.G R #+_.*+E.>.N F M.J J - f 6 i+6 <.S 0+S > ^+&.u 9 @.3.M.- L.- L.M.- J J C.3.E u.++b+z { 9.9.-+w /+J /+E+z { u u -.z B.#+#+w f ! ]+3+< X 3.o A+n 9 1.9.9.9.u -.q+) {+c ; a C O Q.o+9 _ /+s.E+]+i+< ,+k c+5.S.k - s.3.! A+< y.k s.3.S.3.S.3.R.o 3+E.n ! w+s.'+3.M.M.S.a+a+3.f 3.! ! o i r+B e+$+3 $+v v d+f.b.a.*+t.L X.!.9.!.n+[.[+1.9.9.!+|. .o+!.9.9.9.9.9.z l+[ 3 @ ] ] ] S <.0+t+t+t+0.0.B+{.[ L $+F+e+e+e+e+e+e+l+,.Y.f ! A+f e+7+w+,.w+w+C._.-.1.9.9.1.z b+a+w+w+l+e+F+[ F+d+F+e+j.] d d q . . . . . . d F.j.o.w.y.B.A u.e+p $+' $+' p ' $+$+' ' $+' v y+t.y.b k+8.2 T 2 2 2 2 2 2 2 z.2 5 `.u 9.!.4.8.& S ] U 4 ` ` 8+` 8+8+8+* e+y+$+$+3 3 <+v 3 U.F.F.F.F.l.] @ ] ] @ F.p 3 3 3 K 3 K K l L . . .l j.0 Q.& |+: k.l.: F.m+m+7 } d q Q 0.0.0.", "4.-.q+{ -.-.-.-.-.1.-.-.4.4.4.-.{ { -.-.-.q+{ 4.q+q+-.{ -.-.-.-.-.-.{ 4.{ -.-.-.-.{ 4.4.4.-.-.4.4.-.-.-.-.-.4.-.4.4.4.4.4.4.4.4.q+{ q+{ q+{ -.-.-.-.q+q+) 4.q+q+`.`.&.f+9 8.J.f+9 u.&.`.`.&.f+k+#+q.^.^.^.7.*+.+B '+B B.B C+b+C+G.o+o+>+++4+G.++i.a+^.4+a+4+q.2.R.q.^.J.A+b+B.#.7.3+7.A+n n < A+A+8.< < < 8.R _ }+n Y F F + F 8+X k - f 5 ]+W ; ~ j+) {+( 5.G+f f 3.M.a+3.s.L.X - k X n N z E.n 3+i.D 9.`.m.k k b >+9.9.9.9.9.9.-.++'+_ k E+S.]+< 3+k M.]+< i+`.q+-.u 9.9.9.9.9.9.c.C x+|+Q.z u i.,+- k w ( < X z.5.W M.- L.s.s.3.S._.n R /+L.#+s.M.3.'+R.o F E.5.o k s.}+}+a+a+a+S.S..+S.! .+}+E+f #.A+9+j.d+e+j.C.+ + 4 m d+[ p.*+f+^.s ].J.9.9.u s [.H.u 9.9.9.9.9.4.E a+g J P 3 ] ] l.l S 0+T.Q Q d l.3 l+j.v F+e+F+F+e+e+e+F+e+l+w+h+a+A+o '.e+7+w+,.l+*+9.9.9.9.u 9.9.9.E ! ,.w+7+7+7+d+d+d+[ l.] d d q Q 0.Q l.F.l v v d+U - m.E { t.$+$+$+' $+p p p p $+' p $+v [ y+O D.x g+~+~+S > 6+w.T T z.2 5 ]+u 9.9.9.9.i+P.D. .j.` ` 3.` 3.M.- J U [ v 3 v e+l+p.H+b #+[+o.<+F.m+@ @ @ ] @ <+,.7+e+y+<+3 3 3 <+j.].K.K.K.l L O w.w.].: k.|. .L <+l .l.} } 7 7 .", "-.q+{ q+-.-.1.1.1.-.-.4.4.4.-.-.-.q+-.1.1.{ q+q+{ -.-.-.-.-.-.-.-.-.q+q+q+4.{ -.q+4.4.q+-.1.-.-.-.-.-.-.-.q+-.4.4.4.4.4.q+4.q+{ q+4.{ 4.q+q+-.-.q+{ 4.-+`.-+4.) &.`.`.&.9 8.C+++k+C+D o+>+9 i+o+i.H 2.b+k+.+B ^.4+'+H H q.G.o+f+9 z -+i+6 7.A+b+B.B '+4+'+'+q.#.R.^.q.2.2.r+A+C+3+++++++D >+D D D < _.k+_._.#.H+@._.n E.E.a.E.n o - J J k k k k z.5 ]+5 E+X - X s.M.M.M.M.M.M.3.! i 3+n *+..E.E.:.C+i.++B.w 9+R 3+4.-+-+-.9.9.9.!.#.y./+s.f f f < < f R ! ]+5 ^ (.; j+c 9 -.9.9.9.5.O |+L I.n = f X - _ W ( G+k G n ! }+s.X L.X s.f 3.i+_./+Y.s.L.H - M.3.3.o o *+E.i k s.a+a+.+! .+! i.)+.+S.@.3.3.! #.n }+e+w+s.R.;++ 4 C.v 7+R.:.F L.[ y+#+u.f+)+D.K.b 1.9.9.9.9.u p.e+$+U * * J v @ @ @ m+F. .].L j.y+e+7+d+F+F+7+7+e+e+d+d+[ F+[ P l+X 3._._.k [ [ [ j n 9.9.D b I.[+J.-.9.u X.w+7+7+e+d+e+d+d+K @ ] ] } d d l.[ [ [ P P m * * C.* '+7+v v $+$+' $+' $+$+$+$+p $+v <+D.x+]. .k.&+D+D+&+T.0+0+~+S > 6+T 9 1.9.9.9.q+) k+w.3 m - V J U U F+d+d+v v $+[ b ]+#.W G 8.-+9 6 +<+r.l.@ @ @ ,.Y :+;+:.2.4+L.0 j.x+j.j.].K. .l O y.P.b & ].g+l.<+e+H ^..+H+H.b P.P.", "{ -.-.-.-.-.-.1.-.-.-.-.{ -.-.-.-.-.-.-.1.-.-.4.1.-.q+-.1.1.u 1.-.-.-.1.q+q+-.{ q+4.q+-.1.1.1.-.-.-.1.u -.-.q+4.4.4.4.q+-+{ q+{ q+q+{ { -.-.4.-.-.-.q+4.4.) -+&.&.`.&.9 &.>+X.i.)+)+J.i.i u.9 f+f+8.;+A+k+N.L.h+H '+H H b.G.G.D f+9 z 9 ++++B.B.H.'+q.R.'+4+4+4+R.4+r+2.2.2.r+7.7.++A+D ( i+9 &.-+4.{+c.W ]+_._._.3+< 5.u.>.N E.E.o X f E+E+z.z.- k k J k J - - w M.R.! o F F Y Y E.E.F F n ..b.o B.#.B.i.]+a+b o 5.n ++++D 4.9.9.B.y.k X X R 1 5.o X f _.5 & T a r 2 ^+^+^ j+&.) c+O |+x+0 f i.w f - E+5._.f X 5._.M.3.'+M.'+s.L.,+o ( ! X h+s.#+#+#+- s.M.3.! o n E.3+3.w X X E+Z 8.D 9 i+(+6 H.E+a+! 2.3+R.[ g R.i b.% 4 J d+s.2.i 7.J y+a+;+r+#+0 j.y+9+J.z 4.-+b+0 3 @ K J ` ! 3.'.m+l.@ F.{.{.K p v v d+d+e+7+7+d+v v 3 y+y+j.<+v j.e+,.M.! A+E+[ v e+a+1.-.6+~+[.|.l.s 4.9.-+[ 7+7+F+e+d+F+v K F.@ @ @ @ {.'.f X - - - M.M.h+/+7+e+d+d+d+).$+).' $+F+e+d+$+v $+y+j.x+|+K.: &+t+t+t+t+t+t+D+D+&+T.T.: |+Q.z+8.f+-+9.9.(+w.v F+d+d+v $+$+$+$+$+v 3 [+S.]+#._.W W &.) {+c.1 0 3 l {.K 4+a.= N = = A { z i.Q.w.Q.O ].K.].w.E+_.< D Z Q.s Q.B *+x.1.1.1.{ z >+", "q+-.-.-.1.1.1.-.1.1.1.-.-.-.1.{ q+4.-.-.-.4.-.{ q+-.-.-.-.-.1.-.-.-.-.-.-.-.4.4.4.{ 1.u -.1.-.-.1.-.-.9.1.-.4.4.-.{ q+q+q+4.{ q+4.q+q+q+q+1.-.q+q+4.q+4.) ) `.`.`.&.i+D o+`.9 o+b+X.J.o+b+b+f+f+f+9 f+k+w B L.Y.q.q.4+J.f+i.D G.8.D D D (+++++^.^.R.7.B '+'+R.R.a+q.2.2.^.2.i J.A+C+n >+5.*+< _.8.< 8.9 i+G S.8.< < 3+< E.E.>.a.E.E._.G+G G G ]+@.f X X s.M.3.8+i F F + % F % E.E.% E.Y F F 4 i r+B.#.#.#.r+]+E+G u.z = z f+A+8.z H+m.- k _ k < _.f X o _.'.O & C C C C T C <.T z.'.D.x+x+o.'.X #+X k < < 3.k _.< 3.M.L.s.s.s.M.X k 5.< E+M.w #+s.s.H s.#+#+M.3.! o 3+5.( 5.D >+u 9.9.9.9.9.9.9.-.( w 3.R.! 3+o J g R.o F b.F M.j #+! _.3+s.k 2.3+i 0 v e+l+/+w+[+e+y+{.{.F.@ K k n < 8.@.L {.F.F.K {.K K ' d+F+7+7+v L j.i.{ u u { o+b v $+v w+M.3.A+! [ d+w+4+x.&.z.S : [.D.E 9.`.y+m 7+7+F+e+d+d+$+p K K v 3.E.`.&.( 5.3+R.C.g h+,.7+7+F+d+d+d+d+$+$+$+f.:.'+Y./+e+d+<+x+]. .[.Q . . t+t+t+t+t+t+t+t+D+k.: .r.r.e 4+E !.-+a j.$+$+$+v $+$+v v $+j.d+'.]+]+]+G ; G c &.Z.{+{+X.0 <+3 <+:.s+A A ~.~.E u.C+z+& w.& w.w.> |+x+w.Q.e.M +Q.Q.B u.!.9.9.9.9.9.9.-.", "-+{ -.-.1.1.1.1.-.1.1.-.1.1.1.1.1.-.-.-.-.-.-.{ -.-.-.-.-.{ -.1.9.u -.4.-.-.q+4.q+{ -.1.-.1.1.-.-.-.-.-.-.4.4.4.q+-.{ 4.q+q+4.{ 4.4.4.{ q+-.{ { q+4.4.4.4.) ) `.4.{ ) 9 z 9 &.&.z i+G.c.A+b+8.8.*+>+D 9 o+k+H H :.:+o+f+9 D o+o+k+N.H 2.o+1 ^.2.B.C+++N.'+a+'+4+R.q.2.B.)+r+2.#.#.C+o+( < i.b z.e.a 2 (.i+D 1 #.A+8.3+< n 5.z z {+9 {+c (+(+c 8.G G _.F n b.n Y Y E.E.% E.% n % 3+F 4 4 o o o o B.B.B.]+#.#.G+G ( 9 z z u.3+o )+.+E+w 9+k '.]+3+3.z.3._.f w.|+O <.6+6+6+6+6+> D.Q.'.O |+_ w.t.w 3.X ]+( o f f n o s.h+L.L.L.Y.- J ]+5.! f f }+M.H s.H.s.s.s.s.M.f S.f s.S.#.n 4.9.9.9.&.8.1 c+9 u 9.`.$.M.M.R._.i J M.8+o F E.Y o J s.)+o 3+#.X ! r+7.X [ [ y+v y+p K K K p K j 5.{+{+{+Z.W $.v $+$+$+).v d+F+7+7+O.$+<+m.9.9.9.9.9.9.9.b+<+3 3 w+h+3._.3+X /+t.j .+D z `.-+4.E o+^.7+F+e+).F+d+).v $+$+$+$+4 ~.u x.( 5.9 { E o 7+Y.,.,.7+7+e+).d+$+).v e+= A f+++)+C+_ j.].]. .[.0.. . . . . . . . . . . B+[.: l.m+ .0 H 7.C+Q.<+$+$+$+v <+' <+v y+e+k E+< < G ]+G 6 W {+( i+&.`.>+@.l+l+b.A 8 !.!.8 8 { -+f+D (.5 2 a e.C O O D.x+x+K.K. .U.p.D 4.!.9.9.9.1.`.", "4.{ -.1.-.1.1.1.1.-.-.1.1.-.1.u -.4.4.{ 1.-.-.-.4.-.-.1.-.-.1.1.u 1.-.-.-.-.{ q+q+-.-.{ 1.u -.-.-.-.-.-.4.4.4.-.{ q+4.4.{ q+{ 4.4.4.4.q+{ 4.`.q+{ 4.q+4.4.q+4.-+q+q+) ) ) &.9 &.&.&.&.i.A+8.o+C+*+D X.G.f+f+o+B.*+c.++f+9 ++D >+D B '+q.u.i.2.J.o+G.i.'+'+'+'+a+R.q.R.2.2.o r+2.2._.G.u.D G+2 a a T 1 (+( < @.o _._.W < < < {+{+q+-.1.u 9.9.u u &.5.u.z a.E.E.E.E.Y Y n F _.F _._._.i o r+o o o B.G o G G j+i+1.u -.4.z 5.]+.+)+X.a+E+X k f < o X X o ! _ w.|+|+O 6+6+O 6+6+x+x+w.0 0 $.:+! y.E+w E+< n G+X < 3+3.M.#+h+s.- k k X n #.M.M.s.M.}+H.s.s.}+}+}+f }+f f f 3.3.H+z.(+9.9.(.S k.&+&+0+1 9.9.G [ h+X 8+n - M.R.R.! n E.5._._ w ! ! 3+8.X M.s.a+! r+r+4+e+y+d+$+p p [ 5.{+Z.h h Z.Z.Z.j+n+w+Y.,.,.,.,.7+* * j.x+I.{ 9.9.9.9.9.9.u e.L ].d+,.* f @.G A+< _.]+f _ _ k #+H Y.7+F+d+F+d+d+d+$+d+v $+d+P E.u.o x+ . . .w.b.x.G.L.,.7+7+7+7+F+e+F+v $+l+x.{ E >+++R o.|+].l .k.. . . . . . . . . . . 0.7 [.l.l. .l ,.` 4 2.0 j.v <+$+$+$+$+7+L.a+! 3.3.f z.5 n.c < < ) ) {+i+8.k+^.4+2.N 8 8 8 !.!.9.9.9.9.9.4.; 2 T & +.6+|+S g+: . .: l.: .L Q.z+6 k+1 e.", "q+{ -.-.-.1.-.-.-.1.-.-.1.1.1.-.-.4.-.-.1.-.-.-.-.4.{ -.1.1.1.-.1.1.-.4.4.q+-.{ q+q+q+4.-.-.{ -.-.-.{ q+4.4.4.q+4.q+-.q+4.q+-.4.4.4.4.q+4.4.4.q+{ q+q+4.4.) ) `.-+&.) -+4.`.&.9 &.&.`.i+o+G.k+.+;+D B 4+B.)+b+f+o+D ++u.9 o+D 8.D k+4+2.G.i.4+B.^.i.a+'+'+R.R.q.2.2.)+R.2.i r+#.! #.++n ( f+5.(+G 6 D 9 5.G ]+]+_.A+_._.< < ( {+{+c W c &.u 9.9.u {+z E.E.E.% 3+F F _.F _._.3+_.F _.o o o o i.o G 8.i+`.1.9.9.9.9.9.9.9.5.S.S.^.! G+a+E+X < _.f z.! o X '.O |+|+> 6+6+6+O 6+S |+w.w.0 w.'.m.k X k ]+5.o E+! n o 3.a+a+#+s.s.L._ G n 3.s.s.#+#+s.#+#+L.H s.#+E+}+}+3.f E+w X w P.b+u c > k.k.B+D+e.u u D v J k F o s.M.f 3.&.u u 9.u 1.8.P.]+! _.< R s.a+}+s.s.S.J.9+y+F+d+d+#+D c ^+> 0+0+> h.i+!.B ,.g h+V g g ,.g l+y+x+I.(+u 9.9.9.9.`. +x+L d+,.Y.s.a+S.E+E+}+G+_.< < _.! s.C.l+7+e+7+7+d+e+d+).v $+d+d+8+n 3.S k.[.[.7 j.E.`.E b.4 ` A.g ,.e+e+d+v 4+8 9.9.9 6 b 0 ]. .[.|.q . . . . . . . . . . . 0.B+|.[.l.l.F.v 7+7+e+y+3 $+3 $+3 $+e+'+3.s.L.C.,+U _ '.Q._ 5 W 5.n G z._ t./+,.H p+s+~.8 8 !.9.9.9.9.9.u 9 6 T +.w.6+w.O > K.: .r. .g+: : : g+r.g+g+0+", "4.q+{ -.u 1.1.-.1.-.1.1.1.1.1.u 1.1.-.1.1.1.-.-.-.-.q+-.-.1.-.1.1.1.-.-.q+{ q+-.-.{ -.-.-.-.q+4.{ q+-.-.-.4.4.{ -.{ -.{ 4.-.-.q+4.4.4.4.) ) 4.{ q+4.4.) 4.`.`.`.`.9 z 4.) &.&.9 9 9 &.&.9 D i.)+G.(+.+H B B C+f+b+o+o+o+D o+o+D G.b+A+B.G.D D k+N.'+'+'+'+'+a+4+)+2.2.2.++B.o r+r+2.#.C+C+3+J.< _.#.A+A+k+o o _.< _.< W G W 5.c ^ T C C r =+q+9.9.1.9 n 3+F F _.F _.i _._._._.#.G #._.A+A+8.3+< ( -.9.u 9.9.9.u 1.u u 9.) z.M.a+G+! G+X ]+3+! X M._.3.k U O x+w.C T C C <.O ].].j.j.].L L [ k J z.n _.3.3.3+3+o R.S..+a+@.f X z.n #.3.M.s.L.g h+L.Y.L.C.C.L.L.L.L.#+w s.#+#+X X b D 4.-.j+c+c.&.1.1.z w j [ 3.3+! L.X f -.9.9.9.9.9.9.9.q+k+P.3.o n S.9+s.N.s.a+! n B [ 7+U - 8.r 0+T.&+&+&+k.P.u 4.y+Y.h+g L.,.g Y.g Y.j j.L g.1+1 X.1 1+o.j.j.P ,.C.C.s.}+H+w E+E+E+H+E+a+S.! 2.r+q.q.L.7+7+e+e+d+F+d+v d+[ U f f $.w.O O X < ( E.b.:.+ /./././.4 4 *+8 9.9.u >+1 a w. .[.} 7 . . . . . . . . . . . . 0.|.7 7 [.m+m+3 3 p 3 3 $+3 p 3 $+3 j f /+e+j e+[ [ [ j U U U U '.'._ /+j 0 e+e+w+b.= s+~.A 8 8 9.9.9.9.1.i+k+z+<.w.O O O O O D.> x+|+x+r. .l.|.B+B+Q 0.", "4.q+4.4.-.1.u 1.u 1.1.-.1.-.-.1.1.1.1.u -.1.-.-.-.-.-.-.-.1.1.1.1.-.-.-.-.4.-.-.q+-.q+{ -.-.q+q+{ q+4.4.4.q+-.-.q+-.-.-.4.-.{ q+{ 4.) 4.4.4.-.q+4.4.4.) 4.) `.`.) `.`.) 4.) `.z f+f+9 o+9 >+D D G.f+9 b+B 4+H :+D o+i+o+c.f+f+i+>+o+f+f+z 9 9 D #.^.a+'+4+4+q.7.B.^.^.F b+i.o 2.o B.#.A+_.#.#.B.G B.#.#.#.k+_._.8.A+_.3+_.W < ; T C 6+6+<.^+Z.9.u {+G _.i _._._.i _.o i o _._.F 3+3+3+3+3+_._.G (+1.9.9.u {+_+C r r %+{+{+; _ a+! ! f @.3+_.X X o o f _ '.w.w._ 2 2 r r C > ].|+w.x+l F.l j.l+'.G < S.X o n o ! ! ^.! @..+H+b < < 3.3.f '+f s.s.X L.- #+9+L.L.L.Y.C.- L.- #+L.9+'._.( E.u.u.`.>.3+! #+J U U 3+_.X g ,+D 9.9.4.D G+1 W 4.9.9.8.k }+! n G+U 9+#+s.}+S.< ]+0 l+J b W r ~+0+0+S T 9 !.9 y+m ,.g g Y.g Y.Y.L.L.9+l+0 y+s o.o.I.0 j w+,.m ,.w+C.i.9 q+1.1.4.9 8.i.G+@.}+'+H h+'+q.q.q.* C.e+7+e+d+v [ [ 0 _ k E+f R.3.R.R.R.8+/.4 + + :.s+A f+1 X.c.&.i+a 5+w. .|.d q . . . . . . . . . . . . . d 7 } } l.l 3 y+v v $+v v $+3 v 3 ,.f j j.j.j.v j.v j.[ [ [ j j j j l+0 l+0 l+C.i >.~.8 8 { x.E E `.u.c.6 1 a s O I.Q.Q.I.s O O s x+x+U.K.r.~+B+D+0.0.", "-.{ q+{ -.-.-.1.1.1.-.1.-.1.u -.1.-.u u 1.1.1.-.-.1.1.-.1.-.1.1.u u 1.-.-.-.q+-.-.-.-.q+4.-.-.-.q+4.4.4.4.{ -.-.-.-.-.-.{ q+-.-.4.4.) 4.q+{ q+4.4.) ) 4.4.q+) 4.4.) `.`.) ) `.`.&.&.z 9 z &.z -+9 f+z D .+H 4+*+o+i.o+f+o+o+>+o+o+i+f+9 9 9 ( o+X.J.C+4+8+a+q.2.o ^.^.^.r+n B.2.r+2.B.C+#.C+_.i _._._._._._._._._._.G G G o 6 < 5.c c.j+c &.1.1.&.G o F _.i o _.o _._.3+3+3+3+3+3+3+_._.r+i G _.W i+u 9.{+C S 0+0+0+> _+{+< $.M.f f f _.3+3.X ! o 3.X k w.T 2 z.^+^+^+C <.> S ].0 j.].m+3 j.[ f < o X f 3+i R.a+! .+a+f f 5 G 5._.s.a+^.S.a+}+}+s.E+s.s.s.#+L.#+L.L.9+9+L.- k J X n E.n b.3+o #+- C.,.,.J 3.n ! C.9+k _.9.q+O 0+k.k.~+> &.9.u $.,.a+! 3+]+k C.L.s.f @.3+8._ U k _ @.G c+G -+{ z G.H 7+,.Y.,.Y.Y.Y.Y.Y.L.L.g L.L.- L.C.C.- Y.Y.Y.Y.Y.,.w+@.u 9.9.-.{+`.1.9.q+++n+'+s.N.H H L.Y.p.L.a+o k 7+,+J e+[ [ 0 [ e+j l+l+U Y.'+s.'+'+a+2.*+!.9.9 T s s | W.S g+: o.z.& K.Q . Q q q Q 0.. . . . . Q d 7 7 } l.l y+,.'+p.p.g p.y+y+$+v - f w.v L 3 L $+3 $+3 $+v v v d+[ e+e+e+e+e+/+C.H 4+C+J.:+f+o+G.G.++i.X.P.1+O x x+t.Q.& I.o.O O e O |+|+K.g+[.q Q . ", "-.-.-.-.-.1.1.-.-.u 1.u -.1.-.-.u -.1.1.1.u 1.-.-.-.1.-.1.-.1.u u 1.-.-.-.-.{ -.-.-.-.-.-.-.-.-.-.-.4.q+q+-.1.-.1.-.q+q+{ q+4.) `.4.) 4.) 4.4.-+4.) ) `.4.4.) 4.`.&.) `.`.`.&.`.&.`.&.&.`.`.9 9 f+i+9 6 '+H q.:+f+b+o+f+9 o+>+8.b+o+(+b+++k+X.C+C+r+C+B.f+)+4+4+^.^.R.^.r+2.)+o B.r+i i r+C+_.++_.7._._.7.A+3+A+_._._.o ]+]+]+6 < ( z E `.`.9 5.G G G _._.< 3+3+3+n F 3+3+3+_._.#._._._._._._._._.W 5.q+q+I r C C r h.c ( W z.3.H+b ]+< ! X f 8+3.X _ '._ 5 1 5 2 r T C <.<.O x+w.j .{.K v Q.G 3+f X o F 3.R.3.a+G+G+6 (+c 5.i+W k f ! a+S.S.@.a+H+H+}+}+}+}+f #+s.L.L.9+L.9+J o E.E.Y % F M.J J C.C.X M.o n n X R s.w D -.a 0+B+T.B+k.1 -.9.z+j ,.s.S.A+_.k w+L.s.f @._.< k j /+J /+'._ #+w m.p.,.,.,.,.,.m ,.Y.Y.Y.Y.Y.g Y.Y.Y.L.L.L.L.L.C.Y.g L.Y.C.J.9.u ^ | ~+W.6+8.9.9.8.'.C.Y.Y.C.Y.Y.L.* H.f A+! _ j '.,+J U 0 [ e+P e+[ [ d+7+l+C.}+! 9 9.9.>+!+e.1+5+I.O O g+@.E 4.k+|+|.g+K.K. .: [.|.B+q Q B+B+7 7 7 l.L e+q.p+N ;+..p+H y+$+y+M.M.0 v L 3 3 3 3 3 3 3 p 3 L 3 3 v v y+e+e+e+l+w+C.p.p.p.[+Q.N.b+++B.B.k+X.*.O |+t.R m.*.Q.Q.w.w.O O O |+g+k.|.7 0.", "-.-.-.-.-.-.-.-.1.-.u 1.1.-.-.1.1.u 1.1.1.-.-.-.-.-.-.1.-.1.1.1.1.u u 1.-.-.-.-.-.-.-.-.4.-.-.{ 4.4.4.4.{ q+-.-.q+-.{ -.q+4.) ) 4.4.) 4.4.4.q+4.4.) 4.4.4.`.) ) `.9 &.`.`.9 f+&.`.&.`.`.) `.`.9 9 9 k+X.2.7.)+f+f+f+9 o+>+>+>+8.C+J..+4+N.'+2.J.++)+2.r+A+G+R.R.q.2.q.2.^.)+2.2.r+i _.#._.i i 7.7.A+A+A+_._.A+_._.i _.3+_._.#.G G G _.G _.G G G _.< < n < 3+3+3+3+3+_.3+A+A+A+_.i _._._.#.G _._.G W G W (+c i+{+{+{+5.5.W S.3.@.f 3.3+_.f X o ! f - _ $.]+G 5 z.T T r T z.2 z.$.'._ x+F.K L X 3+! - f 3+o M.M.#+]+(+5.{+{+Z.{+Z.{+W k a+! R.a+a+a+a+a+}+a+3.a+E+a+}+}+E+'+w f f o E.E.E.E.F ` Y.Y.k w f @.]+G 3+n E+,+m.k b G G P.M 5 G ( 4.-+3.7+7+U - 3.i < R '.C.X H+3.]+A+R j /+U /+,+w+,.,.Y.,.,.,.,.Y.,.,.,.C.p.Y.Y.C.L.C.C.p.Y.C.,.,.C.w+,.,.C.C.N.!.1.+.T.T.B+B+T.c.9.1.t.w+,.,.,.l+w+,.l+g f o n (+j+6 z.M R k ,+w+l+w+,.7+P e+v /+s.[+ +i.o+i.e.*.y.y.*.y.[+ +o+!.!.8.s S <+y+y+I.o.O g.|+K.K.K.K.r.l.l. .U.C+= A 8 { x.p+B o.v [ 3.- 0 j.$+$+v v L 3 p 3 l 3 3 3 3 K 3 3 3 3 y+e+y+[ o.0 e+y+U.y+r+)+B.A+*+3+i.n+w.S y.;+B.)+H.e.$.5+I.s O |+].g+|.0.", "1.1.u u 1.1.1.1.u -.1.1.-.-.-.u 1.1.1.1.u -.-.{ -.-.-.1.1.1.1.1.1.1.-.-.-.-.-.-.-.-.-.1.-.-.-.q+4.4.-.q+{ -.-.-.4.q+4.4.4.4.4.) ) -+4.4.4.4.4.) 4.4.) 4.q+4.) ) ) -+) `.`.i+i+9 9 &.`.) ) `.&.&.9 i+X.H ^.)+J.9 i+D o+o+o+D b+)+)+H 4+^.'+q.G.8.2.)+^.B..+^.^.^.S.^.R.2.^.)+2.o B.r+#.r+r+#.r+_._._.7.3+A+A+3+3+3+3+_._._._._._.A+_._._._.< < 3+< n 3+3+< 3+< 3+3+< 3+< A+_.A+A+A+_._.++_._.#._._.#.o ]+]+]+]+]+o G ]+]+3.S.S.f 5 G n ! f o 4 3.f k a W ) &.; 2 r z.5 ; c 9 9 ]+X _ L l K [ o F X X i F 3.M.s.S.5.i+>+W ^ r h.~ c 9 ]+k 3.a+a+}+'+3.a+}+}+}+a+H+}+a+a+a+3.a+H+S.]+3+E.E.E.E.F M.- ! 9 -.-.`.( i+n 5.S.'.j j [ '.X r+E.u.u.u.E.3+s.U J C.s.a+#.n E+/+k #+f @.! A+@.'.U C.C.,.Y.C.Y.p.g Y.Y.g Y.g Y.Y.,.C.g Y.Y.Y.Y.,.,.C.,.w+,.,.7+7+7+7+,.B `.-.(.+.> S e.&.9.) [+,.Y.,.,.7+7+w+l+,+X 6 8.j+j+Z.{+{+i+j+6 E+X - L.w+e+e+0 m.E+Q.S r.r.W.r.: r.].e O Q.n+z !.!.c.I.D.0 t./+[+,+/+t.Q.Q.I.Q.I.o.s <+y+t.`.9.9.9.9.9.z B }.j.e+3.k [ j.v <+v v j.j.<+$+3 3 l 3 3 l l {.K {.{.3 3 3 l U.L F.l.l t.m.m.)+_.3+8.k+n+w.S <+n+H.4+.+H.P.P.n+M 1+Q.O |+: ", "1.1.1.1.1.1.u 1.1.u 1.1.u u u 1.1.1.u 1.1.1.-.-.-.1.u 1.1.1.-.1.1.1.1.1.-.-.-.-.-.{ 1.1.-.-.1.-.-.4.q+4.-.-.-.-.-.-.q+-.-.q+4.4.4.4.4.4.q+{ q+4.4.) -+) 4.4.4.) ) `.) 4.`.&.z z `.&.`.) 4.`.&.&.&.9 D )+4+C+:+9 k+.+B 4+++*+>+++)+B q.2.4+2.G.i.4+q.B.*+k+2.u.9 b+G+! 2.^.2.B.B.2.B.#.r+++_._.i 7.A+_._.A+_.8.3+_.A+3+< 3+3+3+3+_.3+_._.3+3+3+< 3+3+< < < 8.8.8.A+A+A+A+A+3+A+A+A+< 8.A+A+_._._.G G o ]+S.@.@.1 @.f f 3.G+]+G+f ]+n _.3.3.F i ! f z.6 u 9.9.-.( (+j+i+q+9.9.9.( H+0 l l v - F 3.- M.4 ! M.h+- o 5.6 e.> ~+~+S 0+^+i+9 +- '+M.M.'+E+}+3.a+3.a+3.a+}+}+S.H+@.3.3.! o n E.E.a.E.b.3.G+>.1.9.9.9.9.4.< n ! j e+[ [ U X ]+3+E.E.E.Y F M.l+C.- M.3.]+n ]+_ - X E+@.3._.#.k C.L.g C.Y.Y.Y.Y.p.Y.Y.Y.Y.Y.Y.Y.g Y.Y.Y.Y.g Y.Y.,.,.,.,.7+7+7+e+F+e+/+t.H.D { u 1.1.-.z )+C.Y.,.,.w+,.7+l+7+U _ o c.c Z.V.h.h.; c c &.( 3+8+! 2.3+n H+R y+K.S K.].].K.K.K.: : [.r. +G.z ++n+Q.t.p.L.H N.N.N.p.p.p.y.p.p.t.t.Q.y.G.9.9.9.9.9.E .+t.[ J 3.k 0 j.j.d+'._ 5 5 5 *.Q.y+y+3 3 3 l {.F.F.3 l l l K F.l : ] l.L y+0 Q.9+H+_.A+6 e.o.|+U.o.Q.t.m.n+H.X.B.B.)+.+n+& ", "1.1.1.1.1.1.u u 1.1.u 1.u u u u u 1.1.-.1.-.-.-.1.-.1.1.1.u u 1.1.1.1.1.-.-.-.-.-.q+-.1.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.{ q+q+q+-.4.4.4.) 4.4.4.) ) ) 4.4.4.4.`.`.`.) ) `.&.`.-+) ) -+4.) `.`.&.`.`.&.9 b+++b+o+++A+)+4+4+C+8.A+J.B.4+r+J.b+o+(+++4+)+A+8.A+u.9 f+k+a+q.2.2.C+#.B.B.#.C+7.A+A+_._.A+A+A+3+3+8.A+< _._._.8.A+A+3+3+3+< 3+3+3+< < < 5.( 9 ) -+-+) &.i+n 8.7.F 7.A+A+3+_.A+A+A+A+A+_._.G G o G ]+]+]+G+G+! ! ! @.G+3+3+]+! G F o 3.3.z.D 9.9.9.9.9.9.9.9.9.9.9.9.q+b j.3 l U f.8+f - f./.3.M.L.- 3.A+1 O 0+S 0+0+0+r {+`.z.J a+s.E+'+s.s.}+}+E+}+}+3.a+}+a+3.S.S.! ! ! o 3+E.E.a.E.5.G j+c i+{+q+1.1.D o 3+o '.l+l+C.k 3.]+3+E.E.E.E.F 3.J L.M.'+S.G+n _.R X w f 3.3.o A+X C.L.L.L.g Y.Y.,.,.Y.,.Y.Y.g ,.g ,.Y.Y.C.Y.Y.C.,.C.,.,.,.,.7+7+7+e+[ e+l+t.e+ +#+H.N.N.C.,.,.Y.,.w+m 7+7+l+w+U G+< ^ > 0+D+&+&+> j+) `.! - C.U w+#+Q.I.x+l. . . . . .K.K.K. . . .: g+U.t.H p.p.p.N.B B B 4+B B B N.N.N.#+H p.p.B o+4.u -.-.o+B *./+#+S._ e+v 0 a 5 n.~ ; W =+W ; z.t.y+v 3 K l l 4+;+7.4+p.o.<+l m+l.m+ .L j.w.Q.n+}+X.P.e.6+e o.Q.t.t. + +1+1+n+N.X.X.m.", "u 1.1.u 1.1.u 1.u u 1.u 1.u u 1.u u u u 1.1.-.u 1.1.1.1.1.1.1.u 1.1.1.1.1.1.-.-.-.{ -.-.-.-.-.-.-.{ 4.q+q+-.-.-.-.-.-.-.q+4.4.{ 4.q+4.4.4.4.) 4.q+4.4.4.4.4.-.4.`.) ) `.`.4.) &.&.`.`.4.q+q+`.&.&.9 i+i+o+k+4+G.k+C+A+2.J.C+H 2.C+++)+J.u.f+9 i+8.++G.8.)+2.i G.b+C+#.! )+B.C+B.r+r+r+++A+3+b+< D D n A+8._.3+3+8.< < A+< A+A+A+_.A+3+8.3+< < 5.( 4.-.1.-.1.1.-.q+1.-.) 8.r+A+7.A+7.7._.A+A+_._._._._._._.G #.G ]+o o ]+]+]+@._.< _.! o F i ! ! G+E+G &.-.u u 9.9.9.9.9.9.9.9.z $.L K j.3.F R.M.3.4 R.M.s.- C.R w S.b & 6+6+6+C 6 u.n X L.}+a+a+3.a+a+f }+}+}+}+}+a+3.H+3.3.3.3.3.R.! o F E.a.E.5.< j+=+j+c j+c j+]+S.! 3+7.R C.C.X s.3.G 5.E z u.E.F R.J J L.M.3.@.W < b #+'+3.3.f ]+< P.L.H * L.g g Y.Y.,.,.,.,.Y.,.p.,.Y.,.g Y.Y.Y.g C.,.,.,.,.,.,.,.7+7+/+e+7+e+e+e+e+e+e+e+e+7+7+7+w+7+7+7+e+e+j j @.^ 6+0+&+T.D+D+r z E.R l+e+y+[ e+[ .[.7 7 7 l.l.: l.: . . .K. . . .y+Y.N.H N.'+B 4+4+4+B 4+B 4+B B N.N.B B B B X.X.i.++C+P.#+m.H.a+X _ j _ 5 ^ ~ ^ ^ ~ ~ ; =+j+W z+0 y+U.{.3 ;+8 !.!.u { z D k+H.Q.Q.o.O j.t.[+G+G ]+P.[+Q.5+Q.t.[+y.p.[+p.[+ +t.[+m.", "u u 1.u u 1.u u u 9.u 9.u u u u u u u u 1.u u -.-.-.-.-.1.1.1.u 1.1.1.u 1.1.-.1.-.-.-.-.1.1.1.-.-.4.{ -.-.-.-.4.{ q+q+{ q+4.4.4.4.4.-.q+4.4.) 4.4.4.4.4.4.) 4.4.) ) 4.) ) ) `.9 -+4.4.q+{ q+-+-+`.&.f+D o+b+C+>.>+.+C+C+B.N.h+r+^.i f+f+9 f+o+o+D 8..+N.4+4+^.2.a+.+^.)+B.2.i.)+B.#._.++b+*+5.*+u.f+9 z f+D W A+A+A+< < < 8.8.3+A+A+3+_.A+3+< 5.&.-.{ -.4.9 (+W W {+-.1.4.G r+A+A+3+A+_.7.A+A+A+A+_._._._._._._.G G G G ]+]+G < F ]+o 3+F ! ! ! ]+G+G+G n 3+n 5.( ( i+f+z &.z X.j.3 v - i o 3.M.8+F 3.X s.#+L.C.J k k E+E+5 @.]+G G 3.- M.3.a+a+S.a+a+a+@.@.a+S.S.S.a+@.a+a+S.3.3.3.3.! ]+_.E.E.( c c c c c j+W (.H+3.a+! _.3+E+k L.s.3.n 1.9.9.9.{ z n 3.j ,.9+s.a+@.G (+5 k E+'+3.E+S.< ]+9+h+H H h+g g Y.Y.,.,.m m ,.,.Y.p.,.,.,.C.g Y.Y.Y.p.,.,.C.,.,.w+w+/+w+7+7+7+7+7+7+7+7+7+7+F+7+7+7+F+l+P e+l+j _ ^ T > > > & G+n o '.w+P [ [ v [ .7 q Q 0.0.Q Q q d |.l. . .: l. .L l+'+N.N.'+4+4+4+4+4+4+4+4+4+4+4+B B B X.X.B B X.B .+N.N.N.a+.+s.#+R R c+c+(.~ ^ ~ n.~ ; c ( c z.[ <+3 <+..8 !.9.9.9.9.9.u { >+k+b I.D.0 R a+B.G )+H+n+*.M [+p.p.p.N.p.N.N.z+N.m.", "-.1.u 1.u u u u u u u u u u 9.u u 1.!.u u u 1.1.1.1.1.1.1.1.u 1.u 1.1.1.1.-.-.-.q+4.-.-.-.-.-.1.-.q+1.1.-.-.4.-.q+4.{ q+4.4.4.4.4.) 4.q+) 4.q+) 4.4.4.) 4.) ) ) ) ) ) ) `.) 4.q+) q+4.{ 4.4.4.`.`.`.9 i+D o+o+z 9 (+o+D i.H * 4+H '+J.b+(+k+C+b+8.B.B.^.'+2.2.}+a+R.a+R.R.S.^.2.2.i #.3+*+G.o+o+o+f+u.9 9 z f+8._.< A+< < < 3+< 8.< A+< A+A+< < z 4.-.-+W 2 T T T n.&.{ -.(+]+_.A+_.A+A+_._._._._.A+++_._._._._._._._._.o ]+< n ]+o _.3+o o ! ! ]+]+6 G _.o ! R.E+t.o.}. +4+@._ j.$+w.8+F R.R.R.! i 4 a+X 3.f s.g k J _ k k k X X - C.Y.h+'+3.a+S.a+@.S.a+a+S.a+@.@.@.a+S.S.S.S.S.! 3.3.3.o W ( ) `.{+{+Z.c c W 2 w 3.R.S.! 7.n 3.X M.E+_.-+9.9.9.9.9.>.o l+w+L.X s.f 1 < D R L.H s.a+3.H+8.k+p.h+* '+H Y.g V ,.Y.,.Y.,.,.,.h+g Y.,.Y.Y.H L.,.g ,.,.C.,.,.,.,.,.,.,.w+,.7+,.m ,.7+7+7+7+7+7+F+e+[ [ [ 0 j '.0 $.z.f ]+G+3.E+- w+7+7+P e+e+v <+@ ] d q Q 0.. . 0.q 7 l. .m+[.l.U.l+q.q.B '+B 4+4+4+4+q.4+4+4+4+4+4+4+B B B X.4+X.B B B 4+}+B 4+H.w X X 5 (.6 ; ; 6 ; ; ; c {+`.( Z ,+y+e+..A 8 !.!.9.!.u ) D 6 b y.Q.O O t.y.H.P.E+#+b n+M p.y.y.p.n+n+N.z+N.N.b ", "u !.u u u u u u u u 9.u 9.u u u 9.1.u u u 1.1.1.-.-.-.-.1.1.u 1.1.1.1.-.1.1.-.-.-.4.q+-.-.-.-.-.1.-.-.-.-.-.q+{ -.q+-.{ 4.) 4.4.) ) 4.-+`.) 4.) ) 4.q+q+4.q+4.) ) `.`.) `.`.4.4.4.4.q+4.`.) 4.) `.`.9 9 9 9 >+k+*+f+o+D k+B '+h+L.H q.G.(+H.'+'+^.C+b+k+a+'+'+'+^.^.a+4+R.a+4+! ! )+C+A+G.G.J._.k+B._.n ( u.z z 8._.A+A+3+8.A+< A+3+8.3+8.A+3+< 5.&.4.-+W 5 T a 2 ~ {+{ 4.< o _.3+_.A+A+A+A+_.A+C+_.++_._.#._.r+_.G _.G ]+< n < ! G n F o o o W c.i+c c 5.( ( 3+s.L m+m+ .3 L j.d+[ 3.F o ! R.R.R.o _.F G S.3.@.}+3.'+E+X X - R k C.C.- X s.}+}+}+a+a+3.a+@.a+S.a+@.a+S..+S.S.@.3.! S.! 3.! o 9 u 9.9.9.9.9.&.~ *.k k 3.3.3.]+*+o - a+f c+8.i+`.q+-.z 3+3.C.L.L.#+#+- b j+5.z.- s.H s.a+f H+_._.n+H H * H H h+g g Y.,.V Y.Y.g * Y.,.,.Y.g Y.p.,.,.,.,.w+w+,.,.,.,.w+,.,.,.,.,.,.m ,.,.7+e+e+7+,+#+! o r+o ]+! f z._ _ _ J /+w+,.m w+7+7+e+e+d+3 j.t.0 K.[.] B+d q .3 L l l.l.3 e+B q.B 4+B 4+q.4+4+q.q.4+4+4+4+4+4+4+4+4+4+B B X.B B B 4+B B H.N.H.}+f P.c+6 ; 6 W W W c 5.9 5.D ++2.:.= A A 8 8 !.8 8 { 9 j+6 P.1+I.O w.I.$. +*. +*.y.y.p.p.p.p.N.n+p.!+p.n+p.", "u 1.9.u u u u u u u u 9.u u u u 1.u 1.u 1.u u 1.1.1.u 1.1.1.u 1.1.1.-.1.1.-.-.-.-.-.4.-.-.1.u u -.-.-.-.-.q+{ q+4.{ -.q+4.4.q+4.4.) ) ) 4.4.) 4.) 4.{ q+4.4.) 4.) ) `.`.`.-+4.4.4.`.`.`.&.`.) ) `.`.q+-.) D X.N.q.A+o+D i.H '+4+q.H *+i.J.B.H '+'+'+2.J.X.^.C+4+B.a+}+a+4+a+R.^.^.2.#.7.n G._.b z+z+b X.(+f+f+u.( < _._.8.A+3+A+A+A+3+A+3+A+_.A+< 5.9 z z ( 5.D 5.( z -+9 8._.A+A+8.A+A+_._.7._.7.++_.C+k+_._.k+#._._.G _.n < o G F n #.o _.i+-.9.u 1.q+u u 1.4._.o.l F.m+m+K $+d+- F 4 8+3.R.! ! o _.5.n < 8.B.! S.}+a+R.a+a+a+f M.'+s.s.s.M.}+}+E+'+}+}+a+}+a+S.a+S.a+a+S.S.S.3.@.S.@.3.@.3.]+< ( -+u 9.9.{ c+*.R ,+#+M.X i 3+S.M.f H+]+6 G G W G 1 z+C.- H s.s.X R z.5.j+X C.L.L.Y.L.'+f @.k+8.H.H '+* H * H Y.g Y.,.Y.Y.g * h+g ,.Y.,.,.p.,.,.,.,.7+m 7+7+7+7+,.,.,.Y.,.Y.g Y.,.w+/+s.! #.i r+o ! 3.E+E+E+f ! ]+o ! f X w+l+e+7+7+7+l+7+e+v s.N x.-+i+k+5 w.].[ J U 0 3 y+e+e+p.H B N.q.4+4+4+q.4+4+q.q.4+4+4+4+4+B B 4+X.B B B 4+.+B B B 4+B B B H+}+P.1 c+6 ; W W < < W G+H+B #+r+N s+A A x.{ !.9.9.{ f+8.1 a & I.<.I.o.I.I.Q.5+ + +y.p.n+p.p.N.N.p.z+n+z+", "1.-.1.1.u u u u u u u u 9.u u u u u u u u u u u u 1.u 1.1.1.1.1.1.u 1.-.-.-.-.-.-.-.-.4.-.-.-.-.-.-.-.1.1.-.q+-.-.u 1.-.4.4.4.4.4.q+-+`.`.) `.q+4.) 4.4.4.4.) ) q+) `.`.`.4.4.) `.) ) ) &.`.`.`.) -+4.`.i+8.X.N.'+7.o+D 1 L.L.* H L.'+B C+A+.+'+H * q.C+a+i J..+C+}+'+'+a+^.R.4+a+2.++B.i J.A+B.)+X.Z ++o+f+f+z ( < < A+A+A+8.A+_._._.8._.< _._._._.< < 5.5.>+( ( ( 5.5.< ++++A+3+A+A+A+A+_.++_._.++_.++_.B.#.#.#.#.#._.< n _.o _.3+_.o o n 1.9.9.9.u 1.u 9.9.9.4.1 j.K {.F.K v j ! F ! 3.R.R.! R.]+W ( {+{+{+9 D D 8.Z a+a+a+a+a+S.3.a+}+}+}+3.a+}+}+f '+f H+}+H+a+a+}+f }+a+3.3.3.3.3.f H+z.$.& & T 1 W D ++z.$.k R w s.E+3+i 3.3.G+G W 6 G 6 6 1 e.Q.C.H s.'+'+M.X 6 ( 6 X L.L.L.L.L.L.#+'+S.6 8.G+m.g h+* h+* H g g p.Y.g * H * g L.h+Y.Y.Y.,.,.,.,.,.,.7+,.7+7+7+,.,.,.,.Y.g p.w+'+4 r+! S.3.f f s.s.f E+E+E+E+E+f M.R.8+R.R.s.C.w+l+e+e+e+0 y.i.G.z { 8 x.#.f 3.M.U e+e+e+e+p.p.N.'+B q.4+X.q.)+X.4+X.4+X.4+B 4+B B B 4+B .+B B 4+B B B B B B B P.B P.@.1 1 1 c+c+(.c+@.P.H.w N.4+*+p+= x.x.A 9.9.9.u `.D 6 !+*.& I.O O s o.I.Q.t.[+[+p.p.p.p.p.N.p.!+H p.", "-.-.1.1.u u u 9.u u u u 9.u u 9.u u u u u u 1.1.1.1.1.u 1.1.!.1.u u 1.-.-.-.-.-.-.-.-.-.q+-.-.-.1.-.1.-.-.q+{ -.-.-.) 4.4.) 4.) ) 4.) ) ) `.4.) ) ) ) 4.q+4.q+4.) `.) ) ) -+4.4.) ) ) &.&.`.`.`.`.`.&.9 D 8.A+7.G.D o+>+H.h+L.g h+* 4+4+L.q.B.4+'+B ^.H '+'+E+'+s.'+'+'+'+a+a+a+^.a+q.2.B.r+r+i i ++A+b+n :+:+>+n A+_._._._.A+_.A+A+A+A+A+++A+A+i r+#._.#.++A+A+A+A+A+A+A+A+3+8.A+_.A+A+A+A+A+A+A+++++_.++#.#.#.G #.G _.< _.o o 3+F o o S.(+u 9.1.c _+^+~ c u 9.9.`.0 ' K K p [ X F _.8+3.3.3.3.3.G+< &.{+{+c ; ; 8.o+{+D H+* R.R.a+a+a+a+'+a+}+a+a+a+}+}+'+a+S.}+s.}+}+#+M.E+E+E+'+f f f f _ w.D.> |+W.|+O Q.P.n+_ s.s.E+o 3+! E+i.>+-+) &.i+c j+1 & I.,.L.s.}+E+w 5 j+5.P.X h+s.s.#+L.#+L.#+M.f Z (+6 p.p.Y.L.Y.p.Y.Y.g Y.Y.h+* h+* * h+L.Y.Y.L.Y.Y.,.,.,.,.7+,.,.7+7+,.,.,.,.,.,.J ! ! s.X s.s.M.}+Z G G G 1 X b X X w #+L.L.Y.s.* '+a+a+M.,.0 }.+.5+ +*.1 _.i o 4 f.C.e+e+l+7+p.p.N.B 4+4+4+4+4+4+q.q.4+4+4+B 4+X.B B B B B B B B B 4+4+B 4+B B N.N.B H.H.H.P.H+P.P.H+P.B B N.N.N.B C+J.*+:+u.E { !.9.8 z D k+P.e.I.}.w.o.O s }.0 t.t. +p.p.p.!+p.p.N.p.p.n+", "9.u 1.1.u u u 9.u 9.9.9.u u 1.u u u u u u u u u u u u u u 1.1.1.-.1.1.1.-.1.-.-.-.-.q+-.-.-.-.-.-.-.-.{ 4.q+-.-.-.-.4.) 4.4.) 4.) ) 4.-+`.&.`.`.) q+4.q+4.{ 4.4.4.`.) ) `.`.&.`.-+) ) &.&.&.&.&.&.&.&.>+(+b+b+o+o+(+G.>+)+'+Y.H g '+'+'+H '+r+J.G.)+a+2.)+'+'+'+H H '+a+4+'+R.a+^.a+a+R.4+^.B.++r+r+i 7.A+b+J.8.++C+_.i _._._._._._.i _.A+A+_._._.++_.++#.#.#.#._.#.r+_._._.A+A+3+_.A+A+A+A+_.++A+A+++++_.++_._.r+_._.n n G _.F < o o ! 3.W &.q+%+> S S > r {+9.9.1.X d+' p $+U o F o 3.R.! S.! M.E+_.i+=+;.C > > <.^ 9 q+c k s.R.R.a+a+a+a+a+a+3.a+a+a+3.S.S.a+S.E+E+'+s.}+'+s.w w w w #+R $.w.6+6+S K.S ].o.q.a+m.s.X H+< 3+3.s.]+( { 9.9.9.9.1.8.w.I.l+C.L.'+M.w ]+5.W f X L.H s.H h+H s.H #+}+f ]+(+W N.L.L.g Y.g ,.Y.,.p.Y.g p.h+Y.h+L.h+h+h+h+h+L.p.Y.,.,.,.,.m 7+,.,.,.,.p.,.X o 3._ J C.9+! ( q+u 9.9.u 4.W f s.#+X - C.,.,+Y.Y.Y.#+L.9+t.I.s I.Q.5+I.y.i F i 8+X 7+e+t.p.p.H B B B 4+4+4+X.4+4+X.q.4+4+4+4+B B 4+B B B 4+B .+B B 4+B B B B B N.B B B H.H.B H.N.H.N.H.H.N.N.N.B )+C+++J.J.G.o+u.`.E f+b+i.B y.& I.w.s w.s I.}.l+t.[+p.p.p.H p.p.n+n+n+p.", "1.u u 1.1.u 9.u 9.u u 1.u u u u u u u u u u u u u -.u u u 1.u 1.1.1.1.-.1.-.-.-.4.{ -.-.-.-.-.-.-.-.-.q+q+4.q+4.-.-.4.) 4.4.) ) ) `.`.) ) 4.`.-+4.{ 4.4.1.-.q+4.) ) `.) `.`.-+`.&.`.`.`.&.&.&.9 &.9 9 9 f+o+f+f+D 8.J.D X.4+'+4+q.;+D H.* '+7.C+i.J.^.J.b+H.* R.'+* '+2.G.B.4+R.R.R.4+a+^.R.^.2.)+)+)+)+B.o C+A+r+_.C+_.r+_.i i i _._._.r+_._.++_.++A+_.++_.++_.r+_._._.++A+_._._.A+A+_.A+++A+A+8.A+A+A+A+A+A+_.G _.< n 3+o _.3+3+o o ! 3.]+< z i+h.<.C r ; ) 9.9.E b P F+v [ f F F 3.` ! S.3.S.S.H+o 8.^+> 0+0+0+0+> ; &.z E+C.a+a+a+a+3.a+a+a+a+a+a+a+@.a+a+H+}+a+a+f }+a+H.s.#+#+#+R 9+'.0 $.a & <.|+|+].x+0 - X s.X ]+3+]+s.s.b P.++D &.4.!.8 D s /+,+C.s.s.s.X W (+]+#+h+s.s.H L.h+H L.#+'+w '+H+1 8.8.B p.H g p.Y.g ,.V ,.,.Y.p.g Y.h+h+h+H H h+H * L.H Y.Y.Y.p.,.,.,.,.,.,.U 3._.X '.e+j - n z ( W ^+^ ; -+u `.G+L.Y.L.9+,.,.l+7+l+l+R i.6 P.a 1+5+5+Q.Q.M.` * L.Y.w+e+,.,.p.H N.B 4+4+4+4+4+4+4+4+X.4+4+B 4+B B B B B B B B B B 4+B 4+4+B 4+B B N.N.P.N.H.N.N.N.b b b N.N.N.N.N.B B X.X.i.C+C+++++8.C+i..+P.*.Q.& I.I.I.I.}.0 5+t.t.[+p.p.p.p.N.p.n+p.n+", "u 1.1.u u u u 1.u u 9.u 9.9.9.u 9.u u u u u u u u 1.u u 1.1.1.1.1.1.u 1.1.-.-.-.q+-.-.-.-.-.-.1.-.-.-.-.-.{ -.4.-.4.) ) 4.) -+) ) ) 4.4.) 4.) 4.) q+4.4.4.-.4.) ) 4.`.4.) &.`.&.&.`.&.`.`.-+4.`.&.9 f+D o+z `.&.D X.J.D H+'+r+^.^.G.b+H+2.4+2.A+)+}+H :.D P.L.h+H '+'+J.b+}+a+4+a+R.4+^.a+R.a+^.r+C+)+^.)+o B.#.B.r+r+r+r+r+r+_.i r+r+r+r+r+r+r+_.C+A+A+_.A+_._.++C+_.i _.i C+_.C+_.8.8.3+++_._._._._._._.8._._._.< n n _.F 3+n F o o o ]+G+6 < < G 5 5 ; 5.4.1.) A+X - J '.- o F o 3.! ! ! ! S.3.E+3.i.1 r <.> > > r W {+D H+- M.a+'+a+a+S.a+a+a+a+a+a+a+a+3.a+3.a+a+3.}+a+}+'+s.E+s.#+R $.Q.z.5 z.C O O x+ . .o.9+R X ]+i f E+X +O O <.5+!+6 ++P.I.Q.,+L.s.#+w 5 n < 5 - L.L.L.L.H L.h+h+H #+#+s.}+i.W D D P.p.g g p.Y.,.Y.,.,.g Y.Y.Y.p.h+h+'+'+'+'+'+'+'+H h+L.g ,.p.,.L.Y.C.k o _.k 0 [ e+k A+W T S 0+T.0+> i+u z X w+Y.Y.C.Y.,.l+7+e+H+{ 9.u -.&.c.8.X.5+I.l+w+7+e+e+l+/+p.p.H N.B 4+4+4+4+q.4+4+4+B 4+B B B B B B B B B B B B B B B B B B 4+B B B N.B B N.N.H.N.N.N.N.N.b B N.N.N.N.N.B !+.+4+.+X.X.B B N.H.z+[+ +5+Q.I.I.o.}.0 t.t./+[+p.!+p.p.p.n+p.y.", "u u 1.1.1.u u 1.9.u u 9.u u 9.u u 9.u 9.u u u u u u u 1.-.-.-.1.1.1.1.-.-.1.-.-.-.4.-.-.-.4.-.-.u -.4.{ q+-.q+-.4.q+4.4.4.4.&.`.-+) -+) 4.4.4.4.4.-.{ q+4.) { 4.`.) 4.) `.) `.`.&.) ) 4.) &.`.&.9 i+c.8.o+`.&.&.&.9 9 ++4+H H 4+B 2.b+H.h+'+i G.++B h+2.G.@.'+L.q.2.B.b+]+'+'+^.^.)+2.C+)+.+R.2.B._.! ^.o 2.B.r+B.#.#.r+r+#.#.o #.#.o )+! ! ! )+o r+r+_.++#.r+r+r+_.r+_.++++_.++3+D :+f+( o+A+_.C+++++++_._._._._.n 5.< _._.3+n n A+G G o G ]+c+G+@.E+E+]+8.n n _.a+}+s.- X 3.i o ! ! 3.! ! ! ! @.3.H.f H+H+5 5 ^ 1 G W 8.G f s.a+a+a+a+a+a+a+a+}+a+a+a+a+a+a+S.a+a+a+S.S.3.a+}+}+'+w R n+_ b 1 1 2 b 2 e.o.l .y+U k f #.! X #+9+Q.D.S K.|+|+> }.$.9+/+C.H '+M.X 6 5.G E+s.L.L.L.L.Y.Y.Y.L.L.L.s.#+'+n E -.{ 9 J.4+'+Y.Y.,.g ,.g Y.g h+h+h+H h+H B 4+B B 4+B '+'+* p.g g L.h+L.k - _.o _ [ d+[ J R._.r S T.D+D+0+C u.u.}+l+7+w+,.,.,.C.,+t..+{ 9.9.9.9.9.9.u D y.d+d+d+e+e+7+p.p.H '+B 4+4+4+4+4+4+4+B 4+4+4+4+B B B B N.B B B B B B B .+4+B 4+B B N.B B H.B N.B B N.!+N.N.!+N.N.N.N.N.N.N.N.N.B N.N.B B B B B N.N.N.n+*. +Q.0 I.o.}.}.t.t.t. +p.[+p.p.n+p.y.m.", "u u 1.-.!.u u u 9.9.u 9.u u 9.u 1.1.1.u !.u u u 1.u u 1.q+1.u 1.1.1.1.1.1.-.1.u -.{ q+-.-.4.-.-.u -.4.-.-.{ 4.q+{ -.q+4.4.4.4.4.4.) ) ) ) ) 4.q+4.q+{ q+-.4.q+4.) &.`.`.&.&.`.-+&.&.&.4.) &.&.9 i+f+f+f+9 z 9 f+9 f+9 6 .+q.)+H L.'+J.8.4+4+7.o+8.w H ^.b+w L.* 4+'+r+)+}+'+'+R.4+^.R.2.J.i.a+R.q.q.^.^.)+2.o r+2.o B.o o o 2.)+! i.#._.k+k+B.i.)+]+)+o B.#.#.#.#.r+#.r+r+_.r+A+o+9 z z z z o+C+#.B.r+++_._._._.< n n 3+_._._.3+3+n < W G G G 6 ]+G+G+G+]+Z Z i.! ^.3.3.3.3._.4 ! R.! ! ! ^..+! G+S.}+E+E+5 w E+1 @.]+G ]+! S.a+R.! a+S.a+S.@.a+}+}+a+}+}+a+a+a+a+a+a+a+S.a+a+a+}+}+3.E+b G &.9 W c+8.z i+e.].D.j /+k ! o f k k w+I.D.|+|+x+L ].x+'.9+[+- s.s.E+5 (+5.c+s.M.H h+L.L.Y.Y.L.Y.L.C.L.9+9+^.:+E A 8 8 x.:+q.p.Y.Y.Y.Y.g p.h+h+H h+N.B.b+>+>+D ++)+B '+'+H L.Y.p.g L.9+f _.! _ e+7+e+J - _.< ~ C 6+> C ^ 3+A+X l+7+7+7+7+/+l+l+l+t.P.D ) 1.9.9.9.!.u.H.e+e+d+e+e+7+p.H H B B q.4+q.q.4+4+4+4+4+B 4+B B B B B B N.N.B B B B B B B B B B B B B B B B B B N.B N.N.N.N.N.N.N.N.N.N.N.N.!+N.N.N.N.N.B N.H.N.N.N.z+n+*. +Q.}.o.}.y+}.e+t.t.t.p.[+p.*.p.M p.", "u u 1.u 1.9.u u u u 9.u 9.u u 1.1.1.1.1.9.u u u u u u u u 1.1.u 1.1.-.-.-.1.-.1.-.-.-.1.-.-.-.1.1.-.-.4.q+4.q+{ q+q+{ q+4.) 4.q+4.4.4.4.4.4.q+4.4.4.-.4.q+q+q+-.) &.9 9 &.&.&.`.&.-+&.&.&.9 9 >+f+i+D k+++B.C+i.;+>+i+f+D >+f+D N.L.;+b+.+'+q.G.o+D G.G.b+.+h+h+2.4+B.a+'+'+a+'+R.R.q.2.7.! R.a+R.R.! ^.)+^.2.o 2.2.o 2.B.! .+^.B.3+b+G.G.*+D < ++! ^.S.R.2.2.2.B.o B.B.#.B.++n *+u.u.z z E f+++B.#._.++A+_._.< n n 3+3+F 3+3+W 5.5.( 9 {+) ) {+c.G Z ]+#.#.B.]+o ! S.3.3.o 4 o R.! R.! ! ! ! ! ! G+S.3.H+H+f f f @.3.@.S.S.S.! R.a+^.a+a+a+4+@.@.a+a+a+3.}+a+a+S.S.a+@.a+^.S.a+a+a+B f E+>+!.9.{ &.`.9.9.8.x+0 '.'.f f.! #+k ,+0 o.o.O D.D.x+x+L y+l+9+L.s.E+X ]+5.< S.s.s.'+L.* L.L.L.Y.p.L.Y.C.,.Q.& a P.i.8.*+p+;+4+Y.g ,.Y.Y.g g h+h+h+4+n -.u 9.9.9.9.q+f+)+H H L.L.Y.C.Y.- ! o E+U l+P l+j k 3.< 5.c j+W _.o ! '+C.7+e+7+7+7+7+l+e+[ I. +a !+n.k+j+D D i.z+l+e+e+e+,.,.Y.H '+B 4+4+q.X.4+q.4+q.4+4+B B q.B B N.B B N.N.N.B N.N.B B B .+B B .+B B B P.B B B B N.B N.N.N.H !+N.p.!+N.!+p.N.N.N.!+N.N.N.H.N.B N.N.N.n+p. +Q.o.y+s y+}.y+}.e+}.t.t.[+ +p.[+y.", "u u u 1.1.u u u u u u u u u u 1.1.1.1.1.u u u u u u u u u 1.1.1.-.u u 1.-.-.1.1.1.1.1.1.-.-.-.-.1.-.-.4.-.4.q+-.{ q+{ q+-.4.4.q+4.4.4.) { q+q+4.4.4.q+{ 4.4.q+-.) 9 9 9 z &.&.`.&.&.&.&.9 9 >+f+i+D o+D k+N.a+4+2.7.D D D D 8.i.H Y.q.J.G.b+B.J.D o+>+D 8.H.h+* H q.2.H a+'+4+'+'+a+a+q.q.)+R.a+a+R.R.R.^.^.)+^.^.^.)+)+2.2.S.S._.n J.G.n *+:+o+G._.a+H+a+^.o 2.2.o 2.2.B.B.++G.G.o+u.u.z z u.#.B.#.i ++A+_.A+< n n F 3+A+7.A+< i+) q+q+1.u 9.9.9.-.9 G ]+i.o i.i.o ! ! o o o 8+R.! R.! R.G+.+G+G+G+G+G+G+@.G+S.G+@.S.! ! ! S.S.R.a+a+a+! a+R.a+S.a+a+a+a+a+3.a+a+S.a+! a+^.S.S.}+}+}+H+1 < E { ~.8 !.9.9.9 Q.J k k ! i 3.X X ,+0 w.& & & +.I.w.j.x+y+w+L.H w b W < G f M.s.'+H h+H L.L.L.L.L.L.C.,+t.Q.5+5+5+5+5+*.p.p.,.Y.,.,.Y.Y.Y.Y.g p.r+= 1.) c ; ~ c ) u { ++H Y.L.L.9+9+M.o o - l+7+7+w+3._._.W n 5.5.< o 3.X ,+l+7+7+7+w+7+w+w+/+e+I.$.M a a !+a 5+5+Q.e+e+e+e+e+7+,.p.* '+q.q.4+q.q.q.q.q.4+4+q.4+4+B B B B B B B B N.X.N.B B B B B B B .+.+X.4+B B B B 4+N.B N.N.N.N.N.N.N.p.N.N.p.p.!+p.N.p.N.N.!+B N.N.N.N.z+p.p.5+}.y+g.g.g.<+g.y+y+}.e+}.t.t.t./+", "u u 1.u 1.1.u u u 9.u u u u u u u u 1.u u u 9.u 9.u u u 1.u 1.1.1.1.1.1.u 1.-.-.-.-.!.1.1.-.-.-.4.-.-.-.4.-.-.4.q+4.q+{ q+4.-.{ 4.4.) 4.4.4.-.{ 4.4.q+q+{ 4.{ 4.4.`.&.9 &.z &.&.`.&.z 9 z i+D >+D D f+>+6 o 4+^.)+B.*+D k+@.^.H H '+h+B 4+^.4+i f+D A+b+i.L.g '+2.^.'+'+'+q.'+'+* '+'+a+R.q.^.R.R.a+a+R.a+a+R.R.R.^.^.R.R.a+}+)+#.J.J.;+J.J.n ;+n ++a+s.a+R.^.2.o 2.2.B.2.r+r+i ++++G.f+f+u.( k+B.i _.7._.A+3+n 5.n _.A+7.7._.< &.1.u -.) q+9.9.9.9.9.`.Z ^.^.! 2.! 3.! o i R.3.3.R.^.a+G+#.8.D i+{+i+D W G G+G+S.! ! S.S.S.a+! a+S.a+a+a+a+@.S.a+a+a+R.R.a+a+S.S.a+! S..+S.! ^..+S.@.G+6 W (+n D f+E 1.{ b+$.k k f o o E+#+#+_ *.z.b z.z.b 5 n+I.L y+l+C.- k 1 < < ]+}+'+'+H '+H L.'+h+h+H L.L.L.,+[+y.*.e. +5+Q.o.}.e+7+,.,.,.,.,.p.g g Y.o E.( _+> 0+0+0+C ( 8 E .+p.Y.L.Y.k 3.F ! k 7+7+7+l+i = A 8 -+9 5.< o #+w+w+w+w+w+/+w+w+/+/+l+Q.t.*.n+n+!+H.P.N. +}.e+y+d+d+7+7+Y.H * B B 4+q.4+X.)+q.)+q.q.4+q.q.q.4+4+B B B B !+N.B .+!+B X.B .+4+B 4+4+4+.+.+.+B B B B N.N.N.N.N.N.N.N.N.p.N.N.p.N.p.N.z+N.N.B N.B B N.p.N.p.[+Q.I.e U.2+l U.2+K g.<+y+y+y+y+0 0 ", "1.1.1.u u u u 1.1.u u u u u u u u u u 9.u u 9.u 9.u u u -.-.-.1.1.-.u -.1.1.-.-.1.-.-.-.-.-.-.-.-.1.-.-.4.4.-.-.-.4.q+{ 4.4.q+q+4.4.4.q+{ q+q+q+4.{ -.q+q+4.) ) 4.`.`.9 &.9 `.&.`.9 9 D (+b+>+G.(+D f+f+8..+a+^.)+B.b+o+D 8.}+i w * 2.7.^.H '+i G.8.)+2.#+L.L.'+2.N.'+'+i C+'+'+L.H H '+R.R.R.R.^.'+a+a+a+a+a+R.R.R.R.^.R.a+}+^.B.i 7.J.A+7.J.J.:.#.4+s.}+R.! ^.2.2.! 2.2.2.B.2.)+)+C+G.:+f+G.B.B.i ++3+A+++A+3+n n 3+_._.4 _.(+&.-.q+Z.V.%+=+{+q+9.9.9.c f ^.! o ! ! o F o ! 3.a+R.R.^.! (+`.u 9.9.u ) {+9 5.; G+S.! ! ^.! a+a+a+S.a+a+a+a+a+R.a+R.a+a+S.a+R.a+^.a+R.! ^.! ]+#.o G W (+c 5.j+; 6 6 G i.P.y._ #+X ! i R.s.X X b A+< k+c+1 (+`.o+*.j.e+C.C.- X ]+< G f s.s.* h+h+H L.H L.L.H L.#+m.H.G+6 k+1 P.z+ +t.0 /+,.,.Y.,.,.,.,.,.C.Y.M.r+3+2 > 0+0+0+0+^ `.= _.C.g L.L.k ! i ! k w+P e+[ ,+#.o+u.u.u.E.E.4 s.l+7+,.7+,.,.C.C.C.C.C.Q.H.6 i.G+X.i.A+J.B.L.,+l+e+e+7+,.p.g '+q.B q.q.q.4+q.q.)+q.4+q.4+q.B 4+4+B B B 4+4+B B B B B B B B 4+B .+4+4+4+4+4+4+B B B B B B N.N.N.N.N.N.N.N.N.N.p.z+N.p.p.N.N.N.N.N.N.N.z+p.p.Q.s 2+K.r.g+l.g+r.r.r.| K g.<+<+y+", "1.1.1.1.u u -.1.1.u 1.1.u u u u u u u u u u u u u 9.u u -.4.-.-.-.-.-.1.-.1.1.1.-.-.-.-.-.-.-.-.-.-.-.4.4.q+4.4.q+{ q+q+q+-.4.q+4.4.q+{ q+4.4.4.4.-.1.4.{ 4.4.4.`.`.`.9 9 `.) `.&.&.i+(+b+G.8.++J.#.}+i o+(+B.J..+'+r+*+9 (+.+4+H Y.g H H H * H '+4+r+B.L.L.q.i N.h+L.2.o+8.w H '+'+h+}+a+R.'+a+R.a+'+'+a+'+a+a+a+a+R.a+a+R.a+}+4+o B.r+C+i C+r+#.^.}+a+a+4+q.2.)+^.2.)+2.r+C+i r+B.B.C+J.J.++B.i C+i i _.A+A+3+< n n 3+_.#._.< i+q+i+^+C <.<.T h u 9.9.&.5 R.o ! ]+o 4 F 8+` R.a+a+a+3.W i+1.u u -.`.c c {+) {+< ]+S.R.! a+R.R.! S.R.a+a+S.S.a+a+a+a+a+a+a+a+R.a+^.S.! o #.7._._.D 9 ) `.{+c.W W W ; 1 t.l+X X f f.o S.s.'+s.E+A+*+n i.B.-+9.9.6 Q.C.9+#+R E+W 8.! s.H s.H H H L.H L.L.L.L.H L.H+b+E 1.1.q+&.c.X. +t./+p.Y.p.Y.g p.Y.C.C.C.k X f E+2 r C C a ]+E.E.i.#+L.L.X - o #.3.g ,.7+7+e+o.0 _ b 2 z.H+.+a+H C.7+w+,.,.w+w+,.C.C.,+L.*+>.*+J.++J.f+E p+;+2.q.'+H Y.p.H * '+B q.4+X.q.q.q.q.X.q.q.4+4+4+q.4+4+4+4+4+4+B 4+B B 4+B B 4+4+4+4+4+B 4+4+B B B 4+B B B N.B B B B N.B B !+N.N.N.p.N.N.N.N.N.N.H.N.N.N.n+N.n+ +I.o.U.r.g+|.|.7 7 ] [.l.g+m+r.l U.", "u u u 1.-.1.u u u u u 1.1.u u u u 1.u u 1.-.u 9.9.u u u u -.{ -.-.-.-.-.-.u 1.1.1.1.1.-.-.-.1.-.4.-.q+4.{ -.q+{ q+-.{ 4.4.{ q+4.4.4.4.-.-.{ q+4.4.q+1.4.-.-.q+4.`.&.i+9 z &.`.`.9 z 9 D >+n ++++Z ^.++@.2.C+b+b+@.4+'+q.;+o+++w H L.h+'+L.L.g Y.* '+a+^.4+r+;+Z N.h+h+'+q.)+s.Y.s.s.H H '+a+R.'+'+'+a+'+'+` '+a+R.'+R.a+4+R.'+a+'+a+a+R.! ^.! ^.R.a+'+a+R.R.R.2.R.R.^.)+B.7.A+J.J.7.r+B.B.C+r+C+i C+++i i ++++A+3+< < n 3+#._.< (+9 9 j+_+2 r r =+-.9.9.9 1 R.! o o #.F _.R.3.R.3.a+3.a+_.{+-.{+=+~ r C 2 ; {+q+{+c ]+S.R.S.a+S.R.S.R.R.a+a+@.@.a+a+a+a+a+a+a+a+a+a+! #.7.3+7._.8.9 ) `.c W ^ ^ ; D &.i+E+U - f G i o 3.M.'+'+E+]+_.o i.B.E 9.!.D [+L.s.s.b ]+< _.@.M.'+'+L.h+L.L.L.h+H L.H #+#+b ++N 8 !.9.9.!.f+H.Q.p.Y.L.h+p.g Y.h+L.g L.C.J k k X w 3.H+! ! i o }+L.h+h+- E+o o f - C.,.l+l+t.Q.Q.I.I.s O s o.l+,.w+7+7+w+,.w+w+C.C.p.,+q.:.J.7.++*+s+8 A N Y :.:.4 f.q.q.q.q.B q.q.q.q.)+q.q.q.q.q.q.q.X.4+4+4+4+4+X.4+X.4+4+B B B B B B B 4+B B 4+4+4+4+B 4+B B B B B B B B B B B B N.B B N.N.N.N.N.z+N.N.N.!+N.N.n+p. +}.e K.: |.B+0.D+. 0.Q q q 7 |.[.l.", "u u u u 1.1.u u u u 1.u 1.u u u u u u u 1.u 9.u u 9.u u u u -.-.-.-.4.-.1.-.-.-.-.-.-.-.-.-.4.-.-.u 1.-.4.-.-.-.4.4.4.4.) ) { 4.q+q+4.4.q+q+-.4.4.4.q+-.-.q+4.4.`.9 >+>+&.i+( 9 9 9 (+k+C+b+8.k+)+)+G.i.B 2.i ++i.r+.+B C+( >+Z H L.q.4+'+N.Y.Y.Y.'+H 2.*+o+6 H L.Y.Y.h+7.C+#+L.L.h+h+'+a+'+'+'+'+'+'+* '+'+'+'+'+a+'+'+R.'+a+'+a+'+a+a+a+a+'+a+4+q.a+a+a+a+4+a+R.R.^.2.r+F J.J.;+J.i 2.B.B.C+++++A+++++++i 7.A+A+J.3+< < A+o G < 5.5.( ( D j+; c.{+1.) 8.]+! o ]+o _.4 3+o 3.a+a+a+f f W ( q+c r S S 0+S r c q+q+{+5.o ! R.R.R.a+R.a+a+a+^.a+a+a+S.S.S.a+'+a+* a+R.2.r+_.o ]+3._.( `.8.2 <.S > C j+) 4.8.R k 3._.F o 3.}+f H+G+G+G+o ! ]+D { x.8.#+#+w X f G 3+o 3.3.s.s.'+H h+Y.h+L.H s.#+#+C. +b k+c.f+&.{ x.:+X.l+p.p.* h+'+g h+H h+L.L.L.L.L.- X X X X E+M.E+s.L.g L.#+- R.o ! X L.C.C.C./+*.a a e.5+5+Q.Q.Q.0 w+,.,.p.w+w+,.C.C.L.Y.,+0 [+p.#+H ^.;+p+p+;+:.4 :.:.4 q.q.q.q.q.q.X.)+)+q.)+q.q.q.q.q.X.q.q.q.4+q.4+4+4+4+X.B 4+4+B B B 4+4+B 4+4+B B B B B B B B B B B B B B B B B B B B N.N.N.N.N.N.N.N.N.N.N.N.p.n+*.t.I.<+x g+k.0.0.. . . . . 0.0.0.0.q ", "u u 1.u 1.1.1.1.u u u 1.1.u u u u u u u u u u u u u u u u u 1.-.-.-.-.1.-.-.1.-.-.-.-.-.1.-.-.-.-.-.1.-.-.-.-.-.-.-.4.4.4.4.4.4.4.4.4.{ q+4.q+4.{ 4.-.-.{ -.q+) `.&.i+D f+>+>+D >+i+>+b+(+o+D X.H 4+7.^.2.4+4+)+4+^.^.^.^.J.f+8.s.'+H q.7.B L.g Y.H H ;+f+k+4+7.B Y.Y.q.a+L.L.L.L.h+L.L.* h+'+* '+q.H * H '+'+'+'+* '+'+'+'+'+'+a+'+'+'+'+a+'+a+a+'+R.'+` '+R.a+4+q.2.2.r+4 7.A+7.J.7.C+B.C+i 7.7.7.7.++++++i ++++3+3+3+< < A+G G < < D >+5.(+W 8.c i+(+G o o o ! o o i o o ! 3.3.a+a+E+]+< 5.j+n.r C C r h.=+{+{+{+5.G o R.! ! ! R.R.S.3.S.a+R.R.a+a+R.a+a+a+a+3.3.3.R.S.3.E+X ]+3+5.G+6+S 0+0+S ^ 9 x.< X R o _._.R.3.a+6 < D (+8.G G ]+G W C+.+s.H.M.w S._._.]+M.'+'+h+L.L.Y.C.L.h+H H H #+_ $.e.e.!+5 P.n.k+X.y./+p.Y.h+H h+h+h+H h+H h+h+h+#+#+#+X X X #+s.#+L.#+h+h+#+b ! o 3.X Y.9+,+m.S.k+k+6 1 5 5 z+*.[+/+w+,.,.,.p.,.,.C.Y.p.Y.L.,+/+w+p.w+t.y.H B '+H '+'+q.q.q.q.4+4+4+q.q.q.q.q.q.)+q.q.q.q.q.q.X.q.4+4+B 4+B 4+4+B B 4+4+B B B 4+B B 4+B 4+B B B B B B N.B B B B B B 4+B B B B B N.N.N.N.N.N.N.N.N.N.n+!+p. +Q.}.x+r.|.B+0.. . . . . . . . . . . ", "9.u u u 1.1.1.u u u u 1.u u u u u u u u u 9.u u u u 9.u 9.u u 1.1.1.1.-.1.-.-.-.1.1.1.1.-.1.-.-.-.1.-.1.1.-.-.-.-.-.-.q+4.4.) 4.4.4.4.q+-.{ -.4.q+4.4.4.4.-.4.&.&.`.`.D D A+o+f+o+b+++)+7.o+f+W )+B ^.)+@..+H '+'+H '+4+^.B.A+)+B H L.'+H L.Y.Y.g h+i D (+#+h+2.2.H L.L.L.Y.L.h+L.Y.L.L.g '+C+B h+h+H H * h+* h+h+'+'+* '+'+'+'+'+'+'+'+'+'+a+'+'+a+'+'+4+'+'+a+R.q.q.r+i ++:.J.J.J.J.B.r+7.++A+++7.++7.i i ++i ++++A+< 3+3+< A+_.G G 8.8.(+_.G G W _.G #.o )+! ! ! ! o o o o S.'+R.S.S.]+]+_.]+c+^ ^ 2 ^ (.W c 5.5.8.o ! R.! o o ! ! o ! ! ! S.a+S.a+@.a+S.a+a+a+3.f f E+f X f X ]+o 1 a T C C T c+5.( _.E+f _.3+o a+3.]+( ) `.>+8.G 6 G W _.G+N.s.M.E+E+o _.#.3.'+'+'+H L.Y.p.L.H H h+M.w #+R *.*.z.a !+a 5+}.}.0 w+g p.g h+h+h+h+H h+h+H H H s.s.s.s.s.s.s.#+H H L.s.#+X f o o a+#+9+C.9+#+A+>.{ -.q+&.c.k+1 p.C.p.Y.Y.Y.Y.Y.Y.g Y.L.L.Y.L.C.C.C.p.C.,+w+p.C.p.p.L.p.H B B q.4+q.4+X.B.)+q.)+q.q.X.q.q.4+q.q.4+q.4+4+4+4+B 4+4+4+4+B B B B B B B B B N.B B B B B B B B B B B B 4+B B B B N.N.B B N.N.N.N.N.N.p.N.z+p.*. +0 e U.g+|.&+t+. . . . . . . . . . . ", "9.u u u 1.1.u 1.u u 1.u u u u u u 9.u 9.u u 9.u u u 9.u u u u u 1.u u -.1.1.1.1.1.1.1.1.1.1.1.1.1.1.-.-.1.-.-.-.-.-.{ q+4.) ) 4.4.) ) `.`.-+4.4.4.4.) ) 4.4.`.&.&.`.-+9 G+^.7.D 6 J.b+8.++o+( 8.J.b+k+B '+s.H H '+L.h+h+2.2.)+a+a+a+H h+Y.Y.Y.p.H '+q.:.Z L.h+L.'+Y.Y.C.Y.h+'+h+L.g g Y.Y.'+2.^.H h+L.L.h+H h+h+H h+'+* h+* h+'+'+'+'+'+'+'+* '+'+'+'+'+'+` '+R.^.2.2.r+r+C+A+J.J.J.n ++r+i ++7._.i ++_.r+i i i i ++++A+3+8.3+_.A+A+_.8.G W k+k+#.#.#.#.i.o )+^.R.3.3.S.! o o S.3.f 3.3.S.3.G+! ]+@.G+G+G+]+G ; G G S.3.S.3.3.! o o ^.o o ! ! o 2.! R.! S.S.S.3.3.3.f E+f f E+f f b E+f b z.z.z.f G+G _.@.E+]+_._.]+M.a+A+>.4.9 G 2 a a n.D 9 D ]+w '+f G+_._.o M.M.'+'+H h+h+H L.'+'+H H s.#+z+E+5 P.5 P.1 b +o.y+,+Y.g p.h+h+H h+H L.h+L.h+h+h+h+h+H H h+h+s.H s.H H s.#+! _.o f X L.9+C.y.X.*+E A !.!.!.x.D 1 p.,.,.,.,.Y.Y.p.g Y.L.Y.L.g Y.Y.p.C.,.p.C.p.C.C.C.p.p.p.p.p.N.B 4+q.q.q.X.q.q.X.q.q.q.q.4+4+4+q.4+4+4+4+4+B 4+X.4+4+4+B B B B B B B B B B B B B B B B B 4+B B B B B B N.B N.N.N.N.N.N.N.z+N.N.n+N.p.p. +t.}.<+U.g+|.0.. . . . . . . . . . . . ", "u 9.u u u u u u 1.1.1.u u u u u u u 9.u 9.u u u 1.9.u 9.9.9.u u u 1.1.u 1.1.1.1.1.1.1.1.1.-.-.-.-.-.-.1.1.1.-.-.-.q+-.4.4.-+-+) ) `.-+&.&.&.`.4.4.) `.) -+) ) `.) `.&.(+P.N.B.u.(+G+)+7.++b+D H+J.o+++G+)+4+L.4+#+'+H h+q.A+C+C+B.C+)+N.H q.4+'+L.L.L.2.}+Y.Y.* H L.p.g Y.L.h+L.h+Y.Y.Y.L.L.L.h+H L.h+'+H h+h+H * H H h+h+H '+h+* h+* * * '+* '+'+'+'+'+'+'+'+'+2.2.2.^.2.B.++7.J.;+7.7.++i i 7.7.7.C+r+r+B.r+i i i ++i _.3+_.A+_.< 5.9 9 9 i+D 8._.#.o )+.+^.a+H+f E+s.E+f S.S.}+s.H E+3.f f 3.f f 3.@.G+1 c+G+1 @.@.3.3.3.a+3.S.S.! R.! o R.! ! R.! ! o ! ! ! ! S.S.3.H+3.3.3.f E+w b w f E+5 f @.3.f 5 3._.3+o R.M.f 3+>.z W C > S S T W 9 &.8.f s.3.o _._.! '+'+'+'+* '+'+H '+H s.'+'+s.w .+k+i.6 6 ++G.A+b 0 l+p.H h+H h+h+H L.L.h+L.h+L.L.H h+s.H H H H h+H H H M.s.f G _.Z }+s.L.L./+t.y.P.6 (+>+z N u.:.4+L.C.,.p.Y.Y.Y.Y.Y.C.g Y.Y.Y.Y.Y.g p.g Y.Y.p.Y.Y.C.C./+/+,.p.p.N.N.B 4+4+q.4+4+q.4+4+X.4+)+q.q.4+q.4+4+4+4+4+4+4+4+B B B B B '+B N.B B B B B B B B B B B B B B B B N.B B N.B B N.N.N.N.N.N.p.N.!+p.n+[+p.Q.o.g.r.g+B+&+. . . . . . . . . . . . ", "u 9.u u 1.1.u 1.1.1.1.u 9.u u u u u 9.u u u u u u u u u u 9.u u u 1.1.-.1.u 1.u u 1.1.-.u 1.u u 1.1.-.-.1.-.-.-.-.-.-.-.q+&.&.&.&.&.) 4.&.9 z -+) 4.`.) `.`.) `.&.&.&.9 D ]+2.u.9 D 8.B.7.++G.b+o+>+>+++G+w H '+4+}+H H q.G.X.2.G.D D k+^.4+L.L.Y.L.L.'+p.Y.Y.H '+L.Y.g Y.Y.g p.Y.g L.L.g H L.L.g 2.4+H L.g L.H h+h+h+h+L.L.h+L.h+h+h+H h+H * * * * '+* * '+'+'+4+2.2.)+^.2.^.B.i J.r+i B.B.o 2.o r+o B.r+B.r+r+r+i ++4 i _.++A+< i+4.1.u u u 1.q+9 D _.i.a+H+P.b b b b b b w E+w b X m.#+w w E+E+E+f f 3.f f 3.@.3.@.f H.}+! #.++A+_._.! ! 3.a+R.! R.! ! ! ! ! ]+]+o o ! ! S.@.@.f f E+E+f E+E+5 f 1 G+]+G _._.]+3.M.f #.n 5.n.6+0+0+0+6+~ 9 &.(+1 X G+A+3+#.3.3.'+'+'+'+'+'+* '+'+'+s.'+H s.^.r+C+++b+o+= = J.y.,+Y.H h+H H h+* L.H H h+h+h+H L.L.h+L.L.h+H h+L.'+H s.#+E+#._.]+f s.H #+/+Q. +y.a a !+!+1 1 4+#+p.C.C.,.,.,.,.,.,.p.C.,.Y.Y.Y.p.Y.p.Y.C.Y.Y.C.Y.C.w+w+e+t.l+/+p.p.p.B B 4+4+4+q.q.4+q.4+4+)+X.4+q.4+q.4+X.4+4+4+4+q.B B B N.B B N.B B '+B B B B B B B 4+N.B N.N.B N.N.N.N.N.N.N.N.N.N.N.N.!+p.p.p.y.[+t.Q.s U.r.|.B+0.. . . . . . . . . . . . ", "u u u u 1.1.u u 1.1.1.!.u 9.u u u u u 9.9.u 1.u u u u 9.9.9.u 1.1.u 1.u 1.1.1.1.1.u u u 1.1.1.1.1.1.-.-.-.1.4.-.-.-.q+q+-.) `.`.9 9 z 9 9 z `.4.4.`.) `.`.4.4.) &.&.9 9 9 D f+z &.9 D H+.+4+J.J.b+o+9 ( D i.a+'+q.r+.+'+i A+H+q.++G.o+b+i.H p.Y.p.g Y.'+g '+L.4+2.p.H Y.L.Y.Y.Y.Y.Y.Y.g Y.L.L.Y.* q.N.Y.g L.L.g L.L.L.L.h+h+L.h+* H L.* H * h+H h+H h+H '+a+^.R.q.)+^.^.)+^.2.^.2.B.2.^.R.R.^.)+^.2.B.r+r+r+2.r+C+i 7.C+C+i ++_.D ) 1.1.u u u u 9.u -+>+#.H+E+z+n+n+y.y.y.M z.R b R n+R m.R #+X #+X s.E+E+E+E+E+f E+f s.f X.< u.-+x.E E u.A+^.3.f 3.S.a+! ^.! ! o o ]+]+]+! ]+! ! ]+@.3.S.f S.]+]+]+o o o i _.r+R.a+}+S.G < _.6 ^ 2 r r r 6 c 9 < ]+s.G < 8.o R.'+a+'+'+'+'+'+'+'+'+'+'+}+}+}+a+.+Z A+;+b+p+a.;+N.p.H * H * H H h+* H H L.h+L.H h+h+L.L.L.L.L.L.L.L.L.h+X ! _._.! E+#+H X [+_ *.e.1+e.1+1+5+Q. +p.#+L.Y.p.p.,.,.,.,.7+w+,.p.,.,.,.,.C.,.Y.Y.,.Y.C.,./+e+e+y+y+}.e+/+p.p.p.N.B B 4+4+q.4+q.4+q.q.q.4+q.4+q.q.q.4+q.q.B q.B B '+H B B * B B B B N.B B B B N.B B B B N.N.N.N.H N.N.N.N.N.p.N.p.N.p.N.p.p. +t.}.y+U.g+g+&+Q . . . . . . . . . . . . ", "u u u u u 1.u u 1.u 1.1.u u u u 9.9.u 9.u u 9.u u 9.u u 9.9.u 1.u 1.1.1.1.1.1.1.1.1.u 1.1.1.u u 1.-.1.-.-.-.-.-.-.{ 4.4.4.&.i+D f+>+>+9 f+f+z -+4.4.) `.`.) -+) &.9 D o+9 (+D f+9 z &.D i.B ^.B.J.( >+9 9 (+^.C+@.a+B 4+4+4+H ^.^.^.A+)+4+^.H H H p.h+4+L.H h+h+Y.Y.Y.h+4+p.g p.Y.Y.Y.p.h+h+g p.g L.Y.Y.Y.g Y.L.* '+'+h+L.g L.L.g h+g L.L.L.h+L.h+h+h+h+4+R.^.^.R.2.2.2.)+2.2.)+^.2.2.4+a+a+R.R.^.o 2.o B.r+#.r+r+r+i i r+++r+++( 4.1.1.u u u 9.u 1.4.z 8.1 z+a a *.M *.*.1+*.*.R y.y.y.R [+y.9+R R X R X X X X #+#+s.w @.8.u.A 8 9.9.9.u x.3+}+H s.3.a+3.a+S..+G+! ! ! ! ! ! ! ! ! ! ! ! o ]+o #.G #._.G o o ! S.a+#.n >+( D G c+5 E+H+1 G 8.< W @.G+_.< _.! R.a+'+'+'+'+'+'+'+B }+a+'+a+4+@.a+H.Z _.C+X.)+i q.N.C.L.* H * H * H h+'+h+H H L.H L.h+H h+L.L.L.L.h+h+#+s.X o _.G S.s.#+#+9+M z.2 y._ *.y.*.$.Q.t.C.p.H h+L.Y.p.C.w+,.w+w+,./+w+w+,.,.w+,.,.w+,.7+w+,.e+0 y+g.g.2+g.y+y+t.p.p.p.p.B B 4+4+q.X.q.q.q.q.)+q.X.4+q.4+4+B q.B B B B B '+N.B B '+B B B B B '+B N.N.B N.N.N.N.N.N.N.H N.N.p.N.N.N.p.N.p.n+y.[+t.5+}.<+U.g+|.q 0.. . . . . . . . . . . . ", "u u u u 1.1.u 1.1.u -.1.1.u u u 9.u 9.9.9.9.u u 9.u u u 9.u u 1.u 1.-.1.-.u 1.u u u u u u 1.1.u 1.1.-.1.-.-.-.1.-.q+-.q+4.4.) &.D f+z -+&.9 &.4.4.4.) 4.4.) `.) `.( _.++b+D ( f+( ( 9 >+Z 4+A+X.2.J.i G.f+8.H+B.2.! )+a+a+^.a+4+S.N.h+'+q.q.B.q.H '+7.)+Y.L.Y.g h+L.Y.Y.h+H ,.Y.,.p.g Y.Y.p.g L.Y.L.g p.Y.Y.Y.h+'+'+'+'+'+L.g L.Y.g g h+* h+g g g g L.h+R.^.^.2.! R.'+a+a+'+a+^.q.^.^.R.` '+a+a+R.q.^.2.r+r+r+#.B.r+i _.i i ++A+( { { 1.1.u u -.-.4.-+f+b+1 z+n+*.*.1+1+$. +1+1+ + +_ y.y.R *.y.[+[+[+R R R R m.m.#+#+H.)+n >.E 8 !.9.9.9.9.z @.#+s.a+.+#._.A+b+< ++]+S.a+a+G+S.! 3.! ! ]+o #.#.o o o o ! ! S.S.a+]+n z { 4.( j+6 c+c+c+c+6 6 6 ]+1 ]+< < _.! a+'+'+` '+'+'+'+'+'+a+a+4+^.)+i.)+Z W _.G n+5+/+p.p.L.h+g H H * H * h+H H h+h+h+L.h+L.L.L.L.L.L.L.L.L.L.X E+G W 6 H+#+X R w ++G.#.z.& Q.y.B #+w n+X H H H '+H h+L.p.p.,.w+,.w+w+/+w+7+7+e+7+7+l+7+e+e+e+<+U.K r.{.r.| g.g.}.e+t.p.p.N.B B 4+4+4+X.q.X.q.4+q.q.4+q.q.q.B q.B '+B N.N.'+B B B N.B B B N.N.N.B N.N.N.N.N.N.H N.N.H N.N.N.N.N.p.N.p.!+p.p.p.t.Q.0 <+| g+g+|.Q . . . . . . . . . . . . ", "u u u u u u 1.1.1.u 1.1.1.1.1.1.9.u u 1.u u u u 9.u u u u u u 1.u 1.-.1.1.u 1.1.1.u u 1.u 1.1.1.1.1.-.1.-.4.-.-.-.4.{ 4.4.4.4.) c.D f+&.&.`.`.4.4.4.`.) q+) ) 4.`.c G #+f.f+D (+)+7.G.n Z ^.7.G+a+)+}+i J.n G.D G.8.@.7.++@.H q.3+H.H '+'+2.B.2.B.A+D X.H L.Y.p.Y.Y.Y.,.Y.h+H g Y.p.Y.Y.'+H L.p.g Y.Y.g p.Y.Y.g * '+4+'+L.p.g H L.H L.'+4+'+H Y.Y.g h+h+4+R.^.2.^.^.a+* '+'+'+a+R.R.4+'+'+'+` 4+4+R.R.2.o #.i i #.r+i i ++i r+A+( -+{ 1.{ `.i+c.c.D D c.6 P.a a *.*.$.$.$.$.$.$.$.$.$.$.$.[+ +y.y._ [+[+*.y.y._ [+9+R E+i.3+( f+f+&.1.9.9.9.x.)+n+w ^.++o+u.z E { { &.(+B.a+3.3.S.S.S.! ! ]+o o o ! R.R.3.R.a+a+a+++z 8 !.1.&.j+6 c+c+G+c+(.6 W G G W W _.]+a+a+'+'+'+` '+a+'+'+4+'+R.2.b+f+z 9 9 9 D 8.E+,+w+C.g L.H * h+H * h+H L.h+H L.L.H L.L.h+L.L.L.g L.L.L.H #+#+G+8._.G 5 E+S.G+o :.b.4 P.Q.Q.R i 2.4+s.s.}+3.}+S.}+}+}+#+m.m.p.C.C.C.w+w+w+w+7+7+l+e+7+e+e+y+3 r.r.] |.] l.F.r.2+g.y+y+e+/+p.p.p.N.B B B B q.4+4+q.4+4+4+q.B B B '+B B B B B B B B B B B B B N.H B N.H N.N.N.N.N.p.N.N.p.N.p.N.p.N.p.p.p.p.*.[+}.0 s U.r.l.k.B+Q . . . . . . . . . . . ", "u 1.u u u u u u u u u 1.1.-.1.1.-.1.-.-.u u -.u u u 9.u u 1.u 1.1.1.1.u 1.1.1.1.u u 1.u 1.1.-.1.1.1.1.-.-.-.-.-.-.-.) ) ) 4.q+-.) 9 `.-+i+( z &.`.4.4.) ) ) &.) 4.`.c+N.i >.D Z w H R.2.)+.+E+H H a+'+'+.+.+r+#.X.a+B R.a+H '+'+H '+'+L.4+^.4+C+b+G.o+b+.+H Y.Y.Y.g p.Y.Y.* H Y.Y.4+'+,.L.g L.g Y.Y.,.,.Y.Y.Y.p.,.p.g p.g g p.g L.L.'+q.4+'+H Y.g Y.Y.'+a+4+R.q.R.a+a+a+a+q.q.^.a+a+'+'+* '+a+'+R.a+R.^.2.o r+r+i #.#.r+i C+_.++D u.-+4.9 W ; (.(.(.6 c+P.!+a a e.e.1+e.5+$.& 5+5+5+& $.$.$.$.& $.1+$. +t.$. +[+_ *.n+b )+k+k+6 X.6 o+1.!.!.E X.9+w B.n >.E 8 9.9.9.9.-.D B.}+3.a+R.! a+3.! R.! R.R.R.a+a+a+a+'+@._.z A !.1.&.8.6 6 c+c+6 W D ( ( 5.< < _.! a+` '+'+'+'+'+4+` '+4+a+4+++:+x.8 9.9.u -.( C+'+L.h+L.h+h+h+h+* H h+'+H h+H L.L.L.h+L.Y.g L.L.Y.h+L.L.L.X X G < W ]+E+@.! o S.o 2.a+k *.y.}+2.a+a+N.s.f E+S.S.G+G+G+@.1 f w #+p.p.p.C.w+,+w+w+w+7+e+e+y+y+l r.[.|.q B+q 7 @ r.r.2+g.y+}.e+t.,.p.p.p.p.N.p.N.B N.B B N.B B q.B '+B B '+q.B B B q.B B N.H N.N.'+H N.N.N.N.H N.N.p.N.N.N.N.N.N.!+p.N.p.!+p.p.[+/+}.y+g.| g+g+|.B+q 0.0.. . . . . . . . ", "u u u 1.1.u u u 1.u u u u u u u u u u u u u 1.u 9.u u u 1.u 1.1.1.1.u u 1.u u u 1.u u 1.1.1.-.-.-.-.1.-.-.-.-.-.-.4.`.`.-+-+&.&.) 4.4.`.9 9 z -+`.4.4.) ) `.&.`.-+) 9 G 4+*+D E+L.L.H 2.^.a+}+'+4+N.a+^.4+^..+4+.+^.)+)+.+'+w H H H H h+q.C+B 4+7.D b+J.++B.^.N.p.g Y.p.Y.Y.p.Y.Y.,.Y.Y.p.Y.Y.p.Y.Y.Y.Y.Y.Y.g Y.Y.,.Y.,.L.h+L.h+H H '+4+'+B '+Y.p.g Y.H h+H h+'+'+h+h+'+R.^.)+2.^.a+h+'+'+'+'+'+` a+a+R.2.o r+r+i i r+r+i C+r+C+8.D >+>+8.6 6 X.1 P.P.P.z+z.M M e.e.1+e.5+1+1+e.& & & 5+& Q.$.& $.$.$.$.$.t.$. + +$. +M H.H+!+a M a 1 D E E o+H+m.H.B.J.:+E ~.9.9.9.9.9.1.*+! R.S.a+S.a+a+R.R.R.S.a+a+R.* a+'+a+}+B.n >.E 9 (+6 c+c+6 6 6 D &.{ -+z (+_.o a+'+'+'+'+'+'+'+'+'+4+'+'+@.++f+E 8 !.9.9.!.E b+.+* * * H '+* H * * H '+'+H '+'+H H h+H L.L.L.h+Y.L.L.L.L.- E+G _.G ]+5 o G o S.#+y.[+/+#+'+'+'+'+H m.#+#+w w E+f @.1 H+1 @.@.H+E+E+w #+m.p.,+p.C.C.w+l+e+<+U.m+|.q 0.. . 0.Q 7 ] l.r.{.2+g.y+}.e+e+7+/+p.,.p.p.p.p.p.H H H H * H '+'+B '+q.B B B B '+B B '+N.N.N.H H N.N.N.H N.N.N.p.N.N.p.N.p.p.N.p.p.p.p. +t.e+}.y+<+| l.g+7 |.7 q 0.0.0.. . . . . ", "1.u 1.u 1.u 1.u u u u u 1.u 1.1.u u u u 1.-.1.u 9.u u u u 1.1.1.1.-.1.u u 1.u u u 1.u 1.u 1.1.-.-.-.-.1.-.-.-.-.-.q+4.&.&.`.&.9 z -+4.4.4.`.&.) `.4.4.4.`.&.&.&.&.) 9 W b+o+D @.2.a+'+a+S.'+2.a+#+R.q.#.E+a+^.^.a+)+#..+2.i.)+4+w '+'+4+4+a+'+4+4+^.4+B q.A+C+q.4+H * p.g p.L.p.p.Y.Y.,.Y.Y.,.g Y.,.p.,.g ,.,.g ,.Y.p.Y.g p.* '+N.N.H..+w m.p.p.C.C.p.L.p.g Y.Y.Y.Y.Y.L.h+a+q.R.a+H '+'+'+R.` q.4+a+R.4+R.2.o r+i i _.r+r+i i ++_.A+8.8.k+c+1 1 5 5 b 2 z+a M M M e.1+1+e.$.e.$.5+5+& t.t.$.t.t.5+t.& 5+$.5+5+$.$. + +1+*.M *.M 1+e.M P.C+8.i.z+n+H+G+++b+D f+E 9.9.9.9.8 :+B.! ^.o ! ! ! ! S.R.R.R.'+a+'+'+'+s.L.b G+#.W 6 2 a 2 5 ^ n.W ( { 8 { z < #.G+a+'+'+'+'+'+'+'+'+a+'+a+a+^.i o+E { !.9.9.A >.;+^.* h+g * H h+'+'+'+'+4+a+^.]+i.]+G+.+}+N.h+H Y.Y.g Y.g - k f G G G 1 f G o ]+}+X 9+,+,+L.'+* L.[+9+m.9+#+X X X b z.E+5 H+5 1 5 H+H+E+H+H+H.H.#+z+p.,+/+0 y+l g+|.q . . . . . . 0.Q B+7 l.r.| 2+g.g.g.y+y+y+y+e+}.e+t./+7+p.p.p.p.H H N.'+N.'+q.B B '+B B N.N.'+N.N.N.N.H N.N.N.H N.H N.N.N.N.N.N.p.!+p.p.p.[+/+t.y+y+<+2+r.r.r.g+|.] |.B+q q Q 0.0.. ", "1.u u u u !.1.u u u !.u u u u 1.u u 1.1.u 1.u 9.9.u u u u u 1.1.u 1.u 1.u u u u u u u 1.1.1.1.1.-.-.-.-.-.-.4.-.-.-.4.&.&.&.&.`.9 `.4.4.) `.-+4.) q+4.4.&.z z &.&.) &.>+D D A+_.a+a+4+)+N.'+4+2.#.H.a+'+Y.h+s.4+a+2.B.B ^.B.C+B.)+B a+4+^.B.H R.)+^.}+H '+4+^.^.'+H H L.H Y.L.g H Y.Y.p.,.Y.p.,.Y.Y.Y.,.Y.Y.p.Y.Y.L.,.p.L.p.H N.b e.+.w.O O O o.I.$.I.O Q.C.p.Y.Y.Y.g Y.g L.Y.L.h+h+* '+a+4+q.q.q.R.R..+R.^.2.o r+i i _.r+r+i r+k+k+6 6 6 n.^ 1 5 !+b z+a M M *.*.*.e.e.e.e.e.a e.e.$.& & & $.$.$. +$.$. +$.1+1+1+$.1+$.e.$.1+1+5+1+1+*.M M M M n+b P.G+1 1 6 b+&.!.9.!.x.n o R.S.! ! ! ! ! ! ]+! o R.a+a+}+}+#+,+t.+.I.+.<.6+6+}.& T a n.D -+A E ( k+S.B '+'+'+'+'+'+* '+H '+'+N.a+i.++b+f+z -+{ 4.E o+++B * h+H g * H h+* '+'+4+++o+z `.`.E 9 5.G S.'+H L.L.Y.L.#+R G+_.G ]+5 @.G ]+G+E+L.L.L.L.L.H H H p.9+L.#+L.#+#+z.w b H+1 @.5 1 5 E+E+5 E+E+f E+H+H+S.H.#+[+I.<+ .B+0.. . . . . . . . 0.Q q 7 ] l.l.| {.| 2+2+2+g.g.y+g.}.e+e+e+/+/+p.p.p.p.p.p.H H '+'+H '+B '+B '+B N.H N.'+N.N.N.H p.N.p.N.p.N.N.N.p.N.p.p.p.t./+}.e+y+<+2+K | r.l.g+g+l.[.|.7 7 q q ", "u u u u u 1.u u u u u u u u u u 1.1.1.u 1.1.1.u u 9.u u u 1.u u u u 1.1.u u u u u u u u u 1.1.1.1.1.1.1.1.-.-.-.1.-.-.) `.&.9 z `.`.`.&.9 z -+4.-.4.q+&.9 D >+z -+&.-+9 k+! B.B..+R.;+_.w '+2.2.'+h+4+s.w H L.'+H a+^.! #+'+R.2.! ^.4+a+a+H '+q.4+B N.'+4+4+N.h+p.g h+'+'+'+H Y.p.g p.g Y.Y.p.g Y.Y.,.Y.p.L.,.p.Y.H 4+4+H H z.a C C +.6+> > <.6+> <.6+w.w. +C.,.,.,.Y.,.Y.Y.g L.h+h+'+* '+R.R.R.2.2.2.^.R.2.2.o r+i i 4 7.r+r+C+#.k+6 c+1 1 1 5 5 5 b a z+a a *.a *.*.y.a M a e.a e.e.$.& 5+& $.$.*.e.e.1+1+$.1+5+1+$.$.5+$. +5+1+5+1+ +*.1+*.*.[+1+n+M M M !+1 k+f+E E o+)+H+}+3.3.S.S.3.! S.S.! ! ! 2.#.B..+E+'.w.K.~+T.T.0+~+~+> e <.e.6 n ( :+8.G+N.s.'+'+H * H * H '+'+'+'+'+)+A+D f+9 9 9 9 9 D ++4+H H g Y.* Y.h+* h+h+3.7.E.x.~.{ { -+-+= z n i.'+h+h+L.- R X ]+G o 1 E+S.]+S.3.s.L.L.L.L.h+L.H #+#+L.#+- w E+1 G+c+]+]+G+1 f 5 E+E+b b b 5 5 H+E+5 5 E+b _ Q.e | |.0.. . . . . . . . . . . . 0.Q 7 7 7 ] l.l.@ r.r.r.2+g.| g.y+y+y+}.e+e+t.,.p.p.p.p.p.H H H N.H H H B N.N.N.H N.N.N.N.N.N.p.N.N.p.N.p.p.!+p.p.p./+/+}.e+y+y+3 2+g.U.U.r.r.r.m+g+[.} |.", "u u u u u u 1.1.u u u u u u u u u u u u u u u u u u u u u u 1.u u u u 1.u u u u u u u 1.-.1.1.-.-.1.1.1.1.-.-.-.1.1.-.4.) &.9 ( f+z `.`.&.&.-+`.4.{ 4.`.9 (+G.u.z &.) 9 8.#.a+4+}+s.4+r+E+h+}+#+4+'+s.L.'+}+'+H '+^.}+s.L.L.L.H s..+^.a+'+}+B '+'+4+4+4+4+'+h+L.Y.p.Y.Y.H H '+'+L.Y.p.Y.Y.Y.p.,.Y.Y.p.Y.,.Y.q.q.p.g * '+B 5 & C C C 6+> > 6+C C 6++.6+S <.O t.C.Y.Y.Y.,.Y.Y.g g L.h+'+h+'+'+a+a+R.! o 2.^.R.8+^.B.r+r+_.i _.i #.#.k+Z G+c+1 1 5 5 !+z+z+M a a *.*.a a a a n+z+a M M e.$.$.& $.$.1+*.*.y.*.e.e.e.$.$.1+$.1+5+1+5+1+5+5+5+5+5+ +1+1+1+1+ +1+*.M b !+1 k+6 X.N.z+#+w w w E+E+f H+H+3.3.! #.n E.A+P.t.|+|.B+t+t+t+t+D+&+T.~+> & P.i.)+P.#+L.h+* * L.H H * h+N.H H N.a+C+:+E x.1.-.q+&.>+8.X.N.p.Y.g H g * Y.H * H a+3+u.E -+( ( 5.5.9 z u.n ! H h+L.h+#+E+]+G ]+1 f ]+o S.E+- L.9+L.Y.L.L.L.L.#+w H+H+G+]+]+]+c+c+G+f 5 E+5 b z.R z.X 5 5 H+H+5 H+5 z._ Q.D.: [.0.. . . . . . . . . . . . . . . 0.0.0.0.B+q B+7 7 ] l.r.r.r.| 2+p g.}.y+}.e+e+7+p.7+p.p.p.p.p.p.p.H p.N.H H N.N.N.N.N.N.N.p.N.p.N.p.p.p.p.p.p. +p.t.e+}.e+}.y+y+g.y+2+3 | | {.| l.g+", "u u u u u u 1.1.u u u u u u u u u u u u u u 9.9.9.9.u u u 1.1.u u u u u -.u 1.1.1.u 1.-.1.1.1.u u -.1.1.1.u 1.-.-.-.-.4.&.9 ( i+( ( z 9 D z &.&.-+-+4.q+&.D ++G.z -+`.>+i.++#.H+s.H L.:.++.+a+h+2.w H C.Y.H L.'+s.L.L.9+Y.H L.H 2.3.'+'+H H s.B H H R.r+^.4+B H p.Y.p.g p.Y.'+B '+* H p.Y.Y.Y.Y.Y.p.Y.H p.Y.'+p.,.p.H #+b <.6+w.C 6+> > > C 6+<.6+T 6+> w.6+I.p.,.,.g ,.Y.C.Y.Y.h+'+H #+L.L.'+a+R.2.2.o )+a+R.8+2.o r+_.r+i r+#.B.Z c+6 n.n.1 5 b z+z+z+M y.a a a a z.z+n+z.z.n+a M e.$.5+5+1+$.$.a a *.a M *.*.e.5+$.5+5+e.5+e.1+e. +t. +5+$.5+5+5+ + + +1+e.M M M a n+y.M n+M R R R R R z+b E+E+E+1 A+*+*+D H+I.|+~+0.. . t+t+t+t+t+t+&+: D.I.Q. +[+9+L.L.L.'+h+H L.H h+s.s.h+}+#.n u.x.8 !.!.{ u.8..+m.L.H g g h+h+h+h+L.s.3._.n E.5.W ^ r 2 6 E.u.*+i '+L.s.s.X G+G o ]+f 5 o ! S.M.#+9+L.m.C.#+#+w H+@.G+]+G+! 1 @.@.@.@.E+E+X R R R X X k R X E+E+E+f E+E+z.$.w.2+g+&+0.. . . . . . . . . . . . . . . . 0.0.. 0.. . 0.0.. 0.q 7 |.] g+r.r.r.2+g.g.g.g.y+y+}.}.e+t.e+/+,.p.p.p.p.p.p.N.p.p.p.p.N.N.p.N.p.N.N.!+p.p.p.t.p./+p./+e+t.e+e+}.y+}.y+y+y+<+U.U.l ", "u u u u u u u u u u u u u u u u u 1.u u 1.1.u u u 9.9.u u u u u 1.u u u u u 1.1.u u 1.-.1.1.1.1.u 1.u 1.1.1.-.-.4.-.-.q+&.9 &.&.9 9 z i+]+r+2.^.! 3+N q+) &.W C+:+o+9 < ! J.f+8.G.D k+i n H.s.L.'+H '+H h+s.C.h+h+L.h+H h+s.H L.H 9+L.4+q..+a+2.#+'+H '+#+L.H L.g H p.L.Y.p.p.Y.Y.Y.'+* H ,.p.g Y.g H h+p.Y.,.H p.Y.L.m.e.S S > 6+> > > > > C C C <.<.> 6+> O C.Y.,.Y.Y.g Y.g Y.L.'+r+i.- 9+L.s.R.2.o 2.q.R.R.q.2.++r+r+#.#.#.G Z 6 G+(.c+n.1 5 5 z.z.z+z+a z+n+z+n+z+a 2 z+!+z.a M e.$.$.5+e.e.e.a a a a e.1+1+e.$.e.1+e.e.1+e.e.1+1+5+$.5+& $.t.5+5+$. + +5+ +1+1+*.1+ + +*.[+[+*.*.M y.R a n+#+z+w #.b+n 3+5 I.|+: B+0.. . . . . . . t+D+[.K.x+0 C.L.s.H L.H h+h+L.L.h+H H #+#+4+r+*+u.E ~.A E u.(+X.N.H h+* H h+* H * h+H 3.o 3+3+]+r 6+~+S <.~ Y 3+o a+L.L.s.E+]+#.]+]+f 3.]+]+3.w - 9+#+E+E+S.S.G+S.G+S.! @.@.1 H+E+b w X R R 9+R R R R k R R X w E+E+5 E+y.& O |+: B+. . . . . . . . . . . . . . . . . . . . . . . . . 0.. . . 0.Q Q 7 7 ] l.m+r.| | U.2+<+g.y+}.y+}.}.e+e+/+p./+p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.!+p.p.p.p.p.t.p.t.p.e+/+t.e+t.}.e+y+y+g.g.", "u u u 9.u u u u u 9.u u u u u u u u u u u u u u 9.u u u u u u 1.1.u u u u u u u 1.1.u u 1.1.1.1.1.u u 1.1.-.q+4.-.4.-.q+4.) &.D 8.++( z Z a+2.B.i B.:+`.4.`.>+D < < :+( 6 J.f+D b+b+++B.B.A+.+a+L.'+^.a+a+H ^.a+H L.q.s.H L.Y.'+#+L.h+'+^.r+R p.Y.C.H r+p.p.L.'+N.'+B '+'+H h+p.p.Y.p.p.,.Y.Y.p.,.p.g p.g p.Y.Y.,.Y.- _ <.S S |+6+> > <.6+6+C C C C 6+6+> 6+e +H L.,.,.Y.p.Y.L.Y.'+4+a+9+L.s.'+3.^.o o q.a+R.R.q.2.r+#.B.#.k+B.Z Z 6 c+c+1 5 5 b z+2 a z+a z+z.z+z.z+z+z+2 z+z+n+M M 1+5+$.$.e.M a n+a a M *.1+1+e.e.M *.*.*.e.1+e.1+1+1+$. +5+& & 5+5+ +$. +5+5+5+ +5+$.$.& $.$. +1+1+*.[+y.M n+n+z+1 #.++X.a w.x+S : k.&+0.t+. . . . . q |. .x+t.#+'+H H L.L.H L.H s.H L.L.9+9+y.b X.8.o+f+f+f+f+u.G.X.H H * * '+* * H h+M.s.3.! ]+G+5 r r C $.1 _.i 2.3.X s.X 3.o G ]+3.5 ! o ! 3.w #+f S.a+! S.S.! G+S.@.f H+f E+w X R 9+k 9+,.9+C.9+9+9+9+C.k R k R R k R _ w.D.r.|.&+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0.0.0.0.Q B+7 ] l.l.m+r.{.| 2+2+2+y+g.g.y+y+y+}.e+}.t.}.t./+t.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.t.p.p.p.[+p./+t.t.t.0 o.o.", "u u 1.u u u u u u u 9.u u u u u u u u u u u u u 9.u u u u u u u u u 9.u u u u u 1.1.1.1.1.1.1.1.1.u u u 1.1.-.4.-.4.-.q+-.4.) `.4.&.i+D G a+R..+2.G.>+f+`.`.9 i+8.b+G.f+i+b+o+D G k+)+2.! a+q.'+'+2.J.)+f L.h+#+C.C.C.h+'+L.Y.Y.,.C.C.Y.H C.C.C.C.Y.h+'+C.,.p.Y.L.H '+B 4+'+'+'+H H p.L.p.Y.Y.p.,.p.,.,.,.,.p.,.p.L.[+D.> S S > > > > 6+<.6+C r C C <.<.> 6+> +.#+H Y.Y.Y.Y.Y.Y.p.h+L.H h+H s.'+a+B.2.! q.a+q.q.2.2.2.2.2.B.Z B.Z Z G+c+c+1 5 5 b b b z+z+!+z+b 2 z+z+b b b 2 z+z+M e.1+e.5+e.y.M a z.a a *.*.e.1+*.*.e.*.e.M e.e.e.*. +$.e.& $. +$.1+$.$. +5+1+5+5+Q.5+5+t.$.5+$.$.$.& $. +[+*.y.y.n+z+H.P.n+5+I.w.x+|+K. .[.k.T.q D+Q Q B+[.K.0 S.B.r+'+'+s.h+'+h+L.L.H L.#+9+/+Q.}.w.5+M 1 i.++b.b.b.:.2.H '+'+* '+* '+'+s.M.s.f f f X z.X z.X f G+! 3.H.#+L.E+G+o o ]+3.1 ! ! 3.f M.3.a+! S.S.! 3.S.3.f f w w X X R 9+9+9+C.9+C.C.C.C.C.p.,+C.C.9+C.- 9+[+_ t.o.|+: B+0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0.0.. . 0.0.q B+B+7 g+@ l.r.r.| | 2+g.<+g.y+y+y+y+}.e+}.t.}.t.t.t.[+p. +p. +p.p.p.p.p.p.p.p.p.p.[+p.p.t.t.t.t.}.", "1.-.1.u u 9.9.9.9.u u 9.u u 9.u u u u u u u 9.u u u u u 9.u u u u u u u u u u u u 1.1.u -.1.u 1.1.1.1.1.u -.-.-.) -.4.-.-.4.4.`.`.`.&.9 (+Z J.n o+f+f+>+5.f+z z 9 D >+( 8.1 k+D b+k+2.b+G+R.a+^..+R.a+2.H.'+'+^.! m.Y.Y.Y.C.,.,.C.,.C.Y.Y.C.w+C.C.,.p.C.,.,.,.p.,.p.,.Y.H N.H '+'+q.'+H '+Y.H H g p.p.p.,.,.C.h+H #+$.].> S S > > > > <.C <.C r r C C <.6+<.C 6+}.p.p.,.,.p.C.L.L.Y.H h+s.L.h+'+a+a+^.q.a+R.a+R.q.^.^.)+)+)+i.Z X.Z 6 G+c+1 1 P.b b z+z+z.z+2 z+z+2 z+2 !+z+z+a a M a e.& e.*.a M M a a n+e.e.1+e.e.e.y.a a M M *.e.$.e.e.1+e.1+1+1+e.1+$.$.1+$.$.5+$.Q.5+& Q.& & Q.& 5+$.& $. +[+[+*.y.M M e.$.Q.I.o.D.D.|+|+K. .K.: : ~+ . .x+y.F Y ;+r+}+s.H H H H s.L.H L.,+'.w.x+x S W.e }.M )+7.:.7.q.q.4+'+* '+'+h+'+M.M.s.f E+E+f X E+E+E+f 3.}+H.s.s.s.f ]+G ]+]+3.3.! S.! f E+R.R.3.R.a+f }+}+w w #+#+#+#+m.L.L.L.9+p.C.C.,+C.,+C.,+C.,+9+C.C.,+9+C.'.0 D.r.g+B+0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0.0.0.0.. 0.0.q q 7 7 ] l.@ r.{.r.| | U.2+g.g.y+g.y+}.}.}.}.}.}.t.t.5+t.t.p.p.p.p.p.p.p.p.p.p.p.p.p./+t.", "u u u 9.u 1.u u 9.9.u 9.u u u 9.u 9.u u 9.u 9.u 9.u u u u u u u u 1.u u u u u 1.1.u 1.u 1.1.1.1.1.1.1.-.1.-.4.&.`.4.q+4.-.4.-.4.) ) ) `.9 D o+b+G.D u.f+D #.b+G.u.9 9 9 9 z >+(+++8.n ++i.s.a+r+N.a+'+a+'+L.'+'+s.C.,.,.,.C.C.,.,.,.C.C.C.C.C.Y.,+,.p.,.w+,.,.,.,.p.p.,.,.p.,.p.,.p.h+H '+B H H H L.,.p.p.L.H 4+a+C.O K.S S ~+> <.> > C C <.C C C r r C > <.> > O +p.,.,.,.Y.H H L.L.L.'+H s.'+^.^..+R.a+R.4+R.^.2.2.)+^.)+)+X.X.G+]+G+1 1 P.P.b b b !+z+z+z+z+z+z+z+z+2 a z+n+z.M e.e.$.e.*.a n+M n+a *.e.$.e.M M *.M M M *.a *.e.1+$.1+e.*.1+e.1+e.e.1+1+1+$. +5+5+& & & 5+& 5+5+Q.& $.5+$.$. + +*.*.*.*.1+$.Q.I.I.o.s O O D.x+|+|+|+K.|+L w.w :.Y ..7.a+H '+M.'+h+s.H #+L.,+/+Q.o.x+S S K.S e +4+2.2.^.^.q.4+N.* '+'+* H * h+X X b X w X E+w E+s.M.'+#+s.#+3.o G o ]+f ]+o 3.S.f 3.! R.3.f E+#+#+#+L.H #+L.L.L.H 9+L.Y.L.L.9+C.C.C.C.C.C.C.,+,+p.9+,+,+/+e+y+L .|.Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0.Q q q 7 |.] l.l.g+r.m+r.| K | g.3 g.y+y+}.}.e+e+}.t.}./+t.p. +p.p.p.p.p.p.p.y.[+[+", "u 9.u u u -.u 9.u 9.9.9.u u 9.u 9.u 9.u u 9.9.u u 9.u u u u u 1.u u u u u u u 1.1.u 1.u 1.1.1.1.-.1.-.1.-.-.-.&.&.{ -.-.4.4.4.4.4.) `.) ) 9 D 8.b+n n 8.3+J.o+o+9 z z &.`.&.>+G ++J.8.#.G+^.R.r+a+'+a+'+L.H * '+'+* H s.9+9+C.C.L.Y.g Y.H p.C.'+H ,.B w+,.l+,.7+,.,.,.,.,.,.,.,.,.,.,.p.,.p.H '+'+'+'+H H Y.Y.L.C.0 K.S S S S > C <.C C r C r r C r r r C > > > > I.p.H N.H '+4+H H '+L.L.h+s.}+a+S.R.4+a+a+R.R.R.)+^.o )+)+i.i.X.X.X.c+1 1 P.P.5 z+z.b !+b z+z+2 z+z+a a z.a a a *.*.e.e.*.M n+a z.a a *.1+1+1+e.e.*.M z+a a e.e.e.1+1+e.1+*.*.e.M *.*.*.1+e.5+$.& 5+& 5+5+$.5+$.5+& Q.& Q.t.$.$.1+ +1+[+e. + +$.t.t.Q.Q.0 I.I.o.w.O O w.w.o.Q.H.:.:.;+7.a+#+'+L.h+L.L.H L.#+C.,+$.& w.O e O O D.o.t.#+N.G+i.)+^.4+N.H * h+'+H s.* s.s.s.X s.h+s.s.s.w s.'+M.f G+G o ]+G+@.! ! ! S.f S.! 3.3.s.#+L.#+H L.L.L.L.L.L.Y.L.Y.#+L.C.p.p.p.C.C.C.C.,+p.C.C.,+,+/+/+0 y+U.g+|.q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0.Q Q 7 q 7 |.] g+l.l.r.{.| | p 2+g.g.g.y+y+}.}.}.}.t.t.t. +p.p.*.p.[+p./+", "9.9.1.1.u u u 9.u 9.u 9.u u 9.u 9.u 9.u u u 9.9.u u u 9.u u u u u u u u 1.1.1.-.1.u 1.1.1.1.-.1.-.1.-.-.-.4.) `.&.4.4.4.q+) ) 4.-+4.`.`.) ) &.D k+8.8.G+X.r+*+o+b+G.o+u.`.`.D k+D #.++C+.+a+^.2.S.R.'+X '+s.L.h+'+L.h+a+'+i #+H L.C.C.h+7.H C.C.p.'+2./+,.7+,.p.,.7+,.,.,.p.,.,./+p.,.Y.,.p.,.p.p.,.H H '+'+H L.9+D.S K.S S ~+> > C C C r r r C r r r r r h.=.=._+T *.B B N.'+a+a+'+4+'+H h+'+'+R.4+a+a+a+4+4+^.2.i ++++k+)+i.G+X.G+X.X.1 P.P.b H.b b z+z+5 z+z+z+a z+a a a M a a *.e.$.e.*.M M a n+z+*.e.1+5+ +*.e.*.*.a a a a e.e.$. +e.e.e.*.*.a e.e.e.1+1+5+$.5+5+& e.1+5+e.& $.& Q.5+& Q.5+ +1+ +e.$.$.$.$.5+Q.t.Q.5+t.Q.& I.Q.Q.I.I.I.Q./+#+B.F 7.^.B #+#+H L.H L.L.L.#+#+s.b n+*.e.$.1+ +Q.o.Q.C.#+3.r+#.o R.'+'+'+h+* L.H L.L.#+L.#+X #+#+s.H H s.s.E+f ]+_.G G ]+3.o ! ! 3.3.! ! 3.3.s.s.L.L.L.L.p.L.m.L.p.L.L.L.p.Y.L.Y.Y.C.p.C.p.C.C.,+,+C.C.,+[+/+[ <+r.l.q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0.0.Q Q B+7 7 ] g+l.r.{.| | 2+2+$+g.y+y+}.}.}.e+}.t. +t.t.t./+", "{ 1.1.9.u 9.9.9.9.9.u u u u u 9.u u u 9.u 9.u u 9.9.u u u u u u u u u u u -.1.u 1.1.u u u 1.-.-.-.-.1.1.-.-.-.&.&.{ -.4.&.&.( z ) ) `.&.&.&.) ) &.`.&.9 D k+n 8.B.J.*+f+z &.>+8.3+6 a+2.r+.+s.'+2.2.! '+^.s.L.Y.Y.L.L.L.Y.C.h+q.p.C.,.,.,.Y.L.C.C.Y.7+,.,.,.7+,.,.p.7+,.7+w+,.7+,.,.p.,.,.,.,.,.g p.C.Y.Y.L.h+#+_ S S S > S S > 6+C C r C C C r C r r r %+h h h V.2 1+P.4+'+4+'+a+a+'+a+H H H '+a+R.'+'+a+R.^.r+++J.;+G.J.++Z )+G+.+.+1 P.P.P.P.b b z+P.b z+b z+2 z+a a M a a *.e.e.*.e.e.e.M M n+a a *.e.1+$.1+e.e.a *.a a M M e.e.e.e.$.*.*.a *.M a *.1+e.$.$.5+& $.$.5+e.e.1+e.1+5+$.Q.5+5+t.5+$.5+5+1+1+t.5+$.$.& $.$.5+$.t.$.Q.& t.t.'.'.*.z+H .+.+H.b R #+m.L.9+p.9+9+#+H+! S.@.P.z+P.i.)+w [+/+,+R S.G #.o ! '+H '+'+H '+h+* H L.h+* H H h+L.'+H H s.s.3.G G G ]+1 ]+o ! ! @.S.! R.3.M.s.L.L.L.L.L.L.m.L.L.L.Y.p.Y.Y.L.C.p.C.Y.C.C.p.,+p.C.p.C.[+w+/+l+y+<+r.|.q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0.0.0.Q q q 7 7 7 ] l.l.r.r.| | U.g.g.g.}.y+}.}.t.}.Q.0 ", "{ 9.u 9.9.u 9.9.u 9.9.u u u u 9.9.u u u u 9.9.9.u u u 9.u u 9.u 9.u u u u u 1.1.u 1.u 1.1.u -.-.4.-.1.1.-.-.-.-+`.`.4.4.&.`.&.9 9 `.4.) 9 z &.&.`.) &.&.&.9 >+(+6 k+n >+z z &.8.#.#.++B.R.)+s.'+a+'+a+.+q.}+L.L.h+L.Y.H Y.p.L.L.C.Y.Y.w+w+w+,.L.B H w+,.,.,.7+7+,.p.,.7+7+,.7+7+,.p.,.7+,.7+,.,.,.,.,.w+p.C.C.p.'.> S > > S S > 6+<.C <.r r C r r r r ;.h c h y %+5 b z+@.a+4+a+4+a+'+H h+h+h+h+H '+'+4+'+^.2.i J.G.*+( o+J.k+)+X.X.@..+P.P.P.P.b P.b b b b b z+!+n+z+a M M e.*.a e.$.e.1+e.*.*.M *.a e.1+1+5+e.*.e.*.M M a *.a e.e.e.e.e.*.a a a a *.e.e.e.$.$.$.5+5+e.e.e.e.1+1+1+1+1+$.t.& Q.5+& 5+5+5+$.5+Q.5+& 5+$.$.$.$. + + +$.$.$. + + +n+n+b #+n+m.m.9+y.9+9+9+9+m.a+^.B.#.#.]+X.++;+:.i 4+9+9+w o #.#.o ! a+'+'+'+h+H H * H L.h+h+H H H H s.'+H.}+E+G+_.G G ]+G+]+o ! 3.S.! ! R.3.f s.H L.H 9+L.L.Y.L.p.L.Y.L.Y.p.L.Y.p.C.p.C.C.C.C.w+p.,+C.,+,+/+e+y+L m+} q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0.0.0.Q Q B+7 7 ] l.l.l.r.r.r.U.2+2+<+g.y+g.y+", "u 9.9.u 9.9.9.9.9.9.u 9.9.9.9.u 9.9.9.u u u u u u u u u 9.u u 9.u u u u u u u 1.u u 1.u 1.1.1.-.4.-.-.-.-.-.4.9 z -+`.) `.4.) &.`.`.-+-+&.&.z &.`.&.9 ( D ( 9 9 >+z 9 A+( `.&.9 G B.n ]+.+r+@.H L.h+'+2.B.s.L.L.Y.L.h+'+H Y.'+H H Y.L.C.,.,.L.2.p.7+,.,.,.7+,.,.,.7+,.,.p.7+,.,.7+,.,./+,.,.,.,./+w+w+/+y+l L v o.S S S S > S > > C C ;.%.;.r h.r v.y y h h h V.%+^ H.#+w }+^.4+'+4+}+'+L.Y.L.L.* H '+'+a+^.B.7.G.G.f+f+o+D ++i.X..+.+1 1 P.P.b P.P.b 5 b !+b z+z+a z+a a M M *.e.e.1+e.e.e.a *.a *.e.1+1+1+$.1+1+*.*.M M M a M y.e.1+e.e.*.e.a *.*.e.e.$.5+5+$.5+$.5+e.e.*.*.a *.y.1+e.5+& & $.5+5+$.& 5+5+$.1+$.$.t.5+5+5+ + + + + + + + + +*.1+*.*.*.1+1+1+*.*.[+,+[+m.#+@.B.i 7.7.C+++J.:+b.:.B.#+- E+]+G #.o S.'+'+N.* H h+H H * H H H s.'+H s.s.H M.s.f ]+G G ]+]+c+]+]+! ]+3.! ! ! a+M.#+H L.L.L.L.L.L.L.L.Y.L.Y.Y.Y.p.C.C.p.C.p.,+p.C.w+,+p.[+,+/+t.l+y+U.g+|.0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0.0.0.0.0.0.0.0.0.q q q 7 |.] [.m+m+r.r.U.U.U.", "u 9.9.9.9.u 9.9.9.9.9.u 9.9.9.u u 9.9.u 9.u u u u u u u u 9.u 9.9.!.u u u u u 1.u 1.-.-.-.1.1.-.4.-.4.-.-.q+4.9 9 z ) 4.&.5.9 `.z `.&.(+D z &.&.9 9 &.9 f+*+f+f+9 &.`.i+>+&.&.&.i+8.++o #+'+r+s.H L.h+h+H ^.}+L.h+'+H '+C.Y.C.C.C.C.'+C.H ,.Y.,.L.w+,.H H H 7+,.p.p.'+p.,.,.7+,.,.7+w+7+,.7+7+7+e+y+$+: l.l.[.[.: .S > > > S > 6+C <.;.=.%.;.h.;.h h Z.h h h V.%+^ H H H H a+'+B a+'+'+H L.L.g h+'+* '+4+q.r+J.G.o+o+f+:+D 8.)+X.1 B H+P.P.P.H.P.P.b P.z+b b z+z.2 n+n+a M e.1+1+$.1+1+1+e.e.*.e.*.e.1+5+$.e.e.1+1+*.a n+M a M *.*.e.e.e.M *.a a a e.e.$.& Q.5+$.$.$.*.a a a a a *.e.1+$.$.5+Q.& Q.$.$.5+5+5+5+5+5+5+$.$.5+5+ + + + + +1+e.$.$.1+1+1+e. +1+$. +1+1+*.*.[+R H.)+B.++7.C+C+J.b.;+:.C+N.X 3.o G ]+o a+'+'+'+* H H h+H h+H h+H h+s.H H H s.w w @.G W G G ]+]+]+! S.@.S.]+! 3.3.M.#+h+L.L.L.L.L.L.p.L.L.L.p.Y.Y.Y.Y.p.9+C.C.w+w+C.,+w+/+/+,+t.t.o.<+l l.q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0.0.0.. 0.0.0.0.. 0.0.q q B+7 [.] l.l.g+", "u u 9.u 9.9.9.9.9.9.9.u u u 9.u u 9.u u u u u u u 9.u u u u u u u 9.9.u u u u u u u u 1.-.1.u 1.-.-.-.-.4.-.q+) 9 9 4.&.&.9 5.( &.`.`.9 D D u.`.&.) &.8.i..+:.( f+z z -+-+&.&.9 >+D #.B L.Y.* ^.s.L.L.L.'+2.4+H C.Y.L.L.L.C.Y.'+L.C.Y.C.H w+w+,.,.p.,.4+,.,.,.7+,.Y.Y.H p.w+/+7+,.p.7+,.7+7+7+U.m+: [.|.|.[.[.[.[.[.: ~+> <.> > C r > ;.=.=.=.=.I h h h h h y %+_+5 s.H C.Y.C.Y.Y.L.L.L.g L.g L.h+H H '+4+2.A+b+*+o+:+:+D ;+k+X..+.+.+P.1 H.P.P.P.H.P.b P.z+5 b z+z+2 z+a a *.*.e.e.e.e.e.e.a *.a e.e.1+e.5+$.$. + +e.*.M M M M e.e.e.e.a *.a a a *.e.e.1+$.$.& & $.e.*.*.*.a z.a e.e.e.5+& & 5+& 5+5+& & 5+e.$.$.5+1+$.1+$.1+e.$.e._ 1+1+1+e.e.5+& 5+$.$.$.$. + + + + +*.y.n+b .+.+X.X.X.B.++i C+.+w E+! ]+o o ^.a+}+'+'+H '+'+'+h+'+H L.'+H H s.H s.s.s.f S.G G ; ]+c+]+]+]+]+1 G+! S.S.f w h+H H H Y.L.L.L.L.p.p.L.Y.9+L.p.C.C.p.C.C.p.C.w+w+/+/+/+l+l+e+y+<+r.|.q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0.0.0.q B+7 ", "u u 9.9.9.9.9.9.9.9.u u 9.u u 9.u u 9.u 9.u u u u u 9.u u u u 9.u u 9.u u u u u u u u u u 1.u 1.-.4.4.-.4.-.4.&.&.`.`.9 z `.&.9 9 `.) &.9 D b+:+-+) 9 6 H+R.++^.a+;+z `.z &.`.z D G b w 9+H '+L.'+#+L.* L.L.4+)+L.Y.Y.h+L.H C.,.,.C.Y.H L.w+Y.p.w+,.7+,.p.,.,.,.7+,.,.,.p.,.p.7+,.,.7+,.7+y+U.l.l.[.|.[.|.[.[.[.: : : [.: S C r r r r r %.%.h h h h h h h V.v.r ^+!+#+- C.C.C.C.C.C.C.C.Y.Y.L.L.'+'+* 4+R.2.J.J.G.o+o+G.b+8.k+X.X.1 H+P.P.P.H+P.P.H.P.b E+z+z+b 5 z+!+z.z+a M e.e.e.e.*.*.e.*.e.M *.e.1+e.e.1+e.*.*.e. +y.*.a *.a e.M e.e.e.*.a a *.e.e.5+5+Q.Q.5+1+e.a a a z.n+a e.e.1+$.5+& & Q.& Q.5+5+& $.e.e.5+5+$.e.$.5+1+1+1+$.$.e.1+5+1+$.5+$.5+5+5+5+$.$.t. + +$.*.*.*.n+n+z+b N.H.B 1 B H.w f ! ! ]+! R.M.'+'+'+'+h+'+h+H * '+L.h+H H s.H H s.#+E+]+W G G ]+]+]+]+3.3.@.S.]+3.3.f w L.L.L.L.Y.L.L.L.L.L.L.9+L.C.Y.9+9+C.C.C.C.p.C.C.C.,.l+/+/+l+e+y+].: B+0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0.", "1.u u 9.u u u u 1.u u u u 9.u 9.9.9.9.u u u u u u u u 9.u 9.u 9.9.9.9.u u u u u u u u u 1.u u u u -.-.4.q+) q+4.4.4.&.9 &.&.( z ) ) `.&.( (+#.n z ) &.i+H+q.5.H+4+^.B.;+f+9 >+9 9 i+( ++#+C.4+)+^.a+H L.h+h+'+'+L.H L.Y.L.Y.C.p.g H '+q.H ,.H w+,.,.,.,.7+,.7+,.L.,.,.7+,.,.H p.7+e+$+U.F.l.[.l.[.g+l.g+: r.r.r.r.r.: : ~+~+S > r ;.;.r =.%.h h h h h h I I %._+%+E+H p.C.p.,.Y.Y.L.Y.g p.Y.Y.L.L.H '+'+4+2.r+7.;+b+J.b+8.C+i.X..+B 1 B 1 H+P.P.P.P.H.5 b !+P.b b b z+z+n+a M *.e.e.M a *.a e.a e.a *.*.*.1+$.1+e.e.*.*.*.*.*.*.e.*.1+e.*.*.a *.a e.1+$.$.$.$.$.$.e.e.*.a z+a a *.*.e.$.$.5+I.& & & $.& $.e.5+e.1+1+e.5+$.5+$.$.5+5+e.e.1+$.$.5+1+$.Q.Q.$.& t.5+5+5+$.1+$.1+1+*.*.*.*.y.M *.M n+n+n+b E+3.S.! ! a+a+'+'+'+'+'+'+'+'+H H H s.H L.L.H s.s.f f G G G W ]+]+G ]+]+3.c+G+G+S.3.H.#+L.H L.L.L.p.#+C.Y.L.Y.Y.p.Y.Y.Y.Y.p.C.C.C.C.C.C.,.w+,.7+7+e+e+3 U.[.q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "u u 1.u 1.-.-.1.q+1.u 9.u 9.u 9.u u 9.9.u 9.u u 9.u u u u u 9.u 9.u 9.u u u u u u u u u u u u 1.u -.q+q+q+4.4.4.4.q+&.( 9 `.) 4.`.`.) `.D 8.< B.G.( D i+6 2.^.4+;+C+C+7.:+( 8.G.u.9 9 W a+7.;+G H 2.@.N.H h+L.C.L.h+R.'+p.Y.Y.C.Y.L.g N.C.C.C.w+w+7+7+,.,.Y.p.,.,.,.,.,.7+e+r.r.U.r.m+g+l.r.g+g+m+g+l.: l.: . .r.K.K. .: : : ~+> ;.=.C ;.=.h h h y y y y =.%.I V.P.N.s.#+9+C.C.Y.Y.Y.Y.H L.'+4+'+B a+4+a+q.B.++A+A+J.++++i.)+G+1 H+1 H.P.1 B P.P.5 b 5 H.z+b !+5 b !+z.n+a a *.M M *.M *.a e.M e.*.a *.*.e.1+ +1+1+e.e.e.e.a *.e.e.1+e.e.e.*.e.a e.e.1+5+$.Q.5+$.1+e.*.a a a a e.e.1+$.5+$.Q.5+& 5+5+& 5+1+5+5+$.$.1+5+$.5+5+$.$.5+$.5+e.5+$.$.5+$.$.5+Q.& & & Q.$.5+5+ + + +1+*.e.1+*.y.[+[+1+y.y.#+w }+a+}+a+a+}+'+'+'+'+'+'+'+'+H '+H s.H H L.H #+#+w @.G G G G ]+~ o ]+]+c+! S.]+@.3.w s.L.L.L.L.L.Y.L.L.p.L.Y.Y.C.Y.C.C.C.C.C.,.,.,.,.,.m 7+m 7+e+d+[ L m+} Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "1.1.1.1.-.1.u 1.u u u 9.u u u -.u u u u u u u u u u u u u u u 9.u 9.u u u 1.1.u u u u u 1.1.1.1.1.1.1.{ -.-.-.-.4.4.q+`.`.4.4.) ) &.`.) 9 8.6 r+u.z (+_.B.)+S.^.@.a+a+R.;+z 9 ( 9 9 9 5.P.E+)+@.a+7.B.3.'+H L.L.L.Y.Y.h+L.Y.p.,.p.Y.Y.L.w+Y.,.p.,.p.,.,.7+,.,.,.,.7+7+7+<+<+<+F.r.r.[.[.l.g+m+r.: .g+: g+: [.: ].: [.[.: : ~+~+S > %.%.C ;.h h h =.h =.h I %.=.V.5 H '+B B '+H Y.L.N.'+B '+'+4+4+4+^.^.^.^.2.r+C+C+C+b+8.Z X.B H+B P.H+1 P.P.P.H.P.P.b 2 z.z+5 b b b b z+n+y.M M y.M a M y.M a a e.e.a *.*.1+1+ +$.1+e.a *.e.e.e.e.e.a *.*.e.*.1+e.$.5+ +5+$.$.5+ +1+e.a M M e.e.1+$.5+5+5+& Q.& 5+& 5+$.$.e.1+1+5+$.5+& 5+$.& 5+$.5+e.& e.1+5+& 5+5+& 5+& & & Q.5+5+$.5+ + + + + +1+e.1+1+1+[+*.*.M z+E+P.H+a+'+a+'+'+a+a+}+a+N.'+'+'+s.s.h+#+H L.h+s.X ]+G G G ]+G ]+]+]+]+G+G+]+@.S.f #+L.H h+L.L.Y.L.p.C.L.p.Y.p.Y.C.Y.,.Y.,.,.,.,.w+m 7+7+F+F+F+d+d+$+K r.] Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "4.u u u u 1.1.q+-.u u 9.u u -.-.u 9.u u u u 9.u u u u u u u 9.9.9.9.u u 1.u u u u u u u u 1.u 1.-.1.-.-.q+-.4.q+q+-.4.) `.`.-+4.`.9 &.`.) &.(+k+b+_.A+k+#.A+( f+< i.)+^.:+z &.9 9 9 9 ( D o+o+]+H R.w 4+r+G @.'+Y.C.p.Y.C.Y.Y.Y.Y.4+B C+H.,.,.h+Y.C.,.,.p.7+7+,.,.7+7+e+<+g.l r.l.l.l.g+m+g+: m+: .r.: : [.[.[.: ~+: : |.: [.~+~+> <.%.=.=.y =.h h =.h =.=.%.h y _+H.N.H H '+B '+4+4+4+q.4+4+^.^..+^.B.)+B.B.C+C+k+C+k+i.X.G+1 P.H+P.P.H+1 H+P.P.P.H.P.b b !+b b b 2 z+!+a M *.M R y.R *.a *.*.a a *.a a *.e.e.1+1+1+1+e.M M M e.*.1+e.a e.e.e.1+1+1+5+5+$.& Q.$. +1+1+1+e.*.e.$.e.5+& & Q.& Q.Q.& 5+5+5+5+e.5+1+e.e.$.& 5+$.$.$.e.5+$.& & $.$.5+& 5+& 5+& 5+5+5+Q.5+5+5+5+$.5+ + + + +1+1+ + + +[+*.y.R #+w H.a+a+R.4+^.^.)+! ! a+}+'+s.H H L.#+#+X s.w ]+G G G n.]+G ]+! 3.c+! S.@.@.3.w L.L.L.L.H Y.L.L.L.g L.Y.Y.Y.C.Y.,.V ,.,.7+d.7+F+F+F+d+$+).$+3 K F.] 7 Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "-.u 1.u u -.4.-+4.u 9.u 9.u u u u u u u u u u 9.u u u u u u 9.u 9.u 9.u u u u u u u u u u u u 1.1.-.q+-.-.-.-.-.4.) 4.) &.&.4.`.&.9 ( 9 -+) ( 8.8.++B.*+b+G.u.f+>+< .+^.;+9 9 9 >+9 9 &.i+(+}+s.'+h+R.R.2.;+A+B H R.'+Y.h+h+L.C.'+'+'+2.B ,.p.,.p.,.Y.H p.,.,.7+,.7+t.<+<+y+l | r.g+m+g+: [.g+: : : : U.: [.|.k.[. .|.: : : : [.: S S T %.I =.h =.h =.h =.%.%.=.=.%+b '+B '+B '+'+H H '+H 4+4+'+4+^.)+C+B.B.C+k+k+k+i.X.X..+H+H+B P.H+B P.P.P.P.P.P.P.b 2 b b 5 b !+b n+z.n+a a a M M *.M *.e.a M a a a *.a M $.5+1+*.*.M e.e.e.*.*.*.*.e.*.e.1+e.5+5+$.5+5+Q.5+5+$.$.1+e.e. +1+$.5+& Q.Q.5+5+Q.& $.& & & $.$.$.$.$.$.1+$.5+$.5+& & T 5+e.$.5+5+& & & Q.5+& & & $.5+& $.5+$.5+ +5+1+t. + + +$.$. +$.$.e.y.M m.w N.a+^.i 7.3+3+3+3+_.#.G+}+E+'+#+#+#+X X f o ]+; ]+]+]+]+]+G+]+G+G+G+S.S.E+H H L.L.Y.Y.L.L.g L.Y.g L.Y.g g g Y.,.m m 7+F+d+v $+$+p p 3 3 K {.l.] q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "1.-.4.) ) -.1.-.u 1.u u u u u u 9.1.u u u u u u u u u u u u u u 9.u u u u u 1.u u u u u u 1.1.1.1.-.-.-.-.q+-.4.4.) ) ) ) &.4.) &.9 &.z &.&.) 9 >+k+G J.++++#.B.G+}+2.r+;+o+f+>+( z z -+i+1 #+2.H.L.h+* H 4+a+a+4+H #+L.L.Y.Y.Y.H h+L.Y.L.C.Y.w+,.p.q.'+w+w+7+,.,.t.g.U.U.r.r.r.F.r.r. .: .: r.: [.[.[.: |.[.|.g+].k.: ].: ~+: : : ~+> <.^+%.=.=.=.=.h =.=.=.=.h.!+z+L.L.L.H '+'+H Y.H p.L.L.L.H '+4+^.B.B.C+C+C+k+i.G+1 @.H+B H+P.P.P.H+P.H+P.P.P.P.P.5 H.b b b z+z+z+a a n+y.a R a a M *.1+e.M M M a M e.e.e.e.e.e.e.*.e.*.e.e.e.e.*.e.*.*.e.1+$.5+$.5+& & Q.& $.$.5+$.$.$.5+& Q.5+& & 5+$.Q.& 5+& $.5+5+$.$.1+5+$.e.$.& $.5+5+& $.& 5+e.$.$.5+& $.& & Q.5+5+5+5+& Q.Q.5+Q. +& 5+5+$. +5+ +$.Q.5+& & +*.k m.E+! r+4 F 7.3+3+n n n 8.G H+'+s.H s.#+w 3.o ]+]+G ~ ]+]+]+3.G+G+3.3.@.3.X #+L.h+H L.L.h+Y.g L.g g g g g g v+V V m d.F+d+$+$+p p K K F.F.m+@ ] d Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "-.) ) ) 1.u u u u u u u u u u u u u u u 9.u u u u u u u u 1.u 9.u 9.9.u 1.1.u 1.u u u u 1.u 1.1.1.1.-.-.-.-.-.4.4.) 4.) 4.`.) q+4.&.z {+9 z ) ) i+( 9 W A+< B.J.#.H+'+'+r+o+>+f+>+D z `.&.8.@.2.#+p.C.C.H H L.h+R.++B H H L.Y.L.L.L.Y.p.C.C.,.,.* L.p.Y.p.l+y+<+U.l l r.r. .r.g+g+ .: r. .: K.o.[.~+[.|.|.[.[.: g+K.[. .K.: [.: : g+: K.S > ^+=.h =.=.=.=.%.=.=.5 N.L.p.#+H H H H L.#+Y.Y.L.L.'+'+a+'+4+^.)+#.k+6 B.Z i.X..+P.P.P.P.H.P.P.P.P.H+P.P.P.P.b H.2 !+z+2 z+z+z.M a M z.a R M a *.*.*.a n+a y.*.M M e.e.1+*.*.1+*.e.a *.*.a *.M e.*.1+$.5+Q.5+Q.Q.Q.5+5+5+& 5+5+1+& & Q.t.Q.& Q.Q.& $.5+& 5+& 5+$.t.$.5+e.5+5+e. +e.$.5+1+T 5+e.$.$.$.$.e.5+5+5+5+& & $.$.5+& 5+$.5+& Q.5+ +5+t. +Q.$.$.I.Q.Q.& Q.$.y.E+a+)+o r+o _._.< < < 5.8.G P.'+#+X s.f ]+o G ]+]+]+G ]+3.]+c+]+! G+3.E+s.L.H Y.Y.h+g L.L.g g g g g g g u+u+v+Y.m F+d+$+' {.{.F.F.l.m+l.l.] } q 0.0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "`.4.u u u -.1.u 1.u u u 9.u u 1.u u u u u u u u u u u u u u u u 9.u u u u 1.u 1.u u u u 1.u 1.1.1.-.1.-.-.-.-.) -.) 4.4.4.) ) 4.) `.&.&.9 &.`.-+&.9 z i+D (+G ^.;+8.@.'+q.:.C+*+z >+9 &.&.9 G '+#+C.L.q.a+C.R.H * 2.a+B.H L.L.h+Y.L.g w+,.C.w+p.* '+p.w+l+y+2+U.<+U.l r.r. . .: l.r.: s K.[.|.[.[.[.g+g+: g+: K.S S |.[.|.: K.: .x+|+S K.|+<.h.=.=.=.=.%.%.%+n.N.H.N.H H H N.'+B '+B '+H L.H h+H a+a+.+)+B.B.#.6 i.6 i.X.G+@.H+H.P.H.P.H.P.P.P.P.P.P.P.5 b H.z.z+z+a a n+a n+a a a a M *.e.*.M *.z.M a y.*.*.e.e.e._ *.e.*.e.e.e.e.*.*.a e.M e.$.$.Q.& & 5+Q.& Q.$.5+& & Q.& & +.Q.& Q.& Q.Q.Q.Q.5+& 5+& 5+$.t.t.$.$.$.5+$.e.e.e.$.e.e.5+e.5+$.5+& $.& & & 5+& Q.& 5+& Q.& 5+$.Q. +5+$.$.5+Q.Q.Q.I.<.I.I.I.I.1+b a+! ]+]+! ! ]+; W j+< W W G+E+s.w X 1 o ]+]+]+]+]+]+]+]+3.c+3.3.3.3.f s.L.L.H Y.L.L.g g p.h+L.g * * * u+u+g m m F+v 3 K F.m+@ @ ] l.] } d d 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "4.1.1.1.1.-.-.1.u u u u 9.u 1.1.-.1.u u u u u u u u 9.u u 1.u u u u u u 1.u u u u u u u u u -.1.-.1.-.-.-.-.4.4.4.q+4.4.) ) 4.) ) ) &.`.) -+`.4.) 9 9 9 D 8.b+k+_.#.4+a+'+4+B.*+9 9 9 z 9 8.H+}+L.Y.h+L.L.C.Y.a+'+B.E+H H L.h+L.Y.C.C.C.,.,.,.,.,.C.p.e+r.U.<+g.l r.F. . .: [.[.: [.[.[.[.|.: : ~+: K.|+K.O D.D.w.|+k.[.|.[.|.|.0+[.[.: ~+r.e r %.%.%.=.=.I h.P.B a+B '+H '+'+N.H H '+N.B '+H N.'+}+^.)+B.i.6 B.B.k+Z G+G+P.P.H.P.H.H.P.P.b H.P.P.P.b 5 b z.!+b z+a z+M a R a M M n+z.a a a *.y.y.M M y.y.M e.*.*.1+*.*.*.*.*.e.e.*.*.a *.*.e.*.1+5+5+Q.Q.Q.5+Q.& & Q.Q.Q.& Q.Q.& +.I.& Q.5+5+5+$.Q.& & 5+$.& 5+$.5+1+1+$.e.$.$.e.e.e.$.e.e.$.5+$.$.& $.Q.$.& & & & Q.& & Q.5+Q.$.$.Q.5+5+5+ +& Q.I.w.O 6+O w.t.z.w H+@.G+5 2 2 ^ ; =+=+W G (.S.#+X f f ]+G ]+]+]+]+]+]+3.]+]+]+G+3.f E+H L.L.L.L.Y.H g g g g * g * u+* * u+v+6.P d+$+K {.@ @ ] ] ] } 7 7 d Q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "4.1.u u 1.-.1.-.1.u u u u u 1.-.-.-.1.1.1.1.1.u u 1.u 1.u u u u 9.9.u u u u u 1.u u 1.1.u u 1.-.-.1.-.1.q+q+-.-.1.q+4.4.4.4.4.4.4.) `.&.`.`.`.`.) `.{+9 9 >+D < b+k+@.a+4+i 4+*+9 f+( >+( 8.i.w L.R.H C.,.C.C.C.L.q.@.#+H #+L.L.N.N.h+p.,.p.H p./+H I.x+Q.<+ .l.g+[.g+m+g+ .: [.: [.[.|.[.[.l.r.K.S x & w.a +.K.D.S [.[.[.|.|.|.|.[.[.[.g+K.x I._+%.=.I V.%+!+H H '+H '+H H H '+B B }+'+a+a+a+a+4+a+^.)+#.B.k+6 6 B.6 X.G+P.P.H.P.H.H.P.H.5 N.H.b 5 b !+b b z+b z.a a M *.*.a M a M z.a a a y.*.a y.M *.*.*.*.e.*.1+e.e.e.e.*.e.e.e.*.a *.y.*.*.1+Q.5+& & & Q.Q.Q.Q.& & Q.& Q.I.& Q.+.Q.Q.& Q.Q.$.t.t.$.Q.t.$.$.$.1+$. +1+e.e. +e.1+e.$.$.e.5+& 5+5+& $.& & & +.Q.& I.& 5+& & Q.5+ +5+$.5+5+5+& I.I.O O O D.O Q.y.b E+5 1 5 2 r ^+~ =+W =+; c+1 X X f ! ]+]+]+]+]+]+]+]+3.c+]+3.G+3.3.E+#+L.L.Y.L.L.g g h+h+h+u+* h+* A.A.A.g m P d+3 l m+l.] ] 7 7 d d q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "{ 1.u 1.u 1.u 1.1.1.u u u u 1.u -.u 1.1.1.1.1.-.1.1.1.1.1.1.1.u u u u u 1.1.u u 1.1.-.-.u u 1.1.-.-.{ -.-.1.-.-.-.-.4.4.4.q+q+q+4.4.4.4.`.) ) `.) `.`.9 ( &.i+(+8._.i.i X.)+J.9 o+k+J.C+++5.++R H L.s.L.C.C.C.Y.'+A+J.++)+N.'+4+2.B.Z ,+7+e+0 U.o.*.z+b U.g+l.[.|.|.[.[.: r.g+[.[.l.: : [.[.: K.S ].I.1 & e.I.K.K.: |.|.7 |.|.[.[.[.[.~+[. .| |+!+%+V.I %+2 [+9+H H '+H #+H '+H '+'+'+a+B 4+^.^.^..+)+)+B.k+C+#.G 6 i.G+P.H.b b H.b b b z+b b !+b b z+b z+z+z+a M n+*.e.a *.M M *.*.M M *.*.y.y.*.*.M *.e.e.1+*.$.*.*.*.M _ e.$.e.*.e.*.*.e.e.*. +$.Q.& & Q.& Q.Q.& Q.& & I.& 5+I.+.& & & 5+& 5+$.5+& Q.t.5+5+$.1+$.$.1+1+1+ + +[+1+e.e.5+5+$.$.& & & Q.& I.& Q.+.5+& I.Q.Q.Q.Q.Q.5+t.& $.5+& I.I.w.O O |+> w.Q.1+z.E+5 z.2 z.z.^ ^ ; ; 6 ]+c+@.E+M.f ]+]+o ]+]+]+]+]+]+]+]+]+]+S.3.f s.H L.L.L.L.g L.L.g h+* h+u+* * t * A.A.J j j.3 .l.] 7 d d Q q Q Q 0.. 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "1.u u u u 1.1.1.1.1.1.1.u u u u u 1.u 1.u 1.1.1.1.1.-.1.u u u u u 1.1.u u 1.1.1.1.u -.1.1.u u 1.1.1.-.q+-.1.-.-.-.-.q+4.4.4.4.4.4.4.4.4.q+-.-.) `.&.&.&.9 9 D D b+++B.G.G.o+A+b+.+^.B.++++(+#.n C+++@.#+C.C.Y.'+;+i.4+q.a+#+H .+@.6 s . .[.: 5+X.X.G+|+: [.[.[.l.|.[.|.|.l.r.l.g+[.l.g+: [.r.K.|+|+I.& O |+K.[.[.[.k.7 T.7 k.|.[.g+l.g+: r.K.|+r ^+%+=._+*.w+,+L.L.H C.C.,.9+C.p.L.H h+'+B 4+^.2.)+C+C+B.B.k+i.B.6 G+H+b b z+z+z+n+n+n+M y.R n+n+z+z+z+a M n+n+*.M *.1+*.*.*.a *.*.M a M *.*.*.*.*.*.*.e.e.1+_ e.*._ *.*.e.e.$.e.*.a *.*.a e.e. +& Q.& I.& & & Q.5+Q.Q.& & I.& Q.I.& I.& 5+$.5+$.& +& $.$.1+5+1+1+ + +1+1+1+ +1+1+e.e.e.e.& $.5+& & & 5+Q.& Q.Q.I.& +.+.Q.5+5+Q.& Q.5+Q.5+Q.+.I.w.O > |+|+O 0 $.R X E+5 5 5 5 ^ c+n.; (.]+c+3.w s.S.o ]+]+]+]+]+]+3.]+3.c+3.! 3.3.f s.L.L.L.L.L.h+h+g h+g * * * A.* ` * t u+V P [ l m+l.} d Q Q Q Q . 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "-.-.-.-.-.-.u u -.1.1.u 1.-.-.u u u 1.1.1.u 1.-.1.1.u u u u 1.1.1.u u 1.u 1.-.1.u -.1.1.1.1.1.1.-.-.-.-.-.-.-.-.q+-.4.4.4.4.-.4.4.4.4.4.4.4.4.4.`.) &.&.`.&.( b+8.8.++++k+A+^.}+2.:+>+b+D k+.+2.A+f+P.H L.C.p.Y.'+s.L.X w b 2 2 h.r ~+: [.|+P.k+6 *.r.: [.|.[.|.|.[.[.[.[.|.[.g+l.|.: [.: : r.x+S ].D.O ].~+: |.|.k.7 |.|.k.|.|.[.: : : .r.r.x 5+T a !+z+#+L.,+C.}+C.C.,.,.C.C.Y.}+B L.L.* '+a+4+^.! )+X.G+! ]+G+G+G+P.z+a n+M n+M M *.*.*.*.e.e.e.e.e.*.*.*.1+ + + +1+e.e.1+e.*.*.y.*._ *.a e.*.e.e.1+e.$.$.e.*.e.*.y.*.*.*.e.e.*.*.a *.*.*.e.1+Q.+.5+Q.+.I.I.& I.& Q.Q.Q.& I.+.& I.& & $.& $.5+$.$.$.5+5+$.$.$. + +$.$.1+ + + + +1+e.& 5+$.5+5+& & & I.Q.I.+.+.5+I.Q.Q.& Q.Q.Q.5+5+5+$.Q.Q.I.w.D.D.|+S |+O 0 _ _ E+f f f 5 1 f G+c+6 ]+c+G+H+f f ]+]+o ]+]+]+G ]+]+1 ]+]+! G+S.S.}+H H H H h+L.L.p.g L.* h+* * * ` * * t u+V U d+L .] d q Q 0.. . 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "-.4.-+-.-.-.u u -.1.-.1.u u u 1.1.1.1.1.1.1.1.1.1.u u 1.u u u u 1.1.u 1.1.1.1.1.u -.1.1.1.1.1.1.1.1.-.-.-.-.-.{ -.-.4.4.4.) 4.4.) 4.q+-.4.4.4.`.&.&.9 `.) &.9 >+D 8.b+*+9 8.@.4+H 8+C+^.:+( 8.H+2.*+< k+B ^.a+L.Y.L.s.b r ^+h.h.;.h.0+K.*.6 ++5 +.K.: l.[.[.[.[.|.|.[.[.[.[.|.[.l.|.[.: r.K.: x+: K.K. . .: |.k.k.|.7 |.|.|.|.[.g+l.r.: r. .l L p.p.R #+#+L.L.p.'+^.C.w+w+,.C.C.Y.2.4+L.H h+'+'+.+)+B.B.)+Z )+Z ]+G+P.b R *.[+e. +$.$.$.$.t.$.& Q.Q.$.Q.Q.Q.Q.$.Q.Q.& Q.$.$. +e.e.$.1+*.*.$.e.e._ 1+$.$.$.& $.$._ e.e.*.*.*.M *.*.e.*.e.e.*.e.e.5+5+Q.Q.& Q.& I.& I.& Q.Q.Q.& & Q.Q.+.5+5+$.5+& 5+5+5+$.$.5+$. +e.$. +$.1+$.1+1+$.1+1+e.$.5+& & & & & & +.& Q.Q.I.& I.5+I.Q.$.Q.t.Q.Q.Q.& & I.I.O 6+|+].].|+O 0 _ k R E+E+f 3.1 c+3.n.c+G+@.f f H+S.]+o G ]+o ]+]+]+]+3.]+]+! ! 3.@.f #+H L.L.L.L.h+L.h+g h+* * * * A.` * ` A.u+U [ 3 .] d q 0.. 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "4.4.4.-.-+1.u u u u u 1.1.-.-.1.1.u 1.1.1.1.1.-.1.1.u u u 1.u u u u 1.1.1.u u u 1.1.1.1.-.1.-.1.-.-.1.1.1.-.q+-.-.-.-.-.4.4.q+q+4.4.4.4.4.4.4.`.&.&.9 &.`.`.&.&.9 >+W ++i b+k+)+)+B.N.'+4 u.9 b+4+^.B 2.G.G R p.C.b ^+r h.h.;.;.;.h.> z+B.X.*.*.r.l.[.[.[.|.[.[.[.|.|.[.[.[.g+[.[.[.[.|.[.: K.S : : : [.|.|.|.|.|.|.B+|.|.|.|.[.: g+ .r. .r. .j.7+w+,.C.L.H L.C.w+,.w+w+,.w+,.,.p.L.L.h+h+'+'+4+R.^.^..+)+! G+]+G+G+H+z.e.$.$.Q.Q.Q.Q.Q.I.I.I.I.I.o.I.I.I.I.I.o.I.I.I.I.I.Q.Q.& t.$.$.& $.1+ +$.$.$.$.t.5+$.$.e.e.e.*.e.e.*.e.*.e.*.1+*.*.e.e.$.$.5+& & I.5+I.Q.+.Q.Q.Q.+.& I.I.& I.& & & 5+$.$.$.$.5+& $. +5+1+$.1+ +$.$.& $. +1+$.e.$.T & 5+5+Q.+.& I.& I.+.I.+.I.+.Q.Q.Q.Q.Q.& $.t.5+5+I.+.O O |+S S K.|+o.j ,+R X X E+5 f f 3.@.S.@.S.@.3.f f ! G G ]+o ; G ]+]+]+! ]+c+S.G+S.3.E+s.L.H p.L.h+p.g H Y.L.g * * * * * t ` * u+V U d+l l.} Q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "4.4.1.-.4.1.{ u 1.1.1.-.) -+-.-.-.1.1.-.-.-.-.-.1.1.u u -.-.u u u u u 1.1.1.1.u 1.1.1.u 1.u 1.u -.-.1.1.1.1.-.-.-.-.-.q+-.4.4.4.4.q+-.-.q+4.4.4.4.4.`.&.9 9 &.`.z 9 D 8.i.J.< )+2.^.^.a+2.:+i+>+G+! .+^.:+D b L.w ^ ;.;.;.;.;.%.v.;.2 b P.e.Q.K.: |.|.|.|.|.|.|.|.g+|.g+|.g+l.[.[.[.|.[.[.g+K.|+k.~+[.|.|.|.k.7 |.|.B+|.|.|.g+~+g+g+o.Q.].F.U.l+7+7+7+w+7+w+Y.7+7+7+7+7+,.,.,.,.,.C.L.L.h+'+'+R.R.4+R.}+a+a+B }+P.E+b R $.Q.Q.Q.I.I.o.o.w.s o.O O O e O D.<+D.O s O s w.O o.w.w.I.0 Q.& Q.$.& & & & Q.Q.& & 5+$.$.e._ *.*.*.*.*.*.*.*.*.1+1+e.5+& Q.Q.& +.& +.Q.Q.I.I.& I.5+& +.Q.& 5+$.& 5+$.5+$.$.5+5+$.e.1+1+1+e.$. + +t.$. +$.$.1+5+5+& & & 5+Q.5+& & & Q.Q.I.Q.I.I.Q.Q.& Q.Q.& t.Q.Q.I.I.O O |+K.K.K.L w.j /+- #+s.M.s.f E+f E+f f f H+}+a+S.! o G G G G G ]+]+]+]+]+]+3.G+3.S.f s.H L.H Y.L.p.L.L.h+L.Y.h+* * * * * * ` * u+U P v F.] d Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "4.-.) -.1.q+4.1.1.u -.`.`.-+1.1.1.1.1.u -.-.-.-.1.1.u u 1.u u u u u 1.u 1.1.-.-.-.1.1.1.1.u u -.1.1.1.1.u u -.-.1.1.q+-.4.4.-.q+4.-.q+-.4.4.4.4.4.4.) ) &.&.&.&.9 D 5.>+(+A+b+_.! ! 4+4+2.:+>+8.a+2.}+h+r+a+9+#+5 _+%.;.%.%.%.v.%+2 e.1 I.].r.l.[.[.|.|.|.|.|.|.B+|.|.g+] g+l.g+[.[.|.|.|.[.K.|+[.|.|.|.k.|.7 k.B+|.k.|.[.> C r C > 2+b |+ .e+7+w+w+7+7+d.7+7+,.,.Y.7+,.7+w+w+,.,.Y.Y.L.* * '+4+R.a+a+'+}+}+3.f E+b z.*.$.Q.Q.I.w.o.O D.D.x+x+2+|+|+|+|+|+].|+|+|+|+|+x+|+|+|+D.O O w.o.w.w.I.I.I.Q.Q.Q.I.Q.Q.& $.$.e.1+1+*.e.e.e.e.e.1+1+1+5+& & & +.Q.Q.Q.Q.Q.I.& & I.& Q.I.Q.& Q.& & 5+e.5+e.5+5+& 5+5+1+5+e.1+ +$.5+$.$. +$.1+5+5+& & & +.Q.+.& I.& I.+.I.+.Q.+.& Q.+.I.& & Q.Q.Q.Q.I.I.o.D.|+S S K.].x+o.0 C.9+s.s.s.f f s.E+3.E+a+}+a+}+f 3.]+]+]+]+G G ]+]+]+]+]+c+G+G+3.G+S.E+H H H L.H H Y.L.g p.g h+g g g * * * * * A.u+V U d+$+{.] q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "4.-+4.4.4.-+-+-.1.1.`.`.-.-.1.1.-.-.1.u 1.1.1.-.-.1.u u u u 9.u u u 1.u u 1.-.-.q+-.-.u 1.1.u 1.1.1.1.1.1.u 1.1.-.u -.1.-.-.-.q+4.-.-.-.4.4.q+4.) ) 4.4.&.`.&.9 f+9 b+o+D b+8.#.i.^.a+a+4+*+( G+a+R.H L.L.'+#+#+1 ^+_+v.%.v.v._+^ }.P.O r.: [.[.|.[.|.|.|.|.|.|.|.|.|.|.|.7 |.|.|.[.|.|.|.[. .: ~+|.k.|.7 |.k.k.|.B+k.|.> +.h.h.;.h.> s D.<+7+7+7+7+7+7+7+7+7+7+7+,.7+,.7+,.,.,.,.Y.g g H * '+4+R.'+H H s.s.H.M.w R R _ t.0 w.w.o.O O D.|+|+].S K.K.K.K.K.K.K.K.K.K.K.S r.S x ].|+|+|+e x+D.O s O s o.o.w.I.I.Q.& & $.1+$.$.1+e.e.$.$.e.$.5+5+Q.Q.Q.& Q.Q.Q.+.Q.Q.I.Q.I.+.Q.Q.I.+.Q.$.5+& $.$.e.$.& e.& e.e.$.1+5+1+ +5+$.$.5+5+$.$.$.5+5+& & & & & I.& Q.& Q.I.Q.I.I.& Q.I.5+& Q.t.Q.Q.I.I.O D.|+S K.~+|+x+[ '.9+- H s.s.s.f M.'+f '+'+'+'+}+}+f S.]+]+G ]+G G ]+]+]+]+]+! G+3.@.3.f E+H H H L.L.L.Y.H Y.L.g L.L.g h+* * * * * * V J P d+v {.l.} q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "4.4.-+) ) 4.-.1.1.) &.4.1.1.-.-.1.u 1.-.1.1.1.1.1.1.1.u u u u u u 1.1.1.-.-.q+-.-.-.1.1.1.1.1.-.u 1.1.1.1.-.u 1.u 1.u -.1.-.-.{ -.4.4.4.q+q+-.-.q+4.q+`.&.&.9 >+(+( 5.D A+5.3+b+D i.i.H q.G.D Z H H h+'+s.r+f L.H+^ ^+h.v._+^+^ D.e.I.r.: : [.[.|.|.|.|.|.|.7 |.|.|.|.|.|.[.|.|.|.|.|.7 |.k.[.[.[.7 k.k.|.|.|.|.B+|.k.0+6+C r h.;.;.r > <+7+7+7+7+7+7+7+,.7+7+,.7+7+m 7+,.7+,.,.,.,.Y.Y.* * '+'+'+'+#+#+H w w #+R m._ _ Q.Q.I.o.o.O e D.|+|+S K.K.K.: : : : [.[.~+[.~+: : : K.: K.K.K.S S ].|+|+].|+x+D.D.O o.s I.I.Q.& Q.$.$.$.$.$.$.5+Q.& & & Q.Q.Q.Q.+.Q.Q.& Q.5++.Q.Q.+.Q.& Q.5+5+$.1+$.e.$.$.$.& $.$.$.1+1+$.$.$.$.5+5+$.$.5+$.5+$.5+& & I.& I.& I.& I.I.+.I.I.Q.+.I.& I.Q.Q.Q.5+Q.I.w.O |+S K.: : ].j.0 l+9+L.L.s.'+'+'+H }+'+H.H '+}+}+3.3.3.]+]+]+; ]+G ; (.]+c+3.c+]+1 1 H+}+f '+#+#+H h+p.g p.p.L.Y.L.g g g g h+u+* * * u+V J P [ v 3 F.l.} d 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "4.4.4.) ) 4.1.1.) `.4.-.1.1.1.1.1.1.1.-.1.-.1.1.1.1.u u u u u u u 1.-.u 1.1.-.-.-.-.1.1.u 1.4.-.1.-.u 1.u -.1.1.-.-.u 9.u -.) -.4.-.-.-.-.-.-.-.-.q+q+) 4.`.9 9 ( D 9 (+++A+J.*+G r+++6 J.( 8.@.M.H L.'+4+4+f H 3.^ ^+r r ^+2 & D.s K. .[.[.|.|.|.|.|.|.|.|.|.|.|.|.|.g+|.|.[.|.|.|.|.k.|.|.[.|.|.|.7 |.7 B+B+|.|.|.k.g+C r r ;.h.;.;.C e 7+7+m C.7+7+7+7+7+7+7+7+7+,.,.,.7+,.,.,.,.Y.Y.h+* '+'+'+H 9+9+#+9+R #+R R [+ +Q.0 w.o.o.O D.D.|+].].K.: : ~+~+|.|.k.k.k.k.T.|.|.k.|.|.|.0+: : g+: K.K.K.r.K.U.].|+D.D.O s w.w.I.I.Q.Q.Q.& & 5+Q.Q.I.5+Q.Q.I.Q.I.+.Q.I.Q.Q.I.Q.Q.I.I.5+I.& & 5+e.$.e.e.e.$.e.5+1+e.$.5+e.$. +5+$.5+$.e.$.$.$.$.& & 5+& Q.Q.+.I.+.Q.I.+.Q.I.Q.Q.I.& I.5+Q.Q.Q.I.I.}.D.|+S K. .: ].j.0 l+C.L.H s.s.H '+H '+}+}+N.'+'+'+}+3.f G+]+]+]+]+]+G G ]+c+3.n.! ]+f 1 H+E+E+H.#+H H L.H L.Y.Y.Y.Y.p.g Y.L.L.L.h+u+* * u+g V U P [ v 3 F.@ } q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "4.4.-+4.-.u -.q+) 4.1.4.{ 1.u 1.1.1.1.u -.-.-.1.1.1.1.1.u u 1.1.1.1.1.1.1.-.1.1.-.-.1.u u -.1.u 1.u 1.u u u u 1.1.u u 1.u 1.1.-.-.4.4.4.4.-.-.1.-.-.4.q+4.) &.&.&.9 9 8.#.^.B.b+D (+D f+>+G i.}+a+a+.+}+a+R.a+s.3.6 r r r ^+^ |+r. .r.r.l.[.[.|.|.7 |.|.|.|.|.|.|.|.B+|.|.g+|.[.|.|.k.|.|.|.[.|.|.7 |.|.k.|.k.B+|.k.T.> C r r h.;.;.;.r D.e+,.7+7+,.7+7+,.7+7+7+,.7+7+,.,.,.,.,.,.Y.Y.g L.L.* * L.L.9+9+9+9+9+[+[+_ +t.0 Q.I.w.o.O D.D.U.|+S S K.: : ~+|.k.k.B+B+D+B+D+D+Q &+&+&+7 T.|.k.[.[.: : : : g+K.K.x S |+|+g.D.O o.O }.I.I.I.I.I.I.Q.I.+.Q.Q.& Q.Q.I.Q.Q.+.& I.& & & & & & 5+5+5+$.$.1+1+1+$.$.1+$.1+$.5+5+5+$.5+$.5+$.$.5+5+$.5+& & I.+.I.Q.& I.+.Q.Q.+.I.I.I.5+I.& Q.Q.5+& Q.I.O O x+|+K.S K.|+o.e+,+Y.h+h+H s.H s.M.H.M.'+'+}+'+}+M.M.3.3.f ]+~ ]+]+~ ]+G ]+G+@.1 c+]+@.H+H+}+f H.N.#+L.Y.H p.p.g Y.Y.Y.L.g g h+g h+h+h+h+g g V J U [ d+3 K @ } d q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", ") 4.4.4.-+-.-+4.4.-.-.q+4.-.1.u 1.1.1.u 1.1.1.1.1.1.u u 1.1.u 1.1.1.1.1.1.-.1.1.1.1.1.1.1.1.1.u 1.1.1.1.u 1.u u 1.1.1.u 9.u u 1.-.-.4.4.4.-.-.-.-.-.4.4.q+q+`.&.&.&.&.D c+)+n >+8.C+G.f+i+++#.^.^.r+++E+s.}+'+s.s.G ^+r ^+6 a K. . .g.[.[.|.] |.|.|.|.|.|.|.|.|.|.|.|.g+|.|.|.|.|.|.|.|.|.[.: k.|.|.|.|.k.|.k.|.|.k.~+> h.;.;.;.;.;.;.h.}.l+7+7+7+7+7+7+7+,.,.w+,.7+,.7+7+,.,.,.,.,.,.Y.g p.H L.L.C.C.[+9+9+9+,+/+/+t.'.Q.I.o.o.o.O D.D.|+].K.K.K.: : [.k.|.k.B+B+D+Q Q D+0.0.0.0.0.D+D+D+&+B+k.|.|.[.[.[.: : : K.K.K.|+].|+x+|+D.O s o.s I.o.o.I.I.I.I.Q.Q.+.I.Q.I.I.I.I.I.I.+.& & & $.$.1+1+$.1+ + +$.1+5+$.1+$.$.$.& & $.$.$.1+$.e.& & I.& Q.+.I.I.+.Q.I.I.I.Q.I.Q.}.& I.+.I.Q.Q.Q.+.I.I.O O > D.x+O Q._ #+E+}+}+'+s.}+H H '+H.'+E+H H '+'+E+f f 3.f 3.c+]+]+]+~ G G (.]+@.@.c+1 @.1 E+f E+E+w H L.Y.L.Y.p.Y.Y.Y.Y.L.g L.g g h+g h+h+h+g g J m P d+3 {.@ } d d Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "4.) ) ) 4.4.-.-.1.-.4.) 4.1.u u u u 1.1.1.1.-.-.-.-.1.1.1.1.1.u 1.1.u 1.1.u 1.1.1.-.1.1.1.u u 1.1.1.1.u -.u u 1.u -.1.1.1.u 1.-.-.4.4.-.q+4.4.-.-.-.) ) 4.4.4.`.&.`.`.&.i+( 9 >+D k+*+f+W 3+G+'+R.q.a+^.7.a+s.'+#+G+2 r ^ G O : l.U.y+g+[.[.|.|.|.|.|.|.|.|.|.|.|.|.|.[.[.|.|.|.|.|.|.[.[.: [.|.k.7 |.|.|.|.|.7 |.k.0+> ;.=.=.=.%.;.;.h.+.l+7+,.7+7+7+7+7+,.H ^.w+7+7+7+7+,.7+,.,.,.Y.Y.Y.Y.L.Y.p.C.,+,+,+/+'.[+'.t.Q.Q.0 Q.w.o.O O D.|+].|+K.S K.: : : [.k.B+B+D+B+D+Q 0.0.0.t+t+0.. . 0.0.0.Q 0.Q Q &+T.k.|.[.|.~+: : K.r.S ].S x ].|+D.D.O s o.s I.o.w.s I.I.I.+.Q.5+I.& Q.& I.& 5+5+5+5+$.1+1+1+ +5+5+$.e.$.$.& 5+$.5+5+1+5+$.5+& & & & I.I.& & I.Q.I.I.+.I.I.+.I.Q.I.Q.Q.Q.& Q.Q.Q.& I.& & $.1+1+R a+B.++J.J.A+++k+B.]+^.@.a+}+}+}+3.N.s.'+f f E+f 5 3.n.]+]+]+(.6 G (.G+c+G+G+c+@.1 E+H+E+H.#+#+#+L.p.L.Y.p.p.C.L.Y.Y.- h+h+g g g h+u+g g Y.U F+$+K F.@ ] d q q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "q+4.-+4.4.4.-.4.4.4.4.4.1.u 1.1.u u 1.1.u u 1.1.1.1.-.1.u 1.-.-.-.1.1.1.1.1.1.1.1.-.1.1.1.1.u u u 1.1.u u u u 1.1.1.-.1.1.1.1.-.q+-.4.-.4.4.4.4.4.) ) 4.) `.) ) ) ) `.z 9 9 D D b+D f+>+b+G H+w '+'+a+^.a+)+)+X L.G+r 2 k+2 : : l.g.o.[.|.|.|.|.|.|.|.|.|.|.|.g+B+|.|.|.[.|.|.|.[.[.[.|.[.[.|.|.k.|.[.[.|.7 |.|.|.k.g+> h.=.=.=.=.%.;.%.r H.p.7+7+7+7+7+7+7+,.p.7+,.,.,.7+,.7+,.,.,.,.Y.Y.C.p.C.,+,+w+/+/+/+t.t.t.'.Q.0 Q.0 w.o.s D.D.D.|+|+K.K.K.: ~+k.[.|.T.B+B+Q D+Q D+t+0.. 0.0.0.. . . . . t+0.0.0.Q D+D+&+B+|.|.|.[.: ~+: K.K.K.K.K.].|+|+x+|+g.D.O o.o.o.o.o.o.I.}.I.I.& I.& +.& $.5+5+$.$.$.$.$.$.5+5+& $.5+& 5+& & $.5+e.e.$.5++.& & I.I.& I.I.I.I.I.I.I.I.+.I.+.I.I.Q.I.Q.Q.Q.& +n+H H.@.G+B.i ;+:+>.E E = z 9 o+D 3+++B.! a+'+}+s.H s.f E+f f f 1 G+]+]+6 ; ]+G ]+c+G+G+c+G+G+1 @.H+E+w #+L.L.L.p.L.p.Y.9+p.Y.g Y.g - g - h+- h+g g g ,.F+$+' {.@ ] } d d q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "4.4.) ) 4.-.-.-.-.4.-.-.-.u 1.1.u u u 9.u u u 1.-.-.-.-.1.1.-.-.1.1.u 1.-.1.1.u -.1.1.1.1.1.1.-.-.-.-.1.1.u 1.-.-.-.-.-.-.1.-.-.-.4.4.q+q+4.4.4.q+4.-.-.-.4.) ) `.) `.&.9 9 z (+b+o+i+b+++A+8.i.}+}+a+4+a+4+o w #+1 2 2 W D.: |.l.<+g.g+|.[.|.|.&+|.&+|.|.|.|.|.g+|.[.[.|.g+[.[.g+: |.[.|.[.|.|.|.|.[.[.|.|.|.|.|.[.g+> r =.=.=.=.%.%.%.;.a l+7+7+7+7+,.7+7+7+7+7+7+7+7+7+,.,.,.,.,.Y.,.,.Y.C.C.w+/+/+l+l+/+/+'.t.0 '.Q.0 I.o.w.o.O D.|+|+].K.K.: : : : |.k.T.B+B+D+Q Q 0.0.0.t+. . . . . . . . . . . . . . 0.t+Q D+Q D+&+B+|.[.|.[.: : : K.r.K.K.].].].U.|+x+D.D.s D.s w.w.}.}.I.I.Q.& Q.& t.5+$.5+1+$.5+$.& 5+& & & & & & 5+$.5+$.$.$.5+& Q.& I.+.I.+.I.+.I.Q.Q.I.I.Q.I.I.I.I.Q.Q.Q.Q. +M 4+^.^.2.J.;+:+u.E A 8 !.!.8 !.8 { 4.z f+b+B..+H s.H s.s.s.s.f f f 1 n.]+]+G ; ]+; ]+]+c+G+G+c+G+G+@.}+H.N.#+#+m.C.p.Y.p.Y.9+Y.Y.Y.Y.g L.g g g - g Y.Y.U F+).K K @ @ ] ] d d q Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "4.q+4.4.-.q+q+4.-.4.-.u 1.-.-.-.1.1.1.1.u u u 1.-.-.-.1.1.u 1.u u 1.u u 1.1.-.1.-.1.1.1.1.-.q+-.1.-.-.4.q+-.-.-.1.-.q+1.-.1.-.-.-.-.{ -.4.q+-.4.q+-.-.-.-.4.4.`.&.{+z &.z 9 9 z 9 z i+(+o+>+_.k+#.S.q.o s.w 2.++H+@.2 c+5 : : [.: y+x+: |.|.|.|.g+B+|.|.&+|.g+|.|.g+g+g+g+[.[.[.|.: [.[.[.[.[.~+[.|.|.[.|.|.|.[.|.[.g+> C ;.%.=.=.%.=.%.%.r t.7+7+,.7+7+7+7+7+,.7+,.,.,.,.7+,.,.,.,.,.Y.C.Y.,.C.w+/+w+/+/+l+'.t.'.j Q.Q.0 I.w.o.o.O D.x+|+].S K.K.: [.~+|.|.T.B+B+D+D+Q Q t+0.0.0.. . . . . . . . . . . . . . . . 0.t+0.t+0.Q &+&+B+k.|.k.[.[.: : .K.K.K.K.K.].].x+|+x+|+e O O w.}.w.I.Q.+.Q.Q.& & 5+$.Q.Q.& & I.Q.+.& Q.& & 5+e.e.5+$.& & & +.Q.I.I.I.I.I.I.I.I.I.I.Q.Q.Q.& I.5+I.Q.Q.*.P.^.2.2.7.b.p+>.= A 8 u 9.9.9.9.9.9.9.!.~.z G.B.a+'+H H s.s.X X f f f 1 ]+; G ]+(.]+; G ]+1 G+c+]+@.@.3.f E+#+#+#+L.p.9+9+L.9+C.9+C.C.g 9+g Y.L.Y.Y.Y.m 7+d+$+K {.@ @ ] ] d d q q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "-.-.4.4.4.4.-.4.4.-+4.-.1.1.1.1.1.1.1.1.1.1.1.-.-.-.1.u u 1.-.-.1.1.q+-.1.-.-.-.1.1.1.-.-.-.1.u u u q+-.-.-.q+-.1.1.-.1.1.-.-.-.4.) 4.q+-.-.4.-.-.-.-.4.q+4.) `.`.&.&.{+D A+o+9 9 &.9 i+( ( i+++B._.i.B.i.1 C+5.G H+2 6 }.~+[.|.: <+g.g+g+|.|.|.7 g+B+g+|.|.] g+[.g+W.> W.g+s e.g+[.[.: [.[.[.[.[.[.[.[.[.l.|.[.m+L e+}.<.h.;.%.=.=.%.%.%._+1+7+7+7+7+7+7+7+7+7+,.,.p.,.,.m 7+,.,.,.,.Y.,.C.C.C.,+l+l+l+'./+l+t.t.t.0 Q.Q.0 w.o.O s D.|+|+S K.K.: : : [.|.k.k.&+&+Q 0.D+0.0.0.0.. 0.0.. . . . . . . . . . . . . . . . . . 0.. . 0.t+Q D+B+&+T.T.k.|.|.[.[.: : K.r.K.K.x ].|+|+x+D.e O O o.w.I.I.I.I.Q.Q.& Q.Q.I.Q.+.Q.& & & & & & $.$.5+& I.& Q.+.Q.+.I.I.+.I.I.I.Q.I.I.I.I.I.Q.I.Q.& 5+n+4+C+i 7.;+:+p+s+A 8 !.9.9.9.9.9.9.9.9.9.9.A >.b+^.s.L.L.H #+s.s.X f 5 f c+G W G 6 ]+G 6 ]+G+]+c+]+]+1 H+H+}+w #+L.L.L.L.p.9+p.L.Y.L.L.9+Y.L.C.Y.Y.Y.C.J P v p K {.@ @ ] } } d d q Q 0.0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "4.-.-.-.-.4.-.4.q+4.-.u 1.u u u q+4.1.1.q+-.1.-.-.-.-.-.-.1.u u u 1.1.4.1.q+1.-.1.1.1.-.-.-.1.1.1.u 1.1.u u 1.q+q+-.-.1.q+q+-.-.4.) -+-.4.-.-.-.-.-.-.-.4.4.4.) `.&.`.9 i+(+o+9 z &.&.i+D o+( 8.++b+b+8.b+b+o+b+H+H.G+(.].: [.[. .g.L r.g+g+|.|.|.|.] |.|.g+g+g+r.}.&.q+{+=+|+K.~+[.[.: [.[.[.[.l.[.[.l.l.[. .L e+w+l+0 <.r ;.%.=.=.=.=.%.%.r l+7+7+7+7+,.,.H 7+7+'+g 7+7+7+,.m ,.Y.,.Y.,.C.C.,.C./+w+/+l+/+'.t.j t.Q.0 Q.I.o.o.o.D.O x+U.|+S K.S : : [.|.k.7 B+B+&+Q Q 0.t+0.t+. . . . . . . . . . . . . . . . . . . . . . . . . . 0.t+0.t+0.D+D+q T.|.B+|.|.|.[.: : : : K.K.K.S ].|+|+D.O D.s o.O }.w.}.I.I.I.I.+.I.Q.& & & & 5+& 5+& & Q.+.Q.I.I.+.I.I.I.I.Q.I.I.I.Q.+.I.I.Q.I.I.Q.$.n+4+i :.:.*+p+>.s+8 !.9.9.9.9.9.9.9.9.9.9.9.!.E o+B.'+#+L.H #+s.E+#+s.f f c+G ; G 6 (.G 6 ]+G+G+]+]+]+@.H+f }+s.#+#+#+m.H #+L.L.9+9+9+Y.9+C.Y.Y.Y.k C.J w+F+$+p @ @ ] ] ] } d d d q Q . 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "-.-.-.-.-.-.q+q+{ u u -.1.1.-.4.4.-.1.1.4.-.-.-.1.u -.-.1.u u u -+{ -.1.-.-.-.u -.1.-.-.-.1.-.1.-.u u u u u u -.4.q+-.4.4.-.4.4.-.4.) 4.-+-.-.4.-.-.4.4.4.4.4.4.-+) `.9 f+9 9 >+9 -+>+b+D b+J.f+(+b+o+D A+J.D G+}+'+i.5 K.: [.[.: U.|+r.r.g+[.g+|.|.g+|.|.[.r.1 +. +z i+Z x+S K.K.: : |.: [.|.[.[.[.m+r.r.3 d+7+w+7+7+l+}.C ;.;.=.=.h =.=.%.^+t.7+7+7+7+7+7+,.7+7+,.7+,.m ,.,.,.,.,.,.,.Y.C.C.C.w+w+l+/+/+'.l+'.t.Q.'.0 0 Q.w.w.o.O D.|+|+].K.K. .~+: [.[.|.B+&+&+Q D+D+Q 0.0.0.0.t+. 0.. 0.. . . . . . . . . . . . . . . . . . . . . . . 0.. . . 0.0.0.D+0.B+&+B+k.|.[.[.[.: ~+K.g+K.K.W.].|+|+x+D.D.O D.O s w.s o.I.I.I.I.& & & & Q.& I.I.Q.+.+.I.I.I.+.I.I.I.I.& I.I.I.I.5+I.Q.Q.I. +z+^.C+J.;+:+p+= x.A !.9.9.9.9.9.9.9.9.9.9.9.9.~.f+++}+H L.L.#+#+s.s.w E+f ]+; G G G G G G ]+]+]+c+]+G+@.3.f }+H #+#+H #+L.#+m.#+#+#+#+m.#+L.L.C.C.Y.C.w+j [ 3 K @ @ ] ] } d d d q Q Q Q 0.0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "`.4.4.4.4.4.-.4.4.1.u -.4.-.u 9.1.1.-.1.-.q+-.-.-.-.1.-.1.1.-.-.) -.-.-.-.-.-.1.-.-.1.1.-.1.-.u 1.-.1.u u u 1.1.-.4.) 4.) 4.-.4.4.4.) ) ) -.-.4.-.-.) `.4.4.4.4.) ) `.&.9 z 9 >+9 z i+>+( W B.^.r+J.A+)+B.C+_.]+E+}+! $.K.: : l.r.U.x+x .g+g+l.|.|.|.g+[.g+U.C+|+U.2+x S x |+e S g+ .: K.[.|.[.l.m+y+e+7+e+7+7+w+7+w+7+Q.C r ;.%.=.h =.=.=.;.1+e+e+7+7+7+7+7+7+7+7+7+7+7+7+7+,.,.,.,.,.,.C.C.C.w+w+/+l+/+t.'.'.'.t.Q.Q.0 I.o.o.o.D.O D.|+|+K.S .: ~+~+|.|.k.B+B+Q Q D+0.0.0.. 0.0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0.. t+. t+0.Q Q B+B+B+|.|.|.0+: : : g+K.K.K.K.].|+|+x+|+D.D.O s O I.}.I.I.I.+.Q.Q.Q.Q.Q.Q.Q.I.+.I.I.I.I.I.I.+.I.5+I.I.Q.I.I.Q.I. +z+4+i ;+*+:+N = x.8 !.9.9.9.9.9.9.9.9.9.9.9.9.{ u.A+B L.h+H H L.s.s.E+E+c+]+G G ; G G G ]+]+S.]+]+]+G+G+3.f }+s.H #+#+#+w H.E+P.w b w m.- 9+#+- 9+C.J l+0 j.3 {.@ @ d } d d d q q Q 0.0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "q+4.-.q+4.-.-.-.-+4.4.4.{ u u u u u 1.-.-.-.-.-.-.-.q+-.1.-.-.`.-.1.1.1.1.1.1.-.1.1.1.1.1.-.1.1.-.1.1.1.u 1.u 1.-.q+`.) &.4.4.q+-.q+) &.`.-+4.-.-.q+) `.`.) -.4.) &.`.&.&.&.&.9 f+9 z i+D 8.B.o J.D k+6 n 8.k+k+#.G+! I.S r.: : K.].|+r. .r.g+g+g+l.g+[.[.[. .r.S K.K.K.K.K.K.|+].K.K.: : : |.k.l.[ ,.'+w+l+7+w+C.7+7+l+t.+.r ;.%.%.h h =.%.%.r 7+7+7+7+7+7+7+7+,.7+7+,.7+,.,.7+,.,.,.C.C.C.C.C.w+w+l+/+l+/+t.j t.Q.'.0 Q.0 I.w.o.O D.|+|+].S S : : : [.|.k.k.B+&+D+D+Q 0.t+0.t+. . t+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . t+0.t+t+0.Q B+B+B+|.k.[.[.~+: .g+r.K.r.].S ].|+x+D.D.O s w.s I.I.I.I.I.w.I.I.I.I.I.I.+.I.I.Q.I.I.}.Q.I.I.I.I.I.}. +p.4+C+J.*+p+N x.~.A !.9.9.9.9.9.9.9.9.9.9.9.9.{ f+++}+s.L.#+#+s.H w f E+c+G G G ]+6 G W ]+G+]+]+]+]+S.3.a+3.s.H L.L.w P.P.1 1 G+c+1 1 P.P.w m.m.9+,+,+w+[ j.K F.@ } } d d d q Q 0.0.0.0.0.0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "4.-.-.-.4.-.4.-.4.4.q+-.-.u u 1.-.-.q+-.1.-.-.-.-.4.4.-.1.-.1.-.1.-.1.-.1.1.u -.1.1.1.1.1.1.-.1.1.1.-.-.1.1.1.1.-.-.) q+-.-.-.4.4.4.4.4.4.) 4.4.4.4.`.`.`.4.q+q+) `.&.&.9 &.9 i+z 9 9 9 >+8.8.]+4+B.;+8.o+b+b+b+k+B.G+w.|+K.r.: : K.].K.r. .l.g+g+l.g+[.[.[.: .g+K.K.K.K.K.K.].|+K.K.: [.: : |.: 3 e+w+7+7+7+7+7+7+7+w+l+Q.+.h.;.=.=.=.=.=.%.^+Q.7+7+7+7+7+7+7+7+7+7+7+7+7+,.7+,.,.,.,.C.,.C.C.,+w+l+w+/+l+'.t.l+j Q.Q.Q.0 w.o.o.O D.x+|+|+].K.K.: : ~+[.k.k.B+B+q D+Q Q 0.t+0.0.. 0.. 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . t+t+0.D+D+B+&+B+k.|.k.[.|.: : : .r. .r.K.S |+|+|+D.D.O O o.O }.w.I.I.I.I.I.I.I.I.I.I.I.Q.I.I.Q.Q.}.w.I.I.5+z+4+r+;+:+p+= x.A 8 !.9.9.9.9.9.9.9.9.9.9.9.9.{ f+C+N.H L.h+H #+s.s.'+E+c+G ; G G W G G G ]+G+]+]+]+! 3.3.a+s.s.s.w w 1 1 c+c+c+c+c+c+1 1 P.P.n+R 9+,+/+0 j.{.@ ] } d d d q q q Q 0.0.0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", ") 4.4.4.-.-.-.4.-.-.u u -.-.1.-.1.1.-.-.-.-.-.-.q+4.-.-.-.1.u u 1.1.-.1.1.1.1.u 1.1.1.1.1.1.-.-.-.-.1.-.1.1.-.-.-.q+-.-.-.-.-.-.-.q+4.) &.&.&.&.) 4.`.&.) 4.4.4.4.`.) `.&.&.i+9 9 9 9 9 9 ( (+++#.B.^.B.)+^.2.++! i.G+<.|+K.K.: K.K.K. .g+: g+m+g+l.g+[.|.|.|.[.x+S K.: .K.K.K.].].|+K.: [.[.g+[.: 3 7+7+,.7+7+w+7+w+7+w+/+C r ;.%.%.h =.=.%.h.t.7+7+7+7+7+7+7+7+7+7+7+,.7+,.,.,.,.,.C.,.C.C.C.C.,+,.l+t./+l+t.t.Q.'.Q.0 I.o.w.o.s O x+|+].K.S : K.: : |.|.k.B+&+q D+D+0.0.0.0.. 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . t+0.0.Q &+q B+B+k.k.k.[.[.: : g+r.K.S ].|+U.x+x+D.D.D.O y+O o.w.o.o.I.I.I.I.}.I.I.I.I.I.s O w.Q.n+B C+:.:+N s+A 8 !.!.9.9.9.9.9.9.9.9.9.9.9.9.x.o+B.'+L.H #+H s.s.w E+@.]+]+G G G ; G G ]+]+]+]+o G+S.@.}+f H.#+b w P.1 1 1 c+^ ^ ^ 1 ^ 1 1 P.5 #+,+,+j [ L .@ } d d d Q q Q Q Q 0.. . 0.0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "-+4.4.4.4.4.4.4.-.-.1.1.) -+-.-.-.4.q+-.-.-.-.-.4.-.1.u u u 1.1.1.1.1.-.1.u 1.1.1.1.1.1.-.1.-.1.-.-.1.1.u 1.-.4.4.1.1.-.-.-.-.-.-.-.4.&.`.&.9 &.`.`.`.`.`.4.) `.) `.&.`.) -+9 &.9 9 ( 9 9 9 i+8.G i.^.++A+_._..+#.B.G+w.|+K.K.K.K. .: K.K. .g+ .g+: l.|.[.k.|.[.Q.& S g+K.K.g+K.K.K.|+U.K.l.[.[.: |.l.v e+7+7+7+7+7+7+7+7+l+ ++.;.%.%.=.=.=.=.%.e.l+7+7+7+7+7+7+7+7+7+7+7+7+7+7+,.C.,.C.,.C.,.,.C.,+C.,.l+/+'.l+'.t.Q.0 Q.Q.w.o.o.D.D.D.|+|+].K.K.~+: [.k.|.k.B+&+q D+B+~+g+K.|+O O O e K.K.k.B+t+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . t+t+0.Q D+B+B+B+k.|.[.k.: : : : K.K.K.K.].|+].|+x+x+D.D.O s O o.o.o.I.o.I.}.w.w.O O O I.*.B C+;+:+= s+8 8 !.9.9.9.9.9.9.9.9.9.9.9.9.u E b+)+H H h+L.L.H '+s.f @.6 G ; G G G W G ]+c+]+]+o G+S.S.3.3.'+#+w P.P.5 ^ !+^ !+^+^+5 ^ ^ 5 5 P.b n+/+j [ 3 l @ ] d d d d d q q Q Q 0.. 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", ") ) ) 4.4.4.-.-.4.4.4.4.4.q+-+4.-.-.4.-.-.4.4.-.-.-.u u u u 1.1.1.u 1.1.1.-.u 1.1.1.1.-.u 1.u -.1.1.-.-.-.-.-.4.-.-.-.1.-.-.-.-.-.-.4.q+&.-+) &.9 `.&.&.&.-+4.) &.&.`.&.`.`.&.9 9 9 >+D ( 9 9 9 (+++++B.++J.++r+++G+G+<.|+K.K.K.: K.K. .: K.K.: : : g+[.[.|.|.[.r.z.+.S : K.K.S K.S K.K.: g+[.[.: g+l.r.l+'+/+7+7+7+7+7+7+w+ ++.r %.%.=.h h =.%.r 7+7+7+7+7+7+d.7+7+7+7+7+,.,.,.,.w+C.,.C.C.C.C.C.C.,+,+C.,+w+t.j '.'.'.0 0 I.w.O o.O D.|+|+S K.S .: : [.|.: & X.c.9 i+i+c.8.k+(.(.(.(.; 6 8.8.j+8.W 6 b I.: . . . . . . . . . &+q &+q &+q &+q &+q &+q &+q &+q D+B+q D+B+q D+B+q &+q D+B+B+&+B+&+B+B+T.q t+t+0.0.Q &+: g+: S K.K.K.].|+K. .K.r.].S U.].x+U.D.D.D.D.O s D.O e o.I.I.I.& z+X.C+*+p+= A 8 !.9.9.9.9.9.9.9.9.9.9.9.9.9.1.z b+.+'+H H H H #+#+f E+G+G W G W _.W W G ! ]+o ]+! ! S.a+3.'+E+s.w H.P.^ 5 ^ ^+^ ^+!+^+^+2 ^+5 5 b z.[+t.0 3 F.@ } } } d d d d q d q q Q 0.Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "q+4.4.) ) ) 4.4.4.-.4.4.-.-.-.4.4.4.q+-.-.-.-.-.-.-+-.1.u 1.-.1.1.-.-.1.1.-.1.1.1.1.1.-.-.-.u -.-.1.1.1.-.-.-.-.-.1.4.&.-.-.-.-.4.q+4.q+`.`.4.) &.&.&.&.&.&.`.`.&.&.&.9 &.&.&.9 D ( i+i+( 9 9 D G B.B.E+'+4+C+D 5.G G++.|+K.: K. .: : .: : .: : g+[.[.~+[.[.[.[.L R +.S K.K.K.x |+S K.g+ .: |.[.g+: l.2+w+7+7+7+7+7+7+7+7+l+Q.T ;.%.%.h Z.=.=.^+t.7+7+7+7+7+7+7+7+,.,.7+7+7+,.,.,.w+,.,.Y.C.C.C.C.C.C.C.,+C./+/+'.t.'.Q.0 I.o.o.O D.D.|+|+].K.K.~+: K.z.i+`.j+!+}.2+2+e g.| | e e e 2+2+| 2+e e | 2+g.+.!+c+W 6 1 t+. . . . . 4.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.!+Q . t+. t+0.c D c.c.c.c.c.c.c.!+: l.: .g+K. .].S U.U.|+2+|+g.x+x+O ( 9 c.c.c.c.D c.k+*+s+A 8 !.q+c.c.D c.c.c.c.c.9 9.9.9.{ f+++4+H H h+H '+h+#+f @.z i+(+(+(+(+(+(+; f ]+! ]+3.G+3.3.3.}+E+#+w E+b 5 (.q+c.c.c.c.c.8.r !+^+2 b z+_ 0 j.L F.@ ] d ] } } ] ] 7 ] } 7 q Q q Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "-.4.) ) 4.4.4.4.4.4.-.-.4.4.4.q+4.-.4.-.-.1.1.1.1.1.-.q+-.1.-.u 1.1.1.1.1.-.-.-.u -.u 1.1.1.1.1.1.-.-.-.-.-.-.-.4.-.-.) -.4.-.-.-.-.4.4.4.`.4.q+`.( 9 `.`.`.`.&.9 9 9 z 9 9 ( >+i+i+9 >+9 z 9 i+j+G+}+s.a+)+n G.k+b+G e.|+S K.: K.: : : : K.: : l.: : : [.~+|.|.|.[. .R & |+S K.].S K.K. .: [.[.: : r.[.l.U.d+7+7+O.7+7+P 7+7+0 <.h.%.%.=.h h =.;.[+l+7+7+e+7+7+7+7+7+7+7+7+,.7+,.w+,.C.C.C.C.Y.Y.C.C.k C.C.k k _ ,+/+'.'.Q.0 0 w.o.O D.x+x+S K.K.K.c+) c.e.e 2+2+2+| | 2+e 2+g.e e g.2+2+2+| g.e 2+2+e g.g.2+2+| 2+g+. . . . . i+2+2+2+| 2+e 2+2+g.e e 2+2+2+| 2+e 2+2+g.e e 2+2+2+| | g.2+2+g.e e 2+2+2+B+. . . . . c.e 2+2+2+| | g.2+2+[.k.|.|.[.: : : K.K.K.].K.].].].2+8.i+e g.2+2+g.e e 5+*+s+8 !.9.q+2+e e e 2+2+| | }.u 9.9.-+D C+B '+H s.H H s.s.f 1 q+e 2+|+| |+D.2+|+T G+]+]+S.! 3.S.}+3.'+s.b H.P.b c.X.| g.g.2+g.e r 2 2 5 2 z.y.'.y+3 {.@ ] ] } @ m+F.K.l . . .l.] 7 d Q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "4.q+q+4.4.4.4.4.4.4.4.-.q+4.-.-.-.u 4.-.-.-.1.-.-.-.-.1.1.9.u 9.u u u -.1.-.-.-.-.-.u 1.-.-.1.1.-.-.-.1.-.-.4.-.-.1.-.-.-.q+-.-.-.-.4.4.4.q+4.4.`.9 &.) `.&.{+z &.i+D o+f+9 9 9 9 9 ( D >+( f+( i+8.]+)+J.(+8.G.G .+#.a O K.K.g+K.: .: : K.K.K.: : [.: : ~+[.|.|.[.[.: o.x+|+S K.].K.S K.g+g+: : l.| e : .3 e+7+e+7+F+7+7+e+l+I.T h.%.=.h Z.=.%.1+e+7+7+e+7+7+7+7+7+7+7+7+7+7+,.w+,.,.,.Y.C.C.Y.L.C.9+9+9+9+9+9+_ _ /+/+'.Q.0 o.o.o.D.x+|+|+K.*.) c.}.e 2+e e g.e e e e e e g.2+g.g.g.e e e e e e e 2+2+g.g.e e e W.. . . . . >+g.e e e e e e e g.2+e 2+e e e e e e g.g.2+e g.e e e e e e g.g.2+g.g.e e B+. . . . . c.e g.e e e e e e e D+D+B+B+B+k.|.|.|.: : : : K.: g+G+&.}.e g.e g.2+g.W.t+}.x.8 !.9.9.}.g.2+e g.s e e e (.9.u `.b+)+H '+H s.H s.H.w f G {+g.e s e e e e e x E+G+! 3.S.3.3.a+3.H '+w w 5 !+&.e.e e e e g.| t+2 2 b 5 z.[+j v l l @ ] ] l.l L L |+O x+O |+|+ .[.] d q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", ") 4.{ 4.4.q+q+) -.-.q+{ -.1.u 1.1.-.4.q+-.-.4.-.4.4.1.-.-.u u 4.1.u 1.1.1.1.-.-.1.u 1.1.1.u 1.-.1.1.1.-.-.-.-.-.-.-.-.-.4.-.-.-.4.q+4.q+4.4.4.) ) 9 z ) 4.9 9 9 ( (+k+^.J.o+9 9 &.&.9 >+D D D >+9 D 6 ++b+A+J.b+n Z ]+z.C |+K. .: . .: : K.U.S K.: : : [.: : 0+|.|.[.[.: D.> ].S S K.K.K.r. .: : : K.L g+[.m+<+F+7+7+e+7+7+7+e+e++.h.%.=.=.Z.y %.r e+7+7+7+7+7+7+7+7+7+7+7+7+,.w+,.,.,.C.C.C.Y.Y.Y.L.L.L.L.L.- 9+- k _ U $.'.'.Q.0 w.o.D.x+x+6 ) !+g.e g.| 2+2+g.}.}.}.g.2+e g.| 2+2+2+}.}.}.g.2+e e | 2+2+2+}.}.}.W.. . . . . >+2+e }.}.e 2+g.g.2+2+2+2+e }.}.e 2+g.e 2+2+2+2+g.}.}.e g.2+e 2+2+2+2+g.}.k.. . . . . c.2+2+2+}.}.s g.2+e D+0.t+0.Q Q Q B+B+B+k.|.[.[.: e.q+T e g.2+e g.| | t+r.p+~.!.9.9.9.1 | 2+2+2+e }.}.g.+.9.1.u.b+.+'+H '+H s.H M.}+P.b+W 2+e }.}.e 2+e <+> $.G+S.3.S.a+@.a+a+a+H+s.w H.P.q+}.e g.2+e 2+W.|.2 2 2 z.z.*.Q.j.L F.@ @ @ {.3 O O j.w.w.w.6+O |+K.: ] d q Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "`.`.4.4.4.4.4.4.-.1.-.-.u -.-.u u -.4.-.4.-.q+&.4.u u 9.u -.q+-.1.u u -.1.1.-.-.1.1.-.1.-.u u 1.-.-.-.-.-.-.-.q+-.1.-.-.4.4.-.-.-.-.4.4.4.q+4.q+`.&.`.`.4.&.i+9 (+k+k+C+++G.&.z &.9 9 ( (+A+*+9 >+i+D 8.4+i B.B.7.G.6 P.& > S .: : : : [.: : K.: : : : [.[.: : [.|.[.|.[.r.I.O S K.S K.: K.K.r.: : l.: .[.l.r.$+7+7+7+w+w+7+l+e+0 T h.=.=.h h =.^+0 7+7+e+7+F+7+7+7+7+7+,.7+,.7+,.,.,.,.Y.,.Y.C.Y.g Y.L.- L.#+L.L.L.R C.k _ _ '.0 0 w.j.O < {+}.g+| e g.2+2+| 2+}.e e x | e g.2+2+| | }.e e | | g.e 2+2+| | s e e g+. . . . . o+| s }.g.2+| g.g.2+2+2+| e e s 2+| g.e 2+2+2+| e }.e 2+| 2+e 2+2+2+| e s B+. . . . . c.2+| g.s e 2+| 2+g.D+. . . t+0.t+t+Q Q B+D+B+B+s q+e.}.e W.| e g.| &+k.A+z A !.9.9.9.c.g.2+2+2+s e e | g+1.4.f+C+4+H H s.H H #+#+}+@.&.a | e e s 2+r.g.e 2+w.G+3.3.S.a+R.! ^.R.^.S.H.E+k+i+e 2+| 2+e 2+k.2+5 2 2 z+z._ 0 L l F.m+] m+L L j.w.w.$.$.$.& w.O |+K.: } d q Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "4.4.) 4.q+{ 1.q+-.4.) { 4.4.u 1.q+q+4.-.q+4.&.&.`.4.-.q+-.-.u u u u u u 1.q+-.u 1.-.1.-.-.1.1.1.1.1.1.1.-.-.-.1.-.-.4.-.4.-.4.-.-.4.4.-.4.4.q+q+`.&.) `.`.&.i+D k+#.)+i J.G.z &.&.9 i+D 8.++A+G.( 9 >+_.P.H..+@.^.7.< c+R w.O : [.~+: : : [.: : ~+: [.: : : [.: : ~+|.|.[.[.<+b O S K.K.K. .K.K.K.g+: : [.r.[.l.U.v 7+7+Y.w+7+7+7+e++.^+%.=.h h =.h.5+e+F+7+e+e+O.7+7+7+7+7+7+,.7+,.,.Y.C.,.Y.Y.Y.L.L.L.L.s.s.s.#+#+#+- R k k _ _ '.'.Q.0 b+9 g.| | 2+g.g.2+g.| g.g.| | | 2+e 2+| | g+W.2+W.| | 2+2+2+e g.2+2+e 2+2+g+. . . . . >+2+g.| | | | 2+g.2+e 2+2+s 2+| | | 2+g.2+e 2+| e 2+2+| | 2+2+g.e 2+| e 2+&+. . . . . c.2+| e 2+2+| | 2+2+D+. . . . . . 0.. 0.t+0.Q g+) !+g.| | | 2+e 2+&+0.X.f+E 8 9.9.9.9.q+e e | 2+e 2+2+| 2+(+-+G.C+B H '+#+H w s.'+E+X.) e 2+e 2+| x 2+2+2+2+|+S.H+f f S.^.R.2.B.2.r+B.)+9 !+| | | 2+e e t+& b 5 b b z.*.Q.o.l m+@ l.l.l O j.w.& $._ T _ C w.O ]. .[.} q Q Q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "q+4.q+4.) 4.-.4.4.q+) -.-.-.-.u 1.-.4.4.4.`.`.`.-+) -.-.u u u u u 9.u 9.1.q+-.-.u 1.1.u u u 1.1.-.1.1.1.-.4.-.1.-.4.4.-.4.-.4.4.4.-.4.q+-.4.q+4.) ) `.) `.&.8.G @.B.)+B.b+D G.u.9 i+>+( i+D (+o+o+>+i+< ++3+D G+H+)+J.G P.I.O S [.~+: g+: [.: : ~+: : : ~+: : [.: : [.[.|.|.: Q.H+6+S K.K.: |+O S .: : : [.x : l.U.d+7+e+7+e+7+7+7+0 5+_+=.I h =.%.e.e+e+7+7+e+7+e+7+7+7+7+7+,.7+,.,.,.,.,.Y.Y.Y.g L.s.L.h+H * s.#+#+#+X 9+R k _ _ '.'._.&.e W.| | | | e e 2+2+}.g.x W.g+&+t+t+. . . . . . . t+&+k.g+2+e 2+}.e x x g+. . . . . e e e | x | | W.2+2+g.| g.}.2+x | | | g.e e 2+e e | g+| | | | 2+e 2+2+e 2+D+. . . . . c.g.2+}.2+x | | | 2+t+. . . . . . . . . . . &+9 ~ }.e x | | | | 0+t+N.G.z { 9.9.9.9.9.9.5+e 2+}.g.| x | | !+-+b+)+B H s.s.s.H s.E+H.G 9 | s s 2+x | | | 2+e W.E+}+}+a+3.! )+o 3+J.;+n J.{ }.W.| | | | 2+t+b z.P.b 5 R _ Q.o.].F.l.@ m+l L j.w.w.$.T _ z.& w.6+|+K.: ] d Q 0.Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "4.4.4.{ -.4.4.4.-.-.4.{ 4.-.4.-.4.) ) 4.) &.`.`.`.4.4.1.u u u u u 1.u 1.-.1.-.-.1.u 1.1.1.1.u 1.u -.-.u 1.u u q+-.1.1.-.1.-.4.-.-.q+4.-.4.-.-.q+4.) ) &.&.i+(+(+++i.B.8.8..+.+;+>+( D ++J.A+8.G.G.( ( 8.++b+b+k+A+G a+S.G+$.w.S .: ~+ .: : [.[.[.[.[.[.[.[.: : [.~+: [.: [.[.: s G+<.S K.: K.s w.S r. .: : l.g+[.r.U.e+7+e+F+e+e+e+l++.!+%.=.h h %.!+e+7+7+e+7+7+d.7+7+7+7+7+7+,.w+,.,.C.Y.,.g Y.L.h+h+'+s.M.'+s.M.M.s.X X - R k _ _ 1 q+e.g.x 2+2+g+2+2+e 2+e }.| &+. . . 0.Q Q 0.0.0.0.D+&+k.k.&+t+. t+&+W.2+x | g+. . . . . . . t+. . . t+. t+t+. t+t+P.}.| 2+x x 2+2+2+g.e . t+0.. t+t+t+t+. t+. t+. . . . . . . c.2+}.}.g.x 2+2+g+| D+. . . . . . . . . . 0.c.8.e }.e | | | g+g+. +D z { 9.9.9.9.9.9.9.X.2+2+}.s x | 2+x s z b+)+'+}+H N.s.}+s.H..+D ; e }.}.| x 2+x x 2+g.W. +E+s.}+a+)+r+3+*+*+*+:+o+&.2+x 2+| W.2+g+: b H+E+H+f E+X $.o.<+l m+l.@ l L O w.w.C & $.$.w.6+O ].K. .] } d q Q Q 0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", ") 4.-.-.q+4.q+-.-.-.q+-.q+-.4.4.) 4.4.4.`.&.`.-+) 4.4.-.u u -.u -.-.1.-.-.u 1.-.u 1.1.u u 1.1.1.u u 1.u u 1.u 1.-.1.1.-.-.-.-.-.-.-.4.-.4.4.4.) ) q+4.`.9 &.i+W #.B.b+o+i+8.i.J.++J.++6 #.J.8.A+b+o+9 (+++B.b+k+2.@.a+R.G 2 & O : S K.~+~+: [.[.[.[.~+: : [.[.: : ~+: [.: [.[.[.: e+X.> K.: : x Q.+.S g+: : |.l.: l.g+$+F+7+7+F+7+e+7+e+T h.=.h h =.h.5+e+7+F+e+O.e+7+7+7+7+7+7+7+7+,.,.,.Y.,.Y.L.L.h+h+'+'+}+a+a+}+}+f s.#+R R k _ k 4.!+}.2+x | 2+| e 2+2+2+e g+t+. B+[.[.[.|.|.B+B+|.|.[.r.S e o.+.I.s x k.t+t+k.0+D+&+t+t+. t+. . . . . . . . . . . . X.}.| 2+| | g.2+| 2+2+. . . . . . . . . . . . . . . . . . . c.2+e }.| | | 2+2+g.D+. . . . . . . . . . 6 i+2+e }.g.| | 2+g+. e G.z { !.9.9.9.9.9.9.9.i+| e }.e x | 2+| W.D ++.+'+'+s.'+H s.'+E+G+&.e.g.e s x | 2+x 2+g.| 2+w.H.E+'+! #.J.*+*+:+:+..E W | | | | | e &+}.E+@.]+6 o ]+f X _ j.L {.m+@ F.K L x+j.w.w.w.C w.O O ]. .: ] d d q Q Q Q 0.0.0.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "4.q+u q+4.4.4.4.4.-.4.q+{ ) 4.4.4.4.4.4.) q+4.4.-.4.-.-.1.u u u u u 1.1.u u u u 1.u 1.-.1.-.u 1.1.1.u u -.) -.-.-.-.-.-.-.-.) -.4.4.-.4.4.4.4.) ) q+-.`.&.D D 8.k+++>+G.( 8.G+C+i.^.#.++++++A+++A+*+9 i+D k+++#+L.L.L.H a+5 C w.|+ .: : : [.: |.[.|.: ~+[.[.: [. .: [.: ~+: [.|.|.: /+5 S : . .D.y.& ].: g+[.|.[.g+l.x v e+e+e+e+7+e+e+Q.!+%.=.h =.;.5+e+e+e+7+7+7+7+7+7+7+,.7+,.,.,.,.,.C.Y.g L.L.H s.'+'+'+a+a+R.a+@.S.f s.X k 9+b+c.| e 2+2+2+e e 2+| 2+| &+. B+r.r. . .l.[.[.] |.: K.|+O w.$.a b P.1 H+E+a }.r.D+|.: 0+T.D+D+D+t+t+t+. . . . . . . . X.}.2+g.e e 2+| 2+| W.. . . . . . . . . . . . . . . . . . . c.| 2+g.2+2+2+e e 2+D+. . . . . . . . . e.&.e 2+| g.2+2+2+2+t+r.A+f+E !.9.9.9.9.9.9.9.9.q+2+| 2+2+2+2+e e g.P.C+B }+H H E+'+H.E+}+X.q+e | g.e 2+2+g.e e 2+2+2+W.3.}+H+)+7.n *+..:+:+p+4.!+2+2+e s e e t+R @.#.8.n b+3+++o E+k 0 L {.m+m+ .l |+L O O O w.O O |+]. .l.l.} d q q Q Q Q Q 0.Q Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "4.4.-.) 4.4.4.4.4.-.4.q+-.-.4.4.4.-.q+4.-.-.-.4.4.) 4.-.1.u 1.1.1.1.1.q+q+4.-.u 1.u 1.-.u -.1.1.1.-.-.u u u u 1.1.-.-.q+4.4.4.-.-.4.-.-.q+4.) ) -+q+q+) &.>+(+D D >+(+>+&.D 6 ++i.S.B.B.H+^.C+B.X.J.( (+8._.G+R - 9+,+C.H E+r +.O : : : : : ~+[.[.: .|.[.[.l. .<+o.: : [.: : [.|.|.: t.& S ~+ .K.x+& w.S .: [.[.[.[.g+{.e+F+e+e+e+7+e+t.5+v.=.h h ^+e y+e+e+e+7+e+F+7+7+7+7+7+7+w+,.,.,.Y.,.g L.g h+H '+'+3.a+a+^.! ! .+S.f w R #+q+}.e g.2+2+e }.}.2+| 2+&+t+r.].3 l K. . .F. . . .].O w.1+a P.]+G _.8._._.6 1 z.T w.> S S 0+k.k.T.D+D+t+t+t+t+. . . . 1 +.g.}.}.g.2+2+e 2+| . . . . . . . . . . . . . . . . . . . c.2+2+g.2+2+s }.e 2+t+. . . . . . . . I.) }.2+2+2+e g.| 2+D+&+.+G.E { 9.9.9.9.9.9.9.9.9.9.5+g.g.2+2+2+}.}.2++.B.B '+'+'+w '+M.E+H+++i+g.2+2+g.2+2+}.}.e | 2+e W.f S.! B.i J.n *+:+:+p+q+e g.| e }.e W.B+.+#.3+o+:+u.u.:+*+A+2.s.'.j.l m+m+F.].l L L ].L ].L . .m+] ] } d d d d q q q Q Q q q Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", "4.-+4.4.4.4.q+-.4.4.-.{ -.4.q+4.4.4.4.4.-.4.4.4.4.4.`.) ) 4.-.-.q+) `.4.4.4.1.u u -.-.u 1.u 1.-.1.-.-.u u -.-.u u 1.-.-.-.-.-.-.-.-.-.-.-.q+4.4.4.4.4.`.9 (+b+D o+z &.&.&.D G+! S.B.C+k+H+^.r+)+B.7.G.b+_.k+G+#+C.C.C.- C.*.T +.<.|+~+: : [.: ~+|.K.: |.|.|.: .<+'.o.K.: ~+[.: : : [.: o.|+: : : K.|+I.I.S g+g+[.[.g+l.g+3 e+7+7+7+e+7+e+5+!+%+h.r *.}.y+e+7+O.7+7+7+7+7+7+7+7+,.7+w+,.,.,.Y.Y.L.L.h+M.M.'+'+a+a+S.^.! ! ^.a+}+#+b+j+e g.2+2+2+g.e 2+| 2+0+. .L L ].L L l ].l .].x+O & a 5 6 G < 5.>+( >+D < W c+b a <.6+> S S S ~+~+0+0+k.&+&+t+t+t+t+X.}.2+g.e 2+| 2+e e | . . . . . . . . . . . . . . . . . . . c.g.g.2+2+2+2+e 2+| D+. . . . . . . g+q++.| e e g.2+| 2+&+0. +C+f+x.9.9.9.9.9.9.9.9.9.9.9.X.g.2+2+2+2+g.e | | i.}+}+s.s.'+s.H.}+.+i+6 e e g.2+2+2+2+e 2+| 2+e W.R S.! B.C+J.n *+:+u.N i+2+| 2+e e 2+0+x+r+J.*+E.N N = N >.:+;+B.#._.< ( {+i+5.5.< c.< 1 w. . .l.[.] ] } } } d d d d l 3 ].l l . . . .[.. . . . . . . . . . . . . . . . . |.: [.: ~+: [.. . . . . . . . . . . . . B+& 6 D i+i+D 8.W 1 w.0.. . . . . . . . . . . . . . . . ", "4.) ) q+4.4.-.-.-.4.q+q+-.-.4.4.4.-.-.) 4.-.-.q+4.4.) ) `.`.) 4.1.1.-.1.1.1.1.1.u u 1.1.1.1.1.-.1.1.-.1.1.-.-.-.u u -.-.4.4.4.q+4.-.1.-.-.4.q+`.4.4.4.`.i+8.b+( f+9 ( o+(+i.C+B.o a+2.b+G+H+a+a+4+^.i J.b+*+W #+m.9+C.,+k *.C & w.|+: : : : [.: : I.~+k.|.|.[. .l y+l+o.K.: : [.[.: [.[.: o.C K.: : K.U.Q.I.S : g+[.[.l.g+l.<+d+7+7+e+7+e+0 I.e 2+}.1+5+}.y+e+e+7+7+e+7+7+7+,.w+,.7+,.,.,.,.,.g g L.L.h+s.s.'+a+a+S.S.^.! ! ! a+E+4.}.e g.2+2+| 2+g.2+2+W.. r.<+L L L l L l ].l ].x+w.'.z.f ]+< D 9 z `.E `.z ( 5.8.6 5 a C <.6+> > > > S S ~+~+0+~+0+T.&+6 }.| 2+g.2+2+2+e e W.. . . . . . . . . . . . . . . . . . . c.e 2+2+2+2+2+g.2+2+0.. . . . . . [.) !+2+2+e e g.2+2+&+t+2+m.C+u.A 9.9.9.9.9.9.9.9.9.9.9.i+e 2+2+2+| 2+e 2+W.H.B }+'+s.H.M.E+}+@.`.5+e g.2+2+2+| 2+g.2+2+2+e e I.S.! B.#.++n o+( u.4.X.g.2+| 2+e 2+D+p.7.;+*+:+>.= E s+~.~.1.&.j+1 5+e | W.e e | |+g.& ^ c+_ @ l.} } } } ] ] m+l L i+W W j+j+j+j+j+j+6 k.0.. . . . . . . . . . . . . . T.q+j+j+j+W j+(.&+. . . . . . . . . . |+c.`.W a e e e 2+2+2+| T X.a k.. . . . . . . . . . . . . . ", "4.q+) { -.-.-.-.-.q+4.{ -.4.-.) ) 4.4.) ) -+4.-.-.4.`.`.`.&.`.{ 1.1.1.-.-.4.q+1.u 1.-.1.u 1.u u 1.-.-.-.-.u u -.4.1.-.-.-.-.-.4.-.q+4.4.-.-.-.q+-.q+) ) {+( D D 9 i+8.Z #.#..+a+H+.+2.J._.i.w '+^.2.i.Z )+2.w #+X ,+9+,+/+e.T T e.6+S : : ~+: [.: o.: [.|.|.[.[. .r.e+U e+|+g+: : [.: [.[.: Q.& S : : K.|+$.& K.g+[.[.l.l.[.r.y+e+e+7+e+l+e+K.| > <.h.h.| | e+7+e+7+7+7+7+7+C.L.C.,.7+,.,.,.Y.C.Y.L.H s.'+'+}+}+3.a+! ! ! ! a+^.C+{+2+g.g.g.e e 2+e e e &+B+3 j.L L L l l L ].L L w.$.z.5 G < i+&.x.{ 8 { ~.4.`.9 >+8.6 5 a C C C 6+6+6+> > > > > S S ~+g+6 5+g.e e e e e 2+e | . . . . . . . . . . . . . . . . . . . c.2+g.g.g.g.g.e e g.D+. . . . . 0.9 (.e e e g.2+e e g+. [.e n+++:+{ !.9.9.9.9.9.9.9.9.9.9.q+e g.e e 2+e e e e I.'+H H.'+H.H.}+H+6 q+e 2+e 2+e e g.e e e e e 2+g.O ! ! o #.7.J.o+u.z 1.}.e e g.g.e g.t+i 7.J.*+E.N = s+u {+(.}.2+2+e g.e e e e e e e 2+2+g.g.+.a m+} } } ] @ {.j.0 _ 8.}.e e e 2+2+2+g.e 2+Q Q . . . . . . . . . . . . . a k+2+| g.2+e e T.. . . . . . . . B+8.`.!+e e e e 2+e g.e e e e e e 5+> . . . . . . . . . . . . . ", "4.q+q+4.4.4.q+4.-.-.-.4.4.4.-.q+4.) -+4.4.4.4.4.4.4.`.`.`.`.4.-.-.-.-.4.4.4.-.-.1.1.1.u u -.-.1.-.4.-.-.4.-.1.) &.-.4.-.-.-.-.1.1.1.1.-.1.-.1.-.-.4.4.) ( (+k+D D o+D 8.k+B.G+++i.}+}+r+a+B.Z R }+q.2.B.G+@.E+}+#+,+w+w+w+[+T e.$.w.> : : : K.: [.: |.|.|.[.[.[.l.m+y+C.,+k w.: : : [.[.~+: : I.z.> ~+K. .].o.x+: : [.[.g+[.: F.y+e+7+e+7+e+|+S 2 %.h =.;.}.l+7+e+7+F+7+7+7+,.w+w+7+w+7+,.,.Y.Y.Y.g L.s.s.'+M.a+a+S.! o o ]+^.a+f+1 | 2+2+2+}.}.}.2+2+2+t+L v L v L L L l L l L O j _ H+6 < ( `.q+u 9.9.9.9.8 { -+z 5.W (.5 a T T T C C <.C <.6+> > > > > W !+}.e 2+2+e 2+| e W.. t+. . . . . . . . . . . . . . . . . c.2+2+g.}.}.}.2+g.e t+. . . . 0.c.j+g.2+e g.| 2+2+g+t+0.: x+ +)+*+E !.9.9.9.9.9.9.9.9.9.9.9.5+2+s }.}.e 2+e e e a+}+E+'+s.}+H+@.8.i+2+| e 2+e }.}.e 2+2+e 2+| g.g+S..+]+#.A+*+f+N E ) 2+e }.}.e g.g+: i :.J.*+u.>.E ~.6 2+e g.| 2+2+g.}.}.s e 2+e e 2+2+2+2+s }.+.l.} } ] K j.U M.3.B.(.g.2+e e 2+2+2+2+e |.d d Q 0.0.. 0.. . . . . . . 9 +.2+2+g.2+e }.t+. . . . . . . S ) W }.e g.g.e 2+| g.2+e }.}.e e e e e W.. . . . . . . . . . . . ", "4.4.4.-.-.-.-.q+{ -.q+q+q+4.4.4.4.q+4.4.) 4.) ) 4.q+`.&.&.`.) 4.-.) ) q+4.4.-.1.-.1.1.1.-.1.1.1.-.q+-.q+-.) ) 4.4.q+4.4.4.-.-.1.-.-.1.u -.`.-.-.-.-.q+`.9 i+9 9 i+8._.#.n Z B.@.s.H.^.G+m.2._.w #+s.a+a+i.B.i.E+m.9+C.l+w+t.5+T & +.D.S S K.: ~+: [.~+[.[.|.[.|.l. .3 l+w+w+l+w. .: : [.[.|.[.: D.P.C g+~+ .K.K.K.g+g+[.|.[.g+: U.e+e+7+P l+o.s ^+=.h h =.a e+,.7+7+e+7+7+7+7+7+7+7+m ,.,.,.,.,.Y.Y.h+L.s.s.}+}+a+R.^.i.! 2.S.^.) }.| g.| 2+s }.e | 2+0+7 v j.v L 3 L 3 L l L j.w._ 5 6 < 5.&.4.9.9.9.9.9.9.9.u -.`.i+(+G ^ 2 z.T T T T T T C C C C <.6+> W 1+e 2+| e e 2+2+2+W.D+&+&+D+D+t+t+t+. . . . . . . . . . . c.g.| g.s s 2+| 2+e D+. . . . X.i+e | 2+e g.| 2+W.t+. 0.|.x 5+P.J.u.A 9.9.9.9.9.9.9.9.9.9.9.X.2+e }.s | | e e W.H.'+a+}+}+}+P..+i+(.2+2+2+| e T }.2+| e e 2+2+2+g+X ^.! B.8.*+u.N x.j+| e e }.2+| k.0 r+7.*+:+>.= E x.X.2+e g.2+2+W.2+s s e x 2+e 2+2+2+2+2+e }.e r.} @ F.v j - 3.)+X.c.| | e g.| 2+2+| s S .} d d q q 0.Q 0.0.. . . g+{+e 2+| 2+| e W.. . . . . . . x q+!+e }.2+| 2+e 2+2+2+| e e }.g.| 2+e 2+2+0+. . . . . . . . . . . ", "4.4.4.-.-.-.{ -.-.4.-+4.-.4.4.4.4.q+4.4.4.) ) &.`.) ) `.&.`.-+4.) 4.4.4.4.-.1.-.-.u u 1.-.-.q+-.4.-.-.-.4.&.&.`.) 4.) -.4.4.-.u u 1.-.-.-.q+-.1.-.-.q+&.9 9 9 o+z D 8.k+B.H+.+.+f s.4+s.H s.}+#+H s.#+R.)+#.i.S.R 9+,+/+U '.$.+.& C w.S K.: K.: : [.[.: : |.[.[.: .r.v 7+l+l+j 0 K.K.: : |.~+[.: x+E+a S ~+ .: : : ~+: g+: g+S e.a t.e+7+7+l+t.M ~ h h h ;.5+e+e+7+e+e+7+e+7+7+7+7+7+w+7+,.C.C.Y.L.L.L.H '+M.3.a+a+! R.S.^.! ^.) e e g.| g.2+| | | 2+D+U.j.v v $+$+L 3 3 3 L w.'.E+G+W D &.q+9.9.9.9.9.9.9.9.9.u 4.{+c W n.^+5 2 5 r z.r T r r T T C & C j+5+| | | 2+e g.g.2+g+&+~+0+0+0+k.T.k.T.&+D+D+D+t+. . . . . c.2+| g.g.2+| | 2+g.D+. . . a {+e | | | g.e e | t+. . 0.B+ .o.p.C+G.E !.9.9.9.9.9.9.9.9.9.9.i+g.e | 2+x | 2+g.| R }+'+H.H.a+H+i.) +.g.g.2+2+e e.!+x | 2+e e g.2+W.I.@.G+o A+*+u.p+{ !+| e 2+2+| | t+H 4 :.*+:+N = = ~.i.2+e g.e e | e g.| | x 2+g.2+e 2+| g.g.| | x K.] K j.k s.3.! i.(+}.2+2+e g.g.| 2+e W.O L m+|.] } d d Q Q 0.. 0.1 X.e g.e | 2+e &+. . . . . . : ) r e 2+| | | 2+e g.g.2+| e 2+| | | 2+e g.g.g.&+. . . . . . . . . . ", "-.4.4.4.-.-.q+q+4.4.) 4.4.4.) 4.-.4.4.q+&.&.`.4.) 4.) ) 4.4.4.4.`.4.4.) 4.-.-.-.-.q+q+1.-.4.) -.-.4.-.q+4.`.`.`.4.q+4.4.4.1.1.) -.u 1.-.u -.1.1.1.-.-.q+q+&.9 i+9 c._.i.]+k+G+}+b H s.s..+L.9+9+h+#+9+H '+4+R.S.n+k 9+C./+w+/+_ $.C <.D.: : K.: [.[.[.~+: [.|.[.[.: F.U.e+w+l+U e+j x+: : : [.: [.: ].E+5 > S g+: : : : e C <._+^+2 1+j e+7+l+l+ +h.h Z.h =.r e+7+e+7+7+7+7+7+7+7+7+,.,.,.,.,.C.C.C.L.h+h+s.s.'+3.R.a+a+! ^..+++c.g.e g.2+}.g.x | | W.0.[ [ j.j.j.L $+L L L j.[ z.f G < 9 ) u 9.9.9.9.9.9.9.9.9.u -.`.i+W (.^ ^+^ 2 5 2 2 2 z.2 r a r T T c.}.x 2+2+2+2+e e 2+|+k.> S > S S S S S > S K.S : [.T.0.0.. c.2+2+}.2+x | | | | D+. . }.q+}.x | | | | e 2+D+. . . . 0.[.2+ +B J.f+E 8 9.9.9.9.9.9.9.9.9.-.}.e | x | 2+2+g.e I.}+}+}+M.}+.+6 ) g.e e 2+e e ~+X.U.2+U.2+e e 2+e s 3.}+)+++G...:+-.e g.s 2+x | W.q R.r+;+:+N N = = -+X.| | g.e g.| W.g+0+T.T.~+W.e g.e 2+s e r.| 2+| m+p [ J X a+G+)+C+(.| 2+2+e e 2+s e | O 0 L ].m+l.@ ] } d q Q 0.&.e g.g.e 2+e e . . . . . . . 9 !+g.}.2+| | | | | e e g+[.W.| x | | | | e e 2+| t+. . . . . . . . . ", "q+-.-.4.-.-.-.-.-.-.4.4.4.4.4.) 4.4.4.-.`.4.q+4.4.4.`.`.4.4.q+4.4.) 4.) ) 4.-.4.4.q+q+-.-.q+4.1.-.&.-.-.q+) ) ) { q+4.4.-.-.-.4.4.1.1.-.-.-.u 1.-.1.-.q+q+4.&.9 9 i+6 )+b+++Z ! i.@.w '+s.#+9+m.C.C.L.L.L.9+N.i .+}+R C.,+,+l+,+y.T +.<.S : : : |+g+[.[.~+[.[.[.[.[. .l y+l+l+l+w+e+j D.K.: ~+[.[.[.: .}+(.6+S S K.S <.e.^ Z.c ^+2 a +e+e+7+e+t.!+h Z.h h ;.5+l+7+e+e+F+7+7+7+7+7+7+w+7+,.,.C.Y.Y.L.- L.s.s.s.a+a+! R.R.R.^.G.6 e 2+2+e }.g.| 2+| g+[.P P [ [ d+j.v v v j.w._ E+]+< 5.z -.9.9.9.9.9.9.9.9.9.9.9.-.`.i+j+; c+^ ^ ^ ^ 5 5 ^+5 2 2 2 2 r 2 c.+.| | r.r.2+2+g.2+e ~+6+6+6+6+6+<.C w.T $.& & +.o.|+K.k.D+c.2+e }.g.x 2+| x | D+. K.q+!+2+x 2+| x | 2+&+t+. . . . 0.|.x I.m.)+J.f+E { !.!.9.9.9.9.9.9.9.!+s | 2+| r.W.2+g.e }+}+}+}+H+.+b+c.2+g.2+g.}.}.t+j+| x r.2+g.e g.}.> H+E+a+B.A+;+*+9 g.}.}.2+| | g+r.'+/.b.a.a.N = N E X.x | 2+W.&+t+. . 0.0.0.0.. W.e 2+e }.s x | | g+g+3 [ U - f a+]+)+c.x | 2+g.2+e }.}.x > k j w.L L .F.@ @ ] d D.i+W.2+g.g.g.}.g+. . . . . . a i+e }.}.| | 2+| x | g+t+t+. . t+2+2+| x | g.g.g.e g+. . . . . . . . . ", "4.4.4.4.-.{ -.4.q+-.q+4.`.) q+4.4.4.4.4.) 4.4.4.q+) &.`.) 4.) 4.q+4.4.4.4.) ) 4.q+4.-.q+) 4.4.4.) `.4.4.`.-.-.) 4.-.4.`.4.-.q+-.-.-.-.-.4.-.-.-.-.-.-.-.-.q+) &.&.( W ++n _.B.i.)+G+H+w s.#+#+9+9+9+C.9+9+9+L.'+a+a+w 9+9+w+w+l+9+n+& & |+: : ~+ .: ~+|.: |.[.[.[.l.g+l <+e+l+l+l+7+w+j j.K. .: [.[.[.: K.,+G T S |+Q.2 ^ Z.Z.Z.h.^+2 e.t.l+e+e+ +!+=.h h h =.!+0 e+e+7+7+e+7+7+7+7+7+7+,.,.,.C.C.C.C.Y.L.L.s.'+M.a+a+a+! )+q.>+!+2+| 2+e }.2+x | | k.L ,.w+j j j j [ [ j.0 U R @._.n 9 4.u 9.9.9.9.9.9.9.9.9.9.9.1.) 9 W ; n.n.n.^ ^ ^ 5 ^ ^+5 ^ ^ 5 5 !+i+}.| 2+| | 2+| | g.> K.C <.C C T T 5 5 1 c+G+1 P.z.1+w.g.r.i+2+}.}.| | | | | 2+D+k.) !+}.g.x | | | e 0+. . . . . . t+B+K.<+t.B i.J.*+u.`.x.{ 8 !.9.9.9.!.W e x | 2+r.2+2+| W.}+}+a+}+H+i.f+X.2+| 2+2+}.2+k.i+g.x | 2+| | g.s 2+9+w H..+C+A+u.6 2+e }.| | | &+y+'+2.b.p+a.p+:+p+z B W.0+t+. D+ .<+<+3 F.@ @ ] 7 !+2+e }.g.r.2+2+| W.F.v l+,+L.w H+X.b++.2+2+| 2+e }.e x W._ _ j w.j.j.l l F.@ l.++!+| g.| | 2+}.D+. . . . . D+) }.g.e }.| | 2+| | W.t+. 0.. . . T.5+x x e | | 2+s e . . . . . . . . . ", "q+4.q+4.q+4.-.4.-.-.q+q+4.`.q+4.4.) 4.4.) `.4.4.) ) ) `.) 4.) ) q+q+q+q+4.) ) -+4.4.4.4.4.4.q+q+4.4.`.`.&.4.-.-.-.-.) `.4.-.4.-.-.-.-.q+4.-.-.4.q+-.-.-.-.4.) &.&.9 i+8.8.i.G+)+b+D G b L.L.'+9+L.9+C.C.9+C.C.C.9+L.H.#+m.,+w+l+,+/+'.& O S : [.: : [.[.~+[.: [.|.l.: .l y+e+l+l+l+7+e+j 0 x+S : ~+[.|.: .o.*.I.> & 2 Z.{+Z.c h.^+2 a 5+'.l+e+t.a %.h h h =.%.T e+e+e+7+e+7+7+7+7+w+7+w+,.,.C.C.L.L.L.h+L.s.H '+3.R.a+R.^.^.u.e.2+2+2+2+e 2+| 2+e [.I.H L.9+k U _ '.U j _ X H+G A+( E -.9.9.9.9.9.9.9.9.9.9.9.u -.{+i+W ; (.~ n.^ ~ n.^ ^ ^ ^ ^ ^ ^ ^ ^ i++.2+g.e e g.| 2+| W.S T T r 2 ^ n.; W 8.(+n < < G X.b $.O i+| | e 2+2+2+e e 2+k.9 n.| e 2+2+2+e e g+. . . . . . . 0.7 g+x+o.p.B i.A+G.o+f+9 z E E 4.4.-+i+g.| 2+e e e 2+| | ,+}+}+}+H+]+) 5+2+| 2+| g.g+e D a e e 2+| 2+| 2+e I.R #+H.^.B.) 5+2+2+e 2+2+2+t+l+L.q.:.......*+*+*+++&+. r.t.p.l+e+3 l {.@ @ @ ] )+2+2+e 2+| 2+e e e l.v [ l+,+9+#+}+X.k+e 2+2+2+| e 2+2+2+& X k j [ [ v v l l l ) }.e | 2+2+| W.. . . . . . a j+| 2+2+e 2+| 2+e e t+. 0.0.. 0.. . P.e e e 2+2+| 2+e D+. . . . . . . . ", "4.4.4.-.4.-.4.-.4.4.{ q+) 4.-.-.q+) ) ) `.`.`.) ) ) `.) ) `.) ) 4.4.-.q+4.4.) ) `.) -+4.4.q+-+-.q+) &.&.`.) 4.4.) `.`.4.4.4.q+4.4.q+) 4.-.-.-.-.-.-.4.-.4.q+) `.9 9 D (+++G B.2.r+C+@.#+9+L.X 9+9+C.9+9+Y.9+C.,+,+L.- C.C.w+l+/+C.,+,+X w.|+: : [.: : : : : [.[.[.[.[.: .<+e+7+l+l+e+l+j e+[ j.K.g+: [.|.~+: K.w.e r Z.Z.Z.Z.Z._+^ 2 r T 1+t.e+e+5+!+=.h h =.=._+5+7+e+w+w+e+7+7+7+w+7+w+,.C.C.H s.#+s.L.H s.M.a+'+a+R.a+.+q.z +.| 2+2+2+g.g.2+e }.0+9+3.}+M.#+X - k k k X f ]+_.n ( `.1.9.9.9.9.9.9.9.9.9.9.9.9.-.{+( W ; ~ ]+(.~ n.~ n.n.n.^ ^ ^ ^ ^ ^ i+5+2+s }.e | 2+2+2+S S z.2 5 n.G < (+i+9 9 9 z f+o+< B.H.*.i+2+g.g.2+2+e }.e g.c.8.2+2+g.g.2+e }.e t+. . . . . . . 0.7 .L o.t.p.B .+i.C+A+b+D o+f+f+f+u.`.e 2+2+s }.e | 2+2+I.a+a+3.X.6 ) e | 2+g.2+g.&+*.k+k+}.e 2+2+g.2+2+e D.n+y.z+H.i.) e 2+2+g.2+2+W.B+l+C.q.4 ;+b.;+;+;+;+;+o.4+4+H /+e+y+3 K F.@ @ @ @ .++.2+g.e 2+e }.}.2+|.3 v [ j U _ n+N.j+e | 2+2+2+2+e 2+g.O X - k U j [ [ v 3 N.c.}.e 2+| g.2+0+. . . . . . 9 }.2+2+2+g.2+2+}.}.g+. . Q Q 0.0.. t+a e.e 2+| 2+g.2+e ~+. . . . . . . . ", "4.4.4.4.4.q+4.4.-.4.4.4.-+) q+4.) 4.) ) `.-+`.&.`.&.`.) `.`.4.4.4.4.-.4.4.) 4.`.`.) `.`.4.-.4.4.-.-.) `.`.`.&.`.`.`.) ) &.-+q+4.`.-+4.) 4.4.&.-+4.4.4.4.q+4.`.) &.9 9 i+D G G+)+)+B.G+P.m.- '+}+#+9+9+9+C.9+9+9+9+,+[+/+/+,+w+l+,+w+,+/+'.O S : K.|+: l.: l.: [.|.[.[.r.r.U.v e+l+l+l+l+7+e+j j [ ].S : [.~+: ~+g+r Z.Z.Z.Z.Z.Z.=._+^+a T !+a 0 e+l+*._+h Z.h =.%.^+Q.l+l+7+7+7+7+7+w+w+w+,.C.C.Y.h+L.s.* s.'+'+'+'+a+a+q.R.^.z }.| e e 2+2+2+2+2+e k.B R.a+R.a+3.'+s.s.E+S.! #.< o+z x.u 9.9.9.9.9.9.9.9.9.9.9.u q+{+c W G ~ ~ ~ n.~ n.n.~ n.(.(.n.n.n.^ i++.2+g.s 2+| 2+e e 2+> 5 ^ ~ W c ( &.`.-+{ x.x.E z f+n C+@.9 e g.2+2+2+g.s g.| ; e e g.2+| 2+g.e e W.. . . . . . 0.q ] .<+[ t.p.H 4+4+X.)+i.C+k+J.b+b+G.f+M 2+2+e e | | e e 2+}+}+S.G+(+c.| | g.e g.2+t+i.i.c.s 2+x 2+e g.g.2+W.R ,+M z+++c.e e g.2+| 2+k.: o.e+w q.4 :.:.:.:.J.:.:.7.4+p.l+e+y+3 K {.F.@ @ @ 4+*.g.2+2+| 2+e e x q {.3 j.j.e+0 t.t.H+a | g.e e 2+2+| 2+e $.- k U U j [ [ v ( !+e | | g.e 2+t+0.. . . . [.&.g.e e g.2+| 2+g.e D+0.Q D+q Q 0.. . e P.2+| 2+e e g.2+W.. . . . . . . . ", "-.4.) 4.4.4.4.4.`.`.`.-+) 4.{ -.q+) 4.) ) ) ) ) &.`.`.`.`.`.4.) { -.4.4.) 4.) ) ) 4.) ) 4.) ) 4.4.q+q+`.4.&.&.`.) `.) 4.`.) -+4.`.&.9 9 z 9 z &.`.`.&.-+) `.) `.&.9 >+D >+k+@.@..+a+R.H+R 9+H s.9+9+s.R ,+H 9+L.L.w #+k ,+C.,+w+/+m.#+_ /+0 |+K.: : : : : g+l.: [.|.[.l.r.l <+7+l+l+l+l+l+l+l+e+P 0 x+K.: : ~+S r c Z.Z.Z.Z.h c c V.^+r T a ~ 5+/+e+t.!+%.h h =.%.%.a t.l+l+l+7+w+w+7+w+,.,.C.Y.C.Y.h+L.#+'+s.'+}+'+'+R.R.4+q.9 }.2+e e g.2+2+| | e k.^.2.2.! ^.^.^.S.S.S.! #.A+n z -+-.9.9.9.9.9.9.9.9.9.9.9.9.u q+i+< W ~ ; ]+~ n.n.~ ~ ^ ~ ~ (.(.(.(.(.9 }.| 2+g.2+2+e e e S > ^ ; j+5.{+`.4.1.1.9.u 1.8 x.E f+G.i.`.e 2+2+2+| | g.2+| 2+e g.g.2+2+| | e g.| g+. . . . 0.q |. .].j.0 l+9+H H B 4+4+4+X.)+)+i.i.C+C+; | | 2+g.2+2+g.e W.H.a+H+i.9 P.2+| g.e e W.[.G B.i+e 2+| e e e 2+2+g+[+[+m.!+i+1 e e 2+2+2+| D+].<+y+/+4+q.r+r+7.7.;+J.J.7.)+N.[+e+y+g.p {.F.{.@ @ 4+M g.2+2+2+| g.2+2+Q m+K 3 v j.d+y+0 }.6 2+e e g.2+2+2+W.2+w.k k U U j P j /+`.g.g.2+2+g.e W.. Q Q Q 0.0.5+; g.e e 2+2+2+| | 2+t+q B+B+B+D+q Q 0.g+; 2+| 2+e e 2+2+| . . . . . . . . ", "4.4.4.) q+-.4.4.4.) `.-+&.) ) 4.4.4.) ) 4.4.) 4.&.&.`.`.) ) 4.4.) ) ) ) ) ) `.4.) 4.`.`.) `.`.`.`.) ) ) q+) &.&.&.&.`.) `.) ) `.9 9 i+9 9 9 f+f+f+f+9 `.z &.9 9 >+D b+b+D k+)+#.H+H+@..+#+m.9+#+L.9+a+9+C.9+#+H.C.L.p.9+9+C./+C.,+X /+,+/+j o.D.: : : : : : : [.: [.[.[.: .U.y+7+l+e+l+7+l+l+l+l+l+j o.K.: S r =+c h c h c Z.h Z.%+^+r T T (.^ 5+l+t.t.!+%.h h h =.%.5+t.l+t.l+7+,.7+w+C.,.C.C.C.Y.L.h+s.s.s.'+a+'+a+R.R.R.^.z +.e 2+g.g.2+e e 2+e ~+^.B.o 2.o ! 2.! )+o B._.< u.(+G+1 c+c+X.c+c+X.c+c+1 c+c+c+n.n.^ W ; ]+~ ~ (.~ (.n.~ (.(.(.(.~ (.~ ~ 9 5+e g.e e g.e 2+e 2+O ~ W c {+`.-.u !.9.9.9.9.!.8 x.z f+A+`.2+g.g.g.g.g.e e e e 2+e 2+e e e g.e e e g.g+0.Q q B+|.l.].x+o.j /+m.s.B '+4+4+B 4+4+4+X.X.4+X.c.e g.g.e e e 2+e 2+*.S.@.6 q+}.e e g.2+g.0+O Z #.5.e.e 2+e 2+e 2+e 2+I.R H..+4.}.2+e 2+e e | . ].].L o.p.'+^.2.i 7.;+:.J.J.C+q.N.,+e+y+<+3 K {.{.F.4+M 2+2+e e 2+e e g.Q @ @ K 3 3 v j.j.j.X.e e 2+g.2+e e g.g.> /+J U U U j j i W e e e e g.2+T.q d q Q 0.0..+!+g.2+e 2+e e e e W.0.[.: [.|.B+q Q 0.k.8.e e e 2+e g.e e D+. . . . . . . ", "q+4.4.q+4.4.4.q+q+4.`.&.&.4.4.4.-.q+) 4.) q+4.4.) `.`.`.4.) `.`.4.) ) 4.) ) ) `.) ) ) `.`.) `.`.) z &.) 4.4.4.`.) ) `.4.) `.9 9 9 i+f+>+>+D >+D D o+o+o+f+D o+o+G.b+b+A+7.6 i.a+4+)+.+}+E+#+9+9+9+p.C.9+9+C.C.,+/+w+C.- m.,+}+z+C.,+w+C./+/+0 D.w.K.: ~+[.: : : |.|.[.: : .r.v e+l+7+l+l+e+l+e+l+l+l+e+0 w.r ~ %+I y y y =.I Z.h %+r r T 5+r ; !+t.e+e+5+!+h h =.h =.h.t.l+/+7+/+7+/+w+w+C.,.C.9+L.L.H L.'+'+* '+` a+R.R.q.q.f++.g.2+2+2+g.}.}.}.g.0+B.r+r+o B.B.o o #.B.#._.8.z !+g.2+}.}.}.e g.e e | 2+g.2+e }.}.<.n.~ ~ ]+~ (.(.(.(.~ n.~ (.(.(.6 (.~ i+!+}.e g.g.g.2+2+g.S 6+W c {+`.-.u 9.9.9.9.9.9.9.9.8 E u.D ) g.2+g.}.}.}.e e e &+e 2+g.2+}.}.}.g.g.e e | [.7 7 7 l.K.L O 0 t.m.X H.a+B 4+.+4+.+B 4+4+4+4+4+>+}.}.e g.e g.2+2+2+}.@.X.k+`.e e e 2+| g.D+R G #.A+c+e e 2+2+g.2+e }.O H.^.A+{+e | g.2+g.}.W.B+K.K.].y+Q.N..+i.C+J.J.J.:.i 2.q.4+)+C+J.G.o+f+o+o+o+&.e.g.e s }.}.e 2+e q @ @ @ {.l l 3 3 <+Q.P.2+2+2+g.e }.}.e 2+O j j j P U w+`.e.e 2+e g.2+| . l.@ d d q Q b+}.2+2+2+g.e }.}.e +.a z.z.z.M a *.1+1+n+c.g.e 2+| 2+2+e }.T.. . . . . . . ", "4.4.4.4.q+-.q+4.4.4.) `.`.-+4.4.-.4.4.) ) ) 4.) 4.4.`.) 4.4.4.) ) ) ) 4.) ) 4.) 4.) 4.) ) `.&.&.9 &.z `.) ) ) `.) `.`.) `.`.9 i+( D D o+9 f+i+>+D b+J.b+b+b+J.J.A+J.b+B.^.2.B.@.a+r+@.}+)+#+- L.9+9+9+9+9+C.C.9+,+,+/+C.C./+C.,+9+k ,+w+/+/+'.w.I.g+: : : [.: g+: : [.: : .r.U.e+l+l+l+l+l+l+e+e+e+l+l+j l+z.2 %+%+V.V.V.=.%._+h h r +.T 5++.^ %+e./+l+/+5+!+h h h h =.^+5+l+l+l+,.7+w+w+,+C.C.C.Y.- L.L.h+'+'+'+'+a+` R.q.q.:+1+2+| g.| 2+}.s e | [.^.r+i r+r+2.#.#.#._._.7.A+9 P.2+| s }.e | 2+e e 2+2+2+2+s }.s W.C c+(.(.(.(.n.(.n.(.(.~ (.~ (.(.~ (.9 e.e 2+| g.e 2+2+2+g+<.(+( {+-.u 9.9.9.9.9.9.9.9.9.!.{ z :+) 2+| 2+}.e g.| | e &+g+e | 2+e }.g.| | e 2+| e : : .].].j.w.'.$.k w s.a+a+@..+.+.+.+.+4+X.4+4+8.!+e 2+| g.e 2+2+2+S @.X.D j+| g.g.2+2+2+t+]+G o #.j+g.e 2+2+2+| e s 2+]+i u.8.2+| g.| g.}.T.r.].].].o.*.H.i.C+J.;+;+J.7.i J.N 4.i+6 !+!+e | 2+e 2+| 2+| 2+}.s e 2+2+g.Q @ @ @ @ F.F.{.l 3 l 6 2+2+2+| e s e 2+U.|+j.[ [ [ P X &.}.2+| g.g.2+g+0.F.l.] } q q D e 2+2+2+| g.s }.2+}.!+^ !+!+!+!+!+^ !+!+5+g.e 2+2+2+| 2+}.~+. . . . . . . ", ") 4.4.4.{ -.4.4.`.) ) 4.) ) ) ) 4.4.4.4.) 4.) 4.4.) ) `.) `.) ) ) ) ) 4.) 4.) ) 4.4.4.q+) `.4.&.&.&.`.) ) 4.) `.`.`.`.) `.&.&.9 9 >+(+o+o+o+o+D b+++b+A+J.8.8.8.++++B.)+i.i.)+H.a+a+s.s.w R 9+R 9+9+9+9+,+9+C.,+9+,+,+/+,+,+,+/+C.9+9+_ C.9+j 0 D.S : g+: : : x+|+[.[.r.[.: .r.v l+e+l+7+l+l+l+l+l+e+e+e+l+'.1+^ I h y I V.%+%+%+=.%.r +.T +.e.W ^+e+e+t.5+!+h h Z.Z.h =.r t.l+l+7+w+w+l+,.w+,.C.C.C.L.L.#+h+* '+'+` a+` q.f.G.!+g.e 2+| 2+2+2+2+| ~+2.i r+r+r+r+r+#.B.#._._.8.u.P.| 2+e 2+| | | g.2+2+e | 2+e 2+| : w.^ ^ ^ ^ n.^ n.^ n.^ (.(.(.(.(.(.(.9 +.2+x | 2+e 2+g.2+K.C i+{+q+u 9.9.9.9.9.9.9.9.9.9.9.8 E f+) 2+| g.g.2+| | 2+e &+~+W.2+g.g.2+| | 2+e e e g.> ].K.L O w.'._ k b w E+H+a+@..+@..+.+.+X.4+X..+X.k+2+r.2+2+g.2+e | g+G+i.9 !+| 2+g.e e g+: ]+G B.C+i+2+g.2+e 2+| e 2+W.X.J.-+!+g.e 2+| e 2+t+D.x+|+o.$.b )+++J.J.*+G.J.*+q+{+!+e | e g.2+| | 2+g.g.e e | 2+g.2+2+r.2+g.Q @ @ @ @ @ @ m+m+F.l H.}.e | 2+e 2+2+x | W.j.j.[ [ e+J.(.| | | 2+e e &+m+L K l.] } 7 9 e g.e 2+| e 2+2+| | 2+g.e e 2+| e e 2+| | 2+e e e 2+x e 2+~+. . . . . . . ", "4.4.) ) 4.4.4.4.) 4.`.) `.) ) 4.) ) 4.4.4.) ) ) ) ) ) 4.) `.`.4.) ) 4.4.q+4.4.4.) 4.4.q+q+4.q+) ) 4.) ) &.) ) ) ) 4.) ) &.&.&.9 &.i+(+b+(+A+++J.8.++C+++b+o+b+k+C+C+C+A+++X..+H.w H.}+H s.w a+)+H+w #+9+m.9+9+,+,+9+9+,+,+,+9+m.9+9+[+/+/+/+w+/+0 |+K.: ~+g+: : : [.: : [.r. .r.o.t.l+t.e+l+l+e+l+l+l+l+l+l+'.t.T ~ V.=.v.;._+;.v.=.=.;.C +.+.5+^ _+t.e+l+l+5+%+h h Z.h h =.r /+/+l+l+w+w+,.w+,.C.C.C.Y.g L.h+M.'+'+R.a+R.` q.7.X.g.e 2+2+}.2+x x | g+a+4 i i r+r+r+r+#.#.C+++++f+P.2+e e | | 2+| 2+e e g.| e e | x g+6+^ 5 ^ ^ 5 ^ ^ ^ ^ n.n.n.n.n.(.(.(.{+}.| | 2+| 2+e e 2+| C 9 `.1.9.9.9.9.9.9.9.9.9.9.9.9.u E 9 ) g.2+e g.x | | | 2+&+ .K.W.}.2+W.| | | | 2+e 2+| O |+O w.0 $._ R E+f H+1 .+S.G+G+G+.+.+.+)+)+^.X.c.| | 2+| e g.e 2+e *.Z 4.e | | 2+e e ~+w.G ]+#.#.( }.2+g.e 2+e s | g+N.J.q+2+e e 2+g.e W.B+5+s O Q.H.B.J.;+G.*+*+*+E ) e.e e e 2+e g.| | | | 2+g.g.g.2+s g.x x | 2+2+q l.@ @ @ l.@ @ m+l.m+3 1 e 2+s e | x 2+2+| ].3 v j.[ ) }.x | 2+| g.2+t+y+y+L l r.l.l.D 2+e e 2+e e 2+W.| 2+| 2+e e 2+g.e 2+| | | | 2+g.e 2+2+s 2+g+. . . . . . . ", "4.4.q+4.q+4.) ) ) 4.q+4.`.`.4.) ) ) 4.q+) ) ) 4.4.) `.) ) ) ) 4.) 4.4.) 4.4.4.q+) `.4.-.4.4.) 4.) ) ) &.) `.`.) 4.4.) ) `.&.`.&.9 &.f+j+8.C+C+)+C+)+C+J.J.z D k+k+i.B.G.k+B.)+^.)+H.#+H.B b #+p.'+H #+w #+#+9+9+C.,+,+,+,+C.L.m.C.a+_.'.l+,+/+_ k O S K. .: : : : : [.[.: : K.O 5+/+w+/+/+l+l+l+,+e+e+l+l+e+l+j '.a _+h.;.v.;.v.=.V.y =.r C +.+.e.!+Q.l+e+t.5+v.=.=.h h h h _+5+l+l+w+/+l+/+C.C.C.C.L.C.L.L.h+h+* * '+` R.q.f.q.j+g.e g.e }.g.x | | g+X 4 4 i i r+i r+o #.#.#.++>+P.e }.e x | | x | 2+g.g.e }.s | | g+6+2 2 2 2 5 5 ^ 5 ^ 5 ^ ^ ^ ^ ^ n.^ 9 }.| 2+r.x 2+2+e 2+O & {+q+u 9.9.9.9.9.9.9.9.9.9.9.9.u x.9 ) g.e }.2+| | | x | D+ .K.K.e e | | | x 2+e e g.e +.w.w.Q.$._ z.b E+H+@.@.G+]+S.G+G+! ]+! G+@.G+X.D e 2+r.x 2+e g.g.}.+.6 &.2+x | 2+g.g.D+z.o #.G B.A+!+2+2+e 2+}.}.2+x +G.i+| g.g.2+}.}.0+K.5+o.I.n+B.:.*+:+p+:+p+-.i+| | g.e 2+e }.g.| | 2+g+| 2+e 2+e }.g.x | 2+g+| B+3 l {.m+F.m+@ m+@ @ l.X.e 2+}.}.| | | r.W.r.3 3 v p.9 | | 2+g+W.| g+7 t.0 0 o.y+<+2+i+2+g.g.2+}.}.2+x 2+W.r.2+g.e 2+}.}.2+x 2+x x 2+2+e g.s }.g.|.. 0.. . . . . ", ") 4.4.4.q+q+{ 4.) ) `.`.`.`.) 4.) ) 4.q+4.4.`.) 4.4.4.) `.) 4.4.) 4.) 4.q+4.4.4.4.4.) 4.) ) ) 4.4.4.`.&.`.`.&.&.) &.) ) 4.`.&.&.&.&.9 f+c.6 .+B )+4+B B N.q.J.b+k+++++k+i.B.B.X.^.H+}+@.i.B.G P.#+9+9+L.w 9+C.m.9+#+m.,+,+C.C.,+C.9+y.y.k R ,+C.,+w.K.: S K.: : : : : [.[.K.I.& & t.l+l+l+l+l+e+l+l+e+l+l+e+'.l+t.a r h.;.v.%.%.=.V.I y ;.C +.+.T M e+l+e+l+t.~ =.r =.h =.h I r l+l+l+w+w+w+w+w+,.C.C.C.Y.Y.L.h+'+* '+'+` ` q.q.c.2+| 2+s }.2+x 2+| x 5+F i 4 4 r+r+r+o B.B.G k+++!+| e | g+g+g+e e 2+| 2+e }.s x | g+> T r r r 2 r 2 2 2 2 5 ^ 5 ^ ^ ^ ^ i+}.| | | | e | 2+2+> & {+q+9.9.9.9.9.9.9.9.9.9.9.9.9.u E f+) g.}.}.2+| | | | g.&+ . .K. .e | 2+| x 2+2+| 2+e }.e <.$._ z.X E+E+1 1 @.G+G+G+! G+G+G+]+]+G+]+G+8.!+| x 2+2+| 2+g.}.e (+W | x | g.| | D+]+6 ]+o o o j+e 2+2+2+s }.| x e 9 X.e | | 2+}.}.&+Q.t.o.5+N.i *+p+:+:+:+E i+2+| e | | g.e }.g.x | 2+x e 2+2+2+e }.e x | 2+r.2+|.0 0 o.y+<+3 l {.r.m+m+/++.e }.e x | 2+r.2+2+L 3 v G.!+| | 2+| | e D+o.N.b b b b n+M i+g.| 2+2+}.s | | | | | g.2+2+2+s }.| x | | x g.2+| 2+s }.2+g+0.0.. . . . . ", "4.4.q+q+4.4.q+`.`.) ) ) 4.) 4.) `.-+-+4.q+q+) ) ) ) ) ) ) ) ) 4.) ) ) 4.4.q+) ) ) q+4.q+`.) ) &.) ) `.&.&.&.&.`.) ) ) `.&.`.&.&.&.&.9 i+i+8.k+X.i.B.k+X..+4+X.X.)+C+++++8.k+k+)+X.w H *+++X..+'+w m.p.9+9+R 9+#+9+#+,+9+[+,+9+,+C.9+! @.R m.'.,+/+'.O S K.K.: : : : : : : 6+& & & & t.l+l+l+l+l+l+e+l+e+l+/+/+'._ r ^+h.;.v.=.=.I =.=.I %.r & +.5+t.l+t.l+e+5+_+;.5+=.=.v.h I h.t./+7+7+w+w+w+,.,+,+C.C.Y.Y.L.g h+* * ` * ` ` q.:+2+2+2+2+e g.| 2+e g.}.F F 3+4 4 r+r+#.B.i.Z )+k+++. . . . . t+k+}.2+2+2+2+g.g.| 2+S S T T T T r T r r r r 2 2 5 2 !+!+^ i++.| e e e 2+| 2+2+S T `.-.9.9.9.9.9.9.9.9.9.9.9.9.9.8 E f+) | 2+e 2+| g.e e 2+T.{.l l l r.e 2+e g.g.| 2+2+2+g.g.|+& z.z.z.5 1 @.G+c+c+G+]+G+]+]+]+G+]+]+]+i.i.k+g.e g.2+| 2+W.g.| >+!+e e e 2+| g+: ]+]+o ]+]+i.D 2+| 2+2+2+g.2+| x 4.+.g.| 2+| 2+e t+y.5+s 5+4+J...:+..:+p+-.}.e e e | 2+2+2+e 2+W.g+k.&+&+&+T 5+2+g.2+| 2+g.g.g.: 4+B N.m.p.t.0 y+y+<+3 U.X.2+2+g.| 2+2+e e 2+| v y+) }.| 2+g.e e W.t+^.C+A+b+b+b+A+8.&.2+| 2+2+2+e 2+| g.W.g+[.k.[.|.g+g+g+k.[.g+|.g+|.g+[.[.g+g+B+0.Q 0.. . . . ", ") 4.4.{ q+4.) ) ) ) `.`.4.) 4.4.`.) ) q+4.4.4.) 4.) ) 4.) 4.) q+) ) 4.4.-+) 4.q+4.4.4.) ) ) ) ) q+`.`.&.`.&.&.) ) 4.) ) ) ) ) `.&.&.9 i+(+k+8.k+6 B.4+X.)+C+B.J.i.4+C+++8.++i.)+H.H.H+)+}+'+R m.9+- #+#+H.R 9+9+9+9+,+9+R ,+,+,+C.9+L.m.k #+_ 9+R '.o.K.: : g+: g+: S S C e.T & & & j l+l+l+/+l+e+l+l+l+l+l+j +2 r h.;.%.=.V.=.h I I =.=.r C +.& l+e+l+l+l+ +_+!+5+h v.!+h =.=.5+/+7+l+7+7+w+,.w+C.C.C.C.g Y.g L.* * * '+` ` ` :.M 2+2+2+g.g.2+e }.e 2+4 F F 4 F i i r+r+#.G k+k+k+6 k+k+k+8.k+`.}.| 2+2+2+2+e 2+g.|+S C C C C T C T T T r T r 2 2 2 2 2 i+5+2+}.s e 2+2+2+2+| $.) 1.9.9.9.9.9.9.9.9.9.9.9.9.9.1.E o+) 2+2+e g.2+e }.s 2+&+F.F. .l .K.}.}.e 2+| 2+2+2+g.g.2+O a E+f 3.1 G+G+]+G+c+G+]+]+]+]+]+G+]+G+]+G+c.}.}.2+2+2+2+2+g.2+&.e e }.g.2+2+0+w.]+G+]+]+! ! o+s 2+2+2+2+e g.2+2+) e 2+2+e | 2+W.|.y.Q.o.& B 7.*+..*+*+E 6 e }.e g.| g.2+2+e 0+. . D+g+g+r.X.*.2+g.g.2+g.}.}.2+r.b+J.++++B.)+4+N.p.l+e+y+6 e g.g.2+e }.e e | W.v B D e 2+g.e }.e ~+g.*+:+N E E x.-+N q+e 2+2+2+2+g.g.2+s W.. 0.. . . . . . . . 0.. . . . . . . . . Q Q . . . . . ", "`.`.4.q+4.) ) `.) `.`.) `.4.) ) ) ) 4.4.4.&.) ) ) 4.) ) 4.4.4.) 4.4.4.4.) `.4.`.) 4.q+) ) ) ) ) ) ) `.&.) &.`.) ) ) ) `.&.) ) `.&.&.&.9 c.8.D 8.)+C+k+i.B..+.+B N.X.i o+8.++k+)+B.k+C+X.1 w E+H+E+R H s.'+w k m.k m.R [+H #+R [+m.C.9+#+s.9+#+m.k /+j D.S S S : S ~+C ; %+r & T T & Q.t.l+e+l+l+l+l+e+l+e+j t.2 r h.;.=.=.h y h =.I V.I =.;.C +.I.l+l+e+l+e+t.!+5+*.=.h.!+h %.%.a e+l+l+7+w+l+/+w+w+w+,.C.C.Y.Y.h+L.'+* * '+` q.q.k+e g.2+2+2+2+g.e e W.E+F F F F F 4 i #.#.B.k+k+k+8.8.8.(+b+j+`.e | 2+g.g.g.2+2+2+S S C C C C C C C T C T T T T r a r !+i+}.2+e s 2+x 2+e e S T ) -.9.9.9.9.9.9.9.9.9.9.9.9.9.~.z o+) g.g.2+2+2+e e 2+x &+F.l l l l l x }.e | 2+e g.e 2+2+2+2+w.z.5 1 1 1 G+G+G+]+6 ]+]+]+c+6 6 ]+6 Z Z >+}.e 2+| 2+e e 2+2+; g.e e | W.g.t+M @.G+S.! S.S.++!+2+e e e 2+2+2+e j+g.| 2+g.e g.T.].5+s D.Q.N.C+;+;+b.b.-.}.e e g.| | g.e e &+. r.t.p.m.#+N.o+M e 2+2+| g.e e | K.z z z u.f+o+G.A+B.4+N.p.B *.2+2+2+2+e s | | 2+y+o+!+| 2+2+s e | t+o E A 8 !.!.9.9.9.9.+.2+g.g.e 2+2+2+e e r.U.r.g+l.] |.] } } ] ] [.] |.} |.7 d q Q q 0.. . . . ", ") 4.4.-+&.-+) `.`.`.4.) `.) ) `.) ) ) q+) `.) ) 4.q+4.4.) ) ) `.`.) q+4.`.`.) ) ) ) 4.4.) 4.`.) ) &.&.) ) `.) ) ) q+) ) `.`.) `.) ) &.i+(+b+(+8.i.)+8.++i.i.k+i.X.)+J.G.b+8.8.++C+i.B.i.P.m.a+2.P.H.#+m.#+@.#+9+9+#+#+R m.- #+s.m._ #+H.m.C.X [+C._ /+0 |+|+> S 6+h.=+c y ^+T & & & & t.l+t.e+l+e+l+e+l+l+t.& r h.v.=.y =.h =.h =.h =.y %+h.+.'.t.e+l+e+l+/+/+ +t.!+~ 5+5+=.!+^ a l+7+t.l+w+w+l+/+w+w+,.C.C.C.L.L.g * * * '+` ` q.b+e e 2+2+2+| 2+g.2+2+}.F F F F 7.7.7.7._._._.8.8.8.(+b+(+D (+`.e g.g.e g.2+2+2+x g+~+6+6+<.<.6+<.6+<.<.<.C C C T C T T c.+.| 2+g.2+| 2+e e | $.`.-.9.9.9.9.9.9.9.9.9.9.9.9.u { u.G.`.e 2+2+| | 2+e 2+| &+F.F. .l l l l |+e | 2+g.g.2+2+| | | e }.5 G+S.G+G+]+c+]+c+]+6 ]+]+]+]+6 ]+6 ]+++P.g.| 2+e e g.2+2+e 2+g.e | | 2+D+P.3.@.S.@.S.}+S.6 g.e g.2+2+| | 2+}.2+| g.e e 2+t+s }.D.|+}.m.^.:.J.;+*+9 | | e 2+| 2+e e W.. }.H H N.#+w N.D M g.2+2+| | g.2+2+g.!.!.u u 8 { E u.o+J.C+4+N.; 2+2+| | 2+2+2+| e s ) e 2+| | g.e W.k.E 8 9.9.9.9.9.9.9.9.!+e e g.2+2+| | 2+g.K.x+r.m+[.[.} ] } } } } } ] } 7 7 7 d d Q Q . . . . . ", ") 4.4.) ) ) `.4.4.) ) 4.4.`.) 4.) -+) 4.4.4.4.4.4.4.) ) ) ) ) `.`.4.4.) ) `.) ) ) `.4.) q+) &.`.`.) `.) 4.4.) &.q+q+q+`.&.&.`.) ) ) &.9 f+D c.b+6 ++8.8.k+8.i.i.X.)+.+C+C+8.++++k+C+++)+E+#+H }+a+S.G+P.4+^.w b R m.a+E+R 9+9+w R 9+H .+R m.#+k ,+,+_ $.'.C C r ~ V.=+h =+;.T T T +.& t.l+w+/+l+l+l+l+0 j Q.C ^+;.=.=.y h h y y h =.I =.%+2 Q./+l+l+e+l+l+e+p./+5+!+_+ +*.%.!+[+t.l+l+7+l+7+l+l+w+w+w+w+C.C.Y.Y.g Y.g g * * * ` ` 4 !+e e 2+g.g.2+e e g.e H+F ;+F F F F 7.A+A+8.< n D D D o+D c.) }.g.g.2+g.g.2+e 2+S ~+6+6+6+> <.> 6+6+6+<.<.C <.C C C +.c.5+2+g.e g.g.e g.g.> & &.4.1.9.9.9.9.9.9.9.9.9.9.9.!.E u.D `.g.g.g.e 2+2+e e e &+l l l l l l l l e e e 2+2+g.e e e 2+e D.& @.1 S.G+G+]+]+]+]+]+]+6 ]+]+]+6 ]+6 Z j+e e e 2+2+e e e e 2+g.e e e g+: P.P.3.E+f E+H+B c.e 2+e g.e e 2+e e e g.e 2+e W.Q s |+K.K.g.Q.N.q.C+7.G.c.2+g.e e e e 2+g.k.U.L.L.H L.#+N.N.o+M g.g.e 2+2+e e e |+9.9.9.9.9.9.9.!.{ z o+J.q.(+e g.e 2+e s e e 2+!+j+2+e e 2+2+e k.m.8 9.9.9.9.9.9.9.9.9.c.g.2+e 2+g.e 2+g.e W.y+L r.l.] |.7 } 7 7 } } 7 } 7 } 7 d Q Q 0.. . . . . ", "4.4.) &.`.`.&.&.) ) ) 4.q+) `.4.4.q+4.4.) ) &.) ) ) ) 4.`.) ) ) 4.) `.`.`.) 4.) ) ) ) -+`.) ) `.) ) `.`.) `.) 4.{ ) `.&.&.9 &.`.) ) ) &.i+D c.8.8.b+>+8.++A+++++k+i.C+C+k+++8.k+)+)+)+i.)+E+'+s.H.B 2.i.w w s.H }+P.#+)+P.H+H.)+#+y.#+s.m.k m.[+R ,+9+R R T r _+~ V.=+=+=+I r r e.T & 1+/+'./+t.l+l+l+t.Q.& r h.%.=.V.=.h =.y h h I V.%+h.$.Q.e+e+l+e+e+7+t./+l+t.[+M t. +~ !+t.e+7+l+7+e+7+7+l+7+w+,.w+,.,.C.C.Y.Y.g g * * * '+` q.7.g.2+e s }.s e 2+e g.2+! F F F 3+3+3+n n n D o+( f+( f+f+>+) }.e 2+2+2+e e }.}.> ~+6+> <.6+6+<.> 6+> 6+> 6+6+6+<.C <.j+!+e s e e e 2+2+2+W.w.9 `.{ u 9.9.9.9.9.9.9.9.9.!.{ -+:+b+`.2+g.g.}.}.}.g.g.e k.3 3 l l l l l 3 ].O e 2+2+2+g.s }.s e 2+e T G+G+G+G+G+c+]+]+]+]+]+]+]+]+]+]+G+G+D g.e e 2+2+g.2+e }.}.e e e e k.o.5 E+E+E+E+E+w w D e | g.2+e }.}.e e e e 2+| e g+T.|+K.: : r.s +B 4+C+G.k+}.}.g.g.e g.| g.&+/+h+L.H L.#+s.N.o+*.2+g.}.}.}.g.2+s e 9.9.9.9.9.9.9.9.!.u x.9 J.J.!+e }.}.e 2+e e | g.5+g.e }.}.e 2+t+u.9.9.9.9.9.9.9.9.9.9.-.g.| e 2+e }.}.e e 2+}.x+r. .[.] } 7 7 7 7 7 d d d d q q Q Q 0.. . . . . ", "-.) ) &.&.`.&.) ) `.) 4.4.) 4.) -.{ ) q+`.&.`.) ) ) 4.4.) `.`.&.) ) ) ) ) 4.4.4.4.`.`.`.) ) ) ) ) ) `.`.) &.) ) ) `.{+&.&.`.) `.) ) ) &.9 i+c.>+D f+i+o+8.8.b+c.8.++8.b+b+k+b+++6 i.C+k+)+@.H.H.a+a+4+C+k+b #+a+C+3+H+i.H..+_.G+R m.9+9+R m.R b X b R R _ *.r ^+_+%+V.V.y =+_+r T & +. +t./+e+l+7+l+l+t.Q.C ^+;.%.=.y h h y y h V.=.V._+a Q.l+l+e+e+e+7+e+e+/+e+e+t.e+e+0 a +e+7+7+e+e+7+7+l+7+w+7+7+w+w+w+,.Y.,.,.Y.g g * * * * ` q.!+2+2+s }.e U.2+e 2+2+}._.F ;+n ;+n ;+5.*+( f+f+z z z z z q+}.g.| 2+2+| s }.s g+S <.<.<.<.> <.> 6+> 6+> 6+> 6+> <.> j+e.}.2+| g.g.2+U.2+W.C 5.9 -+{ !.9.9.9.9.9.9.9.!.8 x.z :+J.`.2+| g.s }.g.| 2+g.T.3 3 L 3 3 3 L 3 3 x+s | 2+2+2+s }.s | 2+e x+a ]+]+o G o ]+]+]+c+]+G+]+]+]+]+]+X.c.}.g.e | 2+2+| e e }.2+| e e t+ +b b w w w w b N.C+a 2+2+| e e }.g.| 2+e 2+2+2+&+~+K.: [.|.: U.}.t.N.B G.; e e | 2+e 2+2+2+0+L.H L.#+H L.N.4+9 *.| 2+e }.e | 2+e |+9.9.9.9.9.9.9.9.9.9.!.{ z b+8.s }.s 2+2+e e 2+| 2+| e }.}.2+g+K.!.9.9.9.9.9.9.9.9.9.9.9.!+2+2+| g.}.s e W.g.}.y+U.r.l.] 7 7 7 7 q q q d q q q Q Q 0.. . . . . . ", ") 4.4.`.`.4.`.) `.`.) ) 4.`.q+4.) q+4.4.4.) ) `.&.) 4.-.q+) 4.`.4.) `.`.`.`.4.4.) ) `.`.&.`.) 4.) ) ) `.) `.`.&.) -+`.&.) `.&.`.`.) ) &.&.9 D o+o+b+(+b+J.(+*+D 8.k+++8.++++++A+(+k+B.i.X.B.)+X..+H.s.^.^.z+#+B P.N.a+i B B.i.H+R R R m.#+E+E+G+5 2 2 ^+^ r T ^+~ %+V.V.V.=+V.h.T T +.& '.,+t.t.e+e+l+t.+.r h.v.%.V.h y h y h y y V.%+r Q.e+e+l+l+e+e+e+7+e+7+l+e+e+e+l+l+e+l+e+e+e+7+e+e+7+7+e+7+7+7+7+,.w+7+,.Y.Y.V Y.g g * * * ` q.2.2+e 2+2+2+r.2+e 2+2+g.2+6 Y n Y 5.*+( f+>.z `.E E -+E z -.}.e g.g.| 2+e 2+2+~+S C <.<.<.<.> <.> <.> <.> > 6+> 6+> j+}.g.x x g.g.g.e 2+W.O (+( z -+1.!.9.!.9.9.9.!.1.x.E f+*+J.`.2+| g.g.2+2+x 2+g.k.d+d+j.j.j.v v j.v y+o.6+2+| 2+e 2+2+W.| e 2+e 1 G _._.3+A+_.o ]+]+G+G+1 G+G+G+c+k+!+g.e g.g.| 2+}.2+2+x | g.2+D+z+z+b b n+n+n+n+#+H.; g.2+| e g.2+| | 2+e 2+2+2+t+|+S K.[.|.|.l.U.y+[+N.C+6 2+| | 2+e g.g.g.g+'+'+h+L.L.L.s.A+q+}.| g.e 2+2+r.| e O 9.9.9.9.9.9.9.9.9.9.9.!.{ f+9 }.2+2+x | 2+e e e | 2+e 2+2+x D+B !.9.9.9.9.9.9.9.9.9.9.9.9 g.2+| e 2+2+| x 2+s 5+<+r.l.l.] 7 7 7 7 q q q q Q q x+0.0.. . . . . . ", ") ) `.`.`.) `.`.`.) ) `.`.q+-.4.`.-+) ) q+q+) `.) `.) 4.q+) 4.`.) 4.) `.`.`.`.) `.`.&.`.`.) q+) ) ) `.`.) `.`.`.`.&.&.&.9 `.) ) `.) ) &.`.9 c.c.>+b+c.8.b+b+G.c.8.++++++C+k+++++A+B.k+k+C+i.)+)+)+i.X.P.G+}+w @..+Z G+H..+H.H.E+w P.E+E+P.^ 2 ^+^+h.;.v.%.v.h.^+_+%+%+V.V.V.=+%+r & & & [+9+t.l+l+l+j Q.T r ;.%.=.y y h h y y I V.%+^+$.j t.l+e+e+l+e+e+e+e+e+e+l+e+e+e+e+e+e+e+e+7+e+7+P e+e+7+7+7+7+7+7+,.,.m ,.p.,.Y.Y.g h+* * t '+` !+e g.x x | | 2+e e g.2+s a 5.E.E.( ( z `.E { 4.{ x.4.-+-.e 2+e e 2+e e W.W.0+> C C C C <.<.<.<.<.> 6+6+> <.> > > j+}.W.| | | 2+e g.2+W.O W (+>+z -+{ 8 8 !.!.8 { x.E u.:+G.C+`.2+2+s 2+r.x | 2+2+k.e+e+[ [ d+y+y+[ [ e+e+I.s 2+e g.x x | U.2+e 2+s G 3+n n n < 3+_.G o ]+]+]+]+! i.6 8.2+2+e e | g.e | x | 2+| g+: n+n+n+R z+#+n+#+m.p.c.e 2+2+}.| x | | 2+2+e e W.&+<.6+|+K.: [.l. .U.}.p.B 8.| | | | | g.e 2+2+N.'+'+s.H '+b+-.!+g.2+e g.| | | 2+2+s 9.9.9.9.9.9.9.9.9.9.9.9.!.x.z P.| x | 2+2+2+g.e 2+e e | x W.t+p+8 !.9.9.9.9.9.9.9.9.9.9.9.!+2+2+e 2+W.2+| 2+2+e !+y+r.l.] ] 7 7 7 d q d <+X.&.i+~+. . . . . . . ", "`.&.) ) `.4.4.&.`.4.q+) q+4.) ) ) ) 4.q+q+4.q+4.4.) 4.q+-.q+q+) 4.q+4.4.) `.`.`.&.`.&.) `.`.`.`.`.`.&.`.`.`.&.`.`.) &.9 9 ) `.) `.`.`.&.) &.9 9 c.f+i+b+c.c.o+o+c.++++8.++C+++k+k+C+++8.B.i.X.)+)+i.)+++)+@.)+X.^.)+H+H.w H+B.H..+i.1 ^ ^+h.h.;.v.v.%.=.=.=.=.;.;.%+V.V.V.V.V.V.h.T C & #+9+'.t.l+t.R & r h.v.V.y h y y h h =.y %+^ T '.j e+l+/+l+e+p.e+7+t.e+e+l+t.e+l+l+l+l+e+e+7+e+e+7+7+e+l+7+7+w+w+7+,.,.,.,.Y.,.g Y.h+h+* * '+` ` ` 5+g.| | 2+r.x g.e 2+e }.e | a c.&.x.4.{ { 8 { 1.8 u 1.u e e g.2+e }.}.| | W.> C C C C C C <.<.<.<.<.> <.> <.6+> j++.| 2+x r.2+2+e 2+e |+6 8.(+o+z `.4.x.{ { ~.E z u.*+G.;+C+`.2+e }.g.x 2+x r.| |.,.7+l+l+7+P P l+l+l+l+w+}.}.}.e x | | g+| e e 2+}.n G.*+*+5.n < _._.G G o ]+]+i.)+c.| 2+e e g.}.}.| x 2+W.W.&+s z+n+n+R y.n+R m.#+m.(+e g.}.}.| | 2+x x 2+e g.k.W.& +.w.D.].K.: .r.<+0 N.j+| 2+| x | g.e 2+s 1+k+A+i b+-+{+5+g.2+e }.e x 2+| r.x 6+9.9.9.9.9.9.9.9.9.9.9.9.9.u E i+x | 2+r.| 2+e g.2+}.}.| | g+r.= A 8 !.9.9.9.9.9.9.9.9.9.9.`.e }.}.2+x 2+x x 2+g.e !+X.X.p.t.y+t.p.B.o+&.c.X.+.g.g+. . . . . . . ", ") `.`.`.`.) &.`.) &.`.4.{ ) 4.`.) 4.&.-+4.4.q+q+4.) -+4.q+) 4.q+4.-.q+4.q+) &.`.`.) `.&.&.`.`.`.`.) `.`.&.&.9 `.&.`.`.`.&.&.) ) `.`.) `.`.&.`.&.9 i+D >+o+o+D c.c.k+k+k+k+C+G.c.6 C+k+C+k+k+i.)+i.i.X..+1 .+)+i..+X.1 H.}+}+E+H+1 ^ ^ _+v.v.%.%.%.=.V.=.I I h =.%.; V.V.=+=+=+I v.r T & l+,+/+l+l+'.'.T r ;.=.h =.y h h y y y V._+T t.l+t./+l+l+l+7+l+l+e+e+l+t.7+l+/+l+l+e+l+l+7+l+7+7+e+e+l+7+l+7+7+7+,.7+,.,.,.,.Y.p.V Y.* Y.* * * '+` p.W.x 2+| r.2+2+2+2+e }.e x | | | 5+P.c+W 8.(+8.(.1 !+}.2+g.| 2+e }.e | W.0+> r r r r C C C C C <.C <.<.<.<.6+6+j+}.x 2+W.| 2+2+2+2+e > 1 6 8.D >+u.z z E E z >.u.o+*+J.i 2.&.2+}.}.2+x | | x e |.C.C.C.J ,.w+w+w+,.,.C.C.C.}.+.e r.2+2+r.2+2+| 2+e a E.E.p+E.:+E.n 3+_._.k+_.r+C+i.>+}.g.| 2+g.}.s x x | x | 0.$.R M y.y.y.y.y.m.p.p.++5+2+s }.2+| | x | 2+2+2+t+I.T $.& s O U.l .U.<+y+p.b+2+| | x g.2+2+g.e }.e 5+(.1 }.g.2+2+2+s }.e x | | x 2+g.(.9 i+9.9.9.9.9.9.9.9.9.9.!.{ 4.e | | x 2+2+| 2+e }.e x x D+w p+= ~.8 !.9.9.9.9.9.9.9.9.9.9.c+}.}.| x | W.| g.| | 2+}.}.!+!+(.X.!+!+}.2+e e }.2+g+. . . . . . . ", "`.`.`.) `.) -+`.`.-+4.`.q+q+q+4.4.) ) -+) 4.4.q+-.4.) 4.q+q+4.4.4.4.q+4.q+q+`.`.) `.&.`.) ) ) `.`.`.`.&.&.&.&.&.&.`.&.&.&.&.`.`.`.) ) `.) ) ) `.&.9 i+o+8.++G.G.>+c.>+D c.k+++8.k+i.k+k+8.k+i.i.B.)+X.)+i.8.)+1 X.(+6 H+.+P.i.^ ^ h._+%.%.%.=.=.=.=.y =.y =.h y =.V.V.y h c h h V.r e.Q.l+,+,+/+'._ & T ;.=.y h h y y h y y V._+2 '.j e+e+l+l+l+/+e+l+7+/+/+/+7+e+7+p.l+t.l+l+l+l+e+l+l+/+e+l+7+7+l+7+w+7+,./+,.,.,.,.,.g Y.g g * * * '+q.` t.g+2+e e e | 2+2+2+e 2+| 2+e g.g.2+2+2+2+e g.| | e e e 2+| 2+2+e g.| g.W.6+r r r r r r C r C C C C C <.<.<.<.j+}.| 2+g.e 2+| 2+| W.S 2 1 6 8.(+>+f+u.u.u.9 E.*+n J.i C+^.`.| 2+e 2+2+2+g.2+g.0+L.L.- Y.Y.C.9+C.Y.Y.C.g L.L.}.g.| 2+e g.e 2+2+2+| e !+z E = z >.( *+< 3+++r+#.#.B.++(.2+| 2+| 2+g.| 2+2+g.W.&+y.m.R n+y._ [+y.y.9+p.H.X.2+2+e | | 2+g.e 2+| | t+a T e.e.$.0 o.D.<+<+v e+p.'+X.| e g.g.| | 2+2+e 2+| 2+e e e | 2+| 2+e 2+| 2+g.g.e | | 2+e 1.9.9.9.9.9.9.9.9.9.9.8 x.X.| g.2+e 2+| 2+2+e g.| W.0.7.*+p+= x.A 8 !.9.9.9.9.9.9.9.9.q+e e 2+| 2+g.g.g.| 2+| g.e 2+| e e g.| W.| 2+g.e 2+g+. . . . . . . ", "`.`.) 4.`.&.`.&.&.4.q+) `.`.-+q+4.q+`.&.) 4.q+4.) ) ) ) 4.-.4.4.q+4.4.4.) q+) ) &.`.&.`.) ) ) &.&.`.&.&.&.&.&.&.{+`.) &.&.{+`.`.`.) ) `.) ) ) `.&.&.i+c.i+D c.c.G.o+9 c.b+8.b+8.k+C+i.A+D 6 C+)+X.)+C+i.++++Z X.G.D X..+P.P.^ ~ _+%.%.%+=+y =.y y y y h =.y V.I V.V.V.=+h c h =+%+r & t.,+,+k ,+l+$.T ^+%+=.y h y y h y y V._+2 '.'.'.l+l+l+l+l+/+l+7+/+7+l+/+/+/+l+7+l+7+l+e+p.l+l+l+7+e+w+7+l+7+l+7+7+7+7+,.,.,.,.Y.,.Y.Y.Y.g h+* * * ` ` q.0 ~+}.s 2+2+2+2+2+e e 2+e s s g.| 2+2+2+2+g.2+e }.e g.| 2+2+2+g.g.e 2+S 6+^+2 r r r r r r r r C r C C C C C j+5+2+s }.e 2+2+2+2+W.S a 5 c+G 8.D 5.>+5.o+o+G.;+7.r+C+2.q.&.2+2+g.2+2+e s s 2+[.* s.h+L.h+h+h+h+L.L.L.L.s.'+m.}.2+g.s s g.| 2+2+2+e e k+{ ~.~.E >.f+*+G.3+C+B.)+)+^.j+| 2+2+2+g.e 2+2+s }.g+K.n+n+n+y.y.y.*.*.[+[+p.p.j+2+2+g.g.2+s }.e 2+2+g+~+a a a a *. +Q.0 v y+[ e+p.B C+}.}.e 2+| 2+2+2+e e 2+e }.e g.| | 5+2+g.g.2+g.}.e e | g.2+e T 9.9.9.9.9.9.9.9.9.9.!.{ i+g.}.}.g.| 2+2+2+2+g.2+k.r.7.;+*+:+>.E x.{ 8 !.9.9.9.9.9.9.9.9 W.2+2+s }.e 2+2+2+2+g.g.2+2+e }.e g.| g.2+2+e 2+g+. . . . . . . ", "&.`.`.`.`.&.`.`.`.-+4.`.`.) q+-.1.q+) ) 4.4.{ ) ) 4.4.4.-+) q+-.4.4.q+4.) ) q+`.`.&.) q+) ) `.`.`.&.&.&.`.&.&.&.&.`.`.&.&.&.`.&.&.) ) ) ) ) ) `.`.`.9 >+9 c.G.G.b+b+G.D D c.G.>+++8.k+k+C+6 i.X.B X.i.i.B.++++@.A+9 6 H+1 ~ _+_+%+%+V.I h =+I h h =.y y =.=.=.=.%+V.=+=+=+=+V.%+%+r 1+/+/+/+,+,+t.$.^+v.y y h h h h y y =._+2 $.j l+/+l+e+l+l+l+l+l+l+l+l+l+7+7+/+/+l+/+/+,+l+l+l+e+l+l+l+e+7+l+l+7+/+,.,.7+7+,.,.,.,.,.Y.g Y.Y.* * * * '+` q.q.l+k.| x 2+2+g.g.2+2+2+e e e | | 2+g.e g.2+| 2+s e 2+| 2+g.g.2+2+| e W.6+^ 2 ^+2 ^+2 r r r r r C r C r C T j+5+2+e s 2+x 2+e e | S r 5 n.6 _.8.D 5.*+n b+b+++r+B.2.^.4+&.e 2+2+2+2+e }.2+| k.'+'+'+h+'+s.H * * h+* * H s.'+y.e e s e | | e e g.2+2+2+>+8 A ~.E N f+*+< ++#.)+)+4+o+| g.e e 2+2+2+2+e e &+s y.n+m.y.[+[+[+[+[+[+m.m.c.e g.2+2+2+e s 2+| 2+T.s 2 z.z.a y._ +'.e+[ e+/+C.N.2.M e e | 2+e g.g.2+2+| e }.e | W.D+g+M 2+2+2+2+s e | | g.e e 5+9.9.9.9.9.9.9.9.9.9.!.A 4.5+e s 2+| 2+g.g.2+2+2+D+[+2.++J.G.*+f+u.z E x.{ 1.!.!.!.9.!.!.o+g+| e s 2+| 2+e g.g.2+2+| e }.2+| 2+g.g.2+2+2+g+. . . . . . . ", ") ) `.`.) ) ) ) `.`.`.&.) ) { -.-.q+-.-.) 4.q+4.`.q+-.) `.-+q+4.4.4.4.) ) q+) `.) `.) `.&.`.`.`.`.&.`.&.&.`.&.&.&.`.`.&.`.&.`.`.`.`.) `.`.) `.) &.&.9 i+c.b+8.b+c.c.c.>+i+c.D c.++8.D k+k+k+k+k+6 X.k+6 X.X.i.i.C+C+6 (._+_+=.%+=.y I h h h h h y V.h =.V.=.V.; %+%+V.=+V.; ~ ~ 2 a R 9+,+/+/+_ $.r ;.V.y y y h h y y V._+r '.'./+,+,+t.p.l+l+/+l+l+l+/+7+/+l+l+l+l+7+p.p.w+l+l+t.l+/+l+l+7+l+7+/+7+7+l+7+/+,.,.,.,.p.,.,.Y.g Y.g h+* * ` * ` ` q.H : T.W.e e 2+2+2+| | e 2+| 2+e e g.2+| 2+| g.g.| 2+e e e 2+| 2+| ~+6+^ 5 ^ 2 ^+2 2 2 2 r r r r T T T T c.}.| 2+g.| | g.e e W.S 2 ^ (.G W < b+n D b+< ++C+B.2.^.^.4+&.g.g.2+| | | e 2+| ~+'+}+'+'+'+'+'+h+'+'+'+'+'+'+}+4+*.e e 2+2+2+g.e 2+2+2+| e `.!.8 x.E u.:+;+++B.)+X..+c.}.g.e g.2+2+| | g.e t+*.n+n+y.y.,+[+[+[+m.9+y.p.J.+.2+2+2+| 2+g.2+| 2+D+a 5 2 z.R M R 9+,+t.l+l+,+L.'+2.J.e | | 2+e e g.2+2+| | g.2+g+0.D+C+6 2+2+| 2+e g.| | e e e I.9.9.9.9.9.9.9.9.9.!.8 x.z 6 g.2+| 2+g.e e 2+2+W.Q B ^.2.C+7.J.G.G.:+f+z N z E E { A { A x.o+g+g+e 2+| g.g.e 2+2+| | | e 2+| 2+e e 2+2+2+g+. . . . . . . ", "4.) ) ) q+) q+4.`.`.`.`.-+4.`.4.{ q+4.q+-.4.4.4.4.q+q+`.`.-+) q+-.4.4.4.) 4.q+) `.&.`.&.`.) `.{+&.`.`.&.`.&.&.&.&.&.&.`.`.`.&.`.`.&.&.&.) &.`.&.&.9 9 9 i+D c.c.J.G.c.G.G.c.o+c.c.b+b+C+k+8.8.++b+D ++8.k+6 k+k+k+; (.~ %+%+=.I V.c h h j+h =+c I =.V.V.=.%+v.~ %+~ ~ ~ ~ ^ 2 b z.n+#+[+9+,+,+R T h.%+V.=.y h y y y V._+z._ '.l+/+,+w+/+,+/+/+l+/+/+7+p.w+l+/+7+/+/+l+7+l+/+w+w+p.l+7+e+/+l+l+l+7+w+w+,.w+7+,.w+7+,.,.Y.p.Y.g p.g h+* * * '+q.` q.q.q.l+B+&+g+2+g.g.2+2+e e g.g.g.2+g.e 2+e 2+g.e e g.g.e | W.~+T.t+. C ^ ^ ^ ^ 5 ^ 2 2 2 5 2 2 r 2 r T r 5 }.| | g.2+2+U.2+2+W.> n.6 W 8.(+D D D G.b+J.7.i 2.^.a+a+'+)+e 2+2+| | x 2+2+2+[.'+a+'+'+'+'+'+'+'+'+'+'+'+'+a+'+a+}.| 2+2+2+2+2+2+x 2+| r.}.1.8 { E E f+G.++B..+4+.+)+e.2+| 2+| 2+2+x | x B+m.n+m.n+y.[+,+,+[+,+9+p.m.B 5+| 2+| x | 2+2+| W.T.5 P.!+z.z.z.R 9+9+C.,+w+C.h+a+o n D |+g+2+e 2+g.g.e 2+2+2+0+t+k.C+*+J.+.g+2+2+e e e g.e 2+2+O !.9.9.9.9.9.9.9.!.8 ~.x.p+c.2+2+2+2+2+| 2+| 2+&+| B 4+^.)+C+C+A+A+J.J.G.o+o+o+f+u.z N E >.p+*+5+D+k.W.2+g.g.g.e e 2+2+e e e g.2+2+W.&+t+. . . . . . . . ", ") ) &.-+4.) `.`.`.`.`.&.`.) `.4.4.4.-.{ q+4.q+4.4.q+&.`.`.`.) 4.q+) ) 4.4.4.q+) `.`.) `.) ) `.`.`.&.`.`.&.&.9 &.&.&.&.`.&.&.&.&.&.&.&.&.&.) ) ) &.9 i+i+9 i+D o+i+>+D b+8.b+b+b+8.b+8.k+D 9 c.k+8.++k+k+k+++8.8.j+~ %.%.V.V.y y Z.{+Z.c h c h V.V.V.V.%+_+_+_+~ ; ~ _+^ 5 2 b n+9+[+9+R [+y._ a ^+%+y y y y y y V.%+_+z._ k C.,+w+,+w+w+w+w+w+w+/+w+w+/+w+,./+w+w+/+w+/+l+w+/+/+p./+l+7+/+7+/+7+/+7+/+7+/+,./+,.,.,.,.,.,.Y.Y.Y.g h+H * * * * ` q.8+8+r+2.[+K.t+t+T.g+W.2+2+e e | 2+e 2+e }.e | W.g+0+&+t+t+. . k.> $.^ n.n.n.^ n.^ ^ ^ ^ 5 5 2 2 2 z.2 2 r C . . . . . . . . . O W 8.(+D D >+( ( o+*+;+J.C+o )+R.a+4+4+y+. . . . . . . . B+R.a+R.'+'+a+'+a+* '+'+'+'+'+a+R.a+R.K.. . . . . . . . . . . _.!.8 x.= u.o+J.i..+B B P.N.. . . . . . . . . K.n+m.n+y.y.[+[+[+[+[+,+[+p.#+m.0.. . . . . . . . |+1 5 5 b b z+#+m.L.p.C.9+C.X R.i n z `.z+t+&+g+g+W.W.g+&+t+. }.f+u.f+o+J.}.t+0+g+W.W.g+0+D+t+K.-+A !.!.9.9.!.!.8 A E >.p+*+s . . . . . . . . . /+'+B .+^.)+B.C+C+C+++++C+++++J.b+o+*+*+f+*+;+J.)+s &+t+&+k.g+W.W.| W.g+g+0+&+t+. . . . . . . . . . . . ", "`.) ) `.) ) ) `.`.&.&.`.4.) 4.) &.`.) -+4.4.4.4.-.q+`.`.) `.) 4.q+4.q+4.) ) 4.) ) 4.) ) 4.) ) ) ) `.`.`.`.) &.&.&.&.&.&.9 9 &.{+&.`.) `.&.&.`.&.&.`.&.9 9 &.9 i+>+c.i+>+D D c.b+(+c.b+8.o+9 D b+8.8.8.k+W 8.W n.; %+%+I h c Z.Z.h c h =+h =+y V.%+%+~ n.^ ~ ^ ^ ; 5 2 n.1 b w R #+P.R X m.R a 2 v.%+V.y y y =.y V.^+z._ _ k ,+w+w+C.,+/+/+w+/+p.w+w+/+w+w+/+/+w+w+/+C.w+/+w+w+l+w+/+/+/+l+/+/+w+w+w+,.,.w+,.,./+,.,.p.Y.Y.Y.Y.g Y.g h+* * '+'+` q.q.q.f.i 4 7.7.H.Q.S T.t+. . . t+t+t+t+t+. t+. . 0.k.2+I.e.^ 6 ; (.6 (.(.n.n.n.n.^ ^ 5 ^ ^ ^ 5 ^ 5 2 2 2 2 a C C C +.C T T 2 5 6 c >+( 9 9 z z u.( o+G.n A+i B.q.R.q.2.a+w }+}+4+.+4+}+w H q.a+'+R.'+'+'+R.'+R.'+a+` '+a+'+R.^.#.^.#.J.G.o+( ( i+9 ( i+9 !.8 { E >.o+J.k+@.P.H.H.H.*.t.Q.Q.I.I.I.Q.I.y.R n+m.m.y.[+,+[+,+[+p.9+m.m.#+t. + + +1+e.e.e.e.5 1 P.P.b w b w #+#+#+L.p.L.s.! 3+5.z 4.8 ) 1 2+&+t+t+&+W.n+f+E z >.u.:+G.J..+e k.t+. t+D+r.}.B.f+z E ~.8 8 8 A x.x.N p+*+;+2.p./+t.0 0 Q.0 t.l+'+'+'+4+X..+)+i.B.C+i.C+i.C+B.i.B.C+++J.J.J.7.C+C+4+4+ +g.g+0.t+t+t+. . . 0.D+q q q q Q 0.. . . . . . . ", ") ) `.`.`.`.`.`.`.&.`.`.) `.`.) ) `.&.) 4.) 4.4.1.4.) `.`.`.&.`.4.q+-.q+) ) ) 4.q+) ) ) ) 4.) ) ) ) ) &.) `.&.&.&.&.9 &.&.`.`.`.&.&.`.`.`.&.&.&.9 &.&.&.9 &.&.i+i+f+c.>+i+9 D b+b+b+c.D D D >+j+D j+k+c.j+~ _+j+c.=+h Z.Z.Z.c h h y =+=+V.V.V.~ ~ ~ ^ ^ ^ ^ 5 ^ G W k+X.G+P.H.H+1 G+E+9+X E+2 _+%+=.y y y y y %+_+z.z.E+R ,+,+[+,+C.p.,+w+w+Y.p.w+p.w+p.w+w+w+w+w+w+/+p.w+/+/+w+/+,./+w+w+/+,./+w+/+7+p.7+p.,.,.,.,.,.,.,.,.g p.Y.g h+'+* '+` '+` q.8+2.r+4 7.;+G.*+u.u.f+D 8.k+6 X.X.X.X.k+b+i+z ) ) {+i+c.W ; 6 ; (.; n.~ ~ n.n.n.~ n.^ ^ ^ ^ 5 ^ ^ ^ 5 ^ 2 2 5 2 5 ^ (.; W c i+9 9 &.E `.E E E E u.:+b.;+3+i r+2.r+i :.;+Y :+E.p+:+*+;+7.B.2.` '+'+` '+a+'+'+* a+'+'+a+a+a+! 7.*+>.x.{ !.9.9.9.9.9.9.9.9.!.~.E z :+b+i.H+H.H.H.H.N.b b n+n+n+n+a n+n+n+n+R m.[+[+/+[+[+,+9+[+m.#+#+w H.H.}+E+P.b P.5 1 1 P.E+P.b w w #+H L.#+L.L.s.o _.E.z 4.-.1.u 9.u -.4.-.1.-.4.-+`.z f+( *+b+C+C+2.q.^..+B.B.C+C+A+G.f+>.x.x.x.E = >.p+*+G.J.C+2.4+H L.p.L.h+H '+4+4+^.)+)+C+C+C+C+++++C+++C+C+C+i.i.i.i.C+B.C+)+4+4+N.N.p.p.p.t.e+}.y+s <+l r.: } 7 q Q 0.. . . . . . . ", "`.`.`.) &.&.&.`.&.) ) ) 4.) ) `.`.&.-+) 4.) -+) 4.) 4.) ) &.`.-+`.4.4.-.q+q+`.) 4.) ) ) ) `.) ) ) ) `.) `.) `.&.`.`.`.&.&.) ) `.`.`.`.&.&.&.&.9 &.{+9 &.9 &.&.9 9 i+>+f+i+i+c.b+c.o+c.D o+i+>+i+o+o+c.o+9 V.V.c c Z.c h j+y h j+=+=+=+; %+~ ~ ^ ^ (.^ (.5 n.6 W 6 k+6 6 6 H+@.@..+.+b w b 5 ^ v.v.V.y y y y V._+2 k k 3.C.9+L.9+,+C.C.,+p.p.C.C.,+w+w+p.p.p.w+w+p.,.w+p.C.C.w+p./+w+,./+/+w+w+w+,.,.,.,.p.p.7+p.,.,.,.,.Y.,.Y.g Y.g g * * '+'+4+` q.q.f.2.4 7.J.G.o+f+u.`.E -+-+4.{ -.1.1.1.1.1.-.4.`.9 c 8.W 6 6 ; ]+6 (.(.(.]+~ n.n.n.n.^ n.^ ^ ^ 5 ^ ^ ^ 5 ^ ^ ^ ^ (.W (+i+( &.`.-+4.{ { { x.x.E E u.( *+;+:.F 7.;+;+E.u.N = s+s+= = u.*+3+r+q.R.a+'+'+'+` '+'+R.'+'+R.a+R.r+;+:+= A 8 !.9.9.9.9.9.9.9.9.9.8 E z f+b+k+P.b b b n+b #+n+z+n+n+n+y.n+y.n+n+y.9+m.[+[+,+[+[+p.9+p.m.#+s.s.H+H+E+E+E+P.5 P.5 P.b w w w w #+s.H s.s.#+s.]+3+5.z -+{ -.1.1.u u u u u 1.-.4.E z u.( *+b+++B.)+^.4+B B 4+4+.+)+C+++G.:+p+u.p+p+:+*+;+J.7.2.q.B H #+p.m.#+N.a+.+)+B.C+++J.G.G.o+*+o+*+G.G.J.++++C+X.X.X.X.X.4+B N.N.p.p.[+[+t.t.e+0 y+<+l r.m+l.7 d Q Q . . . . . . . ", "`.) ) `.&.&.`.`.`.`.) `.`.`.`.`.&.&.&.-+) `.`.`.&.) ) ) `.`.`.`.`.`.) ) q+`.`.`.4.q+q+) ) ) &.&.) ) ) `.`.) ) `.) ) `.&.`.) ) ) ) ) `.`.&.&.`.&.`.&.&.9 &.9 9 9 9 9 i+i+i+c.j+b+D D D o+>+o+b+.+N.n+X.; j+=+h Z.Z.c h h h I =+V.=+~ ^ _+^ ^ ^ ^ ^ (.G G 6 k+(+6 k+6 6 k+i.X.)+G+@.@.H+E+b ^ %+_+V.y y y y y V.^ z.X k R m.9+9+p.9+#+9+C.C.9+p.p.p.C.p.C.L.p.p.C.C.p.p.C.p.p.,+p.,.p.,./+,.p.w+p.7+p.w+,.,.,.,.,.,.,.Y.,.Y.p.Y.Y.h+h+* * * * ` '+` ` q.2.r+r+7.J.;+*+:+u.z z `.x.4.4.{ { 1.1.1.-.4.`.9 i+(+W ; G ; (.~ G ~ ]+(.~ n.(.n.n.n.n.n.n.n.^ c+^ ^ ^ ^ 5 ^ ^ ~ W (+c 9 `.`.-.-.8 u !.8 1.8 { x.= N :+E.*+b.*+*+u.N E ~.A 8 8 8 ~.s+N *+:.4 q.R.a+a+'+'+4+* '+a+'+'+a+.+r+;+:+E A !.9.9.9.9.9.9.9.9.9.9.8 ~.E f+G.i.1 #+b n+#+n+n+n+n+y.M y.n+n+n+m.m.y.y.[+[+[+[+[+C.[+,+C.#+L.#+N.s.}+}+P.H.b z+z+b w H.E+H.w s.s.H H s.H s.M.o W E.E.`.-+4.-.1.u u 9.u 9.u -.4.-+z ( E.*+;+++)+4+B B N.N.N.N.B B 4+)+7.J.;+*+*+*+;+J.J.i 2.^.4+'+H 9+L.L.s.a+^.B.C+A+G.*+f+f+>.z N N z >.u.f+G.G.++C+q.4+B B N.N.p.p.p.,+[+/+l+t.t.o.y+<+L r.m+l.} d q Q Q . . . . . . ", "&.`.) `.&.&.&.`.&.&.&.`.`.9 &.`.`.&.&.`.`.`.`.`.`.) &.&.&.`.`.) 4.4.) ) 4.`.) ) ) 4.) ) ) &.`.) ) ) ) ) q+) ) ) ) &.) ) ) ) ) ) `.`.`.`.`.) `.&.&.9 9 &.&.9 &.&.i+i+c.i+9 i+c.c.9 k+n+)+J.8.1+*.+.5+^ n.j+Z.c c h j+h =+y =+V.~ ~ _+~ (.^ 5 c+6 G 8.G 6 6 8.8.8.(+k+i.C+Z X.i.H+@.X.}+1 ^ V._+_+y y y y y V.^ 5 X w S.w #+s.#+X w #+#+#+9+s.L.#+9+L.9+p.p.L.p.p.C.L.L.C.L.p.C.p.C.p.,.p.,./+p.,.,./+,.p.p.p.,.p.,.p.,.g Y.g g Y.h+H Y.* * '+* 4+4+` q.q.f.r+i A+J.G.*+f+u.N `.E x.4.{ { { 1.{ 4.`.&.i+c W G ; 6 ~ 6 ~ (.(.; (.(.(.]+~ ]+~ n.n.n.n.^ n.^ ^ ^ ^ ^ (.; ; c i+{+) q+1.u 9.9.9.9.9.!.!.8 A 4.E N u.:+E.p+N = ~.8 8 !.!.8 8 8 A s+>.*+7.2.R.` '+'+'+'+'+'+'+4+'+a+^.7.*+a.E A 8 !.9.9.9.9.9.9.9.9.9.!.{ E f+c.k+P.!+#+n+n+M n+y.n+m.n+y.y.n+n+M n+y.[+[+[+[+,+[+p.9+p.9+9+L.s.s.}+'+}+E+E+H.H.b b b w w w w H s.H s.h+H #+s.! _.5.( z `.-+q+q+1.-.u u u u 1.4.E z ( 5.n 3+7.B.B '+h+H L.H p.H N.B B 4+)+C+7.7.J.7.7.2.C+2.q.4+'+H #+L.H s.a+2.7.G.*+f+>.E x.~.{ 8 { { { x.E z u.o+J.++B.B B p.p.y.[+[+/+t.t.t.t.t.0 0 y+<+l m+@ } } q Q q 0.. . . . . ", ") `.`.&.9 &.`.`.&.9 &.`.`.`.`.&.&.&.`.) `.) `.&.&.&.`.&.`.`.4.4.4.4.`.) `.`.`.) `.) ) `.`.) ) q+) `.) ) q+) ) ) &.&.&.) `.) ) ) &.&.`.`.) ) &.&.&.&.&.&.&.&.9 &.9 {+9 i+&.9 9 f+j+^ !+e.z+i.(.e.y.(+6 !+c.c c c h =+=+j+=+%+~ ; ~ ^ n.W (.6 _.8.k+k+6 k+k+i.k+k+k+6 Z i.++G X..+@.@.@.]+=+%+_+I y I I =+V.%+n.f S..+H+#+E+w H.H H w @.w H H L.L.#+L.#+'+L.L.L.L.L.L.L.L.L.L.C.p.C.p.p.p.p.,.p.,.p.,.p.,.p.p.,.Y.,.Y.Y.,.Y.Y.p.g Y.Y.* h+'+* * '+` 4+R.q.2.2.i 7.J.n o+:+f+u.>.z `.x.4.4.{ 4.-+) &.i+i+8.W 6 (.~ ]+(.(.n.]+~ ]+~ n.(.n.n.n.n.(.n.(.n.(.n.n.n.(.(.(.; j+5.9 `.4.1.9.9.9.9.9.9.9.9.!.!.8 A ~.E = N = = s+8 8 !.9.9.9.9.9.!.!.8 x.u.;+r+q.a+R.R.'+4+'+` '+'+'+a+2.i *+:+= ~.8 !.9.9.9.9.9.9.9.9.9.!.~.E f+G.k+.+b n+M y.[+y.y.y.y.y.n+z+n+a n+y.n+m.y. +[+[+9+[+,+m.p.#+#+#+w '+E+s.E+E+E+w H w w H s.w N.s.H s.H s.#+s.3.3._.< E.( E.&.`.) q+q+u u u u -.-+z z E.5.n J.++B.4+H H L.H L.H L.p.H H B 4+q.q.C+2.C+2.q.q.4+4+B H H L.L.L.}+^.i b+o+u.= { { !.!.9.!.9.!.9.!.u { E z o+G.++X.B N.*. +t.t.l+/+t.l+t.0 0 y+y+<+l r.l.[.7 } d Q 0.. . . . . ", "`.`.`.) `.`.&.&.&.&.`.`.) `.&.9 &.&.`.`.`.`.`.&.`.`.`.`.) ) ) 4.q+4.) 4.) ) `.) `.) `.`.&.) ) ) ) q+4.) ) ) ) ) ) `.) ) ) ) ) q+`.) ) `.`.) &.9 9 &.&.&.`.&.`.`.&.&.&.9 9 &.i+9 i+c.W ; T X.D (.B z+5+2 j+j+c 9 j+V.%+; ~ ~ (.W W 6 G 8.6 k+(+D c.(+8.k+W W 8.8.k+6 6 i.i.k+6 @.)+H+1 =+=+_+=+c h =+V.=+V.^ f f ! @.}+a+B a+}+w H B J.k+#+w H h+H s.w L.H N.}+H H.#+L.L.L.H H Y.L.L.g p.Y.p.p.,.Y.p.Y.Y.g Y.p.Y.Y.Y.Y.Y.p.g Y.g h+H h+* * '+4+'+'+q.R.q.2.2.r+7.J.J.G.o+o+f+9 >.z z E E E -+&.9 9 c j+G ~ c+(.c+n.n.n.n.n.n.n.(.]+~ n.n.~ n.n.n.n.n.n.n.^ n.^ ~ ; W c {+`.q+1.9.9.9.9.9.9.9.9.9.9.9.!.8 A { s+E x.A 8 !.!.9.9.9.9.9.9.9.9.!.8 = E.J.r+R.'+` a+a+'+'+'+'+'+4+^.i ;+:+= s+A 8 !.9.9.9.9.9.9.9.!.8 x.z :+b+i..+b n+M y.[+[+[+[+R *.M n+n+n+n+y.y.[+y.[+[+[+m.m.9+9+9+9+L.H s.'+'+'+'+s.s.E+s.w w w s.s.#+s.H H H s.s.#+f 3.o < < 5.E.{+&.{+-+q+-.u u 1.4.`.z E.( n n 3+r+B.^.'+L.L.L.p.L.L.L.p.H H N.N.4+4+4+q.q.4+4+'+N.H L.#+p.m.H a+#.;+:+>.x.{ !.!.9.9.9.9.9.9.9.9.9.9.8 { E f+c.C+X.N.y.[+0 t.0 t.Q.l+t.Q.0 y+y+<+3 l r.@ ] 7 7 d q 0.. . . . ", "`.`.) ) ) ) &.&.`.&.`.&.`.`.9 &.9 &.&.`.`.`.&.`.&.`.) ) `.) 4.4.q+) ) q+q+) ) ) `.) ) `.`.`.) 4.) 4.) `.`.) ) ) `.`.&.`.`.&.&.) `.) ) ) ) ) `.{+&.`.&.`.&.&.`.&.&.&.9 9 9 9 f+i+i+i+c.c.y ^+k+b e.P.j+C+D 8.i+&.i+; j+W ; ; 8.8.j+k+W k+6 8.j+D (+(+(+c.D c.j+8.c.++8.Z X.i.)+P.P.E+; j+%+_+=+Z.c =+=+V.; 1 H+H+@..+G @.@.6 @.a+H+)+i k+H.H s.H.}+}+4+S.H '+H '+'+H H N.s.H H H H H H H L.L.H p.Y.Y.L.p.Y.p.Y.Y.p.Y.g Y.g Y.H H h+H * '+* '+'+` '+a+R.q.q.2.r+r+++J.J.G.*+*+f+f+u.z z z z 9 9 9 D (+W (.c+c+n.c+^ ^ n.^ ^ n.n.n.^ n.n.n.n.n.^ n.n.n.n.(.(.(.(.; W c 5.&.-+-.!.9.9.9.9.9.9.9.9.9.9.9.9.!.!.A A A { 8 !.9.9.9.9.9.9.9.9.9.9.!.!.A N *+4 8+q.R.` '+R.'+R.'+'+a+2.r+;+:+>.E ~.8 !.!.9.9.9.9.9.9.8 { E >.G.A+B..+b M *.[+*.*.y.R [+y.n+M m.n+n+n+[+p.y.y.m.n+m.m.m.#+p.L.L.L.H H '+'+}+}+s.H.H }+s.H w H s.'+H H s.H #+s.X 3.! o < 5.5.5.E.( z {+) q+-.-.-+{+( ( E.n 3+A+i o 4+B H L.p.L.L.L.L.Y.p.p.p.H N.H '+N.B '+'+H H s.H L.- #+w @.C+5.>.E A !.9.9.9.9.9.9.9.9.9.9.9.9.9.!.x.E f+b+i.B p. +t.0 t.Q.l+0 0 t.t.e+y+v <+l r.r.l.[.} d q q Q Q . . ", "&.&.`.`.) ) `.`.`.&.`.`.&.`.&.&.9 9 &.`.&.&.`.&.&.`.) 4.) ) 4.) q+4.) 4.q+) ) `.`.`.`.`.&.`.`.) ) ) `.`.&.) ) `.`.&.&.9 9 &.&.) q+) ) ) ) ) ) `.&.`.) ) `.&.&.&.&.&.&.9 &.&.9 9 9 i+i+c c V.!+n.n.++(.e.*.1 j+9 9 i+i+D D c.8._.8.8.(+k+6 ++8.(+(+(+8.(+(+D 8.8.(+(+8.6 Z X.Z @.1 ~ =+I %+V.c c h =+=+V.(.]+]+Z B.i.A+i.++o+H+S.)+.+^.^.G+}+a+4+a+a+4+4+B a+B B B a+'+B a+'+'+N.'+'+H H '+H h+L.H H * H h+'+h+H * Y.H * H * g * H H '+'+'+'+4+q.q.q.^.2.2.2.r+i ++A+J.b+D D o+>+( f+( 9 f+( >+c.8.k+(.c+1 5 5 5 ^ 5 ^ 5 ^ 5 ^ 5 n.^ ^ c+n.^ n.^ n.n.n.^ n.n.(.~ W c ( `.-.1.9.9.9.9.9.9.9.9.9.9.9.9.9.!.!.!.!.8 !.9.9.9.9.9.9.9.9.9.9.9.9.9.!.8 = :+;+r+8+R.8+R.` '+'+'+'+4+^.B.:.*+:+= E A 8 8 !.9.9.9.!.!.A E z :+G.++)+4+N.n+*.[+[+*.[+y.n+y.y.n+9+n+[+m.9+[+m.n+m.b H #+H w #+H L.L.h+s.s.s.}+}+}+E+H }+}+s.N.E+s.s.s.H H H s.s.s.3.3.o G < < 5.c 5.5.( {+`.-+`.z E.( 5.5.n 3+_.i 2.a+'+H L.L.p.p.p.p.Y.Y.Y.p.p.L.p.H H H p.'+L.L.#+L.L.p.#+s.! J.:+E A !.!.9.9.9.9.9.9.9.9.9.9.9.9.9.9.!.A N f+8.i.N.y.5+t.0 t.0 /+0 l+0 e+y+y+y+3 U.F.m+l.[.} 7 d q q Q 0.", "`.&.9 &.9 &.&.&.9 &.&.`.&.&.9 9 &.&.`.`.9 9 &.&.`.`.`.`.) 4.`.`.z -+q+q+{ q+q+q+q+) ) &.`.`.`.) 4.) &.&.&.`.) ) `.{+9 &.9 `.`.) q+) `.) `.`.`.`.`.) `.`.`.&.`.&.&.&.&.&.&.`.&.&.&.{+9 i+c j+; c.c.i+c.~ n.n.W j+c.i+i+c.i+i+c.8.(+D (+c.(+c.>+>+D D (+8.8.(+++8.++8.++8.k+k+6 6 ~ =+y =+=+=+h Z.h =+W V.~ Z )+)+6 k+k+k+k+k+Z )+! ^.)+)+)+^.! ^.^.#.)+S.4+a+.+a+4+.+.+4+4+4+4+4+4+'+4+'+'+'+'+'+'+'+H '+'+H '+'+'+'+'+'+'+'+'+* * * '+'+'+4+'+4+^.^.o 2.B.B.#.C+++++b+D 5.D n *+o+o+>+o+D c.(+8.; n.^ 5 ^+5 ^+2 5 5 5 5 5 5 5 5 5 5 5 5 ^ ^ ^ ^ n.^ ^ ^ n.n.(.; j+5.{+`.-.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.!.!.!.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8 ~.N b.4 r+2.8+R.R.R.` a+'+a+^.2.++;+*+u.N s+~.A 8 !.!.!.!.~.E N f+*+J.C+i.B b n+n+[+y.[+y.y.m.y.m.n+M y.n+y.y.m.n+#+w w H }+N.'+'+s.H s.H h+H '+H '+'+'+}+H s.s.'+H H H H H L.s.H E+s.M.f ! o G _.< < < 5.5.5.5.( ( ( 5.5.5.3+3+7.7.o )+.+'+L.L.p.g Y.Y.p.#+p.L.L.p.g p.p.#+L.L.L.L.#+L.p.#+L.#+}+)+n u.x.8 !.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.!.u E u.o+C+X.p.t.t.Q.t.e+t.Q.t.0 0 0 y+v <+U.| F.r.l.l.] } } } d q ", "&.&.9 9 9 9 9 9 &.&.`.&.&.&.&.&.9 &.&.`.&.&.&.&.`.`.&.`.) ) &.&.9 `.4.) -+4.4.4.4.4.) &.&.&.&.&.&.`.&.&.&.`.`.`.4.`.`.&.&.) ) ) ) `.`.`.&.`.`.`.&.`.&.&.&.&.&.`.&.&.&.&.&.&.&.&.&.&.&.9 &.9 9 9 9 9 9 9 {+9 9 9 i+D i+i+i+i+9 9 9 i+i+D D >+D >+c.b+8.b+++8.8.8.8.k+k+k+W k+k+k+V.j+h c c Z.c Z.c h =+V.; 6 i.B.8.8.k+8.D b+C+i.i.)+#.#.k+)+)+)+)+#.^.)+)+)+C+)+B.B.)+)+)+)+^..+4+4+q.4+4+4+4+4+4+4+'+B B '+B B B B B B B q.B B 4+4+B 4+q.q.^.)+#.C+_.A+< b+D b+n b+o+5.o+b+b+b+b+G.b+G.b+8.8.6 ^ P.!+2 2 2 2 2 2 z.2 2 5 2 2 2 2 ^ 2 ^ 5 5 5 5 5 ^ n.^ n.^ ]+; c 5.{+{ 1.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.!.~.= E.F + f.f.8+8+R.R.'+'+'+^.2.r+7.;+:+u.N E x.~.A { ~.x.x.z p+o+G.J.C+X.B N.n+m.[+y.[+[+[+m.y.y.m.n+n+m.m.y.y.n+N.N.B a+a+a+a+a+'+'+'+H '+'+* L.H s.'+'+'+'+w H s.s.s.H h+h+H H #+s.s.M.3.! o o G _.W < W < < < c n n < 3+A+_.r+r+o 2.}+'+H L.L.L.p.L.Y.L.L.L.L.H L.H L.N.L.p.H L.#+#+L.m.L.#+a+r+*+N A !.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.{ E o+J.i.N.n+5+t.Q.e+t.t.l+t.e+0 y+y+y+<+3 U.l r.m+g+] |.] } 7 ", "&.&.9 i+z &.9 `.&.&.`.&.&.&.9 9 &.9 &.&.9 &.&.&.`.`.`.`.`.&.`.&.&.z ) 4.4.q+q+4.) q+`.`.&.9 &.&.`.&.`.`.&.9 9 &.9 &.&.`.) 4.4.) `.`.&.`.&.`.`.`.&.&.&.&.9 &.&.9 &.&.&.&.&.&.`.&.&.9 9 9 9 9 &.9 9 &.9 &.9 &.9 &.9 z {+9 9 9 9 9 &.&.9 9 9 i+>+c.(+c.(+c.(+c.c.(+c.j+k+8.W k+W ; =+c h Z.Z.Z.Z.c Z.Z.c c c ; ; k+8.(+c.8.W 8.W 8.G W k+8.W 6 G k+W 6 6 G k+W W G k+W 6 W 8.W W k+6 6 6 6 6 6 X.i.X.6 i.k+k+6 i.C+C+++++++8.8.b+J.J.;+G.D o+>+( f+( :+D n J.A+_.++++k+i.8.b+A+8.A+8.8.8.8.k+6 (.1 P.r a 2 T r T T r 2 T r 2 2 2 2 z.2 2 2 2 5 5 ^+5 5 5 ^ 1 ^ n.; c ( &.4.u 9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8 A = E.b.F 4 4 f.8+8+q.` a+a+4+^.B.A+J.G.:+u.N E x.x.x.E E >.u.*+G.J.C+)+4+H.n+n+y.[+[+y.y.m.y.m.9+n+m.m.y.y.n+m.E+N.'+B '+4+4+4+q.q.^.R.R.4+'+}+'+}+s.s.s.w '+'+'+H H H h+H * h+'+h+s.g M.f f ! ]+o o o G _.W _._._.3+< 3+A+_.i r+o 2.a+a+#+#+L.9+L.L.p.L.H L.H H H '+N.N.N.N.'+w w #+#+L.#+#+w ! _.E.= A 8 !.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.!.8 x.z o+8.B N. +t.t.t.e+t.t.t.e+t.e+y+y+y+<+<+U.l r.m+r.l.l.l.[.", "&.&.&.&.&.&.&.&.&.&.&.`.&.&.&.&.&.&.z &.9 &.9 &.&.&.&.&.&.&.4.) &.&.&.) -+4.q+q+4.4.`.`.&.&.`.&.&.) `.`.9 &.&.&.&.9 &.`.) &.`.`.&.&.&.&.&.&.`.`.&.&.&.&.&.&.&.9 &.&.&.9 &.&.&.z 9 &.9 9 9 &.&.&.9 &.9 &.&.9 &.9 &.&.&.&.&.9 &.9 &.9 9 9 9 9 9 i+i+>+i+i+>+D i+i+i+c.c c.c i+c i+c i+i+Z.( ( {+{+9 {+( Z.9 {+9 {+&.&.9 {+&.&.&.`.&.`.&.`.`.&.`.`.`.`.`.`.`.) ) ) ) q+) ) 4.4.) 4.4.) -+) ) ) ) ) ) -+) -+4.4.4.) 4.4.4.x.-+E -+f+4+C+*+*+G.n :.3+A+7.A+J.J.A+J.< b+b+G k+++++++++++k+k+6 6 X.5 !+a r T T T T T T T T T T T T r T r 2 2 r r 2 2 2 2 2 2 5 5 ^ (.; (+( ) -.u 9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.!.A s+a.% F + 4 /.2.8+q.8+R.q.2.2.i J.;+G.o+f+f+u.>.z N u.u.f+o+G.J.J.C+^.4+N.m.n+y.*.y.y.y.R [+m.y.y.n+m.m.m.n+#+N.}+'+a+4+4+q.^.2.r+r+r+r+2.2.q.R.^.a+a+'+a+a+a+a+a+'+'+'+H H H h+L.M.X M.M.M.f ! ! ]+o o ]+o G o G o G o _.o #.o ! ^.3.'+#+L.L.L.p.L.L.L.H '+4+q.^.2.B.o o )+)+.+.+a+H.E+E+}+}+2.3+:+= ~.8 !.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.!.{ = f+b+i.N.p.t.5+/+t.e+l+t.t.e+e+}.y+y+y+<+<+<+l U.F.r.m+l.l.", "&.&.&.&.&.9 &.&.9 &.z &.z 9 9 9 &.9 9 &.&.9 9 9 &.&.&.9 9 u.z `.`.-.`.) ) 4.4.4.4.) `.`.9 &.&.&.) `.`.`.&.&.) ) ) &.&.) &.&.&.&.9 9 `.&.&.&.`.&.&.&.&.9 9 &.&.&.9 9 &.&.&.&.9 &.9 9 9 &.9 &.&.&.&.&.&.&.9 &.9 &.&.&.&.`.&.&.&.9 &.9 9 9 9 9 9 9 9 9 ( &.&.&.{+&.&.&.&.&.&.z &.&.&.&.z &.{+&.z z &.z z z &.&.&.&.&.`.-+-+`.`.`.`.) `.-+-+) ) ) `.) ) ) ) ) ) ) 4.-+-+) ) -+-+-+`.E -+E z E z z z z z z u.z z z u.u.f+u.f+:+f+*+)+#+C+3+B.R.^.)+)+^.)+)+G k+k+k+#.D D ++++8.++_.k+6 6 c+X.^ !+2 T T T T C T & C & C C $.C T & T T T T T r T T T 2 r 2 2 2 2 5 c+; c ( &.4.1.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8 A s+a.Y % + F /.4 f.2.8+q.2.2.i 7.7.G.G.*+*+f+:+f+f+f+f+o+*+G.G.++C+)+.+H.#+n+[+/+[+ +[+[+y.n+[+m.m.9+n+y.n+n+#+N.H.N.'+B 4+^.2.i :.:.7.:.:.7.i r+B.r+2.B.2.2.2.2.q.R.a+'+'+'+H '+H L.h+X M.X M.f ! 3.! ! ! ! o o o o o o o o ! ! R.a+'+s.H #+L.9+L.p.H H a+^.2.B.i 7.7.J.3+3+A+3+i #.#.o )+@.! #.7.*+>.s+A 8 !.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.!.8 E >.G.++B N.p./+t./+/+/+/+t.t.t.e+e+e+y+y+y+<+3 U.U.l r.r. .", "9 9 z &.z 9 9 9 9 9 9 9 &.f+9 9 9 9 9 z &.&.`.&.&.&.&.&.9 9 f+f+z `.-+`.`.4.4.4.) `.&.&.9 &.&.`.) `.&.&.&.`.`.) ) `.) `.`.&.&.&.&.&.9 &.9 &.&.&.9 9 9 9 &.9 &.&.&.9 &.9 &.&.&.9 &.9 &.&.&.&.&.&.&.&.9 &.9 9 9 9 &.&.&.&.&.&.&.&.&.9 9 9 9 9 9 9 9 9 i+9 9 z z &.&.z 9 9 9 9 f+9 ( i+( ( 5.( ( ( ( ( ( ( 5.o+( E.( ( ( f+( 9 ( ( ( ( ( o+E.E.( f+( ( ( ( ( f+( 9 f+f+f+z z 9 ( ( E.5.*+*+G.G.n *+( o+o+o+*+o+*+b+G.b+;+G.G.;+J.B..+r+7.)+o A+3+++#.++b+*+n < b+n 5.D < ++++k+G k+i.X.c+1 5 a a T T +.& C C C C C w.C C w.C C C C C C & T T T C T T r T 2 r 2 ^ 6 < ( &.4.1.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8 s+s+a.% % + + 4 /./.o 8+o i i 7.:.;+G.*+*+*+o+:+:+o+*+*+G.*+J.J.C+C+)+4+N.n+*. +t. +[+[+ +[+y.[+[+y.[+y.[+p.n+#+w H N.N.a+4+2.7.:.b...:+*+*+*+*+b.;+;+;+;+J.:.J.7.4 i 8+q.'+* '+h+h+h+H #+s.s.M.s.f 3.3.! 3.3.3.! ! ! ! ! )+! ^.a+a+}+H #+L.C.L.9+L.L.H.R.^.i 7.:.;+J.n ;+G.G.G.n G.n J._._.B.Z i J.*+p+N s+A 8 !.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.!.A x.N f+J.C+N.p.[+t./+t./+t.e+/+t.t.0 0 }.y+y+y+g.y+3 U.3 3 U.", "&.9 &.9 9 &.&.&.9 9 9 9 &.9 f+z 9 9 9 9 &.&.&.&.9 &.&.&.`.9 i+i+f+f+9 z z 4.`.`.`.&.&.&.&.z `.&.`.&.&.&.&.9 &.`.`.&.&.`.&.&.&.&.i+i+9 &.9 9 9 9 9 i+9 9 9 9 9 9 9 9 9 &.9 9 9 &.&.&.&.&.9 z &.&.&.&.9 9 9 9 9 &.&.`.&.&.&.&.&.9 &.&.9 9 9 9 9 f+i+9 9 9 9 9 &.9 9 9 f+>+D D o+b+< 3+< < 3+< _.< < < _.++#.B.i.X.B.8.b+b+D < D (+(+(+b+< 8.A+3+3+7.A+A+3+3+b+D n D n D n E.*+G.J.J.n 3+3+F 3+3+7.3+;+n J.J.J.A+J.J.J.A+A+7.J.J.7.A+7.7.3+7.:.3+;+;+n G.o+*+o+o+o+G.G.b+b+8.++k+6 c+G+1 5 2 2 T T C T C & C w.C C C <.<.<.<.w.<.w.C C C C C C C T C T T T T 2 5 ; W 5.9 -+{ u 9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.!.A A a.a.E.F % + + 4 o 4 i 4 4 :.7.J.;+*+*+*+f+*+o+*+G.G.G.G.J.J.++C+^.X.B #+n+ +t.Q.Q.Q.t.t./+/+[+[+[+y.m.[+[+y.m.w N.w B 4+2.7.J.G.:+p+>.N N N >.u.u.u.:+:+:+:+:+Y ;+:.7.2.2.R.'+H '+H '+h+s.h+X s.M.M.M.3.3.3.R.3.a+a+R.S.S.R.a+a+'+H s.L.#+L.C.L.p.#+a+)+i 7.;+;+G.*+;+*+*+E.E.E.*+*+5.G.J.A+++++7.*+*+>.= s+A 8 !.!.9.9.9.9.9.9.9.9.9.9.9.9.9.!.8 E >.:+G.C+4+!+p./+/+/+/+/+/+/+/+t.t.e+0 e+e+y+y+y+<+<+g.L L ", "&.9 &.f+9 z z &.&.9 9 9 9 9 i+f+9 9 9 9 &.z &.9 9 &.&.`.&.9 i+f+&.&.9 9 &.`.&.`.&.&.&.&.&.&.-+&.&.9 9 9 9 f+9 9 &.9 9 &.9 9 9 &.9 9 f+f+9 9 f+9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 i+9 z &.z &.&.9 &.&.&.&.9 9 9 9 9 &.&.&.&.9 9 9 9 i+9 9 9 i+f+9 i+9 i+>+9 9 &.9 9 9 9 ( i+>+D (+++++++G A+_._._.W #.G G G k+6 G 6 6 Z Z 6 Z G k+8.8.8.8.8._.W ++k+_.k+++++8.++8.8.8.< < 8.A+A+A+3+8.J.J.J.7.A+7.J.7.7.7.J.A+A+J.J.A+J.J.J.J.7.J.J.7.;+J.J.J.J.;+n G.G.*+*+( f+f+f+( o+o+D b+8.8.G 6 c+1 5 2 z.2 T T T T C C C C <.<.<.<.<.<.6+6+<.6+6+6+<.<.C C <.C C C C T T T 2 (.W 5.( &.-+1.!.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.!.A s+= % a.% % F + 4 /.4 4 7.;+n *+*+o+:+f+f+f+:+o+G.G.b+;+J.J.C+C+)+X.B N.n+y. +Q.I.0 Q.Q.Q.5+Q.t. +/+ +/+/+[+[+y.#+H w H..+C+J.*+p+>.= s+~.~.~.x.x.E E E s+= = N p+:+Y ;+7.2.q.R.'+H L.s.h+#+h+h+s.X s.M.M.M.f 3.3.a+}+a+a+a+H '+s.H L.L.L.L.L.p.L.L.'+R.r+F J.;+n G.*+5.*+o+E.f+p+E.:+E.*+n n 3+3+A+;+*+:+p+N s+~.A 8 !.!.9.9.9.9.9.9.9.9.9.!.!.A ~.= u.*+G.C+q.B p.[+/+p.t./+p.t./+t.t.t.t.}.e+}.y+y+}.y+g.<+<+", "9 9 f+9 f+9 &.`.z &.z 9 9 i+>+i+f+z z 9 9 9 f+f+z 9 &.&.9 9 f+i+f+9 9 9 z &.&.`.`.`.9 &.z z `.`.&.z 9 f+>+i+o+9 f+9 f+9 9 9 9 9 9 i+i+>+i+9 9 9 i+9 9 i+f+i+f+i+f+>+>+9 9 9 9 9 9 9 9 9 9 9 9 9 &.&.`.&.9 &.&.9 &.`.`.9 &.&.&.9 i+>+9 9 9 f+9 9 o+>+( ( o+G.5.D G.D 8.b+< 8.W k+k+k+k+]+]+S.^.S.a+a+H.B @.H+@.H+G+@.X.Z 6 G G G G G k+++++W ++k+++k+W ++8.b+8.b+8.8.J.b+b+J.b+J.J.J.J.J.7.J.7.J.J.J.J.G.b+b+b+b+b+J.b+;+;+J.;+G.;+;+;+G.*+*+*+o+:+f+f+f+u.u.u.f+u.>+5.D (+8.8.k+6 c+^ 5 2 z.r a T T T C C C C <.<.<.<.> 6+6+> 6+6+6+6+<.> 6+<.<.<.C C C <.T 2 ^ G j+5.u.E 4.{ 9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.!.8 s+s+s+% % % % + + 4 F 4 F ;+;+b.*+E.:+u.u.u.u.f+f+*+G.G.b+++C+B.)+4+B N.N.n+1+Q.I.o.}.o.o.I.I.Q.Q.Q.Q.5+t.t.t.[+[+m.m.H 4+2.A+*+p+= s+A A 8 8 8 8 8 8 8 8 8 A A s+= N :+*+;+:.f.R.'+H '+h+h+h+s.s.#+s.s.h+s.H h+h+'+H '+H '+s.H H H L.L.L.Y.L.9+L.9+H '+^.r+7.;+G.Y *+*+E.>+E.f+f+u.>.f+f+5.*+*+J.J.J.J.G.b.*+u.>.= x.~.A 8 !.!.9.9.9.9.9.9.9.!.8 A x.>.:+G.J.C+q.B p.p./+/+p./+7+p./+/+t.e+/+t.t.e+0 e+e+y+y+o.o.", "f+i+>+i+f+f+z &.9 9 9 u.i+f+f+i+o+f+f+f+i+i+i+f+9 9 &.9 9 9 i+i+f+9 9 f+z 9 u.&.z z 9 &.9 z `.`.z z 9 9 D o+>+i+9 9 >+f+9 9 f+f+9 f+D o+o+f+i+9 9 9 9 i+9 i+f+i+i+>+>+i+f+i+f+9 9 9 9 9 9 z 9 9 9 &.`.&.&.9 &.&.&.9 9 &.9 9 9 z f+o+o+G.b+J.++C+)+X..+H+1 P.H+P.P.w E+b H.P.H.b H.E+P.H.f P.E+H+P.@.@.@.G+X.G+X.X.Z Z B.Z i.i.#.k+_.k+_.k+k+++W 8.++8.8.8.b+8.b+b+b+J.A+J.J.J.J.J.J.J.;+J.;+J.G.G.G.G.*+G.o+G.o+G.G.G.G.*+G.G.G.G.o+*+*+o+o+:+f+f+9 9 9 z z &.z u.f+( o+D b+8.W G i.1 1 2 5 2 r T T T T T C C w.C <.<.<.6+6+6+> > 6+> 6+6+> 6+6+6+6+6+<.<.C T 2 6 W (+5.z `.{ 1.!.9.9.9.9.9.9.9.9.!.!.8 !.!.!.9.9.9.9.9.9.9.9.9.9.9.9.9.!.8 A s+a.a.% % % % + + F F F ;+n *+E.( u.u.= N E = >.u.f+*+G.J.++2.^.B B N.n+[+[+ +I.}.O D.s <+o.o.}.o.0 o.Q.I.Q.Q.t./+m.m.N.X.C+G.f+N x.A 8 8 !.!.!.9.9.9.9.9.9.9.!.8 A = N :+b.J.i 2.R.'+H H H L.H h+L.h+H L.s.H H L.h+H H L.H H H #+L.L.L.p.Y.L.p.C.p.s.R.2.4 J.;+;+n *+5.:+f+f+z z z >.u.u.( 5.5.n J.< J.J.;+G.*+:+u.N E E x.A { 8 !.!.!.!.!.8 8 ~.E z p+*+;+J.C+X.B N.p.p.p.t./+p./+/+/+p.t./+t.t.t.e+}.e+}.e+}.y+", ">+o+>+o+o+i+f+f+i+9 9 i+f+o+>+o+>+o+>+f+f+f+i+o+u.9 9 f+9 i+f+o+i+f+9 i+i+f+f+9 &.z 9 9 i+z z 9 9 9 `.i+(+D f+9 9 >+o+o+f+i+9 i+9 i+c.c.>+>+i+f+f+i+f+i+f+i+i+f+>+o+i+f+9 f+i+i+i+f+9 9 9 f+9 9 9 9 9 &.z &.9 9 9 9 f+o+o+b+++C+B.)+X.X.X.1 .+.+H+H+P.P.H.P.b z+z.b z+b P.P.P.E+P.P.P.@.H+@.@.S..+@.@.X.@.@.X.G+i.)+i.)+B.)+)+)+)+B.k+k+++++++++++8.8.8.8.A+b+8.A+A+b+b+b+J.b+b+J.G.;+b+G.J.b+;+G.G.G.o+o+o+*+o+o+*+o+*+o+*+*+*+:+*+:+f+f+f+f+u.9 z z z z &.E `.z z f+( 5.(+b+W G 6 n.1 ^ 2 2 2 2 r T T T T T C C C <.<.6+<.<.<.6+6+<.> > > 6+> > > 6+6+6+<.& 2 1 6 W D 5.z E { { 8 !.!.!.!.!.!.8 8 8 8 8 8 8 8 !.!.9.9.9.9.9.9.9.9.9.!.8 A s+a.s+a.% % % + % + F F F Y *+:+:+>.z E E 4.x.x.E N u.f+*+G.++C+.+B n+n+[+[+ +& o.o.D.g.|+g.<+<+s s s }.o.o.o.o.Q.t.[+#+B )+J.*+N s+A 8 !.!.9.9.9.9.9.9.9.9.9.9.!.8 8 A s+N :+b.:.r+q.'+H L.h+H H H H H L.h+h+H H H H L.h+h+#+L.L.L.L.L.Y.L.p.C.Y.L.L.L.a+2.4 7.J.n G.*+*+( ( >.`.E = `.z u.E.o+*+n b+A+++8.J.A+G.G.*+:+u.z N `.x.x.x.{ A 8 8 A ~.E N u.*+G.J.C+B.4+B !+p.p.p.p./+/+p./+p./+p./+/+t.t./+/+t.t.Q.0 Q.", "D D >+D o+o+i+o+o+f+f+9 i+o+c.(+G.o+>+i+i+o+o+c.o+o+f+i+>+>+>+o+9 f+9 >+>+o+f+f+i+9 f+f+f+9 z z 9 f+z o+++b+*+f+>+c.c.b+G.o+i+o+i+f+f+i+>+o+>+>+>+D >+>+o+>+i+f+i+>+i+>+i+f+i+>+i+o+>+f+9 i+i+9 9 u.9 f+f+f+f+o+D 8.k+k+B.k+i.X.i.X.X.@.X.P.P.P.b H.H.b b b w E+b b z.R w P.H+E+S.@.@..+.+^.X..+)+)+G+)+)+)+)+)+)+)+)+)+B.B.B.B.B.B.B.k+k+k+++++++A+A+A+8.A+b+A+b+A+J.J.b+J.;+G.b+b+;+b+G.;+G.b+G.G.G.*+o+o+o+:+o+*+o+*+o+*+o+:+f+:+f+:+u.f+9 z 9 z z &.`.`.`.-+z z 9 f+( D D 8.W G (.c+1 ^ 5 2 2 2 2 T T T T T C C C C <.<.<.<.<.> <.<.<.> 6+6+> 6+> > 6+<.C T 2 c+6 j+D >+z -+4.x.{ 8 8 8 8 { A ~.~.s+A A A 8 8 8 !.!.9.9.9.9.9.9.!.8 A s+s+a.% % % % % % + + F F n E.E.>.N = x.~.A { ~.{ x.E z u.o+G.++C+.+H.n+y.t.Q.Q.Q.o.D.U.].].].U.].L <+<+<+<+s o.o.}.e+[+#+.+C+G.p+E A 8 !.9.9.9.9.9.9.9.9.9.9.9.9.9.9.!.A ~.= u...;+i 2.R.* H * L.h+h+H H H L.h+h+h+L.H H H L.L.H L.L.L.H p.Y.Y.p.C.p.L.H 4+2.i 7.:.;+;+*+E.f+>.E E { x.E z ( E.*+n n J.J.++++++++J.J.G.G.*+*+f+:+f+u.z N N E = = = >.p+o+G.J.C+C+)+4+N.N.p.p.p.t.p.p./+p.p.t.p.t.p.t.p.t.t.7+l+t.e+t.", "o+o+o+>+D o+D D o+o+>+f+i+o+G.b+(+o+>+o+o+>+D D D o+f+>+b+G.o+o+D >+o+D o+D D o+o+o+o+o+o+f+9 9 o+f+f+D k+++8.J.;+b+G.(+c.D G.c.c.D D G.o+c.c.o+D D o+c.D G.c.o+D o+i+D o+>+o+>+o+>+o+D o+f+f+o+o+b+b+8.8.++C+k+C+C+C+i.i.i.)+.+1 G+P.P.P.H.z+n+n+M R z+R z+E+E+H.E+P.H+H+@.@.G+.+X.)+)+^.G+)+^.X.)+^.)+)+)+^.)+)+)+)+)+^.^.)+)+)+i.B.B.C+C+++++++++8.++++++++A+A+J.J.J.J.b+J.J.J.;+b+;+G.b+G.G.G.o+*+o+*+f+f+o+f+o+f+:+:+:+:+:+:+f+u.u.9 z z &.N z `.z `.E -+-+-+`.z z f+( D D W _.; 6 c+^ 5 ^ 5 2 2 2 2 r T r r C r C C C <.C <.C <.6+6+<.> 6+> 6+> 6+> <.<.T 2 P.6 k+(+D >+9 `.E E 4.E 4.{ x.E = = = s+s+s+A A 8 8 8 !.!.!.!.!.8 A A s+s+a.s+a.% % % % % + + + F Y E.p+N E ~.{ 8 8 8 8 A { 4.N z :+G.8.B.B b y. +Q.Q.I.s s |+K.K.: r.K.r.K.x ].g.<+<+y+y+y+Q. +N.^.A+o+N A 8 !.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8 ~.N :+;+:.f.q.'+* H h+H h+L.h+h+h+H h+h+h+H L.L.L.L.L.L.g L.Y.L.Y.p.9+L.L.C.H 4+2.i 7.J.3+n ;+5.E.E.z E x.s+E N u.:+5.*+J.J.++++++C+C+C+++A+J.J.G.G.G.*+*+o+o+f+f+f+p+f+*+*+;+J.C+C+B.4+B N.!+p.p.p./+p.p.p./+p.p./+p.p.t.p.t.p./+/+/+/+t.", "o+D D D D D D D c.J.G.o+D D D G.D G.D D o+c.G.D D D b+8.k+++++8.G.D D 8.b+G.b+b+b+b+8.A+G.o+D b+A+b+8.8.8.++k+k+C+++A+J.8.J.++J.8.++8.++b+b+b+b+c.b+c.c.c.G.c.D o+D o+c.c.c.b+(+b+8.b+8.8.++++++8.++++C+C+k+B.k+i.i.B.6 )+i.X.i..+@.H+P.H+E+P.P.H+P.P.P.@.1 H+@.P.a+@.@..+.+! ^.G+.+)+i.)+)+)+)+)+i.)+)+i.)+)+B.)+B.)+)+)+B.)+2.2.i.C+B.B.#.C+++C+C+++++++A+++++++A+A+A+J.A+J.J.b+J.J.J.;+b+;+G.G.D *+o+o+*+f+o+:+*+o+f+o+( :+u.u.f+u.u.z z z &.-+`.-+E `.-+-+4.E -+&.z 9 9 >+D (+W 6 ; (.(.n.^ ^ 5 5 2 2 2 2 r r r T r r C C C C C <.<.<.<.<.<.<.6+<.6+<.<.+.+.a 2 c+6 8.b+D ( u.z z E = z N = N N a.a.a.s+= s+s+A A A A 8 8 8 A A A s+s+a.% % % % % % + % + + F Y Y u.N = ~.A 1.!.9.!.!.!.{ x.-+z f+*+8.B.@.#+*.$.I.o.o.D.D.U.K.: [.: : . .K.K.r.].U.<+s 0 t.p.B C+;+f+E A 8 !.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.!.8 x.>.:+;+i q.'+'+* H * * h+H h+h+g h+h+L.L.L.L.L.L.L.Y.Y.L.L.Y.L.Y.C.p.L.L.H a+q.r+i 7.7.;+;+*+E.f+>.E E E z u.( E.5.n < 7.++C+C+C+B.B.B.C+++C+++A+++++J.J.J.J.G.G.G.G.J.J.++7.C+q.X.B B N.N.p.p.p.p.p.p.p.p.p.p.p.p.t.p./+p./+p.t./+p./+", "b+G.G.o+D b+G.G.G.b+(+G.G.(+b+c.b+(+D G.b+b+b+A+b+A+b+A+A+8.++++b+A+b+++8.b+b+J.b+b+8.8.b+G.b+b+8.8.J.8.J.8.8.8.8.k+i.k+k+8.k+++C+6 i.k+k+k+k+k+C+b+G.c.o+c.o+D D c.c.D b+b+c.b+b+b+8.J.++8.8.++++++k+k+C+k+k+B.B.i.i.)+i.i.i.i.X.X.G+X.1 @.a+@.G+! S..+B @.H+P.H+P.P.H+@..+.+X.)+i.)+)+i.i.)+i.)+i.)+)+B.B.B.B.B.2.B.B.2.^.2.B.2.2.^.B.B.B.B.C+r+i C+7.7.C+7.++7.A+A+A+A+A+A+A+A+J.J.b+J.G.b+G.G.G.o+G.o+o+o+:+o+f+:+:+:+:+f+:+u.>.z N &.N `.`.`.-+-+4.-+-+4.4.4.-+-+`.z 9 i+5.c.< W ; G (.n.n.^ ^ ^ ^ 5 2 2 z.z.r r T r r r C r C C C C C <.<.<.<.<.<.C C C T a 5 1 X.6 8.b+D >+( f+f+f+u.u.f+E.E.a.% a.% a.a.s+s+s+A A A A A s+s+a.s+% s+% % % % % % % + % + F Y E.u.= x.8 8 !.!.9.9.9.!.!.{ E z u.o+J.k+1 n+$.Q.o.D.x+|+].r.[.[.|.k.[.|.[.[.: .r.U.<+y+y+t.p.4+C+G.>.~.8 9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.!.A = p+b.:.f.q.* * * '+H h+'+H h+h+H L.L.H L.H L.L.L.Y.H p.L.Y.p.Y.L.C.C.p.L.'+4+2.r+4 7.A+3+n n ( E.z z E N u.f+5.G.n A+A+i k+B.)+)+i.)+i.)+i.C+)+B.C+i.i.C+C+C+C+J.7.7.C+C+B.q.X.B B N.p.N.p.p.p.p.p./+p./+p.p.p.p.p.p.p./+p.p.p.t./+,+", "k+++++C+++++J.8.A+J.b+8.J.J.G.G.G.b+G.b+8.C+8.++k+k+C+k+++k+++k+k+++8.++++++8.++A+b+b+b+b+b+b+b+b+b+b+8.A+8.++b+(+c.b+b+c.8.c.c.c.c.b+b+c.8.c.c.>+D o+D >+D D D o+D D D c.G.b+b+8.++8.8.++++++++k+++++k+k+B.i.i.)+i.i.i.i.i.i.i.i.! )+)+@.H+B H.H.H.H.H+H+@..+.+i.i.)+)+)+)+)+)+i.)+i.)+)+B.B.B.2.B.B.B.B.B.B.B.B.B.2.2.2.)+^.)+)+2.^.)+^.B.2.B.B.C+C+C+C+C+7.C+C+C+7.++7.++7.7.++A+J.J.J.;+b+G.D G.G.G.G.G.o+o+o+o+:+( :+:+u.:+u.u.z N -+-+-+E -+-+-+4.4.4.{ 4.{ 4.-+-+z z 9 i+D j+W ; G ; ; (.~ n.^ ^ ^ ^ ^+5 2 2 2 2 2 r 2 r r C r r C C C C C C C C T T T a 2 5 1 6 6 8.8.b+D o+o+E.o+*+E.G...b.Y % % % a.% a.a.s+a.s+s+s+a.s+a.% a.% % % % % % % + + + + + Y E.E.= s+{ 8 !.9.9.9.9.9.9.!.{ { E u.o+b+C+.+n+$.}.O D.U.K.K.: k.B+B+B+B+|.7 |.|.l. . .U.<+y+5+p.^.i *+>.~.8 !.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8 ~.N ..;+/.f.` ` '+* '+'+* '+H '+'+H H h+H H L.p.#+L.Y.p.L.L.Y.p.L.p.Y.9+L.H a+^.B.r+i ++7.J.n *+E.z u.>.( E.5.G.b+J.++++B.B.i.)+X.X..+X..+4+.+B B B B X.B X.X.)+)+C+2.q.q.X.4+B N.N.N.N.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.", "8.++++++k+k+C+C+++++C+++C+C+++8.++8.8.++8.8.8.8.8.8.8.c.8.b+8.8.b+8.8.b+b+b+8.8.b+D G.D (+D o+D o+D D (+b+b+(+b+b+c.c.D D >+D o+o+D i+D >+>+D o+D D D D D D D c.G.c.b+b+b+b+b+8.b+8.++++++8.k+++++k+k+C+i.i.i.i.i.)+i.X.i.i.i.G+@.X.G+.+@.H+P.E+H.P.H.P.H+@.@.G+.+G+X.X.X.i.i.i.i.i.Z B.B.i.i.)+)+B.)+)+B.)+)+2.B.2.)+B.B.2.B.2.2.)+2.2.B.2.B.B.B.i.B.B.C+C+C+++C+7.C+C+C+C+C+C+i ++7.A+b+J.G.b+G.b+G.G.G.o+G.o+*+*+*+o+:+f+:+f+u.u.>.`.E -+-+4.-+4.4.{ { { { { { -.{ -+) &.9 5.c < W W ; W ]+; ]+(.~ n.n.^ ^ ^ ^ ^ 2 2 2 z.2 2 r r r r r r C r C C T T T a 2 2 !+1 c+6 k+k+8.8.b+b+G.b+G.G.3+;+3+F F :.+ % % % % % a.a.% a.a.% % a.% % % % % % % + % % + + + F % E.a.= x.A 8 !.9.9.9.9.9.9.!.u x.E u.f+G.k+.+a $.I.O |+K. .: |.B+D+0.0.0.0.B+q B+|.l.r.l <+}.l+N.4+4 ;+>.s+8 9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.!.A = p+b.:.q.q.` ` ` ` ` * 4+* '+'+'+'+H H H H H L.L.L.L.L.Y.9+L.9+Y.L.p.L.H '+4+^.2.B.C+i A+3+n 5.E.E.u.f+5.*+n J.A+_.k+B.i.)+X..+H+B B B N.N.B P.N.!+N.N.N.N.N.B 4+4+X.4+B B B N.N.N.p.!+p.[+p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.", "8.8.8.8.++8.8.A+++8.8.8.8.8.b+b+b+b+b+b+8.b+b+b+b+b+(+D D b+b+b+c.D D D D D G.D (+(+D G.D D D D o+o+o+o+D D o+>+o+o+o+>+>+D D >+>+D o+D c.c.b+c.c.c.c.G.c.J.b+J.b+b+b+b+8.8.++8.++8.++C+i.C+i.i.k+k+i.i.i.i.)+i.i.i.i.i.G+G+X.G+X.@..+@..+@..+@.@.G+.+X.X.X.)+X..+.+.+i.)+i.X.)+i.B.i.i.B.B.B.B.)+B.B.)+B.C+i.C+B.C+C+2.B.B.C+B.C+2.C+2.B.)+B.)+B.2.2.2.)+B.B.B.2.C+2.B.C+B.C+B.C+C+++7.A+A+J.J.J.b+b+G.b+G.G.G.o+*+*+o+E.o+:+f+u.u.z E E 4.4.4.4.{ 4.4.-.-.-.-.-.-.{ -+) &.9 9 5.(+W W W W ; ; ; ; G ~ (.n.n.^ ^ ^ ^ ^ ^+2 2 2 2 2 r r r r r r r r 2 2 2 5 ^ 1 c+X.6 k+k+++8.8.++A+J.++A+7.++4 4 4 4 4 4 + + % % % % % a.% % % % % % % % % % % % % + + % + + + Y E.a.= s+A 8 !.9.9.9.9.9.9.!.8 4.-+u.o+G.k+.+n+5+o.|+U. .[.|.B+0.. . . 0.. 0.0.Q B+[. .l <+y+e+p.4+C+;+>.s+8 !.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.!.8 s+N Y :./.f.f.f.q.` f.` q.` q.4+4+a+a+H+H.N.N.H H H L.#+L.L.Y.L.9+L.C.Y.m.'+4+.+^.2.B.B.C+++A+< D 5.5.*+n J.b+A+++#.B.o ]+^.a+H+P.H.H.H.N.b N.n+N.N.n+p.N.!+N.!+N.N.B N.B N.p.p.p.!+p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.", "J.b+A+b+b+J.b+8.8.J.b+b+b+b+b+b+b+(+(+D G.D D D D D o+D D (+c.b+D G.D D D D D D G.o+D D o+o+>+o+o+>+f+>+>+o+>+D >+D D o+o+D D D D c.c.D G.b+G.b+b+J.J.++++++k+k+C+++++C+C+C+C+i.k+i.k+k+k+k+k+k+B.k+C+k+6 i.i.6 B.i.i.i.)+)+G+.+@..+H+H+H+H+.+.+.+.+a+@.@.@.@..+G+.+)+X.X.i.i.i.)+)+i.i.i.i.i.i.i.)+)+)+)+)+B.2.C+r+C+C+C+r+C+C+C+C+C+C+2.B.C+C+2.B.B.B.B.2.2.2.2.2.B.2.^.2.)+B.2.C+C+C+++7.8.J.J.J.b+b+J.G.;+G.G.G.G.*+o+:+:+:+f+u.>.E E 4.{ { { { { -.{ -.{ 1.1.-.-.4.) `.9 i+c j+j+W =+W W W G ; ; ]+; ]+~ n.n.n.n.n.^ ^ ^ 5 ^+2 2 2 2 2 2 r 2 2 2 ^ 1 c+6 6 k+k+k+++++++++++++8.++++B.B.r+2.r+r+/./././.+ % % % % % % % % % % % + % + % + % + % % + + + + + Y E.>.N x.~.8 !.!.9.9.9.9.9.!.8 ~.`.z o+b+++@.z+$.s |+K.~+k.0.0.. . . . . . . . 0.Q B+l. .<+y+/+Y.B C+;+:+= A !.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8 A = ..% /./.f.f.f.f.8+8+8+q.R.! ^.G+.+.+@.@.S.H+N.H N.H #+L.L.p.L.9+p.p.#+#+H a+.+)+^.2.B.r+r+++3+J.b+b+J.J.7.i _.B.i.)+.+@.H+s.H.w H b n+N.#+b m.m.n+N.p.p.p.N.p.N.p.N.p.N.!+p.p.[+p.p.p.p.*.p.p.p.p.p.p.p.!+p.p.N.p.N.p.p.!+p.z+p.", "8.b+b+b+b+b+G.G.(+G.b+D b+G.D D D G.D D o+o+o+o+o+D o+D o+G.D D D D D o+o+D D o+D o+o+D o+o+o+>+o+o+o+o+D D o+D D c.b+b+b+8.b+G.J.J.b+J.8.C+C+k+i.k+++8.8.++++8.C+k+i.)+i.i.k+k+k+8.++++k+8.8.k+k+i.)+C+i.i.B.i.i.i.i.X.G+X.@..+1 .+1 H+B P.H.H.H.H.H.H+4+H+.+.+)+.+! )+X.)+)+)+i.)+i.i.)+)+)+)+)+i.)+B.)+)+i.B.B.C+r+C+i 7.7.:.7.7.7.++7.C+C+7.C+C+B.2.B.B.B.2.)+)+)+2.)+2.^.)+^.B.C+C+C+C+++++++J.++J.J.A+J.J.G.;+;+G.G.G.o+:+f+u.z E x.{ q+{ -.-.-.-.1.1.1.8 1.-.1.4.) `.{+( c < j+< W =+W W =+G ; ; ; ; ; ]+~ ~ ^ n.n.^ n.n.^ ^ 5 ^ 2 ^+2 ^+^ n.n.6 6 W 8.8.8.(+8.8.8.8.A+A+++k+C+k+2.^.2.q.8+2.f.i 4 :.+ % % % % % % % % + + + + + % % % % + % + + + /.+ % Y E.a.>.= x.A 8 !.!.9.9.9.!.!.{ x.N u.*+J.C+.+n+$.o.S r.k.q 0.. . . . . . . . . . 0.q |.r.l y+e+p.'+q.;+:+N ~.8 9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.!.A s+..% + /././.f.f./.f./.f.r+o o o o Z ]+G+G+G+.+}+}+P.N.w #+m.9+L.Y.9+m.H H '+a+4+^.! ^.2.B.B.k+C+C+++k+C+#.B.)+)+.+a+a+H.H.w #+n+#+#+m.m.m.#+#+#+m.m.n+p.p.p.p.p.p.p.p.p.p.y.p.y.y.[+*.p.p.p.p.p.p.p.p.N.p.N.p.!+p.N.p.p.p.N.p.N.", "b+(+G.D D G.(+D G.D D D o+D D o+o+o+o+o+>+>+>+o+o+f+o+o+o+o+o+D D o+o+o+o+o+o+D D D G.D G.D D D o+o+D o+o+o+b+8.C+i.i.i.C+i.X.X.X.k+k+k+6 k+k+k+k+k+k+i.X.6 i.k+k+k+X.k+C+8.8.8.++k+k+i.k+i.k+6 i.X.i.i.6 k+k+6 k+Z i.i.i.i.X.X..+H+H+H+H+@.@.H+P.H+H+P.P.B H+H+H+@..+@..+@.X..+.+X.)+i.)+i.)+)+)+^.)+)+B.B.B.C+C+C+C+7.++7.7.J.J.J.J.J.J.J.J.7.++C+C+C+B.2.^.)+B.2.^.^.^.^.^.q.^.q.^.2.C+C+C+C+++7.7.++A+A+J.A+J.J.J.J.J.G.G.o+:+u.>.`.E { { -.-.1.1.1.1.1.1.1.1.1.-.4.-+&.{+i+c < c W =+W W W =+W W W G ; ; ; ; ]+~ ]+~ n.n.n.n.^ ^ ^ ^ ^ ^ ^ (.~ G W 8.< (+D D G.D D G.b+b+A+8.++C+#.)+)+a+^.^.q.f./.+ :.Y % a.% a.% % % % % + % + + + % + % % + % + + /.+ F b...E.a.= = x.A 8 !.!.!.!.!.8 { E z f+G.8.i.H+n+Q.O U.[.&+0.. . . . . . . . . . . . 0.7 l.U.g.e+p.B q.7.b.a.s+A !.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8 A s+a.% + + /./././.4 /.i 4 i i i G #._.Z Z i.G+G+S.@.S.}+H.H w #+Y.p.L.L.9+p.H '+a+4+4+)+)+^.)+)+i.B.B.B.B.)+)+)+.+S.B H.H w #+m.#+m.#+#+#+#+m.m.n+m.n+p.n+n+p.y.p.[+[+[+[+[+*.*.p.[+p.[+ +p. +p.p.!+p.p.p.N.p.p.N.p.N.p.N.N.p.N.p.", "o+D G.b+G.G.G.D G.D D G.D o+D D o+D o+o+o+f+>+f+f+>+f+o+o+o+o+o+G.D G.G.G.b+b+J.b+b+b+D G.o+D G.D D c.b+8.8.++8.++8.8.8.8.8.8.b+8.c.8.8.8.8.8.8.8.c.8.8.++++8.8.k+8.k+k+k+C+C+k+k+k+k+i.C+k+C+k+k+k+i.C+k+k+k+i.i.Z i.G+i.)+@.X.P.P.H.P.H.b b H.H.H.H.H.E+H.H+H+H+H+H+@.@.H+H+H+H+H+H+1 B X..+.+.+X..+.+)+)+B.2.r+i C+7.7.A+J.J.G.G.*+G.D G.G.G.;+J.A+++C+C+2.^.)+^.^.^.^.q.^.q.^.q.^.q.^.2.B.B.C+C+C+C+7.C+++++++++A+A+J.J.J.G.*+f+u.z x.{ { 1.1.1.8 1.u u u u u { -.q+-+&.9 ( c < =+< W =+W W W W =+W ; W ; G ; ; ; ~ ; ]+~ ~ (.n.n.n.^ n.n.]+; W W (+D D >+( ( f+:+o+o+G.G.b+A+C+B.i.^.a+a+'+q.2.r+4 b.....a.a.a.a.a.a.% % % % % % % % % % % % % + + + + + + b.% E.E.N = = x.A A 8 8 8 1.{ E N u.G.J.C+.+N.[+Q.D.r.[.D+. . . . . . . . . . . . . . q g+{.<+e+/+H 4+4 ;+:+= ~.8 !.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.8 A s+a...+ + + + + /./.+ 4 4 _.A+A+_._.G G G Z ]+G+@.H+H+}+H+H.H.w #+L.p.9+L.p.#+H H '+a+a+.+.+.+^..+^.)+)+)+i..+a+4+a+}+H.H #+#+m.R m.9+m.9+p.m.#+m.L.m.m.m.m.y.p.[+p./+p./+/+[+[+t.[+ +p.p.p.p.p.p.p.p.p.p.N.p.p.N.p.N.p.N.p.p.N.p.", "G.D b+D b+b+D D D o+D o+o+o+o+o+o+f+>+f+( >+:+( o+o+o+o+o+o+D G.(+G.b+b+b+b+b+b+G.b+G.G.G.b+b+b+8.b+J.b+b+b+b+b+c.c.b+b+b+8.b+8.b+8.b+8.b+8.c.b+b+b+b+8.8.8.8.8.8.8.8.k+k+k+k+k+k+k+k+k+k+k+k+k+k+k+C+6 k+B.i.i.i.)+)+i.X.G+.+1 .+H+H+H+P.P.w E+b b E+w H.E+N.P.P.P.H+P.H.H+H+P.H+P.P.H+H+H+H+H+H+.+4+.+X.)+)+B.B.C+7.7.A+J.;+G.*+o+:+f+:+f+:+:+*+*+;+J.7.i B.B.q.^.^.q.^.^.^.4+^.4+4+q.^.)+q.^.)+q.2.B.B.C+r+r+r+r+C+r+C+A+J.G.G.f+u.z E x.{ { { 1.1.1.1.1.u 1.1.1.q+4.`.{+i+c c < j+< =+< =+W W W W W W W W ; ; ; G G ; ; ; ~ ]+~ ~ n.n.~ ; W W j+D c i+9 9 u.z u.f+u.f+*+G.G.J.J.C+B..+@.a+a+R.q.4 ;+Y a.a.a.s+a.s+a.= a.a.% % % % % % % % % % % % + + + + F F ;+..E.:+>.N = x.~.~.A { x.x.E >.o+G.++B.B n+ +o.x+r.|.Q . . . . . . . . . . . . . 0.q [.l g.e+/+p.4+2.J.*+p+= A 8 !.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.!.8 A s+a.% % + + /.+ + + + + F 3+3+3+8.W 8.G 6 G c+c+1 G+H+P.E+}+H.w w #+L.L.p.- p.L.H H H }+'+a+a+B a+4+a+}+H+4+}+a+H.N.w #+#+m.p.9+9+9+m.9+m.X L.9+p.m.9+p.p.,+p.,+[+p./+[+/+[+/+/+/+[+5+p.5+p. +p.p.p.p.p.p.p.p.N.p.p.p.!+p.N.N.p.N.", "G.o+G.G.b+J.J.G.G.G.G.o+D o+o+D G.G.G.G.G.D n G.*+G.*+G.G.*+G.J.J.b+J.b+J.J.J.++A+A+A+++++A+A+J.8.8.8.b+b+b+b+b+++++++k+8.8.8.c.8.c.8.c.b+b+c.b+j+b+8.b+8.8.8.8.8.k+8.k+8.k+8.++k+k+k+k+k+k+k+k+6 i.B.i.X.i.i.i.X.X.G+i.G+@.G+P.1 1 P.P.H.P.b P.E+b H.b b b H.H.H.P.P.P.P.P.B P.B H+H.P.P.P.H.H+P.H+.+.+.+)+)+)+C+C+C+7.J.b+*+o+:+u.u.>.>.>.>.u.u.f+:+*+J.J.r+2.2.^.4+R.4+4+4+4+q.4+4+4+4+4+4+q.q.X.^.^.q.^.q.q.2.q.B.B.B.++++J.G.o+u.u.z E x.{ { { -.-.1.-.1.-.-.4.4.`.&.9 c (+j+=+< =+W < =+< =+W W =+W W W W W W V.G ; G ; ; ; ; ]+; ]+; ; W (+c >+9 z z `.E `.E z u.u.u.:+D G.3+i C+)+a+4+a+q.r+:.Y a.= s+s+s+s+s+s+s+s+s+s+s+a.s+s+s+s+a.a.a.% % % + + 4 F :.;+Y *+:+p+>.N E E x.~.x.E E u.:+o+J.C+X.N.[+Q.y+U.: |.Q . . . . . . . . . . . . . 0.B+[.| <+e+l+p.B q.C+;+:+>.s+A !.!.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.9.!.8 A s+a.% % + + + + + + + F Y n 3+n < _.W W 6 6 6 c+1 1 H+H+P.}+P.}+w w #+#+9+L.9+L.#+H H w H '+'+H.N.N.}+B H }+N.}+H.s.#+m.p.9+9+9+p.C.9+L.9+9+p.#+9+9+m.9+p.[+p.,+w+/+/+/+/+/+t.[+/+p.t.p.p. +p.p.p.p.p.p.p.p.N.p.N.p.N.N.p.p.N.N.p.", "J.A+++++A+8.A+A+b+G.D G.G.D G.o+D o+5.5.o+o+o+o+5.5.D < b+A+A+J.8.A+A+C+k+B.i.B.B.C+++++++8.A+8.b+b+8.b+b+8.8.8.8.j+8.8.c.8.8.b+8.b+8.b+8.c.8.b+8.c.8.8.b+8.8.8.8.8.8.k+k+k+k+k+k+k+k+k+k+k+k+6 B.6 i.i.Z X.i.X.G+X.X..+.+1 P..+P.P.P.P.P.P.P.b P.b P.b P.P.b H.P.P.H.H.P.P.P.H.P.H.H.H.H.H.P.H.B P.H+.+X.)+^.)+B.C+C+++b+G.*+:+u.z = E E E E E N N u.:+*+;+7.r+^.q.R.4+R.R.4+q.'+4+q.4+4+4+4+4+4+4+4+4+4+4+^.^..+^.^.^.2.B.++J.b+G.o+u.z `.-+E 4.4.{ { -.{ -.-.4.4.`.&.&.( c c < W W W =+W W =+< W W W W =+W V.W W W =+W ; ; G ; ; ; ; ; W W c.5.i+9 &.&.4.E 4.-+E E E z >.f+:+*+n 3+C+^.)+a+4+2.i b...= s+A A A A s+A A A A s+s+s+s+s+s+s+s+s+s+s+E.% % F + + :.:.;+Y ..*+u.u.N = = = E N >.f+G.J.C+)+B n+t.0 <+].g+|.Q . . . . . . . . . . . . . Q |.m+<+y+e+p.N.N.4+C+7.;+:+N x.A 8 !.9.9.9.9.9.9.9.9.9.9.9.9.9.9.!.A A s+= a.% + + + /.+ + + % F F n n < < < 8.W W G (.c+n.1 P.5 1 P.H+H.H.N.w #+#+9+L.p.Y.C.9+H H w w s.H.'+H s.N.H E+H H #+m.m.9+C.,+C.C.C.9+p.9+m.C.9+9+p.9+[+C.C.p.,+p./+p./+/+t.p.}.p.t.t.p.t.p.t.p.p.p.p.p.p.p.p.N.p.N.p.N.p.N.N.p.N.", "8.b+b+b+b+b+b+b+b+b+b+G.G.G.D 5.o+>+( ( ( 5.( o+5.*+5.G.n G.b+J.b+A+J.A+8.A+8.8.A+8.++A+A+A+b+++A+8.8.8.8.8.8.8.++8.8.8.8.8.8.8.8.8.8.8.8.++8.++8.++8.8.8.++8.++k+8.k+8.8.k+k+k+k+k+6 k+k+i.i.6 B.i.i.i.i.X.Z Z X.G+G+X.G+X.1 .+H+1 P.H+P.P.P.P.H.H.P.H.H.H.E+H.H.P.H.H.H.H.H.H.H.H.E+H.w H.b H.E+H.H+.+4+^.)+)+)+C+++J.G.*+f+u.E E x.A { ~.~.{ x.E = >.f+*+J.i 2.4+` '+'+'+4+'+4+'+'+'+4+4+'+4+4+'+4+4+4+4+'+4+4+4+^.X.2.B.C+A+b+G.o+f+u.u.z `.E -+-+) 4.4.4.4.-+) &.9 ( c < W W =+W W W W W =+W =+W W W W W W =+W W ; W W ; W ; ; ; W W W c c i+9 &.) 4.{ { { { { x.E E E u.E.*+G.J.++o ^.a+^.2.;+*+= s+A A A A A A A 8 A 8 8 8 A A s+s+s+s+s+a.a.a.E.Y F F F F :.;+b.....:+p+u.>.>.>.>.u.f+*+G.J.C+4+N.p.Q.o.<+r.l.} Q . . . . . . . . . . . . 0.B+l.r.<+y+t.p.p.4+q.C+7.J.*+:+N s+~.8 !.9.9.9.9.9.9.9.9.9.9.9.9.9.!.8 A s+a.a.% % + /.+ + + + + n % n n < < 8.W W G G 6 (.n.n.1 5 1 P.1 H+H+E+w w #+m.9+9+L.p.9+L.9+#+#+H #+H w H s.H #+m.p.L.p.9+[+p.C.,+p.,.C.9+9+9+9+p.C.9+p.9+[+,+/+,+w+/+/+t./+/+/+/+t.[+t.t.p.p.p.t.p.p.p.p.p.p.p.p.p.N.p.N.N.p.!+p.N.", ";+b+G.b+G.b+b+b+G.G.D D D D 5.5.E.( o+o+( E.o+E.*+5.*+5.G.n ;+b+J.J.A+A+A+A+++++++++++++8.++8.A+8.A+++k+8.++8.++8.8.8.++8.++8.++++++++k+++++k+8.C+8.k+++k+8.k+8.k+W k+k+k+k+k+6 k+6 i.i.i.i.i.i.i.X.X.X.X.X.G+X.G+X.1 1 H+1 P.P.P.P.H.P.P.P.P.H.H.b b b z+z+z+b z+b b b b b w b b b b b b z+H.w H.H.P.H..+X..+)+B.C+++J.G.f+u.N E ~.{ 8 8 8 8 8 A A E = p+:+;+7.2.q.4+4+` '+'+'+'+4+'+'+'+'+'+'+'+'+'+'+'+'+'+a+'+R.4+^.)+B.C+++J.b+D o+f+f+9 z z z &.`.) -+-+) `.&.9 9 i+(+j+W W W W W ; W W ; W W W =+W =+W W W W W =+W ; W ; W W ; W =+W (+c i+&.`.-+{ -.1.8 8 { { ~.E E z u.E.*+J.i B.^.^.)+C+G.a.s+A 8 8 8 8 !.8 !.!.u u u u 8 8 A s+s+s+s+s+a.a.E.E.b.F 4 4 :.:.;+b.Y ..:+p+p+u.u.>.f+:+G.J.C+^.4+#+[+t.o.L r.: B+0.. . . . . . . . . . . . Q |.l.U.<+y+t.p.N.4+4+C+C+7.;+*+:+>.E ~.A !.9.9.9.9.9.9.9.9.9.9.9.8 A A s+s+a.% % + + /.+ /.+ F + F 3+n n < < < < W W ; ; ~ n.n.^ n.1 1 P.1 P.B }+N.#+#+#+9+p.C.C.p.L.p.p.#+m.#+L.#+n+p.m.L.9+p.C.p.C.w+,+w+w+p.,+,+C.p.C.9+p.9+[+p.,+p.w+p./+/+/+/+/+/+t./+t.p.t.p.}.p.p.p.p.p.p.p.N.p.p.p.N.p.p.p.p.p.N.N.m."}; void make_splash_pixmaps(GtkWidget *window) { GtkStyle *style; style=gtk_widget_get_style(window); GLOBALS->wave_splash_pixmap=gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->wave_splash_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)wave_splash_xpm); } static gint expose_event(GtkWidget *widget, GdkEventExpose *event) { gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE(widget)], GLOBALS->wave_splash_pixmap, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); return(FALSE); } gint splash_button_press_event(GtkWidget *widget, GdkEventExpose *event) { (void)widget; (void)event; if(GLOBALS->timeout_tag) { gtk_timeout_remove(GLOBALS->timeout_tag); GLOBALS->timeout_tag = 0; } if(GLOBALS->wave_splash_pixmap) { gdk_pixmap_unref(GLOBALS->wave_splash_pixmap); GLOBALS->wave_splash_pixmap = NULL; } if(GLOBALS->splash_splash_c_1) { gtk_widget_destroy(GTK_WIDGET(GLOBALS->splash_splash_c_1)); GLOBALS->splash_splash_c_1 = NULL; } if(GLOBALS->gt_splash_c_1) { g_timer_destroy(GLOBALS->gt_splash_c_1); GLOBALS->gt_splash_c_1 = NULL; } return(FALSE); } gint splash_kill(gpointer dummy) { (void)dummy; gulong usec; if(GLOBALS && GLOBALS->gt_splash_c_1) { gint sec = (gint) g_timer_elapsed(GLOBALS->gt_splash_c_1, &usec); int skill = (sec>=2); if(GLOBALS->cnt_splash_c_1) GLOBALS->cnt_splash_c_1 -= GLOBALS->load_complete_splash_c_1; if((!GLOBALS->cnt_splash_c_1)&&(skill)) { return(splash_button_press_event(NULL,NULL)); } else { if(!GLOBALS->load_complete_splash_c_1) gdk_window_raise(GTK_WIDGET(GLOBALS->splash_splash_c_1)->window); } } return(1); } void splash_create(void) { if((!GLOBALS->splash_disable)&&(!GLOBALS->splash_splash_c_1)) { GtkWidget *splash_table; gint dx, dy; GLOBALS->gt_splash_c_1 = g_timer_new(); GLOBALS->splash_splash_c_1 = gtk_window_new(GTK_WINDOW_POPUP); #if !defined _MSC_VER && !defined __MINGW32__ dx = 8; dy = 8; #else #if GTK_CHECK_VERSION(2,24,10) dx = 8; dy = 8; #else dx = 8; dy = 26; /* ...old value required for previous versions of GTK on mingw apparently no longer needed */ #endif #endif gtk_widget_set_usize(GTK_WIDGET(GLOBALS->splash_splash_c_1), WAVE_SPLASH_X + dx, WAVE_SPLASH_Y + dy); gtk_window_set_type_hint(GTK_WINDOW(GLOBALS->splash_splash_c_1), GDK_WINDOW_TYPE_HINT_SPLASHSCREEN); gtk_window_set_position(GTK_WINDOW(GLOBALS->splash_splash_c_1), GTK_WIN_POS_CENTER); gtk_widget_show(GLOBALS->splash_splash_c_1); make_splash_pixmaps(GLOBALS->splash_splash_c_1); splash_table = gtk_table_new(10, 10, FALSE); GLOBALS->darea_splash_c_1 = gtk_drawing_area_new(); gtk_widget_show(GLOBALS->darea_splash_c_1); gtk_widget_set_events(GLOBALS->darea_splash_c_1, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK); gtk_table_attach (GTK_TABLE (splash_table), GLOBALS->darea_splash_c_1, 0, 9, 0, 9,GTK_FILL | GTK_EXPAND,GTK_FILL | GTK_EXPAND | GTK_SHRINK, 3, 3); gtk_widget_show(splash_table); gtk_container_add(GTK_CONTAINER(GLOBALS->splash_splash_c_1), splash_table); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->darea_splash_c_1), "expose_event",GTK_SIGNAL_FUNC(expose_event), NULL); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->darea_splash_c_1), "button_press_event",GTK_SIGNAL_FUNC(splash_button_press_event), NULL); gtk_events_pending_gtk_main_iteration(); gdk_draw_drawable(GLOBALS->darea_splash_c_1->window,GLOBALS->darea_splash_c_1->style->fg_gc[GTK_WIDGET_STATE (GLOBALS->darea_splash_c_1)],GLOBALS->wave_splash_pixmap,0,0,0,0,WAVE_SPLASH_X,WAVE_SPLASH_Y); gtk_events_pending_gtk_main_iteration(); GLOBALS->timeout_tag = gtk_timeout_add(100, splash_kill, GLOBALS->splash_splash_c_1); } else { /* was commented out for now because of DnD while loading crash */ #ifdef SPLASH_ADDED_LOADER_MESSAGES if(GLOBALS->mainwindow) { wave_gtk_window_set_title(GTK_WINDOW(GLOBALS->mainwindow), GLOBALS->winname, WAVE_SET_TITLE_LOADING, 0); } #endif } } void splash_sync(off_t current, off_t total) { struct Global *g_old = GLOBALS; int cur_bar_x; if(GLOBALS->splash_splash_c_1) { if((current)&&(total)) { cur_bar_x = WAVE_SPLASH_X * ((float)current / (float)total); if(cur_bar_x != GLOBALS->prev_bar_x_splash_c_1) { if((current==total)||(cur_bar_x>=WAVE_SPLASH_X-4)) GLOBALS->load_complete_splash_c_1=1; /* if(current>total) current = total; */ /* scan-build */ gdk_draw_rectangle(GLOBALS->darea_splash_c_1->window, GLOBALS->splash_splash_c_1->style->black_gc, TRUE,0,WAVE_SPLASH_Y-4, (GLOBALS->prev_bar_x_splash_c_1 = cur_bar_x), 4); } } gtk_events_pending_gtk_main_iteration(); } else { #ifdef SPLASH_ADDED_LOADER_MESSAGES if((GLOBALS->mainwindow)&&(!GLOBALS->tcl_running)) { if(!GLOBALS->splash_is_loading) { set_window_busy_no_refresh(GLOBALS->mainwindow); GLOBALS->splash_is_loading = 1; #ifdef MAC_INTEGRATION osx_menu_sensitivity(FALSE); #endif } if((current)&&(total)) { cur_bar_x = 100 * ((float)current / (float)total); if(cur_bar_x != GLOBALS->prev_bar_x_splash_c_1) { GLOBALS->prev_bar_x_splash_c_1 = cur_bar_x; wave_gtk_window_set_title(GTK_WINDOW(GLOBALS->mainwindow), GLOBALS->winname, WAVE_SET_TITLE_LOADING, cur_bar_x); if(0) { GdkDisplay *g = gdk_display_get_default(); if(g) gdk_display_flush(g); } else { gtk_events_pending_gtk_main_iteration(); set_GLOBALS(g_old); } } } } #endif } } void splash_finalize(void) { if(GLOBALS->splash_is_loading) { GLOBALS->splash_is_loading = 0; GLOBALS->splash_fix_win_title = 1; set_window_idle(GLOBALS->mainwindow); #ifdef MAC_INTEGRATION osx_menu_sensitivity(TRUE); #endif } } #else gint splash_button_press_event(GtkWidget *widget, GdkEventExpose *event) { (void)widget; (void)event; /* do nothing */ return(FALSE); } void splash_create(void) { /* do nothing */ } void splash_sync(off_t current, off_t total) { (void)current; (void)total; /* do nothing */ } void splash_finalize(void) { /* do nothing */ } #endif gtkwave-3.3.86/src/showchange.h0000664000175000017500000000064213166335473015674 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010 * * 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. */ #ifndef WAVE_SHOWCHANGE_H #define WAVE_SHOWCHANGE_H void showchange(char *title, Trptr t, GtkSignalFunc func); #endif gtkwave-3.3.86/src/debug.h0000664000175000017500000001141413166335473014633 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2012. * * 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. */ #ifndef WAVE_DEBUG_H #define WAVE_DEBUG_H #include #include #include #include #ifndef _MSC_VER #ifndef __MINGW32__ #include #else #include #endif #endif #define WAVE_MAX_CLIST_LENGTH 15000 /* * If you have problems viewing traces (mangled timevalues), * make sure that you use longs rather than the glib 64-bit * types... */ #ifdef G_HAVE_GINT64 typedef gint64 TimeType; typedef guint64 UTimeType; #ifndef _MSC_VER #define LLDescriptor(x) x##LL #define ULLDescriptor(x) x##ULL #ifdef __MINGW32__ #define TTFormat "%I64d" #define UTTFormat "%I64u" #else #if __WORDSIZE == 64 #define TTFormat "%ld" #define UTTFormat "%lu" #else #define TTFormat "%lld" #define UTTFormat "%llu" #endif #endif #else #define LLDescriptor(x) x##i64 #define ULLDescriptor(x) x##i64 #define TTFormat "%I64d" #define UTTFormat "%I64u" #endif #define WAVE_MINZOOM (LLDescriptor(-4000000000)) #else typedef long TimeType; typedef unsigned long UTimeType; #define TTFormat "%d" #define UTTFormat "%u" #define LLDescriptor(x) x #define ULLDescriptor(x) x #define WAVE_MINZOOM (LLDescriptor(-20000000)) #endif #ifdef _MSC_VER #define strncasecmp(s1, s2, n) _strnicmp(s1, s2, n) #define popen _popen #define pclose _pclose #endif #ifdef DEBUG_PRINTF #define DEBUG(x) x #else #define DEBUG(x) #endif #ifdef DEBUG_MALLOC_LINES void free_2(void *ptr, char *filename, int lineno); #define free_2(x) free_2((x),__FILE__,__LINE__) void *malloc_2(size_t size, char *filename, int lineno); #define malloc_2(x) malloc_2((x),__FILE__,__LINE__) void *realloc_2(void *ptr, size_t size, char *filename, int lineno); #define realloc_2(x, y) realloc_2((x),(y),__FILE__,__LINE__) void *calloc_2(size_t nmemb, size_t size, char *filename, int lineno); #define calloc_2(x, y) calloc_2((x),(y),__FILE__,__LINE__) #else void free_2(void *ptr); void *malloc_2(size_t size); void *realloc_2(void *ptr, size_t size); void *calloc_2(size_t nmemb, size_t size); #endif void free_outstanding(void); char *strdup_2(const char *s); char *strdup_2s(const char *s); char *tmpnam_2(char *s, int *fd); /* mimic functionality of tmpnam() */ TimeType atoi_64(const char *str); void gtk_tooltips_set_tip_2(GtkTooltips *tooltips, GtkWidget *widget, const gchar *tip_text, const gchar *tip_private); void gtk_tooltips_set_delay_2(GtkTooltips *tooltips, guint delay); GtkTooltips* gtk_tooltips_new_2(void); char *realpath_2(const char *path, char *resolved_path); enum WaveLoadingTitleType { WAVE_SET_TITLE_NONE, WAVE_SET_TITLE_MODIFIED, WAVE_SET_TITLE_LOADING }; void wave_gtk_window_set_title(GtkWindow *window, const gchar *title, int typ, int pct); #undef WAVE_USE_SIGCMP_INFINITE_PRECISION /* define this for slow sigcmp with infinite digit accuracy */ #define WAVE_OPT_SKIP 1 /* make larger for more accel on traces */ /* for source code annotation helper app */ #ifndef PATH_MAX #define PATH_MAX (4096) #endif #define WAVE_MATCHWORD "WAVE" enum AnnotateAetType { WAVE_ANNO_NONE, WAVE_ANNO_AE2, WAVE_ANNO_VZT, WAVE_ANNO_LXT2, WAVE_ANNO_FST, WAVE_ANNO_MAX }; #if !defined _MSC_VER && !defined __MINGW32__ #include #include struct gtkwave_annotate_ipc_t { char matchword[4]; /* match against WAVE_MATCHWORD string */ char time_string[40]; /* formatted marker time */ pid_t gtkwave_process; pid_t browser_process; TimeType marker; unsigned marker_set : 1; unsigned cygwin_remote_kill : 1; int aet_type; char aet_name[PATH_MAX+1]; char stems_name[PATH_MAX+1]; }; #else struct gtkwave_annotate_ipc_t { char matchword[4]; /* match against WAVE_MATCHWORD string */ char time_string[40]; /* formatted marker time */ #ifdef __MINGW32__ HANDLE browser_process; #endif TimeType marker; unsigned marker_set : 1; unsigned cygwin_remote_kill : 1; int aet_type; char aet_name[PATH_MAX+1]; char stems_name[PATH_MAX+1]; }; #endif #define DUAL_MATCHWORD "DUAL" struct gtkwave_dual_ipc_t { char matchword[4]; /* match against DUAL_MATCHWORD string */ TimeType left_margin_time; TimeType marker, baseline; gdouble zoom; unsigned use_new_times : 1; unsigned viewer_is_initialized : 1; }; enum GtkwaveFileTypes { G_FT_UNKNOWN, G_FT_LXT, G_FT_LXT2, G_FT_VZT, G_FT_FST }; int determine_gtkwave_filetype(const char *path); #endif gtkwave-3.3.86/src/pagebuttons.c0000664000175000017500000001046113166335473016074 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2005. * * 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. */ #include "globals.h" #include #include "currenttime.h" #include "pixmaps.h" #include "debug.h" void service_left_page(GtkWidget *text, gpointer data) { (void)text; (void)data; TimeType ntinc, ntfrac; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nPage Left"); help_text( " scrolls the display window left one page worth of data." " The net action is that the data scrolls right a page." #ifdef WAVE_USE_GTK2 " Scrollwheel Up also hits this button in non-alternative wheel mode." #endif ); return; } ntinc=(TimeType)(((gdouble)GLOBALS->wavewidth)*GLOBALS->nspx); /* really don't need this var but the speed of ui code is human dependent.. */ ntfrac=ntinc*GLOBALS->page_divisor; if((ntfrac<1)||(ntinc<1)) ntfrac= /*ntinc=*/ 1; /* scan-build */ if((GLOBALS->tims.start-ntfrac)>GLOBALS->tims.first) GLOBALS->tims.timecache=GLOBALS->tims.start-ntfrac; else GLOBALS->tims.timecache=GLOBALS->tims.first; GTK_ADJUSTMENT(GLOBALS->wave_hslider)->value=GLOBALS->tims.timecache; time_update(); DEBUG(printf("Left Page\n")); } void service_right_page(GtkWidget *text, gpointer data) { (void)text; (void)data; TimeType ntinc, ntfrac; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nPage Right"); help_text( " scrolls the display window right one page worth of data." " The net action is that the data scrolls left a page." #ifdef WAVE_USE_GTK2 " Scrollwheel Down also hits this button in non-alternative wheel mode." #endif ); return; } ntinc=(TimeType)(((gdouble)GLOBALS->wavewidth)*GLOBALS->nspx); ntfrac=ntinc*GLOBALS->page_divisor; if((ntfrac<1)||(ntinc<1)) ntfrac=ntinc=1; if((GLOBALS->tims.start+ntfrac)<(GLOBALS->tims.last-ntinc+1)) { GLOBALS->tims.timecache=GLOBALS->tims.start+ntfrac; } else { GLOBALS->tims.timecache=GLOBALS->tims.last-ntinc+1; if(GLOBALS->tims.timecachetims.first) GLOBALS->tims.timecache=GLOBALS->tims.first; } GTK_ADJUSTMENT(GLOBALS->wave_hslider)->value=GLOBALS->tims.timecache; time_update(); DEBUG(printf("Right Page\n")); } /* Create page buttons */ GtkWidget * create_page_buttons (void) { GtkWidget *table; GtkWidget *table2; GtkWidget *frame; GtkWidget *main_vbox; GtkWidget *b1; GtkWidget *b2; GtkWidget *pixmapwid1, *pixmapwid2; GtkTooltips *tooltips; tooltips=gtk_tooltips_new_2(); gtk_tooltips_set_delay_2(tooltips,1500); pixmapwid1=gtk_pixmap_new(GLOBALS->prev_page_pixmap, GLOBALS->prev_page_mask); gtk_widget_show(pixmapwid1); pixmapwid2=gtk_pixmap_new(GLOBALS->next_page_pixmap, GLOBALS->next_page_mask); gtk_widget_show(pixmapwid2); /* Create a table to hold the text widget and scrollbars */ table = gtk_table_new (1, 1, FALSE); main_vbox = gtk_vbox_new (FALSE, 1); gtk_container_border_width (GTK_CONTAINER (main_vbox), 1); gtk_container_add (GTK_CONTAINER (table), main_vbox); frame = gtk_frame_new ("Page "); gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0); gtk_widget_show (frame); gtk_widget_show (main_vbox); table2 = gtk_table_new (2, 1, FALSE); b1 = gtk_button_new(); gtk_container_add(GTK_CONTAINER(b1), pixmapwid1); gtk_table_attach (GTK_TABLE (table2), b1, 0, 1, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); gtk_signal_connect_object (GTK_OBJECT (b1), "clicked", GTK_SIGNAL_FUNC(service_left_page), GTK_OBJECT (table2)); gtk_tooltips_set_tip_2(tooltips, b1, "Scroll Window Left One Page", NULL); gtk_widget_show(b1); b2 = gtk_button_new(); gtk_container_add(GTK_CONTAINER(b2), pixmapwid2); gtk_table_attach (GTK_TABLE (table2), b2, 0, 1, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); gtk_signal_connect_object (GTK_OBJECT (b2), "clicked", GTK_SIGNAL_FUNC(service_right_page), GTK_OBJECT (table2)); gtk_tooltips_set_tip_2(tooltips, b2, "Scroll Window Right One Page", NULL); gtk_widget_show(b2); gtk_container_add (GTK_CONTAINER (frame), table2); gtk_widget_show(table2); return(table); } gtkwave-3.3.86/src/tree.c0000664000175000017500000005460713166335473014512 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2016. * * 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. */ /* AIX may need this for alloca to work */ #if defined _AIX #pragma alloca #endif #include #include "globals.h" #include "tree.h" #include "vcd.h" enum TreeBuildTypes { MAKETREE_FLATTEN, MAKETREE_LEAF, MAKETREE_NODE }; #ifdef WAVE_USE_STRUCT_PACKING struct tree *talloc_2(size_t siz) { if(GLOBALS->talloc_pool_base) { if((siz + GLOBALS->talloc_idx) <= WAVE_TALLOC_POOL_SIZE) { unsigned char *m = GLOBALS->talloc_pool_base + GLOBALS->talloc_idx; GLOBALS->talloc_idx += siz; return((struct tree *)m); } else if(siz >= WAVE_TALLOC_ALTREQ_SIZE) { return(calloc_2(1, siz)); } } GLOBALS->talloc_pool_base = calloc_2(1, WAVE_TALLOC_POOL_SIZE); GLOBALS->talloc_idx = 0; return(talloc_2(siz)); } #endif /* * init pointers needed for n-way tree */ void init_tree(void) { GLOBALS->module_tree_c_1=(char *)malloc_2(GLOBALS->longestname+1); } /* * extract the next part of the name in the flattened * hierarchy name. return ptr to next name if it exists * else NULL */ static const char *get_module_name(const char *s) { char ch; char *pnt; pnt=GLOBALS->module_tree_c_1; for(;;) { ch=*(s++); if(((ch==GLOBALS->hier_delimeter) || (ch == '|')) && (*s)) /* added && null check to allow possible . at end of name */ { *(pnt)=0; GLOBALS->module_len_tree_c_1 = pnt - GLOBALS->module_tree_c_1; return(s); } if(!(*(pnt++)=ch)) { GLOBALS->module_len_tree_c_1 = pnt - GLOBALS->module_tree_c_1; return(NULL); /* nothing left to extract */ } } } /* * generate unique hierarchy pointer faster that sprintf("%p") * use 7-bit string to generate less characters */ #ifdef _WAVE_HAVE_JUDY static int gen_hier_string(char *dest, void *pnt) { unsigned long p = (unsigned long)(pnt); char *dest_copy = dest; while(p) { *(dest++) = (p & 0x7f) | 0x80; p >>= 7; } *(dest++) = '.'; return(dest - dest_copy); } #endif /* * decorated module cleanup (if judy active) */ int decorated_module_cleanup(void) { #ifdef _WAVE_HAVE_JUDY if(GLOBALS->sym_tree) { JudySLFreeArray(&GLOBALS->sym_tree, PJE0); } if(GLOBALS->sym_tree_addresses) { int rcValue; Word_t Index = 0; for (rcValue = Judy1First(GLOBALS->sym_tree_addresses, &Index, PJE0); rcValue != 0; rcValue = Judy1Next(GLOBALS->sym_tree_addresses, &Index, PJE0)) { ((struct tree *)Index)->children_in_gui = 0; } Judy1FreeArray(&GLOBALS->sym_tree_addresses, PJE0); } #endif return(1); } /* * decorated module add */ void allocate_and_decorate_module_tree_node(unsigned char ttype, const char *scopename, const char *compname, uint32_t scopename_len, uint32_t compname_len, uint32_t t_stem, uint32_t t_istem) { struct tree *t; int mtyp = WAVE_T_WHICH_UNDEFINED_COMPNAME; #ifdef _WAVE_HAVE_JUDY char str[2048]; #endif if(compname && compname[0] && strcmp(scopename, compname)) { int ix = add_to_comp_name_table(compname, compname_len); if(ix) { ix--; mtyp = WAVE_T_WHICH_COMPNAME_START - ix; } } if(GLOBALS->treeroot) { if(GLOBALS->mod_tree_parent) { #ifdef _WAVE_HAVE_JUDY if(GLOBALS->mod_tree_parent->children_in_gui) { PPvoid_t PPValue; /* find with judy */ int len = gen_hier_string(str, GLOBALS->mod_tree_parent); strcpy(str+len, scopename); PPValue = JudySLIns(&GLOBALS->sym_tree, (uint8_t *)str, PJE0); if(*PPValue) { GLOBALS->mod_tree_parent = *PPValue; return; } t = talloc_2(sizeof(struct tree) + scopename_len + 1); *PPValue = t; goto t_allocated; } else { int dep = 0; #endif t = GLOBALS->mod_tree_parent->child; while(t) { if(!strcmp(t->name, scopename)) { GLOBALS->mod_tree_parent = t; return; } t = t->next; #ifdef _WAVE_HAVE_JUDY dep++; #endif } #ifdef _WAVE_HAVE_JUDY if(dep >= FST_TREE_SEARCH_NEXT_LIMIT) { PPvoid_t PPValue; int len = gen_hier_string(str, GLOBALS->mod_tree_parent); GLOBALS->mod_tree_parent->children_in_gui = 1; /* "borrowed" for tree build */ t = GLOBALS->mod_tree_parent->child; Judy1Set ((Pvoid_t)&GLOBALS->sym_tree_addresses, (Word_t)GLOBALS->mod_tree_parent, PJE0); /* assemble judy based on scopename + GLOBALS->mod_tree_parent pnt */ while(t) { strcpy(str+len, t->name); PPValue = JudySLIns(&GLOBALS->sym_tree, (uint8_t *)str, PJE0); *PPValue = t; t = t->next; } strcpy(str+len, scopename); PPValue = JudySLIns(&GLOBALS->sym_tree, (uint8_t *)str, PJE0); t = talloc_2(sizeof(struct tree) + scopename_len + 1); *PPValue = t; goto t_allocated; } } #endif t = talloc_2(sizeof(struct tree) + scopename_len + 1); #ifdef _WAVE_HAVE_JUDY t_allocated: #endif strcpy(t->name, scopename); t->kind = ttype; t->t_which = mtyp; t->t_stem = t_stem; t->t_istem = t_istem; if(GLOBALS->mod_tree_parent->child) { t->next = GLOBALS->mod_tree_parent->child; } GLOBALS->mod_tree_parent->child = t; GLOBALS->mod_tree_parent = t; } else { t = GLOBALS->treeroot; while(t) { if(!strcmp(t->name, scopename)) { GLOBALS->mod_tree_parent = t; return; } t = t->next; } t = talloc_2(sizeof(struct tree) + scopename_len + 1); strcpy(t->name, scopename); t->kind = ttype; t->t_which = mtyp; t->t_stem = t_stem; t->t_istem = t_istem; t->next = GLOBALS->treeroot; GLOBALS->mod_tree_parent = GLOBALS->treeroot = t; } } else { t = talloc_2(sizeof(struct tree) + scopename_len + 1); strcpy(t->name, scopename); t->kind = ttype; t->t_which = mtyp; t->t_stem = t_stem; t->t_istem = t_istem; GLOBALS->mod_tree_parent = GLOBALS->treeroot = t; } } /* * adds back netnames */ int treegraft(struct tree **t) { struct tree *tx = GLOBALS->terminals_tchain_tree_c_1; struct tree *t2; struct tree *par; while(tx) { t2 = tx->next; par = tx->child; tx->child = NULL; if(par) { if(par->child) { tx->next = par->child; par->child = tx; } else { par->child = tx; tx->next = NULL; } } else { if(*t) { tx->next = (*t)->next; (*t)->next = tx; } else { *t = tx; tx->next = NULL; } } tx = t2; } return(1); } /* * unswizzle extended names in tree */ void treenamefix_str(char *s) { while(*s) { if(*s==VCDNAM_ESCAPE) *s=GLOBALS->hier_delimeter; s++; } } void treenamefix(struct tree *t) { struct tree *tnext; if(t->child) treenamefix(t->child); tnext = t->next; while(tnext) { if(tnext->name) treenamefix_str(tnext->name); tnext=tnext->next; } if(t->name) treenamefix_str(t->name); } /* * for debugging purposes only */ void treedebug(struct tree *t, char *s) { while(t) { char *s2; s2=(char *)malloc_2(strlen(s)+strlen(t->name)+2); strcpy(s2,s); strcat(s2,"."); strcat(s2,t->name); if(t->child) { treedebug(t->child, s2); } if(t->t_which>=0) /* for when valid netnames like A.B.C, A.B.C.D exist (not legal excluding texsim) */ /* otherwise this would be an 'else' */ { printf("%3d) %s\n", t->t_which, s2); } free_2(s2); t=t->next; } } static GtkCTreeNode *maketree_nodes(GtkCTreeNode *subtree, struct tree *t2, GtkCTreeNode *sibling, int mode) { char *tmp, *tmp2, *tmp3; gchar *text [1]; GdkDrawable *pxm, *msk; if(t2->t_which >= 0) { if(GLOBALS->facs[t2->t_which]->vec_root) { if(GLOBALS->autocoalesce) { if(GLOBALS->facs[t2->t_which]->vec_root!=GLOBALS->facs[t2->t_which]) { return(NULL); } tmp2=makename_chain(GLOBALS->facs[t2->t_which]); tmp3=leastsig_hiername(tmp2); tmp=wave_alloca(strlen(tmp3)+4); strcpy(tmp, "[] "); strcpy(tmp+3, tmp3); free_2(tmp2); } else { tmp=wave_alloca(strlen(t2->name)+4); strcpy(tmp, "[] "); strcpy(tmp+3, t2->name); } } else { tmp=t2->name; } } else { if(t2->t_which == WAVE_T_WHICH_UNDEFINED_COMPNAME) { tmp=t2->name; } else { int thidx = -t2->t_which + WAVE_T_WHICH_COMPNAME_START; if((thidx >= 0) && (thidx < GLOBALS->comp_name_serial)) { char *sc = GLOBALS->comp_name_idx[thidx]; int tlen = strlen(t2->name) + 2 + 1 + strlen(sc) + 1 + 1; tmp = wave_alloca(tlen); if(!GLOBALS->is_vhdl_component_format) { sprintf(tmp, "%s (%s)", t2->name, sc); } else { sprintf(tmp, "%s : %s", t2->name, sc); } } else { tmp=t2->name; /* should never get a value out of range here! */ } } } text[0]=tmp; switch(mode) { case MAKETREE_FLATTEN: if(t2->child) { sibling = gtk_ctree_insert_node (GLOBALS->ctree_main, subtree, sibling, text, 3, NULL, NULL, NULL, NULL, FALSE, FALSE); gtk_ctree_node_set_row_data(GLOBALS->ctree_main, sibling, t2); maketree(sibling, t2->child); } else { sibling = gtk_ctree_insert_node (GLOBALS->ctree_main, subtree, sibling, text, 3, NULL, NULL, NULL, NULL, TRUE, FALSE); gtk_ctree_node_set_row_data(GLOBALS->ctree_main, sibling, t2); } break; default: switch(t2->kind) { case TREE_VCD_ST_MODULE: pxm = GLOBALS->hiericon_module_pixmap; msk = GLOBALS->hiericon_module_mask; break; case TREE_VCD_ST_TASK: pxm = GLOBALS->hiericon_task_pixmap; msk = GLOBALS->hiericon_task_mask; break; case TREE_VCD_ST_FUNCTION: pxm = GLOBALS->hiericon_function_pixmap; msk = GLOBALS->hiericon_function_mask; break; case TREE_VCD_ST_BEGIN: pxm = GLOBALS->hiericon_begin_pixmap; msk = GLOBALS->hiericon_begin_mask; break; case TREE_VCD_ST_FORK: pxm = GLOBALS->hiericon_fork_pixmap; msk = GLOBALS->hiericon_fork_mask; break; case TREE_VCD_ST_GENERATE: pxm = GLOBALS->hiericon_generatefor_pixmap; msk = GLOBALS->hiericon_generatefor_mask; break; /* same as TREE_VHDL_ST_GENFOR */ case TREE_VCD_ST_STRUCT: pxm = GLOBALS->hiericon_block_pixmap; msk = GLOBALS->hiericon_block_mask; break; /* same as TREE_VHDL_ST_BLOCK */ case TREE_VCD_ST_UNION: pxm = GLOBALS->hiericon_instance_pixmap; msk = GLOBALS->hiericon_instance_mask; break; /* same as TREE_VHDL_ST_INSTANCE */ case TREE_VCD_ST_CLASS: pxm = GLOBALS->hiericon_class_pixmap; msk = GLOBALS->hiericon_class_mask; break; case TREE_VCD_ST_INTERFACE: pxm = GLOBALS->hiericon_interface_pixmap; msk = GLOBALS->hiericon_interface_mask; break; case TREE_VCD_ST_PACKAGE: pxm = GLOBALS->hiericon_svpackage_pixmap; msk = GLOBALS->hiericon_svpackage_mask; break; case TREE_VCD_ST_PROGRAM: pxm = GLOBALS->hiericon_program_pixmap; msk = GLOBALS->hiericon_program_mask; break; case TREE_VHDL_ST_DESIGN: pxm = GLOBALS->hiericon_design_pixmap; msk = GLOBALS->hiericon_design_mask; break; case TREE_VHDL_ST_BLOCK: pxm = GLOBALS->hiericon_block_pixmap; msk = GLOBALS->hiericon_block_mask; break; case TREE_VHDL_ST_GENIF: pxm = GLOBALS->hiericon_generateif_pixmap; msk = GLOBALS->hiericon_generateif_mask; break; case TREE_VHDL_ST_GENFOR: pxm = GLOBALS->hiericon_generatefor_pixmap; msk = GLOBALS->hiericon_generatefor_mask; break; case TREE_VHDL_ST_INSTANCE: pxm = GLOBALS->hiericon_instance_pixmap; msk = GLOBALS->hiericon_instance_mask; break; case TREE_VHDL_ST_PACKAGE: pxm = GLOBALS->hiericon_package_pixmap; msk = GLOBALS->hiericon_package_mask; break; case TREE_VHDL_ST_SIGNAL: pxm = GLOBALS->hiericon_signal_pixmap; msk = GLOBALS->hiericon_signal_mask; break; case TREE_VHDL_ST_PORTIN: pxm = GLOBALS->hiericon_portin_pixmap; msk = GLOBALS->hiericon_portin_mask; break; case TREE_VHDL_ST_PORTOUT: pxm = GLOBALS->hiericon_portout_pixmap; msk = GLOBALS->hiericon_portout_mask; break; case TREE_VHDL_ST_PORTINOUT: pxm = GLOBALS->hiericon_portinout_pixmap; msk = GLOBALS->hiericon_portinout_mask; break; case TREE_VHDL_ST_BUFFER: pxm = GLOBALS->hiericon_buffer_pixmap; msk = GLOBALS->hiericon_buffer_mask; break; case TREE_VHDL_ST_LINKAGE: pxm = GLOBALS->hiericon_linkage_pixmap; msk = GLOBALS->hiericon_linkage_mask; break; case TREE_VHDL_ST_ARCHITECTURE: pxm = GLOBALS->hiericon_module_pixmap; msk = GLOBALS->hiericon_module_mask; break; /* same as TREE_VCD_ST_MODULE */ case TREE_VHDL_ST_FUNCTION: pxm = GLOBALS->hiericon_function_pixmap; msk = GLOBALS->hiericon_function_mask; break; /* same as TREE_VCD_ST_FUNCTION */ case TREE_VHDL_ST_PROCESS: pxm = GLOBALS->hiericon_task_pixmap; msk = GLOBALS->hiericon_task_mask; break; /* same as TREE_VCD_ST_TASK */ case TREE_VHDL_ST_PROCEDURE: pxm = GLOBALS->hiericon_class_pixmap; msk = GLOBALS->hiericon_class_mask; break; /* same as TREE_VCD_ST_CLASS */ case TREE_VHDL_ST_RECORD: pxm = GLOBALS->hiericon_record_pixmap; msk = GLOBALS->hiericon_record_mask; break; case TREE_VHDL_ST_GENERATE: pxm = GLOBALS->hiericon_generate_pixmap; msk = GLOBALS->hiericon_generate_mask; break; default: pxm = msk = NULL; break; } sibling = gtk_ctree_insert_node (GLOBALS->ctree_main, subtree, sibling, text, 3, pxm, msk, pxm, msk, (mode==MAKETREE_LEAF), FALSE); gtk_ctree_node_set_row_data(GLOBALS->ctree_main, sibling, t2); break; } return(sibling); } /* * return least significant member name of a hierarchy * (used for tree and hier vec_root search hits) */ char *leastsig_hiername(char *nam) { char *t, *pnt=NULL; char ch; if(nam) { t=nam; while((ch=*(t++))) { if(ch==GLOBALS->hier_delimeter) pnt=t; } } return(pnt?pnt:nam); } /**********************************/ /* Experimental treesorting code */ /* (won't directly work with lxt2 */ /* because alias hier is after */ /* fac hier so fix with partial */ /* mergesort...) */ /**********************************/ /* * sort the hier tree..should be faster than * moving numfacs longer strings around */ static int tree_qsort_cmp(const void *v1, const void *v2) { struct tree *t1 = *(struct tree **)v1; struct tree *t2 = *(struct tree **)v2; return(sigcmp(t2->name, t1->name)); /* because list must be in rvs */ } static void treesort_2(struct tree *t, struct tree *p, struct tree ***tm, int *tm_siz) { struct tree *it; struct tree **srt; int cnt; int i; if(t->next) { it = t; cnt = 0; do { cnt++; it=it->next; } while(it); if(cnt > *tm_siz) { *tm_siz = cnt; if(*tm) { free_2(*tm); } *tm = malloc_2((cnt+1) * sizeof(struct tree *)); } srt = *tm; for(i=0;inext; } srt[i] = NULL; qsort((void *)srt, cnt, sizeof(struct tree *), tree_qsort_cmp); if(p) { p->child = srt[0]; } else { GLOBALS->treeroot = srt[0]; } for(i=0;inext = srt[i+1]; } it = srt[0]; for(i=0;ichild) { treesort_2(it->child, it, tm, tm_siz); } it = it->next; } } else if (t->child) { treesort_2(t->child, t, tm, tm_siz); } } void treesort(struct tree *t, struct tree *p) { struct tree **tm = NULL; int tm_siz = 0; treesort_2(t, p, &tm, &tm_siz); if(tm) { free_2(tm); } } void order_facs_from_treesort_2(struct tree *t) { while(t) { if(t->child) { order_facs_from_treesort_2(t->child); } if(t->t_which>=0) /* for when valid netnames like A.B.C, A.B.C.D exist (not legal excluding texsim) */ /* otherwise this would be an 'else' */ { GLOBALS->facs2_tree_c_1[GLOBALS->facs2_pos_tree_c_1] = GLOBALS->facs[t->t_which]; t->t_which = GLOBALS->facs2_pos_tree_c_1--; } t=t->next; } } void order_facs_from_treesort(struct tree *t, void *v) { struct symbol ***f = (struct symbol ***)v; /* eliminate compiler warning in tree.h as symbol.h refs tree.h */ GLOBALS->facs2_tree_c_1=(struct symbol **)malloc_2(GLOBALS->numfacs*sizeof(struct symbol *)); GLOBALS->facs2_pos_tree_c_1 = GLOBALS->numfacs-1; order_facs_from_treesort_2(t); if(GLOBALS->facs2_pos_tree_c_1>=0) { fprintf(stderr, "Internal Error: GLOBALS->facs2_pos_tree_c_1 = %d\n",GLOBALS->facs2_pos_tree_c_1); fprintf(stderr, "[This is usually the result of multiply defined facilities such as a hierarchy name also being used as a signal at the same level of scope.]\n"); exit(255); } free_2(*f); *f = GLOBALS->facs2_tree_c_1; GLOBALS->facs2_tree_c_1 = NULL; } void build_tree_from_name(const char *s, int which) { struct tree *t, *nt; struct tree *tchain = NULL, *tchain_iter; struct tree *prevt; #ifdef _WAVE_HAVE_JUDY PPvoid_t PPValue = NULL; char str[2048]; #endif if(s==NULL || !s[0]) return; t = GLOBALS->treeroot; if(t) { prevt = NULL; while(s) { rs: s=get_module_name(s); if(s && t && !strcmp(t->name, GLOBALS->module_tree_c_1)) /* ajb 300616 added "s &&" to cover case where we can have hierarchy + final name are same, see A.B.C.D notes elsewhere in this file */ { prevt = t; t = t->child; continue; } #ifdef _WAVE_HAVE_JUDY rescan: if(prevt && prevt->children_in_gui) { /* find with judy */ int len = gen_hier_string(str, prevt); strcpy(str+len, GLOBALS->module_tree_c_1); PPValue = JudySLIns(&GLOBALS->sym_tree, (uint8_t *)str, PJE0); if(*PPValue) { t = *PPValue; prevt = t; t = t->child; continue; } goto construct; } #endif tchain = tchain_iter = t; if(s && t) { #ifdef _WAVE_HAVE_JUDY int dep = 0; #endif nt = t->next; while(nt) { if(nt && !strcmp(nt->name, GLOBALS->module_tree_c_1)) { /* move to front to speed up next compare if in same hier during build */ if(prevt) { tchain_iter->next = nt->next; nt->next = tchain; prevt->child = nt; } prevt = nt; t = nt->child; goto rs; } tchain_iter = nt; nt = nt->next; #ifdef _WAVE_HAVE_JUDY dep++; #endif } #ifdef _WAVE_HAVE_JUDY if(prevt && (dep >= FST_TREE_SEARCH_NEXT_LIMIT)) { int len = gen_hier_string(str, prevt); prevt->children_in_gui = 1; /* "borrowed" for tree build */ t = prevt->child; Judy1Set ((Pvoid_t)&GLOBALS->sym_tree_addresses, (Word_t)prevt, PJE0); /* assemble judy based on scopename + prevt pnt */ while(t) { strcpy(str+len, t->name); PPValue = JudySLIns(&GLOBALS->sym_tree, (uint8_t *)str, PJE0); *PPValue = t; t = t->next; } goto rescan; /* this level of hier is built, now do insert */ } #endif } #ifdef _WAVE_HAVE_JUDY construct: #endif nt=(struct tree *)talloc_2(sizeof(struct tree)+GLOBALS->module_len_tree_c_1 + 1); memcpy(nt->name, GLOBALS->module_tree_c_1, GLOBALS->module_len_tree_c_1); if(s) { nt->t_which = WAVE_T_WHICH_UNDEFINED_COMPNAME; #ifdef _WAVE_HAVE_JUDY if(prevt && prevt->children_in_gui) { *PPValue = nt; } #endif if(prevt) /* make first in chain */ { nt->next = prevt->child; prevt->child = nt; } else /* make second in chain as it's toplevel */ { nt->next = tchain->next; tchain->next = nt; } } else { nt->child = prevt; /* parent */ nt->t_which = which; nt->next = GLOBALS->terminals_tchain_tree_c_1; GLOBALS->terminals_tchain_tree_c_1 = nt; return; } /* blindly clone fac from next part of hier on down */ t = nt; while(s) { s=get_module_name(s); nt=(struct tree *)talloc_2(sizeof(struct tree)+GLOBALS->module_len_tree_c_1 + 1); memcpy(nt->name, GLOBALS->module_tree_c_1, GLOBALS->module_len_tree_c_1); if(s) { nt->t_which = WAVE_T_WHICH_UNDEFINED_COMPNAME; t->child = nt; t = nt; } else { nt->child = t; /* parent */ nt->t_which = which; nt->next = GLOBALS->terminals_tchain_tree_c_1; GLOBALS->terminals_tchain_tree_c_1 = nt; } } } } else { /* blindly create first fac in the tree (only ever called once) */ while(s) { s=get_module_name(s); nt=(struct tree *)talloc_2(sizeof(struct tree)+GLOBALS->module_len_tree_c_1 + 1); memcpy(nt->name, GLOBALS->module_tree_c_1, GLOBALS->module_len_tree_c_1); if(!s) nt->t_which=which; else nt->t_which = WAVE_T_WHICH_UNDEFINED_COMPNAME; if((GLOBALS->treeroot)&&(t)) /* scan-build : && t should be unnecessary to avoid null pointer deref, but add defensively */ { t->child = nt; t = nt; } else { GLOBALS->treeroot = t = nt; } } } } /* ######################## */ /* ## compatibility code ## */ /* ######################## */ /* * tree widgets differ between GTK2 and GTK1 so we need two different * maketree() routines */ #if WAVE_USE_GTK2 /* * GTK2: build the tree. */ void maketree2(GtkCTreeNode *subtree, struct tree *t, int depth, GtkCTreeNode *graft) { GtkCTreeNode *sibling=NULL, *sibling_test; struct tree *t2; #ifndef WAVE_DISABLE_FAST_TREE if(depth > 1) return; #endif /* * TG reworked treesearch widget so there is no need to * process anything other than nodes. Leaves are handled * in the filtered list below the node expand/contract * tree */ t2=t; while(t2) { #ifndef WAVE_DISABLE_FAST_TREE if(depth < 1) #endif { t2->children_in_gui = 1; } if(t2->child) { if(!graft) { sibling_test=maketree_nodes(subtree, t2, sibling, MAKETREE_NODE); } else { sibling_test = graft; } if(sibling_test) { GLOBALS->any_tree_node = sibling_test; maketree2(sibling=sibling_test, t2->child, depth + 1, NULL); } } if(graft) break; t2=t2->next; } } void maketree(GtkCTreeNode *subtree, struct tree *t) { maketree2(subtree, t, 0, NULL); } #else /* * GTK1: build the tree. */ void maketree(GtkCTreeNode *subtree, struct tree *t) { GtkCTreeNode *sibling=NULL, *sibling_test; struct tree *t2; if(!GLOBALS->hier_grouping) { t2=t; while(t2) { sibling_test=maketree_nodes(subtree, t2, sibling, MAKETREE_FLATTEN); sibling=sibling_test?sibling_test:sibling; t2=t2->next; } } else { t2=t; while(t2) { if(!t2->child) { sibling_test=maketree_nodes(subtree, t2, sibling, MAKETREE_LEAF); if(sibling_test) { maketree(sibling=sibling_test, t2->child); } } t2=t2->next; } t2=t; while(t2) { if(t2->child) { sibling_test=maketree_nodes(subtree, t2, sibling, MAKETREE_NODE); if(sibling_test) { maketree(sibling=sibling_test, t2->child); } } t2=t2->next; } } } #endif gtkwave-3.3.86/src/pagebuttons.h0000664000175000017500000000073213166335473016101 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010 * * 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. */ #ifndef WAVE_PAGEBUTTONS_H #define WAVE_PAGEBUTTONS_H void service_left_page(GtkWidget *text, gpointer data); void service_right_page(GtkWidget *text, gpointer data); #endif gtkwave-3.3.86/src/vlist.c0000664000175000017500000004431113166335473014703 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2006-2014. * * 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 code implements generic vlists. (see the original paper from Phil Bagwell in 2002.) the original idea was to clean up histents by using vlist_alloc() to create a growable array that doesn't require next pointers per-element, however that doesn't seem necessary given the space savings that gzipped dormant vlist entries buys you. the vlists have been modified since the original version in two ways: (1) only half as many bytes are allocated as needed and when vlist_alloc() reaches the halfway point the struct is finally reallocated with the rest, (2) if vlist_spill is set to "on" in the rc file, vlist entries spill to a tempfile which can reduce memory usage dramatically. */ #include #include "globals.h" #include "vlist.h" #include #include void vlist_init_spillfile(void) { if(GLOBALS->use_fastload) { char *fname = malloc_2(strlen(GLOBALS->loaded_file_name) + 4 + 1); sprintf(fname, "%s.idx", GLOBALS->loaded_file_name); GLOBALS->vlist_handle = fopen(fname, "w+b"); free_2(fname); fputc('!', GLOBALS->vlist_handle); GLOBALS->vlist_bytes_written = 1; } else { #if defined _MSC_VER || defined __MINGW32__ GLOBALS->vlist_handle = tmpfile(); fputc('!', GLOBALS->vlist_handle); GLOBALS->vlist_bytes_written = 1; #else int fd_dummy; char *nam = tmpnam_2(NULL, &fd_dummy); GLOBALS->vlist_handle = fopen(nam, "w+b"); unlink(nam); if(fd_dummy >=0) { close(fd_dummy); free_2(nam); } fputc('!', GLOBALS->vlist_handle); GLOBALS->vlist_bytes_written = 1; #endif } } void vlist_kill_spillfile(void) { if(GLOBALS->vlist_handle) { fclose(GLOBALS->vlist_handle); GLOBALS->vlist_handle = NULL; } } /* machine-independent header i/o */ static int vlist_fread_hdr(struct vlist_t *vl, FILE *f) { unsigned long val; unsigned int vali; int ch, shamt, rc = 0; val = 0; shamt = 0; do { ch = fgetc(f); if(ch == EOF) goto bail; val |= ((unsigned long)(ch & 0x7f)) << shamt; shamt += 7; } while(!(ch & 0x80)); vl->next = (struct vlist_t *)val; vali = 0; shamt = 0; do { ch = fgetc(f); if(ch == EOF) goto bail; vali |= ((unsigned int)(ch & 0x7f)) << shamt; shamt += 7; } while(!(ch & 0x80)); vl->siz = (unsigned int)vali; vali = 0; shamt = 0; do { ch = fgetc(f); if(ch == EOF) goto bail; vali |= ((unsigned int)(ch & 0x7f)) << shamt; shamt += 7; } while(!(ch & 0x80)); vl->offs = (vali & 1) ? (unsigned int)(-(int)(vali >> 1)) : (vali >> 1); vali = 0; shamt = 0; do { ch = fgetc(f); if(ch == EOF) goto bail; vali |= ((unsigned int)(ch & 0x7f)) << shamt; shamt += 7; } while(!(ch & 0x80)); vl->elem_siz = (unsigned int)vali; rc = 1; bail: return(rc); } static int vlist_fwrite(struct vlist_t *vl, unsigned int rsiz, FILE *f) { unsigned char mem[ 4 * sizeof(long) * 2]; unsigned char *pnt = mem; unsigned long val, nxt; unsigned int vali, nxti; int offs_as_int; int rc; int len = 0; val = (unsigned long)(vl->next); while((nxt = val>>7)) { *(pnt++) = (val&0x7f); val = nxt; } *(pnt++) = (val&0x7f) | 0x80; vali = (vl->siz); while((nxti = vali>>7)) { *(pnt++) = (vali&0x7f); vali = nxti; } *(pnt++) = (vali&0x7f) | 0x80; offs_as_int = (int)(vl->offs); if(offs_as_int < 0) { offs_as_int = -offs_as_int; /* reduce number of one bits propagating left by making sign bit the lsb */ offs_as_int <<= 1; offs_as_int |= 1; } else { offs_as_int <<= 1; } vali = (unsigned int)(offs_as_int); while((nxti = vali>>7)) { *(pnt++) = (vali&0x7f); vali = nxti; } *(pnt++) = (vali&0x7f) | 0x80; vali = (unsigned int)(vl->elem_siz); while((nxti = vali>>7)) { *(pnt++) = (vali&0x7f); vali = nxti; } *(pnt++) = (vali&0x7f) | 0x80; rc = fwrite(mem, 1, (len = (pnt - mem)), f); if(rc) { unsigned int wrlen = (rsiz - sizeof(struct vlist_t)); len += wrlen; rc = fwrite(vl + 1, 1, wrlen, f); if(rc) { rc = len; } } return(rc); } /* create / destroy */ struct vlist_t *vlist_create(unsigned int elem_siz) { struct vlist_t *v; v = calloc_2(1, sizeof(struct vlist_t) + elem_siz); v->siz = 1; v->elem_siz = elem_siz; return(v); } void vlist_destroy(struct vlist_t *v) { struct vlist_t *vt; while(v) { vt = v->next; free_2(v); v = vt; } } /* realtime compression/decompression of bytewise vlists * this can obviously be extended if elem_siz > 1, but * the viewer doesn't need that feature */ struct vlist_t *vlist_compress_block(struct vlist_t *v, unsigned int *rsiz) { if(v->siz > 32) { struct vlist_t *vz; unsigned int *ipnt; char *dmem = malloc_2(compressBound(v->siz)); unsigned long destlen = v->siz; int rc; rc = compress2((unsigned char *)dmem, &destlen, (unsigned char *)(v+1), v->siz, GLOBALS->vlist_compression_depth); if( (rc == Z_OK) && ((destlen + sizeof(int)) < v->siz) ) { /* printf("siz: %d, dest: %d rc: %d\n", v->siz, (int)destlen, rc); */ vz = malloc_2(*rsiz = sizeof(struct vlist_t) + sizeof(int) + destlen); memcpy(vz, v, sizeof(struct vlist_t)); ipnt = (unsigned int *)(vz + 1); ipnt[0] = destlen; memcpy(&ipnt[1], dmem, destlen); vz->offs = (unsigned int)(-(int)v->offs); /* neg value signified compression */ free_2(v); v = vz; } free_2(dmem); } return(v); } void vlist_uncompress(struct vlist_t **v) { struct vlist_t *vl = *v; struct vlist_t *vprev = NULL; if(GLOBALS->vlist_handle) { while(vl) { struct vlist_t vhdr; struct vlist_t *vrebuild; long vl_offs = (long)vl; int rc; off_t seekpos = (off_t) vl_offs; /* possible overflow conflicts were already handled in the writer */ fseeko(GLOBALS->vlist_handle, seekpos, SEEK_SET); if(GLOBALS->use_fastload) { rc = vlist_fread_hdr(&vhdr, GLOBALS->vlist_handle); } else { rc = fread(&vhdr, sizeof(struct vlist_t), 1, GLOBALS->vlist_handle); } if(!rc) { printf("Error in reading from VList spill file!\n"); exit(255); } /* args are reversed to fread (compared to above) to handle short read at end of file! */ /* (this can happen because of how we write out only the used size of a block) */ vrebuild = malloc_2(sizeof(struct vlist_t) + vhdr.siz); memcpy(vrebuild, &vhdr, sizeof(struct vlist_t)); rc = fread(vrebuild+1, 1, vrebuild->siz, GLOBALS->vlist_handle); if(!rc) { printf("Error in reading from VList spill file!\n"); exit(255); } if(vprev) { vprev->next = vrebuild; } else { *v = vrebuild; } vprev = vrebuild; vl = vhdr.next; } vl = *v; vprev = NULL; } while(vl) { if((int)vl->offs < 0) { struct vlist_t *vz = malloc_2(sizeof(struct vlist_t) + vl->siz); unsigned int *ipnt; unsigned long sourcelen, destlen; int rc; memcpy(vz, vl, sizeof(struct vlist_t)); vz->offs = (unsigned int)(-(int)vl->offs); ipnt = (unsigned int *)(vl + 1); sourcelen = (unsigned long)ipnt[0]; destlen = (unsigned long)vl->siz; rc = uncompress((unsigned char *)(vz+1), &destlen, (unsigned char *)&ipnt[1], sourcelen); if(rc != Z_OK) { fprintf(stderr, "Error in vlist uncompress(), rc=%d/destlen=%d exiting!\n", rc, (int)destlen); exit(255); } free_2(vl); vl = vz; if(vprev) { vprev->next = vz; } else { *v = vz; } } vprev = vl; vl = vl->next; } } /* get pointer to one unit of space */ void *vlist_alloc(struct vlist_t **v, int compressable) { struct vlist_t *vl = *v; char *px; struct vlist_t *v2; if(vl->offs == vl->siz) { unsigned int siz, rsiz; /* 2 times versions are the growable, indexable vlists */ siz = 2 * vl->siz; rsiz = sizeof(struct vlist_t) + (vl->siz * vl->elem_siz); if((compressable)&&(vl->elem_siz == 1)) { if(GLOBALS->vlist_compression_depth>=0) { vl = vlist_compress_block(vl, &rsiz); } } if(compressable && GLOBALS->vlist_handle) { size_t rc; long write_cnt; fseeko(GLOBALS->vlist_handle, GLOBALS->vlist_bytes_written, SEEK_SET); if(GLOBALS->use_fastload) { rc = vlist_fwrite(vl, rsiz, GLOBALS->vlist_handle); } else { rc = fwrite(vl, rsiz, 1, GLOBALS->vlist_handle); } if(!rc) { fprintf(stderr, "Error in writing to VList spill file!\n"); perror("Why"); exit(255); } write_cnt = GLOBALS->vlist_bytes_written; if(sizeof(long) != sizeof(off_t)) /* optimizes in or out at compile time */ { if(write_cnt != GLOBALS->vlist_bytes_written) { fprintf(stderr, "VList spill file pointer-file overflow!\n"); exit(255); } } v2 = calloc_2(1, sizeof(struct vlist_t) + (vl->siz * vl->elem_siz)); v2->siz = siz; v2->elem_siz = vl->elem_siz; v2->next = (struct vlist_t *)write_cnt; free_2(vl); *v = v2; vl = *v; if(GLOBALS->use_fastload) { GLOBALS->vlist_bytes_written += rc; } else { GLOBALS->vlist_bytes_written += rsiz; } } else { v2 = calloc_2(1, sizeof(struct vlist_t) + (vl->siz * vl->elem_siz)); v2->siz = siz; v2->elem_siz = vl->elem_siz; v2->next = vl; *v = v2; vl = *v; } } else if(vl->offs*2 == vl->siz) { v2 = calloc_2(1, sizeof(struct vlist_t) + (vl->siz * vl->elem_siz)); memcpy(v2, vl, sizeof(struct vlist_t) + (vl->siz/2 * vl->elem_siz)); free_2(vl); *v = v2; vl = *v; } px =(((char *)(vl)) + sizeof(struct vlist_t) + ((vl->offs++) * vl->elem_siz)); return((void *)px); } /* vlist_size() and vlist_locate() do not work properly on compressed lists...you'll have to call vlist_uncompress() first! */ unsigned int vlist_size(struct vlist_t *v) { return(v->siz - 1 + v->offs); } void *vlist_locate(struct vlist_t *v, unsigned int idx) { unsigned int here = v->siz - 1; unsigned int siz = here + v->offs; /* siz is the same as vlist_size() */ if((!siz)||(idx>=siz)) return(NULL); while (idx < here) { v = v->next; here = v->siz - 1; } idx -= here; return((void *)(((char *)(v)) + sizeof(struct vlist_t) + (idx * v->elem_siz))); } /* calling this if you don't plan on adding any more elements will free up unused space as well as compress final blocks (if enabled) */ void vlist_freeze(struct vlist_t **v) { struct vlist_t *vl = *v; unsigned int siz = vl->offs; unsigned int rsiz = sizeof(struct vlist_t) + (siz * vl->elem_siz); if((vl->elem_siz == 1)&&(siz)) { struct vlist_t *w, *v2; if(vl->offs*2 <= vl->siz) /* Electric Fence, change < to <= */ { v2 = calloc_2(1, sizeof(struct vlist_t) + (vl->siz /* * vl->elem_siz */)); /* scan-build */ memcpy(v2, vl, sizeof(struct vlist_t) + (vl->siz/2 /* * vl->elem_siz */)); /* scan-build */ free_2(vl); *v = v2; vl = *v; } w = vlist_compress_block(vl, &rsiz); *v = w; } else if((siz != vl->siz)&&(!GLOBALS->vlist_handle)) { struct vlist_t *w = malloc_2(rsiz); memcpy(w, vl, rsiz); free_2(vl); *v = w; } if(GLOBALS->vlist_handle) { size_t rc; long write_cnt; vl = *v; fseeko(GLOBALS->vlist_handle, GLOBALS->vlist_bytes_written, SEEK_SET); if(GLOBALS->use_fastload) { rc = vlist_fwrite(vl, rsiz, GLOBALS->vlist_handle); } else { rc = fwrite(vl, rsiz, 1, GLOBALS->vlist_handle); } if(!rc) { fprintf(stderr, "Error in writing to VList spill file!\n"); perror("Why"); exit(255); } write_cnt = GLOBALS->vlist_bytes_written; if(sizeof(long) != sizeof(off_t)) /* optimizes in or out at compile time */ { if(write_cnt != GLOBALS->vlist_bytes_written) { fprintf(stderr, "VList spill file pointer-file overflow!\n"); exit(255); } } *v = (struct vlist_t *)write_cnt; if(GLOBALS->use_fastload) { GLOBALS->vlist_bytes_written += rc; } else { GLOBALS->vlist_bytes_written += rsiz; } free_2(vl); } } /* this code implements an LZ-based filter that can sit on top of the vlists. it uses a generic escape value of 0xff as that is one that statistically occurs infrequently in value change data fed into vlists. */ void vlist_packer_emit_out(struct vlist_packer_t *p, unsigned char byt) { char *pnt; #ifdef WAVE_VLIST_PACKER_STATS p->packed_bytes++; #endif pnt = vlist_alloc(&p->v, 1); *pnt = byt; } void vlist_packer_emit_uv32(struct vlist_packer_t *p, unsigned int v) { unsigned int nxt; while((nxt = v>>7)) { vlist_packer_emit_out(p, v&0x7f); v = nxt; } vlist_packer_emit_out(p, (v&0x7f) | 0x80); } void vlist_packer_emit_uv32rvs(struct vlist_packer_t *p, unsigned int v) { unsigned int nxt; unsigned char buf[2 * sizeof(int)]; unsigned int idx = 0; int i; while((nxt = v>>7)) { buf[idx++] = v&0x7f; v = nxt; } buf[idx] = (v&0x7f) | 0x80; for(i = idx; i >= 0; i--) { vlist_packer_emit_out(p, buf[i]); } } void vlist_packer_alloc(struct vlist_packer_t *p, unsigned char byt) { int i, j, k, l; p->unpacked_bytes++; if(!p->repcnt) { top: for(i=0;ibuf[(p->bufpnt-i) & WAVE_ZIVMASK] == byt) { p->repdist = i; p->repcnt = 1; p->repdist2 = p->repdist3 = p->repdist4 = 0; for(j=i+WAVE_ZIVSKIP;jbuf[(p->bufpnt-j) & WAVE_ZIVMASK] == byt) { p->repdist2 = j; p->repcnt2 = 1; for(k=j+WAVE_ZIVSKIP;kbuf[(p->bufpnt-k) & WAVE_ZIVMASK] == byt) { p->repdist3 = k; p->repcnt3 = 1; for(l=k+WAVE_ZIVSKIP;lbuf[(p->bufpnt-l) & WAVE_ZIVMASK] == byt) { p->repdist4 = l; p->repcnt4 = 1; break; } } break; } } break; } } p->bufpnt++; p->bufpnt &= WAVE_ZIVMASK; p->buf[p->bufpnt] = byt; return; } } p->bufpnt++; p->bufpnt &= WAVE_ZIVMASK; p->buf[p->bufpnt] = byt; vlist_packer_emit_out(p, byt); if(byt==WAVE_ZIVFLAG) { vlist_packer_emit_uv32(p, 0); } } else { attempt2: if(p->buf[(p->bufpnt - p->repdist) & WAVE_ZIVMASK] == byt) { p->repcnt++; if(p->repcnt2) { p->repcnt2 = ((p->buf[(p->bufpnt - p->repdist2) & WAVE_ZIVMASK] == byt)) ? p->repcnt2+1 : 0; } if(p->repcnt3) { p->repcnt3 = ((p->buf[(p->bufpnt - p->repdist3) & WAVE_ZIVMASK] == byt)) ? p->repcnt3+1 : 0; } if(p->repcnt4) { p->repcnt4 = ((p->buf[(p->bufpnt - p->repdist4) & WAVE_ZIVMASK] == byt)) ? p->repcnt4+1 : 0; } p->bufpnt++; p->bufpnt &= WAVE_ZIVMASK; p->buf[p->bufpnt] = byt; } else { if(p->repcnt2) { p->repcnt = p->repcnt2; p->repdist = p->repdist2; p->repcnt2 = p->repcnt3; p->repdist2 = p->repdist3; p->repcnt3 = p->repcnt4; p->repdist3 = p->repdist4; p->repcnt4 = 0; p->repdist4 = 0; goto attempt2; } if(p->repcnt3) { p->repcnt = p->repcnt3; p->repdist = p->repdist3; p->repcnt2 = p->repcnt4; p->repdist2 = p->repdist4; p->repcnt3 = 0; p->repdist3 = 0; p->repcnt4 = 0; p->repdist4 = 0; goto attempt2; } if(p->repcnt4) { p->repcnt = p->repcnt4; p->repdist = p->repdist4; p->repcnt4 = 0; p->repdist4 = 0; goto attempt2; } if(p->repcnt > 2) { vlist_packer_emit_out(p, WAVE_ZIVFLAG); vlist_packer_emit_uv32(p, p->repcnt); p->repcnt = 0; vlist_packer_emit_uv32(p, p->repdist); } else { if(p->repcnt == 2) { vlist_packer_emit_out(p, p->buf[(p->bufpnt-1) & WAVE_ZIVMASK]); if(p->buf[(p->bufpnt-1) & WAVE_ZIVMASK]==WAVE_ZIVFLAG) { vlist_packer_emit_uv32(p, 0); } } vlist_packer_emit_out(p, p->buf[p->bufpnt & WAVE_ZIVMASK]); p->repcnt = 0; if(p->buf[p->bufpnt & WAVE_ZIVMASK]==WAVE_ZIVFLAG) { vlist_packer_emit_uv32(p, 0); } } goto top; } } } void vlist_packer_finalize(struct vlist_packer_t *p) { #ifdef WAVE_VLIST_PACKER_STATS static guint64 pp = 0, upp = 0; #endif if(p->repcnt) { if(p->repcnt > 2) { vlist_packer_emit_out(p, WAVE_ZIVFLAG); vlist_packer_emit_uv32(p, p->repcnt); p->repcnt = 0; vlist_packer_emit_uv32(p, p->repdist); } else { if(p->repcnt == 2) { vlist_packer_emit_out(p, p->buf[(p->bufpnt-1) & WAVE_ZIVMASK]); if(p->buf[(p->bufpnt-1) & WAVE_ZIVMASK]==WAVE_ZIVFLAG) { vlist_packer_emit_uv32(p, 0); } } vlist_packer_emit_out(p, p->buf[p->bufpnt & WAVE_ZIVMASK]); p->repcnt = 0; if(p->buf[p->bufpnt & WAVE_ZIVMASK]==WAVE_ZIVFLAG) { vlist_packer_emit_uv32(p, 0); } } } vlist_packer_emit_uv32rvs(p, p->unpacked_bytes); /* for malloc later during decompress */ #ifdef WAVE_VLIST_PACKER_STATS pp += p->packed_bytes; upp += p->unpacked_bytes; printf("pack:%d orig:%d (%lld %lld %f)\n", p->packed_bytes, p->unpacked_bytes, pp, upp, (float)pp / (float)upp); #endif } struct vlist_packer_t *vlist_packer_create(void) { struct vlist_packer_t *vp = calloc_2(1, sizeof(struct vlist_packer_t)); vp->v = vlist_create(sizeof(char)); return(vp); } unsigned char *vlist_packer_decompress(struct vlist_t *v, unsigned int *declen) { unsigned int list_size = vlist_size(v); unsigned int top_of_packed_size = list_size-1; unsigned char *chp; unsigned int dec_size = 0; unsigned int dec_size_cmp; unsigned int shamt = 0; unsigned char *mem, *dpnt; unsigned int i, j, repcnt, dist; for(;;) { chp = vlist_locate(v, top_of_packed_size); dec_size |= ((unsigned int)(*chp & 0x7f)) << shamt; if(*chp & 0x80) { break; } shamt+=7; top_of_packed_size--; } mem = calloc_2(1, WAVE_ZIVWRAP + dec_size); dpnt = mem + WAVE_ZIVWRAP; for(i=0;i #include #include #include #include "debug.h" #include "symbol.h" #include "vcd.h" #include "tree_component.h" #define FST_TREE_SEARCH_NEXT_LIMIT (40) /* Kind of the tree. */ enum tree_kind { /* Unknown. */ TREE_UNKNOWN, /* An internal signal. */ TREE_SIGNAL, /* An in/out/inout signal. */ TREE_IN, TREE_OUT, TREE_INOUT, /* An element of a vector. */ TREE_VECTOREL, /* An element of a record. */ TREE_RECORDEL, /* A Subinstance. */ TREE_INSTANCE, /* A package (somewhat VHDL specific ?). */ TREE_PACKAGE, /* A base (source file). Not yet implemented. */ TREE_BASE, /* Verilog/SV scope types */ TREE_VCD_ST_MODULE, TREE_VCD_ST_TASK, TREE_VCD_ST_FUNCTION, TREE_VCD_ST_BEGIN, TREE_VCD_ST_FORK, TREE_VCD_ST_GENERATE, TREE_VCD_ST_STRUCT, TREE_VCD_ST_UNION, TREE_VCD_ST_CLASS, TREE_VCD_ST_INTERFACE, TREE_VCD_ST_PACKAGE, TREE_VCD_ST_PROGRAM, /* GHW VHDL scope types */ TREE_VHDL_ST_DESIGN, TREE_VHDL_ST_BLOCK, TREE_VHDL_ST_GENIF, TREE_VHDL_ST_GENFOR, TREE_VHDL_ST_INSTANCE, TREE_VHDL_ST_PACKAGE, /* GHW VHDL signal types (still as part of scope in GHW) */ TREE_VHDL_ST_SIGNAL, TREE_VHDL_ST_PORTIN, TREE_VHDL_ST_PORTOUT, TREE_VHDL_ST_PORTINOUT, TREE_VHDL_ST_BUFFER, TREE_VHDL_ST_LINKAGE, /* FSDB VHDL scope types: FSDB also reuses/defines GHW's TREE_VHDL_ST_BLOCK, TREE_VHDL_ST_GENFOR, TREE_VHDL_ST_GENIF */ /* FST reuses TREE_VHDL_ST_PACKAGE */ TREE_VHDL_ST_ARCHITECTURE, TREE_VHDL_ST_FUNCTION, TREE_VHDL_ST_PROCEDURE, TREE_VHDL_ST_RECORD, TREE_VHDL_ST_PROCESS, TREE_VHDL_ST_GENERATE }; #define WAVE_T_WHICH_UNDEFINED_COMPNAME (-1) #define WAVE_T_WHICH_COMPNAME_START (-2) #ifdef WAVE_USE_STRUCT_PACKING #pragma pack(push) #pragma pack(1) #endif struct stem_struct_t { uint32_t stem_idx; /* in stem_path_string_table */ uint32_t stem_line_number; }; struct tree { struct tree *next; struct tree *child; int t_which; /* 'i' for facs[i] table, value of < 0 means not a full signame */ uint32_t t_stem; /* source stem (if >0) for Open Hierarchy Source Def, see stem_struct_t */ uint32_t t_istem; /* source stem (if >0) for Open Hierarchy Source Inst, see stem_struct_t */ unsigned kind : 7; /* Kind of the leaf: ghwlib reads this as val & 0x7f so only 7 bits needed */ unsigned children_in_gui : 1; /* indicates that the child nodes are in the gtk2 tree, but gets borrowed during tree creation for fast judy sort */ char name[]; /* C99 */ }; #ifdef WAVE_USE_STRUCT_PACKING #pragma pack(pop) #endif /* names at the end of the main hierarchy 010104ajb */ struct treechain { struct tree *tree; /* top of list of selected item in hierarchy */ struct tree *label; /* actual selected item in hierarchy */ struct treechain *next; }; struct autocoalesce_free_list { struct autocoalesce_free_list *next; /* list of coalesced names generated by treesearch gadget..only user of this struct */ char *name; /* free up next time filtering is performed */ }; void init_tree(void); void build_tree_from_name(const char *s, int which); int treegraft(struct tree **t); void treedebug(struct tree *t, char *s); void maketree(GtkCTreeNode *subtree, struct tree *t); #if WAVE_USE_GTK2 void maketree2(GtkCTreeNode *subtree, struct tree *t, int depth, GtkCTreeNode *graft); #endif char *leastsig_hiername(char *nam); void allocate_and_decorate_module_tree_node(unsigned char ttype, const char *scopename, const char *compname, uint32_t scopename_len, uint32_t compname_len, uint32_t t_stem, uint32_t t_istem); int decorated_module_cleanup(void); void treesort(struct tree *t, struct tree *p); void order_facs_from_treesort(struct tree *t, void *v); void treenamefix(struct tree *t); #ifdef WAVE_USE_STRUCT_PACKING #define WAVE_TALLOC_POOL_SIZE (64 * 1024) #define WAVE_TALLOC_ALTREQ_SIZE (4 * 1024) struct tree *talloc_2(size_t siz); #else #define talloc_2(x) calloc_2(1,(x)) #endif #endif gtkwave-3.3.86/src/rc.c0000664000175000017500000006725713166335473014164 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2017. * * 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. */ /* AIX may need this for alloca to work */ #if defined _AIX #pragma alloca #endif #include "globals.h" #include #include #include #include #include #include #include #include #include "analyzer.h" #include "currenttime.h" #include "symbol.h" #include "vcd.h" #include "wavealloca.h" #include "fgetdynamic.h" #include "debug.h" #include "main.h" #include "menu.h" #include "color.h" #include "vlist.h" #include "rc.h" #ifdef MAC_INTEGRATION #include #endif #ifndef _MSC_VER #ifndef __MINGW32__ #include #include static char *rcname=".gtkwaverc"; /* name of environment file--POSIX */ #else static char *rcname="gtkwave.ini"; /* name of environment file--WIN32 */ #endif #else static char *rcname="gtkwave.ini"; /* name of environment file--WIN32 */ #define strcasecmp _stricmp #endif /* * functions that set the individual rc variables.. */ int f_accel(char *str) { DEBUG(printf("f_accel(\"%s\")\n",str)); if(strlen(str)) { set_wave_menu_accelerator(str); } return(0); } int f_alt_hier_delimeter(char *str) { DEBUG(printf("f_alt_hier_delimeter(\"%s\")\n",str)); if(strlen(str)) { GLOBALS->alt_hier_delimeter=str[0]; } return(0); } int f_analog_redraw_skip_count(char *str) { DEBUG(printf("f_analog_redraw_skip_count(\"%s\")\n",str)); GLOBALS->analog_redraw_skip_count=atoi_64(str); if(GLOBALS->analog_redraw_skip_count < 0) { GLOBALS->analog_redraw_skip_count = 0; } return(0); } int f_append_vcd_hier(char *str) { DEBUG(printf("f_append_vcd_hier(\"%s\")\n",str)); append_vcd_slisthier(str); return(0); } int f_atomic_vectors(char *str) { DEBUG(printf("f_atomic_vectors(\"%s\")\n",str)); GLOBALS->atomic_vectors=atoi_64(str)?1:0; return(0); } int f_autoname_bundles(char *str) { DEBUG(printf("f_autoname_bundles(\"%s\")\n",str)); GLOBALS->autoname_bundles=atoi_64(str)?1:0; return(0); } int f_autocoalesce(char *str) { DEBUG(printf("f_autocoalesce(\"%s\")\n",str)); GLOBALS->autocoalesce=atoi_64(str)?1:0; return(0); } int f_autocoalesce_reversal(char *str) { DEBUG(printf("f_autocoalesce_reversal(\"%s\")\n",str)); GLOBALS->autocoalesce_reversal=atoi_64(str)?1:0; return(0); } int f_constant_marker_update(char *str) { DEBUG(printf("f_constant_marker_update(\"%s\")\n",str)); GLOBALS->constant_marker_update=atoi_64(str)?1:0; return(0); } int f_context_tabposition(char *str) { DEBUG(printf("f_convert_to_reals(\"%s\")\n",str)); GLOBALS->context_tabposition=atoi_64(str)?1:0; return(0); } int f_convert_to_reals(char *str) { DEBUG(printf("f_convert_to_reals(\"%s\")\n",str)); GLOBALS->convert_to_reals=atoi_64(str)?1:0; return(0); } int f_cursor_snap(char *str) { int val; DEBUG(printf("f_cursor_snap(\"%s\")\n",str)); val=atoi_64(str); GLOBALS->cursor_snap=(val<=0)?0:val; return(0); } int f_disable_ae2_alias(char *str) { DEBUG(printf("f_disable_ae2_alias(\"%s\")\n",str)); GLOBALS->disable_ae2_alias=atoi_64(str)?1:0; return(0); } int f_disable_auto_comphier(char *str) { DEBUG(printf("f_disable_auto_comphier(\"%s\")\n",str)); GLOBALS->disable_auto_comphier=atoi_64(str)?1:0; return(0); } int f_disable_empty_gui(char *str) { DEBUG(printf("f_disable_empty_gui(\"%s\")\n",str)); GLOBALS->disable_empty_gui=atoi_64(str)?1:0; return(0); } int f_disable_mouseover(char *str) { DEBUG(printf("f_disable_mouseover(\"%s\")\n",str)); GLOBALS->disable_mouseover=atoi_64(str)?1:0; return(0); } int f_clipboard_mouseover(char *str) { DEBUG(printf("f_clipboard_mouseover(\"%s\")\n",str)); GLOBALS->clipboard_mouseover=atoi_64(str)?1:0; return(0); } int f_disable_tooltips(char *str) { DEBUG(printf("f_disable_tooltips(\"%s\")\n",str)); GLOBALS->disable_tooltips=atoi_64(str)?1:0; return(0); } int f_do_initial_zoom_fit(char *str) { DEBUG(printf("f_do_initial_zoom_fit(\"%s\")\n",str)); GLOBALS->do_initial_zoom_fit=atoi_64(str)?1:0; return(0); } int f_dragzoom_threshold(char *str) { DEBUG(printf("f_dragzoom_threshold(\"%s\")\n",str)); GLOBALS->dragzoom_threshold=atoi_64(str); return(0); } int f_dynamic_resizing(char *str) { DEBUG(printf("f_dynamic_resizing(\"%s\")\n",str)); GLOBALS->do_resize_signals=atoi_64(str)?1:0; return(0); } int f_editor(char *str) { char *path, *pathend; DEBUG(printf("f_editor(\"%s\")\n",str)); path = strchr(str, '\"'); if(path) { path++; if(*path) { pathend = strchr(path, '\"'); if(pathend) { *pathend = 0; if(GLOBALS->editor_name) free_2(GLOBALS->editor_name); GLOBALS->editor_name=(char *)strdup_2(path); } } } return(0); } int f_enable_fast_exit(char *str) { DEBUG(printf("f_enable_fast_exit(\"%s\")\n",str)); GLOBALS->enable_fast_exit=atoi_64(str)?1:0; return(0); } int f_enable_ghost_marker(char *str) { DEBUG(printf("f_enable_ghost_marker(\"%s\")\n",str)); GLOBALS->enable_ghost_marker=atoi_64(str)?1:0; return(0); } int f_enable_horiz_grid(char *str) { DEBUG(printf("f_enable_horiz_grid(\"%s\")\n",str)); GLOBALS->enable_horiz_grid=atoi_64(str)?1:0; return(0); } int f_enable_vcd_autosave(char *str) { DEBUG(printf("f_enable_vcd_autosave(\"%s\")\n",str)); GLOBALS->make_vcd_save_file=atoi_64(str)?1:0; return(0); } int f_enable_vert_grid(char *str) { DEBUG(printf("f_enable_vert_grid(\"%s\")\n",str)); GLOBALS->enable_vert_grid=atoi_64(str)?1:0; return(0); } int f_fill_waveform(char *str) { DEBUG(printf("f_fill_waveform(\"%s\")\n",str)); GLOBALS->fill_waveform=atoi_64(str)?1:0; return(0); } int f_fontname_logfile(char *str) { DEBUG(printf("f_fontname_logfile(\"%s\")\n",str)); if(GLOBALS->fontname_logfile) free_2(GLOBALS->fontname_logfile); GLOBALS->fontname_logfile=(char *)malloc_2(strlen(str)+1); strcpy(GLOBALS->fontname_logfile,str); return(0); } int f_fontname_signals(char *str) { DEBUG(printf("f_fontname_signals(\"%s\")\n",str)); if(GLOBALS->fontname_signals) free_2(GLOBALS->fontname_signals); GLOBALS->fontname_signals=(char *)malloc_2(strlen(str)+1); strcpy(GLOBALS->fontname_signals,str); return(0); } int f_fontname_waves(char *str) { DEBUG(printf("f_fontname_signals(\"%s\")\n",str)); if(GLOBALS->fontname_waves) free_2(GLOBALS->fontname_waves); GLOBALS->fontname_waves=(char *)malloc_2(strlen(str)+1); strcpy(GLOBALS->fontname_waves,str); return(0); } int f_force_toolbars(char *str) { DEBUG(printf("f_force_toolbars(\"%s\")\n",str)); GLOBALS->force_toolbars=atoi_64(str)?1:0; return(0); } int f_hide_sst(char *str) { DEBUG(printf("f_hide_sst(\"%s\")\n",str)); GLOBALS->hide_sst=atoi_64(str)?1:0; return(0); } int f_hier_ignore_escapes(char *str) { DEBUG(printf("f_hier_ignore_escapes(\"%s\")\n",str)); GLOBALS->hier_ignore_escapes=atoi_64(str)?1:0; return(0); } int f_keep_xz_colors(char *str) { DEBUG(printf("f_keep_xz_colors(\"%s\")\n",str)); GLOBALS->keep_xz_colors=atoi_64(str)?1:0; return(0); } int f_sst_dynamic_filter(char *str) { DEBUG(printf("f_sst_dynamic_filter(\"%s\")\n",str)); GLOBALS->do_dynamic_treefilter=atoi_64(str)?1:0; return(0); } int f_sst_expanded(char *str) { DEBUG(printf("f_sst_expanded(\"%s\")\n",str)); GLOBALS->sst_expanded=atoi_64(str)?1:0; return(0); } int f_hier_delimeter(char *str) { DEBUG(printf("f_hier_delimeter(\"%s\")\n",str)); if(strlen(str)) { GLOBALS->hier_delimeter=str[0]; GLOBALS->hier_was_explicitly_set=1; } return(0); } int f_hier_grouping(char *str) { DEBUG(printf("f_hier_grouping(\"%s\")\n",str)); GLOBALS->hier_grouping=atoi_64(str)?1:0; return(0); } int f_hier_max_level(char *str) { DEBUG(printf("f_hier_max_level(\"%s\")\n",str)); GLOBALS->hier_max_level_shadow=GLOBALS->hier_max_level=atoi_64(str); return(0); } int f_hpane_pack(char *str) { DEBUG(printf("f_hpane_pack(\"%s\")\n",str)); GLOBALS->paned_pack_semantics=atoi_64(str)?1:0; return(0); } int f_highlight_wavewindow(char *str) { DEBUG(printf("f_highlight_wavewindow(\"%s\")\n",str)); GLOBALS->highlight_wavewindow=atoi_64(str)?1:0; return(0); } int f_ignore_savefile_pane_pos(char *str) { DEBUG(printf("f_ignore_savefile_pane_pos(\"%s\")\n",str)); GLOBALS->ignore_savefile_pane_pos=atoi_64(str)?1:0; return(0); } int f_ignore_savefile_pos(char *str) { DEBUG(printf("f_ignore_savefile_pos(\"%s\")\n",str)); GLOBALS->ignore_savefile_pos=atoi_64(str)?1:0; return(0); } int f_ignore_savefile_size(char *str) { DEBUG(printf("f_ignore_savefile_size(\"%s\")\n",str)); GLOBALS->ignore_savefile_size=atoi_64(str)?1:0; return(0); } int f_initial_signal_window_width(char *str) { int val; DEBUG(printf("f_initial_signal_window_width(\"%s\")\n",str)); val=atoi_64(str); GLOBALS->initial_signal_window_width=(val<0)?0:val; return(0); } int f_initial_window_x(char *str) { int val; DEBUG(printf("f_initial_window_x(\"%s\")\n",str)); val=atoi_64(str); GLOBALS->initial_window_x=(val<=0)?-1:val; return(0); } int f_initial_window_xpos(char *str) { int val; DEBUG(printf("f_initial_window_xpos(\"%s\")\n",str)); val=atoi_64(str); GLOBALS->initial_window_xpos=(val<=0)?-1:val; return(0); } int f_initial_window_y(char *str) { int val; DEBUG(printf("f_initial_window_y(\"%s\")\n",str)); val=atoi_64(str); GLOBALS->initial_window_y=(val<=0)?-1:val; return(0); } int f_initial_window_ypos(char *str) { int val; DEBUG(printf("f_initial_window_ypos(\"%s\")\n",str)); val=atoi_64(str); GLOBALS->initial_window_ypos=(val<=0)?-1:val; return(0); } int f_left_justify_sigs(char *str) { DEBUG(printf("f_left_justify_sigs(\"%s\")\n",str)); GLOBALS->left_justify_sigs=atoi_64(str)?1:0; return(0); } int f_lxt_clock_compress_to_z(char *str) { DEBUG(printf("f_lxt_clock_compress_to_z(\"%s\")\n",str)); GLOBALS->lxt_clock_compress_to_z=atoi_64(str)?1:0; return(0); } int f_max_fsdb_trees(char *str) { int val; DEBUG(printf("f_max_fsdb_trees(\"%s\")\n",str)); val=atoi_64(str); GLOBALS->extload_max_tree=(val<0)?0:val; return(0); } int f_page_divisor(char *str) { DEBUG(printf("f_page_divisor(\"%s\")\n",str)); sscanf(str,"%lg",&GLOBALS->page_divisor); if(GLOBALS->page_divisor<0.01) { GLOBALS->page_divisor=0.01; } else if(GLOBALS->page_divisor>100.0) { GLOBALS->page_divisor=100.0; } if(GLOBALS->page_divisor>1.0) GLOBALS->page_divisor=1.0/GLOBALS->page_divisor; return(0); } int f_ps_maxveclen(char *str) { DEBUG(printf("f_ps_maxveclen(\"%s\")\n",str)); GLOBALS->ps_maxveclen=atoi_64(str); if(GLOBALS->ps_maxveclen<4) { GLOBALS->ps_maxveclen=4; } else if(GLOBALS->ps_maxveclen>66) { GLOBALS->ps_maxveclen=66; } return(0); } int f_scale_to_time_dimension(char *str) { int which = tolower((int)(*str)); DEBUG(printf("f_scale_to_time_dimension(\"%s\")\n",str)); if(strchr(WAVE_SI_UNITS, which) || (which == 's')) { GLOBALS->scale_to_time_dimension = which; } else { GLOBALS->scale_to_time_dimension = 0; /* also covers '*' case as not found above */ } return(0); } int f_show_base_symbols(char *str) { DEBUG(printf("f_show_base_symbols(\"%s\")\n",str)); GLOBALS->show_base=atoi_64(str)?1:0; return(0); } int f_show_grid(char *str) { DEBUG(printf("f_show_grid(\"%s\")\n",str)); GLOBALS->display_grid=atoi_64(str)?1:0; return(0); } int f_splash_disable(char *str) { DEBUG(printf("f_splash_disable(\"%s\")\n",str)); GLOBALS->splash_disable=atoi_64(str)?1:0; return(0); } int f_strace_repeat_count(char *str) { DEBUG(printf("f_strace_repeat_count(\"%s\")\n",str)); GLOBALS->strace_repeat_count=atoi_64(str); return(0); } int f_use_big_fonts(char *str) { DEBUG(printf("f_use_big_fonts(\"%s\")\n",str)); GLOBALS->use_big_fonts=atoi_64(str)?1:0; return(0); } int f_use_frequency_display(char *str) { DEBUG(printf("f_use_frequency_display(\"%s\")\n",str)); GLOBALS->use_frequency_delta=atoi_64(str)?1:0; return(0); } int f_use_full_precision(char *str) { DEBUG(printf("f_use_full_precision(\"%s\")\n",str)); GLOBALS->use_full_precision=atoi_64(str)?1:0; return(0); } int f_use_maxtime_display(char *str) { DEBUG(printf("f_use_maxtime_display(\"%s\")\n",str)); GLOBALS->use_maxtime_display=atoi_64(str)?1:0; return(0); } int f_use_nonprop_fonts(char *str) { DEBUG(printf("f_use_nonprop_fonts(\"%s\")\n",str)); GLOBALS->use_nonprop_fonts=atoi_64(str)?1:0; return(0); } int f_use_pango_fonts(char *str) { DEBUG(printf("f_use_pango_fonts(\"%s\")\n",str)); GLOBALS->use_pango_fonts=atoi_64(str)?1:0; return(0); } int f_use_roundcaps(char *str) { DEBUG(printf("f_use_roundcaps(\"%s\")\n",str)); GLOBALS->use_roundcaps=atoi_64(str)?1:0; return(0); } int f_ruler_origin(char *str) { DEBUG(printf("f_ruler_origin(\"%s\")\n",str)); GLOBALS->ruler_origin=atoi_64(str); return(0); } int f_ruler_step(char *str) { DEBUG(printf("f_ruler_step(\"%s\")\n",str)); GLOBALS->ruler_step=atoi_64(str); return(0); } int f_use_scrollbar_only(char *str) { DEBUG(printf("f_use_scrollbar_only(\"%s\")\n",str)); GLOBALS->use_scrollbar_only=atoi_64(str)?1:0; return(0); } int f_use_scrollwheel_as_y(char *str) { DEBUG(printf("f_use_scrollwheel_as_y(\"%s\")\n",str)); GLOBALS->use_scrollwheel_as_y=atoi_64(str)?1:0; return(0); } int f_use_standard_clicking(char *str) { DEBUG(printf("f_use_standard_clicking(\"%s\")\n",str)); GLOBALS->use_standard_clicking=atoi_64(str)?1:0; return(0); } int f_use_standard_trace_select(char *str) { DEBUG(printf("f_f_use_standard_trace_select(\"%s\")\n",str)); GLOBALS->use_standard_trace_select=atoi_64(str)?1:0; return(0); } int f_use_toolbutton_interface(char *str) { #ifndef WAVE_USE_GTK2 (void)str; #endif DEBUG(printf("f_use_toolbutton_interface(\"%s\")\n",str)); #ifdef WAVE_USE_GTK2 GLOBALS->use_toolbutton_interface=atoi_64(str)?1:0; #endif return(0); } int f_vcd_explicit_zero_subscripts(char *str) { DEBUG(printf("f_vcd_explicit_zero_subscripts(\"%s\")\n",str)); GLOBALS->vcd_explicit_zero_subscripts=atoi_64(str)?0:-1; /* 0==yes, -1==no */ return(0); } int f_vcd_preserve_glitches(char *str) { DEBUG(printf("f_vcd_preserve_glitches(\"%s\")\n",str)); GLOBALS->vcd_preserve_glitches=atoi_64(str)?1:0; return(0); } int f_vcd_preserve_glitches_real(char *str) { DEBUG(printf("f_vcd_preserve_glitches_real(\"%s\")\n",str)); GLOBALS->vcd_preserve_glitches_real=atoi_64(str)?1:0; return(0); } int f_vcd_warning_filesize(char *str) { DEBUG(printf("f_vcd_warning_filesize(\"%s\")\n",str)); GLOBALS->vcd_warning_filesize=atoi_64(str); return(0); } int f_vector_padding(char *str) { DEBUG(printf("f_vector_padding(\"%s\")\n",str)); GLOBALS->vector_padding=atoi_64(str); if(GLOBALS->vector_padding<4) GLOBALS->vector_padding=4; else if(GLOBALS->vector_padding>16) GLOBALS->vector_padding=16; return(0); } int f_vlist_compression(char *str) { DEBUG(printf("f_vlist_compression(\"%s\")\n",str)); GLOBALS->vlist_compression_depth=atoi_64(str); if(GLOBALS->vlist_compression_depth<0) GLOBALS->vlist_compression_depth = -1; if(GLOBALS->vlist_compression_depth>9) GLOBALS->vlist_compression_depth = 9; return(0); } int f_vlist_prepack(char *str) { DEBUG(printf("f_vlist_prepack(\"%s\")\n",str)); GLOBALS->vlist_prepack=atoi_64(str); return(0); } int f_vlist_spill(char *str) { DEBUG(printf("f_vlist_spill(\"%s\")\n",str)); GLOBALS->vlist_spill_to_disk=atoi_64(str); return(0); } int f_wave_scrolling(char *str) { DEBUG(printf("f_wave_scrolling(\"%s\")\n",str)); GLOBALS->wave_scrolling=atoi_64(str)?1:0; return(0); } int f_zoom_base(char *str) { float f; DEBUG(printf("f_zoom_base(\"%s\")\n",str)); sscanf(str,"%f",&f); if(f<1.5) f=1.5; else if(f>10.0) f=10.0; GLOBALS->zoombase=(gdouble)f; return(0); } int f_zoom_center(char *str) { DEBUG(printf("f_zoom_center(\"%s\")\n",str)); GLOBALS->do_zoom_center=atoi_64(str)?1:0; return(0); } int f_zoom_dynamic(char *str) { DEBUG(printf("f_zoom_dynamic(\"%s\")\n",str)); GLOBALS->zoom_dyn=atoi_64(str)?1:0; return(0); } int f_zoom_dynamic_end(char *str) { DEBUG(printf("f_zoom_dynamic_end(\"%s\")\n",str)); GLOBALS->zoom_dyne=atoi_64(str)?1:0; return(0); } int f_zoom_pow10_snap(char *str) { DEBUG(printf("f_zoom_pow10_snap(\"%s\")\n",str)); GLOBALS->zoom_pow10_snap=atoi_64(str)?1:0; return(0); } int f_alt_wheel_mode(char *str) { DEBUG(printf("f_alt_wheel_mode(\"%s\")\n",str)); GLOBALS->alt_wheel_mode=atoi_64(str)?1:0; return(0); } int rc_compare(const void *v1, const void *v2) { return(strcasecmp((char *)v1, ((struct rc_entry *)v2)->name)); } /* make the color functions */ #define color_make(Z) int f_color_##Z (char *str) \ { \ int rgb; \ if((rgb=get_rgb_from_name(str))!=~0) \ { \ GLOBALS->color_##Z=rgb; \ } \ return(0); \ } color_make(back) color_make(baseline) color_make(grid) color_make(grid2) color_make(high) color_make(highfill) color_make(low) color_make(1) color_make(1fill) color_make(0) color_make(mark) color_make(mid) color_make(time) color_make(timeb) color_make(trans) color_make(umark) color_make(value) color_make(vbox) color_make(vtrans) color_make(x) color_make(xfill) color_make(u) color_make(ufill) color_make(w) color_make(wfill) color_make(dash) color_make(dashfill) color_make(white) color_make(black) color_make(ltgray) color_make(normal) color_make(mdgray) color_make(dkgray) color_make(dkblue) color_make(brkred) color_make(ltblue) color_make(gmstrd) /* * rc variables...these MUST be in alphabetical order for the bsearch! */ static struct rc_entry rcitems[]= { { "accel", f_accel }, { "alt_hier_delimeter", f_alt_hier_delimeter }, { "alt_wheel_mode", f_alt_wheel_mode }, { "analog_redraw_skip_count", f_analog_redraw_skip_count }, { "append_vcd_hier", f_append_vcd_hier }, { "atomic_vectors", f_atomic_vectors }, { "autocoalesce", f_autocoalesce }, { "autocoalesce_reversal", f_autocoalesce_reversal }, { "autoname_bundles", f_autoname_bundles }, { "clipboard_mouseover", f_clipboard_mouseover }, { "color_0", f_color_0 }, { "color_1", f_color_1 }, { "color_1fill", f_color_1fill }, { "color_back", f_color_back }, { "color_baseline", f_color_baseline }, { "color_black", f_color_black }, { "color_brkred", f_color_brkred }, { "color_dash", f_color_dash }, { "color_dashfill", f_color_dashfill }, { "color_dkblue", f_color_dkblue }, { "color_dkgray", f_color_dkgray }, { "color_gmstrd", f_color_gmstrd }, { "color_grid", f_color_grid }, { "color_grid2", f_color_grid2 }, { "color_high", f_color_high }, { "color_highfill", f_color_highfill }, { "color_low", f_color_low }, { "color_ltblue", f_color_ltblue }, { "color_ltgray", f_color_ltgray }, { "color_mark", f_color_mark }, { "color_mdgray", f_color_mdgray }, { "color_mid", f_color_mid }, { "color_normal", f_color_normal }, { "color_time", f_color_time }, { "color_timeb", f_color_timeb }, { "color_trans", f_color_trans }, { "color_u", f_color_u }, { "color_ufill", f_color_ufill }, { "color_umark", f_color_umark }, { "color_value", f_color_value }, { "color_vbox", f_color_vbox }, { "color_vtrans", f_color_vtrans }, { "color_w", f_color_w }, { "color_wfill", f_color_wfill }, { "color_white", f_color_white }, { "color_x", f_color_x }, { "color_xfill", f_color_xfill }, { "constant_marker_update", f_constant_marker_update }, { "context_tabposition", f_context_tabposition }, { "convert_to_reals", f_convert_to_reals }, { "cursor_snap", f_cursor_snap }, { "disable_ae2_alias", f_disable_ae2_alias }, { "disable_auto_comphier", f_disable_auto_comphier }, { "disable_empty_gui", f_disable_empty_gui }, { "disable_mouseover", f_disable_mouseover }, { "disable_tooltips", f_disable_tooltips }, { "do_initial_zoom_fit", f_do_initial_zoom_fit }, { "dragzoom_threshold", f_dragzoom_threshold }, { "dynamic_resizing", f_dynamic_resizing }, { "editor", f_editor }, { "enable_fast_exit", f_enable_fast_exit }, { "enable_ghost_marker", f_enable_ghost_marker }, { "enable_horiz_grid", f_enable_horiz_grid }, { "enable_vcd_autosave", f_enable_vcd_autosave }, { "enable_vert_grid", f_enable_vert_grid }, { "fill_waveform", f_fill_waveform }, { "fontname_logfile", f_fontname_logfile }, { "fontname_signals", f_fontname_signals }, { "fontname_waves", f_fontname_waves }, { "force_toolbars", f_force_toolbars }, { "hide_sst", f_hide_sst }, { "hier_delimeter", f_hier_delimeter }, { "hier_grouping", f_hier_grouping }, { "hier_ignore_escapes", f_hier_ignore_escapes }, { "hier_max_level", f_hier_max_level }, { "highlight_wavewindow", f_highlight_wavewindow }, { "hpane_pack", f_hpane_pack }, { "ignore_savefile_pane_pos", f_ignore_savefile_pane_pos }, { "ignore_savefile_pos", f_ignore_savefile_pos }, { "ignore_savefile_size", f_ignore_savefile_size }, { "initial_signal_window_width", f_initial_signal_window_width }, { "initial_window_x", f_initial_window_x }, { "initial_window_xpos", f_initial_window_xpos }, { "initial_window_y", f_initial_window_y }, { "initial_window_ypos", f_initial_window_ypos }, { "keep_xz_colors", f_keep_xz_colors }, { "left_justify_sigs", f_left_justify_sigs }, { "lxt_clock_compress_to_z", f_lxt_clock_compress_to_z }, { "max_fsdb_trees", f_max_fsdb_trees }, { "page_divisor", f_page_divisor }, { "ps_maxveclen", f_ps_maxveclen }, { "ruler_origin", f_ruler_origin }, { "ruler_step", f_ruler_step }, { "scale_to_time_dimension", f_scale_to_time_dimension }, { "show_base_symbols", f_show_base_symbols }, { "show_grid", f_show_grid }, { "splash_disable", f_splash_disable }, { "sst_dynamic_filter", f_sst_dynamic_filter }, { "sst_expanded", f_sst_expanded }, { "strace_repeat_count", f_strace_repeat_count }, { "use_big_fonts", f_use_big_fonts }, { "use_frequency_display", f_use_frequency_display }, { "use_full_precision", f_use_full_precision }, { "use_maxtime_display", f_use_maxtime_display }, { "use_nonprop_fonts", f_use_nonprop_fonts }, { "use_pango_fonts", f_use_pango_fonts }, { "use_roundcaps", f_use_roundcaps }, { "use_scrollbar_only", f_use_scrollbar_only }, { "use_scrollwheel_as_y", f_use_scrollwheel_as_y }, { "use_standard_clicking", f_use_standard_clicking }, { "use_standard_trace_select", f_use_standard_trace_select }, { "use_toolbutton_interface", f_use_toolbutton_interface }, { "vcd_explicit_zero_subscripts", f_vcd_explicit_zero_subscripts }, { "vcd_preserve_glitches", f_vcd_preserve_glitches }, { "vcd_preserve_glitches_real", f_vcd_preserve_glitches_real }, { "vcd_warning_filesize", f_vcd_warning_filesize }, { "vector_padding", f_vector_padding }, { "vlist_compression", f_vlist_compression }, { "vlist_prepack", f_vlist_prepack }, { "vlist_spill", f_vlist_spill }, { "wave_scrolling", f_wave_scrolling }, { "zoom_base", f_zoom_base }, { "zoom_center", f_zoom_center }, { "zoom_dynamic", f_zoom_dynamic }, { "zoom_dynamic_end", f_zoom_dynamic_end }, { "zoom_pow10_snap", f_zoom_pow10_snap } }; static void vanilla_rc(void) { f_enable_fast_exit ("on"); f_alt_wheel_mode ("on"); f_splash_disable ("off"); f_zoom_pow10_snap ("on"); f_hier_max_level ("1"); f_cursor_snap ("8"); f_use_frequency_display ("off"); f_use_maxtime_display ("off"); f_use_roundcaps ("on"); f_use_nonprop_fonts ("on"); f_use_pango_fonts ("on"); f_constant_marker_update("on"); f_show_base_symbols ("off"); f_color_back ("000000"); /* black */ f_color_baseline ("ffffff"); /* white */ f_color_grid ("202070"); /* dark dark blue */ f_color_grid2 ("6a5acd"); /* slate blue */ f_color_high ("79f6f2"); /* light light blue */ f_color_highfill ("4ca09d"); /* dark dark blue */ f_color_low ("5dbebb"); /* light blue */ f_color_1 ("00ff00"); /* green */ f_color_1fill ("004d00"); /* dark dark green */ f_color_0 ("008000"); /* dark green */ f_color_trans ("00c000"); /* medium green */ f_color_mid ("c0c000"); /* mustard */ f_color_value ("ffffff"); /* white */ f_color_vbox ("00ff00"); /* green */ f_color_vtrans ("00c000"); /* medium green */ f_color_x ("ff0000"); /* red */ f_color_xfill ("400000"); /* dark maroon */ f_color_u ("cc0000"); /* brick */ f_color_ufill ("200000"); /* dark maroon */ f_color_w ("79f6f2"); /* light light blue */ f_color_wfill ("3f817f"); /* dark blue-green */ f_color_dash ("edf508"); /* yellow */ f_color_dashfill ("7d8104"); /* green mustard */ f_color_umark ("ff8080"); /* pink */ f_color_mark ("ffff80"); /* light yellow */ f_color_time ("ffffff"); /* white */ f_color_timeb ("000000"); /* black */ f_color_white ("ffffff"); /* white */ f_color_black ("000000"); /* black */ f_color_ltgray ("f5f5f5"); f_color_normal ("e6e6e6"); f_color_mdgray ("cccccc"); f_color_dkgray ("aaaaaa"); f_color_dkblue ("4464ac"); f_color_brkred ("cc0000"); /* brick */ f_color_ltblue ("5dbebb"); /* light blue */ f_color_gmstrd ("7d8104"); /* green mustard */ } int insert_rc_variable(char *str) { int i; int len; int ok = 0; len=strlen(str); if(len) { for(i=0;i=i;j--) { if((str[j]==' ')||(str[j]=='\t')) /* nuke trailing spaces */ { str[j]=0; continue; } else { break; } } r->func(str+i); /* call resolution function */ ok = 1; } break; } break; /* added so multiple word values work properly*/ } } break; } } return(ok); } void read_rc_file(char *override_rc) { FILE *handle; int i; int num_rcitems = sizeof(rcitems)/sizeof(struct rc_entry); for(i=0;i<(num_rcitems-1);i++) { if(strcmp(rcitems[i].name, rcitems[i+1].name) > 0) { fprintf(stderr, "rcitems misordering: '%s' vs '%s'\n", rcitems[i].name, rcitems[i+1].name); exit(255); } } /* move defaults first and only go whitescreen if instructed to do so */ if(GLOBALS->possibly_use_rc_defaults) vanilla_rc(); if((override_rc)&&((handle=fopen(override_rc,"rb")))) { /* good, we have a handle */ wave_gconf_client_set_string("/current/rcfile", override_rc); } else #if !defined __MINGW32__ && !defined _MSC_VER if(!(handle=fopen(rcname,"rb"))) { char *home; char *rcpath; home=getpwuid(geteuid())->pw_dir; rcpath=(char *)alloca(strlen(home)+1+strlen(rcname)+1); strcpy(rcpath,home); strcat(rcpath,"/"); strcat(rcpath,rcname); if(!(handle=fopen(rcpath,"rb"))) { #ifdef MAC_INTEGRATION const gchar *bundle_id = gtkosx_application_get_bundle_id(); if(bundle_id) { const gchar *rpath = gtkosx_application_get_resource_path(); const char *suf = "/gtkwaverc"; rcpath = NULL; if(rpath) { rcpath = (char *)alloca(strlen(rpath) + strlen(suf) + 1); strcpy(rcpath, rpath); strcat(rcpath, suf); } if(!rcpath || !(handle=fopen(rcpath,"rb"))) { wave_gconf_client_set_string("/current/rcfile", ""); errno=0; return; /* no .rc file */ } else { wave_gconf_client_set_string("/current/rcfile", rcpath); } } else #endif { wave_gconf_client_set_string("/current/rcfile", ""); errno=0; return; /* no .rc file */ } } else { wave_gconf_client_set_string("/current/rcfile", rcpath); } } #else if(!(handle=fopen(rcname,"rb"))) /* no concept of ~ in win32 */ { /* Try to find rcname in USERPROFILE */ char *home; char *rcpath; home=getenv("USERPROFILE"); if (home != NULL) { /* printf("USERPROFILE = %s\n", home); */ rcpath=(char *)alloca(strlen(home)+1+strlen(rcname)+1); strcpy(rcpath,home); strcat(rcpath,"\\"); strcat(rcpath,rcname); /* printf("rcpath = %s\n", rcpath); */ } if ((home == NULL) || (!(handle=fopen(rcpath,"rb")))) { /* printf("No rc file\n"); */ wave_gconf_client_set_string("/current/rcfile", ""); errno=0; if(GLOBALS->possibly_use_rc_defaults) vanilla_rc(); return; /* no .rc file */ } wave_gconf_client_set_string("/current/rcfile", rcpath); } #endif GLOBALS->rc_line_no=0; while(!feof(handle)) { char *str; GLOBALS->rc_line_no++; if((str=fgetmalloc(handle))) { insert_rc_variable(str); free_2(str); } } fclose(handle); errno=0; return; } gtkwave-3.3.86/src/vlist.h0000664000175000017500000000375513166335473014717 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2006-8. * * 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. */ #include "globals.h" #ifndef WAVE_VLIST_H #define WAVE_VLIST_H #include #include #include #include "debug.h" struct vlist_t { struct vlist_t *next; unsigned int siz; unsigned int offs; unsigned int elem_siz; }; /* experimentation shows that 255 is one of the least common bytes found in recoded value change streams */ #define WAVE_ZIVFLAG (0xff) #define WAVE_ZIVWRAP (1<<7) /* must be power of two because of AND mask */ #define WAVE_ZIVSRCH (WAVE_ZIVWRAP) /* search depth in bytes */ #define WAVE_ZIVSKIP (1) /* number of bytes to skip for alternate rollover searches */ #define WAVE_ZIVMASK ((WAVE_ZIVWRAP) - 1) /* then this becomes an AND mask for wrapping */ struct vlist_packer_t { struct vlist_t *v; unsigned char buf[WAVE_ZIVWRAP]; #ifdef WAVE_VLIST_PACKER_STATS unsigned int packed_bytes; #endif unsigned int unpacked_bytes; unsigned int repcnt, repcnt2, repcnt3, repcnt4; unsigned char bufpnt; unsigned char repdist, repdist2, repdist3, repdist4; }; void vlist_init_spillfile(void); void vlist_kill_spillfile(void); struct vlist_t *vlist_create(unsigned int elem_siz); void vlist_destroy(struct vlist_t *v); void *vlist_alloc(struct vlist_t **v, int compressable); unsigned int vlist_size(struct vlist_t *v); void *vlist_locate(struct vlist_t *v, unsigned int idx); void vlist_freeze(struct vlist_t **v); void vlist_uncompress(struct vlist_t **v); struct vlist_packer_t *vlist_packer_create(void); void vlist_packer_alloc(struct vlist_packer_t *v, unsigned char ch); void vlist_packer_finalize(struct vlist_packer_t *v); unsigned char *vlist_packer_decompress(struct vlist_t *vl, unsigned int *declen); void vlist_packer_decompress_destroy(char *mem); #endif gtkwave-3.3.86/src/ae2.c0000664000175000017500000011464313166335473014217 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2004-2017. * * 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. */ #include "globals.h" #include #include #ifndef _MSC_VER #include #endif #include #include #include #include "ae2.h" #include "symbol.h" #include "vcd.h" #include "lxt.h" #include "lxt2_read.h" #include "fgetdynamic.h" #include "debug.h" #include "busy.h" #include "hierpack.h" /* * select appropriate entry points based on if aet2 * support is available */ #ifndef AET2_IS_PRESENT const char *ae2_loader_fail_msg = "Sorry, AET2 support was not compiled into this executable, exiting.\n\n"; TimeType ae2_main(char *fname, char *skip_start, char *skip_end) { (void)fname; (void)skip_start; (void)skip_end; fprintf(stderr, "%s", ae2_loader_fail_msg); exit(255); return(0); /* for vc++ */ } void ae2_import_masked(void) { fprintf(stderr, "%s", ae2_loader_fail_msg); exit(255); } #else /* * iter mask manipulation util functions */ int aet2_rd_get_fac_process_mask(unsigned int facidx) { if((int)facidxnumfacs) { int process_idx = facidx/8; int process_bit = facidx&7; return( (GLOBALS->ae2_process_mask[process_idx]&(1<numfacs) { int idx = facidx/8; int bitpos = facidx&7; GLOBALS->ae2_process_mask[idx] |= (1<numfacs) { int idx = facidx/8; int bitpos = facidx&7; GLOBALS->ae2_process_mask[idx] &= (~(1<ae2, name, &f2)); } #endif static void *alloc_fn(size_t size) { void *pnt = calloc_2(1, size); return(pnt); } static void free_fn(void* ptr, size_t size) { (void)size; if(ptr) { free_2(ptr); } } /* * dynamic alias allocator (memory written to is converted to refer to facidx instead) */ #ifdef AET2_ALIASDB_IS_PRESENT static void *adb_alloc_2(size_t siz) { if(GLOBALS->adb_alloc_pool_base) { if((siz + GLOBALS->adb_alloc_idx) <= WAVE_ADB_ALLOC_POOL_SIZE) { unsigned char *m = GLOBALS->adb_alloc_pool_base + GLOBALS->adb_alloc_idx; GLOBALS->adb_alloc_idx += siz; return((void *)m); } else if(siz >= WAVE_ADB_ALLOC_ALTREQ_SIZE) { return(calloc_2(1, siz)); } } GLOBALS->adb_alloc_pool_base = calloc_2(1, WAVE_ADB_ALLOC_POOL_SIZE); GLOBALS->adb_alloc_idx = 0; return(adb_alloc_2(siz)); } #endif /* * dynamic alias support on reads */ #ifdef AET2_ALIASDB_IS_PRESENT static unsigned long ae2_read_symbol_rows_2(AE2_HANDLE handle, unsigned long symbol_idx) { if(symbol_idx <= GLOBALS->ae2_num_facs) { unsigned long r = (unsigned long)((unsigned int)ae2_read_symbol_rows(handle, symbol_idx)); if(r > AE2_MAX_ROWS) r = AE2_MAX_ROWS; return(r); } else { return(1); } } static void ae2_read_value_2a(AE2_HANDLE handle, unsigned long idx, uint64_t cycle, char* value, int tot_length) { int i; int numTerms = GLOBALS->adb_num_terms[--idx]; int length; int offs = 0; if(numTerms) { for(i=0;iadb_aliases[idx][i]; AE2_FACREF fr2; fr2.s = at->id; fr2.row = 0; fr2.row_high = 0; fr2.offset = at->first; if(at->last >= at->first) { fr2.length = length = at->last - at->first + 1; } else { fr2.length = -(length = at->first - at->last + 1); } if(fr2.s) { ae2_read_value(handle, &fr2, cycle, value+offs); } else { memset(value+offs, 'Z', fr2.length); /* should never happen except when alias is superset of available model facs */ } offs += length; } } else { /* should never happen except when alias is superset of available model facs */ memset(value, 'Z', tot_length); } value[tot_length] = 0; } static uint64_t ae2_read_next_value_2a(AE2_HANDLE handle, unsigned long idx, uint64_t cycle, char* value, int tot_length) { uint64_t cyc = GLOBALS->max_time + 1; uint64_t t_cyc; int i; int numTerms = GLOBALS->adb_num_terms[--idx]; int length; int offs = 0; int nonew = 0; if(numTerms) { for(i=0;iadb_aliases[idx][i]; AE2_FACREF fr2; fr2.s = at->id; fr2.row = 0; fr2.row_high = 0; fr2.offset = at->first; if(at->last >= at->first) { fr2.length = length = at->last - at->first + 1; } else { fr2.length = -(length = at->first - at->last + 1); } if(fr2.s) { t_cyc = ae2_read_next_value(handle, &fr2, cycle, value+offs); /* simply want to calculate next value change time */ } else { /* should never happen except when alias is superset of available model facs */ t_cyc = cycle; } if(t_cyc != cycle) { if(t_cyc < cyc) { cyc = t_cyc; } } else { nonew++; } offs += length; } if(nonew == numTerms) { cyc = cycle; } ae2_read_value_2a(handle, idx+1, cyc, value, tot_length); /* reread at that calculated value change time */ } else { /* should never happen except when alias is superset of available model facs */ memset(value, 'Z', tot_length); value[tot_length] = 0; cyc = cycle; } return(cyc); } static void ae2_read_value_2(AE2_HANDLE handle, AE2_FACREF* fr, uint64_t cycle, char* value) { if(fr->s <= GLOBALS->ae2_num_facs) { ae2_read_value(handle, fr, cycle, value); } else /* complex alias... */ { unsigned long idx = fr->s - GLOBALS->ae2_num_facs; ae2_read_value_2a(handle, idx, cycle, value, fr->length); } } static uint64_t ae2_read_next_value_2(AE2_HANDLE handle, AE2_FACREF* fr, uint64_t cycle, char* value) { if(fr->s <= GLOBALS->ae2_num_facs) { return(ae2_read_next_value(handle, fr, cycle, value)); } else /* complex alias... */ { unsigned long idx = fr->s - GLOBALS->ae2_num_facs; return(ae2_read_next_value_2a(handle, idx, cycle, value, fr->length)); } } #else #define ae2_read_symbol_rows_2(a,b) ae2_read_symbol_rows((a),(b)) #define ae2_read_value_2(a,b,c,d) ae2_read_value((a),(b),(c),(d)) #define ae2_read_next_value_2(a,b,c,d) ae2_read_next_value((a),(b),(c),(d)) #endif /* * fast itoa for decimal numbers */ static char* itoa_2(int value, char* result) { char* ptr = result, *ptr1 = result, tmp_char; int tmp_value; do { tmp_value = value; value /= 10; *ptr++ = "9876543210123456789" [9 + (tmp_value - value * 10)]; } while ( value ); if (tmp_value < 0) *ptr++ = '-'; result = ptr; *ptr-- = '\0'; while(ptr1 < ptr) { tmp_char = *ptr; *ptr--= *ptr1; *ptr1++ = tmp_char; } return(result); } /* * preformatted sprintf statements which remove parsing latency */ static int sprintf_2_1d(char *s, int d) { char *s2 = s; *(s2++) = '['; *(s2++) = '0'; *(s2++) = ':'; s2 = itoa_2(d, s2); *(s2++) = ']'; *s2 = 0; return(s2 - s); } #ifdef AET2_ALIASDB_IS_PRESENT static int sprintf_2_2d(char *s, int d1, int d2) { char *s2 = s; *(s2++) = '['; s2 = itoa_2(d1, s2); *(s2++) = ':'; s2 = itoa_2(d2, s2); *(s2++) = ']'; *s2 = 0; return(s2 - s); } #endif /* * mainline */ TimeType ae2_main(char *fname, char *skip_start, char *skip_end) { unsigned int i; int match_idx; struct Node *n; struct symbol *s; TimeType first_cycle, last_cycle /* , total_cycles */; /* scan-build */ int total_rows = 0; int mono_row_offset = 0; struct Node *monolithic_node = NULL; struct symbol *monolithic_sym = NULL; #ifdef AET2_ALIASDB_IS_PRESENT unsigned long kw = 0; unsigned char *missing = NULL; #endif char buf[AE2_MAX_NAME_LENGTH+1]; ae2_read_set_max_section_cycle(65536); ae2_initialize(error_fn, msg_fn, alloc_fn, free_fn); if ( (!(GLOBALS->ae2_f=fopen(fname, "rb"))) || (!(GLOBALS->ae2 = ae2_read_initialize(GLOBALS->ae2_f))) ) { if(GLOBALS->ae2_f) { fclose(GLOBALS->ae2_f); GLOBALS->ae2_f = NULL; } return(LLDescriptor(0)); /* look at GLOBALS->ae2 in caller for success status... */ } GLOBALS->time_dimension = 'n'; /* SPLASH */ splash_create(); sym_hash_initialize(GLOBALS); #ifdef AET2_ALIASDB_IS_PRESENT if(!GLOBALS->disable_ae2_alias) { kw = ae2_read_locate_keyword(GLOBALS->ae2, "aliasdb"); } if(kw) { GLOBALS->adb_alias_stream_file = ae2_read_keyword_stream(GLOBALS->ae2, kw); GLOBALS->adb = adb_open_embed(GLOBALS->adb_alias_stream_file, NULL, alloc_fn, free_fn, adb_msg_fn, error_fn); if(GLOBALS->adb) { unsigned long fn; GLOBALS->ae2_num_aliases = adb_num_aliases(GLOBALS->adb); GLOBALS->adb_max_terms = adb_max_alias_terms(GLOBALS->adb); GLOBALS->adb_terms = calloc_2(GLOBALS->adb_max_terms + 1, sizeof(ADB_TERM)); GLOBALS->adb_aliases = calloc_2(GLOBALS->ae2_num_aliases, sizeof(ADB_TERM *)); GLOBALS->adb_num_terms = calloc_2(GLOBALS->ae2_num_aliases, sizeof(unsigned short)); GLOBALS->adb_idx_first = calloc_2(GLOBALS->ae2_num_aliases, sizeof(unsigned short)); GLOBALS->adb_idx_last = calloc_2(GLOBALS->ae2_num_aliases, sizeof(unsigned short)); fn = adb_map_ids (GLOBALS->adb, symbol_fn, GLOBALS->ae2); /* iteratively replaces all .id with FACIDX */ fprintf(stderr, AET2_RDLOAD"Encountered %lu aliases referencing %lu facs.\n", GLOBALS->ae2_num_aliases, fn); } } #endif GLOBALS->ae2_num_sections=ae2_read_num_sections(GLOBALS->ae2); GLOBALS->ae2_num_facs = ae2_read_num_symbols(GLOBALS->ae2); GLOBALS->numfacs = GLOBALS->ae2_num_facs + GLOBALS->ae2_num_aliases; GLOBALS->ae2_process_mask = calloc_2(1, GLOBALS->numfacs/8+1); GLOBALS->ae2_fr=calloc_2(GLOBALS->numfacs, sizeof(AE2_FACREF)); GLOBALS->ae2_lx2_table=(struct lx2_entry **)calloc_2(GLOBALS->numfacs, sizeof(struct lx2_entry *)); if(!GLOBALS->fast_tree_sort) { GLOBALS->do_hier_compress = 0; } else { hier_auto_enable(); /* enable if greater than threshold */ } init_facility_pack(); match_idx = 0; for(i=0;iae2_num_facs;i++) { int idx = i+1; GLOBALS->ae2_fr[match_idx].facname = NULL; GLOBALS->ae2_fr[match_idx].s = idx; GLOBALS->ae2_fr[match_idx].row = ae2_read_symbol_rows(GLOBALS->ae2, idx); if(GLOBALS->ae2_fr[match_idx].row > AE2_MAX_ROWS) { GLOBALS->ae2_fr[match_idx].row = AE2_MAX_ROWS; ae2_read_find_symbol(GLOBALS->ae2, buf, &GLOBALS->ae2_fr[match_idx]); fprintf(stderr, AET2_RDLOAD"Warning: Reduced array %s to %d rows.\n", buf, AE2_MAX_ROWS); } total_rows += (GLOBALS->ae2_fr[match_idx].row > 0) ? GLOBALS->ae2_fr[match_idx].row : 1; if(GLOBALS->ae2_fr[match_idx].row == 1) GLOBALS->ae2_fr[match_idx].row = 0; GLOBALS->ae2_fr[match_idx].length = ae2_read_symbol_length(GLOBALS->ae2, idx); GLOBALS->ae2_fr[match_idx].row_high = 0; GLOBALS->ae2_fr[match_idx].offset = 0; match_idx++; } #ifdef AET2_ALIASDB_IS_PRESENT missing = calloc_2(1, (GLOBALS->ae2_num_aliases + 7 + 1) / 8); /* + 1 to mirror idx value */ for(i=0;iae2_num_aliases;i++) { unsigned long numTerms; unsigned int idx = i+1; unsigned int ii; int midx, mbit; int mcnt; total_rows++; if((numTerms = adb_load_alias_def(GLOBALS->adb, idx, GLOBALS->adb_terms))) { if(GLOBALS->adb_terms[0].first > GLOBALS->adb_terms[0].last) { GLOBALS->ae2_fr[match_idx].length = GLOBALS->adb_terms[0].first - GLOBALS->adb_terms[0].last + 1; } else { GLOBALS->ae2_fr[match_idx].length = GLOBALS->adb_terms[0].last - GLOBALS->adb_terms[0].first + 1; } GLOBALS->adb_idx_first[i] = GLOBALS->adb_terms[0].first; GLOBALS->adb_idx_last[i] = GLOBALS->adb_terms[0].last; GLOBALS->ae2_fr[match_idx].s = idx + GLOBALS->ae2_num_facs; /* bias aliases after regular facs */ GLOBALS->ae2_fr[match_idx].facname = NULL; GLOBALS->ae2_fr[match_idx].row = 0; GLOBALS->ae2_fr[match_idx].row_high = 0; GLOBALS->ae2_fr[match_idx].offset = 0; GLOBALS->adb_num_terms[i] = numTerms; GLOBALS->adb_aliases[i] = adb_alloc_2(numTerms * sizeof(ADB_TERM)); mcnt = 0; for(ii=0;ii<(numTerms);ii++) { GLOBALS->adb_aliases[i][ii].id = GLOBALS->adb_terms[ii+1].id; if(!GLOBALS->adb_aliases[i][ii].id) { mcnt++; } GLOBALS->adb_aliases[i][ii].first = GLOBALS->adb_terms[ii+1].first; GLOBALS->adb_aliases[i][ii].last = GLOBALS->adb_terms[ii+1].last; } if(mcnt) { midx = idx / 8; mbit = idx & 7; missing[midx] |= (1 << mbit); } } else { unsigned long id = GLOBALS->adb_terms[0].id; if(id) { memcpy(&GLOBALS->ae2_fr[match_idx], &GLOBALS->ae2_fr[id-1], sizeof(AE2_FACREF)); GLOBALS->adb_idx_first[i] = 0; GLOBALS->adb_idx_last[i] = GLOBALS->ae2_fr[match_idx].length - 1; } else /* not in model */ { midx = idx / 8; mbit = idx & 7; missing[midx] |= (1 << mbit); GLOBALS->ae2_fr[match_idx].length = 1; GLOBALS->adb_idx_first[i] = 0; GLOBALS->adb_idx_last[i] = 0; GLOBALS->ae2_fr[match_idx].s = idx + GLOBALS->ae2_num_facs; /* bias aliases after regular facs */ GLOBALS->ae2_fr[match_idx].facname = NULL; GLOBALS->ae2_fr[match_idx].row = 0; GLOBALS->ae2_fr[match_idx].row_high = 0; GLOBALS->ae2_fr[match_idx].offset = 0; GLOBALS->adb_num_terms[i] = 0; } } match_idx++; } #endif monolithic_node = calloc_2(total_rows, sizeof(struct Node)); monolithic_sym = calloc_2(match_idx, sizeof(struct symbol)); fprintf(stderr, AET2_RDLOAD"Finished building %d facs.\n", match_idx); /* SPLASH */ splash_sync(1, 5); first_cycle = (TimeType) ae2_read_start_cycle(GLOBALS->ae2); last_cycle = (TimeType) ae2_read_end_cycle(GLOBALS->ae2); /* total_cycles = last_cycle - first_cycle + 1; */ /* scan-build */ /* do your stuff here..all useful info has been initialized by now */ if(!GLOBALS->hier_was_explicitly_set) /* set default hierarchy split char */ { GLOBALS->hier_delimeter='.'; } match_idx = 0; for(i=0;i<(unsigned int)GLOBALS->numfacs;i++) { char *str; int idx; int typ; long len, clen; int row_iter, mx_row, mx_row_adjusted; #ifdef AET2_ALIASDB_IS_PRESENT if(i < GLOBALS->ae2_num_facs) #endif { idx = i+1; len = ae2_read_symbol_name(GLOBALS->ae2, idx, buf); typ = (GLOBALS->ae2_fr[match_idx].row <= 1) ? ND_GEN_NET : ND_VCD_ARRAY; } #ifdef AET2_ALIASDB_IS_PRESENT else { idx = i - GLOBALS->ae2_num_facs + 1; typ = (missing[idx/8] & (1 << (idx & 7))) ? ND_GEN_MISSING : ND_GEN_ALIAS; len = adb_alias_name(GLOBALS->adb, idx, buf) - 1; /* it counts the null character */ } #endif if(GLOBALS->ae2_fr[match_idx].length>1) { int len2; #ifdef AET2_ALIASDB_IS_PRESENT if(i < GLOBALS->ae2_num_facs) #endif { len2 = sprintf_2_1d(buf+len, GLOBALS->ae2_fr[match_idx].length-1); } #ifdef AET2_ALIASDB_IS_PRESENT else { len2 = sprintf_2_2d(buf+len, GLOBALS->adb_idx_first[i - GLOBALS->ae2_num_facs], GLOBALS->adb_idx_last[i - GLOBALS->ae2_num_facs]); } #endif clen = (len + len2 + 1); if(!GLOBALS->do_hier_compress) { str=malloc_2(clen); } else { str = buf; } if(clen > GLOBALS->longestname) GLOBALS->longestname = clen; if(!GLOBALS->alt_hier_delimeter) { if(!GLOBALS->do_hier_compress) strcpy(str, buf); } else { strcpy_vcdalt(str, buf, GLOBALS->alt_hier_delimeter); } s = &monolithic_sym[match_idx]; symadd_name_exists_sym_exists(s, str,0); } else { clen = (len+1); if(!GLOBALS->do_hier_compress) { str=malloc_2(clen); } else { str = buf; } if(clen > GLOBALS->longestname) GLOBALS->longestname = clen; if(!GLOBALS->alt_hier_delimeter) { if(!GLOBALS->do_hier_compress) strcpy(str, buf); } else { strcpy_vcdalt(str, buf, GLOBALS->alt_hier_delimeter); } s = &monolithic_sym[match_idx]; symadd_name_exists_sym_exists(s, str,0); } mx_row = (GLOBALS->ae2_fr[match_idx].row < 1) ? 1 : GLOBALS->ae2_fr[match_idx].row; mx_row_adjusted = (mx_row < 2) ? 0 : mx_row; n=&monolithic_node[mono_row_offset]; s->n = n; mono_row_offset += mx_row; if(GLOBALS->do_hier_compress) { s->name = compress_facility((unsigned char *)str, clen - 1); } for(row_iter = 0; row_iter < mx_row; row_iter++) { n[row_iter].vartype = typ; n[row_iter].nname=s->name; n[row_iter].mv.mvlfac = (struct fac *)(GLOBALS->ae2_fr+match_idx); /* to keep from having to allocate duplicate mvlfac struct */ /* use the info in the AE2_FACREF array instead */ n[row_iter].array_height = mx_row_adjusted; n[row_iter].this_row = row_iter; if(GLOBALS->ae2_fr[match_idx].length>1) { #ifdef AET2_ALIASDB_IS_PRESENT if(i < GLOBALS->ae2_num_facs) #endif { n[row_iter].msi = 0; n[row_iter].lsi = GLOBALS->ae2_fr[match_idx].length-1; } #ifdef AET2_ALIASDB_IS_PRESENT else { n[row_iter].msi = GLOBALS->adb_idx_first[i - GLOBALS->ae2_num_facs]; n[row_iter].lsi = GLOBALS->adb_idx_last[i - GLOBALS->ae2_num_facs]; } #endif n[row_iter].extvals = 1; } n[row_iter].head.time=-1; /* mark 1st node as negative time */ n[row_iter].head.v.h_val=AN_X; } match_idx++; } #ifdef AET2_ALIASDB_IS_PRESENT if(GLOBALS->adb_idx_last) { free_2(GLOBALS->adb_idx_last); GLOBALS->adb_idx_last = NULL; } if(GLOBALS->adb_idx_first) { free_2(GLOBALS->adb_idx_first); GLOBALS->adb_idx_first = NULL; } if(missing) { free_2(missing); missing = NULL; } #endif freeze_facility_pack(); /* SPLASH */ splash_sync(2, 5); GLOBALS->facs=(struct symbol **)malloc_2(GLOBALS->numfacs*sizeof(struct symbol *)); if(GLOBALS->fast_tree_sort) { for(i=0;i<(unsigned int)GLOBALS->numfacs;i++) { GLOBALS->facs[i]=&monolithic_sym[i]; } /* SPLASH */ splash_sync(3, 5); fprintf(stderr, AET2_RDLOAD"Building facility hierarchy tree.\n"); init_tree(); for(i=0;i<(unsigned int)GLOBALS->numfacs;i++) { int was_packed = HIER_DEPACK_STATIC; /* no need to free_2() afterward then */ char *sb = hier_decompress_flagged(GLOBALS->facs[i]->name, &was_packed); build_tree_from_name(sb, i); } /* SPLASH */ splash_sync(4, 5); treegraft(&GLOBALS->treeroot); fprintf(stderr, AET2_RDLOAD"Sorting facility hierarchy tree.\n"); treesort(GLOBALS->treeroot, NULL); /* SPLASH */ splash_sync(5, 5); order_facs_from_treesort(GLOBALS->treeroot, &GLOBALS->facs); GLOBALS->facs_are_sorted=1; } else { for(i=0;i<(unsigned int)GLOBALS->numfacs;i++) { #ifdef WAVE_HIERFIX char *subst; char ch; #endif GLOBALS->facs[i]=&monolithic_sym[i]; #ifdef WAVE_HIERFIX while((ch=(*subst))) { if(ch==GLOBALS->hier_delimeter) { *subst=VCDNAM_HIERSORT; } /* forces sort at hier boundaries */ subst++; } #endif } /* SPLASH */ splash_sync(3, 5); fprintf(stderr, AET2_RDLOAD"Sorting facilities at hierarchy boundaries.\n"); wave_heapsort(GLOBALS->facs,GLOBALS->numfacs); #ifdef WAVE_HIERFIX for(i=0;inumfacs;i++) { char *subst, ch; subst=GLOBALS->facs[i]->name; while((ch=(*subst))) { if(ch==VCDNAM_HIERSORT) { *subst=GLOBALS->hier_delimeter; } /* restore back to normal */ subst++; } } #endif GLOBALS->facs_are_sorted=1; /* SPLASH */ splash_sync(4, 5); fprintf(stderr, AET2_RDLOAD"Building facility hierarchy tree.\n"); init_tree(); for(i=0;i<(unsigned int)GLOBALS->numfacs;i++) { build_tree_from_name(GLOBALS->facs[i]->name, i); } /* SPLASH */ splash_sync(5, 5); treegraft(&GLOBALS->treeroot); treesort(GLOBALS->treeroot, NULL); } if(GLOBALS->ae2_time_xlate) /* GLOBALS->ae2_time_xlate is currently unused, but could be again in the future */ { GLOBALS->min_time = GLOBALS->ae2_time_xlate[0]; GLOBALS->max_time = GLOBALS->ae2_time_xlate[last_cycle - first_cycle]; } else { GLOBALS->min_time = first_cycle; GLOBALS->max_time=last_cycle; } GLOBALS->ae2_start_cyc = GLOBALS->ae2_start_limit_cyc = first_cycle; GLOBALS->ae2_end_cyc = GLOBALS->ae2_end_limit_cyc = last_cycle; GLOBALS->is_lx2 = LXT2_IS_AET2; if(skip_start || skip_end) { TimeType b_start, b_end; TimeType lim_idx; if(!skip_start) b_start = GLOBALS->min_time; else b_start = unformat_time(skip_start, GLOBALS->time_dimension); if(!skip_end) b_end = GLOBALS->max_time; else b_end = unformat_time(skip_end, GLOBALS->time_dimension); if(b_startmin_time) b_start = GLOBALS->min_time; else if(b_start>GLOBALS->max_time) b_start = GLOBALS->max_time; if(b_endmin_time) b_end = GLOBALS->min_time; else if(b_end>GLOBALS->max_time) b_end = GLOBALS->max_time; if(b_start > b_end) { TimeType tmp_time = b_start; b_start = b_end; b_end = tmp_time; } GLOBALS->min_time = b_start; GLOBALS->max_time = b_end; if(GLOBALS->ae2_time_xlate) /* GLOBALS->ae2_time_xlate is currently unused, but could be again in the future */ { for(lim_idx = first_cycle; lim_idx <= last_cycle; lim_idx++) { if(GLOBALS->ae2_time_xlate[lim_idx - first_cycle] <= GLOBALS->min_time) { GLOBALS->ae2_start_limit_cyc = lim_idx; } if(GLOBALS->ae2_time_xlate[lim_idx - first_cycle] >= GLOBALS->min_time) { break; } } for(; lim_idx <= last_cycle; lim_idx++) { if(GLOBALS->ae2_time_xlate[lim_idx - first_cycle] >= GLOBALS->max_time) { GLOBALS->ae2_end_limit_cyc = lim_idx; break; } } } } fprintf(stderr, AET2_RDLOAD"["TTFormat"] start time.\n"AET2_RDLOAD"["TTFormat"] end time.\n", GLOBALS->min_time, GLOBALS->max_time); /* SPLASH */ splash_finalize(); return(GLOBALS->max_time); } /* * ae2 callback */ static void ae2_callback(uint64_t *tim, unsigned int *facidx, char **value, unsigned int row) { struct HistEnt *htemp = histent_calloc(); struct lx2_entry *l2e = &GLOBALS->ae2_lx2_table[*facidx][row]; AE2_FACREF *f = GLOBALS->ae2_fr+(*facidx); static int busycnt = 0; busycnt++; if(busycnt==WAVE_BUSY_ITER) { busy_window_refresh(); busycnt = 0; } /* fprintf(stderr, "%lld %d %d %s\n", *tim, *facidx, row, *value); */ if(f->length>1) { htemp->v.h_vector = (char *)malloc_2(f->length); memcpy(htemp->v.h_vector, *value, f->length); } else { switch(**value) { case '0': htemp->v.h_val = AN_0; break; case '1': htemp->v.h_val = AN_1; break; case 'H': case 'Z': case 'z': htemp->v.h_val = AN_Z; break; default: htemp->v.h_val = AN_X; break; } } if(!GLOBALS->ae2_time_xlate) { htemp->time = (*tim); } else { htemp->time = GLOBALS->ae2_time_xlate[(*tim) - GLOBALS->ae2_start_cyc]; } if(l2e->histent_head) { l2e->histent_curr->next = htemp; l2e->histent_curr = htemp; } else { l2e->histent_head = l2e->histent_curr = htemp; } l2e->numtrans++; } int ae2_iterator(uint64_t start_cycle, uint64_t end_cycle) { unsigned int i, j, r; uint64_t cyc, ecyc, step_cyc; struct ae2_ncycle_autosort *deadlist=NULL; struct ae2_ncycle_autosort *autofacs=NULL; char buf[AE2_MAXFACLEN+1]; autofacs = calloc_2(GLOBALS->numfacs, sizeof(struct ae2_ncycle_autosort)); for(i=0;i<(unsigned int)GLOBALS->numfacs;i++) { if(aet2_rd_get_fac_process_mask(i)) { unsigned int nr = ae2_read_symbol_rows_2(GLOBALS->ae2,GLOBALS->ae2_fr[i].s); if(!nr) nr = 1; for(r=0;rae2_lx2_table[i][r].np; np->mv.value = calloc_2(1, GLOBALS->ae2_fr[i].length+1); } } } for(j=0;jae2_num_sections;j++) { struct ae2_ncycle_autosort **autosort = NULL; const uint64_t *ith_range = ae2_read_ith_section_range(GLOBALS->ae2, j); cyc = *ith_range; ecyc = *(ith_range+1); if(ecycend_cycle) break; if((ecycnumfacs;i++) { if(aet2_rd_get_fac_process_mask(i)) { int nr = ae2_read_symbol_rows_2(GLOBALS->ae2,GLOBALS->ae2_fr[i].s); if(nr<2) { nptr np = GLOBALS->ae2_lx2_table[i][0].np; ae2_read_value_2(GLOBALS->ae2, GLOBALS->ae2_fr+i, cyc, buf); if(strcmp(np->mv.value, buf)) { strcpy(np->mv.value, buf); ae2_callback(&cyc, &i, &np->mv.value, 0); } } else { unsigned long sf = ae2_read_symbol_sparse_flag(GLOBALS->ae2, GLOBALS->ae2_fr[i].s); if(sf) { unsigned int rows = ae2_read_num_sparse_rows(GLOBALS->ae2, GLOBALS->ae2_fr[i].s, cyc); if(rows) { for(r=1;rae2, GLOBALS->ae2_fr[i].s, cyc, r); GLOBALS->ae2_fr[i].row = row; np = GLOBALS->ae2_lx2_table[i][row].np; ae2_read_value_2(GLOBALS->ae2, GLOBALS->ae2_fr+i, cyc, buf); if(strcmp(np->mv.value, buf)) { strcpy(np->mv.value, buf); ae2_callback(&cyc, &i, &np->mv.value, row); } } } } else { unsigned int rows = ae2_read_symbol_rows_2(GLOBALS->ae2, GLOBALS->ae2_fr[i].s); if(rows) { for(r=0;rae2_fr[i].row = row; np = GLOBALS->ae2_lx2_table[i][row].np; ae2_read_value_2(GLOBALS->ae2, GLOBALS->ae2_fr+i, cyc, buf); if(strcmp(np->mv.value, buf)) { strcpy(np->mv.value, buf); ae2_callback(&cyc, &i, &np->mv.value, row); } } } } } } } deadlist=NULL; for(i=0;i<(unsigned int)GLOBALS->numfacs;i++) { uint64_t ncyc; nptr np; int nr; if(!aet2_rd_get_fac_process_mask(i)) continue; nr = ae2_read_symbol_rows_2(GLOBALS->ae2,GLOBALS->ae2_fr[i].s); if(nr < 2) { np = GLOBALS->ae2_lx2_table[i][0].np; ncyc = ae2_read_next_value_2(GLOBALS->ae2, GLOBALS->ae2_fr+i, cyc, np->mv.value); } else { unsigned long sf = ae2_read_symbol_sparse_flag(GLOBALS->ae2, GLOBALS->ae2_fr[i].s); if(sf) { unsigned int rows = ae2_read_num_sparse_rows(GLOBALS->ae2, GLOBALS->ae2_fr[i].s, cyc); uint64_t mxcyc = end_cycle+1; for(r=1;rae2, GLOBALS->ae2_fr[i].s, cyc, r); GLOBALS->ae2_fr[i].row = row; /* np = GLOBALS->ae2_lx2_table[i][row].np; */ ncyc = ae2_read_next_value_2(GLOBALS->ae2, GLOBALS->ae2_fr+i, cyc, buf); if((ncyc > cyc) && (ncyc < mxcyc)) mxcyc = ncyc; } if(mxcyc != (end_cycle+1)) { ncyc = mxcyc; } else { ncyc = cyc; } } else { unsigned int rows = ae2_read_symbol_rows_2(GLOBALS->ae2, GLOBALS->ae2_fr[i].s); uint64_t mxcyc = end_cycle+1; for(r=0;rae2_fr[i].row = row; /* np = GLOBALS->ae2_lx2_table[i][row].np; */ ncyc = ae2_read_next_value_2(GLOBALS->ae2, GLOBALS->ae2_fr+i, cyc, buf); if((ncyc > cyc) && (ncyc < mxcyc)) mxcyc = ncyc; } if(mxcyc != (end_cycle+1)) { ncyc = mxcyc; } else { ncyc = cyc; } } } if(ncyc!=cyc) { int offset = ncyc-cyc; struct ae2_ncycle_autosort *t = autosort[offset]; autofacs[i].next = t; autosort[offset] = autofacs+i; } else { struct ae2_ncycle_autosort *t = deadlist; autofacs[i].next = t; deadlist = autofacs+i; } } for(step_cyc = cyc+1 ; step_cyc <= ecyc ; step_cyc++) { int offset = step_cyc-cyc; struct ae2_ncycle_autosort *t = autosort[offset]; if(step_cyc > end_cycle) break; if(t) { while(t) { uint64_t ncyc; struct ae2_ncycle_autosort *tn = t->next; nptr np; int nr; i = t-autofacs; nr = ae2_read_symbol_rows_2(GLOBALS->ae2,GLOBALS->ae2_fr[i].s); if(nr<2) { np = GLOBALS->ae2_lx2_table[i][0].np; ae2_callback(&step_cyc, &i, &np->mv.value, 0); ncyc = ae2_read_next_value_2(GLOBALS->ae2, GLOBALS->ae2_fr+i, step_cyc, np->mv.value); } else { unsigned long sf = ae2_read_symbol_sparse_flag(GLOBALS->ae2, GLOBALS->ae2_fr[i].s); if(sf) { unsigned int rows = ae2_read_num_sparse_rows(GLOBALS->ae2, GLOBALS->ae2_fr[i].s, step_cyc); uint64_t mxcyc = end_cycle+1; for(r=1;rae2, GLOBALS->ae2_fr[i].s, step_cyc, r); GLOBALS->ae2_fr[i].row = row; npr = GLOBALS->ae2_lx2_table[i][row].np; ae2_read_value_2(GLOBALS->ae2, GLOBALS->ae2_fr+i, step_cyc, buf); if(strcmp(buf, npr->mv.value)) { strcpy(npr->mv.value, buf); ae2_callback(&step_cyc, &i, &npr->mv.value, row); } ncyc = ae2_read_next_value_2(GLOBALS->ae2, GLOBALS->ae2_fr+i, step_cyc, buf); if((ncyc > step_cyc) && (ncyc < mxcyc)) mxcyc = ncyc; } if(mxcyc != (end_cycle+1)) { ncyc = mxcyc; } else { ncyc = step_cyc; } } else { unsigned int rows = ae2_read_symbol_rows_2(GLOBALS->ae2, GLOBALS->ae2_fr[i].s); uint64_t mxcyc = end_cycle+1; for(r=0;rae2_fr[i].row = row; npr = GLOBALS->ae2_lx2_table[i][row].np; ae2_read_value_2(GLOBALS->ae2, GLOBALS->ae2_fr+i, step_cyc, buf); if(strcmp(buf, npr->mv.value)) { strcpy(npr->mv.value, buf); ae2_callback(&step_cyc, &i, &npr->mv.value, row); } ncyc = ae2_read_next_value_2(GLOBALS->ae2, GLOBALS->ae2_fr+i, step_cyc, buf); if((ncyc > step_cyc) && (ncyc < mxcyc)) mxcyc = ncyc; } if(mxcyc != (end_cycle+1)) { ncyc = mxcyc; } else { ncyc = step_cyc; } } } if(ncyc!=step_cyc) { int offset2 = ncyc-cyc; struct ae2_ncycle_autosort *ta = autosort[offset2]; autofacs[i].next = ta; autosort[offset2] = autofacs+i; } else { struct ae2_ncycle_autosort *ta = deadlist; autofacs[i].next = ta; deadlist = autofacs+i; } t = tn; } } } if(autosort) free_2(autosort); } for(i=0;i<(unsigned int)GLOBALS->numfacs;i++) { if(aet2_rd_get_fac_process_mask(i)) { unsigned int nr = ae2_read_symbol_rows_2(GLOBALS->ae2,GLOBALS->ae2_fr[i].s); if(!nr) nr = 1; for(r=0;rae2_lx2_table[i][r].np; free_2(np->mv.value); np->mv.value = NULL; } } } free_2(autofacs); return(0); } /* * actually import an ae2 trace but don't do it if it's already been imported */ void import_ae2_trace(nptr np) { struct HistEnt *htemp, *histent_tail; int len, i; AE2_FACREF *f; int txidx; int r, nr; if(!(f=(AE2_FACREF *)(np->mv.mvlfac))) return; /* already imported */ txidx = f - GLOBALS->ae2_fr; nr = ae2_read_symbol_rows_2(GLOBALS->ae2, f->s); /* new stuff */ len = f->length; if((1)||(f->row <= 1)) /* sorry, arrays not supported yet in the viewer */ { int flagged = HIER_DEPACK_STATIC; char *str = hier_decompress_flagged(np->nname, &flagged); fprintf(stderr, "Import: %s\n", str); if(nr<1) nr=1; if(!GLOBALS->ae2_lx2_table[txidx]) { GLOBALS->ae2_lx2_table[txidx] = calloc_2(nr, sizeof(struct lx2_entry)); for(r=0;rae2_lx2_table[txidx][r].np = &np[r]; } } aet2_rd_set_fac_process_mask(txidx); ae2_iterator(GLOBALS->ae2_start_limit_cyc, GLOBALS->ae2_end_limit_cyc); aet2_rd_clr_fac_process_mask(txidx); } else { int flagged = HIER_DEPACK_STATIC; char *str = hier_decompress_flagged(np->nname, &flagged); fprintf(stderr, AET2_RDLOAD"Skipping array: %s (%d rows)\n", str, f->row); if(nr<1) nr=1; if(!GLOBALS->ae2_lx2_table[txidx]) { GLOBALS->ae2_lx2_table[txidx] = calloc_2(nr, sizeof(struct lx2_entry)); for(r=0;rae2_lx2_table[txidx][r].np = &np[r]; } } } for(r = 0; r < nr; r++) { histent_tail = htemp = histent_calloc(); if(len>1) { htemp->v.h_vector = (char *)malloc_2(len); for(i=0;iv.h_vector[i] = AN_Z; } else { htemp->v.h_val = AN_Z; /* z */ } htemp->time = MAX_HISTENT_TIME; htemp = histent_calloc(); if(len>1) { htemp->v.h_vector = (char *)malloc_2(len); for(i=0;iv.h_vector[i] = AN_X; } else { htemp->v.h_val = AN_X; /* x */ } htemp->time = MAX_HISTENT_TIME-1; htemp->next = histent_tail; if(GLOBALS->ae2_lx2_table[txidx][r].histent_curr) { GLOBALS->ae2_lx2_table[txidx][r].histent_curr->next = htemp; htemp = GLOBALS->ae2_lx2_table[txidx][r].histent_head; } if(len>1) { np[r].head.v.h_vector = (char *)malloc_2(len); for(i=0;itime = -1; if(len>1) { htemp2->v.h_vector = htemp->v.h_vector; } else { htemp2->v.h_val = htemp->v.h_val; } htemp2->next = htemp; htemp = htemp2; GLOBALS->ae2_lx2_table[txidx][r].numtrans++; } np[r].head.time = -2; np[r].head.next = htemp; np[r].numhist=GLOBALS->ae2_lx2_table[txidx][r].numtrans +2 /*endcap*/ +1 /*frontcap*/; np[r].curr = histent_tail; np[r].mv.mvlfac = NULL; /* it's imported and cached so we can forget it's an mvlfac now */ } } /* * pre-import many traces at once so function above doesn't have to iterate... */ void ae2_set_fac_process_mask(nptr np) { AE2_FACREF *f; int txidx; int r, nr; if(!(f=(AE2_FACREF *)(np->mv.mvlfac))) return; /* already imported */ txidx = f - GLOBALS->ae2_fr; if((1)||(f->row <= 1)) /* sorry, arrays not supported */ { aet2_rd_set_fac_process_mask(txidx); nr = f->row; if(!nr) nr=1; GLOBALS->ae2_lx2_table[txidx] = calloc_2(nr, sizeof(struct lx2_entry)); for(r=0;rae2_lx2_table[txidx][r].np = &np[r]; } } } void ae2_import_masked(void) { int txidx, i, cnt=0; for(txidx=0;txidxnumfacs;txidx++) { if(aet2_rd_get_fac_process_mask(txidx)) { cnt++; } } if(!cnt) return; if(cnt>100) { fprintf(stderr, AET2_RDLOAD"Extracting %d traces\n", cnt); } set_window_busy(NULL); ae2_iterator(GLOBALS->ae2_start_limit_cyc, GLOBALS->ae2_end_limit_cyc); set_window_idle(NULL); for(txidx=0;txidxnumfacs;txidx++) { if(aet2_rd_get_fac_process_mask(txidx)) { struct HistEnt *htemp, *histent_tail; AE2_FACREF *f = GLOBALS->ae2_fr+txidx; int r, nr = ae2_read_symbol_rows_2(GLOBALS->ae2, f->s); int len = f->length; if(nr<1) nr=1; for(r = 0; r < nr; r++) { nptr np = GLOBALS->ae2_lx2_table[txidx][r].np; histent_tail = htemp = histent_calloc(); if(len>1) { htemp->v.h_vector = (char *)malloc_2(len); for(i=0;iv.h_vector[i] = AN_Z; } else { htemp->v.h_val = AN_Z; /* z */ } htemp->time = MAX_HISTENT_TIME; htemp = histent_calloc(); if(len>1) { htemp->v.h_vector = (char *)malloc_2(len); for(i=0;iv.h_vector[i] = AN_X; } else { htemp->v.h_val = AN_X; /* x */ } htemp->time = MAX_HISTENT_TIME-1; htemp->next = histent_tail; if(GLOBALS->ae2_lx2_table[txidx][r].histent_curr) { GLOBALS->ae2_lx2_table[txidx][r].histent_curr->next = htemp; htemp = GLOBALS->ae2_lx2_table[txidx][r].histent_head; } { struct HistEnt *htemp2 = histent_calloc(); htemp2->time = -1; if(len>1) { htemp2->v.h_vector = htemp->v.h_vector; } else { htemp2->v.h_val = htemp->v.h_val; } htemp2->next = htemp; htemp = htemp2; GLOBALS->ae2_lx2_table[txidx][r].numtrans++; } if(len>1) { np->head.v.h_vector = (char *)malloc_2(len); for(i=0;ihead.v.h_vector[i] = AN_X; } else { np->head.v.h_val = AN_X; /* x */ } np->head.time = -2; np->head.next = htemp; np->numhist=GLOBALS->ae2_lx2_table[txidx][r].numtrans +2 /*endcap*/ +1 /*frontcap*/; np->curr = histent_tail; np->mv.mvlfac = NULL; /* it's imported and cached so we can forget it's an mvlfac now */ } free_2(GLOBALS->ae2_lx2_table[txidx]); GLOBALS->ae2_lx2_table[txidx] = NULL; aet2_rd_clr_fac_process_mask(txidx); } } } #endif /* ...of AET2_IS_PRESENT */ gtkwave-3.3.86/src/rc.h0000664000175000017500000000772613166335473014164 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2016. * * 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. */ #include "globals.h" #ifndef WAVE_RC_H #define WAVE_RC_H struct rc_entry { char *name; int (*func)(char *); }; struct rc_override /* used for --rcvar command line option */ { struct rc_override *next; char *str; }; void read_rc_file(char *override_rc); int insert_rc_variable(char *str); int get_rgb_from_name(char *str); GdkGC *get_gc_from_name(char *str); int f_accel (char *str); int f_alt_hier_delimeter (char *str); int f_append_vcd_hier (char *str); int f_atomic_vectors (char *str); int f_autocoalesce (char *str); int f_autocoalesce_reversal (char *str); int f_autoname_bundles (char *str); int f_color_0 (char *str); int f_color_1 (char *str); int f_color_1fill (char *str); int f_color_back (char *str); int f_color_baseline (char *str); int f_color_black (char *str); int f_color_dash (char *str); int f_color_dashfill (char *str); int f_color_dkblue (char *str); int f_color_brkred (char *str); int f_color_ltblue (char *str); int f_color_gmstrd (char *str); int f_color_dkgray (char *str); int f_color_grid (char *str); int f_color_grid2 (char *str); int f_color_high (char *str); int f_color_highfill (char *str); int f_color_low (char *str); int f_color_ltgray (char *str); int f_color_mark (char *str); int f_color_mdgray (char *str); int f_color_mid (char *str); int f_color_normal (char *str); int f_color_time (char *str); int f_color_timeb (char *str); int f_color_trans (char *str); int f_color_u (char *str); int f_color_ufill (char *str); int f_color_umark (char *str); int f_color_value (char *str); int f_color_vbox (char *str); int f_color_vtrans (char *str); int f_color_w (char *str); int f_color_wfill (char *str); int f_color_white (char *str); int f_color_x (char *str); int f_color_xfill (char *str); int f_constant_marker_update (char *str); int f_convert_to_reals (char *str); int f_cursor_snap (char *str); int f_clipboard_mouseover (char *str); int f_disable_mouseover (char *str); int f_disable_tooltips (char *str); int f_do_initial_zoom_fit (char *str); int f_dynamic_resizing (char *str); int f_enable_fast_exit (char *str); int f_enable_ghost_marker (char *str); int f_enable_horiz_grid (char *str); int f_enable_vcd_autosave (char *str); int f_enable_vert_grid (char *str); int f_fill_waveform (char *str); int f_fontname_logfile (char *str); int f_fontname_signals (char *str); int f_fontname_waves (char *str); int f_force_toolbars (char *str); int f_hide_sst (char *str); int f_hier_delimeter (char *str); int f_hier_grouping (char *str); int f_hier_max_level (char *str); int f_hpane_pack (char *str); int f_ignore_savefile_pos (char *str); int f_ignore_savefile_size (char *str); int f_initial_window_x (char *str); int f_initial_window_xpos (char *str); int f_initial_window_y (char *str); int f_initial_window_ypos (char *str); int f_left_justify_sigs (char *str); int f_lxt_clock_compress_to_z (char *str); int f_page_divisor (char *str); int f_ps_maxveclen (char *str); int f_show_base_symbols (char *str); int f_show_grid (char *str); int f_splash_disable (char *str); int f_sst_expanded (char *str); int f_use_big_fonts (char *str); int f_use_frequency_display (char *str); int f_use_full_precision (char *str); int f_use_maxtime_display (char *str); int f_use_nonprop_fonts (char *str); int f_use_roundcaps (char *str); int f_use_scrollbar_only (char *str); int f_vcd_explicit_zero_subscripts (char *str); int f_vcd_preserve_glitches (char *str); int f_vcd_warning_filesize (char *str); int f_vector_padding (char *str); int f_vlist_compression (char *str); int f_wave_scrolling (char *str); int f_zoom_base (char *str); int f_zoom_center (char *str); int f_zoom_pow10_snap (char *str); #endif gtkwave-3.3.86/src/liblzma/0000775000175000017500000000000013166335473015025 5ustar bybellbybellgtkwave-3.3.86/src/liblzma/Makefile.am0000664000175000017500000000022213166335473017055 0ustar bybellbybell## -*- makefile -*- ## noinst_LIBRARIES= libgwlzma.a AM_CFLAGS= $(LIBXZ_CFLAGS) libgwlzma_a_SOURCES= LzmaLib.c LzmaLib.h EXTRA_DIST= lzma.txt gtkwave-3.3.86/src/liblzma/LzmaLib.c0000664000175000017500000001777213166335473016541 0ustar bybellbybell/* * Copyright (c) 2009 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include #include #include #ifdef _WAVE_HAVE_XZ #include "lzma.h" #endif #include "LzmaLib.h" #ifndef _MSC_VER #include #endif #define LZMA_BLOCK_LEN (4*1024*1024) #define LZMA_DECODER_SIZE (256*1024*1024) enum lzma_state_t { LZMA_STATE_WRITE, LZMA_STATE_READ_ERROR, LZMA_STATE_READ_INIT, LZMA_STATE_READ_GETBLOCK, LZMA_STATE_READ_GETBYTES }; struct lzma_handle_t { int fd; unsigned int offs, blklen; unsigned int depth; enum lzma_state_t state; unsigned int blksiz; unsigned char *mem, *dmem; size_t write_cnt, read_cnt; }; static void LZMA_write_varint(struct lzma_handle_t *h, size_t v) { size_t nxt; unsigned char buf[16]; unsigned char *pnt = buf; while((nxt = v>>7)) { *(pnt++) = (v&0x7f); v = nxt; } *(pnt++) = (v&0x7f) | 0x80; h->write_cnt += write(h->fd, buf, pnt-buf); } #ifdef _WAVE_HAVE_XZ /* ifdef is warnings fix if XZ is not present */ static size_t LZMA_read_varint(struct lzma_handle_t *h) { unsigned char buf[16]; int idx = 0; size_t rc = 0; for(;;) { h->read_cnt += read(h->fd, buf+idx, 1); if(buf[idx++] & 0x80) break; } do { idx--; rc <<= 7; rc |= (buf[idx] & 0x7f); } while(idx); return(rc); } #endif static size_t LZMA_write_compress(struct lzma_handle_t *h, unsigned char *mem, size_t len) { #ifdef _WAVE_HAVE_XZ size_t srclen = len; size_t destlen = h->blksiz; lzma_stream strm = LZMA_STREAM_INIT; lzma_options_lzma preset; lzma_ret lrc; size_t wcnt; lzma_lzma_preset(&preset, h->depth); lrc = lzma_alone_encoder(&strm, &preset); if(lrc != LZMA_OK) { fprintf(stderr, "Error in lzma_alone_encoder(), exiting!\n"); exit(255); } strm.next_in = mem; strm.avail_in = len; strm.next_out = h->dmem; strm.avail_out = destlen; lrc = lzma_code(&strm, LZMA_FINISH); lzma_end(&strm); if(((lrc == LZMA_OK)||(lrc == LZMA_STREAM_END))&&(strm.total_outfd, h->dmem, strm.total_out); h->write_cnt += wcnt; return(wcnt); } else { LZMA_write_varint(h, srclen); LZMA_write_varint(h, 0); wcnt = write(h->fd, mem, len); h->write_cnt += wcnt; return(wcnt); } #else (void)h; (void)mem; (void)len; fprintf(stderr, "LZMA support was not compiled into this executable, sorry.\n"); exit(255); #endif } void *LZMA_fdopen(int fd, const char *mode) { static const char z7[] = "z7"; struct lzma_handle_t *h = calloc(1, sizeof(struct lzma_handle_t)); /* scan-build flagged malloc, add to h->write_cnt below */ h->fd = fd; h->offs = 0; h->depth = 4; if(mode[0] == 'w') { h->blksiz = LZMA_BLOCK_LEN; h->mem = malloc(h->blksiz); h->dmem = malloc(h->blksiz); if(mode[1]) { if(isdigit((int)(unsigned char)mode[1])) { h->depth = mode[1] - '0'; } else if(mode[2]) { if(isdigit((int)(unsigned char)mode[2])) { h->depth = mode[2] - '0'; } } } h->state = LZMA_STATE_WRITE; h->write_cnt += write(h->fd, z7, 2); return(h); } else if(mode[0] == 'r') { h->blksiz = 0; /* allocate as needed in the reader */ h->mem = NULL; h->dmem = NULL; h->state = LZMA_STATE_READ_INIT; return(h); } else { close(h->fd); free(h->dmem); free(h->mem); free(h); return(NULL); } } size_t LZMA_flush(void *handle) { struct lzma_handle_t *h = (struct lzma_handle_t *)handle; if((h) && (h->offs)) { LZMA_write_compress(h, h->mem, h->offs); h->offs = 0; } return(0); } void LZMA_close(void *handle) { struct lzma_handle_t *h = (struct lzma_handle_t *)handle; if(h) { if(h->state == LZMA_STATE_WRITE) { LZMA_flush(h); LZMA_write_varint(h, 0); } if(h->dmem) { free(h->dmem); } if(h->mem) { free(h->mem); } close(h->fd); free(h); } } size_t LZMA_write(void *handle, void *mem, size_t len) { struct lzma_handle_t *h = (struct lzma_handle_t *)handle; if(h->state == LZMA_STATE_WRITE) { while((h)&&(len)) { if((h->offs + len) <= h->blksiz) { memcpy(h->mem + h->offs, mem, len); h->offs += len; break; } else { size_t new_len = h->blksiz - h->offs; if(new_len) { memcpy(h->mem + h->offs, mem, new_len); } LZMA_write_compress(h, h->mem, h->blksiz); h->offs = 0; len -= new_len; mem = ((char *)mem) + new_len; } } } return(len); } size_t LZMA_read(void *handle, void *mem, size_t len) { #ifdef _WAVE_HAVE_XZ struct lzma_handle_t *h = (struct lzma_handle_t *)handle; size_t rc = 0; char hdr[2] = {0, 0}; size_t srclen, dstlen; if(h) { top: switch(h->state) { case LZMA_STATE_READ_INIT: h->read_cnt += read(h->fd, hdr, 2); if((hdr[0] == 'z') && (hdr[1] == '7')) { h->state = LZMA_STATE_READ_GETBLOCK; } else { h->state = LZMA_STATE_READ_ERROR; } goto top; break; case LZMA_STATE_READ_GETBLOCK: dstlen = LZMA_read_varint(h); if(!dstlen) { return(0); } if(dstlen > h->blksiz) /* reallocate buffers if ones in stream data are larger */ { if(h->dmem) { free(h->dmem); } if(h->mem) { free(h->mem); } h->blksiz = dstlen; h->mem = malloc(h->blksiz); h->dmem = malloc(h->blksiz); } srclen = LZMA_read_varint(h); if(!srclen) { h->read_cnt += (rc = read(h->fd, h->mem, dstlen)); h->blklen = rc; h->offs = 0; } else { lzma_stream strm = LZMA_STREAM_INIT; lzma_ret lrc; h->read_cnt += (rc = read(h->fd, h->dmem, srclen)); lrc = lzma_alone_decoder(&strm, LZMA_DECODER_SIZE); if(lrc != LZMA_OK) { fprintf(stderr, "Error in lzma_alone_decoder(), exiting!\n"); exit(255); } strm.next_in = h->dmem; strm.avail_in = srclen; strm.next_out = h->mem; strm.avail_out = h->blksiz; lrc = lzma_code(&strm, LZMA_RUN); lzma_end(&strm); if((lrc == LZMA_OK)||(lrc == LZMA_STREAM_END)) { dstlen = strm.total_out; h->blklen = dstlen; h->offs = 0; } else { h->state = LZMA_STATE_READ_ERROR; goto top; } } if(len <= dstlen) { memcpy(mem, h->mem, len); h->offs = len; rc = len; h->state = LZMA_STATE_READ_GETBYTES; } else { memcpy(mem, h->mem, dstlen); rc = dstlen + LZMA_read(h, ((char *)mem) + dstlen, len - dstlen); } break; case LZMA_STATE_READ_GETBYTES: if((len + h->offs) < h->blklen) { memcpy(mem, h->mem + h->offs, len); h->offs += len; rc = len; } else if((len + h->offs) == h->blklen) { memcpy(mem, h->mem + h->offs, len); h->offs = 0; rc = len; h->state = LZMA_STATE_READ_GETBLOCK; } else { size_t cpylen = h->blklen - h->offs; memcpy(mem, h->mem + h->offs, cpylen); h->state = LZMA_STATE_READ_GETBLOCK; rc = cpylen + LZMA_read(h, ((char *)mem) + cpylen, len - cpylen); } break; case LZMA_STATE_READ_ERROR: default: break; } } return(rc); #else (void)handle; (void)mem; (void)len; fprintf(stderr, "LZMA support was not compiled into this executable, sorry.\n"); exit(255); #endif } gtkwave-3.3.86/src/liblzma/LzmaLib.h0000664000175000017500000000270513166335473016534 0ustar bybellbybell/* * Copyright (c) 2009-2010 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef LIBLZMA_H #define LIBLZMA_H #include #ifdef __cplusplus extern "C" { #endif void *LZMA_fdopen(int fd, const char *mode); void LZMA_close(void *handle); size_t LZMA_flush(void *handle); size_t LZMA_write(void *handle, void *mem, size_t len); size_t LZMA_read(void *handle, void *mem, size_t len); #ifdef __cplusplus } #endif #endif gtkwave-3.3.86/src/liblzma/lzma.txt0000775000175000017500000000036313166335473016536 0ustar bybellbybellLZMA has been replaced with XZ. VZT files created using the old LZMA compression (-z 2) are no longer compatible with new XZ file format. In order to read them, convert them to VCD using a version of gtkwave earlier than 3.3.0. 23dec09 -ajb gtkwave-3.3.86/src/liblzma/Makefile.in0000664000175000017500000004173113166335473017100 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = src/liblzma DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libgwlzma_a_AR = $(AR) $(ARFLAGS) libgwlzma_a_LIBADD = am_libgwlzma_a_OBJECTS = LzmaLib.$(OBJEXT) libgwlzma_a_OBJECTS = $(am_libgwlzma_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgwlzma_a_SOURCES) DIST_SOURCES = $(libgwlzma_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libgwlzma.a AM_CFLAGS = $(LIBXZ_CFLAGS) libgwlzma_a_SOURCES = LzmaLib.c LzmaLib.h EXTRA_DIST = lzma.txt all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/liblzma/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/liblzma/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libgwlzma.a: $(libgwlzma_a_OBJECTS) $(libgwlzma_a_DEPENDENCIES) $(EXTRA_libgwlzma_a_DEPENDENCIES) $(AM_V_at)-rm -f libgwlzma.a $(AM_V_AR)$(libgwlzma_a_AR) libgwlzma.a $(libgwlzma_a_OBJECTS) $(libgwlzma_a_LIBADD) $(AM_V_at)$(RANLIB) libgwlzma.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LzmaLib.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/src/mouseover_sigs.c0000664000175000017500000003151213166335473016612 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2006-2016. * * 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. */ /* AIX may need this for alloca to work */ #if defined _AIX #pragma alloca #endif #include "globals.h" #include #include #include #include #include #include "main.h" #include "currenttime.h" #include "color.h" #include "bsearch.h" #include "hierpack.h" WAVE_NODEVARTYPE_STR /************************************************************************************************/ static char *get_fullname(Trptr t) { char *s = NULL; if(!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { if(t->vector==TRUE) { s = strdup_2(t->n.vec->bvname); } else { if(!HasAlias(t)) { int flagged = HIER_DEPACK_ALLOC; s = hier_decompress_flagged(t->n.nd->nname, &flagged); if(!flagged) s = strdup_2(s); } } } return(s); } static int determine_trace_flags(Trptr t, char *ch) { unsigned int flags = t->flags; int pos = 0; /* [0] */ if((flags & TR_SIGNED) != 0) { ch[pos++] = '+'; } /* [1] */ if((flags & TR_HEX) != 0) { ch[pos++] = 'X'; } else if ((flags & TR_ASCII) != 0) { ch[pos++] = 'A'; } else if ((flags & TR_DEC) != 0) { ch[pos++] = 'D'; } else if ((flags & TR_BIN) != 0) { ch[pos++] = 'B'; } else if ((flags & TR_OCT) != 0) { ch[pos++] = 'O'; } /* [2] */ if((flags & TR_RJUSTIFY) != 0) { ch[pos++] = 'J'; } /* [3] */ if((flags & TR_INVERT) != 0) { ch[pos++] = '~'; } /* [4] */ if((flags & TR_REVERSE) != 0) { ch[pos++] = 'V'; } /* [5] */ if((flags & (TR_ANALOG_STEP|TR_ANALOG_INTERPOLATED)) == (TR_ANALOG_STEP|TR_ANALOG_INTERPOLATED)) { ch[pos++] = '*'; } else if((flags & TR_ANALOG_STEP) != 0) { ch[pos++] = 'S'; } else if((flags & TR_ANALOG_INTERPOLATED) != 0) { ch[pos++] = 'I'; } /* [6] */ if((flags & TR_REAL) != 0) { ch[pos++] = 'R'; } /* [7] */ if((flags & TR_REAL2BITS) != 0) { ch[pos++] = 'r'; } /* [8] */ if((flags & TR_ZEROFILL) != 0) { ch[pos++] = '0'; } else if((flags & TR_ONEFILL) != 0) { ch[pos++] = '1'; } /* [9] */ if((flags & TR_BINGRAY) != 0) { ch[pos++] = 'G'; } /* [10] */ if((flags & TR_GRAYBIN) != 0) { ch[pos++] = 'g'; } /* [11] */ if((flags & TR_FTRANSLATED) != 0) { ch[pos++] = 'F'; } /* [12] */ if((flags & TR_PTRANSLATED) != 0) { ch[pos++] = 'P'; } /* [13] */ if((flags & TR_TTRANSLATED) != 0) { ch[pos++] = 'T'; } /* [14] */ if((flags & TR_POPCNT) != 0) { ch[pos++] = 'p'; } /* [15] */ if((flags & TR_FPDECSHIFT) != 0) { int ln = sprintf(ch+pos, "s(%d)", t->t_fpdecshift); pos += ln; } /* [16+] */ ch[pos] = 0; if(!t->vector) { int vartype = t->n.nd->vartype; if((vartype < 0) || (vartype > ND_VARTYPE_MAX)) { vartype = 0; } if(vartype) { ch[pos++] = ':'; strcpy(ch + pos, vartype_strings[vartype]); pos += strlen(vartype_strings[vartype]); ch[++pos] = 0; } } return(pos); } /************************************************************************************************/ static void local_trace_asciival(Trptr t, char *tname, TimeType tim, int *nmaxlen, int *vmaxlen, char **asciivalue) { int len=0; int vlen=0; if(tname) { len=font_engine_string_measure(GLOBALS->wavefont, tname); if((tim!=-1)&&(!(t->flags&TR_EXCLUDE))) { GLOBALS->shift_timebase=t->shift; if(t->vector) { char *str; vptr v; v=bsearch_vector(t->n.vec,tim - t->shift); str=convert_ascii(t,v); if(str) { vlen=font_engine_string_measure(GLOBALS->wavefont,str); *asciivalue=str; } else { vlen=0; *asciivalue=NULL; } } else { char *str; hptr h_ptr; if((h_ptr=bsearch_node(t->n.nd,tim - t->shift))) { if(!t->n.nd->extvals) { unsigned char h_val = h_ptr->v.h_val; if(t->n.nd->vartype == ND_VCD_EVENT) { h_val = (h_ptr->time >= GLOBALS->tims.first) && ((GLOBALS->tims.marker-GLOBALS->shift_timebase) == h_ptr->time) ? AN_1 : AN_0; /* generate impulse */ } str=(char *)calloc_2(1,2*sizeof(char)); if(t->flags&TR_INVERT) { str[0]=AN_STR_INV[h_val]; } else { str[0]=AN_STR[h_val]; } *asciivalue=str; vlen=font_engine_string_measure(GLOBALS->wavefont,str); } else { if(h_ptr->flags&HIST_REAL) { if(!(h_ptr->flags&HIST_STRING)) { #ifdef WAVE_HAS_H_DOUBLE str=convert_ascii_real(t, &h_ptr->v.h_double); #else str=convert_ascii_real(t, (double *)h_ptr->v.h_vector); #endif } else { str=convert_ascii_string((char *)h_ptr->v.h_vector); } } else { str=convert_ascii_vec(t,h_ptr->v.h_vector); } if(str) { vlen=font_engine_string_measure(GLOBALS->wavefont,str); *asciivalue=str; } else { vlen=0; *asciivalue=NULL; } } } else { vlen=0; *asciivalue=NULL; } } } } *nmaxlen = len; *vmaxlen = vlen; } /************************************************************************************************/ static gint expose_event(GtkWidget *widget, GdkEventExpose *event) { gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE(widget)], GLOBALS->mo_pixmap_mouseover_c_1, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); return(FALSE); } static void create_mouseover_sigs(gint x, gint y, gint width, gint height) { GLOBALS->mo_width_mouseover_c_1 = width; GLOBALS->mo_height_mouseover_c_1 = height; GLOBALS->mouseover_mouseover_c_1 = gtk_window_new(GTK_WINDOW_POPUP); gtk_window_set_default_size(GTK_WINDOW (GLOBALS->mouseover_mouseover_c_1), width, height); #ifdef WAVE_USE_GTK2 gtk_window_set_type_hint(GTK_WINDOW(GLOBALS->mouseover_mouseover_c_1), GDK_WINDOW_TYPE_HINT_SPLASHSCREEN); gtk_window_move(GTK_WINDOW(GLOBALS->mouseover_mouseover_c_1), x, y); #endif GLOBALS->mo_area_mouseover_c_1=gtk_drawing_area_new(); gtk_container_add(GTK_CONTAINER(GLOBALS->mouseover_mouseover_c_1), GLOBALS->mo_area_mouseover_c_1); gtk_widget_show(GLOBALS->mo_area_mouseover_c_1); gtk_widget_show(GLOBALS->mouseover_mouseover_c_1); #ifndef WAVE_USE_GTK2 gtk_window_reposition(GTK_WINDOW(GLOBALS->mouseover_mouseover_c_1), x, y); /* cuts down on GTK+-1.2 visual noise by moving it here */ #endif GLOBALS->mo_pixmap_mouseover_c_1 = gdk_pixmap_new(GLOBALS->mo_area_mouseover_c_1->window, GLOBALS->mouseover_mouseover_c_1->allocation.width, GLOBALS->mouseover_mouseover_c_1->allocation.height, -1); if(!GLOBALS->mo_dk_gray_mouseover_c_1) GLOBALS->mo_dk_gray_mouseover_c_1 = alloc_color(GLOBALS->mo_area_mouseover_c_1, 0x00cccccc, NULL); if(!GLOBALS->mo_black_mouseover_c_1) GLOBALS->mo_black_mouseover_c_1 = alloc_color(GLOBALS->mo_area_mouseover_c_1, 0x00000000, NULL); gdk_draw_rectangle(GLOBALS->mo_pixmap_mouseover_c_1, GLOBALS->mo_dk_gray_mouseover_c_1, TRUE, 0,0, GLOBALS->mo_width_mouseover_c_1, GLOBALS->mo_height_mouseover_c_1); gdk_draw_rectangle(GLOBALS->mo_pixmap_mouseover_c_1, GLOBALS->mo_black_mouseover_c_1, TRUE, 1,1, GLOBALS->mo_width_mouseover_c_1-2, GLOBALS->mo_height_mouseover_c_1-2); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->mo_area_mouseover_c_1), "expose_event",GTK_SIGNAL_FUNC(expose_event), NULL); } #define MOUSEOVER_BREAKSIZE (100) void move_mouseover_sigs(Trptr t, gint xin, gint yin, TimeType tim) { gint xd = 0, yd = 0; char *asciivalue = NULL; int nmaxlen = 0, vmaxlen = 0; int totalmax = 0; int name_charlen = 0, value_charlen = 0; int num_info_rows = 2; char *flagged_name = NULL; char *alternate_name = NULL; int fh; char flag_string[65]; char *tname = NULL; if(GLOBALS->disable_mouseover) { if(GLOBALS->mouseover_mouseover_c_1) { gtk_widget_destroy(GLOBALS->mouseover_mouseover_c_1); GLOBALS->mouseover_mouseover_c_1 = NULL; gdk_pixmap_unref(GLOBALS->mo_pixmap_mouseover_c_1); GLOBALS->mo_pixmap_mouseover_c_1 = NULL; } goto bot; } fh = GLOBALS->wavefont->ascent+GLOBALS->wavefont->descent; if(t && (tname = get_fullname(t))) { local_trace_asciival(t, tname, tim, &nmaxlen, &vmaxlen, &asciivalue); value_charlen = asciivalue ? strlen(asciivalue) : 0; #ifdef WAVE_USE_GTK2 if(GLOBALS->clipboard_mouseover) { GdkDisplay *g = gdk_display_get_default(); GtkClipboard *clip = gtk_clipboard_get_for_display (g, GDK_SELECTION_CLIPBOARD); /* GDK_SELECTION_PRIMARY is middle mouse button */ gtk_clipboard_set_text (clip, asciivalue ? asciivalue : "", value_charlen); } #endif name_charlen = tname ? strlen(tname) : 0; if(name_charlen) { int len = determine_trace_flags(t, flag_string); flagged_name = malloc_2(name_charlen + 1 + len + 1); memcpy(flagged_name, tname, name_charlen); flagged_name[name_charlen] = ' '; strcpy(flagged_name+name_charlen+1, flag_string); name_charlen += (len + 1); } if(name_charlen > MOUSEOVER_BREAKSIZE) { alternate_name = malloc_2(MOUSEOVER_BREAKSIZE + 1); strcpy(alternate_name, "..."); strcpy(alternate_name + 3, flagged_name + name_charlen - (MOUSEOVER_BREAKSIZE - 3)); nmaxlen=font_engine_string_measure(GLOBALS->wavefont, alternate_name); } else { nmaxlen=font_engine_string_measure(GLOBALS->wavefont, flagged_name); } if(value_charlen > MOUSEOVER_BREAKSIZE) { char breakbuf[MOUSEOVER_BREAKSIZE+1]; int i, localmax; num_info_rows = (value_charlen + (MOUSEOVER_BREAKSIZE-1)) / MOUSEOVER_BREAKSIZE; vmaxlen = 0; for(i=0;iwavefont, breakbuf); vmaxlen = (localmax > vmaxlen) ? localmax : vmaxlen; } num_info_rows++; } totalmax = (nmaxlen > vmaxlen) ? nmaxlen : vmaxlen; totalmax += 8; totalmax = (totalmax + 1) & ~1; /* round up to next even pixel count */ if((GLOBALS->mouseover_mouseover_c_1)&&((totalmax != GLOBALS->mo_width_mouseover_c_1)||((num_info_rows * fh + 7) != GLOBALS->mo_height_mouseover_c_1))) { gtk_widget_destroy(GLOBALS->mouseover_mouseover_c_1); GLOBALS->mouseover_mouseover_c_1 = NULL; gdk_pixmap_unref(GLOBALS->mo_pixmap_mouseover_c_1); GLOBALS->mo_pixmap_mouseover_c_1 = NULL; } } if((!t)||(!tname)||(yin<0)||(yin>GLOBALS->waveheight)) { if(GLOBALS->mouseover_mouseover_c_1) { gtk_widget_destroy(GLOBALS->mouseover_mouseover_c_1); GLOBALS->mouseover_mouseover_c_1 = NULL; gdk_pixmap_unref(GLOBALS->mo_pixmap_mouseover_c_1); GLOBALS->mo_pixmap_mouseover_c_1 = NULL; } goto bot; } if(!GLOBALS->mouseover_mouseover_c_1) { #ifdef WAVE_USE_GTK2 gdk_window_get_origin(GLOBALS->signalarea->window, &xd, &yd); #else gdk_window_get_deskrelative_origin(GLOBALS->signalarea->window, &xd, &yd); #endif create_mouseover_sigs(xin + xd + 8, yin + yd + 20, totalmax, num_info_rows * fh + 7); } else { #ifdef WAVE_USE_GTK2 gdk_window_get_origin(GLOBALS->signalarea->window, &xd, &yd); gtk_window_move(GTK_WINDOW(GLOBALS->mouseover_mouseover_c_1), xin + xd + 8, yin + yd + 20); #else gdk_window_get_deskrelative_origin(GLOBALS->signalarea->window, &xd, &yd); gtk_window_reposition(GTK_WINDOW(GLOBALS->mouseover_mouseover_c_1), xin + xd + 8, yin + yd + 20); #endif } gdk_draw_rectangle(GLOBALS->mo_pixmap_mouseover_c_1, GLOBALS->mo_dk_gray_mouseover_c_1, TRUE, 0,0, GLOBALS->mo_width_mouseover_c_1, GLOBALS->mo_height_mouseover_c_1); gdk_draw_rectangle(GLOBALS->mo_pixmap_mouseover_c_1, GLOBALS->mo_black_mouseover_c_1, TRUE, 1,1, GLOBALS->mo_width_mouseover_c_1-2, GLOBALS->mo_height_mouseover_c_1-2); font_engine_draw_string(GLOBALS->mo_pixmap_mouseover_c_1, GLOBALS->wavefont, GLOBALS->mo_dk_gray_mouseover_c_1, 4, fh + 2, alternate_name ? alternate_name : flagged_name); if(num_info_rows == 2) { if(asciivalue) font_engine_draw_string(GLOBALS->mo_pixmap_mouseover_c_1, GLOBALS->wavefont, GLOBALS->mo_dk_gray_mouseover_c_1, 4, 2*fh+2, asciivalue); } else { char breakbuf[MOUSEOVER_BREAKSIZE+1]; int i; num_info_rows--; for(i=0;imo_pixmap_mouseover_c_1, GLOBALS->wavefont, GLOBALS->mo_dk_gray_mouseover_c_1, 4, ((2+i)*fh)+2, breakbuf); } } gdk_window_raise(GLOBALS->mouseover_mouseover_c_1->window); gdk_draw_pixmap(GLOBALS->mo_area_mouseover_c_1->window, GLOBALS->mo_area_mouseover_c_1->style->fg_gc[GTK_WIDGET_STATE(GLOBALS->mouseover_mouseover_c_1)],GLOBALS->mo_pixmap_mouseover_c_1,0,0,0,0,GLOBALS->mo_width_mouseover_c_1, GLOBALS->mo_height_mouseover_c_1); bot: if(asciivalue) { free_2(asciivalue); } if(alternate_name) { free_2(alternate_name); } if(flagged_name) { free_2(flagged_name); } if(tname) { free_2(tname); } } gtkwave-3.3.86/src/ae2.h0000664000175000017500000000220113166335473014206 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2004-2011. * * 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. */ #ifndef WAVE_AE2RDR_H #define WAVE_AE2RDR_H #ifdef HAVE_INTTYPES_H #include #endif #include "vcd.h" #include "lx2.h" #ifdef AET2_IS_PRESENT #include #endif #ifdef AET2_ALIASDB_IS_PRESENT #include #endif #define AET2_RDLOAD "AE2LOAD | " #define AE2_MAX_NAME_LENGTH 2048 #define AE2_MAXFACLEN 65536 #define AE2_MAX_ROWS 16384 #define WAVE_ADB_ALLOC_POOL_SIZE (1024 * 1024) #define WAVE_ADB_ALLOC_ALTREQ_SIZE (4 * 1024) #ifdef WAVE_USE_STRUCT_PACKING #pragma pack(push) #pragma pack(1) #endif struct ae2_ncycle_autosort { struct ae2_ncycle_autosort *next; }; #ifdef WAVE_USE_STRUCT_PACKING #pragma pack(pop) #endif TimeType ae2_main(char *fname, char *skip_start, char *skip_end); void import_ae2_trace(nptr np); void ae2_set_fac_process_mask(nptr np); void ae2_import_masked(void); #endif gtkwave-3.3.86/src/color.c0000664000175000017500000000441213166335473014656 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2011. * * 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. */ #include "globals.h" #include #include "color.h" #include "debug.h" /* * return graphics context with tuple's color or * a fallback context. Note that if tuple<0, * the fallback will be used! */ GdkGC *alloc_color(GtkWidget *widget, int tuple, GdkGC *fallback) { GdkColor color; GdkGC *gc; int red, green, blue; red= (tuple>>16)&0x000000ff; green=(tuple>>8) &0x000000ff; blue= (tuple) &0x000000ff; if(tuple>=0) if((gc=gdk_gc_new(widget->window))) { struct wave_gcchain_t *wg = calloc_2(1, sizeof(struct wave_gcchain_t)); color.red=red*(65535/255); color.blue=blue*(65535/255); color.green=green*(65535/255); color.pixel=(gulong)(tuple&0x00ffffff); gdk_color_alloc(gtk_widget_get_colormap(widget),&color); gdk_gc_set_foreground(gc,&color); wg->next = GLOBALS->wave_gcchain; /* remember allocated ones only, not fallbacks */ wg->gc = gc; GLOBALS->wave_gcchain = wg; return(gc); } return(fallback); } void dealloc_all_gcs(void) { struct wave_gcchain_t *wg = GLOBALS->wave_gcchain; while(wg) { if(wg->gc) { gdk_gc_destroy(wg->gc); wg->gc = NULL; } wg = wg->next; } } void set_alternate_gcs(GdkGC *ctx, GdkGC *ctx_fill) { GLOBALS->gc.gc_low_wavewindow_c_1 = ctx; GLOBALS->gc.gc_high_wavewindow_c_1 = ctx; GLOBALS->gc.gc_trans_wavewindow_c_1 = ctx; GLOBALS->gc.gc_0_wavewindow_c_1 = ctx; GLOBALS->gc.gc_1_wavewindow_c_1 = ctx; GLOBALS->gc.gc_vbox_wavewindow_c_1 = ctx; GLOBALS->gc.gc_vtrans_wavewindow_c_1 = ctx; if(!GLOBALS->keep_xz_colors) { GLOBALS->gc.gc_mid_wavewindow_c_1 = ctx; GLOBALS->gc.gc_highfill_wavewindow_c_1 = ctx_fill; GLOBALS->gc.gc_1fill_wavewindow_c_1 = ctx_fill; GLOBALS->gc.gc_xfill_wavewindow_c_1 = ctx_fill; GLOBALS->gc.gc_x_wavewindow_c_1 = ctx; GLOBALS->gc.gc_ufill_wavewindow_c_1 = ctx_fill; GLOBALS->gc.gc_u_wavewindow_c_1 = ctx; GLOBALS->gc.gc_wfill_wavewindow_c_1 = ctx_fill; GLOBALS->gc.gc_w_wavewindow_c_1 = ctx; GLOBALS->gc.gc_dashfill_wavewindow_c_1 = ctx_fill; GLOBALS->gc.gc_dash_wavewindow_c_1 = ctx; } } gtkwave-3.3.86/src/mouseover_sigs.h0000664000175000017500000000066413166335473016623 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010 * * 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. */ #ifndef WAVE_MOUSEOVER_SIGS_H #define WAVE_MOUSEOVER_SIGS_H void move_mouseover_sigs(Trptr t, gint xin, gint yin, TimeType tim); #endif gtkwave-3.3.86/src/vcd_recoder.c0000664000175000017500000025725513166335473016036 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2017. * * 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. */ /* * vcd.c 23jan99ajb * evcd parts 29jun99ajb * profiler optimizations 15jul99ajb * more profiler optimizations 25jan00ajb * finsim parameter fix 26jan00ajb * vector rechaining code 03apr00ajb * multiple var section code 06apr00ajb * fix for duplicate nets 19dec00ajb * support for alt hier seps 23dec00ajb * fix for rcs identifiers 16jan01ajb * coredump fix for bad VCD 04apr02ajb * min/maxid speedup 27feb03ajb * bugfix on min/maxid speedup 06jul03ajb * escaped hier modification 20feb06ajb * added real_parameter vartype 04aug06ajb * recoder using vlists 17aug06ajb * code cleanup 04sep06ajb * added in/out port vartype 31jan07ajb * use gperf for port vartypes 19feb07ajb * MTI SV implicit-var fix 05apr07ajb * MTI SV len=0 is real var 05apr07ajb * VCD fastloading 05mar09ajb */ #include #include "globals.h" #include "vcd.h" #include "vlist.h" #include "lx2.h" #include "hierpack.h" /**/ static void malform_eof_fix(void) { if(feof(GLOBALS->vcd_handle_vcd_recoder_c_2)) { memset(GLOBALS->vcdbuf_vcd_recoder_c_3, ' ', VCD_BSIZ); GLOBALS->vst_vcd_recoder_c_3=GLOBALS->vend_vcd_recoder_c_3; } } /**/ static void vlist_packer_emit_uv64(struct vlist_packer_t **vl, guint64 v) { guint64 nxt; while((nxt = v>>7)) { vlist_packer_alloc(*vl, v&0x7f); v = nxt; } vlist_packer_alloc(*vl, (v&0x7f) | 0x80); } static void vlist_packer_emit_utt(struct vlist_packer_t **vl, UTimeType v) { UTimeType nxt; while((nxt = v>>7)) { vlist_packer_alloc(*vl, v&0x7f); v = nxt; } vlist_packer_alloc(*vl, (v&0x7f) | 0x80); } static void vlist_packer_emit_uv32(struct vlist_packer_t **vl, unsigned int v) { unsigned int nxt; while((nxt = v>>7)) { vlist_packer_alloc(*vl, v&0x7f); v = nxt; } vlist_packer_alloc(*vl, (v&0x7f) | 0x80); } static void vlist_packer_emit_string(struct vlist_packer_t **vl, char *s) { while(*s) { vlist_packer_alloc(*vl, *s); s++; } vlist_packer_alloc(*vl, 0); } static void vlist_packer_emit_mvl9_string(struct vlist_packer_t **vl, char *s) { unsigned int recoded_bit; unsigned char which = 0; unsigned char accum = 0; while(*s) { switch(*s) { case '0': recoded_bit = AN_0; break; case '1': recoded_bit = AN_1; break; case 'x': case 'X': recoded_bit = AN_X; break; case 'z': case 'Z': recoded_bit = AN_Z; break; case 'h': case 'H': recoded_bit = AN_H; break; case 'u': case 'U': recoded_bit = AN_U; break; case 'w': case 'W': recoded_bit = AN_W; break; case 'l': case 'L': recoded_bit = AN_L; break; default: recoded_bit = AN_DASH; break; } if(!which) { accum = (recoded_bit << 4); which = 1; } else { accum |= recoded_bit; vlist_packer_alloc(*vl, accum); which = accum = 0; } s++; } recoded_bit = AN_MSK; /* XXX : this is assumed it is going to remain a 4 bit max quantity! */ if(!which) { accum = (recoded_bit << 4); } else { accum |= recoded_bit; } vlist_packer_alloc(*vl, accum); } /**/ static void vlist_emit_uv32(struct vlist_t **vl, unsigned int v) { unsigned int nxt; char *pnt; if(GLOBALS->vlist_prepack) { vlist_packer_emit_uv32((struct vlist_packer_t **)vl, v); return; } while((nxt = v>>7)) { pnt = vlist_alloc(vl, 1); *pnt = (v&0x7f); v = nxt; } pnt = vlist_alloc(vl, 1); *pnt = (v&0x7f) | 0x80; } static void vlist_emit_string(struct vlist_t **vl, char *s) { char *pnt; if(GLOBALS->vlist_prepack) { vlist_packer_emit_string((struct vlist_packer_t **)vl, s); return; } while(*s) { pnt = vlist_alloc(vl, 1); *pnt = *s; s++; } pnt = vlist_alloc(vl, 1); *pnt = 0; } static void vlist_emit_mvl9_string(struct vlist_t **vl, char *s) { char *pnt; unsigned int recoded_bit; unsigned char which; unsigned char accum; if(GLOBALS->vlist_prepack) { vlist_packer_emit_mvl9_string((struct vlist_packer_t **)vl, s); return; } which = accum = 0; while(*s) { switch(*s) { case '0': recoded_bit = AN_0; break; case '1': recoded_bit = AN_1; break; case 'x': case 'X': recoded_bit = AN_X; break; case 'z': case 'Z': recoded_bit = AN_Z; break; case 'h': case 'H': recoded_bit = AN_H; break; case 'u': case 'U': recoded_bit = AN_U; break; case 'w': case 'W': recoded_bit = AN_W; break; case 'l': case 'L': recoded_bit = AN_L; break; default: recoded_bit = AN_DASH; break; } if(!which) { accum = (recoded_bit << 4); which = 1; } else { accum |= recoded_bit; pnt = vlist_alloc(vl, 1); *pnt = accum; which = accum = 0; } s++; } recoded_bit = AN_MSK; /* XXX : this is assumed it is going to remain a 4 bit max quantity! */ if(!which) { accum = (recoded_bit << 4); } else { accum |= recoded_bit; } pnt = vlist_alloc(vl, 1); *pnt = accum; } /**/ static void write_fastload_time_section(void) { struct vlist_t *vlist; struct vlist_packer_t *vlist_p; /* emit blackout regions */ if(GLOBALS->blackout_regions) { struct blackout_region_t *bt = GLOBALS->blackout_regions; unsigned int bcnt = 0; while(bt) { bcnt++; bt = bt->next; } vlist_packer_emit_uv32((struct vlist_packer_t **)(void *)&GLOBALS->time_vlist_vcd_recoder_write, bcnt); bt = GLOBALS->blackout_regions; while(bt) { vlist_packer_emit_utt((struct vlist_packer_t **)(void *)&GLOBALS->time_vlist_vcd_recoder_write, bt->bstart); vlist_packer_emit_utt((struct vlist_packer_t **)(void *)&GLOBALS->time_vlist_vcd_recoder_write, bt->bend); bt = bt->next; } } else { vlist_packer_emit_uv32((struct vlist_packer_t **)(void *)&GLOBALS->time_vlist_vcd_recoder_write, 0); } vlist_p = (struct vlist_packer_t *)GLOBALS->time_vlist_vcd_recoder_write; vlist_packer_finalize(vlist_p); vlist = vlist_p->v; free_2(vlist_p); GLOBALS->time_vlist_vcd_recoder_write = vlist; vlist_freeze(&GLOBALS->time_vlist_vcd_recoder_write); } #ifdef HAVE_SYS_STAT_H static void write_fastload_header(struct stat *mystat, unsigned int finalize_cnt) #else static void write_fastload_header(unsigned int finalize_cnt) #endif { /* write out the trailer information for vcd fastload... vcd file size vcd last modification time number of finalize values number of variable-length integer values in the time table (GLOBALS->time_vlist_count_vcd_recoder_c_1) GLOBALS->time_vlist_vcd_recoder_write value deltas from GLOBALS->time_vlist_vcd_recoder_write and on though stepping through list generated by vlist_emit_finalize() */ struct vlist_packer_t *vlist_p = vlist_packer_create(); struct vlist_t *vlist_summary_index; struct vcdsymbol *v = GLOBALS->vcdsymroot_vcd_recoder_c_3; guint64 val = (guint64)(unsigned long)GLOBALS->time_vlist_vcd_recoder_write; guint64 nval; char buf[33]; char *pnt; memset(buf, 0, sizeof(buf)); /* scan-build */ #ifdef HAVE_SYS_STAT_H vlist_packer_emit_uv64(&vlist_p, (guint64)mystat->st_size); vlist_packer_emit_uv64(&vlist_p, (guint64)mystat->st_mtime); #else vlist_packer_emit_uv64(&vlist_p, (guint64)0); vlist_packer_emit_uv64(&vlist_p, (guint64)0); #endif vlist_packer_emit_uv32(&vlist_p, finalize_cnt); vlist_packer_emit_uv64(&vlist_p, GLOBALS->time_vlist_count_vcd_recoder_c_1); vlist_packer_emit_uv64(&vlist_p, val); val = 0; while(v) { nptr n = v->narray[0]; nval = (guint64)(unsigned long)n->mv.mvlfac_vlist; vlist_packer_emit_uv64(&vlist_p, nval - val); val = nval; v = v->next; } vlist_packer_finalize(vlist_p); vlist_summary_index = vlist_p->v; free_2(vlist_p); GLOBALS->time_vlist_vcd_recoder_write = vlist_summary_index; vlist_freeze(&vlist_summary_index); pnt = buf; val = (guint64)(unsigned long)vlist_summary_index; while((nval = val>>7)) { *(pnt++) = (val&0x7f); val = nval; } *(pnt++) = ((val&0x7f) | 0x80); do { pnt--; fputc((unsigned char)*pnt, GLOBALS->vlist_handle); } while(pnt != buf); fflush(GLOBALS->vlist_handle); } static int read_fastload_body(void) { char *depacked = GLOBALS->fastload_depacked; char *pnt = GLOBALS->fastload_current; int rc = 0; guint64 v = 0, vprev = 0; int shamt = 0; /* unsigned int num_finalize; */ /* scan-build */ unsigned int num_in_time_table, num_blackout_regions; guint64 time_vlist_vcd_recoder_write; struct vcdsymbol *vs; struct vlist_t *vl; unsigned int list_size; unsigned int i; struct blackout_region_t *bt_head = NULL, *bt_curr = NULL; v = 0; shamt = 0; do { v |= ((guint64)(*pnt & 0x7f)) << shamt; shamt += 7; } while(!(*(pnt++) & 0x80)); /* num_finalize = v; */ /* scan-build */ v = 0; shamt = 0; do { v |= ((guint64)(*pnt & 0x7f)) << shamt; shamt += 7; } while(!(*(pnt++) & 0x80)); GLOBALS->time_vlist_count_vcd_recoder_c_1 = num_in_time_table = v; v = 0; shamt = 0; do { v |= ((guint64)(*pnt & 0x7f)) << shamt; shamt += 7; } while(!(*(pnt++) & 0x80)); time_vlist_vcd_recoder_write = v; vs=GLOBALS->vcdsymroot_vcd_recoder_c_3; while(vs) { nptr n = vs->narray[0]; v = 0; shamt = 0; do { v |= ((guint64)(*pnt & 0x7f)) << shamt; shamt += 7; } while(!(*(pnt++) & 0x80)); v += vprev; vprev = v; n->mv.mvlfac_vlist = (struct vlist_t *)(intptr_t)(v); vs = vs->next; } vlist_packer_decompress_destroy((char *)depacked); GLOBALS->fastload_depacked = NULL; GLOBALS->fastload_current = NULL; /* now create the time table */ vl = (struct vlist_t *)(intptr_t)time_vlist_vcd_recoder_write; vlist_uncompress(&vl); depacked = pnt = (char *)vlist_packer_decompress(vl, &list_size); vlist_destroy(vl); vprev = 0; for(i=0;itime_vlist_vcd_recoder_c_1, 0); *tt = tim = (TimeType)v; if(!i) { GLOBALS->start_time_vcd_recoder_c_3=tim; } GLOBALS->current_time_vcd_recoder_c_3=GLOBALS->end_time_vcd_recoder_c_3=tim; } /* now process blackout regions */ v = 0; shamt = 0; do { v |= ((guint64)(*pnt & 0x7f)) << shamt; shamt += 7; } while(!(*(pnt++) & 0x80)); num_blackout_regions = v; if(num_blackout_regions) { for(i=0;inext = bt; bt_curr = bt; } v = 0; shamt = 0; do { v |= ((guint64)(*pnt & 0x7f)) << shamt; shamt += 7; } while(!(*(pnt++) & 0x80)); tim = v; bt->bstart = tim; v = 0; shamt = 0; do { v |= ((guint64)(*pnt & 0x7f)) << shamt; shamt += 7; } while(!(*(pnt++) & 0x80)); tim = v; bt->bend = tim; } GLOBALS->blackout_regions = bt_head; } vlist_packer_decompress_destroy((char *)depacked); return(rc); } #ifdef HAVE_SYS_STAT_H static int read_fastload_header(struct stat *st) #else static int read_fastload_header(void) #endif { int rc = 0; int fs_rc = fseeko(GLOBALS->vlist_handle, 0, SEEK_END); off_t ftlen = ftello(GLOBALS->vlist_handle); guint64 v = 0; int ch; int shamt = 0; unsigned char *depacked = NULL; struct vlist_t *vl; unsigned int list_size; unsigned char *pnt; #ifdef HAVE_SYS_STAT_H struct stat mystat; int stat_rc = stat(GLOBALS->loaded_file_name, &mystat); #endif if((fs_rc<0)||(!ftlen)) { goto bail; } do { ftlen--; fseeko(GLOBALS->vlist_handle, ftlen, SEEK_SET); ch = fgetc(GLOBALS->vlist_handle); if(ch == EOF) { errno = 0; goto bail; } v |= ((guint64)(ch & 0x7f)) << shamt; shamt += 7; } while(!(ch & 0x80)); vl = (struct vlist_t *)(intptr_t)v; vlist_uncompress(&vl); depacked = vlist_packer_decompress(vl, &list_size); vlist_destroy(vl); pnt = depacked; v = 0; shamt = 0; do { v |= ((guint64)(*pnt & 0x7f)) << shamt; shamt += 7; } while(!(*(pnt++) & 0x80)); #ifdef HAVE_SYS_STAT_H if((stat_rc)||(v != (guint64)mystat.st_size)) { goto bail; } #endif v = 0; shamt = 0; do { v |= ((guint64)(*pnt & 0x7f)) << shamt; shamt += 7; } while(!(*(pnt++) & 0x80)); #ifdef HAVE_SYS_STAT_H if(v != (guint64)st->st_mtime) { goto bail; } #endif rc = 1; GLOBALS->fastload_depacked = (char *)depacked; GLOBALS->fastload_current = (char *)pnt; bail: if(!rc) vlist_packer_decompress_destroy((char *)depacked); return(rc); } /**/ #undef VCD_BSEARCH_IS_PERFECT /* bsearch is imperfect under linux, but OK under AIX */ static void add_histent(TimeType time, struct Node *n, char ch, int regadd, char *vector); static void vcd_build_symbols(void); static void vcd_cleanup(void); static void evcd_strcpy(char *dst, char *src); /******************************************************************/ enum Tokens { T_VAR, T_END, T_SCOPE, T_UPSCOPE, T_COMMENT, T_DATE, T_DUMPALL, T_DUMPOFF, T_DUMPON, T_DUMPVARS, T_ENDDEFINITIONS, T_DUMPPORTS, T_DUMPPORTSOFF, T_DUMPPORTSON, T_DUMPPORTSALL, T_TIMESCALE, T_VERSION, T_VCDCLOSE, T_TIMEZERO, T_EOF, T_STRING, T_UNKNOWN_KEY }; static char *tokens[]={ "var", "end", "scope", "upscope", "comment", "date", "dumpall", "dumpoff", "dumpon", "dumpvars", "enddefinitions", "dumpports", "dumpportsoff", "dumpportson", "dumpportsall", "timescale", "version", "vcdclose", "timezero", "", "", "" }; #define NUM_TOKENS 19 #define T_GET tok=get_token();if((tok==T_END)||(tok==T_EOF))break; /******************************************************************/ static unsigned int vcdid_hash(char *s, int len) { unsigned int val=0; int i; s+=(len-1); for(i=0;iid)); } /* * actual bsearch */ static struct vcdsymbol *bsearch_vcd(char *key, int len) { struct vcdsymbol **v; struct vcdsymbol *t; if(GLOBALS->indexed_vcd_recoder_c_3) { unsigned int hsh = vcdid_hash(key, len); if((hsh>=GLOBALS->vcd_minid_vcd_recoder_c_3)&&(hsh<=GLOBALS->vcd_maxid_vcd_recoder_c_3)) { return(GLOBALS->indexed_vcd_recoder_c_3[hsh-GLOBALS->vcd_minid_vcd_recoder_c_3]); } return(NULL); } if(GLOBALS->sorted_vcd_recoder_c_3) { v=(struct vcdsymbol **)bsearch(key, GLOBALS->sorted_vcd_recoder_c_3, GLOBALS->numsyms_vcd_recoder_c_3, sizeof(struct vcdsymbol *), vcdsymbsearchcompare); if(v) { #ifndef VCD_BSEARCH_IS_PERFECT for(;;) { t=*v; if((v==GLOBALS->sorted_vcd_recoder_c_3)||(strcmp((*(--v))->id, key))) { return(t); } } #else return(*v); #endif } else { return(NULL); } } else { if(!GLOBALS->err_vcd_recoder_c_3) { fprintf(stderr, "Near byte %d, VCD search table NULL..is this a VCD file?\n", (int)(GLOBALS->vcdbyteno_vcd_recoder_c_3+(GLOBALS->vst_vcd_recoder_c_3-GLOBALS->vcdbuf_vcd_recoder_c_3))); GLOBALS->err_vcd_recoder_c_3=1; } return(NULL); } } /* * sort on vcdsymbol pointers */ static int vcdsymcompare(const void *s1, const void *s2) { struct vcdsymbol *v1, *v2; v1=*((struct vcdsymbol **)s1); v2=*((struct vcdsymbol **)s2); return(strcmp(v1->id, v2->id)); } /* * create sorted (by id) table */ static void create_sorted_table(void) { struct vcdsymbol *v; struct vcdsymbol **pnt; unsigned int vcd_distance; if(GLOBALS->sorted_vcd_recoder_c_3) { free_2(GLOBALS->sorted_vcd_recoder_c_3); /* this means we saw a 2nd enddefinition chunk! */ GLOBALS->sorted_vcd_recoder_c_3=NULL; } if(GLOBALS->indexed_vcd_recoder_c_3) { free_2(GLOBALS->indexed_vcd_recoder_c_3); GLOBALS->indexed_vcd_recoder_c_3=NULL; } if(GLOBALS->numsyms_vcd_recoder_c_3) { vcd_distance = GLOBALS->vcd_maxid_vcd_recoder_c_3 - GLOBALS->vcd_minid_vcd_recoder_c_3 + 1; if((vcd_distance <= VCD_INDEXSIZ)||(!GLOBALS->vcd_hash_kill)) { GLOBALS->indexed_vcd_recoder_c_3 = (struct vcdsymbol **)calloc_2(vcd_distance, sizeof(struct vcdsymbol *)); /* printf("%d symbols span ID range of %d, using indexing... hash_kill = %d\n", GLOBALS->numsyms_vcd_recoder_c_3, vcd_distance, GLOBALS->vcd_hash_kill); */ v=GLOBALS->vcdsymroot_vcd_recoder_c_3; while(v) { if(!GLOBALS->indexed_vcd_recoder_c_3[v->nid - GLOBALS->vcd_minid_vcd_recoder_c_3]) GLOBALS->indexed_vcd_recoder_c_3[v->nid - GLOBALS->vcd_minid_vcd_recoder_c_3] = v; v=v->next; } } else { pnt=GLOBALS->sorted_vcd_recoder_c_3=(struct vcdsymbol **)calloc_2(GLOBALS->numsyms_vcd_recoder_c_3, sizeof(struct vcdsymbol *)); v=GLOBALS->vcdsymroot_vcd_recoder_c_3; while(v) { *(pnt++)=v; v=v->next; } qsort(GLOBALS->sorted_vcd_recoder_c_3, GLOBALS->numsyms_vcd_recoder_c_3, sizeof(struct vcdsymbol *), vcdsymcompare); } } } /******************************************************************/ static unsigned int vlist_emit_finalize(void) { struct vcdsymbol *v /* , *vprime */; /* scan-build */ struct vlist_t *vlist; char vlist_prepack = GLOBALS->vlist_prepack; int cnt = 0; v=GLOBALS->vcdsymroot_vcd_recoder_c_3; while(v) { nptr n = v->narray[0]; set_vcd_vartype(v, n); if(n->mv.mvlfac_vlist) { if(vlist_prepack) { vlist_packer_finalize(n->mv.mvlfac_packer_vlist); vlist = n->mv.mvlfac_packer_vlist->v; free_2(n->mv.mvlfac_packer_vlist); n->mv.mvlfac_vlist = vlist; vlist_freeze(&n->mv.mvlfac_vlist); } else { vlist_freeze(&n->mv.mvlfac_vlist); } } else { n->mv.mvlfac_vlist = vlist_prepack ? ((struct vlist_t *)vlist_packer_create()) : vlist_create(sizeof(char)); if((/* vprime= */ bsearch_vcd(v->id, strlen(v->id)))==v) /* hash mish means dup net */ /* scan-build */ { switch(v->vartype) { case V_REAL: vlist_emit_uv32(&n->mv.mvlfac_vlist, 'R'); vlist_emit_uv32(&n->mv.mvlfac_vlist, (unsigned int)v->vartype); vlist_emit_uv32(&n->mv.mvlfac_vlist, (unsigned int)v->size); vlist_emit_uv32(&n->mv.mvlfac_vlist, 0); vlist_emit_string(&n->mv.mvlfac_vlist, "NaN"); break; case V_STRINGTYPE: vlist_emit_uv32(&n->mv.mvlfac_vlist, 'S'); vlist_emit_uv32(&n->mv.mvlfac_vlist, (unsigned int)v->vartype); vlist_emit_uv32(&n->mv.mvlfac_vlist, (unsigned int)v->size); vlist_emit_uv32(&n->mv.mvlfac_vlist, 0); vlist_emit_string(&n->mv.mvlfac_vlist, "UNDEF"); break; default: if(v->size==1) { vlist_emit_uv32(&n->mv.mvlfac_vlist, (unsigned int)'0'); vlist_emit_uv32(&n->mv.mvlfac_vlist, (unsigned int)v->vartype); vlist_emit_uv32(&n->mv.mvlfac_vlist, RCV_X); } else { vlist_emit_uv32(&n->mv.mvlfac_vlist, 'B'); vlist_emit_uv32(&n->mv.mvlfac_vlist, (unsigned int)v->vartype); vlist_emit_uv32(&n->mv.mvlfac_vlist, (unsigned int)v->size); vlist_emit_uv32(&n->mv.mvlfac_vlist, 0); vlist_emit_mvl9_string(&n->mv.mvlfac_vlist, "x"); } break; } } if(vlist_prepack) { vlist_packer_finalize(n->mv.mvlfac_packer_vlist); vlist = n->mv.mvlfac_packer_vlist->v; free_2(n->mv.mvlfac_packer_vlist); n->mv.mvlfac_vlist = vlist; vlist_freeze(&n->mv.mvlfac_vlist); } else { vlist_freeze(&n->mv.mvlfac_vlist); } } v=v->next; cnt++; } return(cnt); } /******************************************************************/ /* * single char get inlined/optimized */ static void getch_alloc(void) { GLOBALS->vend_vcd_recoder_c_3=GLOBALS->vst_vcd_recoder_c_3=GLOBALS->vcdbuf_vcd_recoder_c_3=(char *)calloc_2(1,VCD_BSIZ); } static void getch_free(void) { free_2(GLOBALS->vcdbuf_vcd_recoder_c_3); GLOBALS->vcdbuf_vcd_recoder_c_3=GLOBALS->vst_vcd_recoder_c_3=GLOBALS->vend_vcd_recoder_c_3=NULL; } static int getch_fetch(void) { size_t rd; errno = 0; if(feof(GLOBALS->vcd_handle_vcd_recoder_c_2)) return(-1); GLOBALS->vcdbyteno_vcd_recoder_c_3+=(GLOBALS->vend_vcd_recoder_c_3-GLOBALS->vcdbuf_vcd_recoder_c_3); rd=fread(GLOBALS->vcdbuf_vcd_recoder_c_3, sizeof(char), VCD_BSIZ, GLOBALS->vcd_handle_vcd_recoder_c_2); GLOBALS->vend_vcd_recoder_c_3=(GLOBALS->vst_vcd_recoder_c_3=GLOBALS->vcdbuf_vcd_recoder_c_3)+rd; if((!rd)||(errno)) return(-1); if(GLOBALS->vcd_fsiz_vcd_recoder_c_2) { splash_sync(GLOBALS->vcdbyteno_vcd_recoder_c_3, GLOBALS->vcd_fsiz_vcd_recoder_c_2); /* gnome 2.18 seems to set errno so splash moved here... */ } return((int)(*GLOBALS->vst_vcd_recoder_c_3)); } static inline signed char getch(void) { signed char ch = (GLOBALS->vst_vcd_recoder_c_3!=GLOBALS->vend_vcd_recoder_c_3)?((int)(*GLOBALS->vst_vcd_recoder_c_3)):(getch_fetch()); GLOBALS->vst_vcd_recoder_c_3++; return(ch); } static inline signed char getch_peek(void) { signed char ch = (GLOBALS->vst_vcd_recoder_c_3!=GLOBALS->vend_vcd_recoder_c_3)?((int)(*GLOBALS->vst_vcd_recoder_c_3)):(getch_fetch()); /* no increment */ return(ch); } static int getch_patched(void) { char ch; ch=*GLOBALS->vsplitcurr_vcd_recoder_c_3; if(!ch) { return(-1); } else { GLOBALS->vsplitcurr_vcd_recoder_c_3++; return((int)ch); } } /* * simple tokenizer */ static int get_token(void) { int ch; int i, len=0; int is_string=0; char *yyshadow; for(;;) { ch=getch(); if(ch<0) return(T_EOF); if(ch<=' ') continue; /* val<=' ' is a quick whitespace check */ break; /* (take advantage of fact that vcd is text) */ } if(ch=='$') { GLOBALS->yytext_vcd_recoder_c_3[len++]=ch; for(;;) { ch=getch(); if(ch<0) return(T_EOF); if(ch<=' ') continue; break; } } else { is_string=1; } for(GLOBALS->yytext_vcd_recoder_c_3[len++]=ch;;GLOBALS->yytext_vcd_recoder_c_3[len++]=ch) { if(len==GLOBALS->T_MAX_STR_vcd_recoder_c_3) { GLOBALS->yytext_vcd_recoder_c_3=(char *)realloc_2(GLOBALS->yytext_vcd_recoder_c_3, (GLOBALS->T_MAX_STR_vcd_recoder_c_3=GLOBALS->T_MAX_STR_vcd_recoder_c_3*2)+1); } ch=getch(); if(ch<=' ') break; } GLOBALS->yytext_vcd_recoder_c_3[len]=0; /* terminator */ if(is_string) { GLOBALS->yylen_vcd_recoder_c_3=len; return(T_STRING); } yyshadow=GLOBALS->yytext_vcd_recoder_c_3; do { yyshadow++; for(i=0;ivar_prevch_vcd_recoder_c_3) { for(;;) { ch=getch_patched(); if(ch<0) { free_2(GLOBALS->varsplit_vcd_recoder_c_3); GLOBALS->varsplit_vcd_recoder_c_3=NULL; return(V_END); } if((ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r')) continue; break; } } else { ch=GLOBALS->var_prevch_vcd_recoder_c_3; GLOBALS->var_prevch_vcd_recoder_c_3=0; } if(ch=='[') return(V_LB); if(ch==':') return(V_COLON); if(ch==']') return(V_RB); for(GLOBALS->yytext_vcd_recoder_c_3[len++]=ch;;GLOBALS->yytext_vcd_recoder_c_3[len++]=ch) { if(len==GLOBALS->T_MAX_STR_vcd_recoder_c_3) { GLOBALS->yytext_vcd_recoder_c_3=(char *)realloc_2(GLOBALS->yytext_vcd_recoder_c_3, (GLOBALS->T_MAX_STR_vcd_recoder_c_3=GLOBALS->T_MAX_STR_vcd_recoder_c_3*2)+1); } ch=getch_patched(); if(ch<0) { free_2(GLOBALS->varsplit_vcd_recoder_c_3); GLOBALS->varsplit_vcd_recoder_c_3=NULL; break; } if((ch==':')||(ch==']')) { GLOBALS->var_prevch_vcd_recoder_c_3=ch; break; } } GLOBALS->yytext_vcd_recoder_c_3[len]=0; /* terminator */ if(match_kw) { int vr = vcd_keyword_code(GLOBALS->yytext_vcd_recoder_c_3, len); if(vr != V_STRING) { if(ch<0) { free_2(GLOBALS->varsplit_vcd_recoder_c_3); GLOBALS->varsplit_vcd_recoder_c_3=NULL; } return(vr); } } GLOBALS->yylen_vcd_recoder_c_3=len; if(ch<0) { free_2(GLOBALS->varsplit_vcd_recoder_c_3); GLOBALS->varsplit_vcd_recoder_c_3=NULL; } return(V_STRING); } static int get_vartoken(int match_kw) { int ch; int len=0; if(GLOBALS->varsplit_vcd_recoder_c_3) { int rc=get_vartoken_patched(match_kw); if(rc!=V_END) return(rc); GLOBALS->var_prevch_vcd_recoder_c_3=0; } if(!GLOBALS->var_prevch_vcd_recoder_c_3) { for(;;) { ch=getch(); if(ch<0) return(V_END); if((ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r')) continue; break; } } else { ch=GLOBALS->var_prevch_vcd_recoder_c_3; GLOBALS->var_prevch_vcd_recoder_c_3=0; } if(ch=='[') return(V_LB); if(ch==':') return(V_COLON); if(ch==']') return(V_RB); if(ch=='#') /* for MTI System Verilog '$var reg 64 >w #implicit-var###VarElem:ram_di[0.0] [63:0] $end' style declarations */ { /* debussy simply escapes until the space */ GLOBALS->yytext_vcd_recoder_c_3[len++]= '\\'; } for(GLOBALS->yytext_vcd_recoder_c_3[len++]=ch;;GLOBALS->yytext_vcd_recoder_c_3[len++]=ch) { if(len==GLOBALS->T_MAX_STR_vcd_recoder_c_3) { GLOBALS->yytext_vcd_recoder_c_3=(char *)realloc_2(GLOBALS->yytext_vcd_recoder_c_3, (GLOBALS->T_MAX_STR_vcd_recoder_c_3=GLOBALS->T_MAX_STR_vcd_recoder_c_3*2)+1); } ch=getch(); if(ch==' ') { if(match_kw) break; if(getch_peek() == '[') { ch = getch(); GLOBALS->varsplit_vcd_recoder_c_3=GLOBALS->yytext_vcd_recoder_c_3+len; /* keep looping so we get the *last* one */ continue; } } if((ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r')||(ch<0)) break; if((ch=='[')&&(GLOBALS->yytext_vcd_recoder_c_3[0]!='\\')) { GLOBALS->varsplit_vcd_recoder_c_3=GLOBALS->yytext_vcd_recoder_c_3+len; /* keep looping so we get the *last* one */ } else if(((ch==':')||(ch==']'))&&(!GLOBALS->varsplit_vcd_recoder_c_3)&&(GLOBALS->yytext_vcd_recoder_c_3[0]!='\\')) { GLOBALS->var_prevch_vcd_recoder_c_3=ch; break; } } GLOBALS->yytext_vcd_recoder_c_3[len]=0; /* absolute terminator */ if((GLOBALS->varsplit_vcd_recoder_c_3)&&(GLOBALS->yytext_vcd_recoder_c_3[len-1]==']')) { char *vst; vst=malloc_2(strlen(GLOBALS->varsplit_vcd_recoder_c_3)+1); strcpy(vst, GLOBALS->varsplit_vcd_recoder_c_3); *GLOBALS->varsplit_vcd_recoder_c_3=0x00; /* zero out var name at the left bracket */ len=GLOBALS->varsplit_vcd_recoder_c_3-GLOBALS->yytext_vcd_recoder_c_3; GLOBALS->varsplit_vcd_recoder_c_3=GLOBALS->vsplitcurr_vcd_recoder_c_3=vst; GLOBALS->var_prevch_vcd_recoder_c_3=0; } else { GLOBALS->varsplit_vcd_recoder_c_3=NULL; } if(match_kw) { int vr = vcd_keyword_code(GLOBALS->yytext_vcd_recoder_c_3, len); if(vr != V_STRING) { return(vr); } } GLOBALS->yylen_vcd_recoder_c_3=len; return(V_STRING); } static int get_strtoken(void) { int ch; int len=0; if(!GLOBALS->var_prevch_vcd_recoder_c_3) { for(;;) { ch=getch(); if(ch<0) return(V_END); if((ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r')) continue; break; } } else { ch=GLOBALS->var_prevch_vcd_recoder_c_3; GLOBALS->var_prevch_vcd_recoder_c_3=0; } for(GLOBALS->yytext_vcd_recoder_c_3[len++]=ch;;GLOBALS->yytext_vcd_recoder_c_3[len++]=ch) { if(len==GLOBALS->T_MAX_STR_vcd_recoder_c_3) { GLOBALS->yytext_vcd_recoder_c_3=(char *)realloc_2(GLOBALS->yytext_vcd_recoder_c_3, (GLOBALS->T_MAX_STR_vcd_recoder_c_3=GLOBALS->T_MAX_STR_vcd_recoder_c_3*2)+1); } ch=getch(); if((ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r')||(ch<0)) break; } GLOBALS->yytext_vcd_recoder_c_3[len]=0; /* terminator */ GLOBALS->yylen_vcd_recoder_c_3=len; return(V_STRING); } static void sync_end(char *hdr) { int tok; if(hdr) { DEBUG(fprintf(stderr,"%s",hdr)); } for(;;) { tok=get_token(); if((tok==T_END)||(tok==T_EOF)) break; if(hdr) { DEBUG(fprintf(stderr," %s",GLOBALS->yytext_vcd_recoder_c_3)); } } if(hdr) { DEBUG(fprintf(stderr,"\n")); } } static int version_sync_end(char *hdr) { int tok; int rc = 0; if(hdr) { DEBUG(fprintf(stderr,"%s",hdr)); } for(;;) { tok=get_token(); if((tok==T_END)||(tok==T_EOF)) break; if(hdr) { DEBUG(fprintf(stderr," %s",GLOBALS->yytext_vcd_recoder_c_3)); } if(strstr(GLOBALS->yytext_vcd_recoder_c_3, "Icarus")) /* turn off autocoalesce for Icarus */ { GLOBALS->autocoalesce = 0; rc = 1; } } if(hdr) { DEBUG(fprintf(stderr,"\n")); } return(rc); } static void parse_valuechange(void) { struct vcdsymbol *v; char *vector; int vlen; unsigned char typ; switch((typ = GLOBALS->yytext_vcd_recoder_c_3[0])) { /* encode bits as (time delta<<4) + (enum AnalyzerBits value) */ case '0': case '1': case 'x': case 'X': case 'z': case 'Z': case 'h': case 'H': case 'u': case 'U': case 'w': case 'W': case 'l': case 'L': case '-': if(GLOBALS->yylen_vcd_recoder_c_3>1) { v=bsearch_vcd(GLOBALS->yytext_vcd_recoder_c_3+1, GLOBALS->yylen_vcd_recoder_c_3-1); if(!v) { fprintf(stderr,"Near byte %d, Unknown VCD identifier: '%s'\n",(int)(GLOBALS->vcdbyteno_vcd_recoder_c_3+(GLOBALS->vst_vcd_recoder_c_3-GLOBALS->vcdbuf_vcd_recoder_c_3)),GLOBALS->yytext_vcd_recoder_c_3+1); malform_eof_fix(); } else { nptr n = v->narray[0]; unsigned int time_delta; unsigned int rcv; if(!n->mv.mvlfac_vlist) /* overloaded for vlist, numhist = last position used */ { n->mv.mvlfac_vlist = (GLOBALS->vlist_prepack) ? ((struct vlist_t *)vlist_packer_create()) : vlist_create(sizeof(char)); vlist_emit_uv32(&n->mv.mvlfac_vlist, (unsigned int)'0'); /* represents single bit routine for decompression */ vlist_emit_uv32(&n->mv.mvlfac_vlist, (unsigned int)v->vartype); } time_delta = GLOBALS->time_vlist_count_vcd_recoder_c_1 - (unsigned int)n->numhist; n->numhist = GLOBALS->time_vlist_count_vcd_recoder_c_1; switch(GLOBALS->yytext_vcd_recoder_c_3[0]) { case '0': case '1': rcv = ((GLOBALS->yytext_vcd_recoder_c_3[0]&1)<<1) | (time_delta<<2); break; /* pack more delta bits in for 0/1 vchs */ case 'x': case 'X': rcv = RCV_X | (time_delta<<4); break; case 'z': case 'Z': rcv = RCV_Z | (time_delta<<4); break; case 'h': case 'H': rcv = RCV_H | (time_delta<<4); break; case 'u': case 'U': rcv = RCV_U | (time_delta<<4); break; case 'w': case 'W': rcv = RCV_W | (time_delta<<4); break; case 'l': case 'L': rcv = RCV_L | (time_delta<<4); break; default: rcv = RCV_D | (time_delta<<4); break; } vlist_emit_uv32(&n->mv.mvlfac_vlist, rcv); } } else { fprintf(stderr,"Near byte %d, Malformed VCD identifier\n", (int)(GLOBALS->vcdbyteno_vcd_recoder_c_3+(GLOBALS->vst_vcd_recoder_c_3-GLOBALS->vcdbuf_vcd_recoder_c_3))); malform_eof_fix(); } break; /* encode everything else literally as a time delta + a string */ #ifndef STRICT_VCD_ONLY case 's': case 'S': vector=wave_alloca(GLOBALS->yylen_cache_vcd_recoder_c_3=GLOBALS->yylen_vcd_recoder_c_3); vlen = fstUtilityEscToBin((unsigned char *)vector, (unsigned char *)(GLOBALS->yytext_vcd_recoder_c_3+1), GLOBALS->yylen_vcd_recoder_c_3-1); vector[vlen] = 0; get_strtoken(); goto process_binary; #endif case 'b': case 'B': case 'r': case 'R': vector=wave_alloca(GLOBALS->yylen_cache_vcd_recoder_c_3=GLOBALS->yylen_vcd_recoder_c_3); strcpy(vector,GLOBALS->yytext_vcd_recoder_c_3+1); vlen=GLOBALS->yylen_vcd_recoder_c_3-1; get_strtoken(); process_binary: v=bsearch_vcd(GLOBALS->yytext_vcd_recoder_c_3, GLOBALS->yylen_vcd_recoder_c_3); if(!v) { fprintf(stderr,"Near byte %d, Unknown VCD identifier: '%s'\n",(int)(GLOBALS->vcdbyteno_vcd_recoder_c_3+(GLOBALS->vst_vcd_recoder_c_3-GLOBALS->vcdbuf_vcd_recoder_c_3)),GLOBALS->yytext_vcd_recoder_c_3+1); malform_eof_fix(); } else { nptr n = v->narray[0]; unsigned int time_delta; if(!n->mv.mvlfac_vlist) /* overloaded for vlist, numhist = last position used */ { unsigned char typ2 = toupper(typ); n->mv.mvlfac_vlist = (GLOBALS->vlist_prepack) ? ((struct vlist_t *)vlist_packer_create()) : vlist_create(sizeof(char)); if((v->vartype!=V_REAL) && (v->vartype!=V_STRINGTYPE)) { if((typ2=='R')||(typ2=='S')) { typ2 = 'B'; /* ok, typical case...fix as 'r' on bits variable causes recoder crash during trace extraction */ } } else { if(typ2=='B') { typ2 = 'S'; /* should never be necessary...this is defensive */ } } vlist_emit_uv32(&n->mv.mvlfac_vlist, (unsigned int)toupper(typ2)); /* B/R/P/S for decompress */ vlist_emit_uv32(&n->mv.mvlfac_vlist, (unsigned int)v->vartype); vlist_emit_uv32(&n->mv.mvlfac_vlist, (unsigned int)v->size); } time_delta = GLOBALS->time_vlist_count_vcd_recoder_c_1 - (unsigned int)n->numhist; n->numhist = GLOBALS->time_vlist_count_vcd_recoder_c_1; vlist_emit_uv32(&n->mv.mvlfac_vlist, time_delta); if((typ=='b')||(typ=='B')) { if((v->vartype!=V_REAL)&&(v->vartype!=V_STRINGTYPE)) { vlist_emit_mvl9_string(&n->mv.mvlfac_vlist, vector); } else { vlist_emit_string(&n->mv.mvlfac_vlist, vector); } } else { if((v->vartype == V_REAL)||(v->vartype == V_STRINGTYPE)||(typ=='s')||(typ=='S')) { vlist_emit_string(&n->mv.mvlfac_vlist, vector); } else { char *bits = wave_alloca(v->size + 1); int i, j, k=0; memset(bits, 0x0, v->size + 1); for(i=0;i> (7-j)) & 1) | '0'; if(k >= v->size) goto bit_term; } } bit_term: vlist_emit_mvl9_string(&n->mv.mvlfac_vlist, bits); } } } break; case 'p': case 'P': /* extract port dump value.. */ vector=wave_alloca(GLOBALS->yylen_cache_vcd_recoder_c_3=GLOBALS->yylen_vcd_recoder_c_3); evcd_strcpy(vector,GLOBALS->yytext_vcd_recoder_c_3+1); /* convert to regular vcd */ vlen=GLOBALS->yylen_vcd_recoder_c_3-1; get_strtoken(); /* throw away 0_strength_component */ get_strtoken(); /* throw away 0_strength_component */ get_strtoken(); /* this is the id */ typ = 'b'; /* convert to regular vcd */ goto process_binary; /* store string literally */ default: break; } } static void evcd_strcpy(char *dst, char *src) { static const char *evcd="DUNZduLHXTlh01?FAaBbCcf"; static const char *vcd="01xz0101xz0101xzxxxxxxz"; char ch; int i; while((ch=*src)) { for(i=0;i<23;i++) { if(evcd[i]==ch) { *dst=vcd[i]; break; } } if(i==23) *dst='x'; src++; dst++; } *dst=0; /* null terminate destination */ } static void vcd_parse(void) { int tok; unsigned char ttype; int disable_autocoalesce = 0; for(;;) { switch(get_token()) { case T_COMMENT: sync_end("COMMENT:"); break; case T_DATE: sync_end("DATE:"); break; case T_VERSION: disable_autocoalesce = version_sync_end("VERSION:"); break; case T_TIMEZERO: { int vtok=get_token(); if((vtok==T_END)||(vtok==T_EOF)) break; GLOBALS->global_time_offset=atoi_64(GLOBALS->yytext_vcd_recoder_c_3); DEBUG(fprintf(stderr,"TIMEZERO: "TTFormat"\n",GLOBALS->global_time_offset)); sync_end(NULL); } break; case T_TIMESCALE: { int vtok; int i; char prefix=' '; vtok=get_token(); if((vtok==T_END)||(vtok==T_EOF)) break; fractional_timescale_fix(GLOBALS->yytext_vcd_recoder_c_3); GLOBALS->time_scale=atoi_64(GLOBALS->yytext_vcd_recoder_c_3); if(!GLOBALS->time_scale) GLOBALS->time_scale=1; for(i=0;iyylen_vcd_recoder_c_3;i++) { if((GLOBALS->yytext_vcd_recoder_c_3[i]<'0')||(GLOBALS->yytext_vcd_recoder_c_3[i]>'9')) { prefix=GLOBALS->yytext_vcd_recoder_c_3[i]; break; } } if(prefix==' ') { vtok=get_token(); if((vtok==T_END)||(vtok==T_EOF)) break; prefix=GLOBALS->yytext_vcd_recoder_c_3[0]; } switch(prefix) { case ' ': case 'm': case 'u': case 'n': case 'p': case 'f': case 'a': case 'z': GLOBALS->time_dimension=prefix; break; case 's': GLOBALS->time_dimension=' '; break; default: /* unknown */ GLOBALS->time_dimension='n'; break; } DEBUG(fprintf(stderr,"TIMESCALE: "TTFormat" %cs\n",GLOBALS->time_scale, GLOBALS->time_dimension)); sync_end(NULL); } break; case T_SCOPE: T_GET; { switch(GLOBALS->yytext_vcd_recoder_c_3[0]) { case 'm': ttype = TREE_VCD_ST_MODULE; break; case 't': ttype = TREE_VCD_ST_TASK; break; case 'f': ttype = (GLOBALS->yytext_vcd_recoder_c_3[1] == 'u') ? TREE_VCD_ST_FUNCTION : TREE_VCD_ST_FORK; break; case 'b': ttype = TREE_VCD_ST_BEGIN; break; case 'g': ttype = TREE_VCD_ST_GENERATE; break; case 's': ttype = TREE_VCD_ST_STRUCT; break; case 'u': ttype = TREE_VCD_ST_UNION; break; case 'c': ttype = TREE_VCD_ST_CLASS; break; case 'i': ttype = TREE_VCD_ST_INTERFACE; break; case 'p': ttype = (GLOBALS->yytext_vcd_recoder_c_3[1] == 'r') ? TREE_VCD_ST_PROGRAM : TREE_VCD_ST_PACKAGE; break; case 'v': { char *vht = GLOBALS->yytext_vcd_recoder_c_3; if(!strncmp(vht, "vhdl_", 5)) { switch(vht[5]) { case 'a': ttype = TREE_VHDL_ST_ARCHITECTURE; break; case 'r': ttype = TREE_VHDL_ST_RECORD; break; case 'b': ttype = TREE_VHDL_ST_BLOCK; break; case 'g': ttype = TREE_VHDL_ST_GENERATE; break; case 'i': ttype = TREE_VHDL_ST_GENIF; break; case 'f': ttype = (vht[6] == 'u') ? TREE_VHDL_ST_FUNCTION : TREE_VHDL_ST_GENFOR; break; case 'p': ttype = (!strncmp(vht+6, "roces", 5)) ? TREE_VHDL_ST_PROCESS: TREE_VHDL_ST_PROCEDURE; break; default: ttype = TREE_UNKNOWN; break; } } else { ttype = TREE_UNKNOWN; } } break; default: ttype = TREE_UNKNOWN; break; } } T_GET; if(tok==T_STRING) { struct slist *s; s=(struct slist *)calloc_2(1,sizeof(struct slist)); s->len=GLOBALS->yylen_vcd_recoder_c_3; s->str=(char *)malloc_2(GLOBALS->yylen_vcd_recoder_c_3+1); strcpy(s->str, GLOBALS->yytext_vcd_recoder_c_3); s->mod_tree_parent = GLOBALS->mod_tree_parent; allocate_and_decorate_module_tree_node(ttype, GLOBALS->yytext_vcd_recoder_c_3, NULL, GLOBALS->yylen_vcd_recoder_c_3, 0, 0, 0); if(GLOBALS->slistcurr) { GLOBALS->slistcurr->next=s; GLOBALS->slistcurr=s; } else { GLOBALS->slistcurr=GLOBALS->slistroot=s; } build_slisthier(); DEBUG(fprintf(stderr, "SCOPE: %s\n",GLOBALS->slisthier)); } sync_end(NULL); break; case T_UPSCOPE: if(GLOBALS->slistroot) { struct slist *s; GLOBALS->mod_tree_parent = GLOBALS->slistcurr->mod_tree_parent; s=GLOBALS->slistroot; if(!s->next) { free_2(s->str); free_2(s); GLOBALS->slistroot=GLOBALS->slistcurr=NULL; } else for(;;) { if(!s->next->next) { free_2(s->next->str); free_2(s->next); s->next=NULL; GLOBALS->slistcurr=s; break; } s=s->next; } build_slisthier(); DEBUG(fprintf(stderr, "SCOPE: %s\n",GLOBALS->slisthier)); } else { GLOBALS->mod_tree_parent = NULL; } sync_end(NULL); break; case T_VAR: if((GLOBALS->header_over_vcd_recoder_c_3)&&(0)) { fprintf(stderr,"$VAR encountered after $ENDDEFINITIONS near byte %d. VCD is malformed, exiting.\n", (int)(GLOBALS->vcdbyteno_vcd_recoder_c_3+(GLOBALS->vst_vcd_recoder_c_3-GLOBALS->vcdbuf_vcd_recoder_c_3))); vcd_exit(255); } else { int vtok; struct vcdsymbol *v=NULL; GLOBALS->var_prevch_vcd_recoder_c_3=0; if(GLOBALS->varsplit_vcd_recoder_c_3) { free_2(GLOBALS->varsplit_vcd_recoder_c_3); GLOBALS->varsplit_vcd_recoder_c_3=NULL; } vtok=get_vartoken(1); if(vtok>V_STRINGTYPE) goto bail; v=(struct vcdsymbol *)calloc_2(1,sizeof(struct vcdsymbol)); v->vartype=vtok; v->msi=v->lsi=GLOBALS->vcd_explicit_zero_subscripts; /* indicate [un]subscripted status */ if(vtok==V_PORT) { vtok=get_vartoken(1); if(vtok==V_STRING) { v->size=atoi_64(GLOBALS->yytext_vcd_recoder_c_3); if(!v->size) v->size=1; } else if(vtok==V_LB) { vtok=get_vartoken(1); if(vtok==V_END) goto err; if(vtok!=V_STRING) goto err; v->msi=atoi_64(GLOBALS->yytext_vcd_recoder_c_3); vtok=get_vartoken(0); if(vtok==V_RB) { v->lsi=v->msi; v->size=1; } else { if(vtok!=V_COLON) goto err; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; v->lsi=atoi_64(GLOBALS->yytext_vcd_recoder_c_3); vtok=get_vartoken(0); if(vtok!=V_RB) goto err; if(v->msi>v->lsi) { v->size=v->msi-v->lsi+1; } else { v->size=v->lsi-v->msi+1; } } } else goto err; vtok=get_strtoken(); if(vtok==V_END) goto err; v->id=(char *)malloc_2(GLOBALS->yylen_vcd_recoder_c_3+1); strcpy(v->id, GLOBALS->yytext_vcd_recoder_c_3); v->nid=vcdid_hash(GLOBALS->yytext_vcd_recoder_c_3,GLOBALS->yylen_vcd_recoder_c_3); if(v->nid == (GLOBALS->vcd_hash_max+1)) { GLOBALS->vcd_hash_max = v->nid; } else if((v->nid>0)&&(v->nid<=GLOBALS->vcd_hash_max)) { /* general case with aliases */ } else { GLOBALS->vcd_hash_kill = 1; } if(v->nid < GLOBALS->vcd_minid_vcd_recoder_c_3) GLOBALS->vcd_minid_vcd_recoder_c_3 = v->nid; if(v->nid > GLOBALS->vcd_maxid_vcd_recoder_c_3) GLOBALS->vcd_maxid_vcd_recoder_c_3 = v->nid; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; if(GLOBALS->slisthier_len) { v->name=(char *)malloc_2(GLOBALS->slisthier_len+1+GLOBALS->yylen_vcd_recoder_c_3+1); strcpy(v->name,GLOBALS->slisthier); strcpy(v->name+GLOBALS->slisthier_len,GLOBALS->vcd_hier_delimeter); if(GLOBALS->alt_hier_delimeter) { strcpy_vcdalt(v->name+GLOBALS->slisthier_len+1,GLOBALS->yytext_vcd_recoder_c_3,GLOBALS->alt_hier_delimeter); } else { if((strcpy_delimfix(v->name+GLOBALS->slisthier_len+1,GLOBALS->yytext_vcd_recoder_c_3)) && (GLOBALS->yytext_vcd_recoder_c_3[0] != '\\')) { char *sd=(char *)malloc_2(GLOBALS->slisthier_len+1+GLOBALS->yylen_vcd_recoder_c_3+2); strcpy(sd,GLOBALS->slisthier); strcpy(sd+GLOBALS->slisthier_len,GLOBALS->vcd_hier_delimeter); sd[GLOBALS->slisthier_len+1] = '\\'; strcpy(sd+GLOBALS->slisthier_len+2,v->name+GLOBALS->slisthier_len+1); free_2(v->name); v->name = sd; } } } else { v->name=(char *)malloc_2(GLOBALS->yylen_vcd_recoder_c_3+1); if(GLOBALS->alt_hier_delimeter) { strcpy_vcdalt(v->name,GLOBALS->yytext_vcd_recoder_c_3,GLOBALS->alt_hier_delimeter); } else { if((strcpy_delimfix(v->name,GLOBALS->yytext_vcd_recoder_c_3)) && (GLOBALS->yytext_vcd_recoder_c_3[0] != '\\')) { char *sd=(char *)malloc_2(GLOBALS->yylen_vcd_recoder_c_3+2); sd[0] = '\\'; strcpy(sd+1,v->name); free_2(v->name); v->name = sd; } } } if(GLOBALS->pv_vcd_recoder_c_3) { if(!strcmp(GLOBALS->prev_hier_uncompressed_name,v->name) && !disable_autocoalesce && (!strchr(v->name, '\\'))) { GLOBALS->pv_vcd_recoder_c_3->chain=v; v->root=GLOBALS->rootv_vcd_recoder_c_3; if(GLOBALS->pv_vcd_recoder_c_3==GLOBALS->rootv_vcd_recoder_c_3) GLOBALS->pv_vcd_recoder_c_3->root=GLOBALS->rootv_vcd_recoder_c_3; } else { GLOBALS->rootv_vcd_recoder_c_3=v; } free_2(GLOBALS->prev_hier_uncompressed_name); } else { GLOBALS->rootv_vcd_recoder_c_3=v; } GLOBALS->pv_vcd_recoder_c_3=v; GLOBALS->prev_hier_uncompressed_name = strdup_2(v->name); } else /* regular vcd var, not an evcd port var */ { vtok=get_vartoken(1); if(vtok==V_END) goto err; v->size=atoi_64(GLOBALS->yytext_vcd_recoder_c_3); vtok=get_strtoken(); if(vtok==V_END) goto err; v->id=(char *)malloc_2(GLOBALS->yylen_vcd_recoder_c_3+1); strcpy(v->id, GLOBALS->yytext_vcd_recoder_c_3); v->nid=vcdid_hash(GLOBALS->yytext_vcd_recoder_c_3,GLOBALS->yylen_vcd_recoder_c_3); if(v->nid == (GLOBALS->vcd_hash_max+1)) { GLOBALS->vcd_hash_max = v->nid; } else if((v->nid>0)&&(v->nid<=GLOBALS->vcd_hash_max)) { /* general case with aliases */ } else { GLOBALS->vcd_hash_kill = 1; } if(v->nid < GLOBALS->vcd_minid_vcd_recoder_c_3) GLOBALS->vcd_minid_vcd_recoder_c_3 = v->nid; if(v->nid > GLOBALS->vcd_maxid_vcd_recoder_c_3) GLOBALS->vcd_maxid_vcd_recoder_c_3 = v->nid; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; if(GLOBALS->slisthier_len) { v->name=(char *)malloc_2(GLOBALS->slisthier_len+1+GLOBALS->yylen_vcd_recoder_c_3+1); strcpy(v->name,GLOBALS->slisthier); strcpy(v->name+GLOBALS->slisthier_len,GLOBALS->vcd_hier_delimeter); if(GLOBALS->alt_hier_delimeter) { strcpy_vcdalt(v->name+GLOBALS->slisthier_len+1,GLOBALS->yytext_vcd_recoder_c_3,GLOBALS->alt_hier_delimeter); } else { if((strcpy_delimfix(v->name+GLOBALS->slisthier_len+1,GLOBALS->yytext_vcd_recoder_c_3)) && (GLOBALS->yytext_vcd_recoder_c_3[0] != '\\')) { char *sd=(char *)malloc_2(GLOBALS->slisthier_len+1+GLOBALS->yylen_vcd_recoder_c_3+2); strcpy(sd,GLOBALS->slisthier); strcpy(sd+GLOBALS->slisthier_len,GLOBALS->vcd_hier_delimeter); sd[GLOBALS->slisthier_len+1] = '\\'; strcpy(sd+GLOBALS->slisthier_len+2,v->name+GLOBALS->slisthier_len+1); free_2(v->name); v->name = sd; } } } else { v->name=(char *)malloc_2(GLOBALS->yylen_vcd_recoder_c_3+1); if(GLOBALS->alt_hier_delimeter) { strcpy_vcdalt(v->name,GLOBALS->yytext_vcd_recoder_c_3,GLOBALS->alt_hier_delimeter); } else { if((strcpy_delimfix(v->name,GLOBALS->yytext_vcd_recoder_c_3)) && (GLOBALS->yytext_vcd_recoder_c_3[0] != '\\')) { char *sd=(char *)malloc_2(GLOBALS->yylen_vcd_recoder_c_3+2); sd[0] = '\\'; strcpy(sd+1,v->name); free_2(v->name); v->name = sd; } } } if(GLOBALS->pv_vcd_recoder_c_3) { if(!strcmp(GLOBALS->prev_hier_uncompressed_name,v->name)) { GLOBALS->pv_vcd_recoder_c_3->chain=v; v->root=GLOBALS->rootv_vcd_recoder_c_3; if(GLOBALS->pv_vcd_recoder_c_3==GLOBALS->rootv_vcd_recoder_c_3) GLOBALS->pv_vcd_recoder_c_3->root=GLOBALS->rootv_vcd_recoder_c_3; } else { GLOBALS->rootv_vcd_recoder_c_3=v; } free_2(GLOBALS->prev_hier_uncompressed_name); } else { GLOBALS->rootv_vcd_recoder_c_3=v; } GLOBALS->pv_vcd_recoder_c_3=v; GLOBALS->prev_hier_uncompressed_name = strdup_2(v->name); vtok=get_vartoken(1); if(vtok==V_END) goto dumpv; if(vtok!=V_LB) goto err; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; v->msi=atoi_64(GLOBALS->yytext_vcd_recoder_c_3); vtok=get_vartoken(0); if(vtok==V_RB) { v->lsi=v->msi; goto dumpv; } if(vtok!=V_COLON) goto err; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; v->lsi=atoi_64(GLOBALS->yytext_vcd_recoder_c_3); vtok=get_vartoken(0); if(vtok!=V_RB) goto err; } dumpv: if(v->size == 0) { if(v->vartype != V_EVENT) { if(v->vartype != V_STRINGTYPE) { v->vartype = V_REAL; } } else { v->size = 1; } } /* MTI fix */ if((v->vartype==V_REAL)||(v->vartype==V_STRINGTYPE)) { v->size=1; /* override any data we parsed in */ v->msi=v->lsi=0; } else if((v->size>1)&&(v->msi<=0)&&(v->lsi<=0)) { if(v->vartype==V_EVENT) { v->size=1; } else { /* any criteria for the direction here? */ v->msi=v->size-1; v->lsi=0; } } else if((v->msi>v->lsi)&&((v->msi-v->lsi+1)!=v->size)) { if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) { if((v->msi-v->lsi+1) > v->size) /* if() is 2d add */ { v->msi = v->size-1; v->lsi = 0; } /* all this formerly was goto err; */ } else { v->size=v->msi-v->lsi+1; } } else if((v->lsi>=v->msi)&&((v->lsi-v->msi+1)!=v->size)) { if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) { if((v->lsi-v->msi+1) > v->size) /* if() is 2d add */ { v->lsi = v->size-1; v->msi = 0; } /* all this formerly was goto err; */ } else { v->size=v->lsi-v->msi+1; } } /* initial conditions */ v->narray=(struct Node **)calloc_2(1,sizeof(struct Node *)); v->narray[0]=(struct Node *)calloc_2(1,sizeof(struct Node)); v->narray[0]->head.time=-1; v->narray[0]->head.v.h_val=AN_X; if(!GLOBALS->vcdsymroot_vcd_recoder_c_3) { GLOBALS->vcdsymroot_vcd_recoder_c_3=GLOBALS->vcdsymcurr_vcd_recoder_c_3=v; } else { GLOBALS->vcdsymcurr_vcd_recoder_c_3->next=v; GLOBALS->vcdsymcurr_vcd_recoder_c_3=v; } GLOBALS->numsyms_vcd_recoder_c_3++; if(GLOBALS->vcd_save_handle) { if(v->msi==v->lsi) { if((v->vartype==V_REAL)||(v->vartype==V_STRINGTYPE)) { fprintf(GLOBALS->vcd_save_handle,"%s\n",v->name); } else { if(v->msi>=0) { if(!GLOBALS->vcd_explicit_zero_subscripts) fprintf(GLOBALS->vcd_save_handle,"%s%c%d\n",v->name,GLOBALS->hier_delimeter,v->msi); else fprintf(GLOBALS->vcd_save_handle,"%s[%d]\n",v->name,v->msi); } else { fprintf(GLOBALS->vcd_save_handle,"%s\n",v->name); } } } else { fprintf(GLOBALS->vcd_save_handle,"%s[%d:%d]\n",v->name,v->msi,v->lsi); } } goto bail; err: if(v) { GLOBALS->error_count_vcd_recoder_c_3++; if(v->name) { fprintf(stderr, "Near byte %d, $VAR parse error encountered with '%s'\n", (int)(GLOBALS->vcdbyteno_vcd_recoder_c_3+(GLOBALS->vst_vcd_recoder_c_3-GLOBALS->vcdbuf_vcd_recoder_c_3)), v->name); free_2(v->name); } else { fprintf(stderr, "Near byte %d, $VAR parse error encountered\n", (int)(GLOBALS->vcdbyteno_vcd_recoder_c_3+(GLOBALS->vst_vcd_recoder_c_3-GLOBALS->vcdbuf_vcd_recoder_c_3))); } if(v->id) free_2(v->id); free_2(v); v=NULL; GLOBALS->pv_vcd_recoder_c_3 = NULL; } bail: if(vtok!=V_END) sync_end(NULL); break; } case T_ENDDEFINITIONS: GLOBALS->header_over_vcd_recoder_c_3=1; /* do symbol table management here */ create_sorted_table(); if((!GLOBALS->sorted_vcd_recoder_c_3)&&(!GLOBALS->indexed_vcd_recoder_c_3)) { fprintf(stderr, "No symbols in VCD file..nothing to do!\n"); vcd_exit(255); } if(GLOBALS->error_count_vcd_recoder_c_3) { fprintf(stderr, "\n%d VCD parse errors encountered, exiting.\n", GLOBALS->error_count_vcd_recoder_c_3); vcd_exit(255); } if(GLOBALS->use_fastload == VCD_FSL_READ) { read_fastload_body(); fprintf(stderr, "VCDLOAD | Using fastload file.\n"); return; } break; case T_STRING: if(!GLOBALS->header_over_vcd_recoder_c_3) { GLOBALS->header_over_vcd_recoder_c_3=1; /* do symbol table management here */ create_sorted_table(); if((!GLOBALS->sorted_vcd_recoder_c_3)&&(!GLOBALS->indexed_vcd_recoder_c_3)) break; } { /* catchall for events when header over */ if(GLOBALS->yytext_vcd_recoder_c_3[0]=='#') { TimeType tim; TimeType *tt; tim=atoi_64(GLOBALS->yytext_vcd_recoder_c_3+1); if(GLOBALS->start_time_vcd_recoder_c_3<0) { GLOBALS->start_time_vcd_recoder_c_3=tim; if(GLOBALS->time_vlist_vcd_recoder_write) { vlist_packer_emit_utt((struct vlist_packer_t **)(void *)&GLOBALS->time_vlist_vcd_recoder_write, tim); } } else { if(tim < GLOBALS->current_time_vcd_recoder_c_3) /* avoid backtracking time counts which can happen on malformed files */ { tim = GLOBALS->current_time_vcd_recoder_c_3; } if(GLOBALS->time_vlist_vcd_recoder_write) { vlist_packer_emit_utt((struct vlist_packer_t **)(void *)&GLOBALS->time_vlist_vcd_recoder_write, tim - GLOBALS->current_time_vcd_recoder_c_3); } } GLOBALS->current_time_vcd_recoder_c_3=tim; if(GLOBALS->end_time_vcd_recoder_c_3end_time_vcd_recoder_c_3=tim; /* in case of malformed vcd files */ DEBUG(fprintf(stderr,"#"TTFormat"\n",tim)); tt = vlist_alloc(&GLOBALS->time_vlist_vcd_recoder_c_1, 0); *tt = tim; GLOBALS->time_vlist_count_vcd_recoder_c_1++; } else { if(GLOBALS->time_vlist_count_vcd_recoder_c_1) { /* OK, otherwise fix for System C which doesn't emit time zero... */ } else { TimeType tim = LLDescriptor(0); TimeType *tt; GLOBALS->start_time_vcd_recoder_c_3=GLOBALS->current_time_vcd_recoder_c_3=GLOBALS->end_time_vcd_recoder_c_3=tim; if(GLOBALS->time_vlist_vcd_recoder_write) { vlist_packer_emit_utt((struct vlist_packer_t **)(void *)&GLOBALS->time_vlist_vcd_recoder_write, tim); } tt = vlist_alloc(&GLOBALS->time_vlist_vcd_recoder_c_1, 0); *tt = tim; GLOBALS->time_vlist_count_vcd_recoder_c_1=1; } parse_valuechange(); } } break; case T_DUMPALL: /* dump commands modify vals anyway so */ case T_DUMPPORTSALL: break; /* just loop through.. */ case T_DUMPOFF: case T_DUMPPORTSOFF: GLOBALS->dumping_off_vcd_recoder_c_3=1; /* if((!GLOBALS->blackout_regions)||((GLOBALS->blackout_regions)&&(GLOBALS->blackout_regions->bstart<=GLOBALS->blackout_regions->bend))) : remove redundant condition */ if((!GLOBALS->blackout_regions)||(GLOBALS->blackout_regions->bstart<=GLOBALS->blackout_regions->bend)) { struct blackout_region_t *bt = calloc_2(1, sizeof(struct blackout_region_t)); bt->bstart = GLOBALS->current_time_vcd_recoder_c_3; bt->next = GLOBALS->blackout_regions; GLOBALS->blackout_regions = bt; } break; case T_DUMPON: case T_DUMPPORTSON: GLOBALS->dumping_off_vcd_recoder_c_3=0; if((GLOBALS->blackout_regions)&&(GLOBALS->blackout_regions->bstart>GLOBALS->blackout_regions->bend)) { GLOBALS->blackout_regions->bend = GLOBALS->current_time_vcd_recoder_c_3; } break; case T_DUMPVARS: case T_DUMPPORTS: if(GLOBALS->current_time_vcd_recoder_c_3<0) { GLOBALS->start_time_vcd_recoder_c_3=GLOBALS->current_time_vcd_recoder_c_3=GLOBALS->end_time_vcd_recoder_c_3=0; } break; case T_VCDCLOSE: sync_end("VCDCLOSE:"); break; /* next token will be '#' time related followed by $end */ case T_END: /* either closure for dump commands or */ break; /* it's spurious */ case T_UNKNOWN_KEY: sync_end(NULL); /* skip over unknown keywords */ break; case T_EOF: if((GLOBALS->blackout_regions)&&(GLOBALS->blackout_regions->bstart>GLOBALS->blackout_regions->bend)) { GLOBALS->blackout_regions->bend = GLOBALS->current_time_vcd_recoder_c_3; } GLOBALS->pv_vcd_recoder_c_3 = NULL; if(GLOBALS->prev_hier_uncompressed_name) { free_2(GLOBALS->prev_hier_uncompressed_name); GLOBALS->prev_hier_uncompressed_name = NULL; } return; default: DEBUG(fprintf(stderr,"UNKNOWN TOKEN\n")); } } } /*******************************************************************************/ void add_histent(TimeType tim, struct Node *n, char ch, int regadd, char *vector) { struct HistEnt *he; char heval; if(!vector) { if(!n->curr) { he=histent_calloc(); he->time=-1; he->v.h_val=AN_X; n->curr=he; n->head.next=he; add_histent(tim,n,ch,regadd, vector); } else { if(regadd) { tim*=(GLOBALS->time_scale); } if(ch=='0') heval=AN_0; else if(ch=='1') heval=AN_1; else if((ch=='x')||(ch=='X')) heval=AN_X; else if((ch=='z')||(ch=='Z')) heval=AN_Z; else if((ch=='h')||(ch=='H')) heval=AN_H; else if((ch=='u')||(ch=='U')) heval=AN_U; else if((ch=='w')||(ch=='W')) heval=AN_W; else if((ch=='l')||(ch=='L')) heval=AN_L; else /* if(ch=='-') */ heval=AN_DASH; /* default */ if((n->curr->v.h_val!=heval)||(tim==GLOBALS->start_time_vcd_recoder_c_3)||(n->vartype==ND_VCD_EVENT)||(GLOBALS->vcd_preserve_glitches)) /* same region == go skip */ { if(n->curr->time==tim) { DEBUG(printf("Warning: Glitch at time ["TTFormat"] Signal [%p], Value [%c->%c].\n", tim, n, AN_STR[n->curr->v.h_val], ch)); n->curr->v.h_val=heval; /* we have a glitch! */ GLOBALS->num_glitches_vcd_recoder_c_4++; if(!(n->curr->flags&HIST_GLITCH)) { n->curr->flags|=HIST_GLITCH; /* set the glitch flag */ GLOBALS->num_glitch_regions_vcd_recoder_c_4++; } } else { he=histent_calloc(); he->time=tim; he->v.h_val=heval; n->curr->next=he; n->curr=he; GLOBALS->regions+=regadd; } } } } else { switch(ch) { case 's': /* string */ { if(!n->curr) { he=histent_calloc(); he->flags=(HIST_STRING|HIST_REAL); he->time=-1; he->v.h_vector=NULL; n->curr=he; n->head.next=he; add_histent(tim,n,ch,regadd, vector); } else { if(regadd) { tim*=(GLOBALS->time_scale); } if(n->curr->time==tim) { DEBUG(printf("Warning: String Glitch at time ["TTFormat"] Signal [%p].\n", tim, n)); if(n->curr->v.h_vector) free_2(n->curr->v.h_vector); n->curr->v.h_vector=vector; /* we have a glitch! */ GLOBALS->num_glitches_vcd_recoder_c_4++; if(!(n->curr->flags&HIST_GLITCH)) { n->curr->flags|=HIST_GLITCH; /* set the glitch flag */ GLOBALS->num_glitch_regions_vcd_recoder_c_4++; } } else { he=histent_calloc(); he->flags=(HIST_STRING|HIST_REAL); he->time=tim; he->v.h_vector=vector; n->curr->next=he; n->curr=he; GLOBALS->regions+=regadd; } } break; } case 'g': /* real number */ { if(!n->curr) { he=histent_calloc(); he->flags=HIST_REAL; he->time=-1; #ifdef WAVE_HAS_H_DOUBLE he->v.h_double = strtod("NaN", NULL); #else he->v.h_vector=NULL; #endif n->curr=he; n->head.next=he; add_histent(tim,n,ch,regadd, vector); } else { if(regadd) { tim*=(GLOBALS->time_scale); } if( #ifdef WAVE_HAS_H_DOUBLE (vector&&(n->curr->v.h_double!=*(double *)vector)) #else (n->curr->v.h_vector&&vector&&(*(double *)n->curr->v.h_vector!=*(double *)vector)) #endif ||(tim==GLOBALS->start_time_vcd_recoder_c_3) #ifndef WAVE_HAS_H_DOUBLE ||(!n->curr->v.h_vector) #endif ||(GLOBALS->vcd_preserve_glitches)||(GLOBALS->vcd_preserve_glitches_real) ) /* same region == go skip */ { if(n->curr->time==tim) { DEBUG(printf("Warning: Real number Glitch at time ["TTFormat"] Signal [%p].\n", tim, n)); #ifdef WAVE_HAS_H_DOUBLE n->curr->v.h_double = *((double *)vector); #else if(n->curr->v.h_vector) free_2(n->curr->v.h_vector); n->curr->v.h_vector=vector; /* we have a glitch! */ #endif GLOBALS->num_glitches_vcd_recoder_c_4++; if(!(n->curr->flags&HIST_GLITCH)) { n->curr->flags|=HIST_GLITCH; /* set the glitch flag */ GLOBALS->num_glitch_regions_vcd_recoder_c_4++; } } else { he=histent_calloc(); he->flags=HIST_REAL; he->time=tim; #ifdef WAVE_HAS_H_DOUBLE he->v.h_double = *((double *)vector); #else he->v.h_vector=vector; #endif n->curr->next=he; n->curr=he; GLOBALS->regions+=regadd; } } else { #ifndef WAVE_HAS_H_DOUBLE free_2(vector); #endif } #ifdef WAVE_HAS_H_DOUBLE free_2(vector); #endif } break; } default: { if(!n->curr) { he=histent_calloc(); he->time=-1; he->v.h_vector=NULL; n->curr=he; n->head.next=he; add_histent(tim,n,ch,regadd, vector); } else { if(regadd) { tim*=(GLOBALS->time_scale); } if( (n->curr->v.h_vector&&vector&&(strcmp(n->curr->v.h_vector,vector))) ||(tim==GLOBALS->start_time_vcd_recoder_c_3) ||(!n->curr->v.h_vector) ||(GLOBALS->vcd_preserve_glitches) ) /* same region == go skip */ { if(n->curr->time==tim) { DEBUG(printf("Warning: Glitch at time ["TTFormat"] Signal [%p], Value [%c->%c].\n", tim, n, AN_STR[n->curr->v.h_val], ch)); if(n->curr->v.h_vector) free_2(n->curr->v.h_vector); n->curr->v.h_vector=vector; /* we have a glitch! */ GLOBALS->num_glitches_vcd_recoder_c_4++; if(!(n->curr->flags&HIST_GLITCH)) { n->curr->flags|=HIST_GLITCH; /* set the glitch flag */ GLOBALS->num_glitch_regions_vcd_recoder_c_4++; } } else { he=histent_calloc(); he->time=tim; he->v.h_vector=vector; n->curr->next=he; n->curr=he; GLOBALS->regions+=regadd; } } else { free_2(vector); } } break; } } } } /*******************************************************************************/ static void vcd_build_symbols(void) { int j; int max_slen=-1; struct sym_chain *sym_chain=NULL, *sym_curr=NULL; int duphier=0; char hashdirty; struct vcdsymbol *v, *vprime; char *str = wave_alloca(1); /* quiet scan-build null pointer warning below */ #ifdef _WAVE_HAVE_JUDY int ss_len, longest = 0; #endif v=GLOBALS->vcdsymroot_vcd_recoder_c_3; while(v) { int msi; int delta; { int slen; int substnode; msi=v->msi; delta=((v->lsi-v->msi)<0)?-1:1; substnode=0; slen=strlen(v->name); str=(slen>max_slen)?(wave_alloca((max_slen=slen)+32)):(str); /* more than enough */ strcpy(str,v->name); if(v->msi>=0) { strcpy(str+slen,GLOBALS->vcd_hier_delimeter); slen++; } if((vprime=bsearch_vcd(v->id, strlen(v->id)))!=v) /* hash mish means dup net */ { if(v->size!=vprime->size) { fprintf(stderr,"ERROR: Duplicate IDs with differing width: %s %s\n", v->name, vprime->name); } else { substnode=1; } } if((v->size==1)&&(v->vartype!=V_REAL)&&(v->vartype!=V_STRINGTYPE)) { struct symbol *s = NULL; for(j=0;jsize;j++) { if(v->msi>=0) { if(!GLOBALS->vcd_explicit_zero_subscripts) sprintf(str+slen,"%d",msi); else sprintf(str+slen-1,"[%d]",msi); } hashdirty=0; if(symfind(str, NULL)) { char *dupfix=(char *)malloc_2(max_slen+32); #ifndef _WAVE_HAVE_JUDY hashdirty=1; #endif DEBUG(fprintf(stderr,"Warning: %s is a duplicate net name.\n",str)); do sprintf(dupfix, "$DUP%d%s%s", duphier++, GLOBALS->vcd_hier_delimeter, str); while(symfind(dupfix, NULL)); strcpy(str, dupfix); free_2(dupfix); duphier=0; /* reset for next duplicate resolution */ } /* fallthrough */ { s=symadd(str,hashdirty?hash(str):GLOBALS->hashcache); #ifdef _WAVE_HAVE_JUDY ss_len = strlen(str); if(ss_len >= longest) { longest = ss_len + 1; } #endif s->n=v->narray[j]; if(substnode) { struct Node *n, *n2; n=s->n; n2=vprime->narray[j]; /* nname stays same */ /* n->head=n2->head; */ /* n->curr=n2->curr; */ n->curr=(hptr)n2; /* harray calculated later */ n->numhist=n2->numhist; } #ifndef _WAVE_HAVE_JUDY s->n->nname=s->name; #endif if(!GLOBALS->firstnode) { GLOBALS->firstnode= GLOBALS->curnode=calloc_2(1, sizeof(struct symchain)); } else { GLOBALS->curnode->next=calloc_2(1, sizeof(struct symchain)); GLOBALS->curnode=GLOBALS->curnode->next; } GLOBALS->curnode->symbol=s; GLOBALS->numfacs++; DEBUG(fprintf(stderr,"Added: %s\n",str)); } msi+=delta; } if((j==1)&&(v->root)) { s->vec_root=(struct symbol *)v->root; /* these will get patched over */ s->vec_chain=(struct symbol *)v->chain; /* these will get patched over */ v->sym_chain=s; if(!sym_chain) { sym_curr=(struct sym_chain *)calloc_2(1,sizeof(struct sym_chain)); sym_chain=sym_curr; } else { sym_curr->next=(struct sym_chain *)calloc_2(1,sizeof(struct sym_chain)); sym_curr=sym_curr->next; } sym_curr->val=s; } } else /* atomic vector */ { if((v->vartype!=V_REAL)&&(v->vartype!=V_STRINGTYPE)&&(v->vartype!=V_INTEGER)&&(v->vartype!=V_PARAMETER)) /* if((v->vartype!=V_REAL)&&(v->vartype!=V_STRINGTYPE)) */ { sprintf(str+slen-1,"[%d:%d]",v->msi,v->lsi); /* 2d add */ if((v->msi>v->lsi)&&((v->msi-v->lsi+1)!=v->size)) { if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) { v->msi = v->size-1; v->lsi = 0; } } else if((v->lsi>=v->msi)&&((v->lsi-v->msi+1)!=v->size)) { if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) { v->lsi = v->size-1; v->msi = 0; } } } else { *(str+slen-1)=0; } hashdirty=0; if(symfind(str, NULL)) { char *dupfix=(char *)malloc_2(max_slen+32); #ifndef _WAVE_HAVE_JUDY hashdirty=1; #endif DEBUG(fprintf(stderr,"Warning: %s is a duplicate net name.\n",str)); do sprintf(dupfix, "$DUP%d%s%s", duphier++, GLOBALS->vcd_hier_delimeter, str); while(symfind(dupfix, NULL)); strcpy(str, dupfix); free_2(dupfix); duphier=0; /* reset for next duplicate resolution */ } /* fallthrough */ { struct symbol *s; s=symadd(str,hashdirty?hash(str):GLOBALS->hashcache); /* cut down on double lookups.. */ #ifdef _WAVE_HAVE_JUDY ss_len = strlen(str); if(ss_len >= longest) { longest = ss_len + 1; } #endif s->n=v->narray[0]; if(substnode) { struct Node *n, *n2; n=s->n; n2=vprime->narray[0]; /* nname stays same */ /* n->head=n2->head; */ /* n->curr=n2->curr; */ n->curr=(hptr)n2; /* harray calculated later */ n->numhist=n2->numhist; n->extvals=n2->extvals; n->msi=n2->msi; n->lsi=n2->lsi; } else { s->n->msi=v->msi; s->n->lsi=v->lsi; s->n->extvals=1; } #ifndef _WAVE_HAVE_JUDY s->n->nname=s->name; #endif if(!GLOBALS->firstnode) { GLOBALS->firstnode= GLOBALS->curnode=calloc_2(1, sizeof(struct symchain)); } else { GLOBALS->curnode->next=calloc_2(1, sizeof(struct symchain)); GLOBALS->curnode=GLOBALS->curnode->next; } GLOBALS->curnode->symbol=s; GLOBALS->numfacs++; DEBUG(fprintf(stderr,"Added: %s\n",str)); } } } v=v->next; } #ifdef _WAVE_HAVE_JUDY { Pvoid_t PJArray = GLOBALS->sym_judy; PPvoid_t PPValue; char *Index = calloc_2(1, longest); for (PPValue = JudySLFirst (PJArray, (uint8_t *)Index, PJE0); PPValue != (PPvoid_t) NULL; PPValue = JudySLNext (PJArray, (uint8_t *)Index, PJE0)) { struct symbol *s = *(struct symbol **)PPValue; s->name = strdup_2(Index); s->n->nname = s->name; } free_2(Index); } #endif if(sym_chain) { sym_curr=sym_chain; while(sym_curr) { sym_curr->val->vec_root= ((struct vcdsymbol *)sym_curr->val->vec_root)->sym_chain; if ((struct vcdsymbol *)sym_curr->val->vec_chain) sym_curr->val->vec_chain=((struct vcdsymbol *)sym_curr->val->vec_chain)->sym_chain; DEBUG(printf("Link: ('%s') '%s' -> '%s'\n",sym_curr->val->vec_root->name, sym_curr->val->name, sym_curr->val->vec_chain?sym_curr->val->vec_chain->name:"(END)")); sym_chain=sym_curr; sym_curr=sym_curr->next; free_2(sym_chain); } } } /*******************************************************************************/ static void vcd_cleanup(void) { struct slist *s, *s2; struct vcdsymbol *v, *vt; if(GLOBALS->indexed_vcd_recoder_c_3) { free_2(GLOBALS->indexed_vcd_recoder_c_3); GLOBALS->indexed_vcd_recoder_c_3=NULL; } if(GLOBALS->sorted_vcd_recoder_c_3) { free_2(GLOBALS->sorted_vcd_recoder_c_3); GLOBALS->sorted_vcd_recoder_c_3=NULL; } v=GLOBALS->vcdsymroot_vcd_recoder_c_3; while(v) { if(v->name) free_2(v->name); if(v->id) free_2(v->id); if(v->narray) free_2(v->narray); vt=v; v=v->next; free_2(vt); } GLOBALS->vcdsymroot_vcd_recoder_c_3=GLOBALS->vcdsymcurr_vcd_recoder_c_3=NULL; if(GLOBALS->slisthier) { free_2(GLOBALS->slisthier); GLOBALS->slisthier=NULL; } s=GLOBALS->slistroot; while(s) { s2=s->next; if(s->str)free_2(s->str); free_2(s); s=s2; } GLOBALS->slistroot=GLOBALS->slistcurr=NULL; GLOBALS->slisthier_len=0; if(GLOBALS->vcd_is_compressed_vcd_recoder_c_2) { pclose(GLOBALS->vcd_handle_vcd_recoder_c_2); GLOBALS->vcd_handle_vcd_recoder_c_2 = NULL; } else { fclose(GLOBALS->vcd_handle_vcd_recoder_c_2); GLOBALS->vcd_handle_vcd_recoder_c_2 = NULL; } if(GLOBALS->yytext_vcd_recoder_c_3) { free_2(GLOBALS->yytext_vcd_recoder_c_3); GLOBALS->yytext_vcd_recoder_c_3=NULL; } } /*******************************************************************************/ TimeType vcd_recoder_main(char *fname) { unsigned int finalize_cnt = 0; #ifdef HAVE_SYS_STAT_H struct stat mystat; int stat_rc = stat(fname, &mystat); #endif GLOBALS->pv_vcd_recoder_c_3=GLOBALS->rootv_vcd_recoder_c_3=NULL; GLOBALS->vcd_hier_delimeter[0]=GLOBALS->hier_delimeter; if(GLOBALS->use_fastload) { char *ffname = malloc_2(strlen(fname) + 4 + 1); sprintf(ffname, "%s.idx", fname); GLOBALS->vlist_handle = fopen(ffname, "rb"); if(GLOBALS->vlist_handle) { GLOBALS->use_fastload = VCD_FSL_READ; /* need to do a sanity check looking for time of vcd file vs recoder file, etc. */ #ifdef HAVE_SYS_STAT_H if( (stat_rc) || (!read_fastload_header(&mystat)) ) #else if(!read_fastload_header()) #endif { GLOBALS->use_fastload = VCD_FSL_WRITE; fclose(GLOBALS->vlist_handle); GLOBALS->vlist_handle = NULL; } } else { GLOBALS->use_fastload = VCD_FSL_WRITE; } free_2(ffname); } errno=0; /* reset in case it's set for some reason */ GLOBALS->yytext_vcd_recoder_c_3=(char *)malloc_2(GLOBALS->T_MAX_STR_vcd_recoder_c_3+1); if(!GLOBALS->hier_was_explicitly_set) /* set default hierarchy split char */ { GLOBALS->hier_delimeter='.'; } if(suffix_check(fname, ".gz") || suffix_check(fname, ".zip")) { char *str; int dlen; dlen=strlen(WAVE_DECOMPRESSOR); str=wave_alloca(strlen(fname)+dlen+1); strcpy(str,WAVE_DECOMPRESSOR); strcpy(str+dlen,fname); GLOBALS->vcd_handle_vcd_recoder_c_2=popen(str,"r"); GLOBALS->vcd_is_compressed_vcd_recoder_c_2=~0; } else { if(strcmp("-vcd",fname)) { GLOBALS->vcd_handle_vcd_recoder_c_2=fopen(fname,"rb"); if(GLOBALS->vcd_handle_vcd_recoder_c_2) { fseeko(GLOBALS->vcd_handle_vcd_recoder_c_2, 0, SEEK_END); /* do status bar for vcd load */ GLOBALS->vcd_fsiz_vcd_recoder_c_2 = ftello(GLOBALS->vcd_handle_vcd_recoder_c_2); fseeko(GLOBALS->vcd_handle_vcd_recoder_c_2, 0, SEEK_SET); } if(GLOBALS->vcd_warning_filesize < 0) GLOBALS->vcd_warning_filesize = VCD_SIZE_WARN; if(GLOBALS->vcd_warning_filesize) if(GLOBALS->vcd_fsiz_vcd_recoder_c_2 > (GLOBALS->vcd_warning_filesize * (1024 * 1024))) { if(!GLOBALS->vlist_prepack) { fprintf(stderr, "Warning! File size is %d MB. This might fail in recoding.\n" "Consider converting it to the FST database format instead. (See the\n" "vcd2fst(1) manpage for more information.)\n" "To disable this warning, set rc variable vcd_warning_filesize to zero.\n" "Alternatively, use the -o, --optimize command line option to convert to FST\n" "or the -g, --giga command line option to use dynamically compressed memory.\n\n", (int)(GLOBALS->vcd_fsiz_vcd_recoder_c_2/(1024*1024))); } else { fprintf(stderr, "VCDLOAD | File size is %d MB, using vlist prepacking%s.\n\n", (int)(GLOBALS->vcd_fsiz_vcd_recoder_c_2/(1024*1024)), GLOBALS->vlist_spill_to_disk ? " and spill file" : ""); } } } else { GLOBALS->splash_disable = 1; GLOBALS->vcd_handle_vcd_recoder_c_2=stdin; } GLOBALS->vcd_is_compressed_vcd_recoder_c_2=0; } if(!GLOBALS->vcd_handle_vcd_recoder_c_2) { fprintf(stderr, "Error opening %s .vcd file '%s'.\n", GLOBALS->vcd_is_compressed_vcd_recoder_c_2?"compressed":"", fname); perror("Why"); vcd_exit(255); } /* SPLASH */ splash_create(); sym_hash_initialize(GLOBALS); getch_alloc(); /* alloc membuff for vcd getch buffer */ build_slisthier(); GLOBALS->time_vlist_vcd_recoder_c_1 = vlist_create(sizeof(TimeType)); if(GLOBALS->use_fastload == VCD_FSL_WRITE) { GLOBALS->time_vlist_vcd_recoder_write = ((struct vlist_t *)vlist_packer_create()); } if((GLOBALS->vlist_spill_to_disk) && (GLOBALS->use_fastload != VCD_FSL_READ)) { vlist_init_spillfile(); } vcd_parse(); if(GLOBALS->varsplit_vcd_recoder_c_3) { free_2(GLOBALS->varsplit_vcd_recoder_c_3); GLOBALS->varsplit_vcd_recoder_c_3=NULL; } if(GLOBALS->vlist_handle) { FILE *vh = GLOBALS->vlist_handle; GLOBALS->vlist_handle = NULL; vlist_freeze(&GLOBALS->time_vlist_vcd_recoder_c_1); GLOBALS->vlist_handle = vh; } else { vlist_freeze(&GLOBALS->time_vlist_vcd_recoder_c_1); } if(GLOBALS->time_vlist_vcd_recoder_write) { write_fastload_time_section(); } if(GLOBALS->use_fastload != VCD_FSL_READ) { finalize_cnt = vlist_emit_finalize(); } if(GLOBALS->time_vlist_vcd_recoder_write) { #ifdef HAVE_SYS_STAT_H write_fastload_header(&mystat, finalize_cnt); #else write_fastload_header(finalize_cnt); #endif } if((!GLOBALS->sorted_vcd_recoder_c_3)&&(!GLOBALS->indexed_vcd_recoder_c_3)) { fprintf(stderr, "No symbols in VCD file..is it malformed? Exiting!\n"); vcd_exit(255); } if(GLOBALS->vcd_save_handle) { fclose(GLOBALS->vcd_save_handle); GLOBALS->vcd_save_handle = NULL; } fprintf(stderr, "["TTFormat"] start time.\n["TTFormat"] end time.\n", GLOBALS->start_time_vcd_recoder_c_3*GLOBALS->time_scale, GLOBALS->end_time_vcd_recoder_c_3*GLOBALS->time_scale); if(GLOBALS->vcd_fsiz_vcd_recoder_c_2) { splash_sync(GLOBALS->vcd_fsiz_vcd_recoder_c_2, GLOBALS->vcd_fsiz_vcd_recoder_c_2); GLOBALS->vcd_fsiz_vcd_recoder_c_2 = 0; } else if(GLOBALS->vcd_is_compressed_vcd_recoder_c_2) { splash_sync(1,1); GLOBALS->vcd_fsiz_vcd_recoder_c_2 = 0; } GLOBALS->min_time=GLOBALS->start_time_vcd_recoder_c_3*GLOBALS->time_scale; GLOBALS->max_time=GLOBALS->end_time_vcd_recoder_c_3*GLOBALS->time_scale; GLOBALS->global_time_offset = GLOBALS->global_time_offset * GLOBALS->time_scale; if((GLOBALS->min_time==GLOBALS->max_time)&&(GLOBALS->max_time==LLDescriptor(-1))) { fprintf(stderr, "VCD times range is equal to zero. Exiting.\n"); vcd_exit(255); } vcd_build_symbols(); vcd_sortfacs(); vcd_cleanup(); getch_free(); /* free membuff for vcd getch buffer */ if(GLOBALS->blackout_regions) { struct blackout_region_t *bt = GLOBALS->blackout_regions; while(bt) { bt->bstart *= GLOBALS->time_scale; bt->bend *= GLOBALS->time_scale; bt = bt->next; } } /* is_vcd=~0; */ GLOBALS->is_lx2 = LXT2_IS_VLIST; /* SPLASH */ splash_finalize(); return(GLOBALS->max_time); } /*******************************************************************************/ void vcd_import_masked(void) { /* nothing */ } void vcd_set_fac_process_mask(nptr np) { if(np && np->mv.mvlfac_vlist) { import_vcd_trace(np); } } #define vlist_locate_import(x,y) ((GLOBALS->vlist_prepack) ? ((depacked) + (y)) : vlist_locate((x),(y))) void import_vcd_trace(nptr np) { struct vlist_t *v = np->mv.mvlfac_vlist; int len = 1; unsigned int list_size; unsigned char vlist_type; /* unsigned int vartype = 0; */ /* scan-build */ unsigned int vlist_pos = 0; unsigned char *chp; unsigned int time_idx = 0; TimeType *curtime_pnt; unsigned char arr[5]; int arr_pos; unsigned int accum; unsigned char ch; double *d; unsigned char *depacked = NULL; if(!v) return; vlist_uncompress(&v); if(GLOBALS->vlist_prepack) { depacked = vlist_packer_decompress(v, &list_size); vlist_destroy(v); } else { list_size=vlist_size(v); } if(!list_size) { len = 1; vlist_type = '!'; /* possible alias */ } else { chp = vlist_locate_import(v, vlist_pos++); if(chp) { switch((vlist_type = (*chp & 0x7f))) { case '0': len = 1; chp = vlist_locate_import(v, vlist_pos++); if(!chp) { fprintf(stderr, "Internal error file '%s' line %d, exiting.\n", __FILE__, __LINE__); exit(255); } /* vartype = (unsigned int)(*chp & 0x7f); */ /*scan-build */ break; case 'B': case 'R': case 'S': chp = vlist_locate_import(v, vlist_pos++); if(!chp) { fprintf(stderr, "Internal error file '%s' line %d, exiting.\n", __FILE__, __LINE__); exit(255); } /* vartype = (unsigned int)(*chp & 0x7f); */ /* scan-build */ arr_pos = accum = 0; do { chp = vlist_locate_import(v, vlist_pos++); if(!chp) break; ch = *chp; arr[arr_pos++] = ch; } while (!(ch & 0x80)); for(--arr_pos; arr_pos>=0; arr_pos--) { ch = arr[arr_pos]; accum <<= 7; accum |= (unsigned int)(ch & 0x7f); } len = accum; break; default: fprintf(stderr, "Unsupported vlist type '%c', exiting.", vlist_type); vcd_exit(255); break; } } else { len = 1; vlist_type = '!'; /* possible alias */ } } if(vlist_type == '0') /* single bit */ { while(vlist_pos < list_size) { unsigned int delta, bitval; char ascval; arr_pos = accum = 0; do { chp = vlist_locate_import(v, vlist_pos++); if(!chp) break; ch = *chp; arr[arr_pos++] = ch; } while (!(ch & 0x80)); for(--arr_pos; arr_pos>=0; arr_pos--) { ch = arr[arr_pos]; accum <<= 7; accum |= (unsigned int)(ch & 0x7f); } if(!(accum&1)) { delta = accum >> 2; bitval = (accum >> 1) & 1; ascval = '0' + bitval; } else { delta = accum >> 4; bitval = (accum >> 1) & 7; ascval = RCV_STR[bitval]; } time_idx += delta; curtime_pnt = vlist_locate(GLOBALS->time_vlist_vcd_recoder_c_1, time_idx ? time_idx-1 : 0); if(!curtime_pnt) { fprintf(stderr, "GTKWAVE | malformed bitwise signal data for '%s' after time_idx = %d\n", np->nname, time_idx - delta); exit(255); } add_histent(*curtime_pnt,np,ascval,1, NULL); } add_histent(MAX_HISTENT_TIME-1, np, 'x', 0, NULL); add_histent(MAX_HISTENT_TIME, np, 'z', 0, NULL); } else if(vlist_type == 'B') /* bit vector, port type was converted to bit vector already */ { char *sbuf = malloc_2(len+1); int dst_len; char *vector; while(vlist_pos < list_size) { unsigned int delta; arr_pos = accum = 0; do { chp = vlist_locate_import(v, vlist_pos++); if(!chp) break; ch = *chp; arr[arr_pos++] = ch; } while (!(ch & 0x80)); for(--arr_pos; arr_pos>=0; arr_pos--) { ch = arr[arr_pos]; accum <<= 7; accum |= (unsigned int)(ch & 0x7f); } delta = accum; time_idx += delta; curtime_pnt = vlist_locate(GLOBALS->time_vlist_vcd_recoder_c_1, time_idx ? time_idx-1 : 0); if(!curtime_pnt) { fprintf(stderr, "GTKWAVE | malformed 'b' signal data for '%s' after time_idx = %d\n", np->nname, time_idx - delta); exit(255); } dst_len = 0; for(;;) { chp = vlist_locate_import(v, vlist_pos++); if(!chp) break; ch = *chp; if((ch >> 4) == AN_MSK) break; if(dst_len == len) { if(len != 1) memmove(sbuf, sbuf+1, dst_len - 1); dst_len--; } sbuf[dst_len++] = AN_STR[ch >> 4]; if((ch & AN_MSK) == AN_MSK) break; if(dst_len == len) { if(len != 1) memmove(sbuf, sbuf+1, dst_len - 1); dst_len--; } sbuf[dst_len++] = AN_STR[ch & AN_MSK]; } if(len == 1) { add_histent(*curtime_pnt, np,sbuf[0],1, NULL); } else { vector = malloc_2(len+1); if(dst_len < len) { unsigned char extend=(sbuf[0]=='1')?'0':sbuf[0]; memset(vector, extend, len - dst_len); memcpy(vector + (len - dst_len), sbuf, dst_len); } else { memcpy(vector, sbuf, len); } vector[len] = 0; add_histent(*curtime_pnt, np,0,1,vector); } } if(len==1) { add_histent(MAX_HISTENT_TIME-1, np, 'x', 0, NULL); add_histent(MAX_HISTENT_TIME, np, 'z', 0, NULL); } else { add_histent(MAX_HISTENT_TIME-1, np, 'x', 0, (char *)calloc_2(1,sizeof(char))); add_histent(MAX_HISTENT_TIME, np, 'z', 0, (char *)calloc_2(1,sizeof(char))); } free_2(sbuf); } else if(vlist_type == 'R') /* real */ { char *sbuf = malloc_2(64); int dst_len; char *vector; while(vlist_pos < list_size) { unsigned int delta; arr_pos = accum = 0; do { chp = vlist_locate_import(v, vlist_pos++); if(!chp) break; ch = *chp; arr[arr_pos++] = ch; } while (!(ch & 0x80)); for(--arr_pos; arr_pos>=0; arr_pos--) { ch = arr[arr_pos]; accum <<= 7; accum |= (unsigned int)(ch & 0x7f); } delta = accum; time_idx += delta; curtime_pnt = vlist_locate(GLOBALS->time_vlist_vcd_recoder_c_1, time_idx ? time_idx-1 : 0); if(!curtime_pnt) { fprintf(stderr, "GTKWAVE | malformed 'r' signal data for '%s' after time_idx = %d\n", np->nname, time_idx - delta); exit(255); } dst_len = 0; do { chp = vlist_locate_import(v, vlist_pos++); if(!chp) break; ch = *chp; sbuf[dst_len++] = ch; } while(ch); vector=malloc_2(sizeof(double)); sscanf(sbuf,"%lg",(double *)vector); add_histent(*curtime_pnt, np,'g',1,(char *)vector); } d=malloc_2(sizeof(double)); *d=1.0; add_histent(MAX_HISTENT_TIME-1, np, 'g', 0, (char *)d); d=malloc_2(sizeof(double)); *d=0.0; add_histent(MAX_HISTENT_TIME, np, 'g', 0, (char *)d); free_2(sbuf); } else if(vlist_type == 'S') /* string */ { char *sbuf = malloc_2(list_size); /* being conservative */ int dst_len; char *vector; while(vlist_pos < list_size) { unsigned int delta; arr_pos = accum = 0; do { chp = vlist_locate_import(v, vlist_pos++); if(!chp) break; ch = *chp; arr[arr_pos++] = ch; } while (!(ch & 0x80)); for(--arr_pos; arr_pos>=0; arr_pos--) { ch = arr[arr_pos]; accum <<= 7; accum |= (unsigned int)(ch & 0x7f); } delta = accum; time_idx += delta; curtime_pnt = vlist_locate(GLOBALS->time_vlist_vcd_recoder_c_1, time_idx ? time_idx-1 : 0); if(!curtime_pnt) { fprintf(stderr, "GTKWAVE | malformed 's' signal data for '%s' after time_idx = %d\n", np->nname, time_idx - delta); exit(255); } dst_len = 0; do { chp = vlist_locate_import(v, vlist_pos++); if(!chp) break; ch = *chp; sbuf[dst_len++] = ch; } while(ch); vector=malloc_2(dst_len + 1); strcpy(vector, sbuf); add_histent(*curtime_pnt, np,'s',1,(char *)vector); } d=malloc_2(sizeof(double)); *d=1.0; add_histent(MAX_HISTENT_TIME-1, np, 'g', 0, (char *)d); d=malloc_2(sizeof(double)); *d=0.0; add_histent(MAX_HISTENT_TIME, np, 'g', 0, (char *)d); free_2(sbuf); } else if(vlist_type == '!') /* error in loading */ { nptr n2 = (nptr)np->curr; if((n2)&&(n2 != np)) /* keep out any possible infinite recursion from corrupt pointer bugs */ { import_vcd_trace(n2); if(GLOBALS->vlist_prepack) { vlist_packer_decompress_destroy((char *)depacked); } else { vlist_destroy(v); } np->mv.mvlfac_vlist = NULL; np->head = n2->head; np->curr = n2->curr; return; } fprintf(stderr, "Error in decompressing vlist for '%s', exiting.\n", np->nname); vcd_exit(255); } if(GLOBALS->vlist_prepack) { vlist_packer_decompress_destroy((char *)depacked); } else { vlist_destroy(v); } np->mv.mvlfac_vlist = NULL; } gtkwave-3.3.86/src/libz/0000775000175000017500000000000013166335473014333 5ustar bybellbybellgtkwave-3.3.86/src/libz/deflate.c0000664000175000017500000023205113166335473016106 0ustar bybellbybell/* deflate.c -- compress data using the deflation algorithm * Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* * ALGORITHM * * The "deflation" process depends on being able to identify portions * of the input text which are identical to earlier input (within a * sliding window trailing behind the input currently being processed). * * The most straightforward technique turns out to be the fastest for * most input files: try all possible matches and select the longest. * The key feature of this algorithm is that insertions into the string * dictionary are very simple and thus fast, and deletions are avoided * completely. Insertions are performed at each input character, whereas * string matches are performed only when the previous match ends. So it * is preferable to spend more time in matches to allow very fast string * insertions and avoid deletions. The matching algorithm for small * strings is inspired from that of Rabin & Karp. A brute force approach * is used to find longer strings when a small match has been found. * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze * (by Leonid Broukhis). * A previous version of this file used a more sophisticated algorithm * (by Fiala and Greene) which is guaranteed to run in linear amortized * time, but has a larger average cost, uses more memory and is patented. * However the F&G algorithm may be faster for some highly redundant * files if the parameter max_chain_length (described below) is too large. * * ACKNOWLEDGEMENTS * * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and * I found it in 'freeze' written by Leonid Broukhis. * Thanks to many people for bug reports and testing. * * REFERENCES * * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". * Available in http://tools.ietf.org/html/rfc1951 * * A description of the Rabin and Karp algorithm is given in the book * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. * * Fiala,E.R., and Greene,D.H. * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 * */ /* @(#) $Id$ */ #include "deflate.h" const char deflate_copyright[] = " deflate 1.2.11 Copyright 1995-2017 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot include such an acknowledgment, I would appreciate that you keep this copyright string in the executable of your product. */ /* =========================================================================== * Function prototypes. */ typedef enum { need_more, /* block not completed, need more input or more output */ block_done, /* block flush performed */ finish_started, /* finish started, need only more output at next deflate */ finish_done /* finish done, accept no more input or output */ } block_state; typedef block_state (*compress_func) OF((deflate_state *s, int flush)); /* Compression function. Returns the block state after the call. */ local int deflateStateCheck OF((z_streamp strm)); local void slide_hash OF((deflate_state *s)); local void fill_window OF((deflate_state *s)); local block_state deflate_stored OF((deflate_state *s, int flush)); local block_state deflate_fast OF((deflate_state *s, int flush)); #ifndef FASTEST local block_state deflate_slow OF((deflate_state *s, int flush)); #endif local block_state deflate_rle OF((deflate_state *s, int flush)); local block_state deflate_huff OF((deflate_state *s, int flush)); local void lm_init OF((deflate_state *s)); local void putShortMSB OF((deflate_state *s, uInt b)); local void flush_pending OF((z_streamp strm)); local unsigned read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); #ifdef ASMV # pragma message("Assembler code may have bugs -- use at your own risk") void match_init OF((void)); /* asm code initialization */ uInt longest_match OF((deflate_state *s, IPos cur_match)); #else local uInt longest_match OF((deflate_state *s, IPos cur_match)); #endif #ifdef ZLIB_DEBUG local void check_match OF((deflate_state *s, IPos start, IPos match, int length)); #endif /* =========================================================================== * Local data */ #define NIL 0 /* Tail of hash chains */ #ifndef TOO_FAR # define TOO_FAR 4096 #endif /* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ /* Values for max_lazy_match, good_match and max_chain_length, depending on * the desired pack level (0..9). The values given below have been tuned to * exclude worst case performance for pathological files. Better values may be * found for specific files. */ typedef struct config_s { ush good_length; /* reduce lazy search above this match length */ ush max_lazy; /* do not perform lazy search above this match length */ ush nice_length; /* quit search above this match length */ ush max_chain; compress_func func; } config; #ifdef FASTEST local const config configuration_table[2] = { /* good lazy nice chain */ /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ /* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ #else local const config configuration_table[10] = { /* good lazy nice chain */ /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ /* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ /* 2 */ {4, 5, 16, 8, deflate_fast}, /* 3 */ {4, 6, 32, 32, deflate_fast}, /* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ /* 5 */ {8, 16, 32, 32, deflate_slow}, /* 6 */ {8, 16, 128, 128, deflate_slow}, /* 7 */ {8, 32, 128, 256, deflate_slow}, /* 8 */ {32, 128, 258, 1024, deflate_slow}, /* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ #endif /* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 * For deflate_fast() (levels <= 3) good is ignored and lazy has a different * meaning. */ /* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */ #define RANK(f) (((f) * 2) - ((f) > 4 ? 9 : 0)) /* =========================================================================== * Update a hash value with the given input byte * IN assertion: all calls to UPDATE_HASH are made with consecutive input * characters, so that a running hash key can be computed from the previous * key instead of complete recalculation each time. */ #define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) /* =========================================================================== * Insert string str in the dictionary and set match_head to the previous head * of the hash chain (the most recent string with same hash key). Return * the previous length of the hash chain. * If this file is compiled with -DFASTEST, the compression level is forced * to 1, and no hash chains are maintained. * IN assertion: all calls to INSERT_STRING are made with consecutive input * characters and the first MIN_MATCH bytes of str are valid (except for * the last MIN_MATCH-1 bytes of the input file). */ #ifdef FASTEST #define INSERT_STRING(s, str, match_head) \ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ match_head = s->head[s->ins_h], \ s->head[s->ins_h] = (Pos)(str)) #else #define INSERT_STRING(s, str, match_head) \ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ s->head[s->ins_h] = (Pos)(str)) #endif /* =========================================================================== * Initialize the hash table (avoiding 64K overflow for 16 bit systems). * prev[] will be initialized on the fly. */ #define CLEAR_HASH(s) \ s->head[s->hash_size-1] = NIL; \ zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); /* =========================================================================== * Slide the hash table when sliding the window down (could be avoided with 32 * bit values at the expense of memory usage). We slide even when level == 0 to * keep the hash table consistent if we switch back to level > 0 later. */ local void slide_hash(s) deflate_state *s; { unsigned n, m; Posf *p; uInt wsize = s->w_size; n = s->hash_size; p = &s->head[n]; do { m = *--p; *p = (Pos)(m >= wsize ? m - wsize : NIL); } while (--n); n = wsize; #ifndef FASTEST p = &s->prev[n]; do { m = *--p; *p = (Pos)(m >= wsize ? m - wsize : NIL); /* If n is not on any hash chain, prev[n] is garbage but * its value will never be used. */ } while (--n); #endif } /* ========================================================================= */ int ZEXPORT deflateInit_(strm, level, version, stream_size) z_streamp strm; int level; const char *version; int stream_size; { return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, version, stream_size); /* To do: ignore strm->next_in if we use it as window */ } /* ========================================================================= */ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, version, stream_size) z_streamp strm; int level; int method; int windowBits; int memLevel; int strategy; const char *version; int stream_size; { deflate_state *s; int wrap = 1; static const char my_version[] = ZLIB_VERSION; ushf *overlay; /* We overlay pending_buf and d_buf+l_buf. This works since the average * output size for (length,distance) codes is <= 24 bits. */ if (version == Z_NULL || version[0] != my_version[0] || stream_size != sizeof(z_stream)) { return Z_VERSION_ERROR; } if (strm == Z_NULL) return Z_STREAM_ERROR; strm->msg = Z_NULL; if (strm->zalloc == (alloc_func)0) { #ifdef Z_SOLO return Z_STREAM_ERROR; #else strm->zalloc = zcalloc; strm->opaque = (voidpf)0; #endif } if (strm->zfree == (free_func)0) #ifdef Z_SOLO return Z_STREAM_ERROR; #else strm->zfree = zcfree; #endif #ifdef FASTEST if (level != 0) level = 1; #else if (level == Z_DEFAULT_COMPRESSION) level = 6; #endif if (windowBits < 0) { /* suppress zlib wrapper */ wrap = 0; windowBits = -windowBits; } #ifdef GZIP else if (windowBits > 15) { wrap = 2; /* write gzip wrapper instead */ windowBits -= 16; } #endif if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED || (windowBits == 8 && wrap != 1)) { return Z_STREAM_ERROR; } if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); if (s == Z_NULL) return Z_MEM_ERROR; strm->state = (struct internal_state FAR *)s; s->strm = strm; s->status = INIT_STATE; /* to pass state test in deflateReset() */ s->wrap = wrap; s->gzhead = Z_NULL; s->w_bits = (uInt)windowBits; s->w_size = 1 << s->w_bits; s->w_mask = s->w_size - 1; s->hash_bits = (uInt)memLevel + 7; s->hash_size = 1 << s->hash_bits; s->hash_mask = s->hash_size - 1; s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); s->high_water = 0; /* nothing written to s->window yet */ s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); s->pending_buf = (uchf *) overlay; s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || s->pending_buf == Z_NULL) { s->status = FINISH_STATE; strm->msg = ERR_MSG(Z_MEM_ERROR); deflateEnd (strm); return Z_MEM_ERROR; } s->d_buf = overlay + s->lit_bufsize/sizeof(ush); s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; s->level = level; s->strategy = strategy; s->method = (Byte)method; return deflateReset(strm); } /* ========================================================================= * Check for a valid deflate stream state. Return 0 if ok, 1 if not. */ local int deflateStateCheck (strm) z_streamp strm; { deflate_state *s; if (strm == Z_NULL || strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) return 1; s = strm->state; if (s == Z_NULL || s->strm != strm || (s->status != INIT_STATE && #ifdef GZIP s->status != GZIP_STATE && #endif s->status != EXTRA_STATE && s->status != NAME_STATE && s->status != COMMENT_STATE && s->status != HCRC_STATE && s->status != BUSY_STATE && s->status != FINISH_STATE)) return 1; return 0; } /* ========================================================================= */ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) z_streamp strm; const Bytef *dictionary; uInt dictLength; { deflate_state *s; uInt str, n; int wrap; unsigned avail; z_const unsigned char *next; if (deflateStateCheck(strm) || dictionary == Z_NULL) return Z_STREAM_ERROR; s = strm->state; wrap = s->wrap; if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead) return Z_STREAM_ERROR; /* when using zlib wrappers, compute Adler-32 for provided dictionary */ if (wrap == 1) strm->adler = adler32(strm->adler, dictionary, dictLength); s->wrap = 0; /* avoid computing Adler-32 in read_buf */ /* if dictionary would fill window, just replace the history */ if (dictLength >= s->w_size) { if (wrap == 0) { /* already empty otherwise */ CLEAR_HASH(s); s->strstart = 0; s->block_start = 0L; s->insert = 0; } dictionary += dictLength - s->w_size; /* use the tail */ dictLength = s->w_size; } /* insert dictionary into window and hash */ avail = strm->avail_in; next = strm->next_in; strm->avail_in = dictLength; strm->next_in = (z_const Bytef *)dictionary; fill_window(s); while (s->lookahead >= MIN_MATCH) { str = s->strstart; n = s->lookahead - (MIN_MATCH-1); do { UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); #ifndef FASTEST s->prev[str & s->w_mask] = s->head[s->ins_h]; #endif s->head[s->ins_h] = (Pos)str; str++; } while (--n); s->strstart = str; s->lookahead = MIN_MATCH-1; fill_window(s); } s->strstart += s->lookahead; s->block_start = (long)s->strstart; s->insert = s->lookahead; s->lookahead = 0; s->match_length = s->prev_length = MIN_MATCH-1; s->match_available = 0; strm->next_in = next; strm->avail_in = avail; s->wrap = wrap; return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength) z_streamp strm; Bytef *dictionary; uInt *dictLength; { deflate_state *s; uInt len; if (deflateStateCheck(strm)) return Z_STREAM_ERROR; s = strm->state; len = s->strstart + s->lookahead; if (len > s->w_size) len = s->w_size; if (dictionary != Z_NULL && len) zmemcpy(dictionary, s->window + s->strstart + s->lookahead - len, len); if (dictLength != Z_NULL) *dictLength = len; return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateResetKeep (strm) z_streamp strm; { deflate_state *s; if (deflateStateCheck(strm)) { return Z_STREAM_ERROR; } strm->total_in = strm->total_out = 0; strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ strm->data_type = Z_UNKNOWN; s = (deflate_state *)strm->state; s->pending = 0; s->pending_out = s->pending_buf; if (s->wrap < 0) { s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ } s->status = #ifdef GZIP s->wrap == 2 ? GZIP_STATE : #endif s->wrap ? INIT_STATE : BUSY_STATE; strm->adler = #ifdef GZIP s->wrap == 2 ? crc32(0L, Z_NULL, 0) : #endif adler32(0L, Z_NULL, 0); s->last_flush = Z_NO_FLUSH; _tr_init(s); return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateReset (strm) z_streamp strm; { int ret; ret = deflateResetKeep(strm); if (ret == Z_OK) lm_init(strm->state); return ret; } /* ========================================================================= */ int ZEXPORT deflateSetHeader (strm, head) z_streamp strm; gz_headerp head; { if (deflateStateCheck(strm) || strm->state->wrap != 2) return Z_STREAM_ERROR; strm->state->gzhead = head; return Z_OK; } /* ========================================================================= */ int ZEXPORT deflatePending (strm, pending, bits) unsigned *pending; int *bits; z_streamp strm; { if (deflateStateCheck(strm)) return Z_STREAM_ERROR; if (pending != Z_NULL) *pending = strm->state->pending; if (bits != Z_NULL) *bits = strm->state->bi_valid; return Z_OK; } /* ========================================================================= */ int ZEXPORT deflatePrime (strm, bits, value) z_streamp strm; int bits; int value; { deflate_state *s; int put; if (deflateStateCheck(strm)) return Z_STREAM_ERROR; s = strm->state; if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) return Z_BUF_ERROR; do { put = Buf_size - s->bi_valid; if (put > bits) put = bits; s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid); s->bi_valid += put; _tr_flush_bits(s); value >>= put; bits -= put; } while (bits); return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateParams(strm, level, strategy) z_streamp strm; int level; int strategy; { deflate_state *s; compress_func func; if (deflateStateCheck(strm)) return Z_STREAM_ERROR; s = strm->state; #ifdef FASTEST if (level != 0) level = 1; #else if (level == Z_DEFAULT_COMPRESSION) level = 6; #endif if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { return Z_STREAM_ERROR; } func = configuration_table[s->level].func; if ((strategy != s->strategy || func != configuration_table[level].func) && s->high_water) { /* Flush the last buffer: */ int err = deflate(strm, Z_BLOCK); if (err == Z_STREAM_ERROR) return err; if (strm->avail_out == 0) return Z_BUF_ERROR; } if (s->level != level) { if (s->level == 0 && s->matches != 0) { if (s->matches == 1) slide_hash(s); else CLEAR_HASH(s); s->matches = 0; } s->level = level; s->max_lazy_match = configuration_table[level].max_lazy; s->good_match = configuration_table[level].good_length; s->nice_match = configuration_table[level].nice_length; s->max_chain_length = configuration_table[level].max_chain; } s->strategy = strategy; return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) z_streamp strm; int good_length; int max_lazy; int nice_length; int max_chain; { deflate_state *s; if (deflateStateCheck(strm)) return Z_STREAM_ERROR; s = strm->state; s->good_match = (uInt)good_length; s->max_lazy_match = (uInt)max_lazy; s->nice_match = nice_length; s->max_chain_length = (uInt)max_chain; return Z_OK; } /* ========================================================================= * For the default windowBits of 15 and memLevel of 8, this function returns * a close to exact, as well as small, upper bound on the compressed size. * They are coded as constants here for a reason--if the #define's are * changed, then this function needs to be changed as well. The return * value for 15 and 8 only works for those exact settings. * * For any setting other than those defaults for windowBits and memLevel, * the value returned is a conservative worst case for the maximum expansion * resulting from using fixed blocks instead of stored blocks, which deflate * can emit on compressed data for some combinations of the parameters. * * This function could be more sophisticated to provide closer upper bounds for * every combination of windowBits and memLevel. But even the conservative * upper bound of about 14% expansion does not seem onerous for output buffer * allocation. */ uLong ZEXPORT deflateBound(strm, sourceLen) z_streamp strm; uLong sourceLen; { deflate_state *s; uLong complen, wraplen; /* conservative upper bound for compressed data */ complen = sourceLen + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; /* if can't get parameters, return conservative bound plus zlib wrapper */ if (deflateStateCheck(strm)) return complen + 6; /* compute wrapper length */ s = strm->state; switch (s->wrap) { case 0: /* raw deflate */ wraplen = 0; break; case 1: /* zlib wrapper */ wraplen = 6 + (s->strstart ? 4 : 0); break; #ifdef GZIP case 2: /* gzip wrapper */ wraplen = 18; if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ Bytef *str; if (s->gzhead->extra != Z_NULL) wraplen += 2 + s->gzhead->extra_len; str = s->gzhead->name; if (str != Z_NULL) do { wraplen++; } while (*str++); str = s->gzhead->comment; if (str != Z_NULL) do { wraplen++; } while (*str++); if (s->gzhead->hcrc) wraplen += 2; } break; #endif default: /* for compiler happiness */ wraplen = 6; } /* if not default parameters, return conservative bound */ if (s->w_bits != 15 || s->hash_bits != 8 + 7) return complen + wraplen; /* default settings: return tight bound for that case */ return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + (sourceLen >> 25) + 13 - 6 + wraplen; } /* ========================================================================= * Put a short in the pending buffer. The 16-bit value is put in MSB order. * IN assertion: the stream state is correct and there is enough room in * pending_buf. */ local void putShortMSB (s, b) deflate_state *s; uInt b; { put_byte(s, (Byte)(b >> 8)); put_byte(s, (Byte)(b & 0xff)); } /* ========================================================================= * Flush as much pending output as possible. All deflate() output, except for * some deflate_stored() output, goes through this function so some * applications may wish to modify it to avoid allocating a large * strm->next_out buffer and copying into it. (See also read_buf()). */ local void flush_pending(strm) z_streamp strm; { unsigned len; deflate_state *s = strm->state; _tr_flush_bits(s); len = s->pending; if (len > strm->avail_out) len = strm->avail_out; if (len == 0) return; zmemcpy(strm->next_out, s->pending_out, len); strm->next_out += len; s->pending_out += len; strm->total_out += len; strm->avail_out -= len; s->pending -= len; if (s->pending == 0) { s->pending_out = s->pending_buf; } } /* =========================================================================== * Update the header CRC with the bytes s->pending_buf[beg..s->pending - 1]. */ #define HCRC_UPDATE(beg) \ do { \ if (s->gzhead->hcrc && s->pending > (beg)) \ strm->adler = crc32(strm->adler, s->pending_buf + (beg), \ s->pending - (beg)); \ } while (0) /* ========================================================================= */ int ZEXPORT deflate (strm, flush) z_streamp strm; int flush; { int old_flush; /* value of flush param for previous deflate call */ deflate_state *s; if (deflateStateCheck(strm) || flush > Z_BLOCK || flush < 0) { return Z_STREAM_ERROR; } s = strm->state; if (strm->next_out == Z_NULL || (strm->avail_in != 0 && strm->next_in == Z_NULL) || (s->status == FINISH_STATE && flush != Z_FINISH)) { ERR_RETURN(strm, Z_STREAM_ERROR); } if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); old_flush = s->last_flush; s->last_flush = flush; /* Flush as much pending output as possible */ if (s->pending != 0) { flush_pending(strm); if (strm->avail_out == 0) { /* Since avail_out is 0, deflate will be called again with * more output space, but possibly with both pending and * avail_in equal to zero. There won't be anything to do, * but this is not an error situation so make sure we * return OK instead of BUF_ERROR at next call of deflate: */ s->last_flush = -1; return Z_OK; } /* Make sure there is something to do and avoid duplicate consecutive * flushes. For repeated and useless calls with Z_FINISH, we keep * returning Z_STREAM_END instead of Z_BUF_ERROR. */ } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) && flush != Z_FINISH) { ERR_RETURN(strm, Z_BUF_ERROR); } /* User must not provide more input after the first FINISH: */ if (s->status == FINISH_STATE && strm->avail_in != 0) { ERR_RETURN(strm, Z_BUF_ERROR); } /* Write the header */ if (s->status == INIT_STATE) { /* zlib header */ uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; uInt level_flags; if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) level_flags = 0; else if (s->level < 6) level_flags = 1; else if (s->level == 6) level_flags = 2; else level_flags = 3; header |= (level_flags << 6); if (s->strstart != 0) header |= PRESET_DICT; header += 31 - (header % 31); putShortMSB(s, header); /* Save the adler32 of the preset dictionary: */ if (s->strstart != 0) { putShortMSB(s, (uInt)(strm->adler >> 16)); putShortMSB(s, (uInt)(strm->adler & 0xffff)); } strm->adler = adler32(0L, Z_NULL, 0); s->status = BUSY_STATE; /* Compression must start with an empty pending buffer */ flush_pending(strm); if (s->pending != 0) { s->last_flush = -1; return Z_OK; } } #ifdef GZIP if (s->status == GZIP_STATE) { /* gzip header */ strm->adler = crc32(0L, Z_NULL, 0); put_byte(s, 31); put_byte(s, 139); put_byte(s, 8); if (s->gzhead == Z_NULL) { put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, s->level == 9 ? 2 : (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0)); put_byte(s, OS_CODE); s->status = BUSY_STATE; /* Compression must start with an empty pending buffer */ flush_pending(strm); if (s->pending != 0) { s->last_flush = -1; return Z_OK; } } else { put_byte(s, (s->gzhead->text ? 1 : 0) + (s->gzhead->hcrc ? 2 : 0) + (s->gzhead->extra == Z_NULL ? 0 : 4) + (s->gzhead->name == Z_NULL ? 0 : 8) + (s->gzhead->comment == Z_NULL ? 0 : 16) ); put_byte(s, (Byte)(s->gzhead->time & 0xff)); put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); put_byte(s, s->level == 9 ? 2 : (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0)); put_byte(s, s->gzhead->os & 0xff); if (s->gzhead->extra != Z_NULL) { put_byte(s, s->gzhead->extra_len & 0xff); put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); } if (s->gzhead->hcrc) strm->adler = crc32(strm->adler, s->pending_buf, s->pending); s->gzindex = 0; s->status = EXTRA_STATE; } } if (s->status == EXTRA_STATE) { if (s->gzhead->extra != Z_NULL) { ulg beg = s->pending; /* start of bytes to update crc */ uInt left = (s->gzhead->extra_len & 0xffff) - s->gzindex; while (s->pending + left > s->pending_buf_size) { uInt copy = s->pending_buf_size - s->pending; zmemcpy(s->pending_buf + s->pending, s->gzhead->extra + s->gzindex, copy); s->pending = s->pending_buf_size; HCRC_UPDATE(beg); s->gzindex += copy; flush_pending(strm); if (s->pending != 0) { s->last_flush = -1; return Z_OK; } beg = 0; left -= copy; } zmemcpy(s->pending_buf + s->pending, s->gzhead->extra + s->gzindex, left); s->pending += left; HCRC_UPDATE(beg); s->gzindex = 0; } s->status = NAME_STATE; } if (s->status == NAME_STATE) { if (s->gzhead->name != Z_NULL) { ulg beg = s->pending; /* start of bytes to update crc */ int val; do { if (s->pending == s->pending_buf_size) { HCRC_UPDATE(beg); flush_pending(strm); if (s->pending != 0) { s->last_flush = -1; return Z_OK; } beg = 0; } val = s->gzhead->name[s->gzindex++]; put_byte(s, val); } while (val != 0); HCRC_UPDATE(beg); s->gzindex = 0; } s->status = COMMENT_STATE; } if (s->status == COMMENT_STATE) { if (s->gzhead->comment != Z_NULL) { ulg beg = s->pending; /* start of bytes to update crc */ int val; do { if (s->pending == s->pending_buf_size) { HCRC_UPDATE(beg); flush_pending(strm); if (s->pending != 0) { s->last_flush = -1; return Z_OK; } beg = 0; } val = s->gzhead->comment[s->gzindex++]; put_byte(s, val); } while (val != 0); HCRC_UPDATE(beg); } s->status = HCRC_STATE; } if (s->status == HCRC_STATE) { if (s->gzhead->hcrc) { if (s->pending + 2 > s->pending_buf_size) { flush_pending(strm); if (s->pending != 0) { s->last_flush = -1; return Z_OK; } } put_byte(s, (Byte)(strm->adler & 0xff)); put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); strm->adler = crc32(0L, Z_NULL, 0); } s->status = BUSY_STATE; /* Compression must start with an empty pending buffer */ flush_pending(strm); if (s->pending != 0) { s->last_flush = -1; return Z_OK; } } #endif /* Start a new block or continue the current one. */ if (strm->avail_in != 0 || s->lookahead != 0 || (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { block_state bstate; bstate = s->level == 0 ? deflate_stored(s, flush) : s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : s->strategy == Z_RLE ? deflate_rle(s, flush) : (*(configuration_table[s->level].func))(s, flush); if (bstate == finish_started || bstate == finish_done) { s->status = FINISH_STATE; } if (bstate == need_more || bstate == finish_started) { if (strm->avail_out == 0) { s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ } return Z_OK; /* If flush != Z_NO_FLUSH && avail_out == 0, the next call * of deflate should use the same flush parameter to make sure * that the flush is complete. So we don't have to output an * empty block here, this will be done at next call. This also * ensures that for a very small output buffer, we emit at most * one empty block. */ } if (bstate == block_done) { if (flush == Z_PARTIAL_FLUSH) { _tr_align(s); } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ _tr_stored_block(s, (char*)0, 0L, 0); /* For a full flush, this empty block will be recognized * as a special marker by inflate_sync(). */ if (flush == Z_FULL_FLUSH) { CLEAR_HASH(s); /* forget history */ if (s->lookahead == 0) { s->strstart = 0; s->block_start = 0L; s->insert = 0; } } } flush_pending(strm); if (strm->avail_out == 0) { s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ return Z_OK; } } } if (flush != Z_FINISH) return Z_OK; if (s->wrap <= 0) return Z_STREAM_END; /* Write the trailer */ #ifdef GZIP if (s->wrap == 2) { put_byte(s, (Byte)(strm->adler & 0xff)); put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); put_byte(s, (Byte)(strm->total_in & 0xff)); put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); } else #endif { putShortMSB(s, (uInt)(strm->adler >> 16)); putShortMSB(s, (uInt)(strm->adler & 0xffff)); } flush_pending(strm); /* If avail_out is zero, the application will call deflate again * to flush the rest. */ if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ return s->pending != 0 ? Z_OK : Z_STREAM_END; } /* ========================================================================= */ int ZEXPORT deflateEnd (strm) z_streamp strm; { int status; if (deflateStateCheck(strm)) return Z_STREAM_ERROR; status = strm->state->status; /* Deallocate in reverse order of allocations: */ TRY_FREE(strm, strm->state->pending_buf); TRY_FREE(strm, strm->state->head); TRY_FREE(strm, strm->state->prev); TRY_FREE(strm, strm->state->window); ZFREE(strm, strm->state); strm->state = Z_NULL; return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; } /* ========================================================================= * Copy the source state to the destination state. * To simplify the source, this is not supported for 16-bit MSDOS (which * doesn't have enough memory anyway to duplicate compression states). */ int ZEXPORT deflateCopy (dest, source) z_streamp dest; z_streamp source; { #ifdef MAXSEG_64K return Z_STREAM_ERROR; #else deflate_state *ds; deflate_state *ss; ushf *overlay; if (deflateStateCheck(source) || dest == Z_NULL) { return Z_STREAM_ERROR; } ss = source->state; zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); if (ds == Z_NULL) return Z_MEM_ERROR; dest->state = (struct internal_state FAR *) ds; zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state)); ds->strm = dest; ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); ds->pending_buf = (uchf *) overlay; if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || ds->pending_buf == Z_NULL) { deflateEnd (dest); return Z_MEM_ERROR; } /* following zmemcpy do not work for 16-bit MSDOS */ zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; ds->l_desc.dyn_tree = ds->dyn_ltree; ds->d_desc.dyn_tree = ds->dyn_dtree; ds->bl_desc.dyn_tree = ds->bl_tree; return Z_OK; #endif /* MAXSEG_64K */ } /* =========================================================================== * Read a new buffer from the current input stream, update the adler32 * and total number of bytes read. All deflate() input goes through * this function so some applications may wish to modify it to avoid * allocating a large strm->next_in buffer and copying from it. * (See also flush_pending()). */ local unsigned read_buf(strm, buf, size) z_streamp strm; Bytef *buf; unsigned size; { unsigned len = strm->avail_in; if (len > size) len = size; if (len == 0) return 0; strm->avail_in -= len; zmemcpy(buf, strm->next_in, len); if (strm->state->wrap == 1) { strm->adler = adler32(strm->adler, buf, len); } #ifdef GZIP else if (strm->state->wrap == 2) { strm->adler = crc32(strm->adler, buf, len); } #endif strm->next_in += len; strm->total_in += len; return len; } /* =========================================================================== * Initialize the "longest match" routines for a new zlib stream */ local void lm_init (s) deflate_state *s; { s->window_size = (ulg)2L*s->w_size; CLEAR_HASH(s); /* Set the default configuration parameters: */ s->max_lazy_match = configuration_table[s->level].max_lazy; s->good_match = configuration_table[s->level].good_length; s->nice_match = configuration_table[s->level].nice_length; s->max_chain_length = configuration_table[s->level].max_chain; s->strstart = 0; s->block_start = 0L; s->lookahead = 0; s->insert = 0; s->match_length = s->prev_length = MIN_MATCH-1; s->match_available = 0; s->ins_h = 0; #ifndef FASTEST #ifdef ASMV match_init(); /* initialize the asm code */ #endif #endif } #ifndef FASTEST /* =========================================================================== * Set match_start to the longest match starting at the given string and * return its length. Matches shorter or equal to prev_length are discarded, * in which case the result is equal to prev_length and match_start is * garbage. * IN assertions: cur_match is the head of the hash chain for the current * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 * OUT assertion: the match length is not greater than s->lookahead. */ #ifndef ASMV /* For 80x86 and 680x0, an optimized version will be provided in match.asm or * match.S. The code will be functionally equivalent. */ local uInt longest_match(s, cur_match) deflate_state *s; IPos cur_match; /* current match */ { unsigned chain_length = s->max_chain_length;/* max hash chain length */ register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ int best_len = (int)s->prev_length; /* best match length so far */ int nice_match = s->nice_match; /* stop if match long enough */ IPos limit = s->strstart > (IPos)MAX_DIST(s) ? s->strstart - (IPos)MAX_DIST(s) : NIL; /* Stop when cur_match becomes <= limit. To simplify the code, * we prevent matches with the string of window index 0. */ Posf *prev = s->prev; uInt wmask = s->w_mask; #ifdef UNALIGNED_OK /* Compare two bytes at a time. Note: this is not always beneficial. * Try with and without -DUNALIGNED_OK to check. */ register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; register ush scan_start = *(ushf*)scan; register ush scan_end = *(ushf*)(scan+best_len-1); #else register Bytef *strend = s->window + s->strstart + MAX_MATCH; register Byte scan_end1 = scan[best_len-1]; register Byte scan_end = scan[best_len]; #endif /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. * It is easy to get rid of this optimization if necessary. */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); /* Do not waste too much time if we already have a good match: */ if (s->prev_length >= s->good_match) { chain_length >>= 2; } /* Do not look for matches beyond the end of the input. This is necessary * to make deflate deterministic. */ if ((uInt)nice_match > s->lookahead) nice_match = (int)s->lookahead; Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); do { Assert(cur_match < s->strstart, "no future"); match = s->window + cur_match; /* Skip to next match if the match length cannot increase * or if the match length is less than 2. Note that the checks below * for insufficient lookahead only occur occasionally for performance * reasons. Therefore uninitialized memory will be accessed, and * conditional jumps will be made that depend on those values. * However the length of the match is limited to the lookahead, so * the output of deflate is not affected by the uninitialized values. */ #if (defined(UNALIGNED_OK) && MAX_MATCH == 258) /* This code assumes sizeof(unsigned short) == 2. Do not use * UNALIGNED_OK if your compiler uses a different size. */ if (*(ushf*)(match+best_len-1) != scan_end || *(ushf*)match != scan_start) continue; /* It is not necessary to compare scan[2] and match[2] since they are * always equal when the other bytes match, given that the hash keys * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at * strstart+3, +5, ... up to strstart+257. We check for insufficient * lookahead only every 4th comparison; the 128th check will be made * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is * necessary to put more guard bytes at the end of the window, or * to check more often for insufficient lookahead. */ Assert(scan[2] == match[2], "scan[2]?"); scan++, match++; do { } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && scan < strend); /* The funny "do {}" generates better code on most compilers */ /* Here, scan <= window+strstart+257 */ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); if (*scan == *match) scan++; len = (MAX_MATCH - 1) - (int)(strend-scan); scan = strend - (MAX_MATCH-1); #else /* UNALIGNED_OK */ if (match[best_len] != scan_end || match[best_len-1] != scan_end1 || *match != *scan || *++match != scan[1]) continue; /* The check at best_len-1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that * the hash keys are equal and that HASH_BITS >= 8. */ scan += 2, match++; Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; * the 256th check will be made at strstart+258. */ do { } while (*++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && scan < strend); Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); scan = strend - MAX_MATCH; #endif /* UNALIGNED_OK */ if (len > best_len) { s->match_start = cur_match; best_len = len; if (len >= nice_match) break; #ifdef UNALIGNED_OK scan_end = *(ushf*)(scan+best_len-1); #else scan_end1 = scan[best_len-1]; scan_end = scan[best_len]; #endif } } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length != 0); if ((uInt)best_len <= s->lookahead) return (uInt)best_len; return s->lookahead; } #endif /* ASMV */ #else /* FASTEST */ /* --------------------------------------------------------------------------- * Optimized version for FASTEST only */ local uInt longest_match(s, cur_match) deflate_state *s; IPos cur_match; /* current match */ { register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ register Bytef *strend = s->window + s->strstart + MAX_MATCH; /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. * It is easy to get rid of this optimization if necessary. */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); Assert(cur_match < s->strstart, "no future"); match = s->window + cur_match; /* Return failure if the match length is less than 2: */ if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; /* The check at best_len-1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that * the hash keys are equal and that HASH_BITS >= 8. */ scan += 2, match += 2; Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; * the 256th check will be made at strstart+258. */ do { } while (*++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && scan < strend); Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); if (len < MIN_MATCH) return MIN_MATCH - 1; s->match_start = cur_match; return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; } #endif /* FASTEST */ #ifdef ZLIB_DEBUG #define EQUAL 0 /* result of memcmp for equal strings */ /* =========================================================================== * Check that the match at match_start is indeed a match. */ local void check_match(s, start, match, length) deflate_state *s; IPos start, match; int length; { /* check that the match is indeed a match */ if (zmemcmp(s->window + match, s->window + start, length) != EQUAL) { fprintf(stderr, " start %u, match %u, length %d\n", start, match, length); do { fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); } while (--length != 0); z_error("invalid match"); } if (z_verbose > 1) { fprintf(stderr,"\\[%d,%d]", start-match, length); do { putc(s->window[start++], stderr); } while (--length != 0); } } #else # define check_match(s, start, match, length) #endif /* ZLIB_DEBUG */ /* =========================================================================== * Fill the window when the lookahead becomes insufficient. * Updates strstart and lookahead. * * IN assertion: lookahead < MIN_LOOKAHEAD * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD * At least one byte has been read, or avail_in == 0; reads are * performed for at least two bytes (required for the zip translate_eol * option -- not supported here). */ local void fill_window(s) deflate_state *s; { unsigned n; unsigned more; /* Amount of free space at the end of the window. */ uInt wsize = s->w_size; Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); do { more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); /* Deal with !@#$% 64K limit: */ if (sizeof(int) <= 2) { if (more == 0 && s->strstart == 0 && s->lookahead == 0) { more = wsize; } else if (more == (unsigned)(-1)) { /* Very unlikely, but possible on 16 bit machine if * strstart == 0 && lookahead == 1 (input done a byte at time) */ more--; } } /* If the window is almost full and there is insufficient lookahead, * move the upper half to the lower one to make room in the upper half. */ if (s->strstart >= wsize+MAX_DIST(s)) { zmemcpy(s->window, s->window+wsize, (unsigned)wsize - more); s->match_start -= wsize; s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ s->block_start -= (long) wsize; slide_hash(s); more += wsize; } if (s->strm->avail_in == 0) break; /* If there was no sliding: * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && * more == window_size - lookahead - strstart * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) * => more >= window_size - 2*WSIZE + 2 * In the BIG_MEM or MMAP case (not yet supported), * window_size == input_size + MIN_LOOKAHEAD && * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. * Otherwise, window_size == 2*WSIZE so more >= 2. * If there was sliding, more >= WSIZE. So in all cases, more >= 2. */ Assert(more >= 2, "more < 2"); n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); s->lookahead += n; /* Initialize the hash value now that we have some input: */ if (s->lookahead + s->insert >= MIN_MATCH) { uInt str = s->strstart - s->insert; s->ins_h = s->window[str]; UPDATE_HASH(s, s->ins_h, s->window[str + 1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif while (s->insert) { UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); #ifndef FASTEST s->prev[str & s->w_mask] = s->head[s->ins_h]; #endif s->head[s->ins_h] = (Pos)str; str++; s->insert--; if (s->lookahead + s->insert < MIN_MATCH) break; } } /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, * but this is not important since only literal bytes will be emitted. */ } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); /* If the WIN_INIT bytes after the end of the current data have never been * written, then zero those bytes in order to avoid memory check reports of * the use of uninitialized (or uninitialised as Julian writes) bytes by * the longest match routines. Update the high water mark for the next * time through here. WIN_INIT is set to MAX_MATCH since the longest match * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. */ if (s->high_water < s->window_size) { ulg curr = s->strstart + (ulg)(s->lookahead); ulg init; if (s->high_water < curr) { /* Previous high water mark below current data -- zero WIN_INIT * bytes or up to end of window, whichever is less. */ init = s->window_size - curr; if (init > WIN_INIT) init = WIN_INIT; zmemzero(s->window + curr, (unsigned)init); s->high_water = curr + init; } else if (s->high_water < (ulg)curr + WIN_INIT) { /* High water mark at or above current data, but below current data * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up * to end of window, whichever is less. */ init = (ulg)curr + WIN_INIT - s->high_water; if (init > s->window_size - s->high_water) init = s->window_size - s->high_water; zmemzero(s->window + s->high_water, (unsigned)init); s->high_water += init; } } Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, "not enough room for search"); } /* =========================================================================== * Flush the current block, with given end-of-file flag. * IN assertion: strstart is set to the end of the current match. */ #define FLUSH_BLOCK_ONLY(s, last) { \ _tr_flush_block(s, (s->block_start >= 0L ? \ (charf *)&s->window[(unsigned)s->block_start] : \ (charf *)Z_NULL), \ (ulg)((long)s->strstart - s->block_start), \ (last)); \ s->block_start = s->strstart; \ flush_pending(s->strm); \ Tracev((stderr,"[FLUSH]")); \ } /* Same but force premature exit if necessary. */ #define FLUSH_BLOCK(s, last) { \ FLUSH_BLOCK_ONLY(s, last); \ if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \ } /* Maximum stored block length in deflate format (not including header). */ #define MAX_STORED 65535 /* Minimum of a and b. */ #define MIN(a, b) ((a) > (b) ? (b) : (a)) /* =========================================================================== * Copy without compression as much as possible from the input stream, return * the current block state. * * In case deflateParams() is used to later switch to a non-zero compression * level, s->matches (otherwise unused when storing) keeps track of the number * of hash table slides to perform. If s->matches is 1, then one hash table * slide will be done when switching. If s->matches is 2, the maximum value * allowed here, then the hash table will be cleared, since two or more slides * is the same as a clear. * * deflate_stored() is written to minimize the number of times an input byte is * copied. It is most efficient with large input and output buffers, which * maximizes the opportunites to have a single copy from next_in to next_out. */ local block_state deflate_stored(s, flush) deflate_state *s; int flush; { /* Smallest worthy block size when not flushing or finishing. By default * this is 32K. This can be as small as 507 bytes for memLevel == 1. For * large input and output buffers, the stored block size will be larger. */ unsigned min_block = MIN(s->pending_buf_size - 5, s->w_size); /* Copy as many min_block or larger stored blocks directly to next_out as * possible. If flushing, copy the remaining available input to next_out as * stored blocks, if there is enough space. */ unsigned len, left, have, last = 0; unsigned used = s->strm->avail_in; do { /* Set len to the maximum size block that we can copy directly with the * available input data and output space. Set left to how much of that * would be copied from what's left in the window. */ len = MAX_STORED; /* maximum deflate stored block length */ have = (s->bi_valid + 42) >> 3; /* number of header bytes */ if (s->strm->avail_out < have) /* need room for header */ break; /* maximum stored block length that will fit in avail_out: */ have = s->strm->avail_out - have; left = s->strstart - s->block_start; /* bytes left in window */ if (len > (ulg)left + s->strm->avail_in) len = left + s->strm->avail_in; /* limit len to the input */ if (len > have) len = have; /* limit len to the output */ /* If the stored block would be less than min_block in length, or if * unable to copy all of the available input when flushing, then try * copying to the window and the pending buffer instead. Also don't * write an empty block when flushing -- deflate() does that. */ if (len < min_block && ((len == 0 && flush != Z_FINISH) || flush == Z_NO_FLUSH || len != left + s->strm->avail_in)) break; /* Make a dummy stored block in pending to get the header bytes, * including any pending bits. This also updates the debugging counts. */ last = flush == Z_FINISH && len == left + s->strm->avail_in ? 1 : 0; _tr_stored_block(s, (char *)0, 0L, last); /* Replace the lengths in the dummy stored block with len. */ s->pending_buf[s->pending - 4] = len; s->pending_buf[s->pending - 3] = len >> 8; s->pending_buf[s->pending - 2] = ~len; s->pending_buf[s->pending - 1] = ~len >> 8; /* Write the stored block header bytes. */ flush_pending(s->strm); #ifdef ZLIB_DEBUG /* Update debugging counts for the data about to be copied. */ s->compressed_len += len << 3; s->bits_sent += len << 3; #endif /* Copy uncompressed bytes from the window to next_out. */ if (left) { if (left > len) left = len; zmemcpy(s->strm->next_out, s->window + s->block_start, left); s->strm->next_out += left; s->strm->avail_out -= left; s->strm->total_out += left; s->block_start += left; len -= left; } /* Copy uncompressed bytes directly from next_in to next_out, updating * the check value. */ if (len) { read_buf(s->strm, s->strm->next_out, len); s->strm->next_out += len; s->strm->avail_out -= len; s->strm->total_out += len; } } while (last == 0); /* Update the sliding window with the last s->w_size bytes of the copied * data, or append all of the copied data to the existing window if less * than s->w_size bytes were copied. Also update the number of bytes to * insert in the hash tables, in the event that deflateParams() switches to * a non-zero compression level. */ used -= s->strm->avail_in; /* number of input bytes directly copied */ if (used) { /* If any input was used, then no unused input remains in the window, * therefore s->block_start == s->strstart. */ if (used >= s->w_size) { /* supplant the previous history */ s->matches = 2; /* clear hash */ zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size); s->strstart = s->w_size; } else { if (s->window_size - s->strstart <= used) { /* Slide the window down. */ s->strstart -= s->w_size; zmemcpy(s->window, s->window + s->w_size, s->strstart); if (s->matches < 2) s->matches++; /* add a pending slide_hash() */ } zmemcpy(s->window + s->strstart, s->strm->next_in - used, used); s->strstart += used; } s->block_start = s->strstart; s->insert += MIN(used, s->w_size - s->insert); } if (s->high_water < s->strstart) s->high_water = s->strstart; /* If the last block was written to next_out, then done. */ if (last) return finish_done; /* If flushing and all input has been consumed, then done. */ if (flush != Z_NO_FLUSH && flush != Z_FINISH && s->strm->avail_in == 0 && (long)s->strstart == s->block_start) return block_done; /* Fill the window with any remaining input. */ have = s->window_size - s->strstart - 1; if (s->strm->avail_in > have && s->block_start >= (long)s->w_size) { /* Slide the window down. */ s->block_start -= s->w_size; s->strstart -= s->w_size; zmemcpy(s->window, s->window + s->w_size, s->strstart); if (s->matches < 2) s->matches++; /* add a pending slide_hash() */ have += s->w_size; /* more space now */ } if (have > s->strm->avail_in) have = s->strm->avail_in; if (have) { read_buf(s->strm, s->window + s->strstart, have); s->strstart += have; } if (s->high_water < s->strstart) s->high_water = s->strstart; /* There was not enough avail_out to write a complete worthy or flushed * stored block to next_out. Write a stored block to pending instead, if we * have enough input for a worthy block, or if flushing and there is enough * room for the remaining input as a stored block in the pending buffer. */ have = (s->bi_valid + 42) >> 3; /* number of header bytes */ /* maximum stored block length that will fit in pending: */ have = MIN(s->pending_buf_size - have, MAX_STORED); min_block = MIN(have, s->w_size); left = s->strstart - s->block_start; if (left >= min_block || ((left || flush == Z_FINISH) && flush != Z_NO_FLUSH && s->strm->avail_in == 0 && left <= have)) { len = MIN(left, have); last = flush == Z_FINISH && s->strm->avail_in == 0 && len == left ? 1 : 0; _tr_stored_block(s, (charf *)s->window + s->block_start, len, last); s->block_start += len; flush_pending(s->strm); } /* We've done all we can with the available input and output. */ return last ? finish_started : need_more; } /* =========================================================================== * Compress as much as possible from the input stream, return the current * block state. * This function does not perform lazy evaluation of matches and inserts * new strings in the dictionary only for unmatched strings or for short * matches. It is used only for the fast compression options. */ local block_state deflate_fast(s, flush) deflate_state *s; int flush; { IPos hash_head; /* head of the hash chain */ int bflush; /* set if current block must be flushed */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the next match, plus MIN_MATCH bytes to insert the * string following the next match. */ if (s->lookahead < MIN_LOOKAHEAD) { fill_window(s); if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ hash_head = NIL; if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } /* Find the longest match, discarding those <= prev_length. * At this point we have always match_length < MIN_MATCH */ if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ s->match_length = longest_match (s, hash_head); /* longest_match() sets match_start */ } if (s->match_length >= MIN_MATCH) { check_match(s, s->strstart, s->match_start, s->match_length); _tr_tally_dist(s, s->strstart - s->match_start, s->match_length - MIN_MATCH, bflush); s->lookahead -= s->match_length; /* Insert new strings in the hash table only if the match length * is not too large. This saves time but degrades compression. */ #ifndef FASTEST if (s->match_length <= s->max_insert_length && s->lookahead >= MIN_MATCH) { s->match_length--; /* string at strstart already in table */ do { s->strstart++; INSERT_STRING(s, s->strstart, hash_head); /* strstart never exceeds WSIZE-MAX_MATCH, so there are * always MIN_MATCH bytes ahead. */ } while (--s->match_length != 0); s->strstart++; } else #endif { s->strstart += s->match_length; s->match_length = 0; s->ins_h = s->window[s->strstart]; UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not * matter since it will be recomputed at next deflate call. */ } } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); _tr_tally_lit (s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } if (bflush) FLUSH_BLOCK(s, 0); } s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; if (flush == Z_FINISH) { FLUSH_BLOCK(s, 1); return finish_done; } if (s->last_lit) FLUSH_BLOCK(s, 0); return block_done; } #ifndef FASTEST /* =========================================================================== * Same as above, but achieves better compression. We use a lazy * evaluation for matches: a match is finally adopted only if there is * no better match at the next window position. */ local block_state deflate_slow(s, flush) deflate_state *s; int flush; { IPos hash_head; /* head of hash chain */ int bflush; /* set if current block must be flushed */ /* Process the input block. */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the next match, plus MIN_MATCH bytes to insert the * string following the next match. */ if (s->lookahead < MIN_LOOKAHEAD) { fill_window(s); if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ hash_head = NIL; if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } /* Find the longest match, discarding those <= prev_length. */ s->prev_length = s->match_length, s->prev_match = s->match_start; s->match_length = MIN_MATCH-1; if (hash_head != NIL && s->prev_length < s->max_lazy_match && s->strstart - hash_head <= MAX_DIST(s)) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ s->match_length = longest_match (s, hash_head); /* longest_match() sets match_start */ if (s->match_length <= 5 && (s->strategy == Z_FILTERED #if TOO_FAR <= 32767 || (s->match_length == MIN_MATCH && s->strstart - s->match_start > TOO_FAR) #endif )) { /* If prev_match is also MIN_MATCH, match_start is garbage * but we will ignore the current match anyway. */ s->match_length = MIN_MATCH-1; } } /* If there was a match at the previous step and the current * match is not better, output the previous match: */ if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; /* Do not insert strings in hash table beyond this. */ check_match(s, s->strstart-1, s->prev_match, s->prev_length); _tr_tally_dist(s, s->strstart -1 - s->prev_match, s->prev_length - MIN_MATCH, bflush); /* Insert in hash table all strings up to the end of the match. * strstart-1 and strstart are already inserted. If there is not * enough lookahead, the last two strings are not inserted in * the hash table. */ s->lookahead -= s->prev_length-1; s->prev_length -= 2; do { if (++s->strstart <= max_insert) { INSERT_STRING(s, s->strstart, hash_head); } } while (--s->prev_length != 0); s->match_available = 0; s->match_length = MIN_MATCH-1; s->strstart++; if (bflush) FLUSH_BLOCK(s, 0); } else if (s->match_available) { /* If there was no match at the previous position, output a * single literal. If there was a match but the current match * is longer, truncate the previous match to a single literal. */ Tracevv((stderr,"%c", s->window[s->strstart-1])); _tr_tally_lit(s, s->window[s->strstart-1], bflush); if (bflush) { FLUSH_BLOCK_ONLY(s, 0); } s->strstart++; s->lookahead--; if (s->strm->avail_out == 0) return need_more; } else { /* There is no previous match to compare with, wait for * the next step to decide. */ s->match_available = 1; s->strstart++; s->lookahead--; } } Assert (flush != Z_NO_FLUSH, "no flush?"); if (s->match_available) { Tracevv((stderr,"%c", s->window[s->strstart-1])); _tr_tally_lit(s, s->window[s->strstart-1], bflush); s->match_available = 0; } s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; if (flush == Z_FINISH) { FLUSH_BLOCK(s, 1); return finish_done; } if (s->last_lit) FLUSH_BLOCK(s, 0); return block_done; } #endif /* FASTEST */ /* =========================================================================== * For Z_RLE, simply look for runs of bytes, generate matches only of distance * one. Do not maintain a hash table. (It will be regenerated if this run of * deflate switches away from Z_RLE.) */ local block_state deflate_rle(s, flush) deflate_state *s; int flush; { int bflush; /* set if current block must be flushed */ uInt prev; /* byte at distance one to match */ Bytef *scan, *strend; /* scan goes up to strend for length of run */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the longest run, plus one for the unrolled loop. */ if (s->lookahead <= MAX_MATCH) { fill_window(s); if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* See how many times the previous byte repeats */ s->match_length = 0; if (s->lookahead >= MIN_MATCH && s->strstart > 0) { scan = s->window + s->strstart - 1; prev = *scan; if (prev == *++scan && prev == *++scan && prev == *++scan) { strend = s->window + s->strstart + MAX_MATCH; do { } while (prev == *++scan && prev == *++scan && prev == *++scan && prev == *++scan && prev == *++scan && prev == *++scan && prev == *++scan && prev == *++scan && scan < strend); s->match_length = MAX_MATCH - (uInt)(strend - scan); if (s->match_length > s->lookahead) s->match_length = s->lookahead; } Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); } /* Emit match if have run of MIN_MATCH or longer, else emit literal */ if (s->match_length >= MIN_MATCH) { check_match(s, s->strstart, s->strstart - 1, s->match_length); _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); s->lookahead -= s->match_length; s->strstart += s->match_length; s->match_length = 0; } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); _tr_tally_lit (s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } if (bflush) FLUSH_BLOCK(s, 0); } s->insert = 0; if (flush == Z_FINISH) { FLUSH_BLOCK(s, 1); return finish_done; } if (s->last_lit) FLUSH_BLOCK(s, 0); return block_done; } /* =========================================================================== * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. * (It will be regenerated if this run of deflate switches away from Huffman.) */ local block_state deflate_huff(s, flush) deflate_state *s; int flush; { int bflush; /* set if current block must be flushed */ for (;;) { /* Make sure that we have a literal to write. */ if (s->lookahead == 0) { fill_window(s); if (s->lookahead == 0) { if (flush == Z_NO_FLUSH) return need_more; break; /* flush the current block */ } } /* Output a literal byte */ s->match_length = 0; Tracevv((stderr,"%c", s->window[s->strstart])); _tr_tally_lit (s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; if (bflush) FLUSH_BLOCK(s, 0); } s->insert = 0; if (flush == Z_FINISH) { FLUSH_BLOCK(s, 1); return finish_done; } if (s->last_lit) FLUSH_BLOCK(s, 0); return block_done; } gtkwave-3.3.86/src/libz/zlib.h0000664000175000017500000027375713166335473015471 0ustar bybellbybell/* zlib.h -- interface of the 'zlib' general purpose compression library version 1.2.11, January 15th, 2017 Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). */ #ifndef ZLIB_H #define ZLIB_H #include "zconf.h" #ifdef __cplusplus extern "C" { #endif #define ZLIB_VERSION "1.2.11" #define ZLIB_VERNUM 0x12b0 #define ZLIB_VER_MAJOR 1 #define ZLIB_VER_MINOR 2 #define ZLIB_VER_REVISION 11 #define ZLIB_VER_SUBREVISION 0 /* The 'zlib' compression library provides in-memory compression and decompression functions, including integrity checks of the uncompressed data. This version of the library supports only one compression method (deflation) but other algorithms will be added later and will have the same stream interface. Compression can be done in a single step if the buffers are large enough, or can be done by repeated calls of the compression function. In the latter case, the application must provide more input and/or consume the output (providing more output space) before each call. The compressed data format used by default by the in-memory functions is the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped around a deflate stream, which is itself documented in RFC 1951. The library also supports reading and writing files in gzip (.gz) format with an interface similar to that of stdio using the functions that start with "gz". The gzip format is different from the zlib format. gzip is a gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. This library can optionally read and write gzip and raw deflate streams in memory as well. The zlib format was designed to be compact and fast for use in memory and on communications channels. The gzip format was designed for single- file compression on file systems, has a larger header than zlib to maintain directory information, and uses a different, slower check method than zlib. The library does not install any signal handler. The decoder checks the consistency of the compressed data, so the library should never crash even in the case of corrupted input. */ typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); typedef void (*free_func) OF((voidpf opaque, voidpf address)); struct internal_state; typedef struct z_stream_s { z_const Bytef *next_in; /* next input byte */ uInt avail_in; /* number of bytes available at next_in */ uLong total_in; /* total number of input bytes read so far */ Bytef *next_out; /* next output byte will go here */ uInt avail_out; /* remaining free space at next_out */ uLong total_out; /* total number of bytes output so far */ z_const char *msg; /* last error message, NULL if no error */ struct internal_state FAR *state; /* not visible by applications */ alloc_func zalloc; /* used to allocate the internal state */ free_func zfree; /* used to free the internal state */ voidpf opaque; /* private data object passed to zalloc and zfree */ int data_type; /* best guess about the data type: binary or text for deflate, or the decoding state for inflate */ uLong adler; /* Adler-32 or CRC-32 value of the uncompressed data */ uLong reserved; /* reserved for future use */ } z_stream; typedef z_stream FAR *z_streamp; /* gzip header information passed to and from zlib routines. See RFC 1952 for more details on the meanings of these fields. */ typedef struct gz_header_s { int text; /* true if compressed data believed to be text */ uLong time; /* modification time */ int xflags; /* extra flags (not used when writing a gzip file) */ int os; /* operating system */ Bytef *extra; /* pointer to extra field or Z_NULL if none */ uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ uInt extra_max; /* space at extra (only when reading header) */ Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ uInt name_max; /* space at name (only when reading header) */ Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ uInt comm_max; /* space at comment (only when reading header) */ int hcrc; /* true if there was or will be a header crc */ int done; /* true when done reading gzip header (not used when writing a gzip file) */ } gz_header; typedef gz_header FAR *gz_headerp; /* The application must update next_in and avail_in when avail_in has dropped to zero. It must update next_out and avail_out when avail_out has dropped to zero. The application must initialize zalloc, zfree and opaque before calling the init function. All other fields are set by the compression library and must not be updated by the application. The opaque value provided by the application will be passed as the first parameter for calls of zalloc and zfree. This can be useful for custom memory management. The compression library attaches no meaning to the opaque value. zalloc must return Z_NULL if there is not enough memory for the object. If zlib is used in a multi-threaded application, zalloc and zfree must be thread safe. In that case, zlib is thread-safe. When zalloc and zfree are Z_NULL on entry to the initialization function, they are set to internal routines that use the standard library functions malloc() and free(). On 16-bit systems, the functions zalloc and zfree must be able to allocate exactly 65536 bytes, but will not be required to allocate more than this if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers returned by zalloc for objects of exactly 65536 bytes *must* have their offset normalized to zero. The default allocation function provided by this library ensures this (see zutil.c). To reduce memory requirements and avoid any allocation of 64K objects, at the expense of compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). The fields total_in and total_out can be used for statistics or progress reports. After compression, total_in holds the total size of the uncompressed data and may be saved for use by the decompressor (particularly if the decompressor wants to decompress everything in a single step). */ /* constants */ #define Z_NO_FLUSH 0 #define Z_PARTIAL_FLUSH 1 #define Z_SYNC_FLUSH 2 #define Z_FULL_FLUSH 3 #define Z_FINISH 4 #define Z_BLOCK 5 #define Z_TREES 6 /* Allowed flush values; see deflate() and inflate() below for details */ #define Z_OK 0 #define Z_STREAM_END 1 #define Z_NEED_DICT 2 #define Z_ERRNO (-1) #define Z_STREAM_ERROR (-2) #define Z_DATA_ERROR (-3) #define Z_MEM_ERROR (-4) #define Z_BUF_ERROR (-5) #define Z_VERSION_ERROR (-6) /* Return codes for the compression/decompression functions. Negative values * are errors, positive values are used for special but normal events. */ #define Z_NO_COMPRESSION 0 #define Z_BEST_SPEED 1 #define Z_BEST_COMPRESSION 9 #define Z_DEFAULT_COMPRESSION (-1) /* compression levels */ #define Z_FILTERED 1 #define Z_HUFFMAN_ONLY 2 #define Z_RLE 3 #define Z_FIXED 4 #define Z_DEFAULT_STRATEGY 0 /* compression strategy; see deflateInit2() below for details */ #define Z_BINARY 0 #define Z_TEXT 1 #define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ #define Z_UNKNOWN 2 /* Possible values of the data_type field for deflate() */ #define Z_DEFLATED 8 /* The deflate compression method (the only one supported in this version) */ #define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ #define zlib_version zlibVersion() /* for compatibility with versions < 1.0.2 */ /* basic functions */ ZEXTERN const char * ZEXPORT zlibVersion OF((void)); /* The application can compare zlibVersion and ZLIB_VERSION for consistency. If the first character differs, the library code actually used is not compatible with the zlib.h header file used by the application. This check is automatically made by deflateInit and inflateInit. */ /* ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); Initializes the internal stream state for compression. The fields zalloc, zfree and opaque must be initialized before by the caller. If zalloc and zfree are set to Z_NULL, deflateInit updates them to use default allocation functions. The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: 1 gives best speed, 9 gives best compression, 0 gives no compression at all (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION requests a default compromise between speed and compression (currently equivalent to level 6). deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if level is not a valid compression level, or Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible with the version assumed by the caller (ZLIB_VERSION). msg is set to null if there is no error message. deflateInit does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); /* deflate compresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. The detailed semantics are as follows. deflate performs one or both of the following actions: - Compress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in and avail_in are updated and processing will resume at this point for the next call of deflate(). - Generate more output starting at next_out and update next_out and avail_out accordingly. This action is forced if the parameter flush is non zero. Forcing flush frequently degrades the compression ratio, so this parameter should be set only when necessary. Some output may be provided even if flush is zero. Before the call of deflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating avail_in or avail_out accordingly; avail_out should never be zero before the call. The application can consume the compressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. See deflatePending(), which can be used if desired to determine whether or not there is more ouput in that case. Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to decide how much data to accumulate before producing output, in order to maximize compression. If the parameter flush is set to Z_SYNC_FLUSH, all pending output is flushed to the output buffer and the output is aligned on a byte boundary, so that the decompressor can get all input data available so far. (In particular avail_in is zero after the call if enough output space has been provided before the call.) Flushing may degrade compression for some compression algorithms and so it should be used only when necessary. This completes the current deflate block and follows it with an empty stored block that is three bits plus filler bits to the next byte, followed by four bytes (00 00 ff ff). If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the output buffer, but the output is not aligned to a byte boundary. All of the input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. This completes the current deflate block and follows it with an empty fixed codes block that is 10 bits long. This assures that enough bytes are output in order for the decompressor to finish the block before the empty fixed codes block. If flush is set to Z_BLOCK, a deflate block is completed and emitted, as for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to seven bits of the current block are held to be written as the next byte after the next deflate block is completed. In this case, the decompressor may not be provided enough bits at this point in order to complete decompression of the data provided so far to the compressor. It may need to wait for the next block to be emitted. This is for advanced applications that need to control the emission of deflate blocks. If flush is set to Z_FULL_FLUSH, all output is flushed as with Z_SYNC_FLUSH, and the compression state is reset so that decompression can restart from this point if previous compressed data has been damaged or if random access is desired. Using Z_FULL_FLUSH too often can seriously degrade compression. If deflate returns with avail_out == 0, this function must be called again with the same value of the flush parameter and more output space (updated avail_out), until the flush is complete (deflate returns with non-zero avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that avail_out is greater than six to avoid repeated flush markers due to avail_out == 0 on return. If the parameter flush is set to Z_FINISH, pending input is processed, pending output is flushed and deflate returns with Z_STREAM_END if there was enough output space. If deflate returns with Z_OK or Z_BUF_ERROR, this function must be called again with Z_FINISH and more output space (updated avail_out) but no more input data, until it returns with Z_STREAM_END or an error. After deflate has returned Z_STREAM_END, the only possible operations on the stream are deflateReset or deflateEnd. Z_FINISH can be used in the first deflate call after deflateInit if all the compression is to be done in a single step. In order to complete in one call, avail_out must be at least the value returned by deflateBound (see below). Then deflate is guaranteed to return Z_STREAM_END. If not enough output space is provided, deflate will not return Z_STREAM_END, and it must be called again as described above. deflate() sets strm->adler to the Adler-32 checksum of all input read so far (that is, total_in bytes). If a gzip stream is being generated, then strm->adler will be the CRC-32 checksum of the input read so far. (See deflateInit2 below.) deflate() may update strm->data_type if it can make a good guess about the input data type (Z_BINARY or Z_TEXT). If in doubt, the data is considered binary. This field is only for information purposes and does not affect the compression algorithm in any manner. deflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if all input has been consumed and all output has been produced (only when flush is set to Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example if next_in or next_out was Z_NULL or the state was inadvertently written over by the application), or Z_BUF_ERROR if no progress is possible (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and deflate() can be called again with more input and more output space to continue compressing. */ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending output. deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent, Z_DATA_ERROR if the stream was freed prematurely (some input or output was discarded). In the error case, msg may be set but then points to a static string (which must not be deallocated). */ /* ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. In the current version of inflate, the provided input is not read or consumed. The allocation of a sliding window will be deferred to the first call of inflate (if the decompression does not complete on the first call). If zalloc and zfree are set to Z_NULL, inflateInit updates them to use default allocation functions. inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the version assumed by the caller, or Z_STREAM_ERROR if the parameters are invalid, such as a null pointer to the structure. msg is set to null if there is no error message. inflateInit does not perform any decompression. Actual decompression will be done by inflate(). So next_in, and avail_in, next_out, and avail_out are unused and unchanged. The current implementation of inflateInit() does not process any header information -- that is deferred until inflate() is called. */ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); /* inflate decompresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. The detailed semantics are as follows. inflate performs one or both of the following actions: - Decompress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer), then next_in and avail_in are updated accordingly, and processing will resume at this point for the next call of inflate(). - Generate more output starting at next_out and update next_out and avail_out accordingly. inflate() provides as much output as possible, until there is no more input data or no more space in the output buffer (see below about the flush parameter). Before the call of inflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating the next_* and avail_* values accordingly. If the caller of inflate() does not provide both available input and available output space, it is possible that there will be no progress made. The application can consume the uncompressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of inflate(). If inflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much output as possible to the output buffer. Z_BLOCK requests that inflate() stop if and when it gets to the next deflate block boundary. When decoding the zlib or gzip format, this will cause inflate() to return immediately after the header and before the first block. When doing a raw inflate, inflate() will go ahead and process the first block, and will return when it gets to the end of that block, or when it runs out of data. The Z_BLOCK option assists in appending to or combining deflate streams. To assist in this, on return inflate() always sets strm->data_type to the number of unused bits in the last byte taken from strm->next_in, plus 64 if inflate() is currently decoding the last block in the deflate stream, plus 128 if inflate() returned immediately after decoding an end-of-block code or decoding the complete header up to just before the first byte of the deflate stream. The end-of-block will not be indicated until all of the uncompressed data from that block has been written to strm->next_out. The number of unused bits may in general be greater than seven, except when bit 7 of data_type is set, in which case the number of unused bits will be less than eight. data_type is set as noted here every time inflate() returns for all flush options, and so can be used to determine the amount of currently consumed input in bits. The Z_TREES option behaves as Z_BLOCK does, but it also returns when the end of each deflate block header is reached, before any actual data in that block is decoded. This allows the caller to determine the length of the deflate block header for later use in random access within a deflate block. 256 is added to the value of strm->data_type when inflate() returns immediately after reaching the end of the deflate block header. inflate() should normally be called until it returns Z_STREAM_END or an error. However if all decompression is to be performed in a single step (a single call of inflate), the parameter flush should be set to Z_FINISH. In this case all pending input is processed and all pending output is flushed; avail_out must be large enough to hold all of the uncompressed data for the operation to complete. (The size of the uncompressed data may have been saved by the compressor for this purpose.) The use of Z_FINISH is not required to perform an inflation in one step. However it may be used to inform inflate that a faster approach can be used for the single inflate() call. Z_FINISH also informs inflate to not maintain a sliding window if the stream completes, which reduces inflate's memory footprint. If the stream does not complete, either because not all of the stream is provided or not enough output space is provided, then a sliding window will be allocated and inflate() can be called again to continue the operation as if Z_NO_FLUSH had been used. In this implementation, inflate() always flushes as much output as possible to the output buffer, and always uses the faster approach on the first call. So the effects of the flush parameter in this implementation are on the return value of inflate() as noted below, when inflate() returns early when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of memory for a sliding window when Z_FINISH is used. If a preset dictionary is needed after this call (see inflateSetDictionary below), inflate sets strm->adler to the Adler-32 checksum of the dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise it sets strm->adler to the Adler-32 checksum of all output produced so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described below. At the end of the stream, inflate() checks that its computed Adler-32 checksum is equal to that saved by the compressor and returns Z_STREAM_END only if the checksum is correct. inflate() can decompress and check either zlib-wrapped or gzip-wrapped deflate data. The header type is detected automatically, if requested when initializing with inflateInit2(). Any information contained in the gzip header is not retained unless inflateGetHeader() is used. When processing gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output produced so far. The CRC-32 is checked against the gzip trailer, as is the uncompressed length, modulo 2^32. inflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if the end of the compressed data has been reached and all uncompressed output has been produced, Z_NEED_DICT if a preset dictionary is needed at this point, Z_DATA_ERROR if the input data was corrupted (input stream not conforming to the zlib format or incorrect check value, in which case strm->msg points to a string with a more specific error), Z_STREAM_ERROR if the stream structure was inconsistent (for example next_in or next_out was Z_NULL, or the state was inadvertently written over by the application), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if no progress was possible or if there was not enough room in the output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and inflate() can be called again with more input and more output space to continue decompressing. If Z_DATA_ERROR is returned, the application may then call inflateSync() to look for a good compression block if a partial recovery of the data is to be attempted. */ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending output. inflateEnd returns Z_OK if success, or Z_STREAM_ERROR if the stream state was inconsistent. */ /* Advanced functions */ /* The following functions are needed only in some special applications. */ /* ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy)); This is another version of deflateInit with more compression options. The fields next_in, zalloc, zfree and opaque must be initialized before by the caller. The method parameter is the compression method. It must be Z_DEFLATED in this version of the library. The windowBits parameter is the base two logarithm of the window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. Larger values of this parameter result in better compression at the expense of memory usage. The default value is 15 if deflateInit is used instead. For the current implementation of deflate(), a windowBits value of 8 (a window size of 256 bytes) is not supported. As a result, a request for 8 will result in 9 (a 512-byte window). In that case, providing 8 to inflateInit2() will result in an error when the zlib header with 9 is checked against the initialization of inflate(). The remedy is to not use 8 with deflateInit2() with this initialization, or at least in that case use 9 with inflateInit2(). windowBits can also be -8..-15 for raw deflate. In this case, -windowBits determines the window size. deflate() will then generate raw deflate data with no zlib header or trailer, and will not compute a check value. windowBits can also be greater than 15 for optional gzip encoding. Add 16 to windowBits to write a simple gzip header and trailer around the compressed data instead of a zlib wrapper. The gzip header will have no file name, no extra data, no comment, no modification time (set to zero), no header crc, and the operating system will be set to the appropriate value, if the operating system was determined at compile time. If a gzip stream is being written, strm->adler is a CRC-32 instead of an Adler-32. For raw deflate or gzip encoding, a request for a 256-byte window is rejected as invalid, since only the zlib header provides a means of transmitting the window size to the decompressor. The memLevel parameter specifies how much memory should be allocated for the internal compression state. memLevel=1 uses minimum memory but is slow and reduces compression ratio; memLevel=9 uses maximum memory for optimal speed. The default value is 8. See zconf.h for total memory usage as a function of windowBits and memLevel. The strategy parameter is used to tune the compression algorithm. Use the value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no string match), or Z_RLE to limit match distances to one (run-length encoding). Filtered data consists mostly of small values with a somewhat random distribution. In this case, the compression algorithm is tuned to compress them better. The effect of Z_FILTERED is to force more Huffman coding and less string matching; it is somewhat intermediate between Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy parameter only affects the compression ratio but not the correctness of the compressed output even if it is not set appropriately. Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler decoder for special applications. deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible with the version assumed by the caller (ZLIB_VERSION). msg is set to null if there is no error message. deflateInit2 does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)); /* Initializes the compression dictionary from the given byte sequence without producing any compressed output. When using the zlib format, this function must be called immediately after deflateInit, deflateInit2 or deflateReset, and before any call of deflate. When doing raw deflate, this function must be called either before any call of deflate, or immediately after the completion of a deflate block, i.e. after all input has been consumed and all output has been delivered when using any of the flush options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The compressor and decompressor must use exactly the same dictionary (see inflateSetDictionary). The dictionary should consist of strings (byte sequences) that are likely to be encountered later in the data to be compressed, with the most commonly used strings preferably put towards the end of the dictionary. Using a dictionary is most useful when the data to be compressed is short and can be predicted with good accuracy; the data can then be compressed better than with the default empty dictionary. Depending on the size of the compression data structures selected by deflateInit or deflateInit2, a part of the dictionary may in effect be discarded, for example if the dictionary is larger than the window size provided in deflateInit or deflateInit2. Thus the strings most likely to be useful should be put at the end of the dictionary, not at the front. In addition, the current implementation of deflate will use at most the window size minus 262 bytes of the provided dictionary. Upon return of this function, strm->adler is set to the Adler-32 value of the dictionary; the decompressor may later use this value to determine which dictionary has been used by the compressor. (The Adler-32 value applies to the whole dictionary even if only a subset of the dictionary is actually used by the compressor.) If a raw deflate was requested, then the Adler-32 value is not computed and strm->adler is not set. deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is inconsistent (for example if deflate has already been called for this stream or if not at a block boundary for raw deflate). deflateSetDictionary does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, Bytef *dictionary, uInt *dictLength)); /* Returns the sliding dictionary being maintained by deflate. dictLength is set to the number of bytes in the dictionary, and that many bytes are copied to dictionary. dictionary must have enough space, where 32768 bytes is always enough. If deflateGetDictionary() is called with dictionary equal to Z_NULL, then only the dictionary length is returned, and nothing is copied. Similary, if dictLength is Z_NULL, then it is not set. deflateGetDictionary() may return a length less than the window size, even when more than the window size in input has been provided. It may return up to 258 bytes less in that case, due to how zlib's implementation of deflate manages the sliding window and lookahead for matches, where matches can be up to 258 bytes long. If the application needs the last window-size bytes of input, then that would need to be saved by the application outside of zlib. deflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the stream state is inconsistent. */ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, z_streamp source)); /* Sets the destination stream as a complete copy of the source stream. This function can be useful when several compression strategies will be tried, for example when there are several ways of pre-processing the input data with a filter. The streams that will be discarded should then be freed by calling deflateEnd. Note that deflateCopy duplicates the internal compression state which can be quite large, so this strategy is slow and can consume lots of memory. deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc being Z_NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); /* This function is equivalent to deflateEnd followed by deflateInit, but does not free and reallocate the internal compression state. The stream will leave the compression level and any other attributes that may have been set unchanged. deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL). */ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, int level, int strategy)); /* Dynamically update the compression level and compression strategy. The interpretation of level and strategy is as in deflateInit2(). This can be used to switch between compression and straight copy of the input data, or to switch to a different kind of input data requiring a different strategy. If the compression approach (which is a function of the level) or the strategy is changed, and if any input has been consumed in a previous deflate() call, then the input available so far is compressed with the old level and strategy using deflate(strm, Z_BLOCK). There are three approaches for the compression levels 0, 1..3, and 4..9 respectively. The new level and strategy will take effect at the next call of deflate(). If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does not have enough output space to complete, then the parameter change will not take effect. In this case, deflateParams() can be called again with the same parameters and more output space to try again. In order to assure a change in the parameters on the first try, the deflate stream should be flushed using deflate() with Z_BLOCK or other flush request until strm.avail_out is not zero, before calling deflateParams(). Then no more input data should be provided before the deflateParams() call. If this is done, the old level and strategy will be applied to the data compressed before deflateParams(), and the new level and strategy will be applied to the the data compressed after deflateParams(). deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if there was not enough output space to complete the compression of the available input data before a change in the strategy or approach. Note that in the case of a Z_BUF_ERROR, the parameters are not changed. A return value of Z_BUF_ERROR is not fatal, in which case deflateParams() can be retried with more output space. */ ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, int good_length, int max_lazy, int nice_length, int max_chain)); /* Fine tune deflate's internal compression parameters. This should only be used by someone who understands the algorithm used by zlib's deflate for searching for the best matching string, and even then only by the most fanatic optimizer trying to squeeze out the last compressed bit for their specific input data. Read the deflate.c source code for the meaning of the max_lazy, good_length, nice_length, and max_chain parameters. deflateTune() can be called after deflateInit() or deflateInit2(), and returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. */ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, uLong sourceLen)); /* deflateBound() returns an upper bound on the compressed size after deflation of sourceLen bytes. It must be called after deflateInit() or deflateInit2(), and after deflateSetHeader(), if used. This would be used to allocate an output buffer for deflation in a single pass, and so would be called before deflate(). If that first deflate() call is provided the sourceLen input bytes, an output buffer allocated to the size returned by deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed to return Z_STREAM_END. Note that it is possible for the compressed size to be larger than the value returned by deflateBound() if flush options other than Z_FINISH or Z_NO_FLUSH are used. */ ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, unsigned *pending, int *bits)); /* deflatePending() returns the number of bytes and bits of output that have been generated, but not yet provided in the available output. The bytes not provided would be due to the available output space having being consumed. The number of bits of output not provided are between 0 and 7, where they await more bits to join them in order to fill out a full byte. If pending or bits are Z_NULL, then those values are not set. deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, int bits, int value)); /* deflatePrime() inserts bits in the deflate output stream. The intent is that this function is used to start off the deflate output with the bits leftover from a previous deflate stream when appending to it. As such, this function can only be used for raw deflate, and must be used before the first deflate() call after a deflateInit2() or deflateReset(). bits must be less than or equal to 16, and that many of the least significant bits of value will be inserted in the output. deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the source stream state was inconsistent. */ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, gz_headerp head)); /* deflateSetHeader() provides gzip header information for when a gzip stream is requested by deflateInit2(). deflateSetHeader() may be called after deflateInit2() or deflateReset() and before the first call of deflate(). The text, time, os, extra field, name, and comment information in the provided gz_header structure are written to the gzip header (xflag is ignored -- the extra flags are set according to the compression level). The caller must assure that, if not Z_NULL, name and comment are terminated with a zero byte, and that if extra is not Z_NULL, that extra_len bytes are available there. If hcrc is true, a gzip header crc is included. Note that the current versions of the command-line version of gzip (up through version 1.3.x) do not support header crc's, and will report that it is a "multi-part gzip file" and give up. If deflateSetHeader is not used, the default gzip header has text false, the time set to zero, and os set to 255, with no extra, name, or comment fields. The gzip header is returned to the default state by deflateReset(). deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ /* ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, int windowBits)); This is another version of inflateInit with an extra parameter. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. The windowBits parameter is the base two logarithm of the maximum window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. The default value is 15 if inflateInit is used instead. windowBits must be greater than or equal to the windowBits value provided to deflateInit2() while compressing, or it must be equal to 15 if deflateInit2() was not used. If a compressed stream with a larger window size is given as input, inflate() will return with the error code Z_DATA_ERROR instead of trying to allocate a larger window. windowBits can also be zero to request that inflate use the window size in the zlib header of the compressed stream. windowBits can also be -8..-15 for raw inflate. In this case, -windowBits determines the window size. inflate() will then process raw deflate data, not looking for a zlib or gzip header, not generating a check value, and not looking for any check values for comparison at the end of the stream. This is for use with other formats that use the deflate compressed data format such as zip. Those formats provide their own check values. If a custom format is developed using the raw deflate format for compressed data, it is recommended that a check value such as an Adler-32 or a CRC-32 be applied to the uncompressed data as is done in the zlib, gzip, and zip formats. For most applications, the zlib format should be used as is. Note that comments above on the use in deflateInit2() applies to the magnitude of windowBits. windowBits can also be greater than 15 for optional gzip decoding. Add 32 to windowBits to enable zlib and gzip decoding with automatic header detection, or add 16 to decode only the gzip format (the zlib format will return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see below), inflate() will not automatically decode concatenated gzip streams. inflate() will return Z_STREAM_END at the end of the gzip stream. The state would need to be reset to continue decoding a subsequent gzip stream. inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the version assumed by the caller, or Z_STREAM_ERROR if the parameters are invalid, such as a null pointer to the structure. msg is set to null if there is no error message. inflateInit2 does not perform any decompression apart from possibly reading the zlib header if present: actual decompression will be done by inflate(). (So next_in and avail_in may be modified, but next_out and avail_out are unused and unchanged.) The current implementation of inflateInit2() does not process any header information -- that is deferred until inflate() is called. */ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)); /* Initializes the decompression dictionary from the given uncompressed byte sequence. This function must be called immediately after a call of inflate, if that call returned Z_NEED_DICT. The dictionary chosen by the compressor can be determined from the Adler-32 value returned by that call of inflate. The compressor and decompressor must use exactly the same dictionary (see deflateSetDictionary). For raw inflate, this function can be called at any time to set the dictionary. If the provided dictionary is smaller than the window and there is already data in the window, then the provided dictionary will amend what's there. The application must insure that the dictionary that was used for compression is provided. inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the expected one (incorrect Adler-32 value). inflateSetDictionary does not perform any decompression: this will be done by subsequent calls of inflate(). */ ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, Bytef *dictionary, uInt *dictLength)); /* Returns the sliding dictionary being maintained by inflate. dictLength is set to the number of bytes in the dictionary, and that many bytes are copied to dictionary. dictionary must have enough space, where 32768 bytes is always enough. If inflateGetDictionary() is called with dictionary equal to Z_NULL, then only the dictionary length is returned, and nothing is copied. Similary, if dictLength is Z_NULL, then it is not set. inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the stream state is inconsistent. */ ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); /* Skips invalid compressed data until a possible full flush point (see above for the description of deflate with Z_FULL_FLUSH) can be found, or until all available input is skipped. No output is provided. inflateSync searches for a 00 00 FF FF pattern in the compressed data. All full flush points have this pattern, but not all occurrences of this pattern are full flush points. inflateSync returns Z_OK if a possible full flush point has been found, Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. In the success case, the application may save the current current value of total_in which indicates where valid compressed data was found. In the error case, the application may repeatedly call inflateSync, providing more input each time, until success or end of the input data. */ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, z_streamp source)); /* Sets the destination stream as a complete copy of the source stream. This function can be useful when randomly accessing a large stream. The first pass through the stream can periodically record the inflate state, allowing restarting inflate at those points when randomly accessing the stream. inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc being Z_NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); /* This function is equivalent to inflateEnd followed by inflateInit, but does not free and reallocate the internal decompression state. The stream will keep attributes that may have been set by inflateInit2. inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL). */ ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, int windowBits)); /* This function is the same as inflateReset, but it also permits changing the wrap and window size requests. The windowBits parameter is interpreted the same as it is for inflateInit2. If the window size is changed, then the memory allocated for the window is freed, and the window will be reallocated by inflate() if needed. inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL), or if the windowBits parameter is invalid. */ ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, int bits, int value)); /* This function inserts bits in the inflate input stream. The intent is that this function is used to start inflating at a bit position in the middle of a byte. The provided bits will be used before any bytes are used from next_in. This function should only be used with raw inflate, and should be used before the first inflate() call after inflateInit2() or inflateReset(). bits must be less than or equal to 16, and that many of the least significant bits of value will be inserted in the input. If bits is negative, then the input stream bit buffer is emptied. Then inflatePrime() can be called again to put bits in the buffer. This is used to clear out bits leftover after feeding inflate a block description prior to feeding inflate codes. inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); /* This function returns two values, one in the lower 16 bits of the return value, and the other in the remaining upper bits, obtained by shifting the return value down 16 bits. If the upper value is -1 and the lower value is zero, then inflate() is currently decoding information outside of a block. If the upper value is -1 and the lower value is non-zero, then inflate is in the middle of a stored block, with the lower value equaling the number of bytes from the input remaining to copy. If the upper value is not -1, then it is the number of bits back from the current bit position in the input of the code (literal or length/distance pair) currently being processed. In that case the lower value is the number of bytes already emitted for that code. A code is being processed if inflate is waiting for more input to complete decoding of the code, or if it has completed decoding but is waiting for more output space to write the literal or match data. inflateMark() is used to mark locations in the input data for random access, which may be at bit positions, and to note those cases where the output of a code may span boundaries of random access blocks. The current location in the input stream can be determined from avail_in and data_type as noted in the description for the Z_BLOCK flush parameter for inflate. inflateMark returns the value noted above, or -65536 if the provided source stream state was inconsistent. */ ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, gz_headerp head)); /* inflateGetHeader() requests that gzip header information be stored in the provided gz_header structure. inflateGetHeader() may be called after inflateInit2() or inflateReset(), and before the first call of inflate(). As inflate() processes the gzip stream, head->done is zero until the header is completed, at which time head->done is set to one. If a zlib stream is being decoded, then head->done is set to -1 to indicate that there will be no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be used to force inflate() to return immediately after header processing is complete and before any actual data is decompressed. The text, time, xflags, and os fields are filled in with the gzip header contents. hcrc is set to true if there is a header CRC. (The header CRC was valid if done is set to one.) If extra is not Z_NULL, then extra_max contains the maximum number of bytes to write to extra. Once done is true, extra_len contains the actual extra field length, and extra contains the extra field, or that field truncated if extra_max is less than extra_len. If name is not Z_NULL, then up to name_max characters are written there, terminated with a zero unless the length is greater than name_max. If comment is not Z_NULL, then up to comm_max characters are written there, terminated with a zero unless the length is greater than comm_max. When any of extra, name, or comment are not Z_NULL and the respective field is not present in the header, then that field is set to Z_NULL to signal its absence. This allows the use of deflateSetHeader() with the returned structure to duplicate the header. However if those fields are set to allocated memory, then the application will need to save those pointers elsewhere so that they can be eventually freed. If inflateGetHeader is not used, then the header information is simply discarded. The header is always checked for validity, including the header CRC if present. inflateReset() will reset the process to discard the header information. The application would need to call inflateGetHeader() again to retrieve the header from the next gzip stream. inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ /* ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, unsigned char FAR *window)); Initialize the internal stream state for decompression using inflateBack() calls. The fields zalloc, zfree and opaque in strm must be initialized before the call. If zalloc and zfree are Z_NULL, then the default library- derived memory allocation routines are used. windowBits is the base two logarithm of the window size, in the range 8..15. window is a caller supplied buffer of that size. Except for special applications where it is assured that deflate was used with small window sizes, windowBits must be 15 and a 32K byte window must be supplied to be able to decompress general deflate streams. See inflateBack() for the usage of these routines. inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of the parameters are invalid, Z_MEM_ERROR if the internal state could not be allocated, or Z_VERSION_ERROR if the version of the library does not match the version of the header file. */ typedef unsigned (*in_func) OF((void FAR *, z_const unsigned char FAR * FAR *)); typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, in_func in, void FAR *in_desc, out_func out, void FAR *out_desc)); /* inflateBack() does a raw inflate with a single call using a call-back interface for input and output. This is potentially more efficient than inflate() for file i/o applications, in that it avoids copying between the output and the sliding window by simply making the window itself the output buffer. inflate() can be faster on modern CPUs when used with large buffers. inflateBack() trusts the application to not change the output buffer passed by the output function, at least until inflateBack() returns. inflateBackInit() must be called first to allocate the internal state and to initialize the state with the user-provided window buffer. inflateBack() may then be used multiple times to inflate a complete, raw deflate stream with each call. inflateBackEnd() is then called to free the allocated state. A raw deflate stream is one with no zlib or gzip header or trailer. This routine would normally be used in a utility that reads zip or gzip files and writes out uncompressed files. The utility would decode the header and process the trailer on its own, hence this routine expects only the raw deflate stream to decompress. This is different from the default behavior of inflate(), which expects a zlib header and trailer around the deflate stream. inflateBack() uses two subroutines supplied by the caller that are then called by inflateBack() for input and output. inflateBack() calls those routines until it reads a complete deflate stream and writes out all of the uncompressed data, or until it encounters an error. The function's parameters and return types are defined above in the in_func and out_func typedefs. inflateBack() will call in(in_desc, &buf) which should return the number of bytes of provided input, and a pointer to that input in buf. If there is no input available, in() must return zero -- buf is ignored in that case -- and inflateBack() will return a buffer error. inflateBack() will call out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() should return zero on success, or non-zero on failure. If out() returns non-zero, inflateBack() will return with an error. Neither in() nor out() are permitted to change the contents of the window provided to inflateBackInit(), which is also the buffer that out() uses to write from. The length written by out() will be at most the window size. Any non-zero amount of input may be provided by in(). For convenience, inflateBack() can be provided input on the first call by setting strm->next_in and strm->avail_in. If that input is exhausted, then in() will be called. Therefore strm->next_in must be initialized before calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in must also be initialized, and then if strm->avail_in is not zero, input will initially be taken from strm->next_in[0 .. strm->avail_in - 1]. The in_desc and out_desc parameters of inflateBack() is passed as the first parameter of in() and out() respectively when they are called. These descriptors can be optionally used to pass any information that the caller- supplied in() and out() functions need to do their job. On return, inflateBack() will set strm->next_in and strm->avail_in to pass back any unused input that was provided by the last in() call. The return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR if in() or out() returned an error, Z_DATA_ERROR if there was a format error in the deflate stream (in which case strm->msg is set to indicate the nature of the error), or Z_STREAM_ERROR if the stream was not properly initialized. In the case of Z_BUF_ERROR, an input or output error can be distinguished using strm->next_in which will be Z_NULL only if in() returned an error. If strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning non-zero. (in() will always be called before out(), so strm->next_in is assured to be defined if out() returns non-zero.) Note that inflateBack() cannot return Z_OK. */ ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); /* All memory allocated by inflateBackInit() is freed. inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream state was inconsistent. */ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); /* Return flags indicating compile-time options. Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: 1.0: size of uInt 3.2: size of uLong 5.4: size of voidpf (pointer) 7.6: size of z_off_t Compiler, assembler, and debug options: 8: ZLIB_DEBUG 9: ASMV or ASMINF -- use ASM code 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention 11: 0 (reserved) One-time table building (smaller code, but not thread-safe if true): 12: BUILDFIXED -- build static block decoding tables when needed 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed 14,15: 0 (reserved) Library content (indicates missing functionality): 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking deflate code when not needed) 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect and decode gzip streams (to avoid linking crc code) 18-19: 0 (reserved) Operation variations (changes in library functionality): 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate 21: FASTEST -- deflate algorithm with only one, lowest compression level 22,23: 0 (reserved) The sprintf variant used by gzprintf (zero is best): 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! 26: 0 = returns value, 1 = void -- 1 means inferred string length returned Remainder: 27-31: 0 (reserved) */ #ifndef Z_SOLO /* utility functions */ /* The following utility functions are implemented on top of the basic stream-oriented functions. To simplify the interface, some default options are assumed (compression level and memory usage, standard memory allocation functions). The source code of these utility functions can be modified if you need special options. */ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Compresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed data. compress() is equivalent to compress2() with a level parameter of Z_DEFAULT_COMPRESSION. compress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer. */ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level)); /* Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed data. compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); /* compressBound() returns an upper bound on the compressed size after compress() or compress2() on sourceLen bytes. It would be used before a compress() or compress2() call to allocate the destination buffer. */ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be large enough to hold the entire uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen is the actual size of the uncompressed data. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In the case where there is not enough room, uncompress() will fill the output buffer with the uncompressed data up to that point. */ ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong *sourceLen)); /* Same as uncompress, except that sourceLen is a pointer, where the length of the source is *sourceLen. On return, *sourceLen is the number of source bytes consumed. */ /* gzip file access functions */ /* This library supports reading and writing files in gzip (.gz) format with an interface similar to that of stdio, using the functions that start with "gz". The gzip format is different from the zlib format. gzip is a gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. */ typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ /* ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); Opens a gzip (.gz) file for reading or writing. The mode parameter is as in fopen ("rb" or "wb") but can also include a compression level ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' for fixed code compression as in "wb9F". (See the description of deflateInit2 for more information about the strategy parameter.) 'T' will request transparent writing or appending with no compression and not using the gzip format. "a" can be used instead of "w" to request that the gzip stream that will be written be appended to the file. "+" will result in an error, since reading and writing to the same gzip file is not supported. The addition of "x" when writing will create the file exclusively, which fails if the file already exists. On systems that support it, the addition of "e" when reading or writing will set the flag to close the file on an execve() call. These functions, as well as gzip, will read and decode a sequence of gzip streams in a file. The append function of gzopen() can be used to create such a file. (Also see gzflush() for another way to do this.) When appending, gzopen does not test whether the file begins with a gzip stream, nor does it look for the end of the gzip streams to begin appending. gzopen will simply append a gzip stream to the existing file. gzopen can be used to read a file which is not in gzip format; in this case gzread will directly read from the file without decompression. When reading, this will be detected automatically by looking for the magic two- byte gzip header. gzopen returns NULL if the file could not be opened, if there was insufficient memory to allocate the gzFile state, or if an invalid mode was specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). errno can be checked to determine if the reason gzopen failed was that the file could not be opened. */ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); /* gzdopen associates a gzFile with the file descriptor fd. File descriptors are obtained from calls like open, dup, creat, pipe or fileno (if the file has been previously opened with fopen). The mode parameter is as in gzopen. The next call of gzclose on the returned gzFile will also close the file descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, mode);. The duplicated descriptor should be saved to avoid a leak, since gzdopen does not close fd if it fails. If you are using fileno() to get the file descriptor from a FILE *, then you will have to use dup() to avoid double-close()ing the file descriptor. Both gzclose() and fclose() will close the associated file descriptor, so they need to have different file descriptors. gzdopen returns NULL if there was insufficient memory to allocate the gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not provided, or '+' was provided), or if fd is -1. The file descriptor is not used until the next gz* read, write, seek, or close operation, so gzdopen will not detect if fd is invalid (unless fd is -1). */ ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); /* Set the internal buffer size used by this library's functions. The default buffer size is 8192 bytes. This function must be called after gzopen() or gzdopen(), and before any other calls that read or write the file. The buffer memory allocation is always deferred to the first read or write. Three times that size in buffer space is allocated. A larger buffer size of, for example, 64K or 128K bytes will noticeably increase the speed of decompression (reading). The new buffer size also affects the maximum length for gzprintf(). gzbuffer() returns 0 on success, or -1 on failure, such as being called too late. */ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); /* Dynamically update the compression level or strategy. See the description of deflateInit2 for the meaning of these parameters. Previously provided data is flushed before the parameter change. gzsetparams returns Z_OK if success, Z_STREAM_ERROR if the file was not opened for writing, Z_ERRNO if there is an error writing the flushed data, or Z_MEM_ERROR if there is a memory allocation error. */ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); /* Reads the given number of uncompressed bytes from the compressed file. If the input file is not in gzip format, gzread copies the given number of bytes into the buffer directly from the file. After reaching the end of a gzip stream in the input, gzread will continue to read, looking for another gzip stream. Any number of gzip streams may be concatenated in the input file, and will all be decompressed by gzread(). If something other than a gzip stream is encountered after a gzip stream, that remaining trailing garbage is ignored (and no error is returned). gzread can be used to read a gzip file that is being concurrently written. Upon reaching the end of the input, gzread will return with the available data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then gzclearerr can be used to clear the end of file indicator in order to permit gzread to be tried again. Z_OK indicates that a gzip stream was completed on the last gzread. Z_BUF_ERROR indicates that the input file ended in the middle of a gzip stream. Note that gzread does not return -1 in the event of an incomplete gzip stream. This error is deferred until gzclose(), which will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip stream. Alternatively, gzerror can be used before gzclose to detect this case. gzread returns the number of uncompressed bytes actually read, less than len for end of file, or -1 for error. If len is too large to fit in an int, then nothing is read, -1 is returned, and the error state is set to Z_STREAM_ERROR. */ ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, gzFile file)); /* Read up to nitems items of size size from file to buf, otherwise operating as gzread() does. This duplicates the interface of stdio's fread(), with size_t request and return types. If the library defines size_t, then z_size_t is identical to size_t. If not, then z_size_t is an unsigned integer type that can contain a pointer. gzfread() returns the number of full items read of size size, or zero if the end of the file was reached and a full item could not be read, or if there was an error. gzerror() must be consulted if zero is returned in order to determine if there was an error. If the multiplication of size and nitems overflows, i.e. the product does not fit in a z_size_t, then nothing is read, zero is returned, and the error state is set to Z_STREAM_ERROR. In the event that the end of file is reached and only a partial item is available at the end, i.e. the remaining uncompressed data length is not a multiple of size, then the final partial item is nevetheless read into buf and the end-of-file flag is set. The length of the partial item read is not provided, but could be inferred from the result of gztell(). This behavior is the same as the behavior of fread() implementations in common libraries, but it prevents the direct use of gzfread() to read a concurrently written file, reseting and retrying on end-of-file, when size is not 1. */ ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len)); /* Writes the given number of uncompressed bytes into the compressed file. gzwrite returns the number of uncompressed bytes written or 0 in case of error. */ ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, z_size_t nitems, gzFile file)); /* gzfwrite() writes nitems items of size size from buf to file, duplicating the interface of stdio's fwrite(), with size_t request and return types. If the library defines size_t, then z_size_t is identical to size_t. If not, then z_size_t is an unsigned integer type that can contain a pointer. gzfwrite() returns the number of full items written of size size, or zero if there was an error. If the multiplication of size and nitems overflows, i.e. the product does not fit in a z_size_t, then nothing is written, zero is returned, and the error state is set to Z_STREAM_ERROR. */ ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); /* Converts, formats, and writes the arguments to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of uncompressed bytes actually written, or a negative zlib error code in case of error. The number of uncompressed bytes written is limited to 8191, or one less than the buffer size given to gzbuffer(). The caller should assure that this limit is not exceeded. If it is exceeded, then gzprintf() will return an error (0) with nothing written. In this case, there may also be a buffer overflow with unpredictable consequences, which is possible only if zlib was compiled with the insecure functions sprintf() or vsprintf() because the secure snprintf() or vsnprintf() functions were not available. This can be determined using zlibCompileFlags(). */ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); /* Writes the given null-terminated string to the compressed file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. */ ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); /* Reads bytes from the compressed file until len-1 characters are read, or a newline character is read and transferred to buf, or an end-of-file condition is encountered. If any characters are read or if len == 1, the string is terminated with a null character. If no characters are read due to an end-of-file or len < 1, then the buffer is left untouched. gzgets returns buf which is a null-terminated string, or it returns NULL for end-of-file or in case of error. If there was an error, the contents at buf are indeterminate. */ ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); /* Writes c, converted to an unsigned char, into the compressed file. gzputc returns the value that was written, or -1 in case of error. */ ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); /* Reads one byte from the compressed file. gzgetc returns this byte or -1 in case of end of file or error. This is implemented as a macro for speed. As such, it does not do all of the checking the other functions do. I.e. it does not check to see if file is NULL, nor whether the structure file points to has been clobbered or not. */ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); /* Push one character back onto the stream to be read as the first character on the next read. At least one character of push-back is allowed. gzungetc() returns the character pushed, or -1 on failure. gzungetc() will fail if c is -1, and may fail if a character has been pushed but not read yet. If gzungetc is used immediately after gzopen or gzdopen, at least the output buffer size of pushed characters is allowed. (See gzbuffer above.) The pushed character will be discarded if the stream is repositioned with gzseek() or gzrewind(). */ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); /* Flushes all pending output into the compressed file. The parameter flush is as in the deflate() function. The return value is the zlib error number (see function gzerror below). gzflush is only permitted when writing. If the flush parameter is Z_FINISH, the remaining data is written and the gzip stream is completed in the output. If gzwrite() is called again, a new gzip stream will be started in the output. gzread() is able to read such concatenated gzip streams. gzflush should be called only when strictly necessary because it will degrade compression if called too often. */ /* ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, z_off_t offset, int whence)); Sets the starting position for the next gzread or gzwrite on the given compressed file. The offset represents a number of bytes in the uncompressed data stream. The whence parameter is defined as in lseek(2); the value SEEK_END is not supported. If the file is opened for reading, this function is emulated but can be extremely slow. If the file is opened for writing, only forward seeks are supported; gzseek then compresses a sequence of zeroes up to the new starting position. gzseek returns the resulting offset location as measured in bytes from the beginning of the uncompressed stream, or -1 in case of error, in particular if the file is opened for writing and the new starting position would be before the current position. */ ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); /* Rewinds the given file. This function is supported only for reading. gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) */ /* ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); Returns the starting position for the next gzread or gzwrite on the given compressed file. This position represents a number of bytes in the uncompressed data stream, and is zero when starting, even if appending or reading a gzip stream from the middle of a file using gzdopen(). gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) */ /* ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); Returns the current offset in the file being read or written. This offset includes the count of bytes that precede the gzip stream, for example when appending or when using gzdopen() for reading. When reading, the offset does not include as yet unused buffered input. This information can be used for a progress indicator. On error, gzoffset() returns -1. */ ZEXTERN int ZEXPORT gzeof OF((gzFile file)); /* Returns true (1) if the end-of-file indicator has been set while reading, false (0) otherwise. Note that the end-of-file indicator is set only if the read tried to go past the end of the input, but came up short. Therefore, just like feof(), gzeof() may return false even if there is no more data to read, in the event that the last read request was for the exact number of bytes remaining in the input file. This will happen if the input file size is an exact multiple of the buffer size. If gzeof() returns true, then the read functions will return no more data, unless the end-of-file indicator is reset by gzclearerr() and the input file has grown since the previous end of file was detected. */ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); /* Returns true (1) if file is being copied directly while reading, or false (0) if file is a gzip stream being decompressed. If the input file is empty, gzdirect() will return true, since the input does not contain a gzip stream. If gzdirect() is used immediately after gzopen() or gzdopen() it will cause buffers to be allocated to allow reading the file to determine if it is a gzip file. Therefore if gzbuffer() is used, it should be called before gzdirect(). When writing, gzdirect() returns true (1) if transparent writing was requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: gzdirect() is not needed when writing. Transparent writing must be explicitly requested, so the application already knows the answer. When linking statically, using gzdirect() will include all of the zlib code for gzip file reading and decompression, which may not be desired.) */ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); /* Flushes all pending output if necessary, closes the compressed file and deallocates the (de)compression state. Note that once file is closed, you cannot call gzerror with file, since its structures have been deallocated. gzclose must not be called more than once on the same file, just as free must not be called more than once on the same allocation. gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the last read ended in the middle of a gzip stream, or Z_OK on success. */ ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); /* Same as gzclose(), but gzclose_r() is only for use when reading, and gzclose_w() is only for use when writing or appending. The advantage to using these instead of gzclose() is that they avoid linking in zlib compression or decompression code that is not used when only reading or only writing respectively. If gzclose() is used, then both compression and decompression code will be included the application when linking to a static zlib library. */ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); /* Returns the error message for the last error which occurred on the given compressed file. errnum is set to zlib error number. If an error occurred in the file system and not in the compression library, errnum is set to Z_ERRNO and the application may consult errno to get the exact error code. The application must not modify the returned string. Future calls to this function may invalidate the previously returned string. If file is closed, then the string previously returned by gzerror will no longer be available. gzerror() should be used to distinguish errors from end-of-file for those functions above that do not distinguish those cases in their return values. */ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); /* Clears the error and end-of-file flags for file. This is analogous to the clearerr() function in stdio. This is useful for continuing to read a gzip file that is being written concurrently. */ #endif /* !Z_SOLO */ /* checksum functions */ /* These functions are not related to compression but are exported anyway because they might be useful in applications using the compression library. */ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and return the updated checksum. If buf is Z_NULL, this function returns the required initial value for the checksum. An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed much faster. Usage example: uLong adler = adler32(0L, Z_NULL, 0); while (read_buffer(buffer, length) != EOF) { adler = adler32(adler, buffer, length); } if (adler != original_adler) error(); */ ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf, z_size_t len)); /* Same as adler32(), but with a size_t length. */ /* ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, z_off_t len2)); Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note that the z_off_t type (like off_t) is a signed integer. If len2 is negative, the result has no meaning or utility. */ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the updated CRC-32. If buf is Z_NULL, this function returns the required initial value for the crc. Pre- and post-conditioning (one's complement) is performed within this function so it shouldn't be done by the application. Usage example: uLong crc = crc32(0L, Z_NULL, 0); while (read_buffer(buffer, length) != EOF) { crc = crc32(crc, buffer, length); } if (crc != original_crc) error(); */ ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf, z_size_t len)); /* Same as crc32(), but with a size_t length. */ /* ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); Combine two CRC-32 check values into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, CRC-32 check values were calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and len2. */ /* various hacks, don't look :) */ /* deflateInit and inflateInit are macros to allow checking the zlib version * and the compiler's view of z_stream: */ ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, const char *version, int stream_size)); ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, unsigned char FAR *window, const char *version, int stream_size)); #ifdef Z_PREFIX_SET # define z_deflateInit(strm, level) \ deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) # define z_inflateInit(strm) \ inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) # define z_deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) # define z_inflateInit2(strm, windowBits) \ inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ (int)sizeof(z_stream)) # define z_inflateBackInit(strm, windowBits, window) \ inflateBackInit_((strm), (windowBits), (window), \ ZLIB_VERSION, (int)sizeof(z_stream)) #else # define deflateInit(strm, level) \ deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) # define inflateInit(strm) \ inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) # define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) # define inflateInit2(strm, windowBits) \ inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ (int)sizeof(z_stream)) # define inflateBackInit(strm, windowBits, window) \ inflateBackInit_((strm), (windowBits), (window), \ ZLIB_VERSION, (int)sizeof(z_stream)) #endif #ifndef Z_SOLO /* gzgetc() macro and its supporting function and exposed data structure. Note * that the real internal state is much larger than the exposed structure. * This abbreviated structure exposes just enough for the gzgetc() macro. The * user should not mess with these exposed elements, since their names or * behavior could change in the future, perhaps even capriciously. They can * only be used by the gzgetc() macro. You have been warned. */ struct gzFile_s { unsigned have; unsigned char *next; z_off64_t pos; }; ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ #ifdef Z_PREFIX_SET # undef z_gzgetc # define z_gzgetc(g) \ ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) #else # define gzgetc(g) \ ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) #endif /* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if * both are true, the application gets the *64 functions, and the regular * functions are changed to 64 bits) -- in case these are set on systems * without large file support, _LFS64_LARGEFILE must also be true */ #ifdef Z_LARGE64 ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); #endif #if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) # ifdef Z_PREFIX_SET # define z_gzopen z_gzopen64 # define z_gzseek z_gzseek64 # define z_gztell z_gztell64 # define z_gzoffset z_gzoffset64 # define z_adler32_combine z_adler32_combine64 # define z_crc32_combine z_crc32_combine64 # else # define gzopen gzopen64 # define gzseek gzseek64 # define gztell gztell64 # define gzoffset gzoffset64 # define adler32_combine adler32_combine64 # define crc32_combine crc32_combine64 # endif # ifndef Z_LARGE64 ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); # endif #else ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); #endif #else /* Z_SOLO */ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); #endif /* !Z_SOLO */ /* undocumented functions */ ZEXTERN const char * ZEXPORT zError OF((int)); ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int)); ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF ((z_streamp)); ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); #if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO) ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, const char *mode)); #endif #if defined(STDC) || defined(Z_HAVE_STDARG_H) # ifndef Z_SOLO ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, const char *format, va_list va)); # endif #endif #ifdef __cplusplus } #endif #endif /* ZLIB_H */ gtkwave-3.3.86/src/libz/gzclose.c0000664000175000017500000000124613166335473016150 0ustar bybellbybell/* gzclose.c -- zlib gzclose() function * Copyright (C) 2004, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "gzguts.h" /* gzclose() is in a separate file so that it is linked in only if it is used. That way the other gzclose functions can be used instead to avoid linking in unneeded compression or decompression routines. */ int ZEXPORT gzclose(file) gzFile file; { #ifndef NO_GZCOMPRESS gz_statep state; if (file == NULL) return Z_STREAM_ERROR; state = (gz_statep)file; return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file); #else return gzclose_r(file); #endif } gtkwave-3.3.86/src/libz/gzlib.c0000664000175000017500000004032713166335473015614 0ustar bybellbybell/* gzlib.c -- zlib functions common to reading and writing gzip files * Copyright (C) 2004-2017 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "gzguts.h" #if defined(_WIN32) && !defined(__BORLANDC__) && !defined(__MINGW32__) # define LSEEK _lseeki64 #else #if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 # define LSEEK lseek64 #else # define LSEEK lseek #endif #endif /* Local functions */ local void gz_reset OF((gz_statep)); local gzFile gz_open OF((const void *, int, const char *)); #if defined UNDER_CE /* Map the Windows error number in ERROR to a locale-dependent error message string and return a pointer to it. Typically, the values for ERROR come from GetLastError. The string pointed to shall not be modified by the application, but may be overwritten by a subsequent call to gz_strwinerror The gz_strwinerror function does not change the current setting of GetLastError. */ char ZLIB_INTERNAL *gz_strwinerror (error) DWORD error; { static char buf[1024]; wchar_t *msgbuf; DWORD lasterr = GetLastError(); DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, error, 0, /* Default language */ (LPVOID)&msgbuf, 0, NULL); if (chars != 0) { /* If there is an \r\n appended, zap it. */ if (chars >= 2 && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { chars -= 2; msgbuf[chars] = 0; } if (chars > sizeof (buf) - 1) { chars = sizeof (buf) - 1; msgbuf[chars] = 0; } wcstombs(buf, msgbuf, chars + 1); LocalFree(msgbuf); } else { sprintf(buf, "unknown win32 error (%ld)", error); } SetLastError(lasterr); return buf; } #endif /* UNDER_CE */ /* Reset gzip file state */ local void gz_reset(state) gz_statep state; { state->x.have = 0; /* no output data available */ if (state->mode == GZ_READ) { /* for reading ... */ state->eof = 0; /* not at end of file */ state->past = 0; /* have not read past end yet */ state->how = LOOK; /* look for gzip header */ } state->seek = 0; /* no seek request pending */ gz_error(state, Z_OK, NULL); /* clear error */ state->x.pos = 0; /* no uncompressed data yet */ state->strm.avail_in = 0; /* no input data yet */ } /* Open a gzip file either by name or file descriptor. */ local gzFile gz_open(path, fd, mode) const void *path; int fd; const char *mode; { gz_statep state; z_size_t len; int oflag; #ifdef O_CLOEXEC int cloexec = 0; #endif #ifdef O_EXCL int exclusive = 0; #endif /* check input */ if (path == NULL) return NULL; /* allocate gzFile structure to return */ state = (gz_statep)malloc(sizeof(gz_state)); if (state == NULL) return NULL; state->size = 0; /* no buffers allocated yet */ state->want = GZBUFSIZE; /* requested buffer size */ state->msg = NULL; /* no error message yet */ /* interpret mode */ state->mode = GZ_NONE; state->level = Z_DEFAULT_COMPRESSION; state->strategy = Z_DEFAULT_STRATEGY; state->direct = 0; while (*mode) { if (*mode >= '0' && *mode <= '9') state->level = *mode - '0'; else switch (*mode) { case 'r': state->mode = GZ_READ; break; #ifndef NO_GZCOMPRESS case 'w': state->mode = GZ_WRITE; break; case 'a': state->mode = GZ_APPEND; break; #endif case '+': /* can't read and write at the same time */ free(state); return NULL; case 'b': /* ignore -- will request binary anyway */ break; #ifdef O_CLOEXEC case 'e': cloexec = 1; break; #endif #ifdef O_EXCL case 'x': exclusive = 1; break; #endif case 'f': state->strategy = Z_FILTERED; break; case 'h': state->strategy = Z_HUFFMAN_ONLY; break; case 'R': state->strategy = Z_RLE; break; case 'F': state->strategy = Z_FIXED; break; case 'T': state->direct = 1; break; default: /* could consider as an error, but just ignore */ ; } mode++; } /* must provide an "r", "w", or "a" */ if (state->mode == GZ_NONE) { free(state); return NULL; } /* can't force transparent read */ if (state->mode == GZ_READ) { if (state->direct) { free(state); return NULL; } state->direct = 1; /* for empty file */ } /* save the path name for error messages */ #ifdef WIDECHAR if (fd == -2) { len = wcstombs(NULL, path, 0); if (len == (z_size_t)-1) len = 0; } else #endif len = strlen((const char *)path); state->path = (char *)malloc(len + 1); if (state->path == NULL) { free(state); return NULL; } #ifdef WIDECHAR if (fd == -2) if (len) wcstombs(state->path, path, len + 1); else *(state->path) = 0; else #endif #if !defined(NO_snprintf) && !defined(NO_vsnprintf) (void)snprintf(state->path, len + 1, "%s", (const char *)path); #else strcpy(state->path, path); #endif /* compute the flags for open() */ oflag = #ifdef O_LARGEFILE O_LARGEFILE | #endif #ifdef O_BINARY O_BINARY | #endif #ifdef O_CLOEXEC (cloexec ? O_CLOEXEC : 0) | #endif (state->mode == GZ_READ ? O_RDONLY : (O_WRONLY | O_CREAT | #ifdef O_EXCL (exclusive ? O_EXCL : 0) | #endif (state->mode == GZ_WRITE ? O_TRUNC : O_APPEND))); /* open the file with the appropriate flags (or just use fd) */ state->fd = fd > -1 ? fd : ( #ifdef WIDECHAR fd == -2 ? _wopen(path, oflag, 0666) : #endif open((const char *)path, oflag, 0666)); if (state->fd == -1) { free(state->path); free(state); return NULL; } if (state->mode == GZ_APPEND) { LSEEK(state->fd, 0, SEEK_END); /* so gzoffset() is correct */ state->mode = GZ_WRITE; /* simplify later checks */ } /* save the current position for rewinding (only if reading) */ if (state->mode == GZ_READ) { state->start = LSEEK(state->fd, 0, SEEK_CUR); if (state->start == -1) state->start = 0; } /* initialize stream */ gz_reset(state); /* return stream */ return (gzFile)state; } /* -- see zlib.h -- */ gzFile ZEXPORT gzopen(path, mode) const char *path; const char *mode; { return gz_open(path, -1, mode); } /* -- see zlib.h -- */ gzFile ZEXPORT gzopen64(path, mode) const char *path; const char *mode; { return gz_open(path, -1, mode); } /* -- see zlib.h -- */ gzFile ZEXPORT gzdopen(fd, mode) int fd; const char *mode; { char *path; /* identifier for error messages */ gzFile gz; if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL) return NULL; #if !defined(NO_snprintf) && !defined(NO_vsnprintf) (void)snprintf(path, 7 + 3 * sizeof(int), "", fd); #else sprintf(path, "", fd); /* for debugging */ #endif gz = gz_open(path, fd, mode); free(path); return gz; } /* -- see zlib.h -- */ #ifdef WIDECHAR gzFile ZEXPORT gzopen_w(path, mode) const wchar_t *path; const char *mode; { return gz_open(path, -2, mode); } #endif /* -- see zlib.h -- */ int ZEXPORT gzbuffer(file, size) gzFile file; unsigned size; { gz_statep state; /* get internal structure and check integrity */ if (file == NULL) return -1; state = (gz_statep)file; if (state->mode != GZ_READ && state->mode != GZ_WRITE) return -1; /* make sure we haven't already allocated memory */ if (state->size != 0) return -1; /* check and set requested size */ if ((size << 1) < size) return -1; /* need to be able to double it */ if (size < 2) size = 2; /* need two bytes to check magic header */ state->want = size; return 0; } /* -- see zlib.h -- */ int ZEXPORT gzrewind(file) gzFile file; { gz_statep state; /* get internal structure */ if (file == NULL) return -1; state = (gz_statep)file; /* check that we're reading and that there's no error */ if (state->mode != GZ_READ || (state->err != Z_OK && state->err != Z_BUF_ERROR)) return -1; /* back up and start over */ if (LSEEK(state->fd, state->start, SEEK_SET) == -1) return -1; gz_reset(state); return 0; } /* -- see zlib.h -- */ z_off64_t ZEXPORT gzseek64(file, offset, whence) gzFile file; z_off64_t offset; int whence; { unsigned n; z_off64_t ret; gz_statep state; /* get internal structure and check integrity */ if (file == NULL) return -1; state = (gz_statep)file; if (state->mode != GZ_READ && state->mode != GZ_WRITE) return -1; /* check that there's no error */ if (state->err != Z_OK && state->err != Z_BUF_ERROR) return -1; /* can only seek from start or relative to current position */ if (whence != SEEK_SET && whence != SEEK_CUR) return -1; /* normalize offset to a SEEK_CUR specification */ if (whence == SEEK_SET) offset -= state->x.pos; else if (state->seek) offset += state->skip; state->seek = 0; /* if within raw area while reading, just go there */ if (state->mode == GZ_READ && state->how == COPY && state->x.pos + offset >= 0) { ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR); if (ret == -1) return -1; state->x.have = 0; state->eof = 0; state->past = 0; state->seek = 0; gz_error(state, Z_OK, NULL); state->strm.avail_in = 0; state->x.pos += offset; return state->x.pos; } /* calculate skip amount, rewinding if needed for back seek when reading */ if (offset < 0) { if (state->mode != GZ_READ) /* writing -- can't go backwards */ return -1; offset += state->x.pos; if (offset < 0) /* before start of file! */ return -1; if (gzrewind(file) == -1) /* rewind, then skip to offset */ return -1; } /* if reading, skip what's in output buffer (one less gzgetc() check) */ if (state->mode == GZ_READ) { n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ? (unsigned)offset : state->x.have; state->x.have -= n; state->x.next += n; state->x.pos += n; offset -= n; } /* request skip (if not zero) */ if (offset) { state->seek = 1; state->skip = offset; } return state->x.pos + offset; } /* -- see zlib.h -- */ z_off_t ZEXPORT gzseek(file, offset, whence) gzFile file; z_off_t offset; int whence; { z_off64_t ret; ret = gzseek64(file, (z_off64_t)offset, whence); return ret == (z_off_t)ret ? (z_off_t)ret : -1; } /* -- see zlib.h -- */ z_off64_t ZEXPORT gztell64(file) gzFile file; { gz_statep state; /* get internal structure and check integrity */ if (file == NULL) return -1; state = (gz_statep)file; if (state->mode != GZ_READ && state->mode != GZ_WRITE) return -1; /* return position */ return state->x.pos + (state->seek ? state->skip : 0); } /* -- see zlib.h -- */ z_off_t ZEXPORT gztell(file) gzFile file; { z_off64_t ret; ret = gztell64(file); return ret == (z_off_t)ret ? (z_off_t)ret : -1; } /* -- see zlib.h -- */ z_off64_t ZEXPORT gzoffset64(file) gzFile file; { z_off64_t offset; gz_statep state; /* get internal structure and check integrity */ if (file == NULL) return -1; state = (gz_statep)file; if (state->mode != GZ_READ && state->mode != GZ_WRITE) return -1; /* compute and return effective offset in file */ offset = LSEEK(state->fd, 0, SEEK_CUR); if (offset == -1) return -1; if (state->mode == GZ_READ) /* reading */ offset -= state->strm.avail_in; /* don't count buffered input */ return offset; } /* -- see zlib.h -- */ z_off_t ZEXPORT gzoffset(file) gzFile file; { z_off64_t ret; ret = gzoffset64(file); return ret == (z_off_t)ret ? (z_off_t)ret : -1; } /* -- see zlib.h -- */ int ZEXPORT gzeof(file) gzFile file; { gz_statep state; /* get internal structure and check integrity */ if (file == NULL) return 0; state = (gz_statep)file; if (state->mode != GZ_READ && state->mode != GZ_WRITE) return 0; /* return end-of-file state */ return state->mode == GZ_READ ? state->past : 0; } /* -- see zlib.h -- */ const char * ZEXPORT gzerror(file, errnum) gzFile file; int *errnum; { gz_statep state; /* get internal structure and check integrity */ if (file == NULL) return NULL; state = (gz_statep)file; if (state->mode != GZ_READ && state->mode != GZ_WRITE) return NULL; /* return error information */ if (errnum != NULL) *errnum = state->err; return state->err == Z_MEM_ERROR ? "out of memory" : (state->msg == NULL ? "" : state->msg); } /* -- see zlib.h -- */ void ZEXPORT gzclearerr(file) gzFile file; { gz_statep state; /* get internal structure and check integrity */ if (file == NULL) return; state = (gz_statep)file; if (state->mode != GZ_READ && state->mode != GZ_WRITE) return; /* clear error and end-of-file */ if (state->mode == GZ_READ) { state->eof = 0; state->past = 0; } gz_error(state, Z_OK, NULL); } /* Create an error message in allocated memory and set state->err and state->msg accordingly. Free any previous error message already there. Do not try to free or allocate space if the error is Z_MEM_ERROR (out of memory). Simply save the error message as a static string. If there is an allocation failure constructing the error message, then convert the error to out of memory. */ void ZLIB_INTERNAL gz_error(state, err, msg) gz_statep state; int err; const char *msg; { /* free previously allocated message and clear */ if (state->msg != NULL) { if (state->err != Z_MEM_ERROR) free(state->msg); state->msg = NULL; } /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */ if (err != Z_OK && err != Z_BUF_ERROR) state->x.have = 0; /* set error code, and if no message, then done */ state->err = err; if (msg == NULL) return; /* for an out of memory error, return literal string when requested */ if (err == Z_MEM_ERROR) return; /* construct error message with path */ if ((state->msg = (char *)malloc(strlen(state->path) + strlen(msg) + 3)) == NULL) { state->err = Z_MEM_ERROR; return; } #if !defined(NO_snprintf) && !defined(NO_vsnprintf) (void)snprintf(state->msg, strlen(state->path) + strlen(msg) + 3, "%s%s%s", state->path, ": ", msg); #else strcpy(state->msg, state->path); strcat(state->msg, ": "); strcat(state->msg, msg); #endif } #ifndef INT_MAX /* portably return maximum value for an int (when limits.h presumed not available) -- we need to do this to cover cases where 2's complement not used, since C standard permits 1's complement and sign-bit representations, otherwise we could just use ((unsigned)-1) >> 1 */ unsigned ZLIB_INTERNAL gz_intmax() { unsigned p, q; p = 1; do { q = p; p <<= 1; p++; } while (p > q); return q >> 1; } #endif gtkwave-3.3.86/src/libz/zutil.c0000664000175000017500000001621013166335473015646 0ustar bybellbybell/* zutil.c -- target dependent utility functions for the compression library * Copyright (C) 1995-2017 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #include "zutil.h" #ifndef Z_SOLO # include "gzguts.h" #endif z_const char * const z_errmsg[10] = { (z_const char *)"need dictionary", /* Z_NEED_DICT 2 */ (z_const char *)"stream end", /* Z_STREAM_END 1 */ (z_const char *)"", /* Z_OK 0 */ (z_const char *)"file error", /* Z_ERRNO (-1) */ (z_const char *)"stream error", /* Z_STREAM_ERROR (-2) */ (z_const char *)"data error", /* Z_DATA_ERROR (-3) */ (z_const char *)"insufficient memory", /* Z_MEM_ERROR (-4) */ (z_const char *)"buffer error", /* Z_BUF_ERROR (-5) */ (z_const char *)"incompatible version",/* Z_VERSION_ERROR (-6) */ (z_const char *)"" }; const char * ZEXPORT zlibVersion() { return ZLIB_VERSION; } uLong ZEXPORT zlibCompileFlags() { uLong flags; flags = 0; switch ((int)(sizeof(uInt))) { case 2: break; case 4: flags += 1; break; case 8: flags += 2; break; default: flags += 3; } switch ((int)(sizeof(uLong))) { case 2: break; case 4: flags += 1 << 2; break; case 8: flags += 2 << 2; break; default: flags += 3 << 2; } switch ((int)(sizeof(voidpf))) { case 2: break; case 4: flags += 1 << 4; break; case 8: flags += 2 << 4; break; default: flags += 3 << 4; } switch ((int)(sizeof(z_off_t))) { case 2: break; case 4: flags += 1 << 6; break; case 8: flags += 2 << 6; break; default: flags += 3 << 6; } #ifdef ZLIB_DEBUG flags += 1 << 8; #endif #if defined(ASMV) || defined(ASMINF) flags += 1 << 9; #endif #ifdef ZLIB_WINAPI flags += 1 << 10; #endif #ifdef BUILDFIXED flags += 1 << 12; #endif #ifdef DYNAMIC_CRC_TABLE flags += 1 << 13; #endif #ifdef NO_GZCOMPRESS flags += 1L << 16; #endif #ifdef NO_GZIP flags += 1L << 17; #endif #ifdef PKZIP_BUG_WORKAROUND flags += 1L << 20; #endif #ifdef FASTEST flags += 1L << 21; #endif #if defined(STDC) || defined(Z_HAVE_STDARG_H) # ifdef NO_vsnprintf flags += 1L << 25; # ifdef HAS_vsprintf_void flags += 1L << 26; # endif # else # ifdef HAS_vsnprintf_void flags += 1L << 26; # endif # endif #else flags += 1L << 24; # ifdef NO_snprintf flags += 1L << 25; # ifdef HAS_sprintf_void flags += 1L << 26; # endif # else # ifdef HAS_snprintf_void flags += 1L << 26; # endif # endif #endif return flags; } #ifdef ZLIB_DEBUG #include # ifndef verbose # define verbose 0 # endif int ZLIB_INTERNAL z_verbose = verbose; void ZLIB_INTERNAL z_error (m) char *m; { fprintf(stderr, "%s\n", m); exit(1); } #endif /* exported to allow conversion of error code to string for compress() and * uncompress() */ const char * ZEXPORT zError(err) int err; { return ERR_MSG(err); } #if defined(_WIN32_WCE) /* The Microsoft C Run-Time Library for Windows CE doesn't have * errno. We define it as a global variable to simplify porting. * Its value is always 0 and should not be used. */ int errno = 0; #endif #ifndef HAVE_MEMCPY void ZLIB_INTERNAL zmemcpy(dest, source, len) Bytef* dest; const Bytef* source; uInt len; { if (len == 0) return; do { *dest++ = *source++; /* ??? to be unrolled */ } while (--len != 0); } int ZLIB_INTERNAL zmemcmp(s1, s2, len) const Bytef* s1; const Bytef* s2; uInt len; { uInt j; for (j = 0; j < len; j++) { if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; } return 0; } void ZLIB_INTERNAL zmemzero(dest, len) Bytef* dest; uInt len; { if (len == 0) return; do { *dest++ = 0; /* ??? to be unrolled */ } while (--len != 0); } #endif #ifndef Z_SOLO #ifdef SYS16BIT #ifdef __TURBOC__ /* Turbo C in 16-bit mode */ # define MY_ZCALLOC /* Turbo C malloc() does not allow dynamic allocation of 64K bytes * and farmalloc(64K) returns a pointer with an offset of 8, so we * must fix the pointer. Warning: the pointer must be put back to its * original form in order to free it, use zcfree(). */ #define MAX_PTR 10 /* 10*64K = 640K */ local int next_ptr = 0; typedef struct ptr_table_s { voidpf org_ptr; voidpf new_ptr; } ptr_table; local ptr_table table[MAX_PTR]; /* This table is used to remember the original form of pointers * to large buffers (64K). Such pointers are normalized with a zero offset. * Since MSDOS is not a preemptive multitasking OS, this table is not * protected from concurrent access. This hack doesn't work anyway on * a protected system like OS/2. Use Microsoft C instead. */ voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) { voidpf buf; ulg bsize = (ulg)items*size; (void)opaque; /* If we allocate less than 65520 bytes, we assume that farmalloc * will return a usable pointer which doesn't have to be normalized. */ if (bsize < 65520L) { buf = farmalloc(bsize); if (*(ush*)&buf != 0) return buf; } else { buf = farmalloc(bsize + 16L); } if (buf == NULL || next_ptr >= MAX_PTR) return NULL; table[next_ptr].org_ptr = buf; /* Normalize the pointer to seg:0 */ *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; *(ush*)&buf = 0; table[next_ptr++].new_ptr = buf; return buf; } void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) { int n; (void)opaque; if (*(ush*)&ptr != 0) { /* object < 64K */ farfree(ptr); return; } /* Find the original pointer */ for (n = 0; n < next_ptr; n++) { if (ptr != table[n].new_ptr) continue; farfree(table[n].org_ptr); while (++n < next_ptr) { table[n-1] = table[n]; } next_ptr--; return; } Assert(0, "zcfree: ptr not found"); } #endif /* __TURBOC__ */ #ifdef M_I86 /* Microsoft C in 16-bit mode */ # define MY_ZCALLOC #if (!defined(_MSC_VER) || (_MSC_VER <= 600)) # define _halloc halloc # define _hfree hfree #endif voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) { (void)opaque; return _halloc((long)items, size); } void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) { (void)opaque; _hfree(ptr); } #endif /* M_I86 */ #endif /* SYS16BIT */ #ifndef MY_ZCALLOC /* Any system without a special alloc function */ #ifndef STDC extern voidp malloc OF((uInt size)); extern voidp calloc OF((uInt items, uInt size)); extern void free OF((voidpf ptr)); #endif voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) voidpf opaque; unsigned items; unsigned size; { (void)opaque; return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : (voidpf)calloc(items, size); } void ZLIB_INTERNAL zcfree (opaque, ptr) voidpf opaque; voidpf ptr; { (void)opaque; free(ptr); } #endif /* MY_ZCALLOC */ #endif /* !Z_SOLO */ gtkwave-3.3.86/src/libz/deflate.h0000664000175000017500000003153613166335473016120 0ustar bybellbybell/* deflate.h -- internal compression state * Copyright (C) 1995-2016 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* @(#) $Id$ */ #ifndef DEFLATE_H #define DEFLATE_H #include "zutil.h" /* define NO_GZIP when compiling if you want to disable gzip header and trailer creation by deflate(). NO_GZIP would be used to avoid linking in the crc code when it is not needed. For shared libraries, gzip encoding should be left enabled. */ #ifndef NO_GZIP # define GZIP #endif /* =========================================================================== * Internal compression state. */ #define LENGTH_CODES 29 /* number of length codes, not counting the special END_BLOCK code */ #define LITERALS 256 /* number of literal bytes 0..255 */ #define L_CODES (LITERALS+1+LENGTH_CODES) /* number of Literal or Length codes, including the END_BLOCK code */ #define D_CODES 30 /* number of distance codes */ #define BL_CODES 19 /* number of codes used to transfer the bit lengths */ #define HEAP_SIZE (2*L_CODES+1) /* maximum heap size */ #define MAX_BITS 15 /* All codes must not exceed MAX_BITS bits */ #define Buf_size 16 /* size of bit buffer in bi_buf */ #define INIT_STATE 42 /* zlib header -> BUSY_STATE */ #ifdef GZIP # define GZIP_STATE 57 /* gzip header -> BUSY_STATE | EXTRA_STATE */ #endif #define EXTRA_STATE 69 /* gzip extra block -> NAME_STATE */ #define NAME_STATE 73 /* gzip file name -> COMMENT_STATE */ #define COMMENT_STATE 91 /* gzip comment -> HCRC_STATE */ #define HCRC_STATE 103 /* gzip header CRC -> BUSY_STATE */ #define BUSY_STATE 113 /* deflate -> FINISH_STATE */ #define FINISH_STATE 666 /* stream complete */ /* Stream status */ /* Data structure describing a single value and its code string. */ typedef struct ct_data_s { union { ush freq; /* frequency count */ ush code; /* bit string */ } fc; union { ush dad; /* father node in Huffman tree */ ush len; /* length of bit string */ } dl; } FAR ct_data; #define Freq fc.freq #define Code fc.code #define Dad dl.dad #define Len dl.len typedef struct static_tree_desc_s static_tree_desc; typedef struct tree_desc_s { ct_data *dyn_tree; /* the dynamic tree */ int max_code; /* largest code with non zero frequency */ const static_tree_desc *stat_desc; /* the corresponding static tree */ } FAR tree_desc; typedef ush Pos; typedef Pos FAR Posf; typedef unsigned IPos; /* A Pos is an index in the character window. We use short instead of int to * save space in the various tables. IPos is used only for parameter passing. */ typedef struct internal_state { z_streamp strm; /* pointer back to this zlib stream */ int status; /* as the name implies */ Bytef *pending_buf; /* output still pending */ ulg pending_buf_size; /* size of pending_buf */ Bytef *pending_out; /* next pending byte to output to the stream */ ulg pending; /* nb of bytes in the pending buffer */ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ gz_headerp gzhead; /* gzip header information to write */ ulg gzindex; /* where in extra, name, or comment */ Byte method; /* can only be DEFLATED */ int last_flush; /* value of flush param for previous deflate call */ /* used by deflate.c: */ uInt w_size; /* LZ77 window size (32K by default) */ uInt w_bits; /* log2(w_size) (8..16) */ uInt w_mask; /* w_size - 1 */ Bytef *window; /* Sliding window. Input bytes are read into the second half of the window, * and move to the first half later to keep a dictionary of at least wSize * bytes. With this organization, matches are limited to a distance of * wSize-MAX_MATCH bytes, but this ensures that IO is always * performed with a length multiple of the block size. Also, it limits * the window size to 64K, which is quite useful on MSDOS. * To do: use the user input buffer as sliding window. */ ulg window_size; /* Actual size of window: 2*wSize, except when the user input buffer * is directly used as sliding window. */ Posf *prev; /* Link to older string with same hash index. To limit the size of this * array to 64K, this link is maintained only for the last 32K strings. * An index in this array is thus a window index modulo 32K. */ Posf *head; /* Heads of the hash chains or NIL. */ uInt ins_h; /* hash index of string to be inserted */ uInt hash_size; /* number of elements in hash table */ uInt hash_bits; /* log2(hash_size) */ uInt hash_mask; /* hash_size-1 */ uInt hash_shift; /* Number of bits by which ins_h must be shifted at each input * step. It must be such that after MIN_MATCH steps, the oldest * byte no longer takes part in the hash key, that is: * hash_shift * MIN_MATCH >= hash_bits */ long block_start; /* Window position at the beginning of the current output block. Gets * negative when the window is moved backwards. */ uInt match_length; /* length of best match */ IPos prev_match; /* previous match */ int match_available; /* set if previous match exists */ uInt strstart; /* start of string to insert */ uInt match_start; /* start of matching string */ uInt lookahead; /* number of valid bytes ahead in window */ uInt prev_length; /* Length of the best match at previous step. Matches not greater than this * are discarded. This is used in the lazy match evaluation. */ uInt max_chain_length; /* To speed up deflation, hash chains are never searched beyond this * length. A higher limit improves compression ratio but degrades the * speed. */ uInt max_lazy_match; /* Attempt to find a better match only when the current match is strictly * smaller than this value. This mechanism is used only for compression * levels >= 4. */ # define max_insert_length max_lazy_match /* Insert new strings in the hash table only if the match length is not * greater than this length. This saves time but degrades compression. * max_insert_length is used only for compression levels <= 3. */ int level; /* compression level (1..9) */ int strategy; /* favor or force Huffman coding*/ uInt good_match; /* Use a faster search when the previous match is longer than this */ int nice_match; /* Stop searching when current match exceeds this */ /* used by trees.c: */ /* Didn't use ct_data typedef below to suppress compiler warning */ struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ struct tree_desc_s l_desc; /* desc. for literal tree */ struct tree_desc_s d_desc; /* desc. for distance tree */ struct tree_desc_s bl_desc; /* desc. for bit length tree */ ush bl_count[MAX_BITS+1]; /* number of codes at each bit length for an optimal tree */ int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ int heap_len; /* number of elements in the heap */ int heap_max; /* element of largest frequency */ /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. * The same heap array is used to build all trees. */ uch depth[2*L_CODES+1]; /* Depth of each subtree used as tie breaker for trees of equal frequency */ uchf *l_buf; /* buffer for literals or lengths */ uInt lit_bufsize; /* Size of match buffer for literals/lengths. There are 4 reasons for * limiting lit_bufsize to 64K: * - frequencies can be kept in 16 bit counters * - if compression is not successful for the first block, all input * data is still in the window so we can still emit a stored block even * when input comes from standard input. (This can also be done for * all blocks if lit_bufsize is not greater than 32K.) * - if compression is not successful for a file smaller than 64K, we can * even emit a stored file instead of a stored block (saving 5 bytes). * This is applicable only for zip (not gzip or zlib). * - creating new Huffman trees less frequently may not provide fast * adaptation to changes in the input data statistics. (Take for * example a binary file with poorly compressible code followed by * a highly compressible string table.) Smaller buffer sizes give * fast adaptation but have of course the overhead of transmitting * trees more frequently. * - I can't count above 4 */ uInt last_lit; /* running index in l_buf */ ushf *d_buf; /* Buffer for distances. To simplify the code, d_buf and l_buf have * the same number of elements. To use different lengths, an extra flag * array would be necessary. */ ulg opt_len; /* bit length of current block with optimal trees */ ulg static_len; /* bit length of current block with static trees */ uInt matches; /* number of string matches in current block */ uInt insert; /* bytes at end of window left to insert */ #ifdef ZLIB_DEBUG ulg compressed_len; /* total bit length of compressed file mod 2^32 */ ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ #endif ush bi_buf; /* Output buffer. bits are inserted starting at the bottom (least * significant bits). */ int bi_valid; /* Number of valid bits in bi_buf. All bits above the last valid bit * are always zero. */ ulg high_water; /* High water mark offset in window for initialized bytes -- bytes above * this are set to zero in order to avoid memory check warnings when * longest match routines access bytes past the input. This is then * updated to the new high water mark. */ } FAR deflate_state; /* Output a byte on the stream. * IN assertion: there is enough room in pending_buf. */ #define put_byte(s, c) {s->pending_buf[s->pending++] = (Bytef)(c);} #define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) /* Minimum amount of lookahead, except at the end of the input file. * See deflate.c for comments about the MIN_MATCH+1. */ #define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) /* In order to simplify the code, particularly on 16 bit machines, match * distances are limited to MAX_DIST instead of WSIZE. */ #define WIN_INIT MAX_MATCH /* Number of bytes after end of data in window to initialize in order to avoid memory checker errors from longest match routines */ /* in trees.c */ void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, int last)); void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, int last)); #define d_code(dist) \ ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) /* Mapping from a distance to a distance code. dist is the distance - 1 and * must not have side effects. _dist_code[256] and _dist_code[257] are never * used. */ #ifndef ZLIB_DEBUG /* Inline versions of _tr_tally for speed: */ #if defined(GEN_TREES_H) || !defined(STDC) extern uch ZLIB_INTERNAL _length_code[]; extern uch ZLIB_INTERNAL _dist_code[]; #else extern const uch ZLIB_INTERNAL _length_code[]; extern const uch ZLIB_INTERNAL _dist_code[]; #endif # define _tr_tally_lit(s, c, flush) \ { uch cc = (c); \ s->d_buf[s->last_lit] = 0; \ s->l_buf[s->last_lit++] = cc; \ s->dyn_ltree[cc].Freq++; \ flush = (s->last_lit == s->lit_bufsize-1); \ } # define _tr_tally_dist(s, distance, length, flush) \ { uch len = (uch)(length); \ ush dist = (ush)(distance); \ s->d_buf[s->last_lit] = dist; \ s->l_buf[s->last_lit++] = len; \ dist--; \ s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ s->dyn_dtree[d_code(dist)].Freq++; \ flush = (s->last_lit == s->lit_bufsize-1); \ } #else # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) # define _tr_tally_dist(s, distance, length, flush) \ flush = _tr_tally(s, distance, length) #endif #endif /* DEFLATE_H */ gtkwave-3.3.86/src/libz/crc32.c0000664000175000017500000003334513166335473015423 0ustar bybellbybell/* crc32.c -- compute the CRC-32 of a data stream * Copyright (C) 1995-2006, 2010, 2011, 2012, 2016 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h * * Thanks to Rodney Brown for his contribution of faster * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing * tables for updating the shift register in one step with three exclusive-ors * instead of four steps with four exclusive-ors. This results in about a * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. */ /* @(#) $Id$ */ /* Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore protection on the static variables used to control the first-use generation of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should first call get_crc_table() to initialize the tables before allowing more than one thread to use crc32(). DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. */ #ifdef MAKECRCH # include # ifndef DYNAMIC_CRC_TABLE # define DYNAMIC_CRC_TABLE # endif /* !DYNAMIC_CRC_TABLE */ #endif /* MAKECRCH */ #include "zutil.h" /* for STDC and FAR definitions */ /* Definitions for doing the crc four data bytes at a time. */ #if !defined(NOBYFOUR) && defined(Z_U4) # define BYFOUR #endif #ifdef BYFOUR local unsigned long crc32_little OF((unsigned long, const unsigned char FAR *, z_size_t)); local unsigned long crc32_big OF((unsigned long, const unsigned char FAR *, z_size_t)); # define TBLS 8 #else # define TBLS 1 #endif /* BYFOUR */ /* Local functions for crc concatenation */ local unsigned long gf2_matrix_times OF((unsigned long *mat, unsigned long vec)); local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); #ifdef DYNAMIC_CRC_TABLE local volatile int crc_table_empty = 1; local z_crc_t FAR crc_table[TBLS][256]; local void make_crc_table OF((void)); #ifdef MAKECRCH local void write_table OF((FILE *, const z_crc_t FAR *)); #endif /* MAKECRCH */ /* Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. Polynomials over GF(2) are represented in binary, one bit per coefficient, with the lowest powers in the most significant bit. Then adding polynomials is just exclusive-or, and multiplying a polynomial by x is a right shift by one. If we call the above polynomial p, and represent a byte as the polynomial q, also with the lowest power in the most significant bit (so the byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, where a mod b means the remainder after dividing a by b. This calculation is done using the shift-register method of multiplying and taking the remainder. The register is initialized to zero, and for each incoming bit, x^32 is added mod p to the register if the bit is a one (where x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by x (which is shifting right by one and adding x^32 mod p if the bit shifted out is a one). We start with the highest power (least significant bit) of q and repeat for all eight bits of q. The first table is simply the CRC of all possible eight bit values. This is all the information needed to generate CRCs on data a byte at a time for all combinations of CRC register values and incoming bytes. The remaining tables allow for word-at-a-time CRC calculation for both big-endian and little- endian machines, where a word is four bytes. */ local void make_crc_table() { z_crc_t c; int n, k; z_crc_t poly; /* polynomial exclusive-or pattern */ /* terms of polynomial defining this crc (except x^32): */ static volatile int first = 1; /* flag to limit concurrent making */ static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; /* See if another task is already doing this (not thread-safe, but better than nothing -- significantly reduces duration of vulnerability in case the advice about DYNAMIC_CRC_TABLE is ignored) */ if (first) { first = 0; /* make exclusive-or pattern from polynomial (0xedb88320UL) */ poly = 0; for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) poly |= (z_crc_t)1 << (31 - p[n]); /* generate a crc for every 8-bit value */ for (n = 0; n < 256; n++) { c = (z_crc_t)n; for (k = 0; k < 8; k++) c = c & 1 ? poly ^ (c >> 1) : c >> 1; crc_table[0][n] = c; } #ifdef BYFOUR /* generate crc for each value followed by one, two, and three zeros, and then the byte reversal of those as well as the first table */ for (n = 0; n < 256; n++) { c = crc_table[0][n]; crc_table[4][n] = ZSWAP32(c); for (k = 1; k < 4; k++) { c = crc_table[0][c & 0xff] ^ (c >> 8); crc_table[k][n] = c; crc_table[k + 4][n] = ZSWAP32(c); } } #endif /* BYFOUR */ crc_table_empty = 0; } else { /* not first */ /* wait for the other guy to finish (not efficient, but rare) */ while (crc_table_empty) ; } #ifdef MAKECRCH /* write out CRC tables to crc32.h */ { FILE *out; out = fopen("crc32.h", "w"); if (out == NULL) return; fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); fprintf(out, "local const z_crc_t FAR "); fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); write_table(out, crc_table[0]); # ifdef BYFOUR fprintf(out, "#ifdef BYFOUR\n"); for (k = 1; k < 8; k++) { fprintf(out, " },\n {\n"); write_table(out, crc_table[k]); } fprintf(out, "#endif\n"); # endif /* BYFOUR */ fprintf(out, " }\n};\n"); fclose(out); } #endif /* MAKECRCH */ } #ifdef MAKECRCH local void write_table(out, table) FILE *out; const z_crc_t FAR *table; { int n; for (n = 0; n < 256; n++) fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", (unsigned long)(table[n]), n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); } #endif /* MAKECRCH */ #else /* !DYNAMIC_CRC_TABLE */ /* ======================================================================== * Tables of CRC-32s of all single-byte values, made by make_crc_table(). */ #include "crc32.h" #endif /* DYNAMIC_CRC_TABLE */ /* ========================================================================= * This function can be used by asm versions of crc32() */ const z_crc_t FAR * ZEXPORT get_crc_table() { #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); #endif /* DYNAMIC_CRC_TABLE */ return (const z_crc_t FAR *)crc_table; } /* ========================================================================= */ #define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) #define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 /* ========================================================================= */ unsigned long ZEXPORT crc32_z(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; z_size_t len; { if (buf == Z_NULL) return 0UL; #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); #endif /* DYNAMIC_CRC_TABLE */ #ifdef BYFOUR if (sizeof(void *) == sizeof(ptrdiff_t)) { z_crc_t endian; endian = 1; if (*((unsigned char *)(&endian))) return crc32_little(crc, buf, len); else return crc32_big(crc, buf, len); } #endif /* BYFOUR */ crc = crc ^ 0xffffffffUL; while (len >= 8) { DO8; len -= 8; } if (len) do { DO1; } while (--len); return crc ^ 0xffffffffUL; } /* ========================================================================= */ unsigned long ZEXPORT crc32(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; uInt len; { return crc32_z(crc, buf, len); } #ifdef BYFOUR /* This BYFOUR code accesses the passed unsigned char * buffer with a 32-bit integer pointer type. This violates the strict aliasing rule, where a compiler can assume, for optimization purposes, that two pointers to fundamentally different types won't ever point to the same memory. This can manifest as a problem only if one of the pointers is written to. This code only reads from those pointers. So long as this code remains isolated in this compilation unit, there won't be a problem. For this reason, this code should not be copied and pasted into a compilation unit in which other code writes to the buffer that is passed to these routines. */ /* ========================================================================= */ #define DOLIT4 c ^= *buf4++; \ c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] #define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 /* ========================================================================= */ local unsigned long crc32_little(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; z_size_t len; { register z_crc_t c; register const z_crc_t FAR *buf4; c = (z_crc_t)crc; c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); len--; } buf4 = (const z_crc_t FAR *)(const void FAR *)buf; while (len >= 32) { DOLIT32; len -= 32; } while (len >= 4) { DOLIT4; len -= 4; } buf = (const unsigned char FAR *)buf4; if (len) do { c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); } while (--len); c = ~c; return (unsigned long)c; } /* ========================================================================= */ #define DOBIG4 c ^= *buf4++; \ c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] #define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 /* ========================================================================= */ local unsigned long crc32_big(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; z_size_t len; { register z_crc_t c; register const z_crc_t FAR *buf4; c = ZSWAP32((z_crc_t)crc); c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); len--; } buf4 = (const z_crc_t FAR *)(const void FAR *)buf; while (len >= 32) { DOBIG32; len -= 32; } while (len >= 4) { DOBIG4; len -= 4; } buf = (const unsigned char FAR *)buf4; if (len) do { c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); } while (--len); c = ~c; return (unsigned long)(ZSWAP32(c)); } #endif /* BYFOUR */ #define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ /* ========================================================================= */ local unsigned long gf2_matrix_times(mat, vec) unsigned long *mat; unsigned long vec; { unsigned long sum; sum = 0; while (vec) { if (vec & 1) sum ^= *mat; vec >>= 1; mat++; } return sum; } /* ========================================================================= */ local void gf2_matrix_square(square, mat) unsigned long *square; unsigned long *mat; { int n; for (n = 0; n < GF2_DIM; n++) square[n] = gf2_matrix_times(mat, mat[n]); } /* ========================================================================= */ local uLong crc32_combine_(crc1, crc2, len2) uLong crc1; uLong crc2; z_off64_t len2; { int n; unsigned long row; unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ /* degenerate case (also disallow negative lengths) */ if (len2 <= 0) return crc1; /* put operator for one zero bit in odd */ odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ row = 1; for (n = 1; n < GF2_DIM; n++) { odd[n] = row; row <<= 1; } /* put operator for two zero bits in even */ gf2_matrix_square(even, odd); /* put operator for four zero bits in odd */ gf2_matrix_square(odd, even); /* apply len2 zeros to crc1 (first square will put the operator for one zero byte, eight zero bits, in even) */ do { /* apply zeros operator for this bit of len2 */ gf2_matrix_square(even, odd); if (len2 & 1) crc1 = gf2_matrix_times(even, crc1); len2 >>= 1; /* if no more bits set, then done */ if (len2 == 0) break; /* another iteration of the loop with odd and even swapped */ gf2_matrix_square(odd, even); if (len2 & 1) crc1 = gf2_matrix_times(odd, crc1); len2 >>= 1; /* if no more bits set, then done */ } while (len2 != 0); /* return combined crc */ crc1 ^= crc2; return crc1; } /* ========================================================================= */ uLong ZEXPORT crc32_combine(crc1, crc2, len2) uLong crc1; uLong crc2; z_off_t len2; { return crc32_combine_(crc1, crc2, len2); } uLong ZEXPORT crc32_combine64(crc1, crc2, len2) uLong crc1; uLong crc2; z_off64_t len2; { return crc32_combine_(crc1, crc2, len2); } gtkwave-3.3.86/src/libz/README0000664000175000017500000001210313166335473015210 0ustar bybellbybellZLIB DATA COMPRESSION LIBRARY zlib 1.2.11 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). All functions of the compression library are documented in the file zlib.h (volunteer to write man pages welcome, contact zlib@gzip.org). A usage example of the library is given in the file test/example.c which also tests that the library is working correctly. Another example is given in the file test/minigzip.c. The compression library itself is composed of all source files in the root directory. To compile all files and run the test program, follow the instructions given at the top of Makefile.in. In short "./configure; make test", and if that goes well, "make install" should work for most flavors of Unix. For Windows, use one of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use make_vms.com. Questions about zlib should be sent to , or to Gilles Vollant for the Windows DLL version. The zlib home page is http://zlib.net/ . Before reporting a problem, please check this site to verify that you have the latest version of zlib; otherwise get the latest version and check whether the problem still exists or not. PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help. Mark Nelson wrote an article about zlib for the Jan. 1997 issue of Dr. Dobb's Journal; a copy of the article is available at http://marknelson.us/1997/01/01/zlib-engine/ . The changes made in version 1.2.11 are documented in the file ChangeLog. Unsupported third party contributions are provided in directory contrib/ . zlib is available in Java using the java.util.zip package, documented at http://java.sun.com/developer/technicalArticles/Programming/compression/ . A Perl interface to zlib written by Paul Marquess is available at CPAN (Comprehensive Perl Archive Network) sites, including http://search.cpan.org/~pmqs/IO-Compress-Zlib/ . A Python interface to zlib written by A.M. Kuchling is available in Python 1.5 and later versions, see http://docs.python.org/library/zlib.html . zlib is built into tcl: http://wiki.tcl.tk/4610 . An experimental package to read and write files in .zip format, written on top of zlib by Gilles Vollant , is available in the contrib/minizip directory of zlib. Notes for some targets: - For Windows DLL versions, please see win32/DLL_FAQ.txt - For 64-bit Irix, deflate.c must be compiled without any optimization. With -O, one libpng test fails. The test works in 32 bit mode (with the -n32 compiler flag). The compiler bug has been reported to SGI. - zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works when compiled with cc. - On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is necessary to get gzprintf working correctly. This is done by configure. - zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with other compilers. Use "make test" to check your compiler. - gzdopen is not supported on RISCOS or BEOS. - For PalmOs, see http://palmzlib.sourceforge.net/ Acknowledgments: The deflate format used by zlib was defined by Phil Katz. The deflate and zlib specifications were written by L. Peter Deutsch. Thanks to all the people who reported problems and suggested various improvements in zlib; they are too numerous to cite here. Copyright notice: (C) 1995-2017 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu If you use the zlib library in a product, we would appreciate *not* receiving lengthy legal documents to sign. The sources are provided for free but without warranty of any kind. The library has been entirely written by Jean-loup Gailly and Mark Adler; it does not include third-party code. If you redistribute modified sources, we would appreciate that you include in the file ChangeLog history information documenting your changes. Please read the FAQ for more information on the distribution of modified source versions. gtkwave-3.3.86/src/libz/gzread.c0000664000175000017500000004771413166335473015770 0ustar bybellbybell/* gzread.c -- zlib functions for reading gzip files * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "gzguts.h" /* Local functions */ local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); local int gz_avail OF((gz_statep)); local int gz_look OF((gz_statep)); local int gz_decomp OF((gz_statep)); local int gz_fetch OF((gz_statep)); local int gz_skip OF((gz_statep, z_off64_t)); local z_size_t gz_read OF((gz_statep, voidp, z_size_t)); /* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from state->fd, and update state->eof, state->err, and state->msg as appropriate. This function needs to loop on read(), since read() is not guaranteed to read the number of bytes requested, depending on the type of descriptor. */ local int gz_load(state, buf, len, have) gz_statep state; unsigned char *buf; unsigned len; unsigned *have; { int ret; unsigned get, max = ((unsigned)-1 >> 2) + 1; *have = 0; do { get = len - *have; if (get > max) get = max; ret = read(state->fd, buf + *have, get); if (ret <= 0) break; *have += (unsigned)ret; } while (*have < len); if (ret < 0) { gz_error(state, Z_ERRNO, zstrerror()); return -1; } if (ret == 0) state->eof = 1; return 0; } /* Load up input buffer and set eof flag if last data loaded -- return -1 on error, 0 otherwise. Note that the eof flag is set when the end of the input file is reached, even though there may be unused data in the buffer. Once that data has been used, no more attempts will be made to read the file. If strm->avail_in != 0, then the current data is moved to the beginning of the input buffer, and then the remainder of the buffer is loaded with the available data from the input file. */ local int gz_avail(state) gz_statep state; { unsigned got; z_streamp strm = &(state->strm); if (state->err != Z_OK && state->err != Z_BUF_ERROR) return -1; if (state->eof == 0) { if (strm->avail_in) { /* copy what's there to the start */ unsigned char *p = state->in; unsigned const char *q = strm->next_in; unsigned n = strm->avail_in; do { *p++ = *q++; } while (--n); } if (gz_load(state, state->in + strm->avail_in, state->size - strm->avail_in, &got) == -1) return -1; strm->avail_in += got; strm->next_in = state->in; } return 0; } /* Look for gzip header, set up for inflate or copy. state->x.have must be 0. If this is the first time in, allocate required memory. state->how will be left unchanged if there is no more input data available, will be set to COPY if there is no gzip header and direct copying will be performed, or it will be set to GZIP for decompression. If direct copying, then leftover input data from the input buffer will be copied to the output buffer. In that case, all further file reads will be directly to either the output buffer or a user buffer. If decompressing, the inflate state will be initialized. gz_look() will return 0 on success or -1 on failure. */ local int gz_look(state) gz_statep state; { z_streamp strm = &(state->strm); /* allocate read buffers and inflate memory */ if (state->size == 0) { /* allocate buffers */ state->in = (unsigned char *)malloc(state->want); state->out = (unsigned char *)malloc(state->want << 1); if (state->in == NULL || state->out == NULL) { free(state->out); free(state->in); gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } state->size = state->want; /* allocate inflate memory */ state->strm.zalloc = Z_NULL; state->strm.zfree = Z_NULL; state->strm.opaque = Z_NULL; state->strm.avail_in = 0; state->strm.next_in = Z_NULL; if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */ free(state->out); free(state->in); state->size = 0; gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } } /* get at least the magic bytes in the input buffer */ if (strm->avail_in < 2) { if (gz_avail(state) == -1) return -1; if (strm->avail_in == 0) return 0; } /* look for gzip magic bytes -- if there, do gzip decoding (note: there is a logical dilemma here when considering the case of a partially written gzip file, to wit, if a single 31 byte is written, then we cannot tell whether this is a single-byte file, or just a partially written gzip file -- for here we assume that if a gzip file is being written, then the header will be written in a single operation, so that reading a single byte is sufficient indication that it is not a gzip file) */ if (strm->avail_in > 1 && strm->next_in[0] == 31 && strm->next_in[1] == 139) { inflateReset(strm); state->how = GZIP; state->direct = 0; return 0; } /* no gzip header -- if we were decoding gzip before, then this is trailing garbage. Ignore the trailing garbage and finish. */ if (state->direct == 0) { strm->avail_in = 0; state->eof = 1; state->x.have = 0; return 0; } /* doing raw i/o, copy any leftover input to output -- this assumes that the output buffer is larger than the input buffer, which also assures space for gzungetc() */ state->x.next = state->out; if (strm->avail_in) { memcpy(state->x.next, strm->next_in, strm->avail_in); state->x.have = strm->avail_in; strm->avail_in = 0; } state->how = COPY; state->direct = 1; return 0; } /* Decompress from input to the provided next_out and avail_out in the state. On return, state->x.have and state->x.next point to the just decompressed data. If the gzip stream completes, state->how is reset to LOOK to look for the next gzip stream or raw data, once state->x.have is depleted. Returns 0 on success, -1 on failure. */ local int gz_decomp(state) gz_statep state; { int ret = Z_OK; unsigned had; z_streamp strm = &(state->strm); /* fill output buffer up to end of deflate stream */ had = strm->avail_out; do { /* get more input for inflate() */ if (strm->avail_in == 0 && gz_avail(state) == -1) return -1; if (strm->avail_in == 0) { gz_error(state, Z_BUF_ERROR, "unexpected end of file"); break; } /* decompress and handle errors */ ret = inflate(strm, Z_NO_FLUSH); if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { gz_error(state, Z_STREAM_ERROR, "internal error: inflate stream corrupt"); return -1; } if (ret == Z_MEM_ERROR) { gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } if (ret == Z_DATA_ERROR) { /* deflate stream invalid */ gz_error(state, Z_DATA_ERROR, strm->msg == NULL ? "compressed data error" : strm->msg); return -1; } } while (strm->avail_out && ret != Z_STREAM_END); /* update available output */ state->x.have = had - strm->avail_out; state->x.next = strm->next_out - state->x.have; /* if the gzip stream completed successfully, look for another */ if (ret == Z_STREAM_END) state->how = LOOK; /* good decompression */ return 0; } /* Fetch data and put it in the output buffer. Assumes state->x.have is 0. Data is either copied from the input file or decompressed from the input file depending on state->how. If state->how is LOOK, then a gzip header is looked for to determine whether to copy or decompress. Returns -1 on error, otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the end of the input file has been reached and all data has been processed. */ local int gz_fetch(state) gz_statep state; { z_streamp strm = &(state->strm); do { switch(state->how) { case LOOK: /* -> LOOK, COPY (only if never GZIP), or GZIP */ if (gz_look(state) == -1) return -1; if (state->how == LOOK) return 0; break; case COPY: /* -> COPY */ if (gz_load(state, state->out, state->size << 1, &(state->x.have)) == -1) return -1; state->x.next = state->out; return 0; case GZIP: /* -> GZIP or LOOK (if end of gzip stream) */ strm->avail_out = state->size << 1; strm->next_out = state->out; if (gz_decomp(state) == -1) return -1; } } while (state->x.have == 0 && (!state->eof || strm->avail_in)); return 0; } /* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */ local int gz_skip(state, len) gz_statep state; z_off64_t len; { unsigned n; /* skip over len bytes or reach end-of-file, whichever comes first */ while (len) /* skip over whatever is in output buffer */ if (state->x.have) { n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ? (unsigned)len : state->x.have; state->x.have -= n; state->x.next += n; state->x.pos += n; len -= n; } /* output buffer empty -- return if we're at the end of the input */ else if (state->eof && state->strm.avail_in == 0) break; /* need more data to skip -- load up output buffer */ else { /* get more output, looking for header if required */ if (gz_fetch(state) == -1) return -1; } return 0; } /* Read len bytes into buf from file, or less than len up to the end of the input. Return the number of bytes read. If zero is returned, either the end of file was reached, or there was an error. state->err must be consulted in that case to determine which. */ local z_size_t gz_read(state, buf, len) gz_statep state; voidp buf; z_size_t len; { z_size_t got; unsigned n; /* if len is zero, avoid unnecessary operations */ if (len == 0) return 0; /* process a skip request */ if (state->seek) { state->seek = 0; if (gz_skip(state, state->skip) == -1) return 0; } /* get len bytes to buf, or less than len if at the end */ got = 0; do { /* set n to the maximum amount of len that fits in an unsigned int */ n = -1; if (n > len) n = len; /* first just try copying data from the output buffer */ if (state->x.have) { if (state->x.have < n) n = state->x.have; memcpy(buf, state->x.next, n); state->x.next += n; state->x.have -= n; } /* output buffer empty -- return if we're at the end of the input */ else if (state->eof && state->strm.avail_in == 0) { state->past = 1; /* tried to read past end */ break; } /* need output data -- for small len or new stream load up our output buffer */ else if (state->how == LOOK || n < (state->size << 1)) { /* get more output, looking for header if required */ if (gz_fetch(state) == -1) return 0; continue; /* no progress yet -- go back to copy above */ /* the copy above assures that we will leave with space in the output buffer, allowing at least one gzungetc() to succeed */ } /* large len -- read directly into user buffer */ else if (state->how == COPY) { /* read directly */ if (gz_load(state, (unsigned char *)buf, n, &n) == -1) return 0; } /* large len -- decompress directly into user buffer */ else { /* state->how == GZIP */ state->strm.avail_out = n; state->strm.next_out = (unsigned char *)buf; if (gz_decomp(state) == -1) return 0; n = state->x.have; state->x.have = 0; } /* update progress */ len -= n; buf = (char *)buf + n; got += n; state->x.pos += n; } while (len); /* return number of bytes read into user buffer */ return got; } /* -- see zlib.h -- */ int ZEXPORT gzread(file, buf, len) gzFile file; voidp buf; unsigned len; { gz_statep state; /* get internal structure */ if (file == NULL) return -1; state = (gz_statep)file; /* check that we're reading and that there's no (serious) error */ if (state->mode != GZ_READ || (state->err != Z_OK && state->err != Z_BUF_ERROR)) return -1; /* since an int is returned, make sure len fits in one, otherwise return with an error (this avoids a flaw in the interface) */ if ((int)len < 0) { gz_error(state, Z_STREAM_ERROR, "request does not fit in an int"); return -1; } /* read len or fewer bytes to buf */ len = gz_read(state, buf, len); /* check for an error */ if (len == 0 && state->err != Z_OK && state->err != Z_BUF_ERROR) return -1; /* return the number of bytes read (this is assured to fit in an int) */ return (int)len; } /* -- see zlib.h -- */ z_size_t ZEXPORT gzfread(buf, size, nitems, file) voidp buf; z_size_t size; z_size_t nitems; gzFile file; { z_size_t len; gz_statep state; /* get internal structure */ if (file == NULL) return 0; state = (gz_statep)file; /* check that we're reading and that there's no (serious) error */ if (state->mode != GZ_READ || (state->err != Z_OK && state->err != Z_BUF_ERROR)) return 0; /* compute bytes to read -- error on overflow */ len = nitems * size; if (size && len / size != nitems) { gz_error(state, Z_STREAM_ERROR, "request does not fit in a size_t"); return 0; } /* read len or fewer bytes to buf, return the number of full items read */ return len ? gz_read(state, buf, len) / size : 0; } /* -- see zlib.h -- */ #ifdef Z_PREFIX_SET # undef z_gzgetc #else # undef gzgetc #endif int ZEXPORT gzgetc(file) gzFile file; { int ret; unsigned char buf[1]; gz_statep state; /* get internal structure */ if (file == NULL) return -1; state = (gz_statep)file; /* check that we're reading and that there's no (serious) error */ if (state->mode != GZ_READ || (state->err != Z_OK && state->err != Z_BUF_ERROR)) return -1; /* try output buffer (no need to check for skip request) */ if (state->x.have) { state->x.have--; state->x.pos++; return *(state->x.next)++; } /* nothing there -- try gz_read() */ ret = gz_read(state, buf, 1); return ret < 1 ? -1 : buf[0]; } int ZEXPORT gzgetc_(file) gzFile file; { return gzgetc(file); } /* -- see zlib.h -- */ int ZEXPORT gzungetc(c, file) int c; gzFile file; { gz_statep state; /* get internal structure */ if (file == NULL) return -1; state = (gz_statep)file; /* check that we're reading and that there's no (serious) error */ if (state->mode != GZ_READ || (state->err != Z_OK && state->err != Z_BUF_ERROR)) return -1; /* process a skip request */ if (state->seek) { state->seek = 0; if (gz_skip(state, state->skip) == -1) return -1; } /* can't push EOF */ if (c < 0) return -1; /* if output buffer empty, put byte at end (allows more pushing) */ if (state->x.have == 0) { state->x.have = 1; state->x.next = state->out + (state->size << 1) - 1; state->x.next[0] = (unsigned char)c; state->x.pos--; state->past = 0; return c; } /* if no room, give up (must have already done a gzungetc()) */ if (state->x.have == (state->size << 1)) { gz_error(state, Z_DATA_ERROR, "out of room to push characters"); return -1; } /* slide output data if needed and insert byte before existing data */ if (state->x.next == state->out) { unsigned char *src = state->out + state->x.have; unsigned char *dest = state->out + (state->size << 1); while (src > state->out) *--dest = *--src; state->x.next = dest; } state->x.have++; state->x.next--; state->x.next[0] = (unsigned char)c; state->x.pos--; state->past = 0; return c; } /* -- see zlib.h -- */ char * ZEXPORT gzgets(file, buf, len) gzFile file; char *buf; int len; { unsigned left, n; char *str; unsigned char *eol; gz_statep state; /* check parameters and get internal structure */ if (file == NULL || buf == NULL || len < 1) return NULL; state = (gz_statep)file; /* check that we're reading and that there's no (serious) error */ if (state->mode != GZ_READ || (state->err != Z_OK && state->err != Z_BUF_ERROR)) return NULL; /* process a skip request */ if (state->seek) { state->seek = 0; if (gz_skip(state, state->skip) == -1) return NULL; } /* copy output bytes up to new line or len - 1, whichever comes first -- append a terminating zero to the string (we don't check for a zero in the contents, let the user worry about that) */ str = buf; left = (unsigned)len - 1; if (left) do { /* assure that something is in the output buffer */ if (state->x.have == 0 && gz_fetch(state) == -1) return NULL; /* error */ if (state->x.have == 0) { /* end of file */ state->past = 1; /* read past end */ break; /* return what we have */ } /* look for end-of-line in current output buffer */ n = state->x.have > left ? left : state->x.have; eol = (unsigned char *)memchr(state->x.next, '\n', n); if (eol != NULL) n = (unsigned)(eol - state->x.next) + 1; /* copy through end-of-line, or remainder if not found */ memcpy(buf, state->x.next, n); state->x.have -= n; state->x.next += n; state->x.pos += n; left -= n; buf += n; } while (left && eol == NULL); /* return terminated string, or if nothing, end of file */ if (buf == str) return NULL; buf[0] = 0; return str; } /* -- see zlib.h -- */ int ZEXPORT gzdirect(file) gzFile file; { gz_statep state; /* get internal structure */ if (file == NULL) return 0; state = (gz_statep)file; /* if the state is not known, but we can find out, then do so (this is mainly for right after a gzopen() or gzdopen()) */ if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0) (void)gz_look(state); /* return 1 if transparent, 0 if processing a gzip stream */ return state->direct; } /* -- see zlib.h -- */ int ZEXPORT gzclose_r(file) gzFile file; { int ret, err; gz_statep state; /* get internal structure */ if (file == NULL) return Z_STREAM_ERROR; state = (gz_statep)file; /* check that we're reading */ if (state->mode != GZ_READ) return Z_STREAM_ERROR; /* free memory and close file */ if (state->size) { inflateEnd(&(state->strm)); free(state->out); free(state->in); } err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK; gz_error(state, Z_OK, NULL); free(state->path); ret = close(state->fd); free(state); return ret ? Z_ERRNO : err; } gtkwave-3.3.86/src/libz/zutil.h0000664000175000017500000001572713166335473015667 0ustar bybellbybell/* zutil.h -- internal interface and configuration of the compression library * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* @(#) $Id$ */ #ifndef ZUTIL_H #define ZUTIL_H #ifdef HAVE_HIDDEN # define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) #else # define ZLIB_INTERNAL #endif #include "zlib.h" #if defined(STDC) && !defined(Z_SOLO) # if !(defined(_WIN32_WCE) && defined(_MSC_VER)) # include # endif # include # include #endif #ifdef Z_SOLO typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ #endif #ifndef local # define local static #endif /* since "static" is used to mean two completely different things in C, we define "local" for the non-static meaning of "static", for readability (compile with -Dlocal if your debugger can't find static symbols) */ typedef unsigned char uch; typedef uch FAR uchf; typedef unsigned short ush; typedef ush FAR ushf; typedef unsigned long ulg; extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* (size given to avoid silly warnings with Visual C++) */ #define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] #define ERR_RETURN(strm,err) \ return (strm->msg = ERR_MSG(err), (err)) /* To be used only when the state is known to be valid */ /* common constants */ #ifndef DEF_WBITS # define DEF_WBITS MAX_WBITS #endif /* default windowBits for decompression. MAX_WBITS is for compression only */ #if MAX_MEM_LEVEL >= 8 # define DEF_MEM_LEVEL 8 #else # define DEF_MEM_LEVEL MAX_MEM_LEVEL #endif /* default memLevel */ #define STORED_BLOCK 0 #define STATIC_TREES 1 #define DYN_TREES 2 /* The three kinds of block type */ #define MIN_MATCH 3 #define MAX_MATCH 258 /* The minimum and maximum match lengths */ #define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ /* target dependencies */ #if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) # define OS_CODE 0x00 # ifndef Z_SOLO # if defined(__TURBOC__) || defined(__BORLANDC__) # if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) /* Allow compilation with ANSI keywords only enabled */ void _Cdecl farfree( void *block ); void *_Cdecl farmalloc( unsigned long nbytes ); # else # include # endif # else /* MSC or DJGPP */ # include # endif # endif #endif #ifdef AMIGA # define OS_CODE 1 #endif #if defined(VAXC) || defined(VMS) # define OS_CODE 2 # define F_OPEN(name, mode) \ fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") #endif #ifdef __370__ # if __TARGET_LIB__ < 0x20000000 # define OS_CODE 4 # elif __TARGET_LIB__ < 0x40000000 # define OS_CODE 11 # else # define OS_CODE 8 # endif #endif #if defined(ATARI) || defined(atarist) # define OS_CODE 5 #endif #ifdef OS2 # define OS_CODE 6 # if defined(M_I86) && !defined(Z_SOLO) # include # endif #endif #if defined(MACOS) || defined(TARGET_OS_MAC) # define OS_CODE 7 # ifndef Z_SOLO # if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os # include /* for fdopen */ # else # ifndef fdopen # define fdopen(fd,mode) NULL /* No fdopen() */ # endif # endif # endif #endif #ifdef __acorn # define OS_CODE 13 #endif #if defined(WIN32) && !defined(__CYGWIN__) # define OS_CODE 10 #endif #ifdef _BEOS_ # define OS_CODE 16 #endif #ifdef __TOS_OS400__ # define OS_CODE 18 #endif #ifdef __APPLE__ # define OS_CODE 19 #endif #if defined(_BEOS_) || defined(RISCOS) # define fdopen(fd,mode) NULL /* No fdopen() */ #endif #if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX # if defined(_WIN32_WCE) # define fdopen(fd,mode) NULL /* No fdopen() */ # ifndef _PTRDIFF_T_DEFINED typedef int ptrdiff_t; # define _PTRDIFF_T_DEFINED # endif # else # define fdopen(fd,type) _fdopen(fd,type) # endif #endif #if defined(__BORLANDC__) && !defined(MSDOS) #pragma warn -8004 #pragma warn -8008 #pragma warn -8066 #endif /* provide prototypes for these when building zlib without LFS */ #if !defined(_WIN32) && \ (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); #endif /* common defaults */ #ifndef OS_CODE # define OS_CODE 3 /* assume Unix */ #endif #ifndef F_OPEN # define F_OPEN(name, mode) fopen((name), (mode)) #endif /* functions */ #if defined(pyr) || defined(Z_SOLO) # define NO_MEMCPY #endif #if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) /* Use our own functions for small and medium model with MSC <= 5.0. * You may have to use the same strategy for Borland C (untested). * The __SC__ check is for Symantec. */ # define NO_MEMCPY #endif #if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) # define HAVE_MEMCPY #endif #ifdef HAVE_MEMCPY # ifdef SMALL_MEDIUM /* MSDOS small or medium model */ # define zmemcpy _fmemcpy # define zmemcmp _fmemcmp # define zmemzero(dest, len) _fmemset(dest, 0, len) # else # define zmemcpy memcpy # define zmemcmp memcmp # define zmemzero(dest, len) memset(dest, 0, len) # endif #else void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); #endif /* Diagnostic functions */ #ifdef ZLIB_DEBUG # include extern int ZLIB_INTERNAL z_verbose; extern void ZLIB_INTERNAL z_error OF((char *m)); # define Assert(cond,msg) {if(!(cond)) z_error(msg);} # define Trace(x) {if (z_verbose>=0) fprintf x ;} # define Tracev(x) {if (z_verbose>0) fprintf x ;} # define Tracevv(x) {if (z_verbose>1) fprintf x ;} # define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} # define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} #else # define Assert(cond,msg) # define Trace(x) # define Tracev(x) # define Tracevv(x) # define Tracec(c,x) # define Tracecv(c,x) #endif #ifndef Z_SOLO voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, unsigned size)); void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); #endif #define ZALLOC(strm, items, size) \ (*((strm)->zalloc))((strm)->opaque, (items), (size)) #define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) #define TRY_FREE(s, p) {if (p) ZFREE(s, p);} /* Reverse the bytes in a 32-bit value */ #define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) #endif /* ZUTIL_H */ gtkwave-3.3.86/src/libz/inftrees.c0000664000175000017500000003130713166335473016322 0ustar bybellbybell/* inftrees.c -- generate Huffman trees for efficient decoding * Copyright (C) 1995-2017 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "zutil.h" #include "inftrees.h" #define MAXBITS 15 const char inflate_copyright[] = " inflate 1.2.11 Copyright 1995-2017 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot include such an acknowledgment, I would appreciate that you keep this copyright string in the executable of your product. */ /* Build a set of tables to decode the provided canonical Huffman code. The code lengths are lens[0..codes-1]. The result starts at *table, whose indices are 0..2^bits-1. work is a writable array of at least lens shorts, which is used as a work area. type is the type of code to be generated, CODES, LENS, or DISTS. On return, zero is success, -1 is an invalid code, and +1 means that ENOUGH isn't enough. table on return points to the next available entry's address. bits is the requested root table index bits, and on return it is the actual root table index bits. It will differ if the request is greater than the longest code or if it is less than the shortest code. */ int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) codetype type; unsigned short FAR *lens; unsigned codes; code FAR * FAR *table; unsigned FAR *bits; unsigned short FAR *work; { unsigned len; /* a code's length in bits */ unsigned sym; /* index of code symbols */ unsigned min, max; /* minimum and maximum code lengths */ unsigned root; /* number of index bits for root table */ unsigned curr; /* number of index bits for current table */ unsigned drop; /* code bits to drop for sub-table */ int left; /* number of prefix codes available */ unsigned used; /* code entries in table used */ unsigned huff; /* Huffman code */ unsigned incr; /* for incrementing code, index */ unsigned fill; /* index for replicating entries */ unsigned low; /* low bits for current root entry */ unsigned mask; /* mask for low root bits */ code here; /* table entry for duplication */ code FAR *next; /* next available space in table */ const unsigned short FAR *base; /* base value table to use */ const unsigned short FAR *extra; /* extra bits table to use */ unsigned match; /* use base and extra for symbol >= match */ unsigned short count[MAXBITS+1]; /* number of codes of each length */ unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ static const unsigned short lbase[31] = { /* Length codes 257..285 base */ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 202}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0}; static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64}; /* Process a set of code lengths to create a canonical Huffman code. The code lengths are lens[0..codes-1]. Each length corresponds to the symbols 0..codes-1. The Huffman code is generated by first sorting the symbols by length from short to long, and retaining the symbol order for codes with equal lengths. Then the code starts with all zero bits for the first code of the shortest length, and the codes are integer increments for the same length, and zeros are appended as the length increases. For the deflate format, these bits are stored backwards from their more natural integer increment ordering, and so when the decoding tables are built in the large loop below, the integer codes are incremented backwards. This routine assumes, but does not check, that all of the entries in lens[] are in the range 0..MAXBITS. The caller must assure this. 1..MAXBITS is interpreted as that code length. zero means that that symbol does not occur in this code. The codes are sorted by computing a count of codes for each length, creating from that a table of starting indices for each length in the sorted table, and then entering the symbols in order in the sorted table. The sorted table is work[], with that space being provided by the caller. The length counts are used for other purposes as well, i.e. finding the minimum and maximum length codes, determining if there are any codes at all, checking for a valid set of lengths, and looking ahead at length counts to determine sub-table sizes when building the decoding tables. */ /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ for (len = 0; len <= MAXBITS; len++) count[len] = 0; for (sym = 0; sym < codes; sym++) count[lens[sym]]++; /* bound code lengths, force root to be within code lengths */ root = *bits; for (max = MAXBITS; max >= 1; max--) if (count[max] != 0) break; if (root > max) root = max; if (max == 0) { /* no symbols to code at all */ here.op = (unsigned char)64; /* invalid code marker */ here.bits = (unsigned char)1; here.val = (unsigned short)0; *(*table)++ = here; /* make a table to force an error */ *(*table)++ = here; *bits = 1; return 0; /* no symbols, but wait for decoding to report error */ } for (min = 1; min < max; min++) if (count[min] != 0) break; if (root < min) root = min; /* check for an over-subscribed or incomplete set of lengths */ left = 1; for (len = 1; len <= MAXBITS; len++) { left <<= 1; left -= count[len]; if (left < 0) return -1; /* over-subscribed */ } if (left > 0 && (type == CODES || max != 1)) return -1; /* incomplete set */ /* generate offsets into symbol table for each length for sorting */ offs[1] = 0; for (len = 1; len < MAXBITS; len++) offs[len + 1] = offs[len] + count[len]; /* sort symbols by length, by symbol order within each length */ for (sym = 0; sym < codes; sym++) if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; /* Create and fill in decoding tables. In this loop, the table being filled is at next and has curr index bits. The code being used is huff with length len. That code is converted to an index by dropping drop bits off of the bottom. For codes where len is less than drop + curr, those top drop + curr - len bits are incremented through all values to fill the table with replicated entries. root is the number of index bits for the root table. When len exceeds root, sub-tables are created pointed to by the root entry with an index of the low root bits of huff. This is saved in low to check for when a new sub-table should be started. drop is zero when the root table is being filled, and drop is root when sub-tables are being filled. When a new sub-table is needed, it is necessary to look ahead in the code lengths to determine what size sub-table is needed. The length counts are used for this, and so count[] is decremented as codes are entered in the tables. used keeps track of how many table entries have been allocated from the provided *table space. It is checked for LENS and DIST tables against the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in the initial root table size constants. See the comments in inftrees.h for more information. sym increments through all symbols, and the loop terminates when all codes of length max, i.e. all codes, have been processed. This routine permits incomplete codes, so another loop after this one fills in the rest of the decoding tables with invalid code markers. */ /* set up for code type */ switch (type) { case CODES: base = extra = work; /* dummy value--not used */ match = 20; break; case LENS: base = lbase; extra = lext; match = 257; break; default: /* DISTS */ base = dbase; extra = dext; match = 0; } /* initialize state for loop */ huff = 0; /* starting code */ sym = 0; /* starting code symbol */ len = min; /* starting code length */ next = *table; /* current table to fill in */ curr = root; /* current table index bits */ drop = 0; /* current bits to drop from code for index */ low = (unsigned)(-1); /* trigger new sub-table when len > root */ used = 1U << root; /* use root table entries */ mask = used - 1; /* mask for comparing low */ /* check available table space */ if ((type == LENS && used > ENOUGH_LENS) || (type == DISTS && used > ENOUGH_DISTS)) return 1; /* process all codes and make table entries */ for (;;) { /* create table entry */ here.bits = (unsigned char)(len - drop); if (work[sym] + 1U < match) { here.op = (unsigned char)0; here.val = work[sym]; } else if (work[sym] >= match) { here.op = (unsigned char)(extra[work[sym] - match]); here.val = base[work[sym] - match]; } else { here.op = (unsigned char)(32 + 64); /* end of block */ here.val = 0; } /* replicate for those indices with low len bits equal to huff */ incr = 1U << (len - drop); fill = 1U << curr; min = fill; /* save offset to next table */ do { fill -= incr; next[(huff >> drop) + fill] = here; } while (fill != 0); /* backwards increment the len-bit code huff */ incr = 1U << (len - 1); while (huff & incr) incr >>= 1; if (incr != 0) { huff &= incr - 1; huff += incr; } else huff = 0; /* go to next symbol, update count, len */ sym++; if (--(count[len]) == 0) { if (len == max) break; len = lens[work[sym]]; } /* create new sub-table if needed */ if (len > root && (huff & mask) != low) { /* if first time, transition to sub-tables */ if (drop == 0) drop = root; /* increment past last table */ next += min; /* here min is 1 << curr */ /* determine length of next table */ curr = len - drop; left = (int)(1 << curr); while (curr + drop < max) { left -= count[curr + drop]; if (left <= 0) break; curr++; left <<= 1; } /* check for enough space */ used += 1U << curr; if ((type == LENS && used > ENOUGH_LENS) || (type == DISTS && used > ENOUGH_DISTS)) return 1; /* point entry in root table to sub-table */ low = huff & mask; (*table)[low].op = (unsigned char)curr; (*table)[low].bits = (unsigned char)root; (*table)[low].val = (unsigned short)(next - *table); } } /* fill in remaining table entry if code is incomplete (guaranteed to have at most one remaining entry, since if the code is incomplete, the maximum code length that was allowed to get this far is one bit) */ if (huff != 0) { here.op = (unsigned char)64; /* invalid code marker */ here.bits = (unsigned char)(len - drop); here.val = (unsigned short)0; next[huff] = here; } /* set return parameters */ *table += used; *bits = root; return 0; } gtkwave-3.3.86/src/libz/crc32.h0000664000175000017500000007354213166335473015433 0ustar bybellbybell/* crc32.h -- tables for rapid CRC calculation * Generated automatically by crc32.c */ local const z_crc_t FAR crc_table[TBLS][256] = { { 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, 0x2d02ef8dUL #ifdef BYFOUR }, { 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, 0x9324fd72UL }, { 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, 0xbe9834edUL }, { 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, 0xde0506f1UL }, { 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, 0x8def022dUL }, { 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, 0x72fd2493UL }, { 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, 0xed3498beUL }, { 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, 0xf10605deUL #endif } }; gtkwave-3.3.86/src/libz/inflate.c0000664000175000017500000015302013166335473016122 0ustar bybellbybell/* inflate.c -- zlib decompression * Copyright (C) 1995-2016 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* * Change history: * * 1.2.beta0 24 Nov 2002 * - First version -- complete rewrite of inflate to simplify code, avoid * creation of window when not needed, minimize use of window when it is * needed, make inffast.c even faster, implement gzip decoding, and to * improve code readability and style over the previous zlib inflate code * * 1.2.beta1 25 Nov 2002 * - Use pointers for available input and output checking in inffast.c * - Remove input and output counters in inffast.c * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 * - Remove unnecessary second byte pull from length extra in inffast.c * - Unroll direct copy to three copies per loop in inffast.c * * 1.2.beta2 4 Dec 2002 * - Change external routine names to reduce potential conflicts * - Correct filename to inffixed.h for fixed tables in inflate.c * - Make hbuf[] unsigned char to match parameter type in inflate.c * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) * to avoid negation problem on Alphas (64 bit) in inflate.c * * 1.2.beta3 22 Dec 2002 * - Add comments on state->bits assertion in inffast.c * - Add comments on op field in inftrees.h * - Fix bug in reuse of allocated window after inflateReset() * - Remove bit fields--back to byte structure for speed * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths * - Change post-increments to pre-increments in inflate_fast(), PPC biased? * - Add compile time option, POSTINC, to use post-increments instead (Intel?) * - Make MATCH copy in inflate() much faster for when inflate_fast() not used * - Use local copies of stream next and avail values, as well as local bit * buffer and bit count in inflate()--for speed when inflate_fast() not used * * 1.2.beta4 1 Jan 2003 * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings * - Move a comment on output buffer sizes from inffast.c to inflate.c * - Add comments in inffast.c to introduce the inflate_fast() routine * - Rearrange window copies in inflate_fast() for speed and simplification * - Unroll last copy for window match in inflate_fast() * - Use local copies of window variables in inflate_fast() for speed * - Pull out common wnext == 0 case for speed in inflate_fast() * - Make op and len in inflate_fast() unsigned for consistency * - Add FAR to lcode and dcode declarations in inflate_fast() * - Simplified bad distance check in inflate_fast() * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new * source file infback.c to provide a call-back interface to inflate for * programs like gzip and unzip -- uses window as output buffer to avoid * window copying * * 1.2.beta5 1 Jan 2003 * - Improved inflateBack() interface to allow the caller to provide initial * input in strm. * - Fixed stored blocks bug in inflateBack() * * 1.2.beta6 4 Jan 2003 * - Added comments in inffast.c on effectiveness of POSTINC * - Typecasting all around to reduce compiler warnings * - Changed loops from while (1) or do {} while (1) to for (;;), again to * make compilers happy * - Changed type of window in inflateBackInit() to unsigned char * * * 1.2.beta7 27 Jan 2003 * - Changed many types to unsigned or unsigned short to avoid warnings * - Added inflateCopy() function * * 1.2.0 9 Mar 2003 * - Changed inflateBack() interface to provide separate opaque descriptors * for the in() and out() functions * - Changed inflateBack() argument and in_func typedef to swap the length * and buffer address return values for the input function * - Check next_in and next_out for Z_NULL on entry to inflate() * * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. */ #include "zutil.h" #include "inftrees.h" #include "inflate.h" #include "inffast.h" #ifdef MAKEFIXED # ifndef BUILDFIXED # define BUILDFIXED # endif #endif /* function prototypes */ local int inflateStateCheck OF((z_streamp strm)); local void fixedtables OF((struct inflate_state FAR *state)); local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, unsigned copy)); #ifdef BUILDFIXED void makefixed OF((void)); #endif local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, unsigned len)); local int inflateStateCheck(strm) z_streamp strm; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) return 1; state = (struct inflate_state FAR *)strm->state; if (state == Z_NULL || state->strm != strm || state->mode < HEAD || state->mode > SYNC) return 1; return 0; } int ZEXPORT inflateResetKeep(strm) z_streamp strm; { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; strm->total_in = strm->total_out = state->total = 0; strm->msg = Z_NULL; if (state->wrap) /* to support ill-conceived Java test suite */ strm->adler = state->wrap & 1; state->mode = HEAD; state->last = 0; state->havedict = 0; state->dmax = 32768U; state->head = Z_NULL; state->hold = 0; state->bits = 0; state->lencode = state->distcode = state->next = state->codes; state->sane = 1; state->back = -1; Tracev((stderr, "inflate: reset\n")); return Z_OK; } int ZEXPORT inflateReset(strm) z_streamp strm; { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; state->wsize = 0; state->whave = 0; state->wnext = 0; return inflateResetKeep(strm); } int ZEXPORT inflateReset2(strm, windowBits) z_streamp strm; int windowBits; { int wrap; struct inflate_state FAR *state; /* get the state */ if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; /* extract wrap request from windowBits parameter */ if (windowBits < 0) { wrap = 0; windowBits = -windowBits; } else { wrap = (windowBits >> 4) + 5; #ifdef GUNZIP if (windowBits < 48) windowBits &= 15; #endif } /* set number of window bits, free window if different */ if (windowBits && (windowBits < 8 || windowBits > 15)) return Z_STREAM_ERROR; if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { ZFREE(strm, state->window); state->window = Z_NULL; } /* update state and reset the rest of it */ state->wrap = wrap; state->wbits = (unsigned)windowBits; return inflateReset(strm); } int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) z_streamp strm; int windowBits; const char *version; int stream_size; { int ret; struct inflate_state FAR *state; if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || stream_size != (int)(sizeof(z_stream))) return Z_VERSION_ERROR; if (strm == Z_NULL) return Z_STREAM_ERROR; strm->msg = Z_NULL; /* in case we return an error */ if (strm->zalloc == (alloc_func)0) { #ifdef Z_SOLO return Z_STREAM_ERROR; #else strm->zalloc = zcalloc; strm->opaque = (voidpf)0; #endif } if (strm->zfree == (free_func)0) #ifdef Z_SOLO return Z_STREAM_ERROR; #else strm->zfree = zcfree; #endif state = (struct inflate_state FAR *) ZALLOC(strm, 1, sizeof(struct inflate_state)); if (state == Z_NULL) return Z_MEM_ERROR; Tracev((stderr, "inflate: allocated\n")); strm->state = (struct internal_state FAR *)state; state->strm = strm; state->window = Z_NULL; state->mode = HEAD; /* to pass state test in inflateReset2() */ ret = inflateReset2(strm, windowBits); if (ret != Z_OK) { ZFREE(strm, state); strm->state = Z_NULL; } return ret; } int ZEXPORT inflateInit_(strm, version, stream_size) z_streamp strm; const char *version; int stream_size; { return inflateInit2_(strm, DEF_WBITS, version, stream_size); } int ZEXPORT inflatePrime(strm, bits, value) z_streamp strm; int bits; int value; { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (bits < 0) { state->hold = 0; state->bits = 0; return Z_OK; } if (bits > 16 || state->bits + (uInt)bits > 32) return Z_STREAM_ERROR; value &= (1L << bits) - 1; state->hold += (unsigned)value << state->bits; state->bits += (uInt)bits; return Z_OK; } /* Return state with length and distance decoding tables and index sizes set to fixed code decoding. Normally this returns fixed tables from inffixed.h. If BUILDFIXED is defined, then instead this routine builds the tables the first time it's called, and returns those tables the first time and thereafter. This reduces the size of the code by about 2K bytes, in exchange for a little execution time. However, BUILDFIXED should not be used for threaded applications, since the rewriting of the tables and virgin may not be thread-safe. */ local void fixedtables(state) struct inflate_state FAR *state; { #ifdef BUILDFIXED static int virgin = 1; static code *lenfix, *distfix; static code fixed[544]; /* build fixed huffman tables if first call (may not be thread safe) */ if (virgin) { unsigned sym, bits; static code *next; /* literal/length table */ sym = 0; while (sym < 144) state->lens[sym++] = 8; while (sym < 256) state->lens[sym++] = 9; while (sym < 280) state->lens[sym++] = 7; while (sym < 288) state->lens[sym++] = 8; next = fixed; lenfix = next; bits = 9; inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); /* distance table */ sym = 0; while (sym < 32) state->lens[sym++] = 5; distfix = next; bits = 5; inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); /* do this just once */ virgin = 0; } #else /* !BUILDFIXED */ # include "inffixed.h" #endif /* BUILDFIXED */ state->lencode = lenfix; state->lenbits = 9; state->distcode = distfix; state->distbits = 5; } #ifdef MAKEFIXED #include /* Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also defines BUILDFIXED, so the tables are built on the fly. makefixed() writes those tables to stdout, which would be piped to inffixed.h. A small program can simply call makefixed to do this: void makefixed(void); int main(void) { makefixed(); return 0; } Then that can be linked with zlib built with MAKEFIXED defined and run: a.out > inffixed.h */ void makefixed() { unsigned low, size; struct inflate_state state; fixedtables(&state); puts(" /* inffixed.h -- table for decoding fixed codes"); puts(" * Generated automatically by makefixed()."); puts(" */"); puts(""); puts(" /* WARNING: this file should *not* be used by applications."); puts(" It is part of the implementation of this library and is"); puts(" subject to change. Applications should only use zlib.h."); puts(" */"); puts(""); size = 1U << 9; printf(" static const code lenfix[%u] = {", size); low = 0; for (;;) { if ((low % 7) == 0) printf("\n "); printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, state.lencode[low].bits, state.lencode[low].val); if (++low == size) break; putchar(','); } puts("\n };"); size = 1U << 5; printf("\n static const code distfix[%u] = {", size); low = 0; for (;;) { if ((low % 6) == 0) printf("\n "); printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, state.distcode[low].val); if (++low == size) break; putchar(','); } puts("\n };"); } #endif /* MAKEFIXED */ /* Update the window with the last wsize (normally 32K) bytes written before returning. If window does not exist yet, create it. This is only called when a window is already in use, or when output has been written during this inflate call, but the end of the deflate stream has not been reached yet. It is also called to create a window for dictionary data when a dictionary is loaded. Providing output buffers larger than 32K to inflate() should provide a speed advantage, since only the last 32K of output is copied to the sliding window upon return from inflate(), and since all distances after the first 32K of output will fall in the output data, making match copies simpler and faster. The advantage may be dependent on the size of the processor's data caches. */ local int updatewindow(strm, end, copy) z_streamp strm; const Bytef *end; unsigned copy; { struct inflate_state FAR *state; unsigned dist; state = (struct inflate_state FAR *)strm->state; /* if it hasn't been done already, allocate space for the window */ if (state->window == Z_NULL) { state->window = (unsigned char FAR *) ZALLOC(strm, 1U << state->wbits, sizeof(unsigned char)); if (state->window == Z_NULL) return 1; } /* if window not in use yet, initialize */ if (state->wsize == 0) { state->wsize = 1U << state->wbits; state->wnext = 0; state->whave = 0; } /* copy state->wsize or less output bytes into the circular window */ if (copy >= state->wsize) { zmemcpy(state->window, end - state->wsize, state->wsize); state->wnext = 0; state->whave = state->wsize; } else { dist = state->wsize - state->wnext; if (dist > copy) dist = copy; zmemcpy(state->window + state->wnext, end - copy, dist); copy -= dist; if (copy) { zmemcpy(state->window, end - copy, copy); state->wnext = copy; state->whave = state->wsize; } else { state->wnext += dist; if (state->wnext == state->wsize) state->wnext = 0; if (state->whave < state->wsize) state->whave += dist; } } return 0; } /* Macros for inflate(): */ /* check function to use adler32() for zlib or crc32() for gzip */ #ifdef GUNZIP # define UPDATE(check, buf, len) \ (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) #else # define UPDATE(check, buf, len) adler32(check, buf, len) #endif /* check macros for header crc */ #ifdef GUNZIP # define CRC2(check, word) \ do { \ hbuf[0] = (unsigned char)(word); \ hbuf[1] = (unsigned char)((word) >> 8); \ check = crc32(check, hbuf, 2); \ } while (0) # define CRC4(check, word) \ do { \ hbuf[0] = (unsigned char)(word); \ hbuf[1] = (unsigned char)((word) >> 8); \ hbuf[2] = (unsigned char)((word) >> 16); \ hbuf[3] = (unsigned char)((word) >> 24); \ check = crc32(check, hbuf, 4); \ } while (0) #endif /* Load registers with state in inflate() for speed */ #define LOAD() \ do { \ put = strm->next_out; \ left = strm->avail_out; \ next = strm->next_in; \ have = strm->avail_in; \ hold = state->hold; \ bits = state->bits; \ } while (0) /* Restore state from registers in inflate() */ #define RESTORE() \ do { \ strm->next_out = put; \ strm->avail_out = left; \ strm->next_in = next; \ strm->avail_in = have; \ state->hold = hold; \ state->bits = bits; \ } while (0) /* Clear the input bit accumulator */ #define INITBITS() \ do { \ hold = 0; \ bits = 0; \ } while (0) /* Get a byte of input into the bit accumulator, or return from inflate() if there is no input available. */ #define PULLBYTE() \ do { \ if (have == 0) goto inf_leave; \ have--; \ hold += (unsigned long)(*next++) << bits; \ bits += 8; \ } while (0) /* Assure that there are at least n bits in the bit accumulator. If there is not enough available input to do that, then return from inflate(). */ #define NEEDBITS(n) \ do { \ while (bits < (unsigned)(n)) \ PULLBYTE(); \ } while (0) /* Return the low n bits of the bit accumulator (n < 16) */ #define BITS(n) \ ((unsigned)hold & ((1U << (n)) - 1)) /* Remove n bits from the bit accumulator */ #define DROPBITS(n) \ do { \ hold >>= (n); \ bits -= (unsigned)(n); \ } while (0) /* Remove zero to seven bits as needed to go to a byte boundary */ #define BYTEBITS() \ do { \ hold >>= bits & 7; \ bits -= bits & 7; \ } while (0) /* inflate() uses a state machine to process as much input data and generate as much output data as possible before returning. The state machine is structured roughly as follows: for (;;) switch (state) { ... case STATEn: if (not enough input data or output space to make progress) return; ... make progress ... state = STATEm; break; ... } so when inflate() is called again, the same case is attempted again, and if the appropriate resources are provided, the machine proceeds to the next state. The NEEDBITS() macro is usually the way the state evaluates whether it can proceed or should return. NEEDBITS() does the return if the requested bits are not available. The typical use of the BITS macros is: NEEDBITS(n); ... do something with BITS(n) ... DROPBITS(n); where NEEDBITS(n) either returns from inflate() if there isn't enough input left to load n bits into the accumulator, or it continues. BITS(n) gives the low n bits in the accumulator. When done, DROPBITS(n) drops the low n bits off the accumulator. INITBITS() clears the accumulator and sets the number of available bits to zero. BYTEBITS() discards just enough bits to put the accumulator on a byte boundary. After BYTEBITS() and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return if there is no input available. The decoding of variable length codes uses PULLBYTE() directly in order to pull just enough bytes to decode the next code, and no more. Some states loop until they get enough input, making sure that enough state information is maintained to continue the loop where it left off if NEEDBITS() returns in the loop. For example, want, need, and keep would all have to actually be part of the saved state in case NEEDBITS() returns: case STATEw: while (want < need) { NEEDBITS(n); keep[want++] = BITS(n); DROPBITS(n); } state = STATEx; case STATEx: As shown above, if the next state is also the next case, then the break is omitted. A state may also return if there is not enough output space available to complete that state. Those states are copying stored data, writing a literal byte, and copying a matching string. When returning, a "goto inf_leave" is used to update the total counters, update the check value, and determine whether any progress has been made during that inflate() call in order to return the proper return code. Progress is defined as a change in either strm->avail_in or strm->avail_out. When there is a window, goto inf_leave will update the window with the last output written. If a goto inf_leave occurs in the middle of decompression and there is no window currently, goto inf_leave will create one and copy output to the window for the next call of inflate(). In this implementation, the flush parameter of inflate() only affects the return code (per zlib.h). inflate() always writes as much as possible to strm->next_out, given the space available and the provided input--the effect documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers the allocation of and copying into a sliding window until necessary, which provides the effect documented in zlib.h for Z_FINISH when the entire input stream available. So the only thing the flush parameter actually does is: when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it will return Z_BUF_ERROR if it has not reached the end of the stream. */ int ZEXPORT inflate(strm, flush) z_streamp strm; int flush; { struct inflate_state FAR *state; z_const unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ unsigned have, left; /* available input and output */ unsigned long hold; /* bit buffer */ unsigned bits; /* bits in bit buffer */ unsigned in, out; /* save starting available input and output */ unsigned copy; /* number of stored or match bytes to copy */ unsigned char FAR *from; /* where to copy match bytes from */ code here; /* current decoding table entry */ code last; /* parent table entry */ unsigned len; /* length to copy for repeats, bits to drop */ int ret; /* return code */ #ifdef GUNZIP unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ #endif static const unsigned short order[19] = /* permutation of code lengths */ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; if (inflateStateCheck(strm) || strm->next_out == Z_NULL || (strm->next_in == Z_NULL && strm->avail_in != 0)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ LOAD(); in = have; out = left; ret = Z_OK; for (;;) switch (state->mode) { case HEAD: if (state->wrap == 0) { state->mode = TYPEDO; break; } NEEDBITS(16); #ifdef GUNZIP if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ if (state->wbits == 0) state->wbits = 15; state->check = crc32(0L, Z_NULL, 0); CRC2(state->check, hold); INITBITS(); state->mode = FLAGS; break; } state->flags = 0; /* expect zlib header */ if (state->head != Z_NULL) state->head->done = -1; if (!(state->wrap & 1) || /* check if zlib header allowed */ #else if ( #endif ((BITS(8) << 8) + (hold >> 8)) % 31) { strm->msg = (char *)"incorrect header check"; state->mode = BAD; break; } if (BITS(4) != Z_DEFLATED) { strm->msg = (char *)"unknown compression method"; state->mode = BAD; break; } DROPBITS(4); len = BITS(4) + 8; if (state->wbits == 0) state->wbits = len; if (len > 15 || len > state->wbits) { strm->msg = (char *)"invalid window size"; state->mode = BAD; break; } state->dmax = 1U << len; Tracev((stderr, "inflate: zlib header ok\n")); strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = hold & 0x200 ? DICTID : TYPE; INITBITS(); break; #ifdef GUNZIP case FLAGS: NEEDBITS(16); state->flags = (int)(hold); if ((state->flags & 0xff) != Z_DEFLATED) { strm->msg = (char *)"unknown compression method"; state->mode = BAD; break; } if (state->flags & 0xe000) { strm->msg = (char *)"unknown header flags set"; state->mode = BAD; break; } if (state->head != Z_NULL) state->head->text = (int)((hold >> 8) & 1); if ((state->flags & 0x0200) && (state->wrap & 4)) CRC2(state->check, hold); INITBITS(); state->mode = TIME; case TIME: NEEDBITS(32); if (state->head != Z_NULL) state->head->time = hold; if ((state->flags & 0x0200) && (state->wrap & 4)) CRC4(state->check, hold); INITBITS(); state->mode = OS; case OS: NEEDBITS(16); if (state->head != Z_NULL) { state->head->xflags = (int)(hold & 0xff); state->head->os = (int)(hold >> 8); } if ((state->flags & 0x0200) && (state->wrap & 4)) CRC2(state->check, hold); INITBITS(); state->mode = EXLEN; case EXLEN: if (state->flags & 0x0400) { NEEDBITS(16); state->length = (unsigned)(hold); if (state->head != Z_NULL) state->head->extra_len = (unsigned)hold; if ((state->flags & 0x0200) && (state->wrap & 4)) CRC2(state->check, hold); INITBITS(); } else if (state->head != Z_NULL) state->head->extra = Z_NULL; state->mode = EXTRA; case EXTRA: if (state->flags & 0x0400) { copy = state->length; if (copy > have) copy = have; if (copy) { if (state->head != Z_NULL && state->head->extra != Z_NULL) { len = state->head->extra_len - state->length; zmemcpy(state->head->extra + len, next, len + copy > state->head->extra_max ? state->head->extra_max - len : copy); } if ((state->flags & 0x0200) && (state->wrap & 4)) state->check = crc32(state->check, next, copy); have -= copy; next += copy; state->length -= copy; } if (state->length) goto inf_leave; } state->length = 0; state->mode = NAME; case NAME: if (state->flags & 0x0800) { if (have == 0) goto inf_leave; copy = 0; do { len = (unsigned)(next[copy++]); if (state->head != Z_NULL && state->head->name != Z_NULL && state->length < state->head->name_max) state->head->name[state->length++] = (Bytef)len; } while (len && copy < have); if ((state->flags & 0x0200) && (state->wrap & 4)) state->check = crc32(state->check, next, copy); have -= copy; next += copy; if (len) goto inf_leave; } else if (state->head != Z_NULL) state->head->name = Z_NULL; state->length = 0; state->mode = COMMENT; case COMMENT: if (state->flags & 0x1000) { if (have == 0) goto inf_leave; copy = 0; do { len = (unsigned)(next[copy++]); if (state->head != Z_NULL && state->head->comment != Z_NULL && state->length < state->head->comm_max) state->head->comment[state->length++] = (Bytef)len; } while (len && copy < have); if ((state->flags & 0x0200) && (state->wrap & 4)) state->check = crc32(state->check, next, copy); have -= copy; next += copy; if (len) goto inf_leave; } else if (state->head != Z_NULL) state->head->comment = Z_NULL; state->mode = HCRC; case HCRC: if (state->flags & 0x0200) { NEEDBITS(16); if ((state->wrap & 4) && hold != (state->check & 0xffff)) { strm->msg = (char *)"header crc mismatch"; state->mode = BAD; break; } INITBITS(); } if (state->head != Z_NULL) { state->head->hcrc = (int)((state->flags >> 9) & 1); state->head->done = 1; } strm->adler = state->check = crc32(0L, Z_NULL, 0); state->mode = TYPE; break; #endif case DICTID: NEEDBITS(32); strm->adler = state->check = ZSWAP32(hold); INITBITS(); state->mode = DICT; case DICT: if (state->havedict == 0) { RESTORE(); return Z_NEED_DICT; } strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = TYPE; case TYPE: if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; case TYPEDO: if (state->last) { BYTEBITS(); state->mode = CHECK; break; } NEEDBITS(3); state->last = BITS(1); DROPBITS(1); switch (BITS(2)) { case 0: /* stored block */ Tracev((stderr, "inflate: stored block%s\n", state->last ? " (last)" : "")); state->mode = STORED; break; case 1: /* fixed block */ fixedtables(state); Tracev((stderr, "inflate: fixed codes block%s\n", state->last ? " (last)" : "")); state->mode = LEN_; /* decode codes */ if (flush == Z_TREES) { DROPBITS(2); goto inf_leave; } break; case 2: /* dynamic block */ Tracev((stderr, "inflate: dynamic codes block%s\n", state->last ? " (last)" : "")); state->mode = TABLE; break; case 3: strm->msg = (char *)"invalid block type"; state->mode = BAD; } DROPBITS(2); break; case STORED: BYTEBITS(); /* go to byte boundary */ NEEDBITS(32); if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { strm->msg = (char *)"invalid stored block lengths"; state->mode = BAD; break; } state->length = (unsigned)hold & 0xffff; Tracev((stderr, "inflate: stored length %u\n", state->length)); INITBITS(); state->mode = COPY_; if (flush == Z_TREES) goto inf_leave; case COPY_: state->mode = COPY; case COPY: copy = state->length; if (copy) { if (copy > have) copy = have; if (copy > left) copy = left; if (copy == 0) goto inf_leave; zmemcpy(put, next, copy); have -= copy; next += copy; left -= copy; put += copy; state->length -= copy; break; } Tracev((stderr, "inflate: stored end\n")); state->mode = TYPE; break; case TABLE: NEEDBITS(14); state->nlen = BITS(5) + 257; DROPBITS(5); state->ndist = BITS(5) + 1; DROPBITS(5); state->ncode = BITS(4) + 4; DROPBITS(4); #ifndef PKZIP_BUG_WORKAROUND if (state->nlen > 286 || state->ndist > 30) { strm->msg = (char *)"too many length or distance symbols"; state->mode = BAD; break; } #endif Tracev((stderr, "inflate: table sizes ok\n")); state->have = 0; state->mode = LENLENS; case LENLENS: while (state->have < state->ncode) { NEEDBITS(3); state->lens[order[state->have++]] = (unsigned short)BITS(3); DROPBITS(3); } while (state->have < 19) state->lens[order[state->have++]] = 0; state->next = state->codes; state->lencode = (const code FAR *)(state->next); state->lenbits = 7; ret = inflate_table(CODES, state->lens, 19, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid code lengths set"; state->mode = BAD; break; } Tracev((stderr, "inflate: code lengths ok\n")); state->have = 0; state->mode = CODELENS; case CODELENS: while (state->have < state->nlen + state->ndist) { for (;;) { here = state->lencode[BITS(state->lenbits)]; if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } if (here.val < 16) { DROPBITS(here.bits); state->lens[state->have++] = here.val; } else { if (here.val == 16) { NEEDBITS(here.bits + 2); DROPBITS(here.bits); if (state->have == 0) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } len = state->lens[state->have - 1]; copy = 3 + BITS(2); DROPBITS(2); } else if (here.val == 17) { NEEDBITS(here.bits + 3); DROPBITS(here.bits); len = 0; copy = 3 + BITS(3); DROPBITS(3); } else { NEEDBITS(here.bits + 7); DROPBITS(here.bits); len = 0; copy = 11 + BITS(7); DROPBITS(7); } if (state->have + copy > state->nlen + state->ndist) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } while (copy--) state->lens[state->have++] = (unsigned short)len; } } /* handle error breaks in while */ if (state->mode == BAD) break; /* check for end-of-block code (better have one) */ if (state->lens[256] == 0) { strm->msg = (char *)"invalid code -- missing end-of-block"; state->mode = BAD; break; } /* build code tables -- note: do not change the lenbits or distbits values here (9 and 6) without reading the comments in inftrees.h concerning the ENOUGH constants, which depend on those values */ state->next = state->codes; state->lencode = (const code FAR *)(state->next); state->lenbits = 9; ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid literal/lengths set"; state->mode = BAD; break; } state->distcode = (const code FAR *)(state->next); state->distbits = 6; ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); if (ret) { strm->msg = (char *)"invalid distances set"; state->mode = BAD; break; } Tracev((stderr, "inflate: codes ok\n")); state->mode = LEN_; if (flush == Z_TREES) goto inf_leave; case LEN_: state->mode = LEN; case LEN: if (have >= 6 && left >= 258) { RESTORE(); inflate_fast(strm, out); LOAD(); if (state->mode == TYPE) state->back = -1; break; } state->back = 0; for (;;) { here = state->lencode[BITS(state->lenbits)]; if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } if (here.op && (here.op & 0xf0) == 0) { last = here; for (;;) { here = state->lencode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + here.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); state->back += last.bits; } DROPBITS(here.bits); state->back += here.bits; state->length = (unsigned)here.val; if ((int)(here.op) == 0) { Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", here.val)); state->mode = LIT; break; } if (here.op & 32) { Tracevv((stderr, "inflate: end of block\n")); state->back = -1; state->mode = TYPE; break; } if (here.op & 64) { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } state->extra = (unsigned)(here.op) & 15; state->mode = LENEXT; case LENEXT: if (state->extra) { NEEDBITS(state->extra); state->length += BITS(state->extra); DROPBITS(state->extra); state->back += state->extra; } Tracevv((stderr, "inflate: length %u\n", state->length)); state->was = state->length; state->mode = DIST; case DIST: for (;;) { here = state->distcode[BITS(state->distbits)]; if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } if ((here.op & 0xf0) == 0) { last = here; for (;;) { here = state->distcode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + here.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); state->back += last.bits; } DROPBITS(here.bits); state->back += here.bits; if (here.op & 64) { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } state->offset = (unsigned)here.val; state->extra = (unsigned)(here.op) & 15; state->mode = DISTEXT; case DISTEXT: if (state->extra) { NEEDBITS(state->extra); state->offset += BITS(state->extra); DROPBITS(state->extra); state->back += state->extra; } #ifdef INFLATE_STRICT if (state->offset > state->dmax) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } #endif Tracevv((stderr, "inflate: distance %u\n", state->offset)); state->mode = MATCH; case MATCH: if (left == 0) goto inf_leave; copy = out - left; if (state->offset > copy) { /* copy from window */ copy = state->offset - copy; if (copy > state->whave) { if (state->sane) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR Trace((stderr, "inflate.c too far\n")); copy -= state->whave; if (copy > state->length) copy = state->length; if (copy > left) copy = left; left -= copy; state->length -= copy; do { *put++ = 0; } while (--copy); if (state->length == 0) state->mode = LEN; break; #endif } if (copy > state->wnext) { copy -= state->wnext; from = state->window + (state->wsize - copy); } else from = state->window + (state->wnext - copy); if (copy > state->length) copy = state->length; } else { /* copy from output */ from = put - state->offset; copy = state->length; } if (copy > left) copy = left; left -= copy; state->length -= copy; do { *put++ = *from++; } while (--copy); if (state->length == 0) state->mode = LEN; break; case LIT: if (left == 0) goto inf_leave; *put++ = (unsigned char)(state->length); left--; state->mode = LEN; break; case CHECK: if (state->wrap) { NEEDBITS(32); out -= left; strm->total_out += out; state->total += out; if ((state->wrap & 4) && out) strm->adler = state->check = UPDATE(state->check, put - out, out); out = left; if ((state->wrap & 4) && ( #ifdef GUNZIP state->flags ? hold : #endif ZSWAP32(hold)) != state->check) { strm->msg = (char *)"incorrect data check"; state->mode = BAD; break; } INITBITS(); Tracev((stderr, "inflate: check matches trailer\n")); } #ifdef GUNZIP state->mode = LENGTH; case LENGTH: if (state->wrap && state->flags) { NEEDBITS(32); if (hold != (state->total & 0xffffffffUL)) { strm->msg = (char *)"incorrect length check"; state->mode = BAD; break; } INITBITS(); Tracev((stderr, "inflate: length matches trailer\n")); } #endif state->mode = DONE; case DONE: ret = Z_STREAM_END; goto inf_leave; case BAD: ret = Z_DATA_ERROR; goto inf_leave; case MEM: return Z_MEM_ERROR; case SYNC: default: return Z_STREAM_ERROR; } /* Return from inflate(), updating the total counts and the check value. If there was no progress during the inflate() call, return a buffer error. Call updatewindow() to create and/or update the window state. Note: a memory error from inflate() is non-recoverable. */ inf_leave: RESTORE(); if (state->wsize || (out != strm->avail_out && state->mode < BAD && (state->mode < CHECK || flush != Z_FINISH))) if (updatewindow(strm, strm->next_out, out - strm->avail_out)) { state->mode = MEM; return Z_MEM_ERROR; } in -= strm->avail_in; out -= strm->avail_out; strm->total_in += in; strm->total_out += out; state->total += out; if ((state->wrap & 4) && out) strm->adler = state->check = UPDATE(state->check, strm->next_out - out, out); strm->data_type = (int)state->bits + (state->last ? 64 : 0) + (state->mode == TYPE ? 128 : 0) + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) ret = Z_BUF_ERROR; return ret; } int ZEXPORT inflateEnd(strm) z_streamp strm; { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->window != Z_NULL) ZFREE(strm, state->window); ZFREE(strm, strm->state); strm->state = Z_NULL; Tracev((stderr, "inflate: end\n")); return Z_OK; } int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength) z_streamp strm; Bytef *dictionary; uInt *dictLength; { struct inflate_state FAR *state; /* check state */ if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; /* copy dictionary */ if (state->whave && dictionary != Z_NULL) { zmemcpy(dictionary, state->window + state->wnext, state->whave - state->wnext); zmemcpy(dictionary + state->whave - state->wnext, state->window, state->wnext); } if (dictLength != Z_NULL) *dictLength = state->whave; return Z_OK; } int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) z_streamp strm; const Bytef *dictionary; uInt dictLength; { struct inflate_state FAR *state; unsigned long dictid; int ret; /* check state */ if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->wrap != 0 && state->mode != DICT) return Z_STREAM_ERROR; /* check for correct dictionary identifier */ if (state->mode == DICT) { dictid = adler32(0L, Z_NULL, 0); dictid = adler32(dictid, dictionary, dictLength); if (dictid != state->check) return Z_DATA_ERROR; } /* copy dictionary to window using updatewindow(), which will amend the existing dictionary if appropriate */ ret = updatewindow(strm, dictionary + dictLength, dictLength); if (ret) { state->mode = MEM; return Z_MEM_ERROR; } state->havedict = 1; Tracev((stderr, "inflate: dictionary set\n")); return Z_OK; } int ZEXPORT inflateGetHeader(strm, head) z_streamp strm; gz_headerp head; { struct inflate_state FAR *state; /* check state */ if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; /* save header structure */ state->head = head; head->done = 0; return Z_OK; } /* Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found or when out of input. When called, *have is the number of pattern bytes found in order so far, in 0..3. On return *have is updated to the new state. If on return *have equals four, then the pattern was found and the return value is how many bytes were read including the last byte of the pattern. If *have is less than four, then the pattern has not been found yet and the return value is len. In the latter case, syncsearch() can be called again with more data and the *have state. *have is initialized to zero for the first call. */ local unsigned syncsearch(have, buf, len) unsigned FAR *have; const unsigned char FAR *buf; unsigned len; { unsigned got; unsigned next; got = *have; next = 0; while (next < len && got < 4) { if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) got++; else if (buf[next]) got = 0; else got = 4 - got; next++; } *have = got; return next; } int ZEXPORT inflateSync(strm) z_streamp strm; { unsigned len; /* number of bytes to look at or looked at */ unsigned long in, out; /* temporary to save total_in and total_out */ unsigned char buf[4]; /* to restore bit buffer to byte string */ struct inflate_state FAR *state; /* check parameters */ if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; /* if first time, start search in bit buffer */ if (state->mode != SYNC) { state->mode = SYNC; state->hold <<= state->bits & 7; state->bits -= state->bits & 7; len = 0; while (state->bits >= 8) { buf[len++] = (unsigned char)(state->hold); state->hold >>= 8; state->bits -= 8; } state->have = 0; syncsearch(&(state->have), buf, len); } /* search available input */ len = syncsearch(&(state->have), strm->next_in, strm->avail_in); strm->avail_in -= len; strm->next_in += len; strm->total_in += len; /* return no joy or set up to restart inflate() on a new block */ if (state->have != 4) return Z_DATA_ERROR; in = strm->total_in; out = strm->total_out; inflateReset(strm); strm->total_in = in; strm->total_out = out; state->mode = TYPE; return Z_OK; } /* Returns true if inflate is currently at the end of a block generated by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored block. When decompressing, PPP checks that at the end of input packet, inflate is waiting for these length bytes. */ int ZEXPORT inflateSyncPoint(strm) z_streamp strm; { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; return state->mode == STORED && state->bits == 0; } int ZEXPORT inflateCopy(dest, source) z_streamp dest; z_streamp source; { struct inflate_state FAR *state; struct inflate_state FAR *copy; unsigned char FAR *window; unsigned wsize; /* check input */ if (inflateStateCheck(source) || dest == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)source->state; /* allocate space */ copy = (struct inflate_state FAR *) ZALLOC(source, 1, sizeof(struct inflate_state)); if (copy == Z_NULL) return Z_MEM_ERROR; window = Z_NULL; if (state->window != Z_NULL) { window = (unsigned char FAR *) ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); if (window == Z_NULL) { ZFREE(source, copy); return Z_MEM_ERROR; } } /* copy state */ zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); copy->strm = dest; if (state->lencode >= state->codes && state->lencode <= state->codes + ENOUGH - 1) { copy->lencode = copy->codes + (state->lencode - state->codes); copy->distcode = copy->codes + (state->distcode - state->codes); } copy->next = copy->codes + (state->next - state->codes); if (window != Z_NULL) { wsize = 1U << state->wbits; zmemcpy(window, state->window, wsize); } copy->window = window; dest->state = (struct internal_state FAR *)copy; return Z_OK; } int ZEXPORT inflateUndermine(strm, subvert) z_streamp strm; int subvert; { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR state->sane = !subvert; return Z_OK; #else (void)subvert; state->sane = 1; return Z_DATA_ERROR; #endif } int ZEXPORT inflateValidate(strm, check) z_streamp strm; int check; { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (check) state->wrap |= 4; else state->wrap &= ~4; return Z_OK; } long ZEXPORT inflateMark(strm) z_streamp strm; { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return -(1L << 16); state = (struct inflate_state FAR *)strm->state; return (long)(((unsigned long)((long)state->back)) << 16) + (state->mode == COPY ? state->length : (state->mode == MATCH ? state->was - state->length : 0)); } unsigned long ZEXPORT inflateCodesUsed(strm) z_streamp strm; { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return (unsigned long)-1; state = (struct inflate_state FAR *)strm->state; return (unsigned long)(state->next - state->codes); } gtkwave-3.3.86/src/libz/trees.c0000664000175000017500000012536113166335473015631 0ustar bybellbybell/* trees.c -- output deflated data using Huffman coding * Copyright (C) 1995-2017 Jean-loup Gailly * detect_data_type() function provided freely by Cosmin Truta, 2006 * For conditions of distribution and use, see copyright notice in zlib.h */ /* * ALGORITHM * * The "deflation" process uses several Huffman trees. The more * common source values are represented by shorter bit sequences. * * Each code tree is stored in a compressed form which is itself * a Huffman encoding of the lengths of all the code strings (in * ascending order by source values). The actual code strings are * reconstructed from the lengths in the inflate process, as described * in the deflate specification. * * REFERENCES * * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc * * Storer, James A. * Data Compression: Methods and Theory, pp. 49-50. * Computer Science Press, 1988. ISBN 0-7167-8156-5. * * Sedgewick, R. * Algorithms, p290. * Addison-Wesley, 1983. ISBN 0-201-06672-6. */ /* @(#) $Id$ */ /* #define GEN_TREES_H */ #include "deflate.h" #ifdef ZLIB_DEBUG # include #endif /* =========================================================================== * Constants */ #define MAX_BL_BITS 7 /* Bit length codes must not exceed MAX_BL_BITS bits */ #define END_BLOCK 256 /* end of block literal code */ #define REP_3_6 16 /* repeat previous bit length 3-6 times (2 bits of repeat count) */ #define REPZ_3_10 17 /* repeat a zero length 3-10 times (3 bits of repeat count) */ #define REPZ_11_138 18 /* repeat a zero length 11-138 times (7 bits of repeat count) */ local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; local const int extra_dbits[D_CODES] /* extra bits for each distance code */ = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; local const uch bl_order[BL_CODES] = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; /* The lengths of the bit length codes are sent in order of decreasing * probability, to avoid transmitting the lengths for unused bit length codes. */ /* =========================================================================== * Local data. These are initialized only once. */ #define DIST_CODE_LEN 512 /* see definition of array dist_code below */ #if defined(GEN_TREES_H) || !defined(STDC) /* non ANSI compilers may not accept trees.h */ local ct_data static_ltree[L_CODES+2]; /* The static literal tree. Since the bit lengths are imposed, there is no * need for the L_CODES extra codes used during heap construction. However * The codes 286 and 287 are needed to build a canonical tree (see _tr_init * below). */ local ct_data static_dtree[D_CODES]; /* The static distance tree. (Actually a trivial tree since all codes use * 5 bits.) */ uch _dist_code[DIST_CODE_LEN]; /* Distance codes. The first 256 values correspond to the distances * 3 .. 258, the last 256 values correspond to the top 8 bits of * the 15 bit distances. */ uch _length_code[MAX_MATCH-MIN_MATCH+1]; /* length code for each normalized match length (0 == MIN_MATCH) */ local int base_length[LENGTH_CODES]; /* First normalized length for each code (0 = MIN_MATCH) */ local int base_dist[D_CODES]; /* First normalized distance for each code (0 = distance of 1) */ #else # include "trees.h" #endif /* GEN_TREES_H */ struct static_tree_desc_s { const ct_data *static_tree; /* static tree or NULL */ const intf *extra_bits; /* extra bits for each code or NULL */ int extra_base; /* base index for extra_bits */ int elems; /* max number of elements in the tree */ int max_length; /* max bit length for the codes */ }; local const static_tree_desc static_l_desc = {static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; local const static_tree_desc static_d_desc = {static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; local const static_tree_desc static_bl_desc = {(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; /* =========================================================================== * Local (static) routines in this file. */ local void tr_static_init OF((void)); local void init_block OF((deflate_state *s)); local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); local void build_tree OF((deflate_state *s, tree_desc *desc)); local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); local int build_bl_tree OF((deflate_state *s)); local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, int blcodes)); local void compress_block OF((deflate_state *s, const ct_data *ltree, const ct_data *dtree)); local int detect_data_type OF((deflate_state *s)); local unsigned bi_reverse OF((unsigned value, int length)); local void bi_windup OF((deflate_state *s)); local void bi_flush OF((deflate_state *s)); #ifdef GEN_TREES_H local void gen_trees_header OF((void)); #endif #ifndef ZLIB_DEBUG # define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) /* Send a code of the given tree. c and tree must not have side effects */ #else /* !ZLIB_DEBUG */ # define send_code(s, c, tree) \ { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ send_bits(s, tree[c].Code, tree[c].Len); } #endif /* =========================================================================== * Output a short LSB first on the stream. * IN assertion: there is enough room in pendingBuf. */ #define put_short(s, w) { \ put_byte(s, (uch)((w) & 0xff)); \ put_byte(s, (uch)((ush)(w) >> 8)); \ } /* =========================================================================== * Send a value on a given number of bits. * IN assertion: length <= 16 and value fits in length bits. */ #ifdef ZLIB_DEBUG local void send_bits OF((deflate_state *s, int value, int length)); local void send_bits(s, value, length) deflate_state *s; int value; /* value to send */ int length; /* number of bits */ { Tracevv((stderr," l %2d v %4x ", length, value)); Assert(length > 0 && length <= 15, "invalid length"); s->bits_sent += (ulg)length; /* If not enough room in bi_buf, use (valid) bits from bi_buf and * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) * unused bits in value. */ if (s->bi_valid > (int)Buf_size - length) { s->bi_buf |= (ush)value << s->bi_valid; put_short(s, s->bi_buf); s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); s->bi_valid += length - Buf_size; } else { s->bi_buf |= (ush)value << s->bi_valid; s->bi_valid += length; } } #else /* !ZLIB_DEBUG */ #define send_bits(s, value, length) \ { int len = length;\ if (s->bi_valid > (int)Buf_size - len) {\ int val = (int)value;\ s->bi_buf |= (ush)val << s->bi_valid;\ put_short(s, s->bi_buf);\ s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ s->bi_valid += len - Buf_size;\ } else {\ s->bi_buf |= (ush)(value) << s->bi_valid;\ s->bi_valid += len;\ }\ } #endif /* ZLIB_DEBUG */ /* the arguments must not have side effects */ /* =========================================================================== * Initialize the various 'constant' tables. */ local void tr_static_init() { #if defined(GEN_TREES_H) || !defined(STDC) static int static_init_done = 0; int n; /* iterates over tree elements */ int bits; /* bit counter */ int length; /* length value */ int code; /* code value */ int dist; /* distance index */ ush bl_count[MAX_BITS+1]; /* number of codes at each bit length for an optimal tree */ if (static_init_done) return; /* For some embedded targets, global variables are not initialized: */ #ifdef NO_INIT_GLOBAL_POINTERS static_l_desc.static_tree = static_ltree; static_l_desc.extra_bits = extra_lbits; static_d_desc.static_tree = static_dtree; static_d_desc.extra_bits = extra_dbits; static_bl_desc.extra_bits = extra_blbits; #endif /* Initialize the mapping length (0..255) -> length code (0..28) */ length = 0; for (code = 0; code < LENGTH_CODES-1; code++) { base_length[code] = length; for (n = 0; n < (1< dist code (0..29) */ dist = 0; for (code = 0 ; code < 16; code++) { base_dist[code] = dist; for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ for ( ; code < D_CODES; code++) { base_dist[code] = dist << 7; for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { _dist_code[256 + dist++] = (uch)code; } } Assert (dist == 256, "tr_static_init: 256+dist != 512"); /* Construct the codes of the static literal tree */ for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; n = 0; while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; /* Codes 286 and 287 do not exist, but we must include them in the * tree construction to get a canonical Huffman tree (longest code * all ones) */ gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); /* The static distance tree is trivial: */ for (n = 0; n < D_CODES; n++) { static_dtree[n].Len = 5; static_dtree[n].Code = bi_reverse((unsigned)n, 5); } static_init_done = 1; # ifdef GEN_TREES_H gen_trees_header(); # endif #endif /* defined(GEN_TREES_H) || !defined(STDC) */ } /* =========================================================================== * Genererate the file trees.h describing the static trees. */ #ifdef GEN_TREES_H # ifndef ZLIB_DEBUG # include # endif # define SEPARATOR(i, last, width) \ ((i) == (last)? "\n};\n\n" : \ ((i) % (width) == (width)-1 ? ",\n" : ", ")) void gen_trees_header() { FILE *header = fopen("trees.h", "w"); int i; Assert (header != NULL, "Can't open trees.h"); fprintf(header, "/* header created automatically with -DGEN_TREES_H */\n\n"); fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); for (i = 0; i < L_CODES+2; i++) { fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); } fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); for (i = 0; i < D_CODES; i++) { fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); } fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n"); for (i = 0; i < DIST_CODE_LEN; i++) { fprintf(header, "%2u%s", _dist_code[i], SEPARATOR(i, DIST_CODE_LEN-1, 20)); } fprintf(header, "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { fprintf(header, "%2u%s", _length_code[i], SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); } fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); for (i = 0; i < LENGTH_CODES; i++) { fprintf(header, "%1u%s", base_length[i], SEPARATOR(i, LENGTH_CODES-1, 20)); } fprintf(header, "local const int base_dist[D_CODES] = {\n"); for (i = 0; i < D_CODES; i++) { fprintf(header, "%5u%s", base_dist[i], SEPARATOR(i, D_CODES-1, 10)); } fclose(header); } #endif /* GEN_TREES_H */ /* =========================================================================== * Initialize the tree data structures for a new zlib stream. */ void ZLIB_INTERNAL _tr_init(s) deflate_state *s; { tr_static_init(); s->l_desc.dyn_tree = s->dyn_ltree; s->l_desc.stat_desc = &static_l_desc; s->d_desc.dyn_tree = s->dyn_dtree; s->d_desc.stat_desc = &static_d_desc; s->bl_desc.dyn_tree = s->bl_tree; s->bl_desc.stat_desc = &static_bl_desc; s->bi_buf = 0; s->bi_valid = 0; #ifdef ZLIB_DEBUG s->compressed_len = 0L; s->bits_sent = 0L; #endif /* Initialize the first block of the first file: */ init_block(s); } /* =========================================================================== * Initialize a new block. */ local void init_block(s) deflate_state *s; { int n; /* iterates over tree elements */ /* Initialize the trees. */ for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; s->dyn_ltree[END_BLOCK].Freq = 1; s->opt_len = s->static_len = 0L; s->last_lit = s->matches = 0; } #define SMALLEST 1 /* Index within the heap array of least frequent node in the Huffman tree */ /* =========================================================================== * Remove the smallest element from the heap and recreate the heap with * one less element. Updates heap and heap_len. */ #define pqremove(s, tree, top) \ {\ top = s->heap[SMALLEST]; \ s->heap[SMALLEST] = s->heap[s->heap_len--]; \ pqdownheap(s, tree, SMALLEST); \ } /* =========================================================================== * Compares to subtrees, using the tree depth as tie breaker when * the subtrees have equal frequency. This minimizes the worst case length. */ #define smaller(tree, n, m, depth) \ (tree[n].Freq < tree[m].Freq || \ (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) /* =========================================================================== * Restore the heap property by moving down the tree starting at node k, * exchanging a node with the smallest of its two sons if necessary, stopping * when the heap property is re-established (each father smaller than its * two sons). */ local void pqdownheap(s, tree, k) deflate_state *s; ct_data *tree; /* the tree to restore */ int k; /* node to move down */ { int v = s->heap[k]; int j = k << 1; /* left son of k */ while (j <= s->heap_len) { /* Set j to the smallest of the two sons: */ if (j < s->heap_len && smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { j++; } /* Exit if v is smaller than both sons */ if (smaller(tree, v, s->heap[j], s->depth)) break; /* Exchange v with the smallest son */ s->heap[k] = s->heap[j]; k = j; /* And continue down the tree, setting j to the left son of k */ j <<= 1; } s->heap[k] = v; } /* =========================================================================== * Compute the optimal bit lengths for a tree and update the total bit length * for the current block. * IN assertion: the fields freq and dad are set, heap[heap_max] and * above are the tree nodes sorted by increasing frequency. * OUT assertions: the field len is set to the optimal bit length, the * array bl_count contains the frequencies for each bit length. * The length opt_len is updated; static_len is also updated if stree is * not null. */ local void gen_bitlen(s, desc) deflate_state *s; tree_desc *desc; /* the tree descriptor */ { ct_data *tree = desc->dyn_tree; int max_code = desc->max_code; const ct_data *stree = desc->stat_desc->static_tree; const intf *extra = desc->stat_desc->extra_bits; int base = desc->stat_desc->extra_base; int max_length = desc->stat_desc->max_length; int h; /* heap index */ int n, m; /* iterate over the tree elements */ int bits; /* bit length */ int xbits; /* extra bits */ ush f; /* frequency */ int overflow = 0; /* number of elements with bit length too large */ for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; /* In a first pass, compute the optimal bit lengths (which may * overflow in the case of the bit length tree). */ tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ for (h = s->heap_max+1; h < HEAP_SIZE; h++) { n = s->heap[h]; bits = tree[tree[n].Dad].Len + 1; if (bits > max_length) bits = max_length, overflow++; tree[n].Len = (ush)bits; /* We overwrite tree[n].Dad which is no longer needed */ if (n > max_code) continue; /* not a leaf node */ s->bl_count[bits]++; xbits = 0; if (n >= base) xbits = extra[n-base]; f = tree[n].Freq; s->opt_len += (ulg)f * (unsigned)(bits + xbits); if (stree) s->static_len += (ulg)f * (unsigned)(stree[n].Len + xbits); } if (overflow == 0) return; Tracev((stderr,"\nbit length overflow\n")); /* This happens for example on obj2 and pic of the Calgary corpus */ /* Find the first bit length which could increase: */ do { bits = max_length-1; while (s->bl_count[bits] == 0) bits--; s->bl_count[bits]--; /* move one leaf down the tree */ s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ s->bl_count[max_length]--; /* The brother of the overflow item also moves one step up, * but this does not affect bl_count[max_length] */ overflow -= 2; } while (overflow > 0); /* Now recompute all bit lengths, scanning in increasing frequency. * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all * lengths instead of fixing only the wrong ones. This idea is taken * from 'ar' written by Haruhiko Okumura.) */ for (bits = max_length; bits != 0; bits--) { n = s->bl_count[bits]; while (n != 0) { m = s->heap[--h]; if (m > max_code) continue; if ((unsigned) tree[m].Len != (unsigned) bits) { Tracev((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); s->opt_len += ((ulg)bits - tree[m].Len) * tree[m].Freq; tree[m].Len = (ush)bits; } n--; } } } /* =========================================================================== * Generate the codes for a given tree and bit counts (which need not be * optimal). * IN assertion: the array bl_count contains the bit length statistics for * the given tree and the field len is set for all tree elements. * OUT assertion: the field code is set for all tree elements of non * zero code length. */ local void gen_codes (tree, max_code, bl_count) ct_data *tree; /* the tree to decorate */ int max_code; /* largest code with non zero frequency */ ushf *bl_count; /* number of codes at each bit length */ { ush next_code[MAX_BITS+1]; /* next code value for each bit length */ unsigned code = 0; /* running code value */ int bits; /* bit index */ int n; /* code index */ /* The distribution counts are first used to generate the code values * without bit reversal. */ for (bits = 1; bits <= MAX_BITS; bits++) { code = (code + bl_count[bits-1]) << 1; next_code[bits] = (ush)code; } /* Check that the bit counts in bl_count are consistent. The last code * must be all ones. */ Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; const ct_data *stree = desc->stat_desc->static_tree; int elems = desc->stat_desc->elems; int n, m; /* iterate over heap elements */ int max_code = -1; /* largest code with non zero frequency */ int node; /* new node being created */ /* Construct the initial heap, with least frequent element in * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. * heap[0] is not used. */ s->heap_len = 0, s->heap_max = HEAP_SIZE; for (n = 0; n < elems; n++) { if (tree[n].Freq != 0) { s->heap[++(s->heap_len)] = max_code = n; s->depth[n] = 0; } else { tree[n].Len = 0; } } /* The pkzip format requires that at least one distance code exists, * and that at least one bit should be sent even if there is only one * possible code. So to avoid special checks later on we force at least * two codes of non zero frequency. */ while (s->heap_len < 2) { node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); tree[node].Freq = 1; s->depth[node] = 0; s->opt_len--; if (stree) s->static_len -= stree[node].Len; /* node is 0 or 1 so it does not have extra bits */ } desc->max_code = max_code; /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, * establish sub-heaps of increasing lengths: */ for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); /* Construct the Huffman tree by repeatedly combining the least two * frequent nodes. */ node = elems; /* next internal node of the tree */ do { pqremove(s, tree, n); /* n = node of least frequency */ m = s->heap[SMALLEST]; /* m = node of next least frequency */ s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ s->heap[--(s->heap_max)] = m; /* Create a new node father of n and m */ tree[node].Freq = tree[n].Freq + tree[m].Freq; s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? s->depth[n] : s->depth[m]) + 1); tree[n].Dad = tree[m].Dad = (ush)node; #ifdef DUMP_BL_TREE if (tree == s->bl_tree) { fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); } #endif /* and insert the new node in the heap */ s->heap[SMALLEST] = node++; pqdownheap(s, tree, SMALLEST); } while (s->heap_len >= 2); s->heap[--(s->heap_max)] = s->heap[SMALLEST]; /* At this point, the fields freq and dad are set. We can now * generate the bit lengths. */ gen_bitlen(s, (tree_desc *)desc); /* The field len is now set, we can generate the bit codes */ gen_codes ((ct_data *)tree, max_code, s->bl_count); } /* =========================================================================== * Scan a literal or distance tree to determine the frequencies of the codes * in the bit length tree. */ local void scan_tree (s, tree, max_code) deflate_state *s; ct_data *tree; /* the tree to be scanned */ int max_code; /* and its largest code of non zero frequency */ { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ int nextlen = tree[0].Len; /* length of next code */ int count = 0; /* repeat count of the current code */ int max_count = 7; /* max repeat count */ int min_count = 4; /* min repeat count */ if (nextlen == 0) max_count = 138, min_count = 3; tree[max_code+1].Len = (ush)0xffff; /* guard */ for (n = 0; n <= max_code; n++) { curlen = nextlen; nextlen = tree[n+1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { s->bl_tree[curlen].Freq += count; } else if (curlen != 0) { if (curlen != prevlen) s->bl_tree[curlen].Freq++; s->bl_tree[REP_3_6].Freq++; } else if (count <= 10) { s->bl_tree[REPZ_3_10].Freq++; } else { s->bl_tree[REPZ_11_138].Freq++; } count = 0; prevlen = curlen; if (nextlen == 0) { max_count = 138, min_count = 3; } else if (curlen == nextlen) { max_count = 6, min_count = 3; } else { max_count = 7, min_count = 4; } } } /* =========================================================================== * Send a literal or distance tree in compressed form, using the codes in * bl_tree. */ local void send_tree (s, tree, max_code) deflate_state *s; ct_data *tree; /* the tree to be scanned */ int max_code; /* and its largest code of non zero frequency */ { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ int nextlen = tree[0].Len; /* length of next code */ int count = 0; /* repeat count of the current code */ int max_count = 7; /* max repeat count */ int min_count = 4; /* min repeat count */ /* tree[max_code+1].Len = -1; */ /* guard already set */ if (nextlen == 0) max_count = 138, min_count = 3; for (n = 0; n <= max_code; n++) { curlen = nextlen; nextlen = tree[n+1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { do { send_code(s, curlen, s->bl_tree); } while (--count != 0); } else if (curlen != 0) { if (curlen != prevlen) { send_code(s, curlen, s->bl_tree); count--; } Assert(count >= 3 && count <= 6, " 3_6?"); send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); } else if (count <= 10) { send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); } else { send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); } count = 0; prevlen = curlen; if (nextlen == 0) { max_count = 138, min_count = 3; } else if (curlen == nextlen) { max_count = 6, min_count = 3; } else { max_count = 7, min_count = 4; } } } /* =========================================================================== * Construct the Huffman tree for the bit lengths and return the index in * bl_order of the last bit length code to send. */ local int build_bl_tree(s) deflate_state *s; { int max_blindex; /* index of last bit length code of non zero freq */ /* Determine the bit length frequencies for literal and distance trees */ scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); /* Build the bit length tree: */ build_tree(s, (tree_desc *)(&(s->bl_desc))); /* opt_len now includes the length of the tree representations, except * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. */ /* Determine the number of bit length codes to send. The pkzip format * requires that at least 4 bit length codes be sent. (appnote.txt says * 3 but the actual value used is 4.) */ for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; } /* Update opt_len to include the bit length tree and counts */ s->opt_len += 3*((ulg)max_blindex+1) + 5+5+4; Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", s->opt_len, s->static_len)); return max_blindex; } /* =========================================================================== * Send the header for a block using dynamic Huffman trees: the counts, the * lengths of the bit length codes, the literal tree and the distance tree. * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. */ local void send_all_trees(s, lcodes, dcodes, blcodes) deflate_state *s; int lcodes, dcodes, blcodes; /* number of codes for each tree */ { int rank; /* index in bl_order */ Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, "too many codes"); Tracev((stderr, "\nbl counts: ")); send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ send_bits(s, dcodes-1, 5); send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ for (rank = 0; rank < blcodes; rank++) { Tracev((stderr, "\nbl code %2d ", bl_order[rank])); send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); } Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); } /* =========================================================================== * Send a stored block */ void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) deflate_state *s; charf *buf; /* input block */ ulg stored_len; /* length of input block */ int last; /* one if this is the last block for a file */ { send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ bi_windup(s); /* align on byte boundary */ put_short(s, (ush)stored_len); put_short(s, (ush)~stored_len); zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len); s->pending += stored_len; #ifdef ZLIB_DEBUG s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; s->compressed_len += (stored_len + 4) << 3; s->bits_sent += 2*16; s->bits_sent += stored_len<<3; #endif } /* =========================================================================== * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) */ void ZLIB_INTERNAL _tr_flush_bits(s) deflate_state *s; { bi_flush(s); } /* =========================================================================== * Send one empty static block to give enough lookahead for inflate. * This takes 10 bits, of which 7 may remain in the bit buffer. */ void ZLIB_INTERNAL _tr_align(s) deflate_state *s; { send_bits(s, STATIC_TREES<<1, 3); send_code(s, END_BLOCK, static_ltree); #ifdef ZLIB_DEBUG s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ #endif bi_flush(s); } /* =========================================================================== * Determine the best encoding for the current block: dynamic trees, static * trees or store, and write out the encoded block. */ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) deflate_state *s; charf *buf; /* input block, or NULL if too old */ ulg stored_len; /* length of input block */ int last; /* one if this is the last block for a file */ { ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ int max_blindex = 0; /* index of last bit length code of non zero freq */ /* Build the Huffman trees unless a stored block is forced */ if (s->level > 0) { /* Check if the file is binary or text */ if (s->strm->data_type == Z_UNKNOWN) s->strm->data_type = detect_data_type(s); /* Construct the literal and distance trees */ build_tree(s, (tree_desc *)(&(s->l_desc))); Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, s->static_len)); build_tree(s, (tree_desc *)(&(s->d_desc))); Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, s->static_len)); /* At this point, opt_len and static_len are the total bit lengths of * the compressed block data, excluding the tree representations. */ /* Build the bit length tree for the above two trees, and get the index * in bl_order of the last bit length code to send. */ max_blindex = build_bl_tree(s); /* Determine the best encoding. Compute the block lengths in bytes. */ opt_lenb = (s->opt_len+3+7)>>3; static_lenb = (s->static_len+3+7)>>3; Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, s->last_lit)); if (static_lenb <= opt_lenb) opt_lenb = static_lenb; } else { Assert(buf != (char*)0, "lost buf"); opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ } #ifdef FORCE_STORED if (buf != (char*)0) { /* force stored block */ #else if (stored_len+4 <= opt_lenb && buf != (char*)0) { /* 4: two words for the lengths */ #endif /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. * Otherwise we can't have processed more than WSIZE input bytes since * the last block flush, because compression would have been * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to * transform a block into a stored block. */ _tr_stored_block(s, buf, stored_len, last); #ifdef FORCE_STATIC } else if (static_lenb >= 0) { /* force static trees */ #else } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { #endif send_bits(s, (STATIC_TREES<<1)+last, 3); compress_block(s, (const ct_data *)static_ltree, (const ct_data *)static_dtree); #ifdef ZLIB_DEBUG s->compressed_len += 3 + s->static_len; #endif } else { send_bits(s, (DYN_TREES<<1)+last, 3); send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, max_blindex+1); compress_block(s, (const ct_data *)s->dyn_ltree, (const ct_data *)s->dyn_dtree); #ifdef ZLIB_DEBUG s->compressed_len += 3 + s->opt_len; #endif } Assert (s->compressed_len == s->bits_sent, "bad compressed size"); /* The above check is made mod 2^32, for files larger than 512 MB * and uLong implemented on 32 bits. */ init_block(s); if (last) { bi_windup(s); #ifdef ZLIB_DEBUG s->compressed_len += 7; /* align on byte boundary */ #endif } Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, s->compressed_len-7*last)); } /* =========================================================================== * Save the match info and tally the frequency counts. Return true if * the current block must be flushed. */ int ZLIB_INTERNAL _tr_tally (s, dist, lc) deflate_state *s; unsigned dist; /* distance of matched string */ unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ { s->d_buf[s->last_lit] = (ush)dist; s->l_buf[s->last_lit++] = (uch)lc; if (dist == 0) { /* lc is the unmatched char */ s->dyn_ltree[lc].Freq++; } else { s->matches++; /* Here, lc is the match length - MIN_MATCH */ dist--; /* dist = match distance - 1 */ Assert((ush)dist < (ush)MAX_DIST(s) && (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; s->dyn_dtree[d_code(dist)].Freq++; } #ifdef TRUNCATE_BLOCK /* Try to guess if it is profitable to stop the current block here */ if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { /* Compute an upper bound for the compressed length */ ulg out_length = (ulg)s->last_lit*8L; ulg in_length = (ulg)((long)s->strstart - s->block_start); int dcode; for (dcode = 0; dcode < D_CODES; dcode++) { out_length += (ulg)s->dyn_dtree[dcode].Freq * (5L+extra_dbits[dcode]); } out_length >>= 3; Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", s->last_lit, in_length, out_length, 100L - out_length*100L/in_length)); if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; } #endif return (s->last_lit == s->lit_bufsize-1); /* We avoid equality with lit_bufsize because of wraparound at 64K * on 16 bit machines and because stored blocks are restricted to * 64K-1 bytes. */ } /* =========================================================================== * Send the block data compressed using the given Huffman trees */ local void compress_block(s, ltree, dtree) deflate_state *s; const ct_data *ltree; /* literal tree */ const ct_data *dtree; /* distance tree */ { unsigned dist; /* distance of matched string */ int lc; /* match length or unmatched char (if dist == 0) */ unsigned lx = 0; /* running index in l_buf */ unsigned code; /* the code to send */ int extra; /* number of extra bits to send */ if (s->last_lit != 0) do { dist = s->d_buf[lx]; lc = s->l_buf[lx++]; if (dist == 0) { send_code(s, lc, ltree); /* send a literal byte */ Tracecv(isgraph(lc), (stderr," '%c' ", lc)); } else { /* Here, lc is the match length - MIN_MATCH */ code = _length_code[lc]; send_code(s, code+LITERALS+1, ltree); /* send the length code */ extra = extra_lbits[code]; if (extra != 0) { lc -= base_length[code]; send_bits(s, lc, extra); /* send the extra length bits */ } dist--; /* dist is now the match distance - 1 */ code = d_code(dist); Assert (code < D_CODES, "bad d_code"); send_code(s, code, dtree); /* send the distance code */ extra = extra_dbits[code]; if (extra != 0) { dist -= (unsigned)base_dist[code]; send_bits(s, dist, extra); /* send the extra distance bits */ } } /* literal or match pair ? */ /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, "pendingBuf overflow"); } while (lx < s->last_lit); send_code(s, END_BLOCK, ltree); } /* =========================================================================== * Check if the data type is TEXT or BINARY, using the following algorithm: * - TEXT if the two conditions below are satisfied: * a) There are no non-portable control characters belonging to the * "black list" (0..6, 14..25, 28..31). * b) There is at least one printable character belonging to the * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). * - BINARY otherwise. * - The following partially-portable control characters form a * "gray list" that is ignored in this detection algorithm: * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). * IN assertion: the fields Freq of dyn_ltree are set. */ local int detect_data_type(s) deflate_state *s; { /* black_mask is the bit mask of black-listed bytes * set bits 0..6, 14..25, and 28..31 * 0xf3ffc07f = binary 11110011111111111100000001111111 */ unsigned long black_mask = 0xf3ffc07fUL; int n; /* Check for non-textual ("black-listed") bytes. */ for (n = 0; n <= 31; n++, black_mask >>= 1) if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) return Z_BINARY; /* Check for textual ("white-listed") bytes. */ if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 || s->dyn_ltree[13].Freq != 0) return Z_TEXT; for (n = 32; n < LITERALS; n++) if (s->dyn_ltree[n].Freq != 0) return Z_TEXT; /* There are no "black-listed" or "white-listed" bytes: * this stream either is empty or has tolerated ("gray-listed") bytes only. */ return Z_BINARY; } /* =========================================================================== * Reverse the first len bits of a code, using straightforward code (a faster * method would use a table) * IN assertion: 1 <= len <= 15 */ local unsigned bi_reverse(code, len) unsigned code; /* the value to invert */ int len; /* its bit length */ { register unsigned res = 0; do { res |= code & 1; code >>= 1, res <<= 1; } while (--len > 0); return res >> 1; } /* =========================================================================== * Flush the bit buffer, keeping at most 7 bits in it. */ local void bi_flush(s) deflate_state *s; { if (s->bi_valid == 16) { put_short(s, s->bi_buf); s->bi_buf = 0; s->bi_valid = 0; } else if (s->bi_valid >= 8) { put_byte(s, (Byte)s->bi_buf); s->bi_buf >>= 8; s->bi_valid -= 8; } } /* =========================================================================== * Flush the bit buffer and align the output on a byte boundary */ local void bi_windup(s) deflate_state *s; { if (s->bi_valid > 8) { put_short(s, s->bi_buf); } else if (s->bi_valid > 0) { put_byte(s, (Byte)s->bi_buf); } s->bi_buf = 0; s->bi_valid = 0; #ifdef ZLIB_DEBUG s->bits_sent = (s->bits_sent+7) & ~7; #endif } gtkwave-3.3.86/src/libz/uncompr.c0000664000175000017500000000562613166335473016173 0ustar bybellbybell/* uncompr.c -- decompress a memory buffer * Copyright (C) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #define ZLIB_INTERNAL #include "zlib.h" /* =========================================================================== Decompresses the source buffer into the destination buffer. *sourceLen is the byte length of the source buffer. Upon entry, *destLen is the total size of the destination buffer, which must be large enough to hold the entire uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, *destLen is the size of the decompressed data and *sourceLen is the number of source bytes consumed. Upon return, source + *sourceLen points to the first unused input byte. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, or Z_DATA_ERROR if the input data was corrupted, including if the input data is an incomplete zlib stream. */ int ZEXPORT uncompress2 (dest, destLen, source, sourceLen) Bytef *dest; uLongf *destLen; const Bytef *source; uLong *sourceLen; { z_stream stream; int err; const uInt max = (uInt)-1; uLong len, left; Byte buf[1]; /* for detection of incomplete stream when *destLen == 0 */ len = *sourceLen; if (*destLen) { left = *destLen; *destLen = 0; } else { left = 1; dest = buf; } stream.next_in = (z_const Bytef *)source; stream.avail_in = 0; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; stream.opaque = (voidpf)0; err = inflateInit(&stream); if (err != Z_OK) return err; stream.next_out = dest; stream.avail_out = 0; do { if (stream.avail_out == 0) { stream.avail_out = left > (uLong)max ? max : (uInt)left; left -= stream.avail_out; } if (stream.avail_in == 0) { stream.avail_in = len > (uLong)max ? max : (uInt)len; len -= stream.avail_in; } err = inflate(&stream, Z_NO_FLUSH); } while (err == Z_OK); *sourceLen -= len + stream.avail_in; if (dest != buf) *destLen = stream.total_out; else if (stream.total_out && err == Z_BUF_ERROR) left = 1; inflateEnd(&stream); return err == Z_STREAM_END ? Z_OK : err == Z_NEED_DICT ? Z_DATA_ERROR : err == Z_BUF_ERROR && left + stream.avail_out ? Z_DATA_ERROR : err; } int ZEXPORT uncompress (dest, destLen, source, sourceLen) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; { return uncompress2(dest, destLen, source, &sourceLen); } gtkwave-3.3.86/src/libz/inftrees.h0000664000175000017500000000556013166335473016331 0ustar bybellbybell/* inftrees.h -- header to use inftrees.c * Copyright (C) 1995-2005, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* Structure for decoding tables. Each entry provides either the information needed to do the operation requested by the code that indexed that table entry, or it provides a pointer to another table that indexes more bits of the code. op indicates whether the entry is a pointer to another table, a literal, a length or distance, an end-of-block, or an invalid code. For a table pointer, the low four bits of op is the number of index bits of that table. For a length or distance, the low four bits of op is the number of extra bits to get after the code. bits is the number of bits in this code or part of the code to drop off of the bit buffer. val is the actual byte to output in the case of a literal, the base length or distance, or the offset from the current table to the next table. Each entry is four bytes. */ typedef struct { unsigned char op; /* operation, extra bits, table bits */ unsigned char bits; /* bits in this part of the code */ unsigned short val; /* offset in table or code value */ } code; /* op values as set by inflate_table(): 00000000 - literal 0000tttt - table link, tttt != 0 is the number of table index bits 0001eeee - length or distance, eeee is the number of extra bits 01100000 - end of block 01000000 - invalid code */ /* Maximum size of the dynamic table. The maximum number of code structures is 1444, which is the sum of 852 for literal/length codes and 592 for distance codes. These values were found by exhaustive searches using the program examples/enough.c found in the zlib distribtution. The arguments to that program are the number of symbols, the initial root table size, and the maximum bit length of a code. "enough 286 9 15" for literal/length codes returns returns 852, and "enough 30 6 15" for distance codes returns 592. The initial root table size (9 or 6) is found in the fifth argument of the inflate_table() calls in inflate.c and infback.c. If the root table size is changed, then these maximum sizes would be need to be recalculated and updated. */ #define ENOUGH_LENS 852 #define ENOUGH_DISTS 592 #define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) /* Type of code to build for inflate_table() */ typedef enum { CODES, LENS, DISTS } codetype; int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, unsigned codes, code FAR * FAR *table, unsigned FAR *bits, unsigned short FAR *work)); gtkwave-3.3.86/src/libz/zconf.h0000664000175000017500000003765213166335473015640 0ustar bybellbybell/* zconf.h -- configuration of the zlib compression library * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #ifndef ZCONF_H #define ZCONF_H /* * If you *really* need a unique prefix for all types and library functions, * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. * Even better than compiling with -DZ_PREFIX would be to use configure to set * this permanently in zconf.h using "./configure --zprefix". */ #ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ # define Z_PREFIX_SET /* all linked symbols and init macros */ # define _dist_code z__dist_code # define _length_code z__length_code # define _tr_align z__tr_align # define _tr_flush_bits z__tr_flush_bits # define _tr_flush_block z__tr_flush_block # define _tr_init z__tr_init # define _tr_stored_block z__tr_stored_block # define _tr_tally z__tr_tally # define adler32 z_adler32 # define adler32_combine z_adler32_combine # define adler32_combine64 z_adler32_combine64 # define adler32_z z_adler32_z # ifndef Z_SOLO # define compress z_compress # define compress2 z_compress2 # define compressBound z_compressBound # endif # define crc32 z_crc32 # define crc32_combine z_crc32_combine # define crc32_combine64 z_crc32_combine64 # define crc32_z z_crc32_z # define deflate z_deflate # define deflateBound z_deflateBound # define deflateCopy z_deflateCopy # define deflateEnd z_deflateEnd # define deflateGetDictionary z_deflateGetDictionary # define deflateInit z_deflateInit # define deflateInit2 z_deflateInit2 # define deflateInit2_ z_deflateInit2_ # define deflateInit_ z_deflateInit_ # define deflateParams z_deflateParams # define deflatePending z_deflatePending # define deflatePrime z_deflatePrime # define deflateReset z_deflateReset # define deflateResetKeep z_deflateResetKeep # define deflateSetDictionary z_deflateSetDictionary # define deflateSetHeader z_deflateSetHeader # define deflateTune z_deflateTune # define deflate_copyright z_deflate_copyright # define get_crc_table z_get_crc_table # ifndef Z_SOLO # define gz_error z_gz_error # define gz_intmax z_gz_intmax # define gz_strwinerror z_gz_strwinerror # define gzbuffer z_gzbuffer # define gzclearerr z_gzclearerr # define gzclose z_gzclose # define gzclose_r z_gzclose_r # define gzclose_w z_gzclose_w # define gzdirect z_gzdirect # define gzdopen z_gzdopen # define gzeof z_gzeof # define gzerror z_gzerror # define gzflush z_gzflush # define gzfread z_gzfread # define gzfwrite z_gzfwrite # define gzgetc z_gzgetc # define gzgetc_ z_gzgetc_ # define gzgets z_gzgets # define gzoffset z_gzoffset # define gzoffset64 z_gzoffset64 # define gzopen z_gzopen # define gzopen64 z_gzopen64 # ifdef _WIN32 # define gzopen_w z_gzopen_w # endif # define gzprintf z_gzprintf # define gzputc z_gzputc # define gzputs z_gzputs # define gzread z_gzread # define gzrewind z_gzrewind # define gzseek z_gzseek # define gzseek64 z_gzseek64 # define gzsetparams z_gzsetparams # define gztell z_gztell # define gztell64 z_gztell64 # define gzungetc z_gzungetc # define gzvprintf z_gzvprintf # define gzwrite z_gzwrite # endif # define inflate z_inflate # define inflateBack z_inflateBack # define inflateBackEnd z_inflateBackEnd # define inflateBackInit z_inflateBackInit # define inflateBackInit_ z_inflateBackInit_ # define inflateCodesUsed z_inflateCodesUsed # define inflateCopy z_inflateCopy # define inflateEnd z_inflateEnd # define inflateGetDictionary z_inflateGetDictionary # define inflateGetHeader z_inflateGetHeader # define inflateInit z_inflateInit # define inflateInit2 z_inflateInit2 # define inflateInit2_ z_inflateInit2_ # define inflateInit_ z_inflateInit_ # define inflateMark z_inflateMark # define inflatePrime z_inflatePrime # define inflateReset z_inflateReset # define inflateReset2 z_inflateReset2 # define inflateResetKeep z_inflateResetKeep # define inflateSetDictionary z_inflateSetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint # define inflateUndermine z_inflateUndermine # define inflateValidate z_inflateValidate # define inflate_copyright z_inflate_copyright # define inflate_fast z_inflate_fast # define inflate_table z_inflate_table # ifndef Z_SOLO # define uncompress z_uncompress # define uncompress2 z_uncompress2 # endif # define zError z_zError # ifndef Z_SOLO # define zcalloc z_zcalloc # define zcfree z_zcfree # endif # define zlibCompileFlags z_zlibCompileFlags # define zlibVersion z_zlibVersion /* all zlib typedefs in zlib.h and zconf.h */ # define Byte z_Byte # define Bytef z_Bytef # define alloc_func z_alloc_func # define charf z_charf # define free_func z_free_func # ifndef Z_SOLO # define gzFile z_gzFile # endif # define gz_header z_gz_header # define gz_headerp z_gz_headerp # define in_func z_in_func # define intf z_intf # define out_func z_out_func # define uInt z_uInt # define uIntf z_uIntf # define uLong z_uLong # define uLongf z_uLongf # define voidp z_voidp # define voidpc z_voidpc # define voidpf z_voidpf /* all zlib structs in zlib.h and zconf.h */ # define gz_header_s z_gz_header_s # define internal_state z_internal_state #endif #if defined(__MSDOS__) && !defined(MSDOS) # define MSDOS #endif #if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) # define OS2 #endif #if defined(_WINDOWS) && !defined(WINDOWS) # define WINDOWS #endif #if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) # ifndef WIN32 # define WIN32 # endif #endif #if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) # if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) # ifndef SYS16BIT # define SYS16BIT # endif # endif #endif /* * Compile with -DMAXSEG_64K if the alloc function cannot allocate more * than 64k bytes at a time (needed on systems with 16-bit int). */ #ifdef SYS16BIT # define MAXSEG_64K #endif #ifdef MSDOS # define UNALIGNED_OK #endif #ifdef __STDC_VERSION__ # ifndef STDC # define STDC # endif # if __STDC_VERSION__ >= 199901L # ifndef STDC99 # define STDC99 # endif # endif #endif #if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) # define STDC #endif #if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) # define STDC #endif #if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) # define STDC #endif #if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) # define STDC #endif #if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ # define STDC #endif #ifndef STDC # ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ # define const /* note: need a more gentle solution here */ # endif #endif #if defined(ZLIB_CONST) && !defined(z_const) # define z_const const #else # define z_const #endif #ifdef Z_SOLO typedef unsigned long z_size_t; #else # define z_longlong long long # if defined(NO_SIZE_T) typedef unsigned NO_SIZE_T z_size_t; # elif defined(STDC) # include typedef size_t z_size_t; # else typedef unsigned long z_size_t; # endif # undef z_longlong #endif /* Maximum value for memLevel in deflateInit2 */ #ifndef MAX_MEM_LEVEL # ifdef MAXSEG_64K # define MAX_MEM_LEVEL 8 # else # define MAX_MEM_LEVEL 9 # endif #endif /* Maximum value for windowBits in deflateInit2 and inflateInit2. * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files * created by gzip. (Files created by minigzip can still be extracted by * gzip.) */ #ifndef MAX_WBITS # define MAX_WBITS 15 /* 32K LZ77 window */ #endif /* The memory requirements for deflate are (in bytes): (1 << (windowBits+2)) + (1 << (memLevel+9)) that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) plus a few kilobytes for small objects. For example, if you want to reduce the default memory requirements from 256K to 128K, compile with make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" Of course this will generally degrade compression (there's no free lunch). The memory requirements for inflate are (in bytes) 1 << windowBits that is, 32K for windowBits=15 (default value) plus about 7 kilobytes for small objects. */ /* Type declarations */ #ifndef OF /* function prototypes */ # ifdef STDC # define OF(args) args # else # define OF(args) () # endif #endif #ifndef Z_ARG /* function prototypes for stdarg */ # if defined(STDC) || defined(Z_HAVE_STDARG_H) # define Z_ARG(args) args # else # define Z_ARG(args) () # endif #endif /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, * just define FAR to be empty. */ #ifdef SYS16BIT # if defined(M_I86SM) || defined(M_I86MM) /* MSC small or medium model */ # define SMALL_MEDIUM # ifdef _MSC_VER # define FAR _far # else # define FAR far # endif # endif # if (defined(__SMALL__) || defined(__MEDIUM__)) /* Turbo C small or medium model */ # define SMALL_MEDIUM # ifdef __BORLANDC__ # define FAR _far # else # define FAR far # endif # endif #endif #if defined(WINDOWS) || defined(WIN32) /* If building or using zlib as a DLL, define ZLIB_DLL. * This is not mandatory, but it offers a little performance increase. */ # ifdef ZLIB_DLL # if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) # ifdef ZLIB_INTERNAL # define ZEXTERN extern __declspec(dllexport) # else # define ZEXTERN extern __declspec(dllimport) # endif # endif # endif /* ZLIB_DLL */ /* If building or using zlib with the WINAPI/WINAPIV calling convention, * define ZLIB_WINAPI. * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. */ # ifdef ZLIB_WINAPI # ifdef FAR # undef FAR # endif # include /* No need for _export, use ZLIB.DEF instead. */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */ # define ZEXPORT WINAPI # ifdef WIN32 # define ZEXPORTVA WINAPIV # else # define ZEXPORTVA FAR CDECL # endif # endif #endif #if defined (__BEOS__) # ifdef ZLIB_DLL # ifdef ZLIB_INTERNAL # define ZEXPORT __declspec(dllexport) # define ZEXPORTVA __declspec(dllexport) # else # define ZEXPORT __declspec(dllimport) # define ZEXPORTVA __declspec(dllimport) # endif # endif #endif #ifndef ZEXTERN # define ZEXTERN extern #endif #ifndef ZEXPORT # define ZEXPORT #endif #ifndef ZEXPORTVA # define ZEXPORTVA #endif #ifndef FAR # define FAR #endif #if !defined(__MACTYPES__) typedef unsigned char Byte; /* 8 bits */ #endif typedef unsigned int uInt; /* 16 bits or more */ typedef unsigned long uLong; /* 32 bits or more */ #ifdef SMALL_MEDIUM /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ # define Bytef Byte FAR #else typedef Byte FAR Bytef; #endif typedef char FAR charf; typedef int FAR intf; typedef uInt FAR uIntf; typedef uLong FAR uLongf; #ifdef STDC typedef void const *voidpc; typedef void FAR *voidpf; typedef void *voidp; #else typedef Byte const *voidpc; typedef Byte FAR *voidpf; typedef Byte *voidp; #endif #if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) # include # if (UINT_MAX == 0xffffffffUL) # define Z_U4 unsigned # elif (ULONG_MAX == 0xffffffffUL) # define Z_U4 unsigned long # elif (USHRT_MAX == 0xffffffffUL) # define Z_U4 unsigned short # endif #endif #ifdef Z_U4 typedef Z_U4 z_crc_t; #else typedef unsigned long z_crc_t; #endif #ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ # define Z_HAVE_UNISTD_H #endif #ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ # define Z_HAVE_STDARG_H #endif #ifdef STDC # ifndef Z_SOLO # include /* for off_t */ # endif #endif #if defined(STDC) || defined(Z_HAVE_STDARG_H) # ifndef Z_SOLO # include /* for va_list */ # endif #endif #ifdef _WIN32 # ifndef Z_SOLO # include /* for wchar_t */ # endif #endif /* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even * though the former does not conform to the LFS document), but considering * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as * equivalently requesting no 64-bit operations */ #if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 # undef _LARGEFILE64_SOURCE #endif #if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) # define Z_HAVE_UNISTD_H #endif #ifndef Z_SOLO # if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) # include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ # ifdef VMS # include /* for off_t */ # endif # ifndef z_off_t # define z_off_t off_t # endif # endif #endif #if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 # define Z_LFS64 #endif #if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) # define Z_LARGE64 #endif #if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) # define Z_WANT64 #endif #if !defined(SEEK_SET) && !defined(Z_SOLO) # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ #endif #ifndef z_off_t # define z_off_t long #endif #if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t #else # if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) # define z_off64_t __int64 # else # define z_off64_t z_off_t # endif #endif /* MVS linker does not support external names larger than 8 bytes */ #if defined(__MVS__) #pragma map(deflateInit_,"DEIN") #pragma map(deflateInit2_,"DEIN2") #pragma map(deflateEnd,"DEEND") #pragma map(deflateBound,"DEBND") #pragma map(inflateInit_,"ININ") #pragma map(inflateInit2_,"ININ2") #pragma map(inflateEnd,"INEND") #pragma map(inflateSync,"INSY") #pragma map(inflateSetDictionary,"INSEDI") #pragma map(compressBound,"CMBND") #pragma map(inflate_table,"INTABL") #pragma map(inflate_fast,"INFA") #pragma map(inflate_copyright,"INCOPY") #endif #endif /* ZCONF_H */ gtkwave-3.3.86/src/libz/trees.h0000664000175000017500000002043013166335473015625 0ustar bybellbybell/* header created automatically with -DGEN_TREES_H */ local const ct_data static_ltree[L_CODES+2] = { {{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, {{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, {{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, {{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, {{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, {{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, {{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, {{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, {{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, {{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, {{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, {{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, {{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, {{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, {{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, {{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, {{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, {{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, {{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, {{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, {{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, {{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, {{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, {{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, {{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, {{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, {{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, {{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, {{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, {{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, {{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, {{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, {{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, {{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, {{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, {{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, {{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, {{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, {{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, {{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, {{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, {{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, {{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, {{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, {{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, {{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, {{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, {{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, {{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, {{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, {{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, {{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, {{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, {{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, {{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, {{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, {{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, {{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} }; local const ct_data static_dtree[D_CODES] = { {{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, {{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, {{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, {{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, {{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, {{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} }; const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = { 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 }; const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= { 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 }; local const int base_length[LENGTH_CODES] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 0 }; local const int base_dist[D_CODES] = { 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 }; gtkwave-3.3.86/src/libz/inflate.h0000664000175000017500000001473213166335473016135 0ustar bybellbybell/* inflate.h -- internal inflate state definition * Copyright (C) 1995-2016 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* define NO_GZIP when compiling if you want to disable gzip header and trailer decoding by inflate(). NO_GZIP would be used to avoid linking in the crc code when it is not needed. For shared libraries, gzip decoding should be left enabled. */ #ifndef NO_GZIP # define GUNZIP #endif /* Possible inflate modes between inflate() calls */ typedef enum { HEAD = 16180, /* i: waiting for magic header */ FLAGS, /* i: waiting for method and flags (gzip) */ TIME, /* i: waiting for modification time (gzip) */ OS, /* i: waiting for extra flags and operating system (gzip) */ EXLEN, /* i: waiting for extra length (gzip) */ EXTRA, /* i: waiting for extra bytes (gzip) */ NAME, /* i: waiting for end of file name (gzip) */ COMMENT, /* i: waiting for end of comment (gzip) */ HCRC, /* i: waiting for header crc (gzip) */ DICTID, /* i: waiting for dictionary check value */ DICT, /* waiting for inflateSetDictionary() call */ TYPE, /* i: waiting for type bits, including last-flag bit */ TYPEDO, /* i: same, but skip check to exit inflate on new block */ STORED, /* i: waiting for stored size (length and complement) */ COPY_, /* i/o: same as COPY below, but only first time in */ COPY, /* i/o: waiting for input or output to copy stored block */ TABLE, /* i: waiting for dynamic block table lengths */ LENLENS, /* i: waiting for code length code lengths */ CODELENS, /* i: waiting for length/lit and distance code lengths */ LEN_, /* i: same as LEN below, but only first time in */ LEN, /* i: waiting for length/lit/eob code */ LENEXT, /* i: waiting for length extra bits */ DIST, /* i: waiting for distance code */ DISTEXT, /* i: waiting for distance extra bits */ MATCH, /* o: waiting for output space to copy string */ LIT, /* o: waiting for output space to write literal */ CHECK, /* i: waiting for 32-bit check value */ LENGTH, /* i: waiting for 32-bit length (gzip) */ DONE, /* finished check, done -- remain here until reset */ BAD, /* got a data error -- remain here until reset */ MEM, /* got an inflate() memory error -- remain here until reset */ SYNC /* looking for synchronization bytes to restart inflate() */ } inflate_mode; /* State transitions between above modes - (most modes can go to BAD or MEM on error -- not shown for clarity) Process header: HEAD -> (gzip) or (zlib) or (raw) (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> HCRC -> TYPE (zlib) -> DICTID or TYPE DICTID -> DICT -> TYPE (raw) -> TYPEDO Read deflate blocks: TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK STORED -> COPY_ -> COPY -> TYPE TABLE -> LENLENS -> CODELENS -> LEN_ LEN_ -> LEN Read deflate codes in fixed or dynamic block: LEN -> LENEXT or LIT or TYPE LENEXT -> DIST -> DISTEXT -> MATCH -> LEN LIT -> LEN Process trailer: CHECK -> LENGTH -> DONE */ /* State maintained between inflate() calls -- approximately 7K bytes, not including the allocated sliding window, which is up to 32K bytes. */ struct inflate_state { z_streamp strm; /* pointer back to this zlib stream */ inflate_mode mode; /* current inflate mode */ int last; /* true if processing last block */ int wrap; /* bit 0 true for zlib, bit 1 true for gzip, bit 2 true to validate check value */ int havedict; /* true if dictionary provided */ int flags; /* gzip header method and flags (0 if zlib) */ unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ unsigned long check; /* protected copy of check value */ unsigned long total; /* protected copy of output count */ gz_headerp head; /* where to save gzip header information */ /* sliding window */ unsigned wbits; /* log base 2 of requested window size */ unsigned wsize; /* window size or zero if not using window */ unsigned whave; /* valid bytes in the window */ unsigned wnext; /* window write index */ unsigned char FAR *window; /* allocated sliding window, if needed */ /* bit accumulator */ unsigned long hold; /* input bit accumulator */ unsigned bits; /* number of bits in "in" */ /* for string and stored block copying */ unsigned length; /* literal or length of data to copy */ unsigned offset; /* distance back to copy string from */ /* for table and code decoding */ unsigned extra; /* extra bits needed */ /* fixed and dynamic code tables */ code const FAR *lencode; /* starting table for length/literal codes */ code const FAR *distcode; /* starting table for distance codes */ unsigned lenbits; /* index bits for lencode */ unsigned distbits; /* index bits for distcode */ /* dynamic table building */ unsigned ncode; /* number of code length code lengths */ unsigned nlen; /* number of length code lengths */ unsigned ndist; /* number of distance code lengths */ unsigned have; /* number of code lengths in lens[] */ code FAR *next; /* next available space in codes[] */ unsigned short lens[320]; /* temporary storage for code lengths */ unsigned short work[288]; /* work area for code table building */ code codes[ENOUGH]; /* space for code tables */ int sane; /* if false, allow invalid distance too far */ int back; /* bits back of last unprocessed length/lit */ unsigned was; /* initial length of match */ }; gtkwave-3.3.86/src/libz/gzguts.h0000664000175000017500000001524313166335473016034 0ustar bybellbybell/* gzguts.h -- zlib internal header definitions for gz* operations * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #ifdef _LARGEFILE64_SOURCE # ifndef _LARGEFILE_SOURCE # define _LARGEFILE_SOURCE 1 # endif # ifdef _FILE_OFFSET_BITS # undef _FILE_OFFSET_BITS # endif #endif #ifdef HAVE_HIDDEN # define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) #else # define ZLIB_INTERNAL #endif #include #include "zlib.h" #ifdef STDC # include # include # include #endif #ifndef _POSIX_SOURCE # define _POSIX_SOURCE #endif #include #ifdef _WIN32 # include #endif #if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) # include #endif #if defined(_WIN32) || defined(__CYGWIN__) # define WIDECHAR #endif #ifdef WINAPI_FAMILY # define open _open # define read _read # define write _write # define close _close #endif #ifdef NO_DEFLATE /* for compatibility with old definition */ # define NO_GZCOMPRESS #endif #if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) # ifndef HAVE_VSNPRINTF # define HAVE_VSNPRINTF # endif #endif #if defined(__CYGWIN__) # ifndef HAVE_VSNPRINTF # define HAVE_VSNPRINTF # endif #endif #if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410) # ifndef HAVE_VSNPRINTF # define HAVE_VSNPRINTF # endif #endif #ifndef HAVE_VSNPRINTF # ifdef MSDOS /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), but for now we just assume it doesn't. */ # define NO_vsnprintf # endif # ifdef __TURBOC__ # define NO_vsnprintf # endif # ifdef WIN32 /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ # if !defined(vsnprintf) && !defined(NO_vsnprintf) # if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) # define vsnprintf _vsnprintf # endif # endif # endif # ifdef __SASC # define NO_vsnprintf # endif # ifdef VMS # define NO_vsnprintf # endif # ifdef __OS400__ # define NO_vsnprintf # endif # ifdef __MVS__ # define NO_vsnprintf # endif #endif /* unlike snprintf (which is required in C99), _snprintf does not guarantee null termination of the result -- however this is only used in gzlib.c where the result is assured to fit in the space provided */ #if defined(_MSC_VER) && _MSC_VER < 1900 # define snprintf _snprintf #endif #ifndef local # define local static #endif /* since "static" is used to mean two completely different things in C, we define "local" for the non-static meaning of "static", for readability (compile with -Dlocal if your debugger can't find static symbols) */ /* gz* functions always use library allocation functions */ #ifndef STDC extern voidp malloc OF((uInt size)); extern void free OF((voidpf ptr)); #endif /* get errno and strerror definition */ #if defined UNDER_CE # include # define zstrerror() gz_strwinerror((DWORD)GetLastError()) #else # ifndef NO_STRERROR # include # define zstrerror() strerror(errno) # else # define zstrerror() "stdio error (consult errno)" # endif #endif /* provide prototypes for these when building zlib without LFS */ #if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); #endif /* default memLevel */ #if MAX_MEM_LEVEL >= 8 # define DEF_MEM_LEVEL 8 #else # define DEF_MEM_LEVEL MAX_MEM_LEVEL #endif /* default i/o buffer size -- double this for output when reading (this and twice this must be able to fit in an unsigned type) */ #define GZBUFSIZE 8192 /* gzip modes, also provide a little integrity check on the passed structure */ #define GZ_NONE 0 #define GZ_READ 7247 #define GZ_WRITE 31153 #define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */ /* values for gz_state how */ #define LOOK 0 /* look for a gzip header */ #define COPY 1 /* copy input directly */ #define GZIP 2 /* decompress a gzip stream */ /* internal gzip file state data structure */ typedef struct { /* exposed contents for gzgetc() macro */ struct gzFile_s x; /* "x" for exposed */ /* x.have: number of bytes available at x.next */ /* x.next: next output data to deliver or write */ /* x.pos: current position in uncompressed data */ /* used for both reading and writing */ int mode; /* see gzip modes above */ int fd; /* file descriptor */ char *path; /* path or fd for error messages */ unsigned size; /* buffer size, zero if not allocated yet */ unsigned want; /* requested buffer size, default is GZBUFSIZE */ unsigned char *in; /* input buffer (double-sized when writing) */ unsigned char *out; /* output buffer (double-sized when reading) */ int direct; /* 0 if processing gzip, 1 if transparent */ /* just for reading */ int how; /* 0: get header, 1: copy, 2: decompress */ z_off64_t start; /* where the gzip data started, for rewinding */ int eof; /* true if end of input file reached */ int past; /* true if read requested past end */ /* just for writing */ int level; /* compression level */ int strategy; /* compression strategy */ /* seek request */ z_off64_t skip; /* amount to skip (already rewound if backwards) */ int seek; /* true if seek request pending */ /* error information */ int err; /* error code */ char *msg; /* error message */ /* zlib inflate or deflate stream */ z_stream strm; /* stream structure in-place (not a pointer) */ } gz_state; typedef gz_state FAR *gz_statep; /* shared functions */ void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); #if defined UNDER_CE char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); #endif /* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t value -- needed when comparing unsigned to z_off64_t, which is signed (possible z_off64_t types off_t, off64_t, and long are all signed) */ #ifdef INT_MAX # define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) #else unsigned ZLIB_INTERNAL gz_intmax OF((void)); # define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) #endif gtkwave-3.3.86/src/libz/Makefile.am0000664000175000017500000000063613166335473016374 0ustar bybellbybell## -*- makefile -*- ## noinst_LIBRARIES= libz.a AM_CFLAGS= -DNO_VIZ libz_a_SOURCES= adler32.c deflate.h gzread.c inffixed.h trees.c zutil.c \ compress.c example.c gzwrite.c inflate.c trees.h zutil.h \ crc32.c gzclose.c infback.c inflate.h uncompr.c \ crc32.h gzguts.h inffast.c inftrees.c zconf.h \ deflate.c gzlib.c inffast.h inftrees.h zlib.h EXTRA_DIST= README gtkwave-3.3.86/src/libz/inffast.c0000664000175000017500000003126213166335473016135 0ustar bybellbybell/* inffast.c -- fast decoding * Copyright (C) 1995-2017 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "zutil.h" #include "inftrees.h" #include "inflate.h" #include "inffast.h" #ifdef ASMINF # pragma message("Assembler code may have bugs -- use at your own risk") #else /* Decode literal, length, and distance codes and write out the resulting literal and match bytes until either not enough input or output is available, an end-of-block is encountered, or a data error is encountered. When large enough input and output buffers are supplied to inflate(), for example, a 16K input buffer and a 64K output buffer, more than 95% of the inflate execution time is spent in this routine. Entry assumptions: state->mode == LEN strm->avail_in >= 6 strm->avail_out >= 258 start >= strm->avail_out state->bits < 8 On return, state->mode is one of: LEN -- ran out of enough output space or enough available input TYPE -- reached end of block code, inflate() to interpret next block BAD -- error in block data Notes: - The maximum input bits used by a length/distance pair is 15 bits for the length code, 5 bits for the length extra, 15 bits for the distance code, and 13 bits for the distance extra. This totals 48 bits, or six bytes. Therefore if strm->avail_in >= 6, then there is enough input to avoid checking for available input while decoding. - The maximum bytes that a single length/distance pair can output is 258 bytes, which is the maximum length that can be coded. inflate_fast() requires strm->avail_out >= 258 for each loop to avoid checking for output space. */ void ZLIB_INTERNAL inflate_fast(strm, start) z_streamp strm; unsigned start; /* inflate()'s starting value for strm->avail_out */ { struct inflate_state FAR *state; z_const unsigned char FAR *in; /* local strm->next_in */ z_const unsigned char FAR *last; /* have enough input while in < last */ unsigned char FAR *out; /* local strm->next_out */ unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ unsigned char FAR *end; /* while out < end, enough space available */ #ifdef INFLATE_STRICT unsigned dmax; /* maximum distance from zlib header */ #endif unsigned wsize; /* window size or zero if not using window */ unsigned whave; /* valid bytes in the window */ unsigned wnext; /* window write index */ unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ unsigned long hold; /* local strm->hold */ unsigned bits; /* local strm->bits */ code const FAR *lcode; /* local strm->lencode */ code const FAR *dcode; /* local strm->distcode */ unsigned lmask; /* mask for first level of length codes */ unsigned dmask; /* mask for first level of distance codes */ code here; /* retrieved table entry */ unsigned op; /* code bits, operation, extra bits, or */ /* window position, window bytes to copy */ unsigned len; /* match length, unused bytes */ unsigned dist; /* match distance */ unsigned char FAR *from; /* where to copy match from */ /* copy state to local variables */ state = (struct inflate_state FAR *)strm->state; in = strm->next_in; last = in + (strm->avail_in - 5); out = strm->next_out; beg = out - (start - strm->avail_out); end = out + (strm->avail_out - 257); #ifdef INFLATE_STRICT dmax = state->dmax; #endif wsize = state->wsize; whave = state->whave; wnext = state->wnext; window = state->window; hold = state->hold; bits = state->bits; lcode = state->lencode; dcode = state->distcode; lmask = (1U << state->lenbits) - 1; dmask = (1U << state->distbits) - 1; /* decode literals and length/distances until end-of-block or not enough input data or output space */ do { if (bits < 15) { hold += (unsigned long)(*in++) << bits; bits += 8; hold += (unsigned long)(*in++) << bits; bits += 8; } here = lcode[hold & lmask]; dolen: op = (unsigned)(here.bits); hold >>= op; bits -= op; op = (unsigned)(here.op); if (op == 0) { /* literal */ Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", here.val)); *out++ = (unsigned char)(here.val); } else if (op & 16) { /* length base */ len = (unsigned)(here.val); op &= 15; /* number of extra bits */ if (op) { if (bits < op) { hold += (unsigned long)(*in++) << bits; bits += 8; } len += (unsigned)hold & ((1U << op) - 1); hold >>= op; bits -= op; } Tracevv((stderr, "inflate: length %u\n", len)); if (bits < 15) { hold += (unsigned long)(*in++) << bits; bits += 8; hold += (unsigned long)(*in++) << bits; bits += 8; } here = dcode[hold & dmask]; dodist: op = (unsigned)(here.bits); hold >>= op; bits -= op; op = (unsigned)(here.op); if (op & 16) { /* distance base */ dist = (unsigned)(here.val); op &= 15; /* number of extra bits */ if (bits < op) { hold += (unsigned long)(*in++) << bits; bits += 8; if (bits < op) { hold += (unsigned long)(*in++) << bits; bits += 8; } } dist += (unsigned)hold & ((1U << op) - 1); #ifdef INFLATE_STRICT if (dist > dmax) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } #endif hold >>= op; bits -= op; Tracevv((stderr, "inflate: distance %u\n", dist)); op = (unsigned)(out - beg); /* max distance in output */ if (dist > op) { /* see if copy from window */ op = dist - op; /* distance back in window */ if (op > whave) { if (state->sane) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR if (len <= op - whave) { do { *out++ = 0; } while (--len); continue; } len -= op - whave; do { *out++ = 0; } while (--op > whave); if (op == 0) { from = out - dist; do { *out++ = *from++; } while (--len); continue; } #endif } from = window; if (wnext == 0) { /* very common case */ from += wsize - op; if (op < len) { /* some from window */ len -= op; do { *out++ = *from++; } while (--op); from = out - dist; /* rest from output */ } } else if (wnext < op) { /* wrap around window */ from += wsize + wnext - op; op -= wnext; if (op < len) { /* some from end of window */ len -= op; do { *out++ = *from++; } while (--op); from = window; if (wnext < len) { /* some from start of window */ op = wnext; len -= op; do { *out++ = *from++; } while (--op); from = out - dist; /* rest from output */ } } } else { /* contiguous in window */ from += wnext - op; if (op < len) { /* some from window */ len -= op; do { *out++ = *from++; } while (--op); from = out - dist; /* rest from output */ } } while (len > 2) { *out++ = *from++; *out++ = *from++; *out++ = *from++; len -= 3; } if (len) { *out++ = *from++; if (len > 1) *out++ = *from++; } } else { from = out - dist; /* copy direct from output */ do { /* minimum length is three */ *out++ = *from++; *out++ = *from++; *out++ = *from++; len -= 3; } while (len > 2); if (len) { *out++ = *from++; if (len > 1) *out++ = *from++; } } } else if ((op & 64) == 0) { /* 2nd level distance code */ here = dcode[here.val + (hold & ((1U << op) - 1))]; goto dodist; } else { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } } else if ((op & 64) == 0) { /* 2nd level length code */ here = lcode[here.val + (hold & ((1U << op) - 1))]; goto dolen; } else if (op & 32) { /* end-of-block */ Tracevv((stderr, "inflate: end of block\n")); state->mode = TYPE; break; } else { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } } while (in < last && out < end); /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ len = bits >> 3; in -= len; bits -= len << 3; hold &= (1U << bits) - 1; /* update state and return */ strm->next_in = in; strm->next_out = out; strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); strm->avail_out = (unsigned)(out < end ? 257 + (end - out) : 257 - (out - end)); state->hold = hold; state->bits = bits; return; } /* inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): - Using bit fields for code structure - Different op definition to avoid & for extra bits (do & for table bits) - Three separate decoding do-loops for direct, window, and wnext == 0 - Special case for distance > 1 copies to do overlapped load and store copy - Explicit branch predictions (based on measured branch probabilities) - Deferring match copy and interspersed it with decoding subsequent codes - Swapping literal/length else - Swapping window/direct else - Larger unrolled copy loops (three is about right) - Moving len -= 3 statement into middle of loop */ #endif /* !ASMINF */ gtkwave-3.3.86/src/libz/compress.c0000664000175000017500000000521313166335473016333 0ustar bybellbybell/* compress.c -- compress a memory buffer * Copyright (C) 1995-2005, 2014, 2016 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #define ZLIB_INTERNAL #include "zlib.h" /* =========================================================================== Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least 0.1% larger than sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; int level; { z_stream stream; int err; const uInt max = (uInt)-1; uLong left; left = *destLen; *destLen = 0; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; stream.opaque = (voidpf)0; err = deflateInit(&stream, level); if (err != Z_OK) return err; stream.next_out = dest; stream.avail_out = 0; stream.next_in = (z_const Bytef *)source; stream.avail_in = 0; do { if (stream.avail_out == 0) { stream.avail_out = left > (uLong)max ? max : (uInt)left; left -= stream.avail_out; } if (stream.avail_in == 0) { stream.avail_in = sourceLen > (uLong)max ? max : (uInt)sourceLen; sourceLen -= stream.avail_in; } err = deflate(&stream, sourceLen ? Z_NO_FLUSH : Z_FINISH); } while (err == Z_OK); *destLen = stream.total_out; deflateEnd(&stream); return err == Z_STREAM_END ? Z_OK : err; } /* =========================================================================== */ int ZEXPORT compress (dest, destLen, source, sourceLen) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; { return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); } /* =========================================================================== If the default memLevel or windowBits for deflateInit() is changed, then this function needs to be updated. */ uLong ZEXPORT compressBound (sourceLen) uLong sourceLen; { return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + (sourceLen >> 25) + 13; } gtkwave-3.3.86/src/libz/example.c0000664000175000017500000004010013166335473016125 0ustar bybellbybell/* example.c -- usage example of the zlib compression library * Copyright (C) 1995-2006 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id: example.c,v 1.1 2010/06/30 04:58:25 gtkwave Exp $ */ #include "zlib.h" #include #ifdef STDC # include # include #endif #if defined(VMS) || defined(RISCOS) # define TESTFILE "foo-gz" #else # define TESTFILE "foo.gz" #endif #define CHECK_ERR(err, msg) { \ if (err != Z_OK) { \ fprintf(stderr, "%s error: %d\n", msg, err); \ exit(1); \ } \ } const char hello[] = "hello, hello!"; /* "hello world" would be more standard, but the repeated "hello" * stresses the compression code better, sorry... */ const char dictionary[] = "hello"; uLong dictId; /* Adler32 value of the dictionary */ void test_compress OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); void test_gzio OF((const char *fname, Byte *uncompr, uLong uncomprLen)); void test_deflate OF((Byte *compr, uLong comprLen)); void test_inflate OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); void test_large_deflate OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); void test_large_inflate OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); void test_flush OF((Byte *compr, uLong *comprLen)); void test_sync OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); void test_dict_deflate OF((Byte *compr, uLong comprLen)); void test_dict_inflate OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); int main OF((int argc, char *argv[])); /* =========================================================================== * Test compress() and uncompress() */ void test_compress(compr, comprLen, uncompr, uncomprLen) Byte *compr, *uncompr; uLong comprLen, uncomprLen; { int err; uLong len = (uLong)strlen(hello)+1; err = compress(compr, &comprLen, (const Bytef*)hello, len); CHECK_ERR(err, "compress"); strcpy((char*)uncompr, "garbage"); err = uncompress(uncompr, &uncomprLen, compr, comprLen); CHECK_ERR(err, "uncompress"); if (strcmp((char*)uncompr, hello)) { fprintf(stderr, "bad uncompress\n"); exit(1); } else { printf("uncompress(): %s\n", (char *)uncompr); } } /* =========================================================================== * Test read/write of .gz files */ void test_gzio(fname, uncompr, uncomprLen) const char *fname; /* compressed file name */ Byte *uncompr; uLong uncomprLen; { #ifdef NO_GZCOMPRESS fprintf(stderr, "NO_GZCOMPRESS -- gz* functions cannot compress\n"); #else int err; int len = (int)strlen(hello)+1; gzFile file; z_off_t pos; file = gzopen(fname, "wb"); if (file == NULL) { fprintf(stderr, "gzopen error\n"); exit(1); } gzputc(file, 'h'); if (gzputs(file, "ello") != 4) { fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err)); exit(1); } if (gzprintf(file, ", %s!", "hello") != 8) { fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err)); exit(1); } gzseek(file, 1L, SEEK_CUR); /* add one zero byte */ gzclose(file); file = gzopen(fname, "rb"); if (file == NULL) { fprintf(stderr, "gzopen error\n"); exit(1); } strcpy((char*)uncompr, "garbage"); if (gzread(file, uncompr, (unsigned)uncomprLen) != len) { fprintf(stderr, "gzread err: %s\n", gzerror(file, &err)); exit(1); } if (strcmp((char*)uncompr, hello)) { fprintf(stderr, "bad gzread: %s\n", (char*)uncompr); exit(1); } else { printf("gzread(): %s\n", (char*)uncompr); } pos = gzseek(file, -8L, SEEK_CUR); if (pos != 6 || gztell(file) != pos) { fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n", (long)pos, (long)gztell(file)); exit(1); } if (gzgetc(file) != ' ') { fprintf(stderr, "gzgetc error\n"); exit(1); } if (gzungetc(' ', file) != ' ') { fprintf(stderr, "gzungetc error\n"); exit(1); } gzgets(file, (char*)uncompr, (int)uncomprLen); if (strlen((char*)uncompr) != 7) { /* " hello!" */ fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err)); exit(1); } if (strcmp((char*)uncompr, hello + 6)) { fprintf(stderr, "bad gzgets after gzseek\n"); exit(1); } else { printf("gzgets() after gzseek: %s\n", (char*)uncompr); } gzclose(file); #endif } /* =========================================================================== * Test deflate() with small buffers */ void test_deflate(compr, comprLen) Byte *compr; uLong comprLen; { z_stream c_stream; /* compression stream */ int err; uLong len = (uLong)strlen(hello)+1; c_stream.zalloc = (alloc_func)0; c_stream.zfree = (free_func)0; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); CHECK_ERR(err, "deflateInit"); c_stream.next_in = (Bytef*)hello; c_stream.next_out = compr; while (c_stream.total_in != len && c_stream.total_out < comprLen) { c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */ err = deflate(&c_stream, Z_NO_FLUSH); CHECK_ERR(err, "deflate"); } /* Finish the stream, still forcing small buffers: */ for (;;) { c_stream.avail_out = 1; err = deflate(&c_stream, Z_FINISH); if (err == Z_STREAM_END) break; CHECK_ERR(err, "deflate"); } err = deflateEnd(&c_stream); CHECK_ERR(err, "deflateEnd"); } /* =========================================================================== * Test inflate() with small buffers */ void test_inflate(compr, comprLen, uncompr, uncomprLen) Byte *compr, *uncompr; uLong comprLen, uncomprLen; { int err; z_stream d_stream; /* decompression stream */ strcpy((char*)uncompr, "garbage"); d_stream.zalloc = (alloc_func)0; d_stream.zfree = (free_func)0; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; d_stream.avail_in = 0; d_stream.next_out = uncompr; err = inflateInit(&d_stream); CHECK_ERR(err, "inflateInit"); while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) { d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */ err = inflate(&d_stream, Z_NO_FLUSH); if (err == Z_STREAM_END) break; CHECK_ERR(err, "inflate"); } err = inflateEnd(&d_stream); CHECK_ERR(err, "inflateEnd"); if (strcmp((char*)uncompr, hello)) { fprintf(stderr, "bad inflate\n"); exit(1); } else { printf("inflate(): %s\n", (char *)uncompr); } } /* =========================================================================== * Test deflate() with large buffers and dynamic change of compression level */ void test_large_deflate(compr, comprLen, uncompr, uncomprLen) Byte *compr, *uncompr; uLong comprLen, uncomprLen; { z_stream c_stream; /* compression stream */ int err; c_stream.zalloc = (alloc_func)0; c_stream.zfree = (free_func)0; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_BEST_SPEED); CHECK_ERR(err, "deflateInit"); c_stream.next_out = compr; c_stream.avail_out = (uInt)comprLen; /* At this point, uncompr is still mostly zeroes, so it should compress * very well: */ c_stream.next_in = uncompr; c_stream.avail_in = (uInt)uncomprLen; err = deflate(&c_stream, Z_NO_FLUSH); CHECK_ERR(err, "deflate"); if (c_stream.avail_in != 0) { fprintf(stderr, "deflate not greedy\n"); exit(1); } /* Feed in already compressed data and switch to no compression: */ deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); c_stream.next_in = compr; c_stream.avail_in = (uInt)comprLen/2; err = deflate(&c_stream, Z_NO_FLUSH); CHECK_ERR(err, "deflate"); /* Switch back to compressing mode: */ deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED); c_stream.next_in = uncompr; c_stream.avail_in = (uInt)uncomprLen; err = deflate(&c_stream, Z_NO_FLUSH); CHECK_ERR(err, "deflate"); err = deflate(&c_stream, Z_FINISH); if (err != Z_STREAM_END) { fprintf(stderr, "deflate should report Z_STREAM_END\n"); exit(1); } err = deflateEnd(&c_stream); CHECK_ERR(err, "deflateEnd"); } /* =========================================================================== * Test inflate() with large buffers */ void test_large_inflate(compr, comprLen, uncompr, uncomprLen) Byte *compr, *uncompr; uLong comprLen, uncomprLen; { int err; z_stream d_stream; /* decompression stream */ strcpy((char*)uncompr, "garbage"); d_stream.zalloc = (alloc_func)0; d_stream.zfree = (free_func)0; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; d_stream.avail_in = (uInt)comprLen; err = inflateInit(&d_stream); CHECK_ERR(err, "inflateInit"); for (;;) { d_stream.next_out = uncompr; /* discard the output */ d_stream.avail_out = (uInt)uncomprLen; err = inflate(&d_stream, Z_NO_FLUSH); if (err == Z_STREAM_END) break; CHECK_ERR(err, "large inflate"); } err = inflateEnd(&d_stream); CHECK_ERR(err, "inflateEnd"); if (d_stream.total_out != 2*uncomprLen + comprLen/2) { fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out); exit(1); } else { printf("large_inflate(): OK\n"); } } /* =========================================================================== * Test deflate() with full flush */ void test_flush(compr, comprLen) Byte *compr; uLong *comprLen; { z_stream c_stream; /* compression stream */ int err; uInt len = (uInt)strlen(hello)+1; c_stream.zalloc = (alloc_func)0; c_stream.zfree = (free_func)0; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); CHECK_ERR(err, "deflateInit"); c_stream.next_in = (Bytef*)hello; c_stream.next_out = compr; c_stream.avail_in = 3; c_stream.avail_out = (uInt)*comprLen; err = deflate(&c_stream, Z_FULL_FLUSH); CHECK_ERR(err, "deflate"); compr[3]++; /* force an error in first compressed block */ c_stream.avail_in = len - 3; err = deflate(&c_stream, Z_FINISH); if (err != Z_STREAM_END) { CHECK_ERR(err, "deflate"); } err = deflateEnd(&c_stream); CHECK_ERR(err, "deflateEnd"); *comprLen = c_stream.total_out; } /* =========================================================================== * Test inflateSync() */ void test_sync(compr, comprLen, uncompr, uncomprLen) Byte *compr, *uncompr; uLong comprLen, uncomprLen; { int err; z_stream d_stream; /* decompression stream */ strcpy((char*)uncompr, "garbage"); d_stream.zalloc = (alloc_func)0; d_stream.zfree = (free_func)0; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; d_stream.avail_in = 2; /* just read the zlib header */ err = inflateInit(&d_stream); CHECK_ERR(err, "inflateInit"); d_stream.next_out = uncompr; d_stream.avail_out = (uInt)uncomprLen; inflate(&d_stream, Z_NO_FLUSH); CHECK_ERR(err, "inflate"); d_stream.avail_in = (uInt)comprLen-2; /* read all compressed data */ err = inflateSync(&d_stream); /* but skip the damaged part */ CHECK_ERR(err, "inflateSync"); err = inflate(&d_stream, Z_FINISH); if (err != Z_DATA_ERROR) { fprintf(stderr, "inflate should report DATA_ERROR\n"); /* Because of incorrect adler32 */ exit(1); } err = inflateEnd(&d_stream); CHECK_ERR(err, "inflateEnd"); printf("after inflateSync(): hel%s\n", (char *)uncompr); } /* =========================================================================== * Test deflate() with preset dictionary */ void test_dict_deflate(compr, comprLen) Byte *compr; uLong comprLen; { z_stream c_stream; /* compression stream */ int err; c_stream.zalloc = (alloc_func)0; c_stream.zfree = (free_func)0; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_BEST_COMPRESSION); CHECK_ERR(err, "deflateInit"); err = deflateSetDictionary(&c_stream, (const Bytef*)dictionary, sizeof(dictionary)); CHECK_ERR(err, "deflateSetDictionary"); dictId = c_stream.adler; c_stream.next_out = compr; c_stream.avail_out = (uInt)comprLen; c_stream.next_in = (Bytef*)hello; c_stream.avail_in = (uInt)strlen(hello)+1; err = deflate(&c_stream, Z_FINISH); if (err != Z_STREAM_END) { fprintf(stderr, "deflate should report Z_STREAM_END\n"); exit(1); } err = deflateEnd(&c_stream); CHECK_ERR(err, "deflateEnd"); } /* =========================================================================== * Test inflate() with a preset dictionary */ void test_dict_inflate(compr, comprLen, uncompr, uncomprLen) Byte *compr, *uncompr; uLong comprLen, uncomprLen; { int err; z_stream d_stream; /* decompression stream */ strcpy((char*)uncompr, "garbage"); d_stream.zalloc = (alloc_func)0; d_stream.zfree = (free_func)0; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; d_stream.avail_in = (uInt)comprLen; err = inflateInit(&d_stream); CHECK_ERR(err, "inflateInit"); d_stream.next_out = uncompr; d_stream.avail_out = (uInt)uncomprLen; for (;;) { err = inflate(&d_stream, Z_NO_FLUSH); if (err == Z_STREAM_END) break; if (err == Z_NEED_DICT) { if (d_stream.adler != dictId) { fprintf(stderr, "unexpected dictionary"); exit(1); } err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary, sizeof(dictionary)); } CHECK_ERR(err, "inflate with dict"); } err = inflateEnd(&d_stream); CHECK_ERR(err, "inflateEnd"); if (strcmp((char*)uncompr, hello)) { fprintf(stderr, "bad inflate with dict\n"); exit(1); } else { printf("inflate with dictionary: %s\n", (char *)uncompr); } } /* =========================================================================== * Usage: example [output.gz [input.gz]] */ int main(argc, argv) int argc; char *argv[]; { Byte *compr, *uncompr; uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */ uLong uncomprLen = comprLen; static const char* myVersion = ZLIB_VERSION; if (zlibVersion()[0] != myVersion[0]) { fprintf(stderr, "incompatible zlib version\n"); exit(1); } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) { fprintf(stderr, "warning: different zlib version\n"); } printf("zlib version %s = 0x%04x, compile flags = 0x%lx\n", ZLIB_VERSION, ZLIB_VERNUM, zlibCompileFlags()); compr = (Byte*)calloc((uInt)comprLen, 1); uncompr = (Byte*)calloc((uInt)uncomprLen, 1); /* compr and uncompr are cleared to avoid reading uninitialized * data and to ensure that uncompr compresses well. */ if (compr == Z_NULL || uncompr == Z_NULL) { printf("out of memory\n"); exit(1); } test_compress(compr, comprLen, uncompr, uncomprLen); test_gzio((argc > 1 ? argv[1] : TESTFILE), uncompr, uncomprLen); test_deflate(compr, comprLen); test_inflate(compr, comprLen, uncompr, uncomprLen); test_large_deflate(compr, comprLen, uncompr, uncomprLen); test_large_inflate(compr, comprLen, uncompr, uncomprLen); test_flush(compr, &comprLen); test_sync(compr, comprLen, uncompr, uncomprLen); comprLen = uncomprLen; test_dict_deflate(compr, comprLen); test_dict_inflate(compr, comprLen, uncompr, uncomprLen); free(compr); free(uncompr); return 0; } gtkwave-3.3.86/src/libz/gzwrite.c0000664000175000017500000004546513166335473016210 0ustar bybellbybell/* gzwrite.c -- zlib functions for writing gzip files * Copyright (C) 2004-2017 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "gzguts.h" /* Local functions */ local int gz_init OF((gz_statep)); local int gz_comp OF((gz_statep, int)); local int gz_zero OF((gz_statep, z_off64_t)); local z_size_t gz_write OF((gz_statep, voidpc, z_size_t)); /* Initialize state for writing a gzip file. Mark initialization by setting state->size to non-zero. Return -1 on a memory allocation failure, or 0 on success. */ local int gz_init(state) gz_statep state; { int ret; z_streamp strm = &(state->strm); /* allocate input buffer (double size for gzprintf) */ state->in = (unsigned char *)malloc(state->want << 1); if (state->in == NULL) { gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } /* only need output buffer and deflate state if compressing */ if (!state->direct) { /* allocate output buffer */ state->out = (unsigned char *)malloc(state->want); if (state->out == NULL) { free(state->in); gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } /* allocate deflate memory, set up for gzip compression */ strm->zalloc = Z_NULL; strm->zfree = Z_NULL; strm->opaque = Z_NULL; ret = deflateInit2(strm, state->level, Z_DEFLATED, MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy); if (ret != Z_OK) { free(state->out); free(state->in); gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } strm->next_in = NULL; } /* mark state as initialized */ state->size = state->want; /* initialize write buffer if compressing */ if (!state->direct) { strm->avail_out = state->size; strm->next_out = state->out; state->x.next = strm->next_out; } return 0; } /* Compress whatever is at avail_in and next_in and write to the output file. Return -1 if there is an error writing to the output file or if gz_init() fails to allocate memory, otherwise 0. flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH, then the deflate() state is reset to start a new gzip stream. If gz->direct is true, then simply write to the output file without compressing, and ignore flush. */ local int gz_comp(state, flush) gz_statep state; int flush; { int ret, writ; unsigned have, put, max = ((unsigned)-1 >> 2) + 1; z_streamp strm = &(state->strm); /* allocate memory if this is the first time through */ if (state->size == 0 && gz_init(state) == -1) return -1; /* write directly if requested */ if (state->direct) { while (strm->avail_in) { put = strm->avail_in > max ? max : strm->avail_in; writ = write(state->fd, strm->next_in, put); if (writ < 0) { gz_error(state, Z_ERRNO, zstrerror()); return -1; } strm->avail_in -= (unsigned)writ; strm->next_in += writ; } return 0; } /* run deflate() on provided input until it produces no more output */ ret = Z_OK; do { /* write out current buffer contents if full, or if flushing, but if doing Z_FINISH then don't write until we get to Z_STREAM_END */ if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && (flush != Z_FINISH || ret == Z_STREAM_END))) { while (strm->next_out > state->x.next) { put = strm->next_out - state->x.next > (int)max ? max : (unsigned)(strm->next_out - state->x.next); writ = write(state->fd, state->x.next, put); if (writ < 0) { gz_error(state, Z_ERRNO, zstrerror()); return -1; } state->x.next += writ; } if (strm->avail_out == 0) { strm->avail_out = state->size; strm->next_out = state->out; state->x.next = state->out; } } /* compress */ have = strm->avail_out; ret = deflate(strm, flush); if (ret == Z_STREAM_ERROR) { gz_error(state, Z_STREAM_ERROR, "internal error: deflate stream corrupt"); return -1; } have -= strm->avail_out; } while (have); /* if that completed a deflate stream, allow another to start */ if (flush == Z_FINISH) deflateReset(strm); /* all done, no errors */ return 0; } /* Compress len zeros to output. Return -1 on a write error or memory allocation failure by gz_comp(), or 0 on success. */ local int gz_zero(state, len) gz_statep state; z_off64_t len; { int first; unsigned n; z_streamp strm = &(state->strm); /* consume whatever's left in the input buffer */ if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) return -1; /* compress len zeros (len guaranteed > 0) */ first = 1; while (len) { n = GT_OFF(state->size) || (z_off64_t)state->size > len ? (unsigned)len : state->size; if (first) { memset(state->in, 0, n); first = 0; } strm->avail_in = n; strm->next_in = state->in; state->x.pos += n; if (gz_comp(state, Z_NO_FLUSH) == -1) return -1; len -= n; } return 0; } /* Write len bytes from buf to file. Return the number of bytes written. If the returned value is less than len, then there was an error. */ local z_size_t gz_write(state, buf, len) gz_statep state; voidpc buf; z_size_t len; { z_size_t put = len; /* if len is zero, avoid unnecessary operations */ if (len == 0) return 0; /* allocate memory if this is the first time through */ if (state->size == 0 && gz_init(state) == -1) return 0; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) return 0; } /* for small len, copy to input buffer, otherwise compress directly */ if (len < state->size) { /* copy to input buffer, compress when full */ do { unsigned have, copy; if (state->strm.avail_in == 0) state->strm.next_in = state->in; have = (unsigned)((state->strm.next_in + state->strm.avail_in) - state->in); copy = state->size - have; if (copy > len) copy = len; memcpy(state->in + have, buf, copy); state->strm.avail_in += copy; state->x.pos += copy; buf = (const char *)buf + copy; len -= copy; if (len && gz_comp(state, Z_NO_FLUSH) == -1) return 0; } while (len); } else { /* consume whatever's left in the input buffer */ if (state->strm.avail_in && gz_comp(state, Z_NO_FLUSH) == -1) return 0; /* directly compress user buffer to file */ state->strm.next_in = (z_const Bytef *)buf; do { unsigned n = (unsigned)-1; if (n > len) n = len; state->strm.avail_in = n; state->x.pos += n; if (gz_comp(state, Z_NO_FLUSH) == -1) return 0; len -= n; } while (len); } /* input was all buffered or compressed */ return put; } /* -- see zlib.h -- */ int ZEXPORT gzwrite(file, buf, len) gzFile file; voidpc buf; unsigned len; { gz_statep state; /* get internal structure */ if (file == NULL) return 0; state = (gz_statep)file; /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) return 0; /* since an int is returned, make sure len fits in one, otherwise return with an error (this avoids a flaw in the interface) */ if ((int)len < 0) { gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); return 0; } /* write len bytes from buf (the return value will fit in an int) */ return (int)gz_write(state, buf, len); } /* -- see zlib.h -- */ z_size_t ZEXPORT gzfwrite(buf, size, nitems, file) voidpc buf; z_size_t size; z_size_t nitems; gzFile file; { z_size_t len; gz_statep state; /* get internal structure */ if (file == NULL) return 0; state = (gz_statep)file; /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) return 0; /* compute bytes to read -- error on overflow */ len = nitems * size; if (size && len / size != nitems) { gz_error(state, Z_STREAM_ERROR, "request does not fit in a size_t"); return 0; } /* write len bytes to buf, return the number of full items written */ return len ? gz_write(state, buf, len) / size : 0; } /* -- see zlib.h -- */ int ZEXPORT gzputc(file, c) gzFile file; int c; { unsigned have; unsigned char buf[1]; gz_statep state; z_streamp strm; /* get internal structure */ if (file == NULL) return -1; state = (gz_statep)file; strm = &(state->strm); /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) return -1; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) return -1; } /* try writing to input buffer for speed (state->size == 0 if buffer not initialized) */ if (state->size) { if (strm->avail_in == 0) strm->next_in = state->in; have = (unsigned)((strm->next_in + strm->avail_in) - state->in); if (have < state->size) { state->in[have] = (unsigned char)c; strm->avail_in++; state->x.pos++; return c & 0xff; } } /* no room in buffer or not initialized, use gz_write() */ buf[0] = (unsigned char)c; if (gz_write(state, buf, 1) != 1) return -1; return c & 0xff; } /* -- see zlib.h -- */ int ZEXPORT gzputs(file, str) gzFile file; const char *str; { int ret; z_size_t len; gz_statep state; /* get internal structure */ if (file == NULL) return -1; state = (gz_statep)file; /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) return -1; /* write string */ len = strlen(str); ret = gz_write(state, str, len); return ret == 0 && len != 0 ? -1 : ret; } #if defined(STDC) || defined(Z_HAVE_STDARG_H) #include /* -- see zlib.h -- */ int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) { int len; unsigned left; char *next; gz_statep state; z_streamp strm; /* get internal structure */ if (file == NULL) return Z_STREAM_ERROR; state = (gz_statep)file; strm = &(state->strm); /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) return Z_STREAM_ERROR; /* make sure we have some buffer space */ if (state->size == 0 && gz_init(state) == -1) return state->err; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) return state->err; } /* do the printf() into the input buffer, put length in len -- the input buffer is double-sized just for this function, so there is guaranteed to be state->size bytes available after the current contents */ if (strm->avail_in == 0) strm->next_in = state->in; next = (char *)(state->in + (strm->next_in - state->in) + strm->avail_in); next[state->size - 1] = 0; #ifdef NO_vsnprintf # ifdef HAS_vsprintf_void (void)vsprintf(next, format, va); for (len = 0; len < state->size; len++) if (next[len] == 0) break; # else len = vsprintf(next, format, va); # endif #else # ifdef HAS_vsnprintf_void (void)vsnprintf(next, state->size, format, va); len = strlen(next); # else len = vsnprintf(next, state->size, format, va); # endif #endif /* check that printf() results fit in buffer */ if (len == 0 || (unsigned)len >= state->size || next[state->size - 1] != 0) return 0; /* update buffer and position, compress first half if past that */ strm->avail_in += (unsigned)len; state->x.pos += len; if (strm->avail_in >= state->size) { left = strm->avail_in - state->size; strm->avail_in = state->size; if (gz_comp(state, Z_NO_FLUSH) == -1) return state->err; memcpy(state->in, state->in + state->size, left); strm->next_in = state->in; strm->avail_in = left; } return len; } int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) { va_list va; int ret; va_start(va, format); ret = gzvprintf(file, format, va); va_end(va); return ret; } #else /* !STDC && !Z_HAVE_STDARG_H */ /* -- see zlib.h -- */ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) gzFile file; const char *format; int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; { unsigned len, left; char *next; gz_statep state; z_streamp strm; /* get internal structure */ if (file == NULL) return Z_STREAM_ERROR; state = (gz_statep)file; strm = &(state->strm); /* check that can really pass pointer in ints */ if (sizeof(int) != sizeof(void *)) return Z_STREAM_ERROR; /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) return Z_STREAM_ERROR; /* make sure we have some buffer space */ if (state->size == 0 && gz_init(state) == -1) return state->error; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) return state->error; } /* do the printf() into the input buffer, put length in len -- the input buffer is double-sized just for this function, so there is guaranteed to be state->size bytes available after the current contents */ if (strm->avail_in == 0) strm->next_in = state->in; next = (char *)(strm->next_in + strm->avail_in); next[state->size - 1] = 0; #ifdef NO_snprintf # ifdef HAS_sprintf_void sprintf(next, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); for (len = 0; len < size; len++) if (next[len] == 0) break; # else len = sprintf(next, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); # endif #else # ifdef HAS_snprintf_void snprintf(next, state->size, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); len = strlen(next); # else len = snprintf(next, state->size, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); # endif #endif /* check that printf() results fit in buffer */ if (len == 0 || len >= state->size || next[state->size - 1] != 0) return 0; /* update buffer and position, compress first half if past that */ strm->avail_in += len; state->x.pos += len; if (strm->avail_in >= state->size) { left = strm->avail_in - state->size; strm->avail_in = state->size; if (gz_comp(state, Z_NO_FLUSH) == -1) return state->err; memcpy(state->in, state->in + state->size, left); strm->next_in = state->in; strm->avail_in = left; } return (int)len; } #endif /* -- see zlib.h -- */ int ZEXPORT gzflush(file, flush) gzFile file; int flush; { gz_statep state; /* get internal structure */ if (file == NULL) return Z_STREAM_ERROR; state = (gz_statep)file; /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) return Z_STREAM_ERROR; /* check flush parameter */ if (flush < 0 || flush > Z_FINISH) return Z_STREAM_ERROR; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) return state->err; } /* compress remaining data with requested flush */ (void)gz_comp(state, flush); return state->err; } /* -- see zlib.h -- */ int ZEXPORT gzsetparams(file, level, strategy) gzFile file; int level; int strategy; { gz_statep state; z_streamp strm; /* get internal structure */ if (file == NULL) return Z_STREAM_ERROR; state = (gz_statep)file; strm = &(state->strm); /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) return Z_STREAM_ERROR; /* if no change is requested, then do nothing */ if (level == state->level && strategy == state->strategy) return Z_OK; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) return state->err; } /* change compression parameters for subsequent input */ if (state->size) { /* flush previous input with previous parameters before changing */ if (strm->avail_in && gz_comp(state, Z_BLOCK) == -1) return state->err; deflateParams(strm, level, strategy); } state->level = level; state->strategy = strategy; return Z_OK; } /* -- see zlib.h -- */ int ZEXPORT gzclose_w(file) gzFile file; { int ret = Z_OK; gz_statep state; /* get internal structure */ if (file == NULL) return Z_STREAM_ERROR; state = (gz_statep)file; /* check that we're writing */ if (state->mode != GZ_WRITE) return Z_STREAM_ERROR; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) ret = state->err; } /* flush, free memory, and close file */ if (gz_comp(state, Z_FINISH) == -1) ret = state->err; if (state->size) { if (!state->direct) { (void)deflateEnd(&(state->strm)); free(state->out); } free(state->in); } gz_error(state, Z_OK, NULL); free(state->path); if (close(state->fd) == -1) ret = Z_ERRNO; free(state); return ret; } gtkwave-3.3.86/src/libz/adler32.c0000664000175000017500000001212413166335473015733 0ustar bybellbybell/* adler32.c -- compute the Adler-32 checksum of a data stream * Copyright (C) 1995-2011, 2016 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #include "zutil.h" local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); #define BASE 65521U /* largest prime smaller than 65536 */ #define NMAX 5552 /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ #define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} #define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); #define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); #define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); #define DO16(buf) DO8(buf,0); DO8(buf,8); /* use NO_DIVIDE if your processor does not do division in hardware -- try it both ways to see which is faster */ #ifdef NO_DIVIDE /* note that this assumes BASE is 65521, where 65536 % 65521 == 15 (thank you to John Reiser for pointing this out) */ # define CHOP(a) \ do { \ unsigned long tmp = a >> 16; \ a &= 0xffffUL; \ a += (tmp << 4) - tmp; \ } while (0) # define MOD28(a) \ do { \ CHOP(a); \ if (a >= BASE) a -= BASE; \ } while (0) # define MOD(a) \ do { \ CHOP(a); \ MOD28(a); \ } while (0) # define MOD63(a) \ do { /* this assumes a is not negative */ \ z_off64_t tmp = a >> 32; \ a &= 0xffffffffL; \ a += (tmp << 8) - (tmp << 5) + tmp; \ tmp = a >> 16; \ a &= 0xffffL; \ a += (tmp << 4) - tmp; \ tmp = a >> 16; \ a &= 0xffffL; \ a += (tmp << 4) - tmp; \ if (a >= BASE) a -= BASE; \ } while (0) #else # define MOD(a) a %= BASE # define MOD28(a) a %= BASE # define MOD63(a) a %= BASE #endif /* ========================================================================= */ uLong ZEXPORT adler32_z(adler, buf, len) uLong adler; const Bytef *buf; z_size_t len; { unsigned long sum2; unsigned n; /* split Adler-32 into component sums */ sum2 = (adler >> 16) & 0xffff; adler &= 0xffff; /* in case user likes doing a byte at a time, keep it fast */ if (len == 1) { adler += buf[0]; if (adler >= BASE) adler -= BASE; sum2 += adler; if (sum2 >= BASE) sum2 -= BASE; return adler | (sum2 << 16); } /* initial Adler-32 value (deferred check for len == 1 speed) */ if (buf == Z_NULL) return 1L; /* in case short lengths are provided, keep it somewhat fast */ if (len < 16) { while (len--) { adler += *buf++; sum2 += adler; } if (adler >= BASE) adler -= BASE; MOD28(sum2); /* only added so many BASE's */ return adler | (sum2 << 16); } /* do length NMAX blocks -- requires just one modulo operation */ while (len >= NMAX) { len -= NMAX; n = NMAX / 16; /* NMAX is divisible by 16 */ do { DO16(buf); /* 16 sums unrolled */ buf += 16; } while (--n); MOD(adler); MOD(sum2); } /* do remaining bytes (less than NMAX, still just one modulo) */ if (len) { /* avoid modulos if none remaining */ while (len >= 16) { len -= 16; DO16(buf); buf += 16; } while (len--) { adler += *buf++; sum2 += adler; } MOD(adler); MOD(sum2); } /* return recombined sums */ return adler | (sum2 << 16); } /* ========================================================================= */ uLong ZEXPORT adler32(adler, buf, len) uLong adler; const Bytef *buf; uInt len; { return adler32_z(adler, buf, len); } /* ========================================================================= */ local uLong adler32_combine_(adler1, adler2, len2) uLong adler1; uLong adler2; z_off64_t len2; { unsigned long sum1; unsigned long sum2; unsigned rem; /* for negative len, return invalid adler32 as a clue for debugging */ if (len2 < 0) return 0xffffffffUL; /* the derivation of this formula is left as an exercise for the reader */ MOD63(len2); /* assumes len2 >= 0 */ rem = (unsigned)len2; sum1 = adler1 & 0xffff; sum2 = rem * sum1; MOD(sum2); sum1 += (adler2 & 0xffff) + BASE - 1; sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; if (sum1 >= BASE) sum1 -= BASE; if (sum1 >= BASE) sum1 -= BASE; if (sum2 >= ((unsigned long)BASE << 1)) sum2 -= ((unsigned long)BASE << 1); if (sum2 >= BASE) sum2 -= BASE; return sum1 | (sum2 << 16); } /* ========================================================================= */ uLong ZEXPORT adler32_combine(adler1, adler2, len2) uLong adler1; uLong adler2; z_off_t len2; { return adler32_combine_(adler1, adler2, len2); } uLong ZEXPORT adler32_combine64(adler1, adler2, len2) uLong adler1; uLong adler2; z_off64_t len2; { return adler32_combine_(adler1, adler2, len2); } gtkwave-3.3.86/src/libz/infback.c0000664000175000017500000005427313166335473016107 0ustar bybellbybell/* infback.c -- inflate using a call-back interface * Copyright (C) 1995-2016 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* This code is largely copied from inflate.c. Normally either infback.o or inflate.o would be linked into an application--not both. The interface with inffast.c is retained so that optimized assembler-coded versions of inflate_fast() can be used with either inflate.c or infback.c. */ #include "zutil.h" #include "inftrees.h" #include "inflate.h" #include "inffast.h" /* function prototypes */ local void fixedtables OF((struct inflate_state FAR *state)); /* strm provides memory allocation functions in zalloc and zfree, or Z_NULL to use the library memory allocation functions. windowBits is in the range 8..15, and window is a user-supplied window and output buffer that is 2**windowBits bytes. */ int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) z_streamp strm; int windowBits; unsigned char FAR *window; const char *version; int stream_size; { struct inflate_state FAR *state; if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || stream_size != (int)(sizeof(z_stream))) return Z_VERSION_ERROR; if (strm == Z_NULL || window == Z_NULL || windowBits < 8 || windowBits > 15) return Z_STREAM_ERROR; strm->msg = Z_NULL; /* in case we return an error */ if (strm->zalloc == (alloc_func)0) { #ifdef Z_SOLO return Z_STREAM_ERROR; #else strm->zalloc = zcalloc; strm->opaque = (voidpf)0; #endif } if (strm->zfree == (free_func)0) #ifdef Z_SOLO return Z_STREAM_ERROR; #else strm->zfree = zcfree; #endif state = (struct inflate_state FAR *)ZALLOC(strm, 1, sizeof(struct inflate_state)); if (state == Z_NULL) return Z_MEM_ERROR; Tracev((stderr, "inflate: allocated\n")); strm->state = (struct internal_state FAR *)state; state->dmax = 32768U; state->wbits = (uInt)windowBits; state->wsize = 1U << windowBits; state->window = window; state->wnext = 0; state->whave = 0; return Z_OK; } /* Return state with length and distance decoding tables and index sizes set to fixed code decoding. Normally this returns fixed tables from inffixed.h. If BUILDFIXED is defined, then instead this routine builds the tables the first time it's called, and returns those tables the first time and thereafter. This reduces the size of the code by about 2K bytes, in exchange for a little execution time. However, BUILDFIXED should not be used for threaded applications, since the rewriting of the tables and virgin may not be thread-safe. */ local void fixedtables(state) struct inflate_state FAR *state; { #ifdef BUILDFIXED static int virgin = 1; static code *lenfix, *distfix; static code fixed[544]; /* build fixed huffman tables if first call (may not be thread safe) */ if (virgin) { unsigned sym, bits; static code *next; /* literal/length table */ sym = 0; while (sym < 144) state->lens[sym++] = 8; while (sym < 256) state->lens[sym++] = 9; while (sym < 280) state->lens[sym++] = 7; while (sym < 288) state->lens[sym++] = 8; next = fixed; lenfix = next; bits = 9; inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); /* distance table */ sym = 0; while (sym < 32) state->lens[sym++] = 5; distfix = next; bits = 5; inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); /* do this just once */ virgin = 0; } #else /* !BUILDFIXED */ # include "inffixed.h" #endif /* BUILDFIXED */ state->lencode = lenfix; state->lenbits = 9; state->distcode = distfix; state->distbits = 5; } /* Macros for inflateBack(): */ /* Load returned state from inflate_fast() */ #define LOAD() \ do { \ put = strm->next_out; \ left = strm->avail_out; \ next = strm->next_in; \ have = strm->avail_in; \ hold = state->hold; \ bits = state->bits; \ } while (0) /* Set state from registers for inflate_fast() */ #define RESTORE() \ do { \ strm->next_out = put; \ strm->avail_out = left; \ strm->next_in = next; \ strm->avail_in = have; \ state->hold = hold; \ state->bits = bits; \ } while (0) /* Clear the input bit accumulator */ #define INITBITS() \ do { \ hold = 0; \ bits = 0; \ } while (0) /* Assure that some input is available. If input is requested, but denied, then return a Z_BUF_ERROR from inflateBack(). */ #define PULL() \ do { \ if (have == 0) { \ have = in(in_desc, &next); \ if (have == 0) { \ next = Z_NULL; \ ret = Z_BUF_ERROR; \ goto inf_leave; \ } \ } \ } while (0) /* Get a byte of input into the bit accumulator, or return from inflateBack() with an error if there is no input available. */ #define PULLBYTE() \ do { \ PULL(); \ have--; \ hold += (unsigned long)(*next++) << bits; \ bits += 8; \ } while (0) /* Assure that there are at least n bits in the bit accumulator. If there is not enough available input to do that, then return from inflateBack() with an error. */ #define NEEDBITS(n) \ do { \ while (bits < (unsigned)(n)) \ PULLBYTE(); \ } while (0) /* Return the low n bits of the bit accumulator (n < 16) */ #define BITS(n) \ ((unsigned)hold & ((1U << (n)) - 1)) /* Remove n bits from the bit accumulator */ #define DROPBITS(n) \ do { \ hold >>= (n); \ bits -= (unsigned)(n); \ } while (0) /* Remove zero to seven bits as needed to go to a byte boundary */ #define BYTEBITS() \ do { \ hold >>= bits & 7; \ bits -= bits & 7; \ } while (0) /* Assure that some output space is available, by writing out the window if it's full. If the write fails, return from inflateBack() with a Z_BUF_ERROR. */ #define ROOM() \ do { \ if (left == 0) { \ put = state->window; \ left = state->wsize; \ state->whave = left; \ if (out(out_desc, put, left)) { \ ret = Z_BUF_ERROR; \ goto inf_leave; \ } \ } \ } while (0) /* strm provides the memory allocation functions and window buffer on input, and provides information on the unused input on return. For Z_DATA_ERROR returns, strm will also provide an error message. in() and out() are the call-back input and output functions. When inflateBack() needs more input, it calls in(). When inflateBack() has filled the window with output, or when it completes with data in the window, it calls out() to write out the data. The application must not change the provided input until in() is called again or inflateBack() returns. The application must not change the window/output buffer until inflateBack() returns. in() and out() are called with a descriptor parameter provided in the inflateBack() call. This parameter can be a structure that provides the information required to do the read or write, as well as accumulated information on the input and output such as totals and check values. in() should return zero on failure. out() should return non-zero on failure. If either in() or out() fails, than inflateBack() returns a Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it was in() or out() that caused in the error. Otherwise, inflateBack() returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format error, or Z_MEM_ERROR if it could not allocate memory for the state. inflateBack() can also return Z_STREAM_ERROR if the input parameters are not correct, i.e. strm is Z_NULL or the state was not initialized. */ int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) z_streamp strm; in_func in; void FAR *in_desc; out_func out; void FAR *out_desc; { struct inflate_state FAR *state; z_const unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ unsigned have, left; /* available input and output */ unsigned long hold; /* bit buffer */ unsigned bits; /* bits in bit buffer */ unsigned copy; /* number of stored or match bytes to copy */ unsigned char FAR *from; /* where to copy match bytes from */ code here; /* current decoding table entry */ code last; /* parent table entry */ unsigned len; /* length to copy for repeats, bits to drop */ int ret; /* return code */ static const unsigned short order[19] = /* permutation of code lengths */ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; /* Check that the strm exists and that the state was initialized */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; /* Reset the state */ strm->msg = Z_NULL; state->mode = TYPE; state->last = 0; state->whave = 0; next = strm->next_in; have = next != Z_NULL ? strm->avail_in : 0; hold = 0; bits = 0; put = state->window; left = state->wsize; /* Inflate until end of block marked as last */ for (;;) switch (state->mode) { case TYPE: /* determine and dispatch block type */ if (state->last) { BYTEBITS(); state->mode = DONE; break; } NEEDBITS(3); state->last = BITS(1); DROPBITS(1); switch (BITS(2)) { case 0: /* stored block */ Tracev((stderr, "inflate: stored block%s\n", state->last ? " (last)" : "")); state->mode = STORED; break; case 1: /* fixed block */ fixedtables(state); Tracev((stderr, "inflate: fixed codes block%s\n", state->last ? " (last)" : "")); state->mode = LEN; /* decode codes */ break; case 2: /* dynamic block */ Tracev((stderr, "inflate: dynamic codes block%s\n", state->last ? " (last)" : "")); state->mode = TABLE; break; case 3: strm->msg = (char *)"invalid block type"; state->mode = BAD; } DROPBITS(2); break; case STORED: /* get and verify stored block length */ BYTEBITS(); /* go to byte boundary */ NEEDBITS(32); if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { strm->msg = (char *)"invalid stored block lengths"; state->mode = BAD; break; } state->length = (unsigned)hold & 0xffff; Tracev((stderr, "inflate: stored length %u\n", state->length)); INITBITS(); /* copy stored block from input to output */ while (state->length != 0) { copy = state->length; PULL(); ROOM(); if (copy > have) copy = have; if (copy > left) copy = left; zmemcpy(put, next, copy); have -= copy; next += copy; left -= copy; put += copy; state->length -= copy; } Tracev((stderr, "inflate: stored end\n")); state->mode = TYPE; break; case TABLE: /* get dynamic table entries descriptor */ NEEDBITS(14); state->nlen = BITS(5) + 257; DROPBITS(5); state->ndist = BITS(5) + 1; DROPBITS(5); state->ncode = BITS(4) + 4; DROPBITS(4); #ifndef PKZIP_BUG_WORKAROUND if (state->nlen > 286 || state->ndist > 30) { strm->msg = (char *)"too many length or distance symbols"; state->mode = BAD; break; } #endif Tracev((stderr, "inflate: table sizes ok\n")); /* get code length code lengths (not a typo) */ state->have = 0; while (state->have < state->ncode) { NEEDBITS(3); state->lens[order[state->have++]] = (unsigned short)BITS(3); DROPBITS(3); } while (state->have < 19) state->lens[order[state->have++]] = 0; state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 7; ret = inflate_table(CODES, state->lens, 19, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid code lengths set"; state->mode = BAD; break; } Tracev((stderr, "inflate: code lengths ok\n")); /* get length and distance code code lengths */ state->have = 0; while (state->have < state->nlen + state->ndist) { for (;;) { here = state->lencode[BITS(state->lenbits)]; if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } if (here.val < 16) { DROPBITS(here.bits); state->lens[state->have++] = here.val; } else { if (here.val == 16) { NEEDBITS(here.bits + 2); DROPBITS(here.bits); if (state->have == 0) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } len = (unsigned)(state->lens[state->have - 1]); copy = 3 + BITS(2); DROPBITS(2); } else if (here.val == 17) { NEEDBITS(here.bits + 3); DROPBITS(here.bits); len = 0; copy = 3 + BITS(3); DROPBITS(3); } else { NEEDBITS(here.bits + 7); DROPBITS(here.bits); len = 0; copy = 11 + BITS(7); DROPBITS(7); } if (state->have + copy > state->nlen + state->ndist) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } while (copy--) state->lens[state->have++] = (unsigned short)len; } } /* handle error breaks in while */ if (state->mode == BAD) break; /* check for end-of-block code (better have one) */ if (state->lens[256] == 0) { strm->msg = (char *)"invalid code -- missing end-of-block"; state->mode = BAD; break; } /* build code tables -- note: do not change the lenbits or distbits values here (9 and 6) without reading the comments in inftrees.h concerning the ENOUGH constants, which depend on those values */ state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 9; ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid literal/lengths set"; state->mode = BAD; break; } state->distcode = (code const FAR *)(state->next); state->distbits = 6; ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); if (ret) { strm->msg = (char *)"invalid distances set"; state->mode = BAD; break; } Tracev((stderr, "inflate: codes ok\n")); state->mode = LEN; case LEN: /* use inflate_fast() if we have enough input and output */ if (have >= 6 && left >= 258) { RESTORE(); if (state->whave < state->wsize) state->whave = state->wsize - left; inflate_fast(strm, state->wsize); LOAD(); break; } /* get a literal, length, or end-of-block code */ for (;;) { here = state->lencode[BITS(state->lenbits)]; if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } if (here.op && (here.op & 0xf0) == 0) { last = here; for (;;) { here = state->lencode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + here.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } DROPBITS(here.bits); state->length = (unsigned)here.val; /* process literal */ if (here.op == 0) { Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", here.val)); ROOM(); *put++ = (unsigned char)(state->length); left--; state->mode = LEN; break; } /* process end of block */ if (here.op & 32) { Tracevv((stderr, "inflate: end of block\n")); state->mode = TYPE; break; } /* invalid code */ if (here.op & 64) { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } /* length code -- get extra bits, if any */ state->extra = (unsigned)(here.op) & 15; if (state->extra != 0) { NEEDBITS(state->extra); state->length += BITS(state->extra); DROPBITS(state->extra); } Tracevv((stderr, "inflate: length %u\n", state->length)); /* get distance code */ for (;;) { here = state->distcode[BITS(state->distbits)]; if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } if ((here.op & 0xf0) == 0) { last = here; for (;;) { here = state->distcode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + here.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } DROPBITS(here.bits); if (here.op & 64) { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } state->offset = (unsigned)here.val; /* get distance extra bits, if any */ state->extra = (unsigned)(here.op) & 15; if (state->extra != 0) { NEEDBITS(state->extra); state->offset += BITS(state->extra); DROPBITS(state->extra); } if (state->offset > state->wsize - (state->whave < state->wsize ? left : 0)) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } Tracevv((stderr, "inflate: distance %u\n", state->offset)); /* copy match from window to output */ do { ROOM(); copy = state->wsize - state->offset; if (copy < left) { from = put + copy; copy = left - copy; } else { from = put - state->offset; copy = left; } if (copy > state->length) copy = state->length; state->length -= copy; left -= copy; do { *put++ = *from++; } while (--copy); } while (state->length != 0); break; case DONE: /* inflate stream terminated properly -- write leftover output */ ret = Z_STREAM_END; if (left < state->wsize) { if (out(out_desc, state->window, state->wsize - left)) ret = Z_BUF_ERROR; } goto inf_leave; case BAD: ret = Z_DATA_ERROR; goto inf_leave; default: /* can't happen, but makes compilers happy */ ret = Z_STREAM_ERROR; goto inf_leave; } /* Return unused input */ inf_leave: strm->next_in = next; strm->avail_in = have; return ret; } int ZEXPORT inflateBackEnd(strm) z_streamp strm; { if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) return Z_STREAM_ERROR; ZFREE(strm, strm->state); strm->state = Z_NULL; Tracev((stderr, "inflate: end\n")); return Z_OK; } gtkwave-3.3.86/src/libz/inffast.h0000664000175000017500000000065313166335473016142 0ustar bybellbybell/* inffast.h -- header to use inffast.c * Copyright (C) 1995-2003, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); gtkwave-3.3.86/src/libz/inffixed.h0000664000175000017500000001427413166335473016310 0ustar bybellbybell /* inffixed.h -- table for decoding fixed codes * Generated automatically by makefixed(). */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of this library and is subject to change. Applications should only use zlib.h. */ static const code lenfix[512] = { {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, {0,9,255} }; static const code distfix[32] = { {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, {22,5,193},{64,5,0} }; gtkwave-3.3.86/src/libz/Makefile.in0000664000175000017500000004470513166335473016412 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = src/libz DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libz_a_AR = $(AR) $(ARFLAGS) libz_a_LIBADD = am_libz_a_OBJECTS = adler32.$(OBJEXT) gzread.$(OBJEXT) trees.$(OBJEXT) \ zutil.$(OBJEXT) compress.$(OBJEXT) example.$(OBJEXT) \ gzwrite.$(OBJEXT) inflate.$(OBJEXT) crc32.$(OBJEXT) \ gzclose.$(OBJEXT) infback.$(OBJEXT) uncompr.$(OBJEXT) \ inffast.$(OBJEXT) inftrees.$(OBJEXT) deflate.$(OBJEXT) \ gzlib.$(OBJEXT) libz_a_OBJECTS = $(am_libz_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libz_a_SOURCES) DIST_SOURCES = $(libz_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libz.a AM_CFLAGS = -DNO_VIZ libz_a_SOURCES = adler32.c deflate.h gzread.c inffixed.h trees.c zutil.c \ compress.c example.c gzwrite.c inflate.c trees.h zutil.h \ crc32.c gzclose.c infback.c inflate.h uncompr.c \ crc32.h gzguts.h inffast.c inftrees.c zconf.h \ deflate.c gzlib.c inffast.h inftrees.h zlib.h EXTRA_DIST = README all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/libz/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/libz/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libz.a: $(libz_a_OBJECTS) $(libz_a_DEPENDENCIES) $(EXTRA_libz_a_DEPENDENCIES) $(AM_V_at)-rm -f libz.a $(AM_V_AR)$(libz_a_AR) libz.a $(libz_a_OBJECTS) $(libz_a_LIBADD) $(AM_V_at)$(RANLIB) libz.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adler32.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compress.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crc32.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/deflate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/example.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gzclose.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gzlib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gzread.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gzwrite.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/infback.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inffast.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inflate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inftrees.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trees.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uncompr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zutil.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/src/timeentry.c0000664000175000017500000001306513166335473015564 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2016 * * 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. */ #include #include "globals.h" #include #include "gtk12compat.h" #include "symbol.h" #include "debug.h" void update_endcap_times_for_partial_vcd(void) { char str[40]; if(GLOBALS->from_entry) { reformat_time(str, GLOBALS->tims.first + GLOBALS->global_time_offset, GLOBALS->time_dimension); gtk_entry_set_text(GTK_ENTRY(GLOBALS->from_entry),str); gtkwavetcl_setvar(WAVE_TCLCB_FROM_ENTRY_UPDATED, str, WAVE_TCLCB_FROM_ENTRY_UPDATED_FLAGS); } if(GLOBALS->to_entry) { reformat_time(str, GLOBALS->tims.last + GLOBALS->global_time_offset, GLOBALS->time_dimension); gtk_entry_set_text(GTK_ENTRY(GLOBALS->to_entry),str); gtkwavetcl_setvar(WAVE_TCLCB_TO_ENTRY_UPDATED, str, WAVE_TCLCB_TO_ENTRY_UPDATED_FLAGS); } } void time_update(void) { DEBUG(printf("Timeentry Configure Event\n")); calczoom(GLOBALS->tims.zoom); fix_wavehadj(); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "changed"); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "value_changed"); } void from_entry_callback(GtkWidget *widget, GtkWidget *entry) { (void)widget; G_CONST_RETURN gchar *entry_text; TimeType newlo; char fromstr[40]; entry_text=gtk_entry_get_text(GTK_ENTRY(entry)); entry_text = entry_text ? entry_text : ""; DEBUG(printf("From Entry contents: %s\n",entry_text)); newlo=unformat_time(entry_text, GLOBALS->time_dimension); newlo -= GLOBALS->global_time_offset; if(newlomin_time) { newlo=GLOBALS->min_time; } if(newlo<(GLOBALS->tims.last)) { GLOBALS->tims.first=newlo; if(GLOBALS->tims.starttims.first) GLOBALS->tims.timecache=GLOBALS->tims.start=GLOBALS->tims.first; reformat_time(fromstr, GLOBALS->tims.first + GLOBALS->global_time_offset, GLOBALS->time_dimension); gtk_entry_set_text(GTK_ENTRY(entry),fromstr); time_update(); gtkwavetcl_setvar(WAVE_TCLCB_FROM_ENTRY_UPDATED, fromstr, WAVE_TCLCB_FROM_ENTRY_UPDATED_FLAGS); return; } else { reformat_time(fromstr, GLOBALS->tims.first + GLOBALS->global_time_offset, GLOBALS->time_dimension); gtk_entry_set_text(GTK_ENTRY(entry),fromstr); gtkwavetcl_setvar(WAVE_TCLCB_FROM_ENTRY_UPDATED, fromstr, WAVE_TCLCB_FROM_ENTRY_UPDATED_FLAGS); return; } } void to_entry_callback(GtkWidget *widget, GtkWidget *entry) { (void)widget; G_CONST_RETURN gchar *entry_text; TimeType newhi; char tostr[40]; entry_text=gtk_entry_get_text(GTK_ENTRY(entry)); entry_text = entry_text ? entry_text : ""; DEBUG(printf("To Entry contents: %s\n",entry_text)); newhi=unformat_time(entry_text, GLOBALS->time_dimension); newhi -= GLOBALS->global_time_offset; if((newhi>GLOBALS->max_time) || (!strlen(entry_text))) /* null string makes max time */ { newhi=GLOBALS->max_time; } if(newhi>(GLOBALS->tims.first)) { GLOBALS->tims.last=newhi; reformat_time(tostr, GLOBALS->tims.last + GLOBALS->global_time_offset, GLOBALS->time_dimension); gtk_entry_set_text(GTK_ENTRY(entry),tostr); time_update(); gtkwavetcl_setvar(WAVE_TCLCB_TO_ENTRY_UPDATED, tostr, WAVE_TCLCB_TO_ENTRY_UPDATED_FLAGS); return; } else { reformat_time(tostr, GLOBALS->tims.last + GLOBALS->global_time_offset, GLOBALS->time_dimension); gtk_entry_set_text(GTK_ENTRY(entry),tostr); gtkwavetcl_setvar(WAVE_TCLCB_TO_ENTRY_UPDATED, tostr, WAVE_TCLCB_TO_ENTRY_UPDATED_FLAGS); return; } } /* Create an entry box */ GtkWidget * create_entry_box(void) { GtkWidget *label, *label2; GtkWidget *box, *box2; GtkWidget *mainbox; char fromstr[32], tostr[32]; GtkTooltips *tooltips; tooltips=gtk_tooltips_new_2(); gtk_tooltips_set_delay_2(tooltips,1500); label=gtk_label_new("From:"); GLOBALS->from_entry=gtk_entry_new_with_max_length(40); reformat_time(fromstr, GLOBALS->min_time + GLOBALS->global_time_offset, GLOBALS->time_dimension); gtk_entry_set_text(GTK_ENTRY(GLOBALS->from_entry),fromstr); gtk_signal_connect (GTK_OBJECT (GLOBALS->from_entry), "activate",GTK_SIGNAL_FUNC (from_entry_callback), GLOBALS->from_entry); box=gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 0); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(box), GLOBALS->from_entry, TRUE, TRUE, 0); gtk_widget_set_usize(GTK_WIDGET(GLOBALS->from_entry), 90, 22); gtk_tooltips_set_tip_2(tooltips, GLOBALS->from_entry, "Scroll Lower Bound (use MX for named marker X)", NULL); gtk_widget_show(GLOBALS->from_entry); label2=gtk_label_new("To:"); GLOBALS->to_entry=gtk_entry_new_with_max_length(40); reformat_time(tostr, GLOBALS->max_time + GLOBALS->global_time_offset, GLOBALS->time_dimension); gtk_entry_set_text(GTK_ENTRY(GLOBALS->to_entry),tostr); gtk_signal_connect (GTK_OBJECT (GLOBALS->to_entry), "activate",GTK_SIGNAL_FUNC (to_entry_callback), GLOBALS->to_entry); box2=gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(box2), label2, TRUE, TRUE, 0); gtk_widget_show(label2); gtk_box_pack_start(GTK_BOX(box2), GLOBALS->to_entry, TRUE, TRUE, 0); gtk_widget_set_usize(GTK_WIDGET(GLOBALS->to_entry), 90, 22); gtk_tooltips_set_tip_2(tooltips, GLOBALS->to_entry, "Scroll Upper Bound (use MX for named marker X)", NULL); gtk_widget_show(GLOBALS->to_entry); if(!GLOBALS->use_toolbutton_interface) { mainbox=gtk_vbox_new(FALSE, 0); } else { mainbox=gtk_hbox_new(FALSE, 0); } gtk_box_pack_start(GTK_BOX(mainbox), box, TRUE, FALSE, 1); gtk_widget_show(box); gtk_box_pack_start(GTK_BOX(mainbox), box2, TRUE, FALSE, 1); gtk_widget_show(box2); return(mainbox); } gtkwave-3.3.86/src/color.h0000664000175000017500000000434413166335473014667 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2011. * * 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. */ #include "globals.h" #ifndef WAVE_COLOR_H #define WAVE_COLOR_H #include #include #define WAVE_COLOR_CYCLE (-1) #define WAVE_COLOR_NORMAL (0) #define WAVE_COLOR_RED (1) #define WAVE_COLOR_ORANGE (2) #define WAVE_COLOR_YELLOW (3) #define WAVE_COLOR_GREEN (4) #define WAVE_COLOR_BLUE (5) #define WAVE_COLOR_INDIGO (6) #define WAVE_COLOR_VIOLET (7) #define WAVE_NUM_RAINBOW (7) #define WAVE_RAINBOW_RGB {0xFF0000, 0xFF7F00, 0xFFFF00, 0x00FF00, 0x0000FF, 0x6600FF, 0x9B00FF} #define WAVE_RAINBOW_INITIALIZER {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL} struct wave_gcmaster_t { GdkGC *gc_ltgray; GdkGC *gc_normal; GdkGC *gc_mdgray; GdkGC *gc_dkgray; GdkGC *gc_dkblue; GdkGC *gc_brkred; GdkGC *gc_ltblue; GdkGC *gc_gmstrd; GdkGC *gc_back_wavewindow_c_1; GdkGC *gc_baseline_wavewindow_c_1; GdkGC *gc_grid_wavewindow_c_1; GdkGC *gc_grid2_wavewindow_c_1; GdkGC *gc_time_wavewindow_c_1; GdkGC *gc_timeb_wavewindow_c_1; GdkGC *gc_value_wavewindow_c_1; GdkGC *gc_low_wavewindow_c_1; GdkGC *gc_highfill_wavewindow_c_1; GdkGC *gc_high_wavewindow_c_1; GdkGC *gc_trans_wavewindow_c_1; GdkGC *gc_mid_wavewindow_c_1; GdkGC *gc_xfill_wavewindow_c_1; GdkGC *gc_x_wavewindow_c_1; GdkGC *gc_vbox_wavewindow_c_1; GdkGC *gc_vtrans_wavewindow_c_1; GdkGC *gc_mark_wavewindow_c_1; GdkGC *gc_umark_wavewindow_c_1; GdkGC *gc_0_wavewindow_c_1; GdkGC *gc_1fill_wavewindow_c_1; GdkGC *gc_1_wavewindow_c_1; GdkGC *gc_ufill_wavewindow_c_1; GdkGC *gc_u_wavewindow_c_1; GdkGC *gc_wfill_wavewindow_c_1; GdkGC *gc_w_wavewindow_c_1; GdkGC *gc_dashfill_wavewindow_c_1; GdkGC *gc_dash_wavewindow_c_1; }; struct wave_gcchain_t { struct wave_gcchain_t*next; GdkGC *gc; }; GdkGC *alloc_color(GtkWidget *widget, int tuple, GdkGC *fallback); /* tuple is encoded as 32bit: --RRGGBB (>=0 is valid) */ void dealloc_all_gcs(void); /* when tab is destroyed */ void set_alternate_gcs(GdkGC *ctx, GdkGC *ctx_fill); /* when another t_color is encountered */ #endif gtkwave-3.3.86/src/vcd_keywords.gperf0000664000175000017500000000160113166335473017121 0ustar bybellbybell%{ /* AIX may need this for alloca to work */ #if defined _AIX #pragma alloca #endif #include #include #include "vcd.h" struct vcd_keyword { const char *name; int token; }; %} struct vcd_keyword %% event, V_EVENT parameter, V_PARAMETER integer, V_INTEGER real, V_REAL real_parameter, V_REAL_PARAMETER realtime, V_REALTIME reg, V_REG supply0, V_SUPPLY0 supply1, V_SUPPLY1 time, V_TIME tri, V_TRI triand, V_TRIAND trior, V_TRIOR trireg, V_TRIREG tri0, V_TRI0 tri1, V_TRI1 wand, V_WAND wire, V_WIRE wor, V_WOR port, V_PORT in, V_IN out, V_OUT inout, V_INOUT string, V_STRINGTYPE bit, V_BIT logic, V_LOGIC int, V_INT shortint, V_SHORTINT longint, V_LONGINT byte, V_BYTE enum, V_ENUM shortreal, V_SHORTREAL $end, V_END %% int vcd_keyword_code(const char *s, unsigned int len) { const struct vcd_keyword *rc = check_identifier(s, len); return(rc ? rc->token : V_STRING); } gtkwave-3.3.86/src/analyzer.c0000664000175000017500000010034313166335473015365 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2016. * * 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. */ /* AIX may need this for alloca to work */ #if defined _AIX #pragma alloca #endif #include "globals.h" #include #include #include #include #include "symbol.h" #include "lxt.h" #include "debug.h" #include "bsearch.h" #include "strace.h" #include "translate.h" #include "ptranslate.h" #include "ttranslate.h" #include "hierpack.h" #include "analyzer.h" #ifdef _MSC_VER #define strcasecmp _stricmp #endif void UpdateTraceSelection(Trptr t); int traverse_vector_nodes(Trptr t); /* * extract last n levels of hierarchy */ char *hier_extract(char *pnt, int levels) { int i, len; char ch, *pnt2, *esc; char only_nums_so_far=1; if(!pnt) return(NULL); len=strlen(pnt); if(!len) return(pnt); if(levels<1) levels=1; if((!GLOBALS->hier_ignore_escapes) &&(esc=strchr(pnt, '\\'))) { return((levels==1) ? esc : pnt); /* shortcut out on escape IDs: level=1, esc char else all */ } pnt2=pnt+len-1; /* ch=*pnt2; */ /* scan-build : useless given loop below */ for(i=0;i='0')&&(ch<='9')) /* skip 1st set of signal.number hier from right if it exists */ { continue; /* nothing */ } else { if(ch==GLOBALS->hier_delimeter) { if(!only_nums_so_far) levels--; if(!levels) { pnt2+=2; return(pnt2); } } only_nums_so_far=0; } } return(pnt); /* not as many levels as max, so give the full name.. */ } void updateTraceGroup(Trptr t) { /* t->t_match = NULL; */ if (t->t_prev) { if (IsGroupBegin(t->t_prev)) { if (IsGroupEnd(t)) { /* empty group */ Trptr g_begin = t->t_prev; t->t_grp = g_begin->t_grp; t->t_match = g_begin; g_begin->t_match = t; } else { /* first trace in group */ t->t_grp = t->t_prev; } } else { if (IsGroupEnd(t)) { Trptr g_begin = t->t_prev->t_grp; if(g_begin) /* scan-build */ { t->t_grp = g_begin->t_grp; t->t_match = g_begin; g_begin->t_match = t; } } else { t->t_grp = t->t_prev->t_grp; } } } else { /* very first trace */ t->t_grp = NULL; } if ((t->t_grp) && IsSelected(t->t_grp)) { t->flags |= TR_HIGHLIGHT; } } void CloseTrace(Trptr t) { GLOBALS->traces.dirty = 1; if (IsGroupBegin(t)) { t->flags |= TR_CLOSED; if (t->t_match) { t->t_match->flags |= TR_CLOSED; }; if (!HasWave(t)) { /* Group End */ if (t->t_match) { t->t_match->flags |= TR_COLLAPSED; }; } else { /* Composite End */ if (t->t_match) { t->t_match->flags |= TR_COLLAPSED; }; } } if (IsGroupEnd(t)) { t->flags |= TR_CLOSED; if (t->t_match) { t->t_match->flags |= TR_CLOSED; }; if ((t->t_match) && !HasWave(t->t_match)) { /* Group End */ t->flags |= TR_COLLAPSED; } else { /* Composite End */ t->flags |= TR_COLLAPSED; } } } void OpenTrace(Trptr t) { GLOBALS->traces.dirty = 1; if (IsGroupBegin(t) || IsGroupEnd(t)) { t->flags &= ~TR_CLOSED; if (t->t_match) { t->t_match->flags &= ~TR_CLOSED; }; if (!HasWave(t)) { t->flags &= ~TR_COLLAPSED; if(t->t_match) { t->t_match->flags &= ~TR_COLLAPSED; }; } } } void ClearTraces(void) { Trptr t = GLOBALS->traces.first; while(t) { t->flags &= ~TR_HIGHLIGHT; t=t->t_next; } GLOBALS->traces.dirty = 1; } void ClearGroupTraces(Trptr t_grp) { if (IsGroupBegin(t_grp)) { Trptr t = t_grp; while(t) { t->flags &= ~TR_HIGHLIGHT; if(t->t_match == t_grp) break; t=t->t_next; } GLOBALS->traces.dirty = 1; } else { fprintf(stderr, "INTERNAL ERROR: ClearGroupTrace applied to non-group! Exiting.\n"); exit(255); } } /* * Add a trace to the display... */ static void AddTrace( Trptr t ) { GLOBALS->traces.dirty = 1; t->t_fpdecshift = GLOBALS->default_fpshift; if((GLOBALS->which_t_color > 0) && (GLOBALS->which_t_color <= WAVE_NUM_RAINBOW)) { t->t_color = GLOBALS->which_t_color; GLOBALS->which_t_color = 0; } if(GLOBALS->default_flags&TR_NUMMASK) t->flags=GLOBALS->default_flags; else t->flags=(t->flags&TR_NUMMASK)|GLOBALS->default_flags; if(GLOBALS->default_flags & TR_FTRANSLATED) { t->f_filter = GLOBALS->current_translate_file; } else if(GLOBALS->default_flags & TR_PTRANSLATED) { t->p_filter = GLOBALS->current_translate_proc; } /* NOT an else! */ if(GLOBALS->default_flags & TR_TTRANSLATED) { t->t_filter = GLOBALS->current_translate_ttrans; if(t->t_filter) { if(!t->vector) { bvptr v; int cache_hi = t->flags & TR_HIGHLIGHT; t->flags |= TR_HIGHLIGHT; v = combine_traces(1, t); /* down: make single signal a vector */ if(v) { v->transaction_nd = t->n.nd; /* cache for savefile, disable */ t->vector = 1; t->n.vec = v; /* splice in */ } t->flags &= ~TR_HIGHLIGHT; t->flags |= cache_hi; } if(GLOBALS->ttranslate_args) { t->transaction_args = strdup_2(GLOBALS->ttranslate_args); } else { t->transaction_args = NULL; } traverse_vector_nodes(t); } else { t->flags &= ~TR_TTRANSLATED; /* malformed filter syntax? should never have "which" of zero here */ } } if (IsGroupBegin(t)) { GLOBALS->group_depth = GLOBALS->group_depth + 1; } if (IsGroupEnd(t)) { if (GLOBALS->group_depth == 0) { fprintf(stderr, "ERROR: Group End encountered with no matching start. Ignoring.\n"); t->flags &= ~TR_GRP_END; } else { GLOBALS->group_depth = GLOBALS->group_depth - 1; } } if(GLOBALS->shift_timebase_default_for_add) t->shift=GLOBALS->shift_timebase_default_for_add; if(!GLOBALS->strace_ctx->shadow_active) { if( GLOBALS->traces.first == NULL ) { t->t_next = t->t_prev = NULL; GLOBALS->traces.first = GLOBALS->traces.last = t; } else { t->t_next = NULL; t->t_prev = GLOBALS->traces.last; GLOBALS->traces.last->t_next = t; GLOBALS->traces.last = t; } GLOBALS->traces.total++; updateTraceGroup(GLOBALS->traces.last); } else /* hide offscreen */ { struct strace *st = calloc_2(1, sizeof(struct strace)); st->next = GLOBALS->strace_ctx->shadow_straces; st->value = GLOBALS->strace_ctx->shadow_type; st->trace = t; st->string = GLOBALS->strace_ctx->shadow_string; /* copy string over */ GLOBALS->strace_ctx->shadow_string = NULL; GLOBALS->strace_ctx->shadow_straces = st; } } /* * Add a blank trace to the display... */ static char *precondition_string(char *s) { int len=0; char *s2; if(!s) return(NULL); s2=s; while((*s2)&&((*s2)!='\n')&&((*s2)!='\r')) /* strip off ending CR/LF */ { len++; s2++; } if(!len) return(NULL); s2=(char *)calloc_2(1,len+1); memcpy(s2,s,len); return(s2); } int AddBlankTrace(char *commentname) { Trptr t; char *comment; unsigned int flags_filtered; if( (t = (Trptr) calloc_2( 1, sizeof( TraceEnt ))) == NULL ) { fprintf( stderr, "Out of memory, can't add blank trace to analyzer\n"); return( 0 ); } AddTrace(t); /* Keep only flags that make sense for a blank trace. */ flags_filtered = TR_BLANK | (GLOBALS->default_flags & (TR_CLOSED| TR_GRP_BEGIN| TR_GRP_END| TR_COLLAPSED| TR_ANALOG_BLANK_STRETCH)); t->flags = flags_filtered; if(t->flags & TR_ANALOG_BLANK_STRETCH) { t->flags &= ~TR_BLANK; } if((comment=precondition_string(commentname))) { t->name = comment; } return(1); } /* * Insert a blank [or comment] trace into the display... */ int InsertBlankTrace(char *comment, int different_flags) { TempBuffer tb; char *comm; Trptr t; if( (t = (Trptr) calloc_2( 1, sizeof( TraceEnt ))) == NULL ) { fprintf( stderr, "Out of memory, can't insert blank trace to analyzer\n"); return( 0 ); } GLOBALS->traces.dirty = 1; if(!different_flags) { t->flags=TR_BLANK; } else { t->flags = different_flags; } if((comm=precondition_string(comment))) { t->name = comm; } if(!GLOBALS->traces.first) { GLOBALS->traces.first=GLOBALS->traces.last=t; GLOBALS->traces.total=1; return(1); } else { tb.buffer=GLOBALS->traces.buffer; tb.bufferlast=GLOBALS->traces.bufferlast; tb.buffercount=GLOBALS->traces.buffercount; GLOBALS->traces.buffer=GLOBALS->traces.bufferlast=t; GLOBALS->traces.buffercount=1; PasteBuffer(); GLOBALS->traces.buffer=tb.buffer; GLOBALS->traces.bufferlast=tb.bufferlast; GLOBALS->traces.buffercount=tb.buffercount; return(1); } } /* * Adds a single bit signal to the display... */ int AddNodeTraceReturn(nptr nd, char *aliasname, Trptr *tret) { Trptr t; hptr histpnt; hptr *harray; int histcount; int i; if(!nd) return(0); /* passed it a null node ptr by mistake */ if(nd->mv.mvlfac) import_trace(nd); GLOBALS->signalwindow_width_dirty=1; GLOBALS->traces.dirty = 1; if( (t = (Trptr) calloc_2( 1, sizeof( TraceEnt ))) == NULL ) { fprintf( stderr, "Out of memory, can't add to analyzer\n" ); return( 0 ); } if(!nd->harray) /* make quick array lookup for aet display */ { histpnt=&(nd->head); histcount=0; while(histpnt) { histcount++; histpnt=histpnt->next; } nd->numhist=histcount; if(!(nd->harray=harray=(hptr *)malloc_2(histcount*sizeof(hptr)))) { fprintf( stderr, "Out of memory, can't add to analyzer\n" ); free_2(t); return(0); } histpnt=&(nd->head); for(i=0;inext; } } if(aliasname) { char *alias; t->name_full = alias =(char *)malloc_2(strlen(aliasname)+1); strcpy(alias,aliasname); t->name = t->name_full; if(GLOBALS->hier_max_level) t->name = hier_extract(t->name_full, GLOBALS->hier_max_level); } else { if(!GLOBALS->hier_max_level) { int flagged = HIER_DEPACK_ALLOC; t->name = hier_decompress_flagged(nd->nname, &flagged); t->is_depacked = (flagged != 0); } else { int flagged = HIER_DEPACK_ALLOC; char *tbuff = hier_decompress_flagged(nd->nname, &flagged); if(!flagged) { t->name = hier_extract(nd->nname, GLOBALS->hier_max_level); } else { t->name = strdup_2(hier_extract(tbuff, GLOBALS->hier_max_level)); free_2(tbuff); t->is_depacked = 1; } } } if(nd->extvals) /* expansion vectors */ { int n; n = nd->msi - nd->lsi; if(n<0)n=-n; n++; switch(nd->vartype) { case ND_VCD_INTEGER: case ND_VCD_PARAMETER: case ND_SV_INT: case ND_SV_SHORTINT: case ND_SV_LONGINT: t->flags = TR_SIGNED | TR_RJUSTIFY; break; default: t->flags = (( n > 3 )||( n < -3 )) ? TR_HEX|TR_RJUSTIFY : TR_BIN|TR_RJUSTIFY; break; } } else { t->flags |= TR_BIN; /* binary */ } t->vector = FALSE; t->n.nd = nd; if(tret) *tret = t; /* for expand */ AddTrace( t ); return( 1 ); } /* single node */ int AddNode(nptr nd, char *aliasname) { return(AddNodeTraceReturn(nd, aliasname, NULL)); } /* add multiple nodes (if array) */ int AddNodeUnroll(nptr nd, char *aliasname) { #ifdef WAVE_ARRAY_SUPPORT if(nd->array_height <= 1) #endif { return(AddNodeTraceReturn(nd, aliasname, NULL)); } #ifdef WAVE_ARRAY_SUPPORT else { unsigned int i; int rc = 1; for(i=0;iarray_height;i++) { rc |= AddNodeTraceReturn(nd+i, aliasname, NULL); } return(rc); } #endif } /* * Adds a vector to the display... */ int AddVector(bvptr vec, char *aliasname) { Trptr t; int n; if(!vec) return(0); /* must've passed it a null pointer by mistake */ GLOBALS->signalwindow_width_dirty=1; GLOBALS->traces.dirty = 1; n = vec->nbits; t = (Trptr) calloc_2(1, sizeof( TraceEnt ) ); if( t == NULL ) { fprintf( stderr, "Out of memory, can't add %s to analyzer\n", vec->bvname ); return( 0 ); } if (aliasname) { t->name_full = strdup_2(aliasname); t->name = t->name_full; } else { t->name = vec->bvname; } if(GLOBALS->hier_max_level) t->name = hier_extract(t->name, GLOBALS->hier_max_level); t->flags = ( n > 3 ) ? TR_HEX|TR_RJUSTIFY : TR_BIN|TR_RJUSTIFY; t->vector = TRUE; t->n.vec = vec; AddTrace( t ); return( 1 ); } /* * Free up a trace's mallocs... */ void FreeTrace(Trptr t) { GLOBALS->traces.dirty = 1; if(GLOBALS->starting_unshifted_trace == t) { GLOBALS->starting_unshifted_trace = NULL; /* for new "standard" clicking routines */ } if(GLOBALS->strace_ctx->straces) { struct strace_defer_free *sd = calloc_2(1, sizeof(struct strace_defer_free)); sd->next = GLOBALS->strace_ctx->strace_defer_free_head; sd->defer = t; GLOBALS->strace_ctx->strace_defer_free_head = sd; return; } if(t->vector) { bvptr bv, bv2; int i; bv=t->n.vec; /* back out allocation to revert (if any) */ if(bv->transaction_cache) { t->n.vec = bv->transaction_cache; while(bv) { bv2 = bv->transaction_chain; if(bv->bvname) { free_2(bv->bvname); } for(i=0;inumregions;i++) { free_2(bv->vectors[i]); } free_2(bv); bv = bv2; } bv=t->n.vec; } /* normal vector deallocation */ for(i=0;inumregions;i++) { if(bv->vectors[i]) free_2(bv->vectors[i]); } if(bv->bits) { if(bv->bits->name) free_2(bv->bits->name); if(bv->bits->attribs) free_2(bv->bits->attribs); for(i=0;inbits;i++) { DeleteNode(bv->bits->nodes[i]); } free_2(bv->bits); } if(bv->bvname) free_2(bv->bvname); if(t->n.vec) free_2(t->n.vec); } else { if(t->n.nd && t->n.nd->expansion) { DeleteNode(t->n.nd); } } if(t->is_depacked) free_2(t->name); if(t->asciivalue) free_2(t->asciivalue); if(t->name_full) free_2(t->name_full); if(t->transaction_args) free_2(t->transaction_args); free_2( t ); } /* * Remove a trace from the display and optionally * deallocate its memory usage... */ void RemoveTrace( Trptr t, int dofree ) { GLOBALS->traces.dirty = 1; GLOBALS->traces.total--; if( t == GLOBALS->traces.first ) { GLOBALS->traces.first = t->t_next; if( t->t_next ) t->t_next->t_prev = NULL; else GLOBALS->traces.last = NULL; } else { if(t->t_prev) { t->t_prev->t_next = t->t_next; } else { /* this code should likely *never* execute as if( t == GLOBALS->traces.first ) above should catch this */ /* there is likely a problem elsewhere in the code! */ Trptr t2 = GLOBALS->traces.first = t->t_next; GLOBALS->traces.total = 0; while(t2) { t2 = t2->t_next; GLOBALS->traces.total++; } } if( t->t_next ) t->t_next->t_prev = t->t_prev; else GLOBALS->traces.last = t->t_prev; } if(dofree) { FreeTrace(t); } } /* * Deallocate the cut/paste buffer... */ void FreeCutBuffer(void) { Trptr t, t2; t=GLOBALS->traces.buffer; while(t) { t2=t->t_next; FreeTrace(t); t=t2; } GLOBALS->traces.buffer=GLOBALS->traces.bufferlast=NULL; GLOBALS->traces.buffercount=0; } /* * Cut highlighted traces from the main screen * and throw them in the cut buffer. If anything's * in the cut buffer, deallocate it first... */ Trptr CutBuffer(void) { Trptr t, tnext; Trptr first=NULL, current=NULL; GLOBALS->shift_click_trace=NULL; /* so shift-clicking doesn't explode */ t=GLOBALS->traces.first; while(t) { if((t->flags)&(TR_HIGHLIGHT)) break; t=t->t_next; } if(!t) return(NULL); /* keeps a double cut from blowing out the buffer */ GLOBALS->signalwindow_width_dirty=1; GLOBALS->traces.dirty = 1; FreeCutBuffer(); t=GLOBALS->traces.first; while(t) { tnext=t->t_next; if(IsSelected(t) || (t->t_grp && IsSelected(t->t_grp))) { /* members of closed groups may not be highlighted */ /* so propogate highlighting here */ t->flags |= TR_HIGHLIGHT; GLOBALS->traces.bufferlast=t; GLOBALS->traces.buffercount++; /* t->flags&=(~TR_HIGHLIGHT); */ RemoveTrace(t, 0); if(!current) { first=current=t; t->t_prev=NULL; t->t_next=NULL; } else { current->t_next=t; t->t_prev=current; current=t; t->t_next=NULL; } } t=tnext; } return(GLOBALS->traces.buffer=first); } /* * Delete highlighted traces from the main screen * and throw them away. Do not affect existing cut buffer... */ int DeleteBuffer(void) { Trptr t, tnext; Trptr current=NULL; Trptr buffer; /* cut/copy buffer of traces */ Trptr bufferlast; /* last element of bufferchain */ int buffercount; /* number of traces in buffer */ int num_deleted; GLOBALS->shift_click_trace=NULL; /* so shift-clicking doesn't explode */ t=GLOBALS->traces.first; while(t) { if((t->flags)&(TR_HIGHLIGHT)) break; t=t->t_next; } if(!t) return(0); /* nothing to do */ GLOBALS->signalwindow_width_dirty=1; GLOBALS->traces.dirty = 1; buffer = GLOBALS->traces.buffer; /* copy cut buffer to make re-entrant */ bufferlast = GLOBALS->traces.bufferlast; buffercount = GLOBALS->traces.buffercount; GLOBALS->traces.buffer = NULL; GLOBALS->traces.bufferlast = NULL; GLOBALS->traces.buffercount = 0; t=GLOBALS->traces.first; while(t) { tnext=t->t_next; if(IsSelected(t) || (t->t_grp && IsSelected(t->t_grp))) { /* members of closed groups may not be highlighted */ /* so propogate highlighting here */ t->flags |= TR_HIGHLIGHT; GLOBALS->traces.bufferlast=t; GLOBALS->traces.buffercount++; /* t->flags&=(~TR_HIGHLIGHT); */ RemoveTrace(t, 0); if(!current) { current=t; t->t_prev=NULL; t->t_next=NULL; } else { current->t_next=t; t->t_prev=current; current=t; t->t_next=NULL; } } t=tnext; } num_deleted = GLOBALS->traces.buffercount; FreeCutBuffer(); GLOBALS->traces.buffer = buffer; /* restore cut buffer */ GLOBALS->traces.bufferlast = bufferlast; GLOBALS->traces.buffercount = buffercount; return(num_deleted); } /* * Paste the cut buffer into the main display one and * mark the cut buffer empty... */ Trptr PasteBuffer(void) { Trptr t, tinsert=NULL, tinsertnext; int count; Trptr prev; if(!GLOBALS->traces.buffer) return(NULL); GLOBALS->signalwindow_width_dirty=1; GLOBALS->traces.dirty = 1; if(!(t=GLOBALS->traces.first)) { t=GLOBALS->traces.last=GLOBALS->traces.first=GLOBALS->traces.buffer; prev = NULL; while(t) { t->t_prev = prev; /* defensive re-link move */ prev = t; GLOBALS->traces.last=t; GLOBALS->traces.total++; t=t->t_next; } GLOBALS->traces.buffer=GLOBALS->traces.bufferlast=NULL; GLOBALS->traces.buffercount=0; return(GLOBALS->traces.first); } while(t) { if(t->flags&TR_HIGHLIGHT) { tinsert=t; } t=t->t_next; } if(!tinsert) tinsert=GLOBALS->traces.last; if(IsGroupBegin(tinsert) && IsClosed(tinsert) && IsCollapsed(tinsert->t_match)) tinsert=tinsert->t_match; tinsertnext=tinsert->t_next; tinsert->t_next=GLOBALS->traces.buffer; GLOBALS->traces.buffer->t_prev=tinsert; GLOBALS->traces.bufferlast->t_next=tinsertnext; GLOBALS->traces.total+=GLOBALS->traces.buffercount; if(!tinsertnext) { GLOBALS->traces.last=GLOBALS->traces.bufferlast; } else { tinsertnext->t_prev=GLOBALS->traces.bufferlast; } GLOBALS->traces.scroll_top = GLOBALS->traces.buffer; GLOBALS->traces.scroll_bottom = GLOBALS->traces.bufferlast; if(GLOBALS->traces.first) { t = GLOBALS->traces.first; t->t_grp = NULL; while(t) { updateTraceGroup(t); t->flags &= ~TR_HIGHLIGHT; t=t->t_next; } } count = 0; if (GLOBALS->traces.buffer) { t = GLOBALS->traces.buffer; while(t) { t->flags |= TR_HIGHLIGHT; t=t->t_next; count++; if (count == GLOBALS->traces.buffercount) break; } } /* clean out the buffer */ GLOBALS->traces.buffer=GLOBALS->traces.bufferlast=NULL; GLOBALS->traces.buffercount=0; /* defensive re-link */ t=GLOBALS->traces.first; prev = NULL; while(t) { t->t_prev = prev; prev = t; t=t->t_next; } return(GLOBALS->traces.first); } /* * Prepend the cut buffer into the main display one and * mark the cut buffer empty... */ Trptr PrependBuffer(void) { Trptr t, prev = NULL; int count; if(!GLOBALS->traces.buffer) return(NULL); GLOBALS->signalwindow_width_dirty=1; GLOBALS->traces.dirty = 1; t=GLOBALS->traces.buffer; while(t) { t->t_prev = prev; /* defensive re-link move */ prev=t; t->flags&=(~TR_HIGHLIGHT); GLOBALS->traces.total++; t=t->t_next; } if((prev->t_next=GLOBALS->traces.first)) { /* traces.last current value is ok as it stays the same */ GLOBALS->traces.first->t_prev=prev; /* but we need the reverse link back up */ } else { GLOBALS->traces.last=prev; } GLOBALS->traces.first=GLOBALS->traces.buffer; if(GLOBALS->traces.first) { t = GLOBALS->traces.first; t->t_grp = NULL; while(t) { updateTraceGroup(t); t->flags &= ~TR_HIGHLIGHT; t=t->t_next; } } count = 0; if (GLOBALS->traces.buffer) { t = GLOBALS->traces.buffer; while(t) { t->flags |= TR_HIGHLIGHT; t=t->t_next; count++; if (count == GLOBALS->traces.buffercount) break; } } /* clean out the buffer */ GLOBALS->traces.buffer=GLOBALS->traces.bufferlast=NULL; GLOBALS->traces.buffercount=0; /* defensive re-link */ t=GLOBALS->traces.first; prev = NULL; while(t) { t->t_prev = prev; prev = t; t=t->t_next; } return(GLOBALS->traces.first); } /* * avoid sort/rvs manipulations if there are group traces (for now) */ static int groupsArePresent(void) { Trptr t; int i, rc = 0; t=GLOBALS->traces.first; for(i=0;itraces.total;i++) { if(!t) { fprintf(stderr, "INTERNAL ERROR: traces.total vs traversal mismatch! Exiting.\n"); exit(255); } if((t->t_grp)||(t->t_match)||(t->flags & TR_GRP_MASK)) { rc = 1; break; } t=t->t_next; } return(rc); } /*************************************************************/ /* * sort on tracename pointers (alpha/caseins alpha/sig sort full_reverse) */ static int tracenamecompare(const void *s1, const void *s2) { char *str1, *str2; str1=(*((Trptr *)s1))->name; str2=(*((Trptr *)s2))->name; if((!str1) || (!*str1)) /* force blank lines to go to bottom */ { if((!str2) || (!*str2)) { return(0); } else { return(1); } } else if((!str2) || (!*str2)) { return(-1); /* str1==str2==zero case is covered above */ } return(strcmp(str1, str2)); } static int traceinamecompare(const void *s1, const void *s2) { char *str1, *str2; str1=(*((Trptr *)s1))->name; str2=(*((Trptr *)s2))->name; if((!str1) || (!*str1)) /* force blank lines to go to bottom */ { if((!str2) || (!*str2)) { return(0); } else { return(1); } } else if((!str2) || (!*str2)) { return(-1); /* str1==str2==zero case is covered above */ } return(strcasecmp(str1, str2)); } static int tracesignamecompare(const void *s1, const void *s2) { char *str1, *str2; str1=(*((Trptr *)s1))->name; str2=(*((Trptr *)s2))->name; if((!str1) || (!*str1)) /* force blank lines to go to bottom */ { if((!str2) || (!*str2)) { return(0); } else { return(1); } } else if((!str2) || (!*str2)) { return(-1); /* str1==str2==zero case is covered above */ } return(sigcmp(str1, str2)); } /* * alphabetization/reordering of traces */ int TracesReorder(int mode) { Trptr t, prev = NULL; Trptr *tsort, *tsort_pnt; #ifdef WAVE_HIERFIX char *subst, ch; #endif int i; int (*cptr)(const void*, const void*); if(!GLOBALS->traces.total) return(0); GLOBALS->traces.dirty = 1; t=GLOBALS->traces.first; tsort=tsort_pnt=wave_alloca(sizeof(Trptr)*GLOBALS->traces.total); memset(tsort_pnt, 0, sizeof(Trptr)*GLOBALS->traces.total); for(i=0;itraces.total;i++) { if(!t) { fprintf(stderr, "INTERNAL ERROR: traces.total vs traversal mismatch! Exiting.\n"); exit(255); } *(tsort_pnt++)=t; #ifdef WAVE_HIERFIX if((subst=t->name)) while((ch=(*subst))) { if(ch==GLOBALS->hier_delimeter) { *subst=VCDNAM_HIERSORT; } /* forces sort at hier boundaries */ subst++; } #endif t=t->t_next; } switch(mode) { case TR_SORT_INS: cptr=traceinamecompare; break; case TR_SORT_NORM: cptr=tracenamecompare; break; case TR_SORT_LEX: cptr=tracesignamecompare; break; default: cptr=NULL; break; } if((cptr) && (!groupsArePresent())) { qsort(tsort, GLOBALS->traces.total, sizeof(Trptr), cptr); } else /* keep groups segregated off on the side and sort names + (indirect pointer to) top-level groups */ { Trptr *tsort_reduced = wave_alloca(sizeof(Trptr)*GLOBALS->traces.total); int num_reduced = 0; int j; memset(tsort_reduced, 0, sizeof(Trptr)*GLOBALS->traces.total); for(i=0;itraces.total;i++) { if(tsort[i]->flags & TR_GRP_BEGIN) { int cnt = 0; for(j=i;jtraces.total;j++) { if(tsort[j]->flags & TR_GRP_BEGIN) { cnt++; } else if(tsort[j]->flags & TR_GRP_END) { cnt--; } if(!cnt) { tsort_reduced[num_reduced] = calloc_2(1, sizeof(struct TraceEnt)); tsort_reduced[num_reduced]->name = tsort[i]->name; tsort_reduced[num_reduced]->is_sort_group = 1; tsort_reduced[num_reduced]->t_grp = tsort[i]; tsort[j]->t_next = NULL; num_reduced++; i = j; break; } } } else { tsort_reduced[num_reduced++] = tsort[i]; } } if(num_reduced) { if(mode == TR_SORT_RVS) /* reverse of current order */ { for(i=0;i<=(num_reduced/2);i++) { Trptr t_tmp = tsort_reduced[i]; j = num_reduced-i-1; tsort_reduced[i] = tsort_reduced[j]; tsort_reduced[j] = t_tmp; } } else { if(cptr) { qsort(tsort_reduced, num_reduced, sizeof(Trptr), cptr); } } } i = 0; for(j=0;jis_sort_group) { tsort[i++] = tsort_reduced[j]; } else { Trptr trav = tsort_reduced[j]->t_grp; free_2(tsort_reduced[j]); while(trav) { tsort[i++] = trav; trav = trav->t_next; } } } } tsort_pnt=tsort; for(i=0;itraces.total;i++) { t=*(tsort_pnt++); if(!i) { GLOBALS->traces.first=t; t->t_prev=NULL; } else { prev->t_next=t; t->t_prev=prev; } prev=t; #ifdef WAVE_HIERFIX if((subst=t->name)) while((ch=(*subst))) { if(ch==VCDNAM_HIERSORT) { *subst=GLOBALS->hier_delimeter; } /* restore hier */ subst++; } #endif } GLOBALS->traces.last=prev; if(prev) { prev->t_next=NULL; } /* scan-build */ return(1); } Trptr GiveNextTrace(Trptr t) { if(!t) return(t); /* should not happen */ /* if(t->name) { printf("NEXT: %s %x\n", t->name, t->flags); } */ UpdateTraceSelection(t); if (IsGroupBegin(t) && IsClosed(t)) { Trptr next = t->t_match; if (next) return (IsCollapsed(next) ? GiveNextTrace(next) : next); return NULL; } else { Trptr next = t->t_next; if (next) return (IsCollapsed(next) ? GiveNextTrace(next) : next); return NULL; } } static Trptr GivePrevTraceSkipUpdate(Trptr t, int skip) { if(!t) return(t); /* should not happen */ /* if(t->name) { printf("PREV: %s\n", t->name); } */ if(!skip) { UpdateTraceSelection(t); } if (IsGroupEnd(t) && IsClosed(t)) { Trptr prev = t->t_match; if (prev) return (IsCollapsed(prev) ? GivePrevTrace(prev) : prev); return NULL; } else { Trptr prev = t->t_prev; if (prev) return (IsCollapsed(prev) ? GivePrevTrace(prev) : prev); return NULL; } } Trptr GivePrevTrace(Trptr t) { return(GivePrevTraceSkipUpdate(t, 0)); } /* propogate selection info down into groups */ void UpdateTraceSelection(Trptr t) { if ((t->t_match) && (IsGroupBegin(t) || IsGroupEnd(t)) && (IsSelected(t) || IsSelected(t->t_match))) { t->flags |= TR_HIGHLIGHT; t->t_match->flags |= TR_HIGHLIGHT; } else if ((t->t_grp) && IsSelected(t->t_grp)) { t->flags |= TR_HIGHLIGHT; } else if(t->flags & (TR_BLANK|TR_ANALOG_BLANK_STRETCH)) /* seek to real xact trace if present... */ { if(!(t->flags & TR_HIGHLIGHT)) { Trptr tscan = t; int bcnt = 0; while((tscan) && (tscan = GivePrevTraceSkipUpdate(tscan, 1))) { if(!(tscan->flags & (TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { if(tscan->flags & TR_TTRANSLATED) { break; /* found it */ } else { tscan = NULL; } } else { bcnt++; /* bcnt is number of blank traces */ } } if((tscan)&&(tscan->vector)&&(IsSelected(tscan))) { bvptr bv = tscan->n.vec; do { bv = bv->transaction_chain; /* correlate to blank trace */ } while(bv && (bcnt--)); if(bv) { t->flags |= TR_HIGHLIGHT; } } } } } int UpdateTracesVisible(void) { Trptr t = GLOBALS->traces.first; int cnt = 0; while(t) { t = GiveNextTrace(t); cnt++; } GLOBALS->traces.visible = cnt; return(cnt); } /* where is trace t_in in the list of displayable traces */ int GetTraceNumber(Trptr t_in) { Trptr t = GLOBALS->traces.first; int i = 0; int num = -1; while(t) { if (t == t_in) { num = i; break; } i++; t = GiveNextTrace(t); } return(num); } unsigned IsShadowed( Trptr t ) { if (t->t_grp) { if (HasWave(t->t_grp)) { return IsSelected(t->t_grp); } else { return IsShadowed(t->t_grp); } } return 0; } char* GetFullName( Trptr t, int *was_packed ) { if (HasAlias(t) || !HasWave(t)) { return (t->name_full); } else if (t->vector) { return (t->n.vec->bvname); } else { return (hier_decompress_flagged(t->n.nd->nname, was_packed)); } } /* * sanity checking to make sure there are not any group open/close mismatches */ void EnsureGroupsMatch(void) { Trptr t = GLOBALS->traces.first; Trptr last_good = t; Trptr t2; int oc_cnt = 0; int underflow_sticky = 0; /* Trptr tkill_undeflow = NULL; */ /* scan-build */ while(t) { if(t->flags & TR_GRP_MASK) { if(t->flags & TR_GRP_BEGIN) { oc_cnt++; } else if(t->flags & TR_GRP_END) { oc_cnt--; if(oc_cnt == 0) { if(!underflow_sticky) { last_good = t->t_next; } } } if(oc_cnt < 0) { /* if(!underflow_sticky) { tkill_undeflow = t; } */ /* scan-build */ underflow_sticky = 1; } } else { if((oc_cnt == 0) && (!underflow_sticky)) { last_good = t->t_next; } } t = t->t_next; } if((underflow_sticky) || (oc_cnt > 0)) { t = last_good; while(t) { t2 = t->t_next; RemoveTrace(t, 0); /* conservatively don't set "dofree", if there is a reload memory will reclaim */ t = t2; } } } gtkwave-3.3.86/src/timeentry.h0000664000175000017500000000077113166335473015571 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010 * * 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. */ #ifndef WAVE_TIMEENTRY_H #define WAVE_TIMEENTRY_H void time_update(void); void from_entry_callback(GtkWidget *widget, GtkWidget *entry); void to_entry_callback(GtkWidget *widget, GtkWidget *entry); #endif gtkwave-3.3.86/src/analyzer.h0000664000175000017500000004446413166335473015405 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2014. * * 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. */ #include "globals.h" #ifndef ANALYZER_H #define ANALYZER_H #include #include #include "wavealloca.h" #include "vlist.h" #include "debug.h" #ifdef AET2_IS_PRESENT #define WAVE_ARRAY_SUPPORT #endif /* struct Node bitfield widths */ #define WAVE_VARXT_WIDTH (16) #define WAVE_VARXT_MAX_ID ((1 << WAVE_VARXT_WIDTH) - 1) #define WAVE_VARDT_WIDTH (6) #define WAVE_VARDIR_WIDTH (3) #define WAVE_VARTYPE_WIDTH (6) typedef struct _SearchProgressData { GtkWidget *window; GtkWidget *pbar; GtkAdjustment *adj; int timer; /* might be used later.. */ gfloat value, oldvalue; } SearchProgressData; #define BITATTRIBUTES_MAX 32768 typedef struct ExpandInfo *eptr; typedef struct ExpandReferences *exptr; typedef struct Node *nptr; typedef struct HistEnt *hptr; typedef struct Bits *bptr; typedef struct VectorEnt *vptr; typedef struct BitVector *bvptr; typedef struct BitAttributes *baptr; typedef unsigned long Ulong; typedef unsigned int Uint; enum TraceReorderMode { TR_SORT_INS, TR_SORT_NORM, TR_SORT_LEX, TR_SORT_RVS }; /* vvv Bit representation vvv */ enum AnalyzerBits { AN_0, AN_X, AN_Z, AN_1, AN_H, AN_U, AN_W, AN_L, AN_DASH, AN_RSV9, AN_RSVA, AN_RSVB, AN_RSVC, AN_RSVD, AN_RSVE, AN_RSVF, AN_COUNT }; #define AN_NORMAL { AN_0, AN_X, AN_Z, AN_1, AN_H, AN_U, AN_W, AN_L, AN_DASH, AN_DASH, AN_DASH, AN_DASH, AN_DASH, AN_DASH, AN_DASH, AN_DASH } #define AN_INVERSE { AN_1, AN_X, AN_Z, AN_0, AN_L, AN_U, AN_W, AN_H, AN_DASH, AN_DASH, AN_DASH, AN_DASH, AN_DASH, AN_DASH, AN_DASH, AN_DASH } #define AN_MSK (AN_COUNT-1) /* max index into AN_STR, AN_COUNT *must* be a power of two unless logic AND with AN_MSK is changed */ /* positional ascii 0123456789ABCDEF, question marks should not happen unless something slips through the cracks as AN_RSVA to AN_RSVF are reserved */ #define AN_STR "0xz1huwl-???????" #define AN_STR_INV "1xz0luwh-???????" #define AN_USTR "0XZ1HUWL-???????" #define AN_USTR_INV "1XZ0LUWH-???????" /* for writing out 4 state formats (read GHW, write LXT) */ #define AN_STR4ST "0xz11xz0xxxxxxxx" #define AN_USTR4ST "0XZ11XZ0XXXXXXXX" /* for hex/oct conversion in baseconvert.c */ #define AN_HEX_STR "0123456789ABCDEFxzwu-XZWU" #define AN_OCT_STR "01234567xzwu-" /* now the recoded "extra" values... */ #define RCV_X (1 | (0<<1)) #define RCV_Z (1 | (1<<1)) #define RCV_H (1 | (2<<1)) #define RCV_U (1 | (3<<1)) #define RCV_W (1 | (4<<1)) #define RCV_L (1 | (5<<1)) #define RCV_D (1 | (6<<1)) #define RCV_STR "xzhuwl-?" /* 01234567 */ /* ^^^ Bit representation ^^^ */ #if (SIZEOF_VOID_P == SIZEOF_DOUBLE) #define WAVE_HAS_H_DOUBLE #endif #ifdef WAVE_USE_STRUCT_PACKING #pragma pack(push) #pragma pack(1) #endif typedef struct HistEnt { hptr next; /* next transition in history */ union { unsigned char h_val; /* value: AN_STR[val] or AnalyzerBits which correspond */ char *h_vector; /* pointer to a whole vector of h_val type bits */ #ifdef WAVE_HAS_H_DOUBLE double h_double; #endif } v; TimeType time; /* time of transition */ unsigned char flags; /* so far only set on glitch/real condition */ } HistEnt; #ifdef WAVE_USE_STRUCT_PACKING #pragma pack(pop) #endif enum HistEntFlagBits { HIST_GLITCH_B, HIST_REAL_B, HIST_STRING_B }; #define HIST_GLITCH (1<name then) */ unsigned is_depacked : 1; /* set when it's been depacked from a compressed entry (safe to free t->name then) */ unsigned vector : 1; /* 1 if bit vector, 0 if node */ unsigned shift_drag_valid : 1; /* qualifies shift_drag above */ unsigned interactive_vector_needs_regeneration : 1; /* for interactive VCDs */ unsigned minmax_valid : 1; /* for d_minval, d_maxval */ unsigned is_sort_group : 1; /* only used for sorting purposes */ unsigned t_filter_converted : 1; /* used to mark that data conversion already occurred if t_filter != 0*/ } TraceEnt; enum TraceEntFlagBits { TR_HIGHLIGHT_B, TR_HEX_B, TR_DEC_B, TR_BIN_B, TR_OCT_B, TR_RJUSTIFY_B, TR_INVERT_B, TR_REVERSE_B, TR_EXCLUDE_B, TR_BLANK_B, TR_SIGNED_B, TR_ASCII_B, TR_COLLAPSED_B, TR_FTRANSLATED_B, TR_PTRANSLATED_B, TR_ANALOG_STEP_B, TR_ANALOG_INTERPOLATED_B, TR_ANALOG_BLANK_STRETCH_B, TR_REAL_B, TR_ANALOG_FULLSCALE_B, TR_ZEROFILL_B, TR_ONEFILL_B, TR_CLOSED_B, TR_GRP_BEGIN_B, TR_GRP_END_B, TR_BINGRAY_B, TR_GRAYBIN_B, TR_REAL2BITS_B, TR_TTRANSLATED_B, TR_POPCNT_B, TR_FPDECSHIFT_B, TR_RSVD_B /* for use internally such as temporary caching of highlighting, not for use in traces */ }; #define TR_HIGHLIGHT (1<flags&TR_HIGHLIGHT) #define IsGroupBegin(t) (t->flags&TR_GRP_BEGIN) #define IsGroupEnd(t) (t->flags&TR_GRP_END) #define IsClosed(t) (t->flags&TR_CLOSED) #define HasWave(t) (!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))) #define CanAlias(t) HasWave(t) #define HasAlias(t) (t->name_full&&HasWave(t)) #define IsCollapsed(t) (t->flags&TR_COLLAPSED) unsigned IsShadowed(Trptr t); char* GetFullName(Trptr t, int *was_packed); void OpenTrace(Trptr t); void CloseTrace(Trptr t); void ClearTraces(void); void ClearGroupTraces(Trptr t); #endif gtkwave-3.3.86/src/simplereq.c0000664000175000017500000001134113166335473015540 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2012. * * 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. */ #include "globals.h" #include #include "gtk12compat.h" #include #include "menu.h" #include "debug.h" #include "pixmaps.h" #ifdef MAC_INTEGRATION #include #else static void ok_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; DEBUG(printf("OK\n")); wave_gtk_grab_remove(GLOBALS->window_simplereq_c_9); gtk_widget_destroy(GLOBALS->window_simplereq_c_9); GLOBALS->window_simplereq_c_9 = NULL; if(GLOBALS->cleanup)GLOBALS->cleanup(NULL,(gpointer)1); } static void destroy_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; DEBUG(printf("Cancel\n")); wave_gtk_grab_remove(GLOBALS->window_simplereq_c_9); gtk_widget_destroy(GLOBALS->window_simplereq_c_9); GLOBALS->window_simplereq_c_9 = NULL; if(GLOBALS->cleanup)GLOBALS->cleanup(NULL,NULL); } #endif void simplereqbox(char *title, int width, char *default_text, char *oktext, char *canceltext, GtkSignalFunc func, int is_alert) { #ifndef MAC_INTEGRATION GtkWidget *vbox, *hbox; GtkWidget *button1, *button2; GtkWidget *label, *separator; GtkWidget *pixmapwid1; #else (void)width; #endif if(GLOBALS->window_simplereq_c_9) return; /* only should happen with GtkPlug */ GLOBALS->cleanup=WAVE_GTK_SFUNCAST(func); /* fix problem where ungrab doesn't occur if button pressed + simultaneous accelerator key occurs */ if(GLOBALS->in_button_press_wavewindow_c_1) { gdk_pointer_ungrab(GDK_CURRENT_TIME); } if(GLOBALS->wave_script_args) { if(GLOBALS->cleanup)GLOBALS->cleanup(NULL,(gpointer)1); return; } #ifdef MAC_INTEGRATION /* requester is modal so it will block */ switch(gtk_simplereqbox_req_bridge(title, default_text, oktext, canceltext, is_alert)) { case 1: if(GLOBALS->cleanup)GLOBALS->cleanup(NULL,(gpointer)1); break; case 2: if(GLOBALS->cleanup)GLOBALS->cleanup(NULL,NULL); break; default: break; } #else /* create a new modal window */ GLOBALS->window_simplereq_c_9 = gtk_window_new(GLOBALS->disable_window_manager ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL); install_focus_cb(GLOBALS->window_simplereq_c_9, ((char *)&GLOBALS->window_simplereq_c_9) - ((char *)GLOBALS)); gtk_window_set_transient_for(GTK_WINDOW(GLOBALS->window_simplereq_c_9), GTK_WINDOW(GLOBALS->mainwindow)); gtk_widget_set_usize( GTK_WIDGET (GLOBALS->window_simplereq_c_9), width, 200 - 64); /* 200 is for 128 px icon */ gtk_window_set_title(GTK_WINDOW (GLOBALS->window_simplereq_c_9), title); gtkwave_signal_connect(GTK_OBJECT (GLOBALS->window_simplereq_c_9), "delete_event",(GtkSignalFunc) destroy_callback, NULL); gtk_window_set_policy(GTK_WINDOW(GLOBALS->window_simplereq_c_9), FALSE, FALSE, FALSE); vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (GLOBALS->window_simplereq_c_9), vbox); gtk_widget_show (vbox); label=gtk_label_new(default_text); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); gtk_widget_show (label); if(is_alert) { pixmapwid1=gtk_pixmap_new(GLOBALS->wave_alert_pixmap, GLOBALS->wave_alert_mask); } else { pixmapwid1=gtk_pixmap_new(GLOBALS->wave_info_pixmap, GLOBALS->wave_info_mask); } gtk_widget_show(pixmapwid1); gtk_container_add (GTK_CONTAINER (vbox), pixmapwid1); separator = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0); gtk_widget_show (separator); hbox = gtk_hbox_new (FALSE, 1); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); gtk_widget_show (hbox); button1 = gtk_button_new_with_label (oktext); gtk_widget_set_usize(button1, 100, -1); gtkwave_signal_connect(GTK_OBJECT (button1), "clicked", GTK_SIGNAL_FUNC(ok_callback), NULL); gtk_widget_show (button1); gtk_container_add (GTK_CONTAINER (hbox), button1); GTK_WIDGET_SET_FLAGS (button1, GTK_CAN_DEFAULT); gtkwave_signal_connect_object (GTK_OBJECT (button1), "realize", (GtkSignalFunc) gtk_widget_grab_default, GTK_OBJECT (button1)); if(canceltext) { button2 = gtk_button_new_with_label (canceltext); gtk_widget_set_usize(button2, 100, -1); gtkwave_signal_connect(GTK_OBJECT (button2), "clicked", GTK_SIGNAL_FUNC(destroy_callback), NULL); GTK_WIDGET_SET_FLAGS (button2, GTK_CAN_DEFAULT); gtk_widget_show (button2); gtk_container_add (GTK_CONTAINER (hbox), button2); } gtk_widget_show(GLOBALS->window_simplereq_c_9); wave_gtk_grab_add(GLOBALS->window_simplereq_c_9); #endif } gtkwave-3.3.86/src/getopt.c0000664000175000017500000010346613166335473015053 0ustar bybellbybell/* Getopt for GNU. NOTE: getopt is now part of the C library, so if you don't know what "Keep this file name-space clean" means, talk to drepper@gnu.org before changing it! Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001,2002 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street - Suite 500, Boston, MA 02110-1335, USA */ /* This tells Alpha OSF/1 not to define a getopt prototype in . Ditto for AIX 3.2 and . */ #ifndef _NO_PROTO # define _NO_PROTO #endif #if 0 #define HAVE_CONFIG_H /* needed for Wine */ #endif #ifdef HAVE_CONFIG_H # include #endif #ifdef HAVE_GETOPT_LONG #define ELIDE_CODE #endif #if !defined __STDC__ || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ # ifndef const # define const # endif #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #define GETOPT_INTERFACE_VERSION 2 #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 # include # if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION # define ELIDE_CODE # endif #endif #ifndef ELIDE_CODE /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ /* Don't include stdlib.h for non-GNU C libraries because some of them contain conflicting prototypes for getopt. */ # include # include #endif /* GNU C library. */ #ifdef VMS # include # if HAVE_STRING_H - 0 # include # endif #endif #ifndef _ /* This is for other GNU distributions with internationalized messages. */ # if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC # include # ifndef _ # define _(msgid) gettext (msgid) # endif # else # define _(msgid) (msgid) # endif # if defined _LIBC && defined USE_IN_LIBIO # include # endif #endif #ifndef attribute_hidden # define attribute_hidden #endif /* This version of `getopt' appears to the caller like standard Unix `getopt' but it behaves differently for the user, since it allows the user to intersperse the options with the other arguments. As `getopt' works, it permutes the elements of ARGV so that, when it is done, all the options precede everything else. Thus all application programs are extended to handle flexible argument order. Setting the environment variable POSIXLY_CORRECT disables permutation. Then the behavior is completely standard. GNU application programs can use a third alternative mode in which they can distinguish the relative order of options and other arguments. */ #include "gnu-getopt.h" /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ /* 1003.2 says this must be 1 before any call. */ int optind = 1; /* Formerly, initialization of getopt depended on optind==0, which causes problems with re-calling getopt as programs generally don't know that. */ int __getopt_initialized attribute_hidden; /* The next char to be scanned in the option-element in which the last option character we returned was found. This allows us to pick up the scan where we left off. If this is zero, or a null string, it means resume the scan by advancing to the next ARGV-element. */ static char *nextchar; /* Callers store zero here to inhibit the error message for unrecognized options. */ int opterr = 1; /* Set to an option character which was unrecognized. This must be initialized on some systems to avoid linking in the system's own getopt implementation. */ int optopt = '?'; /* Describe how to deal with options that follow non-option ARGV-elements. If the caller did not specify anything, the default is REQUIRE_ORDER if the environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise. REQUIRE_ORDER means don't recognize them as options; stop option processing when the first non-option is seen. This is what Unix does. This mode of operation is selected by either setting the environment variable POSIXLY_CORRECT, or using `+' as the first character of the list of option characters. PERMUTE is the default. We permute the contents of ARGV as we scan, so that eventually all the non-options are at the end. This allows options to be given in any order, even with programs that were not written to expect this. RETURN_IN_ORDER is an option available to programs that were written to expect options and other ARGV-elements in any order and that care about the ordering of the two. We describe each non-option ARGV-element as if it were the argument of an option with character code 1. Using `-' as the first character of the list of option characters selects this mode of operation. The special argument `--' forces an end of option-scanning regardless of the value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause `getopt' to return -1 with `optind' != ARGC. */ static enum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER } ordering; /* Value of POSIXLY_CORRECT environment variable. */ static char *posixly_correct; #ifdef __GNU_LIBRARY__ /* We want to avoid inclusion of string.h with non-GNU libraries because there are many ways it can cause trouble. On some systems, it contains special magic macros that don't work in GCC. */ # include # define my_index strchr #else # if HAVE_STRING_H # include # else # include # endif /* Avoid depending on library functions or files whose names are inconsistent. */ #ifndef getenv extern char *getenv (); #endif static char * my_index (str, chr) const char *str; int chr; { while (*str) { if (*str == chr) return (char *) str; str++; } return 0; } /* If using GCC, we can safely declare strlen this way. If not using GCC, it is ok not to declare it. */ #ifdef __GNUC__ /* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. That was relevant to code that was here before. */ # if (!defined __STDC__ || !__STDC__) && !defined strlen /* gcc with -traditional declares the built-in strlen to return int, and has done so at least since version 2.4.5. -- rms. */ extern int strlen (const char *); # endif /* not __STDC__ */ #endif /* __GNUC__ */ #endif /* not __GNU_LIBRARY__ */ /* Handle permutation of arguments. */ /* Describe the part of ARGV that contains non-options that have been skipped. `first_nonopt' is the index in ARGV of the first of them; `last_nonopt' is the index after the last of them. */ static int first_nonopt; static int last_nonopt; #ifdef _LIBC /* Stored original parameters. XXX This is no good solution. We should rather copy the args so that we can compare them later. But we must not use malloc(3). */ extern int __libc_argc; extern char **__libc_argv; /* Bash 2.0 gives us an environment variable containing flags indicating ARGV elements that should not be considered arguments. */ # ifdef USE_NONOPTION_FLAGS /* Defined in getopt_init.c */ extern char *__getopt_nonoption_flags; static int nonoption_flags_max_len; static int nonoption_flags_len; # endif # ifdef USE_NONOPTION_FLAGS # define SWAP_FLAGS(ch1, ch2) \ if (nonoption_flags_len > 0) \ { \ char __tmp = __getopt_nonoption_flags[ch1]; \ __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ __getopt_nonoption_flags[ch2] = __tmp; \ } # else # define SWAP_FLAGS(ch1, ch2) # endif #else /* !_LIBC */ # define SWAP_FLAGS(ch1, ch2) #endif /* _LIBC */ /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) which contains all the non-options that have been skipped so far. The other is elements [last_nonopt,optind), which contains all the options processed since those non-options were skipped. `first_nonopt' and `last_nonopt' are relocated so that they describe the new indices of the non-options in ARGV after they are moved. */ #if defined __STDC__ && __STDC__ static void exchange (char **); #endif static void exchange (argv) char **argv; { int bottom = first_nonopt; int middle = last_nonopt; int top = optind; char *tem; /* Exchange the shorter segment with the far end of the longer segment. That puts the shorter segment into the right place. It leaves the longer segment in the right place overall, but it consists of two parts that need to be swapped next. */ #if defined _LIBC && defined USE_NONOPTION_FLAGS /* First make sure the handling of the `__getopt_nonoption_flags' string can work normally. Our top argument must be in the range of the string. */ if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) { /* We must extend the array. The user plays games with us and presents new arguments. */ char *new_str = malloc (top + 1); if (new_str == NULL) nonoption_flags_len = nonoption_flags_max_len = 0; else { memset (__mempcpy (new_str, __getopt_nonoption_flags, nonoption_flags_max_len), '\0', top + 1 - nonoption_flags_max_len); nonoption_flags_max_len = top + 1; __getopt_nonoption_flags = new_str; } } #endif while (top > middle && middle > bottom) { if (top - middle > middle - bottom) { /* Bottom segment is the short one. */ int len = middle - bottom; register int i; /* Swap it with the top part of the top segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[top - (middle - bottom) + i]; argv[top - (middle - bottom) + i] = tem; SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); } /* Exclude the moved bottom segment from further swapping. */ top -= len; } else { /* Top segment is the short one. */ int len = top - middle; register int i; /* Swap it with the bottom part of the bottom segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[middle + i]; argv[middle + i] = tem; SWAP_FLAGS (bottom + i, middle + i); } /* Exclude the moved top segment from further swapping. */ bottom += len; } } /* Update records for the slots the non-options now occupy. */ first_nonopt += (optind - last_nonopt); last_nonopt = optind; } /* Initialize the internal data when the first call is made. */ #if defined __STDC__ && __STDC__ static const char *_getopt_initialize (int, char *const *, const char *); #endif static const char * _getopt_initialize (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { /* Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped non-option ARGV-elements is empty. */ first_nonopt = last_nonopt = optind; nextchar = NULL; posixly_correct = getenv ("POSIXLY_CORRECT"); /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') { ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == '+') { ordering = REQUIRE_ORDER; ++optstring; } else if (posixly_correct != NULL) ordering = REQUIRE_ORDER; else ordering = PERMUTE; #if defined _LIBC && defined USE_NONOPTION_FLAGS if (posixly_correct == NULL && argc == __libc_argc && argv == __libc_argv) { if (nonoption_flags_max_len == 0) { if (__getopt_nonoption_flags == NULL || __getopt_nonoption_flags[0] == '\0') nonoption_flags_max_len = -1; else { const char *orig_str = __getopt_nonoption_flags; int len = nonoption_flags_max_len = strlen (orig_str); if (nonoption_flags_max_len < argc) nonoption_flags_max_len = argc; __getopt_nonoption_flags = (char *) malloc (nonoption_flags_max_len); if (__getopt_nonoption_flags == NULL) nonoption_flags_max_len = -1; else memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), '\0', nonoption_flags_max_len - len); } } nonoption_flags_len = nonoption_flags_max_len; } else nonoption_flags_len = 0; #endif return optstring; } /* Scan elements of ARGV (whose length is ARGC) for option characters given in OPTSTRING. If an element of ARGV starts with '-', and is not exactly "-" or "--", then it is an option element. The characters of this element (aside from the initial '-') are option characters. If `getopt' is called repeatedly, it returns successively each of the option characters from each of the option elements. If `getopt' finds another option character, it returns that character, updating `optind' and `nextchar' so that the next call to `getopt' can resume the scan with the following option character or ARGV-element. If there are no more option characters, `getopt' returns -1. Then `optind' is the index in ARGV of the first ARGV-element that is not an option. (The ARGV-elements have been permuted so that those that are not options now come last.) OPTSTRING is a string containing the legitimate option characters. If an option character is seen that is not listed in OPTSTRING, return '?' after printing an error message. If you set `opterr' to zero, the error message is suppressed but we still return '?'. If a char in OPTSTRING is followed by a colon, that means it wants an arg, so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in `optarg'. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, it is returned in `optarg', otherwise `optarg' is set to zero. If OPTSTRING starts with `-' or `+', it requests different methods of handling the non-option ARGV-elements. See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. Long-named options begin with `--' instead of `-'. Their names may be abbreviated as long as the abbreviation is unique or is an exact match for some defined option. If they have an argument, it follows the option name in the same ARGV-element, separated from the option name by a `=', or else the in next ARGV-element. When `getopt' finds a long-named option, it returns 0 if that option's `flag' field is nonzero, the value of the option's `val' field if the `flag' field is zero. The elements of ARGV aren't really const, because we permute them. But we pretend they're const in the prototype to be compatible with other systems. LONGOPTS is a vector of `struct option' terminated by an element containing a name which is zero. LONGIND returns the index in LONGOPT of the long-named option found. It is only valid when a long-named option has been found by the most recent call. If LONG_ONLY is nonzero, '-' as well as '--' can introduce long-named options. */ int _getopt_internal (argc, argv, optstring, longopts, longind, long_only) int argc; char *const *argv; const char *optstring; const struct option *longopts; int *longind; int long_only; { int print_errors = opterr; if (optstring[0] == ':') print_errors = 0; if (argc < 1) return -1; optarg = NULL; if (optind == 0 || !__getopt_initialized) { if (optind == 0) optind = 1; /* Don't scan ARGV[0], the program name. */ optstring = _getopt_initialize (argc, argv, optstring); __getopt_initialized = 1; } /* Test whether ARGV[optind] points to a non-option argument. Either it does not have option syntax, or there is an environment flag from the shell indicating it is not an option. The later information is only used when the used in the GNU libc. */ #if defined _LIBC && defined USE_NONOPTION_FLAGS # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ || (optind < nonoption_flags_len \ && __getopt_nonoption_flags[optind] == '1')) #else # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') #endif if (nextchar == NULL || *nextchar == '\0') { /* Advance to the next ARGV-element. */ /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been moved back by the user (who may also have changed the arguments). */ if (last_nonopt > optind) last_nonopt = optind; if (first_nonopt > optind) first_nonopt = optind; if (ordering == PERMUTE) { /* If we have just processed some options following some non-options, exchange them so that the options come first. */ if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (last_nonopt != optind) first_nonopt = optind; /* Skip any additional non-options and extend the range of non-options previously skipped. */ while (optind < argc && NONOPTION_P) optind++; last_nonopt = optind; } /* The special ARGV-element `--' means premature end of options. Skip it like a null option, then exchange with previous non-options as if it were an option, then skip everything else like a non-option. */ if (optind != argc && !strcmp (argv[optind], "--")) { optind++; if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (first_nonopt == last_nonopt) first_nonopt = optind; last_nonopt = argc; optind = argc; } /* If we have done all the ARGV-elements, stop the scan and back over any non-options that we skipped and permuted. */ if (optind == argc) { /* Set the next-arg-index to point at the non-options that we previously skipped, so the caller will digest them. */ if (first_nonopt != last_nonopt) optind = first_nonopt; return -1; } /* If we have come to a non-option and did not permute it, either stop the scan or describe it to the caller and pass it by. */ if (NONOPTION_P) { if (ordering == REQUIRE_ORDER) return -1; optarg = argv[optind++]; return 1; } /* We have found another option-ARGV-element. Skip the initial punctuation. */ nextchar = (argv[optind] + 1 + (longopts != NULL && argv[optind][1] == '-')); } /* Decode the current option-ARGV-element. */ /* Check whether the ARGV-element is a long option. If long_only and the ARGV-element has the form "-f", where f is a valid short option, don't consider it an abbreviated form of a long option that starts with f. Otherwise there would be no way to give the -f short option. On the other hand, if there's a long option "fubar" and the ARGV-element is "-fu", do consider that an abbreviation of the long option, just like "--fu", and not "-f" with arg "u". This distinction seems to be the most useful approach. */ if (longopts != NULL && (argv[optind][1] == '-' || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = -1; int option_index; for (nameend = nextchar; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - nextchar) == (unsigned int) strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val) /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("%s: option `%s' is ambiguous\n"), argv[0], argv[optind]) >= 0) { if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); free (buf); } #else fprintf (stderr, _("%s: option `%s' is ambiguous\n"), argv[0], argv[optind]); #endif } nextchar += strlen (nextchar); optind++; optopt = 0; return '?'; } if (pfound != NULL) { option_index = indfound; optind++; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; int n; #endif if (argv[optind - 1][1] == '-') { /* --option */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("\ %s: option `--%s' doesn't allow an argument\n"), argv[0], pfound->name); #else fprintf (stderr, _("\ %s: option `--%s' doesn't allow an argument\n"), argv[0], pfound->name); #endif } else { /* +option or -option */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("\ %s: option `%c%s' doesn't allow an argument\n"), argv[0], argv[optind - 1][0], pfound->name); #else fprintf (stderr, _("\ %s: option `%c%s' doesn't allow an argument\n"), argv[0], argv[optind - 1][0], pfound->name); #endif } #if defined _LIBC && defined USE_IN_LIBIO if (n >= 0) { if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); free (buf); } #endif } nextchar += strlen (nextchar); optopt = pfound->val; return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("\ %s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]) >= 0) { if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); free (buf); } #else fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); #endif } nextchar += strlen (nextchar); optopt = pfound->val; return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } /* Can't find it as a long option. If this is not getopt_long_only, or the option starts with '--' or is not a valid short option, then it's an error. Otherwise interpret it as a short option. */ if (!long_only || argv[optind][1] == '-' || my_index (optstring, *nextchar) == NULL) { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; int n; #endif if (argv[optind][1] == '-') { /* --option */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("%s: unrecognized option `--%s'\n"), argv[0], nextchar); #else fprintf (stderr, _("%s: unrecognized option `--%s'\n"), argv[0], nextchar); #endif } else { /* +option or -option */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("%s: unrecognized option `%c%s'\n"), argv[0], argv[optind][0], nextchar); #else fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), argv[0], argv[optind][0], nextchar); #endif } #if defined _LIBC && defined USE_IN_LIBIO if (n >= 0) { if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); free (buf); } #endif } nextchar = (char *) ""; optind++; optopt = 0; return '?'; } } /* Look at and handle the next short option-character. */ { char c = *nextchar++; char *temp = my_index (optstring, c); /* Increment `optind' when we start to process its last character. */ if (*nextchar == '\0') ++optind; if (temp == NULL || c == ':') { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; int n; #endif if (posixly_correct) { /* 1003.2 specifies the format of this message. */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("%s: illegal option -- %c\n"), argv[0], c); #else fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c); #endif } else { #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("%s: invalid option -- %c\n"), argv[0], c); #else fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c); #endif } #if defined _LIBC && defined USE_IN_LIBIO if (n >= 0) { if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); free (buf); } #endif } optopt = c; return '?'; } /* Convenience. Treat POSIX -W foo same as long option --foo */ if (temp[0] == 'W' && temp[1] == ';') { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = 0; int option_index; /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (print_errors) { /* 1003.2 specifies the format of this message. */ #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("%s: option requires an argument -- %c\n"), argv[0], c) >= 0) { if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); free (buf); } #else fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); #endif } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; return c; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; /* optarg is now the argument, see if it's in the table of longopts. */ for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - nextchar) == strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("%s: option `-W %s' is ambiguous\n"), argv[0], argv[optind]) >= 0) { if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); free (buf); } #else fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), argv[0], argv[optind]); #endif } nextchar += strlen (nextchar); optind++; return '?'; } if (pfound != NULL) { option_index = indfound; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("\ %s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name) >= 0) { if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); free (buf); } #else fprintf (stderr, _("\ %s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name); #endif } nextchar += strlen (nextchar); return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("\ %s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]) >= 0) { if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); free (buf); } #else fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); #endif } nextchar += strlen (nextchar); return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } nextchar = NULL; return 'W'; /* Let the application handle it. */ } if (temp[1] == ':') { if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ if (*nextchar != '\0') { optarg = nextchar; optind++; } else optarg = NULL; nextchar = NULL; } else { /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (print_errors) { /* 1003.2 specifies the format of this message. */ #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("\ %s: option requires an argument -- %c\n"), argv[0], c) >= 0) { if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); free (buf); } #else fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); #endif } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; nextchar = NULL; } } return c; } } int getopt (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { return _getopt_internal (argc, argv, optstring, (const struct option *) 0, (int *) 0, 0); } #endif /* Not ELIDE_CODE. */ #ifdef TEST /* Compile with -DTEST to make an executable for use in testing the above definition of `getopt'. */ int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; c = getopt (argc, argv, "abc:d:0123456789"); if (c == -1) break; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ gtkwave-3.3.86/src/renderopt.c0000664000175000017500000003716613166335473015556 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2012 * * 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. */ #include "globals.h" #include #include "currenttime.h" #include "print.h" #include "menu.h" #include #ifdef WAVE_GTK_UNIX_PRINT /* #include */ #include #endif static char *render_targets[]= {"PDF", "PS", "MIF", "UNIX"}; static char *page_size[]= {"Letter (8.5\" x 11\")", "A4 (11.68\" x 8.26\")", "Legal (14\" x 8.5\")", "Letter Prop (6.57\" x 8.5\")", "A4 Prop (8.26\" x 5.84\")"}; static char *render_type[]= {"Full", "Minimal"}; static gdouble px[]={11.00, 11.68, 14.00, 8.50, 8.26}; static gdouble py[]={ 8.50, 8.26, 8.50, 6.57, 5.84}; /* * button/menu/entry activations.. */ static void render_clicked(GtkWidget *widget, gpointer which) { (void)widget; int i; for(i=0;i<4;i++) GLOBALS->target_mutex_renderopt_c_1[i]=0; i = (int)((intptr_t)which); GLOBALS->target_mutex_renderopt_c_1[i] = 1; /* mark our choice */ DEBUG(printf("picked: %s\n", render_targets[i])); } static void pagesize_clicked(GtkWidget *widget, gpointer which) { (void)widget; int i; for(i=0;i<5;i++) GLOBALS->page_mutex_renderopt_c_1[i]=0; GLOBALS->page_size_type_renderopt_c_1 = (int)((intptr_t)which); GLOBALS->page_mutex_renderopt_c_1[GLOBALS->page_size_type_renderopt_c_1] = 1; /* mark our choice */ DEBUG(printf("picked: %s\n", page_size[GLOBALS->page_size_type_renderopt_c_1])); } static void rendertype_clicked(GtkWidget *widget, gpointer which) { (void)widget; int i; for(i=0;i<3;i++) GLOBALS->render_mutex_renderopt_c_1[i]=0; i = (int)((intptr_t)which); GLOBALS->render_mutex_renderopt_c_1[i] = 1; /* mark our choice */ DEBUG(printf("picked: %s\n", render_type[i])); } static void ps_print_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; FILE *wave; if(GLOBALS->filesel_ok) { DEBUG(printf("PS Print Fini: %s\n", *GLOBALS->fileselbox_text)); if(!(wave=fopen(*GLOBALS->fileselbox_text,"wb"))) { fprintf(stderr, "Error opening PS output file '%s' for writing.\n",*GLOBALS->fileselbox_text); perror("Why"); errno=0; } else { print_ps_image(wave,px[GLOBALS->page_size_type_renderopt_c_1],py[GLOBALS->page_size_type_renderopt_c_1]); fclose(wave); } } } static void pdf_print_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; FILE *wave; FILE *wave2; if(GLOBALS->filesel_ok) { DEBUG(printf("PDF Print Fini: %s\n", *GLOBALS->fileselbox_text)); if(!(wave=fopen(*GLOBALS->fileselbox_text,"wb"))) { fprintf(stderr, "Error opening PDF output file '%s' for writing.\n",*GLOBALS->fileselbox_text); perror("Why"); errno=0; } else { int len = strlen(*GLOBALS->fileselbox_text) ; char *zname = malloc_2(len + 4); strcpy(zname, *GLOBALS->fileselbox_text); #ifdef MAC_INTEGRATION if((len > 4)&&(!strcmp(".pdf", zname+len-4))) { zname[len-4] = 0; len-=4; } #endif strcpy(zname+len, ".ps"); if(!(wave2=fopen(zname,"wb"))) { fprintf(stderr, "Error opening PS output tempfile '%s' for writing.\n",zname); perror("Why"); fclose(wave); unlink(*GLOBALS->fileselbox_text); errno=0; } else { char *sysname = malloc_2(7 + 1 + len + 3 + 1 + len + 1); int rc; #ifdef MAC_INTEGRATION sprintf(sysname, "pstopdf" /* 7 */ #else sprintf(sysname, "ps2pdf" /* 6 */ #endif " " /* 1 */ "%s" /* len + 3 */ " " /* 1 */ "%s" /* len */ , zname, *GLOBALS->fileselbox_text); print_ps_image(wave2,px[GLOBALS->page_size_type_renderopt_c_1],py[GLOBALS->page_size_type_renderopt_c_1]); fclose(wave2); fclose(wave); rc = system(sysname); if(rc) { printf("GTKWAVE | ERROR: rc for '%s' = %d\n", sysname, rc); unlink(*GLOBALS->fileselbox_text); } free_2(sysname); unlink(zname); } free_2(zname); } } } static void mif_print_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; FILE *wave; if(GLOBALS->filesel_ok) { DEBUG(printf("MIF Print Fini: %s\n", *GLOBALS->fileselbox_text)); if(!(wave=fopen(*GLOBALS->fileselbox_text,"wb"))) { fprintf(stderr, "Error opening MIF output file '%s' for writing.\n",*GLOBALS->fileselbox_text); perror("Why"); errno=0; } else { print_mif_image(wave,px[GLOBALS->page_size_type_renderopt_c_1],py[GLOBALS->page_size_type_renderopt_c_1]); fclose(wave); } } } #ifdef WAVE_GTK_UNIX_PRINT static void wave_GtkPrintJobCompleteFunc(GtkPrintJob *print_job, gpointer user_data, GError *error) { (void)print_job; (void)error; if(user_data) { const char *ban = "Sent print job"; char *buf = wave_alloca(strlen(ban) + strlen(user_data) + 32); sprintf(buf, "%s '%s'", ban, (char *)user_data); status_text(buf); unlink(user_data); } } #endif static void unix_print_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; #ifdef WAVE_GTK_UNIX_PRINT GtkWidget *ropt = gtk_print_unix_dialog_new("GTK Print UNIX Options", GTK_WINDOW(GLOBALS->mainwindow)); gint gd_rc; if(GLOBALS->gprs) { gtk_print_unix_dialog_set_settings(GTK_PRINT_UNIX_DIALOG(ropt), GLOBALS->gprs); } if(GLOBALS->gps) { gtk_print_unix_dialog_set_page_setup(GTK_PRINT_UNIX_DIALOG(ropt), GLOBALS->gps); } gtk_print_unix_dialog_set_manual_capabilities(GTK_PRINT_UNIX_DIALOG(ropt), GTK_PRINT_CAPABILITY_GENERATE_PS | GTK_PRINT_CAPABILITY_COPIES ); #ifdef MAC_INTEGRATION osx_menu_sensitivity(FALSE); #endif gd_rc = gtk_dialog_run(GTK_DIALOG (ropt)); if(gd_rc == GTK_RESPONSE_OK) { GtkPrinter *gp = gtk_print_unix_dialog_get_selected_printer(GTK_PRINT_UNIX_DIALOG(ropt)); GtkPrintSettings *gprs = gtk_print_unix_dialog_get_settings(GTK_PRINT_UNIX_DIALOG(ropt)); GtkPageSetup *gps = gtk_print_unix_dialog_get_page_setup(GTK_PRINT_UNIX_DIALOG(ropt)); GtkPrintJob *gpj = gtk_print_job_new(GLOBALS->loaded_file_name, gp, gprs, gps); gboolean job_stat; GError *job_error = NULL; FILE *wave; char *save_tmpfilename; int fd_dummy = -1; if(gtk_printer_accepts_ps(gp)) { save_tmpfilename = tmpnam_2(NULL, &fd_dummy); if(!(wave=fopen(save_tmpfilename, "r+b"))) { fprintf(stderr, "Error opening PS output file '%s' for writing.\n", save_tmpfilename); perror("Why"); errno=0; } else { if(GLOBALS->gp_tfn) free_2(GLOBALS->gp_tfn); GLOBALS->gp_tfn = strdup_2(save_tmpfilename); print_ps_image(wave,px[GLOBALS->page_size_type_renderopt_c_1],py[GLOBALS->page_size_type_renderopt_c_1]); fflush(wave); fclose(wave); job_stat = gtk_print_job_set_source_file(gpj, GLOBALS->gp_tfn, &job_error); if(job_stat) { gtk_print_job_send(gpj, wave_GtkPrintJobCompleteFunc, GLOBALS->gp_tfn, NULL); GLOBALS->gprs = gtk_print_settings_copy(gprs); GLOBALS->gps = gtk_page_setup_copy(gps); } else { unlink(GLOBALS->gp_tfn); } } #if !defined _MSC_VER && !defined __MINGW32__ free_2(save_tmpfilename); #endif if(fd_dummy >=0) close(fd_dummy); } else { status_text("gtk_printer_accepts_ps() == FALSE, cannot print."); } } else if(gd_rc == GTK_RESPONSE_APPLY) { status_text("Preview not available."); } gtk_widget_destroy(ropt); #ifdef MAC_INTEGRATION osx_menu_sensitivity(TRUE); #endif #endif } static void ok_callback(void) { GLOBALS->ps_fullpage=GLOBALS->render_mutex_renderopt_c_1[0]; if(GLOBALS->target_mutex_renderopt_c_1[0]) { fileselbox("Print To PDF File",&GLOBALS->filesel_print_pdf_renderopt_c_1,GTK_SIGNAL_FUNC(pdf_print_cleanup), GTK_SIGNAL_FUNC(NULL), "*.pdf", 1); } else if(GLOBALS->target_mutex_renderopt_c_1[1]) { fileselbox("Print To PS File",&GLOBALS->filesel_print_ps_renderopt_c_1,GTK_SIGNAL_FUNC(ps_print_cleanup), GTK_SIGNAL_FUNC(NULL), "*.ps", 1); } else if(GLOBALS->target_mutex_renderopt_c_1[2]) { fileselbox("Print To MIF File",&GLOBALS->filesel_print_mif_renderopt_c_1,GTK_SIGNAL_FUNC(mif_print_cleanup), GTK_SIGNAL_FUNC(NULL), "*.fm", 1); } else { unix_print_cleanup(NULL,NULL); } } static void destroy_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; GLOBALS->is_active_renderopt_c_3=0; gtk_widget_destroy(GLOBALS->window_renderopt_c_6); GLOBALS->window_renderopt_c_6 = NULL; } void renderbox(char *title) { GtkWidget *menu, *menuitem, *optionmenu; GSList *group; GtkWidget *vbox, *hbox, *small_hbox; GtkWidget *button1, *button2; int i; /* fix problem where ungrab doesn't occur if button pressed + simultaneous accelerator key occurs */ if(GLOBALS->in_button_press_wavewindow_c_1) { gdk_pointer_ungrab(GDK_CURRENT_TIME); } if(GLOBALS->wave_script_args) { char *s1 = NULL; char *s2 = NULL; char *s3 = NULL; while((!s1)&&(GLOBALS->wave_script_args->curr)) s1 = wave_script_args_fgetmalloc_stripspaces(GLOBALS->wave_script_args); while((!s2)&&(GLOBALS->wave_script_args->curr)) s2 = wave_script_args_fgetmalloc_stripspaces(GLOBALS->wave_script_args); while((!s3)&&(GLOBALS->wave_script_args->curr)) s3 = wave_script_args_fgetmalloc_stripspaces(GLOBALS->wave_script_args); if(s1 && s2 && s3) { memset(GLOBALS->target_mutex_renderopt_c_1, 0, 2); GLOBALS->target_mutex_renderopt_c_1[0] = 1; /* PS */ #ifdef WAVE_GTK_UNIX_PRINT for(i=0;i<4;i++) #else for(i=0;i<3;i++) #endif { if(!strcmp(s1, render_targets[i])) { fprintf(stderr, "GTKWAVE | Print using '%s'\n", render_targets[i]); memset(GLOBALS->target_mutex_renderopt_c_1, 0, 4); GLOBALS->target_mutex_renderopt_c_1[i] = 1; break; } } memset(GLOBALS->page_mutex_renderopt_c_1, 0, 5); GLOBALS->page_mutex_renderopt_c_1[0] = 1; /* 8.5 x 11 */ GLOBALS->page_size_type_renderopt_c_1 = 0; for(i=0;i<5;i++) { if(!strcmp(s2, page_size[i])) { fprintf(stderr, "GTKWAVE | Print using '%s'\n", page_size[i]); memset(GLOBALS->page_mutex_renderopt_c_1, 0, 5); GLOBALS->page_mutex_renderopt_c_1[i] = 1; GLOBALS->page_size_type_renderopt_c_1 = i; break; } } memset(GLOBALS->render_mutex_renderopt_c_1, 0, 3); GLOBALS->render_mutex_renderopt_c_1[0] = 1; /* Full */ for(i=0;i<2;i++) { if(!strcmp(s3, render_type[i])) { fprintf(stderr, "GTKWAVE | Print using '%s'\n", render_type[i]); memset(GLOBALS->render_mutex_renderopt_c_1, 0, 3); GLOBALS->render_mutex_renderopt_c_1[i] = 1; break; } } free_2(s1); free_2(s2); free_2(s3); ok_callback(); } else { fprintf(stderr, "Missing script entries for renderbox, exiting.\n"); exit(255); } return; } if(GLOBALS->is_active_renderopt_c_3) { if(GLOBALS->window_renderopt_c_6) { gdk_window_raise(GLOBALS->window_renderopt_c_6->window); } return; } GLOBALS->is_active_renderopt_c_3=1; /* create a new window */ GLOBALS->window_renderopt_c_6 = gtk_window_new(GLOBALS->disable_window_manager ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL); install_focus_cb(GLOBALS->window_renderopt_c_6, ((char *)&GLOBALS->window_renderopt_c_6) - ((char *)GLOBALS)); gtk_window_set_title(GTK_WINDOW (GLOBALS->window_renderopt_c_6), title); gtk_widget_set_usize( GTK_WIDGET (GLOBALS->window_renderopt_c_6), 420, -1); gtkwave_signal_connect(GTK_OBJECT (GLOBALS->window_renderopt_c_6), "delete_event",(GtkSignalFunc) destroy_callback, NULL); gtk_window_set_policy(GTK_WINDOW(GLOBALS->window_renderopt_c_6), FALSE, FALSE, FALSE); vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (GLOBALS->window_renderopt_c_6), vbox); gtk_widget_show (vbox); small_hbox = gtk_hbox_new (TRUE, 0); gtk_widget_show (small_hbox); menu = gtk_menu_new (); group=NULL; for(i=0;i<4;i++) { GLOBALS->target_mutex_renderopt_c_1[i]=0; #ifndef WAVE_GTK_UNIX_PRINT if(i==3) { break; } #endif menuitem = gtk_radio_menu_item_new_with_label (group, render_targets[i]); group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem)); gtk_menu_append (GTK_MENU (menu), menuitem); gtk_widget_show (menuitem); gtkwave_signal_connect(GTK_OBJECT (menuitem), "activate", GTK_SIGNAL_FUNC(render_clicked), (void *)((intptr_t)i)); } GLOBALS->target_mutex_renderopt_c_1[0]=1; /* "ps" */ optionmenu = gtk_option_menu_new (); gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu); gtk_box_pack_start (GTK_BOX (small_hbox), optionmenu, TRUE, FALSE, 0); gtk_widget_show (optionmenu); menu = gtk_menu_new (); group=NULL; for(i=0;i<5;i++) { menuitem = gtk_radio_menu_item_new_with_label (group, page_size[i]); group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem)); gtk_menu_append (GTK_MENU (menu), menuitem); gtk_widget_show (menuitem); gtkwave_signal_connect(GTK_OBJECT (menuitem), "activate", GTK_SIGNAL_FUNC(pagesize_clicked), (void *)((intptr_t)i)); GLOBALS->page_mutex_renderopt_c_1[i]=0; } GLOBALS->page_mutex_renderopt_c_1[0]=1; /* "letter" */ optionmenu = gtk_option_menu_new (); gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu); gtk_box_pack_start (GTK_BOX (small_hbox), optionmenu, TRUE, FALSE, 0); gtk_widget_show (optionmenu); gtk_box_pack_start (GTK_BOX (vbox), small_hbox, FALSE, FALSE, 0); menu = gtk_menu_new (); group=NULL; for(i=0;i<2;i++) { menuitem = gtk_radio_menu_item_new_with_label (group, render_type[i]); group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem)); gtk_menu_append (GTK_MENU (menu), menuitem); gtk_widget_show (menuitem); gtkwave_signal_connect(GTK_OBJECT (menuitem), "activate", GTK_SIGNAL_FUNC(rendertype_clicked), (void *)((intptr_t)i)); GLOBALS->render_mutex_renderopt_c_1[i]=0; } GLOBALS->render_mutex_renderopt_c_1[0]=1; /* "full" */ optionmenu = gtk_option_menu_new (); gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu); gtk_box_pack_start (GTK_BOX (small_hbox), optionmenu, TRUE, FALSE, 0); gtk_widget_show (optionmenu); hbox = gtk_hbox_new (TRUE, 0); gtk_widget_show (hbox); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); button1 = gtk_button_new_with_label ("Select Output File"); gtk_widget_set_usize(button1, 100, -1); gtkwave_signal_connect(GTK_OBJECT (button1), "clicked", GTK_SIGNAL_FUNC(ok_callback), NULL); gtk_widget_show (button1); gtk_container_add (GTK_CONTAINER (hbox), button1); GTK_WIDGET_SET_FLAGS (button1, GTK_CAN_DEFAULT); gtkwave_signal_connect_object (GTK_OBJECT (button1), "realize", (GtkSignalFunc) gtk_widget_grab_default, GTK_OBJECT (button1)); button2 = gtk_button_new_with_label ("Exit"); gtk_widget_set_usize(button2, 100, -1); gtkwave_signal_connect(GTK_OBJECT (button2), "clicked", GTK_SIGNAL_FUNC(destroy_callback), NULL); GTK_WIDGET_SET_FLAGS (button2, GTK_CAN_DEFAULT); gtk_widget_show (button2); gtk_container_add (GTK_CONTAINER (hbox), button2); gtk_widget_show(GLOBALS->window_renderopt_c_6); } gtkwave-3.3.86/src/libbz2/0000775000175000017500000000000013166335473014557 5ustar bybellbybellgtkwave-3.3.86/src/libbz2/LICENSE0000664000175000017500000000355513166335473015574 0ustar bybellbybell -------------------------------------------------------------------------- This program, "bzip2", the associated library "libbzip2", and all documentation, are copyright (C) 1996-2010 Julian R Seward. All rights reserved. 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. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Julian Seward, jseward@bzip.org bzip2/libbzip2 version 1.0.6 of 6 September 2010 -------------------------------------------------------------------------- gtkwave-3.3.86/src/libbz2/bzlib_private.h0000664000175000017500000003167413166335473017577 0ustar bybellbybell /*-------------------------------------------------------------*/ /*--- Private header file for the library. ---*/ /*--- bzlib_private.h ---*/ /*-------------------------------------------------------------*/ /* ------------------------------------------------------------------ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. bzip2/libbzip2 version 1.0.6 of 6 September 2010 Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. This program is released under the terms of the license contained in the file LICENSE. ------------------------------------------------------------------ */ #ifndef _BZLIB_PRIVATE_H #define _BZLIB_PRIVATE_H #include #ifndef BZ_NO_STDIO #include #include #include #endif #include "bzlib.h" /*-- General stuff. --*/ #define BZ_VERSION "1.0.6, 6-Sept-2010" typedef char Char; typedef unsigned char Bool; typedef unsigned char UChar; typedef int Int32; typedef unsigned int UInt32; typedef short Int16; typedef unsigned short UInt16; #define True ((Bool)1) #define False ((Bool)0) #ifndef __GNUC__ #define __inline__ /* */ #endif #ifndef BZ_NO_STDIO extern void BZ2_bz__AssertH__fail ( int errcode ); #define AssertH(cond,errcode) \ { if (!(cond)) BZ2_bz__AssertH__fail ( errcode ); } #if BZ_DEBUG #define AssertD(cond,msg) \ { if (!(cond)) { \ fprintf ( stderr, \ "\n\nlibbzip2(debug build): internal error\n\t%s\n", msg );\ exit(1); \ }} #else #define AssertD(cond,msg) /* */ #endif #define VPrintf0(zf) \ fprintf(stderr,zf) #define VPrintf1(zf,za1) \ fprintf(stderr,zf,za1) #define VPrintf2(zf,za1,za2) \ fprintf(stderr,zf,za1,za2) #define VPrintf3(zf,za1,za2,za3) \ fprintf(stderr,zf,za1,za2,za3) #define VPrintf4(zf,za1,za2,za3,za4) \ fprintf(stderr,zf,za1,za2,za3,za4) #define VPrintf5(zf,za1,za2,za3,za4,za5) \ fprintf(stderr,zf,za1,za2,za3,za4,za5) #else extern void bz_internal_error ( int errcode ); #define AssertH(cond,errcode) \ { if (!(cond)) bz_internal_error ( errcode ); } #define AssertD(cond,msg) do { } while (0) #define VPrintf0(zf) do { } while (0) #define VPrintf1(zf,za1) do { } while (0) #define VPrintf2(zf,za1,za2) do { } while (0) #define VPrintf3(zf,za1,za2,za3) do { } while (0) #define VPrintf4(zf,za1,za2,za3,za4) do { } while (0) #define VPrintf5(zf,za1,za2,za3,za4,za5) do { } while (0) #endif #define BZALLOC(nnn) (strm->bzalloc)(strm->opaque,(nnn),1) #define BZFREE(ppp) (strm->bzfree)(strm->opaque,(ppp)) /*-- Header bytes. --*/ #define BZ_HDR_B 0x42 /* 'B' */ #define BZ_HDR_Z 0x5a /* 'Z' */ #define BZ_HDR_h 0x68 /* 'h' */ #define BZ_HDR_0 0x30 /* '0' */ /*-- Constants for the back end. --*/ #define BZ_MAX_ALPHA_SIZE 258 #define BZ_MAX_CODE_LEN 23 #define BZ_RUNA 0 #define BZ_RUNB 1 #define BZ_N_GROUPS 6 #define BZ_G_SIZE 50 #define BZ_N_ITERS 4 #define BZ_MAX_SELECTORS (2 + (900000 / BZ_G_SIZE)) /*-- Stuff for randomising repetitive blocks. --*/ extern Int32 BZ2_rNums[512]; #define BZ_RAND_DECLS \ Int32 rNToGo; \ Int32 rTPos \ #define BZ_RAND_INIT_MASK \ s->rNToGo = 0; \ s->rTPos = 0 \ #define BZ_RAND_MASK ((s->rNToGo == 1) ? 1 : 0) #define BZ_RAND_UPD_MASK \ if (s->rNToGo == 0) { \ s->rNToGo = BZ2_rNums[s->rTPos]; \ s->rTPos++; \ if (s->rTPos == 512) s->rTPos = 0; \ } \ s->rNToGo--; /*-- Stuff for doing CRCs. --*/ extern UInt32 BZ2_crc32Table[256]; #define BZ_INITIALISE_CRC(crcVar) \ { \ crcVar = 0xffffffffL; \ } #define BZ_FINALISE_CRC(crcVar) \ { \ crcVar = ~(crcVar); \ } #define BZ_UPDATE_CRC(crcVar,cha) \ { \ crcVar = (crcVar << 8) ^ \ BZ2_crc32Table[(crcVar >> 24) ^ \ ((UChar)cha)]; \ } /*-- States and modes for compression. --*/ #define BZ_M_IDLE 1 #define BZ_M_RUNNING 2 #define BZ_M_FLUSHING 3 #define BZ_M_FINISHING 4 #define BZ_S_OUTPUT 1 #define BZ_S_INPUT 2 #define BZ_N_RADIX 2 #define BZ_N_QSORT 12 #define BZ_N_SHELL 18 #define BZ_N_OVERSHOOT (BZ_N_RADIX + BZ_N_QSORT + BZ_N_SHELL + 2) /*-- Structure holding all the compression-side stuff. --*/ typedef struct { /* pointer back to the struct bz_stream */ bz_stream* strm; /* mode this stream is in, and whether inputting */ /* or outputting data */ Int32 mode; Int32 state; /* remembers avail_in when flush/finish requested */ UInt32 avail_in_expect; /* for doing the block sorting */ UInt32* arr1; UInt32* arr2; UInt32* ftab; Int32 origPtr; /* aliases for arr1 and arr2 */ UInt32* ptr; UChar* block; UInt16* mtfv; UChar* zbits; /* for deciding when to use the fallback sorting algorithm */ Int32 workFactor; /* run-length-encoding of the input */ UInt32 state_in_ch; Int32 state_in_len; BZ_RAND_DECLS; /* input and output limits and current posns */ Int32 nblock; Int32 nblockMAX; Int32 numZ; Int32 state_out_pos; /* map of bytes used in block */ Int32 nInUse; Bool inUse[256]; UChar unseqToSeq[256]; /* the buffer for bit stream creation */ UInt32 bsBuff; Int32 bsLive; /* block and combined CRCs */ UInt32 blockCRC; UInt32 combinedCRC; /* misc administratium */ Int32 verbosity; Int32 blockNo; Int32 blockSize100k; /* stuff for coding the MTF values */ Int32 nMTF; Int32 mtfFreq [BZ_MAX_ALPHA_SIZE]; UChar selector [BZ_MAX_SELECTORS]; UChar selectorMtf[BZ_MAX_SELECTORS]; UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; Int32 code [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; Int32 rfreq [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; /* second dimension: only 3 needed; 4 makes index calculations faster */ UInt32 len_pack[BZ_MAX_ALPHA_SIZE][4]; } EState; /*-- externs for compression. --*/ extern void BZ2_blockSort ( EState* ); extern void BZ2_compressBlock ( EState*, Bool ); extern void BZ2_bsInitWrite ( EState* ); extern void BZ2_hbAssignCodes ( Int32*, UChar*, Int32, Int32, Int32 ); extern void BZ2_hbMakeCodeLengths ( UChar*, Int32*, Int32, Int32 ); /*-- states for decompression. --*/ #define BZ_X_IDLE 1 #define BZ_X_OUTPUT 2 #define BZ_X_MAGIC_1 10 #define BZ_X_MAGIC_2 11 #define BZ_X_MAGIC_3 12 #define BZ_X_MAGIC_4 13 #define BZ_X_BLKHDR_1 14 #define BZ_X_BLKHDR_2 15 #define BZ_X_BLKHDR_3 16 #define BZ_X_BLKHDR_4 17 #define BZ_X_BLKHDR_5 18 #define BZ_X_BLKHDR_6 19 #define BZ_X_BCRC_1 20 #define BZ_X_BCRC_2 21 #define BZ_X_BCRC_3 22 #define BZ_X_BCRC_4 23 #define BZ_X_RANDBIT 24 #define BZ_X_ORIGPTR_1 25 #define BZ_X_ORIGPTR_2 26 #define BZ_X_ORIGPTR_3 27 #define BZ_X_MAPPING_1 28 #define BZ_X_MAPPING_2 29 #define BZ_X_SELECTOR_1 30 #define BZ_X_SELECTOR_2 31 #define BZ_X_SELECTOR_3 32 #define BZ_X_CODING_1 33 #define BZ_X_CODING_2 34 #define BZ_X_CODING_3 35 #define BZ_X_MTF_1 36 #define BZ_X_MTF_2 37 #define BZ_X_MTF_3 38 #define BZ_X_MTF_4 39 #define BZ_X_MTF_5 40 #define BZ_X_MTF_6 41 #define BZ_X_ENDHDR_2 42 #define BZ_X_ENDHDR_3 43 #define BZ_X_ENDHDR_4 44 #define BZ_X_ENDHDR_5 45 #define BZ_X_ENDHDR_6 46 #define BZ_X_CCRC_1 47 #define BZ_X_CCRC_2 48 #define BZ_X_CCRC_3 49 #define BZ_X_CCRC_4 50 /*-- Constants for the fast MTF decoder. --*/ #define MTFA_SIZE 4096 #define MTFL_SIZE 16 /*-- Structure holding all the decompression-side stuff. --*/ typedef struct { /* pointer back to the struct bz_stream */ bz_stream* strm; /* state indicator for this stream */ Int32 state; /* for doing the final run-length decoding */ UChar state_out_ch; Int32 state_out_len; Bool blockRandomised; BZ_RAND_DECLS; /* the buffer for bit stream reading */ UInt32 bsBuff; Int32 bsLive; /* misc administratium */ Int32 blockSize100k; Bool smallDecompress; Int32 currBlockNo; Int32 verbosity; /* for undoing the Burrows-Wheeler transform */ Int32 origPtr; UInt32 tPos; Int32 k0; Int32 unzftab[256]; Int32 nblock_used; Int32 cftab[257]; Int32 cftabCopy[257]; /* for undoing the Burrows-Wheeler transform (FAST) */ UInt32 *tt; /* for undoing the Burrows-Wheeler transform (SMALL) */ UInt16 *ll16; UChar *ll4; /* stored and calculated CRCs */ UInt32 storedBlockCRC; UInt32 storedCombinedCRC; UInt32 calculatedBlockCRC; UInt32 calculatedCombinedCRC; /* map of bytes used in block */ Int32 nInUse; Bool inUse[256]; Bool inUse16[16]; UChar seqToUnseq[256]; /* for decoding the MTF values */ UChar mtfa [MTFA_SIZE]; Int32 mtfbase[256 / MTFL_SIZE]; UChar selector [BZ_MAX_SELECTORS]; UChar selectorMtf[BZ_MAX_SELECTORS]; UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; Int32 limit [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; Int32 base [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; Int32 perm [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; Int32 minLens[BZ_N_GROUPS]; /* save area for scalars in the main decompress code */ Int32 save_i; Int32 save_j; Int32 save_t; Int32 save_alphaSize; Int32 save_nGroups; Int32 save_nSelectors; Int32 save_EOB; Int32 save_groupNo; Int32 save_groupPos; Int32 save_nextSym; Int32 save_nblockMAX; Int32 save_nblock; Int32 save_es; Int32 save_N; Int32 save_curr; Int32 save_zt; Int32 save_zn; Int32 save_zvec; Int32 save_zj; Int32 save_gSel; Int32 save_gMinlen; Int32* save_gLimit; Int32* save_gBase; Int32* save_gPerm; } DState; /*-- Macros for decompression. --*/ #define BZ_GET_FAST(cccc) \ /* c_tPos is unsigned, hence test < 0 is pointless. */ \ if (s->tPos >= (UInt32)100000 * (UInt32)s->blockSize100k) return True; \ s->tPos = s->tt[s->tPos]; \ cccc = (UChar)(s->tPos & 0xff); \ s->tPos >>= 8; #define BZ_GET_FAST_C(cccc) \ /* c_tPos is unsigned, hence test < 0 is pointless. */ \ if (c_tPos >= (UInt32)100000 * (UInt32)ro_blockSize100k) return True; \ c_tPos = c_tt[c_tPos]; \ cccc = (UChar)(c_tPos & 0xff); \ c_tPos >>= 8; #define SET_LL4(i,n) \ { if (((i) & 0x1) == 0) \ s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0xf0) | (n); else \ s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0x0f) | ((n) << 4); \ } #define GET_LL4(i) \ ((((UInt32)(s->ll4[(i) >> 1])) >> (((i) << 2) & 0x4)) & 0xF) #define SET_LL(i,n) \ { s->ll16[i] = (UInt16)(n & 0x0000ffff); \ SET_LL4(i, n >> 16); \ } #define GET_LL(i) \ (((UInt32)s->ll16[i]) | (GET_LL4(i) << 16)) #define BZ_GET_SMALL(cccc) \ /* c_tPos is unsigned, hence test < 0 is pointless. */ \ if (s->tPos >= (UInt32)100000 * (UInt32)s->blockSize100k) return True; \ cccc = BZ2_indexIntoF ( s->tPos, s->cftab ); \ s->tPos = GET_LL(s->tPos); /*-- externs for decompression. --*/ extern Int32 BZ2_indexIntoF ( Int32, Int32* ); extern Int32 BZ2_decompress ( DState* ); extern void BZ2_hbCreateDecodeTables ( Int32*, Int32*, Int32*, UChar*, Int32, Int32, Int32 ); #endif /*-- BZ_NO_STDIO seems to make NULL disappear on some platforms. --*/ #ifdef BZ_NO_STDIO #ifndef NULL #define NULL 0 #endif #endif /*-------------------------------------------------------------*/ /*--- end bzlib_private.h ---*/ /*-------------------------------------------------------------*/ gtkwave-3.3.86/src/libbz2/Makefile.in0000664000175000017500000004303213166335473016626 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = src/libbz2 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libbz2_a_AR = $(AR) $(ARFLAGS) libbz2_a_LIBADD = am_libbz2_a_OBJECTS = blocksort.$(OBJEXT) compress.$(OBJEXT) \ decompress.$(OBJEXT) randtable.$(OBJEXT) bzlib.$(OBJEXT) \ crctable.$(OBJEXT) huffman.$(OBJEXT) libbz2_a_OBJECTS = $(am_libbz2_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libbz2_a_SOURCES) DIST_SOURCES = $(libbz2_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libbz2.a libbz2_a_SOURCES = blocksort.c bzlib.h compress.c decompress.c randtable.c \ bzlib.c bzlib_private.h crctable.c huffman.c EXTRA_DIST = bzlib.h LICENSE all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/libbz2/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/libbz2/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libbz2.a: $(libbz2_a_OBJECTS) $(libbz2_a_DEPENDENCIES) $(EXTRA_libbz2_a_DEPENDENCIES) $(AM_V_at)-rm -f libbz2.a $(AM_V_AR)$(libbz2_a_AR) libbz2.a $(libbz2_a_OBJECTS) $(libbz2_a_LIBADD) $(AM_V_at)$(RANLIB) libbz2.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blocksort.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bzlib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compress.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crctable.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/decompress.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/huffman.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/randtable.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/src/libbz2/blocksort.c0000664000175000017500000007374613166335473016746 0ustar bybellbybell /*-------------------------------------------------------------*/ /*--- Block sorting machinery ---*/ /*--- blocksort.c ---*/ /*-------------------------------------------------------------*/ /* ------------------------------------------------------------------ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. bzip2/libbzip2 version 1.0.6 of 6 September 2010 Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. This program is released under the terms of the license contained in the file LICENSE. ------------------------------------------------------------------ */ #include "bzlib_private.h" /*---------------------------------------------*/ /*--- Fallback O(N log(N)^2) sorting ---*/ /*--- algorithm, for repetitive blocks ---*/ /*---------------------------------------------*/ /*---------------------------------------------*/ static __inline__ void fallbackSimpleSort ( UInt32* fmap, UInt32* eclass, Int32 lo, Int32 hi ) { Int32 i, j, tmp; UInt32 ec_tmp; if (lo == hi) return; if (hi - lo > 3) { for ( i = hi-4; i >= lo; i-- ) { tmp = fmap[i]; ec_tmp = eclass[tmp]; for ( j = i+4; j <= hi && ec_tmp > eclass[fmap[j]]; j += 4 ) fmap[j-4] = fmap[j]; fmap[j-4] = tmp; } } for ( i = hi-1; i >= lo; i-- ) { tmp = fmap[i]; ec_tmp = eclass[tmp]; for ( j = i+1; j <= hi && ec_tmp > eclass[fmap[j]]; j++ ) fmap[j-1] = fmap[j]; fmap[j-1] = tmp; } } /*---------------------------------------------*/ #define fswap(zz1, zz2) \ { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; } #define fvswap(zzp1, zzp2, zzn) \ { \ Int32 yyp1 = (zzp1); \ Int32 yyp2 = (zzp2); \ Int32 yyn = (zzn); \ while (yyn > 0) { \ fswap(fmap[yyp1], fmap[yyp2]); \ yyp1++; yyp2++; yyn--; \ } \ } #define fmin(a,b) ((a) < (b)) ? (a) : (b) #define fpush(lz,hz) { stackLo[sp] = lz; \ stackHi[sp] = hz; \ sp++; } #define fpop(lz,hz) { sp--; \ lz = stackLo[sp]; \ hz = stackHi[sp]; } #define FALLBACK_QSORT_SMALL_THRESH 10 #define FALLBACK_QSORT_STACK_SIZE 100 static void fallbackQSort3 ( UInt32* fmap, UInt32* eclass, Int32 loSt, Int32 hiSt ) { Int32 unLo, unHi, ltLo, gtHi, n, m; Int32 sp, lo, hi; UInt32 med, r, r3; Int32 stackLo[FALLBACK_QSORT_STACK_SIZE]; Int32 stackHi[FALLBACK_QSORT_STACK_SIZE]; r = 0; sp = 0; fpush ( loSt, hiSt ); while (sp > 0) { AssertH ( sp < FALLBACK_QSORT_STACK_SIZE - 1, 1004 ); fpop ( lo, hi ); if (hi - lo < FALLBACK_QSORT_SMALL_THRESH) { fallbackSimpleSort ( fmap, eclass, lo, hi ); continue; } /* Random partitioning. Median of 3 sometimes fails to avoid bad cases. Median of 9 seems to help but looks rather expensive. This too seems to work but is cheaper. Guidance for the magic constants 7621 and 32768 is taken from Sedgewick's algorithms book, chapter 35. */ r = ((r * 7621) + 1) % 32768; r3 = r % 3; if (r3 == 0) med = eclass[fmap[lo]]; else if (r3 == 1) med = eclass[fmap[(lo+hi)>>1]]; else med = eclass[fmap[hi]]; unLo = ltLo = lo; unHi = gtHi = hi; while (1) { while (1) { if (unLo > unHi) break; n = (Int32)eclass[fmap[unLo]] - (Int32)med; if (n == 0) { fswap(fmap[unLo], fmap[ltLo]); ltLo++; unLo++; continue; }; if (n > 0) break; unLo++; } while (1) { if (unLo > unHi) break; n = (Int32)eclass[fmap[unHi]] - (Int32)med; if (n == 0) { fswap(fmap[unHi], fmap[gtHi]); gtHi--; unHi--; continue; }; if (n < 0) break; unHi--; } if (unLo > unHi) break; fswap(fmap[unLo], fmap[unHi]); unLo++; unHi--; } AssertD ( unHi == unLo-1, "fallbackQSort3(2)" ); if (gtHi < ltLo) continue; n = fmin(ltLo-lo, unLo-ltLo); fvswap(lo, unLo-n, n); m = fmin(hi-gtHi, gtHi-unHi); fvswap(unLo, hi-m+1, m); n = lo + unLo - ltLo - 1; m = hi - (gtHi - unHi) + 1; if (n - lo > hi - m) { fpush ( lo, n ); fpush ( m, hi ); } else { fpush ( m, hi ); fpush ( lo, n ); } } } #undef fmin #undef fpush #undef fpop #undef fswap #undef fvswap #undef FALLBACK_QSORT_SMALL_THRESH #undef FALLBACK_QSORT_STACK_SIZE /*---------------------------------------------*/ /* Pre: nblock > 0 eclass exists for [0 .. nblock-1] ((UChar*)eclass) [0 .. nblock-1] holds block ptr exists for [0 .. nblock-1] Post: ((UChar*)eclass) [0 .. nblock-1] holds block All other areas of eclass destroyed fmap [0 .. nblock-1] holds sorted order bhtab [ 0 .. 2+(nblock/32) ] destroyed */ #define SET_BH(zz) bhtab[(zz) >> 5] |= (1 << ((zz) & 31)) #define CLEAR_BH(zz) bhtab[(zz) >> 5] &= ~(1 << ((zz) & 31)) #define ISSET_BH(zz) (bhtab[(zz) >> 5] & (1 << ((zz) & 31))) #define WORD_BH(zz) bhtab[(zz) >> 5] #define UNALIGNED_BH(zz) ((zz) & 0x01f) static void fallbackSort ( UInt32* fmap, UInt32* eclass, UInt32* bhtab, Int32 nblock, Int32 verb ) { Int32 ftab[257]; Int32 ftabCopy[256]; Int32 H, i, j, k, l, r, cc, cc1; Int32 nNotDone; Int32 nBhtab; UChar* eclass8 = (UChar*)eclass; /*-- Initial 1-char radix sort to generate initial fmap and initial BH bits. --*/ if (verb >= 4) VPrintf0 ( " bucket sorting ...\n" ); for (i = 0; i < 257; i++) ftab[i] = 0; for (i = 0; i < nblock; i++) ftab[eclass8[i]]++; for (i = 0; i < 256; i++) ftabCopy[i] = ftab[i]; for (i = 1; i < 257; i++) ftab[i] += ftab[i-1]; for (i = 0; i < nblock; i++) { j = eclass8[i]; k = ftab[j] - 1; ftab[j] = k; fmap[k] = i; } nBhtab = 2 + (nblock / 32); for (i = 0; i < nBhtab; i++) bhtab[i] = 0; for (i = 0; i < 256; i++) SET_BH(ftab[i]); /*-- Inductively refine the buckets. Kind-of an "exponential radix sort" (!), inspired by the Manber-Myers suffix array construction algorithm. --*/ /*-- set sentinel bits for block-end detection --*/ for (i = 0; i < 32; i++) { SET_BH(nblock + 2*i); CLEAR_BH(nblock + 2*i + 1); } /*-- the log(N) loop --*/ H = 1; while (1) { if (verb >= 4) VPrintf1 ( " depth %6d has ", H ); j = 0; for (i = 0; i < nblock; i++) { if (ISSET_BH(i)) j = i; k = fmap[i] - H; if (k < 0) k += nblock; eclass[k] = j; } nNotDone = 0; r = -1; while (1) { /*-- find the next non-singleton bucket --*/ k = r + 1; while (ISSET_BH(k) && UNALIGNED_BH(k)) k++; if (ISSET_BH(k)) { while (WORD_BH(k) == 0xffffffff) k += 32; while (ISSET_BH(k)) k++; } l = k - 1; if (l >= nblock) break; while (!ISSET_BH(k) && UNALIGNED_BH(k)) k++; if (!ISSET_BH(k)) { while (WORD_BH(k) == 0x00000000) k += 32; while (!ISSET_BH(k)) k++; } r = k - 1; if (r >= nblock) break; /*-- now [l, r] bracket current bucket --*/ if (r > l) { nNotDone += (r - l + 1); fallbackQSort3 ( fmap, eclass, l, r ); /*-- scan bucket and generate header bits-- */ cc = -1; for (i = l; i <= r; i++) { cc1 = eclass[fmap[i]]; if (cc != cc1) { SET_BH(i); cc = cc1; }; } } } if (verb >= 4) VPrintf1 ( "%6d unresolved strings\n", nNotDone ); H *= 2; if (H > nblock || nNotDone == 0) break; } /*-- Reconstruct the original block in eclass8 [0 .. nblock-1], since the previous phase destroyed it. --*/ if (verb >= 4) VPrintf0 ( " reconstructing block ...\n" ); j = 0; for (i = 0; i < nblock; i++) { while (ftabCopy[j] == 0) j++; ftabCopy[j]--; eclass8[fmap[i]] = (UChar)j; } AssertH ( j < 256, 1005 ); } #undef SET_BH #undef CLEAR_BH #undef ISSET_BH #undef WORD_BH #undef UNALIGNED_BH /*---------------------------------------------*/ /*--- The main, O(N^2 log(N)) sorting ---*/ /*--- algorithm. Faster for "normal" ---*/ /*--- non-repetitive blocks. ---*/ /*---------------------------------------------*/ /*---------------------------------------------*/ static __inline__ Bool mainGtU ( UInt32 i1, UInt32 i2, UChar* block, UInt16* quadrant, UInt32 nblock, Int32* budget ) { Int32 k; UChar c1, c2; UInt16 s1, s2; AssertD ( i1 != i2, "mainGtU" ); /* 1 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 2 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 3 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 4 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 5 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 6 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 7 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 8 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 9 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 10 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 11 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 12 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; k = nblock + 8; do { /* 1 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; /* 2 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; /* 3 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; /* 4 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; /* 5 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; /* 6 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; /* 7 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; /* 8 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; if (i1 >= nblock) i1 -= nblock; if (i2 >= nblock) i2 -= nblock; k -= 8; (*budget)--; } while (k >= 0); return False; } /*---------------------------------------------*/ /*-- Knuth's increments seem to work better than Incerpi-Sedgewick here. Possibly because the number of elems to sort is usually small, typically <= 20. --*/ static Int32 incs[14] = { 1, 4, 13, 40, 121, 364, 1093, 3280, 9841, 29524, 88573, 265720, 797161, 2391484 }; static void mainSimpleSort ( UInt32* ptr, UChar* block, UInt16* quadrant, Int32 nblock, Int32 lo, Int32 hi, Int32 d, Int32* budget ) { Int32 i, j, h, bigN, hp; UInt32 v; bigN = hi - lo + 1; if (bigN < 2) return; hp = 0; while (incs[hp] < bigN) hp++; hp--; for (; hp >= 0; hp--) { h = incs[hp]; i = lo + h; while (True) { /*-- copy 1 --*/ if (i > hi) break; v = ptr[i]; j = i; while ( mainGtU ( ptr[j-h]+d, v+d, block, quadrant, nblock, budget ) ) { ptr[j] = ptr[j-h]; j = j - h; if (j <= (lo + h - 1)) break; } ptr[j] = v; i++; /*-- copy 2 --*/ if (i > hi) break; v = ptr[i]; j = i; while ( mainGtU ( ptr[j-h]+d, v+d, block, quadrant, nblock, budget ) ) { ptr[j] = ptr[j-h]; j = j - h; if (j <= (lo + h - 1)) break; } ptr[j] = v; i++; /*-- copy 3 --*/ if (i > hi) break; v = ptr[i]; j = i; while ( mainGtU ( ptr[j-h]+d, v+d, block, quadrant, nblock, budget ) ) { ptr[j] = ptr[j-h]; j = j - h; if (j <= (lo + h - 1)) break; } ptr[j] = v; i++; if (*budget < 0) return; } } } /*---------------------------------------------*/ /*-- The following is an implementation of an elegant 3-way quicksort for strings, described in a paper "Fast Algorithms for Sorting and Searching Strings", by Robert Sedgewick and Jon L. Bentley. --*/ #define mswap(zz1, zz2) \ { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; } #define mvswap(zzp1, zzp2, zzn) \ { \ Int32 yyp1 = (zzp1); \ Int32 yyp2 = (zzp2); \ Int32 yyn = (zzn); \ while (yyn > 0) { \ mswap(ptr[yyp1], ptr[yyp2]); \ yyp1++; yyp2++; yyn--; \ } \ } static __inline__ UChar mmed3 ( UChar a, UChar b, UChar c ) { UChar t; if (a > b) { t = a; a = b; b = t; }; if (b > c) { b = c; if (a > b) b = a; } return b; } #define mmin(a,b) ((a) < (b)) ? (a) : (b) #define mpush(lz,hz,dz) { stackLo[sp] = lz; \ stackHi[sp] = hz; \ stackD [sp] = dz; \ sp++; } #define mpop(lz,hz,dz) { sp--; \ lz = stackLo[sp]; \ hz = stackHi[sp]; \ dz = stackD [sp]; } #define mnextsize(az) (nextHi[az]-nextLo[az]) #define mnextswap(az,bz) \ { Int32 tz; \ tz = nextLo[az]; nextLo[az] = nextLo[bz]; nextLo[bz] = tz; \ tz = nextHi[az]; nextHi[az] = nextHi[bz]; nextHi[bz] = tz; \ tz = nextD [az]; nextD [az] = nextD [bz]; nextD [bz] = tz; } #define MAIN_QSORT_SMALL_THRESH 20 #define MAIN_QSORT_DEPTH_THRESH (BZ_N_RADIX + BZ_N_QSORT) #define MAIN_QSORT_STACK_SIZE 100 static void mainQSort3 ( UInt32* ptr, UChar* block, UInt16* quadrant, Int32 nblock, Int32 loSt, Int32 hiSt, Int32 dSt, Int32* budget ) { Int32 unLo, unHi, ltLo, gtHi, n, m, med; Int32 sp, lo, hi, d; Int32 stackLo[MAIN_QSORT_STACK_SIZE]; Int32 stackHi[MAIN_QSORT_STACK_SIZE]; Int32 stackD [MAIN_QSORT_STACK_SIZE]; Int32 nextLo[3]; Int32 nextHi[3]; Int32 nextD [3]; sp = 0; mpush ( loSt, hiSt, dSt ); while (sp > 0) { AssertH ( sp < MAIN_QSORT_STACK_SIZE - 2, 1001 ); mpop ( lo, hi, d ); if (hi - lo < MAIN_QSORT_SMALL_THRESH || d > MAIN_QSORT_DEPTH_THRESH) { mainSimpleSort ( ptr, block, quadrant, nblock, lo, hi, d, budget ); if (*budget < 0) return; continue; } med = (Int32) mmed3 ( block[ptr[ lo ]+d], block[ptr[ hi ]+d], block[ptr[ (lo+hi)>>1 ]+d] ); unLo = ltLo = lo; unHi = gtHi = hi; while (True) { while (True) { if (unLo > unHi) break; n = ((Int32)block[ptr[unLo]+d]) - med; if (n == 0) { mswap(ptr[unLo], ptr[ltLo]); ltLo++; unLo++; continue; }; if (n > 0) break; unLo++; } while (True) { if (unLo > unHi) break; n = ((Int32)block[ptr[unHi]+d]) - med; if (n == 0) { mswap(ptr[unHi], ptr[gtHi]); gtHi--; unHi--; continue; }; if (n < 0) break; unHi--; } if (unLo > unHi) break; mswap(ptr[unLo], ptr[unHi]); unLo++; unHi--; } AssertD ( unHi == unLo-1, "mainQSort3(2)" ); if (gtHi < ltLo) { mpush(lo, hi, d+1 ); continue; } n = mmin(ltLo-lo, unLo-ltLo); mvswap(lo, unLo-n, n); m = mmin(hi-gtHi, gtHi-unHi); mvswap(unLo, hi-m+1, m); n = lo + unLo - ltLo - 1; m = hi - (gtHi - unHi) + 1; nextLo[0] = lo; nextHi[0] = n; nextD[0] = d; nextLo[1] = m; nextHi[1] = hi; nextD[1] = d; nextLo[2] = n+1; nextHi[2] = m-1; nextD[2] = d+1; if (mnextsize(0) < mnextsize(1)) mnextswap(0,1); if (mnextsize(1) < mnextsize(2)) mnextswap(1,2); if (mnextsize(0) < mnextsize(1)) mnextswap(0,1); AssertD (mnextsize(0) >= mnextsize(1), "mainQSort3(8)" ); AssertD (mnextsize(1) >= mnextsize(2), "mainQSort3(9)" ); mpush (nextLo[0], nextHi[0], nextD[0]); mpush (nextLo[1], nextHi[1], nextD[1]); mpush (nextLo[2], nextHi[2], nextD[2]); } } #undef mswap #undef mvswap #undef mpush #undef mpop #undef mmin #undef mnextsize #undef mnextswap #undef MAIN_QSORT_SMALL_THRESH #undef MAIN_QSORT_DEPTH_THRESH #undef MAIN_QSORT_STACK_SIZE /*---------------------------------------------*/ /* Pre: nblock > N_OVERSHOOT block32 exists for [0 .. nblock-1 +N_OVERSHOOT] ((UChar*)block32) [0 .. nblock-1] holds block ptr exists for [0 .. nblock-1] Post: ((UChar*)block32) [0 .. nblock-1] holds block All other areas of block32 destroyed ftab [0 .. 65536 ] destroyed ptr [0 .. nblock-1] holds sorted order if (*budget < 0), sorting was abandoned */ #define BIGFREQ(b) (ftab[((b)+1) << 8] - ftab[(b) << 8]) #define SETMASK (1 << 21) #define CLEARMASK (~(SETMASK)) static void mainSort ( UInt32* ptr, UChar* block, UInt16* quadrant, UInt32* ftab, Int32 nblock, Int32 verb, Int32* budget ) { Int32 i, j, k, ss, sb; Int32 runningOrder[256]; Bool bigDone[256]; Int32 copyStart[256]; Int32 copyEnd [256]; UChar c1; Int32 numQSorted; UInt16 s; if (verb >= 4) VPrintf0 ( " main sort initialise ...\n" ); /*-- set up the 2-byte frequency table --*/ for (i = 65536; i >= 0; i--) ftab[i] = 0; j = block[0] << 8; i = nblock-1; for (; i >= 3; i -= 4) { quadrant[i] = 0; j = (j >> 8) | ( ((UInt16)block[i]) << 8); ftab[j]++; quadrant[i-1] = 0; j = (j >> 8) | ( ((UInt16)block[i-1]) << 8); ftab[j]++; quadrant[i-2] = 0; j = (j >> 8) | ( ((UInt16)block[i-2]) << 8); ftab[j]++; quadrant[i-3] = 0; j = (j >> 8) | ( ((UInt16)block[i-3]) << 8); ftab[j]++; } for (; i >= 0; i--) { quadrant[i] = 0; j = (j >> 8) | ( ((UInt16)block[i]) << 8); ftab[j]++; } /*-- (emphasises close relationship of block & quadrant) --*/ for (i = 0; i < BZ_N_OVERSHOOT; i++) { block [nblock+i] = block[i]; quadrant[nblock+i] = 0; } if (verb >= 4) VPrintf0 ( " bucket sorting ...\n" ); /*-- Complete the initial radix sort --*/ for (i = 1; i <= 65536; i++) ftab[i] += ftab[i-1]; s = block[0] << 8; i = nblock-1; for (; i >= 3; i -= 4) { s = (s >> 8) | (block[i] << 8); j = ftab[s] -1; ftab[s] = j; ptr[j] = i; s = (s >> 8) | (block[i-1] << 8); j = ftab[s] -1; ftab[s] = j; ptr[j] = i-1; s = (s >> 8) | (block[i-2] << 8); j = ftab[s] -1; ftab[s] = j; ptr[j] = i-2; s = (s >> 8) | (block[i-3] << 8); j = ftab[s] -1; ftab[s] = j; ptr[j] = i-3; } for (; i >= 0; i--) { s = (s >> 8) | (block[i] << 8); j = ftab[s] -1; ftab[s] = j; ptr[j] = i; } /*-- Now ftab contains the first loc of every small bucket. Calculate the running order, from smallest to largest big bucket. --*/ for (i = 0; i <= 255; i++) { bigDone [i] = False; runningOrder[i] = i; } { Int32 vv; Int32 h = 1; do h = 3 * h + 1; while (h <= 256); do { h = h / 3; for (i = h; i <= 255; i++) { vv = runningOrder[i]; j = i; while ( BIGFREQ(runningOrder[j-h]) > BIGFREQ(vv) ) { runningOrder[j] = runningOrder[j-h]; j = j - h; if (j <= (h - 1)) goto zero; } zero: runningOrder[j] = vv; } } while (h != 1); } /*-- The main sorting loop. --*/ numQSorted = 0; for (i = 0; i <= 255; i++) { /*-- Process big buckets, starting with the least full. Basically this is a 3-step process in which we call mainQSort3 to sort the small buckets [ss, j], but also make a big effort to avoid the calls if we can. --*/ ss = runningOrder[i]; /*-- Step 1: Complete the big bucket [ss] by quicksorting any unsorted small buckets [ss, j], for j != ss. Hopefully previous pointer-scanning phases have already completed many of the small buckets [ss, j], so we don't have to sort them at all. --*/ for (j = 0; j <= 255; j++) { if (j != ss) { sb = (ss << 8) + j; if ( ! (ftab[sb] & SETMASK) ) { Int32 lo = ftab[sb] & CLEARMASK; Int32 hi = (ftab[sb+1] & CLEARMASK) - 1; if (hi > lo) { if (verb >= 4) VPrintf4 ( " qsort [0x%x, 0x%x] " "done %d this %d\n", ss, j, numQSorted, hi - lo + 1 ); mainQSort3 ( ptr, block, quadrant, nblock, lo, hi, BZ_N_RADIX, budget ); numQSorted += (hi - lo + 1); if (*budget < 0) return; } } ftab[sb] |= SETMASK; } } AssertH ( !bigDone[ss], 1006 ); /*-- Step 2: Now scan this big bucket [ss] so as to synthesise the sorted order for small buckets [t, ss] for all t, including, magically, the bucket [ss,ss] too. This will avoid doing Real Work in subsequent Step 1's. --*/ { for (j = 0; j <= 255; j++) { copyStart[j] = ftab[(j << 8) + ss] & CLEARMASK; copyEnd [j] = (ftab[(j << 8) + ss + 1] & CLEARMASK) - 1; } for (j = ftab[ss << 8] & CLEARMASK; j < copyStart[ss]; j++) { k = ptr[j]-1; if (k < 0) k += nblock; c1 = block[k]; if (!bigDone[c1]) ptr[ copyStart[c1]++ ] = k; } for (j = (ftab[(ss+1) << 8] & CLEARMASK) - 1; j > copyEnd[ss]; j--) { k = ptr[j]-1; if (k < 0) k += nblock; c1 = block[k]; if (!bigDone[c1]) ptr[ copyEnd[c1]-- ] = k; } } AssertH ( (copyStart[ss]-1 == copyEnd[ss]) || /* Extremely rare case missing in bzip2-1.0.0 and 1.0.1. Necessity for this case is demonstrated by compressing a sequence of approximately 48.5 million of character 251; 1.0.0/1.0.1 will then die here. */ (copyStart[ss] == 0 && copyEnd[ss] == nblock-1), 1007 ) for (j = 0; j <= 255; j++) ftab[(j << 8) + ss] |= SETMASK; /*-- Step 3: The [ss] big bucket is now done. Record this fact, and update the quadrant descriptors. Remember to update quadrants in the overshoot area too, if necessary. The "if (i < 255)" test merely skips this updating for the last bucket processed, since updating for the last bucket is pointless. The quadrant array provides a way to incrementally cache sort orderings, as they appear, so as to make subsequent comparisons in fullGtU() complete faster. For repetitive blocks this makes a big difference (but not big enough to be able to avoid the fallback sorting mechanism, exponential radix sort). The precise meaning is: at all times: for 0 <= i < nblock and 0 <= j <= nblock if block[i] != block[j], then the relative values of quadrant[i] and quadrant[j] are meaningless. else { if quadrant[i] < quadrant[j] then the string starting at i lexicographically precedes the string starting at j else if quadrant[i] > quadrant[j] then the string starting at j lexicographically precedes the string starting at i else the relative ordering of the strings starting at i and j has not yet been determined. } --*/ bigDone[ss] = True; if (i < 255) { Int32 bbStart = ftab[ss << 8] & CLEARMASK; Int32 bbSize = (ftab[(ss+1) << 8] & CLEARMASK) - bbStart; Int32 shifts = 0; while ((bbSize >> shifts) > 65534) shifts++; for (j = bbSize-1; j >= 0; j--) { Int32 a2update = ptr[bbStart + j]; UInt16 qVal = (UInt16)(j >> shifts); quadrant[a2update] = qVal; if (a2update < BZ_N_OVERSHOOT) quadrant[a2update + nblock] = qVal; } AssertH ( ((bbSize-1) >> shifts) <= 65535, 1002 ); } } if (verb >= 4) VPrintf3 ( " %d pointers, %d sorted, %d scanned\n", nblock, numQSorted, nblock - numQSorted ); } #undef BIGFREQ #undef SETMASK #undef CLEARMASK /*---------------------------------------------*/ /* Pre: nblock > 0 arr2 exists for [0 .. nblock-1 +N_OVERSHOOT] ((UChar*)arr2) [0 .. nblock-1] holds block arr1 exists for [0 .. nblock-1] Post: ((UChar*)arr2) [0 .. nblock-1] holds block All other areas of block destroyed ftab [ 0 .. 65536 ] destroyed arr1 [0 .. nblock-1] holds sorted order */ void BZ2_blockSort ( EState* s ) { UInt32* ptr = s->ptr; UChar* block = s->block; UInt32* ftab = s->ftab; Int32 nblock = s->nblock; Int32 verb = s->verbosity; Int32 wfact = s->workFactor; UInt16* quadrant; Int32 budget; Int32 budgetInit; Int32 i; if (nblock < 10000) { fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb ); } else { /* Calculate the location for quadrant, remembering to get the alignment right. Assumes that &(block[0]) is at least 2-byte aligned -- this should be ok since block is really the first section of arr2. */ i = nblock+BZ_N_OVERSHOOT; if (i & 1) i++; quadrant = (UInt16*)(&(block[i])); /* (wfact-1) / 3 puts the default-factor-30 transition point at very roughly the same place as with v0.1 and v0.9.0. Not that it particularly matters any more, since the resulting compressed stream is now the same regardless of whether or not we use the main sort or fallback sort. */ if (wfact < 1 ) wfact = 1; if (wfact > 100) wfact = 100; budgetInit = nblock * ((wfact-1) / 3); budget = budgetInit; mainSort ( ptr, block, quadrant, ftab, nblock, verb, &budget ); if (verb >= 3) VPrintf3 ( " %d work, %d block, ratio %5.2f\n", budgetInit - budget, nblock, (float)(budgetInit - budget) / (float)(nblock==0 ? 1 : nblock) ); if (budget < 0) { if (verb >= 2) VPrintf0 ( " too repetitive; using fallback" " sorting algorithm\n" ); fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb ); } } s->origPtr = -1; for (i = 0; i < s->nblock; i++) if (ptr[i] == 0) { s->origPtr = i; break; }; AssertH( s->origPtr != -1, 1003 ); } /*-------------------------------------------------------------*/ /*--- end blocksort.c ---*/ /*-------------------------------------------------------------*/ gtkwave-3.3.86/src/libbz2/bzlib.c0000664000175000017500000013165313166335473016036 0ustar bybellbybell /*-------------------------------------------------------------*/ /*--- Library top-level functions. ---*/ /*--- bzlib.c ---*/ /*-------------------------------------------------------------*/ /* ------------------------------------------------------------------ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. bzip2/libbzip2 version 1.0.6 of 6 September 2010 Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. This program is released under the terms of the license contained in the file LICENSE. ------------------------------------------------------------------ */ /* CHANGES 0.9.0 -- original version. 0.9.0a/b -- no changes in this file. 0.9.0c -- made zero-length BZ_FLUSH work correctly in bzCompress(). fixed bzWrite/bzRead to ignore zero-length requests. fixed bzread to correctly handle read requests after EOF. wrong parameter order in call to bzDecompressInit in bzBuffToBuffDecompress. Fixed. */ #include "bzlib_private.h" /*---------------------------------------------------*/ /*--- Compression stuff ---*/ /*---------------------------------------------------*/ /*---------------------------------------------------*/ #ifndef BZ_NO_STDIO void BZ2_bz__AssertH__fail ( int errcode ) { fprintf(stderr, "\n\nbzip2/libbzip2: internal error number %d.\n" "This is a bug in bzip2/libbzip2, %s.\n" "Please report it to me at: jseward@bzip.org. If this happened\n" "when you were using some program which uses libbzip2 as a\n" "component, you should also report this bug to the author(s)\n" "of that program. Please make an effort to report this bug;\n" "timely and accurate bug reports eventually lead to higher\n" "quality software. Thanks. Julian Seward, 10 December 2007.\n\n", errcode, BZ2_bzlibVersion() ); if (errcode == 1007) { fprintf(stderr, "\n*** A special note about internal error number 1007 ***\n" "\n" "Experience suggests that a common cause of i.e. 1007\n" "is unreliable memory or other hardware. The 1007 assertion\n" "just happens to cross-check the results of huge numbers of\n" "memory reads/writes, and so acts (unintendedly) as a stress\n" "test of your memory system.\n" "\n" "I suggest the following: try compressing the file again,\n" "possibly monitoring progress in detail with the -vv flag.\n" "\n" "* If the error cannot be reproduced, and/or happens at different\n" " points in compression, you may have a flaky memory system.\n" " Try a memory-test program. I have used Memtest86\n" " (www.memtest86.com). At the time of writing it is free (GPLd).\n" " Memtest86 tests memory much more thorougly than your BIOSs\n" " power-on test, and may find failures that the BIOS doesn't.\n" "\n" "* If the error can be repeatably reproduced, this is a bug in\n" " bzip2, and I would very much like to hear about it. Please\n" " let me know, and, ideally, save a copy of the file causing the\n" " problem -- without which I will be unable to investigate it.\n" "\n" ); } exit(3); } #endif /*---------------------------------------------------*/ static int bz_config_ok ( void ) { if (sizeof(int) != 4) return 0; if (sizeof(short) != 2) return 0; if (sizeof(char) != 1) return 0; return 1; } /*---------------------------------------------------*/ static void* default_bzalloc ( void* opaque, Int32 items, Int32 size ) { void* v = malloc ( items * size ); return v; } static void default_bzfree ( void* opaque, void* addr ) { if (addr != NULL) free ( addr ); } /*---------------------------------------------------*/ static void prepare_new_block ( EState* s ) { Int32 i; s->nblock = 0; s->numZ = 0; s->state_out_pos = 0; BZ_INITIALISE_CRC ( s->blockCRC ); for (i = 0; i < 256; i++) s->inUse[i] = False; s->blockNo++; } /*---------------------------------------------------*/ static void init_RL ( EState* s ) { s->state_in_ch = 256; s->state_in_len = 0; } static Bool isempty_RL ( EState* s ) { if (s->state_in_ch < 256 && s->state_in_len > 0) return False; else return True; } /*---------------------------------------------------*/ int BZ_API(BZ2_bzCompressInit) ( bz_stream* strm, int blockSize100k, int verbosity, int workFactor ) { Int32 n; EState* s; if (!bz_config_ok()) return BZ_CONFIG_ERROR; if (strm == NULL || blockSize100k < 1 || blockSize100k > 9 || workFactor < 0 || workFactor > 250) return BZ_PARAM_ERROR; if (workFactor == 0) workFactor = 30; if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc; if (strm->bzfree == NULL) strm->bzfree = default_bzfree; s = BZALLOC( sizeof(EState) ); if (s == NULL) return BZ_MEM_ERROR; s->strm = strm; s->arr1 = NULL; s->arr2 = NULL; s->ftab = NULL; n = 100000 * blockSize100k; s->arr1 = BZALLOC( n * sizeof(UInt32) ); s->arr2 = BZALLOC( (n+BZ_N_OVERSHOOT) * sizeof(UInt32) ); s->ftab = BZALLOC( 65537 * sizeof(UInt32) ); if (s->arr1 == NULL || s->arr2 == NULL || s->ftab == NULL) { if (s->arr1 != NULL) BZFREE(s->arr1); if (s->arr2 != NULL) BZFREE(s->arr2); if (s->ftab != NULL) BZFREE(s->ftab); if (s != NULL) BZFREE(s); return BZ_MEM_ERROR; } s->blockNo = 0; s->state = BZ_S_INPUT; s->mode = BZ_M_RUNNING; s->combinedCRC = 0; s->blockSize100k = blockSize100k; s->nblockMAX = 100000 * blockSize100k - 19; s->verbosity = verbosity; s->workFactor = workFactor; s->block = (UChar*)s->arr2; s->mtfv = (UInt16*)s->arr1; s->zbits = NULL; s->ptr = (UInt32*)s->arr1; strm->state = s; strm->total_in_lo32 = 0; strm->total_in_hi32 = 0; strm->total_out_lo32 = 0; strm->total_out_hi32 = 0; init_RL ( s ); prepare_new_block ( s ); return BZ_OK; } /*---------------------------------------------------*/ static void add_pair_to_block ( EState* s ) { Int32 i; UChar ch = (UChar)(s->state_in_ch); for (i = 0; i < s->state_in_len; i++) { BZ_UPDATE_CRC( s->blockCRC, ch ); } s->inUse[s->state_in_ch] = True; switch (s->state_in_len) { case 1: s->block[s->nblock] = (UChar)ch; s->nblock++; break; case 2: s->block[s->nblock] = (UChar)ch; s->nblock++; s->block[s->nblock] = (UChar)ch; s->nblock++; break; case 3: s->block[s->nblock] = (UChar)ch; s->nblock++; s->block[s->nblock] = (UChar)ch; s->nblock++; s->block[s->nblock] = (UChar)ch; s->nblock++; break; default: s->inUse[s->state_in_len-4] = True; s->block[s->nblock] = (UChar)ch; s->nblock++; s->block[s->nblock] = (UChar)ch; s->nblock++; s->block[s->nblock] = (UChar)ch; s->nblock++; s->block[s->nblock] = (UChar)ch; s->nblock++; s->block[s->nblock] = ((UChar)(s->state_in_len-4)); s->nblock++; break; } } /*---------------------------------------------------*/ static void flush_RL ( EState* s ) { if (s->state_in_ch < 256) add_pair_to_block ( s ); init_RL ( s ); } /*---------------------------------------------------*/ #define ADD_CHAR_TO_BLOCK(zs,zchh0) \ { \ UInt32 zchh = (UInt32)(zchh0); \ /*-- fast track the common case --*/ \ if (zchh != zs->state_in_ch && \ zs->state_in_len == 1) { \ UChar ch = (UChar)(zs->state_in_ch); \ BZ_UPDATE_CRC( zs->blockCRC, ch ); \ zs->inUse[zs->state_in_ch] = True; \ zs->block[zs->nblock] = (UChar)ch; \ zs->nblock++; \ zs->state_in_ch = zchh; \ } \ else \ /*-- general, uncommon cases --*/ \ if (zchh != zs->state_in_ch || \ zs->state_in_len == 255) { \ if (zs->state_in_ch < 256) \ add_pair_to_block ( zs ); \ zs->state_in_ch = zchh; \ zs->state_in_len = 1; \ } else { \ zs->state_in_len++; \ } \ } /*---------------------------------------------------*/ static Bool copy_input_until_stop ( EState* s ) { Bool progress_in = False; if (s->mode == BZ_M_RUNNING) { /*-- fast track the common case --*/ while (True) { /*-- block full? --*/ if (s->nblock >= s->nblockMAX) break; /*-- no input? --*/ if (s->strm->avail_in == 0) break; progress_in = True; ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; } } else { /*-- general, uncommon case --*/ while (True) { /*-- block full? --*/ if (s->nblock >= s->nblockMAX) break; /*-- no input? --*/ if (s->strm->avail_in == 0) break; /*-- flush/finish end? --*/ if (s->avail_in_expect == 0) break; progress_in = True; ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; s->avail_in_expect--; } } return progress_in; } /*---------------------------------------------------*/ static Bool copy_output_until_stop ( EState* s ) { Bool progress_out = False; while (True) { /*-- no output space? --*/ if (s->strm->avail_out == 0) break; /*-- block done? --*/ if (s->state_out_pos >= s->numZ) break; progress_out = True; *(s->strm->next_out) = s->zbits[s->state_out_pos]; s->state_out_pos++; s->strm->avail_out--; s->strm->next_out++; s->strm->total_out_lo32++; if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; } return progress_out; } /*---------------------------------------------------*/ static Bool handle_compress ( bz_stream* strm ) { Bool progress_in = False; Bool progress_out = False; EState* s = strm->state; while (True) { if (s->state == BZ_S_OUTPUT) { progress_out |= copy_output_until_stop ( s ); if (s->state_out_pos < s->numZ) break; if (s->mode == BZ_M_FINISHING && s->avail_in_expect == 0 && isempty_RL(s)) break; prepare_new_block ( s ); s->state = BZ_S_INPUT; if (s->mode == BZ_M_FLUSHING && s->avail_in_expect == 0 && isempty_RL(s)) break; } if (s->state == BZ_S_INPUT) { progress_in |= copy_input_until_stop ( s ); if (s->mode != BZ_M_RUNNING && s->avail_in_expect == 0) { flush_RL ( s ); BZ2_compressBlock ( s, (Bool)(s->mode == BZ_M_FINISHING) ); s->state = BZ_S_OUTPUT; } else if (s->nblock >= s->nblockMAX) { BZ2_compressBlock ( s, False ); s->state = BZ_S_OUTPUT; } else if (s->strm->avail_in == 0) { break; } } } return progress_in || progress_out; } /*---------------------------------------------------*/ int BZ_API(BZ2_bzCompress) ( bz_stream *strm, int action ) { Bool progress; EState* s; if (strm == NULL) return BZ_PARAM_ERROR; s = strm->state; if (s == NULL) return BZ_PARAM_ERROR; if (s->strm != strm) return BZ_PARAM_ERROR; preswitch: switch (s->mode) { case BZ_M_IDLE: return BZ_SEQUENCE_ERROR; case BZ_M_RUNNING: if (action == BZ_RUN) { progress = handle_compress ( strm ); return progress ? BZ_RUN_OK : BZ_PARAM_ERROR; } else if (action == BZ_FLUSH) { s->avail_in_expect = strm->avail_in; s->mode = BZ_M_FLUSHING; goto preswitch; } else if (action == BZ_FINISH) { s->avail_in_expect = strm->avail_in; s->mode = BZ_M_FINISHING; goto preswitch; } else return BZ_PARAM_ERROR; case BZ_M_FLUSHING: if (action != BZ_FLUSH) return BZ_SEQUENCE_ERROR; if (s->avail_in_expect != s->strm->avail_in) return BZ_SEQUENCE_ERROR; progress = handle_compress ( strm ); if (s->avail_in_expect > 0 || !isempty_RL(s) || s->state_out_pos < s->numZ) return BZ_FLUSH_OK; s->mode = BZ_M_RUNNING; return BZ_RUN_OK; case BZ_M_FINISHING: if (action != BZ_FINISH) return BZ_SEQUENCE_ERROR; if (s->avail_in_expect != s->strm->avail_in) return BZ_SEQUENCE_ERROR; progress = handle_compress ( strm ); if (!progress) return BZ_SEQUENCE_ERROR; if (s->avail_in_expect > 0 || !isempty_RL(s) || s->state_out_pos < s->numZ) return BZ_FINISH_OK; s->mode = BZ_M_IDLE; return BZ_STREAM_END; } return BZ_OK; /*--not reached--*/ } /*---------------------------------------------------*/ int BZ_API(BZ2_bzCompressEnd) ( bz_stream *strm ) { EState* s; if (strm == NULL) return BZ_PARAM_ERROR; s = strm->state; if (s == NULL) return BZ_PARAM_ERROR; if (s->strm != strm) return BZ_PARAM_ERROR; if (s->arr1 != NULL) BZFREE(s->arr1); if (s->arr2 != NULL) BZFREE(s->arr2); if (s->ftab != NULL) BZFREE(s->ftab); BZFREE(strm->state); strm->state = NULL; return BZ_OK; } /*---------------------------------------------------*/ /*--- Decompression stuff ---*/ /*---------------------------------------------------*/ /*---------------------------------------------------*/ int BZ_API(BZ2_bzDecompressInit) ( bz_stream* strm, int verbosity, int small ) { DState* s; if (!bz_config_ok()) return BZ_CONFIG_ERROR; if (strm == NULL) return BZ_PARAM_ERROR; if (small != 0 && small != 1) return BZ_PARAM_ERROR; if (verbosity < 0 || verbosity > 4) return BZ_PARAM_ERROR; if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc; if (strm->bzfree == NULL) strm->bzfree = default_bzfree; s = BZALLOC( sizeof(DState) ); if (s == NULL) return BZ_MEM_ERROR; s->strm = strm; strm->state = s; s->state = BZ_X_MAGIC_1; s->bsLive = 0; s->bsBuff = 0; s->calculatedCombinedCRC = 0; strm->total_in_lo32 = 0; strm->total_in_hi32 = 0; strm->total_out_lo32 = 0; strm->total_out_hi32 = 0; s->smallDecompress = (Bool)small; s->ll4 = NULL; s->ll16 = NULL; s->tt = NULL; s->currBlockNo = 0; s->verbosity = verbosity; return BZ_OK; } /*---------------------------------------------------*/ /* Return True iff data corruption is discovered. Returns False if there is no problem. */ static Bool unRLE_obuf_to_output_FAST ( DState* s ) { UChar k1; if (s->blockRandomised) { while (True) { /* try to finish existing run */ while (True) { if (s->strm->avail_out == 0) return False; if (s->state_out_len == 0) break; *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); s->state_out_len--; s->strm->next_out++; s->strm->avail_out--; s->strm->total_out_lo32++; if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; } /* can a new run be started? */ if (s->nblock_used == s->save_nblock+1) return False; /* Only caused by corrupt data stream? */ if (s->nblock_used > s->save_nblock+1) return True; s->state_out_len = 1; s->state_out_ch = s->k0; BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; k1 ^= BZ_RAND_MASK; s->nblock_used++; if (s->nblock_used == s->save_nblock+1) continue; if (k1 != s->k0) { s->k0 = k1; continue; }; s->state_out_len = 2; BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; k1 ^= BZ_RAND_MASK; s->nblock_used++; if (s->nblock_used == s->save_nblock+1) continue; if (k1 != s->k0) { s->k0 = k1; continue; }; s->state_out_len = 3; BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; k1 ^= BZ_RAND_MASK; s->nblock_used++; if (s->nblock_used == s->save_nblock+1) continue; if (k1 != s->k0) { s->k0 = k1; continue; }; BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; k1 ^= BZ_RAND_MASK; s->nblock_used++; s->state_out_len = ((Int32)k1) + 4; BZ_GET_FAST(s->k0); BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; s->nblock_used++; } } else { /* restore */ UInt32 c_calculatedBlockCRC = s->calculatedBlockCRC; UChar c_state_out_ch = s->state_out_ch; Int32 c_state_out_len = s->state_out_len; Int32 c_nblock_used = s->nblock_used; Int32 c_k0 = s->k0; UInt32* c_tt = s->tt; UInt32 c_tPos = s->tPos; char* cs_next_out = s->strm->next_out; unsigned int cs_avail_out = s->strm->avail_out; Int32 ro_blockSize100k = s->blockSize100k; /* end restore */ UInt32 avail_out_INIT = cs_avail_out; Int32 s_save_nblockPP = s->save_nblock+1; unsigned int total_out_lo32_old; while (True) { /* try to finish existing run */ if (c_state_out_len > 0) { while (True) { if (cs_avail_out == 0) goto return_notr; if (c_state_out_len == 1) break; *( (UChar*)(cs_next_out) ) = c_state_out_ch; BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch ); c_state_out_len--; cs_next_out++; cs_avail_out--; } s_state_out_len_eq_one: { if (cs_avail_out == 0) { c_state_out_len = 1; goto return_notr; }; *( (UChar*)(cs_next_out) ) = c_state_out_ch; BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch ); cs_next_out++; cs_avail_out--; } } /* Only caused by corrupt data stream? */ if (c_nblock_used > s_save_nblockPP) return True; /* can a new run be started? */ if (c_nblock_used == s_save_nblockPP) { c_state_out_len = 0; goto return_notr; }; c_state_out_ch = c_k0; BZ_GET_FAST_C(k1); c_nblock_used++; if (k1 != c_k0) { c_k0 = k1; goto s_state_out_len_eq_one; }; if (c_nblock_used == s_save_nblockPP) goto s_state_out_len_eq_one; c_state_out_len = 2; BZ_GET_FAST_C(k1); c_nblock_used++; if (c_nblock_used == s_save_nblockPP) continue; if (k1 != c_k0) { c_k0 = k1; continue; }; c_state_out_len = 3; BZ_GET_FAST_C(k1); c_nblock_used++; if (c_nblock_used == s_save_nblockPP) continue; if (k1 != c_k0) { c_k0 = k1; continue; }; BZ_GET_FAST_C(k1); c_nblock_used++; c_state_out_len = ((Int32)k1) + 4; BZ_GET_FAST_C(c_k0); c_nblock_used++; } return_notr: total_out_lo32_old = s->strm->total_out_lo32; s->strm->total_out_lo32 += (avail_out_INIT - cs_avail_out); if (s->strm->total_out_lo32 < total_out_lo32_old) s->strm->total_out_hi32++; /* save */ s->calculatedBlockCRC = c_calculatedBlockCRC; s->state_out_ch = c_state_out_ch; s->state_out_len = c_state_out_len; s->nblock_used = c_nblock_used; s->k0 = c_k0; s->tt = c_tt; s->tPos = c_tPos; s->strm->next_out = cs_next_out; s->strm->avail_out = cs_avail_out; /* end save */ } return False; } /*---------------------------------------------------*/ __inline__ Int32 BZ2_indexIntoF ( Int32 indx, Int32 *cftab ) { Int32 nb, na, mid; nb = 0; na = 256; do { mid = (nb + na) >> 1; if (indx >= cftab[mid]) nb = mid; else na = mid; } while (na - nb != 1); return nb; } /*---------------------------------------------------*/ /* Return True iff data corruption is discovered. Returns False if there is no problem. */ static Bool unRLE_obuf_to_output_SMALL ( DState* s ) { UChar k1; if (s->blockRandomised) { while (True) { /* try to finish existing run */ while (True) { if (s->strm->avail_out == 0) return False; if (s->state_out_len == 0) break; *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); s->state_out_len--; s->strm->next_out++; s->strm->avail_out--; s->strm->total_out_lo32++; if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; } /* can a new run be started? */ if (s->nblock_used == s->save_nblock+1) return False; /* Only caused by corrupt data stream? */ if (s->nblock_used > s->save_nblock+1) return True; s->state_out_len = 1; s->state_out_ch = s->k0; BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; k1 ^= BZ_RAND_MASK; s->nblock_used++; if (s->nblock_used == s->save_nblock+1) continue; if (k1 != s->k0) { s->k0 = k1; continue; }; s->state_out_len = 2; BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; k1 ^= BZ_RAND_MASK; s->nblock_used++; if (s->nblock_used == s->save_nblock+1) continue; if (k1 != s->k0) { s->k0 = k1; continue; }; s->state_out_len = 3; BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; k1 ^= BZ_RAND_MASK; s->nblock_used++; if (s->nblock_used == s->save_nblock+1) continue; if (k1 != s->k0) { s->k0 = k1; continue; }; BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; k1 ^= BZ_RAND_MASK; s->nblock_used++; s->state_out_len = ((Int32)k1) + 4; BZ_GET_SMALL(s->k0); BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; s->nblock_used++; } } else { while (True) { /* try to finish existing run */ while (True) { if (s->strm->avail_out == 0) return False; if (s->state_out_len == 0) break; *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); s->state_out_len--; s->strm->next_out++; s->strm->avail_out--; s->strm->total_out_lo32++; if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; } /* can a new run be started? */ if (s->nblock_used == s->save_nblock+1) return False; /* Only caused by corrupt data stream? */ if (s->nblock_used > s->save_nblock+1) return True; s->state_out_len = 1; s->state_out_ch = s->k0; BZ_GET_SMALL(k1); s->nblock_used++; if (s->nblock_used == s->save_nblock+1) continue; if (k1 != s->k0) { s->k0 = k1; continue; }; s->state_out_len = 2; BZ_GET_SMALL(k1); s->nblock_used++; if (s->nblock_used == s->save_nblock+1) continue; if (k1 != s->k0) { s->k0 = k1; continue; }; s->state_out_len = 3; BZ_GET_SMALL(k1); s->nblock_used++; if (s->nblock_used == s->save_nblock+1) continue; if (k1 != s->k0) { s->k0 = k1; continue; }; BZ_GET_SMALL(k1); s->nblock_used++; s->state_out_len = ((Int32)k1) + 4; BZ_GET_SMALL(s->k0); s->nblock_used++; } } } /*---------------------------------------------------*/ int BZ_API(BZ2_bzDecompress) ( bz_stream *strm ) { Bool corrupt; DState* s; if (strm == NULL) return BZ_PARAM_ERROR; s = strm->state; if (s == NULL) return BZ_PARAM_ERROR; if (s->strm != strm) return BZ_PARAM_ERROR; while (True) { if (s->state == BZ_X_IDLE) return BZ_SEQUENCE_ERROR; if (s->state == BZ_X_OUTPUT) { if (s->smallDecompress) corrupt = unRLE_obuf_to_output_SMALL ( s ); else corrupt = unRLE_obuf_to_output_FAST ( s ); if (corrupt) return BZ_DATA_ERROR; if (s->nblock_used == s->save_nblock+1 && s->state_out_len == 0) { BZ_FINALISE_CRC ( s->calculatedBlockCRC ); if (s->verbosity >= 3) VPrintf2 ( " {0x%08x, 0x%08x}", s->storedBlockCRC, s->calculatedBlockCRC ); if (s->verbosity >= 2) VPrintf0 ( "]" ); if (s->calculatedBlockCRC != s->storedBlockCRC) return BZ_DATA_ERROR; s->calculatedCombinedCRC = (s->calculatedCombinedCRC << 1) | (s->calculatedCombinedCRC >> 31); s->calculatedCombinedCRC ^= s->calculatedBlockCRC; s->state = BZ_X_BLKHDR_1; } else { return BZ_OK; } } if (s->state >= BZ_X_MAGIC_1) { Int32 r = BZ2_decompress ( s ); if (r == BZ_STREAM_END) { if (s->verbosity >= 3) VPrintf2 ( "\n combined CRCs: stored = 0x%08x, computed = 0x%08x", s->storedCombinedCRC, s->calculatedCombinedCRC ); if (s->calculatedCombinedCRC != s->storedCombinedCRC) return BZ_DATA_ERROR; return r; } if (s->state != BZ_X_OUTPUT) return r; } } AssertH ( 0, 6001 ); return 0; /*NOTREACHED*/ } /*---------------------------------------------------*/ int BZ_API(BZ2_bzDecompressEnd) ( bz_stream *strm ) { DState* s; if (strm == NULL) return BZ_PARAM_ERROR; s = strm->state; if (s == NULL) return BZ_PARAM_ERROR; if (s->strm != strm) return BZ_PARAM_ERROR; if (s->tt != NULL) BZFREE(s->tt); if (s->ll16 != NULL) BZFREE(s->ll16); if (s->ll4 != NULL) BZFREE(s->ll4); BZFREE(strm->state); strm->state = NULL; return BZ_OK; } #ifndef BZ_NO_STDIO /*---------------------------------------------------*/ /*--- File I/O stuff ---*/ /*---------------------------------------------------*/ #define BZ_SETERR(eee) \ { \ if (bzerror != NULL) *bzerror = eee; \ if (bzf != NULL) bzf->lastErr = eee; \ } typedef struct { FILE* handle; Char buf[BZ_MAX_UNUSED]; Int32 bufN; Bool writing; bz_stream strm; Int32 lastErr; Bool initialisedOk; } bzFile; /*---------------------------------------------*/ static Bool myfeof ( FILE* f ) { Int32 c = fgetc ( f ); if (c == EOF) return True; ungetc ( c, f ); return False; } /*---------------------------------------------------*/ BZFILE* BZ_API(BZ2_bzWriteOpen) ( int* bzerror, FILE* f, int blockSize100k, int verbosity, int workFactor ) { Int32 ret; bzFile* bzf = NULL; BZ_SETERR(BZ_OK); if (f == NULL || (blockSize100k < 1 || blockSize100k > 9) || (workFactor < 0 || workFactor > 250) || (verbosity < 0 || verbosity > 4)) { BZ_SETERR(BZ_PARAM_ERROR); return NULL; }; if (ferror(f)) { BZ_SETERR(BZ_IO_ERROR); return NULL; }; bzf = malloc ( sizeof(bzFile) ); if (bzf == NULL) { BZ_SETERR(BZ_MEM_ERROR); return NULL; }; BZ_SETERR(BZ_OK); bzf->initialisedOk = False; bzf->bufN = 0; bzf->handle = f; bzf->writing = True; bzf->strm.bzalloc = NULL; bzf->strm.bzfree = NULL; bzf->strm.opaque = NULL; if (workFactor == 0) workFactor = 30; ret = BZ2_bzCompressInit ( &(bzf->strm), blockSize100k, verbosity, workFactor ); if (ret != BZ_OK) { BZ_SETERR(ret); free(bzf); return NULL; }; bzf->strm.avail_in = 0; bzf->initialisedOk = True; return bzf; } /*---------------------------------------------------*/ void BZ_API(BZ2_bzWrite) ( int* bzerror, BZFILE* b, void* buf, int len ) { Int32 n, n2, ret; bzFile* bzf = (bzFile*)b; BZ_SETERR(BZ_OK); if (bzf == NULL || buf == NULL || len < 0) { BZ_SETERR(BZ_PARAM_ERROR); return; }; if (!(bzf->writing)) { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; if (ferror(bzf->handle)) { BZ_SETERR(BZ_IO_ERROR); return; }; if (len == 0) { BZ_SETERR(BZ_OK); return; }; bzf->strm.avail_in = len; bzf->strm.next_in = buf; while (True) { bzf->strm.avail_out = BZ_MAX_UNUSED; bzf->strm.next_out = bzf->buf; ret = BZ2_bzCompress ( &(bzf->strm), BZ_RUN ); if (ret != BZ_RUN_OK) { BZ_SETERR(ret); return; }; if (bzf->strm.avail_out < BZ_MAX_UNUSED) { n = BZ_MAX_UNUSED - bzf->strm.avail_out; n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), n, bzf->handle ); if (n != n2 || ferror(bzf->handle)) { BZ_SETERR(BZ_IO_ERROR); return; }; } if (bzf->strm.avail_in == 0) { BZ_SETERR(BZ_OK); return; }; } } /*---------------------------------------------------*/ void BZ_API(BZ2_bzWriteClose) ( int* bzerror, BZFILE* b, int abandon, unsigned int* nbytes_in, unsigned int* nbytes_out ) { BZ2_bzWriteClose64 ( bzerror, b, abandon, nbytes_in, NULL, nbytes_out, NULL ); } void BZ_API(BZ2_bzWriteClose64) ( int* bzerror, BZFILE* b, int abandon, unsigned int* nbytes_in_lo32, unsigned int* nbytes_in_hi32, unsigned int* nbytes_out_lo32, unsigned int* nbytes_out_hi32 ) { Int32 n, n2, ret; bzFile* bzf = (bzFile*)b; if (bzf == NULL) { BZ_SETERR(BZ_OK); return; }; if (!(bzf->writing)) { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; if (ferror(bzf->handle)) { BZ_SETERR(BZ_IO_ERROR); return; }; if (nbytes_in_lo32 != NULL) *nbytes_in_lo32 = 0; if (nbytes_in_hi32 != NULL) *nbytes_in_hi32 = 0; if (nbytes_out_lo32 != NULL) *nbytes_out_lo32 = 0; if (nbytes_out_hi32 != NULL) *nbytes_out_hi32 = 0; if ((!abandon) && bzf->lastErr == BZ_OK) { while (True) { bzf->strm.avail_out = BZ_MAX_UNUSED; bzf->strm.next_out = bzf->buf; ret = BZ2_bzCompress ( &(bzf->strm), BZ_FINISH ); if (ret != BZ_FINISH_OK && ret != BZ_STREAM_END) { BZ_SETERR(ret); return; }; if (bzf->strm.avail_out < BZ_MAX_UNUSED) { n = BZ_MAX_UNUSED - bzf->strm.avail_out; n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), n, bzf->handle ); if (n != n2 || ferror(bzf->handle)) { BZ_SETERR(BZ_IO_ERROR); return; }; } if (ret == BZ_STREAM_END) break; } } if ( !abandon && !ferror ( bzf->handle ) ) { fflush ( bzf->handle ); if (ferror(bzf->handle)) { BZ_SETERR(BZ_IO_ERROR); return; }; } if (nbytes_in_lo32 != NULL) *nbytes_in_lo32 = bzf->strm.total_in_lo32; if (nbytes_in_hi32 != NULL) *nbytes_in_hi32 = bzf->strm.total_in_hi32; if (nbytes_out_lo32 != NULL) *nbytes_out_lo32 = bzf->strm.total_out_lo32; if (nbytes_out_hi32 != NULL) *nbytes_out_hi32 = bzf->strm.total_out_hi32; BZ_SETERR(BZ_OK); BZ2_bzCompressEnd ( &(bzf->strm) ); free ( bzf ); } /*---------------------------------------------------*/ BZFILE* BZ_API(BZ2_bzReadOpen) ( int* bzerror, FILE* f, int verbosity, int small, void* unused, int nUnused ) { bzFile* bzf = NULL; int ret; BZ_SETERR(BZ_OK); if (f == NULL || (small != 0 && small != 1) || (verbosity < 0 || verbosity > 4) || (unused == NULL && nUnused != 0) || (unused != NULL && (nUnused < 0 || nUnused > BZ_MAX_UNUSED))) { BZ_SETERR(BZ_PARAM_ERROR); return NULL; }; if (ferror(f)) { BZ_SETERR(BZ_IO_ERROR); return NULL; }; bzf = malloc ( sizeof(bzFile) ); if (bzf == NULL) { BZ_SETERR(BZ_MEM_ERROR); return NULL; }; BZ_SETERR(BZ_OK); bzf->initialisedOk = False; bzf->handle = f; bzf->bufN = 0; bzf->writing = False; bzf->strm.bzalloc = NULL; bzf->strm.bzfree = NULL; bzf->strm.opaque = NULL; while (nUnused > 0) { bzf->buf[bzf->bufN] = *((UChar*)(unused)); bzf->bufN++; unused = ((void*)( 1 + ((UChar*)(unused)) )); nUnused--; } ret = BZ2_bzDecompressInit ( &(bzf->strm), verbosity, small ); if (ret != BZ_OK) { BZ_SETERR(ret); free(bzf); return NULL; }; bzf->strm.avail_in = bzf->bufN; bzf->strm.next_in = bzf->buf; bzf->initialisedOk = True; return bzf; } /*---------------------------------------------------*/ void BZ_API(BZ2_bzReadClose) ( int *bzerror, BZFILE *b ) { bzFile* bzf = (bzFile*)b; BZ_SETERR(BZ_OK); if (bzf == NULL) { BZ_SETERR(BZ_OK); return; }; if (bzf->writing) { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; if (bzf->initialisedOk) (void)BZ2_bzDecompressEnd ( &(bzf->strm) ); free ( bzf ); } /*---------------------------------------------------*/ int BZ_API(BZ2_bzRead) ( int* bzerror, BZFILE* b, void* buf, int len ) { Int32 n, ret; bzFile* bzf = (bzFile*)b; BZ_SETERR(BZ_OK); if (bzf == NULL || buf == NULL || len < 0) { BZ_SETERR(BZ_PARAM_ERROR); return 0; }; if (bzf->writing) { BZ_SETERR(BZ_SEQUENCE_ERROR); return 0; }; if (len == 0) { BZ_SETERR(BZ_OK); return 0; }; bzf->strm.avail_out = len; bzf->strm.next_out = buf; while (True) { if (ferror(bzf->handle)) { BZ_SETERR(BZ_IO_ERROR); return 0; }; if (bzf->strm.avail_in == 0 && !myfeof(bzf->handle)) { n = fread ( bzf->buf, sizeof(UChar), BZ_MAX_UNUSED, bzf->handle ); if (ferror(bzf->handle)) { BZ_SETERR(BZ_IO_ERROR); return 0; }; bzf->bufN = n; bzf->strm.avail_in = bzf->bufN; bzf->strm.next_in = bzf->buf; } ret = BZ2_bzDecompress ( &(bzf->strm) ); if (ret != BZ_OK && ret != BZ_STREAM_END) { BZ_SETERR(ret); return 0; }; if (ret == BZ_OK && myfeof(bzf->handle) && bzf->strm.avail_in == 0 && bzf->strm.avail_out > 0) { BZ_SETERR(BZ_UNEXPECTED_EOF); return 0; }; if (ret == BZ_STREAM_END) { BZ_SETERR(BZ_STREAM_END); return len - bzf->strm.avail_out; }; if (bzf->strm.avail_out == 0) { BZ_SETERR(BZ_OK); return len; }; } return 0; /*not reached*/ } /*---------------------------------------------------*/ void BZ_API(BZ2_bzReadGetUnused) ( int* bzerror, BZFILE* b, void** unused, int* nUnused ) { bzFile* bzf = (bzFile*)b; if (bzf == NULL) { BZ_SETERR(BZ_PARAM_ERROR); return; }; if (bzf->lastErr != BZ_STREAM_END) { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; if (unused == NULL || nUnused == NULL) { BZ_SETERR(BZ_PARAM_ERROR); return; }; BZ_SETERR(BZ_OK); *nUnused = bzf->strm.avail_in; *unused = bzf->strm.next_in; } #endif /*---------------------------------------------------*/ /*--- Misc convenience stuff ---*/ /*---------------------------------------------------*/ /*---------------------------------------------------*/ int BZ_API(BZ2_bzBuffToBuffCompress) ( char* dest, unsigned int* destLen, char* source, unsigned int sourceLen, int blockSize100k, int verbosity, int workFactor ) { bz_stream strm; int ret; if (dest == NULL || destLen == NULL || source == NULL || blockSize100k < 1 || blockSize100k > 9 || verbosity < 0 || verbosity > 4 || workFactor < 0 || workFactor > 250) return BZ_PARAM_ERROR; if (workFactor == 0) workFactor = 30; strm.bzalloc = NULL; strm.bzfree = NULL; strm.opaque = NULL; ret = BZ2_bzCompressInit ( &strm, blockSize100k, verbosity, workFactor ); if (ret != BZ_OK) return ret; strm.next_in = source; strm.next_out = dest; strm.avail_in = sourceLen; strm.avail_out = *destLen; ret = BZ2_bzCompress ( &strm, BZ_FINISH ); if (ret == BZ_FINISH_OK) goto output_overflow; if (ret != BZ_STREAM_END) goto errhandler; /* normal termination */ *destLen -= strm.avail_out; BZ2_bzCompressEnd ( &strm ); return BZ_OK; output_overflow: BZ2_bzCompressEnd ( &strm ); return BZ_OUTBUFF_FULL; errhandler: BZ2_bzCompressEnd ( &strm ); return ret; } /*---------------------------------------------------*/ int BZ_API(BZ2_bzBuffToBuffDecompress) ( char* dest, unsigned int* destLen, char* source, unsigned int sourceLen, int small, int verbosity ) { bz_stream strm; int ret; if (dest == NULL || destLen == NULL || source == NULL || (small != 0 && small != 1) || verbosity < 0 || verbosity > 4) return BZ_PARAM_ERROR; strm.bzalloc = NULL; strm.bzfree = NULL; strm.opaque = NULL; ret = BZ2_bzDecompressInit ( &strm, verbosity, small ); if (ret != BZ_OK) return ret; strm.next_in = source; strm.next_out = dest; strm.avail_in = sourceLen; strm.avail_out = *destLen; ret = BZ2_bzDecompress ( &strm ); if (ret == BZ_OK) goto output_overflow_or_eof; if (ret != BZ_STREAM_END) goto errhandler; /* normal termination */ *destLen -= strm.avail_out; BZ2_bzDecompressEnd ( &strm ); return BZ_OK; output_overflow_or_eof: if (strm.avail_out > 0) { BZ2_bzDecompressEnd ( &strm ); return BZ_UNEXPECTED_EOF; } else { BZ2_bzDecompressEnd ( &strm ); return BZ_OUTBUFF_FULL; }; errhandler: BZ2_bzDecompressEnd ( &strm ); return ret; } /*---------------------------------------------------*/ /*-- Code contributed by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp) to support better zlib compatibility. This code is not _officially_ part of libbzip2 (yet); I haven't tested it, documented it, or considered the threading-safeness of it. If this code breaks, please contact both Yoshioka and me. --*/ /*---------------------------------------------------*/ /*---------------------------------------------------*/ /*-- return version like "0.9.5d, 4-Sept-1999". --*/ const char * BZ_API(BZ2_bzlibVersion)(void) { return BZ_VERSION; } #ifndef BZ_NO_STDIO /*---------------------------------------------------*/ #if defined(_WIN32) || defined(OS2) || defined(MSDOS) # include # include # define SET_BINARY_MODE(file) setmode(fileno(file),O_BINARY) #else # define SET_BINARY_MODE(file) #endif static BZFILE * bzopen_or_bzdopen ( const char *path, /* no use when bzdopen */ int fd, /* no use when bzdopen */ const char *mode, int open_mode) /* bzopen: 0, bzdopen:1 */ { int bzerr; char unused[BZ_MAX_UNUSED]; int blockSize100k = 9; int writing = 0; char mode2[10] = ""; FILE *fp = NULL; BZFILE *bzfp = NULL; int verbosity = 0; int workFactor = 30; int smallMode = 0; int nUnused = 0; if (mode == NULL) return NULL; while (*mode) { switch (*mode) { case 'r': writing = 0; break; case 'w': writing = 1; break; case 's': smallMode = 1; break; default: if (isdigit((int)(*mode))) { blockSize100k = *mode-BZ_HDR_0; } } mode++; } strcat(mode2, writing ? "w" : "r" ); strcat(mode2,"b"); /* binary mode */ if (open_mode==0) { if (path==NULL || strcmp(path,"")==0) { fp = (writing ? stdout : stdin); SET_BINARY_MODE(fp); } else { fp = fopen(path,mode2); } } else { #ifdef BZ_STRICT_ANSI fp = NULL; #else fp = fdopen(fd,mode2); #endif } if (fp == NULL) return NULL; if (writing) { /* Guard against total chaos and anarchy -- JRS */ if (blockSize100k < 1) blockSize100k = 1; if (blockSize100k > 9) blockSize100k = 9; bzfp = BZ2_bzWriteOpen(&bzerr,fp,blockSize100k, verbosity,workFactor); } else { bzfp = BZ2_bzReadOpen(&bzerr,fp,verbosity,smallMode, unused,nUnused); } if (bzfp == NULL) { if (fp != stdin && fp != stdout) fclose(fp); return NULL; } return bzfp; } /*---------------------------------------------------*/ /*-- open file for read or write. ex) bzopen("file","w9") case path="" or NULL => use stdin or stdout. --*/ BZFILE * BZ_API(BZ2_bzopen) ( const char *path, const char *mode ) { return bzopen_or_bzdopen(path,-1,mode,/*bzopen*/0); } /*---------------------------------------------------*/ BZFILE * BZ_API(BZ2_bzdopen) ( int fd, const char *mode ) { return bzopen_or_bzdopen(NULL,fd,mode,/*bzdopen*/1); } /*---------------------------------------------------*/ int BZ_API(BZ2_bzread) (BZFILE* b, void* buf, int len ) { int bzerr, nread; if (((bzFile*)b)->lastErr == BZ_STREAM_END) return 0; nread = BZ2_bzRead(&bzerr,b,buf,len); if (bzerr == BZ_OK || bzerr == BZ_STREAM_END) { return nread; } else { return -1; } } /*---------------------------------------------------*/ int BZ_API(BZ2_bzwrite) (BZFILE* b, void* buf, int len ) { int bzerr; BZ2_bzWrite(&bzerr,b,buf,len); if(bzerr == BZ_OK){ return len; }else{ return -1; } } /*---------------------------------------------------*/ int BZ_API(BZ2_bzflush) (BZFILE *b) { /* do nothing now... */ return 0; } /*---------------------------------------------------*/ void BZ_API(BZ2_bzclose) (BZFILE* b) { int bzerr; FILE *fp; if (b==NULL) {return;} fp = ((bzFile *)b)->handle; if(((bzFile*)b)->writing){ BZ2_bzWriteClose(&bzerr,b,0,NULL,NULL); if(bzerr != BZ_OK){ BZ2_bzWriteClose(NULL,b,1,NULL,NULL); } }else{ BZ2_bzReadClose(&bzerr,b); } if(fp!=stdin && fp!=stdout){ fclose(fp); } } /*---------------------------------------------------*/ /*-- return last error code --*/ static const char *bzerrorstrings[] = { "OK" ,"SEQUENCE_ERROR" ,"PARAM_ERROR" ,"MEM_ERROR" ,"DATA_ERROR" ,"DATA_ERROR_MAGIC" ,"IO_ERROR" ,"UNEXPECTED_EOF" ,"OUTBUFF_FULL" ,"CONFIG_ERROR" ,"???" /* for future */ ,"???" /* for future */ ,"???" /* for future */ ,"???" /* for future */ ,"???" /* for future */ ,"???" /* for future */ }; const char * BZ_API(BZ2_bzerror) (BZFILE *b, int *errnum) { int err = ((bzFile *)b)->lastErr; if(err>0) err = 0; *errnum = err; return bzerrorstrings[err*-1]; } #endif /*-------------------------------------------------------------*/ /*--- end bzlib.c ---*/ /*-------------------------------------------------------------*/ gtkwave-3.3.86/src/libbz2/decompress.c0000664000175000017500000005066713166335473017105 0ustar bybellbybell /*-------------------------------------------------------------*/ /*--- Decompression machinery ---*/ /*--- decompress.c ---*/ /*-------------------------------------------------------------*/ /* ------------------------------------------------------------------ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. bzip2/libbzip2 version 1.0.6 of 6 September 2010 Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. This program is released under the terms of the license contained in the file LICENSE. ------------------------------------------------------------------ */ #include "bzlib_private.h" /*---------------------------------------------------*/ static void makeMaps_d ( DState* s ) { Int32 i; s->nInUse = 0; for (i = 0; i < 256; i++) if (s->inUse[i]) { s->seqToUnseq[s->nInUse] = i; s->nInUse++; } } /*---------------------------------------------------*/ #define RETURN(rrr) \ { retVal = rrr; goto save_state_and_return; }; #define GET_BITS(lll,vvv,nnn) \ case lll: s->state = lll; \ while (True) { \ if (s->bsLive >= nnn) { \ UInt32 v; \ v = (s->bsBuff >> \ (s->bsLive-nnn)) & ((1 << nnn)-1); \ s->bsLive -= nnn; \ vvv = v; \ break; \ } \ if (s->strm->avail_in == 0) RETURN(BZ_OK); \ s->bsBuff \ = (s->bsBuff << 8) | \ ((UInt32) \ (*((UChar*)(s->strm->next_in)))); \ s->bsLive += 8; \ s->strm->next_in++; \ s->strm->avail_in--; \ s->strm->total_in_lo32++; \ if (s->strm->total_in_lo32 == 0) \ s->strm->total_in_hi32++; \ } #define GET_UCHAR(lll,uuu) \ GET_BITS(lll,uuu,8) #define GET_BIT(lll,uuu) \ GET_BITS(lll,uuu,1) /*---------------------------------------------------*/ #define GET_MTF_VAL(label1,label2,lval) \ { \ if (groupPos == 0) { \ groupNo++; \ if (groupNo >= nSelectors) \ RETURN(BZ_DATA_ERROR); \ groupPos = BZ_G_SIZE; \ gSel = s->selector[groupNo]; \ gMinlen = s->minLens[gSel]; \ gLimit = &(s->limit[gSel][0]); \ gPerm = &(s->perm[gSel][0]); \ gBase = &(s->base[gSel][0]); \ } \ groupPos--; \ zn = gMinlen; \ GET_BITS(label1, zvec, zn); \ while (1) { \ if (zn > 20 /* the longest code */) \ RETURN(BZ_DATA_ERROR); \ if (zvec <= gLimit[zn]) break; \ zn++; \ GET_BIT(label2, zj); \ zvec = (zvec << 1) | zj; \ }; \ if (zvec - gBase[zn] < 0 \ || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE) \ RETURN(BZ_DATA_ERROR); \ lval = gPerm[zvec - gBase[zn]]; \ } /*---------------------------------------------------*/ Int32 BZ2_decompress ( DState* s ) { UChar uc; Int32 retVal; Int32 minLen, maxLen; bz_stream* strm = s->strm; /* stuff that needs to be saved/restored */ Int32 i; Int32 j; Int32 t; Int32 alphaSize; Int32 nGroups; Int32 nSelectors; Int32 EOB; Int32 groupNo; Int32 groupPos; Int32 nextSym; Int32 nblockMAX; Int32 nblock; Int32 es; Int32 N; Int32 curr; Int32 zt; Int32 zn; Int32 zvec; Int32 zj; Int32 gSel; Int32 gMinlen; Int32* gLimit; Int32* gBase; Int32* gPerm; if (s->state == BZ_X_MAGIC_1) { /*initialise the save area*/ s->save_i = 0; s->save_j = 0; s->save_t = 0; s->save_alphaSize = 0; s->save_nGroups = 0; s->save_nSelectors = 0; s->save_EOB = 0; s->save_groupNo = 0; s->save_groupPos = 0; s->save_nextSym = 0; s->save_nblockMAX = 0; s->save_nblock = 0; s->save_es = 0; s->save_N = 0; s->save_curr = 0; s->save_zt = 0; s->save_zn = 0; s->save_zvec = 0; s->save_zj = 0; s->save_gSel = 0; s->save_gMinlen = 0; s->save_gLimit = NULL; s->save_gBase = NULL; s->save_gPerm = NULL; } /*restore from the save area*/ i = s->save_i; j = s->save_j; t = s->save_t; alphaSize = s->save_alphaSize; nGroups = s->save_nGroups; nSelectors = s->save_nSelectors; EOB = s->save_EOB; groupNo = s->save_groupNo; groupPos = s->save_groupPos; nextSym = s->save_nextSym; nblockMAX = s->save_nblockMAX; nblock = s->save_nblock; es = s->save_es; N = s->save_N; curr = s->save_curr; zt = s->save_zt; zn = s->save_zn; zvec = s->save_zvec; zj = s->save_zj; gSel = s->save_gSel; gMinlen = s->save_gMinlen; gLimit = s->save_gLimit; gBase = s->save_gBase; gPerm = s->save_gPerm; retVal = BZ_OK; switch (s->state) { GET_UCHAR(BZ_X_MAGIC_1, uc); if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC); GET_UCHAR(BZ_X_MAGIC_2, uc); if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC); GET_UCHAR(BZ_X_MAGIC_3, uc) if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC); GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8) if (s->blockSize100k < (BZ_HDR_0 + 1) || s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC); s->blockSize100k -= BZ_HDR_0; if (s->smallDecompress) { s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) ); s->ll4 = BZALLOC( ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar) ); if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR); } else { s->tt = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) ); if (s->tt == NULL) RETURN(BZ_MEM_ERROR); } GET_UCHAR(BZ_X_BLKHDR_1, uc); if (uc == 0x17) goto endhdr_2; if (uc != 0x31) RETURN(BZ_DATA_ERROR); GET_UCHAR(BZ_X_BLKHDR_2, uc); if (uc != 0x41) RETURN(BZ_DATA_ERROR); GET_UCHAR(BZ_X_BLKHDR_3, uc); if (uc != 0x59) RETURN(BZ_DATA_ERROR); GET_UCHAR(BZ_X_BLKHDR_4, uc); if (uc != 0x26) RETURN(BZ_DATA_ERROR); GET_UCHAR(BZ_X_BLKHDR_5, uc); if (uc != 0x53) RETURN(BZ_DATA_ERROR); GET_UCHAR(BZ_X_BLKHDR_6, uc); if (uc != 0x59) RETURN(BZ_DATA_ERROR); s->currBlockNo++; if (s->verbosity >= 2) VPrintf1 ( "\n [%d: huff+mtf ", s->currBlockNo ); s->storedBlockCRC = 0; GET_UCHAR(BZ_X_BCRC_1, uc); s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); GET_UCHAR(BZ_X_BCRC_2, uc); s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); GET_UCHAR(BZ_X_BCRC_3, uc); s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); GET_UCHAR(BZ_X_BCRC_4, uc); s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1); s->origPtr = 0; GET_UCHAR(BZ_X_ORIGPTR_1, uc); s->origPtr = (s->origPtr << 8) | ((Int32)uc); GET_UCHAR(BZ_X_ORIGPTR_2, uc); s->origPtr = (s->origPtr << 8) | ((Int32)uc); GET_UCHAR(BZ_X_ORIGPTR_3, uc); s->origPtr = (s->origPtr << 8) | ((Int32)uc); if (s->origPtr < 0) RETURN(BZ_DATA_ERROR); if (s->origPtr > 10 + 100000*s->blockSize100k) RETURN(BZ_DATA_ERROR); /*--- Receive the mapping table ---*/ for (i = 0; i < 16; i++) { GET_BIT(BZ_X_MAPPING_1, uc); if (uc == 1) s->inUse16[i] = True; else s->inUse16[i] = False; } for (i = 0; i < 256; i++) s->inUse[i] = False; for (i = 0; i < 16; i++) if (s->inUse16[i]) for (j = 0; j < 16; j++) { GET_BIT(BZ_X_MAPPING_2, uc); if (uc == 1) s->inUse[i * 16 + j] = True; } makeMaps_d ( s ); if (s->nInUse == 0) RETURN(BZ_DATA_ERROR); alphaSize = s->nInUse+2; /*--- Now the selectors ---*/ GET_BITS(BZ_X_SELECTOR_1, nGroups, 3); if (nGroups < 2 || nGroups > 6) RETURN(BZ_DATA_ERROR); GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15); if (nSelectors < 1) RETURN(BZ_DATA_ERROR); for (i = 0; i < nSelectors; i++) { j = 0; while (True) { GET_BIT(BZ_X_SELECTOR_3, uc); if (uc == 0) break; j++; if (j >= nGroups) RETURN(BZ_DATA_ERROR); } s->selectorMtf[i] = j; } /*--- Undo the MTF values for the selectors. ---*/ { UChar pos[BZ_N_GROUPS], tmp, v; for (v = 0; v < nGroups; v++) pos[v] = v; for (i = 0; i < nSelectors; i++) { v = s->selectorMtf[i]; tmp = pos[v]; while (v > 0) { pos[v] = pos[v-1]; v--; } pos[0] = tmp; s->selector[i] = tmp; } } /*--- Now the coding tables ---*/ for (t = 0; t < nGroups; t++) { GET_BITS(BZ_X_CODING_1, curr, 5); for (i = 0; i < alphaSize; i++) { while (True) { if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR); GET_BIT(BZ_X_CODING_2, uc); if (uc == 0) break; GET_BIT(BZ_X_CODING_3, uc); if (uc == 0) curr++; else curr--; } s->len[t][i] = curr; } } /*--- Create the Huffman decoding tables ---*/ for (t = 0; t < nGroups; t++) { minLen = 32; maxLen = 0; for (i = 0; i < alphaSize; i++) { if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; if (s->len[t][i] < minLen) minLen = s->len[t][i]; } BZ2_hbCreateDecodeTables ( &(s->limit[t][0]), &(s->base[t][0]), &(s->perm[t][0]), &(s->len[t][0]), minLen, maxLen, alphaSize ); s->minLens[t] = minLen; } /*--- Now the MTF values ---*/ EOB = s->nInUse+1; nblockMAX = 100000 * s->blockSize100k; groupNo = -1; groupPos = 0; for (i = 0; i <= 255; i++) s->unzftab[i] = 0; /*-- MTF init --*/ { Int32 ii, jj, kk; kk = MTFA_SIZE-1; for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) { for (jj = MTFL_SIZE-1; jj >= 0; jj--) { s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj); kk--; } s->mtfbase[ii] = kk + 1; } } /*-- end MTF init --*/ nblock = 0; GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym); while (True) { if (nextSym == EOB) break; if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) { es = -1; N = 1; do { /* Check that N doesn't get too big, so that es doesn't go negative. The maximum value that can be RUNA/RUNB encoded is equal to the block size (post the initial RLE), viz, 900k, so bounding N at 2 million should guard against overflow without rejecting any legitimate inputs. */ if (N >= 2*1024*1024) RETURN(BZ_DATA_ERROR); if (nextSym == BZ_RUNA) es = es + (0+1) * N; else if (nextSym == BZ_RUNB) es = es + (1+1) * N; N = N * 2; GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym); } while (nextSym == BZ_RUNA || nextSym == BZ_RUNB); es++; uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ]; s->unzftab[uc] += es; if (s->smallDecompress) while (es > 0) { if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); s->ll16[nblock] = (UInt16)uc; nblock++; es--; } else while (es > 0) { if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); s->tt[nblock] = (UInt32)uc; nblock++; es--; }; continue; } else { if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); /*-- uc = MTF ( nextSym-1 ) --*/ { Int32 ii, jj, kk, pp, lno, off; UInt32 nn; nn = (UInt32)(nextSym - 1); if (nn < MTFL_SIZE) { /* avoid general-case expense */ pp = s->mtfbase[0]; uc = s->mtfa[pp+nn]; while (nn > 3) { Int32 z = pp+nn; s->mtfa[(z) ] = s->mtfa[(z)-1]; s->mtfa[(z)-1] = s->mtfa[(z)-2]; s->mtfa[(z)-2] = s->mtfa[(z)-3]; s->mtfa[(z)-3] = s->mtfa[(z)-4]; nn -= 4; } while (nn > 0) { s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; }; s->mtfa[pp] = uc; } else { /* general case */ lno = nn / MTFL_SIZE; off = nn % MTFL_SIZE; pp = s->mtfbase[lno] + off; uc = s->mtfa[pp]; while (pp > s->mtfbase[lno]) { s->mtfa[pp] = s->mtfa[pp-1]; pp--; }; s->mtfbase[lno]++; while (lno > 0) { s->mtfbase[lno]--; s->mtfa[s->mtfbase[lno]] = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1]; lno--; } s->mtfbase[0]--; s->mtfa[s->mtfbase[0]] = uc; if (s->mtfbase[0] == 0) { kk = MTFA_SIZE-1; for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) { for (jj = MTFL_SIZE-1; jj >= 0; jj--) { s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj]; kk--; } s->mtfbase[ii] = kk + 1; } } } } /*-- end uc = MTF ( nextSym-1 ) --*/ s->unzftab[s->seqToUnseq[uc]]++; if (s->smallDecompress) s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else s->tt[nblock] = (UInt32)(s->seqToUnseq[uc]); nblock++; GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym); continue; } } /* Now we know what nblock is, we can do a better sanity check on s->origPtr. */ if (s->origPtr < 0 || s->origPtr >= nblock) RETURN(BZ_DATA_ERROR); /*-- Set up cftab to facilitate generation of T^(-1) --*/ /* Check: unzftab entries in range. */ for (i = 0; i <= 255; i++) { if (s->unzftab[i] < 0 || s->unzftab[i] > nblock) RETURN(BZ_DATA_ERROR); } /* Actually generate cftab. */ s->cftab[0] = 0; for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1]; for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1]; /* Check: cftab entries in range. */ for (i = 0; i <= 256; i++) { if (s->cftab[i] < 0 || s->cftab[i] > nblock) { /* s->cftab[i] can legitimately be == nblock */ RETURN(BZ_DATA_ERROR); } } /* Check: cftab entries non-descending. */ for (i = 1; i <= 256; i++) { if (s->cftab[i-1] > s->cftab[i]) { RETURN(BZ_DATA_ERROR); } } s->state_out_len = 0; s->state_out_ch = 0; BZ_INITIALISE_CRC ( s->calculatedBlockCRC ); s->state = BZ_X_OUTPUT; if (s->verbosity >= 2) VPrintf0 ( "rt+rld" ); if (s->smallDecompress) { /*-- Make a copy of cftab, used in generation of T --*/ for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i]; /*-- compute the T vector --*/ for (i = 0; i < nblock; i++) { uc = (UChar)(s->ll16[i]); SET_LL(i, s->cftabCopy[uc]); s->cftabCopy[uc]++; } /*-- Compute T^(-1) by pointer reversal on T --*/ i = s->origPtr; j = GET_LL(i); do { Int32 tmp = GET_LL(j); SET_LL(j, i); i = j; j = tmp; } while (i != s->origPtr); s->tPos = s->origPtr; s->nblock_used = 0; if (s->blockRandomised) { BZ_RAND_INIT_MASK; BZ_GET_SMALL(s->k0); s->nblock_used++; BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; } else { BZ_GET_SMALL(s->k0); s->nblock_used++; } } else { /*-- compute the T^(-1) vector --*/ for (i = 0; i < nblock; i++) { uc = (UChar)(s->tt[i] & 0xff); s->tt[s->cftab[uc]] |= (i << 8); s->cftab[uc]++; } s->tPos = s->tt[s->origPtr] >> 8; s->nblock_used = 0; if (s->blockRandomised) { BZ_RAND_INIT_MASK; BZ_GET_FAST(s->k0); s->nblock_used++; BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; } else { BZ_GET_FAST(s->k0); s->nblock_used++; } } RETURN(BZ_OK); endhdr_2: GET_UCHAR(BZ_X_ENDHDR_2, uc); if (uc != 0x72) RETURN(BZ_DATA_ERROR); GET_UCHAR(BZ_X_ENDHDR_3, uc); if (uc != 0x45) RETURN(BZ_DATA_ERROR); GET_UCHAR(BZ_X_ENDHDR_4, uc); if (uc != 0x38) RETURN(BZ_DATA_ERROR); GET_UCHAR(BZ_X_ENDHDR_5, uc); if (uc != 0x50) RETURN(BZ_DATA_ERROR); GET_UCHAR(BZ_X_ENDHDR_6, uc); if (uc != 0x90) RETURN(BZ_DATA_ERROR); s->storedCombinedCRC = 0; GET_UCHAR(BZ_X_CCRC_1, uc); s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); GET_UCHAR(BZ_X_CCRC_2, uc); s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); GET_UCHAR(BZ_X_CCRC_3, uc); s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); GET_UCHAR(BZ_X_CCRC_4, uc); s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); s->state = BZ_X_IDLE; RETURN(BZ_STREAM_END); default: AssertH ( False, 4001 ); } AssertH ( False, 4002 ); save_state_and_return: s->save_i = i; s->save_j = j; s->save_t = t; s->save_alphaSize = alphaSize; s->save_nGroups = nGroups; s->save_nSelectors = nSelectors; s->save_EOB = EOB; s->save_groupNo = groupNo; s->save_groupPos = groupPos; s->save_nextSym = nextSym; s->save_nblockMAX = nblockMAX; s->save_nblock = nblock; s->save_es = es; s->save_N = N; s->save_curr = curr; s->save_zt = zt; s->save_zn = zn; s->save_zvec = zvec; s->save_zj = zj; s->save_gSel = gSel; s->save_gMinlen = gMinlen; s->save_gLimit = gLimit; s->save_gBase = gBase; s->save_gPerm = gPerm; return retVal; } /*-------------------------------------------------------------*/ /*--- end decompress.c ---*/ /*-------------------------------------------------------------*/ gtkwave-3.3.86/src/libbz2/huffman.c0000664000175000017500000001551713166335473016360 0ustar bybellbybell /*-------------------------------------------------------------*/ /*--- Huffman coding low-level stuff ---*/ /*--- huffman.c ---*/ /*-------------------------------------------------------------*/ /* ------------------------------------------------------------------ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. bzip2/libbzip2 version 1.0.6 of 6 September 2010 Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. This program is released under the terms of the license contained in the file LICENSE. ------------------------------------------------------------------ */ #include "bzlib_private.h" /*---------------------------------------------------*/ #define WEIGHTOF(zz0) ((zz0) & 0xffffff00) #define DEPTHOF(zz1) ((zz1) & 0x000000ff) #define MYMAX(zz2,zz3) ((zz2) > (zz3) ? (zz2) : (zz3)) #define ADDWEIGHTS(zw1,zw2) \ (WEIGHTOF(zw1)+WEIGHTOF(zw2)) | \ (1 + MYMAX(DEPTHOF(zw1),DEPTHOF(zw2))) #define UPHEAP(z) \ { \ Int32 zz, tmp; \ zz = z; tmp = heap[zz]; \ while (weight[tmp] < weight[heap[zz >> 1]]) { \ heap[zz] = heap[zz >> 1]; \ zz >>= 1; \ } \ heap[zz] = tmp; \ } #define DOWNHEAP(z) \ { \ Int32 zz, yy, tmp; \ zz = z; tmp = heap[zz]; \ while (True) { \ yy = zz << 1; \ if (yy > nHeap) break; \ if (yy < nHeap && \ weight[heap[yy+1]] < weight[heap[yy]]) \ yy++; \ if (weight[tmp] < weight[heap[yy]]) break; \ heap[zz] = heap[yy]; \ zz = yy; \ } \ heap[zz] = tmp; \ } /*---------------------------------------------------*/ void BZ2_hbMakeCodeLengths ( UChar *len, Int32 *freq, Int32 alphaSize, Int32 maxLen ) { /*-- Nodes and heap entries run from 1. Entry 0 for both the heap and nodes is a sentinel. --*/ Int32 nNodes, nHeap, n1, n2, i, j, k; Bool tooLong; Int32 heap [ BZ_MAX_ALPHA_SIZE + 2 ]; Int32 weight [ BZ_MAX_ALPHA_SIZE * 2 ]; Int32 parent [ BZ_MAX_ALPHA_SIZE * 2 ]; for (i = 0; i < alphaSize; i++) weight[i+1] = (freq[i] == 0 ? 1 : freq[i]) << 8; while (True) { nNodes = alphaSize; nHeap = 0; heap[0] = 0; weight[0] = 0; parent[0] = -2; for (i = 1; i <= alphaSize; i++) { parent[i] = -1; nHeap++; heap[nHeap] = i; UPHEAP(nHeap); } AssertH( nHeap < (BZ_MAX_ALPHA_SIZE+2), 2001 ); while (nHeap > 1) { n1 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1); n2 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1); nNodes++; parent[n1] = parent[n2] = nNodes; weight[nNodes] = ADDWEIGHTS(weight[n1], weight[n2]); parent[nNodes] = -1; nHeap++; heap[nHeap] = nNodes; UPHEAP(nHeap); } AssertH( nNodes < (BZ_MAX_ALPHA_SIZE * 2), 2002 ); tooLong = False; for (i = 1; i <= alphaSize; i++) { j = 0; k = i; while (parent[k] >= 0) { k = parent[k]; j++; } len[i-1] = j; if (j > maxLen) tooLong = True; } if (! tooLong) break; /* 17 Oct 04: keep-going condition for the following loop used to be 'i < alphaSize', which missed the last element, theoretically leading to the possibility of the compressor looping. However, this count-scaling step is only needed if one of the generated Huffman code words is longer than maxLen, which up to and including version 1.0.2 was 20 bits, which is extremely unlikely. In version 1.0.3 maxLen was changed to 17 bits, which has minimal effect on compression ratio, but does mean this scaling step is used from time to time, enough to verify that it works. This means that bzip2-1.0.3 and later will only produce Huffman codes with a maximum length of 17 bits. However, in order to preserve backwards compatibility with bitstreams produced by versions pre-1.0.3, the decompressor must still handle lengths of up to 20. */ for (i = 1; i <= alphaSize; i++) { j = weight[i] >> 8; j = 1 + (j / 2); weight[i] = j << 8; } } } /*---------------------------------------------------*/ void BZ2_hbAssignCodes ( Int32 *code, UChar *length, Int32 minLen, Int32 maxLen, Int32 alphaSize ) { Int32 n, vec, i; vec = 0; for (n = minLen; n <= maxLen; n++) { for (i = 0; i < alphaSize; i++) if (length[i] == n) { code[i] = vec; vec++; }; vec <<= 1; } } /*---------------------------------------------------*/ void BZ2_hbCreateDecodeTables ( Int32 *limit, Int32 *base, Int32 *perm, UChar *length, Int32 minLen, Int32 maxLen, Int32 alphaSize ) { Int32 pp, i, j, vec; pp = 0; for (i = minLen; i <= maxLen; i++) for (j = 0; j < alphaSize; j++) if (length[j] == i) { perm[pp] = j; pp++; }; for (i = 0; i < BZ_MAX_CODE_LEN; i++) base[i] = 0; for (i = 0; i < alphaSize; i++) base[length[i]+1]++; for (i = 1; i < BZ_MAX_CODE_LEN; i++) base[i] += base[i-1]; for (i = 0; i < BZ_MAX_CODE_LEN; i++) limit[i] = 0; vec = 0; for (i = minLen; i <= maxLen; i++) { vec += (base[i+1] - base[i]); limit[i] = vec-1; vec <<= 1; } for (i = minLen + 1; i <= maxLen; i++) base[i] = ((limit[i-1] + 1) << 1) - base[i]; } /*-------------------------------------------------------------*/ /*--- end huffman.c ---*/ /*-------------------------------------------------------------*/ gtkwave-3.3.86/src/libbz2/bzlib.h0000664000175000017500000001414513166335473016037 0ustar bybellbybell /*-------------------------------------------------------------*/ /*--- Public header file for the library. ---*/ /*--- bzlib.h ---*/ /*-------------------------------------------------------------*/ /* ------------------------------------------------------------------ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. bzip2/libbzip2 version 1.0.6 of 6 September 2010 Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. This program is released under the terms of the license contained in the file LICENSE. ------------------------------------------------------------------ */ #ifndef _BZLIB_H #define _BZLIB_H #ifdef __cplusplus extern "C" { #endif #define BZ_RUN 0 #define BZ_FLUSH 1 #define BZ_FINISH 2 #define BZ_OK 0 #define BZ_RUN_OK 1 #define BZ_FLUSH_OK 2 #define BZ_FINISH_OK 3 #define BZ_STREAM_END 4 #define BZ_SEQUENCE_ERROR (-1) #define BZ_PARAM_ERROR (-2) #define BZ_MEM_ERROR (-3) #define BZ_DATA_ERROR (-4) #define BZ_DATA_ERROR_MAGIC (-5) #define BZ_IO_ERROR (-6) #define BZ_UNEXPECTED_EOF (-7) #define BZ_OUTBUFF_FULL (-8) #define BZ_CONFIG_ERROR (-9) typedef struct { char *next_in; unsigned int avail_in; unsigned int total_in_lo32; unsigned int total_in_hi32; char *next_out; unsigned int avail_out; unsigned int total_out_lo32; unsigned int total_out_hi32; void *state; void *(*bzalloc)(void *,int,int); void (*bzfree)(void *,void *); void *opaque; } bz_stream; #ifndef BZ_IMPORT #define BZ_EXPORT #endif #ifndef BZ_NO_STDIO /* Need a definitition for FILE */ #include #endif #ifdef _WIN32 # include # ifdef small /* windows.h define small to char */ # undef small # endif # ifdef BZ_EXPORT # define BZ_API(func) WINAPI func # define BZ_EXTERN extern # else /* import windows dll dynamically */ # define BZ_API(func) (WINAPI * func) # define BZ_EXTERN # endif #else # define BZ_API(func) func # define BZ_EXTERN extern #endif /*-- Core (low-level) library functions --*/ BZ_EXTERN int BZ_API(BZ2_bzCompressInit) ( bz_stream* strm, int blockSize100k, int verbosity, int workFactor ); BZ_EXTERN int BZ_API(BZ2_bzCompress) ( bz_stream* strm, int action ); BZ_EXTERN int BZ_API(BZ2_bzCompressEnd) ( bz_stream* strm ); BZ_EXTERN int BZ_API(BZ2_bzDecompressInit) ( bz_stream *strm, int verbosity, int small ); BZ_EXTERN int BZ_API(BZ2_bzDecompress) ( bz_stream* strm ); BZ_EXTERN int BZ_API(BZ2_bzDecompressEnd) ( bz_stream *strm ); /*-- High(er) level library functions --*/ #ifndef BZ_NO_STDIO #define BZ_MAX_UNUSED 5000 typedef void BZFILE; BZ_EXTERN BZFILE* BZ_API(BZ2_bzReadOpen) ( int* bzerror, FILE* f, int verbosity, int small, void* unused, int nUnused ); BZ_EXTERN void BZ_API(BZ2_bzReadClose) ( int* bzerror, BZFILE* b ); BZ_EXTERN void BZ_API(BZ2_bzReadGetUnused) ( int* bzerror, BZFILE* b, void** unused, int* nUnused ); BZ_EXTERN int BZ_API(BZ2_bzRead) ( int* bzerror, BZFILE* b, void* buf, int len ); BZ_EXTERN BZFILE* BZ_API(BZ2_bzWriteOpen) ( int* bzerror, FILE* f, int blockSize100k, int verbosity, int workFactor ); BZ_EXTERN void BZ_API(BZ2_bzWrite) ( int* bzerror, BZFILE* b, void* buf, int len ); BZ_EXTERN void BZ_API(BZ2_bzWriteClose) ( int* bzerror, BZFILE* b, int abandon, unsigned int* nbytes_in, unsigned int* nbytes_out ); BZ_EXTERN void BZ_API(BZ2_bzWriteClose64) ( int* bzerror, BZFILE* b, int abandon, unsigned int* nbytes_in_lo32, unsigned int* nbytes_in_hi32, unsigned int* nbytes_out_lo32, unsigned int* nbytes_out_hi32 ); #endif /*-- Utility functions --*/ BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffCompress) ( char* dest, unsigned int* destLen, char* source, unsigned int sourceLen, int blockSize100k, int verbosity, int workFactor ); BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffDecompress) ( char* dest, unsigned int* destLen, char* source, unsigned int sourceLen, int small, int verbosity ); /*-- Code contributed by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp) to support better zlib compatibility. This code is not _officially_ part of libbzip2 (yet); I haven't tested it, documented it, or considered the threading-safeness of it. If this code breaks, please contact both Yoshioka and me. --*/ BZ_EXTERN const char * BZ_API(BZ2_bzlibVersion) ( void ); #ifndef BZ_NO_STDIO BZ_EXTERN BZFILE * BZ_API(BZ2_bzopen) ( const char *path, const char *mode ); BZ_EXTERN BZFILE * BZ_API(BZ2_bzdopen) ( int fd, const char *mode ); BZ_EXTERN int BZ_API(BZ2_bzread) ( BZFILE* b, void* buf, int len ); BZ_EXTERN int BZ_API(BZ2_bzwrite) ( BZFILE* b, void* buf, int len ); BZ_EXTERN int BZ_API(BZ2_bzflush) ( BZFILE* b ); BZ_EXTERN void BZ_API(BZ2_bzclose) ( BZFILE* b ); BZ_EXTERN const char * BZ_API(BZ2_bzerror) ( BZFILE *b, int *errnum ); #endif #ifdef __cplusplus } #endif #endif /*-------------------------------------------------------------*/ /*--- end bzlib.h ---*/ /*-------------------------------------------------------------*/ gtkwave-3.3.86/src/libbz2/Makefile.am0000664000175000017500000000033713166335473016616 0ustar bybellbybell## -*- makefile -*- ## noinst_LIBRARIES= libbz2.a libbz2_a_SOURCES= blocksort.c bzlib.h compress.c decompress.c randtable.c \ bzlib.c bzlib_private.h crctable.c huffman.c EXTRA_DIST= bzlib.h LICENSE gtkwave-3.3.86/src/libbz2/compress.c0000664000175000017500000005012113166335473016555 0ustar bybellbybell /*-------------------------------------------------------------*/ /*--- Compression machinery (not incl block sorting) ---*/ /*--- compress.c ---*/ /*-------------------------------------------------------------*/ /* ------------------------------------------------------------------ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. bzip2/libbzip2 version 1.0.6 of 6 September 2010 Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. This program is released under the terms of the license contained in the file LICENSE. ------------------------------------------------------------------ */ /* CHANGES 0.9.0 -- original version. 0.9.0a/b -- no changes in this file. 0.9.0c -- changed setting of nGroups in sendMTFValues() so as to do a bit better on small files */ #include "bzlib_private.h" /*---------------------------------------------------*/ /*--- Bit stream I/O ---*/ /*---------------------------------------------------*/ /*---------------------------------------------------*/ void BZ2_bsInitWrite ( EState* s ) { s->bsLive = 0; s->bsBuff = 0; } /*---------------------------------------------------*/ static void bsFinishWrite ( EState* s ) { while (s->bsLive > 0) { s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24); s->numZ++; s->bsBuff <<= 8; s->bsLive -= 8; } } /*---------------------------------------------------*/ #define bsNEEDW(nz) \ { \ while (s->bsLive >= 8) { \ s->zbits[s->numZ] \ = (UChar)(s->bsBuff >> 24); \ s->numZ++; \ s->bsBuff <<= 8; \ s->bsLive -= 8; \ } \ } /*---------------------------------------------------*/ static __inline__ void bsW ( EState* s, Int32 n, UInt32 v ) { bsNEEDW ( n ); s->bsBuff |= (v << (32 - s->bsLive - n)); s->bsLive += n; } /*---------------------------------------------------*/ static void bsPutUInt32 ( EState* s, UInt32 u ) { bsW ( s, 8, (u >> 24) & 0xffL ); bsW ( s, 8, (u >> 16) & 0xffL ); bsW ( s, 8, (u >> 8) & 0xffL ); bsW ( s, 8, u & 0xffL ); } /*---------------------------------------------------*/ static void bsPutUChar ( EState* s, UChar c ) { bsW( s, 8, (UInt32)c ); } /*---------------------------------------------------*/ /*--- The back end proper ---*/ /*---------------------------------------------------*/ /*---------------------------------------------------*/ static void makeMaps_e ( EState* s ) { Int32 i; s->nInUse = 0; for (i = 0; i < 256; i++) if (s->inUse[i]) { s->unseqToSeq[i] = s->nInUse; s->nInUse++; } } /*---------------------------------------------------*/ static void generateMTFValues ( EState* s ) { UChar yy[256]; Int32 i, j; Int32 zPend; Int32 wr; Int32 EOB; /* After sorting (eg, here), s->arr1 [ 0 .. s->nblock-1 ] holds sorted order, and ((UChar*)s->arr2) [ 0 .. s->nblock-1 ] holds the original block data. The first thing to do is generate the MTF values, and put them in ((UInt16*)s->arr1) [ 0 .. s->nblock-1 ]. Because there are strictly fewer or equal MTF values than block values, ptr values in this area are overwritten with MTF values only when they are no longer needed. The final compressed bitstream is generated into the area starting at (UChar*) (&((UChar*)s->arr2)[s->nblock]) These storage aliases are set up in bzCompressInit(), except for the last one, which is arranged in compressBlock(). */ UInt32* ptr = s->ptr; UChar* block = s->block; UInt16* mtfv = s->mtfv; makeMaps_e ( s ); EOB = s->nInUse+1; for (i = 0; i <= EOB; i++) s->mtfFreq[i] = 0; wr = 0; zPend = 0; for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i; for (i = 0; i < s->nblock; i++) { UChar ll_i; AssertD ( wr <= i, "generateMTFValues(1)" ); j = ptr[i]-1; if (j < 0) j += s->nblock; ll_i = s->unseqToSeq[block[j]]; AssertD ( ll_i < s->nInUse, "generateMTFValues(2a)" ); if (yy[0] == ll_i) { zPend++; } else { if (zPend > 0) { zPend--; while (True) { if (zPend & 1) { mtfv[wr] = BZ_RUNB; wr++; s->mtfFreq[BZ_RUNB]++; } else { mtfv[wr] = BZ_RUNA; wr++; s->mtfFreq[BZ_RUNA]++; } if (zPend < 2) break; zPend = (zPend - 2) / 2; }; zPend = 0; } { register UChar rtmp; register UChar* ryy_j; register UChar rll_i; rtmp = yy[1]; yy[1] = yy[0]; ryy_j = &(yy[1]); rll_i = ll_i; while ( rll_i != rtmp ) { register UChar rtmp2; ryy_j++; rtmp2 = rtmp; rtmp = *ryy_j; *ryy_j = rtmp2; }; yy[0] = rtmp; j = ryy_j - &(yy[0]); mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++; } } } if (zPend > 0) { zPend--; while (True) { if (zPend & 1) { mtfv[wr] = BZ_RUNB; wr++; s->mtfFreq[BZ_RUNB]++; } else { mtfv[wr] = BZ_RUNA; wr++; s->mtfFreq[BZ_RUNA]++; } if (zPend < 2) break; zPend = (zPend - 2) / 2; }; zPend = 0; } mtfv[wr] = EOB; wr++; s->mtfFreq[EOB]++; s->nMTF = wr; } /*---------------------------------------------------*/ #define BZ_LESSER_ICOST 0 #define BZ_GREATER_ICOST 15 static void sendMTFValues ( EState* s ) { Int32 v, t, i, j, gs, ge, totc, bt, bc, iter; Int32 nSelectors, alphaSize, minLen, maxLen, selCtr; Int32 nGroups, nBytes; /*-- UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; is a global since the decoder also needs it. Int32 code[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; Int32 rfreq[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; are also globals only used in this proc. Made global to keep stack frame size small. --*/ UInt16 cost[BZ_N_GROUPS]; Int32 fave[BZ_N_GROUPS]; UInt16* mtfv = s->mtfv; if (s->verbosity >= 3) VPrintf3( " %d in block, %d after MTF & 1-2 coding, " "%d+2 syms in use\n", s->nblock, s->nMTF, s->nInUse ); alphaSize = s->nInUse+2; for (t = 0; t < BZ_N_GROUPS; t++) for (v = 0; v < alphaSize; v++) s->len[t][v] = BZ_GREATER_ICOST; /*--- Decide how many coding tables to use ---*/ AssertH ( s->nMTF > 0, 3001 ); if (s->nMTF < 200) nGroups = 2; else if (s->nMTF < 600) nGroups = 3; else if (s->nMTF < 1200) nGroups = 4; else if (s->nMTF < 2400) nGroups = 5; else nGroups = 6; /*--- Generate an initial set of coding tables ---*/ { Int32 nPart, remF, tFreq, aFreq; nPart = nGroups; remF = s->nMTF; gs = 0; while (nPart > 0) { tFreq = remF / nPart; ge = gs-1; aFreq = 0; while (aFreq < tFreq && ge < alphaSize-1) { ge++; aFreq += s->mtfFreq[ge]; } if (ge > gs && nPart != nGroups && nPart != 1 && ((nGroups-nPart) % 2 == 1)) { aFreq -= s->mtfFreq[ge]; ge--; } if (s->verbosity >= 3) VPrintf5( " initial group %d, [%d .. %d], " "has %d syms (%4.1f%%)\n", nPart, gs, ge, aFreq, (100.0 * (float)aFreq) / (float)(s->nMTF) ); for (v = 0; v < alphaSize; v++) if (v >= gs && v <= ge) s->len[nPart-1][v] = BZ_LESSER_ICOST; else s->len[nPart-1][v] = BZ_GREATER_ICOST; nPart--; gs = ge+1; remF -= aFreq; } } /*--- Iterate up to BZ_N_ITERS times to improve the tables. ---*/ for (iter = 0; iter < BZ_N_ITERS; iter++) { for (t = 0; t < nGroups; t++) fave[t] = 0; for (t = 0; t < nGroups; t++) for (v = 0; v < alphaSize; v++) s->rfreq[t][v] = 0; /*--- Set up an auxiliary length table which is used to fast-track the common case (nGroups == 6). ---*/ if (nGroups == 6) { for (v = 0; v < alphaSize; v++) { s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v]; s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v]; s->len_pack[v][2] = (s->len[5][v] << 16) | s->len[4][v]; } } nSelectors = 0; totc = 0; gs = 0; while (True) { /*--- Set group start & end marks. --*/ if (gs >= s->nMTF) break; ge = gs + BZ_G_SIZE - 1; if (ge >= s->nMTF) ge = s->nMTF-1; /*-- Calculate the cost of this group as coded by each of the coding tables. --*/ for (t = 0; t < nGroups; t++) cost[t] = 0; if (nGroups == 6 && 50 == ge-gs+1) { /*--- fast track the common case ---*/ register UInt32 cost01, cost23, cost45; register UInt16 icv; cost01 = cost23 = cost45 = 0; # define BZ_ITER(nn) \ icv = mtfv[gs+(nn)]; \ cost01 += s->len_pack[icv][0]; \ cost23 += s->len_pack[icv][1]; \ cost45 += s->len_pack[icv][2]; \ BZ_ITER(0); BZ_ITER(1); BZ_ITER(2); BZ_ITER(3); BZ_ITER(4); BZ_ITER(5); BZ_ITER(6); BZ_ITER(7); BZ_ITER(8); BZ_ITER(9); BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14); BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19); BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24); BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29); BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34); BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39); BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44); BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49); # undef BZ_ITER cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16; cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16; cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16; } else { /*--- slow version which correctly handles all situations ---*/ for (i = gs; i <= ge; i++) { UInt16 icv = mtfv[i]; for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv]; } } /*-- Find the coding table which is best for this group, and record its identity in the selector table. --*/ bc = 999999999; bt = -1; for (t = 0; t < nGroups; t++) if (cost[t] < bc) { bc = cost[t]; bt = t; }; totc += bc; fave[bt]++; s->selector[nSelectors] = bt; nSelectors++; /*-- Increment the symbol frequencies for the selected table. --*/ if (nGroups == 6 && 50 == ge-gs+1) { /*--- fast track the common case ---*/ # define BZ_ITUR(nn) s->rfreq[bt][ mtfv[gs+(nn)] ]++ BZ_ITUR(0); BZ_ITUR(1); BZ_ITUR(2); BZ_ITUR(3); BZ_ITUR(4); BZ_ITUR(5); BZ_ITUR(6); BZ_ITUR(7); BZ_ITUR(8); BZ_ITUR(9); BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14); BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19); BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24); BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29); BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34); BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39); BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44); BZ_ITUR(45); BZ_ITUR(46); BZ_ITUR(47); BZ_ITUR(48); BZ_ITUR(49); # undef BZ_ITUR } else { /*--- slow version which correctly handles all situations ---*/ for (i = gs; i <= ge; i++) s->rfreq[bt][ mtfv[i] ]++; } gs = ge+1; } if (s->verbosity >= 3) { VPrintf2 ( " pass %d: size is %d, grp uses are ", iter+1, totc/8 ); for (t = 0; t < nGroups; t++) VPrintf1 ( "%d ", fave[t] ); VPrintf0 ( "\n" ); } /*-- Recompute the tables based on the accumulated frequencies. --*/ /* maxLen was changed from 20 to 17 in bzip2-1.0.3. See comment in huffman.c for details. */ for (t = 0; t < nGroups; t++) BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]), alphaSize, 17 /*20*/ ); } AssertH( nGroups < 8, 3002 ); AssertH( nSelectors < 32768 && nSelectors <= (2 + (900000 / BZ_G_SIZE)), 3003 ); /*--- Compute MTF values for the selectors. ---*/ { UChar pos[BZ_N_GROUPS], ll_i, tmp2, tmp; for (i = 0; i < nGroups; i++) pos[i] = i; for (i = 0; i < nSelectors; i++) { ll_i = s->selector[i]; j = 0; tmp = pos[j]; while ( ll_i != tmp ) { j++; tmp2 = tmp; tmp = pos[j]; pos[j] = tmp2; }; pos[0] = tmp; s->selectorMtf[i] = j; } }; /*--- Assign actual codes for the tables. --*/ for (t = 0; t < nGroups; t++) { minLen = 32; maxLen = 0; for (i = 0; i < alphaSize; i++) { if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; if (s->len[t][i] < minLen) minLen = s->len[t][i]; } AssertH ( !(maxLen > 17 /*20*/ ), 3004 ); AssertH ( !(minLen < 1), 3005 ); BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]), minLen, maxLen, alphaSize ); } /*--- Transmit the mapping table. ---*/ { Bool inUse16[16]; for (i = 0; i < 16; i++) { inUse16[i] = False; for (j = 0; j < 16; j++) if (s->inUse[i * 16 + j]) inUse16[i] = True; } nBytes = s->numZ; for (i = 0; i < 16; i++) if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0); for (i = 0; i < 16; i++) if (inUse16[i]) for (j = 0; j < 16; j++) { if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0); } if (s->verbosity >= 3) VPrintf1( " bytes: mapping %d, ", s->numZ-nBytes ); } /*--- Now the selectors. ---*/ nBytes = s->numZ; bsW ( s, 3, nGroups ); bsW ( s, 15, nSelectors ); for (i = 0; i < nSelectors; i++) { for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1); bsW(s,1,0); } if (s->verbosity >= 3) VPrintf1( "selectors %d, ", s->numZ-nBytes ); /*--- Now the coding tables. ---*/ nBytes = s->numZ; for (t = 0; t < nGroups; t++) { Int32 curr = s->len[t][0]; bsW ( s, 5, curr ); for (i = 0; i < alphaSize; i++) { while (curr < s->len[t][i]) { bsW(s,2,2); curr++; /* 10 */ }; while (curr > s->len[t][i]) { bsW(s,2,3); curr--; /* 11 */ }; bsW ( s, 1, 0 ); } } if (s->verbosity >= 3) VPrintf1 ( "code lengths %d, ", s->numZ-nBytes ); /*--- And finally, the block data proper ---*/ nBytes = s->numZ; selCtr = 0; gs = 0; while (True) { if (gs >= s->nMTF) break; ge = gs + BZ_G_SIZE - 1; if (ge >= s->nMTF) ge = s->nMTF-1; AssertH ( s->selector[selCtr] < nGroups, 3006 ); if (nGroups == 6 && 50 == ge-gs+1) { /*--- fast track the common case ---*/ UInt16 mtfv_i; UChar* s_len_sel_selCtr = &(s->len[s->selector[selCtr]][0]); Int32* s_code_sel_selCtr = &(s->code[s->selector[selCtr]][0]); # define BZ_ITAH(nn) \ mtfv_i = mtfv[gs+(nn)]; \ bsW ( s, \ s_len_sel_selCtr[mtfv_i], \ s_code_sel_selCtr[mtfv_i] ) BZ_ITAH(0); BZ_ITAH(1); BZ_ITAH(2); BZ_ITAH(3); BZ_ITAH(4); BZ_ITAH(5); BZ_ITAH(6); BZ_ITAH(7); BZ_ITAH(8); BZ_ITAH(9); BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14); BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19); BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24); BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29); BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34); BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39); BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44); BZ_ITAH(45); BZ_ITAH(46); BZ_ITAH(47); BZ_ITAH(48); BZ_ITAH(49); # undef BZ_ITAH } else { /*--- slow version which correctly handles all situations ---*/ for (i = gs; i <= ge; i++) { bsW ( s, s->len [s->selector[selCtr]] [mtfv[i]], s->code [s->selector[selCtr]] [mtfv[i]] ); } } gs = ge+1; selCtr++; } AssertH( selCtr == nSelectors, 3007 ); if (s->verbosity >= 3) VPrintf1( "codes %d\n", s->numZ-nBytes ); } /*---------------------------------------------------*/ void BZ2_compressBlock ( EState* s, Bool is_last_block ) { if (s->nblock > 0) { BZ_FINALISE_CRC ( s->blockCRC ); s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31); s->combinedCRC ^= s->blockCRC; if (s->blockNo > 1) s->numZ = 0; if (s->verbosity >= 2) VPrintf4( " block %d: crc = 0x%08x, " "combined CRC = 0x%08x, size = %d\n", s->blockNo, s->blockCRC, s->combinedCRC, s->nblock ); BZ2_blockSort ( s ); } s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]); /*-- If this is the first block, create the stream header. --*/ if (s->blockNo == 1) { BZ2_bsInitWrite ( s ); bsPutUChar ( s, BZ_HDR_B ); bsPutUChar ( s, BZ_HDR_Z ); bsPutUChar ( s, BZ_HDR_h ); bsPutUChar ( s, (UChar)(BZ_HDR_0 + s->blockSize100k) ); } if (s->nblock > 0) { bsPutUChar ( s, 0x31 ); bsPutUChar ( s, 0x41 ); bsPutUChar ( s, 0x59 ); bsPutUChar ( s, 0x26 ); bsPutUChar ( s, 0x53 ); bsPutUChar ( s, 0x59 ); /*-- Now the block's CRC, so it is in a known place. --*/ bsPutUInt32 ( s, s->blockCRC ); /*-- Now a single bit indicating (non-)randomisation. As of version 0.9.5, we use a better sorting algorithm which makes randomisation unnecessary. So always set the randomised bit to 'no'. Of course, the decoder still needs to be able to handle randomised blocks so as to maintain backwards compatibility with older versions of bzip2. --*/ bsW(s,1,0); bsW ( s, 24, s->origPtr ); generateMTFValues ( s ); sendMTFValues ( s ); } /*-- If this is the last block, add the stream trailer. --*/ if (is_last_block) { bsPutUChar ( s, 0x17 ); bsPutUChar ( s, 0x72 ); bsPutUChar ( s, 0x45 ); bsPutUChar ( s, 0x38 ); bsPutUChar ( s, 0x50 ); bsPutUChar ( s, 0x90 ); bsPutUInt32 ( s, s->combinedCRC ); if (s->verbosity >= 2) VPrintf1( " final combined CRC = 0x%08x\n ", s->combinedCRC ); bsFinishWrite ( s ); } } /*-------------------------------------------------------------*/ /*--- end compress.c ---*/ /*-------------------------------------------------------------*/ gtkwave-3.3.86/src/libbz2/randtable.c0000664000175000017500000000742413166335473016666 0ustar bybellbybell /*-------------------------------------------------------------*/ /*--- Table for randomising repetitive blocks ---*/ /*--- randtable.c ---*/ /*-------------------------------------------------------------*/ /* ------------------------------------------------------------------ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. bzip2/libbzip2 version 1.0.6 of 6 September 2010 Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. This program is released under the terms of the license contained in the file LICENSE. ------------------------------------------------------------------ */ #include "bzlib_private.h" /*---------------------------------------------*/ Int32 BZ2_rNums[512] = { 619, 720, 127, 481, 931, 816, 813, 233, 566, 247, 985, 724, 205, 454, 863, 491, 741, 242, 949, 214, 733, 859, 335, 708, 621, 574, 73, 654, 730, 472, 419, 436, 278, 496, 867, 210, 399, 680, 480, 51, 878, 465, 811, 169, 869, 675, 611, 697, 867, 561, 862, 687, 507, 283, 482, 129, 807, 591, 733, 623, 150, 238, 59, 379, 684, 877, 625, 169, 643, 105, 170, 607, 520, 932, 727, 476, 693, 425, 174, 647, 73, 122, 335, 530, 442, 853, 695, 249, 445, 515, 909, 545, 703, 919, 874, 474, 882, 500, 594, 612, 641, 801, 220, 162, 819, 984, 589, 513, 495, 799, 161, 604, 958, 533, 221, 400, 386, 867, 600, 782, 382, 596, 414, 171, 516, 375, 682, 485, 911, 276, 98, 553, 163, 354, 666, 933, 424, 341, 533, 870, 227, 730, 475, 186, 263, 647, 537, 686, 600, 224, 469, 68, 770, 919, 190, 373, 294, 822, 808, 206, 184, 943, 795, 384, 383, 461, 404, 758, 839, 887, 715, 67, 618, 276, 204, 918, 873, 777, 604, 560, 951, 160, 578, 722, 79, 804, 96, 409, 713, 940, 652, 934, 970, 447, 318, 353, 859, 672, 112, 785, 645, 863, 803, 350, 139, 93, 354, 99, 820, 908, 609, 772, 154, 274, 580, 184, 79, 626, 630, 742, 653, 282, 762, 623, 680, 81, 927, 626, 789, 125, 411, 521, 938, 300, 821, 78, 343, 175, 128, 250, 170, 774, 972, 275, 999, 639, 495, 78, 352, 126, 857, 956, 358, 619, 580, 124, 737, 594, 701, 612, 669, 112, 134, 694, 363, 992, 809, 743, 168, 974, 944, 375, 748, 52, 600, 747, 642, 182, 862, 81, 344, 805, 988, 739, 511, 655, 814, 334, 249, 515, 897, 955, 664, 981, 649, 113, 974, 459, 893, 228, 433, 837, 553, 268, 926, 240, 102, 654, 459, 51, 686, 754, 806, 760, 493, 403, 415, 394, 687, 700, 946, 670, 656, 610, 738, 392, 760, 799, 887, 653, 978, 321, 576, 617, 626, 502, 894, 679, 243, 440, 680, 879, 194, 572, 640, 724, 926, 56, 204, 700, 707, 151, 457, 449, 797, 195, 791, 558, 945, 679, 297, 59, 87, 824, 713, 663, 412, 693, 342, 606, 134, 108, 571, 364, 631, 212, 174, 643, 304, 329, 343, 97, 430, 751, 497, 314, 983, 374, 822, 928, 140, 206, 73, 263, 980, 736, 876, 478, 430, 305, 170, 514, 364, 692, 829, 82, 855, 953, 676, 246, 369, 970, 294, 750, 807, 827, 150, 790, 288, 923, 804, 378, 215, 828, 592, 281, 565, 555, 710, 82, 896, 831, 547, 261, 524, 462, 293, 465, 502, 56, 661, 821, 976, 991, 658, 869, 905, 758, 745, 193, 768, 550, 608, 933, 378, 286, 215, 979, 792, 961, 61, 688, 793, 644, 986, 403, 106, 366, 905, 644, 372, 567, 466, 434, 645, 210, 389, 550, 919, 135, 780, 773, 635, 389, 707, 100, 626, 958, 165, 504, 920, 176, 193, 713, 857, 265, 203, 50, 668, 108, 645, 990, 626, 197, 510, 357, 358, 850, 858, 364, 936, 638 }; /*-------------------------------------------------------------*/ /*--- end randtable.c ---*/ /*-------------------------------------------------------------*/ gtkwave-3.3.86/src/libbz2/crctable.c0000664000175000017500000001132213166335473016501 0ustar bybellbybell /*-------------------------------------------------------------*/ /*--- Table for doing CRCs ---*/ /*--- crctable.c ---*/ /*-------------------------------------------------------------*/ /* ------------------------------------------------------------------ This file is part of bzip2/libbzip2, a program and library for lossless, block-sorting data compression. bzip2/libbzip2 version 1.0.6 of 6 September 2010 Copyright (C) 1996-2010 Julian Seward Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. This program is released under the terms of the license contained in the file LICENSE. ------------------------------------------------------------------ */ #include "bzlib_private.h" /*-- I think this is an implementation of the AUTODIN-II, Ethernet & FDDI 32-bit CRC standard. Vaguely derived from code by Rob Warnock, in Section 51 of the comp.compression FAQ. --*/ UInt32 BZ2_crc32Table[256] = { /*-- Ugly, innit? --*/ 0x00000000L, 0x04c11db7L, 0x09823b6eL, 0x0d4326d9L, 0x130476dcL, 0x17c56b6bL, 0x1a864db2L, 0x1e475005L, 0x2608edb8L, 0x22c9f00fL, 0x2f8ad6d6L, 0x2b4bcb61L, 0x350c9b64L, 0x31cd86d3L, 0x3c8ea00aL, 0x384fbdbdL, 0x4c11db70L, 0x48d0c6c7L, 0x4593e01eL, 0x4152fda9L, 0x5f15adacL, 0x5bd4b01bL, 0x569796c2L, 0x52568b75L, 0x6a1936c8L, 0x6ed82b7fL, 0x639b0da6L, 0x675a1011L, 0x791d4014L, 0x7ddc5da3L, 0x709f7b7aL, 0x745e66cdL, 0x9823b6e0L, 0x9ce2ab57L, 0x91a18d8eL, 0x95609039L, 0x8b27c03cL, 0x8fe6dd8bL, 0x82a5fb52L, 0x8664e6e5L, 0xbe2b5b58L, 0xbaea46efL, 0xb7a96036L, 0xb3687d81L, 0xad2f2d84L, 0xa9ee3033L, 0xa4ad16eaL, 0xa06c0b5dL, 0xd4326d90L, 0xd0f37027L, 0xddb056feL, 0xd9714b49L, 0xc7361b4cL, 0xc3f706fbL, 0xceb42022L, 0xca753d95L, 0xf23a8028L, 0xf6fb9d9fL, 0xfbb8bb46L, 0xff79a6f1L, 0xe13ef6f4L, 0xe5ffeb43L, 0xe8bccd9aL, 0xec7dd02dL, 0x34867077L, 0x30476dc0L, 0x3d044b19L, 0x39c556aeL, 0x278206abL, 0x23431b1cL, 0x2e003dc5L, 0x2ac12072L, 0x128e9dcfL, 0x164f8078L, 0x1b0ca6a1L, 0x1fcdbb16L, 0x018aeb13L, 0x054bf6a4L, 0x0808d07dL, 0x0cc9cdcaL, 0x7897ab07L, 0x7c56b6b0L, 0x71159069L, 0x75d48ddeL, 0x6b93dddbL, 0x6f52c06cL, 0x6211e6b5L, 0x66d0fb02L, 0x5e9f46bfL, 0x5a5e5b08L, 0x571d7dd1L, 0x53dc6066L, 0x4d9b3063L, 0x495a2dd4L, 0x44190b0dL, 0x40d816baL, 0xaca5c697L, 0xa864db20L, 0xa527fdf9L, 0xa1e6e04eL, 0xbfa1b04bL, 0xbb60adfcL, 0xb6238b25L, 0xb2e29692L, 0x8aad2b2fL, 0x8e6c3698L, 0x832f1041L, 0x87ee0df6L, 0x99a95df3L, 0x9d684044L, 0x902b669dL, 0x94ea7b2aL, 0xe0b41de7L, 0xe4750050L, 0xe9362689L, 0xedf73b3eL, 0xf3b06b3bL, 0xf771768cL, 0xfa325055L, 0xfef34de2L, 0xc6bcf05fL, 0xc27dede8L, 0xcf3ecb31L, 0xcbffd686L, 0xd5b88683L, 0xd1799b34L, 0xdc3abdedL, 0xd8fba05aL, 0x690ce0eeL, 0x6dcdfd59L, 0x608edb80L, 0x644fc637L, 0x7a089632L, 0x7ec98b85L, 0x738aad5cL, 0x774bb0ebL, 0x4f040d56L, 0x4bc510e1L, 0x46863638L, 0x42472b8fL, 0x5c007b8aL, 0x58c1663dL, 0x558240e4L, 0x51435d53L, 0x251d3b9eL, 0x21dc2629L, 0x2c9f00f0L, 0x285e1d47L, 0x36194d42L, 0x32d850f5L, 0x3f9b762cL, 0x3b5a6b9bL, 0x0315d626L, 0x07d4cb91L, 0x0a97ed48L, 0x0e56f0ffL, 0x1011a0faL, 0x14d0bd4dL, 0x19939b94L, 0x1d528623L, 0xf12f560eL, 0xf5ee4bb9L, 0xf8ad6d60L, 0xfc6c70d7L, 0xe22b20d2L, 0xe6ea3d65L, 0xeba91bbcL, 0xef68060bL, 0xd727bbb6L, 0xd3e6a601L, 0xdea580d8L, 0xda649d6fL, 0xc423cd6aL, 0xc0e2d0ddL, 0xcda1f604L, 0xc960ebb3L, 0xbd3e8d7eL, 0xb9ff90c9L, 0xb4bcb610L, 0xb07daba7L, 0xae3afba2L, 0xaafbe615L, 0xa7b8c0ccL, 0xa379dd7bL, 0x9b3660c6L, 0x9ff77d71L, 0x92b45ba8L, 0x9675461fL, 0x8832161aL, 0x8cf30badL, 0x81b02d74L, 0x857130c3L, 0x5d8a9099L, 0x594b8d2eL, 0x5408abf7L, 0x50c9b640L, 0x4e8ee645L, 0x4a4ffbf2L, 0x470cdd2bL, 0x43cdc09cL, 0x7b827d21L, 0x7f436096L, 0x7200464fL, 0x76c15bf8L, 0x68860bfdL, 0x6c47164aL, 0x61043093L, 0x65c52d24L, 0x119b4be9L, 0x155a565eL, 0x18197087L, 0x1cd86d30L, 0x029f3d35L, 0x065e2082L, 0x0b1d065bL, 0x0fdc1becL, 0x3793a651L, 0x3352bbe6L, 0x3e119d3fL, 0x3ad08088L, 0x2497d08dL, 0x2056cd3aL, 0x2d15ebe3L, 0x29d4f654L, 0xc5a92679L, 0xc1683bceL, 0xcc2b1d17L, 0xc8ea00a0L, 0xd6ad50a5L, 0xd26c4d12L, 0xdf2f6bcbL, 0xdbee767cL, 0xe3a1cbc1L, 0xe760d676L, 0xea23f0afL, 0xeee2ed18L, 0xf0a5bd1dL, 0xf464a0aaL, 0xf9278673L, 0xfde69bc4L, 0x89b8fd09L, 0x8d79e0beL, 0x803ac667L, 0x84fbdbd0L, 0x9abc8bd5L, 0x9e7d9662L, 0x933eb0bbL, 0x97ffad0cL, 0xafb010b1L, 0xab710d06L, 0xa6322bdfL, 0xa2f33668L, 0xbcb4666dL, 0xb8757bdaL, 0xb5365d03L, 0xb1f740b4L }; /*-------------------------------------------------------------*/ /*--- end crctable.c ---*/ /*-------------------------------------------------------------*/ gtkwave-3.3.86/src/simplereq.h0000664000175000017500000000074613166335473015554 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010 * * 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. */ #ifndef WAVE_SIMPLEREQ_H #define WAVE_SIMPLEREQ_H void simplereqbox(char *title, int width, char *default_text, char *oktext, char *canceltext, GtkSignalFunc func, int is_alert); #endif gtkwave-3.3.86/src/renderopt.h0000664000175000017500000000060213166335473015544 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010 * * 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. */ #ifndef WAVE_RENDEROPT_H #define WAVE_RENDEROPT_H void renderbox(char *title); #endif gtkwave-3.3.86/src/bsearch.c0000664000175000017500000001721313166335473015152 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2013. * * 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. */ #include "globals.h" #include #include "analyzer.h" #include "currenttime.h" #include "symbol.h" #include "bsearch.h" #include "strace.h" #include "hierpack.h" #include static int compar_timechain(const void *s1, const void *s2) { TimeType key, obj, delta; TimeType *cpos; int rv; key=*((TimeType *)s1); obj=*(cpos=(TimeType *)s2); if((obj<=key)&&(obj>GLOBALS->max_compare_time_tc_bsearch_c_1)) { GLOBALS->max_compare_time_tc_bsearch_c_1=obj; GLOBALS->max_compare_pos_tc_bsearch_c_1=cpos; } delta=key-obj; if(delta<0) rv=-1; else if(delta>0) rv=1; else rv=0; return(rv); } int bsearch_timechain(TimeType key) { GLOBALS->max_compare_time_tc_bsearch_c_1=-2; GLOBALS->max_compare_pos_tc_bsearch_c_1=NULL; if(!GLOBALS->strace_ctx->timearray) return(-1); if(bsearch(&key, GLOBALS->strace_ctx->timearray, GLOBALS->strace_ctx->timearray_size, sizeof(TimeType), compar_timechain)) { /* nothing, all side effects are in bsearch */ } if((!GLOBALS->max_compare_pos_tc_bsearch_c_1)||(GLOBALS->max_compare_time_tc_bsearch_c_1shift_timebase)) { GLOBALS->max_compare_pos_tc_bsearch_c_1=GLOBALS->strace_ctx->timearray; /* aix bsearch fix */ } return(GLOBALS->max_compare_pos_tc_bsearch_c_1-GLOBALS->strace_ctx->timearray); } /*****************************************************************************************/ int bsearch_aetinfo_timechain(TimeType key) { GLOBALS->max_compare_time_tc_bsearch_c_1=-2; GLOBALS->max_compare_pos_tc_bsearch_c_1=NULL; if(!GLOBALS->ae2_time_xlate) return(-1); if(bsearch(&key, GLOBALS->ae2_time_xlate, GLOBALS->ae2_end_cyc - GLOBALS->ae2_start_cyc + 1, sizeof(TimeType), compar_timechain)) { /* nothing, all side effects are in bsearch */ } if(!GLOBALS->max_compare_pos_tc_bsearch_c_1) { GLOBALS->max_compare_pos_tc_bsearch_c_1=GLOBALS->ae2_time_xlate; /* aix bsearch fix */ } return(GLOBALS->max_compare_pos_tc_bsearch_c_1-GLOBALS->ae2_time_xlate); } /*****************************************************************************************/ static int compar_histent(const void *s1, const void *s2) { TimeType key, obj, delta; hptr cpos; int rv; key=*((TimeType *)s1); obj=(cpos=(*((hptr *)s2)))->time; if((obj<=key)&&(obj>GLOBALS->max_compare_time_bsearch_c_1)) { GLOBALS->max_compare_time_bsearch_c_1=obj; GLOBALS->max_compare_pos_bsearch_c_1=cpos; GLOBALS->max_compare_index=(hptr *)s2; } delta=key-obj; if(delta<0) rv=-1; else if(delta>0) rv=1; else rv=0; return(rv); } hptr bsearch_node(nptr n, TimeType key) { GLOBALS->max_compare_time_bsearch_c_1=-2; GLOBALS->max_compare_pos_bsearch_c_1=NULL; GLOBALS->max_compare_index=NULL; if(bsearch(&key, n->harray, n->numhist, sizeof(hptr), compar_histent)) { /* nothing, all side effects are in bsearch */ } if((!GLOBALS->max_compare_pos_bsearch_c_1)||(GLOBALS->max_compare_time_bsearch_c_1max_compare_pos_bsearch_c_1=n->harray[1]; /* aix bsearch fix */ GLOBALS->max_compare_index=&(n->harray[1]); } while(GLOBALS->max_compare_pos_bsearch_c_1->next) /* non-RoSync dumper deglitching fix */ { if(GLOBALS->max_compare_pos_bsearch_c_1->time != GLOBALS->max_compare_pos_bsearch_c_1->next->time) break; GLOBALS->max_compare_pos_bsearch_c_1 = GLOBALS->max_compare_pos_bsearch_c_1->next; } return(GLOBALS->max_compare_pos_bsearch_c_1); } /*****************************************************************************************/ static int compar_vectorent(const void *s1, const void *s2) { TimeType key, obj, delta; vptr cpos; int rv; key=*((TimeType *)s1); /* obj=(cpos=(*((vptr *)s2)))->time+GLOBALS->shift_timebase; */ obj=(cpos=(*((vptr *)s2)))->time; if((obj<=key)&&(obj>GLOBALS->vmax_compare_time_bsearch_c_1)) { GLOBALS->vmax_compare_time_bsearch_c_1=obj; GLOBALS->vmax_compare_pos_bsearch_c_1=cpos; GLOBALS->vmax_compare_index=(vptr *)s2; } delta=key-obj; if(delta<0) rv=-1; else if(delta>0) rv=1; else rv=0; return(rv); } vptr bsearch_vector(bvptr b, TimeType key) { GLOBALS->vmax_compare_time_bsearch_c_1=-2; GLOBALS->vmax_compare_pos_bsearch_c_1=NULL; GLOBALS->vmax_compare_index=NULL; if(bsearch(&key, b->vectors, b->numregions, sizeof(vptr), compar_vectorent)) { /* nothing, all side effects are in bsearch */ } if((!GLOBALS->vmax_compare_pos_bsearch_c_1)||(GLOBALS->vmax_compare_time_bsearch_c_1 that declared in the structure definition via end of structure malloc padding */ GLOBALS->vmax_compare_pos_bsearch_c_1=b->vectors[1]; /* aix bsearch fix */ GLOBALS->vmax_compare_index=&(b->vectors[1]); } while(GLOBALS->vmax_compare_pos_bsearch_c_1->next) /* non-RoSync dumper deglitching fix */ { if(GLOBALS->vmax_compare_pos_bsearch_c_1->time != GLOBALS->vmax_compare_pos_bsearch_c_1->next->time) break; GLOBALS->vmax_compare_pos_bsearch_c_1 = GLOBALS->vmax_compare_pos_bsearch_c_1->next; } return(GLOBALS->vmax_compare_pos_bsearch_c_1); } /*****************************************************************************************/ static int compar_trunc(const void *s1, const void *s2) { char *str; char vcache[2]; int key, obj; str=(char *)s2; key=*((int*)s1); vcache[0]=*str; vcache[1]=*(str+1); *str='+'; *(str+1)=0; obj=font_engine_string_measure(GLOBALS->wavefont,GLOBALS->trunc_asciibase_bsearch_c_1); *str=vcache[0]; *(str+1)=vcache[1]; if((obj<=key)&&(obj>GLOBALS->maxlen_trunc)) { GLOBALS->maxlen_trunc=obj; GLOBALS->maxlen_trunc_pos_bsearch_c_1=str; } return(key-obj); } char *bsearch_trunc(char *ascii, int maxlen) { int len; if((maxlen<=0)||(!ascii)||(!(len=strlen(ascii)))) return(NULL); GLOBALS->maxlen_trunc=0; GLOBALS->maxlen_trunc_pos_bsearch_c_1=NULL; if(bsearch(&maxlen, GLOBALS->trunc_asciibase_bsearch_c_1=ascii, len, sizeof(char), compar_trunc)) { /* nothing, all side effects are in bsearch */ } return(GLOBALS->maxlen_trunc_pos_bsearch_c_1); } /*****************************************************************************************/ static int compar_facs(const void *key, const void *v2) { struct symbol *s2; int rc; int was_packed = HIER_DEPACK_STATIC; char *s3; s2=*((struct symbol **)v2); s3 = hier_decompress_flagged(s2->name, &was_packed); rc=sigcmp((char *)key,s3); /* if(was_packed) free_2(s3); ...not needed with HIER_DEPACK_STATIC */ return(rc); } struct symbol *bsearch_facs(char *ascii, unsigned int *rows_return) { struct symbol **rc; int len; if ((!ascii)||(!(len=strlen(ascii)))) return(NULL); if(rows_return) { *rows_return = 0; } if(ascii[len-1]=='}') { int i; for(i=len-2;i>=2;i--) { if(isdigit((int)(unsigned char)ascii[i])) continue; if(ascii[i]=='{') { char *tsc = wave_alloca(i+1); memcpy(tsc, ascii, i+1); tsc[i] = 0; rc=(struct symbol **)bsearch(tsc, GLOBALS->facs, GLOBALS->numfacs, sizeof(struct symbol *), compar_facs); if(rc) { unsigned int whichrow = atoi(&ascii[i+1]); if(rows_return) *rows_return = whichrow; #ifdef WAVE_ARRAY_SUPPORT if(whichrow <= (*rc)->n->array_height) #endif { return(*rc); } } } break; /* fallthrough to normal handler */ } } rc=(struct symbol **)bsearch(ascii, GLOBALS->facs, GLOBALS->numfacs, sizeof(struct symbol *), compar_facs); if(rc) return(*rc); else return(NULL); } gtkwave-3.3.86/src/baseconvert.c0000664000175000017500000011335313166335473016060 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2017. * * 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. */ #include "globals.h" #include #include #include #include "gtk12compat.h" #include "currenttime.h" #include "pixmaps.h" #include "symbol.h" #include "bsearch.h" #include "color.h" #include "strace.h" #include "debug.h" #include "translate.h" #include "ptranslate.h" #include "ttranslate.h" #include "pipeio.h" #ifdef _MSC_VER #define strcasecmp _stricmp #endif /* * convert binary <=> gray/popcnt in place */ #define cvt_gray(f,p,n) \ do { \ if((f)&(TR_GRAYMASK|TR_POPCNT)) \ { \ if((f)&TR_BINGRAY) { convert_bingray((p),(n)); } \ if((f)&TR_GRAYBIN) { convert_graybin((p),(n)); } \ if((f)&TR_POPCNT) { convert_popcnt((p),(n)); } \ } \ } while(0) static void convert_graybin(char *pnt, int nbits) { char kill_state = 0; char pch = AN_0; int i; for(i=0;i=0;i--) /* always requires less number of bits */ { pnt[i] = (pop & 1) ? AN_1 : AN_0; pop >>= 1; } } static void cvt_fpsdec(Trptr t, TimeType val, char *os, int len, int nbits) { (void)nbits; /* number of bits shouldn't be relevant here as we're going through a fraction */ int shamt = t->t_fpdecshift; TimeType lpart = val >> shamt; TimeType rmsk = (1 << shamt); TimeType rbit = (val >= 0) ? (val & (rmsk-1)) : ((-val) & (rmsk-1)); double rfrac; int negflag = 0; char dbuf[32]; char bigbuf[64]; if(rmsk) { rfrac = (double)rbit / (double)rmsk; if(shamt) { if(lpart < 0) { if(rbit) { lpart++; if(!lpart) negflag = 1; } } } } else { rfrac = 0.0; } sprintf(dbuf, "%.16g", rfrac); char *dot = strchr(dbuf, '.'); if(dot && (dbuf[0] == '0')) { sprintf(bigbuf, "%s"TTFormat".%s", negflag ? "-" : "", lpart, dot+1); strncpy(os, bigbuf, len); os[len-1] = 0; } else { sprintf(os, "%s"TTFormat, negflag ? "-" : "", lpart); } } static void cvt_fpsudec(Trptr t, TimeType val, char *os, int len) { int shamt = t->t_fpdecshift; UTimeType lpart = ((UTimeType)val) >> shamt; TimeType rmsk = (1 << shamt); TimeType rbit = (val & (rmsk-1)); double rfrac; char dbuf[32]; char bigbuf[64]; if(rmsk) { rfrac = (double)rbit / (double)rmsk; } else { rfrac = 0.0; } sprintf(dbuf, "%.16g", rfrac); char *dot = strchr(dbuf, '.'); if(dot && (dbuf[0] == '0')) { sprintf(bigbuf, UTTFormat".%s", lpart, dot+1); strncpy(os, bigbuf, len); os[len-1] = 0; } else { sprintf(os, UTTFormat, lpart); } } /* * convert trptr+vptr into an ascii string */ static char *convert_ascii_2(Trptr t, vptr v) { Ulong flags; int nbits; unsigned char *bits; char *os, *pnt, *newbuff; int i, j, len; static const char xfwd[AN_COUNT]= AN_NORMAL ; static const char xrev[AN_COUNT]= AN_INVERSE ; const char *xtab; flags=t->flags; nbits=t->n.vec->nbits; bits=v->v; if(flags&TR_INVERT) { xtab = xrev; } else { xtab = xfwd; } if(flags&(TR_ZEROFILL|TR_ONEFILL)) { char whichfill = (flags&TR_ZEROFILL) ? AN_0 : AN_1; int msi = 0, lsi = 0, ok = 0; if((t->name)&&(nbits > 1)) { char *lbrack = strrchr(t->name, '['); if(lbrack) { int rc = sscanf(lbrack+1, "%d:%d", &msi, &lsi); if(rc == 2) { if(((msi - lsi + 1) == nbits) || ((lsi - msi + 1) == nbits)) { ok = 1; /* to ensure sanity... */ } } } } if(ok) { if(msi > lsi) { if(lsi > 0) { pnt=wave_alloca(msi + 1); memcpy(pnt, bits, nbits); for(i=nbits;i 0) { pnt=wave_alloca(lsi + 1); for(i=0;ishow_base) { *(pnt++)='"'; } parse=(flags&TR_RJUSTIFY)?(newbuff+((nbits+7)&7)):(newbuff+7); cvt_gray(flags,parse,nbits); for(i=0;i 0x7f || !isprint(val)) *pnt++ = '.'; else *pnt++ = val; found=1; } parse+=8; } if (!found && !GLOBALS->show_base) { *(pnt++)='"'; *(pnt++)='"'; } if(GLOBALS->show_base) { *(pnt++)='"'; } *(pnt)=0x00; /* scan build : remove dead increment */ } else if((flags&TR_HEX)||((flags&(TR_DEC|TR_SIGNED))&&(nbits>64)&&(!(flags&TR_POPCNT)))) { char *parse; len=(nbits/4)+2+1; /* $xxxxx */ os=pnt=(char *)calloc_2(1,len); if(GLOBALS->show_base) { *(pnt++)='$'; } parse=(flags&TR_RJUSTIFY)?(newbuff+((nbits+3)&3)):(newbuff+3); cvt_gray(flags,parse,nbits); for(i=0;i= 0) match = 0; break; } } val = (match) ? 16 : 21; break; } else if(parse[j]==AN_Z) { int xover = 0; int match = (j==0) || ((parse + i + j) == (newbuff + 3)); int k; for(k=j+1;k<4;k++) { if(parse[k]!=AN_Z) { if(parse[k]==AN_X) { xover = 1; } else { char *thisbyt = parse + i + k; char *lastbyt = newbuff + 3 + nbits - 1; if((lastbyt - thisbyt) >= 0) match = 0; } break; } } if(xover) val = 21; else val = (match) ? 17 : 22; break; } else if(parse[j]==AN_W) { int xover = 0; int match = (j==0) || ((parse + i + j) == (newbuff + 3)); int k; for(k=j+1;k<4;k++) { if(parse[k]!=AN_W) { if(parse[k]==AN_X) { xover = 1; } else { char *thisbyt = parse + i + k; char *lastbyt = newbuff + 3 + nbits - 1; if((lastbyt - thisbyt) >= 0) match = 0; } break; } } if(xover) val = 21; else val = (match) ? 18 : 23; break; } else if(parse[j]==AN_U) { int xover = 0; int match = (j==0) || ((parse + i + j) == (newbuff + 3)); int k; for(k=j+1;k<4;k++) { if(parse[k]!=AN_U) { if(parse[k]==AN_X) { xover = 1; } else { char *thisbyt = parse + i + k; char *lastbyt = newbuff + 3 + nbits - 1; if((lastbyt - thisbyt) >= 0) match = 0; } break; } } if(xover) val = 21; else val = (match) ? 19 : 24; break; } else if(parse[j]==AN_DASH) { int xover = 0; int k; for(k=j+1;k<4;k++) { if(parse[k]!=AN_DASH) { if(parse[k]==AN_X) { xover = 1; } break; } } if(xover) val = 21; else val = 20; break; } } *(pnt++)=AN_HEX_STR[val]; parse+=4; } *(pnt)=0x00; /* scan build : remove dead increment */ } else if(flags&TR_OCT) { char *parse; len=(nbits/3)+2+1; /* #xxxxx */ os=pnt=(char *)calloc_2(1,len); if(GLOBALS->show_base) { *(pnt++)='#'; } parse=(flags&TR_RJUSTIFY) ?(newbuff+((nbits%3)?(nbits%3):3)) :(newbuff+3); cvt_gray(flags,parse,nbits); for(i=0;ishow_base) { *(pnt++)='%'; } parse=newbuff+3; cvt_gray(flags,parse,nbits); for(i=0;it_fpdecshift)) { cvt_fpsdec(t, val, os, len, nbits); } else { sprintf(os, TTFormat, val); } } else { strcpy(os, "XXX"); } } else if(flags&TR_REAL) { char *parse; if(nbits==64) { UTimeType utt = LLDescriptor(0); double d; parse=newbuff+3; cvt_gray(flags,parse,nbits); for(i=0;ishow_base) { *(pnt++)='%'; } parse=newbuff+3; cvt_gray(flags,parse,nbits); for(i=0;it_fpdecshift)) { cvt_fpsudec(t, val, os, len); } else { sprintf(os, UTTFormat, val); } } else { strcpy(os, "XXX"); } } free_2(newbuff); return(os); } /* * convert trptr+hptr vectorstring into an ascii string */ char *convert_ascii_real(Trptr t, double *d) { char *rv; if(t && (t->flags & TR_REAL2BITS) && d) /* "real2bits" also allows other filters such as "bits2real" on top of it */ { struct TraceEnt t2; char vec[64]; int i; guint64 swapmem; memcpy(&swapmem, d, sizeof(guint64)); for(i=0;i<64;i++) { if(swapmem & (ULLDescriptor(1)<<(63-i))) { vec[i] = AN_1; } else { vec[i] = AN_0; } } memcpy(&t2, t, sizeof(struct TraceEnt)); t2.n.nd->msi = 63; t2.n.nd->lsi = 0; t2.flags &= ~(TR_REAL2BITS); /* to avoid possible recursion in the future */ rv = convert_ascii_vec_2(&t2, vec); } else { rv=malloc_2(24); /* enough for .16e format */ if(d) { sprintf(rv,"%.16g",*d); } else { strcpy(rv,"UNDEF"); } } return(rv); } char *convert_ascii_string(char *s) { char *rv; if(s) { rv=(char *)malloc_2(strlen(s)+1); strcpy(rv, s); } else { rv=(char *)malloc_2(6); strcpy(rv, "UNDEF"); } return(rv); } int vtype(Trptr t, char *vec) { int i, nbits, res; int an_u_encountered = 0; if (vec == NULL) return(AN_X); nbits=t->n.nd->msi-t->n.nd->lsi; if(nbits<0)nbits=-nbits; nbits++; res = AN_1; for (i = 0; i < nbits; i++) { switch (*vec) { case AN_X: case 'x': case 'X': return(AN_X); case AN_U: case 'u': case 'U': an_u_encountered = 1; break; case AN_Z: case 'z': case 'Z': if (res == AN_0) return(AN_X); vec++; res = AN_Z; break; default: if (res == AN_Z) return(AN_X); vec++; res = AN_0; break; } } return(!an_u_encountered ? res : AN_U); } int vtype2(Trptr t, vptr v) { int i, nbits, res; int an_u_encountered = 0; char *vec=(char *)v->v; if(!t->t_filter_converted) { if (vec == NULL) return(AN_X); } else { return ( ((vec == NULL) || (vec[0] == 0)) ? AN_Z : AN_0 ); } nbits=t->n.vec->nbits; res = AN_1; for (i = 0; i < nbits; i++) { switch (*vec) { case AN_X: case 'x': case 'X': return(AN_X); case AN_U: case 'u': case 'U': an_u_encountered = 1; break; case AN_Z: case 'z': case 'Z': if (res == AN_0) return(AN_X); vec++; res = AN_Z; break; default: if (res == AN_Z) return(AN_X); vec++; res = AN_0; break; } } return(!an_u_encountered ? res : AN_U); } /* * convert trptr+hptr vectorstring into an ascii string */ char *convert_ascii_vec_2(Trptr t, char *vec) { Ulong flags; int nbits; char *bits; char *os, *pnt, *newbuff; int i, j, len; const char *xtab; static const char xfwd[AN_COUNT]= AN_NORMAL ; static const char xrev[AN_COUNT]= AN_INVERSE ; flags=t->flags; nbits=t->n.nd->msi-t->n.nd->lsi; if(nbits<0)nbits=-nbits; nbits++; if(vec) { bits=vec; if(*vec>AN_MSK) /* convert as needed */ for(i=0;i1)&&(t->n.nd->msi)&&(t->n.nd->lsi)) { char whichfill = (flags&TR_ZEROFILL) ? AN_0 : AN_1; if(t->n.nd->msi > t->n.nd->lsi) { if(t->n.nd->lsi > 0) { pnt=wave_alloca(t->n.nd->msi + 1); memcpy(pnt, bits, nbits); for(i=nbits;in.nd->msi+1;i++) { pnt[i]=whichfill; } bits = pnt; nbits = t->n.nd->msi + 1; } } else { if(t->n.nd->msi > 0) { pnt=wave_alloca(t->n.nd->lsi + 1); for(i=0;in.nd->msi;i++) { pnt[i]=whichfill; } memcpy(pnt+i, bits, nbits); bits = pnt; nbits = t->n.nd->lsi + 1; } } } if(flags&TR_INVERT) { xtab = xrev; } else { xtab = xfwd; } newbuff=(char *)malloc_2(nbits+6); /* for justify */ if(flags&TR_REVERSE) { char *fwdpnt, *revpnt; fwdpnt=bits; revpnt=newbuff+nbits+6; /* for(i=0;i<3;i++) *(--revpnt)=xtab[0]; */ for(i=0;i<3;i++) *(--revpnt)=xfwd[0]; for(i=0;ishow_base) { *(pnt++)='"'; } parse=(flags&TR_RJUSTIFY)?(newbuff+((nbits+7)&7)):(newbuff+7); cvt_gray(flags,parse,nbits); for(i=0;i 0x7f || !isprint(val)) *pnt++ = '.'; else *pnt++ = val; found=1; } parse+=8; } if (!found && !GLOBALS->show_base) { *(pnt++)='"'; *(pnt++)='"'; } if(GLOBALS->show_base) { *(pnt++)='"'; } *(pnt)=0x00; /* scan build : remove dead increment */ } else if((flags&TR_HEX)||((flags&(TR_DEC|TR_SIGNED))&&(nbits>64)&&(!(flags&TR_POPCNT)))) { char *parse; len=(nbits/4)+2+1; /* $xxxxx */ os=pnt=(char *)calloc_2(1,len); if(GLOBALS->show_base) { *(pnt++)='$'; } parse=(flags&TR_RJUSTIFY)?(newbuff+((nbits+3)&3)):(newbuff+3); cvt_gray(flags,parse,nbits); for(i=0;i= 0) match = 0; break; } } val = (match) ? 16 : 21; break; } else if(parse[j]==AN_Z) { int xover = 0; int match = (j==0) || ((parse + i + j) == (newbuff + 3)); int k; for(k=j+1;k<4;k++) { if(parse[k]!=AN_Z) { if(parse[k]==AN_X) { xover = 1; } else { char *thisbyt = parse + i + k; char *lastbyt = newbuff + 3 + nbits - 1; if((lastbyt - thisbyt) >= 0) match = 0; } break; } } if(xover) val = 21; else val = (match) ? 17 : 22; break; } else if(parse[j]==AN_W) { int xover = 0; int match = (j==0) || ((parse + i + j) == (newbuff + 3)); int k; for(k=j+1;k<4;k++) { if(parse[k]!=AN_W) { if(parse[k]==AN_X) { xover = 1; } else { char *thisbyt = parse + i + k; char *lastbyt = newbuff + 3 + nbits - 1; if((lastbyt - thisbyt) >= 0) match = 0; } break; } } if(xover) val = 21; else val = (match) ? 18 : 23; break; } else if(parse[j]==AN_U) { int xover = 0; int match = (j==0) || ((parse + i + j) == (newbuff + 3)); int k; for(k=j+1;k<4;k++) { if(parse[k]!=AN_U) { if(parse[k]==AN_X) { xover = 1; } else { char *thisbyt = parse + i + k; char *lastbyt = newbuff + 3 + nbits - 1; if((lastbyt - thisbyt) >= 0) match = 0; } break; } } if(xover) val = 21; else val = (match) ? 19 : 24; break; } else if(parse[j]==AN_DASH) { int xover = 0; int k; for(k=j+1;k<4;k++) { if(parse[k]!=AN_DASH) { if(parse[k]==AN_X) { xover = 1; } break; } } if(xover) val = 21; else val = 20; break; } } *(pnt++)=AN_HEX_STR[val]; parse+=4; } *(pnt)=0x00; /* scan build : remove dead increment */ } else if(flags&TR_OCT) { char *parse; len=(nbits/3)+2+1; /* #xxxxx */ os=pnt=(char *)calloc_2(1,len); if(GLOBALS->show_base) { *(pnt++)='#'; } parse=(flags&TR_RJUSTIFY) ?(newbuff+((nbits%3)?(nbits%3):3)) :(newbuff+3); cvt_gray(flags,parse,nbits); for(i=0;ishow_base) { *(pnt++)='%'; } parse=newbuff+3; cvt_gray(flags,parse,nbits); for(i=0;it_fpdecshift)) { cvt_fpsdec(t, val, os, len, nbits); } else { sprintf(os, TTFormat, val); } } else { strcpy(os, "XXX"); } } else if(flags&TR_REAL) { char *parse; if(nbits==64) { UTimeType utt = LLDescriptor(0); double d; parse=newbuff+3; cvt_gray(flags,parse,nbits); for(i=0;ishow_base) { *(pnt++)='%'; } parse=newbuff+3; cvt_gray(flags,parse,nbits); for(i=0;it_fpdecshift)) { cvt_fpsudec(t, val, os, len); } else { sprintf(os, UTTFormat, val); } } else { strcpy(os, "XXX"); } } free_2(newbuff); return(os); } static char *dofilter(Trptr t, char *s) { GLOBALS->xl_file_filter[t->f_filter] = xl_splay(s, GLOBALS->xl_file_filter[t->f_filter]); if(!strcasecmp(s, GLOBALS->xl_file_filter[t->f_filter]->item)) { free_2(s); s = malloc_2(strlen(GLOBALS->xl_file_filter[t->f_filter]->trans) + 1); strcpy(s, GLOBALS->xl_file_filter[t->f_filter]->trans); } if((*s == '?') && (!GLOBALS->color_active_in_filter)) { char *s2a; char *s2 = strchr(s+1, '?'); if(s2) { s2++; s2a = malloc_2(strlen(s2)+1); strcpy(s2a, s2); free_2(s); s = s2a; } } return(s); } static char *pdofilter(Trptr t, char *s) { struct pipe_ctx *p = GLOBALS->proc_filter[t->p_filter]; char buf[1025]; int n; if(p) { #if !defined _MSC_VER && !defined __MINGW32__ fputs(s, p->sout); fputc('\n', p->sout); fflush(p->sout); buf[0] = 0; n = fgets(buf, 1024, p->sin) ? strlen(buf) : 0; buf[n] = 0; #else { BOOL bSuccess; DWORD dwWritten, dwRead; WriteFile(p->g_hChildStd_IN_Wr, s, strlen(s), &dwWritten, NULL); WriteFile(p->g_hChildStd_IN_Wr, "\n", 1, &dwWritten, NULL); for(n=0;n<1024;n++) { do { bSuccess = ReadFile(p->g_hChildStd_OUT_Rd, buf+n, 1, &dwRead, NULL); if((!bSuccess)||(buf[n]=='\n')) { goto ex; } } while(buf[n]=='\r'); } ex: buf[n] = 0; } #endif if(n) { if(buf[n-1] == '\n') { buf[n-1] = 0; n--; } } if(buf[0]) { free_2(s); s = malloc_2(n + 1); strcpy(s, buf); } } if((*s == '?') && (!GLOBALS->color_active_in_filter)) { char *s2a; char *s2 = strchr(s+1, '?'); if(s2) { s2++; s2a = malloc_2(strlen(s2)+1); strcpy(s2a, s2); free_2(s); s = s2a; } } return(s); } char *convert_ascii_vec(Trptr t, char *vec) { char *s = convert_ascii_vec_2(t, vec); if(!(t->f_filter|t->p_filter)) { } else { if(t->f_filter) { s = dofilter(t, s); } else { s = pdofilter(t, s); } } return(s); } char *convert_ascii(Trptr t, vptr v) { char *s; if((!t->t_filter_converted) && (!(v->flags & HIST_STRING))) { s = convert_ascii_2(t, v); } else { s = strdup_2((char *)v->v); if((*s == '?') && (!GLOBALS->color_active_in_filter)) { char *s2a; char *s2 = strchr(s+1, '?'); if(s2) { s2++; s2a = malloc_2(strlen(s2)+1); strcpy(s2a, s2); free_2(s); s = s2a; } } } if(!(t->f_filter|t->p_filter)) { } else { if(t->f_filter) { s = dofilter(t, s); } else { s = pdofilter(t, s); } } return(s); } /* * convert trptr+hptr vectorstring into a real */ double convert_real_vec(Trptr t, char *vec) { Ulong flags; int nbits; char *bits; char *pnt, *newbuff; int i; const char *xtab; double mynan = strtod("NaN", NULL); double retval = mynan; static const char xfwd[AN_COUNT]= AN_NORMAL ; static const char xrev[AN_COUNT]= AN_INVERSE ; flags=t->flags; nbits=t->n.nd->msi-t->n.nd->lsi; if(nbits<0)nbits=-nbits; nbits++; if(vec) { bits=vec; if(*vec>AN_MSK) /* convert as needed */ for(i=0;iflags; nbits=t->n.vec->nbits; bits=v->v; if(flags&TR_INVERT) { xtab = xrev; } else { xtab = xfwd; } newbuff=(char *)malloc_2(nbits+6); /* for justify */ if(flags&TR_REVERSE) { char *fwdpnt, *revpnt; fwdpnt=(char *)bits; revpnt=newbuff+nbits+6; /* for(i=0;i<3;i++) *(--revpnt)=xtab[0]; */ for(i=0;i<3;i++) *(--revpnt)=xfwd[0]; for(i=0;i #include "globals.h" #include "vcd_saver.h" #include "helpers/lxt_write.h" #include "ghw.h" #include "hierpack.h" #include static void w32redirect_fprintf(int is_trans, FILE *sfd, const char *format, ...) { #if defined _MSC_VER || defined __MINGW32__ if(is_trans) { char buf[16385]; BOOL bSuccess; DWORD dwWritten; va_list ap; va_start(ap, format); buf[0] = 0; vsprintf(buf, format, ap); bSuccess = WriteFile((HANDLE)sfd, buf, strlen(buf), &dwWritten, NULL); va_end(ap); } else #else (void) is_trans; #endif { va_list ap; va_start(ap, format); vfprintf(sfd, format, ap); va_end(ap); } } /* * unconvert trace data back to VCD representation...use strict mode for LXT */ static unsigned char analyzer_demang(int strict, unsigned char ch) { if(!strict) { if(ch < AN_COUNT) { return(AN_STR[ch]); } else { return(ch); } } else { if(ch < AN_COUNT) { return(AN_STR4ST[ch]); } else { return(ch); } } } /* * generate a vcd identifier for a given facindx */ static char *vcdid(unsigned int value, int export_typ) { char *pnt = GLOBALS->buf_vcd_saver_c_3; unsigned int vmod; if(export_typ != WAVE_EXPORT_TRANS) { value++; for(;;) { if((vmod = (value % 94))) { *(pnt++) = (char)(vmod + 32); } else { *(pnt++) = '~'; value -= 94; } value = value / 94; if(!value) { break; } } *pnt = 0; } else { sprintf(pnt, "%d", value); } return(GLOBALS->buf_vcd_saver_c_3); } static char *vcd_truncate_bitvec(char *s) { char l, r; r=*s; if(r=='1') { return s; } else { s++; } for(;;s++) { l=r; r=*s; if(!r) return (s-1); if(l!=r) { return(((l=='0')&&(r=='1'))?s:s-1); } } } /************************ splay ************************/ /* * integer splay */ typedef struct vcdsav_tree_node vcdsav_Tree; struct vcdsav_tree_node { vcdsav_Tree * left, * right; nptr item; int val; hptr hist; int len; union { void *p; long l; int i; } handle; /* future expansion for adding other writers that need pnt/handle info */ unsigned char flags; }; static long vcdsav_cmp_l(void *i, void *j) { intptr_t il = (intptr_t)i, jl = (intptr_t)j; return(il - jl); } static vcdsav_Tree * vcdsav_splay (void *i, vcdsav_Tree * t) { /* Simple top down splay, not requiring i to be in the tree t. */ /* What it does is described above. */ vcdsav_Tree N, *l, *r, *y; int dir; if (t == NULL) return t; N.left = N.right = NULL; l = r = &N; for (;;) { dir = vcdsav_cmp_l(i, t->item); if (dir < 0) { if (t->left == NULL) break; if (vcdsav_cmp_l(i, t->left->item)<0) { y = t->left; /* rotate right */ t->left = y->right; y->right = t; t = y; if (t->left == NULL) break; } r->left = t; /* link right */ r = t; t = t->left; } else if (dir > 0) { if (t->right == NULL) break; if (vcdsav_cmp_l(i, t->right->item)>0) { y = t->right; /* rotate left */ t->right = y->left; y->left = t; t = y; if (t->right == NULL) break; } l->right = t; /* link left */ l = t; t = t->right; } else { break; } } l->right = t->left; /* assemble */ r->left = t->right; t->left = N.right; t->right = N.left; return t; } static vcdsav_Tree * vcdsav_insert(void *i, vcdsav_Tree * t, int val, unsigned char flags, hptr h) { /* Insert i into the tree t, unless it's already there. */ /* Return a pointer to the resulting tree. */ vcdsav_Tree * n; int dir; n = (vcdsav_Tree *) calloc_2(1, sizeof (vcdsav_Tree)); if (n == NULL) { fprintf(stderr, "vcdsav_insert: ran out of memory, exiting.\n"); exit(255); } n->item = i; n->val = val; n->flags = flags; n->hist = h; if (t == NULL) { n->left = n->right = NULL; return n; } t = vcdsav_splay(i,t); dir = vcdsav_cmp_l(i,t->item); if (dir<0) { n->left = t->left; n->right = t; t->left = NULL; return n; } else if (dir>0) { n->right = t->right; n->left = t; t->right = NULL; return n; } else { /* We get here if it's already in the tree */ /* Don't add it again */ free_2(n); return t; } } /************************ heap ************************/ static int hpcmp(vcdsav_Tree *hp1, vcdsav_Tree *hp2) { hptr n1 = hp1->hist; hptr n2 = hp2->hist; TimeType t1, t2; if(n1) t1 = n1->time; else t1 = MAX_HISTENT_TIME; if(n2) t2 = n2->time; else t2 = MAX_HISTENT_TIME; if(t1 == t2) { return(0); } else if(t1 > t2) { return(-1); } else { return(1); } } static void recurse_build(vcdsav_Tree *vt, vcdsav_Tree ***hp) { if(vt->left) recurse_build(vt->left, hp); **hp = vt; *hp = (*hp) + 1; if(vt->right) recurse_build(vt->right, hp); } /* * heapify algorithm...used to grab the next value change */ static void heapify(int i, int heap_size) { int l, r; int largest; vcdsav_Tree *t; int maxele=heap_size/2-1; /* points to where heapswaps don't matter anymore */ for(;;) { l=2*i+1; r=l+1; if((lhp_vcd_saver_c_1[l],GLOBALS->hp_vcd_saver_c_1[i])>0)) { largest=l; } else { largest=i; } if((rhp_vcd_saver_c_1[r],GLOBALS->hp_vcd_saver_c_1[largest])>0)) { largest=r; } if(i!=largest) { t=GLOBALS->hp_vcd_saver_c_1[i]; GLOBALS->hp_vcd_saver_c_1[i]=GLOBALS->hp_vcd_saver_c_1[largest]; GLOBALS->hp_vcd_saver_c_1[largest]=t; if(largest<=maxele) { i=largest; } else { break; } } else { break; } } } /* * mainline */ int save_nodes_to_export_generic(FILE *trans_file, Trptr trans_head, const char *fname, int export_typ) { Trptr t = trans_head ? trans_head : GLOBALS->traces.first; int nodecnt = 0; vcdsav_Tree *vt = NULL; vcdsav_Tree **hp_clone = GLOBALS->hp_vcd_saver_c_1; nptr n; /* ExtNode *e; */ /* int msi, lsi; */ int i; TimeType prevtime = LLDescriptor(-1); time_t walltime; struct strace *st = NULL; int strace_append = 0; int max_len = 1; char *row_data = NULL; struct lt_trace *lt = NULL; int lxt = (export_typ == WAVE_EXPORT_LXT); int is_trans = (export_typ == WAVE_EXPORT_TRANS); if(export_typ == WAVE_EXPORT_TIM) { return(do_timfile_save(fname)); } errno = 0; if(lxt) { lt = lt_init(fname); if(!lt) { return(VCDSAV_FILE_ERROR); } } else { if(export_typ != WAVE_EXPORT_TRANS) { GLOBALS->f_vcd_saver_c_1 = fopen(fname, "wb"); } else { if(!trans_head) /* scan-build : is programming error to get here */ { return(VCDSAV_FILE_ERROR); } GLOBALS->f_vcd_saver_c_1 = trans_file; } if(!GLOBALS->f_vcd_saver_c_1) { return(VCDSAV_FILE_ERROR); } } while(t) { if(!t->vector) { if(t->n.nd) { n = t->n.nd; if(n->expansion) n = n->expansion->parent; vt = vcdsav_splay(n, vt); if(!vt || vt->item != n) { unsigned char flags = 0; if(n->head.next) if(n->head.next->next) { flags = n->head.next->next->flags; } vt = vcdsav_insert(n, vt, ++nodecnt, flags, &n->head); } } } else { bvptr b = t->n.vec; if(b) { bptr bt = b->bits; if(bt) { for(i=0;innbits;i++) { if(bt->nodes[i]) { n = bt->nodes[i]; if(n->expansion) n = n->expansion->parent; vt = vcdsav_splay(n, vt); if(!vt || vt->item != n) { unsigned char flags = 0; if(n->head.next) if(n->head.next->next) { flags = n->head.next->next->flags; } vt = vcdsav_insert(n, vt, ++nodecnt, flags, &n->head); } } } } } } if(export_typ == WAVE_EXPORT_TRANS) { break; } if(!strace_append) { t=t->t_next; if(t) continue; } else { st = st->next; t = st ? st->trace : NULL; if(t) { continue; } else { swap_strace_contexts(); } } strace_concat: GLOBALS->strace_ctx = &GLOBALS->strace_windows[GLOBALS->strace_current_window = strace_append]; strace_append++; if(strace_append == WAVE_NUM_STRACE_WINDOWS) break; if(!GLOBALS->strace_ctx->shadow_straces) { goto strace_concat; } swap_strace_contexts(); st = GLOBALS->strace_ctx->straces; t = st ? st->trace : NULL; if(!t) {swap_strace_contexts(); goto strace_concat; } } if(!nodecnt) return(VCDSAV_EMPTY); /* header */ if(lxt) { int dim; lt_set_chg_compress(lt); lt_set_clock_compress(lt); lt_set_initial_value(lt, 'x'); lt_set_time64(lt, 0); lt_symbol_bracket_stripping(lt, 1); switch(GLOBALS->time_dimension) { case 'm': dim = -3; break; case 'u': dim = -6; break; case 'n': dim = -9; break; case 'p': dim = -12; break; case 'f': dim = -15; break; default: dim = 0; break; } lt_set_timescale(lt, dim); } else { if(export_typ != WAVE_EXPORT_TRANS) { time(&walltime); w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$date\n"); w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "\t%s",asctime(localtime(&walltime))); w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$end\n"); w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$version\n\t"WAVE_VERSION_INFO"\n$end\n"); w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$timescale\n\t%d%c%s\n$end\n", (int)GLOBALS->time_scale, GLOBALS->time_dimension, (GLOBALS->time_dimension=='s') ? "" : "s"); if(GLOBALS->global_time_offset) { w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$timezero\n\t"TTFormat"\n$end\n",GLOBALS->global_time_offset); } } else { w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$comment data_start %p $end\n", (void *)trans_head); /* arbitrary hex identifier */ w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$comment name %s $end\n", trans_head->name ? trans_head->name : "UNKNOWN"); w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$timescale %d%c%s $end\n", (int)GLOBALS->time_scale, GLOBALS->time_dimension, (GLOBALS->time_dimension=='s') ? "" : "s"); if(GLOBALS->global_time_offset) { w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$timezero "TTFormat" $end\n",GLOBALS->global_time_offset); } w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$comment min_time "TTFormat" $end\n", GLOBALS->min_time / GLOBALS->time_scale); w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$comment max_time "TTFormat" $end\n", GLOBALS->max_time / GLOBALS->time_scale); } } if(export_typ == WAVE_EXPORT_TRANS) { w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$comment max_seqn %d $end\n", nodecnt); if(t && t->transaction_args) { w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$comment args \"%s\" $end\n", t->transaction_args); } } /* write out netnames here ... */ hp_clone = GLOBALS->hp_vcd_saver_c_1 = calloc_2(nodecnt, sizeof(vcdsav_Tree *)); recurse_build(vt, &hp_clone); for(i=0;ihp_vcd_saver_c_1[i]->item->nname, &was_packed); char *netname = lxt ? hname : output_hier(is_trans, hname); if(export_typ == WAVE_EXPORT_TRANS) { w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$comment seqn %d %s $end\n", GLOBALS->hp_vcd_saver_c_1[i]->val, hname); } if(GLOBALS->hp_vcd_saver_c_1[i]->flags & (HIST_REAL|HIST_STRING)) { if(lxt) { GLOBALS->hp_vcd_saver_c_1[i]->handle.p = lt_symbol_add(lt, netname, 0, 0, 0, GLOBALS->hp_vcd_saver_c_1[i]->flags & HIST_STRING ? LT_SYM_F_STRING : LT_SYM_F_DOUBLE); } else { const char *typ = (GLOBALS->hp_vcd_saver_c_1[i]->flags & HIST_STRING) ? "string" : "real"; int tlen = (GLOBALS->hp_vcd_saver_c_1[i]->flags & HIST_STRING) ? 0 : 1; w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$var %s %d %s %s $end\n", typ, tlen, vcdid(GLOBALS->hp_vcd_saver_c_1[i]->val, export_typ), netname); } } else { int msi = -1, lsi = -1; if(GLOBALS->hp_vcd_saver_c_1[i]->item->extvals) { msi = GLOBALS->hp_vcd_saver_c_1[i]->item->msi; lsi = GLOBALS->hp_vcd_saver_c_1[i]->item->lsi; } if(msi==lsi) { if(lxt) { int strand_idx = strand_pnt(netname); if(strand_idx >= 0) { msi = lsi = atoi(netname + strand_idx + 1); } GLOBALS->hp_vcd_saver_c_1[i]->handle.p = lt_symbol_add(lt, netname, 0, msi, lsi, LT_SYM_F_BITS); } else { w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$var wire 1 %s %s $end\n", vcdid(GLOBALS->hp_vcd_saver_c_1[i]->val, export_typ), netname); } } else { int len = (msi < lsi) ? (lsi - msi + 1) : (msi - lsi + 1); if(lxt) { GLOBALS->hp_vcd_saver_c_1[i]->handle.p = lt_symbol_add(lt, netname, 0, msi, lsi, LT_SYM_F_BITS); } else { w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$var wire %d %s %s $end\n", len, vcdid(GLOBALS->hp_vcd_saver_c_1[i]->val, export_typ), netname); } GLOBALS->hp_vcd_saver_c_1[i]->len = len; if(len > max_len) max_len = len; } } /* if(was_packed) { free_2(hname); } ...not needed for HIER_DEPACK_STATIC */ } row_data = malloc_2(max_len + 1); if(!lxt) { output_hier(is_trans, ""); free_hier(); w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$enddefinitions $end\n"); w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$dumpvars\n"); } /* value changes */ for(i=(nodecnt/2-1);i>0;i--) /* build nodes into having heap property */ { heapify(i,nodecnt); } for(;;) { heapify(0, nodecnt); if(!GLOBALS->hp_vcd_saver_c_1[0]->hist) break; if(GLOBALS->hp_vcd_saver_c_1[0]->hist->time > GLOBALS->max_time) break; if((GLOBALS->hp_vcd_saver_c_1[0]->hist->time != prevtime) && (GLOBALS->hp_vcd_saver_c_1[0]->hist->time >= LLDescriptor(0))) { TimeType tnorm = GLOBALS->hp_vcd_saver_c_1[0]->hist->time; if(GLOBALS->time_scale != 1) { tnorm /= GLOBALS->time_scale; } if(lxt) { lt_set_time64(lt, tnorm); } else { w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "#"TTFormat"\n", tnorm); } prevtime = GLOBALS->hp_vcd_saver_c_1[0]->hist->time; } if(GLOBALS->hp_vcd_saver_c_1[0]->hist->time >= LLDescriptor(0)) { if(GLOBALS->hp_vcd_saver_c_1[0]->flags & (HIST_REAL|HIST_STRING)) { if(GLOBALS->hp_vcd_saver_c_1[0]->flags & HIST_STRING) { char *vec = GLOBALS->hp_vcd_saver_c_1[0]->hist->v.h_vector ? GLOBALS->hp_vcd_saver_c_1[0]->hist->v.h_vector : "UNDEF"; if(lxt) { lt_emit_value_string(lt, GLOBALS->hp_vcd_saver_c_1[0]->handle.p, 0, vec); } else { int vec_slen = strlen(vec); char *vec_escaped = malloc_2(vec_slen*4 + 1); /* worst case */ int vlen = fstUtilityBinToEsc((unsigned char *)vec_escaped, (unsigned char *)vec, vec_slen); vec_escaped[vlen] = 0; if(vlen) { w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "s%s %s\n", vec_escaped, vcdid(GLOBALS->hp_vcd_saver_c_1[0]->val, export_typ)); } else { w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "s\\000 %s\n", vcdid(GLOBALS->hp_vcd_saver_c_1[0]->val, export_typ)); } free_2(vec_escaped); } } else { #ifdef WAVE_HAS_H_DOUBLE double *d = &GLOBALS->hp_vcd_saver_c_1[0]->hist->v.h_double; #else double *d = (double *)GLOBALS->hp_vcd_saver_c_1[0]->hist->v.h_vector; #endif double value; if(!d) { sscanf("NaN", "%lg", &value); } else { value = *d; } if(lxt) { lt_emit_value_double(lt, GLOBALS->hp_vcd_saver_c_1[0]->handle.p, 0, value); } else { w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "r%.16g %s\n", value, vcdid(GLOBALS->hp_vcd_saver_c_1[0]->val, export_typ)); } } } else if(GLOBALS->hp_vcd_saver_c_1[0]->len) { if(GLOBALS->hp_vcd_saver_c_1[0]->hist->v.h_vector) { for(i=0;ihp_vcd_saver_c_1[0]->len;i++) { row_data[i] = analyzer_demang(lxt, GLOBALS->hp_vcd_saver_c_1[0]->hist->v.h_vector[i]); } } else { for(i=0;ihp_vcd_saver_c_1[0]->len;i++) { row_data[i] = 'x'; } } row_data[i] = 0; if(lxt) { lt_emit_value_bit_string(lt, GLOBALS->hp_vcd_saver_c_1[0]->handle.p, 0, row_data); } else { w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "b%s %s\n", vcd_truncate_bitvec(row_data), vcdid(GLOBALS->hp_vcd_saver_c_1[0]->val, export_typ)); } } else { if(lxt) { row_data[0] = analyzer_demang(lxt, GLOBALS->hp_vcd_saver_c_1[0]->hist->v.h_val); row_data[1] = 0; lt_emit_value_bit_string(lt, GLOBALS->hp_vcd_saver_c_1[0]->handle.p, 0, row_data); } else { w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "%c%s\n", analyzer_demang(lxt, GLOBALS->hp_vcd_saver_c_1[0]->hist->v.h_val), vcdid(GLOBALS->hp_vcd_saver_c_1[0]->val, export_typ)); } } } GLOBALS->hp_vcd_saver_c_1[0]->hist = GLOBALS->hp_vcd_saver_c_1[0]->hist->next; } if(prevtime < GLOBALS->max_time) { if(lxt) { lt_set_time64(lt, GLOBALS->max_time / GLOBALS->time_scale); } else { w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "#"TTFormat"\n", GLOBALS->max_time / GLOBALS->time_scale); } } for(i=0;ihp_vcd_saver_c_1[i]); } free_2(GLOBALS->hp_vcd_saver_c_1); GLOBALS->hp_vcd_saver_c_1 = NULL; free_2(row_data); row_data = NULL; if(lxt) { lt_close(lt); lt = NULL; } else { if(export_typ != WAVE_EXPORT_TRANS) { fclose(GLOBALS->f_vcd_saver_c_1); } else { w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$comment data_end %p $end\n", (void *)trans_head); /* arbitrary hex identifier */ #if !defined _MSC_VER && !defined __MINGW32__ fflush(GLOBALS->f_vcd_saver_c_1); #endif } GLOBALS->f_vcd_saver_c_1 = NULL; } return(VCDSAV_OK); } int save_nodes_to_export(const char *fname, int export_typ) { return(save_nodes_to_export_generic(NULL, NULL, fname, export_typ)); } int save_nodes_to_trans(FILE *trans, Trptr t) { return(save_nodes_to_export_generic(trans, t, NULL, WAVE_EXPORT_TRANS)); } /************************ scopenav ************************/ struct namehier { struct namehier *next; char *name; char not_final; }; void free_hier(void) { struct namehier *nhtemp; while(GLOBALS->nhold_vcd_saver_c_1) { nhtemp=GLOBALS->nhold_vcd_saver_c_1->next; free_2(GLOBALS->nhold_vcd_saver_c_1->name); free_2(GLOBALS->nhold_vcd_saver_c_1); GLOBALS->nhold_vcd_saver_c_1=nhtemp; } } /* * navigate up and down the scope hierarchy and * emit the appropriate vcd scope primitives */ static void diff_hier(int is_trans, struct namehier *nh1, struct namehier *nh2) { /* struct namehier *nhtemp; */ /* scan-build */ if(!nh2) { while((nh1)&&(nh1->not_final)) { w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$scope module %s $end\n", nh1->name); nh1=nh1->next; } return; } for(;;) { if((nh1->not_final==0)&&(nh2->not_final==0)) /* both are equal */ { break; } if(nh2->not_final==0) /* old hier is shorter */ { /* nhtemp=nh1; */ /* scan-build */ while((nh1)&&(nh1->not_final)) { w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$scope module %s $end\n", nh1->name); nh1=nh1->next; } break; } if(nh1->not_final==0) /* new hier is shorter */ { /* nhtemp=nh2; */ /* scan-build */ while((nh2)&&(nh2->not_final)) { w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$upscope $end\n"); nh2=nh2->next; } break; } if(strcmp(nh1->name, nh2->name)) { /* nhtemp=nh2; */ /* prune old hier */ /* scan-build */ while((nh2)&&(nh2->not_final)) { w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$upscope $end\n"); nh2=nh2->next; } /* nhtemp=nh1; */ /* add new hier */ /* scan-build */ while((nh1)&&(nh1->not_final)) { w32redirect_fprintf(is_trans, GLOBALS->f_vcd_saver_c_1, "$scope module %s $end\n", nh1->name); nh1=nh1->next; } break; } nh1=nh1->next; nh2=nh2->next; } } /* * output scopedata for a given name if needed, return pointer to name string */ char *output_hier(int is_trans, char *name) { char *pnt, *pnt2; char *s; int len; struct namehier *nh_head=NULL, *nh_curr=NULL, *nhtemp; pnt=pnt2=name; for(;;) { if(*pnt2 == '\\') { while(*pnt2) pnt2++; } else { /* while((*pnt2!='.')&&(*pnt2)) pnt2++; ... does not handle dot at end of name */ while(*pnt2) { if(*pnt2!='.') { pnt2++; continue; } else { if(!*(pnt2+1)) /* if dot is at end of name */ { pnt2++; continue; } else { break; } } } } s=(char *)calloc_2(1,(len=pnt2-pnt)+1); memcpy(s, pnt, len); nhtemp=(struct namehier *)calloc_2(1,sizeof(struct namehier)); nhtemp->name=s; if(!nh_curr) { nh_head=nh_curr=nhtemp; } else { nh_curr->next=nhtemp; nh_curr->not_final=1; nh_curr=nhtemp; } if(!*pnt2) break; pnt=(++pnt2); } diff_hier(is_trans, nh_head, GLOBALS->nhold_vcd_saver_c_1); free_hier(); GLOBALS->nhold_vcd_saver_c_1=nh_head; { char *mti_sv_patch = strstr(nh_curr->name, "]["); /* case is: #implicit-var###VarElem:ram_di[0.0] [63:0] */ if(mti_sv_patch) { char *t = calloc_2(1, strlen(nh_curr->name) + 1 + 1); *mti_sv_patch = 0; sprintf(t, "%s] %s", nh_curr->name, mti_sv_patch+1); free_2(nh_curr->name); nh_curr->name = t; } if((nh_curr->name[0] == '\\') && (nh_curr->name[1] == '#')) { return(nh_curr->name+1); } } return(nh_curr->name); } /****************************************/ /*** ***/ /*** output in timing analyzer format ***/ /*** ***/ /****************************************/ static void write_hptr_trace(Trptr t, int *whichptr, TimeType tmin, TimeType tmax) { nptr n = t->n.nd; hptr *ha = n->harray; int numhist = n->numhist; int i; unsigned char h_val = AN_X; gboolean first; gboolean invert = ((t->flags&TR_INVERT) != 0); int edges = 0; first = TRUE; for(i=0;itime < tmin) { } else if(ha[i]->time > tmax) { break; } else { if((ha[i]->time != tmin) || (!first)) { edges++; } first = FALSE; } } first = TRUE; for(i=0;itime < tmin) { h_val = invert ? AN_USTR_INV[ha[i]->v.h_val] : AN_USTR[ha[i]->v.h_val]; } else if(ha[i]->time > tmax) { break; } else { if(first) { gboolean skip_this = (ha[i]->time == tmin); if(skip_this) { h_val = invert ? AN_USTR_INV[ha[i]->v.h_val] : AN_USTR[ha[i]->v.h_val]; } w32redirect_fprintf(0, GLOBALS->f_vcd_saver_c_1, "Digital_Signal\n" " Position: %d\n" " Height: 24\n" " Space_Above: 24\n" " Name: %s\n" " Start_State: %c\n" " Number_Edges: %d\n" " Rise_Time: 0.2\n" " Fall_Time: 0.2\n", *whichptr, t->name, h_val, edges); first = FALSE; if(skip_this) { continue; } } h_val = invert ? AN_USTR_INV[ha[i]->v.h_val] : AN_USTR[ha[i]->v.h_val]; w32redirect_fprintf(0, GLOBALS->f_vcd_saver_c_1, " Edge: "TTFormat".0 %c\n", ha[i]->time, h_val); } } if(first) { /* need to emit blank trace */ w32redirect_fprintf(0, GLOBALS->f_vcd_saver_c_1, "Digital_Signal\n" " Position: %d\n" " Height: 24\n" " Space_Above: 24\n" " Name: %s\n" " Start_State: %c\n" " Number_Edges: %d\n" " Rise_Time: 10.0\n" " Fall_Time: 10.0\n", *whichptr, t->name, h_val, edges); } (*whichptr)++; } /***/ static void format_value_string(char *s) { char *s_orig = s; if((s)&&(*s)) { gboolean is_all_z = TRUE; gboolean is_all_x = TRUE; while(*s) { if((*s != 'z') && (*s != 'Z')) { is_all_z = FALSE; } if((*s != 'x') && (*s != 'X')) { is_all_x = FALSE; } /* if(isspace(*s)) *s='_'; ...not needed */ s++; } if(is_all_z) { *(s_orig++) = 'Z'; *(s_orig) = 0; } else if(is_all_x) { *(s_orig++) = 'X'; *(s_orig) = 0; } } } static char *get_hptr_vector_val(Trptr t, hptr h) { char *ascii = NULL; if(h->time < LLDescriptor(0)) { ascii=strdup_2("X"); } else if(h->flags&HIST_REAL) { if(!(h->flags&HIST_STRING)) { #ifdef WAVE_HAS_H_DOUBLE ascii=convert_ascii_real(t, &h->v.h_double); #else ascii=convert_ascii_real(t, (double *)h->v.h_vector); #endif } else { ascii=convert_ascii_string((char *)h->v.h_vector); } } else { ascii=convert_ascii_vec(t,h->v.h_vector); } format_value_string(ascii); return(ascii); } static const char *vcdsav_dtypes[] = { "Bin", "Hex", "Text" }; static int determine_trace_data_type(char *s, int curtype) { int i; if((s) && (curtype != VCDSAV_IS_TEXT)) { int len = strlen(s); for(i=0;in.nd; hptr *ha = n->harray; int numhist = n->numhist; int i; char *h_val = NULL; gboolean first; int edges = 0; int curtype = VCDSAV_IS_BIN; first = TRUE; for(i=0;itime < tmin) { } else if(ha[i]->time > tmax) { break; } else { char *s = get_hptr_vector_val(t, ha[i]); if(s) { curtype = determine_trace_data_type(s, curtype); free_2(s); } if((ha[i]->time != tmin) || (!first)) { edges++; } first = FALSE; } } first = TRUE; for(i=0;itime < tmin) { if(h_val) free_2(h_val); h_val = get_hptr_vector_val(t, ha[i]); } else if(ha[i]->time > tmax) { break; } else { if(first) { gboolean skip_this = (ha[i]->time == tmin); if(skip_this) { if(h_val) free_2(h_val); h_val = get_hptr_vector_val(t, ha[i]); } w32redirect_fprintf(0, GLOBALS->f_vcd_saver_c_1, "Digital_Bus\n" " Position: %d\n" " Height: 24\n" " Space_Above: 24\n" " Name: %s\n" " Start_State: %s\n" " State_Format: %s\n" " Number_Edges: %d\n" " Rise_Time: 0.2\n" " Fall_Time: 0.2\n", *whichptr, t->name, h_val, vcdsav_dtypes[curtype], edges); first = FALSE; if(skip_this) { continue; } } if(h_val) free_2(h_val); h_val = get_hptr_vector_val(t, ha[i]); w32redirect_fprintf(0, GLOBALS->f_vcd_saver_c_1, " Edge: "TTFormat".0 %s\n", ha[i]->time, h_val); } } if(first) { /* need to emit blank trace */ w32redirect_fprintf(0, GLOBALS->f_vcd_saver_c_1, "Digital_Bus\n" " Position: %d\n" " Height: 24\n" " Space_Above: 24\n" " Name: %s\n" " Start_State: %s\n" " State_Format: %s\n" " Number_Edges: %d\n" " Rise_Time: 10.0\n" " Fall_Time: 10.0\n", *whichptr, t->name, h_val, vcdsav_dtypes[curtype], edges); } if(h_val) free_2(h_val); (*whichptr)++; } /***/ static char *get_vptr_vector_val(Trptr t, vptr v) { char *ascii = NULL; if(v->time < LLDescriptor(0)) { ascii=strdup_2("X"); } else { ascii=convert_ascii(t,v); } if(!ascii) { ascii=strdup_2("X"); } format_value_string(ascii); return(ascii); } static void write_vptr_trace(Trptr t, int *whichptr, TimeType tmin, TimeType tmax) { vptr *ha = t->n.vec->vectors; int numhist = t->n.vec->numregions; int i; char *h_val = NULL; gboolean first; int edges = 0; int curtype = VCDSAV_IS_BIN; first = TRUE; for(i=0;itime < tmin) { } else if(ha[i]->time > tmax) { break; } else { char *s = get_vptr_vector_val(t, ha[i]); if(s) { curtype = determine_trace_data_type(s, curtype); free_2(s); } if((ha[i]->time != tmin) || (!first)) { edges++; } first = FALSE; } } first = TRUE; for(i=0;itime < tmin) { if(h_val) free_2(h_val); h_val = get_vptr_vector_val(t, ha[i]); } else if(ha[i]->time > tmax) { break; } else { if(first) { gboolean skip_this = (ha[i]->time == tmin); if(skip_this) { if(h_val) free_2(h_val); h_val = get_vptr_vector_val(t, ha[i]); } w32redirect_fprintf(0, GLOBALS->f_vcd_saver_c_1, "Digital_Bus\n" " Position: %d\n" " Height: 24\n" " Space_Above: 24\n" " Name: %s\n" " Start_State: %s\n" " State_Format: %s\n" " Number_Edges: %d\n" " Rise_Time: 0.2\n" " Fall_Time: 0.2\n", *whichptr, t->name, h_val, vcdsav_dtypes[curtype], edges); first = FALSE; if(skip_this) { continue; } } if(h_val) free_2(h_val); h_val = get_vptr_vector_val(t, ha[i]); w32redirect_fprintf(0, GLOBALS->f_vcd_saver_c_1, " Edge: "TTFormat".0 %s\n", ha[i]->time, h_val); } } if(first) { /* need to emit blank trace */ w32redirect_fprintf(0, GLOBALS->f_vcd_saver_c_1, "Digital_Bus\n" " Position: %d\n" " Height: 24\n" " Space_Above: 24\n" " Name: %s\n" " Start_State: %s\n" " State_Format: %s\n" " Number_Edges: %d\n" " Rise_Time: 10.0\n" " Fall_Time: 10.0\n", *whichptr, t->name, h_val, vcdsav_dtypes[curtype], edges); } if(h_val) free_2(h_val); (*whichptr)++; } static void write_tim_tracedata(Trptr t, int *whichptr, TimeType tmin, TimeType tmax) { if(!(t->flags&(TR_EXCLUDE|TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { GLOBALS->shift_timebase=t->shift; if(!t->vector) { if(!t->n.nd->extvals) { write_hptr_trace(t, whichptr, tmin, tmax); /* single-bit */ } else { write_hptr_trace_vector(t, whichptr, tmin, tmax); /* multi-bit */ } } else { write_vptr_trace(t, whichptr, tmin, tmax); /* synthesized/concatenated vector */ } } } int do_timfile_save(const char *fname) { const char *time_prefix=WAVE_SI_UNITS; const double negpow[] = { 1.0, 1.0e-3, 1.0e-6, 1.0e-9, 1.0e-12, 1.0e-15, 1.0e-18, 1.0e-21 }; char *pnt; int offset; Trptr t = GLOBALS->traces.first; int i = 1; /* trace index in the .tim file */ TimeType tmin, tmax; errno = 0; if((GLOBALS->tims.marker > LLDescriptor(0)) && (GLOBALS->tims.baseline > LLDescriptor(0))) { if(GLOBALS->tims.marker < GLOBALS->tims.baseline) { tmin = GLOBALS->tims.marker; tmax = GLOBALS->tims.baseline; } else { tmax = GLOBALS->tims.marker; tmin = GLOBALS->tims.baseline; } } else { tmin = GLOBALS->min_time; tmax = GLOBALS->max_time; } GLOBALS->f_vcd_saver_c_1 = fopen(fname, "wb"); if(!GLOBALS->f_vcd_saver_c_1) { return(VCDSAV_FILE_ERROR); } pnt=strchr(time_prefix, (int)GLOBALS->time_dimension); if(pnt) { offset=pnt-time_prefix; } else offset=0; w32redirect_fprintf(0, GLOBALS->f_vcd_saver_c_1, "Timing Analyzer Settings\n" " Time_Scale: %E\n" " Time_Per_Division: %E\n" " NumberDivisions: 10\n" " Start_Time: "TTFormat".0\n" " End_Time: "TTFormat".0\n", negpow[offset], (tmax-tmin) / 10.0, tmin, tmax ); while(t) { write_tim_tracedata(t, &i, tmin, tmax); t = GiveNextTrace(t); } fclose(GLOBALS->f_vcd_saver_c_1); GLOBALS->f_vcd_saver_c_1 = NULL; return(errno ? VCDSAV_FILE_ERROR : VCDSAV_OK); } gtkwave-3.3.86/src/bsearch.h0000664000175000017500000000124413166335473015154 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999. * * 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. */ #include "globals.h" #ifndef BSEARCH_NODES_VECTORS_H #define BSEARCH_NODES_VECTORS_H int bsearch_timechain(TimeType key); int bsearch_aetinfo_timechain(TimeType key); hptr bsearch_node(nptr n, TimeType key); vptr bsearch_vector(bvptr b, TimeType key); char *bsearch_trunc(char *ascii, int maxlen); struct symbol *bsearch_facs(char *ascii, unsigned int *rows_return); #endif gtkwave-3.3.86/src/tcl_np.c0000664000175000017500000004762513166335473015034 0ustar bybellbybell/* * Copyright (c) 2003-2005 Active State Corporation. * See the file LICENSE.TXT for information on usage and redistribution * and for a DISCLAIMER OF ALL WARRANTIES. */ #include #include "globals.h" #include #include #include #include #include "debug.h" #include "tcl_np.h" #include "tcl_helper.h" #if !defined __MINGW32__ && !defined _MSC_VER #include #include #endif #ifdef HAVE_LIBTCL /* ======== Np... Begin */ #ifndef LIB_RUNTIME_DIR # define LIB_RUNTIME_DIR "" #endif # define XP_UNIX 1 /* * Default directory in which to look for Tcl libraries. The * symbol is defined by Makefile. */ static char defaultLibraryDir[sizeof(LIB_RUNTIME_DIR)+200] = LIB_RUNTIME_DIR; #ifdef WIN32 /* #include "shlwapi.h" */ # ifndef TCL_LIB_FILE # define TCL_LIB_FILE "tcl85.dll" # endif /* * Reference to ourselves */ static HINSTANCE nptclInst = NULL; /* *---------------------------------------------------------------------- * * NpLoadLibrary -- * * * Results: * None. * * Side effects: * None. * *---------------------------------------------------------------------- */ /* me :: path to the current executable */ extern int NpLoadLibrary(HMODULE *tclHandle, char *dllName, int dllNameSize, char *me) { char *envdll, libname[MAX_PATH]; HMODULE handle = (HMODULE) NULL; char path[MAX_PATH], *p ; /* #include */ /* #include */ if( !GetModuleFileName(NULL, path, MAX_PATH) ) { printf("GetModuleFileName() failed\n") ; } else { if((p = strrchr(path,'\\'))) { *(++p) = '\0' ; sprintf(libname, "%s\\tcl%d%d.dll", path, TCL_MAJOR_VERSION, TCL_MINOR_VERSION) ; NpLog("Attempt to load from executable directory '%s'\n", libname) ; if(!(handle = LoadLibrary(libname))) { sprintf(libname, "%s..\\lib\\tcl%d%d.dll", path, TCL_MAJOR_VERSION, TCL_MINOR_VERSION) ; NpLog("Attempt to load from relative lib directory '%s'\n", libname) ; handle = LoadLibrary(libname) ; } } } /* * Try a user-supplied Tcl dll to start with. */ if(!handle) { envdll = getenv("TCL_PLUGIN_DLL"); if (envdll != NULL) { NpLog("Attempt to load Tcl dll (TCL_PLUGIN_DLL) '%s'\n", envdll); handle = LoadLibrary(envdll); if (handle) { memcpy(libname, envdll, MAX_PATH); } } } if (!handle) { /* * Try based on full path. */ snprintf(libname, MAX_PATH, "%stcl%d%d.dll", defaultLibraryDir, TCL_MAJOR_VERSION, TCL_MINOR_VERSION); NpLog("Attempt to load Tcl dll (default) '%s'\n", libname); handle = LoadLibrary(libname); } if (!handle) { /* * Try based on anywhere in the path. */ snprintf(libname, MAX_PATH, "tcl%d%d.dll", TCL_MAJOR_VERSION, TCL_MINOR_VERSION); NpLog("Attempt to load Tcl dll (libpath) '%s'\n", libname); handle = LoadLibrary(libname); } if (!handle) { /* * Try based on ActiveTcl registry entry */ char path[MAX_PATH], vers[MAX_PATH]; DWORD result, size = MAX_PATH; HKEY regKey; # define TCL_REG_DIR_KEY "Software\\ActiveState\\ActiveTcl" result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TCL_REG_DIR_KEY, 0, KEY_READ, ®Key); if (result != ERROR_SUCCESS) { NpLog("Could not access registry \"HKLM\\%s\"\n", TCL_REG_DIR_KEY); result = RegOpenKeyEx(HKEY_CURRENT_USER, TCL_REG_DIR_KEY, 0, KEY_READ, ®Key); if (result != ERROR_SUCCESS) { NpLog("Could not access registry \"HKCU\\%s\"\n", TCL_REG_DIR_KEY); return TCL_ERROR; } } result = RegQueryValueEx(regKey, "CurrentVersion", NULL, NULL, vers, &size); RegCloseKey(regKey); if (result != ERROR_SUCCESS) { NpLog("Could not access registry \"%s\" CurrentVersion\n", TCL_REG_DIR_KEY); return TCL_ERROR; } snprintf(path, MAX_PATH, "%s\\%s", TCL_REG_DIR_KEY, vers); result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0, KEY_READ, ®Key); if (result != ERROR_SUCCESS) { NpLog("Could not access registry \"%s\"\n", path); return TCL_ERROR; } size = MAX_PATH; result = RegQueryValueEx(regKey, NULL, NULL, NULL, path, &size); RegCloseKey(regKey); if (result != ERROR_SUCCESS) { NpLog("Could not access registry \"%s\" Default\n", TCL_REG_DIR_KEY); return TCL_ERROR; } NpLog("Found current Tcl installation at \"%s\"\n", path); snprintf(libname, MAX_PATH, "%s\\bin\\tcl%d%d.dll", path, TCL_MAJOR_VERSION, TCL_MINOR_VERSION); NpLog("Attempt to load Tcl dll (registry) '%s'\n", libname); handle = LoadLibrary(libname); } if (!handle) { NpLog("NpLoadLibrary: could not find dll '%s'\n", libname); return TCL_ERROR; } *tclHandle = handle; if (dllNameSize > 0) { /* * Use GetModuleFileName to ensure that we have a fully-qualified * path, no matter which route above succeeded. */ if (!GetModuleFileNameA(handle, dllName, dllNameSize)) { int length; char *msgPtr; DWORD code = GetLastError(); length = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (char *) &msgPtr, 0, NULL); NpLog3("GetModuleFileNameA ERROR: %d (%s)\n", code, ((length == 0) ? "unknown error" : msgPtr)); if (length > 0) { LocalFree(msgPtr); } } } return TCL_OK; } /* * DLL entry point */ BOOL WINAPI DllMain(HINSTANCE hDLL, DWORD dwReason, LPVOID lpReserved) { switch (dwReason) { case DLL_PROCESS_ATTACH: nptclInst = hDLL; break; case DLL_PROCESS_DETACH: nptclInst = NULL; break; } return TRUE; } #else /* !WIN32 */ # include # ifndef TCL_LIB_FILE # define TCL_LIB_FILE "libtcl" TCL_VERSION SHLIB_SUFFIX # endif # ifndef TCL_KIT_DLL # define TCL_KIT_DLL "tclplugin" SHLIB_SUFFIX # endif /* * In some systems, like SunOS 4.1.3, the RTLD_NOW flag isn't defined * and this argument to dlopen must always be 1. The RTLD_GLOBAL * flag is needed on some systems (e.g. SCO and UnixWare) but doesn't * exist on others; if it doesn't exist, set it to 0 so it has no effect. */ /* *---------------------------------------------------------------------- * NpMyDirectoryPath -- * * Results: * Full directory path to the current executable or NULL *---------------------------------------------------------------------- */ char *NpMyDirectoryPath(char *path, int path_max_len) { int length; char *p ; length = readlink("/proc/self/exe", path, path_max_len); if ((length < 0) || (length >= path_max_len)) { fprintf(stderr, "Error while looking for executable path.\n"); path = NULL ; } else { path[length] = '\0'; /* Strip '@' off the end. */ } if(path) { if((p = strrchr(path, '/'))) *p = '\0' ; else path = NULL ; } return path ; } # ifndef RTLD_NOW # define RTLD_NOW 1 # endif # ifndef RTLD_GLOBAL # define RTLD_GLOBAL 0 # endif /* *---------------------------------------------------------------------- * * NpLoadLibrary -- * * * Results: * None. * * Side effects: * None. * *---------------------------------------------------------------------- */ EXTERN int NpLoadLibrary(HMODULE *tclHandle, char *dllName, int dllNameSize, char *me) { char *envdll, libname[MAX_PATH]; HMODULE handle = (HMODULE) NULL; char path[MAX_PATH], *p ; *tclHandle = NULL; if(me) strcpy(path, me) ; if(me && (p = strrchr(path,'/'))) { *(++p) = '\0' ; sprintf(libname, "%s%s", path, TCL_LIB_FILE) ; NpLog("Attempt to load from executable directory '%s'\n", libname) ; if(!(handle = dlopen(libname, RTLD_NOW | RTLD_GLOBAL))) { sprintf(libname, "%s../lib/%s", path, TCL_LIB_FILE) ; NpLog("Attempt to load from relative lib directory '%s'\n", libname) ; handle = dlopen(libname, RTLD_NOW | RTLD_GLOBAL) ; } } else { handle = NULL ; } /* * Try a user-supplied Tcl dll to start with. */ if(!handle) { envdll = getenv("TCL_PLUGIN_DLL"); if (envdll != NULL) { NpLog("Attempt to load Tcl dll (TCL_PLUGIN_DLL) '%s'\n", envdll); handle = dlopen(envdll, RTLD_NOW | RTLD_GLOBAL); if (handle) { memcpy(libname, envdll, MAX_PATH); } } } if (!handle) { /* * Try based on full path. */ snprintf(libname, MAX_PATH, "%s%s", defaultLibraryDir, TCL_LIB_FILE); NpLog("Attempt to load Tcl dll (default) '%s'\n", libname); handle = dlopen(libname, RTLD_NOW | RTLD_GLOBAL); } if (!handle) { /* * Try based on anywhere in the path. */ strncpy(libname, TCL_LIB_FILE, MAX_PATH); NpLog("Attempt to load Tcl dll (libpath) '%s'\n", libname); handle = dlopen(libname, RTLD_NOW | RTLD_GLOBAL); } if (!handle) { /* * Try different versions anywhere in the path. */ char *pos; pos = strstr(libname, "tcl")+4; if (*pos == '.') { pos++; } *pos = '9'; /* count down from '8' to '4'*/ while (!handle && (--*pos > '3')) { NpLog("Attempt to load Tcl dll (default_ver) '%s'\n", libname); handle = dlopen(libname, RTLD_NOW | RTLD_GLOBAL); } } if (!handle) { NpPlatformMsg("Failed to load Tcl dll!", "NpCreateMainInterp"); return TCL_ERROR; } *tclHandle = handle; if (dllNameSize > 0) { # ifdef HAVE_DLADDR /* * Use dladdr if possible to get the real libname we are loading. * Grab any symbol - we just need one for reverse mapping */ int (* tcl_Init)(Tcl_Interp *) = (int (*)(Tcl_Interp *)) dlsym(handle, "Tcl_Init"); Dl_info info; if (tcl_Init && dladdr(tcl_Init, &info)) { NpLog3("using dladdr '%s' => '%s'\n", libname, info.dli_fname); snprintf(dllName, dllNameSize, "%s", info.dli_fname); /* format arg was missing */ } else # endif snprintf(dllName, dllNameSize, "%s", libname); /* format arg was missing */ } return TCL_OK; } #endif /* !WIN32 */ /* **** Cinterp */ /* * Static variables in this file: */ static char dllName[MAX_PATH] = ""; #if defined(WIN32) || defined(USE_TCL_STUBS) static HMODULE tclHandle = NULL; /* should be the same in any thread */ static int tclHandleCnt = 0; /* only close on last count */ static int (* tcl_createThread)(Tcl_ThreadId *, Tcl_ThreadCreateProc, ClientData, int, int) = NULL; #endif static Tcl_Interp * (* tcl_createInterp)(void) = NULL; static void (* tcl_findExecutable)(const char *) = NULL; /* * We want the Tcl_InitStubs func static to ourselves - before Tcl * is loaded dynamically and possibly changes it. */ #ifdef USE_TCL_STUBS static CONST char *(* tcl_initStubs)(Tcl_Interp *, CONST char *, int) = Tcl_InitStubs; #endif /* * We possibly have per-thread interpreters, as well as one constant, global * main intepreter. The main interpreter runs from NP_Initialize to * NP_Shutdown. tsd interps are used for each instance, but the main * interpreter will be used if it is in the same thread. * * XXX [hobbs]: While we have made some efforts to allow for multi-thread * safety, this is not currently in use. Firefox (up to 1.5) runs all plugin * instances in one thread, and we have requested the same from the * accompanying pluginhostctrl ActiveX control. The threading bits here are * mostly functional, but require marshalling via a master thread to guarantee * fully thread-safe operation. */ typedef struct ThreadSpecificData { Tcl_Interp *interp; } ThreadSpecificData; static Tcl_ThreadDataKey dataKey; static Tcl_Interp *mainInterp = NULL; /* *---------------------------------------------------------------------- * * NpInitInterp -- * * Initializes a main or instance interpreter. * * Results: * A standard Tcl error code. * * Side effects: * Initializes the interp. * *---------------------------------------------------------------------- */ int NpInitInterp(Tcl_Interp *interp, int install_tk) { Tcl_Preserve((ClientData) interp); /* * Set sharedlib in interp while we are here. This will be used to * base the location of the default pluginX.Y package in the stardll * usage scenario. */ if (Tcl_SetVar2(interp, "plugin", "sharedlib", dllName, TCL_GLOBAL_ONLY) == NULL) { NpPlatformMsg("Failed to set plugin(sharedlib)!", "NpInitInterp"); return TCL_ERROR; } /* * The plugin doesn't directly call Tk C APIs - it's all managed at * the Tcl level, so we can just pkg req Tk here instead of calling * Tk_InitStubs. */ if (TCL_OK != Tcl_Init(interp)) { CONST char *msg = Tcl_GetVar(interp, "errorInfo", TCL_GLOBAL_ONLY); fprintf(stderr, "GTKWAVE | Tcl_Init error: %s\n", msg) ; exit(EXIT_FAILURE); } if (install_tk) { NpLog("Tcl_PkgRequire(\"Tk\", \"%s\", 0)\n", TK_VERSION); if (1 && Tcl_PkgRequire(interp, "Tk", TK_VERSION, 0) == NULL) { CONST char *msg = Tcl_GetVar(interp, "errorInfo", TCL_GLOBAL_ONLY); NpPlatformMsg(msg, "NpInitInterp Tcl_PkgRequire(Tk)"); NpPlatformMsg("Failed to create initialize Tk", "NpInitInterp"); return TCL_ERROR; } } return TCL_OK; } /* *---------------------------------------------------------------------- * * NpCreateMainInterp -- * * Create the main interpreter. * * Results: * The pointer to the main interpreter. * * Side effects: * Will panic if called twice. (Must call DestroyMainInterp in between) * *---------------------------------------------------------------------- */ Tcl_Interp *NpCreateMainInterp(char *me, int install_tk) { (void)me; ThreadSpecificData *tsdPtr; Tcl_Interp *interp; #ifdef USE_TCL_STUBS /* * Determine the libname and version number dynamically */ if (tclHandle == NULL) { /* * First see if some other part didn't already load Tcl. */ /* DLSYM(tclHandle, "Tcl_CreateInterp", Tcl_Interp * (*)(), tcl_createInterp); */ if ((tcl_createInterp == NULL) && (NpLoadLibrary(&tclHandle, dllName, MAX_PATH, me) != TCL_OK)) { NpPlatformMsg("Failed to load Tcl dll!", "NpCreateMainInterp"); return NULL; } NpLog("NpCreateMainInterp: Using dll '%s'\n", dllName); tclHandleCnt++; DLSYM(tclHandle, "Tcl_CreateInterp", Tcl_Interp * (*)(), tcl_createInterp); if (tcl_createInterp == NULL) { #ifndef WIN32 char *error = dlerror(); if (error != NULL) { NpPlatformMsg(error, "NpCreateMainInterp"); } #endif return NULL; } DLSYM(tclHandle, "Tcl_CreateThread", int (*)(Tcl_ThreadId *, Tcl_ThreadCreateProc, ClientData, int, int), tcl_createThread); DLSYM(tclHandle, "Tcl_FindExecutable", void (*)(const char *), tcl_findExecutable); } else { tclHandleCnt++; } #else tcl_createInterp = Tcl_CreateInterp; tcl_findExecutable = Tcl_FindExecutable; #endif if (dllName[0] == '\0') { #ifdef WIN32 GetModuleFileNameA((HINSTANCE) tclHandle, dllName, MAX_PATH); #elif defined(HAVE_DLADDR) Dl_info info; if (dladdr(tcl_createInterp, &info)) { NpLog3("NpCreateMainInterp: using dladdr '%s' => '%s'\n", dllName, info.dli_fname); snprintf(dllName, MAX_PATH, info.dli_fname); } #endif } NpLog("Tcl_FindExecutable(%s)\n", dllName); tcl_findExecutable((dllName[0] == '\0') ? NULL : dllName); /* * We do not operate in a fully threaded environment. The ActiveX * control is set for pure single-apartment threading and Firefox runs * that way by default. Otherwise we would have to create a thread for * the main/master and marshall calls through it. * Tcl_CreateThread(&tid, ThreadCreateProc, clientData, * TCL_THREAD_STACK_DEFAULT, TCL_THREAD_JOINABLE); */ interp = tcl_createInterp(); if (interp == (Tcl_Interp *) NULL) { NpPlatformMsg("Failed to create main interpreter!", "NpCreateMainInterp"); return NULL; } /* * Until Tcl_InitStubs is called, we cannot make any Tcl API * calls without grabbing them by symbol out of the dll. * This will be Tcl_PkgRequire for non-stubs builds. */ #ifdef USE_TCL_STUBS NpLog("Tcl_InitStubs(%p)\n", (void *)interp); if (tcl_initStubs(interp, TCL_VERSION, 0) == NULL) { NpPlatformMsg("Failed to create initialize Tcl stubs!", "NpCreateMainInterp"); return NULL; } #endif /* * From now until shutdown we need this interp alive, hence we * preserve it here and release it at NpDestroyInterp time. */ tsdPtr = TCL_TSD_INIT(&dataKey); tsdPtr->interp = interp; mainInterp = interp; if (NpInitInterp(interp, install_tk) != TCL_OK) { return NULL; } return interp; } /* *---------------------------------------------------------------------- * * NpGetMainInterp -- * * Gets the main interpreter. It must exist or we panic. * * Results: * The main interpreter. * * Side effects: * None. * *---------------------------------------------------------------------- */ Tcl_Interp *NpGetMainInterp() { if (mainInterp == NULL) { NpPanic("BUG: Main interpreter does not exist"); } return mainInterp; } /* *---------------------------------------------------------------------- * * NpDestroyMainInterp -- * * Destroys the main interpreter and performs cleanup actions. * * Results: * None. * * Side effects: * Destroys the main interpreter and unloads Tcl. * *---------------------------------------------------------------------- */ void NpDestroyMainInterp() { /* * We are not going to use the main interpreter after this point * because this may be the last call from the browser. * Could possibly do this as a ThreadExitHandler, but that seems to * have race/order issues for reload in Firefox. */ if (mainInterp) { ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); NpLog("Tcl_DeleteInterp(%p) MAIN\n", (void *)mainInterp); Tcl_DeleteInterp(mainInterp); Tcl_Release((ClientData) mainInterp); tsdPtr->interp = mainInterp = (Tcl_Interp *) NULL; } /* * We are done using Tcl, so call Tcl_Finalize to get it to unload * cleanly. With stubs, we need to handle dll finalization. */ #ifdef USE_TCL_STUBS tclHandleCnt--; if (tclHandle && tclHandleCnt <= 0) { Tcl_Finalize(); dlclose(tclHandle); tclHandle = NULL; } else { Tcl_ExitThread(0); } #else Tcl_Finalize(); #endif } /* *---------------------------------------------------------------------- * * NpGetInstanceInterp -- * * Gets an instance interpreter. If one doesn't exist, make a new one. * * Results: * The main interpreter. * * Side effects: * None. * *---------------------------------------------------------------------- */ Tcl_Interp *NpGetInstanceInterp(int install_tk) { ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); Tcl_Interp *interp; if (tsdPtr->interp != NULL) { NpLog("NpGetInstanceInterp - use main interp %p\n", (void *)tsdPtr->interp); return tsdPtr->interp; } interp = Tcl_CreateInterp(); NpLog("NpGetInstanceInterp - create interp %p\n", (void *)interp); if (NpInitInterp(interp, install_tk) != TCL_OK) { NpLog("NpGetInstanceInterp: NpInitInterp(%p) != TCL_OK\n", (void *)interp); return NULL; } /* * We rely on NpInit to inform the user if initialization failed. */ #ifdef nodef if (NpInit(interp) != TCL_OK) { NpLog("NpGetInstanceInterp: NpInit(%p) != TCL_OK\n", (void *)interp); return NULL; } #endif return interp; } /* *---------------------------------------------------------------------- * * NpDestroyInstanceInterp -- * * Destroys an instance interpreter and performs cleanup actions. * * Results: * None. * * Side effects: * Destroys the main interpreter and unloads Tcl. * *---------------------------------------------------------------------- */ void NpDestroyInstanceInterp(Tcl_Interp *interp) { ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); if (tsdPtr->interp == interp) { NpLog("NpDestroyInstanceInterp(%p) - using main interp\n", (void *)interp); return; } NpLog("Tcl_DeleteInterp(%p) INSTANCE\n", (void *)interp); Tcl_DeleteInterp(interp); Tcl_Release((ClientData) interp); } /* ======== Np... End */ #else static void dummy_compilation_unit(void) { } #endif gtkwave-3.3.86/src/baseconvert.h0000664000175000017500000000131513166335473016057 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010 * * 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. */ #ifndef WAVE_BASECONVERT_H #define WAVE_BASECONVERT_H char *convert_ascii(Trptr t, vptr v); char *convert_ascii_vec(Trptr t, char *vec); char *convert_ascii_real(Trptr t, double *d); char *convert_ascii_string(char *s); char *convert_ascii_vec_2(Trptr t, char *vec); double convert_real_vec(Trptr t, char *vec); double convert_real(Trptr t, vptr v); int vtype(Trptr t, char *vec); int vtype2(Trptr t, vptr v); #endif gtkwave-3.3.86/src/tcl_helper.c0000664000175000017500000023523613166335473015673 0ustar bybellbybell/* * Copyright (c) Tony Bybell and Concept Engineering GmbH 2008-2016. * * 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. */ #include #include "globals.h" #include #include #if WAVE_USE_GTK2 #include #endif #include #include #include #include #include #include "gtk12compat.h" #include "analyzer.h" #include "tree.h" #include "symbol.h" #include "vcd.h" #include "lx2.h" #include "busy.h" #include "debug.h" #include "hierpack.h" #include "menu.h" #include "tcl_helper.h" #include "tcl_np.h" #if !defined __MINGW32__ && !defined _MSC_VER #include #include #endif #ifdef _MSC_VER #define strcasecmp _stricmp #endif #if (defined(__MACH__) && defined(__APPLE__)) #include #endif /*---------------------------------------------------------------------- * tclBackslash -- Figure out how to handle a backslash sequence in tcl list. * * Results: * The return value is the character that should be substituted * in place of the backslash sequence that starts at src. If * readPtr isn't NULL then it is filled in with a count of the * number of characters in the backslash sequence. *---------------------------------------------------------------------- */ static char tclBackslash(const char* src, int* readPtr) { const char* p = src+1; char result; int count = 2; switch (*p) { /* * Note: in the conversions below, use absolute values (e.g., * 0xa) rather than symbolic values (e.g. \n) that get converted * by the compiler. It's possible that compilers on some * platforms will do the symbolic conversions differently, which * could result in non-portable Tcl scripts. */ case 'a': result = 0x7; break; case 'b': result = 0x8; break; case 'f': result = 0xc; break; case 'n': result = 0xa; break; case 'r': result = 0xd; break; case 't': result = 0x9; break; case 'v': result = 0xb; break; case 'x': if (isxdigit((int)(unsigned char)p[1])) { char* end; result = (char)strtoul(p+1, &end, 16); count = end - src; } else { count = 2; result = 'x'; } break; case '\n': do { p++; } while ((*p == ' ') || (*p == '\t')); result = ' '; count = p - src; break; case 0: result = '\\'; count = 1; break; default: /* Check for an octal number \oo?o? */ if (isdigit((int)(unsigned char)*p)) { result = *p - '0'; p++; if (!isdigit((int)(unsigned char)*p)) break; count = 3; result = (result << 3) + (*p - '0'); p++; if (!isdigit((int)(unsigned char)*p)) break; count = 4; result = (result << 3) + (*p - '0'); break; } result = *p; count = 2; break; } if (readPtr) *readPtr = count; return result; } /*---------------------------------------------------------------------- * tclFindElement -- locate the first (or next) element in the list. * * Results: * The return value is normally 1 (OK), which means that the * element was successfully located. If 0 (ERROR) is returned * it means that list didn't have proper tcl list structure * (no detailed error message). * * If 1 (OK) is returned, then *elementPtr will be set to point * to the first element of list, and *nextPtr will be set to point * to the character just after any white space following the last * character that's part of the element. If this is the last argument * in the list, then *nextPtr will point to the NULL character at the * end of list. If sizePtr is non-NULL, *sizePtr is filled in with * the number of characters in the element. If the element is in * braces, then *elementPtr will point to the character after the * opening brace and *sizePtr will not include either of the braces. * If there isn't an element in the list, *sizePtr will be zero, and * both *elementPtr and *termPtr will refer to the null character at * the end of list. Note: this procedure does NOT collapse backslash * sequences. *---------------------------------------------------------------------- */ static int tclFindElement(const char* list, const char** elementPtr, const char** nextPtr, int* sizePtr, int *bracePtr) { register const char *p; int openBraces = 0; int inQuotes = 0; int size; /* * Skim off leading white space and check for an opening brace or * quote. */ while (isspace((int)(unsigned char)*list)) list++; if (*list == '{') { /* } */ openBraces = 1; list++; } else if (*list == '"') { inQuotes = 1; list++; } if (bracePtr) *bracePtr = openBraces; /* * Find the end of the element (either a space or a close brace or * the end of the string). */ for (p=list; 1; p++) { switch (*p) { /* * Open brace: don't treat specially unless the element is * in braces. In this case, keep a nesting count. */ case '{': if (openBraces) openBraces++; break; /* * Close brace: if element is in braces, keep nesting * count and quit when the last close brace is seen. */ case '}': if (openBraces == 1) { size = p - list; p++; if (isspace((int)(unsigned char)*p) || (*p == 0)) goto done; /* list element in braces followed by garbage instead of * space */ return 0/*ERROR*/; } else if (openBraces) { openBraces--; } break; /* * Backslash: skip over everything up to the end of the * backslash sequence. */ case '\\': { int siz; tclBackslash(p, &siz); p += siz - 1; break; } /* * Space: ignore if element is in braces or quotes; otherwise * terminate element. */ case ' ': case '\f': case '\n': case '\r': case '\t': case '\v': if ((openBraces == 0) && !inQuotes) { size = p - list; goto done; } break; /* * Double-quote: if element is in quotes then terminate it. */ case '"': if (inQuotes) { size = p-list; p++; if (isspace((int)(unsigned char)*p) || (*p == 0)) goto done; /* list element in quotes followed by garbage instead of * space */ return 0/*ERROR*/; } break; /* * End of list: terminate element. */ case 0: if (openBraces || inQuotes) { /* unmatched open brace or quote in list */ return 0/*ERROR*/; } size = p - list; goto done; } } done: while (isspace((int)(unsigned char)*p)) p++; *elementPtr = list; *nextPtr = p; if (sizePtr) *sizePtr = size; return 1/*OK*/; } /*---------------------------------------------------------------------- * tclCopyAndCollapse -- Copy a string and eliminate any backslashes that * aren't in braces. * * Results: * Count characters get copied from src to dst. Along the way, if * backslash sequences are found outside braces, the backslashes are * eliminated in the copy. After scanning count chars from source, a * null character is placed at the end of dst. *---------------------------------------------------------------------- */ static void tclCopyAndCollapse(int count, const char *src, char *dst) { register char c; int numRead; for (c = *src; count > 0; src++, c = *src, count--) { if (c == '\\') { *dst = tclBackslash(src, &numRead); dst++; src += numRead-1; count -= numRead-1; } else { *dst = c; dst++; } } *dst = 0; } /* ---------------------------------------------------------------------------- * zSplitTclList - Splits a list up into its constituent fields. * * Results: * The return value is a pointer to a list of element points, * which means that the list was successfully split up. * If NULL is returned, it means that "list" didn't have proper tcl list * structure (we don't return an error message about the details). * * This procedure does allocate a single memory block * by calling malloc to store both, the the argv pointer array and * the extracted list elements. The returned element * pointer array must be freed by calling free_2(). * * *argcPtr will get filled in with the number of valid elements * in the array. Note: *argcPtr is only modified if the procedure * returns not NULL. * ---------------------------------------------------------------------------- */ char** zSplitTclList(const char* list, int* argcPtr) { char** argv; const char* l; register char* p; int size, i, ok, elSize, brace; const char *element; /* * Figure out how much space to allocate. There must be enough * space for both the array of pointers and also for a copy of * the list. To estimate the number of pointers needed, count * the number of space characters in the list. */ for (size = 1, l = list; *l != 0; l++) { if (isspace((int)(unsigned char)*l)) size++; } size++; /* Leave space for final NULL */ i = (size * sizeof(char*)) + (l - list) + 1; argv = malloc_2(i); for (i = 0, p = (char*) (argv+size); *list != 0; i++) { ok = tclFindElement(list, &element, &list, &elSize, &brace); if (!ok) { free_2(argv); return NULL; } if (*element == 0) break; if (i >= size) { free_2(argv); /* internal error in zSplitTclList */ return NULL; } argv[i] = p; if (brace) { strncpy(p, element, elSize); p += elSize; *p = 0; p++; } else { tclCopyAndCollapse(elSize, element, p); p += elSize+1; } } argv[i] = NULL; *argcPtr = i; return argv; } /*---------------------------------------------------------------------- * tclScanElement -- scan a tcl list string to see what needs to be done. * * This procedure is a companion procedure to tclConvertElement. * * Results: * The return value is an overestimate of the number of characters * that will be needed by tclConvertElement to produce a valid * list element from string. The word at *flagPtr is filled in * with a value needed by tclConvertElement when doing the actual * conversion. * * * This procedure and tclConvertElement together do two things: * * 1. They produce a proper list, one that will yield back the * argument strings when evaluated or when disassembled with * zSplitTclList. This is the most important thing. * * 2. They try to produce legible output, which means minimizing the * use of backslashes (using braces instead). However, there are * some situations where backslashes must be used (e.g. an element * like "{abc": the leading brace will have to be backslashed. For * each element, one of three things must be done: * * (a) Use the element as-is (it doesn't contain anything special * characters). This is the most desirable option. * * (b) Enclose the element in braces, but leave the contents alone. * This happens if the element contains embedded space, or if it * contains characters with special interpretation ($, [, ;, or \), * or if it starts with a brace or double-quote, or if there are * no characters in the element. * * (c) Don't enclose the element in braces, but add backslashes to * prevent special interpretation of special characters. This is a * last resort used when the argument would normally fall under case * (b) but contains unmatched braces. It also occurs if the last * character of the argument is a backslash or if the element contains * a backslash followed by newline. * * The procedure figures out how many bytes will be needed to store * the result (actually, it overestimates). It also collects information * about the element in the form of a flags word. *---------------------------------------------------------------------- */ #define DONT_USE_BRACES 1 #define USE_BRACES 2 #define BRACES_UNMATCHED 4 static int tclScanElement(const char* string, int* flagPtr) { register const char *p; int nestingLevel = 0; int flags = 0; if (string == NULL) string = ""; p = string; if ((*p == '{') || (*p == '"') || (*p == 0)) { /* } */ flags |= USE_BRACES; } for ( ; *p != 0; p++) { switch (*p) { case '{': nestingLevel++; break; case '}': nestingLevel--; if (nestingLevel < 0) { flags |= DONT_USE_BRACES | BRACES_UNMATCHED; } break; case '[': case '$': case ';': case ' ': case '\f': case '\r': case '\t': case '\v': flags |= USE_BRACES; break; case '\n': /* lld: dont want line breaks inside a list */ flags |= DONT_USE_BRACES; break; case '\\': if ((p[1] == 0) || (p[1] == '\n')) { flags = DONT_USE_BRACES | BRACES_UNMATCHED; } else { int size; tclBackslash(p, &size); p += size-1; flags |= USE_BRACES; } break; } } if (nestingLevel != 0) { flags = DONT_USE_BRACES | BRACES_UNMATCHED; } *flagPtr = flags; /* Allow enough space to backslash every character plus leave * two spaces for braces. */ return 2*(p-string) + 2; } /*---------------------------------------------------------------------- * * tclConvertElement - convert a string into a list element * * This is a companion procedure to tclScanElement. Given the * information produced by tclScanElement, this procedure converts * a string to a list element equal to that string. * * See the comment block at tclScanElement above for details of how this * works. * * Results: * Information is copied to *dst in the form of a list element * identical to src (i.e. if zSplitTclList is applied to dst it * will produce a string identical to src). The return value is * a count of the number of characters copied (not including the * terminating NULL character). *---------------------------------------------------------------------- */ static int tclConvertElement(const char* src, char* dst, int flags) { register char *p = dst; if ((src == NULL) || (*src == 0)) { p[0] = '{'; p[1] = '}'; p[2] = 0; return 2; } if ((flags & USE_BRACES) && !(flags & DONT_USE_BRACES)) { *p = '{'; p++; for ( ; *src != 0; src++, p++) { *p = *src; } *p = '}'; p++; } else { if (*src == '{') { /* } */ /* Can't have a leading brace unless the whole element is * enclosed in braces. Add a backslash before the brace. * Furthermore, this may destroy the balance between open * and close braces, so set BRACES_UNMATCHED. */ p[0] = '\\'; p[1] = '{'; /* } */ p += 2; src++; flags |= BRACES_UNMATCHED; } for (; *src != 0 ; src++) { switch (*src) { case ']': case '[': case '$': case ';': case ' ': case '\\': case '"': *p = '\\'; p++; break; case '{': case '}': /* It may not seem necessary to backslash braces, but * it is. The reason for this is that the resulting * list element may actually be an element of a sub-list * enclosed in braces, so there may be a brace mismatch * if the braces aren't backslashed. */ if (flags & BRACES_UNMATCHED) { *p = '\\'; p++; } break; case '\f': *p = '\\'; p++; *p = 'f'; p++; continue; case '\n': *p = '\\'; p++; *p = 'n'; p++; continue; case '\r': *p = '\\'; p++; *p = 'r'; p++; continue; case '\t': *p = '\\'; p++; *p = 't'; p++; continue; case '\v': *p = '\\'; p++; *p = 'v'; p++; continue; } *p = *src; p++; } } *p = '\0'; return p-dst; } /* ============================================================================ * zMergeTclList - Creates a tcl list from a set of element strings. * * Given a collection of strings, merge them together into a * single string that has proper Tcl list structured (i.e. * zSplitTclList may be used to retrieve strings equal to the * original elements). * The merged list is stored in dynamically-allocated memory. * * Results: * The return value is the address of a dynamically-allocated string. * ============================================================================ */ char* zMergeTclList(int argc, const char** argv) { enum {LOCAL_SIZE = 20}; int localFlags[LOCAL_SIZE]; int* flagPtr; int numChars; int i; char* result; char* dst; /* Pass 1: estimate space, gather flags */ if (argc <= LOCAL_SIZE) flagPtr = localFlags; else flagPtr = malloc_2(argc*sizeof(int)); numChars = 1; for (i=0; idnd_tgt_on_signalarea_treesearch_gtk2_c_1) { WAVE_GDK_GET_POINTER(GLOBALS->signalarea->window, &x, &y, &xi, &yi, &state); WAVE_GDK_GET_POINTER_COPY; if((x<0)||(y<0)||(x>=GLOBALS->signalarea->allocation.width)||(y>=GLOBALS->signalarea->allocation.height)) return(NULL); } else if(GLOBALS->dnd_tgt_on_wavearea_treesearch_gtk2_c_1) { WAVE_GDK_GET_POINTER(GLOBALS->wavearea->window, &x, &y, &xi, &yi, &state); WAVE_GDK_GET_POINTER_COPY; if((x<0)||(y<0)||(x>=GLOBALS->wavearea->allocation.width)||(y>=GLOBALS->wavearea->allocation.height)) return(NULL); } else { return(NULL); } if((t=GLOBALS->traces.first)) { while(t) { t->flags&=~TR_HIGHLIGHT; t=t->t_next; } signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } trtarget = ((int)y / (int)GLOBALS->fontheight) - 2; if(trtarget < 0) { return(NULL); } else { t=GLOBALS->topmost_trace; } trwhich=0; while(t) { if((trwhichhier_delimeter; delim_str[1] = 0; len = 0; for(i=1;ihier_delimeter) ) { esc++; } pnt++; } if(esc) { s_new2 = calloc_2(1, len + esc); pnt = s_new; pnt2 = s_new2; while(*pnt) { if( (!isalnum((int)(unsigned char)*pnt)) && (!isspace((int)(unsigned char)*pnt)) && (*pnt != GLOBALS->hier_delimeter) ) { *(pnt2++) = '\\'; } *(pnt2++) = *(pnt++); } *unescaped_str = s_new; /* free_2(s_new); */ s_new = s_new2; } else { *unescaped_str = s_new; } } return(s_new); } /* ---------------------------------------------------------------------------- * process_tcl_list - given a tcl list, inserts traces into viewer * * Results: * Inserts traces if found in dumpfile, returns number of traces inserted * ---------------------------------------------------------------------------- */ void process_tcl_list_2(struct symbol *s, int which_msb, int which_lsb) { Trptr t; nptr nexp; int i; unsigned int default_flags = GLOBALS->default_flags; bvptr v; Trptr buffer; /* cut/copy buffer of traces */ Trptr bufferlast; /* last element of bufferchain */ int buffercount; /* number of traces in buffer */ GLOBALS->default_flags = TR_HIGHLIGHT; buffer = GLOBALS->traces.buffer; /* copy cut buffer to make re-entrant */ bufferlast = GLOBALS->traces.bufferlast; buffercount = GLOBALS->traces.buffercount; GLOBALS->traces.buffer = NULL; GLOBALS->traces.bufferlast = NULL; GLOBALS->traces.buffercount = 0; t=GLOBALS->traces.first; while(t) { if(t->flags&TR_HIGHLIGHT) /* copy TR_HIGHLIGHT->TR_RSVD and clear TR_HIGHLIGHT */ { t->flags&=(~TR_HIGHLIGHT); t->flags|=TR_RSVD; } else { t->flags&=(~TR_RSVD); } t=t->t_next; } if(which_msb <= which_lsb) { for(i=which_msb;i<=which_lsb;i++) { nexp = ExtractNodeSingleBit(s->n, i); if(nexp) { AddNode(nexp, NULL); } else { AddNodeUnroll(s->n, NULL); } } } else { for(i=which_msb;i>=which_lsb;i--) { nexp = ExtractNodeSingleBit(s->n, i); if(nexp) { AddNode(nexp, NULL); } else { AddNodeUnroll(s->n, NULL); } } } v = combine_traces(1, NULL); /* down */ if (v) { AddVector(v, NULL); free_2(v->bits->name); v->bits->name=NULL; t = GLOBALS->traces.last; RemoveTrace(t, 0); /* t is now the composite signal trace */ create_group("unused_0", t); CloseTrace(t); } t=GLOBALS->traces.first; while(t) { t->flags &= ~TR_HIGHLIGHT; if(t->flags&TR_RSVD) /* copy TR_RSVD->TR_HIGHLIGHT and clear TR_RSVD */ { t->flags|=TR_HIGHLIGHT; t->flags&=(~TR_RSVD); } t=t->t_next; } GLOBALS->traces.buffer = buffer; /* restore cut buffer */ GLOBALS->traces.bufferlast = bufferlast; GLOBALS->traces.buffercount = buffercount; GLOBALS->default_flags = default_flags; } int process_tcl_list(char *sl, gboolean track_mouse_y) { char *s_new = NULL; char *this_regex = "\\(\\[.*\\]\\)*$"; char *entry_suffixed; int c, i, ii; char **list; char **s_new_list; char **most_recent_lbrack_list; char **most_recent_colon_list; int *match_idx_list; int *match_type_list; Trptr t = NULL; int found = 0; int lbrack_adj; int net_processing_is_off = 0; int unesc_len; int curr_srch_idx = 0; char *unescaped_str = NULL; if(!sl) { return(0); } list = zSplitTclList(sl, &c); if(!list) { return(0); } read_save_helper_relative_init(NULL); /* should be passing canonicalized filter names here...so no need for relative processing */ s_new_list = calloc_2(c, sizeof(char *)); match_idx_list = calloc_2(c, sizeof(int *)); match_type_list = calloc_2(c, sizeof(int *)); most_recent_lbrack_list = calloc_2(c, sizeof(char *)); most_recent_colon_list = calloc_2(c, sizeof(char *)); GLOBALS->default_flags=TR_RJUSTIFY; GLOBALS->default_fpshift=0; GLOBALS->strace_current_window = 0; /* in case there are shadow traces; in reality this should never happen */ for(ii=0;iiis_lx2) { lx2_import_masked(); } if(track_mouse_y) { t = determine_trace_from_y(); if(t) { t->flags |= TR_HIGHLIGHT; } } memcpy(&GLOBALS->tcache_treesearch_gtk2_c_2,&GLOBALS->traces,sizeof(Traces)); GLOBALS->traces.total=0; GLOBALS->traces.first=GLOBALS->traces.last=NULL; continue; } else { goto cleanup; } } else if(is==3) { goto paste_routine; } else /* (is == 0) or (is == 2) */ for(;;) { if(*pnt == 0) { if(!(*nxt_hd)) { break; } if((!is)&&(GLOBALS->is_lx2)) { parsewavline_lx2(nxt_hd, NULL, 0); found++; } else { parsewavline(nxt_hd, NULL, 0); } break; } else if(*pnt == '\n') { *pnt = 0; if((!is)&&(GLOBALS->is_lx2)) { parsewavline_lx2(nxt_hd, NULL, 0); found++; } else { parsewavline(nxt_hd, NULL, 0); } *pnt = '\n'; nxt_hd = pnt+1; pnt++; } else { pnt++; } } } } break; default: break; } free_2(gdirect); } continue; } s_new_list[ii] = s_new; lbrack_adj = 0; most_recent_lbrack_list[ii] = strrchr(s_new, '['); if((most_recent_lbrack_list[ii])&&(most_recent_lbrack_list[ii] != s_new)) { char *chp = most_recent_lbrack_list[ii]-1; if(*chp == '\\') { most_recent_lbrack_list[ii] = chp; lbrack_adj = 1; } most_recent_colon_list[ii]=strchr(most_recent_lbrack_list[ii], ':'); } unesc_len = strlen(unescaped_str); for(i=0;inumfacs;i++) { int was_packed = HIER_DEPACK_ALLOC; char *hfacname = NULL; hfacname = hier_decompress_flagged(GLOBALS->facs[curr_srch_idx]->name, &was_packed); if(!strncmp(unescaped_str, hfacname, unesc_len)) { int hfacname_len = strlen(hfacname); if((unesc_len == hfacname_len) || ((hfacname_len > unesc_len) && (hfacname[unesc_len] == '['))) { found++; match_idx_list[ii] = curr_srch_idx; match_type_list[ii] = 1; /* match was on normal search */ if(was_packed) { free_2(hfacname); } if(s_new != unescaped_str) { free_2(unescaped_str); } goto import; } } curr_srch_idx++; if(curr_srch_idx == GLOBALS->numfacs) curr_srch_idx = 0; /* optimization for rtlbrowse as names should be in order */ if(was_packed) { free_2(hfacname); } } if(s_new != unescaped_str) { free_2(unescaped_str); } entry_suffixed=wave_alloca(2+strlen(s_new)+strlen(this_regex)+1); *entry_suffixed=0x00; strcpy(entry_suffixed, "\\<"); strcat(entry_suffixed,s_new); strcat(entry_suffixed,this_regex); wave_regex_compile(entry_suffixed, WAVE_REGEX_DND); for(i=0;inumfacs;i++) { int was_packed = HIER_DEPACK_ALLOC; char *hfacname = NULL; hfacname = hier_decompress_flagged(GLOBALS->facs[i]->name, &was_packed); if(wave_regex_match(hfacname, WAVE_REGEX_DND)) { found++; match_idx_list[ii] = i; match_type_list[ii] = 1; /* match was on normal search */ if(was_packed) { free_2(hfacname); } goto import; } if(was_packed) { free_2(hfacname); } } if(most_recent_lbrack_list[ii]) { *most_recent_lbrack_list[ii] = 0; entry_suffixed=wave_alloca(2+strlen(s_new)+strlen(this_regex)+1); *entry_suffixed=0x00; strcpy(entry_suffixed, "\\<"); strcat(entry_suffixed,s_new); strcat(entry_suffixed,this_regex); wave_regex_compile(entry_suffixed, WAVE_REGEX_DND); for(i=0;inumfacs;i++) { int was_packed = HIER_DEPACK_ALLOC; char *hfacname = NULL; hfacname = hier_decompress_flagged(GLOBALS->facs[i]->name, &was_packed); if(wave_regex_match(hfacname, WAVE_REGEX_DND)) { found++; match_idx_list[ii] = i; match_type_list[ii] = 2+lbrack_adj; /* match was on lbrack removal */ if(was_packed) { free_2(hfacname); } goto import; } if(was_packed) { free_2(hfacname); } } } import: if(match_type_list[ii]) { struct symbol *s = GLOBALS->facs[match_idx_list[ii]]; struct symbol *schain = s->vec_root; if(GLOBALS->is_lx2) { if(schain) { while(schain) { lx2_set_fac_process_mask(schain->n); schain = schain-> vec_chain; } } else { lx2_set_fac_process_mask(s->n); } } } } if(!found) goto cleanup; if(GLOBALS->is_lx2) { lx2_import_masked(); } if(track_mouse_y) { t = determine_trace_from_y(); if(t) { t->flags |= TR_HIGHLIGHT; } } memcpy(&GLOBALS->tcache_treesearch_gtk2_c_2,&GLOBALS->traces,sizeof(Traces)); GLOBALS->traces.total=0; GLOBALS->traces.first=GLOBALS->traces.last=NULL; for(ii=0;iifacs[match_idx_list[ii]]; if((match_type_list[ii] >= 2)&&(s->n->extvals)) { nptr nexp; int bit_msb = atoi(most_recent_lbrack_list[ii]+1 + (match_type_list[ii] == 3)); /* == 3 for adjustment when lbrack is escaped */ int bit_lsb; /* = bit_msb; scan-build: never read */ int which_msb, which_lsb, cnt; if(s->n->lsi > s->n->msi) { for(which_msb=0,cnt=s->n->msi ; cnt<=s->n->lsi ; cnt++,which_msb++) { if(cnt==bit_msb) break; } } else { for(which_msb=0,cnt=s->n->msi ; cnt>=s->n->lsi ; cnt--,which_msb++) { if(cnt==bit_msb) break; } } which_lsb = which_msb; /* Need to fix this to extract more than a single bit as in the case of a subrange of an existing vector! */ if(most_recent_colon_list[ii]) { bit_lsb = atoi(most_recent_colon_list[ii]+1); if(s->n->lsi > s->n->msi) { for(which_lsb=0,cnt=s->n->msi ; cnt<=s->n->lsi ; cnt++,which_lsb++) { if(cnt==bit_lsb) break; } } else { for(which_lsb=0,cnt=s->n->msi ; cnt>=s->n->lsi ; cnt--,which_lsb++) { if(cnt==bit_lsb) break; } } } if(which_msb == which_lsb) { nexp = ExtractNodeSingleBit(s->n, which_msb); *most_recent_lbrack_list[ii] = '['; if(nexp) { AddNode(nexp, NULL); } else { AddNodeUnroll(s->n, NULL); } } else { process_tcl_list_2(s, which_msb, which_lsb); /* is complicated, so split out to its own function */ } } else { struct symbol *schain = s->vec_root; if(!schain) { AddNodeUnroll(s->n, NULL); } else { int len = 0; while(schain) { len++; schain = schain->vec_chain; } add_vector_chain(s->vec_root, len); } } } } paste_routine: GLOBALS->default_flags=TR_RJUSTIFY; GLOBALS->default_fpshift=0; GLOBALS->traces.buffercount=GLOBALS->traces.total; GLOBALS->traces.buffer=GLOBALS->traces.first; GLOBALS->traces.bufferlast=GLOBALS->traces.last; GLOBALS->traces.first=GLOBALS->tcache_treesearch_gtk2_c_2.first; GLOBALS->traces.last=GLOBALS->tcache_treesearch_gtk2_c_2.last; GLOBALS->traces.total=GLOBALS->tcache_treesearch_gtk2_c_2.total; if((t) || (!track_mouse_y)) { PasteBuffer(); } else { PrependBuffer(); } GLOBALS->traces.buffercount=GLOBALS->tcache_treesearch_gtk2_c_2.buffercount; GLOBALS->traces.buffer=GLOBALS->tcache_treesearch_gtk2_c_2.buffer; GLOBALS->traces.bufferlast=GLOBALS->tcache_treesearch_gtk2_c_2.bufferlast; if(track_mouse_y) { if(t) { t->flags &= ~TR_HIGHLIGHT; } } cleanup: for(ii=0;iitims.marker != -1) { char mrkbuf[128]; reformat_time(mrkbuf, GLOBALS->tims.marker, GLOBALS->time_dimension); sprintf(pidstr+strlen(pidstr), "{marker %s} ", mrkbuf); } return(strdup_2(pidstr)); #else return(NULL); #endif } /* ---------------------------------------------------------------------------- * make_single_tcl_list_name - generates tcl name from a gtkwave one * * Results: * generated tcl list string * ---------------------------------------------------------------------------- */ char *make_single_tcl_list_name(char *s, char *opt_value, int promote_to_bus, int preserve_range) { char *rpnt = NULL; char *pnt, *pnt2; int delim_cnt = 0; char *lbrack=NULL, *colon=NULL, *rbrack=NULL; const char **names = NULL; char *tcllist = NULL; int tcllist_len; int names_idx = 0; char is_bus = 0; if(s) { int len; int was_packed = HIER_DEPACK_ALLOC; char *s2; s = hier_decompress_flagged(s, &was_packed); len = strlen(s); s2 = wave_alloca(len+1); strcpy(s2, s); if(was_packed) { free_2(s); s = NULL; } pnt = s2; while(*pnt) { if(*pnt == GLOBALS->hier_delimeter) { delim_cnt++; } else if(*pnt == '[') { lbrack = pnt; } else if(*pnt == ':') { colon = pnt; } else if(*pnt == ']') { rbrack = pnt; } pnt++; } if(!preserve_range) /* added for gtkwave::addSignalsFromList */ { if((lbrack && colon && rbrack && ((colon-lbrack)>0) && ((rbrack - colon)>0) && ((rbrack-lbrack)>0)) || (lbrack && promote_to_bus)) { is_bus = 1; *lbrack = 0; /* len = lbrack - s2; */ /* scan-build */ } } names = calloc_2(delim_cnt+1, sizeof(char *)); pnt = s2; names[0] = pnt; while(*pnt) { if(*pnt == GLOBALS->hier_delimeter) { *pnt = 0; names_idx++; pnt++; if(*pnt) { names[names_idx] = pnt; } } else { pnt++; } } tcllist = zMergeTclList(delim_cnt+1, names); tcllist_len = strlen(tcllist); free_2(names); if(!opt_value) { if(is_bus) { len = 8 + strlen(tcllist) + 1 + 1 + 1; /* "{netBus ...} " + trailing null char */ /* pnt = s2; */ /* scan-build */ rpnt = malloc_2(len+1); strcpy(rpnt, "{netBus "); pnt2 = rpnt + 8; } else { len = 5 + strlen(tcllist) + 1 + 1 + 1; /* "{net ...} " + trailing null char */ /* pnt = s2; */ /* scan-build */ rpnt = malloc_2(len+1); strcpy(rpnt, "{net "); pnt2 = rpnt + 5; } } else { int len_value = strlen(opt_value); if(is_bus) { len = 15 + (len_value + 1) + strlen(tcllist) + 1 + 1 + 1; /* "{netBusValue 0x...} " + trailing null char */ /* pnt = s2; */ /* scan-build */ rpnt = malloc_2(len+1); sprintf(rpnt, "{netBusValue 0x%s ", opt_value); pnt2 = rpnt + 15 + (len_value + 1); } else { len = 10 + (len_value + 1) + strlen(tcllist) + 1 + 1 + 1; /* "{netValue ...} " + trailing null char */ /* pnt = s2; */ /* scan-build */ rpnt = malloc_2(len+1); sprintf(rpnt, "{netValue %s ", opt_value); pnt2 = rpnt + 10 + (len_value + 1); } } strcpy(pnt2, tcllist); strcpy(pnt2 + tcllist_len, "} "); free_2(tcllist); } return(rpnt); } /* ---------------------------------------------------------------------------- * give_value_string - generates value string from trace @ markertime * * Results: * generated value which is similar to that generated in the signalwindow * pane when the marker button is pressed. note that this modifies the * flags so it is always TR_RJUSTIFY | TR_HEX * ---------------------------------------------------------------------------- */ static char *give_value_string(Trptr t) { char *rc = NULL; unsigned int flags; int f_filter, p_filter; if(t) { flags = t->flags; f_filter = t->f_filter; p_filter = t->p_filter; t->flags = TR_RJUSTIFY | TR_HEX; t->f_filter = 0; t->p_filter = 0; if(GLOBALS->tims.marker != -1) { if(t->vector) { /* this is currently unused as vectors are exploded into single bits */ vptr v = bsearch_vector(t->n.vec, GLOBALS->tims.marker - t->shift); rc = convert_ascii(t, v); } else { hptr h_ptr = bsearch_node(t->n.nd, GLOBALS->tims.marker - t->shift); if(h_ptr) { if(!t->n.nd->extvals) { rc = (char *)calloc_2(2, 2*sizeof(char)); rc[0] = AN_STR[h_ptr->v.h_val]; } else { if(h_ptr->flags&HIST_REAL) { if(!(h_ptr->flags&HIST_STRING)) { #ifdef WAVE_HAS_H_DOUBLE rc = convert_ascii_real(t, &h_ptr->v.h_double); #else rc = convert_ascii_real(t, (double *)h_ptr->v.h_vector); #endif } else { rc = convert_ascii_string((char *)h_ptr->v.h_vector); } } else { rc = convert_ascii_vec(t,h_ptr->v.h_vector); } } } } } t->flags = flags; t->f_filter = f_filter; t->p_filter = p_filter; } return(rc); } /* ---------------------------------------------------------------------------- * add_dnd_from_searchbox - generates tcl names from selected searchbox ones * * Results: * tcl list containing all generated names * ---------------------------------------------------------------------------- */ char *add_dnd_from_searchbox(void) { int i; char *one_entry = NULL, *mult_entry = NULL; unsigned int mult_len = 0; for(i=0;inum_rows_search_c_2;i++) { struct symbol *s, *t; s=(struct symbol *)gtk_clist_get_row_data(GTK_CLIST(GLOBALS->clist_search_c_3), i); if(get_s_selected(s)) { if((!s->vec_root)||(!GLOBALS->autocoalesce)) { } else { t=s->vec_root; set_s_selected(t, 1); t=t->vec_chain; while(t) { if(get_s_selected(t)) { set_s_selected(t, 0); } t=t->vec_chain; } } } } for(i=0;inum_rows_search_c_2;i++) { int len; struct symbol *s, *t; s=(struct symbol *)gtk_clist_get_row_data(GTK_CLIST(GLOBALS->clist_search_c_3), i); if(get_s_selected(s)) { if((!s->vec_root)||(!GLOBALS->autocoalesce)) { one_entry = make_single_tcl_list_name(s->n->nname, NULL, 0, 0); WAVE_OE_ME } else { len=0; t=s->vec_root; while(t) { one_entry = make_single_tcl_list_name(t->n->nname, NULL, 1, 0); WAVE_OE_ME if(get_s_selected(t)) { if(len) set_s_selected(t, 0); } /* len++; */ /* scan-build : artifact of below being removed */ break; /* t=t->vec_chain; ...no longer needed because of for() loop above and handler in process_tcl_list() */ } } } } return(mult_entry); } /* ---------------------------------------------------------------------------- * add_dnd_from_signal_window - generates tcl names from selected sigwin ones * * Results: * tcl list containing all generated names * ---------------------------------------------------------------------------- */ char *add_dnd_from_signal_window(void) { return(add_traces_from_signal_window(FALSE)); } /* ---------------------------------------------------------------------------- * add_traces_from_signal_window - generates tcl names from all sigwin ones * * Results: * tcl list containing all generated names, does not contain * {gtkwave NET OFF} directive as this is intended for tcl program usage. * ---------------------------------------------------------------------------- */ char *add_traces_from_signal_window(gboolean is_from_tcl_command) { Trptr t; char *one_entry = NULL, *mult_entry = NULL; unsigned int mult_len = 0; char *netoff = "{gtkwave NET OFF} "; char *trace_val = NULL; static const char xfwd[AN_COUNT]= AN_NORMAL; char trace_val_vec_single[2] = { 0, 0 }; if(is_from_tcl_command) { mult_entry = strdup_2(""); } t=GLOBALS->traces.first; while(t) { if( (!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))) && ((t->flags & TR_HIGHLIGHT)||is_from_tcl_command) ) { if(t->vector) { int i; nptr *nodes; vptr v = (GLOBALS->tims.marker != -1) ? bsearch_vector(t->n.vec, GLOBALS->tims.marker - t->shift) : NULL; unsigned char *bits = v ? (v->v) : NULL; char *first_str = NULL; int coalesce_pass = 1; nodes=t->n.vec->bits->nodes; for(i=0;in.vec->bits->nnbits;i++) { if(!nodes[i]->expansion) { nptr n = nodes[i]; char *str = append_array_row(n); char *p = strrchr(str, '['); if(p) { *p = 0; } else { coalesce_pass = 0; break; } if(!i) { first_str = strdup_2(str); } else { if((!first_str /*scan-build */) || strcmp(str, first_str)) { coalesce_pass = 0; break; } } } else { coalesce_pass = 0; } } if(coalesce_pass) { if(t->n.vec->bits->nnbits < 2) { coalesce_pass = 0; } else { nptr nl = nodes[0]; char *strl = append_array_row(nl); char *pl = strrchr(strl, '['); int lidx = atoi(pl+1); nptr nr = nodes[t->n.vec->bits->nnbits - 1]; char *strr = append_array_row(nr); char *pr = strrchr(strr, '['); int ridx = atoi(pr+1); int first_str_len = strlen(first_str ? first_str : (first_str = strdup_2("INTERNAL_ERROR"))); /* : case added for scan-build */ char *newname = malloc_2(first_str_len + 40); sprintf(newname, "%s[%d:%d]", first_str, lidx, ridx); /* this disappears in make_single_tcl_list_name() but might be used in future code */ if(!mult_entry) { one_entry = make_gtkwave_pid(); WAVE_OE_ME one_entry = strdup_2(netoff); WAVE_OE_ME} one_entry = is_from_tcl_command ? strdup_2s(newname) : make_single_tcl_list_name(newname, NULL, 0, 0); WAVE_OE_ME if(!is_from_tcl_command) { trace_val = give_value_string(t); if(trace_val) { one_entry = make_single_tcl_list_name(newname, trace_val, 0, 0); WAVE_OE_ME free_2(trace_val); } } free_2(newname); } free_2(first_str); first_str = NULL; } if(!coalesce_pass) for(i=0;in.vec->bits->nnbits;i++) { if(nodes[i]->expansion) { int which, cnt; int bit = nodes[i]->expansion->parentbit; nptr n = nodes[i]->expansion->parent; char *str = append_array_row(n); char *p = strrchr(str, '['); if(p) { *p = 0; } if(n->lsi > n->msi) { for(which=0,cnt=n->lsi ; cnt>=n->msi ; cnt--,which++) { if(cnt==bit) break; } } else { for(which=0,cnt=n->msi ; cnt>=n->lsi ; cnt--,which++) { if(cnt==bit) break; } } sprintf(str+strlen(str), "[%d]", which); if(!mult_entry) { one_entry = make_gtkwave_pid(); WAVE_OE_ME one_entry = strdup_2(netoff); WAVE_OE_ME } one_entry = is_from_tcl_command ? strdup_2s(str) : make_single_tcl_list_name(str, NULL, 0, 0); WAVE_OE_ME if((bits)&&(!is_from_tcl_command)) { int bitnum = bits[i]; if(bitnum < 0) bitnum = AN_DASH; else if(bitnum >= AN_COUNT) bitnum = AN_DASH; trace_val_vec_single[0] = AN_STR[(int)xfwd[bitnum]]; one_entry = make_single_tcl_list_name(str, trace_val_vec_single, 0, 0); WAVE_OE_ME } } else { if(!mult_entry) { one_entry = make_gtkwave_pid(); WAVE_OE_ME one_entry = strdup_2(netoff); WAVE_OE_ME} one_entry = is_from_tcl_command ? strdup_2s(append_array_row(nodes[i])) : make_single_tcl_list_name(append_array_row(nodes[i]), NULL, 0, 0); WAVE_OE_ME if(!is_from_tcl_command) { trace_val = give_value_string(t); if(trace_val) { one_entry = make_single_tcl_list_name(append_array_row(nodes[i]), trace_val, 0, 0); WAVE_OE_ME free_2(trace_val); } } } } } else { if(t->n.nd->expansion) { int which, cnt; int bit = t->n.nd->expansion->parentbit; nptr n = t->n.nd->expansion->parent; char *str = append_array_row(n); char *p = strrchr(str, '['); if(p) { *p = 0; } if(n->lsi > n->msi) { for(which=0,cnt=n->lsi ; cnt>=n->msi ; cnt--,which++) { if(cnt==bit) break; } } else { for(which=0,cnt=n->msi ; cnt>=n->lsi ; cnt--,which++) { if(cnt==bit) break; } } sprintf(str+strlen(str), "[%d]", which); if(!mult_entry) { one_entry = make_gtkwave_pid(); WAVE_OE_ME one_entry = strdup_2(netoff); WAVE_OE_ME} one_entry = is_from_tcl_command ? strdup_2s(str) : make_single_tcl_list_name(str, NULL, 0, 0); WAVE_OE_ME if(!is_from_tcl_command) { trace_val = give_value_string(t); if(trace_val) { one_entry = make_single_tcl_list_name(str, trace_val, 0, 0); WAVE_OE_ME free_2(trace_val); } } } else { if(!mult_entry) { one_entry = make_gtkwave_pid(); WAVE_OE_ME one_entry = strdup_2(netoff); WAVE_OE_ME} one_entry = is_from_tcl_command ? strdup_2s(append_array_row(t->n.nd)) : make_single_tcl_list_name(append_array_row(t->n.nd), NULL, 0, 0); WAVE_OE_ME if(!is_from_tcl_command) { trace_val = give_value_string(t); if(trace_val) { one_entry = make_single_tcl_list_name(append_array_row(t->n.nd), trace_val, 0, 0); WAVE_OE_ME free_2(trace_val); } } } } } else { if(!mult_entry) { one_entry = strdup_2(netoff); WAVE_OE_ME } } t = t->t_next; } return(mult_entry); } /* ---------------------------------------------------------------------------- * sig_selection_foreach_dnd - generates tcl names from iterated clist ones * * Results: * tcl list containing all generated names coalesced back into *data * ---------------------------------------------------------------------------- */ #if WAVE_USE_GTK2 static void sig_selection_foreach_dnd (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { (void)path; struct tree *sel; int i; int low, high; struct iter_dnd_strings *it; char *one_entry, *mult_entry; unsigned int mult_len; enum { NAME_COLUMN, TREE_COLUMN, N_COLUMNS }; it = (struct iter_dnd_strings *)data; one_entry = it->one_entry; mult_entry = it->mult_entry; mult_len = it->mult_len; /* Get the tree. */ gtk_tree_model_get (model, iter, TREE_COLUMN, &sel, -1); if(!sel) return; low = fetchlow(sel)->t_which; high = fetchhigh(sel)->t_which; /* If signals are vectors, iterate through them if so. */ for(i=low;i<=high;i++) { struct symbol *s; s=GLOBALS->facs[i]; if((s->vec_root)&&(GLOBALS->autocoalesce)) { struct symbol *t = s->vec_root; while(t) { one_entry = make_single_tcl_list_name(t->n->nname, NULL, 1, 0); WAVE_OE_ME break; /* t=t->vec_chain; ...no longer needed as this is resolved in process_tcl_list() */ } } else { one_entry = make_single_tcl_list_name(s->n->nname, NULL, 0, 0); WAVE_OE_ME } } it->one_entry = one_entry; it->mult_entry = mult_entry; it->mult_len = mult_len; } #endif /* ---------------------------------------------------------------------------- * add_dnd_from_tree_window - generates tcl names from selected tree clist ones * * Results: * tcl list containing all generated names * ---------------------------------------------------------------------------- */ char *add_dnd_from_tree_window(void) { #if WAVE_USE_GTK2 struct iter_dnd_strings it; memset(&it, 0, sizeof(struct iter_dnd_strings)); gtk_tree_selection_selected_foreach(GLOBALS->sig_selection_treesearch_gtk2_c_1, &sig_selection_foreach_dnd, (gpointer)&it); return(it.mult_entry); #else return(NULL); #endif } /* ---------------------------------------------------------------------------- * make_message - printf() which mallocs into a string * * Results: * dynamically allocated string * ---------------------------------------------------------------------------- */ static char *make_message (const char *fmt, ...) { /* Guess we need no more than 100 bytes. */ int n, size = 100; char *p, *np; va_list ap; if ((p = malloc_2(size)) == NULL) return NULL; while (1) { /* Try to print in the allocated space. */ va_start (ap, fmt); n = vsnprintf (p, size, fmt, ap); va_end (ap); /* If that worked, return the string. */ if (n > -1 && n < size) return p; /* Else try again with more space. */ if (n > -1) /* glibc 2.1 */ size = n + 1; /* precisely what is needed */ else /* glibc 2.0 */ size *= 2; /* twice the old size */ if ((np = realloc_2(p, size)) == NULL) { free (p); return NULL; } else { p = np; } } } /* ---------------------------------------------------------------------------- * emit_gtkwave_savefile_formatted_entries_in_tcl_list - performs as named * * Results: * tcl list which mimics a gtkwave save file for cut and paste entries * which is later iteratively run through the normal gtkwave save file * loader parsewavline() on the distant end. the reason this is * necessary is in order to pass attribute and concatenation information * along to the distant end. * ---------------------------------------------------------------------------- */ char *emit_gtkwave_savefile_formatted_entries_in_tcl_list(Trptr t, gboolean use_tcl_mode) { char *one_entry, *mult_entry = NULL; unsigned int mult_len = 0; unsigned int prev_flags = 0; unsigned int def=0; TimeType prevshift=LLDescriptor(0); char is_first = 1; char flag_skip; while(t) { flag_skip = 0; if(use_tcl_mode) { if(IsSelected(t) || (t->t_grp && IsSelected(t->t_grp))) { /* members of closed groups may not be highlighted */ /* so propogate highlighting here */ t->flags |= TR_HIGHLIGHT; } else { if((prev_flags & TR_ANALOGMASK) && (t->flags &TR_ANALOG_BLANK_STRETCH)) { flag_skip = 1; } else { t = t->t_next; continue; } } } if((t->flags!=def)||(is_first)) { is_first = 0; if((t->flags & TR_PTRANSLATED) && (!t->p_filter)) t->flags &= (~TR_PTRANSLATED); if((t->flags & TR_FTRANSLATED) && (!t->f_filter)) t->flags &= (~TR_FTRANSLATED); one_entry = make_message("@%x\n",(def=t->flags) & ~TR_HIGHLIGHT); WAVE_OE_ME if(!flag_skip) prev_flags = def; } if(t->t_color) { one_entry = make_message("[color] %d\n", t->t_color); WAVE_OE_ME } if(t->t_fpdecshift) { one_entry = make_message("[fpshift_count] %d\n", t->t_fpdecshift); WAVE_OE_ME } if((t->shift)||((prevshift)&&(!t->shift))) { one_entry = make_message(">"TTFormat"\n", t->shift); WAVE_OE_ME } prevshift=t->shift; if(!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { if(t->flags & TR_FTRANSLATED) { if(t->f_filter && GLOBALS->filesel_filter[t->f_filter]) { one_entry = make_message("^%d %s\n", t->f_filter, GLOBALS->filesel_filter[t->f_filter]); WAVE_OE_ME } else { one_entry = make_message("^%d %s\n", 0, "disabled"); WAVE_OE_ME } } else if(t->flags & TR_PTRANSLATED) { if(t->p_filter && GLOBALS->procsel_filter[t->p_filter]) { one_entry = make_message("^>%d %s\n", t->p_filter, GLOBALS->procsel_filter[t->p_filter]); WAVE_OE_ME } else { one_entry = make_message("^>%d %s\n", 0, "disabled"); WAVE_OE_ME } } /* NOT an else! */ if(t->flags & TR_TTRANSLATED) { if(t->transaction_args) { one_entry = make_message("[transaction_args] \"%s\"\n", t->transaction_args); WAVE_OE_ME } else { one_entry = make_message("[transaction_args] \"%s\"\n", ""); WAVE_OE_ME } if(t->t_filter && GLOBALS->ttranssel_filter[t->t_filter]) { one_entry = make_message("^<%d %s\n", t->t_filter, GLOBALS->ttranssel_filter[t->t_filter]); WAVE_OE_ME } else { one_entry = make_message("^<%d %s\n", 0, "disabled"); WAVE_OE_ME } } if(t->vector && !(t->n.vec->transaction_cache && t->n.vec->transaction_cache->transaction_nd)) { int i; nptr *nodes; bptr bits; baptr ba; if(HasAlias(t)) { one_entry = make_message("+{%s} ",t->name_full); WAVE_OE_ME } bits = t->n.vec->bits; ba = bits ? bits->attribs : NULL; one_entry = make_message("%c{%s}", ba ? ':' : '#', t->n.vec->transaction_cache ? t->n.vec->transaction_cache->bvname : t->n.vec->bvname); WAVE_OE_ME nodes=t->n.vec->bits->nodes; for(i=0;in.vec->bits->nnbits;i++) { if(nodes[i]->expansion) { one_entry = make_message(" (%d)%s",nodes[i]->expansion->parentbit, append_array_row(nodes[i]->expansion->parent)); WAVE_OE_ME } else { one_entry = make_message(" %s",append_array_row(nodes[i])); WAVE_OE_ME } if(ba) { one_entry = make_message(" "TTFormat" %x", ba[i].shift, ba[i].flags); WAVE_OE_ME } } one_entry = make_message("\n"); WAVE_OE_ME } else { nptr nd = (t->vector && t->n.vec->transaction_cache && t->n.vec->transaction_cache->transaction_nd) ? t->n.vec->transaction_cache->transaction_nd : t->n.nd; if(HasAlias(t)) { if(nd->expansion) { one_entry = make_message("+{%s} (%d)%s\n",t->name_full,nd->expansion->parentbit, append_array_row(nd->expansion->parent)); WAVE_OE_ME } else { one_entry = make_message("+{%s} %s\n",t->name_full,append_array_row(nd)); WAVE_OE_ME } } else { if(nd->expansion) { one_entry = make_message("(%d)%s\n",nd->expansion->parentbit, append_array_row(nd->expansion->parent)); WAVE_OE_ME } else { one_entry = make_message("%s\n",append_array_row(nd)); WAVE_OE_ME } } } } else { if(!t->name) { one_entry = make_message("-\n"); WAVE_OE_ME } else { one_entry = make_message("-%s\n",t->name); WAVE_OE_ME } } t=t->t_next; } if(mult_entry) { const char *hdr = "{gtkwave SAVELIST "; int hdr_len = strlen(hdr); const char *av[1]; char *zm; int zm_len; av[0] = mult_entry; zm = zMergeTclList(1, av); zm_len = strlen(zm); free_2(mult_entry); mult_entry = malloc_2(hdr_len + zm_len + 2 + 1); memcpy(mult_entry, hdr, hdr_len); memcpy(mult_entry + hdr_len, zm, zm_len); strcpy(mult_entry + hdr_len + zm_len, "} "); free_2(zm); } return(mult_entry); } /* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */ /* XXX functions for URL (not TCL list) handling XXX */ /* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */ enum GtkwaveFtype { WAVE_FTYPE_UNKNOWN, WAVE_FTYPE_DUMPFILE, WAVE_FTYPE_STEMSFILE, WAVE_FTYPE_SAVEFILE }; /* ---------------------------------------------------------------------------- * determine_ftype - examines filename (perhaps initial contents) and * determines file type * * Results: * enum of ftype determination * ---------------------------------------------------------------------------- */ static int determine_ftype(char *s, char **dotpnt) { char *pnt = s; char *dot = NULL, *dot2 = NULL; int ftype = WAVE_FTYPE_UNKNOWN; while(*pnt) { if(*pnt == '.') { dot2 = dot; dot = pnt; } pnt++; } *dotpnt = dot; if(dot) { if(!strcasecmp("sav", dot+1)) { ftype = WAVE_FTYPE_SAVEFILE; } else if(!strcasecmp("gtkw", dot+1)) { ftype = WAVE_FTYPE_SAVEFILE; } else if(!strcasecmp("stems", dot+1)) { ftype = WAVE_FTYPE_STEMSFILE; } else /* detect dumpfile type */ if ( #ifdef EXTLOAD_SUFFIX (!strcasecmp(EXTLOAD_SUFFIX, dot+1)) || #endif (!strcasecmp("vcd", dot+1)) || (!strcasecmp("dmp", dot+1)) || (!strcasecmp("lxt", dot+1)) || (!strcasecmp("lx2", dot+1)) || (!strcasecmp("lxt2", dot+1)) || (!strcasecmp("vzt", dot+1)) || (!strcasecmp("fst", dot+1)) || (!strcasecmp("ghw", dot+1)) || (!strcasecmp("aet", dot+1)) || /* ignore .aet? filename types */ (!strcasecmp("ae2", dot+1)) ) { ftype = WAVE_FTYPE_DUMPFILE; } else if(dot2) { if ( (!strcasecmp("ghw.gz", dot2+1)) || (!strcasecmp("ghw.bz2", dot2+1)) || (!strcasecmp("ghw.bz2", dot2+1)) || (!strcasecmp("vcd.gz", dot2+1)) || (!strcasecmp("vcd.zip", dot2+1)) ) { ftype = WAVE_FTYPE_DUMPFILE; } } } else { FILE *f = fopen(s, "rb"); if(f) { int ch0 = getc(f); int ch1 = getc(f); if(ch0 == EOF) { ch0 = ch1 = 0; } else if(ch1 == EOF) { ch1 = 0; } if((ch0 == '+') && (ch1 == '+')) { ftype = WAVE_FTYPE_STEMSFILE; /* stems file */ } else if(ch0 == '[') { ftype = WAVE_FTYPE_SAVEFILE; /* save file */ } fclose(f); } } return(ftype); } /* ---------------------------------------------------------------------------- * process_url_file - examines filename and performs appropriate side-effect * * Results: * Loads save file, new dump file, or stems file viewer * ---------------------------------------------------------------------------- */ int process_url_file(char *s) { static int processing_missing_file = 0; /* in case of malformed save files causing recursion */ int rc = 0; char *dotpnt = NULL; int ftype = determine_ftype(s, &dotpnt); switch(ftype) { case WAVE_FTYPE_SAVEFILE: if((GLOBALS->loaded_file_type == MISSING_FILE)&&(!processing_missing_file)) { gboolean modified; int opt_vcd; char *dfn = extract_dumpname_from_save_file(s, &modified, &opt_vcd); if(dfn) { char *dfn_local = strdup(dfn); free_2(dfn); processing_missing_file = 1; if(process_url_file(dfn_local)) { GLOBALS->dumpfile_is_modified = modified; } free(dfn_local); processing_missing_file = 0; } } GLOBALS->fileselbox_text = &GLOBALS->filesel_writesave; GLOBALS->filesel_ok=1; if(*GLOBALS->fileselbox_text) free_2(*GLOBALS->fileselbox_text); *GLOBALS->fileselbox_text=(char *)strdup_2(s); #ifndef MAC_INTEGRATION GLOBALS->block_xy_update = 1; #else GLOBALS->block_xy_update = (GLOBALS->num_notebook_pages > 1); /* let window always resize if 1 tab */ #endif wave_gconf_client_set_string("/current/savefile", s); read_save_helper(s, NULL, NULL, NULL, NULL, NULL); GLOBALS->block_xy_update = 0; rc = 1; break; case WAVE_FTYPE_STEMSFILE: #if !defined _MSC_VER && !defined __MINGW32__ GLOBALS->fileselbox_text = &GLOBALS->stems_name; GLOBALS->filesel_ok=1; if(*GLOBALS->fileselbox_text) free_2(*GLOBALS->fileselbox_text); *GLOBALS->fileselbox_text=(char *)strdup_2(s); menu_read_stems_cleanup(NULL, NULL); #endif rc = 1; break; case WAVE_FTYPE_DUMPFILE: GLOBALS->fileselbox_text = &GLOBALS->filesel_newviewer_menu_c_1; GLOBALS->filesel_ok=1; if(*GLOBALS->fileselbox_text) free_2(*GLOBALS->fileselbox_text); *GLOBALS->fileselbox_text=(char *)strdup_2(s); menu_new_viewer_tab_cleanup(NULL, NULL); rc = 1; break; default: break; } return(rc); } /* ---------------------------------------------------------------------------- * uri_cmp - qsort compare function that ensures save files and stems are * ordered after their respective dumpfiles * * Results: * returns correct sort order for processing (based on name and * GtkwaveFtype * ---------------------------------------------------------------------------- */ #ifdef WAVE_USE_GTK2 static int uri_cmp(const void *v1, const void *v2) { char *s1 = *(char **)v1; char *s2 = *(char **)v2; char *d1, *d2; int typ1 = determine_ftype(s1, &d1); int typ2 = determine_ftype(s2, &d2); int rc; if(!d1 || !d2) { return(strcmp(s1, s2)); } *d1 = 0; *d2 = 0; rc = strcmp(s1, s2); if(!rc) { rc = (typ1 - typ2); /* use suffix ftype to manipulate sort */ } *d1 = '.'; *d2 = '.'; return(rc); } #endif /* ---------------------------------------------------------------------------- * process_url_list - examines list of URLs and processes if valid files * * Results: * Indicates if any URLs were processed * ---------------------------------------------------------------------------- */ int process_url_list(char *s) { int is_url = 0; #if WAVE_USE_GTK2 int i; int url_cnt = 0; char pch = 0; char *nxt_hd = s; char *pnt = s; char *path; char **url_list = g_malloc(sizeof(gchar *)); /* deliberate g_funcs() as context can swap out from under us */ if(*pnt == '{') { g_free(url_list); return(0); } /* exit early if tcl list */ for(;;) { if(*pnt == 0) { if(!(*nxt_hd)) { break; } path = g_filename_from_uri(nxt_hd, NULL, NULL); if(path) { url_list[url_cnt++] = path; url_list = g_realloc(url_list, (url_cnt+1) * sizeof(gchar *)); } break; } else if((*pnt == '\n')||(*pnt == '\r')) { if((pch != '\n') && (pch != '\r')) { char sav = *pnt; *pnt = 0; path = g_filename_from_uri(nxt_hd, NULL, NULL); if(path) { url_list[url_cnt++] = path; url_list = g_realloc(url_list, (url_cnt+1) * sizeof(gchar *)); } *pnt = sav; } pch = *pnt; nxt_hd = pnt+1; pnt++; } else { pch = *pnt; pnt++; } } if(url_list) { if(url_cnt > 2) { qsort(url_list, url_cnt, sizeof(struct gchar *), uri_cmp); } else if(url_cnt == 2) /* in case there are only 2 files, make the savefile last */ { char *d1, *d2; int typ1 = determine_ftype(url_list[0], &d1); int typ2 = determine_ftype(url_list[1], &d2); if(typ1 > typ2) { char *tmp_swap = url_list[0]; url_list[0] = url_list[1]; url_list[1] = tmp_swap; } } for(i=0;ibusy_busy_c_1 && !in_timer) { Tcl_Interp *interp = (Tcl_Interp *)arg; const char *tv = NULL; in_timer = TRUE; tv = Tcl_GetVar(interp, WAVE_TCLCB_TIMER_PERIOD, WAVE_TCLCB_TIMER_PERIOD_FLAGS); if(tv) { gtkwavetcl_setvar_nonblocking(WAVE_TCLCB_TIMER_PERIOD,tv,WAVE_TCLCB_TIMER_PERIOD_FLAGS); tv = Tcl_GetVar(interp, WAVE_TCLCB_TIMER_PERIOD, WAVE_TCLCB_TIMER_PERIOD_FLAGS); } in_timer = FALSE; if(tv) { g_timeout_add(atoi(tv), setvar_timer, arg); } return(FALSE); } else { return(TRUE); } } } static void init_setvar_timer(Tcl_Interp *interp) { g_timeout_add(atoi(WAVE_TCLCB_TIMER_PERIOD_INIT), setvar_timer, (gpointer)interp); } static int menu_func(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { gtkwave_mlist_t *ife = (gtkwave_mlist_t *)clientData; int i; struct wave_script_args *old_wave_script_args = GLOBALS->wave_script_args; /* stackable args */ char fexit = GLOBALS->enable_fast_exit; if(GLOBALS->in_tcl_callback) /* don't allow callbacks to call menu functions (yet) */ { char reportString[1024]; char menuItem[512]; Tcl_Obj *aobj; char *src = ife->path; char *dst = menuItem; while(*src) { *dst = (*src != ' ') ? *src : '_'; src++; dst++; } *dst = 0; sprintf(reportString, "gtkwave::%s prohibited in callback", menuItem); gtkwavetcl_setvar_nonblocking(WAVE_TCLCB_ERROR,reportString,WAVE_TCLCB_ERROR_FLAGS); aobj = Tcl_NewStringObj(reportString, -1); Tcl_SetObjResult(interp, aobj); return(TCL_ERROR); } GLOBALS->wave_script_args = NULL; GLOBALS->enable_fast_exit = 1; if(objc > 1) { struct wave_script_args *wc = NULL; for(i=1;ipayload, s); /* scan-build complains but it thinks payload[1] is the actual memory allocated */ } w->curr = NULL; /* yes, curr is only ever used for the 1st struct, but there is no sense creating head/follower structs for this */ w->next = NULL; if(!GLOBALS->wave_script_args) { GLOBALS->wave_script_args = w; w->curr = w; } else { if(wc) /* scan-build: suppress warning, this will never happen */ { wc->next = w; /* we later really traverse through curr->next from the head pointer */ } } wc = w; } if(!GLOBALS->wave_script_args) /* create a dummy list in order to keep requesters from popping up in file.c, etc. */ { GLOBALS->wave_script_args = wave_alloca(sizeof(struct wave_script_args) + 1); GLOBALS->wave_script_args->curr = NULL; GLOBALS->wave_script_args->next = NULL; GLOBALS->wave_script_args->payload[0] = 0; } ife->callback(); gtkwave_main_iteration(); GLOBALS->wave_script_args = NULL; } else { ife->callback(); gtkwave_main_iteration(); } GLOBALS->enable_fast_exit = fexit; GLOBALS->wave_script_args = old_wave_script_args; return(TCL_OK); /* signal error with rc=TCL_ERROR, Tcl_Obj *aobj = Tcl_NewStringObj(reportString, -1); Tcl_SetObjResult(interp, aobj); */ } /* XXXXXXXXXXXXXXXXXXXXXXXXX */ /* XXX RPC Tcl Variant XXX */ /* XXXXXXXXXXXXXXXXXXXXXXXXX */ char *rpc_script_execute(const char *nam) { char *tpnt = NULL; char *s; if((nam) && (strlen(nam)) && (!GLOBALS->tcl_running)) { int tclrc; int nlen = strlen(nam); char *tcl_cmd = wave_alloca(7 + nlen + 1); strcpy(tcl_cmd, "source "); strcpy(tcl_cmd+7, nam); GLOBALS->tcl_running = 1; tclrc = Tcl_Eval (GLOBALS->interp, tcl_cmd); GLOBALS->tcl_running = 0; if(tclrc != TCL_OK) { tpnt = strdup_2(Tcl_GetStringResult (GLOBALS->interp)); } else { tpnt = strdup_2("TCL_OK"); } } if(!tpnt) tpnt = strdup_2("TCL_ERROR : no filename specified"); s = malloc_2(strlen("--script ") + strlen(tpnt) + 1 + 1); sprintf(s, "%s%s\n", "--script ", tpnt); free_2(tpnt); return(s); } /* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */ /* XXX Bluespec Tcl Variant XXX */ /* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */ void gtkUpdate(ClientData ignore) { (void)ignore; while (gtk_events_pending()) { gtk_main_iteration(); } Tcl_CreateTimerHandler(50,gtkUpdate, (ClientData) NULL); /* ajb: was 0 period ...caused 100% CPU spike */ } int gtkwaveInterpreterInit(Tcl_Interp *interp) { int i; char commandName[128]; gtkwave_mlist_t *ife; int num_menu_items; #ifdef WAVE_TCL_STUBIFY /* not needed...this does a double init if enabled: set_globals_interp(); */ #else if(Tcl_Init(interp) == TCL_ERROR) return TCL_ERROR; if(Tk_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_SetVar(interp,"tcl_rcFileName","~/.wishrc",TCL_GLOBAL_ONLY); #endif strcpy(commandName, "gtkwave::"); ife = retrieve_menu_items_array(&num_menu_items); for(i=0;itcl_init_cmd) { Tcl_Eval(interp, GLOBALS->tcl_init_cmd); } Tcl_CreateTimerHandler(50,gtkUpdate, (ClientData) NULL); init_setvar_timer(interp); return TCL_OK; } /* XXXXXXXXXXXXXXXXXXXXXXXXXXXX */ /* XXX Simpod Tcl Variant XXX */ /* XXXXXXXXXXXXXXXXXXXXXXXXXXXX */ static gboolean repscript_timer(gpointer dummy) { (void)dummy; static gboolean run_once = FALSE; if(run_once == FALSE) /* avoid any race conditions with the toolkit for uninitialized data */ { run_once = TRUE; return(TRUE); } if((GLOBALS->repscript_name) && (!GLOBALS->tcl_running)) { int tclrc; int nlen = strlen(GLOBALS->repscript_name); char *tcl_cmd = wave_alloca(7 + nlen + 1); strcpy(tcl_cmd, "source "); strcpy(tcl_cmd+7, GLOBALS->repscript_name); GLOBALS->tcl_running = 1; tclrc = Tcl_Eval (GLOBALS->interp, tcl_cmd); GLOBALS->tcl_running = 0; #if WAVE_TCL_CHECK_VERSION(8,5,0) if(tclrc != TCL_OK) { Tcl_Obj *options; Tcl_Obj *key; Tcl_Obj *stackTrace; fprintf(stderr, "GTKWAVE | %s\n", Tcl_GetStringResult (GLOBALS->interp)); options = Tcl_GetReturnOptions(GLOBALS->interp, tclrc); key = Tcl_NewStringObj("-errorinfo", -1); Tcl_IncrRefCount(key); Tcl_DictObjGet(NULL, options, key, &stackTrace); Tcl_DecrRefCount(key); fprintf(stderr, "TCL Stack Trace\n%s\n", Tcl_GetStringFromObj(stackTrace, NULL)) ; /* Do something with stackTrace */ } #else if(tclrc != TCL_OK) { fprintf (stderr, "GTKWAVE | %s\n", Tcl_GetStringResult (GLOBALS->interp)); } #endif return(TRUE); } else { return(FALSE); } } void set_globals_interp(char *me, int install_tk) { #ifdef WAVE_TCL_STUBIFY if(NpCreateMainInterp(me, install_tk)) { GLOBALS->interp = NpGetMainInterp(); } else { fprintf(stderr, "GTKWAVE | Error, failed to find Tcl/Tk runtime libraries.\n"); fprintf(stderr, "GTKWAVE | Set the environment variable TCL_PLUGIN_DLL to point to\n"); fprintf(stderr, "GTKWAVE | the Tcl shared object file.\n"); exit(255); } #else (void)me; (void)install_tk; GLOBALS->interp = Tcl_CreateInterp(); #endif } void make_tcl_interpreter(char *argv[]) { int i; char commandName[32768]; gtkwave_mlist_t *ife; int num_menu_items; #if !((defined(__MACH__) && defined(__APPLE__))) int n = 0; #endif #ifndef WAVE_TCL_STUBIFY Tcl_FindExecutable(argv[0]); #endif #if (defined(__MACH__) && defined(__APPLE__)) { uint32_t size = sizeof(commandName); if(_NSGetExecutablePath(commandName, &size) == 0) { set_globals_interp(commandName, 0); } else { char *p = calloc_2(1, size+1); size++; if(_NSGetExecutablePath(p, &size) == 0) { set_globals_interp(p, 0); } else { fprintf(stderr, "GTKWAVE | Problem with _NSGetExecutablePath, exiting.\n"); exit(255); } free_2(p); } } #else #ifdef WIN32 if(!GetModuleFileName(NULL, commandName, 256)) n = -1 ; #else n = readlink("/proc/self/exe", commandName, 256) ; #endif if(n == -1) { fprintf(stderr, "GTKWAVE | Tcl_Init error: Failed to get my fullpath\n"); exit(EXIT_FAILURE); } else { commandName[n] = '\0' ; } set_globals_interp(commandName, 0); #endif #ifndef WAVE_TCL_STUBIFY if (TCL_OK != Tcl_Init(GLOBALS->interp)) { fprintf(stderr, "GTKWAVE | Tcl_Init error: %s\n", Tcl_GetStringResult (GLOBALS->interp)); exit(EXIT_FAILURE); } #endif strcpy(commandName, "gtkwave::"); ife = retrieve_menu_items_array(&num_menu_items); for(i=0;iinterp, commandName, (Tcl_ObjCmdProc *)menu_func, (ClientData)(ife+i), (Tcl_CmdDeleteProc *)NULL); } } for (i = 0; gtkwave_commands[i].func != NULL; i++) { strcpy(commandName + 9, gtkwave_commands[i].cmdstr); Tcl_CreateObjCommand(GLOBALS->interp, commandName, (Tcl_ObjCmdProc *)gtkwave_commands[i].func, (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); } declare_tclcb_variables(GLOBALS->interp); if(GLOBALS->repscript_name) { FILE *f = fopen(GLOBALS->repscript_name, "rb"); if(f) { fclose(f); g_timeout_add(GLOBALS->repscript_period, repscript_timer, NULL); } else { fprintf(stderr, "GTKWAVE | Could not open repscript '%s', exiting.\n", GLOBALS->repscript_name); perror("Why"); exit(255); } } init_setvar_timer(GLOBALS->interp); } /* blocking version which keeps recursive setvars from happening */ const char *gtkwavetcl_setvar(const char *name1, const char *val, int flags) { const char *rc = NULL; if(GLOBALS->interp && !GLOBALS->in_tcl_callback) { GLOBALS->in_tcl_callback = 1; rc = Tcl_SetVar(GLOBALS->interp, name1, val, flags); GLOBALS->in_tcl_callback = 0; } return(rc); } /* version which would be used, for example by timer interrupts */ const char *gtkwavetcl_setvar_nonblocking(const char *name1, const char *val, int flags) { const char *rc = NULL; if(GLOBALS->interp) { rc = Tcl_SetVar(GLOBALS->interp, name1, val, flags); } return(rc); } #else void make_tcl_interpreter(char *argv[]) { (void)argv; /* nothing */ } const char *gtkwavetcl_setvar(const char *name1, const char *val, int flags) { (void)name1; (void)val; (void) flags; return(NULL); } const char *gtkwavetcl_setvar_nonblocking(const char *name1, const char *val, int flags) { (void) name1; (void) val; (void) flags; return(NULL); } char *rpc_script_execute(const char *nam) { (void) nam; return(strdup_2("--script TCL_ERROR : Tcl support not compiled into gtkwave\n")); } #endif gtkwave-3.3.86/src/vcd_saver.h0000664000175000017500000000161713166335473015525 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2005. * * 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. */ #include "globals.h" #ifndef VCD_SAVER_H #define VCD_SAVER_H #include "vcd.h" #include "strace.h" enum vcd_export_typ { WAVE_EXPORT_VCD, WAVE_EXPORT_LXT, WAVE_EXPORT_TIM, WAVE_EXPORT_TRANS }; enum vcd_saver_rc { VCDSAV_OK, VCDSAV_EMPTY, VCDSAV_FILE_ERROR }; enum vcd_saver_tr_datatype { VCDSAV_IS_BIN, VCDSAV_IS_HEX, VCDSAV_IS_TEXT }; int save_nodes_to_export(const char *fname, int export_typ); int do_timfile_save(const char *fname); int save_nodes_to_trans(FILE *trans, Trptr t); /* from helpers/scopenav.c */ extern void free_hier(void); extern char *output_hier(int is_trans, char *name); #endif gtkwave-3.3.86/src/tree_component.c0000664000175000017500000000553013166335473016563 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2011. * * 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. */ #include #include "globals.h" #include "tree_component.h" #ifdef _WAVE_HAVE_JUDY /* Judy version */ void iter_through_comp_name_table(void) { Pvoid_t PJArray = GLOBALS->comp_name_judy; PPvoid_t PPValue; if(GLOBALS->comp_name_judy) { char *mem = malloc_2(GLOBALS->comp_name_total_stringmem); char **idx = GLOBALS->comp_name_idx = calloc_2(GLOBALS->comp_name_serial, sizeof(char *)); char *Index = calloc_2(GLOBALS->comp_name_longest + 1, sizeof(char)); char *pnt = mem; for (PPValue = JudySLFirst (PJArray, (uint8_t *)Index, PJE0); PPValue != (PPvoid_t) NULL; PPValue = JudySLNext (PJArray, (uint8_t *)Index, PJE0)) { int slen = strlen(Index); memcpy(pnt, Index, slen+1); idx[(*(char **)PPValue) - ((char *)NULL)] = pnt; pnt += (slen + 1); } free_2(Index); JudySLFreeArray(&GLOBALS->comp_name_judy, PJE0); GLOBALS->comp_name_judy = NULL; } } int add_to_comp_name_table(const char *s, int slen) { PPvoid_t PPValue = JudySLGet(GLOBALS->comp_name_judy, (uint8_t *)s, PJE0); if(PPValue) { return((*(char **)PPValue) - ((char *)NULL) + 1); } GLOBALS->comp_name_total_stringmem += (slen + 1); if(slen > GLOBALS->comp_name_longest) { GLOBALS->comp_name_longest = slen; } PPValue = JudySLIns(&GLOBALS->comp_name_judy, (uint8_t *)s, PJE0); *((char **)PPValue) = ((char *)NULL) + GLOBALS->comp_name_serial; return(++GLOBALS->comp_name_serial); /* always nonzero */ } #else /* JRB alternate (not as memory efficient initially) */ void iter_through_comp_name_table(void) { if(GLOBALS->comp_name_jrb) { char *mem = malloc_2(GLOBALS->comp_name_total_stringmem); char **idx = GLOBALS->comp_name_idx = calloc_2(GLOBALS->comp_name_serial, sizeof(char *)); char *Index; char *pnt = mem; JRB node; jrb_traverse(node, GLOBALS->comp_name_jrb) { Index = node->key.s; int slen = strlen(Index); memcpy(pnt, Index, slen+1); free_2(Index); idx[node->val.i] = pnt; pnt += (slen + 1); } jrb_free_tree(GLOBALS->comp_name_jrb); GLOBALS->comp_name_jrb = NULL; } } int add_to_comp_name_table(const char *s, int slen) { JRB str; Jval jv; if(!GLOBALS->comp_name_jrb) { GLOBALS->comp_name_jrb = make_jrb(); } str = jrb_find_str(GLOBALS->comp_name_jrb, s); if(str) { return(str->val.i + 1); } GLOBALS->comp_name_total_stringmem += (slen + 1); if(slen > GLOBALS->comp_name_longest) { GLOBALS->comp_name_longest = slen; } jv.i = GLOBALS->comp_name_serial; jrb_insert_str(GLOBALS->comp_name_jrb, strdup_2(s), jv); return(++GLOBALS->comp_name_serial); /* always nonzero */ } #endif gtkwave-3.3.86/src/status.c0000664000175000017500000001165513166335473015072 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2008 * * 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. */ #include "globals.h" #include #include #include "symbol.h" #include "lxt2_read.h" #include "lx2.h" /* Add some text to our text widget - this is a callback that is invoked when our window is realized. We could also force our window to be realized with gtk_widget_realize, but it would have to be part of a hierarchy first */ void status_text(char *str) { if(!GLOBALS->quiet_checkmenu) /* when gtkwave_mlist_t check menuitems are being initialized */ { int len = strlen(str); char ch = len ? str[len-1] : 0; if(GLOBALS->text_status_c_2) { #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) gtk_text_buffer_insert (GTK_TEXT_VIEW (GLOBALS->text_status_c_2)->buffer, &GLOBALS->iter_status_c_3, str, -1); #else gtk_text_insert (GTK_TEXT (GLOBALS->text_status_c_2), NULL, &GLOBALS->text_status_c_2->style->black, NULL, str, -1); #endif } else { fprintf(stderr, "GTKWAVE | %s%s", str, (ch=='\n') ? "" : "\n"); } { char *stemp = wave_alloca(len+1); strcpy(stemp, str); if(ch == '\n') { stemp[len-1] = 0; } gtkwavetcl_setvar(WAVE_TCLCB_STATUS_TEXT, stemp, WAVE_TCLCB_STATUS_TEXT_FLAGS); } } } void realize_text (GtkWidget *text, gpointer data) { (void)text; (void)data; char buf[128]; if(GLOBALS->is_vcd) { if(GLOBALS->partial_vcd) { status_text("VCD loading interactively.\n"); } else { status_text("VCD loaded successfully.\n"); } } else if(GLOBALS->is_lxt) { status_text("LXT loaded successfully.\n"); } else if(GLOBALS->is_ghw) { status_text("GHW loaded successfully.\n"); } else if(GLOBALS->is_lx2) { switch(GLOBALS->is_lx2) { case LXT2_IS_LXT2: status_text("LXT2 loaded successfully.\n"); break; case LXT2_IS_AET2: status_text("AET2 loaded successfully.\n"); break; case LXT2_IS_VZT: status_text("VZT loaded successfully.\n"); break; case LXT2_IS_VLIST: status_text("VCD loaded successfully.\n"); break; case LXT2_IS_FSDB: status_text("FSDB loaded successfully.\n"); break; } } sprintf(buf,"[%d] facilities found.\n",GLOBALS->numfacs); status_text(buf); if((GLOBALS->is_vcd)||(GLOBALS->is_ghw)) { if(!GLOBALS->partial_vcd) { sprintf(buf,"[%d] regions found.\n",GLOBALS->regions); status_text(buf); } } else { if(GLOBALS->is_lx2 == LXT2_IS_VLIST) { sprintf(buf,"Regions formed on demand.\n"); } else { sprintf(buf,"Regions loaded on demand.\n"); } status_text(buf); } } /* Create a scrolled text area that displays a "message" */ GtkWidget * create_text (void) { GtkWidget *table; GtkTooltips *tooltips; tooltips=gtk_tooltips_new_2(); gtk_tooltips_set_delay_2(tooltips,1500); /* Create a table to hold the text widget and scrollbars */ table = gtk_table_new (1, 16, FALSE); /* Put a text widget in the upper left hand corner. Note the use of * GTK_SHRINK in the y direction */ #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) GLOBALS->text_status_c_2 = gtk_text_view_new (); gtk_text_view_set_editable (GTK_TEXT_VIEW(GLOBALS->text_status_c_2), FALSE); gtk_text_buffer_get_start_iter (gtk_text_view_get_buffer(GTK_TEXT_VIEW (GLOBALS->text_status_c_2)), &GLOBALS->iter_status_c_3); GLOBALS->bold_tag_status_c_3 = gtk_text_buffer_create_tag (GTK_TEXT_VIEW (GLOBALS->text_status_c_2)->buffer, "bold", "weight", PANGO_WEIGHT_BOLD, NULL); #else GLOBALS->text_status_c_2 = gtk_text_new (NULL, NULL); gtk_text_set_editable(GTK_TEXT(GLOBALS->text_status_c_2), FALSE); #endif gtk_table_attach (GTK_TABLE (table), GLOBALS->text_status_c_2, 0, 14, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_SHRINK | GTK_EXPAND, 0, 0); gtk_widget_set_usize(GTK_WIDGET(GLOBALS->text_status_c_2), 100, 50); gtk_widget_show (GLOBALS->text_status_c_2); /* And a VScrollbar in the upper right */ #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) { GtkTextViewClass *tc = (GtkTextViewClass*)GTK_OBJECT_GET_CLASS(GTK_OBJECT(GLOBALS->text_status_c_2)); tc->set_scroll_adjustments(GTK_TEXT_VIEW (GLOBALS->text_status_c_2), NULL, NULL); GLOBALS->vscrollbar_status_c_2 = gtk_vscrollbar_new (GTK_TEXT_VIEW (GLOBALS->text_status_c_2)->vadjustment); } #else GLOBALS->vscrollbar_status_c_2 = gtk_vscrollbar_new ((GTK_TEXT (GLOBALS->text_status_c_2))->vadj); #endif gtk_table_attach (GTK_TABLE (table), GLOBALS->vscrollbar_status_c_2, 15, 16, 0, 1, GTK_FILL, GTK_FILL | GTK_SHRINK | GTK_EXPAND, 0, 0); gtk_widget_show (GLOBALS->vscrollbar_status_c_2); /* Add a handler to put a message in the text widget when it is realized */ gtk_signal_connect (GTK_OBJECT (GLOBALS->text_status_c_2), "realize", GTK_SIGNAL_FUNC (realize_text), NULL); gtk_tooltips_set_tip_2(tooltips, GLOBALS->text_status_c_2, "Status Window", NULL); return(table); } gtkwave-3.3.86/src/tcl_np.h0000664000175000017500000001046713166335473015033 0ustar bybellbybell/* * Copyright (c) 2003-2005 Active State Corporation. * See the file LICENSE.TXT for information on usage and redistribution * and for a DISCLAIMER OF ALL WARRANTIES. */ #ifndef WAVE_TCLNP_H #define WAVE_TCLNP_H #include #ifdef HAVE_LIBTCL #include /* ==== Np... Begin */ # define NpPlatformMsg(s1, s2) printf("TCLINIT | Platform: %s\n\t%s\n", s1, s2) # define NpLog(x,y) printf("TCLINIT | " x, y) # define NpLog3(x,y,z) printf("TCLINIT | " x, y, z) # define NpPanic(x) fprintf(stderr, "TCLINIT | "x) #include #if (TCL_MAJOR_VERSION < 8) \ || ((TCL_MAJOR_VERSION == 8) && (TCL_MINOR_VERSION < 4)) #error "Gtkwave requires Tcl 8.4+" #endif #ifndef TCL_TSD_INIT #define TCL_TSD_INIT(keyPtr) (ThreadSpecificData *)Tcl_GetThreadData((keyPtr), sizeof(ThreadSpecificData)) #endif #define TCL_OBJ_CMD(cmd) int (cmd)(ClientData clientData, \ Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) #ifdef HAVE_STDLIB_H #include /* for getenv */ #endif #ifdef WIN32 # include # define dlclose(path) ((void *) FreeLibrary((HMODULE) path)) # define DLSYM(handle, symbol, type, proc) \ (proc = (type) GetProcAddress((HINSTANCE) handle, symbol)) # define snprintf _snprintf # define HAVE_UNISTD_H 1 # ifndef F_OK # define F_OK 0 # endif # ifndef SHLIB_SUFFIX # define SHLIB_SUFFIX ".dll" # endif #elif (defined(__MACH__) && defined(__APPLE__)) /* Mac OS X */ # include /* # include */ /* Commented out: ajb 25sep11 */ # if HAVE_UNISTD_H # include # include # endif # ifndef SHLIB_SUFFIX # define SHLIB_SUFFIX ".dylib" # endif # include # define HMODULE void * # define DLSYM(handle, symbol, type, proc) \ (proc = (type) dlsym(handle, symbol)) # define HIBYTE(i) (i >> 8) # define LOBYTE(i) (i & 0xff) #else /* UNIX */ #ifdef __CYGWIN__ # define SHLIB_SUFFIX ".dll" #endif # include # define HIBYTE(i) (i >> 8) # define LOBYTE(i) (i & 0xff) # if HAVE_UNISTD_H # include # include # endif # if (!defined(HAVE_DLADDR) && defined(__hpux)) /* HPUX requires shl_* routines */ # include # define HMODULE shl_t # define dlopen(libname, flags) shl_load(libname, \ BIND_DEFERRED|BIND_VERBOSE|DYNAMIC_PATH, 0L) # define dlclose(path) shl_unload((shl_t) path) # define DLSYM(handle, symbol, type, proc) \ if (shl_findsym(&handle, symbol, (short) TYPE_PROCEDURE, \ (void *) &proc) != 0) { proc = NULL; } # ifndef SHLIB_SUFFIX # define SHLIB_SUFFIX ".sl" # endif # else # include # define HMODULE void * # define DLSYM(handle, symbol, type, proc) \ (proc = (type) dlsym(handle, symbol)) # ifndef SHLIB_SUFFIX # define SHLIB_SUFFIX ".so" # endif /* * FIX: For other non-dl systems, we need alternatives here */ # endif /* * Shared functions: */ #endif /* PLATFORM DEFS */ #ifndef MAX_PATH #define MAX_PATH 1024 #endif /* * Tcl Plugin version identifiers * (the 3 strings are computed from the 4 internal numbers) */ #define NPTCL_VERSION PACKAGE_VERSION #define NPTCL_PATCH_LEVEL PACKAGE_PATCHLEVEL #define NPTCL_INTERNAL_VERSION PACKAGE_PATCHLEVEL #define NPTCL_MAJOR_VERSION 3 #define NPTCL_MINOR_VERSION 0 #define NPTCL_RELEASE_LEVEL 0 #define NPTCL_RELEASE_SERIAL 1 #ifdef BUILD_nptcl #undef TCL_STORAGE_CLASS #define TCL_STORAGE_CLASS DLLEXPORT #endif /* BUILD_nptcl */ /* * Netscape APIs (needs system specific headers) * AIX predefines certain types that we must redefine. */ #ifdef _AIX #define _PR_AIX_HAVE_BSD_INT_TYPES 1 #endif /* #include "npapi.h" */ /* * The following constant is used to tell Netscape that the plugin will * accept whatever amount of input is available on a stream. */ #define MAXINPUTSIZE 0X0FFFFFFF /* * Define the names of token tables used in the plugin: */ #define NPTCL_INSTANCE "npInstance" #define NPTCL_STREAM "npStream" #ifndef NP_LOG #define NP_LOG ((char *) NULL) #endif /* * Procedures shared between various modules in the plugin: */ /* * npinterp.c */ extern Tcl_Interp *NpCreateMainInterp(char *me, int install_tk); extern Tcl_Interp *NpGetMainInterp(void); extern void NpDestroyMainInterp(void); extern Tcl_Interp *NpGetInstanceInterp(int install_tk); extern void NpDestroyInstanceInterp(Tcl_Interp *interp); /* ==== Np... End */ #endif #endif gtkwave-3.3.86/src/tree_component.h0000664000175000017500000000104013166335473016560 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2011. * * 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. */ #include "debug.h" #ifdef _WAVE_HAVE_JUDY #include #else #include "jrb.h" #endif #ifndef WAVE_TREE_COMP_H #define WAVE_TREE_COMP_H void iter_through_comp_name_table(void); int add_to_comp_name_table(const char *s, int slen); #endif gtkwave-3.3.86/src/tcl_helper.h0000664000175000017500000000522313166335473015667 0ustar bybellbybell/* * Copyright (c) Tony Bybell and Concept Engineering GmbH 2008-2009. * * 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. */ #ifndef WAVE_TCLHELPER_H #define WAVE_TCLHELPER_H #include #include "tcl_callbacks.h" #ifdef HAVE_LIBTCL #include #include #include "debug.h" #define WAVE_TCL_CHECK_VERSION(major,minor,micro) \ (TCL_MAJOR_VERSION > (major) || \ (TCL_MAJOR_VERSION == (major) && TCL_MINOR_VERSION > (minor)) || \ (TCL_MAJOR_VERSION == (major) && TCL_MINOR_VERSION == (minor) && \ TCL_RELEASE_SERIAL >= (micro))) typedef struct { const char *cmdstr; int (*func)(); } tcl_cmdstruct; extern tcl_cmdstruct gtkwave_commands[]; #endif #define WAVE_OE_ME \ if(one_entry) \ { \ if(!mult_entry) \ { \ mult_entry = one_entry; \ mult_len = strlen(mult_entry); \ } \ else \ { \ int sing_len = strlen(one_entry); \ mult_entry = realloc_2(mult_entry, mult_len + sing_len + 1); \ strcpy(mult_entry + mult_len, one_entry); \ mult_len += sing_len; \ } \ } struct iter_dnd_strings { char *one_entry; char *mult_entry; int mult_len; }; typedef enum {LL_NONE, LL_INT, LL_UINT, LL_CHAR, LL_SHORT, LL_STR, LL_VOID_P, LL_TIMETYPE} ll_elem_type; typedef union llist_payload { int i ; unsigned int u ; char c ; short s ; char *str ; void *p ; TimeType tt ; } llist_u; typedef struct llist_s { llist_u u; struct llist_s *prev ; struct llist_s *next ; } llist_p ; int process_url_file(char *s); int process_url_list(char *s); int process_tcl_list(char *s, gboolean track_mouse_y); char *add_dnd_from_searchbox(void); char *add_dnd_from_signal_window(void); char *add_traces_from_signal_window(gboolean is_from_tcl_command); char *add_dnd_from_tree_window(void); char *emit_gtkwave_savefile_formatted_entries_in_tcl_list(Trptr trhead, gboolean use_tcl_mode); char* zMergeTclList(int argc, const char** argv); char** zSplitTclList(const char* list, int* argcPtr); char *make_single_tcl_list_name(char *s, char *opt_value, int promote_to_bus, int preserve_range); void make_tcl_interpreter(char *argv[]); const char *gtkwavetcl_setvar(const char *name1, const char *val, int flags); const char *gtkwavetcl_setvar_nonblocking(const char *name1, const char *val, int flags); char *rpc_script_execute(const char *nam); #ifdef HAVE_LIBTCL int gtkwaveInterpreterInit (Tcl_Interp *interp); void set_globals_interp(char *me, int install_tk); #endif #endif gtkwave-3.3.86/src/hierpack.c0000664000175000017500000001072613166335473015333 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2008-2017. * * 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. */ #include "hierpack.h" #define VLI_SIZE (10) static void out_c(unsigned char ch) { if((GLOBALS->fmem_buf_offs+1) >= GLOBALS->fmem_buf_siz) { GLOBALS->fmem_buf = realloc_2(GLOBALS->fmem_buf, GLOBALS->fmem_buf_siz = 2 * GLOBALS->fmem_buf_siz); } GLOBALS->fmem_buf[GLOBALS->fmem_buf_offs++] = ch; } static int enc_var(size_t v, unsigned char *buf) { size_t nxt; unsigned char *pnt = buf+VLI_SIZE; while((nxt = v>>7)) { *(--pnt) = (v&0x7f) | 0x80; v = nxt; } *(--pnt) = (v&0x7f); return(buf+VLI_SIZE-pnt); } static void out_write(unsigned char *s, int len) { int i; for(i=0;ido_hier_compress) { fprintf(stderr, "FACPACK | Using compressed facilities\n"); GLOBALS->fmem_buf_offs = 0; GLOBALS->fmem_buf_siz = 1024*1024; GLOBALS->fmem_buf = malloc_2(GLOBALS->fmem_buf_siz); GLOBALS->hp_buf_siz = 1024; GLOBALS->hp_buf = calloc_2(GLOBALS->hp_buf_siz, sizeof(unsigned char)); GLOBALS->hp_offs = calloc_2(GLOBALS->hp_buf_siz, sizeof(size_t)); } } void freeze_facility_pack(void) { if(GLOBALS->do_hier_compress) { free_2(GLOBALS->hp_buf); GLOBALS->hp_buf = NULL; free_2(GLOBALS->hp_offs); GLOBALS->hp_offs = NULL; GLOBALS->hp_buf_siz = 0; if(GLOBALS->fmem_buf) { GLOBALS->fmem_buf = realloc_2(GLOBALS->fmem_buf, GLOBALS->hp_prev); } fprintf(stderr, "FACPACK | Compressed %lu to %lu bytes.\n", (unsigned long)GLOBALS->fmem_uncompressed_siz, (unsigned long)GLOBALS->hp_prev); } } char *compress_facility(unsigned char *key, unsigned int len) { size_t mat = 0; size_t plen; size_t i; unsigned char vli[VLI_SIZE]; if(len > GLOBALS->hp_buf_siz) { GLOBALS->hp_buf_siz = len; GLOBALS->hp_buf = realloc_2(GLOBALS->hp_buf, GLOBALS->hp_buf_siz * sizeof(unsigned char)); GLOBALS->hp_offs = realloc_2(GLOBALS->hp_offs, GLOBALS->hp_buf_siz * sizeof(size_t)); } GLOBALS->fmem_uncompressed_siz += (len + 1); for(i=0;i<=len;i++) { if(!key[i]) break; mat = i; if(key[i] != GLOBALS->hp_buf[i]) break; } if(!mat) { GLOBALS->hp_prev += (plen = enc_var(mat, vli)); out_write(vli+VLI_SIZE-plen, plen); } else { size_t back = GLOBALS->hp_prev - GLOBALS->hp_offs[mat-1]; plen = enc_var(back, vli); if(mat > plen) { GLOBALS->hp_prev += plen; out_write(vli+VLI_SIZE-plen, plen); } else { mat = 0; GLOBALS->hp_prev += (plen = enc_var(mat, vli)); out_write(vli+VLI_SIZE-plen, plen); } } out_c(0); GLOBALS->hp_prev++; for(i=mat;ihp_buf[i] = key[i]; GLOBALS->hp_offs[i] = GLOBALS->hp_prev; GLOBALS->hp_prev++; } GLOBALS->hp_buf[i] = 0; GLOBALS->hp_offs[i] = 0; return( (((GLOBALS->hp_prev-1)<<1)|1) + ((char *)NULL) ); /* flag value with |1 to indicate is compressed */ } char *hier_decompress_flagged(char *n, int *was_packed) { size_t dcd; size_t dcd2; size_t val; char *str; int ob; int shamt; int avoid_strdup = *was_packed; *was_packed = GLOBALS->do_hier_compress; if(!GLOBALS->do_hier_compress) { return(n); } dcd = n - ((char *)NULL); if(!(dcd & 1)) /* value was flagged with |1 to indicate is compressed; malloc never returns this */ { *was_packed = 0; return(n); } dcd >>= 1; str = GLOBALS->module_tree_c_1; ob = GLOBALS->longestname + 1; str[--ob] = 0; do { while(GLOBALS->fmem_buf[dcd]) { str[--ob] = GLOBALS->fmem_buf[dcd]; dcd--; } dcd2 = --dcd; val = 0; shamt = 0; for(;;) { val |= ((GLOBALS->fmem_buf[dcd2] & 0x7f) << shamt); shamt += 7; if(!(GLOBALS->fmem_buf[dcd2] & 0x80)) break; dcd2--; } dcd = dcd2 - val; } while(val); return((avoid_strdup != HIER_DEPACK_ALLOC) ? (str+ob) : strdup_2(str+ob)); } void hier_auto_enable(void) { if((!GLOBALS->do_hier_compress) && (!GLOBALS->disable_auto_comphier) && (GLOBALS->numfacs >= HIER_AUTO_ENABLE_CNT)) { GLOBALS->do_hier_compress = 1; } } gtkwave-3.3.86/src/status.h0000664000175000017500000000057413166335473015075 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010 * * 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. */ #ifndef WAVE_STATUS_H #define WAVE_STATUS_H void status_text(char *str); #endif gtkwave-3.3.86/src/hierpack.h0000664000175000017500000000127213166335473015334 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2008-2017. * * 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. */ #ifndef WAVE_HIERPACK_H #define WAVE_HIERPACK_H #include "globals.h" #define HIER_DEPACK_ALLOC (0) #define HIER_DEPACK_STATIC (1) #define HIER_AUTO_ENABLE_CNT (500000) void init_facility_pack(void); char *compress_facility(unsigned char *key, unsigned int len); void freeze_facility_pack(void); char *hier_decompress_flagged(char *n, int *was_packed); void hier_auto_enable(void); #endif gtkwave-3.3.86/src/tcl_commands.c0000664000175000017500000015252413166335473016213 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2008-2014. * * 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. */ #include #include "globals.h" #include #include #if WAVE_USE_GTK2 #include #endif #include #include #include #include #include #include "gtk12compat.h" #include "analyzer.h" #include "tree.h" #include "symbol.h" #include "vcd.h" #include "lx2.h" #include "busy.h" #include "debug.h" #include "hierpack.h" #include "menu.h" #include "tcl_helper.h" #include "tcl_support_commands.h" #if !defined __MINGW32__ && !defined _MSC_VER #include #include #endif #if defined(HAVE_LIBTCL) #include #endif #ifdef _MSC_VER #define strcasecmp _stricmp #endif /* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */ /* XXX functions for embedding TCL interpreter XXX */ /* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */ #if defined(HAVE_LIBTCL) static int gtkwavetcl_badNumArgs(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], int expected) { (void)clientData; Tcl_Obj *aobj; char reportString[1024]; sprintf(reportString, "* wrong number of arguments for '%s': %d expected, %d encountered", Tcl_GetString(objv[0]), expected, objc-1); aobj = Tcl_NewStringObj(reportString, -1); Tcl_SetObjResult(interp, aobj); return(TCL_ERROR); } static int gtkwavetcl_nop(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { (void)clientData; (void)interp; (void)objc; (void)objv; /* nothing, this is simply to call gtk's main loop */ gtkwave_main_iteration(); return(TCL_OK); } static int gtkwavetcl_printInteger(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], int intVal) { (void)clientData; (void)objc; (void)objv; Tcl_Obj *aobj; char reportString[33]; sprintf(reportString, "%d", intVal); aobj = Tcl_NewStringObj(reportString, -1); Tcl_SetObjResult(interp, aobj); return(TCL_OK); } static int gtkwavetcl_printTimeType(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], TimeType ttVal) { (void)clientData; (void)objc; (void)objv; Tcl_Obj *aobj; char reportString[65]; sprintf(reportString, TTFormat, ttVal); aobj = Tcl_NewStringObj(reportString, -1); Tcl_SetObjResult(interp, aobj); return(TCL_OK); } static int gtkwavetcl_printDouble(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], double dVal) { (void)clientData; (void)objc; (void)objv; Tcl_Obj *aobj; char reportString[65]; sprintf(reportString, "%e", dVal); aobj = Tcl_NewStringObj(reportString, -1); Tcl_SetObjResult(interp, aobj); return(TCL_OK); } static int gtkwavetcl_printString(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], const char *reportString) { (void)clientData; (void)objc; (void)objv; Tcl_Obj *aobj; aobj = Tcl_NewStringObj(reportString, -1); Tcl_SetObjResult(interp, aobj); return(TCL_OK); } static char *extractFullTraceName(Trptr t) { char *name = NULL; if(HasWave(t)) { if (HasAlias(t)) { name = strdup_2(t->name_full); } else if (t->vector) { name = strdup_2(t->n.vec->bvname); } else { int flagged = HIER_DEPACK_ALLOC; name = hier_decompress_flagged(t->n.nd->nname, &flagged); if(!flagged) { name = strdup_2(name); } } } return(name); } /* tcl interface functions */ char *get_Tcl_string(Tcl_Obj *obj) { char *s = Tcl_GetString(obj) ; if (*s == '{') { /* braced string */ char *p = strrchr(s, '}') ; if(p) { if(GLOBALS->previous_braced_tcl_string) { free_2(GLOBALS->previous_braced_tcl_string); } GLOBALS->previous_braced_tcl_string = strdup_2(s); GLOBALS->previous_braced_tcl_string[p-s] = 0; s = GLOBALS->previous_braced_tcl_string + 1; } } return s ; } static int gtkwavetcl_getNumFacs(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int value = GLOBALS->numfacs; return(gtkwavetcl_printInteger(clientData, interp, objc, objv, value)); } static int gtkwavetcl_getLongestName(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int value = GLOBALS->longestname; return(gtkwavetcl_printInteger(clientData, interp, objc, objv, value)); } static int gtkwavetcl_getFacName(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { Tcl_Obj *aobj; if(objc == 2) { char *s = get_Tcl_string(objv[1]); int which = atoi(s); if((which >= 0) && (which < GLOBALS->numfacs)) { int was_packed = HIER_DEPACK_ALLOC; char *hfacname = NULL; hfacname = hier_decompress_flagged(GLOBALS->facs[which]->name, &was_packed); aobj = Tcl_NewStringObj(hfacname, -1); Tcl_SetObjResult(interp, aobj); if(was_packed) free_2(hfacname); } } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } return(TCL_OK); } static int gtkwavetcl_getMinTime(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { TimeType value = GLOBALS->min_time; return(gtkwavetcl_printTimeType(clientData, interp, objc, objv, value)); } static int gtkwavetcl_getMaxTime(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { TimeType value = GLOBALS->max_time; return(gtkwavetcl_printTimeType(clientData, interp, objc, objv, value)); } static int gtkwavetcl_getTimeZero(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { TimeType value = GLOBALS->global_time_offset; return(gtkwavetcl_printTimeType(clientData, interp, objc, objv, value)); } static int gtkwavetcl_getTimeDimension(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { (void)clientData; (void)objc; (void)objv; Tcl_Obj *aobj; char reportString[2]; reportString[0] = GLOBALS->time_dimension; reportString[1] = 0; aobj = Tcl_NewStringObj(reportString, -1); Tcl_SetObjResult(interp, aobj); return(TCL_OK); } static int gtkwavetcl_getArgv(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { (void)clientData; (void)objc; (void)objv; if(GLOBALS->argvlist) { Tcl_Obj *aobj = Tcl_NewStringObj(GLOBALS->argvlist, -1); Tcl_SetObjResult(interp, aobj); } return(TCL_OK); } static int gtkwavetcl_getBaselineMarker(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { TimeType value = GLOBALS->tims.baseline; return(gtkwavetcl_printTimeType(clientData, interp, objc, objv, value)); } static int gtkwavetcl_getMarker(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { TimeType value = GLOBALS->tims.marker; return(gtkwavetcl_printTimeType(clientData, interp, objc, objv, value)); } static int gtkwavetcl_getWindowStartTime(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { TimeType value = GLOBALS->tims.start; return(gtkwavetcl_printTimeType(clientData, interp, objc, objv, value)); } static int gtkwavetcl_getWindowEndTime(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { TimeType value = GLOBALS->tims.end; return(gtkwavetcl_printTimeType(clientData, interp, objc, objv, value)); } static int gtkwavetcl_getDumpType(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { (void)clientData; (void)objc; (void)objv; Tcl_Obj *aobj; char *reportString = "UNKNOWN"; if(GLOBALS->is_vcd) { if(GLOBALS->partial_vcd) { reportString = "PVCD"; } else { reportString = "VCD"; } } else if(GLOBALS->is_lxt) { reportString = "LXT"; } else if(GLOBALS->is_ghw) { reportString = "GHW"; } else if(GLOBALS->is_lx2) { switch(GLOBALS->is_lx2) { case LXT2_IS_LXT2: reportString = "LXT2"; break; case LXT2_IS_AET2: reportString = "AET2"; break; case LXT2_IS_VZT: reportString = "VZT"; break; case LXT2_IS_VLIST:reportString = "VCD"; break; case LXT2_IS_FST: reportString = "FST"; break; case LXT2_IS_FSDB: reportString = "FSDB"; break; } } aobj = Tcl_NewStringObj(reportString, -1); Tcl_SetObjResult(interp, aobj); return(TCL_OK); } static int gtkwavetcl_getNamedMarker(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 2) { char *s = get_Tcl_string(objv[1]); int which = -1; if((s[0]>='A')&&(s[0]<='Z')) { which = bijective_marker_id_string_hash(s); } else if((s[0]>='a')&&(s[0]<='z')) { which = bijective_marker_id_string_hash(s); } else { which = atoi(s); } if((which >= 0) && (which < WAVE_NUM_NAMED_MARKERS)) { TimeType value = GLOBALS->named_markers[which]; return(gtkwavetcl_printTimeType(clientData, interp, objc, objv, value)); } } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } return(TCL_OK); } static int gtkwavetcl_getWaveHeight(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int value = GLOBALS->waveheight; return(gtkwavetcl_printInteger(clientData, interp, objc, objv, value)); } static int gtkwavetcl_getWaveWidth(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int value = GLOBALS->wavewidth; return(gtkwavetcl_printInteger(clientData, interp, objc, objv, value)); } static int gtkwavetcl_getPixelsUnitTime(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { double value = GLOBALS->pxns; return(gtkwavetcl_printDouble(clientData, interp, objc, objv, value)); } static int gtkwavetcl_getUnitTimePixels(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { double value = GLOBALS->nspx; return(gtkwavetcl_printDouble(clientData, interp, objc, objv, value)); } static int gtkwavetcl_getZoomFactor(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { double value = GLOBALS->tims.zoom; return(gtkwavetcl_printDouble(clientData, interp, objc, objv, value)); } static int gtkwavetcl_getDumpFileName(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { char *value = GLOBALS->loaded_file_name; return(gtkwavetcl_printString(clientData, interp, objc, objv, value)); } static int gtkwavetcl_getVisibleNumTraces(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int value = GLOBALS->traces.visible; return(gtkwavetcl_printInteger(clientData, interp, objc, objv, value)); } static int gtkwavetcl_getTotalNumTraces(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int value = GLOBALS->traces.total; return(gtkwavetcl_printInteger(clientData, interp, objc, objv, value)); } static int gtkwavetcl_getTraceNameFromIndex(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 2) { char *s = get_Tcl_string(objv[1]); int which = atoi(s); if((which >= 0) && (which < GLOBALS->traces.total)) { Trptr t = GLOBALS->traces.first; int i = 0; while(t) { if(i == which) { if(t->name) { return(gtkwavetcl_printString(clientData, interp, objc, objv, t->name)); } else { break; } } i++; t = t->t_next; } } } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 2)); } return(TCL_OK); } static int gtkwavetcl_getTraceFlagsFromIndex(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 2) { char *s = get_Tcl_string(objv[1]); int which = atoi(s); if((which >= 0) && (which < GLOBALS->traces.total)) { Trptr t = GLOBALS->traces.first; int i = 0; while(t) { if(i == which) { return(gtkwavetcl_printInteger(clientData, interp, objc, objv, t->flags)); } i++; t = t->t_next; } } } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } return(TCL_OK); } static int gtkwavetcl_getTraceValueAtMarkerFromIndex(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 2) { char *s = get_Tcl_string(objv[1]); int which = atoi(s); if((which >= 0) && (which < GLOBALS->traces.total)) { Trptr t = GLOBALS->traces.first; int i = 0; while(t) { if(i == which) { if(t->asciivalue) { char *pnt = t->asciivalue; if(*pnt == '=') pnt++; return(gtkwavetcl_printString(clientData, interp, objc, objv, pnt)); } else { break; } } i++; t = t->t_next; } } } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } return(TCL_OK); } static int gtkwavetcl_getTraceValueAtMarkerFromName(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 2) { char *s = get_Tcl_string(objv[1]); Trptr t = GLOBALS->traces.first; while(t) { if(!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { char *name = extractFullTraceName(t); if(!strcmp(name, s)) { free_2(name); break; } free_2(name); } t = t-> t_next; } if(t) { if(t->asciivalue) { char *pnt = t->asciivalue; if(*pnt == '=') pnt++; return(gtkwavetcl_printString(clientData, interp, objc, objv, pnt)); } } } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } return(TCL_OK); } static int gtkwavetcl_getTraceValueAtNamedMarkerFromName(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 3) { char *sv = get_Tcl_string(objv[1]); int which = -1; TimeType oldmarker = GLOBALS->tims.marker; TimeType value = LLDescriptor(-1); if((sv[0]>='A')&&(sv[0]<='Z')) { which = bijective_marker_id_string_hash(sv); } else if((sv[0]>='a')&&(sv[0]<='z')) { which = bijective_marker_id_string_hash(sv); } else { which = atoi(sv); } if((which >= 0) && (which < WAVE_NUM_NAMED_MARKERS)) { char *s = get_Tcl_string(objv[2]); Trptr t = GLOBALS->traces.first; value = GLOBALS->named_markers[which]; while(t) { if(!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { char *name = extractFullTraceName(t); if(!strcmp(name, s)) { free_2(name); break; } free_2(name); } t = t-> t_next; } if(t && (value >= LLDescriptor(0))) { GLOBALS->tims.marker = value; GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); gtkwave_main_iteration(); if(t->asciivalue) { Tcl_Obj *aobj; char *pnt = t->asciivalue; if(*pnt == '=') pnt++; aobj = Tcl_NewStringObj(pnt, -1); Tcl_SetObjResult(interp, aobj); GLOBALS->tims.marker = oldmarker; update_markertime(GLOBALS->tims.marker); GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); gtkwave_main_iteration(); return(TCL_OK); } GLOBALS->tims.marker = oldmarker; update_markertime(GLOBALS->tims.marker); GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); gtkwave_main_iteration(); } } } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } return(TCL_OK); } static int gtkwavetcl_getHierMaxLevel(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int value = GLOBALS->hier_max_level; return(gtkwavetcl_printInteger(clientData, interp, objc, objv, value)); } static int gtkwavetcl_getFontHeight(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int value = GLOBALS->fontheight; return(gtkwavetcl_printInteger(clientData, interp, objc, objv, value)); } static int gtkwavetcl_getLeftJustifySigs(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int value = (GLOBALS->left_justify_sigs != 0); return(gtkwavetcl_printInteger(clientData, interp, objc, objv, value)); } static int gtkwavetcl_getSaveFileName(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { char *value = GLOBALS->filesel_writesave; if(value) { return(gtkwavetcl_printString(clientData, interp, objc, objv, value)); } return(TCL_OK); } static int gtkwavetcl_getStemsFileName(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { char *value = GLOBALS->stems_name; if(value) { return(gtkwavetcl_printString(clientData, interp, objc, objv, value)); } return(TCL_OK); } static int gtkwavetcl_getTraceScrollbarRowValue(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { GtkAdjustment *wadj=GTK_ADJUSTMENT(GLOBALS->wave_vslider); int value = (int)wadj->value; return(gtkwavetcl_printInteger(clientData, interp, objc, objv, value)); } static int gtkwavetcl_setMarker(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 2) { char *s = get_Tcl_string(objv[1]); TimeType mrk = unformat_time(s, GLOBALS->time_dimension); if((mrk >= GLOBALS->min_time) && (mrk <= GLOBALS->max_time)) { GLOBALS->tims.marker = mrk; } else { GLOBALS->tims.marker = LLDescriptor(-1); } update_markertime(GLOBALS->tims.marker); GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); gtkwave_main_iteration(); } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } return(TCL_OK); } static int gtkwavetcl_setBaselineMarker(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 2) { char *s = get_Tcl_string(objv[1]); TimeType mrk = unformat_time(s, GLOBALS->time_dimension); if((mrk >= GLOBALS->min_time) && (mrk <= GLOBALS->max_time)) { GLOBALS->tims.baseline = mrk; } else { GLOBALS->tims.baseline = LLDescriptor(-1); } update_markertime(GLOBALS->tims.marker); GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); gtkwave_main_iteration(); } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } return(TCL_OK); } static int gtkwavetcl_setWindowStartTime(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 2) { char *s = get_Tcl_string(objv[1]); if(s) { TimeType gt; char timval[40]; GtkAdjustment *hadj; TimeType pageinc; gt=unformat_time(s, GLOBALS->time_dimension); if(gttims.first) gt=GLOBALS->tims.first; else if(gt>GLOBALS->tims.last) gt=GLOBALS->tims.last; hadj=GTK_ADJUSTMENT(GLOBALS->wave_hslider); hadj->value=gt; pageinc=(TimeType)(((gdouble)GLOBALS->wavewidth)*GLOBALS->nspx); if(gt<(GLOBALS->tims.last-pageinc+1)) GLOBALS->tims.timecache=gt; else { GLOBALS->tims.timecache=GLOBALS->tims.last-pageinc+1; if(GLOBALS->tims.timecachetims.first) GLOBALS->tims.timecache=GLOBALS->tims.first; } reformat_time(timval,GLOBALS->tims.timecache,GLOBALS->time_dimension); time_update(); } signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); gtkwave_main_iteration(); } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } return(TCL_OK); } static int gtkwavetcl_setZoomFactor(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 2) { char *s = get_Tcl_string(objv[1]); float f; sscanf(s, "%f", &f); if(f>0.0) { f=0.0; /* in case they try to go out of range */ } else if(f<-62.0) { f=-62.0; /* in case they try to go out of range */ } GLOBALS->tims.prevzoom=GLOBALS->tims.zoom; GLOBALS->tims.zoom=(gdouble)f; calczoom(GLOBALS->tims.zoom); fix_wavehadj(); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "changed"); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "value_changed"); gtkwave_main_iteration(); } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } return(TCL_OK); } static int gtkwavetcl_setZoomRangeTimes(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 3) { char *s, *t; TimeType time1, time2; TimeType oldmarker = GLOBALS->tims.marker; s = get_Tcl_string(objv[1]); time1 = unformat_time(s, GLOBALS->time_dimension); t = get_Tcl_string(objv[2]); time2 = unformat_time(t, GLOBALS->time_dimension); if(time1 < GLOBALS->tims.first) { time1 = GLOBALS->tims.first; } if(time1 > GLOBALS->tims.last) { time1 = GLOBALS->tims.last; } if(time2 < GLOBALS->tims.first) { time2 = GLOBALS->tims.first; } if(time2 > GLOBALS->tims.last) { time2 = GLOBALS->tims.last; } service_dragzoom(time1, time2); GLOBALS->tims.marker = oldmarker; GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); gtkwave_main_iteration(); } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } return(TCL_OK); } static int gtkwavetcl_setLeftJustifySigs(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 2) { char *s = get_Tcl_string(objv[1]); TimeType val = atoi_64(s); GLOBALS->left_justify_sigs = (val != LLDescriptor(0)) ? ~0 : 0; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); gtkwave_main_iteration(); } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } return(TCL_OK); } static int gtkwavetcl_setNamedMarker(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if((objc == 3)||(objc == 4)) { char *s = get_Tcl_string(objv[1]); int which = -1; if((s[0]>='A')&&(s[0]<='Z')) { which = bijective_marker_id_string_hash(s); } else if((s[0]>='a')&&(s[0]<='z')) { which = bijective_marker_id_string_hash(s); } else { which = atoi(s); } if((which >= 0) && (which < WAVE_NUM_NAMED_MARKERS)) { char *t = get_Tcl_string(objv[2]); TimeType gt=unformat_time(t, GLOBALS->time_dimension); GLOBALS->named_markers[which] = gt; if(GLOBALS->marker_names[which]) { free_2(GLOBALS->marker_names[which]); GLOBALS->marker_names[which] = NULL; } if(objc == 4) { char *u = get_Tcl_string(objv[3]); GLOBALS->marker_names[which] = strdup_2(u); } wavearea_configure_event(GLOBALS->wavearea, NULL); gtkwave_main_iteration(); } } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 2)); } return(TCL_OK); } static int gtkwavetcl_setTraceScrollbarRowValue(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 2) { char *s = get_Tcl_string(objv[1]); int target = atoi(s); SetTraceScrollbarRowValue(target, 0); /* GtkAdjustment *wadj=GTK_ADJUSTMENT(GLOBALS->wave_vslider); */ /* int num_traces_displayable=(GLOBALS->signalarea->allocation.height)/(GLOBALS->fontheight); */ /* num_traces_displayable--; /\* for the time trace that is always there *\/ */ /* if(target > GLOBALS->traces.visible - num_traces_displayable) target = GLOBALS->traces.visible - num_traces_displayable; */ /* if(target < 0) target = 0; */ /* wadj->value = target; */ /* gtk_signal_emit_by_name (GTK_OBJECT (wadj), "changed"); /\* force bar update *\/ */ /* gtk_signal_emit_by_name (GTK_OBJECT (wadj), "value_changed"); /\* force text update *\/ */ /* gtkwave_main_iteration(); */ } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } return(TCL_OK); } static int gtkwavetcl_addSignalsFromList(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int i; char *one_entry = NULL, *mult_entry = NULL; unsigned int mult_len = 0; int num_found = 0; char reportString[33]; Tcl_Obj *aobj; if(objc==2) { char *s = Tcl_GetString(objv[1]); /* do not want to remove braces! */ char** elem = NULL; int l = 0; elem = zSplitTclList(s, &l); if(elem) { for(i=0;isignalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); gtkwave_main_iteration(); } } } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } sprintf(reportString, "%d", num_found); aobj = Tcl_NewStringObj(reportString, -1); Tcl_SetObjResult(interp, aobj); return(TCL_OK); } static int gtkwavetcl_processTclList(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int num_found = 0; char reportString[33]; Tcl_Obj *aobj; if(objc==2) { char *s = Tcl_GetString(objv[1]); /* do not want to remove braces! */ if(s) { num_found = process_tcl_list(s, FALSE); if(num_found) { MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); gtkwave_main_iteration(); } } } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } sprintf(reportString, "%d", num_found); aobj = Tcl_NewStringObj(reportString, -1); Tcl_SetObjResult(interp, aobj); return(TCL_OK); } static int gtkwavetcl_deleteSignalsFromList(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int i; int num_found = 0; char reportString[33]; Tcl_Obj *aobj; if(objc==2) { char *s = Tcl_GetString(objv[1]); /* do not want to remove braces */ char** elem = NULL; int l = 0; elem = zSplitTclList(s, &l); if(elem) { Trptr t = GLOBALS->traces.first; while(t) { t->cached_flags = t->flags; t->flags &= (~TR_HIGHLIGHT); t = t->t_next; } for(i=0;itraces.first; while(t) { if(!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH|TR_HIGHLIGHT))) { char *name = extractFullTraceName(t); if(name) { int len_name = strlen(name); int len_elem = strlen(elem[i]); int brackmatch = (len_name > len_elem) && (name[len_elem] == '['); if(((len_name == len_elem) && (!strcmp(name, elem[i]))) || (brackmatch && !strncmp(name, elem[i], len_elem))) { t->flags |= TR_HIGHLIGHT; num_found++; break; } free_2(name); } } t = t->t_next; } } free_2(elem); elem = NULL; if(num_found) { CutBuffer(); } t = GLOBALS->traces.first; while(t) { t->flags = t->cached_flags; t->cached_flags = 0; t = t-> t_next; } if(num_found) { MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); gtkwave_main_iteration(); } } } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } sprintf(reportString, "%d", num_found); aobj = Tcl_NewStringObj(reportString, -1); Tcl_SetObjResult(interp, aobj); return(TCL_OK); } static int gtkwavetcl_deleteSignalsFromListIncludingDuplicates(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int i; int num_found = 0; char reportString[33]; Tcl_Obj *aobj; if(objc==2) { char *s = Tcl_GetString(objv[1]); /* do not want to remove braces */ char** elem = NULL; int l = 0; elem = zSplitTclList(s, &l); if(elem) { Trptr t = GLOBALS->traces.first; while(t) { t->cached_flags = t->flags; t->flags &= (~TR_HIGHLIGHT); if(!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { char *name = extractFullTraceName(t); if(name) { for(i=0;i len_elem) && (name[len_elem] == '['); if(((len_name == len_elem) && (!strcmp(name, elem[i]))) || (brackmatch && !strncmp(name, elem[i], len_elem))) { t->flags |= TR_HIGHLIGHT; num_found++; break; } } free_2(name); } } t = t-> t_next; } free_2(elem); elem = NULL; if(num_found) { CutBuffer(); } t = GLOBALS->traces.first; while(t) { t->flags = t->cached_flags; t->cached_flags = 0; t = t-> t_next; } if(num_found) { MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); gtkwave_main_iteration(); } } } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } sprintf(reportString, "%d", num_found); aobj = Tcl_NewStringObj(reportString, -1); Tcl_SetObjResult(interp, aobj); return(TCL_OK); } static int gtkwavetcl_highlightSignalsFromList(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int i; int num_found = 0; char reportString[33]; Tcl_Obj *aobj; if(objc==2) { char *s = Tcl_GetString(objv[1]); /* do not want to remove braces */ char** elem = NULL; int l = 0; elem = zSplitTclList(s, &l); if(elem) { Trptr t = GLOBALS->traces.first; while(t) { if(!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { char *name = extractFullTraceName(t); if(name) { for(i=0;iflags |= TR_HIGHLIGHT; num_found++; break; } } free_2(name); } } t = t-> t_next; } free_2(elem); elem = NULL; if(num_found) { MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); gtkwave_main_iteration(); } } } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } sprintf(reportString, "%d", num_found); aobj = Tcl_NewStringObj(reportString, -1); Tcl_SetObjResult(interp, aobj); return(TCL_OK); } static int gtkwavetcl_unhighlightSignalsFromList(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int i; int num_found = 0; char reportString[33]; Tcl_Obj *aobj; if(objc==2) { char *s = Tcl_GetString(objv[1]); /* do not want to remove braces */ char** elem = NULL; int l = 0; elem = zSplitTclList(s, &l); if(elem) { Trptr t = GLOBALS->traces.first; while(t) { if(!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { char *name = extractFullTraceName(t); if(name) { for(i=0;iflags &= (~TR_HIGHLIGHT); num_found++; break; } } free_2(name); } } t = t-> t_next; } free_2(elem); elem = NULL; if(num_found) { MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); gtkwave_main_iteration(); } } } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } sprintf(reportString, "%d", num_found); aobj = Tcl_NewStringObj(reportString, -1); Tcl_SetObjResult(interp, aobj); return(TCL_OK); } static int gtkwavetcl_setTraceHighlightFromIndex(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 3) { char *s = get_Tcl_string(objv[1]); int which = atoi(s); char *ts = get_Tcl_string(objv[2]); int onoff = atoi_64(ts); if((which >= 0) && (which < GLOBALS->traces.total)) { Trptr t = GLOBALS->traces.first; int i = 0; while(t) { if(i == which) { if(onoff) { t->flags |= TR_HIGHLIGHT; } else { t->flags &= (~TR_HIGHLIGHT); } signalarea_configure_event(GLOBALS->signalarea, NULL); gtkwave_main_iteration(); break; } i++; t = t->t_next; } } } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 2)); } return(TCL_OK); } static int gtkwavetcl_setTraceHighlightFromNameMatch(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 3) { char *s = get_Tcl_string(objv[1]); int which = atoi(s); char *ts = get_Tcl_string(objv[2]); int onoff = atoi_64(ts); int mat = 0; if((which >= 0) && (which < GLOBALS->traces.total)) { Trptr t = GLOBALS->traces.first; int i = 0; while(t) { if(t->name && !strcmp(t->name, s)) { if(onoff) { t->flags |= TR_HIGHLIGHT; } else { t->flags &= (~TR_HIGHLIGHT); } mat++; } i++; t = t->t_next; } if(mat) { signalarea_configure_event(GLOBALS->signalarea, NULL); gtkwave_main_iteration(); } return(gtkwavetcl_printInteger(clientData, interp, objc, objv, mat)); } } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 2)); } return(TCL_OK); } static int gtkwavetcl_signalChangeList(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { (void) clientData; int dir = STRACE_FORWARD ; TimeType start_time = 0 ; TimeType end_time = MAX_HISTENT_TIME ; int max_elements = 0x7fffffff ; char *sig_name = NULL ; int i ; char *str_p, *str1_p ; int error = 0 ; llist_p *l_head ; Tcl_Obj *l_obj ; Tcl_Obj *obj ; llist_p *p, *p1 ; for(i=1; i end_time) ? STRACE_BACKWARD : STRACE_FORWARD ; } break ; case 'e': /* end time */ if(!strstr("-end_time", str_p)) error++ ; else { end_time = atoi_64(str1_p) ; dir = (start_time > end_time) ? STRACE_BACKWARD : STRACE_FORWARD ; } break ; case 'm': /* max */ if(!strstr("-max", str_p)) error++ ; else { max_elements = atoi(str1_p) ; } break ; case 'd': /* dir */ if(!strstr("-dir", str_p)) error++ ; else { if(strstr("forward", str1_p)) dir = STRACE_FORWARD ; else if(strstr("backward", str1_p)) dir = STRACE_BACKWARD ; else error++ ; } break ; default: error++ ; } } } /* consistancy check */ if(dir == STRACE_FORWARD) { if(start_time > end_time) error++ ; } else { if(start_time < end_time) { if(end_time == MAX_HISTENT_TIME) end_time = 0 ; else error ++ ; } } if(error) { Tcl_SetObjResult (interp, Tcl_NewStringObj("Usage: signal_change_list ?name? ?-start time? ?-end time? ?-max size? ?-dir forward|backward?", -1)) ; return TCL_ERROR; } l_head = signal_change_list(sig_name, dir, start_time, end_time, max_elements) ; l_obj = Tcl_NewListObj(0, NULL) ; p = l_head; while(p) { obj = Tcl_NewWideIntObj((Tcl_WideInt )p->u.tt) ; p1= p->next ; free_2(p) ; Tcl_ListObjAppendElement(interp, l_obj, obj) ; obj = Tcl_NewStringObj(p1->u.str,-1) ; Tcl_ListObjAppendElement(interp, l_obj, obj) ; p = p1->next ; free_2(p1->u.str) ; free_2(p1) ; } Tcl_SetObjResult(interp, l_obj) ; return TCL_OK ; } static int gtkwavetcl_findNextEdge(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { edge_search(STRACE_FORWARD); gtkwave_main_iteration(); return(gtkwavetcl_getMarker(clientData, interp, objc, objv)); } static int gtkwavetcl_findPrevEdge(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { edge_search(STRACE_BACKWARD); gtkwave_main_iteration(); return(gtkwavetcl_getMarker(clientData, interp, objc, objv)); } int SST_open_node(char *name) ; static int gtkwavetcl_forceOpenTreeNode(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int rv = -100; /* Tree does not exist */ char *s = NULL ; if(objc == 2) s = get_Tcl_string(objv[1]); if(s && (strlen(s) > 1)) { /* exclude empty strings */ int len = strlen(s); if(s[len-1]!=GLOBALS->hier_delimeter) { #ifdef WAVE_USE_GTK2 rv = SST_open_node(s); #endif } else { #ifdef WAVE_USE_GTK2 rv = SST_open_node(s); #endif } } else { if (GLOBALS->selected_hierarchy_name) { rv = SST_NODE_CURRENT ; } gtkwave_main_iteration(); /* check if this is needed */ } if (rv == -100) { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } Tcl_SetObjResult(GLOBALS->interp, (rv == SST_NODE_CURRENT) ? Tcl_NewStringObj(GLOBALS->selected_hierarchy_name, strlen(GLOBALS->selected_hierarchy_name)) : Tcl_NewIntObj(rv)) ; return(TCL_OK); } static int gtkwavetcl_setFromEntry(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 2) { char *s = get_Tcl_string(objv[1]); if(s) { gtk_entry_set_text(GTK_ENTRY(GLOBALS->from_entry),s); from_entry_callback(NULL, GLOBALS->from_entry); } gtkwave_main_iteration(); } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } return(TCL_OK); } static int gtkwavetcl_setToEntry(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 2) { char *s = get_Tcl_string(objv[1]); if(s) { gtk_entry_set_text(GTK_ENTRY(GLOBALS->to_entry),s); to_entry_callback(NULL, GLOBALS->to_entry); } gtkwave_main_iteration(); } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } return(TCL_OK); } static int gtkwavetcl_getFromEntry(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { const char *value = gtk_entry_get_text(GTK_ENTRY(GLOBALS->from_entry)); if(value) { return(gtkwavetcl_printString(clientData, interp, objc, objv, value)); } return(TCL_OK); } static int gtkwavetcl_getToEntry(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { const char *value = gtk_entry_get_text(GTK_ENTRY(GLOBALS->to_entry)); if(value) { return(gtkwavetcl_printString(clientData, interp, objc, objv, value)); } return(TCL_OK); } static int gtkwavetcl_getDisplayedSignals(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 1) { char *rv = add_traces_from_signal_window(TRUE); int rc = gtkwavetcl_printString(clientData, interp, objc, objv, rv); free_2(rv); return(rc); } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } } static int gtkwavetcl_getTraceFlagsFromName(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 2) { char *s = get_Tcl_string(objv[1]); Trptr t = GLOBALS->traces.first; while(t) { if(!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { char *name = extractFullTraceName(t); if(!strcmp(name, s)) { free_2(name); break; } free_2(name); } t = t-> t_next; } if(t) { return(gtkwavetcl_printInteger(clientData, interp, objc, objv, t->flags)); } } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } return(TCL_OK); } static int gtkwavetcl_loadFile(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 2) { char *s = get_Tcl_string(objv[1]); if(!GLOBALS->in_tcl_callback) { /* wave_gconf_client_set_string("/current/savefile", s); */ /* read_save_helper(s, NULL, NULL, NULL, NULL); */ process_url_file(s); /* process_url_list(s); */ /* gtkwave_main_iteration(); */ } else { gtkwavetcl_setvar_nonblocking(WAVE_TCLCB_ERROR,"gtkwave::loadFile prohibited in callback",WAVE_TCLCB_ERROR_FLAGS); } } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } return(TCL_OK); } static int gtkwavetcl_reLoadFile(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 1) { if(!GLOBALS->in_tcl_callback) { reload_into_new_context(); } else { gtkwavetcl_setvar_nonblocking(WAVE_TCLCB_ERROR,"gtkwave::reLoadFile prohibited in callback",WAVE_TCLCB_ERROR_FLAGS); } } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 0)); } return(TCL_OK); } static int gtkwavetcl_presentWindow(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 1) { #ifdef WAVE_USE_GTK2 gtk_window_present(GTK_WINDOW(GLOBALS->mainwindow)); #else gdk_window_raise(GTK_WIDGET(GLOBALS->mainwindow)->window); #endif } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 0)); } return(TCL_OK); } static int gtkwavetcl_showSignal(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 3) { char *s0 = get_Tcl_string(objv[1]); char *s1; int row; unsigned location; sscanf(s0, "%d", &row); if (row < 0) { row = 0; }; s1 = get_Tcl_string(objv[2]); sscanf(s1, "%u", &location); SetTraceScrollbarRowValue(row, location); } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 2)); } return(TCL_OK); } /* * swap to a given context based on tab number (from Tcl) */ static gint switch_to_tab_number(unsigned int i) { if(i < GLOBALS->num_notebook_pages) { struct Global *g_old = GLOBALS; /* printf("Switching to: %d\n", i); */ set_GLOBALS((*GLOBALS->contexts)[i]); GLOBALS->lxt_clock_compress_to_z = g_old->lxt_clock_compress_to_z; GLOBALS->autoname_bundles = g_old->autoname_bundles; GLOBALS->autocoalesce_reversal = g_old->autocoalesce_reversal; GLOBALS->autocoalesce = g_old->autocoalesce; GLOBALS->hier_grouping = g_old->hier_grouping; GLOBALS->wave_scrolling = g_old->wave_scrolling; GLOBALS->constant_marker_update = g_old->constant_marker_update; GLOBALS->do_zoom_center = g_old->do_zoom_center; GLOBALS->use_roundcaps = g_old->use_roundcaps; GLOBALS->do_resize_signals = g_old->do_resize_signals; GLOBALS->alt_wheel_mode = g_old->alt_wheel_mode; GLOBALS->initial_signal_window_width = g_old->initial_signal_window_width; GLOBALS->use_full_precision = g_old->use_full_precision; GLOBALS->show_base = g_old->show_base; GLOBALS->display_grid = g_old->display_grid; GLOBALS->highlight_wavewindow = g_old->highlight_wavewindow; GLOBALS->disable_mouseover = g_old->disable_mouseover; GLOBALS->zoom_pow10_snap = g_old->zoom_pow10_snap; GLOBALS->scale_to_time_dimension = g_old->scale_to_time_dimension; GLOBALS->zoom_dyn = g_old->zoom_dyn; GLOBALS->zoom_dyne = g_old->zoom_dyne; gtk_notebook_set_current_page(GTK_NOTEBOOK(GLOBALS->notebook), GLOBALS->this_context_page); return(TRUE); } return(FALSE); } static int gtkwavetcl_setTabActive(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 2) { gint rc; if(!GLOBALS->in_tcl_callback) { char *s = get_Tcl_string(objv[1]); unsigned int tabnum = atoi(s); rc = switch_to_tab_number(tabnum); MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); gtkwave_main_iteration(); } else { gtkwavetcl_setvar_nonblocking(WAVE_TCLCB_ERROR,"gtkwave::setTabActive prohibited in callback",WAVE_TCLCB_ERROR_FLAGS); rc = -1; } return(gtkwavetcl_printInteger(clientData, interp, objc, objv, rc)); } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } } static int gtkwavetcl_getNumTabs(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int value = GLOBALS->num_notebook_pages; return(gtkwavetcl_printInteger(clientData, interp, objc, objv, value)); } static int gtkwavetcl_installFileFilter(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 2) { char *s = get_Tcl_string(objv[1]); unsigned int which = atoi(s); gint rc = install_file_filter(which); gtkwave_main_iteration(); return(gtkwavetcl_printInteger(clientData, interp, objc, objv, rc)); } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } } static int gtkwavetcl_setCurrentTranslateFile(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 2) { char *s = get_Tcl_string(objv[1]); set_current_translate_file(s); return(gtkwavetcl_printInteger(clientData, interp, objc, objv, GLOBALS->current_translate_file)); } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } } static int gtkwavetcl_setCurrentTranslateEnums(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 2) { char *s = get_Tcl_string(objv[1]); set_current_translate_enums(s); return(gtkwavetcl_printInteger(clientData, interp, objc, objv, GLOBALS->current_translate_file)); } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } } static int gtkwavetcl_installProcFilter(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 2) { char *s = get_Tcl_string(objv[1]); unsigned int which = atoi(s); gint rc = install_file_filter(which); gtkwave_main_iteration(); return(gtkwavetcl_printInteger(clientData, interp, objc, objv, rc)); } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } } static int gtkwavetcl_setCurrentTranslateProc(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 2) { char *s = get_Tcl_string(objv[1]); set_current_translate_proc(s); return(gtkwavetcl_printInteger(clientData, interp, objc, objv, GLOBALS->current_translate_proc)); } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } } static int gtkwavetcl_installTransFilter(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 2) { char *s = get_Tcl_string(objv[1]); unsigned int which = atoi(s); gint rc = install_ttrans_filter(which); gtkwave_main_iteration(); return(gtkwavetcl_printInteger(clientData, interp, objc, objv, rc)); } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } } static int gtkwavetcl_setCurrentTranslateTransProc(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if(objc == 2) { char *s = get_Tcl_string(objv[1]); set_current_translate_ttrans(s); return(gtkwavetcl_printInteger(clientData, interp, objc, objv, GLOBALS->current_translate_ttrans)); } else { return(gtkwavetcl_badNumArgs(clientData, interp, objc, objv, 1)); } } tcl_cmdstruct gtkwave_commands[] = { {"addSignalsFromList", gtkwavetcl_addSignalsFromList}, {"deleteSignalsFromList", gtkwavetcl_deleteSignalsFromList}, {"deleteSignalsFromListIncludingDuplicates", gtkwavetcl_deleteSignalsFromListIncludingDuplicates}, {"findNextEdge", gtkwavetcl_findNextEdge}, {"findPrevEdge", gtkwavetcl_findPrevEdge}, {"forceOpenTreeNode", gtkwavetcl_forceOpenTreeNode}, {"getArgv", gtkwavetcl_getArgv}, {"getBaselineMarker", gtkwavetcl_getBaselineMarker}, {"getDisplayedSignals", gtkwavetcl_getDisplayedSignals}, {"getDumpFileName", gtkwavetcl_getDumpFileName}, {"getDumpType", gtkwavetcl_getDumpType}, {"getFacName", gtkwavetcl_getFacName}, {"getFontHeight", gtkwavetcl_getFontHeight}, {"getFromEntry", gtkwavetcl_getFromEntry}, {"getHierMaxLevel", gtkwavetcl_getHierMaxLevel}, {"getLeftJustifySigs", gtkwavetcl_getLeftJustifySigs}, {"getLongestName", gtkwavetcl_getLongestName}, {"getMarker", gtkwavetcl_getMarker}, {"getMaxTime", gtkwavetcl_getMaxTime}, {"getMinTime", gtkwavetcl_getMinTime}, {"getNamedMarker", gtkwavetcl_getNamedMarker}, {"getNumFacs", gtkwavetcl_getNumFacs}, {"getNumTabs", gtkwavetcl_getNumTabs}, {"getPixelsUnitTime", gtkwavetcl_getPixelsUnitTime}, {"getSaveFileName", gtkwavetcl_getSaveFileName}, {"getStemsFileName", gtkwavetcl_getStemsFileName}, {"getTimeDimension", gtkwavetcl_getTimeDimension}, {"getTimeZero", gtkwavetcl_getTimeZero}, {"getToEntry", gtkwavetcl_getToEntry}, {"getTotalNumTraces", gtkwavetcl_getTotalNumTraces}, {"getTraceFlagsFromIndex", gtkwavetcl_getTraceFlagsFromIndex}, {"getTraceFlagsFromName", gtkwavetcl_getTraceFlagsFromName}, {"getTraceNameFromIndex", gtkwavetcl_getTraceNameFromIndex}, {"getTraceScrollbarRowValue", gtkwavetcl_getTraceScrollbarRowValue}, {"getTraceValueAtMarkerFromIndex", gtkwavetcl_getTraceValueAtMarkerFromIndex}, {"getTraceValueAtMarkerFromName", gtkwavetcl_getTraceValueAtMarkerFromName}, {"getTraceValueAtNamedMarkerFromName", gtkwavetcl_getTraceValueAtNamedMarkerFromName}, {"getUnitTimePixels", gtkwavetcl_getUnitTimePixels}, {"getVisibleNumTraces", gtkwavetcl_getVisibleNumTraces}, {"getWaveHeight", gtkwavetcl_getWaveHeight}, {"getWaveWidth", gtkwavetcl_getWaveWidth}, {"getWindowEndTime", gtkwavetcl_getWindowEndTime}, {"getWindowStartTime", gtkwavetcl_getWindowStartTime}, {"getZoomFactor", gtkwavetcl_getZoomFactor}, {"highlightSignalsFromList", gtkwavetcl_highlightSignalsFromList}, {"installFileFilter", gtkwavetcl_installFileFilter}, {"installProcFilter", gtkwavetcl_installProcFilter}, {"installTransFilter", gtkwavetcl_installTransFilter}, {"nop", gtkwavetcl_nop}, {"setBaselineMarker", gtkwavetcl_setBaselineMarker}, {"setCurrentTranslateEnums", gtkwavetcl_setCurrentTranslateEnums}, {"setCurrentTranslateFile", gtkwavetcl_setCurrentTranslateFile}, {"setCurrentTranslateProc", gtkwavetcl_setCurrentTranslateProc}, {"setCurrentTranslateTransProc", gtkwavetcl_setCurrentTranslateTransProc}, {"setFromEntry", gtkwavetcl_setFromEntry}, {"setLeftJustifySigs", gtkwavetcl_setLeftJustifySigs}, {"setMarker", gtkwavetcl_setMarker}, {"setNamedMarker", gtkwavetcl_setNamedMarker}, {"setTabActive", gtkwavetcl_setTabActive}, {"setToEntry", gtkwavetcl_setToEntry}, {"setTraceHighlightFromIndex", gtkwavetcl_setTraceHighlightFromIndex}, {"setTraceHighlightFromNameMatch", gtkwavetcl_setTraceHighlightFromNameMatch}, {"setTraceScrollbarRowValue", gtkwavetcl_setTraceScrollbarRowValue}, {"setWindowStartTime", gtkwavetcl_setWindowStartTime}, {"setZoomFactor", gtkwavetcl_setZoomFactor}, {"setZoomRangeTimes", gtkwavetcl_setZoomRangeTimes}, {"loadFile", gtkwavetcl_loadFile}, {"reLoadFile", gtkwavetcl_reLoadFile}, {"presentWindow", gtkwavetcl_presentWindow}, {"showSignal", gtkwavetcl_showSignal}, {"unhighlightSignalsFromList", gtkwavetcl_unhighlightSignalsFromList}, {"signalChangeList", gtkwavetcl_signalChangeList}, /* changed from signal_change_list for consistency! */ {"processTclList", gtkwavetcl_processTclList}, /* not for general-purpose use */ {"", NULL} /* sentinel */ }; #else static void dummy_function(void) { /* nothing */ } #endif gtkwave-3.3.86/src/search.c0000664000175000017500000011117313166335473015010 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2014. * * 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. */ /* AIX may need this for alloca to work */ #if defined _AIX #pragma alloca #endif #include "globals.h" #include #include #include "gtk12compat.h" #include "analyzer.h" #include "symbol.h" #include "vcd.h" #include "lx2.h" #include "ghw.h" #include "debug.h" #include "busy.h" #include "hierpack.h" static gint clist_sigcmp (GtkCList *clist, gconstpointer ptr1, gconstpointer ptr2) { char *text1 = NULL; char *text2 = NULL; int rc; GtkCListRow *row1 = (GtkCListRow *) ptr1; GtkCListRow *row2 = (GtkCListRow *) ptr2; switch (row1->cell[clist->sort_column].type) { case GTK_CELL_TEXT: text1 = GTK_CELL_TEXT (row1->cell[clist->sort_column])->text; break; case GTK_CELL_PIXTEXT: text1 = GTK_CELL_PIXTEXT (row1->cell[clist->sort_column])->text; break; default: break; } switch (row2->cell[clist->sort_column].type) { case GTK_CELL_TEXT: text2 = GTK_CELL_TEXT (row2->cell[clist->sort_column])->text; break; case GTK_CELL_PIXTEXT: text2 = GTK_CELL_PIXTEXT (row2->cell[clist->sort_column])->text; break; default: break; } if (!text2) return (text1 != NULL); if (!text1) return -1; rc = sigcmp(text1, text2); return (rc); } int searchbox_is_active(void) { return(GLOBALS->is_active_search_c_4); } static void enter_callback_e(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; G_CONST_RETURN gchar *entry_text; int len; char *vname=""; entry_text = gtk_entry_get_text(GTK_ENTRY(GLOBALS->entry_a_search_c_1)); entry_text = entry_text ? entry_text : ""; DEBUG(printf("Entry contents: %s\n", entry_text)); if(!(len=strlen(entry_text))) strcpy((GLOBALS->entrybox_text_local_search_c_2=(char *)malloc_2(strlen(vname)+1)),vname); /* make consistent with other widgets rather than producing NULL */ else strcpy((GLOBALS->entrybox_text_local_search_c_2=(char *)malloc_2(len+1)),entry_text); wave_gtk_grab_remove(GLOBALS->window1_search_c_2); gtk_widget_destroy(GLOBALS->window1_search_c_2); GLOBALS->window1_search_c_2 = NULL; GLOBALS->cleanup_e_search_c_2(); } static void destroy_callback_e(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; DEBUG(printf("Entry Cancel\n")); GLOBALS->entrybox_text_local_search_c_2=NULL; wave_gtk_grab_remove(GLOBALS->window1_search_c_2); gtk_widget_destroy(GLOBALS->window1_search_c_2); GLOBALS->window1_search_c_2 = NULL; } static void entrybox_local(char *title, int width, char *default_text, int maxch, GtkSignalFunc func) { GtkWidget *vbox, *hbox; GtkWidget *button1, *button2; GLOBALS->cleanup_e_search_c_2=func; /* fix problem where ungrab doesn't occur if button pressed + simultaneous accelerator key occurs */ if(GLOBALS->in_button_press_wavewindow_c_1) { gdk_pointer_ungrab(GDK_CURRENT_TIME); } /* create a new modal window */ GLOBALS->window1_search_c_2 = gtk_window_new(GLOBALS->disable_window_manager ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL); install_focus_cb(GLOBALS->window1_search_c_2, ((char *)&GLOBALS->window1_search_c_2) - ((char *)GLOBALS)); gtk_widget_set_usize( GTK_WIDGET (GLOBALS->window1_search_c_2), width, 60); gtk_window_set_title(GTK_WINDOW (GLOBALS->window1_search_c_2), title); gtkwave_signal_connect(GTK_OBJECT (GLOBALS->window1_search_c_2), "delete_event",(GtkSignalFunc) destroy_callback_e, NULL); vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (GLOBALS->window1_search_c_2), vbox); gtk_widget_show (vbox); GLOBALS->entry_a_search_c_1 = gtk_entry_new_with_max_length (maxch); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->entry_a_search_c_1), "activate",GTK_SIGNAL_FUNC(enter_callback_e),GLOBALS->entry_a_search_c_1); gtk_entry_set_text (GTK_ENTRY (GLOBALS->entry_a_search_c_1), default_text); gtk_entry_select_region (GTK_ENTRY (GLOBALS->entry_a_search_c_1),0, GTK_ENTRY(GLOBALS->entry_a_search_c_1)->text_length); gtk_box_pack_start (GTK_BOX (vbox), GLOBALS->entry_a_search_c_1, TRUE, TRUE, 0); gtk_widget_show (GLOBALS->entry_a_search_c_1); hbox = gtk_hbox_new (FALSE, 1); gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0); gtk_widget_show (hbox); button1 = gtk_button_new_with_label ("OK"); gtk_widget_set_usize(button1, 100, -1); gtkwave_signal_connect(GTK_OBJECT (button1), "clicked", GTK_SIGNAL_FUNC(enter_callback_e), NULL); gtk_widget_show (button1); gtk_container_add (GTK_CONTAINER (hbox), button1); GTK_WIDGET_SET_FLAGS (button1, GTK_CAN_DEFAULT); gtkwave_signal_connect_object (GTK_OBJECT (button1), "realize", (GtkSignalFunc) gtk_widget_grab_default, GTK_OBJECT (button1)); button2 = gtk_button_new_with_label ("Cancel"); gtk_widget_set_usize(button2, 100, -1); gtkwave_signal_connect(GTK_OBJECT (button2), "clicked", GTK_SIGNAL_FUNC(destroy_callback_e), NULL); GTK_WIDGET_SET_FLAGS (button2, GTK_CAN_DEFAULT); gtk_widget_show (button2); gtk_container_add (GTK_CONTAINER (hbox), button2); gtk_widget_show(GLOBALS->window1_search_c_2); wave_gtk_grab_add(GLOBALS->window1_search_c_2); } /***************************************************************************/ static char *regex_type[]={"\\(\\[.*\\]\\)*$", "\\>.\\([0-9]\\)*$", "\\(\\[.*\\]\\)*$", "\\>.\\([0-9]\\)*$", ""}; static char *regex_name[]={"WRange", "WStrand", "Range", "Strand", "None"}; static void regex_clicked(GtkWidget *widget, gpointer which) { (void)widget; int i; for(i=0;i<5;i++) GLOBALS->regex_mutex_search_c_1[i]=0; GLOBALS->regex_which_search_c_1=(int)((intptr_t)which); GLOBALS->regex_mutex_search_c_1[GLOBALS->regex_which_search_c_1] = 1; /* mark our choice */ DEBUG(printf("picked: %s\n", regex_name[GLOBALS->regex_which_search_c_1])); } /***************************************************************************/ /* call cleanup() on ok/insert functions */ static void bundle_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; if(GLOBALS->entrybox_text_local_search_c_2) { char *efix; efix=GLOBALS->entrybox_text_local_search_c_2; while(*efix) { if(*efix==' ') { *efix='_'; } efix++; } DEBUG(printf("Bundle name is: %s\n",GLOBALS->entrybox_text_local_search_c_2)); add_vector_selected(GLOBALS->entrybox_text_local_search_c_2, GLOBALS->selected_rows_search_c_2, GLOBALS->bundle_direction_search_c_2); free_2(GLOBALS->entrybox_text_local_search_c_2); } MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } static void bundle_callback_generic(void) { DEBUG(printf("Selected_rows: %d\n",GLOBALS->selected_rows_search_c_2)); if(GLOBALS->selected_rows_search_c_2>0) { entrybox_local("Enter Bundle Name",300,"",128,GTK_SIGNAL_FUNC(bundle_cleanup)); } } static void bundle_callback_up(GtkWidget *widget, gpointer data) { (void)widget; (void)data; GLOBALS->bundle_direction_search_c_2=0; bundle_callback_generic(); } static void bundle_callback_down(GtkWidget *widget, gpointer data) { (void)widget; (void)data; GLOBALS->bundle_direction_search_c_2=1; bundle_callback_generic(); } static void insert_callback(GtkWidget *widget, GtkWidget *nothing) { (void)nothing; search_insert_callback(widget, 0); /* native to search */ } void search_insert_callback(GtkWidget *widget, char is_prepend) { Traces tcache; struct symchain *symc, *symc_current; int i; gfloat interval; if(GLOBALS->is_insert_running_search_c_1) return; GLOBALS->is_insert_running_search_c_1 = ~0; wave_gtk_grab_add(widget); set_window_busy(widget); symc=NULL; memcpy(&tcache,&GLOBALS->traces,sizeof(Traces)); GLOBALS->traces.total=0; GLOBALS->traces.first=GLOBALS->traces.last=NULL; GTK_ADJUSTMENT(GLOBALS->pdata->adj)->upper = (gfloat)((GLOBALS->num_rows_search_c_2>1)?GLOBALS->num_rows_search_c_2-1:1); interval = (gfloat)(GLOBALS->num_rows_search_c_2/100.0); /* LX2 */ if(GLOBALS->is_lx2) { int pre_import=0; for(i=0;inum_rows_search_c_2;i++) { struct symbol *s, *t; s=(struct symbol *)gtk_clist_get_row_data(GTK_CLIST(GLOBALS->clist_search_c_3), i); if(get_s_selected(s)) { if((!s->vec_root)||(!GLOBALS->autocoalesce)) { if(s->n->mv.mvlfac) { lx2_set_fac_process_mask(s->n); pre_import++; } } else { t=s->vec_root; while(t) { if(t->n->mv.mvlfac) { lx2_set_fac_process_mask(t->n); pre_import++; } t=t->vec_chain; } } } } if(pre_import) { lx2_import_masked(); } } /* LX2 */ for(i=0;inum_rows_search_c_2;i++) { int len; struct symbol *s, *t; s=(struct symbol *)gtk_clist_get_row_data(GTK_CLIST(GLOBALS->clist_search_c_3), i); if(get_s_selected(s)) { GLOBALS->pdata->value = i; if(((int)(GLOBALS->pdata->value/interval))!=((int)(GLOBALS->pdata->oldvalue/interval))) { gtk_progress_set_value (GTK_PROGRESS (GLOBALS->pdata->pbar), i); gtkwave_main_iteration(); } GLOBALS->pdata->oldvalue = i; if((!s->vec_root)||(!GLOBALS->autocoalesce)) { AddNodeUnroll(s->n, NULL); } else { len=0; t=s->vec_root; set_s_selected(t, 1); /* move selected to head */ while(t) { if(get_s_selected(t)) { if(len) set_s_selected(t, 0); symc_current=(struct symchain *)calloc_2(1,sizeof(struct symchain)); symc_current->next=symc; symc_current->symbol=t; symc=symc_current; } len++; t=t->vec_chain; } if(len)add_vector_chain(s->vec_root, len); } } } while(symc) { set_s_selected(symc->symbol, 1); symc_current=symc; symc=symc->next; free_2(symc_current); } GLOBALS->traces.buffercount=GLOBALS->traces.total; GLOBALS->traces.buffer=GLOBALS->traces.first; GLOBALS->traces.bufferlast=GLOBALS->traces.last; GLOBALS->traces.first=tcache.first; GLOBALS->traces.last=tcache.last; GLOBALS->traces.total=tcache.total; if(is_prepend) { PrependBuffer(); } else { PasteBuffer(); } GLOBALS->traces.buffercount=tcache.buffercount; GLOBALS->traces.buffer=tcache.buffer; GLOBALS->traces.bufferlast=tcache.bufferlast; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); gtk_progress_set_value (GTK_PROGRESS (GLOBALS->pdata->pbar), 0.0); GLOBALS->pdata->oldvalue = -1.0; set_window_idle(widget); wave_gtk_grab_remove(widget); GLOBALS->is_insert_running_search_c_1=0; } static void replace_callback(GtkWidget *widget, GtkWidget *nothing) { (void)nothing; Traces tcache; int i; Trptr tfirst, tlast; struct symchain *symc, *symc_current; gfloat interval; if(GLOBALS->is_replace_running_search_c_1) return; GLOBALS->is_replace_running_search_c_1 = ~0; wave_gtk_grab_add(widget); set_window_busy(widget); tfirst=NULL; tlast=NULL; symc=NULL; memcpy(&tcache,&GLOBALS->traces,sizeof(Traces)); GLOBALS->traces.total=0; GLOBALS->traces.first=GLOBALS->traces.last=NULL; GTK_ADJUSTMENT(GLOBALS->pdata->adj)->upper = (gfloat)((GLOBALS->num_rows_search_c_2>1)?GLOBALS->num_rows_search_c_2-1:1); interval = (gfloat)(GLOBALS->num_rows_search_c_2/100.0); GLOBALS->pdata->oldvalue = -1.0; /* LX2 */ if(GLOBALS->is_lx2) { int pre_import=0; for(i=0;inum_rows_search_c_2;i++) { struct symbol *s, *t; s=(struct symbol *)gtk_clist_get_row_data(GTK_CLIST(GLOBALS->clist_search_c_3), i); if(get_s_selected(s)) { if((!s->vec_root)||(!GLOBALS->autocoalesce)) { if(s->n->mv.mvlfac) { lx2_set_fac_process_mask(s->n); pre_import++; } } else { t=s->vec_root; while(t) { if(t->n->mv.mvlfac) { lx2_set_fac_process_mask(t->n); pre_import++; } t=t->vec_chain; } } } } if(pre_import) { lx2_import_masked(); } } /* LX2 */ for(i=0;inum_rows_search_c_2;i++) { int len; struct symbol *s, *t; s=(struct symbol *)gtk_clist_get_row_data(GTK_CLIST(GLOBALS->clist_search_c_3), i); if(get_s_selected(s)) { GLOBALS->pdata->value = i; if(((int)(GLOBALS->pdata->value/interval))!=((int)(GLOBALS->pdata->oldvalue/interval))) { gtk_progress_set_value (GTK_PROGRESS (GLOBALS->pdata->pbar), i); gtkwave_main_iteration(); } GLOBALS->pdata->oldvalue = i; if((!s->vec_root)||(!GLOBALS->autocoalesce)) { AddNodeUnroll(s->n, NULL); } else { len=0; t=s->vec_root; while(t) { if(get_s_selected(t)) { if(len) set_s_selected(t, 0); symc_current=(struct symchain *)calloc_2(1,sizeof(struct symchain)); symc_current->next=symc; symc_current->symbol=t; symc=symc_current; } len++; t=t->vec_chain; } if(len)add_vector_chain(s->vec_root, len); } } } while(symc) { set_s_selected(symc->symbol, 1); symc_current=symc; symc=symc->next; free_2(symc_current); } tfirst=GLOBALS->traces.first; tlast=GLOBALS->traces.last; /* cache for highlighting */ GLOBALS->traces.buffercount=GLOBALS->traces.total; GLOBALS->traces.buffer=GLOBALS->traces.first; GLOBALS->traces.bufferlast=GLOBALS->traces.last; GLOBALS->traces.first=tcache.first; GLOBALS->traces.last=tcache.last; GLOBALS->traces.total=tcache.total; { Trptr t = GLOBALS->traces.first; Trptr *tp = NULL; int numhigh = 0; int it; while(t) { if(t->flags & TR_HIGHLIGHT) { numhigh++; } t = t->t_next; } if(numhigh) { tp = calloc_2(numhigh, sizeof(Trptr)); t = GLOBALS->traces.first; it = 0; while(t) { if(t->flags & TR_HIGHLIGHT) { tp[it++] = t; } t = t->t_next; } } PasteBuffer(); GLOBALS->traces.buffercount=tcache.buffercount; GLOBALS->traces.buffer=tcache.buffer; GLOBALS->traces.bufferlast=tcache.bufferlast; for(it=0;itflags |= TR_HIGHLIGHT; } t = tfirst; while(t) { t->flags &= ~TR_HIGHLIGHT; if(t==tlast) break; t=t->t_next; } CutBuffer(); while(tfirst) { tfirst->flags |= TR_HIGHLIGHT; if(tfirst==tlast) break; tfirst=tfirst->t_next; } if(tp) { free_2(tp); } } MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); gtk_progress_set_value (GTK_PROGRESS (GLOBALS->pdata->pbar), 0.0); GLOBALS->pdata->oldvalue = -1.0; set_window_idle(widget); wave_gtk_grab_remove(widget); GLOBALS->is_replace_running_search_c_1=0; } static void ok_callback(GtkWidget *widget, GtkWidget *nothing) { (void)nothing; int i; struct symchain *symc, *symc_current; gfloat interval; if(GLOBALS->is_append_running_search_c_1) return; GLOBALS->is_append_running_search_c_1 = ~0; wave_gtk_grab_add(widget); set_window_busy(widget); symc=NULL; GTK_ADJUSTMENT(GLOBALS->pdata->adj)->upper = (gfloat)((GLOBALS->num_rows_search_c_2>1)?GLOBALS->num_rows_search_c_2-1:1); interval = (gfloat)(GLOBALS->num_rows_search_c_2/100.0); GLOBALS->pdata->oldvalue = -1.0; /* LX2 */ if(GLOBALS->is_lx2) { int pre_import=0; for(i=0;inum_rows_search_c_2;i++) { struct symbol *s, *t; s=(struct symbol *)gtk_clist_get_row_data(GTK_CLIST(GLOBALS->clist_search_c_3), i); if(get_s_selected(s)) { if((!s->vec_root)||(!GLOBALS->autocoalesce)) { if(s->n->mv.mvlfac) { lx2_set_fac_process_mask(s->n); pre_import++; } } else { t=s->vec_root; while(t) { if(t->n->mv.mvlfac) { lx2_set_fac_process_mask(t->n); pre_import++; } t=t->vec_chain; } } } } if(pre_import) { lx2_import_masked(); } } /* LX2 */ for(i=0;inum_rows_search_c_2;i++) { int len; struct symbol *s, *t; s=(struct symbol *)gtk_clist_get_row_data(GTK_CLIST(GLOBALS->clist_search_c_3), i); if(get_s_selected(s)) { GLOBALS->pdata->value = i; if(((int)(GLOBALS->pdata->value/interval))!=((int)(GLOBALS->pdata->oldvalue/interval))) { gtk_progress_set_value (GTK_PROGRESS (GLOBALS->pdata->pbar), i); gtkwave_main_iteration(); } GLOBALS->pdata->oldvalue = i; if((!s->vec_root)||(!GLOBALS->autocoalesce)) { AddNodeUnroll(s->n, NULL); } else { len=0; t=s->vec_root; while(t) { if(get_s_selected(t)) { if(len) set_s_selected(t, 0); symc_current=(struct symchain *)calloc_2(1,sizeof(struct symchain)); symc_current->next=symc; symc_current->symbol=t; symc=symc_current; } len++; t=t->vec_chain; } if(len)add_vector_chain(s->vec_root, len); } } } while(symc) { set_s_selected(symc->symbol, 1); symc_current=symc; symc=symc->next; free_2(symc_current); } GLOBALS->traces.scroll_top = GLOBALS->traces.scroll_bottom = GLOBALS->traces.last; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); gtk_progress_set_value (GTK_PROGRESS (GLOBALS->pdata->pbar), 0.0); GLOBALS->pdata->oldvalue = -1.0; set_window_idle(widget); wave_gtk_grab_remove(widget); GLOBALS->is_append_running_search_c_1=0; } static void select_row_callback(GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data) { (void)widget; (void)column; (void)event; (void)data; struct symbol *s; s=(struct symbol *)gtk_clist_get_row_data(GTK_CLIST(GLOBALS->clist_search_c_3), row); DEBUG(printf("Select: %p %s\n",s, s->name)); set_s_selected(s, 1); GLOBALS->selected_rows_search_c_2++; } static void unselect_row_callback(GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data) { (void)widget; (void)column; (void)event; (void)data; struct symbol *s; s=(struct symbol *)gtk_clist_get_row_data(GTK_CLIST(GLOBALS->clist_search_c_3), row); DEBUG(printf("Unselect: %p %s\n",s, s->name)); set_s_selected(s, 0); GLOBALS->selected_rows_search_c_2--; } void search_enter_callback(GtkWidget *widget, GtkWidget *do_warning) { GtkCList *cl; G_CONST_RETURN gchar *entry_text; char *entry_suffixed; int i, row; char *s, *tmp2; gfloat interval; int depack_cnt = 0; char *duplicate_row_buffer = NULL; if(GLOBALS->is_searching_running_search_c_1) return; GLOBALS->is_searching_running_search_c_1 = ~0; wave_gtk_grab_add(widget); entry_text = gtk_entry_get_text(GTK_ENTRY(GLOBALS->entry_search_c_3)); entry_text = entry_text ? entry_text : ""; DEBUG(printf("Entry contents: %s\n", entry_text)); free_2(GLOBALS->searchbox_text_search_c_1); if(strlen(entry_text)) { GLOBALS->searchbox_text_search_c_1 = strdup_2(entry_text); } else { GLOBALS->searchbox_text_search_c_1 = strdup_2(""); } GLOBALS->num_rows_search_c_2=0; gtk_clist_freeze(cl=GTK_CLIST(GLOBALS->clist_search_c_3)); gtk_clist_clear(cl); entry_suffixed=wave_alloca(strlen(GLOBALS->searchbox_text_search_c_1 /* scan-build, was entry_text */)+strlen(regex_type[GLOBALS->regex_which_search_c_1])+1+((GLOBALS->regex_which_search_c_1<2)?2:0)); *entry_suffixed=0x00; if(GLOBALS->regex_which_search_c_1<2) strcpy(entry_suffixed, "\\<"); /* match on word boundary */ strcat(entry_suffixed,GLOBALS->searchbox_text_search_c_1); /* scan-build */ strcat(entry_suffixed,regex_type[GLOBALS->regex_which_search_c_1]); wave_regex_compile(entry_suffixed, WAVE_REGEX_SEARCH); for(i=0;inumfacs;i++) { set_s_selected(GLOBALS->facs[i], 0); } GTK_ADJUSTMENT(GLOBALS->pdata->adj)->upper = (gfloat)((GLOBALS->numfacs>1)?GLOBALS->numfacs-1:1); GLOBALS->pdata->oldvalue = -1.0; interval = (gfloat)(GLOBALS->numfacs/100.0); duplicate_row_buffer = (char *)calloc_2(1, GLOBALS->longestname+1); for(i=0;inumfacs;i++) { int was_packed = HIER_DEPACK_STATIC; char *hfacname = NULL; int skiprow; GLOBALS->pdata->value = i; if(((int)(GLOBALS->pdata->value/interval))!=((int)(GLOBALS->pdata->oldvalue/interval))) { gtk_progress_set_value (GTK_PROGRESS (GLOBALS->pdata->pbar), i); gtkwave_main_iteration(); } GLOBALS->pdata->oldvalue = i; hfacname = hier_decompress_flagged(GLOBALS->facs[i]->name, &was_packed); if(!strcmp(hfacname, duplicate_row_buffer)) { skiprow = 1; } else { skiprow = 0; strcpy(duplicate_row_buffer, hfacname); } depack_cnt += was_packed; if((!skiprow) && wave_regex_match(hfacname, WAVE_REGEX_SEARCH)) if((!GLOBALS->is_ghw)||(strcmp(WAVE_GHW_DUMMYFACNAME, hfacname))) { if(!GLOBALS->facs[i]->vec_root) { row=gtk_clist_append(cl,(gchar **)&(hfacname)); } else { if(GLOBALS->autocoalesce) { if(GLOBALS->facs[i]->vec_root!=GLOBALS->facs[i]) continue; tmp2=makename_chain(GLOBALS->facs[i]); s=(char *)malloc_2(strlen(tmp2)+4); strcpy(s,"[] "); strcpy(s+3, tmp2); free_2(tmp2); } else { s=(char *)malloc_2(strlen(hfacname)+4); strcpy(s,"[] "); strcpy(s+3, hfacname); } row=gtk_clist_append(cl,(gchar **)&s); free_2(s); } gtk_clist_set_row_data(cl, row,GLOBALS->facs[i]); GLOBALS->num_rows_search_c_2++; if(GLOBALS->num_rows_search_c_2==WAVE_MAX_CLIST_LENGTH) { /* if(was_packed) { free_2(hfacname); } ...not needed with HIER_DEPACK_STATIC */ break; } } /* if(was_packed) { free_2(hfacname); } ...not needed with HIER_DEPACK_STATIC */ } free_2(duplicate_row_buffer); if(depack_cnt) { gtk_clist_set_compare_func(cl, clist_sigcmp); gtk_clist_sort (cl); } gtk_clist_set_column_width(GTK_CLIST(GLOBALS->clist_search_c_3),0,gtk_clist_optimal_column_width(GTK_CLIST(GLOBALS->clist_search_c_3),0)); gtk_clist_thaw(cl); gtk_progress_set_value (GTK_PROGRESS (GLOBALS->pdata->pbar), 0.0); GLOBALS->pdata->oldvalue = -1.0; wave_gtk_grab_remove(widget); GLOBALS->is_searching_running_search_c_1=0; if(do_warning) if(GLOBALS->num_rows_search_c_2>=WAVE_MAX_CLIST_LENGTH) { char buf[256]; sprintf(buf, "Limiting results to first %d entries.", GLOBALS->num_rows_search_c_2); simplereqbox("Regex Search Warning",300,buf,"OK", NULL, NULL, 1); } } static void destroy_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; if((!GLOBALS->is_insert_running_search_c_1)&&(!GLOBALS->is_replace_running_search_c_1)&&(!GLOBALS->is_append_running_search_c_1)&&(!GLOBALS->is_searching_running_search_c_1)) { GLOBALS->is_active_search_c_4=0; gtk_widget_destroy(GLOBALS->window_search_c_7); GLOBALS->window_search_c_7 = NULL; GLOBALS->clist_search_c_3 = NULL; } } static void select_all_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; gtk_clist_select_all(GTK_CLIST(GLOBALS->clist_search_c_3)); } static void unselect_all_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; gtk_clist_unselect_all(GTK_CLIST(GLOBALS->clist_search_c_3)); } /* * mainline.. */ void searchbox(char *title, GtkSignalFunc func) { int i; GtkWidget *menu, *optionmenu; GSList *group; GtkWidget *small_hbox; GtkWidget *scrolled_win; GtkWidget *vbox1, *hbox, *hbox0; GtkWidget *button1, *button2, *button3, *button3a, *button4, *button5, *button6, *button7; GtkWidget *label; gchar *titles[]={"Matches"}; GtkWidget *frame1, *frame2, *frameh, *frameh0; GtkWidget *table; GtkTooltips *tooltips; GtkAdjustment *adj; GtkWidget *align; int cached_which = GLOBALS->regex_which_search_c_1; /* fix problem where ungrab doesn't occur if button pressed + simultaneous accelerator key occurs */ if(GLOBALS->in_button_press_wavewindow_c_1) { gdk_pointer_ungrab(GDK_CURRENT_TIME); } if(GLOBALS->is_active_search_c_4) { gdk_window_raise(GLOBALS->window_search_c_7->window); return; } if(!GLOBALS->searchbox_text_search_c_1) GLOBALS->searchbox_text_search_c_1 = strdup_2(""); GLOBALS->is_active_search_c_4=1; GLOBALS->cleanup_search_c_5=func; GLOBALS->num_rows_search_c_2=GLOBALS->selected_rows_search_c_2=0; /* create a new modal window */ GLOBALS->window_search_c_7 = gtk_window_new(GLOBALS->disable_window_manager ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL); install_focus_cb(GLOBALS->window_search_c_7, ((char *)&GLOBALS->window_search_c_7) - ((char *)GLOBALS)); gtk_window_set_title(GTK_WINDOW (GLOBALS->window_search_c_7), title); gtkwave_signal_connect(GTK_OBJECT (GLOBALS->window_search_c_7), "delete_event",(GtkSignalFunc) destroy_callback, NULL); tooltips=gtk_tooltips_new_2(); table = gtk_table_new (256, 1, FALSE); gtk_widget_show (table); vbox1 = gtk_vbox_new (FALSE, 0); gtk_container_border_width (GTK_CONTAINER (vbox1), 3); gtk_widget_show (vbox1); frame1 = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (frame1), 3); gtk_widget_show(frame1); gtk_table_attach (GTK_TABLE (table), frame1, 0, 1, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); label=gtk_label_new("Signal Search Expression"); gtk_widget_show(label); gtk_box_pack_start (GTK_BOX (vbox1), label, TRUE, TRUE, 0); GLOBALS->entry_search_c_3 = gtk_entry_new_with_max_length (256); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->entry_search_c_3), "activate", GTK_SIGNAL_FUNC(search_enter_callback),GLOBALS->entry_search_c_3); gtk_entry_set_text (GTK_ENTRY (GLOBALS->entry_search_c_3), GLOBALS->searchbox_text_search_c_1); gtk_entry_select_region (GTK_ENTRY (GLOBALS->entry_search_c_3),0, GTK_ENTRY(GLOBALS->entry_search_c_3)->text_length); gtk_widget_show (GLOBALS->entry_search_c_3); gtk_tooltips_set_tip_2(tooltips, GLOBALS->entry_search_c_3, "Enter search expression here. POSIX Wildcards are allowed. Note that you may also ""modify the search criteria by selecting ``[W]Range'', ``[W]Strand'', or ``None'' for suffix ""matching.",NULL); gtk_box_pack_start (GTK_BOX (vbox1), GLOBALS->entry_search_c_3, TRUE, TRUE, 0); /* Allocate memory for the data that is used later */ GLOBALS->pdata = calloc_2(1, sizeof(SearchProgressData) ); GLOBALS->pdata->value = GLOBALS->pdata->oldvalue = 0.0; /* Create a centering alignment object */ align = gtk_alignment_new (0.5, 0.5, 0, 0); gtk_widget_show(align); /* Create a Adjustment object to hold the range of the * progress bar */ adj = (GtkAdjustment *) gtk_adjustment_new (0.0, 0.0, (gfloat)((GLOBALS->numfacs>1)?GLOBALS->numfacs-1:1), 0, 0, 0); GLOBALS->pdata->adj = adj; /* Create the GtkProgressBar using the adjustment */ GLOBALS->pdata->pbar = gtk_progress_bar_new_with_adjustment (adj); /* Set the format of the string that can be displayed in the * trough of the progress bar: * %p - percentage * %v - value * %l - lower range value * %u - upper range value */ gtk_progress_set_format_string (GTK_PROGRESS (GLOBALS->pdata->pbar), "(%p%%)"); gtk_progress_set_show_text (GTK_PROGRESS (GLOBALS->pdata->pbar), TRUE); gtk_widget_show(GLOBALS->pdata->pbar); gtk_box_pack_start (GTK_BOX (vbox1), GLOBALS->pdata->pbar, TRUE, TRUE, 0); gtk_container_add (GTK_CONTAINER (frame1), vbox1); frame2 = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (frame2), 3); gtk_widget_show(frame2); gtk_table_attach (GTK_TABLE (table), frame2, 0, 1, 1, 254, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); GLOBALS->clist_search_c_3=gtk_clist_new_with_titles(1,titles); gtk_clist_column_titles_passive(GTK_CLIST(GLOBALS->clist_search_c_3)); gtk_clist_set_selection_mode(GTK_CLIST(GLOBALS->clist_search_c_3), GTK_SELECTION_EXTENDED); gtkwave_signal_connect_object (GTK_OBJECT (GLOBALS->clist_search_c_3), "select_row",GTK_SIGNAL_FUNC(select_row_callback),NULL); gtkwave_signal_connect_object (GTK_OBJECT (GLOBALS->clist_search_c_3), "unselect_row",GTK_SIGNAL_FUNC(unselect_row_callback),NULL); gtk_widget_show (GLOBALS->clist_search_c_3); #if WAVE_USE_GTK2 dnd_setup(GLOBALS->clist_search_c_3, GLOBALS->signalarea, 0); #endif scrolled_win = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_set_usize( GTK_WIDGET (scrolled_win), -1, 300); gtk_widget_show(scrolled_win); /* gtk_scrolled_window_add_with_viewport doesn't seen to work right here.. */ gtk_container_add (GTK_CONTAINER (scrolled_win), GLOBALS->clist_search_c_3); gtk_container_add (GTK_CONTAINER (frame2), scrolled_win); frameh0 = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (frameh0), 3); gtk_widget_show(frameh0); gtk_table_attach (GTK_TABLE (table), frameh0, 0, 1, 254, 255, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); hbox0 = gtk_hbox_new (FALSE, 1); gtk_widget_show (hbox0); button6 = gtk_button_new_with_label (" Select All "); gtk_container_border_width (GTK_CONTAINER (button6), 3); gtkwave_signal_connect_object (GTK_OBJECT (button6), "clicked",GTK_SIGNAL_FUNC(select_all_callback),GTK_OBJECT (GLOBALS->window_search_c_7)); gtk_widget_show (button6); gtk_tooltips_set_tip_2(tooltips, button6, "Highlight all signals listed in the match window.",NULL); gtk_box_pack_start (GTK_BOX (hbox0), button6, TRUE, FALSE, 0); menu = gtk_menu_new (); group=NULL; small_hbox = gtk_hbox_new (TRUE, 0); gtk_widget_show (small_hbox); for(i=0;i<5;i++) { GLOBALS->menuitem_search[i] = gtk_radio_menu_item_new_with_label (group, regex_name[i]); group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (GLOBALS->menuitem_search[i])); gtk_menu_append (GTK_MENU (menu), GLOBALS->menuitem_search[i]); gtk_widget_show (GLOBALS->menuitem_search[i]); gtkwave_signal_connect(GTK_OBJECT (GLOBALS->menuitem_search[i]), "activate", GTK_SIGNAL_FUNC(regex_clicked), (void *)((intptr_t)i)); GLOBALS->regex_mutex_search_c_1[i]=0; gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (GLOBALS->menuitem_search[i]), FALSE); } GLOBALS->regex_which_search_c_1 = cached_which; if((GLOBALS->regex_which_search_c_1<0)||(GLOBALS->regex_which_search_c_1>4)) GLOBALS->regex_which_search_c_1 = 0; GLOBALS->regex_mutex_search_c_1[GLOBALS->regex_which_search_c_1]=1; /* configure for "range", etc */ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (GLOBALS->menuitem_search[GLOBALS->regex_which_search_c_1]), TRUE); optionmenu = gtk_option_menu_new (); gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu); gtk_box_pack_start (GTK_BOX (small_hbox), optionmenu, TRUE, FALSE, 0); gtk_widget_show (optionmenu); gtk_tooltips_set_tip_2(tooltips, optionmenu, "You may " "modify the search criteria by selecting ``Range'', ``Strand'', or ``None'' for suffix " "matching. This optionally matches the string you enter in the search string above with a Verilog " "format range (signal[7:0]), a strand (signal.1, signal.0), or with no suffix. " "The ``W'' modifier for ``Range'' and ``Strand'' explicitly matches on word boundaries. " "(addr matches unit.freezeaddr[63:0] for ``Range'' but only unit.addr[63:0] for ``WRange'' since addr has to be on a word boundary. " "Note that when ``None'' " "is selected, the search string may be located anywhere in the signal name.",NULL); gtk_box_pack_start (GTK_BOX (hbox0), small_hbox, FALSE, FALSE, 0); button7 = gtk_button_new_with_label (" Unselect All "); gtk_container_border_width (GTK_CONTAINER (button7), 3); gtkwave_signal_connect_object (GTK_OBJECT (button7), "clicked",GTK_SIGNAL_FUNC(unselect_all_callback),GTK_OBJECT (GLOBALS->window_search_c_7)); gtk_widget_show (button7); gtk_tooltips_set_tip_2(tooltips, button7, "Unhighlight all signals listed in the match window.",NULL); gtk_box_pack_start (GTK_BOX (hbox0), button7, TRUE, FALSE, 0); gtk_container_add (GTK_CONTAINER (frameh0), hbox0); frameh = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (frameh), 3); gtk_widget_show(frameh); gtk_table_attach (GTK_TABLE (table), frameh, 0, 1, 255, 256, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); hbox = gtk_hbox_new (FALSE, 1); gtk_widget_show (hbox); button1 = gtk_button_new_with_label ("Append"); gtk_container_border_width (GTK_CONTAINER (button1), 3); gtkwave_signal_connect_object (GTK_OBJECT (button1), "clicked",GTK_SIGNAL_FUNC(ok_callback),GTK_OBJECT (GLOBALS->window_search_c_7)); gtk_widget_show (button1); gtk_tooltips_set_tip_2(tooltips, button1, "Add selected signals to end of the display on the main window.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button1, TRUE, FALSE, 0); button2 = gtk_button_new_with_label (" Insert "); gtk_container_border_width (GTK_CONTAINER (button2), 3); gtkwave_signal_connect_object (GTK_OBJECT (button2), "clicked",GTK_SIGNAL_FUNC(insert_callback),GTK_OBJECT (GLOBALS->window_search_c_7)); gtk_widget_show (button2); gtk_tooltips_set_tip_2(tooltips, button2, "Add selected signals after last highlighted signal on the main window.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button2, TRUE, FALSE, 0); if(GLOBALS->vcd_explicit_zero_subscripts>=0) { button3 = gtk_button_new_with_label (" Bundle Up "); gtk_container_border_width (GTK_CONTAINER (button3), 3); gtkwave_signal_connect_object (GTK_OBJECT (button3), "clicked",GTK_SIGNAL_FUNC(bundle_callback_up),GTK_OBJECT (GLOBALS->window_search_c_7)); gtk_widget_show (button3); gtk_tooltips_set_tip_2(tooltips, button3, "Bundle selected signals into a single bit vector with the topmost selected signal as the LSB and the lowest as the MSB.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button3, TRUE, FALSE, 0); button3a = gtk_button_new_with_label (" Bundle Down "); gtk_container_border_width (GTK_CONTAINER (button3a), 3); gtkwave_signal_connect_object (GTK_OBJECT (button3a), "clicked",GTK_SIGNAL_FUNC(bundle_callback_down),GTK_OBJECT (GLOBALS->window_search_c_7)); gtk_widget_show (button3a); gtk_tooltips_set_tip_2(tooltips, button3a, "Bundle selected signals into a single bit vector with the topmost selected signal as the MSB and the lowest as the LSB.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button3a, TRUE, FALSE, 0); } button4 = gtk_button_new_with_label (" Replace "); gtk_container_border_width (GTK_CONTAINER (button4), 3); gtkwave_signal_connect_object (GTK_OBJECT (button4), "clicked",GTK_SIGNAL_FUNC(replace_callback),GTK_OBJECT (GLOBALS->window_search_c_7)); gtk_widget_show (button4); gtk_tooltips_set_tip_2(tooltips, button4, "Replace highlighted signals on the main window with signals selected above.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button4, TRUE, FALSE, 0); button5 = gtk_button_new_with_label (" Exit "); gtk_container_border_width (GTK_CONTAINER (button5), 3); gtkwave_signal_connect_object (GTK_OBJECT (button5), "clicked",GTK_SIGNAL_FUNC(destroy_callback),GTK_OBJECT (GLOBALS->window_search_c_7)); gtk_tooltips_set_tip_2(tooltips, button5, "Do nothing and return to the main window.",NULL); gtk_widget_show (button5); gtk_box_pack_start (GTK_BOX (hbox), button5, TRUE, FALSE, 0); gtk_container_add (GTK_CONTAINER (frameh), hbox); gtk_container_add (GTK_CONTAINER (GLOBALS->window_search_c_7), table); gtk_widget_show(GLOBALS->window_search_c_7); if(strlen(GLOBALS->searchbox_text_search_c_1)) search_enter_callback(GLOBALS->entry_search_c_3,NULL); } gtkwave-3.3.86/src/search.h0000664000175000017500000000107413166335473015013 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010 * * 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. */ #ifndef WAVE_SEARCHBOX_H #define WAVE_SEARCHBOX_H void searchbox(char *title, GtkSignalFunc func); void search_enter_callback(GtkWidget *widget, GtkWidget *do_warning); void search_insert_callback(GtkWidget *widget, char is_prepend); int searchbox_is_active(void); #endif gtkwave-3.3.86/src/regex.c0000664000175000017500000000471213166335473014655 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2004. * * 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. */ #include "globals.h" #include #ifdef _AIX #ifndef _GNUC_ #include #include #define REGEX_MALLOC #ifndef STDC_HEADERS #define STDC_HEADERS #endif #endif #endif #ifdef __linux__ #include #include #include #else #if defined __CYGWIN__ || defined __MINGW32__ #include #include #ifndef HAVE_BZERO #define bcopy(a,b,c) memcpy((b),(a),(c)) #define bzero(a,b) memset((a),0,(b)) #define bcmp(a,b,c) memcmp((a),(b),(c)) #endif #define REGEX_MAY_COMPILE #include "gnu_regex.c" #else /* or for any other compiler that doesn't support POSIX.2 regexs properly like xlc or vc++ */ #ifdef _MSC_VER #include #define STDC_HEADERS #define alloca _alloca /* AIX doesn't like this */ #endif #define REGEX_MAY_COMPILE #include "gnu_regex.c" #endif #endif #include "regex_wave.h" #include "debug.h" /* * compile a regular expression into a regex_t and * dealloc any previously valid ones */ int wave_regex_compile(char *regex, int which) { int comp_rc; if(GLOBALS->regex_ok_regex_c_1[which]) { regfree(&GLOBALS->preg_regex_c_1[which]); } /* free previous regex_t ancillary data if valid */ comp_rc=regcomp(&GLOBALS->preg_regex_c_1[which], regex, REG_ICASE|REG_NOSUB); return(GLOBALS->regex_ok_regex_c_1[which]=(comp_rc)?0:1); } /* * do match */ int wave_regex_match(char *str, int which) { int rc; if(GLOBALS->regex_ok_regex_c_1[which]) { rc = regexec(&GLOBALS->preg_regex_c_1[which], str, 0, NULL, 0); } else { rc = 1; /* fail on malformed regex */ } return((rc)?0:1); } /* * compile a regular expression and return the pointer to * the regex_t if valid else return NULL */ void *wave_regex_alloc_compile(char *regex) { regex_t *mreg = (regex_t *)malloc_2(sizeof(regex_t)); int comp_rc=regcomp(mreg, regex, REG_ICASE|REG_NOSUB); if(comp_rc) { free_2(mreg); mreg=NULL; } return((void *)mreg); } /* * do match */ int wave_regex_alloc_match(void *mreg, char *str) { int rc=regexec((regex_t *)mreg, str, 0, NULL, 0); return((rc)?0:1); } /* * free it */ void wave_regex_alloc_free(void *pnt) { regex_t *mreg = (regex_t *)pnt; if(mreg) { regfree(mreg); free_2(mreg); } } gtkwave-3.3.86/src/file.c0000664000175000017500000004055113166335473014463 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2013. * * 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. */ #include "globals.h" #include #include #include "gtk12compat.h" #include "menu.h" #include "debug.h" #include "wavealloca.h" #include #include /* #include */ #ifdef MAC_INTEGRATION #include #endif #if defined __MINGW32__ #include #endif #if GTK_CHECK_VERSION(2,4,0) #ifndef MAC_INTEGRATION static gboolean ffunc (const GtkFileFilterInfo *filter_info, gpointer data) { (void)data; const char *rms = strrchr(filter_info->filename, '\\'); const char *rms2; if(!rms) rms = filter_info->filename; else rms++; rms2 = strrchr(rms, '/'); if(!rms2) rms2 = rms; else rms2++; if(!GLOBALS->pFileChooseFilterName || !GLOBALS->pPatternSpec) { return(TRUE); } if(!strchr(GLOBALS->pFileChooseFilterName, '*') && !strchr(GLOBALS->pFileChooseFilterName, '?')) { char *fpos = strstr(rms2, GLOBALS->pFileChooseFilterName); return(fpos != NULL); } else { return(g_pattern_match_string(GLOBALS->pPatternSpec, rms2)); } } static void filter_edit_cb (GtkWidget *widget, GdkEventKey *ev, gpointer *data) { (void)ev; const char *t; gchar *folder_filename; if(GLOBALS->pFileChooseFilterName) { free_2((char *)GLOBALS->pFileChooseFilterName); GLOBALS->pFileChooseFilterName = NULL; } t = gtk_entry_get_text (GTK_ENTRY (widget)); if (t == NULL || *t == 0) { GLOBALS->pFileChooseFilterName = NULL; } else { GLOBALS->pFileChooseFilterName = malloc_2(strlen(t) + 1); strcpy(GLOBALS->pFileChooseFilterName, t); if(GLOBALS->pPatternSpec) g_pattern_spec_free(GLOBALS->pPatternSpec); GLOBALS->pPatternSpec = g_pattern_spec_new(t); } /* now force refresh with new filter */ folder_filename = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER(data)); if(folder_filename) { gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(data), folder_filename); g_free(folder_filename); } } static void press_callback (GtkWidget *widget, gpointer *data) { GdkEventKey ev; filter_edit_cb (widget, &ev, data); } #endif #endif static void enter_callback(GtkWidget *widget, GtkFileSelection *fw) { (void)widget; (void)fw; G_CONST_RETURN char *allocbuf; int alloclen; allocbuf=gtk_file_selection_get_filename(GTK_FILE_SELECTION(GLOBALS->fs_file_c_1)); if((alloclen=strlen(allocbuf))) { GLOBALS->filesel_ok=1; if(*GLOBALS->fileselbox_text) free_2(*GLOBALS->fileselbox_text); *GLOBALS->fileselbox_text=(char *)malloc_2(alloclen+1); strcpy(*GLOBALS->fileselbox_text, allocbuf); } DEBUG(printf("Filesel OK %s\n",allocbuf)); wave_gtk_grab_remove(GLOBALS->fs_file_c_1); gtk_widget_destroy(GLOBALS->fs_file_c_1); gtkwave_main_iteration(); GLOBALS->cleanup_file_c_2(); } static void cancel_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; DEBUG(printf("Filesel Entry Cancel\n")); wave_gtk_grab_remove(GLOBALS->fs_file_c_1); gtk_widget_destroy(GLOBALS->fs_file_c_1); gtkwave_main_iteration(); if(GLOBALS->bad_cleanup_file_c_1) GLOBALS->bad_cleanup_file_c_1(); } static void destroy_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; DEBUG(printf("Filesel Destroy\n")); gtkwave_main_iteration(); if(GLOBALS->bad_cleanup_file_c_1) GLOBALS->bad_cleanup_file_c_1(); } void fileselbox_old(char *title, char **filesel_path, GtkSignalFunc ok_func, GtkSignalFunc notok_func, char *pattn, int is_writemode) { #if defined __MINGW32__ OPENFILENAME ofn; char szFile[260]; /* buffer for file name */ char szPath[260]; /* buffer for path name */ char lpstrFilter[260]; /* more than enough room for some patterns */ BOOL rc; #else (void)pattn; (void)is_writemode; #endif GLOBALS->fileselbox_text=filesel_path; GLOBALS->filesel_ok=0; GLOBALS->cleanup_file_c_2=ok_func; GLOBALS->bad_cleanup_file_c_1=notok_func; #if defined __MINGW32__ ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.lpstrFile = szFile; ofn.lpstrFile[0] = '\0'; ofn.lpstrFilter = lpstrFilter; ofn.nMaxFile = sizeof(szFile); ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.Flags = is_writemode ? (OFN_CREATEPROMPT | OFN_OVERWRITEPROMPT) : (OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST); if((!pattn)||(!strcmp(pattn, "*"))) { sprintf(lpstrFilter, "%s%c%s%c", "All", 0, "*.*", 0); ofn.nFilterIndex = 0; } else { sprintf(lpstrFilter, "%s%c%s%c%s%c%s%c", pattn, 0, pattn, 0, "All", 0, "*.*", 0); /* cppcheck */ ofn.nFilterIndex = 0; } if(*filesel_path) { char *fsp = *filesel_path; int ch_idx = 0; char ch = 0; while(*fsp) { ch = *fsp; szFile[ch_idx++] = (ch != '/') ? ch : '\\'; fsp++; } szFile[ch_idx] = 0; if((ch == '/') || (ch == '\\')) { strcpy(szPath, szFile); szFile[0] = 0; ofn.lpstrInitialDir = szPath; } } rc = is_writemode ? GetSaveFileName(&ofn) : GetOpenFileName(&ofn); if (rc==TRUE) { GLOBALS->filesel_ok=1; if(*GLOBALS->fileselbox_text) free_2(*GLOBALS->fileselbox_text); if(!is_writemode) { *GLOBALS->fileselbox_text=(char *)strdup_2(szFile); } else { char *suf_str = NULL; int suf_add = 0; int szlen = 0; int suflen = 0; if(pattn) { suf_str = strstr(pattn, "*."); if(suf_str) suf_str++; } if(suf_str) { szlen = strlen(szFile); suflen = strlen(suf_str); if(suflen > szlen) { suf_add = 1; } else { if(strcasecmp(szFile + (szlen - suflen), suf_str)) { suf_add = 1; } } } if(suf_str && suf_add) { *GLOBALS->fileselbox_text=(char *)malloc_2(szlen + suflen + 1); strcpy(*GLOBALS->fileselbox_text, szFile); strcpy(*GLOBALS->fileselbox_text + szlen, suf_str); } else { *GLOBALS->fileselbox_text=(char *)strdup_2(szFile); } } GLOBALS->cleanup_file_c_2(); } else { if(GLOBALS->bad_cleanup_file_c_1) GLOBALS->bad_cleanup_file_c_1(); } #else GLOBALS->fs_file_c_1=gtk_file_selection_new(title); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->fs_file_c_1), "destroy", (GtkSignalFunc) destroy_callback, NULL); gtkwave_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(GLOBALS->fs_file_c_1)->ok_button), "clicked", (GtkSignalFunc) enter_callback, GTK_OBJECT(GLOBALS->fs_file_c_1)); gtkwave_signal_connect_object(GTK_OBJECT(GTK_FILE_SELECTION(GLOBALS->fs_file_c_1)->cancel_button),"clicked", (GtkSignalFunc) cancel_callback, GTK_OBJECT(GLOBALS->fs_file_c_1)); gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(GLOBALS->fs_file_c_1)); if(*GLOBALS->fileselbox_text) gtk_file_selection_set_filename(GTK_FILE_SELECTION(GLOBALS->fs_file_c_1), *GLOBALS->fileselbox_text); /* * XXX: filter on patterns when this feature eventually works (or for a later version of GTK)! * if((pattn)&&(pattn[0])) gtk_file_selection_complete(GTK_FILE_SELECTION(fs), pattn); */ gtk_widget_show(GLOBALS->fs_file_c_1); wave_gtk_grab_add(GLOBALS->fs_file_c_1); #endif } void fileselbox(char *title, char **filesel_path, GtkSignalFunc ok_func, GtkSignalFunc notok_func, char *pattn, int is_writemode) { #ifndef MAC_INTEGRATION #if GTK_CHECK_VERSION(2,4,0) int can_set_filename = 0; GtkWidget *pFileChoose; GtkWidget *pWindowMain; GtkFileFilter *filter; GtkWidget *label; GtkWidget *label_ent; GtkWidget *box; GtkTooltips *tooltips; struct Global *old_globals = GLOBALS; #endif #endif /* fix problem where ungrab doesn't occur if button pressed + simultaneous accelerator key occurs */ if(GLOBALS->in_button_press_wavewindow_c_1) { gdk_pointer_ungrab(GDK_CURRENT_TIME); } if(!*filesel_path) /* if no name specified, hijack loaded file name path */ { if(GLOBALS->loaded_file_name) { char *can = realpath_2(GLOBALS->loaded_file_name, NULL); /* prevents filechooser from blocking/asking where to save file */ char *tname = strdup_2(can ? can : GLOBALS->loaded_file_name); char *delim = strrchr(tname, '/'); if(!delim) delim = strrchr(tname, '\\'); if(delim) { *(delim+1) = 0; /* keep slash for gtk_file_chooser_set_filename vs gtk_file_chooser_set_current_folder test below */ *filesel_path = tname; } else { free_2(tname); } free(can); } } if(GLOBALS->wave_script_args) { char *s = NULL; GLOBALS->fileselbox_text=filesel_path; GLOBALS->filesel_ok=1; while((!s)&&(GLOBALS->wave_script_args->curr)) s = wave_script_args_fgetmalloc_stripspaces(GLOBALS->wave_script_args); if(*GLOBALS->fileselbox_text) free_2(*GLOBALS->fileselbox_text); if(!s) { fprintf(stderr, "Null filename passed to fileselbox in script, exiting.\n"); exit(255); } *GLOBALS->fileselbox_text = s; fprintf(stderr, "GTKWAVE | Filename '%s'\n", s); ok_func(); return; } #ifdef MAC_INTEGRATION GLOBALS->fileselbox_text=filesel_path; GLOBALS->filesel_ok=0; char *rc = gtk_file_req_bridge(title, *filesel_path, pattn, is_writemode); if(rc) { GLOBALS->filesel_ok=1; if(*GLOBALS->fileselbox_text) free_2(*GLOBALS->fileselbox_text); *GLOBALS->fileselbox_text=strdup_2(rc); g_free(rc); if(ok_func) ok_func(); } else { if(notok_func) notok_func(); } return; #else #if defined __MINGW32__ || !GTK_CHECK_VERSION(2,4,0) fileselbox_old(title, filesel_path, ok_func, notok_func, pattn, is_writemode); return; #else pWindowMain = GLOBALS->mainwindow; GLOBALS->fileselbox_text=filesel_path; GLOBALS->filesel_ok=0; if(*GLOBALS->fileselbox_text && (!g_path_is_absolute(*GLOBALS->fileselbox_text))) { #if defined __USE_BSD || defined __USE_XOPEN_EXTENDED || defined __CYGWIN__ || defined HAVE_REALPATH char *can = realpath_2(*GLOBALS->fileselbox_text, NULL); if(can) { if(*GLOBALS->fileselbox_text) free_2(*GLOBALS->fileselbox_text); *GLOBALS->fileselbox_text=(char *)malloc_2(strlen(can)+1); strcpy(*GLOBALS->fileselbox_text, can); free(can); can_set_filename = 1; } #else #if __GNUC__ #warning Absolute file path warnings might be issued by the file chooser dialogue on this system! #endif #endif } else { if(*GLOBALS->fileselbox_text) { can_set_filename = 1; } } if(is_writemode) { pFileChoose = gtk_file_chooser_dialog_new( title, NULL, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); #if GTK_CHECK_VERSION(2,8,0) gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER (pFileChoose), TRUE); #endif } else { pFileChoose = gtk_file_chooser_dialog_new( title, NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); } GLOBALS->pFileChoose = pFileChoose; if((can_set_filename) && (*filesel_path)) { int flen = strlen(*filesel_path); if(((*filesel_path)[flen-1]=='/') || ((*filesel_path)[flen-1]=='\\')) { gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(pFileChoose), *filesel_path); } else { gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(pFileChoose), *filesel_path); } } label=gtk_label_new("Custom Filter:"); label_ent=gtk_entry_new_with_max_length(40); tooltips=gtk_tooltips_new_2(); gtk_tooltips_set_delay_2(tooltips,1500); gtk_entry_set_text(GTK_ENTRY(label_ent), GLOBALS->pFileChooseFilterName ? GLOBALS->pFileChooseFilterName : "*"); gtk_signal_connect (GTK_OBJECT (label_ent), "changed",GTK_SIGNAL_FUNC (press_callback), pFileChoose); box=gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(box), label_ent, FALSE, FALSE, 0); gtk_widget_set_usize(GTK_WIDGET(label_ent), 300, 22); gtk_tooltips_set_tip_2(tooltips, label_ent, "Enter custom pattern match filter here. Note that \"string\" without * or ? achieves a match on \"*string*\".", NULL); gtk_widget_show(label_ent); gtk_widget_show(box); gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(pFileChoose), box); if(pattn) { int is_gtkw = suffix_check(pattn, ".gtkw"); int is_sav = suffix_check(pattn, ".sav"); filter = gtk_file_filter_new(); gtk_file_filter_add_pattern(filter, pattn); gtk_file_filter_set_name(filter, pattn); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileChoose), filter); if(is_gtkw || is_sav) { const char *pattn2 = is_sav ? "*.gtkw" : "*.sav"; filter = gtk_file_filter_new(); gtk_file_filter_add_pattern(filter, pattn2); gtk_file_filter_set_name(filter, pattn2); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileChoose), filter); } } if((!pattn) || (strcmp(pattn, "*"))) { filter = gtk_file_filter_new(); gtk_file_filter_add_pattern(filter, "*"); gtk_file_filter_set_name(filter, "*"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileChoose), filter); } filter = gtk_file_filter_new(); gtk_file_filter_add_custom(filter, GTK_FILE_FILTER_FILENAME, ffunc, NULL, NULL); gtk_file_filter_set_name(filter, "Custom"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(pFileChoose), filter); if(GLOBALS->pFileChooseFilterName) { GLOBALS->pPatternSpec = g_pattern_spec_new(GLOBALS->pFileChooseFilterName); } gtk_dialog_set_default_response(GTK_DIALOG(pFileChoose), GTK_RESPONSE_ACCEPT); gtk_object_set_data(GTK_OBJECT(pFileChoose), "FileChooseWindow", pFileChoose); gtk_container_set_border_width(GTK_CONTAINER(pFileChoose), 10); gtk_window_set_position(GTK_WINDOW(pFileChoose), GTK_WIN_POS_CENTER); gtk_window_set_modal(GTK_WINDOW(pFileChoose), TRUE); gtk_window_set_policy(GTK_WINDOW(pFileChoose), FALSE, FALSE, FALSE); gtk_window_set_resizable(GTK_WINDOW(pFileChoose), TRUE); /* some distros need this */ if(pWindowMain) { gtk_window_set_transient_for(GTK_WINDOW(pFileChoose), GTK_WINDOW(pWindowMain)); } gtk_widget_show(pFileChoose); wave_gtk_grab_add(pFileChoose); /* check against old_globals is because of DnD context swapping so make response fail */ if((gtk_dialog_run(GTK_DIALOG (pFileChoose)) == GTK_RESPONSE_ACCEPT) && (GLOBALS == old_globals) && (GLOBALS->fileselbox_text)) { G_CONST_RETURN char *allocbuf; int alloclen; allocbuf = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (pFileChoose)); if((alloclen=strlen(allocbuf))) { int gtkw_test = 0; GLOBALS->filesel_ok=1; if(*GLOBALS->fileselbox_text) free_2(*GLOBALS->fileselbox_text); *GLOBALS->fileselbox_text=(char *)malloc_2(alloclen+1); strcpy(*GLOBALS->fileselbox_text, allocbuf); /* add missing suffix to write files */ if(pattn && is_writemode) { char *s = *GLOBALS->fileselbox_text; char *s2; char *suffix = wave_alloca(strlen(pattn) + 1); char *term; int attempt_suffix = 1; strcpy(suffix, pattn); while((*suffix) && (*suffix != '.')) suffix++; term = *suffix ? suffix+1 : suffix; while((*term) && (isalnum((int)(unsigned char)*term))) term++; *term = 0; gtkw_test = suffix_check(pattn, ".gtkw") || suffix_check(pattn, ".sav"); if(gtkw_test) { attempt_suffix = (!suffix_check(s, ".gtkw")) && (!suffix_check(s, ".sav")); } if(attempt_suffix) { if(strlen(s) > strlen(suffix)) { if(strcmp(s + strlen(s) - strlen(suffix), suffix)) { goto fix_suffix; } } else { fix_suffix: s2 = malloc_2(strlen(s) + strlen(suffix) + 1); strcpy(s2, s); strcat(s2, suffix); free_2(s); *GLOBALS->fileselbox_text = s2; } } } if((gtkw_test) && (*GLOBALS->fileselbox_text)) { GLOBALS->is_gtkw_save_file = suffix_check(*GLOBALS->fileselbox_text, ".gtkw"); } } DEBUG(printf("Filesel OK %s\n",allocbuf)); wave_gtk_grab_remove(pFileChoose); gtk_widget_destroy(pFileChoose); GLOBALS->pFileChoose = NULL; /* keeps DND from firing */ gtkwave_main_iteration(); ok_func(); } else { DEBUG(printf("Filesel Entry Cancel\n")); wave_gtk_grab_remove(pFileChoose); gtk_widget_destroy(pFileChoose); GLOBALS->pFileChoose = NULL; /* keeps DND from firing */ gtkwave_main_iteration(); if(GLOBALS->bad_cleanup_file_c_1) notok_func(); } if(GLOBALS->pPatternSpec) { g_pattern_spec_free(GLOBALS->pPatternSpec); GLOBALS->pPatternSpec = NULL; } #endif #endif } gtkwave-3.3.86/src/vzt.c0000664000175000017500000005332613166335473014373 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2003-2012. * * 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. */ #include #include "globals.h" #include #include "vzt.h" #include "lx2.h" #ifndef _MSC_VER #include #endif #include #include #include #include "symbol.h" #include "vcd.h" #include "lxt.h" #include "lxt2_read.h" #include "vzt_read.h" #include "debug.h" #include "busy.h" #include "hierpack.h" /* * mainline */ TimeType vzt_main(char *fname, char *skip_start, char *skip_end) { int i; struct Node *n; struct symbol *s, *prevsymroot=NULL, *prevsym=NULL; signed char scale; unsigned int numalias = 0; struct symbol *sym_block = NULL; struct Node *node_block = NULL; char **f_name = NULL; GLOBALS->vzt_vzt_c_1 = vzt_rd_init_smp(fname, GLOBALS->num_cpus); if(!GLOBALS->vzt_vzt_c_1) { return(LLDescriptor(0)); /* look at GLOBALS->vzt_vzt_c_1 in caller for success status... */ } /* SPLASH */ splash_create(); vzt_rd_process_blocks_linearly(GLOBALS->vzt_vzt_c_1, 1); /* vzt_rd_set_max_block_mem_usage(vzt, 0); */ scale=(signed char)vzt_rd_get_timescale(GLOBALS->vzt_vzt_c_1); exponent_to_time_scale(scale); GLOBALS->global_time_offset = vzt_rd_get_timezero(GLOBALS->vzt_vzt_c_1); GLOBALS->numfacs=vzt_rd_get_num_facs(GLOBALS->vzt_vzt_c_1); GLOBALS->mvlfacs_vzt_c_3=(struct fac *)calloc_2(GLOBALS->numfacs,sizeof(struct fac)); f_name = calloc_2(F_NAME_MODULUS+1,sizeof(char *)); GLOBALS->vzt_table_vzt_c_1=(struct lx2_entry *)calloc_2(GLOBALS->numfacs, sizeof(struct lx2_entry)); sym_block = (struct symbol *)calloc_2(GLOBALS->numfacs, sizeof(struct symbol)); node_block=(struct Node *)calloc_2(GLOBALS->numfacs,sizeof(struct Node)); for(i=0;inumfacs;i++) { GLOBALS->mvlfacs_vzt_c_3[i].node_alias=vzt_rd_get_fac_rows(GLOBALS->vzt_vzt_c_1, i); node_block[i].msi=vzt_rd_get_fac_msb(GLOBALS->vzt_vzt_c_1, i); node_block[i].lsi=vzt_rd_get_fac_lsb(GLOBALS->vzt_vzt_c_1, i); GLOBALS->mvlfacs_vzt_c_3[i].flags=vzt_rd_get_fac_flags(GLOBALS->vzt_vzt_c_1, i); GLOBALS->mvlfacs_vzt_c_3[i].len=vzt_rd_get_fac_len(GLOBALS->vzt_vzt_c_1, i); } fprintf(stderr, VZT_RDLOAD"Finished building %d facs.\n", GLOBALS->numfacs); /* SPLASH */ splash_sync(1, 5); GLOBALS->first_cycle_vzt_c_3 = (TimeType) vzt_rd_get_start_time(GLOBALS->vzt_vzt_c_1) * GLOBALS->time_scale; GLOBALS->last_cycle_vzt_c_3 = (TimeType) vzt_rd_get_end_time(GLOBALS->vzt_vzt_c_1) * GLOBALS->time_scale; GLOBALS->total_cycles_vzt_c_3 = GLOBALS->last_cycle_vzt_c_3 - GLOBALS->first_cycle_vzt_c_3 + 1; /* do your stuff here..all useful info has been initialized by now */ if(!GLOBALS->hier_was_explicitly_set) /* set default hierarchy split char */ { GLOBALS->hier_delimeter='.'; } if(GLOBALS->numfacs) { char *fnam = vzt_rd_get_facname(GLOBALS->vzt_vzt_c_1, 0); int flen = strlen(fnam); f_name[0]=malloc_2(flen+1); strcpy(f_name[0], fnam); } for(i=0;inumfacs;i++) { char buf[65537]; char *str; struct fac *f; if(i!=(GLOBALS->numfacs-1)) { char *fnam = vzt_rd_get_facname(GLOBALS->vzt_vzt_c_1, i+1); int flen = strlen(fnam); f_name[(i+1)&F_NAME_MODULUS]=malloc_2(flen+1); strcpy(f_name[(i+1)&F_NAME_MODULUS], fnam); } if(i>1) { free_2(f_name[(i-2)&F_NAME_MODULUS]); f_name[(i-2)&F_NAME_MODULUS] = NULL; } if(GLOBALS->mvlfacs_vzt_c_3[i].flags&VZT_RD_SYM_F_ALIAS) { int alias = GLOBALS->mvlfacs_vzt_c_3[i].node_alias; f=GLOBALS->mvlfacs_vzt_c_3+alias; while(f->flags&VZT_RD_SYM_F_ALIAS) { f=GLOBALS->mvlfacs_vzt_c_3+f->node_alias; } numalias++; } else { f=GLOBALS->mvlfacs_vzt_c_3+i; } if((f->len>1)&& (!(f->flags&(VZT_RD_SYM_F_INTEGER|VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING))) ) { int len=sprintf(buf, "%s[%d:%d]", f_name[(i)&F_NAME_MODULUS],node_block[i].msi, node_block[i].lsi); str=malloc_2(len+1); if(!GLOBALS->alt_hier_delimeter) { strcpy(str, buf); } else { strcpy_vcdalt(str, buf, GLOBALS->alt_hier_delimeter); } s=&sym_block[i]; symadd_name_exists_sym_exists(s,str,0); prevsymroot = prevsym = NULL; } else { int gatecmp = (f->len==1) && (!(f->flags&(VZT_RD_SYM_F_INTEGER|VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING))) && (node_block[i].msi!=-1) && (node_block[i].lsi!=-1); int revcmp = gatecmp && (i) && (!strcmp(f_name[(i)&F_NAME_MODULUS], f_name[(i-1)&F_NAME_MODULUS])); if(gatecmp) { int len = sprintf(buf, "%s[%d]", f_name[(i)&F_NAME_MODULUS],node_block[i].msi); str=malloc_2(len+1); if(!GLOBALS->alt_hier_delimeter) { strcpy(str, buf); } else { strcpy_vcdalt(str, buf, GLOBALS->alt_hier_delimeter); } s=&sym_block[i]; symadd_name_exists_sym_exists(s,str,0); if((prevsym)&&(revcmp)&&(!strchr(f_name[(i)&F_NAME_MODULUS], '\\'))) /* allow chaining for search functions.. */ { prevsym->vec_root = prevsymroot; prevsym->vec_chain = s; s->vec_root = prevsymroot; prevsym = s; } else { prevsymroot = prevsym = s; } } else { str=malloc_2(strlen(f_name[(i)&F_NAME_MODULUS])+1); if(!GLOBALS->alt_hier_delimeter) { strcpy(str, f_name[(i)&F_NAME_MODULUS]); } else { strcpy_vcdalt(str, f_name[(i)&F_NAME_MODULUS], GLOBALS->alt_hier_delimeter); } s=&sym_block[i]; symadd_name_exists_sym_exists(s,str,0); prevsymroot = prevsym = NULL; if(f->flags&VZT_RD_SYM_F_INTEGER) { node_block[i].msi=31; node_block[i].lsi=0; GLOBALS->mvlfacs_vzt_c_3[i].len=32; } } } n=&node_block[i]; n->nname=s->name; n->mv.mvlfac = GLOBALS->mvlfacs_vzt_c_3+i; GLOBALS->mvlfacs_vzt_c_3[i].working_node = n; if((f->len>1)||(f->flags&(VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING))) { n->extvals = 1; } n->head.time=-1; /* mark 1st node as negative time */ n->head.v.h_val=AN_X; s->n=n; } for(i=0;i<=F_NAME_MODULUS;i++) { if(f_name[(i)&F_NAME_MODULUS]) { free_2(f_name[(i)&F_NAME_MODULUS]); f_name[(i)&F_NAME_MODULUS] = NULL; } } free_2(f_name); f_name = NULL; /* SPLASH */ splash_sync(2, 5); GLOBALS->facs=(struct symbol **)malloc_2(GLOBALS->numfacs*sizeof(struct symbol *)); if(GLOBALS->fast_tree_sort) { for(i=0;inumfacs;i++) { int len; GLOBALS->facs[i]=&sym_block[i]; if((len=strlen(GLOBALS->facs[i]->name))>GLOBALS->longestname) GLOBALS->longestname=len; } if(numalias) { int idx_lft = 0; int idx_lftmax = GLOBALS->numfacs - numalias; int idx_rgh = GLOBALS->numfacs - numalias; struct symbol **facs_merge=(struct symbol **)malloc_2(GLOBALS->numfacs*sizeof(struct symbol *)); fprintf(stderr, VZT_RDLOAD"Merging in %d aliases.\n", numalias); for(i=0;inumfacs;i++) /* fix possible tail appended aliases by remerging in partial one pass merge sort */ { if(strcmp(GLOBALS->facs[idx_lft]->name, GLOBALS->facs[idx_rgh]->name) <= 0) { facs_merge[i] = GLOBALS->facs[idx_lft++]; if(idx_lft == idx_lftmax) { for(i++;inumfacs;i++) { facs_merge[i] = GLOBALS->facs[idx_rgh++]; } } } else { facs_merge[i] = GLOBALS->facs[idx_rgh++]; if(idx_rgh == GLOBALS->numfacs) { for(i++;inumfacs;i++) { facs_merge[i] = GLOBALS->facs[idx_lft++]; } } } } free_2(GLOBALS->facs); GLOBALS->facs = facs_merge; } /* SPLASH */ splash_sync(3, 5); fprintf(stderr, VZT_RDLOAD"Building facility hierarchy tree.\n"); init_tree(); for(i=0;inumfacs;i++) { int esc = 0; char *subst = GLOBALS->facs[i]->name; char ch; while((ch=(*subst))) { if(ch==GLOBALS->hier_delimeter) { if(esc) *subst = VCDNAM_ESCAPE; } else if(ch=='\\') { esc = 1; GLOBALS->escaped_names_found_vcd_c_1 = 1; } subst++; } build_tree_from_name(GLOBALS->facs[i]->name, i); } /* SPLASH */ splash_sync(4, 5); if(GLOBALS->escaped_names_found_vcd_c_1) { for(i=0;inumfacs;i++) { char *subst, ch; subst=GLOBALS->facs[i]->name; while((ch=(*subst))) { if(ch==VCDNAM_ESCAPE) { *subst=GLOBALS->hier_delimeter; } /* restore back to normal */ subst++; } } } treegraft(&GLOBALS->treeroot); fprintf(stderr, VZT_RDLOAD"Sorting facility hierarchy tree.\n"); treesort(GLOBALS->treeroot, NULL); /* SPLASH */ splash_sync(5, 5); order_facs_from_treesort(GLOBALS->treeroot, &GLOBALS->facs); if(GLOBALS->escaped_names_found_vcd_c_1) { treenamefix(GLOBALS->treeroot); } GLOBALS->facs_are_sorted=1; } else { for(i=0;inumfacs;i++) { char *subst, ch; int len; int esc = 0; GLOBALS->facs[i]=&sym_block[i]; if((len=strlen(subst=GLOBALS->facs[i]->name))>GLOBALS->longestname) GLOBALS->longestname=len; while((ch=(*subst))) { #ifdef WAVE_HIERFIX if(ch==GLOBALS->hier_delimeter) { *subst=(!esc) ? VCDNAM_HIERSORT : VCDNAM_ESCAPE; } /* forces sort at hier boundaries */ #else if((ch==GLOBALS->hier_delimeter)&&(esc)) { *subst = VCDNAM_ESCAPE; } /* forces sort at hier boundaries */ #endif else if(ch=='\\') { esc = 1; GLOBALS->escaped_names_found_vcd_c_1 = 1; } subst++; } } /* SPLASH */ splash_sync(3, 5); fprintf(stderr, VZT_RDLOAD"Sorting facilities at hierarchy boundaries.\n"); wave_heapsort(GLOBALS->facs,GLOBALS->numfacs); #ifdef WAVE_HIERFIX for(i=0;inumfacs;i++) { char *subst, ch; subst=GLOBALS->facs[i]->name; while((ch=(*subst))) { if(ch==VCDNAM_HIERSORT) { *subst=GLOBALS->hier_delimeter; } /* restore back to normal */ subst++; } } #endif GLOBALS->facs_are_sorted=1; /* SPLASH */ splash_sync(4, 5); fprintf(stderr, VZT_RDLOAD"Building facility hierarchy tree.\n"); init_tree(); for(i=0;inumfacs;i++) { char *nf = GLOBALS->facs[i]->name; build_tree_from_name(nf, i); } /* SPLASH */ splash_sync(5, 5); if(GLOBALS->escaped_names_found_vcd_c_1) { for(i=0;inumfacs;i++) { char *subst, ch; subst=GLOBALS->facs[i]->name; while((ch=(*subst))) { if(ch==VCDNAM_ESCAPE) { *subst=GLOBALS->hier_delimeter; } /* restore back to normal */ subst++; } } } treegraft(&GLOBALS->treeroot); treesort(GLOBALS->treeroot, NULL); if(GLOBALS->escaped_names_found_vcd_c_1) { treenamefix(GLOBALS->treeroot); } } GLOBALS->min_time = GLOBALS->first_cycle_vzt_c_3; GLOBALS->max_time=GLOBALS->last_cycle_vzt_c_3; GLOBALS->is_lx2 = LXT2_IS_VZT; if(skip_start || skip_end) { TimeType b_start, b_end; if(!skip_start) b_start = GLOBALS->min_time; else b_start = unformat_time(skip_start, GLOBALS->time_dimension); if(!skip_end) b_end = GLOBALS->max_time; else b_end = unformat_time(skip_end, GLOBALS->time_dimension); if(b_startmin_time) b_start = GLOBALS->min_time; else if(b_start>GLOBALS->max_time) b_start = GLOBALS->max_time; if(b_endmin_time) b_end = GLOBALS->min_time; else if(b_end>GLOBALS->max_time) b_end = GLOBALS->max_time; if(b_start > b_end) { TimeType tmp_time = b_start; b_start = b_end; b_end = tmp_time; } if(!vzt_rd_limit_time_range(GLOBALS->vzt_vzt_c_1, b_start, b_end)) { fprintf(stderr, VZT_RDLOAD"--begin/--end options yield zero blocks, ignoring.\n"); vzt_rd_unlimit_time_range(GLOBALS->vzt_vzt_c_1); } else { GLOBALS->min_time = b_start; GLOBALS->max_time = b_end; } } /* SPLASH */ splash_finalize(); return(GLOBALS->max_time); } /* * vzt callback (only does bits for now) */ static void vzt_callback(struct vzt_rd_trace **lt, lxtint64_t *tim, lxtint32_t *facidx, char **value) { (void)lt; struct HistEnt *htemp = histent_calloc(); struct lx2_entry *l2e = GLOBALS->vzt_table_vzt_c_1+(*facidx); struct fac *f = GLOBALS->mvlfacs_vzt_c_3+(*facidx); GLOBALS->busycnt_vzt_c_2++; if(GLOBALS->busycnt_vzt_c_2==WAVE_BUSY_ITER) { busy_window_refresh(); GLOBALS->busycnt_vzt_c_2 = 0; } /* fprintf(stderr, "%lld %d %s\n", *tim, *facidx, *value); */ if(!(f->flags&(VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING))) { if(f->len>1) { htemp->v.h_vector = (char *)malloc_2(f->len); memcpy(htemp->v.h_vector, *value, f->len); } else { switch(**value) { case '0': htemp->v.h_val = AN_0; break; case '1': htemp->v.h_val = AN_1; break; case 'Z': case 'z': htemp->v.h_val = AN_Z; break; default: htemp->v.h_val = AN_X; break; } } } else if(f->flags&VZT_RD_SYM_F_DOUBLE) { #ifdef WAVE_HAS_H_DOUBLE sscanf(*value, "%lg", &htemp->v.h_double); #else double *d = malloc_2(sizeof(double)); sscanf(*value, "%lg", d); htemp->v.h_vector = (char *)d; #endif htemp->flags = HIST_REAL; } else /* string */ { char *s = malloc_2(strlen(*value)+1); strcpy(s, *value); htemp->v.h_vector = s; htemp->flags = HIST_REAL|HIST_STRING; } htemp->time = (*tim) * (GLOBALS->time_scale); if(l2e->histent_head) { l2e->histent_curr->next = htemp; l2e->histent_curr = htemp; } else { l2e->histent_head = l2e->histent_curr = htemp; } l2e->numtrans++; } /* * this is the black magic that handles aliased signals... */ static void vzt_resolver(nptr np, nptr resolve) { np->extvals = resolve->extvals; np->msi = resolve->msi; np->lsi = resolve->lsi; memcpy(&np->head, &resolve->head, sizeof(struct HistEnt)); np->curr = resolve->curr; np->harray = resolve->harray; np->numhist = resolve->numhist; np->mv.mvlfac=NULL; } /* * actually import a vzt trace but don't do it if it's already been imported */ void import_vzt_trace(nptr np) { struct HistEnt *htemp, *histent_tail; int len, i; struct fac *f; int txidx; nptr nold = np; if(!(f=np->mv.mvlfac)) return; /* already imported */ txidx = f - GLOBALS->mvlfacs_vzt_c_3; if(np->mv.mvlfac->flags&VZT_RD_SYM_F_ALIAS) { txidx = vzt_rd_get_alias_root(GLOBALS->vzt_vzt_c_1, txidx); np = GLOBALS->mvlfacs_vzt_c_3[txidx].working_node; if(!(f=np->mv.mvlfac)) { vzt_resolver(nold, np); return; /* already imported */ } } fprintf(stderr, "Import: %s\n", np->nname); /* new stuff */ len = np->mv.mvlfac->len; if(f->node_alias <= 1) /* sorry, arrays not supported, but vzt doesn't support them yet either */ { vzt_rd_set_fac_process_mask(GLOBALS->vzt_vzt_c_1, txidx); vzt_rd_iter_blocks(GLOBALS->vzt_vzt_c_1, vzt_callback, NULL); vzt_rd_clr_fac_process_mask(GLOBALS->vzt_vzt_c_1, txidx); } histent_tail = htemp = histent_calloc(); if(len>1) { htemp->v.h_vector = (char *)malloc_2(len); for(i=0;iv.h_vector[i] = AN_Z; } else { htemp->v.h_val = AN_Z; /* z */ } htemp->time = MAX_HISTENT_TIME; htemp = histent_calloc(); if(len>1) { htemp->v.h_vector = (char *)malloc_2(len); for(i=0;iv.h_vector[i] = AN_X; } else { htemp->v.h_val = AN_X; /* x */ } htemp->time = MAX_HISTENT_TIME-1; htemp->next = histent_tail; if(GLOBALS->vzt_table_vzt_c_1[txidx].histent_curr) { GLOBALS->vzt_table_vzt_c_1[txidx].histent_curr->next = htemp; htemp = GLOBALS->vzt_table_vzt_c_1[txidx].histent_head; } if(!(f->flags&(VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING))) { if(len>1) { np->head.v.h_vector = (char *)malloc_2(len); for(i=0;ihead.v.h_vector[i] = AN_X; } else { np->head.v.h_val = AN_X; /* x */ } } else { np->head.flags = HIST_REAL; if(f->flags&VZT_RD_SYM_F_STRING) np->head.flags |= HIST_STRING; } { struct HistEnt *htemp2 = histent_calloc(); htemp2->time = -1; if(len>1) { htemp2->v.h_vector = htemp->v.h_vector; } else { htemp2->v.h_val = htemp->v.h_val; } htemp2->next = htemp; htemp = htemp2; GLOBALS->vzt_table_vzt_c_1[txidx].numtrans++; } np->head.time = -2; np->head.next = htemp; np->numhist=GLOBALS->vzt_table_vzt_c_1[txidx].numtrans +2 /*endcap*/ +1 /*frontcap*/; memset(GLOBALS->vzt_table_vzt_c_1+txidx, 0, sizeof(struct lx2_entry)); /* zero it out */ np->curr = histent_tail; np->mv.mvlfac = NULL; /* it's imported and cached so we can forget it's an mvlfac now */ if(nold!=np) { vzt_resolver(nold, np); } } /* * pre-import many traces at once so function above doesn't have to iterate... */ void vzt_set_fac_process_mask(nptr np) { struct fac *f; int txidx; if(!(f=np->mv.mvlfac)) return; /* already imported */ txidx = f-GLOBALS->mvlfacs_vzt_c_3; if(np->mv.mvlfac->flags&VZT_RD_SYM_F_ALIAS) { txidx = vzt_rd_get_alias_root(GLOBALS->vzt_vzt_c_1, txidx); np = GLOBALS->mvlfacs_vzt_c_3[txidx].working_node; if(!(np->mv.mvlfac)) return; /* already imported */ } if(np->mv.mvlfac->node_alias <= 1) /* sorry, arrays not supported, but vzt doesn't support them yet either */ { vzt_rd_set_fac_process_mask(GLOBALS->vzt_vzt_c_1, txidx); GLOBALS->vzt_table_vzt_c_1[txidx].np = np; } } void vzt_import_masked(void) { int txidx, i, cnt; cnt = 0; for(txidx=0;txidxnumfacs;txidx++) { if(vzt_rd_get_fac_process_mask(GLOBALS->vzt_vzt_c_1, txidx)) { cnt++; } } if(!cnt) return; if(cnt>100) { fprintf(stderr, VZT_RDLOAD"Extracting %d traces\n", cnt); } set_window_busy(NULL); vzt_rd_iter_blocks(GLOBALS->vzt_vzt_c_1, vzt_callback, NULL); set_window_idle(NULL); for(txidx=0;txidxnumfacs;txidx++) { if(vzt_rd_get_fac_process_mask(GLOBALS->vzt_vzt_c_1, txidx)) { struct HistEnt *htemp, *histent_tail; struct fac *f = GLOBALS->mvlfacs_vzt_c_3+txidx; int len = f->len; nptr np = GLOBALS->vzt_table_vzt_c_1[txidx].np; histent_tail = htemp = histent_calloc(); if(len>1) { htemp->v.h_vector = (char *)malloc_2(len); for(i=0;iv.h_vector[i] = AN_Z; } else { htemp->v.h_val = AN_Z; /* z */ } htemp->time = MAX_HISTENT_TIME; htemp = histent_calloc(); if(len>1) { htemp->v.h_vector = (char *)malloc_2(len); for(i=0;iv.h_vector[i] = AN_X; } else { htemp->v.h_val = AN_X; /* x */ } htemp->time = MAX_HISTENT_TIME-1; htemp->next = histent_tail; if(GLOBALS->vzt_table_vzt_c_1[txidx].histent_curr) { GLOBALS->vzt_table_vzt_c_1[txidx].histent_curr->next = htemp; htemp = GLOBALS->vzt_table_vzt_c_1[txidx].histent_head; } if(!(f->flags&(VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING))) { if(len>1) { np->head.v.h_vector = (char *)malloc_2(len); for(i=0;ihead.v.h_vector[i] = AN_X; } else { np->head.v.h_val = AN_X; /* x */ } } else { np->head.flags = HIST_REAL; if(f->flags&VZT_RD_SYM_F_STRING) np->head.flags |= HIST_STRING; } { struct HistEnt *htemp2 = histent_calloc(); htemp2->time = -1; if(len>1) { htemp2->v.h_vector = htemp->v.h_vector; } else { htemp2->v.h_val = htemp->v.h_val; } htemp2->next = htemp; htemp = htemp2; GLOBALS->vzt_table_vzt_c_1[txidx].numtrans++; } np->head.time = -2; np->head.next = htemp; np->numhist=GLOBALS->vzt_table_vzt_c_1[txidx].numtrans +2 /*endcap*/ +1 /*frontcap*/; memset(GLOBALS->vzt_table_vzt_c_1+txidx, 0, sizeof(struct lx2_entry)); /* zero it out */ np->curr = histent_tail; np->mv.mvlfac = NULL; /* it's imported and cached so we can forget it's an mvlfac now */ vzt_rd_clr_fac_process_mask(GLOBALS->vzt_vzt_c_1, txidx); } } } gtkwave-3.3.86/src/file.h0000664000175000017500000000116013166335473014461 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010-2013 * * 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. */ #ifndef WAVE_FILESEL_H #define WAVE_FILESEL_H void fileselbox_old(char *title, char **filesel_path, GtkSignalFunc ok_func, GtkSignalFunc notok_func, char *pattn, int is_writemode); void fileselbox(char *title, char **filesel_path, GtkSignalFunc ok_func, GtkSignalFunc notok_func, char *pattn, int is_writemode); #endif gtkwave-3.3.86/src/mouseover.c0000664000175000017500000003046213166335473015570 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2006-2016. * * 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. */ /* AIX may need this for alloca to work */ #if defined _AIX #pragma alloca #endif #include "globals.h" #include #include #include #include #include #include "main.h" #include "currenttime.h" #include "color.h" #include "bsearch.h" /************************************************************************************************/ static int determine_trace_flags(Trptr t, char *ch) { unsigned int flags = t->flags; int pos = 0; /* [0] */ if((flags & TR_SIGNED) != 0) { ch[pos++] = '+'; } /* [1] */ if((flags & TR_HEX) != 0) { ch[pos++] = 'X'; } else if ((flags & TR_ASCII) != 0) { ch[pos++] = 'A'; } else if ((flags & TR_DEC) != 0) { ch[pos++] = 'D'; } else if ((flags & TR_BIN) != 0) { ch[pos++] = 'B'; } else if ((flags & TR_OCT) != 0) { ch[pos++] = 'O'; } /* [2] */ if((flags & TR_RJUSTIFY) != 0) { ch[pos++] = 'J'; } /* [3] */ if((flags & TR_INVERT) != 0) { ch[pos++] = '~'; } /* [4] */ if((flags & TR_REVERSE) != 0) { ch[pos++] = 'V'; } /* [5] */ if((flags & (TR_ANALOG_STEP|TR_ANALOG_INTERPOLATED)) == (TR_ANALOG_STEP|TR_ANALOG_INTERPOLATED)) { ch[pos++] = '*'; } else if((flags & TR_ANALOG_STEP) != 0) { ch[pos++] = 'S'; } else if((flags & TR_ANALOG_INTERPOLATED) != 0) { ch[pos++] = 'I'; } /* [6] */ if((flags & TR_REAL) != 0) { ch[pos++] = 'R'; } /* [7] */ if((flags & TR_REAL2BITS) != 0) { ch[pos++] = 'r'; } /* [8] */ if((flags & TR_ZEROFILL) != 0) { ch[pos++] = '0'; } else if((flags & TR_ONEFILL) != 0) { ch[pos++] = '1'; } /* [9] */ if((flags & TR_BINGRAY) != 0) { ch[pos++] = 'G'; } /* [10] */ if((flags & TR_GRAYBIN) != 0) { ch[pos++] = 'g'; } /* [11] */ if((flags & TR_FTRANSLATED) != 0) { ch[pos++] = 'F'; } /* [12] */ if((flags & TR_PTRANSLATED) != 0) { ch[pos++] = 'P'; } /* [13] */ if((flags & TR_TTRANSLATED) != 0) { ch[pos++] = 'T'; } /* [14] */ if((flags & TR_POPCNT) != 0) { ch[pos++] = 'p'; } /* [15] */ if((flags & TR_FPDECSHIFT) != 0) { int ln = sprintf(ch+pos, "s(%d)", t->t_fpdecshift); pos += ln; } /* [16+] */ ch[pos] = 0; return(pos); } /************************************************************************************************/ static void local_trace_asciival(Trptr t, TimeType tim, int *nmaxlen, int *vmaxlen, char **asciivalue) { int len=0; int vlen=0; if(t->name) { len=font_engine_string_measure(GLOBALS->wavefont, t->name); if((tim!=-1)&&(!(t->flags&TR_EXCLUDE))) { GLOBALS->shift_timebase=t->shift; if(t->vector) { char *str; vptr v; v=bsearch_vector(t->n.vec,tim - t->shift); str=convert_ascii(t,v); if(str) { vlen=font_engine_string_measure(GLOBALS->wavefont,str); *asciivalue=str; } else { vlen=0; *asciivalue=NULL; } } else { char *str; hptr h_ptr; if((h_ptr=bsearch_node(t->n.nd,tim - t->shift))) { if(!t->n.nd->extvals) { unsigned char h_val = h_ptr->v.h_val; if(t->n.nd->vartype == ND_VCD_EVENT) { h_val = (h_ptr->time >= GLOBALS->tims.first) && ((GLOBALS->tims.marker-GLOBALS->shift_timebase) == h_ptr->time) ? AN_1 : AN_0; /* generate impulse */ } str=(char *)calloc_2(1,2*sizeof(char)); if(t->flags&TR_INVERT) { str[0]=AN_STR_INV[h_val]; } else { str[0]=AN_STR[h_val]; } *asciivalue=str; vlen=font_engine_string_measure(GLOBALS->wavefont,str); } else { if(h_ptr->flags&HIST_REAL) { if(!(h_ptr->flags&HIST_STRING)) { #ifdef WAVE_HAS_H_DOUBLE str=convert_ascii_real(t, &h_ptr->v.h_double); #else str=convert_ascii_real(t, (double *)h_ptr->v.h_vector); #endif } else { str=convert_ascii_string((char *)h_ptr->v.h_vector); } } else { str=convert_ascii_vec(t,h_ptr->v.h_vector); } if(str) { vlen=font_engine_string_measure(GLOBALS->wavefont,str); *asciivalue=str; } else { vlen=0; *asciivalue=NULL; } } } else { vlen=0; *asciivalue=NULL; } } } } *nmaxlen = len; *vmaxlen = vlen; } /************************************************************************************************/ static gint expose_event(GtkWidget *widget, GdkEventExpose *event) { gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE(widget)], GLOBALS->mo_pixmap_mouseover_c_1, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); return(FALSE); } static void create_mouseover(gint x, gint y, gint width, gint height) { GLOBALS->mo_width_mouseover_c_1 = width; GLOBALS->mo_height_mouseover_c_1 = height; GLOBALS->mouseover_mouseover_c_1 = gtk_window_new(GTK_WINDOW_POPUP); gtk_window_set_default_size(GTK_WINDOW (GLOBALS->mouseover_mouseover_c_1), width, height); #ifdef WAVE_USE_GTK2 gtk_window_set_type_hint(GTK_WINDOW(GLOBALS->mouseover_mouseover_c_1), GDK_WINDOW_TYPE_HINT_SPLASHSCREEN); gtk_window_move(GTK_WINDOW(GLOBALS->mouseover_mouseover_c_1), x, y); #endif GLOBALS->mo_area_mouseover_c_1=gtk_drawing_area_new(); gtk_container_add(GTK_CONTAINER(GLOBALS->mouseover_mouseover_c_1), GLOBALS->mo_area_mouseover_c_1); gtk_widget_show(GLOBALS->mo_area_mouseover_c_1); gtk_widget_show(GLOBALS->mouseover_mouseover_c_1); #ifndef WAVE_USE_GTK2 gtk_window_reposition(GTK_WINDOW(GLOBALS->mouseover_mouseover_c_1), x, y); /* cuts down on GTK+-1.2 visual noise by moving it here */ #endif GLOBALS->mo_pixmap_mouseover_c_1 = gdk_pixmap_new(GLOBALS->mo_area_mouseover_c_1->window, GLOBALS->mouseover_mouseover_c_1->allocation.width, GLOBALS->mouseover_mouseover_c_1->allocation.height, -1); if(!GLOBALS->mo_dk_gray_mouseover_c_1) GLOBALS->mo_dk_gray_mouseover_c_1 = alloc_color(GLOBALS->mo_area_mouseover_c_1, 0x00cccccc, NULL); if(!GLOBALS->mo_black_mouseover_c_1) GLOBALS->mo_black_mouseover_c_1 = alloc_color(GLOBALS->mo_area_mouseover_c_1, 0x00000000, NULL); gdk_draw_rectangle(GLOBALS->mo_pixmap_mouseover_c_1, GLOBALS->mo_dk_gray_mouseover_c_1, TRUE, 0,0, GLOBALS->mo_width_mouseover_c_1, GLOBALS->mo_height_mouseover_c_1); gdk_draw_rectangle(GLOBALS->mo_pixmap_mouseover_c_1, GLOBALS->mo_black_mouseover_c_1, TRUE, 1,1, GLOBALS->mo_width_mouseover_c_1-2, GLOBALS->mo_height_mouseover_c_1-2); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->mo_area_mouseover_c_1), "expose_event",GTK_SIGNAL_FUNC(expose_event), NULL); } #define MOUSEOVER_BREAKSIZE (32) #define MOUSEOVER_BREAKSIZE_ROWS (64) void move_mouseover(Trptr t, gint xin, gint yin, TimeType tim) { gint xd = 0, yd = 0; char *asciivalue = NULL; int nmaxlen = 0, vmaxlen = 0; int totalmax = 0; int name_charlen = 0, value_charlen = 0; int num_info_rows = 2; char *flagged_name = NULL; char *alternate_name = NULL; int fh; char flag_string[65]; if(GLOBALS->disable_mouseover) { if(GLOBALS->mouseover_mouseover_c_1) { gtk_widget_destroy(GLOBALS->mouseover_mouseover_c_1); GLOBALS->mouseover_mouseover_c_1 = NULL; gdk_pixmap_unref(GLOBALS->mo_pixmap_mouseover_c_1); GLOBALS->mo_pixmap_mouseover_c_1 = NULL; } goto bot; } fh = GLOBALS->wavefont->ascent+GLOBALS->wavefont->descent; if(t) { local_trace_asciival(t, tim, &nmaxlen, &vmaxlen, &asciivalue); value_charlen = asciivalue ? strlen(asciivalue) : 0; #ifdef WAVE_USE_GTK2 if(GLOBALS->clipboard_mouseover) { GdkDisplay *g = gdk_display_get_default(); GtkClipboard *clip = gtk_clipboard_get_for_display (g, GDK_SELECTION_CLIPBOARD); /* GDK_SELECTION_PRIMARY is middle mouse button */ gtk_clipboard_set_text (clip, asciivalue ? asciivalue : "", value_charlen); } #endif name_charlen = t->name ? strlen(t->name) : 0; if(name_charlen) { int len = determine_trace_flags(t, flag_string); flagged_name = malloc_2(name_charlen + 1 + len + 1); memcpy(flagged_name, t->name, name_charlen); flagged_name[name_charlen] = ' '; strcpy(flagged_name+name_charlen+1, flag_string); name_charlen += (len + 1); } if(name_charlen > MOUSEOVER_BREAKSIZE) { alternate_name = malloc_2(MOUSEOVER_BREAKSIZE + 1); strcpy(alternate_name, "..."); strcpy(alternate_name + 3, flagged_name + name_charlen - (MOUSEOVER_BREAKSIZE - 3)); nmaxlen=font_engine_string_measure(GLOBALS->wavefont, alternate_name); } else { nmaxlen=font_engine_string_measure(GLOBALS->wavefont, flagged_name); } if(value_charlen > MOUSEOVER_BREAKSIZE) { char breakbuf[MOUSEOVER_BREAKSIZE+1]; int i, localmax; num_info_rows = (value_charlen + (MOUSEOVER_BREAKSIZE-1)) / MOUSEOVER_BREAKSIZE; vmaxlen = 0; for(i=0;iwavefont, breakbuf); vmaxlen = (localmax > vmaxlen) ? localmax : vmaxlen; } num_info_rows++; } if(num_info_rows > MOUSEOVER_BREAKSIZE_ROWS) num_info_rows = MOUSEOVER_BREAKSIZE_ROWS; /* prevent possible X11 overflow */ totalmax = (nmaxlen > vmaxlen) ? nmaxlen : vmaxlen; totalmax += 8; totalmax = (totalmax + 1) & ~1; /* round up to next even pixel count */ if((GLOBALS->mouseover_mouseover_c_1)&&((totalmax != GLOBALS->mo_width_mouseover_c_1)||((num_info_rows * fh + 7) != GLOBALS->mo_height_mouseover_c_1))) { gtk_widget_destroy(GLOBALS->mouseover_mouseover_c_1); GLOBALS->mouseover_mouseover_c_1 = NULL; gdk_pixmap_unref(GLOBALS->mo_pixmap_mouseover_c_1); GLOBALS->mo_pixmap_mouseover_c_1 = NULL; } } if((!t)||(yin<0)||(yin>GLOBALS->waveheight)) { if(GLOBALS->mouseover_mouseover_c_1) { gtk_widget_destroy(GLOBALS->mouseover_mouseover_c_1); GLOBALS->mouseover_mouseover_c_1 = NULL; gdk_pixmap_unref(GLOBALS->mo_pixmap_mouseover_c_1); GLOBALS->mo_pixmap_mouseover_c_1 = NULL; } goto bot; } if(!GLOBALS->mouseover_mouseover_c_1) { #ifdef WAVE_USE_GTK2 gdk_window_get_origin(GLOBALS->wavearea->window, &xd, &yd); #else gdk_window_get_deskrelative_origin(GLOBALS->wavearea->window, &xd, &yd); #endif create_mouseover(xin + xd + 8, yin + yd + 20, totalmax, num_info_rows * fh + 7); } else { #ifdef WAVE_USE_GTK2 gdk_window_get_origin(GLOBALS->wavearea->window, &xd, &yd); gtk_window_move(GTK_WINDOW(GLOBALS->mouseover_mouseover_c_1), xin + xd + 8, yin + yd + 20); #else gdk_window_get_deskrelative_origin(GLOBALS->wavearea->window, &xd, &yd); gtk_window_reposition(GTK_WINDOW(GLOBALS->mouseover_mouseover_c_1), xin + xd + 8, yin + yd + 20); #endif } gdk_draw_rectangle(GLOBALS->mo_pixmap_mouseover_c_1, GLOBALS->mo_dk_gray_mouseover_c_1, TRUE, 0,0, GLOBALS->mo_width_mouseover_c_1, GLOBALS->mo_height_mouseover_c_1); gdk_draw_rectangle(GLOBALS->mo_pixmap_mouseover_c_1, GLOBALS->mo_black_mouseover_c_1, TRUE, 1,1, GLOBALS->mo_width_mouseover_c_1-2, GLOBALS->mo_height_mouseover_c_1-2); font_engine_draw_string(GLOBALS->mo_pixmap_mouseover_c_1, GLOBALS->wavefont, GLOBALS->mo_dk_gray_mouseover_c_1, 4, fh + 2, alternate_name ? alternate_name : flagged_name); if(num_info_rows == 2) { if(asciivalue) font_engine_draw_string(GLOBALS->mo_pixmap_mouseover_c_1, GLOBALS->wavefont, GLOBALS->mo_dk_gray_mouseover_c_1, 4, 2*fh+2, asciivalue); } else { char breakbuf[MOUSEOVER_BREAKSIZE+1]; int i; num_info_rows--; for(i=0;imo_pixmap_mouseover_c_1, GLOBALS->wavefont, GLOBALS->mo_dk_gray_mouseover_c_1, 4, ((2+i)*fh)+2, breakbuf); } } gdk_window_raise(GLOBALS->mouseover_mouseover_c_1->window); gdk_draw_pixmap(GLOBALS->mo_area_mouseover_c_1->window, GLOBALS->mo_area_mouseover_c_1->style->fg_gc[GTK_WIDGET_STATE(GLOBALS->mouseover_mouseover_c_1)],GLOBALS->mo_pixmap_mouseover_c_1,0,0,0,0,GLOBALS->mo_width_mouseover_c_1, GLOBALS->mo_height_mouseover_c_1); bot: if(asciivalue) { free_2(asciivalue); } if(alternate_name) { free_2(alternate_name); } if(flagged_name) { free_2(flagged_name); } } gtkwave-3.3.86/src/help.c0000664000175000017500000001555713166335473014504 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2008 * * 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. */ #include "globals.h" #include #include #include "debug.h" #include "symbol.h" #include "currenttime.h" /* Add some text to our text widget - this is a callback that is invoked when our window is realized. We could also force our window to be realized with gtk_widget_realize, but it would have to be part of a hierarchy first */ void help_text(char *str) { #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) gtk_text_buffer_insert (GTK_TEXT_VIEW (GLOBALS->text_help_c_1)->buffer, &GLOBALS->iter_help_c_1, str, -1); #else gtk_text_insert (GTK_TEXT (GLOBALS->text_help_c_1), NULL, &GLOBALS->text_help_c_1->style->black, NULL, str, -1); #endif gdk_window_raise(GLOBALS->window_help_c_2->window); } void help_text_bold(char *str) { #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) gtk_text_buffer_insert_with_tags (GTK_TEXT_VIEW (GLOBALS->text_help_c_1)->buffer, &GLOBALS->iter_help_c_1, str, -1, GLOBALS->bold_tag_help_c_1, NULL); #else gtk_text_insert (GTK_TEXT (GLOBALS->text_help_c_1), NULL, &GLOBALS->text_help_c_1->style->fg[GTK_STATE_SELECTED], &GLOBALS->text_help_c_1->style->bg[GTK_STATE_SELECTED], str, -1); #endif gdk_window_raise(GLOBALS->window_help_c_2->window); } static void help_realize_text (GtkWidget *text, gpointer data) { (void)text; (void)data; if(GLOBALS->loaded_file_type == MISSING_FILE) { help_text("To load a dumpfile into the viewer, either drag the icon" " for it from the desktop or use the appropriate option(s)" " from the "); help_text_bold("File"); help_text(" menu.\n\n"); } help_text("Click on any menu item or button that corresponds to a menu item" " for its full description. Pressing a hotkey for a menu item" " is also allowed."); } /* Create a scrolled text area that displays a "message" */ static GtkWidget *create_help_text (void) { GtkWidget *table; /* Create a table to hold the text widget and scrollbars */ table = gtk_table_new (1, 16, FALSE); /* Put a text widget in the upper left hand corner. Note the use of * GTK_SHRINK in the y direction */ #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) GLOBALS->text_help_c_1 = gtk_text_view_new (); gtk_text_view_set_editable (GTK_TEXT_VIEW(GLOBALS->text_help_c_1), FALSE); gtk_text_buffer_get_start_iter (gtk_text_view_get_buffer(GTK_TEXT_VIEW (GLOBALS->text_help_c_1)), &GLOBALS->iter_help_c_1); GLOBALS->bold_tag_help_c_1 = gtk_text_buffer_create_tag (GTK_TEXT_VIEW (GLOBALS->text_help_c_1)->buffer, "bold", "weight", PANGO_WEIGHT_BOLD, NULL); #else GLOBALS->text_help_c_1 = gtk_text_new (NULL, NULL); gtk_text_set_editable(GTK_TEXT(GLOBALS->text_help_c_1), FALSE); #endif gtk_table_attach (GTK_TABLE (table), GLOBALS->text_help_c_1, 0, 14, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_SHRINK | GTK_EXPAND, 0, 0); gtk_widget_set_usize(GTK_WIDGET(GLOBALS->text_help_c_1), 100, 50); gtk_widget_show (GLOBALS->text_help_c_1); /* And a VScrollbar in the upper right */ #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) { GtkTextViewClass *tc = (GtkTextViewClass*)GTK_OBJECT_GET_CLASS(GTK_OBJECT(GLOBALS->text_help_c_1)); tc->set_scroll_adjustments(GTK_TEXT_VIEW (GLOBALS->text_help_c_1), NULL, NULL); GLOBALS->vscrollbar_help_c_1 = gtk_vscrollbar_new (GTK_TEXT_VIEW (GLOBALS->text_help_c_1)->vadjustment); } #else GLOBALS->vscrollbar_help_c_1 = gtk_vscrollbar_new (GTK_TEXT (GLOBALS->text_help_c_1)->vadj); #endif gtk_table_attach (GTK_TABLE (table), GLOBALS->vscrollbar_help_c_1, 15, 16, 0, 1,GTK_FILL, GTK_FILL | GTK_SHRINK | GTK_EXPAND, 0, 0); gtk_widget_show (GLOBALS->vscrollbar_help_c_1); /* Add a handler to put a message in the text widget when it is realized */ gtkwave_signal_connect (GTK_OBJECT (GLOBALS->text_help_c_1), "realize", GTK_SIGNAL_FUNC (help_realize_text), NULL); #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(GLOBALS->text_help_c_1), GTK_WRAP_WORD); #else gtk_text_set_word_wrap(GTK_TEXT(GLOBALS->text_help_c_1), TRUE); #endif return(table); } /***********************************************************************************/ static void ok_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; GLOBALS->helpbox_is_active=0; DEBUG(printf("OK\n")); gtk_widget_destroy(GLOBALS->window_help_c_2); GLOBALS->window_help_c_2 = NULL; } void helpbox(char *title, int width, char *default_text) { GtkWidget *vbox, *hbox; GtkWidget *button1; GtkWidget *label, *separator; GtkWidget *ctext; /* fix problem where ungrab doesn't occur if button pressed + simultaneous accelerator key occurs */ if(GLOBALS->in_button_press_wavewindow_c_1) { gdk_pointer_ungrab(GDK_CURRENT_TIME); } if(GLOBALS->helpbox_is_active) return; GLOBALS->helpbox_is_active=1; /* create a new nonmodal window */ GLOBALS->window_help_c_2 = gtk_window_new(GLOBALS->disable_window_manager ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL); install_focus_cb(GLOBALS->window_help_c_2, ((char *)&GLOBALS->window_help_c_2) - ((char *)GLOBALS)); gtk_widget_set_usize( GTK_WIDGET (GLOBALS->window_help_c_2), width, 400); gtk_window_set_title(GTK_WINDOW (GLOBALS->window_help_c_2), title); gtkwave_signal_connect(GTK_OBJECT (GLOBALS->window_help_c_2), "delete_event",(GtkSignalFunc) ok_callback, NULL); vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (GLOBALS->window_help_c_2), vbox); gtk_widget_show (vbox); label=gtk_label_new(default_text); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); gtk_widget_show (label); separator = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0); gtk_widget_show (separator); ctext=create_help_text(); gtk_box_pack_start (GTK_BOX (vbox), ctext, TRUE, TRUE, 0); gtk_widget_show (ctext); separator = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0); gtk_widget_show (separator); hbox = gtk_hbox_new (FALSE, 1); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); gtk_widget_show (hbox); button1 = gtk_button_new_with_label ("Close Help"); gtk_widget_set_usize(button1, 100, -1); gtkwave_signal_connect(GTK_OBJECT (button1), "clicked", GTK_SIGNAL_FUNC(ok_callback), NULL); gtk_widget_show (button1); gtk_container_add (GTK_CONTAINER (hbox), button1); GTK_WIDGET_SET_FLAGS (button1, GTK_CAN_DEFAULT); gtkwave_signal_connect_object (GTK_OBJECT (button1), "realize", (GtkSignalFunc) gtk_widget_grab_default, GTK_OBJECT (button1)); gtk_widget_show(GLOBALS->window_help_c_2); } gtkwave-3.3.86/src/vzt.h0000664000175000017500000000116213166335473014367 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2003-2004. * * 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. */ #include "globals.h" #ifndef WAVE_VZTRDR_H #define WAVE_VZTRDR_H #ifdef HAVE_INTTYPES_H #include #endif #include "vcd.h" TimeType vzt_main(char *fname, char *skip_start, char *skip_end); void import_vzt_trace(nptr np); void vzt_set_fac_process_mask(nptr np); void vzt_import_masked(void); #endif gtkwave-3.3.86/src/Makefile.am0000664000175000017500000000744013166335473015434 0ustar bybellbybell## -*- makefile -*- ## SUBDIRS= $(LIBZ_DIR) $(LIBBZ2_DIR) liblzma helpers helpers/fst cocoa DIST_SUBDIRS= libz libbz2 liblzma helpers helpers/fst cocoa LIBFST_CFLAGS = -I$(srcdir)/helpers/fst LIBFST_LDADD = ./helpers/fst/libfst.a LIBLZMA_CFLAGS = -I$(srcdir)/liblzma $(LIBXZ_CFLAGS) LIBLZMA_LDADD = ./liblzma/libgwlzma.a $(LIBXZ_LDADD) LIBCOCOA_CFLAGS = -I$(srcdir)/cocoa LIBCOCOA_LDADD = ./cocoa/libgtkwmacintegration.a $(COCOA_GTK_LDADD) #DEBUGS = -DDEBUG_FACILITIES -DDEBUG_PRINTF -DDEBUG_MALLOC -DSTRICT_VCD_ONLY -DDEBUG_MALLOC_LINES bin_PROGRAMS= gtkwave twinwave AM_CFLAGS= -I$(srcdir)/.. -I$(srcdir)/helpers $(FASTTREE_CFLAGS) $(GTK_CFLAGS) $(LIBLZMA_CFLAGS) \ $(LIBZ_CFLAGS) $(LIBBZ2_CFLAGS) $(LIBFST_CFLAGS) $(AET2_CFLAGS) $(FSDB_CFLAGS) $(TCL_INCLUDE_SPEC) \ $(TCL_DEFADD) $(TK_INCLUDE_SPEC) $(EXTLOAD_CFLAGS) $(GEDIT_CFLAGS) $(LIBJUDY_CFLAGS) \ $(GTK_MAC_CFLAGS) $(GCONF_CFLAGS) $(LIBCOCOA_CFLAGS) $(GTK_UNIX_PRINT_CFLAGS) AM_CXXFLAGS= $(AM_CFLAGS) ./liblzma/libgwlzma.a: $(srcdir)/liblzma/LzmaLib.c $(srcdir)/liblzma/LzmaLib.h ./helpers/fst/libfst.a: $(srcdir)/helpers/fst/fastlz.c $(srcdir)/helpers/fst/fastlz.h $(srcdir)/helpers/fst/fstapi.c $(srcdir)/helpers/fst/fstapi.h ./cocoa/libgtkwmacintegration.a: $(srcdir)/cocoa/cocoa_misc.c $(srcdir)/cocoa/cocoa_misc.h gtkwave_SOURCES= \ fsdb_wrapper_api.cc fsdb_wrapper_api.h \ baseconvert.h wavewindow.h zoombuttons.h fetchbuttons.h timeentry.h shiftbuttons.h pagebuttons.h edgebuttons.h \ signalwindow.h entry.h file.h status.h search.h showchange.h treesearch.h hiersearch.h renderopt.h markerbox.h \ simplereq.h help.h logfile.h vcd_partial.h mouseover.h mouseover_sigs.h interp.h \ globals.c globals.h ae2.c ae2.h analyzer.c analyzer.h baseconvert.c bitvec.c \ bsearch.c bsearch.h busy.c busy.h \ clipping.c clipping.h color.c color.h currenttime.c currenttime.h \ debug.c debug.h discardbuttons.c edgebuttons.c \ entry.c extload.c extload.h fetchbuttons.c fgetdynamic.c fgetdynamic.h file.c fonts.c fonts.h fst.c fst.h \ gconf.c gconf.h getopt.c \ getopt1.c ghw.c ghw.h ghwlib.c ghwlib.h gnu-getopt.h gnu_regex.h gtk12compat.h \ hierpack.c hierpack.h jrb.c jrb.h help.c helpers/lxt2_read.c \ helpers/lxt_write.c helpers/vzt_read.c hiersearch.c interp.c \ logfile.c lx2.c lx2.h lxt.c lxt.h main.c main.h markerbox.c menu.c menu.h mouseover.c \ mouseover_sigs.c pagebuttons.c pipeio.c pipeio.h pixmaps.c pixmaps.h print.c print.h \ ptranslate.c ptranslate.h rc.c rc.h \ regex.c regex_wave.h renderopt.c rgb.c savefile.c savefile.h search.c shiftbuttons.c showchange.c \ signalwindow.c simplereq.c splash.c status.c strace.c strace.h symbol.c symbol.h tcl_callbacks.h \ tcl_commands.c tcl_helper.c tcl_helper.h tcl_np.c tcl_np.h tcl_support_commands.c tcl_support_commands.h \ timeentry.c translate.c translate.h tree.c tree.h treesearch.c tree_component.c tree_component.h \ ttranslate.c ttranslate.h vcd.c vcd.h vcd_keywords.c \ vcd_partial.c vcd_recoder.c vcd_saver.c vcd_saver.h version.h vlist.c vlist.h vzt.c vzt.h wavealloca.h \ wavewindow.c zoombuttons.c gtkwave_LDADD= $(LIBCOCOA_LDADD) $(GTK_LIBS) $(LIBLZMA_LDADD) $(LIBZ_LDADD) $(LIBBZ2_LDADD) $(LIBFST_LDADD) $(AET2_LDADD) $(TCL_LDADD) $(TK_LDADD) $(FSDB_LDADD) $(LIBJUDY_LDADD) $(GTK_MAC_LIBS) $(GCONF_LIBS) $(GTK_UNIX_PRINT_LIBS) $(MINGW_LDADD) gtkwave_LDFLAGS = $(COCOA_GTK_LDFLAGS) twinwave_SOURCES= twinwave.c twinwave_LDADD= $(GTK_LIBS) $(GTK_MAC_LIBS) $(GCONF_LIBS) vcd_keywords.c: vcd_keywords.gperf printf "$(GPERF) -o -i 1 -C -k 1,\044 -L C -H keyword_hash -N check_identifier -tT $(srcdir)/vcd_keywords.gperf >vcd_keywords.c" | sh BUILT_SOURCES= vcd_keywords.c # I'm listing treesearch_gtk2.c here instead of in SOURCES because we don't directly # compile it. Rather it is #include'd by treesearch.c. EXTRA_DIST= treesearch_gtk1.c treesearch_gtk2.c vcd_keywords.gperf gnu_regex.c gtkwave-3.3.86/src/mouseover.h0000664000175000017500000000064513166335473015575 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010 * * 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. */ #ifndef WAVE_MOUSEOVER_H #define WAVE_MOUSEOVER_H void move_mouseover(Trptr t, gint xin, gint yin, TimeType tim); #endif gtkwave-3.3.86/src/print.c0000664000175000017500000023462513166335473014707 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2012. * * 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 module has been re-implemented by Udi Finkelstein. Since it is no * longer a PostScript-only module, it had been renamed "print.c". * * Much of the code has been "C++"-ized in style, yet written in C. We use * classes, virtual functions, class members, and "this" pointers written in * C. */ /* AIX may need this for alloca to work */ #if defined _AIX #pragma alloca #endif #include "globals.h" #include #include "currenttime.h" #include "analyzer.h" #include "symbol.h" #include "bsearch.h" #include "wavealloca.h" #include "debug.h" #include "strace.h" #include "print.h" /********************************************** * this is essentially wavewindow.c's rendering * engine modified to produce postscript **********************************************/ #define WAVE_COURIER_SCALE_FAC 1.6 /* more or less is the correct * pixel->ps scale mapping */ /* * PostScript device specific operations */ gtk_print_device ps_print_device = { ps_header, ps_trailer, ps_signal_init, ps_setgray, ps_draw_line, ps_draw_box, ps_draw_string }; /* * MIF device specific operations */ gtk_print_device mif_print_device = { mif_header, mif_trailer, mif_signal_init, mif_setgray, mif_draw_line, mif_draw_box, mif_draw_string }; /************************************************************************** * Shorthand routins * * * * These routines call the specific operations through the device pointer * **************************************************************************/ void pr_header (pr_context * prc) { (*prc->gpd->gpd_header) (prc); } void pr_trailer (pr_context * prc) { (*prc->gpd->gpd_trailer) (prc); } void pr_signal_init (pr_context * prc) { (*prc->gpd->gpd_signal_init) (prc); } void pr_setgray (pr_context * prc, gdouble gray) { (*prc->gpd->gpd_setgray) (prc, gray); } void pr_draw_line (pr_context * prc, gdouble _x1, gdouble _y1, gdouble x2, gdouble y2) { (*prc->gpd->gpd_draw_line) (prc, _x1, _y1, x2, y2); } void pr_draw_box (pr_context * prc, gdouble _x1, gdouble _y1, gdouble x2, gdouble y2) { (*prc->gpd->gpd_draw_box) (prc, _x1, _y1, x2, y2); } void pr_draw_string (pr_context * prc, int x, int y, char *str, int xsize, int ysize) { (*prc->gpd->gpd_draw_string) (prc, x, y, str, xsize, ysize); } /************************************************************************* * PostScript specific routines * *************************************************************************/ /* * Set current gray level, with 0.0 being white, and 1.0 being black. */ void ps_setgray (pr_context * prc, gdouble gray) { fprintf (prc->handle, "%f setgray\n", gray); } /* * Create a rectangular path */ void ps_box (pr_context * prc, gdouble t_x1, gdouble t_y1, gdouble tx2, gdouble ty2) { fprintf (prc->handle, "%f %f %f %f box\n", t_y1, t_x1, ty2, tx2); } /* * Draw a box */ void ps_draw_box (pr_context * prc, gdouble _x1, gdouble _y1, gdouble x2, gdouble y2) { gdouble t_x1, t_y1, tx2, ty2; t_x1 = _x1 * prc->xscale; t_y1 = _y1 * prc->yscale; tx2 = x2 * prc->xscale; ty2 = y2 * prc->yscale; ps_box (prc, t_x1, t_y1, tx2, ty2); fprintf (prc->handle, "fill\n"); } void ps_signal_init (pr_context * prc) { fprintf (prc->handle, "grestore\n" "gsave\n"); if (prc->fullpage) { ps_setgray (prc, 0.0); ps_box (prc, prc->MinX - 1, prc->MinY - 2, prc->MaxX + 1, prc->MaxY + 2); fprintf (prc->handle, "stroke\n"); ps_setgray (prc, 0.5); ps_box (prc, prc->MinX, prc->MinY - 1, prc->MaxX, prc->MaxY + 1); fprintf (prc->handle, "clip\n"); } fprintf (prc->handle, "%d %d translate\n" "1 1 scale\n" "0.5 setlinewidth\n" "stroke\n", prc->MinY, prc->MinX); } void ps_header (pr_context * prc) { gdouble ps_skip; ps_skip = prc->MinX + (prc->MaxX - prc->MinX) * (((gdouble) GLOBALS->pr_signal_fill_width_print_c_1) / prc->xtotal); fprintf (prc->handle, "%%!PS-Adobe-2.0 EPSF-1.2\n" "%%%%BoundingBox: %d %d %d %d\n" "%%%%Pages: 1\n" "%%%%EndComments\n" "%%%%Page: (1) 1\n" "/box { %% stack: _x1 _y1 x2 y2\n" "\tnewpath\n" "\t2 copy moveto %% x2 y2\n" "\t3 index 1 index lineto %% _x1 y2\n" "\t3 index 3 index lineto %% _x1 _y1\n" "\t1 index 3 index lineto %% x2 _y1\n" "\tpop pop pop pop\n" "\tclosepath\n" "} def\n" "/l { %% stack: _x1 _y1 x2 y2\n" "\tnewpath moveto lineto closepath stroke\n" "} def\n", prc->MinY, prc->MinX, (int) (prc->fullpage ? prc->MaxY : GLOBALS->ybound_print_c_1), prc->MaxX); if (!prc->fullpage) { ps_box (prc, prc->MinX - 1, prc->MinY - 1, prc->MaxX, GLOBALS->ybound_print_c_1); fprintf (prc->handle, "clip\n"); } fprintf (prc->handle, "/Courier findfont\n" "10 scalefont\n" "setfont\n" "2 setlinecap\n" "gsave\n" "1 1 scale\n" "0.5 setlinewidth\n" "stroke\n"); ps_setgray (prc, 0.75); ps_box (prc, ps_skip, prc->MinY - 1, prc->MaxX, prc->MaxY + 1); fprintf (prc->handle, "clip\n" "%d %f translate stroke\n", prc->MinY, ps_skip); } void ps_draw_line (pr_context * prc, gdouble _x1, gdouble _y1, gdouble x2, gdouble y2) { gdouble t_x1, t_y1, tx2, ty2; if (_x1 < -1.0) _x1 = -1.0; if (x2 < -1.0) x2 = -1.0; if (_x1 > 10000.0) _x1 = 10000.0; if (x2 > 10000.0) x2 = 10000.0; t_x1 = _x1 * prc->xscale; t_y1 = _y1 * prc->yscale; tx2 = x2 * prc->xscale; ty2 = y2 * prc->yscale; fprintf (prc->handle, "%f %f %f %f l\n", t_y1, t_x1, ty2, tx2); } void ps_draw_string (pr_context * prc, int x, int y, char *str, int xsize, int ysize) { int i; int len; len = strlen (str); if (!len) return; fprintf (prc->handle, "save\n%f %f moveto\n%f %f scale\n90 rotate\n(", (y - 1) * prc->yscale, x * prc->xscale, (ysize * prc->yscale) * WAVE_COURIER_SCALE_FAC / 10.0, (xsize * prc->xscale) / len * WAVE_COURIER_SCALE_FAC / 10.0); for (i = 0; i < len; i++) { char ch; ch = str[i]; if (ch < 32) { ch = 32; /* fix out of range signed chars */ } else if ((ch == '(') || (ch == ')') || (ch == '\\')) { fprintf (prc->handle, "\\"); /* escape parens or esc */ } fprintf (prc->handle, "%c", ch); } fprintf (prc->handle, ") show\n" "restore\n"); } void ps_trailer (pr_context * prc) { fprintf (prc->handle, "grestore showpage\n"); } /************************************************************************* * MIF specific routines * *************************************************************************/ /* * Generic maint functions missing in gcc */ #ifndef _MSC_VER static gdouble maxdbl (gdouble a, gdouble b) { return (a > b ? a : b); } static gdouble mindbl (gdouble a, gdouble b) { return (a < b ? a : b); } #endif /* * Set current gray level, with 0.0 being white, and 1.0 being black. */ void mif_setgray (pr_context * prc, gdouble gray) { prc->gray = gray; } /* * Set current gray level, with 0.0 being white, and 1.0 being black. */ void mif_translate (pr_context * prc, gdouble x, gdouble y) { prc->tr_x = x; prc->tr_y = y; } /* * Draw an empty box */ void mif_box (pr_context * prc, gdouble _x1, gdouble _y1, gdouble x2, gdouble y2) { fprintf (prc->handle, " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " > # end of Rectangle\n", (int) (10000 * (1 - prc->gray)), (int) (_y1), (int) (_x1), abs ((int) (y2 - _y1)), abs ((int) (x2 - _x1)), (int) (_y1), (int) (_x1), abs ((int) (y2 - _y1)), abs ((int) (x2 - _x1))); } /* * Draw a filled box */ void mif_draw_box (pr_context * prc, gdouble _x1, gdouble _y1, gdouble x2, gdouble y2) { gdouble t_x1, t_y1, tx2, ty2; int rx, ry, rw, rh; t_x1 = _x1 * prc->xscale + prc->tr_x; t_y1 = _y1 * prc->yscale + prc->tr_y; tx2 = x2 * prc->xscale + prc->tr_x; ty2 = y2 * prc->yscale + prc->tr_y; /* The exprssion below is derived from: */ /* rx = mindbl((prc->PageX * inch - t_x1), (prc->PageX * inch - tx2)) */ rx = (int) (prc->PageX * GLOBALS->inch_print_c_1 - maxdbl (tx2, t_x1)); ry = (int) mindbl (t_y1, ty2); rw = abs ((int) (tx2 - t_x1)); rh = abs ((int) (ty2 - t_y1)); fprintf (prc->handle, " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " > # end of Rectangle\n", (int) (10000 * (1 - prc->gray)), ry, rx, rh, rw, rx, ry, rh, rw); } void mif_signal_init (pr_context * prc) { if (prc->fullpage) { mif_setgray (prc, 0.0); mif_box (prc, prc->MinX - 1, prc->MinY - 2, prc->MaxX + 1, prc->MaxY + 2); mif_setgray (prc, 0.5); mif_box (prc, prc->MinX, prc->MinY - 1, prc->MaxX, prc->MaxY + 1); } mif_translate (prc, prc->MinX, prc->MinY); } void mif_header (pr_context * prc) { gdouble modified_skip; gdouble mif_skip; mif_skip = (prc->MaxX - prc->MinX) * (((gdouble) GLOBALS->pr_signal_fill_width_print_c_1) / prc->xtotal); modified_skip = prc->MinX + mif_skip; fprintf (prc->handle, " # Generated by GTKWave\n" " # MIF support by Udi Finkelstein \n" "MinY); } void mif_draw_line (pr_context * prc, gdouble _x1, gdouble _y1, gdouble x2, gdouble y2) { gdouble t_x1, t_y1, tx2, ty2; if (_x1 < -1.0) _x1 = -1.0; if (x2 < -1.0) x2 = -1.0; if (_x1 > 10000.0) _x1 = 10000.0; if (x2 > 10000.0) x2 = 10000.0; t_x1 = _x1 * prc->xscale + prc->tr_x; t_y1 = _y1 * prc->yscale + prc->tr_y; tx2 = x2 * prc->xscale + prc->tr_x; ty2 = y2 * prc->yscale + prc->tr_y; fprintf (prc->handle, " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " > # end of PolyLine\n", (int) (10000 * (1 - prc->gray)), (int) (t_y1), (int) (prc->PageX * GLOBALS->inch_print_c_1 - t_x1), (int) (ty2), (int) (prc->PageX * GLOBALS->inch_print_c_1 - tx2)); } void mif_draw_string (pr_context * prc, int x, int y, char *str, int xsize, int ysize) { int len; gdouble tx, ty; gdouble stretchx, stretchy; char *strfix; int i; if (x < -1.0) x = -1.0; if (x > 10000.0) x = 10000.0; tx = x * prc->xscale + prc->tr_x; ty = y * prc->yscale + prc->tr_y; len = strlen (str); if (!len) return; stretchy = (ysize * (1.52 * prc->yscale)); stretchx = (xsize / (len * stretchy)) * prc->xscale * WAVE_COURIER_SCALE_FAC * 100.00; strfix = strdup_2(str); for(i=0;i126)||(strfix[i]=='\'')) { strfix[i] = ' '; } } fprintf (prc->handle, " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " > # end of Font\n" " \n" " > # end of TextLine\n", (int) (ty), (int) (prc->PageX * GLOBALS->inch_print_c_1 - tx), stretchy, stretchx, strfix); free_2(strfix); } void mif_trailer (pr_context * prc) { fprintf (prc->handle, " \n" " \n" " > # end of Group\n" "> # end of Page\n"); } /**********************************************/ /* * Initialize print related constants */ static void pr_wave_init (pr_context * prc) { int wh = GLOBALS->waveheight; int yheight = 33 * GLOBALS->fontheight; prc->MinX = prc->LM * GLOBALS->inch_print_c_1; prc->MaxX = (prc->PageX - prc->RM) * GLOBALS->inch_print_c_1; prc->MinY = prc->BM * GLOBALS->inch_print_c_1; prc->MaxY = (prc->PageY - prc->TM) * GLOBALS->inch_print_c_1; if (!prc->fullpage) { if (wh < 2 * GLOBALS->fontheight) wh = 2 * GLOBALS->fontheight; } yheight = (wh < yheight) ? yheight : wh; yheight = yheight - (yheight % GLOBALS->fontheight); if (!prc->fullpage) { GLOBALS->ybound_print_c_1 = ((prc->MaxY - prc->MinY) / ((gdouble) yheight)) * ((gdouble) (wh - (wh % GLOBALS-> fontheight))) + prc->MinY; } prc->xtotal = (gdouble) (GLOBALS->wavewidth + GLOBALS->pr_signal_fill_width_print_c_1); prc->xscale = ((prc->MaxX - prc->MinX) / prc->xtotal); prc->yscale = (prc->MaxY - prc->MinY) / ((gdouble) yheight); } static int ps_MaxSignalLength (void) { Trptr t; int len = 0, maxlen = 0, numchars = 0; int vlen = 0; int i, trwhich, trtarget, num_traces_displayable; GtkAdjustment *sadj; char buf[2048]; bvptr bv; Trptr tscan; GLOBALS->ps_nummaxchars_print_c_1 = 7; /* allows a good spacing if 60 pixel default * is used */ sadj = GTK_ADJUSTMENT (GLOBALS->wave_vslider); trtarget = (int) (sadj->value); t = GLOBALS->traces.first; trwhich = 0; while (t) { if ((trwhich < trtarget) && (GiveNextTrace (t))) { trwhich++; t = GiveNextTrace (t); } else { break; } } num_traces_displayable = GLOBALS->signalarea->allocation.height / GLOBALS->fontheight; for (i = 0; (i < num_traces_displayable) && (t); i++) { char *subname = NULL; bv = NULL; tscan = NULL; if(t->flags & (TR_BLANK|TR_ANALOG_BLANK_STRETCH)) /* seek to real xact trace if present... */ { int bcnt = 0; tscan = t; while((tscan) && (tscan = GivePrevTrace(tscan))) { if(!(tscan->flags & (TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { if(tscan->flags & TR_TTRANSLATED) { break; /* found it */ } else { tscan = NULL; } } else { bcnt++; /* bcnt is number of blank traces */ } } if((tscan)&&(tscan->vector)) { bv = tscan->n.vec; do { bv = bv->transaction_chain; /* correlate to blank trace */ } while(bv && (bcnt--)); if(bv) { subname = bv->bvname; if(GLOBALS->hier_max_level) subname = hier_extract(subname, GLOBALS->hier_max_level); } } } populateBuffer(t, subname, buf); if (!bv && (t->flags & (TR_BLANK | TR_ANALOG_BLANK_STRETCH))) /* for "comment" style blank traces */ { if (buf[0]) { len = font_engine_string_measure (GLOBALS->signalfont, buf); numchars = strlen (buf); if (len > maxlen) maxlen = len; if (numchars > GLOBALS->ps_nummaxchars_print_c_1) GLOBALS->ps_nummaxchars_print_c_1 = numchars; if(t->asciivalue) { free_2(t->asciivalue); t->asciivalue = NULL; } } } else if (buf[0] || subname) { len = font_engine_string_measure (GLOBALS->signalfont, buf); numchars = strlen (buf); if ((GLOBALS->tims.marker != -1) && (!(t->flags & TR_EXCLUDE))) { t->asciitime = GLOBALS->tims.marker; if (t->asciivalue) free_2 (t->asciivalue); if (bv || t->vector) { char *str, *str2; vptr v; Trptr ts; TraceEnt t_temp; if(bv) { ts = &t_temp; memcpy(ts, tscan, sizeof(TraceEnt)); ts->vector = 1; ts->n.vec = bv; } else { ts = t; bv = t->n.vec; } v = bsearch_vector (bv, GLOBALS->tims.marker - ts->shift); str = convert_ascii (ts, v); if (str) { int slen; str2 = (char *) malloc_2 (strlen (str) + 2); *str2 = '='; strcpy (str2 + 1, str); free_2 (str); t->asciivalue = str2; if ((slen = strlen (str2)) > GLOBALS->ps_maxveclen) { str2[GLOBALS->ps_maxveclen] = 0; str2[GLOBALS->ps_maxveclen - 1] = '+'; vlen = font_engine_string_measure (GLOBALS->signalfont, str2); numchars += GLOBALS->ps_maxveclen; } else { vlen = font_engine_string_measure (GLOBALS->signalfont, str2); numchars += slen; } } else { vlen = 0; t->asciivalue = NULL; } } else { char *str; hptr h_ptr; if ((h_ptr = bsearch_node (t->n.nd, GLOBALS->tims.marker - t->shift))) { if (!t->n.nd->extvals) { unsigned char h_val = h_ptr->v.h_val; if(t->n.nd->vartype == ND_VCD_EVENT) { h_val = (h_ptr->time >= GLOBALS->tims.first) && ((GLOBALS->tims.marker-GLOBALS->shift_timebase) == h_ptr->time) ? AN_1 : AN_0; /* generate impulse */ } str = (char *) calloc_2 (1, 3 * sizeof (char)); str[0] = '='; if (t->flags & TR_INVERT) { str[1] = AN_STR_INV[h_val]; } else { str[1] = AN_STR[h_val]; } t->asciivalue = str; vlen = font_engine_string_measure (GLOBALS->signalfont, str); numchars += 2; } else { char *str2; if (h_ptr->flags & HIST_REAL) { if (!(h_ptr->flags & HIST_STRING)) { #ifdef WAVE_HAS_H_DOUBLE str = convert_ascii_real (t, &h_ptr->v.h_double); #else str = convert_ascii_real (t, (double *) h_ptr->v. h_vector); #endif } else { str = convert_ascii_string ((char *) h_ptr->v. h_vector); } } else { str = convert_ascii_vec (t, h_ptr->v.h_vector); } if (str) { int slen; str2 = (char *) malloc_2 (strlen (str) + 2); *str2 = '='; strcpy (str2 + 1, str); free_2 (str); t->asciivalue = str2; if ((slen = strlen (str2)) > GLOBALS->ps_maxveclen) { str2[GLOBALS->ps_maxveclen] = 0; str2[GLOBALS->ps_maxveclen - 1] = '+'; vlen = font_engine_string_measure (GLOBALS->signalfont, str2); numchars += GLOBALS->ps_maxveclen; } else { vlen = font_engine_string_measure (GLOBALS->signalfont, str2); numchars += slen; } } else { vlen = 0; t->asciivalue = NULL; } } } else { vlen = 0; t->asciivalue = NULL; } } len += vlen; } if (len > maxlen) maxlen = len; if (numchars > GLOBALS->ps_nummaxchars_print_c_1) GLOBALS->ps_nummaxchars_print_c_1 = numchars; } t = GiveNextTrace (t); } maxlen += 6; /* endcap padding */ if (maxlen < 60) maxlen = 60; return maxlen; } /**********************************************/ static void pr_renderhash (pr_context * prc, int x, TimeType tim) { TimeType rborder; gdouble dx; gdouble hashoffset; int fhminus2; int rhs; int iter = 0; int s_ctx_iter; int timearray_encountered = (GLOBALS->ruler_step != 0); fhminus2 = GLOBALS->fontheight - 2; WAVE_STRACE_ITERATOR(s_ctx_iter) { GLOBALS->strace_ctx = &GLOBALS->strace_windows[GLOBALS->strace_current_window = s_ctx_iter]; if(GLOBALS->strace_ctx->timearray) { timearray_encountered = 1; break; } } pr_setgray (prc, 0.75); pr_draw_line (prc, x, 0, x, ((!timearray_encountered) && (GLOBALS->display_grid) && (GLOBALS->enable_vert_grid)) ? GLOBALS-> liney_max : fhminus2); if (tim == GLOBALS->tims.last) return; rborder = (GLOBALS->tims.last - GLOBALS->tims.start) * GLOBALS->pxns; DEBUG (printf ("Rborder: %lld, Wavewidth: %d\n", rborder, GLOBALS->wavewidth)); if (rborder > GLOBALS->wavewidth) rborder = GLOBALS->wavewidth; if ((rhs = x + GLOBALS->pixelsperframe) > rborder) rhs = rborder; pr_draw_line (prc, x, GLOBALS->wavecrosspiece, rhs, GLOBALS->wavecrosspiece); dx = x + (hashoffset = GLOBALS->hashstep); x = dx; while ((hashoffset < GLOBALS->pixelsperframe) && (x <= rhs) && (iter < 9)) { pr_draw_line (prc, x, GLOBALS->wavecrosspiece, x, fhminus2); hashoffset += GLOBALS->hashstep; dx = dx + GLOBALS->hashstep; if ((GLOBALS->pixelsperframe != 200) || (GLOBALS->hashstep != 10.0)) iter++; /* fix any roundoff errors */ x = dx; } } static void pr_renderblackout (pr_context * prc) { gfloat pageinc; TimeType lhs, rhs, lclip, rclip; struct blackout_region_t *bt = GLOBALS->blackout_regions; if (bt) { pageinc = (gfloat) (((gdouble) GLOBALS->wavewidth) * GLOBALS->nspx); lhs = GLOBALS->tims.start; rhs = pageinc + lhs; while (bt) { if((bt->bend < lhs) || (bt->bstart > rhs)) { /* nothing */ } else { lclip = bt->bstart; rclip = bt->bend; if (lclip < lhs) lclip = lhs; else if (lclip > rhs) lclip = rhs; if (rclip < lhs) rclip = lhs; lclip -= lhs; rclip -= lhs; if(rclip>((GLOBALS->wavewidth+1)*GLOBALS->nspx)) rclip = (GLOBALS->wavewidth+1)*(GLOBALS->nspx); pr_setgray (prc, 0.80); pr_draw_box (prc, (((gdouble) lclip) * GLOBALS->pxns), GLOBALS->fontheight, (((gdouble) (rclip)) * GLOBALS->pxns), GLOBALS->waveheight - GLOBALS->fontheight); } bt = bt->next; } } } static void pr_rendertimes (pr_context * prc) { int lastx = -1000; /* arbitrary */ TimeType tim, rem; int x, len, lenhalf; char timebuff[32]; gdouble realx; int s_ctx_iter; int timearray_encountered = 0; pr_renderblackout (prc); tim = GLOBALS->tims.start; GLOBALS->tims.end = GLOBALS->tims.start + (((gdouble) GLOBALS->wavewidth) * GLOBALS->nspx); /**********/ WAVE_STRACE_ITERATOR_FWD(s_ctx_iter) { GLOBALS->strace_ctx = &GLOBALS->strace_windows[GLOBALS->strace_current_window = s_ctx_iter]; if (GLOBALS->strace_ctx->timearray) { int pos, pos2; TimeType *t, tm; int y = GLOBALS->fontheight + 2; int oldx = -1; timearray_encountered = 1; pos = bsearch_timechain (GLOBALS->tims.start); top: if ((pos >= 0) && (pos < GLOBALS->strace_ctx->timearray_size)) { pr_setgray (prc, (s_ctx_iter==0) ? 0.90 : 0.75); t = GLOBALS->strace_ctx->timearray + pos; for (; pos < GLOBALS->strace_ctx->timearray_size; t++, pos++) { tm = *t; if (tm >= GLOBALS->tims.start) { if (tm <= GLOBALS->tims.end) { x = (tm - GLOBALS->tims.start) * GLOBALS->pxns; if (oldx == x) { pos2 = bsearch_timechain (GLOBALS->tims.start + (((gdouble) (x + 1)) * GLOBALS->nspx)); if (pos2 > pos) { pos = pos2; goto top; } else continue; } oldx = x; pr_draw_line (prc, x, y, x, GLOBALS->liney_max); } else { break; } } } } } } GLOBALS->strace_ctx = &GLOBALS->strace_windows[GLOBALS->strace_current_window = 0]; /**********/ if(GLOBALS->ruler_step && !timearray_encountered) { TimeType rhs = (GLOBALS->tims.end > GLOBALS->tims.last) ? GLOBALS->tims.last : GLOBALS->tims.end; TimeType low_x = (GLOBALS->tims.start - GLOBALS->ruler_origin) / GLOBALS->ruler_step; TimeType high_x = (rhs - GLOBALS->ruler_origin) / GLOBALS->ruler_step; TimeType iter_x, tm; int y=GLOBALS->fontheight+2; int oldx=-1; pr_setgray (prc, 0.90); for(iter_x = low_x; iter_x <= high_x; iter_x++) { tm = GLOBALS->ruler_step * iter_x + GLOBALS->ruler_origin; x=(tm-GLOBALS->tims.start)*GLOBALS->pxns; if(oldx==x) { gdouble xd,offset,pixstep; TimeType newcurr; xd=x+1; /* for pix time calc */ pixstep=((gdouble)GLOBALS->nsperframe)/((gdouble)GLOBALS->pixelsperframe); newcurr=(TimeType)(offset=((gdouble)GLOBALS->tims.start)+(xd*pixstep)); if(offset-newcurr>0.5) /* round to nearest integer ns */ { newcurr++; } low_x = (newcurr - GLOBALS->ruler_origin) / GLOBALS->ruler_step; if(low_x <= iter_x) low_x = (iter_x+1); iter_x = low_x; tm = GLOBALS->ruler_step * iter_x + GLOBALS->ruler_origin; x=(tm-GLOBALS->tims.start)*GLOBALS->pxns; } if(x>=GLOBALS->wavewidth) break; oldx=x; pr_draw_line (prc, x, y, x, GLOBALS->liney_max); } } /**********/ DEBUG (printf ("Ruler Start time: " TTFormat ", Finish time: " TTFormat "\n", GLOBALS->tims.start, GLOBALS->tims.end)); x = 0; realx = 0; if (tim) { rem = tim % GLOBALS->nsperframe; if (rem) { tim = tim - GLOBALS->nsperframe - rem; x = -GLOBALS->pixelsperframe - ((rem * GLOBALS->pixelsperframe) / GLOBALS->nsperframe); realx=-GLOBALS->pixelsperframe-((rem*GLOBALS->pixelsperframe)/GLOBALS->nsperframe); } } for (;;) { pr_renderhash (prc, realx, tim); if (tim + GLOBALS->global_time_offset) { if(tim != GLOBALS->min_time) { reformat_time (timebuff, time_trunc (tim) + GLOBALS->global_time_offset, GLOBALS->time_dimension); } else { timebuff[0] = 0; } } else { strcpy (timebuff, "0"); } len = font_engine_string_measure (GLOBALS->wavefont, timebuff) >> 1; lenhalf = len >> 1; if ((prc->gpd == &ps_print_device) || ((x - lenhalf >= 0) && (x + lenhalf < GLOBALS->wavewidth))) { pr_setgray (prc, 0.0); if ((x - lenhalf >= lastx) || (GLOBALS->pixelsperframe >= 200)) { pr_draw_string (prc, x - lenhalf, GLOBALS->wavefont->ascent + 1, timebuff, len, GLOBALS->wavefont->ascent); } } lastx = x + lenhalf; tim += GLOBALS->nsperframe; x += GLOBALS->pixelsperframe; realx+=GLOBALS->pixelsperframe; if ((x >= GLOBALS->wavewidth) || (tim > GLOBALS->tims.last)) break; } } /*************************************************/ static void pr_render_individual_named_marker ( pr_context * prc, int i, gdouble gray, int blackout) { gdouble pixstep; gint xl, y; TimeType t; if ((t = GLOBALS->named_markers[i]) != -1) { if ((t >= GLOBALS->tims.start) && (t <= GLOBALS->tims.last) && (t <= GLOBALS->tims.end)) { /* this needs to be here rather than outside the loop as gcc does some optimizations that cause it to calculate slightly different from the marker if it's not here */ pixstep = ((gdouble) GLOBALS->nsperframe) / ((gdouble) GLOBALS->pixelsperframe); xl = ((gdouble) (t - GLOBALS->tims.start)) / pixstep; /* snap to integer */ if ((xl >= 0) && (xl < GLOBALS->wavewidth)) { char nbuff[16]; make_bijective_marker_id_string(nbuff, i); pr_setgray (prc, gray); for (y = GLOBALS->fontheight - 1; y <= GLOBALS->liney_max - 5; y += 8) { pr_draw_line (prc, xl, y, xl, y + 5); } if((!GLOBALS->marker_names[i])||(!GLOBALS->marker_names[i][0])) { int xsize = font_engine_string_measure (GLOBALS->wavefont, nbuff); pr_setgray (prc, 0.00); pr_draw_string (prc, xl - (xsize >> 1) + 1, GLOBALS->fontheight - 1, nbuff, xsize, (prc->gpd == &ps_print_device) ? GLOBALS->wavefont-> ascent / 2 : GLOBALS->wavefont->ascent); } else { int boxheight = GLOBALS->wavefont-> ascent + GLOBALS->wavefont-> descent; int xsize = font_engine_string_measure (GLOBALS->wavefont, GLOBALS->marker_names[i]); int ysize = (prc->gpd == &ps_print_device) ? GLOBALS->wavefont-> ascent / 2 : GLOBALS->wavefont->ascent; int boxysize = (prc->gpd == &ps_print_device) ? boxheight / 2 : boxheight; if(blackout) /* blackout background so text is legible if overlaid with other marker labels */ { pr_setgray (prc, 1.00); pr_draw_box(prc, xl-(xsize>>1) + 1, GLOBALS->fontheight-2-ysize, (xl-(xsize>>1) + 1) + xsize, (GLOBALS->fontheight-2-ysize) + boxysize); } pr_setgray (prc, 0.00); pr_draw_string (prc, xl - (xsize >> 1) + 1, GLOBALS->fontheight - 1, GLOBALS->marker_names[i], xsize, ysize); } } } } } static void pr_draw_named_markers (pr_context * prc) { int i; for(i=0;inamed_marker_lock_idx) { pr_render_individual_named_marker(prc, i, 0.40, 0); } } if(GLOBALS->named_marker_lock_idx >= 0) { pr_render_individual_named_marker(prc, GLOBALS->named_marker_lock_idx, 0.65, 1); } } static void pr_draw_marker (pr_context * prc) { gdouble pixstep; gint xl; if (GLOBALS->tims.baseline != -1) { if ((GLOBALS->tims.baseline >= GLOBALS->tims.start) && (GLOBALS->tims.baseline <= GLOBALS->tims.last) && (GLOBALS->tims.baseline <= GLOBALS->tims.end)) { pixstep = ((gdouble) GLOBALS->nsperframe) / ((gdouble) GLOBALS->pixelsperframe); xl = ((gdouble) (GLOBALS->tims.baseline - GLOBALS->tims.start)) / pixstep; /* snap to integer */ if ((xl >= 0) && (xl < GLOBALS->wavewidth)) { pr_setgray (prc, 0.65); pr_draw_line (prc, xl, GLOBALS->fontheight - 1, xl, GLOBALS->liney_max); } } } if (GLOBALS->tims.marker != -1) { if ((GLOBALS->tims.marker >= GLOBALS->tims.start) && (GLOBALS->tims.marker <= GLOBALS->tims.last) && (GLOBALS->tims.marker <= GLOBALS->tims.end)) { pixstep = ((gdouble) GLOBALS->nsperframe) / ((gdouble) GLOBALS->pixelsperframe); xl = ((gdouble) (GLOBALS->tims.marker - GLOBALS->tims.start)) / pixstep; /* snap to integer */ if ((xl >= 0) && (xl < GLOBALS->wavewidth)) { pr_setgray (prc, 0.40); pr_draw_line (prc, xl, GLOBALS->fontheight - 1, xl, GLOBALS->liney_max); } } } } /*************************************************/ /* * draw single traces and use this for rendering the grid lines for * "excluded" traces */ static void pr_draw_hptr_trace (pr_context * prc, Trptr t, hptr h, int which, int dodraw, int kill_grid) { TimeType _x0, _x1, newtime; int _y0, _y1, yu, liney, ytext, ysiz; TimeType tim, h2tim; hptr h2, h3; char hval, h2val, invert; char identifier_str[2]; int is_event = t && t->n.nd && (t->n.nd->vartype == ND_VCD_EVENT); GLOBALS->tims.start -= GLOBALS->shift_timebase; GLOBALS->tims.end -= GLOBALS->shift_timebase; liney = ((which + 2) * GLOBALS->fontheight) - 2; if ((t && (t->flags & TR_INVERT))&&(!is_event)) { _y0 = ((which + 1) * GLOBALS->fontheight) + 2; _y1 = liney - 2; invert = 1; } else { _y1 = ((which + 1) * GLOBALS->fontheight) + 2; _y0 = liney - 2; invert = 0; } yu = (_y0 + _y1) / 2; ytext = yu - (GLOBALS->wavefont->ascent / 2) + GLOBALS->wavefont->ascent; ysiz = GLOBALS->wavefont->ascent - 1; if ((GLOBALS->display_grid) && (GLOBALS->enable_horiz_grid) && (!kill_grid)) { pr_setgray (prc, 0.75); pr_draw_line (prc, (GLOBALS->tims.start < GLOBALS->tims.first) ? (GLOBALS->tims.first - GLOBALS->tims.start) * GLOBALS->pxns : 0, liney, (GLOBALS->tims.last <= GLOBALS->tims.end) ? (GLOBALS->tims.last - GLOBALS->tims.start) * GLOBALS->pxns : GLOBALS->wavewidth - 1, liney); } pr_setgray (prc, 0.0); if ((h) && (GLOBALS->tims.start == h->time)) { pr_draw_line (prc, 0, _y0, 0, _y1); } if (dodraw && t) for (;;) { if (!h) break; tim = (h->time); if ((tim > GLOBALS->tims.end) || (tim > GLOBALS->tims.last)) break; _x0 = (tim - GLOBALS->tims.start) * GLOBALS->pxns; if (_x0 < -1) { _x0 = -1; } else if (_x0 > GLOBALS->wavewidth) { break; } h2 = h->next; if (!h2) break; h2tim = tim = (h2->time); if (tim > GLOBALS->tims.last) tim = GLOBALS->tims.last; else if (tim > GLOBALS->tims.end + 1) tim = GLOBALS->tims.end + 1; _x1 = (tim - GLOBALS->tims.start) * GLOBALS->pxns; if (_x1 < -1) { _x1 = -1; } else if (_x1 > GLOBALS->wavewidth) { _x1 = GLOBALS->wavewidth; } if (_x0 != _x1) { if(is_event) { if(h->time >= GLOBALS->tims.first) { pr_draw_line(prc, _x0, _y0, _x0, _y1); pr_draw_line(prc, _x0, _y1, _x0+2, _y1+2); pr_draw_line(prc, _x0, _y1, _x0-2, _y1+2); } h=h->next; continue; } hval = h->v.h_val; h2val = h2->v.h_val; switch (hval) { case AN_0: /* 0 */ case AN_L: /* 0 */ if(GLOBALS->fill_waveform && invert) { pr_draw_box (prc, _x0, _y0, _x1, _y1); } pr_draw_line (prc, _x0, _y0, _x1, _y0); if (h2tim <= GLOBALS->tims.end) switch (h2val) { case AN_0: case AN_L: break; case AN_Z: pr_draw_line (prc, _x1, _y0, _x1, yu); break; default: pr_draw_line (prc, _x1, _y0, _x1, _y1); break; } break; case AN_X: /* X */ case AN_W: /* X */ case AN_U: /* X */ case AN_DASH: /* X */ pr_setgray (prc, 0.70); pr_draw_box (prc, _x0, _y0, _x1, _y1); pr_setgray (prc, 0.0); identifier_str[1] = 0; switch (hval) { case AN_X: identifier_str[0] = 0; break; case AN_W: identifier_str[0] = 'W'; break; case AN_U: identifier_str[0] = 'U'; break; default: identifier_str[0] = '-'; break; } if (identifier_str[0]) { int _x0_new = (_x0 >= 0) ? _x0 : 0; int width; int pixlen = 0; if ((width = _x1 - _x0_new) > GLOBALS->vector_padding) { if ((_x1 >= GLOBALS->wavewidth) || ((pixlen = font_engine_string_measure (GLOBALS->wavefont, identifier_str)) + GLOBALS->vector_padding <= width)) { pr_draw_string (prc, _x0 + 2, ytext, identifier_str, pixlen, ysiz); } } } if (_x0 >= 0) pr_draw_line (prc, _x0, _y0, _x0, _y1); pr_draw_line (prc, _x0, _y0, _x1, _y0); pr_draw_line (prc, _x0, _y1, _x1, _y1); if (h2tim <= GLOBALS->tims.end) pr_draw_line (prc, _x1, _y0, _x1, _y1); break; case AN_Z: /* Z */ pr_draw_line (prc, _x0, yu, _x1, yu); if (h2tim <= GLOBALS->tims.end) switch (h2val) { case AN_0: case AN_L: pr_draw_line (prc, _x1, yu, _x1, _y0); break; case AN_1: case AN_H: pr_draw_line (prc, _x1, yu, _x1, _y1); break; default: pr_draw_line (prc, _x1, _y0, _x1, _y1); break; } break; case AN_1: /* 1 */ case AN_H: /* 1 */ if(GLOBALS->fill_waveform && !invert) { pr_draw_box (prc, _x0, _y1, _x1, _y0); } pr_draw_line (prc, _x0, _y1, _x1, _y1); if (h2tim <= GLOBALS->tims.end) switch (h2val) { case AN_1: case AN_H: break; case AN_0: case AN_L: pr_draw_line (prc, _x1, _y1, _x1, _y0); break; case AN_Z: pr_draw_line (prc, _x1, _y1, _x1, yu); break; default: pr_draw_line (prc, _x1, _y0, _x1, _y1); break; } break; default: break; } } else { pr_draw_line (prc, _x1, _y0, _x1, _y1); if(is_event) { pr_draw_line(prc, _x0, _y1, _x0+2, _y1+2); pr_draw_line(prc, _x0, _y1, _x0-2, _y1+2); } newtime = (((gdouble) (_x1 + WAVE_OPT_SKIP)) * GLOBALS->nspx) + GLOBALS->tims.start /*+ GLOBALS->shift_timebase*/; /* skip to next pixel */ h3 = bsearch_node (t->n.nd, newtime); if (h3->time > h->time) { h = h3; continue; } } h = h->next; } GLOBALS->tims.start += GLOBALS->shift_timebase; GLOBALS->tims.end += GLOBALS->shift_timebase; } /* * draw hptr vectors (integer+real) */ static void pr_draw_hptr_trace_vector_analog (pr_context * prc, Trptr t, hptr h, int which, int num_extension_clip, int num_extension) { TimeType _x0, _x1, newtime; int _y0, _y1, yu, liney, /* ytext, */ yt0, yt1; /* scan-build */ int _y0c; TimeType tim, h2tim; hptr h2, h3; int endcnt = 0; /* int ysiz; */ /* scan-build */ /* int type; */ /* scan-build */ /* int lasttype = -1; */ /* scan-build */ double mynan = strtod ("NaN", NULL); double tmin = mynan, tmax = mynan, tv, tv2; int is_nan = 0, is_nan2 = 0, is_inf = 0, is_inf2 = 0; int any_infs = 0, any_infp = 0, any_infm = 0; int skipcnt = 0; int line_in_range; liney = ((which + 2 + num_extension) * GLOBALS->fontheight) - 2; _y1 = ((which + 1) * GLOBALS->fontheight) + 2; _y0 = liney - 2; _y0c = (((which + 2 + num_extension_clip) * GLOBALS->fontheight) - 2) - 2; yu = (_y0 + _y1) / 2; /* ytext = yu - (GLOBALS->wavefont->ascent / 2) + GLOBALS->wavefont->ascent; */ /* scan-build */ /* scan-build : unused ysiz = GLOBALS->wavefont->ascent - 1; if (ysiz < 1) ysiz = 1; */ if (t->flags & TR_ANALOG_FULLSCALE) /* otherwise use dynamic */ { if((!t->minmax_valid)||(t->d_num_ext != num_extension)) { h3 = &t->n.nd->head; for (;;) { if (!h3) break; if ((h3->time >= GLOBALS->tims.first) && (h3->time <= GLOBALS->tims.last)) { tv = mynan; if (h3->flags & HIST_REAL) { #ifdef WAVE_HAS_H_DOUBLE if (!(h3->flags & HIST_STRING)) tv = h3->v.h_double; #else if (!(h3->flags & HIST_STRING) && h3->v.h_vector) tv = *(double *) h3->v.h_vector; #endif } else { if (h3->time <= GLOBALS->tims.last) tv = convert_real_vec (t, h3->v.h_vector); } if (!isnan (tv) && !isinf (tv)) { if (isnan (tmin) || tv < tmin) tmin = tv; if (isnan (tmax) || tv > tmax) tmax = tv; } else if (isinf (tv)) { any_infs = 1; if (tv > 0) { any_infp = 1; } else { any_infm = 1; } } } h3 = h3->next; } if (isnan (tmin) || isnan (tmax)) tmin = tmax = 0; if (any_infs) { double tdelta = (tmax - tmin) * WAVE_INF_SCALING; if (any_infp) tmax = tmax + tdelta; if (any_infm) tmin = tmin - tdelta; } if ((tmax - tmin) < 1e-20) { tmax = 1; tmin -= 0.5 * (_y1 - _y0); } else { tmax = (_y1 - _y0) / (tmax - tmin); } t->minmax_valid = 1; t->d_minval = tmin; t->d_maxval = tmax; t->d_num_ext = num_extension; } else { tmin = t->d_minval; tmax = t->d_maxval; } } else { h3 = h; for (;;) { if (!h3) break; tim = h3->time; if (tim > GLOBALS->tims.end) { endcnt++; if (endcnt == 2) break; } if (tim > GLOBALS->tims.last) break; _x0 = (tim - GLOBALS->tims.start) * GLOBALS->pxns; if ((_x0 > GLOBALS->wavewidth) && (endcnt == 2)) break; tv = mynan; if (h3->flags & HIST_REAL) { #ifdef WAVE_HAS_H_DOUBLE if (!(h3->flags & HIST_STRING)) tv = h3->v.h_double; #else if (!(h3->flags & HIST_STRING) && h3->v.h_vector) tv = *(double *) h3->v.h_vector; #endif } else { if (h3->time <= GLOBALS->tims.last) tv = convert_real_vec (t, h3->v.h_vector); } if (!isnan (tv) && !isinf (tv)) { if (isnan (tmin) || tv < tmin) tmin = tv; if (isnan (tmax) || tv > tmax) tmax = tv; } else if (isinf (tv)) { any_infs = 1; if (tv > 0) { any_infp = 1; } else { any_infm = 1; } } h3 = h3->next; } if (isnan (tmin) || isnan (tmax)) tmin = tmax = 0; if (any_infs) { double tdelta = (tmax - tmin) * WAVE_INF_SCALING; if (any_infp) tmax = tmax + tdelta; if (any_infm) tmin = tmin - tdelta; } if ((tmax - tmin) < 1e-20) { tmax = 1; tmin -= 0.5 * (_y1 - _y0); } else { tmax = (_y1 - _y0) / (tmax - tmin); } } pr_setgray (prc, 0.0); for (;;) { if (!h) break; tim = (h->time); if ((tim > GLOBALS->tims.end) || (tim > GLOBALS->tims.last)) break; _x0 = (tim - GLOBALS->tims.start) * GLOBALS->pxns; /* if (_x0 < -1) _x0 = -1; else if (_x0 > GLOBALS->wavewidth) break; */ h2 = h->next; if (!h2) break; h2tim = tim = (h2->time); if (tim > GLOBALS->tims.last) tim = GLOBALS->tims.last; /* else if (tim > GLOBALS->tims.end + 1) tim = GLOBALS->tims.end + 1; */ _x1 = (tim - GLOBALS->tims.start) * GLOBALS->pxns; /* if (_x1 < -1) _x1 = -1; else if (_x1 > GLOBALS->wavewidth) _x1 = GLOBALS->wavewidth; */ /* draw trans */ /* scan-build : unused type = (!(h->flags & (HIST_REAL | HIST_STRING))) ? vtype (t, h->v. h_vector) : AN_0; */ tv = tv2 = mynan; if (h->flags & HIST_REAL) { #ifdef WAVE_HAS_H_DOUBLE if (!(h->flags & HIST_STRING)) tv = h->v.h_double; #else if (!(h->flags & HIST_STRING) && h->v.h_vector) tv = *(double *) h->v.h_vector; #endif } else { if (h->time <= GLOBALS->tims.last) tv = convert_real_vec (t, h->v.h_vector); } if (h2->flags & HIST_REAL) { #ifdef WAVE_HAS_H_DOUBLE if (!(h2->flags & HIST_STRING)) tv2 = h2->v.h_double; #else if (!(h2->flags & HIST_STRING) && h2->v.h_vector) tv2 = *(double *) h2->v.h_vector; #endif } else { if (h2->time <= GLOBALS->tims.last) tv2 = convert_real_vec (t, h2->v.h_vector); } if ((is_inf = isinf (tv))) { if (tv < 0) { yt0 = _y0; } else { yt0 = _y1; } } else if ((is_nan = isnan (tv))) { yt0 = yu; } else { yt0 = _y0 + (tv - tmin) * tmax; } if ((is_inf2 = isinf (tv2))) { if (tv2 < 0) { yt1 = _y0; } else { yt1 = _y1; } } else if ((is_nan2 = isnan (tv2))) { yt1 = yu; } else { yt1 = _y0 + (tv2 - tmin) * tmax; } if ((_x0 != _x1) || (skipcnt < GLOBALS->analog_redraw_skip_count)) /* lower number = better performance */ { if(_x0==_x1) { skipcnt++; } else { skipcnt = 0; } if (h->next) { if (h->next->time > GLOBALS->max_time) { yt1 = yt0; } } if ((is_nan2) && (h2tim > GLOBALS->max_time)) is_nan2 = 0; /* clamp to top/bottom because of integer rounding errors */ if(yt0 < _y1) yt0 = _y1; else if(yt0 > _y0) yt0 = _y0; if(yt1 < _y1) yt1 = _y1; else if(yt1 > _y0) yt1 = _y0; /* clipping... */ { int coords[4]; int rect[4]; if(_x0 < INT_MIN) { coords[0] = INT_MIN; } else if(_x0 > INT_MAX) { coords[0] = INT_MAX; } else { coords[0] = _x0; } if(_x1 < INT_MIN) { coords[2] = INT_MIN; } else if(_x1 > INT_MAX) { coords[2] = INT_MAX; } else { coords[2] = _x1; } coords[1] = yt0; coords[3] = yt1; rect[0] = -10; rect[1] = _y1; rect[2] = GLOBALS->wavewidth + 10; rect[3] = _y0c; if((t->flags & (TR_ANALOG_INTERPOLATED|TR_ANALOG_STEP)) != TR_ANALOG_STEP) { line_in_range = wave_lineclip(coords, rect); } else { line_in_range = 1; if(coords[0] < rect[0]) coords[0] = rect[0]; if(coords[2] < rect[0]) coords[2] = rect[0]; if(coords[0] > rect[2]) coords[0] = rect[2]; if(coords[2] > rect[2]) coords[2] = rect[2]; if(coords[1] < rect[1]) coords[1] = rect[1]; if(coords[3] < rect[1]) coords[3] = rect[1]; if(coords[1] > rect[3]) coords[1] = rect[3]; if(coords[3] > rect[3]) coords[3] = rect[3]; } _x0 = coords[0]; yt0 = coords[1]; _x1 = coords[2]; yt1 = coords[3]; } /* ...clipping */ if (is_nan || is_nan2) { if(line_in_range) { if (is_nan) { pr_setgray (prc, 0.70); pr_draw_box (prc, _x0, _y1, _x1, _y0); pr_setgray (prc, 0.0); if ((t-> flags & (TR_ANALOG_INTERPOLATED | TR_ANALOG_STEP)) == (TR_ANALOG_INTERPOLATED | TR_ANALOG_STEP)) { pr_draw_line (prc, _x1 - 1, yt1, _x1 + 1, yt1); pr_draw_line (prc, _x1, yt1 - 1, _x1, yt1 + 1); pr_draw_line (prc, _x0 - 1, _y0, _x0 + 1, _y0); pr_draw_line (prc, _x0, _y0 - 1, _x0, _y0 + 1); pr_draw_line (prc, _x0 - 1, _y1, _x0 + 1, _y1); pr_draw_line (prc, _x0, _y1 - 1, _x0, _y1 + 1); } } if (is_nan2) { pr_draw_line (prc, _x0, yt0, _x1, yt0); if ((t-> flags & (TR_ANALOG_INTERPOLATED | TR_ANALOG_STEP)) == (TR_ANALOG_INTERPOLATED | TR_ANALOG_STEP)) { pr_setgray (prc, 0.70); pr_draw_line (prc, _x1, _y1, _x1, _y0); pr_setgray (prc, 0.0); pr_draw_line (prc, _x1 - 1, _y0, _x1 + 1, _y0); pr_draw_line (prc, _x1, _y0 - 1, _x1, _y0 + 1); pr_draw_line (prc, _x1 - 1, _y1, _x1 + 1, _y1); pr_draw_line (prc, _x1, _y1 - 1, _x1, _y1 + 1); } } } } else if (t->flags & TR_ANALOG_INTERPOLATED && !is_inf && !is_inf2) { if(line_in_range) { pr_draw_line (prc, _x0, yt0, _x1, yt1); if (t->flags & TR_ANALOG_STEP) { pr_draw_line (prc, _x0 - 1, yt0, _x0 + 1, yt0); pr_draw_line (prc, _x0, yt0 - 1, _x0, yt0 + 1); } } } else /* if (t->flags & TR_ANALOG_STEP) */ { if(line_in_range) { pr_draw_line (prc, _x0, yt0, _x1, yt0); pr_draw_line (prc, _x1, yt0, _x1, yt1); if ((t->flags & (TR_ANALOG_INTERPOLATED | TR_ANALOG_STEP)) == (TR_ANALOG_INTERPOLATED | TR_ANALOG_STEP)) { pr_draw_line (prc, _x0 - 1, yt0, _x0 + 1, yt0); pr_draw_line (prc, _x0, yt0 - 1, _x0, yt0 + 1); } } } } else { newtime = (((gdouble) (_x1 + WAVE_OPT_SKIP)) * GLOBALS->nspx) + GLOBALS->tims.start /*+ GLOBALS->shift_timebase*/; /* skip to next pixel */ h3 = bsearch_node (t->n.nd, newtime); if (h3->time > h->time) { h = h3; /* lasttype = type; */ continue; } } h = h->next; /* lasttype = type; */ } } static void pr_draw_hptr_trace_vector (pr_context * prc, Trptr t, hptr h, int which) { TimeType _x0, _x1, newtime, width; int _y0, _y1, yu, liney, ytext; TimeType tim /* , h2tim */; /* scan-build */ hptr h2, h3; char *ascii = NULL; int pixlen, ysiz; int type; int lasttype = -1; GLOBALS->tims.start -= GLOBALS->shift_timebase; GLOBALS->tims.end -= GLOBALS->shift_timebase; liney = ((which + 2) * GLOBALS->fontheight) - 2; _y1 = ((which + 1) * GLOBALS->fontheight) + 2; _y0 = liney - 2; yu = (_y0 + _y1) / 2; ytext = yu - (GLOBALS->wavefont->ascent / 2) + GLOBALS->wavefont->ascent; ysiz = GLOBALS->wavefont->ascent - 1; if (ysiz < 1) ysiz = 1; if ((GLOBALS->display_grid) && (GLOBALS->enable_horiz_grid)) { Trptr tn = GiveNextTrace(t); if ((t->flags & TR_ANALOGMASK) && (tn) && (tn->flags & TR_ANALOG_BLANK_STRETCH)) { } else { pr_setgray (prc, 0.75); pr_draw_line (prc, (GLOBALS->tims.start < GLOBALS->tims.first) ? (GLOBALS->tims.first - GLOBALS->tims.start) * GLOBALS->pxns : 0, liney, (GLOBALS->tims.last <= GLOBALS->tims.end) ? (GLOBALS->tims.last - GLOBALS->tims.start) * GLOBALS->pxns : GLOBALS->wavewidth - 1, liney); } } if ((t->flags & TR_ANALOGMASK) && (!(h->flags & HIST_STRING) || !(h->flags & HIST_REAL))) { Trptr te = GiveNextTrace(t); int ext = 0; int ext_total; int num_traces_displayable = GLOBALS->signalarea->allocation.height / GLOBALS->fontheight; while (te) { if (te->flags & TR_ANALOG_BLANK_STRETCH) { ext++; te = GiveNextTrace(te); } else { break; } } ext_total = ext; if (which + ext > num_traces_displayable - 2) { ext = num_traces_displayable - which - 2; if (ext < 0) ext = 0; /* just in case of a one-off */ } pr_draw_hptr_trace_vector_analog (prc, t, h, which, ext, ext_total); GLOBALS->tims.start -= GLOBALS->shift_timebase; GLOBALS->tims.end -= GLOBALS->shift_timebase; return; } pr_setgray (prc, 0.0); for (;;) { if (!h) break; tim = (h->time); if ((tim > GLOBALS->tims.end) || (tim > GLOBALS->tims.last)) break; _x0 = (tim - GLOBALS->tims.start) * GLOBALS->pxns; if (_x0 < -1) _x0 = -1; else if (_x0 > GLOBALS->wavewidth) break; h2 = h->next; if (!h2) break; /* h2tim = */ tim = (h2->time); /* scan-build */ if (tim > GLOBALS->tims.last) tim = GLOBALS->tims.last; else if (tim > GLOBALS->tims.end + 1) tim = GLOBALS->tims.end + 1; _x1 = (tim - GLOBALS->tims.start) * GLOBALS->pxns; if (_x1 < -1) _x1 = -1; else if (_x1 > GLOBALS->wavewidth) _x1 = GLOBALS->wavewidth; /* draw trans */ if(!(h->flags&(HIST_REAL|HIST_STRING))) { type = vtype(t,h->v.h_vector); } else { /* s\000 ID is special "z" case */ type = AN_0; if(h->flags&HIST_STRING) { if(h->v.h_vector) { if(!h->v.h_vector[0]) { type = AN_Z; } else { if(!strcmp(h->v.h_vector, "UNDEF")) { type = AN_X; } } } else { type = AN_X; } } } /* type = !(h->flags & (HIST_REAL | HIST_STRING))) ? vtype (t, h->v.h_vector) : AN_0; */ if (_x0 > -1) { if (GLOBALS->use_roundcaps) { if (type == AN_Z) { if (lasttype != -1) { pr_draw_line (prc, _x0 - 1, _y0, _x0, yu); pr_draw_line (prc, _x0, yu, _x0 - 1, _y1); } } else if (lasttype == AN_Z) { pr_draw_line (prc, _x0 + 1, _y0, _x0, yu); pr_draw_line (prc, _x0, yu, _x0 + 1, _y1); } else { if (lasttype != type) { pr_draw_line (prc, _x0 - 1, _y0, _x0, yu); pr_draw_line (prc, _x0, yu, _x0 - 1, _y1); pr_draw_line (prc, _x0 + 1, _y0, _x0, yu); pr_draw_line (prc, _x0, yu, _x0 + 1, _y1); } else { pr_draw_line (prc, _x0 - 2, _y0, _x0 + 2, _y1); pr_draw_line (prc, _x0 + 2, _y0, _x0 - 2, _y1); } } } else { pr_draw_line (prc, _x0, _y0, _x0, _y1); } } if (_x0 != _x1) { if (type == AN_Z) { if (GLOBALS->use_roundcaps) { pr_draw_line (prc, _x0 + 1, yu, _x1 - 1, yu); } else { pr_draw_line (prc, _x0, yu, _x1, yu); } } else { if (GLOBALS->use_roundcaps) { pr_draw_line (prc, _x0 + 2, _y0, _x1 - 2, _y0); pr_draw_line (prc, _x0 + 2, _y1, _x1 - 2, _y1); } else { pr_draw_line (prc, _x0, _y0, _x1, _y0); pr_draw_line (prc, _x0, _y1, _x1, _y1); } if (_x0 < 0) _x0 = 0; /* fixup left margin */ width = ((prc->gpd == &ps_print_device) || (_x1 < GLOBALS->wavewidth)) ? _x1 - _x0 : GLOBALS->wavewidth - _x0; /* truncate render * window for non-ps */ if (width > GLOBALS->vector_padding) { char *t_ascii; /* to skip past color ? ? string */ if (h->flags & HIST_REAL) { if (!(h->flags & HIST_STRING)) { #ifdef WAVE_HAS_H_DOUBLE ascii = convert_ascii_real (t, &h->v.h_double); #else ascii = convert_ascii_real (t, (double *) h->v.h_vector); #endif } else { ascii = convert_ascii_string ((char *) h->v.h_vector); } } else { ascii = convert_ascii_vec (t, h->v.h_vector); } if((*ascii=='?')&&((t_ascii=strchr(ascii+1, '?')))) { t_ascii++; } else { t_ascii = ascii; } if (((pixlen = font_engine_string_measure (GLOBALS->wavefont, t_ascii)) + GLOBALS->vector_padding <= width) || ((_x1 >= GLOBALS->wavewidth) && (prc->gpd == &ps_print_device))) { pr_draw_string (prc, _x0 + 2, ytext, t_ascii, pixlen, ysiz); } else { char *mod; mod = bsearch_trunc (t_ascii, width - GLOBALS->vector_padding); if (mod) { *mod = '+'; *(mod + 1) = 0; pr_draw_string (prc, _x0 + 2, ytext, t_ascii, GLOBALS->maxlen_trunc, ysiz); } } } } } else { newtime = (((gdouble) (_x1 + WAVE_OPT_SKIP)) * GLOBALS->nspx) + GLOBALS->tims.start /*+ GLOBALS->shift_timebase*/; /* skip to next pixel */ h3 = bsearch_node (t->n.nd, newtime); if (h3->time > h->time) { h = h3; lasttype = type; continue; } } if (ascii) { free_2 (ascii); ascii = NULL; } h = h->next; lasttype = type; } GLOBALS->tims.start += GLOBALS->shift_timebase; GLOBALS->tims.end += GLOBALS->shift_timebase; } /* * draw vector traces */ static void pr_draw_vptr_trace_analog (pr_context * prc, Trptr t, vptr v, int which, int num_extension_clip, int num_extension) { TimeType _x0, _x1, newtime; int _y0, _y1, yu, liney, /* ytext, */ yt0, yt1; /* scan-build */ int _y0c; TimeType tim, h2tim; vptr h, h2, h3; int endcnt = 0; /* int ysiz; */ /* scan-build */ /* int type; */ /* scan-build */ /* int lasttype = -1; */ /* scan-build */ double mynan = strtod ("NaN", NULL); double tmin = mynan, tmax = mynan, tv, tv2; int is_nan = 0, is_nan2 = 0, is_inf = 0, is_inf2 = 0; int any_infs = 0, any_infp = 0, any_infm = 0; int skipcnt = 0; int line_in_range; h = v; liney = ((which + 2 + num_extension) * GLOBALS->fontheight) - 2; _y1 = ((which + 1) * GLOBALS->fontheight) + 2; _y0 = liney - 2; _y0c = (((which + 2 + num_extension_clip) * GLOBALS->fontheight) - 2) - 2; yu = (_y0 + _y1) / 2; /* ytext = yu - (GLOBALS->wavefont->ascent / 2) + GLOBALS->wavefont->ascent; */ /* scan-build */ /* scan-build : unused ysiz = GLOBALS->wavefont->ascent - 1; if (ysiz < 1) ysiz = 1; */ if (t->flags & TR_ANALOG_FULLSCALE) /* otherwise use dynamic */ { if((!t->minmax_valid)||(t->d_num_ext != num_extension)) { h3 = t->n.vec->vectors[0]; for (;;) { if (!h3) break; if ((h3->time >= GLOBALS->tims.first) && (h3->time <= GLOBALS->tims.last)) { /* tv = mynan; */ /* scan-build */ tv = convert_real (t, h3); if (!isnan (tv) && !isinf (tv)) { if (isnan (tmin) || tv < tmin) tmin = tv; if (isnan (tmax) || tv > tmax) tmax = tv; } else if (isinf (tv)) { any_infs = 1; if (tv > 0) { any_infp = 1; } else { any_infm = 1; } } } h3 = h3->next; } if (isnan (tmin) || isnan (tmax)) tmin = tmax = 0; if (any_infs) { double tdelta = (tmax - tmin) * WAVE_INF_SCALING; if (any_infp) tmax = tmax + tdelta; if (any_infm) tmin = tmin - tdelta; } if ((tmax - tmin) < 1e-20) { tmax = 1; tmin -= 0.5 * (_y1 - _y0); } else { tmax = (_y1 - _y0) / (tmax - tmin); } t->minmax_valid = 1; t->d_minval = tmin; t->d_maxval = tmax; t->d_num_ext = num_extension; } else { tmin = t->d_minval; tmax = t->d_maxval; } } else { h3 = h; for (;;) { if (!h3) break; tim = h3->time; if (tim > GLOBALS->tims.end) { endcnt++; if (endcnt == 2) break; } if (tim > GLOBALS->tims.last) break; _x0 = (tim - GLOBALS->tims.start) * GLOBALS->pxns; if ((_x0 > GLOBALS->wavewidth) && (endcnt == 2)) { break; } tv = convert_real (t, h3); if (!isnan (tv) && !isinf (tv)) { if (isnan (tmin) || tv < tmin) tmin = tv; if (isnan (tmax) || tv > tmax) tmax = tv; } else if (isinf (tv)) { any_infs = 1; if (tv > 0) { any_infp = 1; } else { any_infm = 1; } } h3 = h3->next; } if (isnan (tmin) || isnan (tmax)) tmin = tmax = 0; if (any_infs) { double tdelta = (tmax - tmin) * WAVE_INF_SCALING; if (any_infp) tmax = tmax + tdelta; if (any_infm) tmin = tmin - tdelta; } if ((tmax - tmin) < 1e-20) { tmax = 1; tmin -= 0.5 * (_y1 - _y0); } else { tmax = (_y1 - _y0) / (tmax - tmin); } } pr_setgray (prc, 0.0); for (;;) { if (!h) break; tim = (h->time); if ((tim > GLOBALS->tims.end) || (tim > GLOBALS->tims.last)) break; _x0 = (tim - GLOBALS->tims.start) * GLOBALS->pxns; /* if (_x0 < -1) _x0 = -1; else if (_x0 > GLOBALS->wavewidth) break; */ h2 = h->next; if (!h2) break; h2tim = tim = (h2->time); if (tim > GLOBALS->tims.last) tim = GLOBALS->tims.last; /* else if (tim > GLOBALS->tims.end + 1) tim = GLOBALS->tims.end + 1; */ _x1 = (tim - GLOBALS->tims.start) * GLOBALS->pxns; /* if (_x1 < -1) _x1 = -1; else if (_x1 > GLOBALS->wavewidth) _x1 = GLOBALS->wavewidth; */ /* draw trans */ /* type = vtype2 (t, h); */ /* scan-build */ tv = convert_real (t, h); tv2 = convert_real (t, h2); if ((is_inf = isinf (tv))) { if (tv < 0) { yt0 = _y0; } else { yt0 = _y1; } } else if ((is_nan = isnan (tv))) { yt0 = yu; } else { yt0 = _y0 + (tv - tmin) * tmax; } if ((is_inf2 = isinf (tv2))) { if (tv2 < 0) { yt1 = _y0; } else { yt1 = _y1; } } else if ((is_nan2 = isnan (tv2))) { yt1 = yu; } else { yt1 = _y0 + (tv2 - tmin) * tmax; } if((_x0!=_x1)||(skipcnt < GLOBALS->analog_redraw_skip_count)) /* lower number = better performance */ { if(_x0==_x1) { skipcnt++; } else { skipcnt = 0; } if (h->next) { if (h->next->time > GLOBALS->max_time) { yt1 = yt0; } } if ((is_nan2) && (h2tim > GLOBALS->max_time)) is_nan2 = 0; /* clamp to top/bottom because of integer rounding errors */ if(yt0 < _y1) yt0 = _y1; else if(yt0 > _y0) yt0 = _y0; if(yt1 < _y1) yt1 = _y1; else if(yt1 > _y0) yt1 = _y0; /* clipping... */ { int coords[4]; int rect[4]; if(_x0 < INT_MIN) { coords[0] = INT_MIN; } else if(_x0 > INT_MAX) { coords[0] = INT_MAX; } else { coords[0] = _x0; } if(_x1 < INT_MIN) { coords[2] = INT_MIN; } else if(_x1 > INT_MAX) { coords[2] = INT_MAX; } else { coords[2] = _x1; } coords[1] = yt0; coords[3] = yt1; rect[0] = -10; rect[1] = _y1; rect[2] = GLOBALS->wavewidth + 10; rect[3] = _y0c; if((t->flags & (TR_ANALOG_INTERPOLATED|TR_ANALOG_STEP)) != TR_ANALOG_STEP) { line_in_range = wave_lineclip(coords, rect); } else { line_in_range = 1; if(coords[0] < rect[0]) coords[0] = rect[0]; if(coords[2] < rect[0]) coords[2] = rect[0]; if(coords[0] > rect[2]) coords[0] = rect[2]; if(coords[2] > rect[2]) coords[2] = rect[2]; if(coords[1] < rect[1]) coords[1] = rect[1]; if(coords[3] < rect[1]) coords[3] = rect[1]; if(coords[1] > rect[3]) coords[1] = rect[3]; if(coords[3] > rect[3]) coords[3] = rect[3]; } _x0 = coords[0]; yt0 = coords[1]; _x1 = coords[2]; yt1 = coords[3]; } /* ...clipping */ if (is_nan || is_nan2) { if(line_in_range) { if (is_nan) { pr_setgray (prc, 0.70); pr_draw_box (prc, _x0, _y1, _x1, _y0); pr_setgray (prc, 0.0); if ((t-> flags & (TR_ANALOG_INTERPOLATED | TR_ANALOG_STEP)) == (TR_ANALOG_INTERPOLATED | TR_ANALOG_STEP)) { pr_draw_line (prc, _x1 - 1, yt1, _x1 + 1, yt1); pr_draw_line (prc, _x1, yt1 - 1, _x1, yt1 + 1); pr_draw_line (prc, _x0 - 1, _y0, _x0 + 1, _y0); pr_draw_line (prc, _x0, _y0 - 1, _x0, _y0 + 1); pr_draw_line (prc, _x0 - 1, _y1, _x0 + 1, _y1); pr_draw_line (prc, _x0, _y1 - 1, _x0, _y1 + 1); } } if (is_nan2) { pr_draw_line (prc, _x0, yt0, _x1, yt0); if ((t-> flags & (TR_ANALOG_INTERPOLATED | TR_ANALOG_STEP)) == (TR_ANALOG_INTERPOLATED | TR_ANALOG_STEP)) { pr_setgray (prc, 0.70); pr_draw_line (prc, _x1, _y1, _x1, _y0); pr_setgray (prc, 0.0); pr_draw_line (prc, _x1 - 1, _y0, _x1 + 1, _y0); pr_draw_line (prc, _x1, _y0 - 1, _x1, _y0 + 1); pr_draw_line (prc, _x1 - 1, _y1, _x1 + 1, _y1); pr_draw_line (prc, _x1, _y1 - 1, _x1, _y1 + 1); } } } } else if ((t->flags & TR_ANALOG_INTERPOLATED) && !is_inf && !is_inf2) { if(line_in_range) { pr_draw_line (prc, _x0, yt0, _x1, yt1); if (t->flags & TR_ANALOG_STEP) { pr_draw_line (prc, _x0 - 1, yt0, _x0 + 1, yt0); pr_draw_line (prc, _x0, yt0 - 1, _x0, yt0 + 1); } } } else /* if (t->flags & TR_ANALOG_STEP) */ { if(line_in_range) { pr_draw_line (prc, _x0, yt0, _x1, yt0); pr_draw_line (prc, _x1, yt0, _x1, yt1); if ((t->flags & (TR_ANALOG_INTERPOLATED | TR_ANALOG_STEP)) == (TR_ANALOG_INTERPOLATED | TR_ANALOG_STEP)) { pr_draw_line (prc, _x0 - 1, yt0, _x0 + 1, yt0); pr_draw_line (prc, _x0, yt0 - 1, _x0, yt0 + 1); } } } } else { newtime = (((gdouble) (_x1 + WAVE_OPT_SKIP)) * GLOBALS->nspx) + GLOBALS->tims.start /*+ GLOBALS->shift_timebase*/; /* skip to next pixel */ h3 = bsearch_vector (t->n.vec, newtime); if (h3->time > h->time) { h = h3; /* lasttype = type; */ /* scan-build */ continue; } } h = h->next; /* lasttype = type; */ /* scan-build */ } GLOBALS->tims.start += GLOBALS->shift_timebase; GLOBALS->tims.end += GLOBALS->shift_timebase; } static void pr_draw_vptr_trace (pr_context * prc, Trptr t, vptr v, int which) { TimeType _x0, _x1, newtime, width; int _y0, _y1, yu, liney, ytext; TimeType tim /* , h2tim */; /* scan-build */ vptr h, h2, h3; char *ascii = NULL; int pixlen, ysiz; int type; int lasttype = -1; GLOBALS->tims.start -= GLOBALS->shift_timebase; GLOBALS->tims.end -= GLOBALS->shift_timebase; liney = ((which + 2) * GLOBALS->fontheight) - 2; _y1 = ((which + 1) * GLOBALS->fontheight) + 2; _y0 = liney - 2; yu = (_y0 + _y1) / 2; ytext = yu - (GLOBALS->wavefont->ascent / 2) + GLOBALS->wavefont->ascent; ysiz = GLOBALS->wavefont->ascent - 1; if (ysiz < 1) ysiz = 1; if ((GLOBALS->display_grid) && (GLOBALS->enable_horiz_grid)) { Trptr tn = GiveNextTrace(t); if ((t->flags & TR_ANALOGMASK) && (tn) && (tn->flags & TR_ANALOG_BLANK_STRETCH)) { } else { pr_setgray (prc, 0.75); pr_draw_line (prc, (GLOBALS->tims.start < GLOBALS->tims.first) ? (GLOBALS->tims.first - GLOBALS->tims.start) * GLOBALS->pxns : 0, liney, (GLOBALS->tims.last <= GLOBALS->tims.end) ? (GLOBALS->tims.last - GLOBALS->tims.start) * GLOBALS->pxns : GLOBALS->wavewidth - 1, liney); } } h = v; if (t->flags & TR_ANALOGMASK) { Trptr te = GiveNextTrace(t); int ext = 0; int ext_total; int num_traces_displayable = GLOBALS->signalarea->allocation.height / GLOBALS->fontheight; while (te) { if (te->flags & TR_ANALOG_BLANK_STRETCH) { ext++; te = GiveNextTrace(te); } else { break; } } ext_total = ext; if (which + ext > num_traces_displayable - 2) { ext = num_traces_displayable - which - 2; if (ext < 0) ext = 0; /* just in case of a one-off */ } pr_draw_vptr_trace_analog (prc, t, v, which, ext, ext_total); GLOBALS->tims.start+=GLOBALS->shift_timebase; GLOBALS->tims.end+=GLOBALS->shift_timebase; return; } pr_setgray (prc, 0.0); for (;;) { if (!h) break; tim = (h->time); if ((tim > GLOBALS->tims.end) || (tim > GLOBALS->tims.last)) break; _x0 = (tim - GLOBALS->tims.start) * GLOBALS->pxns; if (_x0 < -1) _x0 = -1; else if (_x0 > GLOBALS->wavewidth) break; h2 = h->next; if (!h2) break; /* h2tim = */ tim = (h2->time); /* scan-build */ if (tim > GLOBALS->tims.last) tim = GLOBALS->tims.last; else if (tim > GLOBALS->tims.end + 1) tim = GLOBALS->tims.end + 1; _x1 = (tim - GLOBALS->tims.start) * GLOBALS->pxns; if (_x1 < -1) _x1 = -1; else if (_x1 > GLOBALS->wavewidth) _x1 = GLOBALS->wavewidth; /* draw trans */ type = vtype2 (t, h); if (_x0 > -1) { if (GLOBALS->use_roundcaps) { if (type == 2) { if (lasttype != -1) { pr_draw_line (prc, _x0 - 1, _y0, _x0, yu); pr_draw_line (prc, _x0, yu, _x0 - 1, _y1); } } else if (lasttype == 2) { pr_draw_line (prc, _x0 + 1, _y0, _x0, yu); pr_draw_line (prc, _x0, yu, _x0 + 1, _y1); } else { if (lasttype != type) { pr_draw_line (prc, _x0 - 1, _y0, _x0, yu); pr_draw_line (prc, _x0, yu, _x0 - 1, _y1); pr_draw_line (prc, _x0 + 1, _y0, _x0, yu); pr_draw_line (prc, _x0, yu, _x0 + 1, _y1); } else { pr_draw_line (prc, _x0 - 2, _y0, _x0 + 2, _y1); pr_draw_line (prc, _x0 + 2, _y0, _x0 - 2, _y1); } } } else { pr_draw_line (prc, _x0, _y0, _x0, _y1); } } if (_x0 != _x1) { if (type == 2) { if (GLOBALS->use_roundcaps) { pr_draw_line (prc, _x0 + 1, yu, _x1 - 1, yu); } else { pr_draw_line (prc, _x0, yu, _x1, yu); } } else { if (GLOBALS->use_roundcaps) { pr_draw_line (prc, _x0 + 2, _y0, _x1 - 2, _y0); pr_draw_line (prc, _x0 + 2, _y1, _x1 - 2, _y1); } else { pr_draw_line (prc, _x0, _y0, _x1, _y0); pr_draw_line (prc, _x0, _y1, _x1, _y1); } if (_x0 < 0) _x0 = 0; /* fixup left margin */ width = ((prc->gpd == &ps_print_device) || (_x1 < GLOBALS->wavewidth)) ? _x1 - _x0 : GLOBALS->wavewidth - _x0; /* truncate render * window for non-ps */ if (width > GLOBALS->vector_padding) { char *t_ascii; ascii = convert_ascii (t, h); if((*ascii=='?')&&((t_ascii=strchr(ascii+1, '?')))) { t_ascii++; } else { t_ascii = ascii; } if (((pixlen = font_engine_string_measure (GLOBALS->wavefont, t_ascii)) + GLOBALS->vector_padding <= width) || ((_x1 >= GLOBALS->wavewidth) && (prc->gpd == &ps_print_device))) { pr_draw_string (prc, _x0 + 2, ytext, t_ascii, pixlen, ysiz); } else { char *mod; mod = bsearch_trunc (t_ascii, width - GLOBALS->vector_padding); if (mod) { *mod = '+'; *(mod + 1) = 0; pr_draw_string (prc, _x0 + 2, ytext, t_ascii, GLOBALS->maxlen_trunc, ysiz); } } } } } else { newtime = (((gdouble) (_x1 + WAVE_OPT_SKIP)) * GLOBALS->nspx) + GLOBALS->tims.start /*+ GLOBALS->shift_timebase*/; /* skip to next pixel */ h3 = bsearch_vector (t->n.vec, newtime); if (h3->time > h->time) { h = h3; lasttype = type; continue; } } if (ascii) { free_2 (ascii); ascii = NULL; } h = h->next; lasttype = type; } GLOBALS->tims.start += GLOBALS->shift_timebase; GLOBALS->tims.end += GLOBALS->shift_timebase; } static void pr_rendertraces (pr_context * prc) { if (!GLOBALS->topmost_trace) { GLOBALS->topmost_trace = GLOBALS->traces.first; } if (GLOBALS->topmost_trace) { Trptr t = GLOBALS->topmost_trace; Trptr tback = t; hptr h; vptr v; int i = 0, num_traces_displayable; int iback = 0; num_traces_displayable = GLOBALS->wavearea->allocation.height / (GLOBALS->fontheight); num_traces_displayable--; /* for the time trace that is * always there */ /* ensure that transaction traces are visible even if the topmost traces are blanks */ while(tback) { if(tback->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH)) { tback = GivePrevTrace(tback); iback--; } else if(tback->flags & TR_TTRANSLATED) { if(tback != t) { t = tback; i = iback; } break; } else { break; } } for (; ((i < num_traces_displayable) && (t)); i++) { if (!(t->flags & (TR_EXCLUDE | TR_BLANK | TR_ANALOG_BLANK_STRETCH))) { GLOBALS->shift_timebase = t->shift; if (!t->vector) { h = bsearch_node (t->n.nd, GLOBALS->tims.start - t->shift); DEBUG (printf ("Start time: " TTFormat ", Histent time: " TTFormat "\n", GLOBALS->tims.start, (h->time + GLOBALS->shift_timebase))); if (!t->n.nd->extvals) { if(i>=0) pr_draw_hptr_trace (prc, t, h, i, 1, 0); } else { if(i>=0) pr_draw_hptr_trace_vector (prc, t, h, i); } } else { Trptr t_orig, tn; bvptr bv = t->n.vec; v = bsearch_vector (bv, GLOBALS->tims.start - t->shift); DEBUG (printf ("Vector Trace: %s, %s\n", t->name, t->n.vec->bvname)); DEBUG (printf ("Start time: " TTFormat ", Vectorent time: " TTFormat "\n", GLOBALS->tims.start, (v->time + GLOBALS->shift_timebase))); if(i>=0) pr_draw_vptr_trace (prc, t, v, i); if((bv->transaction_chain) && (t->flags & TR_TTRANSLATED)) { t_orig = t; for(;;) { tn = GiveNextTrace(t); bv = bv->transaction_chain; if(bv && tn && (tn->flags & (TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { i++; if(itims.start - t->shift); if(i>=0) pr_draw_vptr_trace(prc, t_orig,v,i); t = tn; continue; } } break; } } } } else { int kill_dodraw_grid = t->flags & TR_ANALOG_BLANK_STRETCH; if (kill_dodraw_grid) { Trptr tn = GiveNextTrace(t); if (!tn) { kill_dodraw_grid = 0; } else if (!(tn->flags & TR_ANALOG_BLANK_STRETCH)) { kill_dodraw_grid = 0; } } if(i>=0) pr_draw_hptr_trace (prc, NULL, NULL, i, 0, kill_dodraw_grid); } t = GiveNextTrace (t); } } pr_draw_named_markers (prc); pr_draw_marker (prc); } /**********************************************/ static int pr_RenderSig (pr_context * prc, Trptr t, int i) { int texty, liney; int retval; char buf[2048]; char *subname = NULL; buf[0] = 0; if(t->flags & (TR_BLANK|TR_ANALOG_BLANK_STRETCH)) /* seek to real xact trace if present... */ { Trptr tscan = t; int bcnt = 0; while((tscan) && (tscan = GivePrevTrace(tscan))) { if(!(tscan->flags & (TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { if(tscan->flags & TR_TTRANSLATED) { break; /* found it */ } else { tscan = NULL; } } else { bcnt++; /* bcnt is number of blank traces */ } } if((tscan)&&(tscan->vector)) { bvptr bv = tscan->n.vec; do { bv = bv->transaction_chain; /* correlate to blank trace */ } while(bv && (bcnt--)); if(bv) { subname = bv->bvname; if(GLOBALS->hier_max_level) subname = hier_extract(subname, GLOBALS->hier_max_level); } } } populateBuffer(t, subname, buf); UpdateSigValue (t); /* in case it's stale on nonprop */ liney = ((i + 2) * GLOBALS->fontheight) - 2; texty = liney - (GLOBALS->signalfont->descent); retval = liney - GLOBALS->fontheight + 1; if (t->flags & TR_HIGHLIGHT) pr_setgray (prc, 0.75); else pr_setgray (prc, 0.95); pr_draw_box (prc, 2, retval + 1, GLOBALS->pr_signal_fill_width_print_c_1 - 2, retval + GLOBALS->fontheight - 3); pr_setgray (prc, 0.75); pr_draw_line (prc, 0, liney, GLOBALS->pr_signal_fill_width_print_c_1 - 1, liney); /* if (!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))) */ { int maxwidth = 0; maxwidth = strlen (buf); if ((t->asciivalue) && (!(t->flags & TR_EXCLUDE))) maxwidth += strlen (t->asciivalue); if (maxwidth) { gdouble realwidth; char *cbuf; cbuf = wave_alloca (maxwidth + 1); cbuf[0] = 0; if (buf[0]) { strcpy (cbuf, buf); } if ((t->asciivalue) && (!(t->flags & TR_EXCLUDE))) strcat (cbuf, t->asciivalue); realwidth = maxwidth * GLOBALS->ps_chwidth_print_c_1; if (maxwidth == 0) return (retval); pr_setgray (prc, 0.0); pr_draw_string (prc, 3, texty - 1, cbuf, realwidth, GLOBALS->signalfont->ascent - GLOBALS->signalfont->descent); } } return (retval); } static void pr_RenderSigs (pr_context * prc, int trtarget) { Trptr t; int i, trwhich /* , width */; /* scan-build */ int num_traces_displayable; /* GtkAdjustment *hadj; */ /* scan-build */ /* gint xsrc; */ /* scan-build */ /* hadj = GTK_ADJUSTMENT (GLOBALS->signal_hslider); */ /* scan-build */ /* xsrc = (gint) hadj->value; */ /* scan-build */ num_traces_displayable = GLOBALS->signalarea->allocation.height / (GLOBALS->fontheight); num_traces_displayable--; /* for the time trace that is always * there */ pr_setgray (prc, 0.75); pr_draw_line (prc, 0, GLOBALS->fontheight - 1, GLOBALS->pr_signal_fill_width_print_c_1 - 1, GLOBALS->fontheight - 1); pr_setgray (prc, 0.0); pr_draw_string (prc, 3, GLOBALS->fontheight, "Time", (/* width = */ /* scan-build */ font_engine_string_measure (GLOBALS->wavefont, "Time")) * 2, GLOBALS->fontheight); GLOBALS->ps_chwidth_print_c_1 = ((gdouble) (GLOBALS->pr_signal_fill_width_print_c_1 - 6)) / ((gdouble) (GLOBALS->ps_nummaxchars_print_c_1)); t = GLOBALS->traces.first; trwhich = 0; while (t) { if ((trwhich < trtarget) && (GiveNextTrace (t))) { trwhich++; t = GiveNextTrace (t); } else { break; } } GLOBALS->topmost_trace = t; if (t) { for (i = 0; (i < num_traces_displayable) && (t); i++) { pr_RenderSig (prc, t, i); t = GiveNextTrace (t); } } } /**********************************************/ void print_image (pr_context * prc) { GtkAdjustment *sadj; int trtarget; if ((GLOBALS->traces.total + 1) * GLOBALS->fontheight > GLOBALS->wavearea->allocation.height) GLOBALS->liney_max = GLOBALS->wavearea->allocation.height; else GLOBALS->liney_max = (GLOBALS->traces.total + 1) * GLOBALS->fontheight; GLOBALS->pr_signal_fill_width_print_c_1 = ps_MaxSignalLength (); pr_wave_init (prc); pr_header (prc); pr_rendertimes (prc); pr_rendertraces (prc); pr_signal_init (prc); sadj = GTK_ADJUSTMENT (GLOBALS->wave_vslider); trtarget = (int) (sadj->value); pr_RenderSigs (prc, trtarget); pr_trailer (prc); } void print_ps_image (FILE * wave, gdouble px, gdouble py) { pr_context prc; prc.gpd = &ps_print_device; prc.PageX = px; /* Legal page width */ prc.PageY = py; /* Legal page height */ prc.LM = 1; /* Left Margin (inch) */ prc.RM = 1; /* Right Margin (inch) */ prc.BM = 1; /* Bottom Margin (inch) */ prc.TM = 1; /* Top Margin (inch) */ prc.handle = wave; prc.fullpage = GLOBALS->ps_fullpage; print_image (&prc); } void print_mif_image (FILE * wave, gdouble px, gdouble py) { pr_context prc; prc.gpd = &mif_print_device; prc.PageX = px; /* Legal page width */ prc.PageY = py; /* Legal page height */ prc.LM = 1; /* Left Margin (inch) */ prc.RM = 1; /* Right Margin (inch) */ prc.BM = 1; /* Bottom Margin (inch) */ prc.TM = 1; /* Top Margin (inch) */ prc.tr_x = 0; prc.tr_y = 0; prc.handle = wave; prc.fullpage = GLOBALS->ps_fullpage; print_image (&prc); } gtkwave-3.3.86/src/help.h0000664000175000017500000000072613166335473014501 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010 * * 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. */ #ifndef WAVE_HELPBOX_H #define WAVE_HELPBOX_H void helpbox(char *title, int width, char *default_text); void help_text(char *str); void help_text_bold(char *str); #endif gtkwave-3.3.86/src/savefile.c0000664000175000017500000016630513166335473015350 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2012-2016. * * 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. */ #include "globals.h" #include #include "savefile.h" #include "hierpack.h" #ifdef HAVE_SYS_STAT_H #include #endif #ifdef __linux__ #ifndef _XOPEN_SOURCE char *strptime(const char *s, const char *format, struct tm *tm); #endif #endif char *extract_dumpname_from_save_file(char *lcname, gboolean *modified, int *opt_vcd) { char *dfn = NULL; char *sfn = NULL; char *rp = NULL; FILE *f; off_t dumpsiz = -1; time_t dumptim = -1; if ((suffix_check(lcname, ".sav")) || (suffix_check(lcname, ".gtkw"))) { read_save_helper(lcname, &dfn, &sfn, &dumpsiz, &dumptim, opt_vcd); #if defined __USE_BSD || defined __USE_XOPEN_EXTENDED || defined __CYGWIN__ || defined HAVE_REALPATH || defined __MINGW32__ if(sfn && dfn) { char *can = realpath_2(lcname, NULL); char *fdf = find_dumpfile(sfn, dfn, can); free(can); f = fopen(fdf, "rb"); if(f) { rp = fdf; fclose(f); goto bot; } } #endif if(dfn) { f = fopen(dfn, "rb"); if(f) { fclose(f); rp = strdup_2(dfn); goto bot; } } } bot: if(dfn) free_2(dfn); if(sfn) free_2(sfn); if(modified) *modified = 0; #ifdef HAVE_SYS_STAT_H if(modified && rp && (dumpsiz != -1) && (dumptim != -1)) { struct stat sbuf; if(!stat(rp, &sbuf)) { *modified = (dumpsiz != sbuf.st_size) || (dumptim != sbuf.st_mtime); } } #endif return(rp); } char *append_array_row(nptr n) { int was_packed = HIER_DEPACK_ALLOC; char *hname = hier_decompress_flagged(n->nname, &was_packed); #ifdef WAVE_ARRAY_SUPPORT if(!n->array_height) #endif { strcpy(GLOBALS->buf_menu_c_1, hname); } #ifdef WAVE_ARRAY_SUPPORT else { sprintf(GLOBALS->buf_menu_c_1, "%s{%d}", hname, n->this_row); } #endif if(was_packed) free_2(hname); return(GLOBALS->buf_menu_c_1); } void write_save_helper(const char *savnam, FILE *wave) { Trptr t; int i; unsigned int def=0; int sz_x, sz_y; TimeType prevshift=LLDescriptor(0); int root_x, root_y; struct strace *st; int s_ctx_iter; time_t walltime; DEBUG(printf("Write Save Fini: %s\n", savnam)); GLOBALS->dumpfile_is_modified = 0; /* writing a save file removes modification */ wave_gtk_window_set_title(GTK_WINDOW(GLOBALS->mainwindow), GLOBALS->winname, GLOBALS->dumpfile_is_modified ? WAVE_SET_TITLE_MODIFIED: WAVE_SET_TITLE_NONE, 0); time(&walltime); fprintf(wave, "[*]\n"); fprintf(wave, "[*] "WAVE_VERSION_INFO"\n"); fprintf(wave, "[*] %s",asctime(gmtime(&walltime))); fprintf(wave, "[*]\n"); if(GLOBALS->loaded_file_name) { if((GLOBALS->loaded_file_type == MISSING_FILE)||(GLOBALS->is_optimized_stdin_vcd)) { /* don't emit dumpfile tag */ } else { #ifdef HAVE_SYS_STAT_H struct stat sbuf; #endif char *unopt = GLOBALS->unoptimized_vcd_file_name ? GLOBALS->unoptimized_vcd_file_name: GLOBALS->loaded_file_name; #if defined __USE_BSD || defined __USE_XOPEN_EXTENDED || defined __CYGWIN__ || defined HAVE_REALPATH || defined __MINGW32__ char *can = realpath_2(GLOBALS->optimize_vcd ? unopt : GLOBALS->loaded_file_name, NULL); const char *cansav = realpath_2(savnam, NULL); const int do_free = 1; #else char *can = GLOBALS->optimize_vcd ? unopt : GLOBALS->loaded_file_name; const char *cansav = savnam; const int do_free = 0; #endif fprintf(wave, "[dumpfile] \"%s\"\n", can); #ifdef HAVE_SYS_STAT_H if(!stat(can, &sbuf)) { char *asct = asctime(gmtime(&sbuf.st_mtime)); if(asct) { char *asct2 = strdup_2(asct); char *nl = strchr(asct2, '\n'); if(nl) *nl = 0; fprintf(wave, "[dumpfile_mtime] \"%s\"\n", asct2); free_2(asct2); fprintf(wave, "[dumpfile_size] %"PRIu64"\n", sbuf.st_size); } } #endif if(GLOBALS->optimize_vcd && GLOBALS->unoptimized_vcd_file_name) { fprintf(wave, "[optimize_vcd]\n"); } fprintf(wave, "[savefile] \"%s\"\n", cansav); /* emit also in order to do relative path matching in future... */ if(do_free) { free(can); } } } fprintf(wave, "[timestart] "TTFormat"\n", GLOBALS->tims.start); get_window_size (&sz_x, &sz_y); if(!GLOBALS->ignore_savefile_size) fprintf(wave,"[size] %d %d\n", sz_x, sz_y); get_window_xypos(&root_x, &root_y); if(!GLOBALS->ignore_savefile_pos) fprintf(wave,"[pos] %d %d\n", root_x + GLOBALS->xpos_delta, root_y + GLOBALS->ypos_delta); fprintf(wave,"*%f "TTFormat, (float)(GLOBALS->tims.zoom),GLOBALS->tims.marker); for(i=0;inamed_markers[i]; /* gcc compiler problem...thinks this is a 'long int' in printf format warning reporting */ fprintf(wave," "TTFormat,nm); } fprintf(wave,"\n"); for(i=0;imarker_names[i]) { char mbuf[16]; make_bijective_marker_id_string(mbuf, i); if(strlen(mbuf)<2) { fprintf(wave, "[markername] %s%s\n", mbuf, GLOBALS->marker_names[i]); } else { fprintf(wave, "[markername_long] %s %s\n", mbuf, GLOBALS->marker_names[i]); } } } if(GLOBALS->ruler_step) { fprintf(wave, "[ruler] "TTFormat" "TTFormat"\n", GLOBALS->ruler_origin, GLOBALS->ruler_step); } #if WAVE_USE_GTK2 if(GLOBALS->open_tree_nodes) { dump_open_tree_nodes(wave, GLOBALS->open_tree_nodes); } #endif #if GTK_CHECK_VERSION(2,4,0) if(!GLOBALS->ignore_savefile_pane_pos) { if(GLOBALS->toppanedwindow) { fprintf(wave, "[sst_width] %d\n", gtk_paned_get_position(GTK_PANED(GLOBALS->toppanedwindow))); } if(GLOBALS->panedwindow) { fprintf(wave, "[signals_width] %d\n", gtk_paned_get_position(GTK_PANED(GLOBALS->panedwindow))); } if(GLOBALS->expanderwindow) { GLOBALS->sst_expanded = gtk_expander_get_expanded(GTK_EXPANDER(GLOBALS->expanderwindow)); fprintf(wave, "[sst_expanded] %d\n", GLOBALS->sst_expanded); } if(GLOBALS->sst_vpaned) { fprintf(wave, "[sst_vpaned_height] %d\n", gtk_paned_get_position(GTK_PANED(GLOBALS->sst_vpaned))); } } #endif t=GLOBALS->traces.first; while(t) { if((t->flags!=def)||(t==GLOBALS->traces.first)) { if((t->flags & TR_PTRANSLATED) && (!t->p_filter)) t->flags &= (~TR_PTRANSLATED); if((t->flags & TR_FTRANSLATED) && (!t->f_filter)) t->flags &= (~TR_FTRANSLATED); if((t->flags & TR_TTRANSLATED) && (!t->t_filter)) t->flags &= (~TR_TTRANSLATED); fprintf(wave,"@%x\n",def=t->flags); } if((t->shift)||((prevshift)&&(!t->shift))) { fprintf(wave,">"TTFormat"\n", t->shift); } prevshift=t->shift; if(!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { if(t->t_color) { fprintf(wave, "[color] %d\n", t->t_color); } if(t->flags & TR_FPDECSHIFT) { fprintf(wave, "[fpshift_count] %d\n", t->t_fpdecshift); } if(t->flags & TR_FTRANSLATED) { if(t->f_filter && GLOBALS->filesel_filter[t->f_filter]) { #if defined __USE_BSD || defined __USE_XOPEN_EXTENDED || defined __CYGWIN__ || defined HAVE_REALPATH || defined __MINGW32__ char *can = realpath_2(GLOBALS->filesel_filter[t->f_filter], NULL); fprintf(wave, "^%d %s\n", t->f_filter, can); free(can); #else fprintf(wave, "^%d %s\n", t->f_filter, GLOBALS->filesel_filter[t->f_filter]); #endif } else { fprintf(wave, "^%d %s\n", 0, "disabled"); } } else if(t->flags & TR_PTRANSLATED) { if(t->p_filter && GLOBALS->procsel_filter[t->p_filter]) { #if defined __USE_BSD || defined __USE_XOPEN_EXTENDED || defined __CYGWIN__ || defined HAVE_REALPATH || defined __MINGW32__ char *can = realpath_2(GLOBALS->procsel_filter[t->p_filter], NULL); fprintf(wave, "^>%d %s\n", t->p_filter, can); free(can); #else fprintf(wave, "^>%d %s\n", t->p_filter, GLOBALS->procsel_filter[t->p_filter]); #endif } else { fprintf(wave, "^>%d %s\n", 0, "disabled"); } } /* NOT an else! */ if(t->flags & TR_TTRANSLATED) { if(t->transaction_args) { fprintf(wave, "[transaction_args] \"%s\"\n", t->transaction_args); } else { fprintf(wave, "[transaction_args] \"%s\"\n", ""); } if(t->t_filter && GLOBALS->ttranssel_filter[t->t_filter]) { #if defined __USE_BSD || defined __USE_XOPEN_EXTENDED || defined __CYGWIN__ || defined HAVE_REALPATH || defined __MINGW32__ char *can = realpath_2(GLOBALS->ttranssel_filter[t->t_filter], NULL); fprintf(wave, "^<%d %s\n", t->t_filter, can); free(can); #else fprintf(wave, "^<%d %s\n", t->t_filter, GLOBALS->ttranssel_filter[t->t_filter]); #endif } else { fprintf(wave, "^<%d %s\n", 0, "disabled"); } } if(t->vector && !(t->n.vec->transaction_cache && t->n.vec->transaction_cache->transaction_nd)) { int ix; nptr *nodes; bptr bits; baptr ba; if (HasAlias(t)) { fprintf(wave,"+{%s} ", t->name_full); } bits = t->n.vec->bits; ba = bits ? bits->attribs : NULL; fprintf(wave,"%c{%s}", ba ? ':' : '#', t->n.vec->transaction_cache ? t->n.vec->transaction_cache->bvname : t->n.vec->bvname); nodes=t->n.vec->bits->nodes; for(ix=0;ixn.vec->bits->nnbits;ix++) { if(nodes[ix]->expansion) { fprintf(wave," (%d)%s",nodes[ix]->expansion->parentbit, append_array_row(nodes[ix]->expansion->parent)); } else { fprintf(wave," %s",append_array_row(nodes[ix])); } if(ba) { fprintf(wave, " "TTFormat" %x", ba[ix].shift, ba[ix].flags); } } fprintf(wave,"\n"); } else { nptr nd = (t->vector && t->n.vec->transaction_cache && t->n.vec->transaction_cache->transaction_nd) ? t->n.vec->transaction_cache->transaction_nd : t->n.nd; if(HasAlias(t)) { if(nd->expansion) { fprintf(wave,"+{%s} (%d)%s\n",t->name_full,nd->expansion->parentbit, append_array_row(nd->expansion->parent)); } else { fprintf(wave,"+{%s} %s\n",t->name_full,append_array_row(nd)); } } else { if(nd->expansion) { fprintf(wave,"(%d)%s\n",nd->expansion->parentbit, append_array_row(nd->expansion->parent)); } else { fprintf(wave,"%s\n",append_array_row(nd)); } } } } else { if(!t->name) fprintf(wave,"-\n"); else fprintf(wave,"-%s\n",t->name); } t=t->t_next; } WAVE_STRACE_ITERATOR(s_ctx_iter) { GLOBALS->strace_ctx = &GLOBALS->strace_windows[GLOBALS->strace_current_window = s_ctx_iter]; fprintf(wave, "[pattern_trace] %d\n", s_ctx_iter); if(GLOBALS->strace_ctx->timearray) { if(GLOBALS->strace_ctx->shadow_straces) { swap_strace_contexts(); st=GLOBALS->strace_ctx->straces; if(GLOBALS->strace_ctx->straces) { fprintf(wave, "!%d%d%d%d%d%d%c%c\n", GLOBALS->strace_ctx->logical_mutex[0], GLOBALS->strace_ctx->logical_mutex[1], GLOBALS->strace_ctx->logical_mutex[2], GLOBALS->strace_ctx->logical_mutex[3], GLOBALS->strace_ctx->logical_mutex[4], GLOBALS->strace_ctx->logical_mutex[5], '@'+GLOBALS->strace_ctx->mark_idx_start, '@'+GLOBALS->strace_ctx->mark_idx_end); } while(st) { if(st->value==ST_STRING) { fprintf(wave, "?\"%s\n", st->string ? st->string : ""); /* search type for this trace is string.. */ } else { fprintf(wave, "?%02x\n", (unsigned char)st->value); /* else search type for this trace.. */ } t=st->trace; if(t->flags!=def) { if((t->flags & TR_FTRANSLATED) && (!t->f_filter)) t->flags &= (~TR_FTRANSLATED); if((t->flags & TR_PTRANSLATED) && (!t->p_filter)) t->flags &= (~TR_PTRANSLATED); if((t->flags & TR_TTRANSLATED) && (!t->t_filter)) t->flags &= (~TR_TTRANSLATED); fprintf(wave,"@%x\n",def=t->flags); } if((t->shift)||((prevshift)&&(!t->shift))) { fprintf(wave,">"TTFormat"\n", t->shift); } prevshift=t->shift; if(!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { if(t->flags & TR_FTRANSLATED) { if(t->f_filter && GLOBALS->filesel_filter[t->f_filter]) { fprintf(wave, "^%d %s\n", t->f_filter, GLOBALS->filesel_filter[t->f_filter]); } else { fprintf(wave, "^%d %s\n", 0, "disabled"); } } else if(t->flags & TR_PTRANSLATED) { if(t->p_filter && GLOBALS->procsel_filter[t->p_filter]) { fprintf(wave, "^>%d %s\n", t->p_filter, GLOBALS->procsel_filter[t->p_filter]); } else { fprintf(wave, "^>%d %s\n", 0, "disabled"); } } /* NOT an else! */ if(t->flags & TR_TTRANSLATED) { if(t->transaction_args) { fprintf(wave, "[transaction_args] \"%s\"\n", t->transaction_args); } else { fprintf(wave, "[transaction_args] \"%s\"\n", ""); } if(t->t_filter && GLOBALS->ttranssel_filter[t->t_filter]) { #if defined __USE_BSD || defined __USE_XOPEN_EXTENDED || defined __CYGWIN__ || defined HAVE_REALPATH || defined __MINGW32__ char *can = realpath_2(GLOBALS->ttranssel_filter[t->t_filter], NULL); fprintf(wave, "^<%d %s\n", t->t_filter, can); free(can); #else fprintf(wave, "^<%d %s\n", t->t_filter, GLOBALS->ttranssel_filter[t->t_filter]); #endif } else { fprintf(wave, "^<%d %s\n", 0, "disabled"); } } if(t->vector && !(t->n.vec->transaction_cache && t->n.vec->transaction_cache->transaction_nd)) { int ix; nptr *nodes; bptr bits; baptr ba; if (HasAlias(t)) { fprintf(wave,"+{%s} ", t->name_full); } bits = t->n.vec->bits; ba = bits ? bits->attribs : NULL; fprintf(wave,"%c{%s}", ba ? ':' : '#', t->n.vec->transaction_cache ? t->n.vec->transaction_cache->bvname : t->n.vec->bvname); nodes=t->n.vec->bits->nodes; for(ix=0;ixn.vec->bits->nnbits;ix++) { if(nodes[ix]->expansion) { fprintf(wave," (%d)%s",nodes[ix]->expansion->parentbit, append_array_row(nodes[ix]->expansion->parent)); } else { fprintf(wave," %s",append_array_row(nodes[ix])); } if(ba) { fprintf(wave, " "TTFormat" %x", ba[ix].shift, ba[ix].flags); } } fprintf(wave,"\n"); } else { nptr nd = (t->vector && t->n.vec->transaction_cache && t->n.vec->transaction_cache->transaction_nd) ? t->n.vec->transaction_cache->transaction_nd : t->n.nd; if(HasAlias(t)) { if(nd->expansion) { fprintf(wave,"+{%s} (%d)%s\n",t->name_full,nd->expansion->parentbit, append_array_row(nd->expansion->parent)); } else { fprintf(wave,"+{%s} %s\n",t->name_full,append_array_row(nd)); } } else { if(nd->expansion) { fprintf(wave,"(%d)%s\n",nd->expansion->parentbit, append_array_row(nd->expansion->parent)); } else { fprintf(wave,"%s\n",append_array_row(nd)); } } } } st=st->next; } /* while(st)... */ if(GLOBALS->strace_ctx->straces) { fprintf(wave, "!!\n"); /* mark end of strace region */ } swap_strace_contexts(); } else { struct mprintf_buff_t *mt = GLOBALS->strace_ctx->mprintf_buff_head; while(mt) { fprintf(wave, "%s", mt->str); mt=mt->next; } } } /* if(timearray)... */ } } void read_save_helper_relative_init(char *wname) { /* for relative files in parsewavline() */ if(GLOBALS->lcname) { free_2(GLOBALS->lcname); } GLOBALS->lcname = wname ? strdup_2(wname) : NULL; if(GLOBALS->sfn) { free_2(GLOBALS->sfn); GLOBALS->sfn = NULL; } } char *get_relative_adjusted_name(char *sfn, char *dfn, char *lcname) { char *rp = NULL; FILE *f; #if defined __USE_BSD || defined __USE_XOPEN_EXTENDED || defined __CYGWIN__ || defined HAVE_REALPATH if(sfn && dfn) { char *can = realpath_2(lcname, NULL); char *fdf = find_dumpfile(sfn, dfn, can); free(can); if(fdf) { f = fopen(fdf, "rb"); if(f) { rp = fdf; fclose(f); goto bot; } } } #endif if(dfn) { f = fopen(dfn, "rb"); if(f) { fclose(f); rp = strdup_2(dfn); goto bot; } } bot: return(rp); } int read_save_helper(char *wname, char **dumpfile, char **savefile, off_t *dumpsiz, time_t *dumptim, int *opt_vcd) { FILE *wave; char *str = NULL; int wave_is_compressed; char traces_already_exist = (GLOBALS->traces.first != NULL); int rc = -1; int extract_dumpfile_savefile_only = (dumpfile != NULL) && (savefile != NULL); GLOBALS->is_gtkw_save_file = suffix_check(wname, ".gtkw") || suffix_check(wname, ".gtkw.gz") || suffix_check(wname, ".gtkw.zip"); if(suffix_check(wname, ".gz") || suffix_check(wname, ".zip")) { str=wave_alloca(strlen(wname)+5+1); strcpy(str,"zcat "); strcpy(str+5,wname); wave=popen(str,"r"); wave_is_compressed=~0; } else { wave=fopen(wname,"rb"); wave_is_compressed=0; } if(!wave) { fprintf(stderr, "Error opening save file '%s' for reading.\n", wname); perror("Why"); errno=0; } else { char *iline; int s_ctx_iter; if(extract_dumpfile_savefile_only) { while((iline=fgetmalloc(wave))) { if(!strncmp(iline, "[dumpfile]", 10)) { char *lhq = strchr(iline+10, '"'); char *rhq = strrchr(iline+10, '"'); if((lhq) && (rhq) && (lhq != rhq)) /* no real need to check rhq != NULL*/ { *rhq = 0; if(*dumpfile) free_2(*dumpfile); *dumpfile = strdup_2(lhq + 1); } } else if(!strncmp(iline, "[dumpfile_mtime]", 16)) { if(dumptim) { struct tm tm; time_t t; char *lhq = strchr(iline+16, '"'); char *rhq = strrchr(iline+16, '"'); memset(&tm, 0, sizeof(struct tm)); *dumptim = -1; #if !defined _MSC_VER && !defined __MINGW32__ /* format is: "Fri Feb 4 15:50:48 2011" */ if(lhq && rhq && (lhq != rhq)) { int slen; char *strp_buf; *rhq = 0; slen = strlen(lhq+1); strp_buf = calloc_2(1, slen + 32); /* workaround: linux strptime seems to overshoot its buffer */ strcpy(strp_buf, lhq+1); if(strptime(strp_buf, "%a %b %d %H:%M:%S %Y", &tm) != NULL) { t = timegm(&tm); if(t != -1) { *dumptim = t; } } free_2(strp_buf); } #endif } } else if(!strncmp(iline, "[dumpfile_size]", 15)) { if(dumpsiz) { *dumpsiz = atoi_64(iline+15); } } else if(!strncmp(iline, "[savefile]", 10)) { char *lhq = strchr(iline+10, '"'); char *rhq = strrchr(iline+10, '"'); if((lhq) && (rhq) && (lhq != rhq)) /* no real need to check rhq != NULL*/ { *rhq = 0; if(*savefile) free_2(*savefile); *savefile = strdup_2(lhq + 1); } } else if(!strncmp(iline, "[optimize_vcd]", 14)) { if(opt_vcd) { *opt_vcd = 1; } } free_2(iline); rc++; } if(wave_is_compressed) pclose(wave); else fclose(wave); return(rc); } read_save_helper_relative_init(wname); WAVE_STRACE_ITERATOR(s_ctx_iter) { GLOBALS->strace_ctx = &GLOBALS->strace_windows[GLOBALS->strace_current_window = s_ctx_iter]; GLOBALS->strace_ctx->shadow_encountered_parsewavline = 0; } if(GLOBALS->traces.total) { GLOBALS->group_depth=0; /* AddBlankTrace(NULL); in order to terminate any possible collapsed groups */ } if(GLOBALS->is_lx2) { while((iline=fgetmalloc(wave))) { parsewavline_lx2(iline, NULL, 0); free_2(iline); } lx2_import_masked(); if(wave_is_compressed) { pclose(wave); wave=popen(str,"r"); } else { fclose(wave); wave=fopen(wname,"rb"); } if(!wave) { fprintf(stderr, "Error opening save file '%s' for reading.\n", wname); perror("Why"); errno=0; return(rc); } } GLOBALS->default_flags=TR_RJUSTIFY; GLOBALS->default_fpshift=0; GLOBALS->shift_timebase_default_for_add=LLDescriptor(0); GLOBALS->strace_current_window = 0; /* in case there are shadow traces */ rc = 0; GLOBALS->which_t_color = 0; while((iline=fgetmalloc(wave))) { parsewavline(iline, NULL, 0); GLOBALS->strace_ctx->shadow_encountered_parsewavline |= GLOBALS->strace_ctx->shadow_active; free_2(iline); rc++; } GLOBALS->which_t_color = 0; WAVE_STRACE_ITERATOR(s_ctx_iter) { GLOBALS->strace_ctx = &GLOBALS->strace_windows[GLOBALS->strace_current_window = s_ctx_iter]; if(GLOBALS->strace_ctx->shadow_encountered_parsewavline) { GLOBALS->strace_ctx->shadow_encountered_parsewavline = 0; if(GLOBALS->strace_ctx->shadow_straces) { GLOBALS->strace_ctx->shadow_active = 1; swap_strace_contexts(); strace_maketimetrace(1); swap_strace_contexts(); GLOBALS->strace_ctx->shadow_active = 0; } } } GLOBALS->default_flags=TR_RJUSTIFY; GLOBALS->default_fpshift=0; GLOBALS->shift_timebase_default_for_add=LLDescriptor(0); update_markertime(GLOBALS->tims.marker); if(wave_is_compressed) pclose(wave); else fclose(wave); if(traces_already_exist) GLOBALS->timestart_from_savefile_valid = 0; EnsureGroupsMatch(); GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); #ifdef MAC_INTEGRATION if(GLOBALS->num_notebook_pages > 1) #endif { if(!GLOBALS->block_xy_update) { int x, y; get_window_size(&x, &y); set_window_size(x, y); } } } GLOBALS->current_translate_file = 0; return(rc); } /******************************************************************/ /* * attempt to synthesize bitwise on loader fail...caller must free return pnt */ static char *synth_blastvec(char *w) { char *mem = NULL; char *t; char *lbrack, *colon, *rbrack, *rname, *msbs, *lsbs; int wlen, bitlen, msb, lsb; int msbslen, lsbslen, maxnumlen; int i, siz; if(w) { if((lbrack = strrchr(w, '['))) if((colon = strchr(lbrack+1, ':'))) if((rbrack = strchr(colon+1, ']'))) { *lbrack = *colon = *rbrack = 0; msbs = lbrack + 1; lsbs = colon + 1; rname = hier_extract(w, GLOBALS->hier_max_level); msb = atoi(msbs); lsb = atoi(lsbs); bitlen = (msb > lsb) ? (msb - lsb + 1) : (lsb - msb + 1); if(bitlen > 1) { wlen = strlen(w); msbslen = strlen(msbs); lsbslen = strlen(lsbs); maxnumlen = (msbslen > lsbslen) ? msbslen : lsbslen; siz = 1 + /* # */ strlen(rname) + /* vector alias name */ 1+ /* */ 1+ /* [ */ msbslen+ /* msb */ 1+ /* : */ lsbslen+ /* lsb */ 1+ /* ] */ 1; /* */ siz += bitlen * ( wlen + /* full bitname */ 1+ /* [ */ maxnumlen+ /* individual bit */ 1+ /* ] */ 1 /* */ ); mem = calloc_2(1, siz); t = mem + sprintf(mem, "#%s[%d:%d] ", rname, msb, lsb); if(msb > lsb) { for(i = msb; i >= lsb; i--) { t += sprintf(t, "%s[%d]", w, i); if(i!=lsb) t += sprintf(t, " "); } } else { for(i = msb; i <= lsb; i++) { t += sprintf(t, "%s[%d]", w, i); if(i!=lsb) t += sprintf(t, " "); } } /* fprintf(stderr, "%d,%d: %s\n", siz, strlen(mem), mem); */ } } } return(mem); } /******************************************************************/ /* * Parse a line of the wave file and act accordingly.. * Returns nonzero if trace(s) added. */ int parsewavline(char *w, char *alias, int depth) { int i; int len; char *w2; nptr nexp; unsigned int rows = 0; char *prefix, *suffix, *new; char *prefix_init, *w2_init; unsigned int mode; if(!(len=strlen(w))) return(0); if(*(w+len-1)=='\n') { *(w+len-1)=0x00; /* strip newline if present */ len--; if(!len) return(0); } while(1) { if(isspace((int)(unsigned char)*w)) { w++; continue; } if(!(*w)) return(0); /* no args */ break; /* start grabbing chars from here */ } w2=w; /* sscanf(w2,"%s",prefix); */ prefix=(char *)wave_alloca(len+1); suffix=(char *)wave_alloca(len+1); new=(char *)wave_alloca(len+1); memset(new, 0, len+1); /* scan-build */ prefix_init = prefix; w2_init = new; mode = 0; /* 0 = before "{", 1 = after "{", 2 = after "}" or " " */ while(*w2) { if((mode == 0) && (*w2 == '{')) { mode = 1; w2++; } else if((mode == 1) && (*w2 == '}')) { /* strcpy(prefix, ""); */ *(prefix) = '\0'; mode = 2; w2++; } else if((mode == 0) && (*w2 == ' ')) { /* strcpy(prefix, ""); */ *(prefix) = '\0'; strcpy(new, w2); mode = 2; w2++; new++; } else { strcpy(new, w2); if (mode != 2) { strcpy(prefix, w2); prefix++; } w2++; new++; } } prefix = prefix_init; w2 = w2_init; /* printf("HHHHH |%s| %s\n", prefix, w2); */ if(*w2=='*') { float f; TimeType ttlocal; int which=0; GLOBALS->zoom_was_explicitly_set=~0; w2++; for(;;) { while(*w2==' ') w2++; if(*w2==0) return(~0); if(!which) { sscanf(w2,"%f",&f); if((!GLOBALS->do_initial_zoom_fit)||(!GLOBALS->do_initial_zoom_fit_used)) { GLOBALS->tims.zoom=(gdouble)f; } } else { sscanf(w2,TTFormat,&ttlocal); switch(which) { case 1: GLOBALS->tims.marker=ttlocal; break; default: if((which-2)named_markers[which-2]=ttlocal; break; } } which++; w2++; for(;;) { if(*w2==0) return(~0); if(*w2=='\n') return(~0); if(*w2!=' ') w2++; else break; } } } else if(*w2=='-') { AddBlankTrace((*(w2+1)!=0)?(w2+1):NULL); } else if(*w2=='>') { char *wnptr=(*(w2+1)!=0)?(w2+1):NULL; GLOBALS->shift_timebase_default_for_add=wnptr?atoi_64(wnptr):LLDescriptor(0); } else if(*w2=='@') { /* handle trace flags */ sscanf(w2+1, "%x", &GLOBALS->default_flags); if( (GLOBALS->default_flags & (TR_FTRANSLATED|TR_PTRANSLATED)) == (TR_FTRANSLATED|TR_PTRANSLATED) ) { GLOBALS->default_flags &= ~TR_PTRANSLATED; /* safest bet though this is a cfg file error */ } return(~0); } else if(*w2=='+') { /* handle aliasing */ struct symbol *s; sscanf(w2+strlen(prefix),"%s",suffix); if(suffix[0]=='(') { for(i=1;;i++) { if(suffix[i]==0) return(0); if((suffix[i]==')')&&(suffix[i+1])) {i++; break; } } s=symfind(suffix+i, &rows); if (s) { nexp = ExtractNodeSingleBit(&s->n[rows], atoi(suffix+1)); if(nexp) { AddNode(nexp, prefix+1); return(~0); } else { return(0); } } else { char *lp = strrchr(suffix+i, '['); if(lp) { char *ns = malloc_2(strlen(suffix+i) + 32); char *colon = strchr(lp+1, ':'); int msi, lsi, bval, actual; *lp = 0; bval = atoi(suffix+1); if(colon) { msi = atoi(lp+1); lsi = atoi(colon+1); if(lsi > msi) { actual = msi + bval; } else { actual = msi - bval; } } else { actual = bval; /* punt */ } sprintf(ns, "%s[%d]", suffix+i, actual); *lp = '['; s=symfind(ns, &rows); free_2(ns); if(s) { AddNode(&s->n[rows], prefix+1); return(~0); } } return(0); } } else { int rc; char *newl = strdup_2(w2+strlen(prefix)); char *nalias = strdup_2(prefix+1); rc = parsewavline(newl, nalias, depth); if (newl) free_2(newl); if (nalias) free_2(nalias); return rc; } /* { */ /* if((s=symfind(suffix, &rows))) */ /* { */ /* AddNode(&s->n[rows],prefix+1); */ /* return(~0); */ /* } */ /* else */ /* { */ /* return(0); */ /* } */ /* } */ } else if((*w2=='#')||(*w2==':')) { /* handle bitvec */ bvptr v=NULL; bptr b=NULL; int maketyp = (*w2=='#'); w2=w2+strlen(prefix); while(1) { if(isspace((int)(unsigned char)*w2)) { w2++; continue; } if(!(*w2)) return(0); /* no more args */ break; /* start grabbing chars from here */ } b = maketyp ? makevec(prefix+1,w2) : makevec_annotated(prefix+1,w2); /* '#' vs ':' cases... */ if(b) { if((v=bits2vector(b))) { v->bits=b; /* only needed for savefile function */ AddVector(v, alias); free_2(b->name); b->name=NULL; return(v!=NULL); } else { free_2(b->name); if(b->attribs) free_2(b->attribs); free_2(b); } } else if(!depth) /* don't try vectorized if we're re-entrant */ { char *sp = strchr(w2, ' '); char *lbrack; if(sp) { *sp = 0; lbrack = strrchr(w2, '['); if(lbrack) { /* int made = 0; */ /* scan-build */ char *w3; char *rbrack = strrchr(w2, ']'); char *rightmost_lbrack = strrchr(sp+1, '['); if(rbrack && rightmost_lbrack) { *rbrack = 0; w3 = malloc_2(strlen(w2) + 1 + strlen(rightmost_lbrack+1) + 1); sprintf(w3, "%s:%s", w2, rightmost_lbrack+1); /* made = */ maketraces(w3, alias, 1); /* scan-build */ free_2(w3); } #if 0 /* this is overkill for now with possible delay implications so commented out */ if(!made) { *lbrack = 0; fprintf(stderr, "GTKWAVE | Attempting regex '%s' on missing stranded vector\n", w2); w3 = malloc_2(1 + strlen(w2) + 5); sprintf(w3, "^%s\\[.*", w2); maketraces(w3, alias, 1); free_2(w3); } #endif } } } return(v!=NULL); } else if(*w2=='!') { /* fill logical_mutex */ char ch; for(i=0;i<6;i++) { ch = *(w2+i+1); if(ch != 0) { if(ch=='!') { GLOBALS->strace_ctx->shadow_active = 0; return(~0); } if((!i)&&(GLOBALS->strace_ctx->shadow_straces)) { delete_strace_context(); } GLOBALS->strace_ctx->shadow_logical_mutex[i] = (ch & 1); } else /* in case of short read */ { GLOBALS->strace_ctx->shadow_logical_mutex[i] = 0; } } GLOBALS->strace_ctx->shadow_mark_idx_start = 0; GLOBALS->strace_ctx->shadow_mark_idx_end = 0; if(i==6) { ch = *(w2+7); if(ch != 0) { if (isupper((int)(unsigned char)ch) || ch=='@') GLOBALS->strace_ctx->shadow_mark_idx_start = ch - '@'; ch = *(w2+8); if(ch != 0) { if (isupper((int)(unsigned char)ch) || ch=='@') GLOBALS->strace_ctx->shadow_mark_idx_end = ch - '@'; } } } GLOBALS->strace_ctx->shadow_active = 1; return(~0); } else if(*w2=='?') { /* fill st->type */ if(*(w2+1)=='\"') { int lens = strlen(w2+2); if(GLOBALS->strace_ctx->shadow_string) free_2(GLOBALS->strace_ctx->shadow_string); GLOBALS->strace_ctx->shadow_string=NULL; if(lens) { GLOBALS->strace_ctx->shadow_string = malloc_2(lens+1); strcpy(GLOBALS->strace_ctx->shadow_string, w2+2); } GLOBALS->strace_ctx->shadow_type = ST_STRING; } else { unsigned int hex; sscanf(w2+1, "%x", &hex); GLOBALS->strace_ctx->shadow_type = hex; } return(~0); } else if(*w2=='^') { if(*(w2+1) == '>') { GLOBALS->current_translate_proc = 0; /* will overwrite if loadable/translatable */ if(*(w2+2) != '0') { /* char *fn = strstr(w2+3, " "); */ char *fn = w2+2; while(*fn && !isspace((int)(unsigned char)*fn)) fn++; if(fn) { while(*fn && isspace((int)(unsigned char)*fn)) fn++; if(*fn && !isspace((int)(unsigned char)*fn)) { char *rp = get_relative_adjusted_name(GLOBALS->sfn, fn, GLOBALS->lcname); set_current_translate_proc(rp ? rp : fn); if(rp) free_2(rp); } } } } else if(*(w2+1) == '<') { GLOBALS->current_translate_ttrans = 0; /* will overwrite if loadable/translatable */ if(*(w2+2) != '0') { /* char *fn = strstr(w2+3, " "); */ char *fn = w2+3; if(fn) { while(*fn && isspace((int)(unsigned char)*fn)) fn++; if(*fn && !isspace((int)(unsigned char)*fn)) { char *rp = get_relative_adjusted_name(GLOBALS->sfn, fn, GLOBALS->lcname); set_current_translate_ttrans(rp ? rp : fn); if(rp) free_2(rp); } } } } else { GLOBALS->current_translate_file = 0; /* will overwrite if loadable/translatable */ if(*(w2+1) != '0') { char *fn = strstr(w2+2, " "); if(fn) { while(*fn && isspace((int)(unsigned char)*fn)) fn++; if(*fn && !isspace((int)(unsigned char)*fn)) { char *rp = get_relative_adjusted_name(GLOBALS->sfn, fn, GLOBALS->lcname); set_current_translate_file(rp ? rp : fn); if(rp) free_2(rp); } } } } } else if (*w2 == '[') { /* Search for matching ']'. */ w2++; for (w = w2; *w; w++) if (*w == ']') break; if (!*w) return 0; *w++ = 0; if (strcmp (w2, "size") == 0) { if(!GLOBALS->ignore_savefile_size) { /* Main window size. */ int x, y; sscanf (w, "%d %d", &x, &y); if(!GLOBALS->block_xy_update) set_window_size (x, y); } } else if (strcmp (w2, "pos") == 0) { if(!GLOBALS->ignore_savefile_pos) { /* Main window position. */ int x, y; sscanf (w, "%d %d", &x, &y); if(!GLOBALS->block_xy_update) set_window_xypos (x, y); } } else if (strcmp (w2, "sst_width") == 0) { if(!GLOBALS->ignore_savefile_pane_pos) { /* sst vs rhs of window position. */ int x; sscanf (w, "%d", &x); if(!GLOBALS->block_xy_update) { if(GLOBALS->toppanedwindow) { #if GTK_CHECK_VERSION(2,4,0) gtk_paned_set_position(GTK_PANED(GLOBALS->toppanedwindow), x); #endif } else { GLOBALS->toppanedwindow_size_cache = x; } } } } else if (strcmp (w2, "signals_width") == 0) { if(!GLOBALS->ignore_savefile_pane_pos) { /* signals vs waves panes position. */ int x; sscanf (w, "%d", &x); if(!GLOBALS->block_xy_update) { if(GLOBALS->panedwindow) { #if GTK_CHECK_VERSION(2,4,0) gtk_paned_set_position(GTK_PANED(GLOBALS->panedwindow), x); #endif } else { GLOBALS->panedwindow_size_cache = x; } } } } else if (strcmp (w2, "sst_expanded") == 0) { if(!GLOBALS->ignore_savefile_pane_pos) { /* sst is expanded? */ int x; sscanf (w, "%d", &x); GLOBALS->sst_expanded = (x != 0); #if GTK_CHECK_VERSION(2,4,0) if(!GLOBALS->block_xy_update) { if(GLOBALS->expanderwindow) { gtk_expander_set_expanded(GTK_EXPANDER(GLOBALS->expanderwindow), GLOBALS->sst_expanded); } } #endif } } else if (strcmp (w2, "sst_vpaned_height") == 0) { if(!GLOBALS->ignore_savefile_pane_pos) { /* signals vs waves panes position. */ int x; sscanf (w, "%d", &x); if(!GLOBALS->block_xy_update) { if(GLOBALS->sst_vpaned) { #if GTK_CHECK_VERSION(2,4,0) gtk_paned_set_position(GTK_PANED(GLOBALS->sst_vpaned), x); #endif } else { GLOBALS->vpanedwindow_size_cache = x; } } } } else if (strcmp (w2, "color") == 0) { int which_col = 0; sscanf (w, "%d", &which_col); if((which_col>=0)&&(which_col<=WAVE_NUM_RAINBOW)) { GLOBALS->which_t_color = which_col; } else { GLOBALS->which_t_color = 0; } } else if (strcmp (w2, "fpshift_count") == 0) { int fpshift_count = 0; sscanf (w, "%d", &fpshift_count); if((fpshift_count<0)||(fpshift_count>255)) { fpshift_count = 0; } GLOBALS->default_fpshift = fpshift_count; } else if (strcmp (w2, "pattern_trace") == 0) { int which_ctx = 0; sscanf (w, "%d", &which_ctx); if((which_ctx>=0)&&(which_ctxstrace_ctx = &GLOBALS->strace_windows[GLOBALS->strace_current_window = which_ctx]; } } else if (strcmp (w2, "ruler") == 0) { GLOBALS->ruler_origin = GLOBALS->ruler_step = LLDescriptor(0); sscanf(w, TTFormat" "TTFormat, &GLOBALS->ruler_origin, &GLOBALS->ruler_step); } else if (strcmp (w2, "timestart") == 0) { sscanf(w, TTFormat, &GLOBALS->timestart_from_savefile); GLOBALS->timestart_from_savefile_valid = 1; } #if WAVE_USE_GTK2 else if (strcmp (w2, "treeopen") == 0) { while(*w) { if(!isspace((int)(unsigned char)*w)) { break; } w++; } if(GLOBALS->ctree_main) { force_open_tree_node(w, 0, NULL); } else { /* cache values until ctree_main is created */ struct string_chain_t *t = calloc_2(1, sizeof(struct string_chain_t)); t->str = strdup_2(w); if(!GLOBALS->treeopen_chain_curr) { GLOBALS->treeopen_chain_head = GLOBALS->treeopen_chain_curr = t; } else { GLOBALS->treeopen_chain_curr->next = t; GLOBALS->treeopen_chain_curr = t; } } } #endif else if (strcmp (w2, "markername") == 0) { char *pnt = w; int which; if((*pnt) && (isspace((int)(unsigned char)*pnt))) pnt++; if(*pnt) { which = (*pnt) - 'A'; if((which >=0) && (which < WAVE_NUM_NAMED_MARKERS)) { pnt++; if(*pnt) { if(GLOBALS->marker_names[which]) free_2(GLOBALS->marker_names[which]); GLOBALS->marker_names[which] = strdup_2(pnt); } } } } else if (strcmp (w2, "markername_long") == 0) { char *pnt = w; int which; if((*pnt) && (isspace((int)(unsigned char)*pnt))) pnt++; if(*pnt) { char *pnt2 = strchr(pnt, ' '); if(pnt2) { *pnt2 = 0; which = bijective_marker_id_string_hash(pnt); if((which >=0) && (which < WAVE_NUM_NAMED_MARKERS)) { pnt = pnt2 + 1; if((*pnt) && (isspace((int)(unsigned char)*pnt))) pnt++; if(*pnt) { if(GLOBALS->marker_names[which]) free_2(GLOBALS->marker_names[which]); GLOBALS->marker_names[which] = strdup_2(pnt); } } } } } else if (strcmp (w2, "dumpfile") == 0) { /* nothing here currently...only finder/DnD processes these externally */ } else if (strcmp (w2, "savefile") == 0) { /* store name for relative name processing of filters */ char *lhq = strchr(w, '"'); char *rhq = strrchr(w, '"'); if(GLOBALS->sfn) { free_2(GLOBALS->sfn); GLOBALS->sfn = NULL; } if((lhq) && (rhq) && (lhq != rhq)) /* no real need to check rhq != NULL*/ { *rhq = 0; GLOBALS->sfn = strdup_2(lhq + 1); } } else if (strcmp (w2, "transaction_args") == 0) { char *lhq = strchr(w, '"'); char *rhq = strrchr(w, '"'); if(GLOBALS->ttranslate_args) { free_2(GLOBALS->ttranslate_args); GLOBALS->ttranslate_args = NULL; } if((lhq) && (rhq) && (lhq != rhq)) /* no real need to check rhq != NULL*/ { *rhq = 0; GLOBALS->ttranslate_args = strdup_2(lhq + 1); } } else if (strcmp (w2, "*") == 0) { /* reserved for [*] comment lines */ } else { /* Unknown attribute. Forget it. */ return 0; } } else { int rc = maketraces(w, alias, 0); if(rc) { return(rc); } else { char *newl = synth_blastvec(w); if(newl) { rc = parsewavline(newl, alias, depth+1); free_2(newl); } /* prevent malformed group openings [missing group opening] from keeping other signals from displaying */ if((!rc)&&(GLOBALS->default_flags&TR_GRP_BEGIN)) { AddBlankTrace(w); rc = ~0; } return(rc); } } return(0); } /******************************************************************/ /****************/ /* LX2 variants */ /****************/ /* * Make solitary traces from wildcarded signals... */ int maketraces_lx2(char *str, char *alias, int quick_return) { (void)alias; char *pnt, *wild; char ch, wild_active=0; int len; int i; int made = 0; pnt=str; while((ch=*pnt)) { if(ch=='*') { wild_active=1; break; } pnt++; } if(!wild_active) /* short circuit wildcard evaluation with bsearch */ { struct symbol *s; if(str[0]=='(') { for(i=1;;i++) { if(str[i]==0) return(0); if((str[i]==')')&&(str[i+1])) {i++; break; } } if((s=symfind(str+i, NULL))) { lx2_set_fac_process_mask(s->n); made = ~0; } return(made); } else { if((s=symfind(str, NULL))) { lx2_set_fac_process_mask(s->n); made = ~0; } return(made); } } while(1) { pnt=str; len=0; while(1) { ch=*pnt++; if(isspace((int)(unsigned char)ch)||(!ch)) break; len++; } if(len) { wild=(char *)calloc_2(1,len+1); memcpy(wild,str,len); wave_regex_compile(wild, WAVE_REGEX_WILD); for(i=0;inumfacs;i++) { if(wave_regex_match(GLOBALS->facs[i]->name, WAVE_REGEX_WILD)) { lx2_set_fac_process_mask(GLOBALS->facs[i]->n); made = ~0; if(quick_return) break; } } free_2(wild); } if(!ch) break; str=pnt; } return(made); } /* * Create a vector from wildcarded signals... */ int makevec_lx2(char *str) { char *pnt, *pnt2, *wild=NULL; char ch, ch2, wild_active; int len; int i; int rc = 0; while(1) { pnt=str; len=0; while(1) { ch=*pnt++; if(isspace((int)(unsigned char)ch)||(!ch)) break; len++; } if(len) { wild=(char *)calloc_2(1,len+1); memcpy(wild,str,len); DEBUG(printf("WILD: %s\n",wild)); wild_active=0; pnt2=wild; while((ch2=*pnt2)) { if(ch2=='*') { wild_active=1; break; } pnt2++; } if(!wild_active) /* short circuit wildcard evaluation with bsearch */ { struct symbol *s; if(wild[0]=='(') { for(i=1;;i++) { if(wild[i]==0) break; if((wild[i]==')')&&(wild[i+1])) { i++; s=symfind(wild+i, NULL); if(s) { lx2_set_fac_process_mask(s->n); rc = 1; } break; } } } else { if((s=symfind(wild, NULL))) { lx2_set_fac_process_mask(s->n); rc = 1; } } } else { wave_regex_compile(wild, WAVE_REGEX_WILD); for(i=GLOBALS->numfacs-1;i>=0;i--) /* to keep vectors in little endian hi..lo order */ { if(wave_regex_match(GLOBALS->facs[i]->name, WAVE_REGEX_WILD)) { lx2_set_fac_process_mask(GLOBALS->facs[i]->n); rc = 1; } } } free_2(wild); } if(!ch) break; str=pnt; } return(rc); } /* * Parse a line of the wave file and act accordingly.. * Returns nonzero if trace(s) added. */ int parsewavline_lx2(char *w, char *alias, int depth) { int made = 0; int i; int len; char *w2; char *prefix, *suffix, *new; char *prefix_init, *w2_init; unsigned int mode; if(!(len=strlen(w))) return(0); if(*(w+len-1)=='\n') { *(w+len-1)=0x00; /* strip newline if present */ len--; if(!len) return(0); } while(1) { if(isspace((int)(unsigned char)*w)) { w++; continue; } if(!(*w)) return(0); /* no args */ break; /* start grabbing chars from here */ } w2=w; /* sscanf(w2,"%s",prefix); */ prefix=(char *)wave_alloca(len+1); suffix=(char *)wave_alloca(len+1); new=(char *)wave_alloca(len+1); new[0] = 0; /* scan-build : in case there are weird mode problems */ prefix_init = prefix; w2_init = new; mode = 0; /* 0 = before "{", 1 = after "{", 2 = after "}" or " " */ while(*w2) { if((mode == 0) && (*w2 == '{')) { mode = 1; w2++; } else if((mode == 1) && (*w2 == '}')) { *(prefix) = '\0'; mode = 2; w2++; } else if((mode == 0) && (*w2 == ' ')) { *(prefix) = '\0'; strcpy(new, w2); mode = 2; w2++; new++; } else { strcpy(new, w2); if (mode != 2) { strcpy(prefix, w2); prefix++; } w2++; new++; } } prefix = prefix_init; w2 = w2_init; /* printf("IIIII |%s| %s\n", prefix, w2); */ if(*w2=='[') { } else if(*w2=='*') { } else if(*w2=='-') { } else if(*w2=='>') { } else if(*w2=='@') { } else if(*w2=='+') { /* handle aliasing */ struct symbol *s; sscanf(w2+strlen(prefix),"%s",suffix); if(suffix[0]=='(') { for(i=1;;i++) { if(suffix[i]==0) return(0); if((suffix[i]==')')&&(suffix[i+1])) {i++; break; } } s=symfind(suffix+i, NULL); if(s) { lx2_set_fac_process_mask(s->n); made = ~0; } else { char *lp = strrchr(suffix+i, '['); if(lp) { char *ns = malloc_2(strlen(suffix+i) + 32); char *colon = strchr(lp+1, ':'); int msi, lsi, bval, actual; *lp = 0; bval = atoi(suffix+1); if(colon) { msi = atoi(lp+1); lsi = atoi(colon+1); if(lsi > msi) { actual = msi + bval; } else { actual = msi - bval; } } else { actual = bval; /* punt */ } sprintf(ns, "%s[%d]", suffix+i, actual); *lp = '['; s=symfind(ns, NULL); free_2(ns); if(s) { lx2_set_fac_process_mask(s->n); made = ~0; } } } return(made); } else { int rc; char *newl = strdup_2(w2+strlen(prefix)); char *nalias = strdup_2(prefix+1); rc = parsewavline_lx2(newl, nalias, depth); if (newl) free_2(newl); if (nalias) free_2(nalias); return rc; } /* { */ /* if((s=symfind(suffix, NULL))) */ /* { */ /* lx2_set_fac_process_mask(s->n); */ /* made = ~0; */ /* } */ /* return(made); */ /* } */ } else if((*w2=='#')||(*w2==':')) { int rc; /* handle bitvec, parsing extra time info and such is inefficient but ok for ":" case */ w2=w2+strlen(prefix); while(1) { if(isspace((int)(unsigned char)*w2)) { w2++; continue; } if(!(*w2)) return(0); /* no more args */ break; /* start grabbing chars from here */ } rc = makevec_lx2(w2); if((!rc)&&(!depth)) /* don't try vectorized if we're re-entrant */ { char *sp = strchr(w2, ' '); char *lbrack; if(sp) { *sp = 0; lbrack = strrchr(w2, '['); if(lbrack) { char *w3; char *rbrack = strrchr(w2, ']'); char *rightmost_lbrack = strrchr(sp+1, '['); if(rbrack && rightmost_lbrack) { *rbrack = 0; w3 = malloc_2(strlen(w2) + 1 + strlen(rightmost_lbrack+1) + 1); sprintf(w3, "%s:%s", w2, rightmost_lbrack+1); made = maketraces_lx2(w3, alias, 1); free_2(w3); } if(0) /* this is overkill for now with possible delay implications so commented out */ if(!made) { *lbrack = 0; w3 = malloc_2(1 + strlen(w2) + 5); sprintf(w3, "^%s\\[.*", w2); maketraces_lx2(w3, alias, 1); free_2(w3); } } } } return(made); } else if(*w2=='!') { } else if(*w2=='?') { } else if(*w2=='^') { } else { made = maketraces_lx2(w, alias, 0); if(!made) { char *newl = synth_blastvec(w); if(newl) { made = parsewavline_lx2(newl, alias, depth+1); free_2(newl); } } } return(made); } /******************************************************************/ /* GetRelativeFilename(), by Rob Fisher. * rfisher@iee.org * http://come.to/robfisher */ #define MAX_FILENAME_LEN PATH_MAX /* The number of characters at the start of an absolute filename. e.g. in DOS, * absolute filenames start with "X:\" so this value should be 3, in UNIX they start * with "\" so this value should be 1. */ #if defined _MSC_VER || defined __MINGW32__ #define ABSOLUTE_NAME_START 3 #else #define ABSOLUTE_NAME_START 1 #endif /* set this to '\\' for DOS or '/' for UNIX */ #if defined _MSC_VER || defined __MINGW32__ #define SLASH '\\' #else #define SLASH '/' #endif /* Given the absolute current directory and an absolute file name, returns a relative file name. * For example, if the current directory is C:\foo\bar and the filename C:\foo\whee\text.txt is given, * GetRelativeFilename will return ..\whee\text.txt. */ char* GetRelativeFilename(char *currentDirectory, char *absoluteFilename, int *dotdot_levels) { int afMarker = 0, rfMarker = 0; int cdLen = 0, afLen = 0; int i = 0; int levels = 0; static char relativeFilename[MAX_FILENAME_LEN+1]; *dotdot_levels = 0; cdLen = strlen(currentDirectory); afLen = strlen(absoluteFilename); /* make sure the names are not too long or too short */ if(cdLen > MAX_FILENAME_LEN || cdLen < ABSOLUTE_NAME_START+1 || afLen > MAX_FILENAME_LEN || afLen < ABSOLUTE_NAME_START+1) { return(NULL); } /* Handle DOS names that are on different drives: */ if(currentDirectory[0] != absoluteFilename[0]) { /* not on the same drive, so only absolute filename will do */ strcpy(relativeFilename, absoluteFilename); return(relativeFilename); } /* they are on the same drive, find out how much of the current directory * is in the absolute filename */ i = ABSOLUTE_NAME_START; while(i < afLen && i < cdLen && currentDirectory[i] == absoluteFilename[i]) { i++; } if(i == cdLen && (absoluteFilename[i] == SLASH || absoluteFilename[i-1] == SLASH)) { /* the whole current directory name is in the file name, * so we just trim off the current directory name to get the * current file name. */ if(absoluteFilename[i] == SLASH) { /* a directory name might have a trailing slash but a relative * file name should not have a leading one... */ i++; } strcpy(relativeFilename, &absoluteFilename[i]); return(relativeFilename); } /* The file is not in a child directory of the current directory, so we * need to step back the appropriate number of parent directories by * using "..\"s. First find out how many levels deeper we are than the * common directory */ afMarker = i; levels = 1; /* count the number of directory levels we have to go up to get to the * common directory */ while(i < cdLen) { i++; if(currentDirectory[i] == SLASH) { /* make sure it's not a trailing slash */ i++; if(currentDirectory[i] != '\0') { levels++; } } } /* move the absolute filename marker back to the start of the directory name * that it has stopped in. */ while(afMarker > 0 && absoluteFilename[afMarker-1] != SLASH) { afMarker--; } /* check that the result will not be too long */ if(levels * 3 + afLen - afMarker > MAX_FILENAME_LEN) { return(NULL); } /* add the appropriate number of "..\"s. */ rfMarker = 0; *dotdot_levels = levels; for(i = 0; i < levels; i++) { relativeFilename[rfMarker++] = '.'; relativeFilename[rfMarker++] = '.'; relativeFilename[rfMarker++] = SLASH; } /* copy the rest of the filename into the result string */ strcpy(&relativeFilename[rfMarker], &absoluteFilename[afMarker]); return(relativeFilename); } /******************************************************************/ #ifdef __MINGW32__ static void find_dumpfile_scrub_slashes(char *s) { if(s) { while(*s) { if(*s == '/') *s = '\\'; s++; } } } #else static void find_dumpfile_scrub_slashes(char *s) { if(s) { if(s[0] && s[1] && s[2] && (s[1] == ':') && (s[2] == '\\')) { while(*s) { if(*s == '\\') *s = '/'; s++; } } } } #endif char *find_dumpfile(char *orig_save, char *orig_dump, char *this_save) { char *synth_nam = NULL; if(orig_save && orig_dump && this_save) { char *dup_orig_save; char *rhs_orig_save_slash; char *grf = NULL; int dotdot_levels = 0; find_dumpfile_scrub_slashes(orig_save); find_dumpfile_scrub_slashes(orig_dump); find_dumpfile_scrub_slashes(this_save); dup_orig_save = strdup_2(orig_save); rhs_orig_save_slash = strrchr(dup_orig_save, SLASH); if(rhs_orig_save_slash) { *rhs_orig_save_slash = 0; grf =GetRelativeFilename(dup_orig_save, orig_dump, &dotdot_levels); if(grf) { char *dup_this_save = strdup_2(this_save); char *rhs_this_save_slash = strrchr(dup_this_save, SLASH); char *p = dup_this_save; int levels = 0; if(rhs_this_save_slash) { *(rhs_this_save_slash+1) = 0; while(*p) { if(*p == SLASH) levels++; p++; } if(levels > dotdot_levels) /* > because we left the ending slash on dup_this_save */ { synth_nam = malloc_2(strlen(dup_this_save) + strlen(grf) + 1); strcpy(synth_nam, dup_this_save); strcat(synth_nam, grf); } } free_2(dup_this_save); } } free_2(dup_orig_save); } return(synth_nam); } /******************************************************************/ /* * deliberately kept outside of GLOBALS control */ struct finder_file_chain { struct finder_file_chain *next; unsigned queue_warning_presented : 1; unsigned save_file_only : 1; char *name; }; static struct finder_file_chain *finder_name_integration = NULL; /* * called in timer routine */ gboolean process_finder_names_queued(void) { return(finder_name_integration != NULL); } char *process_finder_extract_queued_name(void) { struct finder_file_chain *lc = finder_name_integration; while(lc) { if(!lc->queue_warning_presented) { lc->queue_warning_presented = 1; return(lc->name); } lc = lc->next; } return(NULL); } gboolean process_finder_name_integration(void) { static int is_working = 0; struct finder_file_chain *lc = finder_name_integration; struct finder_file_chain *lc_next; if(lc && !is_working) { is_working = 1; finder_name_integration = NULL; /* placed here to avoid race conditions with GLOBALS */ while(lc) { char *lcname = lc->name; int try_to_load_file = 1; int reload_save_file = 0; char *dfn = NULL; char *sfn = NULL; char *fdf = NULL; FILE *f; off_t dumpsiz = -1; time_t dumptim = -1; int optimize_vcd = 0; if ((suffix_check(lcname, ".sav")) || (suffix_check(lcname, ".gtkw"))) { reload_save_file = 1; try_to_load_file = 0; if(!lc->save_file_only) { read_save_helper(lcname, &dfn, &sfn, &dumpsiz, &dumptim, &optimize_vcd); if(dfn) { char *old_dfn = dfn; dfn = wave_alloca(strlen(dfn)+1); /* as context can change on file load */ strcpy(dfn, old_dfn); free_2(old_dfn); } if(sfn) { char *old_sfn = sfn; sfn = wave_alloca(strlen(sfn)+1); /* as context can change on file load */ strcpy(sfn, old_sfn); free_2(old_sfn); } #if defined __USE_BSD || defined __USE_XOPEN_EXTENDED || defined __CYGWIN__ || defined HAVE_REALPATH if(dfn && sfn) { char *can = realpath_2(lcname, NULL); char *old_fdf = find_dumpfile(sfn, dfn, can); free(can); fdf = wave_alloca(strlen(old_fdf)+1); strcpy(fdf, old_fdf); free_2(old_fdf); f = fopen(fdf, "rb"); if(f) { fclose(f); lcname = fdf; try_to_load_file = 1; } } #endif if(dfn && !try_to_load_file) { f = fopen(dfn, "rb"); if(f) { fclose(f); lcname = dfn; try_to_load_file = 1; } } } } if(try_to_load_file) { int plen = strlen(lcname); char *fni = wave_alloca(plen + 32); /* extra space for message */ sprintf(fni, "Loading %s...", lcname); wave_gtk_window_set_title(GTK_WINDOW(GLOBALS->mainwindow), fni, GLOBALS->dumpfile_is_modified ? WAVE_SET_TITLE_MODIFIED: WAVE_SET_TITLE_NONE, 0); strcpy(fni, lcname); if(!menu_new_viewer_tab_cleanup_2(fni, optimize_vcd)) { } else { GLOBALS->dumpfile_is_modified = 0; #ifdef HAVE_SYS_STAT_H if((dumpsiz != -1) && (dumptim != -1)) { struct stat sbuf; if(!stat(fni, &sbuf)) { GLOBALS->dumpfile_is_modified = (dumpsiz != sbuf.st_size) || (dumptim != sbuf.st_mtime); } } #endif } wave_gtk_window_set_title(GTK_WINDOW(GLOBALS->mainwindow), GLOBALS->winname, GLOBALS->dumpfile_is_modified ? WAVE_SET_TITLE_MODIFIED: WAVE_SET_TITLE_NONE, 0); } /* now do save file... */ if(reload_save_file) { /* let any possible dealloc get taken up by free_outstanding() */ GLOBALS->filesel_writesave = strdup_2(lc->name); read_save_helper(GLOBALS->filesel_writesave, NULL, NULL, NULL, NULL, NULL); wave_gconf_client_set_string("/current/savefile", GLOBALS->filesel_writesave); } lc_next = lc->next; g_free(lc->name); g_free(lc); lc = lc_next; } is_working = 0; return(TRUE); } return(FALSE); } /******************************************************************/ /* * Integration with Finder... * cache name and load in later off a timer (similar to caching DnD for quartz...) */ gboolean deal_with_rpc_open_2(const gchar *path, gpointer user_data, gboolean is_save_file_only) { (void)user_data; const char *suffixes[] = { ".vcd", ".evcd", ".dump", ".lxt", ".lxt2", ".lx2", ".vzt", ".fst", ".ghw", #ifdef EXTLOAD_SUFFIX EXTLOAD_SUFFIX, #endif #ifdef AET2_IS_PRESENT ".aet", ".ae2", #endif ".gtkw", ".sav" }; const int num_suffixes = sizeof(suffixes) / sizeof(const char *); int i, mat = 0; for(i=0;iname = g_strdup(path); p->queue_warning_presented = 0; p->save_file_only = 1; p->next = finder_name_integration; finder_name_integration = p; } else { if(!finder_name_integration) { finder_name_integration = g_malloc(sizeof(struct finder_file_chain)); finder_name_integration->name = g_strdup(path); finder_name_integration->queue_warning_presented = 0; finder_name_integration->save_file_only = 0; finder_name_integration->next = NULL; } else { struct finder_file_chain *p = finder_name_integration; while(p->next) p = p->next; p->next = g_malloc(sizeof(struct finder_file_chain)); p->next->queue_warning_presented = 0; p->next->save_file_only = 0; p->next->name = g_strdup(path); p->next->next = NULL; } } return(TRUE); } gboolean deal_with_rpc_open(const gchar *path, gpointer user_data) { return(deal_with_rpc_open_2(path, user_data, FALSE)); } #ifdef MAC_INTEGRATION /* * block termination if in the middle of something important */ gboolean deal_with_termination(GtkosxApplication *app, gpointer user_data) { (void)app; (void)user_data; gboolean do_not_terminate = FALSE; /* future expansion */ if(do_not_terminate) { status_text("GTKWAVE | Busy, quit signal blocked.\n"); } return(do_not_terminate); } /* * Integration with Finder... * cache name and load in later off a timer (similar to caching DnD for quartz...) */ gboolean deal_with_finder_open(GtkosxApplication *app, gchar *path, gpointer user_data) { (void)app; return(deal_with_rpc_open(path, user_data)); } #endif int suffix_check(const char *s, const char *sfx) { unsigned int sfxlen = strlen(sfx); return((strlen(s)>=sfxlen)&&(!strcasecmp(s+strlen(s)-sfxlen,sfx))); } gtkwave-3.3.86/src/gnu-getopt.h0000664000175000017500000001436113166335473015642 0ustar bybellbybell/* Declarations for getopt. Copyright (C) 1989-1994, 1996-1999, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street - Suite 500, Boston, MA 02110-1335, USA */ #ifndef _GETOPT_H #ifndef __need_getopt # define _GETOPT_H 1 #endif /* If __GNU_LIBRARY__ is not already defined, either we are being used standalone, or this is the first header included in the source file. If we are being used with glibc, we need to include , but that does not exist if we are standalone. So: if __GNU_LIBRARY__ is not defined, include , which will pull in for us if it's from glibc. (Why ctype.h? It's guaranteed to exist and it doesn't flood the namespace with stuff the way some other headers do.) */ #if !defined __GNU_LIBRARY__ # include #endif #ifdef __cplusplus extern "C" { #endif /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ /* Callers store zero here to inhibit the error message `getopt' prints for unrecognized options. */ /* Set to an option character which was unrecognized. */ #ifndef __need_getopt /* Describe the long-named options requested by the application. The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector of `struct option' terminated by an element containing a name which is zero. The field `has_arg' is: no_argument (or 0) if the option does not take an argument, required_argument (or 1) if the option requires an argument, optional_argument (or 2) if the option takes an optional argument. If the field `flag' is not NULL, it points to a variable that is set to the value given in the field `val' when the option is found, but left unchanged if the option is not found. To have a long-named option do something other than set an `int' to a compiled-in constant, such as set a value from `optarg', set the option's `flag' field to zero and its `val' field to a nonzero value (the equivalent single-letter option character, if there is one). For long options that have a zero `flag' field, `getopt' returns the contents of the `val' field. */ struct option { # if (defined __STDC__ && __STDC__) || defined __cplusplus const char *name; # else char *name; # endif /* has_arg can't be an enum because some compilers complain about type mismatches in all the code that assumes it is an int. */ int has_arg; int *flag; int val; }; /* Names for the values of the `has_arg' field of `struct option'. */ # define no_argument 0 # define required_argument 1 # define optional_argument 2 #endif /* need getopt */ /* Get definitions and prototypes for functions to process the arguments in ARGV (ARGC of them, minus the program name) for options given in OPTS. Return the option character from OPTS just read. Return -1 when there are no more options. For unrecognized options, or options missing arguments, `optopt' is set to the option letter, and '?' is returned. The OPTS string is a list of characters which are recognized option letters, optionally followed by colons, specifying that that letter takes an argument, to be placed in `optarg'. If a letter in OPTS is followed by two colons, its argument is optional. This behavior is specific to the GNU `getopt'. The argument `--' causes premature termination of argument scanning, explicitly telling `getopt' that there are no more options. If OPTS begins with `--', then non-option arguments are treated as arguments to the option '\0'. This behavior is specific to the GNU `getopt'. */ #if (defined __STDC__ && __STDC__) || defined __cplusplus # ifdef __GNU_LIBRARY__ /* Many other libraries have conflicting prototypes for getopt, with differences in the consts, in stdlib.h. To avoid compilation errors, only prototype getopt for the GNU C library. */ extern int getopt (int ___argc, char *const *___argv, const char *__shortopts); # else /* not __GNU_LIBRARY__ */ extern int getopt (); # endif /* __GNU_LIBRARY__ */ # ifndef __need_getopt extern int getopt_long (int ___argc, char *const *___argv, const char *__shortopts, const struct option *__longopts, int *__longind); extern int getopt_long_only (int ___argc, char *const *___argv, const char *__shortopts, const struct option *__longopts, int *__longind); /* Internal only. Users should not call this directly. */ extern int _getopt_internal (int ___argc, char *const *___argv, const char *__shortopts, const struct option *__longopts, int *__longind, int __long_only); # endif #else /* not __STDC__ */ extern int getopt (); # ifndef __need_getopt extern int getopt_long (); extern int getopt_long_only (); extern int _getopt_internal (); # endif #endif /* __STDC__ */ #ifdef __cplusplus } #endif /* Make sure we later can get all the definitions and declarations. */ #undef __need_getopt #endif /* getopt.h */ gtkwave-3.3.86/src/regex_wave.h0000664000175000017500000000131513166335473015700 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2004. * * 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. */ #include "globals.h" #ifndef REGEX_WAVE_H #define REGEX_WAVE_H enum WaveRegexTypes { WAVE_REGEX_SEARCH, WAVE_REGEX_TREE, WAVE_REGEX_WILD, WAVE_REGEX_DND, WAVE_REGEX_TOTAL }; int wave_regex_compile(char *regex, int which); int wave_regex_match(char *str, int which); void *wave_regex_alloc_compile(char *regex); int wave_regex_alloc_match(void *mreg, char *str); void wave_regex_alloc_free(void *pnt); #endif gtkwave-3.3.86/src/interp.c0000664000175000017500000002171713166335473015050 0ustar bybellbybell/********** Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Wayne A. Christopher, U. C. Berkeley CAD Group Spice is covered now covered by the BSD Copyright: Copyright (c) 1985-1991 The Regents of the University of California. All rights reserved. Permission is hereby granted, without written agreement and without license or royalty fees, to use, copy, modify, and distribute this software and its documentation for any purpose, provided that the above copyright notice and the following two paragraphs appear in all copies of this software. IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. **********/ /* * Polynomial interpolation code. */ #include #include #include #include #include #ifndef HAVE_BZERO #define bcopy(a,b,c) memcpy((b),(a),(c)) #define bzero(a,b) memset((a),0,(b)) #define bcmp(a,b,c) memcmp((a),(b),(c)) #endif #if 0 static void printmat (char *name, double *mat, int m, int n) { int i, j; printf ("\n\r=== Matrix: %s ===\n\r", name); for (i = 0; i < m; i++) { printf (" | "); for (j = 0; j < n; j++) printf ("%G ", mat[i * n + j]); printf ("|\n\r"); } printf ("===\n\r"); return; } #endif static double ft_peval (double x, double *coeffs, int degree) { double y; int i; if (!coeffs) return 0.0; /* XXX Should not happen */ y = coeffs[degree]; /* there are (degree+1) coeffs */ for (i = degree - 1; i >= 0; i--) { y *= x; y += coeffs[i]; } return y; } /* Returns the index of the last element that was calculated. oval is the * value of the old scale at the end of the interval that is being interpolated * from, and sign is 1 if the old scale was increasing, and -1 if it was * decreasing. */ static int putinterval (double *poly, int degree, double *nvec, int last, double *nscale, int nlen, double oval, int sign) { int end, i; /* See how far we have to go. */ for (end = last + 1; end < nlen; end++) if (nscale[end] * sign > oval * sign) break; end--; for (i = last + 1; i <= end; i++) nvec[i] = ft_peval (nscale[i], poly, degree); return (end); } /* Takes n = (degree+1) doubles, and fills in result with the n coefficients * of the polynomial that will fit them. It also takes a pointer to an * array of n ^ 2 + n doubles to use for scratch -- we want to make this * fast and avoid doing mallocs for each call. */ static int ft_polyfit (double *xdata, double *ydata, double *result, int degree, double *scratch) { double *mat1 = scratch; int l, k, j, i; int n = degree + 1; double *mat2 = scratch + n * n; /* XXX These guys are hacks! */ double d; bzero ((char *) result, n * sizeof (double)); bzero ((char *) mat1, n * n * sizeof (double)); bcopy ((char *) ydata, (char *) mat2, n * sizeof (double)); /* Fill in the matrix with x^k for 0 <= k <= degree for each point */ l = 0; for (i = 0; i < n; i++) { d = 1.0; for (j = 0; j < n; j++) { mat1[l] = d; d *= xdata[i]; l += 1; } } /* Do Gauss-Jordan elimination on mat1. */ for (i = 0; i < n; i++) { int lindex; double largest; /* choose largest pivot */ for (j = i, largest = mat1[i * n + i], lindex = i; j < n; j++) { if (fabs (mat1[j * n + i]) > largest) { largest = fabs (mat1[j * n + i]); lindex = j; } } if (lindex != i) { /* swap rows i and lindex */ for (k = 0; k < n; k++) { d = mat1[i * n + k]; mat1[i * n + k] = mat1[lindex * n + k]; mat1[lindex * n + k] = d; } d = mat2[i]; mat2[i] = mat2[lindex]; mat2[lindex] = d; } /* Make sure we have a non-zero pivot. */ if (mat1[i * n + i] == 0.0) { /* this should be rotated. */ return (0); } for (j = i + 1; j < n; j++) { d = mat1[j * n + i] / mat1[i * n + i]; for (k = 0; k < n; k++) mat1[j * n + k] -= d * mat1[i * n + k]; mat2[j] -= d * mat2[i]; } } for (i = n - 1; i > 0; i--) for (j = i - 1; j >= 0; j--) { d = mat1[j * n + i] / mat1[i * n + i]; for (k = 0; k < n; k++) mat1[j * n + k] -= d * mat1[i * n + k]; mat2[j] -= d * mat2[i]; } /* Now write the stuff into the result vector. */ for (i = 0; i < n; i++) { result[i] = mat2[i] / mat1[i * n + i]; /* printf(stderr, "result[%d] = %G\n", i, result[i]); */ } #define ABS_TOL 0.001 #define REL_TOL 0.001 /* Let's check and make sure the coefficients are ok. If they aren't, * just return false. This is not the best way to do it. */ for (i = 0; i < n; i++) { d = ft_peval (xdata[i], result, degree); if (fabs (d - ydata[i]) > ABS_TOL) { /* fprintf(stderr, "Error: polyfit: x = %le, y = %le, int = %le\n", xdata[i], ydata[i], d); printmat("mat1", mat1, n, n); printmat("mat2", mat2, n, 1); */ return (0); } else if (fabs (d - ydata[i]) / (fabs (d) > ABS_TOL ? fabs (d) : ABS_TOL) > REL_TOL) { /* fprintf(stderr, "Error: polyfit: x = %le, y = %le, int = %le\n", xdata[i], ydata[i], d); printmat("mat1", mat1, n, n); printmat("mat2", mat2, n, 1); */ return (0); } } return (1); } /* Interpolate data from oscale to nscale. data is assumed to be olen long, * ndata will be nlen long. Returns false if the scales are too strange * to deal with. Note that we are guaranteed that either both scales are * strictly increasing or both are strictly decreasing. * * Usage: return indicates success or failure * * data[] = old y * oscale[] = old x * olen = size of above array * * ndata[] = routine fills in with new y * nscale[] = user fills in with new x * nlen = user fills in with size of above array * * note that degree > 2 will result in bumpy curves if the derivatives * are not smooth */ int ft_interpolate (double *data, double *ndata, double *oscale, int olen, double *nscale, int nlen, int degree) { double *result, *scratch, *xdata, *ydata; int sign, lastone, i, l; int rc; if ((olen < 2) || (nlen < 2)) { /* fprintf(stderr, "Error: lengths too small to interpolate.\n"); */ return (0); } if ((degree < 1) || (degree > olen)) { /* fprintf(stderr, "Error: degree is %d, can't interpolate.\n", degree); */ return (0); } if (oscale[1] < oscale[0]) sign = -1; else sign = 1; scratch = (double *) malloc ((degree + 1) * (degree + 2) * sizeof (double)); result = (double *) malloc ((degree + 1) * sizeof (double)); xdata = (double *) malloc ((degree + 1) * sizeof (double)); ydata = (double *) malloc ((degree + 1) * sizeof (double)); /* Deal with the first degree pieces. */ bcopy ((char *) data, (char *) ydata, (degree + 1) * sizeof (double)); bcopy ((char *) oscale, (char *) xdata, (degree + 1) * sizeof (double)); while (!ft_polyfit (xdata, ydata, result, degree, scratch)) { /* If it doesn't work this time, bump the interpolation * degree down by one. */ if (--degree == 0) { /* fprintf(stderr, "ft_interpolate: Internal Error.\n"); */ rc = 0; goto bot; } } /* Add this part of the curve. What we do is evaluate the polynomial * at those points between the last one and the one that is greatest, * without being greater than the leftmost old scale point, or least * if the scale is decreasing at the end of the interval we are looking * at. */ lastone = -1; for (i = 0; i < degree; i++) { lastone = putinterval (result, degree, ndata, lastone, nscale, nlen, xdata[i], sign); } /* Now plot the rest, piece by piece. l is the * last element under consideration. */ for (l = degree + 1; l < olen; l++) { /* Shift the old stuff by one and get another value. */ for (i = 0; i < degree; i++) { xdata[i] = xdata[i + 1]; ydata[i] = ydata[i + 1]; } ydata[i] = data[l]; xdata[i] = oscale[l]; while (!ft_polyfit (xdata, ydata, result, degree, scratch)) { if (--degree == 0) { /* fprintf(stderr, "interpolate: Internal Error.\n"); */ rc = 0; goto bot; } } lastone = putinterval (result, degree, ndata, lastone, nscale, nlen, xdata[i], sign); } if (lastone < nlen - 1) /* ??? */ ndata[nlen - 1] = data[olen - 1]; rc = 1; bot: free (scratch); free (xdata); free (ydata); free (result); return (rc); } gtkwave-3.3.86/src/currenttime.c0000664000175000017500000004410213166335473016101 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2016. * * 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. */ #include "globals.h" #include #include #include "currenttime.h" #include "symbol.h" static char *time_prefix=WAVE_SI_UNITS; static char *maxtime_label_text="Maximum Time"; static char *marker_label_text ="Marker Time"; static char *maxtime_label_text_hpos="Max"; static char *marker_label_text_hpos ="Marker"; void fractional_timescale_fix(char *s) { char buf[32], sfx[2]; int i, len; int prefix_idx = 0; if(*s != '0') return; len = strlen(s); for(i=0;iuse_maxtime_display) { gtk_label_set(GTK_LABEL(GLOBALS->max_or_marker_label_currenttime_c_1), (!GLOBALS->use_toolbutton_interface) ? maxtime_label_text : maxtime_label_text_hpos); update_maxtime(GLOBALS->max_time); } else { gtk_label_set(GTK_LABEL(GLOBALS->max_or_marker_label_currenttime_c_1), (!GLOBALS->use_toolbutton_interface) ? marker_label_text : marker_label_text_hpos); update_markertime(GLOBALS->tims.marker); } } /* handles floating point values with units */ static TimeType unformat_time_complex(const char *s, char dim) { int i, delta, rc; unsigned char ch = dim; double d = 0.0; const char *offs = NULL, *doffs = NULL; rc = sscanf(s, "%lf %cs", &d, &ch); if(rc == 2) { ch = tolower(ch); if(ch=='s') ch = ' '; offs=strchr(time_prefix, ch); if(offs) { doffs=strchr(time_prefix, (int)dim); if(!doffs) doffs = offs; /* should *never* happen */ delta= (doffs-time_prefix) - (offs-time_prefix); if(delta<0) { for(i=delta;i<0;i++) { d=d/1000; } } else { for(i=0;iatoi_cont_ptr)) { while((ch=*(pnt++))) { if((ch==' ')||(ch=='\t')) continue; ich=tolower((int)ch); if(ich=='s') ich=' '; /* as in plain vanilla seconds */ offs=strchr(time_prefix, ich); break; } } if(!offs) return(rval); if((dim=='S')||(dim=='s')) { doffs = time_prefix; } else { doffs=strchr(time_prefix, (int)dim); if(!doffs) return(rval); /* should *never* happen */ } delta= (doffs-time_prefix) - (offs-time_prefix); if(delta<0) { for(i=delta;i<0;i++) { rval=rval/1000; } } else { for(i=0;inamed_markers[mkv]; if(mkvt != -1) { return(mkvt); } } } } for(i=0;i0; i--) { if(val%1000) break; val=val/1000; } if(i) { sprintf(buf, TTFormat" %cs", val, time_prefix[i]); } else { sprintf(buf, TTFormat" sec", val); } } void reformat_time(char *buf, TimeType val, char dim) { char *pnt; int i, offset, offsetfix; if(val < LLDescriptor(0)) { val = -val; buf[0] = '-'; buf++; } pnt=strchr(time_prefix, (int)dim); if(pnt) { offset=pnt-time_prefix; } else offset=0; for(i=offset; i>0; i--) { if(val%1000) break; val=val/1000; } if(GLOBALS->scale_to_time_dimension) { if(GLOBALS->scale_to_time_dimension == 's') { pnt = time_prefix; } else { pnt=strchr(time_prefix, (int)GLOBALS->scale_to_time_dimension); } if(pnt) { offsetfix = pnt-time_prefix; if(offsetfix != i) { int j; int deltaexp = (offsetfix - i); gdouble gval = (gdouble)val; gdouble mypow = 1.0; if(deltaexp > 0) { for(j=0;jdeltaexp;j--) { mypow /= 1000.0; } } gval *= mypow; if(GLOBALS->scale_to_time_dimension == 's') { sprintf(buf, "%.9g sec", gval); } else { sprintf(buf, "%.9g %cs", gval, GLOBALS->scale_to_time_dimension); } return; } } } if((i)&&(time_prefix)) /* scan-build on time_prefix, should not be necessary however */ { sprintf(buf, TTFormat" %cs", val, time_prefix[i]); } else { sprintf(buf, TTFormat" sec", val); } } void reformat_time_as_frequency(char *buf, TimeType val, char dim) { char *pnt; int offset; double k; static const double negpow[] = { 1.0, 1.0e-3, 1.0e-6, 1.0e-9, 1.0e-12, 1.0e-15, 1.0e-18, 1.0e-21 }; pnt=strchr(time_prefix, (int)dim); if(pnt) { offset=pnt-time_prefix; } else offset=0; if(val) { k = 1 / ((double)val * negpow[offset]); sprintf(buf, "%e Hz", k); } else { strcpy(buf, "-- Hz"); } } void reformat_time_blackout(char *buf, TimeType val, char dim) { char *pnt; int i, offset, offsetfix; struct blackout_region_t *bt = GLOBALS->blackout_regions; char blackout = ' '; while(bt) { if((val>=bt->bstart)&&(valbend)) { blackout = '*'; break; } bt=bt->next; } pnt=strchr(time_prefix, (int)dim); if(pnt) { offset=pnt-time_prefix; } else offset=0; for(i=offset; i>0; i--) { if(val%1000) break; val=val/1000; } if(GLOBALS->scale_to_time_dimension) { if(GLOBALS->scale_to_time_dimension == 's') { pnt = time_prefix; } else { pnt=strchr(time_prefix, (int)GLOBALS->scale_to_time_dimension); } if(pnt) { offsetfix = pnt-time_prefix; if(offsetfix != i) { int j; int deltaexp = (offsetfix - i); gdouble gval = (gdouble)val; gdouble mypow = 1.0; if(deltaexp > 0) { for(j=0;jdeltaexp;j--) { mypow /= 1000.0; } } gval *= mypow; if(GLOBALS->scale_to_time_dimension == 's') { sprintf(buf, "%.9g%csec", gval, blackout); } else { sprintf(buf, "%.9g%c%cs", gval, blackout, GLOBALS->scale_to_time_dimension); } return; } } } if((i)&&(time_prefix)) /* scan-build on time_prefix, should not be necessary however */ { sprintf(buf, TTFormat"%c%cs", val, blackout, time_prefix[i]); } else { sprintf(buf, TTFormat"%csec", val, blackout); } } void update_markertime(TimeType val) { #if !defined _MSC_VER if(GLOBALS->anno_ctx) { if(val >= 0) { GLOBALS->anno_ctx->marker_set = 0; /* avoid race on update */ if(!GLOBALS->ae2_time_xlate) { GLOBALS->anno_ctx->marker = val / GLOBALS->time_scale; } else { int rvs_xlate = bsearch_aetinfo_timechain(val); GLOBALS->anno_ctx->marker = ((TimeType)rvs_xlate) + GLOBALS->ae2_start_cyc; } reformat_time(GLOBALS->anno_ctx->time_string, val + GLOBALS->global_time_offset, GLOBALS->time_dimension); GLOBALS->anno_ctx->marker_set = 1; } else { GLOBALS->anno_ctx->marker_set = 0; } } #endif if(!GLOBALS->use_maxtime_display) { if(val>=0) { if(GLOBALS->tims.baseline>=0) { val-=GLOBALS->tims.baseline; /* do delta instead */ *GLOBALS->maxtext_currenttime_c_1='B'; if(val>=0) { *(GLOBALS->maxtext_currenttime_c_1+1)='+'; if(GLOBALS->use_frequency_delta) { reformat_time_as_frequency(GLOBALS->maxtext_currenttime_c_1+2, val, GLOBALS->time_dimension); } else { reformat_time(GLOBALS->maxtext_currenttime_c_1+2, val, GLOBALS->time_dimension); } } else { if(GLOBALS->use_frequency_delta) { reformat_time_as_frequency(GLOBALS->maxtext_currenttime_c_1+1, val, GLOBALS->time_dimension); } else { reformat_time(GLOBALS->maxtext_currenttime_c_1+1, val, GLOBALS->time_dimension); } } } else if(GLOBALS->tims.lmbcache>=0) { val-=GLOBALS->tims.lmbcache; /* do delta instead */ if(GLOBALS->use_frequency_delta) { reformat_time_as_frequency(GLOBALS->maxtext_currenttime_c_1, val, GLOBALS->time_dimension); } else { if(val>=0) { *GLOBALS->maxtext_currenttime_c_1='+'; reformat_time(GLOBALS->maxtext_currenttime_c_1+1, val, GLOBALS->time_dimension); } else { reformat_time(GLOBALS->maxtext_currenttime_c_1, val, GLOBALS->time_dimension); } } } else { reformat_time(GLOBALS->maxtext_currenttime_c_1, val + GLOBALS->global_time_offset, GLOBALS->time_dimension); } } else { sprintf(GLOBALS->maxtext_currenttime_c_1, "--"); } gtk_label_set(GTK_LABEL(GLOBALS->maxtimewid_currenttime_c_1), GLOBALS->maxtext_currenttime_c_1); } if(GLOBALS->named_marker_lock_idx>-1) { if(GLOBALS->tims.marker >= 0) { int ent_idx = GLOBALS->named_marker_lock_idx; if(GLOBALS->named_markers[ent_idx] != GLOBALS->tims.marker) { GLOBALS->named_markers[ent_idx] = GLOBALS->tims.marker; wavearea_configure_event(GLOBALS->wavearea, NULL); } } } } void update_basetime(TimeType val) { if(val>=0) { gtk_label_set(GTK_LABEL(GLOBALS->base_or_curtime_label_currenttime_c_1), (!GLOBALS->use_toolbutton_interface) ? "Base Marker" : "Base"); reformat_time(GLOBALS->curtext_currenttime_c_1, val + GLOBALS->global_time_offset, GLOBALS->time_dimension); } else { gtk_label_set(GTK_LABEL(GLOBALS->base_or_curtime_label_currenttime_c_1), (!GLOBALS->use_toolbutton_interface) ? "Current Time" : "Cursor"); reformat_time_blackout(GLOBALS->curtext_currenttime_c_1, GLOBALS->cached_currenttimeval_currenttime_c_1 + GLOBALS->global_time_offset, GLOBALS->time_dimension); } gtk_label_set(GTK_LABEL(GLOBALS->curtimewid_currenttime_c_1), GLOBALS->curtext_currenttime_c_1); } void update_maxtime(TimeType val) { GLOBALS->max_time=val; if(GLOBALS->use_maxtime_display) { reformat_time(GLOBALS->maxtext_currenttime_c_1, val + GLOBALS->global_time_offset, GLOBALS->time_dimension); gtk_label_set(GTK_LABEL(GLOBALS->maxtimewid_currenttime_c_1), GLOBALS->maxtext_currenttime_c_1); } } void update_currenttime(TimeType val) { GLOBALS->cached_currenttimeval_currenttime_c_1 = val; if(GLOBALS->tims.baseline<0) { GLOBALS->currenttime=val; reformat_time_blackout(GLOBALS->curtext_currenttime_c_1, val + GLOBALS->global_time_offset, GLOBALS->time_dimension); gtk_label_set(GTK_LABEL(GLOBALS->curtimewid_currenttime_c_1), GLOBALS->curtext_currenttime_c_1); } } /* Create an entry box */ GtkWidget * create_time_box(void) { GtkWidget *mainbox; GtkWidget *eventbox; GLOBALS->max_or_marker_label_currenttime_c_1=(GLOBALS->use_maxtime_display) ? gtk_label_new((!GLOBALS->use_toolbutton_interface) ? maxtime_label_text : maxtime_label_text_hpos) : gtk_label_new((!GLOBALS->use_toolbutton_interface) ? marker_label_text : marker_label_text_hpos); GLOBALS->maxtext_currenttime_c_1=(char *)malloc_2(40); if(GLOBALS->use_maxtime_display) { reformat_time(GLOBALS->maxtext_currenttime_c_1, GLOBALS->max_time, GLOBALS->time_dimension); } else { sprintf(GLOBALS->maxtext_currenttime_c_1,"--"); } GLOBALS->maxtimewid_currenttime_c_1=gtk_label_new(GLOBALS->maxtext_currenttime_c_1); GLOBALS->curtext_currenttime_c_1=(char *)malloc_2(40); if(GLOBALS->tims.baseline<0) { GLOBALS->base_or_curtime_label_currenttime_c_1=gtk_label_new((!GLOBALS->use_toolbutton_interface) ? "Current Time" : "Cursor"); reformat_time(GLOBALS->curtext_currenttime_c_1, (GLOBALS->currenttime=GLOBALS->min_time), GLOBALS->time_dimension); GLOBALS->curtimewid_currenttime_c_1=gtk_label_new(GLOBALS->curtext_currenttime_c_1); } else { GLOBALS->base_or_curtime_label_currenttime_c_1=gtk_label_new((!GLOBALS->use_toolbutton_interface) ? "Base Marker" : "Base"); reformat_time(GLOBALS->curtext_currenttime_c_1, GLOBALS->tims.baseline, GLOBALS->time_dimension); GLOBALS->curtimewid_currenttime_c_1=gtk_label_new(GLOBALS->curtext_currenttime_c_1); } if(!GLOBALS->use_toolbutton_interface) { mainbox=gtk_vbox_new(FALSE, 0); } else { mainbox=gtk_hbox_new(FALSE, 0); } gtk_widget_show(mainbox); eventbox=gtk_event_box_new(); gtk_container_add(GTK_CONTAINER(eventbox), mainbox); if(!GLOBALS->use_toolbutton_interface) { gtk_box_pack_start(GTK_BOX(mainbox), GLOBALS->max_or_marker_label_currenttime_c_1, TRUE, FALSE, 0); gtk_widget_show(GLOBALS->max_or_marker_label_currenttime_c_1); gtk_box_pack_start(GTK_BOX(mainbox), GLOBALS->maxtimewid_currenttime_c_1, TRUE, FALSE, 0); gtk_widget_show(GLOBALS->maxtimewid_currenttime_c_1); gtk_box_pack_start(GTK_BOX(mainbox), GLOBALS->base_or_curtime_label_currenttime_c_1, TRUE, FALSE, 0); gtk_widget_show(GLOBALS->base_or_curtime_label_currenttime_c_1); gtk_box_pack_start(GTK_BOX(mainbox), GLOBALS->curtimewid_currenttime_c_1, TRUE, FALSE, 0); gtk_widget_show(GLOBALS->curtimewid_currenttime_c_1); } else { GtkWidget *dummy; gtk_box_pack_start(GTK_BOX(mainbox), GLOBALS->max_or_marker_label_currenttime_c_1, TRUE, FALSE, 0); gtk_widget_show(GLOBALS->max_or_marker_label_currenttime_c_1); dummy=gtk_label_new(": "); gtk_widget_show (dummy); gtk_box_pack_start(GTK_BOX(mainbox), dummy, TRUE, FALSE, 0); gtk_box_pack_start(GTK_BOX(mainbox), GLOBALS->maxtimewid_currenttime_c_1, TRUE, FALSE, 0); gtk_widget_show(GLOBALS->maxtimewid_currenttime_c_1); dummy=gtk_label_new(" | "); gtk_widget_show (dummy); gtk_box_pack_start(GTK_BOX(mainbox), dummy, TRUE, FALSE, 0); gtk_box_pack_start(GTK_BOX(mainbox), GLOBALS->base_or_curtime_label_currenttime_c_1, TRUE, FALSE, 0); gtk_widget_show(GLOBALS->base_or_curtime_label_currenttime_c_1); dummy=gtk_label_new(": "); gtk_widget_show (dummy); gtk_box_pack_start(GTK_BOX(mainbox), dummy, TRUE, FALSE, 0); gtk_box_pack_start(GTK_BOX(mainbox), GLOBALS->curtimewid_currenttime_c_1, TRUE, FALSE, 0); gtk_widget_show(GLOBALS->curtimewid_currenttime_c_1); } return(eventbox); } TimeType time_trunc(TimeType t) { if(!GLOBALS->use_full_precision) if(GLOBALS->time_trunc_val_currenttime_c_1!=1) { t=t/GLOBALS->time_trunc_val_currenttime_c_1; t=t*GLOBALS->time_trunc_val_currenttime_c_1; if(ttims.first) t=GLOBALS->tims.first; } return(t); } void time_trunc_set(void) { gdouble gcompar=1e15; TimeType compar=LLDescriptor(1000000000000000); for(;compar!=1;compar=compar/10,gcompar=gcompar/((gdouble)10.0)) { if(GLOBALS->nspx>=gcompar) { GLOBALS->time_trunc_val_currenttime_c_1=compar; return; } } GLOBALS->time_trunc_val_currenttime_c_1=1; } /* * called by lxt/lxt2/vzt reader inits */ void exponent_to_time_scale(signed char scale) { switch(scale) { case 2: GLOBALS->time_scale = LLDescriptor(100); GLOBALS->time_dimension = 's'; break; case 1: GLOBALS->time_scale = LLDescriptor(10); case 0: GLOBALS->time_dimension = 's'; break; case -1: GLOBALS->time_scale = LLDescriptor(100); GLOBALS->time_dimension = 'm'; break; case -2: GLOBALS->time_scale = LLDescriptor(10); case -3: GLOBALS->time_dimension = 'm'; break; case -4: GLOBALS->time_scale = LLDescriptor(100); GLOBALS->time_dimension = 'u'; break; case -5: GLOBALS->time_scale = LLDescriptor(10); case -6: GLOBALS->time_dimension = 'u'; break; case -10: GLOBALS->time_scale = LLDescriptor(100); GLOBALS->time_dimension = 'p'; break; case -11: GLOBALS->time_scale = LLDescriptor(10); case -12: GLOBALS->time_dimension = 'p'; break; case -13: GLOBALS->time_scale = LLDescriptor(100); GLOBALS->time_dimension = 'f'; break; case -14: GLOBALS->time_scale = LLDescriptor(10); case -15: GLOBALS->time_dimension = 'f'; break; case -16: GLOBALS->time_scale = LLDescriptor(100); GLOBALS->time_dimension = 'a'; break; case -17: GLOBALS->time_scale = LLDescriptor(10); case -18: GLOBALS->time_dimension = 'a'; break; case -19: GLOBALS->time_scale = LLDescriptor(100); GLOBALS->time_dimension = 'z'; break; case -20: GLOBALS->time_scale = LLDescriptor(10); case -21: GLOBALS->time_dimension = 'z'; break; case -7: GLOBALS->time_scale = LLDescriptor(100); GLOBALS->time_dimension = 'n'; break; case -8: GLOBALS->time_scale = LLDescriptor(10); case -9: default: GLOBALS->time_dimension = 'n'; break; } } gtkwave-3.3.86/src/print.h0000664000175000017500000000715313166335473014706 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999. * * 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. */ #include "globals.h" /* * This module has been re-implemented by Udi Finkelstein. * Since it is no longer a PostScript-only module, it had been * renamed "print.c". * * Much of the code has been "C++"-ized in style, yet written in C. * We use classes, virtual functions, class members, and "this" pointers * written in C. */ #ifndef WAVE_PRINT_H #define WAVE_PRINT_H /************************************************************************* * Print Context * * * * This structure contains everything needed for the generic print code * *************************************************************************/ struct _gtk_print_device; struct _pr_context { struct _gtk_print_device *gpd; /* Pointer to print device class */ FILE *handle; /* Pointer to output file */ gdouble PageX; /* Legal page width */ gdouble PageY; /* Legal page height */ gdouble LM; /* Left Margin (inch) */ gdouble RM; /* Right Margin (inch) */ gdouble BM; /* Bottom Margin (inch) */ gdouble TM; /* Top Margin (inch) */ gdouble xscale, yscale, xtotal; gdouble tr_x, tr_y; gdouble gray; int MinX, MinY, MaxX, MaxY; /* These will be initialized by a routine */ char fullpage; }; typedef struct _pr_context pr_context; /************************************************************************* * GTKWave Print Device * * * * This structure contains pointers to device specific operations * *************************************************************************/ struct _gtk_print_device { void (*gpd_header)(pr_context *prc); void (*gpd_trailer)(pr_context *prc); void (*gpd_signal_init)(pr_context *prc); void (*gpd_setgray)(pr_context *prc, gdouble gray); void (*gpd_draw_line)(pr_context *prc, gdouble x1, gdouble y1, gdouble x2, gdouble y2); void (*gpd_draw_box)(pr_context *prc, gdouble x1, gdouble y1, gdouble x2, gdouble y2); void (*gpd_draw_string)(pr_context *prc, int x, int y, char *str, int xsize, int ysize); }; typedef struct _gtk_print_device gtk_print_device; void print_image(pr_context *prc); void print_mif_image(FILE *wave, gdouble px, gdouble py); void print_ps_image(FILE *wave, gdouble px, gdouble py); void ps_header(pr_context * prc); void ps_trailer(pr_context * prc); void ps_signal_init(pr_context * prc); void ps_setgray(pr_context * prc, gdouble gray); void ps_draw_line(pr_context * prc, gdouble x1, gdouble y1, gdouble x2, gdouble y2); void ps_draw_box(pr_context * prc, gdouble x1, gdouble y1, gdouble x2, gdouble y2); void ps_draw_string(pr_context * prc, int x, int y, char *str, int xsize, int ysize); void mif_header(pr_context * prc); void mif_trailer(pr_context * prc); void mif_signal_init(pr_context * prc); void mif_setgray(pr_context * prc, gdouble gray); void mif_translate(pr_context * prc, gdouble x, gdouble y); void mif_draw_line(pr_context * prc, gdouble x1, gdouble y1, gdouble x2, gdouble y2); void mif_draw_box(pr_context * prc, gdouble x1, gdouble y1, gdouble x2, gdouble y2); void mif_draw_string(pr_context * prc, int x, int y, char *str, int xsize, int ysize); #endif gtkwave-3.3.86/src/Makefile.in0000664000175000017500000012222613166335473015445 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : bin_PROGRAMS = gtkwave$(EXEEXT) twinwave$(EXEEXT) subdir = src DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_gtkwave_OBJECTS = fsdb_wrapper_api.$(OBJEXT) globals.$(OBJEXT) \ ae2.$(OBJEXT) analyzer.$(OBJEXT) baseconvert.$(OBJEXT) \ bitvec.$(OBJEXT) bsearch.$(OBJEXT) busy.$(OBJEXT) \ clipping.$(OBJEXT) color.$(OBJEXT) currenttime.$(OBJEXT) \ debug.$(OBJEXT) discardbuttons.$(OBJEXT) edgebuttons.$(OBJEXT) \ entry.$(OBJEXT) extload.$(OBJEXT) fetchbuttons.$(OBJEXT) \ fgetdynamic.$(OBJEXT) file.$(OBJEXT) fonts.$(OBJEXT) \ fst.$(OBJEXT) gconf.$(OBJEXT) getopt.$(OBJEXT) \ getopt1.$(OBJEXT) ghw.$(OBJEXT) ghwlib.$(OBJEXT) \ hierpack.$(OBJEXT) jrb.$(OBJEXT) help.$(OBJEXT) \ lxt2_read.$(OBJEXT) lxt_write.$(OBJEXT) vzt_read.$(OBJEXT) \ hiersearch.$(OBJEXT) interp.$(OBJEXT) logfile.$(OBJEXT) \ lx2.$(OBJEXT) lxt.$(OBJEXT) main.$(OBJEXT) markerbox.$(OBJEXT) \ menu.$(OBJEXT) mouseover.$(OBJEXT) mouseover_sigs.$(OBJEXT) \ pagebuttons.$(OBJEXT) pipeio.$(OBJEXT) pixmaps.$(OBJEXT) \ print.$(OBJEXT) ptranslate.$(OBJEXT) rc.$(OBJEXT) \ regex.$(OBJEXT) renderopt.$(OBJEXT) rgb.$(OBJEXT) \ savefile.$(OBJEXT) search.$(OBJEXT) shiftbuttons.$(OBJEXT) \ showchange.$(OBJEXT) signalwindow.$(OBJEXT) \ simplereq.$(OBJEXT) splash.$(OBJEXT) status.$(OBJEXT) \ strace.$(OBJEXT) symbol.$(OBJEXT) tcl_commands.$(OBJEXT) \ tcl_helper.$(OBJEXT) tcl_np.$(OBJEXT) \ tcl_support_commands.$(OBJEXT) timeentry.$(OBJEXT) \ translate.$(OBJEXT) tree.$(OBJEXT) treesearch.$(OBJEXT) \ tree_component.$(OBJEXT) ttranslate.$(OBJEXT) vcd.$(OBJEXT) \ vcd_keywords.$(OBJEXT) vcd_partial.$(OBJEXT) \ vcd_recoder.$(OBJEXT) vcd_saver.$(OBJEXT) vlist.$(OBJEXT) \ vzt.$(OBJEXT) wavewindow.$(OBJEXT) zoombuttons.$(OBJEXT) gtkwave_OBJECTS = $(am_gtkwave_OBJECTS) am__DEPENDENCIES_1 = am__DEPENDENCIES_2 = ./cocoa/libgtkwmacintegration.a \ $(am__DEPENDENCIES_1) am__DEPENDENCIES_3 = ./liblzma/libgwlzma.a $(am__DEPENDENCIES_1) gtkwave_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(LIBFST_LDADD) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) gtkwave_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(gtkwave_LDFLAGS) \ $(LDFLAGS) -o $@ am_twinwave_OBJECTS = twinwave.$(OBJEXT) twinwave_OBJECTS = $(am_twinwave_OBJECTS) twinwave_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(gtkwave_SOURCES) $(twinwave_SOURCES) DIST_SOURCES = $(gtkwave_SOURCES) $(twinwave_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = $(LIBZ_DIR) $(LIBBZ2_DIR) liblzma helpers helpers/fst cocoa DIST_SUBDIRS = libz libbz2 liblzma helpers helpers/fst cocoa LIBFST_CFLAGS = -I$(srcdir)/helpers/fst LIBFST_LDADD = ./helpers/fst/libfst.a LIBLZMA_CFLAGS = -I$(srcdir)/liblzma $(LIBXZ_CFLAGS) LIBLZMA_LDADD = ./liblzma/libgwlzma.a $(LIBXZ_LDADD) LIBCOCOA_CFLAGS = -I$(srcdir)/cocoa LIBCOCOA_LDADD = ./cocoa/libgtkwmacintegration.a $(COCOA_GTK_LDADD) AM_CFLAGS = -I$(srcdir)/.. -I$(srcdir)/helpers $(FASTTREE_CFLAGS) $(GTK_CFLAGS) $(LIBLZMA_CFLAGS) \ $(LIBZ_CFLAGS) $(LIBBZ2_CFLAGS) $(LIBFST_CFLAGS) $(AET2_CFLAGS) $(FSDB_CFLAGS) $(TCL_INCLUDE_SPEC) \ $(TCL_DEFADD) $(TK_INCLUDE_SPEC) $(EXTLOAD_CFLAGS) $(GEDIT_CFLAGS) $(LIBJUDY_CFLAGS) \ $(GTK_MAC_CFLAGS) $(GCONF_CFLAGS) $(LIBCOCOA_CFLAGS) $(GTK_UNIX_PRINT_CFLAGS) AM_CXXFLAGS = $(AM_CFLAGS) gtkwave_SOURCES = \ fsdb_wrapper_api.cc fsdb_wrapper_api.h \ baseconvert.h wavewindow.h zoombuttons.h fetchbuttons.h timeentry.h shiftbuttons.h pagebuttons.h edgebuttons.h \ signalwindow.h entry.h file.h status.h search.h showchange.h treesearch.h hiersearch.h renderopt.h markerbox.h \ simplereq.h help.h logfile.h vcd_partial.h mouseover.h mouseover_sigs.h interp.h \ globals.c globals.h ae2.c ae2.h analyzer.c analyzer.h baseconvert.c bitvec.c \ bsearch.c bsearch.h busy.c busy.h \ clipping.c clipping.h color.c color.h currenttime.c currenttime.h \ debug.c debug.h discardbuttons.c edgebuttons.c \ entry.c extload.c extload.h fetchbuttons.c fgetdynamic.c fgetdynamic.h file.c fonts.c fonts.h fst.c fst.h \ gconf.c gconf.h getopt.c \ getopt1.c ghw.c ghw.h ghwlib.c ghwlib.h gnu-getopt.h gnu_regex.h gtk12compat.h \ hierpack.c hierpack.h jrb.c jrb.h help.c helpers/lxt2_read.c \ helpers/lxt_write.c helpers/vzt_read.c hiersearch.c interp.c \ logfile.c lx2.c lx2.h lxt.c lxt.h main.c main.h markerbox.c menu.c menu.h mouseover.c \ mouseover_sigs.c pagebuttons.c pipeio.c pipeio.h pixmaps.c pixmaps.h print.c print.h \ ptranslate.c ptranslate.h rc.c rc.h \ regex.c regex_wave.h renderopt.c rgb.c savefile.c savefile.h search.c shiftbuttons.c showchange.c \ signalwindow.c simplereq.c splash.c status.c strace.c strace.h symbol.c symbol.h tcl_callbacks.h \ tcl_commands.c tcl_helper.c tcl_helper.h tcl_np.c tcl_np.h tcl_support_commands.c tcl_support_commands.h \ timeentry.c translate.c translate.h tree.c tree.h treesearch.c tree_component.c tree_component.h \ ttranslate.c ttranslate.h vcd.c vcd.h vcd_keywords.c \ vcd_partial.c vcd_recoder.c vcd_saver.c vcd_saver.h version.h vlist.c vlist.h vzt.c vzt.h wavealloca.h \ wavewindow.c zoombuttons.c gtkwave_LDADD = $(LIBCOCOA_LDADD) $(GTK_LIBS) $(LIBLZMA_LDADD) $(LIBZ_LDADD) $(LIBBZ2_LDADD) $(LIBFST_LDADD) $(AET2_LDADD) $(TCL_LDADD) $(TK_LDADD) $(FSDB_LDADD) $(LIBJUDY_LDADD) $(GTK_MAC_LIBS) $(GCONF_LIBS) $(GTK_UNIX_PRINT_LIBS) $(MINGW_LDADD) gtkwave_LDFLAGS = $(COCOA_GTK_LDFLAGS) twinwave_SOURCES = twinwave.c twinwave_LDADD = $(GTK_LIBS) $(GTK_MAC_LIBS) $(GCONF_LIBS) BUILT_SOURCES = vcd_keywords.c # I'm listing treesearch_gtk2.c here instead of in SOURCES because we don't directly # compile it. Rather it is #include'd by treesearch.c. EXTRA_DIST = treesearch_gtk1.c treesearch_gtk2.c vcd_keywords.gperf gnu_regex.c all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .cc .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) gtkwave$(EXEEXT): $(gtkwave_OBJECTS) $(gtkwave_DEPENDENCIES) $(EXTRA_gtkwave_DEPENDENCIES) @rm -f gtkwave$(EXEEXT) $(AM_V_CXXLD)$(gtkwave_LINK) $(gtkwave_OBJECTS) $(gtkwave_LDADD) $(LIBS) twinwave$(EXEEXT): $(twinwave_OBJECTS) $(twinwave_DEPENDENCIES) $(EXTRA_twinwave_DEPENDENCIES) @rm -f twinwave$(EXEEXT) $(AM_V_CCLD)$(LINK) $(twinwave_OBJECTS) $(twinwave_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ae2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/analyzer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/baseconvert.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitvec.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bsearch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/busy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clipping.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/color.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/currenttime.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/discardbuttons.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/edgebuttons.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/entry.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extload.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fetchbuttons.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fgetdynamic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fonts.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsdb_wrapper_api.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fst.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gconf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ghw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ghwlib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/globals.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/help.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hierpack.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hiersearch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jrb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logfile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lx2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lxt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lxt2_read.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lxt_write.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/markerbox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/menu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mouseover.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mouseover_sigs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pagebuttons.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pipeio.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pixmaps.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptranslate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/renderopt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rgb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/savefile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/search.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shiftbuttons.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/showchange.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signalwindow.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplereq.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/splash.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/status.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strace.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symbol.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tcl_commands.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tcl_helper.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tcl_np.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tcl_support_commands.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timeentry.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/translate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tree.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tree_component.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/treesearch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ttranslate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/twinwave.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcd_keywords.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcd_partial.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcd_recoder.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcd_saver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vlist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vzt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vzt_read.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wavewindow.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoombuttons.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` lxt2_read.o: helpers/lxt2_read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lxt2_read.o -MD -MP -MF $(DEPDIR)/lxt2_read.Tpo -c -o lxt2_read.o `test -f 'helpers/lxt2_read.c' || echo '$(srcdir)/'`helpers/lxt2_read.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lxt2_read.Tpo $(DEPDIR)/lxt2_read.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='helpers/lxt2_read.c' object='lxt2_read.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lxt2_read.o `test -f 'helpers/lxt2_read.c' || echo '$(srcdir)/'`helpers/lxt2_read.c lxt2_read.obj: helpers/lxt2_read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lxt2_read.obj -MD -MP -MF $(DEPDIR)/lxt2_read.Tpo -c -o lxt2_read.obj `if test -f 'helpers/lxt2_read.c'; then $(CYGPATH_W) 'helpers/lxt2_read.c'; else $(CYGPATH_W) '$(srcdir)/helpers/lxt2_read.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lxt2_read.Tpo $(DEPDIR)/lxt2_read.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='helpers/lxt2_read.c' object='lxt2_read.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lxt2_read.obj `if test -f 'helpers/lxt2_read.c'; then $(CYGPATH_W) 'helpers/lxt2_read.c'; else $(CYGPATH_W) '$(srcdir)/helpers/lxt2_read.c'; fi` lxt_write.o: helpers/lxt_write.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lxt_write.o -MD -MP -MF $(DEPDIR)/lxt_write.Tpo -c -o lxt_write.o `test -f 'helpers/lxt_write.c' || echo '$(srcdir)/'`helpers/lxt_write.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lxt_write.Tpo $(DEPDIR)/lxt_write.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='helpers/lxt_write.c' object='lxt_write.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lxt_write.o `test -f 'helpers/lxt_write.c' || echo '$(srcdir)/'`helpers/lxt_write.c lxt_write.obj: helpers/lxt_write.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lxt_write.obj -MD -MP -MF $(DEPDIR)/lxt_write.Tpo -c -o lxt_write.obj `if test -f 'helpers/lxt_write.c'; then $(CYGPATH_W) 'helpers/lxt_write.c'; else $(CYGPATH_W) '$(srcdir)/helpers/lxt_write.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lxt_write.Tpo $(DEPDIR)/lxt_write.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='helpers/lxt_write.c' object='lxt_write.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lxt_write.obj `if test -f 'helpers/lxt_write.c'; then $(CYGPATH_W) 'helpers/lxt_write.c'; else $(CYGPATH_W) '$(srcdir)/helpers/lxt_write.c'; fi` vzt_read.o: helpers/vzt_read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vzt_read.o -MD -MP -MF $(DEPDIR)/vzt_read.Tpo -c -o vzt_read.o `test -f 'helpers/vzt_read.c' || echo '$(srcdir)/'`helpers/vzt_read.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vzt_read.Tpo $(DEPDIR)/vzt_read.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='helpers/vzt_read.c' object='vzt_read.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vzt_read.o `test -f 'helpers/vzt_read.c' || echo '$(srcdir)/'`helpers/vzt_read.c vzt_read.obj: helpers/vzt_read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vzt_read.obj -MD -MP -MF $(DEPDIR)/vzt_read.Tpo -c -o vzt_read.obj `if test -f 'helpers/vzt_read.c'; then $(CYGPATH_W) 'helpers/vzt_read.c'; else $(CYGPATH_W) '$(srcdir)/helpers/vzt_read.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vzt_read.Tpo $(DEPDIR)/vzt_read.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='helpers/vzt_read.c' object='vzt_read.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vzt_read.obj `if test -f 'helpers/vzt_read.c'; then $(CYGPATH_W) 'helpers/vzt_read.c'; else $(CYGPATH_W) '$(srcdir)/helpers/vzt_read.c'; fi` .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(PROGRAMS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: $(am__recursive_targets) all check install install-am \ install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-binPROGRAMS clean-generic cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-binPROGRAMS install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binPROGRAMS ./liblzma/libgwlzma.a: $(srcdir)/liblzma/LzmaLib.c $(srcdir)/liblzma/LzmaLib.h ./helpers/fst/libfst.a: $(srcdir)/helpers/fst/fastlz.c $(srcdir)/helpers/fst/fastlz.h $(srcdir)/helpers/fst/fstapi.c $(srcdir)/helpers/fst/fstapi.h ./cocoa/libgtkwmacintegration.a: $(srcdir)/cocoa/cocoa_misc.c $(srcdir)/cocoa/cocoa_misc.h vcd_keywords.c: vcd_keywords.gperf printf "$(GPERF) -o -i 1 -C -k 1,\044 -L C -H keyword_hash -N check_identifier -tT $(srcdir)/vcd_keywords.gperf >vcd_keywords.c" | sh # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/src/zoombuttons.c0000664000175000017500000003550513166335473016152 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2016. * * 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. */ #include #include "globals.h" #include "pixmaps.h" #include "currenttime.h" #include "debug.h" void fix_wavehadj(void) { GtkAdjustment *hadj; gfloat pageinc; hadj=GTK_ADJUSTMENT(GLOBALS->wave_hslider); hadj->lower=GLOBALS->tims.first; hadj->upper=GLOBALS->tims.last+2.0; pageinc=(gfloat)(((gdouble)GLOBALS->wavewidth)*GLOBALS->nspx); hadj->page_size=hadj->page_increment=(pageinc>=1.0)?pageinc:1.0; /* hadj->step_increment=(GLOBALS->nspx>=1.0)?GLOBALS->nspx:1.0; */ hadj->step_increment = pageinc / 10.0; if(hadj->step_increment < 1.0) hadj->step_increment = 1.0; if(hadj->page_size >= (hadj->upper-hadj->lower)) hadj->value=hadj->lower; if(hadj->value+hadj->page_size>hadj->upper) { hadj->value=hadj->upper-hadj->page_size; if(hadj->valuelower) hadj->value=hadj->lower; } } void service_zoom_left(GtkWidget *text, gpointer data) { (void)text; (void)data; GtkAdjustment *hadj; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nZoom To Start"); help_text( " is used to jump scroll to the trace's beginning." ); return; } hadj=GTK_ADJUSTMENT(GLOBALS->wave_hslider); hadj->value=GLOBALS->tims.timecache=GLOBALS->tims.first; time_update(); } void service_zoom_right(GtkWidget *text, gpointer data) { (void)text; (void)data; GtkAdjustment *hadj; TimeType ntinc; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nZoom To End"); help_text( " is used to jump scroll to the trace's end." ); return; } ntinc=(TimeType)(((gdouble)GLOBALS->wavewidth)*GLOBALS->nspx); GLOBALS->tims.timecache=GLOBALS->tims.last-ntinc+1; if(GLOBALS->tims.timecachetims.first) GLOBALS->tims.timecache=GLOBALS->tims.first; hadj=GTK_ADJUSTMENT(GLOBALS->wave_hslider); hadj->value=GLOBALS->tims.timecache; time_update(); } void service_zoom_out(GtkWidget *text, gpointer data) { (void)text; (void)data; TimeType middle=0, width; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nZoom Out"); help_text( " is used to decrease the zoom factor around the marker." #ifdef WAVE_USE_GTK2 " Alt + Scrollwheel Up also hits this button in non-alternative wheel mode." #endif ); return; } if(GLOBALS->do_zoom_center) { if((GLOBALS->tims.marker<0)||(GLOBALS->tims.markertims.first)||(GLOBALS->tims.marker>GLOBALS->tims.last)) { if(GLOBALS->tims.end>GLOBALS->tims.last) GLOBALS->tims.end=GLOBALS->tims.last; middle=(GLOBALS->tims.start/2)+(GLOBALS->tims.end/2); if((GLOBALS->tims.start&1)&&(GLOBALS->tims.end&1)) middle++; } else { middle=GLOBALS->tims.marker; } } GLOBALS->tims.prevzoom=GLOBALS->tims.zoom; GLOBALS->tims.zoom--; calczoom(GLOBALS->tims.zoom); if(GLOBALS->do_zoom_center) { width=(TimeType)(((gdouble)GLOBALS->wavewidth)*GLOBALS->nspx); GLOBALS->tims.start=time_trunc(middle-(width/2)); if(GLOBALS->tims.start+width>GLOBALS->tims.last) GLOBALS->tims.start=time_trunc(GLOBALS->tims.last-width); if(GLOBALS->tims.starttims.first) GLOBALS->tims.start=GLOBALS->tims.first; GTK_ADJUSTMENT(GLOBALS->wave_hslider)->value=GLOBALS->tims.timecache=GLOBALS->tims.start; } else { GLOBALS->tims.timecache=0; } fix_wavehadj(); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "changed"); /* force zoom update */ gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "value_changed"); /* force zoom update */ DEBUG(printf("Zoombuttons out\n")); } void service_zoom_in(GtkWidget *text, gpointer data) { (void)text; (void)data; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nZoom In"); help_text( " is used to increase the zoom factor around the marker." #ifdef WAVE_USE_GTK2 " Alt + Scrollwheel Down also hits this button in non-alternative wheel mode." #endif ); return; } if(GLOBALS->tims.zoom<0) /* otherwise it's ridiculous and can cause */ { /* overflow problems in the scope */ TimeType middle=0, width; if(GLOBALS->do_zoom_center) { if((GLOBALS->tims.marker<0)||(GLOBALS->tims.markertims.first)||(GLOBALS->tims.marker>GLOBALS->tims.last)) { if(GLOBALS->tims.end>GLOBALS->tims.last) GLOBALS->tims.end=GLOBALS->tims.last; middle=(GLOBALS->tims.start/2)+(GLOBALS->tims.end/2); if((GLOBALS->tims.start&1)&&(GLOBALS->tims.end&1)) middle++; } else { middle=GLOBALS->tims.marker; } } GLOBALS->tims.prevzoom=GLOBALS->tims.zoom; GLOBALS->tims.zoom++; calczoom(GLOBALS->tims.zoom); if(GLOBALS->do_zoom_center) { width=(TimeType)(((gdouble)GLOBALS->wavewidth)*GLOBALS->nspx); GLOBALS->tims.start=time_trunc(middle-(width/2)); if(GLOBALS->tims.start+width>GLOBALS->tims.last) GLOBALS->tims.start=time_trunc(GLOBALS->tims.last-width); if(GLOBALS->tims.starttims.first) GLOBALS->tims.start=GLOBALS->tims.first; GTK_ADJUSTMENT(GLOBALS->wave_hslider)->value=GLOBALS->tims.timecache=GLOBALS->tims.start; } else { GLOBALS->tims.timecache=0; } fix_wavehadj(); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "changed"); /* force zoom update */ gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "value_changed"); /* force zoom update */ DEBUG(printf("Zoombuttons in\n")); } } void service_zoom_undo(GtkWidget *text, gpointer data) { (void)text; (void)data; gdouble temp; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nZoom Undo"); help_text( " is used to revert to the previous zoom value used. Undo" " only works one level deep." ); return; } temp=GLOBALS->tims.zoom; GLOBALS->tims.zoom=GLOBALS->tims.prevzoom; GLOBALS->tims.prevzoom=temp; GLOBALS->tims.timecache=0; calczoom(GLOBALS->tims.zoom); fix_wavehadj(); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "changed"); /* force zoom update */ gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "value_changed"); /* force zoom update */ DEBUG(printf("Zoombuttons Undo\n")); } void service_zoom_fit(GtkWidget *text, gpointer data) { (void)text; (void)data; gdouble estimated; int fixedwidth; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nZoom Best Fit"); help_text( " attempts a \"best fit\" to get the whole trace onscreen." " Note that the trace may be more or less than a whole screen since" " this isn't a \"perfect fit.\" Also, if the middle button baseline" " marker is nailed down, the zoom instead of getting the whole trace" " onscreen will use the part of the trace between the primary" " marker and the baseline marker." ); return; } if((GLOBALS->tims.baseline>=0)&&(GLOBALS->tims.marker>=0)) { service_dragzoom(GLOBALS->tims.baseline, GLOBALS->tims.marker); /* new semantics added to zoom between the two */ } else { if(GLOBALS->wavewidth>4) { fixedwidth=GLOBALS->wavewidth-4; } else { fixedwidth=GLOBALS->wavewidth; } estimated=-log(((gdouble)(GLOBALS->tims.last-GLOBALS->tims.first+1))/((gdouble)fixedwidth)*((gdouble)200.0))/log(GLOBALS->zoombase); if(estimated>((gdouble)(0.0))) estimated=((gdouble)(0.0)); GLOBALS->tims.prevzoom=GLOBALS->tims.zoom; GLOBALS->tims.timecache=0; calczoom(estimated); GLOBALS->tims.zoom=estimated; fix_wavehadj(); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "changed"); /* force zoom update */ gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "value_changed"); /* force zoom update */ } DEBUG(printf("Zoombuttons Fit\n")); } void service_zoom_full(GtkWidget *text, gpointer data) { (void)text; (void)data; gdouble estimated; int fixedwidth; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nZoom Full"); help_text( " attempts a \"best fit\" to get the whole trace onscreen." " Note that the trace may be more or less than a whole screen since" " this isn't a \"perfect fit.\"" ); return; } if(GLOBALS->wavewidth>4) { fixedwidth=GLOBALS->wavewidth-4; } else { fixedwidth=GLOBALS->wavewidth; } estimated=-log(((gdouble)(GLOBALS->tims.last-GLOBALS->tims.first+1))/((gdouble)fixedwidth)*((gdouble)200.0))/log(GLOBALS->zoombase); if(estimated>((gdouble)(0.0))) estimated=((gdouble)(0.0)); GLOBALS->tims.prevzoom=GLOBALS->tims.zoom; GLOBALS->tims.timecache=0; calczoom(estimated); GLOBALS->tims.zoom=estimated; fix_wavehadj(); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "changed"); /* force zoom update */ gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "value_changed"); /* force zoom update */ DEBUG(printf("Zoombuttons Full\n")); } void service_dragzoom(TimeType time1, TimeType time2) /* the function you've been waiting for... */ { gdouble estimated; int fixedwidth; TimeType temp; GtkAdjustment *hadj; Trptr t; int dragzoom_ok = 1; if(time2dragzoom_threshold) { TimeType tdelta = time2 - time1; gdouble x = tdelta * GLOBALS->pxns; if(xdragzoom_threshold) { dragzoom_ok = 0; } } if((time2>time1)&&(dragzoom_ok)) /* ensure at least 1 tick and dragzoom_threshold if set */ { if(GLOBALS->wavewidth>4) { fixedwidth=GLOBALS->wavewidth-4; } else { fixedwidth=GLOBALS->wavewidth; } estimated=-log(((gdouble)(time2-time1+1))/((gdouble)fixedwidth)*((gdouble)200.0))/log(GLOBALS->zoombase); if(estimated>((gdouble)(0.0))) estimated=((gdouble)(0.0)); GLOBALS->tims.prevzoom=GLOBALS->tims.zoom; GLOBALS->tims.timecache=GLOBALS->tims.laststart=GLOBALS->tims.start=time_trunc(time1); for(t=GLOBALS->traces.first;t;t=t->t_next) /* have to nuke string refs so printout is ok! */ { if(t->asciivalue) { free_2(t->asciivalue); t->asciivalue=NULL; } } for(t=GLOBALS->traces.buffer;t;t=t->t_next) { if(t->asciivalue) { free_2(t->asciivalue); t->asciivalue=NULL; } } if(!((GLOBALS->tims.baseline>=0)&&(GLOBALS->tims.marker>=0))) { update_markertime(GLOBALS->tims.marker=-1); } GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); hadj=GTK_ADJUSTMENT(GLOBALS->wave_hslider); hadj->value=time1; calczoom(estimated); GLOBALS->tims.zoom=estimated; fix_wavehadj(); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "changed"); /* force zoom update */ gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "value_changed"); /* force zoom update */ DEBUG(printf("Drag Zoom\n")); } } /* Create actual buttons */ GtkWidget * create_zoom_buttons (void) { GtkWidget *table; GtkWidget *table2; GtkWidget *frame; GtkWidget *main_vbox; GtkWidget *b1; GtkWidget *b2; GtkWidget *b3; GtkWidget *b4; GtkWidget *b5; GtkWidget *b6; GtkWidget *pixmapzout, *pixmapzin, *pixmapzfit, *pixmapzundo; GtkWidget *pixmapzleft, *pixmapzright; GtkTooltips *tooltips; tooltips=gtk_tooltips_new_2(); gtk_tooltips_set_delay_2(tooltips,1500); pixmapzin=gtk_pixmap_new(GLOBALS->zoomin_pixmap, GLOBALS->zoomin_mask); gtk_widget_show(pixmapzin); pixmapzout=gtk_pixmap_new(GLOBALS->zoomout_pixmap, GLOBALS->zoomout_mask); gtk_widget_show(pixmapzout); pixmapzfit=gtk_pixmap_new(GLOBALS->zoomfit_pixmap, GLOBALS->zoomfit_mask); gtk_widget_show(pixmapzfit); pixmapzundo=gtk_pixmap_new(GLOBALS->zoomundo_pixmap, GLOBALS->zoomundo_mask); gtk_widget_show(pixmapzundo); pixmapzleft=gtk_pixmap_new(GLOBALS->zoom_larrow_pixmap, GLOBALS->zoom_larrow_mask); gtk_widget_show(pixmapzleft); pixmapzright=gtk_pixmap_new(GLOBALS->zoom_rarrow_pixmap, GLOBALS->zoom_rarrow_mask); gtk_widget_show(pixmapzright); /* Create a table to hold the text widget and scrollbars */ table = gtk_table_new (1, 1, FALSE); main_vbox = gtk_vbox_new (FALSE, 1); gtk_container_border_width (GTK_CONTAINER (main_vbox), 1); gtk_container_add (GTK_CONTAINER (table), main_vbox); frame = gtk_frame_new ("Zoom "); gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0); gtk_widget_show (frame); gtk_widget_show (main_vbox); table2 = gtk_table_new (2, 3, FALSE); b1 = gtk_button_new(); gtk_container_add(GTK_CONTAINER(b1), pixmapzin); gtk_table_attach (GTK_TABLE (table2), b1, 0, 1, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); gtk_signal_connect_object (GTK_OBJECT (b1), "clicked", GTK_SIGNAL_FUNC(service_zoom_out), GTK_OBJECT (table2)); gtk_tooltips_set_tip_2(tooltips, b1, "Zoom Out", NULL); gtk_widget_show(b1); b2 = gtk_button_new(); gtk_container_add(GTK_CONTAINER(b2), pixmapzout); gtk_table_attach (GTK_TABLE (table2), b2, 0, 1, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); gtk_signal_connect_object (GTK_OBJECT (b2), "clicked", GTK_SIGNAL_FUNC(service_zoom_in), GTK_OBJECT (table2)); gtk_tooltips_set_tip_2(tooltips, b2, "Zoom In", NULL); gtk_widget_show(b2); b3 = gtk_button_new(); gtk_container_add(GTK_CONTAINER(b3), pixmapzfit); gtk_table_attach (GTK_TABLE (table2), b3, 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); gtk_signal_connect_object (GTK_OBJECT (b3), "clicked", GTK_SIGNAL_FUNC(service_zoom_fit), GTK_OBJECT (table2)); gtk_tooltips_set_tip_2(tooltips, b3, "Zoom Best Fit", NULL); gtk_widget_show(b3); b4 = gtk_button_new(); gtk_container_add(GTK_CONTAINER(b4), pixmapzundo); gtk_table_attach (GTK_TABLE (table2), b4, 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); gtk_signal_connect_object (GTK_OBJECT (b4), "clicked", GTK_SIGNAL_FUNC(service_zoom_undo), GTK_OBJECT (table2)); gtk_tooltips_set_tip_2(tooltips, b4, "Undo Last Zoom", NULL); gtk_widget_show(b4); b5 = gtk_button_new(); gtk_container_add(GTK_CONTAINER(b5), pixmapzleft); gtk_table_attach (GTK_TABLE (table2), b5, 2, 3, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); gtk_signal_connect_object (GTK_OBJECT (b5), "clicked", GTK_SIGNAL_FUNC(service_zoom_left), GTK_OBJECT (table2)); gtk_tooltips_set_tip_2(tooltips, b5, "Zoom To Start", NULL); gtk_widget_show(b5); b6 = gtk_button_new(); gtk_container_add(GTK_CONTAINER(b6), pixmapzright); gtk_table_attach (GTK_TABLE (table2), b6, 2, 3, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); gtk_signal_connect_object (GTK_OBJECT (b6), "clicked", GTK_SIGNAL_FUNC(service_zoom_right), GTK_OBJECT (table2)); gtk_tooltips_set_tip_2(tooltips, b6, "Zoom To End", NULL); gtk_widget_show(b6); gtk_container_add (GTK_CONTAINER (frame), table2); gtk_widget_show(table2); return table; } gtkwave-3.3.86/src/savefile.h0000664000175000017500000000324713166335473015350 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2012-2013. * * 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. */ #include "globals.h" #include #ifdef MAC_INTEGRATION #include #endif #ifndef __WAVE_SAVEFILE_H__ #define __WAVE_SAVEFILE_H__ /* These should eventually have error values */ void write_save_helper(const char *savnam, FILE *file); int read_save_helper(char *wname, char **dumpfile, char **savefile, off_t *dumpsiz, time_t *dumptim, int *opt_vcd); /* -1 = error, 0+ = number of lines read */ char *append_array_row(nptr n); int parsewavline(char *w, char *alias, int depth); int parsewavline_lx2(char *w, char *alias, int depth); char *find_dumpfile(char *orig_save, char *orig_dump, char *this_save); #ifdef MAC_INTEGRATION gboolean deal_with_finder_open(GtkosxApplication *app, gchar *path, gpointer user_data); gboolean deal_with_termination(GtkosxApplication *app, gpointer user_data); #endif gboolean deal_with_rpc_open(const gchar *path, gpointer user_data); gboolean deal_with_rpc_open_2(const gchar *path, gpointer user_data, gboolean is_save_file); gboolean process_finder_names_queued(void); char *process_finder_extract_queued_name(void); gboolean process_finder_name_integration(void); void read_save_helper_relative_init(char *wname); int suffix_check(const char *s, const char *sfx); char *extract_dumpname_from_save_file(char *lcname, gboolean *modified, int *opt_vcd); char *get_relative_adjusted_name(char *sfn, char *dfn, char *lcname); #endif gtkwave-3.3.86/src/vcd_keywords.c0000664000175000017500000001545013166335473016247 0ustar bybellbybell/* C code produced by gperf version 3.0.4 */ /* Command-line: /usr/bin/gperf -o -i 1 -C -k '1,$' -L C -H keyword_hash -N check_identifier -tT ./vcd_keywords.gperf */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif #line 1 "./vcd_keywords.gperf" /* AIX may need this for alloca to work */ #if defined _AIX #pragma alloca #endif #include #include #include "vcd.h" struct vcd_keyword { const char *name; int token; }; #define TOTAL_KEYWORDS 33 #define MIN_WORD_LENGTH 2 #define MAX_WORD_LENGTH 14 #define MIN_HASH_VALUE 5 #define MAX_HASH_VALUE 69 /* maximum key range = 65, duplicates = 0 */ #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static unsigned int keyword_hash (str, len) register const char *str; register unsigned int len; { static const unsigned char asso_values[] = { 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 36, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 56, 51, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 26, 26, 1, 36, 1, 70, 36, 6, 70, 31, 1, 1, 70, 16, 1, 6, 1, 6, 1, 70, 70, 21, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70 }; return len + asso_values[(unsigned char)str[len - 1]] + asso_values[(unsigned char)str[0]+1]; } #ifdef __GNUC__ __inline #if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__ __attribute__ ((__gnu_inline__)) #endif #endif const struct vcd_keyword * check_identifier (str, len) register const char *str; register unsigned int len; { static const struct vcd_keyword wordlist[] = { {""}, {""}, {""}, {""}, {""}, #line 23 "./vcd_keywords.gperf" {"reg", V_REG}, #line 26 "./vcd_keywords.gperf" {"time", V_TIME}, {""}, #line 30 "./vcd_keywords.gperf" {"trireg", V_TRIREG}, #line 37 "./vcd_keywords.gperf" {"in", V_IN}, #line 22 "./vcd_keywords.gperf" {"realtime", V_REALTIME}, #line 36 "./vcd_keywords.gperf" {"port", V_PORT}, #line 29 "./vcd_keywords.gperf" {"trior", V_TRIOR}, #line 40 "./vcd_keywords.gperf" {"string", V_STRINGTYPE}, #line 45 "./vcd_keywords.gperf" {"longint", V_LONGINT}, #line 43 "./vcd_keywords.gperf" {"int", V_INT}, #line 18 "./vcd_keywords.gperf" {"parameter", V_PARAMETER}, #line 39 "./vcd_keywords.gperf" {"inout", V_INOUT}, {""}, #line 19 "./vcd_keywords.gperf" {"integer", V_INTEGER}, #line 44 "./vcd_keywords.gperf" {"shortint", V_SHORTINT}, #line 21 "./vcd_keywords.gperf" {"real_parameter", V_REAL_PARAMETER}, {""}, {""}, {""}, #line 38 "./vcd_keywords.gperf" {"out", V_OUT}, #line 34 "./vcd_keywords.gperf" {"wire", V_WIRE}, {""}, {""}, {""}, #line 35 "./vcd_keywords.gperf" {"wor", V_WOR}, #line 46 "./vcd_keywords.gperf" {"byte", V_BYTE}, #line 42 "./vcd_keywords.gperf" {"logic", V_LOGIC}, #line 28 "./vcd_keywords.gperf" {"triand", V_TRIAND}, {""}, #line 41 "./vcd_keywords.gperf" {"bit", V_BIT}, #line 20 "./vcd_keywords.gperf" {"real", V_REAL}, {""}, {""}, {""}, #line 27 "./vcd_keywords.gperf" {"tri", V_TRI}, #line 47 "./vcd_keywords.gperf" {"enum", V_ENUM}, {""}, {""}, {""}, {""}, #line 48 "./vcd_keywords.gperf" {"shortreal", V_SHORTREAL}, #line 17 "./vcd_keywords.gperf" {"event", V_EVENT}, {""}, {""}, {""}, #line 33 "./vcd_keywords.gperf" {"wand", V_WAND}, {""}, {""}, {""}, {""}, #line 32 "./vcd_keywords.gperf" {"tri1", V_TRI1}, {""}, {""}, {""}, {""}, #line 31 "./vcd_keywords.gperf" {"tri0", V_TRI0}, {""}, {""}, #line 25 "./vcd_keywords.gperf" {"supply1", V_SUPPLY1}, {""}, #line 49 "./vcd_keywords.gperf" {"$end", V_END}, {""}, {""}, #line 24 "./vcd_keywords.gperf" {"supply0", V_SUPPLY0} }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register int key = keyword_hash (str, len); if (key <= MAX_HASH_VALUE && key >= 0) { register const char *s = wordlist[key].name; if (*str == *s && !strcmp (str + 1, s + 1)) return &wordlist[key]; } } return 0; } #line 50 "./vcd_keywords.gperf" int vcd_keyword_code(const char *s, unsigned int len) { const struct vcd_keyword *rc = check_identifier(s, len); return(rc ? rc->token : V_STRING); } gtkwave-3.3.86/src/twinwave.c0000664000175000017500000002435213166335473015411 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2006-2009. * * 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. */ #include #include #include #include #ifdef __MINGW32__ #include #undef MINGW_USE_XID #endif #include "wave_locale.h" #include #include #include #include "debug.h" #ifdef WAVE_USE_GTK2 static int use_embedded = 1; #endif #if !defined _MSC_VER && defined WAVE_USE_GTK2 static int plug_removed(GtkWidget *widget, gpointer data) { (void)widget; (void)data; static int cnt = 2; fprintf(stderr, "GtkPlug removed\n"); cnt--; if(cnt==0) { fprintf(stderr, "No GtkPlugs left, exiting.\n"); gtk_exit(0); } return(FALSE); /* TRUE would keep xsocket open */ } int quit_callback (GtkWidget *widget, gpointer data) { (void)widget; fprintf(stderr,"%s\n", (char *)data); gtk_exit(0); return(FALSE); } int main(int argc, char **argv) { struct gtkwave_dual_ipc_t *dual_ctx; char buf[257], buf2[257]; int shmid; GtkWidget *main_vbox, *mainwindow, *vpan; int i; int split_point = -1; #ifdef __MINGW32__ char mapName[65]; HANDLE hMapFile; #endif GtkWidget *xsocket[2] = { NULL, NULL }; WAVE_LOCALE_FIX if(!gtk_init_check(&argc, &argv)) { printf("Could not initialize GTK! Is DISPLAY env var/xhost set?\n\n"); exit(255); } #ifdef __CYGWIN__ fprintf(stderr, "TWINWAVE| If the viewer crashes with a Bad system call error,\n"); fprintf(stderr, "TWINWAVE| make sure that Cygserver is enabled.\n"); #endif for(i=0;i=0) { struct shmid_ds ds; dual_ctx = shmat(shmid, NULL, 0); if(dual_ctx) { memset(dual_ctx, 0, 2 * sizeof(struct gtkwave_dual_ipc_t)); memcpy(&dual_ctx[0].matchword, DUAL_MATCHWORD, 4); memcpy(&dual_ctx[1].matchword, DUAL_MATCHWORD, 4); #ifdef __linux__ shmctl(shmid, IPC_RMID, &ds); /* mark for destroy */ #endif if(fork()) { if(fork()) { struct timeval tv; for(;;) { tv.tv_sec = 0; tv.tv_usec = 1000000 / 5; select(0, NULL, NULL, NULL, &tv); while (gtk_events_pending()) gtk_main_iteration(); if((!dual_ctx[0].viewer_is_initialized)&&(dual_ctx[1].viewer_is_initialized)) { gtk_window_set_title(GTK_WINDOW(mainwindow), "TwinWave Waiting on Viewer #1"); } else if((dual_ctx[0].viewer_is_initialized)&&(!dual_ctx[1].viewer_is_initialized)) { gtk_window_set_title(GTK_WINDOW(mainwindow), "TwinWave Waiting on Viewer #2"); } else if((dual_ctx[0].viewer_is_initialized)&&(dual_ctx[1].viewer_is_initialized)) { gtk_window_set_title(GTK_WINDOW(mainwindow), "TwinWave"); break; } } #ifndef __linux__ while (gtk_events_pending()) gtk_main_iteration(); sleep(2); shmctl(shmid, IPC_RMID, &ds); /* mark for destroy */ #endif if(use_embedded) { gtk_main(); } } else { int n_items = split_point + 5; char **arglist = calloc(n_items, sizeof(char *)); sprintf(buf, "0+%08X", shmid); if(use_embedded) { sprintf(buf2, "%x", gtk_socket_get_id (GTK_SOCKET(xsocket[0]))); } else { sprintf(buf2, "%x", 0); } arglist[0] = "gtkwave"; arglist[1] = "-D"; arglist[2] = buf; arglist[3] = "-X"; arglist[4] = buf2; for(i=1;i #include "globals.h" #include #ifndef _MSC_VER #include #ifndef __MINGW32__ #include #endif #else #include #endif #include #include #include #include #include #include "symbol.h" #include "vcd.h" #include "lxt.h" #include "bsearch.h" #include "hierpack.h" #ifdef _WAVE_HAVE_JUDY #include #endif /* * s_selected accessors */ #ifdef _WAVE_HAVE_JUDY char get_s_selected(struct symbol *s) { int rc = Judy1Test(GLOBALS->s_selected, (Word_t)s, PJE0); return(rc); } char set_s_selected(struct symbol *s, char value) { if(value) { Judy1Set ((Pvoid_t)&GLOBALS->s_selected, (Word_t)s, PJE0); } else { Judy1Unset ((Pvoid_t)&GLOBALS->s_selected, (Word_t)s, PJE0); } return(value); } void destroy_s_selected(void) { Judy1FreeArray(&GLOBALS->s_selected, PJE0); GLOBALS->s_selected = NULL; } #else char get_s_selected(struct symbol *s) { return(s->s_selected); } char set_s_selected(struct symbol *s, char value) { return((s->s_selected = value)); } void destroy_s_selected(void) { /* nothing */ } #endif /* * hash create/destroy */ void sym_hash_initialize(void *g) { #ifdef _WAVE_HAVE_JUDY ((struct Global *)g)->sym_judy = NULL; #else ((struct Global *)g)->sym_hash=(struct symbol **)calloc_2(SYMPRIME,sizeof(struct symbol *)); #endif } void sym_hash_destroy(void *g) { struct Global *gg = (struct Global *)g; #ifdef _WAVE_HAVE_JUDY JudySLFreeArray(&gg->sym_judy, PJE0); gg->sym_judy = NULL; #else if(gg->sym_hash) { free_2(gg->sym_hash); gg->sym_hash = NULL; } #endif } /* * Generic hash function for symbol names... */ int hash(char *s) { #ifndef _WAVE_HAVE_JUDY char *p; char ch; unsigned int h=0, h2=0, pos=0, g; for(p=s;*p;p++) { ch=*p; h2<<=3; h2-=((unsigned int)ch+(pos++)); /* this handles stranded vectors quite well.. */ h=(h<<4)+ch; if((g=h&0xf0000000)) { h=h^(g>>24); h=h^g; } } h^=h2; /* combine the two hashes */ GLOBALS->hashcache=h%SYMPRIME; #else (void)s; #endif return(GLOBALS->hashcache); } /* * add symbol to table. no duplicate checking * is necessary as aet's are "correct." */ struct symbol *symadd(char *name, int hv) { struct symbol *s=(struct symbol *)calloc_2(1,sizeof(struct symbol)); #ifdef _WAVE_HAVE_JUDY (void)hv; PPvoid_t PPValue = JudySLIns(&GLOBALS->sym_judy, (uint8_t *)name, PJE0); *((struct symbol **)PPValue) = s; #else strcpy(s->name=(char *)malloc_2(strlen(name)+1),name); s->sym_next=GLOBALS->sym_hash[hv]; GLOBALS->sym_hash[hv]=s; #endif return(s); } struct symbol *symadd_name_exists(char *name, int hv) { struct symbol *s=(struct symbol *)calloc_2(1,sizeof(struct symbol)); #ifdef _WAVE_HAVE_JUDY (void)hv; PPvoid_t PPValue = JudySLIns(&GLOBALS->sym_judy, (uint8_t *)name, PJE0); *((struct symbol **)PPValue) = s; s->name = name; /* redundant for now */ #else s->name = name; s->sym_next=GLOBALS->sym_hash[hv]; GLOBALS->sym_hash[hv]=s; #endif return(s); } /* * find a slot already in the table... */ static struct symbol *symfind_2(char *s, unsigned int *rows_return) { #ifndef _WAVE_HAVE_JUDY int hv; struct symbol *temp; #endif if(!GLOBALS->facs_are_sorted) { #ifdef _WAVE_HAVE_JUDY PPvoid_t PPValue = JudySLGet(GLOBALS->sym_judy, (uint8_t *)s, PJE0); if(PPValue) { return(*(struct symbol **)PPValue); } #else hv=hash(s); if(!(temp=GLOBALS->sym_hash[hv])) return(NULL); /* no hash entry, add here wanted to add */ while(temp) { if(!strcmp(temp->name,s)) { return(temp); /* in table already */ } if(!temp->sym_next) break; temp=temp->sym_next; } #endif return(NULL); /* not found, add here if you want to add*/ } else /* no sense hashing if the facs table is built */ { struct symbol *sr; DEBUG(printf("BSEARCH: %s\n",s)); sr = bsearch_facs(s, rows_return); if(sr) { } else { /* this is because . is > in ascii than chars like $ but . was converted to 0x1 on sort */ char *s2; int i; int mat; #ifndef WAVE_HIERFIX if(!GLOBALS->escaped_names_found_vcd_c_1) { return(sr); } #endif if(GLOBALS->facs_have_symbols_state_machine == 0) { if(GLOBALS->escaped_names_found_vcd_c_1) { mat = 1; } else { mat = 0; for(i=0;inumfacs;i++) { int was_packed = HIER_DEPACK_STATIC; char *hfacname = NULL; hfacname = hier_decompress_flagged(GLOBALS->facs[i]->name, &was_packed); s2 = hfacname; while(*s2) { if(*s2 < GLOBALS->hier_delimeter) { mat = 1; break; } s2++; } /* if(was_packed) { free_2(hfacname); } ...not needed with HIER_DEPACK_STATIC */ if(mat) { break; } } } if(mat) { GLOBALS->facs_have_symbols_state_machine = 1; } else { GLOBALS->facs_have_symbols_state_machine = 2; } /* prevent code below from executing */ } if(GLOBALS->facs_have_symbols_state_machine == 1) { mat = 0; for(i=0;inumfacs;i++) { int was_packed = HIER_DEPACK_STATIC; char *hfacname = NULL; hfacname = hier_decompress_flagged(GLOBALS->facs[i]->name, &was_packed); if(!strcmp(hfacname, s)) { mat = 1; } /* if(was_packed) { free_2(hfacname); } ...not needed with HIER_DEPACK_STATIC */ if(mat) { sr = GLOBALS->facs[i]; break; } } } } return(sr); } } struct symbol *symfind(char *s, unsigned int *rows_return) { struct symbol *s_pnt = symfind_2(s, rows_return); if(!s_pnt) { int len = strlen(s); if(len) { char ch = s[len-1]; if((ch != ']') && (ch != '}')) { char *s2 = wave_alloca(len + 4); memcpy(s2, s, len); strcpy(s2+len, "[0]"); /* bluespec vs modelsim */ s_pnt = symfind_2(s2, rows_return); } } } return(s_pnt); } gtkwave-3.3.86/src/signalwindow.c0000664000175000017500000013027513166335473016254 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2013. * * 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. */ #include "globals.h" #include #include #include "gtk12compat.h" #include "currenttime.h" #include "pixmaps.h" #include "symbol.h" #include "debug.h" #undef FOCUS_DEBUG_MSGS /* * complain about certain ops conflict with dnd... */ void dnd_error(void) { status_text("Can't perform that operation when waveform drag and drop is in progress!\n"); } static void service_hslider(GtkWidget *text, gpointer data) { (void)text; (void)data; GtkAdjustment *hadj; gint xsrc; if(GLOBALS->signalpixmap) { hadj=GTK_ADJUSTMENT(GLOBALS->signal_hslider); xsrc=(gint)hadj->value; DEBUG(printf("Signal HSlider Moved to %d\n",xsrc)); GLOBALS->right_align_active = 0; gdk_draw_rectangle(GLOBALS->signalpixmap, GLOBALS->gc.gc_mdgray, TRUE, 0, -1, GLOBALS->signal_fill_width, GLOBALS->fontheight); gdk_draw_line(GLOBALS->signalpixmap, GLOBALS->gc_white, 0, GLOBALS->fontheight-1, GLOBALS->signal_fill_width-1, GLOBALS->fontheight-1); font_engine_draw_string(GLOBALS->signalpixmap, GLOBALS->signalfont, GLOBALS->gc_black, 3+xsrc, GLOBALS->fontheight-4, "Time"); if(GLOBALS->signalarea_has_focus) { gdk_draw_pixmap(GLOBALS->signalarea->window, GLOBALS->signalarea->style->fg_gc[GTK_WIDGET_STATE(GLOBALS->signalarea)],GLOBALS->signalpixmap, xsrc+1, 0+1, 0+1, 0+1, GLOBALS->signalarea->allocation.width-2, GLOBALS->signalarea->allocation.height-2); draw_signalarea_focus(); } else { gdk_draw_pixmap(GLOBALS->signalarea->window, GLOBALS->signalarea->style->fg_gc[GTK_WIDGET_STATE(GLOBALS->signalarea)],GLOBALS->signalpixmap,xsrc, 0,0, 0,GLOBALS->signalarea->allocation.width, GLOBALS->signalarea->allocation.height); } } } void draw_signalarea_focus(void) { if(GLOBALS->signalarea_has_focus) { gdk_draw_rectangle(GLOBALS->signalarea->window, GLOBALS->gc_black, FALSE, 0, 0, GLOBALS->signalarea->allocation.width-1, GLOBALS->signalarea->allocation.height-1); } } /**************************************************************************/ /*** standard click routines turned on with "use_standard_clicking"=1 ***/ /* * DND "drag_begin" handler, this is called whenever a drag starts. */ static void DNDBeginCB( GtkWidget *widget, GdkDragContext *dc, gpointer data ) { (void)widget; (void)dc; (void)data; GLOBALS->dnd_state = 1; } /* * DND "drag_end" handler, this is called when a drag and drop has * completed. So this function is the last one to be called in * any given DND operation. */ static void DNDEndCB( GtkWidget *widget, GdkDragContext *dc, gpointer data ) { (void)widget; (void)dc; (void)data; GtkWidget *ddest; int which; gdouble x,y; GdkModifierType state; Trptr t; int trwhich, trtarget; int must_update_screen = 0; #ifdef WAVE_USE_GTK2 gint xi, yi; #else GdkEventMotion event[1]; event[0].deviceid = GDK_CORE_POINTER; #endif if(GLOBALS->std_dnd_tgt_on_signalarea || GLOBALS->std_dnd_tgt_on_wavearea) { GtkAdjustment *wadj; wadj=GTK_ADJUSTMENT(GLOBALS->wave_vslider); WAVE_GDK_GET_POINTER(GLOBALS->std_dnd_tgt_on_signalarea ? GLOBALS->signalarea->window : GLOBALS->wavearea->window, &x, &y, &xi, &yi, &state); WAVE_GDK_GET_POINTER_COPY; which=(int)(y); which=(which/GLOBALS->fontheight)-2; if(which < -1) which = -1; trtarget=((int)wadj->value)+which; ddest = (GLOBALS->std_dnd_tgt_on_signalarea) ? GTK_WIDGET(GLOBALS->signalarea) : GTK_WIDGET(GLOBALS->wavearea); if((x<0)||(x>=ddest->allocation.width)||(y<0)||(y>=ddest->allocation.height)) { goto bot; } GLOBALS->cachedtrace=t=GLOBALS->traces.first; trwhich=0; while(t) { if((trwhicht_next && IsGroupEnd(t->t_next) && IsCollapsed(t->t_next)) { /* added missing "t &&" because of possible while termination above */ t = t->t_next; } GLOBALS->cachedtrace=t; if(GLOBALS->cachedtrace) { while(t) { if(!(t->flags&TR_HIGHLIGHT)) { GLOBALS->cachedtrace = t; if(CutBuffer()) { /* char buf[32]; sprintf(buf,"Dragging %d trace%s.\n",GLOBALS->traces.buffercount,GLOBALS->traces.buffercount!=1?"s":""); status_text(buf); */ must_update_screen = 1; } GLOBALS->cachedtrace->flags|=TR_HIGHLIGHT; goto success; } t=GivePrevTrace(t); } goto bot; } success: if( ((which<0) && (GLOBALS->topmost_trace==GLOBALS->traces.first) && PrependBuffer()) || (PasteBuffer()) ) /* short circuit on special which<0 case */ { /* status_text("Drop completed.\n"); */ if(GLOBALS->cachedtrace) { GLOBALS->cachedtrace->flags&=~TR_HIGHLIGHT; } GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); must_update_screen = 0; } } bot: if(must_update_screen) { MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } GLOBALS->dnd_cursor_timer = 0; GLOBALS->dnd_state = 0; GLOBALS->standard_trace_dnd_degate = 1; } /* * DND "drag_motion" handler, this is called whenever the * pointer is dragging over the target widget. */ static gboolean DNDDragMotionCB( GtkWidget *widget, GdkDragContext *dc, gint xx, gint yy, guint tt, gpointer data ) { (void)xx; (void)yy; (void)data; #ifndef WAVE_USE_GTK2 (void)tt; #endif gboolean same_widget; #ifdef WAVE_USE_GTK2 GdkDragAction suggested_action; #endif GtkWidget *src_widget, *tar_widget; if((widget == NULL) || (dc == NULL)) return(FALSE); /* Get source widget and target widget. */ src_widget = gtk_drag_get_source_widget(dc); tar_widget = widget; /* Note if source widget is the same as the target. */ same_widget = (src_widget == tar_widget) ? TRUE : FALSE; if(same_widget) { /* nothing */ } GLOBALS->std_dnd_tgt_on_signalarea = (tar_widget == GLOBALS->signalarea); GLOBALS->std_dnd_tgt_on_wavearea = (tar_widget == GLOBALS->wavearea); #ifdef WAVE_USE_GTK2 /* If this is the same widget, our suggested action should be * move. For all other case we assume copy. */ suggested_action = GDK_ACTION_MOVE; /* Respond with default drag action (status). First we check * the dc's list of actions. If the list only contains * move, copy, or link then we select just that, otherwise we * return with our default suggested action. * If no valid actions are listed then we respond with 0. */ /* Only move? */ if(dc->actions == GDK_ACTION_MOVE) gdk_drag_status(dc, GDK_ACTION_MOVE, tt); /* Only copy? */ else if(dc->actions == GDK_ACTION_COPY) gdk_drag_status(dc, GDK_ACTION_COPY, tt); /* Only link? */ else if(dc->actions == GDK_ACTION_LINK) gdk_drag_status(dc, GDK_ACTION_LINK, tt); /* Other action, check if listed in our actions list? */ else if(dc->actions & suggested_action) gdk_drag_status(dc, suggested_action, tt); /* All else respond with 0. */ else gdk_drag_status(dc, 0, tt); #endif if(GLOBALS->std_dnd_tgt_on_signalarea || GLOBALS->std_dnd_tgt_on_wavearea) { GtkAdjustment *wadj; GtkWidget *ddest; int which; gdouble x,y; GdkModifierType state; Trptr t; int trwhich, trtarget; #ifdef WAVE_USE_GTK2 gint xi, yi; #else GdkEventMotion event[1]; event[0].deviceid = GDK_CORE_POINTER; #endif wadj=GTK_ADJUSTMENT(GLOBALS->wave_vslider); WAVE_GDK_GET_POINTER(GLOBALS->std_dnd_tgt_on_signalarea ? GLOBALS->signalarea->window : GLOBALS->wavearea->window, &x, &y, &xi, &yi, &state); WAVE_GDK_GET_POINTER_COPY; which=(int)(y); which=(which/GLOBALS->fontheight)-2; if(which < -1) which = -1; trtarget=((int)wadj->value)+which; ddest = (GLOBALS->std_dnd_tgt_on_signalarea) ? GTK_WIDGET(GLOBALS->signalarea) : GTK_WIDGET(GLOBALS->wavearea); if((x<0)||(x>=ddest->allocation.width)||(y<0)||(y>=ddest->allocation.height)) { goto bot; } t=GLOBALS->traces.first; trwhich=0; while(t) { if((trwhicht_next && IsGroupEnd(t->t_next) && IsCollapsed(t->t_next)) { t = t->t_next; } /* if(t) */ /* { */ /* while(t) */ /* { */ /* if(t->flags & TR_HIGHLIGHT) */ /* { */ /* t=GivePrevTrace(t); */ /* which--; */ /* } */ /* else */ /* { */ /* break; */ /* } */ /* } */ /* } */ if(1) { GtkAdjustment *hadj=GTK_ADJUSTMENT(GLOBALS->signal_hslider); GtkAdjustment *sadj=GTK_ADJUSTMENT(GLOBALS->wave_vslider); int rsig_trtarget=(int)(sadj->value); gint xsrc=(gint)hadj->value; gint ylin; gdk_draw_rectangle(GLOBALS->signalpixmap, GLOBALS->gc.gc_ltgray, TRUE, 0, 0, GLOBALS->signal_fill_width, GLOBALS->signalarea->allocation.height); RenderSigs(rsig_trtarget, 0); GLOBALS->dnd_cursor_timer = 1; if((t)&&(which >= -1)) { if(which >= GLOBALS->traces.total) { which = GLOBALS->traces.total-1; } ylin = ((which + 2) * GLOBALS->fontheight) - 2; gdk_draw_line(GLOBALS->signalpixmap, GLOBALS->gc_black, 0, ylin, GLOBALS->signal_fill_width-1, ylin); } else { int i; which = -1; ylin = ((which + 2) * GLOBALS->fontheight) - 2; for(i=0;isignal_fill_width-1; i+=16) { gdk_draw_line(GLOBALS->signalpixmap, GLOBALS->gc_black, i, ylin, i+7, ylin); gdk_draw_line(GLOBALS->signalpixmap, GLOBALS->gc_white, i+8, ylin, i+15, ylin); } } gdk_draw_pixmap(GLOBALS->signalarea->window, GLOBALS->signalarea->style->fg_gc[GTK_WIDGET_STATE(GLOBALS->signalarea)], GLOBALS->signalpixmap, xsrc, 0, 0, 0, GLOBALS->signalarea->allocation.width, GLOBALS->signalarea->allocation.height); /* printf("drop to %d of %d: '%s'\n", which, GLOBALS->traces.total, t ? t->name : "undef"); */ } bot: return(FALSE); } return(FALSE); } static gboolean ignoreAccelerators(GdkEventKey *event) { if(!GLOBALS || !GLOBALS->filter_entry || !event) { return(FALSE); } else { #ifdef MAC_INTEGRATION return (GTK_WIDGET_HAS_FOCUS(GLOBALS->filter_entry)); #else return (GTK_WIDGET_HAS_FOCUS(GLOBALS->filter_entry) && !(event->state & GDK_CONTROL_MASK) && !(event->state & GDK_MOD1_MASK)); #endif } } /* * keypress processing, return TRUE to block the event from gtk */ static gint keypress_local(GtkWidget *widget, GdkEventKey *event, gpointer data) { (void)widget; (void)data; GtkAdjustment *wadj; int num_traces_displayable; int target; int which; gint rc = FALSE; int yscroll; #ifdef FOCUS_DEBUG_MSGS printf("focus: %d %08x %08x %08x\n", GTK_WIDGET_HAS_FOCUS(GLOBALS->signalarea_event_box), GLOBALS->signalarea_event_box, widget, data); #endif if(GTK_WIDGET_HAS_FOCUS(GLOBALS->signalarea_event_box)) { switch(event->keyval) { #ifdef MAC_INTEGRATION /* need to do this, otherwise if a menu accelerator it steals the key from gtk */ case GDK_a: if(event->state & GDK_MOD2_MASK) { menu_dataformat_highlight_all(NULL, 0, NULL); rc = TRUE; } break; case GDK_A: if(event->state & GDK_MOD2_MASK) { menu_dataformat_unhighlight_all(NULL, 0, NULL); rc = TRUE; } break; case GDK_x: if(event->state & GDK_MOD2_MASK) { menu_cut_traces(NULL, 0, NULL); rc = TRUE; } break; case GDK_c: if(event->state & GDK_MOD2_MASK) { menu_copy_traces(NULL, 0, NULL); rc = TRUE; } break; case GDK_v: if(event->state & GDK_MOD2_MASK) { menu_paste_traces(NULL, 0, NULL); rc = TRUE; } break; #endif case GDK_Page_Up: case GDK_KP_Page_Up: case GDK_Page_Down: case GDK_KP_Page_Down: case GDK_Up: case GDK_KP_Up: case GDK_Down: case GDK_KP_Down: wadj=GTK_ADJUSTMENT(GLOBALS->wave_vslider); num_traces_displayable=(GLOBALS->signalarea->allocation.height)/(GLOBALS->fontheight); num_traces_displayable--; /* for the time trace that is always there */ if(num_traces_displayabletraces.visible) { switch(event->keyval) { case GDK_Down: case GDK_KP_Down: case GDK_Page_Down: case GDK_KP_Page_Down: yscroll = ((event->keyval == GDK_Page_Down) || (event->keyval == GDK_KP_Page_Down)) ? num_traces_displayable : 1; target=((int)wadj->value)+yscroll; which=num_traces_displayable-1; if(target+which>=(GLOBALS->traces.visible-1)) target=GLOBALS->traces.visible-which-1; wadj->value=target; if(GLOBALS->cachedwhich_signalwindow_c_1==which) GLOBALS->cachedwhich_signalwindow_c_1=which-1; /* force update */ gtk_signal_emit_by_name (GTK_OBJECT (wadj), "changed"); /* force bar update */ gtk_signal_emit_by_name (GTK_OBJECT (wadj), "value_changed"); /* force text update */ break; case GDK_Up: case GDK_KP_Up: case GDK_Page_Up: case GDK_KP_Page_Up: yscroll = ((event->keyval == GDK_Page_Up) || (event->keyval == GDK_KP_Page_Up)) ? num_traces_displayable : 1; target=((int)wadj->value)-yscroll; if(target<0) target=0; wadj->value=target; which=0; if(GLOBALS->cachedwhich_signalwindow_c_1==which) GLOBALS->cachedwhich_signalwindow_c_1=-1; /* force update */ gtk_signal_emit_by_name (GTK_OBJECT (wadj), "changed"); /* force bar update */ gtk_signal_emit_by_name (GTK_OBJECT (wadj), "value_changed"); /* force text update */ break; } } rc = TRUE; break; case GDK_Left: case GDK_KP_Left: service_left_edge(NULL, 0); /* hadj=GTK_ADJUSTMENT(GLOBALS->signal_hslider); if(hadj->value < hadj->page_increment) { hadj->value = (gfloat)0.0; } else { hadj->value = hadj->value - hadj->page_increment; } gtk_signal_emit_by_name (GTK_OBJECT (hadj), "changed"); gtk_signal_emit_by_name (GTK_OBJECT (hadj), "value_changed"); signalarea_configure_event(GLOBALS->signalarea, NULL); */ rc = TRUE; break; case GDK_Right: case GDK_KP_Right: service_right_edge(NULL, 0); /* hadj=GTK_ADJUSTMENT(GLOBALS->signal_hslider); if( ((int) hadj->value + hadj->page_increment) >= hadj->upper) { hadj->value = (gfloat)(hadj->upper)-hadj->page_increment; } else { hadj->value = hadj->value + hadj->page_increment; } gtk_signal_emit_by_name (GTK_OBJECT (hadj), "changed"); gtk_signal_emit_by_name (GTK_OBJECT (hadj), "value_changed"); signalarea_configure_event(GLOBALS->signalarea, NULL); */ rc = TRUE; break; default: #ifdef FOCUS_DEBUG_MSGS printf("key %x, widget: %08x\n", event->keyval, widget); #endif break; } } else if(GLOBALS->dnd_sigview) { if(GTK_WIDGET_HAS_FOCUS(GLOBALS->dnd_sigview) || GTK_WIDGET_HAS_FOCUS(GLOBALS->filter_entry)) { switch(event->keyval) { case GDK_a: #ifdef MAC_INTEGRATION if(event->state & GDK_META_MASK) #else if(event->state & GDK_CONTROL_MASK) #endif { treeview_select_all_callback(); rc = TRUE; } break; case GDK_A: #ifdef MAC_INTEGRATION if(event->state & GDK_META_MASK) #else if(event->state & GDK_CONTROL_MASK) #endif { treeview_unselect_all_callback(); rc = TRUE; } default: break; } } else if(GTK_WIDGET_HAS_FOCUS(GLOBALS->tree_treesearch_gtk2_c_1)) { switch(event->keyval) { case GDK_a: #ifdef MAC_INTEGRATION if(event->state & GDK_META_MASK) #else if(event->state & GDK_CONTROL_MASK) #endif { /* eat keystroke */ rc = TRUE; } break; case GDK_A: #ifdef MAC_INTEGRATION if(event->state & GDK_META_MASK) #else if(event->state & GDK_CONTROL_MASK) #endif { /* eat keystroke */ rc = TRUE; } default: break; } } } if (ignoreAccelerators(event)) { gtk_widget_event(GLOBALS->filter_entry, (GdkEvent *)event); /* eat keystroke */ rc = TRUE; } return(rc); } #ifdef WAVE_USE_GTK2 static gint scroll_event( GtkWidget * widget, GdkEventScroll * event ) { GdkEventKey ev_fake; DEBUG(printf("Mouse Scroll Event\n")); switch ( event->direction ) { case GDK_SCROLL_UP: ev_fake.keyval = GDK_Up; keypress_local(widget, &ev_fake, GLOBALS->signalarea_event_box); break; case GDK_SCROLL_DOWN: ev_fake.keyval = GDK_Down; keypress_local(widget, &ev_fake, GLOBALS->signalarea_event_box); default: break; } return(TRUE); } #endif #ifdef WAVE_ALLOW_QUARTZ_FLUSH_WORKAROUND #ifdef MAC_INTEGRATION static gboolean osx_timer(gpointer dummy) { if(GLOBALS) { if(GLOBALS->force_hide_show == 2) { if((GLOBALS->signalarea)&&(GLOBALS->wavearea)) { gtk_widget_hide(GLOBALS->signalarea); gtk_widget_show(GLOBALS->signalarea); gtk_widget_hide(GLOBALS->wavearea); gtk_widget_show(GLOBALS->wavearea); } } if(GLOBALS->force_hide_show) { GLOBALS->force_hide_show--; } } return(TRUE); } #endif #endif static gboolean mouseover_timer(gpointer dummy) { (void)dummy; static gboolean run_once = FALSE; gdouble x,y; GdkModifierType state; TraceEnt t_trans; #ifdef WAVE_USE_GTK2 gint xi, yi; #else GdkEventMotion event[1]; event[0].deviceid = GDK_CORE_POINTER; #endif if(GLOBALS->button2_debounce_flag) { GLOBALS->button2_debounce_flag = 0; } if((GLOBALS->dnd_state)||(GLOBALS->tree_dnd_begin)) /* drag scroll on DnD */ { GtkAdjustment *wadj; int num_traces_displayable; int target; int which; int yscroll; WAVE_GDK_GET_POINTER(GLOBALS->signalarea->window, &x, &y, &xi, &yi, &state); WAVE_GDK_GET_POINTER_COPY; if(y > GLOBALS->signalarea->allocation.height) { wadj=GTK_ADJUSTMENT(GLOBALS->wave_vslider); num_traces_displayable=(GLOBALS->signalarea->allocation.height)/(GLOBALS->fontheight); num_traces_displayable--; /* for the time trace that is always there */ if(num_traces_displayabletraces.visible) { yscroll = 1; target=((int)wadj->value)+yscroll; which=num_traces_displayable-1; if(target+which>=(GLOBALS->traces.visible-1)) target=GLOBALS->traces.visible-which-1; wadj->value=target; if(GLOBALS->cachedwhich_signalwindow_c_1==which) GLOBALS->cachedwhich_signalwindow_c_1=which-1; /* force update */ gtk_signal_emit_by_name (GTK_OBJECT (wadj), "changed"); /* force bar update */ gtk_signal_emit_by_name (GTK_OBJECT (wadj), "value_changed"); /* force text update */ } } else if(y < 0) { wadj=GTK_ADJUSTMENT(GLOBALS->wave_vslider); num_traces_displayable=(GLOBALS->signalarea->allocation.height)/(GLOBALS->fontheight); num_traces_displayable--; /* for the time trace that is always there */ if(num_traces_displayabletraces.visible) { yscroll = 1; target=((int)wadj->value)-yscroll; if(target<0) target=0; wadj->value=target; which=0; if(GLOBALS->cachedwhich_signalwindow_c_1==which) GLOBALS->cachedwhich_signalwindow_c_1=-1; /* force update */ gtk_signal_emit_by_name (GTK_OBJECT (wadj), "changed"); /* force bar update */ gtk_signal_emit_by_name (GTK_OBJECT (wadj), "value_changed"); /* force text update */ } } } if(in_main_iteration()) return(TRUE); if(GLOBALS->splash_is_loading) { return(TRUE); } if(GLOBALS->splash_fix_win_title) { GLOBALS->splash_fix_win_title = 0; wave_gtk_window_set_title(GTK_WINDOW(GLOBALS->mainwindow), GLOBALS->winname, GLOBALS->dumpfile_is_modified ? WAVE_SET_TITLE_MODIFIED: WAVE_SET_TITLE_NONE, 0); } if(GLOBALS->window_entry_c_1) { GLOBALS->entry_raise_timer++; if(GLOBALS->entry_raise_timer > 50) { gdk_window_raise(GLOBALS->window_entry_c_1->window); GLOBALS->entry_raise_timer = 0; } } #ifdef WAVE_USE_GTK2 #ifdef MAC_INTEGRATION if(GLOBALS->dnd_helper_quartz) { char *dhq = g_malloc(strlen(GLOBALS->dnd_helper_quartz)+1); strcpy(dhq, GLOBALS->dnd_helper_quartz); free_2(GLOBALS->dnd_helper_quartz); GLOBALS->dnd_helper_quartz = NULL; DND_helper_quartz(dhq); g_free(dhq); } #endif #endif if(process_finder_names_queued()) { #if GTK_CHECK_VERSION(2,4,0) if(GLOBALS->pFileChoose) #endif { if(!GLOBALS->window_simplereq_c_9) { char *qn = process_finder_extract_queued_name(); if(qn) { int qn_len = strlen(qn); const int mlen = 30; if(qn_len < mlen) { simplereqbox("File queued for loading",300,qn,"OK", NULL, NULL, 1); } else { char *qn_2 = wave_alloca(mlen + 4); strcpy(qn_2, "..."); strcat(qn_2, qn + qn_len - mlen); simplereqbox("File queued for loading",300,qn_2,"OK", NULL, NULL, 1); } return(TRUE); } } } #if GTK_CHECK_VERSION(2,4,0) else { if(process_finder_name_integration()) { return(TRUE); } } #endif } if(GLOBALS->loaded_file_type == MISSING_FILE) { return(TRUE); } if(run_once == FALSE) /* avoid any race conditions with the toolkit for uninitialized data */ { run_once = TRUE; return(TRUE); } if((!GLOBALS->signalarea) || (!GLOBALS->signalarea->window)) { return(TRUE); } if(GLOBALS->dnd_cursor_timer) { GLOBALS->dnd_cursor_timer++; if(GLOBALS->dnd_cursor_timer == 50) { GLOBALS->dnd_cursor_timer = 0; signalarea_configure_event(GLOBALS->signalarea, NULL); } } if(GLOBALS->mouseover_counter < 0) return(TRUE); /* mouseover is up in wave window so don't bother */ WAVE_GDK_GET_POINTER(GLOBALS->signalarea->window, &x, &y, &xi, &yi, &state); WAVE_GDK_GET_POINTER_COPY; GLOBALS->mouseover_counter++; if(!((x>=0)&&(xsignalarea->allocation.width)&&(y>=0)&&(ysignalarea->allocation.height))) { move_mouseover_sigs(NULL, 0, 0, LLDescriptor(0)); } else if(GLOBALS->mouseover_counter == 10) { int num_traces_displayable=GLOBALS->wavearea->allocation.height/(GLOBALS->fontheight); int yr = GLOBALS->cached_mouseover_y; int i; Trptr t=NULL; num_traces_displayable--; /* for the time trace that is always there */ yr-=GLOBALS->fontheight; if(yr<0) goto bot; yr/=GLOBALS->fontheight; /* y now indicates the trace in question */ if(yr>num_traces_displayable) goto bot; t=GLOBALS->topmost_trace; for(i=0;iflags&(/*TR_BLANK|*/TR_EXCLUDE))) /* TR_BLANK removed because of transaction handling below... */ { t = NULL; goto bot; } if(t->flags & (TR_BLANK|TR_ANALOG_BLANK_STRETCH)) /* seek to real xact trace if present... */ { Trptr tscan = t; int bcnt = 0; while((tscan) && (tscan = GivePrevTrace(tscan))) { if(!(tscan->flags & (TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { if(tscan->flags & TR_TTRANSLATED) { break; /* found it */ } else { tscan = NULL; } } else { bcnt++; /* bcnt is number of blank traces */ } } if((tscan)&&(tscan->vector)) { bvptr bv = tscan->n.vec; do { bv = bv->transaction_chain; /* correlate to blank trace */ } while(bv && (bcnt--)); if(bv) { memcpy(&t_trans, tscan, sizeof(TraceEnt)); /* substitute into a synthetic trace */ t_trans.n.vec = bv; t_trans.vector = 1; t_trans.name = bv->bvname; if(GLOBALS->hier_max_level) t_trans.name = hier_extract(t_trans.name, GLOBALS->hier_max_level); t = &t_trans; goto bot; /* is goto process_trace; in wavewindow.c */ } } } if((t->flags&TR_BLANK)) { t = NULL; goto bot; } if(t->flags & TR_ANALOG_BLANK_STRETCH) /* seek to real analog trace is present... */ { while((t) && (t = t->t_prev)) { if(!(t->flags & TR_ANALOG_BLANK_STRETCH)) { if(t->flags & TR_ANALOGMASK) { break; /* found it */ } else { t = NULL; } } } } bot: if(t) { move_mouseover_sigs(t, GLOBALS->cached_mouseover_x, GLOBALS->cached_mouseover_y, GLOBALS->tims.marker); } else { move_mouseover_sigs(NULL, 0, 0, LLDescriptor(0)); } } return(TRUE); } static gint motion_notify_event_std(GtkWidget *widget, GdkEventMotion *event) { (void)widget; gdouble x,y; GdkModifierType state; #ifdef WAVE_USE_GTK2 gint xi, yi; #endif if(event->is_hint) { WAVE_GDK_GET_POINTER(event->window, &x, &y, &xi, &yi, &state); WAVE_GDK_GET_POINTER_COPY; } else { x = event->x; y = event->y; state = event->state; } GLOBALS->cached_mouseover_x = x; GLOBALS->cached_mouseover_y = y; GLOBALS->mouseover_counter = 0; move_mouseover_sigs(NULL, 0, 0, LLDescriptor(0)); return(TRUE); } static gint button_release_event_std(GtkWidget *widget, GdkEventButton *event) { (void)widget; (void)event; if(GLOBALS->std_collapse_pressed) { GLOBALS->std_collapse_pressed = 0; } return(TRUE); } static gint button_press_event_std(GtkWidget *widget, GdkEventButton *event) { int num_traces_displayable; int which; int trwhich, trtarget; GtkAdjustment *wadj; Trptr t, t2; if(GLOBALS->signalarea_event_box) { /* Don't mess with highlights with button 2 (save for dnd) */ if((event->button == 2) && (event->type == GDK_BUTTON_PRESS)) { return(TRUE); } /* Don't mess with highlights with button 3 (save for menu_check) */ if((event->button == 3) && (event->type == GDK_BUTTON_PRESS)) { goto menu_chk; } if((event->x<0)||(event->x>=widget->allocation.width)||(event->y<0)||(event->y>=widget->allocation.height)) { /* let gtk take focus from us with focus out event */ } else { if(!GLOBALS->signalarea_has_focus) { GLOBALS->signalarea_has_focus = TRUE; gtk_widget_grab_focus(GTK_WIDGET(GLOBALS->signalarea_event_box)); } } } if((GLOBALS->traces.visible)&&(GLOBALS->signalpixmap)) { num_traces_displayable=widget->allocation.height/(GLOBALS->fontheight); num_traces_displayable--; /* for the time trace that is always there */ which=(int)(event->y); which=(which/GLOBALS->fontheight)-1; if(which>=GLOBALS->traces.visible) { #ifdef MAC_INTEGRATION if((event->state&(GDK_MOD2_MASK|GDK_SHIFT_MASK)) == (GDK_SHIFT_MASK)) #else if((event->state&(GDK_CONTROL_MASK|GDK_SHIFT_MASK)) == (GDK_SHIFT_MASK)) #endif { /* ok for plain-vanilla shift click only */ which = GLOBALS->traces.visible-1; } else { ClearTraces(); goto redraw; /* off in no man's land */ } } if((which>=num_traces_displayable)||(which<0)) { ClearTraces(); goto redraw; /* off in no man's land */ } wadj=GTK_ADJUSTMENT(GLOBALS->wave_vslider); trtarget=((int)wadj->value)+which; t=GLOBALS->traces.first; trwhich=0; while(t) { if((trwhichstate & GDK_MOD2_MASK) #else if(event->state&GDK_CONTROL_MASK) #endif { if(t) /* scan-build */ { if(IsGroupBegin(t) && IsSelected(t)) { ClearGroupTraces(t); } else if(IsGroupEnd(t) && IsSelected(t)) { ClearGroupTraces(t->t_match); } else { t->flags ^= TR_HIGHLIGHT; } } } else if((event->state&GDK_SHIFT_MASK)&&(GLOBALS->starting_unshifted_trace)) { int src = -1, dst = -1; int cnt = 0; t2=GLOBALS->traces.first; while(t2) { if(t2 == t) { dst = cnt; } if(t2 == GLOBALS->starting_unshifted_trace) { src = cnt; } cnt++; /* t2->flags &= ~TR_HIGHLIGHT; */ t2 = t2->t_next; } if(src != -1) { cnt = 0; t2=GLOBALS->traces.first; while(t2) { if ((cnt == src) && (cnt == dst) && IsSelected(t2)) { GLOBALS->starting_unshifted_trace = NULL; } t2->flags &= ~TR_HIGHLIGHT; t2=t2->t_next; cnt++; } if(src > dst) { int cpy; cpy = src; src = dst; dst = cpy; } cnt = 0; t2=GLOBALS->traces.first; while(t2 && GLOBALS->starting_unshifted_trace) { if((cnt >= src) && (cnt <= dst)) { t2->flags |= TR_HIGHLIGHT; } cnt++; t2=t2->t_next; } } else { GLOBALS->starting_unshifted_trace = t; if(t) { t->flags |= TR_HIGHLIGHT; } /* scan-build */ } } /* else if(!(t->flags & TR_HIGHLIGHT)) Ben Sferrazza suggested fix rather than a regular "else" 11aug08 */ /* changed to add use_standard_trace_select below to make this selectable, Sophana K request 08oct12 */ else if( (!GLOBALS->use_standard_trace_select) || (GLOBALS->standard_trace_dnd_degate) || ((t)&&(!(t->flags & TR_HIGHLIGHT))) ) { GLOBALS->starting_unshifted_trace = t; t2=GLOBALS->traces.first; while(t2) { t2->flags &= ~TR_HIGHLIGHT; t2 = t2->t_next; } if(t) { t->flags |= TR_HIGHLIGHT; } /* scan-build */ } GLOBALS->standard_trace_dnd_degate = 0; if(event->type == GDK_2BUTTON_PRESS) { menu_toggle_group(NULL, 0, widget); goto menu_chk; } redraw: GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } menu_chk: if((event->button == 3) && (event->type == GDK_BUTTON_PRESS)) { do_popup_menu (widget, event); } return(TRUE); } /*** standard click routines turned on with "use_standard_clicking"=1 ***/ /**************************************************************************/ /**************************************************************************/ /*** standard click routines turned on with "use_standard_clicking"=0 ***/ /*** ***/ /*** no longer supported ***/ /*** ***/ /*** gtkwave click routines turned on with "use_standard_clicking"=0 ***/ /**************************************************************************/ gint signalarea_configure_event(GtkWidget *widget, GdkEventConfigure *event) { (void)event; GtkAdjustment *wadj, *hadj; int num_traces_displayable; int width; if((!widget)||(!widget->window)) return(TRUE); #ifdef WAVE_ALLOW_QUARTZ_FLUSH_WORKAROUND #ifdef MAC_INTEGRATION if(!GLOBALS->force_hide_show) { GLOBALS->force_hide_show = 2; } #endif #endif make_sigarea_gcs(widget); UpdateTracesVisible(); num_traces_displayable=widget->allocation.height/(GLOBALS->fontheight); num_traces_displayable--; /* for the time trace that is always there */ DEBUG(printf("SigWin Configure Event h: %d, w: %d\n", widget->allocation.height, widget->allocation.width)); GLOBALS->old_signal_fill_width=GLOBALS->signal_fill_width; GLOBALS->signal_fill_width = ((width=widget->allocation.width) > GLOBALS->signal_pixmap_width) ? widget->allocation.width : GLOBALS->signal_pixmap_width; if(GLOBALS->signalpixmap) { if((GLOBALS->old_signal_fill_width!=GLOBALS->signal_fill_width)||(GLOBALS->old_signal_fill_height!=widget->allocation.height)) { gdk_pixmap_unref(GLOBALS->signalpixmap); GLOBALS->signalpixmap=gdk_pixmap_new(widget->window, GLOBALS->signal_fill_width, widget->allocation.height, -1); } } else { GLOBALS->signalpixmap=gdk_pixmap_new(widget->window, GLOBALS->signal_fill_width, widget->allocation.height, -1); } if (!GLOBALS->left_justify_sigs && !GLOBALS->do_resize_signals) { if (width < GLOBALS->max_signal_name_pixel_width+15) { int delta = GLOBALS->max_signal_name_pixel_width+15 - width; if(GLOBALS->signalpixmap) { hadj=GTK_ADJUSTMENT(GLOBALS->signal_hslider); /* int pos = GLOBALS->max_signal_name_pixel_width+15 - (gint)hadj->value; */ if ((gint) hadj->value > delta) { GLOBALS->right_align_active = 1; delta = (gint)hadj->value; } if (GLOBALS->right_align_active) hadj->value = (gint)delta; } } else { GLOBALS->right_align_active = 1; } } GLOBALS->old_signal_fill_height= widget->allocation.height; gdk_draw_rectangle(GLOBALS->signalpixmap, widget->style->bg_gc[GTK_STATE_PRELIGHT], TRUE, 0, 0, GLOBALS->signal_fill_width, widget->allocation.height); hadj=GTK_ADJUSTMENT(GLOBALS->signal_hslider); hadj->page_size=hadj->page_increment=(gfloat)width; hadj->step_increment=(gfloat)10.0; /* approx 1ch at a time */ hadj->lower=(gfloat)0.0; hadj->upper=(gfloat)GLOBALS->signal_pixmap_width; if( ((int)hadj->value)+width > GLOBALS->signal_fill_width) { hadj->value = (gfloat)(GLOBALS->signal_fill_width-width); } wadj=GTK_ADJUSTMENT(GLOBALS->wave_vslider); wadj->page_size=wadj->page_increment=(gfloat) num_traces_displayable; wadj->step_increment=(gfloat)1.0; wadj->lower=(gfloat)0.0; wadj->upper=(gfloat)(GLOBALS->traces.visible ? GLOBALS->traces.visible : 1); if(GLOBALS->traces.scroll_bottom) { Trptr t = GLOBALS->traces.first; int which = 0; int scroll_top = -1, scroll_bottom = -1; int cur_top = wadj->value; int cur_bottom = cur_top + num_traces_displayable - 1; while(t) { if(t == GLOBALS->traces.scroll_top) { scroll_top = which; } if(t == GLOBALS->traces.scroll_bottom) { scroll_bottom = which; break; } t = GiveNextTrace(t); which++; } GLOBALS->traces.scroll_top = GLOBALS->traces.scroll_bottom = NULL; if((scroll_top >= 0) && (scroll_bottom >= 0)) { if((scroll_top > cur_top) && (scroll_bottom <= cur_bottom)) { /* nothing */ } else { if((scroll_bottom - scroll_top + 1) >= num_traces_displayable) { wadj->value=(gfloat)(scroll_bottom - num_traces_displayable + 1); } else { int midpoint = (cur_top + cur_bottom) / 2; if(scroll_top <= cur_top) { wadj->value=(gfloat)scroll_top-1; } else if(scroll_top >= cur_bottom) { wadj->value=(gfloat)(scroll_bottom - num_traces_displayable + 1); } else if(scroll_top < midpoint) { wadj->value=(gfloat)scroll_top-1; } else { wadj->value=(gfloat)(scroll_bottom - num_traces_displayable + 1); } } if(wadj->value < 0.0) wadj->value = 0.0; } } } if(num_traces_displayable>GLOBALS->traces.visible) { wadj->value=(gfloat)(GLOBALS->trtarget_signalwindow_c_1=0); } else if (wadj->value + num_traces_displayable > GLOBALS->traces.visible) { wadj->value=(gfloat)(GLOBALS->trtarget_signalwindow_c_1=GLOBALS->traces.visible-num_traces_displayable); } gtk_signal_emit_by_name (GTK_OBJECT (wadj), "changed"); /* force bar update */ gtk_signal_emit_by_name (GTK_OBJECT (wadj), "value_changed"); /* force text update */ gtk_signal_emit_by_name (GTK_OBJECT (hadj), "changed"); /* force bar update */ return(TRUE); } static gint signalarea_configure_event_local(GtkWidget *widget, GdkEventConfigure *event) { gint rc; gint page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(GLOBALS->notebook)); struct Global *g_old = GLOBALS; set_GLOBALS((*GLOBALS->contexts)[page_num]); rc = signalarea_configure_event(widget, event); set_GLOBALS(g_old); return(rc); } static gint expose_event(GtkWidget *widget, GdkEventExpose *event) { GtkAdjustment *hadj; int xsrc; hadj=GTK_ADJUSTMENT(GLOBALS->signal_hslider); xsrc=(gint)hadj->value; gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE(widget)], GLOBALS->signalpixmap, xsrc+event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); draw_signalarea_focus(); return(FALSE); } static gint expose_event_local(GtkWidget *widget, GdkEventExpose *event) { gint rc; gint page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(GLOBALS->notebook)); /* struct Global *g_old = GLOBALS; */ set_GLOBALS((*GLOBALS->contexts)[page_num]); rc = expose_event(widget, event); /* seems to cause a conflict flipping back so don't! */ /* set_GLOBALS(g_old); */ return(rc); } static int focus_in_local(GtkWidget *widget, GdkEventFocus *event) { #ifdef FOCUS_DEBUG_MSGS (void)event; printf("Focus in: %08x %08x\n", widget, GLOBALS->signalarea_event_box); #else (void)widget; (void)event; #endif GLOBALS->signalarea_has_focus = TRUE; signalarea_configure_event(GLOBALS->signalarea, NULL); return(FALSE); } static int focus_out_local(GtkWidget *widget, GdkEventFocus *event) { #ifdef FOCUS_DEBUG_MSGS (void)event; printf("Focus out: %08x\n", widget); #else (void)widget; (void)event; #endif GLOBALS->signalarea_has_focus = FALSE; signalarea_configure_event(GLOBALS->signalarea, NULL); return(FALSE); } GtkWidget * create_signalwindow(void) { GtkWidget *table; GtkWidget *frame; char do_focusing = 0; table = gtk_table_new(10, 10, FALSE); GLOBALS->signalarea=gtk_drawing_area_new(); gtk_widget_show(GLOBALS->signalarea); MaxSignalLength(); gtk_widget_set_events(GLOBALS->signalarea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK ); gtk_signal_connect(GTK_OBJECT(GLOBALS->signalarea), "configure_event", GTK_SIGNAL_FUNC(signalarea_configure_event_local), NULL); gtk_signal_connect(GTK_OBJECT(GLOBALS->signalarea), "expose_event",GTK_SIGNAL_FUNC(expose_event_local), NULL); sclick: if(GLOBALS->use_standard_clicking) { GtkTargetEntry target_entry[3]; target_entry[0].target = WAVE_DRAG_TAR_NAME_0; target_entry[0].flags = 0; target_entry[0].info = WAVE_DRAG_TAR_INFO_0; target_entry[1].target = WAVE_DRAG_TAR_NAME_1; target_entry[1].flags = 0; target_entry[1].info = WAVE_DRAG_TAR_INFO_1; target_entry[2].target = WAVE_DRAG_TAR_NAME_2; target_entry[2].flags = 0; target_entry[2].info = WAVE_DRAG_TAR_INFO_2; gtk_drag_dest_set( GTK_WIDGET(GLOBALS->signalarea), GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP, target_entry, sizeof(target_entry) / sizeof(GtkTargetEntry), GDK_ACTION_MOVE ); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->signalarea), "drag_motion", GTK_SIGNAL_FUNC(DNDDragMotionCB), GTK_WIDGET(GLOBALS->signalarea)); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->signalarea), "drag_begin", GTK_SIGNAL_FUNC(DNDBeginCB), GTK_WIDGET(GLOBALS->signalarea)); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->signalarea), "drag_end", GTK_SIGNAL_FUNC(DNDEndCB), GTK_WIDGET(GLOBALS->signalarea)); gtk_drag_dest_set( GTK_WIDGET(GLOBALS->wavearea), GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP, target_entry, sizeof(target_entry) / sizeof(GtkTargetEntry), GDK_ACTION_MOVE ); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->wavearea), "drag_motion", GTK_SIGNAL_FUNC(DNDDragMotionCB), GTK_WIDGET(GLOBALS->wavearea)); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->wavearea), "drag_begin", GTK_SIGNAL_FUNC(DNDBeginCB), GTK_WIDGET(GLOBALS->wavearea)); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->wavearea), "drag_end", GTK_SIGNAL_FUNC(DNDEndCB), GTK_WIDGET(GLOBALS->wavearea)); gtk_drag_source_set(GTK_WIDGET(GLOBALS->signalarea), GDK_BUTTON1_MASK | GDK_BUTTON2_MASK, target_entry, sizeof(target_entry) / sizeof(GtkTargetEntry), GDK_ACTION_PRIVATE); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->signalarea), "button_press_event",GTK_SIGNAL_FUNC(button_press_event_std), NULL); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->signalarea), "button_release_event", GTK_SIGNAL_FUNC(button_release_event_std), NULL); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->signalarea), "motion_notify_event",GTK_SIGNAL_FUNC(motion_notify_event_std), NULL); g_timeout_add(100, mouseover_timer, NULL); #ifdef WAVE_ALLOW_QUARTZ_FLUSH_WORKAROUND #ifdef MAC_INTEGRATION g_timeout_add(100, osx_timer, NULL); #endif #endif #ifdef WAVE_USE_GTK2 gtkwave_signal_connect(GTK_OBJECT(GLOBALS->signalarea), "scroll_event",GTK_SIGNAL_FUNC(scroll_event), NULL); #endif do_focusing = 1; } else { fprintf(stderr, "GTKWAVE | \"use_standard_clicking off\" has been removed.\n"); fprintf(stderr, "GTKWAVE | Please update your rc files accordingly.\n"); GLOBALS->use_standard_clicking = 1; goto sclick; } gtk_table_attach (GTK_TABLE (table), GLOBALS->signalarea, 0, 10, 0, 9, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 3, 2); GLOBALS->signal_hslider=gtk_adjustment_new(0.0, 0.0, 0.0, 0.0, 0.0, 0.0); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->signal_hslider), "value_changed",GTK_SIGNAL_FUNC(service_hslider), NULL); GLOBALS->hscroll_signalwindow_c_1=gtk_hscrollbar_new(GTK_ADJUSTMENT(GLOBALS->signal_hslider)); gtk_widget_show(GLOBALS->hscroll_signalwindow_c_1); gtk_table_attach (GTK_TABLE (table), GLOBALS->hscroll_signalwindow_c_1, 0, 10, 9, 10, GTK_FILL, GTK_FILL | GTK_SHRINK, 3, 4); gtk_widget_show(table); frame=gtk_frame_new("Signals"); gtk_container_border_width(GTK_CONTAINER(frame),2); gtk_container_add(GTK_CONTAINER(frame),table); if(do_focusing) { GLOBALS->signalarea_event_box = gtk_event_box_new(); gtk_container_add (GTK_CONTAINER (GLOBALS->signalarea_event_box), frame); gtk_widget_show(frame); GTK_WIDGET_SET_FLAGS (GTK_WIDGET(GLOBALS->signalarea_event_box), GTK_CAN_FOCUS | GTK_RECEIVES_DEFAULT); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->signalarea_event_box), "focus_in_event", GTK_SIGNAL_FUNC(focus_in_local), NULL); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->signalarea_event_box), "focus_out_event", GTK_SIGNAL_FUNC(focus_out_local), NULL); /* not necessary for now... */ /* gtkwave_signal_connect(GTK_OBJECT(GLOBALS->signalarea_event_box), "popup_menu",GTK_SIGNAL_FUNC(popup_event), NULL); */ if(!GLOBALS->second_page_created) { if(!GLOBALS->keypress_handler_id) { GLOBALS->keypress_handler_id = install_keypress_handler(); } } return(GLOBALS->signalarea_event_box); } else { return(frame); } } gint install_keypress_handler(void) { gint rc = gtk_signal_connect(GTK_OBJECT(GLOBALS->mainwindow), "key_press_event",GTK_SIGNAL_FUNC(keypress_local), NULL); return(rc); } void remove_keypress_handler(gint id) { gtk_signal_disconnect(GTK_OBJECT(GLOBALS->mainwindow), id); } gtkwave-3.3.86/src/interp.h0000664000175000017500000000072713166335473015053 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010 * * 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. */ #ifndef WAVE_FT_INTERP_H #define WAVE_FT_INTERP_H int ft_interpolate (double *data, double *ndata, double *oscale, int olen, double *nscale, int nlen, int degree); #endif gtkwave-3.3.86/src/currenttime.h0000664000175000017500000000354513166335473016114 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2016 * * 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. */ #include "globals.h" #ifndef CURRENTTIME_H #define CURRENTTIME_H #include #include #include #include #include "analyzer.h" #include "regex_wave.h" #include "translate.h" #define WAVE_INF_SCALING (0.5) #define WAVE_SI_UNITS " munpfaz" struct blackout_region_t { struct blackout_region_t *next; TimeType bstart, bend; }; /* currenttime.c protos */ void fractional_timescale_fix(char *); void update_markertime(TimeType val); void update_maxtime(TimeType val); void update_basetime(TimeType val); void update_currenttime(TimeType val); void update_maxmarker_labels(void); void reformat_time(char *buf, TimeType val, char dim); void reformat_time_simple(char *buf, TimeType val, char dim); TimeType unformat_time(const char *buf, char dim); void time_trunc_set(void); TimeType time_trunc(TimeType t); void exponent_to_time_scale(signed char scale); /* other protos / definitions */ #include "baseconvert.h" #include "edgebuttons.h" #include "entry.h" #include "fetchbuttons.h" #include "file.h" #include "fonts.h" #include "help.h" #include "interp.h" #include "logfile.h" #include "markerbox.h" #include "menu.h" #include "mouseover.h" #include "mouseover_sigs.h" #include "pagebuttons.h" #include "renderopt.h" #include "search.h" #include "shiftbuttons.h" #include "showchange.h" #include "signalwindow.h" #include "simplereq.h" #include "status.h" #include "strace.h" #include "timeentry.h" #include "tree.h" #include "treesearch.h" #include "vcd_partial.h" #include "wavewindow.h" #include "zoombuttons.h" #include "hiersearch.h" #endif gtkwave-3.3.86/src/zoombuttons.h0000664000175000017500000000147613166335473016157 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010 * * 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. */ #ifndef WAVE_ZOOMBUTTONS_H #define WAVE_ZOOMBUTTONS_H void fix_wavehadj(void); void service_zoom_in(GtkWidget *text, gpointer data); void service_zoom_out(GtkWidget *text, gpointer data); void service_zoom_fit(GtkWidget *text, gpointer data); void service_zoom_full(GtkWidget *text, gpointer data); void service_zoom_undo(GtkWidget *text, gpointer data); void service_zoom_left(GtkWidget *text, gpointer data); void service_zoom_right(GtkWidget *text, gpointer data); void service_dragzoom(TimeType time1, TimeType time2); #endif gtkwave-3.3.86/src/symbol.h0000664000175000017500000000635113166335473015056 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2011. * * 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. */ #include "globals.h" #ifndef WAVE_SYMBOL_H #define WAVE_SYMBOL_H #include #include #include #include #include "wavealloca.h" #include "analyzer.h" #include "currenttime.h" #include "tree.h" #include "debug.h" #define SYMPRIME 500009 #define WAVE_DECOMPRESSOR "gzip -cd " /* zcat alone doesn't cut it for AIX */ #ifndef _MSC_VER #include #ifdef HAVE_INTTYPES_H #include #endif #else typedef long off_t; #include #include #endif #ifdef WAVE_USE_STRUCT_PACKING #pragma pack(push) #pragma pack(1) #endif struct fac { struct Node *working_node; int node_alias; int len; unsigned int flags; }; #ifdef WAVE_USE_STRUCT_PACKING #pragma pack(pop) #endif struct symbol { #ifndef _WAVE_HAVE_JUDY struct symbol *sym_next; /* for hash chain, judy uses sym_judy in globals */ #endif struct symbol *vec_root, *vec_chain; char *name; struct Node *n; #ifndef _WAVE_HAVE_JUDY char s_selected; /* for the clist object */ #endif }; struct symchain /* for restoring state of ->selected in signal regex search */ { struct symchain *next; struct symbol *symbol; }; struct string_chain_t { struct string_chain_t *next; char *str; }; /* hash create/destroy */ void sym_hash_initialize(void *g); void sym_hash_destroy(void *g); struct symbol *symfind(char *, unsigned int *); struct symbol *symadd(char *, int); struct symbol *symadd_name_exists(char *name, int hv); int hash(char *s); /* typically use zero for hashval as it doesn't matter if facs are sorted as symfind will bsearch... */ #define symadd_name_exists_sym_exists(s, nam, hv) \ (s)->name = (nam); /* (s)->sym_next=GLOBALS->sym_hash[(hv)]; GLOBALS->sym_hash[(hv)]=(s); (obsolete) */ void facsplit(char *, int *, int *); int sigcmp(char *, char *); void quicksort(struct symbol **, int, int); void wave_heapsort(struct symbol **a, int num); struct Bits *makevec(char *, char *); struct Bits *makevec_annotated(char *, char *); int maketraces(char *, char *, int); /* additions to bitvec.c because of search.c/menu.c ==> formerly in analyzer.h */ bvptr bits2vector(struct Bits *b); struct Bits *makevec_selected(char *vec, int numrows, char direction); int add_vector_selected(char *alias, int numrows, char direction); struct Bits *makevec_range(char *vec, int lo, int hi, char direction); int add_vector_range(char *alias, int lo, int hi, char direction); struct Bits *makevec_chain(char *vec, struct symbol *sym, int len); int add_vector_chain(struct symbol *s, int len); char *makename_chain(struct symbol *sym); /* splash screen activation (version >= GTK2 only) */ void splash_create(void); void splash_sync(off_t current, off_t total); void splash_finalize(void); gint splash_button_press_event(GtkWidget *widget, GdkEventExpose *event); /* accessor functions for sym->selected moved (potentially) to sparse array */ char get_s_selected(struct symbol *s); char set_s_selected(struct symbol *s, char value); void destroy_s_selected(void); #endif gtkwave-3.3.86/src/signalwindow.h0000664000175000017500000000156413166335473016257 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010 * * 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. */ #ifndef WAVE_SIGNALWINDOW_H #define WAVE_SIGNALWINDOW_H /* for dnd */ #define WAVE_DRAG_TAR_NAME_0 "text/plain" #define WAVE_DRAG_TAR_INFO_0 0 #define WAVE_DRAG_TAR_NAME_1 "text/uri-list" /* not url-list */ #define WAVE_DRAG_TAR_INFO_1 1 #define WAVE_DRAG_TAR_NAME_2 "STRING" #define WAVE_DRAG_TAR_INFO_2 2 void draw_signalarea_focus(void); gint signalarea_configure_event(GtkWidget *widget, GdkEventConfigure *event); void dnd_error(void); gint install_keypress_handler(void); void remove_keypress_handler(gint id); #endif gtkwave-3.3.86/src/ptranslate.c0000664000175000017500000003200013166335473015707 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2005-2009. * * 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. */ #include "globals.h" #include #include #include "gtk12compat.h" #include "symbol.h" #include "ptranslate.h" #include "pipeio.h" #include "debug.h" #ifdef _MSC_VER #define strcasecmp _stricmp #endif void init_proctrans_data(void) { int i; if(!GLOBALS->procsel_filter) { GLOBALS->procsel_filter = calloc_2(PROC_FILTER_MAX+1, sizeof(char *)); } if(!GLOBALS->proc_filter) { GLOBALS->proc_filter = calloc_2(PROC_FILTER_MAX+1, sizeof(struct pipe_ctx *)); } for(i=0;iprocsel_filter[i] = NULL; GLOBALS->proc_filter[i] = NULL; } } void remove_all_proc_filters(void) { struct Global *GLOBALS_cache = GLOBALS; unsigned int i, j; for(j=0;jnum_notebook_pages;j++) { GLOBALS = (*GLOBALS->contexts)[j]; if(GLOBALS) { for(i=1;iproc_filter[i]) { pipeio_destroy(GLOBALS->proc_filter[i]); GLOBALS->proc_filter[i] = NULL; } if(GLOBALS->procsel_filter[i]) { free_2(GLOBALS->procsel_filter[i]); GLOBALS->procsel_filter[i] = NULL; } } } GLOBALS = GLOBALS_cache; } } static void regen_display(void) { GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } /* * this is likely obsolete */ #if 0 static void remove_proc_filter(int which, int regen) { if(GLOBALS->proc_filter[which]) { pipeio_destroy(GLOBALS->proc_filter[which]); GLOBALS->proc_filter[which] = NULL; if(regen) { regen_display(); } } } #endif static void load_proc_filter(int which, char *name) { FILE *stream; char *cmd; char exec_name[1025]; char abs_path [1025]; char* arg, end; int result; exec_name[0] = 0; abs_path[0] = 0; /* if name has arguments grab only the first word (the name of the executable)*/ sscanf(name, "%s ", exec_name); arg = name + strlen(exec_name); /* remove leading spaces from argument */ while (isspace((int)(unsigned char)arg[0])) { arg++; } /* remove trailing spaces from argument */ if (strlen(arg) > 0) { end = strlen(arg) - 1; while (arg[(int)end] == ' ') { arg[(int)end] = 0; end--; } } /* turn the exec_name into an absolute path */ #if !defined __MINGW32__ && !defined _MSC_VER cmd = (char *)malloc_2(strlen(exec_name)+6+1); sprintf(cmd, "which %s", exec_name); stream = popen(cmd, "r"); result = fscanf(stream, "%s", abs_path); if((strlen(abs_path) == 0)||(!result)) { status_text("Could not find filter process!\n"); pclose(stream); /* cppcheck */ return; } pclose(stream); free_2(cmd); #else strcpy(abs_path, exec_name); #endif /* remove_proc_filter(which, 0); ... should never happen from GUI, but perhaps possible from save files or other weirdness */ if(!GLOBALS->ttrans_filter[which]) { GLOBALS->proc_filter[which] = pipeio_create(abs_path, arg); } } int install_proc_filter(int which) { int found = 0; if((which<0)||(which>=(PROC_FILTER_MAX+1))) { which = 0; } if(GLOBALS->traces.first) { Trptr t = GLOBALS->traces.first; while(t) { if(t->flags&TR_HIGHLIGHT) { if(!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { t->f_filter = 0; t->p_filter = which; if(!which) { t->flags &= (~(TR_FTRANSLATED|TR_PTRANSLATED|TR_ANALOGMASK)); } else { t->flags &= (~(TR_ANALOGMASK)); t->flags |= TR_PTRANSLATED; } found++; } } t=t->t_next; } } if(found) { regen_display(); } return(found); } /************************************************************************/ static void destroy_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; GLOBALS->is_active_ptranslate_c_2=0; gtk_widget_destroy(GLOBALS->window_ptranslate_c_5); GLOBALS->window_ptranslate_c_5 = NULL; } static void ok_callback(GtkWidget *widget, GtkWidget *nothing) { install_proc_filter(GLOBALS->current_filter_ptranslate_c_1); destroy_callback(widget, nothing); } static void select_row_callback(GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data) { (void)widget; (void)row; (void)column; (void)event; (void)data; GLOBALS->current_filter_ptranslate_c_1 = row + 1; } static void unselect_row_callback(GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data) { (void)widget; (void)row; (void)column; (void)event; (void)data; GLOBALS->current_filter_ptranslate_c_1 = 0; /* none */ } static void add_filter_callback_2(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; int i; GtkCList *cl; if(!GLOBALS->filesel_ok) { return; } if(*GLOBALS->fileselbox_text) { for(i=0;inum_proc_filters;i++) { if(GLOBALS->procsel_filter[i]) { if(!strcmp(GLOBALS->procsel_filter[i], *GLOBALS->fileselbox_text)) { status_text("Filter already imported.\n"); if(GLOBALS->is_active_ptranslate_c_2) gdk_window_raise(GLOBALS->window_ptranslate_c_5->window); return; } } } } GLOBALS->num_proc_filters++; load_proc_filter(GLOBALS->num_proc_filters, *GLOBALS->fileselbox_text); if(GLOBALS->proc_filter[GLOBALS->num_proc_filters]) { if(GLOBALS->procsel_filter[GLOBALS->num_proc_filters]) free_2(GLOBALS->procsel_filter[GLOBALS->num_proc_filters]); GLOBALS->procsel_filter[GLOBALS->num_proc_filters] = malloc_2(strlen(*GLOBALS->fileselbox_text) + 1); strcpy(GLOBALS->procsel_filter[GLOBALS->num_proc_filters], *GLOBALS->fileselbox_text); cl=GTK_CLIST(GLOBALS->clist_ptranslate_c_2); gtk_clist_freeze(cl); gtk_clist_append(cl,(gchar **)&(GLOBALS->procsel_filter[GLOBALS->num_proc_filters])); gtk_clist_set_column_width(cl,0,gtk_clist_optimal_column_width(cl,0)); gtk_clist_thaw(cl); } else { GLOBALS->num_proc_filters--; } if(GLOBALS->is_active_ptranslate_c_2) gdk_window_raise(GLOBALS->window_ptranslate_c_5->window); } static void add_filter_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; if(GLOBALS->num_proc_filters == PROC_FILTER_MAX) { status_text("Max number of process filters installed already.\n"); return; } fileselbox("Select Filter Process",&GLOBALS->fcurr_ptranslate_c_1,GTK_SIGNAL_FUNC(add_filter_callback_2), GTK_SIGNAL_FUNC(NULL),"*", 0); } /* * mainline.. */ void ptrans_searchbox(char *title) { int i; GtkWidget *scrolled_win; GtkWidget *vbox1, *hbox, *hbox0; GtkWidget *button1, *button5, *button6; gchar *titles[]={"Process Filter Select"}; GtkWidget *frame2, *frameh, *frameh0; GtkWidget *table; GtkTooltips *tooltips; if(GLOBALS->is_active_ptranslate_c_2) { gdk_window_raise(GLOBALS->window_ptranslate_c_5->window); return; } GLOBALS->is_active_ptranslate_c_2=1; GLOBALS->current_filter_ptranslate_c_1 = 0; /* create a new modal window */ GLOBALS->window_ptranslate_c_5 = gtk_window_new(GLOBALS->disable_window_manager ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL); install_focus_cb(GLOBALS->window_ptranslate_c_5, ((char *)&GLOBALS->window_ptranslate_c_5) - ((char *)GLOBALS)); gtk_window_set_title(GTK_WINDOW (GLOBALS->window_ptranslate_c_5), title); gtkwave_signal_connect(GTK_OBJECT (GLOBALS->window_ptranslate_c_5), "delete_event",(GtkSignalFunc) destroy_callback, NULL); tooltips=gtk_tooltips_new_2(); table = gtk_table_new (256, 1, FALSE); gtk_widget_show (table); vbox1 = gtk_vbox_new (FALSE, 0); gtk_container_border_width (GTK_CONTAINER (vbox1), 3); gtk_widget_show (vbox1); frame2 = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (frame2), 3); gtk_widget_show(frame2); gtk_table_attach (GTK_TABLE (table), frame2, 0, 1, 0, 254, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); GLOBALS->clist_ptranslate_c_2=gtk_clist_new_with_titles(1,titles); gtk_clist_column_titles_passive(GTK_CLIST(GLOBALS->clist_ptranslate_c_2)); gtk_clist_set_selection_mode(GTK_CLIST(GLOBALS->clist_ptranslate_c_2), GTK_SELECTION_EXTENDED); gtkwave_signal_connect_object (GTK_OBJECT (GLOBALS->clist_ptranslate_c_2), "select_row",GTK_SIGNAL_FUNC(select_row_callback),NULL); gtkwave_signal_connect_object (GTK_OBJECT (GLOBALS->clist_ptranslate_c_2), "unselect_row",GTK_SIGNAL_FUNC(unselect_row_callback),NULL); for(i=0;inum_proc_filters;i++) { gtk_clist_append(GTK_CLIST(GLOBALS->clist_ptranslate_c_2),(gchar **)&(GLOBALS->procsel_filter[i+1])); } gtk_clist_set_column_width(GTK_CLIST(GLOBALS->clist_ptranslate_c_2),0,gtk_clist_optimal_column_width(GTK_CLIST(GLOBALS->clist_ptranslate_c_2),0)); gtk_widget_show (GLOBALS->clist_ptranslate_c_2); scrolled_win = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_set_usize( GTK_WIDGET (scrolled_win), -1, 300); gtk_widget_show(scrolled_win); /* gtk_scrolled_window_add_with_viewport doesn't seen to work right here.. */ gtk_container_add (GTK_CONTAINER (scrolled_win), GLOBALS->clist_ptranslate_c_2); gtk_container_add (GTK_CONTAINER (frame2), scrolled_win); frameh0 = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (frameh0), 3); gtk_widget_show(frameh0); gtk_table_attach (GTK_TABLE (table), frameh0, 0, 1, 254, 255, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); hbox0 = gtk_hbox_new (FALSE, 1); gtk_widget_show (hbox0); button6 = gtk_button_new_with_label (" Add Proc Filter to List "); gtk_container_border_width (GTK_CONTAINER (button6), 3); gtkwave_signal_connect_object (GTK_OBJECT (button6), "clicked",GTK_SIGNAL_FUNC(add_filter_callback),GTK_OBJECT (GLOBALS->window_ptranslate_c_5)); gtk_widget_show (button6); gtk_tooltips_set_tip_2(tooltips, button6, "Bring up a file requester to add a process filter to the filter select window.",NULL); gtk_box_pack_start (GTK_BOX (hbox0), button6, TRUE, FALSE, 0); gtk_container_add (GTK_CONTAINER (frameh0), hbox0); frameh = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (frameh), 3); gtk_widget_show(frameh); gtk_table_attach (GTK_TABLE (table), frameh, 0, 1, 255, 256, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); hbox = gtk_hbox_new (FALSE, 1); gtk_widget_show (hbox); button1 = gtk_button_new_with_label (" OK "); gtk_container_border_width (GTK_CONTAINER (button1), 3); gtkwave_signal_connect_object (GTK_OBJECT (button1), "clicked",GTK_SIGNAL_FUNC(ok_callback),GTK_OBJECT (GLOBALS->window_ptranslate_c_5)); gtk_widget_show (button1); gtk_tooltips_set_tip_2(tooltips, button1, "Add selected signals to end of the display on the main window.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button1, TRUE, FALSE, 0); button5 = gtk_button_new_with_label (" Cancel "); gtk_container_border_width (GTK_CONTAINER (button5), 3); gtkwave_signal_connect_object (GTK_OBJECT (button5), "clicked",GTK_SIGNAL_FUNC(destroy_callback),GTK_OBJECT (GLOBALS->window_ptranslate_c_5)); gtk_tooltips_set_tip_2(tooltips, button5, "Do nothing and return to the main window.",NULL); gtk_widget_show (button5); gtk_box_pack_start (GTK_BOX (hbox), button5, TRUE, FALSE, 0); gtk_container_add (GTK_CONTAINER (frameh), hbox); gtk_container_add (GTK_CONTAINER (GLOBALS->window_ptranslate_c_5), table); gtk_widget_set_usize(GTK_WIDGET(GLOBALS->window_ptranslate_c_5), 400, 400); gtk_widget_show(GLOBALS->window_ptranslate_c_5); } /* * currently only called by parsewavline */ void set_current_translate_proc(char *name) { int i; for(i=1;inum_proc_filters+1;i++) { if(!strcmp(GLOBALS->procsel_filter[i], name)) { GLOBALS->current_translate_proc = i; return; } } if(GLOBALS->num_proc_filters < PROC_FILTER_MAX) { GLOBALS->num_proc_filters++; load_proc_filter(GLOBALS->num_proc_filters, name); if(!GLOBALS->proc_filter[GLOBALS->num_proc_filters]) { GLOBALS->num_proc_filters--; GLOBALS->current_translate_proc = 0; } else { if(GLOBALS->procsel_filter[GLOBALS->num_proc_filters]) free_2(GLOBALS->procsel_filter[GLOBALS->num_proc_filters]); GLOBALS->procsel_filter[GLOBALS->num_proc_filters] = malloc_2(strlen(name) + 1); strcpy(GLOBALS->procsel_filter[GLOBALS->num_proc_filters], name); GLOBALS->current_translate_proc = GLOBALS->num_proc_filters; } } } gtkwave-3.3.86/src/logfile.c0000664000175000017500000004422413166335473015166 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2010. * * 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. */ #include "globals.h" #include #include #include #include "debug.h" #include "symbol.h" #include "currenttime.h" #include "fgetdynamic.h" /* only for use locally */ struct wave_logfile_lines_t { struct wave_logfile_lines_t *next; char *text; }; struct logfile_instance_t { struct logfile_instance_t *next; GtkWidget *window; GtkWidget *text; #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) GtkTextTag *bold_tag; GtkTextTag *mono_tag; GtkTextTag *size_tag; #else GdkFont *font_logfile; #endif char default_text[1]; }; #define log_collection (*((struct logfile_instance_t **)GLOBALS->logfiles)) /* Add some text to our text widget - this is a callback that is invoked when our window is realized. We could also force our window to be realized with gtk_widget_realize, but it would have to be part of a hierarchy first */ void log_text(GtkWidget *text, GdkFont *font, char *str) { #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) (void)font; gtk_text_buffer_insert_with_tags (GTK_TEXT_VIEW (text)->buffer, &GLOBALS->iter_logfile_c_2, str, -1, GLOBALS->mono_tag_logfile_c_1, GLOBALS->size_tag_logfile_c_1, NULL); #else gtk_text_insert (GTK_TEXT (text), font, &text->style->black, NULL, str, -1); #endif } void log_text_bold(GtkWidget *text, GdkFont *font, char *str) { #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) (void)font; gtk_text_buffer_insert_with_tags (GTK_TEXT_VIEW (text)->buffer, &GLOBALS->iter_logfile_c_2, str, -1, GLOBALS->bold_tag_logfile_c_2, GLOBALS->mono_tag_logfile_c_1, GLOBALS->size_tag_logfile_c_1, NULL); #else gtk_text_insert (GTK_TEXT (text), font, &text->style->fg[GTK_STATE_SELECTED], &text->style->bg[GTK_STATE_SELECTED], str, -1); #endif } static void log_realize_text (GtkWidget *text, gpointer data) { (void)text; (void)data; /* nothing for now */ } static void center_op(void) { TimeType middle=0, width; if((GLOBALS->tims.marker<0)||(GLOBALS->tims.markertims.first)||(GLOBALS->tims.marker>GLOBALS->tims.last)) { if(GLOBALS->tims.end>GLOBALS->tims.last) GLOBALS->tims.end=GLOBALS->tims.last; middle=(GLOBALS->tims.start/2)+(GLOBALS->tims.end/2); if((GLOBALS->tims.start&1)&&(GLOBALS->tims.end&1)) middle++; } else { middle=GLOBALS->tims.marker; } width=(TimeType)(((gdouble)GLOBALS->wavewidth)*GLOBALS->nspx); GLOBALS->tims.start=time_trunc(middle-(width/2)); if(GLOBALS->tims.start+width>GLOBALS->tims.last) GLOBALS->tims.start=time_trunc(GLOBALS->tims.last-width); if(GLOBALS->tims.starttims.first) GLOBALS->tims.start=GLOBALS->tims.first; GTK_ADJUSTMENT(GLOBALS->wave_hslider)->value=GLOBALS->tims.timecache=GLOBALS->tims.start; fix_wavehadj(); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "changed"); /* force zoom update */ gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "value_changed"); /* force zoom update */ } static gboolean button_release_event (GtkWidget *text, GdkEventButton *event) { (void)event; gchar *sel; #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) GtkTextIter start; GtkTextIter end; if (gtk_text_buffer_get_selection_bounds (GTK_TEXT_VIEW(text)->buffer, &start, &end)) { if(gtk_text_iter_compare (&start, &end) < 0) { sel = gtk_text_buffer_get_text(GTK_TEXT_VIEW(text)->buffer, &start, &end, FALSE); if(sel) { int slen = strlen(sel); char *sel2 = NULL; if((slen)&&(sel[0]>='0')&&(sel[0]<='9')) { TimeType tm; gunichar gch = gtk_text_iter_get_char(&end); int do_si_append = 0; if(gch==' ') /* in case time is of format "100 ps" with a space */ { gtk_text_iter_forward_char(&end); gch = gtk_text_iter_get_char(&end); } if((sel[slen-1]>='0')&&(sel[slen-1]<='9')) /* need to append units? */ { int silen = strlen(WAVE_SI_UNITS); int silp; gch = tolower(gch); if(gch == 's') { do_si_append = 1; } else { for(silp=0;silptime_dimension); if((tm >= GLOBALS->tims.first) && (tm <= GLOBALS->tims.last)) { GLOBALS->tims.lmbcache = -1; update_markertime(GLOBALS->tims.marker = tm); center_op(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); update_markertime(GLOBALS->tims.marker = tm); /* centering problem in GTK2 */ } } if(sel2) { free_2(sel2); } g_free(sel); } } } #else #ifndef WAVE_USE_GTK2 GtkEditable *oe = GTK_EDITABLE(>K_TEXT(text)->editable); GtkTextClass *tc = (GtkTextClass *) ((GtkObject*) (GTK_OBJECT(text)))->klass; GtkEditableClass *oec = &tc->parent_class; #else GtkOldEditable *oe = GTK_OLD_EDITABLE(>K_TEXT(text)->old_editable); GtkOldEditableClass *oec = GTK_OLD_EDITABLE_GET_CLASS(oe); #endif if(oe->has_selection) { if(oec->get_chars) { sel = oec->get_chars(oe, oe->selection_start_pos, oe->selection_end_pos); if(sel) { int slen = strlen(sel); char *sel2 = NULL; if((slen)&&(sel[0]>='0')&&(sel[0]<='9')) { TimeType tm; gint gchpos = oe->selection_end_pos; gchar *extra = oec->get_chars(oe, gchpos, gchpos+2); gchar gch = extra ? extra[0] : 0; int do_si_append = 0; if(gch==' ') /* in case time is of format "100 ps" with a space */ { gch = gch ? extra[1] : 0; } if(extra) g_free(extra); if((sel[slen-1]>='0')&&(sel[slen-1]<='9')) /* need to append units? */ { int silen = strlen(WAVE_SI_UNITS); int silp; gch = tolower(gch); if(gch == 's') { do_si_append = 1; } else { for(silp=0;silptime_dimension); if((tm >= GLOBALS->tims.first) && (tm <= GLOBALS->tims.last)) { GLOBALS->tims.lmbcache = -1; update_markertime(GLOBALS->tims.marker = tm); center_op(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); update_markertime(GLOBALS->tims.marker = tm); /* centering problem in GTK2 */ } } if(sel2) { free_2(sel2); } g_free(sel); } } } #endif return(FALSE); /* call remaining handlers... */ } /* Create a scrolled text area that displays a "message" */ static GtkWidget *create_log_text (GtkWidget **textpnt) { GtkWidget *text; GtkWidget *table; GtkWidget *vscrollbar; /* Create a table to hold the text widget and scrollbars */ table = gtk_table_new (1, 16, FALSE); /* Put a text widget in the upper left hand corner. Note the use of * GTK_SHRINK in the y direction */ #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) text = gtk_text_view_new (); gtk_text_buffer_get_start_iter (gtk_text_view_get_buffer(GTK_TEXT_VIEW (text)), &GLOBALS->iter_logfile_c_2); GLOBALS->bold_tag_logfile_c_2 = gtk_text_buffer_create_tag (GTK_TEXT_VIEW (text)->buffer, "bold", "weight", PANGO_WEIGHT_BOLD, NULL); GLOBALS->mono_tag_logfile_c_1 = gtk_text_buffer_create_tag (GTK_TEXT_VIEW (text)->buffer, "monospace", "family", "monospace", NULL); GLOBALS->size_tag_logfile_c_1 = gtk_text_buffer_create_tag (GTK_TEXT_VIEW (text)->buffer, "fsiz", "size", (GLOBALS->use_big_fonts ? 12 : 8) * PANGO_SCALE, NULL); #else text = gtk_text_new (NULL, NULL); #endif *textpnt = text; gtk_table_attach (GTK_TABLE (table), text, 0, 14, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_SHRINK | GTK_EXPAND, 0, 0); gtk_widget_set_usize(GTK_WIDGET(text), 100, 100); #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) gtk_text_view_set_editable(GTK_TEXT_VIEW(text), TRUE); #else gtk_text_set_editable(GTK_TEXT(text), TRUE); #endif gtk_widget_show (text); /* And a VScrollbar in the upper right */ #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) { GtkTextViewClass *tc = (GtkTextViewClass*)GTK_OBJECT_GET_CLASS(GTK_OBJECT(text)); tc->set_scroll_adjustments(GTK_TEXT_VIEW (text), NULL, NULL); vscrollbar = gtk_vscrollbar_new (GTK_TEXT_VIEW (text)->vadjustment); } #else vscrollbar = gtk_vscrollbar_new (GTK_TEXT (text)->vadj); #endif gtk_table_attach (GTK_TABLE (table), vscrollbar, 15, 16, 0, 1, GTK_FILL, GTK_FILL | GTK_SHRINK | GTK_EXPAND, 0, 0); gtk_widget_show (vscrollbar); /* Add a handler to put a message in the text widget when it is realized */ gtk_signal_connect (GTK_OBJECT (text), "realize", GTK_SIGNAL_FUNC (log_realize_text), NULL); gtk_signal_connect(GTK_OBJECT(text), "button_release_event", GTK_SIGNAL_FUNC(button_release_event), NULL); #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_CHAR); #else gtk_text_set_word_wrap(GTK_TEXT(text), FALSE); gtk_text_set_line_wrap(GTK_TEXT(text), TRUE); #endif return(table); } /***********************************************************************************/ static void ok_callback(GtkWidget *widget, GtkWidget *cached_window) { (void)widget; struct logfile_instance_t *l = log_collection; struct logfile_instance_t *lprev = NULL; while(l) { if(l->window == cached_window) { if(lprev) { lprev->next = l->next; } else { log_collection = l->next; } free(l); /* deliberately not free_2 */ break; } lprev = l; l = l->next; } DEBUG(printf("OK\n")); gtk_widget_destroy(cached_window); } static void destroy_callback(GtkWidget *widget, GtkWidget *cached_window) { (void)cached_window; ok_callback(widget, widget); } void logbox(char *title, int width, char *default_text) { GtkWidget *window; GtkWidget *vbox; GtkWidget *hbox, *button1; GtkWidget *label, *separator; GtkWidget *ctext; GtkWidget *text; struct logfile_instance_t *log_c; FILE *handle; struct wave_logfile_lines_t *wlog_head=NULL, *wlog_curr=NULL; int wlog_size = 0; handle = fopen(default_text, "rb"); if(!handle) { char *buf = malloc_2(strlen(default_text)+128); sprintf(buf, "Could not open logfile '%s'\n", default_text); status_text(buf); free_2(buf); return; } /* fix problem where ungrab doesn't occur if button pressed + simultaneous accelerator key occurs */ if(GLOBALS->in_button_press_wavewindow_c_1) { gdk_pointer_ungrab(GDK_CURRENT_TIME); } #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) /* nothing */ #else if(!GLOBALS->font_logfile_c_1) { if(GLOBALS->fontname_logfile) { GLOBALS->font_logfile_c_1=gdk_font_load(GLOBALS->fontname_logfile); } if(!GLOBALS->font_logfile_c_1) { #ifndef __CYGWIN__ GLOBALS->font_logfile_c_1=gdk_font_load(GLOBALS->use_big_fonts ? "-*-courier-*-r-*-*-18-*-*-*-*-*-*-*" : "-*-courier-*-r-*-*-10-*-*-*-*-*-*-*"); #else GLOBALS->font_logfile_c_1=gdk_font_load(GLOBALS->use_big_fonts ? "-misc-fixed-*-*-*-*-18-*-*-*-*-*-*-*" : "-misc-fixed-*-*-*-*-10-*-*-*-*-*-*-*"); #endif } } #endif /* create a new nonmodal window */ window = gtk_window_new(GLOBALS->disable_window_manager ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL); if(GLOBALS->use_big_fonts || GLOBALS->fontname_logfile) { gtk_widget_set_usize( GTK_WIDGET (window), width*1.8, 600); } else { gtk_widget_set_usize( GTK_WIDGET (window), width, 400); } gtk_window_set_title(GTK_WINDOW (window), title); gtk_signal_connect(GTK_OBJECT (window), "delete_event", (GtkSignalFunc) destroy_callback, window); vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (window), vbox); gtk_widget_show (vbox); label=gtk_label_new(default_text); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); gtk_widget_show (label); separator = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0); gtk_widget_show (separator); ctext=create_log_text(&text); gtk_box_pack_start (GTK_BOX (vbox), ctext, TRUE, TRUE, 0); gtk_widget_show (ctext); separator = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0); gtk_widget_show (separator); hbox = gtk_hbox_new (FALSE, 1); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); gtk_widget_show (hbox); button1 = gtk_button_new_with_label ("Close Logfile"); gtk_widget_set_usize(button1, 100, -1); gtk_signal_connect(GTK_OBJECT (button1), "clicked", GTK_SIGNAL_FUNC(ok_callback), window); gtk_widget_show (button1); gtk_container_add (GTK_CONTAINER (hbox), button1); GTK_WIDGET_SET_FLAGS (button1, GTK_CAN_DEFAULT); gtk_signal_connect_object (GTK_OBJECT (button1), "realize", (GtkSignalFunc) gtk_widget_grab_default, GTK_OBJECT (button1)); gtk_widget_show(window); log_text_bold(text, NULL, "Click-select"); log_text(text, NULL, " on numbers to jump to that time value in the wave viewer.\n"); log_text(text, NULL, " \n"); while(!feof(handle)) { char *pnt = fgetmalloc(handle); if(pnt) { struct wave_logfile_lines_t *w = calloc_2(1, sizeof(struct wave_logfile_lines_t)); wlog_size += (GLOBALS->fgetmalloc_len+1); w->text = pnt; if(!wlog_curr) { wlog_head = wlog_curr = w; } else { wlog_curr->next = w; wlog_curr = w; } } } if(wlog_curr) { struct wave_logfile_lines_t *w = wlog_head; struct wave_logfile_lines_t *wt; char *pnt = malloc_2(wlog_size + 1); char *pnt2 = pnt; while(w) { int len = strlen(w->text); memcpy(pnt2, w->text, len); pnt2 += len; *pnt2 = '\n'; pnt2++; free_2(w->text); wt = w; w = w->next; free_2(wt); } /* wlog_head = */ wlog_curr = NULL; /* scan-build */ *pnt2 = 0; log_text(text, GLOBALS->font_logfile_c_1, pnt); free_2(pnt); } fclose(handle); log_c = calloc(1, sizeof(struct logfile_instance_t) + strlen(default_text)); /* deliberately not calloc_2, needs to be persistent! */ strcpy(log_c->default_text, default_text); log_c->window = window; log_c->text = text; log_c->next = log_collection; #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) log_c->bold_tag = GLOBALS->bold_tag_logfile_c_2; log_c->mono_tag = GLOBALS->mono_tag_logfile_c_1; log_c->size_tag = GLOBALS->size_tag_logfile_c_1; #else log_c->font_logfile = GLOBALS->font_logfile_c_1; #endif log_collection = log_c; } static void logbox_reload_single(GtkWidget *window, GtkWidget *text, char *default_text) { (void)window; FILE *handle; struct wave_logfile_lines_t *wlog_head=NULL, *wlog_curr=NULL; int wlog_size = 0; handle = fopen(default_text, "rb"); if(!handle) { char *buf = malloc_2(strlen(default_text)+128); sprintf(buf, "Could not open logfile '%s'\n", default_text); status_text(buf); free_2(buf); return; } #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) { GtkTextIter st_iter, en_iter; gtk_text_buffer_get_start_iter(GTK_TEXT_VIEW (text)->buffer, &st_iter); gtk_text_buffer_get_end_iter(GTK_TEXT_VIEW (text)->buffer, &en_iter); gtk_text_buffer_delete(GTK_TEXT_VIEW (text)->buffer, &st_iter, &en_iter); gtk_text_buffer_get_start_iter (GTK_TEXT_VIEW (text)->buffer, &GLOBALS->iter_logfile_c_2); } #else { guint len = gtk_text_get_length(GTK_TEXT(text)); gtk_text_set_point(GTK_TEXT(text), 0); gtk_text_freeze(GTK_TEXT(text)); gtk_text_forward_delete (GTK_TEXT(text), len); } #endif log_text_bold(text, NULL, "Click-select"); log_text(text, NULL, " on numbers to jump to that time value in the wave viewer.\n"); log_text(text, NULL, " \n"); while(!feof(handle)) { char *pnt = fgetmalloc(handle); if(pnt) { struct wave_logfile_lines_t *w = calloc_2(1, sizeof(struct wave_logfile_lines_t)); wlog_size += (GLOBALS->fgetmalloc_len+1); w->text = pnt; if(!wlog_curr) { wlog_head = wlog_curr = w; } else { wlog_curr->next = w; wlog_curr = w; } } } if(wlog_curr) { struct wave_logfile_lines_t *w = wlog_head; struct wave_logfile_lines_t *wt; char *pnt = malloc_2(wlog_size + 1); char *pnt2 = pnt; while(w) { int len = strlen(w->text); memcpy(pnt2, w->text, len); pnt2 += len; *pnt2 = '\n'; pnt2++; free_2(w->text); wt = w; w = w->next; free_2(wt); } /* wlog_head = */ wlog_curr = NULL; /* scan-build */ *pnt2 = 0; log_text(text, GLOBALS->font_logfile_c_1, pnt); free_2(pnt); } #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) #else gtk_text_thaw(GTK_TEXT(text)); #endif fclose(handle); } void logbox_reload(void) { struct logfile_instance_t *l = log_collection; while(l) { #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) GLOBALS->bold_tag_logfile_c_2 = l->bold_tag; GLOBALS->mono_tag_logfile_c_1 = l->mono_tag; GLOBALS->size_tag_logfile_c_1 = l->size_tag; #else GLOBALS->font_logfile_c_1 = l->font_logfile; #endif logbox_reload_single(l->window, l->text, l->default_text); l = l->next; } } gtkwave-3.3.86/src/pixmaps.c0000664000175000017500000030471713166335473015234 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2012. * * 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. */ #include "globals.h" #include #include "pixmaps.h" #ifdef WAVE_USE_GTK2 /* Apply GMASK to GPIX and return a GdkPixbuf with an alpha channel. */ /* this function from gtkutil.c in emacs */ static GdkPixbuf * xg_get_pixbuf_from_pix_and_mask (GdkPixmap *gpix, GdkPixmap *gmask, GdkColormap *cmap) { int width, height; GdkPixbuf *icon_buf, *tmp_buf; gdk_drawable_get_size (gpix, &width, &height); tmp_buf = gdk_pixbuf_get_from_drawable (NULL, gpix, cmap, 0, 0, 0, 0, width, height); icon_buf = gdk_pixbuf_add_alpha (tmp_buf, FALSE, 0, 0, 0); g_object_unref (G_OBJECT (tmp_buf)); if (gmask) { GdkPixbuf *mask_buf = gdk_pixbuf_get_from_drawable (NULL, gmask, NULL, 0, 0, 0, 0, width, height); guchar *pixels = gdk_pixbuf_get_pixels (icon_buf); guchar *mask_pixels = gdk_pixbuf_get_pixels (mask_buf); int rowstride = gdk_pixbuf_get_rowstride (icon_buf); int mask_rowstride = gdk_pixbuf_get_rowstride (mask_buf); int y; for (y = 0; y < height; ++y) { guchar *iconptr, *maskptr; int x; iconptr = pixels + y * rowstride; maskptr = mask_pixels + y * mask_rowstride; for (x = 0; x < width; ++x) { /* In a bitmap, RGB is either 255/255/255 or 0/0/0. Checking just R is sufficient. */ if (maskptr[0] == 0) iconptr[3] = 0; /* 0, 1, 2 is R, G, B. 3 is alpha. */ iconptr += rowstride/width; maskptr += mask_rowstride/width; } } g_object_unref (G_OBJECT (mask_buf)); } return(icon_buf); } #endif /* XPM */ static char * icon_redo[] = { "24 24 126 2", " c None", ". c #000000", "+ c #F0FFEE", "@ c #CAE3C6", "# c #F5FFF4", "$ c #0D110C", "% c #729C6C", "& c #A6CAA1", "* c #CBE4C7", "= c #EFFDEE", "- c #172116", "; c #88B583", "> c #CCE5C8", ", c #CDE6C9", "' c #CFE7CB", ") c #F3FFF2", "! c #7FA879", "~ c #689063", "{ c #CDE5C9", "] c #CFE7CA", "^ c #D0E9CC", "/ c #D4EAD0", "( c #D5ECD1", "_ c #AED5A9", ": c #9ABC95", "< c #63865F", "[ c #2B3A29", "} c #8CB887", "| c #70986A", "1 c #71986B", "2 c #729A6B", "3 c #759C6D", "4 c #759F6F", "5 c #76A170", "6 c #567453", "7 c #AFCBAC", "8 c #7EAB77", "9 c #78A472", "0 c #6F9669", "a c #70976A", "b c #71996B", "c c #739B6D", "d c #759F6E", "e c #77A170", "f c #526F4C", "g c #B7D2B2", "h c #60835B", "i c #A5C9A0", "j c #9AC195", "k c #4F6B4C", "l c #769F70", "m c #516D4C", "n c #B9D5B4", "o c #7BA574", "p c #C7E0C3", "q c #6D9568", "r c #51714E", "s c #B6D3B2", "t c #81AB7C", "u c #C3DBBF", "v c #6B9265", "w c #C8EFC3", "x c #A7CCA2", "y c #B5D2B1", "z c #80A87A", "A c #90B68B", "B c #79A674", "C c #C6EAC1", "D c #DEF7D9", "E c #B3D7AE", "F c #BBD9B8", "G c #AFCCAB", "H c #749E6D", "I c #5B7B57", "J c #8CB087", "K c #BBE1B6", "L c #DAF5D6", "M c #E1F7DD", "N c #DCF4D6", "O c #D7F0D3", "P c #CFECCB", "Q c #C6E3C3", "R c #BCD6B9", "S c #7EA778", "T c #64885F", "U c #A6C1A3", "V c #B3D5AE", "W c #CDEAC9", "X c #D0EBCB", "Y c #CAE9C5", "Z c #C7E6C3", "` c #C3E3BF", " . c #BDDCBA", ".. c #B5D2B2", "+. c #96B991", "@. c #76A071", "#. c #3A4E37", "$. c #5E7F5A", "%. c #8FAF8B", "&. c #9CBE97", "*. c #C7E0C4", "=. c #CBE3C6", "-. c #CDE4C9", ";. c #CBE4C8", ">. c #C7E1C4", ",. c #C2DBBF", "'. c #88AF82", "). c #6B9266", "!. c #557451", "~. c #63885E", "{. c #759C70", "]. c #749E6F", "^. c #72996B", "/. c #739A6D", "(. c #71996C", "_. c #6E9668", ":. c #6C9367", "<. c #5F815A", "[. c #70996B", "}. c #6E9467", "|. c #698F63", "1. c #6B9166", "2. c #5D8059", "3. c #4D6A49", "4. c #6A8F64", "5. c #283926", " . ", " . . ", " . + . ", " . . . . @ # . ", " $ % & @ @ * * = . . . ", " - ; @ @ * * > , ' ) . . ! ~ . ", " . % @ * * > { ] ^ / ( _ . . : < . ", " [ & @ } | 1 2 3 4 5 6 . . 7 . ", ". 8 @ 9 0 a b c d e f . . g h . ", ". i j 0 k . . . l m . . . n o . ", ". p q h . . r . . . . s t . ", ". u v . . . . w . . x y z . ", ". A B . . . C D . . . E F G H . ", ". I J . . K L M N O P Q R S T . ", " . U . . V W X Y Z ` ...+.@.#.. ", " . $.%.. . &.*.=., -.;.>.,.'.).!.. ", " . ~.{.. . ].^.c /.(.| _.:.<.. . ", " . . . [.}.|.~ 1.2.3.. . ", " . q 4.. . . . ", " 5.).. ", " . . ", " . ", " ", " "}; /* XPM */ static char * icon_larrow[] = { "24 24 43 1", " c None", ". c #000000", "+ c #B9D0B9", "@ c #CDDECB", "# c #B6C7B6", "$ c #B1C9B0", "% c #B3C4B3", "& c #B4CBB2", "* c #B5CEB5", "= c #B7CCB5", "- c #B9CEB7", "; c #BAD1BA", "> c #BBCFBA", ", c #BBD0B9", "' c #B2C9B0", ") c #7EAB78", "! c #AAC7A8", "~ c #B3CAB1", "{ c #B0C9B0", "] c #B0C9AE", "^ c #AEC7AC", "/ c #AAC5A8", "( c #A9C4A7", "_ c #698267", ": c #2D2D2D", "< c #CFDFCC", "[ c #ADC8AB", "} c #B0C7AE", "| c #ADC6AB", "1 c #678C63", "2 c #9BAD9A", "3 c #85AE81", "4 c #87AF84", "5 c #87B083", "6 c #88AF84", "7 c #88B085", "8 c #86AF82", "9 c #547150", "0 c #3C5235", "a c #5B7950", "b c #4A6342", "c c #3B5035", "d c #415639", " ", " ", " ", " . ", " .. ", " .+. ", " .@#. ", " .@$%........ ", " .@&*=-;->,'). ", " .@!~{]^///^(_. ", " :<[}||[!^^}^[1. ", " .23444445645789. ", " .0aaaaaaaaaaab. ", " .0aaaaaaaaaab. ", " .0aabccccccd. ", " .0ab........ ", " .0b. ", " .b. ", " .. ", " . ", " ", " ", " ", " "}; /* XPM */ static char * icon_rarrow[] = { "24 24 41 1", " c None", ". c #000000", "+ c #8CA782", "@ c #B1CDAE", "# c #77A16E", "$ c #B4CEB1", "% c #ACC8A9", "& c #709867", "* c #C1D6BD", "= c #BDD3B8", "- c #BFD4BB", "; c #C2D7BE", "> c #B0CAAD", ", c #B2CBB0", "' c #AAC7A8", ") c #0F1308", "! c #AEC5A8", "~ c #AEC8AD", "{ c #ABC7A8", "] c #AAC6A7", "^ c #A8C6A5", "/ c #ADC8AD", "( c #A8C7A8", "_ c #A5C4A3", ": c #7F9F76", "< c #A6BFA0", "[ c #ABC7AA", "} c #A7C5A4", "| c #A9C7A6", "1 c #AFC8AD", "2 c #A4C3A2", "3 c #6B9060", "4 c #778E6F", "5 c #698D60", "6 c #6B9063", "7 c #445B2C", "8 c #6B8661", "9 c #5B7950", "0 c #6C8562", "a c #65815C", "b c #506B46", " ", " ", " ", " . ", " .. ", " .+. ", " .@#. ", " ........$%&. ", " .*=-;;;;>,'&) ", " .!~{{{]^'/(_:. ", " .<[^}^|{%'{123. ", " .45666666666657. ", " .8999999999997. ", " .099999999997. ", " .abbbbbb9997. ", " ........b97. ", " .b7. ", " .7. ", " .. ", " . ", " ", " ", " ", " "}; /* XPM */ static char * icon_zoomin[] = { "24 24 131 2", " c None", ". c #343434", "+ c #2D2D2D", "@ c #292929", "# c #262626", "$ c #2E2E2E", "% c #303030", "& c #737373", "* c #A1A1A1", "= c #B4B4B4", "- c #B2B2B2", "; c #9D9D9D", "> c #676767", ", c #202020", "' c #1C1C1C", ") c #272727", "! c #616161", "~ c #CACACA", "{ c #CFCFCF", "] c #D0D0D0", "^ c #CECECE", "/ c #C9C9C9", "( c #C1C1C1", "_ c #A7A7A7", ": c #4C4C4C", "< c #131313", "[ c #222222", "} c #757575", "| c #D3D3D3", "1 c #DBDBDB", "2 c #E7E7E7", "3 c #EFEFEF", "4 c #F3F3F3", "5 c #F1F1F1", "6 c #E5E5E5", "7 c #D2D2D2", "8 c #BCBCBC", "9 c #5E5E5E", "0 c #101010", "a c #212121", "b c #5B5B5B", "c c #CCCCCC", "d c #D7D7D7", "e c #F5F5F5", "f c #FAFAFA", "g c #FBFBFB", "h c #F8F8F8", "i c #F0F0F0", "j c #E1E1E1", "k c #C2C2C2", "l c #434343", "m c #0F0F0F", "n c #1F1F1F", "o c #B9B9B9", "p c #D6D6D6", "q c #F9F9F9", "r c #FDFDFD", "s c #FCFCFC", "t c #F2F2F2", "u c #ECECEC", "v c #E4E4E4", "w c #ABABAB", "x c #0E0E0E", "y c #1B1B1B", "z c #6D6D6D", "A c #FEFEFE", "B c #EEEEEE", "C c #E6E6E6", "D c #575757", "E c #090909", "F c #141414", "G c #A8A8A8", "H c #D8D8D8", "I c #F6F6F6", "J c #F4F4F4", "K c #DCDCDC", "L c #9B9B9B", "M c #060606", "N c #111111", "O c #C5C5C5", "P c #DFDFDF", "Q c #444444", "R c #454545", "S c #424242", "T c #EDEDED", "U c #BFBFBF", "V c #C6C6C6", "W c #E3E3E3", "X c #414141", "Y c #EAEAEA", "Z c #E0E0E0", "` c #BABABA", " . c #050505", ".. c #0B0B0B", "+. c #A5A5A5", "@. c #D1D1D1", "#. c #939393", "$. c #020202", "%. c #0A0A0A", "&. c #5F5F5F", "*. c #D9D9D9", "=. c #EBEBEB", "-. c #E9E9E9", ";. c #D4D4D4", ">. c #000000", ",. c #E2E2E2", "'. c #DADADA", "). c #CBCBCB", "!. c #3B3B3B", "~. c #D5D5D5", "{. c #C8C8C8", "]. c #BDBDBD", "^. c #515151", "/. c #C7C7C7", "(. c #CDCDCD", "_. c #B8B8B8", ":. c #030303", "<. c #313131", "[. c #999999", "}. c #BBBBBB", "|. c #B6B6B6", "1. c #909090", "2. c #2B2B2B", "3. c #010101", "4. c #7A7A7A", "5. c #9A9A9A", "6. c #777777", "7. c #3C3C3C", "8. c #686868", "9. c #797979", "0. c #3A3A3A", " ", " . + @ # # # ", " $ % & * = - ; > , ' ", " ) ! = ~ { ] ^ / ( _ : < ", " [ } ~ | 1 2 3 4 5 6 7 8 9 0 ", " a b c d 6 e f g f h e i j k l m ", " n o p 2 q g r r s g h t u v w x ", " y z 7 j e f r A A r s q e B C 1 D E ", " F G H B I q s A A r g h J B C K L M ", " N O P 3 e Q Q R R R Q l S T 6 1 U M ", " x V W u t l Q Q Q Q l S X Y Z d ` . ", " ..+.j 2 T 5 J I I e 4 3 u v 1 @.#.$. ", " %.&.*.j C =.B 3 3 B T -.v 1 ;.~ : >. ", " %.= H K ,.6 C C 2 W P '.;.).* $. ", " M !.c 7 ;.'.1 '.1 H ~.] {.].$ >. ", " .^.k /.).c (.).).{.k _.R >. ", " :.<.[.}.].8 8 8 |.1.2.>.>.>. ", " 3.:.X 4.5.5.6.7.>.>. >.>.>.>. ", " >.>.>.>.>.>. , , >.>. ", " >.8.. >.>. ", " >.9.0.>.>. ", " >.8.n >. ", " >.>. ", " "}; /* XPM */ static char * icon_zoomout[] = { "24 24 132 2", " c None", ". c #343434", "+ c #2D2D2D", "@ c #292929", "# c #262626", "$ c #2E2E2E", "% c #303030", "& c #737373", "* c #A1A1A1", "= c #B4B4B4", "- c #B2B2B2", "; c #9D9D9D", "> c #676767", ", c #202020", "' c #1C1C1C", ") c #272727", "! c #616161", "~ c #CACACA", "{ c #CFCFCF", "] c #D0D0D0", "^ c #CECECE", "/ c #C9C9C9", "( c #C1C1C1", "_ c #A7A7A7", ": c #4C4C4C", "< c #131313", "[ c #222222", "} c #757575", "| c #D3D3D3", "1 c #DBDBDB", "2 c #E7E7E7", "3 c #EFEFEF", "4 c #F3F3F3", "5 c #F1F1F1", "6 c #E5E5E5", "7 c #D2D2D2", "8 c #BCBCBC", "9 c #5E5E5E", "0 c #101010", "a c #212121", "b c #5B5B5B", "c c #CCCCCC", "d c #D7D7D7", "e c #F5F5F5", "f c #FAFAFA", "g c #FBFBFB", "h c #F8F8F8", "i c #F0F0F0", "j c #E1E1E1", "k c #C2C2C2", "l c #434343", "m c #0F0F0F", "n c #1F1F1F", "o c #B9B9B9", "p c #D6D6D6", "q c #F9F9F9", "r c #FDFDFD", "s c #454545", "t c #F2F2F2", "u c #ECECEC", "v c #E4E4E4", "w c #ABABAB", "x c #0E0E0E", "y c #1B1B1B", "z c #6D6D6D", "A c #FEFEFE", "B c #FCFCFC", "C c #EEEEEE", "D c #E6E6E6", "E c #575757", "F c #090909", "G c #141414", "H c #A8A8A8", "I c #D8D8D8", "J c #F6F6F6", "K c #F4F4F4", "L c #DCDCDC", "M c #9B9B9B", "N c #060606", "O c #111111", "P c #C5C5C5", "Q c #DFDFDF", "R c #444444", "S c #424242", "T c #EDEDED", "U c #BFBFBF", "V c #C6C6C6", "W c #E3E3E3", "X c #414141", "Y c #EAEAEA", "Z c #E0E0E0", "` c #BABABA", " . c #050505", ".. c #0B0B0B", "+. c #A5A5A5", "@. c #D1D1D1", "#. c #939393", "$. c #020202", "%. c #0A0A0A", "&. c #5F5F5F", "*. c #D9D9D9", "=. c #EBEBEB", "-. c #E9E9E9", ";. c #D4D4D4", ">. c #000000", ",. c #E2E2E2", "'. c #3F3F3F", "). c #DADADA", "!. c #CBCBCB", "~. c #3B3B3B", "{. c #D5D5D5", "]. c #C8C8C8", "^. c #BDBDBD", "/. c #515151", "(. c #C7C7C7", "_. c #CDCDCD", ":. c #B8B8B8", "<. c #030303", "[. c #313131", "}. c #999999", "|. c #BBBBBB", "1. c #B6B6B6", "2. c #909090", "3. c #2B2B2B", "4. c #010101", "5. c #7A7A7A", "6. c #9A9A9A", "7. c #777777", "8. c #3C3C3C", "9. c #686868", "0. c #797979", "a. c #3A3A3A", " ", " . + @ # # # ", " $ % & * = - ; > , ' ", " ) ! = ~ { ] ^ / ( _ : < ", " [ } ~ | 1 2 3 4 5 6 7 8 9 0 ", " a b c d 6 e f g f h e i j k l m ", " n o p 2 q g r s s g h t u v w x ", " y z 7 j e f r A s s B q e C D 1 E F ", " G H I C J q B A s s g h K C D L M N ", " O P Q 3 e R R s s s R l S T 6 1 U N ", " x V W u t l R R R R l S X Y Z d ` . ", " ..+.j 2 T 5 K J l l 4 3 u v 1 @.#.$. ", " %.&.*.j D =.C 3 X X T -.v 1 ;.~ : >. ", " %.= I L ,.6 D '.'.W Q ).;.!.* $. ", " N ~.c 7 ;.).1 ).1 I {.] ].^.$ >. ", " ./.k (.!.c _.!.!.].k :.s >. ", " <.[.}.|.^.8 8 8 1.2.3.>.>.>. ", " 4.<.X 5.6.6.7.8.>.>. >.>.>.>. ", " >.>.>.>.>.>. , , >.>. ", " >.9.. >.>. ", " >.0.a.>.>. ", " >.9.n >. ", " >.>. ", " "}; /* XPM */ static char * icon_zoomfit[] = { "24 24 140 2", " c None", ". c #343434", "+ c #2D2D2D", "@ c #292929", "# c #262626", "$ c #2E2E2E", "% c #303030", "& c #737373", "* c #A1A1A1", "= c #B4B4B4", "- c #B2B2B2", "; c #9D9D9D", "> c #676767", ", c #202020", "' c #1C1C1C", ") c #272727", "! c #616161", "~ c #CACACA", "{ c #CFCFCF", "] c #D0D0D0", "^ c #CECECE", "/ c #C9C9C9", "( c #C1C1C1", "_ c #A7A7A7", ": c #4C4C4C", "< c #131313", "[ c #222222", "} c #757575", "| c #D3D3D3", "1 c #DBDBDB", "2 c #E7E7E7", "3 c #EFEFEF", "4 c #F3F3F3", "5 c #F1F1F1", "6 c #E5E5E5", "7 c #D2D2D2", "8 c #BCBCBC", "9 c #5E5E5E", "0 c #101010", "a c #212121", "b c #5B5B5B", "c c #CCCCCC", "d c #464646", "e c #4B4B4B", "f c #505050", "g c #525252", "h c #FBFBFB", "i c #FAFAFA", "j c #515151", "k c #4F4F4F", "l c #4A4A4A", "m c #C2C2C2", "n c #434343", "o c #0F0F0F", "p c #1F1F1F", "q c #B9B9B9", "r c #D6D6D6", "s c #535353", "t c #FDFDFD", "u c #FCFCFC", "v c #4D4D4D", "w c #E4E4E4", "x c #ABABAB", "y c #0E0E0E", "z c #1B1B1B", "A c #6D6D6D", "B c #E1E1E1", "C c #FEFEFE", "D c #F9F9F9", "E c #4E4E4E", "F c #E6E6E6", "G c #575757", "H c #090909", "I c #141414", "J c #A8A8A8", "K c #D8D8D8", "L c #EEEEEE", "M c #F8F8F8", "N c #DCDCDC", "O c #9B9B9B", "P c #060606", "Q c #111111", "R c #C5C5C5", "S c #DFDFDF", "T c #F5F5F5", "U c #F7F7F7", "V c #F2F2F2", "W c #EDEDED", "X c #BFBFBF", "Y c #C6C6C6", "Z c #E3E3E3", "` c #ECECEC", " . c #F4F4F4", ".. c #F0F0F0", "+. c #EAEAEA", "@. c #E0E0E0", "#. c #D7D7D7", "$. c #BABABA", "%. c #050505", "&. c #0B0B0B", "*. c #A5A5A5", "=. c #F6F6F6", "-. c #D1D1D1", ";. c #939393", ">. c #020202", ",. c #0A0A0A", "'. c #5F5F5F", "). c #D9D9D9", "!. c #E9E9E9", "~. c #484848", "{. c #D4D4D4", "]. c #000000", "^. c #494949", "/. c #474747", "(. c #454545", "_. c #CBCBCB", ":. c #3B3B3B", "<. c #DADADA", "[. c #444444", "}. c #414141", "|. c #BDBDBD", "1. c #C7C7C7", "2. c #CDCDCD", "3. c #C8C8C8", "4. c #B8B8B8", "5. c #030303", "6. c #313131", "7. c #999999", "8. c #BBBBBB", "9. c #B6B6B6", "0. c #909090", "a. c #2B2B2B", "b. c #010101", "c. c #7A7A7A", "d. c #9A9A9A", "e. c #777777", "f. c #3C3C3C", "g. c #686868", "h. c #797979", "i. c #3A3A3A", " ", " . + @ # # # ", " $ % & * = - ; > , ' ", " ) ! = ~ { ] ^ / ( _ : < ", " [ } ~ | 1 2 3 4 5 6 7 8 9 0 ", " a b c d e f g h i j f k l m n o ", " p q r : g g s t u g j k v w x y ", " z A 7 B f g t C C t u D f E F 1 G H ", " I J K L j g u C C t h M f E F N O P ", " Q R S 3 T M h t t u i U V W 6 1 X P ", " y Y Z ` V T M i i i U ...+.@.#.$.%. ", " &.*.B 2 E k .=.=.T 4 3 v e 1 -.;.>. ", " ,.'.).B e v L 3 3 L W !.e ~.{.~ : ]. ", " ,.= K ~.l e e F 2 l ^./.(._.* >. ", " P :.c (.(./.~.<.1 /.d [.}.|.$ ]. ", " %.j m 1._.c 2._._.3.m 4.(.]. ", " 5.6.7.8.|.8 8 8 9.0.a.].].]. ", " b.5.}.c.d.d.e.f.].]. ].].].]. ", " ].].].].].]. , , ].]. ", " ].g.. ].]. ", " ].h.i.].]. ", " ].g.p ]. ", " ].]. ", " "}; /* XPM */ static char * icon_zoomundo[] = { "24 24 31 1", " c None", ". c #000000", "+ c #EFE5BA", "@ c #EFE7C1", "# c #EED680", "$ c #EFE4B6", "% c #D5B75D", "& c #B29544", "* c #D1B051", "= c #C0AF73", "- c #C0A048", "; c #986B07", "> c #D1940C", ", c #E0B74C", "' c #D9C374", ") c #8F6406", "! c #D59D1C", "~ c #B1933F", "{ c #DFB74A", "] c #CCB76D", "^ c #B8820A", "/ c #D9A72E", "( c #D7A62C", "_ c #C7B26A", ": c #D4B150", "< c #A39256", "[ c #E2CB79", "} c #C9B46B", "| c #8D7E4A", "1 c #AE9C5C", "2 c #96864F", " ", " ", " ", " . ", " .. ", " .+. ", " .@#.... ", " .$####%&. ", " .+#######*. ", " .=#########-. ", " .;>>>>>>,#'.. ", " .)>>>>>>!#~. ", " .)>...;>{]. ", " .;. ..^/#. ", " .. ..>#. ", " . .(_. ", " .:<. ", " .[. ", " .}|. ", " .12. ", " .. ", " ", " ", " "}; /* XPM */ static char * zoom_larrow[] = { "24 24 57 1", " c None", ". c #000000", "+ c #F7F7F7", "@ c #CBD6CA", "# c #E7EFE7", "$ c #ACC8A9", "% c #C9DBC9", "& c #E6EEE5", "* c #BFCEBF", "= c #E7EFE6", "- c #BBCFBA", "; c #B3C4B3", "> c #E6EEE6", ", c #B9CEB7", "' c #B5CEB5", ") c #B7CCB5", "! c #BFD4BF", "~ c #C7D7C5", "{ c #DBE5DB", "] c #DAE5D9", "^ c #CBDAC9", "/ c #7EAB78", "( c #BAD1B9", "_ c #B3CAB1", ": c #B0C9B0", "< c #B0C9AE", "[ c #AEC7AC", "} c #AAC5A8", "| c #A9C4A7", "1 c #698267", "2 c #E4ECE3", "3 c #2D2D2D", "4 c #E0EADE", "5 c #B3CCB1", "6 c #B0C7AE", "7 c #ADC6AB", "8 c #ADC8AB", "9 c #AAC7A8", "0 c #678C63", "a c #9FB79B", "b c #6B9063", "c c #C2CDC2", "d c #8EB48A", "e c #87AF84", "f c #87B083", "g c #88AF84", "h c #88B085", "i c #86AF82", "j c #547150", "k c #95A88F", "l c #5B7950", "m c #3C5235", "n c #4A6342", "o c #3B5035", "p c #415639", "q c #889D7F", "r c #475E3E", " ", " ", " ", " .... . ", " .+@. .. ", " .#$. .%. ", " .#$. .&*. ", " .#$. .=-;........ ", " .#$. .>,'),!~{]^/. ", " .#$. .>(_:<[}}}[|1. ", " .2$. 34567789[[6[80. ", " .ab..cdeeeeefgefhij. ", " .kl. .mllllllllllln. ", " .kl. .mlllllllllln. ", " .kl. .mllnoooooop. ", " .kl. .mln........ ", " .kl. .mn. ", " .kl. .n. ", " .qr. .. ", " .... . ", " ", " ", " ", " "}; /* XPM */ static char * zoom_rarrow[] = { "24 24 52 1", " c None", ". c #000000", "+ c #F7F7F7", "@ c #CBD6CA", "# c #BECEBA", "$ c #E7EFE7", "% c #ACC8A9", "& c #EBF2EA", "* c #77A16E", "= c #E3EBE2", "- c #709867", "; c #F8F8F7", "> c #F1F5F0", ", c #ECF2EB", "' c #E5EEE3", ") c #E0EBDF", "! c #D8E6D6", "~ c #C6D9C2", "{ c #C5D7C3", "] c #B2CBB0", "^ c #AAC7A8", "/ c #0F1308", "( c #DDE6DB", "_ c #AEC8AD", ": c #ABC7A8", "< c #AAC6A7", "[ c #A8C6A5", "} c #ADC8AD", "| c #A8C7A8", "1 c #A5C4A3", "2 c #7F9F76", "3 c #D6E1D4", "4 c #ABC7AA", "5 c #A7C5A4", "6 c #A9C7A6", "7 c #AFC8AD", "8 c #A4C3A2", "9 c #6B9060", "0 c #E4ECE3", "a c #A7B6A2", "b c #698D60", "c c #6B9063", "d c #445B2C", "e c #9FB79B", "f c #9FB199", "g c #5B7950", "h c #95A88F", "i c #9FAF99", "j c #789171", "k c #506B46", "l c #889D7F", "m c #475E3E", " ", " ", " ", " . .... ", " .. .+@. ", " .#. .$%. ", " .&*. .$%. ", " ........=%-. .$%. ", " .;>,')!~{]^-/ .$%. ", " .(_:::<[^}|12. .$%. ", " .34[5[6:%^:789. .0%. ", " .abccccccccccbd..ec. ", " .fgggggggggggd. .hg. ", " .iggggggggggd. .hg. ", " .jkkkkkkgggd. .hg. ", " ........kgd. .hg. ", " .kd. .hg. ", " .d. .hg. ", " .. .lm. ", " . .... ", " ", " ", " ", " "}; /* XPM */ static char * prev_page_xpm[] = { "24 24 170 2", " c None", ". c #000000", "+ c #040506", "@ c #0B0F12", "# c #959FAA", "$ c #C3C6CA", "% c #82909E", "& c #F1F1F1", "* c #D5D7D8", "= c #0A0D10", "- c #11171C", "; c #8693A0", "> c #EFF0F0", ", c #DEDEDE", "' c #D5D5D5", ") c #9B9FA4", "! c #0E1317", "~ c #85929F", "{ c #DBDBDB", "] c #CACACA", "^ c #C8C8C8", "/ c #C8C9CA", "( c #0C0F13", "_ c #141A20", ": c #798895", "< c #D2D2D2", "[ c #C3C3C3", "} c #CDCDCD", "| c #74797E", "1 c #171F26", "2 c #7F8D9A", "3 c #DADADA", "4 c #D3D3D3", "5 c #C4C4C4", "6 c #CECECE", "7 c #C0C0C0", "8 c #B1B1B1", "9 c #0D1115", "0 c #768592", "a c #EEEFEF", "b c #D9D9D9", "c c #D0D0D0", "d c #C2C2C2", "e c #CBCBCB", "f c #C9C9C9", "g c #BCBCBC", "h c #A4A7A9", "i c #686B6C", "j c #333333", "k c #414F5D", "l c #ADB5BC", "m c #EAEAEA", "n c #BFBFBF", "o c #BDBDBD", "p c #C6C6C6", "q c #B5B6B7", "r c #899096", "s c #B8B8B8", "t c #FFFFFF", "u c #404142", "v c #4D6074", "w c #EBEBEB", "x c #D1D1D1", "y c #C1C1C1", "z c #B7B7B7", "A c #979FA7", "B c #A1A3A4", "C c #FCFDFD", "D c #F3F4F4", "E c #EBECED", "F c #EAEBEC", "G c #E9EAEB", "H c #EEEFF1", "I c #F6F7F8", "J c #E4E5E6", "K c #929395", "L c #32414F", "M c #8C98A2", "N c #E7E7E7", "O c #BBBBBB", "P c #A4A7AB", "Q c #939699", "R c #D7D8D8", "S c #FAFCFC", "T c #F9FAFB", "U c #F8F9FA", "V c #F7F8F9", "W c #F5F6F8", "X c #F7F7F9", "Y c #C6C7C7", "Z c #4F5E6A", "` c #4C5F72", " . c #E8E8E8", ".. c #BEBEBE", "+. c #1F1F1F", "@. c #B5B5B6", "#. c #979EA4", "$. c #A8A8A8", "%. c #FDFEFE", "&. c #F5F6F6", "*. c #E7E9E9", "=. c #F0F1F2", "-. c #E0E2E3", ";. c #8F969D", ">. c #151C22", ",. c #354453", "'. c #8D99A2", "). c #E3E3E3", "!. c #8E949A", "~. c #9D9F9F", "{. c #F2F3F4", "]. c #F1F2F3", "^. c #F6F6F7", "/. c #A6A8AB", "(. c #737F8A", "_. c #4B5F71", ":. c #CDDECB", "<. c #97999B", "[. c #E7E8E8", "}. c #F4F5F5", "|. c #FBFBFB", "1. c #D8D8DA", "2. c #939BA3", "3. c #0F1418", "4. c #B1C9B0", "5. c #E6E7E8", "6. c #FAFAFB", "7. c #F5F5F7", "8. c #AEB2B6", "9. c #5C6C7C", "0. c #B4CBB2", "a. c #B5CEB5", "b. c #B9CEB7", "c. c #BAD1BA", "d. c #BBD0B9", "e. c #B2C9B0", "f. c #7EAB78", "g. c #FBFCFC", "h. c #DEE1E3", "i. c #9DA6AE", "j. c #AAC7A8", "k. c #B3CAB1", "l. c #B0C9B0", "m. c #AEC7AC", "n. c #AAC5A8", "o. c #A9C4A7", "p. c #698267", "q. c #F9F9FA", "r. c #BBBFC4", "s. c #566779", "t. c #2D2D2D", "u. c #CFDFCC", "v. c #ADC8AB", "w. c #B0C7AE", "x. c #ADC6AB", "y. c #678C63", "z. c #D1D2D4", "A. c #9AA3AC", "B. c #3C5235", "C. c #5B7950", "D. c #4A6342", "E. c #E8ECEE", "F. c #B2B8BE", "G. c #717D88", "H. c #3B5035", "I. c #415639", "J. c #7A8695", "K. c #768594", "L. c #2C343D", "M. c #21272E", " . + ", " @ # $ . ", " @ % & * = ", " - ; > , ' ) . ", " ! ~ > { ] ^ / ( ", " _ : & ' ] < [ } | . ", " 1 2 > 3 4 5 6 7 ] 8 9 ", ". 0 a b 4 c d e f g h i j . . . . . . . ", "k l m < n } e o p q r s t t t t t t t u . ", ". v w x [ y ^ z [ A B C D E F G H I J K . ", " L M N f O 5 d P Q R C S T U V W X Y Z . ", " . ` .p ..+.@.#.$.%.&.*.E F =.U -.;.>.. ", " ,.'.).. . !.~.t %.C S {.].V ^./.(.+ ", " . _.. :.. <.b t [.a }.T U |.1.2.3. ", " . :.4.. . . . . . . 5.6.7.8.9.. ", " . :.0.a.b.c.b.d.e.f.. T g.h.i.= ", " . :.j.k.l.m.n.n.m.o.p.. g.q.r.s.. ", "t.u.v.w.x.x.j.m.m.m.v.y.. t z.A.+ ", " . B.C.C.C.C.C.C.C.C.D.. E.F.G.. ", " . B.C.C.H.H.H.H.H.I.. J.K.. ", " . B.C.. . . . . . . L.M. ", " . B.. ", " . . ", " . "}; /* XPM */ static char * next_page_xpm[] = { "24 24 172 2", " c None", ". c #000000", "+ c #040506", "@ c #0B0F12", "# c #959FAA", "$ c #C3C6CA", "% c #82909E", "& c #F1F1F1", "* c #D5D7D8", "= c #0A0D10", "- c #11171C", "; c #8693A0", "> c #EFF0F0", ", c #DEDEDE", "' c #D5D5D5", ") c #9B9FA4", "! c #0E1317", "~ c #85929F", "{ c #DBDBDB", "] c #CACACA", "^ c #C8C8C8", "/ c #C8C9CA", "( c #0C0F13", "_ c #141A20", ": c #798895", "< c #D2D2D2", "[ c #C3C3C3", "} c #CDCDCD", "| c #74797E", "1 c #171F26", "2 c #7F8D9A", "3 c #DADADA", "4 c #D3D3D3", "5 c #C4C4C4", "6 c #CECECE", "7 c #C0C0C0", "8 c #B1B1B1", "9 c #0D1115", "0 c #768592", "a c #EEEFEF", "b c #D9D9D9", "c c #D0D0D0", "d c #C2C2C2", "e c #CBCBCB", "f c #C9C9C9", "g c #BCBCBC", "h c #A4A7A9", "i c #686B6C", "j c #333333", "k c #414F5D", "l c #ADB5BC", "m c #EAEAEA", "n c #BFBFBF", "o c #BDBDBD", "p c #C6C6C6", "q c #B5B6B7", "r c #899096", "s c #B8B8B8", "t c #FFFFFF", "u c #404142", "v c #4D6074", "w c #EBEBEB", "x c #D1D1D1", "y c #C1C1C1", "z c #B7B7B7", "A c #979FA7", "B c #A1A3A4", "C c #FCFDFD", "D c #F3F4F4", "E c #EBECED", "F c #EAEBEC", "G c #E9EAEB", "H c #EEEFF1", "I c #F6F7F8", "J c #E4E5E6", "K c #929395", "L c #32414F", "M c #8C98A2", "N c #E7E7E7", "O c #BBBBBB", "P c #A4A7AB", "Q c #939699", "R c #D7D8D8", "S c #FAFCFC", "T c #F9FAFB", "U c #F8F9FA", "V c #F7F8F9", "W c #F5F6F8", "X c #F7F7F9", "Y c #C6C7C7", "Z c #4F5E6A", "` c #4C5F72", " . c #E8E8E8", ".. c #BEBEBE", "+. c #B5B5B6", "@. c #979EA4", "#. c #A8A8A8", "$. c #FDFEFE", "%. c #F5F6F6", "&. c #E7E9E9", "*. c #F0F1F2", "=. c #8F969D", "-. c #151C22", ";. c #354453", ">. c #8D99A2", ",. c #E3E3E3", "'. c #8E949A", "). c #9D9F9F", "!. c #F2F3F4", "~. c #F1F2F3", "{. c #F6F6F7", "]. c #4B5F71", "^. c #E5E5E5", "/. c #9E9FA0", "(. c #97999B", "_. c #E7E8E8", ":. c #F4F5F5", "<. c #FBFBFB", "[. c #D8D8DA", "}. c #77A16E", "|. c #394957", "1. c #828F97", "2. c #8A8E92", "3. c #B4B4B4", "4. c #ACC8A9", "5. c #709867", "6. c #4A5D70", "7. c #ABABAB", "8. c #F8F8F8", "9. c #C1D6BD", "0. c #BDD3B8", "a. c #BFD4BB", "b. c #C2D7BE", "c. c #B2CBB0", "d. c #AAC7A8", "e. c #0F1308", "f. c #242F3A", "g. c #696D71", "h. c #777879", "i. c #F2F3F3", "j. c #AEC5A8", "k. c #AEC8AD", "l. c #ABC7A8", "m. c #AAC6A7", "n. c #A8C6A5", "o. c #ADC8AD", "p. c #A8C7A8", "q. c #A5C4A3", "r. c #7F9F76", "s. c #4A5F74", "t. c #313E4B", "u. c #B3BDC6", "v. c #D1D7DD", "w. c #D9DEE3", "x. c #F6F7F7", "y. c #A6BFA0", "z. c #ABC7AA", "A. c #A9C7A6", "B. c #AFC8AD", "C. c #A4C3A2", "D. c #6B9060", "E. c #2B343C", "F. c #29323B", "G. c #4F5F70", "H. c #5E7184", "I. c #919EAB", "J. c #6C8562", "K. c #5B7950", "L. c #445B2C", "M. c #252D35", "N. c #65815C", "O. c #506B46", " . + ", " @ # $ . ", " @ % & * = ", " - ; > , ' ) . ", " ! ~ > { ] ^ / ( ", " _ : & ' ] < [ } | . ", " 1 2 > 3 4 5 6 7 ] 8 9 ", ". 0 a b 4 c d e f g h i j . . . . . . . ", "k l m < n } e o p q r s t t t t t t t u . ", ". v w x [ y ^ z [ A B C D E F G H I J K . ", " L M N f O 5 d P Q R C S T U V W X Y Z . ", " . ` .p ..s +.@.#.$.%.&.E F *.U . =.-.. ", " ;.>.,.y ..'.).t $.C S !.~.V {.. . + ", " . ].^.y /.(.b t _.a :.T U <.[.. }.. ", " |.1.{ 2.3.t t $.. . . . . . . 4.5.. ", " . 6.O 7.t 8.& > . 9.0.a.b.b.b.c.d.5.e. ", " f.g.h.i.t t t . j.k.l.l.m.n.o.p.q.r.. ", " . s.t.u.v.w.x.. y.z.n.n.A.l.d.l.B.C.D.. ", " . E.F.G.H.I.. J.K.K.K.K.K.K.K.K.L.. ", " . . M.. N.O.O.O.O.O.K.K.L.. ", " . . . . . . . K.L.. ", " . L.. ", " . . ", " . "}; /* XPM */ static char *wave_info[] = { /* columns rows colors chars-per-pixel */ "64 64 24 1", " c #030401", ". c #1A2A0A", "X c #243910", "o c #345414", "O c #3C6317", "+ c #45711A", "@ c #4C7722", "# c #51841F", "$ c #599222", "% c #609E24", "& c #69AD28", "* c #7AC82E", "= c #7A965E", "- c #7C9861", "; c #85DA32", ": c #8BE434", "> c #809C64", ", c #8FB26D", "< c #99C370", "1 c #A3CE79", "2 c #ACD485", "3 c #BDE992", "4 c #C1EC98", "5 c #C7EEA1", /* pixels */ "3333333333333333333333333333333333333333333334333333333333333343", "3323333233332333333333333333333333333333333333333333333333333333", "3333433334333333433334343333334433344433333534343343333434333333", "332>>>,,>>,<<,,>>,>,>>,><<,>,>,,>,,>,,1,,>,,,>,>>,,<<,,,,>,>,233", "33- . X@+X . . .+@o . o@+. . X@@. . >43", "23= .+O. O+o o+o .++. >43", "33= .O+. O+o o+O .++. -33", "33= .++. +%&$O+++OO+++O$&%+ .++. -34", "33- .++. o*::::::::::::::::*o .++. -43", "33= .O+. +::::;:::::::::::::O .OO. -43", "33= .++. $:;:;;;;*;;*;;;;:::$ .++. -33", "33= .++. &:*%+oooooooooo@%;:& .++. -34", "33= .+O. X*:&+o o+&:;X .++. >43", "33= .++. O::&+o X+%::o .++. >44", "33= .++X $::$+o o+$;:$ .++. .-33", "33,+OOOOOOO++OOOOO+oO*:*@+OoOO+OOOOOO++@*:*OOOOOOOO+++OOOOOoO,43", "33,+++++++++++++++++#;:&++++++++++++++++*:;#++++++++++++++++@<33", "33<+++O#++++++++++++%::&++++++++++++++++&:;%+++++++++++++++++<33", "33>OoOooooO++OoooOoO%::#O+OooooOooooo++O@;:&ooooooO++ooooOooO,33", "33= .O+. &:*XO+o o+OX*:& .++. -43", "33- .++. .*:%.O+o oOO.%:*. .++. -44", "33= .++. o;:+ O+X o+O +:;o .O+. >44", "33= .+O. +::o O+o o@O o::+ .++. -34", "33= .++. %:*. O+X o+O .*:% .+O. -43", "33= .++. .&:& .O+o X+O. &:*. .++. -43", "33= .+O. X;:# O+o o+O #:*X .OO. -44", "33= .++. +;:o .O+X o+O o::O .++. -43", "33- .O+. $:*. OOo o+O X*:$ .++. -43", "33= .++. .&:&. O+o oOO &:&. .++. =43", "33- .++. .;:$ .O+o o+O. .$:*. .++X .-43", "33,OOOOOOOO++OOOo%::%OoO+++oOOOoOOOoOO++OoO%::$OOOO++OoOOOOO+,43", "33,++++++++++++++&:;$++++++++++++++++++++++$::&++++++++++++++,44", "33,@++++++++++++@*:*#++++++++++++++++++++++#*:*++++++++++++++,44", "33,OooooooO++Ooo+;:&oooO++Ooooooooooo+++oooo&:;+ooO++OooooooO,43", "33- .++. O;:+ O+o o+O. +:;O .++. -44", "33- .++. #:*o .O+o o+O o;:+ .++. -44", "33= .++. &:*. O+o X+O. .*:& .++. .=44", "33= .+O. .*:% O+o o+O %:*. .O+. =43", "33= .++. o;;+ O+X o+O +:;o .+O. -44", "33- .O+. +:;o OOo o+O o;:+ .++. -44", "33- .+O. &:*. O+o o+O .*:& .++. -44", "33- .++. *:& O+o X+o &:* .+O. -44", "33= .++.X;:@ O+o o+O #:;X.O+. -44", "33= .++.O:;o .OOo o+O o::O.++. -43", "33- X++X$:*X .++o o+O. X*:$X++. .-44", "33,OooOOOOOO++*:*OOOoOoo++OoOoOOoOoOO+++OooOOO+*:*+++OOOOoOOo,44", "33,++++++++++#;:&@+++++++++++++++++++++++++++++&:;$++++@+++++<43", "33<@+++++++++%::&++++++++++++++++++++++++++++++&::%O+++++++++<44", "33,OoOoOoOO++&::+ooOOooO++OOOooOOOoooO++OOoooOo+;:*++OoOooOoO,44", "33- .+@*:&. .O+o o+O .&:*@+. >44", "33- .+#;:% O+o o+O. $:;#+. -44", "33- .O%::+ OOo o+O +::%O. -44", "33- .oooo+%*:*o O+X o+O o*:*$+oOoo =44", "33- O;;:;:;::* .O+o X+o. .*:::::;;;O .=44", "33- #::::::::% O+o o+O %::::::::# -44", "33- O;:::::::+ O+o o++ +;:;:;::;O -44", "35- oOoO+%%+. O@X X+O .@%%+OOOo -55", "35- .++. O@o o+O .++. >53", "33- .++. O+X o+O X+O. -43", "33-. . . .X@@X. . .. ..@@o.. . . . o@@.. . .. . X@@X . . ..>44", "332,,,,,,,,22,,<,,<,<,<,22,,,<<,<,<,12<2<<,<,<,<<,1211<<<<,<2243", "3333333343333335335353533335355354455433445455545533445444543335", "4233333333333333333333333333333333333333434344343335333334333334", "5353533353353435444444535355354555455455545555555455555555555555" }; /* XPM */ static char *wave_alert[] = { /* columns rows colors chars-per-pixel */ "64 64 55 1", " c #030200", ". c #1A1501", "X c #1A1A1A", "o c #241E02", "O c #2C2402", "+ c #352B03", "@ c #3E3303", "# c #272212", "$ c #262626", "% c #322F23", "& c #333022", "* c #463903", "= c #5B4B05", "- c #7D6306", "; c #836806", ": c #8E6D16", "> c #916F15", ", c #977314", "< c #A77C12", "1 c #DD550F", "2 c #E15E13", "3 c #E86801", "4 c #F46E00", "5 c #EE7601", "6 c #F57A00", "7 c #E86B1A", "8 c #E9771B", "9 c #ED7923", "0 c #AB8708", "q c #B08D08", "w c #B78914", "e c #CB910A", "r c #D89907", "t c #CB9412", "y c #F78900", "u c #E29E05", "i c #F89600", "p c #F68D19", "a c #F79518", "s c #CFA008", "d c #D7A508", "f c #E8A305", "g c #FAA601", "h c #EBB207", "j c #FBB100", "k c #F8A11C", "l c #EE8426", "z c #F2882A", "x c #F79C2D", "c c #F28D31", "v c #F59937", "b c #F8A62B", "n c #F8A736", "m c #F9B036", "M c None", /* pixels */ "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM9v9MMMMMMMMMMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMvnvMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMM9nxn9MMMMMMMMMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMvnxnv9MMMMMMMMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMvnbbxvcMMMMMMMMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMMMMMMMMMMM8nbxxbvn9MMMMMMMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMMMMMMMMMMMcnxbbxbbv1MMMMMMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMMMMMMMMMMznbbxvxbxvzMMMMMMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMMMMMMMMM7nnxbbxbxxbv7MMMMMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMMMMMMMMMvnbxxbnxbxxncMMMMMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMMMMMMMMlnbbbbxxbxxxvn9MMMMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMMMMMMMMvvbbnxbbxbxxxnv7MMMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMMMMMMMzmbbbbbxxbxbxxxnzMMMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMMMMMM7nbbnbxxbbbxxxxxxn7MMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMMMMMMvnbbbbbbbbxbxbxxxvvMMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMMMMMzmbbbbbbbbbbbbxxxxxnzMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMMMMMnbbbbbbe<0<<$$$$$>bnxxxxbxxv9MMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMMbmbbbmbbbbb,$$$$$>kbxxxxxcxxcMMMMMMMMMMMMMMMMM", "MMMMMMMMMMMMMMMMMlnbbbbbbbbbb,%$$$% c #A050A050A050", ", c #A75FA75FA75F", "< c #AEE1AEE1AEE1", "1 c #B6C8B6C8B6C8", "2 c #BF08BF08BF08", "3 c #8D95CFC9852A", "4 c #8F63D1058715", "5 c #9587D4AD8BC2", "6 c #93CDD23F8E7D", "7 c #9587D2DB8F63", "8 c #9663D5488CAC", "9 c #98EDD5E28F63", "0 c #9663D3779048", "q c #9816D412920D", "w c #9B6DD714920D", "e c #9C40D7AD92ED", "r c #9DE3D84593CD", "t c #9F82D9759587", "y c #A050D9759663", "u c #A37CDB3998ED", "i c #A37CDB3999C4", "p c #A50DDC649B6D", "a c #A69ADCF99C40", "s c #A75FDD8E9D12", "d c #A9A8DEB69F82", "f c #B284DE22AB2A", "g c #BAF4E194B4A9", "h c #BDAFE2B7B77C", "j c #C457E4F8BF08", "k c #823DB3F3E06F", "l c #8F63BDAFE588", "z c #9048BE5CE617", "x c #9C40C64BEB10", "c c #9D12C83AEB9C", "v c #A75FCD4CF077", "b c #A9A8CFC9F100", "n c #B33CD4ADF4B4", "m c #B4A9D5E2F53B", "M c #BD01DA0CF85A", "N c #BD01DAA3F85A", "B c #C64BC64BC64B", "V c #CC0BCC0BCC0B", "C c #D23FD23FD23F", "Z c #D548D548D548", "A c #D714D714D714", "S c #D845D845D845", "D c #D9C0D9C0D9C0", "F c #DBCFDBCFDBCF", "G c #DCF9DCF9DCF9", "H c #D23FEB10CDEC", "J c #D377EB9CCFC9", "K c #D412EC27D067", "L c #D548ECB2D23F", "P c #C3AFDE22FA6A", "I c #D975DFDDF53B", "U c #DE22E468F6CC", "Y c #DF4AE588F751", "T c #E348E96BF85A", "R c None", /* pixels */ "RRRRRRRRRRRRRRRR", "RRRRRRPNmbRRRRRR", "RRRRRRMTYcRRRRRR", "RRRRRRnUIzRRRRRR", "RRRRRRvxlkRRRRRR", "RRRRRRRRRRRRRRRR", "RRRRRRRSZRRRRRRR", "RRGFDACVB21<,>RR", "RRDRRRRRRRRRR:RR", "RRRRRRRRRRRRRRRR", "dspuRRe84;RR%#+o", "aLKtRR5jh=RR@q0X", "iJHeRR3gf&RRO76 ", "yrw9RR-*&$RRX. ", "RRRRRRRRRRRRRRRR", "RRRRRRRRRRRRRRRR" }; /* XPM */ static char *cog[] = { /* columns rows colors chars-per-pixel */ "16 16 103 2", " c #494949", ". c #4E4E4E", "X c #515151", "o c gray32", "O c #535353", "+ c #585858", "@ c #5A5A5A", "# c #5B5B5B", "$ c gray36", "% c gray38", "& c #626262", "* c #646464", "= c #676767", "- c DimGray", "; c #6A6A6A", ": c gray42", "> c #6D6D6D", ", c gray43", "< c #6F6F6F", "1 c #717171", "2 c #767676", "3 c #777777", "4 c #797979", "5 c gray48", "6 c #7E7E7E", "7 c #808080", "8 c #818181", "9 c gray51", "0 c #838383", "q c #848484", "w c gray52", "e c gray53", "r c #898989", "t c #8B8B8B", "y c gray55", "u c gray56", "i c #939393", "p c gray58", "a c #959595", "s c gray60", "d c #9A9A9A", "f c gray61", "g c gray62", "h c #A0A0A0", "j c gray63", "k c gray64", "l c #A4A4A4", "z c #A5A5A5", "x c gray65", "c c #A7A7A7", "v c gray66", "b c #AAAAAA", "n c gray67", "m c #ACACAC", "M c gray68", "N c gray69", "B c #B1B1B1", "V c #B2B2B2", "C c gray71", "Z c #B6B6B6", "A c #B7B7B7", "S c #B9B9B9", "D c gray73", "F c #BCBCBC", "G c gray74", "H c gray", "J c gray75", "K c #C0C0C0", "L c #C1C1C1", "P c gray76", "I c #C3C3C3", "U c gray77", "Y c #C5C5C5", "T c #C6C6C6", "R c gray78", "E c #C8C8C8", "W c gray79", "Q c #CACACA", "! c #CBCBCB", "~ c gray80", "^ c #CDCDCD", "/ c #CECECE", "( c gray81", ") c #D0D0D0", "_ c gray82", "` c #D2D2D2", "' c gray83", "] c #D5D5D5", "[ c gray84", "{ c #D8D8D8", "} c gray85", "| c gray86", " . c gainsboro", ".. c #DDDDDD", "X. c gray87", "o. c #E2E2E2", "O. c #E4E4E4", "+. c gray90", "@. c #E7E7E7", "#. c #E9E9E9", "$. c gray93", "%. c gray100", "&. c None", /* pixels */ "&.&.&.&.&.&.W I I L &.&.&.&.&.&.", "&.&.&._ / / W +.+.M Z N M &.&.&.", "&.&._ / / I I . .N N M c k &.&.", "&._ .$. .I D [ [ N M / #.Z t &.", "&.W I .[ { { { [ { _ / W 3 1 &.", "&.&.I [ / W D f j I I L Z t &.&.", "W I L { / D 0 3 6 u I L / u q q ", "I #.[ W / k q &.&.d M I D I .: ", "D o.[ I / N u &.&.a c I D L _ & ", "k u j _ I / j d a u L D D & + O ", "&.&.M I L I W c k L D Z c : &.&.", "&.M c [ I / _ W W / I L W , = &.", "&.k D .k q q L L , , k _ 0 O &.", "&.&.0 1 & 3 q / W & @ @ . &.&.", "&.&.&., : 4 0 D N $ @ @ . &.&.&.", "&.&.&.&.&.&., + O O &.&.&.&.&.&." }; /* XPM */ static char *chart_line[] = { /* columns rows colors chars-per-pixel */ "16 16 78 1", " c #2E5FA5", ". c #3062A9", "X c #3062AA", "o c #3264AC", "O c #3366AE", "+ c #3468B1", "@ c #3568B2", "# c #366BB5", "$ c #376BB6", "% c #3C72BF", "& c #3D74C2", "* c #3E75C3", "= c #3E76C4", "- c #3F76C5", "; c #3F77C6", ": c #4670BB", "> c #5A6BAD", ", c #4277C6", "< c #4078C7", "1 c #4179C9", "2 c #417ACA", "3 c #427ACB", "4 c #427BCC", "5 c #437CCC", "6 c #437CCD", "7 c #447DCE", "8 c #457ED0", "9 c #457FD1", "0 c #709FBD", "q c #8D527D", "w c #AE4565", "e c #ED222B", "r c #EE262E", "t c #EE272F", "y c #EF2830", "u c #EF2B32", "i c #EF2D34", "p c #F02E35", "a c #F03137", "s c #F03238", "d c #F13339", "f c #F1363C", "g c #F1373C", "h c #F2383D", "j c #F2393E", "k c #E73741", "l c #E83841", "z c #F23B40", "x c #F03D43", "c c #F23C41", "v c #F33D42", "b c #F33F43", "n c #CC4D62", "m c #F44246", "M c #F44347", "N c #F44548", "B c #F54A4D", "V c #F64D4F", "C c #F75254", "Z c #F85758", "A c #F85859", "S c #F95C5C", "D c #F95D5D", "F c #F96160", "G c #FA6362", "H c #FB6665", "J c #FB6765", "K c #FB6B69", "L c #8F6493", "P c #A85E82", "I c #8CA1C0", "U c #93ACD1", "Y c #9CB1D0", "T c #FE9694", "R c #FC9997", "E c #FEB5B2", "W c gray100", "Q c None", /* pixels */ "QQQQQQQQQQQQQQQQ", "QQQQQQQQQQQQQBNb", "QQQQQQQQQQQQQmRj", "QQQQQQQQQQQQmbjd", "QQQQQQQQQQQQzfdQ", "QQQQQQQ971QjfaQQ", "KHGQQQQ5Y0>kq$+O", "HEDAQQ51-:kw$+IX", "FDACVP,-QdiQQO. ", "QQQ7LnlfdiyQQQQQ", "QQ51,=faTrQQQQQQ", "951-QQQyreQQQQQQ", "1U=QQQQQQQQQQQQQ", "1=%QQQQQQQQQQQQQ", "QQQQQQQQQQQQQQQQ", "QQQQQQQQQQQQQQQQ" }; /* XPM */ static char *flag_green[] = { /* columns rows colors chars-per-pixel */ "16 16 107 2", " c #321D16", ". c #507A51", "X c #87581D", "o c #8F5F21", "O c #9A6A2B", "+ c #9C6B2C", "@ c #886534", "# c #976E35", "$ c #A4722E", "% c #AC7935", "& c #AC7B38", "* c #B07E3A", "= c #4DA630", "- c #4CA631", "; c #4DA631", ": c #4CA534", "> c #47A538", ", c #45A33C", "< c #52A035", "1 c #47B133", "2 c #47B233", "3 c #4CB335", "4 c #3B9477", "5 c #44864D", "6 c #548D49", "7 c #4C984C", "8 c #539447", "9 c #5B9946", "0 c #478856", "q c #428559", "w c #4B8C59", "e c #79B75E", "r c #63A76A", "t c #74CD5F", "y c #77CE63", "u c #78CF64", "i c #7ACF66", "p c #75C568", "a c #7BCD6A", "s c #7CCF68", "d c #7DD06A", "f c #7ED16C", "g c #70C777", "h c #BB8436", "j c #B1803C", "k c #BE8C45", "l c #C08C42", "z c #C79246", "x c #CA974D", "c c #D49E53", "v c #D6A256", "b c #DBAF6E", "n c #DFB77D", "m c #80D16D", "M c #3C7BA0", "N c #3084A1", "B c #478787", "V c #78BCB3", "C c #90AB8D", "Z c #ACB3AC", "A c #E2BC86", "S c #C0B4A0", "D c #96C282", "F c #96CF8E", "G c #8ED680", "H c #92D884", "J c #94D986", "K c #9BDB90", "L c #A2C99D", "P c #A1DE95", "I c #A3DE97", "U c #A3DF98", "Y c #A4DF99", "T c #A5DE9B", "R c #A5DF9B", "E c #A7E09E", "W c #9EDCA7", "Q c #98D7B6", "! c #A9D3A0", "~ c #A9E0A1", "^ c #ABE1A2", "/ c #AAE0A3", "( c #ABE0A3", ") c #AFE3A7", "_ c #B0E3A8", "` c #B0E3AA", "' c #B1E3AB", "] c #B6E4AE", "[ c #B7E6B0", "{ c #B7E6B2", "} c #B9E6B4", "| c #B9E7B4", " . c #BAE7B6", ".. c #BCE7B7", "X. c #BCE7B8", "o. c #BFE9B9", "O. c #BEE8BA", "+. c #E4C18F", "@. c #C0E9BD", "#. c #C2E9BF", "$. c #C3EBC1", "%. c #C6EBC3", "&. c #C7ECC5", "*. c #C8ECC6", "=. c #CBEDC9", "-. c #FBF7EF", ";. c None", /* pixels */ ";.;.;.;.;.;.;.;.;.;.;.;.;.;.;.;.", ";.;.;.;.;.;.;.. 6 7 0 @ X X ;.;.", ";.;.;.;.;.;.< e #.] m 8 -.h X ;.", ";.B : - ; = D %.=.o...S A $ ;.;.", ";.w @.X...$.*._ O.Y W # +.o ;.;.", ";.8 ~ u u H I [ { U F % b X ;.;.", ";.9 ^ i s H R ._ P L l n X ;.;.", "M ! K d f J E &.} [ C v z X ;.;.", "N ` y t G ) | ( p g Z v * X ;.;.", "4 T / / ' a 3 r Q V c O ;.;.;.", "q , 2 1 > 5 ;.;.;.;.+ v X ;.;.;.", ";.;.;.;.;.;.;.;.;.X j v X ;.;.;.", ";.;.;.;.;.;.;.;.;.X x v X ;.;.;.", ";.;.;.;.;.;.;.;.;.X v k X ;.;.;.", ";.;.;.;.;.;.;.;.;.X v & ;.;.;.;.", ";.;.;.;.;.;.;.;.;.X X X ;.;.;.;." }; /* XPM */ static char *arrow_divide[] = { /* columns rows colors chars-per-pixel */ "16 16 127 2", " c #2C6C27", ". c #2F702A", "X c #2F712B", "o c #31732C", "O c #32742D", "+ c #32752D", "@ c #33762E", "# c #34772F", "$ c #35782F", "% c #357830", "& c #367930", "* c #367A31", "= c #387C32", "- c #3A7E34", "; c #3B7F35", ": c #3E8438", "> c #3F8538", ", c #408539", "< c #43863D", "1 c #438A3C", "2 c #448B3D", "3 c #478E3F", "4 c #478C41", "5 c #498B43", "6 c #489040", "7 c #499141", "8 c #499142", "9 c #4B9443", "0 c #4C9145", "q c #4C9344", "w c #4C9544", "e c #4E9746", "r c #4E9846", "t c #4F9847", "y c #53974C", "u c #509A48", "i c #539D4A", "p c #55A04C", "a c #56A24D", "s c #57A34E", "d c #58A44F", "f c #59A550", "g c #5AA651", "h c #5BA751", "j c #5BA852", "k c #5CA952", "l c #5EAA55", "z c #5EAB54", "x c #5EAC54", "c c #5FAC55", "v c #61A35B", "b c #62A45B", "n c #65A75E", "m c #60AE56", "M c #61AF57", "N c #62B057", "B c #62B158", "V c #65B45A", "C c #66B55B", "Z c #69B95E", "A c #6BAB63", "S c #6BAC65", "D c #6CAF64", "F c #6FAF68", "G c #6BB560", "H c #6BBC60", "J c #6EBA64", "K c #6CBD61", "L c #71B16B", "P c #71B268", "I c #73B36D", "U c #72B469", "Y c #74B66C", "T c #76B66D", "R c #76B76D", "E c #72BE67", "W c #78B670", "Q c #78B770", "! c #7BB974", "~ c #7ABE75", "^ c #7CBE77", "/ c #7DBF77", "( c #6FC164", ") c #70C265", "_ c #71C466", "` c #72C466", "' c #72C566", "] c #73C668", "[ c #7FC079", "{ c #80C176", "} c #82C27C", "| c #84C37D", " . c #85C37E", ".. c #84C579", "X. c #87C47F", "o. c #89CA7E", "O. c #8ACC7F", "+. c #87C580", "@. c #88C582", "#. c #89C682", "$. c #8BC784", "%. c #8CC683", "&. c #8ACC80", "*. c #8CC885", "=. c #8FCC85", "-. c #90C988", ";. c #90CA89", ":. c #92CA8A", ">. c #94CB8C", ",. c #95CC8D", "<. c #95CC8E", "1. c #97CE8F", "2. c #98CE90", "3. c #9ACF92", "4. c #9BCF93", "5. c #9ED196", "6. c #A1D398", "7. c #A2D499", "8. c #A4D49C", "9. c #A6D59D", "0. c #A8D79F", "q. c #A9D7A0", "w. c #AAD7A1", "e. c #ABD8A2", "r. c #ADDAA4", "t. c gray100", "y. c None", /* pixels */ "y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.", "y.y.y.' _ y.y.y.y.y.y.z d y.y.y.", "y.y.' &.o.H y.y.y.y.h Y U u y.y.", "] ' O.r.q...C N z g Y 4.1.A 3 2 ", "_ K =.e.q.{ m z g p P 1.,.F 1 , ", "y.K E 0.8.m y.y.y.y.r >.;.0 > y.", "y.Z J 8.7.l g y.y.e 0 ;.*.4 ; y.", "y.C G 6.5.R p y.y.8 n $.@.< * y.", "y.N m *.4.,.D e 8 b X.X.L * + y.", "y.y.g p W ;.;.! W @.| v * o y.y.", "y.y.y.i t q I @.X.S = $ o y.y.y.", "y.y.y.y.y.3 y | } 5 # y.y.y.y.y.", "y.y.y.y.y.y.> / ^ + y.y.y.y.y.y.", "y.y.y.y.y.y.; ^ ~ X y.y.y.y.y.y.", "y.y.y.y.y.y.$ + X y.y.y.y.y.y.", "y.y.y.y.y.y.y.y.y.y.y.y.y.y.y.y." }; /* XPM */ static char *arrow_inout[] = { /* columns rows colors chars-per-pixel */ "16 16 109 2", " c #418A3E", ". c #428B3F", "X c #428C3F", "o c #438D40", "O c #448D40", "+ c #458E41", "@ c #458F41", "# c #469042", "$ c #479143", "% c #499244", "& c #499445", "* c #4A9545", "= c #4B9646", "- c #4C9747", "; c #4E974A", ": c #4D9948", "> c #4E9948", ", c #4F9B4A", "< c #509C4A", "1 c #519E4B", "2 c #529F4C", "3 c #5A9C56", "4 c #5B9E57", "5 c #54A14E", "6 c #55A24E", "7 c #56A34F", "8 c #57A450", "9 c #57A550", "0 c #58A551", "q c #58A651", "w c #59A752", "e c #5AA852", "r c #5AA853", "t c #5BA953", "y c #5BAA54", "u c #5CAA54", "i c #5CAB54", "p c #5DAB55", "a c #5EAA57", "s c #5DAC55", "d c #5EAD56", "f c #5FAD56", "g c #5FAE57", "h c #5EA15A", "j c #60A15C", "k c #62A45F", "l c #60AF58", "z c #61B058", "x c #61B159", "c c #62B159", "v c #62B259", "b c #63B35A", "n c #64B35A", "m c #64B25B", "M c #64B45B", "N c #64B05C", "B c #66B65C", "V c #67B75D", "C c #68B95E", "Z c #69B95F", "A c #68A963", "S c #6DB167", "D c #6ABB60", "F c #6BBC60", "G c #6CBD61", "H c #6CBE62", "J c #6DBF62", "K c #6DBF63", "L c #6EB168", "P c #6FB369", "I c #77B96F", "U c #75B071", "Y c #77B373", "T c #79B374", "R c #77B871", "E c #78BB70", "W c #79BB71", "Q c #79B972", "! c #7ABA73", "~ c #7BB874", "^ c #7EB679", "/ c #6EC063", "( c #70C365", ") c #71C365", "_ c #72C466", "` c #72C566", "' c #72C467", "] c #73C667", "[ c #73C269", "{ c #74C768", "} c #85BF7D", "| c #87CA7E", " . c #86BD80", ".. c #89BF83", "X. c #8AC184", "o. c #8BC186", "O. c #8DC387", "+. c #8ACD80", "@. c #8BCE81", "#. c #8CCC83", "$. c #90CF86", "%. c #92C68C", "&. c #93C78C", "*. c #94C78D", "=. c #98CD8E", "-. c #9FD197", ";. c #A0D098", ":. c #A7D69E", ">. c None", /* pixels */ "{ { ] ] ( >.>.>.>.>.>.B M c l d ", "{ @.$.( >.K >.>.>.>.B >.n W R u ", "] @.:.#.[ K >.>.>.>.n c W *.W r ", "( ( | =.-.F >.>.>.>.c &.} W 0 0 ", "( >.K -.-.Z >.>.>.>.g &.O.u >.8 ", ">.K K F Z Z >.>.>.>.u t 0 0 6 >.", ">.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.", ">.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.", ">.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.", ">.>.>.>.>.>.>.>.>.>.>.>.>.>.>.>.", ">.c c g d r >.>.>.>.1 < : ; * >.", "B >.c X.o.r >.>.>.>., ^ T * >.$ ", "l g R ~ .8 >.>.>.>., T A h % @ ", "d R ..L 8 6 >.>.>.>.* ; k U 4 X ", "d L L 9 >.5 >.>.>.>.* >.@ h 3 X ", "0 9 8 6 1 >.>.>.>.>.>.@ @ @ X " }; /* XPM */ static char *application[] = { /* columns rows colors chars-per-pixel */ "16 16 90 1", " c #5171A9", ". c #5172A9", "X c #5373A9", "o c #5373AA", "O c #5475AB", "+ c #5475AC", "@ c #5676AD", "# c #5779AE", "$ c #587AB0", "% c #587BB1", "& c #5A7CB2", "* c #5C7EB4", "= c #5C7EB5", "- c #5E81B7", "; c #5F83B9", ": c #6085BA", "> c #6185BB", ", c #6387BD", "< c #6488BE", "1 c #668BC0", "2 c #688EC3", "3 c #6F90C1", "4 c #6C92C8", "5 c #6C94C9", "6 c #6E94CA", "7 c #6F96CB", "8 c #6F97CC", "9 c #7A9AC4", "0 c #7099CE", "q c #729ACF", "w c #739CD1", "e c #739DD2", "r c #759ED4", "t c #76A0D5", "y c #79A2D8", "u c #79A3D9", "i c #7AA4DA", "p c #7AA4DB", "a c #7AA6DC", "s c #7BA7DC", "d c #85ACDD", "f c #8DB1DD", "g c #92B9E8", "h c #DEE7F2", "j c #E4EAF3", "k c #E7EBF5", "l c #E8ECF6", "z c #EAEFF6", "x c #EAF0F7", "c c #EBF2F7", "v c #EDF3F7", "b c #ECF2F8", "n c #EFF3FA", "m c #EEF4F8", "M c #F0F5F9", "N c #F2F5FB", "B c #F1F6FB", "V c #F2F7FA", "C c #F2F7FB", "Z c #F3F7FB", "A c #F4F7FB", "S c #F4F8FB", "D c #F5F8FB", "F c #F5F9FB", "G c #F7F9FB", "H c #F6FAFB", "J c #F7FAFB", "K c #F6FBFB", "L c #F7FBFC", "P c #F7FCFC", "I c #F9FBFB", "U c #F8FBFC", "Y c #F9FBFC", "T c #F8FCFC", "R c #F9FCFC", "E c #F8FDFD", "W c #F9FDFD", "Q c #FAFCFC", "! c #FAFDFD", "~ c #FBFDFD", "^ c #FAFEFE", "/ c #FBFEFE", "( c #FCFDFD", ") c #FCFEFE", "_ c #FDFEFE", "` c #FCFFFF", "' c #FDFFFF", "] c #FEFFFF", "[ c #FFFFFF", "{ c None", /* pixels */ "{{{{{{{{{{{{{{{{", "{faaputreqq759{{", "dggggggggggggg3{", "sssssssaassssa1{", "p[[[[[[[[[[[[[,{", "u[UUGASmvzjjh[:{", "u[!IUGGSBmbxl[-{", "t[[I!!GSGBAbb[={", "r[!![!!PGGSCC[&{", "e[[[!!!!PIHPC[${", "8[!![!!!!!!PG[+{", "5[[[[[[!![!!![o{", "4[[[[[[[[[[[[[ {", "o21,,;*&$#+Oooo{", "{{{{{{{{{{{{{{{{", "{{{{{{{{{{{{{{{{" }; /* XPM */ static char *package[] = { /* columns rows colors chars-per-pixel */ "16 16 176 2", " c #C38322", ". c #C38423", "X c #C48524", "o c #C48625", "O c #C58726", "+ c #C58928", "@ c #C68A28", "# c #C78D2B", "$ c #C88E2C", "% c #C88F2D", "& c #C9902E", "* c #C9922F", "= c #CB9532", "- c #CC9834", "; c #C8943B", ": c #CE9D39", "> c #DE9F32", ", c #D1A43F", "< c #E2AA37", "1 c #E2A938", "2 c #E3AB3A", "3 c #E6B53A", "4 c #E6B43D", "5 c #E6B53F", "6 c #ECB638", "7 c #E9B53D", "8 c #F0BD3B", "9 c #C88E40", "0 c #CA904A", "q c #D09753", "w c #D2A540", "e c #D3A842", "r c #D4AA44", "t c #D5AC45", "y c #D5AD47", "u c #D6B049", "i c #D7B04A", "p c #D7B24B", "a c #D8B24B", "s c #D8B44C", "d c #D8B44D", "f c #D9B54D", "g c #D9B54E", "h c #D9B74F", "j c #D5A651", "k c #DAAD50", "l c #D7A45F", "z c #DBB156", "x c #E1A740", "c c #E6B542", "v c #E4B145", "b c #E6B147", "n c #E7BA41", "m c #E9BD40", "M c #E8BE43", "N c #E9BD45", "B c #E4B14C", "V c #E9B44C", "C c #E8BF48", "Z c #E8BB4F", "A c #F5BD40", "S c #E5AF56", "D c #DBB262", "F c #DDB969", "G c #D6B870", "H c #DCBD77", "J c #E6B66B", "K c #E2B76F", "L c #E5BF6F", "P c #E4B374", "I c #EAC443", "U c #EAC146", "Y c #ECC547", "T c #EBC648", "R c #EFC748", "E c #F9C248", "W c #F9C448", "Q c #F1C156", "! c #F5C969", "~ c #E1C072", "^ c #E0C07D", "/ c #E0C67E", "( c #F5CF7F", ") c #FFD577", "_ c #F5D078", "` c #F5D07F", "' c #FED678", "] c #FED97C", "[ c #DBC389", "{ c #DEC995", "} c #E5C482", "| c #EBC182", " . c #ECC583", ".. c #EEC483", "X. c #EDC687", "o. c #ECCA84", "O. c #EBCC84", "+. c #E7CC88", "@. c #EECA88", "#. c #EFCA8A", "$. c #EBCD8F", "%. c #F1CF86", "&. c #F0CE8A", "*. c #FBDC84", "=. c #F1D28B", "-. c #F7D589", ";. c #F7D78B", ":. c #F0D08C", ">. c #FBDA8D", ",. c #FFDC8C", "<. c #E5CF92", "1. c #EDD292", "2. c #EAD59C", "3. c #F1D590", "4. c #F5D790", "5. c #F2D695", "6. c #FBDB92", "7. c #FEDF95", "8. c #F8DB9D", "9. c #FEE094", "0. c #FEE194", "q. c #FEE196", "w. c #FFE19B", "e. c #FFE39F", "r. c #EDD9A5", "t. c #F2DDAF", "y. c #EDDEBE", "u. c #FFE4A4", "i. c #FFE4A5", "p. c #FFE5A5", "a. c #F9E1AA", "s. c #FAE3AA", "d. c #FFE7AD", "f. c #FFE8A8", "g. c #FFE8AB", "h. c #F7E4B2", "j. c #FAE4B0", "k. c #FFEAB3", "l. c #FFE9B6", "z. c #FFEBB7", "x. c #F6E5BF", "c. c #FFEAB9", "v. c #FFEBBA", "b. c #FFEBBD", "n. c #FFEDBE", "m. c #FFEEC1", "M. c #FFEFC1", "N. c #FFEFC4", "B. c #FCEEC7", "V. c #FBEDCB", "C. c #FFEFC8", "Z. c #F9EBCD", "A. c #FAECCE", "S. c #FFF0C9", "D. c #FFF2CC", "F. c #FFF2CE", "G. c #FFF4CC", "H. c #F5EBD2", "J. c #F7EED1", "K. c #FFF3D4", "L. c #FFF3D5", "P. c #FFF4D7", "I. c #FFF5D9", "U. c #FFF4DA", "Y. c #FFF6DB", "T. c #FFF6DD", "R. c #FCF6E2", "E. c #FDF6E2", "W. c #FEF6E3", "Q. c #FEF8E1", "!. c #FDF8E2", "~. c #FCF8E6", "^. c #FEFBE7", "/. c #FFFEF0", "(. c #FFFFF6", "). c None", /* pixels */ ").).).).).).).a p ).).).).).).).", ").).).).).g p 2.+.r r ).).).).).", ").).).).g <.~.R.t.j.~ w ).).).).", ").).g / J.(./.V.k ;.a.5.D : ).).", "g g r.H.y.{ [ G F 4.( 8.a.o.j = ", "g Q.A.1.O.L z ; A.I.c.7.' p.*.* ", "p R.K.s.&.` _ B j.l.w.' A 7 3.% ", "p R.I.K.b.-.! V >.,.W 6 C Z :.# ", "y R.P.D.N.c.6.Q E 8 R N c b #.+ ", "r R.K.D.m.k.d.] R I M 4 1 x .O ", "e ~.T.M.l.g.u.q.T m 4 1 > J .o ", ", H x.T.m.p.e.q.U 3 < S .P 0 ", ").).: ^ B.D.p.q.n v #.| q . ).).", ").).).- = } G.N.:.&.l o o ).).).", ").).).).).* % $.K 9 o ).).).).).", ").).).).).).).+ O ).).).).).).)." }; /* XPM */ static char *plugin[] = { /* columns rows colors chars-per-pixel */ "16 16 123 2", " c #3A8A36", ". c #3D8C39", "X c #3D8D39", "o c #3F8E3A", "O c #408F3B", "+ c #41903C", "@ c #42913D", "# c #42923E", "$ c #43923E", "% c #459440", "& c #469641", "* c #479642", "= c #4A9945", "- c #4D9C48", "; c #4E9D48", ": c #4F9E49", "> c #51A04B", ", c #52A14C", "< c #55A44F", "1 c #59B54F", "2 c #59A752", "3 c #5AA953", "4 c #5DAB56", "5 c #5EAD57", "6 c #5BB651", "7 c #5DB752", "8 c #5FB853", "9 c #61AF5A", "0 c #62AC5C", "q c #63AD5D", "w c #60B955", "e c #61B956", "r c #61BA56", "t c #63B15B", "y c #65B45E", "u c #67B55F", "i c #63BA58", "p c #64BB58", "a c #64BB59", "s c #66BB5A", "d c #66BB5D", "f c #68BC5B", "g c #69BC5D", "h c #69BD5D", "j c #6ABD5E", "k c #6CBE5F", "l c #6CB565", "z c #6DB566", "x c #6AB862", "c c #6BB963", "v c #6BBD62", "b c #6DBF60", "n c #6EBC65", "m c #6FBF65", "M c #6FBD66", "N c #6FC062", "B c #71C164", "V c #72C165", "C c #73C265", "Z c #71C066", "A c #73C267", "S c #72C069", "D c #72C169", "F c #77C369", "G c #76C46D", "H c #77C46D", "J c #78C66F", "K c #7AC072", "L c #7AC770", "P c #7CC376", "I c #7BC971", "U c #7CC972", "Y c #7DCA73", "T c #7DCB73", "R c #7ECB74", "E c #80CD75", "W c #80CE76", "Q c #81CE76", "! c #81C67A", "~ c #81C67B", "^ c #83C77C", "/ c #87CB79", "( c #82CD78", ") c #82CF78", "_ c #85C97C", "` c #84C87E", "' c #85C87E", "] c #83D079", "[ c #87CA80", "{ c #88CA80", "} c #88CA81", "| c #89CA82", " . c #89CA83", ".. c #8ACB83", "X. c #8BCC83", "o. c #8CCC84", "O. c #8DCD85", "+. c #8ECD86", "@. c #90CF88", "#. c #91CF88", "$. c #92CF8A", "%. c #93CF8B", "&. c #94CF8A", "*. c #94CF8B", "=. c #95CF8B", "-. c #95D08C", ";. c #96D18D", ":. c #97D28D", ">. c #98D18F", ",. c #99D290", "<. c #9CD493", "1. c #9DD593", "2. c #9ED595", "3. c #A1D796", "4. c #A1D797", "5. c #A2D897", "6. c #A2D798", "7. c #A2D898", "8. c #A3D899", "9. c #A4D899", "0. c #A6D99B", "q. c #A7D99C", "w. c None", /* pixels */ "w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.", "w.w.w.w.w.( W T L w.w.w.w.w.w.w.", "w.w.w.w.w.( q.5.H w.w.w.w.w.w.w.", "w.w.w.w.w.T 5.>.S w.w.w.w.w.w.w.", "w.] W W T H 4.1.n x u t w.w.w.w.", "w.W 9.9.4.4.1.<.>.-.*.5 w.w.w.w.", "w.T 8.4./ F C B V V *.3 w.w.w.w.", "w.L H _ <.V m k j s @.z , ; = w.", "w.w.w.M ,.k j s a r n X. .[ & w.", "w.w.w.x ;.j s s 8 7 v [ _ [ # w.", "w.n x K @.s r 7 6 6 _ 0 % # o w.", "w.x *.-.S O.O.X. .d [ % w.w.w.w.", "w.y @.r O.z > ; q ~ ~ o w.w.w.w.", "w.t O.o. ., w.w.& ~ P o w.w.w.w.", "w.4 2 < , - w.w.$ O o w.w.w.w.", "w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w." }; /* XPM */ static char *cd_img[] = { /* columns rows colors chars-per-pixel */ "16 16 131 2", " c #5887B8", ". c #A5BFD9", "X c #94BCE7", "o c #96BEE7", "O c #96BCE8", "+ c #97BEE9", "@ c #97BDEC", "# c #99BFE9", "$ c #99BFEB", "% c #AAC3DC", "& c #AAC3DD", "* c #ACC4DD", "= c #97C0E9", "- c #99C0E9", "; c #9AC1E9", ": c #9BC1E9", "> c #9BC1EB", ", c #A1C4EA", "< c #A3C7EC", "1 c #A0C6EE", "2 c #A4C9ED", "3 c #A4C9EF", "4 c #B9CDE1", "5 c #BACEE2", "6 c #BBCEE2", "7 c #A3C1F0", "8 c #A4CAF2", "9 c #A5CBF3", "0 c #AECAF2", "q c #A9CCF0", "w c #ABCCF0", "e c #ABCDF1", "r c #A8CDF2", "t c #A8CCF3", "y c #A9CDF3", "u c #ABCFF5", "i c #A8CDF6", "p c #A9CEF6", "a c #B2CEF1", "s c #B6CDF7", "d c #ADD2F2", "f c #AED1F4", "g c #ACD0F6", "h c #ACD1F7", "j c #B2D2F2", "k c #B6D2F1", "l c #B2D2F4", "z c #B3D4F6", "x c #B8D6F5", "c c #BBD8F6", "v c #B2D3F9", "b c #B3D5F9", "n c #B2D6FB", "m c #BBDBFC", "M c #BADBFE", "N c #BBDCFC", "B c #C7DAF3", "V c #C6DEF7", "C c #C9DDF3", "Z c #CADEF3", "A c #CCDDF0", "S c #CFDFF1", "D c #C3DDF8", "F c #C4DDF8", "G c #C7DFFB", "H c #D0E0EF", "J c #CEE0F1", "K c #C2E1FF", "L c #C3E1FF", "P c #CAE1FA", "I c #CDE7FF", "U c #CFE7FF", "Y c #C8EDF9", "T c #D1E1F0", "R c #D1E1F1", "E c #D4E2F1", "W c #D3E3F6", "Q c #D2E4F6", "! c #D3E4F6", "~ c #D5E4F5", "^ c #D4E6F8", "/ c #D6E7F9", "( c #D1E5FC", ") c #D3E4FF", "_ c #D7E9FA", "` c #D1E9FF", "' c #D1EBFF", "] c #D9E8F8", "[ c #D9EAF8", "{ c #D9EAFA", "} c #DFECF9", "| c #DBE8FF", " . c #DAECFE", ".. c #DAECFF", "X. c #D8EFFF", "o. c #DAEEFF", "O. c #D1F0FD", "+. c #DDF0FF", "@. c #DDF2FF", "#. c #DCF4FF", "$. c #E4EDF4", "%. c #E1EDFA", "&. c #E4F1F8", "*. c #E5F3FB", "=. c #E4F1FF", "-. c #E4F2FE", ";. c #E2F6FF", ":. c #E5F4FF", ">. c #E8F7FF", ",. c #E9F7FF", "<. c #E9F9FF", "1. c #EBF8FF", "2. c #EDF8FF", "3. c #EFFCFF", "4. c #F0FAFF", "5. c #F0FDFF", "6. c #F1FDFF", "7. c #F2FCFF", "8. c #F3FCFF", "9. c #F3FDFF", "0. c #F1FEFF", "q. c #F3FFFF", "w. c #F7FFFF", "e. c #F9FEFE", "r. c #F9FFFF", "t. c #FAFEFE", "y. c #FCFDFE", "u. c #FDFFFF", "i. c #FEFFFF", "p. c #FFFFFF", "a. c None", /* pixels */ "a.a.a.a.a. a.a.a.a.a.", "a.a.a. 5 E } *.$.5 a.a.a.", "a.a. . p.%.0 f Y w.p.t.. a.a.", "a. . 4.p.8.7 1 O.p.3.8.p.% a.", "a. %.2 .p.s @ #.w.>.8.w.t. a.", " 5 k > # ) .B &.3.>.8.3.4.5 ", " T , - + a & & 8.:.o.( T ", " ~ # - - Z a.a. ] j w w ! ", " ~ # + X Z a.a. W w 8 2 ! ", " H X X w o.* & D l z x S ", " 5 V ' ;.+.+.] ^ G u 8 t D 5 ", "a. t.1.O.I K N b g u 8 u ] a.", "a. . 3.' K M b g u 8 r P . a.", "a.a. . -.U m v g g c _ . a.a.", "a.a.a. 5 J ^ ^ S 5 a.a.a.", "a.a.a.a.a. a.a.a.a.a." }; /* XPM */ static char *arrow_redo[] = { /* columns rows colors chars-per-pixel */ "16 16 110 2", " c #215F1E", ". c #236220", "X c #246220", "o c #266522", "O c #276623", "+ c #296925", "@ c #2A6B26", "# c #2C6C27", "$ c #2D6E29", "% c #2F702A", "& c #31732C", "* c #32752D", "= c #34772F", "- c #367930", "; c #387B32", ": c #397E33", "> c #3B8035", ", c #3E8337", "< c #3E8438", "1 c #3F8538", "2 c #41883B", "3 c #438A3C", "4 c #458D3E", "5 c #478F40", "6 c #4A9242", "7 c #4B9443", "8 c #4C9444", "9 c #4E9746", "0 c #509947", "q c #519C49", "w c #549F4B", "e c #55A04C", "r c #57A34E", "t c #58A34F", "y c #58A44F", "u c #5AA651", "i c #5BA751", "p c #5EAC54", "a c #60A259", "s c #60A35A", "d c #61A35A", "f c #62A35B", "g c #64A65D", "h c #67A85F", "j c #62B057", "k c #62B158", "l c #65B45A", "z c #66B55B", "x c #68B85D", "c c #6ABA5F", "v c #6ABB5F", "b c #6FAF66", "n c #70B268", "m c #71B369", "M c #70B16A", "N c #76B56E", "B c #73B96D", "V c #76B86D", "C c #74BB70", "Z c #75BB70", "A c #77BC71", "S c #7AB972", "D c #78BD72", "F c #79BD74", "G c #7ABD74", "H c #7CBC75", "J c #7FBC76", "K c #7CBE76", "L c #7EBF77", "P c #7DBF78", "I c #7FC178", "U c #80C179", "Y c #84C57A", "T c #85C57B", "R c #82C27C", "E c #85C17E", "W c #87C27F", "Q c #86C47F", "! c #8BC785", "~ c #8CC685", "^ c #90CA87", "/ c #90CA89", "( c #91CA8A", ") c #93CB8B", "_ c #92CC88", "` c #93CC8A", "' c #94CC8D", "] c #95CC8D", "[ c #96CE8D", "{ c #98CE90", "} c #99CE90", "| c #99CF91", " . c #9ACE91", ".. c #9ACF92", "X. c #9BCF93", "o. c #9DD193", "O. c #9DD094", "+. c #9CD194", "@. c #9ED195", "#. c #9ED196", "$. c #9FD297", "%. c #A0D396", "&. c #A1D398", "*. c #A1D399", "=. c #A2D499", "-. c #A3D49B", ";. c #A5D59C", ":. c #A7D69E", ">. c #A9D7A0", ",. c None", /* pixels */ ",.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.", ",.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.", ",.,.,.,.,.,.,.,.,.,.,.i w ,.,.,.", ",.,.,.,.,.x z j p i e m b 8 ,.,.", ",.,.,.c Y [ *.:.&.&.X.} [ b 1 ,.", ",.,.c ` >.%.-.*.#.X.} [ / f 1 ,.", ",.,.Y :.:.} V e q 8 6 g s 1 ,.,.", ",.z ` o.} y e ,.,.,.,.2 , ,.,.,.", ",.k #.#.J w ,.,.,.,.,.,.,.,.,.,.", ",.p [ } S q ,.,.,.,.,.,.,.,.,.,.", ",.i W ^ ~ 8 5 ,.,.,.,.,.,.,.,.,.", ",.,.M ) / W u 2 , - - & $ @ ,.,.", ",.,.8 N ! I Q R U P G A Z O ,.,.", ",.,.,.5 s M K K K G A C B X ,.,.", ",.,.,.,.,.: - * % $ + O . ,.,.", ",.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,." }; /* XPM */ static char *arrow_rotate_clockwise[] = { /* columns rows colors chars-per-pixel */ "16 16 97 2", " c #31732C", ". c #33762E", "X c #367930", "o c #377B31", "O c #3A7E34", "+ c #3B7F35", "@ c #3E8337", "# c #3E8438", "$ c #43893C", "% c #458C3E", "& c #468D3F", "* c #489040", "= c #499141", "- c #499142", "; c #4E9746", ": c #4E9846", "> c #509947", ", c #52954D", "< c #54964E", "1 c #509A48", "2 c #529C4A", "3 c #539D4A", "4 c #539E4B", "5 c #549F4B", "6 c #5B9D55", "7 c #5A9E55", "8 c #55A04C", "9 c #56A14D", "0 c #58A34F", "q c #59A650", "w c #5EA157", "e c #5CA953", "r c #5DAA53", "t c #60AE56", "y c #61A35A", "u c #66A95F", "i c #63B158", "p c #63B259", "a c #66B55B", "s c #66B65C", "d c #69B95E", "f c #6ABA5F", "g c #68AA60", "h c #69AB61", "j c #6AAB63", "k c #6AAD63", "l c #6CAE63", "z c #6FAF67", "x c #6CBC60", "c c #6DBF62", "v c #6EBF62", "b c #74B56D", "n c #77B771", "m c #79B871", "M c #78BA70", "N c #7EBC75", "B c #7CBF75", "V c #7EC177", "C c #81C077", "Z c #82C27B", "A c #85C77B", "S c #82C27C", "D c #84C17C", "F c #84C07D", "G c #85C37E", "H c #85C47E", "J c #87C47F", "K c #87C87C", "L c #87C581", "P c #88C582", "I c #89C682", "U c #8BC683", "Y c #8AC783", "T c #8BC785", "R c #8CCA82", "E c #8CC885", "W c #8FC987", "Q c #8FC988", "! c #90C989", "~ c #97CC8E", "^ c #98CE90", "/ c #99CE90", "( c #9BCF93", ") c #9BD092", "_ c #9DD194", "` c #9ED196", "' c #A0D197", "] c #A1D396", "[ c #A2D499", "{ c #A4D49B", "} c #A6D59C", "| c #A6D59D", " . c #A7D69E", ".. c #A9D7A0", "X. c #AAD8A0", "o. c #ABD8A1", "O. c None", /* pixels */ "O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.", "O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.", "O.O.O.O.O.O.x d a i O.O.O.O.O.O.", "O.O.O.O.v K ] X. ./ M 0 O.O.O.O.", "O.O.O.c R o.[ } { ) ` m > O.O.O.", "O.O.O.A .. .' C N ~ ( ^ h O.O.O.", "O.O.f _ | ( r q 9 2 ! E F $ O.O.", "O.O.s p t e O.O.O.; z Q E # O.O.", "O.O.O.O.O.O.8 O.O.- j Y P O O.O.", "O.O.O.O.O.5 1 O.= % D V n X O.O.", "O.O.O.O.4 l g * y L H S < O.O.O.", "O.O.O.3 k W T I J B Z 6 O.O.O.", "O.O.O.: u U L G S b , O.O.O.O.", "O.O.O.O.& w 7 + o . O.O.O.O.O.O.", "O.O.O.O.O.@ O O.O.O.O.O.O.O.O.O.", "O.O.O.O.O.O.X O.O.O.O.O.O.O.O.O." }; /* XPM */ static char *arrow_switch[] = { /* columns rows colors chars-per-pixel */ "16 16 124 2", " c #174414", ". c #174515", "X c #184515", "o c #184616", "O c #1A4917", "+ c #1C4B19", "@ c #23561F", "# c #255821", "$ c #295E24", "% c #2C6227", "& c #2D6328", "* c #2F672A", "= c #30682A", "- c #33762E", "; c #34772E", ": c #35782F", "> c #3A6D36", ", c #367230", "< c #377B31", "1 c #3C7936", "2 c #3D7A36", "3 c #3A7E34", "4 c #4B7D47", "5 c #4B7E48", "6 c #3B8035", "7 c #408539", "8 c #41863A", "9 c #43863B", "0 c #438A3C", "q c #448B3D", "w c #4C8E43", "e c #4F824B", "r c #538B4E", "t c #548E4D", "y c #499141", "u c #4D9645", "i c #529949", "p c #509A48", "a c #539B4A", "s c #519C49", "d c #529D4A", "f c #549F4B", "g c #568A52", "h c #5A8E54", "j c #589951", "k c #599A53", "l c #599D50", "z c #5B9E53", "x c #5B9D55", "c c #5D9C55", "v c #5E9F57", "b c #62985D", "n c #55A04C", "m c #57A24E", "M c #57A34E", "N c #58A44F", "B c #59A550", "V c #5FA755", "C c #5DA952", "Z c #5CA953", "A c #5DAA54", "S c #5FAB54", "D c #60AD55", "F c #62AF56", "G c #60A658", "H c #67A85F", "J c #63B057", "K c #64B258", "L c #65B459", "P c #66B55A", "I c #679C63", "U c #69AA63", "Y c #6AAD61", "T c #6BAD63", "R c #6EAF65", "E c #73B16C", "W c #77B471", "Q c #7BB373", "! c #7BB873", "~ c #81B679", "^ c #83B67C", "/ c #84B77D", "( c #84BC7B", ") c #8BBE85", "_ c #87C480", "` c #8AC683", "' c #8BC784", "] c #8DC886", "[ c #8FC987", "{ c #91C989", "} c #90CA89", "| c #92CB8B", " . c #92CA8E", ".. c #94CB8C", "X. c #95CC8E", "o. c #96CD8E", "O. c #94CB90", "+. c #96CC91", "@. c #97CC92", "#. c #99CB91", "$. c #99CF90", "%. c #98CC93", "&. c #99CE94", "*. c #9BCE96", "=. c #9DCF98", "-. c #9ECF98", ";. c #A3CF9A", ":. c #A2D29C", ">. c #A7D3A0", ",. c #A6D4A0", "<. c #A8D4A2", "1. c #AFD7A7", "2. c #B1DAAA", "3. c #B4DCAD", "4. c #BADFB3", "5. c #BCE0B4", "6. c #BEE1B6", "7. c #BEE1B7", "8. c #BFE2B7", "9. c #C0E2B8", "0. c #C0E3B9", "q. c #C1E3B9", "w. c #C2E3BA", "e. c None", /* pixels */ "e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.", "e.e.e.e.e.e.e.e.e.e.e.m e.e.e.e.", "e.e.e.e.e.e.e.e.e.e.e.s u e.e.e.", "P P P K F S e.A B n G ! H 0 e.e.", "P w.q.9.7.#.R Y { $.X.| [ v 3 e.", "L 0.8.6.5.4.;.l o...} ] ` k : e.", "J D C V ( 1.3.c E z 8 x j ; e.e.", "e.e.e.e.i Q 2.~ 9 e.e., - e.e.e.", "e.e.e.e.p w >.<.2 e.e.= % e.e.e.", "Z N f a T c ^ ,./ r * h g @ e.e.", "M X.| [ ' W t :.-.=.*.%.+.e + e.", "d } ] ` _ U 1 b ) &.@.O. .5 o e.", "u y q 7 6 < e.& $ # > I 4 X e.e.", "e.e.e.e.e.e.e.e.e.e.e.O . e.e.e.", "e.e.e.e.e.e.e.e.e.e.e. e.e.e.e.", "e.e.e.e.e.e.e.e.e.e.e.e.e.e.e.e." }; /* XPM */ static char *box[] = { /* columns rows colors chars-per-pixel */ "16 16 163 2", " c #774C15", ". c #7A4C12", "X c #7E4E12", "o c #784D15", "O c #794D16", "+ c #794E16", "@ c #7A4E16", "# c #7B4F16", "$ c #7C5017", "% c #7D5017", "& c #7E5117", "* c #7F5218", "= c #825114", "- c #875414", "; c #8B5615", ": c #8E5915", "> c #805318", ", c #815318", "< c #825419", "1 c #835419", "2 c #845519", "3 c #85551A", "4 c #86561A", "5 c #87571A", "6 c #88581B", "7 c #89591B", "8 c #8A591D", "9 c #8B5A1C", "0 c #8C5B1C", "q c #8D5B1C", "w c #8E5C1D", "e c #8F5C1D", "r c #8F5D1D", "t c #8F5D1E", "y c #925B16", "u c #965C17", "i c #995E17", "p c #905D1D", "a c #915E1E", "s c #915F1E", "d c #925F1E", "f c #9B6117", "g c #94601F", "h c #95601F", "j c #95611F", "k c #96611F", "l c #96621F", "z c #99621F", "x c #976220", "c c #9C6420", "v c #9F6520", "b c #8C6839", "n c #946B38", "m c #986D38", "M c #98703F", "N c #A16820", "B c #A46E29", "V c #A66F2B", "C c #A87A3F", "Z c #C86530", "A c #C86731", "S c #C96832", "D c #C96932", "F c #CA6B33", "G c #CA6D34", "H c #CB6E34", "J c #CB6E35", "K c #CC7036", "L c #CC7137", "P c #CD7237", "I c #CD7338", "U c #CE7438", "Y c #CE763A", "T c #CF773B", "R c #D07A3C", "E c #D07B3C", "W c #D17C3D", "Q c #D17D3E", "! c #D37F3F", "~ c #AA7C41", "^ c #A6845B", "/ c #AB885A", "( c #B08C5F", ") c #B38E5F", "_ c #B58F60", "` c #B08E67", "' c #B79060", "] c #B99160", "[ c #BB9260", "{ c #BC9360", "} c #BC9361", "| c #BC9461", " . c #BE9664", ".. c #D48040", "X. c #D48240", "o. c #D58341", "O. c #D58542", "+. c #D68743", "@. c #D78944", "#. c #D88A44", "$. c #D88C47", "%. c #D98D47", "&. c #DA8F48", "*. c #DA9149", "=. c #DB924A", "-. c #DC944B", ";. c #DC964C", ":. c #DD984D", ">. c #DE994D", ",. c #DE9B4F", "<. c #DC9451", "1. c #DF9D55", "2. c #E09C4F", "3. c #E19E50", "4. c #E2A051", "5. c #E2A252", "6. c #E3A354", "7. c #E3A554", "8. c #E4A655", "9. c #E5A957", "0. c #E3A459", "q. c #E6AA58", "w. c #E7AE59", "e. c #E6AC5E", "r. c #E9B25B", "t. c #DA9874", "y. c #DA9875", "u. c #DA9975", "i. c #DB9B76", "p. c #DC9E77", "a. c #DD9F78", "s. c #E19E62", "d. c #DDA079", "f. c #DEA27A", "g. c #DEA37B", "h. c #DFA67C", "j. c #D9B177", "k. c #E3A366", "l. c #E5A769", "z. c #E6AB6E", "x. c #E9B362", "c. c #EBB865", "v. c #E0A87E", "b. c #E2AB7F", "n. c #E0AD7E", "m. c #E8B071", "M. c #EAB475", "N. c #EBB87A", "B. c #EEBC7D", "V. c #E3AD80", "C. c #E4AF81", "Z. c #E3B280", "A. c #E5B783", "S. c #E6BD85", "D. c #EFBF80", "F. c #E8C188", "G. c #EAC68B", "H. c #EDC88D", "J. c #EECC8F", "K. c #F1C383", "L. c #F2C587", "P. c #F4CC8F", "I. c None", /* pixels */ "I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.", "I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.", "I.I.x l k j g d a p e q 0 I.I.I.", "I.x C { | } [ ] ' _ ) ( / m 5 I.", "x ~ .V N v c z h s t 8 M ^ n 2 ", "l j.B f i u y : ; - = X . b ` < ", "j J.P.L.K.D.B.N.M.m.z.l.k.s.V., ", "g H.c.r.w.9.7.4.,.;.*.$.+.X.v.* ", "d G.x.q.8.5.2.:.=.%.@.o.! E g.& ", "a F.e.6.3.>.-.&.#.O...W T I a.$ ", "r S.0.,.;.*.$.+.X.Q R U L H i.# ", "w A.1.=.%.@.o.! E Y P J F S y.@ ", "0 Z.<.#.O...W T I K G D A Z t.O ", "9 n.C.b.v.h.f.d.p.i.u.t.t.t.t.o ", "7 6 4 3 1 < > * & % # @ + O o ", "I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I." }; /* XPM */ static char *brick[] = { /* columns rows colors chars-per-pixel */ "16 16 72 1", " c gray58", ". c #959595", "X c gray59", "o c #979797", "O c #989898", "+ c gray60", "@ c #9A9A9A", "# c #9B9B9B", "$ c #9D9D9D", "% c gray62", "& c gray63", "* c #A2A2A2", "= c gray64", "- c #A5A5A5", "; c gray65", ": c #A9A9A9", "> c #AAAAAA", ", c gray67", "< c #ACACAC", "1 c #AEAEAE", "2 c #B1B1B1", "3 c gray70", "4 c gray71", "5 c #BBBBBB", "6 c gray74", "7 c gray", "8 c #C0C0C0", "9 c #C1C1C1", "0 c gray76", "q c #C3C3C3", "w c gray77", "e c #C5C5C5", "r c gray78", "t c gray79", "y c #CBCBCB", "u c gray80", "i c #CDCDCD", "p c #CECECE", "a c gray81", "s c gray82", "d c #D2D2D2", "f c LightGray", "g c #D5D5D5", "h c gray84", "j c #D7D7D7", "k c #D8D8D8", "l c #DADADA", "z c gray86", "x c #DDDDDD", "c c gray87", "v c #DFDFDF", "b c gray88", "n c #E1E1E1", "m c gray89", "M c #E4E4E4", "N c #E7E7E7", "B c gray91", "V c #E9E9E9", "C c #EAEAEA", "Z c gray92", "A c #ECECEC", "S c #EEEEEE", "D c gray94", "F c #F1F1F1", "G c gray95", "H c #F3F3F3", "J c gray96", "K c #FBFBFB", "L c gray99", "P c #FDFDFD", "I c gray100", "U c None", /* pixels */ "UUUUU03**30UUUUU", "UUUUU:IIII:UUUUU", "U03**2hPLf2**30U", "U:IIIbHFSnryssu2588p+", ":HDACMlkw570q8yO", ";JGNMvzh800067t.", "-7mFNxlh7995y8; ", "UU&9BZch55yr, UU", "UUU%$eZBui3. UUU", "UUUUU#@i6&.UUUUU", "UUUUUUUoXUUUUUUU", "UUUUUUUUUUUUUUUU" }; /* XPM */ static char *database[] = { /* columns rows colors chars-per-pixel */ "16 16 82 1", " c #898989", ". c gray54", "X c #8B8B8B", "o c #8D8D8D", "O c #909090", "+ c #959595", "@ c gray59", "# c #9B9B9B", "$ c gray62", "% c #9F9F9F", "& c #A0A0A0", "* c gray63", "= c gray64", "- c #A5A5A5", "; c #A7A7A7", ": c #A9A9A9", "> c gray67", ", c #ACACAC", "< c gray68", "1 c #AEAEAE", "2 c gray69", "3 c #B2B2B2", "4 c gray70", "5 c #B4B4B4", "6 c gray71", "7 c #B6B6B6", "8 c #B7B7B7", "9 c gray72", "0 c #B9B9B9", "q c gray73", "w c #BBBBBB", "e c #BCBCBC", "r c gray74", "t c gray75", "y c #C0C0C0", "u c gray76", "i c #C3C3C3", "p c gray77", "a c gray79", "s c #CDCDCD", "d c #CECECE", "f c gray81", "g c #D0D0D0", "h c gray82", "j c #D2D2D2", "k c gray83", "l c #D5D5D5", "z c gray84", "x c #D8D8D8", "c c gray85", "v c gray86", "b c gainsboro", "n c #DDDDDD", "m c gray87", "M c gray88", "N c #E1E1E1", "B c #E2E2E2", "V c gray89", "C c gray90", "Z c #E6E6E6", "A c #E7E7E7", "S c gray91", "D c #EAEAEA", "F c gray92", "G c gray93", "H c #EEEEEE", "J c #EFEFEF", "K c gray94", "L c gray95", "P c #F3F3F3", "I c #F4F4F4", "U c gray96", "Y c #F6F6F6", "T c gray97", "R c #F8F8F8", "E c gray98", "W c #FBFBFB", "Q c gray99", "! c #FDFDFD", "~ c #FEFEFE", "^ c gray100", "/ c None", /* pixels */ "////////////////", "/////q98754/////", "///wgSP!QGMu;+o ////", "////////////////" }; /* XPM */ static char *signal_gtkwave[] = { /* columns rows colors chars-per-pixel */ "16 16 19 1", " c #070905", ". c #18270A", "X c #243910", "o c #325014", "O c #3E6617", "+ c #45701A", "@ c #446822", "# c #52861F", "$ c #599321", "% c #609D24", "& c #69AC27", "* c #74905A", "= c #7DA05B", "- c #7C9861", "; c #82A65E", ": c #96BA73", "> c #9DC279", ", c #A2C77D", "< c #AAD184", /* pixels */ "<::,::<::<>><>><", "-.XX..@oo@X XX.-", "* .. o&$$&O .. *", "*.oX.$+..@#.XX.-", "=oooo&OooO&oooo;", "* ...#X X#... *", "* . oOX .Oo.. *", "*Xoo$OoXXoO+ooX-", "=.oo%oo.Xoo%oo.=", "* .o+ X X +o. *", "* .+O X X O+. *", "=oo%+o@Xooo+%oo=", "*.o%X.o..o..%o.=", "*o&$ X X $&o*", "-X@o Xo .o. o@X-", "<>,,,<<,><<<<<<<" }; /* XPM */ static char *icon_component[] = { /* columns rows colors chars-per-pixel */ "16 16 128 2", " c gray99", ". c #EB6D79", "X c #73CAE5", "o c #CF5960", "O c #FFB2B7", "+ c #8FDDF9", "@ c #70AC33", "# c #FE8992", "$ c #EA6C74", "% c #72C5E4", "& c #E7FBD4", "* c #A3DEF4", "= c gray100", "- c #F4767E", "; c #9DDBF2", ": c #7CCFEE", "> c #D8F8B9", ", c #9AC86D", "< c #DF696F", "1 c #FFEEEE", "2 c #D1414B", "3 c #49AACE", "4 c #6FBBDA", "5 c #F8D4D6", "6 c #F9D8DA", "7 c #F5FEEF", "8 c #DAEFF7", "9 c #59ADCC", "0 c #D5424C", "q c #CD3E47", "w c #78C5E3", "e c #EEF9FF", "r c #F08E93", "t c #E7FAD5", "y c #3E8FAF", "u c #C7EDFD", "i c #F3B7BB", "p c #EDF8FC", "a c #FFC5C8", "s c #F9D3D5", "d c #D8EEF7", "f c #D5EEF7", "g c #FDECEE", "h c #5EABC6", "j c #CB5861", "k c #D2535C", "l c #E4FBD3", "z c #EAFBD9", "x c #9DD070", "c c #A3D375", "v c #45A3C6", "b c #AFDE79", "n c #72C2DF", "m c #9ECA72", "M c #A2CF74", "N c #B5383E", "B c #D5EDF7", "V c #E57076", "C c #6CBBD7", "Z c #F9D7D9", "A c #76C2E0", "S c #48A7CA", "D c #BAE1F0", "F c #D6EDF6", "G c #D7EEC0", "H c #B3E3FF", "J c #C8EDA2", "K c #FFB5B3", "L c #93D2EC", "P c #DC666E", "I c #F9D3D6", "U c #93C064", "Y c #63AFCC", "T c #93C365", "R c #BB242F", "E c #2B90B4", "W c #B5E8FC", "Q c #5FACCA", "! c #FBFBFB", "~ c None", "^ c black", "/ c black", "( c black", ") c black", "_ c black", "` c black", "' c black", "] c black", "[ c black", "{ c black", "} c black", "| c black", " . c black", ".. c black", "X. c black", "o. c black", "O. c black", "+. c black", "@. c black", "#. c black", "$. c black", "%. c black", "&. c black", "*. c black", "=. c black", "-. c black", ";. c black", ":. c black", ">. c black", ",. c black", "<. c black", "1. c black", "2. c black", "3. c black", "4. c black", "5. c black", "6. c black", "7. c black", "8. c black", "9. c black", "0. c black", "q. c black", "w. c black", "e. c black", "r. c black", "t. c black", "y. c black", "u. c black", /* pixels */ "~ ~ ~ ~ ~ ~ ~ ! ! ! ~ ~ ~ ~ ~ ~ ", "~ ~ ~ ~ ~ ! ! Q Q Q ! ! ~ ~ ~ ~ ", "~ ~ ~ ~ ! Q Y * w W Q Q ! ~ ~ ~ ", "~ ~ ! ! Q W ; * n ; W W y ! ~ ~ ", "~ T , Q = W W A W W : 3 ! ~ ~ ", "! T > J Q 8 e u 9 X X : S ~ ~ ", "! T = > Q d L p C % % + v ~ ~ ", "! T z 7 Q D H f 4 + + % E o ! ", "! T l M G h F B X X E E O O N ! ", "! T m x & c E E E E V O O - 0 ! ", "! ! U t & b o 6 1 a k . . - 2 ! ", "~ ~ ! @ @ @ o Z r g P $ $ # q ! ", "~ ~ ~ ! ! ! o i K I < # # $ R ! ", "~ ~ ~ ~ ~ ! ! j 5 s . . R R ! ! ", "~ ~ ~ ~ ~ ~ ~ ! R R R R ! ~ ~ ", "~ ~ ~ ~ ~ ~ ~ ~ ! ! ! ! ~ ~ ~ ~ " }; /* XPM */ static char *icon_extension[] = { /* columns rows colors chars-per-pixel */ "16 16 32 1", " c #A9EB56", ". c #C7EF95", "X c #89D538", "o c #7CBC2A", "O c #77C92C", "+ c #99DE45", "@ c #6AB224", "# c #BBED87", "$ c #55BB1B", "% c #319311", "& c #55A71D", "* c #3D9A14", "= c #83CD32", "- c #4BA21A", "; c #6ACA24", ": c #62AD22", "> c #8EDE39", ", c #76B929", "< c #4EB818", "1 c #389613", "2 c #5CAA20", "3 c #72B728", "4 c #76B927", "5 c #459E18", "6 c #60BF20", "7 c #6FB525", "8 c #6FC528", "9 c #68C224", "0 c #79D12D", "q c #6ACE20", "w c gray100", "e c None", /* pixels */ "eeeeewwweeeeeeee", "eeeewoooweeeeeee", "eeewo. +oweeeeee", "eeewo X+4weeeeee", "wwwww, ,wwwweeee", "wooo,. 77@:weeee", "wo...+=+>>2wwwee", "wooo>==OOX&w-5we", "woww3XOO80O5#>*w", "ewew7XO8966$$<1w", "w4ww@X006;*1<<%w", "w,7@X2&-0;1w%%we", "w,#X:www*q1wwwee", "w3+X2wew*q%weeee", "w7@:&-w*11%weeee", "wwwwwwewwwwweeee" }; /* XPM */ static char *door_in[] = { /* columns rows colors chars-per-pixel */ "16 16 178 2", " c #34752E", ". c #397136", "X c #377931", "o c #3B7E34", "O c #3D7339", "+ c #3F743B", "@ c #40733C", "# c #41763D", "$ c gray27", "% c gray28", "& c gray29", "* c #4C4C4C", "= c gray31", "- c #515151", "; c gray33", ": c #585858", "> c gray36", ", c #467C41", "< c #577F54", "1 c #606060", "2 c #717171", "3 c #727272", "4 c gray46", "5 c #777777", "6 c gray48", "7 c #7C7C7C", "8 c gray49", "9 c #7E7E7E", "0 c #8F570C", "q c #90580D", "w c #91590F", "e c #925A10", "r c #925C13", "t c #945C13", "y c #986019", "u c #9C641F", "i c #9D6725", "p c #A16925", "a c #A66E2C", "s c #A56F2F", "d c #A87432", "f c #AB7334", "g c #AA7436", "h c #AF7C3D", "j c #AD7E3E", "k c #B1793B", "l c #B0793D", "z c #AE7F40", "x c #B67E43", "c c #B47E45", "v c #3E8237", "b c #42873B", "n c #45893D", "m c #458A3D", "M c #468B3E", "N c #488D3F", "B c #4B8345", "V c #4C8F46", "C c #4D8F47", "Z c #4F8A49", "A c #4A9041", "S c #4B9142", "D c #4D9444", "F c #4F9049", "G c #509149", "H c #599152", "J c #589851", "K c #61A05A", "L c #65A45D", "P c #7CC073", "I c #7CC074", "U c #7FC177", "Y c #AE8041", "T c #AF8143", "R c #B18345", "E c #B18547", "W c #B58447", "Q c #B88B42", "! c #BC844B", "~ c #BA844C", "^ c #B3884B", "/ c #B4894F", "( c #BA8A4E", ") c #B58B51", "_ c #B68D53", "` c #B78F56", "' c #BF8954", "] c #B89058", "[ c #B9915A", "{ c #C18952", "} c #C68E59", "| c #C48E5A", " . c #C79554", ".. c #C89658", "X. c #C99A5A", "o. c #C99A5B", "O. c #CA9B5E", "+. c #DFB45F", "@. c #C99260", "#. c #CB9360", "$. c #CC9666", "%. c #CF9766", "&. c #CC9E61", "*. c #CC9F62", "=. c #CC9F63", "-. c #D29A6A", ";. c #D09A6C", ":. c #D39D6F", ">. c #D49C6D", ",. c #D69E6F", "<. c #D49E71", "1. c #D69E70", "2. c #CFA367", "3. c #CDA069", "4. c #D1A666", "5. c #D1A86E", "6. c #D1A773", "7. c #D4AD75", "8. c #D6AF74", "9. c #D2AB78", "0. c #D3AB78", "q. c #D4AF7D", "w. c #D7B37C", "e. c #D7B37E", "r. c #D7B47D", "t. c #E1B863", "y. c #81C378", "u. c #81C279", "i. c #83C37B", "p. c #87C67D", "a. c #FFD44B", "s. c #EDC45E", "d. c #808080", "f. c gray60", "g. c #999A99", "h. c #9A9A9A", "j. c #9B9B9B", "k. c gray61", "l. c #9D9D9D", "z. c gray62", "x. c #9F9F9F", "c. c #A0A0A0", "v. c #A1A1A0", "b. c gray63", "n. c #A2A2A2", "m. c gray64", "M. c #A4A4A4", "N. c #A5A5A5", "B. c #D7B382", "V. c #DAB185", "C. c #DCB287", "Z. c #DAB883", "A. c #DAB983", "S. c #DAB984", "D. c #D9B788", "F. c #DCBD89", "G. c #DCBD8B", "H. c #DBBB8D", "J. c #DDBF94", "K. c #88C680", "L. c #8DC884", "P. c #92CB89", "I. c #96CD8D", "U. c #99CE8F", "Y. c #9AD091", "T. c #9FD294", "R. c #DFC18F", "E. c #DEC291", "W. c #E0C398", "Q. c #E1C798", "!. c #E2C79E", "~. c #E3CBA2", "^. c #E5CEA7", "/. c #E6D0A9", "(. c #E7D1AA", "). c #E7D1AB", "_. c #E8D3AB", "`. c None", /* pixels */ "`.`.`.`.`.`.`.`.`.`.`.`.`.>.-.%.", "`.`.`.`.`.`.`.`.`.`.`.1.>.V.[ #.", "`.`.d.9 7 6 5 4 3 <.,.C._./.] } ", "`.`.8 f.f.h.h.j.j.:.(.).Q.E.` { ", "`.`.6 f.H g.j.k.k.;.^.R.F.G._ ! ", "`.`.5 h.m Z k.l.l.$.~.F.A.S.) x ", "D S N n L K B z.z.@.!.Z.r.e./ k ", "A T.Y.I.P.L.J , x.| W.w.8.s.^ f ", "M U.p.y.P I u.F < ' J.7.t.a.Q a ", "b P.L.K.i.U C + b.~ H.5.4.+.E p ", "v o X G V O b.n.c D.2.&.=.R u ", "`.`.1 c.# . n.n.m.l B.*.X.O.T y ", "`.`.> b.@ v.m.m.M.g q.o. ...Y t ", "`.`.: n.n.m.M.M.N.s 9.0.6.3.z w ", "f.2 ; - = * & % $ i d h W ( j 0 ", "`.`.`.`.`.`.`.`.`.`.`.`.e q r 0 " }; /* XPM */ static char *door_open[] = { /* columns rows colors chars-per-pixel */ "16 16 138 2", " c gray27", ". c gray28", "X c gray29", "o c #4C4C4C", "O c gray31", "+ c #515151", "@ c gray33", "# c #585858", "$ c gray36", "% c #606060", "& c #646464", "* c #686868", "= c #6C6C6C", "- c gray44", "; c #717171", ": c #727272", "> c gray45", ", c gray46", "< c #777777", "1 c gray48", "2 c #7C7C7C", "3 c gray49", "4 c #7E7E7E", "5 c #8F570C", "6 c #90580D", "7 c #91590F", "8 c #925A10", "9 c #925C13", "0 c #945C13", "q c #986019", "w c #9C641F", "e c #9D6725", "r c #A16925", "t c #A66E2C", "y c #A56F2F", "u c #A87432", "i c #AB7334", "p c #AA7436", "a c #AF7C3D", "s c #AD7E3E", "d c #B1793B", "f c #B0793D", "g c #AE7F40", "h c #B67E43", "j c #B47E45", "k c #AE8041", "l c #AF8143", "z c #B18345", "x c #B18547", "c c #B58447", "v c #B88B42", "b c #BC844B", "n c #BA844C", "m c #B3884B", "M c #B4894F", "N c #BA8A4E", "B c #B58B51", "V c #B68D53", "C c #B78F56", "Z c #BF8954", "A c #B89058", "S c #B9915A", "D c #C18952", "F c #C68E59", "G c #C48E5A", "H c #C79554", "J c #C89658", "K c #C99A5A", "L c #C99A5B", "P c #CA9B5E", "I c #DFB45F", "U c #C99260", "Y c #CB9360", "T c #CC9666", "R c #CF9766", "E c #CC9E61", "W c #CC9F62", "Q c #CC9F63", "! c #D29A6A", "~ c #D09A6C", "^ c #D39D6F", "/ c #D49C6D", "( c #D69E6F", ") c #D49E71", "_ c #D69E70", "` c #CFA367", "' c #CDA069", "] c #D1A666", "[ c #D1A86E", "{ c #D1A773", "} c #D4AD75", "| c #D6AF74", " . c #D2AB78", ".. c #D3AB78", "X. c #D4AF7D", "o. c #D7B37C", "O. c #D7B37E", "+. c #D7B47D", "@. c #E1B863", "#. c #FFD44B", "$. c #EDC45E", "%. c #808080", "&. c gray60", "*. c #9A9A9A", "=. c #9B9B9B", "-. c gray61", ";. c #9D9D9D", ":. c gray62", ">. c #9F9F9F", ",. c #A0A0A0", "<. c gray63", "1. c #A2A2A2", "2. c gray64", "3. c #A4A4A4", "4. c #A5A5A5", "5. c #D7B382", "6. c #DAB185", "7. c #DCB287", "8. c #DAB883", "9. c #DAB983", "0. c #DAB984", "q. c #D9B788", "w. c #DCBD89", "e. c #DCBD8B", "r. c #DBBB8D", "t. c #DDBF94", "y. c #DFC18F", "u. c #DEC291", "i. c #E0C398", "p. c #E1C798", "a. c #E2C79E", "s. c #E3CBA2", "d. c #E5CEA7", "f. c #E6D0A9", "g. c #E7D1AA", "h. c #E7D1AB", "j. c #E8D3AB", "k. c None", /* pixels */ "k.k.k.k.k.k.k.k.k.k.k.k.k./ ! R ", "k.k.k.k.k.k.k.k.k.k.k._ / 6.S Y ", "k.k.%.4 2 1 < , : ) ( 7.j.f.A F ", "k.k.3 &.&.*.*.=.=.^ g.h.p.u.C D ", "k.k.1 &.*.*.=.-.-.~ d.y.w.e.V b ", "k.k.< *.=.=.-.;.;.T s.w.9.0.B h ", "k.k.> =.-.-.;.:.:.U a.8.+.O.M d ", "k.k.- -.;.;.:.>.>.G i.o.| $.m i ", "k.k.= ;.:.:.>.>.,.Z t.} @.#.v t ", "k.k.* :.>.>.,.,.<.n r.[ ] I x r ", "k.k.& >.>.,.<.<.1.j q.` E Q z w ", "k.k.% ,.,.<.1.1.2.f 5.W K P l q ", "k.k.$ <.<.1.2.2.3.p X.L H J k 0 ", "k.k.# 1.1.2.3.3.4.y ...{ ' g 7 ", "&.; @ + O o X . e u a c N s 5 ", "k.k.k.k.k.k.k.k.k.k.k.k.8 6 9 5 " }; /* XPM */ static char *door_out[] = { /* columns rows colors chars-per-pixel */ "16 16 175 2", " c #256321", ". c #276623", "X c #286724", "o c #2A6A26", "O c #2C6C27", "+ c #2D6E28", "@ c #30702A", "# c #34752E", "$ c #377931", "% c #3B7E34", "& c #3E7639", "* c #3F773A", "= c #40733C", "- c #41763D", "; c gray27", ": c gray28", "> c gray29", ", c #4C4C4C", "< c gray31", "1 c #515151", "2 c gray33", "3 c #585858", "4 c gray36", "5 c #606060", "6 c #717171", "7 c #727272", "8 c gray46", "9 c #777777", "0 c gray48", "q c #7C7C7C", "w c gray49", "e c #7E7E7E", "r c #8F570C", "t c #90580D", "y c #91590F", "u c #925A10", "i c #925C13", "p c #945C13", "a c #986019", "s c #9C641F", "d c #9D6725", "f c #A16925", "g c #A66E2C", "h c #A56F2F", "j c #A87432", "k c #AB7334", "l c #AA7436", "z c #AF7C3D", "x c #AD7E3E", "c c #B1793B", "v c #B0793D", "b c #AE7F40", "n c #B67E43", "m c #B47E45", "M c #3E8237", "N c #3F8338", "B c #458A3D", "V c #468B3E", "C c #478C3F", "Z c #4F8947", "A c #509149", "S c #54904D", "D c #54954D", "F c #599152", "G c #5D9D56", "H c #65A45D", "J c #66A55E", "K c #67A65F", "L c #69A760", "P c #71BB69", "I c #75BC6F", "U c #77BD6E", "Y c #79BE72", "T c #7CBF75", "R c #7CC073", "E c #7FC177", "W c #AE8041", "Q c #AF8143", "! c #B18345", "~ c #B18547", "^ c #B58447", "/ c #B88B42", "( c #BC844B", ") c #BA844C", "_ c #B3884B", "` c #B4894F", "' c #BA8A4E", "] c #B58B51", "[ c #B68D53", "{ c #B78F56", "} c #BF8954", "| c #B89058", " . c #B9915A", ".. c #C18952", "X. c #C68E59", "o. c #C48E5A", "O. c #C79554", "+. c #C89658", "@. c #C99A5A", "#. c #C99A5B", "$. c #CA9B5E", "%. c #DFB45F", "&. c #C99260", "*. c #CB9360", "=. c #CC9666", "-. c #CF9766", ";. c #CC9E61", ":. c #CC9F62", ">. c #CC9F63", ",. c #D29A6A", "<. c #D09A6C", "1. c #D39D6F", "2. c #D49C6D", "3. c #D69E6F", "4. c #D49E71", "5. c #D69E70", "6. c #CFA367", "7. c #CDA069", "8. c #D1A666", "9. c #D1A86E", "0. c #D1A773", "q. c #D4AD75", "w. c #D6AF74", "e. c #D2AB78", "r. c #D3AB78", "t. c #D4AF7D", "y. c #D7B37C", "u. c #D7B37E", "i. c #D7B47D", "p. c #E1B863", "a. c #83C37B", "s. c #86C57D", "d. c #FFD44B", "f. c #EDC45E", "g. c #808080", "h. c #989998", "j. c gray60", "k. c #9A9A9A", "l. c #9B9B9B", "z. c gray61", "x. c #9D9D9D", "c. c #A0A0A0", "v. c gray63", "b. c #A2A2A2", "n. c gray64", "m. c #A4A4A4", "M. c #A5A5A5", "N. c #D7B382", "B. c #DAB185", "V. c #DCB287", "C. c #DAB883", "Z. c #DAB983", "A. c #DAB984", "S. c #D9B788", "D. c #DCBD89", "F. c #DCBD8B", "G. c #DBBB8D", "H. c #DDBF94", "J. c #88C680", "K. c #8DC884", "L. c #92CB89", "P. c #94CC8B", "I. c #96CD8D", "U. c #DFC18F", "Y. c #DEC291", "T. c #E0C398", "R. c #E1C798", "E. c #E2C79E", "W. c #E3CBA2", "Q. c #E5CEA7", "!. c #E6D0A9", "~. c #E7D1AA", "^. c #E7D1AB", "/. c #E8D3AB", "(. c None", /* pixels */ "(.(.(.(.(.(.(.(.(.(.(.(.(.2.,.-.", "(.(.(.(.(.(.(.(.(.(.(.5.2.B. .*.", "(.(.g.e q 0 9 8 7 4.3.V./.!.| X.", "(.(.w j.j.k.k.l.l.1.~.^.R.Y.{ ..", "(.(.0 h.F k.l.z.z.<.Q.U.D.F.[ ( ", "(.(.9 S B l.z.x.x.=.W.D.Z.A.] n ", "(.(.Z L H M % $ # &.E.C.i.u.` c ", "(.C K I.L.K.J.a.@ o.T.y.w.f._ k ", "V J P.s.R U P T O } H.q.p.d./ g ", "(.N G J.a.E Y I X ) G.9.8.%.~ f ", "(.(.& D A + o . m S.6.;.>.! s ", "(.(.5 * - v.b.b.n.v N.:.@.$.Q a ", "(.(.4 c.= b.n.n.m.l t.#.O.+.W p ", "(.(.3 b.b.n.m.m.M.h e.r.0.7.b y ", "j.6 2 1 < , > : ; d j z ^ ' x r ", "(.(.(.(.(.(.(.(.(.(.(.(.u t i r " }; /* XPM */ static char *icon_link[] = { /* columns rows colors chars-per-pixel */ "16 16 43 1", " c #323232", ". c #3F3F3F", "X c #414141", "o c #464646", "O c gray29", "+ c #4B4B4B", "@ c #4C4C4C", "# c gray30", "$ c #515151", "% c gray32", "& c #585858", "* c #646464", "= c #656565", "- c #676767", "; c gray42", ": c #717171", "> c gray45", ", c gray47", "< c #797979", "1 c #7B7B7B", "2 c #7C7C7C", "3 c #818181", "4 c gray51", "5 c gray52", "6 c #8D8D8D", "7 c gray57", "8 c #929292", "9 c #979797", "0 c gray62", "q c gray66", "w c #AAAAAA", "e c gray68", "r c #AEAEAE", "t c gray74", "y c #C1C1C1", "u c gray76", "i c gray77", "p c #CECECE", "a c #D5D5D5", "s c gray85", "d c #DDDDDD", "f c gray91", "g c None", /* pixels */ "gggggggggggggggg", "gggggggggggggggg", "gggggggggggggggg", "gggggggggggggggg", "gggg502gg205gggg", "gg@7fdy31sdi7@gg", "gg>a&+=8<=+&q>gg", "g 4gg.tpue.gg4 g", "gg-g%Xo$$oX%g-gg", "gg#6wr9:,9rw6#gg", "gggO*;;gg;;*Oggg", "gggggggggggggggg", "gggggggggggggggg", "gggggggggggggggg", "gggggggggggggggg", "gggggggggggggggg" }; #ifdef MAC_INTEGRATION #define wave_gdk_pixmap_create_from_xpm_d(A,B,C,D) gdk_pixmap_create_from_xpm_d(A,NULL,C,D) #else #define wave_gdk_pixmap_create_from_xpm_d(A,B,C,D) gdk_pixmap_create_from_xpm_d(A,B,C,D) #endif #ifdef MAC_INTEGRATION GdkPixbuf * #else void #endif make_pixmaps(GtkWidget *window) { GtkStyle *style; #ifdef WAVE_USE_GTK2 GdkPixbuf *gp; #endif style=gtk_widget_get_style(window); GLOBALS->redo_pixmap=wave_gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->redo_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)icon_redo); GLOBALS->larrow_pixmap=wave_gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->larrow_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)icon_larrow); GLOBALS->rarrow_pixmap=wave_gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->rarrow_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)icon_rarrow); GLOBALS->zoomout_pixmap=wave_gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->zoomout_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)icon_zoomout); GLOBALS->zoomin_pixmap=wave_gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->zoomin_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)icon_zoomin); GLOBALS->zoomfit_pixmap=wave_gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->zoomfit_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)icon_zoomfit); GLOBALS->zoomundo_pixmap=wave_gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->zoomundo_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)icon_zoomundo); GLOBALS->zoom_larrow_pixmap=wave_gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->zoom_larrow_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)zoom_larrow); GLOBALS->zoom_rarrow_pixmap=wave_gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->zoom_rarrow_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)zoom_rarrow); GLOBALS->prev_page_pixmap=wave_gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->prev_page_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)prev_page_xpm); GLOBALS->next_page_pixmap=wave_gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->next_page_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)next_page_xpm); GLOBALS->wave_info_pixmap=wave_gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->wave_info_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)wave_info); GLOBALS->wave_alert_pixmap=wave_gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->wave_alert_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)wave_alert); /* Verilog */ GLOBALS->hiericon_module_pixmap=gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->hiericon_module_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)chart_organisation); GLOBALS->hiericon_task_pixmap=gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->hiericon_task_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)cog); GLOBALS->hiericon_function_pixmap=gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->hiericon_function_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)chart_line); GLOBALS->hiericon_begin_pixmap=gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->hiericon_begin_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)flag_green); GLOBALS->hiericon_fork_pixmap=gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->hiericon_fork_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)arrow_divide); /* SV */ GLOBALS->hiericon_interface_pixmap=gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->hiericon_interface_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)arrow_inout); GLOBALS->hiericon_svpackage_pixmap=gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->hiericon_svpackage_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)package); GLOBALS->hiericon_program_pixmap=gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->hiericon_program_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)application); GLOBALS->hiericon_class_pixmap=gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->hiericon_class_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)plugin); /* VHDL */ GLOBALS->hiericon_design_pixmap=gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->hiericon_design_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)database); GLOBALS->hiericon_block_pixmap=gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->hiericon_block_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)brick); GLOBALS->hiericon_generateif_pixmap=gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->hiericon_generateif_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)arrow_switch); GLOBALS->hiericon_generatefor_pixmap=gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->hiericon_generatefor_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)arrow_rotate_clockwise); GLOBALS->hiericon_instance_pixmap=gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->hiericon_instance_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)icon_component); GLOBALS->hiericon_package_pixmap=gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->hiericon_package_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)box); GLOBALS->hiericon_signal_pixmap=gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->hiericon_signal_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)signal_gtkwave); GLOBALS->hiericon_portin_pixmap=gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->hiericon_portin_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)door_in); GLOBALS->hiericon_portout_pixmap=gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->hiericon_portout_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)door_out); GLOBALS->hiericon_portinout_pixmap=gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->hiericon_portinout_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)door_open); GLOBALS->hiericon_buffer_pixmap=gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->hiericon_buffer_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)icon_extension); GLOBALS->hiericon_linkage_pixmap=wave_gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->hiericon_linkage_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)icon_link); /* FSDB VHDL (on top of GHW's existing) */ GLOBALS->hiericon_record_pixmap=gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->hiericon_record_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)cd_img); GLOBALS->hiericon_generate_pixmap=gdk_pixmap_create_from_xpm_d(window->window, &GLOBALS->hiericon_generate_mask, &style->bg[GTK_STATE_NORMAL], (gchar **)arrow_redo); #ifdef WAVE_USE_GTK2 /* set icon for window manager */ gp = xg_get_pixbuf_from_pix_and_mask(GLOBALS->wave_info_pixmap, GLOBALS->wave_info_mask, NULL); gtk_window_set_icon(GTK_WINDOW(window), gp); #ifdef MAC_INTEGRATION return(gp); #endif #else return; #endif } gtkwave-3.3.86/src/helpers/0000775000175000017500000000000013166335473015035 5ustar bybellbybellgtkwave-3.3.86/src/helpers/v2l_debug.c0000664000175000017500000000732713166335473017063 0ustar bybellbybell/* * Copyright (c) 2001 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ /* * debug.c 01feb99ajb * malloc debugs added on 13jul99ajb */ #include #include "v2l_debug.h" #ifdef DEBUG_MALLOC /* normally this should be undefined..this is *only* for finding stray allocations/frees */ static struct memchunk *mem=NULL; static size_t mem_total=0; static int mem_chunks=0; static void mem_addnode(void *ptr, size_t size) { struct memchunk *m; m=(struct memchunk *)malloc(sizeof(struct memchunk)); m->ptr=ptr; m->size=size; m->next=mem; mem=m; mem_total+=size; mem_chunks++; fprintf(stderr,"mem_addnode: TC:%05d TOT:%010d PNT:%010p LEN:+%d\n",mem_chunks,mem_total,ptr,size); } static void mem_freenode(void *ptr) { struct memchunk *m, *mprev=NULL; m=mem; while(m) { if(m->ptr==ptr) { if(mprev) { mprev->next=m->next; } else { mem=m->next; } mem_total=mem_total-m->size; mem_chunks--; fprintf(stderr,"mem_freenode: TC:%05d TOT:%010d PNT:%010p LEN:-%d\n",mem_chunks,mem_total,ptr,m->size); free(m); return; } mprev=m; m=m->next; } fprintf(stderr,"mem_freenode: PNT:%010p *INVALID*\n",ptr); sleep(1); } #endif /* * wrapped malloc family... */ void *malloc_2(size_t size) { void *ret; ret=malloc(size); if(ret) { DEBUG_M(mem_addnode(ret,size)); return(ret); } else { fprintf(stderr, "FATAL ERROR : Out of memory, sorry.\n"); exit(1); } } void *realloc_2(void *ptr, size_t size) { void *ret; ret=realloc(ptr, size); if(ret) { DEBUG_M(mem_freenode(ptr)); DEBUG_M(mem_addnode(ret,size)); return(ret); } else { fprintf(stderr, "FATAL ERROR : Out of memory, sorry.\n"); exit(1); } } void *calloc_2(size_t nmemb, size_t size) { void *ret; ret=calloc(nmemb, size); if(ret) { DEBUG_M(mem_addnode(ret, nmemb*size)); return(ret); } else { fprintf(stderr, "FATAL ERROR: Out of memory, sorry.\n"); exit(1); } } void free_2(void *ptr) { if(ptr) { DEBUG_M(mem_freenode(ptr)); free(ptr); } else { fprintf(stderr, "WARNING: Attempt to free NULL pointer caught.\n"); } } /* * atoi 64-bit version.. * y/on default to '1' * n/nonnum default to '0' */ TimeType atoi_64(char *str) { TimeType val=0; unsigned char ch, nflag=0; #if 0 switch(*str) { case 'y': case 'Y': return(LLDescriptor(1)); case 'o': case 'O': str++; ch=*str; if((ch=='n')||(ch=='N')) return(LLDescriptor(1)); else return(LLDescriptor(0)); case 'n': case 'N': return(LLDescriptor(0)); break; default: break; } #endif while((ch=*(str++))) { if((ch>='0')&&(ch<='9')) { val=(val*10+(ch&15)); } else if((ch=='-')&&(val==0)&&(!nflag)) { nflag=1; } else if(val) { break; } } return(nflag?(-val):val); } gtkwave-3.3.86/src/helpers/ghwdump.c0000664000175000017500000000746413166335473016667 0ustar bybellbybell/* Display a GHDL Wavefile for debugging. Copyright (C) 2005-2008 Tristan Gingold GHDL 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, or (at your option) any later version. GHDL 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 GCC; see the file COPYING. If not, write to the Free Software Foundation, 51 Franklin Street - Suite 500, Boston, MA 02110-1335, USA. */ #include #include #if HAVE_STDINT_H #include #endif #include #include #include #include "ghwlib.h" #include "wave_locale.h" static const char *progname; void usage (void) { printf ("usage: %s [OPTIONS] FILEs...\n", progname); printf ("Options are:\n" " -t display types\n" " -h display hierarchy\n" " -T display time\n" " -s display signals (and time)\n" " -l display list of sections\n" " -v verbose\n"); } int main (int argc, char **argv) { int i; int flag_disp_types; int flag_disp_hierarchy; int flag_disp_time; int flag_disp_signals; int flag_list; int flag_verbose; int eof; enum ghw_sm_type sm; progname = argv[0]; flag_disp_types = 0; flag_disp_hierarchy = 0; flag_disp_time = 0; flag_disp_signals = 0; flag_list = 0; flag_verbose = 0; WAVE_LOCALE_FIX while (1) { int c; c = getopt (argc, argv, "thTslv"); if (c == -1) break; switch (c) { case 't': flag_disp_types = 1; break; case 'h': flag_disp_hierarchy = 1; break; case 'T': flag_disp_time = 1; break; case 's': flag_disp_signals = 1; flag_disp_time = 1; break; case 'l': flag_list = 1; break; case 'v': flag_verbose++; break; default: usage (); exit (2); } } if (optind >= argc) { usage (); return 1; } for (i = optind; i < argc; i++) { struct ghw_handler h; struct ghw_handler *hp = &h; hp->flag_verbose = flag_verbose; if (ghw_open (hp, argv[i]) != 0) { fprintf (stderr, "cannot open ghw file %s\n", argv[i]); return 1; } if (flag_list) { while (1) { int section; section = ghw_read_section (hp); if (section == -2) { printf ("eof of file\n"); break; } else if (section < 0) { printf ("Error in file\n"); break; } else if (section == 0) { printf ("Unknown section\n"); break; } printf ("Section %s\n", ghw_sections[section].name); if ((*ghw_sections[section].handler)(hp) < 0) break; } } else { if (ghw_read_base (hp) < 0) { fprintf (stderr, "cannot read ghw file\n"); return 2; } if (0) { int ix; printf ("String table:\n"); for (ix = 1; ix < hp->nbr_str; ix++) printf (" %s\n", hp->str_table[ix]); } if (flag_disp_types) ghw_disp_types (hp); if (flag_disp_hierarchy) ghw_disp_hie (hp, hp->hie); #if 1 sm = ghw_sm_init; eof = 0; while (!eof) { switch (ghw_read_sm (hp, &sm)) { case ghw_res_snapshot: case ghw_res_cycle: if (flag_disp_time) printf ("Time is "GHWPRI64" fs\n", hp->snap_time); if (flag_disp_signals) ghw_disp_values (hp); break; case ghw_res_eof: eof = 1; break; default: abort (); } } #else if (ghw_read_dump (hp) < 0) { fprintf (stderr, "error in ghw dump\n"); return 3; } #endif } ghw_close (&h); } return 0; } gtkwave-3.3.86/src/helpers/fst/0000775000175000017500000000000013166335473015631 5ustar bybellbybellgtkwave-3.3.86/src/helpers/fst/lz4.c0000664000175000017500000015313213166335473016513 0ustar bybellbybell/* LZ4 - Fast LZ compression algorithm Copyright (C) 2011-2015, Yann Collet. BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. You can contact the author at : - LZ4 source repository : https://github.com/Cyan4973/lz4 - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c */ /************************************** * Tuning parameters **************************************/ /* * HEAPMODE : * Select how default compression functions will allocate memory for their hash table, * in memory stack (0:default, fastest), or in memory heap (1:requires malloc()). */ #define HEAPMODE 0 /* * ACCELERATION_DEFAULT : * Select "acceleration" for LZ4_compress_fast() when parameter value <= 0 */ #define ACCELERATION_DEFAULT 1 /************************************** * CPU Feature Detection **************************************/ /* * LZ4_FORCE_SW_BITCOUNT * Define this parameter if your target system or compiler does not support hardware bit count */ #if defined(_MSC_VER) && defined(_WIN32_WCE) /* Visual Studio for Windows CE does not support Hardware bit count */ # define LZ4_FORCE_SW_BITCOUNT #endif /************************************** * Includes **************************************/ #include "lz4.h" /************************************** * Compiler Options **************************************/ #ifdef _MSC_VER /* Visual Studio */ # define FORCE_INLINE static __forceinline # include # pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ # pragma warning(disable : 4293) /* disable: C4293: too large shift (32-bits) */ #else # if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */ # if defined(__GNUC__) || defined(__clang__) # define FORCE_INLINE static inline __attribute__((always_inline)) # else # define FORCE_INLINE static inline # endif # else # define FORCE_INLINE static # endif /* __STDC_VERSION__ */ #endif /* _MSC_VER */ /* LZ4_GCC_VERSION is defined into lz4.h */ #if (LZ4_GCC_VERSION >= 302) || (__INTEL_COMPILER >= 800) || defined(__clang__) # define expect(expr,value) (__builtin_expect ((expr),(value)) ) #else # define expect(expr,value) (expr) #endif #define likely(expr) expect((expr) != 0, 1) #define unlikely(expr) expect((expr) != 0, 0) /************************************** * Memory routines **************************************/ #include /* malloc, calloc, free */ #define ALLOCATOR(n,s) calloc(n,s) #define FREEMEM free #include /* memset, memcpy */ #define MEM_INIT memset /************************************** * Basic Types **************************************/ #if defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */ # include typedef uint8_t BYTE; typedef uint16_t U16; typedef uint32_t U32; typedef int32_t S32; typedef uint64_t U64; #else typedef unsigned char BYTE; typedef unsigned short U16; typedef unsigned int U32; typedef signed int S32; typedef unsigned long long U64; #endif /************************************** * Reading and writing into memory **************************************/ #define STEPSIZE sizeof(size_t) static unsigned LZ4_64bits(void) { return sizeof(void*)==8; } static unsigned LZ4_isLittleEndian(void) { const union { U32 i; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */ return one.c[0]; } static U16 LZ4_read16(const void* memPtr) { U16 val16; memcpy(&val16, memPtr, 2); return val16; } static U16 LZ4_readLE16(const void* memPtr) { if (LZ4_isLittleEndian()) { return LZ4_read16(memPtr); } else { const BYTE* p = (const BYTE*)memPtr; return (U16)((U16)p[0] + (p[1]<<8)); } } static void LZ4_writeLE16(void* memPtr, U16 value) { if (LZ4_isLittleEndian()) { memcpy(memPtr, &value, 2); } else { BYTE* p = (BYTE*)memPtr; p[0] = (BYTE) value; p[1] = (BYTE)(value>>8); } } static U32 LZ4_read32(const void* memPtr) { U32 val32; memcpy(&val32, memPtr, 4); return val32; } static U64 LZ4_read64(const void* memPtr) { U64 val64; memcpy(&val64, memPtr, 8); return val64; } static size_t LZ4_read_ARCH(const void* p) { if (LZ4_64bits()) return (size_t)LZ4_read64(p); else return (size_t)LZ4_read32(p); } static void LZ4_copy4(void* dstPtr, const void* srcPtr) { memcpy(dstPtr, srcPtr, 4); } static void LZ4_copy8(void* dstPtr, const void* srcPtr) { memcpy(dstPtr, srcPtr, 8); } /* customized version of memcpy, which may overwrite up to 7 bytes beyond dstEnd */ static void LZ4_wildCopy(void* dstPtr, const void* srcPtr, void* dstEnd) { BYTE* d = (BYTE*)dstPtr; const BYTE* s = (const BYTE*)srcPtr; BYTE* e = (BYTE*)dstEnd; do { LZ4_copy8(d,s); d+=8; s+=8; } while (d>3); # elif (defined(__clang__) || (LZ4_GCC_VERSION >= 304)) && !defined(LZ4_FORCE_SW_BITCOUNT) return (__builtin_ctzll((U64)val) >> 3); # else static const int DeBruijnBytePos[64] = { 0, 0, 0, 0, 0, 1, 1, 2, 0, 3, 1, 3, 1, 4, 2, 7, 0, 2, 3, 6, 1, 5, 3, 5, 1, 3, 4, 4, 2, 5, 6, 7, 7, 0, 1, 2, 3, 3, 4, 6, 2, 6, 5, 5, 3, 4, 5, 6, 7, 1, 2, 4, 6, 4, 4, 5, 7, 2, 6, 5, 7, 6, 7, 7 }; return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58]; # endif } else /* 32 bits */ { # if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT) unsigned long r; _BitScanForward( &r, (U32)val ); return (int)(r>>3); # elif (defined(__clang__) || (LZ4_GCC_VERSION >= 304)) && !defined(LZ4_FORCE_SW_BITCOUNT) return (__builtin_ctz((U32)val) >> 3); # else static const int DeBruijnBytePos[32] = { 0, 0, 3, 0, 3, 1, 3, 0, 3, 2, 2, 1, 3, 2, 0, 1, 3, 3, 1, 2, 2, 2, 2, 0, 3, 1, 2, 0, 1, 0, 1, 1 }; return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27]; # endif } } else /* Big Endian CPU */ { if (LZ4_64bits()) { # if defined(_MSC_VER) && defined(_WIN64) && !defined(LZ4_FORCE_SW_BITCOUNT) unsigned long r = 0; _BitScanReverse64( &r, val ); return (unsigned)(r>>3); # elif (defined(__clang__) || (LZ4_GCC_VERSION >= 304)) && !defined(LZ4_FORCE_SW_BITCOUNT) return (__builtin_clzll((U64)val) >> 3); # else unsigned r; if (!(val>>32)) { r=4; } else { r=0; val>>=32; } if (!(val>>16)) { r+=2; val>>=8; } else { val>>=24; } r += (!val); return r; # endif } else /* 32 bits */ { # if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT) unsigned long r = 0; _BitScanReverse( &r, (unsigned long)val ); return (unsigned)(r>>3); # elif (defined(__clang__) || (LZ4_GCC_VERSION >= 304)) && !defined(LZ4_FORCE_SW_BITCOUNT) return (__builtin_clz((U32)val) >> 3); # else unsigned r; if (!(val>>16)) { r=2; val>>=8; } else { r=0; val>>=24; } r += (!val); return r; # endif } } } static unsigned LZ4_count(const BYTE* pIn, const BYTE* pMatch, const BYTE* pInLimit) { const BYTE* const pStart = pIn; while (likely(pIn compression run slower on incompressible data */ /************************************** * Local Structures and types **************************************/ typedef struct { U32 hashTable[HASH_SIZE_U32]; U32 currentOffset; U32 initCheck; const BYTE* dictionary; BYTE* bufferStart; /* obsolete, used for slideInputBuffer */ U32 dictSize; } LZ4_stream_t_internal; typedef enum { notLimited = 0, limitedOutput = 1 } limitedOutput_directive; typedef enum { byPtr, byU32, byU16 } tableType_t; typedef enum { noDict = 0, withPrefix64k, usingExtDict } dict_directive; typedef enum { noDictIssue = 0, dictSmall } dictIssue_directive; typedef enum { endOnOutputSize = 0, endOnInputSize = 1 } endCondition_directive; typedef enum { full = 0, partial = 1 } earlyEnd_directive; /************************************** * Local Utils **************************************/ int LZ4_versionNumber (void) { return LZ4_VERSION_NUMBER; } int LZ4_compressBound(int isize) { return LZ4_COMPRESSBOUND(isize); } int LZ4_sizeofState() { return LZ4_STREAMSIZE; } /******************************** * Compression functions ********************************/ static U32 LZ4_hashSequence(U32 sequence, tableType_t const tableType) { if (tableType == byU16) return (((sequence) * 2654435761U) >> ((MINMATCH*8)-(LZ4_HASHLOG+1))); else return (((sequence) * 2654435761U) >> ((MINMATCH*8)-LZ4_HASHLOG)); } static const U64 prime5bytes = 889523592379ULL; static U32 LZ4_hashSequence64(size_t sequence, tableType_t const tableType) { const U32 hashLog = (tableType == byU16) ? LZ4_HASHLOG+1 : LZ4_HASHLOG; const U32 hashMask = (1<> (40 - hashLog)) & hashMask; } static U32 LZ4_hashSequenceT(size_t sequence, tableType_t const tableType) { if (LZ4_64bits()) return LZ4_hashSequence64(sequence, tableType); return LZ4_hashSequence((U32)sequence, tableType); } static U32 LZ4_hashPosition(const void* p, tableType_t tableType) { return LZ4_hashSequenceT(LZ4_read_ARCH(p), tableType); } static void LZ4_putPositionOnHash(const BYTE* p, U32 h, void* tableBase, tableType_t const tableType, const BYTE* srcBase) { switch (tableType) { case byPtr: { const BYTE** hashTable = (const BYTE**)tableBase; hashTable[h] = p; return; } case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = (U32)(p-srcBase); return; } case byU16: { U16* hashTable = (U16*) tableBase; hashTable[h] = (U16)(p-srcBase); return; } } } static void LZ4_putPosition(const BYTE* p, void* tableBase, tableType_t tableType, const BYTE* srcBase) { U32 h = LZ4_hashPosition(p, tableType); LZ4_putPositionOnHash(p, h, tableBase, tableType, srcBase); } static const BYTE* LZ4_getPositionOnHash(U32 h, void* tableBase, tableType_t tableType, const BYTE* srcBase) { if (tableType == byPtr) { const BYTE** hashTable = (const BYTE**) tableBase; return hashTable[h]; } if (tableType == byU32) { U32* hashTable = (U32*) tableBase; return hashTable[h] + srcBase; } { U16* hashTable = (U16*) tableBase; return hashTable[h] + srcBase; } /* default, to ensure a return */ } static const BYTE* LZ4_getPosition(const BYTE* p, void* tableBase, tableType_t tableType, const BYTE* srcBase) { U32 h = LZ4_hashPosition(p, tableType); return LZ4_getPositionOnHash(h, tableBase, tableType, srcBase); } FORCE_INLINE int LZ4_compress_generic( void* const ctx, const char* const source, char* const dest, const int inputSize, const int maxOutputSize, const limitedOutput_directive outputLimited, const tableType_t tableType, const dict_directive dict, const dictIssue_directive dictIssue, const U32 acceleration) { LZ4_stream_t_internal* const dictPtr = (LZ4_stream_t_internal*)ctx; const BYTE* ip = (const BYTE*) source; const BYTE* base; const BYTE* lowLimit; const BYTE* const lowRefLimit = ip - dictPtr->dictSize; const BYTE* const dictionary = dictPtr->dictionary; const BYTE* const dictEnd = dictionary + dictPtr->dictSize; const size_t dictDelta = dictEnd - (const BYTE*)source; const BYTE* anchor = (const BYTE*) source; const BYTE* const iend = ip + inputSize; const BYTE* const mflimit = iend - MFLIMIT; const BYTE* const matchlimit = iend - LASTLITERALS; BYTE* op = (BYTE*) dest; BYTE* const olimit = op + maxOutputSize; U32 forwardH; size_t refDelta=0; /* Init conditions */ if ((U32)inputSize > (U32)LZ4_MAX_INPUT_SIZE) return 0; /* Unsupported input size, too large (or negative) */ switch(dict) { case noDict: default: base = (const BYTE*)source; lowLimit = (const BYTE*)source; break; case withPrefix64k: base = (const BYTE*)source - dictPtr->currentOffset; lowLimit = (const BYTE*)source - dictPtr->dictSize; break; case usingExtDict: base = (const BYTE*)source - dictPtr->currentOffset; lowLimit = (const BYTE*)source; break; } if ((tableType == byU16) && (inputSize>=LZ4_64Klimit)) return 0; /* Size too large (not within 64K limit) */ if (inputSize> LZ4_skipTrigger); if (unlikely(forwardIp > mflimit)) goto _last_literals; match = LZ4_getPositionOnHash(h, ctx, tableType, base); if (dict==usingExtDict) { if (match<(const BYTE*)source) { refDelta = dictDelta; lowLimit = dictionary; } else { refDelta = 0; lowLimit = (const BYTE*)source; } } forwardH = LZ4_hashPosition(forwardIp, tableType); LZ4_putPositionOnHash(ip, h, ctx, tableType, base); } while ( ((dictIssue==dictSmall) ? (match < lowRefLimit) : 0) || ((tableType==byU16) ? 0 : (match + MAX_DISTANCE < ip)) || (LZ4_read32(match+refDelta) != LZ4_read32(ip)) ); } /* Catch up */ while ((ip>anchor) && (match+refDelta > lowLimit) && (unlikely(ip[-1]==match[refDelta-1]))) { ip--; match--; } { /* Encode Literal length */ unsigned litLength = (unsigned)(ip - anchor); token = op++; if ((outputLimited) && (unlikely(op + litLength + (2 + 1 + LASTLITERALS) + (litLength/255) > olimit))) return 0; /* Check output limit */ if (litLength>=RUN_MASK) { int len = (int)litLength-RUN_MASK; *token=(RUN_MASK<= 255 ; len-=255) *op++ = 255; *op++ = (BYTE)len; } else *token = (BYTE)(litLength< matchlimit) limit = matchlimit; matchLength = LZ4_count(ip+MINMATCH, match+MINMATCH, limit); ip += MINMATCH + matchLength; if (ip==limit) { unsigned more = LZ4_count(ip, (const BYTE*)source, matchlimit); matchLength += more; ip += more; } } else { matchLength = LZ4_count(ip+MINMATCH, match+MINMATCH, matchlimit); ip += MINMATCH + matchLength; } if ((outputLimited) && (unlikely(op + (1 + LASTLITERALS) + (matchLength>>8) > olimit))) return 0; /* Check output limit */ if (matchLength>=ML_MASK) { *token += ML_MASK; matchLength -= ML_MASK; for (; matchLength >= 510 ; matchLength-=510) { *op++ = 255; *op++ = 255; } if (matchLength >= 255) { matchLength-=255; *op++ = 255; } *op++ = (BYTE)matchLength; } else *token += (BYTE)(matchLength); } anchor = ip; /* Test end of chunk */ if (ip > mflimit) break; /* Fill table */ LZ4_putPosition(ip-2, ctx, tableType, base); /* Test next position */ match = LZ4_getPosition(ip, ctx, tableType, base); if (dict==usingExtDict) { if (match<(const BYTE*)source) { refDelta = dictDelta; lowLimit = dictionary; } else { refDelta = 0; lowLimit = (const BYTE*)source; } } LZ4_putPosition(ip, ctx, tableType, base); if ( ((dictIssue==dictSmall) ? (match>=lowRefLimit) : 1) && (match+MAX_DISTANCE>=ip) && (LZ4_read32(match+refDelta)==LZ4_read32(ip)) ) { token=op++; *token=0; goto _next_match; } /* Prepare next loop */ forwardH = LZ4_hashPosition(++ip, tableType); } _last_literals: /* Encode Last Literals */ { const size_t lastRun = (size_t)(iend - anchor); if ((outputLimited) && ((op - (BYTE*)dest) + lastRun + 1 + ((lastRun+255-RUN_MASK)/255) > (U32)maxOutputSize)) return 0; /* Check output limit */ if (lastRun >= RUN_MASK) { size_t accumulator = lastRun - RUN_MASK; *op++ = RUN_MASK << ML_BITS; for(; accumulator >= 255 ; accumulator-=255) *op++ = 255; *op++ = (BYTE) accumulator; } else { *op++ = (BYTE)(lastRun<= LZ4_compressBound(inputSize)) { if (inputSize < LZ4_64Klimit) return LZ4_compress_generic(state, source, dest, inputSize, 0, notLimited, byU16, noDict, noDictIssue, acceleration); else return LZ4_compress_generic(state, source, dest, inputSize, 0, notLimited, LZ4_64bits() ? byU32 : byPtr, noDict, noDictIssue, acceleration); } else { if (inputSize < LZ4_64Klimit) return LZ4_compress_generic(state, source, dest, inputSize, maxOutputSize, limitedOutput, byU16, noDict, noDictIssue, acceleration); else return LZ4_compress_generic(state, source, dest, inputSize, maxOutputSize, limitedOutput, LZ4_64bits() ? byU32 : byPtr, noDict, noDictIssue, acceleration); } } int LZ4_compress_fast(const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) { #if (HEAPMODE) void* ctxPtr = ALLOCATOR(1, sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ #else LZ4_stream_t ctx; void* ctxPtr = &ctx; #endif int result = LZ4_compress_fast_extState(ctxPtr, source, dest, inputSize, maxOutputSize, acceleration); #if (HEAPMODE) FREEMEM(ctxPtr); #endif return result; } int LZ4_compress_default(const char* source, char* dest, int inputSize, int maxOutputSize) { return LZ4_compress_fast(source, dest, inputSize, maxOutputSize, 1); } /* hidden debug function */ /* strangely enough, gcc generates faster code when this function is uncommented, even if unused */ int LZ4_compress_fast_force(const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) { LZ4_stream_t ctx; LZ4_resetStream(&ctx); if (inputSize < LZ4_64Klimit) return LZ4_compress_generic(&ctx, source, dest, inputSize, maxOutputSize, limitedOutput, byU16, noDict, noDictIssue, acceleration); else return LZ4_compress_generic(&ctx, source, dest, inputSize, maxOutputSize, limitedOutput, LZ4_64bits() ? byU32 : byPtr, noDict, noDictIssue, acceleration); } /******************************** * destSize variant ********************************/ static int LZ4_compress_destSize_generic( void* const ctx, const char* const src, char* const dst, int* const srcSizePtr, const int targetDstSize, const tableType_t tableType) { const BYTE* ip = (const BYTE*) src; const BYTE* base = (const BYTE*) src; const BYTE* lowLimit = (const BYTE*) src; const BYTE* anchor = ip; const BYTE* const iend = ip + *srcSizePtr; const BYTE* const mflimit = iend - MFLIMIT; const BYTE* const matchlimit = iend - LASTLITERALS; BYTE* op = (BYTE*) dst; BYTE* const oend = op + targetDstSize; BYTE* const oMaxLit = op + targetDstSize - 2 /* offset */ - 8 /* because 8+MINMATCH==MFLIMIT */ - 1 /* token */; BYTE* const oMaxMatch = op + targetDstSize - (LASTLITERALS + 1 /* token */); BYTE* const oMaxSeq = oMaxLit - 1 /* token */; U32 forwardH; /* Init conditions */ if (targetDstSize < 1) return 0; /* Impossible to store anything */ if ((U32)*srcSizePtr > (U32)LZ4_MAX_INPUT_SIZE) return 0; /* Unsupported input size, too large (or negative) */ if ((tableType == byU16) && (*srcSizePtr>=LZ4_64Klimit)) return 0; /* Size too large (not within 64K limit) */ if (*srcSizePtr> LZ4_skipTrigger); if (unlikely(forwardIp > mflimit)) goto _last_literals; match = LZ4_getPositionOnHash(h, ctx, tableType, base); forwardH = LZ4_hashPosition(forwardIp, tableType); LZ4_putPositionOnHash(ip, h, ctx, tableType, base); } while ( ((tableType==byU16) ? 0 : (match + MAX_DISTANCE < ip)) || (LZ4_read32(match) != LZ4_read32(ip)) ); } /* Catch up */ while ((ip>anchor) && (match > lowLimit) && (unlikely(ip[-1]==match[-1]))) { ip--; match--; } { /* Encode Literal length */ unsigned litLength = (unsigned)(ip - anchor); token = op++; if (op + ((litLength+240)/255) + litLength > oMaxLit) { /* Not enough space for a last match */ op--; goto _last_literals; } if (litLength>=RUN_MASK) { unsigned len = litLength - RUN_MASK; *token=(RUN_MASK<= 255 ; len-=255) *op++ = 255; *op++ = (BYTE)len; } else *token = (BYTE)(litLength< oMaxMatch) { /* Match description too long : reduce it */ matchLength = (15-1) + (oMaxMatch-op) * 255; } //printf("offset %5i, matchLength%5i \n", (int)(ip-match), matchLength + MINMATCH); ip += MINMATCH + matchLength; if (matchLength>=ML_MASK) { *token += ML_MASK; matchLength -= ML_MASK; while (matchLength >= 255) { matchLength-=255; *op++ = 255; } *op++ = (BYTE)matchLength; } else *token += (BYTE)(matchLength); } anchor = ip; /* Test end of block */ if (ip > mflimit) break; if (op > oMaxSeq) break; /* Fill table */ LZ4_putPosition(ip-2, ctx, tableType, base); /* Test next position */ match = LZ4_getPosition(ip, ctx, tableType, base); LZ4_putPosition(ip, ctx, tableType, base); if ( (match+MAX_DISTANCE>=ip) && (LZ4_read32(match)==LZ4_read32(ip)) ) { token=op++; *token=0; goto _next_match; } /* Prepare next loop */ forwardH = LZ4_hashPosition(++ip, tableType); } _last_literals: /* Encode Last Literals */ { size_t lastRunSize = (size_t)(iend - anchor); if (op + 1 /* token */ + ((lastRunSize+240)/255) /* litLength */ + lastRunSize /* literals */ > oend) { /* adapt lastRunSize to fill 'dst' */ lastRunSize = (oend-op) - 1; lastRunSize -= (lastRunSize+240)/255; } ip = anchor + lastRunSize; if (lastRunSize >= RUN_MASK) { size_t accumulator = lastRunSize - RUN_MASK; *op++ = RUN_MASK << ML_BITS; for(; accumulator >= 255 ; accumulator-=255) *op++ = 255; *op++ = (BYTE) accumulator; } else { *op++ = (BYTE)(lastRunSize<= LZ4_compressBound(*srcSizePtr)) /* compression success is guaranteed */ { return LZ4_compress_fast_extState(state, src, dst, *srcSizePtr, targetDstSize, 1); } else { if (*srcSizePtr < LZ4_64Klimit) return LZ4_compress_destSize_generic(state, src, dst, srcSizePtr, targetDstSize, byU16); else return LZ4_compress_destSize_generic(state, src, dst, srcSizePtr, targetDstSize, LZ4_64bits() ? byU32 : byPtr); } } int LZ4_compress_destSize(const char* src, char* dst, int* srcSizePtr, int targetDstSize) { #if (HEAPMODE) void* ctx = ALLOCATOR(1, sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ #else LZ4_stream_t ctxBody; void* ctx = &ctxBody; #endif int result = LZ4_compress_destSize_extState(ctx, src, dst, srcSizePtr, targetDstSize); #if (HEAPMODE) FREEMEM(ctx); #endif return result; } /******************************** * Streaming functions ********************************/ LZ4_stream_t* LZ4_createStream(void) { LZ4_stream_t* lz4s = (LZ4_stream_t*)ALLOCATOR(8, LZ4_STREAMSIZE_U64); LZ4_STATIC_ASSERT(LZ4_STREAMSIZE >= sizeof(LZ4_stream_t_internal)); /* A compilation error here means LZ4_STREAMSIZE is not large enough */ LZ4_resetStream(lz4s); return lz4s; } void LZ4_resetStream (LZ4_stream_t* LZ4_stream) { MEM_INIT(LZ4_stream, 0, sizeof(LZ4_stream_t)); } int LZ4_freeStream (LZ4_stream_t* LZ4_stream) { FREEMEM(LZ4_stream); return (0); } #define HASH_UNIT sizeof(size_t) int LZ4_loadDict (LZ4_stream_t* LZ4_dict, const char* dictionary, int dictSize) { LZ4_stream_t_internal* dict = (LZ4_stream_t_internal*) LZ4_dict; const BYTE* p = (const BYTE*)dictionary; const BYTE* const dictEnd = p + dictSize; const BYTE* base; if ((dict->initCheck) || (dict->currentOffset > 1 GB)) /* Uninitialized structure, or reuse overflow */ LZ4_resetStream(LZ4_dict); if (dictSize < (int)HASH_UNIT) { dict->dictionary = NULL; dict->dictSize = 0; return 0; } if ((dictEnd - p) > 64 KB) p = dictEnd - 64 KB; dict->currentOffset += 64 KB; base = p - dict->currentOffset; dict->dictionary = p; dict->dictSize = (U32)(dictEnd - p); dict->currentOffset += dict->dictSize; while (p <= dictEnd-HASH_UNIT) { LZ4_putPosition(p, dict->hashTable, byU32, base); p+=3; } return dict->dictSize; } static void LZ4_renormDictT(LZ4_stream_t_internal* LZ4_dict, const BYTE* src) { if ((LZ4_dict->currentOffset > 0x80000000) || ((size_t)LZ4_dict->currentOffset > (size_t)src)) /* address space overflow */ { /* rescale hash table */ U32 delta = LZ4_dict->currentOffset - 64 KB; const BYTE* dictEnd = LZ4_dict->dictionary + LZ4_dict->dictSize; int i; for (i=0; ihashTable[i] < delta) LZ4_dict->hashTable[i]=0; else LZ4_dict->hashTable[i] -= delta; } LZ4_dict->currentOffset = 64 KB; if (LZ4_dict->dictSize > 64 KB) LZ4_dict->dictSize = 64 KB; LZ4_dict->dictionary = dictEnd - LZ4_dict->dictSize; } } int LZ4_compress_fast_continue (LZ4_stream_t* LZ4_stream, const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) { LZ4_stream_t_internal* streamPtr = (LZ4_stream_t_internal*)LZ4_stream; const BYTE* const dictEnd = streamPtr->dictionary + streamPtr->dictSize; const BYTE* smallest = (const BYTE*) source; if (streamPtr->initCheck) return 0; /* Uninitialized structure detected */ if ((streamPtr->dictSize>0) && (smallest>dictEnd)) smallest = dictEnd; LZ4_renormDictT(streamPtr, smallest); if (acceleration < 1) acceleration = ACCELERATION_DEFAULT; /* Check overlapping input/dictionary space */ { const BYTE* sourceEnd = (const BYTE*) source + inputSize; if ((sourceEnd > streamPtr->dictionary) && (sourceEnd < dictEnd)) { streamPtr->dictSize = (U32)(dictEnd - sourceEnd); if (streamPtr->dictSize > 64 KB) streamPtr->dictSize = 64 KB; if (streamPtr->dictSize < 4) streamPtr->dictSize = 0; streamPtr->dictionary = dictEnd - streamPtr->dictSize; } } /* prefix mode : source data follows dictionary */ if (dictEnd == (const BYTE*)source) { int result; if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) result = LZ4_compress_generic(LZ4_stream, source, dest, inputSize, maxOutputSize, limitedOutput, byU32, withPrefix64k, dictSmall, acceleration); else result = LZ4_compress_generic(LZ4_stream, source, dest, inputSize, maxOutputSize, limitedOutput, byU32, withPrefix64k, noDictIssue, acceleration); streamPtr->dictSize += (U32)inputSize; streamPtr->currentOffset += (U32)inputSize; return result; } /* external dictionary mode */ { int result; if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) result = LZ4_compress_generic(LZ4_stream, source, dest, inputSize, maxOutputSize, limitedOutput, byU32, usingExtDict, dictSmall, acceleration); else result = LZ4_compress_generic(LZ4_stream, source, dest, inputSize, maxOutputSize, limitedOutput, byU32, usingExtDict, noDictIssue, acceleration); streamPtr->dictionary = (const BYTE*)source; streamPtr->dictSize = (U32)inputSize; streamPtr->currentOffset += (U32)inputSize; return result; } } /* Hidden debug function, to force external dictionary mode */ int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* dest, int inputSize) { LZ4_stream_t_internal* streamPtr = (LZ4_stream_t_internal*)LZ4_dict; int result; const BYTE* const dictEnd = streamPtr->dictionary + streamPtr->dictSize; const BYTE* smallest = dictEnd; if (smallest > (const BYTE*) source) smallest = (const BYTE*) source; LZ4_renormDictT((LZ4_stream_t_internal*)LZ4_dict, smallest); result = LZ4_compress_generic(LZ4_dict, source, dest, inputSize, 0, notLimited, byU32, usingExtDict, noDictIssue, 1); streamPtr->dictionary = (const BYTE*)source; streamPtr->dictSize = (U32)inputSize; streamPtr->currentOffset += (U32)inputSize; return result; } int LZ4_saveDict (LZ4_stream_t* LZ4_dict, char* safeBuffer, int dictSize) { LZ4_stream_t_internal* dict = (LZ4_stream_t_internal*) LZ4_dict; const BYTE* previousDictEnd = dict->dictionary + dict->dictSize; if ((U32)dictSize > 64 KB) dictSize = 64 KB; /* useless to define a dictionary > 64 KB */ if ((U32)dictSize > dict->dictSize) dictSize = dict->dictSize; memmove(safeBuffer, previousDictEnd - dictSize, dictSize); dict->dictionary = (const BYTE*)safeBuffer; dict->dictSize = (U32)dictSize; return dictSize; } /******************************* * Decompression functions *******************************/ /* * This generic decompression function cover all use cases. * It shall be instantiated several times, using different sets of directives * Note that it is essential this generic function is really inlined, * in order to remove useless branches during compilation optimization. */ FORCE_INLINE int LZ4_decompress_generic( const char* const source, char* const dest, int inputSize, int outputSize, /* If endOnInput==endOnInputSize, this value is the max size of Output Buffer. */ int endOnInput, /* endOnOutputSize, endOnInputSize */ int partialDecoding, /* full, partial */ int targetOutputSize, /* only used if partialDecoding==partial */ int dict, /* noDict, withPrefix64k, usingExtDict */ const BYTE* const lowPrefix, /* == dest if dict == noDict */ const BYTE* const dictStart, /* only if dict==usingExtDict */ const size_t dictSize /* note : = 0 if noDict */ ) { /* Local Variables */ const BYTE* ip = (const BYTE*) source; const BYTE* const iend = ip + inputSize; BYTE* op = (BYTE*) dest; BYTE* const oend = op + outputSize; BYTE* cpy; BYTE* oexit = op + targetOutputSize; const BYTE* const lowLimit = lowPrefix - dictSize; const BYTE* const dictEnd = (const BYTE*)dictStart + dictSize; const size_t dec32table[] = {4, 1, 2, 1, 4, 4, 4, 4}; const size_t dec64table[] = {0, 0, 0, (size_t)-1, 0, 1, 2, 3}; const int safeDecode = (endOnInput==endOnInputSize); const int checkOffset = ((safeDecode) && (dictSize < (int)(64 KB))); /* Special cases */ if ((partialDecoding) && (oexit> oend-MFLIMIT)) oexit = oend-MFLIMIT; /* targetOutputSize too high => decode everything */ if ((endOnInput) && (unlikely(outputSize==0))) return ((inputSize==1) && (*ip==0)) ? 0 : -1; /* Empty output buffer */ if ((!endOnInput) && (unlikely(outputSize==0))) return (*ip==0?1:-1); /* Main Loop */ while (1) { unsigned token; size_t length; const BYTE* match; /* get literal length */ token = *ip++; if ((length=(token>>ML_BITS)) == RUN_MASK) { unsigned s; do { s = *ip++; length += s; } while (likely((endOnInput)?ip(partialDecoding?oexit:oend-MFLIMIT)) || (ip+length>iend-(2+1+LASTLITERALS))) ) || ((!endOnInput) && (cpy>oend-COPYLENGTH))) { if (partialDecoding) { if (cpy > oend) goto _output_error; /* Error : write attempt beyond end of output buffer */ if ((endOnInput) && (ip+length > iend)) goto _output_error; /* Error : read attempt beyond end of input buffer */ } else { if ((!endOnInput) && (cpy != oend)) goto _output_error; /* Error : block decoding must stop exactly there */ if ((endOnInput) && ((ip+length != iend) || (cpy > oend))) goto _output_error; /* Error : input must be consumed */ } memcpy(op, ip, length); ip += length; op += length; break; /* Necessarily EOF, due to parsing restrictions */ } LZ4_wildCopy(op, ip, cpy); ip += length; op = cpy; /* get offset */ match = cpy - LZ4_readLE16(ip); ip+=2; if ((checkOffset) && (unlikely(match < lowLimit))) goto _output_error; /* Error : offset outside destination buffer */ /* get matchlength */ length = token & ML_MASK; if (length == ML_MASK) { unsigned s; do { if ((endOnInput) && (ip > iend-LASTLITERALS)) goto _output_error; s = *ip++; length += s; } while (s==255); if ((safeDecode) && unlikely((size_t)(op+length)<(size_t)op)) goto _output_error; /* overflow detection */ } length += MINMATCH; /* check external dictionary */ if ((dict==usingExtDict) && (match < lowPrefix)) { if (unlikely(op+length > oend-LASTLITERALS)) goto _output_error; /* doesn't respect parsing restriction */ if (length <= (size_t)(lowPrefix-match)) { /* match can be copied as a single segment from external dictionary */ match = dictEnd - (lowPrefix-match); memmove(op, match, length); op += length; } else { /* match encompass external dictionary and current segment */ size_t copySize = (size_t)(lowPrefix-match); memcpy(op, dictEnd - copySize, copySize); op += copySize; copySize = length - copySize; if (copySize > (size_t)(op-lowPrefix)) /* overlap within current segment */ { BYTE* const endOfMatch = op + copySize; const BYTE* copyFrom = lowPrefix; while (op < endOfMatch) *op++ = *copyFrom++; } else { memcpy(op, lowPrefix, copySize); op += copySize; } } continue; } /* copy repeated sequence */ cpy = op + length; if (unlikely((op-match)<8)) { const size_t dec64 = dec64table[op-match]; op[0] = match[0]; op[1] = match[1]; op[2] = match[2]; op[3] = match[3]; match += dec32table[op-match]; LZ4_copy4(op+4, match); op += 8; match -= dec64; } else { LZ4_copy8(op, match); op+=8; match+=8; } if (unlikely(cpy>oend-12)) { if (cpy > oend-LASTLITERALS) goto _output_error; /* Error : last LASTLITERALS bytes must be literals */ if (op < oend-8) { LZ4_wildCopy(op, match, oend-8); match += (oend-8) - op; op = oend-8; } while (opprefixSize = (size_t) dictSize; lz4sd->prefixEnd = (const BYTE*) dictionary + dictSize; lz4sd->externalDict = NULL; lz4sd->extDictSize = 0; return 1; } /* *_continue() : These decoding functions allow decompression of multiple blocks in "streaming" mode. Previously decoded blocks must still be available at the memory position where they were decoded. If it's not possible, save the relevant part of decoded data into a safe buffer, and indicate where it stands using LZ4_setStreamDecode() */ int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int compressedSize, int maxOutputSize) { LZ4_streamDecode_t_internal* lz4sd = (LZ4_streamDecode_t_internal*) LZ4_streamDecode; int result; if (lz4sd->prefixEnd == (BYTE*)dest) { result = LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, endOnInputSize, full, 0, usingExtDict, lz4sd->prefixEnd - lz4sd->prefixSize, lz4sd->externalDict, lz4sd->extDictSize); if (result <= 0) return result; lz4sd->prefixSize += result; lz4sd->prefixEnd += result; } else { lz4sd->extDictSize = lz4sd->prefixSize; lz4sd->externalDict = lz4sd->prefixEnd - lz4sd->extDictSize; result = LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, endOnInputSize, full, 0, usingExtDict, (BYTE*)dest, lz4sd->externalDict, lz4sd->extDictSize); if (result <= 0) return result; lz4sd->prefixSize = result; lz4sd->prefixEnd = (BYTE*)dest + result; } return result; } int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int originalSize) { LZ4_streamDecode_t_internal* lz4sd = (LZ4_streamDecode_t_internal*) LZ4_streamDecode; int result; if (lz4sd->prefixEnd == (BYTE*)dest) { result = LZ4_decompress_generic(source, dest, 0, originalSize, endOnOutputSize, full, 0, usingExtDict, lz4sd->prefixEnd - lz4sd->prefixSize, lz4sd->externalDict, lz4sd->extDictSize); if (result <= 0) return result; lz4sd->prefixSize += originalSize; lz4sd->prefixEnd += originalSize; } else { lz4sd->extDictSize = lz4sd->prefixSize; lz4sd->externalDict = (BYTE*)dest - lz4sd->extDictSize; result = LZ4_decompress_generic(source, dest, 0, originalSize, endOnOutputSize, full, 0, usingExtDict, (BYTE*)dest, lz4sd->externalDict, lz4sd->extDictSize); if (result <= 0) return result; lz4sd->prefixSize = originalSize; lz4sd->prefixEnd = (BYTE*)dest + originalSize; } return result; } /* Advanced decoding functions : *_usingDict() : These decoding functions work the same as "_continue" ones, the dictionary must be explicitly provided within parameters */ FORCE_INLINE int LZ4_decompress_usingDict_generic(const char* source, char* dest, int compressedSize, int maxOutputSize, int safe, const char* dictStart, int dictSize) { if (dictSize==0) return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, full, 0, noDict, (BYTE*)dest, NULL, 0); if (dictStart+dictSize == dest) { if (dictSize >= (int)(64 KB - 1)) return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, full, 0, withPrefix64k, (BYTE*)dest-64 KB, NULL, 0); return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, full, 0, noDict, (BYTE*)dest-dictSize, NULL, 0); } return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, full, 0, usingExtDict, (BYTE*)dest, (const BYTE*)dictStart, dictSize); } int LZ4_decompress_safe_usingDict(const char* source, char* dest, int compressedSize, int maxOutputSize, const char* dictStart, int dictSize) { return LZ4_decompress_usingDict_generic(source, dest, compressedSize, maxOutputSize, 1, dictStart, dictSize); } int LZ4_decompress_fast_usingDict(const char* source, char* dest, int originalSize, const char* dictStart, int dictSize) { return LZ4_decompress_usingDict_generic(source, dest, 0, originalSize, 0, dictStart, dictSize); } /* debug function */ int LZ4_decompress_safe_forceExtDict(const char* source, char* dest, int compressedSize, int maxOutputSize, const char* dictStart, int dictSize) { return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, endOnInputSize, full, 0, usingExtDict, (BYTE*)dest, (const BYTE*)dictStart, dictSize); } /*************************************************** * Obsolete Functions ***************************************************/ /* obsolete compression functions */ int LZ4_compress_limitedOutput(const char* source, char* dest, int inputSize, int maxOutputSize) { return LZ4_compress_default(source, dest, inputSize, maxOutputSize); } int LZ4_compress(const char* source, char* dest, int inputSize) { return LZ4_compress_default(source, dest, inputSize, LZ4_compressBound(inputSize)); } int LZ4_compress_limitedOutput_withState (void* state, const char* src, char* dst, int srcSize, int dstSize) { return LZ4_compress_fast_extState(state, src, dst, srcSize, dstSize, 1); } int LZ4_compress_withState (void* state, const char* src, char* dst, int srcSize) { return LZ4_compress_fast_extState(state, src, dst, srcSize, LZ4_compressBound(srcSize), 1); } int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_stream, const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_fast_continue(LZ4_stream, src, dst, srcSize, maxDstSize, 1); } int LZ4_compress_continue (LZ4_stream_t* LZ4_stream, const char* source, char* dest, int inputSize) { return LZ4_compress_fast_continue(LZ4_stream, source, dest, inputSize, LZ4_compressBound(inputSize), 1); } /* These function names are deprecated and should no longer be used. They are only provided here for compatibility with older user programs. - LZ4_uncompress is totally equivalent to LZ4_decompress_fast - LZ4_uncompress_unknownOutputSize is totally equivalent to LZ4_decompress_safe */ int LZ4_uncompress (const char* source, char* dest, int outputSize) { return LZ4_decompress_fast(source, dest, outputSize); } int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize) { return LZ4_decompress_safe(source, dest, isize, maxOutputSize); } /* Obsolete Streaming functions */ int LZ4_sizeofStreamState() { return LZ4_STREAMSIZE; } static void LZ4_init(LZ4_stream_t_internal* lz4ds, BYTE* base) { MEM_INIT(lz4ds, 0, LZ4_STREAMSIZE); lz4ds->bufferStart = base; } int LZ4_resetStreamState(void* state, char* inputBuffer) { if ((((size_t)state) & 3) != 0) return 1; /* Error : pointer is not aligned on 4-bytes boundary */ LZ4_init((LZ4_stream_t_internal*)state, (BYTE*)inputBuffer); return 0; } void* LZ4_create (char* inputBuffer) { void* lz4ds = ALLOCATOR(8, LZ4_STREAMSIZE_U64); LZ4_init ((LZ4_stream_t_internal*)lz4ds, (BYTE*)inputBuffer); return lz4ds; } char* LZ4_slideInputBuffer (void* LZ4_Data) { LZ4_stream_t_internal* ctx = (LZ4_stream_t_internal*)LZ4_Data; int dictSize = LZ4_saveDict((LZ4_stream_t*)LZ4_Data, (char*)ctx->bufferStart, 64 KB); return (char*)(ctx->bufferStart + dictSize); } /* Obsolete streaming decompression functions */ int LZ4_decompress_safe_withPrefix64k(const char* source, char* dest, int compressedSize, int maxOutputSize) { return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, endOnInputSize, full, 0, withPrefix64k, (BYTE*)dest - 64 KB, NULL, 64 KB); } int LZ4_decompress_fast_withPrefix64k(const char* source, char* dest, int originalSize) { return LZ4_decompress_generic(source, dest, 0, originalSize, endOnOutputSize, full, 0, withPrefix64k, (BYTE*)dest - 64 KB, NULL, 64 KB); } #endif /* LZ4_COMMONDEFS_ONLY */ gtkwave-3.3.86/src/helpers/fst/fstapi.h0000664000175000017500000004122113166335473017270 0ustar bybellbybell/* * Copyright (c) 2009-2017 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef FST_API_H #define FST_API_H #ifdef __cplusplus extern "C" { #endif #include #include #include #include #include #include #include #include #define FST_RDLOAD "FSTLOAD | " typedef uint32_t fstHandle; enum fstWriterPackType { FST_WR_PT_ZLIB = 0, FST_WR_PT_FASTLZ = 1, FST_WR_PT_LZ4 = 2 }; enum fstFileType { FST_FT_MIN = 0, FST_FT_VERILOG = 0, FST_FT_VHDL = 1, FST_FT_VERILOG_VHDL = 2, FST_FT_MAX = 2 }; enum fstBlockType { FST_BL_HDR = 0, FST_BL_VCDATA = 1, FST_BL_BLACKOUT = 2, FST_BL_GEOM = 3, FST_BL_HIER = 4, FST_BL_VCDATA_DYN_ALIAS = 5, FST_BL_HIER_LZ4 = 6, FST_BL_HIER_LZ4DUO = 7, FST_BL_VCDATA_DYN_ALIAS2 = 8, FST_BL_ZWRAPPER = 254, /* indicates that whole trace is gz wrapped */ FST_BL_SKIP = 255 /* used while block is being written */ }; enum fstScopeType { FST_ST_MIN = 0, FST_ST_VCD_MODULE = 0, FST_ST_VCD_TASK = 1, FST_ST_VCD_FUNCTION = 2, FST_ST_VCD_BEGIN = 3, FST_ST_VCD_FORK = 4, FST_ST_VCD_GENERATE = 5, FST_ST_VCD_STRUCT = 6, FST_ST_VCD_UNION = 7, FST_ST_VCD_CLASS = 8, FST_ST_VCD_INTERFACE = 9, FST_ST_VCD_PACKAGE = 10, FST_ST_VCD_PROGRAM = 11, FST_ST_VHDL_ARCHITECTURE = 12, FST_ST_VHDL_PROCEDURE = 13, FST_ST_VHDL_FUNCTION = 14, FST_ST_VHDL_RECORD = 15, FST_ST_VHDL_PROCESS = 16, FST_ST_VHDL_BLOCK = 17, FST_ST_VHDL_FOR_GENERATE = 18, FST_ST_VHDL_IF_GENERATE = 19, FST_ST_VHDL_GENERATE = 20, FST_ST_VHDL_PACKAGE = 21, FST_ST_MAX = 21, FST_ST_GEN_ATTRBEGIN = 252, FST_ST_GEN_ATTREND = 253, FST_ST_VCD_SCOPE = 254, FST_ST_VCD_UPSCOPE = 255 }; enum fstVarType { FST_VT_MIN = 0, /* start of vartypes */ FST_VT_VCD_EVENT = 0, FST_VT_VCD_INTEGER = 1, FST_VT_VCD_PARAMETER = 2, FST_VT_VCD_REAL = 3, FST_VT_VCD_REAL_PARAMETER = 4, FST_VT_VCD_REG = 5, FST_VT_VCD_SUPPLY0 = 6, FST_VT_VCD_SUPPLY1 = 7, FST_VT_VCD_TIME = 8, FST_VT_VCD_TRI = 9, FST_VT_VCD_TRIAND = 10, FST_VT_VCD_TRIOR = 11, FST_VT_VCD_TRIREG = 12, FST_VT_VCD_TRI0 = 13, FST_VT_VCD_TRI1 = 14, FST_VT_VCD_WAND = 15, FST_VT_VCD_WIRE = 16, FST_VT_VCD_WOR = 17, FST_VT_VCD_PORT = 18, FST_VT_VCD_SPARRAY = 19, /* used to define the rownum (index) port for a sparse array */ FST_VT_VCD_REALTIME = 20, FST_VT_GEN_STRING = 21, /* generic string type (max len is defined dynamically via fstWriterEmitVariableLengthValueChange) */ FST_VT_SV_BIT = 22, FST_VT_SV_LOGIC = 23, FST_VT_SV_INT = 24, /* declare as size = 32 */ FST_VT_SV_SHORTINT = 25, /* declare as size = 16 */ FST_VT_SV_LONGINT = 26, /* declare as size = 64 */ FST_VT_SV_BYTE = 27, /* declare as size = 8 */ FST_VT_SV_ENUM = 28, /* declare as appropriate type range */ FST_VT_SV_SHORTREAL = 29, /* declare and emit same as FST_VT_VCD_REAL (needs to be emitted as double, not a float) */ FST_VT_MAX = 29 /* end of vartypes */ }; enum fstVarDir { FST_VD_MIN = 0, FST_VD_IMPLICIT = 0, FST_VD_INPUT = 1, FST_VD_OUTPUT = 2, FST_VD_INOUT = 3, FST_VD_BUFFER = 4, FST_VD_LINKAGE = 5, FST_VD_MAX = 5 }; enum fstHierType { FST_HT_MIN = 0, FST_HT_SCOPE = 0, FST_HT_UPSCOPE = 1, FST_HT_VAR = 2, FST_HT_ATTRBEGIN = 3, FST_HT_ATTREND = 4, /* FST_HT_TREEBEGIN and FST_HT_TREEEND are not yet used by FST but are currently used when fstHier bridges other formats */ FST_HT_TREEBEGIN = 5, FST_HT_TREEEND = 6, FST_HT_MAX = 6 }; enum fstAttrType { FST_AT_MIN = 0, FST_AT_MISC = 0, /* self-contained: does not need matching FST_HT_ATTREND */ FST_AT_ARRAY = 1, FST_AT_ENUM = 2, FST_AT_PACK = 3, FST_AT_MAX = 3 }; enum fstMiscType { FST_MT_MIN = 0, FST_MT_COMMENT = 0, /* use fstWriterSetComment() to emit */ FST_MT_ENVVAR = 1, /* use fstWriterSetEnvVar() to emit */ FST_MT_SUPVAR = 2, /* use fstWriterCreateVar2() to emit */ FST_MT_PATHNAME = 3, /* reserved for fstWriterSetSourceStem() string -> number management */ FST_MT_SOURCESTEM = 4, /* use fstWriterSetSourceStem() to emit */ FST_MT_SOURCEISTEM = 5, /* use fstWriterSetSourceInstantiationStem() to emit */ FST_MT_VALUELIST = 6, /* use fstWriterSetValueList() to emit, followed by fstWriterCreateVar*() */ FST_MT_UNKNOWN = 7, FST_MT_MAX = 7 }; enum fstArrayType { FST_AR_MIN = 0, FST_AR_NONE = 0, FST_AR_UNPACKED = 1, FST_AR_PACKED = 2, FST_AR_SPARSE = 3, FST_AR_MAX = 3 }; enum fstEnumValueType { FST_EV_SV_INTEGER = 0, FST_EV_SV_BIT = 1, FST_EV_SV_LOGIC = 2, FST_EV_SV_INT = 3, FST_EV_SV_SHORTINT = 4, FST_EV_SV_LONGINT = 5, FST_EV_SV_BYTE = 6, FST_EV_SV_UNSIGNED_INTEGER = 7, FST_EV_SV_UNSIGNED_BIT = 8, FST_EV_SV_UNSIGNED_LOGIC = 9, FST_EV_SV_UNSIGNED_INT = 10, FST_EV_SV_UNSIGNED_SHORTINT = 11, FST_EV_SV_UNSIGNED_LONGINT = 12, FST_EV_SV_UNSIGNED_BYTE = 13, FST_EV_MAX = 13 }; enum fstPackType { FST_PT_NONE = 0, FST_PT_UNPACKED = 1, FST_PT_PACKED = 2, FST_PT_TAGGED_PACKED = 3, FST_PT_MAX = 3 }; enum fstSupplementalVarType { FST_SVT_MIN = 0, FST_SVT_NONE = 0, FST_SVT_VHDL_SIGNAL = 1, FST_SVT_VHDL_VARIABLE = 2, FST_SVT_VHDL_CONSTANT = 3, FST_SVT_VHDL_FILE = 4, FST_SVT_VHDL_MEMORY = 5, FST_SVT_MAX = 5 }; enum fstSupplementalDataType { FST_SDT_MIN = 0, FST_SDT_NONE = 0, FST_SDT_VHDL_BOOLEAN = 1, FST_SDT_VHDL_BIT = 2, FST_SDT_VHDL_BIT_VECTOR = 3, FST_SDT_VHDL_STD_ULOGIC = 4, FST_SDT_VHDL_STD_ULOGIC_VECTOR = 5, FST_SDT_VHDL_STD_LOGIC = 6, FST_SDT_VHDL_STD_LOGIC_VECTOR = 7, FST_SDT_VHDL_UNSIGNED = 8, FST_SDT_VHDL_SIGNED = 9, FST_SDT_VHDL_INTEGER = 10, FST_SDT_VHDL_REAL = 11, FST_SDT_VHDL_NATURAL = 12, FST_SDT_VHDL_POSITIVE = 13, FST_SDT_VHDL_TIME = 14, FST_SDT_VHDL_CHARACTER = 15, FST_SDT_VHDL_STRING = 16, FST_SDT_MAX = 16, FST_SDT_SVT_SHIFT_COUNT = 10, /* FST_SVT_* is ORed in by fstWriterCreateVar2() to the left after shifting FST_SDT_SVT_SHIFT_COUNT */ FST_SDT_ABS_MAX = ((1<<(FST_SDT_SVT_SHIFT_COUNT))-1) }; struct fstHier { unsigned char htyp; union { /* if htyp == FST_HT_SCOPE */ struct fstHierScope { unsigned char typ; /* FST_ST_MIN ... FST_ST_MAX */ const char *name; const char *component; uint32_t name_length; /* strlen(u.scope.name) */ uint32_t component_length; /* strlen(u.scope.component) */ } scope; /* if htyp == FST_HT_VAR */ struct fstHierVar { unsigned char typ; /* FST_VT_MIN ... FST_VT_MAX */ unsigned char direction; /* FST_VD_MIN ... FST_VD_MAX */ unsigned char svt_workspace; /* zeroed out by FST reader, for client code use */ unsigned char sdt_workspace; /* zeroed out by FST reader, for client code use */ unsigned int sxt_workspace; /* zeroed out by FST reader, for client code use */ const char *name; uint32_t length; fstHandle handle; uint32_t name_length; /* strlen(u.var.name) */ unsigned is_alias : 1; } var; /* if htyp == FST_HT_ATTRBEGIN */ struct fstHierAttr { unsigned char typ; /* FST_AT_MIN ... FST_AT_MAX */ unsigned char subtype; /* from fstMiscType, fstArrayType, fstEnumValueType, fstPackType */ const char *name; uint64_t arg; /* number of array elements, struct members, or some other payload (possibly ignored) */ uint64_t arg_from_name; /* for when name is overloaded as a variable-length integer (FST_AT_MISC + FST_MT_SOURCESTEM) */ uint32_t name_length; /* strlen(u.attr.name) */ } attr; } u; }; /* * writer functions */ void fstWriterClose(void *ctx); void * fstWriterCreate(const char *nam, int use_compressed_hier); /* used for Verilog/SV */ fstHandle fstWriterCreateVar(void *ctx, enum fstVarType vt, enum fstVarDir vd, uint32_t len, const char *nam, fstHandle aliasHandle); /* future expansion for VHDL and other languages. The variable type, data type, etc map onto the current Verilog/SV one. The "type" string is optional for a more verbose or custom description */ fstHandle fstWriterCreateVar2(void *ctx, enum fstVarType vt, enum fstVarDir vd, uint32_t len, const char *nam, fstHandle aliasHandle, const char *type, enum fstSupplementalVarType svt, enum fstSupplementalDataType sdt); void fstWriterEmitValueChange(void *ctx, fstHandle handle, const void *val); void fstWriterEmitVariableLengthValueChange(void *ctx, fstHandle handle, const void *val, uint32_t len); void fstWriterEmitDumpActive(void *ctx, int enable); void fstWriterEmitTimeChange(void *ctx, uint64_t tim); void fstWriterFlushContext(void *ctx); int fstWriterGetDumpSizeLimitReached(void *ctx); int fstWriterGetFseekFailed(void *ctx); void fstWriterSetAttrBegin(void *ctx, enum fstAttrType attrtype, int subtype, const char *attrname, uint64_t arg); void fstWriterSetAttrEnd(void *ctx); void fstWriterSetComment(void *ctx, const char *comm); void fstWriterSetDate(void *ctx, const char *dat); void fstWriterSetDumpSizeLimit(void *ctx, uint64_t numbytes); void fstWriterSetEnvVar(void *ctx, const char *envvar); void fstWriterSetFileType(void *ctx, enum fstFileType filetype); void fstWriterSetPackType(void *ctx, enum fstWriterPackType typ); void fstWriterSetParallelMode(void *ctx, int enable); void fstWriterSetRepackOnClose(void *ctx, int enable); /* type = 0 (none), 1 (libz) */ void fstWriterSetScope(void *ctx, enum fstScopeType scopetype, const char *scopename, const char *scopecomp); void fstWriterSetSourceInstantiationStem(void *ctx, const char *path, unsigned int line, unsigned int use_realpath); void fstWriterSetSourceStem(void *ctx, const char *path, unsigned int line, unsigned int use_realpath); void fstWriterSetTimescale(void *ctx, int ts); void fstWriterSetTimescaleFromString(void *ctx, const char *s); void fstWriterSetTimezero(void *ctx, int64_t tim); void fstWriterSetUpscope(void *ctx); void fstWriterSetValueList(void *ctx, const char *vl); void fstWriterSetVersion(void *ctx, const char *vers); /* * reader functions */ void fstReaderClose(void *ctx); void fstReaderClrFacProcessMask(void *ctx, fstHandle facidx); void fstReaderClrFacProcessMaskAll(void *ctx); uint64_t fstReaderGetAliasCount(void *ctx); const char * fstReaderGetCurrentFlatScope(void *ctx); void * fstReaderGetCurrentScopeUserInfo(void *ctx); int fstReaderGetCurrentScopeLen(void *ctx); const char * fstReaderGetDateString(void *ctx); int fstReaderGetDoubleEndianMatchState(void *ctx); uint64_t fstReaderGetDumpActivityChangeTime(void *ctx, uint32_t idx); unsigned char fstReaderGetDumpActivityChangeValue(void *ctx, uint32_t idx); uint64_t fstReaderGetEndTime(void *ctx); int fstReaderGetFacProcessMask(void *ctx, fstHandle facidx); int fstReaderGetFileType(void *ctx); int fstReaderGetFseekFailed(void *ctx); fstHandle fstReaderGetMaxHandle(void *ctx); uint64_t fstReaderGetMemoryUsedByWriter(void *ctx); uint32_t fstReaderGetNumberDumpActivityChanges(void *ctx); uint64_t fstReaderGetScopeCount(void *ctx); uint64_t fstReaderGetStartTime(void *ctx); signed char fstReaderGetTimescale(void *ctx); int64_t fstReaderGetTimezero(void *ctx); uint64_t fstReaderGetValueChangeSectionCount(void *ctx); char * fstReaderGetValueFromHandleAtTime(void *ctx, uint64_t tim, fstHandle facidx, char *buf); uint64_t fstReaderGetVarCount(void *ctx); const char * fstReaderGetVersionString(void *ctx); struct fstHier *fstReaderIterateHier(void *ctx); int fstReaderIterateHierRewind(void *ctx); int fstReaderIterBlocks(void *ctx, void (*value_change_callback)(void *user_callback_data_pointer, uint64_t time, fstHandle facidx, const unsigned char *value), void *user_callback_data_pointer, FILE *vcdhandle); int fstReaderIterBlocks2(void *ctx, void (*value_change_callback)(void *user_callback_data_pointer, uint64_t time, fstHandle facidx, const unsigned char *value), void (*value_change_callback_varlen)(void *user_callback_data_pointer, uint64_t time, fstHandle facidx, const unsigned char *value, uint32_t len), void *user_callback_data_pointer, FILE *vcdhandle); void fstReaderIterBlocksSetNativeDoublesOnCallback(void *ctx, int enable); void * fstReaderOpen(const char *nam); void * fstReaderOpenForUtilitiesOnly(void); const char * fstReaderPopScope(void *ctx); int fstReaderProcessHier(void *ctx, FILE *vcdhandle); const char * fstReaderPushScope(void *ctx, const char *nam, void *user_info); void fstReaderResetScope(void *ctx); void fstReaderSetFacProcessMask(void *ctx, fstHandle facidx); void fstReaderSetFacProcessMaskAll(void *ctx); void fstReaderSetLimitTimeRange(void *ctx, uint64_t start_time, uint64_t end_time); void fstReaderSetUnlimitedTimeRange(void *ctx); void fstReaderSetVcdExtensions(void *ctx, int enable); /* * utility functions */ int fstUtilityBinToEsc(unsigned char *d, unsigned char *s, int len); int fstUtilityEscToBin(unsigned char *d, unsigned char *s, int len); #ifdef __cplusplus } #endif #endif gtkwave-3.3.86/src/helpers/fst/lz4.h0000664000175000017500000004461613166335473016526 0ustar bybellbybell/* LZ4 - Fast LZ compression algorithm Header File Copyright (C) 2011-2015, Yann Collet. BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. You can contact the author at : - LZ4 source repository : https://github.com/Cyan4973/lz4 - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c */ #pragma once #if defined (__cplusplus) extern "C" { #endif /* * lz4.h provides block compression functions, and gives full buffer control to programmer. * If you need to generate inter-operable compressed data (respecting LZ4 frame specification), * and can let the library handle its own memory, please use lz4frame.h instead. */ /************************************** * Version **************************************/ #define LZ4_VERSION_MAJOR 1 /* for breaking interface changes */ #define LZ4_VERSION_MINOR 7 /* for new (non-breaking) interface capabilities */ #define LZ4_VERSION_RELEASE 1 /* for tweaks, bug-fixes, or development */ #define LZ4_VERSION_NUMBER (LZ4_VERSION_MAJOR *100*100 + LZ4_VERSION_MINOR *100 + LZ4_VERSION_RELEASE) int LZ4_versionNumber (void); /************************************** * Tuning parameter **************************************/ /* * LZ4_MEMORY_USAGE : * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.) * Increasing memory usage improves compression ratio * Reduced memory usage can improve speed, due to cache effect * Default value is 14, for 16KB, which nicely fits into Intel x86 L1 cache */ #define LZ4_MEMORY_USAGE 14 /************************************** * Simple Functions **************************************/ int LZ4_compress_default(const char* source, char* dest, int sourceSize, int maxDestSize); int LZ4_decompress_safe (const char* source, char* dest, int compressedSize, int maxDecompressedSize); /* LZ4_compress_default() : Compresses 'sourceSize' bytes from buffer 'source' into already allocated 'dest' buffer of size 'maxDestSize'. Compression is guaranteed to succeed if 'maxDestSize' >= LZ4_compressBound(sourceSize). It also runs faster, so it's a recommended setting. If the function cannot compress 'source' into a more limited 'dest' budget, compression stops *immediately*, and the function result is zero. As a consequence, 'dest' content is not valid. This function never writes outside 'dest' buffer, nor read outside 'source' buffer. sourceSize : Max supported value is LZ4_MAX_INPUT_VALUE maxDestSize : full or partial size of buffer 'dest' (which must be already allocated) return : the number of bytes written into buffer 'dest' (necessarily <= maxOutputSize) or 0 if compression fails LZ4_decompress_safe() : compressedSize : is the precise full size of the compressed block. maxDecompressedSize : is the size of destination buffer, which must be already allocated. return : the number of bytes decompressed into destination buffer (necessarily <= maxDecompressedSize) If destination buffer is not large enough, decoding will stop and output an error code (<0). If the source stream is detected malformed, the function will stop decoding and return a negative result. This function is protected against buffer overflow exploits, including malicious data packets. It never writes outside output buffer, nor reads outside input buffer. */ /************************************** * Advanced Functions **************************************/ #define LZ4_MAX_INPUT_SIZE 0x7E000000 /* 2 113 929 216 bytes */ #define LZ4_COMPRESSBOUND(isize) ((unsigned)(isize) > (unsigned)LZ4_MAX_INPUT_SIZE ? 0 : (isize) + ((isize)/255) + 16) /* LZ4_compressBound() : Provides the maximum size that LZ4 compression may output in a "worst case" scenario (input data not compressible) This function is primarily useful for memory allocation purposes (destination buffer size). Macro LZ4_COMPRESSBOUND() is also provided for compilation-time evaluation (stack memory allocation for example). Note that LZ4_compress_default() compress faster when dest buffer size is >= LZ4_compressBound(srcSize) inputSize : max supported value is LZ4_MAX_INPUT_SIZE return : maximum output size in a "worst case" scenario or 0, if input size is too large ( > LZ4_MAX_INPUT_SIZE) */ int LZ4_compressBound(int inputSize); /* LZ4_compress_fast() : Same as LZ4_compress_default(), but allows to select an "acceleration" factor. The larger the acceleration value, the faster the algorithm, but also the lesser the compression. It's a trade-off. It can be fine tuned, with each successive value providing roughly +~3% to speed. An acceleration value of "1" is the same as regular LZ4_compress_default() Values <= 0 will be replaced by ACCELERATION_DEFAULT (see lz4.c), which is 1. */ int LZ4_compress_fast (const char* source, char* dest, int sourceSize, int maxDestSize, int acceleration); /* LZ4_compress_fast_extState() : Same compression function, just using an externally allocated memory space to store compression state. Use LZ4_sizeofState() to know how much memory must be allocated, and allocate it on 8-bytes boundaries (using malloc() typically). Then, provide it as 'void* state' to compression function. */ int LZ4_sizeofState(void); int LZ4_compress_fast_extState (void* state, const char* source, char* dest, int inputSize, int maxDestSize, int acceleration); /* LZ4_compress_destSize() : Reverse the logic, by compressing as much data as possible from 'source' buffer into already allocated buffer 'dest' of size 'targetDestSize'. This function either compresses the entire 'source' content into 'dest' if it's large enough, or fill 'dest' buffer completely with as much data as possible from 'source'. *sourceSizePtr : will be modified to indicate how many bytes where read from 'source' to fill 'dest'. New value is necessarily <= old value. return : Nb bytes written into 'dest' (necessarily <= targetDestSize) or 0 if compression fails */ int LZ4_compress_destSize (const char* source, char* dest, int* sourceSizePtr, int targetDestSize); /* LZ4_decompress_fast() : originalSize : is the original and therefore uncompressed size return : the number of bytes read from the source buffer (in other words, the compressed size) If the source stream is detected malformed, the function will stop decoding and return a negative result. Destination buffer must be already allocated. Its size must be a minimum of 'originalSize' bytes. note : This function fully respect memory boundaries for properly formed compressed data. It is a bit faster than LZ4_decompress_safe(). However, it does not provide any protection against intentionally modified data stream (malicious input). Use this function in trusted environment only (data to decode comes from a trusted source). */ int LZ4_decompress_fast (const char* source, char* dest, int originalSize); /* LZ4_decompress_safe_partial() : This function decompress a compressed block of size 'compressedSize' at position 'source' into destination buffer 'dest' of size 'maxDecompressedSize'. The function tries to stop decompressing operation as soon as 'targetOutputSize' has been reached, reducing decompression time. return : the number of bytes decoded in the destination buffer (necessarily <= maxDecompressedSize) Note : this number can be < 'targetOutputSize' should the compressed block to decode be smaller. Always control how many bytes were decoded. If the source stream is detected malformed, the function will stop decoding and return a negative result. This function never writes outside of output buffer, and never reads outside of input buffer. It is therefore protected against malicious data packets */ int LZ4_decompress_safe_partial (const char* source, char* dest, int compressedSize, int targetOutputSize, int maxDecompressedSize); /*********************************************** * Streaming Compression Functions ***********************************************/ #define LZ4_STREAMSIZE_U64 ((1 << (LZ4_MEMORY_USAGE-3)) + 4) #define LZ4_STREAMSIZE (LZ4_STREAMSIZE_U64 * sizeof(long long)) /* * LZ4_stream_t * information structure to track an LZ4 stream. * important : init this structure content before first use ! * note : only allocated directly the structure if you are statically linking LZ4 * If you are using liblz4 as a DLL, please use below construction methods instead. */ typedef struct { long long table[LZ4_STREAMSIZE_U64]; } LZ4_stream_t; /* * LZ4_resetStream * Use this function to init an allocated LZ4_stream_t structure */ void LZ4_resetStream (LZ4_stream_t* streamPtr); /* * LZ4_createStream will allocate and initialize an LZ4_stream_t structure * LZ4_freeStream releases its memory. * In the context of a DLL (liblz4), please use these methods rather than the static struct. * They are more future proof, in case of a change of LZ4_stream_t size. */ LZ4_stream_t* LZ4_createStream(void); int LZ4_freeStream (LZ4_stream_t* streamPtr); /* * LZ4_loadDict * Use this function to load a static dictionary into LZ4_stream. * Any previous data will be forgotten, only 'dictionary' will remain in memory. * Loading a size of 0 is allowed. * Return : dictionary size, in bytes (necessarily <= 64 KB) */ int LZ4_loadDict (LZ4_stream_t* streamPtr, const char* dictionary, int dictSize); /* * LZ4_compress_fast_continue * Compress buffer content 'src', using data from previously compressed blocks as dictionary to improve compression ratio. * Important : Previous data blocks are assumed to still be present and unmodified ! * 'dst' buffer must be already allocated. * If maxDstSize >= LZ4_compressBound(srcSize), compression is guaranteed to succeed, and runs faster. * If not, and if compressed data cannot fit into 'dst' buffer size, compression stops, and function returns a zero. */ int LZ4_compress_fast_continue (LZ4_stream_t* streamPtr, const char* src, char* dst, int srcSize, int maxDstSize, int acceleration); /* * LZ4_saveDict * If previously compressed data block is not guaranteed to remain available at its memory location * save it into a safer place (char* safeBuffer) * Note : you don't need to call LZ4_loadDict() afterwards, * dictionary is immediately usable, you can therefore call LZ4_compress_fast_continue() * Return : saved dictionary size in bytes (necessarily <= dictSize), or 0 if error */ int LZ4_saveDict (LZ4_stream_t* streamPtr, char* safeBuffer, int dictSize); /************************************************ * Streaming Decompression Functions ************************************************/ #define LZ4_STREAMDECODESIZE_U64 4 #define LZ4_STREAMDECODESIZE (LZ4_STREAMDECODESIZE_U64 * sizeof(unsigned long long)) typedef struct { unsigned long long table[LZ4_STREAMDECODESIZE_U64]; } LZ4_streamDecode_t; /* * LZ4_streamDecode_t * information structure to track an LZ4 stream. * init this structure content using LZ4_setStreamDecode or memset() before first use ! * * In the context of a DLL (liblz4) please prefer usage of construction methods below. * They are more future proof, in case of a change of LZ4_streamDecode_t size in the future. * LZ4_createStreamDecode will allocate and initialize an LZ4_streamDecode_t structure * LZ4_freeStreamDecode releases its memory. */ LZ4_streamDecode_t* LZ4_createStreamDecode(void); int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream); /* * LZ4_setStreamDecode * Use this function to instruct where to find the dictionary. * Setting a size of 0 is allowed (same effect as reset). * Return : 1 if OK, 0 if error */ int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize); /* *_continue() : These decoding functions allow decompression of multiple blocks in "streaming" mode. Previously decoded blocks *must* remain available at the memory position where they were decoded (up to 64 KB) In the case of a ring buffers, decoding buffer must be either : - Exactly same size as encoding buffer, with same update rule (block boundaries at same positions) In which case, the decoding & encoding ring buffer can have any size, including very small ones ( < 64 KB). - Larger than encoding buffer, by a minimum of maxBlockSize more bytes. maxBlockSize is implementation dependent. It's the maximum size you intend to compress into a single block. In which case, encoding and decoding buffers do not need to be synchronized, and encoding ring buffer can have any size, including small ones ( < 64 KB). - _At least_ 64 KB + 8 bytes + maxBlockSize. In which case, encoding and decoding buffers do not need to be synchronized, and encoding ring buffer can have any size, including larger than decoding buffer. Whenever these conditions are not possible, save the last 64KB of decoded data into a safe buffer, and indicate where it is saved using LZ4_setStreamDecode() */ int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int compressedSize, int maxDecompressedSize); int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int originalSize); /* Advanced decoding functions : *_usingDict() : These decoding functions work the same as a combination of LZ4_setStreamDecode() followed by LZ4_decompress_x_continue() They are stand-alone. They don't need nor update an LZ4_streamDecode_t structure. */ int LZ4_decompress_safe_usingDict (const char* source, char* dest, int compressedSize, int maxDecompressedSize, const char* dictStart, int dictSize); int LZ4_decompress_fast_usingDict (const char* source, char* dest, int originalSize, const char* dictStart, int dictSize); /************************************** * Obsolete Functions **************************************/ /* Deprecate Warnings */ /* Should these warnings messages be a problem, it is generally possible to disable them, with -Wno-deprecated-declarations for gcc or _CRT_SECURE_NO_WARNINGS in Visual for example. You can also define LZ4_DEPRECATE_WARNING_DEFBLOCK. */ #ifndef LZ4_DEPRECATE_WARNING_DEFBLOCK # define LZ4_DEPRECATE_WARNING_DEFBLOCK # define LZ4_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) # if (LZ4_GCC_VERSION >= 405) || defined(__clang__) # define LZ4_DEPRECATED(message) __attribute__((deprecated(message))) # elif (LZ4_GCC_VERSION >= 301) # define LZ4_DEPRECATED(message) __attribute__((deprecated)) # elif defined(_MSC_VER) # define LZ4_DEPRECATED(message) __declspec(deprecated(message)) # else # pragma message("WARNING: You need to implement LZ4_DEPRECATED for this compiler") # define LZ4_DEPRECATED(message) # endif #endif /* LZ4_DEPRECATE_WARNING_DEFBLOCK */ /* Obsolete compression functions */ /* These functions are planned to start generate warnings by r131 approximately */ int LZ4_compress (const char* source, char* dest, int sourceSize); int LZ4_compress_limitedOutput (const char* source, char* dest, int sourceSize, int maxOutputSize); int LZ4_compress_withState (void* state, const char* source, char* dest, int inputSize); int LZ4_compress_limitedOutput_withState (void* state, const char* source, char* dest, int inputSize, int maxOutputSize); int LZ4_compress_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize); int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize, int maxOutputSize); /* Obsolete decompression functions */ /* These function names are completely deprecated and must no longer be used. They are only provided here for compatibility with older programs. - LZ4_uncompress is the same as LZ4_decompress_fast - LZ4_uncompress_unknownOutputSize is the same as LZ4_decompress_safe These function prototypes are now disabled; uncomment them only if you really need them. It is highly recommended to stop using these prototypes and migrate to maintained ones */ /* int LZ4_uncompress (const char* source, char* dest, int outputSize); */ /* int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize); */ /* Obsolete streaming functions; use new streaming interface whenever possible */ LZ4_DEPRECATED("use LZ4_createStream() instead") void* LZ4_create (char* inputBuffer); LZ4_DEPRECATED("use LZ4_createStream() instead") int LZ4_sizeofStreamState(void); LZ4_DEPRECATED("use LZ4_resetStream() instead") int LZ4_resetStreamState(void* state, char* inputBuffer); LZ4_DEPRECATED("use LZ4_saveDict() instead") char* LZ4_slideInputBuffer (void* state); /* Obsolete streaming decoding functions */ LZ4_DEPRECATED("use LZ4_decompress_safe_usingDict() instead") int LZ4_decompress_safe_withPrefix64k (const char* src, char* dst, int compressedSize, int maxDstSize); LZ4_DEPRECATED("use LZ4_decompress_fast_usingDict() instead") int LZ4_decompress_fast_withPrefix64k (const char* src, char* dst, int originalSize); #if defined (__cplusplus) } #endif gtkwave-3.3.86/src/helpers/fst/block_format.txt0000664000175000017500000000625013166335473021037 0ustar bybellbybellSee fstapi.h for the values for the FST_BL_XXX enums. =========================================================================== compressed wrapper (typically over whole file) uint8_t FST_BL_ZWRAPPER uint64_t section length uint64_t length of uncompressed data [zlib compressed data] =========================================================================== header block uint8_t FST_BL_HDR uint64_t section length uint64_t start time uint64_t end time double endian test for "e" uint64_t memory used by writer uint64_t scope creation count uint64_t var creation count uint64_t max var idcode uint64_t vc section count int8_t timescale exponent [128 bytes] version [128 bytes] date =========================================================================== geometry block uint8_t FST_BL_GEOM uint64_t section length uint64_t length of uncompressed geometry data uint64_t maxhandle [compressed data] (length of compressed data is section length - 24) =========================================================================== hierarchy block uint8_t FST_BL_HIER uint64_t section length uint64_t length of uncompressed hier data [zlib compressed data] or uint8_t FST_BL_HIER_LZ4 uint64_t section length uint64_t length of uncompressed hier data [lz4 compressed data] uint8_t FST_BL_HIER_LZ4DUO uint64_t section length uint64_t length of uncompressed hier data varint length of hier data compressed once with lz4 [lz4 double compressed data] =========================================================================== dumpon/off block uint8_t FST_BL_BLACKOUT uint64_t section length varint num blackouts (section below is repeated this # times) [ uint8_t on/off (nonzero = on) varint delta time ] =========================================================================== 1..n value change blocks: // header uint8_t FST_BL_VCDATA (or FST_BL_VCDATA_DYN_ALIAS) uint64_t section length uint64_t begin time of section uint64_t end time of section uint64_t amount of buffer memory required in reader for full vc traversal varint maxvalpos (length of uncompressed data) varint length of compressed data varint maxhandle associated with this checkpoint data [compressed data] --- // value changes varint maxhandle associated with the value change data uint8_t pack type ('F' is fastlz, '4' is lz4, others ['Z'/'!'] are zlib) varint chain 0 compressed data length (0 = uncompressed) [compressed data] ... varint chain n compressed data length (0 = uncompressed) [compressed data] --- // index: chain pointer table (from 0..maxhandle-1) varint if &1 == 1, this is <<1 literal delta if &1 == 0, this is <<1 RLE count of zeros if == 0, next varint is handle of prev chain to use, bit only if FST_BL_VCDATA_DYN_ALIAS or later VCDATA format --- uint64_t index length (subtract from here to get index position) --- [compressed data for time section] uint64_t uncompressed data length in bytes uint64_t compressed data length in bytes uint64_t number of time items // end of section =========================================================================== gtkwave-3.3.86/src/helpers/fst/Makefile.in0000664000175000017500000004220713166335473017703 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = src/helpers/fst DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libfst_a_AR = $(AR) $(ARFLAGS) libfst_a_LIBADD = am_libfst_a_OBJECTS = fastlz.$(OBJEXT) lz4.$(OBJEXT) fstapi.$(OBJEXT) libfst_a_OBJECTS = $(am_libfst_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libfst_a_SOURCES) DIST_SOURCES = $(libfst_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CFLAGS = $(LIBZ_CFLAGS) $(LIBJUDY_CFLAGS) noinst_LIBRARIES = libfst.a libfst_a_SOURCES = fastlz.c fastlz.h lz4.c lz4.h fstapi.c fstapi.h EXTRA_DIST = block_format.txt all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/helpers/fst/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/helpers/fst/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libfst.a: $(libfst_a_OBJECTS) $(libfst_a_DEPENDENCIES) $(EXTRA_libfst_a_DEPENDENCIES) $(AM_V_at)-rm -f libfst.a $(AM_V_AR)$(libfst_a_AR) libfst.a $(libfst_a_OBJECTS) $(libfst_a_LIBADD) $(AM_V_at)$(RANLIB) libfst.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fastlz.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fstapi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lz4.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/src/helpers/fst/fastlz.c0000664000175000017500000003233113166335473017302 0ustar bybellbybell/* FastLZ - lightning-fast lossless compression library Copyright (C) 2007 Ariya Hidayat (ariya@kde.org) Copyright (C) 2006 Ariya Hidayat (ariya@kde.org) Copyright (C) 2005 Ariya Hidayat (ariya@kde.org) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "fastlz.h" #if !defined(FASTLZ__COMPRESSOR) && !defined(FASTLZ_DECOMPRESSOR) /* * Always check for bound when decompressing. * Generally it is best to leave it defined. */ #define FASTLZ_SAFE /* * Give hints to the compiler for branch prediction optimization. */ #if defined(__GNUC__) && (__GNUC__ > 2) #define FASTLZ_EXPECT_CONDITIONAL(c) (__builtin_expect((c), 1)) #define FASTLZ_UNEXPECT_CONDITIONAL(c) (__builtin_expect((c), 0)) #else #define FASTLZ_EXPECT_CONDITIONAL(c) (c) #define FASTLZ_UNEXPECT_CONDITIONAL(c) (c) #endif /* * Use inlined functions for supported systems. */ #if defined(__GNUC__) || defined(__DMC__) || defined(__POCC__) || defined(__WATCOMC__) || defined(__SUNPRO_C) #define FASTLZ_INLINE inline #elif defined(__BORLANDC__) || defined(_MSC_VER) || defined(__LCC__) #define FASTLZ_INLINE __inline #else #define FASTLZ_INLINE #endif /* * Prevent accessing more than 8-bit at once, except on x86 architectures. */ #if !defined(FASTLZ_STRICT_ALIGN) #define FASTLZ_STRICT_ALIGN #if defined(__i386__) || defined(__386) /* GNU C, Sun Studio */ #undef FASTLZ_STRICT_ALIGN #elif defined(__i486__) || defined(__i586__) || defined(__i686__) || defined(__amd64) /* GNU C */ #undef FASTLZ_STRICT_ALIGN #elif defined(_M_IX86) /* Intel, MSVC */ #undef FASTLZ_STRICT_ALIGN #elif defined(__386) #undef FASTLZ_STRICT_ALIGN #elif defined(_X86_) /* MinGW */ #undef FASTLZ_STRICT_ALIGN #elif defined(__I86__) /* Digital Mars */ #undef FASTLZ_STRICT_ALIGN #endif #endif /* prototypes */ int fastlz_compress(const void* input, int length, void* output); int fastlz_compress_level(int level, const void* input, int length, void* output); int fastlz_decompress(const void* input, int length, void* output, int maxout); #define MAX_COPY 32 #define MAX_LEN 264 /* 256 + 8 */ #define MAX_DISTANCE 8192 #if !defined(FASTLZ_STRICT_ALIGN) #define FASTLZ_READU16(p) *((const flzuint16*)(p)) #else #define FASTLZ_READU16(p) ((p)[0] | (p)[1]<<8) #endif #define HASH_LOG 13 #define HASH_SIZE (1<< HASH_LOG) #define HASH_MASK (HASH_SIZE-1) #define HASH_FUNCTION(v,p) { v = FASTLZ_READU16(p); v ^= FASTLZ_READU16(p+1)^(v>>(16-HASH_LOG));v &= HASH_MASK; } #undef FASTLZ_LEVEL #define FASTLZ_LEVEL 1 #undef FASTLZ_COMPRESSOR #undef FASTLZ_DECOMPRESSOR #define FASTLZ_COMPRESSOR fastlz1_compress #define FASTLZ_DECOMPRESSOR fastlz1_decompress static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void* output); static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void* input, int length, void* output, int maxout); #include "fastlz.c" #undef FASTLZ_LEVEL #define FASTLZ_LEVEL 2 #undef MAX_DISTANCE #define MAX_DISTANCE 8191 #define MAX_FARDISTANCE (65535+MAX_DISTANCE-1) #undef FASTLZ_COMPRESSOR #undef FASTLZ_DECOMPRESSOR #define FASTLZ_COMPRESSOR fastlz2_compress #define FASTLZ_DECOMPRESSOR fastlz2_decompress static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void* output); static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void* input, int length, void* output, int maxout); #include "fastlz.c" int fastlz_compress(const void* input, int length, void* output) { /* for short block, choose fastlz1 */ if(length < 65536) return fastlz1_compress(input, length, output); /* else... */ return fastlz2_compress(input, length, output); } int fastlz_decompress(const void* input, int length, void* output, int maxout) { /* magic identifier for compression level */ int level = ((*(const flzuint8*)input) >> 5) + 1; if(level == 1) return fastlz1_decompress(input, length, output, maxout); if(level == 2) return fastlz2_decompress(input, length, output, maxout); /* unknown level, trigger error */ return 0; } int fastlz_compress_level(int level, const void* input, int length, void* output) { if(level == 1) return fastlz1_compress(input, length, output); if(level == 2) return fastlz2_compress(input, length, output); return 0; } #else /* !defined(FASTLZ_COMPRESSOR) && !defined(FASTLZ_DECOMPRESSOR) */ static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void* output) { const flzuint8* ip = (const flzuint8*) input; const flzuint8* ip_bound = ip + length - 2; const flzuint8* ip_limit = ip + length - 12; flzuint8* op = (flzuint8*) output; const flzuint8* htab[HASH_SIZE]; const flzuint8** hslot; flzuint32 hval; flzuint32 copy; /* sanity check */ if(FASTLZ_UNEXPECT_CONDITIONAL(length < 4)) { if(length) { /* create literal copy only */ *op++ = length-1; ip_bound++; while(ip <= ip_bound) *op++ = *ip++; return length+1; } else return 0; } /* initializes hash table */ for (hslot = htab; hslot < htab + HASH_SIZE; hslot++) *hslot = ip; /* we start with literal copy */ copy = 2; *op++ = MAX_COPY-1; *op++ = *ip++; *op++ = *ip++; /* main loop */ while(FASTLZ_EXPECT_CONDITIONAL(ip < ip_limit)) { const flzuint8* ref; flzuint32 distance; /* minimum match length */ flzuint32 len = 3; /* comparison starting-point */ const flzuint8* anchor = ip; /* check for a run */ #if FASTLZ_LEVEL==2 if(ip[0] == ip[-1] && FASTLZ_READU16(ip-1)==FASTLZ_READU16(ip+1)) { distance = 1; /* ip += 3; */ /* scan-build, never used */ ref = anchor - 1 + 3; goto match; } #endif /* find potential match */ HASH_FUNCTION(hval,ip); hslot = htab + hval; ref = htab[hval]; /* calculate distance to the match */ distance = anchor - ref; /* update hash table */ *hslot = anchor; /* is this a match? check the first 3 bytes */ if(distance==0 || #if FASTLZ_LEVEL==1 (distance >= MAX_DISTANCE) || #else (distance >= MAX_FARDISTANCE) || #endif *ref++ != *ip++ || *ref++!=*ip++ || *ref++!=*ip++) goto literal; #if FASTLZ_LEVEL==2 /* far, needs at least 5-byte match */ if(distance >= MAX_DISTANCE) { if(*ip++ != *ref++ || *ip++!= *ref++) goto literal; len += 2; } match: #endif /* last matched byte */ ip = anchor + len; /* distance is biased */ distance--; if(!distance) { /* zero distance means a run */ flzuint8 x = ip[-1]; while(ip < ip_bound) if(*ref++ != x) break; else ip++; } else for(;;) { /* safe because the outer check against ip limit */ if(*ref++ != *ip++) break; if(*ref++ != *ip++) break; if(*ref++ != *ip++) break; if(*ref++ != *ip++) break; if(*ref++ != *ip++) break; if(*ref++ != *ip++) break; if(*ref++ != *ip++) break; if(*ref++ != *ip++) break; while(ip < ip_bound) if(*ref++ != *ip++) break; break; } /* if we have copied something, adjust the copy count */ if(copy) /* copy is biased, '0' means 1 byte copy */ *(op-copy-1) = copy-1; else /* back, to overwrite the copy count */ op--; /* reset literal counter */ copy = 0; /* length is biased, '1' means a match of 3 bytes */ ip -= 3; len = ip - anchor; /* encode the match */ #if FASTLZ_LEVEL==2 if(distance < MAX_DISTANCE) { if(len < 7) { *op++ = (len << 5) + (distance >> 8); *op++ = (distance & 255); } else { *op++ = (7 << 5) + (distance >> 8); for(len-=7; len >= 255; len-= 255) *op++ = 255; *op++ = len; *op++ = (distance & 255); } } else { /* far away, but not yet in the another galaxy... */ if(len < 7) { distance -= MAX_DISTANCE; *op++ = (len << 5) + 31; *op++ = 255; *op++ = distance >> 8; *op++ = distance & 255; } else { distance -= MAX_DISTANCE; *op++ = (7 << 5) + 31; for(len-=7; len >= 255; len-= 255) *op++ = 255; *op++ = len; *op++ = 255; *op++ = distance >> 8; *op++ = distance & 255; } } #else if(FASTLZ_UNEXPECT_CONDITIONAL(len > MAX_LEN-2)) while(len > MAX_LEN-2) { *op++ = (7 << 5) + (distance >> 8); *op++ = MAX_LEN - 2 - 7 -2; *op++ = (distance & 255); len -= MAX_LEN-2; } if(len < 7) { *op++ = (len << 5) + (distance >> 8); *op++ = (distance & 255); } else { *op++ = (7 << 5) + (distance >> 8); *op++ = len - 7; *op++ = (distance & 255); } #endif /* update the hash at match boundary */ HASH_FUNCTION(hval,ip); htab[hval] = ip++; HASH_FUNCTION(hval,ip); htab[hval] = ip++; /* assuming literal copy */ *op++ = MAX_COPY-1; continue; literal: *op++ = *anchor++; ip = anchor; copy++; if(FASTLZ_UNEXPECT_CONDITIONAL(copy == MAX_COPY)) { copy = 0; *op++ = MAX_COPY-1; } } /* left-over as literal copy */ ip_bound++; while(ip <= ip_bound) { *op++ = *ip++; copy++; if(copy == MAX_COPY) { copy = 0; *op++ = MAX_COPY-1; } } /* if we have copied something, adjust the copy length */ if(copy) *(op-copy-1) = copy-1; else op--; #if FASTLZ_LEVEL==2 /* marker for fastlz2 */ *(flzuint8*)output |= (1 << 5); #endif return op - (flzuint8*)output; } static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void* input, int length, void* output, int maxout) { const flzuint8* ip = (const flzuint8*) input; const flzuint8* ip_limit = ip + length; flzuint8* op = (flzuint8*) output; flzuint8* op_limit = op + maxout; flzuint32 ctrl = (*ip++) & 31; int loop = 1; do { const flzuint8* ref = op; flzuint32 len = ctrl >> 5; flzuint32 ofs = (ctrl & 31) << 8; if(ctrl >= 32) { #if FASTLZ_LEVEL==2 flzuint8 code; #endif len--; ref -= ofs; if (len == 7-1) #if FASTLZ_LEVEL==1 len += *ip++; ref -= *ip++; #else do { code = *ip++; len += code; } while (code==255); code = *ip++; ref -= code; /* match from 16-bit distance */ if(FASTLZ_UNEXPECT_CONDITIONAL(code==255)) if(FASTLZ_EXPECT_CONDITIONAL(ofs==(31 << 8))) { ofs = (*ip++) << 8; ofs += *ip++; ref = op - ofs - MAX_DISTANCE; } #endif #ifdef FASTLZ_SAFE if (FASTLZ_UNEXPECT_CONDITIONAL(op + len + 3 > op_limit)) return 0; if (FASTLZ_UNEXPECT_CONDITIONAL(ref-1 < (flzuint8 *)output)) return 0; #endif if(FASTLZ_EXPECT_CONDITIONAL(ip < ip_limit)) ctrl = *ip++; else loop = 0; if(ref == op) { /* optimize copy for a run */ flzuint8 b = ref[-1]; *op++ = b; *op++ = b; *op++ = b; for(; len; --len) *op++ = b; } else { #if !defined(FASTLZ_STRICT_ALIGN) const flzuint16* p; flzuint16* q; #endif /* copy from reference */ ref--; *op++ = *ref++; *op++ = *ref++; *op++ = *ref++; #if !defined(FASTLZ_STRICT_ALIGN) /* copy a byte, so that now it's word aligned */ if(len & 1) { *op++ = *ref++; len--; } /* copy 16-bit at once */ q = (flzuint16*) op; op += len; p = (const flzuint16*) ref; for(len>>=1; len > 4; len-=4) { *q++ = *p++; *q++ = *p++; *q++ = *p++; *q++ = *p++; } for(; len; --len) *q++ = *p++; #else for(; len; --len) *op++ = *ref++; #endif } } else { ctrl++; #ifdef FASTLZ_SAFE if (FASTLZ_UNEXPECT_CONDITIONAL(op + ctrl > op_limit)) return 0; if (FASTLZ_UNEXPECT_CONDITIONAL(ip + ctrl > ip_limit)) return 0; #endif *op++ = *ip++; for(--ctrl; ctrl; ctrl--) *op++ = *ip++; loop = FASTLZ_EXPECT_CONDITIONAL(ip < ip_limit); if(loop) ctrl = *ip++; } } while(FASTLZ_EXPECT_CONDITIONAL(loop)); return op - (flzuint8*)output; } #endif /* !defined(FASTLZ_COMPRESSOR) && !defined(FASTLZ_DECOMPRESSOR) */ gtkwave-3.3.86/src/helpers/fst/fstapi.c0000664000175000017500000071571313166335473017301 0ustar bybellbybell/* * Copyright (c) 2009-2015 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ /* * possible disables: * * FST_DYNAMIC_ALIAS_DISABLE : dynamic aliases are not processed * FST_DYNAMIC_ALIAS2_DISABLE : new encoding for dynamic aliases is not generated * FST_WRITEX_DISABLE : fast write I/O routines are disabled * * possible enables: * * FST_DEBUG : not for production use, only enable for development * FST_REMOVE_DUPLICATE_VC : glitch removal (has writer performance impact) * HAVE_LIBPTHREAD -> FST_WRITER_PARALLEL : enables inclusion of parallel writer code * FST_DO_MISALIGNED_OPS (defined automatically for x86 and some others) : CPU architecture can handle misaligned loads/stores * _WAVE_HAVE_JUDY : use Judy arrays instead of Jenkins (undefine if LGPL is not acceptable) * */ #include #include "fstapi.h" #include "fastlz.h" #include "lz4.h" #ifndef HAVE_LIBPTHREAD #undef FST_WRITER_PARALLEL #endif #ifdef FST_WRITER_PARALLEL #include #endif #ifdef __MINGW32__ #include #endif #ifdef HAVE_ALLOCA_H #include #elif defined(__GNUC__) #ifndef __MINGW32__ #ifndef alloca #define alloca __builtin_alloca #endif #else #include #endif #elif defined(_MSC_VER) #include #define alloca _alloca #endif #ifndef PATH_MAX #define PATH_MAX (4096) #endif /* note that Judy versus Jenkins requires more experimentation: they are */ /* functionally equivalent though it appears Jenkins is slightly faster. */ /* in addition, Jenkins is not bound by the LGPL. */ #ifdef _WAVE_HAVE_JUDY #include #else /* should be more than enough for fstWriterSetSourceStem() */ #define FST_PATH_HASHMASK ((1UL << 16) - 1) typedef const void *Pcvoid_t; typedef void *Pvoid_t; typedef void **PPvoid_t; #define JudyHSIns(a,b,c,d) JenkinsIns((a),(b),(c),(hashmask)) #define JudyHSFreeArray(a,b) JenkinsFree((a),(hashmask)) void JenkinsFree(void *base_i, uint32_t hashmask); void **JenkinsIns(void *base_i, const unsigned char *mem, uint32_t length, uint32_t hashmask); #endif #ifndef FST_WRITEX_DISABLE #define FST_WRITEX_MAX (64 * 1024) #else #define fstWritex(a,b,c) fstFwrite((b), (c), 1, fv) #endif /* these defines have a large impact on writer speed when a model has a */ /* huge number of symbols. as a default, use 128MB and increment when */ /* every 1M signals are defined. */ #define FST_BREAK_SIZE (1UL << 27) #define FST_BREAK_ADD_SIZE (1UL << 22) #define FST_BREAK_SIZE_MAX (1UL << 31) #define FST_ACTIVATE_HUGE_BREAK (1000000) #define FST_ACTIVATE_HUGE_INC (1000000) #define FST_WRITER_STR "fstWriter" #define FST_ID_NAM_SIZ (512) #define FST_ID_NAM_ATTR_SIZ (65536+4096) #define FST_DOUBLE_ENDTEST (2.7182818284590452354) #define FST_HDR_SIM_VERSION_SIZE (128) #define FST_HDR_DATE_SIZE (119) #define FST_HDR_FILETYPE_SIZE (1) #define FST_HDR_TIMEZERO_SIZE (8) #define FST_GZIO_LEN (32768) #define FST_HDR_FOURPACK_DUO_SIZE (4*1024*1024) #if defined(__i386__) || defined(__x86_64__) || defined(_AIX) #define FST_DO_MISALIGNED_OPS #endif #if defined(__APPLE__) && defined(__MACH__) #define FST_MACOSX #include #endif /***********************/ /*** ***/ /*** common function ***/ /*** ***/ /***********************/ #ifdef __MINGW32__ #include #ifndef HAVE_FSEEKO #define ftello ftell #define fseeko fseek #endif #endif /* * the recoded "extra" values... * note that FST_RCV_Q is currently unused and is for future expansion. * its intended use is as another level of escape such that any arbitrary * value can be stored as the value: { time_delta, 8 bits, FST_RCV_Q }. * this is currently not implemented so that the branchless decode is: * uint32_t shcnt = 2 << (vli & 1); tdelta = vli >> shcnt; */ #define FST_RCV_X (1 | (0<<1)) #define FST_RCV_Z (1 | (1<<1)) #define FST_RCV_H (1 | (2<<1)) #define FST_RCV_U (1 | (3<<1)) #define FST_RCV_W (1 | (4<<1)) #define FST_RCV_L (1 | (5<<1)) #define FST_RCV_D (1 | (6<<1)) #define FST_RCV_Q (1 | (7<<1)) #define FST_RCV_STR "xzhuwl-?" /* 01234567 */ /* * prevent old file overwrite when currently being read */ static FILE *unlink_fopen(const char *nam, const char *mode) { unlink(nam); return(fopen(nam, mode)); } /* * system-specific temp file handling */ #ifdef __MINGW32__ static FILE* tmpfile_open(char **nam) { char *fname = NULL; TCHAR szTempFileName[MAX_PATH]; TCHAR lpTempPathBuffer[MAX_PATH]; DWORD dwRetVal = 0; UINT uRetVal = 0; FILE *fh = NULL; if(nam) /* cppcheck warning fix: nam is always defined, so this is not needed */ { dwRetVal = GetTempPath(MAX_PATH, lpTempPathBuffer); if((dwRetVal > MAX_PATH) || (dwRetVal == 0)) { fprintf(stderr, "GetTempPath() failed in "__FILE__" line %d, exiting.\n", __LINE__); exit(255); } else { uRetVal = GetTempFileName(lpTempPathBuffer, TEXT("FSTW"), 0, szTempFileName); if (uRetVal == 0) { fprintf(stderr, "GetTempFileName() failed in "__FILE__" line %d, exiting.\n", __LINE__); exit(255); } else { fname = strdup(szTempFileName); } } if(fname) { *nam = fname; fh = unlink_fopen(fname, "w+b"); } } return(fh); } #else static FILE* tmpfile_open(char **nam) { FILE *f = tmpfile(); /* replace with mkstemp() + fopen(), etc if this is not good enough */ if(nam) { *nam = NULL; } return(f); } #endif static void tmpfile_close(FILE **f, char **nam) { if(f) { if(*f) { fclose(*f); *f = NULL; } } if(nam) { if(*nam) { unlink(*nam); free(*nam); *nam = NULL; } } } /*****************************************/ /* * to remove warn_unused_result compile time messages * (in the future there needs to be results checking) */ static size_t fstFread(void *buf, size_t siz, size_t cnt, FILE *fp) { return(fread(buf, siz, cnt, fp)); } static size_t fstFwrite(const void *buf, size_t siz, size_t cnt, FILE *fp) { return(fwrite(buf, siz, cnt, fp)); } static int fstFtruncate(int fd, off_t length) { return(ftruncate(fd, length)); } /* * realpath compatibility */ static char *fstRealpath(const char *path, char *resolved_path) { #if defined __USE_BSD || defined __USE_XOPEN_EXTENDED || defined __CYGWIN__ || defined HAVE_REALPATH #if (defined(__MACH__) && defined(__APPLE__)) if(!resolved_path) { resolved_path = malloc(PATH_MAX+1); /* fixes bug on Leopard when resolved_path == NULL */ } #endif return(realpath(path, resolved_path)); #else #ifdef __MINGW32__ if(!resolved_path) { resolved_path = malloc(PATH_MAX+1); } return(_fullpath(resolved_path, path, PATH_MAX)); #else (void)path; (void)resolved_path; return(NULL); #endif #endif } /* * mmap compatibility */ #if defined __CYGWIN__ || defined __MINGW32__ #include #define fstMmap(__addr,__len,__prot,__flags,__fd,__off) fstMmap2((__len), (__fd), (__off)) #define fstMunmap(__addr,__len) free(__addr) static void *fstMmap2(size_t __len, int __fd, off_t __off) { (void)__off; unsigned char *pnt = malloc(__len); off_t cur_offs = lseek(__fd, 0, SEEK_CUR); size_t i; lseek(__fd, 0, SEEK_SET); for(i=0;i<__len;i+=SSIZE_MAX) { read(__fd, pnt + i, ((__len - i) >= SSIZE_MAX) ? SSIZE_MAX : (__len - i)); } lseek(__fd, cur_offs, SEEK_SET); return(pnt); } #else #include #if defined(__SUNPRO_C) #define FST_CADDR_T_CAST (caddr_t) #else #define FST_CADDR_T_CAST #endif #define fstMmap(__addr,__len,__prot,__flags,__fd,__off) (void*)mmap(FST_CADDR_T_CAST (__addr),(__len),(__prot),(__flags),(__fd),(__off)) #define fstMunmap(__addr,__len) { if(__addr) munmap(FST_CADDR_T_CAST (__addr),(__len)); } #endif /* * regular and variable-length integer access functions */ #ifdef FST_DO_MISALIGNED_OPS #define fstGetUint32(x) (*(uint32_t *)(x)) #else static uint32_t fstGetUint32(unsigned char *mem) { uint32_t u32; unsigned char *buf = (unsigned char *)(&u32); buf[0] = mem[0]; buf[1] = mem[1]; buf[2] = mem[2]; buf[3] = mem[3]; return(*(uint32_t *)buf); } #endif static int fstWriterUint64(FILE *handle, uint64_t v) { unsigned char buf[8]; int i; for(i=7;i>=0;i--) { buf[i] = v & 0xff; v >>= 8; } fstFwrite(buf, 8, 1, handle); return(8); } static uint64_t fstReaderUint64(FILE *f) { uint64_t val = 0; unsigned char buf[sizeof(uint64_t)]; unsigned int i; fstFread(buf, sizeof(uint64_t), 1, f); for(i=0;i>7)) /* determine len to avoid temp buffer copying to cut down on load-hit-store */ { cnt++; } pnt -= cnt; spnt = pnt; cnt--; for(i=0;i>7; *(spnt++) = ((unsigned char)v) | 0x80; v = nxt; } *spnt = (unsigned char)v; return(pnt); } static unsigned char *fstCopyVarint64ToRight(unsigned char *pnt, uint64_t v) { uint64_t nxt; while((nxt = v>>7)) { *(pnt++) = ((unsigned char)v) | 0x80; v = nxt; } *(pnt++) = (unsigned char)v; return(pnt); } static uint64_t fstGetVarint64(unsigned char *mem, int *skiplen) { unsigned char *mem_orig = mem; uint64_t rc = 0; while(*mem & 0x80) { mem++; } *skiplen = mem - mem_orig + 1; for(;;) { rc <<= 7; rc |= (uint64_t)(*mem & 0x7f); if(mem == mem_orig) { break; } mem--; } return(rc); } static uint32_t fstReaderVarint32(FILE *f) { unsigned char buf[5]; unsigned char *mem = buf; uint32_t rc = 0; int ch; do { ch = fgetc(f); *(mem++) = ch; } while(ch & 0x80); mem--; for(;;) { rc <<= 7; rc |= (uint32_t)(*mem & 0x7f); if(mem == buf) { break; } mem--; } return(rc); } static uint32_t fstReaderVarint32WithSkip(FILE *f, uint32_t *skiplen) { unsigned char buf[5]; unsigned char *mem = buf; uint32_t rc = 0; int ch; do { ch = fgetc(f); *(mem++) = ch; } while(ch & 0x80); *skiplen = mem - buf; mem--; for(;;) { rc <<= 7; rc |= (uint32_t)(*mem & 0x7f); if(mem == buf) { break; } mem--; } return(rc); } static uint64_t fstReaderVarint64(FILE *f) { unsigned char buf[16]; unsigned char *mem = buf; uint64_t rc = 0; int ch; do { ch = fgetc(f); *(mem++) = ch; } while(ch & 0x80); mem--; for(;;) { rc <<= 7; rc |= (uint64_t)(*mem & 0x7f); if(mem == buf) { break; } mem--; } return(rc); } static int fstWriterVarint(FILE *handle, uint64_t v) { uint64_t nxt; unsigned char buf[10]; /* ceil(64/7) = 10 */ unsigned char *pnt = buf; int len; while((nxt = v>>7)) { *(pnt++) = ((unsigned char)v) | 0x80; v = nxt; } *(pnt++) = (unsigned char)v; len = pnt-buf; fstFwrite(buf, len, 1, handle); return(len); } /* signed integer read/write routines are currently unused */ static int64_t fstGetSVarint64(unsigned char *mem, int *skiplen) { unsigned char *mem_orig = mem; int64_t rc = 0; const int64_t one = 1; const int siz = sizeof(int64_t) * 8; int shift = 0; unsigned char byt; do { byt = *(mem++); rc |= ((int64_t)(byt & 0x7f)) << shift; shift += 7; } while(byt & 0x80); if((shift>= 7; if (((!v) && (!(byt & 0x40))) || ((v == -1) && (byt & 0x40))) { more = 0; byt &= 0x7f; } *(pnt++) = byt; } while(more); len = pnt-buf; fstFwrite(buf, len, 1, handle); return(len); } /***********************/ /*** ***/ /*** writer function ***/ /*** ***/ /***********************/ /* * private structs */ struct fstBlackoutChain { struct fstBlackoutChain *next; uint64_t tim; unsigned active : 1; }; struct fstWriterContext { FILE *handle; FILE *hier_handle; FILE *geom_handle; FILE *valpos_handle; FILE *curval_handle; FILE *tchn_handle; unsigned char *vchg_mem; off_t hier_file_len; uint32_t *valpos_mem; unsigned char *curval_mem; char *filename; fstHandle maxhandle; fstHandle numsigs; uint32_t maxvalpos; unsigned vc_emitted : 1; unsigned is_initial_time : 1; unsigned fourpack : 1; unsigned fastpack : 1; int64_t timezero; off_t section_header_truncpos; uint32_t tchn_cnt, tchn_idx; uint64_t curtime; uint64_t firsttime; uint32_t vchg_siz; uint32_t vchg_alloc_siz; uint32_t secnum; off_t section_start; uint32_t numscopes; double nan; /* nan value for uninitialized doubles */ struct fstBlackoutChain *blackout_head; struct fstBlackoutChain *blackout_curr; uint32_t num_blackouts; uint64_t dump_size_limit; unsigned char filetype; /* default is 0, FST_FT_VERILOG */ unsigned compress_hier : 1; unsigned repack_on_close : 1; unsigned skip_writing_section_hdr : 1; unsigned size_limit_locked : 1; unsigned section_header_only : 1; unsigned flush_context_pending : 1; unsigned parallel_enabled : 1; unsigned parallel_was_enabled : 1; /* should really be semaphores, but are bytes to cut down on read-modify-write window size */ unsigned char already_in_flush; /* in case control-c handlers interrupt */ unsigned char already_in_close; /* in case control-c handlers interrupt */ #ifdef FST_WRITER_PARALLEL pthread_mutex_t mutex; pthread_t thread; pthread_attr_t thread_attr; struct fstWriterContext *xc_parent; #endif size_t fst_orig_break_size; size_t fst_orig_break_add_size; size_t fst_break_size; size_t fst_break_add_size; size_t fst_huge_break_size; fstHandle next_huge_break; Pvoid_t path_array; uint32_t path_array_count; unsigned fseek_failed : 1; char *geom_handle_nam; char *valpos_handle_nam; char *curval_handle_nam; char *tchn_handle_nam; }; static int fstWriterFseeko(struct fstWriterContext *xc, FILE *stream, off_t offset, int whence) { int rc = fseeko(stream, offset, whence); if(rc<0) { xc->fseek_failed = 1; #ifdef FST_DEBUG fprintf(stderr, "Seek to #%"PRId64" (whence = %d) failed!\n", offset, whence); perror("Why"); #endif } return(rc); } static uint32_t fstWriterUint32WithVarint32(struct fstWriterContext *xc, uint32_t *u, uint32_t v, const void *dbuf, uint32_t siz) { unsigned char *buf = xc->vchg_mem + xc->vchg_siz; unsigned char *pnt = buf; uint32_t nxt; uint32_t len; #ifdef FST_DO_MISALIGNED_OPS (*(uint32_t *)(pnt)) = (*(uint32_t *)(u)); #else memcpy(pnt, u, sizeof(uint32_t)); #endif pnt += 4; while((nxt = v>>7)) { *(pnt++) = ((unsigned char)v) | 0x80; v = nxt; } *(pnt++) = (unsigned char)v; memcpy(pnt, dbuf, siz); len = pnt-buf + siz; return(len); } static uint32_t fstWriterUint32WithVarint32AndLength(struct fstWriterContext *xc, uint32_t *u, uint32_t v, const void *dbuf, uint32_t siz) { unsigned char *buf = xc->vchg_mem + xc->vchg_siz; unsigned char *pnt = buf; uint32_t nxt; uint32_t len; #ifdef FST_DO_MISALIGNED_OPS (*(uint32_t *)(pnt)) = (*(uint32_t *)(u)); #else memcpy(pnt, u, sizeof(uint32_t)); #endif pnt += 4; while((nxt = v>>7)) { *(pnt++) = ((unsigned char)v) | 0x80; v = nxt; } *(pnt++) = (unsigned char)v; v = siz; while((nxt = v>>7)) { *(pnt++) = ((unsigned char)v) | 0x80; v = nxt; } *(pnt++) = (unsigned char)v; memcpy(pnt, dbuf, siz); len = pnt-buf + siz; return(len); } /* * header bytes, write here so defines are set up before anything else * that needs to use them */ static void fstWriterEmitHdrBytes(struct fstWriterContext *xc) { char vbuf[FST_HDR_SIM_VERSION_SIZE]; char dbuf[FST_HDR_DATE_SIZE]; double endtest = FST_DOUBLE_ENDTEST; time_t walltime; #define FST_HDR_OFFS_TAG (0) fputc(FST_BL_HDR, xc->handle); /* +0 tag */ #define FST_HDR_OFFS_SECLEN (FST_HDR_OFFS_TAG + 1) fstWriterUint64(xc->handle, 329); /* +1 section length */ #define FST_HDR_OFFS_START_TIME (FST_HDR_OFFS_SECLEN + 8) fstWriterUint64(xc->handle, 0); /* +9 start time */ #define FST_HDR_OFFS_END_TIME (FST_HDR_OFFS_START_TIME + 8) fstWriterUint64(xc->handle, 0); /* +17 end time */ #define FST_HDR_OFFS_ENDIAN_TEST (FST_HDR_OFFS_END_TIME + 8) fstFwrite(&endtest, 8, 1, xc->handle); /* +25 endian test for reals */ #define FST_HDR_OFFS_MEM_USED (FST_HDR_OFFS_ENDIAN_TEST + 8) fstWriterUint64(xc->handle, xc->fst_break_size);/* +33 memory used by writer */ #define FST_HDR_OFFS_NUM_SCOPES (FST_HDR_OFFS_MEM_USED + 8) fstWriterUint64(xc->handle, 0); /* +41 scope creation count */ #define FST_HDR_OFFS_NUM_VARS (FST_HDR_OFFS_NUM_SCOPES + 8) fstWriterUint64(xc->handle, 0); /* +49 var creation count */ #define FST_HDR_OFFS_MAXHANDLE (FST_HDR_OFFS_NUM_VARS + 8) fstWriterUint64(xc->handle, 0); /* +57 max var idcode */ #define FST_HDR_OFFS_SECTION_CNT (FST_HDR_OFFS_MAXHANDLE + 8) fstWriterUint64(xc->handle, 0); /* +65 vc section count */ #define FST_HDR_OFFS_TIMESCALE (FST_HDR_OFFS_SECTION_CNT + 8) fputc((-9)&255, xc->handle); /* +73 timescale 1ns */ #define FST_HDR_OFFS_SIM_VERSION (FST_HDR_OFFS_TIMESCALE + 1) memset(vbuf, 0, FST_HDR_SIM_VERSION_SIZE); strcpy(vbuf, FST_WRITER_STR); fstFwrite(vbuf, FST_HDR_SIM_VERSION_SIZE, 1, xc->handle); /* +74 version */ #define FST_HDR_OFFS_DATE (FST_HDR_OFFS_SIM_VERSION + FST_HDR_SIM_VERSION_SIZE) memset(dbuf, 0, FST_HDR_DATE_SIZE); time(&walltime); strcpy(dbuf, asctime(localtime(&walltime))); fstFwrite(dbuf, FST_HDR_DATE_SIZE, 1, xc->handle); /* +202 date */ /* date size is deliberately overspecified at 119 bytes (originally 128) in order to provide backfill for new args */ #define FST_HDR_OFFS_FILETYPE (FST_HDR_OFFS_DATE + FST_HDR_DATE_SIZE) fputc(xc->filetype, xc->handle); /* +321 filetype */ #define FST_HDR_OFFS_TIMEZERO (FST_HDR_OFFS_FILETYPE + FST_HDR_FILETYPE_SIZE) fstWriterUint64(xc->handle, xc->timezero); /* +322 timezero */ #define FST_HDR_LENGTH (FST_HDR_OFFS_TIMEZERO + FST_HDR_TIMEZERO_SIZE) /* +330 next section starts here */ fflush(xc->handle); } /* * mmap functions */ static void fstWriterCreateMmaps(struct fstWriterContext *xc) { off_t curpos = ftello(xc->handle); fflush(xc->hier_handle); /* write out intermediate header */ fstWriterFseeko(xc, xc->handle, FST_HDR_OFFS_START_TIME, SEEK_SET); fstWriterUint64(xc->handle, xc->firsttime); fstWriterUint64(xc->handle, xc->curtime); fstWriterFseeko(xc, xc->handle, FST_HDR_OFFS_NUM_SCOPES, SEEK_SET); fstWriterUint64(xc->handle, xc->numscopes); fstWriterUint64(xc->handle, xc->numsigs); fstWriterUint64(xc->handle, xc->maxhandle); fstWriterUint64(xc->handle, xc->secnum); fstWriterFseeko(xc, xc->handle, curpos, SEEK_SET); fflush(xc->handle); /* do mappings */ if(!xc->valpos_mem) { fflush(xc->valpos_handle); xc->valpos_mem = fstMmap(NULL, xc->maxhandle * 4 * sizeof(uint32_t), PROT_READ|PROT_WRITE, MAP_SHARED, fileno(xc->valpos_handle), 0); } if(!xc->curval_mem) { fflush(xc->curval_handle); xc->curval_mem = fstMmap(NULL, xc->maxvalpos, PROT_READ|PROT_WRITE, MAP_SHARED, fileno(xc->curval_handle), 0); } } static void fstDestroyMmaps(struct fstWriterContext *xc, int is_closing) { (void)is_closing; fstMunmap(xc->valpos_mem, xc->maxhandle * 4 * sizeof(uint32_t)); xc->valpos_mem = NULL; #if defined __CYGWIN__ || defined __MINGW32__ if(xc->curval_mem) { if(!is_closing) /* need to flush out for next emulated mmap() read */ { unsigned char *pnt = xc->curval_mem; int __fd = fileno(xc->curval_handle); off_t cur_offs = lseek(__fd, 0, SEEK_CUR); size_t i; size_t __len = xc->maxvalpos; lseek(__fd, 0, SEEK_SET); for(i=0;i<__len;i+=SSIZE_MAX) { write(__fd, pnt + i, ((__len - i) >= SSIZE_MAX) ? SSIZE_MAX : (__len - i)); } lseek(__fd, cur_offs, SEEK_SET); } } #endif fstMunmap(xc->curval_mem, xc->maxvalpos); xc->curval_mem = NULL; } /* * set up large and small memory usages * crossover point in model is FST_ACTIVATE_HUGE_BREAK number of signals */ static void fstDetermineBreakSize(struct fstWriterContext *xc) { #if defined(__linux__) || defined(FST_MACOSX) int was_set = 0; #ifdef __linux__ FILE *f = fopen("/proc/meminfo", "rb"); if(f) { char buf[257]; char *s; while(!feof(f)) { buf[0] = 0; s = fgets(buf, 256, f); if(s && *s) { if(!strncmp(s, "MemTotal:", 9)) { size_t v = atol(s+10); v *= 1024; /* convert to bytes */ v /= 8; /* chop down to 1/8 physical memory */ if(v > FST_BREAK_SIZE) { if(v > FST_BREAK_SIZE_MAX) { v = FST_BREAK_SIZE_MAX; } xc->fst_huge_break_size = v; was_set = 1; break; } } } } fclose(f); } if(!was_set) { xc->fst_huge_break_size = FST_BREAK_SIZE; } #else int mib[2]; int64_t v; size_t length; mib[0] = CTL_HW; mib[1] = HW_MEMSIZE; length = sizeof(int64_t); if(!sysctl(mib, 2, &v, &length, NULL, 0)) { v /= 8; if(v > (int64_t)FST_BREAK_SIZE) { if(v > (int64_t)FST_BREAK_SIZE_MAX) { v = FST_BREAK_SIZE_MAX; } xc->fst_huge_break_size = v; was_set = 1; } } if(!was_set) { xc->fst_huge_break_size = FST_BREAK_SIZE; } #endif #else xc->fst_huge_break_size = FST_BREAK_SIZE; #endif xc->fst_break_size = xc->fst_orig_break_size = FST_BREAK_SIZE; xc->fst_break_add_size = xc->fst_orig_break_add_size = FST_BREAK_ADD_SIZE; xc->next_huge_break = FST_ACTIVATE_HUGE_BREAK; } /* * file creation and close */ void *fstWriterCreate(const char *nam, int use_compressed_hier) { struct fstWriterContext *xc = calloc(1, sizeof(struct fstWriterContext)); xc->compress_hier = use_compressed_hier; fstDetermineBreakSize(xc); if((!nam)|| (!(xc->handle=unlink_fopen(nam, "w+b")))) { free(xc); xc=NULL; } else { int flen = strlen(nam); char *hf = calloc(1, flen + 6); memcpy(hf, nam, flen); strcpy(hf + flen, ".hier"); xc->hier_handle = unlink_fopen(hf, "w+b"); xc->geom_handle = tmpfile_open(&xc->geom_handle_nam); /* .geom */ xc->valpos_handle = tmpfile_open(&xc->valpos_handle_nam); /* .offs */ xc->curval_handle = tmpfile_open(&xc->curval_handle_nam); /* .bits */ xc->tchn_handle = tmpfile_open(&xc->tchn_handle_nam); /* .tchn */ xc->vchg_alloc_siz = xc->fst_break_size + xc->fst_break_add_size; xc->vchg_mem = malloc(xc->vchg_alloc_siz); if(xc->hier_handle && xc->geom_handle && xc->valpos_handle && xc->curval_handle && xc->vchg_mem && xc->tchn_handle) { xc->filename = strdup(nam); xc->is_initial_time = 1; fstWriterEmitHdrBytes(xc); xc->nan = strtod("NaN", NULL); #ifdef FST_WRITER_PARALLEL pthread_mutex_init(&xc->mutex, NULL); pthread_attr_init(&xc->thread_attr); pthread_attr_setdetachstate(&xc->thread_attr, PTHREAD_CREATE_DETACHED); #endif } else { fclose(xc->handle); if(xc->hier_handle) { fclose(xc->hier_handle); unlink(hf); } tmpfile_close(&xc->geom_handle, &xc->geom_handle_nam); tmpfile_close(&xc->valpos_handle, &xc->valpos_handle_nam); tmpfile_close(&xc->curval_handle, &xc->curval_handle_nam); tmpfile_close(&xc->tchn_handle, &xc->tchn_handle_nam); free(xc->vchg_mem); free(xc); xc=NULL; } free(hf); } return(xc); } /* * generation and writing out of value change data sections */ static void fstWriterEmitSectionHeader(void *ctx) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; if(xc) { unsigned long destlen; unsigned char *dmem; int rc; destlen = xc->maxvalpos; dmem = malloc(compressBound(destlen)); rc = compress2(dmem, &destlen, xc->curval_mem, xc->maxvalpos, 4); /* was 9...which caused performance drag on traces with many signals */ fputc(FST_BL_SKIP, xc->handle); /* temporarily tag the section, use FST_BL_VCDATA on finalize */ xc->section_start = ftello(xc->handle); #ifdef FST_WRITER_PARALLEL if(xc->xc_parent) xc->xc_parent->section_start = xc->section_start; #endif xc->section_header_only = 1; /* indicates truncate might be needed */ fstWriterUint64(xc->handle, 0); /* placeholder = section length */ fstWriterUint64(xc->handle, xc->is_initial_time ? xc->firsttime : xc->curtime); /* begin time of section */ fstWriterUint64(xc->handle, xc->curtime); /* end time of section (placeholder) */ fstWriterUint64(xc->handle, 0); /* placeholder = amount of buffer memory required in reader for full vc traversal */ fstWriterVarint(xc->handle, xc->maxvalpos); /* maxvalpos = length of uncompressed data */ if((rc == Z_OK) && (destlen < xc->maxvalpos)) { fstWriterVarint(xc->handle, destlen); /* length of compressed data */ } else { fstWriterVarint(xc->handle, xc->maxvalpos); /* length of (unable to be) compressed data */ } fstWriterVarint(xc->handle, xc->maxhandle); /* max handle associated with this data (in case of dynamic facility adds) */ if((rc == Z_OK) && (destlen < xc->maxvalpos)) { fstFwrite(dmem, destlen, 1, xc->handle); } else /* comparison between compressed / decompressed len tells if compressed */ { fstFwrite(xc->curval_mem, xc->maxvalpos, 1, xc->handle); } free(dmem); } } /* * only to be called directly by fst code...otherwise must * be synced up with time changes */ #ifdef FST_WRITER_PARALLEL static void fstWriterFlushContextPrivate2(void *ctx) #else static void fstWriterFlushContextPrivate(void *ctx) #endif { #ifdef FST_DEBUG int cnt = 0; #endif unsigned int i; unsigned char *vchg_mem; FILE *f; off_t fpos, indxpos, endpos; uint32_t prevpos; int zerocnt; unsigned char *scratchpad; unsigned char *scratchpnt; unsigned char *tmem; off_t tlen; off_t unc_memreq = 0; /* for reader */ unsigned char *packmem; unsigned int packmemlen; uint32_t *vm4ip; struct fstWriterContext *xc = (struct fstWriterContext *)ctx; #ifdef FST_WRITER_PARALLEL struct fstWriterContext *xc2 = xc->xc_parent; #else struct fstWriterContext *xc2 = xc; #endif #ifndef FST_DYNAMIC_ALIAS_DISABLE Pvoid_t PJHSArray = (Pvoid_t) NULL; #ifndef _WAVE_HAVE_JUDY uint32_t hashmask = xc->maxhandle; hashmask |= hashmask >> 1; hashmask |= hashmask >> 2; hashmask |= hashmask >> 4; hashmask |= hashmask >> 8; hashmask |= hashmask >> 16; #endif #endif if((xc->vchg_siz <= 1)||(xc->already_in_flush)) return; xc->already_in_flush = 1; /* should really do this with a semaphore */ xc->section_header_only = 0; scratchpad = malloc(xc->vchg_siz); vchg_mem = xc->vchg_mem; f = xc->handle; fstWriterVarint(f, xc->maxhandle); /* emit current number of handles */ fputc(xc->fourpack ? '4' : (xc->fastpack ? 'F' : 'Z'), f); fpos = 1; packmemlen = 1024; /* maintain a running "longest" allocation to */ packmem = malloc(packmemlen); /* prevent continual malloc...free every loop iter */ for(i=0;imaxhandle;i++) { vm4ip = &(xc->valpos_mem[4*i]); if(vm4ip[2]) { uint32_t offs = vm4ip[2]; uint32_t next_offs; unsigned int wrlen; vm4ip[2] = fpos; scratchpnt = scratchpad + xc->vchg_siz; /* build this buffer backwards */ if(vm4ip[1] <= 1) { if(vm4ip[1] == 1) { wrlen = fstGetVarint32Length(vchg_mem + offs + 4); /* used to advance and determine wrlen */ #ifndef FST_REMOVE_DUPLICATE_VC xc->curval_mem[vm4ip[0]] = vchg_mem[offs + 4 + wrlen]; /* checkpoint variable */ #endif while(offs) { unsigned char val; uint32_t time_delta, rcv; next_offs = fstGetUint32(vchg_mem + offs); offs += 4; time_delta = fstGetVarint32(vchg_mem + offs, (int *)&wrlen); val = vchg_mem[offs+wrlen]; offs = next_offs; switch(val) { case '0': case '1': rcv = ((val&1)<<1) | (time_delta<<2); break; /* pack more delta bits in for 0/1 vchs */ case 'x': case 'X': rcv = FST_RCV_X | (time_delta<<4); break; case 'z': case 'Z': rcv = FST_RCV_Z | (time_delta<<4); break; case 'h': case 'H': rcv = FST_RCV_H | (time_delta<<4); break; case 'u': case 'U': rcv = FST_RCV_U | (time_delta<<4); break; case 'w': case 'W': rcv = FST_RCV_W | (time_delta<<4); break; case 'l': case 'L': rcv = FST_RCV_L | (time_delta<<4); break; default: rcv = FST_RCV_D | (time_delta<<4); break; } scratchpnt = fstCopyVarint32ToLeft(scratchpnt, rcv); } } else { /* variable length */ /* fstGetUint32 (next_offs) + fstGetVarint32 (time_delta) + fstGetVarint32 (len) + payload */ unsigned char *pnt; uint32_t record_len; uint32_t time_delta; while(offs) { next_offs = fstGetUint32(vchg_mem + offs); offs += 4; pnt = vchg_mem + offs; offs = next_offs; time_delta = fstGetVarint32(pnt, (int *)&wrlen); pnt += wrlen; record_len = fstGetVarint32(pnt, (int *)&wrlen); pnt += wrlen; scratchpnt -= record_len; memcpy(scratchpnt, pnt, record_len); scratchpnt = fstCopyVarint32ToLeft(scratchpnt, record_len); scratchpnt = fstCopyVarint32ToLeft(scratchpnt, (time_delta << 1)); /* reserve | 1 case for future expansion */ } } } else { wrlen = fstGetVarint32Length(vchg_mem + offs + 4); /* used to advance and determine wrlen */ #ifndef FST_REMOVE_DUPLICATE_VC memcpy(xc->curval_mem + vm4ip[0], vchg_mem + offs + 4 + wrlen, vm4ip[1]); /* checkpoint variable */ #endif while(offs) { unsigned int idx; char is_binary = 1; unsigned char *pnt; uint32_t time_delta; next_offs = fstGetUint32(vchg_mem + offs); offs += 4; time_delta = fstGetVarint32(vchg_mem + offs, (int *)&wrlen); pnt = vchg_mem+offs+wrlen; offs = next_offs; for(idx=0;idxvchg_siz - scratchpnt; unc_memreq += wrlen; if(wrlen > 32) { unsigned long destlen = wrlen; unsigned char *dmem; unsigned int rc; if(!xc->fastpack) { if(wrlen <= packmemlen) { dmem = packmem; } else { free(packmem); dmem = packmem = malloc(compressBound(packmemlen = wrlen)); } rc = compress2(dmem, &destlen, scratchpnt, wrlen, 4); if(rc == Z_OK) { #ifndef FST_DYNAMIC_ALIAS_DISABLE PPvoid_t pv = JudyHSIns(&PJHSArray, dmem, destlen, NULL); if(*pv) { uint32_t pvi = (intptr_t)(*pv); vm4ip[2] = -pvi; } else { *pv = (void *)(intptr_t)(i+1); #endif fpos += fstWriterVarint(f, wrlen); fpos += destlen; fstFwrite(dmem, destlen, 1, f); #ifndef FST_DYNAMIC_ALIAS_DISABLE } #endif } else { #ifndef FST_DYNAMIC_ALIAS_DISABLE PPvoid_t pv = JudyHSIns(&PJHSArray, scratchpnt, wrlen, NULL); if(*pv) { uint32_t pvi = (intptr_t)(*pv); vm4ip[2] = -pvi; } else { *pv = (void *)(intptr_t)(i+1); #endif fpos += fstWriterVarint(f, 0); fpos += wrlen; fstFwrite(scratchpnt, wrlen, 1, f); #ifndef FST_DYNAMIC_ALIAS_DISABLE } #endif } } else { /* this is extremely conservative: fastlz needs +5% for worst case, lz4 needs siz+(siz/255)+16 */ if(((wrlen * 2) + 2) <= packmemlen) { dmem = packmem; } else { free(packmem); dmem = packmem = malloc(packmemlen = (wrlen * 2) + 2); } rc = (xc->fourpack) ? LZ4_compress((char *)scratchpnt, (char *)dmem, wrlen) : fastlz_compress(scratchpnt, wrlen, dmem); if(rc < destlen) { #ifndef FST_DYNAMIC_ALIAS_DISABLE PPvoid_t pv = JudyHSIns(&PJHSArray, dmem, rc, NULL); if(*pv) { uint32_t pvi = (intptr_t)(*pv); vm4ip[2] = -pvi; } else { *pv = (void *)(intptr_t)(i+1); #endif fpos += fstWriterVarint(f, wrlen); fpos += rc; fstFwrite(dmem, rc, 1, f); #ifndef FST_DYNAMIC_ALIAS_DISABLE } #endif } else { #ifndef FST_DYNAMIC_ALIAS_DISABLE PPvoid_t pv = JudyHSIns(&PJHSArray, scratchpnt, wrlen, NULL); if(*pv) { uint32_t pvi = (intptr_t)(*pv); vm4ip[2] = -pvi; } else { *pv = (void *)(intptr_t)(i+1); #endif fpos += fstWriterVarint(f, 0); fpos += wrlen; fstFwrite(scratchpnt, wrlen, 1, f); #ifndef FST_DYNAMIC_ALIAS_DISABLE } #endif } } } else { #ifndef FST_DYNAMIC_ALIAS_DISABLE PPvoid_t pv = JudyHSIns(&PJHSArray, scratchpnt, wrlen, NULL); if(*pv) { uint32_t pvi = (intptr_t)(*pv); vm4ip[2] = -pvi; } else { *pv = (void *)(intptr_t)(i+1); #endif fpos += fstWriterVarint(f, 0); fpos += wrlen; fstFwrite(scratchpnt, wrlen, 1, f); #ifndef FST_DYNAMIC_ALIAS_DISABLE } #endif } /* vm4ip[3] = 0; ...redundant with clearing below */ #ifdef FST_DEBUG cnt++; #endif } } #ifndef FST_DYNAMIC_ALIAS_DISABLE JudyHSFreeArray(&PJHSArray, NULL); #endif free(packmem); packmem = NULL; /* packmemlen = 0; */ /* scan-build */ prevpos = 0; zerocnt = 0; free(scratchpad); scratchpad = NULL; indxpos = ftello(f); xc->secnum++; #ifndef FST_DYNAMIC_ALIAS2_DISABLE if(1) { uint32_t prev_alias = 0; for(i=0;imaxhandle;i++) { vm4ip = &(xc->valpos_mem[4*i]); if(vm4ip[2]) { if(zerocnt) { fpos += fstWriterVarint(f, (zerocnt << 1)); zerocnt = 0; } if(vm4ip[2] & 0x80000000) { if(vm4ip[2] != prev_alias) { fpos += fstWriterSVarint(f, (((int64_t)((int32_t)(prev_alias = vm4ip[2]))) << 1) | 1); } else { fpos += fstWriterSVarint(f, (0 << 1) | 1); } } else { fpos += fstWriterSVarint(f, ((vm4ip[2] - prevpos) << 1) | 1); prevpos = vm4ip[2]; } vm4ip[2] = 0; vm4ip[3] = 0; /* clear out tchn idx */ } else { zerocnt++; } } } else #endif { for(i=0;imaxhandle;i++) { vm4ip = &(xc->valpos_mem[4*i]); if(vm4ip[2]) { if(zerocnt) { fpos += fstWriterVarint(f, (zerocnt << 1)); zerocnt = 0; } if(vm4ip[2] & 0x80000000) { fpos += fstWriterVarint(f, 0); /* signal, note that using a *signed* varint would be more efficient than this byte escape! */ fpos += fstWriterVarint(f, (-(int32_t)vm4ip[2])); } else { fpos += fstWriterVarint(f, ((vm4ip[2] - prevpos) << 1) | 1); prevpos = vm4ip[2]; } vm4ip[2] = 0; vm4ip[3] = 0; /* clear out tchn idx */ } else { zerocnt++; } } } if(zerocnt) { /* fpos += */ fstWriterVarint(f, (zerocnt << 1)); /* scan-build */ } #ifdef FST_DEBUG fprintf(stderr, "value chains: %d\n", cnt); #endif xc->vchg_mem[0] = '!'; xc->vchg_siz = 1; endpos = ftello(xc->handle); fstWriterUint64(xc->handle, endpos-indxpos); /* write delta index position at very end of block */ /*emit time changes for block */ fflush(xc->tchn_handle); tlen = ftello(xc->tchn_handle); fstWriterFseeko(xc, xc->tchn_handle, 0, SEEK_SET); tmem = fstMmap(NULL, tlen, PROT_READ|PROT_WRITE, MAP_SHARED, fileno(xc->tchn_handle), 0); if(tmem) { unsigned long destlen = tlen; unsigned char *dmem = malloc(compressBound(destlen)); int rc = compress2(dmem, &destlen, tmem, tlen, 9); if((rc == Z_OK) && (((off_t)destlen) < tlen)) { fstFwrite(dmem, destlen, 1, xc->handle); } else /* comparison between compressed / decompressed len tells if compressed */ { fstFwrite(tmem, tlen, 1, xc->handle); destlen = tlen; } free(dmem); fstMunmap(tmem, tlen); fstWriterUint64(xc->handle, tlen); /* uncompressed */ fstWriterUint64(xc->handle, destlen); /* compressed */ fstWriterUint64(xc->handle, xc->tchn_cnt); /* number of time items */ } xc->tchn_cnt = xc->tchn_idx = 0; fstWriterFseeko(xc, xc->tchn_handle, 0, SEEK_SET); fstFtruncate(fileno(xc->tchn_handle), 0); /* write block trailer */ endpos = ftello(xc->handle); fstWriterFseeko(xc, xc->handle, xc->section_start, SEEK_SET); fstWriterUint64(xc->handle, endpos - xc->section_start); /* write block length */ fstWriterFseeko(xc, xc->handle, 8, SEEK_CUR); /* skip begin time */ fstWriterUint64(xc->handle, xc->curtime); /* write end time for section */ fstWriterUint64(xc->handle, unc_memreq); /* amount of buffer memory required in reader for full traversal */ fflush(xc->handle); fstWriterFseeko(xc, xc->handle, xc->section_start-1, SEEK_SET); /* write out FST_BL_VCDATA over FST_BL_SKIP */ #ifndef FST_DYNAMIC_ALIAS_DISABLE #ifndef FST_DYNAMIC_ALIAS2_DISABLE fputc(FST_BL_VCDATA_DYN_ALIAS2, xc->handle); #else fputc(FST_BL_VCDATA_DYN_ALIAS, xc->handle); #endif #else fputc(FST_BL_VCDATA, xc->handle); #endif fflush(xc->handle); fstWriterFseeko(xc, xc->handle, endpos, SEEK_SET); /* seek to end of file */ xc2->section_header_truncpos = endpos; /* cache in case of need to truncate */ if(xc->dump_size_limit) { if(endpos >= ((off_t)xc->dump_size_limit)) { xc2->skip_writing_section_hdr = 1; xc2->size_limit_locked = 1; xc2->is_initial_time = 1; /* to trick emit value and emit time change */ #ifdef FST_DEBUG fprintf(stderr, "<< dump file size limit reached, stopping dumping >>\n"); #endif } } if(!xc2->skip_writing_section_hdr) { fstWriterEmitSectionHeader(xc); /* emit next section header */ } fflush(xc->handle); xc->already_in_flush = 0; } #ifdef FST_WRITER_PARALLEL static void *fstWriterFlushContextPrivate1(void *ctx) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; fstWriterFlushContextPrivate2(xc); pthread_mutex_unlock(&(xc->xc_parent->mutex)); #ifdef FST_REMOVE_DUPLICATE_VC free(xc->curval_mem); #endif free(xc->valpos_mem); free(xc->vchg_mem); tmpfile_close(&xc->tchn_handle, &xc->tchn_handle_nam); free(xc); return(NULL); } static void fstWriterFlushContextPrivate(void *ctx) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; if(xc->parallel_enabled) { struct fstWriterContext *xc2 = malloc(sizeof(struct fstWriterContext)); unsigned int i; pthread_mutex_lock(&xc->mutex); pthread_mutex_unlock(&xc->mutex); xc->xc_parent = xc; memcpy(xc2, xc, sizeof(struct fstWriterContext)); xc2->valpos_mem = malloc(xc->maxhandle * 4 * sizeof(uint32_t)); memcpy(xc2->valpos_mem, xc->valpos_mem, xc->maxhandle * 4 * sizeof(uint32_t)); /* curval mem is updated in the thread */ #ifdef FST_REMOVE_DUPLICATE_VC xc2->curval_mem = malloc(xc->maxvalpos); memcpy(xc2->curval_mem, xc->curval_mem, xc->maxvalpos); #endif xc->vchg_mem = malloc(xc->vchg_alloc_siz); xc->vchg_mem[0] = '!'; xc->vchg_siz = 1; for(i=0;imaxhandle;i++) { uint32_t *vm4ip = &(xc->valpos_mem[4*i]); vm4ip[2] = 0; /* zero out offset val */ vm4ip[3] = 0; /* zero out last time change val */ } xc->tchn_cnt = xc->tchn_idx = 0; xc->tchn_handle = tmpfile_open(&xc->tchn_handle_nam); /* child thread will deallocate file/name */ fstWriterFseeko(xc, xc->tchn_handle, 0, SEEK_SET); fstFtruncate(fileno(xc->tchn_handle), 0); xc->section_header_only = 0; xc->secnum++; pthread_mutex_lock(&xc->mutex); pthread_create(&xc->thread, &xc->thread_attr, fstWriterFlushContextPrivate1, xc2); } else { if(xc->parallel_was_enabled) /* conservatively block */ { pthread_mutex_lock(&xc->mutex); pthread_mutex_unlock(&xc->mutex); } xc->xc_parent = xc; fstWriterFlushContextPrivate2(xc); } } #endif /* * queues up a flush context operation */ void fstWriterFlushContext(void *ctx) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; if(xc) { if(xc->tchn_idx > 1) { xc->flush_context_pending = 1; } } } /* * close out FST file */ void fstWriterClose(void *ctx) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; #ifdef FST_WRITER_PARALLEL if(xc) { pthread_mutex_lock(&xc->mutex); pthread_mutex_unlock(&xc->mutex); } #endif if(xc && !xc->already_in_close && !xc->already_in_flush) { unsigned char *tmem; off_t fixup_offs, tlen, hlen; xc->already_in_close = 1; /* never need to zero this out as it is freed at bottom */ if(xc->section_header_only && xc->section_header_truncpos && (xc->vchg_siz <= 1) && (!xc->is_initial_time)) { fstFtruncate(fileno(xc->handle), xc->section_header_truncpos); fstWriterFseeko(xc, xc->handle, xc->section_header_truncpos, SEEK_SET); xc->section_header_only = 0; } else { xc->skip_writing_section_hdr = 1; if(!xc->size_limit_locked) { if(xc->is_initial_time) /* simulation time never advanced so mock up the changes as time zero ones */ { fstHandle dupe_idx; fstWriterEmitTimeChange(xc, 0); /* emit some time change just to have one */ for(dupe_idx = 0; dupe_idx < xc->maxhandle; dupe_idx++) /* now clone the values */ { fstWriterEmitValueChange(xc, dupe_idx+1, xc->curval_mem + xc->valpos_mem[4*dupe_idx]); } } fstWriterFlushContextPrivate(xc); #ifdef FST_WRITER_PARALLEL pthread_mutex_lock(&xc->mutex); pthread_mutex_unlock(&xc->mutex); #endif } } fstDestroyMmaps(xc, 1); /* write out geom section */ fflush(xc->geom_handle); tlen = ftello(xc->geom_handle); tmem = fstMmap(NULL, tlen, PROT_READ|PROT_WRITE, MAP_SHARED, fileno(xc->geom_handle), 0); if(tmem) { unsigned long destlen = tlen; unsigned char *dmem = malloc(compressBound(destlen)); int rc = compress2(dmem, &destlen, tmem, tlen, 9); if((rc != Z_OK) || (((off_t)destlen) > tlen)) { destlen = tlen; } fixup_offs = ftello(xc->handle); fputc(FST_BL_SKIP, xc->handle); /* temporary tag */ fstWriterUint64(xc->handle, destlen + 24); /* section length */ fstWriterUint64(xc->handle, tlen); /* uncompressed */ /* compressed len is section length - 24 */ fstWriterUint64(xc->handle, xc->maxhandle); /* maxhandle */ fstFwrite((((off_t)destlen) != tlen) ? dmem : tmem, destlen, 1, xc->handle); fflush(xc->handle); fstWriterFseeko(xc, xc->handle, fixup_offs, SEEK_SET); fputc(FST_BL_GEOM, xc->handle); /* actual tag */ fstWriterFseeko(xc, xc->handle, 0, SEEK_END); /* move file pointer to end for any section adds */ fflush(xc->handle); free(dmem); fstMunmap(tmem, tlen); } if(xc->num_blackouts) { uint64_t cur_bl = 0; off_t bpos, eos; uint32_t i; fixup_offs = ftello(xc->handle); fputc(FST_BL_SKIP, xc->handle); /* temporary tag */ bpos = fixup_offs + 1; fstWriterUint64(xc->handle, 0); /* section length */ fstWriterVarint(xc->handle, xc->num_blackouts); for(i=0;inum_blackouts;i++) { fputc(xc->blackout_head->active, xc->handle); fstWriterVarint(xc->handle, xc->blackout_head->tim - cur_bl); cur_bl = xc->blackout_head->tim; xc->blackout_curr = xc->blackout_head->next; free(xc->blackout_head); xc->blackout_head = xc->blackout_curr; } eos = ftello(xc->handle); fstWriterFseeko(xc, xc->handle, bpos, SEEK_SET); fstWriterUint64(xc->handle, eos - bpos); fflush(xc->handle); fstWriterFseeko(xc, xc->handle, fixup_offs, SEEK_SET); fputc(FST_BL_BLACKOUT, xc->handle); /* actual tag */ fstWriterFseeko(xc, xc->handle, 0, SEEK_END); /* move file pointer to end for any section adds */ fflush(xc->handle); } if(xc->compress_hier) { off_t hl, eos; gzFile zhandle; int zfd; int fourpack_duo = 0; #ifndef __MINGW32__ char *fnam = malloc(strlen(xc->filename) + 5 + 1); #endif fixup_offs = ftello(xc->handle); fputc(FST_BL_SKIP, xc->handle); /* temporary tag */ hlen = ftello(xc->handle); fstWriterUint64(xc->handle, 0); /* section length */ fstWriterUint64(xc->handle, xc->hier_file_len); /* uncompressed length */ if(!xc->fourpack) { unsigned char *mem = malloc(FST_GZIO_LEN); zfd = dup(fileno(xc->handle)); fflush(xc->handle); zhandle = gzdopen(zfd, "wb4"); if(zhandle) { fstWriterFseeko(xc, xc->hier_handle, 0, SEEK_SET); for(hl = 0; hl < xc->hier_file_len; hl += FST_GZIO_LEN) { unsigned len = ((xc->hier_file_len - hl) > FST_GZIO_LEN) ? FST_GZIO_LEN : (xc->hier_file_len - hl); fstFread(mem, len, 1, xc->hier_handle); gzwrite(zhandle, mem, len); } gzclose(zhandle); } else { close(zfd); } free(mem); } else { int lz4_maxlen; unsigned char *mem; unsigned char *hmem; int packed_len; fflush(xc->handle); lz4_maxlen = LZ4_compressBound(xc->hier_file_len); mem = malloc(lz4_maxlen); hmem = fstMmap(NULL, xc->hier_file_len, PROT_READ|PROT_WRITE, MAP_SHARED, fileno(xc->hier_handle), 0); packed_len = LZ4_compress((char *)hmem, (char *)mem, xc->hier_file_len); fstMunmap(hmem, xc->hier_file_len); fourpack_duo = (!xc->repack_on_close) && (xc->hier_file_len > FST_HDR_FOURPACK_DUO_SIZE); /* double pack when hierarchy is large */ if(fourpack_duo) /* double packing with LZ4 is faster than gzip */ { unsigned char *mem_duo; int lz4_maxlen_duo; int packed_len_duo; lz4_maxlen_duo = LZ4_compressBound(packed_len); mem_duo = malloc(lz4_maxlen_duo); packed_len_duo = LZ4_compress((char *)mem, (char *)mem_duo, packed_len); fstWriterVarint(xc->handle, packed_len); /* 1st round compressed length */ fstFwrite(mem_duo, packed_len_duo, 1, xc->handle); free(mem_duo); } else { fstFwrite(mem, packed_len, 1, xc->handle); } free(mem); } fstWriterFseeko(xc, xc->handle, 0, SEEK_END); eos = ftello(xc->handle); fstWriterFseeko(xc, xc->handle, hlen, SEEK_SET); fstWriterUint64(xc->handle, eos - hlen); fflush(xc->handle); fstWriterFseeko(xc, xc->handle, fixup_offs, SEEK_SET); fputc(xc->fourpack ? ( fourpack_duo ? FST_BL_HIER_LZ4DUO : FST_BL_HIER_LZ4) : FST_BL_HIER, xc->handle); /* actual tag now also == compression type */ fstWriterFseeko(xc, xc->handle, 0, SEEK_END); /* move file pointer to end for any section adds */ fflush(xc->handle); #ifndef __MINGW32__ sprintf(fnam, "%s.hier", xc->filename); unlink(fnam); free(fnam); #endif } /* finalize out header */ fstWriterFseeko(xc, xc->handle, FST_HDR_OFFS_START_TIME, SEEK_SET); fstWriterUint64(xc->handle, xc->firsttime); fstWriterUint64(xc->handle, xc->curtime); fstWriterFseeko(xc, xc->handle, FST_HDR_OFFS_NUM_SCOPES, SEEK_SET); fstWriterUint64(xc->handle, xc->numscopes); fstWriterUint64(xc->handle, xc->numsigs); fstWriterUint64(xc->handle, xc->maxhandle); fstWriterUint64(xc->handle, xc->secnum); fflush(xc->handle); tmpfile_close(&xc->tchn_handle, &xc->tchn_handle_nam); free(xc->vchg_mem); xc->vchg_mem = NULL; tmpfile_close(&xc->curval_handle, &xc->curval_handle_nam); tmpfile_close(&xc->valpos_handle, &xc->valpos_handle_nam); tmpfile_close(&xc->geom_handle, &xc->geom_handle_nam); if(xc->hier_handle) { fclose(xc->hier_handle); xc->hier_handle = NULL; } if(xc->handle) { if(xc->repack_on_close) { FILE *fp; off_t offpnt, uclen; int flen = strlen(xc->filename); char *hf = calloc(1, flen + 5); strcpy(hf, xc->filename); strcpy(hf+flen, ".pak"); fp = fopen(hf, "wb"); if(fp) { void *dsth; int zfd; char gz_membuf[FST_GZIO_LEN]; fstWriterFseeko(xc, xc->handle, 0, SEEK_END); uclen = ftello(xc->handle); fputc(FST_BL_ZWRAPPER, fp); fstWriterUint64(fp, 0); fstWriterUint64(fp, uclen); fflush(fp); fstWriterFseeko(xc, xc->handle, 0, SEEK_SET); zfd = dup(fileno(fp)); dsth = gzdopen(zfd, "wb4"); if(dsth) { for(offpnt = 0; offpnt < uclen; offpnt += FST_GZIO_LEN) { size_t this_len = ((uclen - offpnt) > FST_GZIO_LEN) ? FST_GZIO_LEN : (uclen - offpnt); fstFread(gz_membuf, this_len, 1, xc->handle); gzwrite(dsth, gz_membuf, this_len); } gzclose(dsth); } else { close(zfd); } fstWriterFseeko(xc, fp, 0, SEEK_END); offpnt = ftello(fp); fstWriterFseeko(xc, fp, 1, SEEK_SET); fstWriterUint64(fp, offpnt - 1); fclose(fp); fclose(xc->handle); xc->handle = NULL; unlink(xc->filename); rename(hf, xc->filename); } else { xc->repack_on_close = 0; fclose(xc->handle); xc->handle = NULL; } free(hf); } else { fclose(xc->handle); xc->handle = NULL; } } #ifdef __MINGW32__ { int flen = strlen(xc->filename); char *hf = calloc(1, flen + 6); strcpy(hf, xc->filename); if(xc->compress_hier) { strcpy(hf + flen, ".hier"); unlink(hf); /* no longer needed as a section now exists for this */ } free(hf); } #endif #ifdef FST_WRITER_PARALLEL pthread_mutex_destroy(&xc->mutex); pthread_attr_destroy(&xc->thread_attr); #endif if(xc->path_array) { #ifndef _WAVE_HAVE_JUDY const uint32_t hashmask = FST_PATH_HASHMASK; #endif JudyHSFreeArray(&(xc->path_array), NULL); } free(xc->filename); xc->filename = NULL; free(xc); } } /* * functions to set miscellaneous header/block information */ void fstWriterSetDate(void *ctx, const char *dat) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; if(xc) { char s[FST_HDR_DATE_SIZE]; off_t fpos = ftello(xc->handle); int len = strlen(dat); fstWriterFseeko(xc, xc->handle, FST_HDR_OFFS_DATE, SEEK_SET); memset(s, 0, FST_HDR_DATE_SIZE); memcpy(s, dat, (len < FST_HDR_DATE_SIZE) ? len : FST_HDR_DATE_SIZE); fstFwrite(s, FST_HDR_DATE_SIZE, 1, xc->handle); fflush(xc->handle); fstWriterFseeko(xc, xc->handle, fpos, SEEK_SET); } } void fstWriterSetVersion(void *ctx, const char *vers) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; if(xc && vers) { char s[FST_HDR_SIM_VERSION_SIZE]; off_t fpos = ftello(xc->handle); int len = strlen(vers); fstWriterFseeko(xc, xc->handle, FST_HDR_OFFS_SIM_VERSION, SEEK_SET); memset(s, 0, FST_HDR_SIM_VERSION_SIZE); memcpy(s, vers, (len < FST_HDR_SIM_VERSION_SIZE) ? len : FST_HDR_SIM_VERSION_SIZE); fstFwrite(s, FST_HDR_SIM_VERSION_SIZE, 1, xc->handle); fflush(xc->handle); fstWriterFseeko(xc, xc->handle, fpos, SEEK_SET); } } void fstWriterSetFileType(void *ctx, enum fstFileType filetype) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; if(xc) { if(/*(filetype >= FST_FT_MIN) &&*/ (filetype <= FST_FT_MAX)) { off_t fpos = ftello(xc->handle); xc->filetype = filetype; fstWriterFseeko(xc, xc->handle, FST_HDR_OFFS_FILETYPE, SEEK_SET); fputc(xc->filetype, xc->handle); fflush(xc->handle); fstWriterFseeko(xc, xc->handle, fpos, SEEK_SET); } } } static void fstWriterSetAttrDoubleArgGeneric(void *ctx, int typ, uint64_t arg1, uint64_t arg2) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; if(xc) { unsigned char buf[11]; /* ceil(64/7) = 10 + null term */ unsigned char *pnt = fstCopyVarint64ToRight(buf, arg1); if(arg1) { *pnt = 0; /* this converts any *nonzero* arg1 when made a varint into a null-term string */ } fstWriterSetAttrBegin(xc, FST_AT_MISC, typ, (char *)buf, arg2); } } static void fstWriterSetAttrGeneric(void *ctx, const char *comm, int typ, uint64_t arg) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; if(xc && comm) { char *s = strdup(comm); char *sf = s; while(*s) { if((*s == '\n') || (*s == '\r')) *s = ' '; s++; } fstWriterSetAttrBegin(xc, FST_AT_MISC, typ, sf, arg); free(sf); } } static void fstWriterSetSourceStem_2(void *ctx, const char *path, unsigned int line, unsigned int use_realpath, int typ) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; if(xc && path && path[0]) { uint64_t sidx = 0; int slen = strlen(path); #ifndef _WAVE_HAVE_JUDY const uint32_t hashmask = FST_PATH_HASHMASK; const unsigned char *path2 = (const unsigned char *)path; PPvoid_t pv; #else char *path2 = alloca(slen + 1); /* judy lacks const qualifier in its JudyHSIns definition */ PPvoid_t pv; strcpy(path2, path); #endif pv = JudyHSIns(&(xc->path_array), path2, slen, NULL); if(*pv) { sidx = (intptr_t)(*pv); } else { char *rp = NULL; sidx = ++xc->path_array_count; *pv = (void *)(intptr_t)(xc->path_array_count); if(use_realpath) { rp = fstRealpath( #ifndef _WAVE_HAVE_JUDY (const char *) #endif path2, NULL); } fstWriterSetAttrGeneric(xc, rp ? rp : #ifndef _WAVE_HAVE_JUDY (const char *) #endif path2, FST_MT_PATHNAME, sidx); if(rp) { free(rp); } } fstWriterSetAttrDoubleArgGeneric(xc, typ, sidx, line); } } void fstWriterSetSourceStem(void *ctx, const char *path, unsigned int line, unsigned int use_realpath) { fstWriterSetSourceStem_2(ctx, path, line, use_realpath, FST_MT_SOURCESTEM); } void fstWriterSetSourceInstantiationStem(void *ctx, const char *path, unsigned int line, unsigned int use_realpath) { fstWriterSetSourceStem_2(ctx, path, line, use_realpath, FST_MT_SOURCEISTEM); } void fstWriterSetComment(void *ctx, const char *comm) { fstWriterSetAttrGeneric(ctx, comm, FST_MT_COMMENT, 0); } void fstWriterSetValueList(void *ctx, const char *vl) { fstWriterSetAttrGeneric(ctx, vl, FST_MT_VALUELIST, 0); } void fstWriterSetEnvVar(void *ctx, const char *envvar) { fstWriterSetAttrGeneric(ctx, envvar, FST_MT_ENVVAR, 0); } void fstWriterSetTimescale(void *ctx, int ts) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; if(xc) { off_t fpos = ftello(xc->handle); fstWriterFseeko(xc, xc->handle, FST_HDR_OFFS_TIMESCALE, SEEK_SET); fputc(ts & 255, xc->handle); fflush(xc->handle); fstWriterFseeko(xc, xc->handle, fpos, SEEK_SET); } } void fstWriterSetTimescaleFromString(void *ctx, const char *s) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; if(xc && s) { int mat = 0; int seconds_exp = -9; int tv = atoi(s); const char *pnt = s; while(*pnt) { switch(*pnt) { case 'm': seconds_exp = -3; mat = 1; break; case 'u': seconds_exp = -6; mat = 1; break; case 'n': seconds_exp = -9; mat = 1; break; case 'p': seconds_exp = -12; mat = 1; break; case 'f': seconds_exp = -15; mat = 1; break; case 'a': seconds_exp = -18; mat = 1; break; case 'z': seconds_exp = -21; mat = 1; break; case 's': seconds_exp = 0; mat = 1; break; default: break; } if(mat) break; pnt++; } if(tv == 10) { seconds_exp++; } else if(tv == 100) { seconds_exp+=2; } fstWriterSetTimescale(ctx, seconds_exp); } } void fstWriterSetTimezero(void *ctx, int64_t tim) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; if(xc) { off_t fpos = ftello(xc->handle); fstWriterFseeko(xc, xc->handle, FST_HDR_OFFS_TIMEZERO, SEEK_SET); fstWriterUint64(xc->handle, (xc->timezero = tim)); fflush(xc->handle); fstWriterFseeko(xc, xc->handle, fpos, SEEK_SET); } } void fstWriterSetPackType(void *ctx, enum fstWriterPackType typ) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; if(xc) { xc->fastpack = (typ != FST_WR_PT_ZLIB); xc->fourpack = (typ == FST_WR_PT_LZ4); } } void fstWriterSetRepackOnClose(void *ctx, int enable) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; if(xc) { xc->repack_on_close = (enable != 0); } } void fstWriterSetParallelMode(void *ctx, int enable) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; if(xc) { xc->parallel_was_enabled |= xc->parallel_enabled; /* make sticky */ xc->parallel_enabled = (enable != 0); #ifndef FST_WRITER_PARALLEL if(xc->parallel_enabled) { fprintf(stderr, "ERROR: fstWriterSetParallelMode(), FST_WRITER_PARALLEL not enabled during compile, exiting.\n"); exit(255); } #endif } } void fstWriterSetDumpSizeLimit(void *ctx, uint64_t numbytes) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; if(xc) { xc->dump_size_limit = numbytes; } } int fstWriterGetDumpSizeLimitReached(void *ctx) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; if(xc) { return(xc->size_limit_locked != 0); } return(0); } int fstWriterGetFseekFailed(void *ctx) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; if(xc) { return(xc->fseek_failed != 0); } return(0); } /* * writer attr/scope/var creation: * fstWriterCreateVar2() is used to dump VHDL or other languages, but the * underlying variable needs to map to Verilog/SV via the proper fstVarType vt */ fstHandle fstWriterCreateVar2(void *ctx, enum fstVarType vt, enum fstVarDir vd, uint32_t len, const char *nam, fstHandle aliasHandle, const char *type, enum fstSupplementalVarType svt, enum fstSupplementalDataType sdt) { fstWriterSetAttrGeneric(ctx, type ? type : "", FST_MT_SUPVAR, (svt<valpos_mem) { fstDestroyMmaps(xc, 0); } fputc(vt, xc->hier_handle); fputc(vd, xc->hier_handle); nlen = strlen(nam); fstFwrite(nam, nlen, 1, xc->hier_handle); fputc(0, xc->hier_handle); xc->hier_file_len += (nlen+3); if((vt == FST_VT_VCD_REAL) || (vt == FST_VT_VCD_REAL_PARAMETER) || (vt == FST_VT_VCD_REALTIME) || (vt == FST_VT_SV_SHORTREAL)) { is_real = 1; len = 8; /* recast number of bytes to that of what a double is */ } else { is_real = 0; if(vt == FST_VT_GEN_STRING) { len = 0; } } xc->hier_file_len += fstWriterVarint(xc->hier_handle, len); if(aliasHandle > xc->maxhandle) aliasHandle = 0; xc->hier_file_len += fstWriterVarint(xc->hier_handle, aliasHandle); xc->numsigs++; if(xc->numsigs == xc->next_huge_break) { if(xc->fst_break_size < xc->fst_huge_break_size) { xc->next_huge_break += FST_ACTIVATE_HUGE_INC; xc->fst_break_size += xc->fst_orig_break_size; xc->fst_break_add_size += xc->fst_orig_break_add_size; xc->vchg_alloc_siz = xc->fst_break_size + xc->fst_break_add_size; if(xc->vchg_mem) { xc->vchg_mem = realloc(xc->vchg_mem, xc->vchg_alloc_siz); } } } if(!aliasHandle) { uint32_t zero = 0; if(len) { fstWriterVarint(xc->geom_handle, !is_real ? len : 0); /* geom section encodes reals as zero byte */ } else { fstWriterVarint(xc->geom_handle, 0xFFFFFFFF); /* geom section encodes zero len as 32b -1 */ } fstFwrite(&xc->maxvalpos, sizeof(uint32_t), 1, xc->valpos_handle); fstFwrite(&len, sizeof(uint32_t), 1, xc->valpos_handle); fstFwrite(&zero, sizeof(uint32_t), 1, xc->valpos_handle); fstFwrite(&zero, sizeof(uint32_t), 1, xc->valpos_handle); if(!is_real) { for(i=0;icurval_handle); } } else { fstFwrite(&xc->nan, 8, 1, xc->curval_handle); /* initialize doubles to NaN rather than x */ } xc->maxvalpos+=len; xc->maxhandle++; return(xc->maxhandle); } else { return(aliasHandle); } } return(0); } void fstWriterSetScope(void *ctx, enum fstScopeType scopetype, const char *scopename, const char *scopecomp) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; if(xc) { fputc(FST_ST_VCD_SCOPE, xc->hier_handle); if(/*(scopetype < FST_ST_VCD_MODULE) ||*/ (scopetype > FST_ST_MAX)) { scopetype = FST_ST_VCD_MODULE; } fputc(scopetype, xc->hier_handle); fprintf(xc->hier_handle, "%s%c%s%c", scopename ? scopename : "", 0, scopecomp ? scopecomp : "", 0); if(scopename) { xc->hier_file_len += strlen(scopename); } if(scopecomp) { xc->hier_file_len += strlen(scopecomp); } xc->hier_file_len += 4; /* FST_ST_VCD_SCOPE + scopetype + two string terminating zeros */ xc->numscopes++; } } void fstWriterSetUpscope(void *ctx) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; if(xc) { fputc(FST_ST_VCD_UPSCOPE, xc->hier_handle); xc->hier_file_len++; } } void fstWriterSetAttrBegin(void *ctx, enum fstAttrType attrtype, int subtype, const char *attrname, uint64_t arg) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; if(xc) { fputc(FST_ST_GEN_ATTRBEGIN, xc->hier_handle); if(/*(attrtype < FST_AT_MISC) ||*/ (attrtype > FST_AT_MAX)) { attrtype = FST_AT_MISC; subtype = FST_MT_UNKNOWN; } fputc(attrtype, xc->hier_handle); switch(attrtype) { case FST_AT_ARRAY: if((subtype < FST_AR_NONE) || (subtype > FST_AR_MAX)) subtype = FST_AR_NONE; break; case FST_AT_ENUM: if((subtype < FST_EV_SV_INTEGER) || (subtype > FST_EV_MAX)) subtype = FST_EV_SV_INTEGER; break; case FST_AT_PACK: if((subtype < FST_PT_NONE) || (subtype > FST_PT_MAX)) subtype = FST_PT_NONE; break; case FST_AT_MISC: default: break; } fputc(subtype, xc->hier_handle); fprintf(xc->hier_handle, "%s%c", attrname ? attrname : "", 0); if(attrname) { xc->hier_file_len += strlen(attrname); } xc->hier_file_len += 4; /* FST_ST_GEN_ATTRBEGIN + type + subtype + string terminating zero */ xc->hier_file_len += fstWriterVarint(xc->hier_handle, arg); } } void fstWriterSetAttrEnd(void *ctx) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; if(xc) { fputc(FST_ST_GEN_ATTREND, xc->hier_handle); xc->hier_file_len++; } } /* * value and time change emission */ void fstWriterEmitValueChange(void *ctx, fstHandle handle, const void *val) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; const unsigned char *buf = (const unsigned char *)val; uint32_t offs; int len; if((xc) && (handle <= xc->maxhandle)) { uint32_t fpos; uint32_t *vm4ip; if(!xc->valpos_mem) { xc->vc_emitted = 1; fstWriterCreateMmaps(xc); } handle--; /* move starting at 1 index to starting at 0 */ vm4ip = &(xc->valpos_mem[4*handle]); len = vm4ip[1]; if(len) /* len of zero = variable length, use fstWriterEmitVariableLengthValueChange */ { if(!xc->is_initial_time) { fpos = xc->vchg_siz; if((fpos + len + 10) > xc->vchg_alloc_siz) { xc->vchg_alloc_siz += (xc->fst_break_add_size + len); /* +len added in the case of extremely long vectors and small break add sizes */ xc->vchg_mem = realloc(xc->vchg_mem, xc->vchg_alloc_siz); if(!xc->vchg_mem) { fprintf(stderr, "FATAL ERROR, could not realloc() in fstWriterEmitValueChange, exiting.\n"); exit(255); } } #ifdef FST_REMOVE_DUPLICATE_VC offs = vm4ip[0]; if(len != 1) { if((vm4ip[3]==xc->tchn_idx)&&(vm4ip[2])) { unsigned char *old_value = xc->vchg_mem + vm4ip[2] + 4; /* the +4 skips old vm4ip[2] value */ while(*(old_value++) & 0x80) { /* skips over varint encoded "xc->tchn_idx - vm4ip[3]" */ } memcpy(old_value, buf, len); /* overlay new value */ memcpy(xc->curval_mem + offs, buf, len); return; } else { if(!memcmp(xc->curval_mem + offs, buf, len)) { if(!xc->curtime) { int i; for(i=0;icurval_mem + offs, buf, len); } else { if((vm4ip[3]==xc->tchn_idx)&&(vm4ip[2])) { unsigned char *old_value = xc->vchg_mem + vm4ip[2] + 4; /* the +4 skips old vm4ip[2] value */ while(*(old_value++) & 0x80) { /* skips over varint encoded "xc->tchn_idx - vm4ip[3]" */ } *old_value = *buf; /* overlay new value */ *(xc->curval_mem + offs) = *buf; return; } else { if((*(xc->curval_mem + offs)) == (*buf)) { if(!xc->curtime) { if(*buf != 'x') return; } else { return; } } } *(xc->curval_mem + offs) = *buf; } #endif xc->vchg_siz += fstWriterUint32WithVarint32(xc, &vm4ip[2], xc->tchn_idx - vm4ip[3], buf, len); /* do one fwrite op only */ vm4ip[3] = xc->tchn_idx; vm4ip[2] = fpos; } else { offs = vm4ip[0]; memcpy(xc->curval_mem + offs, buf, len); } } } } void fstWriterEmitVariableLengthValueChange(void *ctx, fstHandle handle, const void *val, uint32_t len) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; const unsigned char *buf = (const unsigned char *)val; if((xc) && (handle <= xc->maxhandle)) { uint32_t fpos; uint32_t *vm4ip; if(!xc->valpos_mem) { xc->vc_emitted = 1; fstWriterCreateMmaps(xc); } handle--; /* move starting at 1 index to starting at 0 */ vm4ip = &(xc->valpos_mem[4*handle]); /* there is no initial time dump for variable length value changes */ if(!vm4ip[1]) /* len of zero = variable length */ { fpos = xc->vchg_siz; if((fpos + len + 10 + 5) > xc->vchg_alloc_siz) { xc->vchg_alloc_siz += (xc->fst_break_add_size + len + 5); /* +len added in the case of extremely long vectors and small break add sizes */ xc->vchg_mem = realloc(xc->vchg_mem, xc->vchg_alloc_siz); if(!xc->vchg_mem) { fprintf(stderr, "FATAL ERROR, could not realloc() in fstWriterEmitVariableLengthValueChange, exiting.\n"); exit(255); } } xc->vchg_siz += fstWriterUint32WithVarint32AndLength(xc, &vm4ip[2], xc->tchn_idx - vm4ip[3], buf, len); /* do one fwrite op only */ vm4ip[3] = xc->tchn_idx; vm4ip[2] = fpos; } } } void fstWriterEmitTimeChange(void *ctx, uint64_t tim) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; unsigned int i; int skip = 0; if(xc) { if(xc->is_initial_time) { if(xc->size_limit_locked) /* this resets xc->is_initial_time to one */ { return; } if(!xc->valpos_mem) { fstWriterCreateMmaps(xc); } skip = 1; xc->firsttime = (xc->vc_emitted) ? 0: tim; xc->curtime = 0; xc->vchg_mem[0] = '!'; xc->vchg_siz = 1; fstWriterEmitSectionHeader(xc); for(i=0;imaxhandle;i++) { xc->valpos_mem[4*i+2] = 0; /* zero out offset val */ xc->valpos_mem[4*i+3] = 0; /* zero out last time change val */ } xc->is_initial_time = 0; } else { if((xc->vchg_siz >= xc->fst_break_size) || (xc->flush_context_pending)) { xc->flush_context_pending = 0; fstWriterFlushContextPrivate(xc); xc->tchn_cnt++; fstWriterVarint(xc->tchn_handle, xc->curtime); } } if(!skip) { xc->tchn_idx++; } fstWriterVarint(xc->tchn_handle, tim - xc->curtime); xc->tchn_cnt++; xc->curtime = tim; } } void fstWriterEmitDumpActive(void *ctx, int enable) { struct fstWriterContext *xc = (struct fstWriterContext *)ctx; if(xc) { struct fstBlackoutChain *b = calloc(1, sizeof(struct fstBlackoutChain)); b->tim = xc->curtime; b->active = (enable != 0); xc->num_blackouts++; if(xc->blackout_curr) { xc->blackout_curr->next = b; xc->blackout_curr = b; } else { xc->blackout_head = b; xc->blackout_curr = b; } } } /***********************/ /*** ***/ /*** reader function ***/ /*** ***/ /***********************/ /* * private structs */ static const char *vartypes[] = { "event", "integer", "parameter", "real", "real_parameter", "reg", "supply0", "supply1", "time", "tri", "triand", "trior", "trireg", "tri0", "tri1", "wand", "wire", "wor", "port", "sparray", "realtime", "string", "bit", "logic", "int", "shortint", "longint", "byte", "enum", "shortreal" }; static const char *modtypes[] = { "module", "task", "function", "begin", "fork", "generate", "struct", "union", "class", "interface", "package", "program", "vhdl_architecture", "vhdl_procedure", "vhdl_function", "vhdl_record", "vhdl_process", "vhdl_block", "vhdl_for_generate", "vhdl_if_generate", "vhdl_generate", "vhdl_package" }; static const char *attrtypes[] = { "misc", "array", "enum", "class" }; static const char *arraytypes[] = { "none", "unpacked", "packed", "sparse" }; static const char *enumvaluetypes[] = { "integer", "bit", "logic", "int", "shortint", "longint", "byte", "unsigned_integer", "unsigned_bit", "unsigned_logic", "unsigned_int", "unsigned_shortint", "unsigned_longint", "unsigned_byte" }; static const char *packtypes[] = { "none", "unpacked", "packed", "tagged_packed" }; struct fstCurrHier { struct fstCurrHier *prev; void *user_info; int len; }; struct fstReaderContext { /* common entries */ FILE *f, *fh; uint64_t start_time, end_time; uint64_t mem_used_by_writer; uint64_t scope_count; uint64_t var_count; fstHandle maxhandle; uint64_t num_alias; uint64_t vc_section_count; uint32_t *signal_lens; /* maxhandle sized */ unsigned char *signal_typs; /* maxhandle sized */ unsigned char *process_mask; /* maxhandle-based, bitwise sized */ uint32_t longest_signal_value_len; /* longest len value encountered */ unsigned char *temp_signal_value_buf; /* malloced for len in longest_signal_value_len */ signed char timescale; unsigned char filetype; unsigned use_vcd_extensions : 1; unsigned double_endian_match : 1; unsigned native_doubles_for_cb : 1; unsigned contains_geom_section : 1; unsigned contains_hier_section : 1; /* valid for hier_pos */ unsigned contains_hier_section_lz4duo : 1; /* valid for hier_pos (contains_hier_section_lz4 always also set) */ unsigned contains_hier_section_lz4 : 1; /* valid for hier_pos */ unsigned limit_range_valid : 1; /* valid for limit_range_start, limit_range_end */ char version[FST_HDR_SIM_VERSION_SIZE + 1]; char date[FST_HDR_DATE_SIZE + 1]; int64_t timezero; char *filename, *filename_unpacked; off_t hier_pos; uint32_t num_blackouts; uint64_t *blackout_times; unsigned char *blackout_activity; uint64_t limit_range_start, limit_range_end; /* entries specific to read value at time functions */ unsigned rvat_data_valid : 1; uint64_t *rvat_time_table; uint64_t rvat_beg_tim, rvat_end_tim; unsigned char *rvat_frame_data; uint64_t rvat_frame_maxhandle; off_t *rvat_chain_table; uint32_t *rvat_chain_table_lengths; uint64_t rvat_vc_maxhandle; off_t rvat_vc_start; uint32_t *rvat_sig_offs; int rvat_packtype; uint32_t rvat_chain_len; unsigned char *rvat_chain_mem; fstHandle rvat_chain_facidx; uint32_t rvat_chain_pos_tidx; uint32_t rvat_chain_pos_idx; uint64_t rvat_chain_pos_time; unsigned rvat_chain_pos_valid : 1; /* entries specific to hierarchy traversal */ struct fstHier hier; struct fstCurrHier *curr_hier; fstHandle current_handle; char *curr_flat_hier_nam; int flat_hier_alloc_len; unsigned do_rewind : 1; char str_scope_nam[FST_ID_NAM_SIZ+1]; char str_scope_comp[FST_ID_NAM_SIZ+1]; unsigned fseek_failed : 1; /* self-buffered I/O for writes */ #ifndef FST_WRITEX_DISABLE int writex_pos; int writex_fd; unsigned char writex_buf[FST_WRITEX_MAX]; #endif char *f_nam; char *fh_nam; }; int fstReaderFseeko(struct fstReaderContext *xc, FILE *stream, off_t offset, int whence) { int rc = fseeko(stream, offset, whence); if(rc<0) { xc->fseek_failed = 1; #ifdef FST_DEBUG fprintf(stderr, "Seek to #%"PRId64" (whence = %d) failed!\n", offset, whence); perror("Why"); #endif } return(rc); } #ifndef FST_WRITEX_DISABLE static void fstWritex(struct fstReaderContext *xc, void *v, int len) { unsigned char *s = (unsigned char *)v; if(len) { if(len < FST_WRITEX_MAX) { if(xc->writex_pos + len >= FST_WRITEX_MAX) { fstWritex(xc, NULL, 0); } memcpy(xc->writex_buf + xc->writex_pos, s, len); xc->writex_pos += len; } else { fstWritex(xc, NULL, 0); if (write(xc->writex_fd, s, len)) { }; } } else { if(xc->writex_pos) { if(write(xc->writex_fd, xc->writex_buf, xc->writex_pos)) { }; xc->writex_pos = 0; } } } #endif /* * scope -> flat name handling */ static void fstReaderDeallocateScopeData(struct fstReaderContext *xc) { struct fstCurrHier *chp; free(xc->curr_flat_hier_nam); xc->curr_flat_hier_nam = NULL; while(xc->curr_hier) { chp = xc->curr_hier->prev; free(xc->curr_hier); xc->curr_hier = chp; } } const char *fstReaderGetCurrentFlatScope(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; if(xc) { return(xc->curr_flat_hier_nam ? xc->curr_flat_hier_nam : ""); } else { return(NULL); } } void *fstReaderGetCurrentScopeUserInfo(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; if(xc) { return(xc->curr_hier ? xc->curr_hier->user_info : NULL); } else { return(NULL); } } const char *fstReaderPopScope(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; if(xc && xc->curr_hier) { struct fstCurrHier *ch = xc->curr_hier; if(xc->curr_hier->prev) { xc->curr_flat_hier_nam[xc->curr_hier->prev->len] = 0; } else { *xc->curr_flat_hier_nam = 0; } xc->curr_hier = xc->curr_hier->prev; free(ch); return(xc->curr_flat_hier_nam ? xc->curr_flat_hier_nam : ""); } return(NULL); } void fstReaderResetScope(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; if(xc) { while(fstReaderPopScope(xc)); /* remove any already-built scoping info */ } } const char *fstReaderPushScope(void *ctx, const char *nam, void *user_info) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; if(xc) { struct fstCurrHier *ch = malloc(sizeof(struct fstCurrHier)); int chl = xc->curr_hier ? xc->curr_hier->len : 0; int len = chl + 1 + strlen(nam); if(len >= xc->flat_hier_alloc_len) { xc->curr_flat_hier_nam = xc->curr_flat_hier_nam ? realloc(xc->curr_flat_hier_nam, len+1) : malloc(len+1); } if(chl) { xc->curr_flat_hier_nam[chl] = '.'; strcpy(xc->curr_flat_hier_nam + chl + 1, nam); } else { strcpy(xc->curr_flat_hier_nam, nam); len--; } ch->len = len; ch->prev = xc->curr_hier; ch->user_info = user_info; xc->curr_hier = ch; return(xc->curr_flat_hier_nam); } return(NULL); } int fstReaderGetCurrentScopeLen(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; if(xc && xc->curr_hier) { return(xc->curr_hier->len); } return(0); } int fstReaderGetFseekFailed(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; if(xc) { return(xc->fseek_failed != 0); } return(0); } /* * iter mask manipulation util functions */ int fstReaderGetFacProcessMask(void *ctx, fstHandle facidx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; if(xc) { facidx--; if(facidxmaxhandle) { int process_idx = facidx/8; int process_bit = facidx&7; return( (xc->process_mask[process_idx]&(1<maxhandle) { int idx = facidx/8; int bitpos = facidx&7; xc->process_mask[idx] |= (1<maxhandle) { int idx = facidx/8; int bitpos = facidx&7; xc->process_mask[idx] &= (~(1<process_mask, 0xff, (xc->maxhandle+7)/8); } } void fstReaderClrFacProcessMaskAll(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; if(xc) { memset(xc->process_mask, 0x00, (xc->maxhandle+7)/8); } } /* * various utility read/write functions */ signed char fstReaderGetTimescale(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; return(xc ? xc->timescale : 0); } uint64_t fstReaderGetStartTime(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; return(xc ? xc->start_time : 0); } uint64_t fstReaderGetEndTime(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; return(xc ? xc->end_time : 0); } uint64_t fstReaderGetMemoryUsedByWriter(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; return(xc ? xc->mem_used_by_writer : 0); } uint64_t fstReaderGetScopeCount(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; return(xc ? xc->scope_count : 0); } uint64_t fstReaderGetVarCount(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; return(xc ? xc->var_count : 0); } fstHandle fstReaderGetMaxHandle(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; return(xc ? xc->maxhandle : 0); } uint64_t fstReaderGetAliasCount(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; return(xc ? xc->num_alias : 0); } uint64_t fstReaderGetValueChangeSectionCount(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; return(xc ? xc->vc_section_count : 0); } int fstReaderGetDoubleEndianMatchState(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; return(xc ? xc->double_endian_match : 0); } const char *fstReaderGetVersionString(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; return(xc ? xc->version : NULL); } const char *fstReaderGetDateString(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; return(xc ? xc->date : NULL); } int fstReaderGetFileType(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; return(xc ? xc->filetype : FST_FT_VERILOG); } int64_t fstReaderGetTimezero(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; return(xc ? xc->timezero : 0); } uint32_t fstReaderGetNumberDumpActivityChanges(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; return(xc ? xc->num_blackouts : 0); } uint64_t fstReaderGetDumpActivityChangeTime(void *ctx, uint32_t idx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; if(xc && (idx < xc->num_blackouts) && (xc->blackout_times)) { return(xc->blackout_times[idx]); } else { return(0); } } unsigned char fstReaderGetDumpActivityChangeValue(void *ctx, uint32_t idx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; if(xc && (idx < xc->num_blackouts) && (xc->blackout_activity)) { return(xc->blackout_activity[idx]); } else { return(0); } } void fstReaderSetLimitTimeRange(void *ctx, uint64_t start_time, uint64_t end_time) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; if(xc) { xc->limit_range_valid = 1; xc->limit_range_start = start_time; xc->limit_range_end = end_time; } } void fstReaderSetUnlimitedTimeRange(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; if(xc) { xc->limit_range_valid = 0; } } void fstReaderSetVcdExtensions(void *ctx, int enable) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; if(xc) { xc->use_vcd_extensions = (enable != 0); } } void fstReaderIterBlocksSetNativeDoublesOnCallback(void *ctx, int enable) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; if(xc) { xc->native_doubles_for_cb = (enable != 0); } } /* * hierarchy processing */ static void fstVcdID(char *buf, unsigned int value) { char *pnt = buf; /* zero is illegal for a value...it is assumed they start at one */ while (value) { value--; *(pnt++) = (char)('!' + value % 94); value = value / 94; } *pnt = 0; } static int fstVcdIDForFwrite(char *buf, unsigned int value) { char *pnt = buf; /* zero is illegal for a value...it is assumed they start at one */ while (value) { value--; *(pnt++) = (char)('!' + value % 94); value = value / 94; } return(pnt - buf); } static int fstReaderRecreateHierFile(struct fstReaderContext *xc) { int pass_status = 1; if(!xc->fh) { off_t offs_cache = ftello(xc->f); char *fnam = malloc(strlen(xc->filename) + 6 + 16 + 32 + 1); unsigned char *mem = malloc(FST_GZIO_LEN); off_t hl, uclen; off_t clen = 0; gzFile zhandle = NULL; int zfd; int htyp = FST_BL_SKIP; /* can't handle both set at once should never happen in a real file */ if(!xc->contains_hier_section_lz4 && xc->contains_hier_section) { htyp = FST_BL_HIER; } else if(xc->contains_hier_section_lz4 && !xc->contains_hier_section) { htyp = xc->contains_hier_section_lz4duo ? FST_BL_HIER_LZ4DUO : FST_BL_HIER_LZ4; } sprintf(fnam, "%s.hier_%d_%p", xc->filename, getpid(), (void *)xc); fstReaderFseeko(xc, xc->f, xc->hier_pos, SEEK_SET); uclen = fstReaderUint64(xc->f); #ifndef __MINGW32__ fflush(xc->f); #endif if(htyp == FST_BL_HIER) { fstReaderFseeko(xc, xc->f, xc->hier_pos, SEEK_SET); uclen = fstReaderUint64(xc->f); #ifndef __MINGW32__ fflush(xc->f); #endif zfd = dup(fileno(xc->f)); zhandle = gzdopen(zfd, "rb"); if(!zhandle) { close(zfd); free(mem); free(fnam); return(0); } } else if((htyp == FST_BL_HIER_LZ4) || (htyp == FST_BL_HIER_LZ4DUO)) { fstReaderFseeko(xc, xc->f, xc->hier_pos - 8, SEEK_SET); /* get section len */ clen = fstReaderUint64(xc->f) - 16; uclen = fstReaderUint64(xc->f); #ifndef __MINGW32__ fflush(xc->f); #endif } #ifndef __MINGW32__ xc->fh = fopen(fnam, "w+b"); if(!xc->fh) #endif { xc->fh = tmpfile_open(&xc->fh_nam); free(fnam); fnam = NULL; if(!xc->fh) { tmpfile_close(&xc->fh, &xc->fh_nam); free(mem); return(0); } } #ifndef __MINGW32__ if(fnam) unlink(fnam); #endif if(htyp == FST_BL_HIER) { for(hl = 0; hl < uclen; hl += FST_GZIO_LEN) { size_t len = ((uclen - hl) > FST_GZIO_LEN) ? FST_GZIO_LEN : (uclen - hl); size_t gzreadlen = gzread(zhandle, mem, len); /* rc should equal len... */ size_t fwlen; if(gzreadlen != len) { pass_status = 0; break; } fwlen = fstFwrite(mem, len, 1, xc->fh); if(fwlen != 1) { pass_status = 0; break; } } gzclose(zhandle); } else if(htyp == FST_BL_HIER_LZ4DUO) { unsigned char *lz4_cmem = malloc(clen); unsigned char *lz4_ucmem = malloc(uclen); unsigned char *lz4_ucmem2; uint64_t uclen2; int skiplen2 = 0; fstFread(lz4_cmem, clen, 1, xc->f); uclen2 = fstGetVarint64(lz4_cmem, &skiplen2); lz4_ucmem2 = malloc(uclen2); pass_status = (uclen2 == (uint64_t)LZ4_decompress_safe_partial ((char *)lz4_cmem + skiplen2, (char *)lz4_ucmem2, clen - skiplen2, uclen2, uclen2)); if(pass_status) { pass_status = (uclen == LZ4_decompress_safe_partial ((char *)lz4_ucmem2, (char *)lz4_ucmem, uclen2, uclen, uclen)); if(fstFwrite(lz4_ucmem, uclen, 1, xc->fh) != 1) { pass_status = 0; } } free(lz4_ucmem2); free(lz4_ucmem); free(lz4_cmem); } else if(htyp == FST_BL_HIER_LZ4) { unsigned char *lz4_cmem = malloc(clen); unsigned char *lz4_ucmem = malloc(uclen); fstFread(lz4_cmem, clen, 1, xc->f); pass_status = (uclen == LZ4_decompress_safe_partial ((char *)lz4_cmem, (char *)lz4_ucmem, clen, uclen, uclen)); if(fstFwrite(lz4_ucmem, uclen, 1, xc->fh) != 1) { pass_status = 0; } free(lz4_ucmem); free(lz4_cmem); } else /* FST_BL_SKIP */ { pass_status = 0; } free(mem); free(fnam); fstReaderFseeko(xc, xc->f, offs_cache, SEEK_SET); } return(pass_status); } int fstReaderIterateHierRewind(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; int pass_status = 0; if(xc) { pass_status = 1; if(!xc->fh) { pass_status = fstReaderRecreateHierFile(xc); } xc->do_rewind = 1; } return(pass_status); } struct fstHier *fstReaderIterateHier(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; int isfeof; fstHandle alias; char *pnt; int ch; if(!xc) return(NULL); if(!xc->fh) { if(!fstReaderRecreateHierFile(xc)) { return(NULL); } } if(xc->do_rewind) { xc->do_rewind = 0; xc->current_handle = 0; fstReaderFseeko(xc, xc->fh, 0, SEEK_SET); clearerr(xc->fh); } if(!(isfeof=feof(xc->fh))) { int tag = fgetc(xc->fh); switch(tag) { case FST_ST_VCD_SCOPE: xc->hier.htyp = FST_HT_SCOPE; xc->hier.u.scope.typ = fgetc(xc->fh); xc->hier.u.scope.name = pnt = xc->str_scope_nam; while((ch = fgetc(xc->fh))) { *(pnt++) = ch; }; /* scopename */ *pnt = 0; xc->hier.u.scope.name_length = pnt - xc->hier.u.scope.name; xc->hier.u.scope.component = pnt = xc->str_scope_comp; while((ch = fgetc(xc->fh))) { *(pnt++) = ch; }; /* scopecomp */ *pnt = 0; xc->hier.u.scope.component_length = pnt - xc->hier.u.scope.component; break; case FST_ST_VCD_UPSCOPE: xc->hier.htyp = FST_HT_UPSCOPE; break; case FST_ST_GEN_ATTRBEGIN: xc->hier.htyp = FST_HT_ATTRBEGIN; xc->hier.u.attr.typ = fgetc(xc->fh); xc->hier.u.attr.subtype = fgetc(xc->fh); xc->hier.u.attr.name = pnt = xc->str_scope_nam; while((ch = fgetc(xc->fh))) { *(pnt++) = ch; }; /* scopename */ *pnt = 0; xc->hier.u.attr.name_length = pnt - xc->hier.u.scope.name; xc->hier.u.attr.arg = fstReaderVarint64(xc->fh); if(xc->hier.u.attr.typ == FST_AT_MISC) { if((xc->hier.u.attr.subtype == FST_MT_SOURCESTEM)||(xc->hier.u.attr.subtype == FST_MT_SOURCEISTEM)) { int sidx_skiplen_dummy = 0; xc->hier.u.attr.arg_from_name = fstGetVarint64((unsigned char *)xc->str_scope_nam, &sidx_skiplen_dummy); } } break; case FST_ST_GEN_ATTREND: xc->hier.htyp = FST_HT_ATTREND; break; case FST_VT_VCD_EVENT: case FST_VT_VCD_INTEGER: case FST_VT_VCD_PARAMETER: case FST_VT_VCD_REAL: case FST_VT_VCD_REAL_PARAMETER: case FST_VT_VCD_REG: case FST_VT_VCD_SUPPLY0: case FST_VT_VCD_SUPPLY1: case FST_VT_VCD_TIME: case FST_VT_VCD_TRI: case FST_VT_VCD_TRIAND: case FST_VT_VCD_TRIOR: case FST_VT_VCD_TRIREG: case FST_VT_VCD_TRI0: case FST_VT_VCD_TRI1: case FST_VT_VCD_WAND: case FST_VT_VCD_WIRE: case FST_VT_VCD_WOR: case FST_VT_VCD_PORT: case FST_VT_VCD_SPARRAY: case FST_VT_VCD_REALTIME: case FST_VT_GEN_STRING: case FST_VT_SV_BIT: case FST_VT_SV_LOGIC: case FST_VT_SV_INT: case FST_VT_SV_SHORTINT: case FST_VT_SV_LONGINT: case FST_VT_SV_BYTE: case FST_VT_SV_ENUM: case FST_VT_SV_SHORTREAL: xc->hier.htyp = FST_HT_VAR; xc->hier.u.var.svt_workspace = FST_SVT_NONE; xc->hier.u.var.sdt_workspace = FST_SDT_NONE; xc->hier.u.var.sxt_workspace = 0; xc->hier.u.var.typ = tag; xc->hier.u.var.direction = fgetc(xc->fh); xc->hier.u.var.name = pnt = xc->str_scope_nam; while((ch = fgetc(xc->fh))) { *(pnt++) = ch; }; /* varname */ *pnt = 0; xc->hier.u.var.name_length = pnt - xc->hier.u.var.name; xc->hier.u.var.length = fstReaderVarint32(xc->fh); if(tag == FST_VT_VCD_PORT) { xc->hier.u.var.length -= 2; /* removal of delimiting spaces */ xc->hier.u.var.length /= 3; /* port -> signal size adjust */ } alias = fstReaderVarint32(xc->fh); if(!alias) { xc->current_handle++; xc->hier.u.var.handle = xc->current_handle; xc->hier.u.var.is_alias = 0; } else { xc->hier.u.var.handle = alias; xc->hier.u.var.is_alias = 1; } break; default: isfeof = 1; break; } } return(!isfeof ? &xc->hier : NULL); } int fstReaderProcessHier(void *ctx, FILE *fv) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; char *str; char *pnt; int ch, scopetype; int vartype; uint32_t len, alias; /* uint32_t maxvalpos=0; */ unsigned int num_signal_dyn = 65536; int attrtype, subtype; uint64_t attrarg; fstHandle maxhandle_scanbuild; if(!xc) return(0); xc->longest_signal_value_len = 32; /* arbitrarily set at 32...this is much longer than an expanded double */ if(!xc->fh) { if(!fstReaderRecreateHierFile(xc)) { return(0); } } str = malloc(FST_ID_NAM_ATTR_SIZ+1); if(fv) { char time_dimension[2] = {0, 0}; int time_scale = 1; fprintf(fv, "$date\n\t%s\n$end\n", xc->date); fprintf(fv, "$version\n\t%s\n$end\n", xc->version); if(xc->timezero) fprintf(fv, "$timezero\n\t%"PRId64"\n$end\n", xc->timezero); switch(xc->timescale) { case 2: time_scale = 100; time_dimension[0] = 0; break; case 1: time_scale = 10; case 0: time_dimension[0] = 0; break; case -1: time_scale = 100; time_dimension[0] = 'm'; break; case -2: time_scale = 10; case -3: time_dimension[0] = 'm'; break; case -4: time_scale = 100; time_dimension[0] = 'u'; break; case -5: time_scale = 10; case -6: time_dimension[0] = 'u'; break; case -10: time_scale = 100; time_dimension[0] = 'p'; break; case -11: time_scale = 10; case -12: time_dimension[0] = 'p'; break; case -13: time_scale = 100; time_dimension[0] = 'f'; break; case -14: time_scale = 10; case -15: time_dimension[0] = 'f'; break; case -16: time_scale = 100; time_dimension[0] = 'a'; break; case -17: time_scale = 10; case -18: time_dimension[0] = 'a'; break; case -19: time_scale = 100; time_dimension[0] = 'z'; break; case -20: time_scale = 10; case -21: time_dimension[0] = 'z'; break; case -7: time_scale = 100; time_dimension[0] = 'n'; break; case -8: time_scale = 10; case -9: default: time_dimension[0] = 'n'; break; } if(fv) fprintf(fv, "$timescale\n\t%d%ss\n$end\n", time_scale, time_dimension); } xc->maxhandle = 0; xc->num_alias = 0; free(xc->signal_lens); xc->signal_lens = malloc(num_signal_dyn*sizeof(uint32_t)); free(xc->signal_typs); xc->signal_typs = malloc(num_signal_dyn*sizeof(unsigned char)); fstReaderFseeko(xc, xc->fh, 0, SEEK_SET); while(!feof(xc->fh)) { int tag = fgetc(xc->fh); switch(tag) { case FST_ST_VCD_SCOPE: scopetype = fgetc(xc->fh); if((scopetype < FST_ST_MIN) || (scopetype > FST_ST_MAX)) scopetype = FST_ST_VCD_MODULE; pnt = str; while((ch = fgetc(xc->fh))) { *(pnt++) = ch; }; /* scopename */ *pnt = 0; while(fgetc(xc->fh)) { }; /* scopecomp */ if(fv) fprintf(fv, "$scope %s %s $end\n", modtypes[scopetype], str); break; case FST_ST_VCD_UPSCOPE: if(fv) fprintf(fv, "$upscope $end\n"); break; case FST_ST_GEN_ATTRBEGIN: attrtype = fgetc(xc->fh); subtype = fgetc(xc->fh); pnt = str; while((ch = fgetc(xc->fh))) { *(pnt++) = ch; }; /* attrname */ *pnt = 0; if(!str[0]) { strcpy(str, "\"\""); } attrarg = fstReaderVarint64(xc->fh); if(fv && xc->use_vcd_extensions) { switch(attrtype) { case FST_AT_ARRAY: if((subtype < FST_AR_NONE) || (subtype > FST_AR_MAX)) subtype = FST_AR_NONE; fprintf(fv, "$attrbegin %s %s %s %"PRId64" $end\n", attrtypes[attrtype], arraytypes[subtype], str, attrarg); break; case FST_AT_ENUM: if((subtype < FST_EV_SV_INTEGER) || (subtype > FST_EV_MAX)) subtype = FST_EV_SV_INTEGER; fprintf(fv, "$attrbegin %s %s %s %"PRId64" $end\n", attrtypes[attrtype], enumvaluetypes[subtype], str, attrarg); break; case FST_AT_PACK: if((subtype < FST_PT_NONE) || (subtype > FST_PT_MAX)) subtype = FST_PT_NONE; fprintf(fv, "$attrbegin %s %s %s %"PRId64" $end\n", attrtypes[attrtype], packtypes[subtype], str, attrarg); break; case FST_AT_MISC: default: attrtype = FST_AT_MISC; if(subtype == FST_MT_COMMENT) { fprintf(fv, "$comment\n\t%s\n$end\n", str); } else { if((subtype == FST_MT_SOURCESTEM)||(subtype == FST_MT_SOURCEISTEM)) { int sidx_skiplen_dummy = 0; uint64_t sidx = fstGetVarint64((unsigned char *)str, &sidx_skiplen_dummy); fprintf(fv, "$attrbegin %s %02x %"PRId64" %"PRId64" $end\n", attrtypes[attrtype], subtype, sidx, attrarg); } else { fprintf(fv, "$attrbegin %s %02x %s %"PRId64" $end\n", attrtypes[attrtype], subtype, str, attrarg); } } break; } } break; case FST_ST_GEN_ATTREND: if(fv && xc->use_vcd_extensions) fprintf(fv, "$attrend $end\n"); break; case FST_VT_VCD_EVENT: case FST_VT_VCD_INTEGER: case FST_VT_VCD_PARAMETER: case FST_VT_VCD_REAL: case FST_VT_VCD_REAL_PARAMETER: case FST_VT_VCD_REG: case FST_VT_VCD_SUPPLY0: case FST_VT_VCD_SUPPLY1: case FST_VT_VCD_TIME: case FST_VT_VCD_TRI: case FST_VT_VCD_TRIAND: case FST_VT_VCD_TRIOR: case FST_VT_VCD_TRIREG: case FST_VT_VCD_TRI0: case FST_VT_VCD_TRI1: case FST_VT_VCD_WAND: case FST_VT_VCD_WIRE: case FST_VT_VCD_WOR: case FST_VT_VCD_PORT: case FST_VT_VCD_SPARRAY: case FST_VT_VCD_REALTIME: case FST_VT_GEN_STRING: case FST_VT_SV_BIT: case FST_VT_SV_LOGIC: case FST_VT_SV_INT: case FST_VT_SV_SHORTINT: case FST_VT_SV_LONGINT: case FST_VT_SV_BYTE: case FST_VT_SV_ENUM: case FST_VT_SV_SHORTREAL: vartype = tag; /* vardir = */ fgetc(xc->fh); /* unused in VCD reader, but need to advance read pointer */ pnt = str; while((ch = fgetc(xc->fh))) { *(pnt++) = ch; }; /* varname */ *pnt = 0; len = fstReaderVarint32(xc->fh); alias = fstReaderVarint32(xc->fh); if(!alias) { if(xc->maxhandle == num_signal_dyn) { num_signal_dyn *= 2; xc->signal_lens = realloc(xc->signal_lens, num_signal_dyn*sizeof(uint32_t)); xc->signal_typs = realloc(xc->signal_typs, num_signal_dyn*sizeof(unsigned char)); } xc->signal_lens[xc->maxhandle] = len; xc->signal_typs[xc->maxhandle] = vartype; /* maxvalpos+=len; */ if(len > xc->longest_signal_value_len) { xc->longest_signal_value_len = len; } if((vartype == FST_VT_VCD_REAL) || (vartype == FST_VT_VCD_REAL_PARAMETER) || (vartype == FST_VT_VCD_REALTIME) || (vartype == FST_VT_SV_SHORTREAL)) { len = (vartype != FST_VT_SV_SHORTREAL) ? 64 : 32; xc->signal_typs[xc->maxhandle] = FST_VT_VCD_REAL; } if(fv) { char vcdid_buf[16]; uint32_t modlen = (vartype != FST_VT_VCD_PORT) ? len : ((len - 2) / 3); fstVcdID(vcdid_buf, xc->maxhandle+1); fprintf(fv, "$var %s %"PRIu32" %s %s $end\n", vartypes[vartype], modlen, vcdid_buf, str); } xc->maxhandle++; } else { if((vartype == FST_VT_VCD_REAL) || (vartype == FST_VT_VCD_REAL_PARAMETER) || (vartype == FST_VT_VCD_REALTIME) || (vartype == FST_VT_SV_SHORTREAL)) { len = (vartype != FST_VT_SV_SHORTREAL) ? 64 : 32; xc->signal_typs[xc->maxhandle] = FST_VT_VCD_REAL; } if(fv) { char vcdid_buf[16]; uint32_t modlen = (vartype != FST_VT_VCD_PORT) ? len : ((len - 2) / 3); fstVcdID(vcdid_buf, alias); fprintf(fv, "$var %s %"PRIu32" %s %s $end\n", vartypes[vartype], modlen, vcdid_buf, str); } xc->num_alias++; } break; default: break; } } if(fv) fprintf(fv, "$enddefinitions $end\n"); maxhandle_scanbuild = xc->maxhandle ? xc->maxhandle : 1; /*scan-build warning suppression, in reality we have at least one signal */ xc->signal_lens = realloc(xc->signal_lens, maxhandle_scanbuild*sizeof(uint32_t)); xc->signal_typs = realloc(xc->signal_typs, maxhandle_scanbuild*sizeof(unsigned char)); free(xc->process_mask); xc->process_mask = calloc(1, (maxhandle_scanbuild+7)/8); free(xc->temp_signal_value_buf); xc->temp_signal_value_buf = malloc(xc->longest_signal_value_len + 1); xc->var_count = xc->maxhandle + xc->num_alias; free(str); return(1); } /* * reader file open/close functions */ int fstReaderInit(struct fstReaderContext *xc) { off_t blkpos = 0; off_t endfile; uint64_t seclen; int sectype; uint64_t vc_section_count_actual = 0; int hdr_incomplete = 0; int hdr_seen = 0; int gzread_pass_status = 1; sectype = fgetc(xc->f); if(sectype == FST_BL_ZWRAPPER) { FILE *fcomp; off_t offpnt, uclen; char gz_membuf[FST_GZIO_LEN]; void *zhandle; int zfd; int flen = strlen(xc->filename); char *hf; seclen = fstReaderUint64(xc->f); uclen = fstReaderUint64(xc->f); if(!seclen) return(0); /* not finished compressing, this is a failed read */ hf = calloc(1, flen + 16 + 32 + 1); sprintf(hf, "%s.upk_%d_%p", xc->filename, getpid(), (void *)xc); fcomp = fopen(hf, "w+b"); if(!fcomp) { fcomp = tmpfile_open(&xc->f_nam); free(hf); hf = NULL; if(!fcomp) { tmpfile_close(&fcomp, &xc->f_nam); return(0); } } #if defined(FST_MACOSX) setvbuf(fcomp, (char *)NULL, _IONBF, 0); /* keeps gzip from acting weird in tandem with fopen */ #endif #ifdef __MINGW32__ setvbuf(fcomp, (char *)NULL, _IONBF, 0); /* keeps gzip from acting weird in tandem with fopen */ xc->filename_unpacked = hf; #else if(hf) { unlink(hf); free(hf); } #endif fstReaderFseeko(xc, xc->f, 1+8+8, SEEK_SET); #ifndef __MINGW32__ fflush(xc->f); #endif zfd = dup(fileno(xc->f)); zhandle = gzdopen(zfd, "rb"); if(zhandle) { for(offpnt = 0; offpnt < uclen; offpnt += FST_GZIO_LEN) { size_t this_len = ((uclen - offpnt) > FST_GZIO_LEN) ? FST_GZIO_LEN : (uclen - offpnt); size_t gzreadlen = gzread(zhandle, gz_membuf, this_len); size_t fwlen; if(gzreadlen != this_len) { gzread_pass_status = 0; break; } fwlen = fstFwrite(gz_membuf, this_len, 1, fcomp); if(fwlen != 1) { gzread_pass_status = 0; break; } } gzclose(zhandle); } else { close(zfd); } fflush(fcomp); fclose(xc->f); xc->f = fcomp; } if(gzread_pass_status) { fstReaderFseeko(xc, xc->f, 0, SEEK_END); endfile = ftello(xc->f); while(blkpos < endfile) { fstReaderFseeko(xc, xc->f, blkpos, SEEK_SET); sectype = fgetc(xc->f); seclen = fstReaderUint64(xc->f); if(sectype == EOF) { break; } if((hdr_incomplete) && (!seclen)) { break; } if(!hdr_seen && (sectype != FST_BL_HDR)) { break; } blkpos++; if(sectype == FST_BL_HDR) { if(!hdr_seen) { int ch; double dcheck; xc->start_time = fstReaderUint64(xc->f); xc->end_time = fstReaderUint64(xc->f); hdr_incomplete = (xc->start_time == 0) && (xc->end_time == 0); fstFread(&dcheck, 8, 1, xc->f); xc->double_endian_match = (dcheck == FST_DOUBLE_ENDTEST); if(!xc->double_endian_match) { union { unsigned char rvs_buf[8]; double d; } vu; unsigned char *dcheck_alias = (unsigned char *)&dcheck; int rvs_idx; for(rvs_idx=0;rvs_idx<8;rvs_idx++) { vu.rvs_buf[rvs_idx] = dcheck_alias[7-rvs_idx]; } if(vu.d != FST_DOUBLE_ENDTEST) { break; /* either corrupt file or wrong architecture (offset +33 also functions as matchword) */ } } hdr_seen = 1; xc->mem_used_by_writer = fstReaderUint64(xc->f); xc->scope_count = fstReaderUint64(xc->f); xc->var_count = fstReaderUint64(xc->f); xc->maxhandle = fstReaderUint64(xc->f); xc->num_alias = xc->var_count - xc->maxhandle; xc->vc_section_count = fstReaderUint64(xc->f); ch = fgetc(xc->f); xc->timescale = (signed char)ch; fstFread(xc->version, FST_HDR_SIM_VERSION_SIZE, 1, xc->f); xc->version[FST_HDR_SIM_VERSION_SIZE] = 0; fstFread(xc->date, FST_HDR_DATE_SIZE, 1, xc->f); xc->date[FST_HDR_DATE_SIZE] = 0; ch = fgetc(xc->f); xc->filetype = (unsigned char)ch; xc->timezero = fstReaderUint64(xc->f); } } else if((sectype == FST_BL_VCDATA) || (sectype == FST_BL_VCDATA_DYN_ALIAS) || (sectype == FST_BL_VCDATA_DYN_ALIAS2)) { if(hdr_incomplete) { uint64_t bt = fstReaderUint64(xc->f); xc->end_time = fstReaderUint64(xc->f); if(!vc_section_count_actual) { xc->start_time = bt; } } vc_section_count_actual++; } else if(sectype == FST_BL_GEOM) { if(!hdr_incomplete) { uint64_t clen = seclen - 24; uint64_t uclen = fstReaderUint64(xc->f); unsigned char *ucdata = malloc(uclen); unsigned char *pnt = ucdata; unsigned int i; xc->contains_geom_section = 1; xc->maxhandle = fstReaderUint64(xc->f); xc->longest_signal_value_len = 32; /* arbitrarily set at 32...this is much longer than an expanded double */ free(xc->process_mask); xc->process_mask = calloc(1, (xc->maxhandle+7)/8); if(clen != uclen) { unsigned char *cdata = malloc(clen); unsigned long destlen = uclen; unsigned long sourcelen = clen; int rc; fstFread(cdata, clen, 1, xc->f); rc = uncompress(ucdata, &destlen, cdata, sourcelen); if(rc != Z_OK) { printf("geom uncompress rc = %d\n", rc); exit(255); } free(cdata); } else { fstFread(ucdata, uclen, 1, xc->f); } free(xc->signal_lens); xc->signal_lens = malloc(sizeof(uint32_t) * xc->maxhandle); free(xc->signal_typs); xc->signal_typs = malloc(sizeof(unsigned char) * xc->maxhandle); for(i=0;imaxhandle;i++) { int skiplen; uint64_t val = fstGetVarint32(pnt, &skiplen); pnt += skiplen; if(val) { xc->signal_lens[i] = (val != 0xFFFFFFFF) ? val : 0; xc->signal_typs[i] = FST_VT_VCD_WIRE; if(xc->signal_lens[i] > xc->longest_signal_value_len) { xc->longest_signal_value_len = xc->signal_lens[i]; } } else { xc->signal_lens[i] = 8; /* backpatch in real */ xc->signal_typs[i] = FST_VT_VCD_REAL; /* xc->longest_signal_value_len handled above by overly large init size */ } } free(xc->temp_signal_value_buf); xc->temp_signal_value_buf = malloc(xc->longest_signal_value_len + 1); free(ucdata); } } else if(sectype == FST_BL_HIER) { xc->contains_hier_section = 1; xc->hier_pos = ftello(xc->f); } else if(sectype == FST_BL_HIER_LZ4DUO) { xc->contains_hier_section_lz4 = 1; xc->contains_hier_section_lz4duo = 1; xc->hier_pos = ftello(xc->f); } else if(sectype == FST_BL_HIER_LZ4) { xc->contains_hier_section_lz4 = 1; xc->hier_pos = ftello(xc->f); } else if(sectype == FST_BL_BLACKOUT) { uint32_t i; uint64_t cur_bl = 0; uint64_t delta; xc->num_blackouts = fstReaderVarint32(xc->f); free(xc->blackout_times); xc->blackout_times = calloc(xc->num_blackouts, sizeof(uint64_t)); free(xc->blackout_activity); xc->blackout_activity = calloc(xc->num_blackouts, sizeof(unsigned char)); for(i=0;inum_blackouts;i++) { xc->blackout_activity[i] = fgetc(xc->f) != 0; delta = fstReaderVarint64(xc->f); cur_bl += delta; xc->blackout_times[i] = cur_bl; } } blkpos += seclen; if(!hdr_seen) break; } if(hdr_seen) { if(xc->vc_section_count != vc_section_count_actual) { xc->vc_section_count = vc_section_count_actual; } if(!xc->contains_geom_section) { fstReaderProcessHier(xc, NULL); /* recreate signal_lens/signal_typs info */ } } } return(hdr_seen); } void *fstReaderOpenForUtilitiesOnly(void) { struct fstReaderContext *xc = calloc(1, sizeof(struct fstReaderContext)); return(xc); } void *fstReaderOpen(const char *nam) { struct fstReaderContext *xc = calloc(1, sizeof(struct fstReaderContext)); if((!nam)||(!(xc->f=fopen(nam, "rb")))) { free(xc); xc=NULL; } else { int flen = strlen(nam); char *hf = calloc(1, flen + 6); int rc; #if defined(__MINGW32__) || defined(FST_MACOSX) setvbuf(xc->f, (char *)NULL, _IONBF, 0); /* keeps gzip from acting weird in tandem with fopen */ #endif memcpy(hf, nam, flen); strcpy(hf + flen, ".hier"); xc->fh = fopen(hf, "rb"); free(hf); xc->filename = strdup(nam); rc = fstReaderInit(xc); if((rc) && (xc->vc_section_count) && (xc->maxhandle) && ((xc->fh)||(xc->contains_hier_section||(xc->contains_hier_section_lz4)))) { /* more init */ xc->do_rewind = 1; } else { fstReaderClose(xc); xc = NULL; } } return(xc); } static void fstReaderDeallocateRvatData(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; if(xc) { free(xc->rvat_chain_mem); xc->rvat_chain_mem = NULL; free(xc->rvat_frame_data); xc->rvat_frame_data = NULL; free(xc->rvat_time_table); xc->rvat_time_table = NULL; free(xc->rvat_chain_table); xc->rvat_chain_table = NULL; free(xc->rvat_chain_table_lengths); xc->rvat_chain_table_lengths = NULL; xc->rvat_data_valid = 0; } } void fstReaderClose(void *ctx) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; if(xc) { fstReaderDeallocateScopeData(xc); fstReaderDeallocateRvatData(xc); free(xc->rvat_sig_offs); xc->rvat_sig_offs = NULL; free(xc->process_mask); xc->process_mask = NULL; free(xc->blackout_times); xc->blackout_times = NULL; free(xc->blackout_activity); xc->blackout_activity = NULL; free(xc->temp_signal_value_buf); xc->temp_signal_value_buf = NULL; free(xc->signal_typs); xc->signal_typs = NULL; free(xc->signal_lens); xc->signal_lens = NULL; free(xc->filename); xc->filename = NULL; if(xc->fh) { tmpfile_close(&xc->fh, &xc->fh_nam); } if(xc->f) { tmpfile_close(&xc->f, &xc->f_nam); if(xc->filename_unpacked) { unlink(xc->filename_unpacked); free(xc->filename_unpacked); } } free(xc); } } /* * read processing */ /* normal read which re-interleaves the value change data */ int fstReaderIterBlocks(void *ctx, void (*value_change_callback)(void *user_callback_data_pointer, uint64_t time, fstHandle facidx, const unsigned char *value), void *user_callback_data_pointer, FILE *fv) { return(fstReaderIterBlocks2(ctx, value_change_callback, NULL, user_callback_data_pointer, fv)); } int fstReaderIterBlocks2(void *ctx, void (*value_change_callback)(void *user_callback_data_pointer, uint64_t time, fstHandle facidx, const unsigned char *value), void (*value_change_callback_varlen)(void *user_callback_data_pointer, uint64_t time, fstHandle facidx, const unsigned char *value, uint32_t len), void *user_callback_data_pointer, FILE *fv) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; uint64_t previous_time = UINT64_MAX; uint64_t *time_table = NULL; uint64_t tsec_nitems; unsigned int secnum = 0; int blocks_skipped = 0; off_t blkpos = 0; uint64_t seclen, beg_tim; #ifdef FST_DEBUG uint64_t end_tim; #endif uint64_t frame_uclen, frame_clen, frame_maxhandle, vc_maxhandle; off_t vc_start; off_t indx_pntr, indx_pos; off_t *chain_table = NULL; uint32_t *chain_table_lengths = NULL; unsigned char *chain_cmem; unsigned char *pnt; long chain_clen; fstHandle idx, pidx=0, i; uint64_t pval; uint64_t vc_maxhandle_largest = 0; uint64_t tsec_uclen = 0, tsec_clen = 0; int sectype; uint64_t mem_required_for_traversal; unsigned char *mem_for_traversal = NULL; uint32_t traversal_mem_offs; uint32_t *scatterptr, *headptr, *length_remaining; uint32_t cur_blackout = 0; int packtype; unsigned char *mc_mem = NULL; uint32_t mc_mem_len; /* corresponds to largest value encountered in chain_table_lengths[i] */ if(!xc) return(0); scatterptr = calloc(xc->maxhandle, sizeof(uint32_t)); headptr = calloc(xc->maxhandle, sizeof(uint32_t)); length_remaining = calloc(xc->maxhandle, sizeof(uint32_t)); if(fv) { fprintf(fv, "$dumpvars\n"); #ifndef FST_WRITEX_DISABLE fflush(fv); setvbuf(fv, (char *) NULL, _IONBF, 0); /* even buffered IO is slow so disable it and use our own routines that don't need seeking */ xc->writex_fd = fileno(fv); #endif } for(;;) { uint32_t *tc_head = NULL; traversal_mem_offs = 0; fstReaderFseeko(xc, xc->f, blkpos, SEEK_SET); sectype = fgetc(xc->f); seclen = fstReaderUint64(xc->f); if((sectype == EOF) || (sectype == FST_BL_SKIP)) { #ifdef FST_DEBUG fprintf(stderr, "<< EOF >>\n"); #endif break; } blkpos++; if((sectype != FST_BL_VCDATA) && (sectype != FST_BL_VCDATA_DYN_ALIAS) && (sectype != FST_BL_VCDATA_DYN_ALIAS2)) { blkpos += seclen; continue; } if(!seclen) break; beg_tim = fstReaderUint64(xc->f); #ifdef FST_DEBUG end_tim = #endif fstReaderUint64(xc->f); if(xc->limit_range_valid) { if(beg_tim < xc->limit_range_start) { blocks_skipped++; blkpos += seclen; continue; } if(beg_tim > xc->limit_range_end) /* likely the compare in for(i=0;if); mem_for_traversal = malloc(mem_required_for_traversal + 66); /* add in potential fastlz overhead */ #ifdef FST_DEBUG fprintf(stderr, "sec: %u seclen: %d begtim: %d endtim: %d\n", secnum, (int)seclen, (int)beg_tim, (int)end_tim); fprintf(stderr, "\tmem_required_for_traversal: %d\n", (int)mem_required_for_traversal); #endif /* process time block */ { unsigned char *ucdata; unsigned char *cdata; unsigned long destlen /* = tsec_uclen */; /* scan-build */ unsigned long sourcelen /*= tsec_clen */; /* scan-build */ int rc; unsigned char *tpnt; uint64_t tpval; unsigned int ti; if(fstReaderFseeko(xc, xc->f, blkpos + seclen - 24, SEEK_SET) != 0) break; tsec_uclen = fstReaderUint64(xc->f); tsec_clen = fstReaderUint64(xc->f); tsec_nitems = fstReaderUint64(xc->f); #ifdef FST_DEBUG fprintf(stderr, "\ttime section unc: %d, com: %d (%d items)\n", (int)tsec_uclen, (int)tsec_clen, (int)tsec_nitems); #endif if(tsec_clen > seclen) break; /* corrupted tsec_clen: by definition it can't be larger than size of section */ ucdata = malloc(tsec_uclen); if(!ucdata) break; /* malloc fail as tsec_uclen out of range from corrupted file */ destlen = tsec_uclen; sourcelen = tsec_clen; fstReaderFseeko(xc, xc->f, -24 - ((off_t)tsec_clen), SEEK_CUR); if(tsec_uclen != tsec_clen) { cdata = malloc(tsec_clen); fstFread(cdata, tsec_clen, 1, xc->f); rc = uncompress(ucdata, &destlen, cdata, sourcelen); if(rc != Z_OK) { printf("tsec uncompress rc = %d\n", rc); exit(255); } free(cdata); } else { fstFread(ucdata, tsec_uclen, 1, xc->f); } free(time_table); time_table = calloc(tsec_nitems, sizeof(uint64_t)); tpnt = ucdata; tpval = 0; for(ti=0;tif, blkpos+32, SEEK_SET); frame_uclen = fstReaderVarint64(xc->f); frame_clen = fstReaderVarint64(xc->f); frame_maxhandle = fstReaderVarint64(xc->f); if(secnum == 0) { if((beg_tim != time_table[0]) || (blocks_skipped)) { unsigned char *mu = malloc(frame_uclen); uint32_t sig_offs = 0; if(fv) { char wx_buf[32]; int wx_len; if(beg_tim) { wx_len = sprintf(wx_buf, "#%"PRIu64"\n", beg_tim); fstWritex(xc, wx_buf, wx_len); } if((xc->num_blackouts)&&(cur_blackout != xc->num_blackouts)) { if(beg_tim == xc->blackout_times[cur_blackout]) { wx_len = sprintf(wx_buf, "$dump%s $end\n", (xc->blackout_activity[cur_blackout++]) ? "on" : "off"); fstWritex(xc, wx_buf, wx_len); } } } if(frame_uclen == frame_clen) { fstFread(mu, frame_uclen, 1, xc->f); } else { unsigned char *mc = malloc(frame_clen); int rc; unsigned long destlen = frame_uclen; unsigned long sourcelen = frame_clen; fstFread(mc, sourcelen, 1, xc->f); rc = uncompress(mu, &destlen, mc, sourcelen); if(rc != Z_OK) { printf("rc: %d\n", rc); exit(255); } free(mc); } for(idx=0;idxprocess_mask[process_idx]&(1<signal_lens[idx] <= 1) { if(xc->signal_lens[idx] == 1) { unsigned char val = mu[sig_offs]; if(value_change_callback) { xc->temp_signal_value_buf[0] = val; xc->temp_signal_value_buf[1] = 0; value_change_callback(user_callback_data_pointer, beg_tim, idx+1, xc->temp_signal_value_buf); } else { if(fv) { char vcd_id[16]; int vcdid_len = fstVcdIDForFwrite(vcd_id+1, idx+1); vcd_id[0] = val; /* collapse 3 writes into one I/O call */ vcd_id[vcdid_len + 1] = '\n'; fstWritex(xc, vcd_id, vcdid_len + 2); } } } else { /* variable-length ("0" length) records have no initial state */ } } else { if(xc->signal_typs[idx] != FST_VT_VCD_REAL) { if(value_change_callback) { memcpy(xc->temp_signal_value_buf, mu+sig_offs, xc->signal_lens[idx]); xc->temp_signal_value_buf[xc->signal_lens[idx]] = 0; value_change_callback(user_callback_data_pointer, beg_tim, idx+1, xc->temp_signal_value_buf); } else { if(fv) { char vcd_id[16]; int vcdid_len = fstVcdIDForFwrite(vcd_id+1, idx+1); vcd_id[0] = (xc->signal_typs[idx] != FST_VT_VCD_PORT) ? 'b' : 'p'; fstWritex(xc, vcd_id, 1); fstWritex(xc,mu+sig_offs, xc->signal_lens[idx]); vcd_id[0] = ' '; /* collapse 3 writes into one I/O call */ vcd_id[vcdid_len + 1] = '\n'; fstWritex(xc, vcd_id, vcdid_len + 2); } } } else { double d; unsigned char *clone_d; unsigned char *srcdata = mu+sig_offs; if(value_change_callback) { if(xc->native_doubles_for_cb) { if(xc->double_endian_match) { clone_d = srcdata; } else { int j; clone_d = (unsigned char *)&d; for(j=0;j<8;j++) { clone_d[j] = srcdata[7-j]; } } value_change_callback(user_callback_data_pointer, beg_tim, idx+1, clone_d); } else { clone_d = (unsigned char *)&d; if(xc->double_endian_match) { memcpy(clone_d, srcdata, 8); } else { int j; for(j=0;j<8;j++) { clone_d[j] = srcdata[7-j]; } } sprintf((char *)xc->temp_signal_value_buf, "%.16g", d); value_change_callback(user_callback_data_pointer, beg_tim, idx+1, xc->temp_signal_value_buf); } } else { if(fv) { char vcdid_buf[16]; char wx_buf[64]; int wx_len; clone_d = (unsigned char *)&d; if(xc->double_endian_match) { memcpy(clone_d, srcdata, 8); } else { int j; for(j=0;j<8;j++) { clone_d[j] = srcdata[7-j]; } } fstVcdID(vcdid_buf, idx+1); wx_len = sprintf(wx_buf, "r%.16g %s\n", d, vcdid_buf); fstWritex(xc, wx_buf, wx_len); } } } } } sig_offs += xc->signal_lens[idx]; } free(mu); fstReaderFseeko(xc, xc->f, -((off_t)frame_clen), SEEK_CUR); } } fstReaderFseeko(xc, xc->f, (off_t)frame_clen, SEEK_CUR); /* skip past compressed data */ vc_maxhandle = fstReaderVarint64(xc->f); vc_start = ftello(xc->f); /* points to '!' character */ packtype = fgetc(xc->f); #ifdef FST_DEBUG fprintf(stderr, "\tframe_uclen: %d, frame_clen: %d, frame_maxhandle: %d\n", (int)frame_uclen, (int)frame_clen, (int)frame_maxhandle); fprintf(stderr, "\tvc_maxhandle: %d, packtype: %c\n", (int)vc_maxhandle, packtype); #endif indx_pntr = blkpos + seclen - 24 -tsec_clen -8; fstReaderFseeko(xc, xc->f, indx_pntr, SEEK_SET); chain_clen = fstReaderUint64(xc->f); indx_pos = indx_pntr - chain_clen; #ifdef FST_DEBUG fprintf(stderr, "\tindx_pos: %d (%d bytes)\n", (int)indx_pos, (int)chain_clen); #endif chain_cmem = malloc(chain_clen); if(!chain_cmem) goto block_err; fstReaderFseeko(xc, xc->f, indx_pos, SEEK_SET); fstFread(chain_cmem, chain_clen, 1, xc->f); if(vc_maxhandle > vc_maxhandle_largest) { free(chain_table); free(chain_table_lengths); vc_maxhandle_largest = vc_maxhandle; chain_table = calloc((vc_maxhandle+1), sizeof(off_t)); chain_table_lengths = calloc((vc_maxhandle+1), sizeof(uint32_t)); } if(!chain_table || !chain_table_lengths) goto block_err; pnt = chain_cmem; idx = 0; pval = 0; if(sectype == FST_BL_VCDATA_DYN_ALIAS2) { uint32_t prev_alias = 0; do { int skiplen; if(*pnt & 0x01) { int64_t shval = fstGetSVarint64(pnt, &skiplen) >> 1; if(shval > 0) { pval = chain_table[idx] = pval + shval; if(idx) { chain_table_lengths[pidx] = pval - chain_table[pidx]; } pidx = idx++; } else if(shval < 0) { chain_table[idx] = 0; /* need to explicitly zero as calloc above might not run */ chain_table_lengths[idx] = prev_alias = shval; /* because during this loop iter would give stale data! */ idx++; } else { chain_table[idx] = 0; /* need to explicitly zero as calloc above might not run */ chain_table_lengths[idx] = prev_alias; /* because during this loop iter would give stale data! */ idx++; } } else { uint64_t val = fstGetVarint32(pnt, &skiplen); fstHandle loopcnt = val >> 1; for(i=0;i> 1); if(idx) { chain_table_lengths[pidx] = pval - chain_table[pidx]; } pidx = idx++; } else { fstHandle loopcnt = val >> 1; for(i=0;i xc->maxhandle) idx = xc->maxhandle; for(i=0;iprocess_mask[process_idx]&(1<f, vc_start + chain_table[i], SEEK_SET); val = fstReaderVarint32WithSkip(xc->f, &skiplen); if(val) { unsigned char *mu = mem_for_traversal + traversal_mem_offs; /* uncomp: dst */ unsigned char *mc; /* comp: src */ unsigned long destlen = val; unsigned long sourcelen = chain_table_lengths[i]; if(mc_mem_len < chain_table_lengths[i]) { free(mc_mem); mc_mem = malloc(mc_mem_len = chain_table_lengths[i]); } mc = mc_mem; fstFread(mc, chain_table_lengths[i], 1, xc->f); switch(packtype) { case '4': rc = (destlen == (unsigned long)LZ4_decompress_safe_partial((char *)mc, (char *)mu, sourcelen, destlen, destlen)) ? Z_OK : Z_DATA_ERROR; break; case 'F': fastlz_decompress(mc, sourcelen, mu, destlen); /* rc appears unreliable */ break; default: rc = uncompress(mu, &destlen, mc, sourcelen); break; } /* data to process is for(j=0;jf); /* data to process is for(j=0;jsignal_lens[i] == 1) { uint32_t vli = fstGetVarint32NoSkip(mem_for_traversal + headptr[i]); uint32_t shcnt = 2 << (vli & 1); tdelta = vli >> shcnt; } else { uint32_t vli = fstGetVarint32NoSkip(mem_for_traversal + headptr[i]); tdelta = vli >> 1; } scatterptr[i] = tc_head[tdelta]; tc_head[tdelta] = i+1; } } } free(mc_mem); /* there is no usage below for this, no real need to clear out mc_mem or mc_mem_len */ for(i=0;ilimit_range_valid) { if(time_table[i] > xc->limit_range_end) { break; } } wx_len = sprintf(wx_buf, "#%"PRIu64"\n", time_table[i]); fstWritex(xc, wx_buf, wx_len); if((xc->num_blackouts)&&(cur_blackout != xc->num_blackouts)) { if(time_table[i] == xc->blackout_times[cur_blackout]) { wx_len = sprintf(wx_buf, "$dump%s $end\n", (xc->blackout_activity[cur_blackout++]) ? "on" : "off"); fstWritex(xc, wx_buf, wx_len); } } previous_time = time_table[i]; } } while(tc_head[i]) { idx = tc_head[i] - 1; vli = fstGetVarint32(mem_for_traversal + headptr[idx], &skiplen); if(xc->signal_lens[idx] <= 1) { if(xc->signal_lens[idx] == 1) { unsigned char val; if(!(vli & 1)) { /* tdelta = vli >> 2; */ /* scan-build */ val = ((vli >> 1) & 1) | '0'; } else { /* tdelta = vli >> 4; */ /* scan-build */ val = FST_RCV_STR[((vli >> 1) & 7)]; } if(value_change_callback) { xc->temp_signal_value_buf[0] = val; xc->temp_signal_value_buf[1] = 0; value_change_callback(user_callback_data_pointer, time_table[i], idx+1, xc->temp_signal_value_buf); } else { if(fv) { char vcd_id[16]; int vcdid_len = fstVcdIDForFwrite(vcd_id+1, idx+1); vcd_id[0] = val; vcd_id[vcdid_len+1] = '\n'; fstWritex(xc, vcd_id, vcdid_len+2); } } headptr[idx] += skiplen; length_remaining[idx] -= skiplen; tc_head[i] = scatterptr[idx]; scatterptr[idx] = 0; if(length_remaining[idx]) { int shamt; vli = fstGetVarint32NoSkip(mem_for_traversal + headptr[idx]); shamt = 2 << (vli & 1); tdelta = vli >> shamt; scatterptr[idx] = tc_head[i+tdelta]; tc_head[i+tdelta] = idx+1; } } else { unsigned char *vdata; uint32_t len; vli = fstGetVarint32(mem_for_traversal + headptr[idx], &skiplen); len = fstGetVarint32(mem_for_traversal + headptr[idx] + skiplen, &skiplen2); /* tdelta = vli >> 1; */ /* scan-build */ skiplen += skiplen2; vdata = mem_for_traversal + headptr[idx] + skiplen; if(!(vli & 1)) { if(value_change_callback_varlen) { value_change_callback_varlen(user_callback_data_pointer, time_table[i], idx+1, vdata, len); } else { if(fv) { char vcd_id[16]; int vcdid_len; vcd_id[0] = 's'; fstWritex(xc, vcd_id, 1); vcdid_len = fstVcdIDForFwrite(vcd_id+1, idx+1); { unsigned char *vesc = malloc(len*4 + 1); int vlen = fstUtilityBinToEsc(vesc, vdata, len); fstWritex(xc, vesc, vlen); free(vesc); } vcd_id[0] = ' '; vcd_id[vcdid_len + 1] = '\n'; fstWritex(xc, vcd_id, vcdid_len+2); } } } skiplen += len; headptr[idx] += skiplen; length_remaining[idx] -= skiplen; tc_head[i] = scatterptr[idx]; scatterptr[idx] = 0; if(length_remaining[idx]) { vli = fstGetVarint32NoSkip(mem_for_traversal + headptr[idx]); tdelta = vli >> 1; scatterptr[idx] = tc_head[i+tdelta]; tc_head[i+tdelta] = idx+1; } } } else { uint32_t len = xc->signal_lens[idx]; unsigned char *vdata; vli = fstGetVarint32(mem_for_traversal + headptr[idx], &skiplen); /* tdelta = vli >> 1; */ /* scan-build */ vdata = mem_for_traversal + headptr[idx] + skiplen; if(xc->signal_typs[idx] != FST_VT_VCD_REAL) { if(!(vli & 1)) { int byte = 0; int bit; unsigned int j; for(j=0;j> bit) & 1) | '0'; xc->temp_signal_value_buf[j] = ch; } xc->temp_signal_value_buf[j] = 0; if(value_change_callback) { value_change_callback(user_callback_data_pointer, time_table[i], idx+1, xc->temp_signal_value_buf); } else { if(fv) { unsigned char ch_bp = (xc->signal_typs[idx] != FST_VT_VCD_PORT) ? 'b' : 'p'; fstWritex(xc, &ch_bp, 1); fstWritex(xc, xc->temp_signal_value_buf, len); } } len = byte+1; } else { if(value_change_callback) { memcpy(xc->temp_signal_value_buf, vdata, len); xc->temp_signal_value_buf[len] = 0; value_change_callback(user_callback_data_pointer, time_table[i], idx+1, xc->temp_signal_value_buf); } else { if(fv) { unsigned char ch_bp = (xc->signal_typs[idx] != FST_VT_VCD_PORT) ? 'b' : 'p'; fstWritex(xc, &ch_bp, 1); fstWritex(xc, vdata, len); } } } } else { double d; unsigned char *clone_d /*= (unsigned char *)&d */; /* scan-build */ unsigned char buf[8]; unsigned char *srcdata; if(!(vli & 1)) /* very rare case, but possible */ { int bit; int j; for(j=0;j<8;j++) { unsigned char ch; bit = 7 - (j & 7); ch = ((vdata[0] >> bit) & 1) | '0'; buf[j] = ch; } len = 1; srcdata = buf; } else { srcdata = vdata; } if(value_change_callback) { if(xc->native_doubles_for_cb) { if(xc->double_endian_match) { clone_d = srcdata; } else { int j; clone_d = (unsigned char *)&d; for(j=0;j<8;j++) { clone_d[j] = srcdata[7-j]; } } value_change_callback(user_callback_data_pointer, time_table[i], idx+1, clone_d); } else { clone_d = (unsigned char *)&d; if(xc->double_endian_match) { memcpy(clone_d, srcdata, 8); } else { int j; for(j=0;j<8;j++) { clone_d[j] = srcdata[7-j]; } } sprintf((char *)xc->temp_signal_value_buf, "%.16g", d); value_change_callback(user_callback_data_pointer, time_table[i], idx+1, xc->temp_signal_value_buf); } } else { if(fv) { char wx_buf[32]; int wx_len; clone_d = (unsigned char *)&d; if(xc->double_endian_match) { memcpy(clone_d, srcdata, 8); } else { int j; for(j=0;j<8;j++) { clone_d[j] = srcdata[7-j]; } } wx_len = sprintf(wx_buf, "r%.16g", d); fstWritex(xc, wx_buf, wx_len); } } } if(fv) { char vcd_id[16]; int vcdid_len = fstVcdIDForFwrite(vcd_id+1, idx+1); vcd_id[0] = ' '; vcd_id[vcdid_len+1] = '\n'; fstWritex(xc, vcd_id, vcdid_len+2); } skiplen += len; headptr[idx] += skiplen; length_remaining[idx] -= skiplen; tc_head[i] = scatterptr[idx]; scatterptr[idx] = 0; if(length_remaining[idx]) { vli = fstGetVarint32NoSkip(mem_for_traversal + headptr[idx]); tdelta = vli >> 1; scatterptr[idx] = tc_head[i+tdelta]; tc_head[i+tdelta] = idx+1; } } } } block_err: free(tc_head); free(chain_cmem); free(mem_for_traversal); mem_for_traversal = NULL; secnum++; if(secnum == xc->vc_section_count) break; /* in case file is growing, keep with original block count */ blkpos += seclen; } if(mem_for_traversal) free(mem_for_traversal); /* scan-build */ free(length_remaining); free(headptr); free(scatterptr); if(chain_table) free(chain_table); if(chain_table_lengths) free(chain_table_lengths); free(time_table); #ifndef FST_WRITEX_DISABLE if(fv) { fstWritex(xc, NULL, 0); } #endif return(1); } /* rvat functions */ static char *fstExtractRvatDataFromFrame(struct fstReaderContext *xc, fstHandle facidx, char *buf) { if(facidx >= xc->rvat_frame_maxhandle) { return(NULL); } if(xc->signal_lens[facidx] == 1) { buf[0] = (char)xc->rvat_frame_data[xc->rvat_sig_offs[facidx]]; buf[1] = 0; } else { if(xc->signal_typs[facidx] != FST_VT_VCD_REAL) { memcpy(buf, xc->rvat_frame_data + xc->rvat_sig_offs[facidx], xc->signal_lens[facidx]); buf[xc->signal_lens[facidx]] = 0; } else { double d; unsigned char *clone_d = (unsigned char *)&d; unsigned char *srcdata = xc->rvat_frame_data + xc->rvat_sig_offs[facidx]; if(xc->double_endian_match) { memcpy(clone_d, srcdata, 8); } else { int j; for(j=0;j<8;j++) { clone_d[j] = srcdata[7-j]; } } sprintf((char *)buf, "%.16g", d); } } return(buf); } char *fstReaderGetValueFromHandleAtTime(void *ctx, uint64_t tim, fstHandle facidx, char *buf) { struct fstReaderContext *xc = (struct fstReaderContext *)ctx; off_t blkpos = 0, prev_blkpos; uint64_t beg_tim, end_tim, beg_tim2, end_tim2; int sectype; unsigned int secnum = 0; uint64_t seclen; uint64_t tsec_uclen = 0, tsec_clen = 0; uint64_t tsec_nitems; uint64_t frame_uclen, frame_clen; #ifdef FST_DEBUG uint64_t mem_required_for_traversal; #endif off_t indx_pntr, indx_pos; long chain_clen; unsigned char *chain_cmem; unsigned char *pnt; fstHandle idx, pidx=0, i; uint64_t pval; if((!xc) || (!facidx) || (facidx > xc->maxhandle) || (!buf) || (!xc->signal_lens[facidx-1])) { return(NULL); } if(!xc->rvat_sig_offs) { uint32_t cur_offs = 0; xc->rvat_sig_offs = calloc(xc->maxhandle, sizeof(uint32_t)); for(i=0;imaxhandle;i++) { xc->rvat_sig_offs[i] = cur_offs; cur_offs += xc->signal_lens[i]; } } if(xc->rvat_data_valid) { if((xc->rvat_beg_tim <= tim) && (tim <= xc->rvat_end_tim)) { goto process_value; } fstReaderDeallocateRvatData(xc); } xc->rvat_chain_pos_valid = 0; for(;;) { fstReaderFseeko(xc, xc->f, (prev_blkpos = blkpos), SEEK_SET); sectype = fgetc(xc->f); seclen = fstReaderUint64(xc->f); if((sectype == EOF) || (sectype == FST_BL_SKIP) || (!seclen)) { return(NULL); /* if this loop exits on break, it's successful */ } blkpos++; if((sectype != FST_BL_VCDATA) && (sectype != FST_BL_VCDATA_DYN_ALIAS) && (sectype != FST_BL_VCDATA_DYN_ALIAS2)) { blkpos += seclen; continue; } beg_tim = fstReaderUint64(xc->f); end_tim = fstReaderUint64(xc->f); if((beg_tim <= tim) && (tim <= end_tim)) { if((tim == end_tim) && (tim != xc->end_time)) { off_t cached_pos = ftello(xc->f); fstReaderFseeko(xc, xc->f, blkpos, SEEK_SET); sectype = fgetc(xc->f); seclen = fstReaderUint64(xc->f); beg_tim2 = fstReaderUint64(xc->f); end_tim2 = fstReaderUint64(xc->f); if(((sectype != FST_BL_VCDATA)&&(sectype != FST_BL_VCDATA_DYN_ALIAS)&&(sectype != FST_BL_VCDATA_DYN_ALIAS2)) || (!seclen) || (beg_tim2 != tim)) { blkpos = prev_blkpos; break; } beg_tim = beg_tim2; end_tim = end_tim2; fstReaderFseeko(xc, xc->f, cached_pos, SEEK_SET); } break; } blkpos += seclen; secnum++; } xc->rvat_beg_tim = beg_tim; xc->rvat_end_tim = end_tim; #ifdef FST_DEBUG mem_required_for_traversal = #endif fstReaderUint64(xc->f); #ifdef FST_DEBUG fprintf(stderr, "rvat sec: %u seclen: %d begtim: %d endtim: %d\n", secnum, (int)seclen, (int)beg_tim, (int)end_tim); fprintf(stderr, "\tmem_required_for_traversal: %d\n", (int)mem_required_for_traversal); #endif /* process time block */ { unsigned char *ucdata; unsigned char *cdata; unsigned long destlen /* = tsec_uclen */; /* scan-build */ unsigned long sourcelen /* = tsec_clen */; /* scan-build */ int rc; unsigned char *tpnt; uint64_t tpval; unsigned int ti; fstReaderFseeko(xc, xc->f, blkpos + seclen - 24, SEEK_SET); tsec_uclen = fstReaderUint64(xc->f); tsec_clen = fstReaderUint64(xc->f); tsec_nitems = fstReaderUint64(xc->f); #ifdef FST_DEBUG fprintf(stderr, "\ttime section unc: %d, com: %d (%d items)\n", (int)tsec_uclen, (int)tsec_clen, (int)tsec_nitems); #endif ucdata = malloc(tsec_uclen); destlen = tsec_uclen; sourcelen = tsec_clen; fstReaderFseeko(xc, xc->f, -24 - ((off_t)tsec_clen), SEEK_CUR); if(tsec_uclen != tsec_clen) { cdata = malloc(tsec_clen); fstFread(cdata, tsec_clen, 1, xc->f); rc = uncompress(ucdata, &destlen, cdata, sourcelen); if(rc != Z_OK) { printf("tsec uncompress rc = %d\n", rc); exit(255); } free(cdata); } else { fstFread(ucdata, tsec_uclen, 1, xc->f); } xc->rvat_time_table = calloc(tsec_nitems, sizeof(uint64_t)); tpnt = ucdata; tpval = 0; for(ti=0;tirvat_time_table[ti] = tpval + val; tpnt += skiplen; } free(ucdata); } fstReaderFseeko(xc, xc->f, blkpos+32, SEEK_SET); frame_uclen = fstReaderVarint64(xc->f); frame_clen = fstReaderVarint64(xc->f); xc->rvat_frame_maxhandle = fstReaderVarint64(xc->f); xc->rvat_frame_data = malloc(frame_uclen); if(frame_uclen == frame_clen) { fstFread(xc->rvat_frame_data, frame_uclen, 1, xc->f); } else { unsigned char *mc = malloc(frame_clen); int rc; unsigned long destlen = frame_uclen; unsigned long sourcelen = frame_clen; fstFread(mc, sourcelen, 1, xc->f); rc = uncompress(xc->rvat_frame_data, &destlen, mc, sourcelen); if(rc != Z_OK) { printf("decompress rc: %d\n", rc); exit(255); } free(mc); } xc->rvat_vc_maxhandle = fstReaderVarint64(xc->f); xc->rvat_vc_start = ftello(xc->f); /* points to '!' character */ xc->rvat_packtype = fgetc(xc->f); #ifdef FST_DEBUG fprintf(stderr, "\tframe_uclen: %d, frame_clen: %d, frame_maxhandle: %d\n", (int)frame_uclen, (int)frame_clen, (int)xc->rvat_frame_maxhandle); fprintf(stderr, "\tvc_maxhandle: %d\n", (int)xc->rvat_vc_maxhandle); #endif indx_pntr = blkpos + seclen - 24 -tsec_clen -8; fstReaderFseeko(xc, xc->f, indx_pntr, SEEK_SET); chain_clen = fstReaderUint64(xc->f); indx_pos = indx_pntr - chain_clen; #ifdef FST_DEBUG fprintf(stderr, "\tindx_pos: %d (%d bytes)\n", (int)indx_pos, (int)chain_clen); #endif chain_cmem = malloc(chain_clen); fstReaderFseeko(xc, xc->f, indx_pos, SEEK_SET); fstFread(chain_cmem, chain_clen, 1, xc->f); xc->rvat_chain_table = calloc((xc->rvat_vc_maxhandle+1), sizeof(off_t)); xc->rvat_chain_table_lengths = calloc((xc->rvat_vc_maxhandle+1), sizeof(uint32_t)); pnt = chain_cmem; idx = 0; pval = 0; if(sectype == FST_BL_VCDATA_DYN_ALIAS2) { uint32_t prev_alias = 0; do { int skiplen; if(*pnt & 0x01) { int64_t shval = fstGetSVarint64(pnt, &skiplen) >> 1; if(shval > 0) { pval = xc->rvat_chain_table[idx] = pval + shval; if(idx) { xc->rvat_chain_table_lengths[pidx] = pval - xc->rvat_chain_table[pidx]; } pidx = idx++; } else if(shval < 0) { xc->rvat_chain_table[idx] = 0; /* need to explicitly zero as calloc above might not run */ xc->rvat_chain_table_lengths[idx] = prev_alias = shval; /* because during this loop iter would give stale data! */ idx++; } else { xc->rvat_chain_table[idx] = 0; /* need to explicitly zero as calloc above might not run */ xc->rvat_chain_table_lengths[idx] = prev_alias; /* because during this loop iter would give stale data! */ idx++; } } else { uint64_t val = fstGetVarint32(pnt, &skiplen); fstHandle loopcnt = val >> 1; for(i=0;irvat_chain_table[idx++] = 0; } } pnt += skiplen; } while (pnt != (chain_cmem + chain_clen)); } else { do { int skiplen; uint64_t val = fstGetVarint32(pnt, &skiplen); if(!val) { pnt += skiplen; val = fstGetVarint32(pnt, &skiplen); xc->rvat_chain_table[idx] = 0; xc->rvat_chain_table_lengths[idx] = -val; idx++; } else if(val&1) { pval = xc->rvat_chain_table[idx] = pval + (val >> 1); if(idx) { xc->rvat_chain_table_lengths[pidx] = pval - xc->rvat_chain_table[pidx]; } pidx = idx++; } else { fstHandle loopcnt = val >> 1; for(i=0;irvat_chain_table[idx++] = 0; } } pnt += skiplen; } while (pnt != (chain_cmem + chain_clen)); } free(chain_cmem); xc->rvat_chain_table[idx] = indx_pos - xc->rvat_vc_start; xc->rvat_chain_table_lengths[pidx] = xc->rvat_chain_table[idx] - xc->rvat_chain_table[pidx]; for(i=0;irvat_chain_table_lengths[i]; if((v32 < 0) && (!xc->rvat_chain_table[i])) { v32 = -v32; v32--; if(((uint32_t)v32) < i) /* sanity check */ { xc->rvat_chain_table[i] = xc->rvat_chain_table[v32]; xc->rvat_chain_table_lengths[i] = xc->rvat_chain_table_lengths[v32]; } } } #ifdef FST_DEBUG fprintf(stderr, "\tdecompressed chain idx len: %"PRIu32"\n", idx); #endif xc->rvat_data_valid = 1; /* all data at this point is loaded or resident in fst cache, process and return appropriate value */ process_value: if(facidx > xc->rvat_vc_maxhandle) { return(NULL); } facidx--; /* scale down for array which starts at zero */ if(((tim == xc->rvat_beg_tim)&&(!xc->rvat_chain_table[facidx])) || (!xc->rvat_chain_table[facidx])) { return(fstExtractRvatDataFromFrame(xc, facidx, buf)); } if(facidx != xc->rvat_chain_facidx) { if(xc->rvat_chain_mem) { free(xc->rvat_chain_mem); xc->rvat_chain_mem = NULL; xc->rvat_chain_pos_valid = 0; } } if(!xc->rvat_chain_mem) { uint32_t skiplen; fstReaderFseeko(xc, xc->f, xc->rvat_vc_start + xc->rvat_chain_table[facidx], SEEK_SET); xc->rvat_chain_len = fstReaderVarint32WithSkip(xc->f, &skiplen); if(xc->rvat_chain_len) { unsigned char *mu = malloc(xc->rvat_chain_len); unsigned char *mc = malloc(xc->rvat_chain_table_lengths[facidx]); unsigned long destlen = xc->rvat_chain_len; unsigned long sourcelen = xc->rvat_chain_table_lengths[facidx]; int rc = Z_OK; fstFread(mc, xc->rvat_chain_table_lengths[facidx], 1, xc->f); switch(xc->rvat_packtype) { case '4': rc = (destlen == (unsigned long)LZ4_decompress_safe_partial((char *)mc, (char *)mu, sourcelen, destlen, destlen)) ? Z_OK : Z_DATA_ERROR; break; case 'F': fastlz_decompress(mc, sourcelen, mu, destlen); /* rc appears unreliable */ break; default: rc = uncompress(mu, &destlen, mc, sourcelen); break; } free(mc); if(rc != Z_OK) { printf("\tclen: %d (rc=%d)\n", (int)xc->rvat_chain_len, rc); exit(255); } /* data to process is for(j=0;jrvat_chain_mem = mu; } else { int destlen = xc->rvat_chain_table_lengths[facidx] - skiplen; unsigned char *mu = malloc(xc->rvat_chain_len = destlen); fstFread(mu, destlen, 1, xc->f); /* data to process is for(j=0;jrvat_chain_mem = mu; } xc->rvat_chain_facidx = facidx; } /* process value chain here */ { uint32_t tidx = 0, ptidx = 0; uint32_t tdelta; int skiplen; unsigned int iprev = xc->rvat_chain_len; uint32_t pvli = 0; int pskip = 0; if((xc->rvat_chain_pos_valid)&&(tim >= xc->rvat_chain_pos_time)) { i = xc->rvat_chain_pos_idx; tidx = xc->rvat_chain_pos_tidx; } else { i = 0; tidx = 0; xc->rvat_chain_pos_time = xc->rvat_beg_tim; } if(xc->signal_lens[facidx] == 1) { while(irvat_chain_len) { uint32_t vli = fstGetVarint32(xc->rvat_chain_mem + i, &skiplen); uint32_t shcnt = 2 << (vli & 1); tdelta = vli >> shcnt; if(xc->rvat_time_table[tidx + tdelta] <= tim) { iprev = i; pvli = vli; ptidx = tidx; /* pskip = skiplen; */ /* scan-build */ tidx += tdelta; i+=skiplen; } else { break; } } if(iprev != xc->rvat_chain_len) { xc->rvat_chain_pos_tidx = ptidx; xc->rvat_chain_pos_idx = iprev; xc->rvat_chain_pos_time = tim; xc->rvat_chain_pos_valid = 1; if(!(pvli & 1)) { buf[0] = ((pvli >> 1) & 1) | '0'; } else { buf[0] = FST_RCV_STR[((pvli >> 1) & 7)]; } buf[1] = 0; return(buf); } else { return(fstExtractRvatDataFromFrame(xc, facidx, buf)); } } else { while(irvat_chain_len) { uint32_t vli = fstGetVarint32(xc->rvat_chain_mem + i, &skiplen); tdelta = vli >> 1; if(xc->rvat_time_table[tidx + tdelta] <= tim) { iprev = i; pvli = vli; ptidx = tidx; pskip = skiplen; tidx += tdelta; i+=skiplen; if(!(pvli & 1)) { i+=((xc->signal_lens[facidx]+7)/8); } else { i+=xc->signal_lens[facidx]; } } else { break; } } if(iprev != xc->rvat_chain_len) { unsigned char *vdata = xc->rvat_chain_mem + iprev + pskip; xc->rvat_chain_pos_tidx = ptidx; xc->rvat_chain_pos_idx = iprev; xc->rvat_chain_pos_time = tim; xc->rvat_chain_pos_valid = 1; if(xc->signal_typs[facidx] != FST_VT_VCD_REAL) { if(!(pvli & 1)) { int byte = 0; int bit; unsigned int j; for(j=0;jsignal_lens[facidx];j++) { unsigned char ch; byte = j/8; bit = 7 - (j & 7); ch = ((vdata[byte] >> bit) & 1) | '0'; buf[j] = ch; } buf[j] = 0; return(buf); } else { memcpy(buf, vdata, xc->signal_lens[facidx]); buf[xc->signal_lens[facidx]] = 0; return(buf); } } else { double d; unsigned char *clone_d = (unsigned char *)&d; unsigned char bufd[8]; unsigned char *srcdata; if(!(pvli & 1)) /* very rare case, but possible */ { int bit; int j; for(j=0;j<8;j++) { unsigned char ch; bit = 7 - (j & 7); ch = ((vdata[0] >> bit) & 1) | '0'; bufd[j] = ch; } srcdata = bufd; } else { srcdata = vdata; } if(xc->double_endian_match) { memcpy(clone_d, srcdata, 8); } else { int j; for(j=0;j<8;j++) { clone_d[j] = srcdata[7-j]; } } sprintf(buf, "r%.16g", d); return(buf); } } else { return(fstExtractRvatDataFromFrame(xc, facidx, buf)); } } } /* return(NULL); */ } /**********************************************************************/ #ifndef _WAVE_HAVE_JUDY /***********************/ /*** ***/ /*** jenkins hash ***/ /*** ***/ /***********************/ /* -------------------------------------------------------------------- mix -- mix 3 32-bit values reversibly. For every delta with one or two bits set, and the deltas of all three high bits or all three low bits, whether the original value of a,b,c is almost all zero or is uniformly distributed, * If mix() is run forward or backward, at least 32 bits in a,b,c have at least 1/4 probability of changing. * If mix() is run forward, every bit of c will change between 1/3 and 2/3 of the time. (Well, 22/100 and 78/100 for some 2-bit deltas.) mix() was built out of 36 single-cycle latency instructions in a structure that could supported 2x parallelism, like so: a -= b; a -= c; x = (c>>13); b -= c; a ^= x; b -= a; x = (a<<8); c -= a; b ^= x; c -= b; x = (b>>13); ... Unfortunately, superscalar Pentiums and Sparcs can't take advantage of that parallelism. They've also turned some of those single-cycle latency instructions into multi-cycle latency instructions. Still, this is the fastest good hash I could find. There were about 2^^68 to choose from. I only looked at a billion or so. -------------------------------------------------------------------- */ #define mix(a,b,c) \ { \ a -= b; a -= c; a ^= (c>>13); \ b -= c; b -= a; b ^= (a<<8); \ c -= a; c -= b; c ^= (b>>13); \ a -= b; a -= c; a ^= (c>>12); \ b -= c; b -= a; b ^= (a<<16); \ c -= a; c -= b; c ^= (b>>5); \ a -= b; a -= c; a ^= (c>>3); \ b -= c; b -= a; b ^= (a<<10); \ c -= a; c -= b; c ^= (b>>15); \ } /* -------------------------------------------------------------------- j_hash() -- hash a variable-length key into a 32-bit value k : the key (the unaligned variable-length array of bytes) len : the length of the key, counting by bytes initval : can be any 4-byte value Returns a 32-bit value. Every bit of the key affects every bit of the return value. Every 1-bit and 2-bit delta achieves avalanche. About 6*len+35 instructions. The best hash table sizes are powers of 2. There is no need to do mod a prime (mod is sooo slow!). If you need less than 32 bits, use a bitmask. For example, if you need only 10 bits, do h = (h & hashmask(10)); In which case, the hash table should have hashsize(10) elements. If you are hashing n strings (uint8_t **)k, do it like this: for (i=0, h=0; i= 12) { a += (k[0] +((uint32_t)k[1]<<8) +((uint32_t)k[2]<<16) +((uint32_t)k[3]<<24)); b += (k[4] +((uint32_t)k[5]<<8) +((uint32_t)k[6]<<16) +((uint32_t)k[7]<<24)); c += (k[8] +((uint32_t)k[9]<<8) +((uint32_t)k[10]<<16)+((uint32_t)k[11]<<24)); mix(a,b,c); k += 12; len -= 12; } /*------------------------------------- handle the last 11 bytes */ c += length; switch(len) /* all the case statements fall through */ { case 11: c+=((uint32_t)k[10]<<24); case 10: c+=((uint32_t)k[9]<<16); case 9 : c+=((uint32_t)k[8]<<8); /* the first byte of c is reserved for the length */ case 8 : b+=((uint32_t)k[7]<<24); case 7 : b+=((uint32_t)k[6]<<16); case 6 : b+=((uint32_t)k[5]<<8); case 5 : b+=k[4]; case 4 : a+=((uint32_t)k[3]<<24); case 3 : a+=((uint32_t)k[2]<<16); case 2 : a+=((uint32_t)k[1]<<8); case 1 : a+=k[0]; /* case 0: nothing left to add */ } mix(a,b,c); /*-------------------------------------------- report the result */ return(c); } /********************************************************************/ /***************************/ /*** ***/ /*** judy HS emulation ***/ /*** ***/ /***************************/ struct collchain_t { struct collchain_t *next; void *payload; uint32_t fullhash, length; unsigned char mem[1]; }; void **JenkinsIns(void *base_i, const unsigned char *mem, uint32_t length, uint32_t hashmask) { struct collchain_t ***base = (struct collchain_t ***)base_i; uint32_t hf, h; struct collchain_t **ar; struct collchain_t *chain, *pchain; if(!*base) { *base = calloc(1, (hashmask + 1) * sizeof(void *)); } ar = *base; h = (hf = j_hash(mem, length, length)) & hashmask; pchain = chain = ar[h]; while(chain) { if((chain->fullhash == hf) && (chain->length == length) && !memcmp(chain->mem, mem, length)) { if(pchain != chain) /* move hit to front */ { pchain->next = chain->next; chain->next = ar[h]; ar[h] = chain; } return(&(chain->payload)); } pchain = chain; chain = chain->next; } chain = calloc(1, sizeof(struct collchain_t) + length - 1); memcpy(chain->mem, mem, length); chain->fullhash = hf; chain->length = length; chain->next = ar[h]; ar[h] = chain; return(&(chain->payload)); } void JenkinsFree(void *base_i, uint32_t hashmask) { struct collchain_t ***base = (struct collchain_t ***)base_i; uint32_t h; struct collchain_t **ar; struct collchain_t *chain, *chain_next; if(base && *base) { ar = *base; for(h=0;h<=hashmask;h++) { chain = ar[h]; while(chain) { chain_next = chain->next; free(chain); chain = chain_next; } } free(*base); *base = NULL; } } #endif /**********************************************************************/ /************************/ /*** ***/ /*** utility function ***/ /*** ***/ /************************/ int fstUtilityBinToEsc(unsigned char *d, unsigned char *s, int len) { unsigned char *src = s; unsigned char *dst = d; unsigned char val; int i; for(i=0;i ' ') && (src[i] <= '~')) /* no white spaces in output */ { *(dst++) = src[i]; } else { val = src[i]; *(dst++) = '\\'; *(dst++) = (val/64) + '0'; val = val & 63; *(dst++) = (val/8) + '0'; val = val & 7; *(dst++) = (val) + '0'; } break; } } return(dst - d); } /* * this overwrites the original string if the destination pointer is NULL */ int fstUtilityEscToBin(unsigned char *d, unsigned char *s, int len) { unsigned char *src = s; unsigned char *dst = (!d) ? s : (s = d); unsigned char val[3]; int i; for(i=0;i='A')&&(val[0]<='F')) ? (val[0] - 'A' + 10) : (val[0] - '0'); val[1] = ((val[1]>='A')&&(val[1]<='F')) ? (val[1] - 'A' + 10) : (val[1] - '0'); *(dst++) = val[0] * 16 + val[1]; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': val[0] = src[ i] - '0'; val[1] = src[++i] - '0'; val[2] = src[++i] - '0'; *(dst++) = val[0] * 64 + val[1] * 8 + val[2]; break; default: *(dst++) = src[i]; break; } } } return(dst - s); } gtkwave-3.3.86/src/helpers/fst/Makefile.am0000664000175000017500000000032013166335473017660 0ustar bybellbybell## -*- makefile -*- ## AM_CFLAGS= $(LIBZ_CFLAGS) $(LIBJUDY_CFLAGS) noinst_LIBRARIES= libfst.a libfst_a_SOURCES= fastlz.c fastlz.h lz4.c lz4.h fstapi.c fstapi.h EXTRA_DIST= block_format.txt gtkwave-3.3.86/src/helpers/fst/fastlz.h0000664000175000017500000000710513166335473017310 0ustar bybellbybell/* FastLZ - lightning-fast lossless compression library Copyright (C) 2007 Ariya Hidayat (ariya@kde.org) Copyright (C) 2006 Ariya Hidayat (ariya@kde.org) Copyright (C) 2005 Ariya Hidayat (ariya@kde.org) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef FASTLZ_H #define FASTLZ_H #include #define flzuint8 uint8_t #define flzuint16 uint16_t #define flzuint32 uint32_t #define FASTLZ_VERSION 0x000100 #define FASTLZ_VERSION_MAJOR 0 #define FASTLZ_VERSION_MINOR 0 #define FASTLZ_VERSION_REVISION 0 #define FASTLZ_VERSION_STRING "0.1.0" #if defined (__cplusplus) extern "C" { #endif /** Compress a block of data in the input buffer and returns the size of compressed block. The size of input buffer is specified by length. The minimum input buffer size is 16. The output buffer must be at least 5% larger than the input buffer and can not be smaller than 66 bytes. If the input is not compressible, the return value might be larger than length (input buffer size). The input buffer and the output buffer can not overlap. */ int fastlz_compress(const void* input, int length, void* output); /** Decompress a block of compressed data and returns the size of the decompressed block. If error occurs, e.g. the compressed data is corrupted or the output buffer is not large enough, then 0 (zero) will be returned instead. The input buffer and the output buffer can not overlap. Decompression is memory safe and guaranteed not to write the output buffer more than what is specified in maxout. */ int fastlz_decompress(const void* input, int length, void* output, int maxout); /** Compress a block of data in the input buffer and returns the size of compressed block. The size of input buffer is specified by length. The minimum input buffer size is 16. The output buffer must be at least 5% larger than the input buffer and can not be smaller than 66 bytes. If the input is not compressible, the return value might be larger than length (input buffer size). The input buffer and the output buffer can not overlap. Compression level can be specified in parameter level. At the moment, only level 1 and level 2 are supported. Level 1 is the fastest compression and generally useful for short data. Level 2 is slightly slower but it gives better compression ratio. Note that the compressed data, regardless of the level, can always be decompressed using the function fastlz_decompress above. */ int fastlz_compress_level(int level, const void* input, int length, void* output); #if defined (__cplusplus) } #endif #endif /* FASTLZ_H */ gtkwave-3.3.86/src/helpers/v2l_analyzer.h0000664000175000017500000000714013166335473017620 0ustar bybellbybell/* * Copyright (c) 2001 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef L2V_ANALYZER_H #define L2V_ANALYZER_H #include #include #include #include #include #include #include #include #include "v2l_debug.h" #include "lxt_write.h" #ifndef _MSC_VER #include #endif #define SYMPRIME 500009 #define WAVE_DECOMPRESSOR "gzip -cd " /* zcat alone doesn't cut it for AIX */ typedef struct Node *nptr; typedef struct HistEnt *hptr; typedef struct HistEnt { hptr next; /* next transition in history */ TimeType time; /* time of transition */ TimeType previous_width; /* to avoid thrashing */ union { unsigned char val; /* value: "0XU1"[val] */ char *vector; /* pointer to a whole vector */ } v; } HistEnt; typedef struct ExtNode { int msi, lsi; } ExtNode; struct Node { char *nname; /* ascii name of node */ ExtNode *ext; /* extension to node for vectors */ HistEnt head; /* first entry in transition history */ hptr curr; /* ptr. to current history entry */ hptr *harray; /* fill this in when we make a trace.. contains */ /* a ptr to an array of histents for bsearching */ int numhist; /* number of elements in the harray */ char notdead; /* indicates if this node gets a non-x value */ int numtrans; /* number of transitions */ struct Node *substnode; /* pointer to substitutions on buses */ struct Node *substhead; /* pointer to substitution head (originator) on buses */ }; struct symbol { struct symbol *nextinaet;/* for aet node chaining */ struct HistEnt *h; /* points to previous one */ struct symbol *next; /* for hash chain */ char *name; char selected; /* for the clist object */ struct Node *n; }; struct slist { struct slist *next; char *str; int len; }; struct vcdsymbol { struct vcdsymbol *next; struct lt_symbol *ltsym; char *name; char *id; char *value; struct queuedevent *ev; /* only if vartype==V_EVENT */ struct Node **narray; unsigned int nid; int msi, lsi; int size; unsigned char vartype; }; struct queuedevent { struct queuedevent *next; struct vcdsymbol *sym; TimeType last_event_time; /* make +1 == 0 if there's not an event there too */ }; struct symbol *symfind(char *); struct symbol *symadd(char *, int); int hash(char *s); int sigcmp(char *, char *); void quicksort(struct symbol **, int, int); TimeType vcd_main(char *fname, char *lxname, int dostats, int doclock, int dochange, int dodict, int linear); void append_vcd_slisthier(char *str); #endif gtkwave-3.3.86/src/helpers/v2l_debug.h0000664000175000017500000000550413166335473017063 0ustar bybellbybell/* * Copyright (c) 2001-2014 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef WAVE_DEBUG_H #define WAVE_DEBUG_H #include #include #ifdef HAVE_INTTYPES_H #include #endif struct memchunk { struct memchunk *next; void *ptr; size_t size; }; /* * If you have problems viewing traces (mangled timevalues), * make sure that you use longs rather than the glib 64-bit * types... */ #define G_HAVE_GINT64 #define gint64 int64_t #define guint64 uint64_t #ifdef G_HAVE_GINT64 typedef gint64 TimeType; typedef guint64 UTimeType; #ifndef _MSC_VER #define LLDescriptor(x) x##LL #define ULLDescriptor(x) x##ULL #ifndef __MINGW32__ #if __WORDSIZE == 64 #define TTFormat "%ld" #else #define TTFormat "%lld" #endif #else #define TTFormat "%I64d" #endif #else #define LLDescriptor(x) x##i64 #define ULLDescriptor(x) x##i64 #define TTFormat "%I64d" #endif #else typedef long TimeType; typedef unsigned long UTimeType; #define TTFormat "%d" #define LLDescriptor(x) x #define ULLDescriptor(x) x #endif #ifdef DEBUG_PRINTF #define DEBUG(x) x #else #define DEBUG(x) #endif #ifdef DEBUG_MALLOC #define DEBUG_M(x) x #else #define DEBUG_M(x) #endif void *malloc_2(size_t size); void *realloc_2(void *ptr, size_t size); void *calloc_2(size_t nmemb, size_t size); void free_2(void *ptr); TimeType atoi_64(char *str); /* * if your system really doesn't have alloca() at all, * you can force functionality by using malloc * instead. but note that you're going to have some * memory leaks because of it. you have been warned. */ #include #if HAVE_ALLOCA_H #include #elif defined(__GNUC__) #ifndef alloca #define alloca __builtin_alloca #endif #elif defined(_MSC_VER) #include #define alloca _alloca #endif #define wave_alloca alloca #endif gtkwave-3.3.86/src/helpers/scopenav.c0000664000175000017500000000630413166335473017022 0ustar bybellbybell/* * Copyright (c) 2004-2009 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include #include #include struct namehier { struct namehier *next; char *name; char not_final; }; static struct namehier *nhold=NULL; void free_hier(void) { struct namehier *nhtemp; while(nhold) { nhtemp=nhold->next; free(nhold->name); free(nhold); nhold=nhtemp; } } /* * navigate up and down the scope hierarchy and * emit the appropriate vcd scope primitives */ static void diff_hier(FILE *fv, struct namehier *nh1, struct namehier *nh2) { if(!nh2) { while((nh1)&&(nh1->not_final)) { fprintf(fv, "$scope module %s $end\n", nh1->name); nh1=nh1->next; } return; } for(;;) { if((nh1->not_final==0)&&(nh2->not_final==0)) /* both are equal */ { break; } if(nh2->not_final==0) /* old hier is shorter */ { while((nh1)&&(nh1->not_final)) { fprintf(fv, "$scope module %s $end\n", nh1->name); nh1=nh1->next; } break; } if(nh1->not_final==0) /* new hier is shorter */ { while((nh2)&&(nh2->not_final)) { fprintf(fv, "$upscope $end\n"); nh2=nh2->next; } break; } if(strcmp(nh1->name, nh2->name)) { /* prune old hier */ while((nh2)&&(nh2->not_final)) { fprintf(fv, "$upscope $end\n"); nh2=nh2->next; } /* add new hier */ while((nh1)&&(nh1->not_final)) { fprintf(fv, "$scope module %s $end\n", nh1->name); nh1=nh1->next; } break; } nh1=nh1->next; nh2=nh2->next; } } /* * output scopedata for a given name if needed, return pointer to name string */ char *fv_output_hier(FILE *fv, char *name) { char *pnt, *pnt2; char *s; int len; struct namehier *nh_head=NULL, *nh_curr=NULL, *nhtemp; char esc = '.'; pnt=pnt2=name; for(;;) { while((*pnt2!=esc)&&(*pnt2)) { if(*pnt2=='\\') { esc = 0; } pnt2++; } s=(char *)calloc(1,(len=pnt2-pnt)+1); memcpy(s, pnt, len); nhtemp=(struct namehier *)calloc(1,sizeof(struct namehier)); nhtemp->name=s; if(!nh_curr) { nh_head=nh_curr=nhtemp; } else { nh_curr->next=nhtemp; nh_curr->not_final=1; nh_curr=nhtemp; } if(!*pnt2) break; pnt=(++pnt2); } diff_hier(fv, nh_head, nhold); free_hier(); nhold=nh_head; return(nh_curr->name); } gtkwave-3.3.86/src/helpers/lxt2_read.c0000664000175000017500000012601213166335473017067 0ustar bybellbybell/* * Copyright (c) 2003-2014 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include "lxt2_read.h" /****************************************************************************/ #ifdef _WAVE_BE32 /* * reconstruct 8/16/24/32 bits out of the lxt's representation * of a big-endian integer. this is for 32-bit PPC so no byte * swizzling needs to be done at all. for 24-bit ints, we have no danger of * running off the end of memory provided we do the "-1" trick * since we'll never read a 24-bit int at the very start of a file which * means that we'll have a 32-bit word that we can read. */ #define lxt2_rd_get_byte(mm,offset) ((unsigned int)(*((unsigned char *)(mm)+(offset)))) #define lxt2_rd_get_16(mm,offset) ((unsigned int)(*((unsigned short *)(((unsigned char *)(mm))+(offset))))) #define lxt2_rd_get_32(mm,offset) (*(unsigned int *)(((unsigned char *)(mm))+(offset))) #define lxt2_rd_get_24(mm,offset) ((lxt2_rd_get_32((mm),(offset)-1)<<8)>>8) #define lxt2_rd_get_64(mm,offset) ((((lxtint64_t)lxt2_rd_get_32((mm),(offset)))<<32)|((lxtint64_t)lxt2_rd_get_32((mm),(offset)+4))) #else /* * reconstruct 8/16/24/32 bits out of the lxt's representation * of a big-endian integer. this should work on all architectures. */ #define lxt2_rd_get_byte(mm,offset) ((unsigned int)(*((unsigned char *)(mm)+(offset)))) static unsigned int lxt2_rd_get_16(void *mm, int offset) { unsigned char *nn=(unsigned char *)mm+offset; unsigned int m1=*((unsigned char *)(nn++)); unsigned int m2=*((unsigned char *)nn); return((m1<<8)|m2); } static unsigned int lxt2_rd_get_24(void *mm,int offset) { unsigned char *nn=(unsigned char *)mm+offset; unsigned int m1=*((unsigned char *)(nn++)); unsigned int m2=*((unsigned char *)(nn++)); unsigned int m3=*((unsigned char *)nn); return((m1<<16)|(m2<<8)|m3); } static unsigned int lxt2_rd_get_32(void *mm, int offset) { unsigned char *nn=(unsigned char *)mm+offset; unsigned int m1=*((unsigned char *)(nn++)); unsigned int m2=*((unsigned char *)(nn++)); unsigned int m3=*((unsigned char *)(nn++)); unsigned int m4=*((unsigned char *)nn); return((m1<<24)|(m2<<16)|(m3<<8)|m4); } static lxtint64_t lxt2_rd_get_64(void *mm, int offset) { return( (((lxtint64_t)lxt2_rd_get_32(mm,offset))<<32) |((lxtint64_t)lxt2_rd_get_32(mm,offset+4)) ); } #endif /****************************************************************************/ /* * fast SWAR ones count for 32 and 64 bits */ #if LXT2_RD_GRANULE_SIZE > 32 _LXT2_RD_INLINE granmsk_t lxt2_rd_ones_cnt(granmsk_t x) { x -= ((x >> 1) & LXT2_RD_ULLDESC(0x5555555555555555)); x = (((x >> 2) & LXT2_RD_ULLDESC(0x3333333333333333)) + (x & LXT2_RD_ULLDESC(0x3333333333333333))); x = (((x >> 4) + x) & LXT2_RD_ULLDESC(0x0f0f0f0f0f0f0f0f)); return((x * LXT2_RD_ULLDESC(0x0101010101010101)) >> 56); } #else _LXT2_RD_INLINE granmsk_t lxt2_rd_ones_cnt(granmsk_t x) { x -= ((x >> 1) & 0x55555555); x = (((x >> 2) & 0x33333333) + (x & 0x33333333)); x = (((x >> 4) + x) & 0x0f0f0f0f); return((x * 0x01010101) >> 24); } #endif /* * total zero count to the right of the first rightmost one bit * encountered. its intended use is to * "return the bitposition of the least significant 1 in a granmsk_t" * (use x &= ~(x&-x) to clear out that bit quickly) */ _LXT2_RD_INLINE granmsk_t lxt2_rd_tzc(granmsk_t x) { return (lxt2_rd_ones_cnt((x & -x) - LXT2_RD_GRAN_1VAL)); } /****************************************************************************/ /* * i2c and c2i utility functions */ static char *lxt2_rd_expand_integer_to_bits(int len, unsigned int value) { static char s[33]; char *p = s; int i; int len2 = len-1; for(i=0;inum_time_table_entries; which_time++, msk <<= 1) while((top_elem = lt->radix_sort[which_time])) { lxtint32_t idx = top_elem - lt->next_radix; unsigned int vch; lxtint32_t i; switch(lt->fac_curpos_width) { case 1: vch = lxt2_rd_get_byte(lt->fac_curpos[idx], 0); break; case 2: vch = lxt2_rd_get_16(lt->fac_curpos[idx], 0); break; case 3: vch = lxt2_rd_get_24(lt->fac_curpos[idx], 0); break; case 4: default: vch = lxt2_rd_get_32(lt->fac_curpos[idx], 0); break; } lt->fac_curpos[idx] += lt->fac_curpos_width; offset = lxt2_rd_tzc(lt->fac_map[idx] &= msk); /* offset = next "which time" for this fac */ lt->radix_sort[which_time] = lt->next_radix[idx]; /* get next list item for this "which time" bucket */ lt->next_radix[idx] = lt->radix_sort[offset]; /* promote fac to its next (higher) possible bucket (if any) */ lt->radix_sort[offset] = <->next_radix[idx]; /* ...and put it at the head of that list */ switch(vch) { case LXT2_RD_ENC_0: case LXT2_RD_ENC_1: memset(lt->value[idx], '0'+(vch-LXT2_RD_ENC_0), lt->len[idx]); break; case LXT2_RD_ENC_INV: for(i=0;ilen[idx];i++) { lt->value[idx][i] ^= 1; } break; case LXT2_RD_ENC_LSH0: case LXT2_RD_ENC_LSH1: memmove(lt->value[idx], lt->value[idx]+1, lt->len[idx]-1); lt->value[idx][lt->len[idx]-1] = '0'+(vch-LXT2_RD_ENC_LSH0); break; case LXT2_RD_ENC_RSH0: case LXT2_RD_ENC_RSH1: memmove(lt->value[idx]+1, lt->value[idx], lt->len[idx]-1); lt->value[idx][0] = '0'+(vch-LXT2_RD_ENC_RSH0); break; case LXT2_RD_ENC_ADD1: case LXT2_RD_ENC_ADD2: case LXT2_RD_ENC_ADD3: case LXT2_RD_ENC_ADD4: x=lxt2_rd_expand_bits_to_integer(lt->len[idx], lt->value[idx]); x+= (vch-LXT2_RD_ENC_ADD1+1); memcpy(lt->value[idx], lxt2_rd_expand_integer_to_bits(lt->len[idx], x), lt->len[idx]); break; case LXT2_RD_ENC_SUB1: case LXT2_RD_ENC_SUB2: case LXT2_RD_ENC_SUB3: case LXT2_RD_ENC_SUB4: x=lxt2_rd_expand_bits_to_integer(lt->len[idx], lt->value[idx]); x-= (vch-LXT2_RD_ENC_SUB1+1); memcpy(lt->value[idx], lxt2_rd_expand_integer_to_bits(lt->len[idx], x), lt->len[idx]); break; case LXT2_RD_ENC_X: memset(lt->value[idx], 'x', lt->len[idx]); break; case LXT2_RD_ENC_Z: memset(lt->value[idx], 'z', lt->len[idx]); break; case LXT2_RD_ENC_BLACKOUT: lt->value[idx][0] = 0; break; default: vch -= LXT2_RD_DICT_START; if(vch >= b->num_dict_entries) { fprintf(stderr, LXT2_RDLOAD"Internal error: vch(%d) >= num_dict_entries("LXT2_RD_LD")\n", vch, b->num_dict_entries); exit(255); } if(lt->flags[idx] & (LXT2_RD_SYM_F_DOUBLE|LXT2_RD_SYM_F_STRING)) { /* fprintf(stderr, LXT2_RDLOAD"DOUBLE: %s\n", b->string_pointers[vch]); */ free(lt->value[idx]); lt->value[idx] = strdup(b->string_pointers[vch]); break; } if(lt->len[idx] == b->string_lens[vch]) { memcpy(lt->value[idx], b->string_pointers[vch], lt->len[idx]); } else if(lt->len[idx] > b->string_lens[vch]) { int lendelta = lt->len[idx] - b->string_lens[vch]; memset(lt->value[idx], (b->string_pointers[vch][0]!='1') ? b->string_pointers[vch][0] : '0', lendelta); strcpy(lt->value[idx]+lendelta, b->string_pointers[vch]); } else { fprintf(stderr, LXT2_RDLOAD"Internal error "LXT2_RD_LD" ('%s') vs %d ('%s')\n", lt->len[idx], lt->value[idx], b->string_lens[vch], b->string_pointers[vch]); exit(255); } break; } /* this string is _always_ unique */ /* fprintf(stderr, LXT2_RDLOAD"%lld : [%d] '%s'\n", lt->time_table[which_time], idx, lt->value[idx]); */ if(lt->time_table[which_time] != lt->prev_time) { lt->prev_time = lt->time_table[which_time]; } lt->value_change_callback(<, <->time_table[which_time], &idx, <->value[idx]); } } /* * called for only 1st vch in a block: blocks out emission of duplicate * vch from preceeding block */ void lxt2_rd_iter_radix0(struct lxt2_rd_trace *lt, struct lxt2_rd_block *b, lxtint32_t idx) { unsigned int vch; unsigned int which_time; lxtint32_t i; int uniq = 0; switch(lt->fac_curpos_width) { case 1: vch = lxt2_rd_get_byte(lt->fac_curpos[idx], 0); break; case 2: vch = lxt2_rd_get_16(lt->fac_curpos[idx], 0); break; case 3: vch = lxt2_rd_get_24(lt->fac_curpos[idx], 0); break; case 4: default: vch = lxt2_rd_get_32(lt->fac_curpos[idx], 0); break; } lt->fac_curpos[idx] += lt->fac_curpos_width; which_time = 0; switch(vch) { case LXT2_RD_ENC_0: for(i=0;ilen[idx];i++) { if(lt->value[idx][i]!='0') { memset(lt->value[idx]+i, '0', lt->len[idx] - i); uniq = 1; break; } } break; case LXT2_RD_ENC_1: for(i=0;ilen[idx];i++) { if(lt->value[idx][i]!='1') { memset(lt->value[idx]+i, '1', lt->len[idx] - i); uniq = 1; break; } } break; case LXT2_RD_ENC_INV: case LXT2_RD_ENC_LSH0: case LXT2_RD_ENC_LSH1: case LXT2_RD_ENC_RSH0: case LXT2_RD_ENC_RSH1: case LXT2_RD_ENC_ADD1: case LXT2_RD_ENC_ADD2: case LXT2_RD_ENC_ADD3: case LXT2_RD_ENC_ADD4: case LXT2_RD_ENC_SUB1: case LXT2_RD_ENC_SUB2: case LXT2_RD_ENC_SUB3: case LXT2_RD_ENC_SUB4: fprintf(stderr, LXT2_RDLOAD"Internal error in granule 0 position 0\n"); exit(255); case LXT2_RD_ENC_X: for(i=0;ilen[idx];i++) { if(lt->value[idx][i]!='x') { memset(lt->value[idx]+i, 'x', lt->len[idx] - i); uniq = 1; break; } } break; case LXT2_RD_ENC_Z: for(i=0;ilen[idx];i++) { if(lt->value[idx][i]!='z') { memset(lt->value[idx]+i, 'z', lt->len[idx] - i); uniq = 1; break; } } break; case LXT2_RD_ENC_BLACKOUT: if(lt->value[idx]) { lt->value[idx][0] = 0; uniq=1; } break; default: vch -= LXT2_RD_DICT_START; if(vch >= b->num_dict_entries) { fprintf(stderr, LXT2_RDLOAD"Internal error: vch(%d) >= num_dict_entries("LXT2_RD_LD")\n", vch, b->num_dict_entries); exit(255); } if(lt->flags[idx] & (LXT2_RD_SYM_F_DOUBLE|LXT2_RD_SYM_F_STRING)) { /* fprintf(stderr, LXT2_RDLOAD"DOUBLE: %s\n", b->string_pointers[vch]); */ if(strcmp(lt->value[idx], b->string_pointers[vch])) { free(lt->value[idx]); lt->value[idx] = strdup(b->string_pointers[vch]); uniq = 1; } break; } if(lt->len[idx] == b->string_lens[vch]) { for(i=0;ilen[idx];i++) { if(lt->value[idx][i] != b->string_pointers[vch][i]) { memcpy(lt->value[idx]+i, b->string_pointers[vch]+i, lt->len[idx]-i); uniq = 1; } } } else if(lt->len[idx] > b->string_lens[vch]) { lxtint32_t lendelta = lt->len[idx] - b->string_lens[vch]; int fill = (b->string_pointers[vch][0]!='1') ? b->string_pointers[vch][0] : '0'; for(i=0;ivalue[idx][i] != fill) { memset(lt->value[idx] + i, fill, lendelta - i); strcpy(lt->value[idx]+lendelta, b->string_pointers[vch]); uniq = 1; goto fini; } } for(i=lendelta;ilen[idx];i++) { if(lt->value[idx][i] != b->string_pointers[vch][i-lendelta]) { memcpy(lt->value[idx]+i, b->string_pointers[vch]+i-lendelta, lt->len[idx]-i); uniq = 1; } } } else { fprintf(stderr, LXT2_RDLOAD"Internal error "LXT2_RD_LD" ('%s') vs %d ('%s')\n", lt->len[idx], lt->value[idx], b->string_lens[vch], b->string_pointers[vch]); exit(255); } break; } /* this string is unique if uniq != 0 */ /* fprintf(stderr, LXT2_RDLOAD"%lld : [%d] '%s'\n", lt->time_table[which_time], idx, lt->value[idx]); */ fini: if(uniq) { if(lt->time_table[which_time] != lt->prev_time) { lt->prev_time = lt->time_table[which_time]; } lt->value_change_callback(<, <->time_table[which_time], &idx, <->value[idx]); } } /* * radix sort the fac entries based upon their first entry in the * time change table. this runs in strict linear time: we can * do this because of the limited domain of the dataset. */ static void lxt2_rd_build_radix(struct lxt2_rd_trace *lt, struct lxt2_rd_block *b, int granule, lxtint32_t strtfac, lxtint32_t endfac) { lxtint32_t i; int offset; for(i=0;iradix_sort[i] = NULL; /* each one is a linked list: we get fac number based on address of item from lt->next_radix */ } for(i=strtfac;iprocess_mask[process_idx]&(1<fac_map[i])) { if((!granule)&&(x&LXT2_RD_GRAN_1VAL)) { lxt2_rd_iter_radix0(lt, b, i); /* emit vcd only if it's unique */ x&=(~LXT2_RD_GRAN_1VAL); /* clear out least sig bit */ lt->fac_map[i] = x; if(!x) continue; } offset = lxt2_rd_tzc(x); /* get "which time" bucket number of new least sig one bit */ lt->next_radix[i] = lt->radix_sort[offset]; /* insert item into head of radix sorted "which time" buckets */ lt->radix_sort[offset] = <->next_radix[i]; } } } } /****************************************************************************/ /* * build compressed process mask if necessary */ static void lxt2_rd_regenerate_process_mask(struct lxt2_rd_trace *lt) { lxtint32_t i; int j, lim, idx; if((lt)&&(lt->process_mask_dirty)) { lt->process_mask_dirty = 0; idx=0; for(i=0;inumrealfacs;i+=LXT2_RD_PARTIAL_SIZE) { if(i+LXT2_RD_PARTIAL_SIZE>lt->numrealfacs) { lim = lt->numrealfacs; } else { lim = i+LXT2_RD_PARTIAL_SIZE; } lt->process_mask_compressed[idx] = 0; for(j=i;jprocess_mask[process_idx]&(1<process_mask_compressed[idx] = 1; break; } } idx++; } } } /****************************************************************************/ /* * process a single block and execute the vch callback as necessary */ int lxt2_rd_process_block(struct lxt2_rd_trace *lt, struct lxt2_rd_block *b) { char vld; char *pnt; lxtint32_t i; int granule = 0; char sect_typ; lxtint32_t strtfac_gran=0; char granvld=0; b->num_map_entries = lxt2_rd_get_32(b->mem, b->uncompressed_siz - 4); b->num_dict_entries = lxt2_rd_get_32(b->mem, b->uncompressed_siz - 12); #if LXT2_RD_GRANULE_SIZE > 32 if(lt->granule_size==LXT2_RD_GRANULE_SIZE) { b->map_start = (b->mem + b->uncompressed_siz - 12) - sizeof(granmsk_t) * b->num_map_entries; } else { b->map_start = (b->mem + b->uncompressed_siz - 12) - sizeof(granmsk_smaller_t) * b->num_map_entries; } #else b->map_start = (b->mem + b->uncompressed_siz - 12) - sizeof(granmsk_t) * b->num_map_entries; #endif b->dict_start = b->map_start - lxt2_rd_get_32(b->mem, b->uncompressed_siz - 8); /* fprintf(stderr, LXT2_RDLOAD"num_map_entries: %d, num_dict_entries: %d, map_start: %08x, dict_start: %08x, mem: %08x end: %08x\n", b->num_map_entries, b->num_dict_entries, b->map_start, b->dict_start, b->mem, b->mem+b->uncompressed_siz); */ vld = lxt2_rd_get_byte(b->dict_start - 1, 0); if(vld != LXT2_RD_GRAN_SECT_DICT) { fprintf(stderr, LXT2_RDLOAD"Malformed section\n"); exit(255); } if(b->num_dict_entries) { b->string_pointers = malloc(b->num_dict_entries * sizeof(char *)); b->string_lens = malloc(b->num_dict_entries * sizeof(unsigned int)); pnt = b->dict_start; for(i=0;inum_dict_entries;i++) { b->string_pointers[i] = pnt; b->string_lens[i] = strlen(pnt); pnt += (b->string_lens[i] + 1); /* fprintf(stderr, LXT2_RDLOAD"%d '%s'\n", i, b->string_pointers[i]); */ } if(pnt!=b->map_start) { fprintf(stderr, LXT2_RDLOAD"dictionary corrupt, exiting\n"); exit(255); } } pnt = b->mem; while(((sect_typ=*pnt) == LXT2_RD_GRAN_SECT_TIME)||(sect_typ == LXT2_RD_GRAN_SECT_TIME_PARTIAL)) { lxtint32_t strtfac, endfac; if(sect_typ == LXT2_RD_GRAN_SECT_TIME_PARTIAL) { lxtint32_t sublen; lxt2_rd_regenerate_process_mask(lt); strtfac = lxt2_rd_get_32(pnt, 1); sublen = lxt2_rd_get_32(pnt, 5); if(!granvld) { granvld=1; strtfac_gran = strtfac; } else { granule += (strtfac==strtfac_gran); } if(!lt->process_mask_compressed[strtfac/LXT2_RD_PARTIAL_SIZE]) { /* fprintf(stderr, "skipping group %d for %d bytes\n", strtfac, sublen); */ pnt += 9; pnt += sublen; continue; } /* fprintf(stderr, "processing group %d for %d bytes\n", strtfac, sublen); */ endfac=strtfac+LXT2_RD_PARTIAL_SIZE; if(endfac>lt->numrealfacs) endfac=lt->numrealfacs; pnt += 8; } else { strtfac=0; endfac=lt->numrealfacs; } /* fprintf(stderr, LXT2_RDLOAD"processing granule %d\n", granule); */ pnt++; lt->num_time_table_entries = lxt2_rd_get_byte(pnt, 0); pnt++; for(i=0;inum_time_table_entries;i++) { lt->time_table[i] = lxt2_rd_get_64(pnt, 0); pnt+=8; /* fprintf(stderr, LXT2_RDLOAD"\t%d) %lld\n", i, lt->time_table[i]); */ } lt->fac_map_index_width = lxt2_rd_get_byte(pnt, 0); if((!lt->fac_map_index_width)||(lt->fac_map_index_width > 4)) { fprintf(stderr, LXT2_RDLOAD"Map index width of %d is illegal, exiting.\n", lt->fac_map_index_width); exit(255); } pnt++; for(i=strtfac;ifac_map_index_width) { case 1: mskindx = lxt2_rd_get_byte(pnt, 0); break; case 2: mskindx = lxt2_rd_get_16(pnt, 0); break; case 3: mskindx = lxt2_rd_get_24(pnt, 0); break; case 4: default: mskindx = lxt2_rd_get_32(pnt, 0); break; } pnt += lt->fac_map_index_width; #if LXT2_RD_GRANULE_SIZE > 32 if(lt->granule_size==LXT2_RD_GRANULE_SIZE) { lt->fac_map[i] = get_fac_msk(b->map_start, mskindx * sizeof(granmsk_t)); } else { lt->fac_map[i] = get_fac_msk_smaller(b->map_start, mskindx * sizeof(granmsk_smaller_t)); } #else lt->fac_map[i] = get_fac_msk(b->map_start, mskindx * sizeof(granmsk_t)); #endif } lt->fac_curpos_width = lxt2_rd_get_byte(pnt, 0); if((!lt->fac_curpos_width)||(lt->fac_curpos_width > 4)) { fprintf(stderr, LXT2_RDLOAD"Curpos index width of %d is illegal, exiting.\n", lt->fac_curpos_width); exit(255); } pnt++; for(i=strtfac;ifac_curpos[i] = pnt; if(lt->fac_map[i]) { pnt += (lxt2_rd_ones_cnt(lt->fac_map[i]) * lt->fac_curpos_width); } } lxt2_rd_build_radix(lt, b, granule, strtfac, endfac); lxt2_rd_iter_radix(lt, b); if(sect_typ != LXT2_RD_GRAN_SECT_TIME_PARTIAL) { granule++; } } return(1); } /****************************************************************************/ /* * null callback used when a user passes NULL as an argument to lxt2_rd_iter_blocks() */ void lxt2_rd_null_callback(struct lxt2_rd_trace **lt, lxtint64_t *pnt_time, lxtint32_t *pnt_facidx, char **pnt_value) { (void) lt; (void) pnt_time; (void) pnt_facidx; (void) pnt_value; /* fprintf(stderr, LXT2_RDLOAD"%lld %d %s\n", *pnt_time, *pnt_facidx, *pnt_value); */ } /****************************************************************************/ /* * initialize the trace, get compressed facnames, get geometries, * and get block offset/size/timestart/timeend... */ struct lxt2_rd_trace *lxt2_rd_init(const char *name) { struct lxt2_rd_trace *lt=(struct lxt2_rd_trace *)calloc(1, sizeof(struct lxt2_rd_trace)); lxtint32_t i; if(!(lt->handle=fopen(name, "rb"))) { lxt2_rd_close(lt); lt=NULL; } else { lxtint16_t id = 0, version = 0; lt->block_mem_max = LXT2_RD_MAX_BLOCK_MEM_USAGE; /* cutoff after this number of bytes and force flush */ setvbuf(lt->handle, (char *)NULL, _IONBF, 0); /* keeps gzip from acting weird in tandem with fopen */ if(!fread(&id, 2, 1, lt->handle)) { id = 0; } if(!fread(&version, 2, 1, lt->handle)) { id = 0; } if(!fread(<->granule_size, 1, 1, lt->handle)) { id = 0; } if(lxt2_rd_get_16(&id,0) != LXT2_RD_HDRID) { fprintf(stderr, LXT2_RDLOAD"*** Not an lxt file ***\n"); lxt2_rd_close(lt); lt=NULL; } else if((version=lxt2_rd_get_16(&version,0)) > LXT2_RD_VERSION) { fprintf(stderr, LXT2_RDLOAD"*** Version %d lxt not supported ***\n", version); lxt2_rd_close(lt); lt=NULL; } else if(lt->granule_size > LXT2_RD_GRANULE_SIZE) { fprintf(stderr, LXT2_RDLOAD"*** Granule size of %d (>%d) not supported ***\n", lt->granule_size, LXT2_RD_GRANULE_SIZE); lxt2_rd_close(lt); lt=NULL; } else { size_t rcf; int rc; char *m; off_t pos, fend; int t; struct lxt2_rd_block *b; rcf=fread(<->numfacs, 4, 1, lt->handle); lt->numfacs = rcf ? lxt2_rd_get_32(<->numfacs,0) : 0; if(!lt->numfacs) { lxtint32_t num_expansion_bytes; rcf = fread(&num_expansion_bytes, 4, 1, lt->handle); num_expansion_bytes = rcf ? lxt2_rd_get_32(&num_expansion_bytes,0) : 0; rcf = fread(<->numfacs, 4, 1, lt->handle); lt->numfacs = rcf ? lxt2_rd_get_32(<->numfacs,0) : 0; if(num_expansion_bytes >= 8) { rcf = fread(<->timezero, 8, 1, lt->handle); lt->timezero = rcf ? lxt2_rd_get_64(<->timezero,0) : 0; if(num_expansion_bytes > 8) { /* future version? */ fseeko(lt->handle, num_expansion_bytes - 8, SEEK_CUR); } } else { /* malformed */ fseeko(lt->handle, num_expansion_bytes, SEEK_CUR); } } rcf=fread(<->numfacbytes, 4, 1, lt->handle); lt->numfacbytes = rcf ? lxt2_rd_get_32(<->numfacbytes,0) : 0; rcf=fread(<->longestname, 4, 1, lt->handle); lt->longestname = rcf ? lxt2_rd_get_32(<->longestname,0) : 0; rcf=fread(<->zfacnamesize, 4, 1, lt->handle); lt->zfacnamesize = rcf ? lxt2_rd_get_32(<->zfacnamesize,0) : 0; rcf=fread(<->zfacname_predec_size, 4, 1, lt->handle); lt->zfacname_predec_size = rcf ? lxt2_rd_get_32(<->zfacname_predec_size,0) : 0; rcf=fread(<->zfacgeometrysize, 4, 1, lt->handle); lt->zfacgeometrysize = rcf ? lxt2_rd_get_32(<->zfacgeometrysize,0) : 0; rcf=fread(<->timescale, 1, 1, lt->handle); if(!rcf) lt->timescale = 0; /* no swap necessary */ if(!lt->numfacs) /* scan-build for mallocs below */ { fprintf(stderr, LXT2_RDLOAD"*** Nothing to do, zero facilities found.\n"); lxt2_rd_close(lt); lt=NULL; } else { fprintf(stderr, LXT2_RDLOAD LXT2_RD_LD" facilities\n", lt->numfacs); pos = ftello(lt->handle); /* fprintf(stderr, LXT2_RDLOAD"gzip facnames start at pos %d (zsize=%d)\n", pos, lt->zfacnamesize); */ lt->process_mask = calloc(1, lt->numfacs/8+1); lt->process_mask_compressed = calloc(1, lt->numfacs/LXT2_RD_PARTIAL_SIZE+1); lt->zhandle = gzdopen(dup(fileno(lt->handle)), "rb"); m=(char *)malloc(lt->zfacname_predec_size); rc=gzread(lt->zhandle, m, lt->zfacname_predec_size); gzclose(lt->zhandle); lt->zhandle=NULL; if(((lxtint32_t)rc)!=lt->zfacname_predec_size) { fprintf(stderr, LXT2_RDLOAD"*** name section mangled %d (act) vs "LXT2_RD_LD" (exp)\n", rc, lt->zfacname_predec_size); free(m); lxt2_rd_close(lt); lt=NULL; return(lt); } lt->zfacnames = m; lt->faccache = calloc(1, sizeof(struct lxt2_rd_facname_cache)); lt->faccache->old_facidx = lt->numfacs; /* causes lxt2_rd_get_facname to initialize its unroll ptr as this is always invalid */ lt->faccache->bufcurr = malloc(lt->longestname+1); lt->faccache->bufprev = malloc(lt->longestname+1); fseeko(lt->handle, pos = pos+lt->zfacnamesize, SEEK_SET); /* fprintf(stderr, LXT2_RDLOAD"seeking to geometry at %d (0x%08x)\n", pos, pos); */ lt->zhandle = gzdopen(dup(fileno(lt->handle)), "rb"); t = lt->numfacs * 4 * sizeof(lxtint32_t); m=(char *)malloc(t); rc=gzread(lt->zhandle, m, t); gzclose(lt->zhandle); lt->zhandle=NULL; if(rc!=t) { fprintf(stderr, LXT2_RDLOAD"*** geometry section mangled %d (act) vs %d (exp)\n", rc, t); free(m); lxt2_rd_close(lt); lt=NULL; return(lt); } pos = pos+lt->zfacgeometrysize; lt->rows = malloc(lt->numfacs * sizeof(lxtint32_t)); lt->msb = malloc(lt->numfacs * sizeof(lxtsint32_t)); lt->lsb = malloc(lt->numfacs * sizeof(lxtsint32_t)); lt->flags = malloc(lt->numfacs * sizeof(lxtint32_t)); lt->len = malloc(lt->numfacs * sizeof(lxtint32_t)); lt->value = malloc(lt->numfacs * sizeof(char *)); lt->next_radix = malloc(lt->numfacs * sizeof(void *)); for(i=0;inumfacs;i++) { lt->rows[i] = lxt2_rd_get_32(m+i*16, 0); lt->msb[i] = lxt2_rd_get_32(m+i*16, 4); lt->lsb[i] = lxt2_rd_get_32(m+i*16, 8); lt->flags[i] = lxt2_rd_get_32(m+i*16, 12); if(!(lt->flags[i] & LXT2_RD_SYM_F_INTEGER)) { lt->len[i] = (lt->msb[i] <= lt->lsb[i]) ? (lt->lsb[i] - lt->msb[i] + 1) : (lt->msb[i] - lt->lsb[i] + 1); } else { lt->len[i] = 32; } lt->value[i] = calloc(lt->len[i] + 1, sizeof(char)); } for(lt->numrealfacs=0; lt->numrealfacsnumfacs; lt->numrealfacs++) { if(lt->flags[lt->numrealfacs] & LXT2_RD_SYM_F_ALIAS) { break; } } if(lt->numrealfacs > lt->numfacs) lt->numrealfacs = lt->numfacs; lt->prev_time = ~(LXT2_RD_GRAN_0VAL); free(m); lt->fac_map = malloc(lt->numfacs * sizeof(granmsk_t)); lt->fac_curpos = malloc(lt->numfacs * sizeof(char *)); for(;;) { fseeko(lt->handle, 0L, SEEK_END); fend=ftello(lt->handle); if(pos>=fend) break; fseeko(lt->handle, pos, SEEK_SET); /* fprintf(stderr, LXT2_RDLOAD"seeking to block at %d (0x%08x)\n", pos, pos); */ b=calloc(1, sizeof(struct lxt2_rd_block)); rcf = fread(&b->uncompressed_siz, 4, 1, lt->handle); b->uncompressed_siz = rcf ? lxt2_rd_get_32(&b->uncompressed_siz,0) : 0; rcf = fread(&b->compressed_siz, 4, 1, lt->handle); b->compressed_siz = rcf ? lxt2_rd_get_32(&b->compressed_siz,0) : 0; rcf = fread(&b->start, 8, 1, lt->handle); b->start = rcf ? lxt2_rd_get_64(&b->start,0) : 0; rcf = fread(&b->end, 8, 1, lt->handle); b->end = rcf ? lxt2_rd_get_64(&b->end,0) : 0; pos = ftello(lt->handle); fseeko(lt->handle, pos, SEEK_SET); /* fprintf(stderr, LXT2_RDLOAD"block gzip start at pos %d (0x%08x)\n", pos, pos); */ if(pos>=fend) { free(b); break; } b->filepos = pos; /* mark startpos for later in case we purge it from memory */ /* fprintf(stderr, LXT2_RDLOAD"un/compressed size: %d/%d\n", b->uncompressed_siz, b->compressed_siz); */ if((b->uncompressed_siz)&&(b->compressed_siz)&&(b->end)) { /* fprintf(stderr, LXT2_RDLOAD"block [%d] %lld / %lld\n", lt->numblocks, b->start, b->end); */ fseeko(lt->handle, b->compressed_siz, SEEK_CUR); lt->numblocks++; if(lt->block_curr) { lt->block_curr->next = b; lt->block_curr = b; lt->end = b->end; } else { lt->block_head = lt->block_curr = b; lt->start = b->start; lt->end = b->end; } } else { free(b); break; } pos+=b->compressed_siz; } if(lt->numblocks) { fprintf(stderr, LXT2_RDLOAD"Read %d block header%s OK\n", lt->numblocks, (lt->numblocks!=1) ? "s" : ""); fprintf(stderr, LXT2_RDLOAD"["LXT2_RD_LLD"] start time\n", lt->start); fprintf(stderr, LXT2_RDLOAD"["LXT2_RD_LLD"] end time\n", lt->end); fprintf(stderr, LXT2_RDLOAD"\n"); lt->value_change_callback = lxt2_rd_null_callback; } else { lxt2_rd_close(lt); lt=NULL; } } } } return(lt); } /* * free up/deallocate any resources still left out there: * blindly do it based on NULL pointer comparisons (ok, since * calloc() is used to allocate all structs) as performance * isn't an issue for this set of cleanup code */ void lxt2_rd_close(struct lxt2_rd_trace *lt) { if(lt) { struct lxt2_rd_block *b, *bt; lxtint32_t i; if(lt->process_mask) { free(lt->process_mask); lt->process_mask=NULL; } if(lt->process_mask_compressed) { free(lt->process_mask_compressed); lt->process_mask_compressed=NULL; } if(lt->rows) { free(lt->rows); lt->rows=NULL; } if(lt->msb) { free(lt->msb); lt->msb=NULL; } if(lt->lsb) { free(lt->lsb); lt->lsb=NULL; } if(lt->flags) { free(lt->flags); lt->flags=NULL; } if(lt->len) { free(lt->len); lt->len=NULL; } if(lt->next_radix) { free(lt->next_radix); lt->next_radix=NULL; } for(i=0;inumfacs;i++) { if(lt->value[i]) { free(lt->value[i]); lt->value[i]=NULL; } } if(lt->value) { free(lt->value); lt->value=NULL; } if(lt->zfacnames) { free(lt->zfacnames); lt->zfacnames=NULL; } if(lt->faccache) { if(lt->faccache->bufprev) { free(lt->faccache->bufprev); lt->faccache->bufprev=NULL; } if(lt->faccache->bufcurr) { free(lt->faccache->bufcurr); lt->faccache->bufcurr=NULL; } free(lt->faccache); lt->faccache=NULL; } if(lt->fac_map) { free(lt->fac_map); lt->fac_map=NULL; } if(lt->fac_curpos) { free(lt->fac_curpos); lt->fac_curpos=NULL; } b=lt->block_head; while(b) { bt=b->next; if(b->mem) { free(b->mem); b->mem=NULL; } if(b->string_pointers) { free(b->string_pointers); b->string_pointers=NULL; } if(b->string_lens) { free(b->string_lens); b->string_lens=NULL; } free(b); b=bt; } lt->block_head=lt->block_curr=NULL; if(lt->zhandle) { gzclose(lt->zhandle); lt->zhandle=NULL; } if(lt->handle) { fclose(lt->handle); lt->handle=NULL; } free(lt); } } /****************************************************************************/ /* * return number of facs in trace */ _LXT2_RD_INLINE lxtint32_t lxt2_rd_get_num_facs(struct lxt2_rd_trace *lt) { return(lt ? lt->numfacs : 0); } /* * return fac geometry for a given index */ struct lxt2_rd_geometry *lxt2_rd_get_fac_geometry(struct lxt2_rd_trace *lt, lxtint32_t facidx) { if((lt)&&(facidxnumfacs)) { lt->geometry.rows = lt->rows[facidx]; lt->geometry.msb = lt->msb[facidx]; lt->geometry.lsb = lt->lsb[facidx]; lt->geometry.flags = lt->flags[facidx]; lt->geometry.len = lt->len[facidx]; return(<->geometry); } else { return(NULL); } } /* * return partial fac geometry for a given index */ _LXT2_RD_INLINE lxtint32_t lxt2_rd_get_fac_rows(struct lxt2_rd_trace *lt, lxtint32_t facidx) { if((lt)&&(facidxnumfacs)) { return(lt->rows[facidx]); } else { return(0); } } _LXT2_RD_INLINE lxtsint32_t lxt2_rd_get_fac_msb(struct lxt2_rd_trace *lt, lxtint32_t facidx) { if((lt)&&(facidxnumfacs)) { return(lt->msb[facidx]); } else { return(0); } } _LXT2_RD_INLINE lxtsint32_t lxt2_rd_get_fac_lsb(struct lxt2_rd_trace *lt, lxtint32_t facidx) { if((lt)&&(facidxnumfacs)) { return(lt->lsb[facidx]); } else { return(0); } } _LXT2_RD_INLINE lxtint32_t lxt2_rd_get_fac_flags(struct lxt2_rd_trace *lt, lxtint32_t facidx) { if((lt)&&(facidxnumfacs)) { return(lt->flags[facidx]); } else { return(0); } } _LXT2_RD_INLINE lxtint32_t lxt2_rd_get_fac_len(struct lxt2_rd_trace *lt, lxtint32_t facidx) { if((lt)&&(facidxnumfacs)) { return(lt->len[facidx]); } else { return(0); } } _LXT2_RD_INLINE lxtint32_t lxt2_rd_get_alias_root(struct lxt2_rd_trace *lt, lxtint32_t facidx) { if((lt)&&(facidxnumfacs)) { while(lt->flags[facidx] & LXT2_RD_SYM_F_ALIAS) { facidx = lt->rows[facidx]; /* iterate to next alias */ } return(facidx); } else { return(~((lxtint32_t)0)); } } /* * time queries */ _LXT2_RD_INLINE lxtint64_t lxt2_rd_get_start_time(struct lxt2_rd_trace *lt) { return(lt ? lt->start : LXT2_RD_GRAN_0VAL); } _LXT2_RD_INLINE lxtint64_t lxt2_rd_get_end_time(struct lxt2_rd_trace *lt) { return(lt ? lt->end : LXT2_RD_GRAN_0VAL); } _LXT2_RD_INLINE char lxt2_rd_get_timescale(struct lxt2_rd_trace *lt) { return(lt ? lt->timescale : 0); } _LXT2_RD_INLINE lxtsint64_t lxt2_rd_get_timezero(struct lxt2_rd_trace *lt) { return(lt ? lt->timezero : 0); } /* * extract facname from prefix-compressed table. this * performs best when extracting facs with monotonically * increasing indices... */ char *lxt2_rd_get_facname(struct lxt2_rd_trace *lt, lxtint32_t facidx) { char *pnt; lxtint32_t clone, j; if(lt) { if((facidx==(lt->faccache->old_facidx+1))||(!facidx)) { if(!facidx) { lt->faccache->n = lt->zfacnames; lt->faccache->bufcurr[0] = 0; lt->faccache->bufprev[0] = 0; } if(facidx!=lt->numfacs) { pnt = lt->faccache->bufcurr; lt->faccache->bufcurr = lt->faccache->bufprev; lt->faccache->bufprev = pnt; clone=lxt2_rd_get_16(lt->faccache->n, 0); lt->faccache->n+=2; pnt=lt->faccache->bufcurr; for(j=0;jfaccache->bufprev[j]; } while((*(pnt++)=lxt2_rd_get_byte(lt->faccache->n++,0))); lt->faccache->old_facidx = facidx; return(lt->faccache->bufcurr); } else { return(NULL); /* no more left */ } } else { if(facidxnumfacs) { int strt; if(facidx==lt->faccache->old_facidx) { return(lt->faccache->bufcurr); } if(facidx>(lt->faccache->old_facidx+1)) { strt = lt->faccache->old_facidx+1; } else { strt=0; } for(j=strt;jnumfacs) { int process_idx = facidx/8; int process_bit = facidx&7; return( (lt->process_mask[process_idx]&(1<process_mask_dirty = 1; if(facidxnumfacs) { int idx = facidx/8; int bitpos = facidx&7; lt->process_mask[idx] |= (1<process_mask_dirty = 1; if(facidxnumfacs) { int idx = facidx/8; int bitpos = facidx&7; lt->process_mask[idx] &= (~(1<process_mask_dirty = 1; memset(lt->process_mask, 0xff, (lt->numfacs+7)/8); rc=1; } return(rc); } _LXT2_RD_INLINE int lxt2_rd_clr_fac_process_mask_all(struct lxt2_rd_trace *lt) { int rc=0; if(lt) { lt->process_mask_dirty = 1; memset(lt->process_mask, 0x00, (lt->numfacs+7)/8); rc=1; } return(rc); } /* * block memory set/get used to control buffering */ _LXT2_RD_INLINE lxtint64_t lxt2_rd_set_max_block_mem_usage(struct lxt2_rd_trace *lt, lxtint64_t block_mem_max) { lxtint64_t rc = lt->block_mem_max; lt->block_mem_max = block_mem_max; return(rc); } _LXT2_RD_INLINE lxtint64_t lxt2_rd_get_block_mem_usage(struct lxt2_rd_trace *lt) { return(lt->block_mem_consumed); } /* * return total number of blocks */ _LXT2_RD_INLINE unsigned int lxt2_rd_get_num_blocks(struct lxt2_rd_trace *lt) { return(lt->numblocks); } /* * return number of active blocks */ unsigned int lxt2_rd_get_num_active_blocks(struct lxt2_rd_trace *lt) { int blk=0; if(lt) { struct lxt2_rd_block *b = lt->block_head; while(b) { if((!b->short_read_ignore)&&(!b->exclude_block)) { blk++; } b=b->next; } } return(blk); } /****************************************************************************/ /* * block iteration...purge/reload code here isn't sophisticated as it * merely caches the FIRST set of blocks which fit in lt->block_mem_max. * n.b., returns number of blocks processed */ int lxt2_rd_iter_blocks(struct lxt2_rd_trace *lt, void (*value_change_callback)(struct lxt2_rd_trace **lt, lxtint64_t *time, lxtint32_t *facidx, char **value), void *user_callback_data_pointer) { struct lxt2_rd_block *b; int blk=0, blkfinal=0; int processed = 0; struct lxt2_rd_block *bcutoff=NULL, *bfinal=NULL; int striped_kill = 0; unsigned int real_uncompressed_siz = 0; unsigned char gzid[2]; lxtint32_t i; if(lt) { lt->value_change_callback = value_change_callback ? value_change_callback : lxt2_rd_null_callback; lt->user_callback_data_pointer = user_callback_data_pointer; b = lt->block_head; blk=0; for(i=0;inumfacs;i++) { if(lt->value[i]) lt->value[i][0] = 0; } while(b) { if((!b->mem)&&(!b->short_read_ignore)&&(!b->exclude_block)) { if(processed<5) { int gate = (processed==4) && b->next; fprintf(stderr, LXT2_RDLOAD"block [%d] processing "LXT2_RD_LLD" / "LXT2_RD_LLD"%s\n", blk, b->start, b->end, gate ? " ..." : ""); if(gate) { bcutoff = b; } } processed++; fseeko(lt->handle, b->filepos, SEEK_SET); gzid[0]=gzid[1]=0; if(!fread(&gzid, 2, 1, lt->handle)) { gzid[0] = gzid[1] = 0; } fseeko(lt->handle, b->filepos, SEEK_SET); if((striped_kill = (gzid[0]!=0x1f)||(gzid[1]!=0x8b))) { lxtint32_t clen, unclen, iter=0; char *pnt; off_t fspos = b->filepos; lxtint32_t zlen = 16; char *zbuff=malloc(zlen); struct z_stream_s strm; real_uncompressed_siz = b->uncompressed_siz; pnt = b->mem = malloc(b->uncompressed_siz); b->uncompressed_siz = 0; lxt2_rd_regenerate_process_mask(lt); while(iter!=0xFFFFFFFF) { size_t rcf; clen = unclen = iter = 0; rcf = fread(&clen, 4, 1, lt->handle); clen = rcf ? lxt2_rd_get_32(&clen,0) : 0; rcf = fread(&unclen, 4, 1, lt->handle); unclen = rcf ? lxt2_rd_get_32(&unclen,0) : 0; rcf = fread(&iter, 4, 1, lt->handle); iter = rcf ? lxt2_rd_get_32(&iter,0) : 0; fspos += 12; if((iter==0xFFFFFFFF)||(lt->process_mask_compressed[iter/LXT2_RD_PARTIAL_SIZE])) { if(clen > zlen) { if(zbuff) free(zbuff); zlen = clen * 2; zbuff = malloc(zlen ? zlen : 1 /* scan-build */); } if(!fread(zbuff, clen, 1, lt->handle)) { clen = 0; } strm.avail_in = clen-10; strm.avail_out = unclen; strm.total_in = strm.total_out = 0; strm.zalloc = NULL; strm.zfree = NULL; strm.opaque = NULL; strm.next_in = (unsigned char *)(zbuff+10); strm.next_out = (unsigned char *)(pnt); if((clen != 0)&&(unclen != 0)) { inflateInit2(&strm, -MAX_WBITS); while (Z_OK == inflate(&strm, Z_NO_FLUSH)); inflateEnd(&strm); } if((strm.total_out!=unclen)||(clen == 0)||(unclen == 0)) { fprintf(stderr, LXT2_RDLOAD"short read on subblock %ld vs "LXT2_RD_LD" (exp), ignoring\n", strm.total_out, unclen); free(b->mem); b->mem=NULL; b->short_read_ignore = 1; b->uncompressed_siz = real_uncompressed_siz; break; } b->uncompressed_siz+=strm.total_out; pnt += strm.total_out; fspos += clen; } else { fspos += clen; fseeko(lt->handle, fspos, SEEK_SET); } } if(zbuff) free(zbuff); } else { int rc; b->mem = malloc(b->uncompressed_siz); lt->zhandle = gzdopen(dup(fileno(lt->handle)), "rb"); rc=gzread(lt->zhandle, b->mem, b->uncompressed_siz); gzclose(lt->zhandle); lt->zhandle=NULL; if(((lxtint32_t)rc)!=b->uncompressed_siz) { fprintf(stderr, LXT2_RDLOAD"short read on block %d vs "LXT2_RD_LD" (exp), ignoring\n", rc, b->uncompressed_siz); free(b->mem); b->mem=NULL; b->short_read_ignore = 1; } else { lt->block_mem_consumed += b->uncompressed_siz; } } bfinal=b; blkfinal = blk; } if(b->mem) { lxt2_rd_process_block(lt, b); if(striped_kill) { free(b->mem); b->mem=NULL; b->uncompressed_siz = real_uncompressed_siz; } else if(lt->numblocks > 1) /* no sense freeing up the single block case */ { if(lt->block_mem_consumed > lt->block_mem_max) { lt->block_mem_consumed -= b->uncompressed_siz; free(b->mem); b->mem=NULL; } } } blk++; b=b->next; } } if((bcutoff)&&(bfinal!=bcutoff)) { fprintf(stderr, LXT2_RDLOAD"block [%d] processed "LXT2_RD_LLD" / "LXT2_RD_LLD"\n", blkfinal, bfinal->start, bfinal->end); } return(blk); } /* * callback access to the user callback data pointer (if required) */ _LXT2_RD_INLINE void *lxt2_rd_get_user_callback_data_pointer(struct lxt2_rd_trace *lt) { if(lt) { return(lt->user_callback_data_pointer); } else { return(NULL); } } /* * limit access to certain timerange in file * and return number of active blocks */ unsigned int lxt2_rd_limit_time_range(struct lxt2_rd_trace *lt, lxtint64_t strt_time, lxtint64_t end_time) { lxtint64_t tmp_time; int blk=0; if(lt) { struct lxt2_rd_block *b = lt->block_head; struct lxt2_rd_block *bprev = NULL; int state = 0; if(strt_time > end_time) { tmp_time = strt_time; strt_time = end_time; end_time = tmp_time; } while(b) { switch(state) { case 0: if(b->end >= strt_time) { state = 1; if((b->start > strt_time) && (bprev)) { bprev->exclude_block = 0; blk++; } } break; case 1: if(b->start > end_time) state = 2; break; default: break; } if((state==1) && (!b->short_read_ignore)) { b->exclude_block = 0; blk++; } else { b->exclude_block = 1; } bprev = b; b = b->next; } } return(blk); } /* * unrestrict access to the whole file * and return number of active blocks */ unsigned int lxt2_rd_unlimit_time_range(struct lxt2_rd_trace *lt) { int blk=0; if(lt) { struct lxt2_rd_block *b = lt->block_head; while(b) { b->exclude_block = 0; if(!b->short_read_ignore) { blk++; } b=b->next; } } return(blk); } gtkwave-3.3.86/src/helpers/lxt2miner.c0000664000175000017500000001662513166335473017137 0ustar bybellbybell/* * Copyright (c) 2003-2009 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include "lxt2_read.h" #if HAVE_GETOPT_H #include #endif #include "wave_locale.h" static char *match = NULL; static unsigned int matchlen = 0; static int names_only = 0; static char *killed_list = NULL; char killed_value = 1; char vcd_blackout; void vcd_callback(struct lxt2_rd_trace **lt, lxtint64_t *pnt_time, lxtint32_t *pnt_facidx, char **pnt_value) { struct lxt2_rd_geometry *g = lxt2_rd_get_fac_geometry(*lt, *pnt_facidx); /* fprintf(stderr, LXT2_RD_LLD" %d %s\n", *pnt_time, *pnt_facidx, *pnt_value); */ if(!(*pnt_value)[0]) { if(!vcd_blackout) { vcd_blackout = 1; /* printf("$dumpoff\n"); */ } return; } else { if(vcd_blackout) { vcd_blackout = 0; /* printf("$dumpon\n"); */ } } if(g->len >= matchlen) { if(!killed_list[*pnt_facidx]) { if((!match)|| (strstr(*pnt_value, match))) { if(g->len > 1) { if(!names_only) { printf("#"LXT2_RD_LLD" %s["LXT2_RD_LD":"LXT2_RD_LD"] %s\n", *pnt_time, lxt2_rd_get_facname(*lt, *pnt_facidx), g->msb, g->lsb, *pnt_value); } else { printf("%s["LXT2_RD_LD":"LXT2_RD_LD"]\n", lxt2_rd_get_facname(*lt, *pnt_facidx), g->msb, g->lsb); } } else { if(g->msb < 0) { if(!names_only) { printf("#"LXT2_RD_LLD" %s %s\n", *pnt_time, lxt2_rd_get_facname(*lt, *pnt_facidx), *pnt_value); } else { printf("%s\n", lxt2_rd_get_facname(*lt, *pnt_facidx)); } } else { if(!names_only) { printf("#"LXT2_RD_LLD" %s["LXT2_RD_LD"] %s\n", *pnt_time, lxt2_rd_get_facname(*lt, *pnt_facidx), g->msb, *pnt_value); } else { printf("%s["LXT2_RD_LD"]\n", lxt2_rd_get_facname(*lt, *pnt_facidx), g->msb); } } } if(killed_value) { lxt2_rd_clr_fac_process_mask(*lt, *pnt_facidx); killed_list[*pnt_facidx] = 1; } } } } } int process_lxt2(char *fname) { struct lxt2_rd_trace *lt; lt=lxt2_rd_init(fname); if(lt) { int numfacs; numfacs = lxt2_rd_get_num_facs(lt); killed_list = calloc(numfacs, sizeof(char)); lxt2_rd_set_fac_process_mask_all(lt); lxt2_rd_set_max_block_mem_usage(lt, 0); /* no need to cache blocks */ lxt2_rd_iter_blocks(lt, vcd_callback, NULL); lxt2_rd_close(lt); free(killed_list); } else { fprintf(stderr, "lxt2_rd_init failed\n"); return(255); } return(0); } /*******************************************************************************/ void print_help(char *nam) { #ifdef __linux__ printf( "Usage: %s [OPTION]... [VZTFILE]\n\n" " -d, --dumpfile=FILE specify LXT2 input dumpfile\n" " -m, --match bitwise match value\n" " -x, --hex hex match value\n" " -n, --namesonly emit facsnames only (gtkwave savefile)\n" " -c, --comprehensive do not stop after first match\n" " -h, --help display this help then exit\n\n" "First occurrence of facnames with times and matching values are emitted to\nstdout. Using -n generates a gtkwave save file.\n\n" "Report bugs to <"PACKAGE_BUGREPORT">.\n",nam); #else printf( "Usage: %s [OPTION]... [VZTFILE]\n\n" " -d specify LXT2 input dumpfile\n" " -m bitwise match value\n" " -x hex match value\n" " -n emit facsnames only\n" " -c do not stop after first match\n" " -h display this help then exit (gtkwave savefile)\n\n" "First occurrence of facnames with times and matching values are emitted to\nstdout. Using -n generates a gtkwave save file.\n\n" "Report bugs to <"PACKAGE_BUGREPORT">.\n",nam); #endif exit(0); } int main(int argc, char **argv) { char opt_errors_encountered=0; char *lxname=NULL; int c; int rc; unsigned int i; int j, k; int comprehensive = 0; WAVE_LOCALE_FIX while (1) { #ifdef __linux__ int option_index = 0; static struct option long_options[] = { {"comprehensive", 0, 0, 'c'}, {"dumpfile", 1, 0, 'd'}, {"match", 1, 0, 'm'}, {"hex", 1, 0, 'x'}, {"namesonly", 0, 0, 'n'}, {"help", 0, 0, 'h'}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "d:m:x:nch", long_options, &option_index); #else c = getopt (argc, argv, "d:m:x:nch"); #endif if (c == -1) break; /* no more args */ switch (c) { case 'c': comprehensive = 1; break; case 'n': names_only = 1; break; case 'd': if(lxname) free(lxname); lxname = malloc(strlen(optarg)+1); strcpy(lxname, optarg); break; case 'm': if(match) free(match); match = malloc((matchlen = strlen(optarg))+1); strcpy(match, optarg); break; case 'x': if(match) free(match); match = malloc((matchlen = 4*strlen(optarg))+1); for(i=0,k=0;i='0')&&(ch<='9')) { ch -= '0'; for(j=0;j<4;j++) { match[i+j] = ((ch>>(3-j))&1) + '0'; } } else if((ch>='a')&&(ch<='f')) { ch = ch - 'a' + 10; for(j=0;j<4;j++) { match[i+j] = ((ch>>(3-j))&1) + '0'; } } else /* "x" */ { for(j=0;j<4;j++) { match[i+j] = 'x'; } } } match[matchlen] = 0; break; case 'h': print_help(argv[0]); break; case '?': opt_errors_encountered=1; break; default: /* unreachable */ break; } } if(opt_errors_encountered) { print_help(argv[0]); } if (optind < argc) { while (optind < argc) { if(!lxname) { lxname = malloc(strlen(argv[optind])+1); strcpy(lxname, argv[optind++]); } else { break; } } } if(!names_only && comprehensive) { killed_value = 0; } if(!lxname) { print_help(argv[0]); } rc=process_lxt2(lxname); free(lxname); return(rc); } gtkwave-3.3.86/src/helpers/vcd2lxt.c0000664000175000017500000012416513166335473016600 0ustar bybellbybell/* * Copyright (c) 2001-2014 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ /* * vcd.c 23jan99ajb * evcd parts 29jun99ajb * profiler optimizations 15jul99ajb * stripped out of gtkwave 21jul99ajb * fix for duplicate nets 19dec00ajb * lxt conversion added 20nov01ajb */ /* AIX may need this for alloca to work */ #if defined _AIX #pragma alloca #endif #include #include "v2l_analyzer.h" #include "wave_locale.h" #undef VCD_BSEARCH_IS_PERFECT /* bsearch is imperfect under linux, but OK under AIX */ struct lt_trace *lt=NULL; int numfacs=0; int deadcnt=0; struct symbol **sym=NULL; struct symbol **facs=NULL; struct symbol *firstnode=NULL; struct symbol *curnode=NULL; TimeType min_time=-1, max_time=-1; char hier_delimeter='.'; char deadchar='X'; int vcd_explicit_zero_subscripts=-1; /* 0=yes, -1=no */ char atomic_vectors=1; static FILE *vcd_handle=NULL; static char vcd_is_compressed=0; static void add_histent(TimeType time, struct Node *n, char ch, int regadd, char *vector); static void add_tail_histents(void); static void evcd_strcpy(char *dst, char *src); static int vcdlineno=1; static int header_over=0; static int dumping_off=0; static TimeType start_time=-1; static TimeType end_time=-1; static TimeType current_time=-1; static TimeType time_scale=1; /* multiplier is 1, 10, 100 */ static TimeType time_zero=0; static char vcd_hier_delimeter[2]={0, 0}; /* fill in after rc reading code */ /******************************************************************/ static struct slist *slistroot=NULL, *slistcurr=NULL; static char *slisthier=NULL; static int slisthier_len=0; /******************************************************************/ enum Tokens { T_VAR, T_END, T_SCOPE, T_UPSCOPE, T_COMMENT, T_DATE, T_DUMPALL, T_DUMPOFF, T_DUMPON, T_DUMPVARS, T_ENDDEFINITIONS, T_DUMPPORTS, T_DUMPPORTSOFF, T_DUMPPORTSON, T_DUMPPORTSALL, T_TIMESCALE, T_VERSION, T_VCDCLOSE, T_TIMEZERO, T_EOF, T_STRING, T_UNKNOWN_KEY }; char *tokens[]={ "var", "end", "scope", "upscope", "comment", "date", "dumpall", "dumpoff", "dumpon", "dumpvars", "enddefinitions", "dumpports", "dumpportsoff", "dumpportson", "dumpportsall", "timescale", "version", "vcdclose", "timezero", "", "", "" }; #define NUM_TOKENS 19 static int T_MAX_STR=1024; /* was originally a const..now it reallocs */ static char *yytext=NULL; static int yylen=0, yylen_cache=0; #define T_GET tok=get_token();if((tok==T_END)||(tok==T_EOF))break; /******************************************************************/ static struct vcdsymbol *vcdsymroot=NULL, *vcdsymcurr=NULL; static struct vcdsymbol **sorted=NULL; static struct vcdsymbol **indexed=NULL; enum VarTypes { V_EVENT, V_PARAMETER, V_INTEGER, V_REAL, V_REAL_PARAMETER=V_REAL, V_REALTIME=V_REAL, V_STRINGTYPE=V_REAL, V_REG, V_SUPPLY0, V_SUPPLY1, V_TIME, V_TRI, V_TRIAND, V_TRIOR, V_TRIREG, V_TRI0, V_TRI1, V_WAND, V_WIRE, V_WOR, V_PORT, V_IN=V_PORT, V_OUT=V_PORT, V_INOUT=V_PORT, V_END, V_LB, V_COLON, V_RB, V_STRING }; static char *vartypes[]={ "event", "parameter", "integer", "real", "real_parameter", "realtime", "string", "reg", "supply0", "supply1", "time", "tri", "triand", "trior", "trireg", "tri0", "tri1", "wand", "wire", "wor", "port", "in", "out", "inout", "$end", "", "", "", ""}; static const unsigned char varenums[] = { V_EVENT, V_PARAMETER, V_INTEGER, V_REAL, V_REAL_PARAMETER, V_REALTIME, V_STRINGTYPE, V_REG, V_SUPPLY0, V_SUPPLY1, V_TIME, V_TRI, V_TRIAND, V_TRIOR, V_TRIREG, V_TRI0, V_TRI1, V_WAND, V_WIRE, V_WOR, V_PORT, V_IN, V_OUT, V_INOUT, V_END, V_LB, V_COLON, V_RB, V_STRING }; #define NUM_VTOKENS 25 static int numsyms=0; /******************************************************************/ static struct queuedevent *queuedevents=NULL; /******************************************************************/ static unsigned int vcd_minid = ~0; static unsigned int vcd_maxid = 0; static unsigned int vcdid_hash(char *s, int len) { unsigned int val=0; int i; s+=(len-1); for(i=0;iid)); } /* * actual bsearch */ static struct vcdsymbol *bsearch_vcd(char *key, int len) { struct vcdsymbol **v; struct vcdsymbol *t; if(indexed) { unsigned int hsh = vcdid_hash(key, len); if((hsh>=vcd_minid)&&(hsh<=vcd_maxid)) { return(indexed[hsh-vcd_minid]); } } v=(struct vcdsymbol **)bsearch(key, sorted, numsyms, sizeof(struct vcdsymbol *), vcdsymbsearchcompare); if(v) { #ifndef VCD_BSEARCH_IS_PERFECT for(;;) { t=*v; if((v==sorted)||(strcmp((*(--v))->id, key))) { return(t); } } #else return(*v); #endif } else { return(NULL); } } /* * sort on vcdsymbol pointers */ static int vcdsymcompare(const void *s1, const void *s2) { struct vcdsymbol *v1, *v2; v1=*((struct vcdsymbol **)s1); v2=*((struct vcdsymbol **)s2); return(strcmp(v1->id, v2->id)); } /* * alias vs normal symbol adding */ static void alias_vs_normal_symadd(struct vcdsymbol *v, struct vcdsymbol *root_v) { if(!v) return; /* scan-build : should never happen */ if(!root_v) { if((v->vartype==V_INTEGER)||(v->vartype==V_REAL)) { v->ltsym = lt_symbol_add(lt, v->name, 0, v->msi, v->lsi, (v->vartype==V_INTEGER)?LT_SYM_F_INTEGER:((v->vartype==V_REAL)?LT_SYM_F_DOUBLE:LT_SYM_F_BITS)); } else { char buf[65537]; if(v->msi==v->lsi) { sprintf(buf, "%s[%d]", v->name, v->msi); } else { sprintf(buf, "%s[%d:%d]", v->name, v->msi, v->lsi); } v->ltsym = lt_symbol_add(lt, buf, 0, v->msi, v->lsi, (v->vartype==V_INTEGER)?LT_SYM_F_INTEGER:((v->vartype==V_REAL)?LT_SYM_F_DOUBLE:LT_SYM_F_BITS)); } } else { if((v->vartype==V_INTEGER)||(v->vartype==V_REAL)) { lt_symbol_alias(lt, root_v->name, v->name, v->msi, v->lsi); } else { char bufold[65537], buf[65537]; if(v->msi==v->lsi) { sprintf(bufold, "%s[%d]", root_v->name, root_v->msi); sprintf(buf, "%s[%d]", v->name, v->msi); } else { sprintf(bufold, "%s[%d:%d]", root_v->name, root_v->msi, root_v->lsi); sprintf(buf, "%s[%d:%d]", v->name, v->msi, v->lsi); } lt_symbol_alias(lt, bufold, buf, v->msi, v->lsi); } } } /* * create sorted (by id) table */ static void create_sorted_table(void) { struct vcdsymbol *v; struct vcdsymbol **pnt; unsigned int vcd_distance; struct vcdsymbol *root_v; int i; if(numsyms) { vcd_distance = vcd_maxid - vcd_minid + 1; if(vcd_distance <= 8 * 1024 * 1024) { indexed = (struct vcdsymbol **)calloc_2(vcd_distance, sizeof(struct vcdsymbol *)); printf("%d symbols span ID range of %d, using indexing...\n", numsyms, vcd_distance); v=vcdsymroot; while(v) { if(!(root_v=indexed[v->nid - vcd_minid])) { indexed[v->nid - vcd_minid] = v; } alias_vs_normal_symadd(v, root_v); v=v->next; } } else { pnt=sorted=(struct vcdsymbol **)calloc_2(numsyms, sizeof(struct vcdsymbol *)); v=vcdsymroot; while(v) { *(pnt++)=v; v=v->next; } qsort(sorted, numsyms, sizeof(struct vcdsymbol *), vcdsymcompare); root_v = NULL; for(i=0;iname); v->name = NULL; v=v->next; } } } /******************************************************************/ /* * single char get */ static int getch(void) { int ch; ch=fgetc(vcd_handle); if(ch=='\n') vcdlineno++; return(((ch==EOF)||(errno))?(-1):(ch)); } static int getch_peek(void) { int ch; ch=fgetc(vcd_handle); ungetc(ch, vcd_handle); return(((ch==EOF)||(errno))?(-1):(ch)); } static char *varsplit=NULL, *vsplitcurr=NULL; static int getch_patched(void) { char ch; ch=*vsplitcurr; if(!ch) { return(-1); } else { vsplitcurr++; return((int)ch); } } /* * simple tokenizer */ static int get_token(void) { int ch; int i, len=0; int is_string=0; char *yyshadow; for(;;) { ch=getch(); if(ch<0) return(T_EOF); if(ch<=' ') continue; /* val<=' ' is a quick whitespace check */ break; /* (take advantage of fact that vcd is text) */ } if(ch=='$') { yytext[len++]=ch; for(;;) { ch=getch(); if(ch<0) return(T_EOF); if(ch<=' ') continue; break; } } else { is_string=1; } for(yytext[len++]=ch;;yytext[len++]=ch) { if(len==T_MAX_STR) { yytext=(char *)realloc_2(yytext, (T_MAX_STR=T_MAX_STR*2)+1); } ch=getch(); if(ch<=' ') break; } yytext[len]=0; /* terminator */ if(is_string) { yylen=len; return(T_STRING); } yyshadow=yytext; do { yyshadow++; for(i=0;iw #implicit-var###VarElem:ram_di[0.0] [63:0] $end' style declarations */ { /* debussy simply escapes until the space */ yytext[len++]= '\\'; } for(yytext[len++]=ch;;yytext[len++]=ch) { if(len==T_MAX_STR) { yytext=(char *)realloc_2(yytext, (T_MAX_STR=T_MAX_STR*2)+1); } ch=getch(); if(ch==' ') { if(match_kw) break; if(getch_peek() == '[') { ch = getch(); varsplit=yytext+len; /* keep looping so we get the *last* one */ continue; } } if((ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r')||(ch<0)) break; if((ch=='[')&&(yytext[0]!='\\')) { varsplit=yytext+len; /* keep looping so we get the *last* one */ } else if(((ch==':')||(ch==']'))&&(!varsplit)&&(yytext[0]!='\\')) { var_prevch=ch; break; } } yytext[len]=0; /* absolute terminator */ if((varsplit)&&(yytext[len-1]==']')) { char *vst; vst=malloc_2(strlen(varsplit)+1); strcpy(vst, varsplit); *varsplit=0x00; /* zero out var name at the left bracket */ len=varsplit-yytext; varsplit=vsplitcurr=vst; var_prevch=0; } else { varsplit=NULL; } if(match_kw) for(i=0;ilen+(s->next?1:0); s=s->next; } if(slisthier) { free_2(slisthier); } slisthier=(char *)malloc_2((slisthier_len=len)+1); s=slistroot; len=0; while(s) { strcpy(slisthier+len,s->str); len+=s->len; if(s->next) { strcpy(slisthier+len,vcd_hier_delimeter); len++; } s=s->next; } return(slisthier); } void append_vcd_slisthier(char *str) { struct slist *s; s=(struct slist *)calloc_2(1,sizeof(struct slist)); s->len=strlen(str); s->str=(char *)malloc_2(s->len+1); strcpy(s->str,str); if(slistcurr) { slistcurr->next=s; slistcurr=s; } else { slistcurr=slistroot=s; } build_slisthier(); DEBUG(fprintf(stderr, "SCOPE: %s\n",slisthier)); } static void parse_valuechange(void) { struct vcdsymbol *v; char *vector; int vlen; switch(yytext[0]) { case '0': case '1': case 'x': case 'X': case 'z': case 'Z': case 'h': case 'H': case 'u': case 'U': case 'w': case 'W': case 'l': case 'L': case '-': if(yylen>1) { v=bsearch_vcd(yytext+1, yylen-1); if(!v) { fprintf(stderr,"Near line %d, Unknown VCD identifier: '%s'\n",vcdlineno,yytext+1); } else { if(v->vartype!=V_EVENT) { char vl[2]; vl[0]=yytext[0]; vl[1]=0; lt_emit_value_bit_string(lt, v->ltsym, 0, vl); v->value[0]=yytext[0]; DEBUG(fprintf(stderr,"%s = '%c'\n",v->name,v->value[0])); add_histent(current_time,v->narray[0],v->value[0],1, NULL); } else { char vl[2]; v->value[0]=(dumping_off)?'x':'1'; /* only '1' is relevant */ if(current_time!=(v->ev->last_event_time+1)) { /* dump degating event */ DEBUG(fprintf(stderr,"#"TTFormat" %s = '%c' (event)\n",v->ev->last_event_time+1,v->name,'0')); add_histent(v->ev->last_event_time+1,v->narray[0],'0',1, NULL); } DEBUG(fprintf(stderr,"%s = '%c' (event)\n",v->name,v->value[0])); add_histent(current_time,v->narray[0],v->value[0],1, NULL); vl[0]='1'; vl[1]=0; lt_emit_value_bit_string(lt, v->ltsym, 0, vl); vl[0]='0'; vl[1]=0; lt_emit_value_bit_string(lt, v->ltsym, 0, vl); v->ev->last_event_time=current_time; } } } else { fprintf(stderr,"Near line %d, Malformed VCD identifier\n", vcdlineno); } break; case 'b': case 'B': /* extract binary number then.. */ vector=malloc_2(yylen_cache=yylen); strcpy(vector,yytext+1); vlen=yylen-1; get_strtoken(); v=bsearch_vcd(yytext, yylen); if(!v) { fprintf(stderr,"Near line %d, Unknown identifier: '%s'\n",vcdlineno, yytext); free_2(vector); } else { if(vlensize) /* fill in left part */ { char extend; int i, fill; extend=(vector[0]=='1')?'0':vector[0]; fill=v->size-vlen; for(i=0;ivalue[i]=extend; } strcpy(v->value+fill,vector); } else if(vlen==v->size) /* straight copy */ { strcpy(v->value,vector); } else /* too big, so copy only right half */ { int skip; skip=vlen-v->size; strcpy(v->value,vector+skip); } DEBUG(fprintf(stderr,"%s = '%s'\n",v->name, v->value)); lt_emit_value_bit_string(lt, v->ltsym, 0, v->value); if((v->size==1)||(!atomic_vectors)) { int i; for(i=0;isize;i++) { add_histent(current_time, v->narray[i],v->value[i],1, NULL); } free_2(vector); } else { if(yylen_cache!=(v->size+1)) { free_2(vector); vector=malloc_2(v->size+1); } strcpy(vector,v->value); add_histent(current_time, v->narray[0],0,1,vector); free_2(vector); } } break; case 'p': /* extract port dump value.. */ vector=malloc_2(yylen_cache=yylen); strcpy(vector,yytext+1); vlen=yylen-1; get_strtoken(); /* throw away 0_strength_component */ get_strtoken(); /* throw away 0_strength_component */ get_strtoken(); /* this is the id */ v=bsearch_vcd(yytext, yylen); if(!v) { fprintf(stderr,"Near line %d, Unknown identifier: '%s'\n",vcdlineno, yytext); free_2(vector); } else { if(vlensize) /* fill in left part */ { char extend; int i, fill; extend='0'; fill=v->size-vlen; for(i=0;ivalue[i]=extend; } evcd_strcpy(v->value+fill,vector); } else if(vlen==v->size) /* straight copy */ { evcd_strcpy(v->value,vector); } else /* too big, so copy only right half */ { int skip; skip=vlen-v->size; evcd_strcpy(v->value,vector+skip); } DEBUG(fprintf(stderr,"%s = '%s'\n",v->name, v->value)); lt_emit_value_bit_string(lt, v->ltsym, 0, v->value); if((v->size==1)||(!atomic_vectors)) { int i; for(i=0;isize;i++) { add_histent(current_time, v->narray[i],v->value[i],1, NULL); } free_2(vector); } else { if(yylen_cachesize) { free_2(vector); vector=malloc_2(v->size+1); } strcpy(vector,v->value); add_histent(current_time, v->narray[0],0,1,vector); free_2(vector); } } break; case 'r': case 'R': { double *d; d=malloc_2(sizeof(double)); *d = 0; sscanf(yytext+1,"%lg",d); errno = 0; get_strtoken(); v=bsearch_vcd(yytext, yylen); if(!v) { fprintf(stderr,"Near line %d, Unknown identifier: '%s'\n",vcdlineno, yytext); free_2(d); } else { lt_emit_value_double(lt, v->ltsym, 0, *d); lt_emit_value_bit_string(lt, v->ltsym, 0, v->value); add_histent(current_time, v->narray[0],'g',1,(char *)d); free_2(d); } break; } case 's': case 'S': { get_strtoken(); /* simply skip for now */ break; } } } static void evcd_strcpy(char *dst, char *src) { static const char *evcd="DUNZduLHXTlh01?FAaBbCcf"; static const char *vcd="01xz0101xz0101xzxxxxxxz"; char ch; int i; while((ch=*src)) { for(i=0;i<23;i++) { if(evcd[i]==ch) { *dst=vcd[i]; break; } } if(i==23) *dst='x'; src++; dst++; } *dst=0; /* null terminate destination */ } static void vcd_parse(int linear) { int tok; for(;;) { switch(get_token()) { case T_COMMENT: sync_end("COMMENT:"); break; case T_DATE: sync_end("DATE:"); break; case T_VERSION: sync_end("VERSION:"); break; case T_TIMEZERO: { int vtok=get_token(); if((vtok==T_END)||(vtok==T_EOF)) break; time_zero=atoi_64(yytext); lt_set_timezero(lt, time_zero); sync_end(NULL); } break; case T_TIMESCALE: { int vtok; int i; char prefix=' '; int timelogadjust = 0; vtok=get_token(); if((vtok==T_END)||(vtok==T_EOF)) break; time_scale=atoi_64(yytext); if(!time_scale) time_scale=1; else if (time_scale == 10) timelogadjust = +1; else if (time_scale == 100) timelogadjust = +2; for(i=0;i'9')) { prefix=yytext[i]; break; } } if(prefix==' ') { vtok=get_token(); if((vtok==T_END)||(vtok==T_EOF)) break; prefix=yytext[0]; } switch(prefix) { case 's': case ' ': lt_set_timescale(lt, 0+timelogadjust); break; case 'm': lt_set_timescale(lt, -3+timelogadjust); break; case 'u': lt_set_timescale(lt, -6+timelogadjust); break; case 'n': lt_set_timescale(lt, -9+timelogadjust); break; case 'p': lt_set_timescale(lt, -12+timelogadjust); break; case 'f': lt_set_timescale(lt, -15+timelogadjust); break; default: /* unknown */ lt_set_timescale(lt, -9+timelogadjust); break; } sync_end(NULL); } break; case T_SCOPE: T_GET; T_GET; if(tok==T_STRING) { struct slist *s; s=(struct slist *)calloc_2(1,sizeof(struct slist)); s->len=yylen; s->str=(char *)malloc_2(yylen+1); strcpy(s->str,yytext); if(slistcurr) { slistcurr->next=s; slistcurr=s; } else { slistcurr=slistroot=s; } build_slisthier(); DEBUG(fprintf(stderr, "SCOPE: %s\n",slisthier)); } sync_end(NULL); break; case T_UPSCOPE: if(slistroot) { struct slist *s; s=slistroot; if(!s->next) { free_2(s->str); free_2(s); slistroot=slistcurr=NULL; } else for(;;) { if(!s->next->next) { free_2(s->next->str); free_2(s->next); s->next=NULL; slistcurr=s; break; } s=s->next; } build_slisthier(); DEBUG(fprintf(stderr, "SCOPE: %s\n",slisthier)); } sync_end(NULL); break; case T_VAR: { int vtok; struct vcdsymbol *v=NULL; var_prevch=0; if(varsplit) { free_2(varsplit); varsplit=NULL; } vtok=get_vartoken(1); if(vtok>V_PORT) goto bail; v=(struct vcdsymbol *)calloc_2(1,sizeof(struct vcdsymbol)); v->vartype=vtok; v->msi=v->lsi=vcd_explicit_zero_subscripts; /* indicate [un]subscripted status */ if(vtok==V_PORT) { vtok=get_vartoken(1); if(vtok==V_STRING) { v->size=atoi_64(yytext); if(!v->size) v->size=1; } else if(vtok==V_LB) { vtok=get_vartoken(1); if(vtok==V_END) goto err; if(vtok!=V_STRING) goto err; v->msi=atoi_64(yytext); vtok=get_vartoken(0); if(vtok==V_RB) { v->lsi=v->msi; v->size=1; } else { if(vtok!=V_COLON) goto err; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; v->lsi=atoi_64(yytext); vtok=get_vartoken(0); if(vtok!=V_RB) goto err; if(v->msi>v->lsi) { v->size=v->msi-v->lsi+1; } else { v->size=v->lsi-v->msi+1; } } } else goto err; vtok=get_strtoken(); if(vtok==V_END) goto err; v->id=(char *)malloc_2(yylen+1); strcpy(v->id, yytext); v->nid=vcdid_hash(yytext,yylen); if(v->nid < vcd_minid) vcd_minid = v->nid; if(v->nid > vcd_maxid) vcd_maxid = v->nid; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; if(slisthier_len) { v->name=(char *)malloc_2(slisthier_len+1+yylen+1); strcpy(v->name,slisthier); strcpy(v->name+slisthier_len,vcd_hier_delimeter); strcpy(v->name+slisthier_len+1,yytext); } else { v->name=(char *)malloc_2(yylen+1); strcpy(v->name,yytext); } } else /* regular vcd var, not an evcd port var */ { vtok=get_vartoken(1); if(vtok==V_END) goto err; v->size=atoi_64(yytext); vtok=get_strtoken(); if(vtok==V_END) goto err; v->id=(char *)malloc_2(yylen+1); strcpy(v->id, yytext); v->nid=vcdid_hash(yytext,yylen); if(v->nid < vcd_minid) vcd_minid = v->nid; if(v->nid > vcd_maxid) vcd_maxid = v->nid; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; if(slisthier_len) { v->name=(char *)malloc_2(slisthier_len+1+yylen+1); strcpy(v->name,slisthier); strcpy(v->name+slisthier_len,vcd_hier_delimeter); strcpy(v->name+slisthier_len+1,yytext); } else { v->name=(char *)malloc_2(yylen+1); strcpy(v->name,yytext); } vtok=get_vartoken(1); if(vtok==V_END) goto dumpv; if(vtok!=V_LB) goto err; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; v->msi=atoi_64(yytext); vtok=get_vartoken(0); if(vtok==V_RB) { v->lsi=v->msi; goto dumpv; } if(vtok!=V_COLON) goto err; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; v->lsi=atoi_64(yytext); vtok=get_vartoken(0); if(vtok!=V_RB) goto err; } dumpv: if(v->size == 0) { v->vartype = V_REAL; } /* MTI fix */ if(v->vartype==V_REAL) { v->size=1; /* override any data we parsed in */ v->msi=v->lsi=0; } else if((v->size>1)&&(v->msi<=0)&&(v->lsi<=0)) { if(v->vartype==V_EVENT) { v->size=1; } else { /* any criteria for the direction here? */ v->msi=v->size-1; v->lsi=0; } } else if((v->msi>v->lsi)&&((v->msi-v->lsi+1)!=v->size)) { if(v->vartype!=V_EVENT) goto err; v->size=v->msi-v->lsi+1; } else if((v->lsi>=v->msi)&&((v->lsi-v->msi+1)!=v->size)) { if(v->vartype!=V_EVENT) goto err; v->size=v->msi-v->lsi+1; } /* initial conditions */ v->value=(char *)malloc_2(v->size+1); v->value[v->size]=0; v->narray=(struct Node **)calloc_2(v->size,sizeof(struct Node *)); { int i; for(i=0;isize;i++) { v->value[i]='x'; v->narray[i]=(struct Node *)calloc_2(1,sizeof(struct Node)); v->narray[i]->head.time=-1; v->narray[i]->head.v.val=1; } } if(v->vartype==V_EVENT) { struct queuedevent *q; v->ev=q=(struct queuedevent *)calloc_2(1,sizeof(struct queuedevent)); q->sym=v; q->last_event_time=-1; q->next=queuedevents; queuedevents=q; } if(!vcdsymroot) { vcdsymroot=vcdsymcurr=v; } else { vcdsymcurr->next=v; vcdsymcurr=v; } numsyms++; #if 0 if((v->vartype==V_INTEGER)||(v->vartype==V_REAL)) { v->ltsym = lt_symbol_add(lt, v->name, 0, v->msi, v->lsi, (v->vartype==V_INTEGER)?LT_SYM_F_INTEGER:((v->vartype==V_REAL)?LT_SYM_F_DOUBLE:LT_SYM_F_BITS)); } else { char buf[65537]; if(v->msi==v->lsi) { sprintf(buf, "%s[%d]", v->name, v->msi); } else { sprintf(buf, "%s[%d:%d]", v->name, v->msi, v->lsi); } v->ltsym = lt_symbol_add(lt, buf, 0, v->msi, v->lsi, (v->vartype==V_INTEGER)?LT_SYM_F_INTEGER:((v->vartype==V_REAL)?LT_SYM_F_DOUBLE:LT_SYM_F_BITS)); } #endif DEBUG(fprintf(stderr,"VAR %s %d %s %s[%d:%d]\n", vartypes[v->vartype], v->size, v->id, v->name, v->msi, v->lsi)); goto bail; err: if(v) { if(v->name) free_2(v->name); if(v->id) free_2(v->id); if(v->value) free_2(v->value); free_2(v); } bail: if(vtok!=V_END) sync_end(NULL); break; } case T_ENDDEFINITIONS: if(!header_over) { header_over=1; /* do symbol table management here */ create_sorted_table(); if((!sorted)&&(!indexed)) { fprintf(stderr, "No symbols in VCD file..nothing to do!\n"); exit(1); } if(linear) lt_set_no_interlace(lt); } break; case T_STRING: if(header_over) { /* catchall for events when header over */ if(yytext[0]=='#') { TimeType t_time; t_time=atoi_64(yytext+1); if(start_time<0) { start_time=t_time; } if(t_time < current_time) /* avoid backtracking time counts which can happen on malformed files */ { t_time = current_time; } current_time=t_time; if(end_timecurr) { he=(struct HistEnt *)calloc_2(1,sizeof(struct HistEnt)); he->time=-1; he->v.val=1; n->curr=he; n->head.next=he; add_histent(t_time,n,ch,regadd, vector); } else { /* if(regadd) { t_time*=(time_scale); } */ /* scan-build : never read */ if(toupper((int)(unsigned char)ch)!=deadchar) n->notdead=1; n->numtrans++; } } else { if(ch=='g') /* real number */ { if(!n->curr) { he=(struct HistEnt *)calloc_2(1,sizeof(struct HistEnt)); he->time=-1; he->v.vector=NULL; n->curr=he; n->head.next=he; add_histent(t_time,n,ch,regadd, vector); } else { n->notdead=1; n->numtrans++; } } else { if(!n->curr) { he=(struct HistEnt *)calloc_2(1,sizeof(struct HistEnt)); he->time=-1; he->v.vector=NULL; n->curr=he; n->head.next=he; add_histent(t_time,n,ch,regadd, vector); } else { int i, nlen; nlen = strlen(vector); if(nlen) { n->numtrans++; for(i=0;inotdead=1; return; } } } } } } } static void add_tail_histents(void) { /* dump out any pending events 1st */ struct queuedevent *q; q=queuedevents; while(q) { struct vcdsymbol *v; v=q->sym; if(current_time!=(v->ev->last_event_time+1)) { /* dump degating event */ DEBUG(fprintf(stderr,"#"TTFormat" %s = '%c' (event)\n",v->ev->last_event_time+1,v->name,'0')); add_histent(v->ev->last_event_time+1,v->narray[0],'0',1, NULL); } q=q->next; } } /*******************************************************************************/ void vcd_sortfacs(void) { int i; facs=(struct symbol **)malloc_2(numfacs*sizeof(struct symbol *)); curnode=firstnode; for(i=0;iname; curnode=curnode->nextinaet; while((ch=(*subst))) { if(ch==hier_delimeter) { *subst=0x01; } /* forces sort at hier boundaries */ subst++; } } quicksort(facs,0,numfacs-1); for(i=0;iname; while((ch=(*subst))) { if(ch==0x01) { *subst=hier_delimeter; } /* restore back to normal */ subst++; } } for(i=0;in->substnode) { n=facs[i]->n; printf("[%c] [%5d] %s", facs[i]->n->notdead?' ':'*',facs[i]->n->numtrans,facs[i]->name); if(!facs[i]->n->notdead) { deadcnt++; } do_indent=0; } else { n=facs[i]->n->substnode; printf("[%c] [%5d] %s <-> %s", n->notdead?' ':'*',n->numtrans,facs[i]->name,n->nname); if(!n->notdead) { deadcnt++; } do_indent=1; } { n=n->substhead; while(n) { if(strcmp(n->nname, facs[i]->name)) { if(do_indent) { printf("\n\t\t\t"); } else { do_indent=1; } printf(" <-> %s",n->nname); } n=n->substhead; } printf("\n"); } } printf("\n[%d] total facilities: [%d] facilit%s defined, [%d] facilit%s undefined.\n\n", numfacs,numfacs-deadcnt,(numfacs-deadcnt!=1)?"ies":"y",deadcnt, (deadcnt!=1)?"ies":"y"); } /*******************************************************************************/ TimeType vcd_main(char *fname, char *lxname, int dostats, int doclock, int dochg, int dodict, int linear) { struct vcdsymbol *v, *v2; vcd_hier_delimeter[0]=hier_delimeter; errno=0; /* reset in case it's set for some reason */ yytext=(char *)malloc_2(T_MAX_STR+1); if((strlen(fname)>2)&&(!strcmp(fname+strlen(fname)-3,".gz"))) { char *str; int dlen; dlen=strlen(WAVE_DECOMPRESSOR); str=(char *)wave_alloca(strlen(fname)+dlen+1); strcpy(str,WAVE_DECOMPRESSOR); strcpy(str+dlen,fname); vcd_handle=popen(str,"r"); vcd_is_compressed=~0; } else { if(strcmp("-",fname)) { vcd_handle=fopen(fname,"rb"); } else { vcd_handle=stdin; } vcd_is_compressed=0; } if(!vcd_handle) { fprintf(stderr, "Error opening %s .vcd file '%s'.\n", vcd_is_compressed?"compressed":"", fname); exit(1); } lt=lt_init(lxname); if(!lt) { fprintf(stderr, "Problem opening output file '%s'\n", lxname); perror("Why"); exit(255); } if(doclock) lt_set_clock_compress(lt); if(dochg) lt_set_chg_compress(lt); if(dodict) lt_set_dict_compress(lt, dodict); lt_set_initial_value(lt, 'x'); lt_symbol_bracket_stripping(lt, 1); /* this is intentional */ sym=(struct symbol **)calloc_2(SYMPRIME,sizeof(struct symbol *)); printf("\nConverting VCD File '%s' to LXT file '%s'...\n\n",(vcd_handle!=stdin)?fname:"from stdin", lxname); build_slisthier(); vcd_parse(linear); if(varsplit) { free_2(varsplit); varsplit=NULL; } add_tail_histents(); printf("["TTFormat"] start time.\n["TTFormat"] end time.\n\n", start_time, end_time); lt_close(lt); lt=NULL; if (dostats) vcd_sortfacs(); min_time=start_time*time_scale; max_time=end_time*time_scale; if((min_time==max_time)||(max_time==0)) { fprintf(stderr, "VCD times range is equal to zero. Exiting.\n"); exit(1); } if(vcd_handle!=stdin) { fclose(vcd_handle); vcd_handle=NULL; } free(yytext); yytext=NULL; if(indexed) { free(indexed); indexed=NULL; } if(sorted) { free(sorted); sorted=NULL; } v=vcdsymroot; while(v) { if(v->name) { free(v->name); v->name=NULL; } if(v->id) { free(v->id); v->id=NULL; } if(v->value) { free(v->value); v->value=NULL; } if(v->narray) { int i; for(i=0;isize;i++) { struct HistEnt *h1, *h2; if((h1 = v->narray[i]->head.next)) { while(h1) { h2 = h1->next; free(h1); h1 = h2; } } free(v->narray[i]); v->narray[i]=NULL; } free(v->narray); v->narray=NULL; } v2=v->next; free(v); v=v2; } vcdsymroot=vcdsymcurr=NULL; free(sym); sym=NULL; if(slisthier) { free(slisthier); slisthier=NULL; } return(max_time); } /*******************************************************************************/ /* * Generic hash function for symbol names... */ int hash(char *s) { char *p; unsigned int h=0, g; for(p=s;*p;p++) { h=(h<<4)+(*p); if((g=h&0xf0000000)) { h=h^(g>>24); h=h^g; } } return(h%SYMPRIME); } /* * add symbol to table. no duplicate checking * is necessary as aet's are "correct." */ struct symbol *symadd(char *name, int hv) { struct symbol *s; s=(struct symbol *)calloc_2(1,sizeof(struct symbol)); strcpy(s->name=(char *)malloc_2(strlen(name)+1),name); s->next=sym[hv]; sym[hv]=s; return(s); } /* * find a slot already in the table... */ struct symbol *symfind(char *s) { int hv; struct symbol *temp; hv=hash(s); if(!(temp=sym[hv])) return(NULL); /* no hash entry, add here wanted to add */ while(temp) { if(!strcmp(temp->name,s)) { return(temp); /* in table already */ } if(!temp->next) break; temp=temp->next; } return(NULL); /* not found, add here if you want to add*/ } int sigcmp(char *s1, char *s2) { unsigned char c1, c2; int u1, u2; for(;;) { c1=(unsigned char)*(s1++); c2=(unsigned char)*(s2++); if((!c1)&&(!c2)) return(0); if((c1<='9')&&(c2<='9')&&(c2>='0')&&(c1>='0')) { u1=(int)(c1&15); u2=(int)(c2&15); while(((c2=(unsigned char)*s2)>='0')&&(c2<='9')) { u2*=10; u2+=(unsigned int)(c2&15); s2++; } while(((c2=(unsigned char)*s1)>='0')&&(c2<='9')) { u1*=10; u1+=(unsigned int)(c2&15); s1++; } if(u1==u2) continue; else return((int)u1-(int)u2); } else { if(c1!=c2) return((int)c1-(int)c2); } } } int partition(struct symbol **a, int p, int r) { struct symbol *x, *t; int i,j; x=a[p]; i=p-1; j=r+1; while(1) { do { j--; } while(sigcmp(a[j]->name,x->name)>0); do { i++; } while(sigcmp(a[i]->name,x->name)<0); if(i=3) { for(i=3;i #include #include #include #include #include #include #include #ifdef HAVE_INTTYPES_H #include #endif #ifndef _AIX #if HAVE_GETOPT_H #include #endif #endif #include "v2l_debug_lxt2.h" #ifndef _MSC_VER #include #endif #define SYMPRIME 500009 #define WAVE_DECOMPRESSOR "gzip -cd " /* zcat alone doesn't cut it for AIX */ typedef struct Node *nptr; typedef struct HistEnt *hptr; typedef struct HistEnt { hptr next; /* next transition in history */ TimeType time; /* time of transition */ TimeType previous_width; /* to avoid thrashing */ union { unsigned char val; /* value: "0XU1"[val] */ char *vector; /* pointer to a whole vector */ } v; } HistEnt; typedef struct ExtNode { int msi, lsi; } ExtNode; struct Node { char *nname; /* ascii name of node */ ExtNode *ext; /* extension to node for vectors */ HistEnt head; /* first entry in transition history */ hptr curr; /* ptr. to current history entry */ hptr *harray; /* fill this in when we make a trace.. contains */ /* a ptr to an array of histents for bsearching */ int numhist; /* number of elements in the harray */ char notdead; /* indicates if this node gets a non-x value */ int numtrans; /* number of transitions */ struct Node *substnode; /* pointer to substitutions on buses */ struct Node *substhead; /* pointer to substitution head (originator) on buses */ }; struct symbol { struct symbol *nextinaet;/* for aet node chaining */ struct HistEnt *h; /* points to previous one */ struct symbol *next; /* for hash chain */ char *name; char selected; /* for the clist object */ struct Node *n; }; struct slist { struct slist *next; char *str; int len; }; struct vcdsymbol { struct vcdsymbol *next; void *ltsym; char *name; char *id; char *value; struct queuedevent *ev; /* only if vartype==V_EVENT */ struct Node **narray; unsigned int nid; int msi, lsi; int size; unsigned char vartype; }; struct queuedevent { struct queuedevent *next; struct vcdsymbol *sym; TimeType last_event_time; /* make +1 == 0 if there's not an event there too */ }; struct symbol *symfind(char *); struct symbol *symadd(char *, int); int hash(char *s); int sigcmp(char *, char *); void quicksort(struct symbol **, int, int); TimeType vcd_main(char *fname, char *lxname); void append_vcd_slisthier(char *str); #endif gtkwave-3.3.86/src/helpers/lxt2vcd.c0000664000175000017500000002731313166335473016575 0ustar bybellbybell/* * Copyright (c) 2003-2014 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include "lxt2_read.h" #if HAVE_GETOPT_H #include #endif #include #include "wave_locale.h" #define LXT_VCD_WRITE_BUF_SIZ (2 * 1024 * 1024) int flat_earth = 0; int notruncate = 0; static FILE *fv = NULL; extern void free_hier(void); extern char *fv_output_hier(FILE *fv, char *name); /* * generate a vcd identifier for a given facindx */ static char *vcdid(unsigned int value) { static char buf[16]; char *pnt = buf; value++; /* zero is illegal for a value...it is assumed they start at one */ while (value) { value--; *(pnt++) = (char)('!' + value % 94); value = value / 94; } *pnt = 0; return(buf); } /* static char *vcdid(int value) { static char buf[16]; int i; for(i=0;i<15;i++) { buf[i]=(char)((value%94)+33); value=value/94; if(!value) {buf[i+1]=0; break;} } return(buf); } */ static char *vcd_truncate_bitvec(char *s) { char l, r; if(notruncate) return(s); r=*s; if(r=='1') { return s; } else { s++; } for(;;s++) { l=r; r=*s; if(!r) return (s-1); if(l!=r) { return(((l=='0')&&(r=='1'))?s:s-1); } } } static lxtint64_t vcd_prevtime; char vcd_blackout; void vcd_callback(struct lxt2_rd_trace **lt, lxtint64_t *pnt_time, lxtint32_t *pnt_facidx, char **pnt_value) { struct lxt2_rd_geometry *g = lxt2_rd_get_fac_geometry(*lt, *pnt_facidx); /* fprintf(stderr, LXT2_RD_LLD" %d %s\n", *pnt_time, *pnt_facidx, *pnt_value); */ if(vcd_prevtime != *pnt_time) { vcd_prevtime = *pnt_time; fprintf(fv, "#"LXT2_RD_LLD"\n", *pnt_time); } if(!(*pnt_value)[0]) { if(!vcd_blackout) { vcd_blackout = 1; fprintf(fv, "$dumpoff\n"); } return; } else { if(vcd_blackout) { vcd_blackout = 0; fprintf(fv, "$dumpon\n"); } } if(g->flags & LXT2_RD_SYM_F_DOUBLE) { fprintf(fv, "r%s %s\n", *pnt_value, vcdid(*pnt_facidx)); } else if(g->flags & LXT2_RD_SYM_F_STRING) { fprintf(fv, "s%s %s\n", *pnt_value, vcdid(*pnt_facidx)); } else { if(g->len==1) { fprintf(fv, "%c%s\n", (*pnt_value)[0], vcdid(*pnt_facidx)); } else { fprintf(fv, "b%s %s\n", vcd_truncate_bitvec(*pnt_value), vcdid(*pnt_facidx)); } } } int process_lxt(char *fname) { struct lxt2_rd_trace *lt; char *netname; lt=lxt2_rd_init(fname); if(lt) { int i; int numfacs; char time_dimension; int time_scale = 1; signed char scale; time_t walltime; lxtsint64_t timezero; numfacs = lxt2_rd_get_num_facs(lt); lxt2_rd_set_fac_process_mask_all(lt); lxt2_rd_set_max_block_mem_usage(lt, 0); /* no need to cache blocks */ scale = lxt2_rd_get_timescale(lt); switch(scale) { case 0: time_dimension = 's'; break; case -1: time_scale = 100; time_dimension = 'm'; break; case -2: time_scale = 10; case -3: time_dimension = 'm'; break; case -4: time_scale = 100; time_dimension = 'u'; break; case -5: time_scale = 10; case -6: time_dimension = 'u'; break; case -10: time_scale = 100; time_dimension = 'p'; break; case -11: time_scale = 10; case -12: time_dimension = 'p'; break; case -13: time_scale = 100; time_dimension = 'f'; break; case -14: time_scale = 10; case -15: time_dimension = 'f'; break; case -7: time_scale = 100; time_dimension = 'n'; break; case -8: time_scale = 10; case -9: default: time_dimension = 'n'; break; } time(&walltime); fprintf(fv, "$date\n"); fprintf(fv, "\t%s",asctime(localtime(&walltime))); fprintf(fv, "$end\n"); fprintf(fv, "$version\n\tlxt2vcd\n$end\n"); fprintf(fv, "$timescale %d%c%c $end\n", time_scale, time_dimension, !scale ? ' ' : 's'); timezero = lxt2_rd_get_timezero(lt); if(timezero) { fprintf(fv, "$timezero "LXT2_RD_LLD" $end\n", timezero); } for(i=0;iflags & LXT2_RD_SYM_F_DOUBLE) { fprintf(fv, "$var real 1 %s %s $end\n", vcdid(newindx), netname); } else if(g->flags & LXT2_RD_SYM_F_STRING) { fprintf(fv, "$var real 1 %s %s $end\n", vcdid(newindx), netname); } else { if(g->len==1) { if(g->msb!=-1) { fprintf(fv, "$var wire 1 %s %s ["LXT2_RD_LD"] $end\n", vcdid(newindx), netname, g->msb); } else { fprintf(fv, "$var wire 1 %s %s $end\n", vcdid(newindx), netname); } } else { if(!(g->flags & LXT2_RD_SYM_F_INTEGER)) { fprintf(fv, "$var wire "LXT2_RD_LD" %s %s ["LXT2_RD_LD":"LXT2_RD_LD"] $end\n", g->len, vcdid(newindx), netname, g->msb, g->lsb); } else { fprintf(fv, "$var integer "LXT2_RD_LD" %s %s $end\n", g->len, vcdid(newindx), netname); } } } } if(!flat_earth) { fv_output_hier(fv, ""); /* flush any remaining hierarchy if not back to toplevel */ free_hier(); } fprintf(fv, "$enddefinitions $end\n"); fprintf(fv, "$dumpvars\n"); vcd_prevtime = lxt2_rd_get_start_time(lt)-1; lxt2_rd_iter_blocks(lt, vcd_callback, NULL); if(vcd_prevtime!=lxt2_rd_get_end_time(lt)) { fprintf(fv, "#"LXT2_RD_LLD"\n", lxt2_rd_get_end_time(lt)); } lxt2_rd_close(lt); } else { fprintf(stderr, "lxt2_rd_init failed\n"); return(255); } return(0); } /*******************************************************************************/ void print_help(char *nam) { #ifdef __linux__ printf( "Usage: %s [OPTION]... [LXT2FILE]\n\n" " -l, --lxtname=FILE specify LXT2 input filename\n" " -o, --output=FILE specify output filename\n" " -f, --flatearth emit flattened hierarchies\n" " -n, --notruncate do not shorten bitvectors\n" " -h, --help display this help then exit\n\n" "VCD is emitted to stdout if output filename is unspecified.\n\n" "Report bugs to <"PACKAGE_BUGREPORT">.\n",nam); #else printf( "Usage: %s [OPTION]... [LXT2FILE]\n\n" " -l specify LXT2 input filename\n" " -o specify output filename\n" " -f emit flattened hierarchies\n" " -n do not shorten bitvectors\n" " -h display this help then exit\n\n" "VCD is emitted to stdout if output filename is unspecified.\n\n" "Report bugs to <"PACKAGE_BUGREPORT">.\n",nam); #endif exit(0); } int main(int argc, char **argv) { char opt_errors_encountered=0; char *lxname=NULL; char *outname=NULL; char *fvbuf=NULL; int c; int rc; WAVE_LOCALE_FIX while (1) { #ifdef __linux__ int option_index = 0; static struct option long_options[] = { {"lxtname", 1, 0, 'l'}, {"output", 1, 0, 'o'}, {"flatearth", 0, 0, 'f'}, {"notruncate", 0, 0, 'n'}, {"help", 0, 0, 'h'}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "l:o:fnh", long_options, &option_index); #else c = getopt (argc, argv, "l:o:fnh"); #endif if (c == -1) break; /* no more args */ switch (c) { case 'l': if(lxname) free(lxname); lxname = malloc(strlen(optarg)+1); strcpy(lxname, optarg); break; case 'o': if(outname) free(outname); outname = malloc(strlen(optarg)+1); strcpy(outname, optarg); break; case 'f': flat_earth=1; break; case 'n': notruncate=1; break; case 'h': print_help(argv[0]); break; case '?': opt_errors_encountered=1; break; default: /* unreachable */ break; } } if(opt_errors_encountered) { print_help(argv[0]); } if (optind < argc) { while (optind < argc) { if(!lxname) { lxname = malloc(strlen(argv[optind])+1); strcpy(lxname, argv[optind++]); } else { break; } } } if(!lxname) { print_help(argv[0]); } if(outname) { fv = fopen(outname, "wb"); if(!fv) { fprintf(stderr, "Could not open '%s', exiting.\n", outname); perror("Why"); exit(255); } fvbuf = malloc(LXT_VCD_WRITE_BUF_SIZ); setvbuf(fv, fvbuf, _IOFBF, LXT_VCD_WRITE_BUF_SIZ); } else { fv = stdout; } rc=process_lxt(lxname); if(outname) { free(outname); fclose(fv); } free(fvbuf); free(lxname); return(rc); } gtkwave-3.3.86/src/helpers/fstminer.c0000664000175000017500000002223213166335473017031 0ustar bybellbybell/* * Copyright (c) 2012-2014 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include "fst/fstapi.h" #if HAVE_GETOPT_H #include #endif #include "wave_locale.h" static char *match = NULL; static uint32_t matchlen = 0; static int names_only = 0; static char *killed_list = NULL; char killed_value = 1; static char **fac_names = NULL; static unsigned int *scope_idx = NULL; static char **scope_names = NULL; long allocated_scopes = 1; static void strcpy_no_space(char *d, const char *s) { while(*s) { char ch = *(s++); if(ch != ' ') { *(d++) = ch; } } *d = 0; } static void extractVarNames(void *xc) { struct fstHier *h; char *s; const char *fst_scope_name = NULL; int fst_scope_name_len = 0; long snum = 0; long max_snum = 0; while((h = fstReaderIterateHier(xc))) { switch(h->htyp) { case FST_HT_SCOPE: snum = ++max_snum; fst_scope_name = fstReaderPushScope(xc, h->u.scope.name, (void *)(snum)); /* fst_scope_name_len = fstReaderGetCurrentScopeLen(xc); scan-build */ if(snum >= allocated_scopes) { long new_allocated_scopes = allocated_scopes * 2; char **scope_names_2 = calloc(new_allocated_scopes, sizeof(char *)); memcpy(scope_names_2, scope_names, allocated_scopes * sizeof(char *)); free(scope_names); scope_names = scope_names_2; allocated_scopes = new_allocated_scopes; } scope_names[snum] = strdup(fst_scope_name); break; case FST_HT_UPSCOPE: /* fst_scope_name = scan-build */ fstReaderPopScope(xc); fst_scope_name_len = fstReaderGetCurrentScopeLen(xc); snum = fst_scope_name_len ? (long)fstReaderGetCurrentScopeUserInfo(xc) : 0; break; case FST_HT_VAR: if(!h->u.var.is_alias) { scope_idx[h->u.var.handle] = snum; s = fac_names[h->u.var.handle] = malloc(h->u.var.name_length + 1); strcpy_no_space(s, h->u.var.name); } } } } static char *get_facname(void *lt, fstHandle pnt_facidx) { (void) lt; if(scope_idx[pnt_facidx] && scope_names[scope_idx[pnt_facidx]]) { char *fst_scope_name = scope_names[scope_idx[pnt_facidx]]; int fst_scope_name_len = strlen(fst_scope_name); int fst_signal_name = strlen(fac_names[pnt_facidx]); char *s = malloc(fst_scope_name_len + 1 + fst_signal_name + 1); memcpy(s, fst_scope_name, fst_scope_name_len); s[fst_scope_name_len] = '.'; memcpy(s + fst_scope_name_len + 1, fac_names[pnt_facidx], fst_signal_name + 1); return(s); } else { return(strdup(fac_names[pnt_facidx])); } } static void vcd_callback2(void *lt, uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value, uint32_t plen) { if(plen >= matchlen) { if(!killed_list[pnt_facidx]) { if((!match) || (pnt_value /* scan-build */ && (strstr((const char *)pnt_value, match)))) { char *fn; fn = get_facname(lt, pnt_facidx); if(!names_only) { printf("#%"PRIu64" %s %s\n", pnt_time, fn, pnt_value); } else { printf("%s\n", fn); } free(fn); if(killed_value) { fstReaderClrFacProcessMask(lt, pnt_facidx); killed_list[pnt_facidx] = 1; } } } } } static void vcd_callback(void *lt, uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value) { uint32_t plen; if(pnt_value) { plen = strlen((const char *)pnt_value); } else { plen = 0; } vcd_callback2(lt, pnt_time, pnt_facidx, pnt_value, plen); } int process_fst(char *fname) { void *lt; int i; lt=fstReaderOpen(fname); if(lt) { int numfacs; numfacs = fstReaderGetVarCount(lt) + 1; killed_list = calloc(numfacs, sizeof(char)); fac_names = calloc(numfacs, sizeof(char *)); scope_names = calloc(allocated_scopes, sizeof(char *)); scope_idx = calloc(numfacs, sizeof(unsigned int)); extractVarNames(lt); fstReaderSetFacProcessMaskAll(lt); fstReaderIterBlocks2(lt, vcd_callback, vcd_callback2, lt, NULL); for(i=0;i.\n",nam); #else printf( "Usage: %s [OPTION]... [FSTFILE]\n\n" " -d specify FST input dumpfile\n" " -m bitwise match value\n" " -x hex match value\n" " -n emit facsnames only\n" " -c do not stop after first match\n" " -h display this help then exit (gtkwave savefile)\n\n" "First occurrence of facnames with times and matching values are emitted to\nstdout. Using -n generates a gtkwave save file.\n\n" "Report bugs to <"PACKAGE_BUGREPORT">.\n",nam); #endif exit(0); } int main(int argc, char **argv) { char opt_errors_encountered=0; char *lxname=NULL; int c; int rc; uint32_t i, j, k; int comprehensive = 0; WAVE_LOCALE_FIX while (1) { #ifdef __linux__ int option_index = 0; static struct option long_options[] = { {"dumpfile", 1, 0, 'd'}, {"match", 1, 0, 'm'}, {"hex", 1, 0, 'x'}, {"namesonly", 0, 0, 'n'}, {"comprehensive", 0, 0, 'c'}, {"help", 0, 0, 'h'}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "d:m:x:nch", long_options, &option_index); #else c = getopt (argc, argv, "d:m:x:nch"); #endif if (c == -1) break; /* no more args */ switch (c) { case 'c': comprehensive = 1; break; case 'n': names_only = 1; break; case 'd': if(lxname) free(lxname); lxname = malloc(strlen(optarg)+1); strcpy(lxname, optarg); break; case 'm': if(match) free(match); match = malloc((matchlen = strlen(optarg))+1); strcpy(match, optarg); break; case 'x': if(match) free(match); match = malloc((matchlen = 4*strlen(optarg))+1); for(i=0,k=0;i='0')&&(ch<='9')) { ch -= '0'; for(j=0;j<4;j++) { match[i+j] = ((ch>>(3-j))&1) + '0'; } } else if((ch>='a')&&(ch<='f')) { ch = ch - 'a' + 10; for(j=0;j<4;j++) { match[i+j] = ((ch>>(3-j))&1) + '0'; } } else /* "x" */ { for(j=0;j<4;j++) { match[i+j] = 'x'; } } } match[matchlen] = 0; break; case 'h': print_help(argv[0]); break; case '?': opt_errors_encountered=1; break; default: /* unreachable */ break; } } if(!names_only && comprehensive) { killed_value = 0; } if(opt_errors_encountered) { print_help(argv[0]); } if (optind < argc) { while (optind < argc) { if(lxname) { free(lxname); } lxname = malloc(strlen(argv[optind])+1); strcpy(lxname, argv[optind++]); } } if(!lxname) { print_help(argv[0]); } rc=process_fst(lxname); free(match); free(lxname); return(rc); } gtkwave-3.3.86/src/helpers/Makefile.am0000664000175000017500000000457113166335473017100 0ustar bybellbybell## -*- makefile -*- ## BIGFILES = -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 AIXFLAGS = -bmaxdata:0xd0000000/dsa LIBLZMA_CFLAGS = -I$(srcdir)/../liblzma $(LIBXZ_CFLAGS) LIBLZMA_LDADD = $(LIBXZ_LDADD) AM_CFLAGS= -I$(srcdir)/.. -I$(srcdir)/../.. $(LIBZ_CFLAGS) $(LIBBZ2_CFLAGS) $(LIBLZMA_CFLAGS) $(LIBJUDY_CFLAGS) $(EXTLOAD_CFLAGS) -I$(srcdir)/fst -I$(srcdir)/../../contrib/rtlbrowse bin_PROGRAMS= evcd2vcd fst2vcd vcd2fst fstminer ghwdump lxt2miner lxt2vcd \ shmidcat vcd2lxt vcd2lxt2 vcd2vzt \ vzt2vcd vztminer vcd2fst_SOURCES= vcd2fst.c $(srcdir)/fst/lz4.c $(srcdir)/fst/lz4.h $(srcdir)/fst/fastlz.c $(srcdir)/fst/fastlz.h $(srcdir)/fst/fstapi.c $(srcdir)/fst/fstapi.h $(srcdir)/../../contrib/rtlbrowse/jrb.h $(srcdir)/../../contrib/rtlbrowse/jrb.c vcd2fst_LDADD= $(LIBZ_LDADD) $(LIBJUDY_LDADD) fst2vcd_SOURCES= fst2vcd.c $(srcdir)/fst/lz4.c $(srcdir)/fst/lz4.h $(srcdir)/fst/fastlz.c $(srcdir)/fst/fastlz.h $(srcdir)/fst/fstapi.c $(srcdir)/fst/fstapi.h fst2vcd_LDADD= $(LIBZ_LDADD) $(LIBJUDY_LDADD) fstminer_SOURCES= fstminer.c $(srcdir)/fst/lz4.c $(srcdir)/fst/lz4.h $(srcdir)/fst/fastlz.c $(srcdir)/fst/fastlz.h $(srcdir)/fst/fstapi.c $(srcdir)/fst/fstapi.h fstminer_LDADD= $(LIBZ_LDADD) $(LIBJUDY_LDADD) vcd2lxt_SOURCES= vcd2lxt.c lxt_write.c lxt_write.h v2l_analyzer.h v2l_debug.c v2l_debug.h vcd2lxt_LDADD= $(LIBZ_LDADD) $(LIBBZ2_LDADD) lxt2vcd_SOURCES= lxt2_read.c lxt2_read.h lxt2vcd.c scopenav.c lxt2vcd_LDADD= $(LIBZ_LDADD) vcd2lxt2_SOURCES= vcd2lxt2.c lxt2_write.c lxt2_write.h v2l_analyzer_lxt2.h v2l_debug_lxt2.c v2l_debug_lxt2.h vcd2lxt2_LDADD= $(LIBZ_LDADD) vzt2vcd_SOURCES= vzt_read.c vzt_read.h vzt2vcd.c scopenav.c $(srcdir)/../liblzma/LzmaLib.c $(srcdir)/../liblzma/LzmaLib.h vzt2vcd_LDADD= $(LIBZ_LDADD) $(LIBBZ2_LDADD) $(LIBLZMA_LDADD) vcd2vzt_SOURCES= vcd2vzt.c vzt_write.c vzt_write.h v2l_analyzer_lxt2.h v2l_debug_lxt2.c v2l_debug_lxt2.h $(srcdir)/../liblzma/LzmaLib.c $(srcdir)/../liblzma/LzmaLib.h vcd2vzt_LDADD= $(LIBZ_LDADD) $(LIBBZ2_LDADD) $(LIBLZMA_LDADD) vztminer_SOURCES= vztminer.c vzt_read.c vzt_read.h $(srcdir)/../liblzma/LzmaLib.c $(srcdir)/../liblzma/LzmaLib.h vztminer_LDADD= $(LIBZ_LDADD) $(LIBBZ2_LDADD) $(LIBLZMA_LDADD) lxt2miner_SOURCES= lxt2miner.c lxt2_read.c lxt2_read.h lxt2miner_LDADD= $(LIBZ_LDADD) ghwdump_SOURCES= ghwdump.c $(srcdir)/../ghwlib.c evcd2vcd_SOURCES= evcd2vcd.c $(srcdir)/../../contrib/rtlbrowse/jrb.h $(srcdir)/../../contrib/rtlbrowse/jrb.c gtkwave-3.3.86/src/helpers/lxt2_read.h0000664000175000017500000002124713166335473017100 0ustar bybellbybell/* * Copyright (c) 2003-2012 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef DEFS_LXTR_H #define DEFS_LXTR_H #ifdef __cplusplus extern "C" { #endif #include #include #include #include #include #ifndef _MSC_VER #include #if HAVE_INTTYPES_H #include #endif #else typedef long off_t; #include #include #endif #ifndef HAVE_FSEEKO #define fseeko fseek #define ftello ftell #endif #include #ifdef __GNUC__ #if __STDC_VERSION__ >= 199901L #define _LXT2_RD_INLINE inline __attribute__((__gnu_inline__)) #else #define _LXT2_RD_INLINE inline #endif #else #define _LXT2_RD_INLINE #endif #define LXT2_RDLOAD "LXTLOAD | " #define LXT2_RD_HDRID (0x1380) #define LXT2_RD_VERSION (0x0001) #define LXT2_RD_GRANULE_SIZE (64) #define LXT2_RD_PARTIAL_SIZE (2048) #define LXT2_RD_GRAN_SECT_TIME 0 #define LXT2_RD_GRAN_SECT_DICT 1 #define LXT2_RD_GRAN_SECT_TIME_PARTIAL 2 #define LXT2_RD_MAX_BLOCK_MEM_USAGE (64*1024*1024) /* 64MB */ #ifndef _MSC_VER typedef uint8_t lxtint8_t; typedef uint16_t lxtint16_t; typedef uint32_t lxtint32_t; typedef uint64_t lxtint64_t; typedef int32_t lxtsint32_t; typedef int64_t lxtsint64_t; #ifndef __MINGW32__ #define LXT2_RD_LLD "%"PRId64 #define LXT2_RD_LD "%"PRId32 #else #define LXT2_RD_LLD "%I64d" #define LXT2_RD_LD "%d" #endif #define LXT2_RD_LLDESC(x) x##LL #define LXT2_RD_ULLDESC(x) x##ULL #else typedef unsigned __int8 lxtint8_t; typedef unsigned __int16 lxtint16_t; typedef unsigned __int32 lxtint32_t; typedef unsigned __int64 lxtint64_t; typedef __int32 lxtsint32_t; typedef __int64 lxtsint64_t; #define LXT2_RD_LLD "%I64d" #define LXT2_RD_LD "%d" #define LXT2_RD_LLDESC(x) x##i64 #define LXT2_RD_ULLDESC(x) x##i64 #endif #if LXT2_RD_GRANULE_SIZE > 32 typedef lxtint64_t granmsk_t; typedef lxtint32_t granmsk_smaller_t; #define LXT2_RD_GRAN_0VAL (LXT2_RD_ULLDESC(0)) #define LXT2_RD_GRAN_1VAL (LXT2_RD_ULLDESC(1)) #define get_fac_msk lxt2_rd_get_64 #define get_fac_msk_smaller lxt2_rd_get_32 #else typedef lxtint32_t granmsk_t; #define LXT2_RD_GRAN_0VAL (0) #define LXT2_RD_GRAN_1VAL (1) #define get_fac_msk lxt2_rd_get_32 #endif #define LXT2_RD_SYM_F_BITS (0) #define LXT2_RD_SYM_F_INTEGER (1<<0) #define LXT2_RD_SYM_F_DOUBLE (1<<1) #define LXT2_RD_SYM_F_STRING (1<<2) #define LXT2_RD_SYM_F_TIME (LXT2_RD_SYM_F_STRING) /* user must correctly format this as a string */ #define LXT2_RD_SYM_F_ALIAS (1<<3) #define LXT2_RD_SYM_F_SIGNED (1<<4) #define LXT2_RD_SYM_F_BOOLEAN (1<<5) #define LXT2_RD_SYM_F_NATURAL ((1<<6)|(LXT2_RD_SYM_F_INTEGER)) #define LXT2_RD_SYM_F_POSITIVE ((1<<7)|(LXT2_RD_SYM_F_INTEGER)) #define LXT2_RD_SYM_F_CHARACTER (1<<8) #define LXT2_RD_SYM_F_CONSTANT (1<<9) #define LXT2_RD_SYM_F_VARIABLE (1<<10) #define LXT2_RD_SYM_F_SIGNAL (1<<11) #define LXT2_RD_SYM_F_IN (1<<12) #define LXT2_RD_SYM_F_OUT (1<<13) #define LXT2_RD_SYM_F_INOUT (1<<14) #define LXT2_RD_SYM_F_WIRE (1<<15) #define LXT2_RD_SYM_F_REG (1<<16) enum LXT2_RD_Encodings { LXT2_RD_ENC_0, LXT2_RD_ENC_1, LXT2_RD_ENC_INV, LXT2_RD_ENC_LSH0, LXT2_RD_ENC_LSH1, LXT2_RD_ENC_RSH0, LXT2_RD_ENC_RSH1, LXT2_RD_ENC_ADD1, LXT2_RD_ENC_ADD2, LXT2_RD_ENC_ADD3, LXT2_RD_ENC_ADD4, LXT2_RD_ENC_SUB1, LXT2_RD_ENC_SUB2, LXT2_RD_ENC_SUB3, LXT2_RD_ENC_SUB4, LXT2_RD_ENC_X, LXT2_RD_ENC_Z, LXT2_RD_ENC_BLACKOUT, LXT2_RD_DICT_START }; struct lxt2_rd_block { char *mem; struct lxt2_rd_block *next; lxtint32_t uncompressed_siz, compressed_siz; lxtint64_t start, end; lxtint32_t num_map_entries, num_dict_entries; char *map_start; char *dict_start; char **string_pointers; /* based inside dict_start */ unsigned int *string_lens; off_t filepos; /* where block starts in file if we have to reload */ unsigned short_read_ignore : 1; /* tried to read once and it was corrupt so ignore next time */ unsigned exclude_block : 1; /* user marked this block off to be ignored */ }; struct lxt2_rd_geometry { lxtint32_t rows; lxtsint32_t msb, lsb; lxtint32_t flags, len; }; struct lxt2_rd_facname_cache { char *n; char *bufprev, *bufcurr; lxtint32_t old_facidx; }; struct lxt2_rd_trace { lxtint32_t *rows; lxtsint32_t *msb, *lsb; lxtint32_t *flags, *len; char **value; granmsk_t *fac_map; char **fac_curpos; char *process_mask; char *process_mask_compressed; void **radix_sort[LXT2_RD_GRANULE_SIZE+1]; void **next_radix; void (*value_change_callback)(struct lxt2_rd_trace **lt, lxtint64_t *time, lxtint32_t *facidx, char **value); void *user_callback_data_pointer; unsigned char fac_map_index_width; unsigned char fac_curpos_width; lxtint8_t granule_size; lxtint32_t numfacs, numrealfacs, numfacbytes, longestname, zfacnamesize, zfacname_predec_size, zfacgeometrysize; lxtint8_t timescale; lxtsint64_t timezero; lxtint64_t prev_time; unsigned char num_time_table_entries; lxtint64_t time_table[LXT2_RD_GRANULE_SIZE]; char *zfacnames; unsigned int numblocks; struct lxt2_rd_block *block_head, *block_curr; lxtint64_t start, end; struct lxt2_rd_geometry geometry; struct lxt2_rd_facname_cache *faccache; FILE *handle; gzFile zhandle; lxtint64_t block_mem_consumed, block_mem_max; unsigned process_mask_dirty : 1; /* only used on partial block reads */ }; /* * LXT2 Reader API functions... */ struct lxt2_rd_trace * lxt2_rd_init(const char *name); void lxt2_rd_close(struct lxt2_rd_trace *lt); lxtint64_t lxt2_rd_set_max_block_mem_usage(struct lxt2_rd_trace *lt, lxtint64_t block_mem_max); lxtint64_t lxt2_rd_get_block_mem_usage(struct lxt2_rd_trace *lt); unsigned int lxt2_rd_get_num_blocks(struct lxt2_rd_trace *lt); unsigned int lxt2_rd_get_num_active_blocks(struct lxt2_rd_trace *lt); lxtint32_t lxt2_rd_get_num_facs(struct lxt2_rd_trace *lt); char * lxt2_rd_get_facname(struct lxt2_rd_trace *lt, lxtint32_t facidx); struct lxt2_rd_geometry * lxt2_rd_get_fac_geometry(struct lxt2_rd_trace *lt, lxtint32_t facidx); lxtint32_t lxt2_rd_get_fac_rows(struct lxt2_rd_trace *lt, lxtint32_t facidx); lxtsint32_t lxt2_rd_get_fac_msb(struct lxt2_rd_trace *lt, lxtint32_t facidx); lxtsint32_t lxt2_rd_get_fac_lsb(struct lxt2_rd_trace *lt, lxtint32_t facidx); lxtint32_t lxt2_rd_get_fac_flags(struct lxt2_rd_trace *lt, lxtint32_t facidx); lxtint32_t lxt2_rd_get_fac_len(struct lxt2_rd_trace *lt, lxtint32_t facidx); lxtint32_t lxt2_rd_get_alias_root(struct lxt2_rd_trace *lt, lxtint32_t facidx); char lxt2_rd_get_timescale(struct lxt2_rd_trace *lt); lxtsint64_t lxt2_rd_get_timezero(struct lxt2_rd_trace *lt); lxtint64_t lxt2_rd_get_start_time(struct lxt2_rd_trace *lt); lxtint64_t lxt2_rd_get_end_time(struct lxt2_rd_trace *lt); int lxt2_rd_get_fac_process_mask(struct lxt2_rd_trace *lt, lxtint32_t facidx); int lxt2_rd_set_fac_process_mask(struct lxt2_rd_trace *lt, lxtint32_t facidx); int lxt2_rd_clr_fac_process_mask(struct lxt2_rd_trace *lt, lxtint32_t facidx); int lxt2_rd_set_fac_process_mask_all(struct lxt2_rd_trace *lt); int lxt2_rd_clr_fac_process_mask_all(struct lxt2_rd_trace *lt); /* null value_change_callback calls an empty dummy function */ int lxt2_rd_iter_blocks(struct lxt2_rd_trace *lt, void (*value_change_callback)(struct lxt2_rd_trace **lt, lxtint64_t *time, lxtint32_t *facidx, char **value), void *user_callback_data_pointer); void * lxt2_rd_get_user_callback_data_pointer(struct lxt2_rd_trace *lt); /* time (un)/restricted read ops */ unsigned int lxt2_rd_limit_time_range(struct lxt2_rd_trace *lt, lxtint64_t strt_time, lxtint64_t end_time); unsigned int lxt2_rd_unlimit_time_range(struct lxt2_rd_trace *lt); #ifdef __cplusplus } #endif #endif gtkwave-3.3.86/src/helpers/shmidcat.c0000664000175000017500000001550613166335473017004 0ustar bybellbybell/* * Copyright (c) 2006-2009 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include #include #include #if !defined _MSC_VER && !defined __MINGW32__ #include #include #endif #ifdef __MINGW32__ #include #endif #include #include #include #ifndef _MSC_VER #ifndef __MINGW32__ #include #else #include #endif #endif #include "wave_locale.h" #if !defined _MSC_VER /* size *must* match in gtkwave */ #define WAVE_PARTIAL_VCD_RING_BUFFER_SIZE (1024*1024) char *buf_top, *buf_curr, *buf; char *consume_ptr; unsigned int get_8(char *p) { if(p >= (buf + WAVE_PARTIAL_VCD_RING_BUFFER_SIZE)) { p-= WAVE_PARTIAL_VCD_RING_BUFFER_SIZE; } return((unsigned int)((unsigned char)*p)); } unsigned int get_32(char *p) { unsigned int rc; rc = (get_8(p++) << 24); rc |= (get_8(p++) << 16); rc |= (get_8(p++) << 8); rc |= (get_8(p) << 0); return(rc); } void put_8(char *p, unsigned int v) { if(p >= (buf + WAVE_PARTIAL_VCD_RING_BUFFER_SIZE)) { p -= WAVE_PARTIAL_VCD_RING_BUFFER_SIZE; } *p = (unsigned char)v; } void put_32(char *p, unsigned int v) { put_8(p++, (v>>24)); put_8(p++, (v>>16)); put_8(p++, (v>>8)); put_8(p, (v>>0)); } int consume(void) /* for testing only...similar code also is on the receiving end in gtkwave */ { char mybuff[32769]; int rc; if((rc = *consume_ptr)) { unsigned int len = get_32(consume_ptr+1); unsigned int i; for(i=0;i= (buf + WAVE_PARTIAL_VCD_RING_BUFFER_SIZE)) { consume_ptr -= WAVE_PARTIAL_VCD_RING_BUFFER_SIZE; } } return(rc); } void emit_string(char *s) { int len = strlen(s); uintptr_t l_top, l_curr; int consumed; int blksiz; for(;;) { while(!*buf_top) { if((blksiz = get_32(buf_top+1))) { buf_top += 1 + 4 + blksiz; if(buf_top >= (buf + WAVE_PARTIAL_VCD_RING_BUFFER_SIZE)) { buf_top -= WAVE_PARTIAL_VCD_RING_BUFFER_SIZE; } } else { break; } } l_top = (uintptr_t)buf_top; l_curr = (uintptr_t)buf_curr; if(l_curr >= l_top) { consumed = l_curr - l_top; } else { consumed = (l_curr + WAVE_PARTIAL_VCD_RING_BUFFER_SIZE) - l_top; } if((consumed + len + 16) > WAVE_PARTIAL_VCD_RING_BUFFER_SIZE) /* just a guardband, it's oversized */ { #ifdef __MINGW32__ Sleep(10); #else struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 1000000 / 100; select(0, NULL, NULL, NULL, &tv); #endif continue; } else { char *ss, *sd; put_32(buf_curr + 1, len); sd = buf_curr + 1 + 4; ss = s; while(*ss) { put_8(sd, *ss); ss++; sd++; } put_8(sd, 0); /* next valid */ put_32(sd+1, 0); /* next len */ put_8(buf_curr, 1); /* current valid */ buf_curr += 1 + 4 + len; if(buf_curr >= (buf + WAVE_PARTIAL_VCD_RING_BUFFER_SIZE)) { buf_curr -= WAVE_PARTIAL_VCD_RING_BUFFER_SIZE; } break; } } } /* * example driver code. this merely copies from stdin to the shared memory block. * emit_string() will ensure that buffer overruns do not occur; all you have to * do is write the block with the provision that the last character in the block is * a newline so that the VCD parser doesn't get lost. (in effect, when we run out * of buffer, gtkwave thinks it's EOF, but we restart again later. if the last * character is a newline, we EOF on a null string which is OK.) * the shared memory ID will print on stdout. pass that on to gtkwave for reading. */ int main(int argc, char **argv) { int buf_strlen = 0; char l_buf[32769]; FILE *f; #ifdef __MINGW32__ char mapName[65]; HANDLE hMapFile; #else struct shmid_ds ds; #endif int shmid; WAVE_LOCALE_FIX if(argc != 1) { f = fopen(argv[1], "rb"); if(!f) { fprintf(stderr, "Could not open '%s', exiting.\n", argv[1]); perror("Why"); exit(255); } } else { f = stdin; } #ifdef __MINGW32__ shmid = getpid(); sprintf(mapName, "shmidcat%d", shmid); hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, WAVE_PARTIAL_VCD_RING_BUFFER_SIZE, mapName); if(hMapFile != NULL) { buf_top = buf_curr = buf = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, WAVE_PARTIAL_VCD_RING_BUFFER_SIZE); #else shmid = shmget(0, WAVE_PARTIAL_VCD_RING_BUFFER_SIZE, IPC_CREAT | 0600 ); if(shmid >= 0) { buf_top = buf_curr = buf = shmat(shmid, NULL, 0); #endif memset(buf, 0, WAVE_PARTIAL_VCD_RING_BUFFER_SIZE); #ifdef __linux__ shmctl(shmid, IPC_RMID, &ds); /* mark for destroy, linux allows queuing up destruction now */ #endif printf("%08X\n", shmid); fflush(stdout); consume_ptr = buf; while(!feof(f)) { char *s = fgets(l_buf+buf_strlen, 32768-buf_strlen, f); if(!s) { #ifdef __MINGW32__ Sleep(200); #else struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 1000000 / 5; select(0, NULL, NULL, NULL, &tv); #endif continue; } if(strchr(l_buf+buf_strlen, '\n') || strchr(l_buf+buf_strlen, '\r')) { emit_string(l_buf); buf_strlen = 0; } else { buf_strlen += strlen(l_buf+buf_strlen); /* fprintf(stderr, "update len to: %d\n", buf_strlen); */ } } #ifndef __linux__ #ifdef __MINGW32__ UnmapViewOfFile(buf); CloseHandle(hMapFile); #else shmctl(shmid, IPC_RMID, &ds); /* mark for destroy */ #endif #endif } return(0); } #else int main(int argc, char **argv) { #if defined _MSC_VER fprintf(stderr, "Sorry, this doesn't run under Win32!\n"); #endif fprintf(stderr, "If you find that this program works on your platform, please report this to the maintainers.\n"); return(255); } #endif gtkwave-3.3.86/src/helpers/evcd2vcd.c0000664000175000017500000002461113166335473016705 0ustar bybellbybell/* * Copyright (c) 2009-2014 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #if HAVE_GETOPT_H #include #endif #include "../../contrib/rtlbrowse/jrb.h" #include "wave_locale.h" #include #include #include #include #ifdef HAVE_INTTYPES_H #include #endif #include ssize_t getline_replace(char **buf, size_t *len, FILE *f) { char *fgets_rc; if(!*buf) { *buf = malloc(32768); *len = 32767; } (*buf)[0] = 0; fgets_rc = fgets(*buf, 32767, f); if((!(*buf)[0])||(!fgets_rc)) { return(-1); } else { return(1); } } JRB vcd_ids = NULL; static unsigned int vcdid_hash(char *s) { unsigned int val=0; int i; int len = strlen(s); s+=(len-1); for(i=0;i p_lo) { len = p_hi - p_lo + 1; } else { len = p_lo - p_hi + 1; } } else { len = atoi(st); } st = strtok(NULL, " \t"); /* vcdid */ hash = vcdid_hash(st); nam = strtok(NULL, " \t"); /* name */ st = strtok(NULL, " \t"); /* $end */ if(strncmp(st, "$end", 4)) { *(st-1) = ' '; } node = jrb_find_int(vcd_ids, hash); if(!node) { Jval val; jrb_insert_int(vcd_ids, hash, val)->val2.i = len; } lbrack = strchr(nam, '['); if(!lbrack) { printf("$var wire %d %s %s_I $end\n", len, vcdid_unhash(hash * 2), nam); printf("$var wire %d %s %s_O $end\n", len, vcdid_unhash(hash * 2 + 1), nam); } else { *lbrack = 0; printf("$var wire %d %s %s_I", len, vcdid_unhash(hash * 2), nam); printf("[%s $end", lbrack+1); printf("$var wire %d %s %s_O", len, vcdid_unhash(hash * 2 + 1), nam); printf("[%s $end", lbrack+1); } } else if(!strncmp(buf, "$scope", 6)) { printf("%s", buf); } else if(!strncmp(buf, "$upscope", 8)) { printf("%s", buf); } else if(!strncmp(buf, "$endd", 5)) { printf("%s", buf); break; } else if(!strncmp(buf, "$timescale", 10)) { char *pnt; ss = getline_replace(&buf, &glen, f); if(ss == -1) { break; } line++; pnt = buf; printf("$timescale\n%s$end\n", pnt); } else if(!strncmp(buf, "$date", 5)) { char *pnt; ss = getline_replace(&buf, &glen, f); if(ss == -1) { break; } line++; pnt = buf; printf("$date\n%s$end\n", pnt); } else if(!strncmp(buf, "$version", 8)) { char *pnt; ss = getline_replace(&buf, &glen, f); if(ss == -1) { break; } line++; pnt = buf; printf("$version\n%s$end\n", pnt); } } while(!feof(f)) { unsigned int hash; size_t len; char *nl, *sp; ss = getline_replace(&buf, &len, f); if(ss == -1) { break; } nl = strchr(buf, '\n'); if(nl) *nl = 0; nl = strchr(buf, '\r'); if(nl) *nl = 0; switch(buf[0]) { case 'p': { char *src = buf+1; char *pnt = bin_fixbuff; int pchar = 0; for(;;) { if(!*src) break; if(isspace((int)(unsigned char)*src)) { if(pchar != ' ') { *(pnt++) = pchar = ' '; } src++; continue; } *(pnt++) = pchar = *(src++); } *pnt = 0; sp = strchr(bin_fixbuff, ' '); sp = strchr(sp+1, ' '); sp = strchr(sp+1, ' '); *sp = 0; hash = vcdid_hash(sp+1); node = jrb_find_int(vcd_ids, hash); if(node) { bin_fixbuff[node->val2.i] = 0; if(node->val2.i == 1) { int dir; for(dir = 0; dir < 2; dir++) { evcd_strcpy(bin_fixbuff2, bin_fixbuff, dir); printf("%c%s\n", bin_fixbuff2[0], vcdid_unhash(hash*2+dir)); } } else { int dir; for(dir = 0; dir < 2; dir++) { evcd_strcpy(bin_fixbuff2, bin_fixbuff, dir); printf("b%s %s\n", bin_fixbuff2, vcdid_unhash(hash*2+dir)); } } } else { } } break; case '#': printf("%s\n", buf); break; default: if(!strncmp(buf, "$dumpon", 7)) { printf("%s\n", buf); } else if(!strncmp(buf, "$dumpoff", 8)) { printf("%s\n", buf); } else if(!strncmp(buf, "$dumpvars", 9)) { printf("%s\n", buf); } else { /* printf("EVCD '%s'\n", buf); */ } break; } } if(buf) { free(buf); } if(f != stdin) fclose(f); exit(0); } void print_help(char *nam) { #ifdef __linux__ printf( "Usage: %s [OPTION]... [EVCDFILE]\n\n" " -f, --filename=FILE specify EVCD input filename\n" " -h, --help display this help then exit\n\n" "Note that EVCDFILE is optional provided the --filename\n" "option is specified. VCD is emitted to stdout.\n\n" "Report bugs to <"PACKAGE_BUGREPORT">.\n",nam); #else printf( "Usage: %s [OPTION]... [EVCDFILE]\n\n" " -f FILE specify EVCD input filename\n" " -h display this help then exit\n\n" "Note that EVCDFILE is optional provided the --filename\n" "option is specified. VCD is emitted to stdout.\n\n" "Report bugs to <"PACKAGE_BUGREPORT">.\n",nam); #endif exit(0); } int main(int argc, char **argv) { char opt_errors_encountered=0; char *vname=NULL; int c; WAVE_LOCALE_FIX while (1) { #ifdef __linux__ int option_index = 0; static struct option long_options[] = { {"filename", 1, 0, 'f'}, {"help", 0, 0, 'h'}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "f:h", long_options, &option_index); #else c = getopt (argc, argv, "f:h"); #endif if (c == -1) break; /* no more args */ switch (c) { case 'f': if(vname) free(vname); vname = malloc(strlen(optarg)+1); strcpy(vname, optarg); break; case 'h': print_help(argv[0]); break; case '?': opt_errors_encountered=1; break; default: /* unreachable */ break; } } if(opt_errors_encountered) { print_help(argv[0]); } if (optind < argc) { while (optind < argc) { if(!vname) { vname = malloc(strlen(argv[optind])+1); strcpy(vname, argv[optind++]); } else { break; } } } if(!vname) { print_help(argv[0]); } evcd_main(vname); free(vname); return(0); } gtkwave-3.3.86/src/helpers/Makefile.in0000664000175000017500000011440413166335473017106 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : bin_PROGRAMS = evcd2vcd$(EXEEXT) fst2vcd$(EXEEXT) vcd2fst$(EXEEXT) \ fstminer$(EXEEXT) ghwdump$(EXEEXT) lxt2miner$(EXEEXT) \ lxt2vcd$(EXEEXT) shmidcat$(EXEEXT) vcd2lxt$(EXEEXT) \ vcd2lxt2$(EXEEXT) vcd2vzt$(EXEEXT) vzt2vcd$(EXEEXT) \ vztminer$(EXEEXT) subdir = src/helpers DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_evcd2vcd_OBJECTS = evcd2vcd.$(OBJEXT) jrb.$(OBJEXT) evcd2vcd_OBJECTS = $(am_evcd2vcd_OBJECTS) evcd2vcd_LDADD = $(LDADD) am_fst2vcd_OBJECTS = fst2vcd.$(OBJEXT) lz4.$(OBJEXT) fastlz.$(OBJEXT) \ fstapi.$(OBJEXT) fst2vcd_OBJECTS = $(am_fst2vcd_OBJECTS) am__DEPENDENCIES_1 = fst2vcd_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_fstminer_OBJECTS = fstminer.$(OBJEXT) lz4.$(OBJEXT) \ fastlz.$(OBJEXT) fstapi.$(OBJEXT) fstminer_OBJECTS = $(am_fstminer_OBJECTS) fstminer_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_ghwdump_OBJECTS = ghwdump.$(OBJEXT) ghwlib.$(OBJEXT) ghwdump_OBJECTS = $(am_ghwdump_OBJECTS) ghwdump_LDADD = $(LDADD) am_lxt2miner_OBJECTS = lxt2miner.$(OBJEXT) lxt2_read.$(OBJEXT) lxt2miner_OBJECTS = $(am_lxt2miner_OBJECTS) lxt2miner_DEPENDENCIES = $(am__DEPENDENCIES_1) am_lxt2vcd_OBJECTS = lxt2_read.$(OBJEXT) lxt2vcd.$(OBJEXT) \ scopenav.$(OBJEXT) lxt2vcd_OBJECTS = $(am_lxt2vcd_OBJECTS) lxt2vcd_DEPENDENCIES = $(am__DEPENDENCIES_1) shmidcat_SOURCES = shmidcat.c shmidcat_OBJECTS = shmidcat.$(OBJEXT) shmidcat_LDADD = $(LDADD) am_vcd2fst_OBJECTS = vcd2fst.$(OBJEXT) lz4.$(OBJEXT) fastlz.$(OBJEXT) \ fstapi.$(OBJEXT) jrb.$(OBJEXT) vcd2fst_OBJECTS = $(am_vcd2fst_OBJECTS) vcd2fst_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_vcd2lxt_OBJECTS = vcd2lxt.$(OBJEXT) lxt_write.$(OBJEXT) \ v2l_debug.$(OBJEXT) vcd2lxt_OBJECTS = $(am_vcd2lxt_OBJECTS) vcd2lxt_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_vcd2lxt2_OBJECTS = vcd2lxt2.$(OBJEXT) lxt2_write.$(OBJEXT) \ v2l_debug_lxt2.$(OBJEXT) vcd2lxt2_OBJECTS = $(am_vcd2lxt2_OBJECTS) vcd2lxt2_DEPENDENCIES = $(am__DEPENDENCIES_1) am_vcd2vzt_OBJECTS = vcd2vzt.$(OBJEXT) vzt_write.$(OBJEXT) \ v2l_debug_lxt2.$(OBJEXT) LzmaLib.$(OBJEXT) vcd2vzt_OBJECTS = $(am_vcd2vzt_OBJECTS) am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) vcd2vzt_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_2) am_vzt2vcd_OBJECTS = vzt_read.$(OBJEXT) vzt2vcd.$(OBJEXT) \ scopenav.$(OBJEXT) LzmaLib.$(OBJEXT) vzt2vcd_OBJECTS = $(am_vzt2vcd_OBJECTS) vzt2vcd_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_2) am_vztminer_OBJECTS = vztminer.$(OBJEXT) vzt_read.$(OBJEXT) \ LzmaLib.$(OBJEXT) vztminer_OBJECTS = $(am_vztminer_OBJECTS) vztminer_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_2) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(evcd2vcd_SOURCES) $(fst2vcd_SOURCES) $(fstminer_SOURCES) \ $(ghwdump_SOURCES) $(lxt2miner_SOURCES) $(lxt2vcd_SOURCES) \ shmidcat.c $(vcd2fst_SOURCES) $(vcd2lxt_SOURCES) \ $(vcd2lxt2_SOURCES) $(vcd2vzt_SOURCES) $(vzt2vcd_SOURCES) \ $(vztminer_SOURCES) DIST_SOURCES = $(evcd2vcd_SOURCES) $(fst2vcd_SOURCES) \ $(fstminer_SOURCES) $(ghwdump_SOURCES) $(lxt2miner_SOURCES) \ $(lxt2vcd_SOURCES) shmidcat.c $(vcd2fst_SOURCES) \ $(vcd2lxt_SOURCES) $(vcd2lxt2_SOURCES) $(vcd2vzt_SOURCES) \ $(vzt2vcd_SOURCES) $(vztminer_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ BIGFILES = -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 AIXFLAGS = -bmaxdata:0xd0000000/dsa LIBLZMA_CFLAGS = -I$(srcdir)/../liblzma $(LIBXZ_CFLAGS) LIBLZMA_LDADD = $(LIBXZ_LDADD) AM_CFLAGS = -I$(srcdir)/.. -I$(srcdir)/../.. $(LIBZ_CFLAGS) $(LIBBZ2_CFLAGS) $(LIBLZMA_CFLAGS) $(LIBJUDY_CFLAGS) $(EXTLOAD_CFLAGS) -I$(srcdir)/fst -I$(srcdir)/../../contrib/rtlbrowse vcd2fst_SOURCES = vcd2fst.c $(srcdir)/fst/lz4.c $(srcdir)/fst/lz4.h $(srcdir)/fst/fastlz.c $(srcdir)/fst/fastlz.h $(srcdir)/fst/fstapi.c $(srcdir)/fst/fstapi.h $(srcdir)/../../contrib/rtlbrowse/jrb.h $(srcdir)/../../contrib/rtlbrowse/jrb.c vcd2fst_LDADD = $(LIBZ_LDADD) $(LIBJUDY_LDADD) fst2vcd_SOURCES = fst2vcd.c $(srcdir)/fst/lz4.c $(srcdir)/fst/lz4.h $(srcdir)/fst/fastlz.c $(srcdir)/fst/fastlz.h $(srcdir)/fst/fstapi.c $(srcdir)/fst/fstapi.h fst2vcd_LDADD = $(LIBZ_LDADD) $(LIBJUDY_LDADD) fstminer_SOURCES = fstminer.c $(srcdir)/fst/lz4.c $(srcdir)/fst/lz4.h $(srcdir)/fst/fastlz.c $(srcdir)/fst/fastlz.h $(srcdir)/fst/fstapi.c $(srcdir)/fst/fstapi.h fstminer_LDADD = $(LIBZ_LDADD) $(LIBJUDY_LDADD) vcd2lxt_SOURCES = vcd2lxt.c lxt_write.c lxt_write.h v2l_analyzer.h v2l_debug.c v2l_debug.h vcd2lxt_LDADD = $(LIBZ_LDADD) $(LIBBZ2_LDADD) lxt2vcd_SOURCES = lxt2_read.c lxt2_read.h lxt2vcd.c scopenav.c lxt2vcd_LDADD = $(LIBZ_LDADD) vcd2lxt2_SOURCES = vcd2lxt2.c lxt2_write.c lxt2_write.h v2l_analyzer_lxt2.h v2l_debug_lxt2.c v2l_debug_lxt2.h vcd2lxt2_LDADD = $(LIBZ_LDADD) vzt2vcd_SOURCES = vzt_read.c vzt_read.h vzt2vcd.c scopenav.c $(srcdir)/../liblzma/LzmaLib.c $(srcdir)/../liblzma/LzmaLib.h vzt2vcd_LDADD = $(LIBZ_LDADD) $(LIBBZ2_LDADD) $(LIBLZMA_LDADD) vcd2vzt_SOURCES = vcd2vzt.c vzt_write.c vzt_write.h v2l_analyzer_lxt2.h v2l_debug_lxt2.c v2l_debug_lxt2.h $(srcdir)/../liblzma/LzmaLib.c $(srcdir)/../liblzma/LzmaLib.h vcd2vzt_LDADD = $(LIBZ_LDADD) $(LIBBZ2_LDADD) $(LIBLZMA_LDADD) vztminer_SOURCES = vztminer.c vzt_read.c vzt_read.h $(srcdir)/../liblzma/LzmaLib.c $(srcdir)/../liblzma/LzmaLib.h vztminer_LDADD = $(LIBZ_LDADD) $(LIBBZ2_LDADD) $(LIBLZMA_LDADD) lxt2miner_SOURCES = lxt2miner.c lxt2_read.c lxt2_read.h lxt2miner_LDADD = $(LIBZ_LDADD) ghwdump_SOURCES = ghwdump.c $(srcdir)/../ghwlib.c evcd2vcd_SOURCES = evcd2vcd.c $(srcdir)/../../contrib/rtlbrowse/jrb.h $(srcdir)/../../contrib/rtlbrowse/jrb.c all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/helpers/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/helpers/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) evcd2vcd$(EXEEXT): $(evcd2vcd_OBJECTS) $(evcd2vcd_DEPENDENCIES) $(EXTRA_evcd2vcd_DEPENDENCIES) @rm -f evcd2vcd$(EXEEXT) $(AM_V_CCLD)$(LINK) $(evcd2vcd_OBJECTS) $(evcd2vcd_LDADD) $(LIBS) fst2vcd$(EXEEXT): $(fst2vcd_OBJECTS) $(fst2vcd_DEPENDENCIES) $(EXTRA_fst2vcd_DEPENDENCIES) @rm -f fst2vcd$(EXEEXT) $(AM_V_CCLD)$(LINK) $(fst2vcd_OBJECTS) $(fst2vcd_LDADD) $(LIBS) fstminer$(EXEEXT): $(fstminer_OBJECTS) $(fstminer_DEPENDENCIES) $(EXTRA_fstminer_DEPENDENCIES) @rm -f fstminer$(EXEEXT) $(AM_V_CCLD)$(LINK) $(fstminer_OBJECTS) $(fstminer_LDADD) $(LIBS) ghwdump$(EXEEXT): $(ghwdump_OBJECTS) $(ghwdump_DEPENDENCIES) $(EXTRA_ghwdump_DEPENDENCIES) @rm -f ghwdump$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ghwdump_OBJECTS) $(ghwdump_LDADD) $(LIBS) lxt2miner$(EXEEXT): $(lxt2miner_OBJECTS) $(lxt2miner_DEPENDENCIES) $(EXTRA_lxt2miner_DEPENDENCIES) @rm -f lxt2miner$(EXEEXT) $(AM_V_CCLD)$(LINK) $(lxt2miner_OBJECTS) $(lxt2miner_LDADD) $(LIBS) lxt2vcd$(EXEEXT): $(lxt2vcd_OBJECTS) $(lxt2vcd_DEPENDENCIES) $(EXTRA_lxt2vcd_DEPENDENCIES) @rm -f lxt2vcd$(EXEEXT) $(AM_V_CCLD)$(LINK) $(lxt2vcd_OBJECTS) $(lxt2vcd_LDADD) $(LIBS) shmidcat$(EXEEXT): $(shmidcat_OBJECTS) $(shmidcat_DEPENDENCIES) $(EXTRA_shmidcat_DEPENDENCIES) @rm -f shmidcat$(EXEEXT) $(AM_V_CCLD)$(LINK) $(shmidcat_OBJECTS) $(shmidcat_LDADD) $(LIBS) vcd2fst$(EXEEXT): $(vcd2fst_OBJECTS) $(vcd2fst_DEPENDENCIES) $(EXTRA_vcd2fst_DEPENDENCIES) @rm -f vcd2fst$(EXEEXT) $(AM_V_CCLD)$(LINK) $(vcd2fst_OBJECTS) $(vcd2fst_LDADD) $(LIBS) vcd2lxt$(EXEEXT): $(vcd2lxt_OBJECTS) $(vcd2lxt_DEPENDENCIES) $(EXTRA_vcd2lxt_DEPENDENCIES) @rm -f vcd2lxt$(EXEEXT) $(AM_V_CCLD)$(LINK) $(vcd2lxt_OBJECTS) $(vcd2lxt_LDADD) $(LIBS) vcd2lxt2$(EXEEXT): $(vcd2lxt2_OBJECTS) $(vcd2lxt2_DEPENDENCIES) $(EXTRA_vcd2lxt2_DEPENDENCIES) @rm -f vcd2lxt2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(vcd2lxt2_OBJECTS) $(vcd2lxt2_LDADD) $(LIBS) vcd2vzt$(EXEEXT): $(vcd2vzt_OBJECTS) $(vcd2vzt_DEPENDENCIES) $(EXTRA_vcd2vzt_DEPENDENCIES) @rm -f vcd2vzt$(EXEEXT) $(AM_V_CCLD)$(LINK) $(vcd2vzt_OBJECTS) $(vcd2vzt_LDADD) $(LIBS) vzt2vcd$(EXEEXT): $(vzt2vcd_OBJECTS) $(vzt2vcd_DEPENDENCIES) $(EXTRA_vzt2vcd_DEPENDENCIES) @rm -f vzt2vcd$(EXEEXT) $(AM_V_CCLD)$(LINK) $(vzt2vcd_OBJECTS) $(vzt2vcd_LDADD) $(LIBS) vztminer$(EXEEXT): $(vztminer_OBJECTS) $(vztminer_DEPENDENCIES) $(EXTRA_vztminer_DEPENDENCIES) @rm -f vztminer$(EXEEXT) $(AM_V_CCLD)$(LINK) $(vztminer_OBJECTS) $(vztminer_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LzmaLib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evcd2vcd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fastlz.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fst2vcd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fstapi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fstminer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ghwdump.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ghwlib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jrb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lxt2_read.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lxt2_write.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lxt2miner.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lxt2vcd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lxt_write.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lz4.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scopenav.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shmidcat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v2l_debug.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v2l_debug_lxt2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcd2fst.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcd2lxt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcd2lxt2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcd2vzt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vzt2vcd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vzt_read.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vzt_write.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vztminer.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` jrb.o: $(srcdir)/../../contrib/rtlbrowse/jrb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT jrb.o -MD -MP -MF $(DEPDIR)/jrb.Tpo -c -o jrb.o `test -f '$(srcdir)/../../contrib/rtlbrowse/jrb.c' || echo '$(srcdir)/'`$(srcdir)/../../contrib/rtlbrowse/jrb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/jrb.Tpo $(DEPDIR)/jrb.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/../../contrib/rtlbrowse/jrb.c' object='jrb.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o jrb.o `test -f '$(srcdir)/../../contrib/rtlbrowse/jrb.c' || echo '$(srcdir)/'`$(srcdir)/../../contrib/rtlbrowse/jrb.c jrb.obj: $(srcdir)/../../contrib/rtlbrowse/jrb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT jrb.obj -MD -MP -MF $(DEPDIR)/jrb.Tpo -c -o jrb.obj `if test -f '$(srcdir)/../../contrib/rtlbrowse/jrb.c'; then $(CYGPATH_W) '$(srcdir)/../../contrib/rtlbrowse/jrb.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../../contrib/rtlbrowse/jrb.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/jrb.Tpo $(DEPDIR)/jrb.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/../../contrib/rtlbrowse/jrb.c' object='jrb.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o jrb.obj `if test -f '$(srcdir)/../../contrib/rtlbrowse/jrb.c'; then $(CYGPATH_W) '$(srcdir)/../../contrib/rtlbrowse/jrb.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../../contrib/rtlbrowse/jrb.c'; fi` lz4.o: $(srcdir)/fst/lz4.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lz4.o -MD -MP -MF $(DEPDIR)/lz4.Tpo -c -o lz4.o `test -f '$(srcdir)/fst/lz4.c' || echo '$(srcdir)/'`$(srcdir)/fst/lz4.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lz4.Tpo $(DEPDIR)/lz4.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/fst/lz4.c' object='lz4.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lz4.o `test -f '$(srcdir)/fst/lz4.c' || echo '$(srcdir)/'`$(srcdir)/fst/lz4.c lz4.obj: $(srcdir)/fst/lz4.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lz4.obj -MD -MP -MF $(DEPDIR)/lz4.Tpo -c -o lz4.obj `if test -f '$(srcdir)/fst/lz4.c'; then $(CYGPATH_W) '$(srcdir)/fst/lz4.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/fst/lz4.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lz4.Tpo $(DEPDIR)/lz4.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/fst/lz4.c' object='lz4.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lz4.obj `if test -f '$(srcdir)/fst/lz4.c'; then $(CYGPATH_W) '$(srcdir)/fst/lz4.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/fst/lz4.c'; fi` fastlz.o: $(srcdir)/fst/fastlz.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fastlz.o -MD -MP -MF $(DEPDIR)/fastlz.Tpo -c -o fastlz.o `test -f '$(srcdir)/fst/fastlz.c' || echo '$(srcdir)/'`$(srcdir)/fst/fastlz.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fastlz.Tpo $(DEPDIR)/fastlz.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/fst/fastlz.c' object='fastlz.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fastlz.o `test -f '$(srcdir)/fst/fastlz.c' || echo '$(srcdir)/'`$(srcdir)/fst/fastlz.c fastlz.obj: $(srcdir)/fst/fastlz.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fastlz.obj -MD -MP -MF $(DEPDIR)/fastlz.Tpo -c -o fastlz.obj `if test -f '$(srcdir)/fst/fastlz.c'; then $(CYGPATH_W) '$(srcdir)/fst/fastlz.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/fst/fastlz.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fastlz.Tpo $(DEPDIR)/fastlz.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/fst/fastlz.c' object='fastlz.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fastlz.obj `if test -f '$(srcdir)/fst/fastlz.c'; then $(CYGPATH_W) '$(srcdir)/fst/fastlz.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/fst/fastlz.c'; fi` fstapi.o: $(srcdir)/fst/fstapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fstapi.o -MD -MP -MF $(DEPDIR)/fstapi.Tpo -c -o fstapi.o `test -f '$(srcdir)/fst/fstapi.c' || echo '$(srcdir)/'`$(srcdir)/fst/fstapi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fstapi.Tpo $(DEPDIR)/fstapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/fst/fstapi.c' object='fstapi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fstapi.o `test -f '$(srcdir)/fst/fstapi.c' || echo '$(srcdir)/'`$(srcdir)/fst/fstapi.c fstapi.obj: $(srcdir)/fst/fstapi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fstapi.obj -MD -MP -MF $(DEPDIR)/fstapi.Tpo -c -o fstapi.obj `if test -f '$(srcdir)/fst/fstapi.c'; then $(CYGPATH_W) '$(srcdir)/fst/fstapi.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/fst/fstapi.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fstapi.Tpo $(DEPDIR)/fstapi.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/fst/fstapi.c' object='fstapi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fstapi.obj `if test -f '$(srcdir)/fst/fstapi.c'; then $(CYGPATH_W) '$(srcdir)/fst/fstapi.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/fst/fstapi.c'; fi` ghwlib.o: $(srcdir)/../ghwlib.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ghwlib.o -MD -MP -MF $(DEPDIR)/ghwlib.Tpo -c -o ghwlib.o `test -f '$(srcdir)/../ghwlib.c' || echo '$(srcdir)/'`$(srcdir)/../ghwlib.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ghwlib.Tpo $(DEPDIR)/ghwlib.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/../ghwlib.c' object='ghwlib.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ghwlib.o `test -f '$(srcdir)/../ghwlib.c' || echo '$(srcdir)/'`$(srcdir)/../ghwlib.c ghwlib.obj: $(srcdir)/../ghwlib.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ghwlib.obj -MD -MP -MF $(DEPDIR)/ghwlib.Tpo -c -o ghwlib.obj `if test -f '$(srcdir)/../ghwlib.c'; then $(CYGPATH_W) '$(srcdir)/../ghwlib.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../ghwlib.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ghwlib.Tpo $(DEPDIR)/ghwlib.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/../ghwlib.c' object='ghwlib.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ghwlib.obj `if test -f '$(srcdir)/../ghwlib.c'; then $(CYGPATH_W) '$(srcdir)/../ghwlib.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../ghwlib.c'; fi` LzmaLib.o: $(srcdir)/../liblzma/LzmaLib.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT LzmaLib.o -MD -MP -MF $(DEPDIR)/LzmaLib.Tpo -c -o LzmaLib.o `test -f '$(srcdir)/../liblzma/LzmaLib.c' || echo '$(srcdir)/'`$(srcdir)/../liblzma/LzmaLib.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/LzmaLib.Tpo $(DEPDIR)/LzmaLib.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/../liblzma/LzmaLib.c' object='LzmaLib.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o LzmaLib.o `test -f '$(srcdir)/../liblzma/LzmaLib.c' || echo '$(srcdir)/'`$(srcdir)/../liblzma/LzmaLib.c LzmaLib.obj: $(srcdir)/../liblzma/LzmaLib.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT LzmaLib.obj -MD -MP -MF $(DEPDIR)/LzmaLib.Tpo -c -o LzmaLib.obj `if test -f '$(srcdir)/../liblzma/LzmaLib.c'; then $(CYGPATH_W) '$(srcdir)/../liblzma/LzmaLib.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../liblzma/LzmaLib.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/LzmaLib.Tpo $(DEPDIR)/LzmaLib.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/../liblzma/LzmaLib.c' object='LzmaLib.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o LzmaLib.obj `if test -f '$(srcdir)/../liblzma/LzmaLib.c'; then $(CYGPATH_W) '$(srcdir)/../liblzma/LzmaLib.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../liblzma/LzmaLib.c'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-binPROGRAMS install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/src/helpers/vzt2vcd.c0000664000175000017500000002713413166335473016612 0ustar bybellbybell/* * Copyright (c) 2003-2014 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include "vzt_read.h" #if HAVE_GETOPT_H #include #endif #include #include "wave_locale.h" #define VZT_VCD_WRITE_BUF_SIZ (2 * 1024 * 1024) static int flat_earth = 0; static int vectorize = 0; static int notruncate = 0; static FILE *fv = NULL; extern void free_hier(void); extern char *fv_output_hier(FILE *fv, char *name); /* * generate a vcd identifier for a given facindx */ static char *vcdid(unsigned int value) { static char buf[16]; char *pnt = buf; value++; /* zero is illegal for a value...it is assumed they start at one */ while (value) { value--; *(pnt++) = (char)('!' + value % 94); value = value / 94; } *pnt = 0; return(buf); } /* static char *vcdid(int value) { static char buf[16]; int i; for(i=0;i<15;i++) { buf[i]=(char)((value%94)+33); value=value/94; if(!value) {buf[i+1]=0; break;} } return(buf); } */ static char *vcd_truncate_bitvec(char *s) { char l, r; if(notruncate) return(s); r=*s; if(r=='1') { return s; } else { s++; } for(;;s++) { l=r; r=*s; if(!r) return (s-1); if(l!=r) { return(((l=='0')&&(r=='1'))?s:s-1); } } } static vztint64_t vcd_prevtime; char vcd_blackout; void vcd_callback(struct vzt_rd_trace **lt, vztint64_t *pnt_time, vztint32_t *pnt_facidx, char **pnt_value) { struct vzt_rd_geometry *g = vzt_rd_get_fac_geometry(*lt, *pnt_facidx); /* fprintf(stderr, VZT_RD_LLD" %d %s\n", *pnt_time, *pnt_facidx, *pnt_value); */ if(vcd_prevtime != *pnt_time) { vcd_prevtime = *pnt_time; fprintf(fv, "#"VZT_RD_LLD"\n", *pnt_time); } if(!(*pnt_value)[0]) { if(!vcd_blackout) { vcd_blackout = 1; fprintf(fv, "$dumpoff\n"); } return; } else { if(vcd_blackout) { vcd_blackout = 0; fprintf(fv, "$dumpon\n"); } } if(g->flags & VZT_RD_SYM_F_DOUBLE) { fprintf(fv, "r%s %s\n", *pnt_value, vcdid(*pnt_facidx)); } else if(g->flags & VZT_RD_SYM_F_STRING) { fprintf(fv, "s%s %s\n", *pnt_value, vcdid(*pnt_facidx)); } else { if(g->len==1) { fprintf(fv, "%c%s\n", (*pnt_value)[0], vcdid(*pnt_facidx)); } else { fprintf(fv, "b%s %s\n", vcd_truncate_bitvec(*pnt_value), vcdid(*pnt_facidx)); } } } int process_vzt(char *fname) { struct vzt_rd_trace *lt; char *netname; lt=vzt_rd_init(fname); if(lt) { int i; int numfacs; char time_dimension; int time_scale = 1; signed char scale; time_t walltime; vztsint64_t timezero; if(vectorize) { vzt_rd_vectorize(lt); } numfacs = vzt_rd_get_num_facs(lt); vzt_rd_set_fac_process_mask_all(lt); vzt_rd_set_max_block_mem_usage(lt, 0); /* no need to cache blocks */ scale = vzt_rd_get_timescale(lt); switch(scale) { case 0: time_dimension = 's'; break; case -1: time_scale = 100; time_dimension = 'm'; break; case -2: time_scale = 10; case -3: time_dimension = 'm'; break; case -4: time_scale = 100; time_dimension = 'u'; break; case -5: time_scale = 10; case -6: time_dimension = 'u'; break; case -10: time_scale = 100; time_dimension = 'p'; break; case -11: time_scale = 10; case -12: time_dimension = 'p'; break; case -13: time_scale = 100; time_dimension = 'f'; break; case -14: time_scale = 10; case -15: time_dimension = 'f'; break; case -7: time_scale = 100; time_dimension = 'n'; break; case -8: time_scale = 10; case -9: default: time_dimension = 'n'; break; } time(&walltime); fprintf(fv, "$date\n"); fprintf(fv, "\t%s",asctime(localtime(&walltime))); fprintf(fv, "$end\n"); fprintf(fv, "$version\n\tvzt2vcd\n$end\n"); fprintf(fv, "$timescale %d%c%c $end\n", time_scale, time_dimension, !scale ? ' ' : 's'); timezero = vzt_rd_get_timezero(lt); if(timezero) { fprintf(fv, "$timezero "VZT_RD_LLD" $end\n", timezero); } for(i=0;ilen==0) continue; } if(!flat_earth) { netname = fv_output_hier(fv, vzt_rd_get_facname(lt, i)); } else { netname = vzt_rd_get_facname(lt, i); } if(g->flags & VZT_RD_SYM_F_DOUBLE) { fprintf(fv, "$var real 1 %s %s $end\n", vcdid(newindx), netname); } else if(g->flags & VZT_RD_SYM_F_STRING) { fprintf(fv, "$var real 1 %s %s $end\n", vcdid(newindx), netname); } else { if(g->len==1) { if(g->msb!=-1) { fprintf(fv, "$var wire 1 %s %s ["VZT_RD_LD"] $end\n", vcdid(newindx), netname, g->msb); } else { fprintf(fv, "$var wire 1 %s %s $end\n", vcdid(newindx), netname); } } else { if(!(g->flags & VZT_RD_SYM_F_INTEGER)) { if(g->len) fprintf(fv, "$var wire "VZT_RD_LD" %s %s ["VZT_RD_LD":"VZT_RD_LD"] $end\n", g->len, vcdid(newindx), netname, g->msb, g->lsb); } else { fprintf(fv, "$var integer "VZT_RD_LD" %s %s $end\n", g->len, vcdid(newindx), netname); } } } } if(!flat_earth) { fv_output_hier(fv, ""); /* flush any remaining hierarchy if not back to toplevel */ free_hier(); } fprintf(fv, "$enddefinitions $end\n"); fprintf(fv, "$dumpvars\n"); vcd_prevtime = vzt_rd_get_start_time(lt)-1; vzt_rd_iter_blocks(lt, vcd_callback, NULL); if(vcd_prevtime!=vzt_rd_get_end_time(lt)) { fprintf(fv, "#"VZT_RD_LLD"\n", vzt_rd_get_end_time(lt)); } vzt_rd_close(lt); } else { fprintf(stderr, "vzt_rd_init failed\n"); return(255); } return(0); } /*******************************************************************************/ void print_help(char *nam) { #ifdef __linux__ printf( "Usage: %s [OPTION]... [VZTFILE]\n\n" " -v, --vztname=FILE specify VZT input filename\n" " -o, --output=FILE specify output filename\n" " -f, --flatearth emit flattened hierarchies\n" " -c, --coalesce coalesce bitblasted vectors\n" " -n, --notruncate do not shorten bitvectors\n" " -h, --help display this help then exit\n\n" "VCD is emitted to stdout if output filename is unspecified.\n\n" "Report bugs to <"PACKAGE_BUGREPORT">.\n",nam); #else printf( "Usage: %s [OPTION]... [VZTFILE]\n\n" " -v specify VZT input filename\n" " -o specify output filename\n" " -f emit flattened hierarchies\n" " -c coalesce bitblasted vectors\n" " -n do not shorten bitvectors\n" " -h display this help then exit\n\n" "VCD is emitted to stdout if output filename is unspecified.\n\n" "Report bugs to <"PACKAGE_BUGREPORT">.\n",nam); #endif exit(0); } int main(int argc, char **argv) { char opt_errors_encountered=0; char *lxname=NULL; char *outname=NULL; char *fvbuf=NULL; int c; int rc; WAVE_LOCALE_FIX while (1) { #ifdef __linux__ int option_index = 0; static struct option long_options[] = { {"vztname", 1, 0, 'v'}, {"output", 1, 0, 'o'}, {"coalesce", 0, 0, 'c'}, {"flatearth", 0, 0, 'f'}, {"notruncate", 0, 0, 'n'}, {"help", 0, 0, 'h'}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "v:o:cfnh", long_options, &option_index); #else c = getopt (argc, argv, "v:o:cfnh"); #endif if (c == -1) break; /* no more args */ switch (c) { case 'v': if(lxname) free(lxname); lxname = malloc(strlen(optarg)+1); strcpy(lxname, optarg); break; case 'o': if(outname) free(outname); outname = malloc(strlen(optarg)+1); strcpy(outname, optarg); break; case 'c': vectorize=1; break; case 'n': notruncate=1; break; case 'f': flat_earth=1; break; case 'h': print_help(argv[0]); break; case '?': opt_errors_encountered=1; break; default: /* unreachable */ break; } } if(opt_errors_encountered) { print_help(argv[0]); } if (optind < argc) { while (optind < argc) { if(!lxname) { lxname = malloc(strlen(argv[optind])+1); strcpy(lxname, argv[optind++]); } else { break; } } } if(!lxname) { print_help(argv[0]); } if(outname) { fv = fopen(outname, "wb"); if(!fv) { fprintf(stderr, "Could not open '%s', exiting.\n", outname); perror("Why"); exit(255); } fvbuf = malloc(VZT_VCD_WRITE_BUF_SIZ); setvbuf(fv, fvbuf, _IOFBF, VZT_VCD_WRITE_BUF_SIZ); } else { fv = stdout; } rc=process_vzt(lxname); if(outname) { free(outname); fclose(fv); } free(fvbuf); free(lxname); return(rc); } gtkwave-3.3.86/src/helpers/vcd2vzt.c0000664000175000017500000012770013166335473016612 0ustar bybellbybell/* * Copyright (c) 1999-2015 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ /* * vcd.c 23jan99ajb * evcd parts 29jun99ajb * profiler optimizations 15jul99ajb * stripped out of gtkwave 21jul99ajb * fix for duplicate nets 19dec00ajb * lxt conversion added 20nov01ajb */ #if defined _AIX #pragma alloca #endif #include #include #include "v2l_analyzer_lxt2.h" #include "vzt_write.h" #include "wave_locale.h" #undef VCD_BSEARCH_IS_PERFECT /* bsearch is imperfect under linux, but OK under AIX */ struct vzt_wr_trace *lt=NULL; int numfacs=0; int deadcnt=0; int ziptype=0; int opt_depth = 4; uint64_t opt_break_size = 0; int opt_maxgranule = 8; int opt_twostate = 0; int opt_rle = 0; struct symbol **sym=NULL; struct symbol **facs=NULL; struct symbol *firstnode=NULL; struct symbol *curnode=NULL; TimeType min_time=-1, max_time=-1; char hier_delimeter='.'; char deadchar='X'; int vcd_explicit_zero_subscripts=-1; /* 0=yes, -1=no */ char atomic_vectors=1; static FILE *vcd_handle=NULL; static char vcd_is_compressed=0; static void add_histent(TimeType time, struct Node *n, char ch, int regadd, char *vector); static void add_tail_histents(void); static void evcd_strcpy(char *dst, char *src); static int vcdlineno=1; static int header_over=0; static int dumping_off=0; static TimeType start_time=-1; static TimeType end_time=-1; static TimeType current_time=-1; static TimeType time_scale=1; /* multiplier is 1, 10, 100 */ static TimeType time_zero=0; static char vcd_hier_delimeter[2]={0, 0}; /* fill in after rc reading code */ /******************************************************************/ static struct slist *slistroot=NULL, *slistcurr=NULL; static char *slisthier=NULL; static int slisthier_len=0; /******************************************************************/ enum Tokens { T_VAR, T_END, T_SCOPE, T_UPSCOPE, T_COMMENT, T_DATE, T_DUMPALL, T_DUMPOFF, T_DUMPON, T_DUMPVARS, T_ENDDEFINITIONS, T_DUMPPORTS, T_DUMPPORTSOFF, T_DUMPPORTSON, T_DUMPPORTSALL, T_TIMESCALE, T_VERSION, T_VCDCLOSE, T_TIMEZERO, T_EOF, T_STRING, T_UNKNOWN_KEY }; char *tokens[]={ "var", "end", "scope", "upscope", "comment", "date", "dumpall", "dumpoff", "dumpon", "dumpvars", "enddefinitions", "dumpports", "dumpportsoff", "dumpportson", "dumpportsall", "timescale", "version", "vcdclose", "timezero", "", "", "" }; #define NUM_TOKENS 19 static int T_MAX_STR=1024; /* was originally a const..now it reallocs */ static char *yytext=NULL; static int yylen=0, yylen_cache=0; #define T_GET tok=get_token();if((tok==T_END)||(tok==T_EOF))break; /******************************************************************/ static struct vcdsymbol *vcdsymroot=NULL, *vcdsymcurr=NULL; static struct vcdsymbol **sorted=NULL; static struct vcdsymbol **indexed=NULL; enum VarTypes { V_EVENT, V_PARAMETER, V_INTEGER, V_REAL, V_REAL_PARAMETER=V_REAL, V_REALTIME=V_REAL, V_STRINGTYPE=V_REAL, V_REG, V_SUPPLY0, V_SUPPLY1, V_TIME, V_TRI, V_TRIAND, V_TRIOR, V_TRIREG, V_TRI0, V_TRI1, V_WAND, V_WIRE, V_WOR, V_PORT, V_IN=V_PORT, V_OUT=V_PORT, V_INOUT=V_PORT, V_END, V_LB, V_COLON, V_RB, V_STRING }; static char *vartypes[]={ "event", "parameter", "integer", "real", "real_parameter", "realtime", "string", "reg", "supply0", "supply1", "time", "tri", "triand", "trior", "trireg", "tri0", "tri1", "wand", "wire", "wor", "port", "in", "out", "inout", "$end", "", "", "", ""}; static const unsigned char varenums[] = { V_EVENT, V_PARAMETER, V_INTEGER, V_REAL, V_REAL_PARAMETER, V_REALTIME, V_STRINGTYPE, V_REG, V_SUPPLY0, V_SUPPLY1, V_TIME, V_TRI, V_TRIAND, V_TRIOR, V_TRIREG, V_TRI0, V_TRI1, V_WAND, V_WIRE, V_WOR, V_PORT, V_IN, V_OUT, V_INOUT, V_END, V_LB, V_COLON, V_RB, V_STRING }; #define NUM_VTOKENS 25 static int numsyms=0; /******************************************************************/ static struct queuedevent *queuedevents=NULL; /******************************************************************/ static unsigned int vcd_minid = ~0; static unsigned int vcd_maxid = 0; static unsigned int vcdid_hash(char *s, int len) { unsigned int val=0; int i; s+=(len-1); for(i=0;iid)); } /* * actual bsearch */ static struct vcdsymbol *bsearch_vcd(char *key, int len) { struct vcdsymbol **v; struct vcdsymbol *t; if(indexed) { unsigned int hsh = vcdid_hash(key, len); if((hsh>=vcd_minid)&&(hsh<=vcd_maxid)) { return(indexed[hsh-vcd_minid]); } } v=(struct vcdsymbol **)bsearch(key, sorted, numsyms, sizeof(struct vcdsymbol *), vcdsymbsearchcompare); if(v) { #ifndef VCD_BSEARCH_IS_PERFECT for(;;) { t=*v; if((v==sorted)||(strcmp((*(--v))->id, key))) { return(t); } } #else return(*v); #endif } else { return(NULL); } } /* * sort on vcdsymbol pointers */ static int vcdsymcompare(const void *s1, const void *s2) { struct vcdsymbol *v1, *v2; v1=*((struct vcdsymbol **)s1); v2=*((struct vcdsymbol **)s2); return(strcmp(v1->id, v2->id)); } /* * alias vs normal symbol adding */ static void alias_vs_normal_symadd(struct vcdsymbol *v, struct vcdsymbol *root_v) { if(!v) return; /* scan-build : should never happen */ if(!root_v) { if((v->vartype==V_INTEGER)||(v->vartype==V_REAL)) { v->ltsym = vzt_wr_symbol_add(lt, v->name, 0, v->msi, v->lsi, (v->vartype==V_INTEGER)?VZT_WR_SYM_F_INTEGER:((v->vartype==V_REAL)?VZT_WR_SYM_F_DOUBLE:VZT_WR_SYM_F_BITS)); } else { char buf[65537]; if(v->msi==v->lsi) { sprintf(buf, "%s[%d]", v->name, v->msi); } else { sprintf(buf, "%s[%d:%d]", v->name, v->msi, v->lsi); } v->ltsym = vzt_wr_symbol_add(lt, buf, 0, v->msi, v->lsi, (v->vartype==V_INTEGER)?VZT_WR_SYM_F_INTEGER:((v->vartype==V_REAL)?VZT_WR_SYM_F_DOUBLE:VZT_WR_SYM_F_BITS)); } } else { if((v->vartype==V_INTEGER)||(v->vartype==V_REAL)) { vzt_wr_symbol_alias(lt, root_v->name, v->name, v->msi, v->lsi); } else { char bufold[65537], buf[65537]; if(v->msi==v->lsi) { sprintf(bufold, "%s[%d]", root_v->name, root_v->msi); sprintf(buf, "%s[%d]", v->name, v->msi); } else { sprintf(bufold, "%s[%d:%d]", root_v->name, root_v->msi, root_v->lsi); sprintf(buf, "%s[%d:%d]", v->name, v->msi, v->lsi); } vzt_wr_symbol_alias(lt, bufold, buf, v->msi, v->lsi); } } } /* * create sorted (by id) table */ static void create_sorted_table(void) { struct vcdsymbol *v; struct vcdsymbol **pnt; unsigned int vcd_distance; struct vcdsymbol *root_v; int i; if(numsyms) { vcd_distance = vcd_maxid - vcd_minid + 1; if(vcd_distance <= 8 * 1024 * 1024) { indexed = (struct vcdsymbol **)calloc_2(vcd_distance, sizeof(struct vcdsymbol *)); printf("%d symbols span ID range of %d, using indexing...\n", numsyms, vcd_distance); v=vcdsymroot; while(v) { if(!(root_v=indexed[v->nid - vcd_minid])) { indexed[v->nid - vcd_minid] = v; } alias_vs_normal_symadd(v, root_v); v=v->next; } } else { pnt=sorted=(struct vcdsymbol **)calloc_2(numsyms, sizeof(struct vcdsymbol *)); v=vcdsymroot; while(v) { *(pnt++)=v; v=v->next; } qsort(sorted, numsyms, sizeof(struct vcdsymbol *), vcdsymcompare); root_v = NULL; for(i=0;iname); v->name = NULL; v=v->next; } } } /******************************************************************/ /* * single char get */ static int getch(void) { int ch; ch=fgetc(vcd_handle); if(ch=='\n') vcdlineno++; return(((ch==EOF)||(errno))?(-1):(ch)); } static int getch_peek(void) { int ch; ch=fgetc(vcd_handle); ungetc(ch, vcd_handle); return(((ch==EOF)||(errno))?(-1):(ch)); } static char *varsplit=NULL, *vsplitcurr=NULL; static int getch_patched(void) { char ch; ch=*vsplitcurr; if(!ch) { return(-1); } else { vsplitcurr++; return((int)ch); } } /* * simple tokenizer */ static int get_token(void) { int ch; int i, len=0; int is_string=0; char *yyshadow; for(;;) { ch=getch(); if(ch<0) return(T_EOF); if(ch<=' ') continue; /* val<=' ' is a quick whitespace check */ break; /* (take advantage of fact that vcd is text) */ } if(ch=='$') { yytext[len++]=ch; for(;;) { ch=getch(); if(ch<0) return(T_EOF); if(ch<=' ') continue; break; } } else { is_string=1; } for(yytext[len++]=ch;;yytext[len++]=ch) { if(len==T_MAX_STR) { yytext=(char *)realloc_2(yytext, (T_MAX_STR=T_MAX_STR*2)+1); } ch=getch(); if(ch<=' ') break; } yytext[len]=0; /* terminator */ if(is_string) { yylen=len; return(T_STRING); } yyshadow=yytext; do { yyshadow++; for(i=0;iw #implicit-var###VarElem:ram_di[0.0] [63:0] $end' style declarations */ { /* debussy simply escapes until the space */ yytext[len++]= '\\'; } for(yytext[len++]=ch;;yytext[len++]=ch) { if(len==T_MAX_STR) { yytext=(char *)realloc_2(yytext, (T_MAX_STR=T_MAX_STR*2)+1); } ch=getch(); if(ch==' ') { if(match_kw) break; if(getch_peek() == '[') { ch = getch(); varsplit=yytext+len; /* keep looping so we get the *last* one */ continue; } } if((ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r')||(ch<0)) break; if((ch=='[')&&(yytext[0]!='\\')) { varsplit=yytext+len; /* keep looping so we get the *last* one */ } else if(((ch==':')||(ch==']'))&&(!varsplit)&&(yytext[0]!='\\')) { var_prevch=ch; break; } } yytext[len]=0; /* absolute terminator */ if((varsplit)&&(yytext[len-1]==']')) { char *vst; vst=malloc_2(strlen(varsplit)+1); strcpy(vst, varsplit); *varsplit=0x00; /* zero out var name at the left bracket */ len=varsplit-yytext; varsplit=vsplitcurr=vst; var_prevch=0; } else { varsplit=NULL; } if(match_kw) for(i=0;ilen+(s->next?1:0); s=s->next; } if(slisthier) { free_2(slisthier); } slisthier=(char *)malloc_2((slisthier_len=len)+1); s=slistroot; len=0; while(s) { strcpy(slisthier+len,s->str); len+=s->len; if(s->next) { strcpy(slisthier+len,vcd_hier_delimeter); len++; } s=s->next; } return(slisthier); } void append_vcd_slisthier(char *str) { struct slist *s; s=(struct slist *)calloc_2(1,sizeof(struct slist)); s->len=strlen(str); s->str=(char *)malloc_2(s->len+1); strcpy(s->str,str); if(slistcurr) { slistcurr->next=s; slistcurr=s; } else { slistcurr=slistroot=s; } build_slisthier(); DEBUG(fprintf(stderr, "SCOPE: %s\n",slisthier)); } static void parse_valuechange(void) { struct vcdsymbol *v; char *vector; int vlen; switch(yytext[0]) { case '0': case '1': case 'x': case 'X': case 'z': case 'Z': case 'h': case 'H': case 'u': case 'U': case 'w': case 'W': case 'l': case 'L': case '-': if(yylen>1) { v=bsearch_vcd(yytext+1, yylen-1); if(!v) { fprintf(stderr,"Near line %d, Unknown VCD identifier: '%s'\n",vcdlineno,yytext+1); } else { if(v->vartype!=V_EVENT) { char vl[2]; vl[0]=yytext[0]; vl[1]=0; vzt_wr_emit_value_bit_string(lt, v->ltsym, 0, vl); v->value[0]=yytext[0]; DEBUG(fprintf(stderr,"%s = '%c'\n",v->name,v->value[0])); add_histent(current_time,v->narray[0],v->value[0],1, NULL); } else { char vl[2]; v->value[0]=(dumping_off)?'x':'1'; /* only '1' is relevant */ if(current_time!=(v->ev->last_event_time+1)) { /* dump degating event */ DEBUG(fprintf(stderr,"#"TTFormat" %s = '%c' (event)\n",v->ev->last_event_time+1,v->name,'0')); add_histent(v->ev->last_event_time+1,v->narray[0],'0',1, NULL); } DEBUG(fprintf(stderr,"%s = '%c' (event)\n",v->name,v->value[0])); add_histent(current_time,v->narray[0],v->value[0],1, NULL); vl[0]='1'; vl[1]=0; vzt_wr_emit_value_bit_string(lt, v->ltsym, 0, vl); vl[0]='0'; vl[1]=0; vzt_wr_emit_value_bit_string(lt, v->ltsym, 0, vl); v->ev->last_event_time=current_time; } } } else { fprintf(stderr,"Near line %d, Malformed VCD identifier\n", vcdlineno); } break; case 'b': case 'B': /* extract binary number then.. */ vector=malloc_2(yylen_cache=yylen); strcpy(vector,yytext+1); vlen=yylen-1; get_strtoken(); v=bsearch_vcd(yytext, yylen); if(!v) { fprintf(stderr,"Near line %d, Unknown identifier: '%s'\n",vcdlineno, yytext); free_2(vector); } else { if(vlensize) /* fill in left part */ { char extend; int i, fill; extend=(vector[0]=='1')?'0':vector[0]; fill=v->size-vlen; for(i=0;ivalue[i]=extend; } strcpy(v->value+fill,vector); } else if(vlen==v->size) /* straight copy */ { strcpy(v->value,vector); } else /* too big, so copy only right half */ { int skip; skip=vlen-v->size; strcpy(v->value,vector+skip); } DEBUG(fprintf(stderr,"%s = '%s'\n",v->name, v->value)); vzt_wr_emit_value_bit_string(lt, v->ltsym, 0, v->value); if((v->size==1)||(!atomic_vectors)) { int i; for(i=0;isize;i++) { add_histent(current_time, v->narray[i],v->value[i],1, NULL); } free_2(vector); } else { if(yylen_cache!=(v->size+1)) { free_2(vector); vector=malloc_2(v->size+1); } strcpy(vector,v->value); add_histent(current_time, v->narray[0],0,1,vector); free_2(vector); } } break; case 'p': /* extract port dump value.. */ vector=malloc_2(yylen_cache=yylen); strcpy(vector,yytext+1); vlen=yylen-1; get_strtoken(); /* throw away 0_strength_component */ get_strtoken(); /* throw away 0_strength_component */ get_strtoken(); /* this is the id */ v=bsearch_vcd(yytext, yylen); if(!v) { fprintf(stderr,"Near line %d, Unknown identifier: '%s'\n",vcdlineno, yytext); free_2(vector); } else { if(vlensize) /* fill in left part */ { char extend; int i, fill; extend='0'; fill=v->size-vlen; for(i=0;ivalue[i]=extend; } evcd_strcpy(v->value+fill,vector); } else if(vlen==v->size) /* straight copy */ { evcd_strcpy(v->value,vector); } else /* too big, so copy only right half */ { int skip; skip=vlen-v->size; evcd_strcpy(v->value,vector+skip); } DEBUG(fprintf(stderr,"%s = '%s'\n",v->name, v->value)); vzt_wr_emit_value_bit_string(lt, v->ltsym, 0, v->value); if((v->size==1)||(!atomic_vectors)) { int i; for(i=0;isize;i++) { add_histent(current_time, v->narray[i],v->value[i],1, NULL); } free_2(vector); } else { if(yylen_cachesize) { free_2(vector); vector=malloc_2(v->size+1); } strcpy(vector,v->value); add_histent(current_time, v->narray[0],0,1,vector); free_2(vector); } } break; case 'r': case 'R': { double *d; d=malloc_2(sizeof(double)); *d = 0; sscanf(yytext+1,"%lg",d); errno = 0; get_strtoken(); v=bsearch_vcd(yytext, yylen); if(!v) { fprintf(stderr,"Near line %d, Unknown identifier: '%s'\n",vcdlineno, yytext); free_2(d); } else { if(v->vartype == V_REAL) { vzt_wr_emit_value_double(lt, v->ltsym, 0, *d); add_histent(current_time, v->narray[0],'g',1,(char *)d); } else { fprintf(stderr,"Near line %d, real value change for non-real '%s'\n",vcdlineno, yytext); } free_2(d); } break; } case 's': case 'S': { get_strtoken(); /* simply skip for now */ break; } } } static void evcd_strcpy(char *dst, char *src) { static const char *evcd="DUNZduLHXTlh01?FAaBbCcf"; static const char *vcd="01xz0101xz0101xzxxxxxxz"; char ch; int i; while((ch=*src)) { for(i=0;i<23;i++) { if(evcd[i]==ch) { *dst=vcd[i]; break; } } if(i==23) *dst='x'; src++; dst++; } *dst=0; /* null terminate destination */ } static void vcd_parse(void) { int tok; for(;;) { switch(get_token()) { case T_COMMENT: sync_end("COMMENT:"); break; case T_DATE: sync_end("DATE:"); break; case T_VERSION: sync_end("VERSION:"); break; case T_TIMEZERO: { int vtok=get_token(); if((vtok==T_END)||(vtok==T_EOF)) break; time_zero=atoi_64(yytext); vzt_wr_set_timezero(lt, time_zero); sync_end(NULL); } break; case T_TIMESCALE: { int vtok; int i; char prefix=' '; int timelogadjust = 0; vtok=get_token(); if((vtok==T_END)||(vtok==T_EOF)) break; time_scale=atoi_64(yytext); if(!time_scale) time_scale=1; else if (time_scale == 10 ) timelogadjust = +1; else if (time_scale == 100) timelogadjust = +2; for(i=0;i'9')) { prefix=yytext[i]; break; } } if(prefix==' ') { vtok=get_token(); if((vtok==T_END)||(vtok==T_EOF)) break; prefix=yytext[0]; } switch(prefix) { case 's': case ' ': vzt_wr_set_timescale(lt, 0+timelogadjust); break; case 'm': vzt_wr_set_timescale(lt, -3+timelogadjust); break; case 'u': vzt_wr_set_timescale(lt, -6+timelogadjust); break; case 'n': vzt_wr_set_timescale(lt, -9+timelogadjust); break; case 'p': vzt_wr_set_timescale(lt, -12+timelogadjust); break; case 'f': vzt_wr_set_timescale(lt, -15+timelogadjust); break; default: /* unknown */ vzt_wr_set_timescale(lt, -9+timelogadjust); break; } sync_end(NULL); } break; case T_SCOPE: T_GET; T_GET; if(tok==T_STRING) { struct slist *s; s=(struct slist *)calloc_2(1,sizeof(struct slist)); s->len=yylen; s->str=(char *)malloc_2(yylen+1); strcpy(s->str,yytext); if(slistcurr) { slistcurr->next=s; slistcurr=s; } else { slistcurr=slistroot=s; } build_slisthier(); DEBUG(fprintf(stderr, "SCOPE: %s\n",slisthier)); } sync_end(NULL); break; case T_UPSCOPE: if(slistroot) { struct slist *s; s=slistroot; if(!s->next) { free_2(s->str); free_2(s); slistroot=slistcurr=NULL; } else for(;;) { if(!s->next->next) { free_2(s->next->str); free_2(s->next); s->next=NULL; slistcurr=s; break; } s=s->next; } build_slisthier(); DEBUG(fprintf(stderr, "SCOPE: %s\n",slisthier)); } sync_end(NULL); break; case T_VAR: { int vtok; struct vcdsymbol *v=NULL; var_prevch=0; if(varsplit) { free_2(varsplit); varsplit=NULL; } vtok=get_vartoken(1); if(vtok>V_PORT) goto bail; v=(struct vcdsymbol *)calloc_2(1,sizeof(struct vcdsymbol)); v->vartype=vtok; v->msi=v->lsi=vcd_explicit_zero_subscripts; /* indicate [un]subscripted status */ if(vtok==V_PORT) { vtok=get_vartoken(1); if(vtok==V_STRING) { v->size=atoi_64(yytext); if(!v->size) v->size=1; } else if(vtok==V_LB) { vtok=get_vartoken(1); if(vtok==V_END) goto err; if(vtok!=V_STRING) goto err; v->msi=atoi_64(yytext); vtok=get_vartoken(0); if(vtok==V_RB) { v->lsi=v->msi; v->size=1; } else { if(vtok!=V_COLON) goto err; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; v->lsi=atoi_64(yytext); vtok=get_vartoken(0); if(vtok!=V_RB) goto err; if(v->msi>v->lsi) { v->size=v->msi-v->lsi+1; } else { v->size=v->lsi-v->msi+1; } } } else goto err; vtok=get_strtoken(); if(vtok==V_END) goto err; v->id=(char *)malloc_2(yylen+1); strcpy(v->id, yytext); v->nid=vcdid_hash(yytext,yylen); if(v->nid < vcd_minid) vcd_minid = v->nid; if(v->nid > vcd_maxid) vcd_maxid = v->nid; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; if(slisthier_len) { v->name=(char *)malloc_2(slisthier_len+1+yylen+1); strcpy(v->name,slisthier); strcpy(v->name+slisthier_len,vcd_hier_delimeter); strcpy(v->name+slisthier_len+1,yytext); } else { v->name=(char *)malloc_2(yylen+1); strcpy(v->name,yytext); } } else /* regular vcd var, not an evcd port var */ { vtok=get_vartoken(1); if(vtok==V_END) goto err; v->size=atoi_64(yytext); vtok=get_strtoken(); if(vtok==V_END) goto err; v->id=(char *)malloc_2(yylen+1); strcpy(v->id, yytext); v->nid=vcdid_hash(yytext,yylen); if(v->nid < vcd_minid) vcd_minid = v->nid; if(v->nid > vcd_maxid) vcd_maxid = v->nid; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; if(slisthier_len) { v->name=(char *)malloc_2(slisthier_len+1+yylen+1); strcpy(v->name,slisthier); strcpy(v->name+slisthier_len,vcd_hier_delimeter); strcpy(v->name+slisthier_len+1,yytext); } else { v->name=(char *)malloc_2(yylen+1); strcpy(v->name,yytext); } vtok=get_vartoken(1); if(vtok==V_END) goto dumpv; if(vtok!=V_LB) goto err; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; v->msi=atoi_64(yytext); vtok=get_vartoken(0); if(vtok==V_RB) { v->lsi=v->msi; goto dumpv; } if(vtok!=V_COLON) goto err; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; v->lsi=atoi_64(yytext); vtok=get_vartoken(0); if(vtok!=V_RB) goto err; } dumpv: if(v->size == 0) { v->vartype = V_REAL; } /* MTI fix */ if(v->vartype==V_REAL) { v->size=1; /* override any data we parsed in */ v->msi=v->lsi=0; } else if((v->size>1)&&(v->msi<=0)&&(v->lsi<=0)) { if(v->vartype==V_EVENT) { v->size=1; } else { /* any criteria for the direction here? */ v->msi=v->size-1; v->lsi=0; } } else if((v->msi>v->lsi)&&((v->msi-v->lsi+1)!=v->size)) { if(v->vartype!=V_EVENT) goto err; v->size=v->msi-v->lsi+1; } else if((v->lsi>=v->msi)&&((v->lsi-v->msi+1)!=v->size)) { if(v->vartype!=V_EVENT) goto err; v->size=v->msi-v->lsi+1; } /* initial conditions */ v->value=(char *)malloc_2(v->size+1); v->value[v->size]=0; v->narray=(struct Node **)calloc_2(v->size,sizeof(struct Node *)); { int i; for(i=0;isize;i++) { v->value[i]='x'; v->narray[i]=(struct Node *)calloc_2(1,sizeof(struct Node)); v->narray[i]->head.time=-1; v->narray[i]->head.v.val=1; } } if(v->vartype==V_EVENT) { struct queuedevent *q; v->ev=q=(struct queuedevent *)calloc_2(1,sizeof(struct queuedevent)); q->sym=v; q->last_event_time=-1; q->next=queuedevents; queuedevents=q; } if(!vcdsymroot) { vcdsymroot=vcdsymcurr=v; } else { vcdsymcurr->next=v; vcdsymcurr=v; } numsyms++; #if 0 if((v->vartype==V_INTEGER)||(v->vartype==V_REAL)) { v->ltsym = vzt_wr_symbol_add(lt, v->name, 0, v->msi, v->lsi, (v->vartype==V_INTEGER)?VZT_WR_SYM_F_INTEGER:((v->vartype==V_REAL)?VZT_WR_SYM_F_DOUBLE:VZT_WR_SYM_F_BITS)); } else { char buf[65537]; if(v->msi==v->lsi) { sprintf(buf, "%s[%d]", v->name, v->msi); } else { sprintf(buf, "%s[%d:%d]", v->name, v->msi, v->lsi); } v->ltsym = vzt_wr_symbol_add(lt, buf, 0, v->msi, v->lsi, (v->vartype==V_INTEGER)?VZT_WR_SYM_F_INTEGER:((v->vartype==V_REAL)?VZT_WR_SYM_F_DOUBLE:VZT_WR_SYM_F_BITS)); } #endif DEBUG(fprintf(stderr,"VAR %s %d %s %s[%d:%d]\n", vartypes[v->vartype], v->size, v->id, v->name, v->msi, v->lsi)); goto bail; err: if(v) { if(v->name) free_2(v->name); if(v->id) free_2(v->id); if(v->value) free_2(v->value); free_2(v); } bail: if(vtok!=V_END) sync_end(NULL); break; } case T_ENDDEFINITIONS: if(!header_over) { header_over=1; /* do symbol table management here */ create_sorted_table(); if((!sorted)&&(!indexed)) { fprintf(stderr, "No symbols in VCD file..nothing to do!\n"); exit(1); } } break; case T_STRING: if(header_over) { /* catchall for events when header over */ if(yytext[0]=='#') { TimeType t_time; t_time=atoi_64(yytext+1); if(start_time<0) { start_time=t_time; } if(t_time < current_time) /* avoid backtracking time counts which can happen on malformed files */ { t_time = current_time; } current_time=t_time; if(end_timecurr) { he=(struct HistEnt *)calloc_2(1,sizeof(struct HistEnt)); he->time=-1; he->v.val=1; n->curr=he; n->head.next=he; add_histent(t_time,n,ch,regadd, vector); } else { /* if(regadd) { t_time*=(time_scale); } */ /* scan-build : never read */ if(toupper((int)(unsigned char)ch)!=deadchar) n->notdead=1; n->numtrans++; } } else { if(ch=='g') /* real number */ { if(!n->curr) { he=(struct HistEnt *)calloc_2(1,sizeof(struct HistEnt)); he->time=-1; he->v.vector=NULL; n->curr=he; n->head.next=he; add_histent(t_time,n,ch,regadd, vector); } else { n->notdead=1; n->numtrans++; } } else { if(!n->curr) { he=(struct HistEnt *)calloc_2(1,sizeof(struct HistEnt)); he->time=-1; he->v.vector=NULL; n->curr=he; n->head.next=he; add_histent(t_time,n,ch,regadd, vector); } else { int i, nlen; nlen = strlen(vector); if(nlen) { n->numtrans++; for(i=0;inotdead=1; return; } } } } } } } static void add_tail_histents(void) { /* dump out any pending events 1st */ struct queuedevent *q; q=queuedevents; while(q) { struct vcdsymbol *v; v=q->sym; if(current_time!=(v->ev->last_event_time+1)) { /* dump degating event */ DEBUG(fprintf(stderr,"#"TTFormat" %s = '%c' (event)\n",v->ev->last_event_time+1,v->name,'0')); add_histent(v->ev->last_event_time+1,v->narray[0],'0',1, NULL); } q=q->next; } } /*******************************************************************************/ TimeType vcd_main(char *fname, char *lxname) { #ifdef ONLY_NEEDED_FOR_VALGRIND_CLEAN_TEST struct vcdsymbol *v, *v2; #endif vcd_hier_delimeter[0]=hier_delimeter; errno=0; /* reset in case it's set for some reason */ yytext=(char *)malloc_2(T_MAX_STR+1); if((strlen(fname)>2)&&(!strcmp(fname+strlen(fname)-3,".gz"))) { char *str; int dlen; dlen=strlen(WAVE_DECOMPRESSOR); str=(char *)wave_alloca(strlen(fname)+dlen+1); strcpy(str,WAVE_DECOMPRESSOR); strcpy(str+dlen,fname); vcd_handle=popen(str,"r"); vcd_is_compressed=~0; } else { if(strcmp("-",fname)) { vcd_handle=fopen(fname,"rb"); } else { vcd_handle=stdin; } vcd_is_compressed=0; } if(!vcd_handle) { fprintf(stderr, "Error opening %s .vcd file '%s'.\n", vcd_is_compressed?"compressed":"", fname); exit(1); } lt=vzt_wr_init(lxname); if(!lt) { fprintf(stderr, "Problem opening output file '%s'\n", lxname); perror("Why"); exit(255); } vzt_wr_set_compression_type(lt, ziptype); if(opt_twostate) { vzt_wr_force_twostate(lt); } vzt_wr_set_rle(lt, opt_rle); vzt_wr_set_compression_depth(lt, opt_depth); vzt_wr_set_break_size(lt, (off_t)opt_break_size); vzt_wr_set_maxgranule(lt, opt_maxgranule); vzt_wr_symbol_bracket_stripping(lt, 1); /* this is intentional */ sym=(struct symbol **)calloc_2(SYMPRIME,sizeof(struct symbol *)); printf("\nConverting VCD File '%s' to VZT file '%s'...\n\n",(vcd_handle!=stdin)?fname:"from stdin", lxname); build_slisthier(); vcd_parse(); if(varsplit) { free_2(varsplit); varsplit=NULL; } add_tail_histents(); printf("["TTFormat"] start time.\n["TTFormat"] end time.\n\n", start_time, end_time); vzt_wr_close(lt); lt=NULL; min_time=start_time*time_scale; max_time=end_time*time_scale; if((min_time==max_time)||(max_time==0)) { fprintf(stderr, "VCD times range is equal to zero. Exiting.\n"); exit(1); } if(vcd_handle!=stdin) { fclose(vcd_handle); vcd_handle=NULL; } free(yytext); yytext=NULL; if(indexed) { free(indexed); indexed=NULL; } if(sorted) { free(sorted); sorted=NULL; } #ifdef ONLY_NEEDED_FOR_VALGRIND_CLEAN_TEST v=vcdsymroot; while(v) { if(v->name) { free(v->name); v->name=NULL; } if(v->id) { free(v->id); v->id=NULL; } if(v->value) { free(v->value); v->value=NULL; } if(v->narray) { int i; for(i=0;isize;i++) { struct HistEnt *h1, *h2; if((h1 = v->narray[i]->head.next)) { h1 = v->narray[i]->head.next; while(h1) { h2 = h1->next; free(h1); h1 = h2; } } free(v->narray[i]); v->narray[i]=NULL; } free(v->narray); v->narray=NULL; } v2=v->next; free(v); v=v2; } vcdsymroot=vcdsymcurr=NULL; #endif free(sym); sym=NULL; if(slisthier) { free(slisthier); slisthier=NULL; } return(max_time); } /*******************************************************************************/ /* * Generic hash function for symbol names... */ int hash(char *s) { char *p; unsigned int h=0, g; for(p=s;*p;p++) { h=(h<<4)+(*p); if((g=h&0xf0000000)) { h=h^(g>>24); h=h^g; } } return(h%SYMPRIME); } /* * add symbol to table. no duplicate checking * is necessary as aet's are "correct." */ struct symbol *symadd(char *name, int hv) { struct symbol *s; s=(struct symbol *)calloc_2(1,sizeof(struct symbol)); strcpy(s->name=(char *)malloc_2(strlen(name)+1),name); s->next=sym[hv]; sym[hv]=s; return(s); } /* * find a slot already in the table... */ struct symbol *symfind(char *s) { int hv; struct symbol *temp; hv=hash(s); if(!(temp=sym[hv])) return(NULL); /* no hash entry, add here wanted to add */ while(temp) { if(!strcmp(temp->name,s)) { return(temp); /* in table already */ } if(!temp->next) break; temp=temp->next; } return(NULL); /* not found, add here if you want to add*/ } int sigcmp(char *s1, char *s2) { unsigned char c1, c2; int u1, u2; for(;;) { c1=(unsigned char)*(s1++); c2=(unsigned char)*(s2++); if((!c1)&&(!c2)) return(0); if((c1<='9')&&(c2<='9')&&(c2>='0')&&(c1>='0')) { u1=(int)(c1&15); u2=(int)(c2&15); while(((c2=(unsigned char)*s2)>='0')&&(c2<='9')) { u2*=10; u2+=(unsigned int)(c2&15); s2++; } while(((c2=(unsigned char)*s1)>='0')&&(c2<='9')) { u1*=10; u1+=(unsigned int)(c2&15); s1++; } if(u1==u2) continue; else return((int)u1-(int)u2); } else { if(c1!=c2) return((int)c1-(int)c2); } } } int partition(struct symbol **a, int p, int r) { struct symbol *x, *t; int i,j; x=a[p]; i=p-1; j=r+1; while(1) { do { j--; } while(sigcmp(a[j]->name,x->name)>0); do { i++; } while(sigcmp(a[i]->name,x->name)<0); if(i.\n",nam); #else printf( "Usage: %s [OPTION]... [VCDFILE] [VZTFILE]\n\n" " -v FILE specify VCD input filename\n" " -l FILE specify VZT output filename\n" " -d value specify 0..9 compression depth (default = 4)\n" " -m value specify number of granules per section (def = 8)\n" " -b value specify break size (default = 0 = off)\n" " -z value specify zip type (default: 0 gzip, 1 bzip2, 2 lzma)\n" " -t force MVL2 twostate mode (default is MVL4)\n" " -r use bitwise RLE compression on value table\n" " -h display this help then exit\n\n" "VCD files may be compressed with zip or gzip. Note that VCDFILE and VZTFILE\n" "are optional provided the --vcdname and --vztname options are specified.\n" "Use \"-\" as a VCD filename to accept uncompressed input from stdin.\n\n" "Report bugs to <"PACKAGE_BUGREPORT">.\n",nam); #endif exit(0); } int main(int argc, char **argv) { char opt_errors_encountered=0; char *vname=NULL, *lxname=NULL; int c; WAVE_LOCALE_FIX while (1) { #ifdef __linux__ int option_index = 0; static struct option long_options[] = { {"vcdname", 1, 0, 'v'}, {"vztname", 1, 0, 'l'}, {"depth", 1, 0, 'd'}, {"maxgranule", 1, 0, 'm'}, {"break", 1, 0, 'b'}, {"help", 0, 0, 'h'}, {"twostate", 0, 0, 't'}, {"rle", 0, 0, 'r'}, {"ziptype", 1, 0, 'z'}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "v:l:d:m:b:z:htr", long_options, &option_index); #else c = getopt (argc, argv, "v:l:d:m:b:z:htr"); #endif if (c == -1) break; /* no more args */ switch (c) { case 'v': if(vname) free(vname); vname = malloc_2(strlen(optarg)+1); strcpy(vname, optarg); break; case 'l': if(lxname) free(lxname); lxname = malloc_2(strlen(optarg)+1); strcpy(lxname, optarg); break; case 'd': opt_depth = atoi(optarg); if(opt_depth<0) opt_depth = 0; if(opt_depth>9) opt_depth = 9; break; case 'm': opt_maxgranule = atoi(optarg); if(opt_maxgranule<1) opt_maxgranule=1; break; case 'b': sscanf(optarg, "%"SCNu64, &opt_break_size); errno = 0; break; case 'h': print_help(argv[0]); break; case 't': opt_twostate = 1; break; case 'r': opt_rle = 1; break; case 'z': ziptype = atoi(optarg); if((ziptype < VZT_WR_IS_GZ) || (ziptype > VZT_WR_IS_LZMA)) ziptype = VZT_WR_IS_GZ; break; case '?': opt_errors_encountered=1; break; default: /* unreachable */ break; } } if(opt_errors_encountered) { print_help(argv[0]); } if (optind < argc) { while (optind < argc) { if(!vname) { vname = malloc_2(strlen(argv[optind])+1); strcpy(vname, argv[optind++]); } else if(!lxname) { lxname = malloc_2(strlen(argv[optind])+1); strcpy(lxname, argv[optind++]); } else { break; } } } if((!vname)||(!lxname)) { print_help(argv[0]); } vcd_main(vname, lxname); free(vname); free(lxname); return(0); } gtkwave-3.3.86/src/helpers/lxt2_write.c0000664000175000017500000013424313166335473017313 0ustar bybellbybell/* * Copyright (c) 2003-2016 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifdef _AIX #pragma alloca #endif #include #include "lxt2_write.h" static char *lxt2_wr_vcd_truncate_bitvec(char *s) { char l, r; r=*s; if(r=='1') { return s; } else { s++; } for(;;s++) { l=r; r=*s; if(!r) return (s-1); if(l!=r) { return(((l=='0')&&(r=='1'))?s:s-1); } } } /* * in-place sort to keep chained facs from migrating... */ static void wave_mergesort(struct lxt2_wr_symbol **a, struct lxt2_wr_symbol **b, int lo, int hi) { int i, j, k; if (loname, a[j]->name) <= 0) { a[k++]=b[i++]; } else { a[k++]=a[j++]; } } while (kitem) { if (t->left == NULL) break; if (i < t->left->item) { y = t->left; /* rotate right */ t->left = y->right; y->right = t; t = y; if (t->left == NULL) break; } r->left = t; /* link right */ r = t; t = t->left; } else if (i > t->item) { if (t->right == NULL) break; if (i > t->right->item) { y = t->right; /* rotate left */ t->right = y->left; y->left = t; t = y; if (t->right == NULL) break; } l->right = t; /* link left */ l = t; t = t->right; } else { break; } } l->right = t->left; /* assemble */ r->left = t->right; t->left = N.right; t->right = N.left; return t; } static lxt2_wr_ds_Tree * lxt2_wr_ds_insert(granmsk_t i, lxt2_wr_ds_Tree * t, int val) { /* Insert i into the tree t, unless it's already there. */ /* Return a pointer to the resulting tree. */ lxt2_wr_ds_Tree * n; n = (lxt2_wr_ds_Tree *) calloc (1, sizeof (lxt2_wr_ds_Tree)); if (n == NULL) { fprintf(stderr, "ds_insert: ran out of memory, exiting.\n"); exit(255); } n->item = i; n->val = val; if (t == NULL) { n->left = n->right = NULL; return n; } t = lxt2_wr_ds_splay(i,t); if (i < t->item) { n->left = t->left; n->right = t; t->left = NULL; return n; } else if (i > t->item) { n->right = t->right; n->left = t; t->right = NULL; return n; } else { /* We get here if it's already in the tree */ /* Don't add it again */ free(n); return t; } } /************************ splay ************************/ static int lxt2_wr_dslxt_success; static lxt2_wr_dslxt_Tree * lxt2_wr_dslxt_splay (char *i, lxt2_wr_dslxt_Tree * t) { /* Simple top down splay, not requiring i to be in the tree t. */ /* What it does is described above. */ lxt2_wr_dslxt_Tree N, *l, *r, *y; int dir; lxt2_wr_dslxt_success = 0; if (t == NULL) return t; N.left = N.right = NULL; l = r = &N; for (;;) { dir = strcmp(i, t->item); if (dir < 0) { if (t->left == NULL) break; if (strcmp(i, t->left->item)<0) { y = t->left; /* rotate right */ t->left = y->right; y->right = t; t = y; if (t->left == NULL) break; } r->left = t; /* link right */ r = t; t = t->left; } else if (dir > 0) { if (t->right == NULL) break; if (strcmp(i, t->right->item)>0) { y = t->right; /* rotate left */ t->right = y->left; y->left = t; t = y; if (t->right == NULL) break; } l->right = t; /* link left */ l = t; t = t->right; } else { lxt2_wr_dslxt_success=1; break; } } l->right = t->left; /* assemble */ r->left = t->right; t->left = N.right; t->right = N.left; return t; } static lxt2_wr_dslxt_Tree * lxt2_wr_dslxt_insert(char *i, lxt2_wr_dslxt_Tree * t, unsigned int val) { /* Insert i into the tree t, unless it's already there. */ /* Return a pointer to the resulting tree. */ lxt2_wr_dslxt_Tree * n; int dir; n = (lxt2_wr_dslxt_Tree *) calloc (1, sizeof (lxt2_wr_dslxt_Tree)); if (n == NULL) { fprintf(stderr, "dslxt_insert: ran out of memory, exiting.\n"); exit(255); } n->item = i; n->val = val; if (t == NULL) { n->left = n->right = NULL; return n; } t = lxt2_wr_dslxt_splay(i,t); dir = strcmp(i,t->item); if (dir<0) { n->left = t->left; n->right = t; t->left = NULL; return n; } else if (dir>0) { n->right = t->right; n->left = t; t->right = NULL; return n; } else { /* We get here if it's already in the tree */ /* Don't add it again */ free(n); return t; } } /************************ splay ************************/ /* * functions which emit various big endian * data to a file */ static int lxt2_wr_emit_u8(struct lxt2_wr_trace *lt, int value) { unsigned char buf[1]; int nmemb; buf[0] = value & 0xff; nmemb=fwrite(buf, sizeof(char), 1, lt->handle); lt->position+=nmemb; return(nmemb); } static int lxt2_wr_emit_u16(struct lxt2_wr_trace *lt, int value) { unsigned char buf[2]; int nmemb; buf[0] = (value>>8) & 0xff; buf[1] = value & 0xff; nmemb = fwrite(buf, sizeof(char), 2, lt->handle); lt->position+=nmemb; return(nmemb); } static int lxt2_wr_emit_u32(struct lxt2_wr_trace *lt, int value) { unsigned char buf[4]; int nmemb; buf[0] = (value>>24) & 0xff; buf[1] = (value>>16) & 0xff; buf[2] = (value>>8) & 0xff; buf[3] = value & 0xff; nmemb=fwrite(buf, sizeof(char), 4, lt->handle); lt->position+=nmemb; return(nmemb); } static int lxt2_wr_emit_u64(struct lxt2_wr_trace *lt, int valueh, int valuel) { int rc; if((rc=lxt2_wr_emit_u32(lt, valueh))) { rc=lxt2_wr_emit_u32(lt, valuel); } return(rc); } /* * gzfunctions which emit various big endian * data to a file. (lt->position needs to be * fixed up on gzclose so the tables don't * get out of sync!) */ static int gzwrite_buffered(struct lxt2_wr_trace *lt) { int rc = 1; if(lt->gzbufpnt > LXT2_WR_GZWRITE_BUFFER) { rc = gzwrite(lt->zhandle, lt->gzdest, lt->gzbufpnt); rc = rc ? 1 : 0; lt->gzbufpnt = 0; } return(rc); } static void gzflush_buffered(struct lxt2_wr_trace *lt, int doclose) { if(lt->gzbufpnt) { gzwrite(lt->zhandle, lt->gzdest, lt->gzbufpnt); lt->gzbufpnt = 0; if(!doclose) { gzflush(lt->zhandle, Z_SYNC_FLUSH); } } if(doclose) { gzclose(lt->zhandle); } } static int lxt2_wr_emit_u8z(struct lxt2_wr_trace *lt, int value) { int nmemb; lt->gzdest[lt->gzbufpnt++] = value & 0xff; nmemb=gzwrite_buffered(lt); lt->zpackcount++; lt->position++; return(nmemb); } static int lxt2_wr_emit_u16z(struct lxt2_wr_trace *lt, int value) { int nmemb; lt->gzdest[lt->gzbufpnt++] = (value>>8) & 0xff; lt->gzdest[lt->gzbufpnt++] = value & 0xff; nmemb = gzwrite_buffered(lt); lt->zpackcount+=2; lt->position+=2; return(nmemb); } static int lxt2_wr_emit_u24z(struct lxt2_wr_trace *lt, int value) { int nmemb; lt->gzdest[lt->gzbufpnt++] = (value>>16) & 0xff; lt->gzdest[lt->gzbufpnt++] = (value>>8) & 0xff; lt->gzdest[lt->gzbufpnt++] = value & 0xff; nmemb=gzwrite_buffered(lt); lt->zpackcount+=3; lt->position+=3; return(nmemb); } static int lxt2_wr_emit_u32z(struct lxt2_wr_trace *lt, int value) { int nmemb; lt->gzdest[lt->gzbufpnt++] = (value>>24) & 0xff; lt->gzdest[lt->gzbufpnt++] = (value>>16) & 0xff; lt->gzdest[lt->gzbufpnt++] = (value>>8) & 0xff; lt->gzdest[lt->gzbufpnt++] = value & 0xff; nmemb=gzwrite_buffered(lt); lt->zpackcount+=4; lt->position+=4; return(nmemb); } static int lxt2_wr_emit_u64z(struct lxt2_wr_trace *lt, int valueh, int valuel) { int rc; if((rc=lxt2_wr_emit_u32z(lt, valueh))) { rc=lxt2_wr_emit_u32z(lt, valuel); } return(rc); } static int lxt2_wr_emit_stringz(struct lxt2_wr_trace *lt, char *value) { int rc=1; do { rc&=lxt2_wr_emit_u8z(lt, *value); } while(*(value++)); return(rc); } /* * hash/symtable manipulation */ static int lxt2_wr_hash(const char *s) { const char *p; char ch; unsigned int h=0, h2=0, pos=0, g; for(p=s;*p;p++) { ch=*p; h2<<=3; h2-=((unsigned int)ch+(pos++)); /* this handles stranded vectors quite well.. */ h=(h<<4)+ch; if((g=h&0xf0000000)) { h=h^(g>>24); h=h^g; } } h^=h2; /* combine the two hashes */ return(h%LXT2_WR_SYMPRIME); } static struct lxt2_wr_symbol *lxt2_wr_symadd(struct lxt2_wr_trace *lt, const char *name, int hv) { struct lxt2_wr_symbol *s; s=(struct lxt2_wr_symbol *)calloc(1,sizeof(struct lxt2_wr_symbol)); strcpy(s->name=(char *)malloc((s->namlen=strlen(name))+1),name); s->next=lt->sym[hv]; lt->sym[hv]=s; return(s); } static struct lxt2_wr_symbol *lxt2_wr_symfind(struct lxt2_wr_trace *lt, const char *s) { int hv; struct lxt2_wr_symbol *temp; hv=lxt2_wr_hash(s); if(!(temp=lt->sym[hv])) return(NULL); /* no hash entry, add here wanted to add */ while(temp) { if(!strcmp(temp->name,s)) { return(temp); /* in table already */ } if(!temp->next) break; temp=temp->next; } return(NULL); /* not found, add here if you want to add*/ } /* * compress facs to a prefix count + string + 0x00 */ static void lxt2_wr_compress_fac(struct lxt2_wr_trace *lt, char *str) { int i; int len = strlen(str); int minlen = (lencompress_fac_len) ? len : lt->compress_fac_len; if(minlen>65535) minlen=65535; /* keep in printable range--most hierarchies won't be this big anyway */ if(lt->compress_fac_str) { for(i=0;icompress_fac_str[i]!=str[i]) break; } lxt2_wr_emit_u16z(lt, i); lxt2_wr_emit_stringz(lt, str+i); free(lt->compress_fac_str); } else { lxt2_wr_emit_u16z(lt, 0); lxt2_wr_emit_stringz(lt, str); } lt->compress_fac_str = (char *) malloc((lt->compress_fac_len=len)+1); strcpy(lt->compress_fac_str, str); } /* * emit facs in sorted order along with geometry * and sync table info */ static void strip_brack(struct lxt2_wr_symbol *s) { char *lastch = s->name+s->namlen - 1; if(*lastch!=']') return; if(s->namlen<3) return; lastch--; while(lastch!=s->name) { if(*lastch=='.') { return; /* MTI SV [0.3] notation for implicit vars */ } if(*lastch=='[') { *lastch=0x00; return; } lastch--; } return; } static void lxt2_wr_emitfacs(struct lxt2_wr_trace *lt) { unsigned int i; if((lt)&&(lt->numfacs)) { struct lxt2_wr_symbol *s = lt->symchain; struct lxt2_wr_symbol **aliascache = calloc(lt->numalias ? lt->numalias : 1, sizeof(struct lxt2_wr_symbol *)); unsigned int aliases_encountered, facs_encountered; lt->sorted_facs = (struct lxt2_wr_symbol **)calloc(lt->numfacs, sizeof(struct lxt2_wr_symbol *)); if(lt->sorted_facs && aliascache) { if(lt->do_strip_brackets) for(i=0;inumfacs;i++) { lt->sorted_facs[lt->numfacs - i - 1] = s; /* facs were chained backwards so reverse to restore bitslicing */ strip_brack(s); s=s->symchain; } else for(i=0;inumfacs;i++) { lt->sorted_facs[lt->numfacs - i - 1] = s; /* facs were chained backwards so reverse to restore bitslicing */ s=s->symchain; } wave_msort(lt->sorted_facs, lt->numfacs); if(lt->partial_preference) { /* move preferenced facs up */ struct lxt2_wr_symbol **prefcache = aliascache; int prefs_encountered = 0; facs_encountered = 0; for(i=0;inumfacs;i++) { if((lt->sorted_facs[i]->partial_preference)==0) { lt->sorted_facs[facs_encountered] = lt->sorted_facs[i]; facs_encountered++; } else { prefcache[prefs_encountered] = lt->sorted_facs[i]; prefs_encountered++; } } /* then append the non-preferenced facs */ for(i=0;isorted_facs[i]; } /* now make prefcache the main cache */ aliascache = lt->sorted_facs; lt->sorted_facs = prefcache; } /* move facs up */ aliases_encountered = 0, facs_encountered = 0; for(i=0;inumfacs;i++) { if((lt->sorted_facs[i]->flags&LXT2_WR_SYM_F_ALIAS)==0) { lt->sorted_facs[facs_encountered] = lt->sorted_facs[i]; facs_encountered++; } else { aliascache[aliases_encountered] = lt->sorted_facs[i]; aliases_encountered++; } } /* then append the aliases */ for(i=0;isorted_facs[facs_encountered+i] = aliascache[i]; } for(i=0;inumfacs;i++) { lt->sorted_facs[i]->facnum = i; } if(!lt->timezero) { lxt2_wr_emit_u32(lt, lt->numfacs); /* uncompressed */ } else { lxt2_wr_emit_u32(lt, 0); /* uncompressed, flag to insert extra parameters */ lxt2_wr_emit_u32(lt, 8); /* uncompressed 8 counts timezero and on */ lxt2_wr_emit_u32(lt, lt->numfacs); /* uncompressed */ lxt2_wr_emit_u64(lt, (lt->timezero >> 32) & 0xffffffffL, lt->timezero & 0xffffffffL); /* uncompressed */ } lxt2_wr_emit_u32(lt, lt->numfacbytes); /* uncompressed */ lxt2_wr_emit_u32(lt, lt->longestname); /* uncompressed */ lt->facname_offset=lt->position; lxt2_wr_emit_u32(lt, 0); /* uncompressed : placeholder for zfacnamesize */ lxt2_wr_emit_u32(lt, 0); /* uncompressed : placeholder for zfacname_predec_size */ lxt2_wr_emit_u32(lt, 0); /* uncompressed : placeholder for zfacgeometrysize */ lxt2_wr_emit_u8(lt, lt->timescale); /* timescale (-9 default == nsec) */ fflush(lt->handle); lt->zfacname_size = lt->position; lt->zhandle = gzdopen(dup(fileno(lt->handle)), "wb9"); lt->zpackcount = 0; for(i=0;inumfacs;i++) { lxt2_wr_compress_fac(lt, lt->sorted_facs[i]->name); free(lt->sorted_facs[i]->name); lt->sorted_facs[i]->name = NULL; } free(lt->compress_fac_str); lt->compress_fac_str=NULL; lt->compress_fac_len=0; lt->zfacname_predec_size = lt->zpackcount; gzflush_buffered(lt, 1); fseeko(lt->handle, 0L, SEEK_END); lt->position=ftello(lt->handle); lt->zfacname_size = lt->position - lt->zfacname_size; lt->zhandle = gzdopen(dup(fileno(lt->handle)), "wb9"); lt->facgeometry_offset = lt->position; for(i=0;inumfacs;i++) { if((lt->sorted_facs[i]->flags&LXT2_WR_SYM_F_ALIAS)==0) { lxt2_wr_emit_u32z(lt, lt->sorted_facs[i]->rows); lxt2_wr_emit_u32z(lt, lt->sorted_facs[i]->msb); lxt2_wr_emit_u32z(lt, lt->sorted_facs[i]->lsb); lxt2_wr_emit_u32z(lt, lt->sorted_facs[i]->flags); } else { lxt2_wr_emit_u32z(lt, lt->sorted_facs[i]->aliased_to->facnum); lxt2_wr_emit_u32z(lt, lt->sorted_facs[i]->msb); lxt2_wr_emit_u32z(lt, lt->sorted_facs[i]->lsb); lxt2_wr_emit_u32z(lt, LXT2_WR_SYM_F_ALIAS); } } gzflush_buffered(lt, 1); fseeko(lt->handle, 0L, SEEK_END); lt->position=ftello(lt->handle); lt->break_header_size = lt->position; /* in case we need to emit multiple lxt2s with same header */ lt->zfacgeometry_size = lt->position - lt->facgeometry_offset; fseeko(lt->handle, lt->facname_offset, SEEK_SET); lxt2_wr_emit_u32(lt, lt->zfacname_size); /* backpatch sizes... */ lxt2_wr_emit_u32(lt, lt->zfacname_predec_size); lxt2_wr_emit_u32(lt, lt->zfacgeometry_size); lt->numfacs = facs_encountered; /* don't process alias value changes ever */ } free(aliascache); } } /* * initialize the trace and get back an lt context */ struct lxt2_wr_trace *lxt2_wr_init(const char *name) { struct lxt2_wr_trace *lt=(struct lxt2_wr_trace *)calloc(1, sizeof(struct lxt2_wr_trace)); if((!name)||(!(lt->handle=fopen(name, "wb")))) { free(lt); lt=NULL; } else { lt->lxtname = strdup(name); lxt2_wr_emit_u16(lt, LXT2_WR_HDRID); lxt2_wr_emit_u16(lt, LXT2_WR_VERSION); lxt2_wr_emit_u8 (lt, LXT2_WR_GRANULE_SIZE); /* currently 32 or 64 */ lt->timescale = -9; lt->maxgranule = LXT2_WR_GRANULE_NUM; lxt2_wr_set_compression_depth(lt, 4); /* set fast/loose compression depth, user can fix this any time after init */ lt->initial_value = 'x'; } return(lt); } /* * setting break size */ void lxt2_wr_set_break_size(struct lxt2_wr_trace *lt, off_t siz) { if(lt) { lt->break_size = siz; } } /* * enable/disable partial dump mode (for faster reads) */ void lxt2_wr_set_partial_off(struct lxt2_wr_trace *lt) { if(lt) { lt->partial = 0; lt->partial_zip = 0; } } void lxt2_wr_set_partial_on(struct lxt2_wr_trace *lt, int zipmode) { if(lt) { lt->partial = 1; lt->partial_zip = (zipmode != 0); lt->partial_iter = LXT2_WR_PARTIAL_SIZE; } } void lxt2_wr_set_partial_preference(struct lxt2_wr_trace *lt, const char *name) { struct lxt2_wr_symbol *s; if((lt)&&(name)&&(!lt->sorted_facs)) { s=lxt2_wr_symfind(lt, name); if(s) { while(s->aliased_to) /* find root alias */ { s=s->aliased_to; } s->partial_preference = 1; } } } /* * enable/disable checkpointing (for smaller files) */ void lxt2_wr_set_checkpoint_off(struct lxt2_wr_trace *lt) { if(lt) { lt->no_checkpoint = 1; } } void lxt2_wr_set_checkpoint_on(struct lxt2_wr_trace *lt) { if(lt) { lt->no_checkpoint = 0; } } /* * set initial value of trace (0, 1, x, z) only legal vals */ void lxt2_wr_set_initial_value(struct lxt2_wr_trace *lt, char value) { if(lt) { switch(value) { case '0': case '1': case 'x': case 'z': break; case 'Z': value = 'z'; break; default: value = 'x'; break; } lt->initial_value = value; } } /* * maint function for finding a symbol if it exists */ struct lxt2_wr_symbol *lxt2_wr_symbol_find(struct lxt2_wr_trace *lt, const char *name) { struct lxt2_wr_symbol *s=NULL; if((lt)&&(name)) s=lxt2_wr_symfind(lt, name); return(s); } /* * add a trace (if it doesn't exist already) */ struct lxt2_wr_symbol *lxt2_wr_symbol_add(struct lxt2_wr_trace *lt, const char *name, unsigned int rows, int msb, int lsb, int flags) { struct lxt2_wr_symbol *s; int len; int flagcnt; if((!lt)||(lt->sorted_facs)) return(NULL); flagcnt = ((flags&LXT2_WR_SYM_F_INTEGER)!=0) + ((flags&LXT2_WR_SYM_F_DOUBLE)!=0) + ((flags&LXT2_WR_SYM_F_STRING)!=0); if((flagcnt>1)||(!lt)||(!name)||(lxt2_wr_symfind(lt, name))) return (NULL); s=lxt2_wr_symadd(lt, name, lxt2_wr_hash(name)); s->rows = rows; s->flags = flags&(~LXT2_WR_SYM_F_ALIAS); /* aliasing makes no sense here.. */ if(!flagcnt) { s->msb = msb; s->lsb = lsb; s->len = (msbvalue = strdup("NaN"); } else { if(flags & LXT2_WR_SYM_F_INTEGER) { s->len = 32; } s->value = malloc(s->len + 1); memset(s->value, lt->initial_value, s->len); s->value[s->len]=0; s->msk = LXT2_WR_GRAN_1VAL; /* stuff in an initial value */ switch(lt->initial_value) { case '0': s->chg[0] = LXT2_WR_ENC_0; break; case '1': s->chg[0] = LXT2_WR_ENC_1; break; case 'z': s->chg[0] = LXT2_WR_ENC_Z; break; default: s->chg[0] = LXT2_WR_ENC_X; break; } s->chgpos++; /* don't worry that a time doesn't exist as it will soon enough.. */ } s->symchain = lt->symchain; lt->symchain = s; lt->numfacs++; if((len=strlen(name)) > lt->longestname) lt->longestname = len; lt->numfacbytes += (len+1); return(s); } /* * add an alias trace (if it doesn't exist already and orig is found) */ struct lxt2_wr_symbol *lxt2_wr_symbol_alias(struct lxt2_wr_trace *lt, const char *existing_name, const char *alias, int msb, int lsb) { struct lxt2_wr_symbol *s, *sa; int len; int bitlen; int flagcnt; if((!lt)||(!existing_name)||(!alias)||(!(s=lxt2_wr_symfind(lt, existing_name)))||(lxt2_wr_symfind(lt, alias))) return (NULL); if(lt->sorted_facs) return(NULL); while(s->aliased_to) /* find root alias */ { s=s->aliased_to; } flagcnt = ((s->flags&LXT2_WR_SYM_F_INTEGER)!=0) + ((s->flags&LXT2_WR_SYM_F_DOUBLE)!=0) + ((s->flags&LXT2_WR_SYM_F_STRING)!=0); bitlen = (msblen)) return(NULL); sa=lxt2_wr_symadd(lt, alias, lxt2_wr_hash(alias)); sa->flags = LXT2_WR_SYM_F_ALIAS; /* only point this can get set */ sa->aliased_to = s; if(!flagcnt) { sa->msb = msb; sa->lsb = lsb; sa->len = bitlen; } sa->symchain = lt->symchain; lt->symchain = sa; lt->numfacs++; lt->numalias++; if((len=strlen(alias)) > lt->longestname) lt->longestname = len; lt->numfacbytes += (len+1); return(sa); } /* * set current time/granule updating */ int lxt2_wr_inc_time_by_delta(struct lxt2_wr_trace *lt, unsigned int timeval) { return(lxt2_wr_set_time64(lt, lt->maxtime + (lxttime_t)timeval)); } int lxt2_wr_set_time(struct lxt2_wr_trace *lt, unsigned int timeval) { return(lxt2_wr_set_time64(lt, (lxttime_t)timeval)); } int lxt2_wr_inc_time_by_delta64(struct lxt2_wr_trace *lt, lxttime_t timeval) { return(lxt2_wr_set_time64(lt, lt->maxtime + timeval)); } /* * file size limiting/header cloning... */ static void lxt2_wr_emit_do_breakfile(struct lxt2_wr_trace *lt) { unsigned int len = strlen(lt->lxtname); int i; char *tname = malloc(len + 30); FILE *f2, *clone; off_t cnt, seg; char buf[32768]; for(i=len;i>0;i--) { if(lt->lxtname[i]=='.') break; } if(!i) { sprintf(tname, "%s_%03u.lxt", lt->lxtname, ++lt->break_number); } else { memcpy(tname, lt->lxtname, i); sprintf(tname+i, "_%03u.lxt", ++lt->break_number); } f2 = fopen(tname, "wb"); if(!f2) /* if error, keep writing to same output file...sorry */ { free(tname); return; } clone = fopen(lt->lxtname, "rb"); if(!clone) { /* this should never happen */ fclose(f2); unlink(tname); free(tname); return; } /* clone original header */ for(cnt = 0; cnt < lt->break_header_size; cnt += sizeof(buf)) { seg = lt->break_header_size - cnt; if(seg > (off_t)sizeof(buf)) { seg = sizeof(buf); } if(fread(buf, seg, 1, clone)) { if(!fwrite(buf, seg, 1, f2)) break; /* write error! */ } } fclose(clone); fclose(lt->handle); lt->handle = f2; free(tname); } /* * emit granule */ void lxt2_wr_flush_granule(struct lxt2_wr_trace *lt, int do_finalize) { unsigned int idx_nbytes, map_nbytes, i, j; struct lxt2_wr_symbol *s; unsigned int partial_iter; unsigned int iter, iter_hi; unsigned char using_partial, using_partial_zip=0; off_t current_iter_pos=0; int early_flush; if(lt->flush_valid) { if(lt->flushtime == lt->lasttime) { return; } lt->flush_valid = 0; } lt->granule_dirty = 0; if((using_partial=(lt->partial)&&(lt->numfacs>lt->partial_iter))) { partial_iter = lt->partial_iter; using_partial_zip = lt->partial_zip; } else { partial_iter = lt->numfacs; } if(!lt->timegranule) { int attempt_break_state = 2; do { fseeko(lt->handle, 0L, SEEK_END); lt->current_chunk=lt->position = ftello(lt->handle); if((lt->break_size)&&(attempt_break_state==2)&&(lt->position >= lt->break_size)&&(lt->position != lt->break_header_size)) { lxt2_wr_emit_do_breakfile(lt); attempt_break_state--; } else { attempt_break_state = 0; } } while(attempt_break_state); /* fprintf(stderr, "First chunk position is %d (0x%08x)\n", lt->current_chunk, lt->current_chunk); */ lxt2_wr_emit_u32(lt, 0); /* size of this section (uncompressed) */ lxt2_wr_emit_u32(lt, 0); /* size of this section (compressed) */ lxt2_wr_emit_u64(lt, 0, 0); /* begin time of section */ lxt2_wr_emit_u64(lt, 0, 0); /* end time of section */ fflush(lt->handle); lt->current_chunkz = lt->position; /* fprintf(stderr, "First chunkz position is %d (0x%08x)\n", lt->current_chunkz, lt->current_chunkz); */ if(!using_partial_zip) { lt->zhandle = gzdopen(dup(fileno(lt->handle)), lt->zmode); } else { lt->zpackcount_cumulative = 0; } lt->zpackcount = 0; } for(iter=0; iternumfacs; iter=iter_hi) { unsigned int total_chgs; unsigned int partial_length; total_chgs = 0; /* partial_length = 0; */ /* scan-build : never read */ iter_hi = iter + partial_iter; if(iter_hi > lt->numfacs) iter_hi = lt->numfacs; for(j=iter;jsorted_facs[j]->msk; lt->mapdict = lxt2_wr_ds_splay (msk, lt->mapdict); if((!lt->mapdict)||(lt->mapdict->item != msk)) { lt->mapdict = lxt2_wr_ds_insert(msk, lt->mapdict, lt->num_map_entries); lt->num_map_entries++; if(lt->mapdict_curr) { lt->mapdict_curr->next = lt->mapdict; lt->mapdict_curr = lt->mapdict; } else { lt->mapdict_head = lt->mapdict_curr = lt->mapdict; } } } if(lt->num_map_entries <= 256) { map_nbytes = 1; } else if(lt->num_map_entries <= 256*256) { map_nbytes = 2; } else if(lt->num_map_entries <= 256*256*256) { map_nbytes = 3; } else { map_nbytes = 4; } if((lt->num_dict_entries+LXT2_WR_DICT_START) <= 256) { idx_nbytes = 1; } else if((lt->num_dict_entries+LXT2_WR_DICT_START) <= 256*256) { idx_nbytes = 2; } else if((lt->num_dict_entries+LXT2_WR_DICT_START) <= 256*256*256) { idx_nbytes = 3; } else { idx_nbytes = 4; } if(using_partial) { /* skip */ partial_length = 1 + /* lt->timepos */ lt->timepos * sizeof(lxttime_t)+ /* timevals */ 1 + /* map_nbytes */ (iter_hi-iter) * map_nbytes + /* actual map */ 1; /* idx_nbytes */ for(j=iter;jsorted_facs[j]; total_chgs += s->chgpos; } total_chgs *= idx_nbytes; /* vch skip */ partial_length += total_chgs; /* actual changes */ if(using_partial_zip) { fseeko(lt->handle, 0L, SEEK_END); current_iter_pos = ftello(lt->handle); lxt2_wr_emit_u32(lt, 0); /* size of this section (compressed) */ lxt2_wr_emit_u32(lt, partial_length+9); /* size of this section (uncompressed) */ lxt2_wr_emit_u32(lt, iter); /* begin iter of section */ fflush(lt->handle); lt->zhandle = gzdopen(dup(fileno(lt->handle)), lt->zmode); lt->zpackcount = 0; } lxt2_wr_emit_u8z(lt, LXT2_WR_GRAN_SECT_TIME_PARTIAL); lxt2_wr_emit_u32z(lt, iter); lxt2_wr_emit_u32z(lt, partial_length); } else { lxt2_wr_emit_u8z(lt, LXT2_WR_GRAN_SECT_TIME); } lxt2_wr_emit_u8z(lt, lt->timepos); for(i=0;itimepos;i++) { lxt2_wr_emit_u64z(lt, (lt->timetable[i]>>32)&0xffffffff, lt->timetable[i]&0xffffffff); } gzflush_buffered(lt, 0); lxt2_wr_emit_u8z(lt, map_nbytes); for(j=iter;jsorted_facs[j]; lt->mapdict = lxt2_wr_ds_splay (s->msk, lt->mapdict); val = lt->mapdict->val; switch(map_nbytes) { case 1: lxt2_wr_emit_u8z(lt, val); break; case 2: lxt2_wr_emit_u16z(lt, val); break; case 3: lxt2_wr_emit_u24z(lt, val); break; case 4: lxt2_wr_emit_u32z(lt, val); break; } s->msk = LXT2_WR_GRAN_0VAL; } lxt2_wr_emit_u8z(lt, idx_nbytes); gzflush_buffered(lt, 0); for(j=iter;jsorted_facs[j]; for(i=0;ichgpos;i++) { switch(idx_nbytes) { case 1: lxt2_wr_emit_u8z (lt, s->chg[i]); break; case 2: lxt2_wr_emit_u16z(lt, s->chg[i]); break; case 3: lxt2_wr_emit_u24z(lt, s->chg[i]); break; case 4: lxt2_wr_emit_u32z(lt, s->chg[i]); break; } } s->chgpos = 0; } if(using_partial_zip) { off_t clen; gzflush_buffered(lt, 1); fseeko(lt->handle, 0L, SEEK_END); lt->position=ftello(lt->handle); clen = lt->position - current_iter_pos - 12; fseeko(lt->handle, current_iter_pos, SEEK_SET); lt->zpackcount_cumulative+=lt->zpackcount; lxt2_wr_emit_u32(lt, clen); } else { gzflush_buffered(lt, 0); } } /* ...for(iter) */ lt->timepos = 0; lt->timegranule++; if(lt->break_size) { early_flush = (ftello(lt->handle) >= lt->break_size); } else { early_flush = 0; } if((lt->timegranule>=lt->maxgranule)||(do_finalize)||(early_flush)) { off_t unclen, clen; lxt2_wr_ds_Tree *dt, *dt2; lxt2_wr_dslxt_Tree *ds, *ds2; if(using_partial_zip) { fseeko(lt->handle, 0L, SEEK_END); current_iter_pos = ftello(lt->handle); lxt2_wr_emit_u32(lt, 0); /* size of this section (compressed) */ lxt2_wr_emit_u32(lt, 0); /* size of this section (uncompressed) */ lxt2_wr_emit_u32(lt, ~0); /* control section */ fflush(lt->handle); lt->zhandle = gzdopen(dup(fileno(lt->handle)), lt->zmode); lt->zpackcount = 0; } /* fprintf(stderr, "reached granule %d, finalizing block for section %d\n", lt->timegranule, lt->numsections); */ lt->numsections++; /* finalize string dictionary */ lxt2_wr_emit_u8z(lt, LXT2_WR_GRAN_SECT_DICT); ds = lt->dict_head; /* fprintf(stderr, "num_dict_entries: %d\n", lt->num_dict_entries); */ gzflush_buffered(lt, 0); for(i=0;inum_dict_entries;i++) { /* fprintf(stderr, "%8d %8d) '%s'\n", ds->val, i, ds->item); */ if(ds->val != i) { fprintf(stderr, "internal error line %d\n", __LINE__); exit(255); } lxt2_wr_emit_stringz(lt, ds->item); ds2 = ds->next; free(ds->item); free(ds); ds = ds2; } lt->dict_head = lt->dict_curr = lt->dict = NULL; /* finalize map dictionary */ dt = lt->mapdict_head; /* fprintf(stderr, "num_map_entries: %d\n", lt->num_map_entries); */ gzflush_buffered(lt, 0); for(i=0;inum_map_entries;i++) { /* fprintf(stderr, "+++ %08x (%d)(%d)\n", dt->item, i, dt->val); */ if(((unsigned int)dt->val) != i) { fprintf(stderr, "internal error line %d\n", __LINE__); exit(255); } #if LXT2_WR_GRANULE_SIZE > 32 lxt2_wr_emit_u64z(lt, (dt->item>>32)&0xffffffff, dt->item&0xffffffff); #else lxt2_wr_emit_u32z(lt, dt->item); #endif dt2 = dt->next; free(dt); dt = dt2; } lt->mapdict_head = lt->mapdict_curr = lt->mapdict = NULL; lxt2_wr_emit_u32z(lt, lt->num_dict_entries); /* -12 */ lxt2_wr_emit_u32z(lt, lt->dict_string_mem_required); /* -8 */ lxt2_wr_emit_u32z(lt, lt->num_map_entries); /* -4 */ lt->num_map_entries = 0; lt->num_dict_entries = lt->dict_string_mem_required = 0; /* fprintf(stderr, "returned from finalize..\n"); */ if(using_partial_zip) { off_t c_len; gzflush_buffered(lt, 1); fseeko(lt->handle, 0L, SEEK_END); lt->position=ftello(lt->handle); c_len = lt->position - current_iter_pos - 12; fseeko(lt->handle, current_iter_pos, SEEK_SET); lt->zpackcount_cumulative+=lt->zpackcount; lxt2_wr_emit_u32(lt, c_len); lxt2_wr_emit_u32(lt, lt->zpackcount); } else { gzflush_buffered(lt, 1); } fseeko(lt->handle, 0L, SEEK_END); lt->position=ftello(lt->handle); /* fprintf(stderr, "file position after dumping dict: %d 0x%08x\n", lt->position, lt->position); */ unclen = lt->zpackcount; clen = lt->position - lt->current_chunkz; /* fprintf(stderr, "%d/%d un/compressed bytes in section\n", unclen, clen); */ fseeko(lt->handle, lt->current_chunk, SEEK_SET); if(using_partial_zip) { lxt2_wr_emit_u32(lt, lt->zpackcount_cumulative); lxt2_wr_emit_u32(lt, clen); } else { lxt2_wr_emit_u32(lt, unclen); lxt2_wr_emit_u32(lt, clen); } lxt2_wr_emit_u64(lt, (lt->firsttime>>32)&0xffffffff, lt->firsttime&0xffffffff); lxt2_wr_emit_u64(lt, (lt->lasttime>>32)&0xffffffff, lt->lasttime&0xffffffff); /* fprintf(stderr, "start: %lld, end %lld\n", lt->firsttime, lt->lasttime); */ lt->timegranule=0; lt->numblock++; } if(do_finalize) { lt->flush_valid = 1; lt->flushtime = lt->lasttime; } } int lxt2_wr_set_time64(struct lxt2_wr_trace *lt, lxttime_t timeval) { int rc=0; if(lt) { if(lt->timeset) { if(timeval > lt->maxtime) { if(lt->bumptime) { lt->bumptime = 0; if(!lt->flush_valid) { lt->timepos++; } else { lt->flush_valid = 0; } if(lt->timepos == LXT2_WR_GRANULE_SIZE) { /* fprintf(stderr, "flushing granule to disk at time %d\n", (unsigned int)timeval); */ lxt2_wr_flush_granule(lt, 0); } } /* fprintf(stderr, "updating time to %d (%d dict entries/%d bytes)\n", (unsigned int)timeval, lt->num_dict_entries, lt->dict_string_mem_required); */ lt->timetable[lt->timepos] = timeval; lt->lasttime = timeval; } } else { lt->timeset = 1; lt->mintime = lt->maxtime = timeval; lt->timetable[lt->timepos] = timeval; } if( (!lt->timepos) && (!lt->timegranule) ) { lt->firsttime = timeval; lt->lasttime = timeval; } if( (!lt->timepos) && (!lt->timegranule) && ((!lt->numblock)||(!lt->no_checkpoint)) ) { /* fprintf(stderr, "initial value burst timepos==0, timegranule==0\n"); */ if(lt->blackout) { lt->blackout = 0; lxt2_wr_set_dumpoff(lt); } else { struct lxt2_wr_symbol *s = lt->symchain; while(s) { if((!(s->flags&LXT2_WR_SYM_F_ALIAS))&&(s->rows<2)) { if(!(s->flags&(LXT2_WR_SYM_F_DOUBLE|LXT2_WR_SYM_F_STRING))) { lxt2_wr_emit_value_bit_string(lt, s, 0, s->value); } else if (s->flags&LXT2_WR_SYM_F_DOUBLE) { double value = 0; sscanf(s->value, "%lg", &value); errno = 0; lxt2_wr_emit_value_double(lt, s, 0, value); } else if (s->flags&LXT2_WR_SYM_F_STRING) { lxt2_wr_emit_value_string(lt, s, 0, s->value); } } s=s->symchain; } } /* fprintf(stderr, "done initial value burst timepos==0, timegranule==0\n"); */ } lt->granule_dirty = 1; rc = 1; } return(rc); } /* * sets trace timescale as 10**x seconds */ void lxt2_wr_set_timescale(struct lxt2_wr_trace *lt, int timescale) { if(lt) { lt->timescale = timescale; } } /* * set number of granules per section * (can modify dynamically) */ void lxt2_wr_set_maxgranule(struct lxt2_wr_trace *lt, unsigned int maxgranule) { if(lt) { if(!maxgranule) maxgranule = ~0; lt->maxgranule = maxgranule; } } /* * Sets bracket stripping (useful for VCD conversions of * bitblasted nets) */ void lxt2_wr_symbol_bracket_stripping(struct lxt2_wr_trace *lt, int doit) { if(lt) { lt->do_strip_brackets = (doit!=0); } } static char *lxt2_wr_expand_integer_to_bits(unsigned int len, int value) { static char s[33]; char *p = s; unsigned int i; if(len>32) len=32; len--; for(i=0;i<=len;i++) { *(p++) = '0' | ((value & (1<<(len-i)))!=0); } *p = 0; return(s); } int lxt2_wr_emit_value_int(struct lxt2_wr_trace *lt, struct lxt2_wr_symbol *s, unsigned int row, int value) { int rc=0; if((!lt)||(lt->blackout)||(!s)||(row)) return(rc); return(lxt2_wr_emit_value_bit_string(lt, s, row, lxt2_wr_expand_integer_to_bits(s->len, value))); } int lxt2_wr_emit_value_double(struct lxt2_wr_trace *lt, struct lxt2_wr_symbol *s, unsigned int row, double value) { int rc=0; if((!lt)||(lt->blackout)||(!s)||(row)) return(rc); if(!lt->emitted) { lxt2_wr_emitfacs(lt); lt->emitted = 1; if(!lt->timeset) { lxt2_wr_set_time(lt, 0); } } while(s->aliased_to) /* find root alias if exists */ { s=s->aliased_to; } if(s->flags&LXT2_WR_SYM_F_DOUBLE) { char d_buf[32]; unsigned int idx; rc = 1; sprintf(d_buf, "%.16g", value); if(!strcmp(d_buf, s->value)) return(rc); lt->bumptime = 1; free(s->value); s->value = strdup(d_buf); lt->dict = lxt2_wr_dslxt_splay (s->value, lt->dict); if(!lxt2_wr_dslxt_success) { unsigned int vlen = strlen(d_buf)+1; char *vcopy = (char *)malloc(vlen); strcpy(vcopy, d_buf); lt->dict_string_mem_required += vlen; lt->dict = lxt2_wr_dslxt_insert(vcopy, lt->dict, lt->num_dict_entries); if(lt->dict_curr) { lt->dict_curr->next = lt->dict; lt->dict_curr = lt->dict; } else { lt->dict_head = lt->dict_curr = lt->dict; } idx = lt->num_dict_entries + LXT2_WR_DICT_START; lt->num_dict_entries++; } else { idx = lt->dict->val + LXT2_WR_DICT_START; } if((s->msk & (LXT2_WR_GRAN_1VAL<timepos)) == LXT2_WR_GRAN_0VAL) { s->msk |= (LXT2_WR_GRAN_1VAL<timepos); s->chg[s->chgpos] = idx; s->chgpos++; } else { s->chg[s->chgpos-1] = idx; } lt->granule_dirty = 1; } return(rc); } int lxt2_wr_emit_value_string(struct lxt2_wr_trace *lt, struct lxt2_wr_symbol *s, unsigned int row, char *value) { int rc=0; if((!lt)||(lt->blackout)||(!s)||(!value)||(row)) return(rc); if(!lt->emitted) { lxt2_wr_emitfacs(lt); lt->emitted = 1; if(!lt->timeset) { lxt2_wr_set_time(lt, 0); } } while(s->aliased_to) /* find root alias if exists */ { s=s->aliased_to; } if(s->flags&LXT2_WR_SYM_F_STRING) { unsigned int idx; rc = 1; if(!strcmp(value, s->value)) return(rc); lt->bumptime = 1; free(s->value); s->value = strdup(value); lt->dict = lxt2_wr_dslxt_splay (s->value, lt->dict); if(!lxt2_wr_dslxt_success) { unsigned int vlen = strlen(value)+1; char *vcopy = (char *)malloc(vlen); strcpy(vcopy, value); lt->dict_string_mem_required += vlen; lt->dict = lxt2_wr_dslxt_insert(vcopy, lt->dict, lt->num_dict_entries); if(lt->dict_curr) { lt->dict_curr->next = lt->dict; lt->dict_curr = lt->dict; } else { lt->dict_head = lt->dict_curr = lt->dict; } idx = lt->num_dict_entries + LXT2_WR_DICT_START; lt->num_dict_entries++; } else { idx = lt->dict->val + LXT2_WR_DICT_START; } if((s->msk & (LXT2_WR_GRAN_1VAL<timepos)) == LXT2_WR_GRAN_0VAL) { s->msk |= (LXT2_WR_GRAN_1VAL<timepos); s->chg[s->chgpos] = idx; s->chgpos++; } else { s->chg[s->chgpos-1] = idx; } lt->granule_dirty = 1; } return(rc); } int lxt2_wr_emit_value_bit_string(struct lxt2_wr_trace *lt, struct lxt2_wr_symbol *s, unsigned int row, char *value) { int rc=0; char *vpnt; char *vfix; int valuelen; int i; if((!lt)||(lt->blackout)||(!s)||(!value)||(!*value)||(row)) return(rc); if(!lt->emitted) { lxt2_wr_emitfacs(lt); lt->emitted = 1; if(!lt->timeset) { lxt2_wr_set_time(lt, 0); } } while(s->aliased_to) /* find root alias if exists */ { s=s->aliased_to; } valuelen = strlen(value); /* ensure string is proper length */ if(valuelen == s->len) { vfix = wave_alloca(s->len+1); strcpy(vfix, value); value = vfix; } else { vfix = wave_alloca(s->len+1); if(valuelen < s->len) { int lendelta = s->len - valuelen; memset(vfix, (value[0]!='1') ? value[0] : '0', lendelta); strcpy(vfix+lendelta, value); } else { memcpy(vfix, value, s->len); vfix[s->len] = 0; } value = vfix; } for(i=0;ilen;i++) { unsigned char ch = value[i]; if((ch>='A')&&(ch<='Z')) value[i] = ch + ('a'-'A'); } if ( (lt->timepos || lt->timegranule) && !strcmp(value, s->value) ) { return(1); /* redundant value change */ } if(!(s->flags&(LXT2_WR_SYM_F_DOUBLE|LXT2_WR_SYM_F_STRING))) { char prevch; int idx; lt->bumptime = 1; vpnt = value; prevch = *vpnt; while(*vpnt) { if(prevch == *vpnt) { vpnt++; } else { prevch = 0; break; } } switch(prevch) { case '0': idx = LXT2_WR_ENC_0; break; case '1': idx = LXT2_WR_ENC_1; break; case 'X': case 'x': idx = LXT2_WR_ENC_X; break; case 'Z': case 'z': idx = LXT2_WR_ENC_Z; break; default: idx = -1; break; } if((lt->timepos)||(lt->timegranule)) { for(i=0;ilen;i++) { char ch = value[i]; switch(ch) { case '0': if(s->value[i]!='1') goto nextalg; else break; case '1': if(s->value[i]!='0') goto nextalg; else break; default: goto nextalg; } } idx = LXT2_WR_ENC_INV; goto do_enc; nextalg: if(s->len > 1) { if(!memcmp(s->value+1, value, s->len-1)) { if((value[s->len-1]&0xfe)=='0') { idx = LXT2_WR_ENC_LSH0 + (value[s->len-1]&0x01); goto do_enc; } } else if(!memcmp(s->value, value+1, s->len-1)) { if((value[0]&0xfe)=='0') { idx = LXT2_WR_ENC_RSH0 + (value[0]&0x01); goto do_enc; } } if(s->len <= 32) { unsigned int intval_old = 0, intval_new = 0; unsigned int msk; for(i=0;ilen;i++) { char ch = value[i]; if((ch!='0')&&(ch!='1')) goto idxchk; intval_new <<= 1; intval_new |= ((unsigned int)(ch&1)); ch = s->value[i]; if((ch!='0')&&(ch!='1')) goto idxchk; intval_old <<= 1; intval_old |= ((unsigned int)(ch&1)); } msk = (~0)>>(32-s->len); if( ((intval_old+1)&msk) == intval_new ) { idx = LXT2_WR_ENC_ADD1; goto do_enc; } if( ((intval_old-1)&msk) == intval_new ) { idx = LXT2_WR_ENC_SUB1; goto do_enc; } if( ((intval_old+2)&msk) == intval_new ) { idx = LXT2_WR_ENC_ADD2; goto do_enc; } if( ((intval_old-2)&msk) == intval_new ) { idx = LXT2_WR_ENC_SUB2; goto do_enc; } if( ((intval_old+3)&msk) == intval_new ) { idx = LXT2_WR_ENC_ADD3; goto do_enc; } if( ((intval_old-3)&msk) == intval_new ) { idx = LXT2_WR_ENC_SUB3; goto do_enc; } if(s->len > 2) { if( ((intval_old+4)&msk) == intval_new ) { idx = LXT2_WR_ENC_ADD4; goto do_enc; } if( ((intval_old-4)&msk) == intval_new ) { idx = LXT2_WR_ENC_SUB4; goto do_enc; } } } } } idxchk: if(idx<0) { vpnt = lxt2_wr_vcd_truncate_bitvec(value); lt->dict = lxt2_wr_dslxt_splay (vpnt, lt->dict); if(!lxt2_wr_dslxt_success) { unsigned int vlen = strlen(vpnt)+1; char *vcopy = (char *)malloc(vlen); strcpy(vcopy, vpnt); lt->dict_string_mem_required += vlen; lt->dict = lxt2_wr_dslxt_insert(vcopy, lt->dict, lt->num_dict_entries); if(lt->dict_curr) { lt->dict_curr->next = lt->dict; lt->dict_curr = lt->dict; } else { lt->dict_head = lt->dict_curr = lt->dict; } idx = lt->num_dict_entries + LXT2_WR_DICT_START; lt->num_dict_entries++; } else { idx = lt->dict->val + LXT2_WR_DICT_START; } } do_enc: if((s->msk & (LXT2_WR_GRAN_1VAL<timepos)) == LXT2_WR_GRAN_0VAL) { s->msk |= (LXT2_WR_GRAN_1VAL<timepos); s->chg[s->chgpos] = idx; s->chgpos++; } else { s->chg[s->chgpos-1] = idx; } strncpy(s->value, value, s->len); lt->granule_dirty = 1; } return(rc); } /* * dumping control */ void lxt2_wr_set_dumpoff(struct lxt2_wr_trace *lt) { struct lxt2_wr_symbol *s; if((lt)&&(!lt->blackout)) { if(!lt->emitted) { lxt2_wr_emitfacs(lt); lt->emitted = 1; if(!lt->timeset) { lxt2_wr_set_time(lt, 0); } } s = lt->symchain; while(s) { if(!(s->flags&LXT2_WR_SYM_F_ALIAS)) { if((s->msk & (LXT2_WR_GRAN_1VAL<timepos)) == LXT2_WR_GRAN_0VAL) { s->msk |= (LXT2_WR_GRAN_1VAL<timepos); s->chg[s->chgpos] = LXT2_WR_ENC_BLACKOUT; s->chgpos++; } else { s->chg[s->chgpos-1] = LXT2_WR_ENC_BLACKOUT; } } s=s->symchain; } lt->bumptime = 1; lt->blackout = 1; lt->granule_dirty = 1; } } void lxt2_wr_set_dumpon(struct lxt2_wr_trace *lt) { int i; struct lxt2_wr_symbol *s; if((lt)&&(lt->blackout)) { lt->blackout = 0; s = lt->symchain; while(s) { if(!(s->flags&LXT2_WR_SYM_F_ALIAS)) { if(s->flags&LXT2_WR_SYM_F_DOUBLE) { free(s->value); s->value = strdup("0"); /* will cause mismatch then flush */ } else { if(!(s->flags&LXT2_WR_SYM_F_STRING)) { s->value[0] = '-'; /* will cause mismatch then flush */ for(i=1;ilen;i++) { s->value[i] = 'x'; /* initial value */ } s->value[i]=0; } else { free(s->value); s->value = calloc(1, 1*sizeof(char)); } } } s=s->symchain; } s = lt->symchain; while(s) { if((!(s->flags&LXT2_WR_SYM_F_ALIAS))&&(s->rows<2)) { if(!(s->flags&(LXT2_WR_SYM_F_DOUBLE|LXT2_WR_SYM_F_STRING))) { lxt2_wr_emit_value_bit_string(lt, s, 0, "x"); } else if (s->flags&LXT2_WR_SYM_F_DOUBLE) { double value; sscanf("NaN", "%lg", &value); lxt2_wr_emit_value_double(lt, s, 0, value); } else if (s->flags&LXT2_WR_SYM_F_STRING) { lxt2_wr_emit_value_string(lt, s, 0, "UNDEF"); } } s=s->symchain; } } } /* * flush the trace... */ void lxt2_wr_flush(struct lxt2_wr_trace *lt) { if(lt) { if((lt->timegranule)||(lt->timepos > 0)) { if(lt->granule_dirty) { lt->timepos++; lxt2_wr_flush_granule(lt, 1); } } } } /* * close out the trace and fixate it */ void lxt2_wr_close(struct lxt2_wr_trace *lt) { if(lt) { if(lt->granule_dirty) { lt->timepos++; lxt2_wr_flush_granule(lt, 1); } if(lt->symchain) { struct lxt2_wr_symbol *s = lt->symchain; struct lxt2_wr_symbol *s2; while(s) { free(s->name); free(s->value); s2=s->symchain; free(s); s=s2; } lt->symchain=NULL; } free(lt->lxtname); free(lt->sorted_facs); fclose(lt->handle); free(lt); } } /* * set compression depth */ void lxt2_wr_set_compression_depth(struct lxt2_wr_trace *lt, unsigned int depth) { if(lt) { if(depth > 9) depth = 9; sprintf(lt->zmode, "wb%u", depth); } } /* * time zero offset */ void lxt2_wr_set_timezero(struct lxt2_wr_trace *lt, lxtstime_t timeval) { if(lt) { lt->timezero = timeval; } } gtkwave-3.3.86/src/helpers/vcd2lxt2.c0000664000175000017500000012715613166335473016665 0ustar bybellbybell/* * Copyright (c) 2001-2014 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ /* * vcd.c 23jan99ajb * evcd parts 29jun99ajb * profiler optimizations 15jul99ajb * stripped out of gtkwave 21jul99ajb * fix for duplicate nets 19dec00ajb * lxt conversion added 20nov01ajb */ #if defined _AIX #pragma alloca #endif #include #include #include "v2l_analyzer_lxt2.h" #include "lxt2_write.h" #include "wave_locale.h" #undef VCD_BSEARCH_IS_PERFECT /* bsearch is imperfect under linux, but OK under AIX */ struct lxt2_wr_trace *lt=NULL; int numfacs=0; int deadcnt=0; int opt_depth = 4; uint64_t opt_break_size = 0; int opt_partial_mode = -1; int opt_checkpoint_disable = 0; int opt_maxgranule = 8; struct symbol **sym=NULL; struct symbol **facs=NULL; struct symbol *firstnode=NULL; struct symbol *curnode=NULL; TimeType min_time=-1, max_time=-1; char hier_delimeter='.'; char deadchar='X'; int vcd_explicit_zero_subscripts=-1; /* 0=yes, -1=no */ char atomic_vectors=1; static FILE *vcd_handle=NULL; static char vcd_is_compressed=0; static void add_histent(TimeType time, struct Node *n, char ch, int regadd, char *vector); static void add_tail_histents(void); static void evcd_strcpy(char *dst, char *src); static int vcdlineno=1; static int header_over=0; static int dumping_off=0; static TimeType start_time=-1; static TimeType end_time=-1; static TimeType current_time=-1; static TimeType time_scale=1; /* multiplier is 1, 10, 100 */ static TimeType time_zero=0; static char vcd_hier_delimeter[2]={0, 0}; /* fill in after rc reading code */ /******************************************************************/ static struct slist *slistroot=NULL, *slistcurr=NULL; static char *slisthier=NULL; static int slisthier_len=0; /******************************************************************/ enum Tokens { T_VAR, T_END, T_SCOPE, T_UPSCOPE, T_COMMENT, T_DATE, T_DUMPALL, T_DUMPOFF, T_DUMPON, T_DUMPVARS, T_ENDDEFINITIONS, T_DUMPPORTS, T_DUMPPORTSOFF, T_DUMPPORTSON, T_DUMPPORTSALL, T_TIMESCALE, T_VERSION, T_VCDCLOSE, T_TIMEZERO, T_EOF, T_STRING, T_UNKNOWN_KEY }; char *tokens[]={ "var", "end", "scope", "upscope", "comment", "date", "dumpall", "dumpoff", "dumpon", "dumpvars", "enddefinitions", "dumpports", "dumpportsoff", "dumpportson", "dumpportsall", "timescale", "version", "vcdclose", "timezero", "", "", "" }; #define NUM_TOKENS 19 static int T_MAX_STR=1024; /* was originally a const..now it reallocs */ static char *yytext=NULL; static int yylen=0, yylen_cache=0; #define T_GET tok=get_token();if((tok==T_END)||(tok==T_EOF))break; /******************************************************************/ static struct vcdsymbol *vcdsymroot=NULL, *vcdsymcurr=NULL; static struct vcdsymbol **sorted=NULL; static struct vcdsymbol **indexed=NULL; enum VarTypes { V_EVENT, V_PARAMETER, V_INTEGER, V_REAL, V_REAL_PARAMETER=V_REAL, V_REALTIME=V_REAL, V_STRINGTYPE=V_REAL, V_REG, V_SUPPLY0, V_SUPPLY1, V_TIME, V_TRI, V_TRIAND, V_TRIOR, V_TRIREG, V_TRI0, V_TRI1, V_WAND, V_WIRE, V_WOR, V_PORT, V_IN=V_PORT, V_OUT=V_PORT, V_INOUT=V_PORT, V_END, V_LB, V_COLON, V_RB, V_STRING }; static char *vartypes[]={ "event", "parameter", "integer", "real", "real_parameter", "realtime", "string", "reg", "supply0", "supply1", "time", "tri", "triand", "trior", "trireg", "tri0", "tri1", "wand", "wire", "wor", "port", "in", "out", "inout", "$end", "", "", "", ""}; static const unsigned char varenums[] = { V_EVENT, V_PARAMETER, V_INTEGER, V_REAL, V_REAL_PARAMETER, V_REALTIME, V_STRINGTYPE, V_REG, V_SUPPLY0, V_SUPPLY1, V_TIME, V_TRI, V_TRIAND, V_TRIOR, V_TRIREG, V_TRI0, V_TRI1, V_WAND, V_WIRE, V_WOR, V_PORT, V_IN, V_OUT, V_INOUT, V_END, V_LB, V_COLON, V_RB, V_STRING }; #define NUM_VTOKENS 25 static int numsyms=0; /******************************************************************/ static struct queuedevent *queuedevents=NULL; /******************************************************************/ static unsigned int vcd_minid = ~0; static unsigned int vcd_maxid = 0; static unsigned int vcdid_hash(char *s, int len) { unsigned int val=0; int i; s+=(len-1); for(i=0;iid)); } /* * actual bsearch */ static struct vcdsymbol *bsearch_vcd(char *key, int len) { struct vcdsymbol **v; struct vcdsymbol *t; if(indexed) { unsigned int hsh = vcdid_hash(key, len); if((hsh>=vcd_minid)&&(hsh<=vcd_maxid)) { return(indexed[hsh-vcd_minid]); } } v=(struct vcdsymbol **)bsearch(key, sorted, numsyms, sizeof(struct vcdsymbol *), vcdsymbsearchcompare); if(v) { #ifndef VCD_BSEARCH_IS_PERFECT for(;;) { t=*v; if((v==sorted)||(strcmp((*(--v))->id, key))) { return(t); } } #else return(*v); #endif } else { return(NULL); } } /* * sort on vcdsymbol pointers */ static int vcdsymcompare(const void *s1, const void *s2) { struct vcdsymbol *v1, *v2; v1=*((struct vcdsymbol **)s1); v2=*((struct vcdsymbol **)s2); return(strcmp(v1->id, v2->id)); } /* * alias vs normal symbol adding */ static void alias_vs_normal_symadd(struct vcdsymbol *v, struct vcdsymbol *root_v) { if(!v) return; /* scan-build : should never happen */ if(!root_v) { if((v->vartype==V_INTEGER)||(v->vartype==V_REAL)) { v->ltsym = lxt2_wr_symbol_add(lt, v->name, 0, v->msi, v->lsi, (v->vartype==V_INTEGER)?LXT2_WR_SYM_F_INTEGER:((v->vartype==V_REAL)?LXT2_WR_SYM_F_DOUBLE:LXT2_WR_SYM_F_BITS)); } else { char buf[65537]; if(v->msi==v->lsi) { sprintf(buf, "%s[%d]", v->name, v->msi); } else { sprintf(buf, "%s[%d:%d]", v->name, v->msi, v->lsi); } v->ltsym = lxt2_wr_symbol_add(lt, buf, 0, v->msi, v->lsi, (v->vartype==V_INTEGER)?LXT2_WR_SYM_F_INTEGER:((v->vartype==V_REAL)?LXT2_WR_SYM_F_DOUBLE:LXT2_WR_SYM_F_BITS)); } } else { if((v->vartype==V_INTEGER)||(v->vartype==V_REAL)) { lxt2_wr_symbol_alias(lt, root_v->name, v->name, v->msi, v->lsi); } else { char bufold[65537], buf[65537]; if(v->msi==v->lsi) { sprintf(bufold, "%s[%d]", root_v->name, root_v->msi); sprintf(buf, "%s[%d]", v->name, v->msi); } else { sprintf(bufold, "%s[%d:%d]", root_v->name, root_v->msi, root_v->lsi); sprintf(buf, "%s[%d:%d]", v->name, v->msi, v->lsi); } lxt2_wr_symbol_alias(lt, bufold, buf, v->msi, v->lsi); } } } /* * create sorted (by id) table */ static void create_sorted_table(void) { struct vcdsymbol *v; struct vcdsymbol **pnt; unsigned int vcd_distance; struct vcdsymbol *root_v; int i; if(numsyms) { vcd_distance = vcd_maxid - vcd_minid + 1; if(vcd_distance <= 8 * 1024 * 1024) { indexed = (struct vcdsymbol **)calloc_2(vcd_distance, sizeof(struct vcdsymbol *)); printf("%d symbols span ID range of %d, using indexing...\n", numsyms, vcd_distance); v=vcdsymroot; while(v) { if(!(root_v=indexed[v->nid - vcd_minid])) { indexed[v->nid - vcd_minid] = v; } alias_vs_normal_symadd(v, root_v); v=v->next; } } else { pnt=sorted=(struct vcdsymbol **)calloc_2(numsyms, sizeof(struct vcdsymbol *)); v=vcdsymroot; while(v) { *(pnt++)=v; v=v->next; } qsort(sorted, numsyms, sizeof(struct vcdsymbol *), vcdsymcompare); root_v = NULL; for(i=0;iname); v->name = NULL; v=v->next; } } } /******************************************************************/ /* * single char get */ static int getch(void) { int ch; ch=fgetc(vcd_handle); if(ch=='\n') vcdlineno++; return(((ch==EOF)||(errno))?(-1):(ch)); } static int getch_peek(void) { int ch; ch=fgetc(vcd_handle); ungetc(ch, vcd_handle); return(((ch==EOF)||(errno))?(-1):(ch)); } static char *varsplit=NULL, *vsplitcurr=NULL; static int getch_patched(void) { char ch; ch=*vsplitcurr; if(!ch) { return(-1); } else { vsplitcurr++; return((int)ch); } } /* * simple tokenizer */ static int get_token(void) { int ch; int i, len=0; int is_string=0; char *yyshadow; for(;;) { ch=getch(); if(ch<0) return(T_EOF); if(ch<=' ') continue; /* val<=' ' is a quick whitespace check */ break; /* (take advantage of fact that vcd is text) */ } if(ch=='$') { yytext[len++]=ch; for(;;) { ch=getch(); if(ch<0) return(T_EOF); if(ch<=' ') continue; break; } } else { is_string=1; } for(yytext[len++]=ch;;yytext[len++]=ch) { if(len==T_MAX_STR) { yytext=(char *)realloc_2(yytext, (T_MAX_STR=T_MAX_STR*2)+1); } ch=getch(); if(ch<=' ') break; } yytext[len]=0; /* terminator */ if(is_string) { yylen=len; return(T_STRING); } yyshadow=yytext; do { yyshadow++; for(i=0;iw #implicit-var###VarElem:ram_di[0.0] [63:0] $end' style declarations */ { /* debussy simply escapes until the space */ yytext[len++]= '\\'; } for(yytext[len++]=ch;;yytext[len++]=ch) { if(len==T_MAX_STR) { yytext=(char *)realloc_2(yytext, (T_MAX_STR=T_MAX_STR*2)+1); } ch=getch(); if(ch==' ') { if(match_kw) break; if(getch_peek() == '[') { ch = getch(); varsplit=yytext+len; /* keep looping so we get the *last* one */ continue; } } if((ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r')||(ch<0)) break; if((ch=='[')&&(yytext[0]!='\\')) { varsplit=yytext+len; /* keep looping so we get the *last* one */ } else if(((ch==':')||(ch==']'))&&(!varsplit)&&(yytext[0]!='\\')) { var_prevch=ch; break; } } yytext[len]=0; /* absolute terminator */ if((varsplit)&&(yytext[len-1]==']')) { char *vst; vst=malloc_2(strlen(varsplit)+1); strcpy(vst, varsplit); *varsplit=0x00; /* zero out var name at the left bracket */ len=varsplit-yytext; varsplit=vsplitcurr=vst; var_prevch=0; } else { varsplit=NULL; } if(match_kw) for(i=0;ilen+(s->next?1:0); s=s->next; } if(slisthier) { free_2(slisthier); } slisthier=(char *)malloc_2((slisthier_len=len)+1); s=slistroot; len=0; while(s) { strcpy(slisthier+len,s->str); len+=s->len; if(s->next) { strcpy(slisthier+len,vcd_hier_delimeter); len++; } s=s->next; } return(slisthier); } void append_vcd_slisthier(char *str) { struct slist *s; s=(struct slist *)calloc_2(1,sizeof(struct slist)); s->len=strlen(str); s->str=(char *)malloc_2(s->len+1); strcpy(s->str,str); if(slistcurr) { slistcurr->next=s; slistcurr=s; } else { slistcurr=slistroot=s; } build_slisthier(); DEBUG(fprintf(stderr, "SCOPE: %s\n",slisthier)); } static void parse_valuechange(void) { struct vcdsymbol *v; char *vector; int vlen; switch(yytext[0]) { case '0': case '1': case 'x': case 'X': case 'z': case 'Z': case 'h': case 'H': case 'u': case 'U': case 'w': case 'W': case 'l': case 'L': case '-': if(yylen>1) { v=bsearch_vcd(yytext+1, yylen-1); if(!v) { fprintf(stderr,"Near line %d, Unknown VCD identifier: '%s'\n",vcdlineno,yytext+1); } else { if(v->vartype!=V_EVENT) { char vl[2]; vl[0]=yytext[0]; vl[1]=0; lxt2_wr_emit_value_bit_string(lt, v->ltsym, 0, vl); v->value[0]=yytext[0]; DEBUG(fprintf(stderr,"%s = '%c'\n",v->name,v->value[0])); add_histent(current_time,v->narray[0],v->value[0],1, NULL); } else { char vl[2]; v->value[0]=(dumping_off)?'x':'1'; /* only '1' is relevant */ if(current_time!=(v->ev->last_event_time+1)) { /* dump degating event */ DEBUG(fprintf(stderr,"#"TTFormat" %s = '%c' (event)\n",v->ev->last_event_time+1,v->name,'0')); add_histent(v->ev->last_event_time+1,v->narray[0],'0',1, NULL); } DEBUG(fprintf(stderr,"%s = '%c' (event)\n",v->name,v->value[0])); add_histent(current_time,v->narray[0],v->value[0],1, NULL); vl[0]='1'; vl[1]=0; lxt2_wr_emit_value_bit_string(lt, v->ltsym, 0, vl); vl[0]='0'; vl[1]=0; lxt2_wr_emit_value_bit_string(lt, v->ltsym, 0, vl); v->ev->last_event_time=current_time; } } } else { fprintf(stderr,"Near line %d, Malformed VCD identifier\n", vcdlineno); } break; case 'b': case 'B': /* extract binary number then.. */ vector=malloc_2(yylen_cache=yylen); strcpy(vector,yytext+1); vlen=yylen-1; get_strtoken(); v=bsearch_vcd(yytext, yylen); if(!v) { fprintf(stderr,"Near line %d, Unknown identifier: '%s'\n",vcdlineno, yytext); free_2(vector); } else { if(vlensize) /* fill in left part */ { char extend; int i, fill; extend=(vector[0]=='1')?'0':vector[0]; fill=v->size-vlen; for(i=0;ivalue[i]=extend; } strcpy(v->value+fill,vector); } else if(vlen==v->size) /* straight copy */ { strcpy(v->value,vector); } else /* too big, so copy only right half */ { int skip; skip=vlen-v->size; strcpy(v->value,vector+skip); } DEBUG(fprintf(stderr,"%s = '%s'\n",v->name, v->value)); lxt2_wr_emit_value_bit_string(lt, v->ltsym, 0, v->value); if((v->size==1)||(!atomic_vectors)) { int i; for(i=0;isize;i++) { add_histent(current_time, v->narray[i],v->value[i],1, NULL); } free_2(vector); } else { if(yylen_cache!=(v->size+1)) { free_2(vector); vector=malloc_2(v->size+1); } strcpy(vector,v->value); add_histent(current_time, v->narray[0],0,1,vector); free_2(vector); } } break; case 'p': /* extract port dump value.. */ vector=malloc_2(yylen_cache=yylen); strcpy(vector,yytext+1); vlen=yylen-1; get_strtoken(); /* throw away 0_strength_component */ get_strtoken(); /* throw away 0_strength_component */ get_strtoken(); /* this is the id */ v=bsearch_vcd(yytext, yylen); if(!v) { fprintf(stderr,"Near line %d, Unknown identifier: '%s'\n",vcdlineno, yytext); free_2(vector); } else { if(vlensize) /* fill in left part */ { char extend; int i, fill; extend='0'; fill=v->size-vlen; for(i=0;ivalue[i]=extend; } evcd_strcpy(v->value+fill,vector); } else if(vlen==v->size) /* straight copy */ { evcd_strcpy(v->value,vector); } else /* too big, so copy only right half */ { int skip; skip=vlen-v->size; evcd_strcpy(v->value,vector+skip); } DEBUG(fprintf(stderr,"%s = '%s'\n",v->name, v->value)); lxt2_wr_emit_value_bit_string(lt, v->ltsym, 0, v->value); if((v->size==1)||(!atomic_vectors)) { int i; for(i=0;isize;i++) { add_histent(current_time, v->narray[i],v->value[i],1, NULL); } free_2(vector); } else { if(yylen_cachesize) { free_2(vector); vector=malloc_2(v->size+1); } strcpy(vector,v->value); add_histent(current_time, v->narray[0],0,1,vector); free_2(vector); } } break; case 'r': case 'R': { double *d; d=malloc_2(sizeof(double)); *d = 0; sscanf(yytext+1,"%lg",d); errno = 0; get_strtoken(); v=bsearch_vcd(yytext, yylen); if(!v) { fprintf(stderr,"Near line %d, Unknown identifier: '%s'\n",vcdlineno, yytext); free_2(d); } else { lxt2_wr_emit_value_double(lt, v->ltsym, 0, *d); add_histent(current_time, v->narray[0],'g',1,(char *)d); free_2(d); } break; } case 's': case 'S': { get_strtoken(); /* simply skip for now */ break; } } } static void evcd_strcpy(char *dst, char *src) { static const char *evcd="DUNZduLHXTlh01?FAaBbCcf"; static const char *vcd="01xz0101xz0101xzxxxxxxz"; char ch; int i; while((ch=*src)) { for(i=0;i<23;i++) { if(evcd[i]==ch) { *dst=vcd[i]; break; } } if(i==23) *dst='x'; src++; dst++; } *dst=0; /* null terminate destination */ } static void vcd_parse(void) { int tok; for(;;) { switch(get_token()) { case T_COMMENT: sync_end("COMMENT:"); break; case T_DATE: sync_end("DATE:"); break; case T_VERSION: sync_end("VERSION:"); break; case T_TIMEZERO: { int vtok=get_token(); if((vtok==T_END)||(vtok==T_EOF)) break; time_zero=atoi_64(yytext); lxt2_wr_set_timezero(lt, time_zero); sync_end(NULL); } break; case T_TIMESCALE: { int vtok; int i; char prefix=' '; int timelogadjust = 0; vtok=get_token(); if((vtok==T_END)||(vtok==T_EOF)) break; time_scale=atoi_64(yytext); if(!time_scale) time_scale=1; else if (time_scale == 10) timelogadjust = +1; else if (time_scale == 100) timelogadjust = +2; for(i=0;i'9')) { prefix=yytext[i]; break; } } if(prefix==' ') { vtok=get_token(); if((vtok==T_END)||(vtok==T_EOF)) break; prefix=yytext[0]; } switch(prefix) { case 's': case ' ': lxt2_wr_set_timescale(lt, 0+timelogadjust); break; case 'm': lxt2_wr_set_timescale(lt, -3+timelogadjust); break; case 'u': lxt2_wr_set_timescale(lt, -6+timelogadjust); break; case 'n': lxt2_wr_set_timescale(lt, -9+timelogadjust); break; case 'p': lxt2_wr_set_timescale(lt, -12+timelogadjust); break; case 'f': lxt2_wr_set_timescale(lt, -15+timelogadjust); break; default: /* unknown */ lxt2_wr_set_timescale(lt, -9+timelogadjust); break; } sync_end(NULL); } break; case T_SCOPE: T_GET; T_GET; if(tok==T_STRING) { struct slist *s; s=(struct slist *)calloc_2(1,sizeof(struct slist)); s->len=yylen; s->str=(char *)malloc_2(yylen+1); strcpy(s->str,yytext); if(slistcurr) { slistcurr->next=s; slistcurr=s; } else { slistcurr=slistroot=s; } build_slisthier(); DEBUG(fprintf(stderr, "SCOPE: %s\n",slisthier)); } sync_end(NULL); break; case T_UPSCOPE: if(slistroot) { struct slist *s; s=slistroot; if(!s->next) { free_2(s->str); free_2(s); slistroot=slistcurr=NULL; } else for(;;) { if(!s->next->next) { free_2(s->next->str); free_2(s->next); s->next=NULL; slistcurr=s; break; } s=s->next; } build_slisthier(); DEBUG(fprintf(stderr, "SCOPE: %s\n",slisthier)); } sync_end(NULL); break; case T_VAR: { int vtok; struct vcdsymbol *v=NULL; var_prevch=0; if(varsplit) { free_2(varsplit); varsplit=NULL; } vtok=get_vartoken(1); if(vtok>V_PORT) goto bail; v=(struct vcdsymbol *)calloc_2(1,sizeof(struct vcdsymbol)); v->vartype=vtok; v->msi=v->lsi=vcd_explicit_zero_subscripts; /* indicate [un]subscripted status */ if(vtok==V_PORT) { vtok=get_vartoken(1); if(vtok==V_STRING) { v->size=atoi_64(yytext); if(!v->size) v->size=1; } else if(vtok==V_LB) { vtok=get_vartoken(1); if(vtok==V_END) goto err; if(vtok!=V_STRING) goto err; v->msi=atoi_64(yytext); vtok=get_vartoken(0); if(vtok==V_RB) { v->lsi=v->msi; v->size=1; } else { if(vtok!=V_COLON) goto err; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; v->lsi=atoi_64(yytext); vtok=get_vartoken(0); if(vtok!=V_RB) goto err; if(v->msi>v->lsi) { v->size=v->msi-v->lsi+1; } else { v->size=v->lsi-v->msi+1; } } } else goto err; vtok=get_strtoken(); if(vtok==V_END) goto err; v->id=(char *)malloc_2(yylen+1); strcpy(v->id, yytext); v->nid=vcdid_hash(yytext,yylen); if(v->nid < vcd_minid) vcd_minid = v->nid; if(v->nid > vcd_maxid) vcd_maxid = v->nid; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; if(slisthier_len) { v->name=(char *)malloc_2(slisthier_len+1+yylen+1); strcpy(v->name,slisthier); strcpy(v->name+slisthier_len,vcd_hier_delimeter); strcpy(v->name+slisthier_len+1,yytext); } else { v->name=(char *)malloc_2(yylen+1); strcpy(v->name,yytext); } } else /* regular vcd var, not an evcd port var */ { vtok=get_vartoken(1); if(vtok==V_END) goto err; v->size=atoi_64(yytext); vtok=get_strtoken(); if(vtok==V_END) goto err; v->id=(char *)malloc_2(yylen+1); strcpy(v->id, yytext); v->nid=vcdid_hash(yytext,yylen); if(v->nid < vcd_minid) vcd_minid = v->nid; if(v->nid > vcd_maxid) vcd_maxid = v->nid; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; if(slisthier_len) { v->name=(char *)malloc_2(slisthier_len+1+yylen+1); strcpy(v->name,slisthier); strcpy(v->name+slisthier_len,vcd_hier_delimeter); strcpy(v->name+slisthier_len+1,yytext); } else { v->name=(char *)malloc_2(yylen+1); strcpy(v->name,yytext); } vtok=get_vartoken(1); if(vtok==V_END) goto dumpv; if(vtok!=V_LB) goto err; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; v->msi=atoi_64(yytext); vtok=get_vartoken(0); if(vtok==V_RB) { v->lsi=v->msi; goto dumpv; } if(vtok!=V_COLON) goto err; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; v->lsi=atoi_64(yytext); vtok=get_vartoken(0); if(vtok!=V_RB) goto err; } dumpv: if(v->size == 0) { v->vartype = V_REAL; } /* MTI fix */ if(v->vartype==V_REAL) { v->size=1; /* override any data we parsed in */ v->msi=v->lsi=0; } else if((v->size>1)&&(v->msi<=0)&&(v->lsi<=0)) { if(v->vartype==V_EVENT) { v->size=1; } else { /* any criteria for the direction here? */ v->msi=v->size-1; v->lsi=0; } } else if((v->msi>v->lsi)&&((v->msi-v->lsi+1)!=v->size)) { if(v->vartype!=V_EVENT) goto err; v->size=v->msi-v->lsi+1; } else if((v->lsi>=v->msi)&&((v->lsi-v->msi+1)!=v->size)) { if(v->vartype!=V_EVENT) goto err; v->size=v->msi-v->lsi+1; } /* initial conditions */ v->value=(char *)malloc_2(v->size+1); v->value[v->size]=0; v->narray=(struct Node **)calloc_2(v->size,sizeof(struct Node *)); { int i; for(i=0;isize;i++) { v->value[i]='x'; v->narray[i]=(struct Node *)calloc_2(1,sizeof(struct Node)); v->narray[i]->head.time=-1; v->narray[i]->head.v.val=1; } } if(v->vartype==V_EVENT) { struct queuedevent *q; v->ev=q=(struct queuedevent *)calloc_2(1,sizeof(struct queuedevent)); q->sym=v; q->last_event_time=-1; q->next=queuedevents; queuedevents=q; } if(!vcdsymroot) { vcdsymroot=vcdsymcurr=v; } else { vcdsymcurr->next=v; vcdsymcurr=v; } numsyms++; #if 0 if((v->vartype==V_INTEGER)||(v->vartype==V_REAL)) { v->ltsym = lxt2_wr_symbol_add(lt, v->name, 0, v->msi, v->lsi, (v->vartype==V_INTEGER)?LXT2_WR_SYM_F_INTEGER:((v->vartype==V_REAL)?LXT2_WR_SYM_F_DOUBLE:LXT2_WR_SYM_F_BITS)); } else { char buf[65537]; if(v->msi==v->lsi) { sprintf(buf, "%s[%d]", v->name, v->msi); } else { sprintf(buf, "%s[%d:%d]", v->name, v->msi, v->lsi); } v->ltsym = lxt2_wr_symbol_add(lt, buf, 0, v->msi, v->lsi, (v->vartype==V_INTEGER)?LXT2_WR_SYM_F_INTEGER:((v->vartype==V_REAL)?LXT2_WR_SYM_F_DOUBLE:LXT2_WR_SYM_F_BITS)); } #endif DEBUG(fprintf(stderr,"VAR %s %d %s %s[%d:%d]\n", vartypes[v->vartype], v->size, v->id, v->name, v->msi, v->lsi)); goto bail; err: if(v) { if(v->name) free_2(v->name); if(v->id) free_2(v->id); if(v->value) free_2(v->value); free_2(v); } bail: if(vtok!=V_END) sync_end(NULL); break; } case T_ENDDEFINITIONS: if(!header_over) { header_over=1; /* do symbol table management here */ create_sorted_table(); if((!sorted)&&(!indexed)) { fprintf(stderr, "No symbols in VCD file..nothing to do!\n"); exit(1); } } break; case T_STRING: if(header_over) { /* catchall for events when header over */ if(yytext[0]=='#') { TimeType t_time; t_time=atoi_64(yytext+1); if(start_time<0) { start_time=t_time; } if(t_time < current_time) /* avoid backtracking time counts which can happen on malformed files */ { t_time = current_time; } current_time=t_time; if(end_timecurr) { he=(struct HistEnt *)calloc_2(1,sizeof(struct HistEnt)); he->time=-1; he->v.val=1; n->curr=he; n->head.next=he; add_histent(t_time,n,ch,regadd, vector); } else { /* if(regadd) { t_time*=(time_scale); } */ /* scan-build : never read */ if(toupper((int)(unsigned char)ch)!=deadchar) n->notdead=1; n->numtrans++; } } else { if(ch=='g') /* real number */ { if(!n->curr) { he=(struct HistEnt *)calloc_2(1,sizeof(struct HistEnt)); he->time=-1; he->v.vector=NULL; n->curr=he; n->head.next=he; add_histent(t_time,n,ch,regadd, vector); } else { n->notdead=1; n->numtrans++; } } else { if(!n->curr) { he=(struct HistEnt *)calloc_2(1,sizeof(struct HistEnt)); he->time=-1; he->v.vector=NULL; n->curr=he; n->head.next=he; add_histent(t_time,n,ch,regadd, vector); } else { int i, nlen; nlen = strlen(vector); if(nlen) { n->numtrans++; for(i=0;inotdead=1; return; } } } } } } } static void add_tail_histents(void) { /* dump out any pending events 1st */ struct queuedevent *q; q=queuedevents; while(q) { struct vcdsymbol *v; v=q->sym; if(current_time!=(v->ev->last_event_time+1)) { /* dump degating event */ DEBUG(fprintf(stderr,"#"TTFormat" %s = '%c' (event)\n",v->ev->last_event_time+1,v->name,'0')); add_histent(v->ev->last_event_time+1,v->narray[0],'0',1, NULL); } q=q->next; } } /*******************************************************************************/ TimeType vcd_main(char *fname, char *lxname) { #ifdef ONLY_NEEDED_FOR_VALGRIND_CLEAN_TEST struct vcdsymbol *v, *v2; #endif vcd_hier_delimeter[0]=hier_delimeter; errno=0; /* reset in case it's set for some reason */ yytext=(char *)malloc_2(T_MAX_STR+1); if((strlen(fname)>2)&&(!strcmp(fname+strlen(fname)-3,".gz"))) { char *str; int dlen; dlen=strlen(WAVE_DECOMPRESSOR); str=(char *)wave_alloca(strlen(fname)+dlen+1); strcpy(str,WAVE_DECOMPRESSOR); strcpy(str+dlen,fname); vcd_handle=popen(str,"r"); vcd_is_compressed=~0; } else { if(strcmp("-",fname)) { vcd_handle=fopen(fname,"rb"); } else { vcd_handle=stdin; } vcd_is_compressed=0; } if(!vcd_handle) { fprintf(stderr, "Error opening %s .vcd file '%s'.\n", vcd_is_compressed?"compressed":"", fname); exit(1); } lt=lxt2_wr_init(lxname); if(!lt) { fprintf(stderr, "Problem opening output file '%s'\n", lxname); perror("Why"); exit(255); } if(opt_partial_mode>=0) { lxt2_wr_set_partial_on(lt, opt_partial_mode); } if((opt_checkpoint_disable)&&(!opt_break_size)) { lxt2_wr_set_checkpoint_off(lt); } lxt2_wr_set_compression_depth(lt, opt_depth); lxt2_wr_set_break_size(lt, (off_t)opt_break_size); lxt2_wr_set_maxgranule(lt, opt_maxgranule); lxt2_wr_symbol_bracket_stripping(lt, 1); /* this is intentional */ sym=(struct symbol **)calloc_2(SYMPRIME,sizeof(struct symbol *)); printf("\nConverting VCD File '%s' to LXT2 file '%s'...\n\n",(vcd_handle!=stdin)?fname:"from stdin", lxname); build_slisthier(); vcd_parse(); if(varsplit) { free_2(varsplit); varsplit=NULL; } add_tail_histents(); printf("["TTFormat"] start time.\n["TTFormat"] end time.\n\n", start_time, end_time); lxt2_wr_close(lt); lt=NULL; min_time=start_time*time_scale; max_time=end_time*time_scale; if((min_time==max_time)||(max_time==0)) { fprintf(stderr, "VCD times range is equal to zero. Exiting.\n"); exit(1); } if(vcd_handle!=stdin) { fclose(vcd_handle); vcd_handle=NULL; } free(yytext); yytext=NULL; if(indexed) { free(indexed); indexed=NULL; } if(sorted) { free(sorted); sorted=NULL; } #ifdef ONLY_NEEDED_FOR_VALGRIND_CLEAN_TEST v=vcdsymroot; while(v) { if(v->name) { free(v->name); v->name=NULL; } if(v->id) { free(v->id); v->id=NULL; } if(v->value) { free(v->value); v->value=NULL; } if(v->narray) { int i; for(i=0;isize;i++) { struct HistEnt *h1, *h2; if((h1 = v->narray[i]->head.next)) { h1 = v->narray[i]->head.next; while(h1) { h2 = h1->next; free(h1); h1 = h2; } } free(v->narray[i]); v->narray[i]=NULL; } free(v->narray); v->narray=NULL; } v2=v->next; free(v); v=v2; } vcdsymroot=vcdsymcurr=NULL; #endif free(sym); sym=NULL; if(slisthier) { free(slisthier); slisthier=NULL; } return(max_time); } /*******************************************************************************/ /* * Generic hash function for symbol names... */ int hash(char *s) { char *p; unsigned int h=0, g; for(p=s;*p;p++) { h=(h<<4)+(*p); if((g=h&0xf0000000)) { h=h^(g>>24); h=h^g; } } return(h%SYMPRIME); } /* * add symbol to table. no duplicate checking * is necessary as aet's are "correct." */ struct symbol *symadd(char *name, int hv) { struct symbol *s; s=(struct symbol *)calloc_2(1,sizeof(struct symbol)); strcpy(s->name=(char *)malloc_2(strlen(name)+1),name); s->next=sym[hv]; sym[hv]=s; return(s); } /* * find a slot already in the table... */ struct symbol *symfind(char *s) { int hv; struct symbol *temp; hv=hash(s); if(!(temp=sym[hv])) return(NULL); /* no hash entry, add here wanted to add */ while(temp) { if(!strcmp(temp->name,s)) { return(temp); /* in table already */ } if(!temp->next) break; temp=temp->next; } return(NULL); /* not found, add here if you want to add*/ } int sigcmp(char *s1, char *s2) { unsigned char c1, c2; int u1, u2; for(;;) { c1=(unsigned char)*(s1++); c2=(unsigned char)*(s2++); if((!c1)&&(!c2)) return(0); if((c1<='9')&&(c2<='9')&&(c2>='0')&&(c1>='0')) { u1=(int)(c1&15); u2=(int)(c2&15); while(((c2=(unsigned char)*s2)>='0')&&(c2<='9')) { u2*=10; u2+=(unsigned int)(c2&15); s2++; } while(((c2=(unsigned char)*s1)>='0')&&(c2<='9')) { u1*=10; u1+=(unsigned int)(c2&15); s1++; } if(u1==u2) continue; else return((int)u1-(int)u2); } else { if(c1!=c2) return((int)c1-(int)c2); } } } int partition(struct symbol **a, int p, int r) { struct symbol *x, *t; int i,j; x=a[p]; i=p-1; j=r+1; while(1) { do { j--; } while(sigcmp(a[j]->name,x->name)>0); do { i++; } while(sigcmp(a[i]->name,x->name)<0); if(i.\n",nam); #else printf( "Usage: %s [OPTION]... [VCDFILE] [LXT2FILE]\n\n" " -v FILE specify VCD input filename\n" " -l FILE specify LXT2 output filename\n" " -d value specify 0..9 compression depth (default = 4)\n" " -m value specify number of granules per section (def = 8)\n" " -b value specify break size (default = 0 = off)\n" " -p mode specify partial zip mode 0=monolithic/1=separate\n" " -c mode specify checkpoint mode (0 = on [def], 1 = off)\n" " -h display this help then exit\n\n" "VCD files may be compressed with zip or gzip. Note that VCDFILE and LXTFILE\n" "are optional provided the --vcdname and --lxtname options are specified.\n" "Use \"-\" as a VCD filename to accept uncompressed input from stdin.\n\n" "Report bugs to <"PACKAGE_BUGREPORT">.\n",nam); #endif exit(0); } int main(int argc, char **argv) { char opt_errors_encountered=0; char *vname=NULL, *lxname=NULL; int c; WAVE_LOCALE_FIX while (1) { #ifdef __linux__ int option_index = 0; static struct option long_options[] = { {"vcdname", 1, 0, 'v'}, {"lxtname", 1, 0, 'l'}, {"depth", 1, 0, 'd'}, {"maxgranule", 1, 0, 'm'}, {"break", 1, 0, 'b'}, {"partialmode", 1, 0, 'p'}, {"checkpoint", 1, 0, 'c'}, {"help", 0, 0, 'h'}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "v:l:d:m:b:p:c:h", long_options, &option_index); #else c = getopt (argc, argv, "v:l:d:m:b:p:c:h"); #endif if (c == -1) break; /* no more args */ switch (c) { case 'v': if(vname) free(vname); vname = malloc_2(strlen(optarg)+1); strcpy(vname, optarg); break; case 'l': if(lxname) free(lxname); lxname = malloc_2(strlen(optarg)+1); strcpy(lxname, optarg); break; case 'd': opt_depth = atoi(optarg); if(opt_depth<0) opt_depth = 0; if(opt_depth>9) opt_depth = 9; break; case 'm': opt_maxgranule = atoi(optarg); if(opt_maxgranule<1) opt_maxgranule=1; break; case 'b': sscanf(optarg, "%"SCNu64, &opt_break_size); errno = 0; break; case 'p': opt_partial_mode = atoi(optarg); if(opt_depth<0) opt_partial_mode = 0; if(opt_depth>1) opt_partial_mode = 1; break; case 'c': opt_checkpoint_disable = atoi(optarg); break; case 'h': print_help(argv[0]); break; case '?': opt_errors_encountered=1; break; default: /* unreachable */ break; } } if(opt_errors_encountered) { print_help(argv[0]); } if (optind < argc) { while (optind < argc) { if(!vname) { vname = malloc_2(strlen(argv[optind])+1); strcpy(vname, argv[optind++]); } else if(!lxname) { lxname = malloc_2(strlen(argv[optind])+1); strcpy(lxname, argv[optind++]); } else { break; } } } if((!vname)||(!lxname)) { print_help(argv[0]); } vcd_main(vname, lxname); free(vname); free(lxname); return(0); } gtkwave-3.3.86/src/helpers/lxt2_write.h0000664000175000017500000002321513166335473017314 0ustar bybellbybell/* * Copyright (c) 2003-2012 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef DEFS_LXTW_H #define DEFS_LXTW_H #ifdef __cplusplus extern "C" { #endif #include #include #include #include #include #include #ifdef HAVE_INTTYPES_H #include #endif #include #ifndef HAVE_FSEEKO #define fseeko fseek #define ftello ftell #endif #include #define LXT2_WR_HDRID (0x1380) #define LXT2_WR_VERSION (0x0001) #define LXT2_WR_GRANULE_SIZE (64) #define LXT2_WR_GRANULE_NUM (256) #define LXT2_WR_PARTIAL_SIZE (2048) #define LXT2_WR_GRAN_SECT_TIME 0 #define LXT2_WR_GRAN_SECT_DICT 1 #define LXT2_WR_GRAN_SECT_TIME_PARTIAL 2 #define LXT2_WR_GZWRITE_BUFFER 4096 #define LXT2_WR_SYMPRIME 500009 typedef uint64_t lxttime_t; typedef int64_t lxtstime_t; #ifndef _MSC_VER #ifdef __MINGW32__ #define LXT2_WR_LLD "%I64d" #else #define LXT2_WR_LLD "%lld" #endif #define LXT2_WR_LLDESC(x) x##LL #define LXT2_WR_ULLDESC(x) x##ULL #else #define LXT2_WR_LLD "%I64d" #define LXT2_WR_LLDESC(x) x##i64 #define LXT2_WR_ULLDESC(x) x##i64 #endif #if LXT2_WR_GRANULE_SIZE > 32 typedef unsigned long long granmsk_t; #define LXT2_WR_GRAN_0VAL (LXT2_WR_ULLDESC(0)) #define LXT2_WR_GRAN_1VAL (LXT2_WR_ULLDESC(1)) #else typedef unsigned int granmsk_t; #define LXT2_WR_GRAN_0VAL (0) #define LXT2_WR_GRAN_1VAL (1) #endif enum LXT2_WR_Encodings { LXT2_WR_ENC_0, LXT2_WR_ENC_1, LXT2_WR_ENC_INV, LXT2_WR_ENC_LSH0, LXT2_WR_ENC_LSH1, LXT2_WR_ENC_RSH0, LXT2_WR_ENC_RSH1, LXT2_WR_ENC_ADD1, LXT2_WR_ENC_ADD2, LXT2_WR_ENC_ADD3, LXT2_WR_ENC_ADD4, LXT2_WR_ENC_SUB1, LXT2_WR_ENC_SUB2, LXT2_WR_ENC_SUB3, LXT2_WR_ENC_SUB4, LXT2_WR_ENC_X, LXT2_WR_ENC_Z, LXT2_WR_ENC_BLACKOUT, LXT2_WR_DICT_START }; /* * integer splay */ typedef struct lxt2_wr_ds_tree_node lxt2_wr_ds_Tree; struct lxt2_wr_ds_tree_node { lxt2_wr_ds_Tree * left, * right; granmsk_t item; int val; lxt2_wr_ds_Tree * next; }; /* * string splay */ typedef struct lxt2_wr_dslxt_tree_node lxt2_wr_dslxt_Tree; struct lxt2_wr_dslxt_tree_node { lxt2_wr_dslxt_Tree * left, * right; char *item; unsigned int val; lxt2_wr_dslxt_Tree * next; }; struct lxt2_wr_trace { FILE *handle; gzFile zhandle; lxt2_wr_dslxt_Tree *dict; /* dictionary manipulation */ unsigned int num_dict_entries; unsigned int dict_string_mem_required; lxt2_wr_dslxt_Tree *dict_head; lxt2_wr_dslxt_Tree *dict_curr; lxt2_wr_ds_Tree *mapdict; /* bitmap compression */ unsigned int num_map_entries; lxt2_wr_ds_Tree *mapdict_head; lxt2_wr_ds_Tree *mapdict_curr; off_t position; off_t zfacname_predec_size, zfacname_size, zfacgeometry_size; off_t zpackcount, zpackcount_cumulative; off_t current_chunk, current_chunkz; struct lxt2_wr_symbol *sym[LXT2_WR_SYMPRIME]; struct lxt2_wr_symbol **sorted_facs; struct lxt2_wr_symbol *symchain; unsigned int numfacs, numalias; int numfacbytes; int longestname; int numsections, numblock; off_t facname_offset, facgeometry_offset; lxttime_t mintime, maxtime; lxtstime_t timezero; unsigned int timegranule; int timescale; unsigned int timepos; unsigned int maxgranule; lxttime_t firsttime, lasttime; lxttime_t timetable[LXT2_WR_GRANULE_SIZE]; unsigned int partial_iter; char *compress_fac_str; int compress_fac_len; lxttime_t flushtime; unsigned flush_valid : 1; unsigned do_strip_brackets : 1; unsigned emitted : 1; /* gate off change field zmode changes when set */ unsigned timeset : 1; /* time has been modified from 0..0 */ unsigned bumptime : 1; /* says that must go to next time position in granule as value change exists for current time */ unsigned granule_dirty : 1; /* for flushing out final block */ unsigned blackout : 1; /* blackout on/off */ unsigned partial : 1; /* partial (vertical) trace support */ unsigned partial_zip : 1; /* partial (vertical) trace support for zip subregions */ unsigned no_checkpoint : 1; /* turns off interblock checkpointing */ unsigned partial_preference : 1; /* partial preference encountered on some facs */ char initial_value; char zmode[4]; /* fills in with "wb0".."wb9" */ unsigned int gzbufpnt; unsigned char gzdest[LXT2_WR_GZWRITE_BUFFER + 4]; /* enough for zlib buffering */ char *lxtname; off_t break_size; off_t break_header_size; unsigned int break_number; }; struct lxt2_wr_symbol { struct lxt2_wr_symbol *next; struct lxt2_wr_symbol *symchain; char *name; int namlen; int facnum; struct lxt2_wr_symbol *aliased_to; char *value; /* fac's actual value */ unsigned int rows; int msb, lsb; int len; int flags; unsigned partial_preference : 1; /* in order to shove nets to the first partial group */ unsigned int chgpos; granmsk_t msk; /* must contain LXT2_WR_GRANULE_SIZE bits! */ unsigned int chg[LXT2_WR_GRANULE_SIZE]; }; #define LXT2_WR_SYM_F_BITS (0) #define LXT2_WR_SYM_F_INTEGER (1<<0) #define LXT2_WR_SYM_F_DOUBLE (1<<1) #define LXT2_WR_SYM_F_STRING (1<<2) #define LXT2_WR_SYM_F_TIME (LXT2_WR_SYM_F_STRING) /* user must correctly format this as a string */ #define LXT2_WR_SYM_F_ALIAS (1<<3) #define LXT2_WR_SYM_F_SIGNED (1<<4) #define LXT2_WR_SYM_F_BOOLEAN (1<<5) #define LXT2_WR_SYM_F_NATURAL ((1<<6)|(LXT2_WR_SYM_F_INTEGER)) #define LXT2_WR_SYM_F_POSITIVE ((1<<7)|(LXT2_WR_SYM_F_INTEGER)) #define LXT2_WR_SYM_F_CHARACTER (1<<8) #define LXT2_WR_SYM_F_CONSTANT (1<<9) #define LXT2_WR_SYM_F_VARIABLE (1<<10) #define LXT2_WR_SYM_F_SIGNAL (1<<11) #define LXT2_WR_SYM_F_IN (1<<12) #define LXT2_WR_SYM_F_OUT (1<<13) #define LXT2_WR_SYM_F_INOUT (1<<14) #define LXT2_WR_SYM_F_WIRE (1<<15) #define LXT2_WR_SYM_F_REG (1<<16) /* file I/O */ struct lxt2_wr_trace * lxt2_wr_init(const char *name); void lxt2_wr_flush(struct lxt2_wr_trace *lt); void lxt2_wr_close(struct lxt2_wr_trace *lt); /* for dealing with very large traces, split into multiple files approximately "siz" in length */ void lxt2_wr_set_break_size(struct lxt2_wr_trace *lt, off_t siz); /* 0 = no compression, 9 = best compression, 4 = default */ void lxt2_wr_set_compression_depth(struct lxt2_wr_trace *lt, unsigned int depth); /* default is partial off, turning on makes for faster trace reads, nonzero zipmode causes vertical compression */ void lxt2_wr_set_partial_off(struct lxt2_wr_trace *lt); void lxt2_wr_set_partial_on(struct lxt2_wr_trace *lt, int zipmode); void lxt2_wr_set_partial_preference(struct lxt2_wr_trace *lt, const char *name); /* turning off checkpointing makes for smaller files */ void lxt2_wr_set_checkpoint_off(struct lxt2_wr_trace *lt); void lxt2_wr_set_checkpoint_on(struct lxt2_wr_trace *lt); /* facility creation */ void lxt2_wr_set_initial_value(struct lxt2_wr_trace *lt, char value); struct lxt2_wr_symbol * lxt2_wr_symbol_find(struct lxt2_wr_trace *lt, const char *name); struct lxt2_wr_symbol * lxt2_wr_symbol_add(struct lxt2_wr_trace *lt, const char *name, unsigned int rows, int msb, int lsb, int flags); struct lxt2_wr_symbol * lxt2_wr_symbol_alias(struct lxt2_wr_trace *lt, const char *existing_name, const char *alias, int msb, int lsb); void lxt2_wr_symbol_bracket_stripping(struct lxt2_wr_trace *lt, int doit); /* each granule is LXT2_WR_GRANULE_SIZE (32 or 64) timesteps, default is 256 per section */ void lxt2_wr_set_maxgranule(struct lxt2_wr_trace *lt, unsigned int maxgranule); /* time ops */ void lxt2_wr_set_timescale(struct lxt2_wr_trace *lt, int timescale); void lxt2_wr_set_timezero(struct lxt2_wr_trace *lt, lxtstime_t timeval); int lxt2_wr_set_time(struct lxt2_wr_trace *lt, unsigned int timeval); int lxt2_wr_inc_time_by_delta(struct lxt2_wr_trace *lt, unsigned int timeval); int lxt2_wr_set_time64(struct lxt2_wr_trace *lt, lxttime_t timeval); int lxt2_wr_inc_time_by_delta64(struct lxt2_wr_trace *lt, lxttime_t timeval); /* allows blackout regions in LXT files */ void lxt2_wr_set_dumpoff(struct lxt2_wr_trace *lt); void lxt2_wr_set_dumpon(struct lxt2_wr_trace *lt); /* left fill on bit_string uses vcd semantics (left fill with value[0] unless value[0]=='1', then use '0') */ int lxt2_wr_emit_value_int(struct lxt2_wr_trace *lt, struct lxt2_wr_symbol *s, unsigned int row, int value); int lxt2_wr_emit_value_double(struct lxt2_wr_trace *lt, struct lxt2_wr_symbol *s, unsigned int row, double value); int lxt2_wr_emit_value_string(struct lxt2_wr_trace *lt, struct lxt2_wr_symbol *s, unsigned int row, char *value); int lxt2_wr_emit_value_bit_string(struct lxt2_wr_trace *lt, struct lxt2_wr_symbol *s, unsigned int row, char *value); #ifdef __cplusplus } #endif #endif gtkwave-3.3.86/src/helpers/vcd2fst.c0000664000175000017500000011046513166335473016563 0ustar bybellbybell/* * Copyright (c) 2009-2014 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #if HAVE_GETOPT_H #include #endif #include "fst/fstapi.h" #include "../../contrib/rtlbrowse/jrb.h" #include "wave_locale.h" #ifdef EXTLOAD_SUFFIX #ifdef EXTCONV_PATH #define VCD2FST_EXTLOAD_CONV #endif #endif #ifdef EXT2LOAD_SUFFIX #ifdef EXT2CONV_PATH #define VCD2FST_EXT2LOAD_CONV #endif #endif #ifdef EXT3LOAD_SUFFIX #ifdef EXT3CONV_PATH #define VCD2FST_EXT3LOAD_CONV #endif #endif #if defined(VCD2FST_EXTLOAD_CONV) || defined(VCD2FST_EXT2LOAD_CONV) || defined(VCD2FST_EXT3LOAD_CONV) #define VCD2FST_EXTLOADERS_CONV #endif static uint32_t var_direction_idx = 0; static unsigned char *var_direction = NULL; static void *realloc_2(void *ptr, size_t siz) /* cppcheck */ { void *pnt = realloc(ptr, siz); if(!pnt) { fprintf(stderr, "ERROR: Out of memory in realloc(), exiting!\n"); /* normally free(ptr) here */ exit(255); } return(pnt); } /*********************************************************/ /*** vvv extload component type name determination vvv ***/ /*********************************************************/ #if defined(VCD2FST_EXTLOAD_CONV) #ifdef _WAVE_HAVE_JUDY #include Pvoid_t PJArray = NULL; #else JRB comp_name_jrb = NULL; #endif static const char *fst_scope_name = NULL; static uint32_t numfacs = 0; static char *get_info(FILE *extload) { static char sbuff[65537]; char * rc; for(;;) { rc = fgets(sbuff, 65536, extload); if(!rc) { return(NULL); } switch(rc[0]) { case 'v': if(!strncmp("var creation cnt", rc, 16)) { char *pnt = strchr(rc+16, ':'); if(pnt) { pnt++; sscanf(pnt, "%u", &numfacs); } } break; default: break; } } } static char *get_scopename(void *xc, FILE *extload) { static char sbuff[65537]; char * rc; #ifdef _WAVE_HAVE_JUDY PPvoid_t PPValue; #else JRB str; Jval jv; #endif for(;;) { rc = fgets(sbuff, 65536, extload); if(rc) { if(isspace(rc[0])) { char sbuff2[65537]; sbuff2[0] = 0; if(strstr(rc+1, "Struct Name:")) { sscanf(rc+14,"%s", sbuff2); if(sbuff2[0]) { sprintf(rc, "Scope: vcd_struct %s NULL\n", sbuff2); } } else if(strstr(rc+1, "Struct End")) { sprintf(rc, "Upscope:\n"); } } } else { return(NULL); } if(rc[0] == 'V') { if(!strncmp("Var: ", rc, 5)) { char *pnt = rc + 5; char *pntd = strrchr(pnt, ':'); if(pntd) { unsigned char vd = FST_VD_IMPLICIT; pntd = strchr(pntd, ' '); if(pntd) { pntd++; if(*pntd == 'o') { vd = FST_VD_OUTPUT; } else if(!strncmp(pntd, "in", 2)) { vd = (pntd[2] == 'p') ? FST_VD_INPUT : FST_VD_INOUT; } } var_direction[var_direction_idx++] = vd; } } } else if(rc[0] == 'S') { if(!strncmp(rc, "Scope:", 6)) { char vht[2048]; char cname[2048]; char ctype[2048]; int mtype = FST_ST_VCD_MODULE; cname[0] = ctype[1] = 0; sscanf(rc+6, "%s %s %s", vht, cname, ctype+1); if(!strncmp("vcd_", vht, 4)) { switch(vht[4]) { case 'g': mtype = FST_ST_VCD_GENERATE; break; /* other code looks for non-modules to replace type with */ case 's': mtype = FST_ST_VCD_STRUCT; break; /* other code looks for non-modules to replace type with */ default: break; } } else if(!strncmp("sv_", vht, 3)) { switch(vht[3]) { case 'i': mtype = FST_ST_VCD_INTERFACE; break; /* other code looks for non-modules to replace type with */ default: break; } } else if(!strncmp(vht, "vhdl_", 5)) { switch(vht[5]) { case 'a': mtype = FST_ST_VHDL_ARCHITECTURE; break; case 'r': mtype = FST_ST_VHDL_RECORD; break; case 'b': mtype = FST_ST_VHDL_BLOCK; break; case 'g': mtype = FST_ST_VHDL_GENERATE; break; case 'i': mtype = FST_ST_VHDL_IF_GENERATE; break; case 'f': mtype = (vht[6] == 'u') ? FST_ST_VHDL_FUNCTION : FST_ST_VHDL_FOR_GENERATE; break; case 'p': mtype = (!strncmp(vht+6, "roces", 5)) ? FST_ST_VHDL_PROCESS: FST_ST_VHDL_PROCEDURE; break; default: break; } } ctype[0] = mtype + 1; /* bias for zero terminated string */ fst_scope_name = fstReaderPushScope(xc, cname, NULL); /* process fst_scope_name + cname vs ctype here */ if((strcmp(ctype+1, "NULL") && strcmp(cname, ctype+1)) || (mtype != FST_ST_VCD_MODULE)) { #ifdef _WAVE_HAVE_JUDY PPValue = JudySLIns(&PJArray, (uint8_t *)fst_scope_name, PJE0); if(!*((char **)PPValue)) { *((char **)PPValue) = strdup(ctype); } #else char cstring[65537]; strcpy(cstring, fst_scope_name); str = jrb_find_str(comp_name_jrb, cstring); if(!str) { jv.s = strdup(ctype); jrb_insert_str(comp_name_jrb, strdup(cstring), jv); } #endif } } } else if(rc[0] == 'U') { fst_scope_name = fstReaderPopScope(xc); } } return(rc); } static void iter_scope(char *fname) { char sbuff[65537]; FILE *extload; void *xc = fstReaderOpenForUtilitiesOnly(); sprintf(sbuff, "%s -info %s 2>&1", EXTLOAD_PATH, fname); extload = popen(sbuff, "r"); if(extload) { while(get_info(extload)); pclose(extload); } if(numfacs) { var_direction = calloc(numfacs, sizeof(unsigned char)); var_direction_idx = 0; } sprintf(sbuff, "%s -tree %s 2>&1", EXTLOAD_PATH, fname); extload = popen(sbuff, "r"); if(extload) { while(get_scopename(xc, extload)); pclose(extload); } var_direction_idx = 0; fstReaderClose(xc); /* corresponds to fstReaderOpenForUtilitiesOnly() */ } static void dealloc_scope(void) { #ifdef _WAVE_HAVE_JUDY PPvoid_t PPValue; if(PJArray) { char Index[65537]; Index[0] = 0; for (PPValue = JudySLFirst (PJArray, (uint8_t *)Index, PJE0); PPValue != (PPvoid_t) NULL; PPValue = JudySLNext (PJArray, (uint8_t *)Index, PJE0)) { free(*(char **)PPValue); } JudySLFreeArray(&PJArray, PJE0); PJArray = NULL; } #else if(comp_name_jrb) { JRB node; char *Index; jrb_traverse(node, comp_name_jrb) { Index = node->key.s; free(Index); Index = node->val.s; free(Index); } jrb_free_tree(comp_name_jrb); comp_name_jrb = NULL; } #endif } #endif /*********************************************************/ /*** ^^^ extload component type name determination ^^^ ***/ /*********************************************************/ static uint64_t atoi_2(const unsigned char *s) { uint64_t res = 0; unsigned char ch; ch = *s - '0'; while(*s && (ch > 9)) { s++; ch = *s - '0'; } while(ch < 10) { s++; res *= 10; res += ch; ch = *s - '0'; } return(res); } static inline int getline_replace(char **wbuf, char **buf, size_t *len, FILE *f) { char *fgets_rc; if(!*wbuf) { *len = 32767; *wbuf = malloc((*len) + 1); (*wbuf)[*len] = 1; } (*wbuf)[0] = 0; fgets_rc = fgets(*wbuf, (*len) + 1, f); while(((*wbuf)[*len] != 1) && !feof(f)) { /* fprintf(stderr, "overflow %d\n", (int)(*len)); */ *wbuf = realloc_2(*wbuf, (*len) * 2 + 1); (*wbuf)[(*len) * 2] = 1; fgets_rc = fgets(*wbuf + (*len), (*len) + 1, f); *len = 2 * (*len); } *buf = *wbuf; while(*(buf)[0]==' ') { (*buf)++; } /* verilator leading spaces fix */ if((!(*buf)[0])||(!fgets_rc)) { return(0); } else { return(1); } } JRB vcd_ids = NULL; static unsigned int vcdid_hash(char *s, int len) { unsigned int val=0; int i; s += len; for(i=0;i=sfxlen)&&(!strcasecmp(s+strlen(s)-sfxlen,sfx))); } #endif int fst_main(char *vname, char *fstname) { FILE *f; char *buf = NULL, *wbuf = NULL; size_t glen = 0; void *ctx; int line = 0; int ss; fstHandle returnedhandle; JRB node; uint64_t prev_tim = 0; ssize_t bin_fixbuff_len = 65537; char *bin_fixbuff = NULL; int hash_kill = 0; unsigned int hash_max = 0; int *node_len_array = NULL; int is_popen = 0; #ifdef VCD2FST_EXTLOAD_CONV int is_extload = 0; void *xc = NULL; #endif int port_encountered = 0; bin_fixbuff = malloc(bin_fixbuff_len); if(!strcmp("-", vname)) { f = stdin; } else { #ifdef VCD2FST_EXTLOAD_CONV if(suffix_check(vname, "."EXTLOAD_SUFFIX) || suffix_check(vname, "."EXTLOAD_SUFFIX".gz") || suffix_check(vname, "."EXTLOAD_SUFFIX".bz2")) { sprintf(bin_fixbuff, EXTCONV_PATH" %s", vname); f = popen(bin_fixbuff, "r"); is_popen = 1; is_extload = 1; #ifndef _WAVE_HAVE_JUDY comp_name_jrb = make_jrb(); #endif iter_scope(vname); } else #endif { #ifdef VCD2FST_EXT2LOAD_CONV if(suffix_check(vname, "."EXT2LOAD_SUFFIX)) { sprintf(bin_fixbuff, EXT2CONV_PATH" %s", vname); f = popen(bin_fixbuff, "r"); is_popen = 1; } else #endif #ifdef VCD2FST_EXT3LOAD_CONV if(suffix_check(vname, "."EXT3LOAD_SUFFIX)) { sprintf(bin_fixbuff, EXT3CONV_PATH" %s", vname); f = popen(bin_fixbuff, "r"); is_popen = 1; } else #endif { f = fopen(vname, "rb"); } } } if(!f) { printf("Could not open '%s', exiting.\n", vname); free(bin_fixbuff); bin_fixbuff = NULL; free(vname); free(fstname); exit(255); } ctx = fstWriterCreate(fstname, 1); if(!ctx) { printf("Could not open '%s', exiting.\n", fstname); free(bin_fixbuff); bin_fixbuff = NULL; free(vname); free(fstname); fclose(f); exit(255); } #if defined(VCD2FST_EXTLOAD_CONV) if(is_popen && is_extload) { xc = fstReaderOpenForUtilitiesOnly(); } #endif vcd_ids = make_jrb(); fstWriterSetPackType(ctx, pack_type); fstWriterSetRepackOnClose(ctx, repack_all); fstWriterSetParallelMode(ctx, parallel_mode); while(!feof(f)) { char *buf1; ss = getline_replace(&wbuf, &buf, &glen, f); if(!ss) { break; } line++; if(buf[0] != '$') continue; buf1 = buf + 1; if(!strncmp(buf1, "var", 3)) { char *st = strtok(buf+5, " \t"); enum fstVarType vartype; int len; char *nam; unsigned int hash; if(!st) { continue; /* variable declaration not on a single line */ } vartype = FST_VT_VCD_WIRE; switch(st[0]) { case 'w': if(!strcmp(st, "wire")) { } else if(!strcmp(st, "wand")) { vartype = FST_VT_VCD_WAND; } else if(!strcmp(st, "wor")) { vartype = FST_VT_VCD_WOR; } break; case 'r': if(!strcmp(st, "reg")) { vartype = FST_VT_VCD_REG; } else if(!strcmp(st, "real")) { vartype = FST_VT_VCD_REAL; } else if(!strcmp(st, "real_parameter")) { vartype = FST_VT_VCD_REAL_PARAMETER; } else if(!strcmp(st, "realtime")) { vartype = FST_VT_VCD_REALTIME; } break; case 'p': if(!strcmp(st, "parameter")) { vartype = FST_VT_VCD_PARAMETER; } else if(!strcmp(st, "port")) { vartype = FST_VT_VCD_PORT; port_encountered = 1; } break; case 'i': if(!strcmp(st, "integer")) { vartype = FST_VT_VCD_INTEGER; } else if(!strcmp(st, "int")) { vartype = FST_VT_SV_INT; } break; case 'e': if(!strcmp(st, "event")) { vartype = FST_VT_VCD_EVENT; } else if(!strcmp(st, "enum")) { vartype = FST_VT_SV_ENUM; } break; case 'b': if(!strcmp(st, "bit")) { vartype = FST_VT_SV_BIT; } else if(!strcmp(st, "byte")) { vartype = FST_VT_SV_BYTE; } break; case 'l': if(!strcmp(st, "logic")) { vartype = FST_VT_SV_LOGIC; } else if(!strcmp(st, "longint")) { vartype = FST_VT_SV_LONGINT; } break; case 's': if(!strcmp(st, "supply1")) { vartype = FST_VT_VCD_SUPPLY1; } else if(!strcmp(st, "supply0")) { vartype = FST_VT_VCD_SUPPLY0; } else if(!strcmp(st, "string")) { vartype = FST_VT_GEN_STRING; } else if(!strcmp(st, "shortint")) { vartype = FST_VT_SV_SHORTINT; } else if(!strcmp(st, "shortreal")) { vartype = FST_VT_SV_SHORTREAL; } else if(!strcmp(st, "sparray")) { vartype = FST_VT_VCD_SPARRAY; } break; case 't': if(!strcmp(st, "time")) { vartype = FST_VT_VCD_TIME; } else if(!strcmp(st, "tri")) { vartype = FST_VT_VCD_TRI; } else if(!strcmp(st, "triand")) { vartype = FST_VT_VCD_TRIAND; } else if(!strcmp(st, "trior")) { vartype = FST_VT_VCD_TRIOR; } else if(!strcmp(st, "trireg")) { vartype = FST_VT_VCD_TRIREG; } else if(!strcmp(st, "tri0")) { vartype = FST_VT_VCD_TRI0; } else if(!strcmp(st, "tri1")) { vartype = FST_VT_VCD_TRI1; } break; default: break; } st = strtok(NULL, " \t"); len = atoi(st); switch(vartype) { case FST_VT_VCD_PORT: if(*st == '[') /* VCS extension, so reparse */ { int p_hi = atoi(st+1); int p_lo = p_hi; char *p_colon = strchr(st+1, ':'); if(p_colon) { p_lo = atoi(p_colon+1); } if(p_hi > p_lo) { len = p_hi - p_lo + 1; } else { len = p_lo - p_hi + 1; } } len = (len * 3) + 2; break; case FST_VT_GEN_STRING: len = 0; break; case FST_VT_VCD_EVENT: len = (len != 0) ? len : 1; break; default: if(len == 0) { len = 1; } break; } st = strtok(NULL, " \t"); /* vcdid */ hash = vcdid_hash(st, strlen(st)); if(hash == (hash_max+1)) { hash_max = hash; } else if((hash>0)&&(hash<=hash_max)) { /* general case with aliases */ } else { hash_kill = 1; } nam = strtok(NULL, " \t"); /* name */ st = strtok(NULL, " \t"); /* $end */ if(st) { if(strncmp(st, "$end", 4)) { *(st-1) = ' '; } node = jrb_find_int(vcd_ids, hash); if(!node) { Jval val; returnedhandle = fstWriterCreateVar(ctx, vartype, !var_direction ? FST_VD_IMPLICIT : var_direction[var_direction_idx++], len, nam, 0); val.i = returnedhandle; jrb_insert_int(vcd_ids, hash, val)->val2.i = len; } else { fstWriterCreateVar(ctx, vartype, !var_direction ? FST_VD_IMPLICIT : var_direction[var_direction_idx++], node->val2.i, nam, node->val.i); } #if defined(VCD2FST_EXTLOAD_CONV) if(var_direction) { if(var_direction_idx == numfacs) { free(var_direction); var_direction = NULL; } } #endif } } else if(!strncmp(buf1, "scope", 5)) { char *st = strtok(buf+6, " \t"); enum fstScopeType scopetype = FST_ST_VCD_MODULE; switch(st[0]) { case 'm': if(!strcmp(st, "module")) { } break; case 't': if(!strcmp(st, "task")) { scopetype = FST_ST_VCD_TASK; } break; case 'f': if(!strcmp(st, "function")) { scopetype = FST_ST_VCD_FUNCTION; } else if(!strcmp(st, "fork")) { scopetype = FST_ST_VCD_FORK; } break; case 'b': if(!strcmp(st, "begin")) { scopetype = FST_ST_VCD_BEGIN; } break; case 'g': if(!strcmp(st, "generate")) { scopetype = FST_ST_VCD_GENERATE; } break; case 's': if(!strcmp(st, "struct")) { scopetype = FST_ST_VCD_STRUCT; } break; case 'u': if(!strcmp(st, "union")) { scopetype = FST_ST_VCD_UNION; } break; case 'c': if(!strcmp(st, "class")) { scopetype = FST_ST_VCD_CLASS; } break; case 'i': if(!strcmp(st, "interface")) { scopetype = FST_ST_VCD_INTERFACE; } break; case 'p': if(!strcmp(st, "package")) { scopetype = FST_ST_VCD_PACKAGE; } else if(!strcmp(st, "program")) { scopetype = FST_ST_VCD_PROGRAM; } break; case 'v': if(!strcmp(st, "vhdl_architecture")) { scopetype = FST_ST_VHDL_ARCHITECTURE; } else if(!strcmp(st, "vhdl_procedure")) { scopetype = FST_ST_VHDL_PROCEDURE; } else if(!strcmp(st, "vhdl_function")) { scopetype = FST_ST_VHDL_FUNCTION; } else if(!strcmp(st, "vhdl_record")) { scopetype = FST_ST_VHDL_RECORD; } else if(!strcmp(st, "vhdl_process")) { scopetype = FST_ST_VHDL_PROCESS; } else if(!strcmp(st, "vhdl_block")) { scopetype = FST_ST_VHDL_BLOCK; } else if(!strcmp(st, "vhdl_for_generate")) { scopetype = FST_ST_VHDL_FOR_GENERATE; } else if(!strcmp(st, "vhdl_if_generate")) { scopetype = FST_ST_VHDL_IF_GENERATE; } else if(!strcmp(st, "vhdl_generate")) { scopetype = FST_ST_VHDL_GENERATE; } break; default: break; } st = strtok(NULL, " \t"); #if defined(VCD2FST_EXTLOAD_CONV) #ifdef _WAVE_HAVE_JUDY if(PJArray) { const char *fst_scope_name2 = fstReaderPushScope(xc, st, NULL); PPvoid_t PPValue = JudySLGet(PJArray, (uint8_t *)fst_scope_name2, PJE0); if(PPValue) { unsigned char st_replace = (*((unsigned char *)*PPValue)) - 1; if(st_replace != FST_ST_VCD_MODULE) { scopetype = st_replace; } if((scopetype == FST_ST_VCD_GENERATE)||(scopetype == FST_ST_VCD_STRUCT)) { PPValue = NULL; } fstWriterSetScope(ctx, scopetype, st, PPValue ? ((char *)(*PPValue)+1) : NULL); } else { fstWriterSetScope(ctx, scopetype, st, NULL); } } #else if(comp_name_jrb) { const char *fst_scope_name2 = fstReaderPushScope(xc, st, NULL); char cstring[65537]; JRB str; strcpy(cstring, fst_scope_name2); str = jrb_find_str(comp_name_jrb, cstring); if(str) { unsigned char st_replace = str->val.s[0] - 1; if(st_replace != FST_ST_VCD_MODULE) { scopetype = st_replace; } if((scopetype == FST_ST_VCD_GENERATE)||(scopetype == FST_ST_VCD_STRUCT)) { str = NULL; } fstWriterSetScope(ctx, scopetype, st, str ? (str->val.s+1) : NULL); } else { fstWriterSetScope(ctx, scopetype, st, NULL); } } #endif else #endif { fstWriterSetScope(ctx, scopetype, st, NULL); } } else if(!strncmp(buf1, "upscope", 7)) { fstWriterSetUpscope(ctx); #if defined(VCD2FST_EXTLOAD_CONV) if(xc) { fstReaderPopScope(xc); } #endif } else if(!strncmp(buf1, "endd", 4)) { #if defined(VCD2FST_EXTLOAD_CONV) #ifdef _WAVE_HAVE_JUDY if(PJArray) #else if(comp_name_jrb) #endif { dealloc_scope(); } #endif if(port_encountered && (!compression_explicitly_set) && (pack_type == FST_WR_PT_LZ4)) /* EVCD data compresses far better with fastlz, so use if not directed explicitly */ { fstWriterSetPackType(ctx, (pack_type = FST_WR_PT_FASTLZ)); } break; } else if(!strncmp(buf1, "timezero", 8)) { char *pnt; int64_t tzero = 0; if((pnt = strstr(buf, "$end"))) { *pnt = 0; sscanf(buf+10, "%"SCNd64, &tzero); } else { ss = getline_replace(&wbuf, &buf, &glen, f); if(!ss) { break; } line++; sscanf(buf, "%"SCNd64, &tzero); } fstWriterSetTimezero(ctx, tzero); } else if(!strncmp(buf1, "timescale", 9)) { char *pnt; char *num = NULL; int exp = -9; int tv = 1; if((pnt = strstr(buf, "$end"))) { *pnt = 0; num = strchr(buf, '1'); if(!num) { num = strchr(buf, '0'); /* verilator */ if(num) { *num = '1'; } } } if(!num) { ss = getline_replace(&wbuf, &buf, &glen, f); if(!ss) { break; } line++; num = buf; } pnt = num; while(*pnt) { int mat = 0; switch(*pnt) { case 'm': exp = -3; mat = 1; break; case 'u': exp = -6; mat = 1; break; case 'n': exp = -9; mat = 1; break; case 'p': exp = -12; mat = 1; break; case 'f': exp = -15; mat = 1; break; case 'a': exp = -18; mat = 1; break; case 'z': exp = -21; mat = 1; break; case 's': exp = 0; mat = 1; break; default: break; } if(mat) break; pnt++; } tv = atoi(num); if(tv == 10) { exp++; } else if(tv == 100) { exp+=2; } fstWriterSetTimescale(ctx, exp); } else if(!strncmp(buf1, "date", 4)) { char *pnt, *rsp; int found = 0; if((pnt = strstr(buf, "$end"))) { *pnt = 0; pnt = buf + 5; while(*pnt && ((*pnt)==' ')) { pnt++; } while((rsp = strrchr(pnt, ' '))) { if(*(rsp+1) == 0) { *rsp = 0; } else { break; } } if(strlen(pnt)) { found = 1; } } else { pnt = buf + 5; while(*pnt && ((*pnt)==' ')) { pnt++; } while((rsp = strrchr(pnt, ' '))) { if(*(rsp+1) == 0) { *rsp = 0; } else { break; } } if(strlen(pnt) > 3) { found = 1; } } if(!found) { ss = getline_replace(&wbuf, &buf, &glen, f); if(!ss) { break; } line++; pnt = buf; } while(*pnt == '\t') pnt++; fstWriterSetDate(ctx, pnt); } else if((!strncmp(buf1, "version", 7)) || (!strncmp(buf1, "comment", 7))) { char *pnt, *crpnt, *rsp; int is_version = (buf[1] == 'v'); if((pnt = strstr(buf, "$end"))) { *pnt = 0; pnt = buf+8; while(*pnt && ((*pnt)==' ')) { pnt++; } while((rsp = strrchr(pnt, ' '))) { if(*(rsp+1) == 0) { *rsp = 0; } else { break; } } } else { ss = getline_replace(&wbuf, &buf, &glen, f); if(!ss) { break; } line++; pnt = buf; } while(*pnt == '\t') pnt++; crpnt = strchr(pnt, '\n'); if(crpnt) *crpnt = 0; crpnt = strchr(pnt, '\r'); if(crpnt) *crpnt = 0; if(is_version) { fstWriterSetVersion(ctx, pnt); } else { fstWriterSetComment(ctx, pnt); } } } if((!hash_kill) && (vcd_ids)) { unsigned int hash; node_len_array = calloc(hash_max + 1, sizeof(int)); for(hash=1;hash<=hash_max;hash++) { node = jrb_find_int(vcd_ids, hash); if(node) { node_len_array[hash] = node->val2.i; } else { node_len_array[hash] = 1; /* should never happen */ } } jrb_free_tree(vcd_ids); vcd_ids = NULL; } else { hash_kill = 1; /* scan-build */ } for(;;) /* was while(!feof(f)) */ { unsigned int hash; uint64_t tim; char *nl, *sp; double doub; ss = getline_replace(&wbuf, &buf, &glen, f); if(!ss) { break; } nl = buf; while(*nl) { if((*nl == '\n') || (*nl == '\r')) { *nl = 0; break; } nl++; } switch(buf[0]) { case '0': case '1': case 'x': case 'z': hash = vcdid_hash(buf+1, nl - (buf+1)); if(!hash_kill) { fstWriterEmitValueChange(ctx, hash, buf); } else { node = jrb_find_int(vcd_ids, hash); if(node) { fstWriterEmitValueChange(ctx, node->val.i, buf); } else { } } break; case 'b': { /* this block replaces the single statement sp = strchr(buf, ' '); */ /* as the odds are the VCD ID will be small compared to the vector length */ char *sp_scan = nl; sp = NULL; /* if(buf != sp_scan) [can't happen or switch() wouldn't get here] */ { while(buf != --sp_scan) { if(*sp_scan == ' ') { sp = sp_scan; break; } } } } if(!sp) break; *sp = 0; hash = vcdid_hash(sp+1, nl - (sp+1)); if(!hash_kill) { int bin_len = sp - (buf + 1); /* strlen(buf+1) */ int node_len = node_len_array[hash]; if(bin_len >= node_len) { fstWriterEmitValueChange(ctx, hash, buf+1); } else { int delta = node_len - bin_len; if(node_len >= bin_fixbuff_len) { bin_fixbuff_len = node_len + 1; bin_fixbuff = realloc_2(bin_fixbuff, bin_fixbuff_len); } memset(bin_fixbuff, buf[1] != '1' ? buf[1] : '0', delta); memcpy(bin_fixbuff + delta, buf+1, bin_len); fstWriterEmitValueChange(ctx, hash, bin_fixbuff); } } else { node = jrb_find_int(vcd_ids, hash); if(node) { int bin_len = sp - (buf + 1); /* strlen(buf+1) */ int node_len = node->val2.i; if(bin_len >= node_len) { fstWriterEmitValueChange(ctx, node->val.i, buf+1); } else { int delta = node_len - bin_len; if(node_len >= bin_fixbuff_len) { bin_fixbuff_len = node_len + 1; bin_fixbuff = realloc_2(bin_fixbuff, bin_fixbuff_len); } memset(bin_fixbuff, buf[1] != '1' ? buf[1] : '0', delta); memcpy(bin_fixbuff + delta, buf+1, bin_len); fstWriterEmitValueChange(ctx, node->val.i, bin_fixbuff); } } else { } } break; case 's': sp = strchr(buf, ' '); if(!sp) break; *sp = 0; hash = vcdid_hash(sp+1, nl - (sp+1)); if(!hash_kill) { int bin_len = sp - (buf + 1); /* strlen(buf+1) */ bin_len = fstUtilityEscToBin(NULL, (unsigned char *)(buf+1), bin_len); fstWriterEmitVariableLengthValueChange(ctx, hash, buf+1, bin_len); } else { node = jrb_find_int(vcd_ids, hash); if(node) { int bin_len = sp - (buf + 1); /* strlen(buf+1) */ bin_len = fstUtilityEscToBin(NULL, (unsigned char *)(buf+1), bin_len); fstWriterEmitVariableLengthValueChange(ctx, node->val.i, buf+1, bin_len); } else { } } break; case 'p': { char *src = buf+1; char *pnt; int pchar = 0; int p_len = strlen(src); if(p_len >= bin_fixbuff_len) { bin_fixbuff_len = p_len + 1; bin_fixbuff = realloc_2(bin_fixbuff, bin_fixbuff_len); } pnt = bin_fixbuff; for(;;) { if(!*src) break; if(isspace((int)(unsigned char)*src)) { if(pchar != ' ') { *(pnt++) = pchar = ' '; } src++; continue; } *(pnt++) = pchar = *(src++); } *pnt = 0; sp = strchr(bin_fixbuff, ' '); if(!sp) break; sp = strchr(sp+1, ' '); if(!sp) break; sp = strchr(sp+1, ' '); if(!sp) break; *sp = 0; hash = vcdid_hash(sp+1, strlen(sp+1)); /* nl is no longer good here */ if(!hash_kill) { fstWriterEmitValueChange(ctx, hash, bin_fixbuff); } else { node = jrb_find_int(vcd_ids, hash); if(node) { fstWriterEmitValueChange(ctx, node->val.i, bin_fixbuff); } else { } } } break; case 'r': sp = strchr(buf, ' '); if(!sp) break; hash = vcdid_hash(sp+1, nl - (sp+1)); if(!hash_kill) { sscanf(buf+1,"%lg",&doub); fstWriterEmitValueChange(ctx, hash, &doub); } else { node = jrb_find_int(vcd_ids, hash); if(node) { sscanf(buf+1,"%lg",&doub); fstWriterEmitValueChange(ctx, node->val.i, &doub); } else { } } break; case 'h': /* same as 01xz above but moved down here as it's less common */ case 'u': case 'w': case 'l': case '-': hash = vcdid_hash(buf+1, nl - (buf+1)); if(!hash_kill) { fstWriterEmitValueChange(ctx, hash, buf); } else { node = jrb_find_int(vcd_ids, hash); if(node) { fstWriterEmitValueChange(ctx, node->val.i, buf); } else { } } break; case '#': tim = atoi_2((unsigned char *)(buf+1)); if((tim >= prev_tim)||(!prev_tim)) { prev_tim = tim; fstWriterEmitTimeChange(ctx, tim); } break; default: if(!strncmp(buf, "$dumpon", 7)) { fstWriterEmitDumpActive(ctx, 1); } else if(!strncmp(buf, "$dumpoff", 8)) { fstWriterEmitDumpActive(ctx, 0); } else if(!strncmp(buf, "$dumpvars", 9)) { /* nothing */ } else { /* printf("FST '%s'\n", buf); */ } break; } } fstWriterClose(ctx); #if defined(VCD2FST_EXTLOAD_CONV) if(xc) { fstReaderClose(xc); } #endif if(vcd_ids) { jrb_free_tree(vcd_ids); vcd_ids = NULL; } free(bin_fixbuff); bin_fixbuff = NULL; free(wbuf); wbuf = NULL; free(node_len_array); node_len_array = NULL; if(f != stdin) { if(is_popen) { pclose(f); } else { fclose(f); } } return(0); } void print_help(char *nam) { #ifdef VCD2FST_EXTLOADERS_CONV int slen; char *ucase_ext = calloc(1, 1024); int i; ucase_ext[0] = 0; #if defined(VCD2FST_EXTLOAD_CONV) strcat(ucase_ext, "/"); strcat(ucase_ext, EXTLOAD_SUFFIX); #endif #if defined(VCD2FST_EXT2LOAD_CONV) strcat(ucase_ext, "/"); strcat(ucase_ext, EXT2LOAD_SUFFIX); #endif #if defined(VCD2FST_EXT3LOAD_CONV) strcat(ucase_ext, "/"); strcat(ucase_ext, EXT3LOAD_SUFFIX); #endif slen = strlen(ucase_ext); for(i=0;i.\n",nam #ifdef VCD2FST_EXTLOADERS_CONV ,ucase_ext #endif ); #else printf( "Usage: %s [OPTION]... [VCDFILE] [FSTFILE]\n\n" #ifdef VCD2FST_EXTLOADERS_CONV " -v FILE specify VCD%s input filename\n" #else " -v FILE specify VCD input filename\n" #endif " -f FILE specify FST output filename\n" " -4 use lz4 algorithm for speed (default)\n" " -F use fastlz algorithm for speed\n" " -Z use zlib algorithm for size\n" " -c zlib compress entire file on close\n" " -p enable parallel mode\n" " -h display this help then exit\n\n" "Note that VCDFILE and FSTFILE are optional provided the\n" "--vcdname and --fstname options are specified.\n\n" "Report bugs to <"PACKAGE_BUGREPORT">.\n",nam #ifdef VCD2FST_EXTLOADERS_CONV ,ucase_ext #endif ); #endif #ifdef VCD2FST_EXTLOADERS_CONV free(ucase_ext); #endif exit(0); } int main(int argc, char **argv) { char opt_errors_encountered=0; char *vname=NULL, *lxname=NULL; int c; WAVE_LOCALE_FIX while (1) { #ifdef __linux__ int option_index = 0; static struct option long_options[] = { {"vcdname", 1, 0, 'v'}, {"fstname", 1, 0, 'f'}, {"fastpack", 0, 0, 'F'}, {"fourpack", 0, 0, '4'}, {"zlibpack", 0, 0, 'Z'}, {"compress", 0, 0, 'c'}, {"parallel", 0, 0, 'p'}, {"help", 0, 0, 'h'}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "v:f:ZF4cph", long_options, &option_index); #else c = getopt (argc, argv, "v:f:ZF4cph"); #endif if (c == -1) break; /* no more args */ switch (c) { case 'v': if(vname) free(vname); vname = malloc(strlen(optarg)+1); strcpy(vname, optarg); break; case 'f': if(lxname) free(lxname); lxname = malloc(strlen(optarg)+1); strcpy(lxname, optarg); break; case 'Z': compression_explicitly_set = 1; pack_type = FST_WR_PT_ZLIB; break; case 'F': compression_explicitly_set = 1; pack_type = FST_WR_PT_FASTLZ; break; case '4': compression_explicitly_set = 1; pack_type = FST_WR_PT_LZ4; break; case 'c': repack_all = 1; break; case 'p': parallel_mode = 1; break; case 'h': print_help(argv[0]); break; case '?': opt_errors_encountered=1; break; default: /* unreachable */ break; } } if(opt_errors_encountered) { print_help(argv[0]); } if (optind < argc) { while (optind < argc) { if(!vname) { vname = malloc(strlen(argv[optind])+1); strcpy(vname, argv[optind++]); } else if(!lxname) { lxname = malloc(strlen(argv[optind])+1); strcpy(lxname, argv[optind++]); } else { break; } } } if((!vname)||(!lxname)) { print_help(argv[0]); } fst_main(vname, lxname); free(vname); free(lxname); return(0); } gtkwave-3.3.86/src/helpers/fst2vcd.c0000664000175000017500000001163713166335473016564 0ustar bybellbybell/* * Copyright (c) 2003-2013 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include "fst/fstapi.h" #if HAVE_GETOPT_H #include #endif #include "wave_locale.h" #define FST_VCD_WRITE_BUF_SIZ (2 * 1024 * 1024) void print_help(char *nam) { #ifdef __linux__ printf( "Usage: %s [OPTION]... [FSTFILE]\n\n" " -f, --fstname=FILE specify FST input filename\n" " -o, --output=FILE specify output filename\n" " -e, --extensions emit FST extensions to VCD\n" " -h, --help display this help then exit\n\n" "VCD is emitted to stdout if output filename is unspecified.\n\n" "Report bugs to <"PACKAGE_BUGREPORT">.\n",nam); #else printf( "Usage: %s [OPTION]... [FSTFILE]\n\n" " -f specify FST input filename\n" " -o specify output filename\n" " -e emit FST extensions to VCD\n" " -h display this help then exit\n\n" "VCD is emitted to stdout if output filename is unspecified.\n\n" "Report bugs to <"PACKAGE_BUGREPORT">.\n",nam); #endif exit(0); } int main(int argc, char **argv) { char opt_errors_encountered=0; char *fstname=NULL; char *outname=NULL; char *fvbuf=NULL; int c; struct fstReaderContext *xc; FILE *fv; int use_extensions = 0; WAVE_LOCALE_FIX while (1) { #ifdef __linux__ int option_index = 0; static struct option long_options[] = { {"extensions", 0, 0, 'e'}, {"fstname", 1, 0, 'f'}, {"output", 1, 0, 'o'}, {"help", 0, 0, 'h'}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "ef:o:h", long_options, &option_index); #else c = getopt (argc, argv, "ef:o:h"); #endif if (c == -1) break; /* no more args */ switch (c) { case 'e': use_extensions = 1; break; case 'f': if(fstname) free(fstname); fstname = malloc(strlen(optarg)+1); strcpy(fstname, optarg); break; case 'o': if(outname) free(outname); outname = malloc(strlen(optarg)+1); strcpy(outname, optarg); break; case 'h': print_help(argv[0]); break; case '?': opt_errors_encountered=1; break; default: /* unreachable */ break; } } if(opt_errors_encountered) { print_help(argv[0]); } if (optind < argc) { while (optind < argc) { if(!fstname) { fstname = malloc(strlen(argv[optind])+1); strcpy(fstname, argv[optind++]); } else { break; } } } if(!fstname) { print_help(argv[0]); } xc = fstReaderOpen(fstname); if(!xc) { fprintf(stderr, "Could not open '%s', exiting.\n", fstname); exit(255); } if(outname) { fv = fopen(outname, "wb"); if(!fv) { fprintf(stderr, "Could not open '%s', exiting.\n", outname); perror("Why"); exit(255); } fvbuf = malloc(FST_VCD_WRITE_BUF_SIZ); setvbuf(fv, fvbuf, _IOFBF, FST_VCD_WRITE_BUF_SIZ); } else { fv = stdout; } fstReaderSetVcdExtensions(xc, use_extensions); /* TRUE is incompatible with vfast and other tools */ if(!fstReaderProcessHier(xc, fv)) /* these 3 lines do all the VCD writing work */ { fprintf(stderr, "could not process hierarchy for '%s', exiting.\n", fstname); exit(255); } fstReaderSetFacProcessMaskAll(xc); /* these 3 lines do all the VCD writing work */ fstReaderIterBlocks(xc, NULL, NULL, fv); /* these 3 lines do all the VCD writing work */ fstReaderClose(xc); if(outname) { free(outname); fclose(fv); } free(fvbuf); free(fstname); exit(0); } gtkwave-3.3.86/src/helpers/vzt_read.c0000664000175000017500000015331713166335473017031 0ustar bybellbybell/* * Copyright (c) 2003-2016 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #if defined(__CYGWIN__) || defined(__MINGW32__) #undef HAVE_RPC_XDR_H #endif #if HAVE_RPC_XDR_H #include #include #endif #include "vzt_read.h" #ifdef HAVE_FCNTL_H #include #endif /****************************************************************************/ static int is_big_endian(void) { union { vztint32_t u32; unsigned char c[sizeof(vztint32_t)]; } u; u.u32 = 1; return(u.c[sizeof(vztint32_t)-1] == 1); } /****************************************************************************/ struct vzt_ncycle_autosort { struct vzt_ncycle_autosort *next; }; struct vzt_pth_args { struct vzt_rd_trace *lt; struct vzt_rd_block *b; }; struct vzt_synvec_chain { vztint32_t num_entries; vztint32_t chain[1]; }; #ifdef PTHREAD_CREATE_DETACHED _VZT_RD_INLINE static int vzt_rd_pthread_mutex_init(struct vzt_rd_trace *lt, pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr) { if(lt->pthreads) { pthread_mutex_init(mutex, mutexattr); } return(0); } _VZT_RD_INLINE static void vzt_rd_pthread_mutex_lock(struct vzt_rd_trace *lt, pthread_mutex_t *mx) { if(lt->pthreads) { pthread_mutex_lock(mx); } } _VZT_RD_INLINE static void vzt_rd_pthread_mutex_unlock(struct vzt_rd_trace *lt, pthread_mutex_t *mx) { if(lt->pthreads) { pthread_mutex_unlock(mx); } } _VZT_RD_INLINE static void vzt_rd_pthread_mutex_destroy(struct vzt_rd_trace *lt, pthread_mutex_t *mutex) { if(lt->pthreads) { pthread_mutex_destroy(mutex); } } _VZT_RD_INLINE static void vzt_rd_pthread_create(struct vzt_rd_trace *lt, pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg) { if(lt->pthreads) { pthread_attr_init(attr); pthread_attr_setdetachstate(attr, PTHREAD_CREATE_DETACHED); pthread_create(thread, attr, start_routine, arg); } } #else #define vzt_rd_pthread_mutex_init(a, b, c) #define vzt_rd_pthread_mutex_lock(a, b) #define vzt_rd_pthread_mutex_unlock(a, b) #define vzt_rd_pthread_mutex_destroy(a, b) #define vzt_rd_pthread_create(a, b, c, d, e) #endif /****************************************************************************/ #ifdef _WAVE_BE32 /* * reconstruct 8/16/32/64 bits out of the vzt's representation * of a big-endian integer. this is for 32-bit PPC so no byte * swizzling needs to be done at all. */ #define vzt_rd_get_byte(mm,offset) ((unsigned int)(*((unsigned char *)(mm)+(offset)))) #define vzt_rd_get_16(mm,offset) ((unsigned int)(*((unsigned short *)(((unsigned char *)(mm))+(offset))))) #define vzt_rd_get_32(mm,offset) (*(unsigned int *)(((unsigned char *)(mm))+(offset))) #define vzt_rd_get_64(mm,offset) ((((vztint64_t)vzt_rd_get_32((mm),(offset)))<<32)|((vztint64_t)vzt_rd_get_32((mm),(offset)+4))) #else /* * reconstruct 8/16/24/32 bits out of the vzt's representation * of a big-endian integer. this should work on all architectures. */ #define vzt_rd_get_byte(mm,offset) ((unsigned int)(*((unsigned char *)(mm)+(offset)))) static unsigned int vzt_rd_get_16(void *mm, int offset) { unsigned char *nn=(unsigned char *)mm+offset; unsigned int m1=*((unsigned char *)(nn++)); unsigned int m2=*((unsigned char *)nn); return((m1<<8)|m2); } static unsigned int vzt_rd_get_32(void *mm, int offset) { unsigned char *nn=(unsigned char *)mm+offset; unsigned int m1=*((unsigned char *)(nn++)); unsigned int m2=*((unsigned char *)(nn++)); unsigned int m3=*((unsigned char *)(nn++)); unsigned int m4=*((unsigned char *)nn); return((m1<<24)|(m2<<16)|(m3<<8)|m4); } static vztint64_t vzt_rd_get_64(void *mm, int offset) { return( (((vztint64_t)vzt_rd_get_32(mm,offset))<<32) |((vztint64_t)vzt_rd_get_32(mm,offset+4)) ); } #endif static unsigned int vzt_rd_get_32r(void *mm, int offset) { unsigned char *nn=(unsigned char *)mm+offset; unsigned int m4=*((unsigned char *)(nn++)); unsigned int m3=*((unsigned char *)(nn++)); unsigned int m2=*((unsigned char *)(nn++)); unsigned int m1=*((unsigned char *)nn); return((m1<<24)|(m2<<16)|(m3<<8)|m4); } static vztint32_t vzt_rd_get_v32(char **mmx) { signed char *c; signed char *beg; vztint32_t val; signed char **mm = (signed char **)mmx; c = *mm; beg = c; if(*c>=0) { while(*c>=0) c++; *mm = c+1; val = (vztint32_t)(*c&0x7f); do { val <<= 7; val |= (vztint32_t)*(--c); } while (c!=beg); } else { *mm = c+1; val = (vztint32_t)(*c&0x7f); } return(val); } static vztint64_t vzt_rd_get_v64(char **mmx) { signed char *c; signed char *beg; vztint64_t val; signed char **mm = (signed char **)mmx; c = *mm; beg = c; if(*c>=0) { while(*c>=0) c++; *mm = c+1; val = (vztint64_t)(*c&0x7f); do { val <<= 7; val |= (vztint64_t)*(--c); } while (c!=beg); } else { val = (vztint64_t)(*c&0x7f); *mm = c+1; } return(val); } #if 0 _VZT_RD_INLINE static vztint32_t vzt_rd_get_v32_rvs(signed char **mm) { signed char *c = *mm; vztint32_t val; val = (vztint32_t)(*(c--)&0x7f); while(*c>=0) { val <<= 7; val |= (vztint32_t)*(c--); } *mm = c; return(val); } #endif /****************************************************************************/ /* * fast SWAR ones count for 32 bits */ _VZT_RD_INLINE static vztint32_t vzt_rd_ones_cnt(vztint32_t x) { x -= ((x >> 1) & 0x55555555); x = (((x >> 2) & 0x33333333) + (x & 0x33333333)); x = (((x >> 4) + x) & 0x0f0f0f0f); return((x * 0x01010101) >> 24); } /* * total zero count to the right of the first rightmost one bit * encountered. its intended use is to * "return the bitposition of the least significant 1 in vztint32_t" * (use x &= ~(x&-x) to clear out that bit quickly) */ _VZT_RD_INLINE static vztint32_t vzt_rd_tzc(vztint32_t x) { return (vzt_rd_ones_cnt((x & -x) - 1)); } /****************************************************************************/ /* * i2c utility function */ unsigned int vzt_rd_expand_bits_to_integer(int len, char *s) { unsigned int v = 0; int i; for(i=0;imutex); if((!b->times)&&(b->mem)) { vztint64_t *times=NULL; vztint32_t *change_dict=NULL; vztint32_t *val_dict=NULL; unsigned int num_time_ticks, num_sections, num_dict_entries; char *pnt = b->mem; vztint32_t i, j, m, num_dict_words; /* vztint32_t *block_end = (vztint32_t *)(pnt + b->uncompressed_siz); */ vztint32_t *val_tmp; unsigned int num_bitplanes; uintptr_t padskip; num_time_ticks = vzt_rd_get_v32(&pnt); /* fprintf(stderr, "* num_time_ticks = %d\n", num_time_ticks); */ if(num_time_ticks != 0) { vztint64_t cur_time; times = malloc(num_time_ticks * sizeof(vztint64_t)); times[0] = cur_time = vzt_rd_get_v64(&pnt); for(i=1;istart; num_time_ticks = b->end - b->start + 1; times = malloc(num_time_ticks * sizeof(vztint64_t)); for(i=0;irle) { vztint32_t *curr_dec_dict; vztint32_t first_bit = 0, curr_bit = 0; vztint32_t runlen; val_dict = calloc(1, b->num_rle_bytes = (num_dict_words = num_sections * num_dict_entries) * sizeof(vztint32_t)); curr_dec_dict = val_dict; vzt_rd_pthread_mutex_lock(lt, <->mutex); lt->block_mem_consumed += b->num_rle_bytes; vzt_rd_pthread_mutex_unlock(lt, <->mutex); for(i=0;imulti_state = (num_bitplanes > 1); padskip = ((uintptr_t)pnt)&3; pnt += (padskip) ? 4-padskip : 0; /* skip pad to next 4 byte boundary */ b->vindex = (vztint32_t *)(pnt); if(is_big_endian()) /* have to bswap the value changes on big endian machines... */ { if(!b->rle) { for(i=0;ivindex; for(i=0;itotal_values;j++) { *val_tmp = vzt_rd_get_32r(val_tmp, 0); val_tmp++; } } } pnt = (char *)(b->vindex + num_bitplanes * lt->total_values); b->num_str_entries = vzt_rd_get_v32(&pnt); if(b->num_str_entries) { b->sindex = calloc(b->num_str_entries, sizeof(char *)); for(i=0;inum_str_entries;i++) { b->sindex[i] = pnt; pnt += (strlen(pnt) + 1); } } num_dict_words = (num_sections * num_dict_entries) * sizeof(vztint32_t); change_dict = malloc(num_dict_words ? num_dict_words : sizeof(vztint32_t)); /* scan-build */ m = 0; for(i=0;i> 31; } } b->val_dict = val_dict; b->change_dict = change_dict; b->times = times; b->num_time_ticks = num_time_ticks; b->num_dict_entries = num_dict_entries; b->num_sections = num_sections; } vzt_rd_pthread_mutex_unlock(lt, &b->mutex); } static int vzt_rd_block_vch_free(struct vzt_rd_trace *lt, struct vzt_rd_block *b, int killed) { vzt_rd_pthread_mutex_lock(lt, &b->mutex); if(killed) b->killed = killed; /* never allocate ever again (in case we prefetch on process kill) */ if((b->rle) && (b->val_dict)) { free(b->val_dict); b->val_dict = NULL; vzt_rd_pthread_mutex_lock(lt, <->mutex); lt->block_mem_consumed -= b->num_rle_bytes; vzt_rd_pthread_mutex_unlock(lt, <->mutex); } if(b->mem) { free(b->mem); b->mem = NULL; } if(b->change_dict) { free(b->change_dict); b->change_dict = NULL; } if(b->times) { free(b->times); b->times = NULL; } if(b->sindex) { free(b->sindex); b->sindex = NULL; } vzt_rd_pthread_mutex_unlock(lt, &b->mutex); return(1); } vztint32_t vzt_rd_next_value_chg_time(struct vzt_rd_trace *lt, struct vzt_rd_block *b, vztint32_t time_offset, vztint32_t facidx) { unsigned int i; vztint32_t len = lt->len[facidx]; vztint32_t vindex_offset = lt->vindex_offset[facidx]; vztint32_t vindex_offset_x = vindex_offset + lt->total_values; vztint32_t old_time_offset = time_offset; int word = time_offset / 32; int bit = (time_offset & 31) + 1; int row_size = b->num_sections; vztint32_t *valpnt, *valpnt_x; vztint32_t change_msk; if((time_offset>=(b->num_time_ticks-1))||(facidx>lt->numrealfacs)) return(time_offset); time_offset &= ~31; for(;wordflags[facidx]&VZT_RD_SYM_F_SYNVEC)) { if(b->multi_state) { for(i=0;ichange_dict + (b->vindex[vindex_offset+i] * row_size + word); valpnt_x = b->change_dict + (b->vindex[vindex_offset_x+i] * row_size + word); change_msk |= *valpnt; change_msk |= *valpnt_x; } } else { for(i=0;ichange_dict + (b->vindex[vindex_offset+i] * row_size + word); change_msk |= *valpnt; } } } else { if(b->multi_state) { for(i=0;i=lt->numfacs) break; vindex_offset = lt->vindex_offset[facidx+i]; vindex_offset_x = vindex_offset + lt->total_values; valpnt = b->change_dict + (b->vindex[vindex_offset] * row_size + word); valpnt_x = b->change_dict + (b->vindex[vindex_offset_x] * row_size + word); change_msk |= *valpnt; change_msk |= *valpnt_x; } } else { for(i=0;i=lt->numfacs) break; vindex_offset = lt->vindex_offset[facidx+i]; valpnt = b->change_dict + (b->vindex[vindex_offset] * row_size + word); change_msk |= *valpnt; } } } change_msk >>= bit; if(change_msk) { return( (change_msk & 1 ? 0 : vzt_rd_tzc(change_msk)) + time_offset + bit ); } } time_offset += 32; bit = 0; } return(old_time_offset); } int vzt_rd_fac_value(struct vzt_rd_trace *lt, struct vzt_rd_block *b, vztint32_t time_offset, vztint32_t facidx, char *value) { vztint32_t len = lt->len[facidx]; unsigned int i; int word = time_offset / 32; int bit = time_offset & 31; int row_size = b->num_sections; vztint32_t *valpnt; vztint32_t *val_base; if((time_offset>b->num_time_ticks)||(facidx>lt->numrealfacs)) return(0); val_base = b->val_dict + word; if(!(lt->flags[facidx]&VZT_RD_SYM_F_SYNVEC)) { vztint32_t vindex_offset = lt->vindex_offset[facidx]; if(b->multi_state) { vztint32_t vindex_offset_x = vindex_offset + lt->total_values; vztint32_t *valpnt_x; int which; for(i=0;ivindex[vindex_offset++] * row_size); valpnt_x = val_base + (b->vindex[vindex_offset_x++] * row_size); which = (((*valpnt_x >> bit) & 1) << 1) | ((*valpnt >> bit) & 1); value[i] = "01xz"[which]; } } else { for(i=0;ivindex[vindex_offset++] * row_size); value[i] = '0' | ((*valpnt >> bit) & 1); } } } else { vztint32_t vindex_offset; if(b->multi_state) { vztint32_t vindex_offset_x; vztint32_t *valpnt_x; int which; for(i=0;i=lt->numfacs) break; vindex_offset = lt->vindex_offset[facidx+i]; vindex_offset_x = vindex_offset + lt->total_values; valpnt = val_base + (b->vindex[vindex_offset] * row_size); valpnt_x = val_base + (b->vindex[vindex_offset_x] * row_size); which = (((*valpnt_x >> bit) & 1) << 1) | ((*valpnt >> bit) & 1); value[i] = "01xz"[which]; } } else { for(i=0;i=lt->numfacs) break; vindex_offset = lt->vindex_offset[facidx+i]; valpnt = val_base + (b->vindex[vindex_offset] * row_size); value[i] = '0' | ((*valpnt >> bit) & 1); } } } value[i] = 0; return(1); } static void vzt_rd_double_xdr(char *pnt, char *buf) { int j; #if HAVE_RPC_XDR_H XDR x; #else const vztint32_t endian_matchword = 0x12345678; #endif double d; char xdrdata[8] = { 0,0,0,0,0,0,0,0 }; /* scan-build */ for(j=0;j<64;j++) { int byte = j/8; int bit = 7-(j&7); if(pnt[j]=='1') { xdrdata[byte] |= (1<value_current_sector, *pnt2=lt->value_previous_sector; char buf[32]; char *bufpnt; vzt_rd_block_vch_decode(lt, b); vzt_rd_pthread_mutex_lock(lt, &b->mutex); for(idx=0;idxnumrealfacs;idx++) { int process_idx = idx/8; int process_bit = idx&7; if(lt->process_mask[process_idx]&(1<prev)&&(!b->prev->exclude_block)) { vzt_rd_fac_value(lt, b->prev, b->prev->num_time_ticks - 1, idx, pnt2); /* get last val of prev sector */ if(strcmp(pnt, pnt2)) { goto do_vch; } } else { do_vch: if(!(lt->flags[idx] & (VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING))) { lt->value_change_callback(<, &b->times[i], &idx, &pnt); } else { if(lt->flags[idx] & VZT_RD_SYM_F_DOUBLE) { bufpnt = buf; vzt_rd_double_xdr(pnt, buf); lt->value_change_callback(<, &b->times[i], &idx, &bufpnt); } else { unsigned int spnt=vzt_rd_make_sindex(pnt); char *msg = ((!i)&(!b->prev)) ? "UNDEF" : b->sindex[spnt]; lt->value_change_callback(<, &b->times[i], &idx, &msg); } } } i2 = vzt_rd_next_value_chg_time(lt, b, i, idx); if(i==i2) break; i=i2; } } } vzt_rd_pthread_mutex_unlock(lt, &b->mutex); return(1); } /* * most clients want this */ int vzt_rd_process_block(struct vzt_rd_trace *lt, struct vzt_rd_block *b) { unsigned int i, i2; vztint32_t idx; char *pnt=lt->value_current_sector, *pnt2=lt->value_previous_sector; char buf[32]; char *bufpnt; struct vzt_ncycle_autosort **autosort; struct vzt_ncycle_autosort *deadlist=NULL; struct vzt_ncycle_autosort *autofacs= calloc(lt->numrealfacs ? lt->numrealfacs : 1, sizeof(struct vzt_ncycle_autosort)); /* fix for scan-build on lt->numrealfacs */ vzt_rd_block_vch_decode(lt, b); vzt_rd_pthread_mutex_lock(lt, &b->mutex); autosort = calloc(b->num_time_ticks, sizeof(struct vzt_ncycle_autosort *)); for(i=0;inum_time_ticks;i++) autosort[i]=NULL; deadlist=NULL; for(idx=0;idxnumrealfacs;idx++) { int process_idx = idx/8; int process_bit = idx&7; if(lt->process_mask[process_idx]&(1<prev)&&(!b->prev->exclude_block)) { vzt_rd_fac_value(lt, b->prev, b->prev->num_time_ticks - 1, idx, pnt2); /* get last val of prev sector */ if(strcmp(pnt, pnt2)) { goto do_vch_0; } } else { do_vch_0: if(!(lt->flags[idx] & (VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING))) { lt->value_change_callback(<, &b->times[i], &idx, &pnt); } else { if(lt->flags[idx] & VZT_RD_SYM_F_DOUBLE) { bufpnt = buf; vzt_rd_double_xdr(pnt, buf); lt->value_change_callback(<, &b->times[i], &idx, &bufpnt); } else { unsigned int spnt=vzt_rd_make_sindex(pnt); char *msg = ((!i)&(!b->prev)) ? "UNDEF" : b->sindex[spnt]; lt->value_change_callback(<, &b->times[i], &idx, &msg); } } } i2 = vzt_rd_next_value_chg_time(lt, b, i, idx); if(i2) { struct vzt_ncycle_autosort *t = autosort[i2]; autofacs[idx].next = t; autosort[i2] = autofacs+idx; } else { struct vzt_ncycle_autosort *t = deadlist; autofacs[idx].next = t; deadlist = autofacs+idx; } } } for(i = 1; i < b->num_time_ticks; i++) { struct vzt_ncycle_autosort *t = autosort[i]; if(t) { while(t) { struct vzt_ncycle_autosort *tn = t->next; idx = t-autofacs; vzt_rd_fac_value(lt, b, i, idx, pnt); if(!(lt->flags[idx] & (VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING))) { lt->value_change_callback(<, &b->times[i], &idx, &pnt); } else { if(lt->flags[idx] & VZT_RD_SYM_F_DOUBLE) { bufpnt = buf; vzt_rd_double_xdr(pnt, buf); lt->value_change_callback(<, &b->times[i], &idx, &bufpnt); } else { unsigned int spnt=vzt_rd_make_sindex(pnt); char *msg = ((!i)&(!b->prev)) ? "UNDEF" : b->sindex[spnt]; lt->value_change_callback(<, &b->times[i], &idx, &msg); } } i2 = vzt_rd_next_value_chg_time(lt, b, i, idx); if(i2!=i) { struct vzt_ncycle_autosort *ta = autosort[i2]; autofacs[idx].next = ta; autosort[i2] = autofacs+idx; } else { struct vzt_ncycle_autosort *ta = deadlist; autofacs[idx].next = ta; deadlist = autofacs+idx; } t = tn; } } } vzt_rd_pthread_mutex_unlock(lt, &b->mutex); free(autofacs); free(autosort); return(1); } /****************************************************************************/ /* * null callback used when a user passes NULL as an argument to vzt_rd_iter_blocks() */ void vzt_rd_null_callback(struct vzt_rd_trace **lt, vztint64_t *pnt_time, vztint32_t *pnt_facidx, char **pnt_value) { (void) lt; (void) pnt_time; (void) pnt_facidx; (void) pnt_value; /* fprintf(stderr, VZT_RDLOAD"%lld %d %s\n", *pnt_time, *pnt_facidx, *pnt_value); */ } /****************************************************************************/ /* * return number of facs in trace */ _VZT_RD_INLINE vztint32_t vzt_rd_get_num_facs(struct vzt_rd_trace *lt) { return(lt ? lt->numfacs : 0); } /* * return fac geometry for a given index */ struct vzt_rd_geometry *vzt_rd_get_fac_geometry(struct vzt_rd_trace *lt, vztint32_t facidx) { if((lt)&&(facidxnumfacs)) { lt->geometry.rows = lt->rows[facidx]; lt->geometry.msb = lt->msb[facidx]; lt->geometry.lsb = lt->lsb[facidx]; lt->geometry.flags = lt->flags[facidx]; lt->geometry.len = lt->len[facidx]; return(<->geometry); } else { return(NULL); } } /* * return partial fac geometry for a given index */ _VZT_RD_INLINE vztint32_t vzt_rd_get_fac_rows(struct vzt_rd_trace *lt, vztint32_t facidx) { if((lt)&&(facidxnumfacs)) { return(lt->rows[facidx]); } else { return(0); } } _VZT_RD_INLINE vztsint32_t vzt_rd_get_fac_msb(struct vzt_rd_trace *lt, vztint32_t facidx) { if((lt)&&(facidxnumfacs)) { return(lt->msb[facidx]); } else { return(0); } } _VZT_RD_INLINE vztsint32_t vzt_rd_get_fac_lsb(struct vzt_rd_trace *lt, vztint32_t facidx) { if((lt)&&(facidxnumfacs)) { return(lt->lsb[facidx]); } else { return(0); } } _VZT_RD_INLINE vztint32_t vzt_rd_get_fac_flags(struct vzt_rd_trace *lt, vztint32_t facidx) { if((lt)&&(facidxnumfacs)) { return(lt->flags[facidx]); } else { return(0); } } _VZT_RD_INLINE vztint32_t vzt_rd_get_fac_len(struct vzt_rd_trace *lt, vztint32_t facidx) { if((lt)&&(facidxnumfacs)) { return(lt->len[facidx]); } else { return(0); } } _VZT_RD_INLINE vztint32_t vzt_rd_get_alias_root(struct vzt_rd_trace *lt, vztint32_t facidx) { if((lt)&&(facidxnumfacs)) { while(lt->flags[facidx] & VZT_RD_SYM_F_ALIAS) { facidx = lt->rows[facidx]; /* iterate to next alias */ } return(facidx); } else { return(~((vztint32_t)0)); } } /* * time queries */ _VZT_RD_INLINE vztint64_t vzt_rd_get_start_time(struct vzt_rd_trace *lt) { return(lt ? lt->start : 0); } _VZT_RD_INLINE vztint64_t vzt_rd_get_end_time(struct vzt_rd_trace *lt) { return(lt ? lt->end : 0); } _VZT_RD_INLINE char vzt_rd_get_timescale(struct vzt_rd_trace *lt) { return(lt ? lt->timescale : 0); } _VZT_RD_INLINE vztsint64_t vzt_rd_get_timezero(struct vzt_rd_trace *lt) { return(lt ? lt->timezero : 0); } /* * extract facname from prefix-compressed table. this * performs best when extracting facs with monotonically * increasing indices... */ char *vzt_rd_get_facname(struct vzt_rd_trace *lt, vztint32_t facidx) { char *pnt; unsigned int clonecnt, j; if(lt) { if((facidx==(lt->faccache->old_facidx+1))||(!facidx)) { if(!facidx) { lt->faccache->n = lt->zfacnames; lt->faccache->bufcurr[0] = 0; lt->faccache->bufprev[0] = 0; } if(facidx!=lt->numfacs) { pnt = lt->faccache->bufcurr; lt->faccache->bufcurr = lt->faccache->bufprev; lt->faccache->bufprev = pnt; clonecnt=vzt_rd_get_16(lt->faccache->n, 0); lt->faccache->n+=2; pnt=lt->faccache->bufcurr; for(j=0;jfaccache->bufprev[j]; } while((*(pnt++)=vzt_rd_get_byte(lt->faccache->n++,0))); lt->faccache->old_facidx = facidx; return(lt->faccache->bufcurr); } else { return(NULL); /* no more left */ } } else { if(facidxnumfacs) { int strt; if(facidx==lt->faccache->old_facidx) { return(lt->faccache->bufcurr); } if(facidx>(lt->faccache->old_facidx+1)) { strt = lt->faccache->old_facidx+1; } else { strt=0; } for(j=strt;jnumfacs) { int process_idx = facidx/8; int process_bit = facidx&7; return( (lt->process_mask[process_idx]&(1<numfacs) { int idx = facidx/8; int bitpos = facidx&7; if(!(lt->flags[facidx]&VZT_RD_SYM_F_ALIAS)) { lt->process_mask[idx] |= (1<process_mask[idx] &= (~(1<numfacs) { int idx = facidx/8; int bitpos = facidx&7; lt->process_mask[idx] &= (~(1<process_mask, 0xff, (lt->numfacs+7)/8); rc=1; for(i=0;inumfacs;i++) { if((!lt->len[i])||(lt->flags[i]&VZT_RD_SYM_F_ALIAS)) vzt_rd_clr_fac_process_mask(lt, i); } } return(rc); } _VZT_RD_INLINE int vzt_rd_clr_fac_process_mask_all(struct vzt_rd_trace *lt) { int rc=0; if(lt) { memset(lt->process_mask, 0x00, (lt->numfacs+7)/8); rc=1; } return(rc); } /* * block memory set/get used to control buffering */ _VZT_RD_INLINE vztint64_t vzt_rd_set_max_block_mem_usage(struct vzt_rd_trace *lt, vztint64_t block_mem_max) { vztint64_t rc = lt->block_mem_max; lt->block_mem_max = block_mem_max; return(rc); } vztint64_t vzt_rd_get_block_mem_usage(struct vzt_rd_trace *lt) { vztint64_t mem; vzt_rd_pthread_mutex_lock(lt, <->mutex); mem = lt->block_mem_consumed; vzt_rd_pthread_mutex_unlock(lt, <->mutex); return(mem); } /* * return total number of blocks */ _VZT_RD_INLINE unsigned int vzt_rd_get_num_blocks(struct vzt_rd_trace *lt) { return(lt->numblocks); } /* * return number of active blocks */ unsigned int vzt_rd_get_num_active_blocks(struct vzt_rd_trace *lt) { int blk=0; if(lt) { struct vzt_rd_block *b = lt->block_head; while(b) { if((!b->short_read_ignore)&&(!b->exclude_block)) { blk++; } b=b->next; } } return(blk); } /****************************************************************************/ static int vzt_rd_det_gzip_type(FILE *handle) { unsigned char cbuf[2] = { 0, 0 }; off_t off = ftello(handle); if(!fread(cbuf, 1, 2, handle)) { cbuf[0] = cbuf[1] = 0; } fseeko(handle, off, SEEK_SET); if((cbuf[0] == 0x1f) && (cbuf[1] == 0x8b)) { return(VZT_RD_IS_GZ); } if((cbuf[0] == 'z') && (cbuf[1] == '7')) { return(VZT_RD_IS_LZMA); } return(VZT_RD_IS_BZ2); } /****************************************************************************/ static void vzt_rd_decompress_blk(struct vzt_rd_trace *lt, struct vzt_rd_block *b, int reopen) { unsigned int rc; void *zhandle; FILE *handle; if(reopen) { handle = fopen(lt->filename, "rb"); } else { handle = lt->handle; } fseeko(handle, b->filepos, SEEK_SET); vzt_rd_pthread_mutex_lock(lt, &b->mutex); if((!b->killed)&&(!b->mem)) { b->mem = malloc(b->uncompressed_siz); switch(b->ztype) { case VZT_RD_IS_GZ: zhandle = gzdopen(dup(fileno(handle)), "rb"); rc=gzread(zhandle, b->mem, b->uncompressed_siz); gzclose(zhandle); break; case VZT_RD_IS_BZ2: zhandle = BZ2_bzdopen(dup(fileno(handle)), "rb"); rc=BZ2_bzread(zhandle, b->mem, b->uncompressed_siz); BZ2_bzclose(zhandle); break; case VZT_RD_IS_LZMA: default: zhandle = LZMA_fdopen(dup(fileno(handle)), "rb"); rc=LZMA_read(zhandle, b->mem, b->uncompressed_siz); LZMA_close(zhandle); break; } if(rc!=b->uncompressed_siz) { fprintf(stderr, VZT_RDLOAD"short read on block %p %d vs "VZT_RD_LD" (exp), ignoring\n", (void *)b, rc, b->uncompressed_siz); free(b->mem); b->mem=NULL; b->short_read_ignore = 1; } else { vzt_rd_pthread_mutex_lock(lt, <->mutex); lt->block_mem_consumed += b->uncompressed_siz; vzt_rd_pthread_mutex_unlock(lt, <->mutex); } } vzt_rd_pthread_mutex_unlock(lt, &b->mutex); if(reopen) { fclose(handle); } } static void *vzt_rd_decompress_blk_pth_actual(void *args) { struct vzt_pth_args *vpa = (struct vzt_pth_args *)args; vzt_rd_decompress_blk(vpa->lt, vpa->b, 1); vzt_rd_block_vch_decode(vpa->lt, vpa->b); free(vpa); return(NULL); } static void vzt_rd_decompress_blk_pth(struct vzt_rd_trace *lt, struct vzt_rd_block *b) { struct vzt_pth_args *vpa = malloc(sizeof(struct vzt_pth_args)); vpa->lt = lt; vpa->b = b; vzt_rd_pthread_create(lt, &b->pth, &b->pth_attr, vzt_rd_decompress_blk_pth_actual, vpa); /* cppcheck misfires thinking vpa is not freed even though vzt_rd_decompress_blk_pth_actual() does it */ } /* * block iteration...purge/reload code here isn't sophisticated as it * merely caches the FIRST set of blocks which fit in lt->block_mem_max. * n.b., returns number of blocks processed */ int vzt_rd_iter_blocks(struct vzt_rd_trace *lt, void (*value_change_callback)(struct vzt_rd_trace **lt, vztint64_t *time, vztint32_t *facidx, char **value), void *user_callback_data_pointer) { struct vzt_rd_block *b, *bpre; int blk=0, blkfinal=0; int processed = 0; struct vzt_rd_block *bcutoff=NULL, *bfinal=NULL; if(lt) { lt->value_change_callback = value_change_callback ? value_change_callback : vzt_rd_null_callback; lt->user_callback_data_pointer = user_callback_data_pointer; b = lt->block_head; blk=0; while(b) { if((!b->mem)&&(!b->short_read_ignore)&&(!b->exclude_block)) { if(processed<5) { int gate = (processed==4) && b->next; fprintf(stderr, VZT_RDLOAD"block [%d] processing "VZT_RD_LLD" / "VZT_RD_LLD"%s\n", blk, b->start, b->end, gate ? " ..." : ""); if(gate) { bcutoff = b; } } processed++; if(lt->pthreads) { int count = lt->pthreads; /* prefetch next *empty* block(s) on an alternate thread */ bpre = b->next; while(bpre) { if((!bpre->mem)&&(!bpre->short_read_ignore)&&(!bpre->exclude_block)) { vzt_rd_decompress_blk_pth(lt, bpre); count--; if(!count) break; } bpre = bpre->next; } } vzt_rd_decompress_blk(lt, b, 0); bfinal=b; blkfinal = blk; } if(b->mem) { if(lt->process_linear) { vzt_rd_process_block_linear(lt, b); } else { vzt_rd_process_block(lt, b); } if(lt->numblocks > 2) /* no sense freeing up when not so many blocks */ { vztint64_t block_mem_consumed; vzt_rd_pthread_mutex_lock(lt, <->mutex); block_mem_consumed = lt->block_mem_consumed; vzt_rd_pthread_mutex_unlock(lt, <->mutex); if(block_mem_consumed > lt->block_mem_max) { if(b->prev) { vzt_rd_pthread_mutex_lock(lt, <->mutex); lt->block_mem_consumed -= b->prev->uncompressed_siz; vzt_rd_pthread_mutex_unlock(lt, <->mutex); vzt_rd_block_vch_free(lt, b->prev, 0); } } } } blk++; b=b->next; } } if((bcutoff)&&(bfinal!=bcutoff)) { fprintf(stderr, VZT_RDLOAD"block [%d] processed "VZT_RD_LLD" / "VZT_RD_LLD"\n", blkfinal, bfinal->start, bfinal->end); } return(blk); } /* * callback access to the user callback data pointer (if required) */ _VZT_RD_INLINE void *vzt_rd_get_user_callback_data_pointer(struct vzt_rd_trace *lt) { if(lt) { return(lt->user_callback_data_pointer); } else { return(NULL); } } /* * limit access to certain timerange in file * and return number of active blocks */ unsigned int vzt_rd_limit_time_range(struct vzt_rd_trace *lt, vztint64_t strt_time, vztint64_t end_time) { vztint64_t tmp_time; int blk=0; if(lt) { struct vzt_rd_block *b = lt->block_head; struct vzt_rd_block *bprev = NULL; int state = 0; if(strt_time > end_time) { tmp_time = strt_time; strt_time = end_time; end_time = tmp_time; } while(b) { switch(state) { case 0: if(b->end >= strt_time) { state = 1; if((b->start > strt_time) && (bprev)) { bprev->exclude_block = 0; blk++; } } break; case 1: if(b->start > end_time) state = 2; break; default: break; } if((state==1) && (!b->short_read_ignore)) { b->exclude_block = 0; blk++; } else { b->exclude_block = 1; } bprev = b; b = b->next; } } return(blk); } /* * unrestrict access to the whole file * and return number of active blocks */ unsigned int vzt_rd_unlimit_time_range(struct vzt_rd_trace *lt) { int blk=0; if(lt) { struct vzt_rd_block *b = lt->block_head; while(b) { b->exclude_block = 0; if(!b->short_read_ignore) { blk++; } b=b->next; } } return(blk); } /* * mode switch for linear accessing */ void vzt_rd_process_blocks_linearly(struct vzt_rd_trace *lt, int doit) { if(lt) { lt->process_linear = (doit != 0); } } /****************************************************************************/ /* * initialize the trace, get compressed facnames, get geometries, * and get block offset/size/timestart/timeend... */ struct vzt_rd_trace *vzt_rd_init_smp(const char *name, unsigned int num_cpus) { struct vzt_rd_trace *lt=(struct vzt_rd_trace *)calloc(1, sizeof(struct vzt_rd_trace)); unsigned int i; unsigned int vindex_offset; if(!(lt->handle=fopen(name, "rb"))) { vzt_rd_close(lt); lt=NULL; } else { vztint16_t id = 0, version = 0; lt->filename = strdup(name); lt->block_mem_max = VZT_RD_MAX_BLOCK_MEM_USAGE; /* cutoff after this number of bytes and force flush */ if(num_cpus<1) num_cpus = 1; if(num_cpus>8) num_cpus = 8; lt->pthreads = num_cpus - 1; setvbuf(lt->handle, (char *)NULL, _IONBF, 0); /* keeps gzip from acting weird in tandem with fopen */ if(!fread(&id, 2, 1, lt->handle)) { id = 0; } if(!fread(&version, 2, 1, lt->handle)) { id = 0; } if(!fread(<->granule_size, 1, 1, lt->handle)) { id = 0; } if(vzt_rd_get_16(&id,0) != VZT_RD_HDRID) { fprintf(stderr, VZT_RDLOAD"*** Not a vzt file ***\n"); vzt_rd_close(lt); lt=NULL; } else if((version=vzt_rd_get_16(&version,0)) > VZT_RD_VERSION) { fprintf(stderr, VZT_RDLOAD"*** Version %d vzt not supported ***\n", version); vzt_rd_close(lt); lt=NULL; } else if(lt->granule_size > VZT_RD_GRANULE_SIZE) { fprintf(stderr, VZT_RDLOAD"*** Granule size of %d (>%d) not supported ***\n", lt->granule_size, VZT_RD_GRANULE_SIZE); vzt_rd_close(lt); lt=NULL; } else { size_t rcf; unsigned int rc; char *m; off_t pos, fend; unsigned int t; struct vzt_rd_block *b; vzt_rd_pthread_mutex_init(lt, <->mutex, NULL); rcf = fread(<->numfacs, 4, 1, lt->handle); lt->numfacs = rcf ? vzt_rd_get_32(<->numfacs,0) : 0; if(!lt->numfacs) { vztint32_t num_expansion_bytes; rcf = fread(&num_expansion_bytes, 4, 1, lt->handle); num_expansion_bytes = rcf ? vzt_rd_get_32(&num_expansion_bytes,0) : 0; rcf = fread(<->numfacs, 4, 1, lt->handle); lt->numfacs = rcf ? vzt_rd_get_32(<->numfacs,0) : 0; if(num_expansion_bytes >= 8) { rcf = fread(<->timezero, 8, 1, lt->handle); lt->timezero = rcf ? vzt_rd_get_64(<->timezero,0) : 0; if(num_expansion_bytes > 8) { /* future version? */ fseeko(lt->handle, num_expansion_bytes - 8, SEEK_CUR); } } else { /* malformed */ fseeko(lt->handle, num_expansion_bytes, SEEK_CUR); } } rcf = fread(<->numfacbytes, 4, 1, lt->handle); lt->numfacbytes = rcf ? vzt_rd_get_32(<->numfacbytes,0) : 0; rcf = fread(<->longestname, 4, 1, lt->handle); lt->longestname = rcf ? vzt_rd_get_32(<->longestname,0) : 0; rcf = fread(<->zfacnamesize, 4, 1, lt->handle); lt->zfacnamesize = rcf ? vzt_rd_get_32(<->zfacnamesize,0) : 0; rcf = fread(<->zfacname_predec_size, 4, 1, lt->handle);lt->zfacname_predec_size = rcf ? vzt_rd_get_32(<->zfacname_predec_size,0) : 0; rcf = fread(<->zfacgeometrysize, 4, 1, lt->handle); lt->zfacgeometrysize = rcf ? vzt_rd_get_32(<->zfacgeometrysize,0) : 0; rcf = fread(<->timescale, 1, 1, lt->handle); if(!rcf) lt->timescale = 0; /* no swap necessary */ fprintf(stderr, VZT_RDLOAD VZT_RD_LD" facilities\n", lt->numfacs); pos = ftello(lt->handle); /* fprintf(stderr, VZT_RDLOAD"gzip facnames start at pos %d (zsize=%d)\n", pos, lt->zfacnamesize); */ lt->process_mask = calloc(1, lt->numfacs/8+1); switch(vzt_rd_det_gzip_type(lt->handle)) { case VZT_RD_IS_GZ: lt->zhandle = gzdopen(dup(fileno(lt->handle)), "rb"); m=(char *)malloc(lt->zfacname_predec_size); rc=gzread(lt->zhandle, m, lt->zfacname_predec_size); gzclose(lt->zhandle); lt->zhandle=NULL; break; case VZT_RD_IS_BZ2: lt->zhandle = BZ2_bzdopen(dup(fileno(lt->handle)), "rb"); m=(char *)malloc(lt->zfacname_predec_size); rc=BZ2_bzread(lt->zhandle, m, lt->zfacname_predec_size); BZ2_bzclose(lt->zhandle); lt->zhandle=NULL; break; case VZT_RD_IS_LZMA: default: lt->zhandle = LZMA_fdopen(dup(fileno(lt->handle)), "rb"); m=(char *)malloc(lt->zfacname_predec_size); rc=LZMA_read(lt->zhandle, m, lt->zfacname_predec_size); LZMA_close(lt->zhandle); lt->zhandle=NULL; break; } if(rc!=lt->zfacname_predec_size) { fprintf(stderr, VZT_RDLOAD"*** name section mangled %d (act) vs "VZT_RD_LD" (exp)\n", rc, lt->zfacname_predec_size); free(m); vzt_rd_close(lt); lt=NULL; return(lt); } lt->zfacnames = m; lt->faccache = calloc(1, sizeof(struct vzt_rd_facname_cache)); lt->faccache->old_facidx = lt->numfacs; /* causes vzt_rd_get_facname to initialize its unroll ptr as this is always invalid */ lt->faccache->bufcurr = malloc(lt->longestname+1); lt->faccache->bufprev = malloc(lt->longestname+1); fseeko(lt->handle, pos = pos+lt->zfacnamesize, SEEK_SET); /* fprintf(stderr, VZT_RDLOAD"seeking to geometry at %d (0x%08x)\n", pos, pos); */ switch(vzt_rd_det_gzip_type(lt->handle)) { case VZT_RD_IS_GZ: lt->zhandle = gzdopen(dup(fileno(lt->handle)), "rb"); t = lt->numfacs * 4 * sizeof(vztint32_t); m=(char *)malloc(t); rc=gzread(lt->zhandle, m, t); gzclose(lt->zhandle); lt->zhandle=NULL; break; case VZT_RD_IS_BZ2: lt->zhandle = BZ2_bzdopen(dup(fileno(lt->handle)), "rb"); t = lt->numfacs * 4 * sizeof(vztint32_t); m=(char *)malloc(t); rc=BZ2_bzread(lt->zhandle, m, t); BZ2_bzclose(lt->zhandle); lt->zhandle=NULL; break; case VZT_RD_IS_LZMA: default: lt->zhandle = LZMA_fdopen(dup(fileno(lt->handle)), "rb"); t = lt->numfacs * 4 * sizeof(vztint32_t); m=(char *)malloc(t); rc=LZMA_read(lt->zhandle, m, t); LZMA_close(lt->zhandle); lt->zhandle=NULL; break; } if(rc!=t) { fprintf(stderr, VZT_RDLOAD"*** geometry section mangled %d (act) vs %d (exp)\n", rc, t); free(m); vzt_rd_close(lt); lt=NULL; return(lt); } pos = pos+lt->zfacgeometrysize; lt->rows = malloc(lt->numfacs * sizeof(vztint32_t)); lt->msb = malloc(lt->numfacs * sizeof(vztsint32_t)); lt->lsb = malloc(lt->numfacs * sizeof(vztsint32_t)); lt->flags = malloc(lt->numfacs * sizeof(vztint32_t)); lt->len = malloc(lt->numfacs * sizeof(vztint32_t)); lt->vindex_offset = malloc(lt->numfacs * sizeof(vztint32_t)); lt->longest_len = 32; /* big enough for decoded double in vzt_rd_process_block_single_factime() */ for(i=0;inumfacs;i++) { int j; lt->rows[i] = vzt_rd_get_32(m+i*16, 0); lt->msb[i] = vzt_rd_get_32(m+i*16, 4); lt->lsb[i] = vzt_rd_get_32(m+i*16, 8); lt->flags[i] = vzt_rd_get_32(m+i*16, 12) & VZT_RD_SYM_MASK; /* strip out unsupported bits */ j = (!(lt->flags[i] & VZT_RD_SYM_F_ALIAS)) ? i : vzt_rd_get_alias_root(lt, i); if(!(lt->flags[i] & (VZT_RD_SYM_F_INTEGER|VZT_RD_SYM_F_STRING|VZT_RD_SYM_F_DOUBLE))) { lt->len[i] = (lt->msb[j] <= lt->lsb[j]) ? (lt->lsb[j] - lt->msb[j] + 1) : (lt->msb[j] - lt->lsb[j] + 1); } else { lt->len[i] = (lt->flags[j] & (VZT_RD_SYM_F_INTEGER|VZT_RD_SYM_F_STRING)) ? 32 : 64; } if(lt->len[i] > lt->longest_len) { lt->longest_len = lt->len[i]; } } vindex_offset = 0; /* offset in value table */ for(lt->numrealfacs=0; lt->numrealfacsnumfacs; lt->numrealfacs++) { if(lt->flags[lt->numrealfacs] & VZT_RD_SYM_F_ALIAS) { break; } lt->vindex_offset[lt->numrealfacs] = vindex_offset; vindex_offset += lt->len[lt->numrealfacs]; } lt->total_values = vindex_offset; fprintf(stderr, VZT_RDLOAD"Total value bits: "VZT_RD_LD"\n", lt->total_values); if(lt->numrealfacs > lt->numfacs) lt->numrealfacs = lt->numfacs; lt->value_current_sector = malloc(lt->longest_len + 1); lt->value_previous_sector = malloc(lt->longest_len + 1); free(m); for(;;) { fseeko(lt->handle, 0L, SEEK_END); fend=ftello(lt->handle); if(pos>=fend) break; fseeko(lt->handle, pos, SEEK_SET); /* fprintf(stderr, VZT_RDLOAD"seeking to block at %d (0x%08x)\n", pos, pos); */ b=calloc(1, sizeof(struct vzt_rd_block)); b->last_rd_value_idx = ~0; rcf = fread(&b->uncompressed_siz, 4, 1, lt->handle); b->uncompressed_siz = rcf ? vzt_rd_get_32(&b->uncompressed_siz,0) : 0; rcf = fread(&b->compressed_siz, 4, 1, lt->handle); b->compressed_siz = rcf ? vzt_rd_get_32(&b->compressed_siz,0) : 0; rcf = fread(&b->start, 8, 1, lt->handle); b->start = rcf ? vzt_rd_get_64(&b->start,0) : 0; rcf = fread(&b->end, 8, 1, lt->handle); b->end = rcf ? vzt_rd_get_64(&b->end,0) : 0; pos = ftello(lt->handle); if((b->rle = (b->start > b->end))) { vztint64_t tb = b->start; b->start = b->end; b->end = tb; } b->ztype = vzt_rd_det_gzip_type(lt->handle); /* fprintf(stderr, VZT_RDLOAD"block gzip start at pos %d (0x%08x)\n", pos, pos); */ if(pos>=fend) { free(b); break; } b->filepos = pos; /* mark startpos for later in case we purge it from memory */ /* fprintf(stderr, VZT_RDLOAD"un/compressed size: %d/%d\n", b->uncompressed_siz, b->compressed_siz); */ if((b->uncompressed_siz)&&(b->compressed_siz)&&(b->end)) { /* fprintf(stderr, VZT_RDLOAD"block [%d] %lld / %lld\n", lt->numblocks, b->start, b->end); */ fseeko(lt->handle, b->compressed_siz, SEEK_CUR); lt->numblocks++; if(lt->numblocks <= lt->pthreads) { vzt_rd_pthread_mutex_init(lt, &b->mutex, NULL); vzt_rd_decompress_blk_pth(lt, b); /* prefetch first block */ } if(lt->block_curr) { b->prev = lt->block_curr; lt->block_curr->next = b; lt->block_curr = b; lt->end = b->end; } else { lt->block_head = lt->block_curr = b; lt->start = b->start; lt->end = b->end; } } else { free(b); break; } pos+=b->compressed_siz; } if(lt->numblocks) { fprintf(stderr, VZT_RDLOAD"Read %d block header%s OK\n", lt->numblocks, (lt->numblocks!=1) ? "s" : ""); fprintf(stderr, VZT_RDLOAD"["VZT_RD_LLD"] start time\n", lt->start); fprintf(stderr, VZT_RDLOAD"["VZT_RD_LLD"] end time\n", lt->end); fprintf(stderr, VZT_RDLOAD"\n"); lt->value_change_callback = vzt_rd_null_callback; } else { vzt_rd_close(lt); lt=NULL; } } } return(lt); } /* * experimental, only really useful for vztminer right now... */ void vzt_rd_vectorize(struct vzt_rd_trace *lt) { if((!lt)||(lt->vectorize)||(lt->numfacs<2)) { return; } else { unsigned int old_longest_len = lt->longest_len; int pmxlen = 31; char *pbuff = malloc(pmxlen+1); char *pname; int plen, plen2; unsigned int i; int pidx; int num_after_combine = lt->numfacs; int num_synvecs = 0; int num_synalias = 0; struct vzt_synvec_chain **synvec_chain = calloc(lt->numfacs, sizeof(struct vzt_synvec_chain *)); for(i=0;inumfacs-1;i++) { unsigned int j; if(lt->len[i] != 1) continue; pname = vzt_rd_get_facname(lt, i); plen = strlen(pname); if(plen > pmxlen) { free(pbuff); pbuff = malloc(plen+1); } memcpy(pbuff, pname, plen); pbuff[plen] = 0; pidx = lt->msb[i]; for(j=i+1;jnumfacs-1;j++) { pname = vzt_rd_get_facname(lt, j); plen2 = strlen(pname); if((plen != plen2) || (strcmp(pbuff, pname)) || (lt->len[j] != 1) || ((pidx != lt->msb[j]-1) && (pidx != lt->msb[j]+1))) { i = j-1; break; } pidx = lt->msb[j]; lt->len[i] += lt->len[j]; lt->lsb[i] = lt->lsb[j]; lt->len[j] = 0; num_after_combine--; if(lt->len[i] > lt->longest_len) { lt->longest_len = lt->len[i]; } } } free(pbuff); /* scan-build */ for(i=lt->numrealfacs;inumfacs;i++) { if(lt->flags[i] & VZT_RD_SYM_F_ALIAS) /* not necessary, only for sanity */ { unsigned int j = vzt_rd_get_alias_root(lt, i); unsigned int k, l; if(lt->len[i]) { if((lt->len[i]==1) && (lt->len[j]==1)) { /* nothing to do, single bit alias */ continue; } if(lt->len[i]==lt->len[j]) { unsigned int nfm1 = lt->numfacs-1; if((i != nfm1) && (j != nfm1)) { if(lt->len[i+1] && lt->len[j+1]) { /* nothing to do, multi-bit alias */ continue; } } } if(1) /* seems like this doesn't need to be conditional (for now) */ { lt->vindex_offset[i] = lt->vindex_offset[j]; for(k=1;klen[i];k++) { if((k+i) <= (lt->numfacs-1)) { lt->vindex_offset[k+i] = lt->vindex_offset[vzt_rd_get_alias_root(lt, k+i)]; } } if(synvec_chain[j]) { int alias_found = 0; for(k=0;knum_entries;k++) { vztint32_t idx = synvec_chain[j]->chain[k]; if(lt->len[i] == lt->len[idx]) { for(l=0;llen[i];l++) { if((idx+l)<=(lt->numfacs-1)) { if(lt->vindex_offset[idx+l] != lt->vindex_offset[i+l]) break; } } if(l == (lt->len[i])) { lt->rows[i] = idx; /* already exists */ num_synalias++; alias_found = 1; break; } } } if(!alias_found) { synvec_chain[j] = realloc(synvec_chain[j], sizeof(struct vzt_synvec_chain) + synvec_chain[j]->num_entries * sizeof(vztint32_t)); synvec_chain[j]->chain[synvec_chain[j]->num_entries++] = i; lt->flags[i] |= VZT_RD_SYM_F_SYNVEC; lt->flags[i] &= ~VZT_RD_SYM_F_ALIAS; lt->numrealfacs = i+1; /* bump up to end */ num_synvecs++; } } else { synvec_chain[j] = malloc(sizeof(struct vzt_synvec_chain)); if(synvec_chain[j]) /* scan-build : deref of null pointer below */ { synvec_chain[j]->num_entries = 1; synvec_chain[j]->chain[0] = i; } lt->flags[i] |= VZT_RD_SYM_F_SYNVEC; lt->flags[i] &= ~VZT_RD_SYM_F_ALIAS; lt->numrealfacs = i+1; /* bump up to end */ num_synvecs++; } } } } } for(i=0;inumfacs;i++) { if(synvec_chain[i]) free(synvec_chain[i]); } free(synvec_chain); fprintf(stderr, VZT_RDLOAD"%d facilities (after vectorization)\n", num_after_combine); if(num_synvecs) { fprintf(stderr, VZT_RDLOAD"%d complex vectors synthesized\n", num_synvecs); if(num_synalias) fprintf(stderr, VZT_RDLOAD"%d complex aliases synthesized\n", num_synalias); } fprintf(stderr, VZT_RDLOAD"\n"); if(lt->longest_len != old_longest_len) { free(lt->value_current_sector); free(lt->value_previous_sector); lt->value_current_sector = malloc(lt->longest_len + 1); lt->value_previous_sector = malloc(lt->longest_len + 1); } } } struct vzt_rd_trace *vzt_rd_init(const char *name) { return(vzt_rd_init_smp(name, 1)); } /* * free up/deallocate any resources still left out there: * blindly do it based on NULL pointer comparisons (ok, since * calloc() is used to allocate all structs) as performance * isn't an issue for this set of cleanup code */ void vzt_rd_close(struct vzt_rd_trace *lt) { if(lt) { struct vzt_rd_block *b, *bt; if(lt->process_mask) { free(lt->process_mask); lt->process_mask=NULL; } if(lt->rows) { free(lt->rows); lt->rows=NULL; } if(lt->msb) { free(lt->msb); lt->msb=NULL; } if(lt->lsb) { free(lt->lsb); lt->lsb=NULL; } if(lt->flags) { free(lt->flags); lt->flags=NULL; } if(lt->len) { free(lt->len); lt->len=NULL; } if(lt->vindex_offset) { free(lt->vindex_offset); lt->vindex_offset=NULL; } if(lt->zfacnames) { free(lt->zfacnames); lt->zfacnames=NULL; } if(lt->value_current_sector) { free(lt->value_current_sector); lt->value_current_sector=NULL; } if(lt->value_previous_sector) { free(lt->value_previous_sector); lt->value_previous_sector=NULL; } if(lt->faccache) { if(lt->faccache->bufprev) { free(lt->faccache->bufprev); lt->faccache->bufprev=NULL; } if(lt->faccache->bufcurr) { free(lt->faccache->bufcurr); lt->faccache->bufcurr=NULL; } free(lt->faccache); lt->faccache=NULL; } b=lt->block_head; while(b) { bt=b->next; vzt_rd_block_vch_free(lt, b, 1); vzt_rd_pthread_mutex_destroy(lt, &b->mutex); free(b); b=bt; } lt->block_head=lt->block_curr=NULL; if(lt->zhandle) { gzclose(lt->zhandle); lt->zhandle=NULL; } if(lt->handle) { fclose(lt->handle); lt->handle=NULL; } if(lt->filename) { free(lt->filename); lt->filename=NULL; } vzt_rd_pthread_mutex_destroy(lt, <->mutex); free(lt); } } /*******************************************/ /* * read single fac value at a given time */ static char *vzt_rd_process_block_single_factime(struct vzt_rd_trace *lt, struct vzt_rd_block *b, vztint64_t simtime, vztint32_t idx) { unsigned int i; char *pnt=lt->value_current_sector; /* convenient workspace mem */ char *buf = lt->value_previous_sector; /* convenient workspace mem */ char *rcval = NULL; vzt_rd_block_vch_decode(lt, b); vzt_rd_pthread_mutex_lock(lt, &b->mutex); if((b->last_rd_value_simtime == simtime) && (b->last_rd_value_idx != ((vztint32_t)~0))) { i = b->last_rd_value_idx; } else { int i_ok = 0; for(i=0;inum_time_ticks;i++) /* for(i=b->num_time_ticks-1; i>=0; i--) */ { if(simtime == b->times[i]) { i_ok = i; break; } if(simtime < b->times[i]) break; i_ok = i; /* replace with maximal bsearch if this caching doesn't work out */ } b->last_rd_value_idx = i_ok; b->last_rd_value_simtime = simtime; } vzt_rd_fac_value(lt, b, i, idx, pnt); if(!(lt->flags[idx] & (VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING))) { rcval = pnt; } else { if(lt->flags[idx] & VZT_RD_SYM_F_DOUBLE) { vzt_rd_double_xdr(pnt, buf); rcval = buf; } else { unsigned int spnt=vzt_rd_make_sindex(pnt); rcval = b->sindex[spnt]; } } vzt_rd_pthread_mutex_unlock(lt, &b->mutex); return(rcval); } char *vzt_rd_value(struct vzt_rd_trace *lt, vztint64_t simtime, vztint32_t idx) { struct vzt_rd_block *b, *b2; char *rcval = NULL; if(lt) { b = lt->block_head; if((simtime == lt->last_rd_value_simtime) && (lt->last_rd_value_block)) { b = lt->last_rd_value_block; goto b_chk; } else { lt->last_rd_value_simtime = simtime; } while(b) { if((b->start > simtime) || (b->end < simtime)) { b = b->next; continue; } lt->last_rd_value_block = b; b_chk: if((!b->mem)&&(!b->short_read_ignore)) { vzt_rd_decompress_blk(lt, b, 0); } if(b->mem) { rcval = vzt_rd_process_block_single_factime(lt, b, simtime, idx); break; } b=b->next; } } else { return(NULL); } if((b)&&(lt->numblocks > 2)) /* no sense freeing up when not so many blocks */ { vztint64_t block_mem_consumed; vzt_rd_pthread_mutex_lock(lt, <->mutex); block_mem_consumed = lt->block_mem_consumed; vzt_rd_pthread_mutex_unlock(lt, <->mutex); if(block_mem_consumed > lt->block_mem_max) { b2 = lt->block_head; while(b2) { if((block_mem_consumed > lt->block_mem_max) && (b2 != b)) { vzt_rd_pthread_mutex_lock(lt, <->mutex); lt->block_mem_consumed -= b2->uncompressed_siz; vzt_rd_pthread_mutex_unlock(lt, <->mutex); vzt_rd_block_vch_free(lt, b2, 0); } b2 = b2->next; } } } return(rcval); } gtkwave-3.3.86/src/helpers/vztminer.c0000664000175000017500000001656513166335473017074 0ustar bybellbybell/* * Copyright (c) 2003-2009 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include "vzt_read.h" #if HAVE_GETOPT_H #include #endif #include "wave_locale.h" static char *match = NULL; static uint32_t matchlen = 0; static int names_only = 0; static char *killed_list = NULL; char killed_value = 1; char vcd_blackout; void vcd_callback(struct vzt_rd_trace **lt, vztint64_t *pnt_time, vztint32_t *pnt_facidx, char **pnt_value) { struct vzt_rd_geometry *g = vzt_rd_get_fac_geometry(*lt, *pnt_facidx); /* fprintf(stderr, VZT_RD_LLD" %d %s\n", *pnt_time, *pnt_facidx, *pnt_value); */ if(!(*pnt_value)[0]) { if(!vcd_blackout) { vcd_blackout = 1; /* printf("$dumpoff\n"); */ } return; } else { if(vcd_blackout) { vcd_blackout = 0; /* printf("$dumpon\n"); */ } } if(g->len >= matchlen) { if(!killed_list[*pnt_facidx]) { if((!match) || (strstr(*pnt_value, match))) { if(g->len > 1) { if(!names_only) { printf("#"VZT_RD_LLD" %s["VZT_RD_LD":"VZT_RD_LD"] %s\n", *pnt_time, vzt_rd_get_facname(*lt, *pnt_facidx), g->msb, g->lsb, *pnt_value); } else { printf("%s["VZT_RD_LD":"VZT_RD_LD"]\n", vzt_rd_get_facname(*lt, *pnt_facidx), g->msb, g->lsb); } } else { if(g->msb < 0) { if(!names_only) { printf("#"VZT_RD_LLD" %s %s\n", *pnt_time, vzt_rd_get_facname(*lt, *pnt_facidx), *pnt_value); } else { printf("%s\n", vzt_rd_get_facname(*lt, *pnt_facidx)); } } else { if(!names_only) { printf("#"VZT_RD_LLD" %s["VZT_RD_LD"] %s\n", *pnt_time, vzt_rd_get_facname(*lt, *pnt_facidx), g->msb, *pnt_value); } else { printf("%s["VZT_RD_LD"]\n", vzt_rd_get_facname(*lt, *pnt_facidx), g->msb); } } } if(killed_value) { vzt_rd_clr_fac_process_mask(*lt, *pnt_facidx); killed_list[*pnt_facidx] = 1; } } } } } int process_vzt(char *fname) { struct vzt_rd_trace *lt; lt=vzt_rd_init(fname); if(lt) { int numfacs; vzt_rd_vectorize(lt); /* coalesce bitblasted vectors */ numfacs = vzt_rd_get_num_facs(lt); killed_list = calloc(numfacs, sizeof(char)); vzt_rd_set_fac_process_mask_all(lt); vzt_rd_set_max_block_mem_usage(lt, 0); /* no need to cache blocks */ vzt_rd_iter_blocks(lt, vcd_callback, NULL); vzt_rd_close(lt); free(killed_list); } else { fprintf(stderr, "vzt_rd_init failed\n"); return(255); } return(0); } /*******************************************************************************/ void print_help(char *nam) { #ifdef __linux__ printf( "Usage: %s [OPTION]... [VZTFILE]\n\n" " -d, --dumpfile=FILE specify VZT input dumpfile\n" " -m, --match bitwise match value\n" " -x, --hex hex match value\n" " -n, --namesonly emit facsnames only (gtkwave savefile)\n" " -c, --comprehensive do not stop after first match\n" " -h, --help display this help then exit\n\n" "First occurrence of facnames with times and matching values are emitted to\nstdout. Using -n generates a gtkwave save file.\n\n" "Report bugs to <"PACKAGE_BUGREPORT">.\n",nam); #else printf( "Usage: %s [OPTION]... [VZTFILE]\n\n" " -d specify VZT input dumpfile\n" " -m bitwise match value\n" " -x hex match value\n" " -n emit facsnames only\n" " -c do not stop after first match\n" " -h display this help then exit (gtkwave savefile)\n\n" "First occurrence of facnames with times and matching values are emitted to\nstdout. Using -n generates a gtkwave save file.\n\n" "Report bugs to <"PACKAGE_BUGREPORT">.\n",nam); #endif exit(0); } int main(int argc, char **argv) { char opt_errors_encountered=0; char *lxname=NULL; int c; int rc; uint32_t i, j, k; int comprehensive = 0; WAVE_LOCALE_FIX while (1) { #ifdef __linux__ int option_index = 0; static struct option long_options[] = { {"dumpfile", 1, 0, 'd'}, {"match", 1, 0, 'm'}, {"hex", 1, 0, 'x'}, {"namesonly", 0, 0, 'n'}, {"comprehensive", 0, 0, 'c'}, {"help", 0, 0, 'h'}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "d:m:x:nch", long_options, &option_index); #else c = getopt (argc, argv, "d:m:x:nch"); #endif if (c == -1) break; /* no more args */ switch (c) { case 'c': comprehensive = 1; break; case 'n': names_only = 1; break; case 'd': if(lxname) free(lxname); lxname = malloc(strlen(optarg)+1); strcpy(lxname, optarg); break; case 'm': if(match) free(match); match = malloc((matchlen = strlen(optarg))+1); strcpy(match, optarg); break; case 'x': if(match) free(match); match = malloc((matchlen = 4*strlen(optarg))+1); for(i=0,k=0;i='0')&&(ch<='9')) { ch -= '0'; for(j=0;j<4;j++) { match[i+j] = ((ch>>(3-j))&1) + '0'; } } else if((ch>='a')&&(ch<='f')) { ch = ch - 'a' + 10; for(j=0;j<4;j++) { match[i+j] = ((ch>>(3-j))&1) + '0'; } } else /* "x" */ { for(j=0;j<4;j++) { match[i+j] = 'x'; } } } match[matchlen] = 0; break; case 'h': print_help(argv[0]); break; case '?': opt_errors_encountered=1; break; default: /* unreachable */ break; } } if(!names_only && comprehensive) { killed_value = 0; } if(opt_errors_encountered) { print_help(argv[0]); } if (optind < argc) { while (optind < argc) { if(lxname) { free(lxname); } lxname = malloc(strlen(argv[optind])+1); strcpy(lxname, argv[optind++]); } } if(!lxname) { print_help(argv[0]); } rc=process_vzt(lxname); free(lxname); return(rc); } gtkwave-3.3.86/src/helpers/lxt_write.c0000664000175000017500000016320613166335473017232 0ustar bybellbybell/* * Copyright (c) 2001-2012 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include "lxt_write.h" /* * in-place sort to keep chained facs from migrating... */ static void wave_mergesort(struct lt_symbol **a, struct lt_symbol **b, int lo, int hi) { int i, j, k; if (loname, a[j]->name) <= 0) { a[k++]=b[i++]; } else { a[k++]=a[j++]; } } while (kitem); if (dir < 0) { if (t->left == NULL) break; if (strcmp(i, t->left->item)<0) { y = t->left; /* rotate right */ t->left = y->right; y->right = t; t = y; if (t->left == NULL) break; } r->left = t; /* link right */ r = t; t = t->left; } else if (dir > 0) { if (t->right == NULL) break; if (strcmp(i, t->right->item)>0) { y = t->right; /* rotate left */ t->right = y->left; y->left = t; t = y; if (t->right == NULL) break; } l->right = t; /* link left */ l = t; t = t->right; } else { dslxt_success=1; break; } } l->right = t->left; /* assemble */ r->left = t->right; t->left = N.right; t->right = N.left; return t; } static dslxt_Tree * dslxt_insert(char *i, dslxt_Tree * t, unsigned int val) { /* Insert i into the tree t, unless it's already there. */ /* Return a pointer to the resulting tree. */ dslxt_Tree * n; int dir; n = (dslxt_Tree *) calloc (1, sizeof (dslxt_Tree)); if (n == NULL) { fprintf(stderr, "dslxt_insert: ran out of memory, exiting.\n"); exit(255); } n->item = i; n->val = val; if (t == NULL) { n->left = n->right = NULL; return n; } t = dslxt_splay(i,t); dir = strcmp(i,t->item); if (dir<0) { n->left = t->left; n->right = t; t->left = NULL; return n; } else if (dir>0) { n->right = t->right; n->left = t; t->right = NULL; return n; } else { /* We get here if it's already in the tree */ /* Don't add it again */ free(n); return t; } } #if 0 /* unused for now but delete is here for completeness */ static dslxt_Tree * dslxt_delete(char *i, dslxt_Tree * t) { /* Deletes i from the tree if it's there. */ /* Return a pointer to the resulting tree. */ dslxt_Tree * x; if (t==NULL) return NULL; t = dslxt_splay(i,t); if (!strcmp(i, t->item)) { /* found it */ if (t->left == NULL) { x = t->right; } else { x = dslxt_splay(i, t->left); x->right = t->right; } free(t); return x; } return t; /* It wasn't there */ } #endif /************************ splay ************************/ /* * functions which emit various big endian * data to a file */ static int lt_emit_u8(struct lt_trace *lt, int value) { unsigned char buf[1]; int nmemb; buf[0] = value & 0xff; nmemb=fwrite(buf, sizeof(char), 1, lt->handle); lt->position+=nmemb; return(nmemb); } static int lt_emit_u16(struct lt_trace *lt, int value) { unsigned char buf[2]; int nmemb; buf[0] = (value>>8) & 0xff; buf[1] = value & 0xff; nmemb = fwrite(buf, sizeof(char), 2, lt->handle); lt->position+=nmemb; return(nmemb); } static int lt_emit_u24(struct lt_trace *lt, int value) { unsigned char buf[3]; int nmemb; buf[0] = (value>>16) & 0xff; buf[1] = (value>>8) & 0xff; buf[2] = value & 0xff; nmemb=fwrite(buf, sizeof(char), 3, lt->handle); lt->position+=nmemb; return(nmemb); } static int lt_emit_u32(struct lt_trace *lt, int value) { unsigned char buf[4]; int nmemb; buf[0] = (value>>24) & 0xff; buf[1] = (value>>16) & 0xff; buf[2] = (value>>8) & 0xff; buf[3] = value & 0xff; nmemb=fwrite(buf, sizeof(char), 4, lt->handle); lt->position+=nmemb; return(nmemb); } static int lt_emit_u64(struct lt_trace *lt, int valueh, int valuel) { int rc; if((rc=lt_emit_u32(lt, valueh))) { rc=lt_emit_u32(lt, valuel); } return(rc); } static int lt_emit_double(struct lt_trace *lt, double value) { int nmemb; nmemb=fwrite(&value, sizeof(char), sizeof(double)/sizeof(char), lt->handle); lt->position+=nmemb; return(nmemb); } static int lt_emit_string(struct lt_trace *lt, char *value) { int rc=1; do { rc&=lt_emit_u8(lt, *value); } while(*(value++)); return(rc); } /* * gzfunctions which emit various big endian * data to a file. (lt->position needs to be * fixed up on gzclose so the tables don't * get out of sync!) */ static int lt_emit_u8z(struct lt_trace *lt, int value) { unsigned char buf[1]; int nmemb; buf[0] = value & 0xff; nmemb=gzwrite(lt->zhandle, buf, 1); lt->zpackcount++; lt->position++; return(nmemb); } static int lt_emit_u16z(struct lt_trace *lt, int value) { unsigned char buf[2]; int nmemb; buf[0] = (value>>8) & 0xff; buf[1] = value & 0xff; nmemb = gzwrite(lt->zhandle, buf, 2); lt->zpackcount+=2; lt->position+=2; return(nmemb); } static int lt_emit_u24z(struct lt_trace *lt, int value) { unsigned char buf[3]; int nmemb; buf[0] = (value>>16) & 0xff; buf[1] = (value>>8) & 0xff; buf[2] = value & 0xff; nmemb=gzwrite(lt->zhandle, buf, 3); lt->zpackcount+=3; lt->position+=3; return(nmemb); } static int lt_emit_u32z(struct lt_trace *lt, int value) { unsigned char buf[4]; int nmemb; buf[0] = (value>>24) & 0xff; buf[1] = (value>>16) & 0xff; buf[2] = (value>>8) & 0xff; buf[3] = value & 0xff; nmemb=gzwrite(lt->zhandle, buf, 4); lt->zpackcount+=4; lt->position+=4; return(nmemb); } static int lt_emit_u64z(struct lt_trace *lt, int valueh, int valuel) { int rc; if((rc=lt_emit_u32z(lt, valueh))) { rc=lt_emit_u32z(lt, valuel); } return(rc); } static int lt_emit_doublez(struct lt_trace *lt, double value) { int nmemb; nmemb=gzwrite(lt->zhandle, &value, sizeof(double)/sizeof(char)); lt->zpackcount+=(sizeof(double)/sizeof(char)); lt->position+=(sizeof(double)/sizeof(char));; return(nmemb); } static int lt_emit_stringz(struct lt_trace *lt, char *value) { int rc=1; do { rc&=lt_emit_u8z(lt, *value); } while(*(value++)); return(rc); } /* * bz2functions which emit various big endian * data to a file. (lt->position needs to be * fixed up on BZ2_bzclose so the tables don't * get out of sync!) */ static int lt_emit_u8bz(struct lt_trace *lt, int value) { unsigned char buf[1]; int nmemb; buf[0] = value & 0xff; nmemb=BZ2_bzwrite(lt->zhandle, buf, 1); lt->zpackcount++; lt->position++; return(nmemb); } static int lt_emit_u16bz(struct lt_trace *lt, int value) { unsigned char buf[2]; int nmemb; buf[0] = (value>>8) & 0xff; buf[1] = value & 0xff; nmemb = BZ2_bzwrite(lt->zhandle, buf, 2); lt->zpackcount+=2; lt->position+=2; return(nmemb); } static int lt_emit_u24bz(struct lt_trace *lt, int value) { unsigned char buf[3]; int nmemb; buf[0] = (value>>16) & 0xff; buf[1] = (value>>8) & 0xff; buf[2] = value & 0xff; nmemb=BZ2_bzwrite(lt->zhandle, buf, 3); lt->zpackcount+=3; lt->position+=3; return(nmemb); } static int lt_emit_u32bz(struct lt_trace *lt, int value) { unsigned char buf[4]; int nmemb; buf[0] = (value>>24) & 0xff; buf[1] = (value>>16) & 0xff; buf[2] = (value>>8) & 0xff; buf[3] = value & 0xff; nmemb=BZ2_bzwrite(lt->zhandle, buf, 4); lt->zpackcount+=4; lt->position+=4; return(nmemb); } static int lt_emit_u64bz(struct lt_trace *lt, int valueh, int valuel) { int rc; if((rc=lt_emit_u32bz(lt, valueh))) { rc=lt_emit_u32bz(lt, valuel); } return(rc); } static int lt_emit_doublebz(struct lt_trace *lt, double value) { int nmemb; nmemb=BZ2_bzwrite(lt->zhandle, &value, sizeof(double)/sizeof(char)); lt->zpackcount+=(sizeof(double)/sizeof(char)); lt->position+=(sizeof(double)/sizeof(char));; return(nmemb); } static int lt_emit_stringbz(struct lt_trace *lt, char *value) { int rc=1; do { rc&=lt_emit_u8bz(lt, *value); } while(*(value++)); return(rc); } /* * switch between compression modes above */ static void lt_set_zmode(struct lt_trace *lt, int mode) { switch(mode) { case LT_ZMODE_NONE: lt->lt_emit_u8 = lt_emit_u8; lt->lt_emit_u16 = lt_emit_u16; lt->lt_emit_u24 = lt_emit_u24; lt->lt_emit_u32 = lt_emit_u32; lt->lt_emit_u64 = lt_emit_u64; lt->lt_emit_double = lt_emit_double; lt->lt_emit_string = lt_emit_string; break; case LT_ZMODE_GZIP: lt->lt_emit_u8 = lt_emit_u8z; lt->lt_emit_u16 = lt_emit_u16z; lt->lt_emit_u24 = lt_emit_u24z; lt->lt_emit_u32 = lt_emit_u32z; lt->lt_emit_u64 = lt_emit_u64z; lt->lt_emit_double = lt_emit_doublez; lt->lt_emit_string = lt_emit_stringz; break; case LT_ZMODE_BZIP2: lt->lt_emit_u8 = lt_emit_u8bz; lt->lt_emit_u16 = lt_emit_u16bz; lt->lt_emit_u24 = lt_emit_u24bz; lt->lt_emit_u32 = lt_emit_u32bz; lt->lt_emit_u64 = lt_emit_u64bz; lt->lt_emit_double = lt_emit_doublebz; lt->lt_emit_string = lt_emit_stringbz; break; } } /* * hash/symtable manipulation */ static int lt_hash(const char *s) { const char *p; char ch; unsigned int h=0, h2=0, pos=0, g; for(p=s;*p;p++) { ch=*p; h2<<=3; h2-=((unsigned int)ch+(pos++)); /* this handles stranded vectors quite well.. */ h=(h<<4)+ch; if((g=h&0xf0000000)) { h=h^(g>>24); h=h^g; } } h^=h2; /* combine the two hashes */ return(h%LT_SYMPRIME); } static struct lt_symbol *lt_symadd(struct lt_trace *lt, const char *name, int hv) { struct lt_symbol *s; s=(struct lt_symbol *)calloc(1,sizeof(struct lt_symbol)); strcpy(s->name=(char *)malloc((s->namlen=strlen(name))+1),name); s->next=lt->sym[hv]; lt->sym[hv]=s; return(s); } static struct lt_symbol *lt_symfind(struct lt_trace *lt, const char *s) { int hv; struct lt_symbol *temp; hv=lt_hash(s); if(!(temp=lt->sym[hv])) return(NULL); /* no hash entry, add here wanted to add */ while(temp) { if(!strcmp(temp->name,s)) { return(temp); /* in table already */ } if(!temp->next) break; temp=temp->next; } return(NULL); /* not found, add here if you want to add*/ } /* * compress facs to a prefix count + string + 0x00 */ static void lt_compress_fac(struct lt_trace *lt, char *str) { int i; int len = strlen(str); int minlen = (lencompress_fac_len) ? len : lt->compress_fac_len; if(minlen>65535) minlen=65535; /* keep in printable range--most hierarchies won't be this big anyway */ if(lt->compress_fac_str) { for(i=0;icompress_fac_str[i]!=str[i]) break; } lt_emit_u16z(lt, i); lt_emit_stringz(lt, str+i); free(lt->compress_fac_str); } else { lt_emit_u16z(lt, 0); lt_emit_stringz(lt, str); } lt->compress_fac_str = (char *) malloc((lt->compress_fac_len=len)+1); strcpy(lt->compress_fac_str, str); } static void strip_brack(struct lt_symbol *s) { char *lastch = s->name+s->namlen - 1; if(*lastch!=']') return; if(s->namlen<3) return; lastch--; while(lastch!=s->name) { if(*lastch=='.') { return; /* MTI SV [0.3] notation for implicit vars */ } if(*lastch=='[') { *lastch=0x00; return; } lastch--; } return; } static void lt_emitfacs(struct lt_trace *lt) { int i; if((lt)&&(lt->numfacs)) { struct lt_symbol *s = lt->symchain; char is_interlaced_trace = (lt->sorted_facs==NULL); if(!lt->sorted_facs) { if((lt->sorted_facs = (struct lt_symbol **)calloc(lt->numfacs, sizeof(struct lt_symbol *)))) { if(lt->do_strip_brackets) for(i=0;inumfacs;i++) { lt->sorted_facs[lt->numfacs - i - 1] = s; /* facs were chained backwards so reverse to restore bitslicing */ strip_brack(s); s=s->symchain; } else for(i=0;inumfacs;i++) { lt->sorted_facs[lt->numfacs - i - 1] = s; /* facs were chained backwards so reverse to restore bitslicing*/ s=s->symchain; } wave_msort(lt->sorted_facs, lt->numfacs); for(i=0;inumfacs;i++) { lt->sorted_facs[i]->facnum = i; } } } if(lt->sorted_facs) { lt->facname_offset=lt->position; lt_emit_u32(lt, lt->numfacs); /* uncompressed */ lt_emit_u32(lt, lt->numfacbytes); /* uncompressed */ fflush(lt->handle); lt->zfacname_size = lt->position; lt->zhandle = gzdopen(dup(fileno(lt->handle)), "wb9"); lt->zpackcount = 0; for(i=0;inumfacs;i++) { lt_compress_fac(lt, lt->sorted_facs[i]->name); } free(lt->compress_fac_str); lt->compress_fac_str=NULL; lt->compress_fac_len=0; lt->zfacname_predec_size = lt->zpackcount; gzclose(lt->zhandle); fseeko(lt->handle, 0L, SEEK_END); lt->position=ftello(lt->handle); lt->zfacname_size = lt->position - lt->zfacname_size; lt->zhandle = gzdopen(dup(fileno(lt->handle)), "wb9"); lt->facgeometry_offset = lt->position; for(i=0;inumfacs;i++) { if((lt->sorted_facs[i]->flags<_SYM_F_ALIAS)==0) { lt_emit_u32z(lt, lt->sorted_facs[i]->rows); lt_emit_u32z(lt, lt->sorted_facs[i]->msb); lt_emit_u32z(lt, lt->sorted_facs[i]->lsb); lt_emit_u32z(lt, lt->sorted_facs[i]->flags); } else { lt_emit_u32z(lt, lt->sorted_facs[i]->aliased_to->facnum); lt_emit_u32z(lt, lt->sorted_facs[i]->msb); lt_emit_u32z(lt, lt->sorted_facs[i]->lsb); lt_emit_u32z(lt, LT_SYM_F_ALIAS); } } gzclose(lt->zhandle); fseeko(lt->handle, 0L, SEEK_END); lt->position=ftello(lt->handle); lt->zfacgeometry_size = lt->position - lt->facgeometry_offset; if(is_interlaced_trace) { lt->zhandle = gzdopen(dup(fileno(lt->handle)), "wb9"); lt->sync_table_offset = lt->position; for(i=0;inumfacs;i++) { lt_emit_u32z(lt, lt->sorted_facs[i]->last_change); } gzclose(lt->zhandle); lt->zhandle = NULL; fseeko(lt->handle, 0L, SEEK_END); lt->position=ftello(lt->handle); lt->zsync_table_size = lt->position - lt->sync_table_offset; } } } } /* * initialize the trace and get back an lt context */ struct lt_trace *lt_init(const char *name) { struct lt_trace *lt=(struct lt_trace *)calloc(1, sizeof(struct lt_trace)); if(!(lt->handle=fopen(name, "wb"))) { free(lt); lt=NULL; } else { lt_emit_u16(lt, LT_HDRID); lt_emit_u16(lt, LT_VERSION); lt->change_field_offset = lt->position; lt->initial_value = -1; /* if a user sets this it will have a different POSITIVE val */ lt->timescale = -256; /* will be in range of -128<=x<=127 if set */ lt_set_zmode(lt, LT_ZMODE_NONE); lt->mintime=ULLDescriptor(1); lt->maxtime=ULLDescriptor(0); } return(lt); } /* * clock flushing.. */ static void lt_flushclock(struct lt_trace *lt, struct lt_symbol *s) { unsigned int last_change_delta = lt->position - s->last_change - 2; unsigned int start_position = lt->position; int tag; int numbytes, numbytes_trans; int numtrans = s->clk_numtrans - LT_CLKPACK - 1; if(numtrans<0) { /* it never got around to caching */ fprintf(stderr, "Possible Problem with %s with %d?\n", s->name, s->clk_numtrans); return; } if(numtrans >= 256*65536) { numbytes_trans = 3; } else if(numtrans >= 65536) { numbytes_trans = 2; } else if(numtrans >= 256) { numbytes_trans = 1; } else { numbytes_trans = 0; } if(!lt->numfacs_bytes) { if(last_change_delta >= 256*65536) { numbytes = 3; } else if(last_change_delta >= 65536) { numbytes = 2; } else if(last_change_delta >= 256) { numbytes = 1; } else { numbytes = 0; } tag = (numbytes<<4) + 0xC + numbytes_trans; /* yields xC..xF */ lt->lt_emit_u8(lt, tag); switch(numbytes&3) { case 0: lt->lt_emit_u8(lt, last_change_delta); break; case 1: lt->lt_emit_u16(lt, last_change_delta); break; case 2: lt->lt_emit_u24(lt, last_change_delta); break; case 3: lt->lt_emit_u32(lt, last_change_delta); break; } } else { tag = 0xC + numbytes_trans; /* yields C..F */ switch(lt->numfacs_bytes) { case 1: lt->lt_emit_u8(lt, s->facnum); break; case 2: lt->lt_emit_u16(lt, s->facnum); break; case 3: lt->lt_emit_u24(lt, s->facnum); break; case 4: lt->lt_emit_u32(lt, s->facnum); break; } lt->lt_emit_u8(lt, tag); } s->last_change = start_position; /* s->clk_prevval CAN BE INFERRED! */ /* s->clk_prevtrans CAN BE INFERRED! */ /* s->clk_delta CAN BE INFERRED! */ switch(numbytes_trans&3) { case 0: lt->lt_emit_u8(lt, numtrans); break; case 1: lt->lt_emit_u16(lt, numtrans); break; case 2: lt->lt_emit_u24(lt, numtrans); break; case 3: lt->lt_emit_u32(lt, numtrans); break; } /* printf("Clock finish for '%s' at %lld ending with '%c' for %d repeats over a switch delta of %d\n", s->name, lt->timeval, s->clk_prevval, s->clk_numtrans - LT_CLKPACK, s->clk_delta); */ s->clk_prevtrans = ULLDescriptor(~0); s->clk_numtrans = 0; } static void lt_flushclock_m(struct lt_trace *lt, struct lt_symbol *s) { unsigned int last_change_delta = lt->position - s->last_change - 2; unsigned int start_position = lt->position; int tag; int numbytes, numbytes_trans; int numtrans = s->clk_numtrans - LT_CLKPACK_M - 1; if(numtrans<0) { /* it never got around to caching */ fprintf(stderr, "Possible Problem with %s with %d?\n", s->name, s->clk_numtrans); return; } if(numtrans >= 256*65536) { numbytes_trans = 3; } else if(numtrans >= 65536) { numbytes_trans = 2; } else if(numtrans >= 256) { numbytes_trans = 1; } else { numbytes_trans = 0; } if(!lt->numfacs_bytes) { if(last_change_delta >= 256*65536) { numbytes = 3; } else if(last_change_delta >= 65536) { numbytes = 2; } else if(last_change_delta >= 256) { numbytes = 1; } else { numbytes = 0; } tag = (numbytes<<4) + 0xC + numbytes_trans; /* yields xC..xF */ lt->lt_emit_u8(lt, tag); switch(numbytes&3) { case 0: lt->lt_emit_u8(lt, last_change_delta); break; case 1: lt->lt_emit_u16(lt, last_change_delta); break; case 2: lt->lt_emit_u24(lt, last_change_delta); break; case 3: lt->lt_emit_u32(lt, last_change_delta); break; } } else { tag = 0xC + numbytes_trans; /* yields C..F */ switch(lt->numfacs_bytes) { case 1: lt->lt_emit_u8(lt, s->facnum); break; case 2: lt->lt_emit_u16(lt, s->facnum); break; case 3: lt->lt_emit_u24(lt, s->facnum); break; case 4: lt->lt_emit_u32(lt, s->facnum); break; } lt->lt_emit_u8(lt, tag); } s->last_change = start_position; /* s->clk_prevval CAN BE INFERRED! */ /* s->clk_prevtrans CAN BE INFERRED! */ /* s->clk_delta CAN BE INFERRED! */ switch(numbytes_trans&3) { case 0: lt->lt_emit_u8(lt, numtrans); break; case 1: lt->lt_emit_u16(lt, numtrans); break; case 2: lt->lt_emit_u24(lt, numtrans); break; case 3: lt->lt_emit_u32(lt, numtrans); break; } /* printf("Clock finish for '%s' at %lld ending with '%08x' for %d repeats over a switch delta of %lld\n", s->name, lt->timeval, s->clk_prevval, s->clk_numtrans - LT_CLKPACK_M, s->clk_delta); */ s->clk_prevtrans = ULLDescriptor(~0); s->clk_numtrans = 0; } /* * recurse through dictionary */ static void lt_recurse_dictionary(struct lt_trace *lt, dslxt_Tree *ds) { if(ds->left) lt_recurse_dictionary(lt, ds->left); lt->sorted_dict[ds->val] = ds; if(ds->right) lt_recurse_dictionary(lt, ds->right); } static void lt_recurse_dictionary_free(struct lt_trace *lt, dslxt_Tree *ds) { dslxt_Tree *lft = ds->left; dslxt_Tree *rgh = ds->right; if(lft) lt_recurse_dictionary_free(lt, lft); free(ds->item); free(ds); if(rgh) lt_recurse_dictionary_free(lt, rgh); } static int lt_dictval_compare(const void *v1, const void *v2) { const dslxt_Tree *s1 = *(const dslxt_Tree * const *)v1; const dslxt_Tree *s2 = *(const dslxt_Tree * const *)v2; if(s1->val > s2->val) return(1); else return(-1); /* they're *never* equal */ } static void lt_finalize_dictionary(struct lt_trace *lt) { unsigned int i; lt->sorted_dict = calloc(lt->num_dict_entries, sizeof(dslxt_Tree *)); lt->dictionary_offset=lt->position; lt_emit_u32(lt, lt->num_dict_entries); /* uncompressed */ lt_emit_u32(lt, lt->dict_string_mem_required - lt->num_dict_entries); /* uncompressed : minus because leading '1' is implied so its stripped */ lt_emit_u32(lt, lt->dict16_offset); /* uncompressed */ lt_emit_u32(lt, lt->dict24_offset); /* uncompressed */ lt_emit_u32(lt, lt->dict32_offset); /* uncompressed */ lt_emit_u32(lt, lt->mindictwidth); /* uncompressed */ fflush(lt->handle); #if 0 fprintf(stderr, "*** dictionary_offset = %08x\n", lt->dictionary_offset); fprintf(stderr, "*** num_dict_entries = %d\n", lt->num_dict_entries); #endif lt->zdictionary_size = lt->position; lt->zhandle = gzdopen(dup(fileno(lt->handle)), "wb9"); lt_recurse_dictionary(lt, lt->dict); qsort((void *)lt->sorted_dict, lt->num_dict_entries, sizeof(struct dsTree **), lt_dictval_compare); for(i=0;inum_dict_entries;i++) { dslxt_Tree *ds = lt->sorted_dict[i]; /* fprintf(stderr, "%8d) '%s'\n", ds->val, ds->item); */ lt_emit_stringz(lt, ds->item+1); } gzclose(lt->zhandle); fseeko(lt->handle, 0L, SEEK_END); lt->position=ftello(lt->handle); lt->zdictionary_size = lt->position - lt->zdictionary_size; free(lt->sorted_dict); lt->sorted_dict = NULL; lt_recurse_dictionary_free(lt, lt->dict); lt->dict = NULL; } /* * close out the trace and fixate it */ void lt_close(struct lt_trace *lt) { lxttime_t lasttime=ULLDescriptor(0); int lastposition=0; char is64=0; if(lt) { struct lt_symbol *s = lt->symchain; if(lt->clock_compress) while(s) { if(s->clk_prevtrans!=ULLDescriptor(~0)) { int len = ((s->flags)<_SYM_F_INTEGER) ? 32 : s->len; if(len>1) { if(s->clk_numtrans > LT_CLKPACK_M) lt_flushclock_m(lt, s); } else { if(s->clk_numtrans > LT_CLKPACK) lt_flushclock(lt, s); } } s=s->symchain; } lt_set_dumpon(lt); /* in case it was turned off */ if(lt->zmode!=LT_ZMODE_NONE) { lt->chg_table_size = lt->position - lt->change_field_offset; switch(lt->zmode) { case LT_ZMODE_GZIP: gzclose(lt->zhandle); break; case LT_ZMODE_BZIP2: BZ2_bzclose(lt->zhandle); break; } lt->zhandle = NULL; fseeko(lt->handle, 0L, SEEK_END); lt->position=ftello(lt->handle); lt_set_zmode(lt, LT_ZMODE_NONE); lt->zchg_table_size = lt->position - lt->change_field_offset; } lt_emitfacs(lt); if(lt->dict) lt_finalize_dictionary(lt); free(lt->timebuff); lt->timebuff=NULL; if(lt->timehead) { struct lt_timetrail *t=lt->timehead; struct lt_timetrail *t2; lt->time_table_offset = lt->position; lt_emit_u32(lt, lt->timechangecount); /* this is uncompressed! */ fflush(lt->handle); lt->zhandle = gzdopen(dup(fileno(lt->handle)), "wb9"); lt->ztime_table_size = lt->position; is64=(lt->maxtime > ULLDescriptor(0xFFFFFFFF)); if(is64) { lt_emit_u64z(lt, (int)((lt->mintime)>>32), (int)lt->mintime); lt_emit_u64z(lt, (int)((lt->maxtime)>>32), (int)lt->maxtime); } else { lt_emit_u32z(lt, (int)lt->mintime); lt_emit_u32z(lt, (int)lt->maxtime); } while(t) { lt_emit_u32z(lt, t->position - lastposition); lastposition = t->position; t=t->next; } t=lt->timehead; if(is64) { while(t) { lxttime_t delta = t->timeval - lasttime; lt_emit_u64z(lt, (int)(delta>>32), (int)delta); lasttime = t->timeval; t2=t->next; free(t); t=t2; } } else { while(t) { lt_emit_u32z(lt, (int)(t->timeval - lasttime)); lasttime = t->timeval; t2=t->next; free(t); t=t2; } lt->timehead = lt->timecurr = NULL; } gzclose(lt->zhandle); lt->zhandle = NULL; fseeko(lt->handle, 0L, SEEK_END); lt->position=ftello(lt->handle); lt->ztime_table_size = lt->position - lt->ztime_table_size; } if(lt->initial_value>=0) { lt->initial_value_offset = lt->position; lt_emit_u8(lt, lt->initial_value); } if((lt->timescale>-129)&&(lt->timescale<128)) { lt->timescale_offset = lt->position; lt_emit_u8(lt, lt->timescale); } if(lt->double_used) { lt->double_test_offset = lt->position; lt_emit_double(lt, 3.14159); } if(lt->dumpoffcount) { struct lt_timetrail *ltt = lt->dumpoffhead; struct lt_timetrail *ltt2; lt->exclude_offset = lt->position; lt_emit_u32(lt, lt->dumpoffcount); while(ltt) { lt_emit_u64(lt, (int)((ltt->timeval)>>32), (int)ltt->timeval); ltt2 = ltt; ltt=ltt->next; free(ltt2); } lt->dumpoffhead = lt->dumpoffcurr = NULL; lt->dumpoffcount = 0; } if(lt->timezero) { lt->timezero_offset = lt->position; lt_emit_u64(lt, (int)((lt->timezero)>>32), (int)lt->timezero); } /* prefix */ lt_emit_u8(lt, LT_SECTION_END); /* Version 1 */ if(lt->change_field_offset) { lt_emit_u32(lt, lt->change_field_offset); lt_emit_u8(lt, LT_SECTION_CHG); lt->change_field_offset = 0; } if(lt->sync_table_offset) { lt_emit_u32(lt, lt->sync_table_offset); lt_emit_u8(lt, LT_SECTION_SYNC_TABLE); lt->sync_table_offset = 0; } if(lt->facname_offset) { lt_emit_u32(lt, lt->facname_offset); lt_emit_u8(lt, LT_SECTION_FACNAME); lt->facname_offset = 0; } if(lt->facgeometry_offset) { lt_emit_u32(lt, lt->facgeometry_offset); lt_emit_u8(lt, LT_SECTION_FACNAME_GEOMETRY); lt->facgeometry_offset = 0; } if(lt->timescale_offset) { lt_emit_u32(lt, lt->timescale_offset); lt_emit_u8(lt, LT_SECTION_TIMESCALE); lt->timescale_offset = 0; } if(lt->time_table_offset) { lt_emit_u32(lt, lt->time_table_offset); lt_emit_u8(lt, is64 ? LT_SECTION_TIME_TABLE64 : LT_SECTION_TIME_TABLE); lt->time_table_offset = 0; } if(lt->initial_value_offset) { lt_emit_u32(lt, lt->initial_value_offset); lt_emit_u8(lt, LT_SECTION_INITIAL_VALUE); lt->initial_value_offset = 0; } if(lt->double_test_offset) { lt_emit_u32(lt, lt->double_test_offset); lt_emit_u8(lt, LT_SECTION_DOUBLE_TEST); lt->double_test_offset = 0; } /* Version 2 adds */ if(lt->zfacname_predec_size) { lt_emit_u32(lt, lt->zfacname_predec_size); lt_emit_u8(lt, LT_SECTION_ZFACNAME_PREDEC_SIZE); lt->zfacname_predec_size = 0; } if(lt->zfacname_size) { lt_emit_u32(lt, lt->zfacname_size); lt_emit_u8(lt, LT_SECTION_ZFACNAME_SIZE); lt->zfacname_size = 0; } if(lt->zfacgeometry_size) { lt_emit_u32(lt, lt->zfacgeometry_size); lt_emit_u8(lt, LT_SECTION_ZFACNAME_GEOMETRY_SIZE); lt->zfacgeometry_size = 0; } if(lt->zsync_table_size) { lt_emit_u32(lt, lt->zsync_table_size); lt_emit_u8(lt, LT_SECTION_ZSYNC_SIZE); lt->zsync_table_size = 0; } if(lt->ztime_table_size) { lt_emit_u32(lt, lt->ztime_table_size); lt_emit_u8(lt, LT_SECTION_ZTIME_TABLE_SIZE); lt->ztime_table_size = 0; } if(lt->chg_table_size) { lt_emit_u32(lt, lt->chg_table_size); lt_emit_u8(lt, LT_SECTION_ZCHG_PREDEC_SIZE); lt->chg_table_size = 0; } if(lt->zchg_table_size) { lt_emit_u32(lt, lt->zchg_table_size); lt_emit_u8(lt, LT_SECTION_ZCHG_SIZE); lt->zchg_table_size = 0; } /* Version 4 adds */ if(lt->dictionary_offset) { lt_emit_u32(lt, lt->dictionary_offset); lt_emit_u8(lt, LT_SECTION_ZDICTIONARY); lt->dictionary_offset = 0; } if(lt->zdictionary_size) { lt_emit_u32(lt, lt->zdictionary_size); lt_emit_u8(lt, LT_SECTION_ZDICTIONARY_SIZE); lt->zdictionary_size = 0; } /* Version 5 adds */ if(lt->exclude_offset) { lt_emit_u32(lt, lt->exclude_offset); lt_emit_u8(lt, LT_SECTION_EXCLUDE_TABLE); lt->exclude_offset = 0; } /* Version 6 adds */ if(lt->timezero_offset) { lt_emit_u32(lt, lt->timezero_offset); lt_emit_u8(lt, LT_SECTION_TIMEZERO); lt->timezero_offset = 0; } /* suffix */ lt_emit_u8(lt, LT_TRLID); if(lt->symchain) { struct lt_symbol *sc = lt->symchain; struct lt_symbol *s2; while(sc) { free(sc->name); s2=sc->symchain; free(sc); sc=s2; } } free(lt->sorted_facs); fclose(lt->handle); free(lt); } } /* * maint function for finding a symbol if it exists */ struct lt_symbol *lt_symbol_find(struct lt_trace *lt, const char *name) { struct lt_symbol *s=NULL; if((lt)&&(name)) s=lt_symfind(lt, name); return(s); } /* * add a trace (if it doesn't exist already) */ struct lt_symbol *lt_symbol_add(struct lt_trace *lt, const char *name, unsigned int rows, int msb, int lsb, int flags) { struct lt_symbol *s; int len; int flagcnt; if((!lt)||(lt->sorted_facs)) return(NULL); flagcnt = ((flags<_SYM_F_INTEGER)!=0) + ((flags<_SYM_F_DOUBLE)!=0) + ((flags<_SYM_F_STRING)!=0); if((flagcnt>1)||(!lt)||(!name)||(lt_symfind(lt, name))) return (NULL); if(flags<_SYM_F_DOUBLE) lt->double_used = 1; s=lt_symadd(lt, name, lt_hash(name)); s->rows = rows; s->flags = flags&(~LT_SYM_F_ALIAS); /* aliasing makes no sense here.. */ if(!flagcnt) { s->msb = msb; s->lsb = lsb; s->len = (msblen==1)&&(s->rows==0)) s->clk_prevtrans = ULLDescriptor(~0); } s->symchain = lt->symchain; lt->symchain = s; lt->numfacs++; if((len=strlen(name)) > lt->longestname) lt->longestname = len; lt->numfacbytes += (len+1); return(s); } /* * add an alias trace (if it doesn't exist already and orig is found) */ struct lt_symbol *lt_symbol_alias(struct lt_trace *lt, const char *existing_name, const char *alias, int msb, int lsb) { struct lt_symbol *s, *sa; int len; int bitlen; int flagcnt; if((!lt)||(!existing_name)||(!alias)||(!(s=lt_symfind(lt, existing_name)))||(lt_symfind(lt, alias))) return (NULL); if(lt->sorted_facs) return(NULL); while(s->aliased_to) /* find root alias */ { s=s->aliased_to; } flagcnt = ((s->flags<_SYM_F_INTEGER)!=0) + ((s->flags<_SYM_F_DOUBLE)!=0) + ((s->flags<_SYM_F_STRING)!=0); bitlen = (msblen)) return(NULL); sa=lt_symadd(lt, alias, lt_hash(alias)); sa->flags = LT_SYM_F_ALIAS; /* only point this can get set */ sa->aliased_to = s; if(!flagcnt) { sa->msb = msb; sa->lsb = lsb; sa->len = bitlen; } sa->symchain = lt->symchain; lt->symchain = sa; lt->numfacs++; if((len=strlen(alias)) > lt->longestname) lt->longestname = len; lt->numfacbytes += (len+1); return(sa); } /* * set current time */ int lt_inc_time_by_delta(struct lt_trace *lt, unsigned int timeval) { return(lt_set_time64(lt, lt->maxtime + (lxttime_t)timeval)); } int lt_set_time(struct lt_trace *lt, unsigned int timeval) { return(lt_set_time64(lt, (lxttime_t)timeval)); } int lt_inc_time_by_delta64(struct lt_trace *lt, lxttime_t timeval) { return(lt_set_time64(lt, lt->maxtime + timeval)); } int lt_set_time64(struct lt_trace *lt, lxttime_t timeval) { int rc=0; if(lt) { struct lt_timetrail *trl=(struct lt_timetrail *)calloc(1, sizeof(struct lt_timetrail)); if(trl) { trl->timeval = timeval; trl->position = lt->position; if((lt->timecurr)||(lt->timebuff)) { if(((timeval>lt->mintime)&&(timeval>lt->maxtime))||((lt->mintime==ULLDescriptor(1))&&(lt->maxtime==ULLDescriptor(0)))) { lt->maxtime = timeval; } else { free(trl); goto bail; } } else { lt->mintime = lt->maxtime = timeval; } free(lt->timebuff); lt->timebuff = trl; lt->timeval = timeval; rc=1; } } bail: return(rc); } /* * sets trace timescale as 10**x seconds */ void lt_set_timescale(struct lt_trace *lt, int timescale) { if(lt) { lt->timescale = timescale; } } /* * sets clock compression heuristic */ void lt_set_clock_compress(struct lt_trace *lt) { if(lt) { lt->clock_compress = 1; } } /* * sets change dump compression */ void lt_set_chg_compress(struct lt_trace *lt) { if(lt) { if((lt->zmode==LT_ZMODE_NONE)&&(!lt->emitted)) { lt_set_zmode(lt, lt->zmode = LT_ZMODE_GZIP); fflush(lt->handle); lt->zhandle = gzdopen(dup(fileno(lt->handle)), "wb9"); } } } /* * sets change dictionary compression */ void lt_set_dict_compress(struct lt_trace *lt, unsigned int minwidth) { if((lt)&&(!lt->emitted)) { lt->dictmode = 1; if(minwidth>1) { lt->mindictwidth = minwidth; } } } /* * sets change interlace */ void lt_set_no_interlace(struct lt_trace *lt) { if((lt)&&(!lt->emitted)&&(!lt->sorted_facs)) { if(lt->zmode==LT_ZMODE_NONE) /* this mode implies BZIP2 compression! */ { lt_set_zmode(lt, lt->zmode = LT_ZMODE_BZIP2); fflush(lt->handle); lt->zhandle = BZ2_bzdopen(dup(fileno(lt->handle)), "wb9"); } if((lt->sorted_facs = (struct lt_symbol **)calloc(lt->numfacs, sizeof(struct lt_symbol *)))) { struct lt_symbol *s = lt->symchain; int i; if(lt->do_strip_brackets) for(i=0;inumfacs;i++) { lt->sorted_facs[lt->numfacs - i - 1] = s; /* facs were chained backwards so reverse to restore bitslicing */ strip_brack(s); s=s->symchain; } else for(i=0;inumfacs;i++) { lt->sorted_facs[lt->numfacs - i - 1] = s; /* facs were chained backwards so reverse to restore bitslicing */ s=s->symchain; } wave_msort(lt->sorted_facs, lt->numfacs); for(i=0;inumfacs;i++) { lt->sorted_facs[i]->facnum = i; } if(lt->numfacs >= 256*65536) { lt->numfacs_bytes = 4; } else if(lt->numfacs >= 65536) { lt->numfacs_bytes = 3; } else if(lt->numfacs >= 256) { lt->numfacs_bytes = 2; } else { lt->numfacs_bytes = 1; } } } } /* * sets trace initial value */ void lt_set_initial_value(struct lt_trace *lt, char value) { if(lt) { int tag; switch(value) { case '0': tag = 0; break; case '1': tag = 1; break; case 'Z': case 'z': tag = 2; break; case 'X': case 'x': tag = 3; break; case 'H': case 'h': tag = 4; break; case 'U': case 'u': tag = 5; break; case 'W': case 'w': tag = 6; break; case 'L': case 'l': tag = 0x7; break; case '-': tag = 0x8; break; default: tag = -1; break; } lt->initial_value = tag; } } /* * Sets bracket stripping (useful for VCD conversions of * bitblasted nets) */ void lt_symbol_bracket_stripping(struct lt_trace *lt, int doit) { if(lt) { lt->do_strip_brackets = (doit!=0); } } /* * emission for trace values.. */ static int lt_optimask[]= { 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff, 0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff }; static char *lt_expand_integer_to_bits(int len, int value) { static char s[33]; char *p = s; int i; len--; for(i=0;i<=len;i++) { *(p++) = '0' | ((value & (1<<(len-i)))!=0); } *p = 0; return(s); } int lt_emit_value_int(struct lt_trace *lt, struct lt_symbol *s, unsigned int row, int value) { int rc=0; if((!lt)||(!s)) return(rc); if(!lt->emitted) lt->emitted = 1; while(s->aliased_to) /* find root alias if exists */ { s=s->aliased_to; } if(!(s->flags&(LT_SYM_F_DOUBLE|LT_SYM_F_STRING))) { int numbytes; /* number of bytes to store value minus one */ unsigned int len = ((s->flags)<_SYM_F_INTEGER) ? 32 : s->len; unsigned int last_change_delta; if((lt->clock_compress)&&(s->rows==0)) { if((len>1)&&(len<=32)) { int ivalue = value; int delta1, delta2; s->clk_mask <<= 1; s->clk_mask |= 1; if( ((s->clk_mask&0x1f)==0x1f) && ( (delta1=(ivalue - s->clk_prevval1) & lt_optimask[s->len]) == ((s->clk_prevval1 - s->clk_prevval3) & lt_optimask[s->len]) ) && ( (delta2=(s->clk_prevval - s->clk_prevval2) & lt_optimask[s->len]) == ((s->clk_prevval2 - s->clk_prevval4) & lt_optimask[s->len]) ) && ( (delta1==delta2) || ((!delta1)&&(!delta2)) ) ) { if(s->clk_prevtrans==ULLDescriptor(~0)) { s->clk_prevtrans = lt->timeval; s->clk_numtrans = 0; } else if(s->clk_numtrans == 0) { s->clk_delta = lt->timeval - s->clk_prevtrans; s->clk_prevtrans = lt->timeval; s->clk_numtrans++; } else { if(s->clk_delta == (lt->timeval - s->clk_prevtrans)) { s->clk_numtrans++; s->clk_prevtrans = lt->timeval; if(s->clk_numtrans > LT_CLKPACK_M) { s->clk_prevval4 = s->clk_prevval3; s->clk_prevval3 = s->clk_prevval2; s->clk_prevval2 = s->clk_prevval1; s->clk_prevval1 = s->clk_prevval; s->clk_prevval = ivalue; /* printf("Clock value '%08x' for '%s' at %lld (#%d)\n", ivalue, s->name, lt->timeval, s->clk_numtrans); */ return(1); } } else { if(s->clk_numtrans > LT_CLKPACK_M) { lt_flushclock_m(lt, s); /* flush clock then continue below! */ } else { s->clk_prevtrans=ULLDescriptor(~0); } } } } else { if(s->clk_numtrans > LT_CLKPACK_M) { lt_flushclock_m(lt, s); /* flush clock then continue below! */ } else { s->clk_prevtrans=ULLDescriptor(~0); } } s->clk_prevval4 = s->clk_prevval3; s->clk_prevval3 = s->clk_prevval2; s->clk_prevval2 = s->clk_prevval1; s->clk_prevval1 = s->clk_prevval; s->clk_prevval = ivalue; } else if(len==1) /* possible clock handling */ { int ivalue = value&1; if(((s->clk_prevval == '1') && (ivalue==0)) || ((s->clk_prevval == '0') && (ivalue==1))) { if(s->clk_prevtrans==ULLDescriptor(~0)) { s->clk_prevtrans = lt->timeval; s->clk_numtrans = 0; } else if(s->clk_numtrans == 0) { s->clk_delta = lt->timeval - s->clk_prevtrans; s->clk_prevtrans = lt->timeval; s->clk_numtrans++; } else { if(s->clk_delta == (lt->timeval - s->clk_prevtrans)) { s->clk_numtrans++; s->clk_prevtrans = lt->timeval; if(s->clk_numtrans > LT_CLKPACK) { s->clk_prevval = ivalue + '0'; /* printf("Clock value '%d' for '%s' at %d (#%d)\n", ivalue, s->name, lt->timeval, s->clk_numtrans); */ return(1); } } else { if(s->clk_numtrans > LT_CLKPACK) { lt_flushclock(lt, s); /* flush clock then continue below! */ } else { s->clk_prevtrans=ULLDescriptor(~0); } } } } else { if(s->clk_numtrans > LT_CLKPACK) { lt_flushclock(lt, s); /* flush clock then continue below! */ } else { s->clk_prevtrans=ULLDescriptor(~0); } } s->clk_prevval = ivalue + '0'; } } /* normal trace handling */ last_change_delta = lt->position - s->last_change - 2; if(last_change_delta >= 256*65536) { numbytes = 3; } else if(last_change_delta >= 65536) { numbytes = 2; } else if(last_change_delta >= 256) { numbytes = 1; } else { numbytes = 0; } if(len<=32) { int start_position = lt->position; int tag; int optimized0 = ((value<_optimask[len])==0); int optimized1 = ((value<_optimask[len])==lt_optimask[len]); int optimized = optimized0|optimized1; if(!lt->numfacs_bytes) { if(optimized) { tag = (numbytes<<4) | (3+optimized1); /* for x3 and x4 cases */ } else { tag = (numbytes<<4); } lt->lt_emit_u8(lt, tag); switch(numbytes&3) { case 0: lt->lt_emit_u8(lt, last_change_delta); break; case 1: lt->lt_emit_u16(lt, last_change_delta); break; case 2: lt->lt_emit_u24(lt, last_change_delta); break; case 3: lt->lt_emit_u32(lt, last_change_delta); break; } } else { switch(lt->numfacs_bytes) { case 1: lt->lt_emit_u8(lt, s->facnum); break; case 2: lt->lt_emit_u16(lt, s->facnum); break; case 3: lt->lt_emit_u24(lt, s->facnum); break; case 4: lt->lt_emit_u32(lt, s->facnum); break; } lt->lt_emit_u8(lt, optimized ? (3+optimized1) : 0); } s->last_change = start_position; if(s->rows>0) { if(s->rows >= 256*65536) { numbytes = 3; } else if(s->rows >= 65536) { numbytes = 2; } else if(s->rows >= 256) { numbytes = 1; } else { numbytes = 0; } switch(numbytes&3) { case 0: lt->lt_emit_u8(lt, row); break; case 1: lt->lt_emit_u16(lt, row); break; case 2: lt->lt_emit_u24(lt, row); break; case 3: lt->lt_emit_u32(lt, row); break; } } if(!optimized) { if((lt->dictmode)&&(len>lt->mindictwidth)) { char *vpnt_orig = lt_expand_integer_to_bits(len, value); char *vpnt = vpnt_orig; while ( (*vpnt == '0') && (*(vpnt+1)) ) vpnt++; lt->dict = dslxt_splay (vpnt, lt->dict); if(!dslxt_success) { unsigned int vlen = strlen(vpnt)+1; char *vcopy = (char *)malloc(vlen); strcpy(vcopy, vpnt); lt->dict_string_mem_required += vlen; lt->dict = dslxt_insert(vcopy, lt->dict, lt->num_dict_entries); if(!lt->dict16_offset) { if(lt->num_dict_entries==256) lt->dict16_offset = lt->position; } else if(!lt->dict24_offset) { if(lt->num_dict_entries==65536) lt->dict24_offset = lt->position; } else if(!lt->dict32_offset) { if(lt->num_dict_entries==(256*65536)) lt->dict32_offset = lt->position; } lt->num_dict_entries++; } if(lt->dict24_offset) { if(lt->dict32_offset) { lt->lt_emit_u32(lt, lt->dict->val); } else { lt->lt_emit_u24(lt, lt->dict->val); } } else { if(lt->dict16_offset) { lt->lt_emit_u16(lt, lt->dict->val); } else { lt->lt_emit_u8(lt, lt->dict->val); } } } else if(len<9) { value <<= (8-len); rc=lt->lt_emit_u8(lt, value); } else if(len<17) { value <<= (16-len); rc=lt->lt_emit_u16(lt, value); } else if(len<25) { value <<= (24-len); rc=lt->lt_emit_u24(lt, value); } else { value <<= (32-len); rc=lt->lt_emit_u32(lt, value); } } } if(lt->timebuff) { lt->timechangecount++; if(lt->timecurr) { lt->timecurr->next = lt->timebuff; lt->timecurr = lt->timebuff; } else { lt->timehead = lt->timecurr = lt->timebuff; } lt->timebuff=NULL; } } return(rc); } int lt_emit_value_double(struct lt_trace *lt, struct lt_symbol *s, unsigned int row, double value) { int rc=0; int start_position; int tag; if((!lt)||(!s)) return(rc); if(!lt->emitted) lt->emitted = 1; while(s->aliased_to) /* find root alias if exists */ { s=s->aliased_to; } if((s->flags)<_SYM_F_DOUBLE) { int numbytes; /* number of bytes to store value minus one */ unsigned int last_change_delta = lt->position - s->last_change - 2; if(!lt->numfacs_bytes) { if(last_change_delta >= 256*65536) { numbytes = 3; } else if(last_change_delta >= 65536) { numbytes = 2; } else if(last_change_delta >= 256) { numbytes = 1; } else { numbytes = 0; } start_position = lt->position; s->last_change = start_position; tag = (numbytes<<4); lt->lt_emit_u8(lt, tag); switch(numbytes&3) { case 0: lt->lt_emit_u8(lt, last_change_delta); break; case 1: lt->lt_emit_u16(lt, last_change_delta); break; case 2: lt->lt_emit_u24(lt, last_change_delta); break; case 3: lt->lt_emit_u32(lt, last_change_delta); break; } } else { switch(lt->numfacs_bytes) { case 1: lt->lt_emit_u8(lt, s->facnum); break; case 2: lt->lt_emit_u16(lt, s->facnum); break; case 3: lt->lt_emit_u24(lt, s->facnum); break; case 4: lt->lt_emit_u32(lt, s->facnum); break; } } if(s->rows>0) { if(s->rows >= 256*65536) { numbytes = 3; } else if(s->rows >= 65536) { numbytes = 2; } else if(s->rows >= 256) { numbytes = 1; } else { numbytes = 0; } switch(numbytes&3) { case 0: lt->lt_emit_u8(lt, row); break; case 1: lt->lt_emit_u16(lt, row); break; case 2: lt->lt_emit_u24(lt, row); break; case 3: lt->lt_emit_u32(lt, row); break; } } rc=lt->lt_emit_double(lt, value); if(lt->timebuff) { lt->timechangecount++; if(lt->timecurr) { lt->timecurr->next = lt->timebuff; lt->timecurr = lt->timebuff; } else { lt->timehead = lt->timecurr = lt->timebuff; } lt->timebuff=NULL; } } return(rc); } int lt_emit_value_string(struct lt_trace *lt, struct lt_symbol *s, unsigned int row, char *value) { int rc=0; int start_position; int tag; if((!lt)||(!s)||(!value)) return(rc); if(!lt->emitted) lt->emitted = 1; while(s->aliased_to) /* find root alias if exists */ { s=s->aliased_to; } if((s->flags)<_SYM_F_STRING) { int numbytes; /* number of bytes to store value minus one */ unsigned int last_change_delta = lt->position - s->last_change - 2; if(!lt->numfacs_bytes) { if(last_change_delta >= 256*65536) { numbytes = 3; } else if(last_change_delta >= 65536) { numbytes = 2; } else if(last_change_delta >= 256) { numbytes = 1; } else { numbytes = 0; } start_position = lt->position; s->last_change = start_position; tag = (numbytes<<4); lt->lt_emit_u8(lt, tag); switch(numbytes&3) { case 0: lt->lt_emit_u8(lt, last_change_delta); break; case 1: lt->lt_emit_u16(lt, last_change_delta); break; case 2: lt->lt_emit_u24(lt, last_change_delta); break; case 3: lt->lt_emit_u32(lt, last_change_delta); break; } } else { switch(lt->numfacs_bytes) { case 1: lt->lt_emit_u8(lt, s->facnum); break; case 2: lt->lt_emit_u16(lt, s->facnum); break; case 3: lt->lt_emit_u24(lt, s->facnum); break; case 4: lt->lt_emit_u32(lt, s->facnum); break; } } if(s->rows>0) { if(s->rows >= 256*65536) { numbytes = 3; } else if(s->rows >= 65536) { numbytes = 2; } else if(s->rows >= 256) { numbytes = 1; } else { numbytes = 0; } switch(numbytes&3) { case 0: lt->lt_emit_u8(lt, row); break; case 1: lt->lt_emit_u16(lt, row); break; case 2: lt->lt_emit_u24(lt, row); break; case 3: lt->lt_emit_u32(lt, row); break; } } rc=lt->lt_emit_string(lt, value); if(lt->timebuff) { lt->timechangecount++; if(lt->timecurr) { lt->timecurr->next = lt->timebuff; lt->timecurr = lt->timebuff; } else { lt->timehead = lt->timecurr = lt->timebuff; } lt->timebuff=NULL; } } return(rc); } int lt_emit_value_bit_string(struct lt_trace *lt, struct lt_symbol *s, unsigned int row, char *value) { int rc=0; int start_position; int tag, tagadd; if((!lt)||(!s)||(!value)||(!*value)) return(rc); if(!lt->emitted) lt->emitted = 1; while(s->aliased_to) /* find root alias if exists */ { s=s->aliased_to; } if(!(s->flags&(LT_SYM_F_DOUBLE|LT_SYM_F_STRING))) { int numbytes; /* number of bytes to store value minus one */ char *pnt; int mvl=0; char ch; char prevch; unsigned int last_change_delta; unsigned int len = ((s->flags)<_SYM_F_INTEGER) ? 32 : s->len; if((lt->clock_compress)&&(s->rows==0)) { if((len>1)&&(len<=32)) { int legal = 0; int ivalue = 0; unsigned int i; char *pntv = value; int delta1, delta2; for(i=0;i0)) { pntv--; } else { legal = 0; break; } } ivalue = (((unsigned int)ivalue) << 1); ivalue |= (*pntv & 1); legal = 1; pntv++; } s->clk_mask <<= 1; s->clk_mask |= legal; if( ((s->clk_mask&0x1f)==0x1f) && ( (delta1=(ivalue - s->clk_prevval1) & lt_optimask[s->len]) == ((s->clk_prevval1 - s->clk_prevval3) & lt_optimask[s->len]) ) && ( (delta2=(s->clk_prevval - s->clk_prevval2) & lt_optimask[s->len]) == ((s->clk_prevval2 - s->clk_prevval4) & lt_optimask[s->len]) ) && ( (delta1==delta2) || ((!delta1)&&(!delta2)) ) ) { if(s->clk_prevtrans==ULLDescriptor(~0)) { s->clk_prevtrans = lt->timeval; s->clk_numtrans = 0; } else if(s->clk_numtrans == 0) { s->clk_delta = lt->timeval - s->clk_prevtrans; s->clk_prevtrans = lt->timeval; s->clk_numtrans++; } else { if(s->clk_delta == (lt->timeval - s->clk_prevtrans)) { s->clk_numtrans++; s->clk_prevtrans = lt->timeval; if(s->clk_numtrans > LT_CLKPACK_M) { s->clk_prevval4 = s->clk_prevval3; s->clk_prevval3 = s->clk_prevval2; s->clk_prevval2 = s->clk_prevval1; s->clk_prevval1 = s->clk_prevval; s->clk_prevval = ivalue; /* printf("Clock value '%08x' for '%s' [len=%d] at %lld (#%d)\n", ivalue, s->name, len, lt->timeval, s->clk_numtrans); */ return(1); } } else { if(s->clk_numtrans > LT_CLKPACK_M) { lt_flushclock_m(lt, s); /* flush clock then continue below! */ } else { s->clk_prevtrans=ULLDescriptor(~0); } } } } else { if(s->clk_numtrans > LT_CLKPACK_M) { lt_flushclock_m(lt, s); /* flush clock then continue below! */ } else { s->clk_prevtrans=ULLDescriptor(~0); } } s->clk_prevval4 = s->clk_prevval3; s->clk_prevval3 = s->clk_prevval2; s->clk_prevval2 = s->clk_prevval1; s->clk_prevval1 = s->clk_prevval; s->clk_prevval = ivalue; } else if(len==1) /* possible clock handling */ { if(((s->clk_prevval == '1') && (value[0]=='0')) || ((s->clk_prevval == '0') && (value[0]=='1'))) { if(s->clk_prevtrans==ULLDescriptor(~0)) { s->clk_prevtrans = lt->timeval; s->clk_numtrans = 0; } else if(s->clk_numtrans == 0) { s->clk_delta = lt->timeval - s->clk_prevtrans; s->clk_prevtrans = lt->timeval; s->clk_numtrans++; } else { if(s->clk_delta == (lt->timeval - s->clk_prevtrans)) { s->clk_numtrans++; s->clk_prevtrans = lt->timeval; if(s->clk_numtrans > LT_CLKPACK) { s->clk_prevval = value[0]; /* printf("Clock value '%c' for '%s' at %lld (#%d)\n", value[0], s->name, lt->timeval, s->clk_numtrans); */ return(1); } } else { if(s->clk_numtrans > LT_CLKPACK) { lt_flushclock(lt, s); /* flush clock then continue below! */ } else { s->clk_prevtrans=ULLDescriptor(~0); } } } } else { if(s->clk_numtrans > LT_CLKPACK) { lt_flushclock(lt, s); /* flush clock then continue below! */ } else { s->clk_prevtrans=ULLDescriptor(~0); } } s->clk_prevval = value[0]; } } /* normal trace handling */ last_change_delta = lt->position - s->last_change - 2; if(last_change_delta >= 256*65536) { numbytes = 3; } else if(last_change_delta >= 65536) { numbytes = 2; } else if(last_change_delta >= 256) { numbytes = 1; } else { numbytes = 0; } pnt = value; prevch = *pnt; while((ch=*(pnt++))) { switch(ch) { case '0': case '1': mvl|=LT_MVL_2; break; case 'Z': case 'z': case 'X': case 'x': mvl|=LT_MVL_4; break; default: mvl|=LT_MVL_9; break; } if(prevch!=ch) prevch = 0; } switch(prevch) { case 0x00: tagadd = 0; break; case '0': tagadd = 3; break; case '1': tagadd = 4; break; case 'Z': case 'z': tagadd = 5; break; case 'X': case 'x': tagadd = 6; break; case 'H': case 'h': tagadd = 7; break; case 'U': case 'u': tagadd = 8; break; case 'W': case 'w': tagadd = 9; break; case 'L': case 'l': tagadd = 0xa; break; default: tagadd = 0xb; break; } if(mvl) { start_position = lt->position; if(!lt->numfacs_bytes) { if(tagadd) { tag = (numbytes<<4) + tagadd; } else { tag = (numbytes<<4) + ((mvl<_MVL_9)? 2 : ((mvl<_MVL_4)? 1 : 0)); } lt->lt_emit_u8(lt, tag); switch(numbytes&3) { case 0: lt->lt_emit_u8(lt, last_change_delta); break; case 1: lt->lt_emit_u16(lt, last_change_delta); break; case 2: lt->lt_emit_u24(lt, last_change_delta); break; case 3: lt->lt_emit_u32(lt, last_change_delta); break; } } else { switch(lt->numfacs_bytes) { case 1: lt->lt_emit_u8(lt, s->facnum); break; case 2: lt->lt_emit_u16(lt, s->facnum); break; case 3: lt->lt_emit_u24(lt, s->facnum); break; case 4: lt->lt_emit_u32(lt, s->facnum); break; } if(tagadd) { lt->lt_emit_u8(lt, tagadd); } else { lt->lt_emit_u8(lt, (mvl<_MVL_9)? 2 : ((mvl<_MVL_4)? 1 : 0) ); } } s->last_change = start_position; if(s->rows>0) { if(s->rows >= 256*65536) { numbytes = 3; } else if(s->rows >= 65536) { numbytes = 2; } else if(s->rows >= 256) { numbytes = 1; } else { numbytes = 0; } switch(numbytes&3) { case 0: lt->lt_emit_u8(lt, row); break; case 1: lt->lt_emit_u16(lt, row); break; case 2: lt->lt_emit_u24(lt, row); break; case 3: lt->lt_emit_u32(lt, row); break; } } if(!tagadd) { unsigned int len2 = ((s->flags)<_SYM_F_INTEGER) ? 32 : s->len; if((mvl & (LT_MVL_2|LT_MVL_4|LT_MVL_9)) == LT_MVL_2) { unsigned int i; int bitpos = 7; int outval = 0; int thisval= 0; pnt = value; if((lt->dictmode)&&(len2>lt->mindictwidth)) { char *vpnt = value; while ( (*vpnt == '0') && (*(vpnt+1)) ) vpnt++; lt->dict = dslxt_splay (vpnt, lt->dict); if(!dslxt_success) { unsigned int vlen = strlen(vpnt)+1; char *vcopy = (char *)malloc(vlen); strcpy(vcopy, vpnt); lt->dict_string_mem_required += vlen; lt->dict = dslxt_insert(vcopy, lt->dict, lt->num_dict_entries); if(!lt->dict16_offset) { if(lt->num_dict_entries==256) lt->dict16_offset = lt->position; } else if(!lt->dict24_offset) { if(lt->num_dict_entries==65536) lt->dict24_offset = lt->position; } else if(!lt->dict32_offset) { if(lt->num_dict_entries==(256*65536)) lt->dict32_offset = lt->position; } lt->num_dict_entries++; } if(lt->dict24_offset) { if(lt->dict32_offset) { lt->lt_emit_u32(lt, lt->dict->val); } else { lt->lt_emit_u24(lt, lt->dict->val); } } else { if(lt->dict16_offset) { lt->lt_emit_u16(lt, lt->dict->val); } else { lt->lt_emit_u8(lt, lt->dict->val); } } } else for(i=0;ilt_emit_u8(lt, outval); outval = 0; bitpos = 7; } } } else if((mvl & (LT_MVL_4|LT_MVL_9)) == LT_MVL_4) { unsigned int i; int bitpos = 6; int outval = 0; int thisval= 0; pnt = value; for(i=0;ilt_emit_u8(lt, outval); outval = 0; bitpos = 6; } } } else /* if(mvl & LT_MVL_9) */ { unsigned int i; int bitpos = 4; int outval = 0; int thisval= 0; pnt = value; for(i=0;ilt_emit_u8(lt, outval); outval = 0; bitpos = 4; } } } } rc=1; } if(lt->timebuff) { lt->timechangecount++; if(lt->timecurr) { lt->timecurr->next = lt->timebuff; lt->timecurr = lt->timebuff; } else { lt->timehead = lt->timecurr = lt->timebuff; } lt->timebuff=NULL; } } return(rc); } /* * blackout functions */ void lt_set_dumpoff(struct lt_trace *lt) { if((lt)&&(!lt->dumpoff_active)) { struct lt_timetrail *ltt = calloc(1, sizeof(struct lt_timetrail)); ltt->timeval = lt->timeval; if(lt->dumpoffhead) { lt->dumpoffcurr->next = ltt; lt->dumpoffcurr = ltt; } else { lt->dumpoffhead = lt->dumpoffcurr = ltt; } lt->dumpoff_active = 1; lt->dumpoffcount++; } } void lt_set_dumpon(struct lt_trace *lt) { if((lt)&&(lt->dumpoff_active)) { struct lt_timetrail *ltt = calloc(1, sizeof(struct lt_timetrail)); ltt->timeval = lt->timeval; lt->dumpoffcurr->next = ltt; lt->dumpoffcurr = ltt; lt->dumpoff_active = 0; } } void lt_set_timezero(struct lt_trace *lt, lxtotime_t timeval) { if(lt) { lt->timezero = timeval; } } gtkwave-3.3.86/src/helpers/v2l_debug_lxt2.c0000664000175000017500000000733413166335473020032 0ustar bybellbybell/* * Copyright (c) 2001 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ /* * debug.c 01feb99ajb * malloc debugs added on 13jul99ajb */ #include #include "v2l_debug_lxt2.h" #ifdef DEBUG_MALLOC /* normally this should be undefined..this is *only* for finding stray allocations/frees */ static struct memchunk *mem=NULL; static size_t mem_total=0; static int mem_chunks=0; static void mem_addnode(void *ptr, size_t size) { struct memchunk *m; m=(struct memchunk *)malloc(sizeof(struct memchunk)); m->ptr=ptr; m->size=size; m->next=mem; mem=m; mem_total+=size; mem_chunks++; fprintf(stderr,"mem_addnode: TC:%05d TOT:%010d PNT:%010p LEN:+%d\n",mem_chunks,mem_total,ptr,size); } static void mem_freenode(void *ptr) { struct memchunk *m, *mprev=NULL; m=mem; while(m) { if(m->ptr==ptr) { if(mprev) { mprev->next=m->next; } else { mem=m->next; } mem_total=mem_total-m->size; mem_chunks--; fprintf(stderr,"mem_freenode: TC:%05d TOT:%010d PNT:%010p LEN:-%d\n",mem_chunks,mem_total,ptr,m->size); free(m); return; } mprev=m; m=m->next; } fprintf(stderr,"mem_freenode: PNT:%010p *INVALID*\n",ptr); sleep(1); } #endif /* * wrapped malloc family... */ void *malloc_2(size_t size) { void *ret; ret=malloc(size); if(ret) { DEBUG_M(mem_addnode(ret,size)); } else { fprintf(stderr, "FATAL ERROR : Out of memory, sorry.\n"); exit(1); } return(ret); } void *realloc_2(void *ptr, size_t size) { void *ret; ret=realloc(ptr, size); if(ret) { DEBUG_M(mem_freenode(ptr)); DEBUG_M(mem_addnode(ret,size)); } else { fprintf(stderr, "FATAL ERROR : Out of memory, sorry.\n"); exit(1); } return(ret); } void *calloc_2(size_t nmemb, size_t size) { void *ret; ret=calloc(nmemb, size); if(ret) { DEBUG_M(mem_addnode(ret, nmemb*size)); } else { fprintf(stderr, "FATAL ERROR: Out of memory, sorry.\n"); exit(1); } return(ret); } void free_2(void *ptr) { if(ptr) { DEBUG_M(mem_freenode(ptr)); free(ptr); } else { fprintf(stderr, "WARNING: Attempt to free NULL pointer caught.\n"); } } /* * atoi 64-bit version.. * y/on default to '1' * n/nonnum default to '0' */ TimeType atoi_64(char *str) { TimeType val=0; unsigned char ch, nflag=0; #if 0 switch(*str) { case 'y': case 'Y': return(LLDescriptor(1)); case 'o': case 'O': str++; ch=*str; if((ch=='n')||(ch=='N')) return(LLDescriptor(1)); else return(LLDescriptor(0)); case 'n': case 'N': return(LLDescriptor(0)); break; default: break; } #endif while((ch=*(str++))) { if((ch>='0')&&(ch<='9')) { val=(val*10+(ch&15)); } else if((ch=='-')&&(val==0)&&(!nflag)) { nflag=1; } else if(val) { break; } } return(nflag?(-val):val); } gtkwave-3.3.86/src/helpers/vzt_read.h0000664000175000017500000002275013166335473017032 0ustar bybellbybell/* * Copyright (c) 2004-2012 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef DEFS_VZTR_H #define DEFS_VZTR_H #ifdef __cplusplus extern "C" { #endif #include #include #include #include #include #ifndef _MSC_VER #include #ifdef HAVE_INTTYPES_H #include #endif #else typedef long off_t; #include #include #endif #ifndef HAVE_FSEEKO #define fseeko fseek #define ftello ftell #endif #if defined _MSC_VER || defined __MINGW32__ typedef int pthread_t; typedef int pthread_attr_t; typedef int pthread_mutex_t; typedef int pthread_mutexattr_t; #else #include #endif #include #include #include #ifdef __GNUC__ #if __STDC_VERSION__ >= 199901L #define _VZT_RD_INLINE inline __attribute__((__gnu_inline__)) #else #define _VZT_RD_INLINE inline #endif #else #define _VZT_RD_INLINE #endif #define VZT_RDLOAD "VZTLOAD | " #define VZT_RD_HDRID (('V' << 8) + ('Z')) #define VZT_RD_VERSION (0x0001) #define VZT_RD_GRANULE_SIZE (32) #define VZT_RD_MAX_BLOCK_MEM_USAGE (64*1024*1024) /* 64MB */ #ifndef _MSC_VER typedef uint8_t vztint8_t; typedef uint16_t vztint16_t; typedef uint32_t vztint32_t; typedef uint64_t vztint64_t; typedef int64_t vztsint64_t; typedef int32_t vztsint32_t; #ifndef __MINGW32__ #define VZT_RD_LLD "%"PRId64 #define VZT_RD_LD "%"PRId32 #else #define VZT_RD_LLD "%I64d" #define VZT_RD_LD "%d" #endif #define VZT_RD_LLDESC(x) x##LL #define VZT_RD_ULLDESC(x) x##ULL #else typedef unsigned __int8 vztint8_t; typedef unsigned __int16 vztint16_t; typedef unsigned __int32 vztint32_t; typedef unsigned __int64 vztint64_t; typedef __int64 vztsint64_t; typedef __int32 vztsint32_t; #define VZT_RD_LLD "%I64d" #define VZT_RD_LD "%d" #define VZT_RD_LLDESC(x) x##i64 #define VZT_RD_ULLDESC(x) x##i64 #endif #define VZT_RD_IS_GZ (0) #define VZT_RD_IS_BZ2 (1) #define VZT_RD_IS_LZMA (2) #define VZT_RD_SYM_F_BITS (0) #define VZT_RD_SYM_F_INTEGER (1<<0) #define VZT_RD_SYM_F_DOUBLE (1<<1) #define VZT_RD_SYM_F_STRING (1<<2) #define VZT_RD_SYM_F_TIME (VZT_RD_SYM_F_STRING) /* user must correctly format this as a string */ #define VZT_RD_SYM_F_ALIAS (1<<3) #define VZT_RD_SYM_F_SIGNED (1<<4) #define VZT_RD_SYM_F_BOOLEAN (1<<5) #define VZT_RD_SYM_F_NATURAL ((1<<6)|(VZT_RD_SYM_F_INTEGER)) #define VZT_RD_SYM_F_POSITIVE ((1<<7)|(VZT_RD_SYM_F_INTEGER)) #define VZT_RD_SYM_F_CHARACTER (1<<8) #define VZT_RD_SYM_F_CONSTANT (1<<9) #define VZT_RD_SYM_F_VARIABLE (1<<10) #define VZT_RD_SYM_F_SIGNAL (1<<11) #define VZT_RD_SYM_F_IN (1<<12) #define VZT_RD_SYM_F_OUT (1<<13) #define VZT_RD_SYM_F_INOUT (1<<14) #define VZT_RD_SYM_F_WIRE (1<<15) #define VZT_RD_SYM_F_REG (1<<16) #define VZT_RD_SYM_MASK (VZT_RD_SYM_F_BITS|VZT_RD_SYM_F_INTEGER|VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING|VZT_RD_SYM_F_TIME| \ VZT_RD_SYM_F_ALIAS|VZT_RD_SYM_F_SIGNED|VZT_RD_SYM_F_BOOLEAN|VZT_RD_SYM_F_NATURAL| \ VZT_RD_SYM_F_POSITIVE|VZT_RD_SYM_F_CHARACTER|VZT_RD_SYM_F_CONSTANT|VZT_RD_SYM_F_VARIABLE| \ VZT_RD_SYM_F_SIGNAL|VZT_RD_SYM_F_IN|VZT_RD_SYM_F_OUT|VZT_RD_SYM_F_INOUT|VZT_RD_SYM_F_WIRE| \ VZT_RD_SYM_F_REG) #define VZT_RD_SYM_F_SYNVEC (1<<17) /* reader synthesized vector in alias sec'n from non-adjacent vectorizing */ struct vzt_rd_block { char *mem; struct vzt_rd_block *next; struct vzt_rd_block *prev; vztint32_t uncompressed_siz, compressed_siz, num_rle_bytes; vztint64_t start, end; vztint32_t *vindex; vztint64_t *times; vztint32_t *change_dict; vztint32_t *val_dict; char **sindex; unsigned int num_time_ticks, num_sections, num_dict_entries, num_str_entries; off_t filepos; /* where block starts in file if we have to reload */ unsigned short_read_ignore : 1; /* tried to read once and it was corrupt so ignore next time */ unsigned exclude_block : 1; /* user marked this block off to be ignored */ unsigned multi_state : 1; /* not just two state value changes */ unsigned killed : 1; /* we're in vzt_close(), don't grab anymore blocks */ unsigned ztype : 2; /* 1: gzip, 0: bzip2, 2: lzma */ unsigned rle : 1; /* set when end < start which says that an rle depack is necessary */ pthread_t pth; pthread_attr_t pth_attr; pthread_mutex_t mutex; vztint64_t last_rd_value_simtime; vztint32_t last_rd_value_idx; }; struct vzt_rd_geometry { vztint32_t rows; vztsint32_t msb, lsb; vztint32_t flags, len; }; struct vzt_rd_facname_cache { char *n; char *bufprev, *bufcurr; vztint32_t old_facidx; }; struct vzt_rd_trace { vztint32_t *rows; vztsint32_t *msb, *lsb; vztint32_t *flags, *len, *vindex_offset; vztsint64_t timezero; char *value_current_sector; char *value_previous_sector; vztint32_t longest_len; vztint32_t total_values; /* number of value index entries in table */ char *process_mask; void (*value_change_callback)(struct vzt_rd_trace **lt, vztint64_t *time, vztint32_t *facidx, char **value); void *user_callback_data_pointer; vztint8_t granule_size; vztint32_t numfacs, numrealfacs, numfacbytes, longestname, zfacnamesize, zfacname_predec_size, zfacgeometrysize; vztint8_t timescale; char *zfacnames; unsigned int numblocks; struct vzt_rd_block *block_head, *block_curr; vztint64_t start, end; struct vzt_rd_geometry geometry; struct vzt_rd_facname_cache *faccache; vztint64_t last_rd_value_simtime; /* for single value reads w/o using the callback mechanism */ struct vzt_rd_block *last_rd_value_block; char *filename; /* for multithread */ FILE *handle; void *zhandle; vztint64_t block_mem_consumed, block_mem_max; pthread_mutex_t mutex; /* for these */ unsigned int pthreads; /* pthreads are enabled, set to max processor # (starting at zero for a uni) */ unsigned process_linear : 1; /* set by gtkwave for read optimization */ unsigned vectorize : 1; /* set when coalescing blasted bitvectors */ }; /* * VZT Reader API functions... */ struct vzt_rd_trace * vzt_rd_init(const char *name); struct vzt_rd_trace * vzt_rd_init_smp(const char *name, unsigned int num_cpus); void vzt_rd_close(struct vzt_rd_trace *lt); vztint64_t vzt_rd_set_max_block_mem_usage(struct vzt_rd_trace *lt, vztint64_t block_mem_max); vztint64_t vzt_rd_get_block_mem_usage(struct vzt_rd_trace *lt); unsigned int vzt_rd_get_num_blocks(struct vzt_rd_trace *lt); unsigned int vzt_rd_get_num_active_blocks(struct vzt_rd_trace *lt); vztint32_t vzt_rd_get_num_facs(struct vzt_rd_trace *lt); char * vzt_rd_get_facname(struct vzt_rd_trace *lt, vztint32_t facidx); struct vzt_rd_geometry * vzt_rd_get_fac_geometry(struct vzt_rd_trace *lt, vztint32_t facidx); vztint32_t vzt_rd_get_fac_rows(struct vzt_rd_trace *lt, vztint32_t facidx); vztsint32_t vzt_rd_get_fac_msb(struct vzt_rd_trace *lt, vztint32_t facidx); vztsint32_t vzt_rd_get_fac_lsb(struct vzt_rd_trace *lt, vztint32_t facidx); vztint32_t vzt_rd_get_fac_flags(struct vzt_rd_trace *lt, vztint32_t facidx); vztint32_t vzt_rd_get_fac_len(struct vzt_rd_trace *lt, vztint32_t facidx); vztint32_t vzt_rd_get_alias_root(struct vzt_rd_trace *lt, vztint32_t facidx); char vzt_rd_get_timescale(struct vzt_rd_trace *lt); vztint64_t vzt_rd_get_start_time(struct vzt_rd_trace *lt); vztint64_t vzt_rd_get_end_time(struct vzt_rd_trace *lt); vztsint64_t vzt_rd_get_timezero(struct vzt_rd_trace *lt); int vzt_rd_get_fac_process_mask(struct vzt_rd_trace *lt, vztint32_t facidx); int vzt_rd_set_fac_process_mask(struct vzt_rd_trace *lt, vztint32_t facidx); int vzt_rd_clr_fac_process_mask(struct vzt_rd_trace *lt, vztint32_t facidx); int vzt_rd_set_fac_process_mask_all(struct vzt_rd_trace *lt); int vzt_rd_clr_fac_process_mask_all(struct vzt_rd_trace *lt); /* null value_change_callback calls an empty dummy function */ int vzt_rd_iter_blocks(struct vzt_rd_trace *lt, void (*value_change_callback)(struct vzt_rd_trace **lt, vztint64_t *time, vztint32_t *facidx, char **value), void *user_callback_data_pointer); void * vzt_rd_get_user_callback_data_pointer(struct vzt_rd_trace *lt); void vzt_rd_process_blocks_linearly(struct vzt_rd_trace *lt, int doit); /* time (un)/restricted read ops */ unsigned int vzt_rd_limit_time_range(struct vzt_rd_trace *lt, vztint64_t strt_time, vztint64_t end_time); unsigned int vzt_rd_unlimit_time_range(struct vzt_rd_trace *lt); /* naive read on time/facidx */ char * vzt_rd_value(struct vzt_rd_trace *lt, vztint64_t simtime, vztint32_t facidx); /* experimental function for reconstituting bitblasted nets */ void vzt_rd_vectorize(struct vzt_rd_trace *lt); #ifdef __cplusplus } #endif #endif gtkwave-3.3.86/src/helpers/lxt_write.h0000664000175000017500000002014413166335473017230 0ustar bybellbybell/* * Copyright (c) 2001-2012 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef DEFS_LXT_H #define DEFS_LXT_H #ifdef __cplusplus extern "C" { #endif #include #include #include #include #include #include #include #include #ifdef HAVE_INTTYPES_H #include #endif #ifndef HAVE_FSEEKO #define fseeko fseek #define ftello ftell #endif typedef struct dslxt_tree_node dslxt_Tree; struct dslxt_tree_node { dslxt_Tree * left, * right; char *item; unsigned int val; }; #define LT_HDRID (0x0138) #define LT_VERSION (0x0004) #define LT_TRLID (0xB4) #define LT_CLKPACK (4) #define LT_CLKPACK_M (2) #define LT_MVL_2 (1<<0) #define LT_MVL_4 (1<<1) #define LT_MVL_9 (1<<2) #define LT_MINDICTWIDTH (16) enum lt_zmode_types { LT_ZMODE_NONE, LT_ZMODE_GZIP, LT_ZMODE_BZIP2 }; #ifndef _MSC_VER typedef uint64_t lxttime_t; #define ULLDescriptor(x) x##ULL typedef int64_t lxtotime_t; #else typedef unsigned __int64 lxttime_t; #define ULLDescriptor(x) x##i64 typedef __int64 lxtotime_t; #endif struct lt_timetrail { struct lt_timetrail *next; lxttime_t timeval; unsigned int position; }; #define LT_SYMPRIME 500009 #define LT_SECTION_END (0) #define LT_SECTION_CHG (1) #define LT_SECTION_SYNC_TABLE (2) #define LT_SECTION_FACNAME (3) #define LT_SECTION_FACNAME_GEOMETRY (4) #define LT_SECTION_TIMESCALE (5) #define LT_SECTION_TIME_TABLE (6) #define LT_SECTION_INITIAL_VALUE (7) #define LT_SECTION_DOUBLE_TEST (8) #define LT_SECTION_TIME_TABLE64 (9) #define LT_SECTION_ZFACNAME_PREDEC_SIZE (10) #define LT_SECTION_ZFACNAME_SIZE (11) #define LT_SECTION_ZFACNAME_GEOMETRY_SIZE (12) #define LT_SECTION_ZSYNC_SIZE (13) #define LT_SECTION_ZTIME_TABLE_SIZE (14) #define LT_SECTION_ZCHG_PREDEC_SIZE (15) #define LT_SECTION_ZCHG_SIZE (16) #define LT_SECTION_ZDICTIONARY (17) #define LT_SECTION_ZDICTIONARY_SIZE (18) #define LT_SECTION_EXCLUDE_TABLE (19) #define LT_SECTION_TIMEZERO (20) struct lt_trace { FILE *handle; gzFile zhandle; dslxt_Tree *dict; /* dictionary manipulation */ unsigned int mindictwidth; unsigned int num_dict_entries; unsigned int dict_string_mem_required; dslxt_Tree **sorted_dict; /* assume dict8_offset == filepos zero */ unsigned int dict16_offset; unsigned int dict24_offset; unsigned int dict32_offset; int (*lt_emit_u8)(struct lt_trace *lt, int value); int (*lt_emit_u16)(struct lt_trace *lt, int value); int (*lt_emit_u24)(struct lt_trace *lt, int value); int (*lt_emit_u32)(struct lt_trace *lt, int value); int (*lt_emit_u64)(struct lt_trace *lt, int valueh, int valuel); int (*lt_emit_double)(struct lt_trace *lt, double value); int (*lt_emit_string)(struct lt_trace *lt, char *value); unsigned int position; unsigned int zfacname_predec_size, zfacname_size, zfacgeometry_size, zsync_table_size, ztime_table_size, zdictionary_size; unsigned int zpackcount, zchg_table_size, chg_table_size; struct lt_symbol *sym[LT_SYMPRIME]; struct lt_symbol **sorted_facs; struct lt_symbol *symchain; int numfacs, numfacs_bytes; int numfacbytes; int longestname; lxttime_t mintime, maxtime; int timescale; int initial_value; struct lt_timetrail *timehead, *timecurr, *timebuff; int timechangecount; struct lt_timetrail *dumpoffhead, *dumpoffcurr; int dumpoffcount; unsigned int change_field_offset; unsigned int facname_offset; unsigned int facgeometry_offset; unsigned int time_table_offset; unsigned int sync_table_offset; unsigned int initial_value_offset; unsigned int timescale_offset; unsigned int double_test_offset; unsigned int dictionary_offset; unsigned int exclude_offset; unsigned int timezero_offset; char *compress_fac_str; int compress_fac_len; lxttime_t timeval; /* for clock induction, current time */ lxtotime_t timezero; /* for allowing negative values */ unsigned dumpoff_active : 1; /* when set we're not dumping */ unsigned double_used : 1; unsigned do_strip_brackets : 1; unsigned clock_compress : 1; unsigned dictmode : 1; /* dictionary compression enabled */ unsigned zmode : 2; /* for value changes */ unsigned emitted : 1; /* gate off change field zmode changes when set */ }; struct lt_symbol { struct lt_symbol *next; struct lt_symbol *symchain; char *name; int namlen; int facnum; struct lt_symbol *aliased_to; unsigned int rows; int msb, lsb; int len; int flags; unsigned int last_change; lxttime_t clk_delta; lxttime_t clk_prevtrans; int clk_numtrans; int clk_prevval; int clk_prevval1; int clk_prevval2; int clk_prevval3; int clk_prevval4; unsigned char clk_mask; }; #define LT_SYM_F_BITS (0) #define LT_SYM_F_INTEGER (1<<0) #define LT_SYM_F_DOUBLE (1<<1) #define LT_SYM_F_STRING (1<<2) #define LT_SYM_F_ALIAS (1<<3) struct lt_trace * lt_init(const char *name); void lt_close(struct lt_trace *lt); struct lt_symbol * lt_symbol_find(struct lt_trace *lt, const char *name); struct lt_symbol * lt_symbol_add(struct lt_trace *lt, const char *name, unsigned int rows, int msb, int lsb, int flags); struct lt_symbol * lt_symbol_alias(struct lt_trace *lt, const char *existing_name, const char *alias, int msb, int lsb); void lt_symbol_bracket_stripping(struct lt_trace *lt, int doit); /* lt_set_no_interlace implies bzip2 compression. if you use lt_set_chg_compress before this, */ /* less efficient gzip compression will be used instead so make sure lt_set_no_interlace is first */ /* if you are using it! */ void lt_set_no_interlace(struct lt_trace *lt); void lt_set_chg_compress(struct lt_trace *lt); void lt_set_clock_compress(struct lt_trace *lt); void lt_set_dict_compress(struct lt_trace *lt, unsigned int minwidth); void lt_set_initial_value(struct lt_trace *lt, char value); void lt_set_timescale(struct lt_trace *lt, int timescale); void lt_set_timezero(struct lt_trace *lt, lxtotime_t timeval); int lt_set_time(struct lt_trace *lt, unsigned int timeval); int lt_inc_time_by_delta(struct lt_trace *lt, unsigned int timeval); int lt_set_time64(struct lt_trace *lt, lxttime_t timeval); int lt_inc_time_by_delta64(struct lt_trace *lt, lxttime_t timeval); /* allows blackout regions in LXT files */ void lt_set_dumpoff(struct lt_trace *lt); void lt_set_dumpon(struct lt_trace *lt); /* * value change functions..note that if the value string len for * lt_emit_value_bit_string() is shorter than the symbol length * it will be left justified with the rightmost character used as * a repeat value that will be propagated to pad the value string out: * * "10x" for 8 bits becomes "10xxxxxx" * "z" for 8 bits becomes "zzzzzzzz" */ int lt_emit_value_int(struct lt_trace *lt, struct lt_symbol *s, unsigned int row, int value); int lt_emit_value_double(struct lt_trace *lt, struct lt_symbol *s, unsigned int row, double value); int lt_emit_value_string(struct lt_trace *lt, struct lt_symbol *s, unsigned int row, char *value); int lt_emit_value_bit_string(struct lt_trace *lt, struct lt_symbol *s, unsigned int row, char *value); #ifdef __cplusplus } #endif #endif gtkwave-3.3.86/src/helpers/v2l_debug_lxt2.h0000664000175000017500000000462513166335473020037 0ustar bybellbybell/* * Copyright (c) 2001-2014 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef WAVE_DEBUG_H #define WAVE_DEBUG_H #include #include #ifdef HAVE_INTTYPES_H #include #endif #include struct memchunk { struct memchunk *next; void *ptr; size_t size; }; /* * If you have problems viewing traces (mangled timevalues), * make sure that you use longs rather than the glib 64-bit * types... */ #define G_HAVE_GINT64 #define gint64 int64_t #define guint64 uint64_t #ifdef G_HAVE_GINT64 typedef gint64 TimeType; typedef guint64 UTimeType; #ifndef _MSC_VER #define LLDescriptor(x) x##LL #define ULLDescriptor(x) x##ULL #ifndef __MINGW32__ #if __WORDSIZE == 64 #define TTFormat "%ld" #else #define TTFormat "%lld" #endif #else #define TTFormat "%I64d" #endif #else #define LLDescriptor(x) x##i64 #define ULLDescriptor(x) x##i64 #define TTFormat "%I64d" #endif #else typedef long TimeType; typedef unsigned long UTimeType; #define TTFormat "%d" #define LLDescriptor(x) x #define ULLDescriptor(x) x #endif #ifdef DEBUG_PRINTF #define DEBUG(x) x #else #define DEBUG(x) #endif #ifdef DEBUG_MALLOC #define DEBUG_M(x) x #else #define DEBUG_M(x) #endif void *malloc_2(size_t size); void *realloc_2(void *ptr, size_t size); void *calloc_2(size_t nmemb, size_t size); void free_2(void *ptr); TimeType atoi_64(char *str); #endif gtkwave-3.3.86/src/helpers/vzt_write.c0000664000175000017500000012157713166335473017253 0ustar bybellbybell/* * Copyright (c) 2003-2015 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifdef _AIX #pragma alloca #endif #include #include #if defined(__CYGWIN__) || defined(__MINGW32__) #undef HAVE_RPC_XDR_H #endif #if HAVE_RPC_XDR_H #include #include #endif #include "vzt_write.h" /* * in-place sort to keep chained facs from migrating... */ static void wave_mergesort(struct vzt_wr_symbol **a, struct vzt_wr_symbol **b, int lo, int hi) { int i, j, k; if (loname, a[j]->name) <= 0) { a[k++]=b[i++]; } else { a[k++]=a[j++]; } } while (kztype = lt->ztype_cfg; /* shadow config at file open */ switch(lt->ztype) { case VZT_WR_IS_GZ: return(gzdopen(fd, mode)); case VZT_WR_IS_BZ2: return(BZ2_bzdopen(fd, mode)); case VZT_WR_IS_LZMA: default: return(LZMA_fdopen(fd, mode)); } } return(NULL); } static _VZT_WR_INLINE int vzt_gzclose(struct vzt_wr_trace *lt, void *file) { if(lt) { switch(lt->ztype) { case VZT_WR_IS_GZ: return(gzclose(file)); case VZT_WR_IS_BZ2: BZ2_bzclose(file); return(0); case VZT_WR_IS_LZMA: default: LZMA_close(file); return(0); } } return(0); } static _VZT_WR_INLINE int vzt_gzflush(struct vzt_wr_trace *lt, void *file, int flush) { if(lt) { switch(lt->ztype) { case VZT_WR_IS_GZ: return(gzflush(file, flush)); case VZT_WR_IS_BZ2: return(BZ2_bzflush(file)); case VZT_WR_IS_LZMA: default: return(0); /* no real need to do a LZMA_flush(file) as the dictionary is so big */ } } return(0); } static _VZT_WR_INLINE int vzt_gzwrite(struct vzt_wr_trace *lt, void *file, void* buf, unsigned len) { if(lt) { switch(lt->ztype) { case VZT_WR_IS_GZ: return(gzwrite(file, buf, len)); case VZT_WR_IS_BZ2: return(BZ2_bzwrite(file, buf, len)); case VZT_WR_IS_LZMA: default: return(LZMA_write(file, buf, len)); } } return(0); } /************************ splay ************************/ #define cmp_l(i,j) ((int)(-(ij))) #define cmp_l_lt(i,j) (ij) static int vzt_wr_dsvzt_success; static vzt_wr_dsvzt_Tree * vzt_wr_dsvzt_splay (vztint32_t i, vzt_wr_dsvzt_Tree * t) { /* Simple top down splay, not requiring i to be in the tree t. */ /* What it does is described above. */ vzt_wr_dsvzt_Tree N, *l, *r, *y; int dir; vzt_wr_dsvzt_success = 0; if (t == NULL) return t; N.left = N.right = NULL; l = r = &N; for (;;) { dir = cmp_l(i, t->item); if (dir < 0) { if (t->left == NULL) break; if (cmp_l_lt(i, t->left->item)) { y = t->left; /* rotate right */ t->left = y->right; y->right = t; t = y; if (t->left == NULL) break; } r->left = t; /* link right */ r = t; t = t->left; } else if (dir > 0) { if (t->right == NULL) break; if (cmp_l_gt(i, t->right->item)) { y = t->right; /* rotate left */ t->right = y->left; y->left = t; t = y; if (t->right == NULL) break; } l->right = t; /* link left */ l = t; t = t->right; } else { vzt_wr_dsvzt_success=1; break; } } l->right = t->left; /* assemble */ r->left = t->right; t->left = N.right; t->right = N.left; return t; } static vzt_wr_dsvzt_Tree * vzt_wr_dsvzt_insert(vztint32_t i, vzt_wr_dsvzt_Tree * t, vztint32_t val) { /* Insert i into the tree t, unless it's already there. */ /* Return a pointer to the resulting tree. */ vzt_wr_dsvzt_Tree * n; int dir; n = (vzt_wr_dsvzt_Tree *) calloc (1, sizeof (vzt_wr_dsvzt_Tree)); if (n == NULL) { fprintf(stderr, "dsvzt_insert: ran out of memory, exiting.\n"); exit(255); } n->item = i; n->val = val; if (t == NULL) { n->left = n->right = NULL; return n; } t = vzt_wr_dsvzt_splay(i,t); dir = cmp_l(i,t->item); if (dir<0) { n->left = t->left; n->right = t; t->left = NULL; return n; } else if (dir>0) { n->right = t->right; n->left = t; t->right = NULL; return n; } else { /* We get here if it's already in the tree */ /* Don't add it again */ free(n); return t; } } /************************ splay ************************/ static int vzt2_wr_dsvzt_success; static vzt2_wr_dsvzt_Tree * vzt2_wr_dsvzt_splay (char *i, vzt2_wr_dsvzt_Tree * t) { /* Simple top down splay, not requiring i to be in the tree t. */ /* What it does is described above. */ vzt2_wr_dsvzt_Tree N, *l, *r, *y; int dir; vzt2_wr_dsvzt_success = 0; if (t == NULL) return t; N.left = N.right = NULL; l = r = &N; for (;;) { dir = strcmp(i, t->item); if (dir < 0) { if (t->left == NULL) break; if (strcmp(i, t->left->item)<0) { y = t->left; /* rotate right */ t->left = y->right; y->right = t; t = y; if (t->left == NULL) break; } r->left = t; /* link right */ r = t; t = t->left; } else if (dir > 0) { if (t->right == NULL) break; if (strcmp(i, t->right->item)>0) { y = t->right; /* rotate left */ t->right = y->left; y->left = t; t = y; if (t->right == NULL) break; } l->right = t; /* link left */ l = t; t = t->right; } else { vzt2_wr_dsvzt_success=1; break; } } l->right = t->left; /* assemble */ r->left = t->right; t->left = N.right; t->right = N.left; return t; } static vzt2_wr_dsvzt_Tree * vzt2_wr_dsvzt_insert(char *i, vzt2_wr_dsvzt_Tree * t, unsigned int val) { /* Insert i into the tree t, unless it's already there. */ /* Return a pointer to the resulting tree. */ vzt2_wr_dsvzt_Tree * n; int dir; n = (vzt2_wr_dsvzt_Tree *) calloc (1, sizeof (vzt2_wr_dsvzt_Tree)); if (n == NULL) { fprintf(stderr, "dsvzt_insert: ran out of memory, exiting.\n"); exit(255); } n->item = i; n->val = val; if (t == NULL) { n->left = n->right = NULL; return n; } t = vzt2_wr_dsvzt_splay(i,t); dir = strcmp(i,t->item); if (dir<0) { n->left = t->left; n->right = t; t->left = NULL; return n; } else if (dir>0) { n->right = t->right; n->left = t; t->right = NULL; return n; } else { /* We get here if it's already in the tree */ /* Don't add it again */ free(n); return t; } } /************************ splay ************************/ /* * functions which emit various big endian * data to a file */ static int vzt_wr_emit_u8(struct vzt_wr_trace *lt, int value) { unsigned char buf[1]; int nmemb; buf[0] = value & 0xff; nmemb=fwrite(buf, sizeof(char), 1, lt->handle); lt->position+=nmemb; return(nmemb); } static int vzt_wr_emit_u16(struct vzt_wr_trace *lt, int value) { unsigned char buf[2]; int nmemb; buf[0] = (value>>8) & 0xff; buf[1] = value & 0xff; nmemb = fwrite(buf, sizeof(char), 2, lt->handle); lt->position+=nmemb; return(nmemb); } static int vzt_wr_emit_u32(struct vzt_wr_trace *lt, int value) { unsigned char buf[4]; int nmemb; buf[0] = (value>>24) & 0xff; buf[1] = (value>>16) & 0xff; buf[2] = (value>>8) & 0xff; buf[3] = value & 0xff; nmemb=fwrite(buf, sizeof(char), 4, lt->handle); lt->position+=nmemb; return(nmemb); } static int vzt_wr_emit_u64(struct vzt_wr_trace *lt, int valueh, int valuel) { int rc; if((rc=vzt_wr_emit_u32(lt, valueh))) { rc=vzt_wr_emit_u32(lt, valuel); } return(rc); } /* * gzfunctions which emit various big endian * data to a file. (lt->position needs to be * fixed up on gzclose so the tables don't * get out of sync!) */ static int gzwrite_buffered(struct vzt_wr_trace *lt) { int rc = 1; if(lt->gzbufpnt > VZT_WR_GZWRITE_BUFFER) { rc = vzt_gzwrite(lt, lt->zhandle, lt->gzdest, lt->gzbufpnt); rc = rc ? 1 : 0; lt->gzbufpnt = 0; } return(rc); } static void gzflush_buffered(struct vzt_wr_trace *lt, int doclose) { if(lt->gzbufpnt) { vzt_gzwrite(lt, lt->zhandle, lt->gzdest, lt->gzbufpnt); lt->gzbufpnt = 0; if(!doclose) { vzt_gzflush(lt, lt->zhandle, Z_SYNC_FLUSH); } } if(doclose) { vzt_gzclose(lt, lt->zhandle); } } static int vzt_wr_emit_u8z(struct vzt_wr_trace *lt, int value) { int nmemb; lt->gzdest[lt->gzbufpnt++] = value & 0xff; nmemb=gzwrite_buffered(lt); lt->zpackcount++; lt->position++; return(nmemb); } static int vzt_wr_emit_u16z(struct vzt_wr_trace *lt, int value) { int nmemb; lt->gzdest[lt->gzbufpnt++] = (value>>8) & 0xff; lt->gzdest[lt->gzbufpnt++] = value & 0xff; nmemb = gzwrite_buffered(lt); lt->zpackcount+=2; lt->position+=2; return(nmemb); } static int vzt_wr_emit_u32z(struct vzt_wr_trace *lt, int value) { int nmemb; lt->gzdest[lt->gzbufpnt++] = (value>>24) & 0xff; lt->gzdest[lt->gzbufpnt++] = (value>>16) & 0xff; lt->gzdest[lt->gzbufpnt++] = (value>>8) & 0xff; lt->gzdest[lt->gzbufpnt++] = value & 0xff; nmemb=gzwrite_buffered(lt); lt->zpackcount+=4; lt->position+=4; return(nmemb); } static int vzt_wr_emit_u32rz(struct vzt_wr_trace *lt, int value) { int nmemb; lt->gzdest[lt->gzbufpnt++] = value & 0xff; lt->gzdest[lt->gzbufpnt++] = (value>>8) & 0xff; lt->gzdest[lt->gzbufpnt++] = (value>>16) & 0xff; lt->gzdest[lt->gzbufpnt++] = (value>>24) & 0xff; nmemb=gzwrite_buffered(lt); lt->zpackcount+=4; lt->position+=4; return(nmemb); } #if 0 static int vzt_wr_emit_u64z(struct vzt_wr_trace *lt, int valueh, int valuel) { int rc; if((rc=vzt_wr_emit_u32z(lt, valueh))) { rc=vzt_wr_emit_u32z(lt, valuel); } return(rc); } #endif static int vzt_wr_emit_stringz(struct vzt_wr_trace *lt, char *value) { int rc=1; do { rc&=vzt_wr_emit_u8z(lt, *value); } while(*(value++)); return(rc); } static int vzt_wr_emit_uv32z(struct vzt_wr_trace *lt, unsigned int v) { int nmemb; unsigned int nxt; unsigned int oldpnt = lt->gzbufpnt; while((nxt = v>>7)) { lt->gzdest[lt->gzbufpnt++] = (v&0x7f); v = nxt; } lt->gzdest[lt->gzbufpnt++] = (v&0x7f) | 0x80; lt->zpackcount+=(lt->gzbufpnt - oldpnt); lt->position+=(lt->gzbufpnt - oldpnt); nmemb=gzwrite_buffered(lt); return(nmemb); } static int vzt_wr_emit_uv64z(struct vzt_wr_trace *lt, vztint64_t v) { int nmemb; vztint64_t nxt; unsigned int oldpnt = lt->gzbufpnt; while((nxt = v>>7)) { lt->gzdest[lt->gzbufpnt++] = (v&0x7f); v = nxt; } lt->gzdest[lt->gzbufpnt++] = (v&0x7f) | 0x80; lt->zpackcount+=(lt->gzbufpnt - oldpnt); lt->position+=(lt->gzbufpnt - oldpnt); nmemb=gzwrite_buffered(lt); return(nmemb); } /* * hash/symtable manipulation */ static int vzt_wr_hash(const char *s) { const char *p; char ch; unsigned int h=0, h2=0, pos=0, g; for(p=s;*p;p++) { ch=*p; h2<<=3; h2-=((unsigned int)ch+(pos++)); /* this handles stranded vectors quite well.. */ h=(h<<4)+ch; if((g=h&0xf0000000)) { h=h^(g>>24); h=h^g; } } h^=h2; /* combine the two hashes */ return(h%VZT_WR_SYMPRIME); } static struct vzt_wr_symbol *vzt_wr_symadd(struct vzt_wr_trace *lt, const char *name, int hv) { struct vzt_wr_symbol *s; s=(struct vzt_wr_symbol *)calloc(1,sizeof(struct vzt_wr_symbol)); strcpy(s->name=(char *)malloc((s->namlen=strlen(name))+1),name); s->next=lt->sym[hv]; lt->sym[hv]=s; return(s); } static struct vzt_wr_symbol *vzt_wr_symfind(struct vzt_wr_trace *lt, const char *s) { int hv; struct vzt_wr_symbol *temp; hv=vzt_wr_hash(s); if(!(temp=lt->sym[hv])) return(NULL); /* no hash entry, add here wanted to add */ while(temp) { if(!strcmp(temp->name,s)) { return(temp); /* in table already */ } if(!temp->next) break; temp=temp->next; } return(NULL); /* not found, add here if you want to add*/ } /* * compress facs to a prefix count + string + 0x00 */ static void vzt_wr_compress_fac(struct vzt_wr_trace *lt, char *str) { int i; int len = strlen(str); int minlen = (lencompress_fac_len) ? len : lt->compress_fac_len; if(minlen>65535) minlen=65535; /* keep in printable range--most hierarchies won't be this big anyway */ if(lt->compress_fac_str) { for(i=0;icompress_fac_str[i]!=str[i]) break; } vzt_wr_emit_u16z(lt, i); vzt_wr_emit_stringz(lt, str+i); free(lt->compress_fac_str); } else { vzt_wr_emit_u16z(lt, 0); vzt_wr_emit_stringz(lt, str); } lt->compress_fac_str = (char *) malloc((lt->compress_fac_len=len)+1); strcpy(lt->compress_fac_str, str); } /* * emit facs in sorted order along with geometry * and sync table info */ static void strip_brack(struct vzt_wr_symbol *s) { char *lastch = s->name+s->namlen - 1; if(*lastch!=']') return; if(s->namlen<3) return; lastch--; while(lastch!=s->name) { if(*lastch=='.') { return; /* MTI SV [0.3] notation for implicit vars */ } if(*lastch=='[') { *lastch=0x00; return; } lastch--; } return; } static void vzt_wr_emitfacs(struct vzt_wr_trace *lt) { int i; if((lt)&&(lt->numfacs)) { struct vzt_wr_symbol *s = lt->symchain; struct vzt_wr_symbol **aliascache = calloc(lt->numalias ? lt->numalias : 1, sizeof(struct vzt_wr_symbol *)); int aliases_encountered, facs_encountered; lt->sorted_facs = (struct vzt_wr_symbol **)calloc(lt->numfacs, sizeof(struct vzt_wr_symbol *)); if(lt->sorted_facs && aliascache) { if(lt->do_strip_brackets) for(i=0;inumfacs;i++) { lt->sorted_facs[lt->numfacs - i - 1] = s; /* facs were chained backwards so reverse to restore bitslicing */ strip_brack(s); s=s->symchain; } else for(i=0;inumfacs;i++) { lt->sorted_facs[lt->numfacs - i - 1] = s; /* facs were chained backwards so reverse to restore bitslicing */ s=s->symchain; } wave_msort(lt->sorted_facs, lt->numfacs); /* move facs up */ aliases_encountered = 0, facs_encountered = 0; for(i=0;inumfacs;i++) { if((lt->sorted_facs[i]->flags&VZT_WR_SYM_F_ALIAS)==0) { lt->sorted_facs[facs_encountered] = lt->sorted_facs[i]; facs_encountered++; } else { aliascache[aliases_encountered] = lt->sorted_facs[i]; aliases_encountered++; } } /* then append the aliases */ for(i=0;isorted_facs[facs_encountered+i] = aliascache[i]; } for(i=0;inumfacs;i++) { lt->sorted_facs[i]->facnum = i; } if(!lt->timezero) { vzt_wr_emit_u32(lt, lt->numfacs); /* uncompressed */ } else { vzt_wr_emit_u32(lt, 0); /* uncompressed, flag to insert extra parameters */ vzt_wr_emit_u32(lt, 8); /* uncompressed 8 counts timezero and on */ vzt_wr_emit_u32(lt, lt->numfacs); /* uncompressed */ vzt_wr_emit_u64(lt, (lt->timezero >> 32) & 0xffffffffL, lt->timezero & 0xffffffffL); /* uncompressed */ } vzt_wr_emit_u32(lt, lt->numfacbytes); /* uncompressed */ vzt_wr_emit_u32(lt, lt->longestname); /* uncompressed */ lt->facname_offset=lt->position; vzt_wr_emit_u32(lt, 0); /* uncompressed : placeholder for zfacnamesize */ vzt_wr_emit_u32(lt, 0); /* uncompressed : placeholder for zfacname_predec_size */ vzt_wr_emit_u32(lt, 0); /* uncompressed : placeholder for zfacgeometrysize */ vzt_wr_emit_u8(lt, lt->timescale); /* timescale (-9 default == nsec) */ fflush(lt->handle); lt->zfacname_size = lt->position; lt->zhandle = vzt_gzdopen(lt, dup(fileno(lt->handle)), "wb9"); lt->zpackcount = 0; for(i=0;inumfacs;i++) { vzt_wr_compress_fac(lt, lt->sorted_facs[i]->name); free(lt->sorted_facs[i]->name); lt->sorted_facs[i]->name = NULL; } free(lt->compress_fac_str); lt->compress_fac_str=NULL; lt->compress_fac_len=0; lt->zfacname_predec_size = lt->zpackcount; gzflush_buffered(lt, 1); fseeko(lt->handle, 0L, SEEK_END); lt->position=ftello(lt->handle); lt->zfacname_size = lt->position - lt->zfacname_size; lt->zhandle = vzt_gzdopen(lt, dup(fileno(lt->handle)), "wb9"); lt->facgeometry_offset = lt->position; for(i=0;inumfacs;i++) { if((lt->sorted_facs[i]->flags&VZT_WR_SYM_F_ALIAS)==0) { vzt_wr_emit_u32z(lt, lt->sorted_facs[i]->rows); vzt_wr_emit_u32z(lt, lt->sorted_facs[i]->msb); vzt_wr_emit_u32z(lt, lt->sorted_facs[i]->lsb); vzt_wr_emit_u32z(lt, lt->sorted_facs[i]->flags & VZT_WR_SYM_MASK); } else { vzt_wr_emit_u32z(lt, lt->sorted_facs[i]->aliased_to->facnum); vzt_wr_emit_u32z(lt, lt->sorted_facs[i]->msb); vzt_wr_emit_u32z(lt, lt->sorted_facs[i]->lsb); vzt_wr_emit_u32z(lt, VZT_WR_SYM_F_ALIAS); } } gzflush_buffered(lt, 1); fseeko(lt->handle, 0L, SEEK_END); lt->position=ftello(lt->handle); lt->break_header_size = lt->position; /* in case we need to emit multiple vzts with same header */ lt->zfacgeometry_size = lt->position - lt->facgeometry_offset; fseeko(lt->handle, lt->facname_offset, SEEK_SET); vzt_wr_emit_u32(lt, lt->zfacname_size); /* backpatch sizes... */ vzt_wr_emit_u32(lt, lt->zfacname_predec_size); vzt_wr_emit_u32(lt, lt->zfacgeometry_size); lt->numfacs = facs_encountered; /* don't process alias value changes ever */ } if(aliascache) free(aliascache); } } /* * initialize the trace and get back an lt context */ struct vzt_wr_trace *vzt_wr_init(const char *name) { struct vzt_wr_trace *lt=(struct vzt_wr_trace *)calloc(1, sizeof(struct vzt_wr_trace)); if((!name)||(!(lt->handle=fopen(name, "wb")))) { free(lt); lt=NULL; } else { lt->vztname = strdup(name); vzt_wr_emit_u16(lt, VZT_WR_HDRID); vzt_wr_emit_u16(lt, VZT_WR_VERSION); vzt_wr_emit_u8 (lt, VZT_WR_GRANULE_SIZE); /* currently 32 */ lt->timescale = -9; lt->maxgranule = VZT_WR_GRANULE_NUM; lt->timetable = calloc(lt->maxgranule * VZT_WR_GRANULE_SIZE, sizeof(vzttime_t)); vzt_wr_set_compression_depth(lt, 4); /* set fast/loose compression depth, user can fix this any time after init */ lt->initial_value = 'x'; lt->multi_state = 1; } return(lt); } /* * force trace to two state */ void vzt_wr_force_twostate(struct vzt_wr_trace *lt) { if((lt)&&(!lt->symchain)) { lt->multi_state = 0; } } /* * setting break size */ void vzt_wr_set_break_size(struct vzt_wr_trace *lt, off_t siz) { if(lt) { lt->break_size = siz; } } /* * set initial value of trace (0, 1, x, z) only legal vals */ void vzt_wr_set_initial_value(struct vzt_wr_trace *lt, char value) { if(lt) { switch(value) { case '0': case '1': case 'x': case 'z': break; case 'Z': value = 'z'; break; default: value = 'x'; break; } lt->initial_value = value; } } /* * maint function for finding a symbol if it exists */ struct vzt_wr_symbol *vzt_wr_symbol_find(struct vzt_wr_trace *lt, const char *name) { struct vzt_wr_symbol *s=NULL; if((lt)&&(name)) s=vzt_wr_symfind(lt, name); return(s); } /* * add a trace (if it doesn't exist already) */ struct vzt_wr_symbol *vzt_wr_symbol_add(struct vzt_wr_trace *lt, const char *name, unsigned int rows, int msb, int lsb, int flags) { struct vzt_wr_symbol *s; int i, len; int flagcnt; if((!lt)||(lt->sorted_facs)) return(NULL); flagcnt = ((flags&VZT_WR_SYM_F_INTEGER)!=0) + ((flags&VZT_WR_SYM_F_DOUBLE)!=0) + ((flags&VZT_WR_SYM_F_STRING)!=0); if((flagcnt>1)||(!lt)||(!name)||(vzt_wr_symfind(lt, name))) return (NULL); if(!(flags & (VZT_WR_SYM_F_INTEGER|VZT_WR_SYM_F_STRING|VZT_WR_SYM_F_DOUBLE))) { len = (msbrows = rows; s->flags = flags&(~VZT_WR_SYM_F_ALIAS); /* aliasing makes no sense here.. */ s->prev = (vzt_wr_dsvzt_Tree **)calloc(len, sizeof(vzt_wr_dsvzt_Tree *)); s->chg = (vztint32_t *)calloc(len, sizeof(vztint32_t)); if(lt->multi_state) { s->prevx = (vzt_wr_dsvzt_Tree **)calloc(len, sizeof(vzt_wr_dsvzt_Tree *)); s->chgx = (vztint32_t *)calloc(len, sizeof(vztint32_t)); } if(!flagcnt) { s->msb = msb; s->lsb = lsb; } s->len = len; if(!(flags & (VZT_WR_SYM_F_INTEGER|VZT_WR_SYM_F_STRING|VZT_WR_SYM_F_DOUBLE))) { if((lt->initial_value == '1')||(lt->initial_value == 'z')) { for(i=0;ilen;i++) { s->chg[i] = ~0; } } if(lt->multi_state) { if((lt->initial_value == 'x')||(lt->initial_value == 'z')) { for(i=0;ilen;i++) { s->chgx[i] = ~0; } } } } s->symchain = lt->symchain; lt->symchain = s; lt->numfacs++; if((len=strlen(name)) > lt->longestname) lt->longestname = len; lt->numfacbytes += (len+1); return(s); } /* * add an alias trace (if it doesn't exist already and orig is found) */ struct vzt_wr_symbol *vzt_wr_symbol_alias(struct vzt_wr_trace *lt, const char *existing_name, const char *alias, int msb, int lsb) { struct vzt_wr_symbol *s, *sa; int len; int bitlen; int flagcnt; if((!lt)||(!existing_name)||(!alias)||(!(s=vzt_wr_symfind(lt, existing_name)))||(vzt_wr_symfind(lt, alias))) return (NULL); if(lt->sorted_facs) return(NULL); while(s->aliased_to) /* find root alias */ { s=s->aliased_to; } flagcnt = ((s->flags&VZT_WR_SYM_F_INTEGER)!=0) + ((s->flags&VZT_WR_SYM_F_DOUBLE)!=0) + ((s->flags&VZT_WR_SYM_F_STRING)!=0); bitlen = (msblen)) return(NULL); sa=vzt_wr_symadd(lt, alias, vzt_wr_hash(alias)); sa->flags = VZT_WR_SYM_F_ALIAS; /* only point this can get set */ sa->aliased_to = s; if(!flagcnt) { sa->msb = msb; sa->lsb = lsb; sa->len = bitlen; } sa->symchain = lt->symchain; lt->symchain = sa; lt->numfacs++; lt->numalias++; if((len=strlen(alias)) > lt->longestname) lt->longestname = len; lt->numfacbytes += (len+1); return(sa); } /* * set current time/granule updating */ int vzt_wr_inc_time_by_delta(struct vzt_wr_trace *lt, unsigned int timeval) { return(vzt_wr_set_time64(lt, lt->maxtime + (vzttime_t)timeval)); } int vzt_wr_set_time(struct vzt_wr_trace *lt, unsigned int timeval) { return(vzt_wr_set_time64(lt, (vzttime_t)timeval)); } int vzt_wr_inc_time_by_delta64(struct vzt_wr_trace *lt, vzttime_t timeval) { return(vzt_wr_set_time64(lt, lt->maxtime + timeval)); } /* * file size limiting/header cloning... */ static void vzt_wr_emit_do_breakfile(struct vzt_wr_trace *lt) { unsigned int len = strlen(lt->vztname); int i; char *tname = malloc(len + 30); FILE *f2, *clone; off_t cnt, seg; char buf[32768]; for(i=len;i>0;i--) { if(lt->vztname[i]=='.') break; } if(!i) { sprintf(tname, "%s_%03d.vzt", lt->vztname, ++lt->break_number); } else { memcpy(tname, lt->vztname, i); sprintf(tname+i, "_%03d.vzt", ++lt->break_number); } f2 = fopen(tname, "wb"); if(!f2) /* if error, keep writing to same output file...sorry */ { free(tname); return; } clone = fopen(lt->vztname, "rb"); if(!clone) { /* this should never happen */ fclose(f2); unlink(tname); free(tname); return; } /* clone original header */ for(cnt = 0; cnt < lt->break_header_size; cnt += sizeof(buf)) { seg = lt->break_header_size - cnt; if(seg > (off_t)sizeof(buf)) { seg = sizeof(buf); } if(fread(buf, seg, 1, clone)) { if(!fwrite(buf, seg, 1, f2)) break; /* write error! */ } } fclose(clone); fclose(lt->handle); lt->handle = f2; free(tname); } static void vzt_wr_recurse_reorder_dict(vzt_wr_dsvzt_Tree *t, struct vzt_wr_trace *lt, vztint32_t *newval, vztint32_t *bpnt, int depth) { int i, j; if(t->left) { vzt_wr_recurse_reorder_dict(t->left, lt, newval, bpnt, depth); } *bpnt = t->item; if(t->child) { vzt_wr_recurse_reorder_dict(t->child, lt, newval, bpnt+1, depth+1); } else { vztint32_t *bpnt2 = bpnt - depth + 1; t->val = *newval; /* resequence the dict entries in lexical order */ *newval = *newval+1; if(!lt->rle) { for(i=0;irle_start; vztint32_t run = 0; lt->rle_start = (*bpnt2) & 1; for(i=0;i>= 1; } } vzt_wr_emit_uv32z(lt, run); } } if(t->right) { vzt_wr_recurse_reorder_dict(t->right, lt, newval, bpnt, depth); } } static void vzt_wr_recurse_free_dict(vzt_wr_dsvzt_Tree *t) { if(t->left) { vzt_wr_recurse_free_dict(t->left); } if(t->child) { vzt_wr_recurse_free_dict(t->child); } if(t->right) { vzt_wr_recurse_free_dict(t->right); } free(t); } /* * emit granule */ void vzt_wr_flush_granule(struct vzt_wr_trace *lt, int do_finalize) { int i, j; vztsint32_t k; int val; unsigned int numticks; if(!lt->emitted) /* only happens if there are no value changes */ { vzt_wr_emitfacs(lt); lt->emitted = 1; } if(!lt->timegranule) { vzt_wr_dsvzt_Tree *t=NULL; val = 0; for(j=0;jnumfacs;j++) { struct vzt_wr_symbol *s = lt->sorted_facs[j]; for(i=0;ilen;i++) { t = vzt_wr_dsvzt_splay(s->chg[i], t); if(!vzt_wr_dsvzt_success) { t = vzt_wr_dsvzt_insert(s->chg[i], t, val++); } k = s->chg[i]; s->chg[i] = k>>31; s->prev[i] = t; } } if(lt->multi_state) for(j=0;jnumfacs;j++) { struct vzt_wr_symbol *s = lt->sorted_facs[j]; for(i=0;ilen;i++) { lt->use_multi_state |= s->chgx[i]; t = vzt_wr_dsvzt_splay(s->chgx[i], t); if(!vzt_wr_dsvzt_success) { t = vzt_wr_dsvzt_insert(s->chgx[i], t, val++); } k = s->chgx[i]; s->chgx[i] = k>>31; s->prevx[i] = t; } } lt->dict = t; } else { vzt_wr_dsvzt_Tree *t; val = 0; for(j=0;jnumfacs;j++) { struct vzt_wr_symbol *s = lt->sorted_facs[j]; for(i=0;ilen;i++) { t = s->prev[i]->child; t = vzt_wr_dsvzt_splay(s->chg[i], t); if(!vzt_wr_dsvzt_success) { t = vzt_wr_dsvzt_insert(s->chg[i], t, val++); } k = s->chg[i]; s->chg[i] = k>>31; s->prev[i]->child = t; s->prev[i] = t; } } if(lt->multi_state) for(j=0;jnumfacs;j++) { struct vzt_wr_symbol *s = lt->sorted_facs[j]; for(i=0;ilen;i++) { t = s->prevx[i]->child; lt->use_multi_state |= s->chgx[i]; t = vzt_wr_dsvzt_splay(s->chgx[i], t); if(!vzt_wr_dsvzt_success) { t = vzt_wr_dsvzt_insert(s->chgx[i], t, val++); } k = s->chgx[i]; s->chgx[i] = k>>31; s->prevx[i]->child = t; s->prevx[i] = t; } } } numticks = lt->timegranule * VZT_WR_GRANULE_SIZE + lt->timepos; lt->timepos = 0; lt->timegranule++; if((lt->timegranule >= lt->maxgranule)||(do_finalize)) { off_t clen, unclen; vztint32_t newval = 0; int attempt_break_state = 2; do { fseeko(lt->handle, 0L, SEEK_END); lt->current_chunk=lt->position = ftello(lt->handle); if((lt->break_size)&&(attempt_break_state==2)&&(lt->position >= lt->break_size)&&(lt->position != lt->break_header_size)) { vzt_wr_emit_do_breakfile(lt); attempt_break_state--; } else { attempt_break_state = 0; } } while(attempt_break_state); /* flush everything here */ fseeko(lt->handle, 0L, SEEK_END); lt->current_chunk=lt->position = ftello(lt->handle); vzt_wr_emit_u32(lt, 0); /* size of this section (uncompressed) */ vzt_wr_emit_u32(lt, 0); /* size of this section (compressed) */ vzt_wr_emit_u64(lt, 0, 0); /* begin time of section */ vzt_wr_emit_u64(lt, 0, 0); /* end time of section */ fflush(lt->handle); lt->current_chunkz = lt->position; lt->zhandle = vzt_gzdopen(lt, dup(fileno(lt->handle)), lt->zmode); lt->zpackcount = 0; if((lt->lasttime - lt->firsttime + 1) == numticks) { vzt_wr_emit_uv32z(lt, 0); /* special case for cycle simulation */ } else { vzt_wr_emit_uv32z(lt, numticks); /* number of time ticks */ for(i=0;i<((int)numticks);i++) { vzt_wr_emit_uv64z(lt, i ? lt->timetable[i] - lt->timetable[i-1] : lt->timetable[i]); /* emit delta */ } gzflush_buffered(lt, 0); } vzt_wr_emit_uv32z(lt, lt->timegranule); /* number of 32-bit sections */ lt->timegranule = 0; vzt_wr_emit_uv32z(lt, val); /* number of dict entries */ while((lt->zpackcount & 3) != 0) { vzt_wr_emit_u8z(lt, 0); /* pad to word boundary for machines which need aligned data on reads */ } { vztint32_t * buf = alloca(lt->maxgranule * sizeof(vztint32_t)); memset(buf, 0, lt->maxgranule * sizeof(vztint32_t)); if(lt->rle) lt->rle_start = 0; vzt_wr_recurse_reorder_dict(lt->dict, lt, &newval, buf, 1); } gzflush_buffered(lt, 0); vzt_wr_emit_u8z(lt, (lt->multi_state)&&(lt->use_multi_state)); /* indicates number of bitplanes past twostate */ while((lt->zpackcount & 3) != 0) { vzt_wr_emit_u8z(lt, 0); /* pad to word boundary for machines which need aligned data on reads */ } for(j=0;jnumfacs;j++) { struct vzt_wr_symbol *s = lt->sorted_facs[j]; for(i=0;ilen;i++) { vzt_wr_emit_u32rz(lt, s->prev[i]->val); } } if((lt->multi_state)&&(lt->use_multi_state)) { for(j=0;jnumfacs;j++) { struct vzt_wr_symbol *s = lt->sorted_facs[j]; for(i=0;ilen;i++) { vzt_wr_emit_u32rz(lt, s->prevx[i]->val); } } lt->use_multi_state = 0; } gzflush_buffered(lt, 0); vzt_wr_emit_uv32z(lt, lt->numstrings); if(lt->numstrings) { vzt2_wr_dsvzt_Tree *ds, *ds2; ds = lt->str_head; for(i=0;inumstrings;i++) { /* fprintf(stderr, "%8d %8d) '%s'\n", ds->val, i, ds->item); */ if(ds->val != ((vztint32_t)i)) { fprintf(stderr, "internal error line %d\n", __LINE__); exit(255); } vzt_wr_emit_stringz(lt, ds->item); ds2 = ds->next; free(ds->item); free(ds); ds = ds2; } lt->str_head = lt->str_curr = lt->str = NULL; lt->numstrings = 0; } gzflush_buffered(lt, 1); fseeko(lt->handle, 0L, SEEK_END); lt->position = ftello(lt->handle); unclen = lt->zpackcount; clen = lt->position - lt->current_chunkz; fseeko(lt->handle, lt->current_chunk, SEEK_SET); vzt_wr_emit_u32(lt, unclen); /* size of this section (uncompressed) */ vzt_wr_emit_u32(lt, clen); /* size of this section (compressed) */ if(!lt->rle) { vzt_wr_emit_u64(lt, (lt->firsttime >> 32) & 0xffffffffL, lt->firsttime & 0xffffffffL); /* begin time */ vzt_wr_emit_u64(lt, (lt->lasttime >> 32) & 0xffffffffL, lt->lasttime & 0xffffffffL); /* end time */ } else /* inverted time is the marker the reader needs to look at to see that RLE is used */ { vzt_wr_emit_u64(lt, (lt->lasttime >> 32) & 0xffffffffL, lt->lasttime & 0xffffffffL); /* end time */ vzt_wr_emit_u64(lt, (lt->firsttime >> 32) & 0xffffffffL, lt->firsttime & 0xffffffffL); /* begin time */ } fflush(lt->handle); vzt_wr_recurse_free_dict(lt->dict); lt->dict = NULL; } } int vzt_wr_set_time64(struct vzt_wr_trace *lt, vzttime_t timeval) { int rc=0; if(lt) { if(lt->timeset) { if(timeval > lt->maxtime) { if(lt->bumptime) { lt->bumptime = 0; if(!lt->flush_valid) { lt->timepos++; } else { lt->flush_valid = 0; } if(lt->timepos == VZT_WR_GRANULE_SIZE) { vzt_wr_flush_granule(lt, 0); } } lt->timetable[lt->timepos + lt->timegranule * VZT_WR_GRANULE_SIZE] = timeval; lt->lasttime = timeval; } } else { lt->timeset = 1; lt->mintime = lt->maxtime = timeval; lt->timetable[lt->timepos + lt->timegranule * VZT_WR_GRANULE_SIZE] = timeval; } if( (!lt->timepos) && (!lt->timegranule) ) { lt->firsttime = timeval; lt->lasttime = timeval; } lt->granule_dirty = 1; rc = 1; } return(rc); } /* * sets trace timescale as 10**x seconds */ void vzt_wr_set_timescale(struct vzt_wr_trace *lt, int timescale) { if(lt) { lt->timescale = timescale; } } /* * set number of granules per section * (can modify dynamically but size never can decrease) */ void vzt_wr_set_maxgranule(struct vzt_wr_trace *lt, unsigned int maxgranule) { if(lt) { if(!maxgranule) maxgranule = 8; if(maxgranule > lt->maxgranule) { vzttime_t *t = calloc(maxgranule * VZT_WR_GRANULE_SIZE, sizeof(vzttime_t)); memcpy(t, lt->timetable, lt->maxgranule * VZT_WR_GRANULE_SIZE * sizeof(vzttime_t)); free(lt->timetable); lt->timetable = t; lt->maxgranule = maxgranule; } } } /* * Sets bracket stripping (useful for VCD conversions of * bitblasted nets) */ void vzt_wr_symbol_bracket_stripping(struct vzt_wr_trace *lt, int doit) { if(lt) { lt->do_strip_brackets = (doit!=0); } } static char *vzt_wr_expand_integer_to_bits(unsigned int len, int value) { static char s[33]; char *p = s; unsigned int i; if(len>32) len=32; len--; for(i=0;i<=len;i++) { *(p++) = '0' | ((value & (1<<(len-i)))!=0); } *p = 0; return(s); } int vzt_wr_emit_value_int(struct vzt_wr_trace *lt, struct vzt_wr_symbol *s, unsigned int row, int value) { int rc=0; if((!lt)||(lt->blackout)||(!s)||(row)) return(rc); return(vzt_wr_emit_value_bit_string(lt, s, row, vzt_wr_expand_integer_to_bits(s->len, value))); } int vzt_wr_emit_value_double(struct vzt_wr_trace *lt, struct vzt_wr_symbol *s, unsigned int row, double value) { char xdrdata[8]; #if HAVE_RPC_XDR_H XDR x; #else const vztint32_t endian_matchword = 0x12345678; #endif vztint32_t msk, msk_n; int i; if((!lt)||(lt->blackout)||(!s)||(!(s->flags&VZT_WR_SYM_F_DOUBLE))||(row)) return(0); if(!lt->emitted) { vzt_wr_emitfacs(lt); lt->emitted = 1; if(!lt->timeset) { vzt_wr_set_time(lt, 0); } } while(s->aliased_to) /* find root alias if exists */ { s=s->aliased_to; } #if HAVE_RPC_XDR_H xdrmem_create(&x, xdrdata, sizeof(xdrdata), XDR_ENCODE); xdr_double(&x, &value); #else /* byte ordering in windows is reverse of XDR (on x86, that is) */ if(*((char *)&endian_matchword) == 0x78) { for(i=0;i<8;i++) { xdrdata[i] = ((char *)&value)[7-i]; } } else { memcpy(xdrdata, &value, sizeof(double)); /* big endian, don't bytereverse */ } #endif lt->bumptime = 1; msk = (~0 << lt->timepos); msk_n = ~msk; for(i=0;ilen;i++) { int byte = i/8; int bit = 7-(i&7); s->chg[i] &= msk_n; if(xdrdata[byte]&(1<chg[i] |= msk; } } lt->granule_dirty = 1; return(1); } int vzt_wr_emit_value_string(struct vzt_wr_trace *lt, struct vzt_wr_symbol *s, unsigned int row, char *value) { int rc=0; int idx; vztint32_t msk, msk_n; int i; if((!lt)||(lt->blackout)||(!s)||(!value)||(row)) return(rc); if(!lt->emitted) { vzt_wr_emitfacs(lt); lt->emitted = 1; if(!lt->timeset) { vzt_wr_set_time(lt, 0); } } while(s->aliased_to) /* find root alias if exists */ { s=s->aliased_to; } lt->str = vzt2_wr_dsvzt_splay (value, lt->str); if(!vzt2_wr_dsvzt_success) { char *vcopy = strdup(value); if(!lt->str_curr) { lt->str = vzt2_wr_dsvzt_insert(strdup(""), NULL, lt->numstrings++); /* zeroth string means no value change in future blocks */ lt->str_head = lt->str_curr = lt->str; } lt->str = vzt2_wr_dsvzt_insert(vcopy, lt->str, lt->numstrings); lt->str_curr->next = lt->str; lt->str_curr = lt->str; idx = lt->numstrings; lt->numstrings++; } else { idx = lt->str->val; } lt->bumptime = 1; msk = (~0 << lt->timepos); msk_n = ~msk; for(i=0;ilen;i++) { s->chg[i] &= msk_n; if(idx & (1 << (s->len - i - 1))) { s->chg[i] |= msk; } } lt->granule_dirty = 1; return(rc); } int vzt_wr_emit_value_bit_string(struct vzt_wr_trace *lt, struct vzt_wr_symbol *s, unsigned int row, char *value) { int rc=0; char *vfix; int valuelen; int i; vztint32_t msk, msk_n; if((!lt)||(lt->blackout)||(!s)||(!value)||(!*value)||(row)) return(rc); if(!lt->emitted) { vzt_wr_emitfacs(lt); lt->emitted = 1; if(!lt->timeset) { vzt_wr_set_time(lt, 0); } } while(s->aliased_to) /* find root alias if exists */ { s=s->aliased_to; } valuelen = strlen(value); /* ensure string is proper length */ if(valuelen == s->len) { vfix = alloca(s->len+1); strcpy(vfix, value); value = vfix; } else { vfix = alloca(s->len+1); if(valuelen < s->len) { int lendelta = s->len - valuelen; memset(vfix, (value[0]!='1') ? value[0] : '0', lendelta); strcpy(vfix+lendelta, value); } else { memcpy(vfix, value, s->len); vfix[s->len] = 0; } value = vfix; } msk = (~0 << lt->timepos); msk_n = ~msk; if(!lt->multi_state) { for(i=0;ilen;i++) { unsigned char ch = value[i]; if(ch>'1') { ch |= 1; } s->chg[i] &= msk_n; if(ch&1) { s->chg[i] |= msk; } } } else { for(i=0;ilen;i++) { /* 0 = 00, 1 = 01, x = 10, z = 11 */ unsigned char ch = value[i]; if((ch=='z')||(ch=='Z')) { ch |= 1; } s->chg[i] &= msk_n; if(ch&1) { s->chg[i] |= msk; } s->chgx[i] &= msk_n; if(ch>'1') { s->chgx[i] |= msk; } } } lt->bumptime = 1; lt->granule_dirty = 1; return(rc); } /* * dumping control */ void vzt_wr_set_dumpoff(struct vzt_wr_trace *lt) { int i, j; vztint32_t msk, msk_n; if(lt) { msk = (~0 << lt->timepos); msk_n = ~msk; for(j=0;jnumfacs;j++) { struct vzt_wr_symbol *s = lt->sorted_facs[j]; for(i=0;ilen;i++) { s->chg[i] &= msk_n; } if(lt->multi_state) { if(!(s->flags & (VZT_WR_SYM_F_INTEGER|VZT_WR_SYM_F_STRING|VZT_WR_SYM_F_DOUBLE))) { for(i=0;ilen;i++) { s->chgx[i] |= msk; } } } else { for(i=0;ilen;i++) { s->chgx[i] &= msk_n; /* simply precautionary: in case someone does assign an int to x */ } } } lt->blackout = 1; } } void vzt_wr_set_dumpon(struct vzt_wr_trace *lt) { if(lt) { lt->blackout = 0; } } /* * flush the trace... */ void vzt_wr_flush(struct vzt_wr_trace *lt) { if(lt) { if((lt->timegranule)||(lt->timepos > 0)) { if(lt->granule_dirty) { lt->timepos++; vzt_wr_flush_granule(lt, 1); } } } } /* * close out the trace and fixate it */ void vzt_wr_close(struct vzt_wr_trace *lt) { if(lt) { if(lt->granule_dirty) { lt->timepos++; vzt_wr_flush_granule(lt, 1); } if(lt->symchain) { struct vzt_wr_symbol *s = lt->symchain; struct vzt_wr_symbol *s2; while(s) { if(s->name) { free(s->name); } if(s->prev) { free(s->prev); } if(s->chg) { free(s->chg); } if(s->prevx){ free(s->prevx);} if(s->chgx) { free(s->chgx); } s2=s->symchain; free(s); s=s2; } lt->symchain = NULL; } free(lt->vztname); free(lt->timetable); free(lt->sorted_facs); fclose(lt->handle); free(lt); } } /* * set compression depth */ void vzt_wr_set_compression_depth(struct vzt_wr_trace *lt, unsigned int depth) { if(lt) { if(depth > 9) depth = 9; sprintf(lt->zmode, "wb%d", depth); } } /* * set compression type */ void vzt_wr_set_compression_type(struct vzt_wr_trace *lt, unsigned int type) { if(lt) { if((type == VZT_WR_IS_GZ) || (type == VZT_WR_IS_BZ2) || (type == VZT_WR_IS_LZMA)) { lt->ztype_cfg = type; } } } /* * set rle mode type */ void vzt_wr_set_rle(struct vzt_wr_trace *lt, unsigned int mode) { if(lt) { lt->rle = (mode != 0); } } /* * time zero offset */ void vzt_wr_set_timezero(struct vzt_wr_trace *lt, vztsint64_t timeval) { if(lt) { lt->timezero = timeval; } } gtkwave-3.3.86/src/helpers/vzt_write.h0000664000175000017500000002362513166335473017253 0ustar bybellbybell/* * Copyright (c) 2004-2010 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef DEFS_VZTW_H #define DEFS_VZTW_H #ifdef __cplusplus extern "C" { #endif #include #include #include #include #include #include #ifdef HAVE_INTTYPES_H #include #endif #include #include #include #ifndef HAVE_FSEEKO #define fseeko fseek #define ftello ftell #endif #define VZT_WR_HDRID (('V' << 8) + ('Z')) #define VZT_WR_VERSION (0x0001) #define VZT_WR_GRANULE_SIZE (32) #define VZT_WR_GRANULE_NUM (8) #define VZT_WR_GZWRITE_BUFFER 4096 #define VZT_WR_SYMPRIME 500009 #ifndef _MSC_VER typedef uint8_t vztint8_t; typedef uint16_t vztint16_t; typedef uint32_t vztint32_t; typedef uint64_t vztint64_t; typedef int32_t vztsint32_t; typedef int64_t vztsint64_t; typedef uint64_t vzttime_t; #ifndef __MINGW32__ #define VZT_WR_LLD "%lld" #else #define VZT_WR_LLD "%I64d" #endif #define VZT_WR_LLDESC(x) x##LL #define VZT_WR_ULLDESC(x) x##ULL #else typedef unsigned __int8 vztint8_t; typedef unsigned __int16 vztint16_t; typedef unsigned __int32 vztint32_t; typedef unsigned __int64 vztint64_t; typedef __int32 vztsint32_t; typedef __int64 vztsint64_t; typedef unsigned __int64 vzttime_t; #define VZT_WR_LLD "%I64d" #define VZT_WR_LLDESC(x) x##i64 #define VZT_WR_ULLDESC(x) x##i64 #endif #ifdef __GNUC__ #if __STDC_VERSION__ >= 199901L #define _VZT_WR_INLINE inline __attribute__((__gnu_inline__)) #else #define _VZT_WR_INLINE inline #endif #else #define _VZT_WR_INLINE #endif /* * integer splay */ typedef struct vzt_wr_dsvzt_tree_node vzt_wr_dsvzt_Tree; struct vzt_wr_dsvzt_tree_node { vzt_wr_dsvzt_Tree * left, * right; vzt_wr_dsvzt_Tree * child; vztint32_t item; vztint32_t val; }; /* * string splay */ typedef struct vzt2_wr_dsvzt_tree_node vzt2_wr_dsvzt_Tree; struct vzt2_wr_dsvzt_tree_node { vzt2_wr_dsvzt_Tree * left, * right; char *item; unsigned int val; vzt2_wr_dsvzt_Tree * next; }; struct vzt_wr_trace { FILE *handle; void *zhandle; vzt_wr_dsvzt_Tree *dict; vzt_wr_dsvzt_Tree *dict_cache; /* for fast malloc/free */ int numstrings; vzt2_wr_dsvzt_Tree *str_head, *str_curr, *str; /* for potential string vchgs */ off_t position; off_t zfacname_predec_size, zfacname_size, zfacgeometry_size; off_t zpackcount, zpackcount_cumulative; off_t current_chunk, current_chunkz; struct vzt_wr_symbol **sorted_facs; struct vzt_wr_symbol *symchain; int numfacs, numalias; int numfacbytes; int longestname; int numsections, numblock; off_t facname_offset, facgeometry_offset; vzttime_t mintime, maxtime; unsigned int timegranule; int timescale; int timepos; vzttime_t *timetable; unsigned int maxgranule; vzttime_t firsttime, lasttime; char *compress_fac_str; int compress_fac_len; vztsint64_t timezero; vzttime_t flushtime; unsigned flush_valid : 1; unsigned do_strip_brackets : 1; unsigned emitted : 1; /* gate off change field zmode changes when set */ unsigned timeset : 1; /* time has been modified from 0..0 */ unsigned bumptime : 1; /* says that must go to next time position in granule as value change exists for current time */ unsigned granule_dirty : 1; /* for flushing out final block */ unsigned blackout : 1; /* blackout on/off */ unsigned multi_state : 1; /* 2 or 4 state marker */ unsigned use_multi_state : 1; /* if zero, can shortcut to 2 state */ unsigned ztype : 2; /* 0: gzip (default), 1: bzip2, 2: lzma */ unsigned ztype_cfg : 2; /* 0: gzip (default), 1: bzip2, 2: lzma */ unsigned rle : 1; /* emit rle packed value section */ unsigned rle_start : 1; /* initial/previous rle value */ char initial_value; char zmode[4]; /* fills in with "wb0".."wb9" */ unsigned int gzbufpnt; char *vztname; off_t break_size; off_t break_header_size; unsigned int break_number; /* larger datasets at end */ unsigned char gzdest[VZT_WR_GZWRITE_BUFFER + 10]; /* enough for zlib buffering */ struct vzt_wr_symbol *sym[VZT_WR_SYMPRIME]; }; struct vzt_wr_symbol { struct vzt_wr_symbol *next; struct vzt_wr_symbol *symchain; char *name; int namlen; int facnum; struct vzt_wr_symbol *aliased_to; unsigned int rows; int msb, lsb; int len; int flags; vzt_wr_dsvzt_Tree **prev; /* previous chain (for len bits) */ vztint32_t *chg; /* for len bits */ vzt_wr_dsvzt_Tree **prevx; /* previous xchain (for len bits) */ vztint32_t *chgx; /* for len xbits */ }; #define VZT_WR_IS_GZ (0) #define VZT_WR_IS_BZ2 (1) #define VZT_WR_IS_LZMA (2) #define VZT_WR_SYM_F_BITS (0) #define VZT_WR_SYM_F_INTEGER (1<<0) #define VZT_WR_SYM_F_DOUBLE (1<<1) #define VZT_WR_SYM_F_STRING (1<<2) #define VZT_WR_SYM_F_TIME (VZT_WR_SYM_F_STRING) /* user must correctly format this as a string */ #define VZT_WR_SYM_F_ALIAS (1<<3) #define VZT_WR_SYM_F_SIGNED (1<<4) #define VZT_WR_SYM_F_BOOLEAN (1<<5) #define VZT_WR_SYM_F_NATURAL ((1<<6)|(VZT_WR_SYM_F_INTEGER)) #define VZT_WR_SYM_F_POSITIVE ((1<<7)|(VZT_WR_SYM_F_INTEGER)) #define VZT_WR_SYM_F_CHARACTER (1<<8) #define VZT_WR_SYM_F_CONSTANT (1<<9) #define VZT_WR_SYM_F_VARIABLE (1<<10) #define VZT_WR_SYM_F_SIGNAL (1<<11) #define VZT_WR_SYM_F_IN (1<<12) #define VZT_WR_SYM_F_OUT (1<<13) #define VZT_WR_SYM_F_INOUT (1<<14) #define VZT_WR_SYM_F_WIRE (1<<15) #define VZT_WR_SYM_F_REG (1<<16) #define VZT_WR_SYM_MASK (VZT_WR_SYM_F_BITS|VZT_WR_SYM_F_INTEGER|VZT_WR_SYM_F_DOUBLE|VZT_WR_SYM_F_STRING|VZT_WR_SYM_F_TIME| \ VZT_WR_SYM_F_ALIAS|VZT_WR_SYM_F_SIGNED|VZT_WR_SYM_F_BOOLEAN|VZT_WR_SYM_F_NATURAL| \ VZT_WR_SYM_F_POSITIVE|VZT_WR_SYM_F_CHARACTER|VZT_WR_SYM_F_CONSTANT|VZT_WR_SYM_F_VARIABLE| \ VZT_WR_SYM_F_SIGNAL|VZT_WR_SYM_F_IN|VZT_WR_SYM_F_OUT|VZT_WR_SYM_F_INOUT|VZT_WR_SYM_F_WIRE| \ VZT_WR_SYM_F_REG) #define VZT_WR_SYM_F_SYNVEC (1<<17) /* reader synthesized vector in alias sec'n from non-adjacent vectorizing */ /* file I/O */ struct vzt_wr_trace * vzt_wr_init(const char *name); void vzt_wr_flush(struct vzt_wr_trace *lt); void vzt_wr_close(struct vzt_wr_trace *lt); /* for dealing with very large traces, split into multiple files approximately "siz" in length */ void vzt_wr_set_break_size(struct vzt_wr_trace *lt, off_t siz); /* 0 = gzip, 1 = bzip2 */ void vzt_wr_set_compression_type(struct vzt_wr_trace *lt, unsigned int type); /* 0 = no compression, 9 = best compression, 4 = default */ void vzt_wr_set_compression_depth(struct vzt_wr_trace *lt, unsigned int depth); /* 0 = pure value changes, 1 = rle packed */ void vzt_wr_set_rle(struct vzt_wr_trace *lt, unsigned int mode); /* bitplane depth: must call before adding any facilities */ void vzt_wr_force_twostate(struct vzt_wr_trace *lt); /* facility creation */ void vzt_wr_set_initial_value(struct vzt_wr_trace *lt, char value); struct vzt_wr_symbol * vzt_wr_symbol_find(struct vzt_wr_trace *lt, const char *name); struct vzt_wr_symbol * vzt_wr_symbol_add(struct vzt_wr_trace *lt, const char *name, unsigned int rows, int msb, int lsb, int flags); struct vzt_wr_symbol * vzt_wr_symbol_alias(struct vzt_wr_trace *lt, const char *existing_name, const char *alias, int msb, int lsb); void vzt_wr_symbol_bracket_stripping(struct vzt_wr_trace *lt, int doit); /* each granule is VZT_WR_GRANULE_SIZE (32) timesteps, default is 8 per section */ void vzt_wr_set_maxgranule(struct vzt_wr_trace *lt, unsigned int maxgranule); /* time ops */ void vzt_wr_set_timescale(struct vzt_wr_trace *lt, int timescale); void vzt_wr_set_timezero(struct vzt_wr_trace *lt, vztsint64_t timeval); int vzt_wr_set_time(struct vzt_wr_trace *lt, unsigned int timeval); int vzt_wr_inc_time_by_delta(struct vzt_wr_trace *lt, unsigned int timeval); int vzt_wr_set_time64(struct vzt_wr_trace *lt, vzttime_t timeval); int vzt_wr_inc_time_by_delta64(struct vzt_wr_trace *lt, vzttime_t timeval); /* allows blackout regions in VZT files */ void vzt_wr_set_dumpoff(struct vzt_wr_trace *lt); void vzt_wr_set_dumpon(struct vzt_wr_trace *lt); /* left fill on bit_string uses vcd semantics (left fill with value[0] unless value[0]=='1', then use '0') */ int vzt_wr_emit_value_int(struct vzt_wr_trace *lt, struct vzt_wr_symbol *s, unsigned int row, int value); int vzt_wr_emit_value_double(struct vzt_wr_trace *lt, struct vzt_wr_symbol *s, unsigned int row, double value); int vzt_wr_emit_value_string(struct vzt_wr_trace *lt, struct vzt_wr_symbol *s, unsigned int row, char *value); int vzt_wr_emit_value_bit_string(struct vzt_wr_trace *lt, struct vzt_wr_symbol *s, unsigned int row, char *value); #ifdef __cplusplus } #endif #endif gtkwave-3.3.86/src/ptranslate.h0000664000175000017500000000127613166335473015727 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2005. * * 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. */ #include "globals.h" #ifndef WAVE_PTRANSLATE_H #define WAVE_PTRANSLATE_H #include #include #include #include "fgetdynamic.h" #include "debug.h" #define PROC_FILTER_MAX (128) void ptrans_searchbox(char *title); void init_proctrans_data(void); int install_proc_filter(int which); void set_current_translate_proc(char *name); void remove_all_proc_filters(void); #endif gtkwave-3.3.86/src/getopt1.c0000664000175000017500000001124413166335473015124 0ustar bybellbybell/* getopt_long and getopt_long_only entry points for GNU getopt. Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street - Suite 500, Boston, MA 02110-1335, USA */ #if 0 #define HAVE_CONFIG_H /* needed for Wine */ #endif #ifdef HAVE_CONFIG_H #include #endif #ifdef HAVE_GETOPT_LONG #define ELIDE_CODE #endif #ifdef _LIBC # include #else # include "gnu-getopt.h" #endif #if !defined __STDC__ || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ #ifndef const #define const #endif #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #define GETOPT_INTERFACE_VERSION 2 #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 #include #if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION #define ELIDE_CODE #endif #endif #ifndef ELIDE_CODE /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ #include #endif #ifndef NULL #define NULL 0 #endif int getopt_long (argc, argv, options, long_options, opt_index) int argc; char *const *argv; const char *options; const struct option *long_options; int *opt_index; { return _getopt_internal (argc, argv, options, long_options, opt_index, 0); } /* Like getopt_long, but '-' as well as '--' can indicate a long option. If an option that starts with '-' (not '--') doesn't match a long option, but does match a short option, it is parsed as a short option instead. */ int getopt_long_only (argc, argv, options, long_options, opt_index) int argc; char *const *argv; const char *options; const struct option *long_options; int *opt_index; { return _getopt_internal (argc, argv, options, long_options, opt_index, 1); } # ifdef _LIBC libc_hidden_def (getopt_long) libc_hidden_def (getopt_long_only) # endif #endif /* Not ELIDE_CODE. */ #ifdef TEST #include int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; int option_index = 0; static struct option long_options[] = { {"add", 1, 0, 0}, {"append", 0, 0, 0}, {"delete", 1, 0, 0}, {"verbose", 0, 0, 0}, {"create", 0, 0, 0}, {"file", 1, 0, 0}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "abc:d:0123456789", long_options, &option_index); if (c == -1) break; switch (c) { case 0: printf ("option %s", long_options[option_index].name); if (optarg) printf (" with arg %s", optarg); printf ("\n"); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case 'd': printf ("option d with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ gtkwave-3.3.86/src/logfile.h0000664000175000017500000000063213166335473015166 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010 * * 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. */ #ifndef WAVE_LOGFILE_H #define WAVE_LOGFILE_H void logbox(char *title, int width, char *default_text); #endif gtkwave-3.3.86/src/pixmaps.h0000664000175000017500000000115613166335473015230 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2011. * * 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. */ #include "globals.h" #ifndef WAVE_PIXMAPS_H #define WAVE_PIXMAPS_H #include #ifdef MAC_INTEGRATION GdkPixbuf * #else void #endif make_pixmaps(GtkWidget *window); #ifdef WAVE_USE_GTK2 #define WAVE_SPLASH_X (512) #define WAVE_SPLASH_Y (384) void make_splash_pixmaps(GtkWidget *window); #endif #endif gtkwave-3.3.86/src/vcd_partial.c0000664000175000017500000022476713166335473016051 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2017. * * 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. */ /* * vcd.c 23jan99ajb * evcd parts 29jun99ajb * profiler optimizations 15jul99ajb * more profiler optimizations 25jan00ajb * finsim parameter fix 26jan00ajb * vector rechaining code 03apr00ajb * multiple var section code 06apr00ajb * fix for duplicate nets 19dec00ajb * support for alt hier seps 23dec00ajb * fix for rcs identifiers 16jan01ajb * coredump fix for bad VCD 04apr02ajb * min/maxid speedup 27feb03ajb * bugfix on min/maxid speedup 06jul03ajb * escaped hier modification 20feb06ajb * added partial loader support 04aug06ajb * added real_parameter vartype 04aug06ajb * added in/out port vartype 31jan07ajb * use gperf for port vartypes 19feb07ajb * MTI SV implicit-var fix 05apr07ajb * MTI SV len=0 is real var 05apr07ajb */ #include #include "globals.h" #include "vcd.h" #include "hierpack.h" #if !defined _MSC_VER && !defined __MINGW32__ #include #include #include #endif #ifdef __MINGW32__ #include #endif #undef VCD_BSEARCH_IS_PERFECT /* bsearch is imperfect under linux, but OK under AIX */ static hptr add_histent_p(TimeType time, struct Node *n, char ch, int regadd, char *vector); static void add_tail_histents(void); static void vcd_build_symbols(void); static void vcd_cleanup(void); static void evcd_strcpy(char *dst, char *src); /*******************************************************************************/ #define WAVE_PARTIAL_VCD_RING_BUFFER_SIZE (1024*1024) unsigned int get_8(char *p) { if(p >= (GLOBALS->buf_vcd_partial_c_2 + WAVE_PARTIAL_VCD_RING_BUFFER_SIZE)) { p-= WAVE_PARTIAL_VCD_RING_BUFFER_SIZE; } return((unsigned int)((unsigned char)*p)); } unsigned int get_32(char *p) { unsigned int rc; rc = (get_8(p++) << 24) ; rc|= (get_8(p++) << 16) ; rc|= (get_8(p++) << 8) ; rc|= (get_8(p) << 0) ; return(rc); } int consume(void) /* for testing only */ { int len; GLOBALS->consume_countdown_vcd_partial_c_1--; if(!GLOBALS->consume_countdown_vcd_partial_c_1) { GLOBALS->consume_countdown_vcd_partial_c_1 = 100000; return(0); } if((len = *GLOBALS->consume_ptr_vcd_partial_c_1)) { int i; len = get_32(GLOBALS->consume_ptr_vcd_partial_c_1+1); for(i=0;ivcdbuf_vcd_partial_c_2[i] = get_8(GLOBALS->consume_ptr_vcd_partial_c_1+i+5); } GLOBALS->vcdbuf_vcd_partial_c_2[i] = 0; *GLOBALS->consume_ptr_vcd_partial_c_1 = 0; GLOBALS->consume_ptr_vcd_partial_c_1 = GLOBALS->consume_ptr_vcd_partial_c_1+i+5; if(GLOBALS->consume_ptr_vcd_partial_c_1 >= (GLOBALS->buf_vcd_partial_c_2 + WAVE_PARTIAL_VCD_RING_BUFFER_SIZE)) { GLOBALS->consume_ptr_vcd_partial_c_1 -= WAVE_PARTIAL_VCD_RING_BUFFER_SIZE; } } return(len); } /******************************************************************/ enum Tokens { T_VAR, T_END, T_SCOPE, T_UPSCOPE, T_COMMENT, T_DATE, T_DUMPALL, T_DUMPOFF, T_DUMPON, T_DUMPVARS, T_ENDDEFINITIONS, T_DUMPPORTS, T_DUMPPORTSOFF, T_DUMPPORTSON, T_DUMPPORTSALL, T_TIMESCALE, T_VERSION, T_VCDCLOSE, T_TIMEZERO, T_EOF, T_STRING, T_UNKNOWN_KEY }; static char *tokens[]={ "var", "end", "scope", "upscope", "comment", "date", "dumpall", "dumpoff", "dumpon", "dumpvars", "enddefinitions", "dumpports", "dumpportsoff", "dumpportson", "dumpportsall", "timescale", "version", "vcdclose", "timezero", "", "", "" }; #define NUM_TOKENS 19 #define T_GET tok=get_token();if((tok==T_END)||(tok==T_EOF))break; /******************************************************************/ #define NUM_VTOKENS 23 /******************************************************************/ static unsigned int vcdid_hash(char *s, int len) { unsigned int val=0; int i; s+=(len-1); for(i=0;iid)); } /* * actual bsearch */ static struct vcdsymbol *bsearch_vcd(char *key, int len) { struct vcdsymbol **v; struct vcdsymbol *t; if(GLOBALS->indexed_vcd_partial_c_2) { unsigned int hsh = vcdid_hash(key, len); if((hsh>=GLOBALS->vcd_minid_vcd_partial_c_2)&&(hsh<=GLOBALS->vcd_maxid_vcd_partial_c_2)) { return(GLOBALS->indexed_vcd_partial_c_2[hsh-GLOBALS->vcd_minid_vcd_partial_c_2]); } return(NULL); } if(GLOBALS->sorted_vcd_partial_c_2) { v=(struct vcdsymbol **)bsearch(key, GLOBALS->sorted_vcd_partial_c_2, GLOBALS->numsyms_vcd_partial_c_2, sizeof(struct vcdsymbol *), vcdsymbsearchcompare); if(v) { #ifndef VCD_BSEARCH_IS_PERFECT for(;;) { t=*v; if((v==GLOBALS->sorted_vcd_partial_c_2)||(strcmp((*(--v))->id, key))) { return(t); } } #else return(*v); #endif } else { return(NULL); } } else { if(!GLOBALS->err_vcd_partial_c_2) { fprintf(stderr, "Near byte %d, VCD search table NULL..is this a VCD file?\n", (int)(GLOBALS->vcdbyteno_vcd_partial_c_2+(GLOBALS->vst_vcd_partial_c_2-GLOBALS->vcdbuf_vcd_partial_c_2))); GLOBALS->err_vcd_partial_c_2=1; } return(NULL); } } /* * sort on vcdsymbol pointers */ static int vcdsymcompare(const void *s1, const void *s2) { struct vcdsymbol *v1, *v2; v1=*((struct vcdsymbol **)s1); v2=*((struct vcdsymbol **)s2); return(strcmp(v1->id, v2->id)); } /* * create sorted (by id) table */ static void create_sorted_table(void) { struct vcdsymbol *v; struct vcdsymbol **pnt; unsigned int vcd_distance; if(GLOBALS->sorted_vcd_partial_c_2) { free_2(GLOBALS->sorted_vcd_partial_c_2); /* this means we saw a 2nd enddefinition chunk! */ GLOBALS->sorted_vcd_partial_c_2=NULL; } if(GLOBALS->indexed_vcd_partial_c_2) { free_2(GLOBALS->indexed_vcd_partial_c_2); GLOBALS->indexed_vcd_partial_c_2=NULL; } if(GLOBALS->numsyms_vcd_partial_c_2) { vcd_distance = GLOBALS->vcd_maxid_vcd_partial_c_2 - GLOBALS->vcd_minid_vcd_partial_c_2 + 1; if((vcd_distance <= VCD_INDEXSIZ)||(!GLOBALS->vcd_hash_kill)) { GLOBALS->indexed_vcd_partial_c_2 = (struct vcdsymbol **)calloc_2(vcd_distance, sizeof(struct vcdsymbol *)); /* printf("%d symbols span ID range of %d, using indexing...\n", numsyms, vcd_distance); */ v=GLOBALS->vcdsymroot_vcd_partial_c_2; while(v) { if(!GLOBALS->indexed_vcd_partial_c_2[v->nid - GLOBALS->vcd_minid_vcd_partial_c_2]) GLOBALS->indexed_vcd_partial_c_2[v->nid - GLOBALS->vcd_minid_vcd_partial_c_2] = v; v=v->next; } } else { pnt=GLOBALS->sorted_vcd_partial_c_2=(struct vcdsymbol **)calloc_2(GLOBALS->numsyms_vcd_partial_c_2, sizeof(struct vcdsymbol *)); v=GLOBALS->vcdsymroot_vcd_partial_c_2; while(v) { *(pnt++)=v; v=v->next; } qsort(GLOBALS->sorted_vcd_partial_c_2, GLOBALS->numsyms_vcd_partial_c_2, sizeof(struct vcdsymbol *), vcdsymcompare); } } } /******************************************************************/ /* * single char get inlined/optimized */ static void getch_alloc(void) { GLOBALS->vend_vcd_partial_c_2=GLOBALS->vst_vcd_partial_c_2=GLOBALS->vcdbuf_vcd_partial_c_2=(char *)calloc_2(1,VCD_BSIZ); } static int getch_fetch(void) { size_t rd; errno = 0; GLOBALS->vcdbyteno_vcd_partial_c_2+=(GLOBALS->vend_vcd_partial_c_2-GLOBALS->vcdbuf_vcd_partial_c_2); rd=consume(); GLOBALS->vend_vcd_partial_c_2=(GLOBALS->vst_vcd_partial_c_2=GLOBALS->vcdbuf_vcd_partial_c_2)+rd; if(!rd) return(-1); return((int)(*GLOBALS->vst_vcd_partial_c_2)); } static inline signed char getch(void) { signed char ch = ((GLOBALS->vst_vcd_partial_c_2!=GLOBALS->vend_vcd_partial_c_2)?((int)(*GLOBALS->vst_vcd_partial_c_2)):(getch_fetch())); if(ch>=0) { GLOBALS->vst_vcd_partial_c_2++; }; return(ch); } static inline signed char getch_peek(void) { signed char ch = ((GLOBALS->vst_vcd_partial_c_2!=GLOBALS->vend_vcd_partial_c_2)?((int)(*GLOBALS->vst_vcd_partial_c_2)):(getch_fetch())); /* no increment */ return(ch); } static int getch_patched(void) { char ch; ch=*GLOBALS->vsplitcurr_vcd_partial_c_2; if(!ch) { return(-1); } else { GLOBALS->vsplitcurr_vcd_partial_c_2++; return((int)ch); } } /* * simple tokenizer */ static int get_token(void) { int ch; int i, len=0; int is_string=0; char *yyshadow; for(;;) { ch=getch(); if(ch<0) return(T_EOF); if(ch<=' ') continue; /* val<=' ' is a quick whitespace check */ break; /* (take advantage of fact that vcd is text) */ } if(ch=='$') { GLOBALS->yytext_vcd_partial_c_2[len++]=ch; for(;;) { ch=getch(); if(ch<0) return(T_EOF); if(ch<=' ') continue; break; } } else { is_string=1; } for(GLOBALS->yytext_vcd_partial_c_2[len++]=ch;;GLOBALS->yytext_vcd_partial_c_2[len++]=ch) { if(len==GLOBALS->T_MAX_STR_vcd_partial_c_2) { GLOBALS->yytext_vcd_partial_c_2=(char *)realloc_2(GLOBALS->yytext_vcd_partial_c_2, (GLOBALS->T_MAX_STR_vcd_partial_c_2=GLOBALS->T_MAX_STR_vcd_partial_c_2*2)+1); } ch=getch(); if(ch<=' ') break; } GLOBALS->yytext_vcd_partial_c_2[len]=0; /* terminator */ if(is_string) { GLOBALS->yylen_vcd_partial_c_2=len; return(T_STRING); } yyshadow=GLOBALS->yytext_vcd_partial_c_2; do { yyshadow++; for(i=0;ivar_prevch_vcd_partial_c_2) { for(;;) { ch=getch_patched(); if(ch<0) { free_2(GLOBALS->varsplit_vcd_partial_c_2); GLOBALS->varsplit_vcd_partial_c_2=NULL; return(V_END); } if((ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r')) continue; break; } } else { ch=GLOBALS->var_prevch_vcd_partial_c_2; GLOBALS->var_prevch_vcd_partial_c_2=0; } if(ch=='[') return(V_LB); if(ch==':') return(V_COLON); if(ch==']') return(V_RB); for(GLOBALS->yytext_vcd_partial_c_2[len++]=ch;;GLOBALS->yytext_vcd_partial_c_2[len++]=ch) { if(len==GLOBALS->T_MAX_STR_vcd_partial_c_2) { GLOBALS->yytext_vcd_partial_c_2=(char *)realloc_2(GLOBALS->yytext_vcd_partial_c_2, (GLOBALS->T_MAX_STR_vcd_partial_c_2=GLOBALS->T_MAX_STR_vcd_partial_c_2*2)+1); } ch=getch_patched(); if(ch<0) { free_2(GLOBALS->varsplit_vcd_partial_c_2); GLOBALS->varsplit_vcd_partial_c_2=NULL; break; } if((ch==':')||(ch==']')) { GLOBALS->var_prevch_vcd_partial_c_2=ch; break; } } GLOBALS->yytext_vcd_partial_c_2[len]=0; /* terminator */ if(match_kw) { int vt = vcd_keyword_code(GLOBALS->yytext_vcd_partial_c_2, len); if(vt != V_STRING) { if(ch<0) { free_2(GLOBALS->varsplit_vcd_partial_c_2); GLOBALS->varsplit_vcd_partial_c_2=NULL; } return(vt); } } GLOBALS->yylen_vcd_partial_c_2=len; if(ch<0) { free_2(GLOBALS->varsplit_vcd_partial_c_2); GLOBALS->varsplit_vcd_partial_c_2=NULL; } return(V_STRING); } static int get_vartoken(int match_kw) { int ch; int len=0; if(GLOBALS->varsplit_vcd_partial_c_2) { int rc=get_vartoken_patched(match_kw); if(rc!=V_END) return(rc); GLOBALS->var_prevch_vcd_partial_c_2=0; } if(!GLOBALS->var_prevch_vcd_partial_c_2) { for(;;) { ch=getch(); if(ch<0) return(V_END); if((ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r')) continue; break; } } else { ch=GLOBALS->var_prevch_vcd_partial_c_2; GLOBALS->var_prevch_vcd_partial_c_2=0; } if(ch=='[') return(V_LB); if(ch==':') return(V_COLON); if(ch==']') return(V_RB); if(ch=='#') /* for MTI System Verilog '$var reg 64 >w #implicit-var###VarElem:ram_di[0.0] [63:0] $end' style declarations */ { /* debussy simply escapes until the space */ GLOBALS->yytext_vcd_partial_c_2[len++]= '\\'; } for(GLOBALS->yytext_vcd_partial_c_2[len++]=ch;;GLOBALS->yytext_vcd_partial_c_2[len++]=ch) { if(len==GLOBALS->T_MAX_STR_vcd_partial_c_2) { GLOBALS->yytext_vcd_partial_c_2=(char *)realloc_2(GLOBALS->yytext_vcd_partial_c_2, (GLOBALS->T_MAX_STR_vcd_partial_c_2=GLOBALS->T_MAX_STR_vcd_partial_c_2*2)+1); } ch=getch(); if(ch==' ') { if(match_kw) break; if(getch_peek() == '[') { ch = getch(); GLOBALS->varsplit_vcd_partial_c_2=GLOBALS->yytext_vcd_partial_c_2+len; /* keep looping so we get the *last* one */ continue; } } if((ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r')||(ch<0)) break; if((ch=='[')&&(GLOBALS->yytext_vcd_partial_c_2[0]!='\\')) { GLOBALS->varsplit_vcd_partial_c_2=GLOBALS->yytext_vcd_partial_c_2+len; /* keep looping so we get the *last* one */ } else if(((ch==':')||(ch==']'))&&(!GLOBALS->varsplit_vcd_partial_c_2)&&(GLOBALS->yytext_vcd_partial_c_2[0]!='\\')) { GLOBALS->var_prevch_vcd_partial_c_2=ch; break; } } GLOBALS->yytext_vcd_partial_c_2[len]=0; /* absolute terminator */ if((GLOBALS->varsplit_vcd_partial_c_2)&&(GLOBALS->yytext_vcd_partial_c_2[len-1]==']')) { char *vst; vst=malloc_2(strlen(GLOBALS->varsplit_vcd_partial_c_2)+1); strcpy(vst, GLOBALS->varsplit_vcd_partial_c_2); *GLOBALS->varsplit_vcd_partial_c_2=0x00; /* zero out var name at the left bracket */ len=GLOBALS->varsplit_vcd_partial_c_2-GLOBALS->yytext_vcd_partial_c_2; GLOBALS->varsplit_vcd_partial_c_2=GLOBALS->vsplitcurr_vcd_partial_c_2=vst; GLOBALS->var_prevch_vcd_partial_c_2=0; } else { GLOBALS->varsplit_vcd_partial_c_2=NULL; } if(match_kw) { int vt = vcd_keyword_code(GLOBALS->yytext_vcd_partial_c_2, len); if(vt != V_STRING) { return(vt); } } GLOBALS->yylen_vcd_partial_c_2=len; return(V_STRING); } static int get_strtoken(void) { int ch; int len=0; if(!GLOBALS->var_prevch_vcd_partial_c_2) { for(;;) { ch=getch(); if(ch<0) return(V_END); if((ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r')) continue; break; } } else { ch=GLOBALS->var_prevch_vcd_partial_c_2; GLOBALS->var_prevch_vcd_partial_c_2=0; } for(GLOBALS->yytext_vcd_partial_c_2[len++]=ch;;GLOBALS->yytext_vcd_partial_c_2[len++]=ch) { if(len==GLOBALS->T_MAX_STR_vcd_partial_c_2) { GLOBALS->yytext_vcd_partial_c_2=(char *)realloc_2(GLOBALS->yytext_vcd_partial_c_2, (GLOBALS->T_MAX_STR_vcd_partial_c_2=GLOBALS->T_MAX_STR_vcd_partial_c_2*2)+1); } ch=getch(); if((ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r')||(ch<0)) break; } GLOBALS->yytext_vcd_partial_c_2[len]=0; /* terminator */ GLOBALS->yylen_vcd_partial_c_2=len; return(V_STRING); } static void sync_end(char *hdr) { int tok; if(hdr) { DEBUG(fprintf(stderr,"%s",hdr)); } for(;;) { tok=get_token(); if((tok==T_END)||(tok==T_EOF)) break; if(hdr) { DEBUG(fprintf(stderr," %s",GLOBALS->yytext_vcd_partial_c_2)); } } if(hdr) { DEBUG(fprintf(stderr,"\n")); } } static int version_sync_end(char *hdr) { int tok; int rc = 0; if(hdr) { DEBUG(fprintf(stderr,"%s",hdr)); } for(;;) { tok=get_token(); if((tok==T_END)||(tok==T_EOF)) break; if(hdr) { DEBUG(fprintf(stderr," %s",GLOBALS->yytext_vcd_partial_c_2)); } if(strstr(GLOBALS->yytext_vcd_partial_c_2, "Icarus")) /* turn off autocoalesce for Icarus */ { GLOBALS->autocoalesce = 0; rc = 1; } } if(hdr) { DEBUG(fprintf(stderr,"\n")); } return(rc); } static void parse_valuechange(void) { struct vcdsymbol *v; char *vector; int vlen; /* hptr hsuf; */ /* scan-build */ switch(GLOBALS->yytext_vcd_partial_c_2[0]) { case '0': case '1': case 'x': case 'X': case 'z': case 'Z': case 'h': case 'H': case 'u': case 'U': case 'w': case 'W': case 'l': case 'L': case '-': if(GLOBALS->yylen_vcd_partial_c_2>1) { v=bsearch_vcd(GLOBALS->yytext_vcd_partial_c_2+1, GLOBALS->yylen_vcd_partial_c_2-1); if(!v) { fprintf(stderr,"Near byte %d, Unknown VCD identifier: '%s'\n",(int)(GLOBALS->vcdbyteno_vcd_partial_c_2+(GLOBALS->vst_vcd_partial_c_2-GLOBALS->vcdbuf_vcd_partial_c_2)),GLOBALS->yytext_vcd_partial_c_2+1); } else { v->value[0]=GLOBALS->yytext_vcd_partial_c_2[0]; DEBUG(fprintf(stderr,"%s = '%c'\n",v->name,v->value[0])); v->narray[0]->curr = v->app_array[0]; /* hsuf = */ add_histent_p(GLOBALS->current_time_vcd_partial_c_2,v->narray[0],v->value[0],1, NULL); /* scan-build */ v->app_array[0] = v->narray[0]->curr; v->narray[0]->curr->next = v->tr_array[0]; if(v->narray[0]->harray) { free_2(v->narray[0]->harray); v->narray[0]->harray = NULL; } } } else { fprintf(stderr,"Near byte %d, Malformed VCD identifier\n", (int)(GLOBALS->vcdbyteno_vcd_partial_c_2+(GLOBALS->vst_vcd_partial_c_2-GLOBALS->vcdbuf_vcd_partial_c_2))); } break; case 'b': case 'B': { /* extract binary number then.. */ vector=malloc_2(GLOBALS->yylen_cache_vcd_partial_c_2=GLOBALS->yylen_vcd_partial_c_2); strcpy(vector,GLOBALS->yytext_vcd_partial_c_2+1); vlen=GLOBALS->yylen_vcd_partial_c_2-1; get_strtoken(); v=bsearch_vcd(GLOBALS->yytext_vcd_partial_c_2, GLOBALS->yylen_vcd_partial_c_2); if(!v) { fprintf(stderr,"Near byte %d, Unknown identifier: '%s'\n",(int)(GLOBALS->vcdbyteno_vcd_partial_c_2+(GLOBALS->vst_vcd_partial_c_2-GLOBALS->vcdbuf_vcd_partial_c_2)), GLOBALS->yytext_vcd_partial_c_2); free_2(vector); } else { if ((v->vartype==V_REAL)||(v->vartype==V_STRINGTYPE)||((GLOBALS->convert_to_reals)&&((v->vartype==V_INTEGER)||(v->vartype==V_PARAMETER)))) { double *d; char *pnt; char ch; TimeType k=0; pnt=vector; while((ch=*(pnt++))) { k=(k<<1)|((ch=='1')?1:0); } free_2(vector); d=malloc_2(sizeof(double)); *d=(double)k; if(!v) { fprintf(stderr,"Near byte %d, Unknown identifier: '%s'\n",(int)(GLOBALS->vcdbyteno_vcd_partial_c_2+(GLOBALS->vst_vcd_partial_c_2-GLOBALS->vcdbuf_vcd_partial_c_2)), GLOBALS->yytext_vcd_partial_c_2); free_2(d); } else { v->narray[0]->curr = v->app_array[0]; add_histent_p(GLOBALS->current_time_vcd_partial_c_2, v->narray[0],'g',1,(char *)d); v->app_array[0] = v->narray[0]->curr; v->narray[0]->curr->next = v->tr_array[0]; if(v->narray[0]->harray) { free_2(v->narray[0]->harray); v->narray[0]->harray = NULL; } } break; } if(vlensize) /* fill in left part */ { char extend; int i, fill; extend=(vector[0]=='1')?'0':vector[0]; fill=v->size-vlen; for(i=0;ivalue[i]=extend; } strcpy(v->value+fill,vector); } else if(vlen==v->size) /* straight copy */ { strcpy(v->value,vector); } else /* too big, so copy only right half */ { int skip; skip=vlen-v->size; strcpy(v->value,vector+skip); } DEBUG(fprintf(stderr,"%s = '%s'\n",v->name, v->value)); if((v->size==1)||(!GLOBALS->atomic_vectors)) { int i; for(i=0;isize;i++) { v->narray[i]->curr = v->app_array[i]; add_histent_p(GLOBALS->current_time_vcd_partial_c_2, v->narray[i],v->value[i],1, NULL); v->app_array[i] = v->narray[i]->curr; v->narray[i]->curr->next = v->tr_array[i]; if(v->narray[i]->harray) { free_2(v->narray[i]->harray); v->narray[i]->harray = NULL; } } free_2(vector); } else { if(GLOBALS->yylen_cache_vcd_partial_c_2!=(v->size+1)) { free_2(vector); vector=malloc_2(v->size+1); } strcpy(vector,v->value); v->narray[0]->curr = v->app_array[0]; add_histent_p(GLOBALS->current_time_vcd_partial_c_2, v->narray[0],0,1,vector); v->app_array[0] = v->narray[0]->curr; v->narray[0]->curr->next = v->tr_array[0]; if(v->narray[0]->harray) { free_2(v->narray[0]->harray); v->narray[0]->harray = NULL; } } } break; } case 'p': /* extract port dump value.. */ vector=malloc_2(GLOBALS->yylen_cache_vcd_partial_c_2=GLOBALS->yylen_vcd_partial_c_2); strcpy(vector,GLOBALS->yytext_vcd_partial_c_2+1); vlen=GLOBALS->yylen_vcd_partial_c_2-1; get_strtoken(); /* throw away 0_strength_component */ get_strtoken(); /* throw away 0_strength_component */ get_strtoken(); /* this is the id */ v=bsearch_vcd(GLOBALS->yytext_vcd_partial_c_2, GLOBALS->yylen_vcd_partial_c_2); if(!v) { fprintf(stderr,"Near byte %d, Unknown identifier: '%s'\n",(int)(GLOBALS->vcdbyteno_vcd_partial_c_2+(GLOBALS->vst_vcd_partial_c_2-GLOBALS->vcdbuf_vcd_partial_c_2)), GLOBALS->yytext_vcd_partial_c_2); free_2(vector); } else { if ((v->vartype==V_REAL)||(v->vartype==V_STRINGTYPE)||((GLOBALS->convert_to_reals)&&((v->vartype==V_INTEGER)||(v->vartype==V_PARAMETER)))) { double *d; char *pnt; char ch; TimeType k=0; pnt=vector; while((ch=*(pnt++))) { k=(k<<1)|((ch=='1')?1:0); } free_2(vector); d=malloc_2(sizeof(double)); *d=(double)k; if(!v) { fprintf(stderr,"Near byte %d, Unknown identifier: '%s'\n",(int)(GLOBALS->vcdbyteno_vcd_partial_c_2+(GLOBALS->vst_vcd_partial_c_2-GLOBALS->vcdbuf_vcd_partial_c_2)), GLOBALS->yytext_vcd_partial_c_2); free_2(d); } else { v->narray[0]->curr = v->app_array[0]; add_histent_p(GLOBALS->current_time_vcd_partial_c_2, v->narray[0],'g',1,(char *)d); v->app_array[0] = v->narray[0]->curr; v->narray[0]->curr->next = v->tr_array[0]; if(v->narray[0]->harray) { free_2(v->narray[0]->harray); v->narray[0]->harray = NULL; } } break; } if(vlensize) /* fill in left part */ { char extend; int i, fill; extend='0'; fill=v->size-vlen; for(i=0;ivalue[i]=extend; } evcd_strcpy(v->value+fill,vector); } else if(vlen==v->size) /* straight copy */ { evcd_strcpy(v->value,vector); } else /* too big, so copy only right half */ { int skip; skip=vlen-v->size; evcd_strcpy(v->value,vector+skip); } DEBUG(fprintf(stderr,"%s = '%s'\n",v->name, v->value)); if((v->size==1)||(!GLOBALS->atomic_vectors)) { int i; for(i=0;isize;i++) { v->narray[i]->curr = v->app_array[i]; add_histent_p(GLOBALS->current_time_vcd_partial_c_2, v->narray[i],v->value[i],1, NULL); v->app_array[i] = v->narray[i]->curr; v->narray[i]->curr->next = v->tr_array[i]; if(v->narray[i]->harray) { free_2(v->narray[i]->harray); v->narray[i]->harray = NULL; } } free_2(vector); } else { if(GLOBALS->yylen_cache_vcd_partial_c_2size) { free_2(vector); vector=malloc_2(v->size+1); } strcpy(vector,v->value); v->narray[0]->curr = v->app_array[0]; add_histent_p(GLOBALS->current_time_vcd_partial_c_2, v->narray[0],0,1,vector); v->app_array[0] = v->narray[0]->curr; v->narray[0]->curr->next = v->tr_array[0]; if(v->narray[0]->harray) { free_2(v->narray[0]->harray); v->narray[0]->harray = NULL; } } } break; case 'r': case 'R': { double *d; d=malloc_2(sizeof(double)); sscanf(GLOBALS->yytext_vcd_partial_c_2+1,"%lg",d); get_strtoken(); v=bsearch_vcd(GLOBALS->yytext_vcd_partial_c_2, GLOBALS->yylen_vcd_partial_c_2); if(!v) { fprintf(stderr,"Near byte %d, Unknown identifier: '%s'\n",(int)(GLOBALS->vcdbyteno_vcd_partial_c_2+(GLOBALS->vst_vcd_partial_c_2-GLOBALS->vcdbuf_vcd_partial_c_2)), GLOBALS->yytext_vcd_partial_c_2); free_2(d); } else { v->narray[0]->curr = v->app_array[0]; add_histent_p(GLOBALS->current_time_vcd_partial_c_2, v->narray[0],'g',1,(char *)d); v->app_array[0] = v->narray[0]->curr; v->narray[0]->curr->next = v->tr_array[0]; if(v->narray[0]->harray) { free_2(v->narray[0]->harray); v->narray[0]->harray = NULL; } } break; } #ifndef STRICT_VCD_ONLY case 's': case 'S': { char *d; d=(char *)malloc_2(GLOBALS->yylen_vcd_partial_c_2); vlen = fstUtilityEscToBin((unsigned char *)d, (unsigned char *)(GLOBALS->yytext_vcd_partial_c_2+1), GLOBALS->yylen_vcd_partial_c_2); /* includes 0 term */ if(vlen != GLOBALS->yylen_vcd_partial_c_2) { d = realloc_2(d, vlen); } get_strtoken(); v=bsearch_vcd(GLOBALS->yytext_vcd_partial_c_2, GLOBALS->yylen_vcd_partial_c_2); if(!v) { fprintf(stderr,"Near byte %d, Unknown identifier: '%s'\n",(int)(GLOBALS->vcdbyteno_vcd_partial_c_2+(GLOBALS->vst_vcd_partial_c_2-GLOBALS->vcdbuf_vcd_partial_c_2)), GLOBALS->yytext_vcd_partial_c_2); free_2(d); } else { v->narray[0]->curr = v->app_array[0]; add_histent_p(GLOBALS->current_time_vcd_partial_c_2, v->narray[0],'s',1,(char *)d); v->app_array[0] = v->narray[0]->curr; v->narray[0]->curr->next = v->tr_array[0]; if(v->narray[0]->harray) { free_2(v->narray[0]->harray); v->narray[0]->harray = NULL; } } break; } #endif } } static void evcd_strcpy(char *dst, char *src) { static const char *evcd="DUNZduLHXTlh01?FAaBbCcf"; static const char *vcd="01xz0101xz0101xzxxxxxxz"; char ch; int i; while((ch=*src)) { for(i=0;i<23;i++) { if(evcd[i]==ch) { *dst=vcd[i]; break; } } if(i==23) *dst='x'; src++; dst++; } *dst=0; /* null terminate destination */ } static void vcd_parse(void) { int tok; unsigned char ttype; int disable_autocoalesce = 0; for(;;) { switch(get_token()) { case T_COMMENT: sync_end("COMMENT:"); break; case T_DATE: sync_end("DATE:"); break; case T_VERSION: disable_autocoalesce = version_sync_end("VERSION:"); break; case T_TIMEZERO: { int vtok=get_token(); if((vtok==T_END)||(vtok==T_EOF)) break; GLOBALS->global_time_offset=atoi_64(GLOBALS->yytext_vcd_partial_c_2); DEBUG(fprintf(stderr,"TIMEZERO: "TTFormat"\n",GLOBALS->global_time_offset)); sync_end(NULL); } break; case T_TIMESCALE: { int vtok; int i; char prefix=' '; vtok=get_token(); if((vtok==T_END)||(vtok==T_EOF)) break; fractional_timescale_fix(GLOBALS->yytext_vcd_partial_c_2); GLOBALS->time_scale=atoi_64(GLOBALS->yytext_vcd_partial_c_2); if(!GLOBALS->time_scale) GLOBALS->time_scale=1; for(i=0;iyylen_vcd_partial_c_2;i++) { if((GLOBALS->yytext_vcd_partial_c_2[i]<'0')||(GLOBALS->yytext_vcd_partial_c_2[i]>'9')) { prefix=GLOBALS->yytext_vcd_partial_c_2[i]; break; } } if(prefix==' ') { vtok=get_token(); if((vtok==T_END)||(vtok==T_EOF)) break; prefix=GLOBALS->yytext_vcd_partial_c_2[0]; } switch(prefix) { case ' ': case 'm': case 'u': case 'n': case 'p': case 'f': case 'a': case 'z': GLOBALS->time_dimension=prefix; break; case 's': GLOBALS->time_dimension=' '; break; default: /* unknown */ GLOBALS->time_dimension='n'; break; } DEBUG(fprintf(stderr,"TIMESCALE: "TTFormat" %cs\n",GLOBALS->time_scale, GLOBALS->time_dimension)); sync_end(NULL); } break; case T_SCOPE: T_GET; { switch(GLOBALS->yytext_vcd_partial_c_2[0]) { case 'm': ttype = TREE_VCD_ST_MODULE; break; case 't': ttype = TREE_VCD_ST_TASK; break; case 'f': ttype = (GLOBALS->yytext_vcd_partial_c_2[1] == 'u') ? TREE_VCD_ST_FUNCTION : TREE_VCD_ST_FORK; break; case 'b': ttype = TREE_VCD_ST_BEGIN; break; case 'g': ttype = TREE_VCD_ST_GENERATE; break; case 's': ttype = TREE_VCD_ST_STRUCT; break; case 'u': ttype = TREE_VCD_ST_UNION; break; case 'c': ttype = TREE_VCD_ST_CLASS; break; case 'i': ttype = TREE_VCD_ST_INTERFACE; break; case 'p': ttype = (GLOBALS->yytext_vcd_partial_c_2[1] == 'r') ? TREE_VCD_ST_PROGRAM : TREE_VCD_ST_PACKAGE; break; case 'v': { char *vht = GLOBALS->yytext_vcd_partial_c_2; if(!strncmp(vht, "vhdl_", 5)) { switch(vht[5]) { case 'a': ttype = TREE_VHDL_ST_ARCHITECTURE; break; case 'r': ttype = TREE_VHDL_ST_RECORD; break; case 'b': ttype = TREE_VHDL_ST_BLOCK; break; case 'g': ttype = TREE_VHDL_ST_GENERATE; break; case 'i': ttype = TREE_VHDL_ST_GENIF; break; case 'f': ttype = (vht[6] == 'u') ? TREE_VHDL_ST_FUNCTION : TREE_VHDL_ST_GENFOR; break; case 'p': ttype = (!strncmp(vht+6, "roces", 5)) ? TREE_VHDL_ST_PROCESS: TREE_VHDL_ST_PROCEDURE; break; default: ttype = TREE_UNKNOWN; break; } } else { ttype = TREE_UNKNOWN; } } break; default: ttype = TREE_UNKNOWN; break; } } T_GET; if(tok==T_STRING) { struct slist *s; s=(struct slist *)calloc_2(1,sizeof(struct slist)); s->len=GLOBALS->yylen_vcd_partial_c_2; s->str=(char *)malloc_2(GLOBALS->yylen_vcd_partial_c_2+1); strcpy(s->str, GLOBALS->yytext_vcd_partial_c_2); s->mod_tree_parent = GLOBALS->mod_tree_parent; allocate_and_decorate_module_tree_node(ttype, GLOBALS->yytext_vcd_partial_c_2, NULL, GLOBALS->yylen_vcd_partial_c_2, 0, 0, 0); if(GLOBALS->slistcurr) { GLOBALS->slistcurr->next=s; GLOBALS->slistcurr=s; } else { GLOBALS->slistcurr=GLOBALS->slistroot=s; } build_slisthier(); DEBUG(fprintf(stderr, "SCOPE: %s\n",GLOBALS->slisthier)); } sync_end(NULL); break; case T_UPSCOPE: if(GLOBALS->slistroot) { struct slist *s; GLOBALS->mod_tree_parent = GLOBALS->slistcurr->mod_tree_parent; s=GLOBALS->slistroot; if(!s->next) { free_2(s->str); free_2(s); GLOBALS->slistroot=GLOBALS->slistcurr=NULL; } else for(;;) { if(!s->next->next) { free_2(s->next->str); free_2(s->next); s->next=NULL; GLOBALS->slistcurr=s; break; } s=s->next; } build_slisthier(); DEBUG(fprintf(stderr, "SCOPE: %s\n",GLOBALS->slisthier)); } else { GLOBALS->mod_tree_parent = NULL; } sync_end(NULL); break; case T_VAR: if((GLOBALS->header_over_vcd_partial_c_2)&&(0)) { fprintf(stderr,"$VAR encountered after $ENDDEFINITIONS near byte %d. VCD is malformed, exiting.\n", (int)(GLOBALS->vcdbyteno_vcd_partial_c_2+(GLOBALS->vst_vcd_partial_c_2-GLOBALS->vcdbuf_vcd_partial_c_2))); exit(0); } else { int vtok; struct vcdsymbol *v=NULL; GLOBALS->var_prevch_vcd_partial_c_2=0; if(GLOBALS->varsplit_vcd_partial_c_2) { free_2(GLOBALS->varsplit_vcd_partial_c_2); GLOBALS->varsplit_vcd_partial_c_2=NULL; } vtok=get_vartoken(1); if(vtok>V_STRINGTYPE) goto bail; v=(struct vcdsymbol *)calloc_2(1,sizeof(struct vcdsymbol)); v->vartype=vtok; v->msi=v->lsi=GLOBALS->vcd_explicit_zero_subscripts; /* indicate [un]subscripted status */ if(vtok==V_PORT) { vtok=get_vartoken(1); if(vtok==V_STRING) { v->size=atoi_64(GLOBALS->yytext_vcd_partial_c_2); if(!v->size) v->size=1; } else if(vtok==V_LB) { vtok=get_vartoken(1); if(vtok==V_END) goto err; if(vtok!=V_STRING) goto err; v->msi=atoi_64(GLOBALS->yytext_vcd_partial_c_2); vtok=get_vartoken(0); if(vtok==V_RB) { v->lsi=v->msi; v->size=1; } else { if(vtok!=V_COLON) goto err; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; v->lsi=atoi_64(GLOBALS->yytext_vcd_partial_c_2); vtok=get_vartoken(0); if(vtok!=V_RB) goto err; if(v->msi>v->lsi) { v->size=v->msi-v->lsi+1; } else { v->size=v->lsi-v->msi+1; } } } else goto err; vtok=get_strtoken(); if(vtok==V_END) goto err; v->id=(char *)malloc_2(GLOBALS->yylen_vcd_partial_c_2+1); strcpy(v->id, GLOBALS->yytext_vcd_partial_c_2); v->nid=vcdid_hash(GLOBALS->yytext_vcd_partial_c_2,GLOBALS->yylen_vcd_partial_c_2); if(v->nid == (GLOBALS->vcd_hash_max+1)) { GLOBALS->vcd_hash_max = v->nid; } else if((v->nid>0)&&(v->nid<=GLOBALS->vcd_hash_max)) { /* general case with aliases */ } else { GLOBALS->vcd_hash_kill = 1; } if(v->nid < GLOBALS->vcd_minid_vcd_partial_c_2) GLOBALS->vcd_minid_vcd_partial_c_2 = v->nid; if(v->nid > GLOBALS->vcd_maxid_vcd_partial_c_2) GLOBALS->vcd_maxid_vcd_partial_c_2 = v->nid; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; if(GLOBALS->slisthier_len) { v->name=(char *)malloc_2(GLOBALS->slisthier_len+1+GLOBALS->yylen_vcd_partial_c_2+1); strcpy(v->name,GLOBALS->slisthier); strcpy(v->name+GLOBALS->slisthier_len,GLOBALS->vcd_hier_delimeter); if(GLOBALS->alt_hier_delimeter) { strcpy_vcdalt(v->name+GLOBALS->slisthier_len+1,GLOBALS->yytext_vcd_partial_c_2,GLOBALS->alt_hier_delimeter); } else { if((strcpy_delimfix(v->name+GLOBALS->slisthier_len+1,GLOBALS->yytext_vcd_partial_c_2)) && (GLOBALS->yytext_vcd_partial_c_2[0] != '\\')) { char *sd=(char *)malloc_2(GLOBALS->slisthier_len+1+GLOBALS->yylen_vcd_partial_c_2+2); strcpy(sd,GLOBALS->slisthier); strcpy(sd+GLOBALS->slisthier_len,GLOBALS->vcd_hier_delimeter); sd[GLOBALS->slisthier_len+1] = '\\'; strcpy(sd+GLOBALS->slisthier_len+2,v->name+GLOBALS->slisthier_len+1); free_2(v->name); v->name = sd; } } } else { v->name=(char *)malloc_2(GLOBALS->yylen_vcd_partial_c_2+1); if(GLOBALS->alt_hier_delimeter) { strcpy_vcdalt(v->name,GLOBALS->yytext_vcd_partial_c_2,GLOBALS->alt_hier_delimeter); } else { if((strcpy_delimfix(v->name,GLOBALS->yytext_vcd_partial_c_2)) && (GLOBALS->yytext_vcd_partial_c_2[0] != '\\')) { char *sd=(char *)malloc_2(GLOBALS->yylen_vcd_partial_c_2+2); sd[0] = '\\'; strcpy(sd+1,v->name); free_2(v->name); v->name = sd; } } } if(GLOBALS->pv_vcd_partial_c_2) { if(!strcmp(GLOBALS->pv_vcd_partial_c_2->name,v->name) && !disable_autocoalesce && (!strchr(v->name, '\\'))) { GLOBALS->pv_vcd_partial_c_2->chain=v; v->root=GLOBALS->rootv_vcd_partial_c_2; if(GLOBALS->pv_vcd_partial_c_2==GLOBALS->rootv_vcd_partial_c_2) GLOBALS->pv_vcd_partial_c_2->root=GLOBALS->rootv_vcd_partial_c_2; } else { GLOBALS->rootv_vcd_partial_c_2=v; } } else { GLOBALS->rootv_vcd_partial_c_2=v; } GLOBALS->pv_vcd_partial_c_2=v; } else /* regular vcd var, not an evcd port var */ { vtok=get_vartoken(1); if(vtok==V_END) goto err; v->size=atoi_64(GLOBALS->yytext_vcd_partial_c_2); vtok=get_strtoken(); if(vtok==V_END) goto err; v->id=(char *)malloc_2(GLOBALS->yylen_vcd_partial_c_2+1); strcpy(v->id, GLOBALS->yytext_vcd_partial_c_2); v->nid=vcdid_hash(GLOBALS->yytext_vcd_partial_c_2,GLOBALS->yylen_vcd_partial_c_2); if(v->nid == (GLOBALS->vcd_hash_max+1)) { GLOBALS->vcd_hash_max = v->nid; } else if((v->nid>0)&&(v->nid<=GLOBALS->vcd_hash_max)) { /* general case with aliases */ } else { GLOBALS->vcd_hash_kill = 1; } if(v->nid < GLOBALS->vcd_minid_vcd_partial_c_2) GLOBALS->vcd_minid_vcd_partial_c_2 = v->nid; if(v->nid > GLOBALS->vcd_maxid_vcd_partial_c_2) GLOBALS->vcd_maxid_vcd_partial_c_2 = v->nid; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; if(GLOBALS->slisthier_len) { v->name=(char *)malloc_2(GLOBALS->slisthier_len+1+GLOBALS->yylen_vcd_partial_c_2+1); strcpy(v->name,GLOBALS->slisthier); strcpy(v->name+GLOBALS->slisthier_len,GLOBALS->vcd_hier_delimeter); if(GLOBALS->alt_hier_delimeter) { strcpy_vcdalt(v->name+GLOBALS->slisthier_len+1,GLOBALS->yytext_vcd_partial_c_2,GLOBALS->alt_hier_delimeter); } else { if((strcpy_delimfix(v->name+GLOBALS->slisthier_len+1,GLOBALS->yytext_vcd_partial_c_2)) && (GLOBALS->yytext_vcd_partial_c_2[0] != '\\')) { char *sd=(char *)malloc_2(GLOBALS->slisthier_len+1+GLOBALS->yylen_vcd_partial_c_2+2); strcpy(sd,GLOBALS->slisthier); strcpy(sd+GLOBALS->slisthier_len,GLOBALS->vcd_hier_delimeter); sd[GLOBALS->slisthier_len+1] = '\\'; strcpy(sd+GLOBALS->slisthier_len+2,v->name+GLOBALS->slisthier_len+1); free_2(v->name); v->name = sd; } } } else { v->name=(char *)malloc_2(GLOBALS->yylen_vcd_partial_c_2+1); if(GLOBALS->alt_hier_delimeter) { strcpy_vcdalt(v->name,GLOBALS->yytext_vcd_partial_c_2,GLOBALS->alt_hier_delimeter); } else { if((strcpy_delimfix(v->name,GLOBALS->yytext_vcd_partial_c_2)) && (GLOBALS->yytext_vcd_partial_c_2[0] != '\\')) { char *sd=(char *)malloc_2(GLOBALS->yylen_vcd_partial_c_2+2); sd[0] = '\\'; strcpy(sd+1,v->name); free_2(v->name); v->name = sd; } } } if(GLOBALS->pv_vcd_partial_c_2) { if(!strcmp(GLOBALS->pv_vcd_partial_c_2->name,v->name)) { GLOBALS->pv_vcd_partial_c_2->chain=v; v->root=GLOBALS->rootv_vcd_partial_c_2; if(GLOBALS->pv_vcd_partial_c_2==GLOBALS->rootv_vcd_partial_c_2) GLOBALS->pv_vcd_partial_c_2->root=GLOBALS->rootv_vcd_partial_c_2; } else { GLOBALS->rootv_vcd_partial_c_2=v; } } else { GLOBALS->rootv_vcd_partial_c_2=v; } GLOBALS->pv_vcd_partial_c_2=v; vtok=get_vartoken(1); if(vtok==V_END) goto dumpv; if(vtok!=V_LB) goto err; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; v->msi=atoi_64(GLOBALS->yytext_vcd_partial_c_2); vtok=get_vartoken(0); if(vtok==V_RB) { v->lsi=v->msi; goto dumpv; } if(vtok!=V_COLON) goto err; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; v->lsi=atoi_64(GLOBALS->yytext_vcd_partial_c_2); vtok=get_vartoken(0); if(vtok!=V_RB) goto err; } dumpv: if(v->size == 0) { if(v->vartype != V_EVENT) { if(v->vartype != V_STRINGTYPE) { v->vartype = V_REAL; } } else { v->size = 1; } } /* MTI fix */ if((v->vartype==V_REAL)||(v->vartype==V_STRINGTYPE)||((GLOBALS->convert_to_reals)&&((v->vartype==V_INTEGER)||(v->vartype==V_PARAMETER)))) { if(v->vartype != V_STRINGTYPE) { v->vartype=V_REAL; } v->size=1; /* override any data we parsed in */ v->msi=v->lsi=0; } else if((v->size>1)&&(v->msi<=0)&&(v->lsi<=0)) { if(v->vartype==V_EVENT) { v->size=1; } else { /* any criteria for the direction here? */ v->msi=v->size-1; v->lsi=0; } } else if((v->msi>v->lsi)&&((v->msi-v->lsi+1)!=v->size)) { if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) { if((v->msi-v->lsi+1) > v->size) /* if() is 2d add */ { v->msi = v->size-1; v->lsi = 0; } /* all this formerly was goto err; */ } else { v->size=v->msi-v->lsi+1; } } else if((v->lsi>=v->msi)&&((v->lsi-v->msi+1)!=v->size)) { if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) { if((v->lsi-v->msi+1) > v->size) /* if() is 2d add */ { v->lsi = v->size-1; v->msi = 0; } /* all this formerly was goto err; */ } else { v->size=v->lsi-v->msi+1; } } /* initial conditions */ v->value=(char *)malloc_2(v->size+1); v->value[v->size]=0; v->narray=(struct Node **)calloc_2(v->size,sizeof(struct Node *)); v->tr_array=(hptr *)calloc_2(v->size,sizeof(hptr)); v->app_array=(hptr *)calloc_2(v->size,sizeof(hptr)); { int i; if(GLOBALS->atomic_vectors) { for(i=0;isize;i++) { v->value[i]='x'; } v->narray[0]=(struct Node *)calloc_2(1,sizeof(struct Node)); v->narray[0]->head.time=-1; v->narray[0]->head.v.h_val=AN_X; } else { for(i=0;isize;i++) { v->value[i]='x'; v->narray[i]=(struct Node *)calloc_2(1,sizeof(struct Node)); v->narray[i]->head.time=-1; v->narray[i]->head.v.h_val=AN_X; } } } if(!GLOBALS->vcdsymroot_vcd_partial_c_2) { GLOBALS->vcdsymroot_vcd_partial_c_2=GLOBALS->vcdsymcurr_vcd_partial_c_2=v; } else { GLOBALS->vcdsymcurr_vcd_partial_c_2->next=v; GLOBALS->vcdsymcurr_vcd_partial_c_2=v; } GLOBALS->numsyms_vcd_partial_c_2++; goto bail; err: if(v) { GLOBALS->error_count_vcd_partial_c_2++; if(v->name) { fprintf(stderr, "Near byte %d, $VAR parse error encountered with '%s'\n", (int)(GLOBALS->vcdbyteno_vcd_partial_c_2+(GLOBALS->vst_vcd_partial_c_2-GLOBALS->vcdbuf_vcd_partial_c_2)), v->name); free_2(v->name); } else { fprintf(stderr, "Near byte %d, $VAR parse error encountered\n", (int)(GLOBALS->vcdbyteno_vcd_partial_c_2+(GLOBALS->vst_vcd_partial_c_2-GLOBALS->vcdbuf_vcd_partial_c_2))); } if(v->id) free_2(v->id); if(v->value) free_2(v->value); free_2(v); GLOBALS->pv_vcd_partial_c_2 = NULL; } bail: if(vtok!=V_END) sync_end(NULL); break; } case T_ENDDEFINITIONS: GLOBALS->header_over_vcd_partial_c_2=1; /* do symbol table management here */ create_sorted_table(); if((!GLOBALS->sorted_vcd_partial_c_2)&&(!GLOBALS->indexed_vcd_partial_c_2)) { fprintf(stderr, "No symbols in VCD file..nothing to do!\n"); exit(1); } if(GLOBALS->error_count_vcd_partial_c_2) { fprintf(stderr, "\n%d VCD parse errors encountered, exiting.\n", GLOBALS->error_count_vcd_partial_c_2); exit(1); } return; break; case T_STRING: if(!GLOBALS->header_over_vcd_partial_c_2) { GLOBALS->header_over_vcd_partial_c_2=1; /* do symbol table management here */ create_sorted_table(); if((!GLOBALS->sorted_vcd_partial_c_2)&&(!GLOBALS->indexed_vcd_partial_c_2)) break; } { /* catchall for events when header over */ if(GLOBALS->yytext_vcd_partial_c_2[0]=='#') { TimeType tim; tim=atoi_64(GLOBALS->yytext_vcd_partial_c_2+1); if(GLOBALS->start_time_vcd_partial_c_2<0) { GLOBALS->start_time_vcd_partial_c_2=tim; } GLOBALS->current_time_vcd_partial_c_2=tim; if(GLOBALS->end_time_vcd_partial_c_2end_time_vcd_partial_c_2=tim; /* in case of malformed vcd files */ DEBUG(fprintf(stderr,"#"TTFormat"\n",tim)); } else { parse_valuechange(); } } break; case T_DUMPALL: /* dump commands modify vals anyway so */ case T_DUMPPORTSALL: break; /* just loop through.. */ case T_DUMPOFF: case T_DUMPPORTSOFF: GLOBALS->dumping_off_vcd_partial_c_2=1; /* if((!GLOBALS->blackout_regions)||((GLOBALS->blackout_regions)&&(GLOBALS->blackout_regions->bstart<=GLOBALS->blackout_regions->bend))) : remove redundant condition */ if((!GLOBALS->blackout_regions)||(GLOBALS->blackout_regions->bstart<=GLOBALS->blackout_regions->bend)) { struct blackout_region_t *bt = calloc_2(1, sizeof(struct blackout_region_t)); bt->bstart = GLOBALS->current_time_vcd_partial_c_2 * GLOBALS->time_scale; bt->next = GLOBALS->blackout_regions; GLOBALS->blackout_regions = bt; } break; case T_DUMPON: case T_DUMPPORTSON: GLOBALS->dumping_off_vcd_partial_c_2=0; if((GLOBALS->blackout_regions)&&(GLOBALS->blackout_regions->bstart>GLOBALS->blackout_regions->bend)) { GLOBALS->blackout_regions->bend = GLOBALS->current_time_vcd_partial_c_2 * GLOBALS->time_scale; } break; case T_DUMPVARS: case T_DUMPPORTS: if(GLOBALS->current_time_vcd_partial_c_2<0) { GLOBALS->start_time_vcd_partial_c_2=GLOBALS->current_time_vcd_partial_c_2=GLOBALS->end_time_vcd_partial_c_2=0; } break; case T_VCDCLOSE: sync_end("VCDCLOSE:"); break; /* next token will be '#' time related followed by $end */ case T_END: /* either closure for dump commands or */ break; /* it's spurious */ case T_UNKNOWN_KEY: sync_end(NULL); /* skip over unknown keywords */ break; case T_EOF: if((GLOBALS->blackout_regions)&&(GLOBALS->blackout_regions->bstart>GLOBALS->blackout_regions->bend)) { GLOBALS->blackout_regions->bend = GLOBALS->current_time_vcd_partial_c_2 * GLOBALS->time_scale; } return; default: DEBUG(fprintf(stderr,"UNKNOWN TOKEN\n")); } } } /*******************************************************************************/ hptr add_histent_p(TimeType tim, struct Node *n, char ch, int regadd, char *vector) { struct HistEnt *he, *rc; char heval; if(!vector) { if(!(rc=n->curr)) { he=histent_calloc(); he->time=-1; he->v.h_val=AN_X; n->curr=he; n->head.next=he; add_histent_p(tim,n,ch,regadd, vector); rc = he; } else { if(regadd) { tim*=(GLOBALS->time_scale); } if(ch=='0') heval=AN_0; else if(ch=='1') heval=AN_1; else if((ch=='x')||(ch=='X')) heval=AN_X; else if((ch=='z')||(ch=='Z')) heval=AN_Z; else if((ch=='h')||(ch=='H')) heval=AN_H; else if((ch=='u')||(ch=='U')) heval=AN_U; else if((ch=='w')||(ch=='W')) heval=AN_W; else if((ch=='l')||(ch=='L')) heval=AN_L; else /* if(ch=='-') */ heval=AN_DASH; /* default */ if((n->curr->v.h_val!=heval)||(tim==GLOBALS->start_time_vcd_partial_c_2)||(n->vartype==ND_VCD_EVENT)||(GLOBALS->vcd_preserve_glitches)) /* same region == go skip */ { if(n->curr->time==tim) { DEBUG(printf("Warning: Glitch at time ["TTFormat"] Signal [%p], Value [%c->%c].\n", tim, n, AN_STR[n->curr->v.h_val], ch)); n->curr->v.h_val=heval; /* we have a glitch! */ GLOBALS->num_glitches_vcd_partial_c_3++; if(!(n->curr->flags&HIST_GLITCH)) { n->curr->flags|=HIST_GLITCH; /* set the glitch flag */ GLOBALS->num_glitch_regions_vcd_partial_c_3++; } } else { he=histent_calloc(); he->time=tim; he->v.h_val=heval; n->curr->next=he; n->curr=he; GLOBALS->regions+=regadd; } } } } else { switch(ch) { case 's': /* string */ { if(!(rc=n->curr)) { he=histent_calloc(); he->flags=(HIST_STRING|HIST_REAL); he->time=-1; he->v.h_vector=NULL; n->curr=he; n->head.next=he; add_histent_p(tim,n,ch,regadd, vector); rc = he; } else { if(regadd) { tim*=(GLOBALS->time_scale); } if(n->curr->time==tim) { DEBUG(printf("Warning: String Glitch at time ["TTFormat"] Signal [%p].\n", tim, n)); if(n->curr->v.h_vector) free_2(n->curr->v.h_vector); n->curr->v.h_vector=vector; /* we have a glitch! */ GLOBALS->num_glitches_vcd_partial_c_3++; if(!(n->curr->flags&HIST_GLITCH)) { n->curr->flags|=HIST_GLITCH; /* set the glitch flag */ GLOBALS->num_glitch_regions_vcd_partial_c_3++; } } else { he=histent_calloc(); he->flags=(HIST_STRING|HIST_REAL); he->time=tim; he->v.h_vector=vector; n->curr->next=he; n->curr=he; GLOBALS->regions+=regadd; } } break; } case 'g': /* real number */ { if(!(rc=n->curr)) { he=histent_calloc(); he->flags=HIST_REAL; he->time=-1; #ifdef WAVE_HAS_H_DOUBLE he->v.h_double = strtod("NaN", NULL); #else he->v.h_vector=NULL; #endif n->curr=he; n->head.next=he; add_histent_p(tim,n,ch,regadd, vector); rc = he; } else { if(regadd) { tim*=(GLOBALS->time_scale); } if( #ifdef WAVE_HAS_H_DOUBLE (vector&&(n->curr->v.h_double!=*(double *)vector)) #else (n->curr->v.h_vector&&vector&&(*(double *)n->curr->v.h_vector!=*(double *)vector)) #endif ||(tim==GLOBALS->start_time_vcd_partial_c_2) #ifndef WAVE_HAS_H_DOUBLE ||(!n->curr->v.h_vector) #endif ||(GLOBALS->vcd_preserve_glitches)||(GLOBALS->vcd_preserve_glitches_real) ) /* same region == go skip */ { if(n->curr->time==tim) { DEBUG(printf("Warning: Real number Glitch at time ["TTFormat"] Signal [%p].\n", tim, n)); #ifdef WAVE_HAS_H_DOUBLE n->curr->v.h_double = *((double *)vector); #else if(n->curr->v.h_vector) free_2(n->curr->v.h_vector); n->curr->v.h_vector=vector; /* we have a glitch! */ #endif GLOBALS->num_glitches_vcd_partial_c_3++; if(!(n->curr->flags&HIST_GLITCH)) { n->curr->flags|=HIST_GLITCH; /* set the glitch flag */ GLOBALS->num_glitch_regions_vcd_partial_c_3++; } } else { he=histent_calloc(); he->flags=HIST_REAL; he->time=tim; #ifdef WAVE_HAS_H_DOUBLE he->v.h_double = *((double *)vector); #else he->v.h_vector=vector; #endif n->curr->next=he; n->curr=he; GLOBALS->regions+=regadd; } } else { #ifndef WAVE_HAS_H_DOUBLE free_2(vector); #endif } #ifdef WAVE_HAS_H_DOUBLE free_2(vector); #endif } break; } default: { if(!(rc=n->curr)) { he=histent_calloc(); he->time=-1; he->v.h_vector=NULL; n->curr=he; n->head.next=he; add_histent_p(tim,n,ch,regadd, vector); rc = he; } else { if(regadd) { tim*=(GLOBALS->time_scale); } if( (n->curr->v.h_vector&&vector&&(strcmp(n->curr->v.h_vector,vector))) ||(tim==GLOBALS->start_time_vcd_partial_c_2) ||(!n->curr->v.h_vector) ||(GLOBALS->vcd_preserve_glitches) ) /* same region == go skip */ { if(n->curr->time==tim) { DEBUG(printf("Warning: Glitch at time ["TTFormat"] Signal [%p], Value [%c->%c].\n", tim, n, AN_STR[n->curr->v.h_val], ch)); if(n->curr->v.h_vector) free_2(n->curr->v.h_vector); n->curr->v.h_vector=vector; /* we have a glitch! */ GLOBALS->num_glitches_vcd_partial_c_3++; if(!(n->curr->flags&HIST_GLITCH)) { n->curr->flags|=HIST_GLITCH; /* set the glitch flag */ GLOBALS->num_glitch_regions_vcd_partial_c_3++; } } else { he=histent_calloc(); he->time=tim; he->v.h_vector=vector; n->curr->next=he; n->curr=he; GLOBALS->regions+=regadd; } } else { free_2(vector); } } break; } } } return(rc); } static void add_tail_histents(void) { int j; struct vcdsymbol *v; hptr rc; /* do 'x' trailers */ v=GLOBALS->vcdsymroot_vcd_partial_c_2; while(v) { if((v->vartype==V_REAL)||(v->vartype==V_STRINGTYPE)) { double *d; d=malloc_2(sizeof(double)); *d=1.0; rc = add_histent_p(MAX_HISTENT_TIME-1, v->narray[0], 'g', 0, (char *)d); set_vcd_vartype(v, v->narray[0]); v->app_array[0] = rc; v->tr_array[0] = v->narray[0]->curr; } else if((v->size==1)||(!GLOBALS->atomic_vectors)) for(j=0;jsize;j++) { rc = add_histent_p(MAX_HISTENT_TIME-1, v->narray[j], 'x', 0, NULL); set_vcd_vartype(v, v->narray[j]); v->app_array[j] = rc; v->tr_array[j] = v->narray[j]->curr; } else { rc = add_histent_p(MAX_HISTENT_TIME-1, v->narray[0], 'x', 0, (char *)calloc_2(1,sizeof(char))); set_vcd_vartype(v, v->narray[0]); v->app_array[0] = rc; v->tr_array[0] = v->narray[0]->curr; } v=v->next; } v=GLOBALS->vcdsymroot_vcd_partial_c_2; while(v) { if((v->vartype==V_REAL)||(v->vartype==V_STRINGTYPE)) { double *d; d=malloc_2(sizeof(double)); *d=0.0; add_histent_p(MAX_HISTENT_TIME, v->narray[0], 'g', 0, (char *)d); } else if((v->size==1)||(!GLOBALS->atomic_vectors)) for(j=0;jsize;j++) { add_histent_p(MAX_HISTENT_TIME, v->narray[j], 'z', 0, NULL); } else { add_histent_p(MAX_HISTENT_TIME, v->narray[0], 'z', 0, (char *)calloc_2(1,sizeof(char))); } v=v->next; } } /*******************************************************************************/ static void vcd_build_symbols(void) { int j; int max_slen=-1; struct sym_chain *sym_chain=NULL, *sym_curr=NULL; int duphier=0; char hashdirty; struct vcdsymbol *v, *vprime; char *str = wave_alloca(1); /* quiet scan-build null pointer warning below */ #ifdef _WAVE_HAVE_JUDY int ss_len, longest = 0; #endif v=GLOBALS->vcdsymroot_vcd_partial_c_2; while(v) { int msi; int delta; { int slen; int substnode; msi=v->msi; delta=((v->lsi-v->msi)<0)?-1:1; substnode=0; slen=strlen(v->name); str=(slen>max_slen)?(wave_alloca((max_slen=slen)+32)):(str); /* more than enough */ strcpy(str,v->name); if(v->msi>=0) { strcpy(str+slen,GLOBALS->vcd_hier_delimeter); slen++; } if((vprime=bsearch_vcd(v->id, strlen(v->id)))!=v) /* hash mish means dup net */ { if(v->size!=vprime->size) { fprintf(stderr,"ERROR: Duplicate IDs with differing width: %s %s\n", v->name, vprime->name); } else { substnode=1; } } if(((v->size==1)||(!GLOBALS->atomic_vectors))&&(v->vartype!=V_REAL)&&(v->vartype!=V_STRINGTYPE)) { struct symbol *s = NULL; for(j=0;jsize;j++) { if(v->msi>=0) { if(!GLOBALS->vcd_explicit_zero_subscripts) sprintf(str+slen,"%d",msi); else sprintf(str+slen-1,"[%d]",msi); } hashdirty=0; if(symfind(str, NULL)) { char *dupfix=(char *)malloc_2(max_slen+32); #ifndef _WAVE_HAVE_JUDY hashdirty=1; #endif DEBUG(fprintf(stderr,"Warning: %s is a duplicate net name.\n",str)); do sprintf(dupfix, "$DUP%d%s%s", duphier++, GLOBALS->vcd_hier_delimeter, str); while(symfind(dupfix, NULL)); strcpy(str, dupfix); free_2(dupfix); duphier=0; /* reset for next duplicate resolution */ } /* fallthrough */ { s=symadd(str,hashdirty?hash(str):GLOBALS->hashcache); #ifdef _WAVE_HAVE_JUDY ss_len = strlen(str); if(ss_len >= longest) { longest = ss_len + 1; } #endif s->n=v->narray[j]; if(substnode) { struct Node *n, *n2; n=s->n; n2=vprime->narray[j]; /* nname stays same */ n->head=n2->head; n->curr=n2->curr; /* harray calculated later */ n->numhist=n2->numhist; } #ifndef _WAVE_HAVE_JUDY s->n->nname=s->name; #endif if(!GLOBALS->firstnode) { GLOBALS->firstnode= GLOBALS->curnode=calloc_2(1, sizeof(struct symchain)); } else { GLOBALS->curnode->next=calloc_2(1, sizeof(struct symchain)); GLOBALS->curnode=GLOBALS->curnode->next; } GLOBALS->curnode->symbol=s; GLOBALS->numfacs++; DEBUG(fprintf(stderr,"Added: %s\n",str)); } msi+=delta; } if((j==1)&&(v->root)) { s->vec_root=(struct symbol *)v->root; /* these will get patched over */ s->vec_chain=(struct symbol *)v->chain; /* these will get patched over */ v->sym_chain=s; if(!sym_chain) { sym_curr=(struct sym_chain *)calloc_2(1,sizeof(struct sym_chain)); sym_chain=sym_curr; } else { sym_curr->next=(struct sym_chain *)calloc_2(1,sizeof(struct sym_chain)); sym_curr=sym_curr->next; } sym_curr->val=s; } } else /* atomic vector */ { if((v->vartype!=V_REAL)&&(v->vartype!=V_STRINGTYPE)&&(v->vartype!=V_INTEGER)&&(v->vartype!=V_PARAMETER)) /* if((v->vartype!=V_REAL)&&(v->vartype!=V_STRINGTYPE)) */ { sprintf(str+slen-1,"[%d:%d]",v->msi,v->lsi); /* 2d add */ if((v->msi>v->lsi)&&((v->msi-v->lsi+1)!=v->size)) { if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) { v->msi = v->size-1; v->lsi = 0; } } else if((v->lsi>=v->msi)&&((v->lsi-v->msi+1)!=v->size)) { if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) { v->lsi = v->size-1; v->msi = 0; } } } else { *(str+slen-1)=0; } hashdirty=0; if(symfind(str, NULL)) { char *dupfix=(char *)malloc_2(max_slen+32); #ifndef _WAVE_HAVE_JUDY hashdirty=1; #endif DEBUG(fprintf(stderr,"Warning: %s is a duplicate net name.\n",str)); do sprintf(dupfix, "$DUP%d%s%s", duphier++, GLOBALS->vcd_hier_delimeter, str); while(symfind(dupfix, NULL)); strcpy(str, dupfix); free_2(dupfix); duphier=0; /* reset for next duplicate resolution */ } /* fallthrough */ { struct symbol *s; s=symadd(str,hashdirty?hash(str):GLOBALS->hashcache); /* cut down on double lookups.. */ #ifdef _WAVE_HAVE_JUDY ss_len = strlen(str); if(ss_len >= longest) { longest = ss_len + 1; } #endif s->n=v->narray[0]; if(substnode) { struct Node *n, *n2; n=s->n; n2=vprime->narray[0]; /* nname stays same */ n->head=n2->head; n->curr=n2->curr; /* harray calculated later */ n->numhist=n2->numhist; n->extvals=n2->extvals; n->msi=n2->msi; n->lsi=n2->lsi; } else { s->n->msi=v->msi; s->n->lsi=v->lsi; s->n->extvals=1; } #ifndef _WAVE_HAVE_JUDY s->n->nname=s->name; #endif if(!GLOBALS->firstnode) { GLOBALS->firstnode= GLOBALS->curnode=calloc_2(1, sizeof(struct symchain)); } else { GLOBALS->curnode->next=calloc_2(1, sizeof(struct symchain)); GLOBALS->curnode=GLOBALS->curnode->next; } GLOBALS->curnode->symbol=s; GLOBALS->numfacs++; DEBUG(fprintf(stderr,"Added: %s\n",str)); } } } v=v->next; } #ifdef _WAVE_HAVE_JUDY { Pvoid_t PJArray = GLOBALS->sym_judy; PPvoid_t PPValue; char *Index = calloc_2(1, longest); for (PPValue = JudySLFirst (PJArray, (uint8_t *)Index, PJE0); PPValue != (PPvoid_t) NULL; PPValue = JudySLNext (PJArray, (uint8_t *)Index, PJE0)) { struct symbol *s = *(struct symbol **)PPValue; s->name = strdup_2(Index); s->n->nname = s->name; } free_2(Index); } #endif if(sym_chain) { sym_curr=sym_chain; while(sym_curr) { sym_curr->val->vec_root= ((struct vcdsymbol *)sym_curr->val->vec_root)->sym_chain; if ((struct vcdsymbol *)sym_curr->val->vec_chain) sym_curr->val->vec_chain=((struct vcdsymbol *)sym_curr->val->vec_chain)->sym_chain; DEBUG(printf("Link: ('%s') '%s' -> '%s'\n",sym_curr->val->vec_root->name, sym_curr->val->name, sym_curr->val->vec_chain?sym_curr->val->vec_chain->name:"(END)")); sym_chain=sym_curr; sym_curr=sym_curr->next; free_2(sym_chain); } } } /*******************************************************************************/ static void vcd_cleanup(void) { struct slist *s, *s2; if(GLOBALS->slisthier) { free_2(GLOBALS->slisthier); GLOBALS->slisthier=NULL; } s=GLOBALS->slistroot; while(s) { s2=s->next; if(s->str)free_2(s->str); free_2(s); s=s2; } GLOBALS->slistroot=GLOBALS->slistcurr=NULL; GLOBALS->slisthier_len=0; } /*******************************************************************************/ TimeType vcd_partial_main(char *fname) { unsigned int shmidu = ~(0L); int shmid; GLOBALS->pv_vcd_partial_c_2=GLOBALS->rootv_vcd_partial_c_2=NULL; GLOBALS->vcd_hier_delimeter[0]=GLOBALS->hier_delimeter; errno=0; /* reset in case it's set for some reason */ GLOBALS->yytext_vcd_partial_c_2=(char *)malloc_2(GLOBALS->T_MAX_STR_vcd_partial_c_2+1); if(!GLOBALS->hier_was_explicitly_set) /* set default hierarchy split char */ { GLOBALS->hier_delimeter='.'; } #ifdef __MINGW32__ if(GetEnvironmentVariable("SHMID", NULL, 0)) { char sEnv[128]; GetEnvironmentVariable("SHMID", sEnv, 128); sscanf(sEnv, "%x", &shmidu); } else #endif { if(!strcmp(fname, "-vcd")) { if(!fscanf(stdin, "%x", &shmidu)) shmidu = ~(0L); /* allow use of -v flag to pass straight from stdin */ } else { sscanf(fname, "%x", &shmidu); /* passed as a filename */ } } shmid = (int)shmidu; #if !defined _MSC_VER #ifdef __MINGW32__ { HANDLE hMapFile; char mapName[257]; sprintf(mapName, "shmidcat%d", shmid); hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, mapName); if(hMapFile == NULL) { fprintf(stderr, "Could not attach shared memory map name '%s', exiting.\n", mapName); exit(255); } GLOBALS->consume_ptr_vcd_partial_c_1 = GLOBALS->buf_vcd_partial_c_2 = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, WAVE_PARTIAL_VCD_RING_BUFFER_SIZE); if(GLOBALS->consume_ptr_vcd_partial_c_1 == NULL) { fprintf(stderr, "Could not map view of file '%s', exiting.\n", mapName); exit(255); } } #else errno = 0; GLOBALS->consume_ptr_vcd_partial_c_1 = GLOBALS->buf_vcd_partial_c_2 = shmat(shmid, NULL, 0); if(errno) { fprintf(stderr, "Could not attach shared memory ID %08x\n", shmid); perror("Why"); exit(255); } #endif #else fprintf(stderr, "Interactive VCD mode does not work with Windows, exiting.\n"); exit(255); #endif sym_hash_initialize(GLOBALS); getch_alloc(); /* alloc membuff for vcd getch buffer */ build_slisthier(); GLOBALS->vcd_preserve_glitches = 1; /* splicing dictates that we override */ while(!GLOBALS->header_over_vcd_partial_c_2) { vcd_parse(); } if(GLOBALS->varsplit_vcd_partial_c_2) { free_2(GLOBALS->varsplit_vcd_partial_c_2); GLOBALS->varsplit_vcd_partial_c_2=NULL; } if((!GLOBALS->sorted_vcd_partial_c_2)&&(!GLOBALS->indexed_vcd_partial_c_2)) { fprintf(stderr, "No symbols in VCD file..is it malformed? Exiting!\n"); exit(1); } add_tail_histents(); vcd_build_symbols(); vcd_sortfacs(); vcd_cleanup(); GLOBALS->min_time=GLOBALS->start_time_vcd_partial_c_2*GLOBALS->time_scale; GLOBALS->max_time=GLOBALS->end_time_vcd_partial_c_2*GLOBALS->time_scale; GLOBALS->global_time_offset = GLOBALS->global_time_offset * GLOBALS->time_scale; if((GLOBALS->min_time==GLOBALS->max_time)||(GLOBALS->max_time==0)) { GLOBALS->min_time = GLOBALS->max_time = 0; } GLOBALS->is_vcd=~0; GLOBALS->partial_vcd = ~0; #ifdef __linux__ { struct shmid_ds ds; shmctl(shmid, IPC_RMID, &ds); /* mark for destroy */ } #endif return(GLOBALS->max_time); } /*******************************************************************************/ static void regen_harray(Trptr t, nptr nd) { int i, histcount; hptr histpnt; hptr *harray; if(!nd->harray) /* make quick array lookup for aet display */ { histpnt=&(nd->head); histcount=0; while(histpnt) { histcount++; histpnt=histpnt->next; } nd->numhist=histcount; if(!(nd->harray=harray=(hptr *)malloc_2(histcount*sizeof(hptr)))) { fprintf( stderr, "Out of memory, can't add %s to analyzer\n", nd->nname ); free_2(t); return; /* scan-build : really can't do anything here */ } histpnt=&(nd->head); for(i=0;inname, (*harray)->time, (*harray)->val); */ harray++; histpnt=histpnt->next; } } } /* mark vectors that need to be regenerated */ static void regen_trace_mark(Trptr t, int mandclear) { if(t->vector) { bvptr b = t->n.vec; bptr bts = b->bits; int i; if(1) { for(i=0;innbits;i++) { if(!bts->nodes[i]->expansion) { if(bts->nodes[i]->harray) { free_2(bts->nodes[i]->harray); bts->nodes[i]->harray = NULL; } } else { t->interactive_vector_needs_regeneration = 1; } } } for(i=0;innbits;i++) { if(!bts->nodes[i]->harray) { t->interactive_vector_needs_regeneration = 1; return; } } } else { if(t->n.nd) /* comment and blank traces don't have a valid node */ if((t->n.nd->harray) && (mandclear)) { free_2(t->n.nd->harray); t->n.nd->harray = NULL; } } } /* sweep through and regen nodes/dirty vectors */ static void regen_trace_sweep(Trptr t) { if(!t->vector) { if(t->n.nd) /* comment and blank traces don't have a valid node */ if(!t->n.nd->harray) { regen_harray(t, t->n.nd); } } else if(t->interactive_vector_needs_regeneration) { bvptr b = t->n.vec; bptr bts = b->bits; int i; bvptr b2; for(i=0;innbits;i++) { if(bts->nodes[i]->expansion) { nptr parent = bts->nodes[i]->expansion->parent; int parentbit = bts->nodes[i]->expansion->parentbit; DeleteNode(bts->nodes[i]); bts->nodes[i] = ExtractNodeSingleBit(parent, parentbit); } if(!bts->nodes[i]->harray) { regen_harray(t, bts->nodes[i]); } } if(!bts->name) { bts->name = ""; b2 = bits2vector(bts); bts->name = NULL; } else { b2 = bits2vector(bts); } t->n.vec = b2; b2->bits=bts; free_2(b2->bvname); b2->bvname = b->bvname; for(i=0;inumregions;i++) { free_2(b->vectors[i]); } free_2(b); } } /*******************************************************************************/ void kick_partial_vcd(void) { #if !defined _MSC_VER if(GLOBALS->partial_vcd) { #ifdef __MINGW32__ Sleep(10); #else struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 1000000 / 100; select(0, NULL, NULL, NULL, &tv); #endif while(*GLOBALS->consume_ptr_vcd_partial_c_1) { int old_maxtime_marker_conflict = (GLOBALS->tims.marker > GLOBALS->max_time); vcd_parse(); GLOBALS->min_time=GLOBALS->start_time_vcd_partial_c_2*GLOBALS->time_scale; GLOBALS->max_time=GLOBALS->end_time_vcd_partial_c_2*GLOBALS->time_scale; GLOBALS->tims.last=GLOBALS->max_time; GLOBALS->tims.end=GLOBALS->tims.last; /* until the configure_event of wavearea */ if(!GLOBALS->timeset_vcd_partial_c_1) { GLOBALS->tims.first=GLOBALS->tims.start=GLOBALS->tims.laststart=GLOBALS->min_time; GLOBALS->timeset_vcd_partial_c_1 = 1; } update_endcap_times_for_partial_vcd(); update_maxmarker_labels(); if(old_maxtime_marker_conflict) { old_maxtime_marker_conflict = (GLOBALS->tims.marker<=GLOBALS->max_time); /* data is now past what was invisible marker */ } vcd_partial_mark_and_sweep(1); if ((GLOBALS->zoom_dyn) && (!GLOBALS->helpbox_is_active)) { GLOBALS->tims.marker = GLOBALS->tims.last; service_zoom_full(NULL, NULL); GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); } else if ((GLOBALS->zoom_dyne) && (!GLOBALS->helpbox_is_active)) { GLOBALS->tims.marker = GLOBALS->tims.last; service_zoom_right(NULL, NULL); GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); } else if ((old_maxtime_marker_conflict) && (!GLOBALS->helpbox_is_active)) { GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } else { signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } update_maxmarker_labels(); gtkwave_main_iteration(); } } #endif gtkwave_main_iteration(); } static void vcd_partial_regen_node_expansion(Trptr t) { if(!t->vector) { if(t->n.nd && t->n.nd->expansion) { nptr np_ex = ExtractNodeSingleBit(t->n.nd->expansion->parent, t->n.nd->expansion->parentbit); DeleteNode(t->n.nd); t->n.nd = np_ex; t->name_full = np_ex->nname; t->name = (GLOBALS->hier_max_level) ? hier_extract(t->name_full, GLOBALS->hier_max_level) : t->name_full; } } } void vcd_partial_mark_and_sweep(int mandclear) { Trptr t; /* node */ t = GLOBALS->traces.first; while(t) { if(!t->vector) regen_trace_mark(t, mandclear); t = t->t_next; } t = GLOBALS->traces.buffer; while(t) { if(!t->vector) regen_trace_mark(t, mandclear); t = t->t_next; } t = GLOBALS->traces.first; while(t) { if(!t->vector) regen_trace_sweep(t); t = t->t_next; } t = GLOBALS->traces.buffer; while(t) { if(!t->vector) regen_trace_sweep(t); t = t->t_next; } /* node that is single bit extracted */ t = GLOBALS->traces.first; while(t) { vcd_partial_regen_node_expansion(t); t = t->t_next; } t = GLOBALS->traces.buffer; while(t) { vcd_partial_regen_node_expansion(t); t = t->t_next; } /* vector */ t = GLOBALS->traces.first; while(t) { if(t->vector) regen_trace_mark(t, mandclear); t = t->t_next; } t = GLOBALS->traces.buffer; while(t) { if(t->vector) regen_trace_mark(t, mandclear); t = t->t_next; } t = GLOBALS->traces.first; while(t) { if(t->vector) regen_trace_sweep(t); t = t->t_next; } t = GLOBALS->traces.buffer; while(t) { if(t->vector) regen_trace_sweep(t); t = t->t_next; } /* floating point */ t = GLOBALS->traces.first; while(t) { if(t->minmax_valid) t->minmax_valid = 0; t = t->t_next; } t = GLOBALS->traces.buffer; while(t) { if(t->minmax_valid) t->minmax_valid = 0; t = t->t_next; } } gtkwave-3.3.86/src/fonts.c0000664000175000017500000002556113166335473014701 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2008 * * 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. */ #include "globals.h" #include #include "gtk12compat.h" #include "currenttime.h" #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) && GTK_CHECK_VERSION(2,8,0) #ifdef MAC_INTEGRATION #define WAVE_MONOSPACE_12 "Monaco 16" #define WAVE_MONOSPACE_10 "Monaco 14" #define WAVE_MONOSPACE_8 "Monaco 12" #define WAVE_MONOSPACE_6 "Monaco 10" #define WAVE_SANS_12 "Sans 22" #define WAVE_SANS_10 "Sans 16" #else #define WAVE_MONOSPACE_12 "Monospace 12" #define WAVE_MONOSPACE_10 "Monospace 10" #define WAVE_MONOSPACE_8 "Monospace 8" #define WAVE_MONOSPACE_6 "Monospace 6" #define WAVE_SANS_12 "Sans 12" #define WAVE_SANS_10 "Sans 10" #endif static struct font_engine_font_t *do_font_load(const char *name) { struct font_engine_font_t *fef = NULL; PangoFontDescription *desc; if( (name) && (desc = pango_font_description_from_string(name)) ) { fef = calloc_2(1, sizeof(struct font_engine_font_t)); fef->desc = desc; fef->font = pango_font_map_load_font( pango_cairo_font_map_get_default(), GLOBALS->fonts_context, fef->desc); fef->metrics=pango_font_get_metrics(fef->font, NULL /*pango_language_get_default()*/ ); fef->ascent = pango_font_metrics_get_ascent(fef->metrics) / 1000; fef->descent = pango_font_metrics_get_descent(fef->metrics) / 1000; fef->is_pango = 1; if(!strncmp(name, "Monospace", 9)) { int i_width = font_engine_string_measure(fef, "i"); fef->mono_width = font_engine_string_measure(fef, "O"); fef->is_mono = (i_width == fef->mono_width); } } return(fef); } static int setup_fonts(void) { int width, height; GdkDrawable *drawable=GDK_DRAWABLE(gtk_widget_get_root_window(GTK_WIDGET(GLOBALS->mainwindow))); GdkScreen *fonts_screen = gdk_drawable_get_screen (drawable); GLOBALS->fonts_renderer = gdk_pango_renderer_get_default (fonts_screen); gdk_pango_renderer_set_drawable (GDK_PANGO_RENDERER (GLOBALS->fonts_renderer), drawable); GLOBALS->fonts_gc = gdk_gc_new (drawable); gdk_pango_renderer_set_gc (GDK_PANGO_RENDERER (GLOBALS->fonts_renderer), GLOBALS->fonts_gc); gdk_drawable_get_size (drawable, &width, &height); GLOBALS->fonts_context = gdk_pango_context_get_for_screen (fonts_screen); GLOBALS->fonts_layout = pango_layout_new (GLOBALS->fonts_context); return 0; } static int my_font_height(struct font_engine_font_t *f) { return(f->ascent + f->descent); } static void pango_load_all_fonts(void) { setup_fonts(); GLOBALS->signalfont=do_font_load(GLOBALS->fontname_signals); if(!GLOBALS->signalfont) { if(GLOBALS->use_big_fonts) { GLOBALS->signalfont=do_font_load(GLOBALS->use_nonprop_fonts ? WAVE_MONOSPACE_12 : WAVE_SANS_12); } else { GLOBALS->signalfont=do_font_load(GLOBALS->use_nonprop_fonts ? WAVE_MONOSPACE_10 : WAVE_SANS_10); } } GLOBALS->fontheight= my_font_height(GLOBALS->signalfont)+4; GLOBALS->wavefont=GLOBALS->wavefont_smaller=do_font_load(GLOBALS->fontname_waves); if(!GLOBALS->wavefont) { if(GLOBALS->use_big_fonts) { GLOBALS->wavefont=do_font_load(WAVE_MONOSPACE_12); GLOBALS->wavefont_smaller=do_font_load(WAVE_MONOSPACE_10); } else { GLOBALS->wavefont=do_font_load(WAVE_MONOSPACE_8); GLOBALS->wavefont_smaller=do_font_load(WAVE_MONOSPACE_6); } } if( my_font_height(GLOBALS->signalfont) < my_font_height(GLOBALS->wavefont)) { fprintf(stderr, "Signalfont is smaller than wavefont (%d vs %d). Exiting!\n", my_font_height(GLOBALS->signalfont), my_font_height(GLOBALS->wavefont)); exit(1); } if(my_font_height(GLOBALS->signalfont)>100) { fprintf(stderr, "Fonts are too big! Try fonts with a smaller size. Exiting!\n"); exit(1); } GLOBALS->wavecrosspiece=GLOBALS->wavefont->ascent+1; } #endif /***/ static struct font_engine_font_t *font_engine_gdk_font_load(const char *string) { GdkFont *f = gdk_font_load(string); if(f) { struct font_engine_font_t *fef = calloc_2(1, sizeof(struct font_engine_font_t)); fef->gdkfont = f; fef->ascent = f->ascent; fef->descent = f->descent; return(fef); } else { return(NULL); } } void font_engine_draw_string (GdkDrawable *drawable, struct font_engine_font_t *font, GdkGC *gc, gint x, gint y, const gchar *string) { if(!font->is_pango) { gdk_draw_string(drawable, font->gdkfont, gc, x, y, string); } #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) && GTK_CHECK_VERSION(2,8,0) else { PangoRectangle ink,logical; pango_layout_set_text(GLOBALS->fonts_layout, string, -1); pango_layout_set_font_description(GLOBALS->fonts_layout, font->desc); pango_layout_get_extents(GLOBALS->fonts_layout,&ink,&logical); gdk_draw_layout(drawable, gc, x, y-font->ascent, GLOBALS->fonts_layout); } #endif } gint font_engine_string_measure (struct font_engine_font_t *font, const gchar *string) { gint rc = 1; /* dummy value */ if(!font->is_pango) { rc = gdk_string_measure(font->gdkfont, string); } #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) && GTK_CHECK_VERSION(2,8,0) else { if(font->is_mono) { rc = strlen(string) * font->mono_width; } else { PangoRectangle ink,logical; pango_layout_set_text(GLOBALS->fonts_layout, string, -1); pango_layout_set_font_description(GLOBALS->fonts_layout, font->desc); pango_layout_get_extents(GLOBALS->fonts_layout,&ink,&logical); rc = logical.width/1000; } } #endif return(rc); } void gdk_load_all_fonts(void) { if((GLOBALS->fontname_signals)&&(strlen(GLOBALS->fontname_signals))) { GLOBALS->signalfont=font_engine_gdk_font_load(GLOBALS->fontname_signals); } else { if(GLOBALS->use_big_fonts) { if(!GLOBALS->use_nonprop_fonts) { GLOBALS->signalfont=font_engine_gdk_font_load("-*-times-*-r-*-*-15-*-*-*-*-*-*-*"); } else { #ifdef __CYGWIN__ GLOBALS->signalfont=font_engine_gdk_font_load("-misc-fixed-*-*-*-*-15-*-*-*-*-*-*-*"); #else GLOBALS->signalfont=font_engine_gdk_font_load("-*-courier-*-r-*-*-15-*-*-*-*-*-*-*"); if(!GLOBALS->signalfont) GLOBALS->signalfont=font_engine_gdk_font_load("-misc-fixed-*-*-*-*-15-*-*-*-*-*-*-*"); #endif } } else { if(GLOBALS->use_nonprop_fonts) { #ifdef __CYGWIN__ GLOBALS->signalfont=font_engine_gdk_font_load("-misc-fixed-*-*-*-*-14-*-*-*-*-*-*-*"); #else GLOBALS->signalfont=font_engine_gdk_font_load("-*-courier-*-r-*-*-14-*-*-*-*-*-*-*"); if(!GLOBALS->signalfont) GLOBALS->signalfont=font_engine_gdk_font_load("-misc-fixed-*-*-*-*-14-*-*-*-*-*-*-*"); #endif } } } if(!GLOBALS->signalfont) { #if WAVE_USE_GTK2 GLOBALS->signalfont=font_engine_gdk_font_load("-*-courier-*-r-*-*-14-*-*-*-*-*-*-*"); if(!GLOBALS->signalfont) GLOBALS->signalfont=font_engine_gdk_font_load("-misc-fixed-*-*-*-*-14-*-*-*-*-*-*-*"); if(!GLOBALS->signalfont) { fprintf(stderr, "Could not load signalfont courier 14 or misc-fixed 14, exiting!\n"); exit(255); } #else GLOBALS->signalfont= calloc_2(1, sizeof(struct font_engine_font_t)); GLOBALS->signalfont->gdkfont = GLOBALS->wavearea->style->font; GLOBALS->signalfont->ascent = GLOBALS->wavearea->style->font->ascent; GLOBALS->signalfont->descent = GLOBALS->wavearea->style->font->descent; #endif } GLOBALS->fontheight=(GLOBALS->signalfont->ascent+GLOBALS->signalfont->descent)+4; if((GLOBALS->fontname_waves)&&(strlen(GLOBALS->fontname_waves))) { GLOBALS->wavefont=GLOBALS->wavefont_smaller=font_engine_gdk_font_load(GLOBALS->fontname_waves); } else { #ifndef __CYGWIN__ if(GLOBALS->use_big_fonts) { GLOBALS->wavefont=font_engine_gdk_font_load("-*-courier-*-r-*-*-14-*-*-*-*-*-*-*"); if(!GLOBALS->wavefont) GLOBALS->wavefont=font_engine_gdk_font_load("-misc-fixed-*-*-*-*-14-*-*-*-*-*-*-*"); GLOBALS->wavefont_smaller=font_engine_gdk_font_load("-*-courier-*-r-*-*-10-*-*-*-*-*-*-*"); if(!GLOBALS->wavefont_smaller) GLOBALS->wavefont_smaller=font_engine_gdk_font_load("-misc-fixed-*-*-*-*-10-*-*-*-*-*-*-*"); } else { GLOBALS->wavefont=GLOBALS->wavefont_smaller=font_engine_gdk_font_load("-*-courier-*-r-*-*-10-*-*-*-*-*-*-*"); if(!GLOBALS->wavefont) GLOBALS->wavefont=GLOBALS->wavefont_smaller=font_engine_gdk_font_load("-misc-fixed-*-*-*-*-10-*-*-*-*-*-*-*"); } #else if(GLOBALS->use_big_fonts) { GLOBALS->wavefont=font_engine_gdk_font_load("-misc-fixed-*-*-*-*-14-*-*-*-*-*-*-*"); GLOBALS->wavefont_smaller=font_engine_gdk_font_load("-misc-fixed-*-*-*-*-10-*-*-*-*-*-*-*"); } else { GLOBALS->wavefont=GLOBALS->wavefont_smaller=font_engine_gdk_font_load("-misc-fixed-*-*-*-*-10-*-*-*-*-*-*-*"); } #endif } if(!GLOBALS->wavefont) { #if WAVE_USE_GTK2 GLOBALS->wavefont=GLOBALS->wavefont_smaller=font_engine_gdk_font_load("-*-courier-*-r-*-*-10-*-*-*-*-*-*-*"); if(!GLOBALS->wavefont) GLOBALS->wavefont=GLOBALS->wavefont_smaller=font_engine_gdk_font_load("-misc-fixed-*-*-*-*-10-*-*-*-*-*-*-*"); if(!GLOBALS->wavefont) { fprintf(stderr, "Could not load wavefont courier 10 or misc-fixed 10, exiting!\n"); exit(255); } #else GLOBALS->wavefont = calloc_2(1, sizeof(struct font_engine_font_t)); GLOBALS->wavefont->gdkfont = GLOBALS->wavearea->style->font; GLOBALS->wavefont->ascent = GLOBALS->wavearea->style->font->ascent; GLOBALS->wavefont->descent = GLOBALS->wavearea->style->font->descent; GLOBALS->wavefont_smaller = calloc_2(1, sizeof(struct font_engine_font_t)); GLOBALS->wavefont_smaller->gdkfont = GLOBALS->wavearea->style->font; GLOBALS->wavefont_smaller->ascent = GLOBALS->wavearea->style->font->ascent; GLOBALS->wavefont_smaller->descent = GLOBALS->wavearea->style->font->descent; #endif } if(GLOBALS->signalfont->ascentwavefont->ascent) { fprintf(stderr, "Signalfont is smaller than wavefont. Exiting!\n"); exit(1); } if(GLOBALS->signalfont->ascent>100) { fprintf(stderr, "Fonts are too big! Try fonts with a smaller size. Exiting!\n"); exit(1); } GLOBALS->wavecrosspiece=GLOBALS->wavefont->ascent+1; } void load_all_fonts(void) { #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) && GTK_CHECK_VERSION(2,8,0) if(GLOBALS->use_pango_fonts) { pango_load_all_fonts(); } else #endif { gdk_load_all_fonts(); } } gtkwave-3.3.86/src/shiftbuttons.c0000664000175000017500000001051413166335473016274 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999. * * 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. */ #include "globals.h" #include #include "currenttime.h" #include "pixmaps.h" #include "debug.h" void service_left_shift(GtkWidget *text, gpointer data) { (void)text; (void)data; GtkAdjustment *hadj; gfloat inc; TimeType ntinc; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nShift Left"); help_text( " scrolls the display window left one tick worth of data." " The net action is that the data scrolls right a tick." #ifdef WAVE_USE_GTK2 " Ctrl + Scrollwheel Up also does this in non-alternative wheel mode." #endif ); return; } if(GLOBALS->nspx>1.0) inc=GLOBALS->nspx; else inc=1.0; hadj=GTK_ADJUSTMENT(GLOBALS->wave_hslider); if((hadj->value-inc)>GLOBALS->tims.first) hadj->value=hadj->value-inc; else hadj->value=GLOBALS->tims.first; ntinc=(TimeType)inc; if((GLOBALS->tims.start-ntinc)>GLOBALS->tims.first) GLOBALS->tims.timecache=GLOBALS->tims.start-ntinc; else GLOBALS->tims.timecache=GLOBALS->tims.first; time_update(); DEBUG(printf("Left Shift\n")); } void service_right_shift(GtkWidget *text, gpointer data) { (void)text; (void)data; GtkAdjustment *hadj; gfloat inc; TimeType ntinc, pageinc; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nShift Right"); help_text( " scrolls the display window right one tick worth of data." " The net action is that the data scrolls left a tick." #ifdef WAVE_USE_GTK2 " Ctrl + Scrollwheel Down also does this in non-alternative wheel mode." #endif ); return; } if(GLOBALS->nspx>1.0) inc=GLOBALS->nspx; else inc=1.0; ntinc=(TimeType)inc; hadj=GTK_ADJUSTMENT(GLOBALS->wave_hslider); if((hadj->value+inc)tims.last) hadj->value=hadj->value+inc; else hadj->value=GLOBALS->tims.last-inc; pageinc=(TimeType)(((gdouble)GLOBALS->wavewidth)*GLOBALS->nspx); if((GLOBALS->tims.start+ntinc)<(GLOBALS->tims.last-pageinc+1)) GLOBALS->tims.timecache=GLOBALS->tims.start+ntinc; else { GLOBALS->tims.timecache=GLOBALS->tims.last-pageinc+1; if(GLOBALS->tims.timecachetims.first) GLOBALS->tims.timecache=GLOBALS->tims.first; } time_update(); DEBUG(printf("Right Shift\n")); } /* Create shift buttons */ GtkWidget * create_shift_buttons (void) { GtkWidget *table; GtkWidget *table2; GtkWidget *frame; GtkWidget *main_vbox; GtkWidget *b1; GtkWidget *b2; GtkWidget *pixmapwid1, *pixmapwid2; GtkTooltips *tooltips; tooltips=gtk_tooltips_new_2(); gtk_tooltips_set_delay_2(tooltips,1500); pixmapwid1=gtk_pixmap_new(GLOBALS->larrow_pixmap, GLOBALS->larrow_mask); gtk_widget_show(pixmapwid1); pixmapwid2=gtk_pixmap_new(GLOBALS->rarrow_pixmap, GLOBALS->rarrow_mask); gtk_widget_show(pixmapwid2); /* Create a table to hold the text widget and scrollbars */ table = gtk_table_new (1, 1, FALSE); main_vbox = gtk_vbox_new (FALSE, 1); gtk_container_border_width (GTK_CONTAINER (main_vbox), 1); gtk_container_add (GTK_CONTAINER (table), main_vbox); frame = gtk_frame_new ("Shift "); gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0); gtk_widget_show (frame); gtk_widget_show (main_vbox); table2 = gtk_table_new (2, 1, FALSE); b1 = gtk_button_new(); gtk_container_add(GTK_CONTAINER(b1), pixmapwid1); gtk_table_attach (GTK_TABLE (table2), b1, 0, 1, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); gtk_signal_connect_object (GTK_OBJECT (b1), "clicked", GTK_SIGNAL_FUNC(service_left_shift), GTK_OBJECT (table2)); gtk_tooltips_set_tip_2(tooltips, b1, "Shift Left 1 Tick", NULL); gtk_widget_show(b1); b2 = gtk_button_new(); gtk_container_add(GTK_CONTAINER(b2), pixmapwid2); gtk_table_attach (GTK_TABLE (table2), b2, 0, 1, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); gtk_signal_connect_object (GTK_OBJECT (b2), "clicked", GTK_SIGNAL_FUNC(service_right_shift), GTK_OBJECT (table2)); gtk_tooltips_set_tip_2(tooltips, b2, "Shift Right 1 Tick", NULL); gtk_widget_show(b2); gtk_container_add (GTK_CONTAINER (frame), table2); gtk_widget_show(table2); return(table); } gtkwave-3.3.86/src/translate.c0000664000175000017500000003766713166335473015557 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2005-2014. * * 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. */ #include #include "globals.h" #include #include "gtk12compat.h" #include "symbol.h" #include "translate.h" #include "debug.h" #ifdef _MSC_VER #define strcasecmp _stricmp #endif /************************ splay ************************/ xl_Tree * xl_splay (char *i, xl_Tree * t) { /* Simple top down splay, not requiring i to be in the tree t. */ /* What it does is described above. */ xl_Tree N, *l, *r, *y; int dir; if (t == NULL) return t; N.left = N.right = NULL; l = r = &N; for (;;) { dir = strcasecmp(i, t->item); if (dir < 0) { if (t->left == NULL) break; if (strcasecmp(i, t->left->item)<0) { y = t->left; /* rotate right */ t->left = y->right; y->right = t; t = y; if (t->left == NULL) break; } r->left = t; /* link right */ r = t; t = t->left; } else if (dir > 0) { if (t->right == NULL) break; if (strcasecmp(i, t->right->item)>0) { y = t->right; /* rotate left */ t->right = y->left; y->left = t; t = y; if (t->right == NULL) break; } l->right = t; /* link left */ l = t; t = t->right; } else { break; } } l->right = t->left; /* assemble */ r->left = t->right; t->left = N.right; t->right = N.left; return t; } xl_Tree * xl_insert(char *i, xl_Tree * t, char *trans) { /* Insert i into the tree t, unless it's already there. */ /* Return a pointer to the resulting tree. */ xl_Tree * n; int dir; n = (xl_Tree *) calloc_2(1, sizeof (xl_Tree)); if (n == NULL) { fprintf(stderr, "xl_insert: ran out of memory, exiting.\n"); exit(255); } n->item = strcpy(malloc_2(strlen(i)+1), i); if(trans) n->trans = strcpy(malloc_2(strlen(trans)+1), trans); if (t == NULL) { n->left = n->right = NULL; return n; } t = xl_splay(i,t); dir = strcasecmp(i,t->item); if (dir<0) { n->left = t->left; n->right = t; t->left = NULL; return n; } else if (dir>0) { n->right = t->right; n->left = t; t->right = NULL; return n; } else { /* We get here if it's already in the tree */ /* Don't add it again */ if(n->trans) free_2(n->trans); free_2(n->item); free_2(n); return t; } } xl_Tree * xl_delete(char *i, xl_Tree * t) { /* Deletes i from the tree if it's there. */ /* Return a pointer to the resulting tree. */ xl_Tree * x; if (t==NULL) return NULL; t = xl_splay(i,t); if (strcmp(i, t->item) == 0) { /* found it */ if (t->left == NULL) { x = t->right; } else { x = xl_splay(i, t->left); x->right = t->right; } if(t->trans) free_2(t->trans); free_2(t->item); free_2(t); return x; } return t; /* It wasn't there */ } /************************ splay ************************/ void init_filetrans_data(void) { int i; if(!GLOBALS->filesel_filter) { GLOBALS->filesel_filter = calloc_2(FILE_FILTER_MAX+1, sizeof(char *)); } if(!GLOBALS->xl_file_filter) { GLOBALS->xl_file_filter = calloc_2(FILE_FILTER_MAX+1, sizeof(struct xl_tree_node *)); } for(i=0;ifilesel_filter[i] = NULL; GLOBALS->xl_file_filter[i] = NULL; } } static void regen_display(void) { GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } static void remove_file_filter_2(xl_Tree *t) { if(t->left) remove_file_filter_2(t->left); if(t->right) remove_file_filter_2(t->right); if(t->item) free_2(t->item); if(t->trans) free_2(t->trans); free_2(t); } static void remove_file_filter(int which, int regen) { if(GLOBALS->xl_file_filter[which]) { remove_file_filter_2(GLOBALS->xl_file_filter[which]); GLOBALS->xl_file_filter[which] = NULL; } if(regen) { regen_display(); } } static void load_file_filter(int which, char *name) { FILE *f = fopen(name, "rb"); if(!f) { status_text("Could not open filter file!\n"); return; } remove_file_filter(which, 0); /* should never happen from GUI, but possible from save files or other weirdness */ while(!feof(f)) { char *s = fgetmalloc(f); if(s) { char *lhs = s; while(*lhs && isspace((int)(unsigned char)*lhs)) lhs++; if(lhs) { char *rhs = lhs; if(*lhs != '#') /* ignore comments */ { while(*rhs && !isspace((int)(unsigned char)*rhs)) rhs++; if(*rhs) { char *xlt = rhs+1; *rhs = 0; while(*xlt && isspace((int)(unsigned char)*xlt)) xlt++; if(*xlt) { GLOBALS->xl_file_filter[which] = xl_insert(lhs, GLOBALS->xl_file_filter[which], xlt); } } } } free_2(s); } } fclose(f); } static void load_enums_filter(int which, char *name) { int argc; char **spl = zSplitTclList(name, &argc); int i; if((!spl)||(!argc)||(argc&1)) { status_text("Malformed enums list!\n"); return; } remove_file_filter(which, 0); /* should never happen from GUI, but possible from save files or other weirdness */ for(i=0;ixl_file_filter[which] = xl_insert(lhs, GLOBALS->xl_file_filter[which], xlt); } free_2(spl); } int install_file_filter(int which) { int found = 0; if((which<0)||(which>=(FILE_FILTER_MAX+1))) { which = 0; } if(GLOBALS->traces.first) { Trptr t = GLOBALS->traces.first; while(t) { if(t->flags&TR_HIGHLIGHT) { if(!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { t->f_filter = which; t->p_filter = 0; if(!which) { t->flags &= (~(TR_FTRANSLATED|TR_PTRANSLATED|TR_ANALOGMASK)); } else { t->flags &= (~(TR_ANALOGMASK)); t->flags |= TR_FTRANSLATED; } found++; } } t=t->t_next; } } if(found) { regen_display(); } return(found); } /************************************************************************/ static void destroy_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; GLOBALS->is_active_translate_c_5=0; gtk_widget_destroy(GLOBALS->window_translate_c_11); GLOBALS->window_translate_c_11 = NULL; } static void ok_callback(GtkWidget *widget, GtkWidget *nothing) { install_file_filter(GLOBALS->current_filter_translate_c_2); destroy_callback(widget, nothing); } static void select_row_callback(GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data) { (void)widget; (void)row; (void)column; (void)event; (void)data; GLOBALS->current_filter_translate_c_2 = row + 1; } static void unselect_row_callback(GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data) { (void)widget; (void)row; (void)column; (void)event; (void)data; GLOBALS->current_filter_translate_c_2 = 0; /* none */ } static void add_filter_callback_2(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; int i; GtkCList *cl; if(!GLOBALS->filesel_ok) { return; } if(*GLOBALS->fileselbox_text) { for(i=0;inum_file_filters;i++) { if(GLOBALS->filesel_filter[i]) { if(!strcmp(GLOBALS->filesel_filter[i], *GLOBALS->fileselbox_text)) { status_text("Filter already imported.\n"); if(GLOBALS->is_active_translate_c_5) gdk_window_raise(GLOBALS->window_translate_c_11->window); return; } } } } GLOBALS->num_file_filters++; load_file_filter(GLOBALS->num_file_filters, *GLOBALS->fileselbox_text); if(GLOBALS->xl_file_filter[GLOBALS->num_file_filters] && (*GLOBALS->fileselbox_text /* scan-build */)) { if(GLOBALS->filesel_filter[GLOBALS->num_file_filters]) free_2(GLOBALS->filesel_filter[GLOBALS->num_file_filters]); GLOBALS->filesel_filter[GLOBALS->num_file_filters] = malloc_2(strlen(*GLOBALS->fileselbox_text) + 1); strcpy(GLOBALS->filesel_filter[GLOBALS->num_file_filters], *GLOBALS->fileselbox_text); cl=GTK_CLIST(GLOBALS->clist_translate_c_4); gtk_clist_freeze(cl); gtk_clist_append(cl,(gchar **)&(GLOBALS->filesel_filter[GLOBALS->num_file_filters])); gtk_clist_set_column_width(cl,0,gtk_clist_optimal_column_width(cl,0)); gtk_clist_thaw(cl); } else { GLOBALS->num_file_filters--; } if(GLOBALS->is_active_translate_c_5) gdk_window_raise(GLOBALS->window_translate_c_11->window); } static void add_filter_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; if(GLOBALS->num_file_filters == FILE_FILTER_MAX) { status_text("Max number of file filters installed already.\n"); return; } fileselbox("Select Filter File",&GLOBALS->fcurr_translate_c_2,GTK_SIGNAL_FUNC(add_filter_callback_2), GTK_SIGNAL_FUNC(NULL),NULL, 0); } /* * mainline.. */ void trans_searchbox(char *title) { int i; GtkWidget *scrolled_win; GtkWidget *vbox1, *hbox, *hbox0; GtkWidget *button1, *button5, *button6; gchar *titles[]={"Filter Select"}; GtkWidget *frame2, *frameh, *frameh0; GtkWidget *table; GtkTooltips *tooltips; if(GLOBALS->is_active_translate_c_5) { gdk_window_raise(GLOBALS->window_translate_c_11->window); return; } GLOBALS->is_active_translate_c_5=1; GLOBALS->current_filter_translate_c_2 = 0; /* create a new modal window */ GLOBALS->window_translate_c_11 = gtk_window_new(GLOBALS->disable_window_manager ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL); install_focus_cb(GLOBALS->window_translate_c_11, ((char *)&GLOBALS->window_translate_c_11) - ((char *)GLOBALS)); gtk_window_set_title(GTK_WINDOW (GLOBALS->window_translate_c_11), title); gtkwave_signal_connect(GTK_OBJECT (GLOBALS->window_translate_c_11), "delete_event",(GtkSignalFunc) destroy_callback, NULL); tooltips=gtk_tooltips_new_2(); table = gtk_table_new (256, 1, FALSE); gtk_widget_show (table); vbox1 = gtk_vbox_new (FALSE, 0); gtk_container_border_width (GTK_CONTAINER (vbox1), 3); gtk_widget_show (vbox1); frame2 = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (frame2), 3); gtk_widget_show(frame2); gtk_table_attach (GTK_TABLE (table), frame2, 0, 1, 0, 254, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); GLOBALS->clist_translate_c_4=gtk_clist_new_with_titles(1,titles); gtk_clist_column_titles_passive(GTK_CLIST(GLOBALS->clist_translate_c_4)); gtk_clist_set_selection_mode(GTK_CLIST(GLOBALS->clist_translate_c_4), GTK_SELECTION_EXTENDED); gtkwave_signal_connect_object (GTK_OBJECT (GLOBALS->clist_translate_c_4), "select_row",GTK_SIGNAL_FUNC(select_row_callback),NULL); gtkwave_signal_connect_object (GTK_OBJECT (GLOBALS->clist_translate_c_4), "unselect_row",GTK_SIGNAL_FUNC(unselect_row_callback),NULL); for(i=0;inum_file_filters;i++) { gtk_clist_append(GTK_CLIST(GLOBALS->clist_translate_c_4),(gchar **)&(GLOBALS->filesel_filter[i+1])); } gtk_clist_set_column_width(GTK_CLIST(GLOBALS->clist_translate_c_4),0,gtk_clist_optimal_column_width(GTK_CLIST(GLOBALS->clist_translate_c_4),0)); gtk_widget_show (GLOBALS->clist_translate_c_4); scrolled_win = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_set_usize( GTK_WIDGET (scrolled_win), -1, 300); gtk_widget_show(scrolled_win); /* gtk_scrolled_window_add_with_viewport doesn't seen to work right here.. */ gtk_container_add (GTK_CONTAINER (scrolled_win), GLOBALS->clist_translate_c_4); gtk_container_add (GTK_CONTAINER (frame2), scrolled_win); frameh0 = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (frameh0), 3); gtk_widget_show(frameh0); gtk_table_attach (GTK_TABLE (table), frameh0, 0, 1, 254, 255, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); hbox0 = gtk_hbox_new (FALSE, 1); gtk_widget_show (hbox0); button6 = gtk_button_new_with_label (" Add Filter to List "); gtk_container_border_width (GTK_CONTAINER (button6), 3); gtkwave_signal_connect_object (GTK_OBJECT (button6), "clicked",GTK_SIGNAL_FUNC(add_filter_callback),GTK_OBJECT (GLOBALS->window_translate_c_11)); gtk_widget_show (button6); gtk_tooltips_set_tip_2(tooltips, button6, "Bring up a file requester to add a filter to the filter select window.",NULL); gtk_box_pack_start (GTK_BOX (hbox0), button6, TRUE, FALSE, 0); gtk_container_add (GTK_CONTAINER (frameh0), hbox0); frameh = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (frameh), 3); gtk_widget_show(frameh); gtk_table_attach (GTK_TABLE (table), frameh, 0, 1, 255, 256, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); hbox = gtk_hbox_new (FALSE, 1); gtk_widget_show (hbox); button1 = gtk_button_new_with_label (" OK "); gtk_container_border_width (GTK_CONTAINER (button1), 3); gtkwave_signal_connect_object (GTK_OBJECT (button1), "clicked",GTK_SIGNAL_FUNC(ok_callback),GTK_OBJECT (GLOBALS->window_translate_c_11)); gtk_widget_show (button1); gtk_tooltips_set_tip_2(tooltips, button1, "Add selected signals to end of the display on the main window.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button1, TRUE, FALSE, 0); button5 = gtk_button_new_with_label (" Cancel "); gtk_container_border_width (GTK_CONTAINER (button5), 3); gtkwave_signal_connect_object (GTK_OBJECT (button5), "clicked",GTK_SIGNAL_FUNC(destroy_callback),GTK_OBJECT (GLOBALS->window_translate_c_11)); gtk_tooltips_set_tip_2(tooltips, button5, "Do nothing and return to the main window.",NULL); gtk_widget_show (button5); gtk_box_pack_start (GTK_BOX (hbox), button5, TRUE, FALSE, 0); gtk_container_add (GTK_CONTAINER (frameh), hbox); gtk_container_add (GTK_CONTAINER (GLOBALS->window_translate_c_11), table); gtk_widget_set_usize(GTK_WIDGET(GLOBALS->window_translate_c_11), 400, 400); gtk_widget_show(GLOBALS->window_translate_c_11); } /* * currently only called by parsewavline+tcl */ static void set_current_translate_generic(char *name, int typ) { int i; if(typ) { for(i=1;inum_file_filters+1;i++) { if(!strcmp(GLOBALS->filesel_filter[i], name)) { GLOBALS->current_translate_file = i; return; } } if(!strcmp(WAVE_TCL_INSTALLED_FILTER, name)) { GLOBALS->current_translate_file = 0; return; } } if(GLOBALS->num_file_filters < FILE_FILTER_MAX) { GLOBALS->num_file_filters++; if(typ) { load_file_filter(GLOBALS->num_file_filters, name); } else { load_enums_filter(GLOBALS->num_file_filters, name); } if(!GLOBALS->xl_file_filter[GLOBALS->num_file_filters]) { GLOBALS->num_file_filters--; GLOBALS->current_translate_file = 0; } else { if(GLOBALS->filesel_filter[GLOBALS->num_file_filters]) free_2(GLOBALS->filesel_filter[GLOBALS->num_file_filters]); if(!typ) { name = WAVE_TCL_INSTALLED_FILTER; } GLOBALS->filesel_filter[GLOBALS->num_file_filters] = malloc_2(strlen(name) + 1); strcpy(GLOBALS->filesel_filter[GLOBALS->num_file_filters], name); GLOBALS->current_translate_file = GLOBALS->num_file_filters; } } } void set_current_translate_file(char *name) { set_current_translate_generic(name, 1); /* use file, not enums */ } void set_current_translate_enums(char *lst) { set_current_translate_generic(lst, 0); /* use enums */ } gtkwave-3.3.86/src/vcd_partial.h0000664000175000017500000000063113166335473016034 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010 * * 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. */ #ifndef WAVE_VCD_PARTIAL_H #define WAVE_VCD_PARTIAL_H void update_endcap_times_for_partial_vcd(void); #endif gtkwave-3.3.86/src/fonts.h0000664000175000017500000000230413166335473014674 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2008 * * 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. */ #ifndef WAVEFONTENGINE_H #define WAVEFONTENGINE_H #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) #include #endif #include struct font_engine_font_t { #if defined(WAVE_USE_GTK2) && !defined(GTK_ENABLE_BROKEN) PangoFontDescription *desc; PangoFont *font; PangoFontMetrics *metrics; #endif int ascent, descent; int mono_width; GdkFont *gdkfont; unsigned is_pango : 1; unsigned is_mono : 1; }; void load_all_fonts(void); void font_engine_draw_string (GdkDrawable *drawable, struct font_engine_font_t *font, GdkGC *gc, gint x, gint y, const gchar *string); gint font_engine_string_measure (struct font_engine_font_t *font, const gchar *string); #endif gtkwave-3.3.86/src/extload.c0000664000175000017500000020524313166335473015205 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2009-2017. * * 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. */ #include #include "globals.h" #include #include "vzt.h" #include "lx2.h" #include "fsdb_wrapper_api.h" #ifndef _MSC_VER #include #endif #include #include #include #include "symbol.h" #include "vcd.h" #include "lxt2_read.h" #include "vzt_read.h" #include "lxt.h" #include "extload.h" #include "debug.h" #include "busy.h" #include "hierpack.h" #ifdef WAVE_FSDB_READER_IS_PRESENT /* experimental new code that uses FST's on the fly fast tree build algorithm */ #define WAVE_USE_FSDB_FST_BRIDGE #endif #ifndef EXTLOAD_SUFFIX const char *extload_loader_fail_msg = "Sorry, EXTLOAD support was not compiled into this executable, exiting.\n\n"; TimeType extload_main(char *fname, char *skip_start, char *skip_end) { (void)fname; (void)skip_start; (void)skip_end; fprintf(stderr, "%s", extload_loader_fail_msg); exit(255); return(0); /* for vc++ */ } void import_extload_trace(nptr np) { (void)np; fprintf(stderr, "%s", extload_loader_fail_msg); exit(255); } void fsdb_import_masked(void) { fprintf(stderr, "%s", extload_loader_fail_msg); exit(255); } void fsdb_set_fac_process_mask(nptr np) { (void)np; fprintf(stderr, "%s", extload_loader_fail_msg); exit(255); } #else /******************************************************************/ /* * reverse equality mem compare */ static int memrevcmp(int i, const char *s1, const char *s2) { i--; for(;i>=0;i--) { if(s1[i] != s2[i]) break; } return(i+1); } /* * fast itoa for decimal numbers */ static char* itoa_2(int value, char* result) { char* ptr = result, *ptr1 = result, tmp_char; int tmp_value; do { tmp_value = value; value /= 10; *ptr++ = "9876543210123456789" [9 + (tmp_value - value * 10)]; } while ( value ); if (tmp_value < 0) *ptr++ = '-'; result = ptr; *ptr-- = '\0'; while(ptr1 < ptr) { tmp_char = *ptr; *ptr--= *ptr1; *ptr1++ = tmp_char; } return(result); } /* * preformatted sprintf statements which remove parsing latency */ static int sprintf_2_sd(char *s, char *c, int d) { char *s2 = s; while(*c) { *(s2++) = *(c++); } *(s2++) = '['; s2 = itoa_2(d, s2); *(s2++) = ']'; *s2 = 0; return(s2 - s); } static int sprintf_2_sdd(char *s, char *c, int d, int d2) { char *s2 = s; while(*c) { *(s2++) = *(c++); } *(s2++) = '['; s2 = itoa_2(d, s2); *(s2++) = ':'; s2 = itoa_2(d2, s2); *(s2++) = ']'; *s2 = 0; return(s2 - s); } /******************************************************************/ #ifndef WAVE_FSDB_READER_IS_PRESENT static int last_modification_check(void) { #ifdef HAVE_SYS_STAT_H struct stat buf; int rc; errno = 0; rc = stat(GLOBALS->loaded_file_name, &buf); if(GLOBALS->extload_lastmod) { if(GLOBALS->extload_already_errored) { return(0); } else if(rc != 0) { fprintf(stderr, EXTLOAD"stat error on '%s'\n", GLOBALS->loaded_file_name); perror("Why"); errno = 0; GLOBALS->extload_already_errored = 1; return(0); } else if(GLOBALS->extload_lastmod != buf.st_mtime) { fprintf(stderr, EXTLOAD"file '%s' was modified!\n", GLOBALS->loaded_file_name); GLOBALS->extload_already_errored = 1; return(0); } else { return(1); } } else { GLOBALS->extload_lastmod = buf.st_mtime; return(1); } #else return(1); #endif } #endif #ifndef WAVE_USE_FSDB_FST_BRIDGE #ifdef WAVE_FSDB_READER_IS_PRESENT static char *get_varname(char *sbuff, unsigned char *vtp, unsigned char *vdp, int i, int *patched_len) { #else static char *get_varname(unsigned char *vtp, unsigned char *vdp, int i, int *patched_len) { static char sbuff[65537]; #endif char * rc; int vt, vt_len; *patched_len = 0; /* zero says is ok, otherwise size overrides msi/lsi */ #ifndef WAVE_FSDB_READER_IS_PRESENT for(;;) #endif { #ifndef WAVE_FSDB_READER_IS_PRESENT rc = fgets(sbuff, 65536, GLOBALS->extload); if(rc) { if(isspace(rc[0])) { char *snp; char sbuff2[65537]; sbuff2[0] = 0; if((snp=strstr(rc+1, "Struct Name:"))) { sscanf(rc+14,"%s", sbuff2); if(sbuff2[0]) { sprintf(rc, "Scope: vcd_struct %s NULL\n", sbuff2); } } else if((snp=strstr(rc+1, "Struct End"))) { sprintf(rc, "Upscope:\n"); } } } else { return(NULL); } #else rc = sbuff; #endif if((rc[0] == 'V') && (i >= 0)) { #ifndef WAVE_FSDB_READER_IS_PRESENT if(!strncmp("Var: ", rc, 5)) #endif { char *pnt = rc + 5; char *last_l = NULL; char typ[64]; char *esc = NULL; char *lb = NULL; char *colon = NULL; char *rb = NULL; int state = 0; char *vtyp_nam; char *cpyto; char *pntd; char *typ_src = pnt; char *typ_dst = typ; /* following code replaces: sscanf(rc + 5, "%s", typ) */ while(*typ_src && !isspace(*typ_src)) { *(typ_dst++) = *(typ_src++); } *typ_dst = 0; while(*pnt) { if((pnt[0] == 'l') && (pnt[1] == ':')) { last_l = pnt; } else if(pnt[0] == '\\') { esc = pnt; } else if(!last_l) { if(pnt[0] == '[') { lb = pnt; colon = NULL; rb = NULL; state = 1; } else if(pnt[0] == ']') { rb = pnt; state = 0; if(!isspace(pnt[1])) { lb = colon = rb = NULL; } if(pnt[1] == '[') esc = pnt; /* pretend we're escaped to handle 2d */ } else if(pnt[0] == ':') { if(state) { colon = pnt; } } } pnt++; } if(last_l) { unsigned int l, r; /* char s1[32]; */ unsigned int d2; /* sscanf(last_l+2, "%u r:%u %s %u", &l, &r, s1, &d2); */ char *ps = last_l+2; char *l_pnt, *r_pnt, *d2_pnt; while(*ps && isspace(*ps)) { ps++; } l_pnt = ps; while(*ps && !isspace(*ps)) { ps++; } while(*ps && isspace(*ps)) { ps++; } r_pnt = ps; while(*ps && !isspace(*ps)) { ps++; } while(*ps && isspace(*ps)) { ps++; } /* s1_pnt = ps; */ while(*ps && !isspace(*ps)) { ps++; } while(*ps && isspace(*ps)) { ps++; } d2_pnt = ps; l = atoi(l_pnt); r = atoi(r_pnt+2); d2 = atoi(d2_pnt); GLOBALS->extload_idcodes[i] = d2; if(GLOBALS->extload_inv_idcodes[d2] == 0) GLOBALS->extload_inv_idcodes[d2] = i+1; /* root alias */ if(!strcmp("vcd_real", typ)) { GLOBALS->mvlfacs_vzt_c_3[i].flags = VZT_RD_SYM_F_DOUBLE; GLOBALS->extload_node_block[i].msi=0; GLOBALS->extload_node_block[i].lsi=0; GLOBALS->mvlfacs_vzt_c_3[i].len=64; } else if(!strcmp("vcd_integer", typ)) { GLOBALS->mvlfacs_vzt_c_3[i].flags = VZT_RD_SYM_F_INTEGER; GLOBALS->extload_node_block[i].msi=0; GLOBALS->extload_node_block[i].lsi=0; GLOBALS->mvlfacs_vzt_c_3[i].len=32; } else { int len_parse = 1; GLOBALS->mvlfacs_vzt_c_3[i].len=(l>r) ? (l-r+1) : (r-l+1); if(esc && lb && rb) { GLOBALS->extload_node_block[i].msi = atoi(lb+1); if(colon) { GLOBALS->extload_node_block[i].lsi = atoi(colon+1); } else { GLOBALS->extload_node_block[i].lsi = GLOBALS->extload_node_block[i].msi; } len_parse = (GLOBALS->extload_node_block[i].msi > GLOBALS->extload_node_block[i].lsi) ? (GLOBALS->extload_node_block[i].msi - GLOBALS->extload_node_block[i].lsi + 1) : (GLOBALS->extload_node_block[i].lsi - GLOBALS->extload_node_block[i].msi + 1); if((GLOBALS->mvlfacs_vzt_c_3[i].len > len_parse) && !(GLOBALS->mvlfacs_vzt_c_3[i].len % len_parse)) /* check if 2d array */ { /* printf("len_parse: %d vs len: %d\n", len_parse, GLOBALS->mvlfacs_vzt_c_3[i].len); */ *patched_len = GLOBALS->mvlfacs_vzt_c_3[i].len; } else /* original, non-2d behavior */ { if(len_parse != GLOBALS->mvlfacs_vzt_c_3[i].len) { GLOBALS->extload_node_block[i].msi=l; GLOBALS->extload_node_block[i].lsi=r; } } } else { if(lb && !l && !r) /* fix for stranded signals */ { GLOBALS->extload_node_block[i].msi=atoi(lb+1); GLOBALS->extload_node_block[i].lsi=atoi(lb+1); } else { GLOBALS->extload_node_block[i].msi=l; GLOBALS->extload_node_block[i].lsi=r; } } GLOBALS->mvlfacs_vzt_c_3[i].flags = VZT_RD_SYM_F_BITS; } } /* now extract directional/type information */ pnt = rc + 5; vtyp_nam = pnt; cpyto = sbuff; pntd = strrchr(last_l ? last_l : pnt, ':'); if(pntd) { unsigned char vd = ND_DIR_IMPLICIT; pntd = strchr(pntd, ' '); if(pntd) { pntd++; if(*pntd == 'o') { vd = ND_DIR_OUT; GLOBALS->nonimplicit_direction_encountered = 1; } else if(!strncmp(pntd, "in", 2)) { vd = (pntd[2] == 'p') ? ND_DIR_IN : ND_DIR_INOUT; GLOBALS->nonimplicit_direction_encountered = 1; } } if(vdp) { *vdp = vd; } } while(*pnt) { if(!isspace(*pnt)) { pnt++; } else { break; } } /* is space */ /* vvv extract vartype vvv */ if(vtp) { *pnt = 0; vt_len = pnt-vtyp_nam; if(vt_len > 4) { if(!strncmp(vtyp_nam, "vcd_", 4)) { vt = vcd_keyword_code(vtyp_nam + 4, vt_len - 4); if(vt == V_STRINGTYPE) vt = V_WIRE; } else { if(!strcmp(vtyp_nam, "stream")) { GLOBALS->extload_idcodes[i] = 0; /* kill being able to read stream variables [transactions] for now */ } vt = V_WIRE; } } else { vt = V_WIRE; } *vtp = vt; *pnt = ' '; } /* ^^^ extract vartype ^^^ */ while(*pnt) { if(isspace(*pnt)) { pnt++; } else { break; } } if(*pnt) { while(*pnt) { /* if((*pnt == '[')||(isspace(*pnt))) break; */ if(isspace(*pnt)) break; if((*pnt == '[') && (pnt == strrchr(pnt, '['))) /* fix for arrays */ { /* now to fix possible generate... */ char *pnt2 = pnt; char lastch = *pnt2; int colon_seen = 0; pnt2++; while(*pnt2 && !isspace(*pnt2) && (*pnt2 != '[')) { lastch = *pnt2; pnt2++; if(lastch == ':') { colon_seen = 1; } }; if(lastch == ']') /* fix for NC verilog arrays */ { int rng; if(colon_seen) break; rng = GLOBALS->extload_node_block[i].msi - GLOBALS->extload_node_block[i].lsi; if(!rng) { break; } } } if(*pnt == '\\') /* this is not strictly correct, but fixes generic ranges from icarus */ { pnt++; continue; } *(cpyto++) = *(pnt++); } *cpyto = 0; return(sbuff); } } } else if(rc[0] == 'S') { #ifndef WAVE_FSDB_READER_IS_PRESENT if(!strncmp(rc, "Scope:", 6)) #endif { char vht[2048]; char cname[2048]; char ctype[2048]; unsigned char ttype; vht[0] = vht[4] = vht[5] = cname[0] = ctype[0] = 0; sscanf(rc+6, "%s %s %s", vht, cname, ctype); GLOBALS->fst_scope_name = fstReaderPushScope(GLOBALS->extload_xc, cname, GLOBALS->mod_tree_parent); if(!strcmp(ctype, "NULL")) { ctype[0] = 0; } if(!strncmp(vht, "vcd_", 4)) { switch(vht[4]) { case 'm': ttype = TREE_VCD_ST_MODULE; break; case 't': ttype = TREE_VCD_ST_TASK; break; case 'f': ttype = (vht[5] == 'u') ? TREE_VCD_ST_FUNCTION : TREE_VCD_ST_FORK; break; case 'b': ttype = TREE_VCD_ST_BEGIN; break; case 'g': ttype = TREE_VCD_ST_GENERATE; break; case 's': ttype = TREE_VCD_ST_STRUCT; break; default: ttype = TREE_UNKNOWN; break; } } else if(!strncmp(vht, "sv_", 3)) { switch(vht[3]) { case 'i': ttype = TREE_VCD_ST_INTERFACE; break; default: ttype = TREE_UNKNOWN; break; } } else if(!strncmp(vht, "vhdl_", 5)) { switch(vht[5]) { case 'a': ttype = TREE_VHDL_ST_ARCHITECTURE; break; case 'r': ttype = TREE_VHDL_ST_RECORD; break; case 'b': ttype = TREE_VHDL_ST_BLOCK; break; case 'g': ttype = TREE_VHDL_ST_GENERATE; break; case 'i': ttype = TREE_VHDL_ST_GENIF; break; case 'f': ttype = (vht[6] == 'u') ? TREE_VHDL_ST_FUNCTION : TREE_VHDL_ST_GENFOR; break; case 'p': ttype = (!strncmp(vht+6, "roces", 5)) ? TREE_VHDL_ST_PROCESS: TREE_VHDL_ST_PROCEDURE; break; default: ttype = TREE_UNKNOWN; break; } } else { ttype = TREE_UNKNOWN; } allocate_and_decorate_module_tree_node(ttype, cname, ctype, strlen(cname), strlen(ctype), 0, 0); } } else if(rc[0] == 'U') { GLOBALS->mod_tree_parent = fstReaderGetCurrentScopeUserInfo(GLOBALS->extload_xc); GLOBALS->fst_scope_name = fstReaderPopScope(GLOBALS->extload_xc); } } return(NULL); } #endif #ifndef WAVE_USE_FSDB_FST_BRIDGE #ifdef WAVE_FSDB_READER_IS_PRESENT static void process_extload_variable(char *s_gv) #else static void process_extload_variable(void) #endif { int i; unsigned char vt, nvt; unsigned char vd; struct Node *n; struct symbol *s; char buf[65537]; char *str; struct fac *f; char *fnam; int flen; int longest_nam_candidate = 0; int patched_len = 0; i = GLOBALS->extload_i; if(i<0) { #ifdef WAVE_FSDB_READER_IS_PRESENT fnam = get_varname(s_gv, &GLOBALS->extload_vt_prev, &GLOBALS->extload_vd_prev, 0, &patched_len); flen = strlen(fnam); if(GLOBALS->extload_hlen) { GLOBALS->extload_namecache[0 & F_NAME_MODULUS]=malloc_2(GLOBALS->extload_namecache_max[0 & F_NAME_MODULUS]=GLOBALS->extload_hlen+1+flen+1); memcpy(GLOBALS->extload_namecache[0 & F_NAME_MODULUS], GLOBALS->fst_scope_name, GLOBALS->extload_hlen); *(GLOBALS->extload_namecache[0 & F_NAME_MODULUS]+GLOBALS->extload_hlen) = '.'; strcpy(GLOBALS->extload_namecache[0 & F_NAME_MODULUS]+GLOBALS->extload_hlen+1, fnam); GLOBALS->extload_namecache_lens[0 & F_NAME_MODULUS]=GLOBALS->extload_hlen + 1 + flen; GLOBALS->extload_namecache_patched[0 & F_NAME_MODULUS]=patched_len; } else { GLOBALS->extload_namecache[0 & F_NAME_MODULUS]=malloc_2(GLOBALS->extload_namecache_max[0 & F_NAME_MODULUS]=flen+1); strcpy(GLOBALS->extload_namecache[0 & F_NAME_MODULUS], fnam); GLOBALS->extload_namecache_lens[0 & F_NAME_MODULUS] = flen; GLOBALS->extload_namecache_patched[0 & F_NAME_MODULUS]=patched_len; } #else fnam = get_varname(&GLOBALS->extload_vt_prev, &GLOBALS->extload_vd_prev, 0, &patched_len); flen = strlen(fnam); GLOBALS->extload_namecache[0 & F_NAME_MODULUS]=malloc_2(GLOBALS->extload_namecache_max[0 & F_NAME_MODULUS]=flen+1); strcpy(GLOBALS->extload_namecache[0 & F_NAME_MODULUS], fnam); GLOBALS->extload_namecache_lens[0 & F_NAME_MODULUS] = flen; GLOBALS->extload_namecache_patched[0 & F_NAME_MODULUS]=patched_len; #endif } else { vt = GLOBALS->extload_vt_prev; vd = GLOBALS->extload_vd_prev; if(i!=(GLOBALS->numfacs-1)) { #ifdef WAVE_FSDB_READER_IS_PRESENT fnam = get_varname(s_gv, &GLOBALS->extload_vt_prev, &GLOBALS->extload_vd_prev, i+1, &patched_len); flen = strlen(fnam); if(GLOBALS->extload_hlen) { if(GLOBALS->extload_namecache_max[(i+1)&F_NAME_MODULUS] < (GLOBALS->extload_hlen+1+flen+1)) { if(GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS]) free_2(GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS]); GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS]=malloc_2(GLOBALS->extload_namecache_max[(i+1)&F_NAME_MODULUS] = GLOBALS->extload_hlen+1+flen+1); } memcpy(GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS], GLOBALS->fst_scope_name, GLOBALS->extload_hlen); *(GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS]+GLOBALS->extload_hlen) = '.'; strcpy(GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS]+GLOBALS->extload_hlen+1, fnam); GLOBALS->extload_namecache_lens[(i+1)&F_NAME_MODULUS] = GLOBALS->extload_hlen + 1 + flen; GLOBALS->extload_namecache_patched[(i+1)&F_NAME_MODULUS] = patched_len; } else { if(GLOBALS->extload_namecache_max[(i+1)&F_NAME_MODULUS] < (flen+1)) { if(GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS])free_2(GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS]); GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS]=malloc_2(GLOBALS->extload_namecache_max[(i+1)&F_NAME_MODULUS] = flen+1); } strcpy(GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS], fnam); GLOBALS->extload_namecache_lens[(i+1)&F_NAME_MODULUS] = flen; GLOBALS->extload_namecache_patched[(i+1)&F_NAME_MODULUS] = patched_len; } #else fnam = get_varname(&GLOBALS->extload_vt_prev, &GLOBALS->extload_vd_prev, i+1, &patched_len); flen = strlen(fnam); if(GLOBALS->extload_namecache_max[(i+1)&F_NAME_MODULUS] < (flen+1)) { GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS]=malloc_2(GLOBALS->extload_namecache_max[(i+1)&F_NAME_MODULUS] = flen+1); } strcpy(GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS], fnam); GLOBALS->extload_namecache_lens[(i+1)&F_NAME_MODULUS] = flen; GLOBALS->extload_namecache_patched[(i+1)&F_NAME_MODULUS] = patched_len; #endif } f=GLOBALS->mvlfacs_vzt_c_3+i; if((f->len>1)&& (!(f->flags&(VZT_RD_SYM_F_INTEGER|VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING))) ) { int len=sprintf_2_sdd(buf, GLOBALS->extload_namecache[i&F_NAME_MODULUS],GLOBALS->extload_node_block[i].msi, GLOBALS->extload_node_block[i].lsi); if(GLOBALS->extload_namecache_patched[i&F_NAME_MODULUS]) /* 2d */ { GLOBALS->extload_node_block[i].msi=GLOBALS->extload_namecache_patched[i&F_NAME_MODULUS] - 1; GLOBALS->extload_node_block[i].lsi=0; } longest_nam_candidate = len; if(!GLOBALS->do_hier_compress) { str=malloc_2(len+1); } else { if(len > GLOBALS->f_name_build_buf_len) { free_2(GLOBALS->f_name_build_buf); GLOBALS->f_name_build_buf = malloc_2((GLOBALS->f_name_build_buf_len=len)+1); } str = GLOBALS->f_name_build_buf; } if(!GLOBALS->alt_hier_delimeter) { strcpy(str, buf); } else { strcpy_vcdalt(str, buf, GLOBALS->alt_hier_delimeter); } s=&GLOBALS->extload_sym_block[i]; symadd_name_exists_sym_exists(s,str,0); GLOBALS->extload_prevsymroot = GLOBALS->extload_prevsym = NULL; } else if ( ((f->len==1)&&(!(f->flags&(VZT_RD_SYM_F_INTEGER|VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING)))&& ((i!=GLOBALS->numfacs-1)&&(GLOBALS->extload_namecache_lens[i&F_NAME_MODULUS]==GLOBALS->extload_namecache_lens[(i+1)&F_NAME_MODULUS])&&(!memrevcmp(GLOBALS->extload_namecache_lens[i&F_NAME_MODULUS],GLOBALS->extload_namecache[i&F_NAME_MODULUS], GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS])))) || (((i!=0)&&(GLOBALS->extload_namecache_lens[i&F_NAME_MODULUS]==GLOBALS->extload_namecache_lens[(i-1)&F_NAME_MODULUS])&&(!memrevcmp(GLOBALS->extload_namecache_lens[i&F_NAME_MODULUS], GLOBALS->extload_namecache[i&F_NAME_MODULUS], GLOBALS->extload_namecache[(i-1)&F_NAME_MODULUS]))) && (GLOBALS->extload_node_block[i].msi!=-1)&&(GLOBALS->extload_node_block[i].lsi!=-1)) ) { int len = sprintf_2_sd(buf, GLOBALS->extload_namecache[i&F_NAME_MODULUS],GLOBALS->extload_node_block[i].msi); longest_nam_candidate = len; if(!GLOBALS->do_hier_compress) { str=malloc_2(len+1); } else { if(len > GLOBALS->f_name_build_buf_len) { free_2(GLOBALS->f_name_build_buf); GLOBALS->f_name_build_buf = malloc_2((GLOBALS->f_name_build_buf_len=len)+1); } str = GLOBALS->f_name_build_buf; } if(!GLOBALS->alt_hier_delimeter) { strcpy(str, buf); } else { strcpy_vcdalt(str, buf, GLOBALS->alt_hier_delimeter); } s=&GLOBALS->extload_sym_block[i]; symadd_name_exists_sym_exists(s,str,0); if((GLOBALS->extload_prevsym)&&(i>0)&&(GLOBALS->extload_namecache_lens[i&F_NAME_MODULUS]==GLOBALS->extload_namecache_lens[(i-1)&F_NAME_MODULUS])&&(!memrevcmp(GLOBALS->extload_namecache_lens[i&F_NAME_MODULUS], GLOBALS->extload_namecache[i&F_NAME_MODULUS], GLOBALS->extload_namecache[(i-1)&F_NAME_MODULUS]))) /* allow chaining for search functions.. */ { GLOBALS->extload_prevsym->vec_root = GLOBALS->extload_prevsymroot; GLOBALS->extload_prevsym->vec_chain = s; s->vec_root = GLOBALS->extload_prevsymroot; GLOBALS->extload_prevsym = s; } else { GLOBALS->extload_prevsymroot = GLOBALS->extload_prevsym = s; } } else { int len = GLOBALS->extload_namecache_lens[i&F_NAME_MODULUS]; longest_nam_candidate = len; if(!GLOBALS->do_hier_compress) { str=malloc_2(len+1); } else { if(len > GLOBALS->f_name_build_buf_len) { free_2(GLOBALS->f_name_build_buf); GLOBALS->f_name_build_buf = malloc_2((GLOBALS->f_name_build_buf_len=len)+1); } str = GLOBALS->f_name_build_buf; } if(!GLOBALS->alt_hier_delimeter) { strcpy(str, GLOBALS->extload_namecache[i&F_NAME_MODULUS]); } else { strcpy_vcdalt(str, GLOBALS->extload_namecache[i&F_NAME_MODULUS], GLOBALS->alt_hier_delimeter); } s=&GLOBALS->extload_sym_block[i]; symadd_name_exists_sym_exists(s,str,0); GLOBALS->extload_prevsymroot = GLOBALS->extload_prevsym = NULL; if(f->flags&VZT_RD_SYM_F_INTEGER) { GLOBALS->extload_node_block[i].msi=31; GLOBALS->extload_node_block[i].lsi=0; GLOBALS->mvlfacs_vzt_c_3[i].len=32; } } n=&GLOBALS->extload_node_block[i]; if(longest_nam_candidate > GLOBALS->longestname) GLOBALS->longestname = longest_nam_candidate; if(GLOBALS->do_hier_compress) { n->nname = compress_facility((unsigned char *)s->name, longest_nam_candidate); /* free_2(s->name); ...removed as GLOBALS->f_name_build_buf is now used */ s->name = n->nname; } else { n->nname=s->name; } n->nname=s->name; n->mv.mvlfac = GLOBALS->mvlfacs_vzt_c_3+i; GLOBALS->mvlfacs_vzt_c_3[i].working_node = n; if((f->len>1)||(f->flags&(VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING))) { n->extvals = 1; } n->head.time=-1; /* mark 1st node as negative time */ n->head.v.h_val=AN_X; s->n=n; switch(vt) { case V_EVENT: nvt = ND_VCD_EVENT; break; case V_PARAMETER: nvt = ND_VCD_PARAMETER; break; case V_INTEGER: nvt = ND_VCD_INTEGER; break; case V_REAL: nvt = ND_VCD_REAL; break; case V_REG: nvt = ND_VCD_REG; break; case V_SUPPLY0: nvt = ND_VCD_SUPPLY0; break; case V_SUPPLY1: nvt = ND_VCD_SUPPLY1; break; case V_TIME: nvt = ND_VCD_TIME; break; case V_TRI: nvt = ND_VCD_TRI; break; case V_TRIAND: nvt = ND_VCD_TRIAND; break; case V_TRIOR: nvt = ND_VCD_TRIOR; break; case V_TRIREG: nvt = ND_VCD_TRIREG; break; case V_TRI0: nvt = ND_VCD_TRI0; break; case V_TRI1: nvt = ND_VCD_TRI1; break; case V_WAND: nvt = ND_VCD_WAND; break; case V_WIRE: nvt = ND_VCD_WIRE; break; case V_WOR: nvt = ND_VCD_WOR; break; case V_PORT: nvt = ND_VCD_PORT; break; case V_STRINGTYPE: nvt = ND_GEN_STRING; break; default: nvt = ND_UNSPECIFIED_DEFAULT; break; } n->vartype = nvt; n->vardir = vd; } GLOBALS->extload_i++; } #endif #ifndef WAVE_USE_FSDB_FST_BRIDGE #ifdef WAVE_FSDB_READER_IS_PRESENT static void extload_hiertree_callback(void *pnt) { int patched_len = 0; char *s = (char *)pnt; if((GLOBALS->extload_curr_tree < GLOBALS->extload_max_tree) || (!GLOBALS->extload_max_tree)) { switch(s[0]) { case 'S': case 'U': get_varname(s, NULL, NULL, -1, &patched_len); GLOBALS->extload_hlen = GLOBALS->fst_scope_name ? strlen(GLOBALS->fst_scope_name) : 0; break; case 'V': process_extload_variable(s); break; case 'E': { GLOBALS->extload_curr_tree++; fprintf(stderr, EXTLOAD"End tree #%d: %d vs %d symbols\n", GLOBALS->extload_curr_tree, GLOBALS->extload_i + 1, GLOBALS->numfacs); if((GLOBALS->extload_curr_tree == GLOBALS->extload_max_tree) && (GLOBALS->extload_max_tree)) { if(GLOBALS->numfacs > (GLOBALS->extload_i + 1)) { fprintf(stderr, EXTLOAD"Max tree count of %d processed, freeing extra memory.\n", GLOBALS->extload_max_tree); GLOBALS->numfacs = GLOBALS->extload_i + 1; /* make sure these match the corresponding calloc_2 in extload_main_2! */ GLOBALS->mvlfacs_vzt_c_3=(struct fac *)realloc_2(GLOBALS->mvlfacs_vzt_c_3, GLOBALS->numfacs * sizeof(struct fac)); GLOBALS->vzt_table_vzt_c_1=(struct lx2_entry *)realloc_2(GLOBALS->vzt_table_vzt_c_1, GLOBALS->numfacs * sizeof(struct lx2_entry)); GLOBALS->extload_sym_block = (struct symbol *)realloc_2(GLOBALS->extload_sym_block, GLOBALS->numfacs * sizeof(struct symbol)); GLOBALS->extload_node_block=(struct Node *)realloc_2(GLOBALS->extload_node_block, GLOBALS->numfacs * sizeof(struct Node)); GLOBALS->extload_idcodes=(unsigned int *)realloc_2(GLOBALS->extload_idcodes, GLOBALS->numfacs * sizeof(unsigned int)); } } } default: break; } } } #endif #endif /* ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// */ #ifdef WAVE_USE_FSDB_FST_BRIDGE static char *get_varname2(struct fstHier *fh, unsigned char *vtp, unsigned char *vdp, int i, int *patched_len) { char *sbuff = NULL; static char zbuf[65537]; /* OK as this does not need to be re-entrant */ *patched_len = 0; /* zero says is ok, otherwise size overrides msi/lsi */ { if((fh->htyp == FST_HT_VAR) && (i >= 0)) { { const char *pnt; /* const char *esc = NULL; */ const char *lb = NULL; const char *colon = NULL; const char *rb = NULL; int state = 0; char *cpyto; pnt = (fh->u.var.name[fh->u.var.name_length-1] == ']') ? fh->u.var.name : &fh->u.var.name[fh->u.var.name_length]; while(*pnt) { if(pnt[0] == '\\') { /* esc = pnt; */ } else { if(pnt[0] == '[') { lb = pnt; colon = NULL; rb = NULL; state = 1; } else if(pnt[0] == ']') { rb = pnt; state = 0; /* if(pnt[1] == '[') esc = pnt; */ /* pretend we're escaped to handle 2d */ } else if(pnt[0] == ':') { if(state) { colon = pnt; } } } pnt++; } { unsigned int l, r; unsigned int d2; if(lb) { if(rb) { l = atoi(lb); r = atoi(rb); } else { l = r = 0; } } else { l = fh->u.var.length - 1; r = 0; } d2 = fh->u.var.handle; GLOBALS->extload_idcodes[i] = d2; if(GLOBALS->extload_inv_idcodes[d2] == 0) GLOBALS->extload_inv_idcodes[d2] = i+1; /* root alias */ if(fh->u.var.typ == FST_VT_VCD_REAL) { GLOBALS->mvlfacs_vzt_c_3[i].flags = VZT_RD_SYM_F_DOUBLE; GLOBALS->extload_node_block[i].msi=0; GLOBALS->extload_node_block[i].lsi=0; GLOBALS->mvlfacs_vzt_c_3[i].len=64; } else if(fh->u.var.typ == FST_VT_VCD_INTEGER) { GLOBALS->mvlfacs_vzt_c_3[i].flags = VZT_RD_SYM_F_INTEGER; GLOBALS->extload_node_block[i].msi=0; GLOBALS->extload_node_block[i].lsi=0; GLOBALS->mvlfacs_vzt_c_3[i].len=32; } else { int len_parse = 1; GLOBALS->mvlfacs_vzt_c_3[i].len = fh->u.var.length; /* if(esc && lb && rb) */ if(lb && rb) { GLOBALS->extload_node_block[i].msi = atoi(lb+1); if(colon) { GLOBALS->extload_node_block[i].lsi = atoi(colon+1); } else { GLOBALS->extload_node_block[i].lsi = GLOBALS->extload_node_block[i].msi; } len_parse = (GLOBALS->extload_node_block[i].msi > GLOBALS->extload_node_block[i].lsi) ? (GLOBALS->extload_node_block[i].msi - GLOBALS->extload_node_block[i].lsi + 1) : (GLOBALS->extload_node_block[i].lsi - GLOBALS->extload_node_block[i].msi + 1); if((GLOBALS->mvlfacs_vzt_c_3[i].len > len_parse) && !(GLOBALS->mvlfacs_vzt_c_3[i].len % len_parse)) /* check if 2d array */ { /* printf("len_parse: %d vs len: %d\n", len_parse, GLOBALS->mvlfacs_vzt_c_3[i].len); */ *patched_len = GLOBALS->mvlfacs_vzt_c_3[i].len; } else /* original, non-2d behavior */ { if(len_parse != GLOBALS->mvlfacs_vzt_c_3[i].len) { GLOBALS->extload_node_block[i].msi=l; GLOBALS->extload_node_block[i].lsi=r; } } } else { if(lb && !l && !r) /* fix for stranded signals */ { GLOBALS->extload_node_block[i].msi=atoi(lb+1); GLOBALS->extload_node_block[i].lsi=atoi(lb+1); } else { GLOBALS->extload_node_block[i].msi=l; GLOBALS->extload_node_block[i].lsi=r; } } GLOBALS->mvlfacs_vzt_c_3[i].flags = VZT_RD_SYM_F_BITS; } } /* now extract directional/type information */ if(vdp) { switch(fh->u.var.direction) { case FST_VD_INPUT: *vdp = ND_DIR_IN; GLOBALS->nonimplicit_direction_encountered = 1; break; case FST_VD_OUTPUT: *vdp = ND_DIR_OUT; GLOBALS->nonimplicit_direction_encountered = 1; break; case FST_VD_INOUT: *vdp = ND_DIR_INOUT; GLOBALS->nonimplicit_direction_encountered = 1; break; case FST_VD_IMPLICIT: default: *vdp = ND_DIR_IMPLICIT; break; } } if(vtp) { *vtp = fh->u.var.typ; } pnt = fh->u.var.name; sbuff = cpyto = zbuf; sbuff[0] = 0; if(*pnt) { while(*pnt) { /* if((*pnt == '[')||(isspace(*pnt))) break; */ if(isspace(*pnt)) break; if((*pnt == '[') && (pnt == strrchr(pnt, '['))) /* fix for arrays */ { /* now to fix possible generate... */ const char *pnt2 = pnt; char lastch = *pnt2; int colon_seen = 0; pnt2++; while(*pnt2 && !isspace(*pnt2) && (*pnt2 != '[')) { lastch = *pnt2; pnt2++; if(lastch == ':') { colon_seen = 1; } }; if(lastch == ']') /* fix for NC verilog arrays */ { int rng; if(colon_seen) break; rng = GLOBALS->extload_node_block[i].msi - GLOBALS->extload_node_block[i].lsi; if(!rng) { break; } } } if(*pnt == '\\') /* this is not strictly correct, but fixes generic ranges from icarus */ { pnt++; continue; } *(cpyto++) = *(pnt++); } *cpyto = 0; return(sbuff); } } } else if(fh->htyp == FST_HT_SCOPE) { { unsigned char ttype; GLOBALS->fst_scope_name = fstReaderPushScope(GLOBALS->extload_xc, fh->u.scope.name, GLOBALS->mod_tree_parent); switch(fh->u.scope.typ) { case FST_ST_VCD_MODULE: ttype = TREE_VCD_ST_MODULE; break; case FST_ST_VCD_TASK: ttype = TREE_VCD_ST_TASK; break; case FST_ST_VCD_FUNCTION: ttype = TREE_VCD_ST_FUNCTION; break; case FST_ST_VCD_FORK: ttype = TREE_VCD_ST_FORK; break; case FST_ST_VCD_BEGIN: ttype = TREE_VCD_ST_BEGIN; break; case FST_ST_VCD_GENERATE: ttype = TREE_VCD_ST_GENERATE; break; case FST_ST_VCD_STRUCT: ttype = TREE_VCD_ST_STRUCT; break; case FST_ST_VCD_INTERFACE: ttype = TREE_VCD_ST_INTERFACE; break; case FST_ST_VHDL_ARCHITECTURE: ttype = TREE_VHDL_ST_ARCHITECTURE; break; case FST_ST_VHDL_RECORD: ttype = TREE_VHDL_ST_RECORD; break; case FST_ST_VHDL_BLOCK: ttype = TREE_VHDL_ST_BLOCK; break; case FST_ST_VHDL_GENERATE: ttype = TREE_VHDL_ST_GENERATE; break; case FST_ST_VHDL_IF_GENERATE: ttype = TREE_VHDL_ST_GENIF; break; case FST_ST_VHDL_FUNCTION: ttype = TREE_VHDL_ST_FUNCTION; break; case FST_ST_VHDL_FOR_GENERATE: ttype = TREE_VHDL_ST_GENFOR; break; case FST_ST_VHDL_PROCEDURE: ttype = TREE_VHDL_ST_PROCEDURE; break; case FST_ST_VHDL_PROCESS: ttype = TREE_VHDL_ST_PROCESS; break; default: ttype = TREE_UNKNOWN; break; } allocate_and_decorate_module_tree_node(ttype, fh->u.scope.name, fh->u.scope.component, fh->u.scope.name_length, fh->u.scope.component_length, 0, 0); } } else if(fh->htyp == FST_HT_UPSCOPE) { GLOBALS->mod_tree_parent = fstReaderGetCurrentScopeUserInfo(GLOBALS->extload_xc); GLOBALS->fst_scope_name = fstReaderPopScope(GLOBALS->extload_xc); } } return(NULL); } static void fsdb_append_graft_chain(int len, char *nam, int which, struct tree *par) { struct tree *t = talloc_2(sizeof(struct tree) + len + 1); memcpy(t->name, nam, len+1); t->t_which = which; t->child = par; t->next = GLOBALS->terminals_tchain_tree_c_1; GLOBALS->terminals_tchain_tree_c_1 = t; } static void process_extload_variable2(struct fstHier *s_gv) { int i; unsigned char vt, nvt; unsigned char vd; struct Node *n; struct symbol *s; char buf[65537]; char *str; struct fac *f; char *fnam = NULL; int flen; int longest_nam_candidate = 0; int patched_len = 0; struct tree *npar; static char fnam_prev[65537]; /* OK as this does not need to be re-entrant */ i = GLOBALS->extload_i; if(i<0) { fnam = get_varname2(s_gv, &GLOBALS->extload_vt_prev, &GLOBALS->extload_vd_prev, 0, &patched_len); flen = strlen(fnam); npar = GLOBALS->mod_tree_parent; if(fnam) strcpy(fnam_prev, fnam); if(GLOBALS->extload_hlen) { GLOBALS->extload_namecache[0 & F_NAME_MODULUS]=malloc_2(GLOBALS->extload_namecache_max[0 & F_NAME_MODULUS]=GLOBALS->extload_hlen+1+flen+1); memcpy(GLOBALS->extload_namecache[0 & F_NAME_MODULUS], GLOBALS->fst_scope_name, GLOBALS->extload_hlen); *(GLOBALS->extload_namecache[0 & F_NAME_MODULUS]+GLOBALS->extload_hlen) = '.'; strcpy(GLOBALS->extload_namecache[0 & F_NAME_MODULUS]+GLOBALS->extload_hlen+1, fnam); GLOBALS->extload_namecache_lens[0 & F_NAME_MODULUS]=GLOBALS->extload_hlen + 1 + flen; GLOBALS->extload_namecache_patched[0 & F_NAME_MODULUS]=patched_len; GLOBALS->extload_npar[0 & F_NAME_MODULUS]=npar; } else { GLOBALS->extload_namecache[0 & F_NAME_MODULUS]=malloc_2(GLOBALS->extload_namecache_max[0 & F_NAME_MODULUS]=flen+1); strcpy(GLOBALS->extload_namecache[0 & F_NAME_MODULUS], fnam); GLOBALS->extload_namecache_lens[0 & F_NAME_MODULUS] = flen; GLOBALS->extload_namecache_patched[0 & F_NAME_MODULUS]=patched_len; GLOBALS->extload_npar[0 & F_NAME_MODULUS]=npar; } } else { vt = GLOBALS->extload_vt_prev; vd = GLOBALS->extload_vd_prev; if(i!=(GLOBALS->numfacs-1)) { fnam = get_varname2(s_gv, &GLOBALS->extload_vt_prev, &GLOBALS->extload_vd_prev, i+1, &patched_len); flen = strlen(fnam); npar = GLOBALS->mod_tree_parent; if(GLOBALS->extload_hlen) { if(GLOBALS->extload_namecache_max[(i+1)&F_NAME_MODULUS] < (GLOBALS->extload_hlen+1+flen+1)) { if(GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS]) free_2(GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS]); GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS]=malloc_2(GLOBALS->extload_namecache_max[(i+1)&F_NAME_MODULUS] = GLOBALS->extload_hlen+1+flen+1); } memcpy(GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS], GLOBALS->fst_scope_name, GLOBALS->extload_hlen); *(GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS]+GLOBALS->extload_hlen) = '.'; strcpy(GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS]+GLOBALS->extload_hlen+1, fnam); GLOBALS->extload_namecache_lens[(i+1)&F_NAME_MODULUS] = GLOBALS->extload_hlen + 1 + flen; GLOBALS->extload_namecache_patched[(i+1)&F_NAME_MODULUS] = patched_len; GLOBALS->extload_npar[(i+1) & F_NAME_MODULUS]=npar; } else { if(GLOBALS->extload_namecache_max[(i+1)&F_NAME_MODULUS] < (flen+1)) { if(GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS])free_2(GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS]); GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS]=malloc_2(GLOBALS->extload_namecache_max[(i+1)&F_NAME_MODULUS] = flen+1); } strcpy(GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS], fnam); GLOBALS->extload_namecache_lens[(i+1)&F_NAME_MODULUS] = flen; GLOBALS->extload_namecache_patched[(i+1)&F_NAME_MODULUS] = patched_len; GLOBALS->extload_npar[(i+1) & F_NAME_MODULUS]=npar; } } f=GLOBALS->mvlfacs_vzt_c_3+i; if((f->len>1)&& (!(f->flags&(VZT_RD_SYM_F_INTEGER|VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING))) ) { int len=sprintf_2_sdd(buf, GLOBALS->extload_namecache[i&F_NAME_MODULUS],GLOBALS->extload_node_block[i].msi, GLOBALS->extload_node_block[i].lsi); if(GLOBALS->extload_namecache_patched[i&F_NAME_MODULUS]) /* 2d */ { GLOBALS->extload_node_block[i].msi=GLOBALS->extload_namecache_patched[i&F_NAME_MODULUS] - 1; GLOBALS->extload_node_block[i].lsi=0; } longest_nam_candidate = len; if(!GLOBALS->do_hier_compress) { str=malloc_2(len+1); } else { if(len > GLOBALS->f_name_build_buf_len) { free_2(GLOBALS->f_name_build_buf); GLOBALS->f_name_build_buf = malloc_2((GLOBALS->f_name_build_buf_len=len)+1); } str = GLOBALS->f_name_build_buf; } if(!GLOBALS->alt_hier_delimeter) { strcpy(str, buf); } else { strcpy_vcdalt(str, buf, GLOBALS->alt_hier_delimeter); } s=&GLOBALS->extload_sym_block[i]; symadd_name_exists_sym_exists(s,str,0); GLOBALS->extload_prevsymroot = GLOBALS->extload_prevsym = NULL; if(GLOBALS->fast_tree_sort) { len = sprintf_2_sdd(buf, fnam_prev,GLOBALS->extload_node_block[i].msi, GLOBALS->extload_node_block[i].lsi); fsdb_append_graft_chain(len, buf, i, GLOBALS->extload_npar[i & F_NAME_MODULUS]); if(fnam) strcpy(fnam_prev, fnam); } } else if ( ((f->len==1)&&(!(f->flags&(VZT_RD_SYM_F_INTEGER|VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING)))&& ((i!=GLOBALS->numfacs-1)&&(GLOBALS->extload_namecache_lens[i&F_NAME_MODULUS]==GLOBALS->extload_namecache_lens[(i+1)&F_NAME_MODULUS])&&(!memrevcmp(GLOBALS->extload_namecache_lens[i&F_NAME_MODULUS],GLOBALS->extload_namecache[i&F_NAME_MODULUS], GLOBALS->extload_namecache[(i+1)&F_NAME_MODULUS])))) || (((i!=0)&&(GLOBALS->extload_namecache_lens[i&F_NAME_MODULUS]==GLOBALS->extload_namecache_lens[(i-1)&F_NAME_MODULUS])&&(!memrevcmp(GLOBALS->extload_namecache_lens[i&F_NAME_MODULUS], GLOBALS->extload_namecache[i&F_NAME_MODULUS], GLOBALS->extload_namecache[(i-1)&F_NAME_MODULUS]))) && (GLOBALS->extload_node_block[i].msi!=-1)&&(GLOBALS->extload_node_block[i].lsi!=-1)) ) { int len = sprintf_2_sd(buf, GLOBALS->extload_namecache[i&F_NAME_MODULUS],GLOBALS->extload_node_block[i].msi); longest_nam_candidate = len; if(!GLOBALS->do_hier_compress) { str=malloc_2(len+1); } else { if(len > GLOBALS->f_name_build_buf_len) { free_2(GLOBALS->f_name_build_buf); GLOBALS->f_name_build_buf = malloc_2((GLOBALS->f_name_build_buf_len=len)+1); } str = GLOBALS->f_name_build_buf; } if(!GLOBALS->alt_hier_delimeter) { strcpy(str, buf); } else { strcpy_vcdalt(str, buf, GLOBALS->alt_hier_delimeter); } s=&GLOBALS->extload_sym_block[i]; symadd_name_exists_sym_exists(s,str,0); if((GLOBALS->extload_prevsym)&&(i>0)&&(GLOBALS->extload_namecache_lens[i&F_NAME_MODULUS]==GLOBALS->extload_namecache_lens[(i-1)&F_NAME_MODULUS])&&(!memrevcmp(GLOBALS->extload_namecache_lens[i&F_NAME_MODULUS], GLOBALS->extload_namecache[i&F_NAME_MODULUS], GLOBALS->extload_namecache[(i-1)&F_NAME_MODULUS]))) /* allow chaining for search functions.. */ { GLOBALS->extload_prevsym->vec_root = GLOBALS->extload_prevsymroot; GLOBALS->extload_prevsym->vec_chain = s; s->vec_root = GLOBALS->extload_prevsymroot; GLOBALS->extload_prevsym = s; } else { GLOBALS->extload_prevsymroot = GLOBALS->extload_prevsym = s; } if(GLOBALS->fast_tree_sort) { len = sprintf_2_sd(buf, fnam_prev, GLOBALS->extload_node_block[i].msi); fsdb_append_graft_chain(len, buf, i, GLOBALS->extload_npar[i & F_NAME_MODULUS]); if(fnam) strcpy(fnam_prev, fnam); } } else { int len = GLOBALS->extload_namecache_lens[i&F_NAME_MODULUS]; longest_nam_candidate = len; if(!GLOBALS->do_hier_compress) { str=malloc_2(len+1); } else { if(len > GLOBALS->f_name_build_buf_len) { free_2(GLOBALS->f_name_build_buf); GLOBALS->f_name_build_buf = malloc_2((GLOBALS->f_name_build_buf_len=len)+1); } str = GLOBALS->f_name_build_buf; } if(!GLOBALS->alt_hier_delimeter) { strcpy(str, GLOBALS->extload_namecache[i&F_NAME_MODULUS]); } else { strcpy_vcdalt(str, GLOBALS->extload_namecache[i&F_NAME_MODULUS], GLOBALS->alt_hier_delimeter); } s=&GLOBALS->extload_sym_block[i]; symadd_name_exists_sym_exists(s,str,0); GLOBALS->extload_prevsymroot = GLOBALS->extload_prevsym = NULL; if(f->flags&VZT_RD_SYM_F_INTEGER) { GLOBALS->extload_node_block[i].msi=31; GLOBALS->extload_node_block[i].lsi=0; GLOBALS->mvlfacs_vzt_c_3[i].len=32; } if(GLOBALS->fast_tree_sort) { fsdb_append_graft_chain(strlen(fnam_prev), fnam_prev, i, GLOBALS->extload_npar[i & F_NAME_MODULUS]); if(fnam) strcpy(fnam_prev, fnam); } } n=&GLOBALS->extload_node_block[i]; if(longest_nam_candidate > GLOBALS->longestname) GLOBALS->longestname = longest_nam_candidate; if(GLOBALS->do_hier_compress) { n->nname = compress_facility((unsigned char *)s->name, longest_nam_candidate); /* free_2(s->name); ...removed as GLOBALS->f_name_build_buf is now used */ s->name = n->nname; } else { n->nname=s->name; } n->nname=s->name; n->mv.mvlfac = GLOBALS->mvlfacs_vzt_c_3+i; GLOBALS->mvlfacs_vzt_c_3[i].working_node = n; if((f->len>1)||(f->flags&(VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING))) { n->extvals = 1; } n->head.time=-1; /* mark 1st node as negative time */ n->head.v.h_val=AN_X; s->n=n; switch(vt) { case FST_VT_VCD_EVENT: nvt = ND_VCD_EVENT; break; case FST_VT_VCD_PARAMETER: nvt = ND_VCD_PARAMETER; break; case FST_VT_VCD_INTEGER: nvt = ND_VCD_INTEGER; break; case FST_VT_VCD_REAL: nvt = ND_VCD_REAL; break; case FST_VT_VCD_REG: nvt = ND_VCD_REG; break; case FST_VT_VCD_SUPPLY0: nvt = ND_VCD_SUPPLY0; break; case FST_VT_VCD_SUPPLY1: nvt = ND_VCD_SUPPLY1; break; case FST_VT_VCD_TIME: nvt = ND_VCD_TIME; break; case FST_VT_VCD_TRI: nvt = ND_VCD_TRI; break; case FST_VT_VCD_TRIAND: nvt = ND_VCD_TRIAND; break; case FST_VT_VCD_TRIOR: nvt = ND_VCD_TRIOR; break; case FST_VT_VCD_TRIREG: nvt = ND_VCD_TRIREG; break; case FST_VT_VCD_TRI0: nvt = ND_VCD_TRI0; break; case FST_VT_VCD_TRI1: nvt = ND_VCD_TRI1; break; case FST_VT_VCD_WAND: nvt = ND_VCD_WAND; break; case FST_VT_VCD_WIRE: nvt = ND_VCD_WIRE; break; case FST_VT_VCD_WOR: nvt = ND_VCD_WOR; break; case FST_VT_VCD_PORT: nvt = ND_VCD_PORT; break; case FST_VT_GEN_STRING: nvt = ND_GEN_STRING; break; default: nvt = ND_UNSPECIFIED_DEFAULT; break; } n->vartype = nvt; n->vardir = vd; } GLOBALS->extload_i++; } static void extload_hiertree_callback2(void *pnt) { int patched_len = 0; struct fstHier *s = (struct fstHier *)pnt; if((GLOBALS->extload_curr_tree < GLOBALS->extload_max_tree) || (!GLOBALS->extload_max_tree)) { switch(s->htyp) { case FST_HT_SCOPE: case FST_HT_UPSCOPE: get_varname2(s, NULL, NULL, -1, &patched_len); GLOBALS->extload_hlen = GLOBALS->fst_scope_name ? strlen(GLOBALS->fst_scope_name) : 0; break; case FST_HT_VAR: process_extload_variable2(s); break; case FST_HT_TREEEND: { GLOBALS->extload_curr_tree++; fprintf(stderr, EXTLOAD"End tree #%d: %d vs %d symbols\n", GLOBALS->extload_curr_tree, GLOBALS->extload_i + 1, GLOBALS->numfacs); if((GLOBALS->extload_curr_tree == GLOBALS->extload_max_tree) && (GLOBALS->extload_max_tree)) { if(GLOBALS->numfacs > (GLOBALS->extload_i + 1)) { fprintf(stderr, EXTLOAD"Max tree count of %d processed, freeing extra memory.\n", GLOBALS->extload_max_tree); GLOBALS->numfacs = GLOBALS->extload_i + 1; /* make sure these match the corresponding calloc_2 in extload_main_2! */ GLOBALS->mvlfacs_vzt_c_3=(struct fac *)realloc_2(GLOBALS->mvlfacs_vzt_c_3, GLOBALS->numfacs * sizeof(struct fac)); GLOBALS->vzt_table_vzt_c_1=(struct lx2_entry *)realloc_2(GLOBALS->vzt_table_vzt_c_1, GLOBALS->numfacs * sizeof(struct lx2_entry)); GLOBALS->extload_sym_block = (struct symbol *)realloc_2(GLOBALS->extload_sym_block, GLOBALS->numfacs * sizeof(struct symbol)); GLOBALS->extload_node_block=(struct Node *)realloc_2(GLOBALS->extload_node_block, GLOBALS->numfacs * sizeof(struct Node)); GLOBALS->extload_idcodes=(unsigned int *)realloc_2(GLOBALS->extload_idcodes, GLOBALS->numfacs * sizeof(unsigned int)); } } } default: break; } } } #endif /* ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// */ /* * mainline */ static TimeType extload_main_2(char *fname, char *skip_start, char *skip_end) { int max_idcode; #ifndef WAVE_FSDB_READER_IS_PRESENT char sbuff[65537]; unsigned int msk = 0; #endif int i; if(!(GLOBALS->extload=fopen(fname, "rb"))) { GLOBALS->extload_already_errored = 1; return(LLDescriptor(0)); /* look at GLOBALS->vzt_vzt_c_1 in caller for success status... */ } fclose(GLOBALS->extload); /* SPLASH */ splash_create(); #ifdef WAVE_FSDB_READER_IS_PRESENT GLOBALS->extload_ffr_ctx = fsdbReaderOpenFile(GLOBALS->loaded_file_name); GLOBALS->is_lx2 = LXT2_IS_FSDB; if(GLOBALS->extload_ffr_ctx) { int rv; int mult; char scale; uint64_t tim; struct fsdbReaderGetStatistics_t *gs; int success_count = 0; int attempt_count = 0; attempt_count++; rv = fsdbReaderExtractScaleUnit(GLOBALS->extload_ffr_ctx, &mult, &scale); if(rv) { GLOBALS->time_scale = mult; GLOBALS->time_dimension = tolower(scale); success_count++; } attempt_count++; rv = fsdbReaderGetMinFsdbTag64(GLOBALS->extload_ffr_ctx, &tim); if(rv) { GLOBALS->min_time = tim; success_count++; } attempt_count++; rv = fsdbReaderGetMaxFsdbTag64(GLOBALS->extload_ffr_ctx, &tim); if(rv) { GLOBALS->max_time = tim; if(GLOBALS->max_time == LLDescriptor(0)) { GLOBALS->max_time = LLDescriptor(1); } success_count++; } attempt_count++; gs = fsdbReaderGetStatistics(GLOBALS->extload_ffr_ctx); if(gs) { GLOBALS->numfacs = gs->varCount; free(gs); success_count++; } attempt_count++; max_idcode = fsdbReaderGetMaxVarIdcode(GLOBALS->extload_ffr_ctx); if(max_idcode) { success_count++; } else { max_idcode = GLOBALS->numfacs; /* for 1.x format files */ success_count++; } if(attempt_count != success_count) { fprintf(stderr, EXTLOAD"Could not initialize '%s' properly.\n", fname); GLOBALS->extload_already_errored = 1; return(LLDescriptor(0)); } } else { fprintf(stderr, EXTLOAD"Could not initialize '%s' properly.\n", fname); GLOBALS->extload_already_errored = 1; return(LLDescriptor(0)); } #else int patched_len = 0; last_modification_check(); sprintf(sbuff, "%s -info %s 2>&1", EXTLOAD_PATH, fname); GLOBALS->extload = popen(sbuff, "r"); for(;;) { char * rc = fgets(sbuff, 65536, GLOBALS->extload); if(!rc) break; switch(rc[0]) { case 's': if(!strncmp("scale unit", rc, 10)) { char *pnt = strchr(rc+10, ':'); if(pnt) { pnt++; GLOBALS->time_scale = atoi(pnt); GLOBALS->time_dimension = 'n'; while(*pnt) { if(isalpha(*pnt)) { GLOBALS->time_dimension = tolower(*pnt); break; } pnt++; } msk |= 1; } } break; case 'm': if(!strncmp("minimum xtag", rc, 12)) { char *pnt = strchr(rc+12, '('); if(pnt) { unsigned int lo = 0, hi = 0; pnt++; sscanf(pnt, "%u %u", &hi, &lo); GLOBALS->min_time = (TimeType)((((UTimeType)hi)<<32) + ((UTimeType)lo)); msk |= 2; } } else if(!strncmp("maximum xtag", rc, 12)) { char *pnt = strchr(rc+12, '('); if(pnt) { unsigned int lo = 0, hi = 0; pnt++; sscanf(pnt, "%u %u", &hi, &lo); GLOBALS->max_time = (TimeType)((((UTimeType)hi)<<32) + ((UTimeType)lo)); if(GLOBALS->max_time == LLDescriptor(0)) { GLOBALS->max_time = LLDescriptor(1); } msk |= 4; } } else if(!strncmp("max var idcode", rc, 14)) { char *pnt = strchr(rc+14, ':'); if(pnt) { pnt++; sscanf(pnt, "%d", &max_idcode); msk |= 8; } } break; case 'v': if(!strncmp("var creation cnt", rc, 16)) { char *pnt = strchr(rc+16, ':'); if(pnt) { pnt++; sscanf(pnt, "%d", &GLOBALS->numfacs); msk |= 16; } } case 'f': if(!strncmp("file status", rc, 11)) { char *pnt = strchr(rc+11, ':'); if(pnt) { pnt++; if(strstr(pnt, "finished")) { msk |= 32; } } } break; default: break; } } pclose(GLOBALS->extload); if(msk != (1+2+4+8+16+32)) { fprintf(stderr, EXTLOAD"Could not initialize '%s' properly.\n", fname); if((msk & (1+2+4+8+16+32)) == (1+2+4+8+16)) { fprintf(stderr, EXTLOAD"File is not finished dumping.\n"); } GLOBALS->extload_already_errored = 1; return(LLDescriptor(0)); } #endif GLOBALS->min_time *= GLOBALS->time_scale; GLOBALS->max_time *= GLOBALS->time_scale; /* make sure these match the corresponding realloc_2 in extload_hiertree_callback! */ GLOBALS->mvlfacs_vzt_c_3=(struct fac *)calloc_2(GLOBALS->numfacs,sizeof(struct fac)); GLOBALS->vzt_table_vzt_c_1=(struct lx2_entry *)calloc_2(GLOBALS->numfacs, sizeof(struct lx2_entry)); GLOBALS->extload_namecache=(char **)calloc_2(F_NAME_MODULUS+1, sizeof(char *)); GLOBALS->extload_namecache_max=(int *)calloc_2(F_NAME_MODULUS+1, sizeof(int)); GLOBALS->extload_namecache_lens=(int *)calloc_2(F_NAME_MODULUS+1, sizeof(int)); GLOBALS->extload_namecache_patched=(int *)calloc_2(F_NAME_MODULUS+1, sizeof(int)); GLOBALS->extload_sym_block = (struct symbol *)calloc_2(GLOBALS->numfacs, sizeof(struct symbol)); GLOBALS->extload_node_block=(struct Node *)calloc_2(GLOBALS->numfacs,sizeof(struct Node)); GLOBALS->extload_idcodes=(unsigned int *)calloc_2(GLOBALS->numfacs, sizeof(unsigned int)); GLOBALS->extload_inv_idcodes=(int *)calloc_2(max_idcode+1, sizeof(int)); #ifdef WAVE_USE_FSDB_FST_BRIDGE GLOBALS->extload_npar=(struct tree **)calloc_2(F_NAME_MODULUS+1, sizeof(struct tree *)); #endif if(!GLOBALS->fast_tree_sort) { GLOBALS->do_hier_compress = 0; } else { hier_auto_enable(); /* enable if greater than threshold */ } GLOBALS->f_name_build_buf_len = 128; GLOBALS->f_name_build_buf = malloc_2(GLOBALS->f_name_build_buf_len + 1); init_facility_pack(); /* SPLASH */ splash_sync(1, 5); #ifdef WAVE_FSDB_READER_IS_PRESENT if(!GLOBALS->hier_was_explicitly_set) /* set default hierarchy split char */ { GLOBALS->hier_delimeter='.'; } GLOBALS->extload_xc = fstReaderOpenForUtilitiesOnly(); GLOBALS->extload_i=-1; #ifdef WAVE_USE_FSDB_FST_BRIDGE fsdbReaderReadScopeVarTree2(GLOBALS->extload_ffr_ctx, extload_hiertree_callback2); process_extload_variable2(NULL); /* flush out final cached variable */ #else fsdbReaderReadScopeVarTree(GLOBALS->extload_ffr_ctx, extload_hiertree_callback); process_extload_variable(NULL); /* flush out final cached variable */ #endif decorated_module_cleanup(); /* ...also now in gtk2_treesearch.c */ iter_through_comp_name_table(); for(i=0;i<=F_NAME_MODULUS;i++) { if(GLOBALS->extload_namecache[i]) { free_2(GLOBALS->extload_namecache[i]); GLOBALS->extload_namecache[i] = NULL; } } free_2(GLOBALS->extload_namecache); GLOBALS->extload_namecache = NULL; free_2(GLOBALS->extload_namecache_max); GLOBALS->extload_namecache_max = NULL; free_2(GLOBALS->extload_namecache_lens); GLOBALS->extload_namecache_lens = NULL; free_2(GLOBALS->extload_namecache_patched); GLOBALS->extload_namecache_patched = NULL; #ifdef WAVE_USE_FSDB_FST_BRIDGE free_2(GLOBALS->extload_npar); GLOBALS->extload_npar = NULL; #endif fstReaderClose(GLOBALS->extload_xc); /* corresponds to fstReaderOpenForUtilitiesOnly() */ #else if(!last_modification_check()) { GLOBALS->extload_already_errored = 1; return(LLDescriptor(0)); } sprintf(sbuff, "%s -hier_tree %s 2>&1", EXTLOAD_PATH, fname); GLOBALS->extload = popen(sbuff, "r"); /* do your stuff here..all useful info has been initialized by now */ if(!GLOBALS->hier_was_explicitly_set) /* set default hierarchy split char */ { GLOBALS->hier_delimeter='.'; } GLOBALS->extload_xc = fstReaderOpenForUtilitiesOnly(); for(GLOBALS->extload_i=-1;(GLOBALS->numfacs) && (GLOBALS->extload_inumfacs);) { process_extload_variable(); } while(get_varname(&GLOBALS->extload_vt_prev, NULL, -1, &patched_len)); /* read through end to process all upscopes */ decorated_module_cleanup(); /* ...also now in gtk2_treesearch.c */ iter_through_comp_name_table(); for(i=0;i<=F_NAME_MODULUS;i++) { if(GLOBALS->extload_namecache[i]) { free_2(GLOBALS->extload_namecache[i]); GLOBALS->extload_namecache[i] = NULL; } } free_2(GLOBALS->extload_namecache); GLOBALS->extload_namecache = NULL; free_2(GLOBALS->extload_namecache_max); GLOBALS->extload_namecache_max = NULL; free_2(GLOBALS->extload_namecache_lens); GLOBALS->extload_namecache_lens = NULL; pclose(GLOBALS->extload); fstReaderClose(GLOBALS->extload_xc); /* corresponds to fstReaderOpenForUtilitiesOnly() */ #endif /* SPLASH */ splash_sync(2, 5); if(GLOBALS->f_name_build_buf) { free_2(GLOBALS->f_name_build_buf); GLOBALS->f_name_build_buf = NULL; } freeze_facility_pack(); GLOBALS->facs=(struct symbol **)malloc_2(GLOBALS->numfacs*sizeof(struct symbol *)); if(GLOBALS->fast_tree_sort) { for(i=0;inumfacs;i++) { GLOBALS->facs[i]=&GLOBALS->extload_sym_block[i]; } /* SPLASH */ splash_sync(3, 5); fprintf(stderr, EXTLOAD"Building facility hierarchy tree.\n"); init_tree(); #ifndef WAVE_USE_FSDB_FST_BRIDGE for(i=0;inumfacs;i++) { int was_packed = HIER_DEPACK_STATIC; /* no need to free_2() afterward then */ char *sb = hier_decompress_flagged(GLOBALS->facs[i]->name, &was_packed); build_tree_from_name(sb, i); } #endif /* SPLASH */ splash_sync(4, 5); treegraft(&GLOBALS->treeroot); fprintf(stderr, EXTLOAD"Sorting facility hierarchy tree.\n"); treesort(GLOBALS->treeroot, NULL); /* SPLASH */ splash_sync(5, 5); order_facs_from_treesort(GLOBALS->treeroot, &GLOBALS->facs); GLOBALS->facs_are_sorted=1; } else { for(i=0;inumfacs;i++) { char *subst; #ifdef WAVE_HIERFIX char ch; #endif int len; GLOBALS->facs[i]=&GLOBALS->extload_sym_block[i]; subst=GLOBALS->facs[i]->name; if((len=strlen(subst))>GLOBALS->longestname) GLOBALS->longestname=len; #ifdef WAVE_HIERFIX while((ch=(*subst))) { if(ch==GLOBALS->hier_delimeter) { *subst=VCDNAM_HIERSORT; } /* forces sort at hier boundaries */ subst++; } #endif } /* SPLASH */ splash_sync(3, 5); fprintf(stderr, EXTLOAD"Sorting facilities at hierarchy boundaries.\n"); wave_heapsort(GLOBALS->facs,GLOBALS->numfacs); #ifdef WAVE_HIERFIX for(i=0;inumfacs;i++) { char *subst, ch; subst=GLOBALS->facs[i]->name; while((ch=(*subst))) { if(ch==VCDNAM_HIERSORT) { *subst=GLOBALS->hier_delimeter; } /* restore back to normal */ subst++; } } #endif GLOBALS->facs_are_sorted=1; /* SPLASH */ splash_sync(4, 5); fprintf(stderr, EXTLOAD"Building facility hierarchy tree.\n"); init_tree(); for(i=0;inumfacs;i++) { char *nf = GLOBALS->facs[i]->name; build_tree_from_name(nf, i); } /* SPLASH */ splash_sync(5, 5); treegraft(&GLOBALS->treeroot); treesort(GLOBALS->treeroot, NULL); } if(skip_start || skip_end) { TimeType b_start, b_end; if(!skip_start) b_start = GLOBALS->min_time; else b_start = unformat_time(skip_start, GLOBALS->time_dimension); if(!skip_end) b_end = GLOBALS->max_time; else b_end = unformat_time(skip_end, GLOBALS->time_dimension); if(b_startmin_time) b_start = GLOBALS->min_time; else if(b_start>GLOBALS->max_time) b_start = GLOBALS->max_time; if(b_endmin_time) b_end = GLOBALS->min_time; else if(b_end>GLOBALS->max_time) b_end = GLOBALS->max_time; if(b_start > b_end) { TimeType tmp_time = b_start; b_start = b_end; b_end = tmp_time; } GLOBALS->min_time = b_start; GLOBALS->max_time = b_end; } /* SPLASH */ splash_finalize(); return(GLOBALS->max_time); } TimeType extload_main(char *fname, char *skip_start, char *skip_end) { TimeType tt = extload_main_2(fname, skip_start, skip_end); if(!tt) { if(GLOBALS->extload_ffr_ctx) { #ifdef WAVE_FSDB_READER_IS_PRESENT fsdbReaderClose(GLOBALS->extload_ffr_ctx); #endif GLOBALS->extload_ffr_ctx = NULL; } } return(tt); } /* * extload callback (only does bits for now) */ static void extload_callback(TimeType *tim, int *facidx, char **value) { struct HistEnt *htemp = histent_calloc(); struct lx2_entry *l2e = GLOBALS->vzt_table_vzt_c_1+(*facidx); struct fac *f = GLOBALS->mvlfacs_vzt_c_3+(*facidx); GLOBALS->busycnt_vzt_c_2++; if(GLOBALS->busycnt_vzt_c_2==WAVE_BUSY_ITER) { busy_window_refresh(); GLOBALS->busycnt_vzt_c_2 = 0; } /* fprintf(stderr, "%lld %d %s\n", *tim, *facidx, *value); */ if(!(f->flags&(VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING))) { if(f->len>1) { htemp->v.h_vector = (char *)malloc_2(f->len); memcpy(htemp->v.h_vector, *value, f->len); } else { switch(**value) { case '0': htemp->v.h_val = AN_0; break; case '1': htemp->v.h_val = AN_1; break; case 'z': htemp->v.h_val = AN_Z; break; default: htemp->v.h_val = AN_X; break; } } } else if(f->flags&VZT_RD_SYM_F_DOUBLE) { #ifdef WAVE_HAS_H_DOUBLE sscanf(*value, "%lg", &htemp->v.h_double); #else double *d = malloc_2(sizeof(double)); sscanf(*value, "%lg", d); htemp->v.h_vector = (char *)d; #endif htemp->flags = HIST_REAL; } else /* string */ { char *s = malloc_2(strlen(*value)+1); strcpy(s, *value); htemp->v.h_vector = s; htemp->flags = HIST_REAL|HIST_STRING; } htemp->time = (*tim) * (GLOBALS->time_scale); if(l2e->histent_head) { l2e->histent_curr->next = htemp; l2e->histent_curr = htemp; } else { l2e->histent_head = l2e->histent_curr = htemp; } l2e->numtrans++; } /* * this is the black magic that handles aliased signals... */ static void ext_resolver(nptr np, nptr resolve) { np->extvals = resolve->extvals; np->msi = resolve->msi; np->lsi = resolve->lsi; memcpy(&np->head, &resolve->head, sizeof(struct HistEnt)); np->curr = resolve->curr; np->harray = resolve->harray; np->numhist = resolve->numhist; np->mv.mvlfac=NULL; } /* * actually import a extload trace but don't do it if it's already been imported */ void import_extload_trace(nptr np) { struct HistEnt *htemp, *histent_tail; int len, i; struct fac *f; int txidx, txidx_in_trace; nptr nold = np; if(!(f=np->mv.mvlfac)) return; /* already imported */ txidx = f - GLOBALS->mvlfacs_vzt_c_3; txidx_in_trace = GLOBALS->extload_idcodes[txidx]; if(GLOBALS->extload_inv_idcodes[txidx_in_trace] < 0) { txidx = (-GLOBALS->extload_inv_idcodes[txidx_in_trace]) - 1; np = GLOBALS->mvlfacs_vzt_c_3[txidx].working_node; if(!(f=np->mv.mvlfac)) { ext_resolver(nold, np); return; /* already imported */ } } GLOBALS->extload_inv_idcodes[txidx_in_trace] = - (txidx + 1); #ifndef WAVE_FSDB_READER_IS_PRESENT fprintf(stderr, EXTLOAD"Import: %s\n", np->nname); #endif /* new stuff */ len = np->mv.mvlfac->len; #ifdef WAVE_FSDB_READER_IS_PRESENT if(0) { /* process transactions here */ } else /* "normal" VC data */ { void *hdl; /* fsdbReaderAddToSignalList(GLOBALS->extload_ffr_ctx, txidx_in_trace); */ /* fsdbReaderLoadSignals(GLOBALS->extload_ffr_ctx); */ hdl = fsdbReaderCreateVCTraverseHandle(GLOBALS->extload_ffr_ctx, txidx_in_trace); if(fsdbReaderHasIncoreVC(GLOBALS->extload_ffr_ctx, hdl)) { TimeType mxt_max = -2; TimeType mxt = (TimeType)fsdbReaderGetMinXTag(GLOBALS->extload_ffr_ctx, hdl); int rc_xtag = fsdbReaderGotoXTag(GLOBALS->extload_ffr_ctx, hdl, mxt); while(rc_xtag && (mxt >= mxt_max)) /* malformed traces sometimes backtrack time */ { void *val_ptr; char *b; if(!fsdbReaderGetVC(GLOBALS->extload_ffr_ctx, hdl, &val_ptr)) { break; } b = fsdbReaderTranslateVC(hdl, val_ptr); extload_callback(&mxt, &txidx, &b); if(!fsdbReaderGotoNextVC(GLOBALS->extload_ffr_ctx, hdl)) { break; } mxt_max = mxt; mxt = (TimeType)fsdbReaderGetXTag(GLOBALS->extload_ffr_ctx, hdl, &rc_xtag); } } fsdbReaderFree(GLOBALS->extload_ffr_ctx, hdl); /* fsdbReaderUnloadSignals(GLOBALS->extload_ffr_ctx); */ } #else if(last_modification_check()) /* place array height check here in an "&&" branch, sorry, arrays not supported */ { char sbuff[65537]; TimeType tim; sprintf(sbuff, "%s -vc -vidcode %d %s 2>&1", EXTLOAD_PATH, txidx_in_trace, GLOBALS->loaded_file_name); GLOBALS->extload = popen(sbuff, "r"); for(;;) { char *rc = fgets(sbuff, 65536, GLOBALS->extload); if(!rc) { break; } if(isdigit(rc[0])) { rc = strchr(rc, '('); if(rc) { unsigned int lo = 0, hi = 0; sscanf(rc+1, "%u %u", &hi, &lo); tim = (TimeType)((((UTimeType)hi)<<32) + ((UTimeType)lo)); rc = strchr(rc+1, ')'); if(rc) { rc = strchr(rc+1, ':'); if(rc) { char *rtn, *pnt; rc += 2; rtn = rc; while(*rtn) { if(isspace(*rtn)) { *rtn = 0; break; } rtn++; } pnt = rc; while(*pnt) { switch(*pnt) { case 'Z': case '3': *pnt = 'z'; break; case 'X': case '2': *pnt = 'x'; break; default: break; } pnt++; } extload_callback(&tim, &txidx, &rc); } } } } } pclose(GLOBALS->extload); } #endif histent_tail = htemp = histent_calloc(); if(len>1) { htemp->v.h_vector = (char *)malloc_2(len); for(i=0;iv.h_vector[i] = AN_Z; } else { htemp->v.h_val = AN_Z; /* z */ } htemp->time = MAX_HISTENT_TIME; htemp = histent_calloc(); if(len>1) { htemp->v.h_vector = (char *)malloc_2(len); for(i=0;iv.h_vector[i] = AN_X; } else { htemp->v.h_val = AN_X; /* x */ } htemp->time = MAX_HISTENT_TIME-1; htemp->next = histent_tail; if(GLOBALS->vzt_table_vzt_c_1[txidx].histent_curr) { GLOBALS->vzt_table_vzt_c_1[txidx].histent_curr->next = htemp; htemp = GLOBALS->vzt_table_vzt_c_1[txidx].histent_head; } if(!(f->flags&(VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING))) { if(len>1) { np->head.v.h_vector = (char *)malloc_2(len); for(i=0;ihead.v.h_vector[i] = AN_X; } else { np->head.v.h_val = AN_X; /* x */ } } else { np->head.flags = HIST_REAL; if(f->flags&VZT_RD_SYM_F_STRING) np->head.flags |= HIST_STRING; } { struct HistEnt *htemp2 = histent_calloc(); htemp2->time = -1; if(len>1) { htemp2->v.h_vector = htemp->v.h_vector; } else { htemp2->v.h_val = htemp->v.h_val; } htemp2->next = htemp; htemp = htemp2; GLOBALS->vzt_table_vzt_c_1[txidx].numtrans++; } np->head.time = -2; np->head.next = htemp; np->numhist=GLOBALS->vzt_table_vzt_c_1[txidx].numtrans +2 /*endcap*/ +1 /*frontcap*/; memset(GLOBALS->vzt_table_vzt_c_1+txidx, 0, sizeof(struct lx2_entry)); /* zero it out */ np->curr = histent_tail; np->mv.mvlfac = NULL; /* it's imported and cached so we can forget it's an mvlfac now */ if(nold!=np) { ext_resolver(nold, np); } } void fsdb_import_masked(void) { #ifdef WAVE_FSDB_READER_IS_PRESENT fsdbReaderLoadSignals(GLOBALS->extload_ffr_ctx); GLOBALS->extload_ffr_import_count = 0; #endif } void fsdb_set_fac_process_mask(nptr np) { #ifdef WAVE_FSDB_READER_IS_PRESENT struct fac *f; int txidx, txidx_in_trace; if(!(f=np->mv.mvlfac)) return; /* already imported */ txidx = f - GLOBALS->mvlfacs_vzt_c_3; txidx_in_trace = GLOBALS->extload_idcodes[txidx]; if(GLOBALS->extload_inv_idcodes[txidx_in_trace] > 0) { if(!GLOBALS->extload_ffr_import_count) { fsdbReaderUnloadSignals(GLOBALS->extload_ffr_ctx); fsdbReaderResetSignalList(GLOBALS->extload_ffr_ctx); } GLOBALS->extload_ffr_import_count++; fsdbReaderAddToSignalList(GLOBALS->extload_ffr_ctx, txidx_in_trace); } #else (void)np; #endif } #endif gtkwave-3.3.86/src/shiftbuttons.h0000664000175000017500000000073613166335473016306 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010 * * 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. */ #ifndef WAVE_SHIFTBUTTONS_H #define WAVE_SHIFTBUTTONS_H void service_left_shift(GtkWidget *text, gpointer data); void service_right_shift(GtkWidget *text, gpointer data); #endif gtkwave-3.3.86/src/translate.h0000664000175000017500000000204313166335473015540 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2005. * * 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. */ #include "globals.h" #ifndef WAVE_TRANSLATE_H #define WAVE_TRANSLATE_H #include #include #include #include "fgetdynamic.h" #include "debug.h" /* * char splay */ typedef struct xl_tree_node xl_Tree; struct xl_tree_node { xl_Tree *left, *right; char *item; char *trans; }; #define FILE_FILTER_MAX (128) #define WAVE_TCL_INSTALLED_FILTER "\"TCL_Installed_Filter\"" xl_Tree * xl_splay (char *i, xl_Tree * t); xl_Tree * xl_insert(char *i, xl_Tree * t, char *trans); xl_Tree * xl_delete(char *i, xl_Tree * t); void trans_searchbox(char *title); void init_filetrans_data(void); int install_file_filter(int which); void set_current_translate_enums(char *lst); void set_current_translate_file(char *name); #endif gtkwave-3.3.86/src/menu.c0000664000175000017500000074576713166335473014535 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2017. * * 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. */ /* * note: any functions which add/remove traces must first look at * the global "straces". if it's active, complain to the status * window and don't do the op. same for "dnd_state". */ #include "globals.h" #include #include #include "gtk12compat.h" #include "main.h" #include "menu.h" #include "vcd.h" #include "vcd_saver.h" #include "translate.h" #include "ptranslate.h" #include "ttranslate.h" #include "lx2.h" #include "hierpack.h" #include "tcl_helper.h" #include #include #if !defined __MINGW32__ && !defined _MSC_VER #include #include #else #include #include #endif #ifdef _MSC_VER #define strcasecmp _stricmp #endif #undef WAVE_USE_MENU_BLACKOUTS static gtkwave_mlist_t menu_items[WV_MENU_NUMITEMS]; #ifdef WAVE_USE_MLIST_T static GtkWidget **menu_wlist=NULL; #endif extern char *gtkwave_argv0_cached; /* for new window */ /* marshals for handling menu items vs button pressed items */ static void service_left_edge_marshal(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)callback_action; service_left_edge(widget, null_data); } static void service_right_edge_marshal(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)callback_action; service_right_edge(widget, null_data); } static void service_zoom_in_marshal(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)callback_action; service_zoom_in(widget, null_data); } static void service_zoom_out_marshal(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)callback_action; service_zoom_out(widget, null_data); } static void service_zoom_full_marshal(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)callback_action; service_zoom_full(widget, null_data); } static void service_zoom_fit_marshal(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)callback_action; service_zoom_fit(widget, null_data); } static void service_zoom_left_marshal(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)callback_action; service_zoom_left(widget, null_data); } static void service_zoom_right_marshal(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)callback_action; service_zoom_right(widget, null_data); } static void service_zoom_undo_marshal(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)callback_action; service_zoom_undo(widget, null_data); } static void fetch_right_marshal(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)callback_action; fetch_right(widget, null_data); } static void fetch_left_marshal(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)callback_action; fetch_left(widget, null_data); } static void discard_right_marshal(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)callback_action; discard_right(widget, null_data); } static void discard_left_marshal(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)callback_action; discard_left(widget, null_data); } static void service_right_shift_marshal(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)callback_action; service_right_shift(widget, null_data); } static void service_left_shift_marshal(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)callback_action; service_left_shift(widget, null_data); } static void service_right_page_marshal(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)callback_action; service_right_page(widget, null_data); } static void service_left_page_marshal(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)callback_action; service_left_page(widget, null_data); } /* ruler */ static void menu_def_ruler(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nDefine Time Ruler Marks"); help_text( " changes the ruler markings such that the Baseline marker" " defines the origin and the Primary marker distance from" " the Baseline marker defines the period. If either the" " Baseline marker or Primary marker are not present, the" " default ruler markers are used. If the Baseline marker" " and Primary marker have the same value, the default ruler" " markers are used." ); return; } if((GLOBALS->tims.baseline>=0) && (GLOBALS->tims.marker>=0)) { GLOBALS->ruler_origin = GLOBALS->tims.baseline; GLOBALS->ruler_step = GLOBALS->tims.baseline - GLOBALS->tims.marker; if(GLOBALS->ruler_step < 0) GLOBALS->ruler_step = -GLOBALS->ruler_step; } else { GLOBALS->ruler_origin = GLOBALS->ruler_step = LLDescriptor(0); } GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } /* marker locking */ static void lock_marker_left(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; int ent_idx = GLOBALS->named_marker_lock_idx; int i; int success = 0; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nLock to Lesser Named Marker"); help_text( " locks the primary marker to a named marker." " If no named marker is currently selected, the last defined one is used," " otherwise the marker selected will be one lower in the alphabet, scrolling" " through to the end of the alphabet on wrap." " If no named marker exists, one is dropped down for 'A' and the primary" " marker is locked to it." ); return; } if(ent_idx < 0) ent_idx = WAVE_NUM_NAMED_MARKERS; ent_idx--; if(ent_idx < 0) ent_idx = WAVE_NUM_NAMED_MARKERS-1; for(i=0;inamed_markers[ent_idx] >= 0) { success = 1; break; } ent_idx--; if(ent_idx < 0) ent_idx = WAVE_NUM_NAMED_MARKERS-1; } if(!success) { ent_idx = 0; GLOBALS->named_markers[ent_idx] = GLOBALS->tims.marker; } GLOBALS->named_marker_lock_idx = ent_idx; GLOBALS->tims.marker = GLOBALS->named_markers[ent_idx]; update_markertime(GLOBALS->tims.marker); GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } static void lock_marker_right(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; int ent_idx = GLOBALS->named_marker_lock_idx; int i; int success = 0; if(ent_idx < 0) ent_idx = -1; /* not really necessary */ ent_idx++; if(ent_idx > (WAVE_NUM_NAMED_MARKERS-1)) ent_idx = 0; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nLock to Greater Named Marker"); help_text( " locks the primary marker to a named marker." " If no named marker is currently selected, the first defined one is used," " otherwise the marker selected will be one higher in the alphabet, scrolling" " through to the beginning of the alphabet on wrap." " If no named marker exists, one is dropped down for 'A' and the primary" " marker is locked to it." ); return; } for(i=0;inamed_markers[ent_idx] >= 0) { success = 1; break; } ent_idx++; if(ent_idx > (WAVE_NUM_NAMED_MARKERS-1)) ent_idx = 0; } if(!success) { ent_idx = 0; GLOBALS->named_markers[ent_idx] = GLOBALS->tims.marker; } GLOBALS->named_marker_lock_idx = ent_idx; GLOBALS->tims.marker = GLOBALS->named_markers[ent_idx]; update_markertime(GLOBALS->tims.marker); GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } static void unlock_marker(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nUnlock from Named Marker"); help_text( " unlocks the primary marker from the currently selected named marker." ); return; } GLOBALS->named_marker_lock_idx = -1; GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } /* toggles for time dimension conversion */ #ifdef WAVE_USE_MLIST_T void menu_scale_to_td_x(GtkWidget *widget, gpointer data) { (void)widget; (void)data; #else void menu_scale_to_td_x(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; #endif if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nScale To Time Dimension: None"); help_text( " turns off time dimension conversion." ); } else { #ifdef WAVE_USE_MLIST_T if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) #endif { GLOBALS->scale_to_time_dimension = 0; set_scale_to_time_dimension_toggles(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } } #ifdef WAVE_USE_MLIST_T void menu_scale_to_td_s(GtkWidget *widget, gpointer data) { (void)widget; (void)data; #else void menu_scale_to_td_s(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; #endif if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nScale To Time Dimension: sec"); help_text( " changes the time dimension conversion value to seconds." ); } else { #ifdef WAVE_USE_MLIST_T if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) #endif { GLOBALS->scale_to_time_dimension = 's'; set_scale_to_time_dimension_toggles(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } } #ifdef WAVE_USE_MLIST_T void menu_scale_to_td_m(GtkWidget *widget, gpointer data) { (void)widget; (void)data; #else void menu_scale_to_td_m(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; #endif if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nScale To Time Dimension: ms"); help_text( " changes the time dimension conversion value to milliseconds." ); } else { #ifdef WAVE_USE_MLIST_T if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) #endif { GLOBALS->scale_to_time_dimension = 'm'; set_scale_to_time_dimension_toggles(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } } #ifdef WAVE_USE_MLIST_T void menu_scale_to_td_u(GtkWidget *widget, gpointer data) { (void)widget; (void)data; #else void menu_scale_to_td_u(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; #endif if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nScale To Time Dimension: us"); help_text( " changes the time dimension conversion value to microseconds." ); } else { #ifdef WAVE_USE_MLIST_T if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) #endif { GLOBALS->scale_to_time_dimension = 'u'; set_scale_to_time_dimension_toggles(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } } #ifdef WAVE_USE_MLIST_T void menu_scale_to_td_n(GtkWidget *widget, gpointer data) { (void)widget; (void)data; #else void menu_scale_to_td_n(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; #endif if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nScale To Time Dimension: ns"); help_text( " changes the time dimension conversion value to nanoseconds." ); } else { #ifdef WAVE_USE_MLIST_T if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) #endif { GLOBALS->scale_to_time_dimension = 'n'; set_scale_to_time_dimension_toggles(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } } #ifdef WAVE_USE_MLIST_T void menu_scale_to_td_p(GtkWidget *widget, gpointer data) { (void)widget; (void)data; #else void menu_scale_to_td_p(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; #endif if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nScale To Time Dimension: ps"); help_text( " changes the time dimension conversion value to picoseconds." ); } else { #ifdef WAVE_USE_MLIST_T if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) #endif { GLOBALS->scale_to_time_dimension = 'p'; set_scale_to_time_dimension_toggles(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } } #ifdef WAVE_USE_MLIST_T void menu_scale_to_td_f(GtkWidget *widget, gpointer data) { (void)widget; (void)data; #else void menu_scale_to_td_f(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; #endif if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nScale To Time Dimension: fs"); help_text( " changes the time dimension conversion value to femtoseconds." ); } else { #ifdef WAVE_USE_MLIST_T if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) #endif { GLOBALS->scale_to_time_dimension = 'f'; set_scale_to_time_dimension_toggles(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } } /********** transaction procsel filter install ********/ void menu_dataformat_xlate_ttrans_1(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nTransaction Filter Process"); help_text( " will enable transaction filtering on marked traces using a filter process. A requester will appear to get the filter filename." ); return; } ttrans_searchbox("Select Transaction Filter Process"); } void menu_dataformat_xlate_ttrans_0(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nTransaction Filter Process Disable"); help_text( " will remove transaction filtering." ); return; } install_ttrans_filter(0); /* disable, 0 is always NULL */ } /********** procsel filter install ********/ void menu_dataformat_xlate_proc_1(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nTranslate Filter Process"); help_text( " will enable translation on marked traces using a filter process. A requester will appear to get the filter filename." ); return; } ptrans_searchbox("Select Signal Filter Process"); } void menu_dataformat_xlate_proc_0(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nTranslate Filter Process Disable"); help_text( " will remove translation filtering used to reconstruct" " enums for marked traces." ); return; } install_proc_filter(0); /* disable, 0 is always NULL */ } /********** filesel filter install ********/ void menu_dataformat_xlate_file_1(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nTranslate Filter File"); help_text( " will enable translation on marked traces using a filter file. A requester will appear to get the filter filename." ); return; } trans_searchbox("Select Signal Filter"); } void menu_dataformat_xlate_file_0(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nTranslate Filter File Disable"); help_text( " will remove translation filtering used to reconstruct" " enums for marked traces." ); return; } install_file_filter(0); /* disable, 0 is always NULL */ } /******************************************************************/ void menu_write_lxt_file_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; int rc; if(!GLOBALS->filesel_ok) { return; } if(GLOBALS->lock_menu_c_1 == 1) return; /* avoid recursion */ GLOBALS->lock_menu_c_1 = 1; status_text("Saving LXT...\n"); gtkwave_main_iteration(); /* make requester disappear requester */ rc = save_nodes_to_export(*GLOBALS->fileselbox_text, WAVE_EXPORT_LXT); GLOBALS->lock_menu_c_1 = 0; switch(rc) { case VCDSAV_EMPTY: status_text("No traces onscreen to save!\n"); break; case VCDSAV_FILE_ERROR: status_text("Problem writing LXT: "); status_text(strerror(errno)); break; case VCDSAV_OK: status_text("LXT written successfully.\n"); default: break; } } void menu_write_lxt_file(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nWrite LXT File As"); help_text( " will open a file requester that will ask for the name" " of an LXT dumpfile. The contents of the dumpfile" " generated will be the vcd representation of the traces onscreen" " that can be seen by manipulating the signal and wavewindow scrollbars." " The data saved corresponds to the trace information needed" " to allow viewing when used in tandem with the corresponding GTKWave save file." ); return; } if(GLOBALS->traces.first) { if((GLOBALS->is_ghw)&&(0)) { status_text("LXT export not supported for GHW.\n"); } else { fileselbox("Write LXT File As",&GLOBALS->filesel_lxt_writesave,GTK_SIGNAL_FUNC(menu_write_lxt_file_cleanup), GTK_SIGNAL_FUNC(NULL),"*.lxt", 1); } } else { status_text("No traces onscreen to save!\n"); } } /******************************************************************/ void menu_write_vcd_file_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; int rc; if(!GLOBALS->filesel_ok) { return; } if(GLOBALS->lock_menu_c_2 == 1) return; /* avoid recursion */ GLOBALS->lock_menu_c_2 = 1; status_text("Saving VCD...\n"); gtkwave_main_iteration(); /* make requester disappear requester */ rc = save_nodes_to_export(*GLOBALS->fileselbox_text, WAVE_EXPORT_VCD); GLOBALS->lock_menu_c_2 = 0; switch(rc) { case VCDSAV_EMPTY: status_text("No traces onscreen to save!\n"); break; case VCDSAV_FILE_ERROR: status_text("Problem writing VCD: "); status_text(strerror(errno)); break; case VCDSAV_OK: status_text("VCD written successfully.\n"); default: break; } } void menu_write_vcd_file(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nWrite VCD File As"); help_text( " will open a file requester that will ask for the name" " of a VCD dumpfile. The contents of the dumpfile" " generated will be the vcd representation of the traces onscreen" " that can be seen by manipulating the signal and wavewindow scrollbars." " The data saved corresponds to the trace information needed" " to allow viewing when used in tandem with the corresponding GTKWave save file." ); return; } if(GLOBALS->traces.first) { fileselbox("Write VCD File As",&GLOBALS->filesel_vcd_writesave,GTK_SIGNAL_FUNC(menu_write_vcd_file_cleanup), GTK_SIGNAL_FUNC(NULL),"*.vcd", 1); } else { status_text("No traces onscreen to save!\n"); } } /******************************************************************/ void menu_write_tim_file_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; int rc; if(!GLOBALS->filesel_ok) { return; } if(GLOBALS->lock_menu_c_2 == 1) return; /* avoid recursion */ GLOBALS->lock_menu_c_2 = 1; status_text("Saving TIM...\n"); gtkwave_main_iteration(); /* make requester disappear requester */ rc = save_nodes_to_export(*GLOBALS->fileselbox_text, WAVE_EXPORT_TIM); GLOBALS->lock_menu_c_2 = 0; switch(rc) { case VCDSAV_EMPTY: status_text("No traces onscreen to save!\n"); break; case VCDSAV_FILE_ERROR: status_text("Problem writing TIM: "); status_text(strerror(errno)); break; case VCDSAV_OK: status_text("TIM written successfully.\n"); default: break; } } void menu_write_tim_file(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nWrite TIM File As"); help_text( " will open a file requester that will ask for the name" " of a TimingAnalyzer .tim file. The contents of the file" " generated will be the representation of the traces onscreen." " If the baseline and primary marker are set, the time range" " written to the file will be between the two markers, otherwise" " it will be the entire time range." ); return; } if(GLOBALS->traces.first) { fileselbox("Write TIM File As",&GLOBALS->filesel_tim_writesave,GTK_SIGNAL_FUNC(menu_write_tim_file_cleanup), GTK_SIGNAL_FUNC(NULL),"*.tim", 1); } else { status_text("No traces onscreen to save!\n"); } } /******************************************************************/ void menu_unwarp_traces_all(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; Trptr t; int found=0; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nUnwarp All"); help_text( " unconditionally removes all offsets on all traces." ); return; } t=GLOBALS->traces.first; while(t) { if(t->shift) { t->shift=LLDescriptor(0); found++; } t=t->t_next; } if(found) { GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } void menu_unwarp_traces(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; Trptr t; int found=0; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nUnwarp Marked"); help_text( " removes all offsets on all highlighted traces." ); return; } t=GLOBALS->traces.first; while(t) { if(t->flags&TR_HIGHLIGHT) { t->shift=LLDescriptor(0); t->flags&=(~TR_HIGHLIGHT); found++; } t=t->t_next; } if(found) { GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } void warp_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; if(GLOBALS->entrybox_text) { TimeType gt, delta; Trptr t; gt=unformat_time(GLOBALS->entrybox_text, GLOBALS->time_dimension); free_2(GLOBALS->entrybox_text); GLOBALS->entrybox_text=NULL; if(gt<0) { delta=GLOBALS->tims.first-GLOBALS->tims.last; if(gt0) { delta=GLOBALS->tims.last-GLOBALS->tims.first; if(gt>delta) gt=delta; } t=GLOBALS->traces.first; while(t) { if(t->flags&TR_HIGHLIGHT) { if(HasWave(t)) /* though note if a user specifies comment warping in a .sav file we will honor it.. */ { t->shift=gt; } else { t->shift=LLDescriptor(0); } t->flags&=(~TR_HIGHLIGHT); } t=t->t_next; } } GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } void menu_warp_traces(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; char gt[32]; Trptr t; int found=0; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nWarp Marked"); help_text( " offsets all highlighted traces by the amount of" " time entered in the requester. (Positive values" " will shift traces to the right.)" " Attempting to shift greater than the absolute value of total simulation" " time will cap the shift magnitude at the length of simulation." " Note that you can also warp traces dynamically by holding" " down CTRL and dragging a group of highlighted traces to" " the left or right with the left mouse button pressed. When you release" " the mouse button, if CTRL is pressed, the drag warp commits, else" " it reverts to its pre-drag condition." ); return; } t=GLOBALS->traces.first; while(t) { if(t->flags&TR_HIGHLIGHT) { found++; break; } t=t->t_next; } if(found) { reformat_time(gt, LLDescriptor(0), GLOBALS->time_dimension); entrybox("Warp Traces",200,gt,NULL,20,GTK_SIGNAL_FUNC(warp_cleanup)); } } void menu_altwheel(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nAlternate Wheel Mode"); help_text( " makes the mouse wheel act how TomB expects it to." " Wheel alone will pan part of a page (so you can still" " see where you were). Ctrl+Wheel will zoom around the" " cursor (not where the marker is), and Alt+Wheel will" " edge left or right on the selected signal."); } else { #ifndef WAVE_USE_MLIST_T if(!GLOBALS->alt_wheel_mode) { status_text("Alternate Wheel Mode On.\n"); GLOBALS->alt_wheel_mode=1; } else { status_text("Alternate Wheel Mode Off.\n"); GLOBALS->alt_wheel_mode=0; } #else GLOBALS->alt_wheel_mode = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_HSWM])); if(GLOBALS->alt_wheel_mode) { status_text("Alternate Wheel Mode On.\n"); } else { status_text("Alternate Wheel Mode Off.\n"); } #endif } #ifndef WAVE_USE_MLIST_T GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_HSWM].path))->active=(GLOBALS->alt_wheel_mode)?TRUE:FALSE; #endif } void wave_scrolling_on(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nWave Scrolling"); help_text( " allows movement of the primary marker beyond screen boundaries" " which causes the wave window to scroll when enabled." " When disabled, it" " disallows movement of the primary marker beyond screen boundaries." ); } else { #ifndef WAVE_USE_MLIST_T if(!GLOBALS->wave_scrolling) { status_text("Wave Scrolling On.\n"); GLOBALS->wave_scrolling=1; } else { status_text("Wave Scrolling Off.\n"); GLOBALS->wave_scrolling=0; } #else GLOBALS->wave_scrolling = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_MWSON])); if(GLOBALS->wave_scrolling) { status_text("Wave Scrolling On.\n"); } else { status_text("Wave Scrolling Off.\n"); } #endif } #ifndef WAVE_USE_MLIST_T GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_MWSON].path))->active=(GLOBALS->wave_scrolling)?TRUE:FALSE; #endif } /**/ void menu_keep_xz_colors(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nKeep xz Colors"); help_text( " when enabled" " keeps the old non 0/1 signal value colors when a user specifies a color override" " by using Edit/Color Format." ); } else { #ifndef WAVE_USE_MLIST_T if(!GLOBALS->keep_xz_colors) { GLOBALS->keep_xz_colors=1; } else { GLOBALS->keep_xz_colors=0; } #else GLOBALS->keep_xz_colors = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_KEEPXZ])); #endif } #ifndef WAVE_USE_MLIST_T GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_KEEPXZ].path))->active=(GLOBALS->keep_xz_colors)?TRUE:FALSE; #endif GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } /**/ void menu_autocoalesce(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nAutocoalesce"); help_text( " when enabled" " allows the wave viewer to reconstruct split vectors." " Split vectors will be indicated by a \"[]\"" " prefix in the search requesters." ); } else { #ifndef WAVE_USE_MLIST_T if(!GLOBALS->autocoalesce) { status_text("Autocoalesce On.\n"); GLOBALS->autocoalesce=1; } else { status_text("Autocoalesce Off.\n"); GLOBALS->autocoalesce=0; } #else GLOBALS->autocoalesce = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_ACOL])); if(GLOBALS->autocoalesce) { status_text("Autocoalesce On.\n"); } else { status_text("Autocoalesce Off.\n"); } #endif } #ifndef WAVE_USE_MLIST_T GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_ACOL].path))->active=(GLOBALS->autocoalesce)?TRUE:FALSE; #endif } void menu_autocoalesce_reversal(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nAutocoalesce Reversal"); help_text( " causes split vectors to be reconstructed in reverse order (only if autocoalesce is also active). This is necessary with some simulators." " Split vectors will be indicated by a \"[]\"" " prefix in the search requesters." ); } else { #ifndef WAVE_USE_MLIST_T if(!GLOBALS->autocoalesce_reversal) { status_text("Autocoalesce Rvs On.\n"); GLOBALS->autocoalesce_reversal=1; } else { status_text("Autocoalesce Rvs Off.\n"); GLOBALS->autocoalesce_reversal=0; } #else GLOBALS->autocoalesce_reversal = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_ACOLR])); if(GLOBALS->autocoalesce_reversal) { status_text("Autocoalesce Rvs On.\n"); } else { status_text("Autocoalesce Rvs Off.\n"); } #endif } #ifndef WAVE_USE_MLIST_T GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_ACOLR].path))->active=(GLOBALS->autocoalesce_reversal)?TRUE:FALSE; #endif } void menu_autoname_bundles_on(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nAutoname Bundles"); help_text( " when enabled" " modifies the bundle up/down operations in the hierarchy" " and tree searches such that a NULL bundle name is" " implicitly created which informs GTKWave to create bundle" " and signal names based on the position in the hierarchy." " When disabled, it" " modifies the bundle up/down operations in the hierarchy" " and tree searches such that a NULL bundle name is" " not implicitly created. This informs GTKWave to create bundle" " and signal names based on the position in the hierarchy" " only if the user enters a zero-length bundle name. This" " behavior is the default." ); } else { #ifndef WAVE_USE_MLIST_T if(!GLOBALS->autoname_bundles) { status_text("Autoname On.\n"); GLOBALS->autoname_bundles=1; } else { status_text("Autoname Off.\n"); GLOBALS->autoname_bundles=0; } #else GLOBALS->autoname_bundles = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_ABON])); if(GLOBALS->autoname_bundles) { status_text("Autoname On.\n"); } else { status_text("Autoname Off.\n"); } #endif } #ifndef WAVE_USE_MLIST_T GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_ABON].path))->active=(GLOBALS->autoname_bundles)?TRUE:FALSE; #endif } void menu_hgrouping(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nSearch Hierarchy Grouping"); help_text( " when enabled ensures that new members added to the ``Tree Search'' and" " ``Hierarchy Search'' widgets are added alphanumerically: first hierarchy names as a group followed by signal names as a group." " This is the default and is recommended. When disabled, hierarchy names and signal names are interleaved together in" " strict alphanumerical ordering." " Note that due to the caching mechanism in ``Tree Search'', dynamically changing this flag when the widget is active" " may not produce immediately obvious results. Closing the widget then opening it up again will ensure that it follows the" " behavior of this flag." ); } else { #ifndef WAVE_USE_MLIST_T if(!GLOBALS->hier_grouping) { status_text("Hier Grouping On.\n"); GLOBALS->hier_grouping=1; } else { status_text("Hier Grouping Off.\n"); GLOBALS->hier_grouping=0; } #else GLOBALS->hier_grouping = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_HTGP])); if(GLOBALS->hier_grouping) { status_text("Hier Grouping On.\n"); } else { status_text("Hier Grouping Off.\n"); } #endif } #ifndef WAVE_USE_MLIST_T GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_HTGP].path))->active=(GLOBALS->hier_grouping)?TRUE:FALSE; #endif } void set_hier_cleanup(GtkWidget *widget, gpointer data, int level) { (void)widget; (void)data; char update_string[128]; Trptr t; int i; GLOBALS->hier_max_level=level; if(GLOBALS->hier_max_level<0) GLOBALS->hier_max_level=0; for(i=0;i<2;i++) { if(i==0) t=GLOBALS->traces.first; else t=GLOBALS->traces.buffer; while(t) { if(!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { if (HasAlias(t)) { t->name = t->name_full; if(GLOBALS->hier_max_level) t->name = hier_extract(t->name, GLOBALS->hier_max_level); } else if(t->vector==TRUE) { t->name = t->n.vec->bvname; if(GLOBALS->hier_max_level) t->name = hier_extract(t->name, GLOBALS->hier_max_level); } else { if(!GLOBALS->hier_max_level) { int flagged = HIER_DEPACK_ALLOC; if(t->name&&t->is_depacked) { free_2(t->name); } t->name = hier_decompress_flagged(t->n.nd->nname, &flagged); t->is_depacked = (flagged != 0); } else { int flagged = HIER_DEPACK_ALLOC; char *tbuff; if(t->name&&t->is_depacked) { free_2(t->name); } tbuff = hier_decompress_flagged(t->n.nd->nname, &flagged); t->is_depacked = (flagged != 0); if(!flagged) { t->name = hier_extract(t->n.nd->nname, GLOBALS->hier_max_level); } else { t->name = strdup_2(hier_extract(tbuff, GLOBALS->hier_max_level)); free_2(tbuff); } } } } t=t->t_next; } } GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); sprintf(update_string, "Trace Hier Max Depth is now: %d\n", GLOBALS->hier_max_level); status_text(update_string); } void max_hier_cleanup(GtkWidget *widget, gpointer data) { if(GLOBALS->entrybox_text) { int i; i = atoi_64(GLOBALS->entrybox_text); set_hier_cleanup(widget, data, i); GLOBALS->hier_max_level_shadow = GLOBALS->hier_max_level; /* used for the toggle function */ free_2(GLOBALS->entrybox_text); GLOBALS->entrybox_text=NULL; } } void menu_set_max_hier(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; char za[32]; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nSet Max Hier"); help_text( " sets the maximum hierarchy depth (counting from the right" " with bit numbers or ranges ignored) that is displayable" " for trace names. Zero indicates that no truncation will" " be performed (default). Note that any aliased signals" " (prefix of a \"+\") will not have truncated names." ); return; } sprintf(za,"%d",GLOBALS->hier_max_level); entrybox("Max Hier Depth",200,za,NULL,20,GTK_SIGNAL_FUNC(max_hier_cleanup)); } void menu_toggle_hier(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)callback_action; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nToggle Trace Hier"); help_text( " toggles the maximum hierarchy depth from zero to whatever was previously set." ); return; } if (GLOBALS->hier_max_level) set_hier_cleanup(widget, null_data, 0); else set_hier_cleanup(widget, null_data, GLOBALS->hier_max_level_shadow); /* instead of just '1' */ } /**/ void menu_use_roundcaps(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nDraw Roundcapped Vectors"); help_text( " draws vector transitions that have sloping edges when enabled." " Draws vector transitions that have sharp edges when disabled;" " this is the default." ); } else { #ifndef WAVE_USE_MLIST_T if(!GLOBALS->use_roundcaps) { status_text("Using roundcaps.\n"); GLOBALS->use_roundcaps=1; } else { status_text("Using flatcaps.\n"); GLOBALS->use_roundcaps=0; } MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); #else GLOBALS->use_roundcaps = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VDRV])); if(GLOBALS->use_roundcaps) { status_text("Using roundcaps.\n"); } else { status_text("Using flatcaps.\n"); } if(GLOBALS->signalarea && GLOBALS->wavearea) { MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } #endif } #ifndef WAVE_USE_MLIST_T GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VDRV].path))->active=(GLOBALS->use_roundcaps)?TRUE:FALSE; #endif } /**/ void menu_lxt_clk_compress(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nLXT Clock Compress to Z"); help_text( " reduces memory usage when active as clocks compressed in LXT format are" " kept at Z in order to save memory. Traces imported with this are permanently" " kept at Z." ); } else { #ifndef WAVE_USE_MLIST_T if(GLOBALS->lxt_clock_compress_to_z) { GLOBALS->lxt_clock_compress_to_z=0; status_text("LXT CC2Z Off.\n"); } else { GLOBALS->lxt_clock_compress_to_z=1; status_text("LXT CC2Z On.\n"); } #else GLOBALS->lxt_clock_compress_to_z = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_LXTCC2Z])); if(!GLOBALS->lxt_clock_compress_to_z) { status_text("LXT CC2Z Off.\n"); } else { status_text("LXT CC2Z On.\n"); } #endif } #ifndef WAVE_USE_MLIST_T if(GLOBALS->loaded_file_type == LXT_FILE) { GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_LXTCC2Z].path))->active=(GLOBALS->lxt_clock_compress_to_z)?TRUE:FALSE; } #endif } /**/ void menu_use_full_precision(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nFull Precision"); help_text( " does not round time values when the number of ticks per pixel onscreen is greater than" " 10 when active. The default is that this feature is disabled." ); } else { #ifndef WAVE_USE_MLIST_T if(GLOBALS->use_full_precision) { GLOBALS->use_full_precision=0; status_text("Full Prec Off.\n"); } else { GLOBALS->use_full_precision=1; status_text("Full Prec On.\n"); } #else GLOBALS->use_full_precision = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VFTP])); if(!GLOBALS->use_full_precision) { status_text("Full Prec Off.\n"); } else { status_text("Full Prec On.\n"); } #endif calczoom(GLOBALS->tims.zoom); fix_wavehadj(); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "changed"); /* force zoom update */ gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "value_changed"); /* force zoom update */ update_maxmarker_labels(); } #ifndef WAVE_USE_MLIST_T GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VFTP].path))->active=(GLOBALS->use_full_precision)?TRUE:FALSE; #endif } /**/ void menu_remove_marked(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nRemove Pattern Marks"); help_text( " removes any vertical traces on the display caused by the Mark" " feature in pattern search and reverts to the normal format." ); } else { int i; WAVE_STRACE_ITERATOR(i) { GLOBALS->strace_ctx = &GLOBALS->strace_windows[GLOBALS->strace_current_window = i]; if(GLOBALS->strace_ctx->shadow_straces) { delete_strace_context(); } strace_maketimetrace(0); } MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } /**/ void menu_use_color(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nUse Color"); help_text( " draws signal names and trace data in color. This is normal operation." ); } else { force_normal_gcs(); MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } /**/ void menu_use_bw(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nUse Black and White"); help_text( " draws signal names and trace data in black and white. This is intended for use in" " black and white screen dumps." ); } else { force_screengrab_gcs(); MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } /**/ void menu_zoom10_snap(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nZoom Pow10 Snap"); help_text( " snaps time values to a power of ten boundary when active. Fractional zooms are" " internally stored, but what is actually displayed will be rounded up/down to the" " nearest power of 10. This only works when the ticks per frame is greater than 100" " units." ); } else { #ifndef WAVE_USE_MLIST_T if(GLOBALS->zoom_pow10_snap) { GLOBALS->zoom_pow10_snap=0; status_text("Pow10 Snap Off.\n"); } else { GLOBALS->zoom_pow10_snap=1; status_text("Pow10 Snap On.\n"); } #else GLOBALS->zoom_pow10_snap = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VZPS])); if(!GLOBALS->zoom_pow10_snap) { status_text("Pow10 Snap Off.\n"); } else { status_text("Pow10 Snap On.\n"); } #endif if(GLOBALS->wave_hslider) { calczoom(GLOBALS->tims.zoom); fix_wavehadj(); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "changed"); /* force zoom update */ gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "value_changed"); /* force zoom update */ } } #ifndef WAVE_USE_MLIST_T GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VZPS].path))->active=(GLOBALS->zoom_pow10_snap)?TRUE:FALSE; #endif } /**/ void menu_zoom_dynf(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nPartial VCD Dynamic Zoom Full"); help_text( " causes the screen to be in full zoom mode while a VCD file is loading" " incrementally." ); } else { #ifndef WAVE_USE_MLIST_T if(GLOBALS->zoom_dyn) { GLOBALS->zoom_dyn=0; status_text("Dynamic Zoom Full Off.\n"); } else { GLOBALS->zoom_dyn=1; status_text("Dynamic Zoom Full On.\n"); } #else GLOBALS->zoom_dyn = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VZDYN])); if(!GLOBALS->zoom_dyn) { status_text("Dynamic Zoom Full Off.\n"); } else { status_text("Dynamic Zoom Full On.\n"); } #endif } #ifndef WAVE_USE_MLIST_T GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VZDYN].path))->active=(GLOBALS->zoom_dyn)?TRUE:FALSE; #endif } /**/ void menu_zoom_dyne(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nPartial VCD Dynamic Zoom To End"); help_text( " causes the screen to zoom to the end while a VCD file is loading" " incrementally." ); } else { #ifndef WAVE_USE_MLIST_T if(GLOBALS->zoom_dyne) { GLOBALS->zoom_dyne=0; status_text("Dynamic Zoom To End Off.\n"); } else { GLOBALS->zoom_dyne=1; status_text("Dynamic Zoom To End On.\n"); } #else GLOBALS->zoom_dyne = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VZDYNE])); if(!GLOBALS->zoom_dyne) { status_text("Dynamic Zoom To End Off.\n"); } else { status_text("Dynamic Zoom To End On.\n"); } #endif } #ifndef WAVE_USE_MLIST_T GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VZDYNE].path))->active=(GLOBALS->zoom_dyne)?TRUE:FALSE; #endif } /**/ void menu_left_justify(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nLeft Justify Signals"); help_text( " draws signal names flushed to the left border of the signal window." ); } else { status_text("Left Justification.\n"); GLOBALS->left_justify_sigs=~0; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); } } /**/ void menu_right_justify(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nRight Justify Signals"); help_text( " draws signal names flushed to the right (\"equals\") side of the signal window." ); } else { status_text("Right Justification.\n"); GLOBALS->left_justify_sigs=0; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); } } /**/ void menu_enable_constant_marker_update(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nConstant Marker Update"); help_text( " when enabled," " allows GTKWave to dynamically show the changing values of the" " traces under the primary marker while it is being dragged" " across the screen. This works best with dynamic resizing disabled." " When disabled, it" " restricts GTKWave to only update the trace values when the" " left mouse button is initially pressed then again when it is released." " This is the default behavior." ); } else { #ifndef WAVE_USE_MLIST_T if(!GLOBALS->constant_marker_update) { status_text("Constant marker update enabled.\n"); GLOBALS->constant_marker_update=~0; } else { status_text("Constant marker update disabled.\n"); GLOBALS->constant_marker_update=0; } #else GLOBALS->constant_marker_update = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VCMU])); if(GLOBALS->constant_marker_update) { status_text("Constant marker update enabled.\n"); } else { status_text("Constant marker update disabled.\n"); } #endif } #ifndef WAVE_USE_MLIST_T GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VCMU].path))->active=(GLOBALS->constant_marker_update)?TRUE:FALSE; #endif } /**/ void menu_enable_standard_trace_select(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nStandard Trace Select"); help_text( " when enabled," " keeps the currently selected traces from deselecting on mouse button press." " This allows drag and drop to function more smoothly. As this behavior is not" " how GTK normally functions, it is by default disabled." ); } else { #ifndef WAVE_USE_MLIST_T if(!GLOBALS->use_standard_trace_select) { status_text("Standard Trace Select enabled.\n"); GLOBALS->use_standard_trace_select=~0; } else { status_text("Standard Trace Select disabled.\n"); GLOBALS->use_standard_trace_select=0; } #else GLOBALS->use_standard_trace_select = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_ESTS])); if(GLOBALS->use_standard_trace_select) { status_text("Standard Trace Select enabled.\n"); } else { status_text("Standard Trace Select disabled.\n"); } #endif } #ifndef WAVE_USE_MLIST_T GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_ESTS].path))->active=(GLOBALS->use_standard_trace_select)?TRUE:FALSE; #endif } /**/ void menu_enable_dynamic_resize(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; int i; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nDynamic Resize"); help_text( " allows GTKWave to dynamically resize the signal" " window for you when toggled active. This can be helpful during numerous" " signal additions and/or deletions. This is the default" " behavior." ); } else { #ifndef WAVE_USE_MLIST_T if(!GLOBALS->do_resize_signals) { status_text("Resizing enabled.\n"); GLOBALS->do_resize_signals=~0; } else { status_text("Resizing disabled.\n"); GLOBALS->do_resize_signals=0; } for(i=0;i<2;i++) { GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } #else GLOBALS->do_resize_signals = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VDR])); if(GLOBALS->do_resize_signals) { status_text("Resizing enabled.\n"); } else { status_text("Resizing disabled.\n"); } if(GLOBALS->signalarea && GLOBALS->wavearea) { for(i=0;i<2;i++) { GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } #endif } #ifndef WAVE_USE_MLIST_T GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VDR].path))->active=(GLOBALS->do_resize_signals)?TRUE:FALSE; #endif } /**/ void menu_toggle_delta_or_frequency(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nToggle Delta-Frequency"); help_text( " allows you to switch between the delta time and" " frequency display in the upper right corner" " of the main window when measuring distances between markers. Default behavior is that the" " delta time is displayed." ); } else { GLOBALS->use_frequency_delta=(GLOBALS->use_frequency_delta)?0:1; update_maxmarker_labels(); } } /**/ void menu_toggle_max_or_marker(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nToggle Max-Marker"); help_text( " allows you to switch between the maximum time and" " marker time for display in the upper right corner" " of the main window. Default behavior is that the" " maximum time is displayed." ); } else { GLOBALS->use_maxtime_display=(GLOBALS->use_maxtime_display)?0:1; update_maxmarker_labels(); } } /**/ #ifdef MAC_INTEGRATION void menu_help_manual(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nWave User's Guide"); help_text( " opens the PDF file of the GTKWave User's Guide for viewing." ); return; } else { const gchar *bundle_id = gtkosx_application_get_bundle_id(); if(bundle_id) { const gchar *rpath = gtkosx_application_get_resource_path(); const char *suf = "/doc/gtkwave.pdf"; char *pdfpath = NULL; FILE *handle; if(rpath) { pdfpath = (char *)alloca(strlen(rpath) + strlen(suf) + 1); strcpy(pdfpath, rpath); strcat(pdfpath, suf); } if(!pdfpath || !(handle=fopen(pdfpath,"rb"))) { } else { fclose(handle); gtk_open_external_file(pdfpath); return; } } simplereqbox("Wave User's Guide",400,"Could not open PDF!","OK", NULL, NULL, 1); } } #endif /**/ void menu_help(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nWave Help"); help_text( " is already active. It's this window." ); return; } helpbox("Wave Help",480,"Select any main window menu item"); } /**/ void menu_version(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nWave Version"); help_text( " merely brings up a requester which indicates the current" " version of this program." ); return; } simplereqbox("Wave Version",480,WAVE_VERSION_INFO,"OK", NULL, NULL, 0); } /**/ void menu_quit_callback(GtkWidget *widget, gpointer data) { (void)widget; char sstr[32]; if(data) { #ifdef __CYGWIN__ kill_stems_browser(); #endif g_print("Exiting.\n"); sprintf(sstr, "%d", GLOBALS->this_context_page); gtkwavetcl_setvar(WAVE_TCLCB_QUIT_PROGRAM, sstr, WAVE_TCLCB_QUIT_PROGRAM_FLAGS); gtk_exit(0); } } void menu_quit(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nQuit"); help_text( " closes GTKWave and exits immediately." ); return; } if(!GLOBALS->enable_fast_exit) { simplereqbox("Quit Program",300,"Do you really want to quit?","Yes", "No", GTK_SIGNAL_FUNC(menu_quit_callback), 1); } else { menu_quit_callback(NULL, &GLOBALS->enable_fast_exit); /* nonzero dummy arg */ } } /**/ void menu_quit_close_callback(GtkWidget *widget, gpointer dummy_data) { (void)widget; (void)dummy_data; unsigned int i, j=0; unsigned int this_page = GLOBALS->this_context_page; unsigned np = GLOBALS->num_notebook_pages; unsigned int new_page = (this_page != np-1) ? this_page : (this_page-1); GtkWidget *n = GLOBALS->notebook; struct Global *old_g = NULL, *saved_g; char sstr[32]; gboolean is_mf = (GLOBALS->loaded_file_type == MISSING_FILE); sprintf(sstr, "%d", this_page); gtkwavetcl_setvar(WAVE_TCLCB_CLOSE_TAB_NUMBER, sstr, WAVE_TCLCB_CLOSE_TAB_NUMBER_FLAGS); kill_stems_browser_single(GLOBALS); dead_context_sweep(); for(i=0;icontexts)[j] = (*GLOBALS->contexts)[i]; (*GLOBALS->contexts)[j]->this_context_page = j; (*GLOBALS->contexts)[j]->num_notebook_pages--; j++; } else { old_g = (*GLOBALS->contexts)[j]; } } (*GLOBALS->contexts)[j] = old_g; gtk_notebook_set_show_tabs(GTK_NOTEBOOK(n), (np>2)); gtk_notebook_set_show_border(GTK_NOTEBOOK(n), (np>2)); gtk_notebook_remove_page(GTK_NOTEBOOK(n), this_page); gtk_notebook_set_current_page(GTK_NOTEBOOK(n), new_page); set_GLOBALS((*GLOBALS->contexts)[new_page]); saved_g = GLOBALS; gtkwave_main_iteration(); set_GLOBALS(old_g); if(!is_mf) { free_and_destroy_page_context(); } set_GLOBALS(saved_g); /* need to do this if 2 pages -> 1 */ reformat_time(sstr, GLOBALS->tims.first, GLOBALS->time_dimension); gtk_entry_set_text(GTK_ENTRY(GLOBALS->from_entry),sstr); reformat_time(sstr, GLOBALS->tims.last, GLOBALS->time_dimension); gtk_entry_set_text(GTK_ENTRY(GLOBALS->to_entry),sstr); update_maxmarker_labels(); update_basetime(GLOBALS->tims.baseline); gtk_window_set_title(GTK_WINDOW(GLOBALS->mainwindow), GLOBALS->winname); MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } void menu_quit_close(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nClose"); help_text( " immediately closes the current tab if multiple tabs exist or" " exits GTKWave after an additional confirmation" " requester is given the OK to quit." ); return; } if((GLOBALS->num_notebook_pages < 2) && (!GLOBALS->enable_fast_exit)) { simplereqbox("Quit Program",300,"Do you really want to quit?","Yes", "No", GTK_SIGNAL_FUNC(menu_quit_callback), 1); } else { if(GLOBALS->num_notebook_pages < 2) { menu_quit_callback(NULL, &GLOBALS->num_notebook_pages); /* nonzero dummy arg */ } else { menu_quit_close_callback(NULL, NULL); /* dummy arg, not needed to be nonzero */ } } } /**/ void must_sel(void) { status_text("Select one or more traces.\n"); } static void must_sel_nb(void) { status_text("Select one or more nonblank traces.\n"); } static void must_sel_bg(void) { status_text("Select a bundle or group.\n"); } /**/ static void menu_open_group(GtkWidget *widget, gpointer data) { (void)widget; (void)data; Trptr t; unsigned dirty = 0; /* currently only called by toggle menu option, so no help menu text */ if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ t=GLOBALS->traces.first; while(t) { if((t->flags&TR_HIGHLIGHT)&&(IsGroupBegin(t) || IsGroupEnd(t))) { dirty=1; break; } t=t->t_next; } if(dirty) { OpenTrace(t); GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } else { must_sel_bg(); } } static void menu_close_group(GtkWidget *widget, gpointer data) { (void)widget; (void)data; Trptr t; unsigned dirty = 0; /* currently only called by toggle menu option, so no help menu text */ if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ t=GLOBALS->traces.first; while(t) { if((t->flags&TR_HIGHLIGHT)&&(IsGroupBegin(t) || IsGroupEnd(t))) { dirty=1; break; } t=t->t_next; } if(dirty) { CloseTrace(t); GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } else { must_sel_bg(); } } unsigned create_group (char* name, Trptr t_composite) { Trptr t, t_prev, t_begin, t_end; unsigned dirty = 0; if(!name) name = "Group"; /* generate anonymous name */ t=GLOBALS->traces.first; while(t) { if(t->flags&TR_HIGHLIGHT) { dirty=1; break; } t=t->t_next; } if(dirty) { t_prev = t->t_prev; CutBuffer(); if (t_composite) { t_begin = t_composite; t_begin->flags |=TR_GRP_BEGIN; } else { if( (t_begin = (Trptr) calloc_2( 1, sizeof( TraceEnt ))) == NULL ) { fprintf( stderr, "Out of memory, can't add trace.\n"); return(0); } t_begin->flags = (TR_BLANK|TR_GRP_BEGIN); t_begin->name = (char *)malloc_2(1+strlen(name)); strcpy(t_begin->name, name); } GLOBALS->traces.buffer->t_prev = t_begin; t_begin->t_next = GLOBALS->traces.buffer; GLOBALS->traces.buffer = t_begin; GLOBALS->traces.buffercount++; if( (t_end = (Trptr) calloc_2( 1, sizeof( TraceEnt ))) == NULL ) { fprintf( stderr, "Out of memory, can't add trace.\n"); return(0); } t_end->flags = (TR_BLANK|TR_GRP_END); if (t_composite) { /* make the group end trace invisible */ t_end->flags |= TR_COLLAPSED; t_end->name = (char *)malloc_2(1+strlen("group_end")); strcpy(t_end->name, "group_end"); } else { t_end->name = (char *)malloc_2(1+strlen(name)); strcpy(t_end->name, name); } GLOBALS->traces.bufferlast->t_next = t_end; t_end->t_prev = GLOBALS->traces.bufferlast; GLOBALS->traces.bufferlast = t_end; GLOBALS->traces.buffercount++; t_begin->t_match = t_end; t_end->t_match = t_begin; if (t_prev) { t_prev->flags |= TR_HIGHLIGHT; PasteBuffer(); } else { PrependBuffer(); } } return dirty; } static void create_group_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; unsigned dirty = 0; dirty = create_group(GLOBALS->entrybox_text, NULL); if (!dirty) { must_sel_bg(); } else { GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } void menu_create_group(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; Trptr t; unsigned dirty = 0; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nCreate Group"); help_text( " creates a group of traces which may be opened or closed." " It is permitted for groups to be nested." ); return; } t=GLOBALS->traces.first; while(t) { if(t->flags&TR_HIGHLIGHT) { dirty=1; break; } t=t->t_next; } if(dirty) { /* don't mess with sigs when dnd active */ if(GLOBALS->dnd_state) { dnd_error(); return; } entrybox("Create Group",300,"","Enter group name:",128,GTK_SIGNAL_FUNC(create_group_cleanup)); } else { must_sel_bg(); } } static unsigned expand_trace(Trptr t_top) { Trptr t, tmp; int tmpi; unsigned dirty = 0; int color; t = t_top; if(HasWave(t) && !IsGroupBegin(t) && !IsGroupEnd(t)) { FreeCutBuffer(); GLOBALS->traces.buffer=GLOBALS->traces.first; GLOBALS->traces.bufferlast=GLOBALS->traces.last; GLOBALS->traces.buffercount=GLOBALS->traces.total; GLOBALS->traces.first=GLOBALS->traces.last=NULL; GLOBALS->traces.total=0; color = t->t_color; if(t->vector) { bptr bits; int i; Trptr tfix; TimeType otime = t->shift; bits=t->n.vec->bits; if(!(t->flags&TR_REVERSE)) { for(i=0;innbits;i++) { if(bits->nodes[i]->expansion) bits->nodes[i]->expansion->refcnt++; GLOBALS->which_t_color = color; AddNodeTraceReturn(bits->nodes[i],NULL, &tfix); if(bits->attribs) { tfix->shift = otime + bits->attribs[i].shift; } } } else { for(i=(bits->nnbits-1);i>-1;i--) { if(bits->nodes[i]->expansion) bits->nodes[i]->expansion->refcnt++; GLOBALS->which_t_color = color; AddNodeTraceReturn(bits->nodes[i],NULL, &tfix); if(bits->attribs) { tfix->shift = otime + bits->attribs[i].shift; } } } } else { eptr e=ExpandNode(t->n.nd); int i; if(!e) { /* if(t->n.nd->expansion) t->n.nd->expansion->refcnt++; */ /* AddNode(t->n.nd,NULL); */ } else { int dhc_sav = GLOBALS->do_hier_compress; GLOBALS->do_hier_compress = 0; for(i=0;iwidth;i++) { GLOBALS->which_t_color = color; AddNode(e->narray[i], NULL); } GLOBALS->do_hier_compress = dhc_sav; free_2(e->narray); free_2(e); } } tmp=GLOBALS->traces.buffer; GLOBALS->traces.buffer=GLOBALS->traces.first; GLOBALS->traces.first=tmp; tmp=GLOBALS->traces.bufferlast; GLOBALS->traces.bufferlast=GLOBALS->traces.last; GLOBALS->traces.last=tmp; tmpi=GLOBALS->traces.buffercount; GLOBALS->traces.buffercount=GLOBALS->traces.total; GLOBALS->traces.total=tmpi; if (GLOBALS->traces.buffercount > 0) { /* buffer now contains the created signals */ ClearTraces(); if (t_top->t_prev) { t_top->t_prev->flags |= TR_HIGHLIGHT; RemoveTrace(t_top, 0); PasteBuffer(); t_top->t_prev->flags &= ~TR_HIGHLIGHT; } else { RemoveTrace(t_top, 0); PrependBuffer(); } dirty = create_group("unused_2", t_top); } } GLOBALS->which_t_color = 0; return dirty; } void menu_expand(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; Trptr t, t_next; int dirty=0; int j; GtkAdjustment *wadj; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nExpand"); help_text( " decomposes the highlighted signals into their individual bits." " The resulting bits are converted to traces and inserted after the" " last highlighted trace. The original unexpanded traces will" " be placed in the cut buffer." " It will function seemingly randomly" " when used upon real valued single-bit traces." " When used upon multi-bit vectors that contain" " real valued traces, those traces will expand to their normal \"correct\" values," " not individual bits." ); return; } if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ DEBUG(printf("Expand Traces\n")); t=GLOBALS->traces.first; while(t) { if(IsSelected(t) && HasWave(t)) { t->flags |= TR_COLLAPSED; dirty=1; } t=t->t_next; } if(dirty) { ClearTraces(); t=GLOBALS->traces.first; while(t) { t_next = t->t_next; if(HasWave(t) && (t->flags&TR_COLLAPSED)) { if (!IsGroupBegin(t) && !IsGroupEnd(t)) { expand_trace(t); } else { OpenTrace(t); } } t=t_next; } t=GLOBALS->traces.first; if(t) { t->t_grp = NULL; } /* scan-build */ while(t) { if(HasWave(t) && (t->flags&TR_COLLAPSED)) { t->flags &= ~TR_COLLAPSED; t->flags |= TR_HIGHLIGHT; } updateTraceGroup(t); t=t->t_next; } t=GLOBALS->traces.first; while(t) { if (IsSelected(t)) { break; } t=t->t_next; } j = GetTraceNumber(t); wadj=GTK_ADJUSTMENT(GLOBALS->wave_vslider); if (j < wadj->value) { SetTraceScrollbarRowValue(j, 0); } GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } else { must_sel_nb(); } } void menu_toggle_group(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; Trptr t; unsigned dirty_group = 0; unsigned dirty_signal = 0; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nToggle Group"); help_text( " toggles a group opened or closed." ); return; } if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ t=GLOBALS->traces.first; while(t) { if((t->flags&TR_HIGHLIGHT)&&(IsGroupBegin(t) || IsGroupEnd(t))) { dirty_group=1; break; } if((t->flags&TR_HIGHLIGHT)&&HasWave(t)) { dirty_signal=1; break; } t=t->t_next; } if(dirty_group) { if(IsClosed(t)) { menu_open_group(widget, null_data); gtkwavetcl_setvar(WAVE_TCLCB_OPEN_TRACE_GROUP, t->name, WAVE_TCLCB_OPEN_TRACE_GROUP_FLAGS); } else { menu_close_group(widget, null_data); gtkwavetcl_setvar(WAVE_TCLCB_CLOSE_TRACE_GROUP, t->name, WAVE_TCLCB_CLOSE_TRACE_GROUP_FLAGS); } return; } if(dirty_signal) { ClearTraces(); t->flags |= TR_HIGHLIGHT; menu_expand(null_data, 0, widget); gtkwavetcl_setvar(WAVE_TCLCB_OPEN_TRACE_GROUP, t->name, WAVE_TCLCB_OPEN_TRACE_GROUP_FLAGS); return; } must_sel_bg(); } static void rename_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; Trptr t = GLOBALS->trace_to_alias_menu_c_1; if(GLOBALS->entrybox_text) { char *efix; /* code to turn '{' and '}' into '[' and ']' */ if(!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { efix=GLOBALS->entrybox_text; while(*efix) { if(*efix=='{') { *efix='['; } if(*efix=='}') { *efix=']'; } efix++; } } if(t->vector) { if(t->name_full) { free_2(t->name_full); t->name_full = NULL; } if (t->n.vec->bvname) { free_2(t->n.vec->bvname); } t->n.vec->bvname = (char *)malloc_2(1+strlen(GLOBALS->entrybox_text)); strcpy(t->n.vec->bvname, GLOBALS->entrybox_text); t->name = t->n.vec->bvname; if(GLOBALS->hier_max_level) t->name = hier_extract(t->name, GLOBALS->hier_max_level); t->flags&= ~TR_HIGHLIGHT; } GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } static void menu_rename(GtkWidget *widget, gpointer data) { (void)widget; (void)data; Trptr t; /* currently only called by various combine menu options, so no help menu text */ GLOBALS->trace_to_alias_menu_c_1=NULL; /* don't mess with sigs when dnd active */ if(GLOBALS->dnd_state) { dnd_error(); return; } t = GLOBALS->traces.first; while(t) { if(IsSelected(t)&&(t->vector==TRUE)) { GLOBALS->trace_to_alias_menu_c_1 = t; break; } t=t->t_next; } if(GLOBALS->trace_to_alias_menu_c_1) { int was_packed = HIER_DEPACK_ALLOC; char* current = GetFullName(GLOBALS->trace_to_alias_menu_c_1, &was_packed); ClearTraces(); GLOBALS->trace_to_alias_menu_c_1->flags |= TR_HIGHLIGHT; entrybox("Trace Name",300,current,NULL,128,GTK_SIGNAL_FUNC(rename_cleanup)); if(was_packed) { free_2(current); } } else { must_sel(); } } bvptr combine_traces(int direction, Trptr single_trace_only) { Trptr t, tmp; Trptr tfirst = NULL; int tmpi,dirty=0, attrib_reqd=0; nptr bitblast_parent; int bitblast_delta=0; DEBUG(printf("Combine Traces\n")); t=single_trace_only ? single_trace_only : GLOBALS->traces.first; while(t) { if((t->flags&TR_HIGHLIGHT)&&(!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH)))) { if(t->vector) { dirty+=t->n.vec->nbits; } else { if(t->n.nd->extvals) { int msb, lsb, width; msb = t->n.nd->msi; lsb = t->n.nd->lsi; if(msb>lsb) width = msb-lsb+1; else width = lsb-msb+1; dirty += width; } else { dirty++; } } } if(t == single_trace_only) break; t=t->t_next; } if(!dirty) { if(!single_trace_only) must_sel_nb(); return NULL; } if(dirty>BITATTRIBUTES_MAX) { char buf[128]; if(!single_trace_only) { sprintf(buf, "%d bits selected, please use <= %d.\n", dirty, BITATTRIBUTES_MAX); status_text(buf); } return NULL; } else { int i,nodepnt=0; struct Node *n[BITATTRIBUTES_MAX]; struct BitAttributes ba[BITATTRIBUTES_MAX]; struct Bits *b=NULL; bvptr v=NULL; memset(n, 0, sizeof(n)); /* scan-build */ if(!single_trace_only) { FreeCutBuffer(); GLOBALS->traces.buffer=GLOBALS->traces.first; GLOBALS->traces.bufferlast=GLOBALS->traces.last; GLOBALS->traces.buffercount=GLOBALS->traces.total; GLOBALS->traces.first=GLOBALS->traces.last=NULL; GLOBALS->traces.total=0; t=GLOBALS->traces.buffer; } else { t = single_trace_only; } tfirst = t; while(t) { if(t->flags&TR_HIGHLIGHT) { if(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH)) { /* nothing */ } else { if(t->vector) { int ix; bptr bits = t->n.vec->bits; baptr oldba = bits ? bits->attribs : NULL; bits=t->n.vec->bits; if(!(t->flags&TR_REVERSE)) { for(ix=0;ixnnbits;ix++) { if(bits->nodes[ix]->expansion) bits->nodes[ix]->expansion->refcnt++; ba[nodepnt].shift = t->shift + (oldba ? oldba[ix].shift : 0); ba[nodepnt].flags = t->flags ^ (oldba ? oldba[ix].flags&TR_INVERT : 0); n[nodepnt++]=bits->nodes[ix]; } } else { for(ix=(bits->nnbits-1);ix>-1;ix--) { if(bits->nodes[ix]->expansion) bits->nodes[ix]->expansion->refcnt++; ba[nodepnt].shift = t->shift + (oldba ? oldba[ix].shift : 0); ba[nodepnt].flags = t->flags ^ (oldba ? oldba[ix].flags&TR_INVERT : 0); n[nodepnt++]=bits->nodes[ix]; } } } else { eptr e=ExpandNode(t->n.nd); int ix; if(!e) { if(t->n.nd->expansion) t->n.nd->expansion->refcnt++; ba[nodepnt].shift = t->shift; ba[nodepnt].flags = t->flags; n[nodepnt++]=t->n.nd; } else { for(ix=0;ixwidth;ix++) { ba[nodepnt].shift = t->shift; ba[nodepnt].flags = t->flags; n[nodepnt++]=e->narray[ix]; e->narray[ix]->expansion->refcnt++; } free_2(e->narray); free_2(e); } } } } if(nodepnt==dirty) break; if(t == single_trace_only) break; t=t->t_next; } b=(struct Bits *)calloc_2(1,sizeof(struct Bits)+(nodepnt)*sizeof(struct Node *)); b->attribs = malloc_2(nodepnt * sizeof(struct BitAttributes)); for(i=0;iattribs+i, ba+i, sizeof(struct BitAttributes)); } else { memcpy(b->attribs+i, ba+(nodepnt-1-i), sizeof(struct BitAttributes)); } if((ba[i].shift)||(ba[i].flags&TR_INVERT)) /* timeshift/invert are only relevant flags */ { attrib_reqd = 1; } } if(!attrib_reqd) { free_2(b->attribs); b->attribs = NULL; } if(nodepnt && n[0] && n[0]->expansion) /* scan-build */ { bitblast_parent = n[0]->expansion->parent; } else { bitblast_parent = NULL; } if(direction) { for(i=0;inodes[i]=n[i]; if(n[i] && n[i]->expansion) /* scan-build */ { if(bitblast_parent != n[i]->expansion->parent) { bitblast_parent=NULL; } else { if(i==1) { if(n[0] && n[0]->expansion) /* scan-build */ { bitblast_delta = n[1]->expansion->actual - n[0]->expansion->actual; if(bitblast_delta<-1) bitblast_delta=0; else if(bitblast_delta>1) bitblast_delta=0; } else { bitblast_delta = 0; } } else if((bitblast_delta)&&(i>1)) { if((n[i]->expansion->actual - n[i-1]->expansion->actual) != bitblast_delta) bitblast_delta=0; } } } else { bitblast_parent = NULL; } } } else { int rev; rev=nodepnt-1; for(i=0;inodes[i]=n[rev--]; if(n[i] && n[i]->expansion) /* scan-build */ { if(bitblast_parent != n[i]->expansion->parent) { bitblast_parent=NULL; } else { if(i==1) { if(n[0] && n[0]->expansion) /* scan-build */ { bitblast_delta = n[1]->expansion->actual - n[0]->expansion->actual; if(bitblast_delta<-1) bitblast_delta=0; else if(bitblast_delta>1) bitblast_delta=0; } else { bitblast_delta=0; } } else if((bitblast_delta)&&(i>1)) { if((n[i]->expansion->actual - n[i-1]->expansion->actual) != bitblast_delta) bitblast_delta=0; } } } else { bitblast_parent = NULL; } } } b->nnbits=nodepnt; if(!bitblast_parent) { char *aname; int match_iter = 1; if(direction) { aname = (nodepnt && n[0]) ? attempt_vecmatch(n[0]->nname, n[nodepnt-1]->nname) : NULL; /* scan-build */ } else { aname = (nodepnt && n[0]) ? attempt_vecmatch(n[nodepnt-1]->nname, n[0]->nname) : NULL; /* scan-build */ } if(aname) { int ix; for(ix=0;ixnname, n[ix]->nname); if(!mat) { match_iter = 0; break; } else { free_2(mat); } } } if(!match_iter) { free_2(aname); aname = NULL; } if((!aname) && !single_trace_only) /* ajb 020716: recent add to handle combine down on 2D vectors */ { char *t_topname = NULL; char *t_botname = NULL; t = tfirst; while(t) { if(t->flags&TR_HIGHLIGHT) { if(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH)) { /* nothing */ } else { if(t->vector) { char *vname = t->n.vec ? t->n.vec->bvname : NULL; if(vname) { if(!t_topname) { t_topname = vname; } else { t_botname = vname; } } } else { if(!t_topname) { t_topname = t->n.nd->nname; } else { t_botname = t->n.nd->nname; } if(t_topname && t_botname) { char *mat = attempt_vecmatch(t_topname, t_botname); if(!mat) { t_topname = t_botname = NULL; break; } else { free_2(mat); } } } } } t=t->t_next; } if(t_topname && t_botname) { aname = direction ? attempt_vecmatch(t_topname, t_botname) : attempt_vecmatch(t_botname, t_topname); /* return this match */ } } if(!b->attribs) { if(aname) { b->name = aname; } else { strcpy(b->name=(char *)malloc_2(strlen("")+1),""); } } else { if(aname) { b->name = aname; } else { strcpy(b->name=(char *)malloc_2(strlen("")+1),""); } } } else { int ix, offset; char *nam; char *namex; int was_packed = HIER_DEPACK_ALLOC; int row = 0, bit = 0; int row2 = 0, bit2 = 0; int is_2d = 0; int iy, offsety; char *namey; char sep2d = ':'; namex = hier_decompress_flagged(n[0]->nname, &was_packed); offset = strlen(namex); for(ix=offset-1;ix>=0;ix--) { if(namex[ix]=='[') break; } if(ix>-1) offset=ix; if(ix>3) /* is_2d is for handling 2-d stored in 1-d vector */ { if(namex[ix-1]==']') { int j = ix-2; for(;j>=0;j--) { if(namex[j]=='[') break; } if(j>-1) { int items = sscanf(namex+j, "[%d][%d]", &row, &bit); if(items == 2) { /* printf(">> %d %d (items = %d)\n", row, bit, items); */ offset = j; is_2d = 1; } } } } nam=(char *)wave_alloca(offset+50); /* to handle [a:b][c:d] case */ memcpy(nam, namex, offset); if(was_packed) { free_2(namex); } if(is_2d) { is_2d = 0; namey = hier_decompress_flagged(n[nodepnt-1]->nname, &was_packed); offsety = strlen(namey); for(iy=offsety-1;iy>=0;iy--) { if(namey[iy]=='[') break; } /* if(iy>-1) offsety=iy; not needed as in above as gets overwritten below by offsety = j */ if(iy>3) { if(namey[iy-1]==']') { int j = iy-2; for(;j>=0;j--) { if(namey[j]=='[') break; } if(j>-1) { int items = sscanf(namey+j, "[%d][%d]", &row2, &bit2); if(items == 2) { int rowabs, bitabs, width2d; /* printf(">> %d %d (items = %d)\n", row2, bit2, items); */ offsety = j; is_2d = (offset == offsety) && !memcmp(nam, namey, offsety); rowabs = (row2 > row) ? (row2 - row + 1) : (row - row2 + 1); bitabs = (bit2 > bit) ? (bit2 - bit + 1) : (bit - bit2 + 1); width2d = rowabs * bitabs; sep2d = (width2d == nodepnt) ? ':' : '|'; } } } } if(was_packed) { free_2(namey); } } if(direction) { if(!is_2d) { sprintf(nam+offset, "[%d%s%d]", n[0]->expansion->actual, (bitblast_delta!=0) ? ":" : "|", n[nodepnt-1]->expansion->actual); } else { if(row == row2) { if(bit == bit2) { sprintf(nam+offset, "[%d][%d]", row, bit); } else { sprintf(nam+offset, "[%d][%d%c%d]", row, bit, sep2d, bit2); } } else { if(bit == bit2) { sprintf(nam+offset, "[%d%c%d][%d]", row, sep2d, row2, bit); } else { sprintf(nam+offset, "[%d%c%d][%d%c%d]", row, sep2d, row2, bit, sep2d, bit2); } } } } else { if(!is_2d) { sprintf(nam+offset, "[%d%s%d]", n[nodepnt-1]->expansion->actual, (bitblast_delta!=0) ? ":" : "|", n[0]->expansion->actual); } else { if(row == row2) { if(bit == bit2) { sprintf(nam+offset, "[%d][%d]", row, bit); } else { sprintf(nam+offset, "[%d][%d%c%d]", row, bit2, sep2d, bit); } } else { if(bit == bit2) { sprintf(nam+offset, "[%d%c%d][%d]", row2, sep2d, row, bit); } else { sprintf(nam+offset, "[%d%c%d][%d%c%d]", row2, sep2d, row, bit2, sep2d, bit); } } } } strcpy(b->name=(char *)malloc_2(offset + strlen(nam+offset)+1), nam); DEBUG(printf("Name is: '%s'\n", nam)); } if((v=bits2vector(b))) { v->bits=b; /* only needed for savefile function */ } else { free_2(b->name); if(b->attribs) free_2(b->attribs); free_2(b); return NULL; } if(!single_trace_only) { tmp=GLOBALS->traces.buffer; GLOBALS->traces.buffer=GLOBALS->traces.first; GLOBALS->traces.first=tmp; tmp=GLOBALS->traces.bufferlast; GLOBALS->traces.bufferlast=GLOBALS->traces.last; GLOBALS->traces.last=tmp; tmpi=GLOBALS->traces.buffercount; GLOBALS->traces.buffercount=GLOBALS->traces.total; GLOBALS->traces.total=tmpi; PasteBuffer(); } return v; } } void menu_combine_down(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; bvptr v; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nCombine Down"); help_text( " coalesces the highlighted signals into a single vector named" " \"\" in a top to bottom fashion" " placed after the last highlighted trace. The original traces will" " be placed in the cut buffer." " It will function seemingly randomly" " when used upon real valued single-bit traces." ); return; } if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ v = combine_traces(1, NULL); /* down */ if (v) { Trptr t; AddVector(v, NULL); free_2(v->bits->name); v->bits->name=NULL; t = GLOBALS->traces.last; RemoveTrace(t, 0); /* t is now the composite signal trace */ create_group("unused_0", t); GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); menu_rename(widget, null_data); } else { } } void menu_combine_up(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; bvptr v; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nCombine Up"); help_text( " coalesces the highlighted signals into a single vector named" " \"\" in a bottom to top fashion" " placed after the last highlighted trace. The original traces will" " be placed in the cut buffer." " It will function seemingly randomly" " when used upon real valued single-bit traces." ); return; } if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ v = combine_traces(0, NULL); /* up */ if (v) { Trptr t; AddVector(v, NULL); free_2(v->bits->name); v->bits->name=NULL; t = GLOBALS->traces.last; RemoveTrace(t, 0); /* t is now the composite signal trace */ create_group("unused_1", t); GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); menu_rename(widget, null_data); } else { } } /**/ void menu_tracesearchbox_callback(GtkWidget *widget, gpointer data) { (void)widget; (void)data; } void menu_tracesearchbox(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; Trptr t; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nPattern Search"); help_text( " only works when at least one trace is highlighted. " " A requester will appear that lists all the selected" " traces (maximum of 500) and allows various criteria" " to be specified for each trace. Searches can go forward" " or backward from the primary (unnamed) marker. If the" " primary marker has not been set, the search starts at the" " beginning of the displayed data (\"From\") for a forwards" " search and starts at the end of the displayed data (\"To\")" " for a backwards search." " \"Mark\" and \"Clear\" are used to modify the normal time" " vertical markings such that they can be used to indicate" " all the times that a specific pattern search condition is" " true (e.g., every upclock of a specific signal). The" " \"Mark Count\" field indicates how many times the specific" " pattern search condition was encountered." " The \"Marking Begins at\" and \"Marking Stops at\" fields are" " used to limit the time over which marking is applied" " (but they have no effect on searching)." ); return; } for(t=GLOBALS->traces.first;t;t=t->t_next) { if ((t->flags&TR_HIGHLIGHT)&&HasWave(t)) { /* at least one good trace, so do it */ /* data contains WV_MENU_SPS or WV_MENU_SPS2 or ... but the base is WV_MENU_SPS*/ char buf[128]; long which = ((long)callback_action) - WV_MENU_SPS; if((which < 0) || (which >= WAVE_NUM_STRACE_WINDOWS)) { /* should never happen unless menus are defined wrong */ sprintf(buf, "Pattern search ID %d out of range of 1-%d available, ignoring.", (int)(which+1), WAVE_NUM_STRACE_WINDOWS); status_text(buf); } else { sprintf(buf, "Waveform Display Search (%d)", (int)(which+1)); tracesearchbox(buf, GTK_SIGNAL_FUNC(menu_tracesearchbox_callback), (gpointer)which); } return; } } must_sel(); } /**/ void menu_new_viewer_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; pid_t pid; if(GLOBALS->filesel_ok) { /* fix problem where ungrab doesn't occur if button pressed + simultaneous accelerator key occurs */ if(GLOBALS->in_button_press_wavewindow_c_1) { gdk_pointer_ungrab(GDK_CURRENT_TIME); } #if !defined __MINGW32__ && !defined _MSC_VER /* * for some reason, X won't let us double-fork in order to cleanup zombies.. *shrug* */ pid=fork(); if(((int)pid) < 0) { return; /* not much we can do about this.. */ } if(pid) /* parent==original server_pid */ { return; } #ifdef MAC_INTEGRATION /* from : @pfx = split(' ', "open -n -W -a gtkwave --args --chdir dummy"); */ if(GLOBALS->optimize_vcd) { execlp("open", "open", "-n", "-W", "-a", "gtkwave", "--args", "--optimize", "--dump", *GLOBALS->fileselbox_text, NULL); } else { execlp("open", "open", "-n", "-W", "-a", "gtkwave", "--args", "--dump", *GLOBALS->fileselbox_text, NULL); } #else if(GLOBALS->optimize_vcd) { execlp(GLOBALS->whoami, GLOBALS->whoami, "-o", *GLOBALS->fileselbox_text, NULL); } else { execlp(GLOBALS->whoami, GLOBALS->whoami, *GLOBALS->fileselbox_text, NULL); } #endif exit(0); /* control never gets here if successful */ #else BOOL bSuccess = FALSE; PROCESS_INFORMATION piProcInfo; TCHAR *szCmdline; STARTUPINFO si; memset(&piProcInfo, 0, sizeof(PROCESS_INFORMATION)); memset(&si, 0, sizeof(STARTUPINFO)); szCmdline = malloc_2(strlen(GLOBALS->whoami) + 1 + strlen(*GLOBALS->fileselbox_text) + 1); sprintf(szCmdline, "%s %s", GLOBALS->whoami, *GLOBALS->fileselbox_text); bSuccess = CreateProcess(NULL, szCmdline, /* command line */ NULL, /* process security attributes */ NULL, /* primary thread security attributes */ TRUE, /* handles are inherited */ 0, /* creation flags */ NULL, /* use parent's environment */ NULL, /* use parent's current directory */ &si, /* STARTUPINFO pointer */ &piProcInfo); /* receives PROCESS_INFORMATION */ free_2(szCmdline); if(!bSuccess) { /* failed */ } #endif } } void menu_new_viewer(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; static int mnv = 0; if(!mnv && !GLOBALS->busy_busy_c_1) { mnv = 1; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nOpen New Window"); help_text( " will open a file requester that will ask for the name" " of a VCD or AET file to view. This will fork off a" " new viewer process." ); } else { if(in_main_iteration()) { mnv = 0; return; } fileselbox("Select a trace to view...",&GLOBALS->filesel_newviewer_menu_c_1,GTK_SIGNAL_FUNC(menu_new_viewer_cleanup), GTK_SIGNAL_FUNC(NULL), NULL, 0); } mnv = 0; } } /**/ int menu_new_viewer_tab_cleanup_2(char *fname, int optimize_vcd) { int rc = 0; char *argv[2]; struct Global *g_old = GLOBALS; struct Global *g_now; argv[0] = gtkwave_argv0_cached ? gtkwave_argv0_cached : "gtkwave"; argv[1] = fname; /* fix problem where ungrab doesn't occur if button pressed + simultaneous accelerator key occurs */ if(GLOBALS->in_button_press_wavewindow_c_1) { gdk_pointer_ungrab(GDK_CURRENT_TIME); } GLOBALS->vcd_jmp_buf = calloc(1, sizeof(jmp_buf)); splash_button_press_event(NULL, NULL); /* kill any possible splash screens (e.g., if automated) */ set_window_busy(NULL); gtkwave_main_iteration(); if(!setjmp(*(GLOBALS->vcd_jmp_buf))) { main_2(optimize_vcd, 2, argv); g_now = GLOBALS; set_GLOBALS(g_old); clone_icon_pointers_across_contexts(g_now, GLOBALS); free(GLOBALS->vcd_jmp_buf); GLOBALS->vcd_jmp_buf = NULL; set_window_idle(NULL); set_GLOBALS(g_now); g_now->vcd_jmp_buf = NULL; /* copy old file req strings into new context */ strcpy2_into_new_context(GLOBALS, &GLOBALS->fcurr_ttranslate_c_1, &g_old->fcurr_ttranslate_c_1); strcpy2_into_new_context(GLOBALS, &GLOBALS->fcurr_ptranslate_c_1, &g_old->fcurr_ptranslate_c_1); strcpy2_into_new_context(GLOBALS, &GLOBALS->fcurr_translate_c_2, &g_old->fcurr_translate_c_2); #if 0 /* disabled for now...these probably would be disruptive */ strcpy2_into_new_context(GLOBALS, &GLOBALS->filesel_lxt_writesave, &g_old->filesel_lxt_writesave); strcpy2_into_new_context(GLOBALS, &GLOBALS->filesel_vcd_writesave, &g_old->filesel_vcd_writesave); strcpy2_into_new_context(GLOBALS, &GLOBALS->filesel_tim_writesave, &g_old->filesel_tim_writesave); strcpy2_into_new_context(GLOBALS, &GLOBALS->filesel_writesave, &g_old->filesel_writesave); strcpy2_into_new_context(GLOBALS, &GLOBALS->stems_name, &g_old->stems_name); strcpy2_into_new_context(GLOBALS, &GLOBALS->filesel_logfile_menu_c_1, &g_old->filesel_logfile_menu_c_1); strcpy2_into_new_context(GLOBALS, &GLOBALS->filesel_scriptfile_menu, &g_old->filesel_scriptfile_menu); strcpy2_into_new_context(GLOBALS, &GLOBALS->filesel_print_pdf_renderopt_c_1, &g_old->filesel_print_pdf_renderopt_c_1); strcpy2_into_new_context(GLOBALS, &GLOBALS->filesel_print_ps_renderopt_c_1, &g_old->filesel_print_ps_renderopt_c_1); strcpy2_into_new_context(GLOBALS, &GLOBALS->filesel_print_mif_renderopt_c_1, &g_old->filesel_print_mif_renderopt_c_1); #endif /* not sure what's really needed here */ /* for now, add back in repscript_name */ GLOBALS->repscript_period = g_old->repscript_period; strcpy2_into_new_context(GLOBALS, &GLOBALS->repscript_name, &g_old->repscript_name); GLOBALS->strace_repeat_count = g_old->strace_repeat_count; if(g_old->loaded_file_type == MISSING_FILE) /* remove original "blank" page */ { if(g_old->missing_file_toolbar) gtk_widget_set_sensitive(g_old->missing_file_toolbar, TRUE); menu_set_sensitive(); gtk_notebook_set_current_page(GTK_NOTEBOOK(g_old->notebook), g_old->this_context_page); set_GLOBALS(g_old); menu_quit_close_callback(NULL, NULL); } wave_gconf_client_set_string("/current/pwd", getenv("PWD")); wave_gconf_client_set_string("/current/dumpfile", GLOBALS->optimize_vcd ? GLOBALS->unoptimized_vcd_file_name : GLOBALS->loaded_file_name); wave_gconf_client_set_string("/current/optimized_vcd", GLOBALS->optimize_vcd ? "1" : "0"); wave_gconf_client_set_string("/current/savefile", GLOBALS->filesel_writesave); rc = 1; } else { if(GLOBALS->vcd_handle_vcd_c_1) { fclose(GLOBALS->vcd_handle_vcd_c_1); GLOBALS->vcd_handle_vcd_c_1 = NULL; } if(GLOBALS->vcd_handle_vcd_recoder_c_2) { fclose(GLOBALS->vcd_handle_vcd_recoder_c_2); GLOBALS->vcd_handle_vcd_recoder_c_2 =NULL; } if(GLOBALS->mm_lxt_mmap_addr) { munmap(GLOBALS->mm_lxt_mmap_addr, GLOBALS->mm_lxt_mmap_len); GLOBALS->mm_lxt_mmap_addr = NULL; } free_outstanding(); /* free anything allocated in loader ctx */ free(GLOBALS); GLOBALS = NULL; /* valgrind fix */ set_GLOBALS(g_old); free(GLOBALS->vcd_jmp_buf); GLOBALS->vcd_jmp_buf = NULL; set_window_idle(NULL); /* load failed */ wave_gtk_window_set_title(GTK_WINDOW(GLOBALS->mainwindow), GLOBALS->winname, GLOBALS->dumpfile_is_modified ? WAVE_SET_TITLE_MODIFIED: WAVE_SET_TITLE_NONE, 0); printf("GTKWAVE | File load failure, new tab not created.\n"); rc = 0; } return(rc); } void menu_new_viewer_tab_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; if(GLOBALS->filesel_ok) { menu_new_viewer_tab_cleanup_2(*GLOBALS->fileselbox_text, GLOBALS->optimize_vcd); } } void menu_new_viewer_tab(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nOpen New Tab"); help_text( " will open a file requester that will ask for the name" " of a VCD or AET file to view. This will create a tabbed page." ); return; } if(in_main_iteration()) return; #ifdef WAVE_USE_GTK2 if((!GLOBALS->socket_xid)&&(!GLOBALS->partial_vcd)) #else if(!GLOBALS->partial_vcd) #endif { fileselbox("Select a trace to view...",&GLOBALS->filesel_newviewer_menu_c_1,GTK_SIGNAL_FUNC(menu_new_viewer_tab_cleanup), GTK_SIGNAL_FUNC(NULL), NULL, 0); } } /**/ void menu_reload_waveform(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nReload Current Waveform"); help_text( " will reload the currently displayed waveform" " from a potentially updated file." ); return; } if(in_main_iteration()) return; if(GLOBALS->gt_splash_c_1 || GLOBALS->splash_is_loading) { return; /* don't attempt reload if splash screen is still active...that's pointless anyway */ } /* XXX if there's no file (for some reason), this function shouldn't occur we should probably gray it out. */ if(GLOBALS->loaded_file_type == DUMPLESS_FILE) { printf("GTKWAVE | DUMPLESS_FILE type cannot be reloaded\n"); return; } reload_into_new_context(); } void menu_reload_waveform_marshal(GtkWidget *widget, gpointer data) { menu_reload_waveform(data, 0, widget); } /**/ void menu_print(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nPrint To File"); help_text( " will open up a requester that will allow you to select" " print options (PS or MIF; Letter, A4, or Legal; Full or Minimal)." " After selecting the options you want," " a file requester will ask for the name of the" " output file to generate" " that reflects the current main window display's contents." ); return; } renderbox("Print Formatting Options"); } /**/ void menu_markerbox_callback(GtkWidget *widget, gpointer data) { (void)widget; (void)data; } void menu_markerbox(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nShow-Change Marker Data"); help_text( " displays and allows the modification of the times for" " all named markers by filling in the leftmost entry boxes. In addition, optional marker text" " rather than a generic single letter name may be specified by filling in the rightmost entry boxes." " Note that the time for each marker must be unique." ); return; } markerbox("Markers", GTK_SIGNAL_FUNC(menu_markerbox_callback)); } void copy_pri_b_marker(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nCopy Primary -> B Marker"); help_text( " copies the primary marker position to the B marker (handy for measuring deltas)." ); return; } DEBUG(printf("copy_pri_b_marker()\n")); if(GLOBALS->tims.marker!=-1) { GLOBALS->tims.baseline = GLOBALS->tims.marker; update_basetime(GLOBALS->tims.baseline); GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } /**/ void delete_unnamed_marker(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nDelete Primary Marker"); help_text( " removes the primary marker from the display if present." ); return; } DEBUG(printf("delete_unnamed marker()\n")); if(GLOBALS->tims.marker!=-1) { Trptr t; for(t=GLOBALS->traces.first;t;t=t->t_next) { if(t->asciivalue) { free_2(t->asciivalue); t->asciivalue=NULL; } } for(t=GLOBALS->traces.buffer;t;t=t->t_next) { if(t->asciivalue) { free_2(t->asciivalue); t->asciivalue=NULL; } } update_markertime(GLOBALS->tims.marker=-1); GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } /**/ void collect_all_named_markers(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; int i; int dirty=0; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nCollect All Named Markers"); help_text( " simply collects any and all named markers which have" " been dropped." ); return; } DEBUG(printf("collect_all_unnamed_markers()\n")); for(i=0;inamed_markers[i]!=-1) { GLOBALS->named_markers[i]=-1; dirty=1; } if(GLOBALS->marker_names[i]) { free_2(GLOBALS->marker_names[i]); GLOBALS->marker_names[i] = NULL; } } if(dirty) { signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } /**/ void collect_named_marker(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; int i; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nCollect Named Marker"); help_text( " collects a named marker where the current primary (unnamed)" " marker is placed if there is a named marker at its position." ); return; } DEBUG(printf("collect_named_marker()\n")); if(GLOBALS->tims.marker!=-1) { for(i=0;inamed_markers[i]==GLOBALS->tims.marker) { GLOBALS->named_markers[i]=-1; signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); if(GLOBALS->marker_names[i]) { free_2(GLOBALS->marker_names[i]); GLOBALS->marker_names[i] = NULL; } /* return; */ } } } } /**/ void drop_named_marker(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; int i; if(GLOBALS->helpbox_is_active) { char nm_s[32]; sprintf(nm_s, "%d", WAVE_NUM_NAMED_MARKERS); help_text_bold("\n\nDrop Named Marker"); help_text( " drops a named marker where the current primary (unnamed)" " marker is placed. A maximum of " ); help_text( nm_s ); help_text( " named markers are allowed" " and the times for all must be different." ); return; } DEBUG(printf("drop_named_marker()\n")); if(GLOBALS->tims.marker!=-1) { /* only one per slot requirement removed... #if 0 for(i=0;inamed_markers[i]==GLOBALS->tims.marker) return; } #endif ...only one per slot requirement removed */ for(i=0;inamed_markers[i]==-1) { GLOBALS->named_markers[i]=GLOBALS->tims.marker; signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); return; } } } } /**/ void menu_treesearch_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); DEBUG(printf("menu_treesearch_cleanup()\n")); } void menu_treesearch(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nSignal Search Tree"); help_text( " provides an easy means of adding traces to the display." " Various functions are provided in the Signal Search Tree requester" " which allow searching a treelike hierarchy and bundling" " (coalescing individual bits into a single vector)." ); return; } if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ treebox("Signal Search Tree",GTK_SIGNAL_FUNC(menu_treesearch_cleanup), NULL); } /**/ void menu_showchangeall_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; Trptr t; Ulong flags; t=GLOBALS->showchangeall_menu_c_1; if(t) { flags=t->flags; while(t) { if((t->flags&TR_HIGHLIGHT)&&(!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH)))&&(t->name)) { t->flags=flags; } t=t->t_next; } } GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); DEBUG(printf("menu_showchangeall_cleanup()\n")); } void menu_showchangeall(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; Trptr t; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nShow-Change All Highlighted"); help_text( " provides an easy means of changing trace attributes en masse." " Various functions are provided in a Show-Change requester." ); return; } DEBUG(printf("menu_showchangeall()\n")); GLOBALS->showchangeall_menu_c_1=NULL; t=GLOBALS->traces.first; while(t) { if((t->flags&TR_HIGHLIGHT)&&(!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH)))&&(t->name)) { showchange("Show-Change All", GLOBALS->showchangeall_menu_c_1=t, GTK_SIGNAL_FUNC(menu_showchangeall_cleanup)); return; } t=t->t_next; } must_sel(); } /**/ void menu_showchange_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); DEBUG(printf("menu_showchange_cleanup()\n")); } void menu_showchange(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; Trptr t; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nShow-Change First Highlighted"); help_text( " provides a means of changing trace attributes for the" " first highlighted trace. " " Various functions are provided in a Show-Change requester. " " When a function is applied, the trace will be unhighlighted." ); return; } DEBUG(printf("menu_showchange()\n")); t=GLOBALS->traces.first; while(t) { if((t->flags&TR_HIGHLIGHT)&&(!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH)))&&(t->name)) { showchange("Show-Change", t, GTK_SIGNAL_FUNC(menu_showchange_cleanup)); return; } t=t->t_next; } must_sel(); } /**/ void menu_remove_aliases(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; Trptr t; int dirty=0, none_selected = 1; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nRemove Highlighted Aliases"); help_text( " only works when at least one trace has been highlighted. " " Any aliased traces will have their names restored to their" " original names. As vectors get their names from aliases," " vector aliases will not be removed." ); return; } if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ t=GLOBALS->traces.first; while(t) { if(HasAlias(t) && IsSelected(t)) { char *name_full; int was_packed = HIER_DEPACK_ALLOC; free_2(t->name_full); t->name_full = NULL; if(t->vector) { name_full = t->n.vec->bvname; } else { name_full = hier_decompress_flagged(t->n.nd->nname, &was_packed); } t->name = name_full; if (GLOBALS->hier_max_level) { if(!was_packed) { t->name = hier_extract(t->name, GLOBALS->hier_max_level); } else { t->name = strdup_2(hier_extract(name_full, GLOBALS->hier_max_level)); free_2(name_full); } } if(was_packed) t->is_depacked = 1; dirty = 1; } if (IsSelected(t)) none_selected = 0; t=t->t_next; } if(dirty) { GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); DEBUG(printf("menu_remove_aliases()\n")); } if (none_selected) { must_sel(); } } static void alias_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; Trptr t = GLOBALS->trace_to_alias_menu_c_1; if(GLOBALS->entrybox_text) { char *efix; /* code to turn '{' and '}' into '[' and ']' */ if(!(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { efix=GLOBALS->entrybox_text; while(*efix) { if(*efix=='{') { *efix='['; } if(*efix=='}') { *efix=']'; } efix++; } } if (CanAlias(t)) { if(HasAlias(t)) free_2(t->name_full); t->name_full = (char *)malloc_2(1+strlen(GLOBALS->entrybox_text)); strcpy(t->name_full, GLOBALS->entrybox_text); t->name = t->name_full; if(GLOBALS->hier_max_level) t->name = hier_extract(t->name, GLOBALS->hier_max_level); t->flags&= ~TR_HIGHLIGHT; } GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } void menu_alias(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; Trptr t; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nAlias Highlighted Trace"); help_text( " only works when at least one trace has been highlighted. " " With this function, you will be prompted for an alias" " name for the first highlighted trace. After successfully" " aliasing a trace, the aliased trace will be unhighlighted." " Single bits will be marked with a leading \"+\" and vectors" " will have no such designation. The purpose of this is to" " provide a fast method of determining which trace names are" " real and which ones are aliases." ); return; } GLOBALS->trace_to_alias_menu_c_1=NULL; /* don't mess with sigs when dnd active */ if(GLOBALS->dnd_state) { dnd_error(); return; } t = GLOBALS->traces.first; while(t) { if(IsSelected(t)&&CanAlias(t)) { GLOBALS->trace_to_alias_menu_c_1=t; break; } t=t->t_next; } if(GLOBALS->trace_to_alias_menu_c_1) { int was_packed = HIER_DEPACK_ALLOC; char* current = GetFullName(GLOBALS->trace_to_alias_menu_c_1, &was_packed); ClearTraces(); GLOBALS->trace_to_alias_menu_c_1->flags |= TR_HIGHLIGHT; entrybox("Alias Highlighted Trace",300,current,NULL,128,GTK_SIGNAL_FUNC(alias_cleanup)); if(was_packed) { free_2(current); } } else { must_sel(); } } /**/ void menu_hiersearch_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); DEBUG(printf("menu_hiersearch_cleanup()\n")); } void menu_hiersearch(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nHierarchy Search"); help_text( " provides an easy means of adding traces to the display in a text based" " treelike fashion." ); return; } if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ hier_searchbox("Hierarchy Search",GTK_SIGNAL_FUNC(menu_hiersearch_cleanup)); } /**/ void menu_signalsearch_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); DEBUG(printf("menu_signalsearch_cleanup()\n")); } void menu_signalsearch(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nSignal Search Regexp"); help_text( " provides an easy means of adding traces to the display. " " Various functions are provided in the Signal Search requester" " which allow searching using POSIX regular expressions and bundling" " (coalescing individual bits into a single vector). " ); return; } if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ searchbox("Signal Search",GTK_SIGNAL_FUNC(menu_signalsearch_cleanup)); } /**/ static void regexp_highlight_generic(int mode) { if(GLOBALS->entrybox_text) { Trptr t; Ulong modebits; char dirty=0; modebits=(mode)?TR_HIGHLIGHT:0; strcpy(GLOBALS->regexp_string_menu_c_1, GLOBALS->entrybox_text); wave_regex_compile(GLOBALS->regexp_string_menu_c_1, WAVE_REGEX_SEARCH); free_2(GLOBALS->entrybox_text); t=GLOBALS->traces.first; while(t) { char *pnt; pnt=(t->name)?t->name:""; /* handle (really) blank lines */ if(*pnt=='+') /* skip alias prefix if present */ { pnt++; if(*pnt==' ') { pnt++; } } if(wave_regex_match(pnt, WAVE_REGEX_SEARCH)) { t->flags=((t->flags&(~TR_HIGHLIGHT))|modebits); dirty=1; } t=t->t_next; } if(dirty) { signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } } static void regexp_unhighlight_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; regexp_highlight_generic(0); } void menu_regexp_unhighlight(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nUnHighlight Regexp"); help_text( " brings up a text requester that will ask for a" " regular expression that may contain text with POSIX regular expressions." " All traces meeting this criterion / these criteria will be" " unhighlighted if they are currently highlighted." ); return; } entrybox("Regexp UnHighlight",300,GLOBALS->regexp_string_menu_c_1,NULL,128,GTK_SIGNAL_FUNC(regexp_unhighlight_cleanup)); } /**/ static void regexp_highlight_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; regexp_highlight_generic(1); } void menu_regexp_highlight(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nHighlight Regexp"); help_text( " brings up a text requester that will ask for a" " regular expression that may contain text with POSIX regular expressions." " All traces meeting this criterion / these criteria will be" " highlighted." ); return; } entrybox("Regexp Highlight",300,GLOBALS->regexp_string_menu_c_1,NULL,128,GTK_SIGNAL_FUNC(regexp_highlight_cleanup)); } /**/ #if GTK_CHECK_VERSION(2,14,0) void menu_write_screengrab_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; GdkWindow *gw; gint w, h; GdkColormap *cm; GdkPixbuf *dest = NULL; GdkPixbuf *dest2; GError *err = NULL; gboolean succ = FALSE; if(!GLOBALS->filesel_ok) { return; } gw = gtk_widget_get_window(GTK_WIDGET(GLOBALS->mainwindow)); if(gw) { gdk_drawable_get_size(gw, &w, &h); cm = gdk_drawable_get_colormap(gw); if(cm) { dest = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, w, h); if(dest) { dest2 = gdk_pixbuf_get_from_drawable(dest, gw, cm, 0, 0, 0, 0, w, h); if(dest2) { succ = gdk_pixbuf_save (dest2, *GLOBALS->fileselbox_text, "png", &err, NULL); } } } } if(dest) { g_object_unref(dest); } if(!succ) { fprintf(stderr, "Error opening imagegrab file '%s' for writing.\n",*GLOBALS->fileselbox_text); perror("Why"); errno=0; } else { wave_gconf_client_set_string("/current/imagegrab", GLOBALS->filesel_imagegrab); } } void menu_write_screengrab_as(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nGrab To File"); help_text( " will open a file requester that will ask for the name" " to be used for a PNG format image grab of the main GTKWave window." " Note that if the main window is covered by other windows or" " is partially offscreen, the grabbed image might not appear properly." ); return; } errno = 0; fileselbox("Grab To File",&GLOBALS->filesel_imagegrab,GTK_SIGNAL_FUNC(menu_write_screengrab_cleanup), GTK_SIGNAL_FUNC(NULL), "*.png", 1); } #endif /**/ void menu_write_save_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; FILE *wave; if(!GLOBALS->filesel_ok) { return; } if(!(wave=fopen(*GLOBALS->fileselbox_text,"wb"))) { fprintf(stderr, "Error opening save file '%s' for writing.\n",*GLOBALS->fileselbox_text); perror("Why"); errno=0; } else { write_save_helper(*GLOBALS->fileselbox_text, wave); wave_gconf_client_set_string("/current/savefile", GLOBALS->filesel_writesave); GLOBALS->save_success_menu_c_1 = 1; fclose(wave); } } void menu_write_save_file_as(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nWrite Save File As"); help_text( " will open a file requester that will ask for the name" " of a GTKWave save file. The contents of the save file" " generated will be the traces as well as their" " format (binary, decimal, hex, reverse, etc.) which" " are currently a part of the display. Marker positional" " data and the zoom factor are also a part of the save file." ); return; } fileselbox("Write Save File",&GLOBALS->filesel_writesave,GTK_SIGNAL_FUNC(menu_write_save_cleanup), GTK_SIGNAL_FUNC(NULL), GLOBALS->is_gtkw_save_file ? "*.gtkw" : "*.sav", 1); } void menu_write_save_file(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nWrite Save File"); help_text( " will invoke Write Save File As if no save file name has been specified previously." " Otherwise it will write the save file data without prompting." ); return; } if(!GLOBALS->filesel_writesave) { fileselbox("Write Save File",&GLOBALS->filesel_writesave,GTK_SIGNAL_FUNC(menu_write_save_cleanup), GTK_SIGNAL_FUNC(NULL), GLOBALS->is_gtkw_save_file ? "*.gtkw" : "*.sav", 1); } else { GLOBALS->filesel_ok = 1; GLOBALS->save_success_menu_c_1 = 0; GLOBALS->fileselbox_text = &GLOBALS->filesel_writesave; menu_write_save_cleanup(NULL, NULL); if(GLOBALS->save_success_menu_c_1) { status_text("Wrote save file OK.\n"); } else { status_text("Problem writing save file.\n"); } } } /**/ void menu_read_save_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; if(GLOBALS->filesel_ok) { char *wname; DEBUG(printf("Read Save Fini: %s\n", *GLOBALS->fileselbox_text)); wname=*GLOBALS->fileselbox_text; wave_gconf_client_set_string("/current/savefile", wname); read_save_helper(wname, NULL, NULL, NULL, NULL, NULL); } } void menu_read_save_file(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nRead Save File"); help_text( " will open a file requester that will ask for the name" " of a GTKWave save file. The contents of the save file" " will determine which traces and vectors as well as their" " format (binary, decimal, hex, reverse, etc.) are to be" " appended to the display. Note that the marker positional" " data and zoom factor present in the save file will" " replace any current settings." ); return; } if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ fileselbox("Read Save File",&GLOBALS->filesel_writesave,GTK_SIGNAL_FUNC(menu_read_save_cleanup), GTK_SIGNAL_FUNC(NULL), GLOBALS->is_gtkw_save_file ? "*.gtkw" : "*.sav", 0); } #if !defined _MSC_VER /**/ void menu_read_stems_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; char *fname; if(GLOBALS->filesel_ok) { DEBUG(printf("Read Stems Fini: %s\n", *GLOBALS->fileselbox_text)); fname=*GLOBALS->fileselbox_text; if((fname)&&strlen(fname)) { activate_stems_reader(fname); } } } /**/ void menu_read_stems_file(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nRead Verilog Stemsfile"); help_text( " will open a file requester that will ask for the name" " of a Verilog stemsfile. This will then launch an RTL browser and allow source code annotation based on" " the primary marker position." " Stems files are generated by Vermin. Please see its manpage" " for syntax and more information on stems file generation." ); return; } if(!stems_are_active()) { if(GLOBALS->stems_type != WAVE_ANNO_NONE) { fileselbox("Read Verilog Stemsfile",&GLOBALS->stems_name, GTK_SIGNAL_FUNC(menu_read_stems_cleanup), GTK_SIGNAL_FUNC(NULL), NULL, 0); } else { status_text("Unsupported dumpfile type for rtlbrowse.\n"); } } } #endif /**/ void menu_read_log_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; char *fname ; if(GLOBALS->filesel_ok) { DEBUG(printf("Read Log Fini: %s\n", *GLOBALS->fileselbox_text)); fname=*GLOBALS->fileselbox_text; if((fname)&&strlen(fname)) { logbox("Logfile viewer", 480, fname); } } } /**/ void menu_read_log_file(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nRead Logfile"); help_text( " will open a file requester that will ask for the name" " of a plaintext simulation log. By clicking on the numbers in the logfile," " the marker will jump to the appropriate time value in the wave window." ); return; } fileselbox("Read Logfile",&GLOBALS->filesel_logfile_menu_c_1,GTK_SIGNAL_FUNC(menu_read_log_cleanup), GTK_SIGNAL_FUNC(NULL), NULL, 0); } /**/ void menu_read_script_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; char *fname; if(GLOBALS->filesel_ok) { DEBUG(printf("Read Script Fini: %s\n", *GLOBALS->fileselbox_text)); fname=*GLOBALS->fileselbox_text; if((fname)&&strlen(fname)) { execute_script(fname, 0); } } } /**/ void menu_read_script_file(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nRead Script File"); help_text( " will open a file requester that will ask for the name" " of a TCL script to run. This menu option itself is not callable" " by TCL scripts." ); return; } fileselbox("Read Script File",&GLOBALS->filesel_scriptfile_menu,GTK_SIGNAL_FUNC(menu_read_script_cleanup), GTK_SIGNAL_FUNC(NULL), "*.tcl", 0); } /**/ void menu_insert_blank_traces(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nInsert Blank"); help_text( " inserts a blank trace after the last highlighted trace." " If no traces are highlighted, the blank is inserted after" " the last trace." ); return; } if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ DEBUG(printf("Insert Blank Trace\n")); InsertBlankTrace(NULL, 0); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } void menu_insert_analog_height_extension(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nInsert Analog Height Extension"); help_text( " inserts a blank analog extension trace after the last highlighted trace." " If no traces are highlighted, the blank is inserted after" " the last trace. This type of trace is used to increase the height of analog traces." ); return; } if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ DEBUG(printf("Insert Analog Blank Trace\n")); InsertBlankTrace(NULL, TR_ANALOG_BLANK_STRETCH); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } /**/ static void comment_trace_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; InsertBlankTrace(GLOBALS->entrybox_text, 0); if(GLOBALS->entrybox_text) { free_2(GLOBALS->entrybox_text); GLOBALS->entrybox_text=NULL; } GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } void menu_insert_comment_traces(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nInsert Comment"); help_text( " inserts a comment trace after the last highlighted trace." " If no traces are highlighted, the comment is inserted after" " the last trace." ); return; } if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ DEBUG(printf("Insert Comment Trace\n")); entrybox("Insert Comment Trace",300,"",NULL,128,GTK_SIGNAL_FUNC(comment_trace_cleanup)); } /**/ static void strace_repcnt_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; if(GLOBALS->entrybox_text) { GLOBALS->strace_repeat_count = atoi_64(GLOBALS->entrybox_text); free_2(GLOBALS->entrybox_text); GLOBALS->entrybox_text=NULL; } } void menu_strace_repcnt(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; char gt[32]; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nSet Pattern Search Repeat Count"); help_text( " sets the number of times that both edge and pattern searches iterate forward or backward when marker forward/backward is selected." " Default value is one. This can be used, for example, to skip forward 10 clock edges at a time rather than a single edge." ); return; } sprintf(gt, "%d", GLOBALS->strace_repeat_count); entrybox("Repeat Count",300,gt,NULL,20,GTK_SIGNAL_FUNC(strace_repcnt_cleanup)); } /**/ void movetotime_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; if(GLOBALS->entrybox_text) { TimeType gt = GLOBALS->tims.first; char update_string[128]; char timval[40]; GtkAdjustment *hadj; TimeType pageinc; if((GLOBALS->entrybox_text[0] >= 'A' && GLOBALS->entrybox_text[0] <= 'Z')||(GLOBALS->entrybox_text[0] >= 'a' && GLOBALS->entrybox_text[0] <= 'z')) { char *su = GLOBALS->entrybox_text; int uch; while(*su) { uch = toupper((int)(unsigned char)*su); *su = uch; su++; } uch = bijective_marker_id_string_hash(GLOBALS->entrybox_text); if((uch >= 0)&&(uch < WAVE_NUM_NAMED_MARKERS)) { gt=GLOBALS->named_markers[uch]; } } else { gt=unformat_time(GLOBALS->entrybox_text, GLOBALS->time_dimension); gt -= GLOBALS->global_time_offset; } free_2(GLOBALS->entrybox_text); GLOBALS->entrybox_text=NULL; if(gttims.first) gt=GLOBALS->tims.first; else if(gt>GLOBALS->tims.last) gt=GLOBALS->tims.last; hadj=GTK_ADJUSTMENT(GLOBALS->wave_hslider); hadj->value=gt; pageinc=(TimeType)(((gdouble)GLOBALS->wavewidth)*GLOBALS->nspx); if(gt<(GLOBALS->tims.last-pageinc+1)) GLOBALS->tims.timecache=gt; else { GLOBALS->tims.timecache=GLOBALS->tims.last-pageinc+1; if(GLOBALS->tims.timecachetims.first) GLOBALS->tims.timecache=GLOBALS->tims.first; } reformat_time(timval,GLOBALS->tims.timecache + GLOBALS->global_time_offset,GLOBALS->time_dimension); sprintf(update_string, "Moved to time: %s\n", timval); status_text(update_string); time_update(); } } void menu_movetotime(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; char gt[32]; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nMove To Time"); help_text( " scrolls the waveform display such that the left border" " is the time entered in the requester." " Use one of the letters A-Z to move to a named marker." ); return; } reformat_time(gt, GLOBALS->tims.start + GLOBALS->global_time_offset, GLOBALS->time_dimension); entrybox("Move To Time",200,gt,NULL,20,GTK_SIGNAL_FUNC(movetotime_cleanup)); } /**/ static void fetchsize_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; if(GLOBALS->entrybox_text) { TimeType fw; char update_string[128]; fw=unformat_time(GLOBALS->entrybox_text, GLOBALS->time_dimension); if(fw<1) { fw=GLOBALS->fetchwindow; /* in case they try to pull 0 or <0 */ } else { GLOBALS->fetchwindow=fw; } free_2(GLOBALS->entrybox_text); GLOBALS->entrybox_text=NULL; sprintf(update_string, "Fetch Size is now: "TTFormat"\n", fw); status_text(update_string); } } void menu_fetchsize(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; char fw[32]; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nFetch Size"); help_text( " brings up a requester which allows input of the" " number of ticks used for fetch/discard operations." " Default is 100." ); return; } reformat_time(fw, GLOBALS->fetchwindow, GLOBALS->time_dimension); entrybox("New Fetch Size",200,fw,NULL,20,GTK_SIGNAL_FUNC(fetchsize_cleanup)); } /**/ void zoomsize_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; if(GLOBALS->entrybox_text) { float f; char update_string[128]; sscanf(GLOBALS->entrybox_text, "%f", &f); if(f>0.0) { f=0.0; /* in case they try to go out of range */ } else if(f<-62.0) { f=-62.0; /* in case they try to go out of range */ } GLOBALS->tims.prevzoom=GLOBALS->tims.zoom; GLOBALS->tims.zoom=(gdouble)f; calczoom(GLOBALS->tims.zoom); fix_wavehadj(); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "changed"); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "value_changed"); free_2(GLOBALS->entrybox_text); GLOBALS->entrybox_text=NULL; sprintf(update_string, "Zoom Amount is now: %g\n", f); status_text(update_string); } } void menu_zoomsize(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; char za[32]; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nZoom Amount"); help_text( " allows entry of zero or a negative value for the display" " zoom. Zero is no magnification." ); return; } sprintf(za,"%g",(float)(GLOBALS->tims.zoom)); entrybox("New Zoom Amount",200,za,NULL,20,GTK_SIGNAL_FUNC(zoomsize_cleanup)); } /**/ static void zoombase_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; if(GLOBALS->entrybox_text) { float za; char update_string[128]; sscanf(GLOBALS->entrybox_text, "%f", &za); if(za>10.0) { za=10.0; } else if(za<1.5) { za=1.5; } GLOBALS->zoombase=(gdouble)za; calczoom(GLOBALS->tims.zoom); fix_wavehadj(); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "changed"); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "value_changed"); free_2(GLOBALS->entrybox_text); GLOBALS->entrybox_text=NULL; sprintf(update_string, "Zoom Base is now: %g\n", za); status_text(update_string); } } void menu_zoombase(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; char za[32]; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nZoom Base"); help_text( " allows entry of a zoom base for the zoom (magnification per integer step)" " Allowable values are 1.5 to 10.0. Default is 2.0." ); return; } sprintf(za,"%g",GLOBALS->zoombase); entrybox("New Zoom Base Amount",200,za,NULL,20,GTK_SIGNAL_FUNC(zoombase_cleanup)); } /**/ static void colorformat(int color) { Trptr t; int fix=0; int color_prev = WAVE_COLOR_NORMAL; int is_first = 0; if((t=GLOBALS->traces.first)) { while(t) { if(IsSelected(t)&&!IsShadowed(t)) { if(color != WAVE_COLOR_CYCLE) { t->t_color = color; } else { if(!is_first) { is_first = 1; if(t->t_color == WAVE_COLOR_NORMAL) { color_prev = WAVE_COLOR_RED; } else { color_prev = t->t_color; } } else { color_prev++; } if(color_prev > WAVE_COLOR_VIOLET) color_prev = WAVE_COLOR_RED; t->t_color = color_prev; } fix=1; } t=t->t_next; } if(fix) { GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } } void menu_colorformat_0(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nColor Format Normal"); help_text( " uses normal waveform colorings for all selected traces." ); return; } colorformat(WAVE_COLOR_NORMAL); } void menu_colorformat_1(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nColor Format Red"); help_text( " uses red waveform colorings for all selected traces." ); return; } colorformat(WAVE_COLOR_RED); } void menu_colorformat_2(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nColor Format Orange"); help_text( " uses orange waveform colorings for all selected traces." ); return; } colorformat(WAVE_COLOR_ORANGE); } void menu_colorformat_3(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nColor Format Yellow"); help_text( " uses yellow waveform colorings for all selected traces." ); return; } colorformat(WAVE_COLOR_YELLOW); } void menu_colorformat_4(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nColor Format Green"); help_text( " uses green waveform colorings for all selected traces." ); return; } colorformat(WAVE_COLOR_GREEN); } void menu_colorformat_5(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nColor Format Blue"); help_text( " uses blue waveform colorings for all selected traces." ); return; } colorformat(WAVE_COLOR_BLUE); } void menu_colorformat_6(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nColor Format Indigo"); help_text( " uses indigo waveform colorings for all selected traces." ); return; } colorformat(WAVE_COLOR_INDIGO); } void menu_colorformat_7(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nColor Format Violet"); help_text( " uses violet waveform colorings for all selected traces." ); return; } colorformat(WAVE_COLOR_VIOLET); } void menu_colorformat_cyc(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nColor Format Cycle"); help_text( " uses cycling waveform colorings for all selected traces." ); return; } colorformat(WAVE_COLOR_CYCLE); } /**/ char **grow_array(char ***src, int *siz, char *str) { if(!*src) { *src = malloc_2(sizeof(char *)); (*src)[0] = str; *siz = 1; } else { *src = realloc_2(*src, (*siz + 1) * sizeof(char *)); (*src)[*siz] = str; *siz = *siz + 1; } return(*src); } #if WAVE_USE_GTK2 static void open_index_in_forked_editor(uint32_t idx, int typ) { if(idx) { int lineno = 1; char *edname = getenv("GTKWAVE_EDITOR"); char *fname = NULL; FILE *ftest = NULL; if(GLOBALS->editor_name) { edname = GLOBALS->editor_name; /* rcfile "editor" variable first */ } else { if(edname) { /* ok, env var GTKWAVE_EDITOR second */ } #ifdef GEDIT_PATH else { /* fallback */ edname = GEDIT_PATH; } #endif } #ifdef MAC_INTEGRATION if(!edname) { edname = "open -t"; /* Use OSX TextEdit as editor of last resort */ } #endif idx--; if(typ == FST_MT_SOURCESTEM) { lineno = GLOBALS->stem_struct_base[idx].stem_line_number; fname = GLOBALS->stem_path_string_table[GLOBALS->stem_struct_base[idx].stem_idx]; } else { lineno = GLOBALS->istem_struct_base[idx].stem_line_number; fname = GLOBALS->stem_path_string_table[GLOBALS->istem_struct_base[idx].stem_idx]; } #ifdef __MINGW32__ { fprintf(stderr, "GTKWAVE | Not supported in Windows!\n"); } #else if(!(ftest = fopen(fname, "rb"))) { char *rp = get_relative_adjusted_name(GLOBALS->loaded_file_name, fname, GLOBALS->loaded_file_name); if(!rp) { int clen = strlen(fname); int wid = clen * 10; if(wid < 400) wid = 400; simplereqbox("Could not open file!", wid, fname, "OK", NULL, NULL, 1); return; } fname = wave_alloca(strlen(rp) + 1); strcpy(fname, rp); free_2(rp); } else { fclose(ftest); ftest = NULL; } { pid_t pid=fork(); if(((int)pid) < 0) { /* can't do anything about this */ } else { if(pid) /* parent==original server_pid */ { } else { char *str = strdup_2(edname); char nbuf[32]; char *saveptr1 = NULL; char *str1, *token, *sd_token; const char *delim = " \t"; int num_seen = 0; int fn_seen = 0; char **ar = NULL; int siz = 0; for(str1 = str;;str1 = NULL) { token = strtok_r(str1, delim, &saveptr1); if(!token) break; if(strstr(token, "%d")) { sprintf(nbuf, token, lineno); sd_token = strdup_2(nbuf); num_seen = 1; } else if(!strcmp(token, "%s")) { sd_token = strdup_2(fname); fn_seen = 1; } else { sd_token = strdup_2(token); } grow_array(&ar, &siz, sd_token); } if(ar && edname) { if(!num_seen) { if((strstr(ar[0], "vi")) || (strstr(ar[0], "emacs")) || (strstr(ar[0], "gedit"))) { sprintf(nbuf, "+%d", lineno); sd_token = strdup_2(nbuf); grow_array(&ar, &siz, sd_token); } } if(!fn_seen) { sd_token = strdup_2(fname); grow_array(&ar, &siz, sd_token); } grow_array(&ar, &siz, NULL); execvp(ar[0], ar); } fprintf(stderr, "GTKWAVE | Could not find editor executable!\n"); exit(255); /* control never gets here if successful */ } } } #endif } else { simplereqbox("Open Source", 400, "Source stem not present!", "OK", NULL, NULL, 1); } } #endif static void menu_open_hierarchy_2(gpointer null_data, guint callback_action, GtkWidget *widget, int typ) { (void)null_data; (void)callback_action; (void)widget; #if WAVE_USE_GTK2 Trptr t; int fix=0; struct tree *t_forced = NULL; #endif if(GLOBALS->helpbox_is_active) { if((typ == FST_MT_SOURCESTEM) || (typ == FST_MT_SOURCEISTEM)) { if(typ == FST_MT_SOURCESTEM) { help_text_bold("\n\nOpen Source Definition"); } else { help_text_bold("\n\nOpen Source Instantiation"); } help_text( #if WAVE_USE_GTK2 " opens and selects the appropriate level of hierarchy in the SST" " for the first selected signal and also invokes the editor specified by the" " \"editor\" gtkwaverc variable, that specified by the environment variable $GTKWAVE_EDITOR," #ifndef MAC_INTEGRATION " or gedit (if found during ./configure)" #else " gedit (if found during ./configure), or lastly open -t" #endif " on the appropriate source unit. This is currently only supported by FST." #else " is not available with this build. Please build against GTK 2." #endif ); } else { help_text_bold("\n\nOpen Scope"); help_text( #if WAVE_USE_GTK2 " opens and selects the appropriate level of hierarchy in the SST" " for the first selected signal." #else " is not available with this build. Please build against GTK 2." #endif ); } return; } #if WAVE_USE_GTK2 if((t=GLOBALS->traces.first)) { while(t) { if(IsSelected(t)&&!IsShadowed(t)) { char *tname = NULL; if(!HasWave(t)) { break; } if (HasAlias(t)) { tname = strdup_2(t->name_full); } else if(t->vector==TRUE) { tname = strdup_2(t->n.vec->bvname); } else { int flagged = HIER_DEPACK_ALLOC; if(!t->n.nd) { break; /* additional guard on top of !HasWave(t) */ } tname = hier_decompress_flagged(t->n.nd->nname, &flagged); if(!flagged) { tname = strdup_2(tname); } } if(tname) { char *lasthier = strrchr(tname, GLOBALS->hier_delimeter); if(lasthier) { char *tname_copy; lasthier++; /* zero out character after hierarchy */ *lasthier = 0; tname_copy = strdup_2(tname); /* force_open_tree_node() is destructive */ if(force_open_tree_node(tname_copy, 1, &t_forced) >= 0) { if(GLOBALS->selected_hierarchy_name) { free_2(GLOBALS->selected_hierarchy_name); GLOBALS->selected_hierarchy_name = strdup_2(tname); } select_tree_node(tname); } free_2(tname_copy); } free_2(tname); fix=1; break; } } t=t->t_next; } if(fix) { GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } if(((typ == FST_MT_SOURCESTEM) || (typ == FST_MT_SOURCEISTEM)) && t_forced) { uint32_t idx = (typ == FST_MT_SOURCESTEM) ? t_forced->t_stem : t_forced->t_istem; if(!GLOBALS->stem_path_string_table) { fprintf(stderr, "GTKWAVE | Could not find stems information in this file!\n"); } else { if(!idx && (typ == FST_MT_SOURCEISTEM) && GLOBALS->istem_struct_base) { /* handle top level where istem == stem and istem is deliberately not specified */ typ = FST_MT_SOURCESTEM; idx = t_forced->t_stem; } open_index_in_forked_editor(idx, typ); } } #endif } static void menu_open_hierarchy_2a(gpointer null_data, guint callback_action, GtkWidget *widget, int typ) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { if((typ == FST_MT_SOURCESTEM) || (typ == FST_MT_SOURCEISTEM)) { if(typ == FST_MT_SOURCESTEM) { help_text_bold("\n\nOpen Source Definition"); } else { help_text_bold("\n\nOpen Source Instantiation"); } help_text( #if WAVE_USE_GTK2 " invokes $GTKWAVE_EDITOR or gedit (if found) on the appropriate source unit." #else " is not available with this build. Please build against GTK 2." #endif ); } else { help_text_bold("\n\nOpen Scope"); help_text( #if WAVE_USE_GTK2 " opens and selects the appropriate level of hierarchy in the SST" " for the first selected signal." #else " is not available with this build. Please build against GTK 2." #endif ); } return; } #if WAVE_USE_GTK2 if((typ == FST_MT_SOURCESTEM) || (typ == FST_MT_SOURCEISTEM)) { struct tree *t_forced = GLOBALS->sst_sig_root_treesearch_gtk2_c_1; if(t_forced) { uint32_t idx = (typ == FST_MT_SOURCESTEM) ? t_forced->t_stem : t_forced->t_istem; if(!GLOBALS->stem_path_string_table) { fprintf(stderr, "GTKWAVE | Could not find stems information in this file!\n"); } else { if(!idx && (typ == FST_MT_SOURCEISTEM) && GLOBALS->istem_struct_base) { /* handle top level where istem == stem and istem is deliberately not specified */ typ = FST_MT_SOURCESTEM; idx = t_forced->t_stem; } open_index_in_forked_editor(idx, typ); } } } #endif } void menu_open_hierarchy(gpointer null_data, guint callback_action, GtkWidget *widget) { menu_open_hierarchy_2(null_data, callback_action, widget, FST_MT_MIN); /* zero for regular open */ } void menu_open_hierarchy_source(gpointer null_data, guint callback_action, GtkWidget *widget) { menu_open_hierarchy_2(null_data, callback_action, widget, FST_MT_SOURCESTEM); /* for definition source */ } void menu_open_hierarchy_isource(gpointer null_data, guint callback_action, GtkWidget *widget) { menu_open_hierarchy_2(null_data, callback_action, widget, FST_MT_SOURCEISTEM); /* for instantiation source */ } void menu_open_sst_hierarchy_source(gpointer null_data, guint callback_action, GtkWidget *widget) { menu_open_hierarchy_2a(null_data, callback_action, widget, FST_MT_SOURCESTEM); /* for definition source */ } void menu_open_sst_hierarchy_isource(gpointer null_data, guint callback_action, GtkWidget *widget) { menu_open_hierarchy_2a(null_data, callback_action, widget, FST_MT_SOURCEISTEM); /* for instantiation source */ } /**/ #if WAVE_USE_GTK2 void menu_recurse_import(gpointer null_data, guint callback_action, GtkWidget *widget) { (void) null_data; recurse_import(widget, callback_action); } #endif /**/ static void dataformat(int mask, int patch) { Trptr t; int fix=0; if((t=GLOBALS->traces.first)) { while(t) { if(IsSelected(t)&&!IsShadowed(t)) { t->minmax_valid = 0; /* force analog traces to regenerate if necessary */ t->flags=((t->flags)&mask)|patch; fix=1; } t=t->t_next; } if(fix) { GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } } void menu_dataformat_ascii(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-ASCII"); help_text( " will step through all highlighted traces and ensure that" " vectors with this qualifier will be displayed with ASCII" " values." ); return; } dataformat( ~(TR_NUMMASK|TR_ANALOGMASK), TR_ASCII ); } void menu_dataformat_real(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-BitsToReal"); help_text( " will step through all highlighted traces and ensure that" " vectors with this qualifier will be displayed with Real" " values. Note that this only works for 64-bit quantities" " and that ones of other sizes will display as binary." ); return; } dataformat( ~(TR_NUMMASK), TR_REAL ); } void menu_dataformat_real2bon(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-RealToBits On"); help_text( " will step through all highlighted traces and ensure that" " Real vectors with this qualifier will be displayed as Hex" " values. Note that this only works for Real quantities" " and other ones will remain to display as binary. This is a pre-filter" " so it is possible to invert, reverse, apply Decimal, etc. It will not be" " possible however to expand those values into their constituent bits." ); return; } dataformat( ~(TR_REAL2BITS|TR_NUMMASK|TR_ANALOGMASK), TR_REAL2BITS|TR_HEX ); } void menu_dataformat_real2boff(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-RealToBits Off"); help_text( " will step through all highlighted traces and ensure that" " the Real To Bits qualifier is removed from those traces." ); return; } dataformat( ~(TR_REAL2BITS|TR_ANALOGMASK), 0 ); } void menu_dataformat_hex(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-Hex"); help_text( " will step through all highlighted traces and ensure that" " vectors with this qualifier will be displayed with hexadecimal" " values." ); return; } dataformat( ~(TR_NUMMASK), TR_HEX ); } void menu_dataformat_dec(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-Decimal"); help_text( " will step through all highlighted traces and ensure that" " vectors with this qualifier will be displayed with decimal" " values." ); return; } dataformat( ~(TR_NUMMASK), TR_DEC ); } void menu_dataformat_signed(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-Signed"); help_text( " will step through all highlighted traces and ensure that" " vectors with this qualifier will be displayed as sign extended decimal" " values." ); return; } dataformat( ~(TR_NUMMASK), TR_SIGNED ); } void menu_dataformat_bin(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-Binary"); help_text( " will step through all highlighted traces and ensure that" " vectors with this qualifier will be displayed with binary" " values." ); return; } dataformat( ~(TR_NUMMASK), TR_BIN ); } void menu_dataformat_oct(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-Octal"); help_text( " will step through all highlighted traces and ensure that" " vectors with this qualifier will be displayed with octal" " values." ); return; } dataformat( ~(TR_NUMMASK), TR_OCT ); } void menu_dataformat_rjustify_on(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-Right Justify-On"); help_text( " will step through all highlighted traces and ensure that" " vectors with this qualifier will be displayed right" " justified." ); return; } dataformat( ~(TR_RJUSTIFY), TR_RJUSTIFY ); } void menu_dataformat_rjustify_off(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-Right Justify-Off"); help_text( " will step through all highlighted traces and ensure that" " vectors with this qualifier will not be displayed right" " justified." ); return; } dataformat( ~(TR_RJUSTIFY), 0 ); } void menu_dataformat_bingray_on(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-Gray Filters-To Gray"); help_text( " will step through all highlighted traces and ensure that" " bits and vectors with this qualifier will be displayed after" " going through normal to gray conversion. This is a filter" " which sits before other Data Format options such as hex, etc." ); return; } dataformat( ~(TR_GRAYMASK|TR_ANALOGMASK), TR_BINGRAY ); } void menu_dataformat_graybin_on(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-Gray Filters-From Gray"); help_text( " will step through all highlighted traces and ensure that" " bits and vectors with this qualifier will be displayed after" " going through gray to normal conversion. This is a filter" " which sits before other Data Format options such as hex, etc." ); return; } dataformat( ~(TR_GRAYMASK|TR_ANALOGMASK), TR_GRAYBIN ); } void menu_dataformat_nogray(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-Gray Filters-None"); help_text( " will step through all highlighted traces and ensure that" " bits and vectors with this qualifier will be displayed with" " normal encoding." ); return; } dataformat( ~(TR_GRAYMASK|TR_ANALOGMASK), 0 ); } void menu_dataformat_popcnt_on(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-Popcnt-On"); help_text( " will step through all highlighted traces and ensure that" " bits and vectors with this qualifier will be displayed after" " going through a population (one's) count conversion. This is a filter" " which sits before other Data Format options such as hex, etc." ); return; } dataformat( ~(TR_POPCNT), TR_POPCNT ); } void menu_dataformat_popcnt_off(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-Popcnt-Off"); help_text( " will step through all highlighted traces and ensure that" " bits and vectors with this qualifier will be displayed with" " normal encoding." ); return; } dataformat( ~(TR_POPCNT), 0 ); } void menu_dataformat_fpshift_on(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-Fixed Point Shift-On"); help_text( " will step through all highlighted traces and ensure that" " bits and vectors with this qualifier will be right shifted" " prior to being displayed as Signed Decimal or Decimal values." ); return; } dataformat( ~(TR_FPDECSHIFT), TR_FPDECSHIFT ); } void menu_dataformat_fpshift_off(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-Fixed Point Shift-Off"); help_text( " will step through all highlighted traces and ensure that" " bits and vectors with this qualifier will not be right shifted" " prior to being displayed as Signed Decimal or Decimal values." ); return; } dataformat( ~(TR_FPDECSHIFT), 0 ); } static void menu_dataformat_fpshift_specify_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; Trptr t; int fix=0; int shamt = GLOBALS->entrybox_text ? atoi(GLOBALS->entrybox_text) : 0; int mask = ~(TR_FPDECSHIFT); int patch = TR_FPDECSHIFT; if((shamt < 0)||(shamt > 255)) { shamt = 0; patch = 0; } if((t=GLOBALS->traces.first)) { while(t) { if(IsSelected(t)&&!IsShadowed(t)) { t->minmax_valid = 0; /* force analog traces to regenerate if necessary */ t->t_fpdecshift = shamt; t->flags=((t->flags)&mask)|patch; fix=1; } t=t->t_next; } if(fix) { GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } if(GLOBALS->entrybox_text) { free_2(GLOBALS->entrybox_text); GLOBALS->entrybox_text=NULL; } GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } void menu_dataformat_fpshift_specify(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-Fixed Point Shift-Specify"); help_text( " will open up a requester to specify a shift count then" " will step through all highlighted traces and ensure that" " bits and vectors with this qualifier will be right shifted" " prior to being displayed as Signed Decimal or Decimal values." ); return; } entrybox("Fixed Point Shift Specify",300,"",NULL,128,GTK_SIGNAL_FUNC(menu_dataformat_fpshift_specify_cleanup)); dataformat( ~(TR_FPDECSHIFT), 0 ); } void menu_dataformat_invert_on(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-Invert-On"); help_text( " will step through all highlighted traces and ensure that" " bits and vectors with this qualifier will be displayed with" " 1's and 0's inverted." ); return; } dataformat( ~(TR_INVERT), TR_INVERT ); } void menu_dataformat_invert_off(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-Invert-Off"); help_text( " will step through all highlighted traces and ensure that" " bits and vectors with this qualifier will not be displayed with" " 1's and 0's inverted." ); return; } dataformat( ~(TR_INVERT), 0 ); } void menu_dataformat_reverse_on(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-Reverse Bits-On"); help_text( " will step through all highlighted traces and ensure that" " vectors with this qualifier will be displayed in" " reversed bit order." ); return; } dataformat( ~(TR_REVERSE), TR_REVERSE ); } void menu_dataformat_reverse_off(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-Reverse Bits-Off"); help_text( " will step through all highlighted traces and ensure that" " vectors with this qualifier will not be displayed in" " reversed bit order." ); return; } dataformat( ~(TR_REVERSE), 0 ); } void menu_dataformat_exclude_on(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nExclude"); help_text( " causes the waveform data for all currently highlighted traces" " to be blanked out." ); return; } dataformat( ~(TR_EXCLUDE), TR_EXCLUDE ); } void menu_dataformat_exclude_off(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nShow"); help_text( " causes the waveform data for all currently highlighted traces" " to be displayed as normal if the exclude attribute is currently" " set on the highlighted traces." ); return; } dataformat( ~(TR_EXCLUDE), 0 ); } /**/ void menu_dataformat_rangefill_zero(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-Range Fill With 0s"); help_text( " will step through all highlighted traces and ensure that" " vectors with this qualifier will be displayed as if" " the bitrange of the MSB or LSB as appropriate goes to zero." " Zero bits will be filled in for the missing bits." ); return; } dataformat( ~(TR_ZEROFILL|TR_ONEFILL|TR_ANALOGMASK), TR_ZEROFILL ); } void menu_dataformat_rangefill_one(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-Range Fill With 1s"); help_text( " will step through all highlighted traces and ensure that" " vectors with this qualifier will be displayed as if" " the bitrange of the MSB or LSB as appropriate goes to zero." " One bits will be filled in for the missing bits; this is mostly intended" " to be used when viewing values which are inverted in the logic and need" " to be inverted in the viewer." ); return; } dataformat( ~(TR_ZEROFILL|TR_ONEFILL|TR_ANALOGMASK), TR_ONEFILL ); } void menu_dataformat_rangefill_off(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nData Format-Zero Range Fill Off"); help_text( " will step through all highlighted traces and ensure that" " normal bitrange displays are used." ); return; } dataformat( ~(TR_ZEROFILL|TR_ONEFILL|TR_ANALOGMASK), 0 ); } /**/ void menu_dataformat_analog_off(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nAnalog Off"); help_text( " causes the waveform data for all currently highlighted traces" " to be displayed as normal." ); return; } dataformat( ~(TR_ANALOGMASK), 0 ); } void menu_dataformat_analog_step(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nAnalog Step"); help_text( " causes the waveform data for all currently highlighted traces" " to be displayed as stepwise analog waveform." ); return; } dataformat( ~(TR_ANALOGMASK), TR_ANALOG_STEP ); } void menu_dataformat_analog_interpol(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nAnalog Interpolate"); help_text( " causes the waveform data for all currently highlighted traces" " to be displayed as interpolated analog waveform." ); return; } dataformat( ~(TR_ANALOGMASK), TR_ANALOG_INTERPOLATED ); } void menu_dataformat_analog_interpol_step(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nAnalog Interpolate Annotated"); help_text( " causes the waveform data for all currently highlighted traces" " to be displayed as an interpolated analog waveform annotated" " with the non-interpolated data sampling points that the cursor snaps to." ); return; } dataformat( ~(TR_ANALOGMASK), (TR_ANALOG_INTERPOLATED|TR_ANALOG_STEP) ); } void menu_dataformat_analog_resize_screen(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nAnalog Resizing Screen Data"); help_text( " causes the waveform data for all currently highlighted traces" " to be displayed such that the y-value scaling maximizes the on-screen trace" " data so if fills the whole trace width at all times." ); return; } dataformat( ~(TR_ANALOG_FULLSCALE), 0 ); } void menu_dataformat_analog_resize_all(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nAnalog Resizing All Data"); help_text( " causes the waveform data for all currently highlighted traces" " to be displayed such that the y-value scaling maximizes the on-screen trace" " data so if fills the whole trace width only when fully zoomed out." " (i.e., the scale used goes across all trace data)" ); return; } dataformat( ~(TR_ANALOG_FULLSCALE), (TR_ANALOG_FULLSCALE) ); } /**/ void menu_dataformat_highlight_all(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; Trptr t; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nHighlight All"); help_text( " simply highlights all displayed traces." ); return; } if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ if((t=GLOBALS->traces.first)) { while(t) { t->flags|=TR_HIGHLIGHT; t=t->t_next; } signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } void menu_dataformat_unhighlight_all(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; Trptr t; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nUnHighlight All"); help_text( " simply unhighlights all displayed traces." ); return; } if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ if((t=GLOBALS->traces.first)) { while(t) { t->flags&=(~TR_HIGHLIGHT); t=t->t_next; } signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } void menu_lexize(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nSigsort All"); help_text( " sorts all displayed traces with the numeric parts being taken into account. Blank traces are sorted to the bottom." ); return; } if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ if(GLOBALS->traces.first) { if(TracesReorder(TR_SORT_LEX)) { signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } } /**/ void menu_alphabetize(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nAlphabetize All"); help_text( " alphabetizes all displayed traces. Blank traces are sorted to the bottom." ); return; } if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ if(GLOBALS->traces.first) { if(TracesReorder(TR_SORT_NORM)) { signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } } /**/ void menu_alphabetize2(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nAlphabetize All (CaseIns)"); help_text( " alphabetizes all displayed traces without regard to case. Blank traces are sorted to the bottom." ); return; } if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ if(GLOBALS->traces.first) { if(TracesReorder(TR_SORT_INS)) { signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } } /**/ void menu_reverse(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nReverse All"); help_text( " reverses all displayed traces unconditionally." ); return; } if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ if(GLOBALS->traces.first) { if(TracesReorder(TR_SORT_RVS)) { signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } } /**/ void menu_cut_traces(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; Trptr cutbuffer = NULL; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nCut"); help_text( " removes highlighted signals from the display and places them" " in an offscreen cut/copy buffer for later Paste operations. " " Cut implicitly destroys the previous contents of the cut/copy buffer." ); return; } if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ DEBUG(printf("Cut Traces\n")); cutbuffer = CutBuffer(); if(cutbuffer) { if(GLOBALS->cutcopylist) { free_2(GLOBALS->cutcopylist); } GLOBALS->cutcopylist = emit_gtkwave_savefile_formatted_entries_in_tcl_list(cutbuffer, FALSE); /* printf("Cutlist: '%s'\n", GLOBALS->cutcopylist); */ MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } else { must_sel(); } } void menu_delete_traces(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; int num_cut; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nDelete"); help_text( " removes highlighted signals from the display and discards them" " without affecting the previous contents of the cut/copy buffer." ); return; } if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ DEBUG(printf("Delete Traces\n")); num_cut = DeleteBuffer(); if(num_cut) { MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } else { must_sel(); } } void menu_copy_traces(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; Trptr t = GLOBALS->traces.first; gboolean highlighted = FALSE; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nCopy"); help_text( " copies highlighted signals from the display and places them" " in an offscreen cut/copy buffer for later Paste operations. " " Copy implicitly destroys the previous contents of the cut/copy buffer." ); return; } if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ DEBUG(printf("Copy Traces\n")); while(t) { if(t->flags & TR_HIGHLIGHT) { highlighted = TRUE; break; } t = t->t_next; } if(!highlighted) { must_sel(); } else { if(GLOBALS->cutcopylist) { free_2(GLOBALS->cutcopylist); } GLOBALS->cutcopylist = emit_gtkwave_savefile_formatted_entries_in_tcl_list(GLOBALS->traces.first, TRUE); /* printf("Copylist: '%s'\n", GLOBALS->cutcopylist); */ FreeCutBuffer(); } } void menu_paste_traces(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nPaste"); help_text( " pastes signals from" " an offscreen cut/copy buffer and places them in a group after" " the last highlighted signal, or at the end of the display" " if no signal is highlighted." ); return; } if(GLOBALS->dnd_state) { dnd_error(); return; } /* don't mess with sigs when dnd active */ DEBUG(printf("Paste Traces\n")); if(PasteBuffer()) { GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } else { if(GLOBALS->cutcopylist) { /*int num_traces =*/ process_tcl_list(GLOBALS->cutcopylist, FALSE); /* printf("Pastelist: %d '%s'\n", num_traces, GLOBALS->cutcopylist); */ GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } } /**/ void menu_center_zooms(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nCenter Zooms"); help_text( " when enabled" " configures zoom in/out operations such that all zooms use the center of the" " display as the fixed zoom origin if the primary (unnamed) marker is" " not present, otherwise, the primary marker is used as the center origin." " When disabled, it" " configures zoom in/out operations such that all zooms use the" " left margin of the display as the fixed zoom origin." ); } else { #ifndef WAVE_USE_MLIST_T GLOBALS->do_zoom_center=(GLOBALS->do_zoom_center)?0:1; #else GLOBALS->do_zoom_center = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VCZ])); #endif DEBUG(printf("Center Zooms\n")); } #ifndef WAVE_USE_MLIST_T GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VCZ].path))->active=(GLOBALS->do_zoom_center)?TRUE:FALSE; #endif } void menu_show_base(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nShow Base Symbols"); help_text( " enables the display of leading base symbols ('$' for hex," " '%' for binary, '#' for octal if they are turned off and" " disables the drawing of leading base symbols if" " they are turned on." " Base symbols are displayed by default." ); } else { #ifndef WAVE_USE_MLIST_T GLOBALS->show_base=(GLOBALS->show_base)?0:~0; #else GLOBALS->show_base = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VSBS])); #endif GLOBALS->signalwindow_width_dirty=1; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); DEBUG(printf("Show Base Symbols\n")); } #ifndef WAVE_USE_MLIST_T GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VSBS].path))->active=(GLOBALS->show_base)?TRUE:FALSE; #endif } /**/ void menu_show_grid(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nShow Grid"); help_text( " toggles the drawing of gridlines in the waveform display." ); } else { #ifndef WAVE_USE_MLIST_T GLOBALS->display_grid=(GLOBALS->display_grid)?0:~0; #else GLOBALS->display_grid = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VSG])); #endif if(GLOBALS->wave_hslider) { gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)),"changed"); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)),"value_changed"); } DEBUG(printf("Show Grid\n")); } #ifndef WAVE_USE_MLIST_T GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VSG].path))->active=(GLOBALS->display_grid)?TRUE:FALSE; #endif } /**/ void menu_show_wave_highlight(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nShow Wave Highlight"); help_text( " toggles the drawing of highlighted waveforms (instead of gridlines) in the waveform display." ); } else { #ifndef WAVE_USE_MLIST_T GLOBALS->highlight_wavewindow=(GLOBALS->highlight_wavewindow)?0:~0; #else GLOBALS->highlight_wavewindow = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_SHW])); #endif if(GLOBALS->wave_hslider) { gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)),"changed"); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)),"value_changed"); } DEBUG(printf("Show Wave Highlight\n")); } #ifndef WAVE_USE_MLIST_T GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_SHW].path))->active=(GLOBALS->highlight_wavewindow)?TRUE:FALSE; #endif } /**/ void menu_show_filled_high_values(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nShow Filled High Values"); help_text( " toggles the drawing of filled in 1/H values in the waveform display." ); } else { #ifndef WAVE_USE_MLIST_T GLOBALS->fill_waveform=(GLOBALS->fill_waveform)?0:~0; #else GLOBALS->fill_waveform = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_FILL1])); #endif if(GLOBALS->wave_hslider) { gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)),"changed"); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)),"value_changed"); } DEBUG(printf("Show Filled High Values\n")); } #ifndef WAVE_USE_MLIST_T GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_FILL1].path))->active=(GLOBALS->fill_waveform)?TRUE:FALSE; #endif } /**/ void menu_show_mouseover(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nShow Mouseover"); help_text( " toggles the dynamic tooltip for signal names and values which follow the marker on mouse button presses in the waveform display." " This is useful for examining the values of closely packed value changes without having to zoom outward and without having to" " refer to the signal name pane to the left. Note that an encoded string will be displayed next to the signal name that" " indicates what data format flags are currently active for that signal. Flags are as follows:\n" " + = Signed Decimal\n" " X = Hexadecimal\n" " A = ASCII\n" " D = Decimal\n" " B = Binary\n" " O = Octal\n" " J = Right Justify\n" " ~ = Invert\n" " V = Reverse\n" " * = Analog Step+Interpolated\n" " S = Analog Step\n" " I = Analog Interpolated\n" " R = Real\n" " r = Real to Bits\n" " 0 = Range Fill with 0s\n" " 1 = Range Fill with 1s\n" " G = Binary to Gray\n" " g = Gray to Binary\n" " F = File Filter\n" " P = Process Filter\n" " T = Transaction Filter\n" " p = Population Count\n" " s = Fixed Point Shift (count)\n" ); } else { GLOBALS->disable_mouseover=(GLOBALS->disable_mouseover)?0:~0; DEBUG(printf("Show Mouseover\n")); } #ifndef WAVE_USE_MLIST_T GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VSMO].path))->active=(GLOBALS->disable_mouseover)?FALSE:TRUE; #else GLOBALS->disable_mouseover = !gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VSMO])); #endif } /**/ #ifdef WAVE_USE_GTK2 void menu_clipboard_mouseover(gpointer null_data, guint callback_action, GtkWidget *widget) { (void)null_data; (void)callback_action; (void)widget; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nMouseover Copies To Clipboard"); help_text( " toggles automatic copying to the clipboard of mouseover values. Requires that Show Mouseover is enabled.\n" ); } else { GLOBALS->clipboard_mouseover=(GLOBALS->clipboard_mouseover)?0:~0; DEBUG(printf("Mouseover Copies To Clipboard\n")); } #ifndef WAVE_USE_MLIST_T GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VSMC].path))->active=(GLOBALS->clipboard_mouseover)?TRUE:FALSE; #else GLOBALS->clipboard_mouseover = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VSMC])); #endif } #endif /**/ /* this is the GtkMenuEntry structure used to create new menus. The * first member is the menu definition string. The second, the * default accelerator key used to access this menu function with * the keyboard. The third is the callback function to call when * this menu item is selected (by the accelerator key, or with the * mouse.) The last member is the data to pass to your callback function. * * ...This has all been changed to use itemfactory stuff which is more * powerful. The only real difference is the final item which tells * the itemfactory just what the item "is". */ #ifdef WAVE_USE_MENU_BLACKOUTS static const char *menu_blackouts[] = { "/Edit", "/Search", "/Time", "/Markers", "/View" }; #endif static gtkwave_mlist_t menu_items[] = { WAVE_GTKIFE("/File/Open New Window", "N", menu_new_viewer, WV_MENU_FONV, ""), WAVE_GTKIFE("/File/Open New Tab", "T", menu_new_viewer_tab, WV_MENU_FONVT, ""), WAVE_GTKIFE("/File/Reload Waveform", "R", menu_reload_waveform, WV_MENU_FRW, ""), WAVE_GTKIFE("/File/Export/Write VCD File As", NULL, menu_write_vcd_file, WV_MENU_WRVCD, ""), WAVE_GTKIFE("/File/Export/Write LXT File As", NULL, menu_write_lxt_file, WV_MENU_WRLXT, ""), WAVE_GTKIFE("/File/Export/Write TIM File As", NULL, menu_write_tim_file, WV_MENU_WRTIM, ""), WAVE_GTKIFE("/File/Close", "W", menu_quit_close, WV_MENU_WCLOSE, ""), WAVE_GTKIFE("/File/", NULL, NULL, WV_MENU_SEP2VCD, ""), WAVE_GTKIFE("/File/Print To File", "P", menu_print, WV_MENU_FPTF, ""), #if GTK_CHECK_VERSION(2,14,0) WAVE_GTKIFE("/File/Grab To File", NULL, menu_write_screengrab_as, WV_MENU_SGRAB, ""), #endif WAVE_GTKIFE("/File/", NULL, NULL, WV_MENU_SEP1, ""), WAVE_GTKIFE("/File/Read Save File", "O", menu_read_save_file, WV_MENU_FRSF, ""), WAVE_GTKIFE("/File/Write Save File", "S", menu_write_save_file, WV_MENU_FWSF, ""), WAVE_GTKIFE("/File/Write Save File As", "S", menu_write_save_file_as, WV_MENU_FWSFAS, ""), WAVE_GTKIFE("/File/", NULL, NULL, WV_MENU_SEP2, ""), WAVE_GTKIFE("/File/Read Sim Logfile", "L", menu_read_log_file, WV_MENU_FRLF, ""), /* 10 */ WAVE_GTKIFE("/File/", NULL, NULL, WV_MENU_SEP2LF, ""), #if !defined _MSC_VER WAVE_GTKIFE("/File/Read Verilog Stemsfile", NULL, menu_read_stems_file, WV_MENU_FRSTMF, ""), WAVE_GTKIFE("/File/", NULL, NULL, WV_MENU_SEP2STMF, ""), #endif #if defined(HAVE_LIBTCL) WAVE_GTKIFE("/File/Read Tcl Script File", NULL, menu_read_script_file, WV_MENU_TCLSCR, ""), WAVE_GTKIFE("/File/", NULL, NULL, WV_MENU_TCLSEP, ""), #endif WAVE_GTKIFE("/File/Quit", "Q", menu_quit, WV_MENU_FQY, ""), WAVE_GTKIFE("/Edit/Set Trace Max Hier", NULL, menu_set_max_hier, WV_MENU_ESTMH, ""), WAVE_GTKIFE("/Edit/Toggle Trace Hier", "H", menu_toggle_hier, WV_MENU_ETH, ""), WAVE_GTKIFE("/Edit/", NULL, NULL, WV_MENU_SEP3, ""), WAVE_GTKIFE("/Edit/Insert Blank", "B", menu_insert_blank_traces, WV_MENU_EIB, ""), WAVE_GTKIFE("/Edit/Insert Comment", NULL, menu_insert_comment_traces, WV_MENU_EIC, ""), WAVE_GTKIFE("/Edit/Insert Analog Height Extension", NULL, menu_insert_analog_height_extension, WV_MENU_EIA, ""), #ifdef MAC_INTEGRATION WAVE_GTKIFE("/Edit/Cut", NULL, menu_cut_traces, WV_MENU_EC, ""), WAVE_GTKIFE("/Edit/Copy", NULL, menu_copy_traces, WV_MENU_ECY, ""), WAVE_GTKIFE("/Edit/Paste", NULL, menu_paste_traces, WV_MENU_EP, ""), WAVE_GTKIFE("/Edit/Delete", NULL, menu_delete_traces, WV_MENU_DEL, ""), #else WAVE_GTKIFE("/Edit/Cut", "X", menu_cut_traces, WV_MENU_EC, ""), WAVE_GTKIFE("/Edit/Copy", "C", menu_copy_traces, WV_MENU_ECY, ""), WAVE_GTKIFE("/Edit/Paste", "V", menu_paste_traces, WV_MENU_EP, ""), WAVE_GTKIFE("/Edit/Delete", "Delete", menu_delete_traces, WV_MENU_DEL, ""), #endif WAVE_GTKIFE("/Edit/", NULL, NULL, WV_MENU_SEP3A, ""), WAVE_GTKIFE("/Edit/Alias Highlighted Trace", "A", menu_alias, WV_MENU_EAHT, ""), WAVE_GTKIFE("/Edit/Remove Highlighted Aliases", "A", menu_remove_aliases, WV_MENU_ERHA, ""), /* 20 */ WAVE_GTKIFE("/Edit/", NULL, NULL, WV_MENU_SEP4, ""), WAVE_GTKIFE("/Edit/Expand", "F3", menu_expand, WV_MENU_EE, ""), WAVE_GTKIFE("/Edit/Combine Down", "F4", menu_combine_down, WV_MENU_ECD, ""), WAVE_GTKIFE("/Edit/Combine Up", "F5", menu_combine_up, WV_MENU_ECU, ""), WAVE_GTKIFE("/Edit/", NULL, NULL, WV_MENU_SEP5, ""), WAVE_GTKIFE("/Edit/Data Format/Hex", "X", menu_dataformat_hex, WV_MENU_EDFH, ""), WAVE_GTKIFE("/Edit/Data Format/Decimal", "D", menu_dataformat_dec, WV_MENU_EDFD, ""), /* 30 */ WAVE_GTKIFE("/Edit/Data Format/Signed Decimal", NULL, menu_dataformat_signed, WV_MENU_EDFSD, ""), WAVE_GTKIFE("/Edit/Data Format/Binary", "B", menu_dataformat_bin, WV_MENU_EDFB, ""), WAVE_GTKIFE("/Edit/Data Format/Octal", "O", menu_dataformat_oct, WV_MENU_EDFO, ""), WAVE_GTKIFE("/Edit/Data Format/ASCII", NULL, menu_dataformat_ascii, WV_MENU_EDFA, ""), WAVE_GTKIFE("/Edit/Data Format/BitsToReal", NULL, menu_dataformat_real, WV_MENU_EDRL, ""), WAVE_GTKIFE("/Edit/Data Format/RealToBits/On", NULL, menu_dataformat_real2bon, WV_MENU_EDR2BON, ""), WAVE_GTKIFE("/Edit/Data Format/RealToBits/Off", NULL, menu_dataformat_real2boff, WV_MENU_EDR2BOFF, ""), WAVE_GTKIFE("/Edit/Data Format/Right Justify/On", "J", menu_dataformat_rjustify_on, WV_MENU_EDFRJON, ""), WAVE_GTKIFE("/Edit/Data Format/Right Justify/Off", "J", menu_dataformat_rjustify_off, WV_MENU_EDFRJOFF, ""), WAVE_GTKIFE("/Edit/Data Format/Invert/On", "I", menu_dataformat_invert_on, WV_MENU_EDFION, ""), WAVE_GTKIFE("/Edit/Data Format/Invert/Off", "I", menu_dataformat_invert_off, WV_MENU_EDFIOFF, ""), WAVE_GTKIFE("/Edit/Data Format/Reverse Bits/On", "V", menu_dataformat_reverse_on, WV_MENU_EDFRON, ""), /* 40 */ WAVE_GTKIFE("/Edit/Data Format/Reverse Bits/Off", "V", menu_dataformat_reverse_off, WV_MENU_EDFROFF, ""), WAVE_GTKIFE("/Edit/Data Format/Translate Filter File/Disable", NULL, menu_dataformat_xlate_file_0, WV_MENU_XLF_0, ""), WAVE_GTKIFE("/Edit/Data Format/Translate Filter File/Enable and Select", NULL, menu_dataformat_xlate_file_1, WV_MENU_XLF_1, ""), WAVE_GTKIFE("/Edit/Data Format/Translate Filter Process/Disable", NULL, menu_dataformat_xlate_proc_0, WV_MENU_XLP_0, ""), WAVE_GTKIFE("/Edit/Data Format/Translate Filter Process/Enable and Select", NULL, menu_dataformat_xlate_proc_1, WV_MENU_XLP_1, ""), WAVE_GTKIFE("/Edit/Data Format/Transaction Filter Process/Disable", NULL, menu_dataformat_xlate_ttrans_0, WV_MENU_TTXLP_0, ""), WAVE_GTKIFE("/Edit/Data Format/Transaction Filter Process/Enable and Select", NULL, menu_dataformat_xlate_ttrans_1, WV_MENU_TTXLP_1, ""), WAVE_GTKIFE("/Edit/Data Format/Analog/Off", NULL, menu_dataformat_analog_off, WV_MENU_EDFAOFF, ""), WAVE_GTKIFE("/Edit/Data Format/Analog/Step", NULL, menu_dataformat_analog_step, WV_MENU_EDFASTEP, ""), WAVE_GTKIFE("/Edit/Data Format/Analog/Interpolated", NULL, menu_dataformat_analog_interpol, WV_MENU_EDFAINTERPOL, ""), WAVE_GTKIFE("/Edit/Data Format/Analog/Interpolated Annotated", NULL, menu_dataformat_analog_interpol_step, WV_MENU_EDFAINTERPOL2, ""), WAVE_GTKIFE("/Edit/Data Format/Analog/Resizing/Screen Data", NULL, menu_dataformat_analog_resize_screen, WV_MENU_EDFARSD, ""), WAVE_GTKIFE("/Edit/Data Format/Analog/Resizing/All Data", NULL, menu_dataformat_analog_resize_all, WV_MENU_EDFARAD, ""), WAVE_GTKIFE("/Edit/Data Format/Range Fill/With 0s", NULL, menu_dataformat_rangefill_zero, WV_MENU_RFILL0, ""), WAVE_GTKIFE("/Edit/Data Format/Range Fill/With 1s", NULL, menu_dataformat_rangefill_one, WV_MENU_RFILL1, ""), WAVE_GTKIFE("/Edit/Data Format/Range Fill/Off", NULL, menu_dataformat_rangefill_off, WV_MENU_RFILLOFF, ""), WAVE_GTKIFE("/Edit/Data Format/Gray Filters/To Gray", NULL, menu_dataformat_bingray_on, WV_MENU_B2G, ""), WAVE_GTKIFE("/Edit/Data Format/Gray Filters/From Gray", NULL, menu_dataformat_graybin_on, WV_MENU_G2B, ""), WAVE_GTKIFE("/Edit/Data Format/Gray Filters/None", NULL, menu_dataformat_nogray, WV_MENU_GBNONE, ""), WAVE_GTKIFE("/Edit/Data Format/Popcnt/On", NULL, menu_dataformat_popcnt_on, WV_MENU_POPON, ""), WAVE_GTKIFE("/Edit/Data Format/Popcnt/Off", NULL, menu_dataformat_popcnt_off, WV_MENU_POPOFF, ""), WAVE_GTKIFE("/Edit/Data Format/Fixed Point Shift/On", NULL, menu_dataformat_fpshift_on, WV_MENU_FPSHIFTON, ""), WAVE_GTKIFE("/Edit/Data Format/Fixed Point Shift/Off", NULL, menu_dataformat_fpshift_off, WV_MENU_FPSHIFTOFF, ""), WAVE_GTKIFE("/Edit/Data Format/Fixed Point Shift/Specify", NULL, menu_dataformat_fpshift_specify, WV_MENU_FPSHIFTVAL, ""), WAVE_GTKIFE("/Edit/Color Format/Normal", NULL, menu_colorformat_0, WV_MENU_CLRFMT0, ""), WAVE_GTKIFE("/Edit/Color Format/Red", NULL, menu_colorformat_1, WV_MENU_CLRFMT1, ""), WAVE_GTKIFE("/Edit/Color Format/Orange", NULL, menu_colorformat_2, WV_MENU_CLRFMT2, ""), WAVE_GTKIFE("/Edit/Color Format/Yellow", NULL, menu_colorformat_3, WV_MENU_CLRFMT3, ""), WAVE_GTKIFE("/Edit/Color Format/Green", NULL, menu_colorformat_4, WV_MENU_CLRFMT4, ""), WAVE_GTKIFE("/Edit/Color Format/Blue", NULL, menu_colorformat_5, WV_MENU_CLRFMT5, ""), WAVE_GTKIFE("/Edit/Color Format/Indigo", NULL, menu_colorformat_6, WV_MENU_CLRFMT6, ""), WAVE_GTKIFE("/Edit/Color Format/Violet", NULL, menu_colorformat_7, WV_MENU_CLRFMT7, ""), WAVE_GTKIFE("/Edit/Color Format/Cycle", NULL, menu_colorformat_cyc, WV_MENU_CLRFMTC, ""), WAVE_GTKIFE("/Edit/Color Format/", NULL, NULL, WV_MENU_SEP5A, ""), WAVE_GTKIFE("/Edit/Color Format/Keep xz Colors", NULL, menu_keep_xz_colors, WV_MENU_KEEPXZ, ""), WAVE_GTKIFE("/Edit/Show-Change All Highlighted", NULL, menu_showchangeall, WV_MENU_ESCAH, ""), WAVE_GTKIFE("/Edit/Show-Change First Highlighted", "F", menu_showchange, WV_MENU_ESCFH, ""), /* 50 */ WAVE_GTKIFE("/Edit/", NULL, NULL, WV_MENU_SEP6, ""), WAVE_GTKIFE("/Edit/Time Warp/Warp Marked", NULL, menu_warp_traces, WV_MENU_WARP, ""), WAVE_GTKIFE("/Edit/Time Warp/Unwarp Marked", NULL, menu_unwarp_traces, WV_MENU_UNWARP, ""), WAVE_GTKIFE("/Edit/Time Warp/Unwarp All", NULL, menu_unwarp_traces_all, WV_MENU_UNWARPA, ""), WAVE_GTKIFE("/Edit/", NULL, NULL, WV_MENU_SEP7A, ""), WAVE_GTKIFE("/Edit/Exclude", "E", menu_dataformat_exclude_on, WV_MENU_EEX, ""), WAVE_GTKIFE("/Edit/Show", "S", menu_dataformat_exclude_off, WV_MENU_ESH, ""), WAVE_GTKIFE("/Edit/", NULL, NULL, WV_MENU_SEP6A, ""), /* WAVE_GTKIFE("/Edit/Expand All Groups", "F12", menu_expand_all, WV_MENU_EXA, ""), */ /* WAVE_GTKIFE("/Edit/Collapse All Groups", "F12", menu_collapse_all, WV_MENU_CPA, ""), */ /* 60 */ WAVE_GTKIFE("/Edit/Toggle Group Open|Close", "T", menu_toggle_group, WV_MENU_TG, ""), WAVE_GTKIFE("/Edit/Create Group", "G", menu_create_group, WV_MENU_AG, ""), WAVE_GTKIFE("/Edit/", NULL, NULL, WV_MENU_SEP6A1, ""), WAVE_GTKIFE("/Edit/Highlight Regexp", "R", menu_regexp_highlight, WV_MENU_EHR, ""), WAVE_GTKIFE("/Edit/UnHighlight Regexp", "R", menu_regexp_unhighlight, WV_MENU_EUHR, ""), #ifdef MAC_INTEGRATION WAVE_GTKIFE("/Edit/Highlight All", NULL, menu_dataformat_highlight_all, WV_MENU_EHA, ""), WAVE_GTKIFE("/Edit/UnHighlight All", NULL, menu_dataformat_unhighlight_all, WV_MENU_EUHA, ""), #else WAVE_GTKIFE("/Edit/Highlight All", "A", menu_dataformat_highlight_all, WV_MENU_EHA, ""), WAVE_GTKIFE("/Edit/UnHighlight All", "A", menu_dataformat_unhighlight_all, WV_MENU_EUHA, ""), #endif WAVE_GTKIFE("/Edit/", NULL, NULL, WV_MENU_SEP6B, ""), WAVE_GTKIFE("/Edit/Sort/Alphabetize All", NULL, menu_alphabetize, WV_MENU_ALPHA, ""), WAVE_GTKIFE("/Edit/Sort/Alphabetize All (CaseIns)", NULL, menu_alphabetize2, WV_MENU_ALPHA2, ""), WAVE_GTKIFE("/Edit/Sort/Sigsort All", NULL, menu_lexize, WV_MENU_LEX, ""), WAVE_GTKIFE("/Edit/Sort/Reverse All", NULL, menu_reverse, WV_MENU_RVS, ""), /* 70 */ WAVE_GTKIFE("/Search/Pattern Search 1", NULL, menu_tracesearchbox, WV_MENU_SPS, ""), #ifdef WAVE_USE_GTK2 WAVE_GTKIFE("/Search/Pattern Search 2", NULL, menu_tracesearchbox, WV_MENU_SPS2, ""), #endif WAVE_GTKIFE("/Search/", NULL, NULL, WV_MENU_SEP7B, ""), WAVE_GTKIFE("/Search/Signal Search Regexp", "S", menu_signalsearch, WV_MENU_SSR, ""), WAVE_GTKIFE("/Search/Signal Search Hierarchy", "T", menu_hiersearch, WV_MENU_SSH, ""), WAVE_GTKIFE("/Search/Signal Search Tree", "T", menu_treesearch, WV_MENU_SST, ""), WAVE_GTKIFE("/Search/", NULL, NULL, WV_MENU_SEP7, ""), #if !defined __MINGW32__ && !defined _MSC_VER WAVE_GTKIFE("/Search/Open Source Definition", NULL, menu_open_hierarchy_source, WV_MENU_OPENHS, ""), WAVE_GTKIFE("/Search/Open Source Instantiation", NULL, menu_open_hierarchy_isource, WV_MENU_OPENIHS, ""), #endif WAVE_GTKIFE("/Search/Open Scope", NULL, menu_open_hierarchy, WV_MENU_OPENH, ""), WAVE_GTKIFE("/Search/", NULL, NULL, WV_MENU_SEP7D, ""), WAVE_GTKIFE("/Search/Autocoalesce", NULL, menu_autocoalesce, WV_MENU_ACOL, ""), WAVE_GTKIFE("/Search/Autocoalesce Reversal", NULL, menu_autocoalesce_reversal, WV_MENU_ACOLR, ""), WAVE_GTKIFE("/Search/Autoname Bundles", NULL, menu_autoname_bundles_on, WV_MENU_ABON, ""), WAVE_GTKIFE("/Search/Search Hierarchy Grouping", NULL, menu_hgrouping, WV_MENU_HTGP, ""), /* 80 */ WAVE_GTKIFE("/Search/", NULL, NULL, WV_MENU_SEP7C, ""), WAVE_GTKIFE("/Search/Set Pattern Search Repeat Count", NULL, menu_strace_repcnt, WV_MENU_STRSE, ""), WAVE_GTKIFE("/Time/Move To Time", "F1", menu_movetotime, WV_MENU_TMTT, ""), WAVE_GTKIFE("/Time/Zoom/Zoom Amount", "F2", menu_zoomsize, WV_MENU_TZZA, ""), WAVE_GTKIFE("/Time/Zoom/Zoom Base", "F2", menu_zoombase, WV_MENU_TZZB, ""), WAVE_GTKIFE("/Time/Zoom/Zoom In", "Z", service_zoom_in_marshal, WV_MENU_TZZI, ""), WAVE_GTKIFE("/Time/Zoom/Zoom Out", "Z", service_zoom_out_marshal, WV_MENU_TZZO, ""), WAVE_GTKIFE("/Time/Zoom/Zoom Full", "F", service_zoom_full_marshal, WV_MENU_TZZBFL, ""), WAVE_GTKIFE("/Time/Zoom/Zoom Best Fit", "F", service_zoom_fit_marshal, WV_MENU_TZZBF, ""), WAVE_GTKIFE("/Time/Zoom/Zoom To Start", "Home", service_zoom_left_marshal, WV_MENU_TZZTS, ""), WAVE_GTKIFE("/Time/Zoom/Zoom To End", "End", service_zoom_right_marshal, WV_MENU_TZZTE, ""), WAVE_GTKIFE("/Time/Zoom/Undo Zoom", "U", service_zoom_undo_marshal, WV_MENU_TZUZ, ""), /* 90 */ WAVE_GTKIFE("/Time/Fetch/Fetch Size", "F7", menu_fetchsize, WV_MENU_TFFS, ""), WAVE_GTKIFE("/Time/Fetch/Fetch ->", "2", fetch_right_marshal, WV_MENU_TFFR, ""), WAVE_GTKIFE("/Time/Fetch/Fetch <-", "1", fetch_left_marshal, WV_MENU_TFFL, ""), WAVE_GTKIFE("/Time/Discard/Discard ->", "4", discard_right_marshal, WV_MENU_TDDR, ""), WAVE_GTKIFE("/Time/Discard/Discard <-", "3", discard_left_marshal, WV_MENU_TDDL, ""), WAVE_GTKIFE("/Time/Shift/Shift ->", "6", service_right_shift_marshal, WV_MENU_TSSR, ""), WAVE_GTKIFE("/Time/Shift/Shift <-", "5", service_left_shift_marshal, WV_MENU_TSSL, ""), WAVE_GTKIFE("/Time/Page/Page ->", "8", service_right_page_marshal, WV_MENU_TPPR, ""), WAVE_GTKIFE("/Time/Page/Page <-", "7", service_left_page_marshal, WV_MENU_TPPL, ""), WAVE_GTKIFE("/Markers/Show-Change Marker Data", "M", menu_markerbox, WV_MENU_MSCMD, ""), /* 100 */ WAVE_GTKIFE("/Markers/Drop Named Marker", "N", drop_named_marker, WV_MENU_MDNM, ""), WAVE_GTKIFE("/Markers/Collect Named Marker", "N", collect_named_marker, WV_MENU_MCNM, ""), WAVE_GTKIFE("/Markers/Collect All Named Markers", "N", collect_all_named_markers, WV_MENU_MCANM, ""), #ifdef MAC_INTEGRATION WAVE_GTKIFE("/Markers/Copy Primary->B Marker", NULL, copy_pri_b_marker, WV_MENU_MCAB, ""), #else WAVE_GTKIFE("/Markers/Copy Primary->B Marker", "B", copy_pri_b_marker, WV_MENU_MCAB, ""), #endif WAVE_GTKIFE("/Markers/Delete Primary Marker", "M", delete_unnamed_marker, WV_MENU_MDPM, ""), WAVE_GTKIFE("/Markers/", NULL, NULL, WV_MENU_SEP8, ""), WAVE_GTKIFE("/Markers/Find Previous Edge", NULL, service_left_edge_marshal, WV_MENU_SLE, ""), WAVE_GTKIFE("/Markers/Find Next Edge", NULL, service_right_edge_marshal, WV_MENU_SRE, ""), WAVE_GTKIFE("/Markers/", NULL, NULL, WV_MENU_SEP8B, ""), WAVE_GTKIFE("/Markers/Alternate Wheel Mode", NULL, menu_altwheel, WV_MENU_HSWM, ""), WAVE_GTKIFE("/Markers/Wave Scrolling", "F9", wave_scrolling_on, WV_MENU_MWSON, ""), WAVE_GTKIFE("/Markers/Locking/Lock to Lesser Named Marker", "Q", lock_marker_left, WV_MENU_MLKLT, ""), WAVE_GTKIFE("/Markers/Locking/Lock to Greater Named Marker", "W", lock_marker_right, WV_MENU_MLKRT, ""), WAVE_GTKIFE("/Markers/Locking/Unlock from Named Marker", "O", unlock_marker, WV_MENU_MLKOFF, ""), WAVE_GTKIFE("/View/Show Grid", "G", menu_show_grid, WV_MENU_VSG, ""), WAVE_GTKIFE("/View/", NULL, NULL, WV_MENU_SEP9, ""), WAVE_GTKIFE("/View/Show Wave Highlight", NULL, menu_show_wave_highlight, WV_MENU_SHW, ""), WAVE_GTKIFE("/View/Show Filled High Values", NULL, menu_show_filled_high_values, WV_MENU_FILL1, ""), WAVE_GTKIFE("/View/", NULL, NULL, WV_MENU_SEP9B, ""), WAVE_GTKIFE("/View/Show Mouseover", NULL, menu_show_mouseover, WV_MENU_VSMO, ""), #ifdef WAVE_USE_GTK2 WAVE_GTKIFE("/View/Mouseover Copies To Clipboard", NULL, menu_clipboard_mouseover, WV_MENU_VSMC, ""), #endif WAVE_GTKIFE("/View/", NULL, NULL, WV_MENU_SEP9A, ""), WAVE_GTKIFE("/View/Show Base Symbols", "F1", menu_show_base, WV_MENU_VSBS, ""), WAVE_GTKIFE("/View/", NULL, NULL, WV_MENU_SEP10, ""), /* 110 */ WAVE_GTKIFE("/View/Standard Trace Select", NULL, menu_enable_standard_trace_select, WV_MENU_ESTS, ""), WAVE_GTKIFE("/View/", NULL, NULL, WV_MENU_SEP10A, ""), WAVE_GTKIFE("/View/Dynamic Resize", "9", menu_enable_dynamic_resize, WV_MENU_VDR, ""), WAVE_GTKIFE("/View/", NULL, NULL, WV_MENU_SEP11, ""), WAVE_GTKIFE("/View/Center Zooms", "F8", menu_center_zooms, WV_MENU_VCZ, ""), WAVE_GTKIFE("/View/", NULL, NULL, WV_MENU_SEP12, ""), WAVE_GTKIFE("/View/Toggle Delta-Frequency", NULL, menu_toggle_delta_or_frequency, WV_MENU_VTDF, ""), WAVE_GTKIFE("/View/Toggle Max-Marker", "F10", menu_toggle_max_or_marker, WV_MENU_VTMM, ""), WAVE_GTKIFE("/View/", NULL, NULL, WV_MENU_SEP13, ""), WAVE_GTKIFE("/View/Constant Marker Update", "F11", menu_enable_constant_marker_update, WV_MENU_VCMU, ""), WAVE_GTKIFE("/View/", NULL, NULL, WV_MENU_SEP14, ""), WAVE_GTKIFE("/View/Draw Roundcapped Vectors", "F2", menu_use_roundcaps, WV_MENU_VDRV, ""), /* 120 */ WAVE_GTKIFE("/View/", NULL, NULL, WV_MENU_SEP15, ""), WAVE_GTKIFE("/View/Left Justified Signals", "Home", menu_left_justify, WV_MENU_VLJS, ""), WAVE_GTKIFE("/View/Right Justified Signals", "End", menu_right_justify, WV_MENU_VRJS, ""), WAVE_GTKIFE("/View/", NULL, NULL, WV_MENU_SEP16, ""), WAVE_GTKIFE("/View/Zoom Pow10 Snap", "Pause", menu_zoom10_snap, WV_MENU_VZPS, ""), WAVE_GTKIFE("/View/Partial VCD Dynamic Zoom Full", NULL, menu_zoom_dynf, WV_MENU_VZDYN, ""), WAVE_GTKIFE("/View/Partial VCD Dynamic Zoom To End", NULL, menu_zoom_dyne, WV_MENU_VZDYNE, ""), WAVE_GTKIFE("/View/Full Precision", "Pause", menu_use_full_precision, WV_MENU_VFTP, ""), WAVE_GTKIFE("/View/", NULL, NULL, WV_MENU_SEP17, ""), WAVE_GTKIFE("/View/Define Time Ruler Marks", NULL, menu_def_ruler, WV_MENU_RULER, ""), WAVE_GTKIFE("/View/Remove Pattern Marks", NULL, menu_remove_marked, WV_MENU_RMRKS, ""), WAVE_GTKIFE("/View/", NULL, NULL, WV_MENU_SEP17A, ""), WAVE_GTKIFE("/View/Use Color", NULL, menu_use_color, WV_MENU_USECOLOR, ""), WAVE_GTKIFE("/View/Use Black and White", NULL, menu_use_bw, WV_MENU_USEBW, ""), WAVE_GTKIFE("/View/", NULL, NULL, WV_MENU_SEP18, ""), WAVE_GTKIFE("/View/LXT Clock Compress to Z", NULL, menu_lxt_clk_compress, WV_MENU_LXTCC2Z, ""), WAVE_GTKIFE("/View/", NULL, NULL, WV_MENU_SEP19, ""), WAVE_GTKIFE("/View/Scale To Time Dimension/None", NULL, menu_scale_to_td_x, WV_MENU_TDSCALEX, ""), WAVE_GTKIFE("/View/Scale To Time Dimension/sec", NULL, menu_scale_to_td_s, WV_MENU_TDSCALES, ""), WAVE_GTKIFE("/View/Scale To Time Dimension/ms", NULL, menu_scale_to_td_m, WV_MENU_TDSCALEM, ""), WAVE_GTKIFE("/View/Scale To Time Dimension/us", NULL, menu_scale_to_td_u, WV_MENU_TDSCALEU, ""), WAVE_GTKIFE("/View/Scale To Time Dimension/ns", NULL, menu_scale_to_td_n, WV_MENU_TDSCALEN, ""), WAVE_GTKIFE("/View/Scale To Time Dimension/ps", NULL, menu_scale_to_td_p, WV_MENU_TDSCALEP, ""), WAVE_GTKIFE("/View/Scale To Time Dimension/fs", NULL, menu_scale_to_td_f, WV_MENU_TDSCALEF, ""), /* 130 */ WAVE_GTKIFE("/Help/WAVE Help", "H", menu_help, WV_MENU_HWH, ""), #ifdef MAC_INTEGRATION WAVE_GTKIFE("/Help/WAVE User Manual", NULL, menu_help_manual, WV_MENU_HWM, ""), #endif WAVE_GTKIFE("/Help/Wave Version", NULL, menu_version, WV_MENU_HWV, ""), }; #ifndef WAVE_USE_MLIST_T void set_scale_to_time_dimension_toggles(void) { int i; for(i = WV_MENU_TDSCALEX; i<= WV_MENU_TDSCALEF; i++) { GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[i].path))->active=FALSE; } switch(GLOBALS->scale_to_time_dimension) { case 's': i = WV_MENU_TDSCALES; break; case 'm': i = WV_MENU_TDSCALEM; break; case 'u': i = WV_MENU_TDSCALEU; break; case 'n': i = WV_MENU_TDSCALEN; break; case 'p': i = WV_MENU_TDSCALEP; break; case 'f': i = WV_MENU_TDSCALEF; break; default: i = WV_MENU_TDSCALEX; break; } GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[i].path))->active=TRUE; } #else void set_scale_to_time_dimension_toggles(void) { int i, ii; switch(GLOBALS->scale_to_time_dimension) { case 's': ii = WV_MENU_TDSCALES; break; case 'm': ii = WV_MENU_TDSCALEM; break; case 'u': ii = WV_MENU_TDSCALEU; break; case 'n': ii = WV_MENU_TDSCALEN; break; case 'p': ii = WV_MENU_TDSCALEP; break; case 'f': ii = WV_MENU_TDSCALEF; break; default: ii = WV_MENU_TDSCALEX; break; } for(i = WV_MENU_TDSCALEX; i<= WV_MENU_TDSCALEF; i++) { gboolean is_active = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_wlist[i])); if(i!=ii) { if(is_active) { gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[i]), FALSE); } } else { if(!is_active) { gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[i]), TRUE); } } } } #endif /* * set toggleitems to their initial states */ #ifndef WAVE_USE_MLIST_T static void set_menu_toggles(void) { GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VZPS].path))->active=(GLOBALS->zoom_pow10_snap)?TRUE:FALSE; GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VSG].path))->active=(GLOBALS->display_grid)?TRUE:FALSE; GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_SHW].path))->active=(GLOBALS->highlight_wavewindow)?TRUE:FALSE; GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_FILL1].path))->active=(GLOBALS->fill_waveform)?TRUE:FALSE; GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_HSWM].path))->active=(GLOBALS->alt_wheel_mode)?TRUE:FALSE; GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1,menu_items[WV_MENU_VSMO].path))->active=(GLOBALS->disable_mouseover)?FALSE:TRUE; #ifdef WAVE_USE_GTK2 GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1,menu_items[WV_MENU_VSMC].path))->active=(GLOBALS->clipboard_mouseover)?TRUE:FALSE; #endif GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VSBS].path))->active=(GLOBALS->show_base)?TRUE:FALSE; GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VDR].path))->active=(GLOBALS->do_resize_signals)?TRUE:FALSE; GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_ESTS].path))->active=(GLOBALS->use_standard_trace_select)?TRUE:FALSE; GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VCMU].path))->active=(GLOBALS->constant_marker_update)?TRUE:FALSE; GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VCZ].path))->active=(GLOBALS->do_zoom_center)?TRUE:FALSE; GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VDRV].path))->active=(GLOBALS->use_roundcaps)?TRUE:FALSE; GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_MWSON].path))->active=(GLOBALS->wave_scrolling)?TRUE:FALSE; GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_ABON].path))->active=(GLOBALS->autoname_bundles)?TRUE:FALSE; GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_HTGP].path))->active=(GLOBALS->hier_grouping)?TRUE:FALSE; GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VFTP].path))->active=(GLOBALS->use_full_precision)?TRUE:FALSE; GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_ACOL].path))->active=(GLOBALS->autocoalesce)?TRUE:FALSE; GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_ACOLR].path))->active=(GLOBALS->autocoalesce_reversal)?TRUE:FALSE; GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_KEEPXZ].path))->active=(GLOBALS->keep_xz_colors)?TRUE:FALSE; if(GLOBALS->partial_vcd) { GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VZDYN].path))->active=(GLOBALS->zoom_dyn)?TRUE:FALSE; GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VZDYNE].path))->active=(GLOBALS->zoom_dyne)?TRUE:FALSE; } if(GLOBALS->loaded_file_type == LXT_FILE) { GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_LXTCC2Z].path))->active=(GLOBALS->lxt_clock_compress_to_z)?TRUE:FALSE; } set_scale_to_time_dimension_toggles(); } #else void set_menu_toggles(void) { GLOBALS->quiet_checkmenu = 1; gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VZPS]), GLOBALS->zoom_pow10_snap); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VSG]), GLOBALS->display_grid); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_SHW]), GLOBALS->highlight_wavewindow); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_FILL1]), GLOBALS->fill_waveform); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_HSWM]), GLOBALS->alt_wheel_mode); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VSMO]), !GLOBALS->disable_mouseover); #ifdef WAVE_USE_GTK2 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VSMC]), GLOBALS->clipboard_mouseover); #endif gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VSBS]), GLOBALS->show_base); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VDR]), GLOBALS->do_resize_signals); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_ESTS]), GLOBALS->use_standard_trace_select); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VCMU]), GLOBALS->constant_marker_update); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VCZ]), GLOBALS->do_zoom_center); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VDRV]), GLOBALS->use_roundcaps); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_MWSON]), GLOBALS->wave_scrolling); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_ABON]), GLOBALS->autoname_bundles); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_HTGP]), GLOBALS->hier_grouping); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VFTP]), GLOBALS->use_full_precision); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_ACOL]), GLOBALS->autocoalesce); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_ACOLR]), GLOBALS->autocoalesce_reversal); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_KEEPXZ]), GLOBALS->keep_xz_colors); if(GLOBALS->partial_vcd) { gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VZDYN]), GLOBALS->zoom_dyn); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_VZDYNE]), GLOBALS->zoom_dyne); } if(GLOBALS->loaded_file_type == LXT_FILE) { gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_wlist[WV_MENU_LXTCC2Z]), GLOBALS->lxt_clock_compress_to_z); } set_scale_to_time_dimension_toggles(); GLOBALS->quiet_checkmenu = 0; } #endif /* * kill accelerator keys (e.g., if using twinwave as focus is sometimes wrong from parent window) */ void kill_main_menu_accelerators(void) { int i; for(i=0;iregexp_string_menu_c_1 = calloc_2(1, 129); global_accel = gtk_accel_group_new(); GLOBALS->item_factory_menu_c_1 = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "
", global_accel); gtk_item_factory_create_items(GLOBALS->item_factory_menu_c_1, nmenu_items, menu_items, NULL); if(GLOBALS->loaded_file_type == MISSING_FILE) { for(i=0;iitem_factory_menu_c_1, menu_items[i].path); if(mw) gtk_widget_set_sensitive(mw, FALSE); break; } } #ifdef WAVE_USE_MENU_BLACKOUTS for(i=0;i<(sizeof(menu_blackouts)/sizeof(char *));i++) { mw = gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_blackouts[i]); if(mw) gtk_widget_set_sensitive(mw, FALSE); } #endif } if( #ifdef WAVE_USE_GTK2 (GLOBALS->socket_xid)|| #endif (GLOBALS->partial_vcd)) { gtk_item_factory_delete_item(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_FONVT].path); } if(!GLOBALS->partial_vcd) { gtk_item_factory_delete_item(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VZDYN].path); gtk_item_factory_delete_item(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_VZDYNE].path); } if(GLOBALS->loaded_file_type == DUMPLESS_FILE) { gtk_item_factory_delete_item(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_FRW].path); } if(GLOBALS->loaded_file_type != LXT_FILE) { gtk_item_factory_delete_item(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_SEP18].path); gtk_item_factory_delete_item(GLOBALS->item_factory_menu_c_1, menu_items[WV_MENU_LXTCC2Z].path); } gtk_window_add_accel_group(GTK_WINDOW(window), global_accel); if(menubar) { *menubar = gtk_item_factory_get_widget (GLOBALS->item_factory_menu_c_1, "
"); set_menu_toggles(); } } #endif void menu_set_sensitive(void) { int nmenu_items = sizeof(menu_items) / sizeof(menu_items[0]); int i; GtkWidget *mw; #ifdef WAVE_USE_MENU_BLACKOUTS for(i=0;i<(sizeof(menu_blackouts)/sizeof(char *));i++) { mw = gtk_item_factory_get_widget(GLOBALS->item_factory_menu_c_1, menu_blackouts[i]); if(mw) gtk_widget_set_sensitive(mw, TRUE); } #endif for(i=0;iitem_factory_menu_c_1, menu_items[i].path); #endif if(mw) { #ifdef MAC_INTEGRATION if(menu_items[i].callback) #endif { gtk_widget_set_sensitive(mw, TRUE); } } break; } } } /* * bail out */ int file_quit_cmd_callback (GtkWidget *widget, gpointer data) { (void)widget; (void)data; if(!GLOBALS->enable_fast_exit) { simplereqbox("Quit Program",300,"Do you really want to quit?","Yes", "No", GTK_SIGNAL_FUNC(menu_quit_callback), 1); } else { #ifdef __CYGWIN__ kill_stems_browser(); #endif g_print ("WM Destroy\n"); gtk_exit(0); } return(TRUE); /* keeps "delete_event" from happening...we'll manually destory later if need be */ } /* * RPC */ int execute_script(char *name, int dealloc_name) { unsigned int i; int nlen = strlen(name); if(GLOBALS->tcl_running) { fprintf(stderr, "Could not run script file '%s', as one is already running.\n", name); if(dealloc_name) { free_2(name); } return(0); } GLOBALS->tcl_running = 1; if(1) /* all scripts are Tcl now */ { #if defined(HAVE_LIBTCL) int tclrc; char *tcl_cmd = wave_alloca(7 + nlen + 1); /* originally a malloc, but the script can change the context! */ strcpy(tcl_cmd, "source "); strcpy(tcl_cmd+7, name); fprintf(stderr, "GTKWAVE | Executing Tcl script '%s'\n", name); if(dealloc_name) { free_2(name); } #ifdef WIN32 { char *slashfix = tcl_cmd; while(*slashfix) { if(*slashfix=='\\') *slashfix='/'; slashfix++; } } #endif tclrc = Tcl_Eval (GLOBALS->interp, tcl_cmd); if(tclrc != TCL_OK) { fprintf (stderr, "GTKWAVE | %s\n", Tcl_GetStringResult (GLOBALS->interp)); } #else fprintf(stderr, "GTKWAVE | Tcl support not compiled into gtkwave, exiting.\n"); gtk_exit(255); #endif } for(i=0;inum_notebook_pages;i++) { (*GLOBALS->contexts)[i]->wave_script_args = NULL; /* just in case there was a CTX swap */ } GLOBALS->tcl_running = 0; return(0); } gtkwave_mlist_t *retrieve_menu_items_array(int *num_items) { *num_items = sizeof(menu_items) / sizeof(menu_items[0]); return(menu_items); } /* * support for menu accelerator modifications... */ int set_wave_menu_accelerator(char *str) { char *path, *pathend; char *accel; int i; path = strchr(str, '\"'); if(!path) return(1); path++; if(!*path) return(1); pathend = strchr(path, '\"'); if(!pathend) return(1); *pathend = 0; accel = pathend + 1; while(*accel) { if(!isspace((int)(unsigned char)*accel)) break; accel++; } if(!*accel) return(1); if(strstr(path, "")) return(1); if(!strcmp(accel, "(null)")) { accel = NULL; } else { for(i=0;i"), WAVE_GTKIFE("/Data Format/Decimal", NULL, menu_dataformat_dec, WV_MENU_EDFD, ""), WAVE_GTKIFE("/Data Format/Signed Decimal", NULL, menu_dataformat_signed, WV_MENU_EDFSD, ""), WAVE_GTKIFE("/Data Format/Binary", NULL, menu_dataformat_bin, WV_MENU_EDFB, ""), WAVE_GTKIFE("/Data Format/Octal", NULL, menu_dataformat_oct, WV_MENU_EDFO, ""), WAVE_GTKIFE("/Data Format/ASCII", NULL, menu_dataformat_ascii, WV_MENU_EDFA, ""), WAVE_GTKIFE("/Data Format/BitsToReal", NULL, menu_dataformat_real, WV_MENU_EDRL, ""), WAVE_GTKIFE("/Data Format/RealToBits/On", NULL, menu_dataformat_real2bon, WV_MENU_EDR2BON, ""), WAVE_GTKIFE("/Data Format/RealToBits/Off", NULL, menu_dataformat_real2boff, WV_MENU_EDR2BOFF, ""), WAVE_GTKIFE("/Data Format/Right Justify/On", NULL, menu_dataformat_rjustify_on, WV_MENU_EDFRJON, ""), WAVE_GTKIFE("/Data Format/Right Justify/Off", NULL, menu_dataformat_rjustify_off, WV_MENU_EDFRJOFF, ""), WAVE_GTKIFE("/Data Format/Invert/On", NULL, menu_dataformat_invert_on, WV_MENU_EDFION, ""), WAVE_GTKIFE("/Data Format/Invert/Off", NULL, menu_dataformat_invert_off, WV_MENU_EDFIOFF, ""), WAVE_GTKIFE("/Data Format/Reverse Bits/On", NULL, menu_dataformat_reverse_on, WV_MENU_EDFRON, ""), WAVE_GTKIFE("/Data Format/Reverse Bits/Off", NULL, menu_dataformat_reverse_off, WV_MENU_EDFROFF, ""), WAVE_GTKIFE("/Data Format/Translate Filter File/Disable", NULL, menu_dataformat_xlate_file_0, WV_MENU_XLF_0, ""), WAVE_GTKIFE("/Data Format/Translate Filter File/Enable and Select", NULL, menu_dataformat_xlate_file_1, WV_MENU_XLF_1, ""), WAVE_GTKIFE("/Data Format/Translate Filter Process/Disable", NULL, menu_dataformat_xlate_proc_0, WV_MENU_XLP_0, ""), WAVE_GTKIFE("/Data Format/Translate Filter Process/Enable and Select", NULL, menu_dataformat_xlate_proc_1, WV_MENU_XLP_1, ""), WAVE_GTKIFE("/Data Format/Transaction Filter Process/Disable", NULL, menu_dataformat_xlate_ttrans_0, WV_MENU_TTXLP_0, ""), WAVE_GTKIFE("/Data Format/Transaction Filter Process/Enable and Select", NULL, menu_dataformat_xlate_ttrans_1, WV_MENU_TTXLP_1, ""), WAVE_GTKIFE("/Data Format/Analog/Off", NULL, menu_dataformat_analog_off, WV_MENU_EDFAOFF, ""), WAVE_GTKIFE("/Data Format/Analog/Step", NULL, menu_dataformat_analog_step, WV_MENU_EDFASTEP, ""), WAVE_GTKIFE("/Data Format/Analog/Interpolated", NULL, menu_dataformat_analog_interpol, WV_MENU_EDFAINTERPOL, ""), WAVE_GTKIFE("/Data Format/Analog/Interpolated Annotated", NULL, menu_dataformat_analog_interpol_step, WV_MENU_EDFAINTERPOL2, ""), WAVE_GTKIFE("/Data Format/Analog/Resizing/Screen Data", NULL, menu_dataformat_analog_resize_screen, WV_MENU_EDFARSD, ""), WAVE_GTKIFE("/Data Format/Analog/Resizing/All Data", NULL, menu_dataformat_analog_resize_all, WV_MENU_EDFARAD, ""), WAVE_GTKIFE("/Data Format/Range Fill/With 0s", NULL, menu_dataformat_rangefill_zero, WV_MENU_RFILL0, ""), WAVE_GTKIFE("/Data Format/Range Fill/With 1s", NULL, menu_dataformat_rangefill_one, WV_MENU_RFILL1, ""), WAVE_GTKIFE("/Data Format/Range Fill/Off", NULL, menu_dataformat_rangefill_off, WV_MENU_RFILLOFF, ""), WAVE_GTKIFE("/Data Format/Gray Filters/To Gray", NULL, menu_dataformat_bingray_on, WV_MENU_B2G, ""), WAVE_GTKIFE("/Data Format/Gray Filters/From Gray", NULL, menu_dataformat_graybin_on, WV_MENU_G2B, ""), WAVE_GTKIFE("/Data Format/Gray Filters/None", NULL, menu_dataformat_nogray, WV_MENU_GBNONE, ""), WAVE_GTKIFE("/Data Format/Popcnt/On", NULL, menu_dataformat_popcnt_on, WV_MENU_POPON, ""), WAVE_GTKIFE("/Data Format/Popcnt/Off", NULL, menu_dataformat_popcnt_off, WV_MENU_POPOFF, ""), WAVE_GTKIFE("/Data Format/Fixed Point Shift/On", NULL, menu_dataformat_fpshift_on, WV_MENU_FPSHIFTON, ""), WAVE_GTKIFE("/Data Format/Fixed Point Shift/Off", NULL, menu_dataformat_fpshift_off, WV_MENU_FPSHIFTOFF, ""), WAVE_GTKIFE("/Data Format/Fixed Point Shift/Specify", NULL, menu_dataformat_fpshift_specify, WV_MENU_FPSHIFTVAL, ""), WAVE_GTKIFE("/Color Format/Normal", NULL, menu_colorformat_0, WV_MENU_CLRFMT0, ""), WAVE_GTKIFE("/Color Format/Red", NULL, menu_colorformat_1, WV_MENU_CLRFMT1, ""), WAVE_GTKIFE("/Color Format/Orange", NULL, menu_colorformat_2, WV_MENU_CLRFMT2, ""), WAVE_GTKIFE("/Color Format/Yellow", NULL, menu_colorformat_3, WV_MENU_CLRFMT3, ""), WAVE_GTKIFE("/Color Format/Green", NULL, menu_colorformat_4, WV_MENU_CLRFMT4, ""), WAVE_GTKIFE("/Color Format/Blue", NULL, menu_colorformat_5, WV_MENU_CLRFMT5, ""), WAVE_GTKIFE("/Color Format/Indigo", NULL, menu_colorformat_6, WV_MENU_CLRFMT6, ""), WAVE_GTKIFE("/Color Format/Violet", NULL, menu_colorformat_7, WV_MENU_CLRFMT7, ""), WAVE_GTKIFE("/Color Format/Cycle", NULL, menu_colorformat_cyc, WV_MENU_CLRFMTC, ""), WAVE_GTKIFE("/", NULL, NULL, WV_MENU_SEP1, ""), WAVE_GTKIFE("/Insert Analog Height Extension", NULL, menu_insert_analog_height_extension, WV_MENU_EIA, ""), WAVE_GTKIFE("/", NULL, NULL, WV_MENU_SEP2, ""), WAVE_GTKIFE("/Insert Blank", NULL, menu_insert_blank_traces, WV_MENU_EIB, ""), WAVE_GTKIFE("/Insert Comment", NULL, menu_insert_comment_traces, WV_MENU_EIC, ""), WAVE_GTKIFE("/Alias Highlighted Trace", NULL, menu_alias, WV_MENU_EAHT, ""), WAVE_GTKIFE("/Remove Highlighted Aliases", NULL, menu_remove_aliases, WV_MENU_ERHA, ""), WAVE_GTKIFE("/", NULL, NULL, WV_MENU_SEP3, ""), WAVE_GTKIFE("/Cut", NULL, menu_cut_traces, WV_MENU_EC, ""), WAVE_GTKIFE("/Copy", NULL, menu_copy_traces, WV_MENU_ECY, ""), WAVE_GTKIFE("/Paste", NULL, menu_paste_traces, WV_MENU_EP, ""), WAVE_GTKIFE("/Delete", NULL, menu_delete_traces, WV_MENU_DEL, ""), WAVE_GTKIFE("/", NULL, NULL, WV_MENU_SEP4, ""), WAVE_GTKIFE("/Open Scope", NULL, menu_open_hierarchy, WV_MENU_OPENH, "") #if !defined __MINGW32__ && !defined _MSC_VER , /* see do_popup_menu() for specific patch for this for if(!GLOBALS->stem_path_string_table) ... */ WAVE_GTKIFE("/Open Source Definition", NULL, menu_open_hierarchy_source, WV_MENU_OPENHS, ""), WAVE_GTKIFE("/Open Source Instantiation", NULL, menu_open_hierarchy_isource, WV_MENU_OPENIHS, "") #endif }; void do_popup_menu (GtkWidget *my_widget, GdkEventButton *event) { (void)my_widget; GtkWidget *menu; int button, event_time; if(!GLOBALS->signal_popup_menu) { int nmenu_items = sizeof(popmenu_items) / sizeof(popmenu_items[0]); #if !defined __MINGW32__ && !defined _MSC_VER if(!GLOBALS->stem_path_string_table) { nmenu_items = nmenu_items - 2; /* to remove WV_MENU_OPENHS, WV_MENU_OPENIHS -> keep at end of list! */ } else { if(!GLOBALS->istem_struct_base) { nmenu_items--; /* remove "/Open Source Instantiation" if not present */ } } #endif #ifdef WAVE_USE_MLIST_T GLOBALS->signal_popup_menu = menu = alt_menu(popmenu_items, nmenu_items, NULL, NULL, FALSE); #else GtkItemFactory *item_factory = gtk_item_factory_new (GTK_TYPE_MENU, "
", NULL); gtk_item_factory_create_items (item_factory, nmenu_items, popmenu_items, NULL); GLOBALS->signal_popup_menu = menu = gtk_item_factory_get_widget (item_factory, "
"); #endif } else { menu = GLOBALS->signal_popup_menu; } if (event) { button = event->button; event_time = event->time; } else { button = 0; #if WAVE_USE_GTK2 event_time = gtk_get_current_event_time (); #else return; /* disabled in GTK1.2 */ #endif } gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, button, event_time); } /***************************/ /*** sst popup menu code ***/ /***************************/ #if WAVE_USE_GTK2 static gtkwave_mlist_t sst_popmenu_items[] = { WAVE_GTKIFE("/Recurse Import/Append", NULL, menu_recurse_import, WV_RECURSE_APPEND, ""), WAVE_GTKIFE("/Recurse Import/Insert", NULL, menu_recurse_import, WV_RECURSE_INSERT, ""), WAVE_GTKIFE("/Recurse Import/Replace", NULL, menu_recurse_import, WV_RECURSE_REPLACE, ""), #if !defined __MINGW32__ && !defined _MSC_VER WAVE_GTKIFE("/Open Source Definition", NULL, menu_open_sst_hierarchy_source, WV_MENU_OPENHS, ""), WAVE_GTKIFE("/Open Source Instantiation", NULL, menu_open_sst_hierarchy_isource, WV_MENU_OPENIHS, ""), #endif }; void do_sst_popup_menu (GtkWidget *my_widget, GdkEventButton *event) { (void)my_widget; GtkWidget *menu; int button, event_time; if(!GLOBALS->sst_signal_popup_menu) { int nmenu_items = sizeof(sst_popmenu_items) / sizeof(sst_popmenu_items[0]); #if !defined __MINGW32__ && !defined _MSC_VER if(!GLOBALS->stem_path_string_table) { nmenu_items-=2; /* remove all stems popups */ } else if(!GLOBALS->istem_struct_base) { nmenu_items--; /* remove "/Open Source Instantiation" if not present */ } /* still have recurse import popup */ #endif #ifdef WAVE_USE_MLIST_T GLOBALS->sst_signal_popup_menu = menu = alt_menu(sst_popmenu_items, nmenu_items, NULL, NULL, FALSE); #else GtkItemFactory *item_factory = gtk_item_factory_new (GTK_TYPE_MENU, "
", NULL); gtk_item_factory_create_items (item_factory, nmenu_items, sst_popmenu_items, NULL); GLOBALS->sst_signal_popup_menu = menu = gtk_item_factory_get_widget (item_factory, "
"); #endif } else { menu = GLOBALS->sst_signal_popup_menu; } if (event) { button = event->button; event_time = event->time; } else { button = 0; #if WAVE_USE_GTK2 event_time = gtk_get_current_event_time (); #else return; /* disabled in GTK1.2 */ #endif } gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, button, event_time); } #else void do_sst_popup_menu (GtkWidget *my_widget, GdkEventButton *event) { /* nothing */ } #endif void SetTraceScrollbarRowValue(int row, unsigned location) { if(row >= 0) { GtkAdjustment *wadj=GTK_ADJUSTMENT(GLOBALS->wave_vslider); int target = row; int num_traces_displayable=(GLOBALS->signalarea->allocation.height)/(GLOBALS->fontheight); num_traces_displayable--; /* for the time trace that is always there */ /* center */ if (location == 1) { target = target - num_traces_displayable/2; } /* end */ if (location == 2) { target = target - num_traces_displayable; } if(target > GLOBALS->traces.visible - num_traces_displayable) target = GLOBALS->traces.visible - num_traces_displayable; if(target < 0) target = 0; wadj->value = target; gtk_signal_emit_by_name (GTK_OBJECT (wadj), "changed"); /* force bar update */ gtk_signal_emit_by_name (GTK_OBJECT (wadj), "value_changed"); /* force text update */ gtkwave_main_iteration(); } } #ifdef WAVE_USE_MLIST_T /* * the following is for the eventual migration to GtkMenu from the item factory. * all menu features are implemented. */ struct menu_item_t { struct menu_item_t *next; struct menu_item_t *child; char *name; int idx; unsigned valid : 1; }; static void decompose_path(char *pathname, int *items, char ***parts) { char *s, **slashes; int i; int slashcount = 0; char *p_copy = strdup_2(pathname); s = p_copy; while(*s) { if(*s == '/') slashcount++; s++; } *parts = calloc_2(slashcount, sizeof(char *)); slashes = calloc_2(slashcount, sizeof(char *)); s = p_copy; slashcount = 0; while(*s) { if(*s == '/') slashes[slashcount++] = s;; s++; } for(i=0;i%s", path); if(accelerator) { gtk_accelerator_parse(accelerator, &accelerator_key, &accelerator_mods); #ifdef MAC_INTEGRATION if((accelerator_mods & GDK_MOD1_MASK) || (!accelerator_mods) || (accelerator_mods == GDK_SHIFT_MASK)) { no_map = 1; /* ALT not available with GTK menus on OSX? */ /* also remove "normal" keys to avoid conflicts with OSX menubar */ } if(accelerator_mods & GDK_CONTROL_MASK) { accelerator_mods &= ~GDK_CONTROL_MASK; accelerator_mods |= GDK_META_MASK; } #endif } if(!no_map) { gtk_accel_map_add_entry (full_path, accelerator_key, accelerator_mods); gtk_widget_set_accel_path (menuitem, full_path, accel); } } } static GtkWidget *alt_menu_walk(gtkwave_mlist_t *mi, GtkWidget **wlist, struct menu_item_t *lst, int depth, GtkAccelGroup *accel) { struct menu_item_t *ptr = lst; struct menu_item_t *optr; GtkWidget *menu; GtkWidget *menuitem; if(depth) { menu = gtk_menu_new(); if(accel) gtk_menu_set_accel_group (GTK_MENU(menu), accel); } else { menu = gtk_menu_bar_new(); } while(ptr) { /* mi[ptr->idx] is menu item */ if(!strcmp(mi[ptr->idx].item_type, "")) { #ifdef MAC_INTEGRATION menuitem = gtk_separator_menu_item_new(); #else menuitem = gtk_menu_item_new(); #endif } else { if((!strcmp(mi[ptr->idx].item_type, "")) && !ptr->child) { menuitem = gtk_check_menu_item_new_with_label(ptr->name); } else { menuitem = gtk_menu_item_new_with_label(ptr->name); } if(!ptr->child && mi[ptr->idx].callback) { g_signal_connect (menuitem, "activate", G_CALLBACK (mi[ptr->idx].callback), (gpointer)(long)mi[ptr->idx].callback_action); alt_menu_install_accelerator(accel, menuitem, mi[ptr->idx].accelerator, mi[ptr->idx].path); } } gtk_menu_shell_append(GTK_MENU_SHELL (menu), menuitem); gtk_widget_show (menuitem); if(wlist) { wlist[ptr->idx] = menuitem; } if(ptr->child) { gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), alt_menu_walk(mi, wlist, ptr->child, depth+1, accel)); } optr = ptr; ptr = ptr->next; free_2(optr->name); free_2(optr); } return(menu); } GtkWidget *alt_menu(gtkwave_mlist_t *mi, int nmenu_items, GtkWidget **wlist, GtkAccelGroup *accel, gboolean is_menubar) { int i, j; struct menu_item_t *mtree = calloc_2(1, sizeof(struct menu_item_t)); struct menu_item_t *n, *n2 = NULL, *n3; GtkWidget *menubar; for(i=0;iname && (j != (items-1))) /* 2nd comparison is to let separators through */ { n2 = n; while(n2) { if(!strcmp(n2->name, parts[j])) break; n2 = n2->next; } } else { n2 = NULL; } if(!n2) { n3 = (j != (items-1)) ? calloc_2(1, sizeof(struct menu_item_t)) : NULL; assert(n != NULL); /* scan-build */ if(n->name) { while(n->next) { n = n->next; } n->next = calloc_2(1, sizeof(struct menu_item_t)); n = n->next; } n->name = strdup_2(parts[j]); n->child = n3; n2 = n; n = n3; } else { n = n2->child; } } if(n2) /* scan-build */ { n2->idx = i; n2->valid = 1; } free_decomposed_path(items, parts); } menubar = alt_menu_walk(mi, wlist, mtree, is_menubar ? 0 : 1, accel); /* returns a menubar */ return(menubar); } GtkWidget *alt_menu_top(GtkWidget *window) { gtkwave_mlist_t *mi = menu_items; int nmenu_items = sizeof(menu_items) / sizeof(menu_items[0]); GtkWidget *menubar; GtkAccelGroup *global_accel = gtk_accel_group_new();; int i; GtkWidget *mw; menu_wlist = calloc(nmenu_items, sizeof(GtkWidget *)); /* calloc, not calloc_2() */ menubar = alt_menu(mi, nmenu_items, menu_wlist, global_accel, TRUE); GLOBALS->regexp_string_menu_c_1 = calloc_2(1, 129); if(GLOBALS->loaded_file_type == MISSING_FILE) { for(i=0;isocket_xid)|| (GLOBALS->partial_vcd)) { gtk_widget_destroy(menu_wlist[WV_MENU_FONVT]); } if(!GLOBALS->partial_vcd) { gtk_widget_destroy(menu_wlist[WV_MENU_VZDYN]); gtk_widget_destroy(menu_wlist[WV_MENU_VZDYNE]); } if(GLOBALS->loaded_file_type == DUMPLESS_FILE) { gtk_widget_destroy(menu_wlist[WV_MENU_FRW]); } if(GLOBALS->loaded_file_type != LXT_FILE) { gtk_widget_destroy(menu_wlist[WV_MENU_SEP18]); gtk_widget_destroy(menu_wlist[WV_MENU_LXTCC2Z]); } gtk_window_add_accel_group(GTK_WINDOW(window), global_accel); #ifdef MAC_INTEGRATION #if defined(HAVE_LIBTCL) gtk_widget_hide(menu_wlist[WV_MENU_TCLSEP]); #endif gtk_widget_hide(menu_wlist[WV_MENU_FQY]); #endif set_menu_toggles(); return(menubar); } #ifdef MAC_INTEGRATION void osx_menu_sensitivity(gboolean tr) { GtkWidget *mw; int nmenu_items = sizeof(menu_items) / sizeof(menu_items[0]); int i; for(i=0;iloaded_file_type != MISSING_FILE) { osx_menu_sensitivity(TRUE); } else { int i; GtkWidget *mw; int nmenu_items = sizeof(menu_items) / sizeof(menu_items[0]); for(i=0;i #endif #include "vcd.h" #define EXTLOAD "EXTLOAD | " TimeType extload_main(char *fname, char *skip_start, char *skip_end); void import_extload_trace(nptr np); /* FsdbReader adds */ void fsdb_import_masked(void); void fsdb_set_fac_process_mask(nptr np); #endif gtkwave-3.3.86/src/lxt.c0000664000175000017500000020221213166335473014345 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2001-2014. * * 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. */ #include #include #include "zlib.h" #include "bzlib.h" #if !defined __MINGW32__ && !defined _MSC_VER #include #include #else #include #include #endif #include"globals.h" #include #include #include #include #include #include "symbol.h" #include "vcd.h" #include "lxt.h" #include "bsearch.h" #include "debug.h" #include "hierpack.h" /****************************************************************************/ /* * functions which emit various big endian * data to a file */ static int lt_emit_u8(FILE *handle, int value) { unsigned char buf[1]; int nmemb; buf[0] = value & 0xff; nmemb=fwrite(buf, sizeof(char), 1, handle); GLOBALS->fpos_lxt_c_1+=nmemb; return(nmemb); } static int lt_emit_u16(FILE *handle, int value) { unsigned char buf[2]; int nmemb; buf[0] = (value>>8) & 0xff; buf[1] = value & 0xff; nmemb = fwrite(buf, sizeof(char), 2, handle); GLOBALS->fpos_lxt_c_1+=nmemb; return(nmemb); } static int lt_emit_u24(FILE *handle, int value) { unsigned char buf[3]; int nmemb; buf[0] = (value>>16) & 0xff; buf[1] = (value>>8) & 0xff; buf[2] = value & 0xff; nmemb=fwrite(buf, sizeof(char), 3, handle); GLOBALS->fpos_lxt_c_1+=nmemb; return(nmemb); } static int lt_emit_u32(FILE *handle, int value) { unsigned char buf[4]; int nmemb; buf[0] = (value>>24) & 0xff; buf[1] = (value>>16) & 0xff; buf[2] = (value>>8) & 0xff; buf[3] = value & 0xff; nmemb=fwrite(buf, sizeof(char), 4, handle); GLOBALS->fpos_lxt_c_1+=nmemb; return(nmemb); } /****************************************************************************/ #define LXTHDR "LXTLOAD | " /* its mmap() variant doesn't use file descriptors */ #if defined __MINGW32__ || defined _MSC_VER #define PROT_READ (0) #define MAP_SHARED (0) HANDLE hIn, hInMap; char *win_fname = NULL; void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset) { close(fd); hIn = CreateFile(win_fname, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if(hIn == INVALID_HANDLE_VALUE) { fprintf(stderr, "Could not open '%s' with CreateFile(), exiting.\n", win_fname); exit(255); } hInMap = CreateFileMapping(hIn, NULL, PAGE_READONLY, 0, 0, NULL); return(MapViewOfFile(hInMap, FILE_MAP_READ, 0, 0, 0)); } int munmap(void *start, size_t length) { UnmapViewOfFile(start); CloseHandle(hInMap); hInMap = NULL; CloseHandle(hIn); hIn = NULL; return(0); } #endif /****************************************************************************/ #ifdef _WAVE_BE32 /* * reconstruct 8/16/24/32 bits out of the lxt's representation * of a big-endian integer. this is for 32-bit PPC so no byte * swizzling needs to be done at all. for 24-bit ints, we have no danger of * running off the end of memory provided we do the "-1" trick * since we'll never read a 24-bit int at the very start of a file which * means that we'll have a 32-bit word that we can read. */ inline static unsigned int get_byte(offset) { return ((unsigned int)(*((unsigned char *)(GLOBALS->mm_lxt_c_1)+(offset)))); } inline static unsigned int get_16(offset) { return ((unsigned int)(*((unsigned short *)(((unsigned char *)(GLOBALS->mm_lxt_c_1)) +(offset))))); } inline static unsigned int get_32(offset) { return (*(unsigned int *)(((unsigned char *)(GLOBALS->mm_lxt_c_1))+(offset))); } inline static unsigned int get_24(offset) { return ((get_32((offset)-1)<<8)>>8); } inline static unsigned int get_64(offset) { return ((((UTimeType)get_32(offset))<<32)|((UTimeType)get_32((offset)+4))); } #else /* * reconstruct 8/16/24/32 bits out of the lxt's representation * of a big-endian integer. this should work on all architectures. */ #define get_byte(offset) ((unsigned int)(*((unsigned char *)GLOBALS->mm_lxt_c_1+offset))) static unsigned int get_16(off_t offset) { unsigned char *nn=(unsigned char *)GLOBALS->mm_lxt_c_1+offset; unsigned int m1=*((unsigned char *)(nn++)); unsigned int m2=*((unsigned char *)nn); return((m1<<8)|m2); } static unsigned int get_24(off_t offset) { unsigned char *nn=(unsigned char *)GLOBALS->mm_lxt_c_1+offset; unsigned int m1=*((unsigned char *)(nn++)); unsigned int m2=*((unsigned char *)(nn++)); unsigned int m3=*((unsigned char *)nn); return((m1<<16)|(m2<<8)|m3); } static unsigned int get_32(off_t offset) { unsigned char *nn=(unsigned char *)GLOBALS->mm_lxt_c_1+offset; unsigned int m1=*((unsigned char *)(nn++)); unsigned int m2=*((unsigned char *)(nn++)); unsigned int m3=*((unsigned char *)(nn++)); unsigned int m4=*((unsigned char *)nn); return((m1<<24)|(m2<<16)|(m3<<8)|m4); } static UTimeType get_64(off_t offset) { return( (((UTimeType)get_32(offset))<<32) |((UTimeType)get_32(offset+4)) ); } #endif /****************************************************************************/ static void create_double_endian_mask(int offset) { double d; int i, j; static double p = 3.14159; d= *((double *)((unsigned char *)GLOBALS->mm_lxt_c_1+offset)); if(p==d) { GLOBALS->double_is_native_lxt_c_1=1; } else { char *remote, *here; remote = (char *)&d; here = (char *)&p; for(i=0;i<8;i++) { for(j=0;j<8;j++) { if(here[i]==remote[j]) { GLOBALS->double_mask_lxt_c_1[i]=j; break; } } } } } static char *swab_double_via_mask(int offset) { char swapbuf[8]; char *pnt = malloc_2(8*sizeof(char)); int i; memcpy(swapbuf, ((unsigned char *)GLOBALS->mm_lxt_c_1+offset), 8); for(i=0;i<8;i++) { pnt[i]=swapbuf[GLOBALS->double_mask_lxt_c_1[i]]; } return(pnt); } /****************************************************************************/ /* * convert 0123 to an mvl character representation */ static unsigned char convert_mvl(int value) { return("01zxhuwl-xxxxxxx"[value&15]); } /* * given an offset into the aet, calculate the "time" of that * offset in simulation. this func similar to how gtkwave can * find the most recent valuechange that corresponds with * an arbitrary timevalue. */ static int compar_mvl_timechain(const void *s1, const void *s2) { int key, obj, delta; int rv; key=*((int *)s1); obj=*((int *)s2); if((obj<=key)&&(obj>GLOBALS->max_compare_time_tc_lxt_c_2)) { GLOBALS->max_compare_time_tc_lxt_c_2=obj; GLOBALS->max_compare_pos_tc_lxt_c_2=(int *)s2 - GLOBALS->positional_information_lxt_c_1; } delta=key-obj; if(delta<0) rv=-1; else if(delta>0) rv=1; else rv=0; return(rv); } static TimeType bsearch_mvl_timechain(int key) { GLOBALS->max_compare_time_tc_lxt_c_2=-1; GLOBALS->max_compare_pos_tc_lxt_c_2=-1; if(bsearch((void *)&key, (void *)GLOBALS->positional_information_lxt_c_1, GLOBALS->total_cycles_lxt_c_2, sizeof(int), compar_mvl_timechain)) { /* nothing, all side effects are in bsearch */ } if((GLOBALS->max_compare_pos_tc_lxt_c_2<=0)||(GLOBALS->max_compare_time_tc_lxt_c_2<0)) { GLOBALS->max_compare_pos_tc_lxt_c_2=0; /* aix bsearch fix */ } return(GLOBALS->time_information[GLOBALS->max_compare_pos_tc_lxt_c_2]); } /* * build up decompression dictionary for MVL2 facs >16 bits ... */ static void build_dict(void) { gzFile zhandle; off_t offs = GLOBALS->zdictionary_offset_lxt_c_1+24; int total_mem, rc; unsigned int i; char *decmem=NULL; char *pnt; #if defined __MINGW32__ || defined _MSC_VER FILE *tmp; #endif GLOBALS->dict_num_entries_lxt_c_1 = get_32(GLOBALS->zdictionary_offset_lxt_c_1+0); GLOBALS->dict_string_mem_required_lxt_c_1 = get_32(GLOBALS->zdictionary_offset_lxt_c_1+4); GLOBALS->dict_16_offset_lxt_c_1 = get_32(GLOBALS->zdictionary_offset_lxt_c_1+8); GLOBALS->dict_24_offset_lxt_c_1 = get_32(GLOBALS->zdictionary_offset_lxt_c_1+12); GLOBALS->dict_32_offset_lxt_c_1 = get_32(GLOBALS->zdictionary_offset_lxt_c_1+16); GLOBALS->dict_width_lxt_c_1 = get_32(GLOBALS->zdictionary_offset_lxt_c_1+20); DEBUG(fprintf(stderr, LXTHDR"zdictionary_offset = %08x\n", GLOBALS->zdictionary_offset_lxt_c_1)); DEBUG(fprintf(stderr, LXTHDR"zdictionary_predec_size = %08x\n\n", GLOBALS->zdictionary_predec_size_lxt_c_1)); DEBUG(fprintf(stderr, LXTHDR"dict_num_entries = %d\n", GLOBALS->dict_num_entries_lxt_c_1)); DEBUG(fprintf(stderr, LXTHDR"dict_string_mem_required = %d\n", GLOBALS->dict_string_mem_required_lxt_c_1)); DEBUG(fprintf(stderr, LXTHDR"dict_16_offset = %d\n", GLOBALS->dict_16_offset_lxt_c_1)); DEBUG(fprintf(stderr, LXTHDR"dict_24_offset = %d\n", GLOBALS->dict_24_offset_lxt_c_1)); DEBUG(fprintf(stderr, LXTHDR"dict_32_offset = %d\n", GLOBALS->dict_32_offset_lxt_c_1)); fprintf(stderr, LXTHDR"Dictionary compressed MVL2 change records detected...\n"); #if defined __MINGW32__ || defined _MSC_VER { unsigned char *t = (char *)GLOBALS->mm_lxt_c_1+offs; tmp = tmpfile(); if(!tmp) { fprintf(stderr, LXTHDR"could not open decompression tempfile, exiting.\n"); exit(255); } fwrite(t, GLOBALS->zdictionary_predec_size_lxt_c_1, 1, tmp); fseek(tmp, 0, SEEK_SET); zhandle = gzdopen(dup(fileno(tmp)), "rb"); } #else if(offs!=lseek(GLOBALS->fd_lxt_c_1, offs, SEEK_SET)) { fprintf(stderr, LXTHDR"dict lseek error at offset %08x\n", (unsigned int)offs); exit(255); } zhandle = gzdopen(dup(GLOBALS->fd_lxt_c_1), "rb"); #endif decmem = malloc_2(total_mem = GLOBALS->dict_string_mem_required_lxt_c_1); rc=gzread(zhandle, decmem, total_mem); DEBUG(printf(LXTHDR"section offs for name decompression = %08x of len %d\n", offs, GLOBALS->dict_num_entries_lxt_c_1)); DEBUG(printf(LXTHDR"Decompressed size is %d bytes (vs %d)\n", rc, total_mem)); if(rc!=total_mem) { fprintf(stderr, LXTHDR"decompression size disparity %d bytes (vs %d)\n", rc, total_mem); exit(255); } GLOBALS->dict_string_mem_array_lxt_c_1 = (char **)calloc_2(GLOBALS->dict_num_entries_lxt_c_1, sizeof(char *)); pnt = decmem; for(i=0;idict_num_entries_lxt_c_1;i++) { GLOBALS->dict_string_mem_array_lxt_c_1[i]=pnt; pnt+=(strlen(pnt)+1); DEBUG(printf(LXTHDR"Dict %d: '1%s'\n", i, GLOBALS->dict_string_mem_array_lxt_c_1[i])); } gzclose(zhandle); #if defined __MINGW32__ || defined _MSC_VER fclose(tmp); #endif fprintf(stderr, LXTHDR"...expanded %d entries from %08x into %08x bytes.\n", GLOBALS->dict_num_entries_lxt_c_1, GLOBALS->zdictionary_predec_size_lxt_c_1, GLOBALS->dict_string_mem_required_lxt_c_1); } /* * decompress facility names and build up fac geometry */ static void build_facs(char *fname, char **f_name, struct Node *node_block) { char *buf, *bufprev = NULL, *bufcurr; off_t offs=GLOBALS->facname_offset_lxt_c_1+8; int i, j, clone; char *pnt = NULL; int total_mem = get_32(GLOBALS->facname_offset_lxt_c_1+4); gzFile zhandle = NULL; char *decmem=NULL; #if defined __MINGW32__ || defined _MSC_VER FILE *tmp; #endif buf=malloc_2(total_mem); pnt=bufprev=buf; if(GLOBALS->zfacname_size_lxt_c_1) { int rc; #if defined __MINGW32__ || defined _MSC_VER unsigned char *t = (char *)GLOBALS->mm_lxt_c_1+offs; tmp = tmpfile(); if(!tmp) { fprintf(stderr, LXTHDR"could not open decompression tempfile, exiting.\n"); exit(255); } fwrite(t, GLOBALS->zfacname_size_lxt_c_1, 1, tmp); fseek(tmp, 0, SEEK_SET); zhandle = gzdopen(dup(fileno(tmp)), "rb"); #else if(offs!=lseek(GLOBALS->fd_lxt_c_1, offs, SEEK_SET)) { fprintf(stderr, LXTHDR"zfacname lseek error at offset %08x\n", (unsigned int)offs); exit(255); } zhandle = gzdopen(dup(GLOBALS->fd_lxt_c_1), "rb"); #endif GLOBALS->mmcache_lxt_c_1 = GLOBALS->mm_lxt_c_1; decmem = malloc_2(total_mem = GLOBALS->zfacname_predec_size_lxt_c_1); GLOBALS->mm_lxt_c_1 = decmem; rc=gzread(zhandle, decmem, total_mem); DEBUG(printf(LXTHDR"section offs for name decompression = %08x of len %d\n", offs, GLOBALS->zfacname_size_lxt_c_1)); DEBUG(printf(LXTHDR"Decompressed size is %d bytes (vs %d)\n", rc, total_mem)); if(rc!=total_mem) { fprintf(stderr, LXTHDR"decompression size disparity %d bytes (vs %d)\n", rc, total_mem); exit(255); } offs=0; /* we're in our new memory region now.. */ } fprintf(stderr, LXTHDR"Building %d facilities.\n", GLOBALS->numfacs); for(i=0;inumfacs;i++) { clone=get_16(offs); offs+=2; bufcurr=pnt; for(j=0;jzfacname_size_lxt_c_1) { GLOBALS->mm_lxt_c_1 = GLOBALS->mmcache_lxt_c_1; free_2(decmem); decmem = NULL; gzclose(zhandle); #if defined __MINGW32__ || defined _MSC_VER fclose(tmp); #endif } if(!GLOBALS->facgeometry_offset_lxt_c_1) { fprintf(stderr, "LXT '%s' is missing a facility geometry section, exiting.\n", fname); exit(255); } offs=GLOBALS->facgeometry_offset_lxt_c_1; if(GLOBALS->zfacgeometry_size_lxt_c_1) { int rc; #if defined __MINGW32__ || defined _MSC_VER unsigned char *t = (char *)GLOBALS->mm_lxt_c_1+offs; tmp = tmpfile(); if(!tmp) { fprintf(stderr, LXTHDR"could not open decompression tempfile, exiting.\n"); exit(255); } fwrite(t, GLOBALS->zfacgeometry_size_lxt_c_1, 1, tmp); fseek(tmp, 0, SEEK_SET); zhandle = gzdopen(dup(fileno(tmp)), "rb"); #else if(offs!=lseek(GLOBALS->fd_lxt_c_1, offs, SEEK_SET)) { fprintf(stderr, LXTHDR"zfacgeometry lseek error at offset %08x\n", (unsigned int)offs); exit(255); } zhandle = gzdopen(dup(GLOBALS->fd_lxt_c_1), "rb"); #endif GLOBALS->mmcache_lxt_c_1 = GLOBALS->mm_lxt_c_1; total_mem = GLOBALS->numfacs * 16; decmem = malloc_2(total_mem); GLOBALS->mm_lxt_c_1 = decmem; rc=gzread(zhandle, decmem, total_mem); DEBUG(printf(LXTHDR"section offs for facgeometry decompression = %08x of len %d\n", offs, GLOBALS->zfacgeometry_size_lxt_c_1)); DEBUG(printf(LXTHDR"Decompressed size is %d bytes (vs %d)\n", rc, total_mem)); if(rc!=total_mem) { fprintf(stderr, LXTHDR"decompression size disparity %d bytes (vs %d)\n", rc, total_mem); exit(255); } offs=0; /* we're in our new memory region now.. */ } for(i=0;inumfacs;i++) { GLOBALS->mvlfacs_lxt_c_2[i].node_alias=get_32(offs); node_block[i].msi=get_32(offs+4); node_block[i].lsi=get_32(offs+8); GLOBALS->mvlfacs_lxt_c_2[i].flags=get_32(offs+12); GLOBALS->mvlfacs_lxt_c_2[i].len=(node_block[i].lsi>node_block[i].msi)?(node_block[i].lsi-node_block[i].msi+1):(node_block[i].msi-node_block[i].lsi+1); if(GLOBALS->mvlfacs_lxt_c_2[i].len>GLOBALS->lt_len_lxt_c_1) GLOBALS->lt_len_lxt_c_1 = GLOBALS->mvlfacs_lxt_c_2[i].len; DEBUG(printf(LXTHDR"%s[%d:%d]\n", f_name[i], node_block[i].msi, node_block[i].lsi)); offs+=0x10; } GLOBALS->lt_buf_lxt_c_1 = malloc_2(GLOBALS->lt_len_lxt_c_1>255 ? GLOBALS->lt_len_lxt_c_1 : 256); /* in order to keep trivial LXT files from overflowing their buffer */ if(GLOBALS->zfacgeometry_size_lxt_c_1) { GLOBALS->mm_lxt_c_1 = GLOBALS->mmcache_lxt_c_1; free_2(decmem); decmem = NULL; gzclose(zhandle); #if defined __MINGW32__ || defined _MSC_VER fclose(tmp); #endif } } /* * build up the lastchange entries so we can start to walk * through the aet.. */ static void build_facs2(char *fname) { int i; off_t offs; int chg; int maxchg=0, maxindx=0; int last_position; TimeType last_time; char *decmem = NULL; int total_mem; gzFile zhandle = NULL; #if defined __MINGW32__ || defined _MSC_VER FILE *tmp; #endif if((!GLOBALS->time_table_offset_lxt_c_1)&&(!GLOBALS->time_table_offset64_lxt_c_1)) { fprintf(stderr, "LXT '%s' is missing a time table section, exiting.\n", fname); exit(255); } if((GLOBALS->time_table_offset_lxt_c_1)&&(GLOBALS->time_table_offset64_lxt_c_1)) { fprintf(stderr, "LXT '%s' has both 32 and 64-bit time table sections, exiting.\n", fname); exit(255); } if(GLOBALS->time_table_offset_lxt_c_1) { offs = GLOBALS->time_table_offset_lxt_c_1; DEBUG(printf(LXTHDR"Time table position: %08x\n", GLOBALS->time_table_offset_lxt_c_1 + 12)); GLOBALS->total_cycles_lxt_c_2=get_32(offs+0); DEBUG(printf(LXTHDR"Total cycles: %d\n", GLOBALS->total_cycles_lxt_c_2)); if(GLOBALS->ztime_table_size_lxt_c_1) { int rc; #if defined __MINGW32__ || defined _MSC_VER unsigned char *t = (char *)GLOBALS->mm_lxt_c_1+offs+4; tmp = tmpfile(); if(!tmp) { fprintf(stderr, LXTHDR"could not open decompression tempfile, exiting.\n"); exit(255); } fwrite(t, GLOBALS->ztime_table_size_lxt_c_1, 1, tmp); fseek(tmp, 0, SEEK_SET); zhandle = gzdopen(dup(fileno(tmp)), "rb"); #else if((offs+4)!=lseek(GLOBALS->fd_lxt_c_1, offs+4, SEEK_SET)) { fprintf(stderr, LXTHDR"ztime_table lseek error at offset %08x\n", (unsigned int)offs); exit(255); } zhandle = gzdopen(dup(GLOBALS->fd_lxt_c_1), "rb"); #endif GLOBALS->mmcache_lxt_c_1 = GLOBALS->mm_lxt_c_1; total_mem = 4 + 4 + (GLOBALS->total_cycles_lxt_c_2 * 4) + (GLOBALS->total_cycles_lxt_c_2 * 4); decmem = malloc_2(total_mem); GLOBALS->mm_lxt_c_1 = decmem; rc=gzread(zhandle, decmem, total_mem); DEBUG(printf(LXTHDR"section offs for timetable decompression = %08x of len %d\n", offs, GLOBALS->ztime_table_size_lxt_c_1)); DEBUG(printf(LXTHDR"Decompressed size is %d bytes (vs %d)\n", rc, total_mem)); if(rc!=total_mem) { fprintf(stderr, LXTHDR"decompression size disparity %d bytes (vs %d)\n", rc, total_mem); exit(255); } offs=0; /* we're in our new memory region now.. */ } else { offs+=4; /* skip past count to make consistent view between compressed/uncompressed */ } GLOBALS->first_cycle_lxt_c_2=get_32(offs); DEBUG(printf(LXTHDR"First cycle: %d\n", GLOBALS->first_cycle_lxt_c_2)); GLOBALS->last_cycle_lxt_c_2=get_32(offs+4); DEBUG(printf(LXTHDR"Last cycle: %d\n", GLOBALS->last_cycle_lxt_c_2)); DEBUG(printf(LXTHDR"Total cycles (actual): %d\n", GLOBALS->last_cycle_lxt_c_2-GLOBALS->first_cycle_lxt_c_2+1)); /* rebuild time table from its deltas... */ GLOBALS->positional_information_lxt_c_1 = (int *)malloc_2(GLOBALS->total_cycles_lxt_c_2 * sizeof(int)); last_position=0; offs+=8; for(i=0;itotal_cycles_lxt_c_2;i++) { last_position = GLOBALS->positional_information_lxt_c_1[i] = get_32(offs) + last_position; offs+=4; } GLOBALS->time_information = (TimeType *)malloc_2(GLOBALS->total_cycles_lxt_c_2 * sizeof(TimeType)); last_time=LLDescriptor(0); for(i=0;itotal_cycles_lxt_c_2;i++) { last_time = GLOBALS->time_information[i] = ((TimeType)get_32(offs)) + last_time; GLOBALS->time_information[i] *= (GLOBALS->time_scale); offs+=4; } if(GLOBALS->ztime_table_size_lxt_c_1) { GLOBALS->mm_lxt_c_1 = GLOBALS->mmcache_lxt_c_1; free_2(decmem); decmem = NULL; gzclose(zhandle); #if defined __MINGW32__ || defined _MSC_VER fclose(tmp); #endif } } else /* 64-bit read */ { offs = GLOBALS->time_table_offset64_lxt_c_1; DEBUG(printf(LXTHDR"Time table position: %08x\n", GLOBALS->time_table_offset64_lxt_c_1 + 20)); GLOBALS->total_cycles_lxt_c_2=(TimeType)((unsigned int)get_32(offs+0)); DEBUG(printf(LXTHDR"Total cycles: %d\n", GLOBALS->total_cycles_lxt_c_2)); if(GLOBALS->ztime_table_size_lxt_c_1) { int rc; #if defined __MINGW32__ || defined _MSC_VER unsigned char *t = (char *)GLOBALS->mm_lxt_c_1+offs+4; tmp = tmpfile(); if(!tmp) { fprintf(stderr, LXTHDR"could not open decompression tempfile, exiting.\n"); exit(255); } fwrite(t, GLOBALS->ztime_table_size_lxt_c_1, 1, tmp); fseek(tmp, 0, SEEK_SET); zhandle = gzdopen(dup(fileno(tmp)), "rb"); #else if((offs+4)!=lseek(GLOBALS->fd_lxt_c_1, offs+4, SEEK_SET)) { fprintf(stderr, LXTHDR"ztime_table lseek error at offset %08x\n", (unsigned int)offs); exit(255); } zhandle = gzdopen(dup(GLOBALS->fd_lxt_c_1), "rb"); #endif GLOBALS->mmcache_lxt_c_1 = GLOBALS->mm_lxt_c_1; total_mem = 8 + 8 + (GLOBALS->total_cycles_lxt_c_2 * 4) + (GLOBALS->total_cycles_lxt_c_2 * 8); decmem = malloc_2(total_mem); GLOBALS->mm_lxt_c_1 = decmem; rc=gzread(zhandle, decmem, total_mem); DEBUG(printf(LXTHDR"section offs for timetable decompression = %08x of len %d\n", offs, GLOBALS->ztime_table_size_lxt_c_1)); DEBUG(printf(LXTHDR"Decompressed size is %d bytes (vs %d)\n", rc, total_mem)); if(rc!=total_mem) { fprintf(stderr, LXTHDR"decompression size disparity %d bytes (vs %d)\n", rc, total_mem); exit(255); } offs=0; /* we're in our new memory region now.. */ } else { offs+=4; /* skip past count to make consistent view between compressed/uncompressed */ } GLOBALS->first_cycle_lxt_c_2=get_64(offs); DEBUG(printf(LXTHDR"First cycle: %d\n", GLOBALS->first_cycle_lxt_c_2)); GLOBALS->last_cycle_lxt_c_2=get_64(offs+8); DEBUG(printf(LXTHDR"Last cycle: %d\n", GLOBALS->last_cycle_lxt_c_2)); DEBUG(printf(LXTHDR"Total cycles (actual): %lld\n", GLOBALS->last_cycle_lxt_c_2-GLOBALS->first_cycle_lxt_c_2+1)); /* rebuild time table from its deltas... */ GLOBALS->positional_information_lxt_c_1 = (int *)malloc_2(GLOBALS->total_cycles_lxt_c_2 * sizeof(int)); last_position=0; offs+=16; for(i=0;itotal_cycles_lxt_c_2;i++) { last_position = GLOBALS->positional_information_lxt_c_1[i] = get_32(offs) + last_position; offs+=4; } GLOBALS->time_information = (TimeType *)malloc_2(GLOBALS->total_cycles_lxt_c_2 * sizeof(TimeType)); last_time=LLDescriptor(0); for(i=0;itotal_cycles_lxt_c_2;i++) { last_time = GLOBALS->time_information[i] = ((TimeType)get_64(offs)) + last_time; GLOBALS->time_information[i] *= (GLOBALS->time_scale); offs+=8; } if(GLOBALS->ztime_table_size_lxt_c_1) { GLOBALS->mm_lxt_c_1 = GLOBALS->mmcache_lxt_c_1; free_2(decmem); decmem = NULL; gzclose(zhandle); #if defined __MINGW32__ || defined _MSC_VER fclose(tmp); #endif } } if(GLOBALS->sync_table_offset_lxt_c_1) { offs = GLOBALS->sync_table_offset_lxt_c_1; if(GLOBALS->zsync_table_size_lxt_c_1) { int rc; #if defined __MINGW32__ || defined _MSC_VER unsigned char *t = (char *)GLOBALS->mm_lxt_c_1+offs; tmp = tmpfile(); if(!tmp) { fprintf(stderr, LXTHDR"could not open decompression tempfile, exiting.\n"); exit(255); } fwrite(t, GLOBALS->zsync_table_size_lxt_c_1, 1, tmp); fseek(tmp, 0, SEEK_SET); zhandle = gzdopen(dup(fileno(tmp)), "rb"); #else if(offs!=lseek(GLOBALS->fd_lxt_c_1, offs, SEEK_SET)) { fprintf(stderr, LXTHDR"zsync_table lseek error at offset %08x\n", (unsigned int)offs); exit(255); } zhandle = gzdopen(dup(GLOBALS->fd_lxt_c_1), "rb"); #endif GLOBALS->mmcache_lxt_c_1 = GLOBALS->mm_lxt_c_1; decmem = malloc_2(total_mem = GLOBALS->numfacs * 4); GLOBALS->mm_lxt_c_1 = decmem; rc=gzread(zhandle, decmem, total_mem); DEBUG(printf(LXTHDR"section offs for synctable decompression = %08x of len %d\n", offs, GLOBALS->zsync_table_size_lxt_c_1)); DEBUG(printf(LXTHDR"Decompressed size is %d bytes (vs %d)\n", rc, total_mem)); if(rc!=total_mem) { fprintf(stderr, LXTHDR"decompression size disparity %d bytes (vs %d)\n", rc, total_mem); exit(255); } offs=0; /* we're in our new memory region now.. */ } for(i=0;inumfacs;i++) { chg=get_32(offs); offs+=4; if(chg>maxchg) {maxchg=chg; maxindx=i; } GLOBALS->lastchange[i]=chg; } if(GLOBALS->zsync_table_size_lxt_c_1) { GLOBALS->mm_lxt_c_1 = GLOBALS->mmcache_lxt_c_1; free_2(decmem); decmem = NULL; gzclose(zhandle); #if defined __MINGW32__ || defined _MSC_VER fclose(tmp); #endif } GLOBALS->maxchange_lxt_c_1=maxchg; GLOBALS->maxindex_lxt_c_1=maxindx; } if(GLOBALS->zchg_size_lxt_c_1) { /* we don't implement the tempfile version for windows... */ #if !defined __MINGW32__ && !defined _MSC_VER if(GLOBALS->zchg_predec_size_lxt_c_1 > LXT_MMAP_MALLOC_BOUNDARY) { int fd_dummy; char *nam = tmpnam_2(NULL, &fd_dummy); FILE *tmp = fopen(nam, "wb"); unsigned int len=GLOBALS->zchg_predec_size_lxt_c_1; int rc; char buf[32768]; int fd2 = open(nam, O_RDONLY); char testbyte[2]={0,0}; char is_bz2; unlink(nam); if(fd_dummy >=0) close(fd_dummy); fprintf(stderr, LXTHDR"Compressed change records detected, making tempfile...\n"); if(GLOBALS->change_field_offset_lxt_c_1 != lseek(GLOBALS->fd_lxt_c_1, GLOBALS->change_field_offset_lxt_c_1, SEEK_SET)) { fprintf(stderr, LXTHDR"lseek error at offset %08x\n", (unsigned int)GLOBALS->change_field_offset_lxt_c_1); exit(255); } is_bz2 = (read(GLOBALS->fd_lxt_c_1, &testbyte, 2))&&(testbyte[0]=='B')&&(testbyte[1]=='Z'); if(GLOBALS->change_field_offset_lxt_c_1 != lseek(GLOBALS->fd_lxt_c_1, GLOBALS->change_field_offset_lxt_c_1, SEEK_SET)) { fprintf(stderr, LXTHDR"lseek error at offset %08x\n", (unsigned int)GLOBALS->change_field_offset_lxt_c_1); exit(255); } if(is_bz2) { zhandle = BZ2_bzdopen(dup(GLOBALS->fd_lxt_c_1), "rb"); while(len) { int siz = (len>32768) ? 32768 : len; rc = BZ2_bzread(zhandle, buf, siz); if(rc!=siz) { fprintf(stderr, LXTHDR"gzread error to tempfile %d (act) vs %d (exp), exiting.\n", rc, siz); exit(255); } if(1 != fwrite(buf, siz, 1, tmp)) { fprintf(stderr, LXTHDR"fwrite error to tempfile, exiting.\n"); exit(255); }; len -= siz; } fprintf(stderr, LXTHDR"...expanded %08x into %08x bytes.\n", GLOBALS->zchg_size_lxt_c_1, GLOBALS->zchg_predec_size_lxt_c_1); BZ2_bzclose(zhandle); } else { zhandle = gzdopen(dup(GLOBALS->fd_lxt_c_1), "rb"); while(len) { int siz = (len>32768) ? 32768 : len; rc = gzread(zhandle, buf, siz); if(rc!=siz) { fprintf(stderr, LXTHDR"gzread error to tempfile %d (act) vs %d (exp), exiting.\n", rc, siz); exit(255); } if(1 != fwrite(buf, siz, 1, tmp)) { fprintf(stderr, LXTHDR"fwrite error to tempfile, exiting.\n"); exit(255); }; len -= siz; } fprintf(stderr, LXTHDR"...expanded %08x into %08x bytes.\n", GLOBALS->zchg_size_lxt_c_1, GLOBALS->zchg_predec_size_lxt_c_1); gzclose(zhandle); } munmap(GLOBALS->mm_lxt_c_1, GLOBALS->f_len_lxt_c_1); close(GLOBALS->fd_lxt_c_1); fflush(tmp); fseeko(tmp, 0, SEEK_SET); fclose(tmp); GLOBALS->fd_lxt_c_1 = fd2; GLOBALS->mm_lxt_c_1=mmap(NULL, GLOBALS->zchg_predec_size_lxt_c_1, PROT_READ, MAP_SHARED, GLOBALS->fd_lxt_c_1, 0); GLOBALS->mm_lxt_mmap_addr = GLOBALS->mm_lxt_c_1; GLOBALS->mm_lxt_mmap_len = GLOBALS->zchg_predec_size_lxt_c_1; GLOBALS->mm_lxt_c_1=(void *)((char *)GLOBALS->mm_lxt_c_1-4); /* because header and version don't exist in packed change records */ } else #endif { unsigned int len=GLOBALS->zchg_predec_size_lxt_c_1; int rc; char *buf = malloc_2(GLOBALS->zchg_predec_size_lxt_c_1); char *pnt = buf; char testbyte[2]={0,0}; char is_bz2; fprintf(stderr, LXTHDR"Compressed change records detected...\n"); #if defined __MINGW32__ || defined _MSC_VER { unsigned char *t = (char *)GLOBALS->mm_lxt_c_1+GLOBALS->change_field_offset_lxt_c_1; tmp = tmpfile(); if(!tmp) { fprintf(stderr, LXTHDR"could not open decompression tempfile, exiting.\n"); exit(255); } fwrite(t, GLOBALS->zchg_size_lxt_c_1, 1, tmp); fseek(tmp, 0, SEEK_SET); is_bz2 = (get_byte(GLOBALS->change_field_offset_lxt_c_1)=='B') && (get_byte(GLOBALS->change_field_offset_lxt_c_1+1)=='Z'); } #else if(GLOBALS->change_field_offset_lxt_c_1 != lseek(GLOBALS->fd_lxt_c_1, GLOBALS->change_field_offset_lxt_c_1, SEEK_SET)) { fprintf(stderr, LXTHDR"lseek error at offset %08x\n", (unsigned int)GLOBALS->change_field_offset_lxt_c_1); exit(255); } is_bz2 = (read(GLOBALS->fd_lxt_c_1, &testbyte, 2))&&(testbyte[0]=='B')&&(testbyte[1]=='Z'); if(GLOBALS->change_field_offset_lxt_c_1 != lseek(GLOBALS->fd_lxt_c_1, GLOBALS->change_field_offset_lxt_c_1, SEEK_SET)) { fprintf(stderr, LXTHDR"lseek error at offset %08x\n", (unsigned int)GLOBALS->change_field_offset_lxt_c_1); exit(255); } #endif if(is_bz2) { #if defined __MINGW32__ || defined _MSC_VER zhandle = BZ2_bzdopen(dup(fileno(tmp)), "rb"); #else zhandle = BZ2_bzdopen(dup(GLOBALS->fd_lxt_c_1), "rb"); #endif while(len) { int siz = (len>32768) ? 32768 : len; rc = BZ2_bzread(zhandle, pnt, siz); if(rc!=siz) { fprintf(stderr, LXTHDR"BZ2_bzread error to buffer %d (act) vs %d (exp), exiting.\n", rc, siz); exit(255); } pnt += siz; len -= siz; } fprintf(stderr, LXTHDR"...expanded %08x into %08x bytes.\n", GLOBALS->zchg_size_lxt_c_1, GLOBALS->zchg_predec_size_lxt_c_1); BZ2_bzclose(zhandle); } else { #if defined __MINGW32__ || defined _MSC_VER zhandle = gzdopen(dup(fileno(tmp)), "rb"); #else zhandle = gzdopen(dup(GLOBALS->fd_lxt_c_1), "rb"); #endif while(len) { int siz = (len>32768) ? 32768 : len; rc = gzread(zhandle, pnt, siz); if(rc!=siz) { fprintf(stderr, LXTHDR"gzread error to buffer %d (act) vs %d (exp), exiting.\n", rc, siz); exit(255); } pnt += siz; len -= siz; } fprintf(stderr, LXTHDR"...expanded %08x into %08x bytes.\n", GLOBALS->zchg_size_lxt_c_1, GLOBALS->zchg_predec_size_lxt_c_1); gzclose(zhandle); #if defined __MINGW32__ || defined _MSC_VER fclose(tmp); #endif } munmap(GLOBALS->mm_lxt_c_1, GLOBALS->f_len_lxt_c_1); #if !defined __MINGW32__ && !defined _MSC_VER close(GLOBALS->fd_lxt_c_1); #endif GLOBALS->fd_lxt_c_1=-1; GLOBALS->mm_lxt_c_1=buf-4; /* because header and version don't exist in packed change records */ } } if(!GLOBALS->sync_table_offset_lxt_c_1) { off_t vlen = GLOBALS->zchg_predec_size_lxt_c_1 ? GLOBALS->zchg_predec_size_lxt_c_1+4 : 0; unsigned int numfacs_bytes; unsigned int num_records = 0; unsigned int last_change_delta, numbytes; int *positional_compar = GLOBALS->positional_information_lxt_c_1; int *positional_kill_pnt = GLOBALS->positional_information_lxt_c_1 + GLOBALS->total_cycles_lxt_c_2; char positional_kill = 0; unsigned int dict_16_offset_new = 0; unsigned int dict_24_offset_new = 0; unsigned int dict_32_offset_new = 0; char *nam; FILE *tmp; int recfd; int fd_dummy; offs = GLOBALS->zchg_predec_size_lxt_c_1 ? 4 : 0; fprintf(stderr, LXTHDR"Linear LXT encountered...\n"); if(!GLOBALS->zchg_predec_size_lxt_c_1) { fprintf(stderr, LXTHDR"Uncompressed linear LXT not supported, exiting.\n"); exit(255); } if(GLOBALS->numfacs >= 256*65536) { numfacs_bytes = 3; } else if(GLOBALS->numfacs >= 65536) { numfacs_bytes = 2; } else if(GLOBALS->numfacs >= 256) { numfacs_bytes = 1; } else { numfacs_bytes = 0; } nam = tmpnam_2(NULL, &fd_dummy); tmp = fopen(nam, "wb"); GLOBALS->fpos_lxt_c_1 = 4; /* fake 4 bytes padding */ recfd = open(nam, O_RDONLY); unlink(nam); if(fd_dummy >=0) close(fd_dummy); while(offs < vlen) { int facidx = 0; unsigned char cmd; off_t offscache2, offscache3; unsigned int height; unsigned char cmdkill; num_records++; /* remake time vs position table on the fly */ if(!positional_kill) { if(offs == *positional_compar) { *positional_compar = GLOBALS->fpos_lxt_c_1; positional_compar++; if(positional_compar == positional_kill_pnt) positional_kill = 1; } } switch(numfacs_bytes&3) { case 0: facidx = get_byte(offs); break; case 1: facidx = get_16(offs); break; case 2: facidx = get_24(offs); break; case 3: facidx = get_32(offs); break; } if(facidx>GLOBALS->numfacs) { fprintf(stderr, LXTHDR"Facidx %d out of range (vs %d) at offset %08x, exiting.\n", facidx, GLOBALS->numfacs, (unsigned int)offs); exit(255); } offs += (numfacs_bytes+1); cmdkill = GLOBALS->mvlfacs_lxt_c_2[facidx].flags & (LT_SYM_F_DOUBLE|LT_SYM_F_STRING); if(!cmdkill) { cmd = get_byte(offs); if(cmd>0xf) { fprintf(stderr, LXTHDR"Command byte %02x invalid at offset %08x, exiting.\n", cmd, (unsigned int)offs); exit(0); } offs++; } else { cmd=0; } offscache2 = offs; height = GLOBALS->mvlfacs_lxt_c_2[facidx].node_alias; if(height) { if(height >= 256*65536) { offs += 4; } else if(height >= 65536) { offs += 3; } else if(height >= 256) { offs += 2; } else { offs += 1; } } offscache3 = offs; if(!dict_16_offset_new) { if (offs == GLOBALS->dict_16_offset_lxt_c_1) { dict_16_offset_new = GLOBALS->fpos_lxt_c_1; } } else if(!dict_24_offset_new) { if (offs == GLOBALS->dict_24_offset_lxt_c_1) { dict_24_offset_new = GLOBALS->fpos_lxt_c_1; } } else if(!dict_32_offset_new) { if (offs == GLOBALS->dict_32_offset_lxt_c_1) { dict_32_offset_new = GLOBALS->fpos_lxt_c_1; } } /* printf("%08x : %04x %02x (%d) %s[%d:%d]\n", offscache, facidx, cmd, mvlfacs[facidx].len, mvlfacs[facidx].f_name, mvlfacs[facidx].msb, mvlfacs[facidx].lsb); */ if(!cmdkill) switch(cmd) { unsigned int modlen; case 0x0: modlen = (!(GLOBALS->mvlfacs_lxt_c_2[facidx].flags<_SYM_F_INTEGER)) ? GLOBALS->mvlfacs_lxt_c_2[facidx].len : 32; if((GLOBALS->dict_string_mem_array_lxt_c_1) && (modlen>GLOBALS->dict_width_lxt_c_1)) { if((!GLOBALS->dict_16_offset_lxt_c_1)||(offscache3dict_16_offset_lxt_c_1)) { offs += 1; } else if((!GLOBALS->dict_24_offset_lxt_c_1)||(offscache3dict_24_offset_lxt_c_1)) { offs += 2; } else if((!GLOBALS->dict_32_offset_lxt_c_1)||(offscache3dict_32_offset_lxt_c_1)) { offs += 3; } else { offs += 4; } } else { offs += (modlen + 7)/8; /* was offs += (GLOBALS->mvlfacs_lxt_c_2[facidx].len + 7)/8 which is wrong for integers! */ } break; case 0x1: offs += (GLOBALS->mvlfacs_lxt_c_2[facidx].len + 3)/4; break; case 0x2: offs += (GLOBALS->mvlfacs_lxt_c_2[facidx].len + 1)/2; break; case 0x3: case 0x4: case 0x5: case 0x6: case 0x7: case 0x8: case 0x9: case 0xa: case 0xb: break; /* single byte, no extra "skip" */ case 0xc: case 0xd: case 0xe: case 0xf: offs += ((cmd&3)+1); /* skip past numbytes_trans */ break; } else { /* cmdkill = 1 for strings + reals skip bytes */ if(GLOBALS->mvlfacs_lxt_c_2[facidx].flags & LT_SYM_F_DOUBLE) { offs += 8; } else /* strings */ { while(get_byte(offs)) offs++; offs++; } } last_change_delta = GLOBALS->fpos_lxt_c_1 - GLOBALS->lastchange[facidx] - 2; GLOBALS->lastchange[facidx] = GLOBALS->fpos_lxt_c_1; GLOBALS->maxchange_lxt_c_1=GLOBALS->fpos_lxt_c_1; GLOBALS->maxindex_lxt_c_1=facidx; if(last_change_delta >= 256*65536) { numbytes = 3; } else if(last_change_delta >= 65536) { numbytes = 2; } else if(last_change_delta >= 256) { numbytes = 1; } else { numbytes = 0; } lt_emit_u8(tmp, (numbytes<<4) | cmd); switch(numbytes&3) { case 0: lt_emit_u8(tmp, last_change_delta); break; case 1: lt_emit_u16(tmp, last_change_delta); break; case 2: lt_emit_u24(tmp, last_change_delta); break; case 3: lt_emit_u32(tmp, last_change_delta); break; } if(offs-offscache2) { GLOBALS->fpos_lxt_c_1 += fwrite((char *)GLOBALS->mm_lxt_c_1+offscache2, 1, offs-offscache2, tmp); /* copy rest of relevant info */ } } GLOBALS->dict_16_offset_lxt_c_1 = dict_16_offset_new; GLOBALS->dict_24_offset_lxt_c_1 = dict_24_offset_new; GLOBALS->dict_32_offset_lxt_c_1 = dict_32_offset_new; fflush(tmp); fseeko(tmp, 0, SEEK_SET); fclose(tmp); fprintf(stderr, LXTHDR"%d linear records converted into %08x bytes.\n", num_records, GLOBALS->fpos_lxt_c_1-4); #if !defined __MINGW32__ && !defined _MSC_VER if(GLOBALS->zchg_predec_size_lxt_c_1 > LXT_MMAP_MALLOC_BOUNDARY) { munmap((char *)GLOBALS->mm_lxt_c_1+4, GLOBALS->zchg_predec_size_lxt_c_1); close(GLOBALS->fd_lxt_c_1); GLOBALS->mm_lxt_mmap_addr = NULL; GLOBALS->mm_lxt_mmap_len = 0; } else #endif { free_2((char *)GLOBALS->mm_lxt_c_1+4); } GLOBALS->fd_lxt_c_1 = recfd; #if defined __MINGW32__ || defined _MSC_VER win_fname = nam; #endif GLOBALS->mm_lxt_c_1=mmap(NULL, GLOBALS->fpos_lxt_c_1-4, PROT_READ, MAP_SHARED, recfd, 0); GLOBALS->mm_lxt_mmap_addr = GLOBALS->mm_lxt_c_1; GLOBALS->mm_lxt_mmap_len = GLOBALS->fpos_lxt_c_1-4; GLOBALS->mm_lxt_c_1=(void *)((char *)GLOBALS->mm_lxt_c_1-4); /* because header and version don't exist in packed change records */ } } /* * given a fac+offset, return the binary data for it */ static char *parse_offset(struct fac *which, off_t offs) { int v, v2; unsigned int j; int k; unsigned int l; char *pnt; char repeat; l=which->len; pnt = GLOBALS->lt_buf_lxt_c_1; v=get_byte(offs); v2=v&0x0f; switch(v2) { case 0x00: /* MVL2 */ { unsigned int msk; unsigned int bitcnt=0; int ch; if((GLOBALS->dict_string_mem_array_lxt_c_1) && (l>GLOBALS->dict_width_lxt_c_1)) { unsigned int dictpos; unsigned int ld; offs += ((v>>4)&3)+2; /* skip value */ if((!GLOBALS->dict_16_offset_lxt_c_1)||(offsdict_16_offset_lxt_c_1)) { dictpos = get_byte(offs); } else if((!GLOBALS->dict_24_offset_lxt_c_1)||(offsdict_24_offset_lxt_c_1)) { dictpos = get_16(offs); } else if((!GLOBALS->dict_32_offset_lxt_c_1)||(offsdict_32_offset_lxt_c_1)) { dictpos = get_24(offs); } else { dictpos = get_32(offs); } if(dictpos <= GLOBALS->dict_num_entries_lxt_c_1) { ld = strlen(GLOBALS->dict_string_mem_array_lxt_c_1[dictpos]); for(j=0;j<(l-(ld+1));j++) { *(pnt++) = '0'; } *(pnt++) = '1'; memcpy(pnt, GLOBALS->dict_string_mem_array_lxt_c_1[dictpos], ld); } else { fprintf(stderr, LXTHDR"dict entry at offset %08x [%d] out of range, ignoring!\n", dictpos, (unsigned int)offs); for(j=0;j>4)&3)+2; /* skip value */ for(j=0;;j++) { ch=get_byte(offs+j); msk=0x80; for(k=0;k<8;k++) { *(pnt++)= (ch&msk) ? '1' : '0'; msk>>=1; bitcnt++; if(bitcnt==l) goto bail; } } } } break; case 0x01: /* MVL4 */ { unsigned int bitcnt=0; int ch; int rsh; offs += ((v>>4)&3)+2; /* skip value */ for(j=0;;j++) { ch=get_byte(offs+j); rsh=6; for(k=0;k<4;k++) { *(pnt++)=convert_mvl((ch>>rsh)&0x3); rsh-=2; bitcnt++; if(bitcnt==l) goto bail; } } } break; case 0x02: /* MVL9 */ { unsigned int bitcnt=0; int ch; int rsh; offs += ((v>>4)&3)+2; /* skip value */ for(j=0;;j++) { ch=get_byte(offs+j); rsh=4; for(k=0;k<2;k++) { *(pnt++)=convert_mvl(ch>>rsh); rsh-=4; bitcnt++; if(bitcnt==l) goto bail; } } } break; case 0x03: /* mvl repeat expansions */ case 0x04: case 0x05: case 0x06: case 0x07: case 0x08: case 0x09: case 0x0a: case 0x0b: repeat = convert_mvl(v2-3); for(j=0;jlt_buf_lxt_c_1); } /* * mainline */ TimeType lxt_main(char *fname) { int i; struct Node *n; struct symbol *s, *prevsymroot=NULL, *prevsym=NULL; off_t tagpnt; int tag; struct symbol *sym_block = NULL; struct Node *node_block = NULL; char **f_name = NULL; GLOBALS->fd_lxt_c_1=open(fname, O_RDONLY); if(GLOBALS->fd_lxt_c_1<0) { fprintf(stderr, "Could not open '%s', exiting.\n", fname); vcd_exit(255); } GLOBALS->f_len_lxt_c_1=lseek(GLOBALS->fd_lxt_c_1, (off_t)0, SEEK_END); #if defined __MINGW32__ || defined _MSC_VER win_fname = fname; #endif GLOBALS->mm_lxt_c_1=mmap(NULL, GLOBALS->f_len_lxt_c_1, PROT_READ, MAP_SHARED, GLOBALS->fd_lxt_c_1, 0); GLOBALS->mm_lxt_mmap_addr = GLOBALS->mm_lxt_c_1; GLOBALS->mm_lxt_mmap_len = GLOBALS->f_len_lxt_c_1; if(get_16((off_t)0)!=LT_HDRID) /* scan-build, assign to i= from get_16 removed */ { fprintf(stderr, "Not an LXT format AET, exiting.\n"); vcd_exit(255); } if((GLOBALS->version_lxt_c_1=get_16((off_t)2))>LT_VERSION) { fprintf(stderr, "Version %d of LXT format AETs not supported, exiting.\n", GLOBALS->version_lxt_c_1); vcd_exit(255); } if(get_byte(GLOBALS->f_len_lxt_c_1-1)!=LT_TRLID) { fprintf(stderr, "LXT '%s' is truncated, exiting.\n", fname); vcd_exit(255); } DEBUG(printf(LXTHDR"Loading LXT '%s'...\n", fname)); DEBUG(printf(LXTHDR"Len: %d\n", (unsigned int)GLOBALS->f_len_lxt_c_1)); /* SPLASH */ splash_create(); tagpnt = GLOBALS->f_len_lxt_c_1-2; while((tag=get_byte(tagpnt))!=LT_SECTION_END) { off_t offset = get_32(tagpnt-4); tagpnt-=5; switch(tag) { case LT_SECTION_CHG: GLOBALS->change_field_offset_lxt_c_1=offset; DEBUG(printf(LXTHDR"LT_SECTION_CHG at %08x\n", offset)); break; case LT_SECTION_SYNC_TABLE: GLOBALS->sync_table_offset_lxt_c_1=offset; DEBUG(printf(LXTHDR"LT_SECTION_SYNC_TABLE at %08x\n", offset)); break; case LT_SECTION_FACNAME: GLOBALS->facname_offset_lxt_c_1=offset; DEBUG(printf(LXTHDR"LT_SECTION_FACNAME at %08x\n", offset)); break; case LT_SECTION_FACNAME_GEOMETRY: GLOBALS->facgeometry_offset_lxt_c_1=offset; DEBUG(printf(LXTHDR"LT_SECTION_FACNAME_GEOMETRY at %08x\n", offset)); break; case LT_SECTION_TIMESCALE: GLOBALS->timescale_offset_lxt_c_1=offset; DEBUG(printf(LXTHDR"LT_SECTION_TIMESCALE at %08x\n", offset)); break; case LT_SECTION_TIME_TABLE: GLOBALS->time_table_offset_lxt_c_1=offset; DEBUG(printf(LXTHDR"LT_SECTION_TIME_TABLE at %08x\n", offset)); break; case LT_SECTION_TIME_TABLE64: GLOBALS->time_table_offset64_lxt_c_1=offset; DEBUG(printf(LXTHDR"LT_SECTION_TIME_TABLE64 at %08x\n", offset)); break; case LT_SECTION_INITIAL_VALUE: GLOBALS->initial_value_offset_lxt_c_1=offset; DEBUG(printf(LXTHDR"LT_SECTION_INITIAL_VALUE at %08x\n", offset)); break; case LT_SECTION_DOUBLE_TEST: GLOBALS->double_test_offset_lxt_c_1=offset; DEBUG(printf(LXTHDR"LT_SECTION_DOUBLE_TEST at %08x\n", offset)); break; case LT_SECTION_ZFACNAME_PREDEC_SIZE: GLOBALS->zfacname_predec_size_lxt_c_1=offset; DEBUG(printf(LXTHDR"LT_SECTION_ZFACNAME_PREDEC_SIZE = %08x\n", offset)); break; case LT_SECTION_ZFACNAME_SIZE: GLOBALS->zfacname_size_lxt_c_1=offset; DEBUG(printf(LXTHDR"LT_SECTION_ZFACNAME_SIZE = %08x\n", offset)); break; case LT_SECTION_ZFACNAME_GEOMETRY_SIZE: GLOBALS->zfacgeometry_size_lxt_c_1=offset; DEBUG(printf(LXTHDR"LT_SECTION_ZFACNAME_GEOMETRY_SIZE = %08x\n", offset)); break; case LT_SECTION_ZSYNC_SIZE: GLOBALS->zsync_table_size_lxt_c_1=offset; DEBUG(printf(LXTHDR"LT_SECTION_ZSYNC_SIZE = %08x\n", offset)); break; case LT_SECTION_ZTIME_TABLE_SIZE: GLOBALS->ztime_table_size_lxt_c_1=offset; DEBUG(printf(LXTHDR"LT_SECTION_ZTIME_TABLE_SIZE = %08x\n", offset)); break; case LT_SECTION_ZCHG_PREDEC_SIZE: GLOBALS->zchg_predec_size_lxt_c_1=offset; DEBUG(printf(LXTHDR"LT_SECTION_ZCHG_PREDEC_SIZE = %08x\n", offset)); break; case LT_SECTION_ZCHG_SIZE: GLOBALS->zchg_size_lxt_c_1=offset; DEBUG(printf(LXTHDR"LT_SECTION_ZCHG_SIZE = %08x\n", offset)); break; case LT_SECTION_ZDICTIONARY: GLOBALS->zdictionary_offset_lxt_c_1=offset; DEBUG(printf(LXTHDR"LT_SECTION_ZDICTIONARY = %08x\n", offset)); break; case LT_SECTION_ZDICTIONARY_SIZE: GLOBALS->zdictionary_predec_size_lxt_c_1=offset; DEBUG(printf(LXTHDR"LT_SECTION_ZDICTIONARY_SIZE = %08x\n", offset)); break; case LT_SECTION_EXCLUDE_TABLE: GLOBALS->exclude_offset_lxt_c_1=offset; DEBUG(printf(LXTHDR"LT_SECTION_EXCLUDE_TABLE = %08x\n", offset)); break; case LT_SECTION_TIMEZERO: GLOBALS->lxt_timezero_offset=offset; DEBUG(printf(LXTHDR"LT_SECTION_TIMEZERO = %08x\n", offset)); break; default: fprintf(stderr, "Skipping unknown section tag %02x.\n", tag); break; } } if(GLOBALS->lxt_timezero_offset) { GLOBALS->global_time_offset = get_64(GLOBALS->lxt_timezero_offset); } if(GLOBALS->exclude_offset_lxt_c_1) { off_t offset = GLOBALS->exclude_offset_lxt_c_1; int ix, num_blackouts = get_32(offset); TimeType bs, be; struct blackout_region_t *bt; offset+=4; for(ix=0;ixbstart = bs; bt->bend = be; bt->next = GLOBALS->blackout_regions; GLOBALS->blackout_regions = bt; } } if(GLOBALS->double_test_offset_lxt_c_1) { create_double_endian_mask(GLOBALS->double_test_offset_lxt_c_1); } if(GLOBALS->timescale_offset_lxt_c_1) { signed char scale; scale=(signed char)get_byte(GLOBALS->timescale_offset_lxt_c_1); exponent_to_time_scale(scale); } else { GLOBALS->time_dimension = 'n'; } if(!GLOBALS->facname_offset_lxt_c_1) { fprintf(stderr, "LXT '%s' is missing a facility name section, exiting.\n", fname); vcd_exit(255); } GLOBALS->numfacs=get_32(GLOBALS->facname_offset_lxt_c_1); DEBUG(printf(LXTHDR"Number of facs: %d\n", GLOBALS->numfacs)); GLOBALS->mvlfacs_lxt_c_2=(struct fac *)calloc_2(GLOBALS->numfacs,sizeof(struct fac)); GLOBALS->resolve_lxt_alias_to=(struct Node **)calloc_2(GLOBALS->numfacs,sizeof(struct Node *)); GLOBALS->lastchange=(unsigned int *)calloc_2(GLOBALS->numfacs,sizeof(unsigned int)); f_name = calloc_2(GLOBALS->numfacs,sizeof(char *)); if(GLOBALS->initial_value_offset_lxt_c_1) { switch(get_byte(GLOBALS->initial_value_offset_lxt_c_1)) { case 0: GLOBALS->initial_value_lxt_c_1 = AN_0; break; case 1: GLOBALS->initial_value_lxt_c_1 = AN_1; break; case 2: GLOBALS->initial_value_lxt_c_1 = AN_Z; break; case 4: GLOBALS->initial_value_lxt_c_1 = AN_H; break; case 5: GLOBALS->initial_value_lxt_c_1 = AN_U; break; case 6: GLOBALS->initial_value_lxt_c_1 = AN_W; break; case 7: GLOBALS->initial_value_lxt_c_1 = AN_L; break; case 8: GLOBALS->initial_value_lxt_c_1 = AN_DASH; break; default: GLOBALS->initial_value_lxt_c_1 = AN_X; break; } } else { GLOBALS->initial_value_lxt_c_1 = AN_X; } if(GLOBALS->zdictionary_offset_lxt_c_1) { if(GLOBALS->zdictionary_predec_size_lxt_c_1) { build_dict(); } else { fprintf(stderr, "LXT '%s' is missing a zdictionary_predec_size chunk, exiting.\n", fname); vcd_exit(255); } } sym_block = (struct symbol *)calloc_2(GLOBALS->numfacs, sizeof(struct symbol)); node_block = (struct Node *)calloc_2(GLOBALS->numfacs,sizeof(struct Node)); build_facs(fname, f_name, node_block); /* SPLASH */ splash_sync(1, 5); build_facs2(fname); /* SPLASH */ splash_sync(2, 5); /* do your stuff here..all useful info has been initialized by now */ if(!GLOBALS->hier_was_explicitly_set) /* set default hierarchy split char */ { GLOBALS->hier_delimeter='.'; } for(i=0;inumfacs;i++) { char buf[4096]; char *str; struct fac *f; if(GLOBALS->mvlfacs_lxt_c_2[i].flags<_SYM_F_ALIAS) { int alias = GLOBALS->mvlfacs_lxt_c_2[i].node_alias; f=GLOBALS->mvlfacs_lxt_c_2+alias; while(f->flags<_SYM_F_ALIAS) { f=GLOBALS->mvlfacs_lxt_c_2+f->node_alias; } } else { f=GLOBALS->mvlfacs_lxt_c_2+i; } if((f->len>1)&& (!(f->flags&(LT_SYM_F_INTEGER|LT_SYM_F_DOUBLE|LT_SYM_F_STRING))) ) { int len = sprintf(buf, "%s[%d:%d]", f_name[i],node_block[i].msi, node_block[i].lsi); str=malloc_2(len+1); if(!GLOBALS->alt_hier_delimeter) { strcpy(str, buf); } else { strcpy_vcdalt(str, buf, GLOBALS->alt_hier_delimeter); } s=&sym_block[i]; symadd_name_exists_sym_exists(s,str,0); prevsymroot = prevsym = NULL; } else { int gatecmp = (f->len==1) && (!(f->flags&(LT_SYM_F_INTEGER|LT_SYM_F_DOUBLE|LT_SYM_F_STRING))) && (node_block[i].msi!=-1) && (node_block[i].lsi!=-1); int revcmp = gatecmp && (i) && (!strcmp(f_name[i], f_name[i-1])); if(gatecmp) { int len = sprintf(buf, "%s[%d]", f_name[i],node_block[i].msi); str=malloc_2(len+1); if(!GLOBALS->alt_hier_delimeter) { strcpy(str, buf); } else { strcpy_vcdalt(str, buf, GLOBALS->alt_hier_delimeter); } s=&sym_block[i]; symadd_name_exists_sym_exists(s,str,0); if((prevsym)&&(revcmp)&&(!strchr(f_name[i], '\\'))) /* allow chaining for search functions.. */ { prevsym->vec_root = prevsymroot; prevsym->vec_chain = s; s->vec_root = prevsymroot; prevsym = s; } else { prevsymroot = prevsym = s; } } else { str=malloc_2(strlen(f_name[i])+1); if(!GLOBALS->alt_hier_delimeter) { strcpy(str, f_name[i]); } else { strcpy_vcdalt(str, f_name[i], GLOBALS->alt_hier_delimeter); } s=&sym_block[i]; symadd_name_exists_sym_exists(s,str,0); prevsymroot = prevsym = NULL; if(f->flags<_SYM_F_INTEGER) { node_block[i].msi=31; node_block[i].lsi=0; GLOBALS->mvlfacs_lxt_c_2[i].len=32; } } } n=&node_block[i]; n->nname=s->name; n->mv.mvlfac = GLOBALS->mvlfacs_lxt_c_2+i; if((f->len>1)||(f->flags&(LT_SYM_F_DOUBLE|LT_SYM_F_STRING))) { n->extvals = 1; } n->head.time=-1; /* mark 1st node as negative time */ n->head.v.h_val=AN_X; s->n=n; } free_2(f_name[0]); /* the start of the big decompression buffer */ for(i=0;inumfacs;i++) { f_name[i] = NULL; } free_2(f_name); f_name = NULL; /* SPLASH */ splash_sync(3, 5); GLOBALS->facs=(struct symbol **)malloc_2(GLOBALS->numfacs*sizeof(struct symbol *)); for(i=0;inumfacs;i++) { char *subst, ch; int len; int esc = 0; GLOBALS->facs[i]=&sym_block[i]; if((len=strlen(subst=GLOBALS->facs[i]->name))>GLOBALS->longestname) GLOBALS->longestname=len; while((ch=(*subst))) { #ifdef WAVE_HIERFIX if(ch==GLOBALS->hier_delimeter) { *subst=(!esc) ? VCDNAM_HIERSORT : VCDNAM_ESCAPE; } /* forces sort at hier boundaries */ #else if((ch==GLOBALS->hier_delimeter)&&(esc)) { *subst = VCDNAM_ESCAPE; } /* forces sort at hier boundaries */ #endif else if(ch=='\\') { esc = 1; GLOBALS->escaped_names_found_vcd_c_1 = 1; } subst++; } } fprintf(stderr, LXTHDR"Sorting facilities at hierarchy boundaries..."); wave_heapsort(GLOBALS->facs,GLOBALS->numfacs); fprintf(stderr, "sorted.\n"); #ifdef WAVE_HIERFIX for(i=0;inumfacs;i++) { char *subst, ch; subst=GLOBALS->facs[i]->name; while((ch=(*subst))) { if(ch==VCDNAM_HIERSORT) { *subst=GLOBALS->hier_delimeter; } /* restore back to normal */ subst++; } #ifdef DEBUG_FACILITIES printf("%-4d %s\n",i,facs[i]->name); #endif } #endif GLOBALS->facs_are_sorted=1; fprintf(stderr, LXTHDR"Building facility hierarchy tree..."); /* SPLASH */ splash_sync(4, 5); init_tree(); for(i=0;inumfacs;i++) { char *nf = GLOBALS->facs[i]->name; build_tree_from_name(nf, i); } /* SPLASH */ splash_sync(5, 5); if(GLOBALS->escaped_names_found_vcd_c_1) { for(i=0;inumfacs;i++) { char *subst, ch; subst=GLOBALS->facs[i]->name; while((ch=(*subst))) { if(ch==VCDNAM_ESCAPE) { *subst=GLOBALS->hier_delimeter; } /* restore back to normal */ subst++; } #ifdef DEBUG_FACILITIES printf("%-4d %s\n",i,facs[i]->name); #endif } } treegraft(&GLOBALS->treeroot); treesort(GLOBALS->treeroot, NULL); if(GLOBALS->escaped_names_found_vcd_c_1) { treenamefix(GLOBALS->treeroot); } fprintf(stderr, "built.\n\n"); #ifdef DEBUG_FACILITIES treedebug(GLOBALS->treeroot,""); #endif GLOBALS->min_time = GLOBALS->first_cycle_lxt_c_2*GLOBALS->time_scale; GLOBALS->max_time=GLOBALS->last_cycle_lxt_c_2*GLOBALS->time_scale; fprintf(stderr, "["TTFormat"] start time.\n["TTFormat"] end time.\n", GLOBALS->min_time, GLOBALS->max_time); GLOBALS->is_lxt = ~0; if(GLOBALS->blackout_regions) { struct blackout_region_t *bt = GLOBALS->blackout_regions; while(bt) { bt->bstart *= GLOBALS->time_scale; bt->bend *= GLOBALS->time_scale; bt = bt->next; } } /* SPLASH */ splash_finalize(); return(GLOBALS->max_time); } /* * this is the black magic that handles aliased signals... */ static void lxt_resolver(nptr np, nptr resolve) { np->extvals = resolve->extvals; np->msi = resolve->msi; np->lsi = resolve->lsi; memcpy(&np->head, &resolve->head, sizeof(struct HistEnt)); np->curr = resolve->curr; np->harray = resolve->harray; np->numhist = resolve->numhist; np->mv.mvlfac=NULL; } /* * actually import an lxt trace but don't do it if * 1) it's already been imported * 2) an alias of this trace has been imported--instead * copy over the relevant info and be done with it. */ void import_lxt_trace(nptr np) { off_t offs, offsdelta; int v, w; TimeType tmval; TimeType prevtmval; struct HistEnt *htemp; struct HistEnt *histent_head, *histent_tail; char *parsed; int len, i, j; struct fac *f; if(!(f=np->mv.mvlfac)) return; /* already imported */ if(np->mv.mvlfac->flags<_SYM_F_ALIAS) { int alias = np->mv.mvlfac->node_alias; f=GLOBALS->mvlfacs_lxt_c_2+alias; if(GLOBALS->resolve_lxt_alias_to[alias]) { if(!GLOBALS->resolve_lxt_alias_to[np->mv.mvlfac - GLOBALS->mvlfacs_lxt_c_2]) GLOBALS->resolve_lxt_alias_to[np->mv.mvlfac - GLOBALS->mvlfacs_lxt_c_2] = GLOBALS->resolve_lxt_alias_to[alias]; } else { GLOBALS->resolve_lxt_alias_to[alias] = np; } while(f->flags<_SYM_F_ALIAS) { f=GLOBALS->mvlfacs_lxt_c_2+f->node_alias; if(GLOBALS->resolve_lxt_alias_to[f->node_alias]) { if(!GLOBALS->resolve_lxt_alias_to[np->mv.mvlfac - GLOBALS->mvlfacs_lxt_c_2]) GLOBALS->resolve_lxt_alias_to[np->mv.mvlfac - GLOBALS->mvlfacs_lxt_c_2] = GLOBALS->resolve_lxt_alias_to[f->node_alias]; } else { GLOBALS->resolve_lxt_alias_to[f->node_alias] = np; } } } /* f is the head minus any aliases, np->mv.mvlfac is us... */ if(GLOBALS->resolve_lxt_alias_to[np->mv.mvlfac - GLOBALS->mvlfacs_lxt_c_2]) /* in case we're an alias head for later.. */ { lxt_resolver(np, GLOBALS->resolve_lxt_alias_to[np->mv.mvlfac - GLOBALS->mvlfacs_lxt_c_2]); return; } GLOBALS->resolve_lxt_alias_to[np->mv.mvlfac - GLOBALS->mvlfacs_lxt_c_2] = np; /* in case we're an alias head for later.. */ offs=GLOBALS->lastchange[f-GLOBALS->mvlfacs_lxt_c_2]; tmval=LLDescriptor(-1); prevtmval = LLDescriptor(-1); len = np->mv.mvlfac->len; histent_tail = htemp = histent_calloc(); if(len>1) { htemp->v.h_vector = (char *)malloc_2(len); for(i=0;iv.h_vector[i] = AN_Z; } else { htemp->v.h_val = AN_Z; /* z */ } htemp->time = MAX_HISTENT_TIME; histent_head = histent_calloc(); if(len>1) { histent_head->v.h_vector = (char *)malloc_2(len); for(i=0;iv.h_vector[i] = AN_X; } else { histent_head->v.h_val = AN_X; /* x */ } histent_head->time = MAX_HISTENT_TIME-1; histent_head->next = htemp; /* x */ np->numhist=2; if(f->node_alias < 1) /* sorry, arrays not supported */ while(offs) { unsigned char val = 0; if( (w=((v=get_byte(offs))&0xF)) >0xb) { off_t offsminus1, offsminus2, offsminus3; TimeType delta, time_offsminus1; int skip; switch(v&0xF0) { case 0x00: skip = 2; offsdelta=get_byte(offs+1); break; case 0x10: skip = 3; offsdelta=get_16(offs+1); break; case 0x20: skip = 4; offsdelta=get_24(offs+1); break; case 0x30: skip = 5; offsdelta=get_32(offs+1); break; default: fprintf(stderr, "Unknown %02x at offset: %08x\n", v, (unsigned int)offs); exit(0); } offsminus1 = offs-offsdelta-2; switch(get_byte(offsminus1)&0xF0) { case 0x00: offsdelta=get_byte(offsminus1+1); break; case 0x10: offsdelta=get_16(offsminus1+1); break; case 0x20: offsdelta=get_24(offsminus1+1); break; case 0x30: offsdelta=get_32(offsminus1+1); break; default: fprintf(stderr, "Unknown %02x at offset: %08x\n", get_byte(offsminus1), (unsigned int)offsminus1); exit(0); } offsminus2 = offsminus1-offsdelta-2; delta = (time_offsminus1=bsearch_mvl_timechain(offsminus1)) - bsearch_mvl_timechain(offsminus2); if(len>1) { DEBUG(fprintf(stderr, "!!! DELTA = %lld\n", delta)); DEBUG(fprintf(stderr, "!!! offsminus1 = %08x\n", offsminus1)); if(!GLOBALS->lxt_clock_compress_to_z) { int vval = get_byte(offsminus1)&0xF; int reps = 0; int rcnt; unsigned int reconstructm1 = 0; unsigned int reconstructm2 = 0; unsigned int reconstructm3 = 0; unsigned int rle_delta[2]; int ix; if((vval!=0)&&(vval!=3)&&(vval!=4)) { fprintf(stderr, "Unexpected clk compress byte %02x at offset: %08x\n", get_byte(offsminus1), (unsigned int)offsminus1); exit(0); } switch(w&3) { case 0: reps = get_byte(offs+skip); break; case 1: reps = get_16(offs+skip); break; case 2: reps = get_24(offs+skip); break; case 3: reps = get_32(offs+skip); break; } reps++; DEBUG(fprintf(stderr, "!!! reps = %d\n", reps)); parsed=parse_offset(f, offsminus1); for(ix=0;ix '%08x'\n", tmval, res)); for(k=0;kv.h_vector = (char *)malloc_2(len); memcpy(htemp->v.h_vector, parsed, len); htemp->time = tmval; htemp->next = histent_head; histent_head = htemp; np->numhist++; tmval-=delta; } } else /* compress to z on multibit */ { int ix; htemp = histent_calloc(); htemp->v.h_vector = (char *)malloc_2(len); for(ix=0;ixv.h_vector[ix] = 'z'; } tmval = time_offsminus1 + delta; htemp->time = tmval; htemp->next = histent_head; histent_head = htemp; np->numhist++; } offs = offsminus1; /* no need to recalc it again! */ continue; } else { if(!GLOBALS->lxt_clock_compress_to_z) { int vval = get_byte(offsminus1)&0xF; int reps = 0; int rcnt; if((vval<3)||(vval>4)) { fprintf(stderr, "Unexpected clk compress byte %02x at offset: %08x\n", get_byte(offsminus1), (unsigned int)offsminus1); exit(0); } switch(w&3) { case 0: reps = get_byte(offs+skip); break; case 1: reps = get_16(offs+skip); break; case 2: reps = get_24(offs+skip); break; case 3: reps = get_32(offs+skip); break; } reps++; vval = (reps & 1) ^ (vval==4); /* because x3='0', x4='1' */ vval = (vval==0) ? AN_0 : AN_1; tmval = time_offsminus1 + (delta * reps); for(rcnt=0;rcntv.h_val) { htemp = histent_calloc(); htemp->v.h_val = vval; htemp->time = tmval; htemp->next = histent_head; histent_head = htemp; np->numhist++; } else { histent_head->time = tmval; } tmval-=delta; vval= (vval==AN_0) ? AN_1: AN_0; } } else { int vval=AN_Z; if(vval!=histent_head->v.h_val) { htemp = histent_calloc(); htemp->v.h_val = vval; htemp->time = time_offsminus1 + delta; htemp->next = histent_head; histent_head = htemp; np->numhist++; } else { histent_head->time = time_offsminus1 + delta; } tmval = time_offsminus1 + delta; } } offs = offsminus1; /* no need to recalc it again! */ continue; } else if((tmval=bsearch_mvl_timechain(offs))!=prevtmval) /* get rid of glitches (if even possible) */ { DEBUG(printf(LXTHDR"offs: %08x is time %08x\n", offs, tmval)); if(!(f->flags&(LT_SYM_F_DOUBLE|LT_SYM_F_STRING))) { parsed=parse_offset(f, offs); if(len==1) { switch(parsed[0]) { case '0': val = AN_0; break; case 'x': val = AN_X; break; case 'z': val = AN_Z; break; case '1': val = AN_1; break; case 'h': val = AN_H; break; case 'u': val = AN_U; break; case 'w': val = AN_W; break; case 'l': val = AN_L; break; case '-': val = AN_DASH; break; } if(val!=histent_head->v.h_val) { htemp = histent_calloc(); htemp->v.h_val = val; htemp->time = tmval; htemp->next = histent_head; histent_head = htemp; np->numhist++; } else { histent_head->time = tmval; } } else { if(memcmp(parsed, histent_head->v.h_vector, len)) { htemp = histent_calloc(); htemp->v.h_vector = (char *)malloc_2(len); memcpy(htemp->v.h_vector, parsed, len); htemp->time = tmval; htemp->next = histent_head; histent_head = htemp; np->numhist++; } else { histent_head->time = tmval; } } } else if(f->flags<_SYM_F_DOUBLE) { int offs_dbl = offs + ((get_byte(offs)>>4)&3)+2; /* skip value */ htemp = histent_calloc(); htemp->flags = HIST_REAL; if(GLOBALS->double_is_native_lxt_c_1) { #ifdef WAVE_HAS_H_DOUBLE memcpy(&htemp->v.h_double, ((char *)GLOBALS->mm_lxt_c_1+offs_dbl), sizeof(double)); #else htemp->v.h_vector = ((char *)GLOBALS->mm_lxt_c_1+offs_dbl); DEBUG(printf(LXTHDR"Added double '%.16g'\n", *((double *)(GLOBALS->mm_lxt_c_1+offs_dbl)))); #endif } else { #ifdef WAVE_HAS_H_DOUBLE double *h_d = (double *)swab_double_via_mask(offs_dbl); htemp->v.h_double = *h_d; free_2(h_d); #else htemp->v.h_vector = swab_double_via_mask(offs_dbl); DEBUG(printf(LXTHDR"Added bytefixed double '%.16g'\n", *((double *)(htemp->v.h_vector)))); #endif } htemp->time = tmval; htemp->next = histent_head; histent_head = htemp; np->numhist++; } else { /* defaults to if(f->flags<_SYM_F_STRING) */ int offs_str = offs + ((get_byte(offs)>>4)&3)+2; /* skip value */ htemp = histent_calloc(); htemp->flags = HIST_REAL|HIST_STRING; htemp->v.h_vector = ((char *)GLOBALS->mm_lxt_c_1+offs_str); DEBUG(printf(LXTHDR"Added string '%s'\n", (unsigned char *)GLOBALS->mm_lxt_c_1+offs_str)); htemp->time = tmval; htemp->next = histent_head; histent_head = htemp; np->numhist++; } } prevtmval = tmval; /* v=get_byte(offs); */ switch(v&0xF0) { case 0x00: offsdelta=get_byte(offs+1); break; case 0x10: offsdelta=get_16(offs+1); break; case 0x20: offsdelta=get_24(offs+1); break; case 0x30: offsdelta=get_32(offs+1); break; default: fprintf(stderr, "Unknown %02x at offset: %08x\n", v, (unsigned int)offs); exit(0); } offs = offs-offsdelta-2; } np->mv.mvlfac = NULL; /* it's imported and cached so we can forget it's an mvlfac now */ for(j=0;j>-2;j--) { if(tmval!=GLOBALS->first_cycle_lxt_c_2) { char init; htemp = histent_calloc(); if(!(f->flags&(LT_SYM_F_DOUBLE|LT_SYM_F_STRING))) { if(GLOBALS->initial_value_offset_lxt_c_1) { init = GLOBALS->initial_value_lxt_c_1; } else { init = AN_X; /* x if unspecified */ } if(len>1) { char *pnt = htemp->v.h_vector = (char *)malloc_2(len); /* zeros */ int ix; for(ix=0;ixv.h_val = init; } } else { htemp->flags = HIST_REAL; if(f->flags<_SYM_F_STRING) htemp->flags |= HIST_STRING; } htemp->time = GLOBALS->first_cycle_lxt_c_2+j; htemp->next = histent_head; histent_head = htemp; np->numhist++; } tmval=GLOBALS->first_cycle_lxt_c_2+1; } if(!(f->flags&(LT_SYM_F_DOUBLE|LT_SYM_F_STRING))) { if(len>1) { np->head.v.h_vector = (char *)malloc_2(len); for(i=0;ihead.v.h_vector[i] = AN_X; } else { np->head.v.h_val = AN_X; /* 'x' */ } } else { np->head.flags = HIST_REAL; if(f->flags<_SYM_F_STRING) np->head.flags |= HIST_STRING; } np->head.time = -2; np->head.next = histent_head; np->curr = histent_tail; np->numhist++; } gtkwave-3.3.86/src/menu.h0000664000175000017500000003450513166335473014517 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2017. * * 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. */ #include "globals.h" /* example-start menu menufactory.h */ #ifndef __MENUFACTORY_H__ #define __MENUFACTORY_H__ #include #include #ifndef _MSC_VER #include #endif #include #include "currenttime.h" #include "fgetdynamic.h" #include "strace.h" #include "debug.h" #include "symbol.h" #include "main.h" void do_popup_menu (GtkWidget *my_widget, GdkEventButton *event); void do_sst_popup_menu (GtkWidget *my_widget, GdkEventButton *event); void get_main_menu (GtkWidget *, GtkWidget **menubar); void menu_set_sensitive(void); int file_quit_cmd_callback (GtkWidget *widget, gpointer data); int set_wave_menu_accelerator(char *str); int execute_script(char *name, int dealloc_name); void kill_main_menu_accelerators(void); /* for conflicts with twinwave */ struct stringchain_t { struct stringchain_t *next; char *name; }; #ifdef MAC_INTEGRATION #define WAVE_USE_MLIST_T #endif #ifdef WAVE_USE_MLIST_T typedef void (*gtkwave_mlist_callback) (); struct gtkwave_mlist_t { gchar *path; gchar *accelerator; gtkwave_mlist_callback callback; guint callback_action; /* possible values: * "" -> create a simple item * "" -> create a toggle item * "" -> create a separator */ gchar *item_type; /* Extra data for some item types: * ImageItem -> pointer to inlined pixbuf stream * StockItem -> name of stock item */ gconstpointer extra_data; }; typedef struct gtkwave_mlist_t gtkwave_mlist_t; GtkWidget *alt_menu_top(GtkWidget *window); GtkWidget *alt_menu(gtkwave_mlist_t *mi, int nmenu_items, GtkWidget **wlist, GtkAccelGroup *accel, gboolean is_menubar); #else #define gtkwave_mlist_t GtkItemFactoryEntry #endif enum WV_MenuItems { WV_MENU_FONV, WV_MENU_FONVT, WV_MENU_FRW, WV_MENU_WRVCD, WV_MENU_WRLXT, WV_MENU_WRTIM, WV_MENU_WCLOSE, WV_MENU_SEP2VCD, WV_MENU_FPTF, #if GTK_CHECK_VERSION(2,14,0) WV_MENU_SGRAB, #endif WV_MENU_SEP1, WV_MENU_FRSF, WV_MENU_FWSF, WV_MENU_FWSFAS, WV_MENU_SEP2, WV_MENU_FRLF, WV_MENU_SEP2LF, #if !defined _MSC_VER WV_MENU_FRSTMF, WV_MENU_SEP2STMF, #endif #if defined(HAVE_LIBTCL) WV_MENU_TCLSCR, WV_MENU_TCLSEP, #endif WV_MENU_FQY, WV_MENU_ESTMH, WV_MENU_ETH, WV_MENU_SEP3, WV_MENU_EIB, WV_MENU_EIC, WV_MENU_EIA, WV_MENU_EC, WV_MENU_ECY, WV_MENU_EP, WV_MENU_DEL, WV_MENU_SEP3A, WV_MENU_EAHT, WV_MENU_ERHA, WV_MENU_SEP4, WV_MENU_EE, WV_MENU_ECD, WV_MENU_ECU, WV_MENU_SEP5, WV_MENU_EDFH, WV_MENU_EDFD, WV_MENU_EDFSD, WV_MENU_EDFB, WV_MENU_EDFO, WV_MENU_EDFA, WV_MENU_EDRL, WV_MENU_EDR2BON, WV_MENU_EDR2BOFF, WV_MENU_EDFRJON, WV_MENU_EDFRJOFF, WV_MENU_EDFION, WV_MENU_EDFIOFF, WV_MENU_EDFRON, WV_MENU_EDFROFF, WV_MENU_XLF_0, WV_MENU_XLF_1, WV_MENU_XLP_0, WV_MENU_XLP_1, WV_MENU_TTXLP_0, WV_MENU_TTXLP_1, WV_MENU_EDFAOFF, WV_MENU_EDFASTEP, WV_MENU_EDFAINTERPOL, WV_MENU_EDFAINTERPOL2, WV_MENU_EDFARSD, WV_MENU_EDFARAD, WV_MENU_RFILL0, WV_MENU_RFILL1, WV_MENU_RFILLOFF, WV_MENU_B2G, WV_MENU_G2B, WV_MENU_GBNONE, WV_MENU_POPON, WV_MENU_POPOFF, WV_MENU_FPSHIFTON, WV_MENU_FPSHIFTOFF, WV_MENU_FPSHIFTVAL, WV_MENU_CLRFMT0, WV_MENU_CLRFMT1, WV_MENU_CLRFMT2, WV_MENU_CLRFMT3, WV_MENU_CLRFMT4, WV_MENU_CLRFMT5, WV_MENU_CLRFMT6, WV_MENU_CLRFMT7, WV_MENU_CLRFMTC, WV_MENU_SEP5A, WV_MENU_KEEPXZ, WV_MENU_ESCAH, WV_MENU_ESCFH, WV_MENU_SEP6, WV_MENU_WARP, WV_MENU_UNWARP, WV_MENU_UNWARPA, WV_MENU_SEP7A, WV_MENU_EEX, WV_MENU_ESH, WV_MENU_SEP6A, /* WV_MENU_EXA, */ /* WV_MENU_CPA, */ WV_MENU_TG, WV_MENU_AG, WV_MENU_SEP6A1, WV_MENU_EHR, WV_MENU_EUHR, WV_MENU_EHA, WV_MENU_EUHA, WV_MENU_SEP6B, WV_MENU_ALPHA, WV_MENU_ALPHA2, WV_MENU_LEX, WV_MENU_RVS, WV_MENU_SPS, #ifdef WAVE_USE_GTK2 WV_MENU_SPS2, #endif WV_MENU_SEP7B, WV_MENU_SSR, WV_MENU_SSH, WV_MENU_SST, WV_MENU_SEP7, #if !defined __MINGW32__ && !defined _MSC_VER WV_MENU_OPENHS, WV_MENU_OPENIHS, #endif WV_MENU_OPENH, WV_MENU_SEP7D, WV_MENU_ACOL, WV_MENU_ACOLR, WV_MENU_ABON, WV_MENU_HTGP, WV_MENU_SEP7C, WV_MENU_STRSE, WV_MENU_TMTT, WV_MENU_TZZA, WV_MENU_TZZB, WV_MENU_TZZI, WV_MENU_TZZO, WV_MENU_TZZBFL, WV_MENU_TZZBF, WV_MENU_TZZTS, WV_MENU_TZZTE, WV_MENU_TZUZ, WV_MENU_TFFS, WV_MENU_TFFR, WV_MENU_TFFL, WV_MENU_TDDR, WV_MENU_TDDL, WV_MENU_TSSR, WV_MENU_TSSL, WV_MENU_TPPR, WV_MENU_TPPL, WV_MENU_MSCMD, WV_MENU_MDNM, WV_MENU_MCNM, WV_MENU_MCANM, WV_MENU_MCAB, WV_MENU_MDPM, WV_MENU_SEP8, WV_MENU_SLE, WV_MENU_SRE, WV_MENU_SEP8B, WV_MENU_HSWM, WV_MENU_MWSON, WV_MENU_MLKLT, WV_MENU_MLKRT, WV_MENU_MLKOFF, WV_MENU_VSG, WV_MENU_SEP9, WV_MENU_SHW, WV_MENU_FILL1, WV_MENU_SEP9B, WV_MENU_VSMO, #ifdef WAVE_USE_GTK2 WV_MENU_VSMC, #endif WV_MENU_SEP9A, WV_MENU_VSBS, WV_MENU_SEP10, WV_MENU_ESTS, WV_MENU_SEP10A, WV_MENU_VDR, WV_MENU_SEP11, WV_MENU_VCZ, WV_MENU_SEP12, WV_MENU_VTDF, WV_MENU_VTMM, WV_MENU_SEP13, WV_MENU_VCMU, WV_MENU_SEP14, WV_MENU_VDRV, WV_MENU_SEP15, WV_MENU_VLJS, WV_MENU_VRJS, WV_MENU_SEP16, WV_MENU_VZPS, WV_MENU_VZDYN, WV_MENU_VZDYNE, WV_MENU_VFTP, WV_MENU_SEP17, WV_MENU_RULER, WV_MENU_RMRKS, WV_MENU_SEP17A, WV_MENU_USECOLOR, WV_MENU_USEBW, WV_MENU_SEP18, WV_MENU_LXTCC2Z, WV_MENU_SEP19, WV_MENU_TDSCALEX, WV_MENU_TDSCALES, WV_MENU_TDSCALEM, WV_MENU_TDSCALEU, WV_MENU_TDSCALEN, WV_MENU_TDSCALEP, WV_MENU_TDSCALEF, WV_MENU_HWH, #ifdef MAC_INTEGRATION WV_MENU_HWM, #endif WV_MENU_HWV, WV_MENU_NUMITEMS }; enum WV_RecurseType { WV_RECURSE_APPEND, WV_RECURSE_INSERT, WV_RECURSE_REPLACE, }; void menu_new_viewer(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_write_vcd_file(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_write_lxt_file(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_print(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_read_save_file(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_write_save_file(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_write_save_file_as(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_read_log_file(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_read_stems_file(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_quit(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_set_max_hier(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_insert_blank_traces(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_insert_comment_traces(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_insert_analog_height_extension(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_alias(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_remove_aliases(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_cut_traces(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_copy_traces(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_paste_traces(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_combine_down(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_combine_up(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_hex(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_dec(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_signed(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_bin(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_oct(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_ascii(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_real(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_rjustify_on(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_rjustify_off(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_invert_on(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_invert_off(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_reverse_on(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_reverse_off(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_xlate_file_0(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_xlate_file_1(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_xlate_proc_0(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_xlate_proc_1(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_analog_off(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_analog_step(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_analog_interpol(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_showchangeall(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_showchange(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_warp_traces(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_unwarp_traces(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_unwarp_traces_all(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_exclude_on(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_exclude_off(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_regexp_highlight(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_regexp_unhighlight(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_highlight_all(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_dataformat_unhighlight_all(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_alphabetize(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_alphabetize2(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_lexize(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_reverse(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_tracesearchbox(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_signalsearch(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_hiersearch(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_treesearch(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_autocoalesce(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_autocoalesce_reversal(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_autoname_bundles_on(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_hgrouping(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_movetotime(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_zoomsize(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_zoombase(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_fetchsize(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_markerbox(gpointer null_data, guint callback_action, GtkWidget *widget); void drop_named_marker(gpointer null_data, guint callback_action, GtkWidget *widget); void collect_named_marker(gpointer null_data, guint callback_action, GtkWidget *widget); void collect_all_named_markers(gpointer null_data, guint callback_action, GtkWidget *widget); void delete_unnamed_marker(gpointer null_data, guint callback_action, GtkWidget *widget); void wave_scrolling_on(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_show_grid(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_show_mouseover(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_show_base(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_enable_dynamic_resize(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_center_zooms(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_toggle_delta_or_frequency(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_toggle_max_or_marker(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_enable_constant_marker_update(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_use_roundcaps(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_left_justify(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_right_justify(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_zoom10_snap(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_use_full_precision(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_remove_marked(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_lxt_clk_compress(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_help(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_version(gpointer null_data, guint callback_action, GtkWidget *widget); void menu_toggle_group(gpointer null_data, guint callback_action, GtkWidget *widget); gtkwave_mlist_t *retrieve_menu_items_array(int *num_items); void menu_read_stems_cleanup(GtkWidget *widget, gpointer data); void menu_new_viewer_tab_cleanup(GtkWidget *widget, gpointer data); int menu_new_viewer_tab_cleanup_2(char *fname, int optimize_vcd); void movetotime_cleanup(GtkWidget *widget, gpointer data); void zoomsize_cleanup(GtkWidget *widget, gpointer data); void set_scale_to_time_dimension_toggles(void); void SetTraceScrollbarRowValue(int row, unsigned center); bvptr combine_traces(int direction, Trptr single_trace_only); unsigned create_group (char* name, Trptr t_composite); /* currently only for OSX to disable OSX menus when grabbed */ void wave_gtk_grab_add(GtkWidget *w); void wave_gtk_grab_remove(GtkWidget *w); #ifdef MAC_INTEGRATION void osx_menu_sensitivity(gboolean tr); #endif #endif gtkwave-3.3.86/src/rgb.c0000664000175000017500000010326613166335473014321 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2009. * * 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. */ #include #include #include #include #include #include "rc.h" #include "color.h" #include "currenttime.h" #include "globals.h" #ifdef _MSC_VER #define strcasecmp _stricmp #endif struct wave_rgb_color { const char *name; int rgb; GdkGC *context; }; #define WAVE_RGB_COLOR(_name, r, g, b) { _name, (r << 16) | (g << 8) | b, NULL } /* * the strings *must* be in this order for the * case insensitive string bsearch */ static struct wave_rgb_color colors[] = { WAVE_RGB_COLOR("alice blue", 240, 248, 255), WAVE_RGB_COLOR("AliceBlue", 240, 248, 255), WAVE_RGB_COLOR("antique white", 250, 235, 215), WAVE_RGB_COLOR("AntiqueWhite", 250, 235, 215), WAVE_RGB_COLOR("AntiqueWhite1", 255, 239, 219), WAVE_RGB_COLOR("AntiqueWhite2", 238, 223, 204), WAVE_RGB_COLOR("AntiqueWhite3", 205, 192, 176), WAVE_RGB_COLOR("AntiqueWhite4", 139, 131, 120), WAVE_RGB_COLOR("aquamarine", 127, 255, 212), WAVE_RGB_COLOR("aquamarine1", 127, 255, 212), WAVE_RGB_COLOR("aquamarine2", 118, 238, 198), WAVE_RGB_COLOR("aquamarine3", 102, 205, 170), WAVE_RGB_COLOR("aquamarine4", 69, 139, 116), WAVE_RGB_COLOR("azure", 240, 255, 255), WAVE_RGB_COLOR("azure1", 240, 255, 255), WAVE_RGB_COLOR("azure2", 224, 238, 238), WAVE_RGB_COLOR("azure3", 193, 205, 205), WAVE_RGB_COLOR("azure4", 131, 139, 139), WAVE_RGB_COLOR("beige", 245, 245, 220), WAVE_RGB_COLOR("bisque", 255, 228, 196), WAVE_RGB_COLOR("bisque1", 255, 228, 196), WAVE_RGB_COLOR("bisque2", 238, 213, 183), WAVE_RGB_COLOR("bisque3", 205, 183, 158), WAVE_RGB_COLOR("bisque4", 139, 125, 107), WAVE_RGB_COLOR("black", 0, 0, 0), WAVE_RGB_COLOR("blanched almond", 255, 235, 205), WAVE_RGB_COLOR("BlanchedAlmond", 255, 235, 205), WAVE_RGB_COLOR("blue", 0, 0, 255), WAVE_RGB_COLOR("blue violet", 138, 43, 226), WAVE_RGB_COLOR("blue1", 0, 0, 255), WAVE_RGB_COLOR("blue2", 0, 0, 238), WAVE_RGB_COLOR("blue3", 0, 0, 205), WAVE_RGB_COLOR("blue4", 0, 0, 139), WAVE_RGB_COLOR("BlueViolet", 138, 43, 226), WAVE_RGB_COLOR("brown", 165, 42, 42), WAVE_RGB_COLOR("brown1", 255, 64, 64), WAVE_RGB_COLOR("brown2", 238, 59, 59), WAVE_RGB_COLOR("brown3", 205, 51, 51), WAVE_RGB_COLOR("brown4", 139, 35, 35), WAVE_RGB_COLOR("burlywood", 222, 184, 135), WAVE_RGB_COLOR("burlywood1", 255, 211, 155), WAVE_RGB_COLOR("burlywood2", 238, 197, 145), WAVE_RGB_COLOR("burlywood3", 205, 170, 125), WAVE_RGB_COLOR("burlywood4", 139, 115, 85), WAVE_RGB_COLOR("cadet blue", 95, 158, 160), WAVE_RGB_COLOR("CadetBlue", 95, 158, 160), WAVE_RGB_COLOR("CadetBlue1", 152, 245, 255), WAVE_RGB_COLOR("CadetBlue2", 142, 229, 238), WAVE_RGB_COLOR("CadetBlue3", 122, 197, 205), WAVE_RGB_COLOR("CadetBlue4", 83, 134, 139), WAVE_RGB_COLOR("chartreuse", 127, 255, 0), WAVE_RGB_COLOR("chartreuse1", 127, 255, 0), WAVE_RGB_COLOR("chartreuse2", 118, 238, 0), WAVE_RGB_COLOR("chartreuse3", 102, 205, 0), WAVE_RGB_COLOR("chartreuse4", 69, 139, 0), WAVE_RGB_COLOR("chocolate", 210, 105, 30), WAVE_RGB_COLOR("chocolate1", 255, 127, 36), WAVE_RGB_COLOR("chocolate2", 238, 118, 33), WAVE_RGB_COLOR("chocolate3", 205, 102, 29), WAVE_RGB_COLOR("chocolate4", 139, 69, 19), WAVE_RGB_COLOR("coral", 255, 127, 80), WAVE_RGB_COLOR("coral1", 255, 114, 86), WAVE_RGB_COLOR("coral2", 238, 106, 80), WAVE_RGB_COLOR("coral3", 205, 91, 69), WAVE_RGB_COLOR("coral4", 139, 62, 47), WAVE_RGB_COLOR("cornflower blue", 100, 149, 237), WAVE_RGB_COLOR("CornflowerBlue", 100, 149, 237), WAVE_RGB_COLOR("cornsilk", 255, 248, 220), WAVE_RGB_COLOR("cornsilk1", 255, 248, 220), WAVE_RGB_COLOR("cornsilk2", 238, 232, 205), WAVE_RGB_COLOR("cornsilk3", 205, 200, 177), WAVE_RGB_COLOR("cornsilk4", 139, 136, 120), WAVE_RGB_COLOR("cyan", 0, 255, 255), WAVE_RGB_COLOR("cyan1", 0, 255, 255), WAVE_RGB_COLOR("cyan2", 0, 238, 238), WAVE_RGB_COLOR("cyan3", 0, 205, 205), WAVE_RGB_COLOR("cyan4", 0, 139, 139), WAVE_RGB_COLOR("dark blue", 0, 0, 139), WAVE_RGB_COLOR("dark cyan", 0, 139, 139), WAVE_RGB_COLOR("dark goldenrod", 184, 134, 11), WAVE_RGB_COLOR("dark gray", 169, 169, 169), WAVE_RGB_COLOR("dark green", 0, 100, 0), WAVE_RGB_COLOR("dark grey", 169, 169, 169), WAVE_RGB_COLOR("dark khaki", 189, 183, 107), WAVE_RGB_COLOR("dark magenta", 139, 0, 139), WAVE_RGB_COLOR("dark olive green", 85, 107, 47), WAVE_RGB_COLOR("dark orange", 255, 140, 0), WAVE_RGB_COLOR("dark orchid", 153, 50, 204), WAVE_RGB_COLOR("dark red", 139, 0, 0), WAVE_RGB_COLOR("dark salmon", 233, 150, 122), WAVE_RGB_COLOR("dark sea green", 143, 188, 143), WAVE_RGB_COLOR("dark slate blue", 72, 61, 139), WAVE_RGB_COLOR("dark slate gray", 47, 79, 79), WAVE_RGB_COLOR("dark slate grey", 47, 79, 79), WAVE_RGB_COLOR("dark turquoise", 0, 206, 209), WAVE_RGB_COLOR("dark violet", 148, 0, 211), WAVE_RGB_COLOR("DarkBlue", 0, 0, 139), WAVE_RGB_COLOR("DarkCyan", 0, 139, 139), WAVE_RGB_COLOR("DarkGoldenrod", 184, 134, 11), WAVE_RGB_COLOR("DarkGoldenrod1", 255, 185, 15), WAVE_RGB_COLOR("DarkGoldenrod2", 238, 173, 14), WAVE_RGB_COLOR("DarkGoldenrod3", 205, 149, 12), WAVE_RGB_COLOR("DarkGoldenrod4", 139, 101, 8), WAVE_RGB_COLOR("DarkGray", 169, 169, 169), WAVE_RGB_COLOR("DarkGreen", 0, 100, 0), WAVE_RGB_COLOR("DarkGrey", 169, 169, 169), WAVE_RGB_COLOR("DarkKhaki", 189, 183, 107), WAVE_RGB_COLOR("DarkMagenta", 139, 0, 139), WAVE_RGB_COLOR("DarkOliveGreen", 85, 107, 47), WAVE_RGB_COLOR("DarkOliveGreen1", 202, 255, 112), WAVE_RGB_COLOR("DarkOliveGreen2", 188, 238, 104), WAVE_RGB_COLOR("DarkOliveGreen3", 162, 205, 90), WAVE_RGB_COLOR("DarkOliveGreen4", 110, 139, 61), WAVE_RGB_COLOR("DarkOrange", 255, 140, 0), WAVE_RGB_COLOR("DarkOrange1", 255, 127, 0), WAVE_RGB_COLOR("DarkOrange2", 238, 118, 0), WAVE_RGB_COLOR("DarkOrange3", 205, 102, 0), WAVE_RGB_COLOR("DarkOrange4", 139, 69, 0), WAVE_RGB_COLOR("DarkOrchid", 153, 50, 204), WAVE_RGB_COLOR("DarkOrchid1", 191, 62, 255), WAVE_RGB_COLOR("DarkOrchid2", 178, 58, 238), WAVE_RGB_COLOR("DarkOrchid3", 154, 50, 205), WAVE_RGB_COLOR("DarkOrchid4", 104, 34, 139), WAVE_RGB_COLOR("DarkRed", 139, 0, 0), WAVE_RGB_COLOR("DarkSalmon", 233, 150, 122), WAVE_RGB_COLOR("DarkSeaGreen", 143, 188, 143), WAVE_RGB_COLOR("DarkSeaGreen1", 193, 255, 193), WAVE_RGB_COLOR("DarkSeaGreen2", 180, 238, 180), WAVE_RGB_COLOR("DarkSeaGreen3", 155, 205, 155), WAVE_RGB_COLOR("DarkSeaGreen4", 105, 139, 105), WAVE_RGB_COLOR("DarkSlateBlue", 72, 61, 139), WAVE_RGB_COLOR("DarkSlateGray", 47, 79, 79), WAVE_RGB_COLOR("DarkSlateGray1", 151, 255, 255), WAVE_RGB_COLOR("DarkSlateGray2", 141, 238, 238), WAVE_RGB_COLOR("DarkSlateGray3", 121, 205, 205), WAVE_RGB_COLOR("DarkSlateGray4", 82, 139, 139), WAVE_RGB_COLOR("DarkSlateGrey", 47, 79, 79), WAVE_RGB_COLOR("DarkTurquoise", 0, 206, 209), WAVE_RGB_COLOR("DarkViolet", 148, 0, 211), WAVE_RGB_COLOR("deep pink", 255, 20, 147), WAVE_RGB_COLOR("deep sky blue", 0, 191, 255), WAVE_RGB_COLOR("DeepPink", 255, 20, 147), WAVE_RGB_COLOR("DeepPink1", 255, 20, 147), WAVE_RGB_COLOR("DeepPink2", 238, 18, 137), WAVE_RGB_COLOR("DeepPink3", 205, 16, 118), WAVE_RGB_COLOR("DeepPink4", 139, 10, 80), WAVE_RGB_COLOR("DeepSkyBlue", 0, 191, 255), WAVE_RGB_COLOR("DeepSkyBlue1", 0, 191, 255), WAVE_RGB_COLOR("DeepSkyBlue2", 0, 178, 238), WAVE_RGB_COLOR("DeepSkyBlue3", 0, 154, 205), WAVE_RGB_COLOR("DeepSkyBlue4", 0, 104, 139), WAVE_RGB_COLOR("dim gray", 105, 105, 105), WAVE_RGB_COLOR("dim grey", 105, 105, 105), WAVE_RGB_COLOR("DimGray", 105, 105, 105), WAVE_RGB_COLOR("DimGrey", 105, 105, 105), WAVE_RGB_COLOR("dodger blue", 30, 144, 255), WAVE_RGB_COLOR("DodgerBlue", 30, 144, 255), WAVE_RGB_COLOR("DodgerBlue1", 30, 144, 255), WAVE_RGB_COLOR("DodgerBlue2", 28, 134, 238), WAVE_RGB_COLOR("DodgerBlue3", 24, 116, 205), WAVE_RGB_COLOR("DodgerBlue4", 16, 78, 139), WAVE_RGB_COLOR("firebrick", 178, 34, 34), WAVE_RGB_COLOR("firebrick1", 255, 48, 48), WAVE_RGB_COLOR("firebrick2", 238, 44, 44), WAVE_RGB_COLOR("firebrick3", 205, 38, 38), WAVE_RGB_COLOR("firebrick4", 139, 26, 26), WAVE_RGB_COLOR("floral white", 255, 250, 240), WAVE_RGB_COLOR("FloralWhite", 255, 250, 240), WAVE_RGB_COLOR("forest green", 34, 139, 34), WAVE_RGB_COLOR("ForestGreen", 34, 139, 34), WAVE_RGB_COLOR("gainsboro", 220, 220, 220), WAVE_RGB_COLOR("ghost white", 248, 248, 255), WAVE_RGB_COLOR("GhostWhite", 248, 248, 255), WAVE_RGB_COLOR("gold", 255, 215, 0), WAVE_RGB_COLOR("gold1", 255, 215, 0), WAVE_RGB_COLOR("gold2", 238, 201, 0), WAVE_RGB_COLOR("gold3", 205, 173, 0), WAVE_RGB_COLOR("gold4", 139, 117, 0), WAVE_RGB_COLOR("goldenrod", 218, 165, 32), WAVE_RGB_COLOR("goldenrod1", 255, 193, 37), WAVE_RGB_COLOR("goldenrod2", 238, 180, 34), WAVE_RGB_COLOR("goldenrod3", 205, 155, 29), WAVE_RGB_COLOR("goldenrod4", 139, 105, 20), WAVE_RGB_COLOR("gray", 190, 190, 190), WAVE_RGB_COLOR("gray0", 0, 0, 0), WAVE_RGB_COLOR("gray1", 3, 3, 3), WAVE_RGB_COLOR("gray10", 26, 26, 26), WAVE_RGB_COLOR("gray100", 255, 255, 255), WAVE_RGB_COLOR("gray11", 28, 28, 28), WAVE_RGB_COLOR("gray12", 31, 31, 31), WAVE_RGB_COLOR("gray13", 33, 33, 33), WAVE_RGB_COLOR("gray14", 36, 36, 36), WAVE_RGB_COLOR("gray15", 38, 38, 38), WAVE_RGB_COLOR("gray16", 41, 41, 41), WAVE_RGB_COLOR("gray17", 43, 43, 43), WAVE_RGB_COLOR("gray18", 46, 46, 46), WAVE_RGB_COLOR("gray19", 48, 48, 48), WAVE_RGB_COLOR("gray2", 5, 5, 5), WAVE_RGB_COLOR("gray20", 51, 51, 51), WAVE_RGB_COLOR("gray21", 54, 54, 54), WAVE_RGB_COLOR("gray22", 56, 56, 56), WAVE_RGB_COLOR("gray23", 59, 59, 59), WAVE_RGB_COLOR("gray24", 61, 61, 61), WAVE_RGB_COLOR("gray25", 64, 64, 64), WAVE_RGB_COLOR("gray26", 66, 66, 66), WAVE_RGB_COLOR("gray27", 69, 69, 69), WAVE_RGB_COLOR("gray28", 71, 71, 71), WAVE_RGB_COLOR("gray29", 74, 74, 74), WAVE_RGB_COLOR("gray3", 8, 8, 8), WAVE_RGB_COLOR("gray30", 77, 77, 77), WAVE_RGB_COLOR("gray31", 79, 79, 79), WAVE_RGB_COLOR("gray32", 82, 82, 82), WAVE_RGB_COLOR("gray33", 84, 84, 84), WAVE_RGB_COLOR("gray34", 87, 87, 87), WAVE_RGB_COLOR("gray35", 89, 89, 89), WAVE_RGB_COLOR("gray36", 92, 92, 92), WAVE_RGB_COLOR("gray37", 94, 94, 94), WAVE_RGB_COLOR("gray38", 97, 97, 97), WAVE_RGB_COLOR("gray39", 99, 99, 99), WAVE_RGB_COLOR("gray4", 10, 10, 10), WAVE_RGB_COLOR("gray40", 102, 102, 102), WAVE_RGB_COLOR("gray41", 105, 105, 105), WAVE_RGB_COLOR("gray42", 107, 107, 107), WAVE_RGB_COLOR("gray43", 110, 110, 110), WAVE_RGB_COLOR("gray44", 112, 112, 112), WAVE_RGB_COLOR("gray45", 115, 115, 115), WAVE_RGB_COLOR("gray46", 117, 117, 117), WAVE_RGB_COLOR("gray47", 120, 120, 120), WAVE_RGB_COLOR("gray48", 122, 122, 122), WAVE_RGB_COLOR("gray49", 125, 125, 125), WAVE_RGB_COLOR("gray5", 13, 13, 13), WAVE_RGB_COLOR("gray50", 127, 127, 127), WAVE_RGB_COLOR("gray51", 130, 130, 130), WAVE_RGB_COLOR("gray52", 133, 133, 133), WAVE_RGB_COLOR("gray53", 135, 135, 135), WAVE_RGB_COLOR("gray54", 138, 138, 138), WAVE_RGB_COLOR("gray55", 140, 140, 140), WAVE_RGB_COLOR("gray56", 143, 143, 143), WAVE_RGB_COLOR("gray57", 145, 145, 145), WAVE_RGB_COLOR("gray58", 148, 148, 148), WAVE_RGB_COLOR("gray59", 150, 150, 150), WAVE_RGB_COLOR("gray6", 15, 15, 15), WAVE_RGB_COLOR("gray60", 153, 153, 153), WAVE_RGB_COLOR("gray61", 156, 156, 156), WAVE_RGB_COLOR("gray62", 158, 158, 158), WAVE_RGB_COLOR("gray63", 161, 161, 161), WAVE_RGB_COLOR("gray64", 163, 163, 163), WAVE_RGB_COLOR("gray65", 166, 166, 166), WAVE_RGB_COLOR("gray66", 168, 168, 168), WAVE_RGB_COLOR("gray67", 171, 171, 171), WAVE_RGB_COLOR("gray68", 173, 173, 173), WAVE_RGB_COLOR("gray69", 176, 176, 176), WAVE_RGB_COLOR("gray7", 18, 18, 18), WAVE_RGB_COLOR("gray70", 179, 179, 179), WAVE_RGB_COLOR("gray71", 181, 181, 181), WAVE_RGB_COLOR("gray72", 184, 184, 184), WAVE_RGB_COLOR("gray73", 186, 186, 186), WAVE_RGB_COLOR("gray74", 189, 189, 189), WAVE_RGB_COLOR("gray75", 191, 191, 191), WAVE_RGB_COLOR("gray76", 194, 194, 194), WAVE_RGB_COLOR("gray77", 196, 196, 196), WAVE_RGB_COLOR("gray78", 199, 199, 199), WAVE_RGB_COLOR("gray79", 201, 201, 201), WAVE_RGB_COLOR("gray8", 20, 20, 20), WAVE_RGB_COLOR("gray80", 204, 204, 204), WAVE_RGB_COLOR("gray81", 207, 207, 207), WAVE_RGB_COLOR("gray82", 209, 209, 209), WAVE_RGB_COLOR("gray83", 212, 212, 212), WAVE_RGB_COLOR("gray84", 214, 214, 214), WAVE_RGB_COLOR("gray85", 217, 217, 217), WAVE_RGB_COLOR("gray86", 219, 219, 219), WAVE_RGB_COLOR("gray87", 222, 222, 222), WAVE_RGB_COLOR("gray88", 224, 224, 224), WAVE_RGB_COLOR("gray89", 227, 227, 227), WAVE_RGB_COLOR("gray9", 23, 23, 23), WAVE_RGB_COLOR("gray90", 229, 229, 229), WAVE_RGB_COLOR("gray91", 232, 232, 232), WAVE_RGB_COLOR("gray92", 235, 235, 235), WAVE_RGB_COLOR("gray93", 237, 237, 237), WAVE_RGB_COLOR("gray94", 240, 240, 240), WAVE_RGB_COLOR("gray95", 242, 242, 242), WAVE_RGB_COLOR("gray96", 245, 245, 245), WAVE_RGB_COLOR("gray97", 247, 247, 247), WAVE_RGB_COLOR("gray98", 250, 250, 250), WAVE_RGB_COLOR("gray99", 252, 252, 252), WAVE_RGB_COLOR("green", 0, 255, 0), WAVE_RGB_COLOR("green yellow", 173, 255, 47), WAVE_RGB_COLOR("green1", 0, 255, 0), WAVE_RGB_COLOR("green2", 0, 238, 0), WAVE_RGB_COLOR("green3", 0, 205, 0), WAVE_RGB_COLOR("green4", 0, 139, 0), WAVE_RGB_COLOR("GreenYellow", 173, 255, 47), WAVE_RGB_COLOR("grey", 190, 190, 190), WAVE_RGB_COLOR("grey0", 0, 0, 0), WAVE_RGB_COLOR("grey1", 3, 3, 3), WAVE_RGB_COLOR("grey10", 26, 26, 26), WAVE_RGB_COLOR("grey100", 255, 255, 255), WAVE_RGB_COLOR("grey11", 28, 28, 28), WAVE_RGB_COLOR("grey12", 31, 31, 31), WAVE_RGB_COLOR("grey13", 33, 33, 33), WAVE_RGB_COLOR("grey14", 36, 36, 36), WAVE_RGB_COLOR("grey15", 38, 38, 38), WAVE_RGB_COLOR("grey16", 41, 41, 41), WAVE_RGB_COLOR("grey17", 43, 43, 43), WAVE_RGB_COLOR("grey18", 46, 46, 46), WAVE_RGB_COLOR("grey19", 48, 48, 48), WAVE_RGB_COLOR("grey2", 5, 5, 5), WAVE_RGB_COLOR("grey20", 51, 51, 51), WAVE_RGB_COLOR("grey21", 54, 54, 54), WAVE_RGB_COLOR("grey22", 56, 56, 56), WAVE_RGB_COLOR("grey23", 59, 59, 59), WAVE_RGB_COLOR("grey24", 61, 61, 61), WAVE_RGB_COLOR("grey25", 64, 64, 64), WAVE_RGB_COLOR("grey26", 66, 66, 66), WAVE_RGB_COLOR("grey27", 69, 69, 69), WAVE_RGB_COLOR("grey28", 71, 71, 71), WAVE_RGB_COLOR("grey29", 74, 74, 74), WAVE_RGB_COLOR("grey3", 8, 8, 8), WAVE_RGB_COLOR("grey30", 77, 77, 77), WAVE_RGB_COLOR("grey31", 79, 79, 79), WAVE_RGB_COLOR("grey32", 82, 82, 82), WAVE_RGB_COLOR("grey33", 84, 84, 84), WAVE_RGB_COLOR("grey34", 87, 87, 87), WAVE_RGB_COLOR("grey35", 89, 89, 89), WAVE_RGB_COLOR("grey36", 92, 92, 92), WAVE_RGB_COLOR("grey37", 94, 94, 94), WAVE_RGB_COLOR("grey38", 97, 97, 97), WAVE_RGB_COLOR("grey39", 99, 99, 99), WAVE_RGB_COLOR("grey4", 10, 10, 10), WAVE_RGB_COLOR("grey40", 102, 102, 102), WAVE_RGB_COLOR("grey41", 105, 105, 105), WAVE_RGB_COLOR("grey42", 107, 107, 107), WAVE_RGB_COLOR("grey43", 110, 110, 110), WAVE_RGB_COLOR("grey44", 112, 112, 112), WAVE_RGB_COLOR("grey45", 115, 115, 115), WAVE_RGB_COLOR("grey46", 117, 117, 117), WAVE_RGB_COLOR("grey47", 120, 120, 120), WAVE_RGB_COLOR("grey48", 122, 122, 122), WAVE_RGB_COLOR("grey49", 125, 125, 125), WAVE_RGB_COLOR("grey5", 13, 13, 13), WAVE_RGB_COLOR("grey50", 127, 127, 127), WAVE_RGB_COLOR("grey51", 130, 130, 130), WAVE_RGB_COLOR("grey52", 133, 133, 133), WAVE_RGB_COLOR("grey53", 135, 135, 135), WAVE_RGB_COLOR("grey54", 138, 138, 138), WAVE_RGB_COLOR("grey55", 140, 140, 140), WAVE_RGB_COLOR("grey56", 143, 143, 143), WAVE_RGB_COLOR("grey57", 145, 145, 145), WAVE_RGB_COLOR("grey58", 148, 148, 148), WAVE_RGB_COLOR("grey59", 150, 150, 150), WAVE_RGB_COLOR("grey6", 15, 15, 15), WAVE_RGB_COLOR("grey60", 153, 153, 153), WAVE_RGB_COLOR("grey61", 156, 156, 156), WAVE_RGB_COLOR("grey62", 158, 158, 158), WAVE_RGB_COLOR("grey63", 161, 161, 161), WAVE_RGB_COLOR("grey64", 163, 163, 163), WAVE_RGB_COLOR("grey65", 166, 166, 166), WAVE_RGB_COLOR("grey66", 168, 168, 168), WAVE_RGB_COLOR("grey67", 171, 171, 171), WAVE_RGB_COLOR("grey68", 173, 173, 173), WAVE_RGB_COLOR("grey69", 176, 176, 176), WAVE_RGB_COLOR("grey7", 18, 18, 18), WAVE_RGB_COLOR("grey70", 179, 179, 179), WAVE_RGB_COLOR("grey71", 181, 181, 181), WAVE_RGB_COLOR("grey72", 184, 184, 184), WAVE_RGB_COLOR("grey73", 186, 186, 186), WAVE_RGB_COLOR("grey74", 189, 189, 189), WAVE_RGB_COLOR("grey75", 191, 191, 191), WAVE_RGB_COLOR("grey76", 194, 194, 194), WAVE_RGB_COLOR("grey77", 196, 196, 196), WAVE_RGB_COLOR("grey78", 199, 199, 199), WAVE_RGB_COLOR("grey79", 201, 201, 201), WAVE_RGB_COLOR("grey8", 20, 20, 20), WAVE_RGB_COLOR("grey80", 204, 204, 204), WAVE_RGB_COLOR("grey81", 207, 207, 207), WAVE_RGB_COLOR("grey82", 209, 209, 209), WAVE_RGB_COLOR("grey83", 212, 212, 212), WAVE_RGB_COLOR("grey84", 214, 214, 214), WAVE_RGB_COLOR("grey85", 217, 217, 217), WAVE_RGB_COLOR("grey86", 219, 219, 219), WAVE_RGB_COLOR("grey87", 222, 222, 222), WAVE_RGB_COLOR("grey88", 224, 224, 224), WAVE_RGB_COLOR("grey89", 227, 227, 227), WAVE_RGB_COLOR("grey9", 23, 23, 23), WAVE_RGB_COLOR("grey90", 229, 229, 229), WAVE_RGB_COLOR("grey91", 232, 232, 232), WAVE_RGB_COLOR("grey92", 235, 235, 235), WAVE_RGB_COLOR("grey93", 237, 237, 237), WAVE_RGB_COLOR("grey94", 240, 240, 240), WAVE_RGB_COLOR("grey95", 242, 242, 242), WAVE_RGB_COLOR("grey96", 245, 245, 245), WAVE_RGB_COLOR("grey97", 247, 247, 247), WAVE_RGB_COLOR("grey98", 250, 250, 250), WAVE_RGB_COLOR("grey99", 252, 252, 252), WAVE_RGB_COLOR("honeydew", 240, 255, 240), WAVE_RGB_COLOR("honeydew1", 240, 255, 240), WAVE_RGB_COLOR("honeydew2", 224, 238, 224), WAVE_RGB_COLOR("honeydew3", 193, 205, 193), WAVE_RGB_COLOR("honeydew4", 131, 139, 131), WAVE_RGB_COLOR("hot pink", 255, 105, 180), WAVE_RGB_COLOR("HotPink", 255, 105, 180), WAVE_RGB_COLOR("HotPink1", 255, 110, 180), WAVE_RGB_COLOR("HotPink2", 238, 106, 167), WAVE_RGB_COLOR("HotPink3", 205, 96, 144), WAVE_RGB_COLOR("HotPink4", 139, 58, 98), WAVE_RGB_COLOR("indian red", 205, 92, 92), WAVE_RGB_COLOR("IndianRed", 205, 92, 92), WAVE_RGB_COLOR("IndianRed1", 255, 106, 106), WAVE_RGB_COLOR("IndianRed2", 238, 99, 99), WAVE_RGB_COLOR("IndianRed3", 205, 85, 85), WAVE_RGB_COLOR("IndianRed4", 139, 58, 58), WAVE_RGB_COLOR("ivory", 255, 255, 240), WAVE_RGB_COLOR("ivory1", 255, 255, 240), WAVE_RGB_COLOR("ivory2", 238, 238, 224), WAVE_RGB_COLOR("ivory3", 205, 205, 193), WAVE_RGB_COLOR("ivory4", 139, 139, 131), WAVE_RGB_COLOR("khaki", 240, 230, 140), WAVE_RGB_COLOR("khaki1", 255, 246, 143), WAVE_RGB_COLOR("khaki2", 238, 230, 133), WAVE_RGB_COLOR("khaki3", 205, 198, 115), WAVE_RGB_COLOR("khaki4", 139, 134, 78), WAVE_RGB_COLOR("lavender", 230, 230, 250), WAVE_RGB_COLOR("lavender blush", 255, 240, 245), WAVE_RGB_COLOR("LavenderBlush", 255, 240, 245), WAVE_RGB_COLOR("LavenderBlush1", 255, 240, 245), WAVE_RGB_COLOR("LavenderBlush2", 238, 224, 229), WAVE_RGB_COLOR("LavenderBlush3", 205, 193, 197), WAVE_RGB_COLOR("LavenderBlush4", 139, 131, 134), WAVE_RGB_COLOR("lawn green", 124, 252, 0), WAVE_RGB_COLOR("LawnGreen", 124, 252, 0), WAVE_RGB_COLOR("lemon chiffon", 255, 250, 205), WAVE_RGB_COLOR("LemonChiffon", 255, 250, 205), WAVE_RGB_COLOR("LemonChiffon1", 255, 250, 205), WAVE_RGB_COLOR("LemonChiffon2", 238, 233, 191), WAVE_RGB_COLOR("LemonChiffon3", 205, 201, 165), WAVE_RGB_COLOR("LemonChiffon4", 139, 137, 112), WAVE_RGB_COLOR("light blue", 173, 216, 230), WAVE_RGB_COLOR("light coral", 240, 128, 128), WAVE_RGB_COLOR("light cyan", 224, 255, 255), WAVE_RGB_COLOR("light goldenrod", 238, 221, 130), WAVE_RGB_COLOR("light goldenrod yellow", 250, 250, 210), WAVE_RGB_COLOR("light gray", 211, 211, 211), WAVE_RGB_COLOR("light green", 144, 238, 144), WAVE_RGB_COLOR("light grey", 211, 211, 211), WAVE_RGB_COLOR("light pink", 255, 182, 193), WAVE_RGB_COLOR("light salmon", 255, 160, 122), WAVE_RGB_COLOR("light sea green", 32, 178, 170), WAVE_RGB_COLOR("light sky blue", 135, 206, 250), WAVE_RGB_COLOR("light slate blue", 132, 112, 255), WAVE_RGB_COLOR("light slate gray", 119, 136, 153), WAVE_RGB_COLOR("light slate grey", 119, 136, 153), WAVE_RGB_COLOR("light steel blue", 176, 196, 222), WAVE_RGB_COLOR("light yellow", 255, 255, 224), WAVE_RGB_COLOR("LightBlue", 173, 216, 230), WAVE_RGB_COLOR("LightBlue1", 191, 239, 255), WAVE_RGB_COLOR("LightBlue2", 178, 223, 238), WAVE_RGB_COLOR("LightBlue3", 154, 192, 205), WAVE_RGB_COLOR("LightBlue4", 104, 131, 139), WAVE_RGB_COLOR("LightCoral", 240, 128, 128), WAVE_RGB_COLOR("LightCyan", 224, 255, 255), WAVE_RGB_COLOR("LightCyan1", 224, 255, 255), WAVE_RGB_COLOR("LightCyan2", 209, 238, 238), WAVE_RGB_COLOR("LightCyan3", 180, 205, 205), WAVE_RGB_COLOR("LightCyan4", 122, 139, 139), WAVE_RGB_COLOR("LightGoldenrod", 238, 221, 130), WAVE_RGB_COLOR("LightGoldenrod1", 255, 236, 139), WAVE_RGB_COLOR("LightGoldenrod2", 238, 220, 130), WAVE_RGB_COLOR("LightGoldenrod3", 205, 190, 112), WAVE_RGB_COLOR("LightGoldenrod4", 139, 129, 76), WAVE_RGB_COLOR("LightGoldenrodYellow", 250, 250, 210), WAVE_RGB_COLOR("LightGray", 211, 211, 211), WAVE_RGB_COLOR("LightGreen", 144, 238, 144), WAVE_RGB_COLOR("LightGrey", 211, 211, 211), WAVE_RGB_COLOR("LightPink", 255, 182, 193), WAVE_RGB_COLOR("LightPink1", 255, 174, 185), WAVE_RGB_COLOR("LightPink2", 238, 162, 173), WAVE_RGB_COLOR("LightPink3", 205, 140, 149), WAVE_RGB_COLOR("LightPink4", 139, 95, 101), WAVE_RGB_COLOR("LightSalmon", 255, 160, 122), WAVE_RGB_COLOR("LightSalmon1", 255, 160, 122), WAVE_RGB_COLOR("LightSalmon2", 238, 149, 114), WAVE_RGB_COLOR("LightSalmon3", 205, 129, 98), WAVE_RGB_COLOR("LightSalmon4", 139, 87, 66), WAVE_RGB_COLOR("LightSeaGreen", 32, 178, 170), WAVE_RGB_COLOR("LightSkyBlue", 135, 206, 250), WAVE_RGB_COLOR("LightSkyBlue1", 176, 226, 255), WAVE_RGB_COLOR("LightSkyBlue2", 164, 211, 238), WAVE_RGB_COLOR("LightSkyBlue3", 141, 182, 205), WAVE_RGB_COLOR("LightSkyBlue4", 96, 123, 139), WAVE_RGB_COLOR("LightSlateBlue", 132, 112, 255), WAVE_RGB_COLOR("LightSlateGray", 119, 136, 153), WAVE_RGB_COLOR("LightSlateGrey", 119, 136, 153), WAVE_RGB_COLOR("LightSteelBlue", 176, 196, 222), WAVE_RGB_COLOR("LightSteelBlue1", 202, 225, 255), WAVE_RGB_COLOR("LightSteelBlue2", 188, 210, 238), WAVE_RGB_COLOR("LightSteelBlue3", 162, 181, 205), WAVE_RGB_COLOR("LightSteelBlue4", 110, 123, 139), WAVE_RGB_COLOR("LightYellow", 255, 255, 224), WAVE_RGB_COLOR("LightYellow1", 255, 255, 224), WAVE_RGB_COLOR("LightYellow2", 238, 238, 209), WAVE_RGB_COLOR("LightYellow3", 205, 205, 180), WAVE_RGB_COLOR("LightYellow4", 139, 139, 122), WAVE_RGB_COLOR("lime green", 50, 205, 50), WAVE_RGB_COLOR("LimeGreen", 50, 205, 50), WAVE_RGB_COLOR("linen", 250, 240, 230), WAVE_RGB_COLOR("magenta", 255, 0, 255), WAVE_RGB_COLOR("magenta1", 255, 0, 255), WAVE_RGB_COLOR("magenta2", 238, 0, 238), WAVE_RGB_COLOR("magenta3", 205, 0, 205), WAVE_RGB_COLOR("magenta4", 139, 0, 139), WAVE_RGB_COLOR("maroon", 176, 48, 96), WAVE_RGB_COLOR("maroon1", 255, 52, 179), WAVE_RGB_COLOR("maroon2", 238, 48, 167), WAVE_RGB_COLOR("maroon3", 205, 41, 144), WAVE_RGB_COLOR("maroon4", 139, 28, 98), WAVE_RGB_COLOR("medium aquamarine", 102, 205, 170), WAVE_RGB_COLOR("medium blue", 0, 0, 205), WAVE_RGB_COLOR("medium orchid", 186, 85, 211), WAVE_RGB_COLOR("medium purple", 147, 112, 219), WAVE_RGB_COLOR("medium sea green", 60, 179, 113), WAVE_RGB_COLOR("medium slate blue", 123, 104, 238), WAVE_RGB_COLOR("medium spring green", 0, 250, 154), WAVE_RGB_COLOR("medium turquoise", 72, 209, 204), WAVE_RGB_COLOR("medium violet red", 199, 21, 133), WAVE_RGB_COLOR("MediumAquamarine", 102, 205, 170), WAVE_RGB_COLOR("MediumBlue", 0, 0, 205), WAVE_RGB_COLOR("MediumOrchid", 186, 85, 211), WAVE_RGB_COLOR("MediumOrchid1", 224, 102, 255), WAVE_RGB_COLOR("MediumOrchid2", 209, 95, 238), WAVE_RGB_COLOR("MediumOrchid3", 180, 82, 205), WAVE_RGB_COLOR("MediumOrchid4", 122, 55, 139), WAVE_RGB_COLOR("MediumPurple", 147, 112, 219), WAVE_RGB_COLOR("MediumPurple1", 171, 130, 255), WAVE_RGB_COLOR("MediumPurple2", 159, 121, 238), WAVE_RGB_COLOR("MediumPurple3", 137, 104, 205), WAVE_RGB_COLOR("MediumPurple4", 93, 71, 139), WAVE_RGB_COLOR("MediumSeaGreen", 60, 179, 113), WAVE_RGB_COLOR("MediumSlateBlue", 123, 104, 238), WAVE_RGB_COLOR("MediumSpringGreen", 0, 250, 154), WAVE_RGB_COLOR("MediumTurquoise", 72, 209, 204), WAVE_RGB_COLOR("MediumVioletRed", 199, 21, 133), WAVE_RGB_COLOR("midnight blue", 25, 25, 112), WAVE_RGB_COLOR("MidnightBlue", 25, 25, 112), WAVE_RGB_COLOR("mint cream", 245, 255, 250), WAVE_RGB_COLOR("MintCream", 245, 255, 250), WAVE_RGB_COLOR("misty rose", 255, 228, 225), WAVE_RGB_COLOR("MistyRose", 255, 228, 225), WAVE_RGB_COLOR("MistyRose1", 255, 228, 225), WAVE_RGB_COLOR("MistyRose2", 238, 213, 210), WAVE_RGB_COLOR("MistyRose3", 205, 183, 181), WAVE_RGB_COLOR("MistyRose4", 139, 125, 123), WAVE_RGB_COLOR("moccasin", 255, 228, 181), WAVE_RGB_COLOR("navajo white", 255, 222, 173), WAVE_RGB_COLOR("NavajoWhite", 255, 222, 173), WAVE_RGB_COLOR("NavajoWhite1", 255, 222, 173), WAVE_RGB_COLOR("NavajoWhite2", 238, 207, 161), WAVE_RGB_COLOR("NavajoWhite3", 205, 179, 139), WAVE_RGB_COLOR("NavajoWhite4", 139, 121, 94), WAVE_RGB_COLOR("navy", 0, 0, 128), WAVE_RGB_COLOR("navy blue", 0, 0, 128), WAVE_RGB_COLOR("NavyBlue", 0, 0, 128), WAVE_RGB_COLOR("old lace", 253, 245, 230), WAVE_RGB_COLOR("OldLace", 253, 245, 230), WAVE_RGB_COLOR("olive drab", 107, 142, 35), WAVE_RGB_COLOR("OliveDrab", 107, 142, 35), WAVE_RGB_COLOR("OliveDrab1", 192, 255, 62), WAVE_RGB_COLOR("OliveDrab2", 179, 238, 58), WAVE_RGB_COLOR("OliveDrab3", 154, 205, 50), WAVE_RGB_COLOR("OliveDrab4", 105, 139, 34), WAVE_RGB_COLOR("orange", 255, 165, 0), WAVE_RGB_COLOR("orange red", 255, 69, 0), WAVE_RGB_COLOR("orange1", 255, 165, 0), WAVE_RGB_COLOR("orange2", 238, 154, 0), WAVE_RGB_COLOR("orange3", 205, 133, 0), WAVE_RGB_COLOR("orange4", 139, 90, 0), WAVE_RGB_COLOR("OrangeRed", 255, 69, 0), WAVE_RGB_COLOR("OrangeRed1", 255, 69, 0), WAVE_RGB_COLOR("OrangeRed2", 238, 64, 0), WAVE_RGB_COLOR("OrangeRed3", 205, 55, 0), WAVE_RGB_COLOR("OrangeRed4", 139, 37, 0), WAVE_RGB_COLOR("orchid", 218, 112, 214), WAVE_RGB_COLOR("orchid1", 255, 131, 250), WAVE_RGB_COLOR("orchid2", 238, 122, 233), WAVE_RGB_COLOR("orchid3", 205, 105, 201), WAVE_RGB_COLOR("orchid4", 139, 71, 137), WAVE_RGB_COLOR("pale goldenrod", 238, 232, 170), WAVE_RGB_COLOR("pale green", 152, 251, 152), WAVE_RGB_COLOR("pale turquoise", 175, 238, 238), WAVE_RGB_COLOR("pale violet red", 219, 112, 147), WAVE_RGB_COLOR("PaleGoldenrod", 238, 232, 170), WAVE_RGB_COLOR("PaleGreen", 152, 251, 152), WAVE_RGB_COLOR("PaleGreen1", 154, 255, 154), WAVE_RGB_COLOR("PaleGreen2", 144, 238, 144), WAVE_RGB_COLOR("PaleGreen3", 124, 205, 124), WAVE_RGB_COLOR("PaleGreen4", 84, 139, 84), WAVE_RGB_COLOR("PaleTurquoise", 175, 238, 238), WAVE_RGB_COLOR("PaleTurquoise1", 187, 255, 255), WAVE_RGB_COLOR("PaleTurquoise2", 174, 238, 238), WAVE_RGB_COLOR("PaleTurquoise3", 150, 205, 205), WAVE_RGB_COLOR("PaleTurquoise4", 102, 139, 139), WAVE_RGB_COLOR("PaleVioletRed", 219, 112, 147), WAVE_RGB_COLOR("PaleVioletRed1", 255, 130, 171), WAVE_RGB_COLOR("PaleVioletRed2", 238, 121, 159), WAVE_RGB_COLOR("PaleVioletRed3", 205, 104, 137), WAVE_RGB_COLOR("PaleVioletRed4", 139, 71, 93), WAVE_RGB_COLOR("papaya whip", 255, 239, 213), WAVE_RGB_COLOR("PapayaWhip", 255, 239, 213), WAVE_RGB_COLOR("peach puff", 255, 218, 185), WAVE_RGB_COLOR("PeachPuff", 255, 218, 185), WAVE_RGB_COLOR("PeachPuff1", 255, 218, 185), WAVE_RGB_COLOR("PeachPuff2", 238, 203, 173), WAVE_RGB_COLOR("PeachPuff3", 205, 175, 149), WAVE_RGB_COLOR("PeachPuff4", 139, 119, 101), WAVE_RGB_COLOR("peru", 205, 133, 63), WAVE_RGB_COLOR("pink", 255, 192, 203), WAVE_RGB_COLOR("pink1", 255, 181, 197), WAVE_RGB_COLOR("pink2", 238, 169, 184), WAVE_RGB_COLOR("pink3", 205, 145, 158), WAVE_RGB_COLOR("pink4", 139, 99, 108), WAVE_RGB_COLOR("plum", 221, 160, 221), WAVE_RGB_COLOR("plum1", 255, 187, 255), WAVE_RGB_COLOR("plum2", 238, 174, 238), WAVE_RGB_COLOR("plum3", 205, 150, 205), WAVE_RGB_COLOR("plum4", 139, 102, 139), WAVE_RGB_COLOR("powder blue", 176, 224, 230), WAVE_RGB_COLOR("PowderBlue", 176, 224, 230), WAVE_RGB_COLOR("purple", 160, 32, 240), WAVE_RGB_COLOR("purple1", 155, 48, 255), WAVE_RGB_COLOR("purple2", 145, 44, 238), WAVE_RGB_COLOR("purple3", 125, 38, 205), WAVE_RGB_COLOR("purple4", 85, 26, 139), WAVE_RGB_COLOR("red", 255, 0, 0), WAVE_RGB_COLOR("red1", 255, 0, 0), WAVE_RGB_COLOR("red2", 238, 0, 0), WAVE_RGB_COLOR("red3", 205, 0, 0), WAVE_RGB_COLOR("red4", 139, 0, 0), WAVE_RGB_COLOR("rosy brown", 188, 143, 143), WAVE_RGB_COLOR("RosyBrown", 188, 143, 143), WAVE_RGB_COLOR("RosyBrown1", 255, 193, 193), WAVE_RGB_COLOR("RosyBrown2", 238, 180, 180), WAVE_RGB_COLOR("RosyBrown3", 205, 155, 155), WAVE_RGB_COLOR("RosyBrown4", 139, 105, 105), WAVE_RGB_COLOR("royal blue", 65, 105, 225), WAVE_RGB_COLOR("RoyalBlue", 65, 105, 225), WAVE_RGB_COLOR("RoyalBlue1", 72, 118, 255), WAVE_RGB_COLOR("RoyalBlue2", 67, 110, 238), WAVE_RGB_COLOR("RoyalBlue3", 58, 95, 205), WAVE_RGB_COLOR("RoyalBlue4", 39, 64, 139), WAVE_RGB_COLOR("saddle brown", 139, 69, 19), WAVE_RGB_COLOR("SaddleBrown", 139, 69, 19), WAVE_RGB_COLOR("salmon", 250, 128, 114), WAVE_RGB_COLOR("salmon1", 255, 140, 105), WAVE_RGB_COLOR("salmon2", 238, 130, 98), WAVE_RGB_COLOR("salmon3", 205, 112, 84), WAVE_RGB_COLOR("salmon4", 139, 76, 57), WAVE_RGB_COLOR("sandy brown", 244, 164, 96), WAVE_RGB_COLOR("SandyBrown", 244, 164, 96), WAVE_RGB_COLOR("sea green", 46, 139, 87), WAVE_RGB_COLOR("SeaGreen", 46, 139, 87), WAVE_RGB_COLOR("SeaGreen1", 84, 255, 159), WAVE_RGB_COLOR("SeaGreen2", 78, 238, 148), WAVE_RGB_COLOR("SeaGreen3", 67, 205, 128), WAVE_RGB_COLOR("SeaGreen4", 46, 139, 87), WAVE_RGB_COLOR("seashell", 255, 245, 238), WAVE_RGB_COLOR("seashell1", 255, 245, 238), WAVE_RGB_COLOR("seashell2", 238, 229, 222), WAVE_RGB_COLOR("seashell3", 205, 197, 191), WAVE_RGB_COLOR("seashell4", 139, 134, 130), WAVE_RGB_COLOR("sienna", 160, 82, 45), WAVE_RGB_COLOR("sienna1", 255, 130, 71), WAVE_RGB_COLOR("sienna2", 238, 121, 66), WAVE_RGB_COLOR("sienna3", 205, 104, 57), WAVE_RGB_COLOR("sienna4", 139, 71, 38), WAVE_RGB_COLOR("sky blue", 135, 206, 235), WAVE_RGB_COLOR("SkyBlue", 135, 206, 235), WAVE_RGB_COLOR("SkyBlue1", 135, 206, 255), WAVE_RGB_COLOR("SkyBlue2", 126, 192, 238), WAVE_RGB_COLOR("SkyBlue3", 108, 166, 205), WAVE_RGB_COLOR("SkyBlue4", 74, 112, 139), WAVE_RGB_COLOR("slate blue", 106, 90, 205), WAVE_RGB_COLOR("slate gray", 112, 128, 144), WAVE_RGB_COLOR("slate grey", 112, 128, 144), WAVE_RGB_COLOR("SlateBlue", 106, 90, 205), WAVE_RGB_COLOR("SlateBlue1", 131, 111, 255), WAVE_RGB_COLOR("SlateBlue2", 122, 103, 238), WAVE_RGB_COLOR("SlateBlue3", 105, 89, 205), WAVE_RGB_COLOR("SlateBlue4", 71, 60, 139), WAVE_RGB_COLOR("SlateGray", 112, 128, 144), WAVE_RGB_COLOR("SlateGray1", 198, 226, 255), WAVE_RGB_COLOR("SlateGray2", 185, 211, 238), WAVE_RGB_COLOR("SlateGray3", 159, 182, 205), WAVE_RGB_COLOR("SlateGray4", 108, 123, 139), WAVE_RGB_COLOR("SlateGrey", 112, 128, 144), WAVE_RGB_COLOR("snow", 255, 250, 250), WAVE_RGB_COLOR("snow1", 255, 250, 250), WAVE_RGB_COLOR("snow2", 238, 233, 233), WAVE_RGB_COLOR("snow3", 205, 201, 201), WAVE_RGB_COLOR("snow4", 139, 137, 137), WAVE_RGB_COLOR("spring green", 0, 255, 127), WAVE_RGB_COLOR("SpringGreen", 0, 255, 127), WAVE_RGB_COLOR("SpringGreen1", 0, 255, 127), WAVE_RGB_COLOR("SpringGreen2", 0, 238, 118), WAVE_RGB_COLOR("SpringGreen3", 0, 205, 102), WAVE_RGB_COLOR("SpringGreen4", 0, 139, 69), WAVE_RGB_COLOR("steel blue", 70, 130, 180), WAVE_RGB_COLOR("SteelBlue", 70, 130, 180), WAVE_RGB_COLOR("SteelBlue1", 99, 184, 255), WAVE_RGB_COLOR("SteelBlue2", 92, 172, 238), WAVE_RGB_COLOR("SteelBlue3", 79, 148, 205), WAVE_RGB_COLOR("SteelBlue4", 54, 100, 139), WAVE_RGB_COLOR("tan", 210, 180, 140), WAVE_RGB_COLOR("tan1", 255, 165, 79), WAVE_RGB_COLOR("tan2", 238, 154, 73), WAVE_RGB_COLOR("tan3", 205, 133, 63), WAVE_RGB_COLOR("tan4", 139, 90, 43), WAVE_RGB_COLOR("thistle", 216, 191, 216), WAVE_RGB_COLOR("thistle1", 255, 225, 255), WAVE_RGB_COLOR("thistle2", 238, 210, 238), WAVE_RGB_COLOR("thistle3", 205, 181, 205), WAVE_RGB_COLOR("thistle4", 139, 123, 139), WAVE_RGB_COLOR("tomato", 255, 99, 71), WAVE_RGB_COLOR("tomato1", 255, 99, 71), WAVE_RGB_COLOR("tomato2", 238, 92, 66), WAVE_RGB_COLOR("tomato3", 205, 79, 57), WAVE_RGB_COLOR("tomato4", 139, 54, 38), WAVE_RGB_COLOR("turquoise", 64, 224, 208), WAVE_RGB_COLOR("turquoise1", 0, 245, 255), WAVE_RGB_COLOR("turquoise2", 0, 229, 238), WAVE_RGB_COLOR("turquoise3", 0, 197, 205), WAVE_RGB_COLOR("turquoise4", 0, 134, 139), WAVE_RGB_COLOR("violet", 238, 130, 238), WAVE_RGB_COLOR("violet red", 208, 32, 144), WAVE_RGB_COLOR("VioletRed", 208, 32, 144), WAVE_RGB_COLOR("VioletRed1", 255, 62, 150), WAVE_RGB_COLOR("VioletRed2", 238, 58, 140), WAVE_RGB_COLOR("VioletRed3", 205, 50, 120), WAVE_RGB_COLOR("VioletRed4", 139, 34, 82), WAVE_RGB_COLOR("wheat", 245, 222, 179), WAVE_RGB_COLOR("wheat1", 255, 231, 186), WAVE_RGB_COLOR("wheat2", 238, 216, 174), WAVE_RGB_COLOR("wheat3", 205, 186, 150), WAVE_RGB_COLOR("wheat4", 139, 126, 102), WAVE_RGB_COLOR("white", 255, 255, 255), WAVE_RGB_COLOR("white smoke", 245, 245, 245), WAVE_RGB_COLOR("WhiteSmoke", 245, 245, 245), WAVE_RGB_COLOR("yellow", 255, 255, 0), WAVE_RGB_COLOR("yellow green", 154, 205, 50), WAVE_RGB_COLOR("yellow1", 255, 255, 0), WAVE_RGB_COLOR("yellow2", 238, 238, 0), WAVE_RGB_COLOR("yellow3", 205, 205, 0), WAVE_RGB_COLOR("yellow4", 139, 139, 0), WAVE_RGB_COLOR("YellowGreen", 154, 205, 50), }; #define C_ARRAY_SIZE (sizeof(colors)/sizeof(struct wave_rgb_color)) static int compar(const void *v1, const void *v2) { const char *key = (const char *)v1; const struct wave_rgb_color *color = (const struct wave_rgb_color *)v2; return((int)strcasecmp(key, color->name)); } GdkGC *get_gc_from_name(char *str) { struct wave_rgb_color *match; if((match=(struct wave_rgb_color *)bsearch((void *)str, (void *)colors, C_ARRAY_SIZE, sizeof(struct wave_rgb_color), compar))) { if(!match->context) match->context = alloc_color(GLOBALS->wavearea, match->rgb, GLOBALS->wavearea->style->white_gc); return(match->context); } return(NULL); } int get_rgb_from_name(char *str) { struct wave_rgb_color *match; if((match=(struct wave_rgb_color *)bsearch((void *)str, (void *)colors, C_ARRAY_SIZE, sizeof(struct wave_rgb_color), compar))) { return(match->rgb); } else { unsigned char *pnt=(unsigned char *)str; int l=strlen(str); unsigned char ch; int i; unsigned int rc; for(i=0;i='0')&&(ch<='9')) || ((ch>='a')&&(ch<='f')) || ((ch>='A')&&(ch<='F'))) continue; else { #if defined _MSC_VER || defined __MINGW32__ fprintf(stderr, "** gtkwave.ini (line %d): '%s' is an unknown color value; ignoring.\n", GLOBALS->rc_line_no, str); #else fprintf(stderr, "** .gtkwaverc (line %d): '%s' is an unknown color value; ignoring.\n", GLOBALS->rc_line_no, str); #endif return(~0); } } sscanf(str,"%x",&rc); return(rc&0x00ffffff); } } gtkwave-3.3.86/src/vcd.c0000664000175000017500000021671013166335473014322 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2017. * * 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. */ /* * vcd.c 23jan99ajb * evcd parts 29jun99ajb * profiler optimizations 15jul99ajb * more profiler optimizations 25jan00ajb * finsim parameter fix 26jan00ajb * vector rechaining code 03apr00ajb * multiple var section code 06apr00ajb * fix for duplicate nets 19dec00ajb * support for alt hier seps 23dec00ajb * fix for rcs identifiers 16jan01ajb * coredump fix for bad VCD 04apr02ajb * min/maxid speedup 27feb03ajb * bugfix on min/maxid speedup 06jul03ajb * escaped hier modification 20feb06ajb * added real_parameter vartype 04aug06ajb * added in/out port vartype 31jan07ajb * use gperf for port vartypes 19feb07ajb * MTI SV implicit-var fix 05apr07ajb * MTI SV len=0 is real var 05apr07ajb */ /* AIX may need this for alloca to work */ #if defined _AIX #pragma alloca #endif #include #include "globals.h" #include "vcd.h" #include "hierpack.h" #undef VCD_BSEARCH_IS_PERFECT /* bsearch is imperfect under linux, but OK under AIX */ static void add_histent(TimeType time, struct Node *n, char ch, int regadd, char *vector); static void add_tail_histents(void); static void vcd_build_symbols(void); static void vcd_cleanup(void); static void evcd_strcpy(char *dst, char *src); /******************************************************************/ static void malform_eof_fix(void) { if(feof(GLOBALS->vcd_handle_vcd_c_1)) { memset(GLOBALS->vcdbuf_vcd_c_1, ' ', VCD_BSIZ); GLOBALS->vst_vcd_c_1=GLOBALS->vend_vcd_c_1; } } /**/ void strcpy_vcdalt(char *too, char *from, char delim) { char ch; do { ch=*(from++); if(ch==delim) { ch=GLOBALS->hier_delimeter; } } while((*(too++)=ch)); } int strcpy_delimfix(char *too, char *from) { char ch; int found = 0; do { ch=*(from++); if(ch==GLOBALS->hier_delimeter) { ch=VCDNAM_ESCAPE; found = 1; } } while((*(too++)=ch)); if(found) GLOBALS->escaped_names_found_vcd_c_1 = found; return(found); } /******************************************************************/ /******************************************************************/ enum Tokens { T_VAR, T_END, T_SCOPE, T_UPSCOPE, T_COMMENT, T_DATE, T_DUMPALL, T_DUMPOFF, T_DUMPON, T_DUMPVARS, T_ENDDEFINITIONS, T_DUMPPORTS, T_DUMPPORTSOFF, T_DUMPPORTSON, T_DUMPPORTSALL, T_TIMESCALE, T_VERSION, T_VCDCLOSE, T_TIMEZERO, T_EOF, T_STRING, T_UNKNOWN_KEY }; static char *tokens[]={ "var", "end", "scope", "upscope", "comment", "date", "dumpall", "dumpoff", "dumpon", "dumpvars", "enddefinitions", "dumpports", "dumpportsoff", "dumpportson", "dumpportsall", "timescale", "version", "vcdclose", "timezero", "", "", "" }; #define NUM_TOKENS 19 #define T_GET tok=get_token();if((tok==T_END)||(tok==T_EOF))break; /******************************************************************/ /******************************************************************/ /* * histent structs are NEVER freed so this is OK.. * (we are allocating as many entries that fit in 64k minus the size of the two * bookkeeping void* pointers found in the malloc_2/free_2 routines in * debug.c--unless Judy, then can dispense with pointer subtraction) */ #ifdef _WAVE_HAVE_JUDY #define VCD_HISTENT_GRANULARITY ( (64*1024) / sizeof(HistEnt) ) #else #define VCD_HISTENT_GRANULARITY ( ( (64*1024)-(2*sizeof(void *)) ) / sizeof(HistEnt) ) #endif struct HistEnt *histent_calloc(void) { if(GLOBALS->he_curr_vcd_c_1==GLOBALS->he_fini_vcd_c_1) { GLOBALS->he_curr_vcd_c_1=(struct HistEnt *)calloc_2(VCD_HISTENT_GRANULARITY, sizeof(struct HistEnt)); GLOBALS->he_fini_vcd_c_1=GLOBALS->he_curr_vcd_c_1+VCD_HISTENT_GRANULARITY; } return(GLOBALS->he_curr_vcd_c_1++); } /******************************************************************/ /******************************************************************/ static unsigned int vcdid_hash(char *s, int len) { unsigned int val=0; int i; s+=(len-1); for(i=0;iid)); } /* * actual bsearch */ static struct vcdsymbol *bsearch_vcd(char *key, int len) { struct vcdsymbol **v; struct vcdsymbol *t; if(GLOBALS->indexed_vcd_c_1) { unsigned int hsh = vcdid_hash(key, len); if((hsh>=GLOBALS->vcd_minid_vcd_c_1)&&(hsh<=GLOBALS->vcd_maxid_vcd_c_1)) { return(GLOBALS->indexed_vcd_c_1[hsh-GLOBALS->vcd_minid_vcd_c_1]); } return(NULL); } if(GLOBALS->sorted_vcd_c_1) { v=(struct vcdsymbol **)bsearch(key, GLOBALS->sorted_vcd_c_1, GLOBALS->numsyms_vcd_c_1, sizeof(struct vcdsymbol *), vcdsymbsearchcompare); if(v) { #ifndef VCD_BSEARCH_IS_PERFECT for(;;) { t=*v; if((v==GLOBALS->sorted_vcd_c_1)||(strcmp((*(--v))->id, key))) { return(t); } } #else return(*v); #endif } else { return(NULL); } } else { if(!GLOBALS->err_vcd_c_1) { fprintf(stderr, "Near byte %d, VCD search table NULL..is this a VCD file?\n", (int)(GLOBALS->vcdbyteno_vcd_c_1+(GLOBALS->vst_vcd_c_1-GLOBALS->vcdbuf_vcd_c_1))); GLOBALS->err_vcd_c_1=1; } return(NULL); } } /* * sort on vcdsymbol pointers */ static int vcdsymcompare(const void *s1, const void *s2) { struct vcdsymbol *v1, *v2; v1=*((struct vcdsymbol **)s1); v2=*((struct vcdsymbol **)s2); return(strcmp(v1->id, v2->id)); } /* * create sorted (by id) table */ static void create_sorted_table(void) { struct vcdsymbol *v; struct vcdsymbol **pnt; unsigned int vcd_distance; if(GLOBALS->sorted_vcd_c_1) { free_2(GLOBALS->sorted_vcd_c_1); /* this means we saw a 2nd enddefinition chunk! */ GLOBALS->sorted_vcd_c_1=NULL; } if(GLOBALS->indexed_vcd_c_1) { free_2(GLOBALS->indexed_vcd_c_1); GLOBALS->indexed_vcd_c_1=NULL; } if(GLOBALS->numsyms_vcd_c_1) { vcd_distance = GLOBALS->vcd_maxid_vcd_c_1 - GLOBALS->vcd_minid_vcd_c_1 + 1; if((vcd_distance <= VCD_INDEXSIZ)||(!GLOBALS->vcd_hash_kill)) { GLOBALS->indexed_vcd_c_1 = (struct vcdsymbol **)calloc_2(vcd_distance, sizeof(struct vcdsymbol *)); /* printf("%d symbols span ID range of %d, using indexing...\n", GLOBALS->numsyms_vcd_c_1, vcd_distance); */ v=GLOBALS->vcdsymroot_vcd_c_1; while(v) { if(!GLOBALS->indexed_vcd_c_1[v->nid - GLOBALS->vcd_minid_vcd_c_1]) GLOBALS->indexed_vcd_c_1[v->nid - GLOBALS->vcd_minid_vcd_c_1] = v; v=v->next; } } else { pnt=GLOBALS->sorted_vcd_c_1=(struct vcdsymbol **)calloc_2(GLOBALS->numsyms_vcd_c_1, sizeof(struct vcdsymbol *)); v=GLOBALS->vcdsymroot_vcd_c_1; while(v) { *(pnt++)=v; v=v->next; } qsort(GLOBALS->sorted_vcd_c_1, GLOBALS->numsyms_vcd_c_1, sizeof(struct vcdsymbol *), vcdsymcompare); } } } /******************************************************************/ /* * single char get inlined/optimized */ static void getch_alloc(void) { GLOBALS->vend_vcd_c_1=GLOBALS->vst_vcd_c_1=GLOBALS->vcdbuf_vcd_c_1=(char *)calloc_2(1,VCD_BSIZ); } static void getch_free(void) { free_2(GLOBALS->vcdbuf_vcd_c_1); GLOBALS->vcdbuf_vcd_c_1=GLOBALS->vst_vcd_c_1=GLOBALS->vend_vcd_c_1=NULL; } static int getch_fetch(void) { size_t rd; errno = 0; if(feof(GLOBALS->vcd_handle_vcd_c_1)) return(-1); GLOBALS->vcdbyteno_vcd_c_1+=(GLOBALS->vend_vcd_c_1-GLOBALS->vcdbuf_vcd_c_1); rd=fread(GLOBALS->vcdbuf_vcd_c_1, sizeof(char), VCD_BSIZ, GLOBALS->vcd_handle_vcd_c_1); GLOBALS->vend_vcd_c_1=(GLOBALS->vst_vcd_c_1=GLOBALS->vcdbuf_vcd_c_1)+rd; if((!rd)||(errno)) return(-1); if(GLOBALS->vcd_fsiz_vcd_c_1) { splash_sync(GLOBALS->vcdbyteno_vcd_c_1, GLOBALS->vcd_fsiz_vcd_c_1); /* gnome 2.18 seems to set errno so splash moved here... */ } return((int)(*GLOBALS->vst_vcd_c_1)); } static inline signed char getch(void) { signed char ch = ((GLOBALS->vst_vcd_c_1!=GLOBALS->vend_vcd_c_1)?((int)(*GLOBALS->vst_vcd_c_1)):(getch_fetch())); GLOBALS->vst_vcd_c_1++; return(ch); } static inline signed char getch_peek(void) { signed char ch = ((GLOBALS->vst_vcd_c_1!=GLOBALS->vend_vcd_c_1)?((int)(*GLOBALS->vst_vcd_c_1)):(getch_fetch())); /* no increment */ return(ch); } static int getch_patched(void) { char ch; ch=*GLOBALS->vsplitcurr_vcd_c_1; if(!ch) { return(-1); } else { GLOBALS->vsplitcurr_vcd_c_1++; return((int)ch); } } /* * simple tokenizer */ static int get_token(void) { int ch; int i, len=0; int is_string=0; char *yyshadow; for(;;) { ch=getch(); if(ch<0) return(T_EOF); if(ch<=' ') continue; /* val<=' ' is a quick whitespace check */ break; /* (take advantage of fact that vcd is text) */ } if(ch=='$') { GLOBALS->yytext_vcd_c_1[len++]=ch; for(;;) { ch=getch(); if(ch<0) return(T_EOF); if(ch<=' ') continue; break; } } else { is_string=1; } for(GLOBALS->yytext_vcd_c_1[len++]=ch;;GLOBALS->yytext_vcd_c_1[len++]=ch) { if(len==GLOBALS->T_MAX_STR_vcd_c_1) { GLOBALS->yytext_vcd_c_1=(char *)realloc_2(GLOBALS->yytext_vcd_c_1, (GLOBALS->T_MAX_STR_vcd_c_1=GLOBALS->T_MAX_STR_vcd_c_1*2)+1); } ch=getch(); if(ch<=' ') break; } GLOBALS->yytext_vcd_c_1[len]=0; /* terminator */ if(is_string) { GLOBALS->yylen_vcd_c_1=len; return(T_STRING); } yyshadow=GLOBALS->yytext_vcd_c_1; do { yyshadow++; for(i=0;ivar_prevch_vcd_c_1) { for(;;) { ch=getch_patched(); if(ch<0) { free_2(GLOBALS->varsplit_vcd_c_1); GLOBALS->varsplit_vcd_c_1=NULL; return(V_END); } if((ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r')) continue; break; } } else { ch=GLOBALS->var_prevch_vcd_c_1; GLOBALS->var_prevch_vcd_c_1=0; } if(ch=='[') return(V_LB); if(ch==':') return(V_COLON); if(ch==']') return(V_RB); for(GLOBALS->yytext_vcd_c_1[len++]=ch;;GLOBALS->yytext_vcd_c_1[len++]=ch) { if(len==GLOBALS->T_MAX_STR_vcd_c_1) { GLOBALS->yytext_vcd_c_1=(char *)realloc_2(GLOBALS->yytext_vcd_c_1, (GLOBALS->T_MAX_STR_vcd_c_1=GLOBALS->T_MAX_STR_vcd_c_1*2)+1); } ch=getch_patched(); if(ch<0) { free_2(GLOBALS->varsplit_vcd_c_1); GLOBALS->varsplit_vcd_c_1=NULL; break; } if((ch==':')||(ch==']')) { GLOBALS->var_prevch_vcd_c_1=ch; break; } } GLOBALS->yytext_vcd_c_1[len]=0; /* terminator */ if(match_kw) { int vt = vcd_keyword_code(GLOBALS->yytext_vcd_c_1, len); if(vt != V_STRING) { if(ch<0) { free_2(GLOBALS->varsplit_vcd_c_1); GLOBALS->varsplit_vcd_c_1=NULL; } return(vt); } } GLOBALS->yylen_vcd_c_1=len; if(ch<0) { free_2(GLOBALS->varsplit_vcd_c_1); GLOBALS->varsplit_vcd_c_1=NULL; } return(V_STRING); } static int get_vartoken(int match_kw) { int ch; int len=0; if(GLOBALS->varsplit_vcd_c_1) { int rc=get_vartoken_patched(match_kw); if(rc!=V_END) return(rc); GLOBALS->var_prevch_vcd_c_1=0; } if(!GLOBALS->var_prevch_vcd_c_1) { for(;;) { ch=getch(); if(ch<0) return(V_END); if((ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r')) continue; break; } } else { ch=GLOBALS->var_prevch_vcd_c_1; GLOBALS->var_prevch_vcd_c_1=0; } if(ch=='[') return(V_LB); if(ch==':') return(V_COLON); if(ch==']') return(V_RB); if(ch=='#') /* for MTI System Verilog '$var reg 64 >w #implicit-var###VarElem:ram_di[0.0] [63:0] $end' style declarations */ { /* debussy simply escapes until the space */ GLOBALS->yytext_vcd_c_1[len++]= '\\'; } for(GLOBALS->yytext_vcd_c_1[len++]=ch;;GLOBALS->yytext_vcd_c_1[len++]=ch) { if(len==GLOBALS->T_MAX_STR_vcd_c_1) { GLOBALS->yytext_vcd_c_1=(char *)realloc_2(GLOBALS->yytext_vcd_c_1, (GLOBALS->T_MAX_STR_vcd_c_1=GLOBALS->T_MAX_STR_vcd_c_1*2)+1); } ch=getch(); if(ch==' ') { if(match_kw) break; if(getch_peek() == '[') { ch = getch(); GLOBALS->varsplit_vcd_c_1=GLOBALS->yytext_vcd_c_1+len; /* keep looping so we get the *last* one */ continue; } } if((ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r')||(ch<0)) break; if((ch=='[')&&(GLOBALS->yytext_vcd_c_1[0]!='\\')) { GLOBALS->varsplit_vcd_c_1=GLOBALS->yytext_vcd_c_1+len; /* keep looping so we get the *last* one */ } else if(((ch==':')||(ch==']'))&&(!GLOBALS->varsplit_vcd_c_1)&&(GLOBALS->yytext_vcd_c_1[0]!='\\')) { GLOBALS->var_prevch_vcd_c_1=ch; break; } } GLOBALS->yytext_vcd_c_1[len]=0; /* absolute terminator */ if((GLOBALS->varsplit_vcd_c_1)&&(GLOBALS->yytext_vcd_c_1[len-1]==']')) { char *vst; vst=malloc_2(strlen(GLOBALS->varsplit_vcd_c_1)+1); strcpy(vst, GLOBALS->varsplit_vcd_c_1); *GLOBALS->varsplit_vcd_c_1=0x00; /* zero out var name at the left bracket */ len=GLOBALS->varsplit_vcd_c_1-GLOBALS->yytext_vcd_c_1; GLOBALS->varsplit_vcd_c_1=GLOBALS->vsplitcurr_vcd_c_1=vst; GLOBALS->var_prevch_vcd_c_1=0; } else { GLOBALS->varsplit_vcd_c_1=NULL; } if(match_kw) { int vt = vcd_keyword_code(GLOBALS->yytext_vcd_c_1, len); if(vt != V_STRING) { return(vt); } } GLOBALS->yylen_vcd_c_1=len; return(V_STRING); } static int get_strtoken(void) { int ch; int len=0; if(!GLOBALS->var_prevch_vcd_c_1) { for(;;) { ch=getch(); if(ch<0) return(V_END); if((ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r')) continue; break; } } else { ch=GLOBALS->var_prevch_vcd_c_1; GLOBALS->var_prevch_vcd_c_1=0; } for(GLOBALS->yytext_vcd_c_1[len++]=ch;;GLOBALS->yytext_vcd_c_1[len++]=ch) { if(len==GLOBALS->T_MAX_STR_vcd_c_1) { GLOBALS->yytext_vcd_c_1=(char *)realloc_2(GLOBALS->yytext_vcd_c_1, (GLOBALS->T_MAX_STR_vcd_c_1=GLOBALS->T_MAX_STR_vcd_c_1*2)+1); } ch=getch(); if((ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r')||(ch<0)) break; } GLOBALS->yytext_vcd_c_1[len]=0; /* terminator */ GLOBALS->yylen_vcd_c_1=len; return(V_STRING); } static void sync_end(char *hdr) { int tok; if(hdr) { DEBUG(fprintf(stderr,"%s",hdr)); } for(;;) { tok=get_token(); if((tok==T_END)||(tok==T_EOF)) break; if(hdr) { DEBUG(fprintf(stderr," %s",GLOBALS->yytext_vcd_c_1)); } } if(hdr) { DEBUG(fprintf(stderr,"\n")); } } static int version_sync_end(char *hdr) { int tok; int rc = 0; if(hdr) { DEBUG(fprintf(stderr,"%s",hdr)); } for(;;) { tok=get_token(); if((tok==T_END)||(tok==T_EOF)) break; if(hdr) { DEBUG(fprintf(stderr," %s",GLOBALS->yytext_vcd_c_1)); } if(strstr(GLOBALS->yytext_vcd_c_1, "Icarus")) /* turn off autocoalesce for Icarus */ { GLOBALS->autocoalesce = 0; rc = 1; } } if(hdr) { DEBUG(fprintf(stderr,"\n")); } return(rc); } char *build_slisthier(void) { struct slist *s; int len=0; if(GLOBALS->slisthier) { free_2(GLOBALS->slisthier); } if(!GLOBALS->slistroot) { GLOBALS->slisthier_len=0; GLOBALS->slisthier=(char *)malloc_2(1); *GLOBALS->slisthier=0; return(GLOBALS->slisthier); } s=GLOBALS->slistroot; len=0; while(s) { len+=s->len+(s->next?1:0); s=s->next; } GLOBALS->slisthier=(char *)malloc_2((GLOBALS->slisthier_len=len)+1); s=GLOBALS->slistroot; len=0; while(s) { strcpy(GLOBALS->slisthier+len,s->str); len+=s->len; if(s->next) { strcpy(GLOBALS->slisthier+len,GLOBALS->vcd_hier_delimeter); len++; } s=s->next; } return(GLOBALS->slisthier); } void append_vcd_slisthier(char *str) { struct slist *s; s=(struct slist *)calloc_2(1,sizeof(struct slist)); s->len=strlen(str); s->str=(char *)malloc_2(s->len+1); strcpy(s->str,str); if(GLOBALS->slistcurr) { GLOBALS->slistcurr->next=s; GLOBALS->slistcurr=s; } else { GLOBALS->slistcurr=GLOBALS->slistroot=s; } build_slisthier(); DEBUG(fprintf(stderr, "SCOPE: %s\n",GLOBALS->slisthier)); } static void parse_valuechange(void) { struct vcdsymbol *v; char *vector; int vlen; switch(GLOBALS->yytext_vcd_c_1[0]) { case '0': case '1': case 'x': case 'X': case 'z': case 'Z': case 'h': case 'H': case 'u': case 'U': case 'w': case 'W': case 'l': case 'L': case '-': if(GLOBALS->yylen_vcd_c_1>1) { v=bsearch_vcd(GLOBALS->yytext_vcd_c_1+1, GLOBALS->yylen_vcd_c_1-1); if(!v) { fprintf(stderr,"Near byte %d, Unknown VCD identifier: '%s'\n",(int)(GLOBALS->vcdbyteno_vcd_c_1+(GLOBALS->vst_vcd_c_1-GLOBALS->vcdbuf_vcd_c_1)),GLOBALS->yytext_vcd_c_1+1); malform_eof_fix(); } else { v->value[0]=GLOBALS->yytext_vcd_c_1[0]; DEBUG(fprintf(stderr,"%s = '%c'\n",v->name,v->value[0])); add_histent(GLOBALS->current_time_vcd_c_1,v->narray[0],v->value[0],1, NULL); } } else { fprintf(stderr,"Near byte %d, Malformed VCD identifier\n", (int)(GLOBALS->vcdbyteno_vcd_c_1+(GLOBALS->vst_vcd_c_1-GLOBALS->vcdbuf_vcd_c_1))); malform_eof_fix(); } break; case 'b': case 'B': { /* extract binary number then.. */ vector=malloc_2(GLOBALS->yylen_cache_vcd_c_1=GLOBALS->yylen_vcd_c_1); strcpy(vector,GLOBALS->yytext_vcd_c_1+1); vlen=GLOBALS->yylen_vcd_c_1-1; get_strtoken(); v=bsearch_vcd(GLOBALS->yytext_vcd_c_1, GLOBALS->yylen_vcd_c_1); if(!v) { fprintf(stderr,"Near byte %d, Unknown identifier: '%s'\n",(int)(GLOBALS->vcdbyteno_vcd_c_1+(GLOBALS->vst_vcd_c_1-GLOBALS->vcdbuf_vcd_c_1)), GLOBALS->yytext_vcd_c_1); free_2(vector); malform_eof_fix(); } else { if ((v->vartype==V_REAL)||(v->vartype==V_STRINGTYPE)||((GLOBALS->convert_to_reals)&&((v->vartype==V_INTEGER)||(v->vartype==V_PARAMETER)))) { double *d; char *pnt; char ch; TimeType k=0; pnt=vector; while((ch=*(pnt++))) { k=(k<<1)|((ch=='1')?1:0); } free_2(vector); d=malloc_2(sizeof(double)); *d=(double)k; if(!v) { fprintf(stderr,"Near byte %d, Unknown identifier: '%s'\n",(int)(GLOBALS->vcdbyteno_vcd_c_1+(GLOBALS->vst_vcd_c_1-GLOBALS->vcdbuf_vcd_c_1)), GLOBALS->yytext_vcd_c_1); free_2(d); malform_eof_fix(); } else { add_histent(GLOBALS->current_time_vcd_c_1, v->narray[0],'g',1,(char *)d); } break; } if(vlensize) /* fill in left part */ { char extend; int i, fill; extend=(vector[0]=='1')?'0':vector[0]; fill=v->size-vlen; for(i=0;ivalue[i]=extend; } strcpy(v->value+fill,vector); } else if(vlen==v->size) /* straight copy */ { strcpy(v->value,vector); } else /* too big, so copy only right half */ { int skip; skip=vlen-v->size; strcpy(v->value,vector+skip); } DEBUG(fprintf(stderr,"%s = '%s'\n",v->name, v->value)); if((v->size==1)||(!GLOBALS->atomic_vectors)) { int i; for(i=0;isize;i++) { add_histent(GLOBALS->current_time_vcd_c_1, v->narray[i],v->value[i],1, NULL); } free_2(vector); } else { if(GLOBALS->yylen_cache_vcd_c_1!=(v->size+1)) { free_2(vector); vector=malloc_2(v->size+1); } strcpy(vector,v->value); add_histent(GLOBALS->current_time_vcd_c_1, v->narray[0],0,1,vector); } } break; } case 'p': /* extract port dump value.. */ vector=malloc_2(GLOBALS->yylen_cache_vcd_c_1=GLOBALS->yylen_vcd_c_1); strcpy(vector,GLOBALS->yytext_vcd_c_1+1); vlen=GLOBALS->yylen_vcd_c_1-1; get_strtoken(); /* throw away 0_strength_component */ get_strtoken(); /* throw away 0_strength_component */ get_strtoken(); /* this is the id */ v=bsearch_vcd(GLOBALS->yytext_vcd_c_1, GLOBALS->yylen_vcd_c_1); if(!v) { fprintf(stderr,"Near byte %d, Unknown identifier: '%s'\n",(int)(GLOBALS->vcdbyteno_vcd_c_1+(GLOBALS->vst_vcd_c_1-GLOBALS->vcdbuf_vcd_c_1)), GLOBALS->yytext_vcd_c_1); free_2(vector); malform_eof_fix(); } else { if ((v->vartype==V_REAL)||(v->vartype==V_STRINGTYPE)||((GLOBALS->convert_to_reals)&&((v->vartype==V_INTEGER)||(v->vartype==V_PARAMETER)))) { double *d; char *pnt; char ch; TimeType k=0; pnt=vector; while((ch=*(pnt++))) { k=(k<<1)|((ch=='1')?1:0); } free_2(vector); d=malloc_2(sizeof(double)); *d=(double)k; if(!v) { fprintf(stderr,"Near byte %d, Unknown identifier: '%s'\n",(int)(GLOBALS->vcdbyteno_vcd_c_1+(GLOBALS->vst_vcd_c_1-GLOBALS->vcdbuf_vcd_c_1)), GLOBALS->yytext_vcd_c_1); free_2(d); malform_eof_fix(); } else { add_histent(GLOBALS->current_time_vcd_c_1, v->narray[0],'g',1,(char *)d); } break; } if(vlensize) /* fill in left part */ { char extend; int i, fill; extend='0'; fill=v->size-vlen; for(i=0;ivalue[i]=extend; } evcd_strcpy(v->value+fill,vector); } else if(vlen==v->size) /* straight copy */ { evcd_strcpy(v->value,vector); } else /* too big, so copy only right half */ { int skip; skip=vlen-v->size; evcd_strcpy(v->value,vector+skip); } DEBUG(fprintf(stderr,"%s = '%s'\n",v->name, v->value)); if((v->size==1)||(!GLOBALS->atomic_vectors)) { int i; for(i=0;isize;i++) { add_histent(GLOBALS->current_time_vcd_c_1, v->narray[i],v->value[i],1, NULL); } free_2(vector); } else { if(GLOBALS->yylen_cache_vcd_c_1size) { free_2(vector); vector=malloc_2(v->size+1); } strcpy(vector,v->value); add_histent(GLOBALS->current_time_vcd_c_1, v->narray[0],0,1,vector); } } break; case 'r': case 'R': { double *d; d=malloc_2(sizeof(double)); sscanf(GLOBALS->yytext_vcd_c_1+1,"%lg",d); get_strtoken(); v=bsearch_vcd(GLOBALS->yytext_vcd_c_1, GLOBALS->yylen_vcd_c_1); if(!v) { fprintf(stderr,"Near byte %d, Unknown identifier: '%s'\n",(int)(GLOBALS->vcdbyteno_vcd_c_1+(GLOBALS->vst_vcd_c_1-GLOBALS->vcdbuf_vcd_c_1)), GLOBALS->yytext_vcd_c_1); free_2(d); malform_eof_fix(); } else { add_histent(GLOBALS->current_time_vcd_c_1, v->narray[0],'g',1,(char *)d); } break; } #ifndef STRICT_VCD_ONLY case 's': case 'S': { char *d; d=(char *)malloc_2(GLOBALS->yylen_vcd_c_1); vlen = fstUtilityEscToBin((unsigned char *)d, (unsigned char *)(GLOBALS->yytext_vcd_c_1+1), GLOBALS->yylen_vcd_c_1); /* includes 0 term */ if(vlen != GLOBALS->yylen_vcd_c_1) { d = realloc_2(d, vlen); } get_strtoken(); v=bsearch_vcd(GLOBALS->yytext_vcd_c_1, GLOBALS->yylen_vcd_c_1); if(!v) { fprintf(stderr,"Near byte %d, Unknown identifier: '%s'\n",(int)(GLOBALS->vcdbyteno_vcd_c_1+(GLOBALS->vst_vcd_c_1-GLOBALS->vcdbuf_vcd_c_1)), GLOBALS->yytext_vcd_c_1); free_2(d); malform_eof_fix(); } else { add_histent(GLOBALS->current_time_vcd_c_1, v->narray[0],'s',1,(char *)d); } break; } #endif } } static void evcd_strcpy(char *dst, char *src) { static const char *evcd="DUNZduLHXTlh01?FAaBbCcf"; static const char *vcd="01xz0101xz0101xzxxxxxxz"; char ch; int i; while((ch=*src)) { for(i=0;i<23;i++) { if(evcd[i]==ch) { *dst=vcd[i]; break; } } if(i==23) *dst='x'; src++; dst++; } *dst=0; /* null terminate destination */ } static void vcd_parse(void) { int tok; unsigned char ttype; int disable_autocoalesce = 0; for(;;) { switch(get_token()) { case T_COMMENT: sync_end("COMMENT:"); break; case T_DATE: sync_end("DATE:"); break; case T_VERSION: disable_autocoalesce = version_sync_end("VERSION:"); break; case T_TIMEZERO: { int vtok=get_token(); if((vtok==T_END)||(vtok==T_EOF)) break; GLOBALS->global_time_offset=atoi_64(GLOBALS->yytext_vcd_c_1); DEBUG(fprintf(stderr,"TIMEZERO: "TTFormat"\n",GLOBALS->global_time_offset)); sync_end(NULL); } break; case T_TIMESCALE: { int vtok; int i; char prefix=' '; vtok=get_token(); if((vtok==T_END)||(vtok==T_EOF)) break; fractional_timescale_fix(GLOBALS->yytext_vcd_c_1); GLOBALS->time_scale=atoi_64(GLOBALS->yytext_vcd_c_1); if(!GLOBALS->time_scale) GLOBALS->time_scale=1; for(i=0;iyylen_vcd_c_1;i++) { if((GLOBALS->yytext_vcd_c_1[i]<'0')||(GLOBALS->yytext_vcd_c_1[i]>'9')) { prefix=GLOBALS->yytext_vcd_c_1[i]; break; } } if(prefix==' ') { vtok=get_token(); if((vtok==T_END)||(vtok==T_EOF)) break; prefix=GLOBALS->yytext_vcd_c_1[0]; } switch(prefix) { case ' ': case 'm': case 'u': case 'n': case 'p': case 'f': case 'a': case 'z': GLOBALS->time_dimension=prefix; break; case 's': GLOBALS->time_dimension=' '; break; default: /* unknown */ GLOBALS->time_dimension='n'; break; } DEBUG(fprintf(stderr,"TIMESCALE: "TTFormat" %cs\n",GLOBALS->time_scale, GLOBALS->time_dimension)); sync_end(NULL); } break; case T_SCOPE: T_GET; { switch(GLOBALS->yytext_vcd_c_1[0]) { case 'm': ttype = TREE_VCD_ST_MODULE; break; case 't': ttype = TREE_VCD_ST_TASK; break; case 'f': ttype = (GLOBALS->yytext_vcd_c_1[1] == 'u') ? TREE_VCD_ST_FUNCTION : TREE_VCD_ST_FORK; break; case 'b': ttype = TREE_VCD_ST_BEGIN; break; case 'g': ttype = TREE_VCD_ST_GENERATE; break; case 's': ttype = TREE_VCD_ST_STRUCT; break; case 'u': ttype = TREE_VCD_ST_UNION; break; case 'c': ttype = TREE_VCD_ST_CLASS; break; case 'i': ttype = TREE_VCD_ST_INTERFACE; break; case 'p': ttype = (GLOBALS->yytext_vcd_c_1[1] == 'r') ? TREE_VCD_ST_PROGRAM : TREE_VCD_ST_PACKAGE; break; case 'v': { char *vht = GLOBALS->yytext_vcd_c_1; if(!strncmp(vht, "vhdl_", 5)) { switch(vht[5]) { case 'a': ttype = TREE_VHDL_ST_ARCHITECTURE; break; case 'r': ttype = TREE_VHDL_ST_RECORD; break; case 'b': ttype = TREE_VHDL_ST_BLOCK; break; case 'g': ttype = TREE_VHDL_ST_GENERATE; break; case 'i': ttype = TREE_VHDL_ST_GENIF; break; case 'f': ttype = (vht[6] == 'u') ? TREE_VHDL_ST_FUNCTION : TREE_VHDL_ST_GENFOR; break; case 'p': ttype = (!strncmp(vht+6, "roces", 5)) ? TREE_VHDL_ST_PROCESS: TREE_VHDL_ST_PROCEDURE; break; default: ttype = TREE_UNKNOWN; break; } } else { ttype = TREE_UNKNOWN; } } break; default: ttype = TREE_UNKNOWN; break; } } T_GET; if(tok==T_STRING) { struct slist *s; s=(struct slist *)calloc_2(1,sizeof(struct slist)); s->len=GLOBALS->yylen_vcd_c_1; s->str=(char *)malloc_2(GLOBALS->yylen_vcd_c_1+1); strcpy(s->str, GLOBALS->yytext_vcd_c_1); s->mod_tree_parent = GLOBALS->mod_tree_parent; allocate_and_decorate_module_tree_node(ttype, GLOBALS->yytext_vcd_c_1, NULL, GLOBALS->yylen_vcd_c_1, 0, 0, 0); if(GLOBALS->slistcurr) { GLOBALS->slistcurr->next=s; GLOBALS->slistcurr=s; } else { GLOBALS->slistcurr=GLOBALS->slistroot=s; } build_slisthier(); DEBUG(fprintf(stderr, "SCOPE: %s\n",GLOBALS->slisthier)); } sync_end(NULL); break; case T_UPSCOPE: if(GLOBALS->slistroot) { struct slist *s; GLOBALS->mod_tree_parent = GLOBALS->slistcurr->mod_tree_parent; s=GLOBALS->slistroot; if(!s->next) { free_2(s->str); free_2(s); GLOBALS->slistroot=GLOBALS->slistcurr=NULL; } else for(;;) { if(!s->next->next) { free_2(s->next->str); free_2(s->next); s->next=NULL; GLOBALS->slistcurr=s; break; } s=s->next; } build_slisthier(); DEBUG(fprintf(stderr, "SCOPE: %s\n",GLOBALS->slisthier)); } else { GLOBALS->mod_tree_parent = NULL; } sync_end(NULL); break; case T_VAR: if((GLOBALS->header_over_vcd_c_1)&&(0)) { fprintf(stderr,"$VAR encountered after $ENDDEFINITIONS near byte %d. VCD is malformed, exiting.\n", (int)(GLOBALS->vcdbyteno_vcd_c_1+(GLOBALS->vst_vcd_c_1-GLOBALS->vcdbuf_vcd_c_1))); vcd_exit(255); } else { int vtok; struct vcdsymbol *v=NULL; GLOBALS->var_prevch_vcd_c_1=0; if(GLOBALS->varsplit_vcd_c_1) { free_2(GLOBALS->varsplit_vcd_c_1); GLOBALS->varsplit_vcd_c_1=NULL; } vtok=get_vartoken(1); if(vtok>V_STRINGTYPE) goto bail; v=(struct vcdsymbol *)calloc_2(1,sizeof(struct vcdsymbol)); v->vartype=vtok; v->msi=v->lsi=GLOBALS->vcd_explicit_zero_subscripts; /* indicate [un]subscripted status */ if(vtok==V_PORT) { vtok=get_vartoken(1); if(vtok==V_STRING) { v->size=atoi_64(GLOBALS->yytext_vcd_c_1); if(!v->size) v->size=1; } else if(vtok==V_LB) { vtok=get_vartoken(1); if(vtok==V_END) goto err; if(vtok!=V_STRING) goto err; v->msi=atoi_64(GLOBALS->yytext_vcd_c_1); vtok=get_vartoken(0); if(vtok==V_RB) { v->lsi=v->msi; v->size=1; } else { if(vtok!=V_COLON) goto err; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; v->lsi=atoi_64(GLOBALS->yytext_vcd_c_1); vtok=get_vartoken(0); if(vtok!=V_RB) goto err; if(v->msi>v->lsi) { v->size=v->msi-v->lsi+1; } else { v->size=v->lsi-v->msi+1; } } } else goto err; vtok=get_strtoken(); if(vtok==V_END) goto err; v->id=(char *)malloc_2(GLOBALS->yylen_vcd_c_1+1); strcpy(v->id, GLOBALS->yytext_vcd_c_1); v->nid=vcdid_hash(GLOBALS->yytext_vcd_c_1,GLOBALS->yylen_vcd_c_1); if(v->nid == (GLOBALS->vcd_hash_max+1)) { GLOBALS->vcd_hash_max = v->nid; } else if((v->nid>0)&&(v->nid<=GLOBALS->vcd_hash_max)) { /* general case with aliases */ } else { GLOBALS->vcd_hash_kill = 1; } if(v->nid < GLOBALS->vcd_minid_vcd_c_1) GLOBALS->vcd_minid_vcd_c_1 = v->nid; if(v->nid > GLOBALS->vcd_maxid_vcd_c_1) GLOBALS->vcd_maxid_vcd_c_1 = v->nid; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; if(GLOBALS->slisthier_len) { v->name=(char *)malloc_2(GLOBALS->slisthier_len+1+GLOBALS->yylen_vcd_c_1+1); strcpy(v->name,GLOBALS->slisthier); strcpy(v->name+GLOBALS->slisthier_len,GLOBALS->vcd_hier_delimeter); if(GLOBALS->alt_hier_delimeter) { strcpy_vcdalt(v->name+GLOBALS->slisthier_len+1,GLOBALS->yytext_vcd_c_1,GLOBALS->alt_hier_delimeter); } else { if((strcpy_delimfix(v->name+GLOBALS->slisthier_len+1,GLOBALS->yytext_vcd_c_1)) && (GLOBALS->yytext_vcd_c_1[0] != '\\')) { char *sd=(char *)malloc_2(GLOBALS->slisthier_len+1+GLOBALS->yylen_vcd_c_1+2); strcpy(sd,GLOBALS->slisthier); strcpy(sd+GLOBALS->slisthier_len,GLOBALS->vcd_hier_delimeter); sd[GLOBALS->slisthier_len+1] = '\\'; strcpy(sd+GLOBALS->slisthier_len+2,v->name+GLOBALS->slisthier_len+1); free_2(v->name); v->name = sd; } } } else { v->name=(char *)malloc_2(GLOBALS->yylen_vcd_c_1+1); if(GLOBALS->alt_hier_delimeter) { strcpy_vcdalt(v->name,GLOBALS->yytext_vcd_c_1,GLOBALS->alt_hier_delimeter); } else { if((strcpy_delimfix(v->name,GLOBALS->yytext_vcd_c_1)) && (GLOBALS->yytext_vcd_c_1[0] != '\\')) { char *sd=(char *)malloc_2(GLOBALS->yylen_vcd_c_1+2); sd[0] = '\\'; strcpy(sd+1,v->name); free_2(v->name); v->name = sd; } } } if(GLOBALS->pv_vcd_c_1) { if(!strcmp(GLOBALS->pv_vcd_c_1->name,v->name) && !disable_autocoalesce && (!strchr(v->name, '\\'))) { GLOBALS->pv_vcd_c_1->chain=v; v->root=GLOBALS->rootv_vcd_c_1; if(GLOBALS->pv_vcd_c_1==GLOBALS->rootv_vcd_c_1) GLOBALS->pv_vcd_c_1->root=GLOBALS->rootv_vcd_c_1; } else { GLOBALS->rootv_vcd_c_1=v; } } else { GLOBALS->rootv_vcd_c_1=v; } GLOBALS->pv_vcd_c_1=v; } else /* regular vcd var, not an evcd port var */ { vtok=get_vartoken(1); if(vtok==V_END) goto err; v->size=atoi_64(GLOBALS->yytext_vcd_c_1); vtok=get_strtoken(); if(vtok==V_END) goto err; v->id=(char *)malloc_2(GLOBALS->yylen_vcd_c_1+1); strcpy(v->id, GLOBALS->yytext_vcd_c_1); v->nid=vcdid_hash(GLOBALS->yytext_vcd_c_1,GLOBALS->yylen_vcd_c_1); if(v->nid == (GLOBALS->vcd_hash_max+1)) { GLOBALS->vcd_hash_max = v->nid; } else if((v->nid>0)&&(v->nid<=GLOBALS->vcd_hash_max)) { /* general case with aliases */ } else { GLOBALS->vcd_hash_kill = 1; } if(v->nid < GLOBALS->vcd_minid_vcd_c_1) GLOBALS->vcd_minid_vcd_c_1 = v->nid; if(v->nid > GLOBALS->vcd_maxid_vcd_c_1) GLOBALS->vcd_maxid_vcd_c_1 = v->nid; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; if(GLOBALS->slisthier_len) { v->name=(char *)malloc_2(GLOBALS->slisthier_len+1+GLOBALS->yylen_vcd_c_1+1); strcpy(v->name,GLOBALS->slisthier); strcpy(v->name+GLOBALS->slisthier_len,GLOBALS->vcd_hier_delimeter); if(GLOBALS->alt_hier_delimeter) { strcpy_vcdalt(v->name+GLOBALS->slisthier_len+1,GLOBALS->yytext_vcd_c_1,GLOBALS->alt_hier_delimeter); } else { if((strcpy_delimfix(v->name+GLOBALS->slisthier_len+1,GLOBALS->yytext_vcd_c_1)) && (GLOBALS->yytext_vcd_c_1[0] != '\\')) { char *sd=(char *)malloc_2(GLOBALS->slisthier_len+1+GLOBALS->yylen_vcd_c_1+2); strcpy(sd,GLOBALS->slisthier); strcpy(sd+GLOBALS->slisthier_len,GLOBALS->vcd_hier_delimeter); sd[GLOBALS->slisthier_len+1] = '\\'; strcpy(sd+GLOBALS->slisthier_len+2,v->name+GLOBALS->slisthier_len+1); free_2(v->name); v->name = sd; } } } else { v->name=(char *)malloc_2(GLOBALS->yylen_vcd_c_1+1); if(GLOBALS->alt_hier_delimeter) { strcpy_vcdalt(v->name,GLOBALS->yytext_vcd_c_1,GLOBALS->alt_hier_delimeter); } else { if((strcpy_delimfix(v->name,GLOBALS->yytext_vcd_c_1)) && (GLOBALS->yytext_vcd_c_1[0] != '\\')) { char *sd=(char *)malloc_2(GLOBALS->yylen_vcd_c_1+2); sd[0] = '\\'; strcpy(sd+1,v->name); free_2(v->name); v->name = sd; } } } if(GLOBALS->pv_vcd_c_1) { if(!strcmp(GLOBALS->pv_vcd_c_1->name,v->name)) { GLOBALS->pv_vcd_c_1->chain=v; v->root=GLOBALS->rootv_vcd_c_1; if(GLOBALS->pv_vcd_c_1==GLOBALS->rootv_vcd_c_1) GLOBALS->pv_vcd_c_1->root=GLOBALS->rootv_vcd_c_1; } else { GLOBALS->rootv_vcd_c_1=v; } } else { GLOBALS->rootv_vcd_c_1=v; } GLOBALS->pv_vcd_c_1=v; vtok=get_vartoken(1); if(vtok==V_END) goto dumpv; if(vtok!=V_LB) goto err; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; v->msi=atoi_64(GLOBALS->yytext_vcd_c_1); vtok=get_vartoken(0); if(vtok==V_RB) { v->lsi=v->msi; goto dumpv; } if(vtok!=V_COLON) goto err; vtok=get_vartoken(0); if(vtok!=V_STRING) goto err; v->lsi=atoi_64(GLOBALS->yytext_vcd_c_1); vtok=get_vartoken(0); if(vtok!=V_RB) goto err; } dumpv: if(v->size == 0) { if(v->vartype != V_EVENT) { if(v->vartype != V_STRINGTYPE) { v->vartype = V_REAL; } } else { v->size = 1; } } /* MTI fix */ if((v->vartype==V_REAL)||(v->vartype==V_STRINGTYPE)||((GLOBALS->convert_to_reals)&&((v->vartype==V_INTEGER)||(v->vartype==V_PARAMETER)))) { if(v->vartype!=V_STRINGTYPE) { v->vartype=V_REAL; } v->size=1; /* override any data we parsed in */ v->msi=v->lsi=0; } else if((v->size>1)&&(v->msi<=0)&&(v->lsi<=0)) { if(v->vartype==V_EVENT) { v->size=1; } else { /* any criteria for the direction here? */ v->msi=v->size-1; v->lsi=0; } } else if((v->msi>v->lsi)&&((v->msi-v->lsi+1)!=v->size)) { if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) { if((v->msi-v->lsi+1) > v->size) /* if() is 2d add */ { v->msi = v->size-1; v->lsi = 0; } /* all this formerly was goto err; */ } else { v->size=v->msi-v->lsi+1; } } else if((v->lsi>=v->msi)&&((v->lsi-v->msi+1)!=v->size)) { if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) { if((v->lsi-v->msi+1) > v->size) /* if() is 2d add */ { v->lsi = v->size-1; v->msi = 0; } /* all this formerly was goto err; */ } else { v->size=v->lsi-v->msi+1; } } /* initial conditions */ v->value=(char *)malloc_2(v->size+1); v->value[v->size]=0; v->narray=(struct Node **)calloc_2(v->size,sizeof(struct Node *)); { int i; if(GLOBALS->atomic_vectors) { for(i=0;isize;i++) { v->value[i]='x'; } v->narray[0]=(struct Node *)calloc_2(1,sizeof(struct Node)); v->narray[0]->head.time=-1; v->narray[0]->head.v.h_val=AN_X; set_vcd_vartype(v, v->narray[0]); } else { for(i=0;isize;i++) { v->value[i]='x'; v->narray[i]=(struct Node *)calloc_2(1,sizeof(struct Node)); v->narray[i]->head.time=-1; v->narray[i]->head.v.h_val=AN_X; if(i == 0) { set_vcd_vartype(v, v->narray[0]); } else { v->narray[i]->vartype = v->narray[0]->vartype; } } } } if(!GLOBALS->vcdsymroot_vcd_c_1) { GLOBALS->vcdsymroot_vcd_c_1=GLOBALS->vcdsymcurr_vcd_c_1=v; } else { GLOBALS->vcdsymcurr_vcd_c_1->next=v; GLOBALS->vcdsymcurr_vcd_c_1=v; } GLOBALS->numsyms_vcd_c_1++; if(GLOBALS->vcd_save_handle) { if(v->msi==v->lsi) { if((v->vartype==V_REAL)||(v->vartype==V_STRINGTYPE)) { fprintf(GLOBALS->vcd_save_handle,"%s\n",v->name); } else { if(v->msi>=0) { if(!GLOBALS->vcd_explicit_zero_subscripts) fprintf(GLOBALS->vcd_save_handle,"%s%c%d\n",v->name,GLOBALS->hier_delimeter,v->msi); else fprintf(GLOBALS->vcd_save_handle,"%s[%d]\n",v->name,v->msi); } else { fprintf(GLOBALS->vcd_save_handle,"%s\n",v->name); } } } else { int i; if(!GLOBALS->atomic_vectors) { fprintf(GLOBALS->vcd_save_handle,"#%s[%d:%d]",v->name,v->msi,v->lsi); if(v->msi>v->lsi) { for(i=v->msi;i>=v->lsi;i--) { if(!GLOBALS->vcd_explicit_zero_subscripts) fprintf(GLOBALS->vcd_save_handle," %s%c%d",v->name,GLOBALS->hier_delimeter,i); else fprintf(GLOBALS->vcd_save_handle," %s[%d]",v->name,i); } } else { for(i=v->msi;i<=v->lsi;i++) { if(!GLOBALS->vcd_explicit_zero_subscripts) fprintf(GLOBALS->vcd_save_handle," %s%c%d",v->name,GLOBALS->hier_delimeter,i); else fprintf(GLOBALS->vcd_save_handle," %s[%d]",v->name,i); } } fprintf(GLOBALS->vcd_save_handle,"\n"); } else { fprintf(GLOBALS->vcd_save_handle,"%s[%d:%d]\n",v->name,v->msi,v->lsi); } } } goto bail; err: if(v) { GLOBALS->error_count_vcd_c_1++; if(v->name) { fprintf(stderr, "Near byte %d, $VAR parse error encountered with '%s'\n", (int)(GLOBALS->vcdbyteno_vcd_c_1+(GLOBALS->vst_vcd_c_1-GLOBALS->vcdbuf_vcd_c_1)), v->name); free_2(v->name); } else { fprintf(stderr, "Near byte %d, $VAR parse error encountered\n", (int)(GLOBALS->vcdbyteno_vcd_c_1+(GLOBALS->vst_vcd_c_1-GLOBALS->vcdbuf_vcd_c_1))); } if(v->id) free_2(v->id); if(v->value) free_2(v->value); free_2(v); GLOBALS->pv_vcd_c_1 = NULL; } bail: if(vtok!=V_END) sync_end(NULL); break; } case T_ENDDEFINITIONS: GLOBALS->header_over_vcd_c_1=1; /* do symbol table management here */ create_sorted_table(); if((!GLOBALS->sorted_vcd_c_1)&&(!GLOBALS->indexed_vcd_c_1)) { fprintf(stderr, "No symbols in VCD file..nothing to do!\n"); vcd_exit(255); } if(GLOBALS->error_count_vcd_c_1) { fprintf(stderr, "\n%d VCD parse errors encountered, exiting.\n", GLOBALS->error_count_vcd_c_1); vcd_exit(255); } break; case T_STRING: if(!GLOBALS->header_over_vcd_c_1) { GLOBALS->header_over_vcd_c_1=1; /* do symbol table management here */ create_sorted_table(); if((!GLOBALS->sorted_vcd_c_1)&&(!GLOBALS->indexed_vcd_c_1)) break; } { /* catchall for events when header over */ if(GLOBALS->yytext_vcd_c_1[0]=='#') { TimeType tim; tim=atoi_64(GLOBALS->yytext_vcd_c_1+1); if(GLOBALS->start_time_vcd_c_1<0) { GLOBALS->start_time_vcd_c_1=tim; } else { if(tim < GLOBALS->current_time_vcd_c_1) /* avoid backtracking time counts which can happen on malformed files */ { tim = GLOBALS->current_time_vcd_c_1; } } GLOBALS->current_time_vcd_c_1=tim; if(GLOBALS->end_time_vcd_c_1end_time_vcd_c_1=tim; /* in case of malformed vcd files */ DEBUG(fprintf(stderr,"#"TTFormat"\n",tim)); } else { parse_valuechange(); } } break; case T_DUMPALL: /* dump commands modify vals anyway so */ case T_DUMPPORTSALL: break; /* just loop through.. */ case T_DUMPOFF: case T_DUMPPORTSOFF: GLOBALS->dumping_off_vcd_c_1=1; /* if((!GLOBALS->blackout_regions)||((GLOBALS->blackout_regions)&&(GLOBALS->blackout_regions->bstart<=GLOBALS->blackout_regions->bend))) : remove redundant condition */ if((!GLOBALS->blackout_regions)||(GLOBALS->blackout_regions->bstart<=GLOBALS->blackout_regions->bend)) { struct blackout_region_t *bt = calloc_2(1, sizeof(struct blackout_region_t)); bt->bstart = GLOBALS->current_time_vcd_c_1; bt->next = GLOBALS->blackout_regions; GLOBALS->blackout_regions = bt; } break; case T_DUMPON: case T_DUMPPORTSON: GLOBALS->dumping_off_vcd_c_1=0; if((GLOBALS->blackout_regions)&&(GLOBALS->blackout_regions->bstart>GLOBALS->blackout_regions->bend)) { GLOBALS->blackout_regions->bend = GLOBALS->current_time_vcd_c_1; } break; case T_DUMPVARS: case T_DUMPPORTS: if(GLOBALS->current_time_vcd_c_1<0) { GLOBALS->start_time_vcd_c_1=GLOBALS->current_time_vcd_c_1=GLOBALS->end_time_vcd_c_1=0; } break; case T_VCDCLOSE: sync_end("VCDCLOSE:"); break; /* next token will be '#' time related followed by $end */ case T_END: /* either closure for dump commands or */ break; /* it's spurious */ case T_UNKNOWN_KEY: sync_end(NULL); /* skip over unknown keywords */ break; case T_EOF: if((GLOBALS->blackout_regions)&&(GLOBALS->blackout_regions->bstart>GLOBALS->blackout_regions->bend)) { GLOBALS->blackout_regions->bend = GLOBALS->current_time_vcd_c_1; } return; default: DEBUG(fprintf(stderr,"UNKNOWN TOKEN\n")); } } } /*******************************************************************************/ void add_histent(TimeType tim, struct Node *n, char ch, int regadd, char *vector) { struct HistEnt *he; char heval; if(!vector) { if(!n->curr) { he=histent_calloc(); he->time=-1; he->v.h_val=AN_X; n->curr=he; n->head.next=he; add_histent(tim,n,ch,regadd, vector); } else { if(regadd) { tim*=(GLOBALS->time_scale); } if(ch=='0') heval=AN_0; else if(ch=='1') heval=AN_1; else if((ch=='x')||(ch=='X')) heval=AN_X; else if((ch=='z')||(ch=='Z')) heval=AN_Z; else if((ch=='h')||(ch=='H')) heval=AN_H; else if((ch=='u')||(ch=='U')) heval=AN_U; else if((ch=='w')||(ch=='W')) heval=AN_W; else if((ch=='l')||(ch=='L')) heval=AN_L; else /* if(ch=='-') */ heval=AN_DASH; /* default */ if((n->curr->v.h_val!=heval)||(tim==GLOBALS->start_time_vcd_c_1)||(n->vartype==ND_VCD_EVENT)||(GLOBALS->vcd_preserve_glitches)) /* same region == go skip */ { if(n->curr->time==tim) { DEBUG(printf("Warning: Glitch at time ["TTFormat"] Signal [%p], Value [%c->%c].\n", tim, n, AN_STR[n->curr->v.h_val], ch)); n->curr->v.h_val=heval; /* we have a glitch! */ GLOBALS->num_glitches_vcd_c_2++; if(!(n->curr->flags&HIST_GLITCH)) { n->curr->flags|=HIST_GLITCH; /* set the glitch flag */ GLOBALS->num_glitch_regions_vcd_c_2++; } } else { he=histent_calloc(); he->time=tim; he->v.h_val=heval; n->curr->next=he; n->curr=he; GLOBALS->regions+=regadd; } } } } else { switch(ch) { case 's': /* string */ { if(!n->curr) { he=histent_calloc(); he->flags=(HIST_STRING|HIST_REAL); he->time=-1; he->v.h_vector=NULL; n->curr=he; n->head.next=he; add_histent(tim,n,ch,regadd, vector); } else { if(regadd) { tim*=(GLOBALS->time_scale); } if(n->curr->time==tim) { DEBUG(printf("Warning: String Glitch at time ["TTFormat"] Signal [%p].\n", tim, n)); if(n->curr->v.h_vector) free_2(n->curr->v.h_vector); n->curr->v.h_vector=vector; /* we have a glitch! */ GLOBALS->num_glitches_vcd_c_2++; if(!(n->curr->flags&HIST_GLITCH)) { n->curr->flags|=HIST_GLITCH; /* set the glitch flag */ GLOBALS->num_glitch_regions_vcd_c_2++; } } else { he=histent_calloc(); he->flags=(HIST_STRING|HIST_REAL); he->time=tim; he->v.h_vector=vector; n->curr->next=he; n->curr=he; GLOBALS->regions+=regadd; } } break; } case 'g': /* real number */ { if(!n->curr) { he=histent_calloc(); he->flags=HIST_REAL; he->time=-1; #ifdef WAVE_HAS_H_DOUBLE he->v.h_double = strtod("NaN", NULL); #else he->v.h_vector=NULL; #endif n->curr=he; n->head.next=he; add_histent(tim,n,ch,regadd, vector); } else { if(regadd) { tim*=(GLOBALS->time_scale); } if( #ifdef WAVE_HAS_H_DOUBLE (vector&&(n->curr->v.h_double!=*(double *)vector)) #else (n->curr->v.h_vector&&vector&&(*(double *)n->curr->v.h_vector!=*(double *)vector)) #endif ||(tim==GLOBALS->start_time_vcd_c_1) #ifndef WAVE_HAS_H_DOUBLE ||(!n->curr->v.h_vector) #endif ||(GLOBALS->vcd_preserve_glitches)||(GLOBALS->vcd_preserve_glitches_real) ) /* same region == go skip */ { if(n->curr->time==tim) { DEBUG(printf("Warning: Real number Glitch at time ["TTFormat"] Signal [%p].\n", tim, n)); #ifdef WAVE_HAS_H_DOUBLE n->curr->v.h_double = *((double *)vector); #else if(n->curr->v.h_vector) free_2(n->curr->v.h_vector); n->curr->v.h_vector=vector; /* we have a glitch! */ #endif GLOBALS->num_glitches_vcd_c_2++; if(!(n->curr->flags&HIST_GLITCH)) { n->curr->flags|=HIST_GLITCH; /* set the glitch flag */ GLOBALS->num_glitch_regions_vcd_c_2++; } } else { he=histent_calloc(); he->flags=HIST_REAL; he->time=tim; #ifdef WAVE_HAS_H_DOUBLE he->v.h_double = *((double *)vector); #else he->v.h_vector=vector; #endif n->curr->next=he; n->curr=he; GLOBALS->regions+=regadd; } } else { #ifndef WAVE_HAS_H_DOUBLE free_2(vector); #endif } #ifdef WAVE_HAS_H_DOUBLE free_2(vector); #endif } break; } default: { if(!n->curr) { he=histent_calloc(); he->time=-1; he->v.h_vector=NULL; n->curr=he; n->head.next=he; add_histent(tim,n,ch,regadd, vector); } else { if(regadd) { tim*=(GLOBALS->time_scale); } if( (n->curr->v.h_vector&&vector&&(strcmp(n->curr->v.h_vector,vector))) ||(tim==GLOBALS->start_time_vcd_c_1) ||(!n->curr->v.h_vector) ||(GLOBALS->vcd_preserve_glitches) ) /* same region == go skip */ { if(n->curr->time==tim) { DEBUG(printf("Warning: Glitch at time ["TTFormat"] Signal [%p], Value [%c->%c].\n", tim, n, AN_STR[n->curr->v.h_val], ch)); if(n->curr->v.h_vector) free_2(n->curr->v.h_vector); n->curr->v.h_vector=vector; /* we have a glitch! */ GLOBALS->num_glitches_vcd_c_2++; if(!(n->curr->flags&HIST_GLITCH)) { n->curr->flags|=HIST_GLITCH; /* set the glitch flag */ GLOBALS->num_glitch_regions_vcd_c_2++; } } else { he=histent_calloc(); he->time=tim; he->v.h_vector=vector; n->curr->next=he; n->curr=he; GLOBALS->regions+=regadd; } } else { free_2(vector); } } break; } } } } void set_vcd_vartype(struct vcdsymbol *v, nptr n) { unsigned char nvt; switch(v->vartype) { case V_EVENT: nvt = ND_VCD_EVENT; break; case V_PARAMETER: nvt = ND_VCD_PARAMETER; break; case V_INTEGER: nvt = ND_VCD_INTEGER; break; case V_REAL: nvt = ND_VCD_REAL; break; case V_REG: nvt = ND_VCD_REG; break; case V_SUPPLY0: nvt = ND_VCD_SUPPLY0; break; case V_SUPPLY1: nvt = ND_VCD_SUPPLY1; break; case V_TIME: nvt = ND_VCD_TIME; break; case V_TRI: nvt = ND_VCD_TRI; break; case V_TRIAND: nvt = ND_VCD_TRIAND; break; case V_TRIOR: nvt = ND_VCD_TRIOR; break; case V_TRIREG: nvt = ND_VCD_TRIREG; break; case V_TRI0: nvt = ND_VCD_TRI0; break; case V_TRI1: nvt = ND_VCD_TRI1; break; case V_WAND: nvt = ND_VCD_WAND; break; case V_WIRE: nvt = ND_VCD_WIRE; break; case V_WOR: nvt = ND_VCD_WOR; break; case V_PORT: nvt = ND_VCD_PORT; break; case V_STRINGTYPE: nvt = ND_GEN_STRING; break; case V_BIT: nvt = ND_SV_BIT; break; case V_LOGIC: nvt = ND_SV_LOGIC; break; case V_INT: nvt = ND_SV_INT; break; case V_SHORTINT: nvt = ND_SV_SHORTINT; break; case V_LONGINT: nvt = ND_SV_LONGINT; break; case V_BYTE: nvt = ND_SV_BYTE; break; case V_ENUM: nvt = ND_SV_ENUM; break; /* V_SHORTREAL as a type does not exist for VCD: is cast to V_REAL */ default: nvt = ND_UNSPECIFIED_DEFAULT; break; } n->vartype = nvt; } static void add_tail_histents(void) { int j; struct vcdsymbol *v; /* dump out any pending events 1st (removed) */ /* then do 'x' trailers */ v=GLOBALS->vcdsymroot_vcd_c_1; while(v) { if((v->vartype==V_REAL)||(v->vartype==V_STRINGTYPE)) { double *d; d=malloc_2(sizeof(double)); *d=1.0; add_histent(MAX_HISTENT_TIME-1, v->narray[0], 'g', 0, (char *)d); } else if((v->size==1)||(!GLOBALS->atomic_vectors)) for(j=0;jsize;j++) { add_histent(MAX_HISTENT_TIME-1, v->narray[j], 'x', 0, NULL); } else { add_histent(MAX_HISTENT_TIME-1, v->narray[0], 'x', 0, (char *)calloc_2(1,sizeof(char))); } v=v->next; } v=GLOBALS->vcdsymroot_vcd_c_1; while(v) { if((v->vartype==V_REAL)||(v->vartype==V_STRINGTYPE)) { double *d; d=malloc_2(sizeof(double)); *d=0.0; add_histent(MAX_HISTENT_TIME, v->narray[0], 'g', 0, (char *)d); } else if((v->size==1)||(!GLOBALS->atomic_vectors)) for(j=0;jsize;j++) { add_histent(MAX_HISTENT_TIME, v->narray[j], 'z', 0, NULL); } else { add_histent(MAX_HISTENT_TIME, v->narray[0], 'z', 0, (char *)calloc_2(1,sizeof(char))); } v=v->next; } } /*******************************************************************************/ static void vcd_build_symbols(void) { int j; int max_slen=-1; struct sym_chain *sym_chain=NULL, *sym_curr=NULL; int duphier=0; char hashdirty; struct vcdsymbol *v, *vprime; char *str = wave_alloca(1); /* quiet scan-build null pointer warning below */ #ifdef _WAVE_HAVE_JUDY int ss_len, longest = 0; #endif v=GLOBALS->vcdsymroot_vcd_c_1; while(v) { int msi; int delta; { int slen; int substnode; msi=v->msi; delta=((v->lsi-v->msi)<0)?-1:1; substnode=0; slen=strlen(v->name); str=(slen>max_slen)?(wave_alloca((max_slen=slen)+32)):(str); /* more than enough */ strcpy(str,v->name); if(v->msi>=0) { strcpy(str+slen,GLOBALS->vcd_hier_delimeter); slen++; } if((vprime=bsearch_vcd(v->id, strlen(v->id)))!=v) /* hash mish means dup net */ { if(v->size!=vprime->size) { fprintf(stderr,"ERROR: Duplicate IDs with differing width: %s %s\n", v->name, vprime->name); } else { substnode=1; } } if(((v->size==1)||(!GLOBALS->atomic_vectors))&&(v->vartype!=V_REAL)&&(v->vartype!=V_STRINGTYPE)) { struct symbol *s = NULL; for(j=0;jsize;j++) { if(v->msi>=0) { if(!GLOBALS->vcd_explicit_zero_subscripts) sprintf(str+slen,"%d",msi); else sprintf(str+slen-1,"[%d]",msi); } hashdirty=0; if(symfind(str, NULL)) { char *dupfix=(char *)malloc_2(max_slen+32); #ifndef _WAVE_HAVE_JUDY hashdirty=1; #endif DEBUG(fprintf(stderr,"Warning: %s is a duplicate net name.\n",str)); do sprintf(dupfix, "$DUP%d%s%s", duphier++, GLOBALS->vcd_hier_delimeter, str); while(symfind(dupfix, NULL)); strcpy(str, dupfix); free_2(dupfix); duphier=0; /* reset for next duplicate resolution */ } /* fallthrough */ { s=symadd(str,hashdirty?hash(str):GLOBALS->hashcache); #ifdef _WAVE_HAVE_JUDY ss_len = strlen(str); if(ss_len >= longest) { longest = ss_len + 1; } #endif s->n=v->narray[j]; if(substnode) { struct Node *n, *n2; n=s->n; n2=vprime->narray[j]; /* nname stays same */ n->head=n2->head; n->curr=n2->curr; /* harray calculated later */ n->numhist=n2->numhist; } #ifndef _WAVE_HAVE_JUDY s->n->nname=s->name; #endif if(!GLOBALS->firstnode) { GLOBALS->firstnode= GLOBALS->curnode=calloc_2(1, sizeof(struct symchain)); } else { GLOBALS->curnode->next=calloc_2(1, sizeof(struct symchain)); GLOBALS->curnode=GLOBALS->curnode->next; } GLOBALS->curnode->symbol=s; GLOBALS->numfacs++; DEBUG(fprintf(stderr,"Added: %s\n",str)); } msi+=delta; } if((j==1)&&(v->root)) { s->vec_root=(struct symbol *)v->root; /* these will get patched over */ s->vec_chain=(struct symbol *)v->chain; /* these will get patched over */ v->sym_chain=s; if(!sym_chain) { sym_curr=(struct sym_chain *)calloc_2(1,sizeof(struct sym_chain)); sym_chain=sym_curr; } else { sym_curr->next=(struct sym_chain *)calloc_2(1,sizeof(struct sym_chain)); sym_curr=sym_curr->next; } sym_curr->val=s; } } else /* atomic vector */ { if((v->vartype!=V_REAL)&&(v->vartype!=V_STRINGTYPE)&&(v->vartype!=V_INTEGER)&&(v->vartype!=V_PARAMETER)) /* if((v->vartype!=V_REAL)&&(v->vartype!=V_STRINGTYPE)) */ { sprintf(str+slen-1,"[%d:%d]",v->msi,v->lsi); /* 2d add */ if((v->msi>v->lsi)&&((v->msi-v->lsi+1)!=v->size)) { if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) { v->msi = v->size-1; v->lsi = 0; } } else if((v->lsi>=v->msi)&&((v->lsi-v->msi+1)!=v->size)) { if((v->vartype!=V_EVENT)&&(v->vartype!=V_PARAMETER)) { v->lsi = v->size-1; v->msi = 0; } } } else { *(str+slen-1)=0; } hashdirty=0; if(symfind(str, NULL)) { char *dupfix=(char *)malloc_2(max_slen+32); #ifndef _WAVE_HAVE_JUDY hashdirty=1; #endif DEBUG(fprintf(stderr,"Warning: %s is a duplicate net name.\n",str)); do sprintf(dupfix, "$DUP%d%s%s", duphier++, GLOBALS->vcd_hier_delimeter, str); while(symfind(dupfix, NULL)); strcpy(str, dupfix); free_2(dupfix); duphier=0; /* reset for next duplicate resolution */ } /* fallthrough */ { struct symbol *s; s=symadd(str,hashdirty?hash(str):GLOBALS->hashcache); /* cut down on double lookups.. */ #ifdef _WAVE_HAVE_JUDY ss_len = strlen(str); if(ss_len >= longest) { longest = ss_len + 1; } #endif s->n=v->narray[0]; if(substnode) { struct Node *n, *n2; n=s->n; n2=vprime->narray[0]; /* nname stays same */ n->head=n2->head; n->curr=n2->curr; /* harray calculated later */ n->numhist=n2->numhist; n->extvals=n2->extvals; n->msi=n2->msi; n->lsi=n2->lsi; } else { s->n->msi=v->msi; s->n->lsi=v->lsi; s->n->extvals=1; } #ifndef _WAVE_HAVE_JUDY s->n->nname=s->name; #endif if(!GLOBALS->firstnode) { GLOBALS->firstnode= GLOBALS->curnode=calloc_2(1, sizeof(struct symchain)); } else { GLOBALS->curnode->next=calloc_2(1, sizeof(struct symchain)); GLOBALS->curnode=GLOBALS->curnode->next; } GLOBALS->curnode->symbol=s; GLOBALS->numfacs++; DEBUG(fprintf(stderr,"Added: %s\n",str)); } } } v=v->next; } #ifdef _WAVE_HAVE_JUDY { Pvoid_t PJArray = GLOBALS->sym_judy; PPvoid_t PPValue; char *Index = calloc_2(1, longest); for (PPValue = JudySLFirst (PJArray, (uint8_t *)Index, PJE0); PPValue != (PPvoid_t) NULL; PPValue = JudySLNext (PJArray, (uint8_t *)Index, PJE0)) { struct symbol *s = *(struct symbol **)PPValue; s->name = strdup_2(Index); s->n->nname = s->name; } free_2(Index); } #endif if(sym_chain) { sym_curr=sym_chain; while(sym_curr) { sym_curr->val->vec_root= ((struct vcdsymbol *)sym_curr->val->vec_root)->sym_chain; if ((struct vcdsymbol *)sym_curr->val->vec_chain) sym_curr->val->vec_chain=((struct vcdsymbol *)sym_curr->val->vec_chain)->sym_chain; DEBUG(printf("Link: ('%s') '%s' -> '%s'\n",sym_curr->val->vec_root->name, sym_curr->val->name, sym_curr->val->vec_chain?sym_curr->val->vec_chain->name:"(END)")); sym_chain=sym_curr; sym_curr=sym_curr->next; free_2(sym_chain); } } } /*******************************************************************************/ void vcd_sortfacs(void) { int i; GLOBALS->facs=(struct symbol **)malloc_2(GLOBALS->numfacs*sizeof(struct symbol *)); GLOBALS->curnode=GLOBALS->firstnode; for(i=0;inumfacs;i++) { char *subst; #ifdef WAVE_HIERFIX char ch; #endif int len; struct symchain *sc; GLOBALS->facs[i]=GLOBALS->curnode->symbol; subst=GLOBALS->facs[i]->name; if((len=strlen(subst))>GLOBALS->longestname) GLOBALS->longestname=len; sc = GLOBALS->curnode; GLOBALS->curnode=GLOBALS->curnode->next; free_2(sc); #ifdef WAVE_HIERFIX while((ch=(*subst))) { if(ch==GLOBALS->hier_delimeter) { *subst=VCDNAM_HIERSORT; } /* forces sort at hier boundaries */ subst++; } #endif } GLOBALS->firstnode=GLOBALS->curnode=NULL; /* quicksort(facs,0,numfacs-1); */ /* quicksort deprecated because it degenerates on sorted traces..badly. very badly. */ wave_heapsort(GLOBALS->facs,GLOBALS->numfacs); #ifdef WAVE_HIERFIX for(i=0;inumfacs;i++) { char *subst, ch; subst=GLOBALS->facs[i]->name; while((ch=(*subst))) { if(ch==VCDNAM_HIERSORT) { *subst=GLOBALS->hier_delimeter; } /* restore back to normal */ subst++; } #ifdef DEBUG_FACILITIES printf("%-4d %s\n",i,facs[i]->name); #endif } #endif GLOBALS->facs_are_sorted=1; init_tree(); for(i=0;inumfacs;i++) { char *n = GLOBALS->facs[i]->name; build_tree_from_name(n, i); if(GLOBALS->escaped_names_found_vcd_c_1) { char *subst, ch; subst=GLOBALS->facs[i]->name; while((ch=(*subst))) { if(ch==VCDNAM_ESCAPE) { *subst=GLOBALS->hier_delimeter; } /* restore back to normal */ subst++; } } } treegraft(&GLOBALS->treeroot); treesort(GLOBALS->treeroot, NULL); if(GLOBALS->escaped_names_found_vcd_c_1) { treenamefix(GLOBALS->treeroot); } } /*******************************************************************************/ static void vcd_cleanup(void) { struct slist *s, *s2; struct vcdsymbol *v, *vt; if(GLOBALS->indexed_vcd_c_1) { free_2(GLOBALS->indexed_vcd_c_1); GLOBALS->indexed_vcd_c_1=NULL; } if(GLOBALS->sorted_vcd_c_1) { free_2(GLOBALS->sorted_vcd_c_1); GLOBALS->sorted_vcd_c_1=NULL; } v=GLOBALS->vcdsymroot_vcd_c_1; while(v) { if(v->name) free_2(v->name); if(v->id) free_2(v->id); if(v->value) free_2(v->value); if(v->narray) free_2(v->narray); vt=v; v=v->next; free_2(vt); } GLOBALS->vcdsymroot_vcd_c_1=GLOBALS->vcdsymcurr_vcd_c_1=NULL; if(GLOBALS->slisthier) { free_2(GLOBALS->slisthier); GLOBALS->slisthier=NULL; } s=GLOBALS->slistroot; while(s) { s2=s->next; if(s->str)free_2(s->str); free_2(s); s=s2; } GLOBALS->slistroot=GLOBALS->slistcurr=NULL; GLOBALS->slisthier_len=0; if(GLOBALS->vcd_is_compressed_vcd_c_1) { pclose(GLOBALS->vcd_handle_vcd_c_1); GLOBALS->vcd_handle_vcd_c_1 = NULL; } else { fclose(GLOBALS->vcd_handle_vcd_c_1); GLOBALS->vcd_handle_vcd_c_1 = NULL; } if(GLOBALS->yytext_vcd_c_1) { free_2(GLOBALS->yytext_vcd_c_1); GLOBALS->yytext_vcd_c_1=NULL; } } /*******************************************************************************/ TimeType vcd_main(char *fname) { GLOBALS->pv_vcd_c_1=GLOBALS->rootv_vcd_c_1=NULL; GLOBALS->vcd_hier_delimeter[0]=GLOBALS->hier_delimeter; errno=0; /* reset in case it's set for some reason */ GLOBALS->yytext_vcd_c_1=(char *)malloc_2(GLOBALS->T_MAX_STR_vcd_c_1+1); if(!GLOBALS->hier_was_explicitly_set) /* set default hierarchy split char */ { GLOBALS->hier_delimeter='.'; } if(suffix_check(fname, ".gz") || suffix_check(fname, ".zip")) { char *str; int dlen; dlen=strlen(WAVE_DECOMPRESSOR); str=wave_alloca(strlen(fname)+dlen+1); strcpy(str,WAVE_DECOMPRESSOR); strcpy(str+dlen,fname); GLOBALS->vcd_handle_vcd_c_1=popen(str,"r"); GLOBALS->vcd_is_compressed_vcd_c_1=~0; } else { if(strcmp("-vcd",fname)) { GLOBALS->vcd_handle_vcd_c_1=fopen(fname,"rb"); if(GLOBALS->vcd_handle_vcd_c_1) { fseeko(GLOBALS->vcd_handle_vcd_c_1, 0, SEEK_END); /* do status bar for vcd load */ GLOBALS->vcd_fsiz_vcd_c_1 = ftello(GLOBALS->vcd_handle_vcd_c_1); fseeko(GLOBALS->vcd_handle_vcd_c_1, 0, SEEK_SET); } if(GLOBALS->vcd_warning_filesize < 0) GLOBALS->vcd_warning_filesize = VCD_SIZE_WARN; if(GLOBALS->vcd_warning_filesize) if(GLOBALS->vcd_fsiz_vcd_c_1 > (GLOBALS->vcd_warning_filesize * (1024 * 1024))) { fprintf(stderr, "Warning! File size is %d MB. This might fail to load.\n" "Consider converting it to the FST database format instead. (See the\n" "vcd2fst(1) manpage for more information.)\n" "To disable this warning, set rc variable vcd_warning_filesize to zero.\n" "Alternatively, use the -o, --optimize command line option to convert to LXT2.\n\n", (int)(GLOBALS->vcd_fsiz_vcd_c_1/(1024*1024))); } } else { GLOBALS->vcd_handle_vcd_c_1=stdin; GLOBALS->splash_disable = 1; } GLOBALS->vcd_is_compressed_vcd_c_1=0; } if(!GLOBALS->vcd_handle_vcd_c_1) { fprintf(stderr, "Error opening %s .vcd file '%s'.\n", GLOBALS->vcd_is_compressed_vcd_c_1?"compressed":"", fname); perror("Why"); vcd_exit(255); } /* SPLASH */ splash_create(); sym_hash_initialize(GLOBALS); getch_alloc(); /* alloc membuff for vcd getch buffer */ build_slisthier(); vcd_parse(); if(GLOBALS->varsplit_vcd_c_1) { free_2(GLOBALS->varsplit_vcd_c_1); GLOBALS->varsplit_vcd_c_1=NULL; } if((!GLOBALS->sorted_vcd_c_1)&&(!GLOBALS->indexed_vcd_c_1)) { fprintf(stderr, "No symbols in VCD file..is it malformed? Exiting!\n"); vcd_exit(255); } add_tail_histents(); if(GLOBALS->vcd_save_handle) { fclose(GLOBALS->vcd_save_handle); GLOBALS->vcd_save_handle = NULL; } fprintf(stderr, "["TTFormat"] start time.\n["TTFormat"] end time.\n", GLOBALS->start_time_vcd_c_1*GLOBALS->time_scale, GLOBALS->end_time_vcd_c_1*GLOBALS->time_scale); if(GLOBALS->num_glitches_vcd_c_2) fprintf(stderr, "Warning: encountered %d glitch%s across %d glitch region%s.\n", GLOBALS->num_glitches_vcd_c_2, (GLOBALS->num_glitches_vcd_c_2!=1)?"es":"", GLOBALS->num_glitch_regions_vcd_c_2, (GLOBALS->num_glitch_regions_vcd_c_2!=1)?"s":""); if(GLOBALS->vcd_fsiz_vcd_c_1) { splash_sync(GLOBALS->vcd_fsiz_vcd_c_1, GLOBALS->vcd_fsiz_vcd_c_1); GLOBALS->vcd_fsiz_vcd_c_1 = 0; } else if(GLOBALS->vcd_is_compressed_vcd_c_1) { splash_sync(1,1); GLOBALS->vcd_fsiz_vcd_c_1 = 0; } GLOBALS->min_time=GLOBALS->start_time_vcd_c_1*GLOBALS->time_scale; GLOBALS->max_time=GLOBALS->end_time_vcd_c_1*GLOBALS->time_scale; GLOBALS->global_time_offset = GLOBALS->global_time_offset * GLOBALS->time_scale; if((GLOBALS->min_time==GLOBALS->max_time)&&(GLOBALS->max_time==LLDescriptor(-1))) { fprintf(stderr, "VCD times range is equal to zero. Exiting.\n"); vcd_exit(255); } vcd_build_symbols(); vcd_sortfacs(); vcd_cleanup(); getch_free(); /* free membuff for vcd getch buffer */ if(GLOBALS->blackout_regions) { struct blackout_region_t *bt = GLOBALS->blackout_regions; while(bt) { bt->bstart *= GLOBALS->time_scale; bt->bend *= GLOBALS->time_scale; bt = bt->next; } } GLOBALS->is_vcd=~0; /* SPLASH */ splash_finalize(); return(GLOBALS->max_time); } /*******************************************************************************/ gtkwave-3.3.86/src/lxt.h0000664000175000017500000000413013166335473014351 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2001-2004. * * 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. */ #include "globals.h" #ifndef WAVE_LXT_H #define WAVE_LXT_H #ifndef HAVE_FSEEKO #define fseeko fseek #endif #include "vcd.h" TimeType lxt_main(char *fname); void import_lxt_trace(nptr np); #define LT_SECTION_END (0) #define LT_SECTION_CHG (1) #define LT_SECTION_SYNC_TABLE (2) #define LT_SECTION_FACNAME (3) #define LT_SECTION_FACNAME_GEOMETRY (4) #define LT_SECTION_TIMESCALE (5) #define LT_SECTION_TIME_TABLE (6) #define LT_SECTION_INITIAL_VALUE (7) #define LT_SECTION_DOUBLE_TEST (8) #define LT_SECTION_TIME_TABLE64 (9) #define LT_SECTION_ZFACNAME_PREDEC_SIZE (10) #define LT_SECTION_ZFACNAME_SIZE (11) #define LT_SECTION_ZFACNAME_GEOMETRY_SIZE (12) #define LT_SECTION_ZSYNC_SIZE (13) #define LT_SECTION_ZTIME_TABLE_SIZE (14) #define LT_SECTION_ZCHG_PREDEC_SIZE (15) #define LT_SECTION_ZCHG_SIZE (16) #define LT_SECTION_ZDICTIONARY (17) #define LT_SECTION_ZDICTIONARY_SIZE (18) #define LT_SECTION_EXCLUDE_TABLE (19) #define LT_SECTION_TIMEZERO (20) #define LT_SYM_F_BITS (0) #define LT_SYM_F_INTEGER (1<<0) #define LT_SYM_F_DOUBLE (1<<1) #define LT_SYM_F_STRING (1<<2) #define LT_SYM_F_ALIAS (1<<3) #define LT_HDRID (0x0138) #define LT_VERSION (0x0004) #define LT_TRLID (0xB4) #define LT_MINDICTWIDTH (16) #define LXT_MMAP_MALLOC_BOUNDARY (128*1024*1024) #if defined __MINGW32__ || defined _MSC_VER void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset); int munmap(void *start, size_t length); #endif #endif gtkwave-3.3.86/src/ghwlib.c0000664000175000017500000013207613166335473015024 0ustar bybellbybell/* GHDL Wavefile reader library. Copyright (C) 2005 Tristan Gingold GHDL 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, or (at your option) any later version. GHDL 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 GCC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include "ghwlib.h" /* Reopen H through decompressor DECOMP. */ static int ghw_openz (struct ghw_handler *h, const char *decomp, const char *filename) { int plen = strlen (decomp) + 1 + strlen(filename) + 1; char *p = malloc (plen); snprintf (p, plen, "%s %s", decomp, filename); fclose (h->stream); h->stream = popen(p, "r"); free (p); if (h->stream == NULL) return -1; h->stream_ispipe = 1; return 0; } int ghw_open (struct ghw_handler *h, const char *filename) { char hdr[16]; h->stream = fopen (filename, "rb"); if (h->stream == NULL) return -1; if (fread (hdr, sizeof (hdr), 1, h->stream) != 1) return -1; /* Check compression layer. */ if (!memcmp (hdr, "\x1f\x8b", 2)) { if (ghw_openz (h, "gzip -cd", filename) < 0) return -1; if (fread (hdr, sizeof (hdr), 1, h->stream) != 1) return -1; } else if (!memcmp (hdr, "BZ", 2)) { if (ghw_openz (h, "bzip2 -cd", filename) < 0) return -1; if (fread (hdr, sizeof (hdr), 1, h->stream) != 1) return -1; } else { h->stream_ispipe = 0; } /* Check magic. */ if (memcmp (hdr, "GHDLwave\n", 9) != 0) return -2; /* Check version. */ if (hdr[9] != 16 || hdr[10] != 0) return -2; h->version = hdr[11]; if (h->version > 1) return -3; if (hdr[12] == 1) h->word_be = 0; else if (hdr[12] == 2) h->word_be = 1; else return -4; #if 0 /* Endianness. */ { int endian; union { unsigned char b[4]; uint32_t i;} v; v.i = 0x11223344; if (v.b[0] == 0x11) endian = 2; else if (v.b[0] == 0x44) endian = 1; else return -3; if (hdr[12] != 1 && hdr[12] != 2) return -3; if (hdr[12] != endian) h->swap_word = 1; else h->swap_word = 0; } #endif h->word_len = hdr[13]; h->off_len = hdr[14]; if (hdr[15] != 0) return -5; h->hie = NULL; return 0; } int32_t ghw_get_i32 (struct ghw_handler *h, unsigned char *b) { if (h->word_be) return (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | (b[3] << 0); else return (b[3] << 24) | (b[2] << 16) | (b[1] << 8) | (b[0] << 0); } int64_t ghw_get_i64 (struct ghw_handler *ghw_h, unsigned char *b) { int l, h; if (ghw_h->word_be) { h = (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | (b[3] << 0); l = (b[4] << 24) | (b[5] << 16) | (b[6] << 8) | (b[7] << 0); } else { l = (b[3] << 24) | (b[2] << 16) | (b[1] << 8) | (b[0] << 0); h = (b[7] << 24) | (b[6] << 16) | (b[5] << 8) | (b[4] << 0); } return (((int64_t)h) << 32) | l; } int ghw_read_byte (struct ghw_handler *h, unsigned char *res) { int v; v = fgetc (h->stream); if (v == EOF) return -1; *res = v; return 0; } int ghw_read_uleb128 (struct ghw_handler *h, uint32_t *res) { uint32_t r = 0; unsigned int off = 0; while (1) { int v = fgetc (h->stream); if (v == EOF) return -1; r |= (v & 0x7f) << off; if ((v & 0x80) == 0) break; off += 7; } *res = r; return 0; } int ghw_read_sleb128 (struct ghw_handler *h, int32_t *res) { int32_t r = 0; unsigned int off = 0; while (1) { int v = fgetc (h->stream); if (v == EOF) return -1; r |= ((int32_t)(v & 0x7f)) << off; off += 7; if ((v & 0x80) == 0) { if ((v & 0x40) && off < 32) r |= -1 << off; break; } } *res = r; return 0; } int ghw_read_lsleb128 (struct ghw_handler *h, int64_t *res) { static const int64_t r_mask = -1; int64_t r = 0; unsigned int off = 0; while (1) { int v = fgetc (h->stream); if (v == EOF) return -1; r |= ((int64_t)(v & 0x7f)) << off; off += 7; if ((v & 0x80) == 0) { if ((v & 0x40) && off < 64) r |= r_mask << off; break; } } *res = r; return 0; } int ghw_read_f64 (struct ghw_handler *h, double *res) { /* FIXME: handle byte order. */ if (fread (res, sizeof (*res), 1, h->stream) != 1) return -1; return 0; } const char * ghw_read_strid (struct ghw_handler *h) { uint32_t id; if (ghw_read_uleb128 (h, &id) != 0) return NULL; return h->str_table[id]; } union ghw_type * ghw_read_typeid (struct ghw_handler *h) { uint32_t id; if (ghw_read_uleb128 (h, &id) != 0) return NULL; return h->types[id - 1]; } union ghw_range * ghw_read_range (struct ghw_handler *h) { int t = fgetc (h->stream); if (t == EOF) return NULL; switch (t & 0x7f) { case ghdl_rtik_type_b2: { struct ghw_range_b2 *r; r = malloc (sizeof (struct ghw_range_b2)); r->kind = t & 0x7f; r->dir = (t & 0x80) != 0; if (ghw_read_byte (h, &r->left) != 0) goto err_b2; if (ghw_read_byte (h, &r->right) != 0) goto err_b2; return (union ghw_range *)r; err_b2: free (r); return NULL; } case ghdl_rtik_type_e8: { struct ghw_range_e8 *r; r = malloc (sizeof (struct ghw_range_e8)); r->kind = t & 0x7f; r->dir = (t & 0x80) != 0; if (ghw_read_byte (h, &r->left) != 0) goto err_e8; if (ghw_read_byte (h, &r->right) != 0) goto err_e8; return (union ghw_range *)r; err_e8: free (r); return NULL; } case ghdl_rtik_type_i32: case ghdl_rtik_type_p32: { struct ghw_range_i32 *r; r = malloc (sizeof (struct ghw_range_i32)); r->kind = t & 0x7f; r->dir = (t & 0x80) != 0; if (ghw_read_sleb128 (h, &r->left) != 0) goto err_i32; if (ghw_read_sleb128 (h, &r->right) != 0) goto err_i32; return (union ghw_range *)r; err_i32: free (r); return NULL; } case ghdl_rtik_type_i64: case ghdl_rtik_type_p64: { struct ghw_range_i64 *r; r = malloc (sizeof (struct ghw_range_i64)); r->kind = t & 0x7f; r->dir = (t & 0x80) != 0; if (ghw_read_lsleb128 (h, &r->left) != 0) goto err_i64; if (ghw_read_lsleb128 (h, &r->right) != 0) goto err_i64; return (union ghw_range *)r; err_i64: free (r); return NULL; } case ghdl_rtik_type_f64: { struct ghw_range_f64 *r; r = malloc (sizeof (struct ghw_range_f64)); r->kind = t & 0x7f; r->dir = (t & 0x80) != 0; if (ghw_read_f64 (h, &r->left) != 0) goto err_f64; if (ghw_read_f64 (h, &r->right) != 0) goto err_f64; return (union ghw_range *)r; err_f64: free (r); return NULL; } default: fprintf (stderr, "ghw_read_range: type %d unhandled\n", t & 0x7f); return NULL; } } int ghw_read_str (struct ghw_handler *h) { unsigned char hdr[12]; unsigned i; char *p; int prev_len; if (fread (hdr, sizeof (hdr), 1, h->stream) != 1) return -1; if (hdr[0] != 0 || hdr[1] != 0 || hdr[2] != 0 || hdr[3] != 0) return -1; h->nbr_str = ghw_get_i32 (h, &hdr[4]); h->nbr_str++; h->str_size = ghw_get_i32 (h, &hdr[8]); h->str_table = (char **)malloc ((h->nbr_str + 1) * sizeof (char *)); h->str_content = (char *)malloc (h->str_size + h->nbr_str + 1); if (h->flag_verbose) { printf ("Number of strings: %u\n", h->nbr_str - 1); printf ("String table size: %u\n", h->str_size); } h->str_table[0] = ""; p = h->str_content; prev_len = 0; for (i = 1; i < h->nbr_str; i++) { int j; int c; char *prev; int sh; h->str_table[i] = p; prev = h->str_table[i - 1]; for (j = 0; j < prev_len; j++) *p++ = prev[j]; while (1) { c = fgetc (h->stream); if (c == EOF) return -1; if ((c >= 0 && c <= 31) || (c >= 128 && c <= 159)) break; *p++ = c; } *p++ = 0; if (h->flag_verbose > 1) printf (" string %u (pl=%d): %s\n", i, prev_len, h->str_table[i]); prev_len = c & 0x1f; sh = 5; while (c >= 128) { c = fgetc (h->stream); if (c == EOF) return -1; prev_len |= (c & 0x1f) << sh; sh += 5; } } if (fread (hdr, 4, 1, h->stream) != 1) return -1; if (memcmp (hdr, "EOS", 4) != 0) return -1; return 0; } union ghw_type * ghw_get_base_type (union ghw_type *t) { switch (t->kind) { case ghdl_rtik_type_b2: case ghdl_rtik_type_e8: case ghdl_rtik_type_e32: case ghdl_rtik_type_i32: case ghdl_rtik_type_i64: case ghdl_rtik_type_f64: case ghdl_rtik_type_p32: case ghdl_rtik_type_p64: return t; case ghdl_rtik_subtype_scalar: return t->ss.base; case ghdl_rtik_subtype_array: return (union ghw_type*)(t->sa.base); default: fprintf (stderr, "ghw_get_base_type: cannot handle type %d\n", t->kind); abort (); } } /* Return -1 for unbounded types. */ static int get_nbr_elements (union ghw_type *t) { switch (t->kind) { case ghdl_rtik_type_b2: case ghdl_rtik_type_e8: case ghdl_rtik_type_e32: case ghdl_rtik_type_i32: case ghdl_rtik_type_i64: case ghdl_rtik_type_f64: case ghdl_rtik_type_p32: case ghdl_rtik_type_p64: case ghdl_rtik_subtype_scalar: return 1; case ghdl_rtik_type_array: return -1; case ghdl_rtik_subtype_array: return t->sa.nbr_scalars; case ghdl_rtik_type_record: return t->rec.nbr_scalars; case ghdl_rtik_subtype_record: return t->sr.nbr_scalars; default: fprintf (stderr, "get_nbr_elements: unhandled type %d\n", t->kind); abort (); } } int ghw_get_range_length (union ghw_range *rng) { assert(rng); /* scan-view detects possible null pointer dereference here through a convoluted sequence of steps which probably violate what GHW would do*/ switch (rng->kind) { case ghdl_rtik_type_i32: if (rng->i32.dir) return (rng->i32.left - rng->i32.right + 1); else return (rng->i32.right - rng->i32.left + 1); case ghdl_rtik_type_b2: if (rng->b2.dir) return (rng->b2.left - rng->b2.right + 1); else return (rng->b2.right - rng->b2.left + 1); case ghdl_rtik_type_e8: if (rng->e8.dir) return (rng->e8.left - rng->e8.right + 1); else return (rng->e8.right - rng->e8.left + 1); default: fprintf (stderr, "get_range_length: unhandled kind %d\n", rng->kind); abort (); } } /* Create an array subtype using BASE and ranges read from H. */ struct ghw_subtype_array * ghw_read_array_subtype (struct ghw_handler *h, struct ghw_type_array *base) { struct ghw_subtype_array *sa; unsigned j; int nbr_scalars; sa = malloc (sizeof (struct ghw_subtype_array)); sa->kind = ghdl_rtik_subtype_array; sa->name = NULL; sa->base = base; nbr_scalars = get_nbr_elements (base->el); sa->rngs = malloc (base->nbr_dim * sizeof (union ghw_range *)); for (j = 0; j < base->nbr_dim; j++) { sa->rngs[j] = ghw_read_range (h); nbr_scalars *= ghw_get_range_length (sa->rngs[j]); } sa->nbr_scalars = nbr_scalars; return sa; } struct ghw_subtype_record * ghw_read_record_subtype (struct ghw_handler *h, struct ghw_type_record *base) { struct ghw_subtype_record *sr; sr = malloc (sizeof (struct ghw_subtype_record)); sr->kind = ghdl_rtik_subtype_record; sr->name = NULL; sr->base = base; if (base->nbr_scalars >= 0) { /* Record base type is bounded. */ sr->nbr_scalars = base->nbr_scalars; sr->els = base->els; } else { /* Read subtypes. */ unsigned j; int nbr_scalars; sr->els = malloc (base->nbr_fields * sizeof (struct ghw_record_element)); nbr_scalars = 0; for (j = 0; j < base->nbr_fields; j++) { union ghw_type *btype = base->els[j].type; int el_nbr_scalars = get_nbr_elements (btype); sr->els[j].name = base->els[j].name; if (el_nbr_scalars >= 0) { /* Element is constrained. */ sr->els[j].type = btype; } else { switch (btype->kind) { case ghdl_rtik_type_array: sr->els[j].type = (union ghw_type *) ghw_read_array_subtype (h, &btype->ar); break; case ghdl_rtik_type_record: sr->els[j].type = (union ghw_type *) ghw_read_record_subtype (h, &btype->rec); break; default: fprintf (stderr, "ghw_read_record_subtype: unhandled kind %d\n", btype->kind); return NULL; } el_nbr_scalars = get_nbr_elements (sr->els[j].type); } nbr_scalars += el_nbr_scalars; } sr->nbr_scalars = nbr_scalars; } return sr; } int ghw_read_type (struct ghw_handler *h) { unsigned char hdr[8]; unsigned i; if (fread (hdr, sizeof (hdr), 1, h->stream) != 1) return -1; if (hdr[0] != 0 || hdr[1] != 0 || hdr[2] != 0 || hdr[3] != 0) return -1; h->nbr_types = ghw_get_i32 (h, &hdr[4]); h->types = (union ghw_type **) malloc (h->nbr_types * sizeof (union ghw_type *)); for (i = 0; i < h->nbr_types; i++) { int t; t = fgetc (h->stream); if (t == EOF) return -1; /* printf ("type[%d]= %d\n", i, t); */ switch (t) { case ghdl_rtik_type_b2: case ghdl_rtik_type_e8: { struct ghw_type_enum *e; unsigned j; e = malloc (sizeof (struct ghw_type_enum)); e->kind = t; e->wkt = ghw_wkt_unknown; e->name = ghw_read_strid (h); if (ghw_read_uleb128 (h, &e->nbr) != 0) goto err_b2; e->lits = (const char **) malloc (e->nbr * sizeof (char *)); if (h->flag_verbose > 1) printf ("enum %s:", e->name); for (j = 0; j < e->nbr; j++) { e->lits[j] = ghw_read_strid (h); if (h->flag_verbose > 1) printf (" %s", e->lits[j]); } if (h->flag_verbose > 1) printf ("\n"); h->types[i] = (union ghw_type *)e; break; err_b2: free (e); return -1; } break; case ghdl_rtik_type_i32: case ghdl_rtik_type_i64: case ghdl_rtik_type_f64: { struct ghw_type_scalar *sc; sc = malloc (sizeof (struct ghw_type_scalar)); sc->kind = t; sc->name = ghw_read_strid (h); if (h->flag_verbose > 1) printf ("scalar: %s\n", sc->name); h->types[i] = (union ghw_type *)sc; } break; case ghdl_rtik_type_p32: case ghdl_rtik_type_p64: { struct ghw_type_physical *ph; ph = malloc (sizeof (struct ghw_type_physical)); ph->kind = t; ph->name = ghw_read_strid (h); ph->units = NULL; if (h->version == 0) ph->nbr_units = 0; else { unsigned ix; /* was "i", but fails -Wshadow */ if (ghw_read_uleb128 (h, &ph->nbr_units) != 0) goto err_p32; ph->units = malloc (ph->nbr_units * sizeof (struct ghw_unit)); for (ix = 0; ix < ph->nbr_units; ix++) { ph->units[ix].name = ghw_read_strid (h); if (ghw_read_lsleb128 (h, &ph->units[ix].val) < 0) goto err_p32; } } if (h->flag_verbose > 1) printf ("physical: %s\n", ph->name); h->types[i] = (union ghw_type *)ph; break; err_p32: free (ph->units); free (ph); return -1; } break; case ghdl_rtik_subtype_scalar: { struct ghw_subtype_scalar *ss; ss = malloc (sizeof (struct ghw_subtype_scalar)); ss->kind = t; ss->name = ghw_read_strid (h); ss->base = ghw_read_typeid (h); ss->rng = ghw_read_range (h); if (h->flag_verbose > 1) printf ("subtype scalar: %s\n", ss->name); h->types[i] = (union ghw_type *)ss; } break; case ghdl_rtik_type_array: { struct ghw_type_array *arr; unsigned j; arr = malloc (sizeof (struct ghw_type_array)); arr->kind = t; arr->name = ghw_read_strid (h); arr->el = ghw_read_typeid (h); if (ghw_read_uleb128 (h, &arr->nbr_dim) != 0) goto err_array; arr->dims = (union ghw_type **) malloc (arr->nbr_dim * sizeof (union ghw_type *)); for (j = 0; j < arr->nbr_dim; j++) arr->dims[j] = ghw_read_typeid (h); if (h->flag_verbose > 1) printf ("array: %s\n", arr->name); h->types[i] = (union ghw_type *)arr; break; err_array: free (arr); return -1; } break; case ghdl_rtik_subtype_array: { struct ghw_subtype_array *sa; const char *name; struct ghw_type_array *base; name = ghw_read_strid (h); base = (struct ghw_type_array *)ghw_read_typeid (h); sa = ghw_read_array_subtype (h, base); sa->name = name; h->types[i] = (union ghw_type *)sa; if (h->flag_verbose > 1) printf ("subtype array: %s (nbr_scalars=%d)\n", sa->name, sa->nbr_scalars); } break; case ghdl_rtik_type_record: { struct ghw_type_record *rec; unsigned j; int nbr_scalars; rec = malloc (sizeof (struct ghw_type_record)); rec->kind = t; rec->name = ghw_read_strid (h); rec->els = NULL; if (ghw_read_uleb128 (h, &rec->nbr_fields) != 0) goto err_record; rec->els = malloc (rec->nbr_fields * sizeof (struct ghw_record_element)); nbr_scalars = 0; for (j = 0; j < rec->nbr_fields; j++) { rec->els[j].name = ghw_read_strid (h); rec->els[j].type = ghw_read_typeid (h); if (nbr_scalars != -1) { int field_nbr_scalars = get_nbr_elements (rec->els[j].type); if (field_nbr_scalars == -1) nbr_scalars = -1; else nbr_scalars += field_nbr_scalars; } } rec->nbr_scalars = nbr_scalars; if (h->flag_verbose > 1) printf ("record type: %s (nbr_scalars=%d)\n", rec->name, rec->nbr_scalars); h->types[i] = (union ghw_type *)rec; break; err_record: free (rec->els); free (rec); return -1; } break; case ghdl_rtik_subtype_record: { struct ghw_subtype_record *sr; const char *name; struct ghw_type_record *base; name = ghw_read_strid (h); base = (struct ghw_type_record *)ghw_read_typeid (h); sr = ghw_read_record_subtype (h, base); sr->name = name; h->types[i] = (union ghw_type *)sr; if (h->flag_verbose > 1) printf ("subtype record: %s (nbr_scalars=%d)\n", sr->name, sr->nbr_scalars); } break; default: fprintf (stderr, "ghw_read_type: unknown type %d\n", t); return -1; } } if (fgetc (h->stream) != 0) return -1; return 0; } int ghw_read_wk_types (struct ghw_handler *h) { char hdr[4]; if (fread (hdr, sizeof (hdr), 1, h->stream) != 1) return -1; if (hdr[0] != 0 || hdr[1] != 0 || hdr[2] != 0 || hdr[3] != 0) return -1; while (1) { int t; union ghw_type *tid; t = fgetc (h->stream); if (t == EOF) return -1; else if (t == 0) break; tid = ghw_read_typeid (h); if (tid->kind == ghdl_rtik_type_b2 || tid->kind == ghdl_rtik_type_e8) { if (h->flag_verbose > 0) printf ("%s: wkt=%d\n", tid->en.name, t); tid->en.wkt = t; } } return 0; } void ghw_disp_typename (struct ghw_handler *h, union ghw_type *t) { (void)h; printf ("%s", t->common.name); } /* Read a signal composed of severals elements. Return 0 for success. */ int ghw_read_signal (struct ghw_handler *h, unsigned int *sigs, union ghw_type *t) { switch (t->kind) { case ghdl_rtik_type_b2: case ghdl_rtik_type_e8: case ghdl_rtik_type_e32: case ghdl_rtik_subtype_scalar: { unsigned int sig_el; if (ghw_read_uleb128 (h, &sig_el) < 0) return -1; *sigs = sig_el; if (sig_el == 0 || sig_el >= h->nbr_sigs) return -1; if (h->sigs[sig_el].type == NULL) h->sigs[sig_el].type = ghw_get_base_type (t); } return 0; case ghdl_rtik_subtype_array: { int i; int stride; int len; len = t->sa.nbr_scalars; stride = get_nbr_elements (t->sa.base->el); for (i = 0; i < len; i += stride) if (ghw_read_signal (h, &sigs[i], t->sa.base->el) < 0) return -1; } return 0; case ghdl_rtik_type_record: { struct ghw_type_record *r = &t->rec; int nbr_fields = r->nbr_fields; int i; int off; off = 0; for (i = 0; i < nbr_fields; i++) { if (ghw_read_signal (h, &sigs[off], r->els[i].type) < 0) return -1; off += get_nbr_elements (r->els[i].type); } } return 0; case ghdl_rtik_subtype_record: { struct ghw_subtype_record *sr = &t->sr; int nbr_fields = sr->base->nbr_fields; int i; int off; off = 0; for (i = 0; i < nbr_fields; i++) { if (ghw_read_signal (h, &sigs[off], sr->els[i].type) < 0) return -1; off += get_nbr_elements (sr->els[i].type); } } return 0; default: fprintf (stderr, "ghw_read_signal: type kind %d unhandled\n", t->kind); abort (); } } int ghw_read_value (struct ghw_handler *h, union ghw_val *val, union ghw_type *type) { switch (ghw_get_base_type (type)->kind) { case ghdl_rtik_type_b2: { int v; v = fgetc (h->stream); if (v == EOF) return -1; val->b2 = v; } break; case ghdl_rtik_type_e8: { int v; v = fgetc (h->stream); if (v == EOF) return -1; val->e8 = v; } break; case ghdl_rtik_type_i32: case ghdl_rtik_type_p32: { int32_t v; if (ghw_read_sleb128 (h, &v) < 0) return -1; val->i32 = v; } break; case ghdl_rtik_type_f64: { double v; if (ghw_read_f64 (h, &v) < 0) return -1; val->f64 = v; } break; case ghdl_rtik_type_p64: { int64_t v; if (ghw_read_lsleb128 (h, &v) < 0) return -1; val->i64 = v; } break; default: fprintf (stderr, "read_value: cannot handle format %d\n", type->kind); abort (); } return 0; } int ghw_read_hie (struct ghw_handler *h) { unsigned char hdr[16]; int nbr_scopes; int nbr_sigs; unsigned i; struct ghw_hie *blk; struct ghw_hie **last; if (fread (hdr, sizeof (hdr), 1, h->stream) != 1) return -1; if (hdr[0] != 0 || hdr[1] != 0 || hdr[2] != 0 || hdr[3] != 0) return -1; nbr_scopes = ghw_get_i32 (h, &hdr[4]); /* Number of declared signals (which may be composite). */ nbr_sigs = ghw_get_i32 (h, &hdr[8]); /* Number of basic signals. */ h->nbr_sigs = ghw_get_i32 (h, &hdr[12]); if (h->flag_verbose) printf ("%u scopes, %u signals, %u signal elements\n", nbr_scopes, nbr_sigs, h->nbr_sigs); blk = (struct ghw_hie *)malloc (sizeof (struct ghw_hie)); blk->kind = ghw_hie_design; blk->name = NULL; blk->parent = NULL; blk->brother = NULL; blk->u.blk.child = NULL; last = &blk->u.blk.child; h->hie = blk; h->nbr_sigs++; h->skip_sigs = NULL; h->flag_full_names = 0; h->sigs = (struct ghw_sig *) malloc (h->nbr_sigs * sizeof (struct ghw_sig)); memset (h->sigs, 0, h->nbr_sigs * sizeof (struct ghw_sig)); while (1) { int t; struct ghw_hie *el; unsigned int str; t = fgetc (h->stream); if (t == EOF) return -1; if (t == 0) break; if (t == ghw_hie_eos) { blk = blk->parent; if (blk->u.blk.child == NULL) last = &blk->u.blk.child; else { struct ghw_hie *l = blk->u.blk.child; while (l->brother != NULL) l = l->brother; last = &l->brother; } continue; } el = (struct ghw_hie *) malloc (sizeof (struct ghw_hie)); el->kind = t; el->parent = blk; el->brother = NULL; /* Link. */ *last = el; last = &el->brother; /* Read name. */ if (ghw_read_uleb128 (h, &str) != 0) return -1; el->name = h->str_table[str]; switch (t) { case ghw_hie_eoh: case ghw_hie_design: case ghw_hie_eos: /* Should not be here. */ abort (); case ghw_hie_process: break; case ghw_hie_block: case ghw_hie_generate_if: case ghw_hie_generate_for: case ghw_hie_instance: case ghw_hie_generic: case ghw_hie_package: /* Create a block. */ el->u.blk.child = NULL; if (t == ghw_hie_generate_for) { el->u.blk.iter_type = ghw_read_typeid (h); el->u.blk.iter_value = malloc (sizeof (union ghw_val)); if (ghw_read_value (h, el->u.blk.iter_value, el->u.blk.iter_type) < 0) return -1; } blk = el; last = &el->u.blk.child; break; case ghw_hie_signal: case ghw_hie_port_in: case ghw_hie_port_out: case ghw_hie_port_inout: case ghw_hie_port_buffer: case ghw_hie_port_linkage: /* For a signal, read type. */ { int nbr_el; unsigned int *sigs; el->u.sig.type = ghw_read_typeid (h); nbr_el = get_nbr_elements (el->u.sig.type); if (nbr_el < 0) return -1; sigs = (unsigned int *) malloc ((nbr_el + 1) * sizeof (unsigned int)); el->u.sig.sigs = sigs; /* Last element is NULL. */ sigs[nbr_el] = 0; if (h->flag_verbose > 1) printf ("signal %s: %d el [", el->name, nbr_el); if (ghw_read_signal (h, sigs, el->u.sig.type) < 0) return -1; if (h->flag_verbose > 1) { int j; for (j = 0; j < nbr_el; j++) printf (" #%u", sigs[j]); printf ("]\n"); } } break; default: fprintf (stderr, "ghw_read_hie: unhandled kind %d\n", t); abort (); } } /* Allocate values. */ for (i = 0; i < h->nbr_sigs; i++) if (h->sigs[i].type != NULL) h->sigs[i].val = (union ghw_val *) malloc (sizeof (union ghw_val)); return 0; } const char * ghw_get_hie_name (struct ghw_hie *h) { switch (h->kind) { case ghw_hie_eoh: return "eoh"; case ghw_hie_design: return "design"; case ghw_hie_block: return "block"; case ghw_hie_generate_if: return "generate-if"; case ghw_hie_generate_for: return "generate-for"; case ghw_hie_instance: return "instance"; case ghw_hie_package: return "package"; case ghw_hie_process: return "process"; case ghw_hie_generic: return "generic"; case ghw_hie_eos: return "eos"; case ghw_hie_signal: return "signal"; case ghw_hie_port_in: return "port-in"; case ghw_hie_port_out: return "port-out"; case ghw_hie_port_inout: return "port-inout"; case ghw_hie_port_buffer: return "port-buffer"; case ghw_hie_port_linkage: return "port-linkage"; default: return "??"; } } void ghw_disp_value (union ghw_val *val, union ghw_type *type); static void print_name (struct ghw_hie *hie, int full_names) { int i; int depth; struct ghw_hie *p; struct ghw_hie **buf; struct ghw_hie **end; assert (hie->name); /* scan view complains about possibility of depth=0 below on malloc */ if (0 == full_names) { printf (" %s: ", hie->name); return; } p = hie; depth = 0; while (p && p->name) { p = p->parent; ++depth; } buf = (struct ghw_hie **) malloc (depth * sizeof (struct ghw_hie *)); p = hie; end = depth + buf; while (p && p->name) { *(--end) = p; p = p->parent; } putchar (' '); putchar ('/'); for (i = 0; i < depth; ++i) { printf ("%s%s", i ? "/" : "", buf[i]->name); if (ghw_hie_generate_for == buf[i]->kind) { putchar ('('); ghw_disp_value (buf[i]->u.blk.iter_value, buf[i]->u.blk.iter_type); putchar (')'); } } putchar (':'); putchar (' '); free (buf); } void ghw_disp_hie (struct ghw_handler *h, struct ghw_hie *top) { int i; int indent; struct ghw_hie *hie; struct ghw_hie *n; hie = top; indent = 0; while (1) { if (0 == h->flag_full_names) for (i = 0; i < indent; i++) fputc (' ', stdout); printf ("%s", ghw_get_hie_name (hie)); switch (hie->kind) { case ghw_hie_design: case ghw_hie_block: case ghw_hie_generate_if: case ghw_hie_generate_for: case ghw_hie_instance: case ghw_hie_process: case ghw_hie_package: if (hie->name) print_name (hie, h->flag_full_names); if (hie->kind == ghw_hie_generate_for) { printf ("("); ghw_disp_value (hie->u.blk.iter_value, hie->u.blk.iter_type); printf (")"); } n = hie->u.blk.child; if (n == NULL) n = hie->brother; else indent++; break; case ghw_hie_generic: case ghw_hie_eos: abort (); case ghw_hie_signal: case ghw_hie_port_in: case ghw_hie_port_out: case ghw_hie_port_inout: case ghw_hie_port_buffer: case ghw_hie_port_linkage: { unsigned int *sigs = hie->u.sig.sigs; unsigned int k, num; print_name (hie, h->flag_full_names); ghw_disp_subtype_indication (h, hie->u.sig.type); printf (":"); k = 0; assert (sigs[0] != GHW_NO_SIG); while (1) { /* First signal of the range. */ printf (" #%u", sigs[k]); for (num = 1; sigs[k + num] != GHW_NO_SIG; num++) if (sigs[k + num] != sigs[k + num - 1] + 1) break; if (num > 1) printf ("-#%u", sigs[k + num - 1]); k += num; /* End of signals ? */ if (sigs[k] == GHW_NO_SIG) break; } n = hie->brother; } break; default: abort (); } printf ("\n"); while (n == NULL) { if (hie->parent == NULL) return; hie = hie->parent; indent--; n = hie->brother; } hie = n; } } int ghw_read_eoh (struct ghw_handler *h) { (void)h; return 0; } int ghw_read_base (struct ghw_handler *h) { unsigned char hdr[4]; int res; while (1) { if (fread (hdr, sizeof (hdr), 1, h->stream) != 1) return -1; if (memcmp (hdr, "STR", 4) == 0) res = ghw_read_str (h); else if (memcmp (hdr, "HIE", 4) == 0) res = ghw_read_hie (h); else if (memcmp (hdr, "TYP", 4) == 0) res = ghw_read_type (h); else if (memcmp (hdr, "WKT", 4) == 0) res = ghw_read_wk_types (h); else if (memcmp (hdr, "EOH", 4) == 0) return 0; else { fprintf (stderr, "ghw_read_base: unknown GHW section %c%c%c%c\n", hdr[0], hdr[1], hdr[2], hdr[3]); return -1; } if (res != 0) { fprintf (stderr, "ghw_read_base: error in section %s\n", hdr); return res; } } } int ghw_read_signal_value (struct ghw_handler *h, struct ghw_sig *s) { return ghw_read_value (h, s->val, s->type); } int ghw_read_snapshot (struct ghw_handler *h) { unsigned char hdr[12]; unsigned i; struct ghw_sig *s; if (fread (hdr, sizeof (hdr), 1, h->stream) != 1) return -1; if (hdr[0] != 0 || hdr[1] != 0 || hdr[2] != 0 || hdr[3] != 0) return -1; h->snap_time = ghw_get_i64 (h, &hdr[4]); if (h->flag_verbose > 1) printf ("Time is " GHWPRI64 " fs\n", h->snap_time); for (i = 0; i < h->nbr_sigs; i++) { s = &h->sigs[i]; if (s->type != NULL) { if (h->flag_verbose > 1) printf ("read type %d for sig %u\n", s->type->kind, i); if (ghw_read_signal_value (h, s) < 0) return -1; } } if (fread (hdr, 4, 1, h->stream) != 1) return -1; if (memcmp (hdr, "ESN", 4)) return -1; return 0; } void ghw_disp_values (struct ghw_handler *h); int ghw_read_cycle_start (struct ghw_handler *h) { unsigned char hdr[8]; if (fread (hdr, sizeof (hdr), 1, h->stream) != 1) return -1; h->snap_time = ghw_get_i64 (h, hdr); return 0; } int ghw_read_cycle_cont (struct ghw_handler *h, int *list) { int i; int *list_p; i = 0; list_p = list; while (1) { uint32_t d; /* Read delta to next signal. */ if (ghw_read_uleb128 (h, &d) < 0) return -1; if (d == 0) { /* Last signal reached. */ break; } /* Find next signal. */ while (d > 0) { i++; if (h->sigs[i].type != NULL) d--; } if (ghw_read_signal_value (h, &h->sigs[i]) < 0) return -1; if (list_p) *list_p++ = i; } if (list_p) *list_p = 0; return 0; } int ghw_read_cycle_next (struct ghw_handler *h) { int64_t d_time; if (ghw_read_lsleb128 (h, &d_time) < 0) return -1; if (d_time == -1) return 0; h->snap_time += d_time; return 1; } int ghw_read_cycle_end (struct ghw_handler *h) { char hdr[4]; if (fread (hdr, sizeof (hdr), 1, h->stream) != 1) return -1; if (memcmp (hdr, "ECY", 4)) return -1; return 0; } static const char * ghw_get_lit (union ghw_type *type, unsigned e) { if (e >= type->en.nbr) return "??"; else return type->en.lits[e]; } static void ghw_disp_lit (union ghw_type *type, unsigned e) { printf ("%s (%u)", ghw_get_lit (type, e), e); } void ghw_disp_value (union ghw_val *val, union ghw_type *type) { switch (ghw_get_base_type (type)->kind) { case ghdl_rtik_type_b2: ghw_disp_lit (type, val->b2); break; case ghdl_rtik_type_e8: ghw_disp_lit (type, val->e8); break; case ghdl_rtik_type_i32: printf (GHWPRI32, val->i32); break; case ghdl_rtik_type_p64: printf (GHWPRI64, val->i64); break; case ghdl_rtik_type_f64: printf ("%g", val->f64); break; default: fprintf (stderr, "ghw_disp_value: cannot handle type %d\n", type->kind); abort (); } } /* Put the ASCII representation of VAL into BUF, whose size if LEN. A NUL is always written to BUF. */ void ghw_get_value (char *buf, int len, union ghw_val *val, union ghw_type *type) { union ghw_type *base = ghw_get_base_type (type); switch (base->kind) { case ghdl_rtik_type_b2: if (val->b2 <= 1) { strncpy (buf, base->en.lits[val->b2], len - 1); buf[len - 1] = 0; } else { snprintf (buf, len, "?%d", val->b2); } break; case ghdl_rtik_type_e8: if (val->b2 <= base->en.nbr) { strncpy (buf, base->en.lits[val->e8], len - 1); buf[len - 1] = 0; } else { snprintf (buf, len, "?%d", val->e8); } break; case ghdl_rtik_type_i32: snprintf (buf, len, GHWPRI32, val->i32); break; case ghdl_rtik_type_p64: snprintf (buf, len, GHWPRI64, val->i64); break; case ghdl_rtik_type_f64: snprintf (buf, len, "%g", val->f64); break; default: snprintf (buf, len, "?bad type %d?", type->kind); } } static char is_skip_signal (int *signals_to_keep, int nb_signals_to_keep, int signal) { int i; for (i = 0; i < nb_signals_to_keep; ++i) { if (signal == signals_to_keep[i]) { return 0; } } return 1; } void ghw_filter_signals (struct ghw_handler *h, int *signals_to_keep, int nb_signals_to_keep) { unsigned i; if (0 < nb_signals_to_keep && 0 != signals_to_keep) { if (0 == h->skip_sigs) { h->skip_sigs = (char *) malloc (sizeof (char) * h->nbr_sigs); } for (i = 0; i < h->nbr_sigs; ++i) { h->skip_sigs[i] = is_skip_signal (signals_to_keep, nb_signals_to_keep, i); } } else { if (0 != h->skip_sigs) { free (h->skip_sigs); h->skip_sigs = 0; } } } void ghw_disp_values (struct ghw_handler *h) { unsigned i; for (i = 0; i < h->nbr_sigs; i++) { struct ghw_sig *s = &h->sigs[i]; int skip = (0 != h->skip_sigs && (0 != h->skip_sigs[i])); if (s->type != NULL && !skip) { printf ("#%u: ", i); ghw_disp_value (s->val, s->type); printf ("\n"); } } } int ghw_read_directory (struct ghw_handler *h) { unsigned char hdr[8]; int nbr_entries; int i; if (fread (hdr, sizeof (hdr), 1, h->stream) != 1) return -1; nbr_entries = ghw_get_i32 (h, &hdr[4]); if (h->flag_verbose) printf ("Directory (%d entries):\n", nbr_entries); for (i = 0; i < nbr_entries; i++) { unsigned char ent[8]; int pos; if (fread (ent, sizeof (ent), 1, h->stream) != 1) return -1; pos = ghw_get_i32 (h, &ent[4]); if (h->flag_verbose) printf (" %s at %d\n", ent, pos); } if (fread (hdr, 4, 1, h->stream) != 1) return -1; if (memcmp (hdr, "EOD", 4)) return -1; return 0; } int ghw_read_tailer (struct ghw_handler *h) { unsigned char hdr[8]; int pos; if (fread (hdr, sizeof (hdr), 1, h->stream) != 1) return -1; pos = ghw_get_i32 (h, &hdr[4]); if (h->flag_verbose) printf ("Tailer: directory at %d\n", pos); return 0; } enum ghw_res ghw_read_sm_hdr (struct ghw_handler *h, int *list) { unsigned char hdr[4]; int res; if (fread (hdr, sizeof (hdr), 1, h->stream) != 1) { if (feof (h->stream)) return ghw_res_eof; else return ghw_res_error; } if (memcmp (hdr, "SNP", 4) == 0) { res = ghw_read_snapshot (h); if (res < 0) return res; return ghw_res_snapshot; } else if (memcmp (hdr, "CYC", 4) == 0) { res = ghw_read_cycle_start (h); if (res < 0) return res; res = ghw_read_cycle_cont (h, list); if (res < 0) return res; return ghw_res_cycle; } else if (memcmp (hdr, "DIR", 4) == 0) { res = ghw_read_directory (h); } else if (memcmp (hdr, "TAI", 4) == 0) { res = ghw_read_tailer (h); } else { fprintf (stderr, "unknown GHW section %c%c%c%c\n", hdr[0], hdr[1], hdr[2], hdr[3]); return -1; } if (res != 0) return res; return ghw_res_other; } int ghw_read_sm (struct ghw_handler *h, enum ghw_sm_type *sm) { int res; while (1) { /* printf ("sm: state = %d\n", *sm); */ switch (*sm) { case ghw_sm_init: case ghw_sm_sect: res = ghw_read_sm_hdr (h, NULL); switch (res) { case ghw_res_other: break; case ghw_res_snapshot: *sm = ghw_sm_sect; return res; case ghw_res_cycle: *sm = ghw_sm_cycle; return res; default: return res; } break; case ghw_sm_cycle: if (0) printf ("Time is " GHWPRI64 " fs\n", h->snap_time); if (0) ghw_disp_values (h); res = ghw_read_cycle_next (h); if (res < 0) return res; if (res == 1) { res = ghw_read_cycle_cont (h, NULL); if (res < 0) return res; return ghw_res_cycle; } res = ghw_read_cycle_end (h); if (res < 0) return res; *sm = ghw_sm_sect; break; } } } int ghw_read_cycle (struct ghw_handler *h) { int res; res = ghw_read_cycle_start (h); if (res < 0) return res; while (1) { res = ghw_read_cycle_cont (h, NULL); if (res < 0) return res; if (0) printf ("Time is " GHWPRI64 " fs\n", h->snap_time); if (0) ghw_disp_values (h); res = ghw_read_cycle_next (h); if (res < 0) return res; if (res == 0) break; } res = ghw_read_cycle_end (h); return res; } int ghw_read_dump (struct ghw_handler *h) { unsigned char hdr[4]; int res; while (1) { if (fread (hdr, sizeof (hdr), 1, h->stream) != 1) { if (feof (h->stream)) return 0; else return -1; } if (memcmp (hdr, "SNP", 4) == 0) { res = ghw_read_snapshot (h); if (0 && res >= 0) ghw_disp_values (h); } else if (memcmp (hdr, "CYC", 4) == 0) { res = ghw_read_cycle (h); } else if (memcmp (hdr, "DIR", 4) == 0) { res = ghw_read_directory (h); } else if (memcmp (hdr, "TAI", 4) == 0) { res = ghw_read_tailer (h); } else { fprintf (stderr, "unknown GHW section %c%c%c%c\n", hdr[0], hdr[1], hdr[2], hdr[3]); return -1; } if (res != 0) return res; } } struct ghw_section ghw_sections[] = { { "\0\0\0", NULL }, { "STR", ghw_read_str }, { "HIE", ghw_read_hie }, { "TYP", ghw_read_type }, { "WKT", ghw_read_wk_types }, { "EOH", ghw_read_eoh }, { "SNP", ghw_read_snapshot }, { "CYC", ghw_read_cycle }, { "DIR", ghw_read_directory }, { "TAI", ghw_read_tailer } }; int ghw_read_section (struct ghw_handler *h) { unsigned char hdr[4]; unsigned i; if (fread (hdr, sizeof (hdr), 1, h->stream) != 1) { if (feof (h->stream)) return -2; else return -1; } for (i = 1; i < sizeof (ghw_sections) / sizeof (*ghw_sections); i++) if (memcmp (hdr, ghw_sections[i].name, 4) == 0) return i; fprintf (stderr, "ghw_read_section: unknown GHW section %c%c%c%c\n", hdr[0], hdr[1], hdr[2], hdr[3]); return 0; } void ghw_close (struct ghw_handler *h) { if (h->stream) { if (h->stream_ispipe) pclose (h->stream); else fclose (h->stream); h->stream = NULL; } } const char * ghw_get_dir (int is_downto) { return is_downto ? "downto" : "to"; } void ghw_disp_range (union ghw_type *type, union ghw_range *rng) { switch (rng->kind) { case ghdl_rtik_type_b2: printf ("%s %s %s", ghw_get_lit (type, rng->b2.left), ghw_get_dir (rng->b2.dir), ghw_get_lit (type, rng->b2.right)); break; case ghdl_rtik_type_e8: printf ("%s %s %s", ghw_get_lit (type, rng->e8.left), ghw_get_dir (rng->e8.dir), ghw_get_lit (type, rng->e8.right)); break; case ghdl_rtik_type_i32: case ghdl_rtik_type_p32: printf (GHWPRI32 " %s " GHWPRI32, rng->i32.left, ghw_get_dir (rng->i32.dir), rng->i32.right); break; case ghdl_rtik_type_i64: case ghdl_rtik_type_p64: printf (GHWPRI64 " %s " GHWPRI64, rng->i64.left, ghw_get_dir (rng->i64.dir), rng->i64.right); break; case ghdl_rtik_type_f64: printf ("%g %s %g", rng->f64.left, ghw_get_dir (rng->f64.dir), rng->f64.right); break; default: printf ("?(%d)", rng->kind); } } static void ghw_disp_array_subtype_bounds (struct ghw_subtype_array *a) { unsigned i; printf (" ("); for (i = 0; i < a->base->nbr_dim; i++) { if (i != 0) printf (", "); ghw_disp_range (a->base->dims[i], a->rngs[i]); } printf (")"); } static void ghw_disp_record_subtype_bounds (struct ghw_subtype_record *sr) { struct ghw_type_record *base = sr->base; int is_first = 1; unsigned i; for (i = 0; i < base->nbr_fields; i++) { if (sr->els[i].type != base->els[i].type) { if (is_first) { printf ("("); is_first = 0; } else printf (", "); printf ("%s", base->els[i].name); switch (sr->els[i].type->kind) { case ghdl_rtik_subtype_array: ghw_disp_array_subtype_bounds (&sr->els[i].type->sa); break; case ghdl_rtik_subtype_record: ghw_disp_record_subtype_bounds (&sr->els[i].type->sr); break; default: printf ("??? (%d)", sr->els[i].type->kind); } } } if (!is_first) printf (")"); } static void ghw_disp_subtype_definition (struct ghw_handler *h, union ghw_type *t) { switch (t->kind) { case ghdl_rtik_subtype_scalar: { struct ghw_subtype_scalar *s = &t->ss; ghw_disp_typename (h, s->base); printf (" range "); ghw_disp_range (s->base, s->rng); } break; case ghdl_rtik_subtype_array: { struct ghw_subtype_array *a = &t->sa; ghw_disp_typename (h, (union ghw_type *)a->base); ghw_disp_array_subtype_bounds (a); } break; case ghdl_rtik_subtype_record: { struct ghw_subtype_record *sr = &t->sr; ghw_disp_typename (h, (union ghw_type *)sr->base); ghw_disp_record_subtype_bounds (sr); } break; default: printf ("ghw_disp_subtype_definition: unhandled type kind %d\n", t->kind); } } static int ghw_is_anonymous_type (struct ghw_handler *h, union ghw_type *t) { return t->common.name == h->str_table[0]; } void ghw_disp_subtype_indication (struct ghw_handler *h, union ghw_type *t) { if (ghw_is_anonymous_type (h, t)) { /* Anonymous subtype. */ ghw_disp_subtype_definition (h, t); } else ghw_disp_typename (h, t); } void ghw_disp_type (struct ghw_handler *h, union ghw_type *t) { switch (t->kind) { case ghdl_rtik_type_b2: case ghdl_rtik_type_e8: { struct ghw_type_enum *e = &t->en; unsigned i; printf ("type %s is (", e->name); for (i = 0; i < e->nbr; i++) { if (i != 0) printf (", "); printf ("%s", e->lits[i]); } printf (");"); if (e->wkt != ghw_wkt_unknown) printf (" -- WKT:%d", e->wkt); printf ("\n"); } break; case ghdl_rtik_type_i32: case ghdl_rtik_type_f64: { struct ghw_type_scalar *s = &t->sc; printf ("type %s is range <>;\n", s->name); } break; case ghdl_rtik_type_p32: case ghdl_rtik_type_p64: { unsigned i; struct ghw_type_physical *p = &t->ph; printf ("type %s is range <> units\n", p->name); for (i = 0; i < p->nbr_units; i++) { struct ghw_unit *u = &p->units[i]; printf (" %s = " GHWPRI64 " %s;\n", u->name, u->val, p->units[0].name); } printf ("end units\n"); } break; case ghdl_rtik_type_array: { struct ghw_type_array *a = &t->ar; unsigned i; printf ("type %s is array (", a->name); for (i = 0; i < a->nbr_dim; i++) { if (i != 0) printf (", "); ghw_disp_typename (h, a->dims[i]); printf (" range <>"); } printf (") of "); ghw_disp_subtype_indication (h, a->el); printf (";\n"); } break; case ghdl_rtik_type_record: { struct ghw_type_record *r = &t->rec; unsigned i; printf ("type %s is record\n", r->name); for (i = 0; i < r->nbr_fields; i++) { printf (" %s: ", r->els[i].name); ghw_disp_subtype_indication (h, r->els[i].type); printf (";\n"); } printf ("end record;\n"); } break; case ghdl_rtik_subtype_array: case ghdl_rtik_subtype_scalar: case ghdl_rtik_subtype_record: { struct ghw_type_common *c = &t->common; printf ("subtype %s is ", c->name); ghw_disp_subtype_definition (h, t); printf (";\n"); } break; default: printf ("ghw_disp_type: unhandled type kind %d\n", t->kind); } } void ghw_disp_types (struct ghw_handler *h) { unsigned i; for (i = 0; i < h->nbr_types; i++) if (h->flag_verbose || !ghw_is_anonymous_type (h, h->types[i])) ghw_disp_type (h, h->types[i]); } gtkwave-3.3.86/src/vcd.h0000664000175000017500000000610013166335473014315 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2010. * * 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. */ #include "globals.h" #ifndef VCD_H #define VCD_H #include #include #ifndef _MSC_VER #include #endif #ifndef HAVE_FSEEKO #define fseeko fseek #define ftello ftell #endif #include #include #ifdef HAVE_SYS_STAT_H #include #endif #include #include #include "symbol.h" #include "wavealloca.h" #include "debug.h" #include "tree.h" #define VCD_SIZE_WARN (256) /* number of MB size where converter warning message appears */ #define VCD_BSIZ 32768 /* size of getch() emulation buffer--this val should be ok */ #define VCD_INDEXSIZ (8 * 1024 * 1024) #define vcd_exit(x) \ if(GLOBALS->vcd_jmp_buf) \ { \ splash_finalize(); \ longjmp(*(GLOBALS->vcd_jmp_buf), x); \ } \ else \ { \ exit(x); \ } enum VCDName_ByteSubstitutions { VCDNAM_NULL=0, #ifdef WAVE_HIERFIX VCDNAM_HIERSORT, #endif VCDNAM_ESCAPE }; /* fix for contrib/rtlbrowse */ #ifndef VLEX_DEFINES_H enum VarTypes { V_EVENT, V_PARAMETER, V_INTEGER, V_REAL, V_REAL_PARAMETER=V_REAL, V_REALTIME=V_REAL, V_SHORTREAL=V_REAL, V_REG, V_SUPPLY0, V_SUPPLY1, V_TIME, V_TRI, V_TRIAND, V_TRIOR, V_TRIREG, V_TRI0, V_TRI1, V_WAND, V_WIRE, V_WOR, V_PORT, V_IN=V_PORT, V_OUT=V_PORT, V_INOUT=V_PORT, V_BIT, V_LOGIC, V_INT, V_SHORTINT, V_LONGINT, V_BYTE, V_ENUM, V_STRINGTYPE, V_END, V_LB, V_COLON, V_RB, V_STRING }; #endif /* for vcd_recoder.c */ enum FastloadState { VCD_FSL_NONE, VCD_FSL_WRITE, VCD_FSL_READ }; TimeType vcd_main(char *fname); TimeType vcd_recoder_main(char *fname); TimeType vcd_partial_main(char *fname); void vcd_partial_mark_and_sweep(int mandclear); void kick_partial_vcd(void); struct sym_chain { struct sym_chain *next; struct symbol *val; }; struct slist { struct slist *next; char *str; struct tree *mod_tree_parent; int len; }; #ifdef WAVE_USE_STRUCT_PACKING #pragma pack(push) #pragma pack(1) #endif struct vcdsymbol { struct vcdsymbol *root, *chain; struct symbol *sym_chain; struct vcdsymbol *next; char *name; char *id; char *value; struct Node **narray; hptr *tr_array; /* points to synthesized trailers (which can move) */ hptr *app_array; /* points to hptr to append to (which can move) */ unsigned int nid; int msi, lsi; int size; unsigned char vartype; }; #ifdef WAVE_USE_STRUCT_PACKING #pragma pack(pop) #endif char *build_slisthier(void); void append_vcd_slisthier(char *str); struct HistEnt *histent_calloc(void); void strcpy_vcdalt(char *too, char *from, char delim); int strcpy_delimfix(char *too, char *from); void vcd_sortfacs(void); void set_vcd_vartype(struct vcdsymbol *v, nptr n); void vcd_import_masked(void); void vcd_set_fac_process_mask(nptr np); void import_vcd_trace(nptr np); int vcd_keyword_code(const char *s, unsigned int len); #endif gtkwave-3.3.86/src/ghwlib.h0000664000175000017500000002215613166335473015026 0ustar bybellbybell/* GHDL Wavefile reader library. Copyright (C) 2005-2017 Tristan Gingold GHDL 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, or (at your option) any later version. GHDL 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 GCC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _GHWLIB_H_ #define _GHWLIB_H_ #include #include #ifdef HAVE_CONFIG_H #include "config.h" #endif /* The ghwlib uses the standard c99 int32_t and int64_t. They are declared in stdint.h. Header inttypes.h includes stdint.h and provides macro for printf and co specifiers. Use it if known to be available. */ #if defined(__cplusplus) \ || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) \ || defined(HAVE_INTTYPES_H) /* Use C99 standard header. */ # include # define GHWPRI64 "%"PRId64 # define GHWPRI32 "%"PRId32 #else # include # define GHWPRI64 "%lld" # define GHWPRI32 "%d" #endif enum ghdl_rtik { ghdl_rtik_top, /* 0 */ ghdl_rtik_library, ghdl_rtik_package, ghdl_rtik_package_body, ghdl_rtik_entity, ghdl_rtik_architecture, /* 5 */ ghdl_rtik_process, ghdl_rtik_block, ghdl_rtik_if_generate, ghdl_rtik_for_generate, ghdl_rtik_instance, ghdl_rtik_constant, ghdl_rtik_iterator, ghdl_rtik_variable, ghdl_rtik_signal, ghdl_rtik_file, ghdl_rtik_port, ghdl_rtik_generic, ghdl_rtik_alias, ghdl_rtik_guard, ghdl_rtik_component, ghdl_rtik_attribute, ghdl_rtik_type_b2, /* 22 */ ghdl_rtik_type_e8, ghdl_rtik_type_e32, ghdl_rtik_type_i32, /* 25 */ ghdl_rtik_type_i64, ghdl_rtik_type_f64, ghdl_rtik_type_p32, ghdl_rtik_type_p64, ghdl_rtik_type_access, /* 30 */ ghdl_rtik_type_array, ghdl_rtik_type_record, ghdl_rtik_type_file, ghdl_rtik_subtype_scalar, ghdl_rtik_subtype_array, /* 35 */ ghdl_rtik_subtype_array_ptr, /* Obsolete. */ ghdl_rtik_subtype_unconstrained_array, /* Obsolete. */ ghdl_rtik_subtype_record, ghdl_rtik_subtype_access, ghdl_rtik_type_protected, ghdl_rtik_element, ghdl_rtik_unit, ghdl_rtik_attribute_transaction, ghdl_rtik_attribute_quiet, ghdl_rtik_attribute_stable, ghdl_rtik_error }; /* Well-known types. */ enum ghw_wkt_type { ghw_wkt_unknown, ghw_wkt_boolean, ghw_wkt_bit, ghw_wkt_std_ulogic }; struct ghw_range_b2 { enum ghdl_rtik kind : 8; int dir : 8; /* 0: to, !0: downto. */ unsigned char left; unsigned char right; }; struct ghw_range_e8 { enum ghdl_rtik kind : 8; int dir : 8; /* 0: to, !0: downto. */ unsigned char left; unsigned char right; }; struct ghw_range_i32 { enum ghdl_rtik kind : 8; int dir : 8; /* 0: to, !0: downto. */ int32_t left; int32_t right; }; struct ghw_range_i64 { enum ghdl_rtik kind : 8; int dir : 8; int64_t left; int64_t right; }; struct ghw_range_f64 { enum ghdl_rtik kind : 8; int dir : 8; double left; double right; }; union ghw_range { enum ghdl_rtik kind : 8; struct ghw_range_b2 b2; struct ghw_range_e8 e8; struct ghw_range_i32 i32; struct ghw_range_i64 i64; struct ghw_range_f64 f64; }; /* Note: the first two fields must be kind and name. */ union ghw_type; struct ghw_type_common { enum ghdl_rtik kind; const char *name; }; struct ghw_type_enum { enum ghdl_rtik kind; const char *name; enum ghw_wkt_type wkt; unsigned int nbr; const char **lits; }; struct ghw_type_scalar { enum ghdl_rtik kind; const char *name; }; struct ghw_unit { const char *name; int64_t val; }; struct ghw_type_physical { enum ghdl_rtik kind; const char *name; uint32_t nbr_units; struct ghw_unit *units; }; struct ghw_type_array { enum ghdl_rtik kind; const char *name; unsigned int nbr_dim; union ghw_type *el; union ghw_type **dims; }; struct ghw_subtype_array { enum ghdl_rtik kind; const char *name; struct ghw_type_array *base; int nbr_scalars; union ghw_range **rngs; }; struct ghw_subtype_scalar { enum ghdl_rtik kind; const char *name; union ghw_type *base; union ghw_range *rng; }; struct ghw_record_element { const char *name; union ghw_type *type; }; struct ghw_type_record { enum ghdl_rtik kind; const char *name; unsigned int nbr_fields; int nbr_scalars; /* Number of scalar elements (ie nbr of signals). */ struct ghw_record_element *els; }; struct ghw_subtype_record { enum ghdl_rtik kind; const char *name; struct ghw_type_record *base; int nbr_scalars; /* Number of scalar elements (ie nbr of signals). */ struct ghw_record_element *els; }; union ghw_type { enum ghdl_rtik kind; struct ghw_type_common common; struct ghw_type_enum en; struct ghw_type_scalar sc; struct ghw_type_physical ph; struct ghw_subtype_scalar ss; struct ghw_subtype_array sa; struct ghw_subtype_record sr; struct ghw_type_array ar; struct ghw_type_record rec; }; union ghw_val { unsigned char b2; unsigned char e8; int32_t i32; int64_t i64; double f64; }; /* A non-composite signal. */ struct ghw_sig { union ghw_type *type; union ghw_val *val; }; enum ghw_hie_kind { ghw_hie_eoh = 0, ghw_hie_design = 1, ghw_hie_block = 3, ghw_hie_generate_if = 4, ghw_hie_generate_for = 5, ghw_hie_instance = 6, ghw_hie_package = 7, ghw_hie_process = 13, ghw_hie_generic = 14, ghw_hie_eos = 15, ghw_hie_signal = 16, ghw_hie_port_in = 17, ghw_hie_port_out = 18, ghw_hie_port_inout = 19, ghw_hie_port_buffer = 20, ghw_hie_port_linkage = 21 }; #define GHW_NO_SIG 0 struct ghw_hie { enum ghw_hie_kind kind; struct ghw_hie *parent; const char *name; struct ghw_hie *brother; union { struct { struct ghw_hie *child; union ghw_type *iter_type; union ghw_val *iter_value; } blk; struct { union ghw_type *type; /* Array of signal elements. Last element is GHW_NO_SIG (0). */ unsigned int *sigs; } sig; } u; }; struct ghw_handler { FILE *stream; /* True if STREAM was popen, else was fopen. */ unsigned char stream_ispipe; /* True if words are big-endian. */ unsigned char word_be; unsigned char word_len; unsigned char off_len; /* Minor version. */ int version; /* Set by user. */ int flag_verbose; /* String table. */ /* Number of strings. */ unsigned nbr_str; /* Size of the strings (without nul). */ unsigned str_size; /* String table. */ char **str_table; /* Array containing strings. */ char *str_content; /* Type table. */ unsigned nbr_types; union ghw_type **types; /* Non-composite (or basic) signals. */ unsigned nbr_sigs; char *skip_sigs; int flag_full_names; struct ghw_sig *sigs; /* Hierarchy. */ struct ghw_hie *hie; /* Time of the next cycle. */ int64_t snap_time; }; /* Open a GHW file with H. Return < 0 in case of error. */ int ghw_open (struct ghw_handler *h, const char *filename); /* Return base type of T. */ union ghw_type *ghw_get_base_type (union ghw_type *t); /* Return length of RNG. */ int ghw_get_range_length (union ghw_range *rng); /* Put the ASCII representation of VAL into BUF, whose size if LEN. A NUL is always written to BUF. */ void ghw_get_value (char *buf, int len, union ghw_val *val, union ghw_type *type); const char *ghw_get_hie_name (struct ghw_hie *h); void ghw_disp_hie (struct ghw_handler *h, struct ghw_hie *top); int ghw_read_base (struct ghw_handler *h); void ghw_filter_signals (struct ghw_handler *h, int *signals_to_keep, int nb_signals_to_keep); void ghw_disp_values (struct ghw_handler *h); int ghw_read_cycle_start (struct ghw_handler *h); int ghw_read_cycle_cont (struct ghw_handler *h, int *list); int ghw_read_cycle_next (struct ghw_handler *h); int ghw_read_cycle_end (struct ghw_handler *h); enum ghw_sm_type { /* At init; Read section name. */ ghw_sm_init = 0, ghw_sm_sect = 1, ghw_sm_cycle = 2 }; enum ghw_res { ghw_res_error = -1, ghw_res_eof = -2, ghw_res_ok = 0, ghw_res_snapshot = 1, ghw_res_cycle = 2, ghw_res_other = 3 }; int ghw_read_sm (struct ghw_handler *h, enum ghw_sm_type *sm); int ghw_read_dump (struct ghw_handler *h); struct ghw_section { const char name[4]; int (*handler)(struct ghw_handler *h); }; extern struct ghw_section ghw_sections[]; int ghw_read_section (struct ghw_handler *h); void ghw_close (struct ghw_handler *h); const char *ghw_get_dir (int is_downto); void ghw_disp_subtype_indication (struct ghw_handler *h, union ghw_type *t); /* Note: TYPE must be a base type (used only to display literals). */ void ghw_disp_range (union ghw_type *type, union ghw_range *rng); void ghw_disp_type (struct ghw_handler *h, union ghw_type *t); void ghw_disp_types (struct ghw_handler *h); #endif /* _GHWLIB_H_ */ gtkwave-3.3.86/src/busy.c0000664000175000017500000000731713166335473014531 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2006-2009. * * 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. */ #include "globals.h" #include #include "busy.h" static int inside_iteration = 0; void gtk_events_pending_gtk_main_iteration(void) { inside_iteration++; while (gtk_events_pending()) gtk_main_iteration(); inside_iteration--; } gboolean in_main_iteration(void) { return(inside_iteration != 0); } gboolean ignore_context_swap(void) { return(GLOBALS->splash_is_loading != 0); } static void GuiDoEvent(GdkEvent *event, gpointer data) { (void)data; if(!GLOBALS->busy_busy_c_1) { gtk_main_do_event(event); } else { /* filter out user input when we're "busy" */ /* originally we allowed these two sets only... */ /* usual expose events */ /* case GDK_CONFIGURE: */ /* case GDK_EXPOSE: */ /* needed to keep dnd from hanging */ /* case GDK_ENTER_NOTIFY: */ /* case GDK_LEAVE_NOTIFY: */ /* case GDK_FOCUS_CHANGE: */ /* case GDK_MAP: */ /* now it has been updated to remove keyboard/mouse input */ switch (event->type) { /* more may be needed to be added in the future */ case GDK_MOTION_NOTIFY: case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: case GDK_3BUTTON_PRESS: case GDK_BUTTON_RELEASE: case GDK_KEY_PRESS: case GDK_KEY_RELEASE: #if GTK_CHECK_VERSION(2,6,0) case GDK_SCROLL: #endif /* printf("event->type: %d\n", event->type); */ break; default: gtk_main_do_event(event); /* printf("event->type: %d\n", event->type); */ break; } } } void gtkwave_main_iteration(void) { if(GLOBALS->partial_vcd) { gtk_events_pending_gtk_main_iteration(); } else { struct Global *g_old = GLOBALS; struct Global *gcache = NULL; set_window_busy(NULL); while (gtk_events_pending()) { gtk_main_iteration(); if(GLOBALS != g_old) { /* this should never happen! */ /* if it does, the program state is probably screwed */ fprintf(stderr, "GTKWAVE | WARNING: globals changed during gtkwave_main_iteration()!\n"); gcache = GLOBALS; } } set_GLOBALS(g_old); set_window_idle(NULL); if(gcache) { set_GLOBALS(gcache); } } } void init_busy(void) { GLOBALS->busycursor_busy_c_1 = gdk_cursor_new(GDK_WATCH); gdk_event_handler_set((GdkEventFunc)GuiDoEvent, NULL, NULL); } void set_window_busy_no_refresh(GtkWidget *w) { unsigned int i; /* if(GLOBALS->tree_dnd_begin) return; */ if(!GLOBALS->busy_busy_c_1) { if(w) gdk_window_set_cursor (w->window, GLOBALS->busycursor_busy_c_1); else if(GLOBALS->mainwindow) gdk_window_set_cursor (GLOBALS->mainwindow->window, GLOBALS->busycursor_busy_c_1); } GLOBALS->busy_busy_c_1++; for(i=0;inum_notebook_pages;i++) { (*GLOBALS->contexts)[i]->busy_busy_c_1 = GLOBALS->busy_busy_c_1; } } void set_window_busy(GtkWidget *w) { set_window_busy_no_refresh(w); busy_window_refresh(); } void set_window_idle(GtkWidget *w) { unsigned int i; /* if(GLOBALS->tree_dnd_begin) return; */ if(GLOBALS->busy_busy_c_1) { if(GLOBALS->busy_busy_c_1 <= 1) /* defensively, in case something causes the value to go below zero */ { if(w) gdk_window_set_cursor (w->window, NULL); else if(GLOBALS->mainwindow) gdk_window_set_cursor (GLOBALS->mainwindow->window, NULL); } GLOBALS->busy_busy_c_1--; for(i=0;inum_notebook_pages;i++) { (*GLOBALS->contexts)[i]->busy_busy_c_1 = GLOBALS->busy_busy_c_1; } } } void busy_window_refresh(void) { if(GLOBALS->busy_busy_c_1) { gtk_events_pending_gtk_main_iteration(); } } gtkwave-3.3.86/src/edgebuttons.c0000664000175000017500000003243513166335473016071 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2008-2012. * * 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. */ #include "globals.h" #include #include "currenttime.h" #include "pixmaps.h" #include "strace.h" #include "debug.h" static Trptr find_first_highlighted_trace(void) { Trptr t = NULL; for(t=GLOBALS->traces.first;t;t=t->t_next) { if ((t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))||(!(t->flags&TR_HIGHLIGHT))||(!(t->name))) { continue; } else { break; } } return(t); } static Trptr find_next_highlighted_trace(Trptr t) { if(t) { t = t->t_next; for(;t;t=t->t_next) { if ((t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))||(!(t->flags&TR_HIGHLIGHT))||(!(t->name))) { continue; } else { break; } } } return(t); } /************************************************/ /* * strace backward or forward..this was cut and * pasted from strace.c and special cased to handle * just a single trace. this might be relaxed later. */ static void edge_search_2(int direction, int is_last_iteration) { struct strace s_tmp; struct strace *s_head, *s; TimeType basetime, maxbase, sttim, fintim; Trptr t = find_first_highlighted_trace(); int totaltraces; #ifdef DEBUG_PRINTF int passcount; #endif int whichpass; TimeType middle=0, width; if(!t) return; memset(s_head = &s_tmp, 0, sizeof(struct strace)); s_head->trace = t; s_head->value = ST_ANY; s = s_head; while(t) { t = find_next_highlighted_trace(t); if(t) { s->next = wave_alloca(sizeof(struct strace)); memset(s = s->next, 0, sizeof(struct strace)); s->trace = t; s->value = ST_ANY; } } if(direction==STRACE_BACKWARD) /* backwards */ { if(GLOBALS->tims.marker<0) { basetime=MAX_HISTENT_TIME; } else { basetime=GLOBALS->tims.marker; } } else /* go forwards */ { if(GLOBALS->tims.marker<0) { basetime=GLOBALS->tims.first; } else { basetime=GLOBALS->tims.marker; } } sttim=GLOBALS->tims.first; fintim=GLOBALS->tims.last; for(whichpass=0;;whichpass++) { if(direction==STRACE_BACKWARD) /* backwards */ { maxbase=-1; s=s_head; while(s) { t=s->trace; GLOBALS->shift_timebase=t->shift; if(!(t->vector)) { hptr h; hptr *hp; UTimeType utt; TimeType tt; /* h= */ bsearch_node(t->n.nd, basetime - t->shift); /* scan-build */ hp=GLOBALS->max_compare_index; if((hp==&(t->n.nd->harray[1]))||(hp==&(t->n.nd->harray[0]))) return; if(basetime == ((*hp)->time+GLOBALS->shift_timebase)) hp--; h=*hp; s->his.h=h; utt=strace_adjust(h->time,GLOBALS->shift_timebase); tt=utt; if(tt > maxbase) maxbase=tt; } else { vptr v; vptr *vp; UTimeType utt; TimeType tt; /* v= */ bsearch_vector(t->n.vec, basetime - t->shift); /* scan-build */ vp=GLOBALS->vmax_compare_index; if((vp==&(t->n.vec->vectors[1]))||(vp==&(t->n.vec->vectors[0]))) return; if(basetime == ((*vp)->time+GLOBALS->shift_timebase)) vp--; v=*vp; s->his.v=v; utt=strace_adjust(v->time,GLOBALS->shift_timebase); tt=utt; if(tt > maxbase) maxbase=tt; } s=s->next; } } else /* go forward */ { maxbase=MAX_HISTENT_TIME; s=s_head; while(s) { t=s->trace; GLOBALS->shift_timebase=t->shift; if(!(t->vector)) { hptr h; UTimeType utt; TimeType tt; h=bsearch_node(t->n.nd, basetime - t->shift); while(h->next && h->time==h->next->time) h=h->next; if((whichpass)||(GLOBALS->tims.marker>=0)) h=h->next; if(!h) return; s->his.h=h; utt=strace_adjust(h->time,GLOBALS->shift_timebase); tt=utt; if(tt < maxbase) maxbase=tt; } else { vptr v; UTimeType utt; TimeType tt; v=bsearch_vector(t->n.vec, basetime - t->shift); while(v->next && v->time==v->next->time) v=v->next; if((whichpass)||(GLOBALS->tims.marker>=0)) v=v->next; if(!v) return; s->his.v=v; utt=strace_adjust(v->time,GLOBALS->shift_timebase); tt=utt; if(tt < maxbase) maxbase=tt; } s=s->next; } } s=s_head; totaltraces=0; /* increment when not don't care */ while(s) { /* commented out, maybe will have possible future expansion later, * this was cut and pasted from strace.c */ #if 0 char str[2]; #endif t=s->trace; s->search_result=0; /* explicitly must set this */ GLOBALS->shift_timebase=t->shift; if((!t->vector)&&(!(t->n.nd->extvals))) { if(strace_adjust(s->his.h->time,GLOBALS->shift_timebase)!=maxbase) { s->his.h=bsearch_node(t->n.nd, maxbase - t->shift); while(s->his.h->next && s->his.h->time==s->his.h->next->time) s->his.h=s->his.h->next; } /* commented out, maybe will have possible future expansion later, * this was cut and pasted from strace.c */ #if 0 if(t->flags&TR_INVERT) { str[0]=AN_STR_INV[s->his.h->v.h_val]; } else { str[0]=AN_STR[s->his.h->v.h_val]; } str[1]=0x00; #endif switch(s->value) { case ST_ANY: totaltraces++; s->search_result=1; break; /* commented out, maybe will have possible future expansion later, * this was cut and pasted from strace.c */ #if 0 case ST_DC: break; case ST_HIGH: totaltraces++; if((str[0]=='1')||(str[0]=='H')) s->search_result=1; break; case ST_RISE: if((str[0]=='1')||(str[0]=='H')) s->search_result=1; totaltraces++; break; case ST_LOW: totaltraces++; if((str[0]=='0')||(str[0]=='L')) s->search_result=1; break; case ST_FALL: totaltraces++; if((str[0]=='0')||(str[0]=='L')) s->search_result=1; break; case ST_MID: totaltraces++; if(str[0]=='Z') s->search_result=1; break; case ST_X: totaltraces++; if(str[0]=='X') s->search_result=1; break; case ST_STRING: totaltraces++; if(s->string) if(strstr_i(s->string,str)) s->search_result=1; break; #endif default: fprintf(stderr, "Internal error: st_type of %d\n",s->value); exit(255); } } else { char *chval, *chval2; char ch; if(t->vector) { if(strace_adjust(s->his.v->time,GLOBALS->shift_timebase)!=maxbase) { s->his.v=bsearch_vector(t->n.vec, maxbase - t->shift); while(s->his.v->next && s->his.v->time==s->his.v->next->time) s->his.v=s->his.v->next; } chval=convert_ascii(t,s->his.v); } else { if(strace_adjust(s->his.h->time,GLOBALS->shift_timebase)!=maxbase) { s->his.h=bsearch_node(t->n.nd, maxbase - t->shift); while(s->his.h->next && s->his.h->time==s->his.h->next->time) s->his.h=s->his.h->next; } if(s->his.h->flags&HIST_REAL) { if(!(s->his.h->flags&HIST_STRING)) { #ifdef WAVE_HAS_H_DOUBLE chval=convert_ascii_real(t, &s->his.h->v.h_double); #else chval=convert_ascii_real(t, (double *)s->his.h->v.h_vector); #endif } else { chval=convert_ascii_string((char *)s->his.h->v.h_vector); chval2=chval; while((ch=*chval2)) /* toupper() the string */ { if((ch>='a')&&(ch<='z')) { *chval2= ch-('a'-'A'); } chval2++; } } } else { chval=convert_ascii_vec(t,s->his.h->v.h_vector); } } switch(s->value) { case ST_ANY: totaltraces++; s->search_result=1; break; /* commented out, maybe will have possible future expansion later, * this was cut and pasted from strace.c */ #if 0 case ST_DC: break; case ST_RISE: case ST_FALL: totaltraces++; break; case ST_HIGH: totaltraces++; if((chval2=chval)) while((ch=*(chval2++))) { if(((ch>='1')&&(ch<='9'))||(ch=='h')||(ch=='H')||((ch>='A')&&(ch<='F'))) { s->search_result=1; break; } } break; case ST_LOW: totaltraces++; if((chval2=chval)) { s->search_result=1; while((ch=*(chval2++))) { if((ch!='0')&&(ch!='l')&&(ch!='L')) { s->search_result=0; break; } } } break; case ST_MID: totaltraces++; if((chval2=chval)) { s->search_result=1; while((ch=*(chval2++))) { if((ch!='z')&&(ch!='Z')) { s->search_result=0; break; } } } break; case ST_X: totaltraces++; if((chval2=chval)) { s->search_result=1; while((ch=*(chval2++))) { if((ch!='X')&&(ch!='W')&&(ch!='x')&&(ch!='w')) { s->search_result=0; break; } } } break; case ST_STRING: totaltraces++; if(s->string) if(strstr_i(chval, s->string)) s->search_result=1; break; #endif default: fprintf(stderr, "Internal error: st_type of %d\n",s->value); exit(255); } free_2(chval); } s=s->next; } if((maxbasefintim)) return; #ifdef DEBUG_PRINTF DEBUG(printf("Maxbase: "TTFormat", total traces: %d\n",maxbase, totaltraces)); s=s_head; passcount=0; while(s) { DEBUG(printf("\tPass: %d, Name: %s\n",s->search_result, s->trace->name)); if(s->search_result) passcount++; s=s->next; } #endif if(totaltraces) { break; } basetime=maxbase; } GLOBALS->tims.marker=maxbase; if(is_last_iteration) { update_markertime(GLOBALS->tims.marker); width=(TimeType)(((gdouble)GLOBALS->wavewidth)*GLOBALS->nspx); if((GLOBALS->tims.markertims.start)||(GLOBALS->tims.marker>=GLOBALS->tims.start+width)) { if((GLOBALS->tims.marker<0)||(GLOBALS->tims.markertims.first)||(GLOBALS->tims.marker>GLOBALS->tims.last)) { if(GLOBALS->tims.end>GLOBALS->tims.last) GLOBALS->tims.end=GLOBALS->tims.last; middle=(GLOBALS->tims.start/2)+(GLOBALS->tims.end/2); if((GLOBALS->tims.start&1)&&(GLOBALS->tims.end&1)) middle++; } else { middle=GLOBALS->tims.marker; } GLOBALS->tims.start=time_trunc(middle-(width/2)); if(GLOBALS->tims.start+width>GLOBALS->tims.last) GLOBALS->tims.start=GLOBALS->tims.last-width; if(GLOBALS->tims.starttims.first) GLOBALS->tims.start=GLOBALS->tims.first; GTK_ADJUSTMENT(GLOBALS->wave_hslider)->value=GLOBALS->tims.timecache=GLOBALS->tims.start; } MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } } void edge_search(int direction) { int i; int i_high_cnt = ((GLOBALS->strace_repeat_count > 0) ? GLOBALS->strace_repeat_count : 1) - 1; for(i=0;i<=i_high_cnt;i++) { edge_search_2(direction, (i == i_high_cnt)); } } /************************************************/ void service_left_edge(GtkWidget *text, gpointer data) { (void)text; (void)data; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nFind Previous Edge"); help_text( " moves the marker to the closest transition to the left of the marker" " of the first highlighted trace. If the marker is not nailed down, it starts from max time." ); return; } edge_search(STRACE_BACKWARD); DEBUG(printf("Edge Left\n")); } void service_right_edge(GtkWidget *text, gpointer data) { (void)text; (void)data; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nFind Next Edge"); help_text( " moves the marker to the closest transition to the right of the marker" " of the first highlighted trace. If the marker is not nailed down, it starts from min time." ); return; } edge_search(STRACE_FORWARD); DEBUG(printf("Edge Right\n")); } /* Create shift buttons */ GtkWidget * create_edge_buttons (void) { GtkWidget *table; GtkWidget *table2; GtkWidget *frame; GtkWidget *main_vbox; GtkWidget *b1; GtkWidget *b2; GtkWidget *pixmapwid1, *pixmapwid2; GtkTooltips *tooltips; tooltips=gtk_tooltips_new_2(); gtk_tooltips_set_delay_2(tooltips,1500); pixmapwid1=gtk_pixmap_new(GLOBALS->larrow_pixmap, GLOBALS->larrow_mask); gtk_widget_show(pixmapwid1); pixmapwid2=gtk_pixmap_new(GLOBALS->rarrow_pixmap, GLOBALS->rarrow_mask); gtk_widget_show(pixmapwid2); /* Create a table to hold the text widget and scrollbars */ table = gtk_table_new (1, 1, FALSE); main_vbox = gtk_vbox_new (FALSE, 1); gtk_container_border_width (GTK_CONTAINER (main_vbox), 1); gtk_container_add (GTK_CONTAINER (table), main_vbox); frame = gtk_frame_new ("Edge "); gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0); gtk_widget_show (frame); gtk_widget_show (main_vbox); table2 = gtk_table_new (2, 1, FALSE); b1 = gtk_button_new(); gtk_container_add(GTK_CONTAINER(b1), pixmapwid1); gtk_table_attach (GTK_TABLE (table2), b1, 0, 1, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); gtk_signal_connect_object (GTK_OBJECT (b1), "clicked", GTK_SIGNAL_FUNC(service_left_edge), GTK_OBJECT (table2)); gtk_tooltips_set_tip_2(tooltips, b1, "Find next transition of highlighted trace scanning left", NULL); gtk_widget_show(b1); b2 = gtk_button_new(); gtk_container_add(GTK_CONTAINER(b2), pixmapwid2); gtk_table_attach (GTK_TABLE (table2), b2, 0, 1, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); gtk_signal_connect_object (GTK_OBJECT (b2), "clicked", GTK_SIGNAL_FUNC(service_right_edge), GTK_OBJECT (table2)); gtk_tooltips_set_tip_2(tooltips, b2, "Find next transition of highlighted trace scanning right", NULL); gtk_widget_show(b2); gtk_container_add (GTK_CONTAINER (frame), table2); gtk_widget_show(table2); return(table); } gtkwave-3.3.86/src/gnu_regex.c0000664000175000017500000055742213166335473015541 0ustar bybellbybell/* Extended regular expression matching and search library, version 0.12. (Implements POSIX draft P1003.2/D11.2, except for some of the internationalization features.) Copyright (C) 1993, 94, 95, 96, 97, 98, 99 Free Software Foundation, Inc. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street - Suite 500, Boston, MA 02110-1335, USA. */ /* AIX requires this to be the first thing in the file. */ #if defined _AIX && !defined REGEX_MALLOC #pragma alloca #endif #ifdef REGEX_MAY_COMPILE #undef _GNU_SOURCE #define _GNU_SOURCE #ifdef HAVE_CONFIG_H # include #endif /* fix for 64-bit OSX compiles */ #define GR_INT int #ifndef PARAMS # if defined __GNUC__ || (defined __STDC__ && __STDC__) # define PARAMS(args) args # else # define PARAMS(args) () # endif /* GCC. */ #endif /* Not PARAMS. */ #if defined STDC_HEADERS && !defined emacs # include #else /* We need this for `regex.h', and perhaps for the Emacs include files. */ # include #endif #ifdef __osf__ #include #endif #define WIDE_CHAR_SUPPORT (HAVE_WCTYPE_H && HAVE_WCHAR_H && HAVE_BTOWC) /* For platform which support the ISO C amendement 1 functionality we support user defined character classes. */ #if defined _LIBC || WIDE_CHAR_SUPPORT /* Solaris 2.5 has a bug: must be included before . */ # include # include #endif #ifdef _LIBC /* We have to keep the namespace clean. */ # define regfree(preg) __regfree (preg) # define regexec(pr, st, nm, pm, ef) __regexec (pr, st, nm, pm, ef) # define regcomp(preg, pattern, cflags) __regcomp (preg, pattern, cflags) # define regerror(errcode, preg, errbuf, errbuf_size) \ __regerror(errcode, preg, errbuf, errbuf_size) # define re_set_registers(bu, re, nu, st, en) \ __re_set_registers (bu, re, nu, st, en) # define re_match_2(bufp, string1, size1, string2, size2, pos, regs, stop) \ __re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop) # define re_match(bufp, string, size, pos, regs) \ __re_match (bufp, string, size, pos, regs) # define re_search(bufp, string, size, startpos, range, regs) \ __re_search (bufp, string, size, startpos, range, regs) # define re_compile_pattern(pattern, length, bufp) \ __re_compile_pattern (pattern, length, bufp) # define re_set_syntax(syntax) __re_set_syntax (syntax) # define re_search_2(bufp, st1, s1, st2, s2, startpos, range, regs, stop) \ __re_search_2 (bufp, st1, s1, st2, s2, startpos, range, regs, stop) # define re_compile_fastmap(bufp) __re_compile_fastmap (bufp) #define btowc __btowc #endif /* This is for other GNU distributions with internationalized messages. */ #if HAVE_LIBINTL_H || defined _LIBC # include #else # define gettext(msgid) (msgid) #endif #ifndef gettext_noop /* This define is so xgettext can find the internationalizable strings. */ # define gettext_noop(String) String #endif /* The `emacs' switch turns on certain matching commands that make sense only in Emacs. */ #ifdef emacs # include "lisp.h" # include "buffer.h" # include "syntax.h" #else /* not emacs */ /* If we are not linking with Emacs proper, we can't use the relocating allocator even if config.h says that we can. */ # undef REL_ALLOC # if defined STDC_HEADERS || defined _LIBC # include # else char *malloc (); char *realloc (); # endif /* When used in Emacs's lib-src, we need to get bzero and bcopy somehow. If nothing else has been done, use the method below. */ # ifdef INHIBIT_STRING_HEADER # if !(defined HAVE_BZERO && defined HAVE_BCOPY) # if !defined bzero && !defined bcopy # undef INHIBIT_STRING_HEADER # endif # endif # endif /* This is the normal way of making sure we have a bcopy and a bzero. This is used in most programs--a few other programs avoid this by defining INHIBIT_STRING_HEADER. */ # ifndef INHIBIT_STRING_HEADER # if defined HAVE_STRING_H || defined STDC_HEADERS || defined _LIBC # include # ifndef bzero # ifndef _LIBC # define bzero(s, n) (memset (s, '\0', n), (s)) # else # define bzero(s, n) __bzero (s, n) # endif # endif # else # include # ifndef memcmp # define memcmp(s1, s2, n) bcmp (s1, s2, n) # endif # ifndef memcpy # define memcpy(d, s, n) (bcopy (s, d, n), (d)) # endif # endif # endif /* Define the syntax stuff for \<, \>, etc. */ /* This must be nonzero for the wordchar and notwordchar pattern commands in re_match_2. */ # ifndef Sword # define Sword 1 # endif # ifdef SWITCH_ENUM_BUG # define SWITCH_ENUM_CAST(x) ((int)(x)) # else # define SWITCH_ENUM_CAST(x) (x) # endif /* How many characters in the character set. */ # define CHAR_SET_SIZE 256 # ifdef SYNTAX_TABLE extern char *re_syntax_table; # else /* not SYNTAX_TABLE */ static char re_syntax_table[CHAR_SET_SIZE]; static void init_syntax_once () { register int c; static int done; if (done) return; bzero (re_syntax_table, sizeof re_syntax_table); for (c = 'a'; c <= 'z'; c++) re_syntax_table[c] = Sword; for (c = 'A'; c <= 'Z'; c++) re_syntax_table[c] = Sword; for (c = '0'; c <= '9'; c++) re_syntax_table[c] = Sword; re_syntax_table['_'] = Sword; done = 1; } # endif /* not SYNTAX_TABLE */ # define SYNTAX(c) re_syntax_table[c] #endif /* not emacs */ /* Get the interface, including the syntax bits. */ #include "gnu_regex.h" /* isalpha etc. are used for the character classes. */ #include /* Jim Meyering writes: "... Some ctype macros are valid only for character codes that isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when using /bin/cc or gcc but without giving an ansi option). So, all ctype uses should be through macros like ISPRINT... If STDC_HEADERS is defined, then autoconf has verified that the ctype macros don't need to be guarded with references to isascii. ... Defining isascii to 1 should let any compiler worth its salt eliminate the && through constant folding." Solaris defines some of these symbols so we must undefine them first. */ #undef ISASCII #if defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII) # define ISASCII(c) 1 #else # define ISASCII(c) isascii(c) #endif #ifdef isblank # define ISBLANK(c) (ISASCII (c) && isblank (c)) #else # define ISBLANK(c) ((c) == ' ' || (c) == '\t') #endif #ifdef isgraph # define ISGRAPH(c) (ISASCII (c) && isgraph (c)) #else # define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c)) #endif #undef ISPRINT #define ISPRINT(c) (ISASCII (c) && isprint (c)) #define ISDIGIT(c) (ISASCII (c) && isdigit (c)) #define ISALNUM(c) (ISASCII (c) && isalnum (c)) #define ISALPHA(c) (ISASCII (c) && isalpha (c)) #define ISCNTRL(c) (ISASCII (c) && iscntrl (c)) #define ISLOWER(c) (ISASCII (c) && islower (c)) #define ISPUNCT(c) (ISASCII (c) && ispunct (c)) #define ISSPACE(c) (ISASCII (c) && isspace (c)) #define ISUPPER(c) (ISASCII (c) && isupper (c)) #define ISXDIGIT(c) (ISASCII (c) && isxdigit (c)) #ifdef _tolower # define TOLOWER(c) _tolower(c) #else # define TOLOWER(c) tolower(c) #endif #ifndef NULL # define NULL (void *)0 #endif /* We remove any previous definition of `SIGN_EXTEND_CHAR', since ours (we hope) works properly with all combinations of machines, compilers, `char' and `unsigned char' argument types. (Per Bothner suggested the basic approach.) */ #undef SIGN_EXTEND_CHAR #if __STDC__ # define SIGN_EXTEND_CHAR(c) ((signed char) (c)) #else /* not __STDC__ */ /* As in Harbison and Steele. */ # define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128) #endif /* Should we use malloc or alloca? If REGEX_MALLOC is not defined, we use `alloca' instead of `malloc'. This is because using malloc in re_search* or re_match* could cause memory leaks when C-g is used in Emacs; also, malloc is slower and causes storage fragmentation. On the other hand, malloc is more portable, and easier to debug. Because we sometimes use alloca, some routines have to be macros, not functions -- `alloca'-allocated space disappears at the end of the function it is called in. */ #ifdef REGEX_MALLOC # define REGEX_ALLOCATE malloc # define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize) # define REGEX_FREE free #else /* not REGEX_MALLOC */ /* Emacs already defines alloca, sometimes. */ # ifndef alloca /* Make alloca work the best possible way. */ # ifdef __GNUC__ # define alloca __builtin_alloca # else /* not __GNUC__ */ # if HAVE_ALLOCA_H # include # endif /* HAVE_ALLOCA_H */ # endif /* not __GNUC__ */ # endif /* not alloca */ # define REGEX_ALLOCATE alloca /* Assumes a `char *destination' variable. */ # define REGEX_REALLOCATE(source, osize, nsize) \ (destination = (char *) alloca (nsize), \ memcpy (destination, source, osize)) /* No need to do anything to free, after alloca. */ # define REGEX_FREE(arg) ((void)0) /* Do nothing! But inhibit gcc warning. */ #endif /* not REGEX_MALLOC */ /* Define how to allocate the failure stack. */ #if defined REL_ALLOC && defined REGEX_MALLOC # define REGEX_ALLOCATE_STACK(size) \ r_alloc (&failure_stack_ptr, (size)) # define REGEX_REALLOCATE_STACK(source, osize, nsize) \ r_re_alloc (&failure_stack_ptr, (nsize)) # define REGEX_FREE_STACK(ptr) \ r_alloc_free (&failure_stack_ptr) #else /* not using relocating allocator */ # ifdef REGEX_MALLOC # define REGEX_ALLOCATE_STACK malloc # define REGEX_REALLOCATE_STACK(source, osize, nsize) realloc (source, nsize) # define REGEX_FREE_STACK free # else /* not REGEX_MALLOC */ # define REGEX_ALLOCATE_STACK alloca # define REGEX_REALLOCATE_STACK(source, osize, nsize) \ REGEX_REALLOCATE (source, osize, nsize) /* No need to explicitly free anything. */ # define REGEX_FREE_STACK(arg) # endif /* not REGEX_MALLOC */ #endif /* not using relocating allocator */ /* True if `size1' is non-NULL and PTR is pointing anywhere inside `string1' or just past its end. This works if PTR is NULL, which is a good thing. */ #define FIRST_STRING_P(ptr) \ (size1 && string1 <= (ptr) && (ptr) <= string1 + size1) /* (Re)Allocate N items of type T using malloc, or fail. */ #define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t))) #define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t))) #define RETALLOC_IF(addr, n, t) \ if (addr) RETALLOC((addr), (n), t); else (addr) = TALLOC ((n), t) #define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t))) #define BYTEWIDTH 8 /* In bits. */ #define STREQ(s1, s2) ((strcmp (s1, s2) == 0)) #undef MAX #undef MIN #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define false 0 #define true 1 static int re_match_2_internal PARAMS ((struct re_pattern_buffer *bufp, const char *string1, int size1, const char *string2, int size2, int pos, struct re_registers *regs, int stop)); /* These are the command codes that appear in compiled regular expressions. Some opcodes are followed by argument bytes. A command code can specify any interpretation whatsoever for its arguments. Zero bytes may appear in the compiled regular expression. */ typedef enum { no_op = 0, /* Succeed right away--no more backtracking. */ succeed, /* Followed by one byte giving n, then by n literal bytes. */ exactn, /* Matches any (more or less) character. */ anychar, /* Matches any one char belonging to specified set. First following byte is number of bitmap bytes. Then come bytes for a bitmap saying which chars are in. Bits in each byte are ordered low-bit-first. A character is in the set if its bit is 1. A character too large to have a bit in the map is automatically not in the set. */ charset, /* Same parameters as charset, but match any character that is not one of those specified. */ charset_not, /* Start remembering the text that is matched, for storing in a register. Followed by one byte with the register number, in the range 0 to one less than the pattern buffer's re_nsub field. Then followed by one byte with the number of groups inner to this one. (This last has to be part of the start_memory only because we need it in the on_failure_jump of re_match_2.) */ start_memory, /* Stop remembering the text that is matched and store it in a memory register. Followed by one byte with the register number, in the range 0 to one less than `re_nsub' in the pattern buffer, and one byte with the number of inner groups, just like `start_memory'. (We need the number of inner groups here because we don't have any easy way of finding the corresponding start_memory when we're at a stop_memory.) */ stop_memory, /* Match a duplicate of something remembered. Followed by one byte containing the register number. */ duplicate, /* Fail unless at beginning of line. */ begline, /* Fail unless at end of line. */ endline, /* Succeeds if at beginning of buffer (if emacs) or at beginning of string to be matched (if not). */ begbuf, /* Analogously, for end of buffer/string. */ endbuf, /* Followed by two byte relative address to which to jump. */ jump, /* Same as jump, but marks the end of an alternative. */ jump_past_alt, /* Followed by two-byte relative address of place to resume at in case of failure. */ on_failure_jump, /* Like on_failure_jump, but pushes a placeholder instead of the current string position when executed. */ on_failure_keep_string_jump, /* Throw away latest failure point and then jump to following two-byte relative address. */ pop_failure_jump, /* Change to pop_failure_jump if know won't have to backtrack to match; otherwise change to jump. This is used to jump back to the beginning of a repeat. If what follows this jump clearly won't match what the repeat does, such that we can be sure that there is no use backtracking out of repetitions already matched, then we change it to a pop_failure_jump. Followed by two-byte address. */ maybe_pop_jump, /* Jump to following two-byte address, and push a dummy failure point. This failure point will be thrown away if an attempt is made to use it for a failure. A `+' construct makes this before the first repeat. Also used as an intermediary kind of jump when compiling an alternative. */ dummy_failure_jump, /* Push a dummy failure point and continue. Used at the end of alternatives. */ push_dummy_failure, /* Followed by two-byte relative address and two-byte number n. After matching N times, jump to the address upon failure. */ succeed_n, /* Followed by two-byte relative address, and two-byte number n. Jump to the address N times, then fail. */ jump_n, /* Set the following two-byte relative address to the subsequent two-byte number. The address *includes* the two bytes of number. */ set_number_at, wordchar, /* Matches any word-constituent character. */ notwordchar, /* Matches any char that is not a word-constituent. */ wordbeg, /* Succeeds if at word beginning. */ wordend, /* Succeeds if at word end. */ wordbound, /* Succeeds if at a word boundary. */ notwordbound /* Succeeds if not at a word boundary. */ #ifdef emacs ,before_dot, /* Succeeds if before point. */ at_dot, /* Succeeds if at point. */ after_dot, /* Succeeds if after point. */ /* Matches any character whose syntax is specified. Followed by a byte which contains a syntax code, e.g., Sword. */ syntaxspec, /* Matches any character whose syntax is not that specified. */ notsyntaxspec #endif /* emacs */ } re_opcode_t; /* Common operations on the compiled pattern. */ /* Store NUMBER in two contiguous bytes starting at DESTINATION. */ #define STORE_NUMBER(destination, number) \ do { \ (destination)[0] = (number) & 0377; \ (destination)[1] = (number) >> 8; \ } while (0) /* Same as STORE_NUMBER, except increment DESTINATION to the byte after where the number is stored. Therefore, DESTINATION must be an lvalue. */ #define STORE_NUMBER_AND_INCR(destination, number) \ do { \ STORE_NUMBER (destination, number); \ (destination) += 2; \ } while (0) /* Put into DESTINATION a number stored in two contiguous bytes starting at SOURCE. */ #define EXTRACT_NUMBER(destination, source) \ do { \ (destination) = *(source) & 0377; \ (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8; \ } while (0) #ifdef DEBUG static void extract_number _RE_ARGS ((int *dest, unsigned char *source)); static void extract_number (dest, source) int *dest; unsigned char *source; { int temp = SIGN_EXTEND_CHAR (*(source + 1)); *dest = *source & 0377; *dest += temp << 8; } # ifndef EXTRACT_MACROS /* To debug the macros. */ # undef EXTRACT_NUMBER # define EXTRACT_NUMBER(dest, src) extract_number (&dest, src) # endif /* not EXTRACT_MACROS */ #endif /* DEBUG */ /* Same as EXTRACT_NUMBER, except increment SOURCE to after the number. SOURCE must be an lvalue. */ #define EXTRACT_NUMBER_AND_INCR(destination, source) \ do { \ EXTRACT_NUMBER (destination, source); \ (source) += 2; \ } while (0) #ifdef DEBUG static void extract_number_and_incr _RE_ARGS ((int *destination, unsigned char **source)); static void extract_number_and_incr (destination, source) int *destination; unsigned char **source; { extract_number (destination, *source); *source += 2; } # ifndef EXTRACT_MACROS # undef EXTRACT_NUMBER_AND_INCR # define EXTRACT_NUMBER_AND_INCR(dest, src) \ extract_number_and_incr (&dest, &src) # endif /* not EXTRACT_MACROS */ #endif /* DEBUG */ /* If DEBUG is defined, Regex prints many voluminous messages about what it is doing (if the variable `debug' is nonzero). If linked with the main program in `iregex.c', you can enter patterns and strings interactively. And if linked with the main program in `main.c' and the other test files, you can run the already-written tests. */ #ifdef DEBUG /* We use standard I/O for debugging. */ # include /* It is useful to test things that ``must'' be true when debugging. */ # include static int debug; # define DEBUG_STATEMENT(e) e # define DEBUG_PRINT1(x) if (debug) printf (x) # define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2) # define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3) # define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4) # define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) \ if (debug) print_partial_compiled_pattern (s, e) # define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) \ if (debug) print_double_string (w, s1, sz1, s2, sz2) /* Print the fastmap in human-readable form. */ void print_fastmap (fastmap) char *fastmap; { unsigned was_a_range = 0; unsigned i = 0; while (i < (1 << BYTEWIDTH)) { if (fastmap[i++]) { was_a_range = 0; putchar (i - 1); while (i < (1 << BYTEWIDTH) && fastmap[i]) { was_a_range = 1; i++; } if (was_a_range) { printf ("-"); putchar (i - 1); } } } putchar ('\n'); } /* Print a compiled pattern string in human-readable form, starting at the START pointer into it and ending just before the pointer END. */ void print_partial_compiled_pattern (start, end) unsigned char *start; unsigned char *end; { int mcnt, mcnt2; unsigned char *p1; unsigned char *p = start; unsigned char *pend = end; if (start == NULL) { printf ("(null)\n"); return; } /* Loop over pattern commands. */ while (p < pend) { printf ("%d:\t", (GR_INT)(p - start)); switch ((re_opcode_t) *p++) { case no_op: printf ("/no_op"); break; case exactn: mcnt = *p++; printf ("/exactn/%d", mcnt); do { putchar ('/'); putchar (*p++); } while (--mcnt); break; case start_memory: mcnt = *p++; printf ("/start_memory/%d/%d", mcnt, *p++); break; case stop_memory: mcnt = *p++; printf ("/stop_memory/%d/%d", mcnt, *p++); break; case duplicate: printf ("/duplicate/%d", *p++); break; case anychar: printf ("/anychar"); break; case charset: case charset_not: { register int c, last = -100; register int in_range = 0; printf ("/charset [%s", (re_opcode_t) *(p - 1) == charset_not ? "^" : ""); assert (p + *p < pend); for (c = 0; c < 256; c++) if (c / 8 < *p && (p[1 + (c/8)] & (1 << (c % 8)))) { /* Are we starting a range? */ if (last + 1 == c && ! in_range) { putchar ('-'); in_range = 1; } /* Have we broken a range? */ else if (last + 1 != c && in_range) { putchar (last); in_range = 0; } if (! in_range) putchar (c); last = c; } if (in_range) putchar (last); putchar (']'); p += 1 + *p; } break; case begline: printf ("/begline"); break; case endline: printf ("/endline"); break; case on_failure_jump: extract_number_and_incr (&mcnt, &p); printf ("/on_failure_jump to %d", (GR_INT)(p + mcnt - start)); break; case on_failure_keep_string_jump: extract_number_and_incr (&mcnt, &p); printf ("/on_failure_keep_string_jump to %d", (GR_INT)(p + mcnt - start)); break; case dummy_failure_jump: extract_number_and_incr (&mcnt, &p); printf ("/dummy_failure_jump to %d", (GR_INT)(p + mcnt - start)); break; case push_dummy_failure: printf ("/push_dummy_failure"); break; case maybe_pop_jump: extract_number_and_incr (&mcnt, &p); printf ("/maybe_pop_jump to %d", (GR_INT)(p + mcnt - start)); break; case pop_failure_jump: extract_number_and_incr (&mcnt, &p); printf ("/pop_failure_jump to %d", (GR_INT)(p + mcnt - start)); break; case jump_past_alt: extract_number_and_incr (&mcnt, &p); printf ("/jump_past_alt to %d", (GR_INT)(p + mcnt - start)); break; case jump: extract_number_and_incr (&mcnt, &p); printf ("/jump to %d", (GR_INT)(p + mcnt - start)); break; case succeed_n: extract_number_and_incr (&mcnt, &p); p1 = p + mcnt; extract_number_and_incr (&mcnt2, &p); printf ("/succeed_n to %d, %d times", (GR_INT)(p1 - start), mcnt2); break; case jump_n: extract_number_and_incr (&mcnt, &p); p1 = p + mcnt; extract_number_and_incr (&mcnt2, &p); printf ("/jump_n to %d, %d times", (GR_INT)(p1 - start), mcnt2); break; case set_number_at: extract_number_and_incr (&mcnt, &p); p1 = p + mcnt; extract_number_and_incr (&mcnt2, &p); printf ("/set_number_at location %d to %d", (GR_INT)(p1 - start), mcnt2); break; case wordbound: printf ("/wordbound"); break; case notwordbound: printf ("/notwordbound"); break; case wordbeg: printf ("/wordbeg"); break; case wordend: printf ("/wordend"); # ifdef emacs case before_dot: printf ("/before_dot"); break; case at_dot: printf ("/at_dot"); break; case after_dot: printf ("/after_dot"); break; case syntaxspec: printf ("/syntaxspec"); mcnt = *p++; printf ("/%d", mcnt); break; case notsyntaxspec: printf ("/notsyntaxspec"); mcnt = *p++; printf ("/%d", mcnt); break; # endif /* emacs */ case wordchar: printf ("/wordchar"); break; case notwordchar: printf ("/notwordchar"); break; case begbuf: printf ("/begbuf"); break; case endbuf: printf ("/endbuf"); break; default: printf ("?%d", *(p-1)); } putchar ('\n'); } printf ("%d:\tend of pattern.\n", (GR_INT)(p - start)); } void print_compiled_pattern (bufp) struct re_pattern_buffer *bufp; { unsigned char *buffer = bufp->buffer; print_partial_compiled_pattern (buffer, buffer + bufp->used); printf ("%ld bytes used/%ld bytes allocated.\n", bufp->used, bufp->allocated); if (bufp->fastmap_accurate && bufp->fastmap) { printf ("fastmap: "); print_fastmap (bufp->fastmap); } printf ("re_nsub: %d\t", (GR_INT)(bufp->re_nsub)); printf ("regs_alloc: %d\t", bufp->regs_allocated); printf ("can_be_null: %d\t", bufp->can_be_null); printf ("newline_anchor: %d\n", bufp->newline_anchor); printf ("no_sub: %d\t", bufp->no_sub); printf ("not_bol: %d\t", bufp->not_bol); printf ("not_eol: %d\t", bufp->not_eol); printf ("syntax: %lx\n", bufp->syntax); /* Perhaps we should print the translate table? */ } void print_double_string (where, string1, size1, string2, size2) const char *where; const char *string1; const char *string2; int size1; int size2; { int this_char; if (where == NULL) printf ("(null)"); else { if (FIRST_STRING_P (where)) { for (this_char = where - string1; this_char < size1; this_char++) putchar (string1[this_char]); where = string2; } for (this_char = where - string2; this_char < size2; this_char++) putchar (string2[this_char]); } } void printchar (c) int c; { putc (c, stderr); } #else /* not DEBUG */ # undef assert # define assert(e) # define DEBUG_STATEMENT(e) # define DEBUG_PRINT1(x) # define DEBUG_PRINT2(x1, x2) # define DEBUG_PRINT3(x1, x2, x3) # define DEBUG_PRINT4(x1, x2, x3, x4) # define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) # define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) #endif /* not DEBUG */ /* Set by `re_set_syntax' to the current regexp syntax to recognize. Can also be assigned to arbitrarily: each pattern buffer stores its own syntax, so it can be changed between regex compilations. */ /* This has no initializer because initialized variables in Emacs become read-only after dumping. */ reg_syntax_t re_syntax_options; /* Specify the precise syntax of regexps for compilation. This provides for compatibility for various utilities which historically have different, incompatible syntaxes. The argument SYNTAX is a bit mask comprised of the various bits defined in regex.h. We return the old syntax. */ reg_syntax_t re_set_syntax (syntax) reg_syntax_t syntax; { reg_syntax_t ret = re_syntax_options; re_syntax_options = syntax; #ifdef DEBUG if (syntax & RE_DEBUG) debug = 1; else if (debug) /* was on but now is not */ debug = 0; #endif /* DEBUG */ return ret; } #ifdef _LIBC weak_alias (__re_set_syntax, re_set_syntax) #endif /* This table gives an error message for each of the error codes listed in regex.h. Obviously the order here has to be same as there. POSIX doesn't require that we do anything for REG_NOERROR, but why not be nice? */ static const char re_error_msgid[] = { #define REG_NOERROR_IDX 0 gettext_noop ("Success") /* REG_NOERROR */ "\0" #define REG_NOMATCH_IDX (REG_NOERROR_IDX + sizeof "Success") gettext_noop ("No match") /* REG_NOMATCH */ "\0" #define REG_BADPAT_IDX (REG_NOMATCH_IDX + sizeof "No match") gettext_noop ("Invalid regular expression") /* REG_BADPAT */ "\0" #define REG_ECOLLATE_IDX (REG_BADPAT_IDX + sizeof "Invalid regular expression") gettext_noop ("Invalid collation character") /* REG_ECOLLATE */ "\0" #define REG_ECTYPE_IDX (REG_ECOLLATE_IDX + sizeof "Invalid collation character") gettext_noop ("Invalid character class name") /* REG_ECTYPE */ "\0" #define REG_EESCAPE_IDX (REG_ECTYPE_IDX + sizeof "Invalid character class name") gettext_noop ("Trailing backslash") /* REG_EESCAPE */ "\0" #define REG_ESUBREG_IDX (REG_EESCAPE_IDX + sizeof "Trailing backslash") gettext_noop ("Invalid back reference") /* REG_ESUBREG */ "\0" #define REG_EBRACK_IDX (REG_ESUBREG_IDX + sizeof "Invalid back reference") gettext_noop ("Unmatched [ or [^") /* REG_EBRACK */ "\0" #define REG_EPAREN_IDX (REG_EBRACK_IDX + sizeof "Unmatched [ or [^") gettext_noop ("Unmatched ( or \\(") /* REG_EPAREN */ "\0" #define REG_EBRACE_IDX (REG_EPAREN_IDX + sizeof "Unmatched ( or \\(") gettext_noop ("Unmatched \\{") /* REG_EBRACE */ "\0" #define REG_BADBR_IDX (REG_EBRACE_IDX + sizeof "Unmatched \\{") gettext_noop ("Invalid content of \\{\\}") /* REG_BADBR */ "\0" #define REG_ERANGE_IDX (REG_BADBR_IDX + sizeof "Invalid content of \\{\\}") gettext_noop ("Invalid range end") /* REG_ERANGE */ "\0" #define REG_ESPACE_IDX (REG_ERANGE_IDX + sizeof "Invalid range end") gettext_noop ("Memory exhausted") /* REG_ESPACE */ "\0" #define REG_BADRPT_IDX (REG_ESPACE_IDX + sizeof "Memory exhausted") gettext_noop ("Invalid preceding regular expression") /* REG_BADRPT */ "\0" #define REG_EEND_IDX (REG_BADRPT_IDX + sizeof "Invalid preceding regular expression") gettext_noop ("Premature end of regular expression") /* REG_EEND */ "\0" #define REG_ESIZE_IDX (REG_EEND_IDX + sizeof "Premature end of regular expression") gettext_noop ("Regular expression too big") /* REG_ESIZE */ "\0" #define REG_ERPAREN_IDX (REG_ESIZE_IDX + sizeof "Regular expression too big") gettext_noop ("Unmatched ) or \\)") /* REG_ERPAREN */ }; static const size_t re_error_msgid_idx[] = { REG_NOERROR_IDX, REG_NOMATCH_IDX, REG_BADPAT_IDX, REG_ECOLLATE_IDX, REG_ECTYPE_IDX, REG_EESCAPE_IDX, REG_ESUBREG_IDX, REG_EBRACK_IDX, REG_EPAREN_IDX, REG_EBRACE_IDX, REG_BADBR_IDX, REG_ERANGE_IDX, REG_ESPACE_IDX, REG_BADRPT_IDX, REG_EEND_IDX, REG_ESIZE_IDX, REG_ERPAREN_IDX }; /* Avoiding alloca during matching, to placate r_alloc. */ /* Define MATCH_MAY_ALLOCATE unless we need to make sure that the searching and matching functions should not call alloca. On some systems, alloca is implemented in terms of malloc, and if we're using the relocating allocator routines, then malloc could cause a relocation, which might (if the strings being searched are in the ralloc heap) shift the data out from underneath the regexp routines. Here's another reason to avoid allocation: Emacs processes input from X in a signal handler; processing X input may call malloc; if input arrives while a matching routine is calling malloc, then we're scrod. But Emacs can't just block input while calling matching routines; then we don't notice interrupts when they come in. So, Emacs blocks input around all regexp calls except the matching calls, which it leaves unprotected, in the faith that they will not malloc. */ /* Normally, this is fine. */ #define MATCH_MAY_ALLOCATE /* When using GNU C, we are not REALLY using the C alloca, no matter what config.h may say. So don't take precautions for it. */ #ifdef __GNUC__ # undef C_ALLOCA #endif /* The match routines may not allocate if (1) they would do it with malloc and (2) it's not safe for them to use malloc. Note that if REL_ALLOC is defined, matching would not use malloc for the failure stack, but we would still use it for the register vectors; so REL_ALLOC should not affect this. */ #if (defined C_ALLOCA || defined REGEX_MALLOC) && defined emacs # undef MATCH_MAY_ALLOCATE #endif /* Failure stack declarations and macros; both re_compile_fastmap and re_match_2 use a failure stack. These have to be macros because of REGEX_ALLOCATE_STACK. */ /* Number of failure points for which to initially allocate space when matching. If this number is exceeded, we allocate more space, so it is not a hard limit. */ #ifndef INIT_FAILURE_ALLOC # define INIT_FAILURE_ALLOC 5 #endif /* Roughly the maximum number of failure points on the stack. Would be exactly that if always used MAX_FAILURE_ITEMS items each time we failed. This is a variable only so users of regex can assign to it; we never change it ourselves. */ #ifdef INT_IS_16BIT # if defined MATCH_MAY_ALLOCATE /* 4400 was enough to cause a crash on Alpha OSF/1, whose default stack limit is 2mb. */ long int re_max_failures = 4000; # else long int re_max_failures = 2000; # endif union fail_stack_elt { unsigned char *pointer; long int integer; }; typedef union fail_stack_elt fail_stack_elt_t; typedef struct { fail_stack_elt_t *stack; unsigned long int size; unsigned long int avail; /* Offset of next open position. */ } fail_stack_type; #else /* not INT_IS_16BIT */ # if defined MATCH_MAY_ALLOCATE /* 4400 was enough to cause a crash on Alpha OSF/1, whose default stack limit is 2mb. */ int re_max_failures = 20000; # else int re_max_failures = 2000; # endif union fail_stack_elt { unsigned char *pointer; int integer; }; typedef union fail_stack_elt fail_stack_elt_t; typedef struct { fail_stack_elt_t *stack; unsigned size; unsigned avail; /* Offset of next open position. */ } fail_stack_type; #endif /* INT_IS_16BIT */ #define FAIL_STACK_EMPTY() (fail_stack.avail == 0) #define FAIL_STACK_PTR_EMPTY() (fail_stack_ptr->avail == 0) #define FAIL_STACK_FULL() (fail_stack.avail == fail_stack.size) /* Define macros to initialize and free the failure stack. Do `return -2' if the alloc fails. */ #ifdef MATCH_MAY_ALLOCATE # define INIT_FAIL_STACK() \ do { \ fail_stack.stack = (fail_stack_elt_t *) \ REGEX_ALLOCATE_STACK (INIT_FAILURE_ALLOC * sizeof (fail_stack_elt_t)); \ \ if (fail_stack.stack == NULL) \ return -2; \ \ fail_stack.size = INIT_FAILURE_ALLOC; \ fail_stack.avail = 0; \ } while (0) # define RESET_FAIL_STACK() REGEX_FREE_STACK (fail_stack.stack) #else # define INIT_FAIL_STACK() \ do { \ fail_stack.avail = 0; \ } while (0) # define RESET_FAIL_STACK() #endif /* Double the size of FAIL_STACK, up to approximately `re_max_failures' items. Return 1 if succeeds, and 0 if either ran out of memory allocating space for it or it was already too large. REGEX_REALLOCATE_STACK requires `destination' be declared. */ #define DOUBLE_FAIL_STACK(fail_stack) \ ((fail_stack).size > (unsigned) (re_max_failures * MAX_FAILURE_ITEMS) \ ? 0 \ : ((fail_stack).stack = (fail_stack_elt_t *) \ REGEX_REALLOCATE_STACK ((fail_stack).stack, \ (fail_stack).size * sizeof (fail_stack_elt_t), \ ((fail_stack).size << 1) * sizeof (fail_stack_elt_t)), \ \ (fail_stack).stack == NULL \ ? 0 \ : ((fail_stack).size <<= 1, \ 1))) /* Push pointer POINTER on FAIL_STACK. Return 1 if was able to do so and 0 if ran out of memory allocating space to do so. */ #define PUSH_PATTERN_OP(POINTER, FAIL_STACK) \ ((FAIL_STACK_FULL () \ && !DOUBLE_FAIL_STACK (FAIL_STACK)) \ ? 0 \ : ((FAIL_STACK).stack[(FAIL_STACK).avail++].pointer = POINTER, \ 1)) /* Push a pointer value onto the failure stack. Assumes the variable `fail_stack'. Probably should only be called from within `PUSH_FAILURE_POINT'. */ #define PUSH_FAILURE_POINTER(item) \ fail_stack.stack[fail_stack.avail++].pointer = (unsigned char *) (item) /* This pushes an integer-valued item onto the failure stack. Assumes the variable `fail_stack'. Probably should only be called from within `PUSH_FAILURE_POINT'. */ #define PUSH_FAILURE_INT(item) \ fail_stack.stack[fail_stack.avail++].integer = (item) /* Push a fail_stack_elt_t value onto the failure stack. Assumes the variable `fail_stack'. Probably should only be called from within `PUSH_FAILURE_POINT'. */ #define PUSH_FAILURE_ELT(item) \ fail_stack.stack[fail_stack.avail++] = (item) /* These three POP... operations complement the three PUSH... operations. All assume that `fail_stack' is nonempty. */ #define POP_FAILURE_POINTER() fail_stack.stack[--fail_stack.avail].pointer #define POP_FAILURE_INT() fail_stack.stack[--fail_stack.avail].integer #define POP_FAILURE_ELT() fail_stack.stack[--fail_stack.avail] /* Used to omit pushing failure point id's when we're not debugging. */ #ifdef DEBUG # define DEBUG_PUSH PUSH_FAILURE_INT # define DEBUG_POP(item_addr) *(item_addr) = POP_FAILURE_INT () #else # define DEBUG_PUSH(item) # define DEBUG_POP(item_addr) #endif /* Push the information about the state we will need if we ever fail back to it. Requires variables fail_stack, regstart, regend, reg_info, and num_regs_pushed be declared. DOUBLE_FAIL_STACK requires `destination' be declared. Does `return FAILURE_CODE' if runs out of memory. */ #define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code) \ do { \ char *destination; \ /* Must be int, so when we don't save any registers, the arithmetic \ of 0 + -1 isn't done as unsigned. */ \ /* Can't be int, since there is not a shred of a guarantee that int \ is wide enough to hold a value of something to which pointer can \ be assigned */ \ active_reg_t this_reg; \ \ DEBUG_STATEMENT (failure_id++); \ DEBUG_STATEMENT (nfailure_points_pushed++); \ DEBUG_PRINT2 ("\nPUSH_FAILURE_POINT #%u:\n", failure_id); \ DEBUG_PRINT2 (" Before push, next avail: %d\n", (fail_stack).avail);\ DEBUG_PRINT2 (" size: %d\n", (fail_stack).size);\ \ DEBUG_PRINT2 (" slots needed: %ld\n", NUM_FAILURE_ITEMS); \ DEBUG_PRINT2 (" available: %d\n", REMAINING_AVAIL_SLOTS); \ \ /* Ensure we have enough space allocated for what we will push. */ \ while (REMAINING_AVAIL_SLOTS < NUM_FAILURE_ITEMS) \ { \ if (!DOUBLE_FAIL_STACK (fail_stack)) \ return failure_code; \ \ DEBUG_PRINT2 ("\n Doubled stack; size now: %d\n", \ (fail_stack).size); \ DEBUG_PRINT2 (" slots available: %d\n", REMAINING_AVAIL_SLOTS);\ } \ \ /* Push the info, starting with the registers. */ \ DEBUG_PRINT1 ("\n"); \ \ if (1) \ for (this_reg = lowest_active_reg; this_reg <= highest_active_reg; \ this_reg++) \ { \ DEBUG_PRINT2 (" Pushing reg: %lu\n", this_reg); \ DEBUG_STATEMENT (num_regs_pushed++); \ \ DEBUG_PRINT2 (" start: %p\n", regstart[this_reg]); \ PUSH_FAILURE_POINTER (regstart[this_reg]); \ \ DEBUG_PRINT2 (" end: %p\n", regend[this_reg]); \ PUSH_FAILURE_POINTER (regend[this_reg]); \ \ DEBUG_PRINT2 (" info: %p\n ", \ reg_info[this_reg].word.pointer); \ DEBUG_PRINT2 (" match_null=%d", \ REG_MATCH_NULL_STRING_P (reg_info[this_reg])); \ DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg])); \ DEBUG_PRINT2 (" matched_something=%d", \ MATCHED_SOMETHING (reg_info[this_reg])); \ DEBUG_PRINT2 (" ever_matched=%d", \ EVER_MATCHED_SOMETHING (reg_info[this_reg])); \ DEBUG_PRINT1 ("\n"); \ PUSH_FAILURE_ELT (reg_info[this_reg].word); \ } \ \ DEBUG_PRINT2 (" Pushing low active reg: %ld\n", lowest_active_reg);\ PUSH_FAILURE_INT (lowest_active_reg); \ \ DEBUG_PRINT2 (" Pushing high active reg: %ld\n", highest_active_reg);\ PUSH_FAILURE_INT (highest_active_reg); \ \ DEBUG_PRINT2 (" Pushing pattern %p:\n", pattern_place); \ DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend); \ PUSH_FAILURE_POINTER (pattern_place); \ \ DEBUG_PRINT2 (" Pushing string %p: `", string_place); \ DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2, \ size2); \ DEBUG_PRINT1 ("'\n"); \ PUSH_FAILURE_POINTER (string_place); \ \ DEBUG_PRINT2 (" Pushing failure id: %u\n", failure_id); \ DEBUG_PUSH (failure_id); \ } while (0) /* This is the number of items that are pushed and popped on the stack for each register. */ #define NUM_REG_ITEMS 3 /* Individual items aside from the registers. */ #ifdef DEBUG # define NUM_NONREG_ITEMS 5 /* Includes failure point id. */ #else # define NUM_NONREG_ITEMS 4 #endif /* We push at most this many items on the stack. */ /* We used to use (num_regs - 1), which is the number of registers this regexp will save; but that was changed to 5 to avoid stack overflow for a regexp with lots of parens. */ #define MAX_FAILURE_ITEMS (5 * NUM_REG_ITEMS + NUM_NONREG_ITEMS) /* We actually push this many items. */ #define NUM_FAILURE_ITEMS \ (((0 \ ? 0 : highest_active_reg - lowest_active_reg + 1) \ * NUM_REG_ITEMS) \ + NUM_NONREG_ITEMS) /* How many items can still be added to the stack without overflowing it. */ #define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail) /* Pops what PUSH_FAIL_STACK pushes. We restore into the parameters, all of which should be lvalues: STR -- the saved data position. PAT -- the saved pattern position. LOW_REG, HIGH_REG -- the highest and lowest active registers. REGSTART, REGEND -- arrays of string positions. REG_INFO -- array of information about each subexpression. Also assumes the variables `fail_stack' and (if debugging), `bufp', `pend', `string1', `size1', `string2', and `size2'. */ #define POP_FAILURE_POINT(str, pat, low_reg, high_reg, regstart, regend, reg_info)\ { \ DEBUG_STATEMENT (unsigned failure_id;) \ active_reg_t this_reg; \ const unsigned char *string_temp; \ \ assert (!FAIL_STACK_EMPTY ()); \ \ /* Remove failure points and point to how many regs pushed. */ \ DEBUG_PRINT1 ("POP_FAILURE_POINT:\n"); \ DEBUG_PRINT2 (" Before pop, next avail: %d\n", fail_stack.avail); \ DEBUG_PRINT2 (" size: %d\n", fail_stack.size); \ \ assert (fail_stack.avail >= NUM_NONREG_ITEMS); \ \ DEBUG_POP (&failure_id); \ DEBUG_PRINT2 (" Popping failure id: %u\n", failure_id); \ \ /* If the saved string location is NULL, it came from an \ on_failure_keep_string_jump opcode, and we want to throw away the \ saved NULL, thus retaining our current position in the string. */ \ string_temp = POP_FAILURE_POINTER (); \ if (string_temp != NULL) \ str = (const char *) string_temp; \ \ DEBUG_PRINT2 (" Popping string %p: `", str); \ DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2); \ DEBUG_PRINT1 ("'\n"); \ \ pat = (unsigned char *) POP_FAILURE_POINTER (); \ DEBUG_PRINT2 (" Popping pattern %p:\n", pat); \ DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend); \ \ /* Restore register info. */ \ high_reg = (active_reg_t) POP_FAILURE_INT (); \ DEBUG_PRINT2 (" Popping high active reg: %ld\n", high_reg); \ \ low_reg = (active_reg_t) POP_FAILURE_INT (); \ DEBUG_PRINT2 (" Popping low active reg: %ld\n", low_reg); \ \ if (1) \ for (this_reg = high_reg; this_reg >= low_reg; this_reg--) \ { \ DEBUG_PRINT2 (" Popping reg: %ld\n", this_reg); \ \ reg_info[this_reg].word = POP_FAILURE_ELT (); \ DEBUG_PRINT2 (" info: %p\n", \ reg_info[this_reg].word.pointer); \ \ regend[this_reg] = (const char *) POP_FAILURE_POINTER (); \ DEBUG_PRINT2 (" end: %p\n", regend[this_reg]); \ \ regstart[this_reg] = (const char *) POP_FAILURE_POINTER (); \ DEBUG_PRINT2 (" start: %p\n", regstart[this_reg]); \ } \ else \ { \ for (this_reg = highest_active_reg; this_reg > high_reg; this_reg--) \ { \ reg_info[this_reg].word.integer = 0; \ regend[this_reg] = 0; \ regstart[this_reg] = 0; \ } \ highest_active_reg = high_reg; \ } \ \ set_regs_matched_done = 0; \ DEBUG_STATEMENT (nfailure_points_popped++); \ } /* POP_FAILURE_POINT */ /* Structure for per-register (a.k.a. per-group) information. Other register information, such as the starting and ending positions (which are addresses), and the list of inner groups (which is a bits list) are maintained in separate variables. We are making a (strictly speaking) nonportable assumption here: that the compiler will pack our bit fields into something that fits into the type of `word', i.e., is something that fits into one item on the failure stack. */ /* Declarations and macros for re_match_2. */ typedef union { fail_stack_elt_t word; struct { /* This field is one if this group can match the empty string, zero if not. If not yet determined, `MATCH_NULL_UNSET_VALUE'. */ #define MATCH_NULL_UNSET_VALUE 3 unsigned match_null_string_p : 2; unsigned is_active : 1; unsigned matched_something : 1; unsigned ever_matched_something : 1; } bits; } register_info_type; #define REG_MATCH_NULL_STRING_P(R) ((R).bits.match_null_string_p) #define IS_ACTIVE(R) ((R).bits.is_active) #define MATCHED_SOMETHING(R) ((R).bits.matched_something) #define EVER_MATCHED_SOMETHING(R) ((R).bits.ever_matched_something) /* Call this when have matched a real character; it sets `matched' flags for the subexpressions which we are currently inside. Also records that those subexprs have matched. */ #define SET_REGS_MATCHED() \ do \ { \ if (!set_regs_matched_done) \ { \ active_reg_t r; \ set_regs_matched_done = 1; \ for (r = lowest_active_reg; r <= highest_active_reg; r++) \ { \ MATCHED_SOMETHING (reg_info[r]) \ = EVER_MATCHED_SOMETHING (reg_info[r]) \ = 1; \ } \ } \ } \ while (0) /* Registers are set to a sentinel when they haven't yet matched. */ static char reg_unset_dummy; #define REG_UNSET_VALUE (®_unset_dummy) #define REG_UNSET(e) ((e) == REG_UNSET_VALUE) /* Subroutine declarations and macros for regex_compile. */ static reg_errcode_t regex_compile _RE_ARGS ((const char *pattern, size_t size, reg_syntax_t syntax, struct re_pattern_buffer *bufp)); static void store_op1 _RE_ARGS ((re_opcode_t op, unsigned char *loc, int arg)); static void store_op2 _RE_ARGS ((re_opcode_t op, unsigned char *loc, int arg1, int arg2)); static void insert_op1 _RE_ARGS ((re_opcode_t op, unsigned char *loc, int arg, unsigned char *end)); static void insert_op2 _RE_ARGS ((re_opcode_t op, unsigned char *loc, int arg1, int arg2, unsigned char *end)); static char at_begline_loc_p _RE_ARGS ((const char *pattern, const char *p, reg_syntax_t syntax)); static char at_endline_loc_p _RE_ARGS ((const char *p, const char *pend, reg_syntax_t syntax)); static reg_errcode_t compile_range _RE_ARGS ((const char **p_ptr, const char *pend, char *translate, reg_syntax_t syntax, unsigned char *b)); /* Fetch the next character in the uncompiled pattern---translating it if necessary. Also cast from a signed character in the constant string passed to us by the user to an unsigned char that we can use as an array index (in, e.g., `translate'). */ #ifndef PATFETCH # define PATFETCH(c) \ do {if (p == pend) return REG_EEND; \ c = (unsigned char) *p++; \ if (translate) c = (unsigned char) translate[c]; \ } while (0) #endif /* Fetch the next character in the uncompiled pattern, with no translation. */ #define PATFETCH_RAW(c) \ do {if (p == pend) return REG_EEND; \ c = (unsigned char) *p++; \ } while (0) /* Go backwards one character in the pattern. */ #define PATUNFETCH p-- /* If `translate' is non-null, return translate[D], else just D. We cast the subscript to translate because some data is declared as `char *', to avoid warnings when a string constant is passed. But when we use a character as a subscript we must make it unsigned. */ #ifndef TRANSLATE # define TRANSLATE(d) \ (translate ? (char) translate[(unsigned char) (d)] : (d)) #endif /* Macros for outputting the compiled pattern into `buffer'. */ /* If the buffer isn't allocated when it comes in, use this. */ #define INIT_BUF_SIZE 32 /* Make sure we have at least N more bytes of space in buffer. */ #define GET_BUFFER_SPACE(n) \ while ((unsigned long) (b - bufp->buffer + (n)) > bufp->allocated) \ EXTEND_BUFFER () /* Make sure we have one more byte of buffer space and then add C to it. */ #define BUF_PUSH(c) \ do { \ GET_BUFFER_SPACE (1); \ *b++ = (unsigned char) (c); \ } while (0) /* Ensure we have two more bytes of buffer space and then append C1 and C2. */ #define BUF_PUSH_2(c1, c2) \ do { \ GET_BUFFER_SPACE (2); \ *b++ = (unsigned char) (c1); \ *b++ = (unsigned char) (c2); \ } while (0) /* As with BUF_PUSH_2, except for three bytes. */ #define BUF_PUSH_3(c1, c2, c3) \ do { \ GET_BUFFER_SPACE (3); \ *b++ = (unsigned char) (c1); \ *b++ = (unsigned char) (c2); \ *b++ = (unsigned char) (c3); \ } while (0) /* Store a jump with opcode OP at LOC to location TO. We store a relative address offset by the three bytes the jump itself occupies. */ #define STORE_JUMP(op, loc, to) \ store_op1 (op, loc, (int) ((to) - (loc) - 3)) /* Likewise, for a two-argument jump. */ #define STORE_JUMP2(op, loc, to, arg) \ store_op2 (op, loc, (int) ((to) - (loc) - 3), arg) /* Like `STORE_JUMP', but for inserting. Assume `b' is the buffer end. */ #define INSERT_JUMP(op, loc, to) \ insert_op1 (op, loc, (int) ((to) - (loc) - 3), b) /* Like `STORE_JUMP2', but for inserting. Assume `b' is the buffer end. */ #define INSERT_JUMP2(op, loc, to, arg) \ insert_op2 (op, loc, (int) ((to) - (loc) - 3), arg, b) /* This is not an arbitrary limit: the arguments which represent offsets into the pattern are two bytes long. So if 2^16 bytes turns out to be too small, many things would have to change. */ /* Any other compiler which, like MSC, has allocation limit below 2^16 bytes will have to use approach similar to what was done below for MSC and drop MAX_BUF_SIZE a bit. Otherwise you may end up reallocating to 0 bytes. Such thing is not going to work too well. You have been warned!! */ #if defined _MSC_VER && !defined WIN32 /* Microsoft C 16-bit versions limit malloc to approx 65512 bytes. The REALLOC define eliminates a flurry of conversion warnings, but is not required. */ # define MAX_BUF_SIZE 65500L # define REALLOC(p,s) realloc ((p), (size_t) (s)) #else # define MAX_BUF_SIZE (1L << 16) # define REALLOC(p,s) realloc ((p), (s)) #endif /* Extend the buffer by twice its current size via realloc and reset the pointers that pointed into the old block to point to the correct places in the new one. If extending the buffer results in it being larger than MAX_BUF_SIZE, then flag memory exhausted. */ #define EXTEND_BUFFER() \ do { \ unsigned char *old_buffer = bufp->buffer; \ if (bufp->allocated == MAX_BUF_SIZE) \ return REG_ESIZE; \ bufp->allocated <<= 1; \ if (bufp->allocated > MAX_BUF_SIZE) \ bufp->allocated = MAX_BUF_SIZE; \ bufp->buffer = (unsigned char *) REALLOC (bufp->buffer, bufp->allocated);\ if (bufp->buffer == NULL) \ return REG_ESPACE; \ /* If the buffer moved, move all the pointers into it. */ \ if (old_buffer != bufp->buffer) \ { \ b = (b - old_buffer) + bufp->buffer; \ begalt = (begalt - old_buffer) + bufp->buffer; \ if (fixup_alt_jump) \ fixup_alt_jump = (fixup_alt_jump - old_buffer) + bufp->buffer;\ if (laststart) \ laststart = (laststart - old_buffer) + bufp->buffer; \ if (pending_exact) \ pending_exact = (pending_exact - old_buffer) + bufp->buffer; \ } \ } while (0) /* Since we have one byte reserved for the register number argument to {start,stop}_memory, the maximum number of groups we can report things about is what fits in that byte. */ #define MAX_REGNUM 255 /* But patterns can have more than `MAX_REGNUM' registers. We just ignore the excess. */ typedef unsigned regnum_t; /* Macros for the compile stack. */ /* Since offsets can go either forwards or backwards, this type needs to be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1. */ /* int may be not enough when sizeof(int) == 2. */ typedef long pattern_offset_t; typedef struct { pattern_offset_t begalt_offset; pattern_offset_t fixup_alt_jump; pattern_offset_t inner_group_offset; pattern_offset_t laststart_offset; regnum_t regnum; } compile_stack_elt_t; typedef struct { compile_stack_elt_t *stack; unsigned size; unsigned avail; /* Offset of next open position. */ } compile_stack_type; #define INIT_COMPILE_STACK_SIZE 32 #define COMPILE_STACK_EMPTY (compile_stack.avail == 0) #define COMPILE_STACK_FULL (compile_stack.avail == compile_stack.size) /* The next available element. */ #define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail]) /* Set the bit for character C in a list. */ #define SET_LIST_BIT(c) \ (b[((unsigned char) (c)) / BYTEWIDTH] \ |= 1 << (((unsigned char) c) % BYTEWIDTH)) /* Get the next unsigned number in the uncompiled pattern. */ #define GET_UNSIGNED_NUMBER(num) \ { if (p != pend) \ { \ PATFETCH (c); \ while (ISDIGIT (c)) \ { \ if (num < 0) \ num = 0; \ num = num * 10 + c - '0'; \ if (p == pend) \ break; \ PATFETCH (c); \ } \ } \ } #if defined _LIBC || WIDE_CHAR_SUPPORT /* The GNU C library provides support for user-defined character classes and the functions from ISO C amendement 1. */ # ifdef CHARCLASS_NAME_MAX # define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX # else /* This shouldn't happen but some implementation might still have this problem. Use a reasonable default value. */ # define CHAR_CLASS_MAX_LENGTH 256 # endif # ifdef _LIBC # define IS_CHAR_CLASS(string) __wctype (string) # else # define IS_CHAR_CLASS(string) wctype (string) # endif #else # define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */ # define IS_CHAR_CLASS(string) \ (STREQ (string, "alpha") || STREQ (string, "upper") \ || STREQ (string, "lower") || STREQ (string, "digit") \ || STREQ (string, "alnum") || STREQ (string, "xdigit") \ || STREQ (string, "space") || STREQ (string, "print") \ || STREQ (string, "punct") || STREQ (string, "graph") \ || STREQ (string, "cntrl") || STREQ (string, "blank")) #endif #ifndef MATCH_MAY_ALLOCATE /* If we cannot allocate large objects within re_match_2_internal, we make the fail stack and register vectors global. The fail stack, we grow to the maximum size when a regexp is compiled. The register vectors, we adjust in size each time we compile a regexp, according to the number of registers it needs. */ static fail_stack_type fail_stack; /* Size with which the following vectors are currently allocated. That is so we can make them bigger as needed, but never make them smaller. */ static int regs_allocated_size; static const char ** regstart, ** regend; static const char ** old_regstart, ** old_regend; static const char **best_regstart, **best_regend; static register_info_type *reg_info; static const char **reg_dummy; static register_info_type *reg_info_dummy; /* Make the register vectors big enough for NUM_REGS registers, but don't make them smaller. */ static regex_grow_registers (num_regs) int num_regs; { if (num_regs > regs_allocated_size) { RETALLOC_IF (regstart, num_regs, const char *); RETALLOC_IF (regend, num_regs, const char *); RETALLOC_IF (old_regstart, num_regs, const char *); RETALLOC_IF (old_regend, num_regs, const char *); RETALLOC_IF (best_regstart, num_regs, const char *); RETALLOC_IF (best_regend, num_regs, const char *); RETALLOC_IF (reg_info, num_regs, register_info_type); RETALLOC_IF (reg_dummy, num_regs, const char *); RETALLOC_IF (reg_info_dummy, num_regs, register_info_type); regs_allocated_size = num_regs; } } #endif /* not MATCH_MAY_ALLOCATE */ static char group_in_compile_stack _RE_ARGS ((compile_stack_type compile_stack, regnum_t regnum)); /* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX. Returns one of error codes defined in `regex.h', or zero for success. Assumes the `allocated' (and perhaps `buffer') and `translate' fields are set in BUFP on entry. If it succeeds, results are put in BUFP (if it returns an error, the contents of BUFP are undefined): `buffer' is the compiled pattern; `syntax' is set to SYNTAX; `used' is set to the length of the compiled pattern; `fastmap_accurate' is zero; `re_nsub' is the number of subexpressions in PATTERN; `not_bol' and `not_eol' are zero; The `fastmap' and `newline_anchor' fields are neither examined nor set. */ /* Return, freeing storage we allocated. */ #define FREE_STACK_RETURN(value) \ return (free (compile_stack.stack), value) static reg_errcode_t regex_compile (pattern, size, syntax, bufp) const char *pattern; size_t size; reg_syntax_t syntax; struct re_pattern_buffer *bufp; { /* We fetch characters from PATTERN here. Even though PATTERN is `char *' (i.e., signed), we declare these variables as unsigned, so they can be reliably used as array indices. */ register unsigned char c, c1; /* A random temporary spot in PATTERN. */ const char *p1; /* Points to the end of the buffer, where we should append. */ register unsigned char *b; /* Keeps track of unclosed groups. */ compile_stack_type compile_stack; /* Points to the current (ending) position in the pattern. */ const char *p = pattern; const char *pend = pattern + size; /* How to translate the characters in the pattern. */ RE_TRANSLATE_TYPE translate = bufp->translate; /* Address of the count-byte of the most recently inserted `exactn' command. This makes it possible to tell if a new exact-match character can be added to that command or if the character requires a new `exactn' command. */ unsigned char *pending_exact = 0; /* Address of start of the most recently finished expression. This tells, e.g., postfix * where to find the start of its operand. Reset at the beginning of groups and alternatives. */ unsigned char *laststart = 0; /* Address of beginning of regexp, or inside of last group. */ unsigned char *begalt; /* Place in the uncompiled pattern (i.e., the {) to which to go back if the interval is invalid. */ const char *beg_interval; /* Address of the place where a forward jump should go to the end of the containing expression. Each alternative of an `or' -- except the last -- ends with a forward jump of this sort. */ unsigned char *fixup_alt_jump = 0; /* Counts open-groups as they are encountered. Remembered for the matching close-group on the compile stack, so the same register number is put in the stop_memory as the start_memory. */ regnum_t regnum = 0; #ifdef DEBUG DEBUG_PRINT1 ("\nCompiling pattern: "); if (debug) { unsigned debug_count; for (debug_count = 0; debug_count < size; debug_count++) putchar (pattern[debug_count]); putchar ('\n'); } #endif /* DEBUG */ /* Initialize the compile stack. */ compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t); if (compile_stack.stack == NULL) return REG_ESPACE; compile_stack.size = INIT_COMPILE_STACK_SIZE; compile_stack.avail = 0; /* Initialize the pattern buffer. */ bufp->syntax = syntax; bufp->fastmap_accurate = 0; bufp->not_bol = bufp->not_eol = 0; /* Set `used' to zero, so that if we return an error, the pattern printer (for debugging) will think there's no pattern. We reset it at the end. */ bufp->used = 0; /* Always count groups, whether or not bufp->no_sub is set. */ bufp->re_nsub = 0; #if !defined emacs && !defined SYNTAX_TABLE /* Initialize the syntax table. */ init_syntax_once (); #endif if (bufp->allocated == 0) { if (bufp->buffer) { /* If zero allocated, but buffer is non-null, try to realloc enough space. This loses if buffer's address is bogus, but that is the user's responsibility. */ RETALLOC (bufp->buffer, INIT_BUF_SIZE, unsigned char); } else { /* Caller did not allocate a buffer. Do it for them. */ bufp->buffer = TALLOC (INIT_BUF_SIZE, unsigned char); } if (!bufp->buffer) FREE_STACK_RETURN (REG_ESPACE); bufp->allocated = INIT_BUF_SIZE; } begalt = b = bufp->buffer; /* Loop through the uncompiled pattern until we're at the end. */ while (p != pend) { PATFETCH (c); switch (c) { case '^': { if ( /* If at start of pattern, it's an operator. */ p == pattern + 1 /* If context independent, it's an operator. */ || syntax & RE_CONTEXT_INDEP_ANCHORS /* Otherwise, depends on what's come before. */ || at_begline_loc_p (pattern, p, syntax)) BUF_PUSH (begline); else goto normal_char; } break; case '$': { if ( /* If at end of pattern, it's an operator. */ p == pend /* If context independent, it's an operator. */ || syntax & RE_CONTEXT_INDEP_ANCHORS /* Otherwise, depends on what's next. */ || at_endline_loc_p (p, pend, syntax)) BUF_PUSH (endline); else goto normal_char; } break; case '+': case '?': if ((syntax & RE_BK_PLUS_QM) || (syntax & RE_LIMITED_OPS)) goto normal_char; handle_plus: case '*': /* If there is no previous pattern... */ if (!laststart) { if (syntax & RE_CONTEXT_INVALID_OPS) FREE_STACK_RETURN (REG_BADRPT); else if (!(syntax & RE_CONTEXT_INDEP_OPS)) goto normal_char; } { /* Are we optimizing this jump? */ char keep_string_p = false; /* 1 means zero (many) matches is allowed. */ char zero_times_ok = 0, many_times_ok = 0; /* If there is a sequence of repetition chars, collapse it down to just one (the right one). We can't combine interval operators with these because of, e.g., `a{2}*', which should only match an even number of `a's. */ for (;;) { zero_times_ok |= c != '+'; many_times_ok |= c != '?'; if (p == pend) break; PATFETCH (c); if (c == '*' || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?'))) ; else if (syntax & RE_BK_PLUS_QM && c == '\\') { if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); PATFETCH (c1); if (!(c1 == '+' || c1 == '?')) { PATUNFETCH; PATUNFETCH; break; } c = c1; } else { PATUNFETCH; break; } /* If we get here, we found another repeat character. */ } /* Star, etc. applied to an empty pattern is equivalent to an empty pattern. */ if (!laststart) break; /* Now we know whether or not zero matches is allowed and also whether or not two or more matches is allowed. */ if (many_times_ok) { /* More than one repetition is allowed, so put in at the end a backward relative jump from `b' to before the next jump we're going to put in below (which jumps from laststart to after this jump). But if we are at the `*' in the exact sequence `.*\n', insert an unconditional jump backwards to the ., instead of the beginning of the loop. This way we only push a failure point once, instead of every time through the loop. */ assert (p - 1 > pattern); /* Allocate the space for the jump. */ GET_BUFFER_SPACE (3); /* We know we are not at the first character of the pattern, because laststart was nonzero. And we've already incremented `p', by the way, to be the character after the `*'. Do we have to do something analogous here for null bytes, because of RE_DOT_NOT_NULL? */ if (TRANSLATE (*(p - 2)) == TRANSLATE ('.') && zero_times_ok && p < pend && TRANSLATE (*p) == TRANSLATE ('\n') && !(syntax & RE_DOT_NEWLINE)) { /* We have .*\n. */ STORE_JUMP (jump, b, laststart); keep_string_p = true; } else /* Anything else. */ STORE_JUMP (maybe_pop_jump, b, laststart - 3); /* We've added more stuff to the buffer. */ b += 3; } /* On failure, jump from laststart to b + 3, which will be the end of the buffer after this jump is inserted. */ GET_BUFFER_SPACE (3); INSERT_JUMP (keep_string_p ? on_failure_keep_string_jump : on_failure_jump, laststart, b + 3); pending_exact = 0; b += 3; if (!zero_times_ok) { /* At least one repetition is required, so insert a `dummy_failure_jump' before the initial `on_failure_jump' instruction of the loop. This effects a skip over that instruction the first time we hit that loop. */ GET_BUFFER_SPACE (3); INSERT_JUMP (dummy_failure_jump, laststart, laststart + 6); b += 3; } } break; case '.': laststart = b; BUF_PUSH (anychar); break; case '[': { char had_char_class = false; if (p == pend) FREE_STACK_RETURN (REG_EBRACK); /* Ensure that we have enough space to push a charset: the opcode, the length count, and the bitset; 34 bytes in all. */ GET_BUFFER_SPACE (34); laststart = b; /* We test `*p == '^' twice, instead of using an if statement, so we only need one BUF_PUSH. */ BUF_PUSH (*p == '^' ? charset_not : charset); if (*p == '^') p++; /* Remember the first position in the bracket expression. */ p1 = p; /* Push the number of bytes in the bitmap. */ BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH); /* Clear the whole map. */ bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH); /* charset_not matches newline according to a syntax bit. */ if ((re_opcode_t) b[-2] == charset_not && (syntax & RE_HAT_LISTS_NOT_NEWLINE)) SET_LIST_BIT ('\n'); /* Read in characters and ranges, setting map bits. */ for (;;) { if (p == pend) FREE_STACK_RETURN (REG_EBRACK); PATFETCH (c); /* \ might escape characters inside [...] and [^...]. */ if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\') { if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); PATFETCH (c1); SET_LIST_BIT (c1); continue; } /* Could be the end of the bracket expression. If it's not (i.e., when the bracket expression is `[]' so far), the ']' character bit gets set way below. */ if (c == ']' && p != p1 + 1) break; /* Look ahead to see if it's a range when the last thing was a character class. */ if (had_char_class && c == '-' && *p != ']') FREE_STACK_RETURN (REG_ERANGE); /* Look ahead to see if it's a range when the last thing was a character: if this is a hyphen not at the beginning or the end of a list, then it's the range operator. */ if (c == '-' && !(p - 2 >= pattern && p[-2] == '[') && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^') && *p != ']') { reg_errcode_t ret = compile_range (&p, pend, translate, syntax, b); if (ret != REG_NOERROR) FREE_STACK_RETURN (ret); } else if (p[0] == '-' && p[1] != ']') { /* This handles ranges made up of characters only. */ reg_errcode_t ret; /* Move past the `-'. */ PATFETCH (c1); ret = compile_range (&p, pend, translate, syntax, b); if (ret != REG_NOERROR) FREE_STACK_RETURN (ret); } /* See if we're at the beginning of a possible character class. */ else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':') { /* Leave room for the null. */ char str[CHAR_CLASS_MAX_LENGTH + 1]; PATFETCH (c); c1 = 0; /* If pattern is `[[:'. */ if (p == pend) FREE_STACK_RETURN (REG_EBRACK); for (;;) { PATFETCH (c); if ((c == ':' && *p == ']') || p == pend) break; if (c1 < CHAR_CLASS_MAX_LENGTH) str[c1++] = c; else /* This is in any case an invalid class name. */ str[0] = '\0'; } str[c1] = '\0'; /* If isn't a word bracketed by `[:' and `:]': undo the ending character, the letters, and leave the leading `:' and `[' (but set bits for them). */ if (c == ':' && *p == ']') { #if defined _LIBC || WIDE_CHAR_SUPPORT char is_lower = STREQ (str, "lower"); char is_upper = STREQ (str, "upper"); wctype_t wt; int ch; wt = IS_CHAR_CLASS (str); if (wt == 0) FREE_STACK_RETURN (REG_ECTYPE); /* Throw away the ] at the end of the character class. */ PATFETCH (c); if (p == pend) FREE_STACK_RETURN (REG_EBRACK); for (ch = 0; ch < 1 << BYTEWIDTH; ++ch) { # ifdef _LIBC if (__iswctype (__btowc (ch), wt)) SET_LIST_BIT (ch); # else if (iswctype (btowc (ch), wt)) SET_LIST_BIT (ch); # endif if (translate && (is_upper || is_lower) && (ISUPPER (ch) || ISLOWER (ch))) SET_LIST_BIT (ch); } had_char_class = true; #else int ch; char is_alnum = STREQ (str, "alnum"); char is_alpha = STREQ (str, "alpha"); char is_blank = STREQ (str, "blank"); char is_cntrl = STREQ (str, "cntrl"); char is_digit = STREQ (str, "digit"); char is_graph = STREQ (str, "graph"); char is_lower = STREQ (str, "lower"); char is_print = STREQ (str, "print"); char is_punct = STREQ (str, "punct"); char is_space = STREQ (str, "space"); char is_upper = STREQ (str, "upper"); char is_xdigit = STREQ (str, "xdigit"); if (!IS_CHAR_CLASS (str)) FREE_STACK_RETURN (REG_ECTYPE); /* Throw away the ] at the end of the character class. */ PATFETCH (c); if (p == pend) FREE_STACK_RETURN (REG_EBRACK); for (ch = 0; ch < 1 << BYTEWIDTH; ch++) { /* This was split into 3 if's to avoid an arbitrary limit in some compiler. */ if ( (is_alnum && ISALNUM (ch)) || (is_alpha && ISALPHA (ch)) || (is_blank && ISBLANK (ch)) || (is_cntrl && ISCNTRL (ch))) SET_LIST_BIT (ch); if ( (is_digit && ISDIGIT (ch)) || (is_graph && ISGRAPH (ch)) || (is_lower && ISLOWER (ch)) || (is_print && ISPRINT (ch))) SET_LIST_BIT (ch); if ( (is_punct && ISPUNCT (ch)) || (is_space && ISSPACE (ch)) || (is_upper && ISUPPER (ch)) || (is_xdigit && ISXDIGIT (ch))) SET_LIST_BIT (ch); if ( translate && (is_upper || is_lower) && (ISUPPER (ch) || ISLOWER (ch))) SET_LIST_BIT (ch); } had_char_class = true; #endif /* libc || wctype.h */ } else { c1++; while (c1--) PATUNFETCH; SET_LIST_BIT ('['); SET_LIST_BIT (':'); had_char_class = false; } } else { had_char_class = false; SET_LIST_BIT (c); } } /* Discard any (non)matching list bytes that are all 0 at the end of the map. Decrease the map-length byte too. */ while ((int) b[-1] > 0 && b[b[-1] - 1] == 0) b[-1]--; b += b[-1]; } break; case '(': if (syntax & RE_NO_BK_PARENS) goto handle_open; else goto normal_char; case ')': if (syntax & RE_NO_BK_PARENS) goto handle_close; else goto normal_char; case '\n': if (syntax & RE_NEWLINE_ALT) goto handle_alt; else goto normal_char; case '|': if (syntax & RE_NO_BK_VBAR) goto handle_alt; else goto normal_char; case '{': if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES) goto handle_interval; else goto normal_char; case '\\': if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); /* Do not translate the character after the \, so that we can distinguish, e.g., \B from \b, even if we normally would translate, e.g., B to b. */ PATFETCH_RAW (c); switch (c) { case '(': if (syntax & RE_NO_BK_PARENS) goto normal_backslash; handle_open: bufp->re_nsub++; regnum++; if (COMPILE_STACK_FULL) { RETALLOC (compile_stack.stack, compile_stack.size << 1, compile_stack_elt_t); if (compile_stack.stack == NULL) return REG_ESPACE; compile_stack.size <<= 1; } /* These are the values to restore when we hit end of this group. They are all relative offsets, so that if the whole pattern moves because of realloc, they will still be valid. */ COMPILE_STACK_TOP.begalt_offset = begalt - bufp->buffer; COMPILE_STACK_TOP.fixup_alt_jump = fixup_alt_jump ? fixup_alt_jump - bufp->buffer + 1 : 0; COMPILE_STACK_TOP.laststart_offset = b - bufp->buffer; COMPILE_STACK_TOP.regnum = regnum; /* We will eventually replace the 0 with the number of groups inner to this one. But do not push a start_memory for groups beyond the last one we can represent in the compiled pattern. */ if (regnum <= MAX_REGNUM) { COMPILE_STACK_TOP.inner_group_offset = b - bufp->buffer + 2; BUF_PUSH_3 (start_memory, regnum, 0); } compile_stack.avail++; fixup_alt_jump = 0; laststart = 0; begalt = b; /* If we've reached MAX_REGNUM groups, then this open won't actually generate any code, so we'll have to clear pending_exact explicitly. */ pending_exact = 0; break; case ')': if (syntax & RE_NO_BK_PARENS) goto normal_backslash; if (COMPILE_STACK_EMPTY) { if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) goto normal_backslash; else FREE_STACK_RETURN (REG_ERPAREN); } handle_close: if (fixup_alt_jump) { /* Push a dummy failure point at the end of the alternative for a possible future `pop_failure_jump' to pop. See comments at `push_dummy_failure' in `re_match_2'. */ BUF_PUSH (push_dummy_failure); /* We allocated space for this jump when we assigned to `fixup_alt_jump', in the `handle_alt' case below. */ STORE_JUMP (jump_past_alt, fixup_alt_jump, b - 1); } /* See similar code for backslashed left paren above. */ if (COMPILE_STACK_EMPTY) { if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) goto normal_char; else FREE_STACK_RETURN (REG_ERPAREN); } /* Since we just checked for an empty stack above, this ``can't happen''. */ assert (compile_stack.avail != 0); { /* We don't just want to restore into `regnum', because later groups should continue to be numbered higher, as in `(ab)c(de)' -- the second group is #2. */ regnum_t this_group_regnum; compile_stack.avail--; begalt = bufp->buffer + COMPILE_STACK_TOP.begalt_offset; fixup_alt_jump = COMPILE_STACK_TOP.fixup_alt_jump ? bufp->buffer + COMPILE_STACK_TOP.fixup_alt_jump - 1 : 0; laststart = bufp->buffer + COMPILE_STACK_TOP.laststart_offset; this_group_regnum = COMPILE_STACK_TOP.regnum; /* If we've reached MAX_REGNUM groups, then this open won't actually generate any code, so we'll have to clear pending_exact explicitly. */ pending_exact = 0; /* We're at the end of the group, so now we know how many groups were inside this one. */ if (this_group_regnum <= MAX_REGNUM) { unsigned char *inner_group_loc = bufp->buffer + COMPILE_STACK_TOP.inner_group_offset; *inner_group_loc = regnum - this_group_regnum; BUF_PUSH_3 (stop_memory, this_group_regnum, regnum - this_group_regnum); } } break; case '|': /* `\|'. */ if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR) goto normal_backslash; handle_alt: if (syntax & RE_LIMITED_OPS) goto normal_char; /* Insert before the previous alternative a jump which jumps to this alternative if the former fails. */ GET_BUFFER_SPACE (3); INSERT_JUMP (on_failure_jump, begalt, b + 6); pending_exact = 0; b += 3; /* The alternative before this one has a jump after it which gets executed if it gets matched. Adjust that jump so it will jump to this alternative's analogous jump (put in below, which in turn will jump to the next (if any) alternative's such jump, etc.). The last such jump jumps to the correct final destination. A picture: _____ _____ | | | | | v | v a | b | c If we are at `b', then fixup_alt_jump right now points to a three-byte space after `a'. We'll put in the jump, set fixup_alt_jump to right after `b', and leave behind three bytes which we'll fill in when we get to after `c'. */ if (fixup_alt_jump) STORE_JUMP (jump_past_alt, fixup_alt_jump, b); /* Mark and leave space for a jump after this alternative, to be filled in later either by next alternative or when know we're at the end of a series of alternatives. */ fixup_alt_jump = b; GET_BUFFER_SPACE (3); b += 3; laststart = 0; begalt = b; break; case '{': /* If \{ is a literal. */ if (!(syntax & RE_INTERVALS) /* If we're at `\{' and it's not the open-interval operator. */ || ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES)) || (p - 2 == pattern && p == pend)) goto normal_backslash; handle_interval: { /* If got here, then the syntax allows intervals. */ /* At least (most) this many matches must be made. */ int lower_bound = -1, upper_bound = -1; beg_interval = p - 1; if (p == pend) { if (syntax & RE_NO_BK_BRACES) goto unfetch_interval; else FREE_STACK_RETURN (REG_EBRACE); } GET_UNSIGNED_NUMBER (lower_bound); if (c == ',') { GET_UNSIGNED_NUMBER (upper_bound); if (upper_bound < 0) upper_bound = RE_DUP_MAX; } else /* Interval such as `{1}' => match exactly once. */ upper_bound = lower_bound; if (lower_bound < 0 || upper_bound > RE_DUP_MAX || lower_bound > upper_bound) { if (syntax & RE_NO_BK_BRACES) goto unfetch_interval; else FREE_STACK_RETURN (REG_BADBR); } if (!(syntax & RE_NO_BK_BRACES)) { if (c != '\\') FREE_STACK_RETURN (REG_EBRACE); PATFETCH (c); } if (c != '}') { if (syntax & RE_NO_BK_BRACES) goto unfetch_interval; else FREE_STACK_RETURN (REG_BADBR); } /* We just parsed a valid interval. */ /* If it's invalid to have no preceding re. */ if (!laststart) { if (syntax & RE_CONTEXT_INVALID_OPS) FREE_STACK_RETURN (REG_BADRPT); else if (syntax & RE_CONTEXT_INDEP_OPS) laststart = b; else goto unfetch_interval; } /* If the upper bound is zero, don't want to succeed at all; jump from `laststart' to `b + 3', which will be the end of the buffer after we insert the jump. */ if (upper_bound == 0) { GET_BUFFER_SPACE (3); INSERT_JUMP (jump, laststart, b + 3); b += 3; } /* Otherwise, we have a nontrivial interval. When we're all done, the pattern will look like: set_number_at set_number_at succeed_n jump_n (The upper bound and `jump_n' are omitted if `upper_bound' is 1, though.) */ else { /* If the upper bound is > 1, we need to insert more at the end of the loop. */ unsigned nbytes = 10 + (upper_bound > 1) * 10; GET_BUFFER_SPACE (nbytes); /* Initialize lower bound of the `succeed_n', even though it will be set during matching by its attendant `set_number_at' (inserted next), because `re_compile_fastmap' needs to know. Jump to the `jump_n' we might insert below. */ INSERT_JUMP2 (succeed_n, laststart, b + 5 + (upper_bound > 1) * 5, lower_bound); b += 5; /* Code to initialize the lower bound. Insert before the `succeed_n'. The `5' is the last two bytes of this `set_number_at', plus 3 bytes of the following `succeed_n'. */ insert_op2 (set_number_at, laststart, 5, lower_bound, b); b += 5; if (upper_bound > 1) { /* More than one repetition is allowed, so append a backward jump to the `succeed_n' that starts this interval. When we've reached this during matching, we'll have matched the interval once, so jump back only `upper_bound - 1' times. */ STORE_JUMP2 (jump_n, b, laststart + 5, upper_bound - 1); b += 5; /* The location we want to set is the second parameter of the `jump_n'; that is `b-2' as an absolute address. `laststart' will be the `set_number_at' we're about to insert; `laststart+3' the number to set, the source for the relative address. But we are inserting into the middle of the pattern -- so everything is getting moved up by 5. Conclusion: (b - 2) - (laststart + 3) + 5, i.e., b - laststart. We insert this at the beginning of the loop so that if we fail during matching, we'll reinitialize the bounds. */ insert_op2 (set_number_at, laststart, b - laststart, upper_bound - 1, b); b += 5; } } pending_exact = 0; beg_interval = NULL; } break; unfetch_interval: /* If an invalid interval, match the characters as literals. */ assert (beg_interval); p = beg_interval; beg_interval = NULL; /* normal_char and normal_backslash need `c'. */ PATFETCH (c); if (!(syntax & RE_NO_BK_BRACES)) { if (p > pattern && p[-1] == '\\') goto normal_backslash; } goto normal_char; #ifdef emacs /* There is no way to specify the before_dot and after_dot operators. rms says this is ok. --karl */ case '=': BUF_PUSH (at_dot); break; case 's': laststart = b; PATFETCH (c); BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]); break; case 'S': laststart = b; PATFETCH (c); BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]); break; #endif /* emacs */ case 'w': if (syntax & RE_NO_GNU_OPS) goto normal_char; laststart = b; BUF_PUSH (wordchar); break; case 'W': if (syntax & RE_NO_GNU_OPS) goto normal_char; laststart = b; BUF_PUSH (notwordchar); break; case '<': if (syntax & RE_NO_GNU_OPS) goto normal_char; BUF_PUSH (wordbeg); break; case '>': if (syntax & RE_NO_GNU_OPS) goto normal_char; BUF_PUSH (wordend); break; case 'b': if (syntax & RE_NO_GNU_OPS) goto normal_char; BUF_PUSH (wordbound); break; case 'B': if (syntax & RE_NO_GNU_OPS) goto normal_char; BUF_PUSH (notwordbound); break; case '`': if (syntax & RE_NO_GNU_OPS) goto normal_char; BUF_PUSH (begbuf); break; case '\'': if (syntax & RE_NO_GNU_OPS) goto normal_char; BUF_PUSH (endbuf); break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (syntax & RE_NO_BK_REFS) goto normal_char; c1 = c - '0'; if (c1 > regnum) FREE_STACK_RETURN (REG_ESUBREG); /* Can't back reference to a subexpression if inside of it. */ if (group_in_compile_stack (compile_stack, (regnum_t) c1)) goto normal_char; laststart = b; BUF_PUSH_2 (duplicate, c1); break; case '+': case '?': if (syntax & RE_BK_PLUS_QM) goto handle_plus; else goto normal_backslash; default: normal_backslash: /* You might think it would be useful for \ to mean not to translate; but if we don't translate it it will never match anything. */ c = TRANSLATE (c); goto normal_char; } break; default: /* Expects the character in `c'. */ normal_char: /* If no exactn currently being built. */ if (!pending_exact /* If last exactn not at current position. */ || pending_exact + *pending_exact + 1 != b /* We have only one byte following the exactn for the count. */ || *pending_exact == (1 << BYTEWIDTH) - 1 /* If followed by a repetition operator. */ || *p == '*' || *p == '^' || ((syntax & RE_BK_PLUS_QM) ? *p == '\\' && (p[1] == '+' || p[1] == '?') : (*p == '+' || *p == '?')) || ((syntax & RE_INTERVALS) && ((syntax & RE_NO_BK_BRACES) ? *p == '{' : (p[0] == '\\' && p[1] == '{')))) { /* Start building a new exactn. */ laststart = b; BUF_PUSH_2 (exactn, 0); pending_exact = b - 1; } BUF_PUSH (c); (*pending_exact)++; break; } /* switch (c) */ } /* while p != pend */ /* Through the pattern now. */ if (fixup_alt_jump) STORE_JUMP (jump_past_alt, fixup_alt_jump, b); if (!COMPILE_STACK_EMPTY) FREE_STACK_RETURN (REG_EPAREN); /* If we don't want backtracking, force success the first time we reach the end of the compiled pattern. */ if (syntax & RE_NO_POSIX_BACKTRACKING) BUF_PUSH (succeed); free (compile_stack.stack); /* We have succeeded; set the length of the buffer. */ bufp->used = b - bufp->buffer; #ifdef DEBUG if (debug) { DEBUG_PRINT1 ("\nCompiled pattern: \n"); print_compiled_pattern (bufp); } #endif /* DEBUG */ #ifndef MATCH_MAY_ALLOCATE /* Initialize the failure stack to the largest possible stack. This isn't necessary unless we're trying to avoid calling alloca in the search and match routines. */ { int num_regs = bufp->re_nsub + 1; /* Since DOUBLE_FAIL_STACK refuses to double only if the current size is strictly greater than re_max_failures, the largest possible stack is 2 * re_max_failures failure points. */ if (fail_stack.size < (2 * re_max_failures * MAX_FAILURE_ITEMS)) { fail_stack.size = (2 * re_max_failures * MAX_FAILURE_ITEMS); # ifdef emacs if (! fail_stack.stack) fail_stack.stack = (fail_stack_elt_t *) xmalloc (fail_stack.size * sizeof (fail_stack_elt_t)); else fail_stack.stack = (fail_stack_elt_t *) xrealloc (fail_stack.stack, (fail_stack.size * sizeof (fail_stack_elt_t))); # else /* not emacs */ if (! fail_stack.stack) fail_stack.stack = (fail_stack_elt_t *) malloc (fail_stack.size * sizeof (fail_stack_elt_t)); else fail_stack.stack = (fail_stack_elt_t *) realloc (fail_stack.stack, (fail_stack.size * sizeof (fail_stack_elt_t))); # endif /* not emacs */ } regex_grow_registers (num_regs); } #endif /* not MATCH_MAY_ALLOCATE */ return REG_NOERROR; } /* regex_compile */ /* Subroutines for `regex_compile'. */ /* Store OP at LOC followed by two-byte integer parameter ARG. */ static void store_op1 (op, loc, arg) re_opcode_t op; unsigned char *loc; int arg; { *loc = (unsigned char) op; STORE_NUMBER (loc + 1, arg); } /* Like `store_op1', but for two two-byte parameters ARG1 and ARG2. */ static void store_op2 (op, loc, arg1, arg2) re_opcode_t op; unsigned char *loc; int arg1, arg2; { *loc = (unsigned char) op; STORE_NUMBER (loc + 1, arg1); STORE_NUMBER (loc + 3, arg2); } /* Copy the bytes from LOC to END to open up three bytes of space at LOC for OP followed by two-byte integer parameter ARG. */ static void insert_op1 (op, loc, arg, end) re_opcode_t op; unsigned char *loc; int arg; unsigned char *end; { register unsigned char *pfrom = end; register unsigned char *pto = end + 3; while (pfrom != loc) *--pto = *--pfrom; store_op1 (op, loc, arg); } /* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2. */ static void insert_op2 (op, loc, arg1, arg2, end) re_opcode_t op; unsigned char *loc; int arg1, arg2; unsigned char *end; { register unsigned char *pfrom = end; register unsigned char *pto = end + 5; while (pfrom != loc) *--pto = *--pfrom; store_op2 (op, loc, arg1, arg2); } /* P points to just after a ^ in PATTERN. Return true if that ^ comes after an alternative or a begin-subexpression. We assume there is at least one character before the ^. */ static char at_begline_loc_p (pattern, p, syntax) const char *pattern, *p; reg_syntax_t syntax; { const char *prev = p - 2; char prev_prev_backslash = prev > pattern && prev[-1] == '\\'; return /* After a subexpression? */ (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash)) /* After an alternative? */ || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash)); } /* The dual of at_begline_loc_p. This one is for $. We assume there is at least one character after the $, i.e., `P < PEND'. */ static char at_endline_loc_p (p, pend, syntax) const char *p, *pend; reg_syntax_t syntax; { const char *next = p; char next_backslash = *next == '\\'; const char *next_next = p + 1 < pend ? p + 1 : 0; return /* Before a subexpression? */ (syntax & RE_NO_BK_PARENS ? *next == ')' : next_backslash && next_next && *next_next == ')') /* Before an alternative? */ || (syntax & RE_NO_BK_VBAR ? *next == '|' : next_backslash && next_next && *next_next == '|'); } /* Returns true if REGNUM is in one of COMPILE_STACK's elements and false if it's not. */ static char group_in_compile_stack (compile_stack, regnum) compile_stack_type compile_stack; regnum_t regnum; { int this_element; for (this_element = compile_stack.avail - 1; this_element >= 0; this_element--) if (compile_stack.stack[this_element].regnum == regnum) return true; return false; } /* Read the ending character of a range (in a bracket expression) from the uncompiled pattern *P_PTR (which ends at PEND). We assume the starting character is in `P[-2]'. (`P[-1]' is the character `-'.) Then we set the translation of all bits between the starting and ending characters (inclusive) in the compiled pattern B. Return an error code. We use these short variable names so we can use the same macros as `regex_compile' itself. */ static reg_errcode_t compile_range (p_ptr, pend, translate, syntax, b) const char **p_ptr, *pend; RE_TRANSLATE_TYPE translate; reg_syntax_t syntax; unsigned char *b; { unsigned this_char; const char *p = *p_ptr; unsigned int range_start, range_end; if (p == pend) return REG_ERANGE; /* Even though the pattern is a signed `char *', we need to fetch with unsigned char *'s; if the high bit of the pattern character is set, the range endpoints will be negative if we fetch using a signed char *. We also want to fetch the endpoints without translating them; the appropriate translation is done in the bit-setting loop below. */ /* The SVR4 compiler on the 3B2 had trouble with unsigned const char *. */ range_start = ((const unsigned char *) p)[-2]; range_end = ((const unsigned char *) p)[0]; /* Have to increment the pointer into the pattern string, so the caller isn't still at the ending character. */ (*p_ptr)++; /* If the start is after the end, the range is empty. */ if (range_start > range_end) return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR; /* Here we see why `this_char' has to be larger than an `unsigned char' -- the range is inclusive, so if `range_end' == 0xff (assuming 8-bit characters), we would otherwise go into an infinite loop, since all characters <= 0xff. */ for (this_char = range_start; this_char <= range_end; this_char++) { SET_LIST_BIT (TRANSLATE (this_char)); } return REG_NOERROR; } /* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in BUFP. A fastmap records which of the (1 << BYTEWIDTH) possible characters can start a string that matches the pattern. This fastmap is used by re_search to skip quickly over impossible starting points. The caller must supply the address of a (1 << BYTEWIDTH)-byte data area as BUFP->fastmap. We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in the pattern buffer. Returns 0 if we succeed, -2 if an internal error. */ int re_compile_fastmap (bufp) struct re_pattern_buffer *bufp; { int j, k; #ifdef MATCH_MAY_ALLOCATE fail_stack_type fail_stack; #endif #ifndef REGEX_MALLOC char *destination; #endif register char *fastmap = bufp->fastmap; unsigned char *pattern = bufp->buffer; unsigned char *p = pattern; register unsigned char *pend = pattern + bufp->used; #ifdef REL_ALLOC /* This holds the pointer to the failure stack, when it is allocated relocatably. */ fail_stack_elt_t *failure_stack_ptr; #endif /* Assume that each path through the pattern can be null until proven otherwise. We set this false at the bottom of switch statement, to which we get only if a particular path doesn't match the empty string. */ char path_can_be_null = true; /* We aren't doing a `succeed_n' to begin with. */ char succeed_n_p = false; assert (fastmap != NULL && p != NULL); INIT_FAIL_STACK (); bzero (fastmap, 1 << BYTEWIDTH); /* Assume nothing's valid. */ bufp->fastmap_accurate = 1; /* It will be when we're done. */ bufp->can_be_null = 0; while (1) { if (p == pend || *p == succeed) { /* We have reached the (effective) end of pattern. */ if (!FAIL_STACK_EMPTY ()) { bufp->can_be_null |= path_can_be_null; /* Reset for next path. */ path_can_be_null = true; p = fail_stack.stack[--fail_stack.avail].pointer; continue; } else break; } /* We should never be about to go beyond the end of the pattern. */ assert (p < pend); switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++)) { /* I guess the idea here is to simply not bother with a fastmap if a backreference is used, since it's too hard to figure out the fastmap for the corresponding group. Setting `can_be_null' stops `re_search_2' from using the fastmap, so that is all we do. */ case duplicate: bufp->can_be_null = 1; goto done; /* Following are the cases which match a character. These end with `break'. */ case exactn: fastmap[p[1]] = 1; break; case charset: for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))) fastmap[j] = 1; break; case charset_not: /* Chars beyond end of map must be allowed. */ for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++) fastmap[j] = 1; for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))) fastmap[j] = 1; break; case wordchar: for (j = 0; j < (1 << BYTEWIDTH); j++) if (SYNTAX (j) == Sword) fastmap[j] = 1; break; case notwordchar: for (j = 0; j < (1 << BYTEWIDTH); j++) if (SYNTAX (j) != Sword) fastmap[j] = 1; break; case anychar: { int fastmap_newline = fastmap['\n']; /* `.' matches anything ... */ for (j = 0; j < (1 << BYTEWIDTH); j++) fastmap[j] = 1; /* ... except perhaps newline. */ if (!(bufp->syntax & RE_DOT_NEWLINE)) fastmap['\n'] = fastmap_newline; /* Return if we have already set `can_be_null'; if we have, then the fastmap is irrelevant. Something's wrong here. */ else if (bufp->can_be_null) goto done; /* Otherwise, have to check alternative paths. */ break; } #ifdef emacs case syntaxspec: k = *p++; for (j = 0; j < (1 << BYTEWIDTH); j++) if (SYNTAX (j) == (enum syntaxcode) k) fastmap[j] = 1; break; case notsyntaxspec: k = *p++; for (j = 0; j < (1 << BYTEWIDTH); j++) if (SYNTAX (j) != (enum syntaxcode) k) fastmap[j] = 1; break; /* All cases after this match the empty string. These end with `continue'. */ case before_dot: case at_dot: case after_dot: continue; #endif /* emacs */ case no_op: case begline: case endline: case begbuf: case endbuf: case wordbound: case notwordbound: case wordbeg: case wordend: case push_dummy_failure: continue; case jump_n: case pop_failure_jump: case maybe_pop_jump: case jump: case jump_past_alt: case dummy_failure_jump: EXTRACT_NUMBER_AND_INCR (j, p); p += j; if (j > 0) continue; /* Jump backward implies we just went through the body of a loop and matched nothing. Opcode jumped to should be `on_failure_jump' or `succeed_n'. Just treat it like an ordinary jump. For a * loop, it has pushed its failure point already; if so, discard that as redundant. */ if ((re_opcode_t) *p != on_failure_jump && (re_opcode_t) *p != succeed_n) continue; p++; EXTRACT_NUMBER_AND_INCR (j, p); p += j; /* If what's on the stack is where we are now, pop it. */ if (!FAIL_STACK_EMPTY () && fail_stack.stack[fail_stack.avail - 1].pointer == p) fail_stack.avail--; continue; case on_failure_jump: case on_failure_keep_string_jump: handle_on_failure_jump: EXTRACT_NUMBER_AND_INCR (j, p); /* For some patterns, e.g., `(a?)?', `p+j' here points to the end of the pattern. We don't want to push such a point, since when we restore it above, entering the switch will increment `p' past the end of the pattern. We don't need to push such a point since we obviously won't find any more fastmap entries beyond `pend'. Such a pattern can match the null string, though. */ if (p + j < pend) { if (!PUSH_PATTERN_OP (p + j, fail_stack)) { RESET_FAIL_STACK (); return -2; } } else bufp->can_be_null = 1; if (succeed_n_p) { EXTRACT_NUMBER_AND_INCR (k, p); /* Skip the n. */ succeed_n_p = false; } continue; case succeed_n: /* Get to the number of times to succeed. */ p += 2; /* Increment p past the n for when k != 0. */ EXTRACT_NUMBER_AND_INCR (k, p); if (k == 0) { p -= 4; succeed_n_p = true; /* Spaghetti code alert. */ goto handle_on_failure_jump; } continue; case set_number_at: p += 4; continue; case start_memory: case stop_memory: p += 2; continue; default: abort (); /* We have listed all the cases. */ } /* switch *p++ */ /* Getting here means we have found the possible starting characters for one path of the pattern -- and that the empty string does not match. We need not follow this path further. Instead, look at the next alternative (remembered on the stack), or quit if no more. The test at the top of the loop does these things. */ path_can_be_null = false; p = pend; } /* while p */ /* Set `can_be_null' for the last path (also the first path, if the pattern is empty). */ bufp->can_be_null |= path_can_be_null; done: RESET_FAIL_STACK (); return 0; } /* re_compile_fastmap */ #ifdef _LIBC weak_alias (__re_compile_fastmap, re_compile_fastmap) #endif /* Set REGS to hold NUM_REGS registers, storing them in STARTS and ENDS. Subsequent matches using PATTERN_BUFFER and REGS will use this memory for recording register information. STARTS and ENDS must be allocated using the malloc library routine, and must each be at least NUM_REGS * sizeof (regoff_t) bytes long. If NUM_REGS == 0, then subsequent matches should allocate their own register data. Unless this function is called, the first search or match using PATTERN_BUFFER will allocate its own register data, without freeing the old data. */ void re_set_registers (bufp, regs, num_regs, starts, ends) struct re_pattern_buffer *bufp; struct re_registers *regs; unsigned num_regs; regoff_t *starts, *ends; { if (num_regs) { bufp->regs_allocated = REGS_REALLOCATE; regs->num_regs = num_regs; regs->start = starts; regs->end = ends; } else { bufp->regs_allocated = REGS_UNALLOCATED; regs->num_regs = 0; regs->start = regs->end = (regoff_t *) 0; } } #ifdef _LIBC weak_alias (__re_set_registers, re_set_registers) #endif /* Searching routines. */ /* Like re_search_2, below, but only one string is specified, and doesn't let you say where to stop matching. */ int re_search (bufp, string, size, startpos, range, regs) struct re_pattern_buffer *bufp; const char *string; int size, startpos, range; struct re_registers *regs; { return re_search_2 (bufp, NULL, 0, string, size, startpos, range, regs, size); } #ifdef _LIBC weak_alias (__re_search, re_search) #endif /* Using the compiled pattern in BUFP->buffer, first tries to match the virtual concatenation of STRING1 and STRING2, starting first at index STARTPOS, then at STARTPOS + 1, and so on. STRING1 and STRING2 have length SIZE1 and SIZE2, respectively. RANGE is how far to scan while trying to match. RANGE = 0 means try only at STARTPOS; in general, the last start tried is STARTPOS + RANGE. In REGS, return the indices of the virtual concatenation of STRING1 and STRING2 that matched the entire BUFP->buffer and its contained subexpressions. Do not consider matching one past the index STOP in the virtual concatenation of STRING1 and STRING2. We return either the position in the strings at which the match was found, -1 if no match, or -2 if error (such as failure stack overflow). */ int re_search_2 (bufp, string1, size1, string2, size2, startpos, range, regs, stop) struct re_pattern_buffer *bufp; const char *string1, *string2; int size1, size2; int startpos; int range; struct re_registers *regs; int stop; { int val; register char *fastmap = bufp->fastmap; register RE_TRANSLATE_TYPE translate = bufp->translate; int total_size = size1 + size2; int endpos = startpos + range; /* Check for out-of-range STARTPOS. */ if (startpos < 0 || startpos > total_size) return -1; /* Fix up RANGE if it might eventually take us outside the virtual concatenation of STRING1 and STRING2. Make sure we won't move STARTPOS below 0 or above TOTAL_SIZE. */ if (endpos < 0) range = 0 - startpos; else if (endpos > total_size) range = total_size - startpos; /* If the search isn't to be a backwards one, don't waste time in a search for a pattern that must be anchored. */ if (bufp->used > 0 && range > 0 && ((re_opcode_t) bufp->buffer[0] == begbuf /* `begline' is like `begbuf' if it cannot match at newlines. */ || ((re_opcode_t) bufp->buffer[0] == begline && !bufp->newline_anchor))) { if (startpos > 0) return -1; else range = 1; } #ifdef emacs /* In a forward search for something that starts with \=. don't keep searching past point. */ if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == at_dot && range > 0) { range = PT - startpos; if (range <= 0) return -1; } #endif /* emacs */ /* Update the fastmap now if not correct already. */ if (fastmap && !bufp->fastmap_accurate) if (re_compile_fastmap (bufp) == -2) return -2; /* Loop through the string, looking for a place to start matching. */ for (;;) { /* If a fastmap is supplied, skip quickly over characters that cannot be the start of a match. If the pattern can match the null string, however, we don't need to skip characters; we want the first null string. */ if (fastmap && startpos < total_size && !bufp->can_be_null) { if (range > 0) /* Searching forwards. */ { register const char *d; register int lim = 0; int irange = range; if (startpos < size1 && startpos + range >= size1) lim = range - (size1 - startpos); d = (startpos >= size1 ? string2 - size1 : string1) + startpos; /* Written out as an if-else to avoid testing `translate' inside the loop. */ if (translate) while (range > lim && !fastmap[(unsigned char) translate[(unsigned char) *d++]]) range--; else while (range > lim && !fastmap[(unsigned char) *d++]) range--; startpos += irange - range; } else /* Searching backwards. */ { register char c = (size1 == 0 || startpos >= size1 ? string2[startpos - size1] : string1[startpos]); if (!fastmap[(unsigned char) TRANSLATE (c)]) goto advance; } } /* If can't match the null string, and that's all we have left, fail. */ if (range >= 0 && startpos == total_size && fastmap && !bufp->can_be_null) return -1; val = re_match_2_internal (bufp, string1, size1, string2, size2, startpos, regs, stop); #ifndef REGEX_MALLOC # ifdef C_ALLOCA alloca (0); # endif #endif if (val >= 0) return startpos; if (val == -2) return -2; advance: if (!range) break; else if (range > 0) { range--; startpos++; } else { range++; startpos--; } } return -1; } /* re_search_2 */ #ifdef _LIBC weak_alias (__re_search_2, re_search_2) #endif /* This converts PTR, a pointer into one of the search strings `string1' and `string2' into an offset from the beginning of that string. */ #define POINTER_TO_OFFSET(ptr) \ (FIRST_STRING_P (ptr) \ ? ((regoff_t) ((ptr) - string1)) \ : ((regoff_t) ((ptr) - string2 + size1))) /* Macros for dealing with the split strings in re_match_2. */ #define MATCHING_IN_FIRST_STRING (dend == end_match_1) /* Call before fetching a character with *d. This switches over to string2 if necessary. */ #define PREFETCH() \ while (d == dend) \ { \ /* End of string2 => fail. */ \ if (dend == end_match_2) \ goto fail; \ /* End of string1 => advance to string2. */ \ d = string2; \ dend = end_match_2; \ } /* Test if at very beginning or at very end of the virtual concatenation of `string1' and `string2'. If only one string, it's `string2'. */ #define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2) #define AT_STRINGS_END(d) ((d) == end2) /* Test if D points to a character which is word-constituent. We have two special cases to check for: if past the end of string1, look at the first character in string2; and if before the beginning of string2, look at the last character in string1. */ #define WORDCHAR_P(d) \ (SYNTAX ((d) == end1 ? *string2 \ : (d) == string2 - 1 ? *(end1 - 1) : *(d)) \ == Sword) /* Disabled due to a compiler bug -- see comment at case wordbound */ #if 0 /* Test if the character before D and the one at D differ with respect to being word-constituent. */ #define AT_WORD_BOUNDARY(d) \ (AT_STRINGS_BEG (d) || AT_STRINGS_END (d) \ || WORDCHAR_P (d - 1) != WORDCHAR_P (d)) #endif /* Free everything we malloc. */ #ifdef MATCH_MAY_ALLOCATE # define FREE_VAR(var) if (var) REGEX_FREE (var); var = NULL # define FREE_VARIABLES() \ do { \ REGEX_FREE_STACK (fail_stack.stack); \ FREE_VAR (regstart); \ FREE_VAR (regend); \ FREE_VAR (old_regstart); \ FREE_VAR (old_regend); \ FREE_VAR (best_regstart); \ FREE_VAR (best_regend); \ FREE_VAR (reg_info); \ FREE_VAR (reg_dummy); \ FREE_VAR (reg_info_dummy); \ } while (0) #else # define FREE_VARIABLES() ((void)0) /* Do nothing! But inhibit gcc warning. */ #endif /* not MATCH_MAY_ALLOCATE */ /* These values must meet several constraints. They must not be valid register values; since we have a limit of 255 registers (because we use only one byte in the pattern for the register number), we can use numbers larger than 255. They must differ by 1, because of NUM_FAILURE_ITEMS above. And the value for the lowest register must be larger than the value for the highest register, so we do not try to actually save any registers when none are active. */ #define NO_HIGHEST_ACTIVE_REG (1 << BYTEWIDTH) #define NO_LOWEST_ACTIVE_REG (NO_HIGHEST_ACTIVE_REG + 1) /* Matching routines. */ #ifndef emacs /* Emacs never uses this. */ /* re_match is like re_match_2 except it takes only a single string. */ int re_match (bufp, string, size, pos, regs) struct re_pattern_buffer *bufp; const char *string; int size, pos; struct re_registers *regs; { int result = re_match_2_internal (bufp, NULL, 0, string, size, pos, regs, size); # ifndef REGEX_MALLOC # ifdef C_ALLOCA alloca (0); # endif # endif return result; } # ifdef _LIBC weak_alias (__re_match, re_match) # endif #endif /* not emacs */ static char group_match_null_string_p _RE_ARGS ((unsigned char **p, unsigned char *end, register_info_type *reg_info)); static char alt_match_null_string_p _RE_ARGS ((unsigned char *p, unsigned char *end, register_info_type *reg_info)); static char common_op_match_null_string_p _RE_ARGS ((unsigned char **p, unsigned char *end, register_info_type *reg_info)); static int bcmp_translate _RE_ARGS ((const char *s1, const char *s2, int len, char *translate)); /* re_match_2 matches the compiled pattern in BUFP against the the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1 and SIZE2, respectively). We start matching at POS, and stop matching at STOP. If REGS is non-null and the `no_sub' field of BUFP is nonzero, we store offsets for the substring each group matched in REGS. See the documentation for exactly how many groups we fill. We return -1 if no match, -2 if an internal error (such as the failure stack overflowing). Otherwise, we return the length of the matched substring. */ int re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop) struct re_pattern_buffer *bufp; const char *string1, *string2; int size1, size2; int pos; struct re_registers *regs; int stop; { int result = re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop); #ifndef REGEX_MALLOC # ifdef C_ALLOCA alloca (0); # endif #endif return result; } #ifdef _LIBC weak_alias (__re_match_2, re_match_2) #endif /* This is a separate function so that we can force an alloca cleanup afterwards. */ static int re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop) struct re_pattern_buffer *bufp; const char *string1, *string2; int size1, size2; int pos; struct re_registers *regs; int stop; { /* General temporaries. */ int mcnt; unsigned char *p1; /* Just past the end of the corresponding string. */ const char *end1, *end2; /* Pointers into string1 and string2, just past the last characters in each to consider matching. */ const char *end_match_1, *end_match_2; /* Where we are in the data, and the end of the current string. */ const char *d, *dend; /* Where we are in the pattern, and the end of the pattern. */ unsigned char *p = bufp->buffer; register unsigned char *pend = p + bufp->used; /* Mark the opcode just after a start_memory, so we can test for an empty subpattern when we get to the stop_memory. */ unsigned char *just_past_start_mem = 0; /* We use this to map every character in the string. */ RE_TRANSLATE_TYPE translate = bufp->translate; /* Failure point stack. Each place that can handle a failure further down the line pushes a failure point on this stack. It consists of restart, regend, and reg_info for all registers corresponding to the subexpressions we're currently inside, plus the number of such registers, and, finally, two char *'s. The first char * is where to resume scanning the pattern; the second one is where to resume scanning the strings. If the latter is zero, the failure point is a ``dummy''; if a failure happens and the failure point is a dummy, it gets discarded and the next next one is tried. */ #ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global. */ fail_stack_type fail_stack; #endif #ifdef DEBUG static unsigned failure_id; unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0; #endif #ifdef REL_ALLOC /* This holds the pointer to the failure stack, when it is allocated relocatably. */ fail_stack_elt_t *failure_stack_ptr; #endif /* We fill all the registers internally, independent of what we return, for use in backreferences. The number here includes an element for register zero. */ size_t num_regs = bufp->re_nsub + 1; /* The currently active registers. */ active_reg_t lowest_active_reg = NO_LOWEST_ACTIVE_REG; active_reg_t highest_active_reg = NO_HIGHEST_ACTIVE_REG; /* Information on the contents of registers. These are pointers into the input strings; they record just what was matched (on this attempt) by a subexpression part of the pattern, that is, the regnum-th regstart pointer points to where in the pattern we began matching and the regnum-th regend points to right after where we stopped matching the regnum-th subexpression. (The zeroth register keeps track of what the whole pattern matches.) */ #ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ const char **regstart, **regend; #endif /* If a group that's operated upon by a repetition operator fails to match anything, then the register for its start will need to be restored because it will have been set to wherever in the string we are when we last see its open-group operator. Similarly for a register's end. */ #ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ const char **old_regstart, **old_regend; #endif /* The is_active field of reg_info helps us keep track of which (possibly nested) subexpressions we are currently in. The matched_something field of reg_info[reg_num] helps us tell whether or not we have matched any of the pattern so far this time through the reg_num-th subexpression. These two fields get reset each time through any loop their register is in. */ #ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global. */ register_info_type *reg_info; #endif /* The following record the register info as found in the above variables when we find a match better than any we've seen before. This happens as we backtrack through the failure points, which in turn happens only if we have not yet matched the entire string. */ unsigned best_regs_set = false; #ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ const char **best_regstart, **best_regend; #endif /* Logically, this is `best_regend[0]'. But we don't want to have to allocate space for that if we're not allocating space for anything else (see below). Also, we never need info about register 0 for any of the other register vectors, and it seems rather a kludge to treat `best_regend' differently than the rest. So we keep track of the end of the best match so far in a separate variable. We initialize this to NULL so that when we backtrack the first time and need to test it, it's not garbage. */ const char *match_end = NULL; /* This helps SET_REGS_MATCHED avoid doing redundant work. */ int set_regs_matched_done = 0; /* Used when we pop values we don't care about. */ #ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ const char **reg_dummy; register_info_type *reg_info_dummy; #endif #ifdef DEBUG /* Counts the total number of registers pushed. */ unsigned num_regs_pushed = 0; #endif DEBUG_PRINT1 ("\n\nEntering re_match_2.\n"); INIT_FAIL_STACK (); #ifdef MATCH_MAY_ALLOCATE /* Do not bother to initialize all the register variables if there are no groups in the pattern, as it takes a fair amount of time. If there are groups, we include space for register 0 (the whole pattern), even though we never use it, since it simplifies the array indexing. We should fix this. */ if (bufp->re_nsub) { regstart = REGEX_TALLOC (num_regs, const char *); regend = REGEX_TALLOC (num_regs, const char *); old_regstart = REGEX_TALLOC (num_regs, const char *); old_regend = REGEX_TALLOC (num_regs, const char *); best_regstart = REGEX_TALLOC (num_regs, const char *); best_regend = REGEX_TALLOC (num_regs, const char *); reg_info = REGEX_TALLOC (num_regs, register_info_type); reg_dummy = REGEX_TALLOC (num_regs, const char *); reg_info_dummy = REGEX_TALLOC (num_regs, register_info_type); if (!(regstart && regend && old_regstart && old_regend && reg_info && best_regstart && best_regend && reg_dummy && reg_info_dummy)) { FREE_VARIABLES (); return -2; } } else { /* We must initialize all our variables to NULL, so that `FREE_VARIABLES' doesn't try to free them. */ regstart = regend = old_regstart = old_regend = best_regstart = best_regend = reg_dummy = NULL; reg_info = reg_info_dummy = (register_info_type *) NULL; } #endif /* MATCH_MAY_ALLOCATE */ /* The starting position is bogus. */ if (pos < 0 || pos > size1 + size2) { FREE_VARIABLES (); return -1; } /* Initialize subexpression text positions to -1 to mark ones that no start_memory/stop_memory has been seen for. Also initialize the register information struct. */ for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++) { regstart[mcnt] = regend[mcnt] = old_regstart[mcnt] = old_regend[mcnt] = REG_UNSET_VALUE; REG_MATCH_NULL_STRING_P (reg_info[mcnt]) = MATCH_NULL_UNSET_VALUE; IS_ACTIVE (reg_info[mcnt]) = 0; MATCHED_SOMETHING (reg_info[mcnt]) = 0; EVER_MATCHED_SOMETHING (reg_info[mcnt]) = 0; } /* We move `string1' into `string2' if the latter's empty -- but not if `string1' is null. */ if (size2 == 0 && string1 != NULL) { string2 = string1; size2 = size1; string1 = 0; size1 = 0; } end1 = string1 + size1; end2 = string2 + size2; /* Compute where to stop matching, within the two strings. */ if (stop <= size1) { end_match_1 = string1 + stop; end_match_2 = string2; } else { end_match_1 = end1; end_match_2 = string2 + stop - size1; } /* `p' scans through the pattern as `d' scans through the data. `dend' is the end of the input string that `d' points within. `d' is advanced into the following input string whenever necessary, but this happens before fetching; therefore, at the beginning of the loop, `d' can be pointing at the end of a string, but it cannot equal `string2'. */ if (size1 > 0 && pos <= size1) { d = string1 + pos; dend = end_match_1; } else { d = string2 + pos - size1; dend = end_match_2; } DEBUG_PRINT1 ("The compiled pattern is:\n"); DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend); DEBUG_PRINT1 ("The string to match is: `"); DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2); DEBUG_PRINT1 ("'\n"); /* This loops over pattern commands. It exits by returning from the function if the match is complete, or it drops through if the match fails at this starting point in the input data. */ for (;;) { DEBUG_PRINT2 ("\n%p: ", p); if (p == pend) { /* End of pattern means we might have succeeded. */ DEBUG_PRINT1 ("end of pattern ... "); /* If we haven't matched the entire string, and we want the longest match, try backtracking. */ if (d != end_match_2) { /* 1 if this match ends in the same string (string1 or string2) as the best previous match. */ char same_str_p = (FIRST_STRING_P (match_end) == MATCHING_IN_FIRST_STRING); /* 1 if this match is the best seen so far. */ char best_match_p; /* AIX compiler got confused when this was combined with the previous declaration. */ if (same_str_p) best_match_p = d > match_end; else best_match_p = !MATCHING_IN_FIRST_STRING; DEBUG_PRINT1 ("backtracking.\n"); if (!FAIL_STACK_EMPTY ()) { /* More failure points to try. */ /* If exceeds best match so far, save it. */ if (!best_regs_set || best_match_p) { best_regs_set = true; match_end = d; DEBUG_PRINT1 ("\nSAVING match as best so far.\n"); for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++) { best_regstart[mcnt] = regstart[mcnt]; best_regend[mcnt] = regend[mcnt]; } } goto fail; } /* If no failure points, don't restore garbage. And if last match is real best match, don't restore second best one. */ else if (best_regs_set && !best_match_p) { restore_best_regs: /* Restore best match. It may happen that `dend == end_match_1' while the restored d is in string2. For example, the pattern `x.*y.*z' against the strings `x-' and `y-z-', if the two strings are not consecutive in memory. */ DEBUG_PRINT1 ("Restoring best registers.\n"); d = match_end; dend = ((d >= string1 && d <= end1) ? end_match_1 : end_match_2); for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++) { regstart[mcnt] = best_regstart[mcnt]; regend[mcnt] = best_regend[mcnt]; } } } /* d != end_match_2 */ succeed_label: DEBUG_PRINT1 ("Accepting match.\n"); /* If caller wants register contents data back, do it. */ if (regs && !bufp->no_sub) { /* Have the register data arrays been allocated? */ if (bufp->regs_allocated == REGS_UNALLOCATED) { /* No. So allocate them with malloc. We need one extra element beyond `num_regs' for the `-1' marker GNU code uses. */ regs->num_regs = MAX (RE_NREGS, num_regs + 1); regs->start = TALLOC (regs->num_regs, regoff_t); regs->end = TALLOC (regs->num_regs, regoff_t); if (regs->start == NULL || regs->end == NULL) { FREE_VARIABLES (); return -2; } bufp->regs_allocated = REGS_REALLOCATE; } else if (bufp->regs_allocated == REGS_REALLOCATE) { /* Yes. If we need more elements than were already allocated, reallocate them. If we need fewer, just leave it alone. */ if (regs->num_regs < num_regs + 1) { regs->num_regs = num_regs + 1; RETALLOC (regs->start, regs->num_regs, regoff_t); RETALLOC (regs->end, regs->num_regs, regoff_t); if (regs->start == NULL || regs->end == NULL) { FREE_VARIABLES (); return -2; } } } else { /* These braces fend off a "empty body in an else-statement" warning under GCC when assert expands to nothing. */ assert (bufp->regs_allocated == REGS_FIXED); } /* Convert the pointer data in `regstart' and `regend' to indices. Register zero has to be set differently, since we haven't kept track of any info for it. */ if (regs->num_regs > 0) { regs->start[0] = pos; regs->end[0] = (MATCHING_IN_FIRST_STRING ? ((regoff_t) (d - string1)) : ((regoff_t) (d - string2 + size1))); } /* Go through the first `min (num_regs, regs->num_regs)' registers, since that is all we initialized. */ for (mcnt = 1; (unsigned) mcnt < MIN (num_regs, regs->num_regs); mcnt++) { if (REG_UNSET (regstart[mcnt]) || REG_UNSET (regend[mcnt])) regs->start[mcnt] = regs->end[mcnt] = -1; else { regs->start[mcnt] = (regoff_t) POINTER_TO_OFFSET (regstart[mcnt]); regs->end[mcnt] = (regoff_t) POINTER_TO_OFFSET (regend[mcnt]); } } /* If the regs structure we return has more elements than were in the pattern, set the extra elements to -1. If we (re)allocated the registers, this is the case, because we always allocate enough to have at least one -1 at the end. */ for (mcnt = num_regs; (unsigned) mcnt < regs->num_regs; mcnt++) regs->start[mcnt] = regs->end[mcnt] = -1; } /* regs && !bufp->no_sub */ DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n", nfailure_points_pushed, nfailure_points_popped, nfailure_points_pushed - nfailure_points_popped); DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed); mcnt = d - pos - (MATCHING_IN_FIRST_STRING ? string1 : string2 - size1); DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt); FREE_VARIABLES (); return mcnt; } /* Otherwise match next pattern command. */ switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++)) { /* Ignore these. Used to ignore the n of succeed_n's which currently have n == 0. */ case no_op: DEBUG_PRINT1 ("EXECUTING no_op.\n"); break; case succeed: DEBUG_PRINT1 ("EXECUTING succeed.\n"); goto succeed_label; /* Match the next n pattern characters exactly. The following byte in the pattern defines n, and the n bytes after that are the characters to match. */ case exactn: mcnt = *p++; DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt); /* This is written out as an if-else so we don't waste time testing `translate' inside the loop. */ if (translate) { do { PREFETCH (); if ((unsigned char) translate[(unsigned char) *d++] != (unsigned char) *p++) goto fail; } while (--mcnt); } else { do { PREFETCH (); if (*d++ != (char) *p++) goto fail; } while (--mcnt); } SET_REGS_MATCHED (); break; /* Match any character except possibly a newline or a null. */ case anychar: DEBUG_PRINT1 ("EXECUTING anychar.\n"); PREFETCH (); if ((!(bufp->syntax & RE_DOT_NEWLINE) && TRANSLATE (*d) == '\n') || (bufp->syntax & RE_DOT_NOT_NULL && TRANSLATE (*d) == '\000')) goto fail; SET_REGS_MATCHED (); DEBUG_PRINT2 (" Matched `%d'.\n", *d); d++; break; case charset: case charset_not: { register unsigned char c; char not = (re_opcode_t) *(p - 1) == charset_not; DEBUG_PRINT2 ("EXECUTING charset%s.\n", not ? "_not" : ""); PREFETCH (); c = TRANSLATE (*d); /* The character to match. */ /* Cast to `unsigned' instead of `unsigned char' in case the bit list is a full 32 bytes long. */ if (c < (unsigned) (*p * BYTEWIDTH) && p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) not = !not; p += 1 + *p; if (!not) goto fail; SET_REGS_MATCHED (); d++; break; } /* The beginning of a group is represented by start_memory. The arguments are the register number in the next byte, and the number of groups inner to this one in the next. The text matched within the group is recorded (in the internal registers data structure) under the register number. */ case start_memory: DEBUG_PRINT3 ("EXECUTING start_memory %d (%d):\n", *p, p[1]); /* Find out if this group can match the empty string. */ p1 = p; /* To send to group_match_null_string_p. */ if (REG_MATCH_NULL_STRING_P (reg_info[*p]) == MATCH_NULL_UNSET_VALUE) REG_MATCH_NULL_STRING_P (reg_info[*p]) = group_match_null_string_p (&p1, pend, reg_info); /* Save the position in the string where we were the last time we were at this open-group operator in case the group is operated upon by a repetition operator, e.g., with `(a*)*b' against `ab'; then we want to ignore where we are now in the string in case this attempt to match fails. */ old_regstart[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p]) ? REG_UNSET (regstart[*p]) ? d : regstart[*p] : regstart[*p]; DEBUG_PRINT2 (" old_regstart: %d\n", POINTER_TO_OFFSET (old_regstart[*p])); regstart[*p] = d; DEBUG_PRINT2 (" regstart: %d\n", POINTER_TO_OFFSET (regstart[*p])); IS_ACTIVE (reg_info[*p]) = 1; MATCHED_SOMETHING (reg_info[*p]) = 0; /* Clear this whenever we change the register activity status. */ set_regs_matched_done = 0; /* This is the new highest active register. */ highest_active_reg = *p; /* If nothing was active before, this is the new lowest active register. */ if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) lowest_active_reg = *p; /* Move past the register number and inner group count. */ p += 2; just_past_start_mem = p; break; /* The stop_memory opcode represents the end of a group. Its arguments are the same as start_memory's: the register number, and the number of inner groups. */ case stop_memory: DEBUG_PRINT3 ("EXECUTING stop_memory %d (%d):\n", *p, p[1]); /* We need to save the string position the last time we were at this close-group operator in case the group is operated upon by a repetition operator, e.g., with `((a*)*(b*)*)*' against `aba'; then we want to ignore where we are now in the string in case this attempt to match fails. */ old_regend[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p]) ? REG_UNSET (regend[*p]) ? d : regend[*p] : regend[*p]; DEBUG_PRINT2 (" old_regend: %d\n", POINTER_TO_OFFSET (old_regend[*p])); regend[*p] = d; DEBUG_PRINT2 (" regend: %d\n", POINTER_TO_OFFSET (regend[*p])); /* This register isn't active anymore. */ IS_ACTIVE (reg_info[*p]) = 0; /* Clear this whenever we change the register activity status. */ set_regs_matched_done = 0; /* If this was the only register active, nothing is active anymore. */ if (lowest_active_reg == highest_active_reg) { lowest_active_reg = NO_LOWEST_ACTIVE_REG; highest_active_reg = NO_HIGHEST_ACTIVE_REG; } else { /* We must scan for the new highest active register, since it isn't necessarily one less than now: consider (a(b)c(d(e)f)g). When group 3 ends, after the f), the new highest active register is 1. */ unsigned char r = *p - 1; while (r > 0 && !IS_ACTIVE (reg_info[r])) r--; /* If we end up at register zero, that means that we saved the registers as the result of an `on_failure_jump', not a `start_memory', and we jumped to past the innermost `stop_memory'. For example, in ((.)*) we save registers 1 and 2 as a result of the *, but when we pop back to the second ), we are at the stop_memory 1. Thus, nothing is active. */ if (r == 0) { lowest_active_reg = NO_LOWEST_ACTIVE_REG; highest_active_reg = NO_HIGHEST_ACTIVE_REG; } else highest_active_reg = r; } /* If just failed to match something this time around with a group that's operated on by a repetition operator, try to force exit from the ``loop'', and restore the register information for this group that we had before trying this last match. */ if ((!MATCHED_SOMETHING (reg_info[*p]) || just_past_start_mem == p - 1) && (p + 2) < pend) { char is_a_jump_n = false; p1 = p + 2; mcnt = 0; switch ((re_opcode_t) *p1++) { case jump_n: is_a_jump_n = true; case pop_failure_jump: case maybe_pop_jump: case jump: case dummy_failure_jump: EXTRACT_NUMBER_AND_INCR (mcnt, p1); if (is_a_jump_n) p1 += 2; break; default: /* do nothing */ ; } p1 += mcnt; /* If the next operation is a jump backwards in the pattern to an on_failure_jump right before the start_memory corresponding to this stop_memory, exit from the loop by forcing a failure after pushing on the stack the on_failure_jump's jump in the pattern, and d. */ if (mcnt < 0 && (re_opcode_t) *p1 == on_failure_jump && (re_opcode_t) p1[3] == start_memory && p1[4] == *p) { /* If this group ever matched anything, then restore what its registers were before trying this last failed match, e.g., with `(a*)*b' against `ab' for regstart[1], and, e.g., with `((a*)*(b*)*)*' against `aba' for regend[3]. Also restore the registers for inner groups for, e.g., `((a*)(b*))*' against `aba' (register 3 would otherwise get trashed). */ if (EVER_MATCHED_SOMETHING (reg_info[*p])) { unsigned r; EVER_MATCHED_SOMETHING (reg_info[*p]) = 0; /* Restore this and inner groups' (if any) registers. */ for (r = *p; r < (unsigned) *p + (unsigned) *(p + 1); r++) { regstart[r] = old_regstart[r]; /* xx why this test? */ if (old_regend[r] >= regstart[r]) regend[r] = old_regend[r]; } } p1++; EXTRACT_NUMBER_AND_INCR (mcnt, p1); PUSH_FAILURE_POINT (p1 + mcnt, d, -2); goto fail; } } /* Move past the register number and the inner group count. */ p += 2; break; /* \ has been turned into a `duplicate' command which is followed by the numeric value of as the register number. */ case duplicate: { register const char *d2, *dend2; int regno = *p++; /* Get which register to match against. */ DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno); /* Can't back reference a group which we've never matched. */ if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno])) goto fail; /* Where in input to try to start matching. */ d2 = regstart[regno]; /* Where to stop matching; if both the place to start and the place to stop matching are in the same string, then set to the place to stop, otherwise, for now have to use the end of the first string. */ dend2 = ((FIRST_STRING_P (regstart[regno]) == FIRST_STRING_P (regend[regno])) ? regend[regno] : end_match_1); for (;;) { /* If necessary, advance to next segment in register contents. */ while (d2 == dend2) { if (dend2 == end_match_2) break; if (dend2 == regend[regno]) break; /* End of string1 => advance to string2. */ d2 = string2; dend2 = regend[regno]; } /* At end of register contents => success */ if (d2 == dend2) break; /* If necessary, advance to next segment in data. */ PREFETCH (); /* How many characters left in this segment to match. */ mcnt = dend - d; /* Want how many consecutive characters we can match in one shot, so, if necessary, adjust the count. */ if (mcnt > dend2 - d2) mcnt = dend2 - d2; /* Compare that many; failure if mismatch, else move past them. */ if (translate ? bcmp_translate (d, d2, mcnt, translate) : memcmp (d, d2, mcnt)) goto fail; d += mcnt, d2 += mcnt; /* Do this because we've match some characters. */ SET_REGS_MATCHED (); } } break; /* begline matches the empty string at the beginning of the string (unless `not_bol' is set in `bufp'), and, if `newline_anchor' is set, after newlines. */ case begline: DEBUG_PRINT1 ("EXECUTING begline.\n"); if (AT_STRINGS_BEG (d)) { if (!bufp->not_bol) break; } else if (d[-1] == '\n' && bufp->newline_anchor) { break; } /* In all other cases, we fail. */ goto fail; /* endline is the dual of begline. */ case endline: DEBUG_PRINT1 ("EXECUTING endline.\n"); if (AT_STRINGS_END (d)) { if (!bufp->not_eol) break; } /* We have to ``prefetch'' the next character. */ else if ((d == end1 ? *string2 : *d) == '\n' && bufp->newline_anchor) { break; } goto fail; /* Match at the very beginning of the data. */ case begbuf: DEBUG_PRINT1 ("EXECUTING begbuf.\n"); if (AT_STRINGS_BEG (d)) break; goto fail; /* Match at the very end of the data. */ case endbuf: DEBUG_PRINT1 ("EXECUTING endbuf.\n"); if (AT_STRINGS_END (d)) break; goto fail; /* on_failure_keep_string_jump is used to optimize `.*\n'. It pushes NULL as the value for the string on the stack. Then `pop_failure_point' will keep the current value for the string, instead of restoring it. To see why, consider matching `foo\nbar' against `.*\n'. The .* matches the foo; then the . fails against the \n. But the next thing we want to do is match the \n against the \n; if we restored the string value, we would be back at the foo. Because this is used only in specific cases, we don't need to check all the things that `on_failure_jump' does, to make sure the right things get saved on the stack. Hence we don't share its code. The only reason to push anything on the stack at all is that otherwise we would have to change `anychar's code to do something besides goto fail in this case; that seems worse than this. */ case on_failure_keep_string_jump: DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump"); EXTRACT_NUMBER_AND_INCR (mcnt, p); DEBUG_PRINT3 (" %d (to %p):\n", mcnt, p + mcnt); PUSH_FAILURE_POINT (p + mcnt, NULL, -2); break; /* Uses of on_failure_jump: Each alternative starts with an on_failure_jump that points to the beginning of the next alternative. Each alternative except the last ends with a jump that in effect jumps past the rest of the alternatives. (They really jump to the ending jump of the following alternative, because tensioning these jumps is a hassle.) Repeats start with an on_failure_jump that points past both the repetition text and either the following jump or pop_failure_jump back to this on_failure_jump. */ case on_failure_jump: on_failure: DEBUG_PRINT1 ("EXECUTING on_failure_jump"); EXTRACT_NUMBER_AND_INCR (mcnt, p); DEBUG_PRINT3 (" %d (to %p)", mcnt, p + mcnt); /* If this on_failure_jump comes right before a group (i.e., the original * applied to a group), save the information for that group and all inner ones, so that if we fail back to this point, the group's information will be correct. For example, in \(a*\)*\1, we need the preceding group, and in \(zz\(a*\)b*\)\2, we need the inner group. */ /* We can't use `p' to check ahead because we push a failure point to `p + mcnt' after we do this. */ p1 = p; /* We need to skip no_op's before we look for the start_memory in case this on_failure_jump is happening as the result of a completed succeed_n, as in \(a\)\{1,3\}b\1 against aba. */ while (p1 < pend && (re_opcode_t) *p1 == no_op) p1++; if (p1 < pend && (re_opcode_t) *p1 == start_memory) { /* We have a new highest active register now. This will get reset at the start_memory we are about to get to, but we will have saved all the registers relevant to this repetition op, as described above. */ highest_active_reg = *(p1 + 1) + *(p1 + 2); if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) lowest_active_reg = *(p1 + 1); } DEBUG_PRINT1 (":\n"); PUSH_FAILURE_POINT (p + mcnt, d, -2); break; /* A smart repeat ends with `maybe_pop_jump'. We change it to either `pop_failure_jump' or `jump'. */ case maybe_pop_jump: EXTRACT_NUMBER_AND_INCR (mcnt, p); DEBUG_PRINT2 ("EXECUTING maybe_pop_jump %d.\n", mcnt); { register unsigned char *p2 = p; /* Compare the beginning of the repeat with what in the pattern follows its end. If we can establish that there is nothing that they would both match, i.e., that we would have to backtrack because of (as in, e.g., `a*a') then we can change to pop_failure_jump, because we'll never have to backtrack. This is not true in the case of alternatives: in `(a|ab)*' we do need to backtrack to the `ab' alternative (e.g., if the string was `ab'). But instead of trying to detect that here, the alternative has put on a dummy failure point which is what we will end up popping. */ /* Skip over open/close-group commands. If what follows this loop is a ...+ construct, look at what begins its body, since we will have to match at least one of that. */ while (1) { if (p2 + 2 < pend && ((re_opcode_t) *p2 == stop_memory || (re_opcode_t) *p2 == start_memory)) p2 += 3; else if (p2 + 6 < pend && (re_opcode_t) *p2 == dummy_failure_jump) p2 += 6; else break; } p1 = p + mcnt; /* p1[0] ... p1[2] are the `on_failure_jump' corresponding to the `maybe_finalize_jump' of this case. Examine what follows. */ /* If we're at the end of the pattern, we can change. */ if (p2 == pend) { /* Consider what happens when matching ":\(.*\)" against ":/". I don't really understand this code yet. */ p[-3] = (unsigned char) pop_failure_jump; DEBUG_PRINT1 (" End of pattern: change to `pop_failure_jump'.\n"); } else if ((re_opcode_t) *p2 == exactn || (bufp->newline_anchor && (re_opcode_t) *p2 == endline)) { register unsigned char c = *p2 == (unsigned char) endline ? '\n' : p2[2]; if ((re_opcode_t) p1[3] == exactn && p1[5] != c) { p[-3] = (unsigned char) pop_failure_jump; DEBUG_PRINT3 (" %c != %c => pop_failure_jump.\n", c, p1[5]); } else if ((re_opcode_t) p1[3] == charset || (re_opcode_t) p1[3] == charset_not) { int not = (re_opcode_t) p1[3] == charset_not; if (c < (unsigned char) (p1[4] * BYTEWIDTH) && p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) not = !not; /* `not' is equal to 1 if c would match, which means that we can't change to pop_failure_jump. */ if (!not) { p[-3] = (unsigned char) pop_failure_jump; DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); } } } else if ((re_opcode_t) *p2 == charset) { /* We win if the first character of the loop is not part of the charset. */ if ((re_opcode_t) p1[3] == exactn && ! ((int) p2[1] * BYTEWIDTH > (int) p1[5] && (p2[2 + p1[5] / BYTEWIDTH] & (1 << (p1[5] % BYTEWIDTH))))) { p[-3] = (unsigned char) pop_failure_jump; DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); } else if ((re_opcode_t) p1[3] == charset_not) { int idx; /* We win if the charset_not inside the loop lists every character listed in the charset after. */ for (idx = 0; idx < (int) p2[1]; idx++) if (! (p2[2 + idx] == 0 || (idx < (int) p1[4] && ((p2[2 + idx] & ~ p1[5 + idx]) == 0)))) break; if (idx == p2[1]) { p[-3] = (unsigned char) pop_failure_jump; DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); } } else if ((re_opcode_t) p1[3] == charset) { int idx; /* We win if the charset inside the loop has no overlap with the one after the loop. */ for (idx = 0; idx < (int) p2[1] && idx < (int) p1[4]; idx++) if ((p2[2 + idx] & p1[5 + idx]) != 0) break; if (idx == p2[1] || idx == p1[4]) { p[-3] = (unsigned char) pop_failure_jump; DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); } } } } p -= 2; /* Point at relative address again. */ if ((re_opcode_t) p[-1] != pop_failure_jump) { p[-1] = (unsigned char) jump; DEBUG_PRINT1 (" Match => jump.\n"); goto unconditional_jump; } /* Note fall through. */ /* The end of a simple repeat has a pop_failure_jump back to its matching on_failure_jump, where the latter will push a failure point. The pop_failure_jump takes off failure points put on by this pop_failure_jump's matching on_failure_jump; we got through the pattern to here from the matching on_failure_jump, so didn't fail. */ case pop_failure_jump: { /* We need to pass separate storage for the lowest and highest registers, even though we don't care about the actual values. Otherwise, we will restore only one register from the stack, since lowest will == highest in `pop_failure_point'. */ active_reg_t dummy_low_reg, dummy_high_reg; unsigned char *pdummy; const char *sdummy; DEBUG_PRINT1 ("EXECUTING pop_failure_jump.\n"); POP_FAILURE_POINT (sdummy, pdummy, dummy_low_reg, dummy_high_reg, reg_dummy, reg_dummy, reg_info_dummy); } /* Note fall through. */ unconditional_jump: DEBUG_PRINT2 ("\n%p: ", p); /* Note fall through. */ /* Unconditionally jump (without popping any failure points). */ case jump: EXTRACT_NUMBER_AND_INCR (mcnt, p); /* Get the amount to jump. */ DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt); p += mcnt; /* Do the jump. */ DEBUG_PRINT2 ("(to %p).\n", p); break; /* We need this opcode so we can detect where alternatives end in `group_match_null_string_p' et al. */ case jump_past_alt: DEBUG_PRINT1 ("EXECUTING jump_past_alt.\n"); goto unconditional_jump; /* Normally, the on_failure_jump pushes a failure point, which then gets popped at pop_failure_jump. We will end up at pop_failure_jump, also, and with a pattern of, say, `a+', we are skipping over the on_failure_jump, so we have to push something meaningless for pop_failure_jump to pop. */ case dummy_failure_jump: DEBUG_PRINT1 ("EXECUTING dummy_failure_jump.\n"); /* It doesn't matter what we push for the string here. What the code at `fail' tests is the value for the pattern. */ PUSH_FAILURE_POINT (NULL, NULL, -2); goto unconditional_jump; /* At the end of an alternative, we need to push a dummy failure point in case we are followed by a `pop_failure_jump', because we don't want the failure point for the alternative to be popped. For example, matching `(a|ab)*' against `aab' requires that we match the `ab' alternative. */ case push_dummy_failure: DEBUG_PRINT1 ("EXECUTING push_dummy_failure.\n"); /* See comments just above at `dummy_failure_jump' about the two zeroes. */ PUSH_FAILURE_POINT (NULL, NULL, -2); break; /* Have to succeed matching what follows at least n times. After that, handle like `on_failure_jump'. */ case succeed_n: EXTRACT_NUMBER (mcnt, p + 2); DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt); assert (mcnt >= 0); /* Originally, this is how many times we HAVE to succeed. */ if (mcnt > 0) { mcnt--; p += 2; STORE_NUMBER_AND_INCR (p, mcnt); DEBUG_PRINT3 (" Setting %p to %d.\n", p - 2, mcnt); } else if (mcnt == 0) { DEBUG_PRINT2 (" Setting two bytes from %p to no_op.\n", p+2); p[2] = (unsigned char) no_op; p[3] = (unsigned char) no_op; goto on_failure; } break; case jump_n: EXTRACT_NUMBER (mcnt, p + 2); DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt); /* Originally, this is how many times we CAN jump. */ if (mcnt) { mcnt--; STORE_NUMBER (p + 2, mcnt); DEBUG_PRINT3 (" Setting %p to %d.\n", p + 2, mcnt); goto unconditional_jump; } /* If don't have to jump any more, skip over the rest of command. */ else p += 4; break; case set_number_at: { DEBUG_PRINT1 ("EXECUTING set_number_at.\n"); EXTRACT_NUMBER_AND_INCR (mcnt, p); p1 = p + mcnt; EXTRACT_NUMBER_AND_INCR (mcnt, p); DEBUG_PRINT3 (" Setting %p to %d.\n", p1, mcnt); STORE_NUMBER (p1, mcnt); break; } #if 0 /* The DEC Alpha C compiler 3.x generates incorrect code for the test WORDCHAR_P (d - 1) != WORDCHAR_P (d) in the expansion of AT_WORD_BOUNDARY, so this code is disabled. Expanding the macro and introducing temporary variables works around the bug. */ case wordbound: DEBUG_PRINT1 ("EXECUTING wordbound.\n"); if (AT_WORD_BOUNDARY (d)) break; goto fail; case notwordbound: DEBUG_PRINT1 ("EXECUTING notwordbound.\n"); if (AT_WORD_BOUNDARY (d)) goto fail; break; #else case wordbound: { char prevchar, thischar; DEBUG_PRINT1 ("EXECUTING wordbound.\n"); if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)) break; prevchar = WORDCHAR_P (d - 1); thischar = WORDCHAR_P (d); if (prevchar != thischar) break; goto fail; } case notwordbound: { char prevchar, thischar; DEBUG_PRINT1 ("EXECUTING notwordbound.\n"); if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)) goto fail; prevchar = WORDCHAR_P (d - 1); thischar = WORDCHAR_P (d); if (prevchar != thischar) goto fail; break; } #endif case wordbeg: DEBUG_PRINT1 ("EXECUTING wordbeg.\n"); if (WORDCHAR_P (d) && (AT_STRINGS_BEG (d) || !WORDCHAR_P (d - 1))) break; goto fail; case wordend: DEBUG_PRINT1 ("EXECUTING wordend.\n"); if (!AT_STRINGS_BEG (d) && WORDCHAR_P (d - 1) && (!WORDCHAR_P (d) || AT_STRINGS_END (d))) break; goto fail; #ifdef emacs case before_dot: DEBUG_PRINT1 ("EXECUTING before_dot.\n"); if (PTR_CHAR_POS ((unsigned char *) d) >= point) goto fail; break; case at_dot: DEBUG_PRINT1 ("EXECUTING at_dot.\n"); if (PTR_CHAR_POS ((unsigned char *) d) != point) goto fail; break; case after_dot: DEBUG_PRINT1 ("EXECUTING after_dot.\n"); if (PTR_CHAR_POS ((unsigned char *) d) <= point) goto fail; break; case syntaxspec: DEBUG_PRINT2 ("EXECUTING syntaxspec %d.\n", mcnt); mcnt = *p++; goto matchsyntax; case wordchar: DEBUG_PRINT1 ("EXECUTING Emacs wordchar.\n"); mcnt = (int) Sword; matchsyntax: PREFETCH (); /* Can't use *d++ here; SYNTAX may be an unsafe macro. */ d++; if (SYNTAX (d[-1]) != (enum syntaxcode) mcnt) goto fail; SET_REGS_MATCHED (); break; case notsyntaxspec: DEBUG_PRINT2 ("EXECUTING notsyntaxspec %d.\n", mcnt); mcnt = *p++; goto matchnotsyntax; case notwordchar: DEBUG_PRINT1 ("EXECUTING Emacs notwordchar.\n"); mcnt = (int) Sword; matchnotsyntax: PREFETCH (); /* Can't use *d++ here; SYNTAX may be an unsafe macro. */ d++; if (SYNTAX (d[-1]) == (enum syntaxcode) mcnt) goto fail; SET_REGS_MATCHED (); break; #else /* not emacs */ case wordchar: DEBUG_PRINT1 ("EXECUTING non-Emacs wordchar.\n"); PREFETCH (); if (!WORDCHAR_P (d)) goto fail; SET_REGS_MATCHED (); d++; break; case notwordchar: DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n"); PREFETCH (); if (WORDCHAR_P (d)) goto fail; SET_REGS_MATCHED (); d++; break; #endif /* not emacs */ default: abort (); } continue; /* Successfully executed one pattern command; keep going. */ /* We goto here if a matching operation fails. */ fail: if (!FAIL_STACK_EMPTY ()) { /* A restart point is known. Restore to that state. */ DEBUG_PRINT1 ("\nFAIL:\n"); POP_FAILURE_POINT (d, p, lowest_active_reg, highest_active_reg, regstart, regend, reg_info); /* If this failure point is a dummy, try the next one. */ if (!p) goto fail; /* If we failed to the end of the pattern, don't examine *p. */ assert (p <= pend); if (p < pend) { char is_a_jump_n = false; /* If failed to a backwards jump that's part of a repetition loop, need to pop this failure point and use the next one. */ switch ((re_opcode_t) *p) { case jump_n: is_a_jump_n = true; case maybe_pop_jump: case pop_failure_jump: case jump: p1 = p + 1; EXTRACT_NUMBER_AND_INCR (mcnt, p1); p1 += mcnt; if ((is_a_jump_n && (re_opcode_t) *p1 == succeed_n) || (!is_a_jump_n && (re_opcode_t) *p1 == on_failure_jump)) goto fail; break; default: /* do nothing */ ; } } if (d >= string1 && d <= end1) dend = end_match_1; } else break; /* Matching at this starting point really fails. */ } /* for (;;) */ if (best_regs_set) goto restore_best_regs; FREE_VARIABLES (); return -1; /* Failure to match. */ } /* re_match_2 */ /* Subroutine definitions for re_match_2. */ /* We are passed P pointing to a register number after a start_memory. Return true if the pattern up to the corresponding stop_memory can match the empty string, and false otherwise. If we find the matching stop_memory, sets P to point to one past its number. Otherwise, sets P to an undefined byte less than or equal to END. We don't handle duplicates properly (yet). */ static char group_match_null_string_p (p, end, reg_info) unsigned char **p, *end; register_info_type *reg_info; { int mcnt; /* Point to after the args to the start_memory. */ unsigned char *p1 = *p + 2; while (p1 < end) { /* Skip over opcodes that can match nothing, and return true or false, as appropriate, when we get to one that can't, or to the matching stop_memory. */ switch ((re_opcode_t) *p1) { /* Could be either a loop or a series of alternatives. */ case on_failure_jump: p1++; EXTRACT_NUMBER_AND_INCR (mcnt, p1); /* If the next operation is not a jump backwards in the pattern. */ if (mcnt >= 0) { /* Go through the on_failure_jumps of the alternatives, seeing if any of the alternatives cannot match nothing. The last alternative starts with only a jump, whereas the rest start with on_failure_jump and end with a jump, e.g., here is the pattern for `a|b|c': /on_failure_jump/0/6/exactn/1/a/jump_past_alt/0/6 /on_failure_jump/0/6/exactn/1/b/jump_past_alt/0/3 /exactn/1/c So, we have to first go through the first (n-1) alternatives and then deal with the last one separately. */ /* Deal with the first (n-1) alternatives, which start with an on_failure_jump (see above) that jumps to right past a jump_past_alt. */ while ((re_opcode_t) p1[mcnt-3] == jump_past_alt) { /* `mcnt' holds how many bytes long the alternative is, including the ending `jump_past_alt' and its number. */ if (!alt_match_null_string_p (p1, p1 + mcnt - 3, reg_info)) return false; /* Move to right after this alternative, including the jump_past_alt. */ p1 += mcnt; /* Break if it's the beginning of an n-th alternative that doesn't begin with an on_failure_jump. */ if ((re_opcode_t) *p1 != on_failure_jump) break; /* Still have to check that it's not an n-th alternative that starts with an on_failure_jump. */ p1++; EXTRACT_NUMBER_AND_INCR (mcnt, p1); if ((re_opcode_t) p1[mcnt-3] != jump_past_alt) { /* Get to the beginning of the n-th alternative. */ p1 -= 3; break; } } /* Deal with the last alternative: go back and get number of the `jump_past_alt' just before it. `mcnt' contains the length of the alternative. */ EXTRACT_NUMBER (mcnt, p1 - 2); if (!alt_match_null_string_p (p1, p1 + mcnt, reg_info)) return false; p1 += mcnt; /* Get past the n-th alternative. */ } /* if mcnt > 0 */ break; case stop_memory: assert (p1[1] == **p); *p = p1 + 2; return true; default: if (!common_op_match_null_string_p (&p1, end, reg_info)) return false; } } /* while p1 < end */ return false; } /* group_match_null_string_p */ /* Similar to group_match_null_string_p, but doesn't deal with alternatives: It expects P to be the first byte of a single alternative and END one byte past the last. The alternative can contain groups. */ static char alt_match_null_string_p (p, end, reg_info) unsigned char *p, *end; register_info_type *reg_info; { int mcnt; unsigned char *p1 = p; while (p1 < end) { /* Skip over opcodes that can match nothing, and break when we get to one that can't. */ switch ((re_opcode_t) *p1) { /* It's a loop. */ case on_failure_jump: p1++; EXTRACT_NUMBER_AND_INCR (mcnt, p1); p1 += mcnt; break; default: if (!common_op_match_null_string_p (&p1, end, reg_info)) return false; } } /* while p1 < end */ return true; } /* alt_match_null_string_p */ /* Deals with the ops common to group_match_null_string_p and alt_match_null_string_p. Sets P to one after the op and its arguments, if any. */ static char common_op_match_null_string_p (p, end, reg_info) unsigned char **p, *end; register_info_type *reg_info; { int mcnt; char ret; int reg_no; unsigned char *p1 = *p; switch ((re_opcode_t) *p1++) { case no_op: case begline: case endline: case begbuf: case endbuf: case wordbeg: case wordend: case wordbound: case notwordbound: #ifdef emacs case before_dot: case at_dot: case after_dot: #endif break; case start_memory: reg_no = *p1; assert (reg_no > 0 && reg_no <= MAX_REGNUM); ret = group_match_null_string_p (&p1, end, reg_info); /* Have to set this here in case we're checking a group which contains a group and a back reference to it. */ if (REG_MATCH_NULL_STRING_P (reg_info[reg_no]) == MATCH_NULL_UNSET_VALUE) REG_MATCH_NULL_STRING_P (reg_info[reg_no]) = ret; if (!ret) return false; break; /* If this is an optimized succeed_n for zero times, make the jump. */ case jump: EXTRACT_NUMBER_AND_INCR (mcnt, p1); if (mcnt >= 0) p1 += mcnt; else return false; break; case succeed_n: /* Get to the number of times to succeed. */ p1 += 2; EXTRACT_NUMBER_AND_INCR (mcnt, p1); if (mcnt == 0) { p1 -= 4; EXTRACT_NUMBER_AND_INCR (mcnt, p1); p1 += mcnt; } else return false; break; case duplicate: if (!REG_MATCH_NULL_STRING_P (reg_info[*p1])) return false; break; case set_number_at: p1 += 4; default: /* All other opcodes mean we cannot match the empty string. */ return false; } *p = p1; return true; } /* common_op_match_null_string_p */ /* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN bytes; nonzero otherwise. */ static int bcmp_translate (s1, s2, len, translate) const char *s1, *s2; register int len; RE_TRANSLATE_TYPE translate; { register const unsigned char *p1 = (const unsigned char *) s1; register const unsigned char *p2 = (const unsigned char *) s2; while (len) { if (translate[*p1++] != translate[*p2++]) return 1; len--; } return 0; } /* Entry points for GNU code. */ /* re_compile_pattern is the GNU regular expression compiler: it compiles PATTERN (of length SIZE) and puts the result in BUFP. Returns 0 if the pattern was valid, otherwise an error string. Assumes the `allocated' (and perhaps `buffer') and `translate' fields are set in BUFP on entry. We call regex_compile to do the actual compilation. */ const char * re_compile_pattern (pattern, length, bufp) const char *pattern; size_t length; struct re_pattern_buffer *bufp; { reg_errcode_t ret; /* GNU code is written to assume at least RE_NREGS registers will be set (and at least one extra will be -1). */ bufp->regs_allocated = REGS_UNALLOCATED; /* And GNU code determines whether or not to get register information by passing null for the REGS argument to re_match, etc., not by setting no_sub. */ bufp->no_sub = 0; /* Match anchors at newline. */ bufp->newline_anchor = 1; ret = regex_compile (pattern, length, re_syntax_options, bufp); if (!ret) return NULL; return gettext (re_error_msgid + re_error_msgid_idx[(int) ret]); } #ifdef _LIBC weak_alias (__re_compile_pattern, re_compile_pattern) #endif /* Entry points compatible with 4.2 BSD regex library. We don't define them unless specifically requested. */ #if defined _REGEX_RE_COMP || defined _LIBC /* BSD has one and only one pattern buffer. */ static struct re_pattern_buffer re_comp_buf; char * #ifdef _LIBC /* Make these definitions weak in libc, so POSIX programs can redefine these names if they don't use our functions, and still use regcomp/regexec below without link errors. */ weak_function #endif re_comp (s) const char *s; { reg_errcode_t ret; if (!s) { if (!re_comp_buf.buffer) return gettext ("No previous regular expression"); return 0; } if (!re_comp_buf.buffer) { re_comp_buf.buffer = (unsigned char *) malloc (200); if (re_comp_buf.buffer == NULL) return (char *) gettext (re_error_msgid + re_error_msgid_idx[(int) REG_ESPACE]); re_comp_buf.allocated = 200; re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH); if (re_comp_buf.fastmap == NULL) return (char *) gettext (re_error_msgid + re_error_msgid_idx[(int) REG_ESPACE]); } /* Since `re_exec' always passes NULL for the `regs' argument, we don't need to initialize the pattern buffer fields which affect it. */ /* Match anchors at newlines. */ re_comp_buf.newline_anchor = 1; ret = regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf); if (!ret) return NULL; /* Yes, we're discarding `const' here if !HAVE_LIBINTL. */ return (char *) gettext (re_error_msgid + re_error_msgid_idx[(int) ret]); } int #ifdef _LIBC weak_function #endif re_exec (s) const char *s; { const int len = strlen (s); return 0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0); } #endif /* _REGEX_RE_COMP */ /* POSIX.2 functions. Don't define these for Emacs. */ #ifndef emacs /* regcomp takes a regular expression as a string and compiles it. PREG is a regex_t *. We do not expect any fields to be initialized, since POSIX says we shouldn't. Thus, we set `buffer' to the compiled pattern; `used' to the length of the compiled pattern; `syntax' to RE_SYNTAX_POSIX_EXTENDED if the REG_EXTENDED bit in CFLAGS is set; otherwise, to RE_SYNTAX_POSIX_BASIC; `newline_anchor' to REG_NEWLINE being set in CFLAGS; `fastmap' to an allocated space for the fastmap; `fastmap_accurate' to zero; `re_nsub' to the number of subexpressions in PATTERN. PATTERN is the address of the pattern string. CFLAGS is a series of bits which affect compilation. If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we use POSIX basic syntax. If REG_NEWLINE is set, then . and [^...] don't match newline. Also, regexec will try a match beginning after every newline. If REG_ICASE is set, then we considers upper- and lowercase versions of letters to be equivalent when matching. If REG_NOSUB is set, then when PREG is passed to regexec, that routine will report only success or failure, and nothing about the registers. It returns 0 if it succeeds, nonzero if it doesn't. (See regex.h for the return codes and their meanings.) */ int regcomp (preg, pattern, cflags) regex_t *preg; const char *pattern; int cflags; { reg_errcode_t ret; reg_syntax_t syntax = (cflags & REG_EXTENDED) ? RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC; /* regex_compile will allocate the space for the compiled pattern. */ preg->buffer = 0; preg->allocated = 0; preg->used = 0; /* Try to allocate space for the fastmap. */ preg->fastmap = (char *) malloc (1 << BYTEWIDTH); if (cflags & REG_ICASE) { unsigned i; preg->translate = (RE_TRANSLATE_TYPE) malloc (CHAR_SET_SIZE * sizeof (*(RE_TRANSLATE_TYPE)0)); if (preg->translate == NULL) return (int) REG_ESPACE; /* Map uppercase characters to corresponding lowercase ones. */ for (i = 0; i < CHAR_SET_SIZE; i++) preg->translate[i] = ISUPPER (i) ? TOLOWER (i) : i; } else preg->translate = NULL; /* If REG_NEWLINE is set, newlines are treated differently. */ if (cflags & REG_NEWLINE) { /* REG_NEWLINE implies neither . nor [^...] match newline. */ syntax &= ~RE_DOT_NEWLINE; syntax |= RE_HAT_LISTS_NOT_NEWLINE; /* It also changes the matching behavior. */ preg->newline_anchor = 1; } else preg->newline_anchor = 0; preg->no_sub = !!(cflags & REG_NOSUB); /* POSIX says a null character in the pattern terminates it, so we can use strlen here in compiling the pattern. */ ret = regex_compile (pattern, strlen (pattern), syntax, preg); /* POSIX doesn't distinguish between an unmatched open-group and an unmatched close-group: both are REG_EPAREN. */ if (ret == REG_ERPAREN) ret = REG_EPAREN; if (ret == REG_NOERROR && preg->fastmap) { /* Compute the fastmap now, since regexec cannot modify the pattern buffer. */ if (re_compile_fastmap (preg) == -2) { /* Some error occured while computing the fastmap, just forget about it. */ free (preg->fastmap); preg->fastmap = NULL; } } return (int) ret; } #ifdef _LIBC weak_alias (__regcomp, regcomp) #endif /* regexec searches for a given pattern, specified by PREG, in the string STRING. If NMATCH is zero or REG_NOSUB was set in the cflags argument to `regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at least NMATCH elements, and we set them to the offsets of the corresponding matched substrings. EFLAGS specifies `execution flags' which affect matching: if REG_NOTBOL is set, then ^ does not match at the beginning of the string; if REG_NOTEOL is set, then $ does not match at the end. We return 0 if we find a match and REG_NOMATCH if not. */ int regexec (preg, string, nmatch, pmatch, eflags) const regex_t *preg; const char *string; size_t nmatch; regmatch_t pmatch[]; int eflags; { int ret; struct re_registers regs; regex_t private_preg; int len = strlen (string); char want_reg_info = !preg->no_sub && nmatch > 0; private_preg = *preg; private_preg.not_bol = !!(eflags & REG_NOTBOL); private_preg.not_eol = !!(eflags & REG_NOTEOL); /* The user has told us exactly how many registers to return information about, via `nmatch'. We have to pass that on to the matching routines. */ private_preg.regs_allocated = REGS_FIXED; if (want_reg_info) { regs.num_regs = nmatch; regs.start = TALLOC (nmatch * 2, regoff_t); if (regs.start == NULL) return (int) REG_NOMATCH; regs.end = regs.start + nmatch; } /* Perform the searching operation. */ ret = re_search (&private_preg, string, len, /* start: */ 0, /* range: */ len, want_reg_info ? ®s : (struct re_registers *) 0); /* Copy the register information to the POSIX structure. */ if (want_reg_info) { if (ret >= 0) { unsigned r; for (r = 0; r < nmatch; r++) { pmatch[r].rm_so = regs.start[r]; pmatch[r].rm_eo = regs.end[r]; } } /* If we needed the temporary register info, free the space now. */ free (regs.start); } /* We want zero return to mean success, unlike `re_search'. */ return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH; } #ifdef _LIBC weak_alias (__regexec, regexec) #endif /* Returns a message corresponding to an error code, ERRCODE, returned from either regcomp or regexec. We don't use PREG here. */ size_t regerror (int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size) /* gcc 4.7.0 om MinGW stumbles on the K&R declaration here */ /* int errcode; */ /* const regex_t *preg; */ /* char *errbuf; */ /* size_t errbuf_size; */ { const char *msg; size_t msg_size; if (errcode < 0 || errcode >= (int) (sizeof (re_error_msgid_idx) / sizeof (re_error_msgid_idx[0]))) /* Only error codes returned by the rest of the code should be passed to this routine. If we are given anything else, or if other regex code generates an invalid error code, then the program has a bug. Dump core so we can fix it. */ abort (); msg = gettext (re_error_msgid + re_error_msgid_idx[errcode]); msg_size = strlen (msg) + 1; /* Includes the null. */ if (errbuf_size != 0) { if (msg_size > errbuf_size) { #if defined HAVE_MEMPCPY || defined _LIBC *((char *) __mempcpy (errbuf, msg, errbuf_size - 1)) = '\0'; #else memcpy (errbuf, msg, errbuf_size - 1); errbuf[errbuf_size - 1] = 0; #endif } else memcpy (errbuf, msg, msg_size); } return msg_size; } #ifdef _LIBC weak_alias (__regerror, regerror) #endif /* Free dynamically allocated space used by PREG. */ void regfree (preg) regex_t *preg; { if (preg->buffer != NULL) free (preg->buffer); preg->buffer = NULL; preg->allocated = 0; preg->used = 0; if (preg->fastmap != NULL) free (preg->fastmap); preg->fastmap = NULL; preg->fastmap_accurate = 0; if (preg->translate != NULL) free (preg->translate); preg->translate = NULL; } #ifdef _LIBC weak_alias (__regfree, regfree) #endif #endif /* not emacs */ #endif /* for win32 */ static void dummy_compilation_unit(void) { /* nothing */ } gtkwave-3.3.86/src/treesearch.c0000664000175000017500000000121213166335473015660 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2006. * * 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. */ #include #include "globals.h" #include "gtk12compat.h" /* * gtk1 users are forced to use the old treesearch widget * for now, sorry. */ #if WAVE_USE_GTK2 #include "treesearch_gtk2.c" #else #include "treesearch_gtk1.c" #endif void mkmenu_treesearch_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; /* nothing */ } gtkwave-3.3.86/src/pipeio.c0000664000175000017500000001110713166335473015024 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2005-2010 * * 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. */ #include "globals.h" #include #include "pipeio.h" #if defined _MSC_VER || defined __MINGW32__ static void cleanup_p(struct pipe_ctx *p) { if(p->g_hChildStd_IN_Rd) CloseHandle(p->g_hChildStd_IN_Rd); if(p->g_hChildStd_IN_Wr) CloseHandle(p->g_hChildStd_IN_Wr); if(p->g_hChildStd_OUT_Rd) CloseHandle(p->g_hChildStd_OUT_Rd); if(p->g_hChildStd_OUT_Wr) CloseHandle(p->g_hChildStd_OUT_Wr); free_2(p); } struct pipe_ctx *pipeio_create(char *execappname, char *args) { SECURITY_ATTRIBUTES saAttr; STARTUPINFO siStartInfo; BOOL bSuccess = FALSE; TCHAR *szCmdline; struct pipe_ctx *p = calloc_2(1, sizeof(struct pipe_ctx)); saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); /* Set the bInheritHandle flag so pipe handles are inherited */ saAttr.bInheritHandle = TRUE; saAttr.lpSecurityDescriptor = NULL; if (!CreatePipe(&p->g_hChildStd_OUT_Rd, &p->g_hChildStd_OUT_Wr, &saAttr, 0)) { cleanup_p(p); return(NULL); } if (!SetHandleInformation(p->g_hChildStd_OUT_Rd, HANDLE_FLAG_INHERIT, 0)) { cleanup_p(p); return(NULL); } if (!CreatePipe(&p->g_hChildStd_IN_Rd, &p->g_hChildStd_IN_Wr, &saAttr, 0)) { cleanup_p(p); return(NULL); } if (!SetHandleInformation(p->g_hChildStd_IN_Wr, HANDLE_FLAG_INHERIT, 0)) { cleanup_p(p); return(NULL); } memset(&siStartInfo, 0, sizeof(STARTUPINFO)); siStartInfo.cb = sizeof(STARTUPINFO); /* siStartInfo.hStdError = p->g_hChildStd_OUT_Wr; (not sure how to redirect, for example GetStdHandle(STD_ERROR_HANDLE) */ siStartInfo.hStdOutput = p->g_hChildStd_OUT_Wr; siStartInfo.hStdInput = p->g_hChildStd_IN_Rd; siStartInfo.dwFlags |= STARTF_USESTDHANDLES; if (strlen(args) == 0) { szCmdline = strdup_2(execappname); } else { szCmdline = malloc_2(strlen(execappname) + 1 + strlen(args) + 1); sprintf(szCmdline, "%s %s", execappname, args); } bSuccess = CreateProcess(NULL, szCmdline, /* command line */ NULL, /* process security attributes */ NULL, /* primary thread security attributes */ TRUE, /* handles are inherited */ 0, /* creation flags */ NULL, /* use parent's environment */ NULL, /* use parent's current directory */ &siStartInfo, /* STARTUPINFO pointer */ &p->piProcInfo); /* receives PROCESS_INFORMATION */ free_2(szCmdline); if(!bSuccess) { cleanup_p(p); return(NULL); } else { /* CloseHandle(p->piProcInfo.hProcess); */ /* CloseHandle(p->piProcInfo.hThread); */ } return(p); } void pipeio_destroy(struct pipe_ctx *p) { CloseHandle(p->g_hChildStd_IN_Rd); CloseHandle(p->g_hChildStd_IN_Wr); CloseHandle(p->g_hChildStd_OUT_Rd); CloseHandle(p->g_hChildStd_OUT_Wr); TerminateProcess(p->piProcInfo.hProcess, 0); free_2(p); } #else #include struct pipe_ctx *pipeio_create(char *execappname, char *arg) { int rc1, rc2; pid_t pid, wave_pid; int filedes_w[2]; int filedes_r[2]; struct pipe_ctx *p; int mystat; FILE *fsin=NULL, *fsout = NULL; rc1 = pipe(filedes_r); if(rc1) return(NULL); rc2 = pipe(filedes_w); if(rc2) { close(filedes_r[0]); close(filedes_r[1]); return(NULL); } wave_pid = getpid(); if((pid=fork())) { fsout = fdopen(filedes_w[1], "wb"); fsin = fdopen(filedes_r[0], "rb"); close(filedes_w[0]); close(filedes_r[1]); } else { dup2(filedes_w[0], 0); dup2(filedes_r[1], 1); close(filedes_w[1]); close(filedes_r[0]); #ifdef _AIX /* NOTE: doesn't handle ctrl-c or killing, but I don't want to mess with this right now for AIX */ if ((!arg)||(strlen(arg) == 0)) { execl(execappname, execappname, NULL); } else { execl(execappname, execappname, arg, NULL); } exit(0); #else if((pid=fork())) /* monitor process */ { do { sleep(1); } while(wave_pid == getppid()); /* inherited by init yet? */ kill(pid, SIGKILL); waitpid(pid, &mystat, 0); exit(0); } else /* actual helper */ { if (strlen(arg) == 0) { execl(execappname, execappname, NULL); } else { execl(execappname, execappname, arg, NULL); } exit(0); } #endif } p = malloc_2(sizeof(struct pipe_ctx)); p->pid = pid; p->sin = fsin; p->sout = fsout; p->fd0 = filedes_r[0]; /* for potential select() ops */ p->fd1 = filedes_w[1]; /* ditto */ return(p); } void pipeio_destroy(struct pipe_ctx *p) { /* #ifdef _AIX */ int mystat; kill(p->pid, SIGKILL); waitpid(p->pid, &mystat, 0); /* #endif */ fclose(p->sout); fclose(p->sin); free_2(p); } #endif gtkwave-3.3.86/src/busy.h0000664000175000017500000000160313166335473014526 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2006. * * 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. */ #include "globals.h" #ifndef WAVE_BUSYWIN_H #define WAVE_BUSYWIN_H #include #include #include #include "main.h" /* number of histents to create before kicking off gtk_main_iteration() checking */ #define WAVE_BUSY_ITER (1000) void init_busy(void); void set_window_busy_no_refresh(GtkWidget *w); void set_window_busy(GtkWidget *w); void set_window_idle(GtkWidget *w); void busy_window_refresh(void); void gtkwave_main_iteration(void); void gtk_events_pending_gtk_main_iteration(void); gboolean in_main_iteration(void); gboolean ignore_context_swap(void); #endif gtkwave-3.3.86/src/edgebuttons.h0000664000175000017500000000073213166335473016071 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010 * * 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. */ #ifndef WAVE_EDGEBUTTONS_H #define WAVE_EDGEBUTTONS_H void service_left_edge(GtkWidget *text, gpointer data); void service_right_edge(GtkWidget *text, gpointer data); #endif gtkwave-3.3.86/src/gnu_regex.h0000664000175000017500000005030713166335473015534 0ustar bybellbybell/* Definitions for data structures and routines for the regular expression library, version 0.12. Copyright (C) 1985,89,90,91,92,93,95,96,97,98 Free Software Foundation, Inc. This file is part of the GNU C Library. Its master source is NOT part of the C library, however. The master source lives in /gd/gnu/lib. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street - Suite 500, Boston, MA 02110-1335, USA. */ #ifndef _REGEX_H #define _REGEX_H 1 /* Allow the use in C++ code. */ #ifdef __cplusplus extern "C" { #endif /* POSIX says that must be included (by the caller) before . */ #if !defined _POSIX_C_SOURCE && !defined _POSIX_SOURCE && defined VMS /* VMS doesn't have `size_t' in , even though POSIX says it should be there. */ # include #endif /* The following two types have to be signed and unsigned integer type wide enough to hold a value of a pointer. For most ANSI compilers ptrdiff_t and size_t should be likely OK. Still size of these two types is 2 for Microsoft C. Ugh... */ typedef long int s_reg_t; typedef unsigned long int active_reg_t; /* The following bits are used to determine the regexp syntax we recognize. The set/not-set meanings are chosen so that Emacs syntax remains the value 0. The bits are given in alphabetical order, and the definitions shifted by one from the previous bit; thus, when we add or remove a bit, only one other definition need change. */ typedef unsigned long int reg_syntax_t; /* If this bit is not set, then \ inside a bracket expression is literal. If set, then such a \ quotes the following character. */ #define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1) /* If this bit is not set, then + and ? are operators, and \+ and \? are literals. If set, then \+ and \? are operators and + and ? are literals. */ #define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1) /* If this bit is set, then character classes are supported. They are: [:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:], [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:]. If not set, then character classes are not supported. */ #define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1) /* If this bit is set, then ^ and $ are always anchors (outside bracket expressions, of course). If this bit is not set, then it depends: ^ is an anchor if it is at the beginning of a regular expression or after an open-group or an alternation operator; $ is an anchor if it is at the end of a regular expression, or before a close-group or an alternation operator. This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because POSIX draft 11.2 says that * etc. in leading positions is undefined. We already implemented a previous draft which made those constructs invalid, though, so we haven't changed the code back. */ #define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1) /* If this bit is set, then special characters are always special regardless of where they are in the pattern. If this bit is not set, then special characters are special only in some contexts; otherwise they are ordinary. Specifically, * + ? and intervals are only special when not after the beginning, open-group, or alternation operator. */ #define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1) /* If this bit is set, then *, +, ?, and { cannot be first in an re or immediately after an alternation or begin-group operator. */ #define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1) /* If this bit is set, then . matches newline. If not set, then it doesn't. */ #define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1) /* If this bit is set, then . doesn't match NUL. If not set, then it does. */ #define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1) /* If this bit is set, nonmatching lists [^...] do not match newline. If not set, they do. */ #define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1) /* If this bit is set, either \{...\} or {...} defines an interval, depending on RE_NO_BK_BRACES. If not set, \{, \}, {, and } are literals. */ #define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1) /* If this bit is set, +, ? and | aren't recognized as operators. If not set, they are. */ #define RE_LIMITED_OPS (RE_INTERVALS << 1) /* If this bit is set, newline is an alternation operator. If not set, newline is literal. */ #define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1) /* If this bit is set, then `{...}' defines an interval, and \{ and \} are literals. If not set, then `\{...\}' defines an interval. */ #define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1) /* If this bit is set, (...) defines a group, and \( and \) are literals. If not set, \(...\) defines a group, and ( and ) are literals. */ #define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1) /* If this bit is set, then \ matches . If not set, then \ is a back-reference. */ #define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1) /* If this bit is set, then | is an alternation operator, and \| is literal. If not set, then \| is an alternation operator, and | is literal. */ #define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1) /* If this bit is set, then an ending range point collating higher than the starting range point, as in [z-a], is invalid. If not set, then when ending range point collates higher than the starting range point, the range is ignored. */ #define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1) /* If this bit is set, then an unmatched ) is ordinary. If not set, then an unmatched ) is invalid. */ #define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1) /* If this bit is set, succeed as soon as we match the whole pattern, without further backtracking. */ #define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1) /* If this bit is set, do not process the GNU regex operators. If not set, then the GNU regex operators are recognized. */ #define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1) /* If this bit is set, turn on internal regex debugging. If not set, and debugging was on, turn it off. This only works if regex.c is compiled -DDEBUG. We define this bit always, so that all that's needed to turn on debugging is to recompile regex.c; the calling code can always have this bit set, and it won't affect anything in the normal case. */ #define RE_DEBUG (RE_NO_GNU_OPS << 1) /* This global variable defines the particular regexp syntax to use (for some interfaces). When a regexp is compiled, the syntax used is stored in the pattern buffer, so changing this does not affect already-compiled regexps. */ extern reg_syntax_t re_syntax_options; /* Define combinations of the above bits for the standard possibilities. (The [[[ comments delimit what gets put into the Texinfo file, so don't delete them!) */ /* [[[begin syntaxes]]] */ #define RE_SYNTAX_EMACS 0 #define RE_SYNTAX_AWK \ (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \ | RE_NO_BK_PARENS | RE_NO_BK_REFS \ | RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \ | RE_DOT_NEWLINE | RE_CONTEXT_INDEP_ANCHORS \ | RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS) #define RE_SYNTAX_GNU_AWK \ ((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DEBUG) \ & ~(RE_DOT_NOT_NULL | RE_INTERVALS | RE_CONTEXT_INDEP_OPS)) #define RE_SYNTAX_POSIX_AWK \ (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \ | RE_INTERVALS | RE_NO_GNU_OPS) #define RE_SYNTAX_GREP \ (RE_BK_PLUS_QM | RE_CHAR_CLASSES \ | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \ | RE_NEWLINE_ALT) #define RE_SYNTAX_EGREP \ (RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \ | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \ | RE_NEWLINE_ALT | RE_NO_BK_PARENS \ | RE_NO_BK_VBAR) #define RE_SYNTAX_POSIX_EGREP \ (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES) /* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */ #define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC #define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC /* Syntax bits common to both basic and extended POSIX regex syntax. */ #define _RE_SYNTAX_POSIX_COMMON \ (RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \ | RE_INTERVALS | RE_NO_EMPTY_RANGES) #define RE_SYNTAX_POSIX_BASIC \ (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM) /* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this isn't minimal, since other operators, such as \`, aren't disabled. */ #define RE_SYNTAX_POSIX_MINIMAL_BASIC \ (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS) #define RE_SYNTAX_POSIX_EXTENDED \ (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ | RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \ | RE_NO_BK_PARENS | RE_NO_BK_VBAR \ | RE_UNMATCHED_RIGHT_PAREN_ORD) /* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS replaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added. */ #define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \ (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \ | RE_NO_BK_PARENS | RE_NO_BK_REFS \ | RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD) /* [[[end syntaxes]]] */ /* Maximum number of duplicates an interval can allow. Some systems (erroneously) define this in other header files, but we want our value, so remove any previous define. */ #ifdef RE_DUP_MAX # undef RE_DUP_MAX #endif /* If sizeof(int) == 2, then ((1 << 15) - 1) overflows. */ #define RE_DUP_MAX (0x7fff) /* POSIX `cflags' bits (i.e., information for `regcomp'). */ /* If this bit is set, then use extended regular expression syntax. If not set, then use basic regular expression syntax. */ #define REG_EXTENDED 1 /* If this bit is set, then ignore case when matching. If not set, then case is significant. */ #define REG_ICASE (REG_EXTENDED << 1) /* If this bit is set, then anchors do not match at newline characters in the string. If not set, then anchors do match at newlines. */ #define REG_NEWLINE (REG_ICASE << 1) /* If this bit is set, then report only success or fail in regexec. If not set, then returns differ between not matching and errors. */ #define REG_NOSUB (REG_NEWLINE << 1) /* POSIX `eflags' bits (i.e., information for regexec). */ /* If this bit is set, then the beginning-of-line operator doesn't match the beginning of the string (presumably because it's not the beginning of a line). If not set, then the beginning-of-line operator does match the beginning of the string. */ #define REG_NOTBOL 1 /* Like REG_NOTBOL, except for the end-of-line. */ #define REG_NOTEOL (1 << 1) /* If any error codes are removed, changed, or added, update the `re_error_msg' table in regex.c. */ typedef enum { #ifdef _XOPEN_SOURCE REG_ENOSYS = -1, /* This will never happen for this implementation. */ #endif REG_NOERROR = 0, /* Success. */ REG_NOMATCH, /* Didn't find a match (for regexec). */ /* POSIX regcomp return error codes. (In the order listed in the standard.) */ REG_BADPAT, /* Invalid pattern. */ REG_ECOLLATE, /* Not implemented. */ REG_ECTYPE, /* Invalid character class name. */ REG_EESCAPE, /* Trailing backslash. */ REG_ESUBREG, /* Invalid back reference. */ REG_EBRACK, /* Unmatched left bracket. */ REG_EPAREN, /* Parenthesis imbalance. */ REG_EBRACE, /* Unmatched \{. */ REG_BADBR, /* Invalid contents of \{\}. */ REG_ERANGE, /* Invalid range end. */ REG_ESPACE, /* Ran out of memory. */ REG_BADRPT, /* No preceding re for repetition op. */ /* Error codes we've added. */ REG_EEND, /* Premature end. */ REG_ESIZE, /* Compiled pattern bigger than 2^16 bytes. */ REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */ } reg_errcode_t; /* This data structure represents a compiled pattern. Before calling the pattern compiler, the fields `buffer', `allocated', `fastmap', `translate', and `no_sub' can be set. After the pattern has been compiled, the `re_nsub' field is available. All other fields are private to the regex routines. */ #ifndef RE_TRANSLATE_TYPE # define RE_TRANSLATE_TYPE char * #endif struct re_pattern_buffer { /* [[[begin pattern_buffer]]] */ /* Space that holds the compiled pattern. It is declared as `unsigned char *' because its elements are sometimes used as array indexes. */ unsigned char *buffer; /* Number of bytes to which `buffer' points. */ unsigned long int allocated; /* Number of bytes actually used in `buffer'. */ unsigned long int used; /* Syntax setting with which the pattern was compiled. */ reg_syntax_t syntax; /* Pointer to a fastmap, if any, otherwise zero. re_search uses the fastmap, if there is one, to skip over impossible starting points for matches. */ char *fastmap; /* Either a translate table to apply to all characters before comparing them, or zero for no translation. The translation is applied to a pattern when it is compiled and to a string when it is matched. */ RE_TRANSLATE_TYPE translate; /* Number of subexpressions found by the compiler. */ size_t re_nsub; /* Zero if this pattern cannot match the empty string, one else. Well, in truth it's used only in `re_search_2', to see whether or not we should use the fastmap, so we don't set this absolutely perfectly; see `re_compile_fastmap' (the `duplicate' case). */ unsigned can_be_null : 1; /* If REGS_UNALLOCATED, allocate space in the `regs' structure for `max (RE_NREGS, re_nsub + 1)' groups. If REGS_REALLOCATE, reallocate space if necessary. If REGS_FIXED, use what's there. */ #define REGS_UNALLOCATED 0 #define REGS_REALLOCATE 1 #define REGS_FIXED 2 unsigned regs_allocated : 2; /* Set to zero when `regex_compile' compiles a pattern; set to one by `re_compile_fastmap' if it updates the fastmap. */ unsigned fastmap_accurate : 1; /* If set, `re_match_2' does not return information about subexpressions. */ unsigned no_sub : 1; /* If set, a beginning-of-line anchor doesn't match at the beginning of the string. */ unsigned not_bol : 1; /* Similarly for an end-of-line anchor. */ unsigned not_eol : 1; /* If true, an anchor at a newline matches. */ unsigned newline_anchor : 1; /* [[[end pattern_buffer]]] */ }; typedef struct re_pattern_buffer regex_t; /* Type for byte offsets within the string. POSIX mandates this. */ typedef int regoff_t; /* This is the structure we store register match data in. See regex.texinfo for a full description of what registers match. */ struct re_registers { unsigned num_regs; regoff_t *start; regoff_t *end; }; /* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer, `re_match_2' returns information about at least this many registers the first time a `regs' structure is passed. */ #ifndef RE_NREGS # define RE_NREGS 30 #endif /* POSIX specification for registers. Aside from the different names than `re_registers', POSIX uses an array of structures, instead of a structure of arrays. */ typedef struct { regoff_t rm_so; /* Byte offset from string's start to substring's start. */ regoff_t rm_eo; /* Byte offset from string's start to substring's end. */ } regmatch_t; /* Declarations for routines. */ /* To avoid duplicating every routine declaration -- once with a prototype (if we are ANSI), and once without (if we aren't) -- we use the following macro to declare argument types. This unfortunately clutters up the declarations a bit, but I think it's worth it. */ #if __STDC__ # define _RE_ARGS(args) args #else /* not __STDC__ */ # define _RE_ARGS(args) () #endif /* not __STDC__ */ /* Sets the current default syntax to SYNTAX, and return the old syntax. You can also simply assign to the `re_syntax_options' variable. */ extern reg_syntax_t re_set_syntax _RE_ARGS ((reg_syntax_t syntax)); /* Compile the regular expression PATTERN, with length LENGTH and syntax given by the global `re_syntax_options', into the buffer BUFFER. Return NULL if successful, and an error string if not. */ extern const char *re_compile_pattern _RE_ARGS ((const char *pattern, size_t length, struct re_pattern_buffer *buffer)); /* Compile a fastmap for the compiled pattern in BUFFER; used to accelerate searches. Return 0 if successful and -2 if was an internal error. */ extern int re_compile_fastmap _RE_ARGS ((struct re_pattern_buffer *buffer)); /* Search in the string STRING (with length LENGTH) for the pattern compiled into BUFFER. Start searching at position START, for RANGE characters. Return the starting position of the match, -1 for no match, or -2 for an internal error. Also return register information in REGS (if REGS and BUFFER->no_sub are nonzero). */ extern int re_search _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string, int length, int start, int range, struct re_registers *regs)); /* Like `re_search', but search in the concatenation of STRING1 and STRING2. Also, stop searching at index START + STOP. */ extern int re_search_2 _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1, int length1, const char *string2, int length2, int start, int range, struct re_registers *regs, int stop)); /* Like `re_search', but return how many characters in STRING the regexp in BUFFER matched, starting at position START. */ extern int re_match _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string, int length, int start, struct re_registers *regs)); /* Relates to `re_match' as `re_search_2' relates to `re_search'. */ extern int re_match_2 _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1, int length1, const char *string2, int length2, int start, struct re_registers *regs, int stop)); /* Set REGS to hold NUM_REGS registers, storing them in STARTS and ENDS. Subsequent matches using BUFFER and REGS will use this memory for recording register information. STARTS and ENDS must be allocated with malloc, and must each be at least `NUM_REGS * sizeof (regoff_t)' bytes long. If NUM_REGS == 0, then subsequent matches should allocate their own register data. Unless this function is called, the first search or match using PATTERN_BUFFER will allocate its own register data, without freeing the old data. */ extern void re_set_registers _RE_ARGS ((struct re_pattern_buffer *buffer, struct re_registers *regs, unsigned num_regs, regoff_t *starts, regoff_t *ends)); #if defined _REGEX_RE_COMP || defined _LIBC # ifndef _CRAY /* 4.2 bsd compatibility. */ extern char *re_comp _RE_ARGS ((const char *)); extern int re_exec _RE_ARGS ((const char *)); # endif #endif /* POSIX compatibility. */ extern int regcomp _RE_ARGS ((regex_t *__preg, const char *__pattern, int __cflags)); extern int regexec _RE_ARGS ((const regex_t *__preg, const char *__string, size_t __nmatch, regmatch_t __pmatch[], int __eflags)); extern size_t regerror _RE_ARGS ((int __errcode, const regex_t *__preg, char *__errbuf, size_t __errbuf_size)); extern void regfree _RE_ARGS ((regex_t *__preg)); #ifdef __cplusplus } #endif /* C++ */ #endif /* regex.h */ /* Local variables: make-backup-files: t version-control: t trim-versions-without-asking: nil End: */ gtkwave-3.3.86/src/version.h0000664000175000017500000000067113166335473015235 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010-2017. * * 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. */ #ifndef WAVE_VERSION_H #define WAVE_VERSION_H #define WAVE_VERSION_INFO "GTKWave Analyzer v" PACKAGE_VERSION " (w)1999-2017 BSI" #endif gtkwave-3.3.86/src/wavewindow.c0000664000175000017500000042012313166335473015733 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2012. * * 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. */ #include #include "globals.h" #include "gtk12compat.h" #include "currenttime.h" #include "pixmaps.h" #include "symbol.h" #include "bsearch.h" #include "color.h" #include "rc.h" #include "strace.h" #include "debug.h" #include "main.h" #if !defined _ISOC99_SOURCE #define _ISOC99_SOURCE 1 #endif #include static void rendertimebar(void); static void draw_hptr_trace(Trptr t, hptr h, int which, int dodraw, int kill_grid); static void draw_hptr_trace_vector(Trptr t, hptr h, int which); static void draw_vptr_trace(Trptr t, vptr v, int which); static void rendertraces(void); static void rendertimes(void); static const GdkModifierType bmask[4]= {0, GDK_BUTTON1_MASK, 0, GDK_BUTTON3_MASK }; /* button 1, 3 press/rel encodings */ static const GdkEventMask m_bmask[4]= {0, GDK_BUTTON1_MOTION_MASK, 0, GDK_BUTTON3_MOTION_MASK }; /* button 1, 3 motion encodings */ /******************************************************************/ static void update_dual(void) { if(GLOBALS->dual_ctx && !GLOBALS->dual_race_lock) { GLOBALS->dual_ctx[GLOBALS->dual_id].zoom = GLOBALS->tims.zoom; GLOBALS->dual_ctx[GLOBALS->dual_id].marker = GLOBALS->tims.marker; GLOBALS->dual_ctx[GLOBALS->dual_id].baseline = GLOBALS->tims.baseline; GLOBALS->dual_ctx[GLOBALS->dual_id].left_margin_time = GLOBALS->tims.start; GLOBALS->dual_ctx[GLOBALS->dual_id].use_new_times = 1; } } /******************************************************************/ #ifdef WAVE_USE_GTK2 static void (*draw_slider_p) (GtkStyle *style, GdkWindow *window, GtkStateType state_type, GtkShadowType shadow_type, GdkRectangle *area, GtkWidget *widget, const gchar *detail, gint x, gint y, gint width, gint height, GtkOrientation orientation) = NULL; /* This is intended to be global...only needed once per toolkit */ static void draw_slider (GtkStyle *style, GdkWindow *window, GtkStateType state_type, GtkShadowType shadow_type, GdkRectangle *area, GtkWidget *widget, const gchar *detail, gint x, gint y, gint width, gint height, GtkOrientation orientation) { if((GLOBALS)&&(widget == GLOBALS->hscroll_wavewindow_c_2)) { GLOBALS->str_wid_x = x - widget->allocation.x; GLOBALS->str_wid_width = width; GLOBALS->str_wid_bigw = widget->allocation.width; GLOBALS->str_wid_height = height; } draw_slider_p(style, window, state_type, shadow_type, area, widget, detail, x, y, width, height, orientation); } static gint slider_bpr(GtkWidget *widget, GdkEventButton *event) { (void)widget; int xi = event->x; int xl = GLOBALS->str_wid_x; int xr = GLOBALS->str_wid_x + GLOBALS->str_wid_width; if((xi > (xr-8)) && (xi < (xr+8))) { GLOBALS->str_wid_state = 1; return(TRUE); } else if((xi < (xl+8)) && (xi > (xl-8))) { GLOBALS->str_wid_state = -1; return(TRUE); } return(FALSE); } static gint slider_brr(GtkWidget *widget, GdkEventButton *event) { (void)widget; (void)event; GLOBALS->str_wid_state = 0; return(FALSE); } static gint slider_mnr(GtkWidget *widget, GdkEventMotion *event) { (void)widget; #ifndef WAVE_USE_GTK2 gdouble x, y; #endif GdkModifierType state; gdouble my_x, xmax, ratio; TimeType l_margin, r_margin; #ifdef WAVE_USE_GTK2 gint xi, yi; #endif int dummy_x, dummy_y; get_window_xypos(&dummy_x, &dummy_y); if(event->is_hint) { WAVE_GDK_GET_POINTER(event->window, &x, &y, &xi, &yi, &state); #ifndef WAVE_USE_GTK2 WAVE_GDK_GET_POINTER_COPY; #endif } else { /* x = event->x; */ /* scan-build */ /* y = event->y; */ /* scan-build */ state = event->state; } if((GLOBALS->str_wid_state)&&(!(state & (GDK_BUTTON1_MASK|GDK_BUTTON3_MASK)))) { GLOBALS->str_wid_state = 0; } if(GLOBALS->str_wid_state == 1) { my_x = event->x - GLOBALS->str_wid_height; xmax = GLOBALS->str_wid_bigw - (2*GLOBALS->str_wid_height) - GLOBALS->str_wid_slider; if(xmax > 1.0) { ratio = my_x/xmax; r_margin = (gdouble)(GLOBALS->tims.last - GLOBALS->tims.first) * ratio + GLOBALS->tims.first; if((r_margin > GLOBALS->tims.start) && (r_margin <= GLOBALS->tims.last)) { service_dragzoom(GLOBALS->tims.start, r_margin); } return(TRUE); } } else if(GLOBALS->str_wid_state == -1) { my_x = event->x - GLOBALS->str_wid_height; xmax = GLOBALS->str_wid_bigw - (2*GLOBALS->str_wid_height) - GLOBALS->str_wid_slider; if(xmax > 1.0) { ratio = my_x/xmax; l_margin = (gdouble)(GLOBALS->tims.last - GLOBALS->tims.first) * ratio + GLOBALS->tims.first; r_margin = GLOBALS->tims.end; if((l_margin >= GLOBALS->tims.first) && (l_margin < GLOBALS->tims.end)) { if(r_margin > GLOBALS->tims.last) r_margin = GLOBALS->tims.last; service_dragzoom(l_margin, r_margin); } return(TRUE); } } return(FALSE); } #endif /******************************************************************/ /* * gtk_draw_line() acceleration for win32 by doing draw combining * now always enabled. if there need to be an exact correlation * between this and the printed data, this needs to be disabled. */ #if 1 #define WAVE_SEG_BUF_CNT 1024 static int seg_trans_cnt = 0, seg_low_cnt = 0, seg_high_cnt = 0, seg_mid_cnt = 0, seg_x_cnt = 0, seg_vtrans_cnt = 0, seg_0_cnt = 0, seg_1_cnt = 0, seg_vbox_cnt = 0; static GdkSegment seg_trans[WAVE_SEG_BUF_CNT], seg_low[WAVE_SEG_BUF_CNT], seg_high[WAVE_SEG_BUF_CNT], seg_mid[WAVE_SEG_BUF_CNT], seg_x[WAVE_SEG_BUF_CNT], seg_vtrans[WAVE_SEG_BUF_CNT], seg_0[WAVE_SEG_BUF_CNT], seg_1[WAVE_SEG_BUF_CNT], seg_vbox[WAVE_SEG_BUF_CNT]; static void wave_gdk_draw_line(GdkDrawable *drawable, GdkGC *gc, gint _x1, gint _y1, gint _x2, gint _y2) { GdkSegment *seg; int *seg_cnt; if(gc==GLOBALS->gc.gc_trans_wavewindow_c_1) { seg = seg_trans; seg_cnt = &seg_trans_cnt; } else if(gc==GLOBALS->gc.gc_low_wavewindow_c_1) { seg = seg_low; seg_cnt = &seg_low_cnt; } else if(gc==GLOBALS->gc.gc_high_wavewindow_c_1) { seg = seg_high; seg_cnt = &seg_high_cnt; } else if(gc==GLOBALS->gc.gc_mid_wavewindow_c_1) { seg = seg_mid; seg_cnt = &seg_mid_cnt; } else if(gc == GLOBALS->gc.gc_x_wavewindow_c_1) { seg = seg_x; seg_cnt = &seg_x_cnt; } else if(gc == GLOBALS->gc.gc_vtrans_wavewindow_c_1){ seg = seg_vtrans; seg_cnt = &seg_vtrans_cnt; } else if(gc == GLOBALS->gc.gc_0_wavewindow_c_1) { seg = seg_0; seg_cnt = &seg_0_cnt; } else if(gc == GLOBALS->gc.gc_1_wavewindow_c_1) { seg = seg_1; seg_cnt = &seg_1_cnt; } else if(gc == GLOBALS->gc.gc_vbox_wavewindow_c_1){ seg = seg_vbox; seg_cnt = &seg_vbox_cnt; } else { gdk_draw_line(drawable, gc, _x1, _y1, _x2, _y2); return; } seg[*seg_cnt].x1 = _x1; seg[*seg_cnt].y1 = _y1; seg[*seg_cnt].x2 = _x2; seg[*seg_cnt].y2 = _y2; (*seg_cnt)++; if(*seg_cnt == WAVE_SEG_BUF_CNT) { gdk_draw_segments(drawable, gc, seg, *seg_cnt); *seg_cnt = 0; } } static void wave_gdk_draw_line_flush(GdkDrawable *drawable) { if(seg_vtrans_cnt) { gdk_draw_segments (drawable, GLOBALS->gc.gc_vtrans_wavewindow_c_1, seg_vtrans, seg_vtrans_cnt); seg_vtrans_cnt = 0; } if(seg_mid_cnt) { gdk_draw_segments(drawable, GLOBALS->gc.gc_mid_wavewindow_c_1, seg_mid, seg_mid_cnt); seg_mid_cnt = 0; } if(seg_high_cnt) { gdk_draw_segments(drawable, GLOBALS->gc.gc_high_wavewindow_c_1, seg_high, seg_high_cnt); seg_high_cnt = 0; } if(seg_low_cnt) { gdk_draw_segments(drawable, GLOBALS->gc.gc_low_wavewindow_c_1, seg_low, seg_low_cnt); seg_low_cnt = 0; } if(seg_trans_cnt) { gdk_draw_segments(drawable, GLOBALS->gc.gc_trans_wavewindow_c_1, seg_trans, seg_trans_cnt); seg_trans_cnt = 0; } if(seg_0_cnt) { gdk_draw_segments (drawable, GLOBALS->gc.gc_0_wavewindow_c_1, seg_0, seg_0_cnt); seg_0_cnt = 0; } if(seg_1_cnt) { gdk_draw_segments (drawable, GLOBALS->gc.gc_1_wavewindow_c_1, seg_1, seg_1_cnt); seg_1_cnt = 0; } /* place x down here to propagate them over low/high transitions */ if(seg_x_cnt) { gdk_draw_segments (drawable, GLOBALS->gc.gc_x_wavewindow_c_1, seg_x, seg_x_cnt); seg_x_cnt = 0; } if(seg_vbox_cnt) { gdk_draw_segments (drawable, GLOBALS->gc.gc_vbox_wavewindow_c_1, seg_vbox, seg_vbox_cnt); seg_vbox_cnt = 0; } } #else /* completely unnecessary for linux ... unless there are extremely dense traces */ #define wave_gdk_draw_line(a,b,c,d,e,f) gdk_draw_line(a,b,c,d,e,f) #define wave_gdk_draw_line_flush(x) #endif /******************************************************************/ /* * aldec-like "snap" feature... */ TimeType cook_markertime(TimeType marker, gint x, gint y) { int i, num_traces_displayable; Trptr t = NULL; TimeType lft, rgh; char lftinv, rghinv; gdouble xlft, xrgh; gdouble xlftd, xrghd; TimeType closest_named = MAX_HISTENT_TIME; int closest_which = -1; gint xold = x, yold = y; TraceEnt t_trans; if(!GLOBALS->cursor_snap) return(marker); /* potential snapping to a named marker time */ for(i=0;inamed_markers[i] != -1) { TimeType dlt; if((GLOBALS->named_markers[i]>=GLOBALS->tims.start)&&(GLOBALS->named_markers[i]<=GLOBALS->tims.end)&&(GLOBALS->named_markers[i]<=GLOBALS->tims.last)) { if(marker < GLOBALS->named_markers[i]) { dlt = GLOBALS->named_markers[i] - marker; } else { dlt = marker - GLOBALS->named_markers[i]; } if(dlt < closest_named) { closest_named = dlt; closest_which = i; } } } } num_traces_displayable=GLOBALS->wavearea->allocation.height/(GLOBALS->fontheight); num_traces_displayable--; /* for the time trace that is always there */ y-=GLOBALS->fontheight; if(y<0) y=0; y/=GLOBALS->fontheight; /* y now indicates the trace in question */ if(y>num_traces_displayable) y=num_traces_displayable; t=GLOBALS->topmost_trace; for(i=0;iflags&(/*TR_BLANK|*/TR_EXCLUDE))) /* TR_BLANK removed because of transaction handling below... */ { t = NULL; goto bot; } if(t->flags & (TR_BLANK|TR_ANALOG_BLANK_STRETCH)) /* seek to real xact trace if present... */ { Trptr tscan = t; int bcnt = 0; while((tscan) && (tscan = GivePrevTrace(tscan))) { if(!(tscan->flags & (TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { if(tscan->flags & TR_TTRANSLATED) { break; /* found it */ } else { tscan = NULL; } } else { bcnt++; /* bcnt is number of blank traces */ } } if((tscan)&&(tscan->vector)) { bvptr bv = tscan->n.vec; do { bv = bv->transaction_chain; /* correlate to blank trace */ } while(bv && (bcnt--)); if(bv) { memcpy(&t_trans, tscan, sizeof(TraceEnt)); /* substitute into a synthetic trace */ t_trans.n.vec = bv; t_trans.vector = 1; t_trans.name = bv->bvname; if(GLOBALS->hier_max_level) t_trans.name = hier_extract(t_trans.name, GLOBALS->hier_max_level); t = &t_trans; goto process_trace; } } } if((t->flags&TR_BLANK)) { t = NULL; goto bot; } if(t->flags & TR_ANALOG_BLANK_STRETCH) /* seek to real analog trace if present... */ { while((t) && (t = GivePrevTrace(t))) { if(!(t->flags & TR_ANALOG_BLANK_STRETCH)) { if(t->flags & TR_ANALOGMASK) { break; /* found it */ } else { t = NULL; } } } } if(!t) goto bot; process_trace: if(t->vector) { vptr v = bsearch_vector(t->n.vec, marker - t->shift); vptr v2 = v ? v->next : NULL; if((!v)||(!v2)) goto bot; /* should never happen */ lft = v->time; rgh = v2->time; } else { hptr h = bsearch_node(t->n.nd, marker - t->shift); hptr h2 = h ? h->next : NULL; if((!h)||(!h2)) goto bot; /* should never happen */ lft = h->time; rgh = h2->time; } lftinv = (lft < (GLOBALS->tims.start - t->shift))||(lft >= (GLOBALS->tims.end - t->shift))||(lft >= (GLOBALS->tims.last - t->shift)); rghinv = (rgh < (GLOBALS->tims.start - t->shift))||(rgh >= (GLOBALS->tims.end - t->shift))||(rgh >= (GLOBALS->tims.last - t->shift)); xlft = (lft + t->shift - GLOBALS->tims.start) * GLOBALS->pxns; xrgh = (rgh + t->shift - GLOBALS->tims.start) * GLOBALS->pxns; xlftd = xlft - x; if(xlftd<(gdouble)0.0) xlftd = ((gdouble)0.0) - xlftd; xrghd = xrgh - x; if(xrghd<(gdouble)0.0) xrghd = ((gdouble)0.0) - xrghd; if(xlftd<=xrghd) { if((!lftinv)&&(xlftd<=GLOBALS->cursor_snap)) { if(closest_which >= 0) { if((closest_named * GLOBALS->pxns) < xlftd) { marker = GLOBALS->named_markers[closest_which]; goto xit; } } marker = lft + t->shift; goto xit; } } else { if((!rghinv)&&(xrghd<=GLOBALS->cursor_snap)) { if(closest_which >= 0) { if((closest_named * GLOBALS->pxns) < xrghd) { marker = GLOBALS->named_markers[closest_which]; goto xit; } } marker = rgh + t->shift; goto xit; } } bot: if(closest_which >= 0) { if((closest_named * GLOBALS->pxns) <= GLOBALS->cursor_snap) { marker = GLOBALS->named_markers[closest_which]; } } xit: GLOBALS->mouseover_counter = -1; move_mouseover(t, xold, yold, marker); return(marker); } static void render_individual_named_marker(int i, GdkGC *gc, int blackout) { gdouble pixstep; gint xl, y; TimeType t; if((t=GLOBALS->named_markers[i])!=-1) { if((t>=GLOBALS->tims.start)&&(t<=GLOBALS->tims.last) &&(t<=GLOBALS->tims.end)) { /* this needs to be here rather than outside the loop as gcc does some optimizations that cause it to calculate slightly different from the marker if it's not here */ pixstep=((gdouble)GLOBALS->nsperframe)/((gdouble)GLOBALS->pixelsperframe); xl=((gdouble)(t-GLOBALS->tims.start))/pixstep; /* snap to integer */ if((xl>=0)&&(xlwavewidth)) { char nbuff[16]; make_bijective_marker_id_string(nbuff, i); for(y=GLOBALS->fontheight-1;y<=GLOBALS->waveheight-1;y+=8) { gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gc, xl, y, xl, y+5); } if((!GLOBALS->marker_names[i])||(!GLOBALS->marker_names[i][0])) { font_engine_draw_string(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->wavefont_smaller, gc, xl-(font_engine_string_measure(GLOBALS->wavefont_smaller, nbuff)>>1), GLOBALS->fontheight-2, nbuff); } else { int width = font_engine_string_measure(GLOBALS->wavefont_smaller, GLOBALS->marker_names[i]); if(blackout) /* blackout background so text is legible if overlaid with other marker labels */ { gdk_draw_rectangle(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_timeb_wavewindow_c_1, TRUE, xl-(width>>1), GLOBALS->fontheight-2-GLOBALS->wavefont_smaller->ascent, width, GLOBALS->wavefont_smaller->ascent + GLOBALS->wavefont_smaller->descent); } font_engine_draw_string(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->wavefont_smaller, gc, xl-(width>>1), GLOBALS->fontheight-2, GLOBALS->marker_names[i]); } } } } } static void draw_named_markers(void) { int i; if(!GLOBALS->wavepixmap_wavewindow_c_1) return; for(i=0;inamed_marker_lock_idx) { render_individual_named_marker(i, GLOBALS->gc.gc_mark_wavewindow_c_1, 0); } } if(GLOBALS->named_marker_lock_idx >= 0) { render_individual_named_marker(GLOBALS->named_marker_lock_idx, GLOBALS->gc.gc_umark_wavewindow_c_1, 1); } } static void sync_marker(void) { if((GLOBALS->tims.prevmarker==-1)&&(GLOBALS->tims.marker!=-1)) { GLOBALS->signalwindow_width_dirty=1; } else if((GLOBALS->tims.marker==-1)&&(GLOBALS->tims.prevmarker!=-1)) { GLOBALS->signalwindow_width_dirty=1; } GLOBALS->tims.prevmarker=GLOBALS->tims.marker; /* additional case for race conditions with MaxSignalLength */ if(((GLOBALS->tims.resizemarker==-1)||(GLOBALS->tims.resizemarker2==-1)) && (GLOBALS->tims.resizemarker!=GLOBALS->tims.resizemarker2)) { GLOBALS->signalwindow_width_dirty=1; } } static void draw_marker(void) { gdouble pixstep; gint xl; if(!GLOBALS->wavearea->window) return; GLOBALS->m1x_wavewindow_c_1=GLOBALS->m2x_wavewindow_c_1=-1; if(GLOBALS->tims.baseline>=0) { if((GLOBALS->tims.baseline>=GLOBALS->tims.start)&&(GLOBALS->tims.baseline<=GLOBALS->tims.last) &&(GLOBALS->tims.baseline<=GLOBALS->tims.end)) { pixstep=((gdouble)GLOBALS->nsperframe)/((gdouble)GLOBALS->pixelsperframe); xl=((gdouble)(GLOBALS->tims.baseline-GLOBALS->tims.start))/pixstep; /* snap to integer */ if((xl>=0)&&(xlwavewidth)) { gdk_draw_line(GLOBALS->wavearea->window,GLOBALS->gc.gc_baseline_wavewindow_c_1,xl, GLOBALS->fontheight-1, xl, GLOBALS->waveheight-1); } } } if(GLOBALS->tims.marker>=0) { if((GLOBALS->tims.marker>=GLOBALS->tims.start)&&(GLOBALS->tims.marker<=GLOBALS->tims.last) &&(GLOBALS->tims.marker<=GLOBALS->tims.end)) { pixstep=((gdouble)GLOBALS->nsperframe)/((gdouble)GLOBALS->pixelsperframe); xl=((gdouble)(GLOBALS->tims.marker-GLOBALS->tims.start))/pixstep; /* snap to integer */ if((xl>=0)&&(xlwavewidth)) { gdk_draw_line(GLOBALS->wavearea->window,GLOBALS->gc.gc_umark_wavewindow_c_1,xl, GLOBALS->fontheight-1, xl, GLOBALS->waveheight-1); GLOBALS->m1x_wavewindow_c_1=xl; } } } if((GLOBALS->enable_ghost_marker)&&(GLOBALS->in_button_press_wavewindow_c_1)&&(GLOBALS->tims.lmbcache>=0)) { if((GLOBALS->tims.lmbcache>=GLOBALS->tims.start)&&(GLOBALS->tims.lmbcache<=GLOBALS->tims.last) &&(GLOBALS->tims.lmbcache<=GLOBALS->tims.end)) { pixstep=((gdouble)GLOBALS->nsperframe)/((gdouble)GLOBALS->pixelsperframe); xl=((gdouble)(GLOBALS->tims.lmbcache-GLOBALS->tims.start))/pixstep; /* snap to integer */ if((xl>=0)&&(xlwavewidth)) { gdk_draw_line(GLOBALS->wavearea->window,GLOBALS->gc.gc_umark_wavewindow_c_1,xl, GLOBALS->fontheight-1, xl, GLOBALS->waveheight-1); GLOBALS->m2x_wavewindow_c_1=xl; } } } if(GLOBALS->m1x_wavewindow_c_1>GLOBALS->m2x_wavewindow_c_1) /* ensure m1x <= m2x for partitioned refresh */ { gint t; t=GLOBALS->m1x_wavewindow_c_1; GLOBALS->m1x_wavewindow_c_1=GLOBALS->m2x_wavewindow_c_1; GLOBALS->m2x_wavewindow_c_1=t; } if(GLOBALS->m1x_wavewindow_c_1==-1) GLOBALS->m1x_wavewindow_c_1=GLOBALS->m2x_wavewindow_c_1; /* make both markers same if no ghost marker or v.v. */ update_dual(); } static void draw_marker_partitions(void) { draw_marker(); if(GLOBALS->m1x_wavewindow_c_1==GLOBALS->m2x_wavewindow_c_1) { gdk_draw_pixmap(GLOBALS->wavearea->window, GLOBALS->wavearea->style->fg_gc[GTK_WIDGET_STATE(GLOBALS->wavearea)],GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->m1x_wavewindow_c_1, 0, GLOBALS->m1x_wavewindow_c_1, 0, 1, GLOBALS->fontheight-2); if(GLOBALS->m1x_wavewindow_c_1<0) { gdk_draw_pixmap(GLOBALS->wavearea->window, GLOBALS->wavearea->style->fg_gc[GTK_WIDGET_STATE(GLOBALS->wavearea)],GLOBALS->wavepixmap_wavewindow_c_1, 0, 0, 0, 0, GLOBALS->wavewidth, GLOBALS->waveheight); } else { if(GLOBALS->m1x_wavewindow_c_1==0) { gdk_draw_pixmap(GLOBALS->wavearea->window, GLOBALS->wavearea->style->fg_gc[GTK_WIDGET_STATE(GLOBALS->wavearea)],GLOBALS->wavepixmap_wavewindow_c_1, 1, 0, 1, 0, GLOBALS->wavewidth-1, GLOBALS->waveheight); } else if(GLOBALS->m1x_wavewindow_c_1==GLOBALS->wavewidth-1) { gdk_draw_pixmap(GLOBALS->wavearea->window, GLOBALS->wavearea->style->fg_gc[GTK_WIDGET_STATE(GLOBALS->wavearea)],GLOBALS->wavepixmap_wavewindow_c_1, 0, 0, 0, 0, GLOBALS->wavewidth-1, GLOBALS->waveheight); } else { gdk_draw_pixmap(GLOBALS->wavearea->window, GLOBALS->wavearea->style->fg_gc[GTK_WIDGET_STATE(GLOBALS->wavearea)],GLOBALS->wavepixmap_wavewindow_c_1, 0, 0, 0, 0, GLOBALS->m1x_wavewindow_c_1, GLOBALS->waveheight); gdk_draw_pixmap(GLOBALS->wavearea->window, GLOBALS->wavearea->style->fg_gc[GTK_WIDGET_STATE(GLOBALS->wavearea)],GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->m1x_wavewindow_c_1+1, 0, GLOBALS->m1x_wavewindow_c_1+1, 0, GLOBALS->wavewidth-GLOBALS->m1x_wavewindow_c_1-1, GLOBALS->waveheight); } } } else { gdk_draw_pixmap(GLOBALS->wavearea->window, GLOBALS->wavearea->style->fg_gc[GTK_WIDGET_STATE(GLOBALS->wavearea)],GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->m1x_wavewindow_c_1, 0, GLOBALS->m1x_wavewindow_c_1, 0, 1, GLOBALS->fontheight-2); gdk_draw_pixmap(GLOBALS->wavearea->window, GLOBALS->wavearea->style->fg_gc[GTK_WIDGET_STATE(GLOBALS->wavearea)],GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->m2x_wavewindow_c_1, 0, GLOBALS->m2x_wavewindow_c_1, 0, 1, GLOBALS->fontheight-2); if(GLOBALS->m1x_wavewindow_c_1>0) { gdk_draw_pixmap(GLOBALS->wavearea->window, GLOBALS->wavearea->style->fg_gc[GTK_WIDGET_STATE(GLOBALS->wavearea)],GLOBALS->wavepixmap_wavewindow_c_1, 0, 0, 0, 0, GLOBALS->m1x_wavewindow_c_1, GLOBALS->waveheight); } if(GLOBALS->m2x_wavewindow_c_1-GLOBALS->m1x_wavewindow_c_1>1) { gdk_draw_pixmap(GLOBALS->wavearea->window, GLOBALS->wavearea->style->fg_gc[GTK_WIDGET_STATE(GLOBALS->wavearea)],GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->m1x_wavewindow_c_1+1, 0, GLOBALS->m1x_wavewindow_c_1+1, 0, GLOBALS->m2x_wavewindow_c_1-GLOBALS->m1x_wavewindow_c_1-1, GLOBALS->waveheight); } if(GLOBALS->m2x_wavewindow_c_1!=GLOBALS->wavewidth-1) { gdk_draw_pixmap(GLOBALS->wavearea->window, GLOBALS->wavearea->style->fg_gc[GTK_WIDGET_STATE(GLOBALS->wavearea)],GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->m2x_wavewindow_c_1+1, 0, GLOBALS->m2x_wavewindow_c_1+1, 0, GLOBALS->wavewidth-GLOBALS->m2x_wavewindow_c_1-1, GLOBALS->waveheight); } } /* keep baseline from getting obliterated */ #ifndef WAVE_DOUBLE_LINE_WIDTH_MODE if(GLOBALS->tims.baseline>=0) #endif { draw_marker(); } } static void renderblackout(void) { gfloat pageinc; TimeType lhs, rhs, lclip, rclip; struct blackout_region_t *bt = GLOBALS->blackout_regions; if(bt) { pageinc=(gfloat)(((gdouble)GLOBALS->wavewidth)*GLOBALS->nspx); lhs = GLOBALS->tims.start; rhs = pageinc + lhs; while(bt) { if((bt->bend < lhs) || (bt->bstart > rhs)) { /* nothing, out of bounds */ } else { lclip = bt->bstart; rclip = bt->bend; if(lclip < lhs) lclip = lhs; else if (lclip > rhs) lclip = rhs; if(rclip < lhs) rclip = lhs; lclip -= lhs; rclip -= lhs; if(rclip>((GLOBALS->wavewidth+1)*GLOBALS->nspx)) rclip = (GLOBALS->wavewidth+1)*(GLOBALS->nspx); gdk_draw_rectangle(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_xfill_wavewindow_c_1, TRUE, (((gdouble)lclip)*GLOBALS->pxns), GLOBALS->fontheight,(((gdouble)(rclip-lclip))*GLOBALS->pxns), GLOBALS->waveheight-GLOBALS->fontheight); } bt=bt->next; } } } static void service_hslider(GtkWidget *text, gpointer data) { (void)text; (void)data; DEBUG(printf("Wave HSlider Moved\n")); if((GLOBALS->wavepixmap_wavewindow_c_1)&&(GLOBALS->wavewidth>1)) { GtkAdjustment *hadj; hadj=GTK_ADJUSTMENT(GLOBALS->wave_hslider); if(!GLOBALS->tims.timecache) { GLOBALS->tims.start=time_trunc(hadj->value); } else { GLOBALS->tims.start=time_trunc(GLOBALS->tims.timecache); GLOBALS->tims.timecache=0; /* reset */ } if(GLOBALS->tims.starttims.first) GLOBALS->tims.start=GLOBALS->tims.first; else if(GLOBALS->tims.start>GLOBALS->tims.last) GLOBALS->tims.start=GLOBALS->tims.last; GLOBALS->tims.laststart=GLOBALS->tims.start; gdk_draw_rectangle(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_back_wavewindow_c_1, TRUE, 0, 0,GLOBALS->wavewidth, GLOBALS->waveheight); rendertimebar(); } } static void service_vslider(GtkWidget *text, gpointer data) { (void)text; (void)data; GtkAdjustment *sadj, *hadj; int trtarget; int xsrc; if(GLOBALS->signalpixmap) { hadj=GTK_ADJUSTMENT(GLOBALS->signal_hslider); sadj=GTK_ADJUSTMENT(GLOBALS->wave_vslider); xsrc=(gint)hadj->value; trtarget=(int)(sadj->value); DEBUG(printf("Wave VSlider Moved to %d\n",trtarget)); gdk_draw_rectangle(GLOBALS->signalpixmap, GLOBALS->gc.gc_ltgray, TRUE, 0, 0, GLOBALS->signal_fill_width, GLOBALS->signalarea->allocation.height); sync_marker(); RenderSigs(trtarget,(GLOBALS->old_wvalue==sadj->value)?0:1); GLOBALS->old_wvalue=sadj->value; draw_named_markers(); if(GLOBALS->signalarea_has_focus) { gdk_draw_pixmap(GLOBALS->signalarea->window, GLOBALS->signalarea->style->fg_gc[GTK_WIDGET_STATE(GLOBALS->signalarea)], GLOBALS->signalpixmap, xsrc+1, 0+1, 0+1, 0+1, GLOBALS->signalarea->allocation.width-2, GLOBALS->signalarea->allocation.height-2); draw_signalarea_focus(); } else { gdk_draw_pixmap(GLOBALS->signalarea->window, GLOBALS->signalarea->style->fg_gc[GTK_WIDGET_STATE(GLOBALS->signalarea)], GLOBALS->signalpixmap, xsrc, 0, 0, 0, GLOBALS->signalarea->allocation.width, GLOBALS->signalarea->allocation.height); } draw_marker(); } } void button_press_release_common(void) { MaxSignalLength(); gdk_draw_rectangle(GLOBALS->signalpixmap, GLOBALS->gc.gc_ltgray, TRUE, 0, 0, GLOBALS->signal_fill_width, GLOBALS->signalarea->allocation.height); { char signalwindow_width_dirty = GLOBALS->signalwindow_width_dirty; sync_marker(); if(!signalwindow_width_dirty && GLOBALS->signalwindow_width_dirty) { MaxSignalLength_2(1); } } RenderSigs((int)(GTK_ADJUSTMENT(GLOBALS->wave_vslider)->value),0); if(GLOBALS->signalarea_has_focus) { gdk_draw_pixmap(GLOBALS->signalarea->window, GLOBALS->signalarea->style->fg_gc[GTK_WIDGET_STATE(GLOBALS->signalarea)], GLOBALS->signalpixmap, (gint)(GTK_ADJUSTMENT(GLOBALS->signal_hslider)->value)+1, 0+1, 0+1, 0+1, GLOBALS->signalarea->allocation.width-2, GLOBALS->signalarea->allocation.height-2); draw_signalarea_focus(); } else { gdk_draw_pixmap(GLOBALS->signalarea->window, GLOBALS->signalarea->style->fg_gc[GTK_WIDGET_STATE(GLOBALS->signalarea)], GLOBALS->signalpixmap, (gint)(GTK_ADJUSTMENT(GLOBALS->signal_hslider)->value), 0, 0, 0, GLOBALS->signalarea->allocation.width, GLOBALS->signalarea->allocation.height); } } static void button_motion_common(gint xin, gint yin, int pressrel, int is_button_2) { gdouble x,offset,pixstep; TimeType newcurr; if(xin<0) xin=0; if(xin>(GLOBALS->wavewidth-1)) xin=(GLOBALS->wavewidth-1); x=xin; /* for pix time calc */ pixstep=((gdouble)GLOBALS->nsperframe)/((gdouble)GLOBALS->pixelsperframe); newcurr=(TimeType)(offset=((gdouble)GLOBALS->tims.start)+(x*pixstep)); if(offset-newcurr>0.5) /* round to nearest integer ns */ { newcurr++; } if(newcurr>GLOBALS->tims.last) /* sanity checking */ { newcurr=GLOBALS->tims.last; } if(newcurr>GLOBALS->tims.end) { newcurr=GLOBALS->tims.end; } if(newcurrtims.start) { newcurr=GLOBALS->tims.start; } newcurr = time_trunc(newcurr); if(newcurr < 0) newcurr = GLOBALS->min_time; /* prevents marker from disappearing? */ if(!is_button_2) { update_markertime(GLOBALS->tims.marker=cook_markertime(newcurr, xin, yin)); if(GLOBALS->tims.lmbcache<0) GLOBALS->tims.lmbcache=time_trunc(newcurr); draw_marker_partitions(); if((pressrel)||(GLOBALS->constant_marker_update)) { button_press_release_common(); } } else { GLOBALS->tims.baseline = ((GLOBALS->tims.baseline<0)||(is_button_2<0)) ? cook_markertime(newcurr, xin, yin) : -1; update_basetime(GLOBALS->tims.baseline); update_markertime(GLOBALS->tims.marker); wavearea_configure_event(GLOBALS->wavearea, NULL); } } static gint motion_notify_event(GtkWidget *widget, GdkEventMotion *event) { (void)widget; gdouble x, y, pixstep, offset; GdkModifierType state; TimeType newcurr; int scrolled; #ifdef WAVE_USE_GTK2 gint xi, yi; #endif int dummy_x, dummy_y; get_window_xypos(&dummy_x, &dummy_y); if(event->is_hint) { WAVE_GDK_GET_POINTER(event->window, &x, &y, &xi, &yi, &state); WAVE_GDK_GET_POINTER_COPY; } else { x = event->x; y = event->y; state = event->state; } do { scrolled=0; if(state&bmask[GLOBALS->in_button_press_wavewindow_c_1]) /* needed for retargeting in AIX/X11 */ { if(x<0) { if(GLOBALS->wave_scrolling) if(GLOBALS->tims.start>GLOBALS->tims.first) { if(GLOBALS->nsperframe<10) { GLOBALS->tims.start-=GLOBALS->nsperframe; } else { GLOBALS->tims.start-=(GLOBALS->nsperframe/10); } if(GLOBALS->tims.starttims.first) GLOBALS->tims.start=GLOBALS->tims.first; GTK_ADJUSTMENT(GLOBALS->wave_hslider)->value=GLOBALS->tims.marker=time_trunc(GLOBALS->tims.timecache=GLOBALS->tims.start); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "changed"); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "value_changed"); scrolled=1; } x=0; } else if(x>GLOBALS->wavewidth) { if(GLOBALS->wave_scrolling) if(GLOBALS->tims.start!=GLOBALS->tims.last) { gfloat pageinc; pageinc=(gfloat)(((gdouble)GLOBALS->wavewidth)*GLOBALS->nspx); if(GLOBALS->nsperframe<10) { GLOBALS->tims.start+=GLOBALS->nsperframe; } else { GLOBALS->tims.start+=(GLOBALS->nsperframe/10); } if(GLOBALS->tims.start>GLOBALS->tims.last-pageinc+1) GLOBALS->tims.start=time_trunc(GLOBALS->tims.last-pageinc+1); if(GLOBALS->tims.starttims.first) GLOBALS->tims.start=GLOBALS->tims.first; GLOBALS->tims.marker=time_trunc(GLOBALS->tims.start+pageinc); if(GLOBALS->tims.marker>GLOBALS->tims.last) GLOBALS->tims.marker=GLOBALS->tims.last; GTK_ADJUSTMENT(GLOBALS->wave_hslider)->value=GLOBALS->tims.timecache=GLOBALS->tims.start; gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "changed"); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "value_changed"); scrolled=1; } x=GLOBALS->wavewidth-1; } } else if((state&GDK_BUTTON2_MASK)&&(GLOBALS->tims.baseline>=0)) { button_motion_common(x,y,0,-1); /* neg one says don't clear tims.baseline */ } pixstep=((gdouble)GLOBALS->nsperframe)/((gdouble)GLOBALS->pixelsperframe); newcurr=GLOBALS->tims.start+(offset=x*pixstep); if((offset-((int)offset))>0.5) /* round to nearest integer ns */ { newcurr++; } if(newcurr>GLOBALS->tims.last) newcurr=GLOBALS->tims.last; if(newcurr!=GLOBALS->prevtim_wavewindow_c_1) { update_currenttime(time_trunc(newcurr)); GLOBALS->prevtim_wavewindow_c_1=newcurr; } if(state&bmask[GLOBALS->in_button_press_wavewindow_c_1]) { button_motion_common(x,y,0,0); } /* warp selected signals if CTRL is pressed */ #ifdef MAC_INTEGRATION if((event->state & GDK_MOD2_MASK)&&(state&GDK_BUTTON1_MASK)) #else if((event->state & GDK_CONTROL_MASK)&&(state&GDK_BUTTON1_MASK)) #endif { int warp = 0; Trptr t = GLOBALS->traces.first; TimeType gt, delta; while ( t ) { if ( t->flags & TR_HIGHLIGHT ) { warp++; if(!t->shift_drag_valid) { t->shift_drag = t->shift; t->shift_drag_valid = 1; } gt = t->shift_drag + (GLOBALS->tims.marker - GLOBALS->tims.lmbcache); if(gt<0) { delta=GLOBALS->tims.first-GLOBALS->tims.last; if(gt0) { delta=GLOBALS->tims.last-GLOBALS->tims.first; if(gt>delta) gt=delta; } t->shift = gt; } t = t->t_next; } if( warp ) { /* commented out to reduce on visual noise... GLOBALS->signalwindow_width_dirty = 1; MaxSignalLength( ); ...commented out to reduce on visual noise */ signalarea_configure_event( GLOBALS->signalarea, NULL ); wavearea_configure_event( GLOBALS->wavearea, NULL ); } } if(scrolled) /* make sure counters up top update.. */ { gtk_events_pending_gtk_main_iteration(); } WAVE_GDK_GET_POINTER(event->window, &x, &y, &xi, &yi, &state); WAVE_GDK_GET_POINTER_COPY; } while((scrolled)&&(state&bmask[GLOBALS->in_button_press_wavewindow_c_1])); return(TRUE); } #ifdef WAVE_USE_GTK2 static void alternate_y_scroll(int delta) { GtkAdjustment *wadj=GTK_ADJUSTMENT(GLOBALS->wave_vslider); int value = (int)wadj->value; int target = value + delta; int num_traces_displayable=(GLOBALS->signalarea->allocation.height)/(GLOBALS->fontheight); num_traces_displayable--; /* for the time trace that is always there */ if(target > GLOBALS->traces.visible - num_traces_displayable) target = GLOBALS->traces.visible - num_traces_displayable; if(target < 0) target = 0; wadj->value = target; gtk_signal_emit_by_name (GTK_OBJECT (wadj), "changed"); /* force bar update */ gtk_signal_emit_by_name (GTK_OBJECT (wadj), "value_changed"); /* force text update */ } /* * Sane code starts here... :) * TomB 05Feb2012 */ #define SANE_INCREMENT 0.25 /* don't want to increment a whole page thereby completely losing where I am... */ void alt_move_left(gboolean fine_scroll) { TimeType ntinc, ntfrac; ntinc=(TimeType)(((gdouble)GLOBALS->wavewidth)*GLOBALS->nspx); /* really don't need this var but the speed of ui code is human dependent.. */ ntfrac=ntinc*GLOBALS->page_divisor*(SANE_INCREMENT / (fine_scroll ? 8.0 : 1.0)); if(!ntfrac) ntfrac = 1; if((GLOBALS->tims.start-ntfrac)>GLOBALS->tims.first) GLOBALS->tims.timecache=GLOBALS->tims.start-ntfrac; else GLOBALS->tims.timecache=GLOBALS->tims.first; GTK_ADJUSTMENT(GLOBALS->wave_hslider)->value=GLOBALS->tims.timecache; time_update(); DEBUG(printf("Alternate move left\n")); } void alt_move_right(gboolean fine_scroll) { TimeType ntinc, ntfrac; ntinc=(TimeType)(((gdouble)GLOBALS->wavewidth)*GLOBALS->nspx); ntfrac=ntinc*GLOBALS->page_divisor*(SANE_INCREMENT / (fine_scroll ? 8.0 : 1.0)); if(!ntfrac) ntfrac = 1; if((GLOBALS->tims.start+ntfrac)<(GLOBALS->tims.last-ntinc+1)) { GLOBALS->tims.timecache=GLOBALS->tims.start+ntfrac; } else { GLOBALS->tims.timecache=GLOBALS->tims.last-ntinc+1; if(GLOBALS->tims.timecachetims.first) GLOBALS->tims.timecache=GLOBALS->tims.first; } GTK_ADJUSTMENT(GLOBALS->wave_hslider)->value=GLOBALS->tims.timecache; time_update(); DEBUG(printf("Alternate move right\n")); } void alt_zoom_out(GtkWidget *text, gpointer data) { (void)text; (void)data; TimeType middle=0, width; TimeType marker = GLOBALS->cached_currenttimeval_currenttime_c_1; /* Zoom on mouse cursor, not marker */ if(GLOBALS->do_zoom_center) { if((marker<0)||(markertims.first)||(marker>GLOBALS->tims.last)) { if(GLOBALS->tims.end>GLOBALS->tims.last) GLOBALS->tims.end=GLOBALS->tims.last; middle=(GLOBALS->tims.start/2)+(GLOBALS->tims.end/2); if((GLOBALS->tims.start&1)&&(GLOBALS->tims.end&1)) middle++; } else { middle=marker; } } GLOBALS->tims.prevzoom=GLOBALS->tims.zoom; GLOBALS->tims.zoom--; calczoom(GLOBALS->tims.zoom); if(GLOBALS->do_zoom_center) { width=(TimeType)(((gdouble)GLOBALS->wavewidth)*GLOBALS->nspx); GLOBALS->tims.start=time_trunc(middle-(width/2)); if(GLOBALS->tims.start+width>GLOBALS->tims.last) GLOBALS->tims.start=time_trunc(GLOBALS->tims.last-width); if(GLOBALS->tims.starttims.first) GLOBALS->tims.start=GLOBALS->tims.first; GTK_ADJUSTMENT(GLOBALS->wave_hslider)->value=GLOBALS->tims.timecache=GLOBALS->tims.start; } else { GLOBALS->tims.timecache=0; } fix_wavehadj(); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "changed"); /* force zoom update */ gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "value_changed"); /* force zoom update */ DEBUG(printf("Alternate Zoom out\n")); } void alt_zoom_in(GtkWidget *text, gpointer data) { (void)text; (void)data; if(GLOBALS->tims.zoom<0) /* otherwise it's ridiculous and can cause */ { /* overflow problems in the scope */ TimeType middle=0, width; TimeType marker = GLOBALS->cached_currenttimeval_currenttime_c_1; /* Zoom on mouse cursor, not marker */ if(GLOBALS->do_zoom_center) { if((marker<0)||(markertims.first)||(marker>GLOBALS->tims.last)) { if(GLOBALS->tims.end>GLOBALS->tims.last) GLOBALS->tims.end=GLOBALS->tims.last; middle=(GLOBALS->tims.start/2)+(GLOBALS->tims.end/2); if((GLOBALS->tims.start&1)&&(GLOBALS->tims.end&1)) middle++; } else { middle=marker; } } GLOBALS->tims.prevzoom=GLOBALS->tims.zoom; GLOBALS->tims.zoom++; calczoom(GLOBALS->tims.zoom); if(GLOBALS->do_zoom_center) { width=(TimeType)(((gdouble)GLOBALS->wavewidth)*GLOBALS->nspx); GLOBALS->tims.start=time_trunc(middle-(width/2)); if(GLOBALS->tims.start+width>GLOBALS->tims.last) GLOBALS->tims.start=time_trunc(GLOBALS->tims.last-width); if(GLOBALS->tims.starttims.first) GLOBALS->tims.start=GLOBALS->tims.first; GTK_ADJUSTMENT(GLOBALS->wave_hslider)->value=GLOBALS->tims.timecache=GLOBALS->tims.start; } else { GLOBALS->tims.timecache=0; } fix_wavehadj(); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "changed"); /* force zoom update */ gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "value_changed"); /* force zoom update */ DEBUG(printf("Alternate zoom in\n")); } } static gint scroll_event( GtkWidget * widget, GdkEventScroll * event ) { (void)widget; int num_traces_displayable=(GLOBALS->signalarea->allocation.height)/(GLOBALS->fontheight); num_traces_displayable--; DEBUG(printf("Mouse Scroll Event\n")); if(GLOBALS->alt_wheel_mode) { /* TomB mouse wheel handling */ #ifdef MAC_INTEGRATION if ( event->state & GDK_MOD2_MASK ) #else if ( event->state & GDK_CONTROL_MASK ) #endif { /* CTRL+wheel - zoom in/out around current mouse cursor position */ if(event->direction == GDK_SCROLL_UP) alt_zoom_in(NULL, 0); else if(event->direction == GDK_SCROLL_DOWN) alt_zoom_out(NULL, 0); } else if( event->state & GDK_MOD1_MASK ) { /* ALT+wheel - edge left/right mode */ if(event->direction == GDK_SCROLL_UP) service_left_edge(NULL, 0); else if(event->direction == GDK_SCROLL_DOWN) service_right_edge(NULL, 0); } else { /* wheel alone - scroll part of a page along */ if(event->direction == GDK_SCROLL_UP) alt_move_left((event->state & GDK_SHIFT_MASK) != 0); /* finer scroll if shift */ else if(event->direction == GDK_SCROLL_DOWN) alt_move_right((event->state & GDK_SHIFT_MASK) != 0); /* finer scroll if shift */ } } else { /* Original 3.3.31 mouse wheel handling */ switch ( event->direction ) { case GDK_SCROLL_UP: if (GLOBALS->use_scrollwheel_as_y) { if(event->state & GDK_SHIFT_MASK) { alternate_y_scroll(-num_traces_displayable); } else { alternate_y_scroll(-1); } } else { #ifdef MAC_INTEGRATION if ( event->state & GDK_MOD2_MASK ) #else if ( event->state & GDK_CONTROL_MASK ) #endif service_left_shift(NULL, 0); else if ( event->state & GDK_MOD1_MASK ) service_zoom_out(NULL, 0); else service_left_page(NULL, 0); } break; case GDK_SCROLL_DOWN: if (GLOBALS->use_scrollwheel_as_y) { if(event->state & GDK_SHIFT_MASK) { alternate_y_scroll(num_traces_displayable); } else { alternate_y_scroll(1); } } { #ifdef MAC_INTEGRATION if ( event->state & GDK_MOD2_MASK ) #else if ( event->state & GDK_CONTROL_MASK ) #endif service_right_shift(NULL, 0); else if ( event->state & GDK_MOD1_MASK ) service_zoom_in(NULL, 0); else service_right_page(NULL, 0); } break; default: break; } } return(TRUE); } #endif static gint button_press_event(GtkWidget *widget, GdkEventButton *event) { if((event->button==1)||((event->button==3)&&(!GLOBALS->in_button_press_wavewindow_c_1))) { GLOBALS->in_button_press_wavewindow_c_1=event->button; DEBUG(printf("Button Press Event\n")); GLOBALS->prev_markertime = GLOBALS->tims.marker; button_motion_common(event->x,event->y,1,0); GLOBALS->tims.timecache=GLOBALS->tims.start; gdk_pointer_grab(widget->window, FALSE, m_bmask[GLOBALS->in_button_press_wavewindow_c_1] | /* key up on motion for button pressed ONLY */ GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_RELEASE_MASK, NULL, NULL, event->time); #ifdef MAC_INTEGRATION if ((event->state & GDK_MOD2_MASK) && (event->button==1)) #else if ((event->state & GDK_CONTROL_MASK) && (event->button==1)) #endif { Trptr t = GLOBALS->traces.first; while(t) { if((t->flags & TR_HIGHLIGHT)&&(!t->shift_drag_valid)) { t->shift_drag = t->shift; /* cache old value */ t->shift_drag_valid = 1; } t=t->t_next; } } } else if(event->button==2) { if(!GLOBALS->button2_debounce_flag) { GLOBALS->button2_debounce_flag = 1; /* cleared by mouseover_timer() interrupt */ button_motion_common(event->x,event->y,1,1); } } return(TRUE); } static gint button_release_event(GtkWidget *widget, GdkEventButton *event) { (void)widget; if((event->button)&&(event->button==GLOBALS->in_button_press_wavewindow_c_1)) { GLOBALS->in_button_press_wavewindow_c_1=0; DEBUG(printf("Button Release Event\n")); button_motion_common(event->x,event->y,1,0); /* warp selected signals if CTRL is pressed */ if(event->button==1) { int warp = 0; Trptr t = GLOBALS->traces.first; #ifdef MAC_INTEGRATION if(event->state & GDK_MOD2_MASK) #else if(event->state & GDK_CONTROL_MASK) #endif { TimeType gt, delta; while ( t ) { if ( t->flags & TR_HIGHLIGHT ) { warp++; gt = (t->shift_drag_valid ? t-> shift_drag : t->shift) + (GLOBALS->tims.marker - GLOBALS->tims.lmbcache); if(gt<0) { delta=GLOBALS->tims.first-GLOBALS->tims.last; if(gt0) { delta=GLOBALS->tims.last-GLOBALS->tims.first; if(gt>delta) gt=delta; } t->shift = gt; t->flags &= ( ~TR_HIGHLIGHT ); } t->shift_drag_valid = 0; t = t->t_next; } } else /* back out warp and keep highlighting */ { while(t) { if(t->shift_drag_valid) { t->shift = t->shift_drag; t->shift_drag_valid = 0; warp++; } t=t->t_next; } } if( warp ) { GLOBALS->signalwindow_width_dirty = 1; MaxSignalLength( ); signalarea_configure_event( GLOBALS->signalarea, NULL ); wavearea_configure_event( GLOBALS->wavearea, NULL ); } } GLOBALS->tims.timecache=GLOBALS->tims.start; gdk_pointer_ungrab(event->time); if(event->button==3) /* oh yeah, dragzoooooooom! */ { service_dragzoom(GLOBALS->tims.lmbcache, GLOBALS->tims.marker); } GLOBALS->tims.lmbcache=-1; update_markertime(GLOBALS->tims.marker); } GLOBALS->mouseover_counter = 11; move_mouseover(NULL, 0, 0, LLDescriptor(0)); GLOBALS->tims.timecache=0; if(GLOBALS->prev_markertime == LLDescriptor(-1)) { signalarea_configure_event( GLOBALS->signalarea, NULL ); } return(TRUE); } void make_sigarea_gcs(GtkWidget *signalarea) { if(!GLOBALS->made_sgc_contexts_wavewindow_c_1) { GLOBALS->gc_white = alloc_color(signalarea, GLOBALS->color_white, signalarea->style->white_gc); GLOBALS->gc_black = alloc_color(signalarea, GLOBALS->color_black, signalarea->style->black_gc); GLOBALS->gc.gc_ltgray= alloc_color(signalarea, GLOBALS->color_ltgray, signalarea->style->bg_gc[GTK_STATE_PRELIGHT]); GLOBALS->gc.gc_normal= alloc_color(signalarea, GLOBALS->color_normal, signalarea->style->bg_gc[GTK_STATE_NORMAL]); GLOBALS->gc.gc_mdgray= alloc_color(signalarea, GLOBALS->color_mdgray, signalarea->style->bg_gc[GTK_STATE_INSENSITIVE]); GLOBALS->gc.gc_dkgray= alloc_color(signalarea, GLOBALS->color_dkgray, signalarea->style->bg_gc[GTK_STATE_ACTIVE]); GLOBALS->gc.gc_dkblue= alloc_color(signalarea, GLOBALS->color_dkblue, signalarea->style->bg_gc[GTK_STATE_SELECTED]); GLOBALS->gc.gc_brkred= alloc_color(signalarea, GLOBALS->color_brkred, signalarea->style->bg_gc[GTK_STATE_SELECTED]); GLOBALS->gc.gc_ltblue= alloc_color(signalarea, GLOBALS->color_ltblue, signalarea->style->bg_gc[GTK_STATE_SELECTED]); GLOBALS->gc.gc_gmstrd= alloc_color(signalarea, GLOBALS->color_gmstrd, signalarea->style->bg_gc[GTK_STATE_SELECTED]); GLOBALS->made_sgc_contexts_wavewindow_c_1=~0; } } static const int wave_rgb_rainbow[WAVE_NUM_RAINBOW] = WAVE_RAINBOW_RGB; gint wavearea_configure_event(GtkWidget *widget, GdkEventConfigure *event) { (void)event; if((!widget)||(!widget->window)) return(TRUE); DEBUG(printf("WaveWin Configure Event h: %d, w: %d\n",widget->allocation.height, widget->allocation.width)); if(GLOBALS->wavepixmap_wavewindow_c_1) { if((GLOBALS->wavewidth!=widget->allocation.width)||(GLOBALS->waveheight!=widget->allocation.height)) { gdk_pixmap_unref(GLOBALS->wavepixmap_wavewindow_c_1); GLOBALS->wavepixmap_wavewindow_c_1=gdk_pixmap_new(widget->window, GLOBALS->wavewidth=widget->allocation.width, GLOBALS->waveheight=widget->allocation.height, -1); } GLOBALS->old_wvalue=-1.0; } else { GLOBALS->wavepixmap_wavewindow_c_1=gdk_pixmap_new(widget->window, GLOBALS->wavewidth=widget->allocation.width, GLOBALS->waveheight=widget->allocation.height, -1); } if(!GLOBALS->made_gc_contexts_wavewindow_c_1) { int i; GLOBALS->gc.gc_back_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_back, GLOBALS->wavearea->style->white_gc); GLOBALS->gc.gc_baseline_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_baseline, GLOBALS->wavearea->style->bg_gc[GTK_STATE_SELECTED]); GLOBALS->gc.gc_grid_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_grid, GLOBALS->wavearea->style->bg_gc[GTK_STATE_PRELIGHT]); GLOBALS->gc.gc_grid2_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_grid2, GLOBALS->wavearea->style->bg_gc[GTK_STATE_ACTIVE]); GLOBALS->gc.gc_time_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_time, GLOBALS->wavearea->style->black_gc); GLOBALS->gc.gc_timeb_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_timeb, GLOBALS->wavearea->style->bg_gc[GTK_STATE_ACTIVE]); GLOBALS->gc.gc_value_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_value, GLOBALS->wavearea->style->black_gc); GLOBALS->gc.gc_low_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_low, GLOBALS->wavearea->style->black_gc); GLOBALS->gc.gc_highfill_wavewindow_c_1=alloc_color(GLOBALS->wavearea, GLOBALS->color_highfill, GLOBALS->wavearea->style->bg_gc[GTK_STATE_PRELIGHT]); GLOBALS->gc.gc_high_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_high, GLOBALS->wavearea->style->black_gc); GLOBALS->gc.gc_trans_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_trans, GLOBALS->wavearea->style->black_gc); GLOBALS->gc.gc_mid_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_mid, GLOBALS->wavearea->style->black_gc); GLOBALS->gc.gc_xfill_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_xfill, GLOBALS->wavearea->style->bg_gc[GTK_STATE_PRELIGHT]); GLOBALS->gc.gc_x_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_x, GLOBALS->wavearea->style->black_gc); GLOBALS->gc.gc_vbox_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_vbox, GLOBALS->wavearea->style->black_gc); GLOBALS->gc.gc_vtrans_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_vtrans, GLOBALS->wavearea->style->black_gc); GLOBALS->gc.gc_mark_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_mark, GLOBALS->wavearea->style->bg_gc[GTK_STATE_SELECTED]); GLOBALS->gc.gc_umark_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_umark, GLOBALS->wavearea->style->bg_gc[GTK_STATE_SELECTED]); #ifdef WAVE_DOUBLE_LINE_WIDTH_MODE gdk_gc_set_line_attributes(GLOBALS->gc.gc_value_wavewindow_c_1, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_line_attributes(GLOBALS->gc.gc_low_wavewindow_c_1, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_line_attributes(GLOBALS->gc.gc_high_wavewindow_c_1, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_line_attributes(GLOBALS->gc.gc_trans_wavewindow_c_1, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_line_attributes(GLOBALS->gc.gc_mid_wavewindow_c_1, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_line_attributes(GLOBALS->gc.gc_xfill_wavewindow_c_1, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_line_attributes(GLOBALS->gc.gc_x_wavewindow_c_1, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_line_attributes(GLOBALS->gc.gc_vbox_wavewindow_c_1, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_line_attributes(GLOBALS->gc.gc_vtrans_wavewindow_c_1, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_line_attributes(GLOBALS->gc.gc_mark_wavewindow_c_1, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_line_attributes(GLOBALS->gc.gc_umark_wavewindow_c_1, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); #endif GLOBALS->gc.gc_0_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_0, GLOBALS->wavearea->style->black_gc); GLOBALS->gc.gc_1fill_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_1fill, GLOBALS->wavearea->style->bg_gc[GTK_STATE_PRELIGHT]); GLOBALS->gc.gc_1_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_1, GLOBALS->wavearea->style->black_gc); GLOBALS->gc.gc_ufill_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_ufill, GLOBALS->wavearea->style->bg_gc[GTK_STATE_PRELIGHT]); GLOBALS->gc.gc_u_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_u, GLOBALS->wavearea->style->black_gc); GLOBALS->gc.gc_wfill_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_wfill, GLOBALS->wavearea->style->bg_gc[GTK_STATE_PRELIGHT]); GLOBALS->gc.gc_w_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_w, GLOBALS->wavearea->style->black_gc); GLOBALS->gc.gc_dashfill_wavewindow_c_1= alloc_color(GLOBALS->wavearea, GLOBALS->color_dashfill, GLOBALS->wavearea->style->bg_gc[GTK_STATE_PRELIGHT]); GLOBALS->gc.gc_dash_wavewindow_c_1 = alloc_color(GLOBALS->wavearea, GLOBALS->color_dash, GLOBALS->wavearea->style->black_gc); #ifdef WAVE_DOUBLE_LINE_WIDTH_MODE gdk_gc_set_line_attributes(GLOBALS->gc.gc_0_wavewindow_c_1, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_line_attributes(GLOBALS->gc.gc_1fill_wavewindow_c_1, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_line_attributes(GLOBALS->gc.gc_1_wavewindow_c_1, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_line_attributes(GLOBALS->gc.gc_ufill_wavewindow_c_1, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_line_attributes(GLOBALS->gc.gc_u_wavewindow_c_1, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_line_attributes(GLOBALS->gc.gc_wfill_wavewindow_c_1, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_line_attributes(GLOBALS->gc.gc_w_wavewindow_c_1, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_line_attributes(GLOBALS->gc.gc_dashfill_wavewindow_c_1, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_line_attributes(GLOBALS->gc.gc_dash_wavewindow_c_1, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); #endif GLOBALS->made_gc_contexts_wavewindow_c_1=~0; memcpy(&GLOBALS->gccache, &GLOBALS->gc, sizeof(struct wave_gcmaster_t)); /* add rainbow colors */ for(i=0;igc_rainbow[i*2] = alloc_color(GLOBALS->wavearea, col, GLOBALS->wavearea->style->black_gc); col >>= 1; col &= 0x007F7F7F; GLOBALS->gc_rainbow[i*2+1] = alloc_color(GLOBALS->wavearea, col, GLOBALS->wavearea->style->black_gc); #ifdef WAVE_DOUBLE_LINE_WIDTH_MODE gdk_gc_set_line_attributes(GLOBALS->gc_rainbow[i*2], 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_line_attributes(GLOBALS->gc_rainbow[i*2+1], 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); #endif } } if(GLOBALS->timestart_from_savefile_valid) { gfloat pageinc=(gfloat)(((gdouble)GLOBALS->wavewidth)*GLOBALS->nspx); if((GLOBALS->timestart_from_savefile >= GLOBALS->tims.first) && (GLOBALS->timestart_from_savefile <= (GLOBALS->tims.last-pageinc))) { GtkAdjustment *hadj = GTK_ADJUSTMENT(GLOBALS->wave_hslider); hadj->value = GLOBALS->timestart_from_savefile; fix_wavehadj(); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "value_changed"); /* force zoom update */ gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "changed"); /* force zoom update */ } GLOBALS->timestart_from_savefile_valid = 0; } if(GLOBALS->wavewidth>1) { if((!GLOBALS->do_initial_zoom_fit)||(GLOBALS->do_initial_zoom_fit_used)) { calczoom(GLOBALS->tims.zoom); fix_wavehadj(); gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "value_changed"); /* force zoom update */ gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(GLOBALS->wave_hslider)), "changed"); /* force zoom update */ } else { GLOBALS->do_initial_zoom_fit_used=1; service_zoom_fit(NULL,NULL); } } /* tims.timecache=tims.laststart; */ return(TRUE); } /* * screengrab vs normal rendering gcs... */ void force_screengrab_gcs(void) { GLOBALS->black_and_white = 1; GLOBALS->gc.gc_ltgray= GLOBALS->gc_white ; GLOBALS->gc.gc_normal= GLOBALS->gc_white ; GLOBALS->gc.gc_mdgray= GLOBALS->gc_white ; GLOBALS->gc.gc_dkgray= GLOBALS->gc_white ; GLOBALS->gc.gc_dkblue= GLOBALS->gc_black ; GLOBALS->gc.gc_brkred= GLOBALS->gc_black ; GLOBALS->gc.gc_ltblue= GLOBALS->gc_black ; GLOBALS->gc.gc_gmstrd= GLOBALS->gc_black ; GLOBALS->gc.gc_back_wavewindow_c_1 = GLOBALS->gc_white ; GLOBALS->gc.gc_baseline_wavewindow_c_1 = GLOBALS->gc_black; GLOBALS->gc.gc_grid_wavewindow_c_1 = GLOBALS->gc_black; GLOBALS->gc.gc_grid2_wavewindow_c_1 = GLOBALS->gc_black; GLOBALS->gc.gc_time_wavewindow_c_1 = GLOBALS->gc_black; GLOBALS->gc.gc_timeb_wavewindow_c_1 = GLOBALS->gc_white; GLOBALS->gc.gc_value_wavewindow_c_1 = GLOBALS->gc_black; GLOBALS->gc.gc_low_wavewindow_c_1 = GLOBALS->gc_black; GLOBALS->gc.gc_highfill_wavewindow_c_1= GLOBALS->gc_black; GLOBALS->gc.gc_high_wavewindow_c_1 = GLOBALS->gc_black; GLOBALS->gc.gc_trans_wavewindow_c_1 = GLOBALS->gc_black; GLOBALS->gc.gc_mid_wavewindow_c_1 = GLOBALS->gc_black; GLOBALS->gc.gc_xfill_wavewindow_c_1 = GLOBALS->gc_black; GLOBALS->gc.gc_x_wavewindow_c_1 = GLOBALS->gc_black; GLOBALS->gc.gc_vbox_wavewindow_c_1 = GLOBALS->gc_black; GLOBALS->gc.gc_vtrans_wavewindow_c_1 = GLOBALS->gc_black; GLOBALS->gc.gc_mark_wavewindow_c_1 = GLOBALS->gc_black; GLOBALS->gc.gc_umark_wavewindow_c_1 = GLOBALS->gc_black; GLOBALS->gc.gc_0_wavewindow_c_1 = GLOBALS->gc_black; GLOBALS->gc.gc_1fill_wavewindow_c_1 = GLOBALS->gc_black; GLOBALS->gc.gc_1_wavewindow_c_1 = GLOBALS->gc_black; GLOBALS->gc.gc_ufill_wavewindow_c_1 = GLOBALS->gc_black; GLOBALS->gc.gc_u_wavewindow_c_1 = GLOBALS->gc_black; GLOBALS->gc.gc_wfill_wavewindow_c_1 = GLOBALS->gc_black; GLOBALS->gc.gc_w_wavewindow_c_1 = GLOBALS->gc_black; GLOBALS->gc.gc_dashfill_wavewindow_c_1= GLOBALS->gc_black; GLOBALS->gc.gc_dash_wavewindow_c_1 = GLOBALS->gc_black; } void force_normal_gcs(void) { GLOBALS->black_and_white = 0; memcpy(&GLOBALS->gc, &GLOBALS->gccache, sizeof(struct wave_gcmaster_t)); } static gint wavearea_configure_event_local(GtkWidget *widget, GdkEventConfigure *event) { gint rc; gint page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(GLOBALS->notebook)); struct Global *g_old = GLOBALS; set_GLOBALS((*GLOBALS->contexts)[page_num]); rc = wavearea_configure_event(widget, event); set_GLOBALS(g_old); return(rc); } static gint expose_event(GtkWidget *widget, GdkEventExpose *event) { gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE(widget)],GLOBALS->wavepixmap_wavewindow_c_1, event->area.x, event->area.y,event->area.x, event->area.y,event->area.width, event->area.height); draw_marker(); return(FALSE); } static gint expose_event_local(GtkWidget *widget, GdkEventExpose *event) { gint rc; gint page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(GLOBALS->notebook)); /* struct Global *g_old = GLOBALS; */ set_GLOBALS((*GLOBALS->contexts)[page_num]); rc = expose_event(widget, event); /* seems to cause a conflict flipping back so don't! */ /* set_GLOBALS(g_old); */ return(rc); } GtkWidget * create_wavewindow(void) { GtkWidget *table; GtkWidget *frame; GtkAdjustment *hadj, *vadj; table = gtk_table_new(10, 10, FALSE); GLOBALS->wavearea=gtk_drawing_area_new(); gtk_widget_show(GLOBALS->wavearea); gtk_widget_set_events(GLOBALS->wavearea, #ifdef WAVE_USE_GTK2 GDK_SCROLL_MASK | #endif GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK ); gtk_signal_connect(GTK_OBJECT(GLOBALS->wavearea), "configure_event",GTK_SIGNAL_FUNC(wavearea_configure_event_local), NULL); gtk_signal_connect(GTK_OBJECT(GLOBALS->wavearea), "expose_event",GTK_SIGNAL_FUNC(expose_event_local), NULL); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->wavearea), "motion_notify_event",GTK_SIGNAL_FUNC(motion_notify_event), NULL); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->wavearea), "button_press_event",GTK_SIGNAL_FUNC(button_press_event), NULL); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->wavearea), "button_release_event",GTK_SIGNAL_FUNC(button_release_event), NULL); #ifdef WAVE_USE_GTK2 gtkwave_signal_connect(GTK_OBJECT(GLOBALS->wavearea), "scroll_event",GTK_SIGNAL_FUNC(scroll_event), NULL); GTK_WIDGET_SET_FLAGS( GLOBALS->wavearea, GTK_CAN_FOCUS ); #endif gtk_table_attach (GTK_TABLE (table), GLOBALS->wavearea, 0, 9, 0, 9,GTK_FILL | GTK_EXPAND,GTK_FILL | GTK_EXPAND, 3, 2); GLOBALS->wave_vslider=gtk_adjustment_new(0.0, 0.0, 0.0, 0.0, 0.0, 0.0); vadj=GTK_ADJUSTMENT(GLOBALS->wave_vslider); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->wave_vslider), "value_changed",GTK_SIGNAL_FUNC(service_vslider), NULL); GLOBALS->vscroll_wavewindow_c_1=gtk_vscrollbar_new(vadj); /* GTK_WIDGET_SET_FLAGS(GLOBALS->vscroll_wavewindow_c_1, GTK_CAN_FOCUS); */ gtk_widget_show(GLOBALS->vscroll_wavewindow_c_1); gtk_table_attach (GTK_TABLE (table), GLOBALS->vscroll_wavewindow_c_1, 9, 10, 0, 9, GTK_FILL, GTK_FILL | GTK_SHRINK, 3, 3); GLOBALS->wave_hslider=gtk_adjustment_new(0.0, 0.0, 0.0, 0.0, 0.0, 0.0); hadj=GTK_ADJUSTMENT(GLOBALS->wave_hslider); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->wave_hslider), "value_changed",GTK_SIGNAL_FUNC(service_hslider), NULL); GLOBALS->hscroll_wavewindow_c_2=gtk_hscrollbar_new(hadj); /* GTK_WIDGET_SET_FLAGS(GLOBALS->hscroll_wavewindow_c_2, GTK_CAN_FOCUS); */ gtk_widget_show(GLOBALS->hscroll_wavewindow_c_2); #if WAVE_USE_GTK2 if(GLOBALS->enable_slider_zoom) { GValue gvalue; if(!draw_slider_p) { GtkStyle *gs = gtk_widget_get_style(GLOBALS->hscroll_wavewindow_c_2); draw_slider_p = GTK_STYLE_GET_CLASS(gs)->draw_slider; GTK_STYLE_GET_CLASS(gs)->draw_slider = draw_slider; } memset(&gvalue, 0, sizeof(GValue)); g_value_init(&gvalue, G_TYPE_INT); gtk_widget_style_get_property(GLOBALS->hscroll_wavewindow_c_2, "min-slider-length", &gvalue); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->hscroll_wavewindow_c_2), "button_press_event",GTK_SIGNAL_FUNC(slider_bpr), NULL); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->hscroll_wavewindow_c_2), "button_release_event",GTK_SIGNAL_FUNC(slider_brr), NULL); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->hscroll_wavewindow_c_2), "motion_notify_event",GTK_SIGNAL_FUNC(slider_mnr), NULL); } #endif gtk_table_attach (GTK_TABLE (table), GLOBALS->hscroll_wavewindow_c_2, 0, 9, 9, 10, GTK_FILL, GTK_FILL | GTK_SHRINK, 3, 4); gtk_widget_show(table); frame=gtk_frame_new("Waves"); gtk_container_border_width(GTK_CONTAINER(frame),2); gtk_container_add(GTK_CONTAINER(frame),table); return(frame); } /**********************************************/ void RenderSigs(int trtarget, int update_waves) { Trptr t; int i, trwhich; int num_traces_displayable; GtkAdjustment *hadj; int xsrc; hadj=GTK_ADJUSTMENT(GLOBALS->signal_hslider); xsrc=(gint)hadj->value; num_traces_displayable=GLOBALS->signalarea->allocation.height/(GLOBALS->fontheight); num_traces_displayable--; /* for the time trace that is always there */ gdk_draw_rectangle(GLOBALS->signalpixmap, GLOBALS->gc.gc_mdgray, TRUE, 0, -1, GLOBALS->signal_fill_width, GLOBALS->fontheight); gdk_draw_line(GLOBALS->signalpixmap, GLOBALS->gc_white, 0, GLOBALS->fontheight-1, GLOBALS->signal_fill_width-1, GLOBALS->fontheight-1); font_engine_draw_string(GLOBALS->signalpixmap, GLOBALS->signalfont, GLOBALS->gc_black, 3+xsrc, GLOBALS->fontheight-4, "Time"); t=GLOBALS->traces.first; trwhich=0; while(t) { if((trwhichtopmost_trace=t; if(t) { for(i=0;(isignalarea_has_focus) { gdk_draw_rectangle(GLOBALS->signalpixmap, GLOBALS->gc_black, FALSE, 0, 0, GLOBALS->signal_fill_width-1, GLOBALS->signalarea->allocation.height-1); } if((GLOBALS->wavepixmap_wavewindow_c_1)&&(update_waves)) { gdk_draw_rectangle(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_back_wavewindow_c_1, TRUE, 0, 0,GLOBALS->wavewidth, GLOBALS->waveheight); /* if(GLOBALS->display_grid) */ rendertimes(); rendertraces(); } } void populateBuffer (Trptr t, char *altname, char* buf) { char* ptr = buf; char *tname = altname ? altname : t->name; if (HasWave(t)) { if (tname) { strcpy(ptr, tname); ptr = ptr + strlen(ptr); if((tname)&&(t->shift)) { ptr[0]='`'; reformat_time(ptr+1, t->shift, GLOBALS->time_dimension); ptr = ptr + strlen(ptr+1) + 1; strcpy(ptr,"\'"); #ifdef WAVE_ARRAY_SUPPORT ptr = ptr + strlen(ptr); /* really needed for aet2 only */ #endif } #ifdef WAVE_ARRAY_SUPPORT if((!t->vector)&&(t->n.nd)&&(t->n.nd->array_height)) { sprintf(ptr, "{%d}", t->n.nd->this_row); /* ptr = ptr + strlen(ptr); */ /* scan-build */ } #endif } if (IsGroupBegin(t)) { char * pch; ptr = buf; if (IsClosed(t)) { pch = strstr (ptr,"[-]"); if(pch) {strncpy (pch,"[+]", 3); } } else { pch = strstr (ptr,"[+]"); if(pch) {strncpy (pch,"[-]", 3); } } } } else { if (tname) { if (IsGroupEnd(t)) { strcpy(ptr, "} "); ptr = ptr + strlen(ptr); } strcpy(ptr, tname); ptr = ptr + strlen(ptr); if (IsGroupBegin(t)) { if (IsClosed(t) && IsCollapsed(t->t_match)) { strcpy(ptr, " {}"); } else { strcpy(ptr, " {"); } /* ptr = ptr + strlen(ptr); */ /* scan-build */ } } } } /***************************************************************************/ int RenderSig(Trptr t, int i, int dobackground) { int texty, liney; int retval; char buf[2048]; GdkGC *clr_comment; GdkGC *clr_group; GdkGC *clr_shadowed; GdkGC *clr_signal; GdkGC* bg_color; GdkGC* text_color; unsigned left_justify; char *subname = NULL; bvptr bv = NULL; buf[0] = 0; if(t->flags & (TR_BLANK|TR_ANALOG_BLANK_STRETCH)) /* seek to real xact trace if present... */ { Trptr tscan = t; int bcnt = 0; while((tscan) && (tscan = GivePrevTrace(tscan))) { if(!(tscan->flags & (TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { if(tscan->flags & TR_TTRANSLATED) { break; /* found it */ } else { tscan = NULL; } } else { bcnt++; /* bcnt is number of blank traces */ } } if((tscan)&&(tscan->vector)) { bv = tscan->n.vec; do { bv = bv->transaction_chain; /* correlate to blank trace */ } while(bv && (bcnt--)); if(bv) { subname = bv->bvname; if(GLOBALS->hier_max_level) subname = hier_extract(subname, GLOBALS->hier_max_level); } } } populateBuffer(t, subname, buf); clr_comment = GLOBALS->gc.gc_brkred; clr_group = GLOBALS->gc.gc_gmstrd; clr_shadowed = GLOBALS->gc.gc_ltblue; clr_signal = GLOBALS->gc.gc_dkblue; UpdateSigValue(t); /* in case it's stale on nonprop */ liney=((i+2)*GLOBALS->fontheight)-2; texty=liney-(GLOBALS->signalfont->descent); retval=liney-GLOBALS->fontheight+1; left_justify = ((IsGroupBegin(t) || IsGroupEnd(t)) && !HasWave(t))|| GLOBALS->left_justify_sigs; if (IsSelected(t)) { bg_color = (!HasWave(t)) ? ((IsGroupBegin(t) || IsGroupEnd(t)) ? clr_group : clr_comment) : ((IsShadowed(t)) ? clr_shadowed : clr_signal); text_color = GLOBALS->gc_white; } else { bg_color = (dobackground==2) ? GLOBALS->gc.gc_normal : GLOBALS->gc.gc_ltgray; if(HasWave(t)) { text_color = GLOBALS->gc_black; } else { text_color = (IsGroupBegin(t) || IsGroupEnd(t)) ? clr_group : clr_comment; } } if (dobackground || IsSelected(t)) { gdk_draw_rectangle(GLOBALS->signalpixmap, bg_color, TRUE, 0, retval, GLOBALS->signal_fill_width, GLOBALS->fontheight-1); } gdk_draw_line(GLOBALS->signalpixmap, GLOBALS->gc_white, 0, liney, GLOBALS->signal_fill_width-1, liney); if((t->name)||(subname)) { font_engine_draw_string(GLOBALS->signalpixmap, GLOBALS->signalfont, text_color, left_justify?3:3+GLOBALS->max_signal_name_pixel_width- font_engine_string_measure(GLOBALS->signalfont, buf), texty, buf); } if (HasWave(t) || bv) { if((t->asciivalue)&&(!(t->flags&TR_EXCLUDE))) font_engine_draw_string(GLOBALS->signalpixmap, GLOBALS->signalfont, text_color, GLOBALS->max_signal_name_pixel_width+6, texty, t->asciivalue); } return(retval); } /***************************************************************************/ void MaxSignalLength(void) { Trptr t; int len=0,maxlen=0; int vlen=0, vmaxlen=0; char buf[2048]; char dirty_kick; bvptr bv; Trptr tscan; DEBUG(printf("signalwindow_width_dirty: %d\n",GLOBALS->signalwindow_width_dirty)); if((!GLOBALS->signalwindow_width_dirty)&&(GLOBALS->use_nonprop_fonts)) return; dirty_kick = GLOBALS->signalwindow_width_dirty; GLOBALS->signalwindow_width_dirty=0; t=GLOBALS->traces.first; while(t) { char *subname = NULL; bv = NULL; tscan = NULL; if(t->flags & (TR_BLANK|TR_ANALOG_BLANK_STRETCH)) /* seek to real xact trace if present... */ { int bcnt = 0; tscan = t; while((tscan) && (tscan = GivePrevTrace(tscan))) { if(!(tscan->flags & (TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { if(tscan->flags & TR_TTRANSLATED) { break; /* found it */ } else { tscan = NULL; } } else { bcnt++; /* bcnt is number of blank traces */ } } if((tscan)&&(tscan->vector)) { bv = tscan->n.vec; do { bv = bv->transaction_chain; /* correlate to blank trace */ } while(bv && (bcnt--)); if(bv) { subname = bv->bvname; if(GLOBALS->hier_max_level) subname = hier_extract(subname, GLOBALS->hier_max_level); } } } populateBuffer(t, subname, buf); if(!bv && (t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH))) /* for "comment" style blank traces */ { if(t->name || subname) { len=font_engine_string_measure(GLOBALS->signalfont, buf); if(len>maxlen) maxlen=len; } if(t->asciivalue) { free_2(t->asciivalue); t->asciivalue = NULL; } t=GiveNextTrace(t); } else if(t->name || subname) { len=font_engine_string_measure(GLOBALS->signalfont, buf); if(len>maxlen) maxlen=len; if((GLOBALS->tims.marker!=-1)&&(!(t->flags&TR_EXCLUDE))) { t->asciitime=GLOBALS->tims.marker; if(t->asciivalue) { free_2(t->asciivalue); } t->asciivalue = NULL; if(bv || t->vector) { char *str, *str2; vptr v; Trptr ts; TraceEnt t_temp; if(bv) { ts = &t_temp; memcpy(ts, tscan, sizeof(TraceEnt)); ts->vector = 1; ts->n.vec = bv; } else { ts = t; bv = t->n.vec; } v=bsearch_vector(bv, GLOBALS->tims.marker - ts->shift); str=convert_ascii(ts,v); if(str) { str2=(char *)malloc_2(strlen(str)+2); *str2='='; strcpy(str2+1,str); free_2(str); vlen=font_engine_string_measure(GLOBALS->signalfont,str2); t->asciivalue=str2; } else { vlen=0; t->asciivalue=NULL; } } else { char *str; hptr h_ptr; if((h_ptr=bsearch_node(t->n.nd,GLOBALS->tims.marker - t->shift))) { if(!t->n.nd->extvals) { unsigned char h_val = h_ptr->v.h_val; str=(char *)calloc_2(1,3*sizeof(char)); str[0]='='; if(t->n.nd->vartype == ND_VCD_EVENT) { h_val = (h_ptr->time >= GLOBALS->tims.first) && ((GLOBALS->tims.marker-GLOBALS->shift_timebase) == h_ptr->time) ? AN_1 : AN_0; /* generate impulse */ } if(t->flags&TR_INVERT) { str[1]=AN_STR_INV[h_val]; } else { str[1]=AN_STR[h_val]; } t->asciivalue=str; vlen=font_engine_string_measure(GLOBALS->signalfont,str); } else { char *str2; if(h_ptr->flags&HIST_REAL) { if(!(h_ptr->flags&HIST_STRING)) { #ifdef WAVE_HAS_H_DOUBLE str=convert_ascii_real(t, &h_ptr->v.h_double); #else str=convert_ascii_real(t, (double *)h_ptr->v.h_vector); #endif } else { str=convert_ascii_string((char *)h_ptr->v.h_vector); } } else { str=convert_ascii_vec(t,h_ptr->v.h_vector); } if(str) { str2=(char *)malloc_2(strlen(str)+2); *str2='='; strcpy(str2+1,str); free_2(str); vlen=font_engine_string_measure(GLOBALS->signalfont,str2); t->asciivalue=str2; } else { vlen=0; t->asciivalue=NULL; } } } else { vlen=0; t->asciivalue=NULL; } } if(vlen>vmaxlen) { vmaxlen=vlen; } } t=GiveNextTrace(t); } else { t=GiveNextTrace(t); } } GLOBALS->max_signal_name_pixel_width = maxlen; GLOBALS->signal_pixmap_width=maxlen+6; /* 2 * 3 pixel pad */ if(GLOBALS->tims.marker!=-1) { GLOBALS->signal_pixmap_width+=(vmaxlen+6); if(GLOBALS->signal_pixmap_width > 32767) GLOBALS->signal_pixmap_width = 32767; /* fixes X11 protocol limitation crash */ } GLOBALS->tims.resizemarker2 = GLOBALS->tims.resizemarker; GLOBALS->tims.resizemarker = GLOBALS->tims.marker; if(GLOBALS->signal_pixmap_width<60) GLOBALS->signal_pixmap_width=60; MaxSignalLength_2(dirty_kick); } void MaxSignalLength_2(char dirty_kick) { if(!GLOBALS->in_button_press_wavewindow_c_1) { if(!GLOBALS->do_resize_signals) { int os; os=48; if(GLOBALS->initial_signal_window_width > os) { os = GLOBALS->initial_signal_window_width; } if(GLOBALS->signalwindow) { /* printf("VALUES: %d %d %d\n", GLOBALS->initial_signal_window_width, GLOBALS->signalwindow->allocation.width, GLOBALS->max_signal_name_pixel_width); */ if (GLOBALS->first_unsized_signals && GLOBALS->max_signal_name_pixel_width !=0) { GLOBALS->first_unsized_signals = 0; gtk_paned_set_position(GTK_PANED(GLOBALS->panedwindow), GLOBALS->max_signal_name_pixel_width+30); } else { gtk_widget_set_usize(GTK_WIDGET(GLOBALS->signalwindow), os+30, -1); } } } else if((GLOBALS->do_resize_signals)&&(GLOBALS->signalwindow)) { int oldusize; int rs; if(GLOBALS->initial_signal_window_width > GLOBALS->max_signal_name_pixel_width) { rs=GLOBALS->initial_signal_window_width; } else { rs=GLOBALS->max_signal_name_pixel_width; } oldusize=GLOBALS->signalwindow->allocation.width; if((oldusize!=rs)||(dirty_kick)) { /* keep signalwindow from expanding arbitrarily large */ #ifdef WAVE_USE_GTK2 int wx, wy; get_window_size(&wx, &wy); if((3*rs) < (2*wx)) /* 2/3 width max */ #else if((3*rs) < (2*(GLOBALS->wavewidth + GLOBALS->signalwindow->allocation.width))) #endif { int os; os=rs; os=(os<48)?48:os; gtk_widget_set_usize(GTK_WIDGET(GLOBALS->signalwindow), os+30, -1); } else { int os; os=48; if(GLOBALS->initial_signal_window_width > os) { os = GLOBALS->initial_signal_window_width; } gtk_widget_set_usize(GTK_WIDGET(GLOBALS->signalwindow), os+30, -1); } } } } } /***************************************************************************/ void UpdateSigValue(Trptr t) { bvptr bv = NULL; Trptr tscan = NULL; if(!t) return; if((t->asciivalue)&&(t->asciitime==GLOBALS->tims.marker))return; if(t->flags & (TR_BLANK|TR_ANALOG_BLANK_STRETCH)) /* seek to real xact trace if present... */ { int bcnt = 0; tscan = t; while((tscan) && (tscan = GivePrevTrace(tscan))) { if(!(tscan->flags & (TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { if(tscan->flags & TR_TTRANSLATED) { break; /* found it */ } else { tscan = NULL; } } else { bcnt++; /* bcnt is number of blank traces */ } } if((tscan)&&(tscan->vector)) { bv = tscan->n.vec; do { bv = bv->transaction_chain; /* correlate to blank trace */ } while(bv && (bcnt--)); if(bv) { /* nothing, we just want to set bv */ } } } if((t->name || bv)&&(bv || !(t->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH)))) { GLOBALS->shift_timebase=t->shift; DEBUG(printf("UpdateSigValue: %s\n",t->name)); if((GLOBALS->tims.marker!=-1)&&(!(t->flags&TR_EXCLUDE))) { t->asciitime=GLOBALS->tims.marker; if(t->asciivalue) free_2(t->asciivalue); if(bv || t->vector) { char *str, *str2; vptr v; Trptr ts; TraceEnt t_temp; if(bv) { ts = &t_temp; memcpy(ts, tscan, sizeof(TraceEnt)); ts->vector = 1; ts->n.vec = bv; } else { ts = t; bv = t->n.vec; } v=bsearch_vector(bv,GLOBALS->tims.marker - ts->shift); str=convert_ascii(ts,v); if(str) { str2=(char *)malloc_2(strlen(str)+2); *str2='='; strcpy(str2+1,str); free_2(str); t->asciivalue=str2; } else { t->asciivalue=NULL; } } else { char *str; hptr h_ptr; if((h_ptr=bsearch_node(t->n.nd,GLOBALS->tims.marker - t->shift))) { if(!t->n.nd->extvals) { unsigned char h_val = h_ptr->v.h_val; if(t->n.nd->vartype == ND_VCD_EVENT) { h_val = (h_ptr->time >= GLOBALS->tims.first) && ((GLOBALS->tims.marker-GLOBALS->shift_timebase) == h_ptr->time) ? AN_1 : AN_0; /* generate impulse */ } str=(char *)calloc_2(1,3*sizeof(char)); str[0]='='; if(t->flags&TR_INVERT) { str[1]=AN_STR_INV[h_val]; } else { str[1]=AN_STR[h_val]; } t->asciivalue=str; } else { char *str2; if(h_ptr->flags&HIST_REAL) { if(!(h_ptr->flags&HIST_STRING)) { #ifdef WAVE_HAS_H_DOUBLE str=convert_ascii_real(t, &h_ptr->v.h_double); #else str=convert_ascii_real(t, (double *)h_ptr->v.h_vector); #endif } else { str=convert_ascii_string((char *)h_ptr->v.h_vector); } } else { str=convert_ascii_vec(t,h_ptr->v.h_vector); } if(str) { str2=(char *)malloc_2(strlen(str)+2); *str2='='; strcpy(str2+1,str); free_2(str); t->asciivalue=str2; } else { t->asciivalue=NULL; } } } else { t->asciivalue=NULL; } } } } } /***************************************************************************/ void calczoom(gdouble z0) { gdouble ppf, frame; ppf=((gdouble)(GLOBALS->pixelsperframe=200)); frame=pow(GLOBALS->zoombase,-z0); if(frame>((gdouble)MAX_HISTENT_TIME/(gdouble)4.0)) { GLOBALS->nsperframe=((gdouble)MAX_HISTENT_TIME/(gdouble)4.0); } else if(frame<(gdouble)1.0) { GLOBALS->nsperframe=1.0; } else { GLOBALS->nsperframe=frame; } GLOBALS->hashstep=10.0; if(GLOBALS->zoom_pow10_snap) if(GLOBALS->nsperframe>10.0) { TimeType nsperframe2; gdouble p=10.0; gdouble scale; int l; l=(int)((log(GLOBALS->nsperframe)/log(p))+0.5); /* nearest power of 10 */ nsperframe2=pow(p, (gdouble)l); scale = (gdouble)nsperframe2 / (gdouble)GLOBALS->nsperframe; ppf *= scale; GLOBALS->pixelsperframe = ppf; GLOBALS->nsperframe = nsperframe2; GLOBALS->hashstep = ppf / 10.0; } GLOBALS->nspx=GLOBALS->nsperframe/ppf; GLOBALS->pxns=ppf/GLOBALS->nsperframe; time_trunc_set(); /* map nspx to rounding value */ DEBUG(printf("Zoom: %e Pixelsperframe: %d, nsperframe: %e\n",z0, (int)GLOBALS->pixelsperframe,(float)GLOBALS->nsperframe)); } static void renderhash(int x, TimeType tim) { TimeType rborder; int fhminus2; int rhs; gdouble dx; gdouble hashoffset; int iter = 0; int s_ctx_iter; int timearray_encountered = (GLOBALS->ruler_step != 0); fhminus2=GLOBALS->fontheight-2; WAVE_STRACE_ITERATOR(s_ctx_iter) { GLOBALS->strace_ctx = &GLOBALS->strace_windows[GLOBALS->strace_current_window = s_ctx_iter]; if(GLOBALS->strace_ctx->timearray) { timearray_encountered = 1; break; } } gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_grid_wavewindow_c_1,x, 0,x, ((!timearray_encountered)&&(GLOBALS->display_grid)&&(GLOBALS->enable_vert_grid))?GLOBALS->waveheight:fhminus2); if(tim==GLOBALS->tims.last) return; rborder=(GLOBALS->tims.last-GLOBALS->tims.start)*GLOBALS->pxns; DEBUG(printf("Rborder: %lld, Wavewidth: %d\n", rborder, GLOBALS->wavewidth)); if(rborder>GLOBALS->wavewidth) rborder=GLOBALS->wavewidth; if((rhs=x+GLOBALS->pixelsperframe)>rborder) rhs=rborder; gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_grid_wavewindow_c_1,x, GLOBALS->wavecrosspiece,rhs, GLOBALS->wavecrosspiece); dx = x + (hashoffset=GLOBALS->hashstep); x = dx; while((hashoffsetpixelsperframe)&&(x<=rhs)&&(iter<9)) { gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_grid_wavewindow_c_1,x, GLOBALS->wavecrosspiece,x, fhminus2); hashoffset+=GLOBALS->hashstep; dx=dx+GLOBALS->hashstep; if((GLOBALS->pixelsperframe!=200)||(GLOBALS->hashstep!=10.0)) iter++; /* fix any roundoff errors */ x = dx; } } static void rendertimes(void) { int lastx = -1000; /* arbitrary */ int x, lenhalf; TimeType tim, rem; char timebuff[32]; char prevover=0; gdouble realx; int s_ctx_iter; int timearray_encountered = 0; renderblackout(); tim=GLOBALS->tims.start; GLOBALS->tims.end=GLOBALS->tims.start+(((gdouble)GLOBALS->wavewidth)*GLOBALS->nspx); wave_gdk_draw_line_flush(GLOBALS->wavepixmap_wavewindow_c_1); /* clear out state */ /***********/ WAVE_STRACE_ITERATOR_FWD(s_ctx_iter) { GdkGC * gc; if(!s_ctx_iter) { gc = GLOBALS->gc.gc_grid_wavewindow_c_1; } else { gc = GLOBALS->gc.gc_grid2_wavewindow_c_1; gdk_gc_set_line_attributes(gc, 1, GDK_LINE_ON_OFF_DASH, GDK_CAP_BUTT, GDK_JOIN_BEVEL); } GLOBALS->strace_ctx = &GLOBALS->strace_windows[GLOBALS->strace_current_window = s_ctx_iter]; if(GLOBALS->strace_ctx->timearray) { int pos, pos2; TimeType *t, tm; int y=GLOBALS->fontheight+2; int oldx=-1; timearray_encountered = 1; pos=bsearch_timechain(GLOBALS->tims.start); top: if((pos>=0)&&(posstrace_ctx->timearray_size)) { t=GLOBALS->strace_ctx->timearray+pos; for(;posstrace_ctx->timearray_size;t++, pos++) { tm=*t; if(tm>=GLOBALS->tims.start) { if(tm<=GLOBALS->tims.end) { x=(tm-GLOBALS->tims.start)*GLOBALS->pxns; if(oldx==x) { pos2=bsearch_timechain(GLOBALS->tims.start+(((gdouble)(x+1))*GLOBALS->nspx)); if(pos2>pos) { pos=pos2; goto top; } else continue; } oldx=x; gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gc, x, y, x, GLOBALS->waveheight); } else { break; } } } } } wave_gdk_draw_line_flush(GLOBALS->wavepixmap_wavewindow_c_1); /* clear out state */ if(s_ctx_iter) { gdk_gc_set_line_attributes(gc, 1, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_BEVEL); } } GLOBALS->strace_ctx = &GLOBALS->strace_windows[GLOBALS->strace_current_window = 0]; /***********/ if(GLOBALS->ruler_step && !timearray_encountered) { TimeType rhs = (GLOBALS->tims.end > GLOBALS->tims.last) ? GLOBALS->tims.last : GLOBALS->tims.end; TimeType low_x = (GLOBALS->tims.start - GLOBALS->ruler_origin) / GLOBALS->ruler_step; TimeType high_x = (rhs - GLOBALS->ruler_origin) / GLOBALS->ruler_step; TimeType iter_x, tm; int y=GLOBALS->fontheight+2; int oldx=-1; for(iter_x = low_x; iter_x <= high_x; iter_x++) { tm = GLOBALS->ruler_step * iter_x + GLOBALS->ruler_origin; x=(tm-GLOBALS->tims.start)*GLOBALS->pxns; if(oldx==x) { gdouble xd,offset,pixstep; TimeType newcurr; xd=x+1; /* for pix time calc */ pixstep=((gdouble)GLOBALS->nsperframe)/((gdouble)GLOBALS->pixelsperframe); newcurr=(TimeType)(offset=((gdouble)GLOBALS->tims.start)+(xd*pixstep)); if(offset-newcurr>0.5) /* round to nearest integer ns */ { newcurr++; } low_x = (newcurr - GLOBALS->ruler_origin) / GLOBALS->ruler_step; if(low_x <= iter_x) low_x = (iter_x+1); iter_x = low_x; tm = GLOBALS->ruler_step * iter_x + GLOBALS->ruler_origin; x=(tm-GLOBALS->tims.start)*GLOBALS->pxns; } if(x>=GLOBALS->wavewidth) break; oldx=x; gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_grid_wavewindow_c_1, x, y, x, GLOBALS->waveheight); } } wave_gdk_draw_line_flush(GLOBALS->wavepixmap_wavewindow_c_1); /* clear out state */ /***********/ DEBUG(printf("Ruler Start time: "TTFormat", Finish time: "TTFormat"\n",GLOBALS->tims.start, GLOBALS->tims.end)); x=0; realx=0; if(tim) { rem=tim%((TimeType)GLOBALS->nsperframe); if(rem) { tim=tim-GLOBALS->nsperframe-rem; x=-GLOBALS->pixelsperframe-((rem*GLOBALS->pixelsperframe)/GLOBALS->nsperframe); realx=-GLOBALS->pixelsperframe-((rem*GLOBALS->pixelsperframe)/GLOBALS->nsperframe); } } for(;;) { renderhash(realx, tim); if(tim + GLOBALS->global_time_offset) { if(tim != GLOBALS->min_time) { reformat_time(timebuff, time_trunc(tim) + GLOBALS->global_time_offset, GLOBALS->time_dimension); } else { timebuff[0] = 0; } } else { strcpy(timebuff, "0"); } lenhalf=font_engine_string_measure(GLOBALS->wavefont, timebuff) >> 1; if((x-lenhalf >= lastx) || (GLOBALS->pixelsperframe >= 200)) { font_engine_draw_string(GLOBALS->wavepixmap_wavewindow_c_1,GLOBALS->wavefont,GLOBALS->gc.gc_time_wavewindow_c_1,x-lenhalf, GLOBALS->wavefont->ascent-1,timebuff); lastx = x+lenhalf; } tim+=GLOBALS->nsperframe; x+=GLOBALS->pixelsperframe; realx+=GLOBALS->pixelsperframe; if((prevover)||(tim>GLOBALS->tims.last)) break; if(x>=GLOBALS->wavewidth) prevover=1; } } /***************************************************************************/ static void rendertimebar(void) { gdk_draw_rectangle(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_timeb_wavewindow_c_1, TRUE,0, -1, GLOBALS->wavewidth, GLOBALS->fontheight); rendertimes(); rendertraces(); update_dual(); } static void gc_save(Trptr t, struct wave_gcmaster_t *gc_sav) { if((!GLOBALS->black_and_white) && (t->t_color)) { int color = t->t_color; color--; memcpy(gc_sav, &GLOBALS->gc, sizeof(struct wave_gcmaster_t)); if(color < WAVE_NUM_RAINBOW) { set_alternate_gcs(GLOBALS->gc_rainbow[2*color], GLOBALS->gc_rainbow[2*color+1]); } } } static void gc_restore(Trptr t, struct wave_gcmaster_t *gc_sav) { if((!GLOBALS->black_and_white) && (t->t_color)) { memcpy(&GLOBALS->gc, gc_sav, sizeof(struct wave_gcmaster_t)); } } static void rendertraces(void) { struct wave_gcmaster_t gc_sav; if(!GLOBALS->topmost_trace) { GLOBALS->topmost_trace=GLOBALS->traces.first; } if(GLOBALS->topmost_trace) { Trptr t = GLOBALS->topmost_trace; Trptr tback = t; hptr h; vptr v; int i = 0, num_traces_displayable; int iback = 0; num_traces_displayable=GLOBALS->wavearea->allocation.height/(GLOBALS->fontheight); num_traces_displayable--; /* for the time trace that is always there */ /* ensure that transaction traces are visible even if the topmost traces are blanks */ while(tback) { if(tback->flags&(TR_BLANK|TR_ANALOG_BLANK_STRETCH)) { tback = GivePrevTrace(tback); iback--; } else if(tback->flags & TR_TTRANSLATED) { if(tback != t) { t = tback; i = iback; } break; } else { break; } } for(;((iflags&(TR_EXCLUDE|TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { GLOBALS->shift_timebase=t->shift; if(!t->vector) { h=bsearch_node(t->n.nd, GLOBALS->tims.start - t->shift); DEBUG(printf("Start time: "TTFormat", Histent time: "TTFormat"\n", GLOBALS->tims.start,(h->time+GLOBALS->shift_timebase))); if(!t->n.nd->extvals) { if(i>=0) { gc_save(t, &gc_sav); draw_hptr_trace(t,h,i,1,0); gc_restore(t, &gc_sav); } } else { if(i>=0) { gc_save(t, &gc_sav); draw_hptr_trace_vector(t,h,i); gc_restore(t, &gc_sav); } } } else { Trptr t_orig, tn; bvptr bv = t->n.vec; v=bsearch_vector(bv, GLOBALS->tims.start - t->shift); DEBUG(printf("Vector Trace: %s, %s\n", t->name, bv->bvname)); DEBUG(printf("Start time: "TTFormat", Vectorent time: "TTFormat"\n", GLOBALS->tims.start,(v->time+GLOBALS->shift_timebase))); if(i>=0) { gc_save(t, &gc_sav); draw_vptr_trace(t,v,i); gc_restore(t, &gc_sav); } if((bv->transaction_chain) && (t->flags & TR_TTRANSLATED)) { t_orig = t; for(;;) { tn = GiveNextTrace(t); bv = bv->transaction_chain; if(bv && tn && (tn->flags & (TR_BLANK|TR_ANALOG_BLANK_STRETCH))) { i++; if(itims.start - t->shift); if(i>=0) { gc_save(t, &gc_sav); draw_vptr_trace(t_orig,v,i); gc_restore(t, &gc_sav); } t = tn; continue; } } break; } } } } else { int kill_dodraw_grid = t->flags & TR_ANALOG_BLANK_STRETCH; if(kill_dodraw_grid) { Trptr tn = GiveNextTrace(t); if(!tn) { kill_dodraw_grid = 0; } else if(!(tn->flags & TR_ANALOG_BLANK_STRETCH)) { kill_dodraw_grid = 0; } } if(i>=0) { gc_save(t, &gc_sav); draw_hptr_trace(NULL,NULL,i,0,kill_dodraw_grid); gc_restore(t, &gc_sav); } } t=GiveNextTrace(t); /* bot: 1; */ } } draw_named_markers(); draw_marker_partitions(); if(GLOBALS->traces.dirty) { char dbuf[32]; sprintf(dbuf, "%d", GLOBALS->traces.total); GLOBALS->traces.dirty = 0; gtkwavetcl_setvar(WAVE_TCLCB_TRACES_UPDATED, dbuf, WAVE_TCLCB_TRACES_UPDATED_FLAGS); } } /* * draw single traces and use this for rendering the grid lines * for "excluded" traces */ static void draw_hptr_trace(Trptr t, hptr h, int which, int dodraw, int kill_grid) { TimeType _x0, _x1, newtime; int _y0, _y1, yu, liney, ytext; TimeType tim, h2tim; hptr h2, h3; char hval, h2val, invert; GdkGC *c; GdkGC *gcx, *gcxf; char identifier_str[2]; int is_event = t && t->n.nd && (t->n.nd->vartype == ND_VCD_EVENT); GLOBALS->tims.start-=GLOBALS->shift_timebase; GLOBALS->tims.end-=GLOBALS->shift_timebase; liney=((which+2)*GLOBALS->fontheight)-2; if(((t)&&(t->flags&TR_INVERT))&&(!is_event)) { _y0=((which+1)*GLOBALS->fontheight)+2; _y1=liney-2; invert=1; } else { _y1=((which+1)*GLOBALS->fontheight)+2; _y0=liney-2; invert=0; } yu=(_y0+_y1)/2; ytext=yu-(GLOBALS->wavefont->ascent/2)+GLOBALS->wavefont->ascent; if((GLOBALS->display_grid)&&(GLOBALS->enable_horiz_grid)&&(!kill_grid)) { if((GLOBALS->highlight_wavewindow) && (t) && (t->flags & TR_HIGHLIGHT) && (!GLOBALS->black_and_white)) { gdk_draw_rectangle(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_grid_wavewindow_c_1, TRUE,0, liney - GLOBALS->fontheight, GLOBALS->wavewidth, GLOBALS->fontheight); } else { gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_grid_wavewindow_c_1, (GLOBALS->tims.starttims.first)?(GLOBALS->tims.first-GLOBALS->tims.start)*GLOBALS->pxns:0, liney,(GLOBALS->tims.last<=GLOBALS->tims.end)?(GLOBALS->tims.last-GLOBALS->tims.start)*GLOBALS->pxns:GLOBALS->wavewidth-1, liney); } } if((h)&&(GLOBALS->tims.start==h->time)) if (h->v.h_val != AN_Z) { switch(h->v.h_val) { case AN_X: c = GLOBALS->gc.gc_x_wavewindow_c_1; break; case AN_U: c = GLOBALS->gc.gc_u_wavewindow_c_1; break; case AN_W: c = GLOBALS->gc.gc_w_wavewindow_c_1; break; case AN_DASH: c = GLOBALS->gc.gc_dash_wavewindow_c_1; break; default: c = (h->v.h_val == AN_X) ? GLOBALS->gc.gc_x_wavewindow_c_1: GLOBALS->gc.gc_trans_wavewindow_c_1; } gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, c, 0, _y0, 0, _y1); } if(dodraw && t) for(;;) { if(!h) break; tim=(h->time); if((tim>GLOBALS->tims.end)||(tim>GLOBALS->tims.last)) break; _x0=(tim - GLOBALS->tims.start) * GLOBALS->pxns; if(_x0<-1) { _x0=-1; } else if(_x0>GLOBALS->wavewidth) { break; } h2=h->next; if(!h2) break; h2tim=tim=(h2->time); if(tim>GLOBALS->tims.last) tim=GLOBALS->tims.last; else if(tim>GLOBALS->tims.end+1) tim=GLOBALS->tims.end+1; _x1=(tim - GLOBALS->tims.start) * GLOBALS->pxns; if(_x1<-1) { _x1=-1; } else if(_x1>GLOBALS->wavewidth) { _x1=GLOBALS->wavewidth; } if(_x0!=_x1) { if(is_event) { if(h->time >= GLOBALS->tims.first) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_w_wavewindow_c_1, _x0, _y0, _x0, _y1); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_w_wavewindow_c_1, _x0, _y1, _x0+2, _y1+2); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_w_wavewindow_c_1, _x0, _y1, _x0-2, _y1+2); } h=h->next; continue; } hval=h->v.h_val; h2val=h2->v.h_val; switch(h2val) { case AN_X: c = GLOBALS->gc.gc_x_wavewindow_c_1; break; case AN_U: c = GLOBALS->gc.gc_u_wavewindow_c_1; break; case AN_W: c = GLOBALS->gc.gc_w_wavewindow_c_1; break; case AN_DASH: c = GLOBALS->gc.gc_dash_wavewindow_c_1; break; default: c = (hval == AN_X) ? GLOBALS->gc.gc_x_wavewindow_c_1: GLOBALS->gc.gc_trans_wavewindow_c_1; } switch(hval) { case AN_0: /* 0 */ case AN_L: /* L */ if(GLOBALS->fill_waveform && invert) { switch(hval) { case AN_0: gcxf = GLOBALS->gc.gc_1fill_wavewindow_c_1; break; case AN_L: gcxf = GLOBALS->gc.gc_highfill_wavewindow_c_1; break; } gdk_draw_rectangle(GLOBALS->wavepixmap_wavewindow_c_1, gcxf, TRUE,_x0+1, _y0, _x1-_x0, _y1-_y0+1); } wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, (hval==AN_0) ? GLOBALS->gc.gc_0_wavewindow_c_1 : GLOBALS->gc.gc_low_wavewindow_c_1,_x0, _y0,_x1, _y0); if(h2tim<=GLOBALS->tims.end) switch(h2val) { case AN_0: case AN_L: break; case AN_Z: wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, c, _x1, _y0, _x1, yu); break; default: wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, c, _x1, _y0, _x1, _y1); break; } break; case AN_X: /* X */ case AN_W: /* W */ case AN_U: /* U */ case AN_DASH: /* - */ identifier_str[1] = 0; switch(hval) { case AN_X: c = gcx = GLOBALS->gc.gc_x_wavewindow_c_1; gcxf = GLOBALS->gc.gc_xfill_wavewindow_c_1; identifier_str[0] = 0; break; case AN_W: c = gcx = GLOBALS->gc.gc_w_wavewindow_c_1; gcxf = GLOBALS->gc.gc_wfill_wavewindow_c_1; identifier_str[0] = 'W'; break; case AN_U: c = gcx = GLOBALS->gc.gc_u_wavewindow_c_1; gcxf = GLOBALS->gc.gc_ufill_wavewindow_c_1; identifier_str[0] = 'U'; break; default: c = gcx = GLOBALS->gc.gc_dash_wavewindow_c_1; gcxf = GLOBALS->gc.gc_dashfill_wavewindow_c_1; identifier_str[0] = '-'; break; } if(invert) { gdk_draw_rectangle(GLOBALS->wavepixmap_wavewindow_c_1, gcx, TRUE,_x0+1, _y0, _x1-_x0, _y1-_y0+1); } else { gdk_draw_rectangle(GLOBALS->wavepixmap_wavewindow_c_1, gcxf, TRUE,_x0+1, _y1, _x1-_x0, _y0-_y1+1); } if(identifier_str[0]) { int _x0_new = (_x0>=0) ? _x0 : 0; int width; if((width=_x1-_x0_new)>GLOBALS->vector_padding) { if((_x1>=GLOBALS->wavewidth)||(font_engine_string_measure(GLOBALS->wavefont, identifier_str)+GLOBALS->vector_padding<=width)) { font_engine_draw_string(GLOBALS->wavepixmap_wavewindow_c_1,GLOBALS->wavefont, GLOBALS->gc.gc_value_wavewindow_c_1, _x0+2,ytext,identifier_str); } } } wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gcx,_x0, _y0,_x1, _y0); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gcx,_x0, _y1,_x1, _y1); if(h2tim<=GLOBALS->tims.end) wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, c, _x1, _y0, _x1, _y1); break; case AN_Z: /* Z */ wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_mid_wavewindow_c_1,_x0, yu,_x1, yu); if(h2tim<=GLOBALS->tims.end) switch(h2val) { case AN_0: case AN_L: wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, c, _x1, yu, _x1, _y0); break; case AN_1: case AN_H: wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, c, _x1, yu, _x1, _y1); break; default: wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, c, _x1, _y0, _x1, _y1); break; } break; case AN_1: /* 1 */ case AN_H: /* 1 */ if(GLOBALS->fill_waveform && !invert) { switch(hval) { case AN_1: gcxf = GLOBALS->gc.gc_1fill_wavewindow_c_1; break; case AN_H: gcxf = GLOBALS->gc.gc_highfill_wavewindow_c_1; break; } gdk_draw_rectangle(GLOBALS->wavepixmap_wavewindow_c_1, gcxf, TRUE,_x0+1, _y1, _x1-_x0, _y0-_y1+1); } wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, (hval==AN_1) ? GLOBALS->gc.gc_1_wavewindow_c_1 : GLOBALS->gc.gc_high_wavewindow_c_1,_x0, _y1,_x1, _y1); if(h2tim<=GLOBALS->tims.end) switch(h2val) { case AN_1: case AN_H: break; case AN_0: case AN_L: wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, c, _x1, _y1, _x1, _y0); break; case AN_Z: wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, c, _x1, _y1, _x1, yu); break; default: wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, c, _x1, _y0, _x1, _y1); break; } break; default: break; } } else { if(!is_event) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_trans_wavewindow_c_1, _x1, _y0, _x1, _y1); } else { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_w_wavewindow_c_1, _x1, _y0, _x1, _y1); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_w_wavewindow_c_1, _x0, _y1, _x0+2, _y1+2); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_w_wavewindow_c_1, _x0, _y1, _x0-2, _y1+2); } newtime=(((gdouble)(_x1+WAVE_OPT_SKIP))*GLOBALS->nspx)+GLOBALS->tims.start/*+GLOBALS->shift_timebase*/; /* skip to next pixel */ h3=bsearch_node(t->n.nd,newtime); if(h3->time>h->time) { h=h3; continue; } } h=h->next; } wave_gdk_draw_line_flush(GLOBALS->wavepixmap_wavewindow_c_1); /* clear out state */ GLOBALS->tims.start+=GLOBALS->shift_timebase; GLOBALS->tims.end+=GLOBALS->shift_timebase; } /********************************************************************************************************/ static void draw_hptr_trace_vector_analog(Trptr t, hptr h, int which, int num_extension) { TimeType _x0, _x1, newtime; int _y0, _y1, yu, liney, yt0, yt1; TimeType tim, h2tim; hptr h2, h3; int endcnt = 0; int type; /* int lasttype=-1; */ /* scan-build */ GdkGC *c, *ci; GdkGC *cnan = GLOBALS->gc.gc_u_wavewindow_c_1; GdkGC *cinf = GLOBALS->gc.gc_w_wavewindow_c_1; GdkGC *cfixed; double mynan = strtod("NaN", NULL); double tmin = mynan, tmax = mynan, tv, tv2; gint rmargin; int is_nan = 0, is_nan2 = 0, is_inf = 0, is_inf2 = 0; int any_infs = 0, any_infp = 0, any_infm = 0; int skipcnt = 0; ci = GLOBALS->gc.gc_baseline_wavewindow_c_1; liney=((which+2+num_extension)*GLOBALS->fontheight)-2; _y1=((which+1)*GLOBALS->fontheight)+2; _y0=liney-2; yu=(_y0+_y1)/2; if(t->flags & TR_ANALOG_FULLSCALE) /* otherwise use dynamic */ { if((!t->minmax_valid)||(t->d_num_ext != num_extension)) { h3 = &t->n.nd->head; for(;;) { if(!h3) break; if((h3->time >= GLOBALS->tims.first) && (h3->time <= GLOBALS->tims.last)) { tv = mynan; if(h3->flags&HIST_REAL) { #ifdef WAVE_HAS_H_DOUBLE if(!(h3->flags&HIST_STRING)) tv = h3->v.h_double; #else if(!(h3->flags&HIST_STRING) && h3->v.h_vector) tv = *(double *)h3->v.h_vector; #endif } else { if(h3->time <= GLOBALS->tims.last) tv=convert_real_vec(t,h3->v.h_vector); } if (!isnan(tv) && !isinf(tv)) { if (isnan(tmin) || tv < tmin) tmin = tv; if (isnan(tmax) || tv > tmax) tmax = tv; } else if(isinf(tv)) { any_infs = 1; if(tv > 0) { any_infp = 1; } else { any_infm = 1; } } } h3 = h3->next; } if (isnan(tmin) || isnan(tmax)) { tmin = tmax = 0; } if(any_infs) { double tdelta = (tmax - tmin) * WAVE_INF_SCALING; if(any_infp) tmax = tmax + tdelta; if(any_infm) tmin = tmin - tdelta; } if ((tmax - tmin) < 1e-20) { tmax = 1; tmin -= 0.5 * (_y1 - _y0); } else { tmax = (_y1 - _y0) / (tmax - tmin); } t->minmax_valid = 1; t->d_minval = tmin; t->d_maxval = tmax; t->d_num_ext = num_extension; } else { tmin = t->d_minval; tmax = t->d_maxval; } } else { h3 = h; for(;;) { if(!h3) break; tim=(h3->time); if(tim>GLOBALS->tims.end) { endcnt++; if(endcnt==2) break; } if(tim>GLOBALS->tims.last) break; _x0=(tim - GLOBALS->tims.start) * GLOBALS->pxns; if((_x0>GLOBALS->wavewidth)&&(endcnt==2)) { break; } tv = mynan; if(h3->flags&HIST_REAL) { #ifdef WAVE_HAS_H_DOUBLE if(!(h3->flags&HIST_STRING)) tv = h3->v.h_double; #else if(!(h3->flags&HIST_STRING) && h3->v.h_vector) tv = *(double *)h3->v.h_vector; #endif } else { if(h3->time <= GLOBALS->tims.last) tv=convert_real_vec(t,h3->v.h_vector); } if (!isnan(tv) && !isinf(tv)) { if (isnan(tmin) || tv < tmin) tmin = tv; if (isnan(tmax) || tv > tmax) tmax = tv; } else if(isinf(tv)) { any_infs = 1; if(tv > 0) { any_infp = 1; } else { any_infm = 1; } } h3 = h3->next; } if (isnan(tmin) || isnan(tmax)) tmin = tmax = 0; if(any_infs) { double tdelta = (tmax - tmin) * WAVE_INF_SCALING; if(any_infp) tmax = tmax + tdelta; if(any_infm) tmin = tmin - tdelta; } if ((tmax - tmin) < 1e-20) { tmax = 1; tmin -= 0.5 * (_y1 - _y0); } else { tmax = (_y1 - _y0) / (tmax - tmin); } } if(GLOBALS->tims.last - GLOBALS->tims.start < GLOBALS->wavewidth) { rmargin=(GLOBALS->tims.last - GLOBALS->tims.start) * GLOBALS->pxns; } else { rmargin = GLOBALS->wavewidth; } /* now do the actual drawing */ h3 = NULL; for(;;) { if(!h) break; tim=(h->time); if((tim>GLOBALS->tims.end)||(tim>GLOBALS->tims.last)) break; _x0=(tim - GLOBALS->tims.start) * GLOBALS->pxns; /* if(_x0<-1) { _x0=-1; } else if(_x0>GLOBALS->wavewidth) { break; } */ h2=h->next; if(!h2) break; h2tim=tim=(h2->time); if(tim>GLOBALS->tims.last) tim=GLOBALS->tims.last; /* else if(tim>GLOBALS->tims.end+1) tim=GLOBALS->tims.end+1; */ _x1=(tim - GLOBALS->tims.start) * GLOBALS->pxns; /* if(_x1<-1) { _x1=-1; } else if(_x1>GLOBALS->wavewidth) { _x1=GLOBALS->wavewidth; } */ /* draw trans */ type = (!(h->flags&(HIST_REAL|HIST_STRING))) ? vtype(t,h->v.h_vector) : AN_0; tv = tv2 = mynan; if(h->flags&HIST_REAL) { #ifdef WAVE_HAS_H_DOUBLE if(!(h->flags&HIST_STRING)) tv = h->v.h_double; #else if(!(h->flags&HIST_STRING) && h->v.h_vector) tv = *(double *)h->v.h_vector; #endif } else { if(h->time <= GLOBALS->tims.last) tv=convert_real_vec(t,h->v.h_vector); } if(h2->flags&HIST_REAL) { #ifdef WAVE_HAS_H_DOUBLE if(!(h2->flags&HIST_STRING)) tv2 = h2->v.h_double; #else if(!(h2->flags&HIST_STRING) && h2->v.h_vector) tv2 = *(double *)h2->v.h_vector; #endif } else { if(h2->time <= GLOBALS->tims.last) tv2=convert_real_vec(t,h2->v.h_vector); } if((is_inf = isinf(tv))) { if(tv < 0) { yt0 = _y0; } else { yt0 = _y1; } } else if((is_nan = isnan(tv))) { yt0 = yu; } else { yt0 = _y0 + (tv - tmin) * tmax; } if((is_inf2 = isinf(tv2))) { if(tv2 < 0) { yt1 = _y0; } else { yt1 = _y1; } } else if((is_nan2 = isnan(tv2))) { yt1 = yu; } else { yt1 = _y0 + (tv2 - tmin) * tmax; } if((_x0!=_x1)||(skipcnt < GLOBALS->analog_redraw_skip_count)) /* lower number = better performance */ { if(_x0==_x1) { skipcnt++; } else { skipcnt = 0; } if(type == AN_0) { c = GLOBALS->gc.gc_vbox_wavewindow_c_1; } else { c = GLOBALS->gc.gc_x_wavewindow_c_1; } if(h->next) { if(h->next->time > GLOBALS->max_time) { yt1 = yt0; } } cfixed = is_inf ? cinf : c; if((is_nan2) && (h2tim > GLOBALS->max_time)) is_nan2 = 0; /* clamp to top/bottom because of integer rounding errors */ if(yt0 < _y1) yt0 = _y1; else if(yt0 > _y0) yt0 = _y0; if(yt1 < _y1) yt1 = _y1; else if(yt1 > _y0) yt1 = _y0; /* clipping... */ { int coords[4]; int rect[4]; if(_x0 < INT_MIN) { coords[0] = INT_MIN; } else if(_x0 > INT_MAX) { coords[0] = INT_MAX; } else { coords[0] = _x0; } if(_x1 < INT_MIN) { coords[2] = INT_MIN; } else if(_x1 > INT_MAX) { coords[2] = INT_MAX; } else { coords[2] = _x1; } coords[1] = yt0; coords[3] = yt1; rect[0] = -10; rect[1] = _y1; rect[2] = GLOBALS->wavewidth + 10; rect[3] = _y0; if((t->flags & (TR_ANALOG_INTERPOLATED|TR_ANALOG_STEP)) != TR_ANALOG_STEP) { wave_lineclip(coords, rect); } else { if(coords[0] < rect[0]) coords[0] = rect[0]; if(coords[2] < rect[0]) coords[2] = rect[0]; if(coords[0] > rect[2]) coords[0] = rect[2]; if(coords[2] > rect[2]) coords[2] = rect[2]; if(coords[1] < rect[1]) coords[1] = rect[1]; if(coords[3] < rect[1]) coords[3] = rect[1]; if(coords[1] > rect[3]) coords[1] = rect[3]; if(coords[3] > rect[3]) coords[3] = rect[3]; } _x0 = coords[0]; yt0 = coords[1]; _x1 = coords[2]; yt1 = coords[3]; } /* ...clipping */ if(is_nan || is_nan2) { if(is_nan) { gdk_draw_rectangle(GLOBALS->wavepixmap_wavewindow_c_1, cnan, TRUE, _x0, _y1, _x1-_x0, _y0-_y1); if((t->flags & (TR_ANALOG_INTERPOLATED|TR_ANALOG_STEP)) == (TR_ANALOG_INTERPOLATED|TR_ANALOG_STEP)) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x1-1, yt1,_x1+1, yt1); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x1, yt1-1,_x1, yt1+1); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x0-1, _y0,_x0+1, _y0); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x0, _y0-1,_x0, _y0+1); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x0-1, _y1,_x0+1, _y1); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x0, _y1-1,_x0, _y1+1); } } if(is_nan2) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, cfixed,_x0, yt0, _x1, yt0); if((t->flags & (TR_ANALOG_INTERPOLATED|TR_ANALOG_STEP)) == (TR_ANALOG_INTERPOLATED|TR_ANALOG_STEP)) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, cnan,_x1, yt1,_x1, yt0); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x1-1, _y0,_x1+1, _y0); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x1, _y0-1,_x1, _y0+1); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x1-1, _y1,_x1+1, _y1); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x1, _y1-1,_x1, _y1+1); } } } else if((t->flags & TR_ANALOG_INTERPOLATED) && !is_inf && !is_inf2) { if(t->flags & TR_ANALOG_STEP) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x0-1, yt0,_x0+1, yt0); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x0, yt0-1,_x0, yt0+1); } if(rmargin != GLOBALS->wavewidth) /* the window is clipped in postscript */ { if((yt0==yt1)&&((_x0 > _x1)||(_x0 < 0))) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, cfixed,0, yt0,_x1,yt1); } else { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, cfixed,_x0, yt0,_x1,yt1); } } else { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, cfixed,_x0, yt0,_x1,yt1); } } else /* if(t->flags & TR_ANALOG_STEP) */ { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, cfixed,_x0, yt0,_x1, yt0); if(is_inf2) cfixed = cinf; wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, cfixed,_x1, yt0,_x1, yt1); if ((t->flags & (TR_ANALOG_INTERPOLATED|TR_ANALOG_STEP)) == (TR_ANALOG_INTERPOLATED|TR_ANALOG_STEP)) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x0-1, yt0,_x0+1, yt0); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x0, yt0-1,_x0, yt0+1); } } } else { newtime=(((gdouble)(_x1+WAVE_OPT_SKIP))*GLOBALS->nspx)+GLOBALS->tims.start/*+GLOBALS->shift_timebase*/; /* skip to next pixel */ h3=bsearch_node(t->n.nd,newtime); if(h3->time>h->time) { h=h3; /* lasttype=type; */ /* scan-build */ continue; } } h=h->next; /* lasttype=type; */ /* scan-build */ } wave_gdk_draw_line_flush(GLOBALS->wavepixmap_wavewindow_c_1); } /* * draw hptr vectors (integer+real) */ static void draw_hptr_trace_vector(Trptr t, hptr h, int which) { TimeType _x0, _x1, newtime, width; int _y0, _y1, yu, liney, ytext; TimeType tim /* , h2tim */; /* scan-build */ hptr h2, h3; char *ascii=NULL; int type; int lasttype=-1; GdkGC *c; GLOBALS->tims.start-=GLOBALS->shift_timebase; GLOBALS->tims.end-=GLOBALS->shift_timebase; liney=((which+2)*GLOBALS->fontheight)-2; _y1=((which+1)*GLOBALS->fontheight)+2; _y0=liney-2; yu=(_y0+_y1)/2; ytext=yu-(GLOBALS->wavefont->ascent/2)+GLOBALS->wavefont->ascent; if((GLOBALS->display_grid)&&(GLOBALS->enable_horiz_grid)) { Trptr tn = GiveNextTrace(t); if((t->flags & TR_ANALOGMASK) && (tn) && (tn->flags & TR_ANALOG_BLANK_STRETCH)) { if((GLOBALS->highlight_wavewindow) && (t) && (t->flags & TR_HIGHLIGHT) && (!GLOBALS->black_and_white)) { gdk_draw_rectangle(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_grid_wavewindow_c_1, TRUE,0, liney - GLOBALS->fontheight, GLOBALS->wavewidth, GLOBALS->fontheight); } } else { if((GLOBALS->highlight_wavewindow) && (t) && (t->flags & TR_HIGHLIGHT) && (!GLOBALS->black_and_white)) { gdk_draw_rectangle(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_grid_wavewindow_c_1, TRUE,0, liney - GLOBALS->fontheight, GLOBALS->wavewidth, GLOBALS->fontheight); } else { gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_grid_wavewindow_c_1, (GLOBALS->tims.starttims.first)?(GLOBALS->tims.first-GLOBALS->tims.start)*GLOBALS->pxns:0, liney,(GLOBALS->tims.last<=GLOBALS->tims.end)?(GLOBALS->tims.last-GLOBALS->tims.start)*GLOBALS->pxns:GLOBALS->wavewidth-1, liney); } } } if((t->flags & TR_ANALOGMASK) && (!(h->flags&HIST_STRING) || !(h->flags&HIST_REAL))) { Trptr te = GiveNextTrace(t); int ext = 0; while(te) { if(te->flags & TR_ANALOG_BLANK_STRETCH) { ext++; te = GiveNextTrace(te); } else { break; } } if((ext) && (GLOBALS->highlight_wavewindow) && (t) && (t->flags & TR_HIGHLIGHT) && (!GLOBALS->black_and_white)) { gdk_draw_rectangle(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_grid_wavewindow_c_1, TRUE,0, liney, GLOBALS->wavewidth, GLOBALS->fontheight * ext); } draw_hptr_trace_vector_analog(t, h, which, ext); GLOBALS->tims.start+=GLOBALS->shift_timebase; GLOBALS->tims.end+=GLOBALS->shift_timebase; return; } GLOBALS->color_active_in_filter = 1; for(;;) { if(!h) break; tim=(h->time); if((tim>GLOBALS->tims.end)||(tim>GLOBALS->tims.last)) break; _x0=(tim - GLOBALS->tims.start) * GLOBALS->pxns; if(_x0<-1) { _x0=-1; } else if(_x0>GLOBALS->wavewidth) { break; } h2=h->next; if(!h2) break; /* h2tim= */ tim=(h2->time); /* scan-build */ if(tim>GLOBALS->tims.last) tim=GLOBALS->tims.last; else if(tim>GLOBALS->tims.end+1) tim=GLOBALS->tims.end+1; _x1=(tim - GLOBALS->tims.start) * GLOBALS->pxns; if(_x1<-1) { _x1=-1; } else if(_x1>GLOBALS->wavewidth) { _x1=GLOBALS->wavewidth; } /* draw trans */ if(!(h->flags&(HIST_REAL|HIST_STRING))) { type = vtype(t,h->v.h_vector); } else { /* s\000 ID is special "z" case */ type = AN_0; if(h->flags&HIST_STRING) { if(h->v.h_vector) { if(!h->v.h_vector[0]) { type = AN_Z; } else { if(!strcmp(h->v.h_vector, "UNDEF")) { type = AN_X; } } } else { type = AN_X; } } } /* type = (!(h->flags&(HIST_REAL|HIST_STRING))) ? vtype(t,h->v.h_vector) : AN_0; */ if(_x0>-1) { GdkGC *gltype, *gtype; switch(lasttype) { case AN_X: gltype = GLOBALS->gc.gc_x_wavewindow_c_1; break; case AN_U: gltype = GLOBALS->gc.gc_u_wavewindow_c_1; break; default: gltype = GLOBALS->gc.gc_vtrans_wavewindow_c_1; break; } switch(type) { case AN_X: gtype = GLOBALS->gc.gc_x_wavewindow_c_1; break; case AN_U: gtype = GLOBALS->gc.gc_u_wavewindow_c_1; break; default: gtype = GLOBALS->gc.gc_vtrans_wavewindow_c_1; break; } if(GLOBALS->use_roundcaps) { if (type == AN_Z) { if (lasttype != -1) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gltype,_x0-1, _y0,_x0, yu); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gltype,_x0, yu,_x0-1, _y1); } } else if (lasttype==AN_Z) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gtype,_x0+1, _y0,_x0, yu); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gtype,_x0, yu,_x0+1, _y1); } else { if (lasttype != type) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gltype,_x0-1, _y0,_x0, yu); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gltype,_x0, yu,_x0-1, _y1); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gtype,_x0+1, _y0,_x0, yu); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gtype,_x0, yu,_x0+1, _y1); } else { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gtype,_x0-2, _y0,_x0+2, _y1); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gtype,_x0+2, _y0,_x0-2, _y1); } } } else { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gtype,_x0, _y0,_x0, _y1); } } if(_x0!=_x1) { if (type == AN_Z) { if(GLOBALS->use_roundcaps) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_mid_wavewindow_c_1,_x0+1, yu,_x1-1, yu); } else { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_mid_wavewindow_c_1,_x0, yu,_x1, yu); } } else { if(type == AN_0) { c = GLOBALS->gc.gc_vbox_wavewindow_c_1; } else { c = GLOBALS->gc.gc_x_wavewindow_c_1; } if(GLOBALS->use_roundcaps) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, c,_x0+2, _y0,_x1-2, _y0); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, c,_x0+2, _y1,_x1-2, _y1); } else { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, c,_x0, _y0,_x1, _y0); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, c,_x0, _y1,_x1, _y1); } if(_x0<0) _x0=0; /* fixup left margin */ if((width=_x1-_x0)>GLOBALS->vector_padding) { char *ascii2; if(h->flags&HIST_REAL) { if(!(h->flags&HIST_STRING)) { #ifdef WAVE_HAS_H_DOUBLE ascii=convert_ascii_real(t, &h->v.h_double); #else ascii=convert_ascii_real(t, (double *)h->v.h_vector); #endif } else { ascii=convert_ascii_string((char *)h->v.h_vector); } } else { ascii=convert_ascii_vec(t,h->v.h_vector); } ascii2 = ascii; if(*ascii == '?') { GdkGC *cb; char *srch_for_color = strchr(ascii+1, '?'); if(srch_for_color) { *srch_for_color = 0; cb = get_gc_from_name(ascii+1); if(cb) { ascii2 = srch_for_color + 1; if(GLOBALS->gc.gc_back_wavewindow_c_1 != GLOBALS->gc_white) { if(!GLOBALS->black_and_white) gdk_draw_rectangle(GLOBALS->wavepixmap_wavewindow_c_1, cb, TRUE, _x0+1, _y1+1, width-1, (_y0-1) - (_y1+1) + 1); } GLOBALS->fill_in_smaller_rgb_areas_wavewindow_c_1 = 1; } else { *srch_for_color = '?'; /* replace name as color is a miss */ } } } if((_x1>=GLOBALS->wavewidth)||(font_engine_string_measure(GLOBALS->wavefont, ascii2)+GLOBALS->vector_padding<=width)) { font_engine_draw_string(GLOBALS->wavepixmap_wavewindow_c_1,GLOBALS->wavefont,GLOBALS->gc.gc_value_wavewindow_c_1,_x0+2,ytext,ascii2); } else { char *mod; mod=bsearch_trunc(ascii2,width-GLOBALS->vector_padding); if(mod) { *mod='+'; *(mod+1)=0; font_engine_draw_string(GLOBALS->wavepixmap_wavewindow_c_1,GLOBALS->wavefont,GLOBALS->gc.gc_value_wavewindow_c_1,_x0+2,ytext,ascii2); } } } else if(GLOBALS->fill_in_smaller_rgb_areas_wavewindow_c_1) { /* char *ascii2; */ /* scan-build */ if(h->flags&HIST_REAL) { if(!(h->flags&HIST_STRING)) { #ifdef WAVE_HAS_H_DOUBLE ascii=convert_ascii_real(t, &h->v.h_double); #else ascii=convert_ascii_real(t, (double *)h->v.h_vector); #endif } else { ascii=convert_ascii_string((char *)h->v.h_vector); } } else { ascii=convert_ascii_vec(t,h->v.h_vector); } /* ascii2 = ascii; */ /* scan-build */ if(*ascii == '?') { GdkGC *cb; char *srch_for_color = strchr(ascii+1, '?'); if(srch_for_color) { *srch_for_color = 0; cb = get_gc_from_name(ascii+1); if(cb) { /* ascii2 = srch_for_color + 1; */ /* scan-build */ if(GLOBALS->gc.gc_back_wavewindow_c_1 != GLOBALS->gc_white) { if(!GLOBALS->black_and_white) gdk_draw_rectangle(GLOBALS->wavepixmap_wavewindow_c_1, cb, TRUE, _x0, _y1+1, width, (_y0-1) - (_y1+1) + 1); } } else { *srch_for_color = '?'; /* replace name as color is a miss */ } } } } } } else { newtime=(((gdouble)(_x1+WAVE_OPT_SKIP))*GLOBALS->nspx)+GLOBALS->tims.start/*+GLOBALS->shift_timebase*/; /* skip to next pixel */ h3=bsearch_node(t->n.nd,newtime); if(h3->time>h->time) { h=h3; lasttype=type; continue; } } if(ascii) { free_2(ascii); ascii=NULL; } h=h->next; lasttype=type; } GLOBALS->color_active_in_filter = 0; wave_gdk_draw_line_flush(GLOBALS->wavepixmap_wavewindow_c_1); GLOBALS->tims.start+=GLOBALS->shift_timebase; GLOBALS->tims.end+=GLOBALS->shift_timebase; } /********************************************************************************************************/ static void draw_vptr_trace_analog(Trptr t, vptr v, int which, int num_extension) { TimeType _x0, _x1, newtime; int _y0, _y1, yu, liney, yt0, yt1; TimeType tim, h2tim; vptr h, h2, h3; int endcnt = 0; int type; /* int lasttype=-1; */ /* scan-build */ GdkGC *c, *ci; GdkGC *cnan = GLOBALS->gc.gc_u_wavewindow_c_1; GdkGC *cinf = GLOBALS->gc.gc_w_wavewindow_c_1; GdkGC *cfixed; double mynan = strtod("NaN", NULL); double tmin = mynan, tmax = mynan, tv=0.0, tv2; gint rmargin; int is_nan = 0, is_nan2 = 0, is_inf = 0, is_inf2 = 0; int any_infs = 0, any_infp = 0, any_infm = 0; int skipcnt = 0; ci = GLOBALS->gc.gc_baseline_wavewindow_c_1; h=v; liney=((which+2+num_extension)*GLOBALS->fontheight)-2; _y1=((which+1)*GLOBALS->fontheight)+2; _y0=liney-2; yu=(_y0+_y1)/2; if(t->flags & TR_ANALOG_FULLSCALE) /* otherwise use dynamic */ { if((!t->minmax_valid)||(t->d_num_ext != num_extension)) { h3 = t->n.vec->vectors[0]; for(;;) { if(!h3) break; if((h3->time >= GLOBALS->tims.first) && (h3->time <= GLOBALS->tims.last)) { /* tv = mynan; */ /* scan-build */ tv=convert_real(t,h3); if (!isnan(tv) && !isinf(tv)) { if (isnan(tmin) || tv < tmin) tmin = tv; if (isnan(tmax) || tv > tmax) tmax = tv; } } else if(isinf(tv)) { any_infs = 1; if(tv > 0) { any_infp = 1; } else { any_infm = 1; } } h3 = h3->next; } if (isnan(tmin) || isnan(tmax)) tmin = tmax = 0; if(any_infs) { double tdelta = (tmax - tmin) * WAVE_INF_SCALING; if(any_infp) tmax = tmax + tdelta; if(any_infm) tmin = tmin - tdelta; } if ((tmax - tmin) < 1e-20) { tmax = 1; tmin -= 0.5 * (_y1 - _y0); } else { tmax = (_y1 - _y0) / (tmax - tmin); } t->minmax_valid = 1; t->d_minval = tmin; t->d_maxval = tmax; t->d_num_ext = num_extension; } else { tmin = t->d_minval; tmax = t->d_maxval; } } else { h3 = h; for(;;) { if(!h3) break; tim=(h3->time); if(tim>GLOBALS->tims.end) { endcnt++; if(endcnt==2) break; } if(tim>GLOBALS->tims.last) break; _x0=(tim - GLOBALS->tims.start) * GLOBALS->pxns; if((_x0>GLOBALS->wavewidth)&&(endcnt==2)) { break; } tv=convert_real(t,h3); if (!isnan(tv) && !isinf(tv)) { if (isnan(tmin) || tv < tmin) tmin = tv; if (isnan(tmax) || tv > tmax) tmax = tv; } else if(isinf(tv)) { any_infs = 1; if(tv > 0) { any_infp = 1; } else { any_infm = 1; } } h3 = h3->next; } if (isnan(tmin) || isnan(tmax)) tmin = tmax = 0; if(any_infs) { double tdelta = (tmax - tmin) * WAVE_INF_SCALING; if(any_infp) tmax = tmax + tdelta; if(any_infm) tmin = tmin - tdelta; } if ((tmax - tmin) < 1e-20) { tmax = 1; tmin -= 0.5 * (_y1 - _y0); } else { tmax = (_y1 - _y0) / (tmax - tmin); } } if(GLOBALS->tims.last - GLOBALS->tims.start < GLOBALS->wavewidth) { rmargin=(GLOBALS->tims.last - GLOBALS->tims.start) * GLOBALS->pxns; } else { rmargin = GLOBALS->wavewidth; } h3 = NULL; for(;;) { if(!h) break; tim=(h->time); if((tim>GLOBALS->tims.end)||(tim>GLOBALS->tims.last)) break; _x0=(tim - GLOBALS->tims.start) * GLOBALS->pxns; /* if(_x0<-1) { _x0=-1; } else if(_x0>GLOBALS->wavewidth) { break; } */ h2=h->next; if(!h2) break; h2tim=tim=(h2->time); if(tim>GLOBALS->tims.last) tim=GLOBALS->tims.last; /* else if(tim>GLOBALS->tims.end+1) tim=GLOBALS->tims.end+1; */ _x1=(tim - GLOBALS->tims.start) * GLOBALS->pxns; /* if(_x1<-1) { _x1=-1; } else if(_x1>GLOBALS->wavewidth) { _x1=GLOBALS->wavewidth; } */ /* draw trans */ type = vtype2(t,h); tv=convert_real(t,h); tv2=convert_real(t,h2); if((is_inf = isinf(tv))) { if(tv < 0) { yt0 = _y0; } else { yt0 = _y1; } } else if((is_nan = isnan(tv))) { yt0 = yu; } else { yt0 = _y0 + (tv - tmin) * tmax; } if((is_inf2 = isinf(tv2))) { if(tv2 < 0) { yt1 = _y0; } else { yt1 = _y1; } } else if((is_nan2 = isnan(tv2))) { yt1 = yu; } else { yt1 = _y0 + (tv2 - tmin) * tmax; } if((_x0!=_x1)||(skipcnt < GLOBALS->analog_redraw_skip_count)) /* lower number = better performance */ { if(_x0==_x1) { skipcnt++; } else { skipcnt = 0; } if(type == AN_0) { c = GLOBALS->gc.gc_vbox_wavewindow_c_1; } else { c = GLOBALS->gc.gc_x_wavewindow_c_1; } if(h->next) { if(h->next->time > GLOBALS->max_time) { yt1 = yt0; } } cfixed = is_inf ? cinf : c; if((is_nan2) && (h2tim > GLOBALS->max_time)) is_nan2 = 0; /* clamp to top/bottom because of integer rounding errors */ if(yt0 < _y1) yt0 = _y1; else if(yt0 > _y0) yt0 = _y0; if(yt1 < _y1) yt1 = _y1; else if(yt1 > _y0) yt1 = _y0; /* clipping... */ { int coords[4]; int rect[4]; if(_x0 < INT_MIN) { coords[0] = INT_MIN; } else if(_x0 > INT_MAX) { coords[0] = INT_MAX; } else { coords[0] = _x0; } if(_x1 < INT_MIN) { coords[2] = INT_MIN; } else if(_x1 > INT_MAX) { coords[2] = INT_MAX; } else { coords[2] = _x1; } coords[1] = yt0; coords[3] = yt1; rect[0] = -10; rect[1] = _y1; rect[2] = GLOBALS->wavewidth + 10; rect[3] = _y0; if((t->flags & (TR_ANALOG_INTERPOLATED|TR_ANALOG_STEP)) != TR_ANALOG_STEP) { wave_lineclip(coords, rect); } else { if(coords[0] < rect[0]) coords[0] = rect[0]; if(coords[2] < rect[0]) coords[2] = rect[0]; if(coords[0] > rect[2]) coords[0] = rect[2]; if(coords[2] > rect[2]) coords[2] = rect[2]; if(coords[1] < rect[1]) coords[1] = rect[1]; if(coords[3] < rect[1]) coords[3] = rect[1]; if(coords[1] > rect[3]) coords[1] = rect[3]; if(coords[3] > rect[3]) coords[3] = rect[3]; } _x0 = coords[0]; yt0 = coords[1]; _x1 = coords[2]; yt1 = coords[3]; } /* ...clipping */ if(is_nan || is_nan2) { if(is_nan) { gdk_draw_rectangle(GLOBALS->wavepixmap_wavewindow_c_1, cnan, TRUE, _x0, _y1, _x1-_x0, _y0-_y1); if((t->flags & (TR_ANALOG_INTERPOLATED|TR_ANALOG_STEP)) == (TR_ANALOG_INTERPOLATED|TR_ANALOG_STEP)) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x1-1, yt1,_x1+1, yt1); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x1, yt1-1,_x1, yt1+1); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x0-1, _y0,_x0+1, _y0); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x0, _y0-1,_x0, _y0+1); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x0-1, _y1,_x0+1, _y1); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x0, _y1-1,_x0, _y1+1); } } if(is_nan2) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, cfixed,_x0, yt0, _x1, yt0); if((t->flags & (TR_ANALOG_INTERPOLATED|TR_ANALOG_STEP)) == (TR_ANALOG_INTERPOLATED|TR_ANALOG_STEP)) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, cnan,_x1, yt1,_x1, yt0); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x1-1, _y0,_x1+1, _y0); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x1, _y0-1,_x1, _y0+1); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x1-1, _y1,_x1+1, _y1); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x1, _y1-1,_x1, _y1+1); } } } else if((t->flags & TR_ANALOG_INTERPOLATED) && !is_inf && !is_inf2) { if(t->flags & TR_ANALOG_STEP) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x0-1, yt0,_x0+1, yt0); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x0, yt0-1,_x0, yt0+1); } if(rmargin != GLOBALS->wavewidth) /* the window is clipped in postscript */ { if((yt0==yt1)&&((_x0 > _x1)||(_x0 < 0))) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, cfixed,0, yt0,_x1,yt1); } else { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, cfixed,_x0, yt0,_x1,yt1); } } else { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, cfixed,_x0, yt0,_x1,yt1); } } else /* if(t->flags & TR_ANALOG_STEP) */ { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, cfixed,_x0, yt0,_x1, yt0); if(is_inf2) cfixed = cinf; wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, cfixed,_x1, yt0,_x1, yt1); if ((t->flags & (TR_ANALOG_INTERPOLATED|TR_ANALOG_STEP)) == (TR_ANALOG_INTERPOLATED|TR_ANALOG_STEP)) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x0-1, yt0,_x0+1, yt0); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, ci,_x0, yt0-1,_x0, yt0+1); } } } else { newtime=(((gdouble)(_x1+WAVE_OPT_SKIP))*GLOBALS->nspx)+GLOBALS->tims.start/*+GLOBALS->shift_timebase*/; /* skip to next pixel */ h3=bsearch_vector(t->n.vec,newtime); if(h3->time>h->time) { h=h3; /* lasttype=type; */ continue; } } h=h->next; /* lasttype=type; */ } wave_gdk_draw_line_flush(GLOBALS->wavepixmap_wavewindow_c_1); GLOBALS->tims.start+=GLOBALS->shift_timebase; GLOBALS->tims.end+=GLOBALS->shift_timebase; } /* * draw vector traces */ static void draw_vptr_trace(Trptr t, vptr v, int which) { TimeType _x0, _x1, newtime, width; int _y0, _y1, yu, liney, ytext; TimeType tim /* , h2tim */; /* scan-build */ vptr h, h2, h3; char *ascii=NULL; int type; int lasttype=-1; GdkGC *c; GLOBALS->tims.start-=GLOBALS->shift_timebase; GLOBALS->tims.end-=GLOBALS->shift_timebase; liney=((which+2)*GLOBALS->fontheight)-2; _y1=((which+1)*GLOBALS->fontheight)+2; _y0=liney-2; yu=(_y0+_y1)/2; ytext=yu-(GLOBALS->wavefont->ascent/2)+GLOBALS->wavefont->ascent; if((GLOBALS->display_grid)&&(GLOBALS->enable_horiz_grid)) { Trptr tn = GiveNextTrace(t); if((t->flags & TR_ANALOGMASK) && (tn) && (tn->flags & TR_ANALOG_BLANK_STRETCH)) { if((GLOBALS->highlight_wavewindow) && (t) && (t->flags & TR_HIGHLIGHT) && (!GLOBALS->black_and_white)) { gdk_draw_rectangle(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_grid_wavewindow_c_1, TRUE,0, liney - GLOBALS->fontheight, GLOBALS->wavewidth, GLOBALS->fontheight); } } else { if((GLOBALS->highlight_wavewindow) && (t) && (t->flags & TR_HIGHLIGHT) && (!GLOBALS->black_and_white)) { gdk_draw_rectangle(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_grid_wavewindow_c_1, TRUE,0, liney - GLOBALS->fontheight, GLOBALS->wavewidth, GLOBALS->fontheight); } else { gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_grid_wavewindow_c_1, (GLOBALS->tims.starttims.first)?(GLOBALS->tims.first-GLOBALS->tims.start)*GLOBALS->pxns:0, liney,(GLOBALS->tims.last<=GLOBALS->tims.end)?(GLOBALS->tims.last-GLOBALS->tims.start)*GLOBALS->pxns:GLOBALS->wavewidth-1, liney); } } } h = v; /* obsolete: if(t->flags & TR_TTRANSLATED) { traverse_vector_nodes(t); h=v=bsearch_vector(t->n.vec, GLOBALS->tims.start); } else { h=v; } */ if(t->flags & TR_ANALOGMASK) { Trptr te = GiveNextTrace(t); int ext = 0; while(te) { if(te->flags & TR_ANALOG_BLANK_STRETCH) { ext++; te = GiveNextTrace(te); } else { break; } } if((ext) && (GLOBALS->highlight_wavewindow) && (t) && (t->flags & TR_HIGHLIGHT) && (!GLOBALS->black_and_white)) { gdk_draw_rectangle(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_grid_wavewindow_c_1, TRUE,0, liney, GLOBALS->wavewidth, GLOBALS->fontheight * ext); } draw_vptr_trace_analog(t, v, which, ext); GLOBALS->tims.start+=GLOBALS->shift_timebase; GLOBALS->tims.end+=GLOBALS->shift_timebase; return; } GLOBALS->color_active_in_filter = 1; for(;;) { if(!h) break; tim=(h->time); if((tim>GLOBALS->tims.end)||(tim>GLOBALS->tims.last)) break; _x0=(tim - GLOBALS->tims.start) * GLOBALS->pxns; if(_x0<-1) { _x0=-1; } else if(_x0>GLOBALS->wavewidth) { break; } h2=h->next; if(!h2) break; /* h2tim= */ tim=(h2->time); /* scan-build */ if(tim>GLOBALS->tims.last) tim=GLOBALS->tims.last; else if(tim>GLOBALS->tims.end+1) tim=GLOBALS->tims.end+1; _x1=(tim - GLOBALS->tims.start) * GLOBALS->pxns; if(_x1<-1) { _x1=-1; } else if(_x1>GLOBALS->wavewidth) { _x1=GLOBALS->wavewidth; } /* draw trans */ type = vtype2(t,h); if(_x0>-1) { GdkGC *gltype, *gtype; switch(lasttype) { case AN_X: gltype = GLOBALS->gc.gc_x_wavewindow_c_1; break; case AN_U: gltype = GLOBALS->gc.gc_u_wavewindow_c_1; break; default: gltype = GLOBALS->gc.gc_vtrans_wavewindow_c_1; break; } switch(type) { case AN_X: gtype = GLOBALS->gc.gc_x_wavewindow_c_1; break; case AN_U: gtype = GLOBALS->gc.gc_u_wavewindow_c_1; break; default: gtype = GLOBALS->gc.gc_vtrans_wavewindow_c_1; break; } if(GLOBALS->use_roundcaps) { if (type == AN_Z) { if (lasttype != -1) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gltype,_x0-1, _y0,_x0, yu); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gltype,_x0, yu,_x0-1, _y1); } } else if (lasttype==AN_Z) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gtype,_x0+1, _y0,_x0, yu); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gtype,_x0, yu,_x0+1, _y1); } else { if (lasttype != type) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gltype,_x0-1, _y0,_x0, yu); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gltype,_x0, yu,_x0-1, _y1); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gtype,_x0+1, _y0,_x0, yu); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gtype,_x0, yu,_x0+1, _y1); } else { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gtype,_x0-2, _y0,_x0+2, _y1); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gtype,_x0+2, _y0,_x0-2, _y1); } } } else { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, gtype,_x0, _y0,_x0, _y1); } } if(_x0!=_x1) { if (type == AN_Z) { if(GLOBALS->use_roundcaps) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_mid_wavewindow_c_1,_x0+1, yu,_x1-1, yu); } else { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, GLOBALS->gc.gc_mid_wavewindow_c_1,_x0, yu,_x1, yu); } } else { if(type == AN_0) { c = GLOBALS->gc.gc_vbox_wavewindow_c_1; } else { c = GLOBALS->gc.gc_x_wavewindow_c_1; } if(GLOBALS->use_roundcaps) { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, c,_x0+2, _y0,_x1-2, _y0); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, c,_x0+2, _y1,_x1-2, _y1); } else { wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, c,_x0, _y0,_x1, _y0); wave_gdk_draw_line(GLOBALS->wavepixmap_wavewindow_c_1, c,_x0, _y1,_x1, _y1); } if(_x0<0) _x0=0; /* fixup left margin */ if((width=_x1-_x0)>GLOBALS->vector_padding) { char *ascii2; ascii=convert_ascii(t,h); ascii2 = ascii; if(*ascii == '?') { GdkGC *cb; char *srch_for_color = strchr(ascii+1, '?'); if(srch_for_color) { *srch_for_color = 0; cb = get_gc_from_name(ascii+1); if(cb) { ascii2 = srch_for_color + 1; if(!GLOBALS->black_and_white) gdk_draw_rectangle(GLOBALS->wavepixmap_wavewindow_c_1, cb, TRUE, _x0+1, _y1+1, width-1, (_y0-1) - (_y1+1) + 1); GLOBALS->fill_in_smaller_rgb_areas_wavewindow_c_1 = 1; } else { *srch_for_color = '?'; /* replace name as color is a miss */ } } } if((_x1>=GLOBALS->wavewidth)||(font_engine_string_measure(GLOBALS->wavefont, ascii2)+GLOBALS->vector_padding<=width)) { font_engine_draw_string(GLOBALS->wavepixmap_wavewindow_c_1,GLOBALS->wavefont,GLOBALS->gc.gc_value_wavewindow_c_1,_x0+2,ytext,ascii2); } else { char *mod; mod=bsearch_trunc(ascii2,width-GLOBALS->vector_padding); if(mod) { *mod='+'; *(mod+1)=0; font_engine_draw_string(GLOBALS->wavepixmap_wavewindow_c_1,GLOBALS->wavefont,GLOBALS->gc.gc_value_wavewindow_c_1,_x0+2,ytext,ascii2); } } } else if(GLOBALS->fill_in_smaller_rgb_areas_wavewindow_c_1) { /* char *ascii2; */ /* scan-build */ ascii=convert_ascii(t,h); /* ascii2 = ascii; */ /* scan-build */ if(*ascii == '?') { GdkGC *cb; char *srch_for_color = strchr(ascii+1, '?'); if(srch_for_color) { *srch_for_color = 0; cb = get_gc_from_name(ascii+1); if(cb) { /* ascii2 = srch_for_color + 1; */ if(GLOBALS->gc.gc_back_wavewindow_c_1 != GLOBALS->gc_white) { if(!GLOBALS->black_and_white) gdk_draw_rectangle(GLOBALS->wavepixmap_wavewindow_c_1, cb, TRUE, _x0, _y1+1, width, (_y0-1) - (_y1+1) + 1); } } else { *srch_for_color = '?'; /* replace name as color is a miss */ } } } } } } else { newtime=(((gdouble)(_x1+WAVE_OPT_SKIP))*GLOBALS->nspx)+GLOBALS->tims.start/*+GLOBALS->shift_timebase*/; /* skip to next pixel */ h3=bsearch_vector(t->n.vec,newtime); if(h3->time>h->time) { h=h3; lasttype=type; continue; } } if(ascii) { free_2(ascii); ascii=NULL; } lasttype=type; h=h->next; } GLOBALS->color_active_in_filter = 0; wave_gdk_draw_line_flush(GLOBALS->wavepixmap_wavewindow_c_1); GLOBALS->tims.start+=GLOBALS->shift_timebase; GLOBALS->tims.end+=GLOBALS->shift_timebase; } gtkwave-3.3.86/src/markerbox.c0000664000175000017500000003072013166335473015533 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2016. * * 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. */ #include "globals.h" #include #include #include #include "gtk12compat.h" #include "debug.h" #include "analyzer.h" #include "currenttime.h" static void gtkwave_strrev(char *p) { char *q = p; while(q && *q) ++q; for(--q; p < q; ++p, --q) *p = *p ^ *q, *q = *p ^ *q, *p = *p ^ *q; } char *make_bijective_marker_id_string(char *buf, unsigned int value) { char *pnt = buf; value++; /* bijective values start at one */ while (value) { value--; *(pnt++) = (char)('A' + value % ('Z'-'A'+1)); value = value / ('Z'-'A'+1); } *pnt = 0; gtkwave_strrev(buf); return(buf); } unsigned int bijective_marker_id_string_hash(const char *so) { unsigned int val=0; int i; int len = strlen(so); char sn[16]; char *s = sn; strcpy(sn, so); gtkwave_strrev(sn); s += len; for(i=0;i 'Z')) break; val *= ('Z'-'A'+1); val += ((unsigned char)c) - ('A' - 1); } val--; /* bijective values start at one so decrement */ return(val); } unsigned int bijective_marker_id_string_len(const char *s) { int len = 0; while(*s) { char c = toupper(*s); if((c >= 'A') && (c <= 'Z')) { len++; s++; continue; } else { break; } } return(len); } static void str_change_callback(GtkWidget *entry, gpointer which) { G_CONST_RETURN gchar *entry_text; int i; uint32_t hashmask = WAVE_NUM_NAMED_MARKERS; hashmask |= hashmask >> 1; hashmask |= hashmask >> 2; hashmask |= hashmask >> 4; hashmask |= hashmask >> 8; hashmask |= hashmask >> 16; i = ((int) (((intptr_t) which) & hashmask)) % WAVE_NUM_NAMED_MARKERS; GLOBALS->dirty_markerbox_c_1 = 1; entry_text = gtk_entry_get_text(GTK_ENTRY(entry)); if(entry_text && strlen(entry_text)) { if(GLOBALS->shadow_marker_names[i]) { free_2(GLOBALS->shadow_marker_names[i]); } GLOBALS->shadow_marker_names[i] = strdup_2(entry_text); } else { if(GLOBALS->shadow_marker_names[i]) { free_2(GLOBALS->shadow_marker_names[i]); GLOBALS->shadow_marker_names[i] = NULL; } } } static void str_enter_callback(GtkWidget *entry, gpointer which) { G_CONST_RETURN gchar *entry_text; int i; uint32_t hashmask = WAVE_NUM_NAMED_MARKERS; hashmask |= hashmask >> 1; hashmask |= hashmask >> 2; hashmask |= hashmask >> 4; hashmask |= hashmask >> 8; hashmask |= hashmask >> 16; i = ((int) (((intptr_t) which) & hashmask)) % WAVE_NUM_NAMED_MARKERS; GLOBALS->dirty_markerbox_c_1 = 1; entry_text = gtk_entry_get_text(GTK_ENTRY(entry)); if(entry_text && strlen(entry_text)) { if(GLOBALS->shadow_marker_names[i]) { free_2(GLOBALS->shadow_marker_names[i]); } GLOBALS->shadow_marker_names[i] = strdup_2(entry_text); gtk_entry_select_region (GTK_ENTRY (entry), 0, GTK_ENTRY(entry)->text_length); } else { if(GLOBALS->shadow_marker_names[i]) { free_2(GLOBALS->shadow_marker_names[i]); GLOBALS->shadow_marker_names[i] = NULL; } } } static void change_callback(GtkWidget *widget, gpointer which) { (void)widget; GtkWidget *entry; TimeType temp; G_CONST_RETURN gchar *entry_text; char buf[49]; int i; int ent_idx; uint32_t hashmask = WAVE_NUM_NAMED_MARKERS; hashmask |= hashmask >> 1; hashmask |= hashmask >> 2; hashmask |= hashmask >> 4; hashmask |= hashmask >> 8; hashmask |= hashmask >> 16; ent_idx = ((int) (((intptr_t) which) & hashmask)) % WAVE_NUM_NAMED_MARKERS; entry=GLOBALS->entries_markerbox_c_1[ent_idx]; entry_text = gtk_entry_get_text(GTK_ENTRY(entry)); entry_text = entry_text ? entry_text : ""; if(!strlen(entry_text)) goto failure; if(entry_text[0] != '-') { if(!isdigit((int)(unsigned char)entry_text[0])) goto failure; } temp=unformat_time(entry_text, GLOBALS->time_dimension); temp -= GLOBALS->global_time_offset; if((temptims.start)||(temp>GLOBALS->tims.last)) goto failure; for(i=0;ishadow_markers_markerbox_c_1[i]) { if(i!=ent_idx) { GLOBALS->shadow_markers_markerbox_c_1[ent_idx] = -1; } goto failure; } } reformat_time_simple(buf, temp + GLOBALS->global_time_offset, GLOBALS->time_dimension); GLOBALS->shadow_markers_markerbox_c_1[ent_idx]=temp; GLOBALS->dirty_markerbox_c_1=1; failure: return; } static void enter_callback(GtkWidget *widget, gpointer which) { (void)widget; GtkWidget *entry; /* TimeType *modify; */ /* scan-build */ TimeType temp; G_CONST_RETURN gchar *entry_text; char buf[49]; int i; int ent_idx; uint32_t hashmask = WAVE_NUM_NAMED_MARKERS; hashmask |= hashmask >> 1; hashmask |= hashmask >> 2; hashmask |= hashmask >> 4; hashmask |= hashmask >> 8; hashmask |= hashmask >> 16; ent_idx = ((int) (((intptr_t) which) & hashmask)) % WAVE_NUM_NAMED_MARKERS; entry=GLOBALS->entries_markerbox_c_1[ent_idx]; entry_text = gtk_entry_get_text(GTK_ENTRY(entry)); entry_text = entry_text ? entry_text : ""; if(!strlen(entry_text)) goto failure; temp=unformat_time(entry_text, GLOBALS->time_dimension); temp -= GLOBALS->global_time_offset; if((temptims.start)||(temp>GLOBALS->tims.last)) goto failure; for(i=0;ishadow_markers_markerbox_c_1[i]) goto failure; } reformat_time_simple(buf, temp + GLOBALS->global_time_offset, GLOBALS->time_dimension); gtk_entry_set_text (GTK_ENTRY (entry), buf); GLOBALS->shadow_markers_markerbox_c_1[ent_idx]=temp; GLOBALS->dirty_markerbox_c_1=1; gtk_entry_select_region (GTK_ENTRY (entry), 0, GTK_ENTRY(entry)->text_length); return; failure: /* modify=(TimeType *)which; */ /* scan-build */ if(GLOBALS->shadow_markers_markerbox_c_1[ent_idx]==-1) { sprintf(buf,""); } else { reformat_time_simple(buf, GLOBALS->shadow_markers_markerbox_c_1[ent_idx] + GLOBALS->global_time_offset, GLOBALS->time_dimension); } gtk_entry_set_text (GTK_ENTRY (entry), buf); } static void ok_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; if(GLOBALS->dirty_markerbox_c_1) { int i; for(i=0;inamed_markers[i]=GLOBALS->shadow_markers_markerbox_c_1[i]; if(GLOBALS->marker_names[i]) free_2(GLOBALS->marker_names[i]); GLOBALS->marker_names[i] = GLOBALS->shadow_marker_names[i]; GLOBALS->shadow_marker_names[i] = NULL; } MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } wave_gtk_grab_remove(GLOBALS->window_markerbox_c_4); gtk_widget_destroy(GLOBALS->window_markerbox_c_4); GLOBALS->window_markerbox_c_4 = NULL; GLOBALS->cleanup_markerbox_c_4(); } static void destroy_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; int i; for(i=0;imarker_names[i]) free_2(GLOBALS->marker_names[i]); GLOBALS->marker_names[i] = GLOBALS->shadow_marker_names[i]; GLOBALS->shadow_marker_names[i] = NULL; } wave_gtk_grab_remove(GLOBALS->window_markerbox_c_4); gtk_widget_destroy(GLOBALS->window_markerbox_c_4); GLOBALS->window_markerbox_c_4 = NULL; } void markerbox(char *title, GtkSignalFunc func) { GtkWidget *entry; GtkWidget *vbox, *hbox, *vbox_g, *label; GtkWidget *button1, *button2, *scrolled_win, *frame, *separator; GtkWidget *table; char labtitle[16]; int i; GLOBALS->cleanup_markerbox_c_4=func; GLOBALS->dirty_markerbox_c_1=0; for(i=0;ishadow_markers_markerbox_c_1[i] = GLOBALS->named_markers[i]; GLOBALS->shadow_marker_names[i] = strdup_2(GLOBALS->marker_names[i]); } /* fix problem where ungrab doesn't occur if button pressed + simultaneous accelerator key occurs */ if(GLOBALS->in_button_press_wavewindow_c_1) { gdk_pointer_ungrab(GDK_CURRENT_TIME); } /* create a new modal window */ GLOBALS->window_markerbox_c_4 = gtk_window_new(GLOBALS->disable_window_manager ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL); install_focus_cb(GLOBALS->window_markerbox_c_4, ((char *)&GLOBALS->window_markerbox_c_4) - ((char *)GLOBALS)); gtk_window_set_title(GTK_WINDOW (GLOBALS->window_markerbox_c_4), title); gtkwave_signal_connect(GTK_OBJECT (GLOBALS->window_markerbox_c_4), "delete_event",(GtkSignalFunc) destroy_callback, NULL); vbox = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox); vbox_g = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox_g); table = gtk_table_new (256, 1, FALSE); gtk_widget_show (table); gtk_table_attach (GTK_TABLE (table), vbox, 0, 1, 0, 255, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); frame = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (frame), 3); gtk_widget_show(frame); scrolled_win = gtk_scrolled_window_new (NULL, NULL); gtk_widget_set_usize( GTK_WIDGET (scrolled_win), 400, 300); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_show(scrolled_win); gtk_container_add (GTK_CONTAINER (frame), scrolled_win); gtk_container_add (GTK_CONTAINER (vbox), frame); for(i=0;ientries_markerbox_c_1[i]=entry = gtk_entry_new_with_max_length (48); gtkwave_signal_connect(GTK_OBJECT(entry), "activate", GTK_SIGNAL_FUNC(enter_callback), (void *)((intptr_t) i)); gtkwave_signal_connect(GTK_OBJECT(entry), "changed", GTK_SIGNAL_FUNC(change_callback), (void *)((intptr_t) i)); if(GLOBALS->shadow_markers_markerbox_c_1[i]==-1) { sprintf(buf,""); } else { reformat_time_simple(buf, GLOBALS->shadow_markers_markerbox_c_1[i] + GLOBALS->global_time_offset, GLOBALS->time_dimension); } gtk_entry_set_text (GTK_ENTRY (entry), buf); gtk_widget_show (entry); gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0); /* string part */ entry = gtk_entry_new_with_max_length (48); if(GLOBALS->shadow_marker_names[i]) gtk_entry_set_text (GTK_ENTRY (entry), GLOBALS->shadow_marker_names[i]); gtk_widget_show (entry); gtkwave_signal_connect(GTK_OBJECT(entry), "activate", GTK_SIGNAL_FUNC(str_enter_callback), (void *)((intptr_t) i)); gtkwave_signal_connect(GTK_OBJECT(entry), "changed", GTK_SIGNAL_FUNC(str_change_callback), (void *)((intptr_t) i)); gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (vbox_g), hbox, TRUE, TRUE, 0); } gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_win), vbox_g); hbox = gtk_hbox_new (FALSE, 1); gtk_widget_show (hbox); gtk_table_attach (GTK_TABLE (table), hbox, 0, 1, 255, 256, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); button1 = gtk_button_new_with_label ("OK"); gtk_widget_set_usize(button1, 100, -1); gtkwave_signal_connect(GTK_OBJECT (button1), "clicked", GTK_SIGNAL_FUNC(ok_callback), NULL); gtk_widget_show (button1); gtk_container_add (GTK_CONTAINER (hbox), button1); GTK_WIDGET_SET_FLAGS (button1, GTK_CAN_DEFAULT); gtkwave_signal_connect_object (GTK_OBJECT (button1), "realize", (GtkSignalFunc) gtk_widget_grab_default, GTK_OBJECT (button1)); button2 = gtk_button_new_with_label ("Cancel"); gtk_widget_set_usize(button2, 100, -1); gtkwave_signal_connect(GTK_OBJECT (button2), "clicked", GTK_SIGNAL_FUNC(destroy_callback), NULL); GTK_WIDGET_SET_FLAGS (button2, GTK_CAN_DEFAULT); gtk_widget_show (button2); gtk_container_add (GTK_CONTAINER (hbox), button2); gtk_container_add (GTK_CONTAINER (GLOBALS->window_markerbox_c_4), table); /* need this table to keep ok/cancel buttons from stretching! */ gtk_widget_show(GLOBALS->window_markerbox_c_4); wave_gtk_grab_add(GLOBALS->window_markerbox_c_4); } gtkwave-3.3.86/src/pipeio.h0000664000175000017500000000210513166335473015027 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2005-2009 * * 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. */ #include "globals.h" #ifndef WAVE_PIPEIO_H #define WAVE_PIPEIO_H #include #include #include #ifdef HAVE_SYS_STAT_H #include #endif #include #include #include #include "debug.h" #if defined _MSC_VER || defined __MINGW32__ #include #endif struct pipe_ctx { #if defined _MSC_VER || defined __MINGW32__ HANDLE g_hChildStd_IN_Rd; HANDLE g_hChildStd_IN_Wr; /* handle for gtkwave to write to */ HANDLE g_hChildStd_OUT_Rd; /* handle for gtkwave to read from */ HANDLE g_hChildStd_OUT_Wr; PROCESS_INFORMATION piProcInfo; #else FILE *sin, *sout; int fd0, fd1; pid_t pid; #endif }; struct pipe_ctx *pipeio_create(char *execappname, char *arg); void pipeio_destroy(struct pipe_ctx *p); #endif gtkwave-3.3.86/src/treesearch.h0000664000175000017500000000216113166335473015671 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010-2017 * * 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. */ #ifndef WAVE_TREESEARCH_H #define WAVE_TREESEARCH_H void treebox(char *title, GtkSignalFunc func, GtkWidget *old_window); GtkWidget* treeboxframe(char *title, GtkSignalFunc func); void mkmenu_treesearch_cleanup(GtkWidget *widget, gpointer data); void dump_open_tree_nodes(FILE *wave, xl_Tree *t); int force_open_tree_node(char *name, int keep_path_nodes_open, struct tree **t_pnt); void select_tree_node(char *name); void dnd_setup(GtkWidget *src, GtkWidget *widget, int enable_receive); /* dnd from gtk2 tree to signalwindow */ void treeview_select_all_callback(void); /* gtk2 */ void treeview_unselect_all_callback(void); /* gtk2 */ int treebox_is_active(void); #if WAVE_USE_GTK2 void DND_helper_quartz(char *data); #endif void recurse_import(GtkWidget *widget, guint callback_action); #define WV_RECURSE_IMPORT_WARN (0) #endif gtkwave-3.3.86/src/gconf.c0000664000175000017500000002526113166335473014641 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2012. * * 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. */ #include #include "gconf.h" #include "wavealloca.h" #include "globals.h" int wave_rpc_id = 0; #ifdef WAVE_HAVE_GCONF static GConfClient* client = NULL; /************************************************************/ static void open_callback(GConfClient* gclient, guint cnxn_id, GConfEntry *entry, gpointer user_data) { (void)gclient; (void)cnxn_id; (void)user_data; if (gconf_entry_get_value (entry) == NULL) { /* value is unset */ } else { if (gconf_entry_get_value (entry)->type == GCONF_VALUE_STRING) { fprintf(stderr, "GTKWAVE | RPC Open: '%s'\n", gconf_value_get_string (gconf_entry_get_value (entry)) ); deal_with_rpc_open(gconf_value_get_string (gconf_entry_get_value (entry)), NULL); gconf_entry_set_value(entry, NULL); } else { /* value is of wrong type */ } } } static void quit_callback(GConfClient* gclient, guint cnxn_id, GConfEntry *entry, gpointer user_data) { (void)gclient; (void)cnxn_id; (void)user_data; if (gconf_entry_get_value (entry) == NULL) { /* value is unset */ } else { if (gconf_entry_get_value (entry)->type == GCONF_VALUE_STRING) { const char *rc = gconf_value_get_string (gconf_entry_get_value (entry)); int rcv = atoi(rc); fprintf(stderr, "GTKWAVE | RPC Quit: exit return code %d\n", rcv); gconf_entry_set_value(entry, NULL); exit(rcv); } else { /* value is of wrong type */ } } } static void reload_callback(GConfClient* gclient, guint cnxn_id, GConfEntry *entry, gpointer user_data) { (void)gclient; (void)cnxn_id; (void)user_data; if (gconf_entry_get_value (entry) == NULL) { /* value is unset */ } else { if (gconf_entry_get_value (entry)->type == GCONF_VALUE_STRING) { if(in_main_iteration()) return; reload_into_new_context(); gconf_entry_set_value(entry, NULL); } else { /* value is of wrong type */ } } } static void zoomfull_callback(GConfClient* gclient, guint cnxn_id, GConfEntry *entry, gpointer user_data) { (void)gclient; (void)cnxn_id; (void)user_data; if (gconf_entry_get_value (entry) == NULL) { /* value is unset */ } else { if (gconf_entry_get_value (entry)->type == GCONF_VALUE_STRING) { if(in_main_iteration()) return; service_zoom_full(NULL, NULL); gconf_entry_set_value(entry, NULL); } else { /* value is of wrong type */ } } } static void writesave_callback(GConfClient* gclient, guint cnxn_id, GConfEntry *entry, gpointer user_data) { (void)gclient; (void)cnxn_id; (void)user_data; if (gconf_entry_get_value (entry) == NULL) { /* value is unset */ } else { if (gconf_entry_get_value (entry)->type == GCONF_VALUE_STRING) { const char *fni = gconf_value_get_string (gconf_entry_get_value (entry)); if(fni && !in_main_iteration()) { int use_arg = strcmp(fni, "+"); /* plus filename uses default */ const char *fn = use_arg ? fni : GLOBALS->filesel_writesave; if(fn) { FILE *wave; if(!(wave=fopen(fn, "wb"))) { fprintf(stderr, "GTKWAVE | RPC Writesave: error opening save file '%s' for writing.\n", fn); perror("Why"); errno=0; } else { write_save_helper(fn, wave); if(use_arg) { if(GLOBALS->filesel_writesave) { free_2(GLOBALS->filesel_writesave); } GLOBALS->filesel_writesave = strdup_2(fn); } wave_gconf_client_set_string("/current/savefile", fn); fclose(wave); fprintf(stderr, "GTKWAVE | RPC Writesave: wrote save file '%s'.\n", GLOBALS->filesel_writesave); } } } gconf_entry_set_value(entry, NULL); } else { /* value is of wrong type */ } } } static void move_to_time_callback(GConfClient* gclient, guint cnxn_id, GConfEntry *entry, gpointer user_data) { (void)gclient; (void)cnxn_id; (void)user_data; if (gconf_entry_get_value (entry) == NULL) { /* value is unset */ } else { if (gconf_entry_get_value (entry)->type == GCONF_VALUE_STRING) { const char *str = gconf_value_get_string (gconf_entry_get_value (entry)); if(str && !in_main_iteration()) { char *e_copy = GLOBALS->entrybox_text; GLOBALS->entrybox_text=strdup_2(str); movetotime_cleanup(NULL, NULL); GLOBALS->entrybox_text = e_copy; } gconf_entry_set_value(entry, NULL); } else { /* value is of wrong type */ } } } static void zoom_size_callback(GConfClient* gclient, guint cnxn_id, GConfEntry *entry, gpointer user_data) { (void)gclient; (void)cnxn_id; (void)user_data; if (gconf_entry_get_value (entry) == NULL) { /* value is unset */ } else { if (gconf_entry_get_value (entry)->type == GCONF_VALUE_STRING) { const char *str = gconf_value_get_string (gconf_entry_get_value (entry)); if(str && !in_main_iteration()) { char *e_copy = GLOBALS->entrybox_text; GLOBALS->entrybox_text=strdup_2(str); zoomsize_cleanup(NULL, NULL); GLOBALS->entrybox_text = e_copy; } gconf_entry_set_value(entry, NULL); } else { /* value is of wrong type */ } } } /************************************************************/ static void remove_client(void) { if(client) { g_object_unref(client); } } void wave_gconf_init(int argc, char **argv) { if(!client) { char *ks = wave_alloca(WAVE_GCONF_DIR_LEN + 32 + 32 + 1); int len = sprintf(ks, WAVE_GCONF_DIR"/%d", wave_rpc_id); gconf_init(argc, argv, NULL); client = gconf_client_get_default(); atexit(remove_client); gconf_client_add_dir(client, ks, GCONF_CLIENT_PRELOAD_NONE, NULL); strcpy(ks + len, "/open"); gconf_client_notify_add(client, ks, open_callback, NULL, /* user data */ NULL, NULL); strcpy(ks + len, "/quit"); gconf_client_notify_add(client, ks, quit_callback, NULL, /* user data */ NULL, NULL); strcpy(ks + len, "/writesave"); gconf_client_notify_add(client, ks, writesave_callback, NULL, /* user data */ NULL, NULL); strcpy(ks + len, "/reload"); gconf_client_notify_add(client, ks, reload_callback, NULL, /* user data */ NULL, NULL); strcpy(ks + len, "/zoom_full"); gconf_client_notify_add(client, ks, zoomfull_callback, NULL, /* user data */ NULL, NULL); strcpy(ks + len, "/move_to_time"); gconf_client_notify_add(client, ks, move_to_time_callback, NULL, /* user data */ NULL, NULL); strcpy(ks + len, "/zoom_size"); gconf_client_notify_add(client, ks, zoom_size_callback, NULL, /* user data */ NULL, NULL); } } gboolean wave_gconf_client_set_string(const gchar *key, const gchar *val) { if(key && client) { char *ks = wave_alloca(WAVE_GCONF_DIR_LEN + 32 + strlen(key) + 1); sprintf(ks, WAVE_GCONF_DIR"/%d%s", wave_rpc_id, key); return(gconf_client_set_string(client, ks, val ? val : "", NULL)); } return(FALSE); } static gchar *wave_gconf_client_get_string(const gchar *key) { if(key && client) { char *ks = wave_alloca(WAVE_GCONF_DIR_LEN + 32 + strlen(key) + 1); sprintf(ks, WAVE_GCONF_DIR"/%d%s", wave_rpc_id, key); return(gconf_client_get_string(client, ks, NULL)); } return(NULL); } void wave_gconf_restore(char **dumpfile, char **savefile, char **rcfile, char **wave_pwd, int *opt_vcd) { char *s; if(dumpfile && savefile && rcfile && wave_pwd && opt_vcd) { if(*dumpfile) { free_2(*dumpfile); *dumpfile = NULL; } s = wave_gconf_client_get_string("/current/dumpfile"); if(s) { if(s[0]) *dumpfile = strdup_2(s); g_free(s); } if(*savefile) { free_2(*savefile); *savefile = NULL; } s = wave_gconf_client_get_string("/current/savefile"); if(s) { if(s[0]) *savefile = strdup_2(s); g_free(s); } if(*rcfile) { free_2(*rcfile); *rcfile = NULL; } s = wave_gconf_client_get_string("/current/rcfile"); if(s) { if(s[0]) *rcfile = strdup_2(s); g_free(s); } if(*wave_pwd) { free_2(*wave_pwd); *wave_pwd = NULL; } s = wave_gconf_client_get_string("/current/pwd"); if(s) { if(s[0]) *wave_pwd = strdup_2(s); g_free(s); } s = wave_gconf_client_get_string("/current/optimized_vcd"); if(s) { if(s[0]) *opt_vcd = atoi(s); g_free(s); } } } #else void wave_gconf_init(int argc, char **argv) { (void)argc; (void)argv; } gboolean wave_gconf_client_set_string(const gchar *key, const gchar *val) { (void)key; (void)val; return(FALSE); } void wave_gconf_restore(char **dumpfile, char **savefile, char **rcfile, char **wave_pwd, int *opt_vcd) { (void)dumpfile; (void)savefile; (void)rcfile; (void)wave_pwd; (void)opt_vcd; /* nothing */ } #endif /* Examples of RPC manipulation: gconftool-2 --dump /com.geda.gtkwave gconftool-2 --dump /com.geda.gtkwave --recursive-unset gconftool-2 --type string --set /com.geda.gtkwave/0/open /pub/systema_packed.fst gconftool-2 --type string --set /com.geda.gtkwave/0/open `pwd`/`basename -- des.gtkw` gconftool-2 --type string --set /com.geda.gtkwave/0/writesave /tmp/this.gtkw gconftool-2 --type string --set /com.geda.gtkwave/0/writesave + gconftool-2 --type string --set /com.geda.gtkwave/0/quit 0 gconftool-2 --type string --set /com.geda.gtkwave/0/reload 0 gconftool-2 --type string --set /com.geda.gtkwave/0/zoom_full 0 gconftool-2 --type string --set /com.geda.gtkwave/0/zoom_size -- -4.6 gconftool-2 --type string --set /com.geda.gtkwave/0/move_to_time 123ns gconftool-2 --type string --set /com.geda.gtkwave/0/move_to_time A */ gtkwave-3.3.86/src/fst.c0000664000175000017500000014676413166335473014355 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2009-2017. * * 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. */ #include #include "globals.h" #include #include "fstapi.h" #include "lx2.h" #ifndef _MSC_VER #include #endif #include #include #include #include "symbol.h" #include "vcd.h" #include "lxt.h" #include "lxt2_read.h" #include "vzt_read.h" #include "fstapi.h" #include "debug.h" #include "busy.h" #include "hierpack.h" #include "fst.h" #define FST_RDLOAD "FSTLOAD | " /******************************************************************/ /* * doubles going into histent structs are NEVER freed so this is OK.. * (we are allocating as many entries that fit in 4k minus the size of the two * bookkeeping void* pointers found in the malloc_2/free_2 routines in * debug.c) */ #ifdef _WAVE_HAVE_JUDY #define FST_DOUBLE_GRANULARITY ( (4*1024) / sizeof(double) ) #else #define FST_DOUBLE_GRANULARITY ( ( (4*1024)-(2*sizeof(void *)) ) / sizeof(double) ) #endif #ifndef WAVE_HAS_H_DOUBLE static void *double_slab_calloc(void) { if(GLOBALS->double_curr_fst==GLOBALS->double_fini_fst) { GLOBALS->double_curr_fst=(double *)calloc_2(FST_DOUBLE_GRANULARITY, sizeof(double)); GLOBALS->double_fini_fst=GLOBALS->double_curr_fst+FST_DOUBLE_GRANULARITY; } return((void *)(GLOBALS->double_curr_fst++)); } #endif /* * reverse equality mem compare */ static int memrevcmp(int i, const char *s1, const char *s2) { i--; for(;i>=0;i--) { if(s1[i] != s2[i]) break; } return(i+1); } /* * fast itoa for decimal numbers */ static char* itoa_2(int value, char* result) { char* ptr = result, *ptr1 = result, tmp_char; int tmp_value; do { tmp_value = value; value /= 10; *ptr++ = "9876543210123456789" [9 + (tmp_value - value * 10)]; } while ( value ); if (tmp_value < 0) *ptr++ = '-'; result = ptr; *ptr-- = '\0'; while(ptr1 < ptr) { tmp_char = *ptr; *ptr--= *ptr1; *ptr1++ = tmp_char; } return(result); } /* * preformatted sprintf statements which remove parsing latency */ static int sprintf_2_sd(char *s, char *c, int d) { char *s2 = s; while(*c) { *(s2++) = *(c++); } *(s2++) = '['; s2 = itoa_2(d, s2); *(s2++) = ']'; *s2 = 0; return(s2 - s); } static int sprintf_2_sdd(char *s, char *c, int d, int d2) { char *s2 = s; while(*c) { *(s2++) = *(c++); } *(s2++) = '['; s2 = itoa_2(d, s2); *(s2++) = ':'; s2 = itoa_2(d2, s2); *(s2++) = ']'; *s2 = 0; return(s2 - s); } /******************************************************************/ static struct fstHier *extractNextVar(void *xc, int *msb, int *lsb, char **nam, int *namlen, unsigned int *nnam_max) { struct fstHier *h; const char *pnts; char *pnt, *pntd, *lb_last = NULL, *col_last = NULL; /* *rb_last = NULL; */ /* scan-build : unused */ int acc; char *s; unsigned char ttype; int sdt = FST_SDT_NONE; int svt = FST_SVT_NONE; long sxt = 0; while((h = fstReaderIterateHier(xc))) { switch(h->htyp) { case FST_HT_SCOPE: GLOBALS->fst_scope_name = fstReaderPushScope(xc, h->u.scope.name, GLOBALS->mod_tree_parent); GLOBALS->fst_scope_name_len = fstReaderGetCurrentScopeLen(xc); switch(h->u.scope.typ) { case FST_ST_VCD_MODULE: ttype = TREE_VCD_ST_MODULE; break; case FST_ST_VCD_TASK: ttype = TREE_VCD_ST_TASK; break; case FST_ST_VCD_FUNCTION: ttype = TREE_VCD_ST_FUNCTION; break; case FST_ST_VCD_BEGIN: ttype = TREE_VCD_ST_BEGIN; break; case FST_ST_VCD_FORK: ttype = TREE_VCD_ST_FORK; break; case FST_ST_VCD_GENERATE: ttype = TREE_VCD_ST_GENERATE; break; case FST_ST_VCD_STRUCT: ttype = TREE_VCD_ST_STRUCT; break; case FST_ST_VCD_UNION: ttype = TREE_VCD_ST_UNION; break; case FST_ST_VCD_CLASS: ttype = TREE_VCD_ST_CLASS; break; case FST_ST_VCD_INTERFACE: ttype = TREE_VCD_ST_INTERFACE; break; case FST_ST_VCD_PACKAGE: ttype = TREE_VCD_ST_PACKAGE; break; case FST_ST_VCD_PROGRAM: ttype = TREE_VCD_ST_PROGRAM; break; case FST_ST_VHDL_ARCHITECTURE: ttype = TREE_VHDL_ST_ARCHITECTURE; break; case FST_ST_VHDL_PROCEDURE: ttype = TREE_VHDL_ST_PROCEDURE; break; case FST_ST_VHDL_FUNCTION: ttype = TREE_VHDL_ST_FUNCTION; break; case FST_ST_VHDL_RECORD: ttype = TREE_VHDL_ST_RECORD; break; case FST_ST_VHDL_PROCESS: ttype = TREE_VHDL_ST_PROCESS; break; case FST_ST_VHDL_BLOCK: ttype = TREE_VHDL_ST_BLOCK; break; case FST_ST_VHDL_FOR_GENERATE: ttype = TREE_VHDL_ST_GENFOR; break; case FST_ST_VHDL_IF_GENERATE: ttype = TREE_VHDL_ST_GENIF; break; case FST_ST_VHDL_GENERATE: ttype = TREE_VHDL_ST_GENERATE; break; case FST_ST_VHDL_PACKAGE: ttype = TREE_VHDL_ST_PACKAGE; break; default: ttype = TREE_UNKNOWN; break; } allocate_and_decorate_module_tree_node(ttype, h->u.scope.name, h->u.scope.component, h->u.scope.name_length, h->u.scope.component_length, GLOBALS->stem_valid ? GLOBALS->stem_struct_base_siz : 0, GLOBALS->istem_valid ? GLOBALS->istem_struct_base_siz : 0); GLOBALS->stem_valid = GLOBALS->istem_valid = 0; break; case FST_HT_UPSCOPE: GLOBALS->mod_tree_parent = fstReaderGetCurrentScopeUserInfo(xc); GLOBALS->fst_scope_name = fstReaderPopScope(xc); GLOBALS->fst_scope_name_len = fstReaderGetCurrentScopeLen(xc); break; case FST_HT_VAR: /* GLOBALS->fst_scope_name = fstReaderGetCurrentFlatScope(xc); */ /* GLOBALS->fst_scope_name_len = fstReaderGetCurrentScopeLen(xc); */ if(h->u.var.name_length > (*nnam_max)) { free_2(*nam); *nam = malloc_2(((*nnam_max) = h->u.var.name_length) + 1); } s = *nam; pnts = h->u.var.name; pntd = s; while(*pnts) { if(*pnts != ' ') { if(*pnts == '[') { lb_last = pntd; col_last = NULL; } else if(*pnts == ':') { col_last = pntd; } /* else if(*pnts == ']') { rb_last = pntd; } */ /* scan-build : unused */ *(pntd++) = *pnts; } pnts++; } *pntd = 0; *namlen = pntd - s; if(!lb_last) { *msb = *lsb = -1; } else if ((h->u.var.length > 1) && !col_last && lb_last) /* add for NC arrays that don't add final explicit bitrange like VCS does */ { lb_last = NULL; *msb = h->u.var.length -1; *lsb = 0; } else { int sgna = 1, sgnb = 1; pnt = lb_last + 1; acc = 0; while(isdigit((int)(unsigned char)*pnt) || (*pnt == '-')) { if(*pnt != '-') { acc *= 10; acc += (*pnt - '0'); } else { sgna = -1; } pnt++; } *msb = acc * sgna; if(!col_last) { *lsb = acc; } else { pnt = col_last + 1; acc = 0; while(isdigit((int)(unsigned char)*pnt) || (*pnt == '-')) { if(*pnt != '-') { acc *= 10; acc += (*pnt - '0'); } else { sgnb = -1; } pnt++; } *lsb = acc * sgnb; } } if(lb_last) { *lb_last = 0; if((lb_last - s) < (*namlen)) { *namlen = lb_last - s; } } *nam = s; h->u.var.svt_workspace = svt; h->u.var.sdt_workspace = sdt; h->u.var.sxt_workspace = sxt; return(h); break; case FST_HT_ATTRBEGIN: /* currently ignored for most cases except VHDL variable vartype/datatype creation */ if(h->u.attr.typ == FST_AT_MISC) { if(h->u.attr.subtype == FST_MT_SUPVAR) { if(h->u.attr.name) { JRB subvar_jrb_node; char *attr_pnt; if(GLOBALS->fst_filetype == FST_FT_VHDL) { char *lc_p = attr_pnt = strdup_2(h->u.attr.name); while(*lc_p) { *lc_p = tolower(*lc_p); /* convert attrib name to lowercase for VHDL */ lc_p++; } } else { attr_pnt = NULL; } /* sxt points to actual type name specified in FST file */ subvar_jrb_node = jrb_find_str(GLOBALS->subvar_jrb, attr_pnt ? attr_pnt : h->u.attr.name); if(subvar_jrb_node) { sxt = subvar_jrb_node->val.ui; } else { Jval jv; if(GLOBALS->subvar_jrb_count != WAVE_VARXT_MAX_ID) { sxt = jv.ui = ++GLOBALS->subvar_jrb_count; /* subvar_jrb_node = */ jrb_insert_str(GLOBALS->subvar_jrb, strdup_2(attr_pnt ? attr_pnt : h->u.attr.name), jv); } else { sxt = 0; if(!GLOBALS->subvar_jrb_count_locked) { fprintf(stderr, FST_RDLOAD"Max number (%d) of type attributes reached, please increase WAVE_VARXT_MAX_ID.\n", WAVE_VARXT_MAX_ID); GLOBALS->subvar_jrb_count_locked = 1; } } } if(attr_pnt) { free_2(attr_pnt); } } svt = h->u.attr.arg >> FST_SDT_SVT_SHIFT_COUNT; sdt = h->u.attr.arg & (FST_SDT_ABS_MAX-1); GLOBALS->supplemental_datatypes_encountered = 1; GLOBALS->supplemental_vartypes_encountered |= ((svt != FST_SVT_NONE) && (svt != FST_SVT_VHDL_SIGNAL)); } else if(h->u.attr.subtype == FST_MT_SOURCEISTEM) { uint32_t istem_path_number = (uint32_t)h->u.attr.arg_from_name; uint32_t istem_line_number = (uint32_t)h->u.attr.arg; if(istem_path_number <= GLOBALS->stem_path_string_table_siz) /* prevent overflows from malformed writers */ { GLOBALS->istem_valid = 1; if(!GLOBALS->istem_struct_base) { GLOBALS->istem_struct_base_siz_alloc = 1; GLOBALS->istem_struct_base_siz = 0; GLOBALS->istem_struct_base = malloc_2(GLOBALS->istem_struct_base_siz_alloc * sizeof(struct stem_struct_t)); } if(GLOBALS->istem_struct_base_siz == GLOBALS->istem_struct_base_siz_alloc) { GLOBALS->istem_struct_base_siz_alloc *= 2; GLOBALS->istem_struct_base = realloc_2(GLOBALS->istem_struct_base, GLOBALS->istem_struct_base_siz_alloc * sizeof(struct stem_struct_t)); } GLOBALS->istem_struct_base[GLOBALS->istem_struct_base_siz].stem_idx = istem_path_number - 1; GLOBALS->istem_struct_base[GLOBALS->istem_struct_base_siz].stem_line_number = istem_line_number; GLOBALS->istem_struct_base_siz++; } } else if(h->u.attr.subtype == FST_MT_SOURCESTEM) { uint32_t stem_path_number = (uint32_t)h->u.attr.arg_from_name; uint32_t stem_line_number = (uint32_t)h->u.attr.arg; if(stem_path_number <= GLOBALS->stem_path_string_table_siz) /* prevent overflows from malformed writers */ { GLOBALS->stem_valid = 1; if(!GLOBALS->stem_struct_base) { GLOBALS->stem_struct_base_siz_alloc = 1; GLOBALS->stem_struct_base_siz = 0; GLOBALS->stem_struct_base = malloc_2(GLOBALS->stem_struct_base_siz_alloc * sizeof(struct stem_struct_t)); } if(GLOBALS->stem_struct_base_siz == GLOBALS->stem_struct_base_siz_alloc) { GLOBALS->stem_struct_base_siz_alloc *= 2; GLOBALS->stem_struct_base = realloc_2(GLOBALS->stem_struct_base, GLOBALS->stem_struct_base_siz_alloc * sizeof(struct stem_struct_t)); } GLOBALS->stem_struct_base[GLOBALS->stem_struct_base_siz].stem_idx = stem_path_number - 1; GLOBALS->stem_struct_base[GLOBALS->stem_struct_base_siz].stem_line_number = stem_line_number; GLOBALS->stem_struct_base_siz++; } } else if(h->u.attr.subtype == FST_MT_PATHNAME) { if(h->u.attr.name && ((GLOBALS->stem_path_string_table_siz+1) == h->u.attr.arg)) { /* == check against h->u.attr.arg is a sanity check against the writer */ if(!GLOBALS->stem_path_string_table) { GLOBALS->stem_path_string_table_alloc = 1; GLOBALS->stem_path_string_table_siz = 0; GLOBALS->stem_path_string_table = malloc_2(GLOBALS->stem_path_string_table_alloc * sizeof(char *)); } if(GLOBALS->stem_path_string_table_siz == GLOBALS->stem_path_string_table_alloc) { GLOBALS->stem_path_string_table_alloc *= 2; GLOBALS->stem_path_string_table = realloc_2(GLOBALS->stem_path_string_table, GLOBALS->stem_path_string_table_alloc * sizeof(char *)); } GLOBALS->stem_path_string_table[GLOBALS->stem_path_string_table_siz] = strdup_2(h->u.attr.name); GLOBALS->stem_path_string_table_siz++; } } else if(h->u.attr.subtype == FST_MT_VALUELIST) { if(h->u.attr.name) { /* format is concatenations of [m b xs xe valstring] */ if(GLOBALS->fst_synclock_str) { free_2(GLOBALS->fst_synclock_str); } GLOBALS->fst_synclock_str = strdup_2(h->u.attr.name); } } } break; case FST_HT_ATTREND: break; default: break; } } *namlen = 0; *nam = NULL; return(NULL); } static void fst_append_graft_chain(int len, char *nam, int which, struct tree *par) { struct tree *t = talloc_2(sizeof(struct tree) + len + 1); memcpy(t->name, nam, len+1); t->t_which = which; t->child = par; t->next = GLOBALS->terminals_tchain_tree_c_1; GLOBALS->terminals_tchain_tree_c_1 = t; } /* * mainline */ TimeType fst_main(char *fname, char *skip_start, char *skip_end) { int i; struct Node *n; struct symbol *s, *prevsymroot=NULL, *prevsym=NULL; signed char scale; int numalias = 0; int numvars = 0; struct symbol *sym_block = NULL; struct Node *node_block = NULL; struct fstHier *h = NULL; int msb, lsb; char *nnam = NULL; uint32_t activity_idx, num_activity_changes; struct tree *npar = NULL; char **f_name = NULL; int *f_name_len = NULL, *f_name_max_len = NULL; int allowed_to_autocoalesce; unsigned int nnam_max = 0; int f_name_build_buf_len = 128; char *f_name_build_buf = malloc_2(f_name_build_buf_len + 1); GLOBALS->fst_fst_c_1 = fstReaderOpen(fname); if(!GLOBALS->fst_fst_c_1) { return(LLDescriptor(0)); /* look at GLOBALS->fst_fst_c_1 in caller for success status... */ } /* SPLASH */ splash_create(); allowed_to_autocoalesce = (strstr(fstReaderGetVersionString(GLOBALS->fst_fst_c_1), "Icarus") == NULL); if(!allowed_to_autocoalesce) { GLOBALS->autocoalesce = 0; } scale=(signed char)fstReaderGetTimescale(GLOBALS->fst_fst_c_1); exponent_to_time_scale(scale); f_name = calloc_2(F_NAME_MODULUS+1,sizeof(char *)); f_name_len = calloc_2(F_NAME_MODULUS+1,sizeof(int)); f_name_max_len = calloc_2(F_NAME_MODULUS+1,sizeof(int)); nnam_max = 16; nnam = malloc_2(nnam_max + 1); GLOBALS->fst_filetype = fstReaderGetFileType(GLOBALS->fst_fst_c_1); if(GLOBALS->fst_filetype == FST_FT_VHDL) { GLOBALS->is_vhdl_component_format = 1; } GLOBALS->subvar_jrb = make_jrb(); /* only used for attributes such as generated in VHDL, etc. */ GLOBALS->synclock_jrb = make_jrb(); /* only used for synthetic clocks */ GLOBALS->numfacs=fstReaderGetVarCount(GLOBALS->fst_fst_c_1); GLOBALS->mvlfacs_fst_c_3=(struct fac *)calloc_2(GLOBALS->numfacs,sizeof(struct fac)); GLOBALS->fst_table_fst_c_1=(struct lx2_entry *)calloc_2(GLOBALS->numfacs, sizeof(struct lx2_entry)); sym_block = (struct symbol *)calloc_2(GLOBALS->numfacs, sizeof(struct symbol)); node_block=(struct Node *)calloc_2(GLOBALS->numfacs,sizeof(struct Node)); GLOBALS->facs=(struct symbol **)malloc_2(GLOBALS->numfacs*sizeof(struct symbol *)); GLOBALS->mvlfacs_fst_alias = calloc_2(GLOBALS->numfacs,sizeof(fstHandle)); GLOBALS->mvlfacs_fst_rvs_alias = calloc_2(GLOBALS->numfacs,sizeof(fstHandle)); if(!GLOBALS->fast_tree_sort) { GLOBALS->do_hier_compress = 0; } else { hier_auto_enable(); /* enable if greater than threshold */ } init_facility_pack(); fprintf(stderr, FST_RDLOAD"Processing %d facs.\n", GLOBALS->numfacs); /* SPLASH */ splash_sync(1, 5); GLOBALS->first_cycle_fst_c_3 = (TimeType) fstReaderGetStartTime(GLOBALS->fst_fst_c_1) * GLOBALS->time_scale; GLOBALS->last_cycle_fst_c_3 = (TimeType) fstReaderGetEndTime(GLOBALS->fst_fst_c_1) * GLOBALS->time_scale; GLOBALS->total_cycles_fst_c_3 = GLOBALS->last_cycle_fst_c_3 - GLOBALS->first_cycle_fst_c_3 + 1; GLOBALS->global_time_offset = fstReaderGetTimezero(GLOBALS->fst_fst_c_1) * GLOBALS->time_scale; /* blackout region processing */ num_activity_changes = fstReaderGetNumberDumpActivityChanges(GLOBALS->fst_fst_c_1); for(activity_idx = 0; activity_idx < num_activity_changes; activity_idx++) { uint32_t activity_idx2; uint64_t ct = fstReaderGetDumpActivityChangeTime(GLOBALS->fst_fst_c_1, activity_idx); unsigned char ac = fstReaderGetDumpActivityChangeValue(GLOBALS->fst_fst_c_1, activity_idx); if(ac == 1) continue; if((activity_idx+1) == num_activity_changes) { struct blackout_region_t *bt = calloc_2(1, sizeof(struct blackout_region_t)); bt->bstart = (TimeType)(ct * GLOBALS->time_scale); bt->bend = (TimeType)(GLOBALS->last_cycle_fst_c_3 * GLOBALS->time_scale); bt->next = GLOBALS->blackout_regions; GLOBALS->blackout_regions = bt; /* activity_idx = activity_idx2; */ /* scan-build says is dead + assigned garbage value , which is true : code does not need to mirror for() loop below */ break; } for(activity_idx2 = activity_idx+1; activity_idx2 < num_activity_changes; activity_idx2++) { uint64_t ct2 = fstReaderGetDumpActivityChangeTime(GLOBALS->fst_fst_c_1, activity_idx2); ac = fstReaderGetDumpActivityChangeValue(GLOBALS->fst_fst_c_1, activity_idx2); if((ac == 0) && (activity_idx2 == (num_activity_changes-1))) { ac = 1; ct2 = GLOBALS->last_cycle_fst_c_3; } if(ac == 1) { struct blackout_region_t *bt = calloc_2(1, sizeof(struct blackout_region_t)); bt->bstart = (TimeType)(ct * GLOBALS->time_scale); bt->bend = (TimeType)(ct2 * GLOBALS->time_scale); bt->next = GLOBALS->blackout_regions; GLOBALS->blackout_regions = bt; activity_idx = activity_idx2; break; } } } /* do your stuff here..all useful info has been initialized by now */ if(!GLOBALS->hier_was_explicitly_set) /* set default hierarchy split char */ { GLOBALS->hier_delimeter='.'; } for(i=0;inumfacs;i++) { char buf[65537]; char *str; struct fac *f; int hier_len, name_len, tlen; unsigned char nvt, nvd, ndt; int longest_nam_candidate = 0; char *fnam; int len_subst = 0; h = extractNextVar(GLOBALS->fst_fst_c_1, &msb, &lsb, &nnam, &name_len, &nnam_max); if(!h) { /* this should never happen */ fstReaderIterateHierRewind(GLOBALS->fst_fst_c_1); h = extractNextVar(GLOBALS->fst_fst_c_1, &msb, &lsb, &nnam, &name_len, &nnam_max); } npar = GLOBALS->mod_tree_parent; hier_len = GLOBALS->fst_scope_name ? GLOBALS->fst_scope_name_len : 0; if(hier_len) { tlen = hier_len + 1 + name_len; if(tlen > f_name_max_len[i&F_NAME_MODULUS]) { if(f_name[i&F_NAME_MODULUS]) free_2(f_name[i&F_NAME_MODULUS]); f_name_max_len[i&F_NAME_MODULUS] = tlen; fnam = malloc_2(tlen + 1); } else { fnam = f_name[i&F_NAME_MODULUS]; } memcpy(fnam, GLOBALS->fst_scope_name, hier_len); fnam[hier_len] = GLOBALS->hier_delimeter; memcpy(fnam + hier_len + 1, nnam, name_len + 1); } else { tlen = name_len; if(tlen > f_name_max_len[i&F_NAME_MODULUS]) { if(f_name[i&F_NAME_MODULUS]) free_2(f_name[i&F_NAME_MODULUS]); f_name_max_len[i&F_NAME_MODULUS] = tlen; fnam = malloc_2(tlen + 1); } else { fnam = f_name[i&F_NAME_MODULUS]; } memcpy(fnam, nnam, name_len + 1); } f_name[i&F_NAME_MODULUS] = fnam; f_name_len[i&F_NAME_MODULUS] = tlen; if((h->u.var.length > 1) && (msb == -1) && (lsb == -1)) { node_block[i].msi = h->u.var.length - 1; node_block[i].lsi = 0; } else { int abslen = (msb >= lsb) ? (msb - lsb + 1) : (lsb - msb + 1); if((h->u.var.length > abslen) && !(h->u.var.length % abslen)) /* check if 2d array */ { /* printf("h->u.var.length: %d, abslen: %d '%s'\n", h->u.var.length, abslen, fnam); */ len_subst = 1; } node_block[i].msi = msb; node_block[i].lsi = lsb; } GLOBALS->mvlfacs_fst_c_3[i].len = h->u.var.length; if(h->u.var.length) { switch(h->u.var.direction) { case FST_VD_INPUT: nvd = ND_DIR_IN; GLOBALS->nonimplicit_direction_encountered = 1; break; case FST_VD_OUTPUT: nvd = ND_DIR_OUT; GLOBALS->nonimplicit_direction_encountered = 1; break; case FST_VD_INOUT: nvd = ND_DIR_INOUT; GLOBALS->nonimplicit_direction_encountered = 1; break; case FST_VD_BUFFER: nvd = ND_DIR_BUFFER; GLOBALS->nonimplicit_direction_encountered = 1; break; case FST_VD_LINKAGE: nvd = ND_DIR_LINKAGE; GLOBALS->nonimplicit_direction_encountered = 1; break; case FST_VD_IMPLICIT: default: nvd = ND_DIR_IMPLICIT; break; } switch(h->u.var.typ) { case FST_VT_VCD_EVENT: nvt = ND_VCD_EVENT; break; case FST_VT_VCD_INTEGER: nvt = ND_VCD_INTEGER; break; case FST_VT_VCD_PARAMETER: nvt = ND_VCD_PARAMETER; break; case FST_VT_VCD_REAL: nvt = ND_VCD_REAL; break; case FST_VT_VCD_REAL_PARAMETER: nvt = ND_VCD_REAL_PARAMETER; break; case FST_VT_VCD_REALTIME: nvt = ND_VCD_REALTIME; break; case FST_VT_VCD_REG: nvt = ND_VCD_REG; break; case FST_VT_VCD_SUPPLY0: nvt = ND_VCD_SUPPLY0; break; case FST_VT_VCD_SUPPLY1: nvt = ND_VCD_SUPPLY1; break; case FST_VT_VCD_TIME: nvt = ND_VCD_TIME; break; case FST_VT_VCD_TRI: nvt = ND_VCD_TRI; break; case FST_VT_VCD_TRIAND: nvt = ND_VCD_TRIAND; break; case FST_VT_VCD_TRIOR: nvt = ND_VCD_TRIOR; break; case FST_VT_VCD_TRIREG: nvt = ND_VCD_TRIREG; break; case FST_VT_VCD_TRI0: nvt = ND_VCD_TRI0; break; case FST_VT_VCD_TRI1: nvt = ND_VCD_TRI1; break; case FST_VT_VCD_WAND: nvt = ND_VCD_WAND; break; case FST_VT_VCD_WIRE: nvt = ND_VCD_WIRE; break; case FST_VT_VCD_WOR: nvt = ND_VCD_WOR; break; case FST_VT_VCD_PORT: nvt = ND_VCD_PORT; break; case FST_VT_GEN_STRING: nvt = ND_GEN_STRING; break; case FST_VT_SV_BIT: nvt = ND_SV_BIT; break; case FST_VT_SV_LOGIC: nvt = ND_SV_LOGIC; break; case FST_VT_SV_INT: nvt = ND_SV_INT; break; case FST_VT_SV_SHORTINT: nvt = ND_SV_SHORTINT; break; case FST_VT_SV_LONGINT: nvt = ND_SV_LONGINT; break; case FST_VT_SV_BYTE: nvt = ND_SV_BYTE; break; case FST_VT_SV_ENUM: nvt = ND_SV_ENUM; break; case FST_VT_SV_SHORTREAL: nvt = ND_SV_SHORTREAL; break; default: nvt = ND_UNSPECIFIED_DEFAULT; break; } switch(h->u.var.typ) { case FST_VT_VCD_PARAMETER: case FST_VT_VCD_INTEGER: case FST_VT_SV_INT: case FST_VT_SV_SHORTINT: case FST_VT_SV_LONGINT: GLOBALS->mvlfacs_fst_c_3[i].flags = VZT_RD_SYM_F_INTEGER; break; case FST_VT_VCD_REAL: case FST_VT_VCD_REAL_PARAMETER: case FST_VT_VCD_REALTIME: case FST_VT_SV_SHORTREAL: GLOBALS->mvlfacs_fst_c_3[i].flags = VZT_RD_SYM_F_DOUBLE; break; case FST_VT_GEN_STRING: GLOBALS->mvlfacs_fst_c_3[i].flags = VZT_RD_SYM_F_STRING; GLOBALS->mvlfacs_fst_c_3[i].len = 2; break; default: GLOBALS->mvlfacs_fst_c_3[i].flags = VZT_RD_SYM_F_BITS; break; } } else /* convert any variable length records into strings */ { nvt = ND_GEN_STRING; nvd = ND_DIR_IMPLICIT; GLOBALS->mvlfacs_fst_c_3[i].flags = VZT_RD_SYM_F_STRING; GLOBALS->mvlfacs_fst_c_3[i].len = 2; } if(GLOBALS->fst_synclock_str) { if(GLOBALS->mvlfacs_fst_c_3[i].len == 1) /* currently only for single bit signals */ { Jval syn_jv; GLOBALS->mvlfacs_fst_c_3[i].flags |= VZT_RD_SYM_F_SYNVEC; /* special meaning for this in FST loader--means synthetic signal! */ syn_jv.s = GLOBALS->fst_synclock_str; jrb_insert_int(GLOBALS->synclock_jrb, i, syn_jv); } else { free_2(GLOBALS->fst_synclock_str); } GLOBALS->fst_synclock_str = NULL; /* under malloc_2() control for true if() branch, so not lost */ } if(h->u.var.is_alias) { GLOBALS->mvlfacs_fst_c_3[i].node_alias = h->u.var.handle - 1; /* subtract 1 to scale it with gtkwave-style numbering */ GLOBALS->mvlfacs_fst_c_3[i].flags |= VZT_RD_SYM_F_ALIAS; numalias++; } else { GLOBALS->mvlfacs_fst_rvs_alias[numvars] = i; GLOBALS->mvlfacs_fst_c_3[i].node_alias = numvars; numvars++; } f=GLOBALS->mvlfacs_fst_c_3+i; if((f->len>1)&& (!(f->flags&(VZT_RD_SYM_F_INTEGER|VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING))) ) { int len=sprintf_2_sdd(buf, f_name[(i)&F_NAME_MODULUS],node_block[i].msi, node_block[i].lsi); if(len_subst) /* preserve 2d in name, but make 1d internally */ { node_block[i].msi = h->u.var.length-1; node_block[i].lsi = 0; } longest_nam_candidate = len; if(!GLOBALS->do_hier_compress) { str=malloc_2(len+1); } else { if(len > f_name_build_buf_len) { free_2(f_name_build_buf); f_name_build_buf = malloc_2((f_name_build_buf_len=len)+1); } str = f_name_build_buf; } if(!GLOBALS->alt_hier_delimeter) { memcpy(str, buf, len+1); } else { strcpy_vcdalt(str, buf, GLOBALS->alt_hier_delimeter); } s=&sym_block[i]; symadd_name_exists_sym_exists(s,str,0); prevsymroot = prevsym = NULL; if(GLOBALS->fast_tree_sort) { len = sprintf_2_sdd(buf, nnam,node_block[i].msi, node_block[i].lsi); fst_append_graft_chain(len, buf, i, npar); } } else { int gatecmp = (f->len==1) && (!(f->flags&(VZT_RD_SYM_F_INTEGER|VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING))) && (node_block[i].msi!=-1) && (node_block[i].lsi!=-1); int revcmp = gatecmp && (i) && (f_name_len[(i)&F_NAME_MODULUS] == f_name_len[(i-1)&F_NAME_MODULUS]) && (!memrevcmp(f_name_len[(i)&F_NAME_MODULUS], f_name[(i)&F_NAME_MODULUS], f_name[(i-1)&F_NAME_MODULUS])); if(gatecmp) { int len = sprintf_2_sd(buf, f_name[(i)&F_NAME_MODULUS],node_block[i].msi); longest_nam_candidate = len; if(!GLOBALS->do_hier_compress) { str=malloc_2(len+1); } else { if(len > f_name_build_buf_len) { free_2(f_name_build_buf); f_name_build_buf = malloc_2((f_name_build_buf_len=len)+1); } str = f_name_build_buf; } if(!GLOBALS->alt_hier_delimeter) { memcpy(str, buf, len+1); } else { strcpy_vcdalt(str, buf, GLOBALS->alt_hier_delimeter); } s=&sym_block[i]; symadd_name_exists_sym_exists(s,str,0); if((allowed_to_autocoalesce)&&(prevsym)&&(revcmp)&&(!strchr(f_name[(i)&F_NAME_MODULUS], '\\'))) /* allow chaining for search functions.. */ { prevsym->vec_root = prevsymroot; prevsym->vec_chain = s; s->vec_root = prevsymroot; prevsym = s; } else { prevsymroot = prevsym = s; } if(GLOBALS->fast_tree_sort) { len = sprintf_2_sd(buf, nnam,node_block[i].msi); fst_append_graft_chain(len, buf, i, npar); } } else { int len = f_name_len[(i)&F_NAME_MODULUS]; longest_nam_candidate = len; if(!GLOBALS->do_hier_compress) { str=malloc_2(len+1); } else { if(len > f_name_build_buf_len) { free_2(f_name_build_buf); f_name_build_buf = malloc_2((f_name_build_buf_len=len)+1); } str = f_name_build_buf; } if(!GLOBALS->alt_hier_delimeter) { memcpy(str, f_name[(i)&F_NAME_MODULUS], len+1); } else { strcpy_vcdalt(str, f_name[(i)&F_NAME_MODULUS], GLOBALS->alt_hier_delimeter); } s=&sym_block[i]; symadd_name_exists_sym_exists(s,str,0); prevsymroot = prevsym = NULL; if(f->flags&VZT_RD_SYM_F_INTEGER) { if(f->len != 0) { node_block[i].msi = f->len - 1; node_block[i].lsi = 0; GLOBALS->mvlfacs_fst_c_3[i].len = f->len; } else { node_block[i].msi = 31; node_block[i].lsi = 0; GLOBALS->mvlfacs_fst_c_3[i].len = 32; } } if(GLOBALS->fast_tree_sort) { fst_append_graft_chain(strlen(nnam), nnam, i, npar); } } } if(longest_nam_candidate > GLOBALS->longestname) GLOBALS->longestname = longest_nam_candidate; GLOBALS->facs[i]=&sym_block[i]; n=&node_block[i]; if(GLOBALS->do_hier_compress) { n->nname = compress_facility((unsigned char *)s->name, longest_nam_candidate); /* free_2(s->name); ...removed as f_name_build_buf is now used */ s->name = n->nname; } else { n->nname=s->name; } n->mv.mvlfac = GLOBALS->mvlfacs_fst_c_3+i; GLOBALS->mvlfacs_fst_c_3[i].working_node = n; n->vardir = nvd; n->varxt = h->u.var.sxt_workspace; if((h->u.var.svt_workspace == FST_SVT_NONE) && (h->u.var.sdt_workspace == FST_SDT_NONE)) { n->vartype = nvt; } else { switch(h->u.var.svt_workspace) { case FST_SVT_VHDL_SIGNAL: nvt = ND_VHDL_SIGNAL; break; case FST_SVT_VHDL_VARIABLE: nvt = ND_VHDL_VARIABLE; break; case FST_SVT_VHDL_CONSTANT: nvt = ND_VHDL_CONSTANT; break; case FST_SVT_VHDL_FILE: nvt = ND_VHDL_FILE; break; case FST_SVT_VHDL_MEMORY: nvt = ND_VHDL_MEMORY; break; default: break; /* keep what exists */ } n->vartype = nvt; switch(h->u.var.sdt_workspace) { case FST_SDT_VHDL_BOOLEAN: ndt = ND_VDT_VHDL_BOOLEAN; break; case FST_SDT_VHDL_BIT: ndt = ND_VDT_VHDL_BIT; break; case FST_SDT_VHDL_BIT_VECTOR: ndt = ND_VDT_VHDL_BIT_VECTOR; break; case FST_SDT_VHDL_STD_ULOGIC: ndt = ND_VDT_VHDL_STD_ULOGIC; break; case FST_SDT_VHDL_STD_ULOGIC_VECTOR: ndt = ND_VDT_VHDL_STD_ULOGIC_VECTOR; break; case FST_SDT_VHDL_STD_LOGIC: ndt = ND_VDT_VHDL_STD_LOGIC; break; case FST_SDT_VHDL_STD_LOGIC_VECTOR: ndt = ND_VDT_VHDL_STD_LOGIC_VECTOR; break; case FST_SDT_VHDL_UNSIGNED: ndt = ND_VDT_VHDL_UNSIGNED; break; case FST_SDT_VHDL_SIGNED: ndt = ND_VDT_VHDL_SIGNED; break; case FST_SDT_VHDL_INTEGER: ndt = ND_VDT_VHDL_INTEGER; break; case FST_SDT_VHDL_REAL: ndt = ND_VDT_VHDL_REAL; break; case FST_SDT_VHDL_NATURAL: ndt = ND_VDT_VHDL_NATURAL; break; case FST_SDT_VHDL_POSITIVE: ndt = ND_VDT_VHDL_POSITIVE; break; case FST_SDT_VHDL_TIME: ndt = ND_VDT_VHDL_TIME; break; case FST_SDT_VHDL_CHARACTER: ndt = ND_VDT_VHDL_CHARACTER; break; case FST_SDT_VHDL_STRING: ndt = ND_VDT_VHDL_STRING; break; default: ndt = ND_VDT_NONE; break; } n->vardt = ndt; } if((f->len>1)||(f->flags&(VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING))) { n->extvals = 1; } n->head.time=-1; /* mark 1st node as negative time */ n->head.v.h_val=AN_X; s->n=n; } /* for(i) of facs parsing */ if(f_name_max_len) { free_2(f_name_max_len); f_name_max_len = NULL; } if(nnam) { free_2(nnam); nnam = NULL; } if(f_name_build_buf) { free_2(f_name_build_buf); f_name_build_buf = NULL; } for(i=0;i<=F_NAME_MODULUS;i++) { if(f_name[i]) { free_2(f_name[i]); f_name[i] = NULL; } } free_2(f_name); f_name = NULL; free_2(f_name_len); f_name_len = NULL; if(numvars != GLOBALS->numfacs) { GLOBALS->mvlfacs_fst_rvs_alias = realloc_2(GLOBALS->mvlfacs_fst_rvs_alias, numvars * sizeof(fstHandle)); } if(GLOBALS->subvar_jrb_count) /* generate lookup table for typenames explicitly given as attributes */ { JRB subvar_jrb_node = NULL; GLOBALS->subvar_pnt = calloc_2(GLOBALS->subvar_jrb_count + 1, sizeof(char *)); jrb_traverse(subvar_jrb_node, GLOBALS->subvar_jrb) { GLOBALS->subvar_pnt[subvar_jrb_node->val.ui] = subvar_jrb_node->key.s; } } if(GLOBALS->istem_struct_base) { if(GLOBALS->istem_struct_base_siz != GLOBALS->istem_struct_base_siz_alloc) { GLOBALS->istem_struct_base_siz_alloc = GLOBALS->istem_struct_base_siz; GLOBALS->istem_struct_base = realloc_2(GLOBALS->istem_struct_base, GLOBALS->istem_struct_base_siz_alloc * sizeof(struct stem_struct_t)); } } if(GLOBALS->stem_struct_base) { if(GLOBALS->stem_struct_base_siz != GLOBALS->stem_struct_base_siz_alloc) { GLOBALS->stem_struct_base_siz_alloc = GLOBALS->stem_struct_base_siz; GLOBALS->stem_struct_base = realloc_2(GLOBALS->stem_struct_base, GLOBALS->stem_struct_base_siz_alloc * sizeof(struct stem_struct_t)); } } if(GLOBALS->stem_path_string_table) { if(GLOBALS->stem_path_string_table_siz != GLOBALS->stem_path_string_table_alloc) { GLOBALS->stem_path_string_table_alloc = GLOBALS->stem_path_string_table_siz; GLOBALS->stem_path_string_table = realloc_2(GLOBALS->stem_path_string_table, GLOBALS->stem_path_string_table_alloc * sizeof(char *)); } } decorated_module_cleanup(); /* ...also now in gtk2_treesearch.c */ freeze_facility_pack(); iter_through_comp_name_table(); fprintf(stderr, FST_RDLOAD"Built %d signal%s and %d alias%s.\n", numvars, (numvars == 1) ? "" : "s", numalias, (numalias == 1) ? "" : "es"); GLOBALS->fst_maxhandle = numvars; if(GLOBALS->fast_tree_sort) { /* SPLASH */ splash_sync(2, 5); fprintf(stderr, FST_RDLOAD"Building facility hierarchy tree.\n"); init_tree(); treegraft(&GLOBALS->treeroot); /* SPLASH */ splash_sync(3, 5); fprintf(stderr, FST_RDLOAD"Sorting facility hierarchy tree.\n"); treesort(GLOBALS->treeroot, NULL); /* SPLASH */ splash_sync(4, 5); order_facs_from_treesort(GLOBALS->treeroot, &GLOBALS->facs); /* SPLASH */ splash_sync(5, 5); GLOBALS->facs_are_sorted=1; } else { /* SPLASH */ splash_sync(2, 5); for(i=0;inumfacs;i++) { char *subst, ch; int esc = 0; subst=GLOBALS->facs[i]->name; while((ch=(*subst))) { #ifdef WAVE_HIERFIX if(ch==GLOBALS->hier_delimeter) { *subst=(!esc) ? VCDNAM_HIERSORT : VCDNAM_ESCAPE; } /* forces sort at hier boundaries */ #else if((ch==GLOBALS->hier_delimeter)&&(esc)) { *subst = VCDNAM_ESCAPE; } /* forces sort at hier boundaries */ #endif else if(ch=='\\') { esc = 1; GLOBALS->escaped_names_found_vcd_c_1 = 1; } subst++; } } /* SPLASH */ splash_sync(3, 5); fprintf(stderr, FST_RDLOAD"Sorting facilities at hierarchy boundaries.\n"); wave_heapsort(GLOBALS->facs,GLOBALS->numfacs); #ifdef WAVE_HIERFIX for(i=0;inumfacs;i++) { char *subst, ch; subst=GLOBALS->facs[i]->name; while((ch=(*subst))) { if(ch==VCDNAM_HIERSORT) { *subst=GLOBALS->hier_delimeter; } /* restore back to normal */ subst++; } } #endif GLOBALS->facs_are_sorted=1; /* SPLASH */ splash_sync(4, 5); fprintf(stderr, FST_RDLOAD"Building facility hierarchy tree.\n"); init_tree(); for(i=0;inumfacs;i++) { char *nf = GLOBALS->facs[i]->name; build_tree_from_name(nf, i); } /* SPLASH */ splash_sync(5, 5); if(GLOBALS->escaped_names_found_vcd_c_1) { for(i=0;inumfacs;i++) { char *subst, ch; subst=GLOBALS->facs[i]->name; while((ch=(*subst))) { if(ch==VCDNAM_ESCAPE) { *subst=GLOBALS->hier_delimeter; } /* restore back to normal */ subst++; } } } treegraft(&GLOBALS->treeroot); treesort(GLOBALS->treeroot, NULL); if(GLOBALS->escaped_names_found_vcd_c_1) { treenamefix(GLOBALS->treeroot); } } #if 0 { int num_dups = 0; for(i=0;inumfacs-1;i++) { if(!strcmp(GLOBALS->facs[i]->name, GLOBALS->facs[i+1]->name)) { fprintf(stderr, FST_RDLOAD"DUPLICATE FAC: '%s'\n", GLOBALS->facs[i]->name); num_dups++; } } if(num_dups) { fprintf(stderr, FST_RDLOAD"Exiting, %d duplicate signals are present.\n", num_dups); exit(255); } } #endif GLOBALS->min_time = GLOBALS->first_cycle_fst_c_3; GLOBALS->max_time=GLOBALS->last_cycle_fst_c_3; GLOBALS->is_lx2 = LXT2_IS_FST; if(skip_start || skip_end) { TimeType b_start, b_end; if(!skip_start) b_start = GLOBALS->min_time; else b_start = unformat_time(skip_start, GLOBALS->time_dimension); if(!skip_end) b_end = GLOBALS->max_time; else b_end = unformat_time(skip_end, GLOBALS->time_dimension); if(b_startmin_time) b_start = GLOBALS->min_time; else if(b_start>GLOBALS->max_time) b_start = GLOBALS->max_time; if(b_endmin_time) b_end = GLOBALS->min_time; else if(b_end>GLOBALS->max_time) b_end = GLOBALS->max_time; if(b_start > b_end) { TimeType tmp_time = b_start; b_start = b_end; b_end = tmp_time; } fstReaderSetLimitTimeRange(GLOBALS->fst_fst_c_1, b_start, b_end); GLOBALS->min_time = b_start; GLOBALS->max_time = b_end; } fstReaderIterBlocksSetNativeDoublesOnCallback(GLOBALS->fst_fst_c_1, 1); /* to avoid bin -> ascii -> bin double swap */ /* SPLASH */ splash_finalize(); return(GLOBALS->max_time); } /* * conversion from evcd -> vcd format */ static void evcd_memcpy(char *dst, const char *src, int len) { static const char *evcd="DUNZduLHXTlh01?FAaBbCcf"; static const char *vcd="01xz0101xz0101xzxxxxxxz"; char ch; int i, j; for(j=0;jmvlfacs_fst_rvs_alias[--txidx]; struct HistEnt *htemp; struct lx2_entry *l2e = GLOBALS->fst_table_fst_c_1+facidx; struct fac *f = GLOBALS->mvlfacs_fst_c_3+facidx; GLOBALS->busycnt_fst_c_2++; if(GLOBALS->busycnt_fst_c_2==WAVE_BUSY_ITER) { busy_window_refresh(); GLOBALS->busycnt_fst_c_2 = 0; } /* fprintf(stderr, "%lld %d '%s'\n", tim, facidx, value); */ if(!(f->flags&(VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING))) { unsigned char vt = ND_UNSPECIFIED_DEFAULT; if(f->working_node) { vt = f->working_node->vartype; } if(f->len>1) { char *h_vector = (char *)malloc_2(f->len); if(vt != ND_VCD_PORT) { memcpy(h_vector, value, f->len); } else { evcd_memcpy(h_vector, (const char *)value, f->len); } if((l2e->histent_curr)&&(l2e->histent_curr->v.h_vector)) /* remove duplicate values */ { if((!memcmp(l2e->histent_curr->v.h_vector, h_vector, f->len))&&(!GLOBALS->vcd_preserve_glitches)) { free_2(h_vector); return; } } htemp = histent_calloc(); htemp->v.h_vector = h_vector; } else { unsigned char h_val; if(vt != ND_VCD_PORT) { switch(*value) { case '0': h_val = AN_0; break; case '1': h_val = AN_1; break; case 'X': case 'x': h_val = AN_X; break; case 'Z': case 'z': h_val = AN_Z; break; case 'H': case 'h': h_val = AN_H; break; case 'U': case 'u': h_val = AN_U; break; case 'W': case 'w': h_val = AN_W; break; case 'L': case 'l': h_val = AN_L; break; case '-': h_val = AN_DASH; break; default: h_val = AN_X; break; } } else { char membuf[1]; evcd_memcpy(membuf, (const char *)value, 1); switch(*membuf) { case '0': h_val = AN_0; break; case '1': h_val = AN_1; break; case 'Z': case 'z': h_val = AN_Z; break; default: h_val = AN_X; break; } } if((vt != ND_VCD_EVENT) && (l2e->histent_curr)) /* remove duplicate values */ { if((l2e->histent_curr->v.h_val == h_val) && (!GLOBALS->vcd_preserve_glitches)) { return; } } htemp = histent_calloc(); htemp->v.h_val = h_val; } } else if(f->flags&VZT_RD_SYM_F_DOUBLE) { if((l2e->histent_curr)&&(l2e->histent_curr->v.h_vector)) /* remove duplicate values */ { #ifdef WAVE_HAS_H_DOUBLE if(!memcmp(&l2e->histent_curr->v.h_double, value, sizeof(double))) #else if(!memcmp(l2e->histent_curr->v.h_vector, value, sizeof(double))) #endif { if((!GLOBALS->vcd_preserve_glitches)&&(!GLOBALS->vcd_preserve_glitches_real)) { return; } } } /* if(fstReaderIterBlocksSetNativeDoublesOnCallback is disabled...) double *d = double_slab_calloc(); sscanf(value, "%lg", d); htemp = histent_calloc(); htemp->v.h_vector = (char *)d; otherwise... */ htemp = histent_calloc(); #ifdef WAVE_HAS_H_DOUBLE memcpy(&htemp->v.h_double, value, sizeof(double)); #else htemp->v.h_vector = double_slab_calloc(); memcpy(htemp->v.h_vector, value, sizeof(double)); #endif htemp->flags = HIST_REAL; } else /* string */ { unsigned char *s = malloc_2(plen + 1); uint32_t pidx; for(pidx=0;pidx '~')) { ch = '.'; } #endif s[pidx] = ch; } s[pidx] = 0; if((l2e->histent_curr)&&(l2e->histent_curr->v.h_vector)) /* remove duplicate values */ { if((!strcmp(l2e->histent_curr->v.h_vector, (const char *)value)) && (!GLOBALS->vcd_preserve_glitches)) { free(s); return; } } htemp = histent_calloc(); htemp->v.h_vector = (char *)s; htemp->flags = HIST_REAL|HIST_STRING; } htemp->time = (tim) * (GLOBALS->time_scale); if(l2e->histent_curr) /* scan-build : was l2e->histent_head */ { l2e->histent_curr->next = htemp; /* scan-build : this is ok given how it's used */ l2e->histent_curr = htemp; } else { l2e->histent_head = l2e->histent_curr = htemp; } l2e->numtrans++; } static void fst_callback(void *user_callback_data_pointer, uint64_t tim, fstHandle txidx, const unsigned char *value) { fst_callback2(user_callback_data_pointer, tim, txidx, value, 0); } /* * this is the black magic that handles aliased signals... */ static void fst_resolver(nptr np, nptr resolve) { np->extvals = resolve->extvals; np->msi = resolve->msi; np->lsi = resolve->lsi; memcpy(&np->head, &resolve->head, sizeof(struct HistEnt)); np->curr = resolve->curr; np->harray = resolve->harray; np->numhist = resolve->numhist; np->mv.mvlfac=NULL; } /* * actually import a fst trace but don't do it if it's already been imported */ void import_fst_trace(nptr np) { hptr htemp, htempx=NULL, histent_tail; int len, i; struct fac *f; int txidx; nptr nold = np; if(!(f=np->mv.mvlfac)) return; /* already imported */ txidx = f - GLOBALS->mvlfacs_fst_c_3; if(np->mv.mvlfac->flags&VZT_RD_SYM_F_ALIAS) { txidx = GLOBALS->mvlfacs_fst_c_3[txidx].node_alias; /* this is to map to fstHandles, so even non-aliased are remapped */ txidx = GLOBALS->mvlfacs_fst_rvs_alias[txidx]; np = GLOBALS->mvlfacs_fst_c_3[txidx].working_node; if(!(f=np->mv.mvlfac)) { fst_resolver(nold, np); return; /* already imported */ } } if(!(f->flags&VZT_RD_SYM_F_SYNVEC)) /* block debug message for synclk */ { int flagged = HIER_DEPACK_STATIC; char *str = hier_decompress_flagged(np->nname, &flagged); fprintf(stderr, "Import: %s\n", str); /* normally this never happens */ } /* new stuff */ len = np->mv.mvlfac->len; /* check here for array height in future */ if(!(f->flags&VZT_RD_SYM_F_SYNVEC)) { fstReaderSetFacProcessMask(GLOBALS->fst_fst_c_1, GLOBALS->mvlfacs_fst_c_3[txidx].node_alias+1); fstReaderIterBlocks2(GLOBALS->fst_fst_c_1, fst_callback, fst_callback2, NULL, NULL); fstReaderClrFacProcessMask(GLOBALS->fst_fst_c_1, GLOBALS->mvlfacs_fst_c_3[txidx].node_alias+1); } histent_tail = htemp = histent_calloc(); if(len>1) { htemp->v.h_vector = (char *)malloc_2(len); for(i=0;iv.h_vector[i] = AN_Z; } else { htemp->v.h_val = AN_Z; /* z */ } htemp->time = MAX_HISTENT_TIME; htemp = histent_calloc(); if(len>1) { if(!(f->flags&VZT_RD_SYM_F_DOUBLE)) { if(!(f->flags&VZT_RD_SYM_F_STRING)) { htemp->v.h_vector = (char *)malloc_2(len); for(i=0;iv.h_vector[i] = AN_X; } else { htemp->v.h_vector = strdup_2("UNDEF"); htemp->flags = HIST_REAL|HIST_STRING; } } else { #ifdef WAVE_HAS_H_DOUBLE htemp->v.h_double = strtod("NaN", NULL); #else double *d = malloc_2(sizeof(double)); *d = strtod("NaN", NULL); htemp->v.h_vector = (char *)d; #endif htemp->flags = HIST_REAL; } htempx = htemp; } else { htemp->v.h_val = AN_X; /* x */ } htemp->time = MAX_HISTENT_TIME-1; htemp->next = histent_tail; if(GLOBALS->fst_table_fst_c_1[txidx].histent_curr) { GLOBALS->fst_table_fst_c_1[txidx].histent_curr->next = htemp; htemp = GLOBALS->fst_table_fst_c_1[txidx].histent_head; } if(!(f->flags&(VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING))) { if(len>1) { np->head.v.h_vector = (char *)malloc_2(len); for(i=0;ihead.v.h_vector[i] = AN_X; } else { np->head.v.h_val = AN_X; /* x */ } } else { np->head.flags = HIST_REAL; if(f->flags&VZT_RD_SYM_F_STRING) { np->head.flags |= HIST_STRING; } } { struct HistEnt *htemp2 = histent_calloc(); htemp2->time = -1; if(len>1) { htemp2->v.h_vector = htempx->v.h_vector; htemp2->flags = htempx->flags; } else { htemp2->v.h_val = htemp->v.h_val; } htemp2->next = htemp; htemp = htemp2; GLOBALS->fst_table_fst_c_1[txidx].numtrans++; } np->head.time = -2; np->head.next = htemp; np->numhist=GLOBALS->fst_table_fst_c_1[txidx].numtrans +2 /*endcap*/ +1 /*frontcap*/; memset(GLOBALS->fst_table_fst_c_1+txidx, 0, sizeof(struct lx2_entry)); /* zero it out */ np->curr = histent_tail; np->mv.mvlfac = NULL; /* it's imported and cached so we can forget it's an mvlfac now */ if(nold!=np) { fst_resolver(nold, np); } } /* * decompress [m b xs xe valstring]... format string into trace */ static void expand_synvec(int txidx, const char *s) { char *scopy = NULL; char *pnt, *pnt2; double m, b; uint64_t xs, xe, xi; char *vs; uint64_t tim; uint64_t tim_max; int vslen; int vspnt; unsigned char value[2] = {0, 0}; unsigned char pval = 0; scopy = strdup_2(s); vs = calloc_2(1, strlen(s) + 1); /* will never be as big as original string */ pnt = scopy; while(*pnt) { if(*pnt != '[') { pnt++; continue; } pnt++; pnt2 = strchr(pnt, ']'); if(!pnt2) break; *pnt2 = 0; /* printf("PNT: %s\n", pnt); */ int rc = sscanf(pnt, "%lg %lg %"SCNu64" %"SCNu64" %s", &m, &b, &xs, &xe, vs); if(rc == 5) { vslen = strlen(vs); vspnt = 0; tim_max = 0; for(xi = xs; xi <= xe; xi++) { tim = (xi * m) + b; /* fprintf(stderr, "#%"PRIu64" '%c'\n", tim, vs[vspnt]); */ value[0] = vs[vspnt]; if(value[0] != pval) /* collapse new == old value transitions so new is ignored */ { if((tim >= tim_max) || (xi == xs)) { fst_callback2(NULL, tim, txidx, value, 0); tim_max = tim; } pval = value[0]; } vspnt++; vspnt = (vspnt == vslen) ? 0 : vspnt; /* modulus on repeating clock */ } } else { break; } pnt = pnt2 + 1; } free_2(vs); free_2(scopy); } /* * pre-import many traces at once so function above doesn't have to iterate... */ void fst_set_fac_process_mask(nptr np) { struct fac *f; int txidx; if(!(f=np->mv.mvlfac)) return; /* already imported */ txidx = f-GLOBALS->mvlfacs_fst_c_3; if(np->mv.mvlfac->flags&VZT_RD_SYM_F_ALIAS) { txidx = GLOBALS->mvlfacs_fst_c_3[txidx].node_alias; txidx = GLOBALS->mvlfacs_fst_rvs_alias[txidx]; np = GLOBALS->mvlfacs_fst_c_3[txidx].working_node; if(!(np->mv.mvlfac)) return; /* already imported */ } if(np->mv.mvlfac->flags&VZT_RD_SYM_F_SYNVEC) { JRB fi = jrb_find_int(GLOBALS->synclock_jrb, txidx); if(fi) { expand_synvec(GLOBALS->mvlfacs_fst_c_3[txidx].node_alias+1, fi->val.s); import_fst_trace(np); return; /* import_fst_trace() will construct the trailer */ } } /* check here for array height in future */ { fstReaderSetFacProcessMask(GLOBALS->fst_fst_c_1, GLOBALS->mvlfacs_fst_c_3[txidx].node_alias+1); GLOBALS->fst_table_fst_c_1[txidx].np = np; } } void fst_import_masked(void) { unsigned int txidxi; int i, cnt; hptr htempx = NULL; cnt = 0; for(txidxi=0;txidxifst_maxhandle;txidxi++) { if(fstReaderGetFacProcessMask(GLOBALS->fst_fst_c_1, txidxi+1)) { cnt++; } } if(!cnt) { return; } if(cnt>100) { fprintf(stderr, FST_RDLOAD"Extracting %d traces\n", cnt); } set_window_busy(NULL); fstReaderIterBlocks2(GLOBALS->fst_fst_c_1, fst_callback, fst_callback2, NULL, NULL); set_window_idle(NULL); for(txidxi=0;txidxifst_maxhandle;txidxi++) { if(fstReaderGetFacProcessMask(GLOBALS->fst_fst_c_1, txidxi+1)) { int txidx = GLOBALS->mvlfacs_fst_rvs_alias[txidxi]; struct HistEnt *htemp, *histent_tail; struct fac *f = GLOBALS->mvlfacs_fst_c_3+txidx; int len = f->len; nptr np = GLOBALS->fst_table_fst_c_1[txidx].np; histent_tail = htemp = histent_calloc(); if(len>1) { htemp->v.h_vector = (char *)malloc_2(len); for(i=0;iv.h_vector[i] = AN_Z; } else { htemp->v.h_val = AN_Z; /* z */ } htemp->time = MAX_HISTENT_TIME; htemp = histent_calloc(); if(len>1) { if(!(f->flags&VZT_RD_SYM_F_DOUBLE)) { if(!(f->flags&VZT_RD_SYM_F_STRING)) { htemp->v.h_vector = (char *)malloc_2(len); for(i=0;iv.h_vector[i] = AN_X; } else { htemp->v.h_vector = strdup_2("UNDEF"); htemp->flags = HIST_REAL|HIST_STRING; } htempx = htemp; } else { #ifdef WAVE_HAS_H_DOUBLE htemp->v.h_double = strtod("NaN", NULL); #else double *d = malloc_2(sizeof(double)); *d = strtod("NaN", NULL); htemp->v.h_vector = (char *)d; #endif htemp->flags = HIST_REAL; htempx = htemp; } } else { htemp->v.h_val = AN_X; /* x */ } htemp->time = MAX_HISTENT_TIME-1; htemp->next = histent_tail; if(GLOBALS->fst_table_fst_c_1[txidx].histent_curr) { GLOBALS->fst_table_fst_c_1[txidx].histent_curr->next = htemp; htemp = GLOBALS->fst_table_fst_c_1[txidx].histent_head; } if(!(f->flags&(VZT_RD_SYM_F_DOUBLE|VZT_RD_SYM_F_STRING))) { if(len>1) { np->head.v.h_vector = (char *)malloc_2(len); for(i=0;ihead.v.h_vector[i] = AN_X; } else { np->head.v.h_val = AN_X; /* x */ } } else { np->head.flags = HIST_REAL; if(f->flags&VZT_RD_SYM_F_STRING) { np->head.flags |= HIST_STRING; } } { struct HistEnt *htemp2 = histent_calloc(); htemp2->time = -1; if(len>1) { htemp2->v.h_vector = htempx->v.h_vector; htemp2->flags = htempx->flags; } else { htemp2->v.h_val = htemp->v.h_val; } htemp2->next = htemp; htemp = htemp2; GLOBALS->fst_table_fst_c_1[txidx].numtrans++; } np->head.time = -2; np->head.next = htemp; np->numhist=GLOBALS->fst_table_fst_c_1[txidx].numtrans +2 /*endcap*/ +1 /*frontcap*/; memset(GLOBALS->fst_table_fst_c_1+txidx, 0, sizeof(struct lx2_entry)); /* zero it out */ np->curr = histent_tail; np->mv.mvlfac = NULL; /* it's imported and cached so we can forget it's an mvlfac now */ fstReaderClrFacProcessMask(GLOBALS->fst_fst_c_1, txidxi+1); } } } gtkwave-3.3.86/src/wavewindow.h0000664000175000017500000000164113166335473015740 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010 * * 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. */ #ifndef WAVE_WAVEWINDOW_H #define WAVE_WAVEWINDOW_H void button_press_release_common(void); void UpdateSigValue(Trptr t); void MaxSignalLength(void); void MaxSignalLength_2(char dirty_kick); /* used to resize but not fully recalculate like MaxSignalLength() */ void RenderSigs(int trtarget, int update_waves); int RenderSig(Trptr t, int i, int dobackground); void populateBuffer(Trptr t, char *altname, char* buf); void calczoom(double z0); void make_sigarea_gcs(GtkWidget *widget); void force_screengrab_gcs(void); void force_normal_gcs(void); gint wavearea_configure_event(GtkWidget *widget, GdkEventConfigure *event); #endif gtkwave-3.3.86/src/markerbox.h0000664000175000017500000000164313166335473015542 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010-2014 * * 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. */ #ifndef WAVE_MARKERBOX_H #define WAVE_MARKERBOX_H #ifdef WAVE_MANYMARKERS_MODE /* 702 will go from A-Z, AA-AZ, ... , ZA-ZZ */ /* this is a bijective name similar to the columns on spreadsheets */ /* the upper count is (practically) unbounded */ #define WAVE_NUM_NAMED_MARKERS (702) #else /* do not go less than 26! */ #define WAVE_NUM_NAMED_MARKERS (26) #endif void markerbox(char *title, GtkSignalFunc func); char *make_bijective_marker_id_string(char *buf, unsigned int value); unsigned int bijective_marker_id_string_hash(const char *so); unsigned int bijective_marker_id_string_len(const char *s); #endif gtkwave-3.3.86/src/gtk12compat.h0000664000175000017500000000166213166335473015705 0ustar bybellbybell#ifndef WAVE_GTK12COMPAT_H #define WAVE_GTK12COMPAT_H #ifdef MAC_INTEGRATION /* #undef WAVE_ALLOW_QUARTZ_FLUSH_WORKAROUND */ #endif #if WAVE_USE_GTK2 #define WAVE_GTKIFE(a,b,c,d,e) {a,b,c,d,e,NULL} #define WAVE_GDK_GET_POINTER(a,b,c,bi,ci,d) gdk_window_get_pointer(a,bi,ci,d) #define WAVE_GDK_GET_POINTER_COPY x=xi; y=yi; #define WAVE_GTK_SFUNCAST(x) ((void (*)(GtkWidget *, gpointer))(x)) #else #if !defined __MINGW32__ && !defined _MSC_VER #ifndef G_CONST_RETURN #define G_CONST_RETURN #endif #endif #define WAVE_GTKIFE(a,b,c,d,e) {a,b,c,d,e} #define WAVE_GDK_GET_POINTER(a,b,c,bi,ci,d) gdk_input_window_get_pointer(a, event->deviceid, b, c, NULL, NULL, NULL, d) #define WAVE_GDK_GET_POINTER_COPY #define WAVE_GTK_SIGFONT wavearea->style->font #define WAVE_GTK_WAVEFONT wavearea->style->font #define WAVE_GTK_SFUNCAST(x) ((GtkSignalFunc)(x)) #define gtk_notebook_set_current_page(n,p) gtk_notebook_set_page((n),(p)) #endif #endif gtkwave-3.3.86/src/gconf.h0000664000175000017500000000153413166335473014643 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2012. * * 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. */ #ifndef WAVE_GCONF_H #define WAVE_GCONF_H #include #include #include #include #ifdef WAVE_HAVE_GCONF #include #endif #define WAVE_GCONF_DIR "/com.geda.gtkwave" /* 12345678901234567 */ #define WAVE_GCONF_DIR_LEN (17) int wave_rpc_id; void wave_gconf_init(int argc, char **argv); gboolean wave_gconf_client_set_string(const gchar *key, const gchar *val); void wave_gconf_restore(char **dumpfile, char **savefile, char **rcfile, char **wave_pwd, int *opt_vcd); #endif gtkwave-3.3.86/src/fst.h0000664000175000017500000000122213166335473014335 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2009. * * 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. */ #include "globals.h" #ifndef WAVE_FSTRDR_H #define WAVE_FSTRDR_H #ifdef HAVE_INTTYPES_H #include #endif #include "vcd.h" #include "ae2.h" #include "tree_component.h" TimeType fst_main(char *fname, char *skip_start, char *skip_end); void import_fst_trace(nptr np); void fst_set_fac_process_mask(nptr np); void fst_import_masked(void); #endif gtkwave-3.3.86/src/cocoa/0000775000175000017500000000000013166335473014457 5ustar bybellbybellgtkwave-3.3.86/src/cocoa/Makefile.in0000664000175000017500000004733513166335473016540 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = src/cocoa DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libgtkwmacintegration_a_AR = $(AR) $(ARFLAGS) libgtkwmacintegration_a_LIBADD = am_libgtkwmacintegration_a_OBJECTS = \ libgtkwmacintegration_a-cocoa_misc.$(OBJEXT) libgtkwmacintegration_a_OBJECTS = \ $(am_libgtkwmacintegration_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgtkwmacintegration_a_SOURCES) DIST_SOURCES = $(libgtkwmacintegration_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libgtkwmacintegration.a libgtkwmacintegration_a_CFLAGS = $(COCOA_GTK_CFLAGS) $(GTK_CFLAGS) $(GTK_MAC_CFLAGS) libgtkwmacintegration_a_OBJCFLAGS = libgtkwmacintegration_a_SOURCES = cocoa_misc.c cocoa_misc.h # I'm listing these here instead of in SOURCES because we don't directly # compile them. Rather it is #include'd by cocoa_misc.c EXTRA_DIST = alert_sheet.m alert_sheet.h all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/cocoa/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/cocoa/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libgtkwmacintegration.a: $(libgtkwmacintegration_a_OBJECTS) $(libgtkwmacintegration_a_DEPENDENCIES) $(EXTRA_libgtkwmacintegration_a_DEPENDENCIES) $(AM_V_at)-rm -f libgtkwmacintegration.a $(AM_V_AR)$(libgtkwmacintegration_a_AR) libgtkwmacintegration.a $(libgtkwmacintegration_a_OBJECTS) $(libgtkwmacintegration_a_LIBADD) $(AM_V_at)$(RANLIB) libgtkwmacintegration.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgtkwmacintegration_a-cocoa_misc.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` libgtkwmacintegration_a-cocoa_misc.o: cocoa_misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtkwmacintegration_a_CFLAGS) $(CFLAGS) -MT libgtkwmacintegration_a-cocoa_misc.o -MD -MP -MF $(DEPDIR)/libgtkwmacintegration_a-cocoa_misc.Tpo -c -o libgtkwmacintegration_a-cocoa_misc.o `test -f 'cocoa_misc.c' || echo '$(srcdir)/'`cocoa_misc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgtkwmacintegration_a-cocoa_misc.Tpo $(DEPDIR)/libgtkwmacintegration_a-cocoa_misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cocoa_misc.c' object='libgtkwmacintegration_a-cocoa_misc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtkwmacintegration_a_CFLAGS) $(CFLAGS) -c -o libgtkwmacintegration_a-cocoa_misc.o `test -f 'cocoa_misc.c' || echo '$(srcdir)/'`cocoa_misc.c libgtkwmacintegration_a-cocoa_misc.obj: cocoa_misc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtkwmacintegration_a_CFLAGS) $(CFLAGS) -MT libgtkwmacintegration_a-cocoa_misc.obj -MD -MP -MF $(DEPDIR)/libgtkwmacintegration_a-cocoa_misc.Tpo -c -o libgtkwmacintegration_a-cocoa_misc.obj `if test -f 'cocoa_misc.c'; then $(CYGPATH_W) 'cocoa_misc.c'; else $(CYGPATH_W) '$(srcdir)/cocoa_misc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgtkwmacintegration_a-cocoa_misc.Tpo $(DEPDIR)/libgtkwmacintegration_a-cocoa_misc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cocoa_misc.c' object='libgtkwmacintegration_a-cocoa_misc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtkwmacintegration_a_CFLAGS) $(CFLAGS) -c -o libgtkwmacintegration_a-cocoa_misc.obj `if test -f 'cocoa_misc.c'; then $(CYGPATH_W) 'cocoa_misc.c'; else $(CYGPATH_W) '$(srcdir)/cocoa_misc.c'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/src/cocoa/alert_sheet.h0000664000175000017500000000152613166335473017133 0ustar bybellbybell// // NSAlert+SynchronousSheet.h // // Created by Philipp Mayerhofer on 6/10/11. // Copyright 2011 Incredible Bee Ltd. Released under the New BSD License. // #import /** * Category to allow NSAlert instances to be run synchronously as sheets. */ @interface NSAlert (SynchronousSheet) /** * Runs the receiver modally as an alert sheet attached to a specified window * and returns the constant positionally identifying the button clicked. * * \param aWindow The parent window for the sheet * * \return Response to the alert. See "Button Return Values" in Apple's NSAlert * documentation. */ -(NSInteger) runModalSheetForWindow:(NSWindow *)aWindow; /** * Runs the receiver modally as an alert sheet attached to the main window * and returns the constant positionally identifying the button clicked. */ -(NSInteger) runModalSheet; @end gtkwave-3.3.86/src/cocoa/cocoa_misc.h0000664000175000017500000000145113166335473016730 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2012. * * 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. */ #ifndef __COCOA_MISC_H__ #define __COCOA_MISC_H__ #ifdef WAVE_COCOA_GTK #import #endif #include void gtk_open_external_file(const char *fpath); char *gtk_file_req_bridge(const char *title, const char *fpath, const char *pattn, int is_writemode); int gtk_simplereqbox_req_bridge(char *title, char *default_text, char *oktext, char *canceltext, int is_alert); int entrybox_req_bridge(char *title, int width, char *dflt_text, char *comment, int maxch, char **out_text_entry); #endif gtkwave-3.3.86/src/cocoa/Makefile.am0000664000175000017500000000065513166335473016521 0ustar bybellbybell## -*- makefile -*- ## noinst_LIBRARIES= libgtkwmacintegration.a libgtkwmacintegration_a_CFLAGS = $(COCOA_GTK_CFLAGS) $(GTK_CFLAGS) $(GTK_MAC_CFLAGS) libgtkwmacintegration_a_OBJCFLAGS = libgtkwmacintegration_a_SOURCES = cocoa_misc.c cocoa_misc.h # I'm listing these here instead of in SOURCES because we don't directly # compile them. Rather it is #include'd by cocoa_misc.c EXTRA_DIST= alert_sheet.m alert_sheet.h gtkwave-3.3.86/src/cocoa/alert_sheet.m0000664000175000017500000000501113166335473017131 0ustar bybellbybell// // NSAlert+SynchronousSheet.h // // Created by Philipp Mayerhofer on 6/10/11. // Copyright 2011 Incredible Bee Ltd. Released under the New BSD License. // #import "alert_sheet.h" // Private methods -- use prefixes to avoid collisions with Apple's methods @interface NSAlert () -(IBAction) BE_stopSynchronousSheet:(id)sender; // hide sheet & stop modal -(void) BE_beginSheetModalForWindow:(NSWindow *)aWindow; @end @implementation NSAlert (SynchronousSheet) -(NSInteger) runModalSheetForWindow:(NSWindow *)aWindow { // Set ourselves as the target for button clicks for (NSButton *button in [self buttons]) { [button setTarget:self]; [button setAction:@selector(BE_stopSynchronousSheet:)]; } // Bring up the sheet and wait until stopSynchronousSheet is triggered by a button click [self performSelectorOnMainThread:@selector(BE_beginSheetModalForWindow:) withObject:aWindow waitUntilDone:YES]; NSInteger modalCode = [NSApp runModalForWindow:[self window]]; // This is called only after stopSynchronousSheet is called (that is, // one of the buttons is clicked) [NSApp performSelectorOnMainThread:@selector(endSheet:) withObject:[self window] waitUntilDone:YES]; // Remove the sheet from the screen [[self window] performSelectorOnMainThread:@selector(orderOut:) withObject:self waitUntilDone:YES]; return modalCode; } -(NSInteger) runModalSheet { return [self runModalSheetForWindow:[NSApp mainWindow]]; } #pragma mark Private methods -(IBAction) BE_stopSynchronousSheet:(id)sender { // See which of the buttons was clicked NSUInteger clickedButtonIndex = [[self buttons] indexOfObject:sender]; // Be consistent with Apple's documentation (see NSAlert's addButtonWithTitle) so that // the fourth button is numbered NSAlertThirdButtonReturn + 1, and so on // // TODO: handle case when alert created with alertWithMessageText:... where the buttons // have values NSAlertDefaultReturn, NSAlertAlternateReturn, ... instead (see also // the documentation for the runModal method) NSInteger modalCode = 0; if (clickedButtonIndex == NSAlertFirstButtonReturn) modalCode = NSAlertFirstButtonReturn; else if (clickedButtonIndex == NSAlertSecondButtonReturn) modalCode = NSAlertSecondButtonReturn; else if (clickedButtonIndex == NSAlertThirdButtonReturn) modalCode = NSAlertThirdButtonReturn; else modalCode = NSAlertThirdButtonReturn + (clickedButtonIndex - 2); [NSApp stopModalWithCode:modalCode]; } -(void) BE_beginSheetModalForWindow:(NSWindow *)aWindow { [self beginSheetModalForWindow:aWindow modalDelegate:nil didEndSelector:nil contextInfo:nil]; } @end gtkwave-3.3.86/src/cocoa/cocoa_misc.c0000664000175000017500000001617313166335473016732 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2012. * * 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. */ #include "cocoa_misc.h" #ifdef WAVE_COCOA_GTK #include "alert_sheet.m" #include /*************************/ /* menu.c */ /*************************/ void gtk_open_external_file(const char *fpath) { NSString *nspath = [NSString stringWithUTF8String:fpath]; [[NSWorkspace sharedWorkspace] openFile:nspath]; } /*************************/ /* file.c */ /*************************/ static char *gtk_open_file_req_bridge(const char *title, const char *fpath, const char *pattn) { NSOpenPanel * zOpenPanel = [NSOpenPanel openPanel]; [zOpenPanel setCanChooseDirectories:NO]; [zOpenPanel setCanChooseFiles:YES]; [zOpenPanel setAllowsMultipleSelection:NO]; [zOpenPanel setTreatsFilePackagesAsDirectories:YES]; NSString *nstitle = [NSString stringWithUTF8String:title]; [zOpenPanel setTitle:nstitle]; NSArray * zAryOfExtensions = nil; if(pattn) { const char *d = strchr(pattn, '.'); if(d) { const char *pattn2 = d+1; if(!strcasecmp(pattn2, "sav") || !strcasecmp(pattn2, "gtkw")) { zAryOfExtensions = [NSArray arrayWithObjects:@"gtkw", @"sav", nil]; } else { NSString *s = [NSString stringWithUTF8String:pattn2]; zAryOfExtensions = [NSArray arrayWithObjects:s,nil]; } } } NSString *p_path = nil; NSString *p_file = nil; if(fpath) { char *s_temp = realpath(fpath,NULL); if(s_temp) { struct stat sbuf; if(!stat(s_temp,&sbuf)) { if(S_ISDIR(sbuf.st_mode)) { p_path = [NSString stringWithUTF8String:s_temp]; NSURL *URL = [NSURL URLWithString:p_path]; [zOpenPanel setDirectoryURL:URL]; } else { p_path = [[NSString stringWithUTF8String:s_temp] stringByDeletingLastPathComponent]; p_file = [[NSString stringWithUTF8String:s_temp] lastPathComponent]; NSURL *URL = [NSURL URLWithString:p_path]; [zOpenPanel setDirectoryURL:URL]; } } free(s_temp); } } NSInteger zIntResult = [zOpenPanel runModalForDirectory:p_path file:p_file types:zAryOfExtensions]; if (zIntResult == NSFileHandlingPanelCancelButton) { return(NULL); } NSURL *zUrl = [zOpenPanel URL]; NSString *us = [zUrl absoluteString]; const char *cst = [us UTF8String]; return(g_filename_from_uri(cst, NULL, NULL)); } static char *gtk_save_file_req_bridge(const char *title, const char *fpath, const char *pattn) { NSSavePanel * zSavePanel = [NSSavePanel savePanel]; [zSavePanel setAllowsOtherFileTypes:YES]; [zSavePanel setTreatsFilePackagesAsDirectories:YES]; [zSavePanel setExtensionHidden:NO]; NSString *nstitle = [NSString stringWithUTF8String:title]; [zSavePanel setTitle:nstitle]; NSArray * zAryOfExtensions = nil; if(pattn) { const char *d = strchr(pattn, '.'); if(d) { const char *pattn2 = d+1; if(!strcasecmp(pattn2, "sav") || !strcasecmp(pattn2, "gtkw")) { zAryOfExtensions = [NSArray arrayWithObjects:@"gtkw", @"sav", nil]; } else { NSString *s = [NSString stringWithUTF8String:pattn2]; zAryOfExtensions = [NSArray arrayWithObjects:s,nil]; } } } [zSavePanel setAllowedFileTypes:zAryOfExtensions]; NSString *p_path = nil; NSString *p_file = nil; if(fpath) { char *s_temp = realpath(fpath,NULL); if(s_temp) { struct stat sbuf; if(!stat(s_temp,&sbuf)) { if(S_ISDIR(sbuf.st_mode)) { p_path = [NSString stringWithUTF8String:s_temp]; NSURL *URL = [NSURL URLWithString:p_path]; [zSavePanel setDirectoryURL:URL]; } else { p_path = [[NSString stringWithUTF8String:s_temp] stringByDeletingLastPathComponent]; p_file = [[NSString stringWithUTF8String:s_temp] lastPathComponent]; NSURL *URL = [NSURL URLWithString:p_path]; [zSavePanel setDirectoryURL:URL]; [zSavePanel setNameFieldStringValue:p_file]; } } free(s_temp); } } NSInteger zIntResult = [zSavePanel runModal]; if (zIntResult == NSFileHandlingPanelCancelButton) { return(NULL); } NSURL *zUrl = [zSavePanel URL]; NSString *us = [zUrl absoluteString]; const char *cst = [us UTF8String]; return(g_filename_from_uri(cst, NULL, NULL)); } char *gtk_file_req_bridge(const char *title, const char *fpath, const char *pattn, int is_writemode) { char *rc; if(is_writemode) { rc = gtk_save_file_req_bridge(title, fpath, pattn); } else { rc = gtk_open_file_req_bridge(title, fpath, pattn); } return(rc); } /*************************/ /* simplereq.c / entry.c */ /*************************/ static int gtk_simplereqbox_req_bridge_2(char *title, char *default_text, char *oktext, char *canceltext, int is_alert, int is_entry, char *default_in_text_entry, char **out_text_entry, int width) { NSAlert *alert = [[[NSAlert alloc] init] autorelease]; int rc = 0; if(oktext) { [alert addButtonWithTitle: [NSString stringWithUTF8String:oktext]]; if(canceltext) { [alert addButtonWithTitle: [NSString stringWithUTF8String:canceltext]]; } } if(title) { [alert setMessageText: [NSString stringWithUTF8String:title]]; } if(default_text) { [alert setInformativeText: [NSString stringWithUTF8String:default_text]]; } if(is_alert) { [alert setAlertStyle:NSCriticalAlertStyle]; } else { [alert setAlertStyle:NSInformationalAlertStyle]; } NSTextField *input = nil; if(is_entry && default_in_text_entry && out_text_entry) { input = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, width, 24)]; [input setSelectable:YES]; [input setEditable:YES]; [input setImportsGraphics:NO]; [[alert window] makeFirstResponder:input]; [input setStringValue:[NSString stringWithUTF8String:default_in_text_entry]]; [input selectText:input]; [alert setAccessoryView:input]; } NSInteger zIntResult = [alert runModalSheet]; if(zIntResult == NSAlertFirstButtonReturn) { rc = 1; if(is_entry && default_in_text_entry && out_text_entry) { [input validateEditing]; *out_text_entry = strdup([[input stringValue] UTF8String]); } } else if(zIntResult == NSAlertSecondButtonReturn) { rc = 2; } return(rc); } int gtk_simplereqbox_req_bridge(char *title, char *default_text, char *oktext, char *canceltext, int is_alert) { return(gtk_simplereqbox_req_bridge_2(title, default_text, oktext, canceltext, is_alert, 0, NULL, 0, 0)); } int entrybox_req_bridge(char *title, int width, char *dflt_text, char *comment, int maxch, char **out_text_entry) { int rc = gtk_simplereqbox_req_bridge_2(title, comment, "OK", "Cancel", 0, 1, dflt_text, out_text_entry, width); if((rc == 1)&&(*out_text_entry)) { int len = strlen(*out_text_entry); if(len > maxch) { char *s2 = calloc(1, maxch+1); memcpy(s2, *out_text_entry, maxch); free(*out_text_entry); *out_text_entry = s2; } } return(rc); } #else char *cocoa_misc_dummy_compilation_unit(void) { return(NULL); /* dummy compilation unit */ } #endif gtkwave-3.3.86/src/fetchbuttons.c0000664000175000017500000001224713166335473016255 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999. * * 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. */ #include "globals.h" #include #include "currenttime.h" #include "pixmaps.h" #include "debug.h" void fetch_left(GtkWidget *text, gpointer data) { (void)text; (void)data; TimeType newlo; char fromstr[32]; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nFetch Left"); help_text( " decreases the \"From\" time, which allows more of the trace" " to be displayed if the \"From\" and \"To\" times do not match" " the actual bounds of the trace." ); return; } DEBUG(printf("Fetch Left\n")); newlo=(GLOBALS->tims.first)-GLOBALS->fetchwindow; if(newlo<=GLOBALS->min_time) newlo=GLOBALS->min_time; reformat_time(fromstr, newlo, GLOBALS->time_dimension); gtk_entry_set_text(GTK_ENTRY(GLOBALS->from_entry),fromstr); if(newlo<(GLOBALS->tims.last)) { GLOBALS->tims.first=newlo; if(GLOBALS->tims.starttims.first) GLOBALS->tims.start=GLOBALS->tims.first; time_update(); } } void fetch_right(GtkWidget *text, gpointer data) { (void)text; (void)data; TimeType newhi; char tostr[32]; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nFetch Right"); help_text( " increases the \"To\" time, which allows more of the trace" " to be displayed if the \"From\" and \"To\" times do not match" " the actual bounds of the trace." ); return; } DEBUG(printf("Fetch Right\n")); newhi=(GLOBALS->tims.last)+GLOBALS->fetchwindow; if(newhi>=GLOBALS->max_time) newhi=GLOBALS->max_time; reformat_time(tostr, newhi, GLOBALS->time_dimension); gtk_entry_set_text(GTK_ENTRY(GLOBALS->to_entry),tostr); if(newhi>(GLOBALS->tims.first)) { GLOBALS->tims.last=newhi; time_update(); } } void discard_left(GtkWidget *text, gpointer data) { (void)text; (void)data; TimeType newlo; char tostr[32]; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nDiscard Left"); help_text( " increases the \"From\" time, which allows less of the trace" " to be displayed." ); return; } DEBUG(printf("Discard Left\n")); newlo=(GLOBALS->tims.first)+GLOBALS->fetchwindow; if(newlo<(GLOBALS->tims.last)) { reformat_time(tostr, newlo, GLOBALS->time_dimension); gtk_entry_set_text(GTK_ENTRY(GLOBALS->from_entry),tostr); GLOBALS->tims.first=newlo; time_update(); } } void discard_right(GtkWidget *text, gpointer data) { (void)text; (void)data; TimeType newhi; char tostr[32]; if(GLOBALS->helpbox_is_active) { help_text_bold("\n\nDiscard Right"); help_text( " decreases the \"To\" time, which allows less of the trace" " to be displayed." ); return; } DEBUG(printf("Discard Right\n")); newhi=(GLOBALS->tims.last)-GLOBALS->fetchwindow; if(newhi>(GLOBALS->tims.first)) { reformat_time(tostr, newhi, GLOBALS->time_dimension); gtk_entry_set_text(GTK_ENTRY(GLOBALS->to_entry),tostr); GLOBALS->tims.last=newhi; time_update(); } } /* Create actual buttons */ GtkWidget * create_fetch_buttons (void) { GtkWidget *table; GtkWidget *table2; GtkWidget *frame; GtkWidget *main_vbox; GtkWidget *b1; GtkWidget *b2; GtkWidget *pixmapwid1, *pixmapwid2; GtkTooltips *tooltips; tooltips=gtk_tooltips_new_2(); gtk_tooltips_set_delay_2(tooltips,1500); pixmapwid1=gtk_pixmap_new(GLOBALS->larrow_pixmap, GLOBALS->larrow_mask); gtk_widget_show(pixmapwid1); pixmapwid2=gtk_pixmap_new(GLOBALS->rarrow_pixmap, GLOBALS->rarrow_mask); gtk_widget_show(pixmapwid2); /* Create a table to hold the text widget and scrollbars */ table = gtk_table_new (1, 1, FALSE); main_vbox = gtk_vbox_new (FALSE, 1); gtk_container_border_width (GTK_CONTAINER (main_vbox), 1); gtk_container_add (GTK_CONTAINER (table), main_vbox); frame = gtk_frame_new ("Fetch "); gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0); gtk_widget_show (frame); gtk_widget_show (main_vbox); table2 = gtk_table_new (2, 1, FALSE); b1 = gtk_button_new(); gtk_container_add(GTK_CONTAINER(b1), pixmapwid1); gtk_table_attach (GTK_TABLE (table2), b1, 0, 1, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); gtk_signal_connect_object (GTK_OBJECT (b1), "clicked", GTK_SIGNAL_FUNC(fetch_left), GTK_OBJECT (table2)); gtk_tooltips_set_tip_2(tooltips, b1, "Decrease 'From' Time", NULL); gtk_widget_show(b1); b2 = gtk_button_new(); gtk_container_add(GTK_CONTAINER(b2), pixmapwid2); gtk_table_attach (GTK_TABLE (table2), b2, 0, 1, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); gtk_signal_connect_object (GTK_OBJECT (b2), "clicked", GTK_SIGNAL_FUNC(fetch_right), GTK_OBJECT (table2)); gtk_tooltips_set_tip_2(tooltips, b2, "Increase 'To' Time", NULL); gtk_widget_show(b2); gtk_container_add (GTK_CONTAINER (frame), table2); gtk_widget_show(table2); return(table); } gtkwave-3.3.86/src/treesearch_gtk1.c0000664000175000017500000006311313166335473016616 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999-2017. * * 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. */ #include #include #include "gtk12compat.h" #include "analyzer.h" #include "tree.h" #include "symbol.h" #include "vcd.h" #include "lx2.h" #include "debug.h" void dnd_setup(GtkWidget *src, GtkWidget *w, int enable_receive) { (void)enable_receive; GtkTargetEntry target_entry[3]; /* Realize the clist widget and make sure it has a window, * this will be for DND setup. */ if(!GTK_WIDGET_NO_WINDOW(w)) { /* DND: Set up the clist as a potential DND destination. * First we set up target_entry which is a sequence of of * structure which specify the kinds (which we define) of * drops accepted on this widget. */ /* Set up the list of data format types that our DND * callbacks will accept. */ target_entry[0].target = WAVE_DRAG_TAR_NAME_0; target_entry[0].flags = 0; target_entry[0].info = WAVE_DRAG_TAR_INFO_0; target_entry[1].target = WAVE_DRAG_TAR_NAME_1; target_entry[1].flags = 0; target_entry[1].info = WAVE_DRAG_TAR_INFO_1; target_entry[2].target = WAVE_DRAG_TAR_NAME_2; target_entry[2].flags = 0; target_entry[2].info = WAVE_DRAG_TAR_INFO_2; /* Set the drag destination for this widget, using the * above target entry types, accept move's and coppies'. */ /* required gtk1 hack */ gtk_object_set_data(GTK_OBJECT(w), "gtk-drag-dest", NULL); gtk_drag_dest_set( w, GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP, target_entry, sizeof(target_entry) / sizeof(GtkTargetEntry), GDK_ACTION_MOVE | GDK_ACTION_COPY ); /* Set the drag source for this widget, allowing the user * to drag items off of this clist. */ if(src) gtk_drag_source_set( src, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK, target_entry, sizeof(target_entry) / sizeof(GtkTargetEntry), GDK_ACTION_MOVE | GDK_ACTION_COPY ); } } void treeview_select_all_callback(void) { /* nothing, no treeview for gtk1 implemented yet */ } void treeview_unselect_all_callback(void) { /* nothing, no treeview for gtk1 implemented yet */ } static void select_row_callback(GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data) { (void)widget; (void)column; (void)event; (void)data; struct tree *t; t=(struct tree *)gtk_clist_get_row_data(GTK_CLIST(GLOBALS->ctree_main), row); DEBUG(printf("TS: %08x %s\n",t,t->name)); GLOBALS->selectedtree_treesearch_gtk1_c=t; } static void unselect_row_callback(GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data) { (void)widget; (void)column; (void)event; (void)data; struct tree *t; t=(struct tree *)gtk_clist_get_row_data(GTK_CLIST(GLOBALS->ctree_main), row); DEBUG(printf("TU: %08x %s\n",t,t->name)); GLOBALS->selectedtree_treesearch_gtk1_c=NULL; } int treebox_is_active(void) { return(GLOBALS->is_active_treesearch_gtk1_c); } static void enter_callback_e(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; G_CONST_RETURN gchar *entry_text; int len; entry_text = gtk_entry_get_text(GTK_ENTRY(GLOBALS->entry_a_treesearch_gtk1_c)); entry_text = entry_text ? entry_text : ""; DEBUG(printf("Entry contents: %s\n", entry_text)); if(!(len=strlen(entry_text))) GLOBALS->entrybox_text_local_treesearch_gtk1_c=NULL; else strcpy((GLOBALS->entrybox_text_local_treesearch_gtk1_c=(char *)malloc_2(len+1)),entry_text); wave_gtk_grab_remove(GLOBALS->window1_treesearch_gtk1_c); gtk_widget_destroy(GLOBALS->window1_treesearch_gtk1_c); GLOBALS->window1_treesearch_gtk1_c = NULL; GLOBALS->cleanup_e_treesearch_gtk1_c(); } static void destroy_callback_e(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; DEBUG(printf("Entry Cancel\n")); GLOBALS->entrybox_text_local_treesearch_gtk1_c=NULL; wave_gtk_grab_remove(GLOBALS->window1_treesearch_gtk1_c); gtk_widget_destroy(GLOBALS->window1_treesearch_gtk1_c); GLOBALS->window1_treesearch_gtk1_c = NULL; } static void entrybox_local(char *title, int width, char *default_text, int maxch, GtkSignalFunc func) { GtkWidget *vbox, *hbox; GtkWidget *button1, *button2; GLOBALS->cleanup_e_treesearch_gtk1_c=func; /* fix problem where ungrab doesn't occur if button pressed + simultaneous accelerator key occurs */ if(GLOBALS->in_button_press_wavewindow_c_1) { gdk_pointer_ungrab(GDK_CURRENT_TIME); } /* create a new modal window */ GLOBALS->window1_treesearch_gtk1_c = gtk_window_new(GLOBALS->disable_window_manager ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL); install_focus_cb(GLOBALS->window1_treesearch_gtk1_c, ((char *)&GLOBALS->window1_treesearch_gtk1_c) - ((char *)GLOBALS)); gtk_widget_set_usize( GTK_WIDGET (GLOBALS->window1_treesearch_gtk1_c), width, 60); gtk_window_set_title(GTK_WINDOW (GLOBALS->window1_treesearch_gtk1_c), title); gtkwave_signal_connect(GTK_OBJECT (GLOBALS->window1_treesearch_gtk1_c), "delete_event", (GtkSignalFunc) destroy_callback_e, NULL); vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (GLOBALS->window1_treesearch_gtk1_c), vbox); gtk_widget_show (vbox); GLOBALS->entry_a_treesearch_gtk1_c = gtk_entry_new_with_max_length (maxch); gtkwave_signal_connect(GTK_OBJECT(GLOBALS->entry_a_treesearch_gtk1_c), "activate", GTK_SIGNAL_FUNC(enter_callback_e), GLOBALS->entry_a_treesearch_gtk1_c); gtk_entry_set_text (GTK_ENTRY (GLOBALS->entry_a_treesearch_gtk1_c), default_text); gtk_entry_select_region (GTK_ENTRY (GLOBALS->entry_a_treesearch_gtk1_c), 0, GTK_ENTRY(GLOBALS->entry_a_treesearch_gtk1_c)->text_length); gtk_box_pack_start (GTK_BOX (vbox), GLOBALS->entry_a_treesearch_gtk1_c, TRUE, TRUE, 0); gtk_widget_show (GLOBALS->entry_a_treesearch_gtk1_c); hbox = gtk_hbox_new (FALSE, 1); gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0); gtk_widget_show (hbox); button1 = gtk_button_new_with_label ("OK"); gtk_widget_set_usize(button1, 100, -1); gtkwave_signal_connect(GTK_OBJECT (button1), "clicked", GTK_SIGNAL_FUNC(enter_callback_e), NULL); gtk_widget_show (button1); gtk_container_add (GTK_CONTAINER (hbox), button1); GTK_WIDGET_SET_FLAGS (button1, GTK_CAN_DEFAULT); gtkwave_signal_connect_object (GTK_OBJECT (button1), "realize", (GtkSignalFunc) gtk_widget_grab_default, GTK_OBJECT (button1)); button2 = gtk_button_new_with_label ("Cancel"); gtk_widget_set_usize(button2, 100, -1); gtkwave_signal_connect(GTK_OBJECT (button2), "clicked", GTK_SIGNAL_FUNC(destroy_callback_e), NULL); GTK_WIDGET_SET_FLAGS (button2, GTK_CAN_DEFAULT); gtk_widget_show (button2); gtk_container_add (GTK_CONTAINER (hbox), button2); gtk_widget_show(GLOBALS->window1_treesearch_gtk1_c); wave_gtk_grab_add(GLOBALS->window1_treesearch_gtk1_c); } /***************************************************************************/ /* call cleanup() on ok/insert functions */ static void bundle_cleanup(GtkWidget *widget, gpointer data) { (void)widget; (void)data; if(GLOBALS->entrybox_text_local_treesearch_gtk1_c) { char *efix; if(!strlen(GLOBALS->entrybox_text_local_treesearch_gtk1_c)) { DEBUG(printf("Bundle name is not specified--recursing into hierarchy.\n")); fetchvex(GLOBALS->selectedtree_treesearch_gtk1_c, GLOBALS->bundle_direction_treesearch_gtk1_c); } else { efix=GLOBALS->entrybox_text_local_treesearch_gtk1_c; while(*efix) { if(*efix==' ') { *efix='_'; } efix++; } DEBUG(printf("Bundle name is: %s\n",GLOBALS->entrybox_text_local_treesearch_gtk1_c)); add_vector_range(GLOBALS->entrybox_text_local_treesearch_gtk1_c, fetchlow(GLOBALS->selectedtree_treesearch_gtk1_c)->t_which, fetchhigh(GLOBALS->selectedtree_treesearch_gtk1_c)->t_which, GLOBALS->bundle_direction_treesearch_gtk1_c); } free_2(GLOBALS->entrybox_text_local_treesearch_gtk1_c); } else { DEBUG(printf("Bundle name is not specified--recursing into hierarchy.\n")); fetchvex(GLOBALS->selectedtree_treesearch_gtk1_c, GLOBALS->bundle_direction_treesearch_gtk1_c); } MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } static void bundle_callback_generic(void) { if(GLOBALS->selectedtree_treesearch_gtk1_c) { if(!GLOBALS->autoname_bundles) { entrybox_local("Enter Bundle Name",300,"",128,GTK_SIGNAL_FUNC(bundle_cleanup)); } else { GLOBALS->entrybox_text_local_treesearch_gtk1_c=NULL; bundle_cleanup(NULL, NULL); } } } static void bundle_callback_up(GtkWidget *widget, gpointer data) { (void)widget; (void)data; GLOBALS->bundle_direction_treesearch_gtk1_c=0; bundle_callback_generic(); } static void bundle_callback_down(GtkWidget *widget, gpointer data) { (void)widget; (void)data; GLOBALS->bundle_direction_treesearch_gtk1_c=1; bundle_callback_generic(); } static void insert_callback(GtkWidget *widget, GtkWidget *nothing) { (void)nothing; Traces tcache; int i; if((!GLOBALS->selectedtree_treesearch_gtk1_c) || (!GLOBALS->selectedtree_treesearch_gtk1_c->child)) return; memcpy(&tcache,&GLOBALS->traces,sizeof(Traces)); GLOBALS->traces.total=0; GLOBALS->traces.first=GLOBALS->traces.last=NULL; set_window_busy(widget); GLOBALS->fetchlow = GLOBALS->fetchhigh = -1; recurse_fetch_high_low(GLOBALS->selectedtree_treesearch_gtk1_c->child); for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { struct symbol *s; s=GLOBALS->facs[i]; if(s->vec_root) { set_s_selected(s->vec_root, GLOBALS->autocoalesce); } } /* LX2 */ if(GLOBALS->is_lx2) { int pre_import = 0; for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { struct symbol *s, *t; s=GLOBALS->facs[i]; t=s->vec_root; if((t)&&(GLOBALS->autocoalesce)) { if(get_s_selected(t)) { while(t) { if(t->n->mv.mvlfac) { lx2_set_fac_process_mask(t->n); pre_import++; } t=t->vec_chain; } } } else { if(s->n->mv.mvlfac) { lx2_set_fac_process_mask(s->n); pre_import++; } } } if(pre_import) { lx2_import_masked(); } } /* LX2 */ for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { int len; struct symbol *s, *t; s=GLOBALS->facs[i]; t=s->vec_root; if((t)&&(GLOBALS->autocoalesce)) { if(get_s_selected(t)) { set_s_selected(t, 0); len=0; while(t) { len++; t=t->vec_chain; } if(len) add_vector_chain(s->vec_root, len); } } else { AddNodeUnroll(s->n, NULL); } } set_window_idle(widget); GLOBALS->traces.buffercount=GLOBALS->traces.total; GLOBALS->traces.buffer=GLOBALS->traces.first; GLOBALS->traces.bufferlast=GLOBALS->traces.last; GLOBALS->traces.first=tcache.first; GLOBALS->traces.last=tcache.last; GLOBALS->traces.total=tcache.total; PasteBuffer(); GLOBALS->traces.buffercount=tcache.buffercount; GLOBALS->traces.buffer=tcache.buffer; GLOBALS->traces.bufferlast=tcache.bufferlast; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } static void replace_callback(GtkWidget *widget, GtkWidget *nothing) { (void)nothing; Traces tcache; int i; Trptr tfirst=NULL, tlast=NULL; if((!GLOBALS->selectedtree_treesearch_gtk1_c) || (!GLOBALS->selectedtree_treesearch_gtk1_c->child)) return; memcpy(&tcache,&GLOBALS->traces,sizeof(Traces)); GLOBALS->traces.total=0; GLOBALS->traces.first=GLOBALS->traces.last=NULL; set_window_busy(widget); GLOBALS->fetchlow = GLOBALS->fetchhigh = -1; recurse_fetch_high_low(GLOBALS->selectedtree_treesearch_gtk1_c->child); for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { struct symbol *s; s=GLOBALS->facs[i]; if(s->vec_root) { set_s_selected(s->vec_root, GLOBALS->autocoalesce); } } /* LX2 */ if(GLOBALS->is_lx2) { int pre_import = 0; for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { struct symbol *s, *t; s=GLOBALS->facs[i]; t=s->vec_root; if((t)&&(GLOBALS->autocoalesce)) { if(get_s_selected(t)) { while(t) { if(t->n->mv.mvlfac) { lx2_set_fac_process_mask(t->n); pre_import++; } t=t->vec_chain; } } } else { if(s->n->mv.mvlfac) { lx2_set_fac_process_mask(s->n); pre_import++; } } } if(pre_import) { lx2_import_masked(); } } /* LX2 */ for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { int len; struct symbol *s, *t; s=GLOBALS->facs[i]; t=s->vec_root; if((t)&&(GLOBALS->autocoalesce)) { if(get_s_selected(t)) { set_s_selected(t, 0); len=0; while(t) { len++; t=t->vec_chain; } if(len) add_vector_chain(s->vec_root, len); } } else { AddNodeUnroll(s->n, NULL); } } set_window_idle(widget); tfirst=GLOBALS->traces.first; tlast=GLOBALS->traces.last; /* cache for highlighting */ GLOBALS->traces.buffercount=GLOBALS->traces.total; GLOBALS->traces.buffer=GLOBALS->traces.first; GLOBALS->traces.bufferlast=GLOBALS->traces.last; GLOBALS->traces.first=tcache.first; GLOBALS->traces.last=tcache.last; GLOBALS->traces.total=tcache.total; { Trptr t = GLOBALS->traces.first; Trptr *tp = NULL; int numhigh = 0; int it; while(t) { if(t->flags & TR_HIGHLIGHT) { numhigh++; } t = t->t_next; } if(numhigh) { tp = calloc_2(numhigh, sizeof(Trptr)); t = GLOBALS->traces.first; it = 0; while(t) { if(t->flags & TR_HIGHLIGHT) { tp[it++] = t; } t = t->t_next; } } PasteBuffer(); GLOBALS->traces.buffercount=tcache.buffercount; GLOBALS->traces.buffer=tcache.buffer; GLOBALS->traces.bufferlast=tcache.bufferlast; for(i=0;iflags |= TR_HIGHLIGHT; } t = tfirst; while(t) { t->flags &= ~TR_HIGHLIGHT; if(t==tlast) break; t=t->t_next; } CutBuffer(); while(tfirst) { tfirst->flags |= TR_HIGHLIGHT; if(tfirst==tlast) break; tfirst=tfirst->t_next; } if(tp) { free_2(tp); } } MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } static void ok_callback(GtkWidget *widget, GtkWidget *nothing) { (void)nothing; int i; if((!GLOBALS->selectedtree_treesearch_gtk1_c) || (!GLOBALS->selectedtree_treesearch_gtk1_c->child)) return; set_window_busy(widget); GLOBALS->fetchlow = GLOBALS->fetchhigh = -1; recurse_fetch_high_low(GLOBALS->selectedtree_treesearch_gtk1_c->child); for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { struct symbol *s; s=GLOBALS->facs[i]; if(s->vec_root) { set_s_selected(s->vec_root, GLOBALS->autocoalesce); } } /* LX2 */ if(GLOBALS->is_lx2) { int pre_import = 0; for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { struct symbol *s, *t; s=GLOBALS->facs[i]; t=s->vec_root; if((t)&&(GLOBALS->autocoalesce)) { if(get_s_selected(t)) { while(t) { if(t->n->mv.mvlfac) { lx2_set_fac_process_mask(t->n); pre_import++; } t=t->vec_chain; } } } else { if(s->n->mv.mvlfac) { lx2_set_fac_process_mask(s->n); pre_import++; } } } if(pre_import) { lx2_import_masked(); } } /* LX2 */ for(i=GLOBALS->fetchlow;i<=GLOBALS->fetchhigh;i++) { int len; struct symbol *s, *t; s=GLOBALS->facs[i]; t=s->vec_root; if((t)&&(GLOBALS->autocoalesce)) { if(get_s_selected(t)) { set_s_selected(t, 0); len=0; while(t) { len++; t=t->vec_chain; } if(len) add_vector_chain(s->vec_root, len); } } else { AddNodeUnroll(s->n, NULL); } } set_window_idle(widget); GLOBALS->traces.scroll_top = GLOBALS->traces.scroll_bottom = GLOBALS->traces.last; MaxSignalLength(); signalarea_configure_event(GLOBALS->signalarea, NULL); wavearea_configure_event(GLOBALS->wavearea, NULL); } static void destroy_callback(GtkWidget *widget, GtkWidget *nothing) { (void)widget; (void)nothing; GLOBALS->is_active_treesearch_gtk1_c=0; gtk_widget_destroy(GLOBALS->window_treesearch_gtk1_c); GLOBALS->window_treesearch_gtk1_c = NULL; } /* * mainline.. */ void treebox(char *title, GtkSignalFunc func, GtkWidget *old_window) { (void)old_window; GtkWidget *scrolled_win; GtkWidget *hbox; GtkWidget *button1, *button2, *button3, *button3a, *button4, *button5; GtkWidget *frame2, *frameh; GtkWidget *table; GtkTooltips *tooltips; GtkCList *clist; if(GLOBALS->is_active_treesearch_gtk1_c) { gdk_window_raise(GLOBALS->window_treesearch_gtk1_c->window); return; } GLOBALS->is_active_treesearch_gtk1_c=1; GLOBALS->cleanup_treesearch_gtk1_c=func; /* create a new modal window */ GLOBALS->window_treesearch_gtk1_c = gtk_window_new(GLOBALS->disable_window_manager ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL); install_focus_cb(GLOBALS->window_treesearch_gtk1_c, ((char *)&GLOBALS->window_treesearch_gtk1_c) - ((char *)GLOBALS)); gtk_window_set_title(GTK_WINDOW (GLOBALS->window_treesearch_gtk1_c), title); gtkwave_signal_connect(GTK_OBJECT (GLOBALS->window_treesearch_gtk1_c), "delete_event", (GtkSignalFunc) destroy_callback, NULL); tooltips=gtk_tooltips_new_2(); table = gtk_table_new (256, 1, FALSE); gtk_widget_show (table); frame2 = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (frame2), 3); gtk_widget_show(frame2); gtk_table_attach (GTK_TABLE (table), frame2, 0, 1, 0, 255, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); GLOBALS->tree_treesearch_gtk1_c=gtk_ctree_new(1,0); GLOBALS->ctree_main=GTK_CTREE(GLOBALS->tree_treesearch_gtk1_c); gtk_clist_set_column_auto_resize (GTK_CLIST (GLOBALS->tree_treesearch_gtk1_c), 0, TRUE); gtk_widget_show(GLOBALS->tree_treesearch_gtk1_c); clist=GTK_CLIST(GLOBALS->tree_treesearch_gtk1_c); gtkwave_signal_connect_object (GTK_OBJECT (clist), "select_row", GTK_SIGNAL_FUNC(select_row_callback), NULL); gtkwave_signal_connect_object (GTK_OBJECT (clist), "unselect_row", GTK_SIGNAL_FUNC(unselect_row_callback), NULL); gtk_clist_freeze(clist); gtk_clist_clear(clist); maketree(NULL, GLOBALS->treeroot); gtk_clist_thaw(clist); GLOBALS->selectedtree_treesearch_gtk1_c=NULL; scrolled_win = gtk_scrolled_window_new (NULL, NULL); gtk_widget_set_usize( GTK_WIDGET (scrolled_win), -1, 300); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_show(scrolled_win); gtk_container_add (GTK_CONTAINER (scrolled_win), GTK_WIDGET (GLOBALS->tree_treesearch_gtk1_c)); gtk_container_add (GTK_CONTAINER (frame2), scrolled_win); frameh = gtk_frame_new (NULL); gtk_container_border_width (GTK_CONTAINER (frameh), 3); gtk_widget_show(frameh); gtk_table_attach (GTK_TABLE (table), frameh, 0, 1, 255, 256, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK, 1, 1); hbox = gtk_hbox_new (FALSE, 1); gtk_widget_show (hbox); button1 = gtk_button_new_with_label ("Append"); gtk_container_border_width (GTK_CONTAINER (button1), 3); gtkwave_signal_connect_object (GTK_OBJECT (button1), "clicked", GTK_SIGNAL_FUNC(ok_callback), GTK_OBJECT (GLOBALS->window_treesearch_gtk1_c)); gtk_widget_show (button1); gtk_tooltips_set_tip_2(tooltips, button1, "Add selected signal hierarchy to end of the display on the main window.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button1, TRUE, FALSE, 0); button2 = gtk_button_new_with_label (" Insert "); gtk_container_border_width (GTK_CONTAINER (button2), 3); gtkwave_signal_connect_object (GTK_OBJECT (button2), "clicked", GTK_SIGNAL_FUNC(insert_callback), GTK_OBJECT (GLOBALS->window_treesearch_gtk1_c)); gtk_widget_show (button2); gtk_tooltips_set_tip_2(tooltips, button2, "Add selected signal hierarchy after last highlighted signal on the main window.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button2, TRUE, FALSE, 0); if(GLOBALS->vcd_explicit_zero_subscripts>=0) { button3 = gtk_button_new_with_label (" Bundle Up "); gtk_container_border_width (GTK_CONTAINER (button3), 3); gtkwave_signal_connect_object (GTK_OBJECT (button3), "clicked", GTK_SIGNAL_FUNC(bundle_callback_up), GTK_OBJECT (GLOBALS->window_treesearch_gtk1_c)); gtk_widget_show (button3); gtk_tooltips_set_tip_2(tooltips, button3, "Bundle selected signal hierarchy into a single bit " "vector with the topmost signal as the LSB and the " "lowest as the MSB. Entering a zero length bundle " "name will reconstruct the individual vectors " "in the hierarchy. Otherwise, all the bits in " "the hierarchy will be coalesced with the supplied " "name into a single vector.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button3, TRUE, FALSE, 0); button3a = gtk_button_new_with_label (" Bundle Down "); gtk_container_border_width (GTK_CONTAINER (button3a), 3); gtkwave_signal_connect_object (GTK_OBJECT (button3a), "clicked", GTK_SIGNAL_FUNC(bundle_callback_down), GTK_OBJECT (GLOBALS->window_treesearch_gtk1_c)); gtk_widget_show (button3a); gtk_tooltips_set_tip_2(tooltips, button3a, "Bundle selected signal hierarchy into a single bit " "vector with the topmost signal as the MSB and the " "lowest as the LSB. Entering a zero length bundle " "name will reconstruct the individual vectors " "in the hierarchy. Otherwise, all the bits in " "the hierarchy will be coalesced with the supplied " "name into a single vector.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button3a, TRUE, FALSE, 0); } button4 = gtk_button_new_with_label (" Replace "); gtk_container_border_width (GTK_CONTAINER (button4), 3); gtkwave_signal_connect_object (GTK_OBJECT (button4), "clicked", GTK_SIGNAL_FUNC(replace_callback), GTK_OBJECT (GLOBALS->window_treesearch_gtk1_c)); gtk_widget_show (button4); gtk_tooltips_set_tip_2(tooltips, button4, "Replace highlighted signals on the main window with signals selected above.",NULL); gtk_box_pack_start (GTK_BOX (hbox), button4, TRUE, FALSE, 0); button5 = gtk_button_new_with_label (" Exit "); gtk_container_border_width (GTK_CONTAINER (button5), 3); gtkwave_signal_connect_object (GTK_OBJECT (button5), "clicked", GTK_SIGNAL_FUNC(destroy_callback), GTK_OBJECT (GLOBALS->window_treesearch_gtk1_c)); gtk_tooltips_set_tip_2(tooltips, button5, "Do nothing and return to the main window.",NULL); gtk_widget_show (button5); gtk_box_pack_start (GTK_BOX (hbox), button5, TRUE, FALSE, 0); gtk_container_add (GTK_CONTAINER (frameh), hbox); gtk_container_add (GTK_CONTAINER (GLOBALS->window_treesearch_gtk1_c), table); gtk_widget_show(GLOBALS->window_treesearch_gtk1_c); } gtkwave-3.3.86/src/jrb.c0000664000175000017500000003026513166335473014322 0ustar bybellbybell/* * Libraries for fields, doubly-linked lists and red-black trees. * Copyright (C) 2001 James S. Plank * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. */ /* Revision 1.2. Jim Plank */ /* Original code by Jim Plank (plank@cs.utk.edu) */ /* modified for THINK C 6.0 for Macintosh by Chris Bartley */ #include #include #include #include #include "jrb.h" static void mk_new_int(JRB l, JRB r, JRB p, int il); static JRB lprev(JRB n); static JRB rprev(JRB n); static void recolor(JRB n); static void single_rotate(JRB y, int l); #define isred(n) (n->red) #define isblack(n) (!isred(n)) #define isleft(n) (n->left) #define isright(n) (!isleft(n)) #define isint(n) (n->internal) #define isext(n) (!isint(n)) #define ishead(n) (n->roothead & 2) #define isroot(n) (n->roothead & 1) #define getlext(n) ((struct jrb_node *)(n->key.v)) #define setlext(node, val) node->key.v = (void *) (val) #define getrext(n) ((struct jrb_node *)(n->val.v)) #define setrext(node, value) node->val.v = (void *) (value) #define setred(n) n->red = 1 #define setblack(n) n->red = 0 #define setleft(n) n->left = 1 #define setright(n) n->left = 0 #define sethead(n) (n->roothead |= 2) #define setroot(n) (n->roothead |= 1) #define setint(n) n->internal = 1 #define setext(n) n->internal = 0 #define setnormal(n) n->roothead = 0 #define sibling(n) ((isleft(n)) ? n->parent->blink : n->parent->flink) static void insert(JRB item, JRB list) /* Inserts to the end of a list */ { JRB last_node; last_node = list->blink; list->blink = item; last_node->flink = item; item->blink = last_node; item->flink = list; } static void delete_item(JRB item) /* Deletes an arbitrary iterm */ { item->flink->blink = item->blink; item->blink->flink = item->flink; } #define mk_new_ext(new, kkkey, vvval) {\ new = (JRB) calloc(1, sizeof(struct jrb_node));\ new->val = vvval;\ new->key = kkkey;\ setext(new);\ setblack(new);\ setnormal(new);\ } static void mk_new_int(JRB l, JRB r, JRB p, int il) { JRB newnode; newnode = (JRB) calloc(1, sizeof(struct jrb_node)); setint(newnode); setred(newnode); setnormal(newnode); newnode->flink = l; newnode->blink = r; newnode->parent = p; setlext(newnode, l); setrext(newnode, r); l->parent = newnode; r->parent = newnode; setleft(l); setright(r); if (ishead(p)) { p->parent = newnode; setroot(newnode); } else if (il) { setleft(newnode); p->flink = newnode; } else { setright(newnode); p->blink = newnode; } recolor(newnode); } JRB lprev(JRB n) { if (ishead(n)) return n; while (!isroot(n)) { if (isright(n)) return n->parent; n = n->parent; } return n->parent; } JRB rprev(JRB n) { if (ishead(n)) return n; while (!isroot(n)) { if (isleft(n)) return n->parent; n = n->parent; } return n->parent; } JRB make_jrb(void) { JRB head; head = (JRB) calloc (1, sizeof(struct jrb_node)); head->flink = head; head->blink = head; head->parent = head; head->key.s = ""; sethead(head); return head; } JRB jrb_find_gte_str(JRB n, const char *key, int *fnd) { int cmp; *fnd = 0; if (!ishead(n)) { fprintf(stderr, "jrb_find_gte_str called on non-head 0x%p\n", (void *)n); exit(1); } if (n->parent == n) return n; cmp = strcmp(key, n->blink->key.s); if (cmp == 0) { *fnd = 1; return n->blink; } if (cmp > 0) return n; else n = n->parent; while (1) { if (isext(n)) return n; cmp = strcmp(key, getlext(n)->key.s); if (cmp == 0) { *fnd = 1; return getlext(n); } if (cmp < 0) n = n->flink ; else n = n->blink; } } JRB jrb_find_str(JRB n, const char *key) { int fnd; JRB j; j = jrb_find_gte_str(n, key, &fnd); if (fnd) return j; else return NULL; } JRB jrb_find_gte_int(JRB n, int ikey, int *fnd) { *fnd = 0; if (!ishead(n)) { fprintf(stderr, "jrb_find_gte_int called on non-head 0x%p\n", (void *)n); exit(1); } if (n->parent == n) return n; if (ikey == n->blink->key.i) { *fnd = 1; return n->blink; } if (ikey > n->blink->key.i) return n; else n = n->parent; while (1) { if (isext(n)) return n; if (ikey == getlext(n)->key.i) { *fnd = 1; return getlext(n); } n = (ikey < getlext(n)->key.i) ? n->flink : n->blink; } } JRB jrb_find_int(JRB n, int ikey) { int fnd; JRB j; j = jrb_find_gte_int(n, ikey, &fnd); if (fnd) return j; else return NULL; } JRB jrb_find_gte_vptr(JRB n, void *vkey, int *fnd) { *fnd = 0; if (!ishead(n)) { fprintf(stderr, "jrb_find_gte_int called on non-head 0x%p\n", (void *)n); exit(1); } if (n->parent == n) return n; if ((char *)vkey == (char *)n->blink->key.v) { *fnd = 1; return n->blink; } if ((char *)vkey > (char *)n->blink->key.v) return n; else n = n->parent; while (1) { if (isext(n)) return n; if ((char *)vkey == (char *)getlext(n)->key.v) { *fnd = 1; return getlext(n); } n = ((char *)vkey < (char *)getlext(n)->key.v) ? n->flink : n->blink; } } JRB jrb_find_vptr(JRB n, void *vkey) { int fnd; JRB j; j = jrb_find_gte_vptr(n, vkey, &fnd); if (fnd) return j; else return NULL; } JRB jrb_find_gte_gen(JRB n, Jval key,int (*fxn)(Jval, Jval), int *fnd) { int cmp; *fnd = 0; if (!ishead(n)) { fprintf(stderr, "jrb_find_gte_str called on non-head 0x%p\n", (void *)n); exit(1); } if (n->parent == n) return n; cmp = (*fxn)(key, n->blink->key); if (cmp == 0) { *fnd = 1; return n->blink; } if (cmp > 0) return n; else n = n->parent; while (1) { if (isext(n)) return n; cmp = (*fxn)(key, getlext(n)->key); if (cmp == 0) { *fnd = 1; return getlext(n); } if (cmp < 0) n = n->flink ; else n = n->blink; } } JRB jrb_find_gen(JRB n, Jval key, int (*fxn)(Jval, Jval)) { int fnd; JRB j; j = jrb_find_gte_gen(n, key, fxn, &fnd); if (fnd) return j; else return NULL; } static JRB jrb_insert_b(JRB n, Jval key, Jval val) { JRB newleft, newright, newnode, p; if (ishead(n)) { if (n->parent == n) { /* Tree is empty */ mk_new_ext(newnode, key, val); insert(newnode, n); n->parent = newnode; newnode->parent = n; setroot(newnode); return newnode; } else { mk_new_ext(newright, key, val); insert(newright, n); newleft = newright->blink; setnormal(newleft); mk_new_int(newleft, newright, newleft->parent, isleft(newleft)); p = rprev(newright); if (!ishead(p)) setlext(p, newright); return newright; } } else { mk_new_ext(newleft, key, val); insert(newleft, n); setnormal(n); mk_new_int(newleft, n, n->parent, isleft(n)); p = lprev(newleft); if (!ishead(p)) setrext(p, newleft); return newleft; } } static void recolor(JRB n) { JRB p, gp, s; int done = 0; while(!done) { if (isroot(n)) { setblack(n); return; } p = n->parent; if (isblack(p)) return; if (isroot(p)) { setblack(p); return; } gp = p->parent; s = sibling(p); if (isred(s)) { setblack(p); setred(gp); setblack(s); n = gp; } else { done = 1; } } /* p's sibling is black, p is red, gp is black */ if ((isleft(n) == 0) == (isleft(p) == 0)) { single_rotate(gp, isleft(n)); setblack(p); setred(gp); } else { single_rotate(p, isleft(n)); single_rotate(gp, isleft(n)); setblack(n); setred(gp); } } static void single_rotate(JRB y, int l) { int rl = 0, ir; JRB x, yp; ir = isroot(y); yp = y->parent; if (!ir) { rl = isleft(y); } if (l) { x = y->flink; y->flink = x->blink; setleft(y->flink); y->flink->parent = y; x->blink = y; setright(y); } else { x = y->blink; y->blink = x->flink; setright(y->blink); y->blink->parent = y; x->flink = y; setleft(y); } x->parent = yp; y->parent = x; if (ir) { yp->parent = x; setnormal(y); setroot(x); } else { if (rl) { yp->flink = x; setleft(x); } else { yp->blink = x; setright(x); } } } void jrb_delete_node(JRB n) { JRB s, p, gp; char ir; if (isint(n)) { fprintf(stderr, "Cannot delete an internal node: 0x%p\n", (void *)n); exit(1); } if (ishead(n)) { fprintf(stderr, "Cannot delete the head of an jrb_tree: 0x%p\n", (void *)n); exit(1); } delete_item(n); /* Delete it from the list */ p = n->parent; /* The only node */ if (isroot(n)) { p->parent = p; free(n); return; } s = sibling(n); /* The only node after deletion */ if (isroot(p)) { s->parent = p->parent; s->parent->parent = s; setroot(s); free(p); free(n); return; } gp = p->parent; /* Set parent to sibling */ s->parent = gp; if (isleft(p)) { gp->flink = s; setleft(s); } else { gp->blink = s; setright(s); } ir = isred(p); free(p); free(n); if (isext(s)) { /* Update proper rext and lext values */ p = lprev(s); if (!ishead(p)) setrext(p, s); p = rprev(s); if (!ishead(p)) setlext(p, s); } else if (isblack(s)) { fprintf(stderr, "DELETION PROB -- sib is black, internal\n"); exit(1); } else { p = lprev(s); if (!ishead(p)) setrext(p, s->flink); p = rprev(s); if (!ishead(p)) setlext(p, s->blink); setblack(s); return; } if (ir) return; /* Recolor */ n = s; p = n->parent; s = sibling(n); while(isblack(p) && isblack(s) && isint(s) && isblack(s->flink) && isblack(s->blink)) { setred(s); n = p; if (isroot(n)) return; p = n->parent; s = sibling(n); } if (isblack(p) && isred(s)) { /* Rotation 2.3b */ single_rotate(p, isright(n)); setred(p); setblack(s); s = sibling(n); } { JRB x, z; char il; if (isext(s)) { fprintf(stderr, "DELETION ERROR: sibling not internal\n"); exit(1); } il = isleft(n); x = il ? s->flink : s->blink ; z = sibling(x); if (isred(z)) { /* Rotation 2.3f */ single_rotate(p, !il); setblack(z); if (isred(p)) setred(s); else setblack(s); setblack(p); } else if (isblack(x)) { /* Recoloring only (2.3c) */ if (isred(s) || isblack(p)) { fprintf(stderr, "DELETION ERROR: 2.3c not quite right\n"); exit(1); } setblack(p); setred(s); return; } else if (isred(p)) { /* 2.3d */ single_rotate(s, il); single_rotate(p, !il); setblack(x); setred(s); return; } else { /* 2.3e */ single_rotate(s, il); single_rotate(p, !il); setblack(x); return; } } } int jrb_nblack(JRB n) { int nb; if (ishead(n) || isint(n)) { fprintf(stderr, "ERROR: jrb_nblack called on a non-external node 0x%p\n", (void *)n); exit(1); } nb = 0; while(!ishead(n)) { if (isblack(n)) nb++; n = n->parent; } return nb; } int jrb_plength(JRB n) { int pl; if (ishead(n) || isint(n)) { fprintf(stderr, "ERROR: jrb_plength called on a non-external node 0x%p\n", (void *)n); exit(1); } pl = 0; while(!ishead(n)) { pl++; n = n->parent; } return pl; } void jrb_free_tree(JRB n) { if (!ishead(n)) { fprintf(stderr, "ERROR: Rb_free_tree called on a non-head node\n"); exit(1); } while(jrb_first(n) != jrb_nil(n)) { jrb_delete_node(jrb_first(n)); } free(n); } Jval jrb_val(JRB n) { return n->val; } JRB jrb_insert_str(JRB tree, char *key, Jval val) { Jval k; int fnd; k.s = key; return jrb_insert_b(jrb_find_gte_str(tree, key, &fnd), k, val); } JRB jrb_insert_int(JRB tree, int ikey, Jval val) { Jval k; int fnd; k.i = ikey; return jrb_insert_b(jrb_find_gte_int(tree, ikey, &fnd), k, val); } JRB jrb_insert_vptr(JRB tree, void *vkey, Jval val) { Jval k; int fnd; k.v = vkey; return jrb_insert_b(jrb_find_gte_vptr(tree, vkey, &fnd), k, val); } JRB jrb_insert_gen(JRB tree, Jval key, Jval val, int (*func)(Jval, Jval)) { int fnd; return jrb_insert_b(jrb_find_gte_gen(tree, key, func, &fnd), key, val); } gtkwave-3.3.86/src/fetchbuttons.h0000664000175000017500000000106513166335473016256 0ustar bybellbybell/* * Copyright (c) Tony Bybell 2010 * * 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. */ #ifndef WAVE_FETCHBUTTONS_H #define WAVE_FETCHBUTTONS_H void fetch_left(GtkWidget *text, gpointer data); void fetch_right(GtkWidget *text, gpointer data); void discard_left(GtkWidget *text, gpointer data); void discard_right(GtkWidget *text, gpointer data); #endif gtkwave-3.3.86/src/jrb.h0000664000175000017500000000634113166335473014325 0ustar bybellbybell#ifndef _JRB_H_ #define _JRB_H_ /* The Jval -- a type that can hold any 8-byte type */ typedef union { int i; long l; float f; double d; void *v; char *s; char c; unsigned char uc; short sh; unsigned short ush; unsigned int ui; int iarray[2]; float farray[2]; char carray[8]; unsigned char ucarray[8]; } Jval; struct jrb_chain { /* added for rtlbrowse */ struct jrb_chain *next; Jval val; }; /* Main jrb_node. You only ever use the fields flink blink k.key or k.ikey v.val */ typedef struct jrb_node { unsigned char red; unsigned char internal; unsigned char left; unsigned char roothead; /* (bit 1 is root, bit 2 is head) */ struct jrb_node *flink; struct jrb_node *blink; struct jrb_node *parent; Jval key; Jval val; } *JRB; extern JRB make_jrb(void); /* Creates a new rb-tree */ /* Creates a node with key key and val val and inserts it into the tree. jrb_insert uses strcmp() as comparison funcion. jrb_inserti uses <>=, jrb_insertg uses func() */ extern JRB jrb_insert_str(JRB tree, char *key, Jval val); extern JRB jrb_insert_int(JRB tree, int ikey, Jval val); extern JRB jrb_insert_vptr(JRB tree, void *vkey, Jval val); extern JRB jrb_insert_gen(JRB tree, Jval key, Jval val, int (*func)(Jval,Jval)); /* returns an external node in t whose value is equal k. Returns NULL if there is no such node in the tree */ extern JRB jrb_find_str(JRB root, const char *key); extern JRB jrb_find_int(JRB root, int ikey); extern JRB jrb_find_vptr(JRB root, void *vkey); extern JRB jrb_find_gen(JRB root, Jval, int (*func)(Jval, Jval)); /* returns an external node in t whose value is equal k or whose value is the smallest value greater than k. Sets found to 1 if the key was found, and 0 otherwise. */ extern JRB jrb_find_gte_str(JRB root, const char *key, int *found); extern JRB jrb_find_gte_int(JRB root, int ikey, int *found); extern JRB jrb_find_gte_vptr(JRB root, void *vkey, int *found); extern JRB jrb_find_gte_gen(JRB root, Jval key, int (*func)(Jval, Jval), int *found); /* Creates a node with key key and val val and inserts it into the tree before/after node nd. Does not check to ensure that you are keeping the correct order */ extern void jrb_delete_node(JRB node); /* Deletes and frees a node (but not the key or val) */ extern void jrb_free_tree(JRB root); /* Deletes and frees an entire tree */ extern Jval jrb_val(JRB node); /* Returns node->v.val -- this is to shut lint up */ extern int jrb_nblack(JRB n); /* returns # of black nodes in path from n to the root */ int jrb_plength(JRB n); /* returns the # of nodes in path from n to the root */ #define jrb_first(n) (n->flink) #define jrb_last(n) (n->blink) #define jrb_next(n) (n->flink) #define jrb_prev(n) (n->blink) #define jrb_empty(t) (t->flink == t) #ifndef jrb_nil #define jrb_nil(t) (t) #endif #define jrb_traverse(ptr, lst) \ for(ptr = jrb_first(lst); ptr != jrb_nil(lst); ptr = jrb_next(ptr)) #define jrb_rtraverse(ptr, lst) \ for(ptr = jrb_last(lst); ptr != jrb_nil(lst); ptr = jrb_prev(ptr)) #endif gtkwave-3.3.86/src/wavealloca.h0000664000175000017500000000120313166335473015656 0ustar bybellbybell/* * Copyright (c) Tony Bybell 1999. * * 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. */ #ifndef WAVE_ALLOCA_H #define WAVE_ALLOCA_H #include #ifdef HAVE_ALLOCA_H #include #elif defined(__GNUC__) #ifndef __MINGW32__ #ifndef alloca #define alloca __builtin_alloca #endif #else #include #endif #elif defined(_MSC_VER) #include #define alloca _alloca #endif #define wave_alloca alloca #endif gtkwave-3.3.86/src/ghw.c0000664000175000017500000007417213166335473014337 0ustar bybellbybell/* GHDL Wavefile reader interface. Copyright (C) 2005-2014 Tristan Gingold and Tony Bybell GHDL 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, or (at your option) any later version. GHDL 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 GCC; see the file COPYING. If not, write to the Free Software Foundation, 51 Franklin Street - Suite 500, Boston, MA 02110-1335, USA. */ #include "globals.h" #include #include "ghw.h" #include "ghwlib.h" #include "tree.h" /************************ splay ************************/ /* * NOTE: * a GHW tree's "which" is not the same as a gtkwave "which" * in that gtkwave's points to the facs[] array and * GHW's functions as an alias handle. The following * (now global) vars are used to resolve those differences... * * static struct Node **nxp; * static struct symbol *sym_head = NULL, *sym_curr = NULL; * static int sym_which = 0; */ /* * pointer splay */ typedef struct ghw_tree_node ghw_Tree; struct ghw_tree_node { ghw_Tree * left, * right; void *item; int val_old; struct symbol *sym; }; long ghw_cmp_l(void *i, void *j) { uintptr_t il = (uintptr_t)i, jl = (uintptr_t)j; return(il - jl); } static ghw_Tree * ghw_splay (void *i, ghw_Tree * t) { /* Simple top down splay, not requiring i to be in the tree t. */ /* What it does is described above. */ ghw_Tree N, *l, *r, *y; int dir; if (t == NULL) return t; N.left = N.right = NULL; l = r = &N; for (;;) { dir = ghw_cmp_l(i, t->item); if (dir < 0) { if (t->left == NULL) break; if (ghw_cmp_l(i, t->left->item)<0) { y = t->left; /* rotate right */ t->left = y->right; y->right = t; t = y; if (t->left == NULL) break; } r->left = t; /* link right */ r = t; t = t->left; } else if (dir > 0) { if (t->right == NULL) break; if (ghw_cmp_l(i, t->right->item)>0) { y = t->right; /* rotate left */ t->right = y->left; y->left = t; t = y; if (t->right == NULL) break; } l->right = t; /* link left */ l = t; t = t->right; } else { break; } } l->right = t->left; /* assemble */ r->left = t->right; t->left = N.right; t->right = N.left; return t; } static ghw_Tree * ghw_insert(void *i, ghw_Tree * t, int val, struct symbol *sym) { /* Insert i into the tree t, unless it's already there. */ /* Return a pointer to the resulting tree. */ ghw_Tree * n; int dir; n = (ghw_Tree *) calloc_2(1, sizeof (ghw_Tree)); if (n == NULL) { fprintf(stderr, "ghw_insert: ran out of memory, exiting.\n"); exit(255); } n->item = i; n->val_old = val; n->sym = sym; if (t == NULL) { n->left = n->right = NULL; return n; } t = ghw_splay(i,t); dir = ghw_cmp_l(i,t->item); if (dir<0) { n->left = t->left; n->right = t; t->left = NULL; return n; } else if (dir>0) { n->right = t->right; n->left = t; t->right = NULL; return n; } else { /* We get here if it's already in the tree */ /* Don't add it again */ free_2(n); return t; } } /* * chain together bits of the same fac */ int strand_pnt(char *s) { int len = strlen(s) - 1; int i; int rc = -1; if(s[len] == ']') { for(i=len-1;i>0;i--) { if(((s[i]>='0') && (s[i]<='9')) || (s[i] == '-')) continue; if(s[i] != '[') break; return(i); /* position right before left bracket for strncmp */ } } return(rc); } void rechain_facs(void) { int i; struct symbol *psr = NULL; struct symbol *root = NULL; for(i=0;inumfacs;i++) { if(psr) { char *fstr1 = GLOBALS->facs[i-1]->name; char *fstr2 = GLOBALS->facs[i]->name; int p1 = strand_pnt(fstr1); int p2 = strand_pnt(fstr2); if(!root) { if((p1>=0)&&(p1==p2)) { if(!strncmp(fstr1, fstr2, p1)) { root = GLOBALS->facs[i-1]; root->vec_root = root; root->vec_chain = GLOBALS->facs[i]; GLOBALS->facs[i]->vec_root = root; } } } else { if((p1>=0)&&(p1==p2)) { if(!strncmp(fstr1, fstr2, p1)) { psr->vec_chain = GLOBALS->facs[i]; GLOBALS->facs[i]->vec_root = root; } else { root = NULL; } } else { root = NULL; } } } psr = GLOBALS->facs[i]; } } /* * preserve tree->t_which ordering so hierarchy children index pointers don't get corrupted */ #if 1 /* limited recursive version */ static void recurse_tree_build_whichcache(struct tree *t) { if(t) { struct tree *t2 = t; int i; int cnt = 1; struct tree **ar; while((t2 = t2->next)) { cnt++; } ar = malloc_2(cnt * sizeof(struct tree *)); t2 = t; for(i=0;ichild) { recurse_tree_build_whichcache(t2->child); } t2 = t2->next; } for(i=cnt-1;i>=0;i--) { t = ar[i]; if(t->t_which >= 0) { GLOBALS->gwt_ghw_c_1 = ghw_insert(t, GLOBALS->gwt_ghw_c_1, t->t_which, GLOBALS->facs[t->t_which]); } } free_2(ar); } } static void recurse_tree_fix_from_whichcache(struct tree *t) { if(t) { struct tree *t2 = t; int i; int cnt = 1; struct tree **ar; while((t2 = t2->next)) { cnt++; } ar = malloc_2(cnt * sizeof(struct tree *)); t2 = t; for(i=0;ichild) { recurse_tree_fix_from_whichcache(t2->child); } t2 = t2->next; } for(i=cnt-1;i>=0;i--) { t = ar[i]; if(t->t_which >= 0) { GLOBALS->gwt_ghw_c_1 = ghw_splay(t, GLOBALS->gwt_ghw_c_1); GLOBALS->gwt_corr_ghw_c_1 = ghw_splay(GLOBALS->gwt_ghw_c_1->sym, GLOBALS->gwt_corr_ghw_c_1); /* all facs are in this tree so this is OK */ t->t_which = GLOBALS->gwt_corr_ghw_c_1->val_old; } } free_2(ar); } } #else /* original fully-recursive version */ static void recurse_tree_build_whichcache(struct tree *t) { if(t) { if(t->child) { recurse_tree_build_whichcache(t->child); } if(t->next) { recurse_tree_build_whichcache(t->next); } if(t->t_which >= 0) GLOBALS->gwt_ghw_c_1 = ghw_insert(t, GLOBALS->gwt_ghw_c_1, t->t_which, GLOBALS->facs[t->t_which]); } } static void recurse_tree_fix_from_whichcache(struct tree *t) { if(t) { if(t->child) { recurse_tree_fix_from_whichcache(t->child); } if(t->next) { recurse_tree_fix_from_whichcache(t->next); } if(t->t_which >= 0) { GLOBALS->gwt_ghw_c_1 = ghw_splay(t, GLOBALS->gwt_ghw_c_1); GLOBALS->gwt_corr_ghw_c_1 = ghw_splay(GLOBALS->gwt_ghw_c_1->sym, GLOBALS->gwt_corr_ghw_c_1); /* all facs are in this tree so this is OK */ t->t_which = GLOBALS->gwt_corr_ghw_c_1->val_old; } } } #endif static void incinerate_whichcache_tree(ghw_Tree *t) { if(t->left) incinerate_whichcache_tree(t->left); if(t->right) incinerate_whichcache_tree(t->right); free_2(t); } /* * sort facs and also cache/reconstruct tree->t_which pointers */ static void ghw_sortfacs(void) { int i; recurse_tree_build_whichcache(GLOBALS->treeroot); for(i=0;inumfacs;i++) { char *subst; #ifdef WAVE_HIERFIX char ch; #endif int len; struct symbol *curnode = GLOBALS->facs[i]; subst=curnode->name; if((len=strlen(subst))>GLOBALS->longestname) GLOBALS->longestname=len; #ifdef WAVE_HIERFIX while((ch=(*subst))) { if(ch==GLOBALS->hier_delimeter) { *subst=VCDNAM_HIERSORT; } /* forces sort at hier boundaries */ subst++; } #endif } wave_heapsort(GLOBALS->facs,GLOBALS->numfacs); for(i=0;inumfacs;i++) { GLOBALS->gwt_corr_ghw_c_1 = ghw_insert(GLOBALS->facs[i], GLOBALS->gwt_corr_ghw_c_1, i, NULL); } recurse_tree_fix_from_whichcache(GLOBALS->treeroot); if(GLOBALS->gwt_ghw_c_1) { incinerate_whichcache_tree(GLOBALS->gwt_ghw_c_1); GLOBALS->gwt_ghw_c_1 = NULL; } if(GLOBALS->gwt_corr_ghw_c_1) { incinerate_whichcache_tree(GLOBALS->gwt_corr_ghw_c_1); GLOBALS->gwt_corr_ghw_c_1 = NULL; } #ifdef WAVE_HIERFIX for(i=0;inumfacs;i++) { char *subst, ch; subst=GLOBALS->facs[i]->name; while((ch=(*subst))) { if(ch==VCDNAM_HIERSORT) { *subst=GLOBALS->hier_delimeter; } /* restore back to normal */ subst++; } } #endif GLOBALS->facs_are_sorted=1; } /*******************************************************************************/ static struct tree * build_hierarchy_type (struct ghw_handler *h, union ghw_type *t, const char *pfx, unsigned int **sig); static struct tree * build_hierarchy_record (struct ghw_handler *h, const char *pfx, unsigned nbr_els, struct ghw_record_element *els, unsigned int **sig) { struct tree *res; struct tree *last; struct tree *c; unsigned int i; res = (struct tree *) calloc_2(1, sizeof (struct tree) + strlen(pfx) + 1); strcpy(res->name, (char *)pfx); res->t_which = WAVE_T_WHICH_UNDEFINED_COMPNAME; last = NULL; for (i = 0; i < nbr_els; i++) { c = build_hierarchy_type (h, els[i].type, els[i].name, sig); if (last == NULL) res->child = c; else last->next = c; last = c; } return res; } static void build_hierarchy_array (struct ghw_handler *h, union ghw_type *arr, int dim, const char *pfx, struct tree **res, unsigned int **sig) { union ghw_type *idx; struct ghw_type_array *base = arr->sa.base; char *name = NULL; if (dim == base->nbr_dim) { struct tree *t; sprintf (GLOBALS->asbuf, "%s]", pfx); name = strdup_2(GLOBALS->asbuf); t = build_hierarchy_type (h, base->el, name, sig); if (*res != NULL) (*res)->next = t; *res = t; return; } idx = ghw_get_base_type (base->dims[dim]); switch (idx->kind) { case ghdl_rtik_type_i32: { int32_t v; char *nam; struct ghw_range_i32 *r; /* struct tree *last; */ int len; /* last = NULL; */ r = &arr->sa.rngs[dim]->i32; len = ghw_get_range_length ((union ghw_range *)r); if (len <= 0) break; v = r->left; while (1) { sprintf(GLOBALS->asbuf, "%s%c"GHWPRI32, pfx, dim == 0 ? '[' : ',', v); nam = strdup_2(GLOBALS->asbuf); build_hierarchy_array (h, arr, dim + 1, nam, res, sig); free_2(nam); if (v == r->right) break; if (r->dir == 0) v++; else v--; } } return; case ghdl_rtik_type_e8: { int32_t v; char *nam; struct ghw_range_e8 *r; /* struct tree *last; */ int len; /* last = NULL; */ r = &arr->sa.rngs[dim]->e8; len = ghw_get_range_length ((union ghw_range *)r); if (len <= 0) break; v = r->left; while (1) { sprintf(GLOBALS->asbuf, "%s%c"GHWPRI32, pfx, dim == 0 ? '[' : ',', v); nam = strdup_2(GLOBALS->asbuf); build_hierarchy_array (h, arr, dim + 1, nam, res, sig); free_2(nam); if (v == r->right) break; if (r->dir == 0) v++; else v--; } } return; /* PATCH-BEGIN: */ case ghdl_rtik_type_b2: { int32_t v; char *nam; struct ghw_range_b2 *r; /* struct tree *last; */ int len; /* last = NULL; */ r = &arr->sa.rngs[dim]->b2; len = ghw_get_range_length ((union ghw_range *)r); if (len <= 0) break; v = r->left; while (1) { sprintf(GLOBALS->asbuf, "%s%c"GHWPRI32, pfx, dim == 0 ? '[' : ',', v); nam = strdup_2(GLOBALS->asbuf); build_hierarchy_array (h, arr, dim + 1, nam, res, sig); free_2(nam); if (v == r->right) break; if (r->dir == 0) v++; else v--; } } return; /* PATCH-END: */ default: fprintf (stderr, "build_hierarchy_array: unhandled type %d\n", idx->kind); abort (); } } static struct tree * build_hierarchy_type (struct ghw_handler *h, union ghw_type *t, const char *pfx, unsigned int **sig) { struct tree *res; struct symbol *s; switch (t->kind) { case ghdl_rtik_subtype_scalar: return build_hierarchy_type (h, t->ss.base, pfx, sig); case ghdl_rtik_type_b2: case ghdl_rtik_type_e8: case ghdl_rtik_type_f64: case ghdl_rtik_type_i32: case ghdl_rtik_type_i64: case ghdl_rtik_type_p32: case ghdl_rtik_type_p64: s = calloc_2(1, sizeof(struct symbol)); if(!GLOBALS->firstnode) { GLOBALS->firstnode= GLOBALS->curnode=calloc_2(1, sizeof(struct symchain)); } else { GLOBALS->curnode->next=calloc_2(1, sizeof(struct symchain)); GLOBALS->curnode=GLOBALS->curnode->next; } GLOBALS->curnode->symbol=s; GLOBALS->nbr_sig_ref_ghw_c_1++; res = (struct tree *) calloc_2(1, sizeof (struct tree) + strlen(pfx) + 1); strcpy(res->name, (char *)pfx); res->t_which = *(*sig)++; s->n = GLOBALS->nxp_ghw_c_1[res->t_which]; return res; case ghdl_rtik_subtype_array: case ghdl_rtik_subtype_array_ptr: { struct tree *r; res = (struct tree *) calloc_2(1, sizeof (struct tree) + strlen(pfx) + 1); strcpy(res->name, (char *)pfx); res->t_which = WAVE_T_WHICH_UNDEFINED_COMPNAME; r = res; build_hierarchy_array (h, t, 0, "", &res, sig); r->child = r->next; r->next = NULL; return r; } case ghdl_rtik_type_record: return build_hierarchy_record(h, pfx, t->rec.nbr_fields, t->rec.els, sig); case ghdl_rtik_subtype_record: return build_hierarchy_record (h, pfx, t->sr.base->nbr_fields, t->sr.els, sig); default: fprintf (stderr, "build_hierarchy_type: unhandled type %d\n", t->kind); abort (); } } /* Create the gtkwave tree from the GHW hierarchy. */ static struct tree * build_hierarchy (struct ghw_handler *h, struct ghw_hie *hie) { struct tree *t; struct tree *t_ch; struct tree *prev; struct ghw_hie *ch; unsigned char ttype; switch (hie->kind) { case ghw_hie_design: case ghw_hie_block: case ghw_hie_instance: case ghw_hie_generate_for: case ghw_hie_generate_if: case ghw_hie_package: /* Convert kind. */ switch(hie->kind) { case ghw_hie_design: ttype = TREE_VHDL_ST_DESIGN; break; case ghw_hie_block: ttype = TREE_VHDL_ST_BLOCK; break; case ghw_hie_instance: ttype = TREE_VHDL_ST_INSTANCE; break; case ghw_hie_generate_for: ttype = TREE_VHDL_ST_GENFOR; break; case ghw_hie_generate_if: ttype = TREE_VHDL_ST_GENIF; break; case ghw_hie_package: default: ttype = TREE_VHDL_ST_PACKAGE; break; } /* For iterative generate, add the index. */ if (hie->kind == ghw_hie_generate_for) { char buf[128]; int name_len, buf_len; char *n; ghw_get_value (buf, sizeof (buf), hie->u.blk.iter_value, hie->u.blk.iter_type); name_len = strlen (hie->name); buf_len = strlen (buf); t = (struct tree *) calloc_2(1, sizeof (struct tree) + (2 + buf_len + name_len + 1)); t->kind = ttype; n = t->name; memcpy (n, hie->name, name_len); n += name_len; *n++ = '['; memcpy (n, buf, buf_len); n += buf_len; *n++ = ']'; *n = 0; } else { if(hie->name) { t = (struct tree *) calloc_2(1, sizeof (struct tree) + strlen(hie->name) + 1); t->kind = ttype; strcpy(t->name, (char *)hie->name); } else { t = (struct tree *) calloc_2(1, sizeof (struct tree) + 1); t->kind = ttype; } } t->t_which = WAVE_T_WHICH_UNDEFINED_COMPNAME; /* Recurse. */ prev = NULL; for (ch = hie->u.blk.child; ch != NULL; ch = ch->brother) { t_ch = build_hierarchy (h, ch); if (t_ch != NULL) { if (prev == NULL) t->child = t_ch; else prev->next = t_ch; prev = t_ch; } } return t; case ghw_hie_process: return NULL; case ghw_hie_signal: case ghw_hie_port_in: case ghw_hie_port_out: case ghw_hie_port_inout: case ghw_hie_port_buffer: case ghw_hie_port_linkage: { unsigned int *ptr = hie->u.sig.sigs; /* Convert kind. */ switch(hie->kind) { case ghw_hie_signal: ttype = TREE_VHDL_ST_SIGNAL; break; case ghw_hie_port_in: ttype = TREE_VHDL_ST_PORTIN; break; case ghw_hie_port_out: ttype = TREE_VHDL_ST_PORTOUT; break; case ghw_hie_port_inout: ttype = TREE_VHDL_ST_PORTINOUT; break; case ghw_hie_port_buffer: ttype = TREE_VHDL_ST_BUFFER; break; case ghw_hie_port_linkage: default: ttype = TREE_VHDL_ST_LINKAGE; break; } /* Convert type. */ t = build_hierarchy_type (h, hie->u.sig.type, hie->name, &ptr); if (*ptr != 0) abort (); if(t) { t->kind = ttype; } return t; } default: fprintf (stderr, "ghw: build_hierarchy: cannot handle hie %d\n", hie->kind); abort (); } } void facs_debug (void) { int i; struct Node *n; for (i = 0; i < GLOBALS->numfacs; i++) { hptr h; n = GLOBALS->facs[i]->n; printf ("%d: %s\n", i, n->nname); if (n->extvals) printf (" ext: %d - %d\n", n->msi, n->lsi); for (h = &n->head; h; h = h->next) printf (" time:"TTFormat" flags:%02x vect:%p\n", h->time, h->flags, h->v.h_vector); } } static void create_facs (struct ghw_handler *h) { int i; struct symchain *sc = GLOBALS->firstnode; GLOBALS->numfacs = GLOBALS->nbr_sig_ref_ghw_c_1; GLOBALS->facs=(struct symbol **)malloc_2(GLOBALS->numfacs*sizeof(struct symbol *)); i = 0; while(sc) { GLOBALS->facs[i++] = sc->symbol; sc = sc->next; } for (i = 0; i < h->nbr_sigs; i++) { struct Node *n = GLOBALS->nxp_ghw_c_1[i]; if (h->sigs[i].type) switch (h->sigs[i].type->kind) { case ghdl_rtik_type_b2: if (h->sigs[i].type->en.wkt == ghw_wkt_bit) { n->extvals = 0; break; } /* FALLTHROUGH */ case ghdl_rtik_type_e8: if (GLOBALS->xlat_1164_ghw_c_1 && h->sigs[i].type->en.wkt == ghw_wkt_std_ulogic) { n->extvals = 0; break; } /* FALLTHROUGH */ case ghdl_rtik_type_i32: case ghdl_rtik_type_p32: n->extvals = 1; n->msi = 31; n->lsi = 0; n->vartype = ND_VCD_INTEGER; break; case ghdl_rtik_type_i64: case ghdl_rtik_type_p64: n->extvals = 1; n->msi = 63; n->lsi = 0; n->vartype = ND_VCD_INTEGER; break; case ghdl_rtik_type_e32: /* ajb: what is e32? */ case ghdl_rtik_type_f64: n->extvals = 1; n->msi = n->lsi = 0; break; default: fprintf (stderr, "ghw:create_facs: unhandled kind %d\n", h->sigs[i].type->kind); n->extvals = 0; } } } static void set_fac_name_1 (struct tree *t) { for (; t != NULL; t = t->next) { int prev_len = GLOBALS->fac_name_len_ghw_c_1; /* Complete the name. */ if(t->name[0]) /* originally (t->name != NULL) when using pointers */ { int len; len = strlen (t->name) + 1; if (len + GLOBALS->fac_name_len_ghw_c_1 >= GLOBALS->fac_name_max_ghw_c_1) { GLOBALS->fac_name_max_ghw_c_1 *= 2; if (GLOBALS->fac_name_max_ghw_c_1 <= len + GLOBALS->fac_name_len_ghw_c_1) GLOBALS->fac_name_max_ghw_c_1 = len + GLOBALS->fac_name_len_ghw_c_1 + 1; GLOBALS->fac_name_ghw_c_1 = realloc_2(GLOBALS->fac_name_ghw_c_1, GLOBALS->fac_name_max_ghw_c_1); } if(t->name[0] != '[') { GLOBALS->fac_name_ghw_c_1[GLOBALS->fac_name_len_ghw_c_1] = '.'; /* The NUL is copied, since LEN is 1 + strlen. */ memcpy (GLOBALS->fac_name_ghw_c_1 + GLOBALS->fac_name_len_ghw_c_1 + 1, t->name, len); GLOBALS->fac_name_len_ghw_c_1 += len; } else { memcpy (GLOBALS->fac_name_ghw_c_1 + GLOBALS->fac_name_len_ghw_c_1, t->name, len); GLOBALS->fac_name_len_ghw_c_1 += (len - 1); } } if (t->t_which >= 0) { struct symchain *sc = GLOBALS->firstnode; struct symbol *s = sc->symbol; s->name = strdup_2(GLOBALS->fac_name_ghw_c_1); s->n = GLOBALS->nxp_ghw_c_1[t->t_which]; if(!s->n->nname) s->n->nname = s->name; t->t_which = GLOBALS->sym_which_ghw_c_1++; /* patch in gtkwave "which" as node is correct */ GLOBALS->curnode = GLOBALS->firstnode->next; free_2(GLOBALS->firstnode); GLOBALS->firstnode = GLOBALS->curnode; } if (t->child) set_fac_name_1 (t->child); /* Revert name. */ GLOBALS->fac_name_len_ghw_c_1 = prev_len; GLOBALS->fac_name_ghw_c_1[GLOBALS->fac_name_len_ghw_c_1] = 0; } } static void set_fac_name (struct ghw_handler *h) { if (GLOBALS->fac_name_max_ghw_c_1 == 0) { GLOBALS->fac_name_max_ghw_c_1 = 1024; GLOBALS->fac_name_ghw_c_1 = malloc_2(GLOBALS->fac_name_max_ghw_c_1); } GLOBALS->fac_name_len_ghw_c_1 = 3; memcpy (GLOBALS->fac_name_ghw_c_1, "top", 4); GLOBALS->last_fac_ghw_c_1 = h->nbr_sigs; set_fac_name_1 (GLOBALS->treeroot); } static void add_history (struct ghw_handler *h, struct Node *n, int sig_num) { struct HistEnt *he; struct ghw_sig *sig = &h->sigs[sig_num]; union ghw_type *sig_type = sig->type; int flags; int is_vector = 0; #ifdef WAVE_HAS_H_DOUBLE int is_double = 0; #endif if (sig_type == NULL) return; GLOBALS->regions++; switch (sig_type->kind) { case ghdl_rtik_type_i32: case ghdl_rtik_type_i64: case ghdl_rtik_type_p32: case ghdl_rtik_type_p64: flags = 0; break; case ghdl_rtik_type_b2: if (sig_type->en.wkt == ghw_wkt_bit) { flags = 0; break; } /* FALLTHROUGH */ case ghdl_rtik_type_e8: if (GLOBALS->xlat_1164_ghw_c_1 && sig_type->en.wkt == ghw_wkt_std_ulogic) { flags = 0; break; } /* FALLTHROUGH */ case ghdl_rtik_type_e32: flags = HIST_STRING|HIST_REAL; if (HIST_STRING == 0) { if (!GLOBALS->warned_ghw_c_1) fprintf (stderr, "warning: do not compile with STRICT_VCD\n"); GLOBALS->warned_ghw_c_1 = 1; return; } break; case ghdl_rtik_type_f64: flags = HIST_REAL; break; default: fprintf (stderr, "ghw:add_history: unhandled kind %d\n", sig->type->kind); return; } if(!n->curr) { he=histent_calloc(); he->flags = flags; he->time=-1; he->v.h_vector=NULL; n->head.next=he; n->curr=he; n->head.time = -2; } he=histent_calloc(); he->flags = flags; he->time=h->snap_time; switch (sig_type->kind) { case ghdl_rtik_type_b2: if (sig_type->en.wkt == ghw_wkt_bit) he->v.h_val = sig->val->b2 == 0 ? AN_0 : AN_1; else { he->v.h_vector = (char *)sig->type->en.lits[sig->val->b2]; is_vector = 1; } break; case ghdl_rtik_type_e8: if (GLOBALS->xlat_1164_ghw_c_1 && sig_type->en.wkt == ghw_wkt_std_ulogic) { /* Res: 0->0, 1->X, 2->Z, 3->1 */ static const char map_su2vlg[9] = { /* U */ AN_U, /* X */ AN_X, /* 0 */ AN_0, /* 1 */ AN_1, /* Z */ AN_Z, /* W */ AN_W, /* L */ AN_L, /* H */ AN_H, /* - */ AN_DASH }; he->v.h_val = map_su2vlg[sig->val->e8]; } else { he->v.h_vector = (char *)sig_type->en.lits[sig->val->e8]; is_vector = 1; } break; case ghdl_rtik_type_f64: { #ifdef WAVE_HAS_H_DOUBLE he->v.h_double = sig->val->f64; is_double = 1; #else double *d = malloc_2(sizeof (double)); *d = sig->val->f64; he->v.h_vector = (char *)d; is_vector = 1; #endif } break; case ghdl_rtik_type_i32: case ghdl_rtik_type_p32: { int i; he->v.h_vector = malloc_2(32); for(i=0;i<32;i++) { he->v.h_vector[31-i] = ((sig->val->i32 >> i) & 1) ? AN_1: AN_0; } } is_vector = 1; break; case ghdl_rtik_type_i64: case ghdl_rtik_type_p64: { int i; he->v.h_vector = malloc_2(64); for(i=0;i<64;i++) { he->v.h_vector[63-i] = ((sig->val->i64 >> i) & 1) ? AN_1: AN_0; } } is_vector = 1; break; default: abort (); } /* deglitch */ if(n->curr->time == he->time) { int gl_add = 0; if(n->curr->time) /* filter out time zero glitches */ { gl_add = 1; } GLOBALS->num_glitches_ghw_c_1 += gl_add; if(!(n->curr->flags&HIST_GLITCH)) { if(gl_add) { n->curr->flags|=HIST_GLITCH; /* set the glitch flag */ GLOBALS->num_glitch_regions_ghw_c_1++; } } #ifdef WAVE_HAS_H_DOUBLE if(is_double) { n->curr->v.h_double = he->v.h_double; } else #endif if(is_vector) { if(n->curr->v.h_vector && sig_type->kind != ghdl_rtik_type_b2 && sig_type->kind != ghdl_rtik_type_e8) free_2(n->curr->v.h_vector); n->curr->v.h_vector = he->v.h_vector; /* can't free up this "he" because of block allocation so assume it's dead */ } else { n->curr->v.h_val = he->v.h_val; } return; } else /* look for duplicate dumps of same value at adjacent times */ { if(!is_vector #ifdef WAVE_HAS_H_DOUBLE & !is_double #endif ) { if(n->curr->v.h_val == he->v.h_val) { return; /* can't free up this "he" because of block allocation so assume it's dead */ } } } n->curr->next=he; n->curr=he; } static void add_tail (struct ghw_handler *h) { int i; TimeType j; for (j = 1; j>=0 ; j--) /* add two endcaps */ for (i = 0; i < h->nbr_sigs; i++) { struct ghw_sig *sig = &h->sigs[i]; struct Node *n = GLOBALS->nxp_ghw_c_1[i]; struct HistEnt *he; if (sig->type == NULL || n == NULL || !n->curr) continue; /* Copy the last one. */ he = histent_calloc(); *he = *n->curr; he->time = MAX_HISTENT_TIME - j; he->next = NULL; /* Append. */ n->curr->next=he; n->curr=he; } } static void read_traces (struct ghw_handler *h) { int *list; int i; enum ghw_res res; list = malloc_2((GLOBALS->numfacs + 1) * sizeof (int)); while (1) { res = ghw_read_sm_hdr (h, list); switch (res) { case ghw_res_error: case ghw_res_eof: free_2(list); return; case ghw_res_ok: case ghw_res_other: break; case ghw_res_snapshot: if (h->snap_time > GLOBALS->max_time) GLOBALS->max_time = h->snap_time; /* printf ("Time is "GHWPRI64"\n", h->snap_time); */ for (i = 0; i < h->nbr_sigs; i++) add_history (h, GLOBALS->nxp_ghw_c_1[i], i); break; case ghw_res_cycle: while (1) { int sig; /* printf ("Time is "GHWPRI64"\n", h->snap_time); */ if (h->snap_time < LLDescriptor(9223372036854775807)) { if (h->snap_time > GLOBALS->max_time) GLOBALS->max_time = h->snap_time; for (i = 0; (sig = list[i]) != 0; i++) add_history (h, GLOBALS->nxp_ghw_c_1[sig], sig); } res = ghw_read_cycle_next (h); if (res != 1) break; res = ghw_read_cycle_cont (h, list); if (res < 0) break; } if (res < 0) break; res = ghw_read_cycle_end (h); if (res < 0) break; break; } } } /*******************************************************************************/ TimeType ghw_main(char *fname) { struct ghw_handler handle; int i; int rc; if(!GLOBALS->hier_was_explicitly_set) /* set default hierarchy split char */ { GLOBALS->hier_delimeter='.'; } handle.flag_verbose = 0; if ((rc=ghw_open (&handle, fname)) < 0) { fprintf (stderr, "Error opening ghw file '%s', rc=%d.\n", fname, rc); return(LLDescriptor(0)); /* look at return code in caller for success status... */ } GLOBALS->time_scale = 1; GLOBALS->time_dimension = 'f'; GLOBALS->asbuf = malloc_2(4097); if (ghw_read_base (&handle) < 0) { free_2(GLOBALS->asbuf); GLOBALS->asbuf = NULL; fprintf (stderr, "Error in ghw file '%s'.\n", fname); return(LLDescriptor(0)); /* look at return code in caller for success status... */ } GLOBALS->min_time = 0; GLOBALS->max_time = 0; GLOBALS->nbr_sig_ref_ghw_c_1 = 0; GLOBALS->nxp_ghw_c_1 =(struct Node **)calloc_2(handle.nbr_sigs, sizeof(struct Node *)); for(i=0;inxp_ghw_c_1[i] = (struct Node *)calloc_2(1,sizeof(struct Node)); } GLOBALS->treeroot = build_hierarchy (&handle, handle.hie); /* GHW does not contains a 'top' name. FIXME: should use basename of the file. */ create_facs (&handle); read_traces (&handle); add_tail (&handle); set_fac_name (&handle); free_2(GLOBALS->nxp_ghw_c_1); GLOBALS->nxp_ghw_c_1 = NULL; /* fix up names on aliased nodes via cloning... */ for(i=0;inumfacs;i++) { if(strcmp(GLOBALS->facs[i]->name, GLOBALS->facs[i]->n->nname)) { struct Node *n = malloc_2(sizeof(struct Node)); memcpy(n, GLOBALS->facs[i]->n, sizeof(struct Node)); GLOBALS->facs[i]->n = n; n->nname = GLOBALS->facs[i]->name; } } /* treeroot->name = "top"; */ { const char *base_hier = "top"; struct tree *t = calloc_2(1, sizeof(struct tree) + strlen(base_hier) + 1); memcpy(t, GLOBALS->treeroot, sizeof(struct tree)); strcpy(t->name, base_hier); /* scan-build false warning here, thinks name[1] is total length */ #ifndef WAVE_TALLOC_POOL_SIZE free_2(GLOBALS->treeroot); /* if using tree alloc pool, can't deallocate this */ #endif GLOBALS->treeroot = t; } ghw_close (&handle); rechain_facs(); /* vectorize bitblasted nets */ ghw_sortfacs(); /* sort nets as ghw is unsorted ... also fix hier tree (it should really be built *after* facs are sorted!) */ #if 0 treedebug(GLOBALS->treeroot,""); facs_debug(); #endif GLOBALS->is_ghw = 1; fprintf(stderr, "["TTFormat"] start time.\n["TTFormat"] end time.\n", GLOBALS->min_time*GLOBALS->time_scale, GLOBALS->max_time*GLOBALS->time_scale); if(GLOBALS->num_glitches_ghw_c_1) fprintf(stderr, "Warning: encountered %d glitch%s across %d glitch region%s.\n", GLOBALS->num_glitches_ghw_c_1, (GLOBALS->num_glitches_ghw_c_1!=1)?"es":"", GLOBALS->num_glitch_regions_ghw_c_1, (GLOBALS->num_glitch_regions_ghw_c_1!=1)?"s":""); return GLOBALS->max_time; } /*******************************************************************************/ gtkwave-3.3.86/compile0000775000175000017500000001624513166335473014172 0ustar bybellbybell#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # Written by Tom Tromey . # # 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, 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: gtkwave-3.3.86/config.guess0000775000175000017500000012746313166335473015141 0ustar bybellbybell#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012, 2013 Free Software Foundation, Inc. timestamp='2012-12-29' # This file 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 3 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, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-gnueabi else echo ${UNAME_MACHINE}-unknown-linux-gnueabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: gtkwave-3.3.86/config.sub0000775000175000017500000010546713166335473014604 0ustar bybellbybell#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012, 2013 Free Software Foundation, Inc. timestamp='2012-12-29' # This file 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 3 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, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 \ | ns16k | ns32k \ | open8 \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: gtkwave-3.3.86/README0000664000175000017500000001246713166335473013476 0ustar bybellbybell1) Type ./configure 2) make 3) make install (as root) Make sure you copy the .gtkwaverc file to your home directory or to your VCD project directory. It contains the prefs for a good configuration that most people find ergonomic. It is not strictly necessary however. [Note: for mingw builds with gtk+-1, you might need a fake gtk-config file like the following..] <> #!/bin/sh if [ "$1" == "--libs" ] then echo -L/home/bybell/libs -lgck -lgdk-1.3 -lgimp-1.2 -lgimpi -lgimpui-1.2 -lglib-1.3 -lgmodule-1.3 -lgnu-intl -lgobject-1.3 -lgthread-1.3 -lgtk-1.3 -liconv-1.3 -ljpeg -llibgplugin_a -llibgplugin_b -lpng -lpthread32 -ltiff-lzw -ltiff-nolzw -ltiff fi if [ "$1" == "--cflags" ] then echo " -mms-bitfields -I/home/bybell/src/glib -I/home/bybell/src/gtk+/gtk -I/home/bybell/src/gtk+/gdk -I/home/bybell/src/gtk+ " fi <> [Note2: for mingw with gtk+-2, you don't need to do anything except have pkg-config in your PATH however the following note is from Thomas Uhle.] Important to know is to compile with CFLAGS=-mms-bitfields in Windows in order to link correctly to the GTK+ dlls. This is how I did configure GTKWave with additional optimisation switches: ./configure CFLAGS='-Wall -O3 -mcpu=i686 -mms-bitfields -ffast-math -fstrict-aliasing' After that you may just call make the usual way. Note that Ver Structural Verilog Compiler AET files are no longer supported. They have been superceded by LXT. Also note that the AMULET group will be taking over maintenance of the viewer effective immediately. -251201ajb bybell@nc.rr.com AMULET has ceased development of the 2.x branch of the viewer. 1.3 apparently is the only active version currently. -150405ajb bybell@nc.rr.com The 1.3 series has been promoted to 3.x in order to prevent confusion over what version of the viewer is the latest. Starting with 3.x, the viewer supports source code annotation. -030406ajb bybell@nc.rr.com Add these flags to your compile for new warnings on AMD64: -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic on i386: -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables -150407ajb For cvs access to the experimental, pre-release sourcetree on Sourceforge: cvs -d:pserver:anonymous@gtkwave.cvs.sourceforge.net:/cvsroot/gtkwave login [press enter] cvs -z3 -d:pserver:anonymous@gtkwave.cvs.sourceforge.net:/cvsroot/gtkwave co -P gtkwave3 -191208ajb bybell@nc.rr.com CVS is no longer being updated, for SVN access: svn co https://gtkwave.svn.sourceforge.net/svnroot/gtkwave gtkwave -310511ajb =============================================================================== Note (1) For Ubuntu users: I had to do the following to get it to install directly. Please include in INSTALL .txt as an option for ubuntu users. Other linux distributions might have other things to do. sudo apt-get install libgtk2.0-dev ./configure --with-tcl=/usr/lib/tcl8.4 --with-tk=/usr/lib/tk8.4 -030109ajb bybell@nc.rr.com Note (2) For Ubuntu users: If your compile fails because gzopen64 cannot be found, you will either have to fix your Ubuntu install or use the version of libz in gtkwave: ./configure --enable-local-libz -140409ajb bybell@nc.rr.com Note (3) For Ubuntu users (version 11.10): sudo apt-get install libjudy-dev sudo apt-get install libbz2-dev sudo apt-get install liblzma-dev sudo apt-get install libgconf2-dev sudo apt-get install libgtk2.0-dev sudo apt-get install tcl-dev sudo apt-get install tk-dev sudo apt-get install gperf sudo apt-get install gtk2-engines-pixbuf Configure then as: ./configure --enable-judy --enable-struct-pack --with-gconf -010212ajb bybell@nc.rr.com =============================================================================== Notes for Mac OSX users: Install MacPorts then sudo port -v selfupdate sudo port install Judy tcl tk xz-devel gtk2 If Quartz is used: sudo port install gtk-osx-application ./configure --prefix=/opt/local --enable-judy --enable-struct-pack "CFLAGS=-I/opt/local/include -O2 -g" LDFLAGS=-L/opt/local/lib --no-create --no-recursion Tcl works in the OSX version of gtkwave starting with version 3.3.26. At this point all features working on Linux should be functional on the Mac, except that twinwave does not render to a single window when Quartz is used instead of X11. If you wish to use llvm, also add "CC=llvm-gcc" and change the "-O2" in CFLAGS to "-O4". At the current time Quartz support is experimental. Please report any bugs encountered as compared to X11 function. === Note that the preferred environment for Quartz builds is jhbuild. To build gtkwave as an app bundle (while in jhbuild shell): ./configure --enable-judy --enable-struct-pack --prefix=/Users/$USER/gtk/inst make make install cd contrib/bundle_for_osx ./make_bundle.sh This assumes that Judy arrays and XZ were both already compiled and installed. If Judy arrays are not installed, do not add --enable-judy. If XZ is not installed, add --disable-xz. The current environment used is modulesets. Bug 664894 has an interim fix in the binary distribution by applying patches using the contrib/bundle_for_osx/gtk_diff_against_modulesets.patch file. -311211ajb bybell@nc.rr.com =============================================================================== gtkwave-3.3.86/config.h.in0000664000175000017500000002162313166335473014633 0ustar bybellbybell/* config.h.in. Generated from configure.ac by autoheader. */ /* 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 /* Define to 1 if using `alloca.c'. */ #undef C_ALLOCA /* Define to 1 if you have `alloca', as a function or macro. */ #undef HAVE_ALLOCA /* Define to 1 if you have and it should be used (not on Ultrix). */ #undef HAVE_ALLOCA_H /* Define to 1 if you have the `atexit' function. */ #undef HAVE_ATEXIT /* Define to 1 if you have the `btowc' function. */ #undef HAVE_BTOWC /* Define to 1 if you have the `bzero' function. */ #undef HAVE_BZERO /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ #undef HAVE_DOPRNT /* Define to 1 if you have the `dup2' function. */ #undef HAVE_DUP2 /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the `fork' function. */ #undef HAVE_FORK /* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ #undef HAVE_FSEEKO /* Define to 1 if you have the header file. */ #undef HAVE_GETOPT_H /* Define to 1 if you have the `getopt_long' function. */ #undef HAVE_GETOPT_LONG /* Define to 1 if you have the `getpagesize' function. */ #undef HAVE_GETPAGESIZE /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `dl' library (-ldl). */ #undef HAVE_LIBDL /* Define to 1 if you have the header file. */ #undef HAVE_LIBINTL_H /* Define to 1 if you have the `m' library (-lm). */ #undef HAVE_LIBM /* Define to 1 if you have the `nsl' library (-lnsl). */ #undef HAVE_LIBNSL /* Define to 1 if you have the `pthread' library (-lpthread). */ #undef HAVE_LIBPTHREAD /* Define to 1 if you have the `rpc' library (-lrpc). */ #undef HAVE_LIBRPC /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have a working `mmap' system call. */ #undef HAVE_MMAP /* Define to 1 if you have the `munmap' function. */ #undef HAVE_MUNMAP /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the `pow' function. */ #undef HAVE_POW /* Define to 1 if the system has the type `ptrdiff_t'. */ #undef HAVE_PTRDIFF_T /* Define to 1 if you have the `putenv' function. */ #undef HAVE_PUTENV /* Define to 1 if you have the `realpath' function. */ #undef HAVE_REALPATH /* Define to 1 if you have the `regcomp' function. */ #undef HAVE_REGCOMP /* Define to 1 if you have the `re_comp' function. */ #undef HAVE_RE_COMP /* Define to 1 if you have the header file. */ #undef HAVE_RPC_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_RPC_XDR_H /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Define to 1 if you have the `setenv' function. */ #undef HAVE_SETENV /* Define to 1 if `stat' has the bug that it succeeds when given the zero-length file name argument. */ #undef HAVE_STAT_EMPTY_STRING_BUG /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDDEF_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the `strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strncasecmp' function. */ #undef HAVE_STRNCASECMP /* Define to 1 if you have the `strrchr' function. */ #undef HAVE_STRRCHR /* Define to 1 if you have the `strstr' function. */ #undef HAVE_STRSTR /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have that is POSIX.1 compatible. */ #undef HAVE_SYS_WAIT_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `unsetenv' function. */ #undef HAVE_UNSETENV /* Define to 1 if you have the `vfork' function. */ #undef HAVE_VFORK /* Define to 1 if you have the header file. */ #undef HAVE_VFORK_H /* Define to 1 if you have the `vprintf' function. */ #undef HAVE_VPRINTF /* Define to 1 if you have the header file. */ #undef HAVE_WCHAR_H /* Define to 1 if you have the header file. */ #undef HAVE_WCTYPE_H /* Define to 1 if `fork' works. */ #undef HAVE_WORKING_FORK /* Define to 1 if `vfork' works. */ #undef HAVE_WORKING_VFORK /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Define to 1 if `lstat' dereferences a symlink specified with a trailing slash. */ #undef LSTAT_FOLLOWS_SLASHED_SYMLINK /* Define to 1 if your C compiler doesn't accept -c and -o together. */ #undef NO_MINUS_C_MINUS_O /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to the type of arg 1 for `select'. */ #undef SELECT_TYPE_ARG1 /* Define to the type of args 2, 3 and 4 for `select'. */ #undef SELECT_TYPE_ARG234 /* Define to the type of arg 5 for `select'. */ #undef SELECT_TYPE_ARG5 /* The size of `double', as computed by sizeof. */ #undef SIZEOF_DOUBLE /* The size of `int', as computed by sizeof. */ #undef SIZEOF_INT /* The size of `long', as computed by sizeof. */ #undef SIZEOF_LONG /* The size of `void *', as computed by sizeof. */ #undef SIZEOF_VOID_P /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at runtime. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #undef STACK_DIRECTION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Define to 1 if your declares `struct tm'. */ #undef TM_IN_SYS_TIME /* Version number of package */ #undef VERSION /* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a `char[]'. */ #undef YYTEXT_POINTER /* Enable large inode numbers on Mac OS X 10.5. */ #ifndef _DARWIN_USE_64_BIT_INODE # define _DARWIN_USE_64_BIT_INODE 1 #endif /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS /* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ #undef _LARGEFILE_SOURCE /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to `long int' if does not define. */ #undef off_t /* Define to `int' if does not define. */ #undef pid_t /* Define to `unsigned int' if does not define. */ #undef size_t /* Define as `fork' if `vfork' does not work. */ #undef vfork gtkwave-3.3.86/LICENSE.TXT0000664000175000017500000001267013166335473014275 0ustar bybellbybell########################################################################## GTKWave 3.3.86 Wave Viewer is Copyright (C) 1999-2017 Tony Bybell. Portions of GTKWave are Copyright (C) 1999-2017 Udi Finkelstein. Context support is Copyright (C) 2007-2017 Kermin Elliott Fleming. Trace group support is Copyright (C) 2009-2017 Donald Baltus. GHW and additional GUI support is Copyright (C) 2005-2017 Tristan Gingold. Analog support is Copyright (C) 2005-2017 Thomas Sailer. External DnD support is Copyright (C) 2008-2017 Concept Engineering GmbH. FastLZ is Copyright (C) 2005-2017 Ariya Hidayat. LZ4 is Copyright (C) 2011-2017 Yann Collet. 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., 51 Franklin Street - Suite 500, Boston, MA 02110-1335, USA. ########################################################################## PCCTS 1.33MR is Copyright (C) 1989-2017 Terence Parr, Russell Quong, Will Cohen, Hank Dietz, and Thomas Moog. It is in the public domain. Please read contrib/pccts/RIGHTS for more information. ########################################################################## Some public domain clip art by contributors at http://www.sxc.hu/ Hierarchy marker icons from the Silk icons set by Mark James found at http://www.famfamfam.com/lab/icons/silk/ ########################################################################## For tcl_np.c and tcl_np.h: This software is copyrighted by the Regents of the University of California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState Corporation, and other parties. The following terms apply to all files associated with the software unless explicitly disclaimed in individual files. The authors hereby grant permission to use, copy, modify, distribute, and license this software and its documentation for any purpose, provided that existing copyright notices are retained in all copies and that this notice is included verbatim in any distributions. No written agreement, license, or royalty fee is required for any of the authorized uses. Modifications to this software may be copyrighted by their authors and need not follow the licensing terms described here, provided that the new terms are clearly indicated on the first page of each file where they apply. IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. GOVERNMENT USE: If you are acquiring this software on behalf of the U.S. government, the Government shall have only "Restricted Rights" in the software and related documentation as defined in the Federal Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you are acquiring the software on behalf of the Department of Defense, the software shall be classified as "Commercial Computer Software" and the Government shall have only "Restricted Rights" as defined in Clause 252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the authors grant the U.S. Government and others acting in its behalf permission to use and distribute the software in accordance with the terms specified in this license. ########################################################################## The dumpfile processing source code in src/helpers is licensed under the MIT license in order to facilitate greater re-use: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ########################################################################## gtkwave-3.3.86/contrib/0000775000175000017500000000000013166335473014244 5ustar bybellbybellgtkwave-3.3.86/contrib/bundle_for_osx/0000775000175000017500000000000013166335473017254 5ustar bybellbybellgtkwave-3.3.86/contrib/bundle_for_osx/gtkwave_savefiles.icns0000664000175000017500000025237213166335473023656 0ustar bybellbybellicnsTúis32ÛZVWSROMKJFIXÿë÷ô€õó÷íüQTèÒÔÄÉÈÊÊÍÉíHUóàÜÇÌËÌËÉÐì|%RðÝØÃÈÆÉÊËÙÚç`QëÞâÑ××Ùòèçó_NòßäããÞêÒöæèHOíîz"5_:°ÔGóIMëïq= šØ$(óDLæðo;«½;7#.õFIìòr„— 4=%ðBGîõq4)8;ñHAëáí«¶¯°¸¶óEAþñÿ‚þ ÿùÿGLJH‚EFEMZVWSROMKJFHXÿë÷ô€õó÷íýPTèÒÔÄÉÉÊËÍÊíHUóàÜÆÌ€Ë)ÊÎíuRðÝÙÄÉÆÉÌÉÚÝØJQëÞàÏÕÖÚìîÙ´ZNòÞ€ëmåìâä¢ÖJOìð6J‡m¬ŽJÿENëñ…^Nš1A÷CLåòƒ#jŽ}`>>ÿCIêö€-¨†R^3ù?Hî÷‡e>& d]÷GAëáÑ¿¹Á½¾ÇÈ÷DAþðý‚þÿùÿGLJIFEFEEFFMZVWSQOMKJFHXÿë÷ô€õó÷íýPTèÒÔÄÉÈÊËÌËìHUóàÝÇÍÌÌËÌËîtRïÝØÂÇÆÇÍÄà×ÐBQëÞãÓÙ×àéý±8SNòßÞÚÛÝÚß²²PNîìg$+'A ùHMìî^ # äHKæí_ 3 ; ñGIíîef[åEGïó\ëIAëá¶›Ÿ£¢¤¨¥ðEAþñÿ‚þÿùÿGLJGDDEDDEDMs8mk'zptrsrsrtoz* vÿõÿýþþþýÿöÿƒsÿìøóôôôóøìÿ{ wÿõÿýþþþýÿúÿ¯ vÿóÿûüüüüûÿõÿ` vÿôÿüýýýüÿõÿ“ vÿôÿüýýýüÿôÿ€ vÿôÿüýýýüÿôÿ€ vÿôÿüýýýüÿôÿ~ vÿôÿüýýýüÿôÿ vÿóÿûüüüûÿóÿ~ wÿõÿýþþþýÿõÿsÿìøóôôôóøìÿ{ wÿõÿýþþþýÿõÿ/†„…„…„†2il32 ¯„ƒ‚…œ2<<=<;9764310.-+)(&%##€25àííïíììëêéèçæåäâáàÞßÚÞÃ"@êßÜáàÞßßàááââã€äååçåìà*=éàÝ€á€ä傿åæàæÚ)=éáÞáäÖÈËÊ€ËÌÌÍÍÌÍÌÏáëÜ)<çáÞáäÕÄÇÆÇÇÈÉ€ÈÊàëÜ+;çâßâåÖÆÉÈÉ‚ÊÉÉÊÉËàí×/E9æãßãæÖÆÉÈ€ÉÊÊ‚ÌÏßôÖ©ÿd8åãàäçØÈËÊËÌÈÇÈååËÇü[7äæàäèׯÉÈÉÉ€Ê9ÙÜÛÜÜÛèïËÈN4çÔÕèæÜÎÐÏÑÑÒÒÓíóïðïñ÷ñÖM 3ãâãçæåçèéMèéæâéêìóê×Ë#2áéáççêðîðñóöùù÷þîðóóÓêà&0áèâèã°Ÿ¨¥¢¡ž••¥Ð÷ö¬¼ùÖ$€/ßéåäí\&,U3HEiìñu£û×%€-ßéäåíh3# lS:*ªÿìƒ §ýÖ#€,Ýìçåìn=%5j! ™þÞU(6ªýÕ"€)Ýæàæï^/2F™ÿÉ{ ¦ÿÕ#€'ßÙÚëëp>'h6ºÿÒKGU&7 ªýÕ"€'Úíéæîd$>Aƒÿ­&%#X* ¬ÿ×"€%Ùìåæð\"CcáŠ/J9 ›óË!€$Ùíæèìt6n]T&(,8"F['¡ôÑ"€"×íææñ\iN!'kQ¥ÿÖ#€ Õíåçíi+`258%A$HV(¥ÿÔ"€ÖïäíçÖÒÐÚÛÛÞ€ß áâÞÖÝàûÛ!€Óíãéêìðòïðòóóô€öùûùóøØ €Öòçîîíîîñóóôö÷÷€øöøôýÝ €¾åÜàßàá„âãâäàçÅ‚#*))($ „ƒ‚…œ2<<=<;9764310.-+)(&%##€5àííï€ì&ëêéèçæåãâáàÞßÚÞÃ"@êßÜáàÞßßàááââã€äååçåìà*=éàÝ€áää‚傿åæàæÚ)=éáÞáäÖÈËÊ€ËÌÌÍÍÌÍÌÏáëÜ)<çáÞáäÕÄÇÆÇÇÈÉ€ÈÊàëÜ+;çâßâåÖÆÉÈÉ‚ÊÉÉÊÉËáíØ-89æãßãæÖÆÉÈ€ÉÊÊ€ÌÍÌÏßóÔŸÿJ8åãàäç×ÈËÊËÌÈ€ÇÈÈåçËËÉ97äæàäèׯÉÈÉÉÊÉÊÙÜÛÜÛÜäͽËD4çÔÕèæÜÎÐÐÑÒÒÓÓíóðïñéÔžR 3ãâãçæåçèééèèæçåâèìäʘ•Å#2áéáççêñîðòõùýþúþòæ'Ä–êâ&0áçãçêÑ»Êľ¼¸©«¾®ØÅŸ‚ÜøÕ$€/ßèçáùu?K[v„c±˜H¾ü×%€-ßèåâ÷…O8®†XPµÑ–u(ÅýÕ$€,Ýëèãö’)b>W®6Ž´‰?SP9ËüÖ"€)ÞåâãúwKQs'}Æq.$ÃÿÕ#€'ߨÛèõ”-bC¦W§ºŽT‚„DW7ËýÕ"€'Úìêãù€;bv…áe&G3“D3Ëÿ×"€%Úëçãüs3x|Û‡Ix^µóË!€$Ùíçæõ›/UµkpNAF_5r–,CÀôÒ!€"×íèâýs2«‚%4A±„'½ÿÕ#€ ÕíçãùˆC“L!LW#4b3"n‚<ÄÿÔ"€Öïåìëíäáðòñôööõ÷ùòåòòúÛ €Óíãéêèîñëëîïïð€òõúöðøØ €Öòçîî€ïòõõö÷øùúúùöúõüÝ € ¾åÜàßßàáààá âááââãßçÅ‚#€)($ „ƒ‚…œ2<<=<;9764310.,+)(&%#"€25àííïíììëêéèçåäãâáàÞßÚÞÃ"@êßÜààÞßßàááâãã€äååçåìà*=éàÝ€á€ä倿åæåæàæÚ)=éáÞáäÖÈËÊ€ËÌÌÍÍÌÍÌÏáëÜ)<çáÞáäÕÄÇÆÇÇ…ÈÊàêÜ,;çâßâåÖÆÉÈÉ‚ÊÉËáîÙ,49æãßãæÖÆÉÈ€ÉÊÊ€ÌÍËÐßñÑœöB8åãàäç×ÈËÊËÌÈ€Ç6ÉÇæìÏ̵,7äæàäèׯÉÈÉÉÊÊËÙÜÛÞÚßÝvÑ=3çÔÕèæÜÍÐÏ€ÑÒÓíòñíõÝpGX 3ãâãçæåèèéé€ê:ëæåçñÓY4¼$2áéâççëïîïðòóôõöùôÍK>éä&0àèáêÜ„ˆ€†…‚‚‰}‘?!ªùÓ%€/ßêãèâC **ûÙ$€-ÞéâèãK+"I5 ŒþÕ$€,ÝìåèãK & >" ŠýÕ"€)ÝçÞêãF =' ŠÿÖ"€&ßÙØíáM)C‹þÕ"€'ÚîèéäH {c #Žÿ×"€%ÙíäêåFHë_óË!€$ÙîåëãM'K3 ! ‚õÑ"€"×îåéæG) & ÿ×"€ ÕîäëáK.!"+‡ÿÕ"€ Öðäîã¿ÂÀ€ÅÈÈÉÊËÌÊÈÈÎüÚ!€Óíãéëðòôóôöö÷øúúû€üöøØ €Öòçîíëíîïñòóôõöö÷öõ÷óýÝ €¾åÜàßáâƒãäàçÅ‚#)()(# l8mkZgdeeeeeeeeeeeeeeeeedf] aÿ÷ÿþþþþþþþþþþþþþþþþýÿöÿk pÿìúôõõõõõõõõõõõõõõöôúìÿ}  oÿöÿýþþþþþþþþþþþþþþþýÿöÿ|  qÿôÿûüüüüüüüüüüüüüüüûÿôÿ~  pÿõÿüýýýýýýýýýýýýýýýüÿõÿ}  qÿõÿüýýýýýýýýýýýýýýýüÿöÿ‡8  qÿõÿüýýýýýýýýýýýýýýýýþüÿæÿi qÿõÿüýýýýýýýýýýýýýýýýýýÿùÿ_ qÿõÿüýýýýýýýýýýýýýýýýýÿûÿh qÿõÿüýýýýýýýýýýýýýýýüÿõÿ  qÿõÿüýýýýýýýýýýýýýýýüÿõÿ}  qÿõÿüýýýýýýýýýýýýýýýüÿõÿ~  qÿõÿüýýýýýýýýýýýýýýýüÿõÿ}  qÿõÿüýýýýýýýýýýýýýýýüÿõÿ}  qÿõÿüýýýýýýýýýýýýýýýüÿõÿ}  qÿõÿüýýýýýýýýýýýýýýýüÿõÿ}  qÿõÿüýýýýýýýýýýýýýýýüÿõÿ}  qÿõÿüýýýýýýýýýýýýýýýüÿõÿ}  qÿõÿüýýýýýýýýýýýýýýýüÿõÿ}  qÿõÿüýýýýýýýýýýýýýýýüÿõÿ}  qÿõÿüýýýýýýýýýýýýýýýüÿõÿ}  qÿõÿüýýýýýýýýýýýýýýýüÿõÿ}  pÿõÿüýýýýýýýýýýýýýýýüÿõÿ}  qÿôÿûüüüüüüüüüüüüüüüûÿôÿ}  pÿöÿýþþþþþþþþþþþþþþþýÿöÿ|  pÿíúôõõõõõõõõõõõõõõõôùíÿ| hÿöÿýþþþþþþþþþþþþþþþýÿöÿs }‹ˆ‰ˆ‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰ˆŠ€it32m§ÿÿÿÿÿ…þÎ…¢ÖŸ‚‰……†‚‡‚…„ „  `+}™›œžŸ  ¡¡¢¢¡¡  ŸŸžœ›šš˜˜—–••”“’‘Ž‹‹Š‰ˆ‡†…„„ƒ‚€~}|{zzyxwvutsrqponmmlkjjihggfedcR ›b/¡‘‘“”•–——˜™™šš™™˜——–•”“’‘ŽŒŒ‹Š‰ˆ‡†…„ƒƒ€~~||{zyxwvutssqpoommlkiihgfecba`_^^]\[[ZYXWVUS`f$›†šÅÜÚÛۀ܄ÝÜ€Û€Úـ؀×Ö€ÕÔ€ÓÒÒ€ÑÐÏÎ̀̀ˀÊÉÈÈÇÇÆÇÅȯ_\Y˜!ÁÿüÐÿ þÿúÿ²Of– ,£ŠÒÿó÷ô…õ€öõõö¢õôôõôôõô‚ó òõïþÍQh%–,¢ŠÑÿùéßáàáá€âáåéè€ãâ€ãä€ãääå‚äˆå¥æ åêöÿÊPh'– ,¢ŠÒÿ÷åÚÝÜ€ÝÜÛÚáæäßÞÞ„ß…à‡áâáŽâããâãŠâ ááâáæóÿÌQh'– ,¢ŠÑÿøæÛ€Þ ßÞÝÜÛâæåàß„à„á†âŒã–ä‚ã âçôÿËQh'– ,¡ŠÑÿøæÛ‚Þ ÝÜÛáæåàßààßßà…áâáâ€áââã‚âã€â„ãäãäãä…ãäããä€ãääãä€ã âçóÿËPh'–+¡ŠÑÿøæÜßÝÞÞßÞÜÛáæåáßà„á…â‰ã ääãääãääããƒäã…äã€äããä ãäãèôÿËPh'–+¡‰ÑÿøæÜßÞÞßßÞÝÜáæåáßàà„á…â€ãâ…ãäããäã…äåäååäå€äåå…ä€ã äâèôÿËPg'– +¡ˆÑÿøçÜßÞ€ßÞÝÛâæåáßà„áâáâáá†â€ãä„ãäã—äåå‚ä âèôÿÌPh'– + ˆÑÿøçÜ‚ßÞÜÜáæåàà‚áâãââƒãäãäãƒäååääƒåæåæååæ…åæåææ„å äåãèôÿËPg'– + ˆÑÿøæÜà‚ßÝÛáæåâ‚á„à…á‡âžãå äåäéôÿËPg'– +Ÿ‡ÐÿøçÝà€ßàßÜÜáçæâáâ傿„ç†èŠé“êèäåäåäåãéôÿËPg'–+Ÿ‡ÐÿøçÝàßßààßÝÜâèæâàááâßÈÄÅ€ÆÅÆÆÅ‚Æ•ÇÅÖè忀å ãéôÿËPg'– +ž†ÐÿøçÝàÞ€àßÝÜâççâàâßæÆ¤«¨©©¨ƒ©¨©¨¨©¨¨©‚¨‚©ª•©ª¨¬àçåæåæäéóÿËPg&– *ž†ÐÿøçÝà߀à ßÝÝâçæâáâàäÒ¯‚°¯°›±²¯¼ä€æ åæåêôÿËPg&– *…ÐÿøçÝáßàÞÝãççãáââáäÜØÙÙØ€ÙÚ€Ù†ÚˆÛ•ÜÛåèåææåæåéóÿÌOg&– *œ„ÏÿøçÞá€àáàÞÝãèçã€âãáæ€è„é…ê‡ëƒìí‹ìí€ìíìíçåçç€æ åêôÿËOf&”*œƒÏÿ÷èÞàßàááßÝÝãèçâáâãâäØÓÔ†ÕÖ€ÕÖÖ×ÖÖ×Ö×Öרˆ×Ø„×Ø€×Ø×ØÖãéæç åêôÿËOf&“ *›ƒÏÿ÷èÞàà€áàÞÝãèçãâãáæÏ«®¬‰­¥®¯­·äçæçæçæëôÿËOf&’ )›‚Ïÿ÷èÞàáàÞÝãéçãâãáçÉ¥«©ª†©¨ª©¯ãèççæçåëôÿËOf'’ )š‚Îÿ÷èÞáà€á àßÞäèèäâãâãäÏÊ‚ËÌË˂̌ÍÎ͆ÎÍ€ÎÍ‚ÎÍÎÌÝêçèèççæêôÿËOf$,‘)™Îÿ÷èÞáàááâáÞÝãéèãâããäãç€èƒé„ê€ëììëìíììíììííìŠíììíìíéçèç€èçëôÿËOb.1Øÿ¤‘!)™€Îÿ÷èßáàááâáÞÝäêèäâãäãåâàáâáâ„ã‡äåäåäåäƒåæå…æƒåéèçèçèèçìôÿËLj6ñÿòÿ©Ž)˜Îÿ÷éßáàáââáÞÞäéèãâäãåÚ¹ƒ·›¸¹¸¹¸¹¹ƒ¸¹¶Èé€èçèçëôÿËQ]wñûóÿîÿq!)˜Íÿ÷éßááâáâáßÞäêèäãåáéÅ¡ª¦¨§°¨§©âêèéèèçìôÿÉN¡ùöøýýÿûíŽ )–~Íÿ÷éß‚âáßÞåêéåãäãåÞ¿»¼»¼’½¾½‚¾½½¾€½Œ¾½¾¼ÎêèééèéèìôÿÐqÅðüýýþÿ÷ÿ—Œ (–}Íÿ÷éßâáâßÞåêêäããääææääåæåæçç€æçç€èçè‰éêé‹êéëéè‚éëôû»¤ÏÙéûþþÿøÿ¼Œ(•}Íÿ÷éßâáââãâßÞåëêåãääåäçè‚é„ê„ëììíììíìƒí€î€íîííîíîíîëéêéèéýÉ ÏäɬÞÿûÿõÿŽŒ(•|Ìÿ÷éàâáââãâßßåëêäãåäåãËÆ‚NJȈɄÊÉ€ÊÉÊÊÉÊÊÉ‚ÊÉÊÈÚìéƒê É·ØÖÁÀ»¹ðÿøÿÍ '”{Ìÿ÷êàâáâããáßßåëéåäæãéȤ«¨•©…ª«ª«ª­äëéêêé㸬×ܾ«¿ÑÃÒüÿÍ%'“zÌÿ÷éàââãâãâàßåëêåäåãèÔ°²“±‡²’±²¯½é€êè뻹ÞÌ»¿ººÑÜÄñ½Ž '’yÌÿ÷éàã€âããàßæêéåääååèßۃ܄݄ވ߂áâáâàéìéêêéðåØÕµ©ÂÎÆÌØÝ˜ '’yËÿ÷êàããäãäâàßåëéæäåææäéììí€ìíîíîííî„ïˆðñîì“íëêëêêïüþáÀ½¹¼ÔÙÁÊ› !&‘xËÿ÷êàäáàáäâàßæêêååææåèÛר×ׄ؄ىÚÛÚæìé’êëñýþìðãÆÎÅËÜÓ} ‘&wËÿ÷êáâæéèäãààæëéæåæäéѬ¯­‹®Œ¯®¹éìëìëŒìëìëòþüîñóø×ÐÚÂÅw’&vÊÿ÷êàæÐ»Ìãâáàæëêæåçäê̦¬©‰ªŽ«ª°æìë‘ìëëôÿùîòôôíÐÅßÁZ“&ŽvÊÿøéäÒ¢²¯ÒéßáæëêçåæåçæÑÌ€ÍÎÎ̓΅υÐÏÑÏàïë‘ìëìõÿöíóôôêÖÚı€%”&ŽuÊÿøèæÀ´×ÓÔòßáæëëæåæççæëììíƒî…ï…ðñîëìëìëíöÿôë€ô æÖÜÌ›gZ(–%tÉÿ÷éäÓ¸ÛÝå÷ßáæìëçåæçæçåƒæ‚çèèçè…é‚êéëƒìŠíìíîøÿôëôóôâÔÞÄdzLa$–%ŒsÉÿ÷êáåÔÛêûìßáçìëææççæçèè€é€êéêê„ë„ì†íìíïúÿôí€ô ßÔÜÆÀÿÏI`$–%‹rÉÿ÷ëâäæêòëãááçìêƒçèç€è‚éêééêëêëìëëììëë€ìíìðüþòïôôóÝÕÜ¿ÇòÿÇJ`#–$ŠqÈÿ÷ëâäâãâääááçìëèæçæçèééè€éƒê„ë„ì”íñýýïñôôñÜÖÛ¼ÈðóÿËH`#–$ŠpÈÿ÷ëâääææåäâáçììçæççè‚é„êƒë„ì‰íˆîíòþûìòôôîÙØÙ¹ÏïïôÿÉI_#– $‰pÈÿ÷ëâä åäâáçìëçæç‚è‚éƒê‚ë…ì†í‹îíóÿûëòôõëÖÚÖ¸ÓñêñôÿÉH_#˜$ˆoÇÿ÷ëâåäååæåâáçíëèç‚èé„ê‚ë„ì…íŠîí€îõÿúìòôõèÕÛÒ¹ÙñëíðôÿÉH^#˜#‡nÇÿ÷ëâåäååæåâáèììççèççƒèƒé‚ê‚ë…ìŠí€îïîîöÿøîóôôæÓÛͺÞòëïìðôÿÉG^"˜#†mÇÿ÷ëãåäååæåââèíì€èççéëêëë€ì€ë‚í†îïððïððï$ððñðñðïïìîøÿõðóôôäÕßͽäðìïîíñôÿÉG]"˜#…lÇÿöëãåäåææåââèììèêÞ¾Á½€¼½€¾½„¾¿¿¾½¾…¿€À€¿!À¾¿ÃÃÝùÿòïôôòâÔÚ¤¿ÃËñìîíñóÿÈF]"˜ #…kÇÿöìãå䀿 åââèìíèêܵ¸¼ÂÁ‚ÂÀ¿¿ÁÂÂ…Ã4ÀÀÂÄÄÅÄÄÅÄÅÄÄÂÁÂÄÄÅÂÅļÛûÿñïôôñßÕÜ˲ý¶ÇðíîíñóÿÈF]"˜ #„kÆÿöìãå䀿åãâèìíçêÝ·¾¤“‘€’‘™¡Ÿ”‘ƒ’“‘”Ÿ ˜†‘'¡œ‘•‘–œßþþñïôôïÜÔܹ„’“¸¼ÇñíïíñóÿÈF\"˜ "ƒjÆÿöìãå倿åãâèîíèéà±ÈV$E= ‚BF„(7H1§ÿûòðôôïÙÕÝ©.¤¾ÅòíïîñóÿÈE[!˜("‚iÅÿöìãæåæåææãâèîíèêà±ÉY )LD€BF„(6H1 (ÃÿùóñóõëÙÕÚ›"¥¿ÅòíïîòóÿÈE[!˜'"‚hÅÿöìãæåææçæãâéííèêà±ÉW&IA  WimYIMK„L'fmd?2Ìÿôñóôôè×ÕÜ¥ÀÆóíïîòóÿÈD[!˜2"gÅÿöìãæåææçåãâéííèëá±ÊX'JB N ‹‘’‡•'‘Œ•‰RÚÿôñóôôæÖØ×¥ÀÆóîðîòóÿÈDZ!˜'!€gÄÿöìäæåææçæããéííéêà±ÊW'JB t‹†‰…‡„…‹ƒ¨òÿöïóôôäÔÙц€¥ÀÆóîñîòóÿÈCZ!˜5!fÄÿöìäæåæççæããéííéêà±ÊX'JB !ŒrP3„IT°øþöðóôóàÓÜÌ{C ¥ÀÆóîðïóóÿÈCY ˜4!~eÄÿöíäæåæççåäãéííèêá±ÊW'JB L“ŠWB„6“÷þöñóôñÞÓܼfDE €¥ÀÇóîðïóóÿÈBX ˜  }dÄÿöíäææ€ç@æäãéííèêá²È` .ICu‘‚GJ*›ýüôòóõðÜÕݾK,KB€§¿ÇôïðïóóÿÇBX ˜  |cÃÿöíäææçäãéîíéëà´ÄyÜÿòôóôòáÔÚÓ”=&JB €¦ÁÇõñòðôóÿÇ?W ˜ v]Áÿöíåçåè€ç'ääéíîêëâ±ÊX'JB "‹’YDJQèÿ€óôñÞÔÜÈb|–f'JB €¦ÁÇõðòñôóÿÇ?W ˜Ov\Áÿöíäèêãéêæåäéíîéëâ±ÊW'JB M’‹,CH#iñþóòòõðÚÕÜ¿Je…&JB €¦ÁÇöðòñõóÿÇ?W ˜Ou\Áÿöîåæº«ºáèääéîîéìâ²ÊX'JB s“{ DLsýúôòóõîØÖÛ»T;‘?'JB ¦ÁÈöñòñõóÿÇ?W ˜Ot[Àÿ÷ëêʤ¹Ððâåéîîéìâ±ÊW'JB "Š’RHD£þúõóóõë×Õݬ_1€“g&JB €¥ÁÈöñóñõóÿÇ?W ˜NsZÀÿ÷ìêŸÜÜØöãäéîîêëá³Çj,%(&(%8GD,$+[F ',N´ÿùõôóõè××Û¤SE?#*!p…3#)$8GD,&'((«ÀÈöñóñôóÿÇ?W ˜sY¿ÿöíçÞ¾×Þïöãåéîîéìá´Ä|ANHJ+GEEIJJKŽKILL´ÿù÷óóôäÖרšNDEEJLEbŒiELIHEEI‚JKJ¯ÀÉöòóòõóÿÇ?W ˜rY¿ÿöîäéãäóùêääêîîéìá´Äx8F@C€B*DEEBC>Q‰ŽpDADEEƒBCB®ÀÊöñóòöóÿÇ@W ˜OqX¿ÿöíåçèìíéçåäêïîéìâ²É] +IC Q’. 1ÞúñôóóêÖØÒo :K7 e’†*JC €  ¨ÁÉ÷òóòõóÿÇ?W ˜OqW¾ÿöíåèçææéèåäêîîéìâ±ÊW'JB q“z–óéôóóîØØË^9K49;$KB €§ÂÉ÷òóòõóÿÇ@W ˜ pV¾ÿöîåç€èAéèåäêîîéíã±ÊX'KA$Š“UYèéòóôð×ÚÈP9K4‚“h&JB €¦ÁÉ÷òôòöóÿÇ@W ˜8oV¾ÿõíåèçèçéèååêîîêíâ±ËW'K@N‘Œ-'ÄîðõôôßܼC€9K4d“‚(IC €§ÂÉøóõóöóÿÇ@W ˜ nU¾ÿöíåè)éèååêîîêíâ±ËW'JB u’y “òïõõÿñÉŠ)9K4:A+HC €¦ÁÈöñóñõòÿÇ@W ˜6mT½ÿöíåèèçèéèååêîîêíâ±ËW'IEŒZVäïòúù؉7‚9K4‚‘j)IC €¨ÃËúõ÷ö÷óÿÅ>U˜5mS½ÿõíåèçèèéèååêîîêíâ²ËW'HGK‘Ž(Éóôýâžg ƒ9K4e’ˆ"MA ™®³ÜÖ×ÕÖÒß­8M˜ lR¼ÿöíåè'éèååêîîêíâ²ËX'JC p”xg¼óê¥TEH!ƒ:K48‡‰5F6 ~“›ÁÀÅÈÑÔê¸7:9:8?H@O‰‘fXmRªxA8FF>7;;€:€9(8@B<211//,3fmX-52,+,-..01˜¬¹çéíîôóÿÈ@W ˜@jP¼ÿõíæèçèééèååêîîêíá´Å}BOJMLLMGG?l‰dgKUVDLKEDHIHGFECB@?>978<;=9aspC9=BEEGHHJJ°ÀÊøôõóöòÿÆ@V ˜6iO¼ÿõíåèçèééèååêîîêíá´Çq)91323184614??5,-++‚*(+7;7+--..2*Q‰‰a>E42322455­ÁÉøóõó÷óÿÇ@W ˜4hO»ÿõíåèçèééèååêîîëíâ²ËW*HTˆ‘S =@„7I3€…xCH §ÃÊùôõó÷óÿÇ@W ˜5gM»ÿõîåèçèééèååêîïêíâ²ËX%>h‹‹)DI ƒ(9K4d’†L; §ÃÊøóõó÷óÿÇ?W ˜'gMºÿõíæèçèééèååêîîêíã²ËVNKNJ^n{‚EI„(9K48“ˆxiQKLN<§ÃÊøóõó÷óÿÇ?W ˜5fLºÿôíåèçèééèæåêîîëíâ²ËVtž’–•‘’‡”VEI ƒ(:K4‡Š‘”•—¡8¥ÃÊøóõô÷óÿÇ@W ˜(eK¹ÿôíæèçèééèæåêîïëíâ²ËVK‰€„‚„‡…Ž&DH„8J3‚`ƒ‡€ƒ‚~¦ÃÊùóõó÷óÿÇ@W ˜%dJ¹ÿôíæèçèééèæåêîîëíâ³ËZ :WP!ƒ HL#ƒ=N7ƒ :VQ$¨ÃÊøóõô÷óÿÇ@W ˜'cI¸ÿôíæèçèééèæåêîïëíâ³ËW!A9 ‚?C„3D.ƒ A8 €§ÃÊùóõó÷óÿÇ@W ˜(bH¸ÿôíæèçèééèæåêîïëíâ³Æo#3+102-Le`8-0.€/ .0,;adE+1.ƒ/0YfU.0/0/1,Mfa90220.00­ÀÊøóõó÷óÿÇ@W ˜aG¸ÿôíæèçèééèæåêîîëí໽ÁÆÅÅÄ€ÅÃÂÂÄ„ÇÈÈÇÄÄÆÈ„ÉÊÊÇÆÇ€ÊËÊËËÈÆÇÉÊÊÉÉÊÊÉľÎ÷ôõó÷óÿÇ@W ˜aG¸ÿôíåèçèééèååêîïëîßµ¸´³€´€µ´´µ´µ´µ´µµ¶··¶µ„¶··¸¹¸€·¸·€¸·¸¸¹¹¸€·¶¼¸É÷ôõó÷óÿÇ@W ˜`F¸ÿôíæèçèééèæåêîîëìæÕÖÖØƒÙÚ„ÛÜÝ€ÜÝ݃ÞßßàßÞ߀à€áâáààáâ‚àßÞÜâöôõó÷óÿÇ@W ˜_E·ÿôíåèçèééçååêïíìëì€ðï€ðñòñòóƒôõöõö÷€øùúûˆüûú øôõõó÷óÿÇ@W ˜^D·ÿôíåèçèééèååêïîìëëê€ëì€íî€ïðññðñò€óô‚õ†ö‚õ€ôóóõõôó÷óÿÇ?W˜]C¶ÿôíåèçèééèååêïî€ëìíìíî€ïðññðòó€ô‚õöõö÷ƒøù„ø÷ö÷öö€õ ôó÷óÿÇ@W˜ \B¶ÿôíåèéèååêîî‚ë€ìíìíîïîïðï€ð ññòññòóóòóô õôôõõöõö÷öö„÷ö÷öõöö‚õ ôó÷óÿÇ@W˜[B¶ÿôíåèçèèéçååêîíëì€íîïîïðñ€òóôõ‚ö‰÷öõöõ ôôó÷óÿÇ@W˜ [Aµÿôîåèéèååêîîëì€íîîíî€ïðñ€òó‚ôõƒö†÷ƒöõ€ô óöóÿÇ@V˜ Z@µÿôíåèéèååêîîëì€íîïð€ñòóô‚õ†ö€÷„ö‚õ€ô óöóÿÇ@V˜Y?´ÿóíåèçèèéèååêïî‚ë€ìíîíîî€ïðñò€ó‚ô‚õŽö‚õô óöóÿÇ?W˜X>´ÿòíåççèèéèääêîíêëì€íîííî‚ïðïð€ñòóóòó€ô óôôõôôõõööõõö‚õöö€õôôõôôó€ô òõóÿÇ@V˜ W=´ÿóîåèéèååëïîëëìëëìíìíîííîïî€ï€ðñðñòòñòò€óô‚õööõõö€÷ö÷ö÷÷€öõö€õôõõôôòöóÿÇ?W˜ V=³ÿñöñóò€óòïîòôô†óŒôõõôôŠõ€öõööõƒöõõöö†õ ô÷òÿÆ@W˜ V<¬ÿõÿûƒüûûüûƒüûüûüûüƒûüû€ü€ûüüûü€û üûþöÿÂ>W˜ MFaÔéçèçèçŸèéèéèéè„é èéèéèéèèééèƒéèéèéèééèÞoCQ™ /VCEPOPOO‚POPPOÄPOQHAU8œ5TTÔQTU;ž+1‹0100110€1€0€1010³1-žØ Öÿÿÿÿÿ…ÿÿÿÿÿ…þÎ…¢ÖŸ‚‰………ƒ‡‚…„ „  `+}™›œžŸ  ¡¡¢¢¡¡  ŸŸžœ›šš˜˜—–••”“’‘Ž‹‹Š‰ˆ‡†…„„ƒ‚€~~}|{zzyxwvutsrqponmmlkjjihggfedcR ›b/¡‘‘“”•–——˜™™šš™™˜——–•”“’‘ŽŒŒ‹Š‰ˆ‡†…„ƒƒ€€~~||{zyxwvutsrqpoommlkiihgfecba`_^^]\[[ZYXWVUS`f$›†šÅÜÚÛۀ܄ÝÜ€Û€Úـ؀×Ö€ÕÔÔ‚ÓÒÒ€ÑЀςÎ̀̀ˀÊÉÈ€Ç ÆÇÅȯ_\Y˜!ÁÿüÐÿ þÿúÿ²Of– ,£ŠÒÿó÷ô…õ€öõõöõõöŸõôôõôôõô‚ó òõïþÍQh%–,¢ŠÑÿùèßáàáá€âáåéèã€â„ã…ä„忀奿 åêöÿÊPh'– ,¢ŠÒÿ÷åÚÝÜ€ÝÜÛÚáæäßÞÞ„ß…à‡áâáŽâãââã‡âáââááâáæóÿÌQh'– ,¢ŠÑÿøæÛ€Þ ßßÝÜÛâæåà߃à„á‡â‹ã˜äã âçôÿËQh'– ,¡ŠÑÿøæÛ‚ÞÝÝÛáæåà߀àßà…áâááââááâãâãââããâ‚ã ääããäããäãäãä…ãäããä€ãääããäããâçóÿËPh'– +¡ŠÑÿøæÜ߀ÞßÞÝÛáæåáßà„á…â‚ãâƒã ääãääãääããƒäã…äã€äãã€ä ããäâèôÿËPh'–+¡‰ÑÿøæÜßÞÞßßÞÝÜáæåá€à„áââá‚â€ãâ€ãâ€ã‚äããäã…äåäååäå€äååƒäãä€ã äâèôÿËPg'– +¡ˆÑÿøçÜßÞ€ßÞÝÛâæåáßàáàáâáá‡âããä„ãäã˜äå‚ä âèôÿÌPh'– + ˆÑÿøçÜ‚ßÞÝÜáæåáà‚áââããââãäãäãƒäå€äƒåæåæååæ…åæåææ„å äåãèôÿËPg'– + ˆÑÿøæÜßÞßÝÛáæåâ‚áàßàà…á‡âžãå äåäéôÿËPg'– +Ÿ‡ÐÿøçÝà€ßàßÜÜáçæâáâåæ…ç†èŠé“êèäåäåäåãéôÿËPg'–+Ÿ‡ÐÿøçÝàßßààßÝÜâèæâ€áâßÈÄÅăÅĆŀÆÅÆÆÅ‚Æ•ÇÅÖè忀å ãéôÿËPg'–"+ž†ÐÿøçÝàßàßàßÜÜâçæâàâàæÇ¤«¨©¨¨©€¨©¨¨©…¨‚©ª•©ª¨¬àçåæåæäéóÿËPg&–*ž†ÐÿøçÝàßàßàßÝÝâçæ€âáåѯ•°›±²¯¼ä€æ åæåêôÿËPg&– *…ÐÿøçÝàßàÞÝãççãááâáäÜØÙÙØ€ÙÚ€Ù†ÚˆÛ•ÜÛåèåææåæåéóÿÌOg&– *œ„Ïÿ÷çÞá€à áàÞÝãèçãââáâáæ€è„é…ê‡ëƒìí‹ìí€ìíìíçåçç€æ åêôÿËOf&–*œƒÏÿ÷èÞáßàááßÞÜãèçãââãâäØÓ‡ÕÖ€ÕÖÖ×ÖÖ×Ö×Öרˆ×Ø„×Ø€×Ø×ØÖãéæç åêôÿËOf&“ *›ƒÏÿ÷èÞàà€áàÞÝäèçâáãáæÏ«®¬‰­¥®¯­·äçæçæçæëôÿËOf&’ )›‚Ïÿ÷èÞàà€áàÞÝãéçãâãáçÉ¥«©ª†©¨ª©¯ãèççæçåëôÿËOf'’ )š‚Îÿ÷èÞ‚á àßÞãèèäâãâãäÏÊ‚ËÌË˂̌ÍÎ͆ÎÍ€ÎÍ‚ÎÍÎÌÝêçèèççæêôÿËOf%‘)™Îÿ÷èÞáàááâáÞÞãéèãâããäãç€èƒé„ê€ëììëìíììíììííìŠíììíìíéçèç€èçëôÿËOc*šÅj‘)™€Îÿ÷èßáàááâáÞÝäêèãâãäãåâà€áâ„ã‡äåäåäåäƒåæå…æƒåééçèçèèçìôÿËMh#ÅÿùúwŽ)˜Îÿ÷éßáàáââáÞÞäéèäâäãåÚ¹ƒ·›¸¹¸¹¸¹¹ƒ¸¹¶Èé€èçèçëôÿËP^NÇÿôüêêM!)˜Íÿ÷éßááâáâáßÞäêèäãåáéÅ¡ª¦¨§°¨§©âêèéèèçëôÿÇPvÑýøûæ×Ý¿Ž (–~Íÿ÷èß‚âáßÞäêéåãäãåÞ¿¼¼»¼’½¾½¾¾½€¾½¾¾½½Œ¾½¾¼ÎêèééèéèìõÿÏp³ñü÷ßÔÙÑÖbŒ&(–}Íÿ÷éßâáââãâßßäêêäããääæåäååæåæå忀çææçç€èçè‰éêé‹êéëéè‚éëôû»¤ÒØäÛÕ×ÖÉÃ}Ž(•}Íÿ÷éßâáââãáßÞåëêåãääåäçè‚é„ê„ëììíììíìƒí€î€íîííîíîíîëéêééèéèéýÉ ÏâÊ«ÆÙÓ̵´UŒ(•|Ìÿ÷éàâáâããâßßåëêäãåäåã˃NjȇɄÊÉ€ÊÉÊÊÉÊÊÉ‚ÊÉÊÈÚìéêéêééêÈ·ØÕ¿¼·Íʶ©x '”{Ìÿ÷éàâá€ãáßßåëéåäæãéȤ«¨•©…ª«ª«ª­äëéëéë丬×ܾªÀÐÆ¼³¢€'“zÌÿ÷éßââãâãâàßæëêåäåãèÔ°²“±‡²’±²¯½éêëéìݬ»ÜÍ»ÀººÒÛ£v '’yÌÿ÷éàã€âãâàßæëéåääååèßۃ܄݄ވ߂áâááâŠáâàéëêèíÚ¼ÆÙÖ´ªÂÎÆÌØÝ| ‘ '‘yËÿ÷éàããäãäãàßåëéæäåææäéììí€ìíîíîííî„ïˆðñîì“íëëéî×»Øä¾µ¿¹¼ÔÙÂÉ— !&‘xËÿ÷éàäààáäâàßæêêååææåèÛר×ׄ؄ىÚÛÚæìé’êëéîÓ½Ü㺣¦¿ÎÅËÜÑx ‘&wËÿ÷êáâæéèäãààæëéæåæäéѬ¯­‹®Œ¯®¹éìëìëŒìëìëêíÏ¿ß߸£§¦«ÒØÃÃt’&vÊÿ÷êàæÐºÌãâáàæëêæåçäê̦¬©‰ªŽ«ª°æìëìëíÌÁâÚ´¤¦¦¡ˆ¸â¾V–&ŽvÊÿøéäÒ¢²¯ÒéßáæëêçåææççÒÌ€ÍÎÎ̓΅υÐÏÑÏàïëìëíëìëÉÄåÕ°¥¦¦ž‡™²|%”&ŽuÊÿøèæÀ´×ÓÔòßáåëëæåæççæëììíƒî…ï…ðñîëìëìêÇÇæÑ«¥¦¦›ƒ‚|{cY(–%tÉÿ÷éäÓ¸ÛÝä÷ßáæìëçåæçæçåƒæ‚çèèçè…é‚êéëƒìˆíîëîçÅÌçͧ¥¦§—„y°³La$–%ŒsÉÿ÷êáåÔÛêûìàáæìëææççæçèè€é€êéêê„ë„ì†íìŒí îëïåÄÑæÈ¦¥¦§”€¯ÿÎI`$–%‹rÉÿ÷ëâäæêòëãááçìêƒçèç€è‚éêééêëêëìëëììëë€ìíîëðáÂÖ俥¦¦‘~»ôÿÈJ`#–$ŠqÈÿ÷ëâäâãâääááçìëèæçæçèééè€éƒê„ë„ìíîëðÞÂÚâ½€¦¤Ž€ÀòòÿËH`#–$ŠpÈÿ÷ëâääææåäâáçììçæççè‚é„êƒë„ì‰í†îìñÛÂÝà·¥¦¦£‹„ÊðîõÿÉI_#– $‰pÈÿ÷ëâä åäâáçìëçæç‚è‚éƒê‚ë…ì†í‰îíïÙÄßݲ¤¦¦¡‡~ŠÑñêñôÿÉH_#˜$ˆoÇÿ÷ëâääååæåâáçíëèæ€èçèé„ê‚ë„ì…í‹îíïÕÇâÚ¯£¦§ž…‚~’ÙñëíðôÿÉH^#˜#‡nÇÿ÷ëâåäååæäâáèíëçç†èƒé‚ê‚ë…ì‰í îíïîîïÒÊãÕ­¤¦¦›‚|›àñìïëðôÿÉG^"˜#†mÇÿ÷ëãåäååæåâáèíë‚èê€ëìí€ìëì‚í…î€ï†ðïðñ òòîïîÏÍäÏ«¤¦¦™„…~£æðíïîíñôÿÉG]"˜#…lÇÿöëãåäåææåââèíë€èåæãàà€áâáãää‡âãååãâ†ãåæå€ã!äããéæÊÐæÈ¨¦¦¥–~v¢åééïíîíñóÿÉF]"˜ #…kÇÿöìãå䀿 åââèììéèçåäêñð‚òïììñòòƒóôòîíñ‡õðîðõôôóôôäÇÓæÃ¥¦¦¥’ˆ»õéæê€î íñóÿÈF]"˜ #„kÆÿöìãå䀿åãâèííèçèãéÊ­´²³³´±ÀÍÊ·²ƒ´µ±¶Ê̼¯²°„±'ÆÍı¶³¶³¶ÄÖå¾£¦¦£~ƒ}‹·³áêèðîîíñóÿÈF\"˜ "ƒjÆÿöìãå倿åãâèîìéçëÝ÷i14€345ÑïèòðñðôóÿÇ@W ˜ y`ÂÿöíäçAèçäãéííêéíÞùj?zl3Þò† xu4—åÔ°£¦¦›†~_>zl€ÉñèóðñðóóÿÇ@W ˜dx_ÂÿöíäçæççèçääéííêéíÞøm Aym ‚îéAxu6&±íЮ¤¦¦™‚€yš(@ymËñèôññðôóÿÇ?W ˜Ow^ÁÿöíäççæèéçääéííêéíÞùj?zl»îÊrx4/·çÈ«¥¦¦–€€†˜ìb?zl€ÊñèôñòðôóÿÇ?W ˜ v]Áÿöíåçåè€çTääéííëéíÞùl @zl8ãî‘$ny2=ÅèÆ©¥¦¥“‚VÌô¨?ymÊñèôñòñôóÿÇ?W ˜Ov\ÁÿöíäèêãéêæåäéííêéíÞùj?zl~ïãH"ow6RÍæÂ¦¥§¤€‚z@¢îÙ$?zl€ÊñèôñòñõóÿÇ?W ˜du\Áÿöîåæº«ºáèääéîîêéíÞøm Aym½ðÉ pz1UÝß¾¥¥§¢‹€€‚[aíìg @ymËðèõòòñõóÿÇ?W ˜Ot[Àÿ÷ëêʤ¹ÐðâåéîîëéíÞùj?zl7âï‡vo–ÜÞ¹¥¥¦ ‰ƒxyTÑñ©>zl€ÊñèõòòñõóÿÇ?W ˜OsZÀÿ÷ìêŸÜÜØöãäéîîëéìàó‹2E<@>A;[uoH:F0•ëçs5@Ht¥áÞ¸¥¦¦ž‡€‚xotf;C6·ìÙS9C:[uoG=@€?@@ÓïéõòóñôóÿÇ?W ˜sY¿ÿöíçÞ¾×Þïöãåéîîêéëâïªq~x€z,{upqxzz|ÔèÓ{yz{¬ßßÁ¨¦¦œ…~€xqqpsy}q åè«q}yupqy„zÛîêôòóòõóÿÇ?W ˜rY¿ÿöîäéãäóùêääêîîêéìáð£bpjm€l+oqqknf…àé¸cre™âàÆ¤ª¨š„„yppqqpkmh|ÜéÁfojoqqm„lØîëõòóòõóÿÇ@W ˜dqX¿ÿöíåçèìíèçåäêïîêéíÞ÷t Gxn…ïæL7ÍåЪ¤¨£…~„U`zY¤ïÛ/ Eym!ÍñêöòóòõóÿÇ@W ˜OqW¾ÿöíåèçææéèåäêîîêéîÞùk?zlºðÈ “ïá¶Ÿ­¯‹I^{U]ëìa;{l€ËòéöóóòõóÿÇ@W ˜ pV¾ÿöîåç€èVéèåäêîîëêîÞùl @zj;âð‹YèîÓ£¼Ã‰†ˆ@^{UÕðª=zmËñéöóôòöóÿÇ@W ˜8oV¾ÿõíåèçèçéèååêîîëêîÞùk?{iîæI(Ãîñêßä—‚„9€^{U£ðÖ'Bxm€Ìòê÷ôõóöóÿÇ@W ˜ nU¾ÿöíåè)éèååêîîëêîÞùk?zl¿ïÆ“òïõöÿЄj&^{U^ìëkFvn€ÊðèõòòñõòÿÇ@W ˜6mT½ÿöíåèèçèéèååêîîëêîÞúk@wq4äì‘YâïòûöÔ‚/‚^{UÕí­Bwm€Íôìùö÷ö÷óÿÅ>U˜7mS½ÿõíåèçèèéèååêîîëêíÞúk@vtzïçD Êñõþá 1^{U¤ïß7}k¹ÙÐÛÖ×ÕÖÑß­8M˜ lR¼ÿöíåè*éèååêïîëêîÞúl @ym¸òÅg¾óèžXjy5€_|V \ÝáV(rYš·³ÀÁÅÉÑÔê¸f©äãBpv4‚(^{U£ïÛ}bÌóê÷ôõó÷óÿÇ@W ˜'gMºÿõíæèçèééèååêîîìêîÞúj$€z€yš³ÓëÉ € qx3‚(^{U\ñßÅ«†{|cÌóê÷ôõó÷óÿÇ?W ˜6fLºÿôíåèçèééèæåêîîìêîßúj¿ÿïöôîîÜòqx4‚(^{UÜáçìòó÷íÿ[ Èôê÷ôõô÷óÿÇ@W ˜6eK¹ÿôíæèçèééèæåêîîìêîßúi}áÒÙÖÚßÚê?pw3‚]zT€žîØß×רÖÏ0Éóë÷ôõó÷óÿÇ@W ˜%dJ¹ÿôíæèçèééèæåêîîìêîßùn **.$^5ƒ  !t{8 ‚a~Yƒ]‹ƒ:(+-Íóê÷ôõô÷óÿÇ@W ˜'cI¸ÿôíæèçèééèæåêîîìêîßúj9nb‚ kq0‚XtNƒ7na€Ëóê÷ôõô÷óÿÇ@W ˜(bH¸ÿôíæèçèééèæåêîîìêíáõŠ,?5><@6j”‹J7;9€: 9<5OŽ’_3=9ƒ:<€•y8;€:;:9=5l•K;?><8;<Ôðë÷ôõó÷óÿÇ@W ˜%aG¸ÿôíæèçèééèæåêîîìëêçæìòñòïððñîëìð„óôôóïîñ…õööòðòöö÷ö‚÷öòððôõ÷ööíëîõôõó÷óÿÇ@W ˜aG¸ÿôíåèçèééèååêîîìëêæçäááââ€ãäåå…ã€äæçåä…åæèéç‡æçééç„æêêíõôõó÷óÿÇ@W ˜`F¸ÿôíæèçèééèæåêîîëëêééëìíì„íî„ïðñðïðññƒòóóôòòó€ô„õôóôõôõôóññòõôõó÷óÿÇ@W ˜_E·ÿôíåèçèééçååêîíìëë€ìëíîíîï€ð€ñ€òóô€ó€ôõ€ö‚÷„øùùøø÷€ö÷öôõõó÷óÿÇ@W ˜^D·ÿôíåèçèééèååêïîì€ëìëìíƒîïððïðñðñòñòòóòó„ôõöõõö‡÷‚ö„õ ôó÷óÿÇ@W˜]C¶ÿôíåèçèééèååêïîë€ìí€î€ïðñ€òóôõö‚÷ƒøƒ÷öõ ôó÷óÿÇ@W˜ \B¶ÿôíåèéèååêîî€ëìí€îï€ðñòóô€õ‚ö‡÷ö÷ö‚õ ôó÷óÿÇ@W˜[B¶ÿôíåèçèèéçååêîíëì€íîïîïðñ€òóôõ‚ö‰÷öõöõ ôôó÷óÿÇ@W˜ [Aµÿôîåèéèååêîîëì€íîîíî€ïðñ€òó‚ôõƒö†÷ƒöõ€ô óöóÿÇ@V˜ Z@µÿôíåèéèååêîîëì€íîïð€ñòóô‚õ†ö€÷„ö‚õ€ô óöóÿÇ@W˜Y?´ÿóíåèçèèéèååêïî‚ë€ìíîíîî€ïðñò€ó‚ô‚õŽö‚õô óöóÿÇ@W˜X>´ÿòíåççèèéèääêîíêëì€íîííî‚ïðïð€ñòóóòó€ô óôôõôôõõööõõö‚õöö€õôôõôôó€ô òõóÿÇ@V˜ W=´ÿóîåèéèååëïîëëìëëìíìíîííîïî€ï€ðñðñòòñòò€óô‚õööõõö€÷ö÷ö÷÷€öõö€õôõõôôóöóÿÇ?W˜ V=³ÿñöñóò€óòïîòôô†óŒôõõôôŠõ€öõööõƒöõõöö†õ ô÷òÿÆ@W˜ V<¬ÿõÿûƒüûûüûƒüûüûüûüƒûüû€ü€ûüüûü€û üûþöÿÁ>W˜ MFaÔéçè€çèççŸèéèéèéè„é èéèéèéèèééèƒéèéèéèééèÞnCQ™ .VCEPOPOO‚POPPOÄPOQHAU8œ5TTÔQTU;ž+1‹01€010€1€01010010¨10ƒ1-žØ Öÿÿÿÿÿ…ÿÿÿÿÿ…þÏ„¢ÖŸ‚‰……„„ƒ…†ƒ … `+}™›œžŸ  ¡¡¢¢¡¡  ŸŸžœ›šš˜˜—–••”“’‘Ž‹‹Š‰ˆ‡†…„ƒ‚€~~}|{{zyxwwvutsrqponmllkjihggfeedcR ›b/¡‘‘“”•–——˜™™šš™™˜——–•”“’‘ŒŒ‹Š‰ˆ‡†…„ƒ‚€€~~|{{zyxvutsrqpponmlkjiihgfecba`_^]\[ZZYXWVUTS`e$›†šÄÜÚÛۀ܄ÝÜ€Û€Ú€ÙØ€×€Ö€ÕԀӀҀрЀπÎÍÎÎÍÍÌË€ÊÉÉ€È€Ç ÆÇÅȯ^\Y˜!ÁÿüÐÿ þÿúÿ²Of– ,£ŠÒÿó÷ô…õ€öõö£õôõ€ôõôóôô€ó òóòõïþÍQh%–,¢ŠÑÿùéßáàááâáâáåèèãâãâ„ã…äƒåæå¤æ çåêöÿÊPh'–,¢ŠÒÿ÷äÚÝÜÝÝÞÜÛÚáæäßÞބ߆à‡á’âãâãã‚âã…â áâáæóÿÌPg&– ,¢ŠÑÿøæÛÞßÝÜÜáæåàß„à„á†âãâƒãâƒã“äãää‚ã âçôÿËQh'– ,¡ŠÑÿøæÛßÝÞÜÛáæåàßßàááà‚áâáâáâáâãâ€ãâãâ‚ãäãä€ãääƒãä€ãäããäãäãääããâçóÿËPh'– +¡ŠÑÿøæÜ߀ÞßßÜÛáæåáà†á…â‡ã€äãã†äã‚äã‚äã€äãääãääãäâèôÿËPg'– +¡‰ÑÿøæÜß€Þ ßÞÜÜáæåáßàà„á…âãâããâãâ€ãäãäãäã†äåäååäå€äåå…ä ãäãäâèôÿËPg'– +¡ˆÑÿøçÜßÞ€ßÞÝÛâæåáàà‡áâáá€âãâãââ„ãä€ã‹äå‹äå‚ä âèôÿÌPh'– + ˆÑÿøçÜ‚ßÞÜÜáæåáàáââãã€â€ãäãƒäå€äƒåæåæååæ…åæåææ„å äåãèôÿËPg'– + ˆÑÿøæÜà‚ßÜÜáæåâàà€á„à…á‡âžãå äåäéôÿËPg'–+Ÿ‡ÐÿøæÝßÞßßàßÜÜáçæâááàáâ‚æ„ç‡èŠé“êèäåäåäåãéôÿËPg'– +Ÿ‡ÐÿøçÝà߀àßÝÜâèæâàááâàÈÄÅÄŒÅÆÅÆÆÅ‚Æ•ÇÅÖè忀å ãéôÿËPg'– +ž†ÐÿøçÝàÞ€àßÜÜâçæâàâàæÆ¤«§„©ƒ¨©…¨‚©ª•©ª¨¬àçåæåæäéóÿËPg&– *ž†Ðÿ÷çÝà߀àßÝÝâçæâáâáåÒ¯°¯“°›±²¯¼äåææåæåêôÿËPg&– *…Ðÿøç݃à ÝÝãççâáââáäÜØÙÚÙÙÚÙ‡ÚˆÛ•ÜÛåèåææåæåéóÿÌOg&– *œ„Ïÿ÷çÞàáàÝÝãèçã€âãáæéèè„é…ê‡ëƒìí‹ìí€ìíìíçåçç€æ åêôÿËOf&–*œƒÏÿ÷èÞàßàááàÝÜãèçãáâãâåØÓÔ†ÕÖ€ÕÖÖ×ÖÖ×Ö×Öרˆ×Ø„×Ø€×Ø×ØÖãéæç åêôÿËOf&“ *›ƒÏÿ÷èÞá߀áàÝÝäèçâáäáæÏ«®¬‰­¥®¯­·äçæçæçæëôÿËOf&’ )›‚Ïÿ÷èÞáà€áàÞÞäéçãâãáçÉ¥«©ª†©¨ª©¯ãèççæçåëôÿËOf'“ )š‚Îÿ÷èÞ‚áàßÝãèèäâ€ãäÏÊ‚ËÌË˂̌ÍÎ͆ÎÍ€ÎÍ‚ÎÍÎÌÝêçèèççæêôÿËOf% ‘ )™Îÿ÷çÞâàá ÞÝäééãââãäãç€èƒé„ê€ëììëìíììíììííìŠíììíìíéçèç€èçëôÿËOc(ˆ±Y‘)™€Îÿ÷èßáàááâàßÝäêèäâãäãåãà€áâ„ã†ä‚åäåäåäƒåæå…æƒåééçèçèèçìôÿËMg$µÿüòhŽ)˜€Îÿ÷èÞáàáââáÞÞäéèããäãåÚ¹ƒ·›¸¹¸¹¸¹¹ƒ¸¹¶Èé€èçèçëôÿËQ]B¹ÿôúèÛA )˜Íÿ÷èßáá€âáßßäêèäãåáéÅ¡ª¦¨§°¨§©âêèéèèçëôÿÆQhÂþøúÝÇÒ® Ž (–~Íÿ÷éß‚âáàÞäêéåãäãåÞ¿»¼»¼’½¾½¾¾½€¾½¾¾½½Œ¾½¾¼ÎêèééèéçìõÿÏo­òýõÕÄËÃÁQŒ (–}Íÿ÷èßâáâßÞäêêåã€ä æåäååæåæå忀çææçç€èçè‰éêé‹êéëéè‚éëôû»¤ÒØáÏÅÉǶ¨dŽ(•}Íÿ÷éàâáââãâßÞåëêåãääåäçè‚é„ê„ëììíììíìƒí€î€íîííîíîíîëéêééèêééýÉ Ïãʪ¼Ê÷‘BŽ(•|Ìÿ÷éàâáââãáßßåëêåãåäåã˃NjȇɄÊÉ€ÊÉÊÊÉÊÊÉ‚ÊÉÊÈÚìéêéëèèëÇ·ØÖ¿¼µ¾µ‡\'”{Ìÿ÷éàâáãâãâßßåëéåäæãéȤ«¨•©…ª«ª«ª­äëèìçíæ·­ÖܾªÀÏdz›‚`'“zÌÿ÷éàââãâãâàßåëêåäåãèÔ°²“±‡²’±²¯½ééíäôÂŽÀÙϺÀ¹ºÒÛ¿ˆY'’yËÿ÷éàãâãâãâàßæëéåääååèßۃ܄݄ވ߂áâáâàéëìæñ¿LqØØ³ªÂÎÇÌØÝm‘ &‘yËÿ÷éàããäãäãàßåëéæäåææäéììí€ìíîíîííî„ïˆðñîì“íëìæó³Iif¢Ä·½ÔÙÃÈ ’!&‘xËÿ÷êáäáàáäãàßæêêååææåèÛר×ׄ؄ىÚÛÚæìé’êíçô§Hp€C&°ÏÅËÝÏk“&wËÿ÷êáâæéèäãààæêéæåæäéѬ¯­‹®Œ¯®¹éìëìëŒìëììçóšHv|8PØÔÆ¿m”&vÊÿ÷êàæÐºÌãâáàæëêæåçäê̦¬©‰ªŽ«ª°æìëìëíìéðŽH|u/¥ç¶L–&ŽuÊÿøéåÒ¡²¯ÒéÞáæëêçåæåçæÑÌ€ÍÎÎ̓΅υÐÏÑÏàïëìëîëëìƒKn& Y±r$”%tÊÿøèæÀ´×ÓÓòßáæëëæåæççæëììíƒî…ï…ðñîëìëîêíæyP„hHZY(–%ŒtÉÿ÷èäÒ¸ÛÝä÷ßáæìëçåæçæçåƒæ‚çèèçè…é‚êéëƒì‡íìïêðßpW†_  ‹²Ka#–%‹sÉÿ÷êáåÔÛêûìßáæìëææççæçèè€é€êéêê„ë„ì†íì‹íìïéóØg^…U ’ÿÍI`#–$ŠqÈÿ÷ëâäæêòëãâáçìêƒçèç€è‚éêééêëêëìëë€ìë€ìŒíìïéôÏ_d„L ¦÷ÿÉI`#–$ŠqÈÿ÷ëâäâãâääááçìëèæçæçèééè€éƒê„ë„ìíðéõÅYkB)²ôñÿËH`#–$‰pÈÿ÷ëâääåæåäâáçììçæçç‚è€éè„êƒë…ìˆíƒîíîðêö»Tq~85ÁðíöÿÉI_#˜ $ˆoÇÿ÷ëâä åäâáçìëçæç‚è‚éƒê‚ë…ì†í†îíîïêõ°Svy/DÍñéòóÿÉH_#˜#‡nÇÿ÷ëâåäååæåâáçíëèç‚èé„ê‚ëƒì…í‰îíïîëó¥U{s%VØðëîïôÿÉH^#˜#†mÇÿöëâåäååæäâáèíëççè€ç‚èƒé‚êƒë„ì‹íïíîñ™XjgáðìïëðôÿÉG^"˜#…lÇÿöëãåäååæåââèíì€èççéêƒë‚ìƒí„îˆï€ðñîïëŒ[‚a {èîíïííñôÿÉG]"˜#…lÆÿöëãåäåææåââèììçìÕ˜œ™€˜ƒ™š™…š›€šŒ› œš ša]„W _¡š±òìïíñóÿÉF]"˜ "„kÆÿöìãå䀿 åãâèìíçíÑ‡Ž“’ƒ“’’““†”““”‡•€”• ”—‡Pa…N  t™Ž‰¥òìïíñóÿÈF]"˜ "ƒjÆÿöìãå䀿 åãâèìîæìÓ‹”~nr‚qsuuqq„rqruvt‡r'uwurssrsmSjƒD Yto‘ާóíïíñóÿÈF\"˜ "ƒiÆÿöìãå倿åãâèííæìÕ…šB † …€ 'n|: €¥ôíðíñóÿÈE[!˜&"‚iÅÿöìãæåæåææãâèííçìÕ†œDƒ …'9{y0 !¥óìïîòóÿÈE[!˜%"hÅÿöìãæåææçåãâéííæíÕ…œCƒ '(!†'%)%?|p&$‘¦ôìðîòóÿÈD[!˜%!€gÅÿöìãæåææçåãâéííçíÖ†œDƒ<477‡8'7576Gk &‘¦õíðîòóÿÈDZ!˜%!€fÄÿöìäæåææçæããéííèíÖ†œC„,424‰243-Sc  .€‘¦õíñîòóÿÈCZ!˜&!fÄÿöìäæåæççæããéíîèíÕ†œC€  56+ …  0\‚Y / €‘¦õîðïóóÿÈCY ˜%!~eÄÿöìäæåæççåäãéíîçíÖ†œC‚ 74! …(aO  *€‘¦õíñïóóÿÈBX ˜  }dÃÿöíäææ€çæäãéíîçíÖ‡œF  ‚,71,i€D $ ‘¦öîñïóóÿÇBX ˜  |cÃÿöíäææçäãéíîèíÖ‡šNˆ!55)„4o~: -„ƒ‘§õïñïóóÿÇAX ˜  {bÃÿöíäææçäãéííèîÖ‡šN €‚(55#8tz2 &.ƒƒ‘§öïòïóóÿÇAW ˜& zaÂÿöíäææççèçäãéííèîÖ‡›H  # .7. >zs) #   ‚’§öïòðôóÿÇ@W ˜ y`Âÿöìäç&èçäãéíîèî׆œC 38 € ?~k  $‚’§öïòðóóÿÇ@W ˜Nx_Âÿöíäçæççèçääéíîèî׆œD76  Lƒb 5‚’§÷ðòðôóÿÇ?W ˜%w^Áÿöíäççæèéçääéíîèî׆œC#+7/ SƒX 7=‚’§÷ðóðôóÿÇ?W ˜ v]Áÿöíåçåè€ç=ääéíîéî׆œC 47! ]ƒR  *26(‚‚’§÷ïóñôóÿÇ?W ˜Mv\Áÿöíäèêãéêæåäéíîèî׆œC74 eI $%81‚‚’§÷ïóñõóÿÇ?W ˜&u[Àÿöíåæº«ºáèääéîïèî׆œC€$+7. n}> )67‚’¨øðóñõóÿÇ?W ˜MtZÀÿ÷ëêʣ¹Ððâåéîïèî׆C 47s (! 17'‚‚“¨ùòõòõóÿÇ@W ˜9nT½ÿõíåèçèçéèååêîïèï׆D74!ÄìòÙ¸Ê/.%€&71 ‚ƒ“©úòöóöóÿÇ@W ˜ mT½ÿöíåè)éèååêîïéï׆C,7-óî÷ôÿ£9‚66‚‚’¨÷ðóñõòÿÇ@W ˜6mS½ÿõíåèèçèéèååêîïéïØ†C 55$PåïòûöÌi$ ƒ17(‚„”ªüôøö÷óÿÅ>U˜5lR½ÿõíåèçèèéèååêîïéï׆žC66 ÅôôýÛŒ@„ &73 ƒw„–ÝÕØÕÖÒ߬8M˜ kQ¼ÿöíåè&éèååêîïéïØ†žD*8- e»ôæ™? „34 ƒcp‚ÂÀÅÉÑÔê¸>"…44%…“©ùòõó÷óÿÇ@W ˜)hN»ÿõíåèçèééèååêîïéïØ‡žC 36!€ …‚ 26.€ƒ”ªúóöó÷óÿÇ@W ˜4gM»ÿõîåèçèééèååêîïéïØ‡žC'45 …ƒ&72ƒƒ”ªùòöó÷óÿÇ@W ˜'gMºÿõíæèçèééèååêîïéïØ‡žC$*06.‚ …ƒ 73-(€ƒ”ªúòöóöóÿÇ?W ˜)fLºÿôíåèçèééèæåêîïêïØ‡žC+<8997738!€ …‚345689:7=ƒ”©úòöó÷óÿÇ@W ˜(eK¹ÿôíæèçèééèæåêîïêïׇžC3/101314 …„#5120. ‚”ªúòöó÷óÿÇ@W ˜&dJ¹ÿôíæèçèééèæåêîïêïׇE # ƒ ……"! „”ªúóöô÷óÿÇ@W ˜%cI¸ÿôíæèçèééèæåêîïéïØˆžC † …… ‚ƒ”ªúòöó÷óÿÇ?W ˜&bH¸ÿôíæèçèééèæåêîïéïÖ‡™U("%$%#.64'#„$#(56,#%„$%271€$%$%$.75(%&&$$%%‡‘©úòöó÷óÿÇ@W ˜aG¸ÿôíæèçèééèæåêîïêðÖ”–›šš™€š™˜™š„œœ››œ„žŸŸ€€Ÿ Ÿ  €žŸ  Ÿ›’®øóöó÷óÿÇ@W ˜aG¸ÿôíåèçèééèååêîïéðÓ„‹†€…†€‡†„‡€ˆ‰‰ˆˆ‰ˆ‰‰€ˆ‰‰€Š‰‰Š‹Š‹Š‹Š‹Š‹‹ŠŠ‰ŠˆŽ‡¥ùóöó÷óÿÇ@W ˜`F¸ÿôíæèçèééèæåêîîëíáÁÃÃĀůÅÆÆÇÈÉÈÈ€ÉÊËÌËËÌŠÍÌËËÈÔöôõó÷óÿÇ@W ˜_E·ÿôíåèçèééçååêïíìëíó€ôõ€ö÷€ø€ùúûúúûü€ý‚þˆÿ‚þýýþûôõõó÷óÿÇ@W˜^D·ÿôíåèçèééèååêïîëëêèéèéêƒëìíîíîïîïð„ñòóòòó‡ô‚ó‚ò õõôó÷óÿÇ?W˜]C¶ÿôíåèçèééèååêïî€ëí€îïðïïðñðñ€òó€ôõö÷ƒø„ùøùø÷ø÷÷öõõôó÷óÿÇ@W˜ \B¶ÿôíåèéèååêîîëìëìíîííîïîï€ðñòóôõ†ö÷ƒö‚õôôõõôó÷óÿÇ@V˜[B¶ÿôíåèçèèéçååêîíëì€íîïîïðñ€òóôõ‚ö‰÷öõöõ ôôó÷óÿÇ?V˜ [Aµÿôîåèéèååêîîëì€íîîíî€ïðñ€òó‚ôõƒö†÷ƒöõ€ô óöóÿÇ?V˜ Z@µÿôíåèéèååêîîëì€íîïð€ñòóô‚õ†ö€÷„ö‚õ€ô óöóÿÇ@V˜Y?´ÿóíåèçèèéèååêïî‚ë€ìíîíîî€ïðñò€ó‚ô‚õŽö‚õô óöóÿÇ@V˜X>´ÿòíåççèèéèääêîíêëì€íîííî‚ïðïð€ñòóóòó€ô óôôõôôõõööõõö‚õöö€õôôõôôó€ô òõóÿÇ@V˜ W=´ÿóîåèéèååëïîëëìëëìíìíîííîïî€ï€ðñðñòòñòò€óô‚õööõõö€÷ö÷ö÷÷€öõö€õôõõôôóöóÿÇ?W˜ V=³ÿñöñóò€óòïîòôô…óôõõôôŠõ€öõööõƒöõõöö†õ ô÷òÿÆ@V˜ V<¬ÿõÿûƒüûûüûƒüûüû€üƒûüû€ü€ûüüûü€û üûþöÿÁ>W˜ MFaÔéçè€çèççŸèéèéèéè„é èéèéèéèèééèƒéèéèéèééèÞnCQ™ .VCEPOPOO‚POPPOÄPOQHAU8œ5TTÔQTU;ž+1‹01€010€1€01010010¨10ƒ1-žØ Öÿÿÿÿÿ…t8mk@!%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#HÓüþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþýÝWRÿûÿýþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþýÿúÿfÜÿöÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøüí8ÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿKLÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿk Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿp Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿr Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿp 0Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿx8Ùÿ¬Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿôÿi)÷ý÷ÿªMÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûÿµåÿöÿñÿsMÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúüÿÿþýîMÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúýÿþþÿ÷ÿ˜Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþÿùÿ¼MÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿýÿõÿMÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿùÿÛMÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûûø;Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿúýî9MÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿØ!MÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿÖMÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿÞMÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüÿª MÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿúÿµMÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿv Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿr Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿq Mÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿp Lÿ÷ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿõÿp Jÿøÿýþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþýÿ÷ÿb öúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿ6›ÿñùö÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷öùòÿ¹ µÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿÊK˜£¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢Y ic08” jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ “°ÿ“ÏÁ Öÿj֌Ұ ØxJ„Ç‚! ¯’™±*{©Å¬â—<$¿âа6ac|¶!ZÒ;dÄ<êsݾ›ÔdÜWÐáN²Ì8ÇÚN4+ûî0¥ñ©z×-V ¾œ¦£ SA!•þ»å ¦4cÃê3qÀ£†QÝk×”‡ˆ–‡Í0Ëg}V¾L'jçÏÁ ׎ý£Ÿ³&X¹ÁÅëP"ØuÅ¢ŒoŠå!Äš;Ñ?Ìz#$M«† FOøñ#D­ùjjN¹ãH:Ñ/ÏÌò~g}§Zµ !C²Ý?ˆ;I^+Ž‹ª.ÞQîÌ-Géx Y·Å6A¨Æ$5ÕR ­G•&:òæé¯Ë©·ØÀ]>•Á+—™’ƒªp>_ÜòýVüÒ8!Éæ˜`W"¥…™q¥rCïŒÓ1§pjÁo¼ùæpe –øùº97\åæ#ÆŸ|: ('X©Vž!”ئ?J0 `YÌ^ôŸ;$ “Ô[ˆƒ–f>W+—¤Þ–c=ÇZÃí(‡ÚGÀ¨4+!? (Hÿf>Çx3E5ÿ Ôlƒš­JסF4]Þ‰@ Ö.# ë‚O¯vvÚÓ.O CÂR´Ö‘È1‘yéñy²E«.7„ûJX[ŠsLì2Š‹t¨è*_Iù¨ñ¸=×)Î#´FÍ4wAÂ]‹Ãí"‡ÚAÀŒI,±ûj¬aÛH³'«ÛÓ^pn6wµnHg}„pf‰€U‰˜ªyò¯ó1pEèHä¦IA3V<-£x;ø³È»QU[–핚…Ô!’Š€ŒåNí¢½•ò·Röhú y½ª]îÐÇàI? 4›ßpó¼‹Ñ™ôfÈC¶Ïù Ë=Ïÿ‹ó|€þ@ø”I'ð8°ç““)sz±;Žq8bìÚiJòþ–ÇØÄç\ïñ¦xa÷ê÷ë!.‰œ*ulÊK™…ÌK}AU$e·ó™ÇáWÇá\ÁöÒà=pžÆ´šcã·:ªþ¶GWFVÖçåÒÆ<;éî;@"33÷³ûÆj'íÚÅîKR¿‡÷&`—‘BFVvÖöÞuK,7_ò¯ƒ¨•¤˜[9‹b{AüÓ²§í¯Ü’£ƒÂTÔÿz&°%ªeÙ±†ÒRójBÍÒpOŽÕ«~gjhä4²÷ãÛ)èäA¾ç®®õ¦lw3Ïwù|‡ÌhÁ\žg8-3782 Þ `0ŒŒMJul¼ŠåK:]ŸnÀ]ýû2WL.6vW =EèL†’F^§ oÅX¸hh]ÞüÀI4øÄ­V@˜á’Ò9´ôÑ÷™:¨£_ Soiò)˜æxÔÆÉ•±®òÇ 7Ê: | %ùÑ«g¹+ô ]H'u1³Mé‚…š¬šš¢ÖKà«OløOX·,V·¨£!µ(P?šñ<âZîýÞ&ð˜÷¸Úƒ‰—/§±¶¬A†ã4”§ÔÇxb`Z=½3Œ+4Hž_ªîOe>'‹¸ìá3TˆƒÉ¶ß˜{–)×(£µ-_ MœJæÉN´)`p{nÖØH±òáÙ0n¾ã^I-ÎܲKî‡JvÇÀA|Ðáíï˜ÊkHq¦·ê­¨Óûh$ôAÓ‡)¬r“3ü"–€¿**„mƒ2+§Þâõ‚ÊÇàßµŽƒH“Q½$ÉtA‡´?’ü¹æÌóc¶€Mí“ת¯Íi·DöÛ1»Üíh_½¼¼˜³ô©{‡uFÀ°jvÄ!fH§Ÿ%m FGho¢1ò¦tvþÖÙj×±Ò£(MéJ±r¢¿gnæs v*¸€ÔŸfK AJxÒ Ä  Ùµ/bHDˆ2ûÃùÝVñ¢EYõ, K;Cž7å´r°¼ÁB£‚Øò'²šl“d6vU—‹£ Ol“:œ‹4+D|&rì¼s9SöÁÀiéÉ#߇“Îö‡w¦1ÞÜ 5©½u¤ÁãwysÙÝ âY¦|‡&õŒâ•ï}¢ØÒÚ|˜œ2óÀ¦ûBpí2™h¡¢Ø°…€ÓjX6(½Ûöžét¼ìZl¬—lýš¶pPþv¨Íµœ¦õ`~¼QýšEMQZo•»‘o°PñU¹$ ¿¸ö2^ùüƒläl FÊšåUø°…€šŸñFçÛ‰Z<µ¡[›ùØ3B¦0íKo —úˆS­?ë¶ÁF@HA§râÕ` 9ñSzÇà‚TiXŠUi@4fš¥F †ÐMÒÈÆFç-ÀåÑdAÈ@!s²\é°Øùdйó1ÕZ¢Úy×Ê#Îpðåc& ììy2Û¬¿l:.,Ò˜/ÀLÉŠ‘º5éÆÅvòÑS9 ø‹wv™b¥íàí •€ 1îfóŹ05~‹Ý}:aíïEǹ&È H÷úW5á-^_c ––éÎRøÜ:&èÚ þ ¹æ9« @¤'gÇá¾1øt#Ãl€Â¶·ûZo| +ýÔ½KáœUC}Ý>²lþD¨äàßEã&2ן5,Nñ¤uíröŒ{ïtðÍæ±‘—Œ¦'^°¢ÌŒaˉÓÄš¯3Ök ù£æ _úÚî˜×G]Ã-ÛPJùékfZè4_‹)¢ ý…‘ÿè"•ïž×}¡ë0G=gRf5é¿A|4à9Úw$IcoCVû÷‘ºŠ„7)Еv5‰°©êöê …’`öªXVK©Nruö´Tžß€Cb^®üT‡ç9}ú├ÍHä’éLÐæp˜lªöÄ¢q^G»–Wœ°QAÕí€xY([¯Cô¾ 9Ž&íº0XðG/ [ñ…ÆaÛÿVîÍs™Fü>N.p€§e ä ¼»M«àÙ@Ïp@¼ÿmÚ(žóÆ":YØ0CäÞÛNZCgiVXªK!ôæ®êý~r쉃%"5»%sªÔç§ÌVí Ðþ¢¿à²-S³kªjéPÖÊ©Y©©U&Õ¹EZºh¹Q“ØJ5‹Á1Ô°ožô‘Õ^Ç~»!ÈÚ˜É#¹« ¸ôýH¼ø` ‡û È ‚–€~ç’'Æ(ÏçþÙjë…y³>ÂE@ñùÀS¶ãžjÃ_%q~ä "7µïN×S¶ÇàÖ{îÆ>@&|ìF°=‹UyÁñ6`ÍÊŸÚÃj-Í®šÞl sÏL«ÎÁlMÔÅøÑÑHŠR@Ù£»¦z"TõrÌÊjwrPý&“øÂHK_‘½4߯j¬¬f°°þ”M‚ûÒ@bv^3?"®¸ßžd"›š¸îæÀÄE­Îyöܧ{ƒ3ªWíÇPû‚C˜ú¢WΗç¼ç%Šú©ò òöWg}Oߟ&oäÈ˸DÜ<¨@f±lá¤âÍ#TÿB—sáðFòiù@eM¤¹«g²­S‚aΙ»í úÎ>¸6ßÚ1ltõÔJ&.›“ªWKƒYˆ›é~aZÞTL³PÛÛþôހͺ£HÀ$NÇód‚e†É3ݤ¦6 I‰ú5³=ì?‰j ¥t¢þÊýNŽ·–/J¶™ 5¯.LŸ~.ÎÁšóê‚gÎ=ü[š4†ôJ^ŽªïœÝóˆ’ÜŒhI{ù*€"ÑJµš9ÆÙð Sl#ì«@X0w©þcdú¡´ï]ÑGÆßÚ²þ,‹D²hˆªÂLO¿ÅšAB—Ä´wzÊíþ,¯È‹ÌÀÚ³¼(©Yanï%áÛû}Ž5Xoì ÉÌy+b²µ ‚8‚…'%öÐ…³ =L*à FyæçÑÍaBéÎ-$©À´|N‰LƵ' Y¤/ô~%Ø¡çÆYf¦G:ÔØ,à‘³­R³àdËq)6c!‰„f &-”Q±Á²…ŽëÉɇ ù•Œjæ´J&áH)åùîI[ïUƒT=÷Pì^t_}*¦rÕ—l•¢b[>мD]°ó¦¿ W3‰áÍ ”Ý´ÆéÍ ªÑžUJš¢áa!,Ž„Ø×æƒý:¢Pg«d‚:àÀ.$53¯"26êv‚'*…Ã]nõ¹¸p·.0håÅeLÙÄËñSZI…Ë€#Üß(é!¡õçæ1éL¦¼í2‹Zp×v´GMj¼­-Ò ¦IV4¹Y•?Ý0½M ’¯VçöJ4›³” W,è_õ‘!Í:æÏ+Ï7†&Âãyk\ÜÀStÑC#!.~ 0z.zÉŒ,áxá«mR—a l i ãZÈj£Þb™¾ÞDf½É²ÿ(Vsým¾.g;ÂÙ„ClÀh«<”éÊQ‡FW/К?sé㨵b)¸ÕJz}—3<åÑ£ûíÚJ¢ÛÇá¥øiL? Ðu œ]ôZÁ+õùfT?58‚×V)•Ý÷` Uv5§G-‡6øÌÑ2Ì÷r`žF/’#º¥%ø\ IýU³%Ö¿æÃ¼ìl£û7¥ª`†ÊÜÃØç¼N2¤•+ÓE eíi°${0'0ž Úî[·0I[ö„ .ðï‹]øÑ\¤qÿƒId÷Þ…¡0VsèP¸†ˆ±¯ ʵ“ƒg£´4ˆoÿ0“¥®ÇJr¿3uÊ;WCû¤jŒŽJ‹ŸÒÖÒP‡QÛ¾©z‰§ VCI[Fíf¤<°¶R”M5 .H{+ü­{'—Ó/º*†Ðdðmó0Ø€éš8lTUkدh$ußÍ]L:£cÿU$Å»:dé¸É6 ‡ë¶D¿yæ”°}õú…ì ™$q/Pû˜ùÆSfÙ‚>.•J .8¯È’Hº1BV<¿IëÓPßÌ„½ÌÐyE·`‚Ìì‘tÞ\˜²»ÀÌ ÓÊ4P #£5Ʊóñ™;‰¦lÕ3ú¿ù q}\XOõKä­¼UPM‘[p~mÑlîÕµlЯ ¢iqä"ÔŠ$V'\*s±Ôö¥ïÔŠâÆ~½£ƒ ü0µ·“„ ïuXxêk/´'ÙÈAžÇTx)„ØÖÝòܾ™õ¯\Ⱦ7P\0w¹4Ìa¸XvUî$ü÷§ömÌÁ¹ãNÁȽ®æ ˆM}:րߌëWͧU¬IM}áP6ïÑ…ÌëQøÆ»­ºˆ·24…†¡Ûý“¢Ù`rÍ«MùS*R=¤>‡µ™ƒIÞ'5sR8ï—»bINÑåeP:éfàËHµéD•‘–ú– W”Π¤¬’‰è.ûøUYÀMÿ\5»ª|†4Ôéœ@Gðè¦ÉÐÿ~c†~Y”™©ŽËEVI& ‡1ŸÂ å²ùc Y[Jc‹½¦ÁajNæùí3¤©@Êe ñŽW•p é.BRÙñRêÉ=Dë~2~1ôEXÓ…*Ëù;¶0L:²,ÁS+÷íz8Jû'å†~įߺŽÑÿ*5š«oÂrù†7óê›nqÑv¸¶ê¬pyµ–ˆ'²ÍL¿)Ãu0ÆzL&†fqâÝóµì°º0M«ñs#“Ãí¾¡ößP}· ÐWêPñ×F–Q£„ÿB[Î(ãO&Âí"\4„œÖ­'½©Ï¸Ú§3r'È‹è|*2X…ˆ^™`mƒÒŽˆwI¥9}™2ЬÈÈ«üyõŽ–ôd¤•sFýZý¿9Go qäí¼‰8í“["õ ƒ"‡_c8D&ØÎ}MäCNŽ/u=Ϊ5Td¡ÐEêVev°ñRTíG—pvIº Ð?øEŠ*¦Ÿex7rµ|;„¡^°œôÔq@™ Õ®æÛbÞh•…áì[=V ÌØ/*µ,‘h–Ñ®t{7MlÜ B¢Îç(4#ÕÌ a˜uS‚1QE¬Å âêAÉ5z-¾§›¯ßÁ>øýðÃr)òp?Ut$M®¿˜ÛGÅÃXYg½¡X[§ÄÜtRÚä]¬g²baÑk¦mÓ,Zj†²rw&žü¢›¢ HüC½Z´•Õ"–p-¡IÚ~ÂH"]•&"¨Mœåm;Ã1жwD¯{úÑf¡%bÃÀ9'4ׂåVŒÈ„¢jµU‰ szÿ'¼àã„2t!0£ïÿ)šE""Ø7Ì­=ò—“Ó¡6ÕG›o º£ø†ëRàÆïý“ˆ¶?;¬Q×y«eæ_CCìæ÷Ì£ûOžˆðË‹ˆbb†!!–o/ŨnEÃÚŸn†qád±m€¸,¬@所ZV´©R0Ä`ABc–^·£aNÂóOQ‚hÁ:°@(µ¦ˆ¥2–ï/;\ÍQÛ¹ÔêszhÝ*œô–ïò“_Šþø³92Í_Bñ2!˜ªÇÁ¢Ð§~¹ ÿ/ãìd9Ì©HŒÉMÖ†êÙSIˆ9ðïi¹/+ò؃®°ç@vPeÇÄYúåSÏ+Zcöö‹šÙ@24%¾±%=¯¹ÅZÅÉ#‹1ÃT¬Æ«¿Á6^¬K„x§ÒóÁªÇŒf ×-É©gJªzÁ+ë#Æo ÆGð‘¦M9ò1¿k±…¥Çá@ÇàåÀø)B¶û?$òºãX´¯áŠRqoë'^ƒð€®{6§ÊçX}ÇsVÍw4Ú©zÈS¦‹†üâòK™ŽŒ)úg '„c扟p¹®¾o›æùºÎ!ÀòëéÈÁE]mÏeÃ-«|·ë(ÞÏñkRÝ+h<հùËú2FE ×W ÖwÌ-Ð<¦qÕrf€ =y æí0Î×§€†ÿ7cû@V5ºZÕžb(›º`¡¶“åô÷c‰ Cƒ¨c²˜Û’BƒÕèXH()†‡t]‚|©Yïõœ[oq˜¾Ë€\PŸ <†Ãâ ©ÃÓª#¹\9êùA‰zâgÇ-óΡùÌü˜”KgÖw¬–²õÜôçø*–#µÈp{ {=³? Ý¡ÓÇáê±·ÕJo¡8õdé8â_Ê¡:˜:Æ¢„‰K[ L‚ FØH=-În$mÆò+8Õ%_³›íô¦Ë3³ÈÜ:ÎeDÚè.²ÁÑ 9ºä«)AÑl|€¥%@T7*¥wPÒœ…ƒ¶4­²É'Ò ŠÙuì“^ 6ÓÄÔ&¤ŽÜ?Ñ‚6Ë(òæ;°¥3©*¹\ÄÛ—Y¹²:âd˜åÅ‚[„‡k=2u ÝxáE% ¢PZãW+}LœÓ¬ÿhà@i ..%ó"íPá“ú“4ïÙ¸ïöE€úìX#‹/}ì¶Q2kæÉKˆÄ`ö#«ºdJ¯âgf ÖoÊ‚øêáP^™Ÿ±?½|ÄŒaSm‚9W/•¦6[©ñ×)=L¯@uîØ‡F û¡qè‡c– .Ç’[ü­0)ƒ.1¸µfß^£U¬óë¡-ŠÎV @#dSWÅJºäåç·xO Ý€™ºÿy”>²JêÁ§hûNÅ„]ˆY#&*à'BÑï¬lÑ&%©ày Z‹„«7Ë´ŠAÏz%¥¢‚wáµ½Õ{zÇS|ÎFr6Öd>É6æmûÒ2Q±•·¹ÉÃú’ɵt!mÓlÖ$-“ax~ y*|ýßPOk¨ÛŠðÓHט¨ `”üÒôbb»=89ÈoŽÃLU®ó§Íß§"Ò«úð½ÀXQòü—Ôëý*Ñ_›’%Ä".o*Žé8,K¡Û.ùrµºº¤:¡ìü6Ï H° x?Á=TGÉÄ- kBÊç9ã7|J~ÿ[\ÁlW%š6M¬ ­±|Þ“îkM€t3~JÍÇPZPµ ²çó£^©ÂÕ™CPË_Ùܯëhf€C²e?-Ë-2n°Op¯ýºõq—®DÏaåS~¢­ŠÝ$Ó588éunûÝ~§2Ûb¬zÓÝmLòËaü ƒ#Ï ì€:hú«ŒÃIy0¬ÌÇ é¨‰ñŠ.üÞÎßSÃç´õ±­U0žSb^|š˜Â­8x%×íÑ,¦ŒëúVy2?®]>EK1õcÏ F»Ml(•vóÜœÙõÝ~Äc—® 83ÖãFÆrªÞÅq£žjo"ü¦l1ï˽,Ìb‰Œ¸–:'M‚Ž áL ¯Ú뽞\qÝÚ»ƒÊ•sT’–ò¼ëkOžútV1þrkØžÇé—T cï•ÉAìg©³òÞIŸÖeóíxò/õe6j5%rg2)˜ê¶[W>Iw³(zKŒdqpx3Ðqá'A¤SCBpîÜZêCŒZúù!À“¹8éûA8cº°—üsÇÓœ£§CÍ7܇)±rÊñ|ûµBï Ö0¶m?W+mˆýpy«ç7 Áw«mÝ0az³ôó)Øx1 ¼Ó°›qh=ÚûLø†N²oÃäÈ|÷¶?€§ÒªDm0@0ܵ7[ohp÷¨¡Txä.‹©Pû,=çDZ0°qáyå“aì¸àu+^…µ“ C¿øýž ðõØ­Ô âöÿy{ À<ø] ã‘­—nSV¤eÐn8¶þÉoãïÀp &·ÞÑ @Òhª=³H1’±¥êsS„Gs÷ãmû·RT°ÈfY_¥¡üI¾k:Ñ%Ê!¸ñ]b¶'ERØŒ…ÒhÁ?]E'pئ¯ü톪úWõëtŒ8ˆ EúTŽLÃÙbÐÌñTÀStŒJQÜ~z]ƒ,QL’;.HQkPJ=b>Èl ÚįM;¤1Y¢I„íâ4–‘›ã9ög>Ø£Õ; 3G@Bñ°­Ó½L¡?§ X±LÀ¥^ t½YÀûÀ…å>£˜ 6Ûq›ýÑâÜ’I$‘¼Q.‘ÌJ5åôÐÿ2”H!zyàMCÏ4ánf”öÄ5•›Šï!Kx±ÖÐ Ãóû¨Õrbzºe9ÿs&Pƒ Û2$¸’Ð×ܘÛ\>ORŒðàÿ+rήjB­ 3úš€·5Æ„²É·ƒHØ@Íœ(9ñfêIT0OTê^¯FÊâ˜êAÝMç ý~zx°Ë’ÙãÄykÇ÷èR­^”¸ÆÇ2¾šó„‹eyïTá~ uu#qX"‚ò€˜”ŠJh“ùÔ™ÅÓ;âKdŠÒÈjäY`?Í@~B<ÚSºD|X~ \Züƒ„GLšrÔÆæ—KdÂ$¬÷¾ð;‰1ìØÞ½aöõžõrQPÛ ~ŒêI`¬U—4wÑ tšâEübvü"A<FeCu€ÜŠñÓ;±—šöúœ…ÿzø'UA䀩[4³IALÍ&ì‡Ó¡òŒÛC£cñÊOjÂíø·šÓ¦ªù$ZA$ãˆ^†E¿ªm8†JÇWŒ—åœts•æó2G·Y3nDÖy hÍtjÂ4„§ÂœÁ•6``ô¬ÇY±ikè„ý:%^uÙ.'ò²2êðÝn¨Ò[D†´µWke½§:@¿Öu2ðSL4@¶>̧b±3w1ëï‰P¢Ùâ<>~ ܡÊi|]ÿ ~<²Ú½Æü5Qüú ™ô­{z²~äŸá7IHAÚi 8ª<hùL¿e²AÒzÄjèŠZY* Y¡>G°5Ó‘`½ü‹øóĉ„>­¯½ÙR ÉÂŒþk°=ÇuÉ Å}0~¥OÀØ0‚ß<ßüUw¼aYª>Ke†”·§DbÕÊ¥õ»F²h€Ôèq{ln'±r‰ÄØ¥àu²$µü½·ÖB¨jþónøœìrÖ0x½SÐ&ÔL*îqGw² x `ê¡8rÑøŽbéÒ8‡*´Öw,aÅž~1ÄÍäfiD÷C²§ò±Ç“¬§Þ³å«š×›¸(* ÖÅ4á{hT/{åX¶Õm:µÎä(×Ö&y v‘Î_ -Þ_•Á9Ì1^ÖéDTÎÏ‚{9JùÃ*= )™‡îJ:»®´kiú³­¼¥œ±ùÊ+¿ Ùõsš+Ÿt—ysÍ¢PÀ(·-Ô…Si%ø‚L¤+ip4ç›­Ùf"~æÎ¦Èô.•Ÿ 8Õ•Öb¯(»æS‰X8BL>Žh×D´++WÏ”•6Ãjf¦9lxp)\f|riÕH~>’ð)5˜ÂÃaP€o <>0# ^e4OWÞ\ξFÂ1C8 Ñ®Ä2“ó Õpߦà½+Y»Ò²$WG¼œBš0è/t·9â ººîº¢ðшJêÒ®¨èo†/™ã1àDÜm=‘ ,8®Ý!5‹ žÅ€ÚŒ¸„ß¹úA7Mk^8HÔ÷£l¾¦¦á%£`’—ç¬E0Ê«bpûx»¼qW`ÐÓåD¦ãÓ¬eD{æDþÒ·Y^á&ùd¥_A6”'ìOvÌJnä;Ðúsäåw÷ÜÌKß¹u‘ô§}Ýѿؠt)¶ßºlXçõæÈ£Fd—ñ>¡DÇúdßSkÅ}‡ûòj°K@„ec]õX üùál+Ç¯Ý <ê÷$;GhÁŽÖIMI=çtñ€ãMˆ4¶; ªLPÝßÚp0OŽ‘‹6Ò†JŸ†¡µxUîÐãý'‚~Ý,ùÀÇAÔ“y0‹5åšJÔpY>¤¼K{LJ°J(º$µWé )‘ QþÞ/Ô`û…9Îñ™ÓýÎHuÞmÝߎý›ªóÑ\DKm~9!ì¹@M,‰0gJÝRaΖ¶PSU{–Ç]"êѪýl0¤oª+q­9éaÜÞ5ÎÇ^õ?‹}RË spS¼t÷Ó¡t2 ô^À5¸g‡o¦MtÒIJ:ŠdÒ9ä”0™ __H Mùõ#)ÖÈ5ºXVyµ:ñëòž½zh´P™?‚º#—Kwæ„6˚ϥ rÍU<1“ƒ# „hýD4_‹¥b§ŽˆI¾ý1ÌM¢Àµ¿`'\hif./757Z/G%$V•Jɹ“66wÔšñ™¹Àå-BÍua¡ˆ–Ösù˜£Ã—[ë’,˜·5ß|è _” ì^Búx$41Í $&|ýR§6 H7·h¯­D*Ð-5ã·€Õœ(~ˆ²$Ef ¦áÖ)aã¶M]Ø“nײlıÉ”gá ñ R.c±Å vÉ€dGE‡{ï`® û¬°ëÕû@Q ÇôëE7o¥G‡S € þQpƒþ¾ýÔ2üa"òÆEÂr\¹¹Ï·þg¶£™a ÔBauytà·]_.¢Ë¯ú±¹ ÅŒº ìn›¼œº–â8}P ½w @Y–Üwe"Øœ©•JÊ3 ­òWR­úM Ä:°²ü=UÛSGè{î`'‚¯ê°e_µIˆ´@Èsñ_³Ò¹ (ƒ^ïXKòüF®G#"Ï7ãZ×rÓŠOà¡.€´‚‡kîè0I©O³%·KZüíÊ{Á÷å·¹”Ývüœ¾V#¿oÊ¢ˆå٢ؽn4ø­íÏùy {CâØn"x¥k_Jþ¶Èö‰I%ŸlAW¸÷Y@êi‰šø,C<‰E0±QØf¢G^ìŠ,>ãÚ5φ†#\µä¥'‹Ä}øøŸÃíêoRûzNõrQP×skéÎIp9§ F‚Ù8¥5`ÜÁ퀥Œ+Î\õ a«ºwê¯ØÒò6a!^9‘Ú¥'O¢ ðrà:ñ±Ù8CýØvö| ØLme7™#v²Çr™—óÉ¿ näGßöØj…8;:tKEJÐp¢ïŽü³m-o#iäCÛ¨–ëÔÆ®g8Xö˜h¤Þç4*š·Åk|¬dó4?ØdèLêCf„ é…WìY ƨ7L_CDÎ6ˆ:tû{Q¢¢´ô"Wçö£ÌŒ>6Űk_QO¸T¬ß߆?_Rsé÷H‰'æóUì¡¥ªs;:•¢ë߯ Ò2 Ò`Ðg=…„Rô„ ´ ¬_9ï‰hcаýó“æ8så•r3·¬½%Ù~w!Ü©‹Ç‘|ݘj|ød´Vo_2eÇäô±öÊúO%ž¯Z^EéCà4cÓ¶¡rx×=¸~­ J©ó‘×j~8c*ëQ]#]‡ë„»¥¡üÛ¶wÒë|``—¥iˆoάkö¸óiJ®o\AØÕó…” )â¥sž×dËtÂÇ%ÚçBòr LÏX!Q@94†n&Hç½:`kFaù-¢^lµD6 ý“r8胧»×ú6…‘j‹ä¾ qÔš÷Àø¬M¡@è_ÅÓM!yˆ®ÏA ýžsä©®ö›ˆïrÝÈÑo1»öFÄh ØÜ´ زãÔàÜWL9—Ýf5k¸VçcH@· \Ÿ‰š k;Í3¿!DüÃ43/èL^Ϋ•;•õ¹ÁŒoÛe*`y "ëþWa…Ž£Ð—Ò¼ÿ7g‚$9{ºHæóØö "´Gz.’Œš0£€RšÅwñ°eÝsRärJ`f¢Vm6·[ÂêøSðƒ—ÈÕA8wá‡THìfªÖ»gÕ€¢²7fKóŸbú¿˜±Sd}R²e{·ƒwogƒ ¥ö²=à?òÄĬ:å:rÜúL"XÇašR™ þ*ëAÀÜ6}…Â*úBùÇòùŒÒ°Oýùå_5ƒ $E,˜;ø…ÃLM¼i[œ6û^K²Q}WÙè¨9J!¹¯0ÉŽ.áI°Ð«'¯´Cð· cPÆÄMUÛ¸Ts)‹ÀPË(R „"€Á¤nmD=wRÓ(ÔŠƒQU­Öº'¾_FQ hÙaÖãüÓß' >ù8-Wr,œFãŸO„h5§øš¹LäC¿ÿ{-751ø¼œkŠ:íËfÒû Ÿæ¥Xöœ—ô™†|oLätU9a²áÜÏíÿ5À@ íZ1Ñ]K»A™×`ñý É}Œ›±*™†€iŸ®ÃÂÐsc.Öø®;u›ŸÊæ€]ÉäEvj¡ªS­8 œ'xéÇ£;Í¡¬+´[$D“Gy;p>4ªcà$¹üyÓ…ˆ*-«týwªÕßøÈN».¨Éüç•×m-— ½X:¡JôI…R˜|hH?|d³+¾¿‚)˜¸‡õ©’6— ¨jÞµ¬qÒ"¯ZHÒP™AL+ÍÑÆ{¬Mé<Qãë™Ìä Ù"ü\|ÝO3õöÐ^ä(nHPÇ+÷Iæû"tp/ü0Cž‡émÉÀ­Ø{RÌ"¼v(R/î´iÆJùœ”õ{/Ê¢ÊiÉ#L©ûÖØýè¯í:;¤ ¿BûÃùí xo;5„ŽíÝÑDI_dˆç0Ì<3,–Ó ˆ2d¶ÔŽ L%wP›Ñ®ÍoÏÖÝÞsÔ°<²Äa¾Jdµiú²Óõ`M•±){òÞ¨(?ô%)æuÚÁ¹­4¿äÚéݬî¡I~~ŒÕÊ÷ÝÍT†ù`л±0ŸxÍI¤¹»çQÀl=9iæ´ŒÊÜ-›ß¤)˜öž*ÄüÀ=!%Ϋ؄p˜¤§•jS3ߦ#<)ßAÅN¿Ö [¿÷¹ÅZc\Äp\ŽKˆ@‰¸äß8øræ£ *!l@TG~7—Ç&1ºÓmPËJ¦!€æ#Íé }^ZüâG”C‚Ápñ‘Í¥ÆÝ §¿r·UiJ‰yþJ±ë¿ˆ-f+tŒ­ë’KÖ!Ló9þU^I—TPÛ@ÂNŒ¦y4-utïu‘ÿAÝqh©¸ø´šïQën ÓsrÅrîfAŒXÔHµW®*zLÆUùU;bÝÄ+6¿eÅL&¡)èõ—@põÖYú|(PÁÝOõ¾ñÑÆÕgî ¤™|Ö ©Æsy.}bï3x¦ ©XFôÿ=¤‰”‘pŽ»ZdA“ÈÆï¢7X]§¾yË@#‘;:s¼È@ZŽõ+ÅRE‹äþÙšîî=vo{»l¥à¼\YÇánGá]GàÈ·f¶|•2Æ ¬C¶<3_L^BQ—šÿpóBÌiã•"“Rä‰vÞÐq> ÿn¾o›æù¾o…§èšQ%–ÇŠýop±ô6{_zŽÊ•XCž\Ã3ÚT”?ö¤@å9Q>óYï/Wž»ˆ±ÀK‡šý•myåŸk«„ë}m.­¥Õ´º¶—Èe©‰ã¢+ÜB8掦}m.¬ç<ðûÉ«<êá:ß[K«ium.­¥É…7Ü2¿‡‚>·{ÈûâZÇ#2]î ÅT†Ù9íc)yKÊ^Rò—l*…¹8éûACFù£ï<: *@0E©€£R2ªðÂá+~é÷›„ƒ"ÁV´¼s° noäÞ¤»%)£ã¨£Fñÿ6Z[Ÿ²ÂÊtø¸×Þ¤ç25`ü,ª’;0VÅ¿’µZô vi ·ÔF´Àx:®| AAvXšÃøhÛ{ÈÜ’†½±8 ‘‰²HÝ=ûkjs7ñ82ö@¾R†Œ¹Æíüõyk㘈‘ào‰Þè71%—ÎHòõ⢓5dzï€×ÿrn·<^¡AÈì?ò2ñ›)ÕÅšm(êùÔYÇ4i%Œ ,‡P4 þÒí}òÓÇÁ²©P¹îOæÔ»A~½æ½PLÃ\­ÇZÏâÌtášË®gP|¤dY3•Ò]XØãÿ4(¹¿ %þ kišY_‹ÈRãð"Ò tÆ™,¾Ûž2ôgv™“¯!æÈ3–$°¡lèÍÍ$FÒ™€ã^à÷+X|ý˜¹4º8øù¥§iXݦKè³Ãt‡¢z€`á5£ÍҗÏ> ÎMJ|¸¾=)ž¢‡bô~YßÛ|b(„èÍÁrxkÞGßÅ®cFcó¸ênz=د$¨6BÃCñiqÎÙÇòy6®e-Á¾æÞtO”¨P˜²çÁw”¹°®øþÛbúLÅÑ{ì­ordÒM»¢¾qYAªûè~ N}Tó›'÷ÒT=´…ÂÕ `Ã¥T´¸öW ¨éÉsÕsÀ ÓÌÀ8…By{Y!Íõl¿ÇRl(DõKñ%°¾Ÿª¬÷ŒÙ·‹«Æ4eÍú4oÿHý|… 9'ÚלLVøµØc´cø¥­P×zÆöp o3g¼›×4˜è§uåç‹lr}EDsZúÌ«)¡NÒ*Ô·8Ÿ%Lb¤WMLоz8JÙ9ÿ0J^ÛŠ¿œs4†[Y[?i{ysˆÙšW÷qîÍÛ‚e€?pY›Ô=e‚Mp¯4©ïj ’ÿäßå[¿ïGìÅy­ý ­àöò6i0[j•’ÀNá=“±s®âZ` Áçýîž:ïéXuôþT÷Ý|y!º~΂xŸ ùö(Ö*'u5RúŠê2—™¬€­ô!.Öï`Ñ4Ø0ªýƒÕÇ!Íi K “|Œ¤@“ñá“{­„¢Å¥x CeìšRÍþ;…<Ÿº€SŠ\Õäcûþ'yuÉ%bI¼OÙ«Ú%¾Ç@­·rˆ^´Jµ.ÝÜ[Vɽ|@&3 3¢ÏÙæÖŠ™9òÒ’Ã )K¬gfÉ–#lkäíe ;låiŒFKÎÁÈ›qÚáRÂs³€¼ÿ÷²@ /ׇ Ä”…]ï_Kpú^¢D[Uû|×ÉD1Ïô]wx’A±ef€Ì5‚üòZ³ˆrzøéÇ9I]óÀž ŠgÖÍ$“@>••F:yü‹"ÕW#_GRÀ4¤à-að Lhbsï‘3Á{ŒÃe“ŨÃF\M¢RAtûxN£ågBø"©€™èb!*ä9‰Ö¦Ç²¿Ò˜^/”ÝZp°zV>åÀô“W1ß‚gý°|q$s(úÔœ›˜0@ê ­RæÙ^WC\Îý äø7îi¨ÖÝu9…ù=DI8Ï‹X|>ñß©¦áÙ4²ŽèjJ"»Ù¼§i’N*§¼›é⸤߹0¼£O%·`j(ZŽkô̈́ᔸ_1¥µ•Lî5`eY%~&BAL„óÆÄ«\«ÂŒ ®TÕÉJ ŸßPóO.‡×ñâsÐeÓ–D •ˆ¬jU<”„Û"ª?ŽÂ€&F¢UæS°"šõå'•ñAÙB£ZT¨«StiõvõÄ%{+Ï (ÃWЋ¤+ðÚ\w†¦JÁÝ–Ç·¿Æ:hŠØÿýæÁdBbô/£0× _ 8ŬšYz·nIÃQ¹ ÌÜ9èTXä†*7ÐVxV j¡—˜Ûü±4£Àç#7â éhQ^÷Ú­¹Gðñ%W7èl©ØµsД %SÜаç÷Û•À?‹UUˆNRˆÒá/ýfÄ¡C‚µ;fH€$$¢ÔäD7ljW'[^•"påªÆŠS+‘»¥kTöô{ÜJêþ‘9u rÁjsûî~[Ó·4¥àôl|ôÄ5Òu[#rWò8©÷˜-Äb^H¤K âGT­–xìE›™ ©/#2I4~ˆö¥rh‰7<½“å"Õ›\¡ÞÄh%­ ~v[Z2*Æ©)8ìôq¨§­ÇÙh4°Jب]dIÙ¾(˜Ôç{”OÍTÑiÉ· ¥¿]êäªüö`¨Þ3í‹k¿ i’„2©CÏ@çh|ðÊ¡ ÏÊT(pМ†]`üyEÊà$ø|7CswÞ½px6Q'ÓEÅ̯‡å[N¼0ˆrY¬+º æ–e€·ý¾¤¢¥Gd¼>hu^1' qN#ᱦ¦LXÛ(d]—ìÏú”¨Å—Êpºè’â`xÇñ˜C‘´„ÿ…àK?­ ñ ò͉3ëo ä–(Ð(ÂÌ%ɼ4`"õ¹Ûqþd“âÓu n°‚EÉyŸëÖó!û¤% 4±6+ï¶zˆñ×%}•~ðÒ’6ÔÁ¦V^ýg®kCèÅž2xN!`Ç«5\k1¯4ŽX”"bE¬~~t¥»UFó»€Q/ж7ï‚ÎÄ hi‹|4J¥SÕ«JE¨¶Ÿ_é• dŠ…‡GÏ•†a’4«pZ÷K{u2?!ÐCŽ\Z¤Þ« óÙ“Ô;õ=±0ÒèC'õ>3AßîS3îÄÝ(PÀ /µÜf=Qƒ'P#+j™Æ¶üöÆ#¥÷˜" ÉûÞW$Î=]Ç6Â}á*ûAÊ®›Eh(Oa9 Ù_a/á™R‚x©=B2Lj?âKtå` Ã×8‚²40ô›±é4vC-ðò lÛÍå”Ópß8ÌñmDÍ£:)“q@Ró]•z=+aRè.Nkh“%U\ ñdûì›O#RŒ7²‰§™ÿ2ÆÆÖ眊ÿ†pe˜ Ó´ò«Ø‡”åßq 5ÒÃÎ÷{dõ¡¢&›Žê%XD2Å4:?åÄ+q˜x°åFÌ!°„Ê*S TÍjßž–€wïÕ ¡,K§dÐüµÒõ!û°¨xÊ;vèý„cQ*¬Ÿ£nœË­ñǽVÏ'ØŠH_ < FøLêÚQÑëxâÏmZ˜ø0sì`eödkÑ®ÙxÍtáL(w:Þ¯vÞéžœËû”wŠ^<µ`ú_÷kÕ‘@ˆOð CûÍiÒˆ‚òÌY3q’KC-„#x4›T‡Ír3Ô`#EU~3ÎVËjc¶°ÄO¢n4ÍH°±Æmô[a겂ÊE sI ȹcj¹¹ÝzîcDÐùazäl»#‰PVL¦Z9>PE#ÚàOìKæÂôL%ÀØ!FMÞ(a|ÀîF´¿7C¸¬ÏKÈkû þ/PGUIo ÷¬ø— Ø5 jݼ‰%à£YÄ ÇZ@8Ë™&[h)~0Ýy>‰ãiàÒ—•†#ª2ö}pÞÏa ê8â_ÿb¼¡#–øƒüJŠÈÀü4cæÇËE 6‹ésD%ñÙ£}…g_¤v©—¹Xy0š-%ZÊ»ç.6&F/°A .Q÷©¼A·–„·}èï5¥ßaPHÍ”ÅmßC_r !é=Ó ßŽš‚ó˜àC×.Àž+?-!ï×øWõɬÕ£øï#ù£ûO0²ü¿Œ›ŽÜÕÕdÒ—XŒRtiÎjÊM÷¤ìJŸU=ðY$‰ Q÷Nœ†V—ò†ýŸ*i‚°´ÒÙµò[ƒþyk¾_$Hê U×ÁW~–Zƒ Ž X ‚—ÝsÛT(ßZ…§6+«– Fwƒ\±¹R‡jxweéð+êÜe’…sûäf>µˆ7ÿ[ežÜƒÀzTªéÖ P»¿¥é/é}üFwü™Þ$È>)ÿfu²‰ž!«zê ?ÇB®âëÉö‰MwJI߬ˆRH²PPô.C?÷ ¤Wk’€)Ô8÷Vµ+.¹ìu ‡4§›H€ŘÉ—oÐTÝò /ܺÆAn¬˜i'o ‰Þž [ÔÔ/Õy–'•ÑÛo´è.liWijáÖÙ-ÝÒfDzò…fU#ØÞ;áE³äÚFéL´¿[HåI)lf1/þ.<þ¥t‘fƒÿ @Ú7>=>L é1A§£„R衦g`V‡žãò§)$ÝÜÃû PgÎyîùn ¸xVO\7þÒß×Pâð¢â7Q’’#¼…£¾µtÝýÌ»OÝÌ{”&‘̆X¤Û©ù—ÿHá§C$ Õô© ?lß4¥.QU¹œ´•µ õ6õÏD‘Ð!›D²ôœ®µËyjeiþÉÄj¦Ã¶¥ñ¨ºŠxå-°‹5V7qøpLÛ:d $²k­¬/»ÿ„MÕhÑV4ò4Rí % K¢^§¨¯¥'ŦG·Íó’åï'ˆ¸K Åàœ+‘?ÖM™ÄNÕ±^ä\å| ÙÉýû3¥f-G¬òò+KôÞ ¤µ-I€ ¢¼1xSWf°0û–3¯˜¦®mbºÜâª<ÁØ#×W•Âà þ¯6ÚA(UMö¡Æ3ŒŠ&iáŠöÊòìy&Òà¬Õ¡êrÿèûAˤøîßüÂ6¥þׄÙý÷;:sœˆñ±y%2Ï€HøœªÎH Œ=«^«ü™[«=Ø?ô€Ožu“rB2tRèe¥7×±†btgjºó˜Ó¸µæiã^}:&ù–_ã•È—e¹¢ŽFHòI¼°|‰À×–ÅÃàd߀µCJ€î¤FÜ€ÓeLjڮë;ø©öFdV _OWÍ$îÌ>‰cOd[ §Ôã?æ¢ù¸BjÜ߀ [à)ÃEóÓ<è<Äù­m]§$]Â\ûbÖ4½Ašt‹ô–ù6p’¹íÑÀN^ø~û|ýî±›š¦3ZŸ†¤\Ë9Ó èkJwèâ©Ç8/À\ï7§¸ º5‰)Ûpбôñi'ºýwþO´¹3¯ûLLìÔ`»¿)áÔ¹~ÚAJ_édun¡L·_2[æ=tb#°µV.asaѦ\²\A³8>âjyØqþªÛ=ß&WŠô%;‹Š©jrz®˜&L/Hß=õD²¨OD ¼”ƒ%ÙƒQƒ”ŽŽ°® ç gE5{x~@ìïóQpQŒItÊ,9G- ø>ªxºš@  ±(®¬¸äؘ`{NIp `wEè~=D~)@ŸØ«ìfaŠ>®5)M´_uìîƒ0 #½ƒ ¯Ì"ŠýŸ2LoA/Æ¥úò¦'ïxjm·$4/Šbß%Ñu¦¸õj:R!ÂÿRm¯®ÁeØÎ'·< @¼o3(ó0‘~hâQ“ 1o‚AJ2™G408»Á+ß2–à3þ½E£§ª~ÂásÚ ³=Ž=ø¨M·`³äÓå @¨tJMVâô8]î :Í{Ñ\oRoT?ð‰ó¡)Ìe¶°uµîÄÀ(ùÁ‰X™Ø·Ò=)&Û–P"¡…쌉sºäY•:è[`™ŽÙ'L˜.9Ì`Ó(ÝævÆ¿xr“.“#¸âôHS˜ñ¼¢_ÍŽÕTü·¸d¾Xä¾Î6Æè=bPnqYFí³K#º­HWô.[¡hOMÏqIÆÈú,ë”·JôÓ63¨Û¹§áij¯š"áîɤ­¸ QÐöi r¯ócÍç>P‹ª3(S¿ì*Uj‘!¹íêøÂó\çÞŸIX‘ÚwO/V$"܇Äîßίۺ;*ö+ Œfã¬+©šlKyw ¨%™ì\2ß!ÓþD¦@r ¡8:^q¨Æô(J0*.ßÉÑZ³Z²? xhg¾í(ŠÞ·¥0£»}‰KƒÿVÈò’ë´ær °Azñ¡`ŽÍQÕ’&Ã÷ŽIþ*…5ƒþ{_­[l ¾U#t ðT”˜ƒ(M„#‡®i^=OfDXQª žQ™¨}2²J”_ËþZÔfwÕM¦(ƒI˜Ø³²ºìâ"‰ø0ú≸‚`¥ýŽ+žñÞ‹ÓžY8G¬ÛÏòÔ!/È „ƒÅðs‹a¸ó—€üžK7œJÊ_ðDÐ+Yì 9'AI0ÊÜùT…ܹŒ)¨¥«w!õþº»ۂȼÃ.ZF³§R@^®~¯–‡ëJÒ\ñd¡[FG¿ÿbe+W%®Í•p‰‘.eaŸõ uÜÇB'9Ë€Cm …¡ÇÄ[í•Äw” ¯5¥ ÒñÔOME+ÛM7.x¢ÛD±y êÿÄ‹+ÀstýõÔÓe Á7H^Lj(Ô¯ðUà)§Â°a ¶°_™v:ä”Èè¿éÝsÊAçÌ(m•Ÿ8îiM±‚æû—WÂØ]67Ûr|rRÖæõ…G¼Æ?òŸ’jAYSá±8잸¦kA/eruOu”*M ¬Ía<š¾"‚Öõ\PÇ-³¾ }ÍBi1†‘†W僨>Lç‹¢>Š5PìbÑvE‘‰¢ RË*• lÔÔ»½x+&– S,?Ê#œÈÇxHø:dC¬~®‡Khah¡³î™:8Ê‚“¬éÛ²nalÖlz WÙŸ÷„¦ï“ ~')]¯BŒÜÿSË Ìîó†Õ.Áxõ6äêû¶Y¢åþa¾3¬êm)vi  ÿ[Õ"Ç8ÖdTÍ~2äÎ7‘Ky[ kHè”×ê¬èavÊzífú¤ö)V@ô¥yå7Š„¶§è,˜WS,4N«°µ¸8ÕOúdbvëq߯‹,&½÷B€²ŸýOõTc_?¡G ¡”aä»’8‡u¹½ÌL[½¥*qáúF !‹y’?D0hø:dS27yÜ›²u\JŒ`ù}Nl9jÑ£‹ž³øôåÍšW*ító/º:ëª\NT¡[1H§ÙÏÓd>„ć€ç\Q\BÚá[tçaË€I¡ =ú¾ãKRe|:A…®Þ°y‘¶¢ð.ÉïkÝèØ¶^±ÜxóÎFbM72|º¿àŠõ—M­cû›'*{ô¦¼˜|Bä«Þòá]­"enžãÇ6©°®èØëáåã7™ý2ˆ…g[®alĤW 0E£UÈ[àDT ÃÏOÇ„ùêSb`_ç•›Nºý'±"í¢uø€Õ¥2rŽAŽ’ÏE7”±ºBb·¦ÉH`X6Š7güÏôɳ?ñOúÜ,åÆüxeHU‚ÃûSHï±B ùç’8TFÒYüÿ~æ)À»Ú6ª‹¯ÆZ¶í¨VŽ…\ pÂB5O^læ›w”ÎHæå¯­G g ”5Cpî¼7¹ ]ÅÆQ›“—MÏáñ7/c{èô¯B?øjhw.¨¸L²J)1JR”¥)JR”Ds $Ø‘Ò5¢‡p¨Y7÷Oe]q2=üíªM´¤ôžp \¹åÙA髾¬.H6a3[¶|SWQ´:ÿå—nóW®*hö^8Ï1ˆÁ¡>N9Ï^ÅdvÅ©˜.…7ñéBÄÊéN:“QÁÓ·qÌEdÓ½yU°ãýŽÒ_ HÞv›upª›Oì•ýóüËv¤šöNO–ÓmÀ–„਽^É?ÎÇíC uL8¤•ÆŽ3ªª©TúT?ŒJPí¡šËßzøÐrÍ42²í øx½_3·Èxè½ÌØ6_Shµ^·L;ˆ—7l AØ.©@ô±Ÿ={hI ÏŠ]ƒcVX2‹Zuš…[\ÝTâDІLBž³œš“qŒ“3Tð„ÀÓœÔFSOcƒE"Ûÿ"Z¼ ßÙè0ñî$Cu⌊wI÷áEøÝôN⢔¾i­sÿTŸÿn:%Îðb‘­ñ-öN„\pÁjÕÌÉXÁÿR³¬=À%÷Ú_+í…ó|íI8k;"S¶}Ù£®UÊd(ír•×ÔŽíC¦w•Z%­ª¬äï‰T%ë’HˆÆš NÈÕ–ïÇKº÷219dgÂ# f4ø(Ù~e¬ÑD |Š|¿¤®aÛ#DظéTWcqì_¤xÆ ;©(Û]Ÿcµ£XÀYæ'¸A¬‹Iz{•‹ç]ß=áKhE+ÿ^ía‚ø¶VopÞfVäeÕÎìA¾€9|ñÀÊ6’B€¯(©™¹«ÍŸá0#6 E˜¦õœÄxöEˆÖq3úw\z]«Îè”t5Pýµ¡¨Vq¬Q…r9K=6¼êjá Ý;«³\²Uk¬¢GQ*¯15B†bQ|™ÈO„ÜŽ,¬§Ï(ˆ·ïÎáÊHàì‡bÍcŽò»«ÁÑ3 p5dlBø…EFóþáÅ—Ù×îcˆÃàÉûŸCËú6E>«èÙzÇmûÙ&v½eŠuyŠ‹N¾çåŒN`|pWªŠFÂbO _¸ƒÚz(ärév:‹ðfOøò¯ {1E !ñ ‹†d9:Êž.*Kwô\/Ô÷¯„V>=œy2UkY`•þ%K$a‰Á™öj_6ë»Ê²šÄýŽ‹5R(MœOŒGšq.û÷ßs±AC‰Øæ”aÊv;¥‰r 3­Ý‡Æ7™¬]Ƥëks¦ž¿%®$TuŒ«Ë³¼Á²;ž¼–SrCÈ~˜:®"ªR×QõØBËäœ@0ÅmQô©%=Rß®ô44°Á¶RËŽKN‰áÒMÉ}ˆÂGð÷¼4=ò¿UbVâÕ_+/Qh8:=ÀÒÌòÑÓ+L®%y·BúÖWÿ`‘kQĤ÷›:×  »3}Y±öQ¬J†Œï€ÞL ZÌNXÁņ€Ù«\+ƒ•ZÂíÍÂA¢Jq§ëÞ<¿)®°;ù½ð5ó¥è^6œ§xÀìLB`ºc¹$ijõKÃCq»«Ì+—+Á!£ê!Iê~¬OH‡gî—¯ÔÏŠ‹ô©(¡ÔÕtéºpÄÙÝÞôín†I/k¡*Ê4ô£5H«U‘Éiõ>`Õ”‹¡¦ŽG£ì„t4 €˜¾Q[|À,ú­¬-îÑ ðOƒÏÅr$5x :F·Ð2ÚñŒHê}3ÅãOFÔöÞX¶Y”òôYZ“ÄÒ‰:V{ª¡„Í=âl9¦Ògâ/¨È¶3KJÐßÇ´šÆ¿y@.XY ¼&GY¼Aíå8ÿ-ÅÆkT±þ¨úŸ‹1sÄ»Æ"8†uoøŠñð1 "q -Õ̰@diœ®0Í€W¿€§ôÕÛ3zIôIju+Ô]„×Påa—ºIUy83ßæü ݰßôœ$¦xÞntfT¿ŒvÄèW&ͦ*¥à××zqô´ç~éëóg¶ô…gL*Ɉ_ì#w]”Žs;…\úR4økY¤¢B8o¤vÚe°ÙàeãXZ*¬RPy/ò+öŒïæj‘Vh ‰ñÿ°¦úɲz A}ýÅ×òâdòпLU7>Ÿa¦‚%ÎÏÃê— ‘nÚ¨ßJªQJf¯Ÿ:[×Ü‘"Á;¼”îÝ_óãžÈy´iæÌ"8lýEFÚe°·G%¸õðR Æo!üÿ¨hí ƒ²#r$ÑUÝßfj°ùرƒ>ZÎ~L=·¡RK× 6«4•½S„`I:êò,4ëâÏü †LöF+? »t +¸*#¾ë®iV¼iC²d7sÎ*p•UuÆnìÂ’_‚D~gW%`ª5’»%ð-µœÇô|»PŽsÖbOÒ¯øE?µöÀõþFŠJÅ™î(cÿRgH:›ì«yq›6·{å`+ƒæÆÕì >ùâ7–¼é˜KÍ#)W“Ê^²þÄ^»Œÿ ƒ™‹&Y§™pE‘Fí]CŸý½l"$†„jBOì©U¤Ó»ÐhZ7Þ6‡ +GgðØšÉ|ѺTæì³s1:‡Ðt¸sY:‹¬I= m|Q¨ßÉèsœ{ìé´ÝqæµÉó“­ʻ#Mv7ö‘ƒ5¯ÈÄ7•Æ×©ƒ‡=üèNq¬t™p¸Wð#·t´åø‘ i'¤À…Ÿ5¢®ËÓ^œŸ›}ºtI¨Pó½NaAß5²œi~s[{²!"bÑbl.Є3÷8Í@ù_2Ø;ãß[¾Bcj—"z¶­ÕÐä ·ÕĦ,2ó3I¬Ðw à‹ÅL¥&]íà¯ê6ßéŽìÃ!šN²lç†ìÛ¢§}΋^Àæá\è-äˆ_\çŠûn&@‰oè‰ÙŠ”B]Mí¡ ‚:U½6LÞ†:–ñò; qçA³x­Êë•D>4©¼µLRâš9#þÖö„ºÌõn+ê•d§Váæ'0pH¼ý-€q2µz2|Ôõj’[`rΑî$¥‹Vé óÆÐÿpñ]LU‰ÒïwÿsÑ(b<ø ¢ã¼›ÎCqmfûÚ¾”ÊžíÿE.rÊD›kl Æõ§ø)úL¯I#<‘AM¡ò­É|ýÍÕÖ Íψ(×ÖÄS”ýyØ}9Ú0Ä,n²Ø:®êÔìmP¾Á¯H)ž|;úÍt*PòíGí¼bèX’ãÔzZ®“ ¼#{>k7CD¯¼R6’QX~ޤEA€gQóùÝyú“pwß—•«Ç#uˆý U#“vv†³#±yê¾0šüÆ \‘Üü³ö!6·©ƒ©Å¢Ê÷Îó×Vä/¶^ÎøóÖ B'TˆdkU‰§©Â ÿ%*Àº1Cl©ç-ë‹v?¢sø†m3ÆX˜ vC_ {žþG»geÃì1ª;{v2 —@ÔD¢¹¢»ÇÂ_Z(ººRW.-¡»º‰B´eÂ[Ñà\Ąɓ0±™³ †¿:BV6Ñ” z*-‰ÿú§·«šüòµ3h€ñ[oì%s›Lq›õO‘;ØÍc± Ëk'YÐ…1°¶¹¡&õ¾© Æe?uë¶¡RAaÃʯ¶ŽªjOnO ¾ÎìêY"ôjßqñÓ(™ÏgÀ¼h†h ªš|âLÚQ;Z¼«ñõ¸¯îõ±l :•~ªüq‰¸ù§Ã`Rsdž8d'>HS7ÕÑý¨‹ïá7³ž„ 'ü¡†øyS×é瘉Tyãî|½în:f.™ ö@Þ#¤²úd»9H(Þ±pªÂ–°Š¹bBúI}"­$˜ 2™rÄdžýÿx…+гÄsìé²’žòu§O~š-¢W¿DʹŽB‰€Ç…ÊÕ€#ìkȺ«ðmÐSÔÿy~Lâ¬,#æØknÓ¡žÝjºé°¦°ÃŠ—D…ܨ,SÊÙXa˜ðž3ó(º;ä’}Kf<6úÝÝ®® ôˆÜqˆÔÁ4—gÇÜqítãpì…fWøèÉü±(3ñðq$Û€µÖlëžÔþšgBtsßSäªÙ®ðŠœ7úþL1"QDÀø—ÄÊÚv^%âÚéi‰Wìªø,ïõ!}ºŒÅ8ïe…k¹LLÀxº‹r•0L‰@‚¸)dðXÕûŠ'übTþHÕˆhGJnZW©é#½³A àLÉ‹BÝàÐÈ1jÇ¢£è™] ù‚‹wç"ÅDbª…,Ѫ òšÅRZ˜¢†+õ©znŽ†ÆˆZ½|³Ë¤‘Y¦‹þ^‚ô7çÃß0®ÉT3Á-Ëy3å¸K=ãÓˆSæÄiˆ8h׆×ÄÞT«ÔËèQ6…¾”ll8M-êÈ€­ü“ú?·n£”¯=™YÕ›(î÷.Ù©Ðf³Wû¶=cøÁ]<˜¤VÂ"µñçî[!CM¼TðÌv%Ä@8‹•—În™¾Fló¢É[ZlÖýÂ]’+\˜üªé•#×¼?U}_ëE¼­ýæy^Êg¯²‰FL‚Ÿå¥C:°´«L“‡lÚƒ0ÎЭ â`Ê D1}‰q*OWy‡Ý8Z)4xLz„æ'®©Û“Ü·ÕEáf¶÷'õèêTyÅ¥¾"¨ 3wL9.ý·9¤¨ ó-f<ÊÓgû‘º¼Úö²ÓÝÊM¨à‘Ÿë"v{ݬ²?—”ÙÀ‡èq‡YÀ p$hoÿlIÉí¯ib?÷Î.õ¹\ZC2èéwÿJ•ç|³iƒcnȺܢ:̈ƒ$"q+i9nÿ6ç']í±Í0RÌÜË$â ª‘”"x$<6)Àk©ïm¦ÿ޶v­'EÿdäpùŒµûß.;CFùĹ–q}–»q3V5âú´¶ú¶ãöõ;û{ÅõkEõt}]~ÞÍp_?cÿ+z¿W@«© øz£GGkpÙVSs¡Q ¯~ñÇïÉ}†d“&ʳÙ2¥Ýæx<éüõ-Šuƒ–Àt28(mÉoðMZ@–’Z@%¯@ÐÕ J TÛ²  ëNð[å2ÖÓGÌâìSŠÐå‘ u„°žˆ dêÝL_íkÄQCùHQ§ŽÇÞ­Z>½q=„> ÚßÐåä¦â ocgþÃïo‚Ìç-Á÷&ç$ß²ù@£†Þú5ÖÂIßS¼ØZ¬‹?¿àaüv18³VލuôYþùE‹"íyb͵[+•QDÁ$õ¯`vÞÄèFs*H»š¤)—5‚…uî„GNœ _—žvèþF攞濔Zñ–ë¸ÁHeF6»ú½Ù®>ü¬)7¦ºL:j‘c‘¢Ù–•w?ô3‹[˜MP”U[3¢8ŠÙh±×)%réYÄ[&pÖ$š?2>Ês°E'©5¦§Éæ´˜Ì:&Ç*6»RÒv„eêƒc7°Ð!à$âö•YÃ) VBGË !žѰÃ*:ïHÇ^õÒ$Õ…ÆX‚[îÏ`îU‚—¦ ~X¿Ï‰ • {ªÃ¿$Ú\­ z ËePAPzÀ½W;uwôl„1눶5jmÃÐnźõWñ²7I&¢%R× #Æî³&.—Ë–çUÁKÃè;Ä–Iˆþîàß›Þ9ð™8¼z²A¢wß²…ކmÄ2/ïUš8›s-îÀJCcÃp} ’;J'°ËߌA ˜2Tæ‚”7YA’/€Ôo»îVM?.æá´–l9&.Ç{Ôª£n@6}%âV:¡ßMµÜ¥Þt†_Ÿf™YÄÖÎ'»?Á-XZÞ¡§/9Vß¶ “òëažk¥]A®7B.áD¤Û¤† ¥üIM¿vÚ%H9ÎÑÝÏ2õ9æÅ;Ì*¤íœdÏkID/dÂÞ#©Q]GA¼ÖžîÐcQSAyöV•ŒÄãèÜëül,x^n6•O4_pMß¼sz¢µŽûGп²#³¾@m ÛŽ{ª;§›é''Ëã(Â|5;I¯Âi[¢k˜L ÙZI ¢Ìœ‘hבŸÄŽ\yp_À2_ïfØb ŽÙ@–Pu5 嫃³6æ±)XLõïŸå|ñ?žaQ!£X=fA´;üW4=ó Fvw§ÙSJ8kŽv|þ "û|üûasëEŒØ> Ê :á]TF7hS¿[Û{#éΆ›Þ—®³ !úŸ(¸(-µ"âßÖ¶¹oÇuC @û`Sh¿¸µt ñ*ÙÈ¥Vú­¢(Ý¿„o‰Â’Qθ£ä¬ƒ¤ößÚ `“ÂvJÑ ZÆÂgDo%œ º…\4¼´¤ mZ¶zè/4ÚwF0÷AÔC9 šÙ÷gnu„à™×ó’Z±lÈÅ©=!êŸém´ù2¼Vo2‘ ?ê„ ó‡×èG”£MHj$qS·0üŠÔ²QéÌíÖÛOÅS¸’ÂùBËE›Æ,ʶ4ÝÜ  ïõ § iÆQÎéRXó¦á7oìZÈL‘ÛÑtêg.Ô¿Îÿc¡.í!w?h+‡Ñ™ARì`:DHß¿££Eƒ’XŒ·IQ¬Ê[ÙI:ãmË£ÔâÕD$€Û5ù;±ïÍ¿X·K®Âäéc,èРZk)Ež•ãàZA„› &½›É¦ˆ÷˜CËÄiœ™êdGù˜#L «­3sSDïÀûmÔs¡£&?µ+W^¹PÈá~ ÿ$…F’H¨+0ð‰»îk~Èbâý}aª€¸9¨Ž|eæÜn…ärËx‘(+0„Œg·þHPÛÅÒÆGµ‡´yl‰I½“ø ˆL-9%Þ‘j˜ÀbÏ+m¼~“³¢Û¦MKÏ6æûìØ÷J êDR‰žÚ¨|üµÁÑÞÒq ‹}¥ÛŠ{;]ÃÆ.£¨|Hd²éº´ÜGÄ­`/’- ˆÂ8©gˆ|¨ÖÖÙ\#ZÔP×Z-%PPèÙUc—/ã§Q6Ê.†ehøuZǸƆI é£ün3»ä5 ƒzܤ<¬")lÈ8ⲪåÜU/ª-ó@5|’×&¼ÜôÄw> ²u·Ë@œrÌ€FZ~¾d?›ÑÁ¹¥‰ §Ë÷MD6 5æv2©«ú>Îßî±­¼Ý²ÓŒ‡àôûx› ‘€€ßDÓÝê¡¡0¬ÞØoI¤[$°â„þùœ”~šŸ älL8Xôê.¢E A®WiSÞ³”Î0ۊؽåªs" ÛÂ9¢³ö™Px|‚«Õ§…éЈù?8 I8_ú©¦`¸ Ú0t§1ç]‹*8m%"„V¨ `󈞮2@¡{Y}‘@tù}£*:‘^„š–4ªÚq¹…ãµE)Pþ'Îj&ê6­¸#¢1Jø&}}ÝÖnžH²T3w ^•¶XQõåtk>“¦Þ½úµ¨¿Öÿ\>ÁF%%ø 2{”°™4 ~iÿÜO˜º¤ý»@¢ÄT‰Èy†­Æ7I±ÿG?Bµ”nr¾¯d¥Ä”s¸Å°®¨Å=Ii?àäQw´]}£ˆ¿‰ÈvV#…Â+Ê8LõVέ°¢Åt@[RÜ}ýG\o¥3<úɶ̯ÏÑUvÞÄóׂ‘DªnÖÕƒ=GO‹Jñ~©h@,3ÛÌe§ÃÁŽR³I8싱„æxvŒº2¤…yË.YF…9®­‘!¥ÿ1Þ8áØ|w/¿6—qi‰—©_÷+wÈñÊæ#D(Þƒ¢»‘A)qz' >h ŽÝ.>¨ `¥ÏìQ,_ìËPôø.ä`ˆÄkîOh*X´9§ã&Qf/Fäõã8Í®§Û0j±ó¥OÙb­cÛ4âg¦ÙLXâCNâ/úÃUUy_"h÷®_Bi´w=мùC‡>‘èq,û žDp[°¡iå¾CF`( ØTv¢«UªÅLžxóÒµ’¶Ë«ÂÂÿ,@—8Ͳa†Ñ×>5­»tUÿ$¿øi¥ µJå­¨ŸQÇÖgs‰{žƒ×)D ²´+2"Ñeö»ý½o”uuwÛ± ÄbþF.™‹(‡*6˜pde—T±?u|æ;YˆÑë«û%B-ïäXGif "h”Jµ÷¤˜®âœÌK›-î˜j®TT,ÏÛ¢sÇôYW—ì–ܲđ˚Û?+óßÔÃI›ò)#¢Ã¿õiÉu#YŠ£f,#Ìô‚ÖiÖNýS¤±aiµ‘ð³ÕZ^‚Ã2åŽA«óGL¡Êÿ'Ž„où“çâÆ@'yôi¢.aNãJ¯xâÆ‚¿‹ñæú³&¶M2Ù”nÖ•÷q±ÀŸ±]E0@ï9yqiÁèí'J&­=ˆm ƒ^aý÷Á¦'Ô¾úó†1*д'DßDl‡ÓU£~¨é?0Ui«04:_#Úy-õ±òÎi¹ª,±à}^ܲ±÷oòIÌg}r列F ÎÍsõTÜŒ‚¥ÎTÒ]8“€“`Žê]¯ Ìvœp–kêÿÔ0ƒ‚ß'p÷wÐ `ß:iÕ˜§BÁ[«ß礶_Ñ»_©ÞÎPVíØÂ„v'Ó„C´µÔAžÔY´õ ª{K¬_hIKx)pŒqB¬ 7RÖ ÏªÎÈ``SðˆŸ0æ¾”‡dTŒdM/ºŒÓÞÒ®?G-ãfë>Ù¬“{åW‚‡ØìÁDY†Û«)ÄG-žŸ“^Œâ üæ0\÷"}¶]¸˜ˆ €ˆfN†/„ï-à[_ÁQG57YëÑ›ˆÁfç4ÁÔeñº[”"é‰Tÿ†3KõÄÅnGA9j$½¿ï6ek¸ÉìkØ£Š§Æ1[]ß–“@11ßwdžQ²cjƒu$“<—4ygÌ1¡‚P_ÌSƒôXo`jÕæŒ7¤¦†Pa¡¾Äjx±°f(_ûnf»²ÅyY !pÏøËÃ"Ð ËCa͈÷.Ø)|ô)Ç)l¥ ‹ù×¼ ‘»o‡‘ 1äó O<ÿ?̂ϥ*v ¨‡ü!Ò†ðÕb^/6·¼9Ž£Òp@[¶a5¤‹ÃÕ+V™zn"Š n«höÓsÃzRF"+ic©9.êB×À“¼Ïy{ž”*ñ_Õ™öxøÚ²!ÝñÀ(1ãšÑñO†³ÖÁÏÚâé.æƒ×”Ø$Ñ|ó¿…¸ýÐd×#ÿu(ã½?þœTU²…^V ½@³oØ|ÿy:ŠL@eô…ûf!§ƒ©Q#(æP €@R¨üXý‚&V¿º{Š™ú^,Òçùå&Ók±W •E8lKѹFÀĦo·íËzfz—3qFˆ/Õ„û¤è–/ÈœZ3ðk¡à·hmÛ´¬0+/¸VŒ3Y]ÙÊÀ]y¿ ;LÌ"Vâoœ¬óšR·ÐzJ¦xJÓà»ôFŒòà5XÍ}Aˆ«Zþ+9N\ô:ÈÍÞ Ñ~5‰0.i&à v#ÊtqÓŠ³½Ï¾®'ï)¢ÑDwÀk3µµˆ >úµ¦>xxÙXÒi’]¢š³üœó—#N+ELWŠûðñ{íƒ#ª#oº hü‡ð^hkn¸ñ çÄLÐwâß̧ʠ£Ž°ªBÒoü\Ì®DSM–ÚA«ZôiPŒ)š,ÿylö­ëÕ —ŠûñAõ`ù`…]#SÃ!;+‰pÜÐee I¨+• efñ=k94T*‘lljÅ¥¡ýkÃzœ©Ý 6¸WlT(n'Ã%Î9B÷î Pßûìz碦鶈ñ£ü¹ÔP/ävçPƒ×JëW¾™Ý’ß »y»ú3‰ñ‚8¶ü¤Ño9öý%dÔnÛȃíþ)F¿âE¯m 4kâ[`ÿ*lTD©î„Étö­º¸ÈuÁ ,7ç( gÖÊé#nº­³ç÷»®|¶bÚ”²Íî¾ÉÆk¿ËÅ9ÝAþ¤(ñG¶Sg½K‘Ä;ýfgÂÚõ1™ØÂ;õñ·¿ŽÜþÀš}ùpTµTSjNšr4ytVA Mš>­*ÉÂ*•D;½/2pâÖÑ5൱b¬:]]8†²&¥a}j Éï)°•–y©Îãof#m¤ ¿å¢$XÓ§6V©qtüæ¤/=h—,]±¶§ø/ç­—nx§/zÓâN‡VÒCX h±*šMÁ÷"eÔ€g§ð%–`”šµl¢ø†^ùU4à ¹YµŠÙ^a;lt(5ÆN¦prfð×@†bT[k"&̨ÃášÝl!±ªà²“{æÒPq¹/%ófY¾U|܇sÎ/qrÖ…âÝ÷D~ìoòˆCÅjAû…‰U[>:â8Ê.ÚyLè%¤ä©`j*•61ú % ©4[àiûaÙË-ùEŠüµ½ÑÀÕ~¹ _o&éó¨~¬TD?l_+7ôl >åÙ3#"£: &?[´_íi0±`·YÄôÔ/uj o@ztlÕÌÉcnT#¬ª™ôüëõe¨Y¹ÌU¾BëðØ!sJ•Èn\ã{©Vƒ±‚BE¢FáBÊ¿&ןÏês‹”)N¯Ùo"]ljùLH´a‹_®º:›…¨ãŒ]óQŰ'P^oÐÀ8)”&Àˆ&:Ñäwª¥FMQ¡bl¤)Ζ㠺"hÚÄDE˜Ý[ð2’À¯ªÀ´1÷f.Çúd{€†Ô&ûŠßa©¶¥Á{ô3‰¦QÃ:!\Ac¥·|[ñÙ|ÆåÉ„u“Qicï:by¹¼&ŸÁ ØUfç¤;Úâ%C–š Ÿ®òÐoþ[ƒÛï®»bцbМ„ùëóàW[ru÷ìˆÃK¥G±è]åü#¼ÓÆ.R¿$wŸžŒCTVXY}Z 5ƉZ䙦~U˜ˆI–M(˜¹é9Ï fÙ–Ë„ý$ú“MaVI3ÍtšÄqAOÊÉþ§shñÄ”Žåq!œáÀê È`„›—‡ÊCùç›D)¡8ÀºÆád|Åé_­ŸR Ó¨9ƒ‹Ä«ƒnøCõ<ïQøí˜Ýd<ŠUƒˆEd(r©§êùÄÇÛE‘?=·x6%Ì¡ÚHÁÁˆšwt¢ÖRKÛ"o9Y%/ :òß>¸M &H꽆4б˜ÎߣŶE)^/¡*…“€4I¸“Vàã¢!ÕD:üÀ 䇊IñÝâx Û˘> @øÀßÅÙÁa_c1òþé|›¼X9pmN| ¿”s Þ3Ãt`ø0ø9Hü\c¯i/±ò]q¸x±’Ðö[àBu K§Ðú:œoãVÚ9È–RG­‘‹ÅÖG¡(þ3íSèÓÇÊÐéqº&ŽÛÛ¿5´^ª*èÈ}’«ÆMó =t˜ý9~µ*OÕ…uÄ9¯Ç¬M5®úåù÷¼¬)Rù”±$±Jnr }¨NÀu£cûüáðº_‚ý+¥HÙѰf·Ä–&¶gèwŠþ®t´ˆ]+a‰ÓP½ß`;±êùÇ]ÄðOD½ -V•·âÉB3ö¸«ŠWÛØs$ÕŒ,0Q'ôÅ&ZGù×t"K›jR7±]€~bYÂüô¬.tT…°-¶-#c+î(ÿyK˜á?¾ãö!#•þ pã1ë /<Þ¦ÕKÄéӽÉʢáXÝ™¶—`·öدþ¦íš R¡ƒ÷#»ÄN‘û½ÌBGò÷S3Ü"Žý,¬ŠckÓP=G BÄÍÞÉéø£æÖ¼Òø‰ÒœóãÇñœJË´v=wr ˹â)ûˆ½%O·Ãµ7 Æ|` -žå™iw)´·ý)‘³'y›y]HróôÙxÃã ™œ|¬¹¢yûɺçÑZȾP‘UsÅÂGw®³~PÅÓg©'ìQ ÄÜ>ÿñSµp-ï,R|©gÁ*E¿¥ÉæÝÌŽÇOŠC‚B\Ð}×1æIÍ4¿+”n®jô&’T—÷‹¼MLÿR–.òŒ¯~²Ë8èTDÓÏÄÿ.Z’2[ÌL%Ô¨ØcÞÓîˆáP´¢€Žðm$QÝ®K‰Ð…“–‚ã¦ä¤U1 ¬ êöÁäçœö%½‰Ìýû#¶±É Ñzí(ßÕ ¾Ôb!ήԯ«”Ú¾+.ªèò|/Ç”|o^VjÞw«ùöÝ¤× }½½qŒ`K;r<™¢õoãgŒ:—„P"&iZ¦Ð2]¹±=ÛÌWÈ‹4…⇸&Ãúb¤‰éî­"›Y9{Vq%€‚[ö²ˆà r:éûd‰ õâŽY0¨8®Ú>8Ó.ÖQEZøgÉM(‹è*ê烱Uïüµü…KÝÁ÷òÑ;“ËéI¶µMs%¥\¿b÷X0O€Â[v4H_ÂvzbÈ,¬Cøo‘¨C!ÕÊ]ÍÏ–¿£ÞÞnÔ—Þ{zGTšxp:„¤‹Ô@ÅÙ`%©XxÙ1ŠvíeŽìM ÈÚ~"Kð¦ù~äu×ãf¤=hµJÅU‡ˆˆ| ìÞvÑ-€åùqÎË$PNã1t4ÃàÒÌ¥2†5IvÿUVë—ÿsuyi°\“ð¸ežöcÖ\ØG/#ÉíÂTмß8¼AĬŠ!úÇk ¡î=”œ$Ž6 H‡ü´¬øDpS±Kôj¯«·ƒ­‘ Ðâ7é â—¥+‹"«Xð[f+þ› põˆúqC‹t»šñ©î ËóòÅržoÀÀë6Å÷H«/ 3vÕ@4uP +—»ˆžÖm*±•!úŽ-éôÓ²º^ Ü{tÉÌlÎÌ4ÎÉ0ØU¡Šü` ý—þe&¹ÖŽ´çÛà·'ŠêûÍ=™c[Ö¹˜Yi?Ÿè™‡ädVÒ´õåWKrñD†*ž>U{˜ª#4¨°ô.!a6«öÜs á|ûõk—êèkõua‰óî¿Û·óçíMõuY„|*ý»!>~ËOŸÑ°øzUûI6âtnÏž¯½=rS¢•Ñ‘öï—c¼ Û•G Z¯áÏ×G‹ÌRjïÛ¹Ì.XûØM3”„‘„[Šºëey(È#Õ¸ö*­ã#&í>®Ê|Î>âåÇxû/®Šõ òïŠRVI.ŽtØ#d¸7— €Š\äxþ.ù+ Ç ¨þo(5d‘œjæûvXhlê I$úl .iu'³±Ñ2§ŸDëºy­ß™¸”2UÖ7»1å-f•‹ãŽÂdþRí2¤ùÙëZüòøâm¢»œÚÇͶLnÀÊbL‚“9dÐT sƒã—y)‡üyÏÀ[µ–7V9s˜«Mûit¯Ç¶ß»[Kw‹VL¯hèSPmuGâò´Ïh—­³BSŸ„@€ÇÝ„³7Êm-lÌ7mf=uçÓ¨[w-ÙÁŒ:—1»’×OŒJüµÏå> êžÊ­Ê¦}ýA˸±bXìÈM/+¿êQãí ”œŸ¡9Ðë¬"ZBÞuº˜ÄÊNÃí4=»UßÉöïoWZö¥qþEf—HW¦$‰"WÏ &q6WÛúP›Ä„«¹¸ ÙòØê­Œô1j!Þ¡ô挨­ðWŸ¨O_äÐÆ ©Q]GA¼ÖžîÐcQSAyöV•ŒÄãèÜìÓÙ ä³®§œñª½Àø½ÓÀÕÐtøøgúNÎ  }”°bå€=¬Àlª|ñÞºnC°T™¹„2°Übª\ Õ¼£¼£ÃÚbky(åKqë¤t;ú[dë&\ £È•¨{Ûqõ#("Ž&ª ‡9”DiÆãôfYCÍ<±Øï%YÀSi•—i·î?V͹zð×]Ë©3˜Qñò„éÍÆã,}D-H,K‡u­yc&Øœ¿þ–¸#§p:%³¯Ÿ+½ډ饒¬IʪUBUŸ|\•ä*ÇFMÞÁI—\8,jsÒ1gÈÛ*¶šÐÖRÐZ"u¾‰Ðà‰n¡É èJ©}ÞØ¶Š|eA8@Æ0Œ3V•±š`þ(M0ÀÄixe•,ˆO©4àÛÓ¦]&Ô—ø¨¦è@d7è»…âKP8ÐG\&ŠÉX.Åsñ ÕeyŒ00dÒŽôQ½údmpªr.…©”e6Pã¡o‹‚ ŸÄ¤}x¢¨âΆ …TÛ¤ÿ5×Qm_NXYÔ±š´þ‰IjIo-þƒƒ§³QìiWH“¬PÀ–QP1ÏQ<È9]¶Õ/|¹…¬-ÌÅuæ‹j®²{£vZ§øº÷jDp²™õ€¹f»°„8e¼ùøåcªm&Ò´ZˆqväF:OfòкOq¸/È`¯H£Ã¹@QåþlþžAˆ@Ñž¼2¿VÏR–Œ<6 6ÚµÛ¦ ÄÎxxW¥Ë¾5ì¥Ò7]=k5½vR­UÒZgìþ ë‰/ÇFèpT O€þ"—ÅÄ Íܲ¤ÎÁÌuð‹: p]ÀHóöz2¿i€‹Ê†ûK0gÄ>æŽë‚íìÉÙ5$…MùYÛ™]zñ–wÖ I•œ_RÊ"iMèQscõ;@«_6 FN:Î÷•ëCºjöW´½âŽBlÚŸ)QÀÃÕ­O×hf*÷ê qþlþnšPQ†a:ªÊ#:*.¥è#Xf»7Ž­;”•Êö‰¦3ˆbé‰aó”Ï7Bqºêa0U…=qGÖd¿‚!Ü^8² Â1€òûÒæ—šÌ—ˆ¬8¾N),Mr•"ø4½ô浚*“0iñ`ÖßóÞ^ûŠff¢zEõ;DgrÞeg‡fG]¾@%*Þ²Ùé¿e=8o½‹)íÓ,2‘(ß$í“gÓ V‡‰IäÿléáùÇ»ÿ0蕜_zW—#½ÞFlê5Mºê­õv€ªet“ ää…jž!°©,ø&}}ÝÖn˜‰ÚÉêsû¿d!°:¯s«Üýú&¥¢¯¯•Ô;¶:DÒùa¥#Îv¥Y`cœ¯>|¼x6 \-x›ÊŸzu¹ím*m®‰}Šø.qÔk{ã2ëDЍßw¬ÅFËã˨d"´ß{s`÷8Rö/ b~ÝhiØk„í|Ç&¢áÍùodoP»ñ̾ôy´*Q½ÈÅK¨”ê–#»¿aé}Q F#Q÷õ??ÀPƒîœ€¢›0ü±—ÊÆð¿”HÀF²,<9‹"Цpص¦‰—­ŸEî*úóÆ»I™ò ©ºFCí¡k€bÛC´(N£:Ù'mìÞ>ÁQ=@>ð >A’$í™ÚP}Ù8e„´4«Ú\ûž{]Ï=lgä ŽÂ²Õ{5ËùH&È¿…¸T8hþ} dpXìH3AÁ Ài¬Ñ=í)WŸM,îW“o{Æ`ÌÚèæ_nKPÝ*ea®˜ö7N[A„Ô×?¥#.ÐMOË“z¾B´+ÂcçÍ;™<NµìÂî6÷~çe''Š*¸Àáªn¦Ä=ë2x¡B†K+Α3¢Öã.h½òÜÕ+Þáööxþ¥»DM_Ø+.ù¯øa /GáÓjCB×§øq]ù‰ô‚+¢Ò:ŽÓÂmXèÏéodJБˆòÛY{r¿Í,œRt«048÷„Ýûä³eûä?ž„ðg54Í”H±|\ïˆìb?åŠý%DÃÁ²¬ÄOók:¬Ÿd?Ah÷Ë)GŠC¶¼!Ó9ŸEÒ;¨È Â5ks¨‘_æš ’?vØ>U€â¾†Zº×(ÛGä& ‚„œso]›I,Âèµiâ¦+5-@ÊI%©\1m*¥üX=·–:É?Ý©jyåŒó5ÅT%£™¶V2â gB¡‡ô·iž íZcl¤'W´JýákÂ*»®T?"#XÜÑMTé·ÖÕíY×añÆ›7‹=›…ºÚó9¶y[FÍâ5|ä†ÁGV:æÖ]eó~ €k…HZµu‰Elger+·…Ãv“’NÖ[¾îUå¹k»÷i’ÀÁ§Òø­Ë›Ù|>`ötúi_fá¾êv±}áï¼×»&§®ß+†#»w[ †Êÿf…G™j’N²!&¶ŒV4œXØìÙ–%’;Q 4¬ÿKÅQ˜W‚ŽÊÓáøÖ& Rä\QÇ'‘€ò]÷Œ ÷§Æ ¨6fo,í¤·¹h*eÈÙ ·tK Ù_*zš×®Gý£XÛ¡#‘÷F›½u! F,%_œŒOB ®”Ÿ°ÙGÛþë £—ásW¸b›œöu˜Æ–÷‡ò(¹û\€€—_Õ·kç¬5ä*1st…3îyÍR];Íø¯Zkinžë¹­ i)X˜ÔÿQX†{¬âÓé»0½&ðþ÷OBkÚcÃî´“æÏŠat¬»°sc… sÔg›Â·aôÆ °>B.âÝF·ÅEa~MÅü)ž l5€ø†^ùq ·°ØY)Î.Gã¡4¦¨IÊý^š›ä„gñÎd#ZtïË'ÄN¡`’[óMDâØPÒVÎàð€$§Ö’PŒÁœ³ÕT¦]¿"µÃYÛ9‰é{M]†',ÝN,ÆAJzÃ…œ“Ùãï”]7iÐáò‡û‰6ÈRÞ¬½ƒá6Fkô:6zÚ`­¾ŽJM£*;íëÍë®’”ÈÑòD9–8P ÝjEHkûé%Îåð«tÄ0ömÑCä·õð[ïÉ?ñ¢=Û%×ñm,SHˆÝëŠÆ”4è¼Ð½LŠƒ4=¢Ø3Ê.ú¬ þ¢º“ûmq9Waú © ñåv6ª‰‚ ßÃ["°í6b…¤dñá á¶ÌÉ´y—gÐ{»h„ BÖ×ò#Þ:“Î|ÜáæCð¢„X &„ªp½²É¥P£Êè‹xxMhk‰!ËD”½\ºÀÄ&¬ÖèD¦I-ŠQÇóG×ÿ ?ÁbËöË;´¥îé7”¾…ÑY—u$ÀïzÓë©Wó’Tâ× ãôª¾¬ãÿ,ys.g@W>{Z´_"DQÅà*‹`Á¯ßÏ«®‘]˜Ü:QY¼gÄùêw(=ÀÀï0ƒúRú/úPlËOcctñ=3*r°Ix¼ëÓåàÖ”meŽÈéþö÷0=¾$±¾ ûúçñéÂ¥"Å*YæHþ°#÷ó˜_…¡†àâBußšä÷¿E–ö Äz ’¥gÃ’ƒtøM¨3âÜÑíí!Q%í&4UÕ®*[;G `,çpfúùoH ÈeU½Îç%E’7<çÍã/O±üàAI§½?eJ9Ý#xüh÷tK¸­ÖJQ‡XÚóùc·è—užª2X¡tx×ðK¦û{›¾«H‚õŠäã¡Õmé>¦Z°‰™Púª*—t¿Ð\ò¥q„Žú%(ù¨fH:ðp‚›À¨ëÐÙ+²n4 ¾û®|‚ç•Oî«„åÀŸ‹Ž~ù¯È¯a-©5eµkìb†ºP¯?¹•CPÖ:ß-@¦‡Q\æ@õ~aãŒþ'ä‡ÊœXù»£øá@R/PŽKi[.EkBÖU˜?OÞ7-›Zþ,ùrºi[¢å|„M‰³õ3í¦Q…>€€Nø'Hó%¯>ÌÝ•àýFü{$ИSÛýݼ°í<í#´(9þ;c  Wcnóϰ÷zK–0”Ã{û޶þ'‘̱ɛ-[Ád’îÊÃoÓ̳A”ç*ú¨t²“;öÈ5Ÿ Ô,ÕƒÓ'7Ø~~aÍøÂÒ%ÁC–@÷İ’H)|àÌ!Ë’ªË ÒñöÓ»mö/Ùšˆµ™K¦3²¼ÆŸq·?ž*Í@H.þ2æ*AÓë75T‘ î˜Þ/«÷vèÜ?ñ4ìˆÂ¢m;É.#Œ”c˜|¨©×ÍmCð;§ä±Ü´Z?Ü6n‚¢Ôƒ'!o 5 ƒ±=“HŒRkõÙ¢îÕÈ^]é dc‰Å™)äZ+½!3÷ J ¯òÓG/¨ÊþàššÙÅ:ªlÁøüŨÛú?Ÿ o-ƒæ#ñq¬¬nA‰†N\(Ä«áõÏ‘*asÝ ¶”¶täØå4:"ö…æ QÌ/èGÏ?ߦK~æ»rg{Ô¥Hv®†&—Äéè³¢X~HQø’;Å׃<.EÎê™a ²aøÍBt¬Ü”@Ý‹üØŠ$A(¼³¡úêc(7÷?߯Ìý§ÙLŽ÷Ãü0_ ~ÕéÉÔqX43 i‘Ó®\X¤J“žØüï¢ì\ü×Pë:’Qy¿MAMÝ)­‹Hnê“Ô²l%2&û)n¸hÊ6óöRîìγ ÌòO5¢·®:Sý+<\=–0n4&UE%7­' #ÄØZžf ö½X+„ô€9¬sÛ3ÂÖ®³öYÚ=k÷õ V@F$C.À‹Š¢î*Ý”îò÷sï áý= JÓTÖÁÄAïJ¯‘ú¤ãŠ³Õ žïöéT{°ßÆ› øõv¼QQ.ˆ“« •7-Ÿú:²µûnJ€öP¬‡âB,‹g°l…Øê·Ý±Ÿ¦äk/¶yúP$ÍD¡Œ‹q:öÉžö`’ P(„m7K ˆi›tGÖý^ò(¯ýÛäýâ$?;¥WE9ßtpOÓãÿFlãÃLd´¢)¤Œ™‹Çø†2ÒE8šòú®dwTÄ-0OY¬Ïà{Yg¡I÷:Ò6id4-õp™üƒbxcÅhŽÆ6W…‰ppÂpŸ4uÊ^R©Y>Ú4'&O …X+;{G\§dǵ·ûTX®ž¹Æsõ~/MÑ1(™²&(N—ÿ²¯G£LPσð­ºù¾o›æù¾o›æùûU ôÿq /<1GLüa†ÿw0öÐe˜ç{!Ò0·óÙd­éüÇ壜i1Ï÷Áu¬þÀÁ»dƒˆL%ÉSJn¿/I ro:õ9èTŽi!Ûôý 0–Ú×€©îά,T1kÿŸ^>ll ià_Wfí1§†¹£®Rò—”¼¥å/)yKÊ^RòLË]ÑlÕV1t”½þ–ÕÊ;·kËèðBß)Ù™ÿ + {ñín:AP ɹÙRÌõŸHgŽP{¿×$ÎÀí[jH(ød¨RØqµ¸8í~×^xÔ¡¢»ïZ°{nžþX»³ ‹ÙmŒ…`¡sîèEáÿ~(¬Ùu~ØÐøÉ×'´’`!e|d¤óŸc ¢ Aîè™hs¿˜H`gTÃ9/:r‹¬¡„˜¹¡X‡å—ø#Ì¿8¦²IR²$ø¬l:‹Uø½=¢p”®(ÈÃ%@ÅT¥y›fá’ÝwŒ÷9ºc“’éø=ÐC_SMï‰éZu† ?H.ˆ;Ï&ˆ ßÖø¯]íÒñ?<ª÷åhásØKª®O¿rú²×da’ îÛŽìæ}÷µ?1 vg?8:ž|†úÐ $zTçH„:$†Ó¡¶ØÅ´L--ÞÜ«1/§ÆF²‹Ùß=ù¥4×-¡Sȸ¤© ÏŽÈÃ%@±(†oÞž Ñ ðO„ DM™æ{êKqçôв98ï|ÃGÙMÆ+)ƒ†@‚pP¥{4ôƒ>Ÿ^­ãd}¹‰NóUÀç×–ø+¼"nkÓ¦›#…=ÿB;Âä†'`øÌùñü.̤*žößÊc™U~±ÌzÌm |÷AÕÄ7I²HÔ"ßq2WÆ}†ÎÒ¨!JáÎŽÄùv„ÿ6&…*¹>A÷6M´¶…ëtDæšC§yøu|Œ¶‹ófi·i÷º™~å8îݨ’Á“ví5ZʽM¦­Ý@Ü»ÿÙicnV Bþffgtkwave-3.3.86/contrib/bundle_for_osx/gtk_diff_against_modulesets_2.patch0000664000175000017500000000175013166335473026250 0ustar bybellbybell--- gtk+/gdk/quartz/gdkimage-quartz.c 2011-12-03 14:24:03.000000000 -0600 +++ gtk+664894/gdk/quartz/gdkimage-quartz.c 2013-10-15 18:52:24.000000000 -0500 @@ -150,6 +150,10 @@ _gdk_quartz_image_copy_to_image (GdkDraw data = [rep bitmapData]; size = [rep size]; + int bpr = [rep bytesPerRow]; + int wid = size.width; + int bpx = bpr/wid; + for (y = 0; y < size.height; y++) { guchar *src = data + y * [rep bytesPerRow]; @@ -158,12 +162,15 @@ _gdk_quartz_image_copy_to_image (GdkDraw { gint32 pixel; + if (bpx == 4) // fix gdk_pixbuf_get_from_drawable "yellow stripes" + pixel = src[0] << 16 | src[1] << 8 | src[2]; + else if (image->byte_order == GDK_LSB_FIRST) pixel = src[0] << 8 | src[1] << 16 |src[2] << 24; else pixel = src[0] << 16 | src[1] << 8 |src[2]; - src += 3; + src += bpx; gdk_image_put_pixel (image, dest_x + x, dest_y + y, pixel); } gtkwave-3.3.86/contrib/bundle_for_osx/gtk_diff_against_modulesets_3.patch0000664000175000017500000000275713166335473026261 0ustar bybellbybell--- gtk+/gdk/quartz/gdkevents-quartz.c 2014-02-10 09:30:41.000000000 -0600 +++ gtk+664894/gdk/quartz/gdkevents-quartz.c 2014-02-10 09:40:34.000000000 -0600 @@ -381,7 +381,7 @@ get_event_mask_from_ns_event (NSEvent *n return 0; } -static void +static int get_window_point_from_screen_point (GdkWindow *window, NSPoint screen_point, gint *x, @@ -390,14 +390,29 @@ get_window_point_from_screen_point (GdkW NSPoint point; NSWindow *nswindow; GdkWindowObject *private; + GdkWindowImplQuartz *gwiq; private = (GdkWindowObject *)window; - nswindow = ((GdkWindowImplQuartz *)private->impl)->toplevel; - - point = [nswindow convertScreenToBase:screen_point]; + if(private) + { + gwiq = (GdkWindowImplQuartz *)private->impl; + if(gwiq) + { + nswindow = gwiq->toplevel; + + if(nswindow) + { + point = [nswindow convertScreenToBase:screen_point]; + + *x = point.x; + *y = private->height - point.y; + + return(1); + } + } + } - *x = point.x; - *y = private->height - point.y; +return(0); } static GdkWindow * @@ -592,7 +607,12 @@ find_toplevel_under_pointer (GdkDisplay toplevel = display->pointer_info.toplevel_under_pointer; if (toplevel && WINDOW_IS_TOPLEVEL (toplevel)) - get_window_point_from_screen_point (toplevel, screen_point, x, y); + { + if(!get_window_point_from_screen_point (toplevel, screen_point, x, y)) + { + toplevel = NULL; + } + } return toplevel; } gtkwave-3.3.86/contrib/bundle_for_osx/Makefile.am0000664000175000017500000000050113166335473021304 0ustar bybellbybell## -*- makefile ## EXTRA_DIST= \ gtk_diff_against_modulesets.patch \ gtk_diff_against_modulesets_2.patch \ gtk_diff_against_modulesets_3.patch \ gtkrc \ gtkwaverc \ gtkwave.bundle \ gtkwave_files.icns \ gtkwave.icns \ gtkwave.pl \ gtkwave_savefiles.icns \ Info-gtkwave.plist \ launcher.sh \ make_bundle.sh gtkwave-3.3.86/contrib/bundle_for_osx/launcher.sh0000775000175000017500000001362513166335473021423 0ustar bybellbybell#!/bin/sh if test "x$IGE_DEBUG_LAUNCHER" != x; then set -x fi if test "x$IGE_DEBUG_GDB" != x; then EXEC="gdb --args" else EXEC=exec fi name="`basename $0`" tmp="`pwd`/$0" tmp=`dirname "$tmp"` tmp=`dirname "$tmp"` bundle=`dirname "$tmp"` bundle_contents="$bundle"/Contents bundle_res="$bundle_contents"/Resources bundle_lib="$bundle_res"/lib bundle_bin="$bundle_res"/bin bundle_data="$bundle_res"/share bundle_etc="$bundle_res"/etc export DYLD_LIBRARY_PATH="$bundle_lib" export XDG_CONFIG_DIRS="$bundle_etc"/xdg export XDG_DATA_DIRS="$bundle_data" export GTK_DATA_PREFIX="$bundle_res" export GTK_EXE_PREFIX="$bundle_res" export GTK_PATH="$bundle_res" export GTK2_RC_FILES="$bundle_etc/gtk-2.0/gtkrc" export GTK_IM_MODULE_FILE="$bundle_etc/gtk-2.0/gtk.immodules" export GDK_PIXBUF_MODULE_FILE="$bundle_etc/gtk-2.0/gdk-pixbuf.loaders" export PANGO_RC_FILE="$bundle_etc/pango/pangorc" APP=name I18NDIR="$bundle_data/locale" # Set the locale-related variables appropriately: unset LANG LC_MESSAGES LC_MONETARY LC_COLLATE # Has a language ordering been set? # If so, set LC_MESSAGES and LANG accordingly; otherwise skip it. # First step uses sed to clean off the quotes and commas, to change - to _, and change the names for the chinese scripts from "Hans" to CN and "Hant" to TW. APPLELANGUAGES=`defaults read .GlobalPreferences AppleLanguages | sed -En -e 's/\-/_/' -e 's/Hant/TW/' -e 's/Hans/CN/' -e 's/[[:space:]]*\"?([[:alnum:]_]+)\"?,?/\1/p' ` if test "$APPLELANGUAGES"; then # A language ordering exists. # Test, item per item, to see whether there is an corresponding locale. for L in $APPLELANGUAGES; do #test for exact matches: if test -f "$I18NDIR/${L}/LC_MESSAGES/$APP.mo"; then export LANG=$L break fi #This is a special case, because often the original strings are in US #English and there is no translation file. if test "x$L" == "xen_US"; then export LANG=$L break fi #OK, now test for just the first two letters: if test -f "$I18NDIR/${L:0:2}/LC_MESSAGES/$APP.mo"; then export LANG=${L:0:2} break fi #Same thing, but checking for any english variant. if test "x${L:0:2}" == "xen"; then export LANG=$L break fi; done fi unset APPLELANGUAGES L # If we didn't get a language from the language list, try the Collation preference, in case it's the only setting that exists. APPLECOLLATION=`defaults read .GlobalPreferences AppleCollationOrder` if test -z ${LANG} -a -n $APPLECOLLATION; then if test -f "$I18NDIR/${APPLECOLLATION:0:2}/LC_MESSAGES/$APP.mo"; then export LANG=${APPLECOLLATION:0:2} fi fi if test ! -z $APPLECOLLATION; then export LC_COLLATE=$APPLECOLLATION fi unset APPLECOLLATION # Continue by attempting to find the Locale preference. APPLELOCALE=`defaults read .GlobalPreferences AppleLocale` if test -f "$I18NDIR/${APPLELOCALE:0:5}/LC_MESSAGES/$APP.mo"; then if test -z $LANG; then export LANG="${APPLELOCALE:0:5}" fi elif test -z $LANG -a -f "$I18NDIR/${APPLELOCALE:0:2}/LC_MESSAGES/$APP.mo"; then export LANG="${APPLELOCALE:0:2}" fi #Next we need to set LC_MESSAGES. If at all possilbe, we want a full #5-character locale to avoid the "Locale not supported by C library" #warning from Gtk -- even though Gtk will translate with a #two-character code. if test -n $LANG; then #If the language code matches the applelocale, then that's the message #locale; otherwise, if it's longer than two characters, then it's #probably a good message locale and we'll go with it. if test $LANG == ${APPLELOCALE:0:5} -o $LANG != ${LANG:0:2}; then export LC_MESSAGES=$LANG #Next try if the Applelocale is longer than 2 chars and the language #bit matches $LANG elif test $LANG == ${APPLELOCALE:0:2} -a $APPLELOCALE > ${APPLELOCALE:0:2}; then export LC_MESSAGES=${APPLELOCALE:0:5} #Fail. Get a list of the locales in $PREFIX/share/locale that match #our two letter language code and pick the first one, special casing #english to set en_US elif test $LANG == "en"; then export LC_MESSAGES="en_US" else LOC=`find $PREFIX/share/locale -name $LANG???` for L in $LOC; do export LC_MESSAGES=$L done fi else #All efforts have failed, so default to US english export LANG="en_US" export LC_MESSAGES="en_US" fi CURRENCY=`echo $APPLELOCALE | sed -En 's/.*currency=([[:alpha:]]+).*/\1/p'` if test "x$CURRENCY" != "x"; then #The user has set a special currency. Gtk doesn't install LC_MONETARY files, but Apple does in /usr/share/locale, so we're going to look there for a locale to set LC_CURRENCY to. if test -f /usr/local/share/$LC_MESSAGES/LC_MONETARY; then if test -a `cat /usr/local/share/$LC_MESSAGES/LC_MONETARY` == $CURRENCY; then export LC_MONETARY=$LC_MESSAGES fi fi if test -z "$LC_MONETARY"; then FILES=`find /usr/share/locale -name LC_MONETARY -exec grep -H $CURRENCY {} \;` if test -n "$FILES"; then export LC_MONETARY=`echo $FILES | sed -En 's%/usr/share/locale/([[:alpha:]_]+)/LC_MONETARY.*%\1%p'` fi fi fi #No currency value means that the AppleLocale governs: if test -z "$LC_MONETARY"; then LC_MONETARY=${APPLELOCALE:0:5} fi #For Gtk, which only looks at LC_ALL: export LC_ALL=$LC_MESSAGES unset APPLELOCALE FILES LOC if test -f "$bundle_lib/charset.alias"; then export CHARSETALIASDIR="$bundle_lib" fi # Extra arguments can be added in environment.sh. EXTRA_ARGS= if test -f "$bundle_res/environment.sh"; then source "$bundle_res/environment.sh" fi # Strip out the argument added by the OS. if [ x`echo "x$1" | sed -e "s/^x-psn_.*//"` == x ]; then shift 1 fi # export DLYD_INSERT_LIBRARIES=/usr/lib/libMallocDebug.A.dylib # export MallocScribble=YES # export MallocPreScribble=YES # export MallocGuardEdges=YES # export MallocStackLogging=YES # export MallocStackLoggingNoCompact=YES # export NSZombieEnabled=YES # export MallocErrorAbort=YES # export MallocCheckHeapEach=100 # export MallocCheckHeapStart=100 $EXEC "$bundle_contents/MacOS/$name-bin" $* $EXTRA_ARGS gtkwave-3.3.86/contrib/bundle_for_osx/gtkrc0000664000175000017500000000006713166335473020314 0ustar bybellbybellgtk-icon-theme-name = "Tango" gtk-enable-mnemonics = 0 gtkwave-3.3.86/contrib/bundle_for_osx/make_bundle.sh0000775000175000017500000000560513166335473022067 0ustar bybellbybell#!/bin/sh if [ -f ./gtkwave.pdf ] then echo Skipping download of gtkwave.pdf else echo Downloading gtkwave.pdf... curl http://gtkwave.sourceforge.net/gtkwave.pdf >gtkwave.pdf fi gcc -o ../../examples/transaction ../../examples/transaction.c -DHAVE_INTTYPES_H # # this assumes that gtkwave --prefix is the # same directory hierarchy that gtkwave via # jhbuild is installed to # # make sure you are in jhbuild-shell and # that jhbuild is in your path # # ~/.local/bin/ige-mac-bundler gtkwave.bundle ~/.local/bin/gtk-mac-bundler gtkwave.bundle # # this is a bit of a hack as it seems ige-mac-bundler # should already do this... # gdk-pixbuf-query-loaders | \ sed 's#/Users/.*loaders/#@executable_path/../Resources/lib/gdk-pixbuf-2.0/loaders/#' \ > ~/Desktop/gtkwave.app/Contents/Resources/etc/gtk-2.0/gdk-pixbuf.loaders # # code that might need to be added to the installer # # defaults write com.apple.LaunchServices LSHandlers -array-add "LSHandlerContentTag vcdLSHandlerContentTagClass public.filename-extensionLSHandlerRoleAll com.geda.gtkwave" # defaults write com.apple.LaunchServices LSHandlers -array-add "LSHandlerContentTag evcdLSHandlerContentTagClass public.filename-extensionLSHandlerRoleAll com.geda.gtkwave" # defaults write com.apple.LaunchServices LSHandlers -array-add "LSHandlerContentTag lxtLSHandlerContentTagClass public.filename-extensionLSHandlerRoleAll com.geda.gtkwave" # defaults write com.apple.LaunchServices LSHandlers -array-add "LSHandlerContentTag lx2LSHandlerContentTagClass public.filename-extensionLSHandlerRoleAll com.geda.gtkwave" # defaults write com.apple.LaunchServices LSHandlers -array-add "LSHandlerContentTag vztLSHandlerContentTagClass public.filename-extensionLSHandlerRoleAll com.geda.gtkwave" # defaults write com.apple.LaunchServices LSHandlers -array-add "LSHandlerContentTag ghwLSHandlerContentTagClass public.filename-extensionLSHandlerRoleAll com.geda.gtkwave" # defaults write com.apple.LaunchServices LSHandlers -array-add "LSHandlerContentTag fstLSHandlerContentTagClass public.filename-extensionLSHandlerRoleAll com.geda.gtkwave" # /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -kill -domain local -domain system -domain user gtkwave-3.3.86/contrib/bundle_for_osx/gtkwave.bundle0000664000175000017500000002361113166335473022122 0ustar bybellbybell ${env:JHBUILD_PREFIX} ${env:HOME}/Desktop ${project}/launcher.sh gtk+-2.0 ${project}/Info-gtkwave.plist ${prefix}/bin/gtkwave ${prefix}/bin/twinwave ${prefix}/bin/evcd2vcd ${prefix}/bin/fst2vcd ${prefix}/bin/vcd2fst ${prefix}/bin/ghwdump ${prefix}/bin/lxt2miner ${prefix}/bin/lxt2vcd ${prefix}/bin/shmidcat ${prefix}/bin/vcd2lxt ${prefix}/bin/vcd2lxt2 ${prefix}/bin/vcd2vzt ${prefix}/bin/vzt2vcd ${prefix}/bin/vztminer ${prefix}/bin/fstminer ${prefix}/bin/rtlbrowse ${prefix}/bin/vermin ${project}/gtkwave_bin_launcher.sh ${prefix}/lib/${gtkdir}/modules/*.so ${prefix}/lib/gdk-pixbuf-2.0/* ${prefix}/lib/gtk-2.0/* ${prefix}/lib/${gtkdir}/${pkg:${gtk}:gtk_binary_version}/engines/*.so ${prefix}/share/locale ${prefix}/share/themes ${project}/gtkwave.icns ${project}/gtkwave_files.icns ${project}/gtkwave_savefiles.icns ${project}/gtkrc ${project}/gtkwave.pl ${project}/../../man/evcd2vcd.1 ${project}/../../man/fst2vcd.1 ${project}/../../man/ghwdump.1 ${project}/../../man/gtkwave.1 ${project}/../../man/gtkwaverc.5 ${project}/../../man/lxt2miner.1 ${project}/../../man/lxt2vcd.1 ${project}/../../man/rtlbrowse.1 ${project}/../../man/shmidcat.1 ${project}/../../man/twinwave.1 ${project}/../../man/vcd2fst.1 ${project}/../../man/vcd2lxt.1 ${project}/../../man/vcd2lxt2.1 ${project}/../../man/vcd2vzt.1 ${project}/../../man/vermin.1 ${project}/../../man/vzt2vcd.1 ${project}/../../man/vztminer.1 ${project}/../../man/fstminer.1 ${project}/../../doc/gtkwave.odt ${project}/gtkwave.pdf ${project}/../../LICENSE.TXT ${project}/../../COPYING ${project}/../../examples/des.fst ${project}/../../examples/des.gtkw ${project}/../../examples/gtkwaverc ${project}/../../examples/transaction.fst ${project}/../../examples/transaction.gtkw ${project}/../../examples/transaction.c ${project}/../../examples/transaction ${project}/gtkwaverc ${project}/gtk_diff_against_modulesets.patch ${project}/gtk_diff_against_modulesets_2.patch gtkwave-3.3.86/contrib/bundle_for_osx/Makefile.in0000664000175000017500000003131113166335473021320 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = contrib/bundle_for_osx DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ gtk_diff_against_modulesets.patch \ gtk_diff_against_modulesets_2.patch \ gtk_diff_against_modulesets_3.patch \ gtkrc \ gtkwaverc \ gtkwave.bundle \ gtkwave_files.icns \ gtkwave.icns \ gtkwave.pl \ gtkwave_savefiles.icns \ Info-gtkwave.plist \ launcher.sh \ make_bundle.sh all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/bundle_for_osx/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/bundle_for_osx/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/contrib/bundle_for_osx/gtkwave.pl0000775000175000017500000000607713166335473021276 0ustar bybellbybell#!/usr/bin/perl use Switch; # perl-based launcher for gtkwave app: # this more-or-less duplicates "normal" command line functionality # missing: stdin/stdout, controlling terminal (ctrl-c/-x) # 06dec11ajb # directly cut and paste from main.c for gtkwave: static struct option long_options[] # with { } from the c code turned into [ ] $long_options= [ ["dump", 1, 0, 'f'], ["fastload", 0, 0, 'F'], ["optimize", 0, 0, 'o'], ["nocli", 1, 0, 'n'], ["save", 1, 0, 'a'], ["autosavename", 0, 0, 'A'], ["rcfile", 1, 0, 'r'], ["defaultskip", 0, 0, 'd'], ["logfile", 1, 0, 'l'], ["start", 1, 0, 's'], ["end", 1, 0, 'e'], ["cpus", 1, 0, 'c'], ["stems", 1, 0, 't'], ["nowm", 0, 0, 'N'], ["script", 1, 0, 'S'], ["vcd", 0, 0, 'v'], ["version", 0, 0, 'V'], ["help", 0, 0, 'h'], ["exit", 0, 0, 'x'], ["xid", 1, 0, 'X'], ["nomenus", 0, 0, 'M'], ["dualid", 1, 0, 'D'], ["interactive", 0, 0, 'I'], ["giga", 0, 0, 'g'], ["comphier", 0, 0, 'C'], ["legacy", 0, 0, 'L'], ["tcl_init", 1, 0, 'T'], ["wish", 0, 0, 'W'], ["repscript", 1, 0, 'R'], ["repperiod", 1, 0, 'P'], ["output", 1, 0, 'O' ], ["slider-zoom", 0, 0, 'z'], ["rpc", 1, 0, '1' ], ["chdir", 1, 0, '2'], ]; $long_options_size = scalar(@$long_options); for($i=0;$i<$long_options_size;$i=$i+1) { $long_flag{$long_options->[$i][0]} = $long_options->[$i][1]; $short_flag{$long_options->[$i][3]} = $long_options->[$i][1]; } $arg_cnt = scalar(@ARGV); $non_flags_cnt = 0; $flags_cnt = 0; for($i=0 ; $i < $arg_cnt ; $i=$i+1) { $arg = $ARGV[$i]; if(substr($arg, 0, 1) eq "-") { if(substr($arg, 1, 1) eq "-") { # -- flags $fsiz = $long_flag{substr($arg, 2)}; } else { # - flags $flc = substr($arg, 1, 1); $fsiz = $short_flag{$flc}; } if($fsiz == 1) { $flags[$flags_cnt] = $arg; $flags_cnt = $flags_cnt + 1; $i = $i + 1; $arg = $ARGV[$i]; $flags[$flags_cnt] = $arg; $flags_cnt = $flags_cnt + 1; } else { $flags[$flags_cnt] = $arg; $flags_cnt = $flags_cnt + 1; } } else { switch($non_flags_cnt) { case 0 { $non_flags[$non_flags_cnt] = "--dump"; $non_flags_cnt = $non_flags_cnt + 1; } case 2 { $non_flags[$non_flags_cnt] = "--save"; $non_flags_cnt = $non_flags_cnt + 1; } case 4 { $non_flags[$non_flags_cnt] = "--rcfile"; $non_flags_cnt = $non_flags_cnt + 1; } } $non_flags[$non_flags_cnt] = $arg; $non_flags_cnt = $non_flags_cnt + 1; } } chomp($cwd=`pwd`); $ENV{GTKWAVE_CHDIR}=$cwd; @pfx = split(' ', "open -n -W -a gtkwave --args --chdir dummy"); @everything = (@pfx,@non_flags,@flags); exec(@everything); gtkwave-3.3.86/contrib/bundle_for_osx/gtkwave_files.icns0000664000175000017500000021357113166335473022775 0ustar bybellbybellicnsyis32Ù]YZVTRPMLHJYÿì÷ô€õô÷íþLTèÒÔÄÉÈÊËÍÊíHUôàÝÇÌËÌÊËËøISðÝÙÃÈÆÈÌÎÌõHQìÞâÑ××Ýëìå÷HNòßäâäàááèÞöGOîîz"7TZA+BðGMëïr&JB €¦ÁÈõðòðôóÿÇ?W ˜ w^Áÿ÷íåçåè€ç%ääéíîêëâ±ÊW'JB "‹’XCJ ƒ:J6‚“h'JB €¦ÁÈõðòñôóÿÇ?W ˜4v]Áÿ÷íåèëãéêæåäéíîéëâ±ÊW'JB M’‹,DJ„9L2b’„&JB €¦ÁÈõðòñõóÿÇ?W ˜5u\Áÿ÷íåæ»«ºáèååéîîéìâ²ÊX'JB s“{ EI ƒ:L2;‘>'JB €¦ÁÈöñòñõóÿÇ?W ˜4t[Àÿøëëʤ¹Ññâæéîîéìâ±ÊW'JB "Š’RFI„9L3€“g&JB €¥ÁÈöñóñõóÿÇ?W ˜5sZÀÿøìêŸÝÜØùãåéîîéìá³Çj,%(&(%8GD,$+[F (-FG5$(&„'@H>%*!p…3#)$8GD,&'((«ÀÈöñóñõóÿÇ?W ˜rY¿ÿ÷íçß¾×Ýñùãåéîîéìá´Ä{ANHJGEEIJJKŽKJJIEEH‡JFEFILEbŒiELIHEEI‚JKJ¯ÀÉöòóòõóÿÇ?W ˜rY¿ÿöîåéãäõýëåäêîîéìá´Åw8F@C€BDEEBC>Q‰Žp=DACEEC‡BDEDAC@L†Žv>DADEEƒBCB®ÀÊöñóòöóÿÇ?W ˜5qW¿ÿöîåçèìíèçåäêîîéìâ²É\ +IC Q’Œ/EI% ƒ  ;J7 e’†*JC €  ¨ÂÉ÷ñóòöóÿÇ?W ˜4pV¾ÿöîåèçææéèåäêîîéìâ±ÊW'JB q’zEI„9K49;$KB €¦ÂÉ÷òóòöóÿÇ?W ˜ oV¾ÿöîåèè€é&èååêîîéìâ±ÊX'KA$Š’VEI ƒ9K4‚“h%JB €§ÂÉ÷òôòöóÿÇ?W ˜ nU¾ÿöîåè&éèååêîîêíâ±ËW'K@N‘+EI„9K4d“‚(IC €§ÂÉ÷òôòöóÿÇ?W ˜ nT½ÿöîåè&éèååêîîêíâ±ËW'JB t’zEI„9K4:A+HC €§ÂÉ÷òôóöóÿÇ@W ˜ mS½ÿõîåè&éèååêîîêíâ±ËW'IE‹‘VEI„9K4‚‘j)IC €§ÂÉøòôóöóÿÇ@W ˜ lR½ÿõîåè&éèååêîîêíâ±ËW'HGJ’Œ+EI„9K4d‘†!LA €§ÂÉøòôó÷óÿÇ@W ˜ kQ¼ÿõîåè'éèååêîîêíâ²ËX'JC q”yEI ƒ9K4:“9O@ €§ÂÉùóôó÷óÿÇ@W ˜ jQ¼ÿõîå€è&ééèååêîîêíá´Æs/>7:998?H@N‰k3<89988†9CFB9 :7C„t=GD;‚9:9®ÁÊøóôó÷óÿÇ@W ˜ jP¼ÿõîå€èééèæåêîîêíáµÅ|BOJMLLMGG?lŽŒ^GMJ€KIEEH‡KFDFK JMGyŽˆPBFJLKLK°ÁÊøôõó÷óÿÇ@W ˜ iO»ÿõîæ€èééèæåêîîêíá´Çq)913231F42354®ÂÊøôõó÷óÿÇ@W ˜ hN»ÿõîæ€è'ééèæåêîîêíâ²ËW*HT‰“VEI„9K4€„xCH §ÃÉøóõó÷óÿÇ@W ˜ gM»ÿõîæ€è(ééèæåêîîêíâ²ËX%>hŽ*EI ƒ(9K4d’†L; ¨ÃÊøóõó÷óÿÇ@W ˜ fLºÿõîæ€èééèæåêîîêíâ²ËVNJNI^n{‚EI„(9K48“ˆxiQKKN<§ÃÊøóöó÷óÿÇ@W ˜ eK¹ÿôîæ€è(ééèæåêîîêíâ²ËVtž’–•‘’‡”VEI ƒ(:K4‡ŠŽ‘”•—¡7¥ÄÊùóöó÷óÿÇ@W ˜ dK¹ÿôîæ€èééèæåêîïêìã²ËVK‰€„‚„ˆ…Ž&DH„8J3‚_ƒ‡€‚~¦ÄÊùóöô÷óÿÇ@W ˜ dJ¹ÿôîæ€èééèæåêîïêíâ³ËY :WP!ƒ HL#ƒ=N7ƒ :VQ$¨ÃÊùóöô÷óÿÇ@W ˜ cI¹ÿôîæ€èééèæåêîïêìã²ËW!A9 ‚?C„3D.ƒ A9 €§ÃÊùóöô÷óÿÇ@W ˜ bH¸ÿôîæ€èééèæåêîïêíá³Æo#3+103-Le_8-0/ .0,;adF+1.ƒ/0YeU-0/0/1-Me`:0320.00­ÁÊøóöó÷óÿÇ@W ˜ aG¸ÿôîæ€èééèæåêîîêí໽ÁÆÅÅÄ€ÅÃÂÂÅ„ÇÈÈÇÄÄÆÈ„ÉÊÊÇÇÈÊÊ…ËÈÇÇɃÊÉÄ¿Î÷ôõó÷óÿÇ@W ˜ `F¸ÿôîæ€è ééèæåêîïêîÞ´¸´³€´µ¶¶´„µ€¶··¶¶·€¶··¹¹¸··…¸¹ºº€¹¸¸··¶½¹É÷ôöó÷óÿÇ@W ˜ _F·ÿôîæ€è ééèæåêîîëìæÕÖרƒÙÚÛ†ÜÝÞßà€ß€à„á€à€á‚àßÝãöôõó÷óÿÇ@W ˜ _E·ÿôîæ€èééèæåêîîìëìððïï€ð€ñò„óõ€ö÷€øùúûˆüûúø€õ ó÷óÿÇ@W˜ ^D·ÿôîå€è ééèæåêîîëëêé€êë€ìí€îï€ðñ€òóô‚õ†ö‚õô óõõôó÷óÿÇ@W˜ ]C¶ÿôîå€èééèååêîî€ëì€íî€ïð€ñòó€ôõö÷ƒø‚ùƒø÷ööõõôó÷óÿÇ@W˜ \B¶ÿôîåèéèååêîîë€ìíî€ïð€ñòó€ôõ‚öŒ÷ö‚õ ôó÷óÿÇ@W˜ [B¶ÿôîåèéèååêïîëì€íî€ïð€ñòóôõ‚öŠ÷‚öõ ôôó÷óÿÇ@V˜ [Aµÿôîåèéèååêîîëì€íî€ïðñò€óô‚õ‚ö‡÷ƒöõ€ô óöóÿÇ@V˜ Y?µÿôîåèéèååêîîëì€íîï€ðñòóô‚õ„ö‚÷„ö‚õ€ô óöóÿÇ@V˜ X?´ÿóîåèéèååêîî‚ë€ìí€îïðñò€ó‚ô‚õŽö‚õô óöóÿÇ@V˜ W>´ÿòíåèéèååêîî‚ë€ìíî€ïðñòó‚ôƒõŠöƒõ‚ô òöóÿÇ@V˜ W=´ÿôîåèéèååëðïëê€ë€ìíî€ïðñòóô‚õ„ö†÷„ö‚õ ôó÷ôÿÇ?W˜ V=³ÿñöò‚óòïïòôô‚óôŽõ‚öõõ†öõõ‚öƒõ ô÷òÿÆ@V˜ V<¬ÿöÿüýÍü ûÿöÿÂ>W˜ NFbÔéçªèžé€èéÞoCR™2VBEPOÐPOQHAU9œ8TTÔQSU=ž-Ô0.ŸØ Öÿÿÿÿÿ…ÿÿÿÿ‰›ÿÚ¡«ƒ¢ÖŸ%$‚%†&%$‚#"‚! ‚‚€‚‚‚€ 9ˆŸ¤£¤¥¦§¨¨©ªN©©¨§¦¥¥¤£¢¡  Ÿžœ›š™˜˜—–•”“’‘ŽŒ‹Š‰‡††…„ƒ‚€~}|{zyyxvvutsrqpoonmlkjiifV'™?¦™Ž‘’’“”•––€—O–•”““’‘ŽŽŒ‹Š‰ˆ‡…„„ƒ‚€~}||{zyxwvvtssrqpomlkkjihgfeddcba`_^]\[ZZYXWVUSSR^g-™ Ž—’ÆßÝ€Þßß…à€ßÞހ݀܀ۀÚÙØ€×Ö€Õ€ÔӀҀрÐÏÎ̀̀ˀÊÉÈ ÇÇÆÉ¯_Y^– * ŒÂÿüÿþÎÿ þÿúÿ²Og"– ,£ŠÓÿ÷ûøùŒø„÷…ö‹õ‹ô‚ó òõïþÍPg'– ,¢ŠÒÿýéßâà‚áàåééã€â„ã…äˆå‘æç‰æ„ç æëöÿÊPg&– ,¢ŠÓÿûåÚÝÛ€ÝÜÚÚáæäßÞÞ„ß…à‡áŽâŒã‡â áæóÿÌPg'– +¢ŠÒÿüæÛÞÝ€ÞÝÜÛáçåà߃à…á†âŠãšä€ã âçôÿËPg&– ,¢‰ÒÿüæÛ‚ÞÝÜÛáçå„à„á†â‰ã ä âçôÿËPg&–+¡‰ÒÿüæÜßÝÞÞßÞÜÛáçæáà„á†â‡ã¤ä ãèôÿËPg&–+¡‰ÒÿüçÜßÞÞßßÞÜÛáçæá€à„á…â†ãäŽå†ä ãèôÿËPg&– +¡ˆÒÿüçÜßÝ€ßÞÜÛáçåáàà„á„â†ãŠä™å€ä ãèôÿËPg&– + ˆÒÿüçÜßÞ€ßÞÜÛáçæáàáââ„ã…äˆå›æƒå äèôÿËPg&– + ‡ÒÿüçÜàÞßÜÛáçæâ‚á„à…á†âžãäƒå äéôÿËPg&–+Ÿ‡ÒÿüçÜàÞßßàßÜÛáççâáâ‚æ„ç†è‰é•êèä‚å äéôÿËPg&–+Ÿ†ÑÿûèÝàÞßààßÜÛâèæâ€áâàÈĎʼnƕÇÈÅÖèåææååäéôÿËOf&– *ž†ÑÿûèÝàÞ€àßÜÜãèçâàãàæÇ¤«¨…©Œ¨›©¨¬àç倿 åéôÿËOf&– *ž…ÑÿûèÝà߀à ßÝÜâèæâáãáåÒ¯±“°œ±²¯¼ä‚æ åêôÿËOf&– *…Ñÿûè݃àÝÜãèçã€âáåÜØÙ„Ú‡ÛƒÜÛÛ–ÜÛåèåæ åêôÿËOf&–*œƒÑÿûèÞáßààáàÝÜâèèã€âãáæ€èƒéêêëê€ë‰ì–íçæ€ç ææåêôÿËOf&– *œƒÐÿûéÞá€àáàÝÜãéçãââããåØÓÔ„Õ…Öˆ×Ø×Ø×ãéæç æêôÿËOf&– )›‚ÐÿûéÞá߀áàÝÝäéèãâäáæÏ«®¬‰­¦®­·ä‚ç æëôÿËOf&– )š‚ÐÿûéÞáà€áàÞÝãéçãâäáçÉ¥«¨‡©¨ª©¯ãèç æëôÿËOe&– )šÏÿûéÞƒáÞÝäéèäãäÐʀ˄̎͗ÎÏÌÝêçèèççæëôÿËNe&–)™€ÏÿûéÞâàááâáÞÝãééä€ãäãçèèéé€êéêêëêëë‡ìšíéç‚è çìôÿËNe%– )˜€Ïÿúéßâ€áâáÞÝäêèäããääæãà„â„ã†ä‹å‹æåéé‚è çìôÿËNe%–(—ÎÿúéßâàáââáÞÞåêéäãäãæÚ¹ƒ·›¸‚¹†¸¹º¶Èé‚è çìôÿËNe%– (—~Îÿúéßáá€âáßÞäêèäãåâéÅ¡©¦§§°¨§©âêèééèçìôÿËMd%– (–}Îÿúéß‚â áßÞåêéåääãåÞ¿¼’½™¾½¿¼Îêèé èíôÿËMd%– (•}ÎÿúéßâãâßÞäêêå€äåææ€åƒæƒç†èŠéŽêééëƒé èíôÿËMd%– '•|Íÿúéàã€â ãâßÞåëéåää€åçƒéêêë€êëë…ì‚íììí”îëéêé èíôÿËMd%–'”{ÍÿúêàãââããâßÞæëêåä€åã˃NJȇɖÊËÈÚìéê èíôÿËLc%– '“zÍÿúêàãâ€ãâßßåëéåäæãêȤ«¨•©šª©­äëé€ê éíôÿËLc%– '’zÌÿúêàââ€ã âàßåëéæäæäèÕ°²“±†²“±²¯½è‚ê éîôÿËLc%– '’yÌÿúêàƒãàßåëêæåèßۃ܄݄ވßà“áàéëéê éîôÿËLb%– '‘xÌÿúêàäã€äãàßåëéæååææäêìì‚íƒî„ïˆðñîì“íëêëê éîôÿËKb$– &wÌÿúêáäáàâäãàßæëêæåææåèÛ×Ø×…Ø„ÙˆÚÛÛÚæìé’êƒë êéîôÿËKb$–&wËÿúëáãæéèäãààæëêæåçäéѬ¯­‹®‹¯°­¹èëëì†ë êîôÿÊKb$–&vËÿúëàæÐ»Ìäâáàæëêçåçäê̦¬©‰ªŽ«ª°æìëì…ë êîôÿÊJa$–&ŽuËÿúéäÒ¡²¯Óêßáæëêç€æççÑÌ͈΅φÐÑÎàîë–ì€ë êîôÿÊJa$–%tËÿûèæÀ´×ÓÔôßáåëëçææ€çëì‚íƒî…ï…ðñîëšì êîôÿÊJ`$–%ŒtÊÿûéäÓ¸ÛÜæúßáæìêçæç傿ƒç…è„éƒêë‚ì‹íˆì ëïôÿÊI`#–%‹rÊÿùëáåÔÛìþîßáæìëçæçèéƒê„ë„ì†íì”íƒì ëïôÿÊI`#–$‹rÉÿùëâäæëôìãááçìê‚çƒè‚é„ê„ë†ì™í€ì ëïôÿÊI_#–$ŠqÉÿùëâåâãáääâáçìëèçè‚é„ê„ë…ìŸí ëïôÿÊH_#– $‰pÉÿùëâä䀿äâáçìëè€çè‚é„êƒë„ì‰íŒî‡í ìðôÿÊH_#˜$ˆoÈÿùëâääåäååâáçììèçç‚è‚éƒêƒë„ì†í”îƒí ìðôÿÉH^#˜ #‡oÈÿøìâåæåâáçíìèç‚èé„ê‚ë„ì…íšî€í ìðôÿÉG^"˜ #‡mÈÿøëâåæåâáèíìèç†èƒé‚ê‚ë…ìŠí…î…í‚î íìðôÿÉG]"˜ #†lÇÿøëãæ€åæåââèíë‚èê€ëìëëì‚í‚îï€î€ïððñðïïð‡ñ€ð„ñðƒî íñôÿÉG]"˜ #…lÇÿøìã€åææåââèíìèèçåæãßààáãää€á„âãååãâãã„äææå‡äåææ…äèéê€î íñóÿÉF]"˜ "„kÇÿøìãå倿 åãâèììéèçåäëòñ‚òïëìñòòƒóôòîîñ‡õðîðõ†ôñíîó„ôêçê€î íñóÿÈF\"˜ "„jÆÿøìãå倿åãâèííéèèãéÊ®´²³²´±ÀÍÊ·²ƒ´µ±¶Ê˼¯²°„±ÆÍıµ´‚µ¶³ÂÏ̹´µ‚´áééðîîíñóÿÈE\!˜ "ƒiÆÿøìãååæãâèííéçëÝøjyk€ÉðçñîïîòóÿÈDZ!˜ !€gÅÿøìãæ%çæããéîíéèìÝøk @zl ÿãîïõ…ô(óíéîí?ymÊðçòïïîòóÿÈDZ!˜ !€fÄÿ÷ì䀿ççæããéîíêèìÝùk?zl½ãÜàÚ׆ØÜãÕíd>zl€ÉðçòïðîòóÿÈCY ˜ !eÄÿ÷ì䀿(ççæããéîíêèìÝøl @zl6æê»ƒS+%ƒ'((s’Ùó©@ymÊðçòïðïóóÿÈCY ˜  ~dÄÿ÷íäææ€ç'æäãéîíêèìÞùj?zl|ðál3^j¿èÜ!>zl€ÉðçòïðïóóÿÈBY ˜  }cÄÿ÷íäææ€ç&æäãéîíêèìßöy #Kxm)¿íÕtyE#‚ )!klŸåín #Kwn*ÍïèóïðïóóÿÇBX ˜  |cÃÿ÷íäææçäãéîíêèëâï¥guor‡q ptkãç´hsn†p oqm|ØéÉospŒqØíéòðñïóóÿÇAX ˜  {bÃÿ÷íäæ‚ç äãéîíééëâï©o|v€xytpqwxxyv|n®çæ™itsy†x qsmÈéÛƒuyw€xtpqw„xÙìéòðñðóóÿÇAW ˜  {aÂÿ÷íäç'èçäãéîíêéìàô†%:1536/Vvn>253446ÇïÆGquO/63ƒ46d|Stêë„$:146/Vvo>25€455ÑðèóðñðôóÿÇ@W ˜ z`Âÿ÷íäç(èçääéííêéíÞùj?zl3Þò† xu4‚\~M×ï¥>zl€ÊñèôðñðôóÿÇ@W ˜ y_Âÿ÷íäç(èçääéííêéíÞøm Aym ‚îé@xu6‚(_x[¥îÛ&@ymËñèôññðôóÿÇ?W ˜6w^Âÿ÷íäèçæèéçääéííëéíÞùk?zl»îÊrx3‚_x\`êëe>zl€ÊñèôñòðôóÿÇ?W ˜ w^Áÿ÷íåçåè€ç&ääéííëéíÞùk @zl8ãî‘$ny4‚(^zWÔð«?ymËñèôñòñôóÿÇ?W ˜6v]Áÿ÷íåèëãéêæåäéîîëéíÞùk?zl~ïãH"oy3‚^|R ïÙ#>zl€ÊñéôñòñõóÿÇ?W ˜6u\Áÿ÷íåæ»«ºáèååéîîêéíÞøm Aym¼ðÉ qx5‚(^|R`íìf @ymËñéõñòñõóÿÇ?W ˜6t[Àÿøëëʤ¹ÑñâæéîîêéíÞùj?zl7âï‡rx3‚]|SÒñ©>zl€ÊñéõòòñõóÿÇ?W ˜5sZÀÿøìêŸÝÜØùãåéîîëéìàó‹1E<@>A;[uoH:F0”ëçs4AIrtV;A>ƒ?@hveg¬èêEqx4‚(^{U£ïÛ}bÌóë÷ôõó÷óÿÇ@W ˜ fLºÿõîæ€èééèæåêîîëêîßúj$€z€xš³ÓëÉ € qx3‚(^{U[ñßÅ«†{|cÌóë÷ôõó÷óÿÇ@W ˜ eK¹ÿôîæ€è)ééèæåêîîëêîßúj¿ÿïöôîîÜóqx4‚(^{UÜâçìòó÷íÿZ Éôë÷ôõô÷óÿÇ@W ˜ dK¹ÿôîæ€è)ééèæåêîîëêîßúi}áÒÙÖÙÞÚê?pw3‚]zT€žîØÞ×רÖÏ0Êôë÷ôõô÷óÿÇ@W ˜ dJ¹ÿôîæ€èééèæåêîîëêîßùn ))-#]5ƒ  !t{8 ‚a~Yƒ]‹ƒ9(+-Íóë÷ôõô÷óÿÇ@W ˜ cI¹ÿôîæ€èééèæåêîîëêîßúk9nb‚ jq0‚WtNƒ7na€Ëóë÷ôõô÷óÿÇ@W ˜ bH¸ÿôîæ€èééèæåêîîëêíáõŠ+?5><@6k•ŒJ7;9€: 9<5O’`3=9ƒ:;€–y7<:;:=5l–K;?><8;<Ôñì÷ôõô÷óÿÇ@W ˜ aG¸ÿôîæ€èééèæåêîîëëêçæìòññï€ðîììð„óôôóïïò‚õ€ö÷÷òðò÷÷„ø÷óññõö€÷îëî€õ ó÷óÿÇ@W ˜ `F¸ÿôîæ€è ééèæåêîîëëêåæäâ€ãäåå…ãääåççåä„åææèéè€æ„çéêêèèççæêëí€õ ó÷óÿÇ@W ˜ _F·ÿôîæ€è ééèæåêîîìë€êëì€í€î€íîï€ðññðïððñòóôòòó€ô„õ€ô€õ‚ôññò€õ ó÷óÿÇ@W ˜ _E·ÿôîæ€è ééèæåêîîìëëì€íî€ïð€ñò€óôõ€ö‚÷ˆø÷öö÷÷ö€õ ó÷óÿÇ@W˜ ^D·ÿôîå€èééèæåêîîì€ë€ìí€îï€ðñ€òóôõõôõööõö÷÷ø÷øø÷‚öõööõ ôó÷óÿÇ@W˜ ]C¶ÿôîå€èééèååêîîë€ìí€îï€ðñ€òóôõö‚÷„ø‚÷öõ ôó÷óÿÇ@W˜ \B¶ÿôîåèéèååêîîë€ìíî€ïð€ñòó€ôõ‚öŒ÷ö‚õ ôó÷óÿÇ@W˜ [B¶ÿôîåèéèååêïîëì€íî€ïð€ñòóôõ‚öŠ÷‚öõ ôôó÷óÿÇ@V˜ [Aµÿôîåèéèååêîîëì€íî€ïðñò€óô‚õ‚ö‡÷ƒöõ€ô óöóÿÇ@V˜ Y?µÿôîåèéèååêîîëì€íîï€ðñòóô‚õ„ö‚÷„ö‚õ€ô óöóÿÇ@V˜ X?´ÿóîåèéèååêîî‚ë€ìí€îïðñò€ó‚ô‚õŽö‚õô óöóÿÇ@V˜ W>´ÿòíåèéèååêîî‚ë€ìíî€ïðñòó‚ôƒõŠöƒõ‚ô òöóÿÇ@V˜ W=´ÿôîåèéèååëðïëê€ë€ìíî€ïðñòóô‚õ„ö†÷„ö‚õ ôó÷ôÿÇ?W˜ V=³ÿñöò‚óòïïòôô‚óôŽõ‚öõõ†öõõ‚öƒõ ô÷òÿÆ@V˜ V<¬ÿöÿüýÍü ûÿöÿÂ>W˜ NFbÔéçªèžé€èéÞoCR™2VBEPOÐPOQHAU9œ8TTÔQSU=ž-Ô0.ŸØ Öÿÿÿÿÿ…ÿÿÿÿ‰›ÿÚ¡«ƒ¢ÖŸ%$‚%†&%$‚#"‚! ‚‚€‚‚‚€ 9ˆŸ¤£¤¥¦§¨¨©ªN©©¨§¦¥¥¤£¢¡  Ÿžœ›š™˜˜—–•”“’‘ŽŒ‹Š‰‡††…„ƒ‚€~}|{zyyxvvutsrqpoonmlkjiifV'™?¦™Ž‘’’“”•––€—O–•”““’‘ŽŽŒ‹Š‰ˆ‡…„„ƒ‚€~}||{zyxwvvtssrqpomlkkjihgfeddcba`_^]\[ZZYXWVUSSR^g-™ Ž—’ÆßÝ€Þßß…à€ßÞހ݀܀ۀÚÙØ€×Ö€Õ€ÔӀҀрÐÏÎ̀̀ˀÊÉÈ ÇÇÆÉ¯_Y^– * ŒÂÿüÿþÎÿ þÿúÿ²Og"– ,£ŠÓÿ÷ûøùŒø„÷…ö‹õ‹ô‚ó òõïþÍPg'– ,¢ŠÒÿýéßâà‚áàåééã€â„ã…äˆå‘æç‰æ„ç æëöÿÊPg&– ,¢ŠÓÿûåÚÝÛ€ÝÜÚÚáæäßÞÞ„ß…à‡áŽâŒã‡â áæóÿÌPg'– +¢ŠÒÿüæÛÞÝ€ÞÝÜÛáçåà߃à…á†âŠãšä€ã âçôÿËPg&– ,¢‰ÒÿüæÛ‚ÞÝÜÛáçå„à„á†â‰ã ä âçôÿËPg&–+¡‰ÒÿüæÜßÝÞÞßÞÜÛáçæáà„á†â‡ã¤ä ãèôÿËPg&–+¡‰ÒÿüçÜßÞÞßßÞÜÛáçæá€à„á…â†ãäŽå†ä ãèôÿËPg&– +¡ˆÒÿüçÜßÝ€ßÞÜÛáçåáàà„á„â†ãŠä™å€ä ãèôÿËPg&– + ˆÒÿüçÜßÞ€ßÞÜÛáçæáàáââ„ã…äˆå›æƒå äèôÿËPg&– + ‡ÒÿüçÜàÞßÜÛáçæâ‚á„à…á†âžãäƒå äéôÿËPg&–+Ÿ‡ÒÿüçÜàÞßßàßÜÛáççâáâ‚æ„ç†è‰é•êèä‚å äéôÿËPg&–+Ÿ†ÑÿûèÝàÞßààßÜÛâèæâ€áâàÈĎʼnƕÇÈÅÖèåææååäéôÿËOf&– *ž†ÑÿûèÝàÞ€àßÜÜãèçâàãàæÇ¤«¨…©Œ¨›©¨¬àç倿 åéôÿËOf&– *ž…ÑÿûèÝà߀à ßÝÜâèæâáãáåÒ¯±“°œ±²¯¼ä‚æ åêôÿËOf&– *…Ñÿûè݃àÝÜãèçã€âáåÜØÙ„Ú‡ÛƒÜÛÛ–ÜÛåèåæ åêôÿËOf&–*œƒÑÿûèÞáßààáàÝÜâèèã€âãáæ€èƒéêêëê€ë‰ì–íçæ€ç ææåêôÿËOf&– *œƒÐÿûéÞá€àáàÝÜãéçãââããåØÓÔ„Õ…Öˆ×Ø×Ø×ãéæç æêôÿËOf&– )›‚ÐÿûéÞá߀áàÝÝäéèãâäáæÏ«®¬‰­¦®­·ä‚ç æëôÿËOf&– )š‚ÐÿûéÞáà€áàÞÝãéçãâäáçÉ¥«¨‡©¨ª©¯ãèç æëôÿËOe&– )šÏÿûéÞƒáÞÝäéèäãäÐʀ˄̎͗ÎÏÌÝêçèèççæëôÿËNe&–)™€ÏÿûéÞâàááâáÞÝãééä€ãäãçèèéé€êéêêëêëë‡ìšíéç‚è çìôÿËNe%– )˜€Ïÿúéßâ€áâáÞÝäêèäããääæãà„â„ã†ä‹å‹æåéé‚è çìôÿËNe%–(—ÎÿúéßâàáââáÞÞåêéäãäãæÚ¹ƒ·›¸‚¹†¸¹º¶Èé‚è çìôÿËNe%– (—~Îÿúéßáá€âáßÞäêèäãåâéÅ¡©¦§§°¨§©âêèééèçìôÿËMd%– (–}Îÿúéß‚â áßÞåêéåääãåÞ¿¼’½™¾½¿¼Îêèé èíôÿËMd%– (•}ÎÿúéßâãâßÞäêêå€äåææ€åƒæƒç†èŠéŽêééëƒé èíôÿËMd%– '•|Íÿúéàã€â ãâßÞåëéåää€åçƒéêêë€êëë…ì‚íììí”îëéêé èíôÿËMd%–'”{ÍÿúêàãââããâßÞæëêåä€åã˃NJȇɖÊËÈÚìéê èíôÿËLc%– '“zÍÿúêàãâ€ãâßßåëéåäæãêȤ«¨•©šª©­äëé€ê éíôÿËLc%– '’zÌÿúêàââ€ã âàßåëéæäæäèÕ°²“±†²“±²¯½è‚ê éîôÿËLc%– '’yÌÿúêàƒãàßåëêæåèßۃ܄݄ވßà“áàéëéê éîôÿËLb%– '‘xÌÿúêàäã€äãàßåëéæååææäêìì‚íƒî„ïˆðñîì“íëêëê éîôÿËKb$– &wÌÿúêáäáàâäãàßæëêæåææåèÛ×Ø×…Ø„ÙˆÚÛÛÚæìé’êƒë êéîôÿËKb$–&wËÿúëáãæéèäãààæëêæåçäéѬ¯­‹®‹¯°­¹èëëì†ë êîôÿÊKb$–&vËÿúëàæÐ»Ìäâáàæëêçåçäê̦¬©‰ªŽ«ª°æìëì…ë êîôÿÊJa$–&ŽuËÿúéäÒ¡²¯Óêßáæëêç€æççÑÌ͈΅φÐÑÎàîë–ì€ë êîôÿÊJa$–%tËÿûèæÀ´×ÓÔôßáåëëçææ€çëì‚íƒî…ï…ðñîëšì êîôÿÊJ`$–%ŒtÊÿûéäÓ¸ÛÜæúßáæìêçæç傿ƒç…è„éƒêë‚ì‹íˆì ëïôÿÊI`#–%‹rÊÿùëáåÔÛìþîßáæìëçæçèéƒê„ë„ì†íì”íƒì ëïôÿÊI`#–$‹rÉÿùëâäæëôìãááçìê‚çƒè‚é„ê„ë†ì™í€ì ëïôÿÊI_#–$ŠqÉÿùëâåâãáääâáçìëèçè‚é„ê„ë…ìŸí ëïôÿÊH_#– $‰pÉÿùëâä䀿äâáçìëè€çè‚é„êƒë„ì‰íŒî‡í ìðôÿÊH_#˜$ˆoÈÿùëâääåäååâáçììèçç‚èé„êƒëƒì‡í”îƒí ìðôÿÉH^#˜ #‡oÈÿøìâåæåâáçíìèç‚èé„ê‚ëƒì…í›î€í ìðôÿÉG^"˜ #‡mÈÿøëâå æåâáèíìèçè€ç‚èƒé‚êƒë„ìŒíƒîˆí îîíìðôÿÉG]"˜ #†lÇÿøëãæ€åæåââèíì€èççéêƒë‚ìƒí„î‡ïŽð€ï€í€î íñôÿÉG]"˜ #…lÇÿøìã€å ææåââèììçìÖ˜™€˜ˆ™„š€›š†›€œˆ›œœ„›šŸš±ñìïíñóÿÉF]"˜ "„kÇÿøìãå倿 åãâèìíçíÒ‡ŒŽ“’‚“€’€“…”““”‡•€”‡•€”„•”‘ˆ¥òìïíñóÿÈF\"˜ "„jÆÿøìãå倿åãâèìîçìÓŠ“~nrpqsuuqq„rqrvvt‡ruvur†suwwtƒsrލóíïíñóÿÈE\!˜ "ƒiÆÿøìãååæãâèíîçìÕ„šB „ …… ‚¥ôíðîñóÿÈE[!˜ "‚hÆÿøìãæçæãâèíîæìÖ…›Dƒ …„¥ôíðîòóÿÈD[!˜ !hÆÿøìãæçæãâéíîçíÖ…›Cƒ '(!†%(&„‚‘¦ôíðîòóÿÈDZ!˜ !€gÅÿøìãæçæããéíîçíÖ…œCƒ<477‡86677‚‘¦õíðîòóÿÈDZ!˜ !€fÄÿ÷ì䀿ççæããéíîçíÖ…œC„,424ˆ23416‚‘¦õîñîòóÿÈCY ˜ !eÄÿ÷ì䀿ççæããéíîçíÖ†œC€  56+ … !28'‘¦õîñïóóÿÈCY ˜  ~dÄÿ÷íäææ€çæäãéíîçíÖ†œC‚ 74! …,63€‚‘¦õîñïóóÿÈBY ˜  }cÄÿ÷íäææ€çæäãéíîçíÖ‡œF  ‚,71…$57  ‚‘§öîñïóóÿÇBX ˜  |cÃÿ÷íäææçäãéíîçíÖ‡šNˆ!45)‰26.ƒ‘§öïòïóóÿÇAX ˜  {bÃÿ÷íäæ‚çäãéíîçîÖ‡šN €‚(55#‡.62‚ƒƒ‘§öïòðóóÿÇAW ˜  {aÂÿ÷íäçèçäãéíîèîׇ›H  ‚ .7. † 66   ƒ’§öïòðôóÿÇ@W ˜ z`Âÿ÷íäç&èçääéíîèî׆œC 38 …17&‚‚’¨öïòðôóÿÇ@W ˜ y_Âÿ÷íäç&èçääéíîèî׆œC76 …&73 ‚’§÷ðòðôóÿÇ?W ˜%w^Âÿ÷íäèçæèéçääéíîèî׆œC +7. …66‚‚’§÷ðóðôóÿÇ?W ˜ w^Áÿ÷íåçåè€ç$ääéíîéî׆œC 47! …17'‚‚’§÷ðóñôóÿÇ?W ˜4v]Áÿ÷íåèëãéêæåäéíïèî׆œC74 …%72‚‚’¨÷ðóñõóÿÇ?W ˜&u\Áÿ÷íåæ»«ºáèååéîïèî׆œC€ +7. …66‚’¨øðóñõóÿÇ?W ˜4t[Àÿøëëʤ¹Ññâæéîïèî׆œC 47 …07'‚‚’¨øñóñõóÿÇ?W ˜3sZÀÿøìêŸÝÜØùãåéîïèîׇ›I  "65 † *62 ‚„’¨øñôñõóÿÇ?W ˜rY¿ÿ÷íçß¾×ÝñùãåéîïèîׇšN €161€‡%55(ƒ…“¨øñôòõóÿÇ?W ˜rY¿ÿöîåéãäõýëåäêîïèîׇšM€€ 46*ˆ€ 36-€ƒ…“©øñôòöóÿÇ?W ˜4qW¿ÿöîåçèìíèçåäêîïèîØ†œE 75 …&73 ƒ“©ùñôòöóÿÇ?W ˜4pV¾ÿöîåèçææéèåäêîïèïØ†C+7. …66 ‚ƒ“©ùñôòöóÿÇ?W ˜ oV¾ÿöîåèè€é%èååêîïèïØ†C47! … 17'‚ƒ“©ùòôòöóÿÇ?W ˜ nU¾ÿöîåè&éèååêîïéïØ†C65 …&71 ‚ƒ“©ùòõòöóÿÇ?W ˜ nT½ÿöîåèéèååêîïéïØ†C,7. …66‚ƒ“©ùòõóöóÿÇ@W ˜ mS½ÿõîåè&éèååêîïéï׆C 47  …17(‚ƒ“©ùòõóöóÿÇ@W ˜ lR½ÿõîåè&éèååêîïéï׆C75 … &73 ‚ƒ“©úòõó÷óÿÇ@W ˜ kQ¼ÿõîåèéèååêîïéï׆žC*8.€ … 67 ‚ƒ“©úòõó÷óÿÇ@W ˜ jQ¼ÿõîå€èééèååêîïéïׇœL €46(‡‚26,‚…“©úóõó÷óÿÇ@W ˜ jP¼ÿõîå€èééèæåêîïéï׈›O €)65$‡‚.63†“©úóõó÷óÿÇ@W ˜ iO»ÿõîæ€èééèæåêîïéï׈œK 060ƒ†  55%‚…”©úóõó÷óÿÇ@W ˜ hN»ÿõîæ€èééèæåêîïéïׇžD 47 € …‚ 26-€„”©úóöó÷óÿÇ@W ˜ gM»ÿõîæ€èééèæåêîïéïׇžC'56€ …ƒ&72‚„”ªúóöó÷óÿÇ@W ˜ fLºÿõîæ€èééèæåêîïéïØ‡žC$*16.‚ …ƒ 73-(€„”ªúóöóöóÿÇ@W ˜ eK¹ÿôîæ€èééèæåêîïéïØ‡žC+=8997738!€ …‚345689:7=ƒ•ªúóöóöóÿÇ@W ˜ dK¹ÿôîæ€èééèæåêîïéïØ‡žC3/101314 …„#5130. ƒ”ªúóöô÷óÿÇ@W ˜ dJ¹ÿôîæ€èééèæåêîïéïØ‡E # ƒ ……"  „”ªúóöô÷óÿÇ@W ˜ cI¹ÿôîæ€èééèæåêîïéïØ‡žC † …… ‚ƒ”ªúóöô÷óÿÇ@W ˜ bH¸ÿôîæ€èééèæåêîïéï׆™U'!%$%#-64'#„$#(56,#%ƒ$%%261$…%$/75(%&&%$&%‡‘©úóöóöóÿÇ@W ˜ aG¸ÿôîæ€èééèæåêîïéðÖ”–›šš™€š€™›„œœ››œ„žŸŸ€ŸŸ… Ÿžž €Ÿž›“®ùóöó÷óÿÇ@W ˜ `F¸ÿôîæ€è ééèæåêîïéðӄІ…€†€‡†„‡€ˆ‰‰ˆˆ„‰ŠŠ€‹€Š…‹ŒŒ€‹Š‰‡¥ùóöó÷óÿÇ@W ˜ _F·ÿôîæ€èééèæåêîîëíáÁÄÃĀńÆÇ€È€ÉÈ€ÉÊËÌ̓΀ÍÎ΂ÍËËÇÔ÷ôõó÷óÿÇ@W ˜ _E·ÿôîæ€è ééèæåêîîìêíó€ôõ€ö÷€øù€úûü€ý‚þˆÿþýýþþû€õ ó÷óÿÇ@W˜ ^D·ÿôîå€è ééèæåêîîëëêè€éê€ëì€íî€ïðñòóóò‚óôõôõõô‚óòóóòòõõôó÷óÿÇ@W˜ ]C¶ÿôîå€èééèååêîî€ëì€íî€ïð€ñò€óô€õö÷øùø„ùøù‚÷ öõõôó÷óÿÇ@W˜ \B¶ÿôîåèéèååêîî„ëì€íî€ïð€ñòóôõö÷‚ö€÷‚ö÷‚õôôõõôó÷óÿÇ@W˜ [B¶ÿôîåèéèååêïîëì€íî€ïð€ñòóôõ‚öŠ÷‚öõ ôôó÷óÿÇ@V˜ [Aµÿôîåèéèååêîîëì€íî€ïðñò€óô‚õ‚ö‡÷ƒöõ€ô óöóÿÇ@V˜ Y?µÿôîåèéèååêîîëì€íîï€ðñòóô‚õ„ö‚÷„ö‚õ€ô óöóÿÇ@V˜ X?´ÿóîåèéèååêîî‚ë€ìí€îïðñò€ó‚ô‚õŽö‚õô óöóÿÇ@V˜ W>´ÿòíåèéèååêîî‚ë€ìíî€ïðñòó‚ôƒõŠöƒõ‚ô òöóÿÇ@V˜ W=´ÿôîåèéèååëðïëê€ë€ìíî€ïðñòóô‚õ„ö†÷„ö‚õ ôó÷ôÿÇ?W˜ V=³ÿñöò‚óòïïòôô‚óôŽõ‚öõõ†öõõ‚öƒõ ô÷òÿÆ@V˜ V<¬ÿöÿüýÍü ûÿöÿÂ>W˜ NFbÔéçªèžé€èéÞoCR™2VBEPOÐPOQHAU9œ8TTÔQSU=ž-Ô0.ŸØ Öÿÿÿÿÿ…t8mk@$100000000000000000000000000000000000000000000000000000000000000000000000000000000000001'IÕüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÞYRÿûÿûüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüûÿúÿjÛÿöÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùüí8ÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿPHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöÿaHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿaHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbHÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿbIÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿdMÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿh  Rÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿlVÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿo Zÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿs   ^ÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿv   aÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿy#  "dÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿ{&  %fÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿ})  'gÿúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿ+ (hÿúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿ,  (hÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿ,  &cÿúÿýþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþýÿùÿy* !C÷ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿW&  'ªÿôú÷øøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøø÷úôÿÀ!(  "*ÁÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿÑ6""   k¥°±²²³³´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´³³³²±±¨u&!"  $ "##&''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''$##!%!  $(*-./00344444444444444444444444444444444444444444444444444444444444444444444444444100.-,)&  "##########################################################################        ic08cd jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ bwÿ“ÏÁ Ö«öÏSf,Üé¬Óö3XÁ¦ÙÅÎâ¬å°²ÎgPi·©Î¬6MZÏSV“äUÁ«‘ö´]p[Ê#Râîxø˜K0ÇÚ8KÔg7 Þ®°vÌY1©FP™µ»QjÇjK[ÃêKÔg7 Þ®¯H/H»Æ­4+„ξÁÏÁ ׎ý£Ÿ³&X¹ÁÅëP"à;Ò|õ¼u;æY0Æh4£U GëoÛkm•g—š6F-·ôUNî»IgÍfÏÌú?È>Óp\ð ´ •‘0MŽã*]ÚÑÅ®û9Ûy`Lû.<°'uÅfTJáÜ;/qpûÖê¾A‹Ê–Ñô‚¦Ïw$«:9US•ë•S.‰K|i±±²/Eþ!|öYÞˆj;"ž1K +@ä¾fDþ¤ˆîkiI„Ë3½ø4(%P¸ê$Å-PŸ´? Ðô´´CÍüÉ'} BE­a^Q'ÒàH¿É8ßC6¯CÚSÒU¿§KÃí‡Ú=Ú@Jær6¬°ÿ-ů-Ì/T‚€#.0ħ·Ö&g“)CÃ\§M«RƒtA Ï\ö5ET­Ë‹ÀØ43=uP\бRÊ­x”† †×9û#ÛÚV6ºÌ†…°á¿tcÁõ Áõ Àú‡Jær6­Têg“»òX‚gÝÛð3ÆbßZ·s)CÃ\§0ÒD¡ºµj³FU9—¿5\!,{«¯P\бRÊ­x”† †ÖÉ1\á÷¸t»Ú0Ë)ÇàCh 4 ”¹h÷” ½Jx¨%‰¤üi-lÕJŒ5Aeâ$xH­{8ä>£&„UÓ„mBPn‚ z±ž´tpP‚6­®Ž‚ЦÅÏ–š³¯¼T2£µÎ~ÇáQGáWÁöÑ =pžÉ›¤ÙˆÂIc|¶ú4"#¢ûi÷7ð݈ÝÉ‘Ø,òEÒ<óïDL¢$*ºhÜdííH¾ÃWgÚ1f‘:;ŽlÅj0ú>ê/ÎØ#î'Ë}‰ ŒBìÆ¨r´ÁtøN,¥Áý)6#zŸZ6›9§úå¯ÈsÛ4ï 2· ~L;òÊÍq¹†!fÍ,j7óÙŒ"‚7dWßÑ]»ÿ$y Þ `0ŒŒMJNà&‡¡ ®=ífŽ3Ÿa <*d°Öe¸(yó\ïE™üX/«%SO:£@¶Í;£†Ú»aÈ—1VÞ»÷ÿL¡ïÀŸ8 gj@bºö~¢˜¡{w¸êÎ9Dç¸óç#Ô0Õn jšâ¶¢hÔ£ ­%†zÐE€þLF ÔGœàóLËæ‘¦â•ŒŽ™]e:kŠ)Ò©C$œa±„!ˆN õutðûcHNüCÿyuŒÔS.wM^‚ðƒµnE ™ò¬&Ö`‡ˆÛy;œêåë‚,ÌsIÔÌðp³­dÞIê-7K¾XƒEh‰dÉ‘ÜU¦u .dóã<¾`Çê³ÊÉ[ñx5ã‘A*21Õ)À55ª2˜+›S²&-–ë šâ<¢†\ÇࣵF‚h“láÖYfFÊ´›‹< Ϙ»,Lìf”ËÅ[ó—pÔÊøî`°m²GÉù÷ K«›”ü±7Äþ·½–LoTÆ]ŸÂl/û-â—Ö¸Õ±bNà »Y’–MïŒW²":JÒEÕc肈–Hu3ý8À¡É%÷î˶wgÍç»i¡QBмdó; „ õOöÚ«)­~·ý~5^iÜ;-¶Bo‰n“Ïpòêo¹i\û,Pœ=u›f¼Å~‚Pcóª±nþâï/é™@~Áƒ›_¢ažµ‘†l±=9Ð@¡4äáýP’#þøîˆ¹~tíÃíCƒêEƒíC“láÖYfFÊ´›‹< Ϙ»,Lìf”ËÅ[óbÏÉšë03Ÿà˜ŠæëÝ],â¼ö˱æRcAû À¼_Ú}. »Y’–MïŒW±`„x’º)Ô eú E dª2>¸Ã{#§`aÅïZ¤€-ø®Vš{j±K¶òdºx*f“Ïpòäæ´™ŽöÆ•ÓDó ¨­'[ÛY— áD˜M]q™ÒÍÀ©œ7QÑ… Ge¦1äåWsåÔ5Áæã\mc3±AÃíBÀú´„ŽC:N3{ÐÄÄ¢±qn,IwS>Xʬuú×W \U×~2{|ß7 OÜÂÈ•Ý:ÄŠÊÞ Â`ù¾m ììy2Û¬¿~W&56wŪ$ST9L¢ûD c½ me4 bx3RlÐf¯‰ë«ÊUá~gÐÛœÇ3n UCEâC—´ð…êtšà­£|ŸžÇá¸ñøn”n´€ÐyØ(³*Õ—€jÊgZZh £GŽ ƒ[»{踳²T"¸Ÿáº.44eÑ„³Ç7ã¡"Ü/Û3E!`Hz-pcXcŠJé³í!/ qÓ?×[Ȳ] ú‹:ò ŽyœðÚmÅ …ØA*‰”£zL_O]7¦%'ºÉ{þÄÒCyaþ¸4›YÇfÿ`b…~§pr×Ï3˜‹úC9 —Ÿd/nt•ø3J§mY‰wò\Tá}Ç¥gãWGpyÑÜÛÁ­qmÜ…™ìƒfb«DÒEôÄ~=Éó¯œ ±x”Eè;óô…/²€ûB±I«©µG»Ò[ž!r•§jó¹p±oæÔb/am^å†ãž°êárÖ-ªNå@jHì'¦'íGÒŠÕœõçýÔ°|ˆË§sMIÃ4˜±k½¹‡é‡ã7ƒ5ðós¸ªdâÛ&ÝvÿEdëp‘Ob YùA¨ ÑÏÌáRxÝ‘?w|X½ãŸÔ©ádí8G!àv@_Ö°ÿ|÷·‚âRŽÕu×eXðÑÐä¿úÏèx ø,߃<––q7Ä,;Z¨–h³“3HM[8ƒN©ŸvPqª\ôȸÈyÞ¶ž»SNŒÙMç}kß‚Kú8œOÔP7\C‰@¢é E†ñ:fS|¬ªÀ¨wÅÀ|ÊËÈwý8ÂF¬²1‚ÏíJy™zžÔņ €PÎ’À˶¢Äv§Àmåôaž¦Ì­­k 8” ›èÀbáf°)x¾!¿o„¡„–Ýå×h››ÜK 5Ư?wŽ% µVî¬Ç”<ÞyÄÖÐ¥I¶"m¸œ á]p,?ˆ©b¥h‘ñ?€›Û¶ù×ð¶hØÕH+’~h ¿:ôwñlX”ŽKÈÉc‰òLÛCüì[ø­2n®Ó%×Ûà¸x¸ë‘;’"O@€vr—½::Ù” ÍÚœ/™se[7›“ÞtÖtJýbdPžZj˜§ÕVПÖy©34mƒÑ7w7À)ê.¶ÉFF ã¶I€D®Á(`^®§i¿ãŽ Æ“Í”Ž§L(ò9…±*§\èÂgjŒl‡60)ŽZË–Ô{'ÞÔ0¹ +4O¦~ÑÑ{9¾*ÃñBfYÔ3Œšký¢Lu`Ð×Qà?/Gá¬ý6¬ÿa`~ïô]o]a´n.ÇásGápAöÙÀÐtx³*Ó†™jß¶Ü}2Õ¡5 ‹fRÎ/“KS}Ó˜ß&˜äfÛp®Ô<¤ß„Ïç/ŒÃn+µÁZ@aº"5ØÍÜHGÓ›$U½]ýÍwˆLìw¸Wâø¸D׌›‚äj?R=9gø®YÅ`ë ó¬W×BÄ-½‘ÌMÕ…ìGc÷½V4ׯ`;“xäu=D~ êx6Í㱑’pú3K´º—Wð>¼3:—%§ 8WÕiJüñò)4†èfåkÒÙx>PmÜ]‹aRmÕC¶4Áæ43³èSê©‹£–Ž<_âͳÛÉ6ËQ%~Uº:é“@Ö§ªó¬`Þáÿ\h>Új›X¢€±X„dTe–¤âj°pÏðc SUO>æ.:€uòÃ3[ÝÕO²Ž¿PŒ† Ù57™ÛÍÕu6Û„*¨þ[ñK´vµ^¹w÷¯®‡º¯|šrq½rª/+0›š£w+¡_NÚs™“²åÌ*±…F5rÜç„m:“«ÃsÂÚõ÷‚ ˜bDœÐ4üE}\ûÜ) ? ,N…?™¥Ëi¬–³î£aƒ#œ ¶Y-u¦ió]ž"¡'W1níÉGfß§fyÀ0fÀùñÑ gÇùû‘3?ßôеÝÇ Oï£z1OªæßqPûá¥+oÍtåJ†Òä!R¼J®ïåhB#×Ä@¦Ä@Ex!PËc[%–ùì蕸ÓýÏ@­Î|…§ýÏ —o>€€–PÌG×O ‹ˆ:Ò ??€=d®¶™eNèfP’ˆ¶žÍ6@'jFФ1R9Êîjôç¼;³¡Mâ??ç­1Ò¨”'5xmˆ­’®u.u1ªôô@ª~œÃí°áöØP>ª¼ÐWé¥FºHPU‰GR9„ Ï€¯˾ØèNŸd«™Vñ(¹Ÿ®U AÉÞœNtsÝiõÌ ù§ÈY5é:Áº&Ú¢ÔÖfo¥ð/‹43öIÛ@íU±Ü¹¹ LÓäÉ¡v6LÙlLkÆýMÝ7Š‹ø ƒ%Æ:Í’òOº M§é·3OÜBP…Ì1&V‹A€$üÛ §Ò19ù›IÃ[Fm"< ®¯LúlR£›/[ܰ­ü\ñ ë²èÐÍÉ6ËQ%~Uº:é“@Ö¢ònå_mAu•¸¼vÀ6Ö¨7¤”Ë25=é2yJˆ¤K>W&yüÇίoµž‡—…¯…<žYÃÒׄ YøŠºì/—žŒîum‡Ú¦?;}üpY°Lu¶o!p±sѲ\*õ6øS8¥ûû’†È+=€¶—€{,~0—[Ä)G¼)c×f3à>Pþ½¶xaûæ‘í¢sß!Sµ ê3o ItºxVèiÂb耙9­ÁÉGfÙ2&ÒÝ…tMVB(-úC„ºÆÝ£WžFh%Ú^PÞyjõÄY7\ùôâ ÝJ«yèI“±†qßUJ}8üÖYÖÐö^f0ÑâWZ(É’¨RkH‡×\à[K=î6°'é™Ãô£÷F‹Kór0 ï€5lPº‹¡Ác¾ r¦JҎјîýjt«•|#;¨“ßë5–`>ëêcËV®áÔgÙƒÑÇà߃œ?P)B¶û?‘˜›¤£‡<|p‹?­Ùº²ú‡€¥ãè¼ØN;½<ÏN04(9ƒœÒì iÖ Ìk–±d~Ts4'[ëium.­ï±Ÿ‹kŠúy}'Bš¦ ÷oÔ¥Yê ÎRfZ¨þdF)yFSÖ>-Ð=ÈÓòsø¿ª¬ÏkÚKÇü£€î3dÛ§’}¢ÎIEsàH8øžP¢Ølæ%^–.l9§;é ¹$’$×»æˆ •™i¤L€YòÜÒQȶ¸#§¤B ¡Fl£%@/ŽßàPmÉ$’N׉ãFpâF4z¥Ã¨‰ï¥É·F¼™jŠ~ž” $Ûþ¥Ô6p•!uý%v à7ciêE¬g Çáè©·Ñvo^õr†¸›}¥ÌH=(ŒN®kßQ改›Ò6·Xˆê³®”=Š5)vøiÐ6ηu.GóÓ¥÷([›`Ûvzrü1'Ê£â¼u#åq]D/Y·Â'u˜×h ”Y‰ç‹±PÒ0‘,‘íËËšKé8»˜¤ÃSøÀ²½xwÒ;J Ô^ÊûYb£­8®8¶Þ¡0£(>pÐMqwCöq‹DrÅ›úÓÛ î&J±[¥äöVºÜ0w:}É}"_°,Ã:b.\%/?Z *\¼þQ,)ñSæ´Ó>¡;(°ÀÏzZ–0 ,(Ñp-$¾Ây¸ ÿjšæ™>a[±C¼†Ü5f³—f&!?8-`»¡}Ž¿WÎLi¤†ßVr—ã,1Ç`díKAË­ÑHǶbl¿‘À~ò €Ù¾‘÷-éñ©ÒàýyE„ý°„r(êïÑ]-š-ðã Ä ¦ð$°õ‹JX2[¥À6`òðçÈ8'IA í+l²nÃŽ©ƒŒªmì54lÞ1´n¦ÅP'¯½„ÂãÔxúp4kÌ$×zOY{†ô ÞX@¦|nsÿWš^¼,k§“•A=ñÖo r#~ÿ0E„Û8¦ })>¢ñâ« ùHL¶.Ó {|FRúɲmC ó’Ž8õÈ÷Q‡«pû*’¨°çë°½ûÏø<—ÌV´ ??^'~DæFÆŽá¼¼bw‰#Ð ³3¶¡Ïî4Ðç SÒÆ•¦m²@q ž†˜Ï r)¼—ö™žY²[ó÷õÆ# Yª9špžÿo@B5øP(÷·ðÜ\"û©šiyb·ôS¥8Ú}´ VÚКA¨ç&Í4…Š…¹†k¼vÑ*Ê"Óy§n&>¼Xá?t6{ë†fnO¤FôÊ"\"ê=Aj°¬‰ºãïvôÌ) Ø Õ¼ESåJ˜à~¿Y¬Ð,öZTî~Ú² ¢±ÿ€ß~•7¢k­ãdI`³_Ê*Uiu_•%¸×|óx&|kxîrg6êîB.­ÕŸ“–èÊkÔM&î^ü½6| þ¾t‘ €5{[~`l’N•a ØÕq0’ßG!K¡9&¿m~CÈ(/T'…-T!¸°'}‰ ºu}T £·¿—¹akÝŒjÏå [ŽzÏpaæ·Ý)qjÙöçèƒTS«!’¸GšÏ«zKçŒr3RÒ(/DrÁ¢[eÂB€CùëϘÛ]?ã¿#;÷ŠÃX~ Êö®ñʲ#(±¡ÿ=)<,U‘qý‡srµü£:Í'ã<€ÄÍÓ3͆ô Nøã@ó«­ÿcPZSÀ>àÛŸÈ”Á)m°¤´-§øn˜1å»±á‰÷4AÕ¹§åÀíÃÀ)GæÔl–Òǃ3¬—ùµ”—V)ÂluÖcRëèCó¢¸/}ß_:ºú¡"´çð$½6·±>~mAé¹8éævs„)¥`…•ì"Ÿ^nBÕ0ù4cÐÝÞ‚^i7!B£ Š•ŽÝ¾ï¸æ¿w§³ÑÛé|Kv¦Ø kÕéþË©éIöQÙk7?DÎÍñ¿«ºÊêVå.kþÐwb±~ HìåÌÞèó—B¾% gw2³pÝ쎜´°Íîg”Пˆ= Crå"úaÍÒX®¡!/˜Ã+y'Ä=¤°Åd"Æ£'³|–£âS¢&e_U¼ïC¢ ¶»!¡˜ñý#$YÀ=}²Þ1â2ÙĆժ /Øš•åx"j‚ÑŠã®kûÒοÀ…Rn–Ù*$]úÔ¤ç9‡–BFÐêüZ}ªQ"ZüRªªû0ï¦{ˆ ECìÞ_AÖ$ZÝßgZ†­¦¾bÇj(](„Ë'D% Ó\ü.{|¢Ù ZÅàCØáh–5{—N™^ÿ|‚#_Em-‡¹Dþ—‘€a þóžpµÅ«’‡ Ã'@:ϲpÖÉúšoi¿œÖµf2Ë]Ol{Ž‹+"AÎ\y<âD—Ïš&‰…‘TÏú%$L¹‹^[ p•äúU¶vúRs ”@š³AhSž Cˆ ž*gC¿žPjóŸÀT_Ó‰úÝ­vŸÑ"«0€Ø+½AÙÔnÕõ®º µ'ÆŒåõzgbÅUUW£uxîQa%íâÓLN©ñ1V¢’d5ãò{˜(MûƒJ¶ÝŒƒÏGPÊ¿JðËé Ú–8W_è P™ó@Ò(á‚4›¦ "‹Œ–í ¯ éƒR¨uKxøÔT~áæ.-t\àöïŽßª¼Ìm©AtÝÈm©e\1)ßWõ4n„ årÇgºÉ«)v)‡§¸£·UdÏ\‹¿ŠP³ÍvhöÏh«¦$oŒ=$ ¶»ÖãP’aEü|ºå‰åv”=\7aÿW™îµúlû(Þ~:ÅW‚›G­DmÁêL£\r]žíöÖ5Vñ¸– ºLJ² CÔ1±è;ÕÂw]Ø ^p7$ûìÜò]°X$L¢ZwÏ;¢Ë ä3`ÇXv’Ú…¾èëFÒwý¬f%9®Ì¨…ô¬%7XiÆŠNŒcœžîšY“ùÕ/; ?Þˆ…?}fÒLLóê‚Tz¢Q (3%Ù…¦!ªtÕ6ºiKõqAÊ*Ê0¡§+•Y ·Ž¾Ó$”ü„€®W=[:¾3þCjï&ñô®¦KäMbr ó¥‰ÓºMσ¥ ⼸H³&Z,O(¤—ìÂOG-‰0“ôôôžŠ›^û‘¾öÿ ¬°Ñžåßö;Œå6”댔$À]´Ìie›lÆ›>÷èã_JÈ„•3$jðz×_fMWÉ~h3#k´"ŠcȄ͟±»,fÁùåcŸ»Ÿ›×™³dwÀº8±¶þ©®ñ¨¿xlói){b힌XRòQÿƒd®}@à²×!´ÐopÚM <ÓU¡òõñ?~ RÝ­®"’«°wІ—ÒiŒâ‡È² uÏq$¿…2äâç,7ÃÝC×*Q«g?笜Š;é`+Fª=y7ãy„Œ‘Ò¤œ2DZîû“µ²}Ü¥6‘¡î¦©üƒH=ÿ ÒÔ~Çœw‘ëÈëIE"ü’U¹zF.ë’48Gz¨cù=:˜ÿ^ñïV«lÿ+Ŧ¤áå=ï* ©Æ`m@øÿdønùõÑáß¿]kp2š3›Ó¸Àbm‹(*h¤jàÀ‚uØ¿Ã,KaÊw§<ØßJŽÞð¬õÉ|Y›Ö¹ìw’Ÿ²P05a…¦xEðºó½Êp#íB[à‘b¿ ·ïˆ¿GêÜåQ'35ýuî•þýº\©é1Ò?¾p~Ó6|˜É•ƒ†qàå­Çá¿°ûwÖnÅõrQPÛ ~:y/ ×bìLB_ڵ壽ê?sc!ñVÆI¶¥dwTOÿ /I<{CÙu.¡¤ ¼ÆÏ>Ϋ¬1?ÊËçßJ é"~ÌQÓ×gÏ¿ó°œP‘º™‘R1¼®HM~Û@£ûÕùb»Dà]9Óš.uwºÍÊfÔ”HkÜv*¶º©±G·òVﲋ§ûÖvƒLj‰ïôú6Õ{5¬ç9*Hõ^azUG¹›®¹hê6ÓPÁœ·FHbP7üüé³8ßß΀d¬í&Øÿ&†ì¬>Ĥ˶N¼ zý³²k±¨Pîû'6]P8çÚuðñÔL$r@miy_þ9>'nÇ ‡-5w8fexEO!ùf×ßE’«0‰˜öõ¸¯\™×,Çþy†„´:·û£ó„F:j%#4 ¾°ɵ&²ò7<Ôq¦=ëHZS}:X’Ú4\€Ï†¤6AþÚeðGI(qæÝØý§Û††V£|™ìà5qIð}ýoëKz@ÚG@?Mßð!§;Ç5e\MšxZ3èΓ&îþ%T£µw¢¡SOã;ôG +rÓ!Húg $/tgÉx5z2¹¸@$ó¬Wì*C!ƒ\šœ”qêÈn“œÖa¸<ât„SÉ[•ñÃùç·B0§M\T»£Añ™œY€ÛÌöϹùx Í>—rjêP¬ËñMŸþo½\þèŽ ÉíÓf.Ù½s©X;Ñe@¶éÒÿ€\AW§¾mêÎ ¨ÓähUæ;\-«mL9êì(Ì©¤0¥a¼@ËH¯7 Š b¥ð‡šB}•f_=Áèk»ÓX܄Ìs[Ö{™ |ƒl»}_“QûÆbs£üð³wh=ŸëYÓ`j(õx«Ù•œðeå-ÛVáˆêž„¾o¹žjÑùô³ QFHûÙ;S"&豉M%ð¼¾)¢ÒŒEêIèpj¨ŠiM‰Ñ Có߸ĬÉÛ7 äÚBBôl4f×ÞøSº™ï=qG¸$ÃÄ 6G'ÂØüL'¹ÅF¹¥\•Н z:å† èé(qÚé—\pÛ£LXO²Jœ„ŠM¸„°SP¡y8zÊD‘S–9E™¼az1GoúÿJ—ƒ;zÚ¾_»½ åeãöhbR»$a»:Ëñ†%GKÝupÙußáМû}ß DÕ6³˜—»:àÞÒ— ÙdK5­L»W1×,“¤lÖ}74çt±RéËv~AarÕp.õJaɧnÓ¦Â≉Áñ”“yšÓzÑ|ݸ„ ¡¤;$_¤(Ý0ö"•~¼ÜxˆSìsmq-ª?õe­ÃÉô»`ïPBO2ÉKk³-»\ÅæKͧa9–[þêJ‚, ¾ŸÈDáù¸sL!Ä@÷qßZ‚4€³Ûs:M7q0„i‘Z¶‚ Ž\0q¡BÇ5%7$„gBLøÖ#‹÷ßé–é¶“Wv~¶\¾u¿èèëxÓ@=(+g>›È‚¨):ø=Üï§y- ¡§} ê8cžú.M¨e  ¸ž—ëßCÚà¸VkT–*ÃFUù>åxøÞ‚o‰ŸÁZQÙ3ª;#{)í¢PÈjê•Ó$ø¼WÏŽ«»ãßb_ 3›à̯^wg7ღÊ×`S„HÆîq/ ™SLC×’ñ7—5´ë4dvck¹ ”¹*5qö†˜Z#ËÁ™{3~5!|ˆŸûÖ©D¯ u> ”ë²æÿdÑZºÅ{Ùuy?5qÃdvHï=Ç(È^q±¬åŠEÇÁv Ü\7‹\ƒ©b½øž0ìÊÃíÚÈ>­¦ƒêÔ@õrQPJðóè½=1¨(ëpŽp%…ö§âÅ8íø/ q7ži_´fɆÆpOÖ|¢Í,³´=díÁ؃¨‡â™‡vÆ~³a‘Of#™ý­ñW´öRP?þ!{žS[rÀ*Çßn¦ƒÍV·X ÿJŠ ‹`ÏQ"8.:dzþ[«ìêÒ}l©‹O1CKÎj骀^î°ÔÀ¦f–¿ìš‘'&VZ«÷ßn; ™%Ôwh‰=ReHà¥Æq—ˆ”´Ð8±×N ÕžØß£ ¿¿´\œÿ"W=î?÷>ž­¿7²$*ÄÁùöq¢¢W¹ ÛäÐÐz2HuYo’I­»êÚÒ)SwùP‡.&Ó$@L•eîv1@—D ©|Á½†"8I{}—„ü”ºÔû!Õ¸s¿xB!Fø6bezØÉHºz’ÐÇ"±1Â5Ëln X~”¡B”=~È3JkÁ£!W?dX‘‹]éÞɬdf¦¿™(ùó-Û—#À] ³²âA Ø`lë‘ÃY{w&)¦žóGøYŽ.•ìâñ´LjÐ/|vø°±üù ñÃùç·B0§M\X¿{ðàxvŠuò¢1CŒðј2!j|ì iÝJ…Å0̞ǎpvÂ-©I˜Å2T FÌHƒi¾áý…LL¶’|Êô®Ýßs/À!Ç硱§©Œ!#¯?µÿeãÈàãóÍ–9Ü]¹ùM70ýÊfËM;*òtÅÃ2/Bxˆj½‰Å§'0ߙåæçÒ û2x E†d5¹ßq˜¶ôî?T»¼­Ä9ÌåçcÝxÙ¨$±ÑÞì°|=‚«™g0®OEXëÑ^Øô­¾×ö̲>OÙJú*E“—Ó‡ý«ŽG1S}…rä*v/dÑdœÌt~@¬)ÙJOôy¹ÀnÎ"ýZŠ(îð´õþ/ãqþ:º…w1Îw0;!iÎÛ‹@†ÎÍ”6D-æ—="áª#=_¸f7ñÈ©ª‹>ø¸/‚®rÿ.]RÄó€öÚ½<ÍÔ\g9¹R†°‘u'nÄ4Q„Jr˜Ö¾yŠ„fä݆?Š„±n†ntPâ =~þþšÝ¨Ýö"•~¼ÜxˆJ£XOÓybWª…õî"c HŠ#¸a˜ßÀò¾7I÷ç±8/ÍI⥖S¦¬¹ûÌHé„À²&°~Ä9üyW&VU26zɬ¥JYüÕhÏžŸÕt›%g‘M÷4)Üéòš¯WÖÅ•‚{˜wçoâÞÍ+6²á‘Ä÷ærö­ËSªšpz¨T@X#'}úD°!&ûQ`áù€©ŒÉ<ˆ[à^-XœK[ï:†ÆŒºbª4'í:¥ýáLcµ³-ß§›iä³6C²½Z3ÿ(Ž¡«5ÃwCËÖ¬\¥ˆ‡MÏ¥òŠ¢€,Ö$0xO—’¤J®ƒOn H²‹¢§òšæûÈÄ=¿‰³ÓçÓÂhk‡ÚŒÙ죱Žÿ å2Qj;Po>+fhLœ(ÇádÇáXGື||¹Ÿþ^sg©ÿ²ûöpÄIËlÒà­X"•Ï žfÎÆ@D©Ôƒø?UÛW«D‹ 1ÁE9Tx ðÝyÅž8òW‹€('¯ÜWÃl.b€äíír—”¼¥å/)yKÊ^Rò?¹½È)Áaóéî­ÞÀ6¦£KÊ^Rò—”¼¥å/)…óKð÷̨ÿŸD†‰G·$“ÿ,ÁC».˜ªùSð«_“Ü·SóÇ+ñt}  ¡Ú³'¡øpg£tEÉ4ªýŽ2¥¹8éûG+ËÁ5;EèÂÔÏõú`‘w¹XÕÙùáëiëâIÛ9Ö§“˜.$§dlÁµjà¬3 e[ážä·°:[Ìa  05L@Ò bbiîd`88xH-ú~‚P2©qPihŒÐ¡ÝCNqÍØÃÿwR°.áEê&ØöìGŒó_{²|S$(84pÂA8ø¡}þdùr(ÔÛå  Tö‹vlcøkh²Àùe^E[$ê0.2>ƒ«tËm*œhéôjîS ;{ÕcˆVg:ý÷þiE©’ˆ`?”Ûã=6#Ì~~ŸHVÔ'ÇöþÄþ^d%ëJÈW¤`¢K:³ãöôuûvCö÷Wû{fÇíéïöôóûz¬ý½qàýZÝú´3õn×êÝ à€7Oúü—±TPÌzÇ„TÒ'äÓåÂ0aÀHz?ƒ+n¾o@ÄÍ\EˆRi‚ÕÑ*÷½2½¬¤â§5hÀî[JûQî xyôQZæï]¡²ž( «¸±±5ÝäÀØG_3ç‰a§¼(ß²Ã_7ª%±æçzÉ–Wù«KP…QAîÙßN»d©h,uÖejnt¦ê\M­PU3&ô_qRlVô«ÅgDa_y¡U­*W ñ1^ÎX©«}}ÙUÎÍ»oÿ]ÅRÊ5f…uz02è¢ñ*å"f‚¥ïÊ u¬ÔHW\$íYƒÿ|zoŠGhbZ¢Ð³´·b»¾”Ž "«AqOG,vÒOâ´ZÓésä=±:Ì‘1— àDDî%§Ø:$Qð³GªÁ,kì™õìjÛÌQ›G«Ê9wóy%$‡h[5Øp¼ösœؘ}¢‘Î+_(¯Øöw¿JL*X¾Ø³§ƒ&*è¾ùë?_‘ó–Ÿ{.>¾iRVBtv#Þ•´ Y£#~PQ]To­¶K6a¿(—fe‹’éaêÏòÓüAD±Ì«¾B]s7y‡3pC®pÕßÑW3¶$ Óó3fgrËÍì¨JmÊéñÕᪿ‘3XÔ Ãq)ò–;žïÖAÉm ø.'¸ðSPˉ`VÚ”@•: !Ag>¼ør{zÔ\>ÑN9@çU°•†8L‘AÙ¨5OÎü³nâ´ Åœ´âZóøAÏG”챨Õòš¬øtGÿjmøÐ^€Ig 'çž(ú­ ,e#™¶*QE¨ÊºKÇN#>™ÄÀ£þUP(ŽÈáË €~BY”žìA°,Ô˜EwšÍ….Äÿ§µâ¥éÚø¨>ÌŠ‰(ó7óŽÝ}F)W‚9”²EÈb¡ƒ" !Óéá­™gðO“CËVëë×|ü½¦]® Îg£Âƒq Ö+øVÝSâà$ïOä}¿Éfvvß(ÌŶnS'€ý®O£“ƒ±¶0e (²–…¼h›¬œË7Çó‹ª(¤!dÈÐ?QÂÝ@0‰%‹œ‡E›²Ö­Øtþ+·Ç<§[8àn•Ìz¢ðkŒÖ½ßa±Š“:sdAi2°0Ýùò©½ÿWO¯¡ÁðVÑ§ÛØdŠúâ¤Û„´ù-âq]+KឨQ¤rÉù€•„üU‹*Mï%l–*á['¼ÔQðEO³Ñgg»‰÷^›8ª‚\߬BÕÜúÊåI{ô“å"Õ›\¡ÞÄh%­ Š¥Rg í`R¢n8QtÛCðFå’n<§ïÕî”æ#ß2 Ë…ó`±LÇQ9É÷ŒêŽ»-櫹͊D ˆ’æu#oµJi‘¨¨Ue4Õ")ÏH¿°iCPuZ#Ê¡ix÷c&ÏW'C?½:E™˜… cÎf|&³@’ÚpŸ”¢$Êufº¯(/šYË{6§üÒ+å2Êš©k8a9þ¸&$8Èñl†”À†¼©Çs”B¡€ú*½3+ד­©P³åßyêj¸` Œ™D4ÈFe·ðAèË7»ÝŽEh.-‡Æ€¤ø´ÝC[¬ ‘r_K‡öÝ‘P˜†:M#Ûªö HÀ•p½ó&›%âA±Ö-¸®¢ºd¢#tØØ:\Á†ñ«¸-ÏG Ó»pÃnÒ¦g>I*§X àO~ç4¶í¸ÁnBΣ‚Í"l5³š?”ŒpÀª®d‰0å×£Ÿ¢PJ ü1ö4á9ígyJjªv G¯±y»žðÊ ›çr¨¤xOasŒ]þ ­hZ=ó ^é¿áUEdPÆÄúñG±é(8ûGõ/1òµtr€ ‘á»>ð“Œ`‹3¢&UÊé³ò$­Šx°îª¸BQ¯?E”H‰H#ˆvØ5U^Ò…˜‰´Ñ κ¾à^‹ÔÇš[Ê6gE~&*Á"àAçs¸+ Dew ´êƒÚC¡ÄÒ6žÕä.ÔÆB2YÁÞ{ªÐàkÅ\JõHíÐïòÌŸd4¶:ìáÆËÒ,Ý–;¼Ñˆ“s/éa—öë9º½ãZåÐÅò†êªàÊ»>Û n±½.º×.[ÏÃtïÏ!+Hö©ê®LZÛ×/<¥~Ý ©uÑûõóµ5¨K¬ÃÉ$Ÿ¸û<ð|Í"n†1ž`‚Ê*,†ÂN͇+sØ „# No£„DûÙ­5íw×Ñ ^sF¥!‰åÙ$ò Œ­Ž—QÎ~IG[$›">çt¯úâÞ”cªÿkîs7`åoW×R°™ìë© ëJȰâò“mùú\ˆºD¾‡ÕK¶¬ôÐd]Õ;ñë‡Ïÿ]k±ác[ºèb0Hs‰Ö¡C/‚®Q·¶¸*/wrÊYMøÿo}Úë{@Ë’ l :|^@qSdŽÃ6ýnn/ñêûn±îÄãA1ò–wñº·ƒdœaxá!£ž†@WþÚ¡dþl‚–\á<6;ì[úŸ”åÀ…úæt*pCšÉ Yµ.r›+ÅÕxeËcï]‰ÿ;øØƒ@“ò•$®6¾°Ñb ½^µšx«e¸$Ÿ›Æž·š+¥"ʵÀK°Ep~GëgRpœÖ˜k¬ó™~ç#uã³*hBJõ©^£A9XŇw,y jù7xÉ ž ¶þQLÔ,®Bfüt‡ h·Àœ¿Mõþþ’ÖxËÒ>/®E3¦Ï“Ùù–\@R ‘[&cU3¹Ê}^¾[2Œò4¢¹{òîÏ I|ŽP”TÆ-¼am¤Ù .\F|˯Z6\ß¶n"ÁˆjÞºˆñÐàHѽ|«ÍScC ̧i•Yx¬NØÃjŽ—KÚ\Æ¥Ü>æUT²"KP•°ºˆ‹ëÇàÖ¸|¤HFã—28õ>d6ðã Þ£~ Hs8qΩyýóZq–*Òöóð£¹Û[Ã’àD:(nµÓ ù½ºXÝ·˜0±ušÝáxÇôiqà'õÅtí{”K¤ŸHJ"ƺëÃ_á·¡œdC*<ëÔÒ¹ü‡ J‘`î'~‡9~'»Ø JžFA±åÆ5-A¤}Lâ,ŧ‘ù SÈ€+™÷Ê*z²zP’ý@4 ûÚ›€¤oÊÿ€÷>‘Ý¡­Íãý»ñöäÃPµ6&dÚ´ZÊb$Ómc¤“æ¦gÅ¡5ÖY7—n=<—ÊH4!÷ —r‡w( # ê{9z|ÿa‰}êb › ¯°5¾xP“*PýŸíd•B2Þºø¼­ÚŠïTŸúÒ²ag̳?:=z…TA…ü^/5‚à^ͬyÏšŽS§Tß±Óœ%”ÖÅÉC¿z‡»Eûí0ÏíL{,SÇuêå²;U¶i'è&Þ^‰~wQé®60‚Êÿ(2¯UØsª°µß’YiüAu=åàout |ÄyÁ¦²†‚#ìÍ’P‰¼¿ÿ€gI†ÚňÛñõ^si)-‰{‹Ç‡çÕQT_dr3Š‚ÞÁã-03ä}Õ$lûNU‹»ûèÛgenÿ%Y¿å,6?ÙÄ¥uÖó²Ùȼ}@Ø+P8ùG³?:ʺÚÈevïMM,è$» à;³vPÕÅOJÆÖ=n5ÈåC5 i+û¸Ýyo&ùYÖK”û66 ý‘†^ÀH„yÁ†X>+4žKa"ÈÅmOðö‹ÍbRbyL¼ )ß a¡‘¾aª(m81Å" ý°öŒ37Z"!½7G£¿˜ÈD X½³ˆ½·ÿW-B6õÈð¦ˆ&C•Åø¯*B‹$J@ðÎh!bÃÞ`Ö8}0AFÀ\·ì?OÑìN|\O+ä'šn&Ö»_HÛÃTe§¦uùÎ’«_é ÿIŠ04~d ­¸êªlMzܨ„J%¯øM]{Al)*JÃÉ‘Þ7lˆ9Ø%rxÆycáÊHÏDú?47>¼•ËOx#£§õO…‡fÇrýYŸXsËrªÿ L[û\_«¹Õñ­À% Žk鞟%â/PWuG"‘½7+¬Ñ‚,y×ãáP®=ì-÷Y,­-f w×Ùü¥#º€BÄ$mÅýõ)Ö#ý¸Cœ¥«üxòÅj Nm¹ýÜÜ'¤!ûž³à‰*¨Ån‹Š¢að<ÜW‰ô̘w®!ó’ÙGßb{áåFÎüÍ».åc¨Re:)ør‘лô=P91Bá´3™Ãþ¨Â ž¯¢q:=69\%eM)ýñiÅþbDáㄤÚÑ­¹û ’UÚ{Ž©D–%¿mäHÆÜ@Gmuï{|ctñ¢qêVŽˆgÓ)]YS­’”êõsõégI´q ü/Ê€›$»/à¦è³Ý°Ñ.îØg[ÒÁ#Ûû5Y=‚tšŽ—V¦,¾ï:¼ñÔëÅ1¯ìÏw^ÕÕðï\É(Åúa“Èʇ™öš>ŒØËMC´áºk¸‡æˆ2„yíß’ r’æeqÿ}¿dúíÏÁŠyXCü!,TJWl¨ûÞ?5Ï”úK¹˜"im$`h¸ïgq¬¤qÀÙd¨8ã­KúGÂ9ª*_C ¬¾nØÖÑÏS0V^y\ir{+üÖÅæ¸6ÂÇUïóÙý?hƒ½PH!û5ÈÙ{Ñäq–ìM/æçlšÓg7Ô z²·ËiñýЛÄð¢"æãœ§ôˆ_d^ó2 yµŒ¥¥@0 $H†…£c+äü‰öpµ€~–àÙ]pY:;3µú1  ¾¾â¢š!•ÝR]âS‚£’8ãt¹#*õ>¸!~ïè/ü¼ ó5Ð41 °yô6F*¦?Öª%,d¸ÁÎY„€K6w$cvçCLh±‚˜KÕChÂwƒ¢nóƒD-¥²AHI:öÛ\þ1ÜH/S'Ô‰ `F"Jo•î¯0: ~Â/Þ?7¢@žÊ7ç H( ÷gR{ÿ1ÇØ}ªËêšJ=ážÑúWNјG ÇlR[qzзL¼ÎI$’I$‹×‚}ùžç73CwAsž°Ý°pm/RD” Qq¹§(Ô×<Dç¦fffffffXah[‘ÓÖ÷.¹)VåùlóL/¬F°9ì¾;Ñÿ\†Å£Q‘-IÛC S™Д›È‘—¼¿Fk_8Üú%ÑÔÒ,ЀpRÐÛÅYDºÕrc–@’Ϊ#eN|¹Í\R* Öó9_·°7ùó õüÅ”nþ w·,Ç/pG6}/ò±I½@Z[›Sß9eÅË™1ÐÆÞûyŒ ÛÝ>€Rˆ¢¯ÑôÊÔ™(…œ†ñ Úó”÷"ØCw¦]•>\ú-Ť]~9Ÿ•¨<æ‚3&ÂÍ€N†;¨ôŸüpT÷+çž¹â{FÕLÔùÉ ›ü“ò0iqlÔFNxf›¿Þ9p2W×À~M 1Ê_$‚^[š—¤ßŒš/KÖ"Ñ¡“©”"éåJQ,¶ÅÓÿ=H]Íe¤ ï7m`…` ÈPkOãΠhö[p‹òÐÆþQ™Oü^’áÓý~®˜_öÄãm¶Ûm¶Ûm¶ÛS¶°l)KÍ7¦ÿP™mÌtÃÊ$‰ ß„o-m†Hô7Cl^@Yl´t"´IJ@?>X¸—ûášT½ïB8”o¡^Çõ<9¥Íº˜rÞÓk[ŽôSЧÒ}þRk„ãƒçÏ.òHj<m7óÞFïðGzf1(Ѧò»Õ`’®íuÃ÷ ‰pzs—[,‘²ƒ' €‹ «W@6À¨fffffffffffffffff]hï¥äùÓ¹Y)®w‰i÷ý¼`uaËzà6ÀÊÙ^Ì—¦Žãr,rúM2w˜®ÂøŽÂ£ÅÀ‚žòô’ë~©_Xw¤†*av>[ãêÏ‚÷{…ým´Þýt'?E LüÙ;DZÄEá«Ä!YîÄ` Xù¶¹Ð'M9IÍ"ôï6I l)Lú¨ìÉg¤|6\PªäuIì ãNç\I\uq¯iih©fýè1eB‘ÀÍffffffʶÑÝ î M¦ÝÞYÂ7×®‡—IuY‹À­ðyÿ cí+˜§éÝ& &EÔZu¼•Ý|úþÏ@ñÀÊ6’B€¯(©™¹«ÍŸá0#;«88É{ÒD°Ð{à¬Ïß5Ò7€4Ãúz·|´ïÜÛÅ{@ýŸ“ÿ/Á +Iw`EU|Nwå’¯g;ýé¶°€ g±^7sð¿æ«5…†ÍŒ¾µÊï¼¢G‘ö˜-ÅI ‘‘A†žé”ê&®¼dÜ>xÙ27 ƒ ‘41JäÄ“–nžqh¬Ó÷òJ̃DEi ³²„ƒ—îõ;;„m0.,Êæ#~¾‚A¢V?ˆá6€-³„ílT¨+$ä{hÑ?Ø€d º~@gŠc…t±½Š\fŒº ‡”Ræj=…¼[«”'Þ±E.yÙw»bVÌŠ?É|,`¿€M3ö|Z”y‹Vb©\@AG­ C›ÇìˆÉÛðËUUUUUXTŒÂAÇÚ[NV¾fÌþ CQyXáq”Œk-«xÂþOÃàä¢vrfƒÿ,r¶]¼0úŠÖRrt´ÉDMXù8Ëøƒ\tïµ› ja?Þc,f±ú rIêO] bH4êF–*†áõ 1}ãu nEÛYG*¶4ù3.*Íè¶mõ• j[‹šÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌKáìå;ð’¸dïœ^ýŸ^Ü] òMM]‘N ]ÝS™ô7$(¥<'¾þDŠØèÇœ‘‰FÃ=„|éDªùoßÑÖ‹…_¸EûoN»;÷+Ñ b†Ä˜œ5§¾UwÒc?\¸çFRÊ=€”žÀ°®+w«£¥a+!ÂËt…”È+&.™àqÏ>¾}™Û×,Ÿ±Rçò^Óž¿CF¶eR+gEÞ{“ËxÉ›Mñ0{Ctú¶*3Òº•6p›½®aÕÆXk5¶@ž•NãYÚÃƦ¾éJ0”E$ƒœëgéu”1{o‹3¼âÌDÌÓ¨¢Tƒ°`ÝeìnGá¾F¢ØŸ=2ž|ÆI$Ó^lÃb; · ,úv4|¨R¼Ù×npÎéAúuËcî3Ý"yÖÙ¯ÂqêÝòÒÅàùˆ4Ée…æ{µ5Éàç•Éú=ph±n‘h½#5kˆÜSITOv¼Ë?c±‡obøïŸ&¤Ÿšø¼Y¡àŸ˜gEFn@G2ÛuYçD æÇ 2"“Æ7+*¤Ý–”N£½ÑÞá‹ÙänŒÂg`7äP³öý ÌÑ<ž_اxØzŸ`KFÈv‹Ë7+ õº½Ï§&}W 8+ˆKoZXp ¢‰u<íXЬ\À“ôÏîZâ°Ð\þÖrIA ÌAØò=“©×d¬Ñð£áUPY³u OGÍÖì‡c Pß¡CÆ: -zÒF¿µÆ]<…XñjaÄ]%ÒŽÚ©kô ìg]aCìUäým¯ñõ•=µ`n± f™q²¡­Ã¡YòöŒ}ÚÇ–ì,<Ä™g P€ói -yK9aRw§‰Í}Æ#ž¨‡|õ!-Hüwð‡b{ÇÀc±u2FX*/˜·O#I8Jr<ª™Û’3˜€1š_2 &þ\ü<ÀÎ>É}¯C÷º×… ©ñò; qçA³x­Êë•D>4©¼µLRã:Î)ƒ <üŒÂÉp1gøŠ5Lë=g2Ǭ¼w(Å‘²NöíµZg ~&q@/fuË´ÈÈ y0÷1ª¸:‹=:_"¸e0Ðé|ŠÃ‡ª ÝàŸøÜ¸vÈLÂæ!A¾à ÇBj»ý6h›¼Bhn8[%Zð¶R9©5/¾uÍ9"VÃØÜÝFðÂ…lbhHåi‡¨½ÌÜ6ÓU„k]F%C-Ê ÉPtЇ¾Ñ^ñý-ç¡´öЊ|6XW*|Úä¬ÎšÏ:•¸H‘¤_À[ü¾Ç.ÿ ÂP|–û¯7¿ÈË/ÊÙqV}z{ŒˆW*6ã<5ƒânœ¡r²Î“wÅUðFm³Gìg¸}ªèÉ€fô°Mǵ“n^o÷L‹DÛäÚ0óNú•¢è;ö±ð>ßçVu‰gj)»Œ,gpÞìøŒ æ«\’‹ÂŒÈU¨sųИV—ï‚-dâhó5\Ú¹'!á)ÌÚÅY3¢}_n•Ü…vßÚþÛF˜ç`quJ ÷õÅ ø«{¶õ±¶œ=èÄ]æÁA±X„ð1ò‚ÀöCíq¢ð;¯éédM?úg•¸ÿ1–/ÞŽˆþ™MÉ I˜ ôDÔ©™ÖâË• ’ íøÏ6Túõüû¤F•ós/Ô ¦­ºÐÏ9÷–XŠr2zÂ4²ÉÕC<,Çé­ËkÌʲùfÂY¯L/¥äÄ5.`ÚÖ2‘ëgQ¿²¢ã ¥ý»ËøCÎ)ç#˜RÕã(¹%”®¢î]Î<Ä×r$g6È]AåvòÁ×0ØÜ^s-²#â&IÐÕˆ¡l â܆õÆc&Ý’)hWXtü˜PIG.‚*‘éf®÷üaù\––ó1úÙJ¨Q\ßÒ­ëÈ ï-¥Ùúé’*!˜œ?£ 0wØløÐŸçL†…emC OÕC¼(žÖ³I‹§<=d†[9ÁÔ¿bÿwôeöO•·-¿RŸK¨è5Ü kø>bS ‰ÈŒ@‰OÔv·ÕyIÏ~Y%߉ò8¼Ú@M‹fÀÅÜ_š8òò¹hÑïׄ©À¡è¥ÃfHµ^‘aýâd+­öê¼!5¨aÞËÝK"'G/²æ¯»£Ì’xh˜€_?±{ß“þ„¶ÐßG‡«†$ 8€¿ñ,`ü{_ºÓÁðü…èû“’¹Gsúé’ÉyiÊŒÙâú¯©öô}ûzaÅõ#ßS}õmŸíéó¶¾z'êÖßÕµ ø0õã.Ê~ò×-³'Ëß’I¾:þ0ʘNî´»Ë{¶†.kÿõSéðQjÄ6~d(,g}xªYâ,]ø1Ì‚W¯bªQ‘<ý“;ÞýTWáñ÷qšØ‰`Ú\ù@»ŸÝ'Þ—/ÒD[…£,çdªaBùù€“÷œúðnÖ©Q^¶ïô%았²ÊC…fö¬j¢—á ©ÿÍÍ@îçžý )œ»’c‚æ?×RD}»¸O¶‘÷·ÏD™É— ¢S¾£óµ\ Žô†&ɞݮG¸îñÐu¹æÅò¨X=z`:'¥)sÝh¾Õæ óý9w’ÑRÇ)á_¶Á SïÅØ;)ÄPalp•E,³1÷¹oHÜÂAM‰€µP·°AzMEyQxåÅx{OÀzßC+ Õ0¼kÌÑì,‚E‡-£@®,åán5ºçeŽ× B“{S<Ƈ܀ôTo?}<ÒR/æYÍ·rW¥PùPáo:ÚG3Iø="Vý°ÉO÷ƒ±‚Z½ÎyòùSÝ¢^ŵ3pF‡Q̩ÖzÿHÚ7~yíà.U+ Q ¶Ý0Q#_'í{µ_þ?vÌòü"=«]ŠøŠ¢Ø‡Äzþ†#4ø=‹àœƒ!¦¹¥sËù¶úLW¶AÀF‘Öõ6[÷½bÉ/µ³ÈAÁŽ|ö_J´)@o{WÃúq0zÑÿy^4†a›pµ!î}+ 4û‹JÏŸ)fºHõV6Ç©ìz`0&Y–fe½ëO-~qj>öH§ζüòpæ0õ¤gSÛâ¬E€tyÉùR~3={W£àuZ™À=á[DZ£ÓçIRŒ¾V8¶IõÑjè[b&ëCιð§䦋 gл6‡TÖ9dÔ{0äšÿÐÎÙV—$…vlê™–c4®[N³ ‹êZ•û|·¯±ŠíY>‹3!60­ ‚"¹Œ­=ãû=šøyÀ°¨‘¼›?Ï÷ÂV0<¸"ÏãÝž‡¦n–Ӆ)rã›;â`ÌÉjÔÜq÷‚ö4+Fñkƒ†Ä³6lôåÎ$á#CWňÐÓ—'É.¢Q+uÉÊïâe;µë’ ûGˆÌÉ…e"Ýl{¨°ÍòD–M8?ÓƒÒ oa Éï}ŽŠÆŒ0a7õÚ`FKè'‡Ó(L…=EÝÙ*çUÁ bš=DV¢`KKî/TnM£nJ+2öYÿ £þB-y>‡2V5—Ÿ¬¤íKvö£“¼ø±kE3í6r°>ÑYRÝà˜"ö† † ÈÁB¬zhJ_©Š¦J\.ü"ØB—óm £HNP ¹Oý»ón_–‡ûý÷ ðO­wÝä²ÈêJ#1³„A„r÷öú©ßä[Ê&†¬Ì,‰Uëô{"«ùá.ñéßO0R/œ:ÍÌÅÜò¥)>Èn¶ü,7б:ž!aý[Ï™…ªIÙØ™ÖÁ,þ‰'UO ±Q<"eFD†îg"‚m‡lÔŽ~ óƒ¥ûg^f?aÕ,DPSîJþJ˜V…‘¥„Ó\C"Åüãcee˜gWLÔi¼tãö#ŸLfoM×Ð/ÁS„›í}‰#˜{f}ȸGu¤·ŠÐ‡¹•hÌ€£½…XîR‹j?cˆö68Ë1Ä­”¥ußL9;~ø;ð˜µ6CNþšKitÒ1$îk ñŽw„;“*“ðNÝø&}}ÝÖn˜‰ä´ÚyV Š-¨>=Rx” Zäá—L]zð„Ácâ8|ÄPŸª»Y˜êl\í÷Ê¿xϾ«è[øP:Èù¦RN3̓{qKÑ +ÚëÀÑoùÉBâŸÒ*ZÄ>%Ÿù;µ ö]³È<‹„ÕÏ\žŸ‚¡M­Ø±ÌUš–zÍZ—^•“îADâx óá#_¤@Hd¡‚Þ¼·>qÁõdµ„©«048ê²w6¨PÀΰéi ØkÎEnÛΔKg—1ag%Ð#˜¼®E¾åå†~΂£ZÛ<ÄHÌcúiÜ•"ìCqÓUÄVy” 3U¸ÙÕÑ•õJz6±Mn Q‰~у®çò›¯c’âuiQ¦•½Õï1[&å·ûǿĽ``‡,g°“Y«ÑJ]H¥užÑ„ÕP™-§lÒîË­“” ý˜.Ã-vjúI@$ësäUÉAx=ëfŒá4AõÓÏs»‹LÖÀPܳÕ>ÝëhD`xoä8Û13.ìZ°IÑËk:jasWò¹Þê`± ju=¢¸rGau­žl>v‰3ˆra•«óî€UÿK¹íй+òI2­h,Ç=§ðDÙõ"·Ý-V_UIÆÌ ‚ê×Vx…ŽÚc>O¶$ä±¹ô7šßµÝûœè»ü„JŸÈUñ® 4;:wXYÏa0 ‰¯"yEkŽi¨èN.Cšü“‘d³Ó¯>бñ ñÀ(1ãšÓ%,ìÍø¤/7;e°‡WD•:þ?­›Þ0ÜÃeyhFFò %⃈ þX<']Ä„õÐ:—m[ëkÅÙ"À¡žcüQ°QI© ¸s.áÜ:â•—|æ‡9+aë›éÆÑ€±,Âw ¸ËãVÙ R¾D¨0f)µÿÚ‰©ÓŽT÷›Â{‰‰=® !uÁËB)زgHÝ«8[Ó¬~e>k©X\gzÝ¡èC8Wsß4Òa*¼‘‚ MžJdí?®•Ôö¾ÎP n-õ)Ä9öÌA*EÖQ9Ö]6íñ`•ús ~<û=tn1“rÆo¹Ò:ÞÎ,+tc¤à Pãü'ãûª{Ñ™q —êžýô|Q¨–Ž) d¡ŒoÃCPî e÷œ$ê®ËæH±L Šóþ TÂAeqqe¢á% Þšú‹=èÑáH*3ÿ™’>DB÷tœ·4O“„Ë?~|»ú_Ëu)Æ-£ñ³IRЧ?’,‹²º Bã˜VG[3 ËÒäurQññœtŸÁÊ4(VkèF˜Ú§V-£@¯d6#§Ü^Æ‘ˆ–5˜Xon66°ˆpžwRz”4œ['²¸ ´82Ô‘’;¯4¿Õ5õ<òÒ7?ÜT‰ L›õ‚­'ïa÷YHHùH·ÑCÒ7ì߉Ê}0)û1¼ÿ7¾÷½½NÒ6[ˆî“†9–txÃÔ!·ŒrŠA>…ÂÚêîBïÉ–«¿Øø«ˆìgþˆísAEßaS¦ñ ZÞ`Ã0èÄ4fnýõ?ríŽ{-æÉ “©ËHAÿ"ï¶M˜å'½AºeWb»†w×ãý<Ž`¥2Eî„ËOqèNH¾4I{Y\e’˜ÌÄP  ¥Šª|Á7p•`6ë¬Jö@Èø1Ì‚W¯bªQ‘<ý’­4|­bõlÓÓ–±T÷æXNõä!`Ý=† ‡mGCBåµMàŽ©Q^¶ïô%았²ÊC…fö¬j¢—á ©ÿµ0Uà=Â-d–%ðΘv¸ Á=?ï "öû9 ]X·”·éa‰-¥ê%+ Š0»æ<¾*“w^,ùUTpÇÛªpÓq³£w³"øû+¬¢¶ ¸—+ëZB£E™I6‘¸:%òï„ëO9™È<-=¢ã Þû½Z®Õ|䆅Ã8f &n÷•Ç^lŒM%:’Ò j:{/ûߨõpQèÿ:*Ä'sî{T•»÷òøqQ›ÕŽL"4¦w$ÇÑ?&o– Ó&VÙãцÀîH©ß³þß±.Ø¢Ú¦'„`IÈÁšTB²tm8´>,ËmMG½}ïF@ǦƒAÌ0'2ÇBØô{ö3*Æ´T%- œ{Hö!÷v2 !ÂÜÛÐôœ¶3 Í`ªî."GŸÓ[ô;ß—Ê$¸åøIMµ,À.‹Z2µÕŠÆBS®XðÅV¶©8vÐà³ñìW°@>ê ®fÔiƒøÿ±h&û„)./Þgr¤Õ,§N}Ú;}ðhwå >ªÐÉ C¯=<ËÛ¦'û”²Êàräjç›™è „qd =eum[N³ ‹êZ•û|·¯±ŠíY>‹3!60­ ‚"¹Œ­<ñC°-æëíNÁ‡9CÒŠoÔéµ§ú:_çý—,©Ìp2‘º.¬EÛ4?ó…@ƒå¦MÆ:¸(˜WÛ¬NÃkä­¦)µvçU³/48u4 ßýÃåæ1É„\_4ͶÍòá-rÌm§r Â…ù®%H²àÀ"`ZAy˜äÖÑ  ÚÅ?¯’` %Úœ€'¼¾¸î('çk¾œòd±Ô Ìt3Gîàäø²þïdXxˆ6³áÉyƒ2É5í,ŽŸ$¤_9¬q^K‚HÝ_¿BЖЦw§è†àSxÅ¿—§ÈMˆî÷d¨pä´T7„%¨uÛÍpÑà " UAÛ1™H­pm6Ÿ2{ &›áOŽMÒÐÊ–IÔ³²æë$2±·“kä@jŸ¹W)DyúÎ`Úqñ>Ù6‰¿Âþ4¡‹ °°Ñ ½ƒø&}}î‹…4‚a#Ù(DHãƒCÆøŸ$“\Â~8l%…ì±nŸLƆµCß ãå!føP:Èù¦RN3̓{qKÑ 7z’%ËŠ¶K±F^¿n“ø/I½cWk/ù0—x|½×4^æ$®=ÏÙ—‚<G ƒçJôC¨–Ǚ㳆"Õñ«048÷„Ýûä³rŒy¼@ w‰Uéú7o´ÊÒŽÏ\ ©ênIÀE¦bøŒx×U{·'…ÁtĄ۾¼è ñBZ‰¥Õ¶´¦b0'Å&r¿1 R f)±%]à°©®j·7ÜÊܶQ«/:è´$Ùç~wA…¼Ä÷Ô×þ¸r‹Ù…®1Jº\"¿®Pi3 j]°ŦÜ!YKm„ÚÈAN÷É<Í# Ö ¦ñÀ(1ãšÓ%,ìÉ;æ—¿ …Löý'a7ú˜}<¨û*ª;\%*¡.#jÐm?©“/&YœlÌu›hŸ¹ƒI\ÈvGÊ×¥¢øÎŸ`\ÎÂû éœíýÜfp2Ž ˜—A÷ôšŒ™•2-t;rÍ5´˜)'¹ïC›Ï6ï;ÄŠtÕüË“¶ŒÂ¿¯r2`{ŽÒÅï<ö5’ó‘[»õ‰îKôøšu©û¶ ý›bKì¡No3hHiçhAJ“ˆ£f)3¶ (€v<›–Ëfë!$w÷ŠÜ‚ÆL™”ó»ö¿@7 ý—0Q¥K?aŒ_ì­ù"îÀ’(¦m hZ\ “ üZÄϪÄ,r>Ò4òÅÒé‡y áÆC®¾ÿ6&dhP>Ù³Û4?¯åB$Ê£àíR¬¦º0É^®¥¤ qnc6Ùß+a)L¬q6nÀ¸n-¿B‹Èí©e¸²Ú@ n¸ÿOíøOD’8Ê£y” ãqV×t1>øŽYR’Wê¿o»,w!7 ïÈúgTU¥Å‹J 70ñ è|rÊBt=±qÀ‚ý®V>@o&*h+én+PSس¢>渥B/g¹§ò¡†ZôÒ”¬OmëOj:çM1é—µcì=#Çš†©Ð]zE@àß'ÏüÎ*Ã÷9<\Þ¨qZ†ð¬×ÂÊòÀ<¼Ô|¾ø4ÊŲk4Îw†ßƒtáü`õYKŸ¼—%È©+¡õ[ xŒ!à§Ô ò•BƒvÀí\7PÝšc“m$Ñ>[¶$ñRºµ¤õÊe×[×Ô:jܤ¡ïÑ×±K¹þ uAuMÂèz·IÏ€7ísAEßaS¦35ô^3Eé ç3uî£`Nb¶ñÆk\ÐBS‰Šga® ¸Ab ; øæƨ(q…¨Vøi¸N2ÃO’ŸÃSH32=ÑöüŽ»ožõð!Q`¾n‘ä²Õ ¾™"iº2vx?~ü Áçvk¾‹¸ÌÄ D%¬S-ñÚ®‚Ƙ·ªÂ\'†O¾ÚHÁý_1aÇ©¶Se• 3”©¹SåÁédñz>«c2¨½%>k‡<àKXXÍ>žsg¸²‰Óëâ‚nTƒÇ¼fŸXô<Èß1 ]R#Zâ Ð!ß;áj¼×Èã“ 7»-á¡ ÒüyïU9-Ô´;”2O¸¿çY [/œá¦Â“A‰MJBg(‚%cª9Xî  ³dw@Z›¸û.à¨þª]Y’PGz“.“´KMù¿Å É·áKË\&:OÒ¦ «r¼Ì÷DÇãö«þÕïÛF~Úµö£þÚGöÓX~ÑÏÚ9ûQjxÑQÿm½qÌ,ÅöãÊ9vPFmøôÍ«_ÿ!¯ ¨­3#nœËë-ýj›v"à$ÿs->ç „¿09NMÞ:Â2à „NhŒÆó1òcß· “mÙaÙ Azâ?}d>ãQ»%Ú B<[)F¨M‹€åÂi•du1ùùP”Ŏÿ~zLª¬á[uó|ß7Íó|ß8êºBžvï;DJœLùøIË~7Æ¢6Eñb•h%?íûâ:ÅÔjû2!G³v€Cè¯úÞ Çw¤u݋͖éž©™ÈBVI5ù7g¦YhªÎ µØ;Ø€J—I­>1ªýdVR½#d¢ðn)pñ^"ªo„o&{0………ÃË&œs½5‹ Y<‘¶ÁGc6$œi1Ï÷Áu¬þ³,þ0ƒ©|€¬Á¾#àè,-!<tí¥U “?ýª@Tmo[ †Ãa°Øl6X«´’ÿy|ÒI2N|°ùøIË~7ð‘cƒ_n–:(ᆲìC€Dƒ²EÏíDzJ¨@¨€º f`§¶ÆoRŠø|9NÙ2yAÍд³äOÍ0FÁ/æËOYË ÒždÔV*æ~YÑlþùŸÂà­x ˆÀÅþ†tH7 ˜üÙ\ñíëþÂf!s­ÿrž¤%`’víÕ·ß=Gb fÂóØkÑEŽÌ¶:~¼â–9U)ÁÄÏx¯xðÖC½qÈQÞœsíü^õ‹ÏŸþB%&Ùó]s{¿:þ˜9'•Ä€oBÏ€%Ä÷9ºc“’éø=Ôoù½Ójœþë3ÇPåFH"ȱtÕVÃ¥gÅô…ÿ¦hBhZ¦ÂAw6þú“:ì´GXƒ(H5>KVÂùU í¦°ªë¯ÕšüŸÃ{n@Zº1¢eðãÃ`HTÙ +¢BJXUú½H‚ HŠL‰ªõƒb숨+kabß¶ÿA¡÷µRúܹ}ÌÔ¨$£óK-¹ ÝCÉ@ Uˆ¤0L½\³3æíÞ'î’Í¥é0:Ne Aî:˜‚òØ&f2xz-DòúïrÁÿ)xÀ|‘t]kÚû/¥ gÁ L§¸»š¿Úœuô>aƒcA5n %/%Lf I¶!&rj"ЙCG„ï]tÖZÃáÎ'Ñ ðXgÖý"·õ8Nh¡I ônd–û>ƒÙMÕ\E3+Èíëq†ijÆà™ï±èSÓ ë÷6L¤6¦3W`²b(e_ü2©¥"¯%ÿ$¥ò꘱|Ç ´é¾Ò4±(üÄºÇæ‘¯±FÅÔ¶bhùXºOU§¼Ù÷º™§æºÝ_0¹Hì.§|øÎN~ZB 4*40) + if (GDK_IS_WINDOW_IMPL_QUARTZ (drawable)) { - if (GDK_IS_WINDOW_IMPL_QUARTZ (drawable)) + GdkWindowImplQuartz *window_impl = GDK_WINDOW_IMPL_QUARTZ (drawable); + if (ms > (4*GDK_QUARTZ_FLUSH_TIMER_MSEC)) /* first update in a while so immediately flush */ { - GdkWindowImplQuartz *window_impl = GDK_WINDOW_IMPL_QUARTZ (drawable); - [window_impl->toplevel flushWindow]; } - - prev_tv = tv; + else + { + window_impl->needs_flush = 1; + } } } - else - prev_tv = tv; } void diff -urp gtk+/gdk/quartz/gdkprivate-quartz.h gtk+664894/gdk/quartz/gdkprivate-quartz.h --- gtk+/gdk/quartz/gdkprivate-quartz.h 2011-11-23 20:43:12.000000000 -0500 +++ gtk+664894/gdk/quartz/gdkprivate-quartz.h 2011-11-29 03:36:34.000000000 -0500 @@ -24,6 +24,8 @@ #define GDK_QUARTZ_ALLOC_POOL NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init] #define GDK_QUARTZ_RELEASE_POOL [pool release] +#define GDK_QUARTZ_FLUSH_TIMER_MSEC (10) + #include #include #include @@ -163,6 +165,9 @@ void _gdk_quartz_window_set_needs_ void _gdk_quartz_window_update_position (GdkWindow *window); +gboolean _gdk_quartz_window_traverse_and_flush_main_window_stack (gpointer data); + + /* Events */ typedef enum { GDK_QUARTZ_EVENT_SUBTYPE_EVENTLOOP diff -urp gtk+/gdk/quartz/gdkwindow-quartz.c gtk+664894/gdk/quartz/gdkwindow-quartz.c --- gtk+/gdk/quartz/gdkwindow-quartz.c 2011-11-23 20:43:12.000000000 -0500 +++ gtk+664894/gdk/quartz/gdkwindow-quartz.c 2011-11-29 03:36:34.000000000 -0500 @@ -34,6 +34,7 @@ static GSList *update_nswindows; static gboolean in_process_all_updates = FALSE; static GSList *main_window_stack; +static guint flush_timer_id = 0; #define FULLSCREEN_DATA "fullscreen-data" @@ -874,6 +875,12 @@ _gdk_window_impl_new (GdkWindow *win GdkDrawableImplQuartz *draw_impl; GdkWindowImplQuartz *parent_impl; + if(!flush_timer_id) + { + flush_timer_id = g_timeout_add(GDK_QUARTZ_FLUSH_TIMER_MSEC, + _gdk_quartz_window_traverse_and_flush_main_window_stack, NULL); + } + GDK_QUARTZ_ALLOC_POOL; private = (GdkWindowObject *)window; @@ -3115,3 +3122,64 @@ gdk_window_impl_iface_init (GdkWindowImp iface->input_window_destroy = _gdk_input_window_destroy; iface->input_window_crossing = _gdk_input_window_crossing; } + + +gboolean +_gdk_quartz_window_traverse_and_flush_main_window_stack (gpointer data) +{ +GSList *mws = main_window_stack; +GSList *tops = NULL; +GSList *dirty = NULL; +GSList *iter; + +while(mws) + { + GdkWindow *w = mws->data; + if(w) + { + if (!GDK_WINDOW_DESTROYED (w)) + { + GdkWindowObject *private = (GdkWindowObject *)w; + GdkWindowImplQuartz *giq = (GdkWindowImplQuartz *)private->impl; + NSWindow *nsw; + if(giq->needs_flush) + { + giq->needs_flush = 0; + nsw = giq->toplevel; + + if(!g_slist_find(tops, nsw)) + { + tops = g_slist_prepend(tops, nsw); + dirty = g_slist_prepend(dirty, giq); + } + } + } + } + + mws = g_slist_next(mws); + } + +if(tops) + { + g_slist_free(tops); + } + +if(dirty) + { + iter = dirty; + while(iter) + { + GdkWindowImplQuartz *giq = (GdkWindowImplQuartz *)iter->data; + + [giq->view lockFocus]; + [giq->toplevel flushWindow]; + [giq->view unlockFocus]; + + iter = g_slist_next(iter); + } + + g_slist_free(dirty); + } + +return(TRUE); +} diff -urp gtk+/gdk/quartz/gdkwindow-quartz.h gtk+664894/gdk/quartz/gdkwindow-quartz.h --- gtk+/gdk/quartz/gdkwindow-quartz.h 2011-11-23 00:19:24.000000000 -0500 +++ gtk+664894/gdk/quartz/gdkwindow-quartz.h 2011-11-29 03:36:34.000000000 -0500 @@ -60,6 +60,9 @@ struct _GdkWindowImplQuartz GList *sorted_children; GdkRegion *needs_display_region; + + /* experimental periodic flush code */ + unsigned needs_flush : 1; }; struct _GdkWindowImplQuartzClass gtkwave-3.3.86/contrib/bundle_for_osx/gtkwave_bin_launcher.sh0000775000175000017500000001527213166335473024003 0ustar bybellbybell#!/bin/sh # # Use this to launch executables from the bundle # on the command line. Example: # # gtkwave_bin_launcher.sh vcd2fst -o test.fst test.vcd # # gtkwave_bin_launcher.sh only needs to be in your path, # for the gtkwave bin/ executables, use the name found # in bin/ only, no absolute or relative path prefixes! # # dash arguments might need to be specified first # as above for some executables as GNU getargs is # not used for OSX. do not assume full dash # argument names are available as in Linux! # if test "x$IGE_DEBUG_LAUNCHER" != x; then set -x fi if test "x$IGE_DEBUG_GDB" != x; then EXEC="gdb --args" else EXEC=exec fi export OWD="`pwd`" if [[ $(echo $0 | awk '/^\//') == $0 ]]; then export NNAM=$(dirname $0) name="$NNAM" bundle="$NNAM/../../.." else cd -P -- "$(dirname -- "$0")" export NNAM="$(pwd -P)/$(basename -- "$0")" name="$NNAM" tmp="$NNAM" bundle=`dirname "$tmp"`/../../.. cd $OWD fi bundle_contents="$bundle"/Contents bundle_res="$bundle_contents"/Resources bundle_lib="$bundle_res"/lib bundle_bin="$bundle_res"/bin bundle_data="$bundle_res"/share bundle_etc="$bundle_res"/etc export DYLD_LIBRARY_PATH="$bundle_lib" export XDG_CONFIG_DIRS="$bundle_etc"/xdg export XDG_DATA_DIRS="$bundle_data" export GTK_DATA_PREFIX="$bundle_res" export GTK_EXE_PREFIX="$bundle_res" export GTK_PATH="$bundle_res" export GTK2_RC_FILES="$bundle_etc/gtk-2.0/gtkrc" export GTK_IM_MODULE_FILE="$bundle_etc/gtk-2.0/gtk.immodules" export GDK_PIXBUF_MODULE_FILE="$bundle_etc/gtk-2.0/gdk-pixbuf.loaders" export PANGO_RC_FILE="$bundle_etc/pango/pangorc" APP=name I18NDIR="$bundle_data/locale" # Set the locale-related variables appropriately: unset LANG LC_MESSAGES LC_MONETARY LC_COLLATE # Has a language ordering been set? # If so, set LC_MESSAGES and LANG accordingly; otherwise skip it. # First step uses sed to clean off the quotes and commas, to change - to _, and change the names for the chinese scripts from "Hans" to CN and "Hant" to TW. APPLELANGUAGES=`defaults read .GlobalPreferences AppleLanguages | sed -En -e 's/\-/_/' -e 's/Hant/TW/' -e 's/Hans/CN/' -e 's/[[:space:]]*\"?([[:alnum:]_]+)\"?,?/\1/p' ` if test "$APPLELANGUAGES"; then # A language ordering exists. # Test, item per item, to see whether there is an corresponding locale. for L in $APPLELANGUAGES; do #test for exact matches: if test -f "$I18NDIR/${L}/LC_MESSAGES/$APP.mo"; then export LANG=$L break fi #This is a special case, because often the original strings are in US #English and there is no translation file. if test "x$L" == "xen_US"; then export LANG=$L break fi #OK, now test for just the first two letters: if test -f "$I18NDIR/${L:0:2}/LC_MESSAGES/$APP.mo"; then export LANG=${L:0:2} break fi #Same thing, but checking for any english variant. if test "x${L:0:2}" == "xen"; then export LANG=$L break fi; done fi unset APPLELANGUAGES L ## If we didn't get a language from the language list, try the Collation preference, in case it's the only setting that exists. #APPLECOLLATION=`defaults read .GlobalPreferences AppleCollationOrder` #if test -z ${LANG} -a -n $APPLECOLLATION; then # if test -f "$I18NDIR/${APPLECOLLATION:0:2}/LC_MESSAGES/$APP.mo"; then # export LANG=${APPLECOLLATION:0:2} # fi #fi #if test ! -z $APPLECOLLATION; then # export LC_COLLATE=$APPLECOLLATION #fi #unset APPLECOLLATION # Continue by attempting to find the Locale preference. APPLELOCALE=`defaults read .GlobalPreferences AppleLocale` if test -f "$I18NDIR/${APPLELOCALE:0:5}/LC_MESSAGES/$APP.mo"; then if test -z $LANG; then export LANG="${APPLELOCALE:0:5}" fi elif test -z $LANG -a -f "$I18NDIR/${APPLELOCALE:0:2}/LC_MESSAGES/$APP.mo"; then export LANG="${APPLELOCALE:0:2}" fi #Next we need to set LC_MESSAGES. If at all possilbe, we want a full #5-character locale to avoid the "Locale not supported by C library" #warning from Gtk -- even though Gtk will translate with a #two-character code. if test -n $LANG; then #If the language code matches the applelocale, then that's the message #locale; otherwise, if it's longer than two characters, then it's #probably a good message locale and we'll go with it. # if test $LANG == ${APPLELOCALE:0:5} -o $LANG != ${LANG:0:2}; then # export LC_MESSAGES=$LANG #Next try if the Applelocale is longer than 2 chars and the language #bit matches $LANG # elif test $LANG == ${APPLELOCALE:0:2} -a $APPLELOCALE > ${APPLELOCALE:0:2}; then # export LC_MESSAGES=${APPLELOCALE:0:5} #Fail. Get a list of the locales in $PREFIX/share/locale that match #our two letter language code and pick the first one, special casing #english to set en_US # elif test $LANG == "en"; then if test $LANG == "en"; then export LC_MESSAGES="en_US" else LOC=`find $PREFIX/share/locale -name $LANG???` for L in $LOC; do export LC_MESSAGES=$L done fi else #All efforts have failed, so default to US english export LANG="en_US" export LC_MESSAGES="en_US" fi CURRENCY=`echo $APPLELOCALE | sed -En 's/.*currency=([[:alpha:]]+).*/\1/p'` if test "x$CURRENCY" != "x"; then #The user has set a special currency. Gtk doesn't install LC_MONETARY files, but Apple does in /usr/share/locale, so we're going to look there for a locale to set LC_CURRENCY to. if test -f /usr/local/share/$LC_MESSAGES/LC_MONETARY; then if test -a `cat /usr/local/share/$LC_MESSAGES/LC_MONETARY` == $CURRENCY; then export LC_MONETARY=$LC_MESSAGES fi fi if test -z "$LC_MONETARY"; then FILES=`find /usr/share/locale -name LC_MONETARY -exec grep -H $CURRENCY {} \;` if test -n "$FILES"; then export LC_MONETARY=`echo $FILES | sed -En 's%/usr/share/locale/([[:alpha:]_]+)/LC_MONETARY.*%\1%p'` fi fi fi #No currency value means that the AppleLocale governs: if test -z "$LC_MONETARY"; then LC_MONETARY=${APPLELOCALE:0:5} fi #For Gtk, which only looks at LC_ALL: export LC_ALL=$LC_MESSAGES unset APPLELOCALE FILES LOC if test -f "$bundle_lib/charset.alias"; then export CHARSETALIASDIR="$bundle_lib" fi # Extra arguments can be added in environment.sh. EXTRA_ARGS= if test -f "$bundle_res/environment.sh"; then source "$bundle_res/environment.sh" fi # Strip out the argument added by the OS. if [ x`echo "x$1" | sed -e "s/^x-psn_.*//"` == x ]; then shift 1 fi # export DLYD_INSERT_LIBRARIES=/usr/lib/libMallocDebug.A.dylib # export MallocScribble=YES # export MallocPreScribble=YES # export MallocGuardEdges=YES # export MallocStackLogging=YES # export MallocStackLoggingNoCompact=YES # export NSZombieEnabled=YES # export MallocErrorAbort=YES # export MallocCheckHeapEach=100 # export MallocCheckHeapStart=100 export EX_NAME="$1" shift $EXEC "$bundle_contents/Resources/bin/$EX_NAME" $* $EXTRA_ARGS gtkwave-3.3.86/contrib/bundle_for_osx/Info-gtkwave.plist0000664000175000017500000001413613166335473022677 0ustar bybellbybell CFBundleDevelopmentRegion English CFBundleExecutable gtkwave CFBundleGetInfoString 3.3.86, (C) 1999-2017 Tony Bybell http://gtkwave.sourceforge.net CFBundleIconFile gtkwave.icns CFBundleIdentifier com.geda.gtkwave CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType APPL CFBundleShortVersionString 3.3.86 CFBundleSignature ???? CFBundleVersion 3.3.86 NSHumanReadableCopyright Copyright 1999 - 2017 Tony Bybell, GNU General Public License. LSMinimumSystemVersion 10.6 CFBundleDocumentTypes CFBundleTypeExtensions vcd CFBundleTypeIconFile gtkwave_files.icns CFBundleTypeName Value Change Dump CFBundleTypeOSTypes VCD CFBundleTypeRole Viewer LSCanProvideIMVideoDataSource true NSDocumentClass LPgtkwaveDocument CFBundleTypeExtensions evcd CFBundleTypeIconFile gtkwave_files.icns CFBundleTypeName Extended Value Change Dump CFBundleTypeOSTypes EVCD CFBundleTypeRole Viewer LSCanProvideIMVideoDataSource true NSDocumentClass LPgtkwaveDocument CFBundleTypeExtensions lxt CFBundleTypeIconFile gtkwave_files.icns CFBundleTypeName GTKWave LXT/LXT2 Value Change Dump CFBundleTypeOSTypes LXT CFBundleTypeRole Viewer LSCanProvideIMVideoDataSource true NSDocumentClass LPgtkwaveDocument CFBundleTypeExtensions lx2 CFBundleTypeIconFile gtkwave_files.icns CFBundleTypeName GTKWave LXT2 Value Change Dump CFBundleTypeOSTypes LX2 CFBundleTypeRole Viewer LSCanProvideIMVideoDataSource true NSDocumentClass LPgtkwaveDocument CFBundleTypeExtensions lxt2 CFBundleTypeIconFile gtkwave_files.icns CFBundleTypeName GTKWave LXT2 Value Change Dump CFBundleTypeOSTypes LXT2 CFBundleTypeRole Viewer LSCanProvideIMVideoDataSource true NSDocumentClass LPgtkwaveDocument CFBundleTypeExtensions vzt CFBundleTypeIconFile gtkwave_files.icns CFBundleTypeName GTKWave Verilog Zipped Trace CFBundleTypeOSTypes VZT CFBundleTypeRole Viewer LSCanProvideIMVideoDataSource true NSDocumentClass LPgtkwaveDocument CFBundleTypeExtensions ghw CFBundleTypeIconFile gtkwave_files.icns CFBundleTypeName GHDL Waveform CFBundleTypeOSTypes GHW CFBundleTypeRole Viewer LSCanProvideIMVideoDataSource true NSDocumentClass LPgtkwaveDocument CFBundleTypeExtensions fst CFBundleTypeIconFile gtkwave_files.icns CFBundleTypeName GTKWave Fast Signal Trace CFBundleTypeOSTypes FST CFBundleTypeRole Viewer LSCanProvideIMVideoDataSource true NSDocumentClass LPgtkwaveDocument CFBundleTypeExtensions gtkw CFBundleTypeIconFile gtkwave_savefiles.icns CFBundleTypeName GTKWave Save File CFBundleTypeOSTypes GTKW CFBundleTypeRole Viewer LSCanProvideIMVideoDataSource true NSDocumentClass LPgtkwaveDocument gtkwave-3.3.86/contrib/bundle_for_osx/gtkwaverc0000664000175000017500000000012513166335473021172 0ustar bybellbybell# # Empty. See ${bundle}/Contents/Resources/examples/gtkwaverc # for example file # gtkwave-3.3.86/contrib/bundle_for_osx/gtkwave.icns0000664000175000017500000023016113166335473021605 0ustar bybellbybellicns0qis32 ¿ÉÍÉÍÎÎÒÖÒ€ÏËÐ˼]JfMI\K8M[IOhHe¾'NaMcI'(¾ 4|;4?{ 4+¾H,B*Oa *!eJ+B*P¾. 9QPUK ; 8¿.R1 6N1)¿$+W#%X./¾K6:Q`6?2?6cMr<3S¿ !K- 3F"+¿'X W$'¾4Bd1%'.f>=½FP^%=3-4<%bKO»-0}5+*>{*5¼)F[  _?1¾gJj\ZogWio[_lJpåôøò€ùýÿýúûúõü÷çs\‰`Zw]>awYc‹Y}ç$B…¤ƒ¦|C2è'Q!É^ReÈQ5çlMmFƒ¡6F8§zImJuè?\ …ƒ+*-‹z^Ké%K†PX€N3é0F,Ž902<&J>èn[^†YxgRgY¢aWwê(5{J*05%Tt5 6ê#>1$**90èI*j£O;@J%§c'Sçi$ƒœ=fUKWd>¢z#sãKFEMJELNGHN?Ws8mkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿil32 ×À»¸¸¹¹»¹¹€º»¼º»½¼‚»½»¿ºº€ÅÄÁÅÆÂÆÂÄÈÇÃǀȼÂ9B;JmD>?A;\f?DACAjV<@@>KmE>@A«ÆŽ>#06>¢Å K z|qrrsqq K ¥ÆE2–†Ž‹ŒŒˆ’ EE¤ÆG TŠ7 AAG¤Ç G tw,3e G ¥Ãž@GDEDJ^AHEGEI?iˆDFƒEG¬Ä›4<7FH‚G¥ÇE #–'<]E&”F ¥ÇDG‡,9A2E¥Å–&+D*qr<> #!#!B5c/D&!#$ªÃ KQOMEOOŠjKKFP€OPEMJt„LODNOOQ¯Æ” I,0 5<@0 @Ž G©ÇL<Š*9?!’%K¦ÇMdn):A €MM¦ÇJ€K(:[AaoL¦ÇC‘&):B;‰G¦Ç‘ =?Œ ,;B!4@§Äž>E>E=q>EBDE‚CEDCDBˆf>D?CE®Äœ6? E& OzYa8HªÇ 7#17 7¦Â¦[eajƒf_`a]t{^b`b`€p^cb`l…ieeb´»½ÊÇÈÇÃÉ€ËÌÉÇÍÎÉÌÏÍÉÍÍÌÎÁæãÞßßàã‚àããáâåäâãåâ èäèõôöóíôõ€öðî‚õïò÷õðö€÷êíÂFRH_™VLMPG~ŽMUPTP–sHPOJ`šVLOPÔò°k =T^-k Éñ² !x #ÆÈ·¹·¹·Î· !x Ìñ±rRøÞéåææèáð6r YËò±u ‰âZjëj u Ëò³"t¿ÃG SÓ¥#t ÌìÊlspqqprpyæšjwqtqxg«Þosp‚qsÙîÆW`[br]aT‡æwj€\[_h„èuX^`r_\]_×ò±v †Æ?cj>Úbu Ìò± u Ñ2hr&²¢uÌò±s èR4fs vÔt Ëò² r9õ@c q(>ò!sÌó±ptÝI]k2ìS"q Ëð½1=3GpE)ºº#be4:797lW*Т%Mp?79:ÓìÎ~„‚~p‚â®{{r„‚‚ƒpy¾Ø}o€‚‚ƒÝñ¹*5w%HìOXb'"&#jNié04u,"%&Ñó±}bâ E^h7ï< { Ìó² ~¤µD`j4Ò~ Íó²x ÒzB_k1Ÿµ | Ìó²n.î>C_<k1aà%t Ìó³)chå G` k6,éUi ÍîÊiogre¹Ófrlpq‚nqompmß§ephnpÛîÇ[fcmm×­Tg]ln`b€api]gUÀÉhlddbÙó²zîM G^j6 lëhÍó´"5D¨Þ H`k7 7è–=7ÏòµÇÿíúÀE]h4 Ööîÿ§Óò¶m˜”Èi Lc  To; ÅœXÒô±a >V`.a ÌíÍo}w‡±tuwo—£qxuwuªqywt‰³ƒ||wÝæëúö÷öïø€üþ÷õþÿöûÿûõûüüÿî›”’’““”““€”••”•–ƒ•–•˜’Ž€—–•—˜—–‚™—˜‚™—™˜x-3/5A31120;?23A:12216B4224„›m €}šn  01‚-2- ›n825426 ~›n 46œn,-1&›r‚5#€'3„›q55œn-€2œn-!  )%œn5 1œn 8 8€œn3 6œp  ++  0% ›s 4(‚,2 ƒœo  6 €5   œn4 7€œn&* 0€œn0 $*€œn 7: 4€œo 5 6€›s+0‚3'ƒœr1(‚,.ƒo7 6œo '4  6# ‚œo.:58+ 075<%‚œp&&1!1$'ƒn €€š€HMKNVM€KJRTKLVQLMMLQYONNMŒ’š™šš˜šœ››œ›€žŸžŸ€ ŸŸŸžŸ”l8mkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿit32qÿ‰¿“À•ÁÁÂüˆ¸’¹“º»ººÂ»½½ˆ¹“º”»Ã¼½½‚¹‚¸ˆ¹‚ºƒ¹Œº‚»ºº‘»‚¼“»‚¼»¼½½‚¹‚»‡¼ƒ»¼»¼Œ½ƒ¼½‘¾ƒ½‘¾ƒ½Œ¾½¼½½¹¸¶‰·‚¸·Ž¸‚¹¸’¹‚º“¹‚º¹¼½½¹¼ÀˆÁÀ‚¿ÁŽÂ‚À’ÂÁ‰ÅČü ½½¹º¸¼©ŠŽŒ‡Ž“€œšŽŽ˜œœž—’œ“…‡‘–ž€›’‘ˆ‘Ž˜»€¼ ½½¸»´Äw … !KFGI=  6JFFK+Œ DGGFH‹ "KFGI< ‡ (¸»½¼½½¸¼´Åu†JEFH; 3IEEJ(  CFFEGJEFH:‡"¸»½¼½½¸¼´Åu†IDEG: 2HDDI'  AEEDFIDEG9‡"¸»½¼½½¸¼´Åu†IDEG: 2HDDI'  AEEDFIDEG9‡"¸»½¼½½¸¼´Åu†IDEG: 1GCCH'  @DDCDIDEG9‡#¸»½¼½½¸¼´Åu†IDEG: 5JFFK*Œ DGGFGIDEG9‡#¹¼½¼½½¸¼´Åu†IDEG: ,E@@E#=B€A IDEG9‡#¹¼¾¼½½¸¼´Åu†IDEG: Gfmwtuvl`bŽa`dt€uvdc‹IDEG9‡#¹¼¾½¾½¸¼´Åv†IDEG:Ž —ހޑ“’ŽŽœ?‰IDEG9‡#¹¼¾½¾½¸¼´Åv†IDEG:Œ ˆ„‚ˆ‡’†€ˆ‡ŠƒŽZ‹IDEG9‡#¹¼¾½¾½¸¼´Æv†IDEG:Š=”ˆŠš‹ŒŠuŒIDEG9‡#¹¼¾½¾½¸»´Æv†IDEG:Œ\’†Œ‰Š’‹‚Љ‰‡ŠIDEG9‡#¹¼¾½¾½¸»µÆv†IDEG:uŽˆ‹Š‰’ˆ€‰ŠŠ‹‡6ŠIDEG9‡#¹¼¾½¾½¸¼µÆv†IDEG:‹ˆ‰€Š‹ŒŒ’€ŒЉŒ†’SŠIDEG9‡#¹¼¾½¾½¸¼µÆv†IDEG:‰7‘‡Œ‰Š~y{tjk nyzy…‹‹ˆn‹IDEG9‡#¹¼¾½¾½¸½µÆv†IDEG:‹U’‡‹‹ƒODL*ŒCICiŽˆ‹Šƒ‰IDEG9‡#¹¼¾½¾½¸½µÆv†IDEG:Œ p‰‰xCDI' AGAZŒˆŒ‡/‰IDEG9‡#¹¼¾½¾½¹½µÆv†IDEG:ЄЋˆŽiBEH( AFCN…Š‹‡’M‰IDEG9‡#¹¼¾½¾½¹¼µÆv†IDEG:Š/‡ŒˆYBEI' BEFE{Šˆ‘i‰IDEG9‡#¹¼¾½¾¾¹½µÆv†IDEG:ŠM’‡‹Š…MDDI' BEGAlŽ‰ŠŒˆIDEG9‡"¹¼¾½¾¾¹½µÆv… IDEG;‰iˆŠzEGCI(Œ BEGA^ŒˆŒ‡'† IDEG:‡#¹¼¾½¾¾¹½µÆv†IDEG:‰ŒŠ‰ŽlAHBJ' AEFCP‡ŠŒ†“E†IDEG9‡"¹¼¾½¾¾¹¼¶Ãƒ#0*-†,-*7GDEFA-ˆ,+.'GŒ‰‹‰Œ]AGDG:*-Ž,+0D€E G}ŒŠˆo).+‡,-*7GDEFA-ˆ,+.'F¹€½ ¾¾¹¼·Á‹BLH‰IG‚E‰IHKEjŽˆ‹Š‡QCFEEF‘I HEEDGBpމЋ„OHŠIG‚E‰IHKE\¹€½ ¾¾¹¼·ÂŠ;FA‰CD‚E‰C BDBu‰ŠŒ}GED’CEEDGAaˆ‹‰ŠU@DBˆCD‚E‰CBE?X¹€½ ¾¾¹¼·ÁŠ?IE‰FƒEŠF EKƒ‹Š‰ŽpBFD€E’FEEDFBS‰‰‹ˆŽfBHEˆFƒE‰FEHBZ¹€½ ¾¾¹¼·ÁŠ>HCšE DFBU‹‰‹ˆŽaAGDšE IŒŠ‰ŽsBFDšEDGAY¹€½ ¾¾¹¼·ÁŠ=GBŠD‚EˆD CF@eŽˆ‹‰‰RBFD€E’D€E DGAtŽ‰ŠŒ€ICŠD‚E‰DCF@Xº€½ ¾¾¹¼·Á‹@JF‰GF‚EˆG FICuŽ‰ŠŒK‚EF’G€E DGBfŽˆ‹‰‰UDHF‡GF‚E‰GFIC[º¾½½¾¾¹¼¶Â‡0<6ˆ87=F€EC‰8 7=ŒŠˆo4C€EF?78:DEEDG7JŒˆŒˆŽZ3:7†87=F€EC‰87:3Oº¾¾½¾¾¹¼µÆw… IDEG;†ŠˆŒ‡‘B6FEDI)Œ BEEDF |Œ‹‡’W„ IDEG:‡%º½¿¾¿¾¹½µÆv†IDEG:…9’†ˆ‹#5GEDI' A€E Deˆ‰q‡IDEG9‡#º½¿¾¿¾¹½µÆv†IDEG:‡W’‡‹Œ{ 3HEDI' A€E DG‘‡ŒŠ„…IDEG9‡#º½¿¾¿¾¹½µÆv†IDEG:ˆqމˆ‘d1HDDI' A€E D)Œˆ‡1ƒIDEG9‡#º½¿¾¿¾¹½µÆv†IDEG:†„ŠŒ†“E0IDDI' AE ~Œ‹‡’O…IDEG9‡#º½¿¾¿¾¹½µÆv†IDEG:†2‡Œ‡Ž&1IDDI' AEEDFh‰‰k…IDEG9‡#º½¿¾¿¾¹½µÆv†IDEG:†O’‡‹Œ2HDDI' AEEDFL’‡‹‹€„IDEG9‡#º½¿¾¿¾¹½µÆv†IDEG:†k‰ˆi2HDDI' AEEDF/‡Œ‡Ž*„IDEG9‡#º½¿¾¿¾¹½µÆv†IDEG:…‹‹‡“K3HDDI' AEEDFƒŠŒ†“I‚IDEG9‡#º½¿¾¿¾¹½µÆv†IDEG:…+އ‡-3HDDI' AEEDFo‰ˆ‘g„IDEG9‡#º½¿¾¿¾¹½µÆv†IDEG:ƒH’‡‹Šƒ3HDDI' AEEDFU’‡‹Œ~ƒIDEG9‡#º½¿¾¿¾¹½µÆv†IDEG:…f‘ˆ‰n2HDDI' AEEDF5‘†‡Ž$ƒIDEG9‡#º½¿¾¿¾¹½µÆv†IDEG:„ }Œ‹‡’T2HDDI' AEEDF‰‰Œ†’CIDEG9‡#º½¿¾¿¾¹½µÆv†IDEG:„#އ‡52HDDI' AEEDFuŽŠˆ‘aƒIDEG9‡#º½¿¾¿¾¹½µÆv†IDEG:‚B“†Œ‰‡2HDDI' AEEDF\’‡Šx „IDEG9‡#º½¿¾¿¾¹½µÆv†IDEG:„b‘ˆŠŽt2HDDI' AEEDF=’†Œˆ‰ ‚IDEG9‡#º½¿¾¿¾¹½µÆv†IDEG:ƒ zЇ‘Z2HDDI' AEEDF‹ˆŒ†‘;‚IDEG9‡#º½¿¾¿¾¹½µÆv†IDEG:ƒ ŠˆŒ†‘=2HDDI' AEEDF yЇ‘X‚IDEG9‡#º½¿¾¿¾¹½µÆv†IDEG:<‘‡Œˆ‹!2HDDI' AEEDF`‘ˆŠŽsƒIDEG9‡#º½¿¾¿¾¹½µÆv†IDEG:ƒZ‘‡Šy 2HDDI' AEEDFB’‡ŒŠ…IDEG9‡"º½¿¾¿¾¹¼µÆw… IDEG:„rŽŠˆ‘d3HDDI(Œ# BEEDE(ˆŒ‡4IDEG9‡$º½¿¾¿¾¹½µÆv†IDEG9‚‡‰Œ†“@0HDDI&# AFEDE {Œ‹‡’PIDEG8‡!º½¾¾¿¾¹¼¶Ã‚ -'*†)*'5GDEFA*) (+#LŽˆŒˆŽD#+(€)>FEDG9'*Ž)(.DE0(*))*)sމ‰Žt)*)*'5GDEF@*ˆ)(+#C»€¾ ¿¾¹¼·Á‹BLH‰IGEF‚I HKEqމЋƒOH‚IFEG’I‚EH€I HKEkŽˆ‹Š‡RGJ‚IGEF‰IHKE]»¿¾¾¿¾¹¼·ÂŠ;FA‰CD‚EƒC DCz‰‰xBD‚CDED’C‚EC BE?Zˆ‹ˆY?EBCD‚E‰CBE>X»¿¿¾¿¾¹¼·ÁŠ?IE‰FƒE‚F GDP‡Š‹ˆŽiAHEFƒE’F‚E‚F GDN†Š‹ˆkAHEFƒE‰FEHBZ»¿¾¹¼·ÁŠ>HC“E DGA[ˆ‹‰Œ[AGD¨E F|ЉyCFD“EDGAY»€¿ À¾¹¼·ÁŠ=GBŠD‚ED CF@jŽˆ‹Š…MBE‚DƒE’D‚E‚D CF@mŽˆŠ‹„LBE‚D‚E‰DCF@Y»€¿ À¾¹¼·Á‹@JF‰GF‚EG FHFy‰ŠŒ|H„G‚EF’G‚EFG FIC`ˆ‹‰ŒYCIF€GF‚E‰GFIC[»€¿ À¾¹¼¶Â‡1=7ˆ98>F€ED:€9 :7C„‹‹ˆh5;8‚9BFEEF@89;DE<8€98:6G‡Š‹ˆc5;8998>F€EC‰98;4P»€¿ À¾¹¼µÆw …&IDEG;)‡Œ‡53HDDI)Œ BEEDF sމˆc IDEG:‡'»¾À¿À¾¹½µÆv†IDEG:E“†ŒŠ… 2HDDI'  AEEDFY’‡Šy IDEG9‡#»¾À¿À¾¹½µÆw†IDEG:€c‘ˆ‰Žrƒ 2HDDI'# AEEDF:’†ŒˆŠ!IDEG9‡#»¾À¿À¾¹½µÆw†IDEG: {Œ‹‡’X‚ 2HDDI'  AEEDF‰ˆŒ‡‘>IDEG9‡#»¾À¿À¾¹½µÆw†IDEG:!Œˆ†’9€ 2HDDI'  AEEDFƒwŽŠˆ‘[IDEG9‡#»¾À¿À¾¹½µÆw†IDEG:>‘†Œˆ‹‚ 2HDDI'  AEEDF‚_’ˆŠŽtIDEG9‡#»¾À¿À¾¹½µÇw†IDEG:]’‡Šx„ 2HDDI'  AEEDF€?’†Œ‰ˆIDEG9‡#»¾À¿À¾¹½µÇw†IDEG:€uŽŠ‡’aƒ 2HDDI'  AEEDF‚#‡†‘5IDEG9‡#»¾À¿À¾¹½µÇw†IDEG:‡‰Œ†’@ 2HDDI'  AEEDF‚ |Œ‹‡’TIDEG9‡#»¾À¿À¾¹¼µÇw†IDEG:6‘‡ŒˆŒ"ƒ 2HDDI'  AEEDFƒeˆ‰oIDEG9‡#»¾À¿À¾¹¼µÇw†IDEG:T’‡ŠŒ{ ƒ 2HDDI'  AEEDFH’‡‹ŠƒIDEG9‡#»¾À¿À¾¹¼µÇw†IDEG:o‰ˆd„ 2HDDI'  AEEDFƒ+‡‡.IDEG9‡#»¾À¿À¾¹¼¶Çw†IDEG;ƒŠ‹‡’G„ 2HDDI'  AEEDFƒ€‹‹‡“NIDEG9‡#»¾À¿À¾¹¼¶Çw†IDEG;/‡Œ‡*„ 2HDDI'  AEEDF„j‰‰kIDEG9‡#»¾À¿À¾¹½¶Çw†IDEG;M’‡‹‹€„ 2HDDI'  AEEDF„P’‡‹‹JDEG9‡#»¾À¿À¾¹½¶Çw†IDEG:jˆ‰j… 2HDDI'  AEEDF„1‡‡Ž)JDEG9‡#»¾À¿À¾¹½¶Çw†IDEG9€‹‹‡’N… 2HDDI'  AEEDF„…ŠŒ‡’GJDEG9‡#»¾À¿À¾¹½¶Çw†IDEG9'‡†‘0ƒ 2HDDI'  AEEDF…r‰ˆ‘cIDEG9‡#»¾À¿À¾¹½¶Çw†IDEG8I’†Œ‰…… 2HDDI'  AEEDF…X’‡‹Œ{IDEG9‡#»¾À¿À¾¹½¶Çw†IDEG9f‘ˆ‰p‡ 2HDDI'  AEEDFƒ6’†ˆ‹$!HDEG9‡#»¾À¿À¾¹½¶Çw…IDEF; |Œ‹‡’X… 2HDDI(Œ  BEEDEƒ‹ˆŒ‡‘A"GDEG:‡$»¾À¿À¾¹½¶Çw†IDEF=#ŒˆŒ‡6† 1HDDI'  AEEDF‡sŽŠˆ‘_ HDEG9‡!»¾À¿À¾¹½·Å("%†$%"2GDEEBQ‡Œ‰Š:&#†$#HCŒE DGAaˆ‹‰‹UBFDµEFDw‰ŠŒ}GŽEDGAY¼ÀÀ¿À¾¹½¸ÃŠ;Fƒ‹ŠˆŽmAGDED‰=açêçåçãí¸q{w‰xuqr‚x w{r¹èàâä×vyxsqt‘xw‚qv€x w{r¯èßãâÞˆtzwxuqr‰xwzt‹çë€êçåèãîµfql‰no‚qƒn onÉçááçÅlpmnpqp’n‚qn mqh”æßäßæ‘gqmno‚q‰nmpjƒçëëêêçåèãí¶kupŠr‚qr qsoƒÝâãßé­kuqrƒq’r‚qr qsoÜâãßé°kuq‚r‚q‰rqtn†ç€ë êçåèãí¶jto“q ptk•æßäàæ–ktp¨q sÊæáàèÇnsp“qpsm…çëçåèãí¶isnŠp‚qp osj®éßããÚ€mqopƒq’p‚q‚p osi³éßããÙ}mqop‚q‰porl…çëçåçãí·mws‰ts‚qt svrÆçááæËv„trqr’t‚q‚t swnžçßäàå“nws€ts‚q‰tsvpˆçë çåèâï¯Ub\_†^_]fr€qn_^^]_[mØããßéªXa]‚^lrqqri]_Ž^]bpqc]€^]`YuÞáäßê¡Va\^_]fr€qn_ˆ^]`Ywçë çåéàô’ …& 3xoqt`  DçÞæÝëX TvpowC ‹ kqqpr"€¾éáßí¢  4xoqt_ ‡ /æê€ë çåéàõ†$/xoqt_qðÜåáÚ)Rvpox@#krqpr’ïÝãæÇ1xoqt^‡*æê€ë çåéàõ†0xoqt_¢íÞá黃 Rvpox@#krqpr^ðÜæßâ71xoqt^‡*æê€ë çåéàõ†0xoqt_ÉæãÝï‘€ Rvpox@#krqpr0áßåÝíe1xoqt^‡*æê€ë çåéàõ†0xoqt_6åÞæÜï_€ Rvpox@ krqprƒ ÄèâÞî•1xoqt^‡*æê€ë çåéàõ†0xoqt_fîÜæßä0€ Rvpox@ krqpr€›îÞâè¿ 1xoqt^‡*æê€ë çåéàõ†0xoqt_˜ïÞâçÅ‚ Rvpox@ krqpr€hðÜåàÞ,1xoqt^‡*æê€ë çåéàõ†0xoqt_€ ÀèâÞïž Rvpox@ krqpr€:çÞæÜîW1xoqt^‡*æê€ë çåéàõ†0xoqt_.ÞàåÜïi Rvpox@ krqpr‚ËåãÝïŠ1xoqt^‡*æê€ë çåéàö†0xoqt_YíÜæÞæ8 Rvpox@ krqprƒ¥ìßàë·1xoqt^‡*æê€ë çåéàö†0xoqt`‹ïÝãæÊƒ Rvpox@ krqprvïÝäâ×#1xoqt^‡*æê€ë çåéàö†0xoqt`¶êáßí¤„ Rvpox@ krqprFçÞæÜíL 2xoqt^‡*æê€ë çåéàö†0xoqt`$×âäÜïs‚ Rvpox@ krqprÓãäÜð€ 2xoqt^‡*æê€ë çåéàö†0xoqt`NêÝæÞçE‚ Rvpox@ krqpr„¯ëààì°1xoqt^‡*æê€ë çåéáö†0xoqt`ðÝääÑ„ Rvpox@ krqpr‚‚ïÝäãÓ/xoqt^‡*æê€ë çåéáö†0xoqt`­ìààë®… Rvpox@ krqpr‚QìÝæÝéC.yoqt^‡*æê€ë çåéáö†0xoqu^ÒääÝ Rvpox@ krqpr‚'ÚáåÜït.yoqt^‡*æê€ë çåéáö†0xoqu] AëÝçÜíOƒ Rvpox@ krqpr…»êàßí£/xoqt^‡*æê€ë çåêáö†0xoqu] vðÜåáÛ%ƒ Rvpox@ krqprƒïÝãæÉ2woqt^‡*æê€ë çåêáö†/xoqu] ¨îßá鸇 Rvpox@ krqprƒYðÜæßä<5voqt^‡*æê€ë çåêáõ‘…1xoqsaÌåãÝïƒ SvpoxA‹ krqpr‚-ãßæÜîl8upqt^‡,æê€ë çåêáö†.xorrc9æÞæÝìZ„ Qvpox@ jrqpr‡ ¾éáßí›4voqt]‡(æê€ë çæéâò¤/?8;…:9<7Qtprpm2†ìÝåàâ`3=8…: ;9bsqptZ7<9Œ: ;8CnqqprH7;9„:8=4­ëßâæÊ>Qtpqrh=ˆ:9=3Zèëçæéäî¸oyu‰vt€q ptsÁçàâåÑ{Švrqs‘vu‚qu‡vuyo¥èßäááŽospqqr‰vuxr‰èì€ëçæéäï¶grmŠoq pvÐåâàè½kqnˆopqp’o‚qˆonqjŒâáäßçœitpqqp‰onqk„èì€ëçæéäî·kupŠrqqpsm‹ááäßé£kuqˆrƒq’r‚q‰r sqzÔäâàé¹msp€q‰rqtn†èì€ëçæéäî¶jtoŒq ptj çßäàãŒlsp´q psoÂçàáæÍtŽqpsm…èììëëçæéäï¶hsnŠp qqpsl¸èàâåÔxoŠpƒq’p‚q‰posj¨èßãâÞƒmspqq‰porl…èììëëçæéäî·lvq‰srq uÎæâàèÃpur‰s‚qr’s‚qrˆsrum”äàäßç™jtpqq‰sruo‡èììëëçæéãï²]icˆedjrpsm„Þâäßê¢^hc‰enrqqrldegpqhd‡edfbs×ããßé´jtoro‰edg`|è€ì ëçåêáõ” …  6xmuj™èßåÞèG … UvpowE ‹ lqqpr% †   ¯ìßâæÊqsot`‡  4çëììëçæêáö†/ymuj³èàâåψ Rvpox@ krqpr†ðÜåâÜ€nqt^‡*çëììëçæêáö‘…0xmtpÊçâß쪇 SvpoxA‹ krqpr…LìÝæßè”krs^‡+çëììëçæêáö†0wopÚâäÜï}‡ Rvpox@ krqpr†"Ùâãßè­krs^‡+çë€ì çæêáö„/vpk“çßåÞéM‡ Rvpox@ krqpr‰ ·ëßáçÄops\…+çë€ì çæêáö‚ 5ztn®éßããÖ#‡ Rvpox@ krqpr‡‹ðÜäã×qxa „ +çë€ì çæêáöƒ (phkÅçáßê´Š Rvpox@ krqpr‡WíÜåàãbqS…+çë€ìçæêáö*mn€onqk‡­§®ÛãäÜ Rvpox@ krqpr‡)ÝáãáåÂ¥¬Ÿro pnqP+çë€ì çæêáö4Öï„ð íééèãáåÝíWˆ Rvpox@ krqpr‹ ½êßäáæêéëƒð òíð‡+çë€ìçæêáö¢ï×ßÛ‚ÜÝ€ß áââáÝ,ˆ Rvpox@ krqprˆ ’ïÜåáà€ß„Ü ÝÝè4+çë€ìçæêáöÌåãæƒåä€ãâäßêÀŒ Rvpox@ krqprˆaïÜåáãƒå äèÜïk+çë€ìçæêáöÒçáã‡âáåÝ𕉠Rvpox@ krqprˆ4âáäˆâ áäÞñv+çë€ìçæêáö ÁåÝãàƒá€âáåÛð_‰ Rvpox@ krqprŠÅçßãá€âƒá àäØïW+çë€ìçæêáötõàæãƒäãåáç1‰ Rvpox@ krqpr‹ŸðÞåâ€ã‚ä ãåâîË+çë€ìçæêáö ŒÏÐÒÑ ÐÕÛÚÚÛ×Ö·‹ Rvpox@ krqpr‰ hÝÐÝÙÚÚÙƒÑ ÒÏ»@+çë€ìçæêáö€ F…}‚o"Ž Rvpox@ krqpr‹  F…}‚n ƒ  +çë€ì çæêáöƒ,ulnq\ Rvpox@ krqpr-ulnqZ„ +çë€ì çæêáö€ 2ypruaŽ Rvpox@ krqpr‹ 3ypru_„ +çë€ì çæêáö‘€ƒ /xoqt_ SvpoxA‹ krqpr‹ 0xoqt^…+çë€ì çæêáö†/wnps^ Quonw? jqpoq0wnps]‡)æë€ì çæêáõ’ … 4{rtwc Ž Vysr{D‹ nutsu"‹ 5{rtwa ‡ /çë€ì çæêáö†*sjlpY Krkjr<  emlkl+sjlpW‡&æìçæéäî¼mwsƒt€u tvr‹¬¨©ª¡wv wvœ«©¨¬“swuƒv†w xu§ªª©«„txv‹x wyuŽ®ª«¬¢z„xwvysŒéìçæêñ…ðƒñïíîññ‹ò‚óðîð€ó‹ô€õô‚ñôõöôòó…ö„õô‚ì‚çå†âƒã䂿ãã‹ä‚åçèç€å‹æç‚êèçèéëê„è…çè‚ì‚çè†é„ê‚éêê‹ë‚ì‚ëì‹íî‚í‚îŽï‚î„ï†î‚ìƒç†æ„ç‚èçç‹è‚éƒê€é‹êë‚ìƒëì‚í„ì†ë‚ìŒç‹è‹é‹ê‹ëŒì˜íŒìŒç‹è‹é‹ê‹ëŒì˜íŒìŒç‹è‹é‹ê„ëŒì…í—î…í„쟗‡˜Š™’šŠ›Àœ›ž”Œˆ’Ž•Á“•‡Ž’”Ñ”•Ž‚“Ž“Á€‘”•Ž‚’”‘Á’€‘”•€ŽŒ““ŽÂ€‘”•€Ž“‘””•¢–—–——Š–•€‘ ”•‚knm‰no‚q€nop€qrq’p‚r‡p‰q‚rqqˆpqov‘‘”•Š—^ † ŽŽ  Žˆ ’”•Š—\† ‘ ‰Ž’”•Š—\† ‘ ‰Ž’”•Š—\† ‘ ‰Ž’”•Š—\† ‘ ‰’”•Š—\†  Ž ‰‘’”•Š—\†   ‰‘“‘”•Š—\† ')-€,)‘%&+,&& ‹ ‰‘“‘••Š—\† Ž09ƒ6’7675:‹ ‰‘“‘••Š—\† Œ 32œ3426"‹ ‰‘“‘••Š˜\† Œ845‚4’5ƒ47,Œ ‰‘“‘••Š˜\† Œ"735ž43 Š ‰‘“‘••‹˜\† ,63‚4“3‚4536Š ‰‘“‘••‹˜\† ‹ 345’6€544537Š ‰‘“‘••‘‹˜\† ‹ 63544/--+’)€-24436*‹ ‰‘“‘••‘‹˜\† ‹  73441Ž (53442‰ ‰‘“‘••‘‹˜\† Œ *6345- "53536‰ ‰‘“‘••Ž‘‹˜\† Š24436( 24537‰ ‰‘“‘••Ž‘‹˜\† Š63535!€.5437(‰ ‰‘“‘•–Ž‘‹˜\† Š73542 )54450Š ‰‘“‘•–Ž‘‹˜\† Š(6345. #53536ˆ ‰‘“‘•–Ž‘‹˜\† ‹ 05445) 34537ˆ ‰‘“‘•–Ž‘‹—^ˆ€‰53535#/5436*‰€ˆ '’’‘•–Ž‘Œ–`ЂР(53443’€*53442Œ‚‰/Ž’’‘•–Ž‘Œ—_‰ƒ‹,5445/‚’€$53€4 ‰ƒ‰-Ž’’‘•–Ž‘Œ–_15445*š€436&›.Ž’’‘•–Ž‘Œ–_› €435$›05445+›.Ž’’‘•–Ž‘Œ–_› &63443›,54450œ.’’‘•–Ž‘Œ–`Š‚‰,54450ƒ’'63€4 Š‚‰/“’‘•–Ž‘Œ—_ ‰Š05436*‘ 43536"ˆ‰*““‘•–Ž‘‹˜]† ‡ 43536Ž€ /5437!… ˆ’”’•–Ž‘‹˜\† ‡73535 %7346+‡ ‰’”’––Ž‘‹˜\† ‡ 7345. 73541… ‰’”’––Ž‘‹˜\† ˆ+6437% 53536… ‰’”’––Ž‘‹˜\† † 24537 05437… ‰’”’––Ž‘‹˜\† †63535 '6436(… ‰’”’––Ž‘‹˜\† †7345/€ 73440„ ‰’”’––Ž‘‹˜\† ˆ(6436'€ 63535„ ‰’”’––Ž‘‹˜\† …14437 14537„ ‰’”’––Ž‘‹˜\† …63536 *6437'„ ‰’”’––Ž‘‹˜\† …73542  7345/… ‰’”’––Ž‘‹˜\† …'7346*€ 73535ƒ ‰’”’––Ž‘‹˜\† †/5437   43537ƒ ‰’”’––Ž‘‹˜\† „ 53536 ,6437$ƒ ‰’”’––Ž‘‹˜\† „73543  #7345-„ ‰’”’––Ž‘‹˜\† „%7345+ 73534 ‚ ‰’”’––Ž‘‹˜\† …-5437"€  43537‚ ‰’”’––Ž‘‹˜\† ƒ 43537-5437!‚ ‰’”’––Ž‘‹˜\† ƒ73534  $7346+ƒ ‰’”’––Ž‘‹˜\† ƒ"7345.‚73542  ‰’”’––Ž‘‹˜]† „+6437&Ž53536€ ˆ’”’––Ž‘‹˜\† ‚  34537€/5437 ‰’”’––Ž‘‹—^ˆ€ƒ 53536‚+6446,„€‰ '‘““’––Ž‘Œ–`‰‚ƒ*53441ƒ‚’‚ (53443ƒ‚‰/””’––Ž‘Œ—_‰ƒ….5445-„ƒ’‚‚ "53535!‚ƒ‰.””“––Ž‘Œ–_• 34436(¨ 34436(”.””“––Ž‘Œ–_” "53435"ª.5445-•.€” ––Ž‘Œ–_” (63442© )63441”.””“—–Ž‘Œ–`‰ƒ„.5445/…ƒ’‚ƒ $53445"ƒ‰/””“—–Ž‘Œ—_‰‚ 24436'ƒ’‚ƒ 34436%‰+””“—–Ž‘‹˜]† 53536‚Ž‚,6436& ˆ‘“•“—–Ž‘‹˜]† € 73542 ƒ!7345.€ ‰’“•“—–Ž‘‹˜]† €%7346+…73534  ‰’“•“—–Ž‘‹˜]† .5437!„ 43537 ‰’“•“—–Ž‘‹˜]†  53537„ƒ-5437" ‰’“•“—–Ž‘‹˜]† 73534 „‚$7345, ‰’“•“—–Ž‘‹™]† #7345-†‚73543  ‰’“•“—–Ž‘‹™]† €,5437$…‚ 53537 ‰’“•“—–Ž‘‹™]†  34537…„/5437  ‰’“•“—–Ž‘‹™]† 63535 …ƒ&6346* ‰’“•“—–Ž‘‹™]† 7345/‡ƒ73542 ‰’“•“—–Ž‘‹™]† )6436&†ƒ53537 ‰’“•“—–Ž‘Œ™]† 14537†ƒ04437 ‰’“•“—–Ž‘Œ™]† 63535††(6436( ‰’“•“——Ž‘Œ™]† 73440†„73441 ‰’“•“——Ž‘Œ™]† '6336(‡„63536 ‰’“•“——Ž‘Œ™]† 04437‡„ 24537 ‰’“•“——Ž‘Œ™]† 63536‡†+6437% ‰’“•“——Ž’Œ™]† 73542‡…!7345. ‰’“•“——Ž’Œ™]† '7346*‰…72534 ‰’“•“——Ž’Œ™]† .5437!ˆ… 43537 ‰’“•“——Ž’Œ™^†  53536ˆ‡,6436# ‰’“•“—–Ž’Œ˜^ ‡  €  63544 ˆ   ‡  (6345/€‰  &’””“—–Ž’—_Š,54450Š‚“‚‰%53€4 ƒ‰/‘•”“—–Ž’˜_‰ƒ05445,‹ƒ’ƒˆ €435$‰.‘••“—–Ž’˜_Ž €436%·14435*.‘••“—–Ž’˜_%53€4 ¸,5445/Ž.‘••“—–Ž’˜_+54451¸ &63443.‘••”—–Ž’—`‰‚/5445-Šƒ‘ƒŠ "53435#€‰/‘••”—–Ž’Œ˜_‰€ 34436%Š‚‘‚Š 14436)€‰,‘••”—–Ž’Œ™]† #53536ˆŽ‰(6345/€ˆ’”–”—–’Œ™]†  )6345/Œˆ 73543‰’”–”—–’Œ™]† /5436'‹ˆ 63535"‰’”–”—–’Œ™]† 24437‹ˆ 24436(‰’”–”—–’Œ™]† "53536‹Š *6345-‰’”–”˜–’Œ™]„ (63441‹‰  73441…’”–”˜–’Œ™]†  -5436)‰ 73544 †€’”–”˜–’Œ™] „ ('(24437Œ‰ 3€45-&($„€’”–”˜–’Œ™] 1†7€644537Œ‹,63445€6„767’”–”˜–’Œ™]%724‡343 ŒŠ"73544‰36 ’”–”˜–’Œ™]/54„5ƒ436,ŽŠ735‚4„5637’”–”˜–’Œ™]05Š4537#Š Œ4538’”–”˜–’Œ™],53‰4537Œ.53‰4527’”–”˜—’Œ™]845‰435 ‹%735‰47.’”–”˜—’Œ™] …01211*‹3032…0+’”–”˜—’Œ™]‚ „’”–”˜—’Œ™]ƒ ‘ …€’”–”˜—’Œ™]‚   „‚’”–”˜—’Œ™]† ‘ …€’”–”˜—’Œ™]† ‘ ‰’”–”˜—’Œ™^†‘Ž ˆ’”–”˜–’Œ™]†   Š’”–”˜–‘Ž”wHNK‰LNRQŒLƒMQRP†MˆNO‚SO€NŽOQTS…ON MOK\”••”˜–€’†–ƒ—ƒ–——‹˜‚™˜—˜€™‹š›‚š‚›Žœ‚›„œ…›š€•”˜–€†„Ž‚ŽŽ‹‚‚‘‹‘’‚“‚’Ž“‚”„“†’€•”˜–†’ƒ“ƒ’““‹”‚•ƒ”€•‹–—‚–ƒ—˜‚—„˜†—€•”˜–†‹‹‘‹’‹“Œ”˜•‡”€•”˜—Š‘‹’‹“‹”‹•Œ–˜—Š–•™”ŠŽ‹‹‹‘‹’Œ“˜”Š“’–ž—Š˜‹™‹š‹›„œŒ…ž—Ÿ…ž‚œŸt8mk@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿic08ja jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cÿOÿQ2ÿR ÿ\ PXX`XX`XX`XXXPPXÿdKakadu-v5.2.1ÿ itÿ“ÏÁÚgsèesÁƒnpÿû)2Ì­ÞÔÆ$ýY¦ Ò8¾Ë®¢Zýe–?žÒŸBb¤ álP-è)8áÂÉ~‰´þ0‹1åašqÏÁ-2/ªY8KOP Bû€ß„sˆ·Ñ­Oöú_¢?_ôà”ÃåÊSÈÅ$Ú¸‰Vqã¡Å*>6P ¥m¥rœ¸zÇÚx-2/ªY8KOÂNK¹=Køô$|j3™z3­X3zå) qÇ™f=ŒòiÁSíB¥úÒ`,"²hÇÚ \¯†Çàä? ÔldVØJßùÌÝ1KæM벂Ú]ø¿=ÜJ’cÊÔ{²!4x—©Šn<¸py!³(&HLŸuÐ0‚=Ç—“&s+Ì:ò¬Ñ=£0545žoHßz ¦ Tt†4 ù²€ùo¤éÒ¶ÈÐßêe<Ÿæ½©¿r"þQí\=µò¤Õó 5rŠíšÒ=•§ }|vÇìs[ %t%Ÿw¦75“œ”G™m<€ç Q/cæ^\n{u7s7²ÎºÇà‹ä?uƒ•º$åÔlž‰ëØ‚AQåb¿›Ì|õ -‘Ço:< tÀï”Î^2¼t²uǘÐA{oD(!XŠèßÓI'ÿfÿ!;Œ÷Ð!Úێڤ̓3í/Aè Φ ðÒ†ndûúÀöÊÚ#D×é|°‘°Bå?šôèt>os{@brJ¤¿æ]³nÏîTÇž(ð%ÀÒ¨ÒåòÍwª>2qP)mÁ@1—3â o=ØSŽê¸õqî„¿ÎÃí=‡ÚiÚtuƒ•º$åÔlž‰ëØ‚-™H,ù¼Õ¾‚0+[ÕÊjÝ¿A¹RP<¤4Z&¼N++Áyš¹/HU$N'ÿ#0—–ý4ȵ»ðûÿ€&V/ÍL˜äáºõ4E w=wïähOAÂs¾[>os{@bšòÁlÙ«ˆ8 ­Ÿ><ÚæFI«_ ˆÏ„ïù"Ž‹ÿ7¯yhô@4ÿ~uŽ7è€ÏÎõÂÓ‡ád€­ÚRÑXcXrܹ©ä2Æuîlj9p¾¶I{†³P’j Yçì²t9êôÇ#þfÐD1x˜ÀW¾Ñ@BSÖJêŸì–ˆG6¿ëEGŒµ²€*Ḫ0¤–çÞ">û®d‚ D‹  åT5â>êãnÖ„‘lvª®¤ë§Bƒ@B¸~iê~Bû#/o6Ë@-Ê¿ð3ˆ„kqQRX× ‘]¤Ö€g” únT“¾©üOÏæùÙ ]N©²¡íÚŒ‡§æÎ·ž=…„)®N<¹ëš“ïä“_n<0a£—wŠFSI]4öþAÃW*æ PŸ2R´œÅÚN¯®Æ(=šž¶F } k®¨µ¤.LȤŒÏ‘V^1}ÛÄW]_01âÿ~Mr¸˜\òNpòæ‡UF²M0%Šõpr“­˜EEß=LàÕW§ãå~<±±`Ê#–M™pt6Ê "=ðƒÀÕð²çrã^Štk‰Ìul›ÛkLµuµw¦cgÖÌÒã+Ý ‡EƒÏþ ê4+ÐqCgŠ ÷§»a’èÔWŸ’øñA±Â5"63—¾zâc§}Áë·×•ªgz°ø¬ªÏ‰Ç!ºÕÝu0!Vø7'Óÿzè‚÷¢‡ø”3H®üñߪ¬8‘Õà‚åÌìšÉó̰֠Ó0BÇáxGáeÁöÙzÂD¹ÈWS¯Å‹ÙÇYÓ@9&+û-⣈Nj°Ü]ÝVˆ± ¯­H$£e FÇ ý·/>lì›'¼GH“"Íì Gð—<€2 áØ\-:³g›rŸ½È²×%n( ªÃ~§ôƒáµø¬ê1½¨yÒÈk´à€ˆE!)`æØŸwÇ´{+²"Ü/Y™ñô]¬R¹1N>ÒØ3¼ ño_ÈÍcŠò޵õ a0•í~½wåqÝzïÈQ¿™Àf†À“è§V¬ŒìkwWéÿ&onW´œ©œŒ`7h¢fNV”2O¸0ÈŒŽ÷‡šš.— ÂǸbAŸR7L§qs\‹oê‘ N×Ð0lz5³äÎÈp.±àãÿ/wôÆv™J ôÁñÕòÒLŸ£Ù5Ùh¤dJœ…øvújJêE8‘oøÊ,PÒFÿoÉÈò%µçÎøõ<„ãü×é;ôk‰pùw¤1=€Ã{±{L¨i†!4¦ê|7Ëdó@àûªp.qÄ?zæÉfÛ!w N*šòñT{L`ÌÇ5‚¦($. @a‹ T»}‘IuêꎲPîÉùœeØDˆ1PùT÷5? =ù Nyb%–°‘ÇX¾rþ¿LPõn?Šø Mi;…œéœîõ-k‹=¢a‰¦û@7âÃkîønJè°éð^vàJ}ͱ³Û]Ú:ÄõÙH ø}È… C+P/Eó$ûà‚~åÅ¿`Æ;¡¨•æ¡Ýqiób„ºƒƒñQVZª%º˜dÏ«…¿ËqZ¢¤(.”NI©êÈ^2AIZÅJy9„ÏäÔ®hÁ,~ИŽi¶À3T(yíc1òÑYhÃí´!öÕ°>ª¤zÂD»M˜Å²’t|¿Úl_ÂÉ[Áo¹¶í})_Q$¸W;¢õŸå[Z¹û_ÎÇ%Ùj~\Ž/‘ËÓeîdŸJîå›8À®\ÀŠÐ²t¤|)ýWž"0nUi‰F4ǤY !C\/%°éÚ´v ¯çÅ*ëŠåÇö*NƒœmR[z2‘ÖŠ¿f…x¼d?F»Nkì’L†¾ÙX:–ͭŇeó`硽;"zóÅÝ[‘|¿ÖrÐûR+D(sn‹ÖË©©–½–ÏóÕºÔEõ kpŸR7 û”*Ô5Œ¹˜ýÀÞ ¢ÞÖà‰)lšYýŸß<’X5ä4™¯|"F¬’„ÀDóí»Ó§ eàÏÂþTr>¾‡µhà4àr¼…„²®Ì@Kg´¡B£7(V=%¾×®îñE‹…|­®J.=».ŒëYw–?2k]'ù¨ÿuÇ›¹yеef¹‡§¼¤­8ž¨ni+ðÆÝ£f”œŒ? =ù Nyb%–°‘ÇX¾rþ¿L«ÿŠÇ‘+TÙBP¸¸ó›©â˜{y¡“ëŸêˆU%—-¸™Œ2ÜpŠ¿ r´àb2ïnÈ©©Æ5þáû¶¥FÔ·`BÏ-ÖsK_C?Ýé Ãa`ªŒ}¬ò5íöß*tÞê E4uÕm^Líe—æ$Õ¸­ÜÚÈp ¿ôýÜ£œ¨lA®äZmÑ¥€ÇáÒÄ>ÝÿAöì°ºY|@è–E}/r8¢0Å}-ï6£4Þ]»¦ó$Ea !wfÌ.½ª‰Êpô/‰iaDÒ5­'[¾6«ÑôÊ, `¹çHׄT6r×' óO¶Ë·f-„– }A¬Ì¨š=f ‰£Oh¬ÞXpâ81Xm¯ Ú Õõ­(ÿ†î#<°ãTûOê—üá·Ð_ ÂH"Ò/"m«öR­¡Ì+A4g<*#BÆvÛ“¹LÇÆD¤N W£9ôÚ3AÝ+â{#Šç>»—ñ/F+ƒå¶Atþœqé½ žá°ùwQˆ®å9p |ñu±?ÕŒa¼)â&žíc <ò<1t…¦Ò'¾Œ)Æ0Ѧåé¿ËÌÓ ÷1ÄÖ|[.¶ëSS““EO3þ¼P±øÓë»ÜB9°ËS©r¤ÞöEuð4;Ün—ÊñHßP¬óËÏÚî4~‰Œ¯åÐ¯Ñ ¥ëdêð{ÅQ²³Ã+i¶ÃÊâ_¤Ü¯¯¥CۭØ`7Nò¢ÆÄ¢lí ¸Ý>+•%Ò‰Xtãã¸#_:É¡ƒv_w@¯|pñç+ì[µ7žÀÐþð1|ÌO·$ Yî¨óâ÷î_@°žÜ|Ø Ü)-Î<LJa1"÷o–ú¡ÁÞFÒ¯F¬=ÛPP…ftÓƒfº~»=³Rµõƒý3¶:ˆ¥{t2ŒØüê³Üÿ\XÔÓq›ãïˆÃ §åS&"ZíÈèוŒzŽ`ÊÞØ-8ܘ"¦¾zp8Cfj [ˆT§júó©À«“r§ C‹[TQÓ0¼—Ó‚åìÑ$úªV‘‘Ô³d¹èz}¼eìù§£—öë[5¹[’jÞá ÊKLd9‹q(#[WŸs´µÎaû7jS­‘1Œg}*©ÁJHÕØrꌖïíî°ÕÖ½J¤ûH+¨ÿN”@¾€WŒUÜìúe«ÆmTxÒ'4Ó ç´—°<B}Ã¥ºnèã2ú’Õ·ñÝÒêÕà‡?WÔó´z„^µ‰<3@²ö$0²<îÃ.r VyÛbzX˜öì2™Õ¥ÊarÅÉØp228Ùüaÿœ‹R–ˆ£“™~!Gàê¹;Ÿ„c;޶*òÑ<ŠܧÏá ³0{Ý_­OŠú.­œ× “àq”GˆÁE*ïÅ:e¦j–œø˜Ã6#%OL‰ JLÇpO<â{Ź®p©¡GRê+ta>‰Xi²ÂBkõn6}ÑÄÆ£ûËu:ÔÖ€j“û(¡Fäß^±­4±#ÄE;Rkúó}?ˆyBEZ«’¤=‡²áÁôúy¼Œª¹Ú1l6vX³*#A)À®z·ÃÄEâD«´o«h^¨Š-¸ñ1Ø3>Hßb©7_{ )³­MwíTè>Ý´—–f˜²¯™×ÄÇÉ8Ä’òW“¹KÓùªKMX½ªoЉ~} nz¨à÷`ª*1„CãÝØËÞ…v»ž‹l±‘o¡`¨XÍ,‘ÃÔÏCc­*ņ¥kBú\±ÿ_N£ç@™Gäõ)Ç-çxC¢ç>9¹òÃR>ò3GU ¾ Ì_Ü(æ›×È(…†3Ý+õXG"áH‹Þs;X2kÇeõ½tóÉEkus4ÊãGÿe~=šnÏ+õß»Š.ãÔPdÔ³DdceIF¤,¢è;Û´8T‘HµÑ3g‰HªÞt^É=HRfD¸ÌÓW!‚+™_™œå*x´Žî»T‚¥`¨p»ð3cˆ…­!¢×óÈ 1„||µ0ËLbµ˜À'Ïá0 '0é¼·aÄmÉseœˆl˱aXîñjk³>’IÝ讀þó¨U!ÎþYIÏFç¨õ‹³·^…í9^éþ#QÞT•Zò¾`‘·òÃh:àà£ð¢JÂáþY šÖ†Ø/_ðùîwcr”±NýÀÈÍΖØ)®¥àYÑd–˜·¾oCN£+[­´èt-Ó/`*_‚TE¤ô©¥†ÒÚ®€‰>Qö¢‰@ÇáÑì>ÝüƒíÙ0º®+.½IÓ«zÛâ ÚtÏYš—ݶ2#%r^Œy'?”“J˜¬Ô[@†€¾ò#F9^Ú‹ž‹\\ɆM¡Ý@%2§g}¹›ÿ2l£1†Ì^üùœ=ÚÕ)ÿJÇÂB¼r=ê:¯7)’2Üñ)Bš1°XÓz×[ùdføbmXù5®¢aùÚ “¹æµûÐøòÊÐ|Ž”­ÕBBá8jM {¥{uüºPÚ½.zÏyËY®¿Òq{Øì]vbçmËK–Ì QI”j#à3hvšß€˜@ iƒ|¸7?Õ ÈÃõ­66vBßÈmw=¶_ûm„`ðIh UÅð ‹á†,‰z&ºÚÁô=g‚ƒ~ä¦*)§|”ÿƒ8‡i0¼ìTÏNJu[°' ÎîA4B6ýC’à¥ïqŷĤèÒMu©•è-,»‹Çyœ\&b܆2 'Ì>sÃ)”ÜU¼£Ô36­-KFTCçÿ E ‰pMF4®C.ä1bÈÆb'â[ á¦ÐÝT=]²Eõ5£¢»wî£ÍçO;×±ã<À-ß]ÖïÁànäD"Õ¡<íiþ³ÇDj¯ŸÐ\bö´wôö5@¹ÃÍrKÝy~P[àÿZ˜ÛŽ™ùýŽÜ?Ít²¤nè¼=|Jä`&æîµ,mAí7âÙ³\Cj™$›äN׿½]1o1»,»]&×ðEªÒ^¥žâ\Z°ëo“K¤”FÐAco°][×ä–R-eb*Þ³ÁY1F((A¿ª§FåTÕ}öbšXW}º—;BÑž¤ûöÑŠÁ’œBáëƒàÎ¥wã< i¬:L…|ÚÔ›klˆ¡.²­˜çÏõõç9t£¬•‚¯hÅ«šÜ©u„«ÈêXž) af òýèNÍ`å3¾•ß¹>uSÛÃWÕÀaœáûQÑ‹)€y|¨ˆ Q-À 7€»‹¿¹öxÏÖþô¿2üÉÖjúÉ‚\XG_"8ÙA¶bé0tŠÜöx£ÃƒÊ :ñߥÁo Oïf$‰:_„Y²šVrræì%yºB6×GðrA¥NÊrw’'9+ÌR8ɘϢûâë?ÙKó3Ú‚3äi¤,v, Ó;í¦µ¿ ®pŒ¾˜’“›Ã9´ì8zF è!±#æ¢ÚŒíQDH ¹Ò͉Ÿ%¥ó—ôftŸ^¶a›ŠÐ—zᬌn¼š¾®>zí(ù¶Zu° ï†ïú~?Ó6ÙP—ANæI…:þäQ Çñ²],~ª”³–T”æŸFŽqk<¬twÙn"bŒý:.—$o8áêÕ/É~Ú9híMPc±§%AóÇ62_w:Ð?ÃL8T ÿ?AwaýýÖK÷àûŽ®‰üÌRÌä©KV+ÛÑï?!ƒM48ˆp}T|#Õ? å l`Û vNœôäN.²Ê¤F¯Ÿ£§íŠà³òF´ì2N`¸ÇX 'ò·)Éç/˜AÉàc“ÜtT€·ý ¨6pe}%%øIrCÎáõ:)ÌBˆT'  ËÀÛ©yW9Z_œÛ/‰Ü<6w «÷ûŸ¹­QnrFjLL!èڕͺ¸­ê´tØHû~ìN‡å¨³Ÿ¹zë¶ E˜cR‹˜9š†R™;^Ht&)ÁI\}_õù8¶a ¥¹*yô.ýŸXi$I’é_ÜæéšëZoâ2ïƒ2!X a±–J,ä(‡×‰é¯n•«Œ™ã-6Ž1MÆìÙ…¨…ØgÔé&ZËšé{JZÜä¾x´;nj&’é?ó޲õÃéTzl¨àéÝUôàÌà–yÄOÑù£úqôðíÚpQN Znçå&}² ÐÑzŸ;ÛÔ%*ŸùpA9n©ç17µ£’ ÷&Þ ˜Ø"ê­{b‰?¨]E ¥~ÃíÝø>­¤õjpº­3ÀÞÿU†Êtªà„‡(ÖÚœÂq ˃«ÀmuŸ4!ÞiÛ` ¼Ö ‰V7…+öCn%dkŸ/3«ýt2hl¢,lüáß²lÇ\@¨ÎóšS2%ÏÑ4ñákEj ± &h}Ÿ—~Œ‰a9ù7Rqr ­üû]F i6¢z“™Ó¯sÙá—ÏjÀvwL?Œæy|»ôŒ ·ýÁ!pœ6B«3·Ùc¿þ§$¦Î98+æô/(û-4ç{_„Ÿ]Ué—ædt ¶0¢õŸüù¬2šñXÑÏÈ:êÃDí\ømå½F•½Ø‰©›­V¶Û—¶H/ ÷a;žZÂZD ½Žä·á•óó‰¢À€Câ#:ho&]ÍëLO69~2á%å‡êA8-žRãúgär×(®ìgÞr»áÔŠ¿zºhóU<~ä2µ)V£L¦me®¿¶,xXãÍù-›aq›õ2s›ß—d#[Ç2¥9_’B`ÐÏ”ŸR_i…Ñ8ÉSeØ‚•uÚ+,wá¯qÀù"ÙÊ2³WÁþ˜ƒY°Ã!õWKiY-|‘ÚÙ+MÅu6½ H‡€ ’ù¨—g÷&d¬ï/R-eb*Þ³ÁY1F((A¿ª¦é£›EŒ5ijÂ8?èì‘¢•’ qZ ËÒœO[jôõ‚—Wà" þh‡ô‰§s i}ÅA4‰QôÜô(SåvÊõ‡0¼>¦Rl›¼þš˜år˜R š!@WÁækKuPRtLÖOÓè£bR¸žµ¬ —NË„[Ã/ý¼îŒjsÐ X×ÉÈh<ÁŠ1Èfˆ [ÿ(ýáÄgÙoå”|ëæ³’8ž46X…\R>¦vñ3³çljp/lƒOÍyd §#FÅ-Ë;7[Uj>E¸Ë¨2ªòV 0‹¸”š`8`Y8ˆJ®4¹ÏInƒä‚âe«)'Á±’­½-•ÒÈæŽ=¯Ú?GÉ#/²‰!y]á›Ù“ʧ ’ ±GöH‚ÅsX³d\.·¦(ÜÁúÖÚÔù²Òˆ•í½NÂú»\Yõª1rêÛ…>6v;’E‘òŠá¢>Ù÷Ý€røe3æ¶6Ø–¼{qÒnµ«cðèU³’j~©|f…Hðð”Sèå“÷œM48ˆp}T|#Õ>ìÙpc‰=DɉYý t‡0ØËh[ã§%²è?L[¨oû Þ ëƒÖÇ̈¹±,´ 8C˰· YOœáªf¹ïFLyC~ ¿Êm2`¸of³I3ž é>£Åî.1ìYµQZK˜}È®¦š•g'©Oײ •žk“n=Es.D FØq(3ºèílpû€|ƒgç‰WöÑ|Õ>øó›°'t‚ø‰ðãHöâ #àˆG˜¼F®Ðõò<ø2²W}6mâx qâã°{<Ê¢šî˜B8Û82àfoz%@y!v ïæ¤Ñ©+dÂZEŽ-QCì‘Ë®ƒ€òK¢sÛô'V'½Ыö¯»J7w0EP)™@áÇ·Œ;÷ƒö.CtÇfšñ`”ý ²$@á^Á—X¢»ð¸€ÃíôćÛÝWV ËäÂÜ…Ÿ ï:ÿW­saVuNÝ#ˆ²Ñûi¶¿˜€„ºû‹¬ð£M¾éLóõ|Ý9ýø$=Dºo6>"mX߭묱G)VÄ™ü´ãM©~1§"æuØŠƒ·óÄtH‚ÒvØ÷pË)\_Þûü¤Ÿ­,…?‹7­hn-Œ÷¹KxŽœv±Ó¤òãÖèQ¯¶G÷†Ï ØÐ:±ª”˜-×hàˆgª{ý­üVa :–íÑu0_áç˜hß—×?ã~Ù‚±Y—Ù¼h¢=4"AÔ“’BŠžmo(䪾ôJüÝUN¹tc(^T?€O¡MÜÁðMg¯;¼#!­Mè‘¢öð>æBR›-n¶&PàCjX°ïÌ–uúЂ5)ô¼–÷]Q'yvýc<¼ ]YÍÄŽùXu”Z±—^½Ô5]Å4¾ØXCŒ#惽7fˆÒš seÑÒð¬J?#6JýZÜ?»ÿl÷ÑÂþe·F&#RQa4iŒDy‡ û<h$º¨ÌSËWbš2ÜCR˜UE…´ØÈûÓiœ]> Û&ÏýªTµ®]!ªº!vÜѾj¿'K7œªèÆWbü†$œl“W‹¢Zö¦4E{6a•5$¿’+_Àƒo¯t+ F4q¥Ìu€HÓô®zçeB«$'"ª¬Óp·æÝ‘pm!¡ln~¤Rþ-}0ñú÷™`\+´'¶òuünìVÐÁ$ùCÕ”¦å·âôÏ{vMh ±àÀ?!']qs> úXnÒßzƒÓ¢#´­ÈËšùþ*(Šp2ÍÒ¢¢±ÿ&ˆ§›°`Ã1:=Y¼H€V~fÛÑWÒÔ¼?Š^"(+-soý %ÓvÏ“<ÂÃo7¡–Z àg¥H}Œ9åˆÎöeέƿK9¬û% 2m ôˆDh+ƒѵý²%&8æ.0Ãø,6³ÌÛ>F˜·»ÆñX£gñéHNÀßçMê¦gæ4Z‰Â.è{Erg‡"æ¥ËûÆU*Vƒ.ÂcRÉ,ãTÌJSúi¤…~›¨1÷Ù¸þˆ€Çáã8Üõç2 } ~¦ŠÞœ¢g¬2L0éþžbñï{¼Ø•süÁÀ÷Œjân˜Þ [‰ar˜Ã¶ kÂÂf"±Àt’-B¬¥;siø%K§.ˆVR9 §º·™\TÂëSH ÕÏ ”«´fbT¼‚e±qKf”Éñ‘3¼e¶1ÕøŒSJaßò›ê7~í o–QKF°"ÃMÃý±ôc8áoÛ¹‘D/Kú+4HÄÚâS^áç¯ Ê7w^žåæè÷‹•^l_¬ÚH`ì VÊdçG,Þ –ÓB—ö¦möë4ÓÎ ¦‡ß6æbOünaÃ7j[=’ŸÁOãaÁ_<Ÿ ñFî¼§ƒÂ‹ 罨Oµ:l{Fó‘•°ö›}”ùfB’£[˜ÚÒ´Çuuv¡ãã G+/š¿1ÞWŒ©H·Ue$îµ™Ÿ`zó?õè¦B—aÙ°»àIÕ)^;4®\µ¸cóñr6@ªÏߊ—¶`äoLrÈ•‚lUø…ý;é ÁÖhõ¨å„"zöF"f•Ä12Üïž=W÷ Rþ²UƒAo³} ©oGÇk: qA[( dRovËãÔ6\ÜêÕŸgÁØaVB’2?‚ýZY’Ž¥B-¼G§³”CšAè†iIrË`Ó•þsÃq³µ-]ÁÔþ3ÿr29;íÈkD¼_Æ_§O€‚ Í2ª ûüÅÞÅrDñúž%m¶}P;ø˜pˆ7i÷ëóy^«­OfÂ[kÇZœ¶ÏGÿ$¤*ßPå«‹`ß\ÎW–ø:»Vkœâkç2º¸äÿX òAQ$†bTä ÖdK ¡™$Ã$Û/š#ƒ•`Zn…²B›‹c(%xˆOÈÇð©WÏ%o{R €S_cú®:˜nÒítÓys¹óÆ Á‚ÔhO\áÍfN@›ß××XwɇÒWN­ž@~õ¦kßS{§ã0ž™ÒÁ.ý!€ª ë´}X "Ë?þÊY'ç&’Ñ>Ô"·àªh}ŸMÖ"ÀC´{˜yÏ”( ͽýgd0‹‚a~ê±û?e«³fƒµ¦k¨F•há5Œâ‘°œ’ˆ¿u¿h¼Óî÷yHçèϹ#'œÓTá¤- Wì·–)…L©œË@Ò§T©êÃÁ} kFùQ|àBä'Sl]ÐÌƷlú»eûÃ&”'Ï<øX‰%hò@}¬†jj§ù?¢=+)Ò8kE…<µ«Wà"£êñ£òå-(%Iªúù֪q½Ÿ€œ¯VO:éI¥Í#&½'•þƒ=5Ê>?šûŽ š€H›GÿWŒµ­ä=OS˜>R׺µàµ±=€†ðeι ¶: 7)º*¨³†RÇÑŽSí%êlT~‰#‡" QB}Ám[_˼bñ-mÆ_6ãõ KS7Ed¹[™wðÈtPö®cqíÆ?£­Ü›P§KÒrÖƒßÔç²%“ vÁT!¦ñ’®¹s ™ÔÀ¿5Tá›8éñ´:q’õ2¡  C¦£“0ë„?;¼'cÅ?íÎôQB‡Œäs žÌRýÛÁz¦T+…]»ìöÂy%öÒ•Àÿïlz¿ àxq¶ëèW?(Üß¹Ìh¹HÅ?Nkê»Ö­>È’Œ×衤äÿjÑíÊlÈK«p©òpâFøß “ׯíbÞ u¦„Âh †f¾ˆÐ@½ñëv!ÐÜÞúsfÒR·à«ëßer({Ø?i6ƒ+k€ßràßÿF /èÌxLc]dâŽʤ™ Ê[pL%GÆ¡Óqï§é»íQKÌ™^"Ü7Ç<Ó]a 5[þÅÔo†|·Rïчp2½8+®ÙÚ{H—£Xù2(:–ë &VP#^7Ç‚]iç¬Y;ÐŽå]\úv;^ÇË8JLÔÐäÒËœsäY¥*Æ>jøQl’9ñ3…›:ÄýwöVè‘HÙjSúl)àe#²ªäoQAÛžM|UŽ·VüèBtÚóÃÅúÅWý¼ÝGS¤ÂÁðç A' &Tð7hyt´‚žfåWË…-cºöÉ6¤jV nº8¤À‚*ÍòôB APáä‚ÐI?½HXw‰:©©Ìº˜JïA#u^~(Z«¶"³-üE¯´FïæqþˆØs*~,¬áÇDUï]þ+U˜ºn-’<ü8ÐþÓÀÎ|Ú9LâÖjáÐíK¨ïŽÛ³HV] °$*6´t!ÑvïWN%"±'º<ÖØ†âêîTˆ¤8L(ë‰TÁ ®| ‚×½u9qþ¢¦\•ZUY(Dš§…œmÐ^‰ÿHú'%Z.oYÅ*o÷ã[ê¸4híÎPV6¹Éî=’íƒmÒƒW`–§Olv5ö!rç,G$C^™¸ù¯ÊÜHÁdõ/l€Ð½6ë4E[Êé EfElhÙE yø|&¡nçÖVgFQi°B£Õï.g“ùú8i4mµå¿-u,N))0õÍ–ó ž¬xÇé*‰÷jc‚j9üÑH5šˆ¦æ”®6ÂJYXůéUÎ_Óš%ÄÅÃíôs‡ÛÞWU@ÒbìÅ”³Â»ñÝ?ËO|?pž™¢®>ôþzŠî¬óà>LDÕ7­Ú<×b†wrOxÌàòm׊¿† ¦j~lÌþÙ–'Î2$rÌy–e@%wÅc«ÿ ™,báve/|³õŒ”  Ç&Å1šŒªÓlBð3äÚ¡—ÔÊÔÑíÿaš(¬Ä£9HŒæt¼Ïb¿ ÓƒþžM%öt-+OýtˆäŒp†¢ñŠÐ\:Ü1úˆ…u¼•åÕB^KªTA6´³ásyØ¢#?žXøQ_¶Ùq§(Ä_q¢=׿ÓÖ^¯_QØŽ9€oåy2`æu£j´*s Ä·ìZVãñI€Ús™4†¸JަÅ~:ÄñüÇþ¤åÓ£n<««KP Qµ¤# zÆXÄ{Ç×ñ5¤«ýF·=LA…¿cã54ú¥#ùÅ ÝkBÒ …“S ½ÕVî¿fF<ª §/zCö½ÿm®/1²Ù±G'ñOˆ÷®´½òGŒ¸?>òSñ™“½¿¥-=%œ‡µø9‡žþ—ZªV^0+v'(ô™dŠ“¢ÀÑÒl~Óβü~Þ~/ïÜM°²šÛQdÄ`JÃćz³»üÀicYtÆÂÊ®^}sµÎI¾­SŸ±t Dïc¦wùv¨= `ÏŽ#pýs)Å ë½õÖêY§äþP§á(™dŸ!,•@ªúG&çÑï¥Ú™í3ºðKhóØMµ`Õm ¢Óú-Â]S§æqЯ[p ¥fÈ@9Á’#áN™ÌÊsf5ìÊ—L‰‹”•ðºƒÒ‘Á2$Û_s›Ð±¯F½ÚšÂ·^ @劅F†…Z㶬;ÎÙüPuDÛ¤üÈ!Z(½à-®•üFÖ,9Œ\è°­Ô Ò¨cxÒy”/æØô·_™ÅyX{vÆÇÓÄ~£äScz/ ^Æmrܬ éghIí"KÔÂDò{LÑd50bàP>BìÎÜ} k%©›…¨˜~\C £,]wYr¶E~µ@Ÿ·H³"æÈašap»Å)Û¨ùïfJ¨Å¬‚R³¢½¶Šƒ¤Í÷Ëo7î §ä›@ªÏSŠ˜ ‚¦£>—&CTYŇCnaåìßôB7.¾pˆ…ëŽJ¨Ÿ½~R¢\À应™’‡©w¦bJµßD£©”ªøáÄeC¤õn˜Gv¶=o²ÖÒEß×À¹¥¢ÀÀ>î,¹Z/¿âú™JÄ­ÁñÁ(æ|úºòf9ËÖâÅ'Ü7ëÝ0ÊÀ¨“¤P,Ÿ‡1´Ò‰VÆ©Øp›€ ͯù|ûò/±ïï¥ô-öó¶äë H›v(¼H" n+Y8ñŠÆc†áqBúãœoL”ÂÐ6±W‰‹/xÙ{äú‚ xƒØk!®©ß×­3 E’²‘;=š®Üö?Þ*ô£+/²‚:4 ÁáÚjíöó‡õº'޵Ø{-.ÿBR‡‰*7z4$µ6×ÓúÈ)‚…O›ÂKœeÄ1xÜ4ÝÕ˜@öµAÈEIB èaBêP9Ål‰A0Ö)Y¼ý!Gž¥Êå0° žöáÉœ-xÐV`€ ¸b‰‘W‹>‘©g&r MÒ¯=cvë šÇÅh[/ejüâ”åÕ¤<ꢈ4™Ü›ÁC8ñü@VLA8i äc…q±q9†3'HZ¿WѽYSŸ5‘¢P>ú(Þÿ+0º¸¬Z•Šÿ6ŸáÓÃñkË] äSËÏž·#vÆT<Û'—¢áÁr±|aI`ß½_`œà{¾Å*«ª±nض_×õ_µÐ$÷¬Ý>7y!iÚ7€TÒc‹åsPøä飖"ôΩK®Ð&«6´Ü„¶–5`_xëú¢Õ6»21žv€8U¿@ I•Ì„¤M¦{Ò.@uÃUÓtTÞ±ï·&¾–ÛTóÙÎ@´PM:i¼Ää8<Ð(ÍA’)—C  ÉŒf "îïLÒÂ(†Ðz¡µ˜QŒB7¸P­ªEÈÀ&ùUÍ B_4÷¿hfrÙ•y]nŠ’#!}¾¹J›»çkJvFõ„¡ÖŠˆODŸF=ƉŽuÿ?Æ©²œÊ{ËDJ±Õ¯F#Ç1E…C¬¶x²Ò6µpøGas]j^uåoè¯"jo&d›Á{zÓkñ«u%»§à½à&Ñ:SR%rËÒ\Wá9Z0 o AÓÆ|Ù¯Qv•iÈ@‰³ùcJâŠqHöwœ«&Û™êóDŽÃœU¾¯ÛŽlÝìêi?ð°ö‡‘'ýÿFcXZ`¿K„À¦øšj2y2ãN9¯2Rt£ŸAå ®ÓÕ›¡ŠV9ÐfBRaèZP´ž–RŠkᯉ]Sd:zîTÏëÀ³ø8“ÔÈæ>jE9 8v£ê#²§®>o9‡åÒf[5Ö0ð¿!Ïô 8†“ÞŽKʪôu@àµÃ6S]ÛêLjékî ±=;bl"ݸêX®…¦`ŠœKiUWc_ÉŒ§G[(d' ÅàÇyPIû×<[õö=Ry.+Äea]—DBØóÉ´ ¿ÄI[MÖ2éhŸ»_wþ;àAŒƒ¾óõ‚è NâÏBÀ$ÞT–žŒ}ódo‚§VÌà½Ê¥K=•h©RANÑÊ?к·Áõw;Õ׌ŸÑHÒbìÅ”³Â»ñÝ?ËNŒÁ^NòxÙßç6¯¥ÞéwÉÔ6­†6Lü p Ǻç­,)M ~˜ù`´WIƒPøñ½ÿ7ò¦“OŒ¤f¶/­‚–2 }&4ž}Ö”}˜1ÖO<’BÙgJv¿åov?s®Ž?`ÏÝ/Ý£×hÑ!´ZŲ qVgG-= ƒRŒ¦¹ÕC‰2¤Å4Þ$ DñžÒE‹\´t@ã´Ü—5/àiWd…–>tô%û¦"!ÿ†ÎÖ‡&Pº–ñ÷^Ãæá§ÁþjMÖ ›Þ8ï£øÌ^~ÆÄÒ®µ§þÑ›6ù ±Ñ¡W?%´ÎŸvÂwgŒ7ຟÄrÅ!@oézGu©²•Îèµ…Þ×øõJr_íkå5ª>K÷‘Õo‘Ô‰5â8ÁÛUç’£TI•n:;¥? bã÷±Jܸ*Œî8±ªŸÊŠ2oaµµõ§È³Ö»ë-N¸:ˆ9 •nÁ© h@ÖV}¾=i_þ.Çt ?x5ã‚ç¸æ3:/Þ ‚«šœâaóáóñX}×Ý:TSªqÏÈêC;_¨dÔžô”AðåÉBà41 »Ÿˆöù+̆¸ôÓŠQ÷ñ‚jÖ¹mAÅs9’JÚ""Â@éÏõE{_D>1m,qàyƒ§ªzÒïiÏNúYÅ2 ºa68kn £Ôîš7S’¨I_eváªÆSh"g0`Ò™uIÅÀL_EÂJÈ<Á¤'n½mz¤ª=~ÚÔªM¡'PqÈ2$*¥ºD÷õÿ6ÚxÌHEHfZèÑÂxuÅtŒ[à*Á´þ|Üj|ˆ’5©ý°ØðÅRõŠÕà¡+¢Eý,ùÝet€,ª} xÐc•Z¬ àLO)2uEÈ1ç²ôÈà½ß—¹…iCr¤îú¶ø-›"Ä+Y›oŸï´^á¢VìÐÚÔ u‹U*t[ÁÌpõn(åùHI ṡt€xŽ]ÃN)Í‹Q;¾·L™AE¬ÝzϸaâÊ¿>fƒL¢3NDò=ÍleSúÊ‘]ίˆÞÀ~ÍûZ¥À€ ¯ŸkŒé¨p©feÁBm¢ÂïÓþ¬>*§žpAmNí¯½¥°N­u- Nù—wΗs±:â³Ëa†›Ú\]®ÓÐá=doJÇZ Òë8€Œ ßJ³%MõäÊäB h‹Þ/À¢øäÜá.Ã*¤Ì²™XÜ•™«ìçt)æY˜9¤½©7 úÁgͰg¿ï™é£(¦ð£y—Øú¹þ© ÄuÅŠ,±vëJo¦,Å °¸•¶AçŠY•ܿ¹1¿­Øiº@–c¤žRÔƒ‹ºC ï»á>óai÷æ$S½\Ù'ÆT<Û'—¢áÁr«tÖ÷9–=TR·%$ “<Å+¥+€F¾©¦>OÒÚPˆE1ÅÐo?ƒÄˆk˜CÂ7&Ë×2K%UÁ X°©0#%ŽÔåb®Ê ¾É´»³<}º 1„€Ã±Žçº@*éåTÀS-tÒ0ËbÏõ|ƒGêó§òOUx¤uˆØ‹›ðb‘«ÃJ"Œ©ä€J-iŒ¶ë)…ÞÓ¡à¥"ßPˆOy¿V9qŠx[’lù8¶Ö„üËÀ}7• ý…–O¦ âˆÆ™ìc¢]Þ –®'@Yqdäu‚ÿ7ätßãû¸ ¤ˆ>€mþºÔÆ$seT¨u?òħñðÑt@ç½½I«ó|¹,ð;b^ü’çH_S?QÛ%0=Š˜ ûvíåyùºXȲ­iì÷@#•l'í]cD&Nb<¬Æ®õýB[½'¸IÍ!ÁnOÛÒÓ<¢›ß%ÚÚ'+ú ,{Ú´Ù$¬Žfµ›OH%æº\º+& 6ÍC‡”ܰ¼`¯x¥&ÝÜ&[¨V760æƒ:Ú"F?ß½Mù¤Ž?úy^{™5ûþûv›UoY/¨Zwr2P³ó ¢ %8àÞ0™Û§:°‘æFàúîªCáü$D4à BA‡æÙe*]Õ˜þæ2‹èÐö2x"(!÷×Ðx÷…)˜·Öø@¢Åù4X?˜¨¡ŠÀ)¼šh‹T}ø©kô~òñY{ÕŠ”ÓF€ãöï õm¯íèöî†?nÓ~ݾ­~¾­…Á|ûÂùöçê¼UÞÍü+ZÕòü…h‘%À?êW©±–ÈUBd²Ы·bBƒÞ‚Ñ'1R£7,J…2QL-þ¥;ž×ÔÓQ”JJ‘@ÆHÒ|ü¶pÀ^ñÂDäýð}°f“Ð¥øó}ƒ«ÐX0qoìörÍYzŸBS¼·MÄürüÓÕ¬j-µ/`kËoÍ1BH=B‚ÁaÇ繻ȱfãY}³vð>‡‰Ð4§äG‚¦ÌxóŠ¢.*õL¬€ó‹âÔR'ÇÎfó~v†Ä FR1PÌiíŠ8ŽNÒj›Jî€ }¼~ósp.FáœSšDjûTA¾•µ~¼qC÷ O’wY§Ñ݈œËsGýÕÚìZMåzzoßËa#ˆWœñyÛê=vY¾/J;V_ ¥*ü_±/1/68­ÇÍl%*lúc¬vü£‰zÜÃ+¹å[ןp/÷üBzC¯=œ9 BPJ4¬i¤ëœm{Ha[PëÈåC4ù"S´W®À‚r0$'£©ÿFµsÒh;ü2Y>¾nc•þ"Dt ŒÐ 9äÑ\{é15ŸÆ¿ $/rÒê^<Žé ãr¯­Ç¦É‹04Jøû>hf¸!áÜÅÇ`¶Ñ-òu5&Ü( Gþ9» OùZoù€ZÁ&®Ig2­¤Y§þI»ç€ïb4Bb¢ÿ_­y¡Æ3È*'H ¾ISݘնŽIAëÃ#‹Nb·¢x™’f»h~Ek¡©aÿ~z¹O…;Uw1>¡Eíƒê󃬆IáHPÏÈ;ZÒ\‡2ÍTÃ%ºRñ–ýFl†ã‡›´é&A½Ê€­±ûm }Ê…Z x,ÀÙ --Þ/G¸ sðø6+*M™:~¿Å3½:| Ú ØR“+î—cÁ–‡ƒ7>ïd¸ý¦6ÃÝ‚‚2OjÒJÉ>uª²Ïj'–¦ÈëŸ|…·óBr•ìo“¢ÔÿICL_•‘ºîbÙé.£\Ëü±çx*¡±­ÙÑPBánøêE3$d ÿ ®Rhš™ÉP¥^úî2q¿¼Q›‰„O°dN½¾¾?4˜Î„*úæ0ɈFù^jº²ï©Ú›:~Xc(x2µqÕPÆ)6‘¥ŠPN.à‡Ø£1žÛ„Ìô_í•™+l‰¹í¬ŠÙ´ôŸ¯yhå“Ëï[ý¿}Óà ¬?b‚7m‡ç³©,ÔvæÜëaj^»/RAÝ‹‡)£sÄ_Ä;ª©8e 1„`2*詌G MzNƒËïCOøB+$º3ÃÆŽ<‘—šq?3M%A„†D¼õs ®‚kQä;÷‚Æÿm^ë6 ºèòm7·sXScý]’ OþPU°Ä­9€XB6´ ]èˆbªHVX«:ŽüwÿEyO·'ö¤¢=;¬üS3÷¶Òˆ‚ÁþŽFGRê,~VôW3×sA]ÙþkF7ïÜN.@D³~ ú6ûŠ24zœðܵ‚p 6ÕÜléÚ‰N7.ÒÕ‚2°Ü‹Jìñè©ác¤ó„þ¿ÉçNðU*ƒ1)¼Ù…5$ðm«K•‹ì7§&P£ÿ-9lƒö÷ ݱeb}¢/¶&·aŠÅøGXµ·VÅ”MƒØª÷8ëGØ n+àš °#{^*ƒ©$¢µáÝïà.óêwjWŽ0ƒßuŸ–ò‘Ž9o%¥ò„x¼ 6ªuŒS¸B%÷Äsäqc$ž}ÑxÂA€Ì1çðUÏ–Š4‰9‰’[S1›uZÂÙnëŠÆ‹ ž\Y¬b‡/CªygÕ.áA¥&Qð‘Ú0k.&mhk©ã–êí²ý¦mñ º'ÕŒ \†ŒéãdÈ'´þˆ@ ¤Ï¡Ëûh®ÂV¥N£õý†¹J„oeï´j‘'¯L¡Ö^Oî™ý~<áéC¡Æ)9äHcuM´ˆï¢ êÛ¾™„Äq¸JÛÇ:s"¿_ëÏß~ÂÁ6¨fræM€Q¦‰:fS@?›GÍİÎ8‘p™¤­}ãpÄ!õŒßábNKø8³³‹Ö®a©o/T¨¾U¬˜^(9½ZÁ-8FUIëÝf 9OmŽr,H¤éâéî™w ¢íçˆ>À5|{ã›ýÛ)rŸ'‚}ô‰¾Ê‡ Qz‘'Óª™_À¾.XH.7f`‡ê3ŸVCŠP£Kõ”¤Zn¼ooø¤Éì‹g¢Š» =:Y…ö(ò?ñ¶©±ª,:>9º=é”’h,F›‡.߃ãFú;QRö­CøØÌ’.Œÿ,UUzNIÕón“#hØqéy¡K޳LÞrs¨÷ê<Šíkƒrn­*›k>žé±¸W¦ù¯í€áCS©®ý“Üa9çà "ûV4;TúÆ =éªÆpfòdÀÒ©¹6oÏÙâÇ“ÕC`˜)Þ,Šù›M±…Ôl´ÆxûKýÀ¤mÎøÇu©²s»0X`;√1E_¨â𾋭…Û¯Ý'I}ͶmÄÅàÖb3 Ãr´Æ3”Ú‰|Z«±ó¹¬Ëu©jnñ,($˜z€ãWv¥L¨»q¥~_Y6­ß V- oi ^íÑ£¿ZrÔÊbˆˆáA‘@ÅOv¢°YSÆÑ ×ÏϲˆA{=ÒF { Á.A»-&a¥äغ|ëÞ„Ób6# IüÛZ¦ƒÃZq}?ê&³ïZ¤t‰„`úQ‘Œ#ŽP#Ì>ƒÇàQ›l޳²[‘|YÎÜ2‰€ @@„„¡5ÔkQv„a i‚ó™VBÿ{ÿü]jû®¡À«F¿æÊnY”—9à»I´3“‡lúÀW¾ü_šê÷¦ ‰Mµ\ªåo O<®˜¶¿4nâ0!Á3M`hÒ“VßïŸÐ;Õ´Íxêm=’¥äÿk±6+.¯&áG„RCªÙŒÖ$k|†ðFkÅg€ ` „ÄúX(ŽÄ5ePFî˜;ŸFÿÑzd©vWwù}*|ͦŸ|XÏ`ÀÚ T`Žgðº˜Å>§Qu“=ůëùíQ¢€ô5]V$ýíßC]¡5挱·X{aæõêTËè[*¨Á*%B gT§„„‡u¤cÁÂ¥úRÌVlÕ‚N‡#²Ã¢Uh aU$¤K ‘„à Øw@ @‹¥_b°¿Ñ&“=Mí^ÐiÞ˜ÍóµŒZ+V!ÐU –&\ËN¿x®dÃzÌ.)ñнešÁP¦µ`9”yçðíë1fÄÑcð.0—†äMз«Sª!oj+€€ LïΕ{ÜäG<dŽѦzyun×q1S_ &WÑåwº¬É!vã Z )cp£<Ã~¦³)Ø7Ì$DDSŠ £yœT©H«p gû Bj"…TÛU'ÑÁ|… U'Kz{I“!CÊYz °"&Þ‰ Âæ\$—H¾jÌäšÖ"#œ0Ba!-„ùä –iÉ8Df™~«%Û³²b‘ÂWŠ“d˜¿ƒ×RÌ@4-$ÞhôñþhH 2 [dò×V¶óò÷›q0 ŸÍ<ú^…UÆæCÐ9}ÇŸ†eφÞy×åó±gŒÓE*¯ôvA@‹‚,’Ûq&H]6>éÌÜB‚ÞÖà—Ê<²šâØÍB·ÇöþÄ¡*Fþ¢¶Òô>lZã}kgµ%Õ¤1üÖv· þIjÓ†Åñrø9 1÷ÈÌ ål«„¾ZƒÿO;e$/¾ÇZË©úY ¢ó @(TµP=6WguÝ·Ä9 õlÅm´0[ÈÁ·©eIç¯BÿOX.‚€%°+Õ p§5—ûß§ôž{$˜¾*ôãzêªñ·Åï‘)(¾À}öYŽ IW·üò ·£QûÜ“Ëe@÷4Á‰ùë¢I`çµä¼°É‹­”qòOs<Ã…$© \Ç W C7IJìÑUH:î8/Á‡DfÅã BUCß³ìsÑ^HÕä•^° iœSõPt®+bï(2õ/WѦi,K“)B.m:-*NÙU¶9iæ²2ï¿[é-öâgá¼õ¾Æ|ÜØyÿS\muA‚2ÃR Ï"Çx„ÒæX µ•ôú=Uq$>Ç ©+’ø©2F­»]8PÜŸR¾}R殳ßàì)LY#éØâi$¥oÌ÷ 4êâëW£3ZÞéí?,ÛÍVû-áÁ>AåÆmÃ{mHae¹P¿Š&mä17¶ÁPÿ3Ô üKà­’Ï%AW ;Y'‡›±}…]Ó%j°Á|[ 3”"Z9¢L?…ùvœ–Ž¡H+Öõ5õ/ÙÿóMP®s†þ±ùñî»§y)ñ9Ïýtá€ìÚ)'ÖŽˆXçÐØ¿Òî”D:ùzÁ"8ŽÏºÛD¯¥î-Ë1t)ÙgÌY}0œ;e1ÒËB/(ïV…2ò‚3ÙÔÄø/Aæ¿=¥ÎyÈ"wŠì±o*ñ'†ïRÊ“'íÞÌm1Á¬¿÷w1ÈÚ z)¯8ªAµ ØýqóMdb($z‹¥ãlqc l²f‚ #)Gð˜WÏx¯Cs«Íj°¿rßþÙg·ÐèôVtÈ–ñ pÕ„Ül%ñ]äå/†-Öy¬èü= ¡ºJnaW06u¼•«Ï-¦ôI››·fÜ2ÀN§íO(&?îGÞÔ¯VÑ.oi0DLcò ÕÞÁ¾°qøSàÉ !´•™r…í¹/ßfðF¡¸JÖxj/BÆ¿:nuÜ*]ø‡’D3"É ¸ðiñ,±ÉÞpÃpÍŸ#ÒôžpÂgÛ>CÑAÈP©Ep‘©µ]ìM\•ÿ’Spœrÿ eùð×̉çÉA¹Ä‰´Åª¼Ñ¤‡Ù‹ê F,ëÀ€½÷àwQF‚AÿJ˜|µnh—ã3-2Žcqß-5]8ãÀ•ÿ[¢ßÓºR>aAOi“mË6%Â:u Ðâjæ)Uö^ûïjqepN€©:IÒ|gÊœå*¥zf‰?ÓÖ{Ë–ÔË—wŒÑR™ãN™žªþC" ¸èçùVÚ=èIð—¤J>2qÔÇ:.‡ìm·NèE¦[öR©NüÇ´/–«B•F£…0Ÿš6;È!Å] O×þ1†aâ6Ì>ý•ÇŸ1Ôˆåƒì/ÿ>Z$7¹î¾ª#gDC€å jÃ÷(Ï#vl¶ÇEòW!+ø[ƒ²«…d“â–£ùD\vHO‘ ¢'…>F¢‚±$PÃlºñ êÐi²HåmI~¤SŸ…K£&Ùê)p䲨3,”^°låÏwý·w÷UÕ îÌ™e=×T™¢úè ieA_ÆÑO1ÎRÐíh82z„K°á GbÐmj~š±ž[+90²@C©‘TM‰ˆ¿´àk6¹½¯LÇyè'†sA¡n.jýÐZ9Ðä¤Ýr¯þhùÅ"=¬Q›ýÖ91'üõ„õÛw›t²iYOÚ=êFëkQíÅØ°úÍ­5è¾q6+‡3Ê8…Ætb:ËGmUYâD„^/]ñïLîQ”…66·…¯½âÚË¢¥ªc­•ü÷S]|8š^a–´öbÕ;Š>{L£2Ÿ²Äa£OÉ€rhÔY¾¿…ŠlÒ¿ã”È=Çå°F™IQÕXZDðWëÝ‹¨~„!{›ÿ"zmÒ¯r~Ç^^éóç8PÊ@\yñÕ(Ähw½³y6invãÞJ¹õq-ø‚[ #Uõ\ žâÏwÉmõ€›Ëõã‚2|ÂR4 ¿ý˜Aª ×€—Ÿš#Ônn[IŸÖ·~ÕOΈ¶ÂÊüñq·}çh!Yr¶ÊˆýR4dž×#ÇŒ¶EÀfÌ™”͘(¾3CÙ{v{™oǽ˜™°AH%×Á·>¦Š;«’ÿ¶ßa²¤]Ibž½ãêñr«HÚþD¶·ïó.áŒJI_ŬŸÈÏŽ!€!¿[V6’úË-áßõ±|æÃ´Z:¸T"›WCßSë–>o;žïÌ€G5;^O×’yG‡¹¿â!üOZ…ŽZ´‚ [Is+ž³øptøúò!„°¦ú}Í=¿Î"Èë¤ý¢Ês/mÛíhÞe& 1 q9yžfGŠhuäÖ·¤Ñg›iïÄÿr[ !ZìðÛ«Õ3ìÀts†J}÷… Lê=éŽcq…‹¹Jœw:¦×Oo“Q³k')øWmÌŽ;L_è6ŸåƸÂÄÿ0¯ûkœXÎ_c—RwNfHLuÑå°¢fDoQîq÷-:™E‰ÀˆAk®Åf'w½6€áÓÒ“D ¬›+Õ ×ÜT„C#wý¹&Â:|$Ö4pË%AÛû²`2øÓÍoóñÝÊ…¤~S\è‰vç«V¹']^™=¦0ƒÛÖ# gü5Ö/=På:̽¥ëî’–]8“\½ÎiÅz¨²K­ xlêW B­Jr.ç‹ÃÅ¥¸ÝWÛG>lò—uÜê&¯y^BO>#-¥­ZúÌmd›™¨lä•Õ&ç7î(eðñ# ¶ „·¨¨ÈJ›æßsp8xX³yqj¯ö¿ÝØáQéøA•Њ6,½áåÃ#Í—d'Œ¨mnµýç7ÄkfçµÁMkÞ”Òõ7?Š&ߌZ‡g>õX§z嘂‚DX-.º‘-ð‘æq^Ññ–Pa¸«›Rή,™Q®.{´ UðT‹šKÇÎ}žŸ4,á±ò0ú,YüˆÞÖcè^ñ`\Æf"ÞöÉ/×Þ§[±˜g~¿eEr;9#‹ë5ƒ.•7í=Òæ¿ƒ Ü™+lºàúH}G»œ—Žû O(ÞŠ '©|píͪ&¾Þ.6¤pbt(æQWS÷½w'»¥ÎÏÅ^¦ÌåˆXOŽÐÑöMôÜñ[¶Šü´´™ÖUàè=¤§Ã(¯ú@:³úh‹Æ5 ¹¯b‡¯ÂûjÇ´¯C/8rM>‡à—¤Éð0O˜ßzL1Ôù FÁôüþ}b3enÿ]p7ÉÂ\­÷w{ú¿büN#€7^3،ıK ‹]äV‘¢Œï'¸¨Ffõ |M=¯.Cîð­$gÓ4@Bº+§ C›fuäÞS«ï1ÚðMêò{akª;!ìÍÃПaD VB”&jO÷/]4wh0çщM\ç¿ûP3•ÓmÌÏPæ;qКpt‹¸?S° ¥%†ÓIÂT´ª¥­œ@õËŽü¢ m†.ZwŒû' ò¹©Ú˜ôòÒæw.ÚHåŽÿBã·ME(‹™›ä ðCàe^:´YnŽLCm­iÇ_áII¶ç¡úG0yü[¶ßÚà‡CÈcðmÎçw55s#üÎÜ´£ˆ=uò¦J0•÷¹íð޾èÉ`©™Ci*¾ÀÞb™³ÿJ6XPžaצ©ž˜#‚ôŒ®#óvÔè¿k³ö‹aõ‹@À ‰zFÊl¤ •R×5“€ßZIìô|ïo(Ž{…ò/ÇHÊ{ñC‘áóñ%†~£«$'G¶”C§©]ö±€ðå£óz´~Ž˜×ÃQ_].šó9Öàß1L•Ú¹_ÄÆð†@#”|j?s°ÖXÜKÕÝì<+²nÇZû%¬áž=rÜ^o*ø¦RÕx¼^丣½òm„ Ô§Ò30sµÁÅ,´í °n¤eîS„¾;­„l‘âyf‘Äuå´ ',˘ó‹Ö,öi°ã5T;íG»ÐÎFïQ)'zŒÖWÀ„cgh¸Äó~ó}ЦÈ9\Ôa`=5’(Ãþç0sX‡ÕÓ¤ÿ"µ“—¬±Ž]‚šÊ‹./,àÞñp›ÍÅZ±Ÿ{.@±Â:B¿=¹º™Fb9Öˆ9I–˜ž+6ÒQ¤à9—l<êÝ=‚R[”êázĉ¥vRM¿ˆ…©(jqPÞO†´BF¤½Z™}R˜¸½ dÕ…ºñ-Z7ñ§À6ÛÂ5ƒ?pÇÛp;|,Œõ/ìõÛÓ'Ü…M˜å*|•1QRöüƒŠE85`µóÂô>½Ä®R[Èý·Ë‹ýøý¶ÊüpyîéÞÄi.ÝØáQéøA•ÅuhÔ‹a¼Èw„ú®‚Œî†o•0»kMRe= Ó•²®æû æÀˆéÕ8¢ÜK–n»Z¡{8@R al?õ=è;9rF³6lÛMÕJÚS%nŒ©ëÈâ é7šsC—À@£ ³¹e´ Ü_Ë*f™ÍÜ#¯ê¸±Û˜îðÑ:ö“S9<8Çw莈ë×X´> 8ÀC,Q/Qø37 ÛQÿhf½´+ ÜY Þºrq§-Âåý ZÚ«K^† >gœÔiˆÀ¡$Q#7%·;ê)|vòÈú“èBé’«©>°"kO–f¤êÆ^Pb6‘#q'‘ò§q©á*e¸Ü‰9VhÞó¶8 £&@:ø~߸}´ÛÇ®X¦J¬j äæÉ“ÉÞ=Ñ…›6G"‚X^½M eoa{ž¨^Y ?¨Â ¬ZŒ%•É›D`œØm´í„9ñ·Q®#÷è`Ñ} 0kXP¹fÅüæ˜ñ©}9åÁH×OWþŠ&µ;m" ©_ˆé8Ó„ð]­á˜ÜUÎò¬ƒ‹yסXìy##íSÐpׯÁ u2?·.8âtC`÷ÔMÔ_k“DkÔWévèî8ÄÁî& ¹‰ï Ê]ƒ6RGÏÑ/ô¬¨¶ûïOäŒ;•ZJäR î…y·ë©Š¥§«”HÄ]€f{»k.†95ƒígWô?  _½é£";¯ pçK¸ÿvÚø"Õd2:¶¥ê^Û&‰)øX"OŸ¾¾Š5°ÁáŸËãÝ&a„„†rÑ´Ó’S¬Ó‹ó *”xÁ¬ð\2¼Q#o—Màw“`K ƒk€€k.° š ž2·[$ƒ W§‡Ì9{–)«}ë#‡²¥ †Í,è™ë»4-¹!u¦0ÂAlÞÉøS¥ä-[LõŸHL+²dH?¨´½¶ÐćÜ{H¼‰ˆÝ¥Eˆ"ψ’Ìfãi`ìö=Ê¢Ñyf]eáIeCº ™àlâ.%A|ˆ f³L¤Ápì£ð³8¿§`ð„R›`ª)”ù?†º+h_âgq>;Óîúê85)дRFéÒ^ËÝù(õY}¾æÖ¾ š‘‚JæP^oû¯ˆ+6DjÔÃ18×¾5àY'/Uáy9.æ>‰‰Ôá }êAüSú!Ǫ麀Í# Ca Óhû®×êd zb¤Iušg0±kd€¨ß‚},ËÊ٠å–Ÿ33˜ªþácl{£Îd°ªúÿƒ{!ø"ç ÐäŒG­¦ü^[$—Í tpࣹà—¤¼ Ûát¶ú¢÷yd3¿?*ŒIR׎*ÖßQìë㕘4Fòšaµ(¨rØÏÿ~û­Ø,î‡Z)‘m×ö–/ø›€WAÞÆ^„Øã>Ê×Èô¨í¦°ÿh±Âìã‹Ü1ÃQôãñI0h]zÿ ’ÉjÚõ/&IDfîû8F`¿TÿVX²5ÃWo  Ï†(\.dÆ€á+wÓÁ­÷mtË E‚l–TÏ»Øó¬<Ç€4Lÿpâ¦Âð±‹<õ‡µŸ×5ƶpüñ…g#š)I«uÒ¿hT8ϾÊ[R“ d7ô^¢KãþÃw÷ˆ5Öð;Ü´t²6&a§Ø w†¢œŽ³ˆ‰„âé®l<…_ ;tY[mÓÝâi°ìhðµì“ܶxÉÎ@^Á «ˆ?õ .&}³¤\SÒ/ø ‘re–‚Í+wŽ‹ÓŽ‰½À`å¹ï‰œ8Þyªß2žo< 7õT{i«õ%æïư{2âèw&À–kìQA†þc^¡=«§Ó©ÿ€[JÃD <˜Cþ¡ŽŽ%þŒPUeœ¯ˆ‘HÇeVÇf¡éçc¹n‚¢¶·½²“Ú³CÖ¥ðÈRBÜÝá€ØGEÀg÷rü¶@Ž]gÝ ~¦¹`uå9ÏY¡ÐbRà$ö4!«ºu6H€¾ï´¸zùZ°jå ‘/ÄÄmª‚S€¼U8pƒ=È‹ˆýŸ¯4”éÐÑß4vH-5Š€ÿÙicnV Bþffgtkwave-3.3.86/contrib/Makefile.am0000664000175000017500000000013413166335473016276 0ustar bybellbybell## -*- makefile ## SUBDIRS= pccts rtlbrowse vermin bundle_for_osx fst_jni wlf2vcd fsdb2vcd gtkwave-3.3.86/contrib/fst_jni/0000775000175000017500000000000013166335473015700 5ustar bybellbybellgtkwave-3.3.86/contrib/fst_jni/fstAPI.h0000664000175000017500000003252313166335473017204 0ustar bybellbybell/* DO NOT EDIT THIS FILE - it is machine generated */ #include /* Header for class fstAPI */ #ifndef _Included_fstAPI #define _Included_fstAPI #ifdef __cplusplus extern "C" { #endif /* * Class: fstAPI * Method: fstWriterCreate * Signature: (Ljava/lang/String;Z)J */ JNIEXPORT jlong JNICALL Java_fstAPI_fstWriterCreate (JNIEnv *, jobject, jstring, jboolean); /* * Class: fstAPI * Method: fstWriterClose * Signature: (J)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterClose (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstWriterGetFseekFailed * Signature: (J)Z */ JNIEXPORT jboolean JNICALL Java_fstAPI_fstWriterGetFseekFailed (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstWriterGetDumpSizeLimitReached * Signature: (J)Z */ JNIEXPORT jboolean JNICALL Java_fstAPI_fstWriterGetDumpSizeLimitReached (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstWriterFlushContext * Signature: (J)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterFlushContext (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstWriterSetUpscope * Signature: (J)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetUpscope (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstWriterSetAttrEnd * Signature: (J)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetAttrEnd (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstWriterSetPackType * Signature: (JI)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetPackType (JNIEnv *, jobject, jlong, jint); /* * Class: fstAPI * Method: fstWriterSetFileType * Signature: (JI)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetFileType (JNIEnv *, jobject, jlong, jint); /* * Class: fstAPI * Method: fstWriterSetRepackOnClose * Signature: (JZ)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetRepackOnClose (JNIEnv *, jobject, jlong, jboolean); /* * Class: fstAPI * Method: fstWriterSetParallelMode * Signature: (JZ)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetParallelMode (JNIEnv *, jobject, jlong, jboolean); /* * Class: fstAPI * Method: fstWriterSetTimescale * Signature: (JI)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetTimescale (JNIEnv *, jobject, jlong, jint); /* * Class: fstAPI * Method: fstWriterSetTimezero * Signature: (JJ)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetTimezero (JNIEnv *, jobject, jlong, jlong); /* * Class: fstAPI * Method: fstWriterSetDumpSizeLimit * Signature: (JJ)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetDumpSizeLimit (JNIEnv *, jobject, jlong, jlong); /* * Class: fstAPI * Method: fstWriterEmitDumpActive * Signature: (JZ)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterEmitDumpActive (JNIEnv *, jobject, jlong, jboolean); /* * Class: fstAPI * Method: fstWriterEmitTimeChange * Signature: (JJ)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterEmitTimeChange (JNIEnv *, jobject, jlong, jlong); /* * Class: fstAPI * Method: fstWriterSetDate * Signature: (JLjava/lang/String;)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetDate (JNIEnv *, jobject, jlong, jstring); /* * Class: fstAPI * Method: fstWriterSetVersion * Signature: (JLjava/lang/String;)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetVersion (JNIEnv *, jobject, jlong, jstring); /* * Class: fstAPI * Method: fstWriterSetComment * Signature: (JLjava/lang/String;)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetComment (JNIEnv *, jobject, jlong, jstring); /* * Class: fstAPI * Method: fstWriterSetEnvVar * Signature: (JLjava/lang/String;)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetEnvVar (JNIEnv *, jobject, jlong, jstring); /* * Class: fstAPI * Method: fstWriterSetTimescaleFromString * Signature: (JLjava/lang/String;)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetTimescaleFromString (JNIEnv *, jobject, jlong, jstring); /* * Class: fstAPI * Method: fstWriterCreateVar * Signature: (JIIILjava/lang/String;I)I */ JNIEXPORT jint JNICALL Java_fstAPI_fstWriterCreateVar (JNIEnv *, jobject, jlong, jint, jint, jint, jstring, jint); /* * Class: fstAPI * Method: fstWriterCreateVar2 * Signature: (JIIILjava/lang/String;ILjava/lang/String;II)I */ JNIEXPORT jint JNICALL Java_fstAPI_fstWriterCreateVar2 (JNIEnv *, jobject, jlong, jint, jint, jint, jstring, jint, jstring, jint, jint); /* * Class: fstAPI * Method: fstWriterSetSourceStem * Signature: (JLjava/lang/String;IZ)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetSourceStem (JNIEnv *, jobject, jlong, jstring, jint, jboolean); /* * Class: fstAPI * Method: fstWriterSetSourceInstantiationStem * Signature: (JLjava/lang/String;IZ)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetSourceInstantiationStem (JNIEnv *, jobject, jlong, jstring, jint, jboolean); /* * Class: fstAPI * Method: fstWriterSetScope * Signature: (JILjava/lang/String;Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetScope (JNIEnv *, jobject, jlong, jint, jstring, jstring); /* * Class: fstAPI * Method: fstWriterEmitVariableLengthValueChange * Signature: (JILjava/lang/String;I)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterEmitVariableLengthValueChange (JNIEnv *, jobject, jlong, jint, jstring, jint); /* * Class: fstAPI * Method: fstWriterSetAttrBegin * Signature: (JIILjava/lang/String;J)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetAttrBegin (JNIEnv *, jobject, jlong, jint, jint, jstring, jlong); /* * Class: fstAPI * Method: fstWriterEmitValueChange * Signature: (JILjava/lang/String;)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterEmitValueChange__JILjava_lang_String_2 (JNIEnv *, jobject, jlong, jint, jstring); /* * Class: fstAPI * Method: fstWriterEmitValueChange * Signature: (JID)V */ JNIEXPORT void JNICALL Java_fstAPI_fstWriterEmitValueChange__JID (JNIEnv *, jobject, jlong, jint, jdouble); /* * Class: fstAPI * Method: fstReaderOpen * Signature: (Ljava/lang/String;)J */ JNIEXPORT jlong JNICALL Java_fstAPI_fstReaderOpen (JNIEnv *, jobject, jstring); /* * Class: fstAPI * Method: fstReaderOpenForUtilitiesOnly * Signature: ()J */ JNIEXPORT jlong JNICALL Java_fstAPI_fstReaderOpenForUtilitiesOnly (JNIEnv *, jobject); /* * Class: fstAPI * Method: fstReaderClose * Signature: (J)V */ JNIEXPORT void JNICALL Java_fstAPI_fstReaderClose (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderIterateHierRewind * Signature: (J)Z */ JNIEXPORT jboolean JNICALL Java_fstAPI_fstReaderIterateHierRewind (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderResetScope * Signature: (J)V */ JNIEXPORT void JNICALL Java_fstAPI_fstReaderResetScope (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderGetCurrentScopeLen * Signature: (J)I */ JNIEXPORT jint JNICALL Java_fstAPI_fstReaderGetCurrentScopeLen (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderGetFileType * Signature: (J)I */ JNIEXPORT jint JNICALL Java_fstAPI_fstReaderGetFileType (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderGetTimezero * Signature: (J)J */ JNIEXPORT jlong JNICALL Java_fstAPI_fstReaderGetTimezero (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderGetStartTime * Signature: (J)J */ JNIEXPORT jlong JNICALL Java_fstAPI_fstReaderGetStartTime (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderGetEndTime * Signature: (J)J */ JNIEXPORT jlong JNICALL Java_fstAPI_fstReaderGetEndTime (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderGetMemoryUsedByWriter * Signature: (J)J */ JNIEXPORT jlong JNICALL Java_fstAPI_fstReaderGetMemoryUsedByWriter (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderGetScopeCount * Signature: (J)J */ JNIEXPORT jlong JNICALL Java_fstAPI_fstReaderGetScopeCount (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderGetVarCount * Signature: (J)J */ JNIEXPORT jlong JNICALL Java_fstAPI_fstReaderGetVarCount (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderGetMaxHandle * Signature: (J)I */ JNIEXPORT jint JNICALL Java_fstAPI_fstReaderGetMaxHandle (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderGetAliasCount * Signature: (J)J */ JNIEXPORT jlong JNICALL Java_fstAPI_fstReaderGetAliasCount (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderGetValueChangeSectionCount * Signature: (J)J */ JNIEXPORT jlong JNICALL Java_fstAPI_fstReaderGetValueChangeSectionCount (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderGetFseekFailed * Signature: (J)Z */ JNIEXPORT jboolean JNICALL Java_fstAPI_fstReaderGetFseekFailed (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderSetUnlimitedTimeRange * Signature: (J)V */ JNIEXPORT void JNICALL Java_fstAPI_fstReaderSetUnlimitedTimeRange (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderSetLimitTimeRange * Signature: (JJJ)V */ JNIEXPORT void JNICALL Java_fstAPI_fstReaderSetLimitTimeRange (JNIEnv *, jobject, jlong, jlong, jlong); /* * Class: fstAPI * Method: fstReaderSetVcdExtensions * Signature: (JZ)V */ JNIEXPORT void JNICALL Java_fstAPI_fstReaderSetVcdExtensions (JNIEnv *, jobject, jlong, jboolean); /* * Class: fstAPI * Method: fstReaderGetNumberDumpActivityChanges * Signature: (J)I */ JNIEXPORT jint JNICALL Java_fstAPI_fstReaderGetNumberDumpActivityChanges (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderGetDumpActivityChangeTime * Signature: (JI)J */ JNIEXPORT jlong JNICALL Java_fstAPI_fstReaderGetDumpActivityChangeTime (JNIEnv *, jobject, jlong, jint); /* * Class: fstAPI * Method: fstReaderGetFacProcessMask * Signature: (JI)Z */ JNIEXPORT jboolean JNICALL Java_fstAPI_fstReaderGetFacProcessMask (JNIEnv *, jobject, jlong, jint); /* * Class: fstAPI * Method: fstReaderSetFacProcessMask * Signature: (JI)V */ JNIEXPORT void JNICALL Java_fstAPI_fstReaderSetFacProcessMask (JNIEnv *, jobject, jlong, jint); /* * Class: fstAPI * Method: fstReaderClrFacProcessMask * Signature: (JI)V */ JNIEXPORT void JNICALL Java_fstAPI_fstReaderClrFacProcessMask (JNIEnv *, jobject, jlong, jint); /* * Class: fstAPI * Method: fstReaderSetFacProcessMaskAll * Signature: (J)V */ JNIEXPORT void JNICALL Java_fstAPI_fstReaderSetFacProcessMaskAll (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderClrFacProcessMaskAll * Signature: (J)V */ JNIEXPORT void JNICALL Java_fstAPI_fstReaderClrFacProcessMaskAll (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderGetVersionString * Signature: (J)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_fstAPI_fstReaderGetVersionString (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderGetDateString * Signature: (J)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_fstAPI_fstReaderGetDateString (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderPopScope * Signature: (J)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_fstAPI_fstReaderPopScope (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderGetCurrentFlatScope * Signature: (J)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_fstAPI_fstReaderGetCurrentFlatScope (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderGetCurrentScopeUserInfo * Signature: (J)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_fstAPI_fstReaderGetCurrentScopeUserInfo (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderPushScope * Signature: (JLjava/lang/String;J)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_fstAPI_fstReaderPushScope (JNIEnv *, jobject, jlong, jstring, jlong); /* * Class: fstAPI * Method: fstReaderGetTimescale * Signature: (J)I */ JNIEXPORT jint JNICALL Java_fstAPI_fstReaderGetTimescale (JNIEnv *, jobject, jlong); /* * Class: fstAPI * Method: fstReaderGetDumpActivityChangeValue * Signature: (JI)Z */ JNIEXPORT jboolean JNICALL Java_fstAPI_fstReaderGetDumpActivityChangeValue (JNIEnv *, jobject, jlong, jint); /* * Class: fstAPI * Method: fstReaderGetValueFromHandleAtTime * Signature: (JJI)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_fstAPI_fstReaderGetValueFromHandleAtTime (JNIEnv *, jobject, jlong, jlong, jint); /* * Class: fstAPI * Method: fstReaderIterateHier * Signature: (JLfstHier;)V */ JNIEXPORT void JNICALL Java_fstAPI_fstReaderIterateHier (JNIEnv *, jobject, jlong, jobject); /* * Class: fstAPI * Method: fstReaderIterBlocks * Signature: (JLjava/lang/Object;)I */ JNIEXPORT jint JNICALL Java_fstAPI_fstReaderIterBlocks (JNIEnv *, jobject, jlong, jobject); /* * Class: fstAPI * Method: fstUtilityBinToEsc * Signature: ([BI)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_fstAPI_fstUtilityBinToEsc (JNIEnv *, jclass, jbyteArray, jint); /* * Class: fstAPI * Method: fstUtilityEscToBin * Signature: (Ljava/lang/String;)[B */ JNIEXPORT jbyteArray JNICALL Java_fstAPI_fstUtilityEscToBin (JNIEnv *, jclass, jstring); #ifdef __cplusplus } #endif #endif gtkwave-3.3.86/contrib/fst_jni/fstPackType.java0000664000175000017500000000277713166335473021015 0ustar bybellbybell/* * Copyright (c) 2013 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ public class fstPackType { private fstPackType( ) { } public static final String [] FST_PT_NAMESTRINGS = { "none", "unpacked", "packed", "sparse" }; public static final int FST_PT_MIN = 0; public static final int FST_PT_NONE = 0; public static final int FST_PT_UNPACKED = 1; public static final int FST_PT_PACKED = 2; public static final int FST_PT_TAGGED_PACKED = 3; public static final int FST_PT_MAX = 3; }; gtkwave-3.3.86/contrib/fst_jni/fstArrayType.java0000664000175000017500000000277013166335473021206 0ustar bybellbybell/* * Copyright (c) 2013 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ public class fstArrayType { private fstArrayType() { } public static final String [] FST_AR_NAMESTRINGS = { "none", "unpacked", "packed", "sparse" }; public static final int FST_AR_MIN = 0; public static final int FST_AR_NONE = 0; public static final int FST_AR_UNPACKED = 1; public static final int FST_AR_PACKED =2; public static final int FST_AR_SPARSE = 3; public static final int FST_AR_MAX = 3; }; gtkwave-3.3.86/contrib/fst_jni/fstFileType.java0000664000175000017500000000256013166335473021004 0ustar bybellbybell/* * Copyright (c) 2013 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ public class fstFileType { private fstFileType( ) { } public static final int FST_FT_MIN = 0; public static final int FST_FT_VERILOG = 0; public static final int FST_FT_VHDL = 1; public static final int FST_FT_VERILOG_VHDL = 2; public static final int FST_FT_MAX = 2; }; gtkwave-3.3.86/contrib/fst_jni/fstSupplementalVarType.java0000664000175000017500000000303513166335473023245 0ustar bybellbybell/* * Copyright (c) 2013 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ public class fstSupplementalVarType { fstSupplementalVarType( ) { } public static final int FST_SVT_MIN = 0; public static final int FST_SVT_NONE = 0; public static final int FST_SVT_VHDL_SIGNAL = 1; public static final int FST_SVT_VHDL_VARIABLE = 2; public static final int FST_SVT_VHDL_CONSTANT = 3; public static final int FST_SVT_VHDL_FILE = 4; public static final int FST_SVT_VHDL_MEMORY = 5; public static final int FST_SVT_MAX = 5; }; gtkwave-3.3.86/contrib/fst_jni/Makefile.in0000664000175000017500000003150113166335473017745 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = contrib/fst_jni DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ fst2Vcd.java \ fstAPI.c \ fstAPI.h \ fstAPI.java \ fstArrayType.java \ fstAttrType.java \ fstEnumValueType.java \ fstFileType.java \ fstHier.java \ fstHierType.java \ fstMiscType.java \ fstPackType.java \ fstReader.java \ fstScopeType.java \ fstSupplementalDataType.java \ fstSupplementalVarType.java \ fstVarDir.java \ fstVarType.java \ fstWriter.java \ fstWriterPackType.java \ Main.java \ zzz_test.csh all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/fst_jni/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/fst_jni/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/contrib/fst_jni/fstHier.java0000664000175000017500000000362513166335473020155 0ustar bybellbybell/* * Copyright (c) 2013 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ public class fstHier { public boolean valid; // all types public int htyp; // FST_HT_SCOPE, FST_HT_UPSCOPE, FST_HT_VAR, FST_HT_ATTRBEGIN, FST_HT_ATTREND public int typ; // appropriate FST_ST_* type for htyp, vartype, etc. public int subtype; // FST_HT_ATTRBEGIN public String name1; // FST_HT_SCOPE, FST_HT_VAR, FST_HT_ATTRBEGIN public String name2; // FST_HT_SCOPE public int direction; // FST_HT_VAR public int handle; // FST_HT_VAR public int length; // FST_HT_VAR public boolean is_alias; // FST_HT_VAR public long arg; // FST_HT_ATTRBEGIN public long arg_from_name; // FST_HT_ATTRBEGIN public fstHier() { valid = false; htyp = 0; typ = 0; subtype = 0; name1 = ""; name2 = ""; direction = 0; handle = 0; length = 0; is_alias = false; arg = 0; arg_from_name = 0; }; }; gtkwave-3.3.86/contrib/fst_jni/fstVarDir.java0000664000175000017500000000314013166335473020445 0ustar bybellbybell/* * Copyright (c) 2013 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ public class fstVarDir { private fstVarDir() { } public static final String [] FST_VD_NAMESTRINGS = { "implicit", "input", "output", "inout", "buffer", "linkage" }; public static final int FST_VD_MIN = 0; public static final int FST_VD_IMPLICIT = 0; public static final int FST_VD_INPUT = 1; public static final int FST_VD_OUTPUT = 2; public static final int FST_VD_INOUT = 3; public static final int FST_VD_BUFFER = 4; public static final int FST_VD_LINKAGE = 5; public static final int FST_VD_MAX = 5; }; gtkwave-3.3.86/contrib/fst_jni/fstHierType.java0000664000175000017500000000263213166335473021014 0ustar bybellbybell/* * Copyright (c) 2013 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ public class fstHierType { private fstHierType( ) { } public static final int FST_HT_SCOPE = 0; public static final int FST_HT_UPSCOPE = 1; public static final int FST_HT_VAR = 2; public static final int FST_HT_ATTRBEGIN = 3; public static final int FST_HT_ATTREND = 4; public static final int FST_HT_MAX = 4; }; gtkwave-3.3.86/contrib/fst_jni/fstVarType.java0000664000175000017500000000577413166335473020667 0ustar bybellbybell/* * Copyright (c) 2013 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ public class fstVarType { private fstVarType() { } public static final String [] FST_VT_NAMESTRINGS = { "event", "integer", "parameter", "real", "real_parameter", "reg", "supply0", "supply1", "time", "tri", "triand", "trior", "trireg", "tri0", "tri1", "wand", "wire", "wor", "port", "sparray", "realtime", "string", "bit", "logic", "int", "shortint", "longint", "byte", "enum", "shortreal" }; public static final int FST_VT_VCD_MIN = 0; public static final int FST_VT_VCD_EVENT = 0; public static final int FST_VT_VCD_INTEGER = 1; public static final int FST_VT_VCD_PARAMETER = 2; public static final int FST_VT_VCD_REAL = 3; public static final int FST_VT_VCD_REAL_PARAMETER = 4; public static final int FST_VT_VCD_REG = 5; public static final int FST_VT_VCD_SUPPLY0 = 6; public static final int FST_VT_VCD_SUPPLY1 = 7; public static final int FST_VT_VCD_TIME = 8; public static final int FST_VT_VCD_TRI = 9; public static final int FST_VT_VCD_TRIAND = 10; public static final int FST_VT_VCD_TRIOR = 11; public static final int FST_VT_VCD_TRIREG = 12; public static final int FST_VT_VCD_TRI0 = 13; public static final int FST_VT_VCD_TRI1 = 14; public static final int FST_VT_VCD_WAND = 15; public static final int FST_VT_VCD_WIRE = 16; public static final int FST_VT_VCD_WOR = 17; public static final int FST_VT_VCD_PORT = 18; public static final int FST_VT_VCD_SPARRAY = 19; public static final int FST_VT_VCD_REALTIME = 20; public static final int FST_VT_GEN_STRING = 21; public static final int FST_VT_SV_BIT = 22; public static final int FST_VT_SV_LOGIC = 23; public static final int FST_VT_SV_INT = 24; public static final int FST_VT_SV_SHORTINT = 25; public static final int FST_VT_SV_LONGINT = 26; public static final int FST_VT_SV_BYTE = 27; public static final int FST_VT_SV_ENUM = 28; public static final int FST_VT_SV_SHORTREAL = 29; public static final int FST_VT_VCD_MAX = 29; }; gtkwave-3.3.86/contrib/fst_jni/fstMiscType.java0000664000175000017500000000303613166335473021017 0ustar bybellbybell/* * Copyright (c) 2013 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ public class fstMiscType { fstMiscType( ) { } public static final int FST_MT_MIN = 0; public static final int FST_MT_COMMENT = 0; public static final int FST_MT_ENVVAR = 1; public static final int FST_MT_SUPVAR = 2; public static final int FST_MT_PATHNAME = 3; public static final int FST_MT_SOURCESTEM = 4; public static final int FST_MT_SOURCEISTEM = 5; public static final int FST_MT_UNKNOWN = 6; public static final int FST_MT_MAX = 6; }; gtkwave-3.3.86/contrib/fst_jni/fst2Vcd.java0000664000175000017500000001054113166335473020057 0ustar bybellbybell/* * Copyright (c) 2013 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ public class fst2Vcd { fstReader fb; byte [] facType; long prevTime; long startTime, endTime; public void fstReaderCallback(long tim, int facidx, String value) { if(tim != prevTime) { System.out.println("#" + tim); prevTime = tim; } switch(facType[facidx]) { case fstVarType.FST_VT_VCD_REAL: case fstVarType.FST_VT_VCD_REAL_PARAMETER: case fstVarType.FST_VT_VCD_REALTIME: case fstVarType.FST_VT_SV_SHORTREAL: System.out.println("r" + value + " " + fb.fstReaderVcdID(facidx)); break; case fstVarType.FST_VT_GEN_STRING: System.out.println("s" + value + " " + fb.fstReaderVcdID(facidx)); break; default:if(value.length() == 1) { System.out.println(value + fb.fstReaderVcdID(facidx)); } else { System.out.println("b" + value + " " + fb.fstReaderVcdID(facidx)); } break; } } fst2Vcd(String fnam) { fb = new fstReader(fnam); startTime = fb.fstReaderGetStartTime(); endTime = fb.fstReaderGetEndTime(); System.out.println("$date\n\t" + fb.fstReaderGetDateString() + "\n$end"); System.out.println("$version\n\t" + fb.fstReaderGetVersionString() + "\n$end"); System.out.println("$timescale\n\t" + fb.fstReaderGetTimescaleString() + "s\n$end"); int maxHandle = fb.fstReaderGetMaxHandle(); facType = new byte[maxHandle+1]; fstHier fh = new fstHier(); for(;;) { fb.fstReaderIterateHier(fh); if(!fh.valid) break; switch(fh.htyp) { case fstHierType.FST_HT_SCOPE: System.out.println("$scope " + fstScopeType.FST_ST_NAMESTRINGS[fh.typ] + " " + fh.name1 + " $end"); break; case fstHierType.FST_HT_UPSCOPE: System.out.println("$upscope $end"); break; case fstHierType.FST_HT_VAR: int modlen; facType[fh.handle] = (byte)fh.typ; switch(fh.typ) { case fstVarType.FST_VT_VCD_REAL: case fstVarType.FST_VT_VCD_REAL_PARAMETER: case fstVarType.FST_VT_VCD_REALTIME: modlen = 64; break; case fstVarType.FST_VT_SV_SHORTREAL: modlen = 32; break; case fstVarType.FST_VT_GEN_STRING: modlen = 0; break; default: modlen = fh.length; break; } System.out.println("$var " + fstVarType.FST_VT_NAMESTRINGS[fh.typ] + " " + modlen + " " + fb.fstReaderVcdID(fh.handle) + " " + fh.name1 + " $end"); break; case fstHierType.FST_HT_ATTRBEGIN: if(fh.typ == fstAttrType.FST_AT_MISC) { switch(fh.subtype) { case fstMiscType.FST_MT_COMMENT: System.out.println("$comment\n\t" + fh.name1 + "\n$end"); break; case fstMiscType.FST_MT_SOURCESTEM: case fstMiscType.FST_MT_SOURCEISTEM: System.out.println("$attrbegin " + fstAttrType.FST_AT_NAMESTRINGS[fh.typ] + " " + Integer.toHexString(fh.subtype) + " " + fh.arg_from_name + " " + fh.arg + " $end"); break; default: System.out.println("$attrbegin " + fstAttrType.FST_AT_NAMESTRINGS[fh.typ] + " " + Integer.toHexString(fh.subtype) + " " + fh.name1 + " " + fh.arg + " $end"); break; } } break; case fstHierType.FST_HT_ATTREND: System.out.println("$attrend $end"); break; } } System.out.println("$enddefinitions $end"); fb.fstReaderSetFacProcessMaskAll(); prevTime = 0; fb.fstReaderIterBlocks(this); if(prevTime != endTime) { System.out.println("#" + endTime); } fb.fstReaderClose(); } } gtkwave-3.3.86/contrib/fst_jni/fstReader.java0000664000175000017500000001573113166335473020471 0ustar bybellbybell/* * Copyright (c) 2013 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ public class fstReader extends fstAPI { private long ctx; fstReader(String nam) { ctx = fstReaderOpen(nam); } protected void finalize() throws Throwable { try { fstReaderClose(ctx); } finally { super.finalize(); } } public void fstReaderClose() { fstReaderClose(ctx); ctx = 0; } public void fstReaderClrFacProcessMaskAll() { fstReaderClrFacProcessMaskAll(ctx); } public void fstReaderClrFacProcessMask(int facidx) { fstReaderClrFacProcessMask(ctx, facidx); } public long fstReaderGetAliasCount() { return(fstReaderGetAliasCount(ctx)); } public String fstReaderGetCurrentFlatScope() { return(fstReaderGetCurrentFlatScope(ctx)); } public int fstReaderGetCurrentScopeLen() { return(fstReaderGetCurrentScopeLen(ctx)); } public int fstReaderGetFileType() { return(fstReaderGetFileType(ctx)); } public String fstReaderGetCurrentScopeUserInfo() { return(fstReaderGetCurrentScopeUserInfo(ctx)); } public String fstReaderGetDateString() { return(fstReaderGetDateString(ctx)); } public long fstReaderGetDumpActivityChangeTime(int idx) { return(fstReaderGetDumpActivityChangeTime(ctx, idx)); } public boolean fstReaderGetDumpActivityChangeValue(int idx) { return(fstReaderGetDumpActivityChangeValue(ctx, idx)); } public long fstReaderGetEndTime() { return(fstReaderGetEndTime(ctx)); } public boolean fstReaderGetFacProcessMask(int facidx) { return(fstReaderGetFacProcessMask(ctx, facidx)); } public boolean fstReaderGetFseekFailed() { return(fstReaderGetFseekFailed(ctx)); } public int fstReaderGetMaxHandle() { return(fstReaderGetMaxHandle(ctx)); } public long fstReaderGetMemoryUsedByWriter() { return(fstReaderGetMemoryUsedByWriter(ctx)); } public int fstReaderGetNumberDumpActivityChanges() { return(fstReaderGetNumberDumpActivityChanges(ctx)); } public long fstReaderGetScopeCount() { return(fstReaderGetScopeCount(ctx)); } public long fstReaderGetStartTime() { return(fstReaderGetStartTime(ctx)); } public int fstReaderGetTimescale() { return(fstReaderGetTimescale(ctx)); } public long fstReaderGetTimezero() { return(fstReaderGetTimezero(ctx)); } public long fstReaderGetValueChangeSectionCount() { return(fstReaderGetValueChangeSectionCount(ctx)); } public String fstReaderGetValueFromHandleAtTime(long tim, int facidx) { return(fstReaderGetValueFromHandleAtTime(ctx, tim, facidx)); } public long fstReaderGetVarCount() { return(fstReaderGetVarCount(ctx)); } public String fstReaderGetVersionString() { return(fstReaderGetVersionString(ctx)); } public void fstReaderIterateHier(fstHier fh) { fstReaderIterateHier(ctx, fh); } public boolean fstReaderIterateHierRewind() { return(fstReaderIterateHierRewind(ctx)); } public int fstReaderIterBlocks(Object cbobj) { return(fstReaderIterBlocks(ctx, cbobj)); } public String fstReaderPopScope() { return(fstReaderPopScope(ctx)); } public String fstReaderPushScope(String nam, long user_info) { return(fstReaderPushScope(ctx, nam, user_info)); } public void fstReaderResetScope() { fstReaderResetScope(ctx); } public void fstReaderSetFacProcessMaskAll() { fstReaderSetFacProcessMaskAll(ctx); } public void fstReaderSetFacProcessMask(int facidx) { fstReaderSetFacProcessMask(ctx, facidx); } public void fstReaderSetVcdExtensions(boolean enable) { fstReaderSetVcdExtensions(ctx, enable); } public void fstReaderSetLimitTimeRange(long start_time, long end_time) { fstReaderSetLimitTimeRange(ctx, start_time, end_time); } public void fstReaderSetUnlimitedTimeRange() { fstReaderSetUnlimitedTimeRange(ctx); } public String fstReaderVcdID(int value) { char []s = new char[5]; // 94 ** 5 int vmod; int i; // zero is illegal for a value...it is assumed they start at one for(i=0;;i++) { vmod = (value % 94); if(vmod != 0) { s[i] = (char) (vmod+32); } else { s[i] = '~'; value -= 94; } value = value / 94; if(value == 0) { break; } } return(new String(s, 0, i+1)); } public String fstReaderGetTimescaleString() { int ts = fstReaderGetTimescale(); int time_scale = 1; char time_dimension; String s; switch(ts) { case 2: time_scale = 100; time_dimension = ' '; break; case 1: time_scale = 10; case 0: time_dimension = ' '; break; case -1: time_scale = 100; time_dimension = 'm'; break; case -2: time_scale = 10; case -3: time_dimension = 'm'; break; case -4: time_scale = 100; time_dimension = 'u'; break; case -5: time_scale = 10; case -6: time_dimension = 'u'; break; case -10: time_scale = 100; time_dimension = 'p'; break; case -11: time_scale = 10; case -12: time_dimension = 'p'; break; case -13: time_scale = 100; time_dimension = 'f'; break; case -14: time_scale = 10; case -15: time_dimension = 'f'; break; case -16: time_scale = 100; time_dimension = 'a'; break; case -17: time_scale = 10; case -18: time_dimension = 'a'; break; case -19: time_scale = 100; time_dimension = 'z'; break; case -20: time_scale = 10; case -21: time_dimension = 'z'; break; case -7: time_scale = 100; time_dimension = 'n'; break; case -8: time_scale = 10; case -9: default: time_dimension = 'n'; break; } s = "" + time_scale; s = s + time_dimension; return(s); } } gtkwave-3.3.86/contrib/fst_jni/fstEnumValueType.java0000664000175000017500000000426213166335473022027 0ustar bybellbybell/* * Copyright (c) 2013 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ public class fstEnumValueType { private fstEnumValueType() { } public static final String [] FST_VT_NAMESTRINGS = { "integer", "bit", "logic", "int", "shortint", "longint", "byte", "unsigned_integer", "unsigned_bit", "unsigned_logic", "unsigned_int", "unsigned_shortint", "unsigned_longint", "unsigned_byte" }; public static final int FST_EV_MIN = 0; public static final int FST_EV_SV_INTEGER = 0; public static final int FST_EV_SV_BIT = 1; public static final int FST_EV_SV_LOGIC = 2; public static final int FST_EV_SV_INT = 3; public static final int FST_EV_SV_SHORTINT = 4; public static final int FST_EV_SV_LONGINT = 5; public static final int FST_EV_SV_BYTE = 6; public static final int FST_EV_SV_UNSIGNED_INTEGER = 7; public static final int FST_EV_SV_UNSIGNED_BIT = 8; public static final int FST_EV_SV_UNSIGNED_LOGIC = 9; public static final int FST_EV_SV_UNSIGNED_INT = 10; public static final int FST_EV_SV_UNSIGNED_SHORTINT = 11; public static final int FST_EV_SV_UNSIGNED_LONGINT = 12; public static final int FST_EV_SV_UNSIGNED_BYTE = 13; public static final int FST_EV_MAX = 13; }; gtkwave-3.3.86/contrib/fst_jni/fstSupplementalDataType.java0000664000175000017500000000502213166335473023364 0ustar bybellbybell/* * Copyright (c) 2013 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ public class fstSupplementalDataType { fstSupplementalDataType( ) { } public static final int FST_SDT_MIN = 0; public static final int FST_SDT_NONE = 0; public static final int FST_SDT_VHDL_BOOLEAN = 1; public static final int FST_SDT_VHDL_BIT = 2; public static final int FST_SDT_VHDL_BIT_VECTOR = 3; public static final int FST_SDT_VHDL_STD_ULOGIC = 4; public static final int FST_SDT_VHDL_STD_ULOGIC_VECTOR = 5; public static final int FST_SDT_VHDL_STD_LOGIC = 6; public static final int FST_SDT_VHDL_STD_LOGIC_VECTOR = 7; public static final int FST_SDT_VHDL_UNSIGNED = 8; public static final int FST_SDT_VHDL_SIGNED = 9; public static final int FST_SDT_VHDL_INTEGER = 10; public static final int FST_SDT_VHDL_REAL = 11; public static final int FST_SDT_VHDL_NATURAL = 12; public static final int FST_SDT_VHDL_POSITIVE = 13; public static final int FST_SDT_VHDL_TIME = 14; public static final int FST_SDT_VHDL_CHARACTER = 15; public static final int FST_SDT_VHDL_STRING = 16; public static final int FST_SDT_MAX = 16; public static final int FST_SDT_SVT_SHIFT_COUNT = 10; /* FST_SVT_* is ORed in to the left after shifting FST_SDT_SVT_SHIFT_COUNT */ public static final int FST_SDT_ABS_MAX = (1<<(FST_SDT_SVT_SHIFT_COUNT)); }; gtkwave-3.3.86/contrib/fst_jni/Main.java0000664000175000017500000000246113166335473017432 0ustar bybellbybell/* * Copyright (c) 2013 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ public class Main { public static void main(String[] argv) { if(argv.length == 1) { fst2Vcd t = new fst2Vcd(argv[0]); } else { System.out.println("Usage\n-----\njava Main inputfile.fst"); } } } gtkwave-3.3.86/contrib/fst_jni/fstAPI.java0000664000175000017500000001466613166335473017706 0ustar bybellbybell/* * Copyright (c) 2013 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ public class fstAPI { static { System.loadLibrary("fstAPI"); } private static String bitStringInt(int i, int len) { len = Math.min(32, Math.max(len, 1)); char[] cs = new char[len]; for (int j = len - 1, b = 1; 0 <= j; --j, b <<= 1) { cs[j] = ((i & b) == 0) ? '0' : '1'; } return(new String(cs)); } protected native long fstWriterCreate(String nam, boolean use_compressed_hier); protected native void fstWriterClose(long ctx); protected native boolean fstWriterGetFseekFailed(long ctx); protected native boolean fstWriterGetDumpSizeLimitReached(long ctx); protected native void fstWriterFlushContext(long ctx); protected native void fstWriterSetUpscope(long ctx); protected native void fstWriterSetAttrEnd(long ctx); protected native void fstWriterSetPackType(long ctx, int typ); protected native void fstWriterSetFileType(long ctx, int typ); protected native void fstWriterSetRepackOnClose(long ctx, boolean enable); protected native void fstWriterSetParallelMode(long ctx, boolean enable); protected native void fstWriterSetTimescale(long ctx, int ts); protected native void fstWriterSetTimezero(long ctx, long tim); protected native void fstWriterSetDumpSizeLimit(long ctx, long numbytes); protected native void fstWriterEmitDumpActive(long ctx, boolean enable); protected native void fstWriterEmitTimeChange(long ctx, long tim); protected native void fstWriterSetDate(long ctx, String dat); protected native void fstWriterSetVersion(long ctx, String vers); protected native void fstWriterSetComment(long ctx, String comm); protected native void fstWriterSetEnvVar(long ctx, String envvar); protected native void fstWriterSetTimescaleFromString(long ctx, String s); protected native int fstWriterCreateVar(long ctx, int vt, int vd, int len, String nam, int aliasHandle); protected native int fstWriterCreateVar2(long ctx, int vt, int vd, int len, String nam, int aliasHandle, String type, int svt, int sdt); protected native void fstWriterSetSourceStem(long ctx, String path, int line, boolean use_realpath); protected native void fstWriterSetSourceInstantiationStem(long ctx, String path, int line, boolean use_realpath); protected native void fstWriterSetScope(long ctx, int scopetype, String scopename, String scopecomp); protected native void fstWriterEmitVariableLengthValueChange(long ctx, int handle, String val, int len); protected native void fstWriterSetAttrBegin(long ctx, int attrtype, int subtype, String attrname, long arg); protected native void fstWriterEmitValueChange(long ctx, int handle, String val); protected native void fstWriterEmitValueChange(long ctx, int handle, double val); protected void fstWriterEmitValueChange(long ctx, int handle, int val) { fstWriterEmitValueChange(ctx, handle, bitStringInt(val, 32)); } protected native long fstReaderOpen(String nam); protected native long fstReaderOpenForUtilitiesOnly(); protected native void fstReaderClose(long ctx); protected native boolean fstReaderIterateHierRewind(long ctx); protected native void fstReaderResetScope(long ctx); protected native int fstReaderGetCurrentScopeLen(long ctx); protected native int fstReaderGetFileType(long ctx); protected native long fstReaderGetTimezero(long ctx); protected native long fstReaderGetStartTime(long ctx); protected native long fstReaderGetEndTime(long ctx); protected native long fstReaderGetMemoryUsedByWriter(long ctx); protected native long fstReaderGetScopeCount(long ctx); protected native long fstReaderGetVarCount(long ctx); protected native int fstReaderGetMaxHandle(long ctx); protected native long fstReaderGetAliasCount(long ctx); protected native long fstReaderGetValueChangeSectionCount(long ctx); protected native boolean fstReaderGetFseekFailed(long ctx); protected native void fstReaderSetUnlimitedTimeRange(long ctx); protected native void fstReaderSetLimitTimeRange(long ctx, long start_time, long end_time); protected native void fstReaderSetVcdExtensions(long ctx, boolean enable); protected native int fstReaderGetNumberDumpActivityChanges(long ctx); protected native long fstReaderGetDumpActivityChangeTime(long ctx, int idx); protected native boolean fstReaderGetFacProcessMask(long ctx, int facidx); protected native void fstReaderSetFacProcessMask(long ctx, int facidx); protected native void fstReaderClrFacProcessMask(long ctx, int facidx); protected native void fstReaderSetFacProcessMaskAll(long ctx); protected native void fstReaderClrFacProcessMaskAll(long ctx); protected native String fstReaderGetVersionString(long ctx); protected native String fstReaderGetDateString(long ctx); protected native String fstReaderPopScope(long ctx); protected native String fstReaderGetCurrentFlatScope(long ctx); protected native String fstReaderGetCurrentScopeUserInfo(long ctx); protected native String fstReaderPushScope(long ctx, String nam, long user_info); protected native int fstReaderGetTimescale(long ctx); protected native boolean fstReaderGetDumpActivityChangeValue(long ctx, int idx); protected native String fstReaderGetValueFromHandleAtTime(long ctx, long tim, int facidx); protected native void fstReaderIterateHier(long ctx, fstHier fh); protected native int fstReaderIterBlocks(long ctx, Object cbobj); public native static String fstUtilityBinToEsc(byte []s, int len); public native static byte[] fstUtilityEscToBin(String s); // // example do-nothing callback for fstReaderIterateHier() // public void fstReaderCallback(long tim, int facidx, String value) { } } gtkwave-3.3.86/contrib/fst_jni/fstAPI.c0000664000175000017500000005150013166335473017173 0ustar bybellbybell/* * Copyright (c) 2013 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include #include "fstapi.h" /* * fstWriter */ JNIEXPORT jlong JNICALL Java_fstAPI_fstWriterCreate (JNIEnv *env, jobject obj, jstring j_nam, jboolean use_compressed_hier) { void *ctx; const char *nam = (*env)->GetStringUTFChars(env, j_nam, 0); ctx = fstWriterCreate(nam, (int)use_compressed_hier); (*env)->ReleaseStringUTFChars(env, j_nam, nam); return((jlong)(long)ctx); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterClose (JNIEnv *env, jobject obj, jlong ctx) { fstWriterClose((void *)(long)ctx); } JNIEXPORT jboolean JNICALL Java_fstAPI_fstWriterGetFseekFailed (JNIEnv *env, jobject obj, jlong ctx) { int rc = fstWriterGetFseekFailed((void *)(long)ctx); return(rc != 0); } JNIEXPORT jboolean JNICALL Java_fstAPI_fstWriterGetDumpSizeLimitReached (JNIEnv *env, jobject obj, jlong ctx) { int rc = fstWriterGetDumpSizeLimitReached((void *)(long)ctx); return(rc != 0); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterFlushContext (JNIEnv *env, jobject obj, jlong ctx) { fstWriterFlushContext((void *)(long)ctx); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetUpscope (JNIEnv *env, jobject obj, jlong ctx) { fstWriterSetUpscope((void *)(long)ctx); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetAttrEnd (JNIEnv *env, jobject obj, jlong ctx) { fstWriterSetAttrEnd((void *)(long)ctx); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetPackType (JNIEnv *env, jobject obj, jlong ctx, jint typ) { fstWriterSetPackType((void *)(long)ctx, (int)typ); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetFileType (JNIEnv *env, jobject obj, jlong ctx, jint typ) { fstWriterSetFileType((void *)(long)ctx, (int)typ); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetRepackOnClose (JNIEnv *env, jobject obj, jlong ctx, jboolean enable) { fstWriterSetRepackOnClose((void *)(long)ctx, (int)enable); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetParallelMode (JNIEnv *env, jobject obj, jlong ctx, jboolean enable) { fstWriterSetParallelMode((void *)(long)ctx, (int)enable); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetTimescale (JNIEnv *env, jobject obj, jlong ctx, jint ts) { fstWriterSetParallelMode((void *)(long)ctx, (int)ts); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetTimezero (JNIEnv *env, jobject obj, jlong ctx, jlong tim) { fstWriterSetTimezero((void *)(long)ctx, (int64_t)tim); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetDumpSizeLimit (JNIEnv *env, jobject obj, jlong ctx, jlong numbytes) { fstWriterSetDumpSizeLimit((void *)(long)ctx, (uint64_t)numbytes); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterEmitDumpActive (JNIEnv *env, jobject obj, jlong ctx, jboolean enable) { fstWriterEmitDumpActive((void *)(long)ctx, (int)enable); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterEmitTimeChange (JNIEnv *env, jobject obj, jlong ctx, jlong tim) { fstWriterEmitTimeChange((void *)(long)ctx, (uint64_t)tim); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetDate (JNIEnv *env, jobject obj, jlong ctx, jstring j_dat) { const char *dat = (*env)->GetStringUTFChars(env, j_dat, 0); fstWriterSetDate((void *)(long)ctx, dat); (*env)->ReleaseStringUTFChars(env, j_dat, dat); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetVersion (JNIEnv *env, jobject obj, jlong ctx, jstring j_vers) { const char *vers = (*env)->GetStringUTFChars(env, j_vers, 0); fstWriterSetVersion((void *)(long)ctx, vers); (*env)->ReleaseStringUTFChars(env, j_vers, vers); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetComment (JNIEnv *env, jobject obj, jlong ctx, jstring j_comm) { const char *comm = (*env)->GetStringUTFChars(env, j_comm, 0); fstWriterSetComment((void *)(long)ctx, comm); (*env)->ReleaseStringUTFChars(env, j_comm, comm); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetEnvVar (JNIEnv *env, jobject obj, jlong ctx, jstring j_envvar) { const char *envvar = (*env)->GetStringUTFChars(env, j_envvar, 0); fstWriterSetEnvVar((void *)(long)ctx, envvar); (*env)->ReleaseStringUTFChars(env, j_envvar, envvar); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetTimescaleFromString (JNIEnv *env, jobject obj, jlong ctx, jstring j_s) { const char *s = (*env)->GetStringUTFChars(env, j_s, 0); fstWriterSetTimescaleFromString((void *)(long)ctx, s); (*env)->ReleaseStringUTFChars(env, j_s, s); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterEmitValueChange__JILjava_lang_String_2 (JNIEnv *env, jobject obj, jlong ctx, jint handle, jstring j_val) { const char *val = (*env)->GetStringUTFChars(env, j_val, 0); fstWriterEmitValueChange((void *)(long)ctx, (fstHandle)handle, val); (*env)->ReleaseStringUTFChars(env, j_val, val); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterEmitValueChange__JID (JNIEnv *env, jobject obj, jlong ctx, jint handle, jdouble d) { fstWriterEmitValueChange((void *)(long)ctx, (fstHandle)handle, (void *)&d); } JNIEXPORT jint JNICALL Java_fstAPI_fstWriterCreateVar (JNIEnv *env, jobject obj, jlong ctx, jint vt, jint vd, jint len, jstring j_nam, jint aliasHandle) { fstHandle handle; const char *nam = (*env)->GetStringUTFChars(env, j_nam, 0); handle = fstWriterCreateVar((void *)(long)ctx, (int)vt, (int)vd, (uint32_t)len, nam, (fstHandle)aliasHandle); (*env)->ReleaseStringUTFChars(env, j_nam, nam); return((jint)handle); } JNIEXPORT jint JNICALL Java_fstAPI_fstWriterCreateVar2 (JNIEnv *env, jobject obj, jlong ctx, jint vt, jint vd, jint len, jstring j_nam, jint aliasHandle, jstring j_type, jint svt, jint sdt) { fstHandle handle; const char *nam = (*env)->GetStringUTFChars(env, j_nam, 0); const char *typ = (*env)->GetStringUTFChars(env, j_type, 0); handle = fstWriterCreateVar2((void *)(long)ctx, (int)vt, (int)vd, (uint32_t)len, nam, (fstHandle)aliasHandle, typ, (int)svt, (int)sdt); (*env)->ReleaseStringUTFChars(env, j_type, typ); (*env)->ReleaseStringUTFChars(env, j_nam, nam); return((jint)handle); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetSourceStem (JNIEnv *env, jobject obj, jlong ctx, jstring j_path, jint line, jboolean use_realpath) { const char *path = (*env)->GetStringUTFChars(env, j_path, 0); fstWriterSetSourceStem((void *)(long)ctx, path, line, use_realpath); (*env)->ReleaseStringUTFChars(env, j_path, path); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetSourceInstantiationStem (JNIEnv *env, jobject obj, jlong ctx, jstring j_path, jint line, jboolean use_realpath) { const char *path = (*env)->GetStringUTFChars(env, j_path, 0); fstWriterSetSourceInstantiationStem((void *)(long)ctx, path, line, use_realpath); (*env)->ReleaseStringUTFChars(env, j_path, path); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetScope (JNIEnv *env, jobject obj, jlong ctx, jint scopetype, jstring j_scopename, jstring j_scopecomp) { const char *scopename = (*env)->GetStringUTFChars(env, j_scopename, 0); const char *scopecomp = (*env)->GetStringUTFChars(env, j_scopecomp, 0); fstWriterSetScope((void *)(long)ctx, (int)scopetype, scopename, scopecomp); (*env)->ReleaseStringUTFChars(env, j_scopecomp, scopecomp); (*env)->ReleaseStringUTFChars(env, j_scopename, scopename); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterEmitVariableLengthValueChange (JNIEnv *env, jobject obj, jlong ctx, jint handle, jstring j_val, jint len) { const char *val = (*env)->GetStringUTFChars(env, j_val, 0); fstWriterEmitVariableLengthValueChange((void *)(long)ctx, (fstHandle)handle, val, (uint32_t)len); (*env)->ReleaseStringUTFChars(env, j_val, val); } JNIEXPORT void JNICALL Java_fstAPI_fstWriterSetAttrBegin (JNIEnv *env, jobject obj, jlong ctx, jint attrtype, jint subtype, jstring j_attrname, jlong arg) { const char *attrname = (*env)->GetStringUTFChars(env, j_attrname, 0); fstWriterSetAttrBegin((void *)(long)ctx, (int)attrtype, (int)subtype, attrname, (uint64_t)arg); (*env)->ReleaseStringUTFChars(env, j_attrname, attrname); } /* * fstReader */ JNIEXPORT jlong JNICALL Java_fstAPI_fstReaderOpen (JNIEnv *env, jobject obj, jstring j_nam) { void *ctx; const char *nam = (*env)->GetStringUTFChars(env, j_nam, 0); ctx = fstReaderOpen(nam); (*env)->ReleaseStringUTFChars(env, j_nam, nam); return((jlong)(long)ctx); } JNIEXPORT jlong JNICALL Java_fstAPI_fstReaderOpenForUtilitiesOnly (JNIEnv *env, jobject obj) { void *ctx; ctx = fstReaderOpenForUtilitiesOnly(); return((jlong)(long)ctx); } JNIEXPORT void JNICALL Java_fstAPI_fstReaderClose (JNIEnv *env, jobject obj, jlong ctx) { fstReaderClose((void *)(long)ctx); } JNIEXPORT jboolean JNICALL Java_fstAPI_fstReaderIterateHierRewind (JNIEnv *env, jobject obj, jlong ctx) { return((jboolean)(fstReaderIterateHierRewind((void *)(long)ctx) != 0)); } JNIEXPORT void JNICALL Java_fstAPI_fstReaderResetScope (JNIEnv *env, jobject obj, jlong ctx) { fstReaderResetScope((void *)(long)ctx); } JNIEXPORT jint JNICALL Java_fstAPI_fstReaderGetCurrentScopeLen (JNIEnv *env, jobject obj, jlong ctx) { return((jint)fstReaderGetCurrentScopeLen((void *)(long)ctx)); } JNIEXPORT jint JNICALL Java_fstAPI_fstReaderGetFileType (JNIEnv *env, jobject obj, jlong ctx) { return((jint)fstReaderGetFileType((void *)(long)ctx)); } JNIEXPORT jlong JNICALL Java_fstAPI_fstReaderGetTimezero (JNIEnv *env, jobject obj, jlong ctx) { return((jlong)fstReaderGetTimezero((void *)(long)ctx)); } JNIEXPORT jlong JNICALL Java_fstAPI_fstReaderGetStartTime (JNIEnv *env, jobject obj, jlong ctx) { return((jlong)fstReaderGetStartTime((void *)(long)ctx)); } JNIEXPORT jlong JNICALL Java_fstAPI_fstReaderGetEndTime (JNIEnv *env, jobject obj, jlong ctx) { return((jlong)fstReaderGetEndTime((void *)(long)ctx)); } JNIEXPORT jlong JNICALL Java_fstAPI_fstReaderGetMemoryUsedByWriter (JNIEnv *env, jobject obj, jlong ctx) { return((jlong)fstReaderGetMemoryUsedByWriter((void *)(long)ctx)); } JNIEXPORT jlong JNICALL Java_fstAPI_fstReaderGetScopeCount (JNIEnv *env, jobject obj, jlong ctx) { return((jlong)fstReaderGetScopeCount((void *)(long)ctx)); } JNIEXPORT jlong JNICALL Java_fstAPI_fstReaderGetVarCount (JNIEnv *env, jobject obj, jlong ctx) { return((jlong)fstReaderGetVarCount((void *)(long)ctx)); } JNIEXPORT jint JNICALL Java_fstAPI_fstReaderGetMaxHandle (JNIEnv *env, jobject obj, jlong ctx) { return((jint)fstReaderGetMaxHandle((void *)(long)ctx)); } JNIEXPORT jlong JNICALL Java_fstAPI_fstReaderGetAliasCount (JNIEnv *env, jobject obj, jlong ctx) { return((jlong)fstReaderGetAliasCount((void *)(long)ctx)); } JNIEXPORT jlong JNICALL Java_fstAPI_fstReaderGetValueChangeSectionCount (JNIEnv *env, jobject obj, jlong ctx) { return((jlong)fstReaderGetValueChangeSectionCount((void *)(long)ctx)); } JNIEXPORT jboolean JNICALL Java_fstAPI_fstReaderGetFseekFailed (JNIEnv *env, jobject obj, jlong ctx) { return((jboolean)(fstReaderGetFseekFailed((void *)(long)ctx) != 0)); } JNIEXPORT void JNICALL Java_fstAPI_fstReaderSetUnlimitedTimeRange (JNIEnv *env, jobject obj, jlong ctx) { fstReaderSetUnlimitedTimeRange((void *)(long)ctx); } JNIEXPORT void JNICALL Java_fstAPI_fstReaderSetLimitTimeRange (JNIEnv *env, jobject obj, jlong ctx, jlong start_time, jlong end_time) { fstReaderSetLimitTimeRange((void *)(long)ctx, (uint64_t)start_time, (uint64_t)end_time); } JNIEXPORT void JNICALL Java_fstAPI_fstReaderSetVcdExtensions (JNIEnv *env, jobject obj, jlong ctx, jboolean enable) { fstReaderSetVcdExtensions((void *)(long)ctx, (int)enable); } JNIEXPORT jint JNICALL Java_fstAPI_fstReaderGetNumberDumpActivityChanges (JNIEnv *env, jobject obj, jlong ctx) { return((jint)fstReaderGetNumberDumpActivityChanges((void *)(long)ctx)); } JNIEXPORT jlong JNICALL Java_fstAPI_fstReaderGetDumpActivityChangeTime (JNIEnv *env, jobject obj, jlong ctx, jint idx) { return((jlong)fstReaderGetDumpActivityChangeTime((void *)(long)ctx, (uint32_t)idx)); } JNIEXPORT jboolean JNICALL Java_fstAPI_fstReaderGetFacProcessMask (JNIEnv *env, jobject obj, jlong ctx, jint facidx) { return((jboolean)(fstReaderGetFacProcessMask((void *)(long)ctx, (fstHandle)facidx) != 0)); } JNIEXPORT void JNICALL Java_fstAPI_fstReaderSetFacProcessMask (JNIEnv *env, jobject obj, jlong ctx, jint facidx) { fstReaderSetFacProcessMask((void *)(long)ctx, (fstHandle)facidx); } JNIEXPORT void JNICALL Java_fstAPI_fstReaderClrFacProcessMask (JNIEnv *env, jobject obj, jlong ctx, jint facidx) { fstReaderClrFacProcessMask((void *)(long)ctx, (fstHandle)facidx); } JNIEXPORT void JNICALL Java_fstAPI_fstReaderSetFacProcessMaskAll (JNIEnv *env, jobject obj, jlong ctx) { fstReaderSetFacProcessMaskAll((void *)(long)ctx); } JNIEXPORT void JNICALL Java_fstAPI_fstReaderClrFacProcessMaskAll (JNIEnv *env, jobject obj, jlong ctx) { fstReaderClrFacProcessMaskAll((void *)(long)ctx); } JNIEXPORT jstring JNICALL Java_fstAPI_fstReaderGetVersionString (JNIEnv *env, jobject obj, jlong ctx) { const char *s = fstReaderGetVersionString((void *)(long)ctx); jstring j_s = (*env)->NewStringUTF(env, s); return(j_s); } JNIEXPORT jstring JNICALL Java_fstAPI_fstReaderGetDateString (JNIEnv *env, jobject obj, jlong ctx) { const char *s = fstReaderGetDateString((void *)(long)ctx); jstring j_s = (*env)->NewStringUTF(env, s); return(j_s); } JNIEXPORT jstring JNICALL Java_fstAPI_fstReaderPopScope (JNIEnv *env, jobject obj, jlong ctx) { const char *s = fstReaderPopScope((void *)(long)ctx); jstring j_s = (*env)->NewStringUTF(env, s); return(j_s); } JNIEXPORT jstring JNICALL Java_fstAPI_fstReaderGetCurrentFlatScope (JNIEnv *env, jobject obj, jlong ctx) { const char *s = fstReaderGetCurrentFlatScope((void *)(long)ctx); jstring j_s = (*env)->NewStringUTF(env, s); return(j_s); } JNIEXPORT jstring JNICALL Java_fstAPI_fstReaderGetCurrentScopeUserInfo (JNIEnv *env, jobject obj, jlong ctx) { const char *s = fstReaderGetCurrentScopeUserInfo((void *)(long)ctx); jstring j_s = (*env)->NewStringUTF(env, s); return(j_s); } JNIEXPORT jstring JNICALL Java_fstAPI_fstReaderPushScope (JNIEnv *env, jobject obj, jlong ctx, jstring j_nam, jlong user_info) { const char *nam = (*env)->GetStringUTFChars(env, j_nam, 0); const char *s = fstReaderPushScope((void *)(long)ctx, nam, (void *)(long)user_info); jstring j_s = (*env)->NewStringUTF(env, s); (*env)->ReleaseStringUTFChars(env, j_nam, nam); return(j_s); } JNIEXPORT jint JNICALL Java_fstAPI_fstReaderGetTimescale (JNIEnv *env, jobject obj, jlong ctx) { return((jint)fstReaderGetTimescale((void *)(long)ctx)); } JNIEXPORT jboolean JNICALL Java_fstAPI_fstReaderGetDumpActivityChangeValue (JNIEnv *env, jobject obj, jlong ctx, jint idx) { return((jboolean)(fstReaderGetDumpActivityChangeValue((void *)(long)ctx, (uint32_t)idx) != 0)); } JNIEXPORT jstring JNICALL Java_fstAPI_fstReaderGetValueFromHandleAtTime (JNIEnv *env, jobject obj, jlong ctx, jlong tim, jint facidx) { char buf[65537]; const char *s = fstReaderGetValueFromHandleAtTime((void *)(long)ctx, (uint64_t)tim, (fstHandle)facidx, buf); jstring j_s = (*env)->NewStringUTF(env, s); return(j_s); } JNIEXPORT jstring JNICALL Java_fstAPI_fstUtilityBinToEsc (JNIEnv *env, jclass obj, jbyteArray b_s, jint len) { jbyte* s = (*env)->GetByteArrayElements(env, b_s,NULL); char *d = malloc(len * 4); jstring j_d; int i; int rlen; d[0] = 0; rlen = fstUtilityBinToEsc(d, s, (int)len); d[rlen] = 0; j_d = (*env)->NewStringUTF(env, d); free(d); (*env)->ReleaseByteArrayElements(env, b_s, s, 0); return(j_d); } JNIEXPORT jbyteArray JNICALL Java_fstAPI_fstUtilityEscToBin (JNIEnv *env, jclass obj, jstring j_s) { const char *s = (*env)->GetStringUTFChars(env, j_s, 0); char *d = strdup(s); int len = strlen(s); jbyteArray result; int rlen = fstUtilityEscToBin(d, d, len); (*env)->ReleaseStringUTFChars(env, j_s, s); result=(*env)->NewByteArray(env, rlen); (*env)->SetByteArrayRegion(env, result, 0, rlen, d); free(d); return(result); } JNIEXPORT void JNICALL Java_fstAPI_fstReaderIterateHier (JNIEnv *env, jobject obj, jlong ctx, jobject obj2) { struct fstHier *fh = fstReaderIterateHier((void *)(long)ctx); jclass javaDataClass = (*env)->FindClass(env, "fstHier"); jfieldID validField = (*env)->GetFieldID(env, javaDataClass, "valid", "Z"); jfieldID htypField = (*env)->GetFieldID(env, javaDataClass, "htyp", "I"); jfieldID typField = (*env)->GetFieldID(env, javaDataClass, "typ", "I"); jfieldID subtypeField; jfieldID directionField; jfieldID lengthField; jfieldID handleField; jfieldID name1Field; jfieldID name2Field; jfieldID argField; jfieldID arg_from_nameField; jfieldID isAliasField; jstring j_name1; jstring j_name2; (*env)->SetBooleanField(env, obj2, validField, (fh != NULL)); if(fh) { (*env)->SetIntField(env, obj2, htypField, fh->htyp); switch(fh->htyp) { case FST_HT_SCOPE: (*env)->SetIntField(env, obj2, typField, fh->u.scope.typ); j_name1 = (*env)->NewStringUTF(env, fh->u.scope.name); name1Field = (*env)->GetFieldID(env, javaDataClass, "name1", "Ljava/lang/String;"); (*env)->SetObjectField(env, obj2, name1Field, j_name1); j_name2 = (*env)->NewStringUTF(env, fh->u.scope.component); name2Field = (*env)->GetFieldID(env, javaDataClass, "name2", "Ljava/lang/String;"); (*env)->SetObjectField(env, obj2, name2Field, j_name2); break; case FST_HT_UPSCOPE: (*env)->SetIntField(env, obj2, typField, FST_ST_VCD_UPSCOPE); break; case FST_HT_VAR: (*env)->SetIntField(env, obj2, typField, fh->u.var.typ); directionField = (*env)->GetFieldID(env, javaDataClass, "direction", "I"); (*env)->SetIntField(env, obj2, directionField, (jint)fh->u.var.direction); j_name1 = (*env)->NewStringUTF(env, fh->u.var.name); name1Field = (*env)->GetFieldID(env, javaDataClass, "name1", "Ljava/lang/String;"); (*env)->SetObjectField(env, obj2, name1Field, j_name1); lengthField = (*env)->GetFieldID(env, javaDataClass, "length", "I"); (*env)->SetIntField(env, obj2, lengthField, (jint)fh->u.var.length); handleField = (*env)->GetFieldID(env, javaDataClass, "handle", "I"); (*env)->SetIntField(env, obj2, handleField, (jint)fh->u.var.handle); isAliasField = (*env)->GetFieldID(env, javaDataClass, "is_alias", "Z"); (*env)->SetBooleanField(env, obj2, isAliasField, (jboolean)(fh->u.var.is_alias)); break; case FST_HT_ATTRBEGIN: (*env)->SetIntField(env, obj2, typField, fh->u.attr.typ); subtypeField = (*env)->GetFieldID(env, javaDataClass, "subtype", "I"); (*env)->SetIntField(env, obj2, subtypeField, fh->u.attr.subtype); j_name1 = (*env)->NewStringUTF(env, fh->u.attr.name); name1Field = (*env)->GetFieldID(env, javaDataClass, "name1", "Ljava/lang/String;"); (*env)->SetObjectField(env, obj2, name1Field, j_name1); argField = (*env)->GetFieldID(env, javaDataClass, "arg", "J"); (*env)->SetLongField(env, obj2, argField, fh->u.attr.arg); arg_from_nameField = (*env)->GetFieldID(env, javaDataClass, "arg_from_name", "J"); (*env)->SetLongField(env, obj2, arg_from_nameField, fh->u.attr.arg_from_name); break; case FST_HT_ATTREND: (*env)->SetIntField(env, obj2, typField, FST_ST_GEN_ATTREND); break; default: break; } } } struct jni_fstCB_t { JNIEnv *env; jobject obj; void *ctx; jobject cbobj; jclass cls; jmethodID mid; }; static void value_change_callback2(void *user_callback_data_pointer, uint64_t time, fstHandle facidx, const unsigned char *value, uint32_t len) { struct jni_fstCB_t *jni = (struct jni_fstCB_t *)user_callback_data_pointer; jstring j_s = (*jni->env)->NewStringUTF(jni->env, value); (*jni->env)->CallVoidMethod(jni->env, jni->cbobj, jni->mid, (jlong)time, (jint)facidx, j_s); } static void value_change_callback(void *user_callback_data_pointer, uint64_t time, fstHandle facidx, const unsigned char *value) { value_change_callback2(user_callback_data_pointer, time, facidx, value, 0); } JNIEXPORT jint JNICALL Java_fstAPI_fstReaderIterBlocks (JNIEnv *env, jobject obj, jlong ctx, jobject cbobj) { struct jni_fstCB_t cb; jint rc; jclass cls = (*env)->GetObjectClass(env, cbobj); jmethodID mid = (*env)->GetMethodID(env, cls, "fstReaderCallback", "(JILjava/lang/String;)V"); cb.env = env; cb.obj = obj; cb.ctx = (void *)(long)ctx; cb.cbobj = cbobj; cb.cls = cls; cb.mid = mid; rc = fstReaderIterBlocks2((void *)(long)ctx, value_change_callback, value_change_callback2, &cb, NULL); return(rc); } gtkwave-3.3.86/contrib/fst_jni/fstScopeType.java0000664000175000017500000000554213166335473021201 0ustar bybellbybell/* * Copyright (c) 2013 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ public class fstScopeType { private fstScopeType() { } public static final String [] FST_ST_NAMESTRINGS = { "module", "task", "function", "begin", "fork", "generate", "struct", "union", "class", "interface", "package", "program", "vhdl_architecture", "vhdl_procedure", "vhdl_function", "vhdl_record", "vhdl_process", "vhdl_block", "vhdl_for_generate", "vhdl_if_generate", "vhdl_generate", "vhdl_package" }; public static final int FST_ST_MIN = 0; public static final int FST_ST_VCD_MODULE = 0; public static final int FST_ST_VCD_TASK = 1; public static final int FST_ST_VCD_FUNCTION = 2; public static final int FST_ST_VCD_BEGIN = 3; public static final int FST_ST_VCD_FORK = 4; public static final int FST_ST_VCD_GENERATE = 5; public static final int FST_ST_VCD_STRUCT = 6; public static final int FST_ST_VCD_UNION = 7; public static final int FST_ST_VCD_CLASS = 8; public static final int FST_ST_VCD_INTERFACE = 9; public static final int FST_ST_VCD_PACKAGE = 10; public static final int FST_ST_VCD_PROGRAM = 11; public static final int FST_ST_VHDL_ARCHITECTURE = 12; public static final int FST_ST_VHDL_PROCEDURE = 13; public static final int FST_ST_VHDL_FUNCTION = 14; public static final int FST_ST_VHDL_RECORD = 15; public static final int FST_ST_VHDL_PROCESS = 16; public static final int FST_ST_VHDL_BLOCK = 17; public static final int FST_ST_VHDL_FOR_GENERATE = 18; public static final int FST_ST_VHDL_IF_GENERATE = 19; public static final int FST_ST_VHDL_GENERATE = 20; public static final int FST_ST_VHDL_PACKAGE = 21; public static final int FST_ST_MAX = 21; public static final int FST_ST_GEN_ATTRBEGIN = 252; public static final int FST_ST_GEN_ATTREND = 253; public static final int FST_ST_VCD_SCOPE = 254; public static final int FST_ST_VCD_UPSCOPE = 255; }; gtkwave-3.3.86/contrib/fst_jni/zzz_test.csh0000775000175000017500000000126313166335473020300 0ustar bybellbybell#!/bin/csh setenv LD_LIBRARY_PATH `pwd` javac \ fstAPI.java \ fstArrayType.java \ fstAttrType.java \ fstEnumValueType.java \ fstFileType.java \ fstHier.java \ fstHierType.java \ fstMiscType.java \ fstPackType.java \ fstScopeType.java \ fstSupplementalDataType.java \ fstSupplementalVarType.java \ fstVarDir.java \ fstVarType.java \ fstWriter.java \ fstWriterPackType.java \ fstReader.java javac \ fst2Vcd.java \ Main.java javah -jni fstAPI gcc -o libfstAPI.so -fPIC -shared -Wl,-soname,fstAPI.so fstAPI.c ../../src/helpers/fst/fstapi.c ../../src/helpers/fst/fastlz.c \ -I./ -I../../ -I../../src/helpers/fst/ -lz java Main /tmp/des.fst rm *.class rm libfstAPI.so gtkwave-3.3.86/contrib/fst_jni/fstAttrType.java0000664000175000017500000000275413166335473021044 0ustar bybellbybell/* * Copyright (c) 2013 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ public class fstAttrType { private fstAttrType( ) { } public static final String [] FST_AT_NAMESTRINGS = { "misc", "array", "enum", "class" }; public static final int FST_AT_MIN = 0; public static final int FST_AT_MISC = 0; public static final int FST_AT_ARRAY = 1; public static final int FST_AT_ENUM = 2; public static final int FST_AT_PACK = 3; public static final int FST_AT_MAX = 3; }; gtkwave-3.3.86/contrib/fst_jni/Makefile.am0000664000175000017500000000071613166335473017740 0ustar bybellbybell## -*- makefile ## EXTRA_DIST= \ fst2Vcd.java \ fstAPI.c \ fstAPI.h \ fstAPI.java \ fstArrayType.java \ fstAttrType.java \ fstEnumValueType.java \ fstFileType.java \ fstHier.java \ fstHierType.java \ fstMiscType.java \ fstPackType.java \ fstReader.java \ fstScopeType.java \ fstSupplementalDataType.java \ fstSupplementalVarType.java \ fstVarDir.java \ fstVarType.java \ fstWriter.java \ fstWriterPackType.java \ Main.java \ zzz_test.csh gtkwave-3.3.86/contrib/fst_jni/fstWriter.java0000664000175000017500000000765713166335473020553 0ustar bybellbybell/* * Copyright (c) 2013 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ public class fstWriter extends fstAPI { private long ctx; fstWriter(String nam, boolean use_compressed_hier) { ctx = fstWriterCreate(nam, use_compressed_hier); } protected void finalize() throws Throwable { try { fstWriterClose(ctx); } finally { super.finalize(); } } public void fstWriterClose() { fstWriterClose(ctx); ctx = 0; } public int fstWriterCreateVar(int vt, int vd, int len, String nam, int aliasHandle) { return(fstWriterCreateVar(ctx, vt, vd, len, nam, aliasHandle)); } public void fstWriterEmitDumpActive(boolean enable) { fstWriterEmitDumpActive(ctx, enable); } public void fstWriterEmitTimeChange(long tim) { fstWriterEmitTimeChange(ctx, tim); } public void fstWriterEmitValueChange(int handle, double val) { fstWriterEmitValueChange(ctx, handle, val); } public void fstWriterEmitValueChange(int handle, int val) { fstWriterEmitValueChange(ctx, handle, val); } public void fstWriterEmitValueChange(int handle, String val) { fstWriterEmitValueChange(ctx, handle, val); } public void fstWriterEmitVariableLengthValueChange(int handle, String val, int len) { fstWriterEmitVariableLengthValueChange(ctx, handle, val, len); } public void fstWriterFlushContext() { fstWriterFlushContext(ctx); } public boolean fstWriterGetDumpSizeLimitReached() { return(fstWriterGetDumpSizeLimitReached(ctx)); } public boolean fstWriterGetFseekFailed() { return(fstWriterGetFseekFailed(ctx)); } public void fstWriterSetAttrBegin(int attrtype, int subtype, String attrname, long arg) { fstWriterSetAttrBegin(ctx, attrtype, subtype, attrname, arg); } public void fstWriterSetAttrEnd() { fstWriterSetAttrEnd(ctx); } public void fstWriterSetComment(String comm) { fstWriterSetComment(ctx, comm); } public void fstWriterSetDate(String dat) { fstWriterSetDate(ctx, dat); } public void fstWriterSetDumpSizeLimit(long numbytes) { fstWriterSetDumpSizeLimit(ctx, numbytes); } public void fstWriterSetEnvVar(String envvar) { fstWriterSetEnvVar(ctx, envvar); } public void fstWriterSetFileType(int typ) { fstWriterSetFileType(ctx, typ); } public void fstWriterSetPackType(int typ) { fstWriterSetPackType(ctx, typ); } public void fstWriterSetParallelMode(boolean enable) { fstWriterSetParallelMode(ctx, enable); } public void fstWriterSetRepackOnClose(boolean enable) { fstWriterSetRepackOnClose(ctx, enable); } public void fstWriterSetScope(int scopetype, String scopename, String scopecomp) { fstWriterSetScope(ctx, scopetype, scopename, scopecomp); } public void fstWriterSetTimescaleFromString(String s) { fstWriterSetTimescaleFromString(ctx, s); } public void fstWriterSetTimescale(int ts) { fstWriterSetTimescale(ctx, ts); } public void fstWriterSetTimezero(long tim) { fstWriterSetTimezero(ctx, tim); } public void fstWriterSetUpscope() { fstWriterSetUpscope(ctx); } public void fstWriterSetVersion(String vers) { fstWriterSetVersion(ctx, vers); } } gtkwave-3.3.86/contrib/fst_jni/fstWriterPackType.java0000664000175000017500000000245113166335473022177 0ustar bybellbybell/* * Copyright (c) 2013 Tony Bybell. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ public class fstWriterPackType { private fstWriterPackType( ) { } public static final int FST_WR_PT_ZLIB = 0; public static final int FST_WR_PT_FASTLZ = 1; public static final int FST_WR_PT_LZ4 = 2; }; gtkwave-3.3.86/contrib/pccts/0000775000175000017500000000000013166335473015360 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/CHANGES_FROM_133.txt0000664000175000017500000025435413166335473020417 0ustar bybellbybell======================================================================= List of Implemented Fixes and Changes for Maintenance Releases of PCCTS ======================================================================= DISCLAIMER The software and these notes are provided "as is". They may include typographical or technical errors and their authors disclaims all liability of any kind or nature for damages due to error, fault, defect, or deficiency regardless of cause. All warranties of any kind, either express or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. ------------------------------------------------------- Note: Items #153 to #1 are now in a separate file named CHANGES_FROM_133_BEFORE_MR13.txt ------------------------------------------------------- #312. (Changed in MR33) Bug caused by change #299. In change #299 a warning message was suppressed when there was no LT(1) in a semantic predicate and max(k,ck) was 1. The changed caused the code which set a default predicate depth for the semantic predicate to be left as 0 rather than set to 1. This manifested as an error at line #1559 of mrhost.c Reported by Peter Dulimov. #311. (Changed in MR33) Added sorcer/lib to Makefile. Reported by Dale Martin. #310. (Changed in MR32) In C mode zzastPush was spelled zzastpush in one case. Reported by Jean-Claude Durand #309. (Changed in MR32) Renamed baseName because of VMS name conflict Renamed baseName to pcctsBaseName to avoid library name conflict with VMS library routine. Reported by Jean-François PIÉRONNE. #308. (Changed in MR32) Used "template" as name of formal in C routine In astlib.h routine ast_scan a formal was named "template". This caused problems when the C code was compiled with a C++ compiler. Reported by Sabyasachi Dey. #307. (Changed in MR31) Compiler dependent bug in function prototype generation The code which generated function prototypes contained a bug which was compiler/optimization dependent. Under some circumstance an extra character would be included in portions of a function prototype. Reported by David Cook. #306. (Changed in MR30) Validating predicate following a token A validating predicate which immediately followed a token match consumed the token after the predicate rather than before. Prior to this fix (in the following example) isValidTimeScaleValue() in the predicate would test the text for TIMESCALE rather than for NUMBER: time_scale : TIMESCALE <getText())>>? ts:NUMBER ( us:MICROSECOND << tVal = ...>> | ns:NANOSECOND << tVal = ... >> ) Reported by Adalbert Perbandt. #305. (Changed in MR30) Alternatives with guess blocks inside (...)* blocks. In MR14 change #175 fixed a bug in the prediction expressions for guess blocks which were of the form (alpha)? beta. Unfortunately, this resulted in a new bug as exemplified by the example below, which computed the first set for r as {B} rather than {B C}: r : ( (A)? B | C )* This example doesn't make any sense as A is not a prefix of B, but it illustrates the problem. This bug did not appear for: r : ( (A)? | C )* because it does not use the (alpha)? beta form. Item #175 fixed an asymmetry in ambiguity messages for the following constructs which appear to have identical ambiguities (between repeating the loop vs. exiting the loop). MR30 retains this fix, but the implementation is slightly different. r_star : ( (A B)? )* A ; r_plus : ( (A B)? )+ A ; Reported by Arpad Beszedes (beszedes inf.u-szeged.hu). #304. (Changed in MR30) Crash when mismatch between output value counts. For a rule such as: r1 : r2>[i,j]; r2 >[int i, int j] : A; If there were extra actuals for the reference to rule r2 from rule r1 there antlr would crash. This bug was introduced by change #276. Reported by Sinan Karasu. #303. (Changed in MR30) DLGLexerBase::replchar DLGLexerBase::replchar and the C mode routine zzreplchar did not work properly when the new character was 0. Reported with fix by Philippe Laporte #302. (Changed in MR28) Fix significant problems in initial release of MR27. #301. (Changed in MR27) Default tab stops set to 2 spaces. To have antlr generate true tabs rather than spaces, use "antlr -tab 0". To generate 4 spaces per tab stop use "antlr -tab 4" #300. (Changed in MR27) Consider the following methods of constructing an AST from ID: rule1! : id:ID << #0 = #[id]; >> ; rule2! : id:ID << #0 = #id; >> ; rule3 : ID ; rule4 : id:ID << #0 = #id; >> ; For rule_2, the AST corresponding to id would always be NULL. This is because the user explicitly suppressed AST construction using the "!" operator on the rule. In MR27 the use of an AST expression such as #id overrides the "!" operator and forces construction of the AST. This fix does not apply to C mode ASTs when the ASTs are referenced using numbers rather than symbols. For C mode, this requires that the (optional) function/macro zzmk_ast be defined. This functions copies information from an attribute into a previously allocated AST. Reported by Jan Langer (jan langernetz.de) #299. (Changed in MR27) Don't warn if k=1 and semantic predicate missing LT(i) If a semantic does not have a reference to LT(i) or (C mode LATEXT(i)) then pccts doesn't know how many lookahead tokens to use for context. However, if max(k,ck) is 1 then there is really only one choice and the warning is unnecessary. #298. (Changed in MR27) Removed "register" for lastpos in dlgauto.c zzgettok #297. (Changed in MR27) Incorrect prototypes when used with classic C There were a number of errors in function headers when antlr was built with compilers that do not have __STDC__ or __cplusplus set. The functions which have variable length argument lists now use PCCTS_USE_STDARG rather than __USE_PROTOTYPES__ to determine whether to use stdargs or varargs. #296. (Changed in MR27) Complex return types in rules. The following return type was not properly handled when unpacking a struct with containing multiple return values: rule > [int i, IIR_Bool (IIR_Decl::*constraint)()] : ... Instead of using "constraint", the program got lost and used an empty string. Reported by P.A. Wilsey. #295. (Changed in MR27) Extra ";" following zzGUESS_DONE sometimes. Certain constructs with guess blocks in MR23 led to extra ";" preceding the "else" clause of an "if". Reported by P.A. Wilsey. #294. (Changed in MR27) Infinite loop in antlr for nested blocks An oversight in detecting an empty alternative sometimes led to an infinite loop in antlr when it encountered a rule with nested blocks and guess blocks. Reported by P.A. Wilsey. #293. (Changed in MR27) Sorcerer optimization of _t->type() Sorcerer generated code may contain many calls to _t->type() in a single statement. This change introduces a temporary variable to eliminate unnnecesary function calls. Change implemented by Tom Molteno (tim videoscript.com). #292. (Changed in MR27) WARNING: Item #267 changes the signature of methods in the AST class. **** Be sure to revise your AST functions of the same name *** #291. (Changed in MR24) Fix to serious code generation error in MR23 for (...)+ block. #290. (Changed in MR23) Item #247 describes a change in the way {...} blocks handled an error. Consider: r1 : {A} b ; b : B; with input "C". Prior to change #247, the error would resemble "expected B - found C". This is correct but incomplete, and therefore misleading. In #247 it was changed to "expected A, B - found C". This was fine, except for users of parser exception handling because the exception was generated in the epilogue for {...} block rather than in rule b. This made it difficult for users of parser exception handling because B was not expected in that context. Those not using parser exception handling didn't notice the difference. The current change restores the behavior prior to #247 when parser exceptions are present, but retains the revised behavior otherwise. This change should be visible only when exceptions are in use and only for {...} blocks and sub-blocks of the form (something|something | something | epsilon) where epsilon represents an empty production and it is the last alternative of a sub-block. In contrast, (something | epsilon | something) should generate the same code as before, even when exceptions are used. Reported by Philippe Laporte (philippe at transvirtual.com). #289. (Changed in MR23) Bug in matching complement of a #tokclass Prior to MR23 when a #tokclass was matched in both its complemented form and uncomplemented form, the bit set generated for its first use was used for both cases. However, the prediction expression was correctly computed in both cases. This meant that the second case would never be matched because, for the second appearance, the prediction expression and the set to be matched would be complements of each other. Consider: #token A "a" #token B "b" #token C "c" #tokclass AB {A B} r1 : AB /* alt 1x */ | ~AB /* alt 1y */ ; Prior to MR23, this resulted in alternative 1y being unreachable. Had it been written: r2 : ~AB /* alt 2x */ : AB /* alt 2y */ then alternative 2y would have become unreachable. This bug was only for the case of complemented #tokclass. For complemented #token the proper code was generated. #288. (Changed in MR23) #errclass not restricted to choice points The #errclass directive is supposed to allow a programmer to define print strings which should appear in syntax error messages as a replacement for some combinations of tokens. For instance: #errclass Operator {PLUS MINUS TIMES DIVIDE} If a syntax message includes all four of these tokens, and there is no "better" choice of error class, the word "Operator" will be used rather than a list of the four token names. Prior to MR23 the #errclass definitions were used only at choice points (which call the FAIL macro). In other cases where there was no choice (e.g. where a single token or token class were matched) the #errclass information was not used. With MR23 the #errclass declarations are used for syntax error messages when matching a #tokclass, a wildcard (i.e. "*"), or the complement of a #token or #tokclass (e.g. ~Operator). Please note that #errclass may now be defined using #tokclass names (see Item #284). Reported by Philip A. Wilsey. #287. (Changed in MR23) Print name for #tokclass Item #148 describes how to give a print name to a #token so that,for example, #token ID could have the expression "identifier" in syntax error messages. This has been extended to #tokclass: #token ID("identifier") "[a-zA-Z]+" #tokclass Primitive("primitive type") {INT, FLOAT, CHAR, FLOAT, DOUBLE, BOOL} This is really a cosmetic change, since #tokclass names do not appear in any error messages. #286. (Changed in MR23) Makefile change to use of cd In cases where a pccts subdirectory name matched a directory identified in a $CDPATH environment variable the build would fail. All makefile cd commands have been changed from "cd xyz" to "cd ./xyz" in order to avoid this problem. #285. (Changed in MR23) Check for null pointers in some dlg structures An invalid regular expression can cause dlg to build an invalid structure to represent the regular expression even while it issues error messages. Additional pointer checks were added. Reported by Robert Sherry. #284. (Changed in MR23) Allow #tokclass in #errclass definitions Previously, a #tokclass reference in the definition of an #errclass was not handled properly. Instead of being expanded into the set of tokens represented by the #tokclass it was treated somewhat like an #errclass. However, in a later phase when all #errclass were expanded into the corresponding tokens the #tokclass reference was not expanded (because it wasn't an #errclass). In effect the reference was ignored. This has been fixed. Problem reported by Mike Dimmick (mike dimmick.demon.co.uk). #283. (Changed in MR23) Option -tmake invoke's parser's tmake When the string #(...) appears in an action antlr replaces it with a call to ASTBase::tmake(...) to construct an AST. It is sometimes useful to change the tmake routine so that it has access to information in the parser - something which is not possible with a static method in an application where they may be multiple parsers active. The antlr option -tmake replaces the call to ASTBase::tmake with a call to a user supplied tmake routine. #282. (Changed in MR23) Initialization error for DBG_REFCOUNTTOKEN When the pre-processor symbol DBG_REFCOUNTTOKEN is defined incorrect code is generated to initialize ANTLRRefCountToken::ctor and dtor. Fix reported by Sven Kuehn (sven sevenkuehn.de). #281. (Changed in MR23) Addition of -noctor option for Sorcerer Added a -noctor option to suppress generation of the blank ctor for users who wish to define their own ctor. Contributed by Jan Langer (jan langernetz.de). #280. (Changed in MR23) Syntax error message for EOF token The EOF token now receives special treatment in syntax error messages because there is no text matched by the eof token. The token name of the eof token is used unless it is "@" - in which case the string "" is used. Problem reported by Erwin Achermann (erwin.achermann switzerland.org). #279. (Changed in MR23) Exception groups There was a bug in the way that exception groups were attached to alternatives which caused problems when there was a block contained in an alternative. For instance, in the following rule; statement : IF S { ELSE S } exception .... ; the exception would be attached to the {...} block instead of the entire alternative because it was attached, in error, to the last alternative instead of the last OPEN alternative. Reported by Ty Mordane (tymordane hotmail.com). #278. (Changed in MR23) makefile changes Contributed by Tomasz Babczynski (faster lab05-7.ict.pwr.wroc.pl). The -cfile option is not absolutely needed: when extension of source file is one of the well-known C/C++ extensions it is treated as C/C++ source The gnu make defines the CXX variable as the default C++ compiler name, so I added a line to copy this (if defined) to the CCC var. Added a -sor option: after it any -class command defines the class name for sorcerer, not for ANTLR. A file extended with .sor is treated as sorcerer input. Because sorcerer can be called multiple times, -sor option can be repeated. Any files and classes (one class per group) after each -sor makes one tree parser. Not implemented: 1. Generate dependences for user c/c++ files. 2. Support for -sor in c mode not. I have left the old genmk program in the directory as genmk_old.c. #277. (Changed in MR23) Change in macro for failed semantic predicates In the past, a semantic predicate that failed generated a call to the macro zzfailed_pred: #ifndef zzfailed_pred #define zzfailed_pred(_p) \ if (guessing) { \ zzGUESS_FAIL; \ } else { \ something(_p) } #endif If a user wished to use the failed action option for semantic predicates: rule : <>? [my_fail_action] A | ... the code for my_fail_action would have to contain logic for handling the guess part of the zzfailed_pred macro. The user should not have to be aware of the guess logic in writing the fail action. The zzfailed_pred has been rewritten to have three arguments: arg 1: the stringized predicate of the semantic predicate arg 2: 0 => there is no user-defined fail action 1 => there is a user-defined fail action arg 3: the user-defined fail action (if defined) otherwise a no-operation The zzfailed_pred macro is now defined as: #ifndef zzfailed_pred #define zzfailed_pred(_p,_hasuseraction,_useraction) \ if (guessing) { \ zzGUESS_FAIL; \ } else { \ zzfailed_pred_action(_p,_hasuseraction,_useraction) \ } #endif With zzfailed_pred_action defined as: #ifndef zzfailed_pred_action #define zzfailed_pred_action(_p,_hasuseraction,_useraction) \ if (_hasUserAction) { _useraction } else { failedSemanticPredicate(_p); } #endif In C++ mode failedSemanticPredicate() is a virtual function. In C mode the default action is a fprintf statement. Suggested by Erwin Achermann (erwin.achermann switzerland.org). #276. (Changed in MR23) Addition of return value initialization syntax In an attempt to reduce the problems caused by the PURIFY macro I have added new syntax for initializing the return value of rules and the antlr option "-nopurify". A rule with a single return argument: r1 > [Foo f = expr] : now generates code that resembles: Foo r1(void) { Foo _retv = expr; ... } A rule with more than one return argument: r2 > [Foo f = expr1, Bar b = expr2 ] : generates code that resembles: struct _rv1 { Foo f; Bar b; } _rv1 r2(void) { struct _rv1 _retv; _retv.f = expr1; _retv.b = expr2; ... } C++ style comments appearing in the initialization list may cause problems. #275. (Changed in MR23) Addition of -nopurify option to antlr A long time ago the PURIFY macro was introduced to initialize return value arguments and get rid of annying messages from program that checked for unitialized variables. This has caused significant annoyance for C++ users that had classes with virtual functions or non-trivial contructors because it would zero the object, including the pointer to the virtual function table. This could be defeated by redefining the PURIFY macro to be empty, but it was a constant surprise to new C++ users of pccts. I would like to remove it, but I fear that some existing programs depend on it and would break. My temporary solution is to add an antlr option -nopurify which disables generation of the PURIFY macro call. The PURIFY macro should be avoided in favor of the new syntax for initializing return arguments described in item #275. To avoid name clash, the PURIFY macro has been renamed PCCTS_PURIFY. #274. (Changed in MR23) DLexer.cpp renamed to DLexer.h (Changed in MR23) ATokPtr.cpp renamed to ATokPtrImpl.h These two files had .cpp extensions but acted like .h files because there were included in other files. This caused problems for many IDE. I have renamed them. The ATokPtrImpl.h was necessary because there was already an ATokPtr.h. #273. (Changed in MR23) Default win32 library changed to multi-threaded DLL The model used for building the Win32 debug and release libraries has changed to multi-threaded DLL. To make this change in your MSVC 6 project: Project -> Settings Select the C++ tab in the right pane of the dialog box Select "Category: Code Generation" Under "Use run-time library" select one of the following: Multi-threaded DLL Debug Multi-threaded DLL Suggested by Bill Menees (bill.menees gogallagher.com) #272. (Changed in MR23) Failed semantic predicate reported via virtual function In the past, a failed semantic predicated reported the problem via a macro which used fprintf(). The macro now expands into a call on the virtual function ANTLRParser::failedSemanticPredicate(). #271. (Changed in MR23) Warning for LT(i), LATEXT(i) in token match actions An bug (or at least an oddity) is that a reference to LT(1), LA(1), or LATEXT(1) in an action which immediately follows a token match in a rule refers to the token matched, not the token which is in the lookahead buffer. Consider: r : abc <> D <> E; In this case LT(1) in action alpha will refer to the next token in the lookahead buffer ("D"), but LT(1) in action beta will refer to the token matched by D - the preceding token. A warning has been added for users about this when an action following a token match contains a reference to LT(1), LA(1), or LATEXT(1). This behavior should be changed, but it appears in too many programs now. Another problem, perhaps more significant, is that the obvious fix (moving the consume() call to before the action) could change the order in which input is requested and output appears in existing programs. This problem was reported, along with a fix by Benjamin Mandel (beny sd.co.il). However, I felt that changing the behavior was too dangerous for existing code. #270. (Changed in MR23) Removed static objects from PCCTSAST.cpp There were some statically allocated objects in PCCTSAST.cpp These were changed to non-static. #269. (Changed in MR23) dlg output for initializing static array The output from dlg contains a construct similar to the following: struct XXX { static const int size; static int array1[5]; }; const int XXX::size = 4; int XXX::array1[size+1]; The problem is that although the expression "size+1" used in the definition of array1 is equal to 5 (the expression used to declare array), it is not considered equivalent by some compilers. Reported with fix by Volker H. Simonis (simonis informatik.uni-tuebingen.de) #268. (Changed in MR23) syn() routine output when k > 1 The syn() routine is supposed to print out the text of the token causing the syntax error. It appears that it always used the text from the first lookahead token rather than the appropriate one. The appropriate one is computed by comparing the token codes of lookahead token i (for i = 1 to k) with the FIRST(i) set. This has been corrected in ANTLRParser::syn(). Reported by Bill Menees (bill.menees gogallagher.com) #267. (Changed in MR23) AST traversal functions client data argument The AST traversal functions now take an extra (optional) parameter which can point to client data: preorder_action(void* pData = NULL) preorder_before_action(void* pData = NULL) preorder_after_action(void* pData = NULL) **** Warning: this changes the AST signature. *** **** Be sure to revise your AST functions of the same name *** Bill Menees (bill.menees gogallagher.com) #266. (Changed in MR23) virtual function printMessage() Bill Menees (bill.menees gogallagher.com) has completed the tedious taks of replacing all calls to fprintf() with calls to the virtual function printMessage(). For classes which have a pointer to the parser it forwards the printMessage() call to the parser's printMessage() routine. This should make it significanly easier to redirect pccts error and warning messages. #265. (Changed in MR23) Remove "labase++" in C++ mode In C++ mode labase++ is called when a token is matched. It appears that labase is not used in C++ mode at all, so this code has been commented out. #264. (Changed in MR23) Complete rewrite of ParserBlackBox.h The parser black box (PBlackBox.h) was completely rewritten by Chris Uzdavinis (chris atdesk.com) to improve its robustness. #263. (Changed in MR23) -preamble and -preamble_first rescinded Changes for item #253 have been rescinded. #262. (Changed in MR23) Crash with -alpha option during traceback Under some circumstances a -alpha traceback was started at the "wrong" time. As a result, internal data structures were not initialized. Reported by Arpad Beszedes (beszedes inf.u-szeged.hu). #261. (Changed in MR23) Defer token fetch for C++ mode Item #216 has been revised to indicate that use of the defer fetch option (ZZDEFER_FETCH) requires dlg option -i. #260. (MR22) Raise default lex buffer size from 8,000 to 32,000 bytes. ZZLEXBUFSIZE is the size (in bytes) of the buffer used by dlg generated lexers. The default value has been raised to 32,000 and the value used by antlr, dlg, and sorcerer has also been raised to 32,000. #259. (MR22) Default function arguments in C++ mode. If a rule is declared: rr [int i = 0] : .... then the declaration generated by pccts resembles: void rr(int i = 0); however, the definition must omit the default argument: void rr(int i) {...} In the past the default value was not omitted. In MR22 the generated code resembles: void rr(int i /* = 0 */ ) {...} Implemented by Volker H. Simonis (simonis informatik.uni-tuebingen.de) Note: In MR23 this was changed so that nested C style comments ("/* ... */") would not cause problems. #258. (MR22) Using a base class for your parser In item #102 (MR10) the class statement was extended to allow one to specify a base class other than ANTLRParser for the generated parser. It turned out that this was less than useful because the constructor still specified ANTLRParser as the base class. The class statement now uses the first identifier appearing after the ":" as the name of the base class. For example: class MyParser : public FooParser { Generates in MyParser.h: class MyParser : public FooParser { Generates in MyParser.cpp something that resembles: MyParser::MyParser(ANTLRTokenBuffer *input) : FooParser(input,1,0,0,4) { token_tbl = _token_tbl; traceOptionValueDefault=1; // MR10 turn trace ON } The base class constructor must have a signature similar to that of ANTLRParser. #257. (MR21a) Removed dlg statement that -i has no effect in C++ mode. This was incorrect. #256. (MR21a) Malformed syntax graph causes crash after error message. In the past, certain kinds of errors in the very first grammar element could cause the construction of a malformed graph representing the grammar. This would eventually result in a fatal internal error. The code has been changed to be more resistant to this particular error. #255. (MR21a) ParserBlackBox(FILE* f) This constructor set openByBlackBox to the wrong value. Reported by Kees Bakker (kees_bakker tasking.nl). #254. (MR21a) Reporting syntax error at end-of-file When there was a syntax error at the end-of-file the syntax error routine would substitute "" for the programmer's end-of-file symbol. This substitution is now done only when the programmer does not define his own end-of-file symbol or the symbol begins with the character "@". Reported by Kees Bakker (kees_bakker tasking.nl). #253. (MR21) Generation of block preamble (-preamble and -preamble_first) *** This change was rescinded by item #263 *** The antlr option -preamble causes antlr to insert the code BLOCK_PREAMBLE at the start of each rule and block. It does not insert code before rules references, token references, or actions. By properly defining the macro BLOCK_PREAMBLE the user can generate code which is specific to the start of blocks. The antlr option -preamble_first is similar, but inserts the code BLOCK_PREAMBLE_FIRST(PreambleFirst_123) where the symbol PreambleFirst_123 is equivalent to the first set defined by the #FirstSetSymbol described in Item #248. I have not investigated how these options interact with guess mode (syntactic predicates). #252. (MR21) Check for null pointer in trace routine When some trace options are used when the parser is generated without the trace enabled, the current rule name may be a NULL pointer. A guard was added to check for this in restoreState. Reported by Douglas E. Forester (dougf projtech.com). #251. (MR21) Changes to #define zzTRACE_RULES The macro zzTRACE_RULES was being use to pass information to AParser.h. If this preprocessor symbol was not properly set the first time AParser.h was #included, the declaration of zzTRACEdata would be omitted (it is used by the -gd option). Subsequent #includes of AParser.h would be skipped because of the #ifdef guard, so the declaration of zzTracePrevRuleName would never be made. The result was that proper compilation was very order dependent. The declaration of zzTRACEdata was made unconditional and the problem of removing unused declarations will be left to optimizers. Diagnosed by Douglas E. Forester (dougf projtech.com). #250. (MR21) Option for EXPERIMENTAL change to error sets for blocks The antlr option -mrblkerr turns on an experimental feature which is supposed to provide more accurate syntax error messages for k=1, ck=1 grammars. When used with k>1 or ck>1 grammars the behavior should be no worse than the current behavior. There is no problem with the matching of elements or the computation of prediction expressions in pccts. The task is only one of listing the most appropriate tokens in the error message. The error sets used in pccts error messages are approximations of the exact error set when optional elements in (...)* or (...)+ are involved. While entirely correct, the error messages are sometimes not 100% accurate. There is also a minor philosophical issue. For example, suppose the grammar expects the token to be an optional A followed by Z, and it is X. X, of course, is neither A nor Z, so an error message is appropriate. Is it appropriate to say "Expected Z" ? It is correct, it is accurate, but it is not complete. When k>1 or ck>1 the problem of providing the exactly correct list of tokens for the syntax error messages ends up becoming equivalent to evaluating the prediction expression for the alternatives twice. However, for k=1 ck=1 grammars the prediction expression can be computed easily and evaluated cheaply, so I decided to try implementing it to satisfy a particular application. This application uses the error set in an interactive command language to provide prompts which list the alternatives available at that point in the parser. The user can then enter additional tokens to complete the command line. To do this required more accurate error sets then previously provided by pccts. In some cases the default pccts behavior may lead to more robust error recovery or clearer error messages then having the exact set of tokens. This is because (a) features like -ge allow the use of symbolic names for certain sets of tokens, so having extra tokens may simply obscure things and (b) the error set is use to resynchronize the parser, so a good choice is sometimes more important than having the exact set. Consider the following example: Note: All examples code has been abbreviated to the absolute minimum in order to make the examples concise. star1 : (A)* Z; The generated code resembles: old new (with -mrblkerr) --//----------- -------------------- for (;;) { for (;;) { match(A); match(A); } } match(Z); if (! A and ! Z) then FAIL(...{A,Z}...); } match(Z); With input X old message: Found X, expected Z new message: Found X, expected A, Z For the example: star2 : (A|B)* Z; old new (with -mrblkerr) ------------- -------------------- for (;;) { for (;;) { if (!A and !B) break; if (!A and !B) break; if (...) { if (...) { } } else { else { FAIL(...{A,B,Z}...) FAIL(...{A,B}...); } } } } match(B); if (! A and ! B and !Z) then FAIL(...{A,B,Z}...); } match(B); With input X old message: Found X, expected Z new message: Found X, expected A, B, Z With input A X old message: Found X, expected Z new message: Found X, expected A, B, Z This includes the choice of looping back to the star block. The code for plus blocks: plus1 : (A)+ Z; The generated code resembles: old new (with -mrblkerr) ------------- -------------------- do { do { match(A); match(A); } while (A) } while (A) match(Z); if (! A and ! Z) then FAIL(...{A,Z}...); } match(Z); With input A X old message: Found X, expected Z new message: Found X, expected A, Z This includes the choice of looping back to the plus block. For the example: plus2 : (A|B)+ Z; old new (with -mrblkerr) ------------- -------------------- do { do { if (A) { match(A); } else if (B) { match(B); } else { if (cnt > 1) break; FAIL(...{A,B,Z}...) FAIL(...{A,B}...); } } cnt++; } } match(Z); if (! A and ! B and !Z) then FAIL(...{A,B,Z}...); } match(B); With input X old message: Found X, expected A, B, Z new message: Found X, expected A, B With input A X old message: Found X, expected Z new message: Found X, expected A, B, Z This includes the choice of looping back to the star block. #249. (MR21) Changes for DEC/VMS systems Jean-François Piéronne (jfp altavista.net) has updated some VMS related command files and fixed some minor problems related to building pccts under the DEC/VMS operating system. For DEC/VMS users the most important differences are: a. Revised makefile.vms b. Revised genMMS for genrating VMS style makefiles. #248. (MR21) Generate symbol for first set of an alternative pccts can generate a symbol which represents the tokens which may appear at the start of a block: rr : #FirstSetSymbol(rr_FirstSet) ( Foo | Bar ) ; This will generate the symbol rr_FirstSet of type SetWordType with elements Foo and Bar set. The bits can be tested using code similar to the following: if (set_el(Foo, &rr_FirstSet)) { ... This can be combined with the C array zztokens[] or the C++ routine tokenName() to get the print name of the token in the first set. The size of the set is given by the newly added enum SET_SIZE, a protected member of the generated parser's class. The number of elements in the generated set will not be exactly equal to the value of SET_SIZE because of synthetic tokens created by #tokclass, #errclass, the -ge option, and meta-tokens such as epsilon, and end-of-file. The #FirstSetSymbol must appear immediately before a block such as (...)+, (...)*, and {...}, and (...). It may not appear immediately before a token, a rule reference, or action. However a token or rule reference can be enclosed in a (...) in order to make the use of #pragma FirstSetSymbol legal. rr_bad : #FirstSetSymbol(rr_bad_FirstSet) Foo; // Illegal rr_ok : #FirstSetSymbol(rr_ok_FirstSet) (Foo); // Legal Do not confuse FirstSetSymbol sets with the sets used for testing lookahead. The sets used for FirstSetSymbol have one element per bit, so the number of bytes is approximately the largest token number divided by 8. The sets used for testing lookahead store 8 lookahead sets per byte, so the length of the array is approximately the largest token number. If there is demand, a similar routine for follow sets can be added. #247. (MR21) Misleading error message on syntax error for optional elements. =================================================== The behavior has been revised when parser exception handling is used. See Item #290 =================================================== Prior to MR21, tokens which were optional did not appear in syntax error messages if the block which immediately followed detected a syntax error. Consider the following grammar which accepts Number, Word, and Other: rr : {Number} Word; For this rule the code resembles: if (LA(1) == Number) { match(Number); consume(); } match(Word); Prior to MR21, the error message for input "$ a" would be: line 1: syntax error at "$" missing Word With MR21 the message will be: line 1: syntax error at "$" expecting Word, Number. The generate code resembles: if ( (LA(1)==Number) ) { zzmatch(Number); consume(); } else { if ( (LA(1)==Word) ) { /* nothing */ } else { FAIL(... message for both Number and Word ...); } } match(Word); The code generated for optional blocks in MR21 is slightly longer than the previous versions, but it should give better error messages. The code generated for: { a | b | c } should now be *identical* to: ( a | b | c | ) which was not the case prior to MR21. Reported by Sue Marvin (sue siara.com). #246. (Changed in MR21) Use of $(MAKE) for calls to make Calls to make from the makefiles were replaced with $(MAKE) because of problems when using gmake. Reported with fix by Sunil K.Vallamkonda (sunil siara.com). #245. (Changed in MR21) Changes to genmk The following command line options have been added to genmk: -cfiles ... To add a user's C or C++ files into makefile automatically. The list of files must be enclosed in apostrophes. This option may be specified multiple times. -compiler ... The name of the compiler to use for $(CCC) or $(CC). The default in C++ mode is "CC". The default in C mode is "cc". -pccts_path ... The value for $(PCCTS), the pccts directory. The default is /usr/local/pccts. Contributed by Tomasz Babczynski (t.babczynski ict.pwr.wroc.pl). #244. (Changed in MR21) Rename variable "not" in antlr.g When antlr.g is compiled with a C++ compiler, a variable named "not" causes problems. Reported by Sinan Karasu (sinan.karasu boeing.com). #243 (Changed in MR21) Replace recursion with iteration in zzfree_ast Another refinement to zzfree_ast in ast.c to limit recursion. NAKAJIMA Mutsuki (muc isr.co.jp). #242. (Changed in MR21) LineInfoFormatStr Added an #ifndef/#endif around LineInfoFormatStr in pcctscfg.h. #241. (Changed in MR21) Changed macro PURIFY to a no-op *********************** *** NOT IMPLEMENTED *** *********************** The PURIFY macro was changed to a no-op because it was causing problems when passing C++ objects. The old definition: #define PURIFY(r,s) memset((char *) &(r),'\\0',(s)); The new definition: #define PURIFY(r,s) /* nothing */ #endif #240. (Changed in MR21) sorcerer/h/sorcerer.h _MATCH and _MATCHRANGE Added test for NULL token pointer. Suggested by Peter Keller (keller ebi.ac.uk) #239. (Changed in MR21) C++ mode AParser::traceGuessFail If tracing is turned on when the code has been generated without trace code, a failed guess generates a trace report even though there are no other trace reports. This make the behavior consistent with other parts of the trace system. Reported by David Wigg (wiggjd sbu.ac.uk). #238. (Changed in MR21) Namespace version #include files Changed reference from CStdio to cstdio (and other #include file names) in the namespace version of pccts. Should have known better. #237. (Changed in MR21) ParserBlackBox(FILE*) In the past, ParserBlackBox would close the FILE in the dtor even though it was not opened by ParserBlackBox. The problem is that there were two constructors, one which accepted a file name and did an fopen, the other which accepted a FILE and did not do an fopen. There is now an extra member variable which remembers whether ParserBlackBox did the open or not. Suggested by Mike Percy (mpercy scires.com). #236. (Changed in MR21) tmake now reports down pointer problem When ASTBase::tmake attempts to update the down pointer of an AST it checks to see if the down pointer is NULL. If it is not NULL it does not do the update and returns NULL. An attempt to update the down pointer is almost always a result of a user error. This can lead to difficult to find problems during tree construction. With this change, the routine calls a virtual function reportOverwriteOfDownPointer() which calls panic to report the problem. Users who want the old behavior can redefined the virtual function in their AST class. Suggested by Sinan Karasu (sinan.karasu boeing.com) #235. (Changed in MR21) Made ANTLRParser::resynch() virtual Suggested by Jerry Evans (jerry swsl.co.uk). #234. (Changed in MR21) Implicit int for function return value ATokenBuffer:bufferSize() did not specify a type for the return value. Reported by Hai Vo-Ba (hai fc.hp.com). #233. (Changed in MR20) Converted to MSVC 6.0 Due to external circumstances I have had to convert to MSVC 6.0 The MSVC 5.0 project files (.dsw and .dsp) have been retained as xxx50.dsp and xxx50.dsw. The MSVC 6.0 files are named xxx60.dsp and xxx60.dsw (where xxx is the related to the directory/project). #232. (Changed in MR20) Make setwd bit vectors protected in parser.h The access for the setwd array in the parser header was not specified. As a result, it would depend on the code which preceded it. In MR20 it will always have access "protected". Reported by Piotr Eljasiak (eljasiak zt.gdansk.tpsa.pl). #231. (Changed in MR20) Error in token buffer debug code. When token buffer debugging is selected via the pre-processor symbol DEBUG_TOKENBUFFER there is an erroneous check in AParser.cpp: #ifdef DEBUG_TOKENBUFFER if (i >= inputTokens->bufferSize() || inputTokens->minTokens() < LLk ) /* MR20 Was "<=" */ ... #endif Reported by David Wigg (wiggjd sbu.ac.uk). #230. (Changed in MR20) Fixed problem with #define for -gd option There was an error in setting zzTRACE_RULES for the -gd (trace) option. Reported by Gary Funck (gary intrepid.com). #229. (Changed in MR20) Additional "const" for literals "const" was added to the token name literal table. "const" was added to some panic() and similar routine #228. (Changed in MR20) dlg crashes on "()" The following token defintion will cause DLG to crash. #token "()" When there is a syntax error in a regular expression many of the dlg routines return a structure which has null pointers. When this is accessed by callers it generates the crash. I have attempted to fix the more common cases. Reported by Mengue Olivier (dolmen bigfoot.com). #227. (Changed in MR20) Array overwrite Steveh Hand (sassth unx.sas.com) reported a problem which was traced to a temporary array which was not properly resized for deeply nested blocks. This has been fixed. #226. (Changed in MR20) -pedantic conformance G. Hobbelt (i_a mbh.org) and THM made many, many minor changes to create prototypes for all the functions and bring antlr, dlg, and sorcerer into conformance with the gcc -pedantic option. This may require uses to add pccts/h/pcctscfg.h to some files or makefiles in order to have __USE_PROTOS defined. #225 (Changed in MR20) AST stack adjustment in C mode The fix in #214 for AST stack adjustment in C mode missed some cases. Reported with fix by Ger Hobbelt (i_a mbh.org). #224 (Changed in MR20) LL(1) and LL(2) with #pragma approx This may take a record for the oldest, most trival, lexical error in pccts. The regular expressions for LL(1) and LL(2) lacked an escape for the left and right parenthesis. Reported by Ger Hobbelt (i_a mbh.org). #223 (Changed in MR20) Addition of IBM_VISUAL_AGE directory Build files for antlr, dlg, and sorcerer under IBM Visual Age have been contributed by Anton Sergeev (ags mlc.ru). They have been placed in the pccts/IBM_VISUAL_AGE directory. #222 (Changed in MR20) Replace __STDC__ with __USE_PROTOS Most occurrences of __STDC__ replaced with __USE_PROTOS due to complaints from several users. #221 (Changed in MR20) Added #include for DLexerBase.h to PBlackBox. Added #include for DLexerBase.h to PBlackBox. #220 (Changed in MR19) strcat arguments reversed in #pred parse The arguments to strcat are reversed when creating a print name for a hash table entry for use with #pred feature. Problem diagnosed and fix reported by Scott Harrington (seh4 ix.netcom.com). #219. (Changed in MR19) C Mode routine zzfree_ast Changes to reduce use of recursion for AST trees with only right links or only left links in the C mode routine zzfree_ast. Implemented by SAKAI Kiyotaka (ksakai isr.co.jp). #218. (Changed in MR19) Changes to support unsigned char in C mode Changes to antlr.h and err.h to fix omissions in use of zzchar_t Implemented by SAKAI Kiyotaka (ksakai isr.co.jp). #217. (Changed in MR19) Error message when dlg -i and -CC options selected *** This change was rescinded by item #257 *** The parsers generated by pccts in C++ mode are not able to support the interactive lexer option (except, perhaps, when using the deferred fetch parser option.(Item #216). DLG now warns when both -i and -CC are selected. This warning was suggested by David Venditti (07751870267-0001 t-online.de). #216. (Changed in MR19) Defer token fetch for C++ mode Implemented by Volker H. Simonis (simonis informatik.uni-tuebingen.de) Normally, pccts keeps the lookahead token buffer completely filled. This requires max(k,ck) tokens of lookahead. For some applications this can cause deadlock problems. For example, there may be cases when the parser can't tell when the input has been completely consumed until the parse is complete, but the parse can't be completed because the input routines are waiting for additional tokens to fill the lookahead buffer. When the ANTLRParser class is built with the pre-processor option ZZDEFER_FETCH defined, the fetch of new tokens by consume() is deferred until LA(i) or LT(i) is called. To test whether this option has been built into the ANTLRParser class use "isDeferFetchEnabled()". Using the -gd trace option with the default tracein() and traceout() routines will defeat the effort to defer the fetch because the trace routines print out information about the lookahead token at the start of the rule. Because the tracein and traceout routines are virtual it is easy to redefine them in your parser: class MyParser { << virtual void tracein(ANTLRChar * ruleName) { fprintf(stderr,"Entering: %s\n", ruleName); } virtual void traceout(ANTLRChar * ruleName) { fprintf(stderr,"Leaving: %s\n", ruleName); } >> The originals for those routines are pccts/h/AParser.cpp This requires use of the dlg option -i (interactive lexer). This is implemented only for C++ mode. This is experimental. The interaction with guess mode (syntactic predicates)is not known. #215. (Changed in MR19) Addition of reset() to DLGLexerBase There was no obvious way to reset the lexer for reuse. The reset() method now does this. Suggested by David Venditti (07751870267-0001 t-online.de). #214. (Changed in MR19) C mode: Adjust AST stack pointer at exit In C mode the AST stack pointer needs to be reset if there will be multiple calls to the ANTLRx macros. Reported with fix by Paul D. Smith (psmith baynetworks.com). #213. (Changed in MR18) Fatal error with -mrhoistk (k>1 hoisting) When rearranging code I forgot to un-comment a critical line of code that handles hoisting of predicates with k>1 lookahead. This is now fixed. Reported by Reinier van den Born (reinier vnet.ibm.com). #212. (Changed in MR17) Mac related changes by Kenji Tanaka Kenji Tanaka (kentar osa.att.ne.jp) has made a number of changes for Macintosh users. a. The following Macintosh MPW files aid in installing pccts on Mac: pccts/MPW_Read_Me pccts/install68K.mpw pccts/installPPC.mpw pccts/antlr/antlr.r pccts/antlr/antlr68K.make pccts/antlr/antlrPPC.make pccts/dlg/dlg.r pccts/dlg/dlg68K.make pccts/dlg/dlgPPC.make pccts/sorcerer/sor.r pccts/sorcerer/sor68K.make pccts/sorcerer/sorPPC.make They completely replace the previous Mac installation files. b. The most significant is a change in the MAC_FILE_CREATOR symbol in pcctscfg.h: old: #define MAC_FILE_CREATOR 'MMCC' /* Metrowerks C/C++ Text files */ new: #define MAC_FILE_CREATOR 'CWIE' /* Metrowerks C/C++ Text files */ c. Added calls to special_fopen_actions() where necessary. #211. (Changed in MR16a) C++ style comment in dlg This has been fixed. #210. (Changed in MR16a) Sor accepts \r\n, \r, or \n for end-of-line A user requested that Sorcerer be changed to accept other forms of end-of-line. #209. (Changed in MR16) Name of files changed. Old: CHANGES_FROM_1.33 New: CHANGES_FROM_133.txt Old: KNOWN_PROBLEMS New: KNOWN_PROBLEMS.txt #208. (Changed in MR16) Change in use of pccts #include files There were problems with MS DevStudio when mixing Sorcerer and PCCTS in the same source file. The problem is caused by the redefinition of setjmp in the MS header file setjmp.h. In setjmp.h the pre-processor symbol setjmp was redefined to be _setjmp. A later effort to execute #include resulted in an effort to #include <_setjmp.h>. I'm not sure whether this is a bug or a feature. In any case, I decided to fix it by avoiding the use of pre-processor symbols in #include statements altogether. This has the added benefit of making pre-compiled headers work again. I've replaced statements: old: #include PCCTS_SETJMP_H new: #include "pccts_setjmp.h" Where pccts_setjmp.h contains: #ifndef __PCCTS_SETJMP_H__ #define __PCCTS_SETJMP_H__ #ifdef PCCTS_USE_NAMESPACE_STD #include #else #include #endif #endif A similar change has been made for other standard header files required by pccts and sorcerer: stdlib.h, stdarg.h, stdio.h, etc. Reported by Jeff Vincent (JVincent novell.com) and Dale Davis (DalDavis spectrace.com). #207. (Changed in MR16) dlg reports an invalid range for: [\0x00-\0xff] ----------------------------------------------------------------- Note from MR23: This fix does not work. I am investigating why. ----------------------------------------------------------------- dlg will report that this is an invalid range. Diagnosed by Piotr Eljasiak (eljasiak no-spam.zt.gdansk.tpsa.pl): I think this problem is not specific to unsigned chars because dlg reports no error for the range [\0x00-\0xfe]. I've found that information on range is kept in field letter (unsigned char) of Attrib struct. Unfortunately the letter value internally is for some reasons increased by 1, so \0xff is represented here as 0. That's why dlg complains about the range [\0x00-\0xff] in dlg_p.g: if ($$.letter > $2.letter) { error("invalid range ", zzline); } The fix is: if ($$.letter > $2.letter && 255 != $$2.letter) { error("invalid range ", zzline); } #206. (Changed in MR16) Free zzFAILtext in ANTLRParser destructor The ANTLRParser destructor now frees zzFAILtext. Problem and fix reported by Manfred Kogler (km cast.uni-linz.ac.at). #205. (Changed in MR16) DLGStringReset argument now const Changed: void DLGStringReset(DLGChar *s) {...} To: void DLGStringReset(const DLGChar *s) {...} Suggested by Dale Davis (daldavis spectrace.com) #204. (Changed in MR15a) Change __WATCOM__ to __WATCOMC__ in pcctscfg.h Reported by Oleg Dashevskii (olegdash my-dejanews.com). #203. (Changed in MR15) Addition of sorcerer to distribution kit I have finally caved in to popular demand. The pccts 1.33mr15 kit will include sorcerer. The separate sorcerer kit will be discontinued. #202. (Changed) in MR15) Organization of MS Dev Studio Projects in Kit Previously there was one workspace that contained projects for all three parts of pccts: antlr, dlg, and sorcerer. Now each part (and directory) has its own workspace/project and there is an additional workspace/project to build a library from the .cpp files in the pccts/h directory. The library build will create pccts_debug.lib or pccts_release.lib according to the configuration selected. If you don't want to build pccts 1.33MR15 you can download a ready-to-run kit for win32 from http://www.polhode.com/win32.zip. The ready-to-run for win32 includes executables, a pre-built static library for the .cpp files in the pccts/h directory, and a sample application You will need to define the environment variable PCCTS to point to the root of the pccts directory hierarchy. #201. (Changed in MR15) Several fixes by K.J. Cummings (cummings peritus.com) Generation of SETJMP rather than SETJMP_H in gen.c. (Sor B19) Declaration of ref_vars_inits for ref_var_inits in pccts/sorcerer/sorcerer.h. #200. (Changed in MR15) Remove operator=() in AToken.h User reported that WatCom couldn't handle use of explicit operator =(). Replace with equivalent using cast operator. #199. (Changed in MR15) Don't allow use of empty #tokclass Change antlr.g to disallow empty #tokclass sets. Reported by Manfred Kogler (km cast.uni-linz.ac.at). #198. Revised ANSI C grammar due to efforts by Manuel Kessler Manuel Kessler (mlkessler cip.physik.uni-wuerzburg.de) Allow trailing ... in function parameter lists. Add bit fields. Allow old-style function declarations. Support cv-qualified pointers. Better checking of combinations of type specifiers. Release of memory for local symbols on scope exit. Allow input file name on command line as well as by redirection. and other miscellaneous tweaks. This is not part of the pccts distribution kit. It must be downloaded separately from: http://www.polhode.com/ansi_mr15.zip #197. (Changed in MR14) Resetting the lookahead buffer of the parser Explanation and fix by Sinan Karasu (sinan.karasu boeing.com) Consider the code used to prime the lookahead buffer LA(i) of the parser when init() is called: void ANTLRParser:: prime_lookahead() { int i; for(i=1;i<=LLk; i++) consume(); dirty=0; //lap = 0; // MR14 - Sinan Karasu (sinan.karusu boeing.com) //labase = 0; // MR14 labase=lap; // MR14 } When the parser is instantiated, lap=0,labase=0 is set. The "for" loop runs LLk times. In consume(), lap = lap +1 (mod LLk) is computed. Therefore, lap(before the loop) == lap (after the loop). Now the only problem comes in when one does an init() of the parser after an Eof has been seen. At that time, lap could be non zero. Assume it was lap==1. Now we do a prime_lookahead(). If LLk is 2, then consume() { NLA = inputTokens->getToken()->getType(); dirty--; lap = (lap+1)&(LLk-1); } or expanding NLA, token_type[lap&(LLk-1)]) = inputTokens->getToken()->getType(); dirty--; lap = (lap+1)&(LLk-1); so now we prime locations 1 and 2. In prime_lookahead it used to set lap=0 and labase=0. Now, the next token will be read from location 0, NOT 1 as it should have been. This was never caught before, because if a parser is just instantiated, then lap and labase are 0, the offending assignment lines are basically no-ops, since the for loop wraps around back to 0. #196. (Changed in MR14) Problems with "(alpha)? beta" guess Consider the following syntactic predicate in a grammar with 2 tokens of lookahead (k=2 or ck=2): rule : ( alpha )? beta ; alpha : S t ; t : T U | T ; beta : S t Z ; When antlr computes the prediction expression with one token of lookahead for alts 1 and 2 of rule t it finds an ambiguity. Because the grammar has a lookahead of 2 it tries to compute two tokens of lookahead for alts 1 and 2 of t. Alt 1 clearly has a lookahead of (T U). Alt 2 is one token long so antlr tries to compute the follow set of alt 2, which means finding the things which can follow rule t in the context of (alpha)?. This cannot be computed, because alpha is only part of a rule, and antlr can't tell what part of beta is matched by alpha and what part remains to be matched. Thus it impossible for antlr to properly determine the follow set of rule t. Prior to 1.33MR14, the follow of (alpha)? was computed as FIRST(beta) as a result of the internal representation of guess blocks. With MR14 the follow set will be the empty set for that context. Normally, one expects a rule appearing in a guess block to also appear elsewhere. When the follow context for this other use is "ored" with the empty set, the context from the other use results, and a reasonable follow context results. However if there is *no* other use of the rule, or it is used in a different manner then the follow context will be inaccurate - it was inaccurate even before MR14, but it will be inaccurate in a different way. For the example given earlier, a reasonable way to rewrite the grammar: rule : ( alpha )? beta alpha : S t ; t : T U | T ; beta : alpha Z ; If there are no other uses of the rule appearing in the guess block it will generate a test for EOF - a workaround for representing a null set in the lookahead tests. If you encounter such a problem you can use the -alpha option to get additional information: line 2: error: not possible to compute follow set for alpha in an "(alpha)? beta" block. With the antlr -alpha command line option the following information is inserted into the generated file: #if 0 Trace of references leading to attempt to compute the follow set of alpha in an "(alpha)? beta" block. It is not possible for antlr to compute this follow set because it is not known what part of beta has already been matched by alpha and what part remains to be matched. Rules which make use of the incorrect follow set will also be incorrect 1 #token T alpha/2 line 7 brief.g 2 end alpha alpha/3 line 8 brief.g 2 end (...)? block at start/1 line 2 brief.g #endif At the moment, with the -alpha option selected the program marks any rules which appear in the trace back chain (above) as rules with possible problems computing follow set. Reported by Greg Knapen (gregory.knapen bell.ca). #195. (Changed in MR14) #line directive not at column 1 Under certain circunstances a predicate test could generate a #line directive which was not at column 1. Reported with fix by David Kågedal (davidk lysator.liu.se) (http://www.lysator.liu.se/~davidk/). #194. (Changed in MR14) (C Mode only) Demand lookahead with #tokclass In C mode with the demand lookahead option there is a bug in the code which handles matches for #tokclass (zzsetmatch and zzsetmatch_wsig). The bug causes the lookahead pointer to get out of synchronization with the current token pointer. The problem was reported with a fix by Ger Hobbelt (hobbelt axa.nl). #193. (Changed in MR14) Use of PCCTS_USE_NAMESPACE_STD The pcctscfg.h now contains the following definitions: #ifdef PCCTS_USE_NAMESPACE_STD #define PCCTS_STDIO_H #define PCCTS_STDLIB_H #define PCCTS_STDARG_H #define PCCTS_SETJMP_H #define PCCTS_STRING_H #define PCCTS_ASSERT_H #define PCCTS_ISTREAM_H #define PCCTS_IOSTREAM_H #define PCCTS_NAMESPACE_STD namespace std {}; using namespace std; #else #define PCCTS_STDIO_H #define PCCTS_STDLIB_H #define PCCTS_STDARG_H #define PCCTS_SETJMP_H #define PCCTS_STRING_H #define PCCTS_ASSERT_H #define PCCTS_ISTREAM_H #define PCCTS_IOSTREAM_H #define PCCTS_NAMESPACE_STD #endif The runtime support in pccts/h uses these pre-processor symbols consistently. Also, antlr and dlg have been changed to generate code which uses these pre-processor symbols rather than having the names of the #include files hard-coded in the generated code. This required the addition of "#include pcctscfg.h" to a number of files in pccts/h. It appears that this sometimes causes problems for MSVC 5 in combination with the "automatic" option for pre-compiled headers. In such cases disable the "automatic" pre-compiled headers option. Suggested by Hubert Holin (Hubert.Holin Bigfoot.com). #192. (Changed in MR14) Change setText() to accept "const ANTLRChar *" Changed ANTLRToken::setText(ANTLRChar *) to setText(const ANTLRChar *). This allows literal strings to be used to initialize tokens. Since the usual token implementation (ANTLRCommonToken) makes a copy of the input string, this was an unnecessary limitation. Suggested by Bob McWhirter (bob netwrench.com). #191. (Changed in MR14) HP/UX aCC compiler compatibility problem Needed to explicitly declare zzINF_DEF_TOKEN_BUFFER_SIZE and zzINF_BUFFER_TOKEN_CHUNK_SIZE as ints in pccts/h/AParser.cpp. Reported by David Cook (dcook bmc.com). #190. (Changed in MR14) IBM OS/2 CSet compiler compatibility problem Name conflict with "_cs" in pccts/h/ATokenBuffer.cpp Reported by David Cook (dcook bmc.com). #189. (Changed in MR14) -gxt switch in C mode The -gxt switch in C mode didn't work because of incorrect initialization. Reported by Sinan Karasu (sinan boeing.com). #188. (Changed in MR14) Added pccts/h/DLG_stream_input.h This is a DLG stream class based on C++ istreams. Contributed by Hubert Holin (Hubert.Holin Bigfoot.com). #187. (Changed in MR14) Rename config.h to pcctscfg.h The PCCTS configuration file has been renamed from config.h to pcctscfg.h. The problem with the original name is that it led to name collisions when pccts parsers were combined with other software. All of the runtime support routines in pccts/h/* have been changed to use the new name. Existing software can continue to use pccts/h/config.h. The contents of pccts/h/config.h is now just "#include "pcctscfg.h". I don't have a record of the user who suggested this. #186. (Changed in MR14) Pre-processor symbol DllExportPCCTS class modifier Classes in the C++ runtime support routines are now declared: class DllExportPCCTS className .... By default, the pre-processor symbol is defined as the empty string. This if for use by MSVC++ users to create DLL classes. Suggested by Manfred Kogler (km cast.uni-linz.ac.at). #185. (Changed in MR14) Option to not use PCCTS_AST base class for ASTBase Normally, the ASTBase class is derived from PCCTS_AST which contains functions useful to Sorcerer. If these are not necessary then the user can define the pre-processor symbol "PCCTS_NOT_USING_SOR" which will cause the ASTBase class to replace references to PCCTS_AST with references to ASTBase where necessary. The class ASTDoublyLinkedBase will contain a pure virtual function shallowCopy() that was formerly defined in class PCCTS_AST. Suggested by Bob McWhirter (bob netwrench.com). #184. (Changed in MR14) Grammars with no tokens generate invalid tokens.h Reported by Hubert Holin (Hubert.Holin bigfoot.com). #183. (Changed in MR14) -f to specify file with names of grammar files In DEC/VMS it is difficult to specify very long command lines. The -f option allows one to place the names of the grammar files in a data file in order to bypass limitations of the DEC/VMS command language interpreter. Addition supplied by Bernard Giroud (b_giroud decus.ch). #182. (Changed in MR14) Output directory option for DEC/VMS Fix some problems with the -o option under DEC/VMS. Fix supplied by Bernard Giroud (b_giroud decus.ch). #181. (Changed in MR14) Allow chars > 127 in DLGStringInput::nextChar() Changed DLGStringInput to cast the character using (unsigned char) so that languages with character codes greater than 127 work without changes. Suggested by Manfred Kogler (km cast.uni-linz.ac.at). #180. (Added in MR14) ANTLRParser::getEofToken() Added "ANTLRToken ANTLRParser::getEofToken() const" to match the setEofToken routine. Requested by Manfred Kogler (km cast.uni-linz.ac.at). #179. (Fixed in MR14) Memory leak for BufFileInput subclass of DLGInputStream The BufFileInput class described in Item #142 neglected to release the allocated buffer when an instance was destroyed. Reported by Manfred Kogler (km cast.uni-linz.ac.at). #178. (Fixed in MR14) Bug in "(alpha)? beta" guess blocks first sets In 1.33 vanilla, and all maintenance releases prior to MR14 there is a bug in the handling of guess blocks which use the "long" form: (alpha)? beta inside a (...)*, (...)+, or {...} block. This problem does *not* apply to the case where beta is omitted or when the syntactic predicate is on the leading edge of an alternative. The problem is that both alpha and beta are stored in the syntax diagram, and that some analysis routines would fail to skip the alpha portion when it was not on the leading edge. Consider the following grammar with -ck 2: r : ( (A)? B )* C D | A B /* forces -ck 2 computation for old antlr */ /* reports ambig for alts 1 & 2 */ | B C /* forces -ck 2 computation for new antlr */ /* reports ambig for alts 1 & 3 */ ; The prediction expression for the first alternative should be LA(1)={B C} LA(2)={B C D}, but previous versions of antlr would compute the prediction expression as LA(1)={A C} LA(2)={B D} Reported by Arpad Beszedes (beszedes inf.u-szeged.hu) who provided a very clear example of the problem and identified the probable cause. #177. (Changed in MR14) #tokdefs and #token with regular expression In MR13 the change described by Item #162 caused an existing feature of antlr to fail. Prior to the change it was possible to give regular expression definitions and actions to tokens which were defined via the #tokdefs directive. This now works again. Reported by Manfred Kogler (km cast.uni-linz.ac.at). #176. (Changed in MR14) Support for #line in antlr source code Note: this was implemented by Arpad Beszedes (beszedes inf.u-szeged.hu). In 1.33MR14 it is possible for a pre-processor to generate #line directives in the antlr source and have those line numbers and file names used in antlr error messages and in the #line directives generated by antlr. The #line directive may appear in the following forms: #line ll "sss" xx xx ... where ll represents a line number, "sss" represents the name of a file enclosed in quotation marks, and xxx are arbitrary integers. The following form (without "line") is not supported at the moment: # ll "sss" xx xx ... The result: zzline is replaced with ll from the # or #line directive FileStr[CurFile] is updated with the contents of the string (if any) following the line number Note ---- The file-name string following the line number can be a complete name with a directory-path. Antlr generates the output files from the input file name (by replacing the extension from the file-name with .c or .cpp). If the input file (or the file-name from the line-info) contains a path: "../grammar.g" the generated source code will be placed in "../grammar.cpp" (i.e. in the parent directory). This is inconvenient in some cases (even the -o switch can not be used) so the path information is removed from the #line directive. Thus, if the line-info was #line 2 "../grammar.g" then the current file-name will become "grammar.g" In this way, the generated source code according to the grammar file will always be in the current directory, except when the -o switch is used. #175. (Changed in MR14) Bug when guess block appears at start of (...)* In 1.33 vanilla and all maintenance releases prior to 1.33MR14 there is a bug when a guess block appears at the start of a (...)+. Consider the following k=1 (ck=1) grammar: rule : ( (STAR)? ZIP )* ID ; Prior to 1.33MR14, the generated code resembled: ... zzGUESS_BLOCK while ( 1 ) { if ( ! LA(1)==STAR) break; zzGUESS if ( !zzrv ) { zzmatch(STAR); zzCONSUME; zzGUESS_DONE zzmatch(ZIP); zzCONSUME; ... Note that the routine uses STAR for the prediction expression rather than ZIP. With 1.33MR14 the generated code resembles: ... while ( 1 ) { if ( ! LA(1)==ZIP) break; ... This problem existed only with (...)* blocks and was caused by the slightly more complicated graph which represents (...)* blocks. This caused the analysis routine to compute the first set for the alpha part of the "(alpha)? beta" rather than the beta part. Both (...)+ and {...} blocks handled the guess block correctly. Reported by Arpad Beszedes (beszedes inf.u-szeged.hu) who provided a very clear example of the problem and identified the probable cause. #174. (Changed in MR14) Bug when action precedes syntactic predicate In 1.33 vanilla, and all maintenance releases prior to MR14, there was a bug when a syntactic predicate was immediately preceded by an action. Consider the following -ck 2 grammar: rule : <> (alpha)? beta C | A B ; alpha : A ; beta : A B; Prior to MR14, the code generated for the first alternative resembled: ... zzGUESS if ( !zzrv && LA(1)==A && LA(2)==A) { alpha(); zzGUESS_DONE beta(); zzmatch(C); zzCONSUME; } else { ... The prediction expression (i.e. LA(1)==A && LA(2)==A) is clearly wrong because LA(2) should be matched to B (first[2] of beta is {B}). With 1.33MR14 the prediction expression is: ... if ( !zzrv && LA(1)==A && LA(2)==B) { alpha(); zzGUESS_DONE beta(); zzmatch(C); zzCONSUME; } else { ... This will only affect users in which alpha is shorter than than max(k,ck) and there is an action immediately preceding the syntactic predicate. This problem was reported by reported by Arpad Beszedes (beszedes inf.u-szeged.hu) who provided a very clear example of the problem and identified the presence of the init-action as the likely culprit. #173. (Changed in MR13a) -glms for Microsoft style filenames with -gl With the -gl option antlr generates #line directives using the exact name of the input files specified on the command line. An oddity of the Microsoft C and C++ compilers is that they don't accept file names in #line directives containing "\" even though these are names from the native file system. With -glms option, the "\" in file names appearing in #line directives is replaced with a "/" in order to conform to Microsoft compiler requirements. Reported by Erwin Achermann (erwin.achermann switzerland.org). #172. (Changed in MR13) \r\n in antlr source counted as one line Some MS software uses \r\n to indicate a new line. Antlr now recognizes this in counting lines. Reported by Edward L. Hepler (elh ece.vill.edu). #171. (Changed in MR13) #tokclass L..U now allowed The following is now allowed: #tokclass ABC { A..B C } Reported by Dave Watola (dwatola amtsun.jpl.nasa.gov) #170. (Changed in MR13) Suppression for predicates with lookahead depth >1 In MR12 the capability for suppression of predicates with lookahead depth=1 was introduced. With MR13 this had been extended to predicates with lookahead depth > 1 and released for use by users on an experimental basis. Consider the following grammar with -ck 2 and the predicate in rule "a" with depth 2: r1 : (ab)* "@" ; ab : a | b ; a : (A B)? => <>? A B C ; b : A B C ; Normally, the predicate would be hoisted into rule r1 in order to determine whether to call rule "ab". However it should *not* be hoisted because, even if p is false, there is a valid alternative in rule b. With "-mrhoistk on" the predicate will be suppressed. If "-info p" command line option is present the following information will appear in the generated code: while ( (LA(1)==A) #if 0 Part (or all) of predicate with depth > 1 suppressed by alternative without predicate pred << p(LATEXT(2))>>? depth=k=2 ("=>" guard) rule a line 8 t1.g tree context: (root = A B ) The token sequence which is suppressed: ( A B ) The sequence of references which generate that sequence of tokens: 1 to ab r1/1 line 1 t1.g 2 ab ab/1 line 4 t1.g 3 to b ab/2 line 5 t1.g 4 b b/1 line 11 t1.g 5 #token A b/1 line 11 t1.g 6 #token B b/1 line 11 t1.g #endif A slightly more complicated example: r1 : (ab)* "@" ; ab : a | b ; a : (A B)? => <>? (A B | D E) ; b : <>? D E ; In this case, the sequence (D E) in rule "a" which lies behind the guard is used to suppress the predicate with context (D E) in rule b. while ( (LA(1)==A || LA(1)==D) #if 0 Part (or all) of predicate with depth > 1 suppressed by alternative without predicate pred << q(LATEXT(2))>>? depth=k=2 rule b line 11 t2.g tree context: (root = D E ) The token sequence which is suppressed: ( D E ) The sequence of references which generate that sequence of tokens: 1 to ab r1/1 line 1 t2.g 2 ab ab/1 line 4 t2.g 3 to a ab/1 line 4 t2.g 4 a a/1 line 8 t2.g 5 #token D a/1 line 8 t2.g 6 #token E a/1 line 8 t2.g #endif && #if 0 pred << p(LATEXT(2))>>? depth=k=2 ("=>" guard) rule a line 8 t2.g tree context: (root = A B ) #endif (! ( LA(1)==A && LA(2)==B ) || p(LATEXT(2)) ) { ab(); ... #169. (Changed in MR13) Predicate test optimization for depth=1 predicates When the MR12 generated a test of a predicate which had depth 1 it would use the depth >1 routines, resulting in correct but inefficient behavior. In MR13, a bit test is used. #168. (Changed in MR13) Token expressions in context guards The token expressions appearing in context guards such as: (A B)? => <>? someRule are computed during an early phase of antlr processing. As a result, prior to MR13, complex expressions such as: ~B L..U ~L..U TokClassName ~TokClassName were not computed properly. This resulted in incorrect context being computed for such expressions. In MR13 these context guards are verified for proper semantics in the initial phase and then re-evaluated after complex token expressions have been computed in order to produce the correct behavior. Reported by Arpad Beszedes (beszedes inf.u-szeged.hu). #167. (Changed in MR13) ~L..U Prior to MR13, the complement of a token range was not properly computed. #166. (Changed in MR13) token expression L..U The token U was represented as an unsigned char, restricting the use of L..U to cases where U was assigned a token number less than 256. This is corrected in MR13. #165. (Changed in MR13) option -newAST To create ASTs from an ANTLRTokenPtr antlr usually calls "new AST(ANTLRTokenPtr)". This option generates a call to "newAST(ANTLRTokenPtr)" instead. This allows a user to define a parser member function to create an AST object. Similar changes for ASTBase::tmake and ASTBase::link were not thought necessary since they do not create AST objects, only use existing ones. #164. (Changed in MR13) Unused variable _astp For many compilations, we have lived with warnings about the unused variable _astp. It turns out that this varible can *never* be used because the code which references it was commented out. This investigation was sparked by a note from Erwin Achermann (erwin.achermann switzerland.org). #163. (Changed in MR13) Incorrect makefiles for testcpp examples All the examples in pccts/testcpp/* had incorrect definitions in the makefiles for the symbol "CCC". Instead of CCC=CC they had CC=$(CCC). There was an additional problem in testcpp/1/test.g due to the change in ANTLRToken::getText() to a const member function (Item #137). Reported by Maurice Mass (maas cuci.nl). #162. (Changed in MR13) Combining #token with #tokdefs When it became possible to change the print-name of a #token (Item #148) it became useful to give a #token statement whose only purpose was to giving a print name to the #token. Prior to this change this could not be combined with the #tokdefs feature. #161. (Changed in MR13) Switch -gxt inhibits generation of tokens.h #160. (Changed in MR13) Omissions in list of names for remap.h When a user selects the -gp option antlr creates a list of macros in remap.h to rename some of the standard antlr routines from zzXXX to userprefixXXX. There were number of omissions from the remap.h name list related to the new trace facility. This was reported, along with a fix, by Bernie Solomon (bernard ug.eds.com). #159. (Changed in MR13) Violations of classic C rules There were a number of violations of classic C style in the distribution kit. This was reported, along with fixes, by Bernie Solomon (bernard ug.eds.com). #158. (Changed in MR13) #header causes problem for pre-processors A user who runs the C pre-processor on antlr source suggested that another syntax be allowed. With MR13 such directives such as #header, #pragma, etc. may be written as "\#header", "\#pragma", etc. For escaping pre-processor directives inside a #header use something like the following: \#header << \#include >> #157. (Fixed in MR13) empty error sets for rules with infinite recursion When the first set for a rule cannot be computed due to infinite left recursion and it is the only alternative for a block then the error set for the block would be empty. This would result in a fatal error. Reported by Darin Creason (creason genedax.com) #156. (Changed in MR13) DLGLexerBase::getToken() now public #155. (Changed in MR13) Context behind predicates can suppress With -mrhoist enabled the context behind a guarded predicate can be used to suppress other predicates. Consider the following grammar: r0 : (r1)+; r1 : rp | rq ; rp : <

>? B ; rq : (A)? => <>? (A|B); In earlier versions both predicates "p" and "q" would be hoisted into rule r0. With MR12c predicate p is suppressed because the context which follows predicate q includes "B" which can "cover" predicate "p". In other words, in trying to decide in r0 whether to call r1, it doesn't really matter whether p is false or true because, either way, there is a valid choice within r1. #154. (Changed in MR13) Making hoist suppression explicit using <> A common error, even among experienced pccts users, is to code an init-action to inhibit hoisting rather than a leading action. An init-action does not inhibit hoisting. This was coded: rule1 : <<;>> rule2 This is what was meant: rule1 : <<;>> <<;>> rule2 With MR13, the user can code: rule1 : <<;>> <> rule2 The following will give an error message: rule1 : <> rule2 If the <> appears as an init-action rather than a leading action an error message is issued. The meaning of an init-action containing "nohoist" is unclear: does it apply to just one alternative or to all alternatives ? ------------------------------------------------------- Note: Items #153 to #1 are now in a separate file named CHANGES_FROM_133_BEFORE_MR13.txt ------------------------------------------------------- gtkwave-3.3.86/contrib/pccts/NOTES.msvc0000664000175000017500000001572213166335473017151 0ustar bybellbybell Microsoft Visual C Stuff [Tom Moog 2-Oct-98 Users of Microsoft Visual C++ should download a separate ready-to-run zip file from my web site. It contains binaries, static library, and a sample project. ] [ Two notes added by Tom Moog 23-Sep-97. I believe the *.dsp and *.mak files that were once at the end of this file are now obsolete. The following MSVC .dsp and .mak files for pccts and sorcerer were contributed by Stanislaw Bochnak (S.Bochnak@microtool.com.pl) and Jeff Vincent (jvincent@novell.com) PCCTS Distribution Kit ---------------------- pccts/antlr/AntlrMSVC50.dsp pccts/antlr/AntlrMSVC50.mak pccts/dlg/DlgMSVC50.dsp pccts/dlg/DlgMSVC50.mak pccts/support/genmk/watgenmk.mak pccts/support/msvc.dsp Sorcerer Distribution Kit ------------------------- pccts/sorcerer/SorcererMSVC50.dsp pccts/sorcerer/SorcererMSVC50.mak pccts/sorcerer/lib/msvc.dsp I do not have an MS based computer. If you discover problems please report them so as to save trouble for others in the future. ] [ Modified by Terence Parr (September 1995) to change .C to .cpp ] [ This file contains notes on MSVC for Windows NT console execs by Dave Seidel and an explanation of flags etc.. by John Hall; good luck, Terence ] =============================================================================== Date: Sat, 31 Dec 1994 11:40:36 -0500 (EST) From: David Seidel <75342.2034@compuserve.com> I've succesfully build 1.31b3 with djgpp for DOS and MSVC 2.0 for Windows NT. The only (minor) problem I had was that GNU make (version 3.71, in the djgpp port) complained about "multiple targets" in both the antlr and dlg makefiles. I got around the error by, in each makefile, commenting out the $(SRC) dependency, for example: antlr: $(OBJ) #$(SRC) I don't know why this is happenning, since you haven't changed that part of the makefile at all, and I think this used to work ok... Here are the makefiles I built from within the MSVC 2.0 environment for antlr and dlg and Windows NT console executables. Please feel free to pass them on. Of course, as soon as 1.31 "goes gold", I will send you nice new binaries. I'm not going to bother to keep doing both Borland and djgpp for DOS however. Instead, I'll just keep the djgpp version up to date and also provide WinNT binaries. Dave =============================================================================== How to port PCCTS 1.10 (and 1.32 hopefully) to Visual C++ By John Hall Here is how to compile an ANTLR grammar in Visual C++. These steps describe how to have your ANTLR grammar parse the input file the user selects when they choose File Open in your Windows application. (Even if you aren't using Visual C++, the steps should be portable enough to other compilers.) * Make sure that ANTLR and DLG generate ANSI code (use the -ga switch). * Set the following compiler flags in Visual C++ (these are in the Memory Model category of the compiler options in the Project Options menu): FLAG MEANING ==== ============================================================== /AL Large memory model (multiple data segments; data items must be smaller than 64K). /Gtn Allocates all items whose size is greater than or equal to n in a new data segment. (I let n be 256: /Gt256.) /Gx- All references to data items are done with far addressing in case they are placed in a far segment. * Add the following member variable to the attributes section of your derived CDocument class (you will need to make sure you also include stdio.h): FILE *fp; * Add the following method to your derived CDocument class: BOOL CAppDoc::OnOpenDocument(const char* pszPathName) { // Call CDocument's OnOpenDocument to do housekeeping for us // DON'T add anything to the loading section of Serialize if (!CDocument::OnOpenDocument(pszPathName)) return FALSE; // Open input file if ((fp = fopen(pszPathName, "r")) == NULL) return FALSE; // Parse input file ANTLR(start(), fp); // Close input file fclose(fp); return TRUE; } (Note: additional code may be necessary, depending on your parser. For example, if your parser uses PCCTS's symbol table library, you will need to insert calls to zzs_init and zzs_done.) * Compile the generated C files as C++ files. (I renamed the files to have a .CPP extension to fool Visual C++ into thinking they were C++ files. One might also use the /Tp switch, but that switch requires you separately include the filename.) [I used this step as an easy out for all the external linking errors I was getting that I couldn't fix by declaring things extern "C".] * Make sure the __STDC__ portion of the generated files gets compiled. (Either define __STDC__ yourself or else change all occurrences of __STDC__ to __cplusplus in the generated files. You can define __STDC__ in the Preprocessor category of the compiler options.) ================================================================ = Note 23-Sep-97: This is probably not necessary any more. = = With 1.33MRxxx the use of __STDC__ was replaced with the = = macro __USE_PROTOS to control the compilation of prototypes. = ================================================================ That last step is important for Visual C++, but may not apply to other compilers. For C++ compilers, whether __STDC__ is defined is implementation dependent (ARM, page 379). Apparently, Visual C++ does not to define it; it also does not support "old style" C function definitions (which is okay, according to page 404 of the ARM). Those two things together caused problems when trying to port the code. When it saw this: #ifdef __STDC__ void globals(AST **_root) #else globals(_root) AST **_root; #endif it skipped the __STDC__ section and tried to process the "old style" function definition, where it choked. When you finally get your parser to compile and link without error, you may get General Protection Fault errors at run time. The problem I had was that a NULL was passed to a variable argument function without an explicit cast. The function grabbed a pointer (32-bits) off the stack using va_arg, but the NULL was passed silently as the integer 0 (16 bits), making the resulting pointer was invalid. (This was in PCCTS's sample C parser.) There is one other thing I might suggest to help you avoid a run-time error. Make sure you redefine the default error reporting function, zzsyn. To do this, put "#define USER_ZZSYN" in your #header section and put your own zzsyn somewhere. You can then pop up a MessageBox or print the error to some output window. =============================================================================== gtkwave-3.3.86/contrib/pccts/RIGHTS0000664000175000017500000000216313166335473016305 0ustar bybellbybell SOFTWARE RIGHTS We reserve no LEGAL rights to the Purdue Compiler Construction Tool Set (PCCTS) -- PCCTS is in the public domain. An individual or company may do whatever they wish with source code distributed with PCCTS or the code generated by PCCTS, including the incorporation of PCCTS, or its output, into commerical software. We encourage users to develop software with PCCTS. However, we do ask that credit is given to us for developing PCCTS. By "credit", we mean that if you incorporate our source code into one of your programs (commercial product, research project, or otherwise) that you acknowledge this fact somewhere in the documentation, research report, etc... If you like PCCTS and have developed a nice tool with the output, please mention that you developed it using PCCTS. In addition, we ask that this header remain intact in our source code. As long as these guidelines are kept, we expect to continue enhancing this system and expect to make other tools available as they are completed. ANTLR 1.33 Terence Parr Parr Research Corporation with Purdue University and AHPCRC, University of Minnesota 1989-1995 gtkwave-3.3.86/contrib/pccts/install68K.mpw0000664000175000017500000000400313166335473020041 0ustar bybellbybell# # File name install68K.mpw # # Description This script builds 68K version of antlr, dlg and sor. # and install them into Tools folder in your MPW. # They have commando interfaces. # # Installation Set Directory to the directory containing this file. # Enter "install68K.mpw" and press enter key. # # Requirements SC compiler # http://developer.apple.com/dev/tools/mpw-tools/compilers/index.html # # Author Kenji Tanaka (kentar@osa.att.ne.jp) # http://www.geocities.com/SiliconValley/Platform/5502/pccts # Created 06/16/98 # Modified 12/14/98 # Echo "# `Date -t` ----- Building 68K version of PCCTS tools." # Make 'Macintosh' folders to hold object files. Echo "# `Date -t` ----- Making Object File Folders." If (!`exists :dlg:Obj:`) NewFolder :dlg:Obj: End If (!`exists :antlr:Obj:`) NewFolder :antlr:Obj: End If (!`exists :sorcerer:Obj:`) NewFolder :sorcerer:Obj: End Echo "# `Date -t` ----- Done." Echo "#" # DLG build commands Echo "# `Date -t` ----- Building DLG." Echo "# `Date -t` ----- Analyzing dependencies." Directory :dlg: Begin Echo "Set Echo 1" Make Install -f dlg68K.make End > dlg.makeout Echo "# `Date -t` ----- Executing build commands." dlg.makeout Delete dlg.makeout Delete -y Obj Echo "# `Date -t` ----- Done." Echo "#" Directory :: # ANTLR build commands Echo "# `Date -t` ----- Building ANTLR." Echo "# `Date -t` ----- Analyzing dependencies." Directory :antlr: Begin Echo "Set Echo 1" Make Install -f antlr68K.make End > antlr.makeout antlr.makeout Delete antlr.makeout Delete -y Obj Echo "# `Date -t` ----- Done." Echo "#" Directory :: # SORCERER build commands Echo "# `Date -t` ----- Building SORCERER." Echo "# `Date -t` ----- Analyzing dependencies." Directory :sorcerer: Begin Echo "Set Echo 1" Make Install -f sor68K.make End > sorcerer.makeout sorcerer.makeout Delete sorcerer.makeout Delete -y Obj Echo "# `Date -t` ----- Done." Echo "#" Directory :: # Done Echo "# `Date -t` ----- Done Building 68K version of PCCTS tools." gtkwave-3.3.86/contrib/pccts/CHANGES_SUMMARY.txt0000664000175000017500000023521213166335473020413 0ustar bybellbybell====================================================================== CHANGES_SUMMARY.TXT A QUICK overview of changes from 1.33 in reverse order A summary of additions rather than bug fixes and minor code changes. Numbers refer to items in CHANGES_FROM_133*.TXT which may contain additional information. DISCLAIMER The software and these notes are provided "as is". They may include typographical or technical errors and their authors disclaims all liability of any kind or nature for damages due to error, fault, defect, or deficiency regardless of cause. All warranties of any kind, either express or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. ====================================================================== #258. You can specify a user-defined base class for your parser The base class must constructor must have a signature similar to that of ANTLRParser. #253. Generation of block preamble (-preamble and -preamble_first) The antlr option -preamble causes antlr to insert the code BLOCK_PREAMBLE at the start of each rule and block. The antlr option -preamble_first is similar, but inserts the code BLOCK_PREAMBLE_FIRST(PreambleFirst_123) where the symbol PreambleFirst_123 is equivalent to the first set defined by the #FirstSetSymbol described in Item #248. #248. Generate symbol for first set of an alternative rr : #FirstSetSymbol(rr_FirstSet) ( Foo | Bar ) ; #216. Defer token fetch for C++ mode When the ANTLRParser class is built with the pre-processor option ZZDEFER_FETCH defined, the fetch of new tokens by consume() is deferred until LA(i) or LT(i) is called. #215. Use reset() to reset DLGLexerBase #188. Added pccts/h/DLG_stream_input.h #180. Added ANTLRParser::getEofToken() #173. -glms for Microsoft style filenames with -gl #170. Suppression for predicates with lookahead depth >1 Consider the following grammar with -ck 2 and the predicate in rule "a" with depth 2: r1 : (ab)* "@" ; ab : a | b ; a : (A B)? => <>? A B C ; b : A B C ; Normally, the predicate would be hoisted into rule r1 in order to determine whether to call rule "ab". However it should *not* be hoisted because, even if p is false, there is a valid alternative in rule b. With "-mrhoistk on" the predicate will be suppressed. If "-info p" command line option is present the following information will appear in the generated code: while ( (LA(1)==A) #if 0 Part (or all) of predicate with depth > 1 suppressed by alternative without predicate pred << p(LATEXT(2))>>? depth=k=2 ("=>" guard) rule a line 8 t1.g tree context: (root = A B ) The token sequence which is suppressed: ( A B ) The sequence of references which generate that sequence of tokens: 1 to ab r1/1 line 1 t1.g 2 ab ab/1 line 4 t1.g 3 to b ab/2 line 5 t1.g 4 b b/1 line 11 t1.g 5 #token A b/1 line 11 t1.g 6 #token B b/1 line 11 t1.g #endif A slightly more complicated example: r1 : (ab)* "@" ; ab : a | b ; a : (A B)? => <>? (A B | D E) ; b : <>? D E ; In this case, the sequence (D E) in rule "a" which lies behind the guard is used to suppress the predicate with context (D E) in rule b. while ( (LA(1)==A || LA(1)==D) #if 0 Part (or all) of predicate with depth > 1 suppressed by alternative without predicate pred << q(LATEXT(2))>>? depth=k=2 rule b line 11 t2.g tree context: (root = D E ) The token sequence which is suppressed: ( D E ) The sequence of references which generate that sequence of tokens: 1 to ab r1/1 line 1 t2.g 2 ab ab/1 line 4 t2.g 3 to a ab/1 line 4 t2.g 4 a a/1 line 8 t2.g 5 #token D a/1 line 8 t2.g 6 #token E a/1 line 8 t2.g #endif && #if 0 pred << p(LATEXT(2))>>? depth=k=2 ("=>" guard) rule a line 8 t2.g tree context: (root = A B ) #endif (! ( LA(1)==A && LA(2)==B ) || p(LATEXT(2)) ) { ab(); ... #165. (Changed in MR13) option -newAST To create ASTs from an ANTLRTokenPtr antlr usually calls "new AST(ANTLRTokenPtr)". This option generates a call to "newAST(ANTLRTokenPtr)" instead. This allows a user to define a parser member function to create an AST object. #161. (Changed in MR13) Switch -gxt inhibits generation of tokens.h #158. (Changed in MR13) #header causes problem for pre-processors A user who runs the C pre-processor on antlr source suggested that another syntax be allowed. With MR13 such directives such as #header, #pragma, etc. may be written as "\#header", "\#pragma", etc. For escaping pre-processor directives inside a #header use something like the following: \#header << \#include >> #155. (Changed in MR13) Context behind predicates can suppress With -mrhoist enabled the context behind a guarded predicate can be used to suppress other predicates. Consider the following grammar: r0 : (r1)+; r1 : rp | rq ; rp : <

>? B ; rq : (A)? => <>? (A|B); In earlier versions both predicates "p" and "q" would be hoisted into rule r0. With MR12c predicate p is suppressed because the context which follows predicate q includes "B" which can "cover" predicate "p". In other words, in trying to decide in r0 whether to call r1, it doesn't really matter whether p is false or true because, either way, there is a valid choice within r1. #154. (Changed in MR13) Making hoist suppression explicit using <> A common error, even among experienced pccts users, is to code an init-action to inhibit hoisting rather than a leading action. An init-action does not inhibit hoisting. This was coded: rule1 : <<;>> rule2 This is what was meant: rule1 : <<;>> <<;>> rule2 With MR13, the user can code: rule1 : <<;>> <> rule2 The following will give an error message: rule1 : <> rule2 If the <> appears as an init-action rather than a leading action an error message is issued. The meaning of an init-action containing "nohoist" is unclear: does it apply to just one alternative or to all alternatives ? #151a. Addition of ANTLRParser::getLexer(), ANTLRTokenStream::getLexer() You must manually cast the ANTLRTokenStream to your program's lexer class. Because the name of the lexer's class is not fixed. Thus it is impossible to incorporate it into the DLGLexerBase class. #151b.(Changed in MR12) ParserBlackBox member getLexer() #150. (Changed in MR12) syntaxErrCount and lexErrCount now public #149. (Changed in MR12) antlr option -info o (letter o for orphan) If there is more than one rule which is not referenced by any other rule then all such rules are listed. This is useful for alerting one to rules which are not used, but which can still contribute to ambiguity. #148. (Changed in MR11) #token names appearing in zztokens,token_tbl One can write: #token Plus ("+") "\+" #token RP ("(") "\(" #token COM ("comment begin") "/\*" The string in parenthesis will be used in syntax error messages. #146. (Changed in MR11) Option -treport for locating "difficult" alts It can be difficult to determine which alternatives are causing pccts to work hard to resolve an ambiguity. In some cases the ambiguity is successfully resolved after much CPU time so there is no message at all. A rough measure of the amount of work being peformed which is independent of the CPU speed and system load is the number of tnodes created. Using "-info t" gives information about the total number of tnodes created and the peak number of tnodes. Tree Nodes: peak 1300k created 1416k lost 0 It also puts in the generated C or C++ file the number of tnodes created for a rule (at the end of the rule). However this information is not sufficient to locate the alternatives within a rule which are causing the creation of tnodes. Using: antlr -treport 100000 .... causes antlr to list on stdout any alternatives which require the creation of more than 100,000 tnodes, along with the lookahead sets for those alternatives. The following is a trivial case from the ansi.g grammar which shows the format of the report. This report might be of more interest in cases where 1,000,000 tuples were created to resolve the ambiguity. ------------------------------------------------------------------------- There were 0 tuples whose ambiguity could not be resolved by full lookahead There were 157 tnodes created to resolve ambiguity between: Choice 1: statement/2 line 475 file ansi.g Choice 2: statement/3 line 476 file ansi.g Intersection of lookahead[1] sets: IDENTIFIER Intersection of lookahead[2] sets: LPARENTHESIS COLON AMPERSAND MINUS STAR PLUSPLUS MINUSMINUS ONESCOMPLEMENT NOT SIZEOF OCTALINT DECIMALINT HEXADECIMALINT FLOATONE FLOATTWO IDENTIFIER STRING CHARACTER ------------------------------------------------------------------------- #143. (Changed in MR11) Optional ";" at end of #token statement Fixes problem of: #token X "x" << parser action >> Being confused with: #token X "x" <> #142. (Changed in MR11) class BufFileInput subclass of DLGInputStream Alexey Demakov (demakov@kazbek.ispras.ru) has supplied class BufFileInput derived from DLGInputStream which provides a function lookahead(char *string) to test characters in the input stream more than one character ahead. The class is located in pccts/h/BufFileInput.* of the kit. #140. #pred to define predicates +---------------------------------------------------+ | Note: Assume "-prc on" for this entire discussion | +---------------------------------------------------+ A problem with predicates is that each one is regarded as unique and capable of disambiguating cases where two alternatives have identical lookahead. For example: rule : <>? A | <>? A ; will not cause any error messages or warnings to be issued by earlier versions of pccts. To compare the text of the predicates is an incomplete solution. In 1.33MR11 I am introducing the #pred statement in order to solve some problems with predicates. The #pred statement allows one to give a symbolic name to a "predicate literal" or a "predicate expression" in order to refer to it in other predicate expressions or in the rules of the grammar. The predicate literal associated with a predicate symbol is C or C++ code which can be used to test the condition. A predicate expression defines a predicate symbol in terms of other predicate symbols using "!", "&&", and "||". A predicate symbol can be defined in terms of a predicate literal, a predicate expression, or *both*. When a predicate symbol is defined with both a predicate literal and a predicate expression, the predicate literal is used to generate code, but the predicate expression is used to check for two alternatives with identical predicates in both alternatives. Here are some examples of #pred statements: #pred IsLabel <>? #pred IsLocalVar <>? #pred IsGlobalVar <>? #pred IsVar <>? IsLocalVar || IsGlobalVar #pred IsScoped <>? IsLabel || IsLocalVar I hope that the use of EBNF notation to describe the syntax of the #pred statement will not cause problems for my readers (joke). predStatement : "#pred" CapitalizedName ( "<>?" | "<>?" predOrExpr | predOrExpr ) ; predOrExpr : predAndExpr ( "||" predAndExpr ) * ; predAndExpr : predPrimary ( "&&" predPrimary ) * ; predPrimary : CapitalizedName | "!" predPrimary | "(" predOrExpr ")" ; What is the purpose of this nonsense ? To understand how predicate symbols help, you need to realize that predicate symbols are used in two different ways with two different goals. a. Allow simplification of predicates which have been combined during predicate hoisting. b. Allow recognition of identical predicates which can't disambiguate alternatives with common lookahead. First we will discuss goal (a). Consider the following rule: rule0: rule1 | ID | ... ; rule1: rule2 | rule3 ; rule2: <>? ID ; rule3: <>? ID ; When the predicates in rule2 and rule3 are combined by hoisting to create a prediction expression for rule1 the result is: if ( LA(1)==ID && ( isX(LATEXT(1) || !isX(LATEXT(1) ) ) { rule1(); ... This is inefficient, but more importantly, can lead to false assumptions that the predicate expression distinguishes the rule1 alternative with some other alternative with lookahead ID. In MR11 one can write: #pred IsX <>? ... rule2: <>? ID ; rule3: <>? ID ; During hoisting MR11 recognizes this as a special case and eliminates the predicates. The result is a prediction expression like the following: if ( LA(1)==ID ) { rule1(); ... Please note that the following cases which appear to be equivalent *cannot* be simplified by MR11 during hoisting because the hoisting logic only checks for a "!" in the predicate action, not in the predicate expression for a predicate symbol. *Not* equivalent and is not simplified during hoisting: #pred IsX <>? #pred NotX <>? ... rule2: <>? ID ; rule3: <>? ID ; *Not* equivalent and is not simplified during hoisting: #pred IsX <>? #pred NotX !IsX ... rule2: <>? ID ; rule3: <>? ID ; Now we will discuss goal (b). When antlr discovers that there is a lookahead ambiguity between two alternatives it attempts to resolve the ambiguity by searching for predicates in both alternatives. In the past any predicate would do, even if the same one appeared in both alternatives: rule: <>? X | <>? X ; The #pred statement is a start towards solving this problem. During ambiguity resolution (*not* predicate hoisting) the predicates for the two alternatives are expanded and compared. Consider the following example: #pred Upper <>? #pred Lower <>? #pred Alpha <>? Upper || Lower rule0: rule1 | <>? ID ; rule1: | rule2 | rule3 ... ; rule2: <>? ID; rule3: <>? ID; The definition of #pred Alpha expresses: a. to test the predicate use the C code "isAlpha(LATEXT(1))" b. to analyze the predicate use the information that Alpha is equivalent to the union of Upper and Lower, During ambiguity resolution the definition of Alpha is expanded into "Upper || Lower" and compared with the predicate in the other alternative, which is also "Upper || Lower". Because they are identical MR11 will report a problem. ------------------------------------------------------------------------- t10.g, line 5: warning: the predicates used to disambiguate rule rule0 (file t10.g alt 1 line 5 and alt 2 line 6) are identical when compared without context and may have no resolving power for some lookahead sequences. ------------------------------------------------------------------------- If you use the "-info p" option the output file will contain: +----------------------------------------------------------------------+ |#if 0 | | | |The following predicates are identical when compared without | | lookahead context information. For some ambiguous lookahead | | sequences they may not have any power to resolve the ambiguity. | | | |Choice 1: rule0/1 alt 1 line 5 file t10.g | | | | The original predicate for choice 1 with available context | | information: | | | | OR expr | | | | pred << Upper>>? | | depth=k=1 rule rule2 line 14 t10.g | | set context: | | ID | | | | pred << Lower>>? | | depth=k=1 rule rule3 line 15 t10.g | | set context: | | ID | | | | The predicate for choice 1 after expansion (but without context | | information): | | | | OR expr | | | | pred << isUpper(LATEXT(1))>>? | | depth=k=1 rule line 1 t10.g | | | | pred << isLower(LATEXT(1))>>? | | depth=k=1 rule line 2 t10.g | | | | | |Choice 2: rule0/2 alt 2 line 6 file t10.g | | | | The original predicate for choice 2 with available context | | information: | | | | pred << Alpha>>? | | depth=k=1 rule rule0 line 6 t10.g | | set context: | | ID | | | | The predicate for choice 2 after expansion (but without context | | information): | | | | OR expr | | | | pred << isUpper(LATEXT(1))>>? | | depth=k=1 rule line 1 t10.g | | | | pred << isLower(LATEXT(1))>>? | | depth=k=1 rule line 2 t10.g | | | | | |#endif | +----------------------------------------------------------------------+ The comparison of the predicates for the two alternatives takes place without context information, which means that in some cases the predicates will be considered identical even though they operate on disjoint lookahead sets. Consider: #pred Alpha rule1: <>? ID | <>? Label ; Because the comparison of predicates takes place without context these will be considered identical. The reason for comparing without context is that otherwise it would be necessary to re-evaluate the entire predicate expression for each possible lookahead sequence. This would require more code to be written and more CPU time during grammar analysis, and it is not yet clear whether anyone will even make use of the new #pred facility. A temporary workaround might be to use different #pred statements for predicates you know have different context. This would avoid extraneous warnings. The above example might be termed a "false positive". Comparison without context will also lead to "false negatives". Consider the following example: #pred Alpha #pred Beta rule1: <>? A | rule2 ; rule2: <>? A | <>? B ; The predicate used for alt 2 of rule1 is (Alpha || Beta). This appears to be different than the predicate Alpha used for alt1. However, the context of Beta is B. Thus when the lookahead is A Beta will have no resolving power and Alpha will be used for both alternatives. Using the same predicate for both alternatives isn't very helpful, but this will not be detected with 1.33MR11. To properly handle this the predicate expression would have to be evaluated for each distinct lookahead context. To determine whether two predicate expressions are identical is difficult. The routine may fail to identify identical predicates. The #pred feature also compares predicates to see if a choice between alternatives which is resolved by a predicate which makes the second choice unreachable. Consider the following example: #pred A <>? #pred B <>? #pred A_or_B A || B r : s | t ; s : <>? ID ; t : <>? ID ; ---------------------------------------------------------------------------- t11.g, line 5: warning: the predicate used to disambiguate the first choice of rule r (file t11.g alt 1 line 5 and alt 2 line 6) appears to "cover" the second predicate when compared without context. The second predicate may have no resolving power for some lookahead sequences. ---------------------------------------------------------------------------- #132. (Changed in 1.33MR11) Recognition of identical predicates in alts Prior to 1.33MR11, there would be no ambiguity warning when the very same predicate was used to disambiguate both alternatives: test: ref B | ref C ; ref : <>? A In 1.33MR11 this will cause the warning: warning: the predicates used to disambiguate rule test (file v98.g alt 1 line 1 and alt 2 line 2) are identical and have no resolving power ----------------- Note ----------------- This is different than the following case test: <>? A B | <>? A C ; In this case there are two distinct predicates which have exactly the same text. In the first example there are two references to the same predicate. The problem represented by this grammar will be addressed later. #127. (Changed in 1.33MR11) Count Syntax Errors Count DLG Errors ------------------- ---------------- C++ mode ANTLRParser:: DLGLexerBase:: syntaxErrCount lexErrCount C mode zzSyntaxErrCount zzLexErrCount The C mode variables are global and initialized to 0. They are *not* reset to 0 automatically when antlr is restarted. The C++ mode variables are public. They are initialized to 0 by the constructors. They are *not* reset to 0 by the ANTLRParser::init() method. Suggested by Reinier van den Born (reinier@vnet.ibm.com). #126. (Changed in 1.33MR11) Addition of #first <<...>> The #first <<...>> inserts the specified text in the output files before any other #include statements required by pccts. The only things before the #first text are comments and a #define ANTLR_VERSION. Requested by and Esa Pulkkinen (esap@cs.tut.fi) and Alexin Zoltan (alexin@inf.u-szeged.hu). #124. A Note on the New "&&" Style Guarded Predicates I've been asked several times, "What is the difference between the old "=>" style guard predicates and the new style "&&" guard predicates, and how do you choose one over the other" ? The main difference is that the "=>" does not apply the predicate if the context guard doesn't match, whereas the && form always does. What is the significance ? If you have a predicate which is not on the "leading edge" it is cannot be hoisted. Suppose you need a predicate that looks at LA(2). You must introduce it manually. The classic example is: castExpr : LP typeName RP | .... ; typeName : <>? ID | STRUCT ID ; The problem is that isTypeName() isn't on the leading edge of typeName, so it won't be hoisted into castExpr to help make a decision on which production to choose. The *first* attempt to fix it is this: castExpr : <>? LP typeName RP | .... ; Unfortunately, this won't work because it ignores the problem of STRUCT. The solution is to apply isTypeName() in castExpr if LA(2) is an ID and don't apply it when LA(2) is STRUCT: castExpr : (LP ID)? => <>? LP typeName RP | .... ; In conclusion, the "=>" style guarded predicate is useful when: a. the tokens required for the predicate are not on the leading edge b. there are alternatives in the expression selected by the predicate for which the predicate is inappropriate If (b) were false, then one could use a simple predicate (assuming "-prc on"): castExpr : <>? LP typeName RP | .... ; typeName : <>? ID ; So, when do you use the "&&" style guarded predicate ? The new-style "&&" predicate should always be used with predicate context. The context guard is in ADDITION to the automatically computed context. Thus it useful for predicates which depend on the token type for reasons other than context. The following example is contributed by Reinier van den Born (reinier@vnet.ibm.com). +-------------------------------------------------------------------------+ | This grammar has two ways to call functions: | | | | - a "standard" call syntax with parens and comma separated args | | - a shell command like syntax (no parens and spacing separated args) | | | | The former also allows a variable to hold the name of the function, | | the latter can also be used to call external commands. | | | | The grammar (simplified) looks like this: | | | | fun_call : ID "(" { expr ("," expr)* } ")" | | /* ID is function name */ | | | "@" ID "(" { expr ("," expr)* } ")" | | /* ID is var containing fun name */ | | ; | | | | command : ID expr* /* ID is function name */ | | | path expr* /* path is external command name */ | | ; | | | | path : ID /* left out slashes and such */ | | | "@" ID /* ID is environment var */ | | ; | | | | expr : .... | | | "(" expr ")"; | | | | call : fun_call | | | command | | ; | | | | Obviously the call is wildly ambiguous. This is more or less how this | | is to be resolved: | | | | A call begins with an ID or an @ followed by an ID. | | | | If it is an ID and if it is an ext. command name -> command | | if followed by a paren -> fun_call | | otherwise -> command | | | | If it is an @ and if the ID is a var name -> fun_call | | otherwise -> command | | | | One can implement these rules quite neatly using && predicates: | | | | call : ("@" ID)? && <>? fun_call | | | (ID)? && <>? command | | | (ID "(")? fun_call | | | command | | ; | | | | This can be done better, so it is not an ideal example, but it | | conveys the principle. | +-------------------------------------------------------------------------+ #122. (Changed in 1.33MR11) Member functions to reset DLG in C++ mode void DLGFileReset(FILE *f) { input = f; found_eof = 0; } void DLGStringReset(DLGChar *s) { input = s; p = &input[0]; } Supplied by R.A. Nelson (cowboy@VNET.IBM.COM) #119. (Changed in 1.33MR11) Ambiguity aid for grammars The user can ask for additional information on ambiguities reported by antlr to stdout. At the moment, only one ambiguity report can be created in an antlr run. This feature is enabled using the "-aa" (Ambiguity Aid) option. The following options control the reporting of ambiguities: -aa ruleName Selects reporting by name of rule -aa lineNumber Selects reporting by line number (file name not compared) -aam Selects "multiple" reporting for a token in the intersection set of the alternatives. For instance, the token ID may appear dozens of times in various paths as the program explores the rules which are reachable from the point of an ambiguity. With option -aam every possible path the search program encounters is reported. Without -aam only the first encounter is reported. This may result in incomplete information, but the information may be sufficient and much shorter. -aad depth Selects the depth of the search. The default value is 1. The number of paths to be searched, and the size of the report can grow geometrically with the -ck value if a full search for all contributions to the source of the ambiguity is explored. The depth represents the number of tokens in the lookahead set which are matched against the set of ambiguous tokens. A depth of 1 means that the search stops when a lookahead sequence of just one token is matched. A k=1 ck=6 grammar might generate 5,000 items in a report if a full depth 6 search is made with the Ambiguity Aid. The source of the problem may be in the first token and obscured by the volume of data - I hesitate to call it information. When the user selects a depth > 1, the search is first performed at depth=1 for both alternatives, then depth=2 for both alternatives, etc. Sample output for rule grammar in antlr.g itself: +---------------------------------------------------------------------+ | Ambiguity Aid | | | | Choice 1: grammar/70 line 632 file a.g | | Choice 2: grammar/82 line 644 file a.g | | | | Intersection of lookahead[1] sets: | | | | "\}" "class" "#errclass" "#tokclass" | | | | Choice:1 Depth:1 Group:1 ("#errclass") | | 1 in (...)* block grammar/70 line 632 a.g | | 2 to error grammar/73 line 635 a.g | | 3 error error/1 line 894 a.g | | 4 #token "#errclass" error/2 line 895 a.g | | | | Choice:1 Depth:1 Group:2 ("#tokclass") | | 2 to tclass grammar/74 line 636 a.g | | 3 tclass tclass/1 line 937 a.g | | 4 #token "#tokclass" tclass/2 line 938 a.g | | | | Choice:1 Depth:1 Group:3 ("class") | | 2 to class_def grammar/75 line 637 a.g | | 3 class_def class_def/1 line 669 a.g | | 4 #token "class" class_def/3 line 671 a.g | | | | Choice:1 Depth:1 Group:4 ("\}") | | 2 #token "\}" grammar/76 line 638 a.g | | | | Choice:2 Depth:1 Group:5 ("#errclass") | | 1 in (...)* block grammar/83 line 645 a.g | | 2 to error grammar/93 line 655 a.g | | 3 error error/1 line 894 a.g | | 4 #token "#errclass" error/2 line 895 a.g | | | | Choice:2 Depth:1 Group:6 ("#tokclass") | | 2 to tclass grammar/94 line 656 a.g | | 3 tclass tclass/1 line 937 a.g | | 4 #token "#tokclass" tclass/2 line 938 a.g | | | | Choice:2 Depth:1 Group:7 ("class") | | 2 to class_def grammar/95 line 657 a.g | | 3 class_def class_def/1 line 669 a.g | | 4 #token "class" class_def/3 line 671 a.g | | | | Choice:2 Depth:1 Group:8 ("\}") | | 2 #token "\}" grammar/96 line 658 a.g | +---------------------------------------------------------------------+ For a linear lookahead set ambiguity (where k=1 or for k>1 but when all lookahead sets [i] with i>? A ; c : A ; Prior to 1.33MR10 the code generated for "start" would resemble: while { if (LA(1)==A && (!LA(1)==A || isUpper())) { a(); } }; This code is wrong because it makes rule "c" unreachable from "start". The essence of the problem is that antlr fails to recognize that there can be a valid alternative within "a" even when the predicate <>? is false. In 1.33MR10 with -mrhoist the hoisting of the predicate into "start" is suppressed because it recognizes that "c" can cover all the cases where the predicate is false: while { if (LA(1)==A) { a(); } }; With the antlr "-info p" switch the user will receive information about the predicate suppression in the generated file: -------------------------------------------------------------- #if 0 Hoisting of predicate suppressed by alternative without predicate. The alt without the predicate includes all cases where the predicate is false. WITH predicate: line 7 v1.g WITHOUT predicate: line 7 v1.g The context set for the predicate: A The lookahead set for the alt WITHOUT the semantic predicate: A The predicate: pred << isUpper(LATEXT(1))>>? depth=k=1 rule b line 9 v1.g set context: A tree context: null Chain of referenced rules: #0 in rule start (line 5 v1.g) to rule a #1 in rule a (line 7 v1.g) #endif -------------------------------------------------------------- A predicate can be suppressed by a combination of alternatives which, taken together, cover a predicate: start : (a)* "@" ; a : b | ca | cb | cc ; b : <>? ( A | B | C ) ; ca : A ; cb : B ; cc : C ; Consider a more complex example in which "c" covers only part of a predicate: start : (a)* "@" ; a : b | c ; b : <>? ( A | X ); c : A ; Prior to 1.33MR10 the code generated for "start" would resemble: while { if ( (LA(1)==A || LA(1)==X) && (! (LA(1)==A || LA(1)==X) || isUpper()) { a(); } }; With 1.33MR10 and -mrhoist the predicate context is restricted to the non-covered lookahead. The code resembles: while { if ( (LA(1)==A || LA(1)==X) && (! (LA(1)==X) || isUpper()) { a(); } }; With the antlr "-info p" switch the user will receive information about the predicate restriction in the generated file: -------------------------------------------------------------- #if 0 Restricting the context of a predicate because of overlap in the lookahead set between the alternative with the semantic predicate and one without Without this restriction the alternative without the predicate could not be reached when input matched the context of the predicate and the predicate was false. WITH predicate: line 11 v4.g WITHOUT predicate: line 12 v4.g The original context set for the predicate: A X The lookahead set for the alt WITHOUT the semantic predicate: A The intersection of the two sets A The original predicate: pred << isUpper(LATEXT(1))>>? depth=k=1 rule b line 15 v4.g set context: A X tree context: null The new (modified) form of the predicate: pred << isUpper(LATEXT(1))>>? depth=k=1 rule b line 15 v4.g set context: X tree context: null #endif -------------------------------------------------------------- The bad news about -mrhoist: (a) -mrhoist does not analyze predicates with lookahead depth > 1. (b) -mrhoist does not look past a guarded predicate to find context which might cover other predicates. For these cases you might want to use syntactic predicates. When a semantic predicate fails during guess mode the guess fails and the next alternative is tried. Limitation (a) is illustrated by the following example: start : (stmt)* EOF ; stmt : cast | expr ; cast : <>? LP ID RP ; expr : LP ID RP ; This is not much different from the first example, except that it requires two tokens of lookahead context to determine what to do. This predicate is NOT suppressed because the current version is unable to handle predicates with depth > 1. A predicate can be combined with other predicates during hoisting. In those cases the depth=1 predicates are still handled. Thus, in the following example the isUpper() predicate will be suppressed by line #4 when hoisted from "bizarre" into "start", but will still be present in "bizarre" in order to predict "stmt". start : (bizarre)* EOF ; // #1 // #2 bizarre : stmt // #3 | A // #4 ; stmt : cast | expr ; cast : <>? LP ID RP ; expr : LP ID RP ; | <>? A Limitation (b) is illustrated by the following example of a context guarded predicate: rule : (A)? <

>? // #1 (A // #2 |B // #3 ) // #4 | <> B // #5 ; Recall that this means that when the lookahead is NOT A then the predicate "p" is ignored and it attempts to match "A|B". Ideally, the "B" at line #3 should suppress predicate "q". However, the current version does not attempt to look past the guard predicate to find context which might suppress other predicates. In some cases -mrhoist will lead to the reporting of ambiguities which were not visible before: start : (a)* "@"; a : bc | d; bc : b | c ; b : <>? A; c : A ; d : A ; In this case there is a true ambiguity in "a" between "bc" and "d" which can both match "A". Without -mrhoist the predicate in "b" is hoisted into "a" and there is no ambiguity reported. However, with -mrhoist, the predicate in "b" is suppressed by "c" (as it should be) making the ambiguity in "a" apparent. The motivations for these changes were hoisting problems reported by Reinier van den Born (reinier@vnet.ibm.com) and several others. #113. (Changed in 1.33MR10) new context guarded pred: (g)? && <

>? expr The existing context guarded predicate: rule : (guard)? => <

>? expr | next_alternative ; generates code which resembles: if (lookahead(expr) && (!guard || pred)) { expr() } else .... This is not suitable for some applications because it allows expr() to be invoked when the predicate is false. This is intentional because it is meant to mimic automatically computed predicate context. The new context guarded predicate uses the guard information differently because it has a different goal. Consider: rule : (guard)? && <

>? expr | next_alternative ; The new style of context guarded predicate is equivalent to: rule : <>? expr | next_alternative ; It generates code which resembles: if (lookahead(expr) && guard && pred) { expr(); } else ... Both forms of guarded predicates severely restrict the form of the context guard: it can contain no rule references, no (...)*, no (...)+, and no {...}. It may contain token and token class references, and alternation ("|"). Addition for 1.33MR11: in the token expression all tokens must be at the same height of the token tree: (A ( B | C))? && ... is ok (all height 2) (A ( B | ))? && ... is not ok (some 1, some 2) (A B C D | E F G H)? && ... is ok (all height 4) (A B C D | E )? && ... is not ok (some 4, some 1) This restriction is required in order to properly compute the lookahead set for expressions like: rule1 : (A B C)? && <>? rule2 ; rule2 : (A|X) (B|Y) (C|Z); This addition was suggested by Rienier van den Born (reinier@vnet.ibm.com) #109. (Changed in 1.33MR10) improved trace information The quality of the trace information provided by the "-gd" switch has been improved significantly. Here is an example of the output from a test program. It shows the rule name, the first token of lookahead, the call depth, and the guess status: exit rule gusxx {"?"} depth 2 enter rule gusxx {"?"} depth 2 enter rule gus1 {"o"} depth 3 guessing guess done - returning to rule gus1 {"o"} at depth 3 (guess mode continues - an enclosing guess is still active) guess done - returning to rule gus1 {"Z"} at depth 3 (guess mode continues - an enclosing guess is still active) exit rule gus1 {"Z"} depth 3 guessing guess done - returning to rule gusxx {"o"} at depth 2 (guess mode ends) enter rule gus1 {"o"} depth 3 guess done - returning to rule gus1 {"o"} at depth 3 (guess mode ends) guess done - returning to rule gus1 {"Z"} at depth 3 (guess mode ends) exit rule gus1 {"Z"} depth 3 line 1: syntax error at "Z" missing SC ... Rule trace reporting is controlled by the value of the integer [zz]traceOptionValue: when it is positive tracing is enabled, otherwise it is disabled. Tracing during guess mode is controlled by the value of the integer [zz]traceGuessOptionValue. When it is positive AND [zz]traceOptionValue is positive rule trace is reported in guess mode. The values of [zz]traceOptionValue and [zz]traceGuessOptionValue can be adjusted by subroutine calls listed below. Depending on the presence or absence of the antlr -gd switch the variable [zz]traceOptionValueDefault is set to 0 or 1. When the parser is initialized or [zz]traceReset() is called the value of [zz]traceOptionValueDefault is copied to [zz]traceOptionValue. The value of [zz]traceGuessOptionValue is always initialzed to 1, but, as noted earlier, nothing will be reported unless [zz]traceOptionValue is also positive. When the parser state is saved/restored the value of the trace variables are also saved/restored. If a restore causes a change in reporting behavior from on to off or vice versa this will be reported. When the -gd option is selected, the macro "#define zzTRACE_RULES" is added to appropriate output files. C++ mode -------- int traceOption(int delta) int traceGuessOption(int delta) void traceReset() int traceOptionValueDefault C mode -------- int zzTraceOption(int delta) int zzTraceGuessOption(int delta) void zzTraceReset() int zzTraceOptionValueDefault The argument "delta" is added to the traceOptionValue. To turn on trace when inside a particular rule one: rule : <> ( rest-of-rule ) <> ; /* fail clause */ <> One can use the same idea to turn *off* tracing within a rule by using a delta of (-1). An improvement in the rule trace was suggested by Sramji Ramanathan (ps@kumaran.com). #108. A Note on Deallocation of Variables Allocated in Guess Mode NOTE ------------------------------------------------------ This mechanism only works for heap allocated variables ------------------------------------------------------ The rewrite of the trace provides the machinery necessary to properly free variables or undo actions following a failed guess. The macro zzUSER_GUESS_HOOK(guessSeq,zzrv) is expanded as part of the zzGUESS macro. When a guess is opened the value of zzrv is 0. When a longjmp() is executed to undo the guess, the value of zzrv will be 1. The macro zzUSER_GUESS_DONE_HOOK(guessSeq) is expanded as part of the zzGUESS_DONE macro. This is executed whether the guess succeeds or fails as part of closing the guess. The guessSeq is a sequence number which is assigned to each guess and is incremented by 1 for each guess which becomes active. It is needed by the user to associate the start of a guess with the failure and/or completion (closing) of a guess. Guesses are nested. They must be closed in the reverse of the order that they are opened. In order to free memory used by a variable during a guess a user must write a routine which can be called to register the variable along with the current guess sequence number provided by the zzUSER_GUESS_HOOK macro. If the guess fails, all variables tagged with the corresponding guess sequence number should be released. This is ugly, but it would require a major rewrite of antlr 1.33 to use some mechanism other than setjmp()/longjmp(). The order of calls for a *successful* guess would be: zzUSER_GUESS_HOOK(guessSeq,0); zzUSER_GUESS_DONE_HOOK(guessSeq); The order of calls for a *failed* guess would be: zzUSER_GUESS_HOOK(guessSeq,0); zzUSER_GUESS_HOOK(guessSeq,1); zzUSER_GUESS_DONE_HOOK(guessSeq); The default definitions of these macros are empty strings. Here is an example in C++ mode. The zzUSER_GUESS_HOOK and zzUSER_GUESS_DONE_HOOK macros and myGuessHook() routine can be used without change in both C and C++ versions. ---------------------------------------------------------------------- << #include "AToken.h" typedef ANTLRCommonToken ANTLRToken; #include "DLGLexer.h" int main() { { DLGFileInput in(stdin); DLGLexer lexer(&in,2000); ANTLRTokenBuffer pipe(&lexer,1); ANTLRCommonToken aToken; P parser(&pipe); lexer.setToken(&aToken); parser.init(); parser.start(); }; fclose(stdin); fclose(stdout); return 0; } >> << char *s=NULL; #undef zzUSER_GUESS_HOOK #define zzUSER_GUESS_HOOK(guessSeq,zzrv) myGuessHook(guessSeq,zzrv); #undef zzUSER_GUESS_DONE_HOOK #define zzUSER_GUESS_DONE_HOOK(guessSeq) myGuessHook(guessSeq,2); void myGuessHook(int guessSeq,int zzrv) { if (zzrv == 0) { fprintf(stderr,"User hook: starting guess #%d\n",guessSeq); } else if (zzrv == 1) { free (s); s=NULL; fprintf(stderr,"User hook: failed guess #%d\n",guessSeq); } else if (zzrv == 2) { free (s); s=NULL; fprintf(stderr,"User hook: ending guess #%d\n",guessSeq); }; } >> #token A "a" #token "[\t \ \n]" <> class P { start : (top)+ ; top : (which) ? <> | other <> ; <> which : which2 ; which2 : which3 ; which3 : (label)? <> | (global)? <> | (exclamation)? <> ; label : <getText());>> A ":" ; global : <getText());>> A "::" ; exclamation : <getText());>> A "!" ; other : <getText());>> "other" ; } ---------------------------------------------------------------------- This is a silly example, but illustrates the idea. For the input "a ::" with tracing enabled the output begins: ---------------------------------------------------------------------- enter rule "start" depth 1 enter rule "top" depth 2 User hook: starting guess #1 enter rule "which" depth 3 guessing enter rule "which2" depth 4 guessing enter rule "which3" depth 5 guessing User hook: starting guess #2 enter rule "label" depth 6 guessing guess failed User hook: failed guess #2 guess done - returning to rule "which3" at depth 5 (guess mode continues - an enclosing guess is still active) User hook: ending guess #2 User hook: starting guess #3 enter rule "global" depth 6 guessing exit rule "global" depth 6 guessing guess done - returning to rule "which3" at depth 5 (guess mode continues - an enclosing guess is still active) User hook: ending guess #3 enter rule "global" depth 6 guessing exit rule "global" depth 6 guessing exit rule "which3" depth 5 guessing exit rule "which2" depth 4 guessing exit rule "which" depth 3 guessing guess done - returning to rule "top" at depth 2 (guess mode ends) User hook: ending guess #1 enter rule "which" depth 3 ..... ---------------------------------------------------------------------- Remember: (a) Only init-actions are executed during guess mode. (b) A rule can be invoked multiple times during guess mode. (c) If the guess succeeds the rule will be called once more without guess mode so that normal actions will be executed. This means that the init-action might need to distinguish between guess mode and non-guess mode using the variable [zz]guessing. #101. (Changed in 1.33MR10) antlr -info command line switch -info p - extra predicate information in generated file t - information about tnode use: at the end of each rule in generated file summary on stderr at end of program m - monitor progress prints name of each rule as it is started flushes output at start of each rule f - first/follow set information to stdout 0 - no operation (added in 1.33MR11) The options may be combined and may appear in any order. For example: antlr -info ptm -CC -gt -mrhoist on mygrammar.g #100a. (Changed in 1.33MR10) Predicate tree simplification When the same predicates can be referenced in more than one alternative of a block large predicate trees can be formed. The difference that these optimizations make is so dramatic that I have decided to use it even when -mrhoist is not selected. Consider the following grammar: start : ( all )* ; all : a | d | e | f ; a : c A B | c A C ; c : <>? ; d : <>? B C ; e : <>? B C ; f : e X Y ; In rule "a" there is a reference to rule "c" in both alternatives. The length of the predicate AAA is k=2 and it can be followed in alternative 1 only by (A B) while in alternative 2 it can be followed only by (A C). Thus they do not have identical context. In rule "all" the alternatives which refer to rules "e" and "f" allow elimination of the duplicate reference to predicate CCC. The table below summarized the kind of simplification performed by 1.33MR10. In the table, X and Y stand for single predicates (not trees). (OR X (OR Y (OR Z))) => (OR X Y Z) (AND X (AND Y (AND Z))) => (AND X Y Z) (OR X (... (OR X Y) ... )) => (OR X (... Y ... )) (AND X (... (AND X Y) ... )) => (AND X (... Y ... )) (OR X (... (AND X Y) ... )) => (OR X (... ... )) (AND X (... (OR X Y) ... )) => (AND X (... ... )) (AND X) => X (OR X) => X In a test with a complex grammar for a real application, a predicate tree with six OR nodes and 12 leaves was reduced to "(OR X Y Z)". In 1.33MR10 there is a greater effort to release memory used by predicates once they are no longer in use. #100b. (Changed in 1.33MR10) Suppression of extra predicate tests The following optimizations require that -mrhoist be selected. It is relatively easy to optimize the code generated for predicate gates when they are of the form: (AND X Y Z ...) or (OR X Y Z ...) where X, Y, Z, and "..." represent individual predicates (leaves) not predicate trees. If the predicate is an AND the contexts of the X, Y, Z, etc. are ANDed together to create a single Tree context for the group and context tests for the individual predicates are suppressed: -------------------------------------------------- Note: This was incorrect. The contexts should be ORed together. This has been fixed. A more complete description is available in item #152. --------------------------------------------------- Optimization 1: (AND X Y Z ...) Suppose the context for Xtest is LA(1)==LP and the context for Ytest is LA(1)==LP && LA(2)==ID. Without the optimization the code would resemble: if (lookaheadContext && !(LA(1)==LP && LA(1)==LP && LA(2)==ID) || ( (! LA(1)==LP || Xtest) && (! (LA(1)==LP || LA(2)==ID) || Xtest) )) {... With the -mrhoist optimization the code would resemble: if (lookaheadContext && ! (LA(1)==LP && LA(2)==ID) || (Xtest && Ytest) {... Optimization 2: (OR X Y Z ...) with identical contexts Suppose the context for Xtest is LA(1)==ID and for Ytest the context is also LA(1)==ID. Without the optimization the code would resemble: if (lookaheadContext && ! (LA(1)==ID || LA(1)==ID) || (LA(1)==ID && Xtest) || (LA(1)==ID && Ytest) {... With the -mrhoist optimization the code would resemble: if (lookaheadContext && (! LA(1)==ID) || (Xtest || Ytest) {... Optimization 3: (OR X Y Z ...) with distinct contexts Suppose the context for Xtest is LA(1)==ID and for Ytest the context is LA(1)==LP. Without the optimization the code would resemble: if (lookaheadContext && ! (LA(1)==ID || LA(1)==LP) || (LA(1)==ID && Xtest) || (LA(1)==LP && Ytest) {... With the -mrhoist optimization the code would resemble: if (lookaheadContext && (zzpf=0, (LA(1)==ID && (zzpf=1) && Xtest) || (LA(1)==LP && (zzpf=1) && Ytest) || !zzpf) { These may appear to be of similar complexity at first, but the non-optimized version contains two tests of each context while the optimized version contains only one such test, as well as eliminating some of the inverted logic (" !(...) || "). Optimization 4: Computation of predicate gate trees When generating code for the gates of predicate expressions antlr 1.33 vanilla uses a recursive procedure to generate "&&" and "||" expressions for testing the lookahead. As each layer of the predicate tree is exposed a new set of "&&" and "||" expressions on the lookahead are generated. In many cases the lookahead being tested has already been tested. With -mrhoist a lookahead tree is computed for the entire lookahead expression. This means that predicates with identical context or context which is a subset of another predicate's context disappear. This is especially important for predicates formed by rules like the following: uppperCaseVowel : <>? vowel; vowel: : <>? LETTERS; These predicates are combined using AND since both must be satisfied for rule upperCaseVowel. They have identical context which makes this optimization very effective. The affect of Items #100a and #100b together can be dramatic. In a very large (but real world) grammar one particular predicate expression was reduced from an (unreadable) 50 predicate leaves, 195 LA(1) terms, and 5500 characters to an (easily comprehensible) 3 predicate leaves (all different) and a *single* LA(1) term. #98. (Changed in 1.33MR10) Option "-info p" When the user selects option "-info p" the program will generate detailed information about predicates. If the user selects "-mrhoist on" additional detail will be provided explaining the promotion and suppression of predicates. The output is part of the generated file and sandwiched between #if 0/#endif statements. Consider the following k=1 grammar: start : ( all ) * ; all : ( a | b ) ; a : c B ; c : <>? | B ; b : <>? X ; Below is an excerpt of the output for rule "start" for the three predicate options (off, on, and maintenance release style hoisting). For those who do not wish to use the "-mrhoist on" option for code generation the option can be used in a "diagnostic" mode to provide valuable information: a. where one should insert null actions to inhibit hoisting b. a chain of rule references which shows where predicates are being hoisted ====================================================================== Example of "-info p" with "-mrhoist on" ====================================================================== #if 0 Hoisting of predicate suppressed by alternative without predicate. The alt without the predicate includes all cases where the predicate is false. WITH predicate: line 11 v36.g WITHOUT predicate: line 12 v36.g The context set for the predicate: B The lookahead set for alt WITHOUT the semantic predicate: B The predicate: pred << LATEXT(1)>>? depth=k=1 rule c line 11 v36.g set context: B tree context: null Chain of referenced rules: #0 in rule start (line 1 v36.g) to rule all #1 in rule all (line 3 v36.g) to rule a #2 in rule a (line 8 v36.g) to rule c #3 in rule c (line 11 v36.g) #endif && #if 0 pred << LATEXT(1)>>? depth=k=1 rule b line 15 v36.g set context: X tree context: null #endif ====================================================================== Example of "-info p" with the default -prc setting ( "-prc off") ====================================================================== #if 0 OR pred << LATEXT(1)>>? depth=k=1 rule c line 11 v36.g set context: nil tree context: null pred << LATEXT(1)>>? depth=k=1 rule b line 15 v36.g set context: nil tree context: null #endif ====================================================================== Example of "-info p" with "-prc on" and "-mrhoist off" ====================================================================== #if 0 OR pred << LATEXT(1)>>? depth=k=1 rule c line 11 v36.g set context: B tree context: null pred << LATEXT(1)>>? depth=k=1 rule b line 15 v36.g set context: X tree context: null #endif ====================================================================== #60. (Changed in 1.33MR7) Major changes to exception handling There were significant problems in the handling of exceptions in 1.33 vanilla. The general problem is that it can only process one level of exception handler. For example, a named exception handler, an exception handler for an alternative, or an exception for a subrule always went to the rule's exception handler if there was no "catch" which matched the exception. In 1.33MR7 the exception handlers properly "nest". If an exception handler does not have a matching "catch" then the nextmost outer exception handler is checked for an appropriate "catch" clause, and so on until an exception handler with an appropriate "catch" is found. There are still undesirable features in the way exception handlers are implemented, but I do not have time to fix them at the moment: The exception handlers for alternatives are outside the block containing the alternative. This makes it impossible to access variables declared in a block or to resume the parse by "falling through". The parse can still be easily resumed in other ways, but not in the most natural fashion. This results in an inconsistentcy between named exception handlers and exception handlers for alternatives. When an exception handler for an alternative "falls through" it goes to the nextmost outer handler - not the "normal action". A major difference between 1.33MR7 and 1.33 vanilla is the default action after an exception is caught: 1.33 Vanilla ------------ In 1.33 vanilla the signal value is set to zero ("NoSignal") and the code drops through to the code following the exception. For named exception handlers this is the "normal action". For alternative exception handlers this is the rule's handler. 1.33MR7 ------- In 1.33MR7 the signal value is NOT automatically set to zero. There are two cases: For named exception handlers: if the signal value has been set to zero the code drops through to the "normal action". For all other cases the code branches to the nextmost outer exception handler until it reaches the handler for the rule. The following macros have been defined for convenience: C/C++ Mode Name -------------------- (zz)suppressSignal set signal & return signal arg to 0 ("NoSignal") (zz)setSignal(intValue) set signal & return signal arg to some value (zz)exportSignal copy the signal value to the return signal arg I'm not sure why PCCTS make a distinction between the local signal value and the return signal argument, but I'm loathe to change the code. The burden of copying the local signal value to the return signal argument can be given to the default signal handler, I suppose. #53. (Explanation for 1.33MR6) What happens after an exception is caught ? The Book is silent about what happens after an exception is caught. The following code fragment prints "Error Action" followed by "Normal Action". test : Word ex:Number <> exception[ex] catch NoViableAlt: <> ; The reason for "Normal Action" is that the normal flow of the program after a user-written exception handler is to "drop through". In the case of an exception handler for a rule this results in the exection of a "return" statement. In the case of an exception handler attached to an alternative, rule, or token this is the code that would have executed had there been no exception. The user can achieve the desired result by using a "return" statement. test : Word ex:Number <> exception[ex] catch NoViableAlt: <> ; The most powerful mechanism for recovery from parse errors in pccts is syntactic predicates because they provide backtracking. Exceptions allow "return", "break", "consumeUntil(...)", "goto _handler", "goto _fail", and changing the _signal value. #41. (Added in 1.33MR6) antlr -stdout Using "antlr -stdout ..." forces the text that would normally go to the grammar.c or grammar.cpp file to stdout. #40. (Added in 1.33MR6) antlr -tab to change tab stops Using "antlr -tab number ..." changes the tab stops for the grammar.c or grammar.cpp file. The number must be between 0 and 8. Using 0 gives tab characters, values between 1 and 8 give the appropriate number of space characters. #34. (Added to 1.33MR1) Add public DLGLexerBase::set_line(int newValue) Previously there was no public function for changing the line number maintained by the lexer. #28. (Added to 1.33MR1) More control over DLG header Version 1.33MR1 adds the following directives to PCCTS for C++ mode: #lexprefix <> Adds source code to the DLGLexer.h file after the #include "DLexerBase.h" but before the start of the class definition. #lexmember <> Adds source code to the DLGLexer.h file as part of the DLGLexer class body. It appears immediately after the start of the class and a "public: statement. gtkwave-3.3.86/contrib/pccts/dlg/0000775000175000017500000000000013166335473016126 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/dlg/dlgPPC.make0000664000175000017500000000421013166335473020073 0ustar bybellbybell# File: dlgPPC.make # Target: dlgPPC # Sources: automata.c # dlg_a.c # dlg_p.c # err.c # main.c # output.c # relabel.c # support.c # ::support:set:set.c # Created: Sunday, May 17, 1998 11:34:20 PM # Author: Kenji Tanaka MAKEFILE = dlgPPC.make ¥MondoBuild¥ = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified Includes = ¶ -i "::h:" ¶ -i "::support:set:" Sym¥PPC = ObjDir¥PPC = ":Obj:" PPCCOptions = {Includes} {Sym¥PPC} -w off -d MPW -d __STDC__=1 -d USER_ZZSYN Objects¥PPC = ¶ "{ObjDir¥PPC}automata.c.x" ¶ "{ObjDir¥PPC}dlg_a.c.x" ¶ "{ObjDir¥PPC}dlg_p.c.x" ¶ "{ObjDir¥PPC}err.c.x" ¶ "{ObjDir¥PPC}main.c.x" ¶ "{ObjDir¥PPC}output.c.x" ¶ "{ObjDir¥PPC}relabel.c.x" ¶ "{ObjDir¥PPC}support.c.x" ¶ "{ObjDir¥PPC}set.c.x" dlgPPC ÄÄ {¥MondoBuild¥} {Objects¥PPC} PPCLink ¶ -o {Targ} {Sym¥PPC} ¶ {Objects¥PPC} ¶ -t 'MPST' ¶ -c 'MPS ' ¶ "{SharedLibraries}InterfaceLib" ¶ "{SharedLibraries}StdCLib" ¶ "{SharedLibraries}MathLib" ¶ "{PPCLibraries}StdCRuntime.o" ¶ "{PPCLibraries}PPCCRuntime.o" ¶ "{PPCLibraries}PPCToolLibs.o" "{ObjDir¥PPC}automata.c.x" Ä {¥MondoBuild¥} automata.c {PPCC} automata.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}dlg_a.c.x" Ä {¥MondoBuild¥} dlg_a.c {PPCC} dlg_a.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}dlg_p.c.x" Ä {¥MondoBuild¥} dlg_p.c {PPCC} dlg_p.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}err.c.x" Ä {¥MondoBuild¥} err.c {PPCC} err.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}main.c.x" Ä {¥MondoBuild¥} main.c {PPCC} main.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}output.c.x" Ä {¥MondoBuild¥} output.c {PPCC} output.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}relabel.c.x" Ä {¥MondoBuild¥} relabel.c {PPCC} relabel.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}support.c.x" Ä {¥MondoBuild¥} support.c {PPCC} support.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}set.c.x" Ä {¥MondoBuild¥} "::support:set:set.c" {PPCC} "::support:set:set.c" -o {Targ} {PPCCOptions} dlgPPC ÄÄ dlg.r Rez dlg.r -o dlgPPC -a Install Ä dlgPPC Duplicate -y dlgPPC "{MPW}"Tools:dlg gtkwave-3.3.86/contrib/pccts/dlg/dlg_a.c0000664000175000017500000007063613166335473017354 0ustar bybellbybell /* parser.dlg -- DLG Description of scanner * * Generated from: ./dlg_p.g * * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001 * Purdue University Electrical Engineering * With AHPCRC, University of Minnesota * ANTLR Version 1.33MR33 */ #define ANTLR_VERSION 13333 #include "pcctscfg.h" #include "pccts_stdio.h" #include #include "dlg.h" #include "antlr.h" #include "tokens.h" #include "dlgdef.h" LOOKAHEAD void #ifdef __USE_PROTOS zzerraction(void) #else zzerraction() #endif { (*zzerr)("invalid token"); zzadvance(); zzskip(); } /* * D L G tables * * Generated from: ./parser.dlg * * 1989-2001 by Will Cohen, Terence Parr, and Hank Dietz * Purdue University Electrical Engineering * DLG Version 1.33MR33 */ #include "mode.h" int func_action; /* should actions be turned into functions?*/ int lex_mode_counter = 0; /* keeps track of the number of %%names */ /* MR1 */ /* MR1 11-Apr-97 Provide mechanism for inserting code into DLG class */ /* MR1 via <<%%lexmember...>> */ /* MR1 */ int lexMember = 0; /* <<%%lexmemeber ...>> MR1 */ int lexAction = 0; /* <<%%lexaction ...>> MR1 */ int parserClass = 0; /* <<%%parserclass ...>> MR1 */ int lexPrefix = 0; /* <<%%lexprefix ...>> MR1 */ char theClassName[100]; /* MR11 */ char *pClassName=theClassName; /* MR11 */ int firstLexMember=1; /* MR1 */ #ifdef __USE_PROTOS void xxputc(int c) { /* MR1 */ #else void xxputc(c) /* MR1 */ int c; /* MR1 */ { /* MR1 */ #endif if (parserClass) { /* MR1 */ *pClassName++=c; /* MR1 */ *pClassName=0; /* MR1 */ } else if (lexMember || lexPrefix) { /* MR1 */ if (class_stream != NULL) fputc(c,class_stream); /* MR1 */ } else { /* MR1 */ fputc(c,OUT); /* MR1 */ }; /* MR1 */ } /* MR1 */ #ifdef __USE_PROTOS void xxprintf(char *format,char *string) { /* MR1 */ #else void xxprintf(format,string) /* MR1 */ char *format; /* MR1 */ char *string; /* MR1 */ { /* MR1 */ #endif if (lexMember || lexPrefix || parserClass) { /* MR1 */ if (class_stream != NULL) /* MR1 */ fprintf(class_stream,format,string); /* MR1 */ } else { /* MR1 */ fprintf(OUT,format,string); /* MR1 */ }; /* MR1 */ } /* MR1 */ static void act1() { NLA = 1; } static void act2() { NLA = 2; zzskip(); } static void act3() { NLA = 3; zzline++; zzskip(); DAWDLE; } static void act4() { NLA = L_EOF; } static void act5() { NLA = PER_PER; } static void act6() { NLA = NAME_PER_PER; p_mode_def(&zzlextext[2],lex_mode_counter++); } static void act7() { NLA = LEXMEMBER; lexMember=1; /* MR1 */ if (firstLexMember != 0) { /* MR1 */ firstLexMember=0; /* MR1 */ p_class_def1(); /* MR1 */ }; /* MR1 */ zzmode(ACT); /* MR1 */ } static void act8() { NLA = LEXACTION; lexAction=1;zzmode(ACT); } static void act9() { NLA = PARSERCLASS; parserClass=1; /* MR1 */ zzmode(ACT); /* MR1 */ } static void act10() { NLA = LEXPREFIX; lexPrefix=1;zzmode(ACT); } static void act11() { NLA = ACTION; if (func_action) fprintf(OUT,"\n%s %sact%d()\n{ ", gen_cpp?"ANTLRTokenType":"static void", gen_cpp?ClassName("::"):"", ++action_no); zzmode(ACT); zzskip(); } static void act12() { NLA = GREAT_GREAT; } static void act13() { NLA = L_BRACE; } static void act14() { NLA = R_BRACE; } static void act15() { NLA = L_PAR; } static void act16() { NLA = R_PAR; } static void act17() { NLA = L_BRACK; } static void act18() { NLA = R_BRACK; } static void act19() { NLA = ZERO_MORE; } static void act20() { NLA = ONE_MORE; } static void act21() { NLA = OR; } static void act22() { NLA = RANGE; } static void act23() { NLA = NOT; } static void act24() { NLA = OCTAL_VALUE; {int t; sscanf(&zzlextext[1],"%o",&t); zzlextext[0] = t;} } static void act25() { NLA = HEX_VALUE; {int t; sscanf(&zzlextext[3],"%x",&t); zzlextext[0] = t;} } static void act26() { NLA = DEC_VALUE; {int t; sscanf(&zzlextext[1],"%d",&t); zzlextext[0] = t;} } static void act27() { NLA = TAB; zzlextext[0] = '\t'; } static void act28() { NLA = NL; zzlextext[0] = '\n'; } static void act29() { NLA = CR; zzlextext[0] = '\r'; } static void act30() { NLA = BS; zzlextext[0] = '\b'; } static void act31() { NLA = CONTINUATION; zzline++; zzskip(); } static void act32() { NLA = LIT; zzlextext[0] = zzlextext[1]; } static void act33() { NLA = REGCHAR; } static unsigned char shift0[257] = { 0, 40, 40, 40, 40, 40, 40, 40, 40, 40, 1, 2, 40, 40, 1, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 1, 40, 40, 40, 40, 4, 40, 40, 30, 31, 34, 35, 40, 37, 40, 40, 23, 24, 24, 24, 24, 24, 24, 24, 25, 25, 40, 40, 26, 40, 27, 40, 3, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 20, 22, 22, 32, 39, 33, 40, 22, 40, 11, 9, 12, 21, 6, 19, 22, 22, 14, 22, 22, 5, 8, 16, 15, 17, 22, 10, 18, 13, 22, 22, 22, 7, 22, 22, 28, 36, 29, 38, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40 }; static void act34() { NLA = 1; error("unterminated action", zzline); zzmode(START); } static void act35() { NLA = ACTION; if (func_action) fprintf(OUT,"}\n\n"); zzmode(START); /* MR1 */ /* MR1 11-Apr-97 Provide mechanism for inserting code into DLG class */ /* MR1 via <<%%lexmember ...>> */ /* MR1 This is a consequence of not saving actions */ /* MR1 */ /* MR1 */ parserClass=0; /* MR1 */ lexPrefix=0; /* MR1 */ lexAction=0; /* MR1 */ lexMember=0; } static void act36() { NLA = 34; xxputc(zzlextext[0]); zzskip(); } static void act37() { NLA = 35; xxputc('>'); zzskip(); } static void act38() { NLA = 36; xxputc('\\'); zzskip(); } static void act39() { NLA = 37; xxputc(zzlextext[0]); ++zzline; zzskip(); } static void act40() { NLA = 38; zzmode(ACTION_COMMENTS); /* MR1 */ xxprintf("%s", &(zzlextext[0])); zzskip(); /* MR1 */ } static void act41() { NLA = 39; zzmode(ACTION_CPP_COMMENTS); /* MR1 */ xxprintf("%s", &(zzlextext[0])); zzskip(); /* MR1 */ } static void act42() { NLA = 40; xxputc(zzlextext[0]); zzskip(); } static unsigned char shift1[257] = { 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 4, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 }; static void act43() { NLA = 1; } static void act44() { NLA = 41; zzmode(ACT); /* MR1 */ xxprintf("%s", &(zzlextext[0])); zzskip(); /* MR1 */ } static void act45() { NLA = 42; zzline++; xxputc(zzlextext[0]); zzskip(); } static void act46() { NLA = 43; xxputc(zzlextext[0]); zzskip(); } static unsigned char shift2[257] = { 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 }; static void act47() { NLA = 1; } static void act48() { NLA = 44; zzmode(ACT); zzline++; /* MR1 */ xxprintf("%s", &(zzlextext[0])); zzskip(); /* MR1 */ } static void act49() { NLA = 45; xxputc(zzlextext[0]); zzskip(); } static unsigned char shift3[257] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }; #define DfaStates 94 typedef unsigned char DfaState; static DfaState st0[42] = { 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 6, 94 }; static DfaState st1[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st2[42] = { 94, 21, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st3[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st4[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st5[42] = { 94, 94, 94, 94, 22, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st6[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st7[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 23, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st8[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 24, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st9[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st10[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st11[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st12[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st13[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st14[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st15[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st16[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st17[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st18[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st19[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st20[42] = { 94, 25, 26, 25, 25, 25, 25, 25, 25, 27, 28, 25, 25, 29, 25, 25, 30, 25, 25, 25, 25, 25, 25, 31, 32, 32, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 94 }; static DfaState st21[42] = { 94, 21, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st22[42] = { 94, 94, 94, 94, 94, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st23[42] = { 94, 94, 94, 94, 34, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st24[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st25[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st26[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st27[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st28[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st29[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st30[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st31[42] = { 94, 94, 94, 94, 94, 94, 94, 35, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 35, 94, 94, 36, 36, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st32[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 37, 37, 37, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st33[42] = { 94, 94, 94, 94, 94, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st34[42] = { 94, 94, 94, 94, 39, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st35[42] = { 94, 94, 94, 94, 94, 94, 40, 94, 94, 40, 94, 40, 40, 94, 94, 94, 94, 94, 94, 40, 94, 40, 94, 40, 40, 40, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st36[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 36, 36, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st37[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 37, 37, 37, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st38[42] = { 94, 94, 94, 94, 94, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st39[42] = { 94, 94, 94, 94, 94, 41, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 42, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st40[42] = { 94, 94, 94, 94, 94, 94, 40, 94, 94, 40, 94, 40, 40, 94, 94, 94, 94, 94, 94, 40, 94, 40, 94, 40, 40, 40, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st41[42] = { 94, 94, 94, 94, 94, 94, 43, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st42[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 44, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st43[42] = { 94, 94, 94, 94, 94, 94, 94, 45, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st44[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 46, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st45[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 47, 94, 94, 48, 94, 94, 94, 94, 94, 49, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st46[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 50, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st47[42] = { 94, 94, 94, 94, 94, 94, 51, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st48[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 52, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st49[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 53, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st50[42] = { 94, 94, 94, 94, 94, 94, 54, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st51[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 55, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st52[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 56, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st53[42] = { 94, 94, 94, 94, 94, 94, 57, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st54[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 58, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st55[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 59, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st56[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 60, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st57[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 61, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st58[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 62, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st59[42] = { 94, 94, 94, 94, 94, 94, 63, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st60[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 64, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st61[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 65, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st62[42] = { 94, 94, 94, 94, 94, 66, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st63[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 67, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st64[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 68, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st65[42] = { 94, 94, 94, 94, 94, 94, 94, 69, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st66[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 70, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st67[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st68[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st69[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st70[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 71, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st71[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 72, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st72[42] = { 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st73[8] = { 74, 75, 76, 77, 78, 79, 79, 94 }; static DfaState st74[8] = { 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st75[8] = { 94, 80, 94, 94, 94, 94, 94, 94 }; static DfaState st76[8] = { 94, 81, 94, 94, 94, 94, 94, 94 }; static DfaState st77[8] = { 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st78[8] = { 94, 94, 94, 94, 82, 83, 94, 94 }; static DfaState st79[8] = { 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st80[8] = { 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st81[8] = { 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st82[8] = { 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st83[8] = { 94, 94, 94, 94, 94, 94, 94, 94 }; static DfaState st84[6] = { 85, 86, 87, 88, 87, 94 }; static DfaState st85[6] = { 94, 94, 94, 94, 94, 94 }; static DfaState st86[6] = { 94, 94, 89, 94, 94, 94 }; static DfaState st87[6] = { 94, 94, 94, 94, 94, 94 }; static DfaState st88[6] = { 94, 94, 94, 94, 94, 94 }; static DfaState st89[6] = { 94, 94, 94, 94, 94, 94 }; static DfaState st90[4] = { 91, 92, 93, 94 }; static DfaState st91[4] = { 94, 94, 94, 94 }; static DfaState st92[4] = { 94, 94, 94, 94 }; static DfaState st93[4] = { 94, 94, 94, 94 }; DfaState *dfa[94] = { st0, st1, st2, st3, st4, st5, st6, st7, st8, st9, st10, st11, st12, st13, st14, st15, st16, st17, st18, st19, st20, st21, st22, st23, st24, st25, st26, st27, st28, st29, st30, st31, st32, st33, st34, st35, st36, st37, st38, st39, st40, st41, st42, st43, st44, st45, st46, st47, st48, st49, st50, st51, st52, st53, st54, st55, st56, st57, st58, st59, st60, st61, st62, st63, st64, st65, st66, st67, st68, st69, st70, st71, st72, st73, st74, st75, st76, st77, st78, st79, st80, st81, st82, st83, st84, st85, st86, st87, st88, st89, st90, st91, st92, st93 }; DfaState accepts[95] = { 0, 1, 2, 3, 4, 33, 33, 33, 33, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0, 2, 5, 11, 12, 32, 31, 30, 29, 27, 28, 24, 26, 6, 0, 0, 24, 26, 6, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 10, 0, 0, 9, 0, 34, 36, 38, 39, 42, 42, 35, 37, 41, 40, 0, 43, 46, 46, 45, 44, 0, 47, 48, 49, 0 }; void (*actions[50])() = { zzerraction, act1, act2, act3, act4, act5, act6, act7, act8, act9, act10, act11, act12, act13, act14, act15, act16, act17, act18, act19, act20, act21, act22, act23, act24, act25, act26, act27, act28, act29, act30, act31, act32, act33, act34, act35, act36, act37, act38, act39, act40, act41, act42, act43, act44, act45, act46, act47, act48, act49 }; static DfaState dfa_base[] = { 0, 73, 84, 90 }; static unsigned char *b_class_no[] = { shift0, shift1, shift2, shift3 }; #define ZZSHIFT(c) (b_class_no[zzauto][1+c]) #define MAX_MODE 4 #include "dlgauto.h" gtkwave-3.3.86/contrib/pccts/dlg/relabel.c0000664000175000017500000001312513166335473017702 0ustar bybellbybell/* This group of functions does the character class compression. It goes over the dfa and relabels the arcs with the partitions of characters in the NFA. The partitions are stored in the array class. * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * DLG 1.33 * Will Cohen * With mods by Terence Parr; AHPCRC, University of Minnesota * 1989-2001 */ #include #include "dlg.h" #ifdef MEMCHK #include "trax.h" #else #ifdef __STDC__ #include #else #include #endif /* __STDC__ */ #endif int class_no = CHAR_RANGE; /* number of classes for labels */ int first_el[CHAR_RANGE]; /* first element in each class partition */ set class_sets[CHAR_RANGE]; /* array holds partitions from class */ /* compression */ /* goes through labels on NFA graph and partitions the characters into * character classes. This reduces the amount of space required for each * dfa node, since only one arc is required each class instead of one arc * for each character * level: * 0 no compression done * 1 remove unused characters from classes * 2 compress equivalent characters into same class * * returns the number of character classes required */ #ifdef __USE_PROTOS int relabel(nfa_node* start,int level) #else int relabel(start,level) int level; nfa_node *start; #endif { if (level){ set_free(used_classes); partition(start,level); label_with_classes(start); }else{ /* classes equivalent to all characters in alphabet */ class_no = CHAR_RANGE; } return class_no; } /* makes character class sets for new labels */ #ifdef __USE_PROTOS void partition(nfa_node* start,int level) #else void partition(start,level) nfa_node *start; /* beginning of nfa graph */ int level; /* compression level to uses */ #endif { set current_class; set unpart_chars; set temp; unpart_chars = set_dup(used_chars); #if 0 /* EOF (-1+1) alway in class 0 */ class_sets[0] = set_of(0); first_el[0] = 0; used_classes = set_of(0); temp = set_dif(unpart_chars, class_sets[0]); set_free(unpart_chars); unpart_chars = temp; class_no = 1; #else class_no = 0; #endif while (!set_nil(unpart_chars)){ /* don't look for equivalent labels if c <= 1 */ if (level <= 1){ current_class = set_of(set_int(unpart_chars)); }else{ current_class = set_dup(unpart_chars); intersect_nfa_labels(start,¤t_class); } set_orel(class_no,&used_classes); first_el[class_no] = set_int(current_class); class_sets[class_no] = current_class; temp = set_dif(unpart_chars,current_class); set_free(unpart_chars); unpart_chars = temp; ++class_no; } /* free unpart_chars -ATG 5/6/95 */ set_free(unpart_chars); #if 0 /* group all the other unused characters into a class */ set_orel(class_no,&used_classes); first_el[class_no] = set_int(current_class); class_sets[class_no] = set_dif(normal_chars,used_chars); ++class_no; #endif } /* given pointer to beginning of graph and recursively walks it trying * to find a maximal partition. This partion in returned in maximal_class */ #ifdef __USE_PROTOS void intersect_nfa_labels(nfa_node* start,set* maximal_class) #else void intersect_nfa_labels(start,maximal_class) nfa_node *start; set *maximal_class; #endif { /* pick a new operation number */ ++operation_no; r_intersect(start,maximal_class); } #ifdef __USE_PROTOS void r_intersect(nfa_node* start,set* maximal_class) #else void r_intersect(start,maximal_class) nfa_node *start; set * maximal_class; #endif { set temp; if(start && start->nfa_set != operation_no) { start->nfa_set = operation_no; temp = set_and(*maximal_class,start->label); if (!set_nil(temp)) { set_free(*maximal_class); *maximal_class = temp; }else{ set_free(temp); } r_intersect(start->trans[0],maximal_class); r_intersect(start->trans[1],maximal_class); } } /* puts class labels in place of old character labels */ #ifdef __USE_PROTOS void label_with_classes(nfa_node* start) #else void label_with_classes(start) nfa_node *start; #endif { ++operation_no; label_node(start); } #ifdef __USE_PROTOS void label_node(nfa_node *start) #else void label_node(start) nfa_node *start; #endif { set new_label; register int i; /* only do node if it hasn't been done before */ if (start && start->nfa_set != operation_no){ start->nfa_set = operation_no; new_label = empty; for (i = 0; ilabel)) set_orel(i,&new_label); } set_free(start->label); start->label = new_label; /* do any nodes that can be reached from this one */ label_node(start->trans[0]); label_node(start->trans[1]); } } gtkwave-3.3.86/contrib/pccts/dlg/DlgMSVC50.dsp0000664000175000017500000001410613166335473020204 0ustar bybellbybell# Microsoft Developer Studio Project File - Name="DLG" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 5.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=DLG - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "DlgMSVC50.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "DlgMSVC50.mak" CFG="DLG - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "DLG - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "DLG - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "DLG - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "." # PROP Intermediate_Dir "." # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /W3 /O2 /I "..\h" /I "..\support\set" /D "__STDC__" /D "NDEBUG" /D "LONGFILENAMES" /D "PC" /D "USER_ZZSYN" /D ZZLEXBUFSIZE=65536 /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FD /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"./Dlg.exe" # Begin Special Build Tool SOURCE=$(InputPath) PostBuild_Desc=Copy to ..\bin directory PostBuild_Cmds=mkdir ..\bin copy ..\bin\dlg.exe dlg_old.exe copy dlg.exe\ ..\bin\. # End Special Build Tool !ELSEIF "$(CFG)" == "DLG - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "." # PROP Intermediate_Dir "." # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /W3 /Gm /Zi /Od /I "..\h" /I "..\support\set" /D "__STDC__" /D "LONGFILENAMES" /D "PC" /D "USER_ZZSYN" /D ZZLEXBUFSIZE=65536 /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FD /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"./Dlg.exe" /pdbtype:sept # Begin Special Build Tool SOURCE=$(InputPath) PostBuild_Desc=Copy to ..\bin directory PostBuild_Cmds=mkdir ..\bin copy ..\bin\dlg.exe dlg_old.exe copy dlg.exe\ ..\bin\. # End Special Build Tool !ENDIF # Begin Target # Name "DLG - Win32 Release" # Name "DLG - Win32 Debug" # Begin Source File SOURCE=.\automata.c # End Source File # Begin Source File SOURCE=.\dlg_a.c # End Source File # Begin Source File SOURCE=.\dlg_p.c !IF "$(CFG)" == "DLG - Win32 Release" !ELSEIF "$(CFG)" == "DLG - Win32 Debug" # SUBTRACT CPP /YX !ENDIF # End Source File # Begin Source File SOURCE=.\dlg_p.g !IF "$(CFG)" == "DLG - Win32 Release" # Begin Custom Build - Building DLG Parser from ANTLR Grammar InputPath=.\dlg_p.g InputName=dlg_p BuildCmds= \ ..\bin\antlr $(InputName).g -gh \ ..\bin\dlg -C2 parser.dlg dlg_a.c \ "dlg_a.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "dlg_p.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "err.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "mode.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "parser.dlg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "tokens.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "stdpccts.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) # End Custom Build !ELSEIF "$(CFG)" == "DLG - Win32 Debug" # Begin Custom Build - Building DLG Parser from ANTLR Grammar InputPath=.\dlg_p.g InputName=dlg_p BuildCmds= \ ..\bin\antlr $(InputName).g -gh \ ..\bin\dlg -C2 parser.dlg dlg_a.c \ "dlg_a.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "dlg_p.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "err.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "mode.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "parser.dlg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "tokens.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "stdpccts.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\err.c # End Source File # Begin Source File SOURCE=.\main.c # End Source File # Begin Source File SOURCE=.\output.c # End Source File # Begin Source File SOURCE=.\relabel.c # End Source File # Begin Source File SOURCE=..\support\set\set.c # End Source File # Begin Source File SOURCE=.\support.c # End Source File # End Target # End Project gtkwave-3.3.86/contrib/pccts/dlg/tokens.h0000664000175000017500000000424413166335473017606 0ustar bybellbybell#ifndef tokens_h #define tokens_h /* tokens.h -- List of labelled tokens and stuff * * Generated from: ./dlg_p.g * * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001 * Purdue University Electrical Engineering * ANTLR Version 1.33MR33 */ #define zzEOF_TOKEN 1 #define L_EOF 4 #define PER_PER 5 #define NAME_PER_PER 6 #define LEXMEMBER 7 #define LEXACTION 8 #define PARSERCLASS 9 #define LEXPREFIX 10 #define ACTION 11 #define GREAT_GREAT 12 #define L_BRACE 13 #define R_BRACE 14 #define L_PAR 15 #define R_PAR 16 #define L_BRACK 17 #define R_BRACK 18 #define ZERO_MORE 19 #define ONE_MORE 20 #define OR 21 #define RANGE 22 #define NOT 23 #define OCTAL_VALUE 24 #define HEX_VALUE 25 #define DEC_VALUE 26 #define TAB 27 #define NL 28 #define CR 29 #define BS 30 #define CONTINUATION 31 #define LIT 32 #define REGCHAR 33 #ifdef __USE_PROTOS void grammar(void); #else extern void grammar(); #endif #ifdef __USE_PROTOS void start_states(void); #else extern void start_states(); #endif #ifdef __USE_PROTOS void do_conversion(void); #else extern void do_conversion(); #endif #ifdef __USE_PROTOS void rule_list(void); #else extern void rule_list(); #endif #ifdef __USE_PROTOS void rule(void); #else extern void rule(); #endif #ifdef __USE_PROTOS void reg_expr(void); #else extern void reg_expr(); #endif #ifdef __USE_PROTOS void and_expr(void); #else extern void and_expr(); #endif #ifdef __USE_PROTOS void repeat_expr(void); #else extern void repeat_expr(); #endif #ifdef __USE_PROTOS void expr(void); #else extern void expr(); #endif #ifdef __USE_PROTOS void atom_list(void); #else extern void atom_list(); #endif #ifdef __USE_PROTOS void near_atom(void); #else extern void near_atom(); #endif #ifdef __USE_PROTOS void atom(void); #else extern void atom(); #endif #ifdef __USE_PROTOS void anychar(void); #else extern void anychar(); #endif #endif extern SetWordType zzerr1[]; extern SetWordType zzerr2[]; extern SetWordType zzerr3[]; extern SetWordType setwd1[]; extern SetWordType zzerr4[]; extern SetWordType zzerr5[]; extern SetWordType zzerr6[]; extern SetWordType setwd2[]; extern SetWordType zzerr7[]; extern SetWordType zzerr8[]; extern SetWordType zzerr9[]; extern SetWordType setwd3[]; gtkwave-3.3.86/contrib/pccts/dlg/watdlg.mak0000664000175000017500000000166213166335473020107 0ustar bybellbybellSET=..\support\set PCCTS_H=..\h # # Watcom # CC=wcl386 ANTLR=..\bin\antlr DLG=..\bin\dlg CFLAGS= -I. -I$(SET) -I$(PCCTS_H) -DUSER_ZZSYN -DPC LIBS= OBJ_EXT = obj LINK = wcl386 .c.obj : $(CC) -c $[* $(CFLAGS) dlg.exe : dlg_p.obj dlg_a.obj main.obj err.obj set.obj support.obj & output.obj relabel.obj automata.obj $(LINK) -fe=dlg.exe *.obj -k14336 copy *.exe ..\bin SRC = dlg_p.c dlg_a.c main.c err.c $(SET)\set.c support.c output.c & relabel.c automata.c dlg_p.c parser.dlg err.c tokens.h : dlg_p.g $(ANTLR) dlg_p.g dlg_a.c mode.h : parser.dlg $(DLG) -C2 parser.dlg dlg_a.c dlg_p.$(OBJ_EXT) : dlg_p.c dlg.h tokens.h mode.h $(CC) $(CFLAGS) -c dlg_p.c dlg_a.$(OBJ_EXT) : dlg_a.c dlg.h tokens.h mode.h $(CC) $(CFLAGS) -c dlg_a.c main.$(OBJ_EXT) : main.c dlg.h $(CC) $(CFLAGS) -c main.c set.$(OBJ_EXT) : $(SET)\set.c $(CC) -c $(CFLAGS) $(SET)\set.c #clean up all the intermediate files clean: del *.$(OBJ_EXT) EOF_watdlg.mak gtkwave-3.3.86/contrib/pccts/dlg/DlgMSVC60.dsp0000664000175000017500000001417213166335473020210 0ustar bybellbybell# Microsoft Developer Studio Project File - Name="DLG" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=DLG - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "DlgMSVC60.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "DlgMSVC60.mak" CFG="DLG - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "DLG - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "DLG - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "DlgMSVC60" # PROP Scc_LocalPath ".." CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "DLG - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "." # PROP Intermediate_Dir "." # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /W3 /O2 /I "..\h" /I "..\support\set" /D "__STDC__" /D "NDEBUG" /D "LONGFILENAMES" /D "PC" /D "USER_ZZSYN" /D ZZLEXBUFSIZE=65536 /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FD /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"./Dlg.exe" # Begin Special Build Tool SOURCE="$(InputPath)" PostBuild_Desc=Copy to ..\bin directory PostBuild_Cmds=mkdir ..\bin copy ..\bin\dlg.exe dlg_old.exe copy dlg.exe ..\bin\. # End Special Build Tool !ELSEIF "$(CFG)" == "DLG - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "." # PROP Intermediate_Dir "." # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /W3 /Gm /ZI /Od /I "..\h" /I "..\support\set" /D "__STDC__" /D "LONGFILENAMES" /D "PC" /D "USER_ZZSYN" /D ZZLEXBUFSIZE=65536 /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FR /FD /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"./Dlg.exe" /pdbtype:sept # Begin Special Build Tool SOURCE="$(InputPath)" PostBuild_Desc=Copy to ..\bin directory PostBuild_Cmds=mkdir ..\bin copy ..\bin\dlg.exe dlg_old.exe copy dlg.exe ..\bin\. # End Special Build Tool !ENDIF # Begin Target # Name "DLG - Win32 Release" # Name "DLG - Win32 Debug" # Begin Source File SOURCE=.\automata.c # End Source File # Begin Source File SOURCE=.\dlg_a.c # End Source File # Begin Source File SOURCE=.\dlg_p.c !IF "$(CFG)" == "DLG - Win32 Release" !ELSEIF "$(CFG)" == "DLG - Win32 Debug" # SUBTRACT CPP /YX !ENDIF # End Source File # Begin Source File SOURCE=.\dlg_p.g !IF "$(CFG)" == "DLG - Win32 Release" # Begin Custom Build - Building DLG Parser from ANTLR Grammar InputPath=.\dlg_p.g InputName=dlg_p BuildCmds= \ ..\bin\antlr $(InputName).g -gh \ ..\bin\dlg -C2 parser.dlg dlg_a.c \ "dlg_a.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "dlg_p.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "err.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "mode.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "parser.dlg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "tokens.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "stdpccts.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) # End Custom Build !ELSEIF "$(CFG)" == "DLG - Win32 Debug" # Begin Custom Build - Building DLG Parser from ANTLR Grammar InputPath=.\dlg_p.g InputName=dlg_p BuildCmds= \ ..\bin\antlr $(InputName).g -gh \ ..\bin\dlg -C2 parser.dlg dlg_a.c \ "dlg_a.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "dlg_p.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "err.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "mode.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "parser.dlg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "tokens.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "stdpccts.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\err.c # End Source File # Begin Source File SOURCE=.\main.c # End Source File # Begin Source File SOURCE=.\output.c # End Source File # Begin Source File SOURCE=.\relabel.c # End Source File # Begin Source File SOURCE=..\support\set\set.c # End Source File # Begin Source File SOURCE=.\support.c # End Source File # End Target # End Project gtkwave-3.3.86/contrib/pccts/dlg/dlg.h0000664000175000017500000002214413166335473017050 0ustar bybellbybell/* dlg header file * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * DLG 1.33 * Will Cohen * With mods by Terence Parr; AHPCRC, University of Minnesota * 1989-2001 */ /* MR1 Move pcctscfg.h to top of file */ #include "pcctscfg.h" /* turn off warnings for unreferenced labels */ #ifdef _MSC_VER #pragma warning(disable:4102) #endif #include "set.h" #define TRUE 1 #define FALSE 0 /***** output related stuff *******************/ #define IN input_stream #define OUT output_stream #define MAX_MODES 50 /* number of %%names allowed */ #define MAX_ON_LINE 10 #define NFA_MIN 64 /* minimum nfa_array size */ #define DFA_MIN 64 /* minimum dfa_array size */ #define DEFAULT_CLASSNAME "DLGLexer" /* these macros allow the size of the character set to be easily changed */ /* NOTE: do NOT change MIN_CHAR since EOF is the lowest char, -1 */ #define MIN_CHAR (-1) /* lowest possible character possible on input */ #define MAX_CHAR 255 /* highest possible character possible on input */ #define CHAR_RANGE (1+(MAX_CHAR) - (MIN_CHAR)) /* indicates that the not an "array" reference */ #define NIL_INDEX 0 /* size of hash table used to find dfa_states quickly */ #define HASH_SIZE 211 #define nfa_node struct _nfa_node nfa_node { int node_no; int nfa_set; int accept; /* what case to use */ nfa_node *trans[2]; set label; /* one arc always labelled with epsilon */ }; #define dfa_node struct _dfa_node dfa_node { int node_no; int dfa_set; int alternatives; /* used for interactive mode */ /* are more characters needed */ int done; set nfa_states; int trans[1];/* size of transition table depends on * number of classes required for automata. */ }; /******** macros for accessing the NFA and DFA nodes ****/ #define NFA(x) (nfa_array[x]) #define DFA(x) (dfa_array[x]) #define DFA_NO(x) ( (x) ? (x)->node_no : NIL_INDEX) #define NFA_NO(x) ( (x) ? (x)->node_no : NIL_INDEX) /******** wrapper for memory checking ***/ /*#define malloc(x) dlg_malloc((x),__FILE__,__LINE__)*/ /*#define calloc(x,y) dlg_calloc((x),(y),__FILE__,__LINE__)*/ /******** antlr attributes *************/ typedef struct { unsigned char letter; nfa_node *l,*r; set label; } Attrib; #define zzcr_attr(attr, token, text) { \ (attr)->letter = text[0]; (attr)->l = NULL; \ (attr)->r = NULL; (attr)->label = empty; \ } #define zzd_attr(a) set_free((a)->label); /******************** Variable ******************************/ extern char program[]; /* tells what program this is */ extern char version[]; /* tells what version this is */ extern char *file_str[]; /* file names being used */ extern int err_found; /* flag to indicate error occured */ extern int action_no; /* last action function printed */ extern int func_action; /* should actions be turned into functions?*/ extern set used_chars; /* used to label trans. arcs */ extern set used_classes; /* classes or chars used to label trans. arcs */ extern int class_no; /* number of classes used */ extern set class_sets[]; /* shows char. in each class */ extern set normal_chars; /* mask off unused portion of set */ extern int comp_level; /* what compression level to use */ extern int interactive; /* interactive scanner (avoid lookahead)*/ extern int mode_counter; /* keeps track of the number of %%name */ extern int dfa_basep[]; /* start of each group of dfa */ extern int dfa_class_nop[];/* number of transistion arcs in */ /* each dfa in each mode */ extern int nfa_allocated; extern int dfa_allocated; extern nfa_node **nfa_array; /* start of nfa "array" */ extern dfa_node **dfa_array; /* start of dfa "array" */ extern int operation_no; /* unique number for each operation */ extern FILE *input_stream; /* where description read from */ extern FILE *output_stream; /* where to put the output */ extern FILE *mode_stream; /* where to put the mode output */ extern FILE *class_stream; extern char *mode_file; /* name of file for mode output */ extern int gen_ansi; /* produce ansi compatible code */ extern int case_insensitive;/* ignore case of input spec. */ extern int warn_ambig; /* show if regular expressions ambiguous */ extern int gen_cpp; extern char *cl_file_str; extern int firstLexMember; /* MR1 */ extern char *OutputDirectory; extern char *class_name; /******************** Functions ******************************/ #ifdef __USE_PROTOS extern char *dlg_malloc(int, char *, int); /* wrapper malloc */ extern char *dlg_calloc(int, int, char *, int); /* wrapper calloc */ extern int reach(unsigned *, register int, unsigned *); extern set closure(set *, unsigned *); extern dfa_node *new_dfa_node(set); extern nfa_node *new_nfa_node(void); extern dfa_node *dfastate(set); extern dfa_node **nfa_to_dfa(nfa_node *); extern void internal_error(char *, char *, int); /* MR9 23-Sep-97 */ extern FILE *read_stream(char *); /* opens file for reading */ extern FILE *write_stream(char *); /* opens file for writing */ extern void make_nfa_model_node(void); extern void make_dfa_model_node(int); extern char *ClassName(char *); extern char *OutMetaName(char *); extern void error(char*, int); extern void warning(char*, int); extern void p_head(void); extern void p_class_hdr(void); extern void p_includes(void); extern void p_tables(void); extern void p_tail(void); /* MR1 */ extern void p_class_def1(void); /* MR1 */ extern void new_automaton_mode(void); /* MR1 */ extern int relabel(nfa_node *,int); /* MR1 */ extern void p_shift_table(int); /* MR1 */ extern void p_bshift_table(void); /* MR1 */ extern void p_class_table(void); /* MR1 */ extern void p_mode_def(char *,int); /* MR1 */ extern void init(void); /* MR1 */ extern void p_class_def2(void); /* MR1 */ extern void clear_hash(void); /* MR1 */ extern void p_alternative_table(void); /* MR1 */ extern void p_node_table(void); /* MR1 */ extern void p_dfa_table(void); /* MR1 */ extern void p_accept_table(void); /* MR1 */ extern void p_action_table(void); /* MR1 */ extern void p_base_table(void); /* MR1 */ extern void p_single_node(int,int); /* MR1 */ extern char * minsize(int); /* MR1 */ extern void close1(nfa_node *,int,set *); /* MR1 */ extern void partition(nfa_node *,int); /* MR1 */ extern void intersect_nfa_labels(nfa_node *,set *); /* MR1 */ extern void r_intersect(nfa_node *,set *); /* MR1 */ extern void label_node(nfa_node *); /* MR1 */ extern void label_with_classes(nfa_node *); /* MR1 */ #else extern char *dlg_malloc(); /* wrapper malloc */ extern char *dlg_calloc(); /* wrapper calloc */ extern int reach(); extern set closure(); extern dfa_node *new_dfa_node(); extern nfa_node *new_nfa_node(); extern dfa_node *dfastate(); extern dfa_node **nfa_to_dfa(); extern void internal_error(); /* MR9 23-Sep-97 */ extern FILE *read_stream(); /* opens file for reading */ extern FILE *write_stream(); /* opens file for writing */ extern void make_nfa_model_node(); extern void make_dfa_model_node(); extern char *ClassName(); extern char *OutMetaName(); extern void error(); extern void warning(); extern void p_head(); /* MR9 */ extern void p_class_hdr(); /* MR9 */ extern void p_includes(); /* MR9 */ extern void p_tables(); /* MR9 */ extern void p_tail(); /* MR1 */ extern void p_class_def1(); /* MR1 */ extern void new_automaton_mode(); /* MR1 */ extern int relabel(); /* MR1 */ extern void p_shift_table(); /* MR1 */ extern void p_bshift_table(); /* MR1 */ extern void p_class_table(); /* MR1 */ extern void p_mode_def(); /* MR1 */ extern void init(); /* MR1 */ extern void p_class_def2(); /* MR1 */ extern void clear_hash(); /* MR1 */ extern void p_alternative_table(); /* MR1 */ extern void p_node_table(); /* MR1 */ extern void p_dfa_table(); /* MR1 */ extern void p_accept_table(); /* MR1 */ extern void p_action_table(); /* MR1 */ extern void p_base_table(); /* MR1 */ extern void p_single_node(); /* MR1 */ extern char * minsize(); /* MR1 */ extern void close1(); /* MR1 */ extern void partition(); /* MR1 */ extern void intersect_nfa_labels(); /* MR1 */ extern void r_intersect(); /* MR1 */ extern void label_node(); /* MR1 */ extern void label_with_classes(); /* MR1 */ #endif gtkwave-3.3.86/contrib/pccts/dlg/automata.c0000664000175000017500000001766613166335473020125 0ustar bybellbybell/* Automata conversion functions for DLG * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * DLG 1.33 * Will Cohen * With mods by Terence Parr; AHPCRC, University of Minnesota * 1989-2001 */ #include #include "pcctscfg.h" #include "dlg.h" #ifdef MEMCHK #include "trax.h" #else #ifdef __STDC__ #include #else #include #endif /* __STDC__ */ #endif #define hash_list struct _hash_list_ hash_list{ hash_list *next; /* next thing in list */ dfa_node *node; }; int dfa_allocated = 0; /* keeps track of number of dfa nodes */ dfa_node **dfa_array; /* root of binary tree that stores dfa array */ dfa_node *dfa_model_node; hash_list *dfa_hash[HASH_SIZE]; /* used to quickly find */ /* desired dfa node */ void #ifdef __USE_PROTOS make_dfa_model_node(int width) #else make_dfa_model_node(width) int width; #endif { register int i; dfa_model_node = (dfa_node*) malloc(sizeof(dfa_node) + sizeof(int)*width); dfa_model_node->node_no = -1; /* impossible value for real dfa node */ dfa_model_node->dfa_set = 0; dfa_model_node->alternatives = FALSE; dfa_model_node->done = FALSE; dfa_model_node->nfa_states = empty; for(i = 0; itrans[i] = NIL_INDEX; } } /* adds a new nfa to the binary tree and returns a pointer to it */ dfa_node * #ifdef __USE_PROTOS new_dfa_node(set nfa_states) #else new_dfa_node(nfa_states) set nfa_states; #endif { register int j; register dfa_node *t; static int dfa_size=0; /* elements dfa_array[] can hold */ ++dfa_allocated; if (dfa_size<=dfa_allocated){ /* need to redo array */ if (!dfa_array){ /* need some to do inital allocation */ dfa_size=dfa_allocated+DFA_MIN; dfa_array=(dfa_node **) malloc(sizeof(dfa_node*)* dfa_size); }else{ /* need more space */ dfa_size=2*(dfa_allocated+1); dfa_array=(dfa_node **) realloc(dfa_array, sizeof(dfa_node*)*dfa_size); } } /* fill out entry in array */ t = (dfa_node*) malloc(sizeof(nfa_node)+sizeof(int)*class_no); *t = *dfa_model_node; for (j=0; jtrans[j] = NIL_INDEX; t->node_no = dfa_allocated; t->nfa_states = set_dup(nfa_states); dfa_array[dfa_allocated] = t; return t; } /* past a pointer to the start start of the nfa graph * nfa_to_dfa convers this graph to dfa. The function returns * a pointer to the first dfa state. * NOTE: The function that prints out the table will have to figure out how * to find the other dfa states given the first dfa_state and the number of dfa * nodes allocated */ dfa_node ** #ifdef __USE_PROTOS nfa_to_dfa(nfa_node *start) #else nfa_to_dfa(start) nfa_node *start; #endif { register dfa_node *d_state, *trans_d_state; register int a; set t; int last_done; unsigned *nfa_list; unsigned *reach_list; reach_list = (unsigned *) malloc((2+nfa_allocated)*sizeof(unsigned)); if (!start) return NULL; t = set_of(NFA_NO(start)); _set_pdq(t,reach_list); closure(&t,reach_list); /* Make t a dfa state */ d_state = dfastate(t); last_done = DFA_NO(d_state); do { /* Mark dfa state x as "done" */ d_state->done = TRUE; nfa_list = set_pdq(d_state->nfa_states); for (a = 0; at, labeled with a */ d_state->trans[a] = DFA_NO(trans_d_state); d_state->alternatives = TRUE; } } free(nfa_list); ++last_done; /* move forward in queue */ /* And so forth until nothing isn't done */ d_state = DFA(last_done); } while (last_done<=dfa_allocated); free(reach_list); set_free(t); /* returns pointer to the array that holds the automaton */ return dfa_array; } void #ifdef __USE_PROTOS clear_hash(void) #else clear_hash() #endif { register int i; for(i=0; inext; } total+=j; fprintf(f,"bin[%d] has %d\n",i,j); } fprintf(f,"total = %d\n",total); } #endif /* Returns a pointer to a dfa node that has the same nfa nodes in it. * This may or maynot be a newly created node. */ dfa_node * #ifdef __USE_PROTOS dfastate(set nfa_states) #else dfastate(nfa_states) set nfa_states; #endif { register hash_list *p; int bin; /* hash using set and see if it exists */ bin = set_hash(nfa_states,HASH_SIZE); p = dfa_hash[bin]; while(p && !set_equ(nfa_states,(p->node)->nfa_states)){ p = p->next; } if(!p){ /* next state to add to hash table */ p = (hash_list*)malloc(sizeof(hash_list)); p->node = new_dfa_node(nfa_states); p->next = dfa_hash[bin]; dfa_hash[bin] = p; } return (p->node); } /* this reach assumes the closure has been done already on set */ int #ifdef __USE_PROTOS reach(unsigned *nfa_list, register int a, unsigned *reach_list) #else reach(nfa_list, a, reach_list) unsigned *nfa_list; register int a; unsigned *reach_list; #endif { register unsigned *e; register nfa_node *node; int t=0; e = nfa_list; if (e){ while (*e != nil){ node = NFA(*e); if (set_el(a,node->label)){ t=1; *reach_list=NFA_NO(node->trans[0]); ++reach_list; } ++e; } } *reach_list=nil; return t; } /* finds all the nodes that can be reached by epsilon transitions from the set of a nodes and returns puts them back in set b */ set #ifdef __USE_PROTOS closure(set *b, unsigned *reach_list) #else closure(b, reach_list) set *b; unsigned *reach_list; #endif { register nfa_node *node,*n; /* current node being examined */ register unsigned *e; ++operation_no; #if 0 t = e = set_pdq(*b); #else e=reach_list; #endif while (*e != nil){ node = NFA(*e); set_orel(NFA_NO(node),b); /* mark it done */ node->nfa_set = operation_no; if ((n=node->trans[0]) != NIL_INDEX && set_nil(node->label) && (n->nfa_set != operation_no)){ /* put in b */ set_orel(NFA_NO(n),b); close1(n,operation_no,b); } if ((n=node->trans[1]) != NIL_INDEX && (n->nfa_set != operation_no)){ /* put in b */ set_orel(NFA_NO(node->trans[1]),b); close1(n,operation_no,b); } ++e; } #if 0 free(t); #endif return *b; } #ifdef __USE_PROTOS void close1(nfa_node *node, int o, set *b) #else void close1(node,o,b) nfa_node *node; int o; /* marker to avoid cycles */ set *b; #endif { register nfa_node *n; /* current node being examined */ /* mark it done */ node->nfa_set = o; if ((n=node->trans[0]) != NIL_INDEX && set_nil(node->label) && (n->nfa_set != o)){ /* put in b */ set_orel(NFA_NO(n),b); close1(n,o,b); } if ((n=node->trans[1]) != NIL_INDEX && (n->nfa_set != o)){ /* put in b */ set_orel(NFA_NO(node->trans[1]),b); close1(n,o,b); } } gtkwave-3.3.86/contrib/pccts/dlg/support.c0000664000175000017500000001176613166335473020021 0ustar bybellbybell/* * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * DLG 1.33 * Will Cohen * With mods by Terence Parr; AHPCRC, University of Minnesota * 1989-2001 */ #include #include #include "dlg.h" #ifdef MEMCHK #include "trax.h" #else #ifdef __STDC__ #include #else #include #endif /* __STDC__ */ #endif int err_found = 0; /* indicates whether problem found */ #ifdef __USE_PROTOS void internal_error(char *s, char *file,int line) /* MR9 23-Sep-97 */ #else void internal_error(s,file,line) /* MR9 23-Sep-97 */ char *s,*file; int line; #endif { fprintf(stderr,s,file,line); exit(PCCTS_EXIT_FAILURE); } #ifdef __USE_PROTOS char *dlg_malloc(int bytes,char *file,int line) #else char *dlg_malloc(bytes,file,line) int bytes; char *file; int line; #endif { char *t; t = (char *) malloc(bytes); if (!t){ /* error */ internal_error("%s(%d): unable to allocate memory\n", file,line); } return t; } #ifdef __USE_PROTOS char *dlg_calloc(int n,int bytes,char *file,int line) #else char *dlg_calloc(n,bytes,file,line) int n,bytes; char *file; int line; #endif { char *t; t = (char *) calloc(n,bytes); if (!t){ /* error */ internal_error("%s(%d): unable to allocate memory\n", file,line); } return t; } #ifdef __USE_PROTOS FILE *read_stream(char *name) #else FILE *read_stream(name) char *name; #endif { FILE *f; if (name){ if (name[0] == '-') { fprintf(stderr, "dlg: invalid option: '%s'\n", name); f = NULL; }else{ f = fopen(name, "r"); if (f == NULL){ /* couldn't open file */ fprintf(stderr, "dlg: Warning: Can't read file %s.\n", name); } } }else{ /* open stdin if nothing there */ f = stdin; } return f; } #ifdef __USE_PROTOS FILE *write_stream(char *name) #else FILE *write_stream(name) char *name; #endif { FILE *f; if (name){ if (name[0] == '-') { fprintf(stderr, "dlg: invalid option: '%s'\n", name); f = NULL; }else{ f = fopen(OutMetaName(name), "w"); if (f == NULL){ /* couldn't open file */ fprintf(stderr, "dlg: Warning: Can't write to file %s.\n", name); } else #ifdef SPECIAL_FOPEN special_fopen_actions(OutMetaName(name)); /* MR1 */ #else ; /* MR1 */ #endif } }else{ /* open stdout if nothing there */ f = stdout; } return f; } #ifdef __USE_PROTOS void fatal(char *message,int line_no) #else void fatal(message,line_no) char *message; int line_no; #endif { fprintf(stderr,ErrHdr, (file_str[0] ? file_str[0] : "stdin"), line_no); fprintf(stderr, " Fatal: %s\n", message); exit(PCCTS_EXIT_FAILURE); } #ifdef __USE_PROTOS void error(char *message,int line_no) #else void error(message,line_no) char *message; int line_no; #endif { fprintf(stderr,ErrHdr, (file_str[0] ? file_str[0] : "stdin"), line_no); fprintf(stderr, " Error: %s\n", message); err_found = 1; } #ifdef __USE_PROTOS void warning(char *message,int line_no) #else void warning(message,line_no) char *message; int line_no; #endif { fprintf(stderr,ErrHdr, (file_str[0] ? file_str[0] : "stdin"), line_no); fprintf(stderr, " Warning: %s\n", message); } /* MR10: Jeff Vincent MR10: Changed to remove directory information from n only if MR10: if OutputDirectory was changed by user (-o option) */ #ifdef __USE_PROTOS char *OutMetaName(char *n) #else char *OutMetaName(n) char *n; #endif { static char *dir_sym = DirectorySymbol; static char newname[MaxFileName+1]; char *p; /* If OutputDirectory is same as TopDirectory (platform default) then leave n alone. */ if (strcmp(OutputDirectory, TopDirectory) == 0) return n; /* p will point to filename without path information */ if ((p = strrchr(n, *dir_sym)) != NULL) p++; else p = n; /* Copy new output directory into newname[] */ strcpy(newname, OutputDirectory); /* if new output directory does not have trailing dir_sym, add it! */ if (newname[strlen(newname)-1] != *dir_sym) strcat(newname, dir_sym); /* contatenate FILE NAME ONLY to new output directory */ strcat(newname, p); return newname; } gtkwave-3.3.86/contrib/pccts/dlg/makefile10000664000175000017500000000231613166335473017711 0ustar bybellbybell# # Makefile for DLG 1.33 # Terence Parr # Purdue University, U of MN, Parr Research Corporation # 1989-1994 # # Ported to IBM C-Set/2 and Microsoft 6.0 by # Ed Harfmann # Micro Data Base Systems # Lafayette, Indiana # SET=../support/set PCCTS_H=../h ## ## Uncomment the appropriate section to build ## # # UNIX # CC=cc ANTLR=../bin/antlr DLG=../bin/dlg ANSI=-ansi CFLAGS= -O -I. -I$(SET) -I$(PCCTS_H) -DUSER_ZZSYN $(COTHER) $(ANSI) -DZZLEXBUFSIZE=32000 OBJ_EXT=o OUT_OBJ = -o OBJ = dlg_p.o dlg_a.o main.o err.o set.o support.o output.o \ relabel.o automata.o dlg : $(OBJ) $(SRC) $(CC) $(CFLAGS) -o dlg $(OBJ) mv dlg ../bin SRC = dlg_p.c dlg_a.c main.c err.c $(SET)/set.c support.c output.c \ relabel.c automata.c dlg_p.c parser.dlg err.c tokens.h : dlg_p.g $(ANTLR) dlg_p.g dlg_a.c mode.h : parser.dlg $(DLG) -C2 parser.dlg dlg_a.c dlg_p.$(OBJ_EXT) : dlg_p.c dlg.h tokens.h mode.h $(CC) $(CFLAGS) -c dlg_p.c dlg_a.$(OBJ_EXT) : dlg_a.c dlg.h tokens.h mode.h $(CC) $(CFLAGS) -c dlg_a.c main.$(OBJ_EXT) : main.c dlg.h $(CC) $(CFLAGS) -c main.c set.$(OBJ_EXT) : $(SET)/set.c $(CC) -c $(CFLAGS) $(SET)/set.c lint: lint *.c #clean up all the intermediate files clean: rm -f *.$(OBJ_EXT) core gtkwave-3.3.86/contrib/pccts/dlg/DlgMSVC50.dsw0000664000175000017500000000102713166335473020211 0ustar bybellbybellMicrosoft Developer Studio Workspace File, Format Version 5.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "DLG"=.\DlgMSVC50.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### gtkwave-3.3.86/contrib/pccts/dlg/parser.dlg0000664000175000017500000001351113166335473020113 0ustar bybellbybell<< /* parser.dlg -- DLG Description of scanner * * Generated from: ./dlg_p.g * * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001 * Purdue University Electrical Engineering * With AHPCRC, University of Minnesota * ANTLR Version 1.33MR33 */ #define ANTLR_VERSION 13333 #include "pcctscfg.h" #include "pccts_stdio.h" #include #include "dlg.h" #include "antlr.h" #include "tokens.h" #include "dlgdef.h" LOOKAHEAD void #ifdef __USE_PROTOS zzerraction(void) #else zzerraction() #endif { (*zzerr)("invalid token"); zzadvance(); zzskip(); } >> <<%%lexaction int func_action; /* should actions be turned into functions?*/ int lex_mode_counter = 0; /* keeps track of the number of %%names */ /* MR1 */ /* MR1 11-Apr-97 Provide mechanism for inserting code into DLG class */ /* MR1 via <<%%lexmember...>> */ /* MR1 */ int lexMember = 0; /* <<%%lexmemeber ...>> MR1 */ int lexAction = 0; /* <<%%lexaction ...>> MR1 */ int parserClass = 0; /* <<%%parserclass ...>> MR1 */ int lexPrefix = 0; /* <<%%lexprefix ...>> MR1 */ char theClassName[100]; /* MR11 */ char *pClassName=theClassName; /* MR11 */ int firstLexMember=1; /* MR1 */ #ifdef __USE_PROTOS void xxputc(int c) { /* MR1 */ #else void xxputc(c) /* MR1 */ int c; /* MR1 */ { /* MR1 */ #endif if (parserClass) { /* MR1 */ *pClassName++=c; /* MR1 */ *pClassName=0; /* MR1 */ } else if (lexMember || lexPrefix) { /* MR1 */ if (class_stream != NULL) fputc(c,class_stream); /* MR1 */ } else { /* MR1 */ fputc(c,OUT); /* MR1 */ }; /* MR1 */ } /* MR1 */ #ifdef __USE_PROTOS void xxprintf(char *format,char *string) { /* MR1 */ #else void xxprintf(format,string) /* MR1 */ char *format; /* MR1 */ char *string; /* MR1 */ { /* MR1 */ #endif if (lexMember || lexPrefix || parserClass) { /* MR1 */ if (class_stream != NULL) /* MR1 */ fprintf(class_stream,format,string); /* MR1 */ } else { /* MR1 */ fprintf(OUT,format,string); /* MR1 */ }; /* MR1 */ } /* MR1 */ >> %%START @ << NLA = 1; >> [\r\t\ ]+ << NLA = 2; zzskip(); >> \n << NLA = 3; zzline++; zzskip(); DAWDLE; >> \@ << NLA = L_EOF; >> \%\% << NLA = PER_PER; >> \%\%[a-zA-Z_][a-zA-Z0-9_]* << NLA = NAME_PER_PER; p_mode_def(&zzlextext[2],lex_mode_counter++); >> \<\<\%\%lexmember << NLA = LEXMEMBER; lexMember=1; /* MR1 */ if (firstLexMember != 0) { /* MR1 */ firstLexMember=0; /* MR1 */ p_class_def1(); /* MR1 */ }; /* MR1 */ zzmode(ACT); /* MR1 */ >> \<\<\%\%lexaction << NLA = LEXACTION; lexAction=1;zzmode(ACT); >> \<\<\%\%parserclass << NLA = PARSERCLASS; parserClass=1; /* MR1 */ zzmode(ACT); /* MR1 */ >> \<\<\%\%lexprefix << NLA = LEXPREFIX; lexPrefix=1;zzmode(ACT); >> \<\< << NLA = ACTION; if (func_action) fprintf(OUT,"\n%s %sact%d()\n{ ", gen_cpp?"ANTLRTokenType":"static void", gen_cpp?ClassName("::"):"", ++action_no); zzmode(ACT); zzskip(); >> \>\> << NLA = GREAT_GREAT; >> \{ << NLA = L_BRACE; >> \} << NLA = R_BRACE; >> \( << NLA = L_PAR; >> \) << NLA = R_PAR; >> \[ << NLA = L_BRACK; >> \] << NLA = R_BRACK; >> \* << NLA = ZERO_MORE; >> \+ << NLA = ONE_MORE; >> \| << NLA = OR; >> \- << NLA = RANGE; >> \~ << NLA = NOT; >> \\0[0-7]* << NLA = OCTAL_VALUE; {int t; sscanf(&zzlextext[1],"%o",&t); zzlextext[0] = t;} >> \\0[Xx][0-9a-fA-F]+ << NLA = HEX_VALUE; {int t; sscanf(&zzlextext[3],"%x",&t); zzlextext[0] = t;} >> \\[1-9][0-9]* << NLA = DEC_VALUE; {int t; sscanf(&zzlextext[1],"%d",&t); zzlextext[0] = t;} >> \\t << NLA = TAB; zzlextext[0] = '\t'; >> \\n << NLA = NL; zzlextext[0] = '\n'; >> \\r << NLA = CR; zzlextext[0] = '\r'; >> \\b << NLA = BS; zzlextext[0] = '\b'; >> \\ \n << NLA = CONTINUATION; zzline++; zzskip(); >> \\~[tnrb] << NLA = LIT; zzlextext[0] = zzlextext[1]; >> ~[\\] << NLA = REGCHAR; >> %%ACT @ << NLA = 1; error("unterminated action", zzline); zzmode(START); >> \>\> << NLA = ACTION; if (func_action) fprintf(OUT,"}\n\n"); zzmode(START); /* MR1 */ /* MR1 11-Apr-97 Provide mechanism for inserting code into DLG class */ /* MR1 via <<%%lexmember ...>> */ /* MR1 This is a consequence of not saving actions */ /* MR1 */ /* MR1 */ parserClass=0; /* MR1 */ lexPrefix=0; /* MR1 */ lexAction=0; /* MR1 */ lexMember=0; >> \> << NLA = 34; xxputc(zzlextext[0]); zzskip(); >> \\\> << NLA = 35; xxputc('>'); zzskip(); >> \\ << NLA = 36; xxputc('\\'); zzskip(); >> \n << NLA = 37; xxputc(zzlextext[0]); ++zzline; zzskip(); >> /\* << NLA = 38; zzmode(ACTION_COMMENTS); /* MR1 */ xxprintf("%s", &(zzlextext[0])); zzskip(); /* MR1 */ >> // << NLA = 39; zzmode(ACTION_CPP_COMMENTS); /* MR1 */ xxprintf("%s", &(zzlextext[0])); zzskip(); /* MR1 */ >> ~[] << NLA = 40; xxputc(zzlextext[0]); zzskip(); >> %%ACTION_COMMENTS @ << NLA = 1; >> \*/ << NLA = 41; zzmode(ACT); /* MR1 */ xxprintf("%s", &(zzlextext[0])); zzskip(); /* MR1 */ >> [\n\r] << NLA = 42; zzline++; xxputc(zzlextext[0]); zzskip(); >> ~[] << NLA = 43; xxputc(zzlextext[0]); zzskip(); >> %%ACTION_CPP_COMMENTS @ << NLA = 1; >> [\n\r] << NLA = 44; zzmode(ACT); zzline++; /* MR1 */ xxprintf("%s", &(zzlextext[0])); zzskip(); /* MR1 */ >> ~[] << NLA = 45; xxputc(zzlextext[0]); zzskip(); >> %% gtkwave-3.3.86/contrib/pccts/dlg/DlgMSVC60.dsw0000664000175000017500000000115213166335473020211 0ustar bybellbybellMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "DLG"=.\DlgMSVC60.dsp - Package Owner=<4> Package=<5> {{{ begin source code control DlgMSVC60 .. end source code control }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### gtkwave-3.3.86/contrib/pccts/dlg/dlg1.txt0000664000175000017500000000737213166335473017527 0ustar bybellbybell dlg(1) PCCTS Manual Pages dlg(1) NAME dlg - DFA Lexical Analyzer Generator SYNTAX dlg [_o_p_t_i_o_n_s] _l_e_x_i_c_a_l__s_p_e_c [_o_u_t_p_u_t__f_i_l_e] DESCRIPTION dlg is a tool that produces fast deterministic finite auto- mata for recognizing regular expressions in input. OPTIONS -CC Generate C++ output. The _o_u_t_p_u_t__f_i_l_e is not specified in this case. -C[ level] Where level is the compression level used. 0 indica- tions no compression, 1 removes all unused characters from the transition from table, and 2 maps equivalent characters into the same character classes. It is sug- gested that level -C2 is used, since it will signifi- cantly reduce the size of the dfa produced for lexical analyzer. -m Produces the header file for the lexical mode with a name other than the default name of "mode.h". -i An interactive, or as interactive as possible, parser is produced. A character is only obtained when required to decide which state to go to. Some care must be taken to obtain accept states that do not require look ahead at the next character to determine if that is the stop state. Any regular expression with a Kleene closure at the end is guaranteed to require another character of look ahead. -cl class Specify a class name for DLG to generate. The default is DLGLexer. -ci The automaton will treat upper and lower case charac- ters identically. This is accomplished in the automa- ton; the characters in the lexical buffer are unmodi- fied. -cs Upper and lower case characters are treated as dis- tinct. This is the default. -o dir Directory where output files should go (default="."). This is very nice for keeping the source directory clear of ANTLR and DLG spawn. -Wambiguity Warns if more than one regular expression could match the same character sequence. The warnings give the numbers of the expressions in the dlg lexical specifi- cation file. The numbering of the expressions starts at one. Multiple warnings may be print for the same expressions. - Used in place of file names to get input from standard in or send output to standard out. SPECIAL CONSIDERATIONS _D_l_g works... we think. There is no implicit guarantee of anything. We reserve no legal rights to the software known as the Purdue Compiler Construction Tool Set (PCCTS) - PCCTS is in the public domain. An individual or company may do whatever they wish with source code distributed with PCCTS or the code generated by PCCTS, including the incorporation of PCCTS, or its output, into commercial software. We encourage users to develop software with PCCTS. However, we do ask that credit is given to us for developing PCCTS. By "credit", we mean that if you incorporate our source code into one of your programs (commercial product, research pro- ject, or otherwise) that you acknowledge this fact somewhere in the documentation, research report, etc... If you like PCCTS and have developed a nice tool with the output, please mention that you developed it using PCCTS. As long as these guidelines are followed, we expect to continue enhancing this system and expect to make other tools available as they are completed. FILES mode.h , dlgauto.h , dlgdef.h SEE ALSO antlr(1), pccts(1) BUGS gtkwave-3.3.86/contrib/pccts/dlg/dlg.10000664000175000017500000000656413166335473016771 0ustar bybellbybell.TH dlg 1 "April 1994" "DLG" "PCCTS Manual Pages" .SH NAME dlg \- DFA Lexical Analyzer Generator .SH SYNTAX .LP \fBdlg\fR [\fIoptions\fR] \fIlexical_spec\fR [\fIoutput_file\fR] .SH DESCRIPTION .B dlg is a tool that produces fast deterministic finite automata for recognizing regular expressions in input. .SH OPTIONS .IP "\fB-CC\fR" Generate C++ output. The \fIoutput_file\fP is not specified in this case. .IP "\fB-C\fR[\fP level\fR] Where \fPlevel\fR is the compression level used. 0 indications no compression, 1 removes all unused characters from the transition from table, and 2 maps equivalent characters into the same character classes. It is suggested that level -C2 is used, since it will significantly reduce the size of the dfa produced for lexical analyzer. .IP "\fB-m\fP Produces the header file for the lexical mode with a name other than the default name of "mode.h". .IP \fB-i\fP An interactive, or as interactive as possible, parser is produced. A character is only obtained when required to decide which state to go to. Some care must be taken to obtain accept states that do not require look ahead at the next character to determine if that is the stop state. Any regular expression with a Kleene closure at the end is guaranteed to require another character of look ahead. .IP "\fB-cl\fP class Specify a class name for DLG to generate. The default is DLGLexer. 'class' will be a subclass of DLGLexerBase; only used for -CC. .IP \fB-ci\fP The automaton will treat upper and lower case characters identically. This is accomplished in the automaton; the characters in the lexical buffer are unmodified. .IP \fB-cs\fP Upper and lower case characters are treated as distinct. This is the default. .IP "\fB-o\fP dir Directory where output files should go (default="."). This is very nice for keeping the source directory clear of ANTLR and DLG spawn. .IP \fB-Wambiguity\fP Warns if more than one regular expression could match the same character sequence. The warnings give the numbers of the expressions in the dlg lexical specification file. The numbering of the expressions starts at one. Multiple warnings may be print for the same expressions. .IP \- Used in place of file names to get input from standard in or send output to standard out. .SH "SPECIAL CONSIDERATIONS" .PP \fIDlg\fP works... we think. There is no implicit guarantee of anything. We reserve no \fBlegal\fP rights to the software known as the Purdue Compiler Construction Tool Set (PCCTS) \(em PCCTS is in the public domain. An individual or company may do whatever they wish with source code distributed with PCCTS or the code generated by PCCTS, including the incorporation of PCCTS, or its output, into commercial software. We encourage users to develop software with PCCTS. However, we do ask that credit is given to us for developing PCCTS. By "credit", we mean that if you incorporate our source code into one of your programs (commercial product, research project, or otherwise) that you acknowledge this fact somewhere in the documentation, research report, etc... If you like PCCTS and have developed a nice tool with the output, please mention that you developed it using PCCTS. As long as these guidelines are followed, we expect to continue enhancing this system and expect to make other tools available as they are completed. .SH FILES .B mode.h , .B dlgauto.h , .B dlgdef.h .SH SEE ALSO .BR antlr (1), .BR pccts (1) .SH BUGS gtkwave-3.3.86/contrib/pccts/dlg/main.c0000664000175000017500000001703013166335473017217 0ustar bybellbybell/* Main function for dlg version * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * DLG 1.33 * Will Cohen * With mods by Terence Parr; AHPCRC, University of Minnesota * 1989-2001 */ #include #include "stdpccts.h" char program[] = "dlg"; char version[] = "1.33MR33"; /* MRXXX */ int numfiles = 0; char *file_str[2] = {NULL, NULL}; char *mode_file = "mode.h"; char *class_name = DEFAULT_CLASSNAME; char *OutputDirectory = TopDirectory; /* Option variables */ int comp_level = 0; int interactive = FALSE; int case_insensitive = FALSE; int warn_ambig = FALSE; int gen_cpp = FALSE; #ifdef __USE_PROTOS static int ci_strequ(char *a,char *b) #else static int ci_strequ(a,b) char *a; char *b; #endif { for ( ;*a != 0 && *b != 0; a++, b++) { if (toupper(*a) != toupper(*b)) return 0; } return (*a == *b); } /* Option List Stuff */ #ifdef __USE_PROTOS void p_comp0(void) {comp_level = 0;} void p_comp1(void) {comp_level = 1;} void p_comp2(void) {comp_level = 2;} void p_stdio(void) { file_str[numfiles++] = NULL;} void p_file(char *s) { file_str[numfiles++] = s;} void p_cl_name(char *s, char *t) { if ( gen_cpp ) { class_name = t; } else { warning("-cl only valid in C++ mode; -cl ignored...",0); } } void p_mode_file(char *s, char *t){mode_file=t;} void p_outdir(char *s,char *t) {OutputDirectory=t;} void p_ansi(void) {gen_ansi = TRUE;} void p_interactive(void) {interactive = TRUE;} void p_case_s(void) { case_insensitive = FALSE; } void p_case_i(void) { case_insensitive = TRUE; } void p_warn_ambig(void) { warn_ambig = TRUE; } void p_cpp(void) { gen_cpp = TRUE; } #else void p_comp0() {comp_level = 0;} void p_comp1() {comp_level = 1;} void p_comp2() {comp_level = 2;} void p_stdio() { file_str[numfiles++] = NULL;} void p_file(s) char *s; { file_str[numfiles++] = s;} void p_cl_name(s,t) char *s, *t; { if ( gen_cpp ) { class_name = t; } else { warning("-cl only valid in C++ mode; -cl ignored...",0); } } void p_mode_file(s,t) char *s,*t;{mode_file=t;} void p_outdir(s,t) char *s,*t;{OutputDirectory=t;} void p_ansi() {gen_ansi = TRUE;} void p_interactive() {interactive = TRUE;} void p_case_s() { case_insensitive = FALSE; } void p_case_i() { case_insensitive = TRUE; } void p_warn_ambig() { warn_ambig = TRUE; } void p_cpp() { gen_cpp = TRUE; } #endif #ifdef __cplusplus typedef void (*WildFunc)(...); #else typedef void (*WildFunc)(); #endif typedef struct { char *option; int arg; WildFunc process; char *descr; } Opt; Opt options[] = { { "-CC", 0, (WildFunc)p_cpp, "Generate C++ output" }, { "-C0", 0, (WildFunc)p_comp0, "No compression (default)" }, { "-C1", 0, (WildFunc)p_comp1, "Compression level 1" }, { "-C2", 0, (WildFunc)p_comp2, "Compression level 2" }, { "-ga", 0, (WildFunc)p_ansi, "Generate ansi C"}, { "-Wambiguity", 0, (WildFunc)p_warn_ambig, "Warn if expressions ambiguous"}, { "-m", 1, (WildFunc)p_mode_file, "Rename lexical mode output file"}, { "-i", 0, (WildFunc)p_interactive, "Build interactive scanner (not valid for C++ mode)"}, { "-ci", 0, (WildFunc)p_case_i, "Make lexical analyzer case insensitive"}, { "-cl", 1, (WildFunc)p_cl_name, "Rename lexer class (DLGLexer); only used for -CC"}, { "-cs", 0, (WildFunc)p_case_s, "Make lexical analyzer case sensitive (default)"}, { "-o", 1, (WildFunc)p_outdir, OutputDirectoryOption}, { "-", 0, (WildFunc)p_stdio, "Use standard i/o rather than file"}, { "*", 0, (WildFunc)p_file, ""}, /* anything else is a file */ { NULL, 0, NULL } }; #ifdef __USE_PROTOS void ProcessArgs(int argc, char **argv, Opt *options) #else void ProcessArgs(argc, argv, options) int argc; char **argv; Opt *options; #endif { Opt *p; while ( argc-- > 0 ) { p = options; while ( p->option != NULL ) { if ( strcmp(p->option, "*") == 0 || ci_strequ(p->option,*argv) ) { if ( p->arg ) { (*p->process)( *argv, *(argv+1) ); argv++; argc--; } else (*p->process)( *argv ); break; } p++; } argv++; } } #ifdef __USE_PROTOS int main(int argc, char *argv[]) #else int main(argc, argv) int argc; char *argv[]; #endif { init(); fprintf(stderr, "%s Version %s 1989-2001\n", &(program[0]), &(version[0])); if ( argc == 1 ) { Opt *p = options; fprintf(stderr, "%s [options] f1 f2 ... fn\n",argv[0]); while ( *(p->option) != '*' ) { fprintf(stderr, "\t%s %s\t%s\n", p->option, (p->arg)?"___":" ", p->descr); p++; } }else{ ProcessArgs(argc-1, &(argv[1]), options); if (interactive && gen_cpp) { fprintf(stderr,"\n"); /*** MR21a This statement is wrong ! ***/ #if 0 *** fprintf(stderr,"Interactive lexer option (\"-i\") has no effect when in C++ mode\n"); *** fprintf(stderr,"because of extra buffering provided by ANTLRTokenBuffer class.\n"); *** fprintf(stderr,"\n"); #endif } input_stream = read_stream(file_str[0]); if (input_stream) { /* don't overwrite unless input okay */ if ( gen_cpp ) { output_stream = write_stream(ClassName(CPP_FILE_SUFFIX)); if ( file_str[1]!=NULL ) { warning("output file implicit in C++ mode; ignored...",0); } class_stream = write_stream(ClassName(".h")); mode_stream = class_stream; } else { output_stream = write_stream(file_str[1]); mode_stream = write_stream(mode_file); } } /* make sure that error reporting routines in grammar know what the file really is */ /* make sure that reading and writing somewhere */ if (input_stream && output_stream && mode_stream){ ANTLR(grammar(), input_stream); } p_class_def2(); /* MR1 */ } if ( output_stream!=NULL ) fclose(output_stream); if ( !gen_cpp && mode_stream!=NULL ) fclose(mode_stream); if ( class_stream!=NULL ) fclose(class_stream); exit(PCCTS_EXIT_SUCCESS); return 0; /* get rid of warning message MR1 */ } /* initialize all the variables */ void #ifdef __USE_PROTOS init(void) #else init() #endif { register int i; #ifdef SPECIAL_INITS special_inits(); /* MR1 */ #endif used_chars = empty; used_classes = empty; /* make the valid character set */ normal_chars = empty; /* NOTE: MIN_CHAR is EOF */ /* NOTE: EOF is not quite a valid char, it is special. Skip it*/ for (i = 1; i #include "dlg.h" #define zzSET_SIZE 8 #include "antlr.h" #include "tokens.h" #include "dlgdef.h" #include "mode.h" /* MR23 In order to remove calls to PURIFY use the antlr -nopurify option */ #ifndef PCCTS_PURIFY #define PCCTS_PURIFY(r,s) memset((char *) &(r),'\0',(s)); #endif ANTLR_INFO /* MR20 G. Hobbelt Fix for Borland C++ 4.x & 5.x compiling with ALL warnings enabled */ #ifdef __TURBOC__ #pragma warn -aus /* unused assignment of 'xxx' */ #endif int action_no = 0; /* keep track of actions outputed */ int nfa_allocated = 0; /* keeps track of number of nfa nodes */ nfa_node **nfa_array = NULL;/* root of binary tree that stores nfa array */ nfa_node nfa_model_node; /* model to initialize new nodes */ set used_chars; /* used to label trans. arcs */ set used_classes; /* classes or chars used to label trans. arcs */ set normal_chars; /* mask to get rid elements that aren't used in set */ int flag_paren = FALSE; int flag_brace = FALSE; int mode_counter = 0; /* keep track of number of %%names */ void #ifdef __USE_PROTOS grammar(void) #else grammar() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { p_head(); p_class_hdr(); func_action = FALSE; { zzBLOCK(zztasp2); zzMake0; { while ( (setwd1[LA(1)]&0x1) ) { { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==LEXACTION) ) { zzmatch(LEXACTION); zzCONSUME; } else { if ( (LA(1)==LEXMEMBER) ) { zzmatch(LEXMEMBER); zzCONSUME; } else { if ( (LA(1)==LEXPREFIX) ) { zzmatch(LEXPREFIX); zzCONSUME; } else { if ( (LA(1)==PARSERCLASS) ) { zzmatch(PARSERCLASS); zzCONSUME; } else { if ( (LA(1)==ACTION) ) { } else {zzFAIL(1,zzerr1,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } } } zzEXIT(zztasp3); } } zzmatch(ACTION); zzCONSUME; zzLOOP(zztasp2); } zzEXIT(zztasp2); } } if ( gen_cpp ) p_includes(); start_states(); func_action = FALSE; p_tables(); p_tail(); { zzBLOCK(zztasp2); zzMake0; { while ( (LA(1)==ACTION) ) { zzmatch(ACTION); zzCONSUME; zzLOOP(zztasp2); } zzEXIT(zztasp2); } } zzmatch(1); if (firstLexMember != 0) p_class_def1(); zzCONSUME; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd1, 0x2); } } void #ifdef __USE_PROTOS start_states(void) #else start_states() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==PER_PER) ) { zzmatch(PER_PER); zzCONSUME; do_conversion(); } else { if ( (LA(1)==NAME_PER_PER) ) { zzmatch(NAME_PER_PER); zzCONSUME; do_conversion(); { zzBLOCK(zztasp3); zzMake0; { while ( (LA(1)==NAME_PER_PER) ) { zzmatch(NAME_PER_PER); zzCONSUME; do_conversion(); zzLOOP(zztasp3); } zzEXIT(zztasp3); } } } else {zzFAIL(1,zzerr2,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } zzmatch(PER_PER); zzCONSUME; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd1, 0x4); } } void #ifdef __USE_PROTOS do_conversion(void) #else do_conversion() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { new_automaton_mode(); func_action = TRUE; rule_list(); dfa_class_nop[mode_counter] = relabel(zzaArg(zztasp1,1 ).l,comp_level); if (comp_level) p_shift_table(mode_counter); dfa_basep[mode_counter] = dfa_allocated+1; make_dfa_model_node(dfa_class_nop[mode_counter]); nfa_to_dfa(zzaArg(zztasp1,1 ).l); ++mode_counter; func_action = FALSE; #ifdef HASH_STAT fprint_hash_stats(stderr); #endif zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd1, 0x8); } } void #ifdef __USE_PROTOS rule_list(void) #else rule_list() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { if ( (setwd1[LA(1)]&0x10) ) { rule(); zzaRet.l=zzaArg(zztasp1,1 ).l; zzaRet.r=zzaArg(zztasp1,1 ).r; { zzBLOCK(zztasp2); zzMake0; { while ( (setwd1[LA(1)]&0x20) ) { rule(); {nfa_node *t1; t1 = new_nfa_node(); (t1)->trans[0]=zzaRet.l; (t1)->trans[1]=zzaArg(zztasp2,1 ).l; /* all accept nodes "dead ends" */ zzaRet.l=t1; zzaRet.r=NULL; } zzLOOP(zztasp2); } zzEXIT(zztasp2); } } } else { if ( (setwd1[LA(1)]&0x40) ) { zzaRet.l = new_nfa_node(); zzaRet.r = NULL; warning("no regular expressions", zzline); } else {zzFAIL(1,zzerr3,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd1, 0x80); } } void #ifdef __USE_PROTOS rule(void) #else rule() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { if ( (setwd2[LA(1)]&0x1) ) { reg_expr(); zzmatch(ACTION); if (zzaArg(zztasp1,1 ).r != NULL) { zzaRet.l=zzaArg(zztasp1,1 ).l; zzaRet.r=zzaArg(zztasp1,1 ).r; (zzaArg(zztasp1,1 ).r)->accept=action_no; } zzCONSUME; } else { if ( (LA(1)==ACTION) ) { zzmatch(ACTION); zzaRet.l = NULL; zzaRet.r = NULL; error("no expression for action ", zzline); zzCONSUME; } else {zzFAIL(1,zzerr4,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd2, 0x2); } } void #ifdef __USE_PROTOS reg_expr(void) #else reg_expr() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { and_expr(); zzaRet.l=zzaArg(zztasp1,1 ).l; zzaRet.r=zzaArg(zztasp1,1 ).r; { zzBLOCK(zztasp2); zzMake0; { while ( (LA(1)==OR) ) { zzmatch(OR); zzCONSUME; and_expr(); {nfa_node *t1, *t2; t1 = new_nfa_node(); t2 = new_nfa_node(); (t1)->trans[0]=zzaRet.l; (t1)->trans[1]=zzaArg(zztasp2,2 ).l; /* MR23 */ if (zzaRet.r != NULL) (zzaRet.r)->trans[1]=t2; if (zzaArg(zztasp2,2 ).r) { (zzaArg(zztasp2,2 ).r)->trans[1]=t2; /* MR20 */ } zzaRet.l=t1; zzaRet.r=t2; } zzLOOP(zztasp2); } zzEXIT(zztasp2); } } zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd2, 0x4); } } void #ifdef __USE_PROTOS and_expr(void) #else and_expr() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { repeat_expr(); zzaRet.l=zzaArg(zztasp1,1 ).l; zzaRet.r=zzaArg(zztasp1,1 ).r; { zzBLOCK(zztasp2); zzMake0; { while ( (setwd2[LA(1)]&0x8) ) { repeat_expr(); if (zzaRet.r != NULL) { (zzaRet.r)->trans[1]=zzaArg(zztasp2,1 ).l; zzaRet.r=zzaArg(zztasp2,1 ).r; } zzLOOP(zztasp2); } zzEXIT(zztasp2); } } zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd2, 0x10); } } void #ifdef __USE_PROTOS repeat_expr(void) #else repeat_expr() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { if ( (setwd2[LA(1)]&0x20) ) { expr(); zzaRet.l=zzaArg(zztasp1,1 ).l; zzaRet.r=zzaArg(zztasp1,1 ).r; { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==ZERO_MORE) ) { zzmatch(ZERO_MORE); { nfa_node *t1,*t2; /* MR23 */ if (zzaRet.r != NULL) (zzaRet.r)->trans[0] = zzaRet.l; t1 = new_nfa_node(); t2 = new_nfa_node(); t1->trans[0]=zzaRet.l; t1->trans[1]=t2; /* MR23 */ if (zzaRet.r != NULL) (zzaRet.r)->trans[1]=t2; zzaRet.l=t1;zzaRet.r=t2; } zzCONSUME; } else { if ( (LA(1)==ONE_MORE) ) { zzmatch(ONE_MORE); if (zzaRet.r != NULL) (zzaRet.r)->trans[0] = zzaRet.l; zzCONSUME; } else { if ( (setwd2[LA(1)]&0x40) ) { } else {zzFAIL(1,zzerr5,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } zzEXIT(zztasp2); } } } else { if ( (LA(1)==ZERO_MORE) ) { zzmatch(ZERO_MORE); error("no expression for *", zzline); zzCONSUME; } else { if ( (LA(1)==ONE_MORE) ) { zzmatch(ONE_MORE); error("no expression for +", zzline); zzCONSUME; } else {zzFAIL(1,zzerr6,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd2, 0x80); } } void #ifdef __USE_PROTOS expr(void) #else expr() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { zzaRet.l = new_nfa_node(); zzaRet.r = new_nfa_node(); if ( (LA(1)==L_BRACK) ) { zzmatch(L_BRACK); zzCONSUME; atom_list(); zzmatch(R_BRACK); /* MR23 */ if (zzaRet.l != NULL) { (zzaRet.l)->trans[0] = zzaRet.r; (zzaRet.l)->label = set_dup(zzaArg(zztasp1,2 ).label); set_orin(&used_chars,(zzaRet.l)->label); } zzCONSUME; } else { if ( (LA(1)==NOT) ) { zzmatch(NOT); zzCONSUME; zzmatch(L_BRACK); zzCONSUME; atom_list(); zzmatch(R_BRACK); /* MR23 */ if (zzaRet.l != NULL) { (zzaRet.l)->trans[0] = zzaRet.r; (zzaRet.l)->label = set_dif(normal_chars,zzaArg(zztasp1,3 ).label); set_orin(&used_chars,(zzaRet.l)->label); } zzCONSUME; } else { if ( (LA(1)==L_PAR) ) { zzmatch(L_PAR); zzCONSUME; reg_expr(); zzmatch(R_PAR); /* MR23 */ if (zzaRet.l != NULL) { (zzaRet.l)->trans[0] = zzaArg(zztasp1,2 ).l; if (zzaArg(zztasp1,2 ).r) { (zzaArg(zztasp1,2 ).r)->trans[1] = zzaRet.r; /* MR20 */ } } zzCONSUME; } else { if ( (LA(1)==L_BRACE) ) { zzmatch(L_BRACE); zzCONSUME; reg_expr(); zzmatch(R_BRACE); /* MR23 */ if (zzaRet.l != NULL) { (zzaRet.l)->trans[0] = zzaArg(zztasp1,2 ).l; (zzaRet.l)->trans[1] = zzaRet.r; if (zzaArg(zztasp1,2 ).r) { (zzaArg(zztasp1,2 ).r)->trans[1] = zzaRet.r; /* MR20 */ } } zzCONSUME; } else { if ( (setwd3[LA(1)]&0x1) ) { atom(); /* MR23 */ if (zzaRet.l != NULL) { (zzaRet.l)->trans[0] = zzaRet.r; (zzaRet.l)->label = set_dup(zzaArg(zztasp1,1 ).label); set_orin(&used_chars,(zzaRet.l)->label); } } else {zzFAIL(1,zzerr7,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } } } zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd3, 0x2); } } void #ifdef __USE_PROTOS atom_list(void) #else atom_list() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { set_free(zzaRet.label); { zzBLOCK(zztasp2); zzMake0; { while ( (setwd3[LA(1)]&0x4) ) { near_atom(); set_orin(&(zzaRet.label),zzaArg(zztasp2,1 ).label); zzLOOP(zztasp2); } zzEXIT(zztasp2); } } zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd3, 0x8); } } void #ifdef __USE_PROTOS near_atom(void) #else near_atom() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { register int i; register int i_prime; anychar(); zzaRet.letter=zzaArg(zztasp1,1 ).letter; zzaRet.label=set_of(zzaArg(zztasp1,1 ).letter); i_prime = zzaArg(zztasp1,1 ).letter + MIN_CHAR; if (case_insensitive && islower(i_prime)) set_orel(toupper(i_prime)-MIN_CHAR, &(zzaRet.label)); if (case_insensitive && isupper(i_prime)) set_orel(tolower(i_prime)-MIN_CHAR, &(zzaRet.label)); { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==RANGE) ) { zzmatch(RANGE); zzCONSUME; anychar(); if (case_insensitive){ i_prime = zzaRet.letter+MIN_CHAR; zzaRet.letter = (islower(i_prime) ? toupper(i_prime) : i_prime)-MIN_CHAR; i_prime = zzaArg(zztasp2,2 ).letter+MIN_CHAR; zzaArg(zztasp2,2 ).letter = (islower(i_prime) ? toupper(i_prime) : i_prime)-MIN_CHAR; } /* check to see if range okay */ { int debugLetter1 = zzaRet.letter; int debugLetter2 = zzaArg(zztasp2,2 ).letter; } if (zzaRet.letter > zzaArg(zztasp2,2 ).letter && zzaArg(zztasp2,2 ).letter != 0xff){ /* MR16 */ error("invalid range ", zzline); } for (i=zzaRet.letter; i<= (int)zzaArg(zztasp2,2 ).letter; ++i){ set_orel(i,&(zzaRet.label)); i_prime = i+MIN_CHAR; if (case_insensitive && islower(i_prime)) set_orel(toupper(i_prime)-MIN_CHAR, &(zzaRet.label)); if (case_insensitive && isupper(i_prime)) set_orel(tolower(i_prime)-MIN_CHAR, &(zzaRet.label)); } } else { if ( (setwd3[LA(1)]&0x10) ) { } else {zzFAIL(1,zzerr8,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd3, 0x20); } } void #ifdef __USE_PROTOS atom(void) #else atom() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { register int i_prime; anychar(); zzaRet.label = set_of(zzaArg(zztasp1,1 ).letter); i_prime = zzaArg(zztasp1,1 ).letter + MIN_CHAR; if (case_insensitive && islower(i_prime)) set_orel(toupper(i_prime)-MIN_CHAR, &(zzaRet.label)); if (case_insensitive && isupper(i_prime)) set_orel(tolower(i_prime)-MIN_CHAR, &(zzaRet.label)); zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd3, 0x40); } } void #ifdef __USE_PROTOS anychar(void) #else anychar() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { if ( (LA(1)==REGCHAR) ) { zzmatch(REGCHAR); zzaRet.letter = zzaArg(zztasp1,1 ).letter - MIN_CHAR; zzCONSUME; } else { if ( (LA(1)==OCTAL_VALUE) ) { zzmatch(OCTAL_VALUE); zzaRet.letter = zzaArg(zztasp1,1 ).letter - MIN_CHAR; zzCONSUME; } else { if ( (LA(1)==HEX_VALUE) ) { zzmatch(HEX_VALUE); zzaRet.letter = zzaArg(zztasp1,1 ).letter - MIN_CHAR; zzCONSUME; } else { if ( (LA(1)==DEC_VALUE) ) { zzmatch(DEC_VALUE); zzaRet.letter = zzaArg(zztasp1,1 ).letter - MIN_CHAR; zzCONSUME; } else { if ( (LA(1)==TAB) ) { zzmatch(TAB); zzaRet.letter = zzaArg(zztasp1,1 ).letter - MIN_CHAR; zzCONSUME; } else { if ( (LA(1)==NL) ) { zzmatch(NL); zzaRet.letter = zzaArg(zztasp1,1 ).letter - MIN_CHAR; zzCONSUME; } else { if ( (LA(1)==CR) ) { zzmatch(CR); zzaRet.letter = zzaArg(zztasp1,1 ).letter - MIN_CHAR; zzCONSUME; } else { if ( (LA(1)==BS) ) { zzmatch(BS); zzaRet.letter = zzaArg(zztasp1,1 ).letter - MIN_CHAR; zzCONSUME; } else { if ( (LA(1)==LIT) ) { zzmatch(LIT); zzaRet.letter = zzaArg(zztasp1,1 ).letter - MIN_CHAR; zzCONSUME; } else { if ( (LA(1)==L_EOF) ) { zzmatch(L_EOF); zzaRet.letter = 0; zzCONSUME; } else {zzFAIL(1,zzerr9,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } } } } } } } } zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); /* empty action */ zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd3, 0x80); } } /* adds a new nfa to the binary tree and returns a pointer to it */ nfa_node * #ifdef __USE_PROTOS new_nfa_node(void) #else new_nfa_node() #endif { register nfa_node *t; static int nfa_size=0; /* elements nfa_array[] can hold */ ++nfa_allocated; if (nfa_size<=nfa_allocated){ /* need to redo array */ if (!nfa_array){ /* need some to do inital allocation */ nfa_size=nfa_allocated+NFA_MIN; nfa_array=(nfa_node **) malloc(sizeof(nfa_node*)* nfa_size); }else{ /* need more space */ nfa_size=2*(nfa_allocated+1); nfa_array=(nfa_node **) realloc(nfa_array, sizeof(nfa_node*)*nfa_size); } } /* fill out entry in array */ t = (nfa_node*) malloc(sizeof(nfa_node)); nfa_array[nfa_allocated] = t; *t = nfa_model_node; t->node_no = nfa_allocated; return t; } /* initialize the model node used to fill in newly made nfa_nodes */ void #ifdef __USE_PROTOS make_nfa_model_node(void) #else make_nfa_model_node() #endif { nfa_model_node.node_no = -1; /* impossible value for real nfa node */ nfa_model_node.nfa_set = 0; nfa_model_node.accept = 0; /* error state default*/ nfa_model_node.trans[0] = NULL; nfa_model_node.trans[1] = NULL; nfa_model_node.label = empty; } #if defined(DEBUG) || defined(_DEBUG) /* print out the pointer value and the node_number */ void #ifdef __USE_PROTOS fprint_dfa_pair(FILE *f, nfa_node *p) #else fprint_dfa_pair(f, p) FILE *f; nfa_node *p; #endif { if (p){ fprintf(f, "%x (%d)", p, p->node_no); }else{ fprintf(f, "(nil)"); } } /* print out interest information on a set */ void #ifdef __USE_PROTOS fprint_set(FILE *f, set s) #else fprint_set(f,s) FILE *f; set s; #endif { unsigned int *x; fprintf(f, "n = %d,", s.n); if (s.setword){ fprintf(f, "setword = %x, ", s.setword); /* print out all the elements in the set */ x = set_pdq(s); while (*x!=nil){ fprintf(f, "%d ", *x); ++x; } }else{ fprintf(f, "setword = (nil)"); } } /* code to be able to dump out the nfas return 0 if okay dump return 1 if screwed up */ int #ifdef __USE_PROTOS dump_nfas(int first_node, int last_node) #else dump_nfas(first_node, last_node) int first_node; int last_node; #endif { register int i; nfa_node *t; for (i=first_node; i<=last_node; ++i){ t = NFA(i); if (!t) break; fprintf(stderr, "nfa_node %d {\n", t->node_no); fprintf(stderr, "\n\tnfa_set = %d\n", t->nfa_set); fprintf(stderr, "\taccept\t=\t%d\n", t->accept); fprintf(stderr, "\ttrans\t=\t("); fprint_dfa_pair(stderr, t->trans[0]); fprintf(stderr, ","); fprint_dfa_pair(stderr, t->trans[1]); fprintf(stderr, ")\n"); fprintf(stderr, "\tlabel\t=\t{ "); fprint_set(stderr, t->label); fprintf(stderr, "\t}\n"); fprintf(stderr, "}\n\n"); } return 0; } #endif /* DLG-specific syntax error message generator * (define USER_ZZSYN when compiling so don't get 2 definitions) */ void #ifdef __USE_PROTOS zzsyn(char *text, int tok, char *egroup, SetWordType *eset, int etok, int k, char *bad_text) #else zzsyn(text, tok, egroup, eset, etok, k, bad_text) char *text, *egroup, *bad_text; int tok; int etok; int k; SetWordType *eset; #endif { fprintf(stderr, ErrHdr, file_str[0]!=NULL?file_str[0]:"stdin", zzline); fprintf(stderr, " syntax error at \"%s\"", (tok==zzEOF_TOKEN)?"EOF":text); if ( !etok && !eset ) {fprintf(stderr, "\n"); return;} if ( k==1 ) fprintf(stderr, " missing"); else { fprintf(stderr, "; \"%s\" not", bad_text); if ( zzset_deg(eset)>1 ) fprintf(stderr, " in"); } if ( zzset_deg(eset)>0 ) zzedecode(eset); else fprintf(stderr, " %s", zztokens[etok]); if ( strlen(egroup) > (size_t)0 ) fprintf(stderr, " in %s", egroup); fprintf(stderr, "\n"); } gtkwave-3.3.86/contrib/pccts/dlg/dlg.r0000664000175000017500000001130613166335473017060 0ustar bybellbybell/* File: dlgMPW.r Target: dlg 133MR Created: Monday, June 15, 1998 4:44:11 AM Author: Kenji Tanaka (kentar@osa.att.ne.jp) */ #include "cmdo.r" resource 'cmdo' (128, "Dlg") { { /* array dialogs: 1 elements */ /* [1] */ 295, "DLG -- Purdue Compiler Construction Tool" " Set (PCCTS) lexical analyzer generator.", { /* array itemArray: 18 elements */ /* [1] */ NotDependent { }, CheckOption { NotSet, {35, 175, 50, 225}, "On", "-CC", "When this control is checked, DLG genera" "tes a scanner using C++ classes rather t" "han C functions." }, /* [2] */ Or { { /* array OrArray: 1 elements */ /* [1] */ 1 } }, RegularEntry { "Lexer Class Name:", {35, 225, 50, 355}, {35, 355, 51, 450}, "DLGLexer", keepCase, "-cl", "This entry specifies the name DLG uses f" "or the C++ lexer class." }, /* [3] */ NotDependent { }, TextBox { gray, {25, 165, 60, 460}, "C++ Code Generation" }, /* [4] */ NotDependent { }, Files { InputFile, RequiredFile { {37, 25, 56, 135}, "Input File", "", "Choose the lexical description file for " "DLG to process." }, Additional { "", "", "", "", { /* array TypesArray: 1 elements */ /* [1] */ text } } }, /* [5] */ Or { { /* array OrArray: 1 elements */ /* [1] */ -1 } }, Files { OutputFile, RequiredFile { {66, 25, 85, 135}, "Output File", "", "Choose the name of the file that will ho" "ld the DLG-produced scanner." }, NoMore { } }, /* [6] */ Or { { /* array OrArray: 2 elements */ /* [1] */ 1, /* [2] */ 5 } }, Dummy { }, /* [7] */ NotDependent { }, Redirection { DiagnosticOutput, {90, 25} }, /* [8] */ NotDependent { }, TextBox { gray, {25, 20, 132, 145}, "Files" }, /* [9] */ NotDependent { }, Files { DirOnly, OptionalFile { {68, 175, 84, 305}, {88, 175, 107, 305}, "Output Directory", ":", "-o", "", "Choose the directory where DLG will put " "its output.", dim, "Output DirectoryI", "", "" }, NoMore { } }, /* [10] */ NotDependent { }, RegularEntry { "Mode File Name:", {68, 315, 83, 450}, {88, 315, 104, 450}, "mode.h", keepCase, "-m", "This entry specifies the name DLG uses f" "or its lexical mode output file." }, /* [11] */ NotDependent { }, RadioButtons { { /* array radioArray: 3 elements */ /* [1] */ {134, 175, 149, 255}, "None", "", Set, "When this option is selected, DLG will n" "ot compress its tables.", /* [2] */ {134, 265, 149, 345}, "Level 1", "-C1", NotSet, "When this option is selected, DLG will r" "emove all unused characters from the tra" "nsition-from table.", /* [3] */ {134, 360, 149, 450}, "Level 2", "-C2", NotSet, "When this option is selected, DLG will p" "erform level 1 compression plus it will " "map equivalent characters into the same " "character classes." } }, /* [12] */ NotDependent { }, TextBox { gray, {124, 165, 156, 460}, "Table Compression" }, /* [13] */ NotDependent { }, CheckOption { Set, {165, 20, 180, 145}, "Case Sensitive", "-ci", "When this control is checked, the DLG au" "tomaton will treat upper and lower case " "characters identically." }, /* [14] */ NotDependent { }, CheckOption { NotSet, {165, 150, 180, 300}, "Interactive Scanner", "-i", "When this control is checked, DLG will g" "enerate as interactive a scanner as poss" "ible." }, /* [15] */ NotDependent { }, CheckOption { NotSet, {165, 310, 180, 460}, "Ambiguity Warnings", "-Wambiguity", "When this control is checked, DLG warns " "if more than one regular expression coul" "d match the same character sequence." }, /* [16] */ NotDependent { }, VersionDialog { VersionString { "1.33MR" }, "PCCTS was written by Terence Parr, Russe" "ll Quong, Will Cohen, and Hank Dietz: 19" "89-1998. MPW port by Scott Haney.", noDialog }, /* [17] */ And { { /* array AndArray: 2 elements */ /* [1] */ 4, /* [2] */ 6 } }, DoItButton { }, /* [18] */ NotDependent { }, CheckOption { NotSet, {142, 20, 157, 148}, "Generate ANSI C", "-ga", "When this control is checked, DLG genera" "tes ANSI C compatible code." } } } }; gtkwave-3.3.86/contrib/pccts/dlg/Makefile.am0000664000175000017500000000315713166335473020170 0ustar bybellbybell## -*- makefile -*- ## noinst_PROGRAMS= dlg AM_CFLAGS= -I. -I$(srcdir)/../support/set \ -I$(srcdir)/../h -DUSER_ZZSYN -DZZLEXBUFSIZE=32000 dlg_SOURCES= \ automata.c dlg.h dlg_p.c dlg_a.c err.c main.c mode.h \ output.c relabel.c $(srcdir)/../support/set/set.c \ stdpccts.h support.c tokens.h # hopefully this won't produce some sort of chicken and egg problem ANTLR= ../antlr/antlr # Don't worry about the ambiguity messages coming from antlr # for making antlr.c etc... [should be 10 of them, I think] dlg_p.c parser.dlg err.c tokens.h : $(srcdir)/dlg_p.g @if test -x ${ANTLR} ; then \ echo "${ANTLR} $(srcdir)/dlg_p.g" ; \ ${ANTLR} $(srcdir)/dlg_p.g ; \ else \ echo "WARNING: $(srcdir)/dlg_p.g has changed making dlg_p.c parser.dlg err.c tokens.h" ; \ echo " out of date." ; \ echo " However you have not finished building $(ANTLR) yet. So you may want to" ; \ echo " build again a 2nd time after your build (hopefully) finishes." ; \ fi DLG= ./dlg dlg_a.c mode.h: $(srcdir)/parser.dlg @if test -x ${DLG} ; then \ echo "${DLG} -C2 $(srcdir)/parser.dlg scan.c" ; \ ${DLG} -C2 $(srcdir)/parser.dlg dlg_a.c ; \ else \ echo "WARNING: $(srcdir)/parser.g has changed making dlg_a.c and mode.h out of date." ; \ echo " However you have not finished building $(DLG) yet. So you may want to" ; \ echo " build again a 2nd time after your build (hopefully) finishes." ; \ fi EXTRA_DIST= \ DlgMS.mak DlgMSVC50.dsp DlgMSVC50.dsw DlgMSVC60.dsp \ DlgMSVC60.dsw dlg.1 dlg.r dlg1.txt dlg68K.make \ dlgPPC.make dlg_p.g makefile.VMS makefile1 parser.dlg \ watdlg.mak gtkwave-3.3.86/contrib/pccts/dlg/err.c0000664000175000017500000000531413166335473017065 0ustar bybellbybell/* * A n t l r S e t s / E r r o r F i l e H e a d e r * * Generated from: ./dlg_p.g * * Terence Parr, Russell Quong, Will Cohen, and Hank Dietz: 1989-2001 * Parr Research Corporation * with Purdue University Electrical Engineering * With AHPCRC, University of Minnesota * ANTLR Version 1.33MR33 */ #define ANTLR_VERSION 13333 #include "pcctscfg.h" #include "pccts_stdio.h" #include #include "dlg.h" #define zzSET_SIZE 8 #include "antlr.h" #include "tokens.h" #include "dlgdef.h" #include "err.h" ANTLRChar *zztokens[46]={ /* 00 */ "Invalid", /* 01 */ "@", /* 02 */ "[\\r\\t\\ ]+", /* 03 */ "\\n", /* 04 */ "L_EOF", /* 05 */ "PER_PER", /* 06 */ "NAME_PER_PER", /* 07 */ "LEXMEMBER", /* 08 */ "LEXACTION", /* 09 */ "PARSERCLASS", /* 10 */ "LEXPREFIX", /* 11 */ "ACTION", /* 12 */ "GREAT_GREAT", /* 13 */ "L_BRACE", /* 14 */ "R_BRACE", /* 15 */ "L_PAR", /* 16 */ "R_PAR", /* 17 */ "L_BRACK", /* 18 */ "R_BRACK", /* 19 */ "ZERO_MORE", /* 20 */ "ONE_MORE", /* 21 */ "OR", /* 22 */ "RANGE", /* 23 */ "NOT", /* 24 */ "OCTAL_VALUE", /* 25 */ "HEX_VALUE", /* 26 */ "DEC_VALUE", /* 27 */ "TAB", /* 28 */ "NL", /* 29 */ "CR", /* 30 */ "BS", /* 31 */ "CONTINUATION", /* 32 */ "LIT", /* 33 */ "REGCHAR", /* 34 */ "\\>", /* 35 */ "\\\\>", /* 36 */ "\\", /* 37 */ "\\n", /* 38 */ "/\\*", /* 39 */ "//", /* 40 */ "~[]", /* 41 */ "\\*/", /* 42 */ "[\\n\\r]", /* 43 */ "~[]", /* 44 */ "[\\n\\r]", /* 45 */ "~[]" }; SetWordType zzerr1[8] = {0x80,0xf,0x0,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr2[8] = {0x60,0x0,0x0,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr3[8] = {0x70,0xa8,0x9a,0x7f, 0x3,0x0,0x0,0x0}; SetWordType setwd1[46] = {0x0,0x6,0x0,0x0,0x30,0xc8,0xc8, 0x1,0x1,0x1,0x1,0x35,0x0,0x30,0x0, 0x30,0x0,0x30,0x0,0x30,0x30,0x0,0x0, 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30, 0x0,0x30,0x30,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0}; SetWordType zzerr4[8] = {0x10,0xa8,0x9a,0x7f, 0x3,0x0,0x0,0x0}; SetWordType zzerr5[8] = {0x10,0xe8,0xbb,0x7f, 0x3,0x0,0x0,0x0}; SetWordType zzerr6[8] = {0x10,0xa0,0x9a,0x7f, 0x3,0x0,0x0,0x0}; SetWordType setwd2[46] = {0x0,0x0,0x0,0x0,0xeb,0x2,0x2, 0x0,0x0,0x0,0x0,0xd6,0x0,0xeb,0xd4, 0xeb,0xd4,0xeb,0x0,0xcb,0xcb,0xd0,0x0, 0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb,0xeb, 0x0,0xeb,0xeb,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0}; SetWordType zzerr7[8] = {0x10,0xa0,0x82,0x7f, 0x3,0x0,0x0,0x0}; SetWordType zzerr8[8] = {0x10,0x0,0x44,0x7f, 0x3,0x0,0x0,0x0}; SetWordType zzerr9[8] = {0x10,0x0,0x0,0x7f, 0x3,0x0,0x0,0x0}; SetWordType setwd3[46] = {0x0,0x0,0x0,0x0,0xf7,0x0,0x0, 0x0,0x0,0x0,0x0,0xc2,0x0,0xc2,0xc2, 0xc2,0xc2,0xc2,0xb8,0xc2,0xc2,0xc2,0x80, 0xc2,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, 0x0,0xf7,0xf7,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0}; gtkwave-3.3.86/contrib/pccts/dlg/dlg_p.g0000664000175000017500000004153513166335473017373 0ustar bybellbybell/* This is the parser for the dlg * This is a part of the Purdue Compiler Construction Tool Set * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * DLG 1.33 * Will Cohen * With mods by Terence Parr; AHPCRC, University of Minnesota * 1989-1995 */ #header << #include #include "dlg.h" >> << /* MR20 G. Hobbelt Fix for Borland C++ 4.x & 5.x compiling with ALL warnings enabled */ #ifdef __TURBOC__ #pragma warn -aus /* unused assignment of 'xxx' */ #endif int action_no = 0; /* keep track of actions outputed */ int nfa_allocated = 0; /* keeps track of number of nfa nodes */ nfa_node **nfa_array = NULL;/* root of binary tree that stores nfa array */ nfa_node nfa_model_node; /* model to initialize new nodes */ set used_chars; /* used to label trans. arcs */ set used_classes; /* classes or chars used to label trans. arcs */ set normal_chars; /* mask to get rid elements that aren't used in set */ int flag_paren = FALSE; int flag_brace = FALSE; int mode_counter = 0; /* keep track of number of %%names */ >> #lexaction << int func_action; /* should actions be turned into functions?*/ int lex_mode_counter = 0; /* keeps track of the number of %%names */ /* MR1 */ /* MR1 11-Apr-97 Provide mechanism for inserting code into DLG class */ /* MR1 via <<%%lexmember...>> */ /* MR1 */ int lexMember = 0; /* <<%%lexmemeber ...>> MR1 */ int lexAction = 0; /* <<%%lexaction ...>> MR1 */ int parserClass = 0; /* <<%%parserclass ...>> MR1 */ int lexPrefix = 0; /* <<%%lexprefix ...>> MR1 */ char theClassName[100]; /* MR11 */ char *pClassName=theClassName; /* MR11 */ int firstLexMember=1; /* MR1 */ #ifdef __USE_PROTOS void xxputc(int c) { /* MR1 */ #else void xxputc(c) /* MR1 */ int c; /* MR1 */ { /* MR1 */ #endif if (parserClass) { /* MR1 */ *pClassName++=c; /* MR1 */ *pClassName=0; /* MR1 */ } else if (lexMember || lexPrefix) { /* MR1 */ if (class_stream != NULL) fputc(c,class_stream); /* MR1 */ } else { /* MR1 */ fputc(c,OUT); /* MR1 */ }; /* MR1 */ } /* MR1 */ #ifdef __USE_PROTOS void xxprintf(char *format,char *string) { /* MR1 */ #else void xxprintf(format,string) /* MR1 */ char *format; /* MR1 */ char *string; /* MR1 */ { /* MR1 */ #endif if (lexMember || lexPrefix || parserClass) { /* MR1 */ if (class_stream != NULL) /* MR1 */ fprintf(class_stream,format,string); /* MR1 */ } else { /* MR1 */ fprintf(OUT,format,string); /* MR1 */ }; /* MR1 */ } /* MR1 */ >> #token "[\r\t\ ]+" << zzskip(); >> /* Ignore white */ #token "\n" << zzline++; zzskip(); DAWDLE; >> /* Track Line # */ #token L_EOF "\@" #token PER_PER "\%\%" #token NAME_PER_PER "\%\%[a-zA-Z_][a-zA-Z0-9_]*" << p_mode_def(&zzlextext[2],lex_mode_counter++); >> #token LEXMEMBER "\<\<\%\%lexmember" /* MR1 */ <> /* MR1 */ #token LEXACTION "\<\<\%\%lexaction" /* MR1 */ <> /* MR1 */ #token PARSERCLASS "\<\<\%\%parserclass" /* MR1 */ <> /* MR1 */ #token LEXPREFIX "\<\<\%\%lexprefix" /* MR1 */ <> /* MR1 */ #token ACTION "\<\<" << if (func_action) fprintf(OUT,"\n%s %sact%d()\n{ ", gen_cpp?"ANTLRTokenType":"static void", gen_cpp?ClassName("::"):"", ++action_no); zzmode(ACT); zzskip(); >> #token GREAT_GREAT "\>\>" #token L_BRACE "\{" #token R_BRACE "\}" #token L_PAR "\(" #token R_PAR "\)" #token L_BRACK "\[" #token R_BRACK "\]" #token ZERO_MORE "\*" #token ONE_MORE "\+" #token OR "\|" #token RANGE "\-" #token NOT "\~" #token OCTAL_VALUE "\\0[0-7]*" << {int t; sscanf(&zzlextext[1],"%o",&t); zzlextext[0] = t;}>> #token HEX_VALUE "\\0[Xx][0-9a-fA-F]+" << {int t; sscanf(&zzlextext[3],"%x",&t); zzlextext[0] = t;}>> #token DEC_VALUE "\\[1-9][0-9]*" << {int t; sscanf(&zzlextext[1],"%d",&t); zzlextext[0] = t;}>> #token TAB "\\t" << zzlextext[0] = '\t';>> #token NL "\\n" << zzlextext[0] = '\n';>> #token CR "\\r" << zzlextext[0] = '\r';>> #token BS "\\b" << zzlextext[0] = '\b';>> /* MR1 */ /* MR1 10-Apr-97 MR1 Allow #token regular expressions to cross lines */ /* MR1 */ #token CONTINUATION "\\ \n" << zzline++; zzskip();>> /* MR1 */ /* NOTE: this takes ANYTHING after the \ */ #token LIT "\\~[tnrb]" << zzlextext[0] = zzlextext[1];>> /* NOTE: this takes ANYTHING that doesn't match the other tokens */ #token REGCHAR "~[\\]" grammar : << p_head(); p_class_hdr(); func_action = FALSE;>> ( {LEXACTION | LEXMEMBER | LEXPREFIX | PARSERCLASS } ACTION)* /* MR1 */ <> start_states << func_action = FALSE; p_tables(); p_tail(); >> (ACTION)* "@" << if (firstLexMember != 0) p_class_def1(); >> /* MR1 */ ; start_states : ( PER_PER do_conversion | NAME_PER_PER do_conversion (NAME_PER_PER do_conversion)*) PER_PER ; do_conversion : <> rule_list << dfa_class_nop[mode_counter] = relabel($1.l,comp_level); if (comp_level) p_shift_table(mode_counter); dfa_basep[mode_counter] = dfa_allocated+1; make_dfa_model_node(dfa_class_nop[mode_counter]); nfa_to_dfa($1.l); ++mode_counter; func_action = FALSE; #ifdef HASH_STAT fprint_hash_stats(stderr); #endif >> ; rule_list : rule <<$$.l=$1.l; $$.r=$1.r;>> (rule <<{nfa_node *t1; t1 = new_nfa_node(); (t1)->trans[0]=$$.l; (t1)->trans[1]=$1.l; /* all accept nodes "dead ends" */ $$.l=t1; $$.r=NULL; } >> )* | /* empty */ <<$$.l = new_nfa_node(); $$.r = NULL; warning("no regular expressions", zzline); >> ; rule : reg_expr ACTION /* MR23 */ << if ($1.r != NULL) { $$.l=$1.l; $$.r=$1.r; ($1.r)->accept=action_no; } >> | ACTION <<$$.l = NULL; $$.r = NULL; error("no expression for action ", zzline); >> ; reg_expr : and_expr <<$$.l=$1.l; $$.r=$1.r;>> (OR and_expr <<{nfa_node *t1, *t2; t1 = new_nfa_node(); t2 = new_nfa_node(); (t1)->trans[0]=$$.l; (t1)->trans[1]=$2.l; /* MR23 */ if ($$.r != NULL) ($$.r)->trans[1]=t2; if ($2.r) { ($2.r)->trans[1]=t2; /* MR20 */ } $$.l=t1; $$.r=t2; } >> )* ; and_expr : repeat_expr << $$.l=$1.l; $$.r=$1.r; >> (repeat_expr /* MR23 */ << if ($$.r != NULL) { ($$.r)->trans[1]=$1.l; $$.r=$1.r; } >> )* ; repeat_expr : expr <<$$.l=$1.l; $$.r=$1.r;>> { ZERO_MORE <<{ nfa_node *t1,*t2; /* MR23 */ if ($$.r != NULL) ($$.r)->trans[0] = $$.l; t1 = new_nfa_node(); t2 = new_nfa_node(); t1->trans[0]=$$.l; t1->trans[1]=t2; /* MR23 */ if ($$.r != NULL) ($$.r)->trans[1]=t2; $$.l=t1;$$.r=t2; } >> | ONE_MORE /* MR23 */ <trans[0] = $$.l;>> } | ZERO_MORE << error("no expression for *", zzline);>> | ONE_MORE << error("no expression for +", zzline);>> ; expr : << $$.l = new_nfa_node(); $$.r = new_nfa_node(); >> L_BRACK atom_list R_BRACK << /* MR23 */ if ($$.l != NULL) { ($$.l)->trans[0] = $$.r; ($$.l)->label = set_dup($2.label); set_orin(&used_chars,($$.l)->label); } >> | NOT L_BRACK atom_list R_BRACK << /* MR23 */ if ($$.l != NULL) { ($$.l)->trans[0] = $$.r; ($$.l)->label = set_dif(normal_chars,$3.label); set_orin(&used_chars,($$.l)->label); } >> | L_PAR reg_expr R_PAR << /* MR23 */ if ($$.l != NULL) { ($$.l)->trans[0] = $2.l; if ($2.r) { ($2.r)->trans[1] = $$.r; /* MR20 */ } } >> | L_BRACE reg_expr R_BRACE << /* MR23 */ if ($$.l != NULL) { ($$.l)->trans[0] = $2.l; ($$.l)->trans[1] = $$.r; if ($2.r) { ($2.r)->trans[1] = $$.r; /* MR20 */ } } >> | atom << /* MR23 */ if ($$.l != NULL) { ($$.l)->trans[0] = $$.r; ($$.l)->label = set_dup($1.label); set_orin(&used_chars,($$.l)->label); } >> ; atom_list : << set_free($$.label); >> (near_atom <>)* ; near_atom : << register int i; register int i_prime; >> anychar <<$$.letter=$1.letter; $$.label=set_of($1.letter); i_prime = $1.letter + MIN_CHAR; if (case_insensitive && islower(i_prime)) set_orel(toupper(i_prime)-MIN_CHAR, &($$.label)); if (case_insensitive && isupper(i_prime)) set_orel(tolower(i_prime)-MIN_CHAR, &($$.label)); >> { RANGE anychar << if (case_insensitive){ i_prime = $$.letter+MIN_CHAR; $$.letter = (islower(i_prime) ? toupper(i_prime) : i_prime)-MIN_CHAR; i_prime = $2.letter+MIN_CHAR; $2.letter = (islower(i_prime) ? toupper(i_prime) : i_prime)-MIN_CHAR; } /* check to see if range okay */ { int debugLetter1 = $$.letter; int debugLetter2 = $2.letter; } if ($$.letter > $2.letter && $2.letter != 0xff){ /* MR16 */ error("invalid range ", zzline); } for (i=$$.letter; i<= (int)$2.letter; ++i){ set_orel(i,&($$.label)); i_prime = i+MIN_CHAR; if (case_insensitive && islower(i_prime)) set_orel(toupper(i_prime)-MIN_CHAR, &($$.label)); if (case_insensitive && isupper(i_prime)) set_orel(tolower(i_prime)-MIN_CHAR, &($$.label)); } >> } ; atom : << register int i_prime;>> anychar <<$$.label = set_of($1.letter); i_prime = $1.letter + MIN_CHAR; if (case_insensitive && islower(i_prime)) set_orel(toupper(i_prime)-MIN_CHAR, &($$.label)); if (case_insensitive && isupper(i_prime)) set_orel(tolower(i_prime)-MIN_CHAR, &($$.label)); >> ; anychar : REGCHAR <<$$.letter = $1.letter - MIN_CHAR;>> | OCTAL_VALUE <<$$.letter = $1.letter - MIN_CHAR;>> | HEX_VALUE <<$$.letter = $1.letter - MIN_CHAR;>> | DEC_VALUE <<$$.letter = $1.letter - MIN_CHAR;>> | TAB <<$$.letter = $1.letter - MIN_CHAR;>> | NL <<$$.letter = $1.letter - MIN_CHAR;>> | CR <<$$.letter = $1.letter - MIN_CHAR;>> | BS <<$$.letter = $1.letter - MIN_CHAR;>> | LIT <<$$.letter = $1.letter - MIN_CHAR;>> /* NOTE: LEX_EOF is ALWAYS shifted to 0 = MIN_CHAR - MIN_CHAR*/ | L_EOF <<$$.letter = 0;>> ; <> #lexclass ACT #token "@" << error("unterminated action", zzline); zzmode(START); >> #token ACTION "\>\>" << if (func_action) fprintf(OUT,"}\n\n"); zzmode(START); /* MR1 */ /* MR1 11-Apr-97 Provide mechanism for inserting code into DLG class */ /* MR1 via <<%%lexmember ...>> */ /* MR1 This is a consequence of not saving actions */ /* MR1 */ /* MR1 */ parserClass=0; /* MR1 */ lexPrefix=0; /* MR1 */ lexAction=0; /* MR1 */ lexMember=0; >> #token "\>" << xxputc(zzlextext[0]); zzskip(); >> /* MR1 */ #token "\\\>" << xxputc('>'); zzskip(); >> /* MR1 */ #token "\\" << xxputc('\\'); zzskip(); >> /* MR1 */ #token "\n" << xxputc(zzlextext[0]); ++zzline; zzskip(); >> /* MR1 */ #token "/\*" << zzmode(ACTION_COMMENTS); /* MR1 */ xxprintf("%s", &(zzlextext[0])); zzskip(); /* MR1 */ >> /* MR1 */ #token "//" << zzmode(ACTION_CPP_COMMENTS); /* MR1 */ xxprintf("%s", &(zzlextext[0])); zzskip(); /* MR1 */ >> /* MR1 */ #token "~[]" << xxputc(zzlextext[0]); zzskip(); >> /* MR1 */ /* MR1 */ #lexclass ACTION_COMMENTS /* MR1 */ #token "\*/" << zzmode(ACT); /* MR1 */ xxprintf("%s", &(zzlextext[0])); zzskip(); /* MR1 */ >> /* MR1 */ #token "[\n\r]" << zzline++; xxputc(zzlextext[0]); zzskip();>> /* MR1 */ #token "~[]" << xxputc(zzlextext[0]); zzskip();>> /* MR1 */ /* MR1 */ #lexclass ACTION_CPP_COMMENTS /* MR1 */ #token "[\n\r]" << zzmode(ACT); zzline++; /* MR1 */ xxprintf("%s", &(zzlextext[0])); zzskip(); /* MR1 */ >> /* MR1 */ #token "~[]" << xxputc(zzlextext[0]); zzskip();>> /* MR1 */ << /* adds a new nfa to the binary tree and returns a pointer to it */ nfa_node * #ifdef __USE_PROTOS new_nfa_node(void) #else new_nfa_node() #endif { register nfa_node *t; static int nfa_size=0; /* elements nfa_array[] can hold */ ++nfa_allocated; if (nfa_size<=nfa_allocated){ /* need to redo array */ if (!nfa_array){ /* need some to do inital allocation */ nfa_size=nfa_allocated+NFA_MIN; nfa_array=(nfa_node **) malloc(sizeof(nfa_node*)* nfa_size); }else{ /* need more space */ nfa_size=2*(nfa_allocated+1); nfa_array=(nfa_node **) realloc(nfa_array, sizeof(nfa_node*)*nfa_size); } } /* fill out entry in array */ t = (nfa_node*) malloc(sizeof(nfa_node)); nfa_array[nfa_allocated] = t; *t = nfa_model_node; t->node_no = nfa_allocated; return t; } /* initialize the model node used to fill in newly made nfa_nodes */ void #ifdef __USE_PROTOS make_nfa_model_node(void) #else make_nfa_model_node() #endif { nfa_model_node.node_no = -1; /* impossible value for real nfa node */ nfa_model_node.nfa_set = 0; nfa_model_node.accept = 0; /* error state default*/ nfa_model_node.trans[0] = NULL; nfa_model_node.trans[1] = NULL; nfa_model_node.label = empty; } >> << #if defined(DEBUG) || defined(_DEBUG) /* print out the pointer value and the node_number */ void #ifdef __USE_PROTOS fprint_dfa_pair(FILE *f, nfa_node *p) #else fprint_dfa_pair(f, p) FILE *f; nfa_node *p; #endif { if (p){ fprintf(f, "%x (%d)", p, p->node_no); }else{ fprintf(f, "(nil)"); } } /* print out interest information on a set */ void #ifdef __USE_PROTOS fprint_set(FILE *f, set s) #else fprint_set(f,s) FILE *f; set s; #endif { unsigned int *x; fprintf(f, "n = %d,", s.n); if (s.setword){ fprintf(f, "setword = %x, ", s.setword); /* print out all the elements in the set */ x = set_pdq(s); while (*x!=nil){ fprintf(f, "%d ", *x); ++x; } }else{ fprintf(f, "setword = (nil)"); } } /* code to be able to dump out the nfas return 0 if okay dump return 1 if screwed up */ int #ifdef __USE_PROTOS dump_nfas(int first_node, int last_node) #else dump_nfas(first_node, last_node) int first_node; int last_node; #endif { register int i; nfa_node *t; for (i=first_node; i<=last_node; ++i){ t = NFA(i); if (!t) break; fprintf(stderr, "nfa_node %d {\n", t->node_no); fprintf(stderr, "\n\tnfa_set = %d\n", t->nfa_set); fprintf(stderr, "\taccept\t=\t%d\n", t->accept); fprintf(stderr, "\ttrans\t=\t("); fprint_dfa_pair(stderr, t->trans[0]); fprintf(stderr, ","); fprint_dfa_pair(stderr, t->trans[1]); fprintf(stderr, ")\n"); fprintf(stderr, "\tlabel\t=\t{ "); fprint_set(stderr, t->label); fprintf(stderr, "\t}\n"); fprintf(stderr, "}\n\n"); } return 0; } #endif >> << /* DLG-specific syntax error message generator * (define USER_ZZSYN when compiling so don't get 2 definitions) */ void #ifdef __USE_PROTOS zzsyn(char *text, int tok, char *egroup, SetWordType *eset, int etok, int k, char *bad_text) #else zzsyn(text, tok, egroup, eset, etok, k, bad_text) char *text, *egroup, *bad_text; int tok; int etok; int k; SetWordType *eset; #endif { fprintf(stderr, ErrHdr, file_str[0]!=NULL?file_str[0]:"stdin", zzline); fprintf(stderr, " syntax error at \"%s\"", (tok==zzEOF_TOKEN)?"EOF":text); if ( !etok && !eset ) {fprintf(stderr, "\n"); return;} if ( k==1 ) fprintf(stderr, " missing"); else { fprintf(stderr, "; \"%s\" not", bad_text); if ( zzset_deg(eset)>1 ) fprintf(stderr, " in"); } if ( zzset_deg(eset)>0 ) zzedecode(eset); else fprintf(stderr, " %s", zztokens[etok]); if ( strlen(egroup) > (size_t)0 ) fprintf(stderr, " in %s", egroup); fprintf(stderr, "\n"); } >> gtkwave-3.3.86/contrib/pccts/dlg/mode.h0000664000175000017500000000012613166335473017222 0ustar bybellbybell#define START 0 #define ACT 1 #define ACTION_COMMENTS 2 #define ACTION_CPP_COMMENTS 3 gtkwave-3.3.86/contrib/pccts/dlg/dlg68K.make0000664000175000017500000000424113166335473020025 0ustar bybellbybell# File: dlg68K.make # Target: dlg68K # Sources: automata.c # dlg_a.c # dlg_p.c # err.c # main.c # output.c # relabel.c # support.c # ::support:set:set.c # Created: Sunday, May 17, 1998 10:58:10 PM # Author: Kenji Tanaka MAKEFILE = dlg68K.make ¥MondoBuild¥ = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified Includes = ¶ -i "::h:" ¶ -i "::support:set:" Sym¥68K = ObjDir¥68K = ":Obj:" COptions = {Includes} {Sym¥68K} -model far -mc68020 -w off -d MPW -d __STDC__=1 -d USER_ZZSYN Objects¥68K = ¶ "{ObjDir¥68K}automata.c.o" ¶ "{ObjDir¥68K}dlg_a.c.o" ¶ "{ObjDir¥68K}dlg_p.c.o" ¶ "{ObjDir¥68K}err.c.o" ¶ "{ObjDir¥68K}main.c.o" ¶ "{ObjDir¥68K}output.c.o" ¶ "{ObjDir¥68K}relabel.c.o" ¶ "{ObjDir¥68K}support.c.o" ¶ "{ObjDir¥68K}set.c.o" dlg68K ÄÄ {¥MondoBuild¥} {Objects¥68K} Link ¶ -o {Targ} -d {Sym¥68K} ¶ {Objects¥68K} ¶ -t 'MPST' ¶ -c 'MPS ' ¶ -model far ¶ -mf ¶ -br ON ¶ -srtsg ALL ¶ "{Libraries}Stubs.o" ¶ "{Libraries}MathLib.o" ¶ #"{CLibraries}Complex.o" ¶ "{CLibraries}StdCLib.o" ¶ "{Libraries}MacRuntime.o" ¶ "{Libraries}IntEnv.o" ¶ "{Libraries}ToolLibs.o" ¶ "{Libraries}Interface.o" "{ObjDir¥68K}automata.c.o" Ä {¥MondoBuild¥} automata.c {C} automata.c -o {Targ} {COptions} "{ObjDir¥68K}dlg_a.c.o" Ä {¥MondoBuild¥} dlg_a.c {C} dlg_a.c -o {Targ} {COptions} "{ObjDir¥68K}dlg_p.c.o" Ä {¥MondoBuild¥} dlg_p.c {C} dlg_p.c -o {Targ} {COptions} "{ObjDir¥68K}err.c.o" Ä {¥MondoBuild¥} err.c {C} err.c -o {Targ} {COptions} "{ObjDir¥68K}main.c.o" Ä {¥MondoBuild¥} main.c {C} main.c -o {Targ} {COptions} "{ObjDir¥68K}output.c.o" Ä {¥MondoBuild¥} output.c {C} output.c -o {Targ} {COptions} "{ObjDir¥68K}relabel.c.o" Ä {¥MondoBuild¥} relabel.c {C} relabel.c -o {Targ} {COptions} "{ObjDir¥68K}support.c.o" Ä {¥MondoBuild¥} support.c {C} support.c -o {Targ} {COptions} "{ObjDir¥68K}set.c.o" Ä {¥MondoBuild¥} "::support:set:set.c" {C} "::support:set:set.c" -o {Targ} {COptions} dlg68K ÄÄ dlg.r Rez dlg.r -o dlg68K -a Install Ä dlg68K Duplicate -y dlg68K "{MPW}"Tools:dlg gtkwave-3.3.86/contrib/pccts/dlg/DlgMS.mak0000664000175000017500000000475213166335473017576 0ustar bybellbybell# PCCTS directory PCCTS_HOME= DLG_SRC=$(PCCTS_HOME)\dlg PCCTS_H=$(PCCTS_HOME)\h # Support directories SET=$(PCCTS_HOME)\support\set # Compiler stuff CC = cl CFLAGS = -I "." -I "$(PCCTS_H)" -I "$(SET)" -D "USER_ZZSYN" -D "PC" \ -D "ZZLEXBUFSIZE=65536" /D "LONGFILENAMES" /W3 /Zi DLG_OBJS = dlg_p.obj dlg_a.obj main.obj err.obj support.obj \ output.obj relabel.obj automata.obj SUPPORT_OBJS = set.obj # Dependencies dlg.exe: $(DLG_OBJS) $(SUPPORT_OBJS) $(CC) $(CFLAGS) -o dlg.exe $(DLG_OBJS) $(SUPPORT_OBJS) del *.obj dlg_p.obj: $(DLG_SRC)\dlg_p.c \ $(PCCTS_H)\antlr.h \ $(PCCTS_H)\config.h \ $(PCCTS_H)\dlgdef.h \ $(SET)\set.h \ $(DLG_SRC)\dlg.h \ $(DLG_SRC)\mode.h \ $(DLG_SRC)\tokens.h \ $(CC) -c $(CFLAGS) $(DLG_SRC)\dlg_p.c dlg_a.obj: $(DLG_SRC)\dlg_a.c \ $(PCCTS_H)\antlr.h \ $(PCCTS_H)\config.h \ $(PCCTS_H)\dlgauto.h \ $(PCCTS_H)\dlgdef.h \ $(SET)\set.h \ $(DLG_SRC)\dlg.h \ $(DLG_SRC)\mode.h \ $(DLG_SRC)\tokens.h \ $(CC) -c $(CFLAGS) $(DLG_SRC)\dlg_a.c main.obj: $(DLG_SRC)\main.c \ $(PCCTS_H)\antlr.h \ $(PCCTS_H)\config.h \ $(PCCTS_H)\dlgdef.h \ $(SET)\set.h \ $(DLG_SRC)\dlg.h \ $(DLG_SRC)\mode.h \ $(DLG_SRC)\stdpccts.h \ $(DLG_SRC)\tokens.h \ $(CC) -c $(CFLAGS) $(DLG_SRC)\main.c err.obj: $(DLG_SRC)\err.c \ $(PCCTS_H)\antlr.h \ $(PCCTS_H)\config.h \ $(PCCTS_H)\dlgdef.h \ $(PCCTS_H)\err.h \ $(SET)\set.h \ $(DLG_SRC)\dlg.h \ $(DLG_SRC)\tokens.h \ $(CC) -c $(CFLAGS) $(DLG_SRC)\err.c support.obj: $(DLG_SRC)\support.c \ $(PCCTS_H)\config.h \ $(SET)\set.h \ $(DLG_SRC)\dlg.h \ $(CC) -c $(CFLAGS) $(DLG_SRC)\support.c output.obj: $(DLG_SRC)\output.c \ $(PCCTS_H)\config.h \ $(SET)\set.h \ $(DLG_SRC)\dlg.h \ $(CC) -c $(CFLAGS) $(DLG_SRC)\output.c relabel.obj: $(DLG_SRC)\relabel.c \ $(PCCTS_H)\config.h \ $(SET)\set.h \ $(DLG_SRC)\dlg.h \ $(CC) -c $(CFLAGS) $(DLG_SRC)\relabel.c automata.obj: $(DLG_SRC)\automata.c \ $(PCCTS_H)\config.h \ $(SET)\set.h \ $(DLG_SRC)\dlg.h \ $(CC) -c $(CFLAGS) $(DLG_SRC)\automata.c set.obj: $(SET)\set.c \ $(PCCTS_H)\config.h \ $(SET)\set.h \ $(CC) -c $(CFLAGS) $(SET)\set.c gtkwave-3.3.86/contrib/pccts/dlg/stdpccts.h0000664000175000017500000000076713166335473020140 0ustar bybellbybell#ifndef STDPCCTS_H #define STDPCCTS_H /* * stdpccts.h -- P C C T S I n c l u d e * * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001 * Purdue University Electrical Engineering * With AHPCRC, University of Minnesota * ANTLR Version 1.33MR33 */ #ifndef ANTLR_VERSION #define ANTLR_VERSION 13333 #endif #include "pcctscfg.h" #include "pccts_stdio.h" #include #include "dlg.h" #define zzSET_SIZE 8 #include "antlr.h" #include "tokens.h" #include "dlgdef.h" #include "mode.h" #endif gtkwave-3.3.86/contrib/pccts/dlg/makefile.VMS0000664000175000017500000000175313166335473020300 0ustar bybellbybell$! File: MAKE.COM - Makefile for DLG 1.33 $! $! History: $! --------- $! 20-Mar-1992 Fred Scholldorf Hacked together for VAX/VMS. $! 24-Mar-1992 Fred Scholldorf LINK against VAXCRTL sharable library. $! 24-Aug-1993 Fred Scholldorf Upgrade for PCCTS V1.10. $! 27-Jan-1998 J.F. Pieronne Upgrade for DECC $! $ set noon !Don't stop on errors. $! $ if P1 .eqs. "LINK" then goto relink $! $ define pccts_h "[-.h]" $ define support_set "[-.support.set]" $! $ delete/nolog *.obj;* !Get rid of existing .OBJ files. $! $ options = "/INCLUDE=(pccts_h,support_set)/define=(USER_ZZSYN)" $ CC 'options' dlg_a $ CC 'options' dlg_p $ CC 'options' err $ CC 'options' main $ CC 'options' [-.support.set]set $ CC 'options' support $ CC 'options' output $ CC 'options' relabel $ CC 'options' automata $! $relink: $ LINK /EXE=dlg.exe - dlg_a,dlg_p,err,main, - set,support,output, - relabel,automata, - sys$input:/options ! sys$share:vaxcrtl.exe/share $ EXIT gtkwave-3.3.86/contrib/pccts/dlg/output.c0000664000175000017500000005260313166335473017640 0ustar bybellbybell/* output.c, output generator for dlg * * Output Notes: * * DfaStates == number of dfa nodes in automaton (just a #define) * DfaState == type large enough to index every node in automaton * <256 unsigned char, <65536 unsigned short, etc. * * Thus, the elements in each of the automaton states (st%d) are type DfaState * and are size appropriately, since they must be able to index the next * automaton state. * * dfa[] == a linear array that points to all the automaton states (st%d) * (dfa_base[] should be the same, but isn't right now) * * accepts[] == Taking a closer look at this one, it probably shouldn't be type * DfaState because there is no real requirement that the number of * accepts states is less than the number of dfa state. However, if * the number of accept states was more than the number of DFA states * then the lexical specification would be really ambiguous. * * Another note. Is that is should be possible to fold accepts[] and * actions[] together. If this is done, I would suggest get rid of * accept[] and make actions[] have an entry for each state (st%d) in * the automaton. * * dfa_base[] == starting location for each lexical mode. This should be * Dfastate type (but isn't right now), since it points to the states * in the automaton. * * dfa_class_no[] == indicates the number of columns each lexical mode has. * * b_class_no[] == pointer to the start of the translation array used to * convert from input character to character class. This could cause * problems if there are more than 256 classes * * shift%d[] == the actual translation arrays that convert the input character * into the character class. These will have to change if there are * more than 256 character classes. * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * DLG 1.33 * Will Cohen * With mods by Terence Parr; AHPCRC, University of Minnesota * 1989-2001 */ #include #include #include "dlg.h" #ifdef MEMCHK #include "trax.h" #else #ifdef __STDC__ #include #else #include #endif /* __STDC__ */ #endif static char *mode_name[MAX_MODES]; static int mode_number[MAX_MODES]; static int cur_mode=0; int operation_no = 0; /* used to mark nodes so that infinite loops avoided */ int dfa_basep[MAX_MODES]; /* start of each group of states */ int dfa_class_nop[MAX_MODES]; /* number of elements in each group of states*/ int gen_ansi = FALSE; /* allows ansi code to be generated */ FILE *input_stream; /* where to read description from */ FILE *output_stream; /* where to put the output */ FILE *mode_stream; /* where to put the mode.h stuff */ FILE *class_stream; /* where to put the scan.h stuff (if gen_cpp) */ /* NOTE: This section is MACHINE DEPENDENT */ #define DIF_SIZE 4 #if defined(PC) && !defined(PC32) unsigned long typesize[DIF_SIZE] = { 0x7f, 0x7fff, 0x7ffful, 0x7ffffffful }; /* MR20 */ char t0[] = "unsigned char"; char t1[] = "unsigned short"; char t2[] = "unsigned int"; char t3[] = "unsigned long"; char *typevar[DIF_SIZE] = { t0, t1, t2, t3}; #else unsigned long typesize[DIF_SIZE] = { 0x7f, 0x7fff, 0x7ffffffful, 0x7ffffffful }; /* MR20 */ char t0[] = "unsigned char"; char t1[] = "unsigned short"; char t2[] = "unsigned int"; char t3[] = "unsigned long"; char *typevar[DIF_SIZE] = { t0, t1, t2, t3}; #endif /* Added by TJP August 1994 */ /* Take in MyLexer and return MyLexer_h */ static char * #ifdef __USE_PROTOS gate_symbol(char *name) #else gate_symbol(name) char *name; #endif { static char buf[100]; sprintf(buf, "%s_h", name); return buf; } /* Added by TJP August 1994 */ static char * #ifdef __USE_PROTOS mystrdup(char *s) #else mystrdup(s) char *s; #endif { char *p = (char *)malloc(strlen(s)+1); strcpy(p, s); return p; } #ifdef __USE_PROTOS void p_class_hdr(void) #else void p_class_hdr() #endif { if ( class_stream == NULL ) return; fprintf(class_stream, "#ifndef %s\n", gate_symbol(ClassName(""))); fprintf(class_stream, "#define %s\n", gate_symbol(ClassName(""))); fprintf(class_stream, "/*\n"); fprintf(class_stream, " * D L G L e x e r C l a s s D e f i n i t i o n\n"); fprintf(class_stream, " *\n"); fprintf(class_stream, " * Generated from:"); fprintf(class_stream, " %s", file_str[0]); fprintf(class_stream, "\n"); fprintf(class_stream, " *\n"); fprintf(class_stream, " * 1989-2001 by Will Cohen, Terence Parr, and Hank Dietz\n"); fprintf(class_stream, " * Purdue University Electrical Engineering\n"); fprintf(class_stream, " * DLG Version %s\n", version); fprintf(class_stream, " */\n\n"); fprintf(class_stream, "\n"); fprintf(class_stream, "#include \"%s\"\n", DLEXERBASE_H); } /* MR1 */ /* MR1 16-Apr-97 Split printing of class header up into several parts */ /* MR1 so that #lexprefix <<...>>and #lexmember <<...>> */ /* MR1 can be inserted in the appropriate spots */ /* MR1 */ #ifdef __USE_PROTOS void p_class_def1(void) #else void p_class_def1() #endif { if ( class_stream == NULL ) return; fprintf(class_stream, "\nclass %s : public DLGLexerBase {\n", ClassName("")); fprintf(class_stream, "public:\n"); } #ifdef __USE_PROTOS void p_class_def2(void) #else void p_class_def2() #endif { int i, m; if ( class_stream == NULL ) return; fprintf(class_stream, "public:\n"); fprintf(class_stream, "\tstatic const int MAX_MODE;\n"); fprintf(class_stream, "\tstatic const int DfaStates;\n"); for (i=0; i> */ /* MR1 */ /* MR1 */ fprintf(class_stream,"//\n"); /* MR1 */ fprintf(class_stream, /* MR1 */ "// 133MR1 Deprecated feature to allow inclusion of "); /* MR1 */ fprintf(class_stream, /* MR1 */ "user-defined code in DLG class header\n"); /* MR1 */ fprintf(class_stream,"//\n"); /* MR1 */ /* MR1 */ fprintf(class_stream,"#ifdef DLGLexerIncludeFile\n"); /* MR1 */ fprintf(class_stream,"#include DLGLexerIncludeFile\n"); /* MR1 */ fprintf(class_stream,"#endif\n"); fprintf(class_stream, "};\n"); fprintf(class_stream, "typedef ANTLRTokenType (%s::*Ptr%sMemberFunc)();\n", ClassName(""), ClassName("")); fprintf(class_stream, "#endif\n"); } /* generate required header on output */ #ifdef __USE_PROTOS void p_head(void) #else void p_head() #endif { fprintf(OUT, "/*\n"); fprintf(OUT, " * D L G tables\n"); fprintf(OUT, " *\n"); fprintf(OUT, " * Generated from:"); fprintf(OUT, " %s", file_str[0]); fprintf(OUT, "\n"); fprintf(OUT, " *\n"); fprintf(OUT, " * 1989-2001 by Will Cohen, Terence Parr, and Hank Dietz\n"); fprintf(OUT, " * Purdue University Electrical Engineering\n"); fprintf(OUT, " * DLG Version %s\n", version); fprintf(OUT, " */\n\n"); if ( gen_cpp) fprintf(OUT, "#include \"pcctscfg.h\"\n"); if ( gen_cpp ) fprintf(OUT, "#include \"pccts_stdio.h\"\n"); if ( !gen_cpp ) fprintf(OUT, "#include \"%s\"\n\n", mode_file); fprintf(OUT,"\n"); } #ifdef __USE_PROTOS void p_includes(void) #else void p_includes() #endif { fprintf(OUT, "#include \"%s\"\n", APARSER_H); fprintf(OUT, "#include \"%s\"\n", DLEXERBASE_H); fprintf(OUT, "#include \"%s\"\n", ClassName(".h")); } /* generate code to tie up any loose ends */ #ifdef __USE_PROTOS void p_tail(void) /* MR1 */ #else void p_tail() /* MR1 */ #endif { if ( gen_cpp ) { if ( strcmp(ClassName(""), DEFAULT_CLASSNAME)!=0 ) fprintf(OUT, "#define DLGLexer %s\n", ClassName("")); fprintf(OUT, "#include \"%s\"\n", DLEXER_H); /* MR23 Rename DLexer.cpp to DLexer.h */ return; } fprintf(OUT, "\n"); fprintf(OUT, "\n"); if (comp_level) fprintf(OUT, "#define ZZSHIFT(c) (b_class_no[zzauto][1+c])\n"); else fprintf(OUT, "#define ZZSHIFT(c) (1+c)\n"); if ( !gen_cpp ) fprintf(OUT, "#define MAX_MODE %d\n",mode_counter); fprintf(OUT, "#include \"dlgauto.h\"\n"); } /* output the table of DFA for general use */ #ifdef __USE_PROTOS void p_tables() #else void p_tables() #endif { if ( !gen_cpp ) { fprintf(OUT, "#define DfaStates\t%d\n", dfa_allocated); fprintf(OUT, "typedef %s DfaState;\n\n", minsize(dfa_allocated)); } if ( gen_cpp ) { int i; fprintf(OUT, "\n"); fprintf(OUT, "const int %s::MAX_MODE=%d;\n", ClassName(""), mode_counter); fprintf(OUT, "const int %s::DfaStates=%d;\n", ClassName(""), dfa_allocated); for (i=0; i typesize[i]) /* MR20 */ ++i; return typevar[i]; } #ifdef __USE_PROTOS void p_node_table(void) #else void p_node_table() #endif { register int i; register int m = 0; for(m=0; m<(mode_counter-1); ++m){ for(i=dfa_basep[m]; itrans[j]; if (trans == NIL_INDEX) trans = dfa_allocated+1; /* all of DFA moved down one in array */ fprintf(OUT, "%d", trans-1); fprintf(OUT, ", "); if (!(--items_on_line)){ fprintf(OUT, "\n "); items_on_line = MAX_ON_LINE; } } #if 1 /* put in jump to error state */ fprintf(OUT, "%d\n};\n\n", dfa_allocated); #else fprintf(OUT, "\n};\n\n"); #endif } #ifdef __USE_PROTOS void p_dfa_table(void) #else void p_dfa_table() #endif { register int i; fprintf(OUT, "\n%sDfaState *%sdfa[%d] = {\n", gen_cpp?ClassName("::"):"",gen_cpp?ClassName("::"):"", dfa_allocated); for (i=0; i<(dfa_allocated-1); ++i){ fprintf(OUT, "\tst%d,\n", i); } fprintf(OUT, "\tst%d\n", i); fprintf(OUT, "};\n\n"); } #ifdef __USE_PROTOS void p_accept_table(void) #else void p_accept_table() #endif { register int i = 1; register int items_on_line = 0; int true_interactive = TRUE; /* make sure element for one past (zzerraction) -WEC 12/16/92 */ fprintf(OUT,"\n%sDfaState %saccepts[%d] = {\n ", gen_cpp?ClassName("::"):"", gen_cpp?ClassName("::"):"", dfa_allocated+1); /* don't do anything if no dfa nodes */ if (i>dfa_allocated) goto skip_accepts; for (;;) { int accept=0; /* MR14a - Manuel Kessler (mlkessle@cip.physik.uni-wuerzburg.de) */ set accept_set; set nfa_states; unsigned int *t, *nfa_i; unsigned int *q, *regular_expr; accept_set = empty; nfa_states = DFA(i)->nfa_states; t = nfa_i = set_pdq(nfa_states); /* NOTE: picks lowest accept because accepts monotonic */ /* with respect to nfa node numbers and set_pdq */ /* returns in that order */ while((*nfa_i != nil) && (!(accept = NFA(*nfa_i)->accept))){ nfa_i++; } /* figure out if more than one accept state there */ if (warn_ambig ){ set_orel(accept, &accept_set); while(*nfa_i != nil){ set_orel(NFA(*nfa_i)->accept, &accept_set); nfa_i++; } /* remove error action from consideration */ set_rm(0, accept_set); if( set_deg(accept_set)>1){ fprintf(stderr, "dlg warning: ambiguous regular expression "); q = regular_expr = set_pdq(accept_set); while(*regular_expr != nil){ fprintf(stderr," %d ", *regular_expr); ++regular_expr; } fprintf(stderr, "\n"); free(q); } } if ((DFA(i)->alternatives) && (accept != 0)){ true_interactive = FALSE; } fprintf(OUT, "%d, ", accept); /* free up memory before we "break" below -ATG 4/6/95 */ free(t); set_free(accept_set); if ((++i)>dfa_allocated) break; if ((++items_on_line)>=MAX_ON_LINE){ fprintf(OUT,"\n "); items_on_line = 0; } /* free(t); set_free(accept_set); */ } /* make sure element for one past (zzerraction) -WEC 12/16/92 */ skip_accepts: fprintf(OUT, "0\n};\n\n"); } #ifdef __USE_PROTOS void p_action_table(void) #else void p_action_table() #endif { register int i; char* theClassName = ClassName(""); if ( gen_cpp ) fprintf(OUT, "Ptr%sMemberFunc %s::actions[%d] = {\n", theClassName, theClassName, action_no+1); else fprintf(OUT, "void (*actions[%d])() = {\n", action_no+1); if ( gen_cpp ) /* fprintf(OUT, "\t(Ptr%sMemberFunc)&%s::erraction,\n", theClassName, theClassName);*/ fprintf(OUT, "\t&%s::erraction,\n", theClassName); else fprintf(OUT, "\tzzerraction,\n"); for (i=1; i=CHAR_RANGE) break; fprintf(OUT,", "); if ((++items_on_line)>=MAX_ON_LINE){ fprintf(OUT,"\n "); items_on_line = 0; } } fprintf(OUT, "\n};\n\n"); } #ifdef __USE_PROTOS void p_base_table(void) #else void p_base_table() #endif { register int m; fprintf(OUT, "%sDfaState %sdfa_base[] = {\n", gen_cpp?ClassName("::"):"static ", gen_cpp?ClassName("::"):""); for(m=0; m<(mode_counter-1); ++m) fprintf(OUT, "\t%d,\n", dfa_basep[m]-1); fprintf(OUT, "\t%d\n};\n\n", dfa_basep[m]-1); } #ifdef __USE_PROTOS void p_class_table(void) /* MR1 */ #else void p_class_table() /* MR1 */ #endif { #if 0 register int m; fprintf(OUT,"%s int %sdfa_class_no[] = {\n", gen_cpp?"":"static", gen_cpp?ClassName("::"):""); for(m=0; m<(mode_counter-1); ++m) fprintf(OUT,"\t%d,\n", dfa_class_nop[m]); fprintf(OUT,"\t%d\n};\n\n", dfa_class_nop[m]); #endif } #ifdef __USE_PROTOS void p_bshift_table(void) /* MR1 */ #else void p_bshift_table() /* MR1 */ #endif { register int m; fprintf(OUT,"%s unsigned char *%sb_class_no[] = {\n", gen_cpp?"":"static", gen_cpp?ClassName("::"):""); for(m=0; m<(mode_counter-1); ++m) fprintf(OUT, "\tshift%d,\n", m); fprintf(OUT, "\tshift%d\n};\n\n", m); } #ifdef __USE_PROTOS void p_alternative_table(void) /* MR1 */ #else void p_alternative_table() /* MR1 */ #endif { register int i; if ( !gen_cpp ) fprintf(OUT, "#define ZZINTERACTIVE\n\n"); if ( gen_cpp ) fprintf(OUT, "DLGChar %salternatives[%d] = {\n", /* mr23 vhs %sDfaStates+1 */ ClassName("::"), dfa_allocated+1); /* vhs ClassName("::")); */ else fprintf(OUT, "static %s zzalternatives[DfaStates+1] = {\n", minsize(dfa_allocated)); for(i=1; i<=dfa_allocated; ++i) fprintf(OUT, "\t%d,\n", DFA(i)->alternatives); fprintf(OUT, "/* must have 0 for zzalternatives[DfaStates] */\n"); fprintf(OUT, "\t0\n};\n\n"); } #ifdef __USE_PROTOS void p_mode_def(char *s,int m) /* MR1 */ #else void p_mode_def(s,m) /* MR1 */ char *s; int m; #endif { if ( gen_cpp ) { mode_name[cur_mode] = mystrdup(s); mode_number[cur_mode] = m; cur_mode++; } else fprintf(mode_stream, "#define %s %d\n", s, m); } #ifdef __USE_PROTOS char * ClassName(char *suffix) #else char * ClassName(suffix) char *suffix; #endif { static char buf[200]; extern char *class_name; sprintf(buf, "%s%s", class_name, suffix); return buf; } #ifdef DEBUG /* print out a particular nfa node that is pointed to by p */ #ifdef __USE_PROTOS void p_nfa_node(nfa_node *p) #else void p_nfa_node(p) nfa_node *p; #endif { register nfa_node *t; if (p != NIL_INDEX){ printf("NFA state : %d\naccept state : %d\n", NFA_NO(p),p->accept); if (p->trans[0] != NIL_INDEX){ printf("trans[0] => %d on ", NFA_NO(p->trans[0])); p_set(p->label); printf("\n"); } else printf("trans[0] => nil\n"); if (p->trans[1] != NIL_INDEX) printf("trans[1] => %d on epsilon\n", NFA_NO(p->trans[1])); else printf("trans[1] => nil\n"); printf("\n"); } } #endif #ifdef DEBUG /* code to print out special structures when using a debugger */ #ifdef __USE_PROTOS void p_nfa(p) #else void p_nfa(nfa_node *p) nfa_node *p; /* state number also index into array */ #endif { /* each node has a marker on it so it only gets printed once */ operation_no++; /* get new number */ s_p_nfa(p); } #ifdef __USE_PROTOS void s_p_nfa(nfa_node *p) #else void s_p_nfa(p) nfa_node *p; /* state number also index into array */ #endif { if ((p != NIL_INDEX) && (p->nfa_set != operation_no)){ /* so it is only printed once */ p->nfa_set = operation_no; p_nfa_node(p); s_p_nfa(p->trans[0]); s_p_nfa(p->trans[1]); } } #ifdef __USE_PROTOS void p_dfa_node(dfa_node *p) #else void p_dfa_node(p) dfa_node *p; #endif { int i; if (p != NIL_INDEX){ printf("DFA state :%d\n",NFA_NO(p)); if (p->done) printf("done\n"); else printf("undone\n"); printf("from nfa states : "); p_set(p->nfa_states); printf("\n"); /* NOTE: trans arcs stored as ints rather than pointer*/ for (i=0; itrans[i]); } printf("\n\n"); } } #ifdef __USE_PROTOS void p_dfa(void) #else void p_dfa() #endif { /* prints out all the dfa nodes actually allocated */ int i; for (i = 1; i<=dfa_allocated; i++) p_dfa_node(NFA(i)); } /* print out numbers in the set label */ #ifdef __USE_PROTOS void p_set(set label) #else void p_set(label) set label; #endif { unsigned *t, *e; if (set_nil(label)){ printf("epsilon\n"); }else{ t = e = set_pdq(label); while(*e != nil){ printf("%d ", (*e+MIN_CHAR)); e++; } printf("\n"); free(t); } } #endif gtkwave-3.3.86/contrib/pccts/dlg/Makefile.in0000664000175000017500000005135313166335473020202 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : noinst_PROGRAMS = dlg$(EXEEXT) subdir = contrib/pccts/dlg DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_dlg_OBJECTS = automata.$(OBJEXT) dlg_p.$(OBJEXT) dlg_a.$(OBJEXT) \ err.$(OBJEXT) main.$(OBJEXT) output.$(OBJEXT) \ relabel.$(OBJEXT) set.$(OBJEXT) support.$(OBJEXT) dlg_OBJECTS = $(am_dlg_OBJECTS) dlg_LDADD = $(LDADD) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(dlg_SOURCES) DIST_SOURCES = $(dlg_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CFLAGS = -I. -I$(srcdir)/../support/set \ -I$(srcdir)/../h -DUSER_ZZSYN -DZZLEXBUFSIZE=32000 dlg_SOURCES = \ automata.c dlg.h dlg_p.c dlg_a.c err.c main.c mode.h \ output.c relabel.c $(srcdir)/../support/set/set.c \ stdpccts.h support.c tokens.h # hopefully this won't produce some sort of chicken and egg problem ANTLR = ../antlr/antlr DLG = ./dlg EXTRA_DIST = \ DlgMS.mak DlgMSVC50.dsp DlgMSVC50.dsw DlgMSVC60.dsp \ DlgMSVC60.dsw dlg.1 dlg.r dlg1.txt dlg68K.make \ dlgPPC.make dlg_p.g makefile.VMS makefile1 parser.dlg \ watdlg.mak all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/pccts/dlg/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/pccts/dlg/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) dlg$(EXEEXT): $(dlg_OBJECTS) $(dlg_DEPENDENCIES) $(EXTRA_dlg_DEPENDENCIES) @rm -f dlg$(EXEEXT) $(AM_V_CCLD)$(LINK) $(dlg_OBJECTS) $(dlg_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/automata.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_a.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlg_p.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/err.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/output.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relabel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/set.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/support.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` set.o: $(srcdir)/../support/set/set.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT set.o -MD -MP -MF $(DEPDIR)/set.Tpo -c -o set.o `test -f '$(srcdir)/../support/set/set.c' || echo '$(srcdir)/'`$(srcdir)/../support/set/set.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/set.Tpo $(DEPDIR)/set.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/../support/set/set.c' object='set.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o set.o `test -f '$(srcdir)/../support/set/set.c' || echo '$(srcdir)/'`$(srcdir)/../support/set/set.c set.obj: $(srcdir)/../support/set/set.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT set.obj -MD -MP -MF $(DEPDIR)/set.Tpo -c -o set.obj `if test -f '$(srcdir)/../support/set/set.c'; then $(CYGPATH_W) '$(srcdir)/../support/set/set.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../support/set/set.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/set.Tpo $(DEPDIR)/set.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/../support/set/set.c' object='set.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o set.obj `if test -f '$(srcdir)/../support/set/set.c'; then $(CYGPATH_W) '$(srcdir)/../support/set/set.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../support/set/set.c'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am # Don't worry about the ambiguity messages coming from antlr # for making antlr.c etc... [should be 10 of them, I think] dlg_p.c parser.dlg err.c tokens.h : $(srcdir)/dlg_p.g @if test -x ${ANTLR} ; then \ echo "${ANTLR} $(srcdir)/dlg_p.g" ; \ ${ANTLR} $(srcdir)/dlg_p.g ; \ else \ echo "WARNING: $(srcdir)/dlg_p.g has changed making dlg_p.c parser.dlg err.c tokens.h" ; \ echo " out of date." ; \ echo " However you have not finished building $(ANTLR) yet. So you may want to" ; \ echo " build again a 2nd time after your build (hopefully) finishes." ; \ fi dlg_a.c mode.h: $(srcdir)/parser.dlg @if test -x ${DLG} ; then \ echo "${DLG} -C2 $(srcdir)/parser.dlg scan.c" ; \ ${DLG} -C2 $(srcdir)/parser.dlg dlg_a.c ; \ else \ echo "WARNING: $(srcdir)/parser.g has changed making dlg_a.c and mode.h out of date." ; \ echo " However you have not finished building $(DLG) yet. So you may want to" ; \ echo " build again a 2nd time after your build (hopefully) finishes." ; \ fi # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/contrib/pccts/Makefile.am0000664000175000017500000000057013166335473017416 0ustar bybellbybell## -*- makefile -*- ## SUBDIRS= IBM_VISUAL_AGE_PROJECTS antlr dlg h sorcerer support testcpp EXTRA_DIST= \ CHANGES_FROM_131.txt CHANGES_FROM_133.txt \ CHANGES_FROM_133_BEFORE_MR13.txt CHANGES_SUMMARY.txt \ KNOWN_PROBLEMS.txt MPW_Read_Me \ NOTES.OS2 NOTES.bcc NOTES.msvc NOTES.watcom README \ RIGHTS history.ps history.txt install68K.mpw \ installPPC.mpw makefile.vms gtkwave-3.3.86/contrib/pccts/installPPC.mpw0000664000175000017500000000401013166335473020111 0ustar bybellbybell# File name installPPC.mpw # # Description This script builds PPC version of antlr, dlg and sor. # and install them into Tools folder in your MPW. # They have commando interfaces. # # Installation Set Directory to the directory containing this file. # Enter "installPPC.mpw" and press enter key. # # Requirements MrC(for PPC) compiler # http://developer.apple.com/dev/tools/mpw-tools/compilers/index.html # # Author Kenji Tanaka (kentar@osa.att.ne.jp) # http://www.geocities.com/SiliconValley/Platform/5502/pccts # Created 06/16/98 # Modified 12/14/98 Echo "# `Date -t` ----- Building PPC version of PCCTS tools." # Make 'Macintosh' folders to hold object files. Echo "# `Date -t` ----- Making Object File Folders." If (!`exists :dlg:Obj:`) NewFolder :dlg:Obj: End If (!`exists :antlr:Obj:`) NewFolder :antlr:Obj: End If (!`exists :sorcerer:Obj:`) NewFolder :sorcerer:Obj: End Echo "# `Date -t` ----- Done." Echo "#" # DLG build commands Echo "# `Date -t` ----- Building DLG." Echo "# `Date -t` ----- Analyzing dependencies." Directory :dlg: Begin Echo "Set Echo 1" Make Install -f dlgPPC.make End > dlg.makeout Echo "# `Date -t` ----- Executing build commands." dlg.makeout Delete dlg.makeout Delete -y Obj Echo "# `Date -t` ----- Done." Echo "#" Directory :: # ANTLR build commands Echo "# `Date -t` ----- Building ANTLR." Echo "# `Date -t` ----- Analyzing dependencies." Directory :antlr: Begin Echo "Set Echo 1" Make Install -f antlrPPC.make End > antlr.makeout antlr.makeout Delete antlr.makeout Delete -y Obj Echo "# `Date -t` ----- Done." Echo "#" Directory :: # SORCERER build commands Echo "# `Date -t` ----- Building SORCERER." Echo "# `Date -t` ----- Analyzing dependencies." Directory :sorcerer: Begin Echo "Set Echo 1" Make Install -f sorPPC.make End > sorcerer.makeout sorcerer.makeout Delete sorcerer.makeout Delete -y Obj Echo "# `Date -t` ----- Done." Echo "#" Directory :: # Done Echo "# `Date -t` ----- Done Building PPC version of PCCTS tools." gtkwave-3.3.86/contrib/pccts/support/0000775000175000017500000000000013166335473017074 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/support/Makefile.am0000664000175000017500000000012313166335473021124 0ustar bybellbybell## -*- makefile -*- ## SUBDIRS= DECmms genmk rexpr set sym EXTRA_DIST= msvc.dsp gtkwave-3.3.86/contrib/pccts/support/set/0000775000175000017500000000000013166335473017667 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/support/set/Makefile.am0000664000175000017500000000006113166335473021720 0ustar bybellbybell## -*- makefile -*- ## EXTRA_DIST= set.c set.h gtkwave-3.3.86/contrib/pccts/support/set/set.c0000664000175000017500000003646413166335473020643 0ustar bybellbybell/* set.c The following is a general-purpose set library originally developed by Hank Dietz and enhanced by Terence Parr to allow dynamic sets. Sets are now structs containing the #words in the set and a pointer to the actual set words. Generally, sets need not be explicitly allocated. They are created/extended/shrunk when appropriate (e.g. in set_of()). HOWEVER, sets need to be destroyed (free()ed) when they go out of scope or are otherwise no longer needed. A routine is provided to free a set. Sets can be explicitly created with set_new(s, max_elem). Sets can be declared to have minimum size to reduce realloc traffic. Default minimum size = 1. Sets can be explicitly initialized to have no elements (set.n == 0) by using the 'empty' initializer: Examples: set a = empty; -- set_deg(a) == 0 return( empty ); Example set creation and destruction: set set_of2(e,g) unsigned e,g; { set a,b,c; b = set_of(e); -- Creates space for b and sticks in e set_new(c, g); -- set_new(); set_orel() ==> set_of() set_orel(g, &c); a = set_or(b, c); . . . set_free(b); set_free(c); return( a ); } 1987 by Hank Dietz Modified by: Terence Parr Purdue University October 1989 Made it smell less bad to C++ 7/31/93 -- TJP */ #include #include "pcctscfg.h" #ifdef __STDC__ #include #else #include #endif #include #include "set.h" #define MIN(i,j) ( (i) > (j) ? (j) : (i)) #define MAX(i,j) ( (i) < (j) ? (j) : (i)) /* elems can be a maximum of 32 bits */ static unsigned bitmask[] = { 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010, 0x00000020, 0x00000040, 0x00000080, 0x00000100, 0x00000200, 0x00000400, 0x00000800, 0x00001000, 0x00002000, 0x00004000, 0x00008000, #if !defined(PC) || defined(PC32) 0x00010000, 0x00020000, 0x00040000, 0x00080000, 0x00100000, 0x00200000, 0x00400000, 0x00800000, 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000 #endif }; set empty = set_init; static unsigned min=1; #define StrSize 200 #ifdef MEMCHK #define CHK(a) \ if ( a.setword != NULL ) \ if ( !valid(a.setword) ) \ {fprintf(stderr, "%s(%d): invalid set\n",__FILE__,__LINE__); exit(-1);} #else #define CHK(a) #endif /* * Set the minimum size (in words) of a set to reduce realloc calls */ void #ifdef __USE_PROTOS set_size( unsigned n ) #else set_size( n ) unsigned n; #endif { min = n; } unsigned int #ifdef __USE_PROTOS set_deg( set a ) #else set_deg( a ) set a; #endif { /* Fast compute degree of a set... the number of elements present in the set. Assumes that all word bits are used in the set and that SETSIZE(a) is a multiple of WORDSIZE. */ register unsigned *p = &(a.setword[0]); register unsigned *endp = NULL; /* MR27 Avoid false memory check report */ register unsigned degree = 0; CHK(a); if ( a.n == 0 ) return(0); endp = &(a.setword[a.n]); while ( p < endp ) { register unsigned t = *p; register unsigned *b = &(bitmask[0]); do { if (t & *b) ++degree; } while (++b < &(bitmask[WORDSIZE])); p++; } return(degree); } set #ifdef __USE_PROTOS set_or( set b, set c ) #else set_or( b, c ) set b; set c; #endif { /* Fast set union operation */ /* resultant set size is max(b, c); */ set *big; set t; unsigned int m,n; register unsigned *r, *p, *q, *endp; CHK(b); CHK(c); t = empty; if (b.n > c.n) {big= &b; m=b.n; n=c.n;} else {big= &c; m=c.n; n=b.n;} set_ext(&t, m); r = t.setword; /* Or b,c until max of smaller set */ q = c.setword; p = b.setword; endp = &(b.setword[n]); while ( p < endp ) *r++ = *p++ | *q++; /* Copy rest of bigger set into result */ p = &(big->setword[n]); endp = &(big->setword[m]); while ( p < endp ) *r++ = *p++; return(t); } set #ifdef __USE_PROTOS set_and( set b, set c ) #else set_and( b, c ) set b; set c; #endif { /* Fast set intersection operation */ /* resultant set size is min(b, c); */ set t; unsigned int n; register unsigned *r, *p, *q, *endp; CHK(b); CHK(c); t = empty; n = (b.n > c.n) ? c.n : b.n; if ( n == 0 ) return t; /* TJP 4-27-92 fixed for empty set */ set_ext(&t, n); r = t.setword; /* & b,c until max of smaller set */ q = c.setword; p = b.setword; endp = &(b.setword[n]); while ( p < endp ) *r++ = *p++ & *q++; return(t); } set #ifdef __USE_PROTOS set_dif( set b, set c ) #else set_dif( b, c ) set b; set c; #endif { /* Fast set difference operation b - c */ /* resultant set size is size(b) */ set t; unsigned int n; register unsigned *r, *p, *q, *endp; CHK(b); CHK(c); t = empty; n = (b.n <= c.n) ? b.n : c.n ; if ( b.n == 0 ) return t; /* TJP 4-27-92 fixed for empty set */ /* WEC 12-1-92 fixed for c.n = 0 */ set_ext(&t, b.n); r = t.setword; /* Dif b,c until smaller set size */ q = c.setword; p = b.setword; endp = &(b.setword[n]); while ( p < endp ) *r++ = *p++ & (~ *q++); /* Copy rest of b into result if size(b) > c */ if ( b.n > n ) { p = &(b.setword[n]); endp = &(b.setword[b.n]); while ( p < endp ) *r++ = *p++; } return(t); } set #ifdef __USE_PROTOS set_of( unsigned b ) #else set_of( b ) unsigned b; #endif { /* Fast singleton set constructor operation */ static set a; if ( b == nil ) return( empty ); set_new(a, b); a.setword[DIVWORD(b)] = bitmask[MODWORD(b)]; return(a); } /* * Extend (or shrink) the set passed in to have n words. * * if n is smaller than the minimum, boost n to have the minimum. * if the new set size is the same as the old one, do nothing. * * TJP 4-27-92 Fixed so won't try to alloc 0 bytes */ void #ifdef __USE_PROTOS set_ext( set *a, unsigned int n ) #else set_ext( a, n ) set *a; unsigned int n; #endif { register unsigned *p; register unsigned *endp; unsigned int size; CHK((*a)); if ( a->n == 0 ) { if ( n == 0 ) return; if (a->setword != NULL) { free (a->setword); /* MR20 */ } a->setword = (unsigned *) calloc(n, BytesPerWord); if ( a->setword == NULL ) { fprintf(stderr, "set_ext(%d words): cannot allocate set\n", n); exit(-1); } a->n = n; return; } if ( n < min ) n = min; if ( a->n == n || n == 0 ) return; size = a->n; a->n = n; a->setword = (unsigned *) realloc( (char *)a->setword, (n*BytesPerWord) ); if ( a->setword == NULL ) { fprintf(stderr, "set_ext(%d words): cannot allocate set\n", n); exit(-1); } p = &(a->setword[size]); /* clear from old size to new size */ endp = &(a->setword[a->n]); do { *p++ = 0; } while ( p < endp ); } set #ifdef __USE_PROTOS set_not( set a ) #else set_not( a ) set a; #endif { /* Fast not of set a (assumes all bits used) */ /* size of resultant set is size(a) */ /* ~empty = empty cause we don't know how bit to make set */ set t; register unsigned *r; register unsigned *p = a.setword; register unsigned *endp = &(a.setword[a.n]); CHK(a); t = empty; if ( a.n == 0 ) return( empty ); set_ext(&t, a.n); r = t.setword; do { *r++ = (~ *p++); } while ( p < endp ); return(t); } int #ifdef __USE_PROTOS set_equ( set a, set b ) #else set_equ( a, b ) set a; set b; #endif { /* 8-Nov-97 Make it work with sets of different sizes */ /* Easy to understand, too. Probably faster. */ /* Check for a equal to b */ unsigned int count; /* MR11 */ unsigned int i; /* MR11 */ CHK(a); CHK(b); count=MIN(a.n,b.n); if (count == 0) return 1; for (i=0; i < count; i++) { if (a.setword[i] != b.setword[i]) return 0; }; if (a.n < b.n) { for (i=count; i < b.n; i++) { if (b.setword[i] != 0) return 0; } return 1; } else if (a.n > b.n) { for (i=count; i < a.n; i++) { if (a.setword[i] != 0) return 0; } return 1; } else { return 1; }; } int #ifdef __USE_PROTOS set_sub( set a, set b ) #else set_sub( a, b ) set a; set b; #endif { /* 8-Nov-97 Make it work with sets of different sizes */ /* Easy to understand, too. Probably faster. */ /* Check for a is a PROPER subset of b */ unsigned int count; unsigned int i; CHK(a); CHK(b); if (a.n == 0) return 1; count=MIN(a.n,b.n); for (i=0; i < count; i++) { if (a.setword[i] & ~b.setword[i]) return 0; }; if (a.n <= b.n) { return 1; } else { for (i=count; i a.n ) return(0); /* Otherwise, we have to check */ return( a.setword[DIVWORD(b)] & bitmask[MODWORD(b)] ); } int #ifdef __USE_PROTOS set_nil( set a ) #else set_nil( a ) set a; #endif { /* Fast check for nil set */ register unsigned *p = a.setword; register unsigned *endp; CHK(a); if ( a.n == 0 ) return(1); endp = &(a.setword[a.n]); /* The set is not empty if any word used to store the set is non-zero. This means one must be a bit careful about doing things like negation. */ do { if (*p) return(0); } while (++p < endp); return(1); } char * #ifdef __USE_PROTOS set_str( set a ) #else set_str( a ) set a; #endif { /* Fast convert set a into ASCII char string... assumes that all word bits are used in the set and that SETSIZE is a multiple of WORDSIZE. Trailing 0 bits are removed from the string. if no bits are on or set is empty, "" is returned. */ register unsigned *p = a.setword; register unsigned *endp = &(a.setword[a.n]); static char str_tmp[StrSize+1]; register char *q = &(str_tmp[0]); CHK(a); if ( a.n==0 ) {*q=0; return( &(str_tmp[0]) );} do { register unsigned t = *p; register unsigned *b = &(bitmask[0]); do { *(q++) = (char) ((t & *b) ? '1' : '0'); } while (++b < &(bitmask[WORDSIZE])); } while (++p < endp); /* Trim trailing 0s & NULL terminate the string */ while ((q > &(str_tmp[0])) && (*(q-1) != '1')) --q; *q = 0; return(&(str_tmp[0])); } set #ifdef __USE_PROTOS set_val( register char *s ) #else set_val( s ) register char *s; #endif { /* Fast convert set ASCII char string into a set. If the string ends early, the remaining set bits are all made zero. The resulting set size is just big enough to hold all elements. */ static set a; register unsigned *p, *endp; set_new(a, strlen(s)); p = a.setword; endp = &(a.setword[a.n]); do { register unsigned *b = &(bitmask[0]); /* Start with a word with no bits on */ *p = 0; do { if (*s) { if (*s == '1') { /* Turn-on this bit */ *p |= *b; } ++s; } } while (++b < &(bitmask[WORDSIZE])); } while (++p < endp); return(a); } /* * Or element e into set a. a can be empty. */ void #ifdef __USE_PROTOS set_orel( unsigned e, set *a ) #else set_orel( e, a ) unsigned e; set *a; #endif { CHK((*a)); if ( e == nil ) return; if ( NumWords(e) > a->n ) set_ext(a, NumWords(e)); a->setword[DIVWORD(e)] |= bitmask[MODWORD(e)]; } /* * Or set b into set a. a can be empty. does nothing if b empty. */ void #ifdef __USE_PROTOS set_orin( set *a, set b ) #else set_orin( a, b ) set *a; set b; #endif { /* Fast set union operation */ /* size(a) is max(a, b); */ unsigned int m; register unsigned *p, *q = b.setword, *endq; /* MR20 */ CHK((*a)); CHK(b); if ( b.n == 0 ) return; endq = &(b.setword[b.n]); /* MR20 */ m = (a->n > b.n) ? a->n : b.n; set_ext(a, m); p = a->setword; do { *p++ |= *q++; } while ( q < endq ); } /* * And set b into set a. a can be empty. does nothing if b empty. */ void #ifdef __USE_PROTOS set_andin( set *a, set b ) #else set_andin( a, b ) set *a; set b; #endif { /* Fast set intersection operation */ /* size(a) is max(a, b); */ unsigned int m; register unsigned *p, *q = b.setword, *endq = &(b.setword[b.n]); CHK((*a)); CHK(b); if ( b.n == 0 ) return; m = (a->n > b.n) ? a->n : b.n; set_ext(a, m); p = a->setword; do { *p++ &= *q++; } while ( q < endq ); } void #ifdef __USE_PROTOS set_rm( unsigned e, set a ) #else set_rm( e, a ) unsigned e; set a; #endif { /* Does not effect size of set */ CHK(a); if ( (e == nil) || (NumWords(e) > a.n) ) return; a.setword[DIVWORD(e)] ^= (a.setword[DIVWORD(e)]&bitmask[MODWORD(e)]); } void #ifdef __USE_PROTOS set_clr( set a ) #else set_clr( a ) set a; #endif { /* Does not effect size of set */ register unsigned *p = a.setword; register unsigned *endp; CHK(a); if ( a.n == 0 ) return; endp = &(a.setword[a.n]); do { *p++ = 0; } while ( p < endp ); } set #ifdef __USE_PROTOS set_dup( set a ) #else set_dup( a ) set a; #endif { set b; register unsigned *p, *q = a.setword, *endq; /* MR20 */ CHK(a); b = empty; if ( a.n == 0 ) return( empty ); endq = &(a.setword[a.n]); /* MR20 */ set_ext(&b, a.n); p = b.setword; do { *p++ = *q++; } while ( q < endq ); return(b); } /* * Return a nil terminated list of unsigned ints that represents all * "on" bits in the bit set. * * e.g. {011011} --> {1, 2, 4, 5, nil} * * _set_pdq and set_pdq are useful when an operation is required on each element * of a set. Normally, the sequence is: * * while ( set_deg(a) > 0 ) { * e = set_int(a); * set_rm(e, a); * ...process e... * } * Now, * * t = e = set_pdq(a); * while ( *e != nil ) { * ...process *e... * e++; * } * free( t ); * * We have saved many set calls and have not destroyed set a. */ void #ifdef __USE_PROTOS _set_pdq( set a, register unsigned *q ) #else _set_pdq( a, q ) set a; register unsigned *q; #endif { register unsigned *p = a.setword, *endp = &(a.setword[a.n]); register unsigned e=0; CHK(a); /* are there any space (possibility of elements)? */ if ( a.n == 0 ) return; do { register unsigned t = *p; register unsigned *b = &(bitmask[0]); do { if ( t & *b ) *q++ = e; ++e; } while (++b < &(bitmask[WORDSIZE])); } while (++p < endp); *q = nil; } /* * Same as _set_pdq except allocate memory. set_pdq is the natural function * to use. */ unsigned * #ifdef __USE_PROTOS set_pdq( set a ) #else set_pdq( a ) set a; #endif { unsigned *q; int max_deg; CHK(a); max_deg = WORDSIZE*a.n; /* assume a.n!=0 & no elements is rare, but still ok */ if ( a.n == 0 ) return(NULL); q = (unsigned *) malloc((max_deg+1)*BytesPerWord); if ( q == NULL ) return( NULL ); _set_pdq(a, q); return( q ); } /* a function that produces a hash number for the set */ unsigned int #ifdef __USE_PROTOS set_hash( set a, register unsigned int mod ) #else set_hash( a, mod ) set a; register unsigned int mod; #endif { /* Fast hash of set a (assumes all bits used) */ register unsigned *p = &(a.setword[0]); register unsigned *endp = &(a.setword[a.n]); register unsigned i = 0; CHK(a); while (p> LogWordSize) /* x / WORDSIZE */ #define nil (~((unsigned) 0)) /* An impossible set member all bits on (big!) */ typedef struct _set { unsigned int n; /* Number of words in set */ unsigned *setword; } set; #define set_init {0, NULL} #define set_null(a) ((a).setword==NULL) #define NumBytes(x) (((x)>>3)+1) /* Num bytes to hold x */ #define NumWords(x) ((((unsigned)(x))>>LogWordSize)+1) /* Num words to hold x */ /* M a c r o s */ /* make arg1 a set big enough to hold max elem # of arg2 */ #define set_new(a,_max) \ if (((a).setword=(unsigned *)calloc(NumWords(_max),BytesPerWord))==NULL) \ fprintf(stderr, "set_new: Cannot allocate set with max of %d\n", (int)(_max)); \ (a).n = NumWords(_max); #define set_free(a) \ {if ( (a).setword != NULL ) free((char *)((a).setword)); \ (a) = empty;} #ifdef __USE_PROTOS extern void set_size( unsigned ); extern unsigned int set_deg( set ); extern set set_or( set, set ); extern set set_and( set, set ); extern set set_dif( set, set ); extern set set_of( unsigned ); extern void set_ext( set *, unsigned int ); extern set set_not( set ); extern int set_equ( set, set ); extern int set_sub( set, set ); extern unsigned set_int( set ); extern int set_el( unsigned, set ); extern int set_nil( set ); extern char * set_str( set ); extern set set_val( register char * ); extern void set_orel( unsigned, set * ); extern void set_orin( set *, set ); extern void set_andin( set *, set ); extern void set_rm( unsigned, set ); extern void set_clr( set ); extern set set_dup( set ); extern void set_PDQ( set, register unsigned * ); extern unsigned *set_pdq( set ); extern void _set_pdq( set a, register unsigned *q ); extern unsigned int set_hash( set, register unsigned int ); #else extern void set_size(); extern unsigned int set_deg(); extern set set_or(); extern set set_and(); extern set set_dif(); extern set set_of(); extern void set_ext(); extern set set_not(); extern int set_equ(); extern int set_sub(); extern unsigned set_int(); extern int set_el(); extern int set_nil(); extern char * set_str(); extern set set_val(); extern void set_orel(); extern void set_orin(); extern void set_andin(); extern void set_rm(); extern void set_clr(); extern set set_dup(); extern void set_PDQ(); extern unsigned *set_pdq(); extern void _set_pdq(); extern unsigned int set_hash(); #endif extern set empty; #endif gtkwave-3.3.86/contrib/pccts/support/set/Makefile.in0000664000175000017500000003067513166335473021747 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = contrib/pccts/support/set DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = set.c set.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/pccts/support/set/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/pccts/support/set/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/contrib/pccts/support/msvc.dsp0000664000175000017500000001260013166335473020553 0ustar bybellbybell# Microsoft Developer Studio Project File - Name="support" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 5.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Static Library" 0x0104 CFG=support - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "support.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "support.mak" CFG="support - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "support - Win32 Release" (based on "Win32 (x86) Static Library") !MESSAGE "support - Win32 Debug" (based on "Win32 (x86) Static Library") !MESSAGE # Begin Project # PROP Scc_ProjName ""$/pccts/support", YGABAAAA" # PROP Scc_LocalPath "." CPP=cl.exe !IF "$(CFG)" == "support - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /nologo /W3 /GX /O2 /I "..\h" /I "..\support\set" /I "..\support" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "USER_ZZSYN" /D "PC" /D "__STDC__" /YX /FD /c BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo !ELSEIF "$(CFG)" == "support - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /nologo /W3 /GX /Z7 /Od /I "..\h" /I "..\support\set" /I "..\support" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "USER_ZZSYN" /D "PC" /D "__STDC__" /YX /FD /c BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo !ENDIF # Begin Target # Name "support - Win32 Release" # Name "support - Win32 Debug" # Begin Group "Headers" # PROP Default_Filter ".h" # Begin Source File SOURCE=.\errout.h # End Source File # Begin Source File SOURCE=.\set\set.h # End Source File # End Group # Begin Group "Source" # PROP Default_Filter "c,cpp" # Begin Source File SOURCE=.\errout.c # End Source File # Begin Source File SOURCE=.\set\set.c # End Source File # End Group # Begin Group "PCCTS' clients files" # PROP Default_Filter "" # Begin Source File SOURCE=..\h\antlr.h # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\AParser.cpp # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\AParser.h # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\ast.c # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\ast.h # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\ASTBase.cpp # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\ASTBase.h # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\AToken.h # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\ATokenBuffer.cpp # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\ATokenBuffer.h # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\ATokenStream.h # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\ATokPtr.cpp # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\ATokPtr.h # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\charbuf.h # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\charptr.c # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\charptr.h # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\pcctscfg.h # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\DLexer.cpp # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\DLexerBase.cpp # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\DLexerBase.h # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\dlgauto.h # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\dlgdef.h # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\err.h # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\int.h # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\PBlackBox.h # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\PCCTSAST.cpp # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\PCCTSAST.h # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\SList.cpp # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=..\h\SList.h # PROP Exclude_From_Build 1 # End Source File # End Group # End Target # End Project gtkwave-3.3.86/contrib/pccts/support/rexpr/0000775000175000017500000000000013166335473020234 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/support/rexpr/test.c0000664000175000017500000000065513166335473021365 0ustar bybellbybell#include #include "rexpr.h" /* * test for rexpr(). * To make this test: * cc -o rexpr test.c rexpr.c * Then from command line type: * rexpr r string * where r is the regular expression that decribes a language * and string is the string to verify. */ int main(argc,argv) int argc; char *argv[]; { if ( argc!=3 ) fprintf(stderr,"rexpr: expr s\n"); else printf("%d\n", rexpr(argv[1], argv[2])); return(0); } gtkwave-3.3.86/contrib/pccts/support/rexpr/rexpr.c0000664000175000017500000002714713166335473021553 0ustar bybellbybell/* * This file contains code for * * int rexpr(char *expr, char *s); * * which answers * * 1 if 's' is in the language described by the regular expression 'expr' * 0 if it is not * -1 if the regular expression is invalid * * Language membership is determined by constructing a non-deterministic * finite automata (NFA) from the regular expression. A depth- * first-search is performed on the NFA (graph) to check for a match of 's'. * Each non-epsilon arc consumes one character from 's'. Backtracking is * performed to check all possible paths through the NFA. * * Regular expressions follow the meta-language: * * ::= ( '|' )* * * ::= ( )* * * ::= {'~'} '[' ']' * | '(' ')' * | '{' '}' * | * * ::= { '*' | '+' } * * ::= ( )* * | { } '-' { } * * ::= Token[Atom] * * Notes: * ~ means complement the set in [..]. i.e. all characters not listed * * means match 0 or more times (can be on expression or atom) * + means match 1 or more times (can be on expression or atom) * {} optional * () grouping * [] set of atoms * x-y all characters from x to y (found only in [..]) * \xx the character with value xx * * Examples: * [a-z]+ * match 1 or more lower-case letters (e.g. variable) * * 0x[0-9A-Fa-f]+ * match a hex number with 0x on front (e.g. 0xA1FF) * * [0-9]+.[0-9]+{e[0-9]+} * match a floating point number (e.g. 3.14e21) * * Code example: * if ( rexpr("[a-zA-Z][a-zA-Z0-9]+", str) ) then str is keyword * * Terence Parr * Purdue University * April 1991 */ #include #include #ifdef __STDC__ #include #else #include #endif #include "rexpr.h" #ifdef __USE_PROTOS static int regExpr( GraphPtr g ); static int andExpr( GraphPtr g ); static int expr( GraphPtr g ); static int repeatSymbol( GraphPtr g ); static int atomList( char *p, int complement ); static void next( void ); static ArcPtr newGraphArc( void ); static NodePtr newNode( void ); static int ArcBetweenGraphNode( NodePtr i, NodePtr j, int label ); static Graph BuildNFA_atom( int label ); static Graph BuildNFA_AB( Graph A, Graph B ); static Graph BuildNFA_AorB( Graph A, Graph B ); static Graph BuildNFA_set( char *s ); static Graph BuildNFA_Astar( Graph A ); static Graph BuildNFA_Aplus( Graph A ); static Graph BuildNFA_Aoptional( Graph A ); #else static int regExpr(); static int andExpr(); static int expr(); static int repeatSymbol(); static int atomList(); static void next(); static ArcPtr newGraphArc(); static NodePtr newNode(); static int ArcBetweenGraphNode(); static Graph BuildNFA_atom(); static Graph BuildNFA_AB(); static Graph BuildNFA_AorB(); static Graph BuildNFA_set(); static Graph BuildNFA_Astar(); static Graph BuildNFA_Aplus(); static Graph BuildNFA_Aoptional(); #endif static char *_c; static int token, tokchar; static NodePtr accept; static NodePtr freelist = NULL; /* * return 1 if s in language described by expr * 0 if s is not * -1 if expr is an invalid regular expression */ #ifdef __USE_PROTOS int rexpr(char *expr,char *s) #else int rexpr(expr, s) char *expr, *s; #endif { NodePtr p,q; Graph nfa; int result; fprintf(stderr, "rexpr(%s,%s);\n", expr,s); freelist = NULL; _c = expr; next(); if ( regExpr(&nfa) == -1 ) return -1; accept = nfa.right; result = match(nfa.left, s); /* free all your memory */ p = q = freelist; while ( p!=NULL ) { q = p->track; free(p); p = q; } return result; } /* * do a depth-first-search on the NFA looking for a path from start to * accept state labelled with the characters of 's'. */ #ifdef __USE_PROTOS int match(NodePtr automaton,char *s) #else int match(automaton, s) NodePtr automaton; char *s; #endif { ArcPtr p; if ( automaton == accept && *s == '\0' ) return 1; /* match */ for (p=automaton->arcs; p!=NULL; p=p->next) /* try all arcs */ { if ( p->label == Epsilon ) { if ( match(p->target, s) ) return 1; } else if ( p->label == *s ) if ( match(p->target, s+1) ) return 1; } return 0; } /* * ::= ( '|' {} )* * * Return -1 if syntax error * Return 0 if none found * Return 1 if a regExrp was found */ #ifdef __USE_PROTOS static int regExpr(GraphPtr g) #else static int regExpr(g) GraphPtr g; #endif { Graph g1, g2; if ( andExpr(&g1) == -1 ) { return -1; } while ( token == '|' ) { int a; next(); a = andExpr(&g2); if ( a == -1 ) return -1; /* syntax error below */ else if ( !a ) return 1; /* empty alternative */ g1 = BuildNFA_AorB(g1, g2); } if ( token!='\0' ) return -1; *g = g1; return 1; } /* * ::= ( )* */ #ifdef __USE_PROTOS static int andExpr(GraphPtr g) #else static int andExpr(g) GraphPtr g; #endif { Graph g1, g2; if ( expr(&g1) == -1 ) { return -1; } while ( token==Atom || token=='{' || token=='(' || token=='~' || token=='[' ) { if (expr(&g2) == -1) return -1; g1 = BuildNFA_AB(g1, g2); } *g = g1; return 1; } /* * ::= {'~'} '[' ']' * | '(' ')' * | '{' '}' * | */ #ifdef __USE_PROTOS static int expr(GraphPtr g) #else static int expr(g) GraphPtr g; #endif { int complement = 0; char s[257]; /* alloc space for string of char in [] */ if ( token == '~' || token == '[' ) { if ( token == '~' ) {complement = 1; next();} if ( token != '[' ) return -1; next(); if ( atomList( s, complement ) == -1 ) return -1; *g = BuildNFA_set( s ); if ( token != ']' ) return -1; next(); repeatSymbol( g ); return 1; } if ( token == '(' ) { next(); if ( regExpr( g ) == -1 ) return -1; if ( token != ')' ) return -1; next(); repeatSymbol( g ); return 1; } if ( token == '{' ) { next(); if ( regExpr( g ) == -1 ) return -1; if ( token != '}' ) return -1; next(); /* S p e c i a l C a s e O p t i o n a l { } */ if ( token != '*' && token != '+' ) { *g = BuildNFA_Aoptional( *g ); } repeatSymbol( g ); return 1; } if ( token == Atom ) { *g = BuildNFA_atom( tokchar ); next(); repeatSymbol( g ); return 1; } return -1; } /* * ::= { '*' | '+' } */ #ifdef __USE_PROTOS static int repeatSymbol(GraphPtr g) #else static int repeatSymbol(g) GraphPtr g; #endif { switch ( token ) { case '*' : *g = BuildNFA_Astar( *g ); next(); break; case '+' : *g = BuildNFA_Aplus( *g ); next(); break; } return 1; } /* * ::= { }* * { } '-' { } * * a-b is same as ab * q-a is same as q */ #ifdef __USE_PROTOS static int atomList(char *p, int complement) #else static int atomList(p, complement) char *p; int complement; #endif { static unsigned char set[256]; /* no duplicates */ int first, last, i; char *s = p; if ( token != Atom ) return -1; for (i=0; i<256; i++) set[i] = 0; while ( token == Atom ) { if ( !set[tokchar] ) *s++ = tokchar; set[tokchar] = 1; /* Add atom to set */ next(); if ( token == '-' ) /* have we found '-' */ { first = *(s-1); /* Get last char */ next(); if ( token != Atom ) return -1; else { last = tokchar; } for (i = first+1; i <= last; i++) { if ( !set[tokchar] ) *s++ = i; set[i] = 1; /* Add atom to set */ } next(); } } *s = '\0'; if ( complement ) { for (i=0; i<256; i++) set[i] = !set[i]; for (i=1,s=p; i<256; i++) if ( set[i] ) *s++ = i; *s = '\0'; } return 1; } /* a somewhat stupid lexical analyzer */ #ifdef __USE_PROTOS static void next(void) #else static void next() #endif { while ( *_c==' ' || *_c=='\t' || *_c=='\n' ) _c++; if ( *_c=='\\' ) { _c++; if ( isdigit(*_c) ) { int n=0; while ( isdigit(*_c) ) { n = n*10 + (*_c++ - '0'); } if ( n>255 ) n=255; tokchar = n; } else { switch (*_c) { case 'n' : tokchar = '\n'; break; case 't' : tokchar = '\t'; break; case 'r' : tokchar = '\r'; break; default : tokchar = *_c; } _c++; } token = Atom; } else if ( isgraph(*_c) && *_c!='[' && *_c!='(' && *_c!='{' && *_c!='-' && *_c!='}' && *_c!=')' && *_c!=']' && *_c!='+' && *_c!='*' && *_c!='~' && *_c!='|' ) { token = Atom; tokchar = *_c++; } else { token = tokchar = *_c++; } } /* N F A B u i l d i n g R o u t i n e s */ #ifdef __USE_PROTOS static ArcPtr newGraphArc(void) #else static ArcPtr newGraphArc() #endif { ArcPtr p; p = (ArcPtr) calloc(1, sizeof(Arc)); if ( p==NULL ) {fprintf(stderr,"rexpr: out of memory\n"); exit(-1);} if ( freelist != NULL ) p->track = (ArcPtr) freelist; freelist = (NodePtr) p; return p; } #ifdef __USE_PROTOS static NodePtr newNode(void) #else static NodePtr newNode() #endif { NodePtr p; p = (NodePtr) calloc(1, sizeof(Node)); if ( p==NULL ) {fprintf(stderr,"rexpr: out of memory\n"); exit(-1);} if ( freelist != NULL ) p->track = freelist; freelist = p; return p; } #ifdef __USE_PROTOS static void ArcBetweenGraphNodes(NodePtr i,NodePtr j,int label) #else static void ArcBetweenGraphNodes(i, j, label) NodePtr i, j; int label; #endif { ArcPtr a; a = newGraphArc(); if ( i->arcs == NULL ) i->arctail = i->arcs = a; else {(i->arctail)->next = a; i->arctail = a;} a->label = label; a->target = j; } #ifdef __USE_PROTOS static Graph BuildNFA_atom(int label) #else static Graph BuildNFA_atom(label) int label; #endif { Graph g; g.left = newNode(); g.right = newNode(); ArcBetweenGraphNodes(g.left, g.right, label); return( g ); } #ifdef __USE_PROTOS static Graph BuildNFA_AB(Graph A,Graph B) #else static Graph BuildNFA_AB(A, B) Graph A, B; #endif { Graph g; ArcBetweenGraphNodes(A.right, B.left, Epsilon); g.left = A.left; g.right = B.right; return( g ); } #ifdef __USE_PROTOS static Graph BuildNFA_AorB(Graph A,Graph B) #else static Graph BuildNFA_AorB(A, B) Graph A, B; #endif { Graph g; g.left = newNode(); ArcBetweenGraphNodes(g.left, A.left, Epsilon); ArcBetweenGraphNodes(g.left, B.left, Epsilon); g.right = newNode(); ArcBetweenGraphNodes(A.right, g.right, Epsilon); ArcBetweenGraphNodes(B.right, g.right, Epsilon); return( g ); } #ifdef __USE_PROTOS static Graph BuildNFA_set(char *s) #else static Graph BuildNFA_set( s ) char *s; #endif { Graph g; if ( s == NULL ) return g; g.left = newNode(); g.right = newNode(); while ( *s != '\0' ) { ArcBetweenGraphNodes(g.left, g.right, *s++); } return g; } #ifdef __USE_PROTOS static Graph BuildNFA_Astar(Graph A) #else static Graph BuildNFA_Astar( A ) Graph A; #endif { Graph g; g.left = newNode(); g.right = newNode(); ArcBetweenGraphNodes(g.left, A.left, Epsilon); ArcBetweenGraphNodes(g.left, g.right, Epsilon); ArcBetweenGraphNodes(A.right, g.right, Epsilon); ArcBetweenGraphNodes(A.right, A.left, Epsilon); return( g ); } #ifdef __USE_PROTOS static Graph BuildNFA_Aplus(Graph A) #else static Graph BuildNFA_Aplus( A ) Graph A; #endif { ArcBetweenGraphNodes(A.right, A.left, Epsilon); return( A ); } #ifdef __USE_PROTOS static Graph BuildNFA_Aoptional(Graph A) #else static Graph BuildNFA_Aoptional( A ) Graph A; #endif { Graph g; g.left = newNode(); g.right = newNode(); ArcBetweenGraphNodes(g.left, A.left, Epsilon); ArcBetweenGraphNodes(g.left, g.right, Epsilon); ArcBetweenGraphNodes(A.right, g.right, Epsilon); return( g ); } gtkwave-3.3.86/contrib/pccts/support/rexpr/Makefile.in0000664000175000017500000004140313166335473022303 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : noinst_PROGRAMS = rexpr$(EXEEXT) subdir = contrib/pccts/support/rexpr DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_rexpr_OBJECTS = rexpr.$(OBJEXT) test.$(OBJEXT) rexpr_OBJECTS = $(am_rexpr_OBJECTS) rexpr_LDADD = $(LDADD) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(rexpr_SOURCES) DIST_SOURCES = $(rexpr_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ rexpr_SOURCES = rexpr.c rexpr.h test.c all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/pccts/support/rexpr/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/pccts/support/rexpr/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) rexpr$(EXEEXT): $(rexpr_OBJECTS) $(rexpr_DEPENDENCIES) $(EXTRA_rexpr_DEPENDENCIES) @rm -f rexpr$(EXEEXT) $(AM_V_CCLD)$(LINK) $(rexpr_OBJECTS) $(rexpr_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rexpr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/contrib/pccts/support/rexpr/rexpr.h0000664000175000017500000000117513166335473021551 0ustar bybellbybell#define Atom 256 /* token Atom (an impossible char value) */ #define Epsilon 257 /* epsilon arc (an impossible char value) */ /* track field must be same for all node types */ typedef struct _a { struct _a *track; /* track mem allocation */ int label; struct _a *next; struct _n *target; } Arc, *ArcPtr; typedef struct _n { struct _n *track; ArcPtr arcs, arctail; } Node, *NodePtr; typedef struct { NodePtr left, right; } Graph, *GraphPtr; #ifdef __USE_PROTOS int rexpr( char *expr, char *s ); int match( NodePtr automaton, char *s ); #else int rexpr(); int match(); #endif gtkwave-3.3.86/contrib/pccts/support/rexpr/Makefile.am0000664000175000017500000000012713166335473022270 0ustar bybellbybell## -*- makefile -*- ## noinst_PROGRAMS= rexpr rexpr_SOURCES= rexpr.c rexpr.h test.c gtkwave-3.3.86/contrib/pccts/support/genmk/0000775000175000017500000000000013166335473020175 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/support/genmk/genmk_old.c0000664000175000017500000004332113166335473022303 0ustar bybellbybell/* * genmk -- a program to make makefiles for PCCTS * * ANTLR 1.33MR10 * Terence John Parr 1989 - 1998 * Purdue University * U of MN */ #include #include "pcctscfg.h" /* be sensitive to what ANTLR/DLG call the files */ #ifdef VAXC #define DIE return 0; #define DONE return 1; #else #define DIE return 1; #define DONE return 0; #endif #ifndef require #define require(expr, err) {if ( !(expr) ) fatal(err);} #endif #define MAX_FILES 50 #define MAX_CLASSES 50 char *RENAME_OBJ_FLAG="-o", *RENAME_EXE_FLAG="-o"; char *dlg = "parser.dlg"; char *err = "err.c"; char *hdr = "stdpccts.h"; char *tok = "tokens.h"; char *mode = "mode.h"; char *scan = "scan"; char ATOKENBUFFER_O[100]; char APARSER_O[100]; char ASTBASE_O[100]; char PCCTSAST_O[100]; char LIST_O[100]; char DLEXERBASE_O[100]; /* Option flags */ static char *project="t", *files[MAX_FILES], *classes[MAX_CLASSES]; static int num_files = 0; static int num_classes = 0; static int user_lexer = 0; static char *user_token_types = NULL; static int gen_CPP = 0; static char *outdir="."; static char *dlg_class = "DLGLexer"; static int gen_trees = 0; static int gen_hoist = 0; static char cfiles[1600]=""; static char *compilerCCC="CC"; static char *compilerCC="cc"; static char *pccts_path="/usr/local/pccts"; void help(); void mk(); void pfiles(); void pclasses(); void fatal(); void warn(); typedef struct _Opt { char *option; int arg; #ifdef __cplusplus void (*process)(...); #else void (*process)(); #endif char *descr; } Opt; #ifdef __STDC__ static void ProcessArgs(int, char **, Opt *); #else static void ProcessArgs(); #endif static void pProj( s, t ) char *s; char *t; { project = t; } static void pUL( s ) char *s; { user_lexer = 1; } static void pCPP( s ) char *s; { gen_CPP = 1; } static void pUT( s, t ) char *s; char *t; { user_token_types = t; } static void pTrees( s ) char *s; { gen_trees = 1; } static void pHoist( s ) char *s; { gen_hoist = 1; } static void #ifdef __STDC__ pFile( char *s ) #else pFile( s ) char *s; #endif { if ( *s=='-' ) { fprintf(stderr, "invalid option: '%s'; ignored...",s); return; } require(num_files0 ) { warn("can't define classes w/o C++ mode; turning on C++ mode...\n"); gen_CPP=1; } if ( gen_CPP && num_classes==0 ) { fatal("must define classes >0 grammar classes in C++ mode\n"); } mk(project, files, num_files, argc, argv); DONE; } void help() { Opt *p = options; static char buf[1000+1]; fprintf(stderr, "genmk [options] f1.g ... fn.g\n"); while ( p->option!=NULL && *(p->option) != '*' ) { buf[0]='\0'; if ( p->arg ) sprintf(buf, "%s ___", p->option); else strcpy(buf, p->option); fprintf(stderr, "\t%-16s %s\n", buf, p->descr); p++; } } void mk(project, files, n, argc, argv) char *project; char **files; int n; int argc; char **argv; { int i; printf("#\n"); printf("# PCCTS makefile for: "); pfiles(files, n, NULL); printf("\n"); printf("#\n"); printf("# Created from:"); for (i=0; i0 ) { char *p = &(*files)[strlen(*files)-1]; if ( !first ) putchar(' '); first=0; while ( p > *files && *p != '.' ) --p; if ( p == *files ) { fprintf(stderr, "genmk: filenames must be file.suffix format: %s\n", *files); exit(-1); } if ( suffix == NULL ) printf("%s", *files); else { *p = '\0'; printf("%s", DIR()); if ( strcmp(suffix, "o")==0 ) printf("%s%s", *files, OBJ_FILE_SUFFIX); else printf("%s.%s", *files, suffix); *p = '.'; } files++; --n; } } void pclasses(classes, n, suffix) char **classes; int n; char *suffix; { int first=1; while ( n>0 ) { if ( !first ) putchar(' '); first=0; if ( suffix == NULL ) printf("%s", *classes); else { printf("%s", DIR()); if ( strcmp(suffix, "o")==0 ) printf("%s%s", *classes, OBJ_FILE_SUFFIX); else printf("%s.%s", *classes, suffix); } classes++; --n; } } static void #ifdef __STDC__ ProcessArgs( int argc, char **argv, Opt *options ) #else ProcessArgs( argc, argv, options ) int argc; char **argv; Opt *options; #endif { Opt *p; require(argv!=NULL, "ProcessArgs: command line NULL"); while ( argc-- > 0 ) { p = options; while ( p->option != NULL ) { if ( strcmp(p->option, "*") == 0 || strcmp(p->option, *argv) == 0 ) { if ( p->arg ) { (*p->process)( *argv, *(argv+1) ); argv++; argc--; } else (*p->process)( *argv ); break; } p++; } argv++; } } void fatal( err_) char *err_; { fprintf(stderr, "genmk: %s\n", err_); exit(1); } void warn( err_) char *err_; { fprintf(stderr, "genmk: %s\n", err_); } char *DIR() { static char buf[200+1]; if ( strcmp(outdir,TopDirectory)==0 ) return ""; sprintf(buf, "%s%s", outdir, DirectorySymbol); return buf; } gtkwave-3.3.86/contrib/pccts/support/genmk/genmk.c0000664000175000017500000006076413166335473021457 0ustar bybellbybell/* * genmk -- a program to make makefiles for PCCTS * * ANTLR 1.33MR23 * Terence John Parr 1989 - 2000 * Purdue University * U of MN */ #include #include #include "pcctscfg.h" /* be sensitive to what ANTLR/DLG call the files */ #ifdef __STDC__ void pclasses(char **classes, int n, char *suffix); #endif #ifdef VAXC #define DIE return 0; #define DONE return 1; #else #define DIE return 1; #define DONE return 0; #endif #ifndef require #define require(expr, err) {if ( !(expr) ) fatal(err);} #endif #define MAX_FILES 50 #define MAX_CFILES 1600 #define MAX_SFILES 50 #define MAX_SORS 50 #define MAX_CLASSES 50 char *RENAME_OBJ_FLAG="-o", *RENAME_EXE_FLAG="-o"; char *dlg = "parser.dlg"; char *err = "err.c"; char *hdr = "stdpccts.h"; char *tok = "tokens.h"; char *mode = "mode.h"; char *scan = "scan"; char ATOKENBUFFER_O[100]; char APARSER_O[100]; char ASTBASE_O[100]; char PCCTSAST_O[100]; char LIST_O[100]; char DLEXERBASE_O[100]; /* Option flags */ static char *project="t", *files[MAX_FILES], *classes[MAX_CLASSES]; static char *cfiles[MAX_CFILES]; static char *sfiles[MAX_SORS][MAX_SFILES],*sclasses[MAX_SORS]; static int num_sfiles[MAX_SORS]; /*sorcerer files in group */ static int num_sors = 0; /*sorcerer groups */ static int num_files = 0; /* grammar files */ static int num_cfiles = 0; /* additional C/C++ files */ static int num_classes = 0; /* ANTLR classes */ static int user_lexer = 0; static char *user_token_types = NULL; static int gen_CPP = 0; static char *outdir="."; static char *dlg_class = "DLGLexer"; static int gen_trees = 0; static int gen_hoist = 0; static int nondef_comp = 0; /* 1=compiler is non default */ static char *compilerCCC="CC"; static char *compilerCC="cc"; static char *pccts_path="/usr/local/pccts"; #ifdef __STDC__ void help(void); void mk(char *project, char **files, int n, int argc, char **argv); void pfiles(char **files, int n, char *suffix); void fatal(char *msg); void warn(char *msg); #else void help(); void mk(); void pfiles(); void fatal(); void warn(); #endif typedef struct _Opt { char *option; int arg; #ifdef __cplusplus void (*process)(...); #else void (*process)(); #endif char *descr; } Opt; #ifdef __STDC__ static void ProcessArgs(int, char **, Opt *); #else static void ProcessArgs(); #endif static void #ifdef __STDC__ pProj(char *s, char *t ) #else pProj( s, t ) char *s; char *t; #endif { project = t; } static void #ifdef __STDC__ pUL( char *s ) #else pUL( s ) char *s; #endif { user_lexer = 1; } static void #ifdef __STDC__ pCPP( char *s ) #else pCPP( s ) char *s; #endif { gen_CPP = 1; } static void #ifdef __STDC__ pUT( char *s, char *t ) #else pUT( s, t ) char *s; char *t; #endif { user_token_types = t; } static void #ifdef __STDC__ pTrees( char *s ) #else pTrees( s ) char *s; #endif { gen_trees = 1; } static void #ifdef __STDC__ pHoist( char *s ) #else pHoist( s ) char *s; #endif { gen_hoist = 1; } static void #ifdef __STDC__ pSor( char *s ) #else pSor( s ) char *s; #endif { require(num_sors0 ) { warn("can't define classes w/o C++ mode; turning on C++ mode...\n"); gen_CPP=1; } if (!gen_CPP && num_sors) { warn("can't define sorcerer group in C mode (yet); turning on C++ mode...\n"); gen_CPP=1; } if ( gen_CPP && num_classes==0 ) { fatal("must define classes >0 grammar classes in C++ mode\n"); } mk(project, files, num_files, argc, argv); DONE; } #ifdef __STDC__ void help(void) #else void help() #endif { Opt *p = options; static char buf[1000+1]; fprintf(stderr, "genmk [options] f1.g ... fn.g\n"); while ( p->option!=NULL && *(p->option) != '*' ) { buf[0]='\0'; if ( p->arg ) sprintf(buf, "%s ___", p->option); else strcpy(buf, p->option); fprintf(stderr, "\t%-16s %s\n", buf, p->descr); p++; } } #ifdef __STDC__ void mk(char *project, char **files, int n, int argc, char **argv) #else void mk(project, files, n, argc, argv) char *project; char **files; int n; int argc; char **argv; #endif { int i,j; printf("#\n"); printf("# PCCTS makefile for: "); pfiles(files, n, NULL); printf("\n"); printf("#\n"); printf("# Created from:"); for (i=0; i0) { printf("SOR_H = $(PCCTS)%ssorcerer%sh\n", DirectorySymbol, DirectorySymbol); printf("SOR_LIB = $(PCCTS)%ssorcerer%slib\n", DirectorySymbol, DirectorySymbol); } printf("BIN = $(PCCTS)%sbin\n", DirectorySymbol); printf("ANTLR = $(BIN)%santlr\n", DirectorySymbol); printf("DLG = $(BIN)%sdlg\n", DirectorySymbol); if (num_sors>0) printf("SOR = $(BIN)%ssor\n", DirectorySymbol); printf("CFLAGS = -I. -I$(ANTLR_H)"); if (num_sors>0) printf(" -I$(SOR_H)"); if ( strcmp(outdir, ".")!=0 ) printf(" -I%s", outdir); printf(" $(COTHER)"); printf("\n"); printf("AFLAGS ="); if ( strcmp(outdir,".")!=0 ) printf(" -o %s", outdir); if ( user_lexer ) printf(" -gx"); if ( gen_CPP ) printf(" -CC"); if ( strcmp(hdr,"stdpccts.h")!=0 ) printf(" -gh %s", hdr); if ( gen_trees ) printf(" -gt"); if ( gen_hoist ) { printf(" -mrhoist on") ; } else { printf(" -mrhoist off"); }; printf(" $(AOTHER)"); printf("\n"); printf("DFLAGS = -C2 -i"); if ( gen_CPP ) printf(" -CC"); if ( strcmp(dlg_class,"DLGLexer")!=0 ) printf(" -cl %s", dlg_class); if ( strcmp(outdir,".")!=0 ) printf(" -o %s", outdir); printf(" $(DOTHER)"); printf("\n"); if (num_sors>0) { printf("SFLAGS = -CPP"); if ( strcmp(outdir,".")!=0 ) printf(" -out-dir %s", outdir); printf(" $(SOTHER)\n"); } printf("GRM = "); pfiles(files, n, NULL); printf("\n"); printf("SRC = "); if ( gen_CPP ) pfiles(files, n, CPP_FILE_SUFFIX_NO_DOT); else pfiles(files, n, "c"); if ( gen_CPP ) { printf(" \\\n\t"); pclasses(classes, num_classes, CPP_FILE_SUFFIX_NO_DOT); printf(" \\\n\t"); printf("$(ANTLR_H)%s%s", DirectorySymbol, APARSER_C); if ( !user_lexer ) printf(" $(ANTLR_H)%s%s", DirectorySymbol, DLEXERBASE_C); if ( gen_trees ) { printf(" \\\n\t"); printf("$(ANTLR_H)%s%s", DirectorySymbol, ASTBASE_C); printf(" $(ANTLR_H)%s%s", DirectorySymbol, PCCTSAST_C); /* printf(" $(ANTLR_H)%s%s", DirectorySymbol, LIST_C); */ printf(" \\\n\t"); } printf(" $(ANTLR_H)%s%s", DirectorySymbol, ATOKENBUFFER_C); } if ( !user_lexer ) { if ( gen_CPP ) printf(" $(SCAN)%s", CPP_FILE_SUFFIX); else printf(" %s$(SCAN).c", DIR()); } if ( !gen_CPP ) printf(" $(ERR).c"); for (i=0;i0) printf(" \\\n\t$(SOR_LIB)%sSTreeParser.cpp", DirectorySymbol); if (num_cfiles>0) { printf(" \\\n\t"); pfiles(cfiles,num_cfiles,NULL); } printf("\n\n"); printf("OBJ = "); pfiles(files, n, "o"); if ( gen_CPP ) { printf(" \\\n\t"); pclasses(classes, num_classes, "o"); printf(" \\\n\t"); printf("%s%s", DIR(), APARSER_O); if ( !user_lexer ) { printf(" %s%s", DIR(), DLEXERBASE_O); } if ( gen_trees ) { printf(" \\\n\t"); printf("%s%s", DIR(), ASTBASE_O); printf(" %s%s", DIR(), PCCTSAST_O); /* printf(" %s%s", DIR(), LIST_O); */ printf(" \\\n\t"); } printf(" %s%s", DIR(), ATOKENBUFFER_O); } if ( !user_lexer ) { if ( gen_CPP ) printf(" $(SCAN)%s", OBJ_FILE_SUFFIX); else printf(" %s$(SCAN)%s", DIR(), OBJ_FILE_SUFFIX); } if ( !gen_CPP ) printf(" $(ERR)%s", OBJ_FILE_SUFFIX); for (i=0;i0) printf(" \\\n\tSTreeParser.o"); if (num_cfiles>0) { printf(" \\\n\t"); pfiles(cfiles,num_cfiles,"o"); } printf("\n\n"); printf("ANTLR_SPAWN = "); if ( gen_CPP ) pfiles(files, n, CPP_FILE_SUFFIX_NO_DOT); else pfiles(files, n, "c"); if ( gen_CPP ) { printf(" "); pclasses(classes, num_classes, CPP_FILE_SUFFIX_NO_DOT); printf(" \\\n\t\t"); pclasses(classes, num_classes, "h"); if ( strcmp(hdr,"stdpccts.h")!=0 ) { printf(" \\\n\t\t"); printf("$(HDR_FILE) stdpccts.h"); } } if ( user_lexer ) { if ( !user_token_types ) printf(" $(TOKENS)"); } else { printf(" $(DLG_FILE)"); if ( !user_token_types ) printf(" $(TOKENS)"); } if ( !gen_CPP ) printf(" $(ERR).c"); printf("\n"); if ( !user_lexer ) { if ( gen_CPP ) printf("DLG_SPAWN = $(SCAN)%s", CPP_FILE_SUFFIX); else printf("DLG_SPAWN = %s$(SCAN).c", DIR()); if ( gen_CPP ) printf(" $(SCAN).h"); if ( !gen_CPP ) printf(" $(MOD_FILE)"); printf("\n"); } if ( gen_CPP ) { if ( !nondef_comp ) printf("ifdef CXX\nCCC = $(CXX)\nendif\n\nifndef CCC\n"); printf("CCC = %s\n",compilerCCC); if ( !nondef_comp ) printf("endif\n\n"); } else { if ( !nondef_comp ) printf("ifndef CC\n"); printf("CC = %s\n",compilerCC); if ( !nondef_comp ) printf("endif\n\n"); } /* set up dependencies */ printf("\n%s : $(SRC) $(OBJ)\n", project); printf("\t%s %s %s $(CFLAGS) $(OBJ)\n", gen_CPP?"$(CCC)":"$(CC)", RENAME_EXE_FLAG, project); printf("\n"); /* implicit rules */ /* if(gen_CPP) printf("%%.o : %%.cpp\n\t$(CCC) -c $(CFLAGS) $<\n\n"); printf("%%.o : %%.c\n\t%s -c $(CFLAGS) $<\n\n", gen_CPP?"$(CCC)":"$(CC)"); */ /* how to compile parser files */ for (i=0; i0) { printf("STreeParser%s : $(SOR_LIB)%sSTreeParser.cpp\n", OBJ_FILE_SUFFIX,DirectorySymbol); printf("\t%s -c $(CFLAGS) %s ", gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG); printf("STreeParser%s ",OBJ_FILE_SUFFIX); printf("$(SOR_LIB)%sSTreeParser.cpp\n\n",DirectorySymbol); } printf("$(ANTLR_SPAWN) : $(GRM)\n"); printf("\t$(ANTLR) $(AFLAGS) $(GRM)\n"); if ( !user_lexer ) { printf("\n"); printf("$(DLG_SPAWN) : $(DLG_FILE)\n"); if ( gen_CPP ) printf("\t$(DLG) $(DFLAGS) $(DLG_FILE)\n"); else printf("\t$(DLG) $(DFLAGS) $(DLG_FILE) $(SCAN).c\n"); } /* do the makes for ANTLR/DLG support */ if ( gen_CPP ) { printf("\n"); printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), APARSER_O, DirectorySymbol, APARSER_C); printf("\t%s -c $(CFLAGS) %s ", gen_CPP?"$(CCC)":"$(CC)", RENAME_OBJ_FLAG); printf("%s%s $(ANTLR_H)%s%s\n", DIR(), APARSER_O, DirectorySymbol, APARSER_C); printf("\n"); printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), ATOKENBUFFER_O, DirectorySymbol, ATOKENBUFFER_C); printf("\t%s -c $(CFLAGS) %s ", gen_CPP?"$(CCC)":"$(CC)", RENAME_OBJ_FLAG); printf("%s%s $(ANTLR_H)%s%s\n", DIR(), ATOKENBUFFER_O, DirectorySymbol, ATOKENBUFFER_C); if ( !user_lexer ) { printf("\n"); printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), DLEXERBASE_O, DirectorySymbol, DLEXERBASE_C); printf("\t%s -c $(CFLAGS) %s ", gen_CPP?"$(CCC)":"$(CC)", RENAME_OBJ_FLAG); printf("%s%s $(ANTLR_H)%s%s\n", DIR(), DLEXERBASE_O, DirectorySymbol, DLEXERBASE_C); } if ( gen_trees ) { printf("\n"); printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), ASTBASE_O, DirectorySymbol, ASTBASE_C); printf("\t%s -c $(CFLAGS) %s ", gen_CPP?"$(CCC)":"$(CC)", RENAME_OBJ_FLAG); printf("%s%s $(ANTLR_H)%s%s\n", DIR(), ASTBASE_O, DirectorySymbol, ASTBASE_C); printf("\n"); printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), PCCTSAST_O, DirectorySymbol, PCCTSAST_C); printf("\t%s -c $(CFLAGS) %s ", gen_CPP?"$(CCC)":"$(CC)", RENAME_OBJ_FLAG); printf("%s%s $(ANTLR_H)%s%s\n", DIR(), PCCTSAST_O, DirectorySymbol, PCCTSAST_C); printf("\n"); /* printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), LIST_O, DirectorySymbol, LIST_C); printf("\t%s -c $(CFLAGS) %s ", gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG); printf("%s%s $(ANTLR_H)%s%s\n", DIR(), LIST_O, DirectorySymbol, LIST_C); */ } } /* clean and scrub targets */ printf("\nclean:\n"); printf("\trm -f *%s core %s", OBJ_FILE_SUFFIX, project); if ( strcmp(outdir, ".")!=0 ) printf(" %s*%s", DIR(), OBJ_FILE_SUFFIX); printf("\n"); printf("\nscrub: clean\n"); /* printf("\trm -f *%s core %s", OBJ_FILE_SUFFIX, project); */ /* if ( strcmp(outdir, ".")!=0 ) printf(" %s*%s", DIR(), OBJ_FILE_SUFFIX); */ printf("\trm -f $(ANTLR_SPAWN)"); if ( !user_lexer ) printf(" $(DLG_SPAWN)"); for (i=0;i0 ) { char *p = &(*files)[strlen(*files)-1]; if ( !first ) putchar(' '); first=0; while ( p > *files && *p != '.' ) --p; if ( p == *files ) { fprintf(stderr, "genmk: filenames must be file.suffix format: %s\n", *files); exit(-1); } if ( suffix == NULL ) printf("%s", *files); else { *p = '\0'; printf("%s", DIR()); if ( strcmp(suffix, "o")==0 ) printf("%s%s", *files, OBJ_FILE_SUFFIX); else printf("%s.%s", *files, suffix); *p = '.'; } files++; --n; } } #ifdef __STDC__ void pclasses(char **classes, int n, char *suffix) #else pclasses(classes, n, suffix) char **classes; int n; char *suffix; #endif { int first=1; while ( n>0 ) { if ( !first ) putchar(' '); first=0; if ( suffix == NULL ) printf("%s", *classes); else { printf("%s", DIR()); if ( strcmp(suffix, "o")==0 ) printf("%s%s", *classes, OBJ_FILE_SUFFIX); else printf("%s.%s", *classes, suffix); } classes++; --n; } } static void #ifdef __STDC__ ProcessArgs( int argc, char **argv, Opt *options ) #else ProcessArgs( argc, argv, options ) int argc; char **argv; Opt *options; #endif { Opt *p; require(argv!=NULL, "ProcessArgs: command line NULL"); while ( argc-- > 0 ) { p = options; while ( p->option != NULL ) { if ( strcmp(p->option, "*") == 0 || strcmp(p->option, *argv) == 0 ) { if ( p->arg ) { (*p->process)( *argv, *(argv+1) ); argv++; argc--; } else (*p->process)( *argv ); break; } p++; } argv++; } } #ifdef __STDC__ void fatal( char *err_) #else void fatal( err_) char *err_; #endif { fprintf(stderr, "genmk: %s\n", err_); exit(1); } #ifdef __STDC__ void warn( char *err_) #else void warn( err_) char *err_; #endif { fprintf(stderr, "genmk: %s\n", err_); } #ifdef __STDC__ char *DIR(void) #else char *DIR() #endif { static char buf[200+1]; if ( strcmp(outdir,TopDirectory)==0 ) return ""; sprintf(buf, "%s%s", outdir, DirectorySymbol); return buf; } gtkwave-3.3.86/contrib/pccts/support/genmk/Makefile.in0000664000175000017500000004155413166335473022253 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : noinst_PROGRAMS = genmk$(EXEEXT) subdir = contrib/pccts/support/genmk DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_genmk_OBJECTS = genmk.$(OBJEXT) genmk_OBJECTS = $(am_genmk_OBJECTS) genmk_LDADD = $(LDADD) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(genmk_SOURCES) DIST_SOURCES = $(genmk_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ genmk_SOURCES = genmk.c # Define PC if you use a PC OS (changes directory symbol and object file extension) # see pccts/h/pcctscfg.h #CFLAGS=-I../../h -DPC AM_CFLAGS = -I$(srcdir)/../../h EXTRA_DIST = genmk_old.c watgenmk.mak all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/pccts/support/genmk/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/pccts/support/genmk/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) genmk$(EXEEXT): $(genmk_OBJECTS) $(genmk_DEPENDENCIES) $(EXTRA_genmk_DEPENDENCIES) @rm -f genmk$(EXEEXT) $(AM_V_CCLD)$(LINK) $(genmk_OBJECTS) $(genmk_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genmk.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/contrib/pccts/support/genmk/watgenmk.mak0000664000175000017500000000166713166335473022516 0ustar bybellbybellSET=..\..\support\set PCCTS_H=..\..\h # # Watcom # CC=wcl386 ANTLR=..\..\bin\antlr DLG=..\..\bin\dlg CFLAGS= -I. -I$(SET) -I$(PCCTS_H) -DUSER_ZZSYN -DPC OUT_OBJ = -o OBJ_EXT = obj LINK = wcl386 .c.obj : $(CC) -c $[* $(CFLAGS) genmk.exe: genmk.obj $(LINK) -fe=genmk.exe *.obj -k14336 copy *.exe ..\..\bin #clean up all the intermediate files clean: del *.obj #remove everything in clean plus the PCCTS files generated scrub: del *.$(OBJ_EXT) EOF_watgenmk.mak cat << \EOF_makefile | sed 's/^>//' > makefile SRC=genmk.c OBJ=genmk.o # Define PC if you use a PC OS (changes directory symbol and object file extension) # see pccts/h/pcctscfg.h #CFLAGS=-I../../h -DPC CFLAGS=-I../../h CC=cc BAG=../../bin/bag genmk: $(OBJ) $(SRC) ../../h/pcctscfg.h $(CC) -o genmk $(OBJ) clean: rm -rf core *.o scrub: rm -rf genmk core *.o shar: shar genmk.c makefile > genmk.shar archive: $(BAG) genmk.c watgenmk.mak makefile > genmk.bag EOF_makefile gtkwave-3.3.86/contrib/pccts/support/genmk/Makefile.am0000664000175000017500000000042113166335473022226 0ustar bybellbybell## -*- makefile -*- ## noinst_PROGRAMS= genmk genmk_SOURCES= genmk.c # Define PC if you use a PC OS (changes directory symbol and object file extension) # see pccts/h/pcctscfg.h #CFLAGS=-I../../h -DPC AM_CFLAGS= -I$(srcdir)/../../h EXTRA_DIST= genmk_old.c watgenmk.mak gtkwave-3.3.86/contrib/pccts/support/Makefile.in0000664000175000017500000004530013166335473021143 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = contrib/pccts/support DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = DECmms genmk rexpr set sym EXTRA_DIST = msvc.dsp all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/pccts/support/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/pccts/support/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-tags distdir dvi dvi-am \ html html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/contrib/pccts/support/DECmms/0000775000175000017500000000000013166335473020204 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/support/DECmms/genmms.c0000664000175000017500000004426013166335473021644 0ustar bybellbybell/* * genmms -- a program to make VMS makefiles for PCCTS * * ANTLR 1.33MR10 * Terence John Parr 1989 - 1998 * Purdue University * U of MN * * * VMS version from J.F. Pieronne */ #include #include #include #include "pcctscfg.h" /* be sensitive to what ANTLR/DLG call the files */ #define DIE return SS$_ABORT; #define DONE return 1; #ifndef require #define require(expr, err) {if ( !(expr) ) fatal(err);} #endif #define MAX_FILES 50 #define MAX_CLASSES 50 char *RENAME_OBJ_FLAG="/obj=", *RENAME_EXE_FLAG="/exe="; char *dlg = "parser.dlg"; char *err = "err.c"; char *hdr = "stdpccts.h"; char *tok = "tokens.h"; char *mode = "mode.h"; char *scan = "scan"; char ATOKENBUFFER_O[100]; char APARSER_O[100]; char ASTBASE_O[100]; char PCCTSAST_O[100]; char LIST_O[100]; char DLEXERBASE_O[100]; /* Option flags */ static char *project="t", *files[MAX_FILES], *classes[MAX_CLASSES]; static int num_files = 0; static int num_classes = 0; static int user_lexer = 0; static char *user_token_types = NULL; static int gen_CPP = 0; static char *outdir="."; static char *dlg_class = "DLGLexer"; static int gen_trees = 0; static int gen_hoist = 0; typedef struct _Opt { char *option; int arg; #ifdef __cplusplus void (*process)(...); #else void (*process)(); #endif char *descr; } Opt; #ifdef __STDC__ static void ProcessArgs(int, char **, Opt *); void fatal(char*); void warn(char*); static void pClass(char*, char*); void pclasses(char**, int, char*); void help(); void mk(char*, char**, int, int, char**); void pfiles(char**, int n, char*); #else static void ProcessArgs(); void fatal(); void warn(); void pClass(); void pclasses(); void help(); void mk(); void pfiles(); #endif static void pProj( s, t ) char *s; char *t; { project = t; } static void pUL( s ) char *s; { user_lexer = 1; } static void pCPP( s ) char *s; { gen_CPP = 1; } static void pUT( s, t ) char *s; char *t; { user_token_types = t; } static void pTrees( s ) char *s; { gen_trees = 1; } static void pHoist( s ) char *s; { gen_hoist = 1; } static void #ifdef __STDC__ pFile( char *s ) #else pFile( s ) char *s; #endif { if ( *s=='-' ) { fprintf(stderr, "invalid option: '%s'; ignored...",s); return; } require(num_files0 ) { warn("can't define classes w/o C++ mode; turning on C++ mode...\n"); gen_CPP=1; } if ( gen_CPP && num_classes==0 ) { fatal("must define classes >0 grammar classes in C++ mode\n"); } mk(project, files, num_files, argc, argv); DONE; } void help() { Opt *p = options; static char buf[1000+1]; fprintf(stderr, "genmk [options] f1.g ... fn.g\n"); while ( p->option!=NULL && *(p->option) != '*' ) { buf[0]='\0'; if ( p->arg ) sprintf(buf, "%s ___", p->option); else strcpy(buf, p->option); fprintf(stderr, "\t%-16s %s\n", buf, p->descr); p++; } } void mk(project, files, n, argc, argv) char *project; char **files; int n; int argc; char **argv; { int i; printf("!\n"); printf("! PCCTS makefile for: "); pfiles(files, n, NULL); printf("\n"); printf("!\n"); printf("! Created from:"); for (i=0; i0 ) { char *p = &(*files)[strlen(*files)-1]; if ( !first ) putchar(' '); first=0; while ( p > *files && *p != '.' ) --p; if ( p == *files ) { fprintf(stderr, "genmk: filenames must be file.suffix format: %s\n", *files); exit(-1); } if ( suffix == NULL ) printf("%s", *files); else { *p = '\0'; printf("%s", DIR()); if ( strcmp(suffix, "o")==0 ) printf("%s%s", *files, OBJ_FILE_SUFFIX); else printf("%s.%s", *files, suffix); *p = '.'; } files++; --n; } } void pclasses(classes, n, suffix) char **classes; int n; char *suffix; { int first=1; while ( n>0 ) { if ( !first ) putchar(' '); first=0; if ( suffix == NULL ) printf("%s", *classes); else { printf("%s", DIR()); if ( strcmp(suffix, "o")==0 ) printf("%s%s", *classes, OBJ_FILE_SUFFIX); else printf("%s.%s", *classes, suffix); } classes++; --n; } } static void #ifdef __STDC__ ProcessArgs( int argc, char **argv, Opt *options ) #else ProcessArgs( argc, argv, options ) int argc; char **argv; Opt *options; #endif { Opt *p; require(argv!=NULL, "ProcessArgs: command line NULL"); while ( argc-- > 0 ) { p = options; while ( p->option != NULL ) { if ( strcmp(p->option, "*") == 0 || strcmp(p->option, *argv) == 0 ) { if ( p->arg ) { (*p->process)( *argv, *(argv+1) ); argv++; argc--; } else (*p->process)( *argv ); break; } p++; } argv++; } } void fatal(char *err_) { fprintf(stderr, "genmk: %s\n", err_); exit(1); } void warn(char *err_) { fprintf(stderr, "genmk: %s\n", err_); } char *DIR() { static char buf[200+1]; if ( strcmp(outdir,TopDirectory)==0 ) return ""; sprintf(buf, "%s", outdir); return buf; } gtkwave-3.3.86/contrib/pccts/support/DECmms/Makefile.am0000664000175000017500000000007313166335473022240 0ustar bybellbybell## -*- makefile -*- ## EXTRA_DIST= genmms.c makefile.VMS gtkwave-3.3.86/contrib/pccts/support/DECmms/makefile.VMS0000664000175000017500000000062613166335473022354 0ustar bybellbybell$! File: MAKE.COM - Makefile for genmms OpenVMS $! $! History: $! --------- $! 28-Jan-1998 J.F. Pieronne V1.0. $! $ set noon !Don't stop on errors. $! $ if P1 .eqs. "LINK" then goto relink $! $! $ delete/nolog *.obj;* !Get rid of existing .OBJ files. $! $ options = "/INCLUDE=([--.h])" $ CC 'options' genmms $! $relink: $ LINK genmms, sys$input:/options ! sys$share:vaxcrtl.exe/share $ EXIT gtkwave-3.3.86/contrib/pccts/support/DECmms/Makefile.in0000664000175000017500000003072013166335473022253 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = contrib/pccts/support/DECmms DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = genmms.c makefile.VMS all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/pccts/support/DECmms/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/pccts/support/DECmms/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/contrib/pccts/support/sym/0000775000175000017500000000000013166335473017704 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/support/sym/template.h0000664000175000017500000000155113166335473021672 0ustar bybellbybell/* T e m p l a t e F o r S y m b o l T a b l e M a n a g e r */ /* define some hash function */ #ifndef HASH #define HASH(p, h) while ( *p != '\0' ) h = (h<<1) + *p++; #endif /* minimum symbol table record */ typedef struct _sym { char *symbol; struct _sym *next, *prev, **head, *scope; unsigned int hash; } Sym, *SymPtr; #ifdef __USE_PROTOS void zzs_init(int, int); void zzs_done(void); void zzs_add(char *, Sym *); Sym *zzs_get(char *); void zzs_del(Sym *); void zzs_keydel(char *); Sym **zzs_scope(Sym **); Sym *zzs_rmscope(Sym **); void zzs_stat(void); Sym *zzs_new(char *); Sym *zzs_newadd(char *); char *zzs_strdup(char *); #else void zzs_init(); void zzs_done(); void zzs_add(); Sym *zzs_get(); void zzs_del(); void zzs_keydel(); Sym **zzs_scope(); Sym *zzs_rmscope(); void zzs_stat(); Sym *zzs_new(); Sym *zzs_newadd(); char *zzs_strdup(); #endif gtkwave-3.3.86/contrib/pccts/support/sym/Makefile.in0000664000175000017500000003070213166335473021753 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = contrib/pccts/support/sym DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = sym.c template.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/pccts/support/sym/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/pccts/support/sym/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/contrib/pccts/support/sym/Makefile.am0000664000175000017500000000006613166335473021742 0ustar bybellbybell## -*- makefile -*- ## EXTRA_DIST= sym.c template.h gtkwave-3.3.86/contrib/pccts/support/sym/sym.c0000664000175000017500000002303013166335473020656 0ustar bybellbybell/* * Simple symbol table manager using coalesced chaining to resolve collisions * * Doubly-linked lists are used for fast removal of entries. * * 'sym.h' must have a definition for typedef "Sym". Sym must include at * minimum the following fields: * * ... * char *symbol; * struct ... *next, *prev, **head, *scope; * unsigned int hash; * ... * * 'template.h' can be used as a template to create a 'sym.h'. * * 'head' is &(table[hash(itself)]). * The hash table is not resizable at run-time. * The scope field is used to link all symbols of a current scope together. * Scope() sets the current scope (linked list) to add symbols to. * Any number of scopes can be handled. The user passes the address of * a pointer to a symbol table * entry (INITIALIZED TO NULL first time). * * Available Functions: * * zzs_init(s1,s2) -- Create hash table with size s1, string table size s2. * zzs_done() -- Free hash and string table created with zzs_init(). * zzs_add(key,rec)-- Add 'rec' with key 'key' to the symbol table. * zzs_newadd(key) -- create entry; add using 'key' to the symbol table. * zzs_get(key) -- Return pointer to last record entered under 'key' * Else return NULL * zzs_del(p) -- Unlink the entry associated with p. This does * NOT free 'p' and DOES NOT remove it from a scope * list. If it was a part of your intermediate code * tree or another structure. It will still be there. * It is only removed from further consideration * by the symbol table. * zzs_keydel(s) -- Unlink the entry associated with key s. * Calls zzs_del(p) to unlink. * zzs_scope(sc) -- Specifies that everything added to the symbol * table with zzs_add() is added to the list (scope) * 'sc'. 'sc' is of 'Sym **sc' type and must be * initialized to NULL before trying to add anything * to it (passing it to zzs_scope()). Scopes can be * switched at any time and merely links a set of * symbol table entries. If a NULL pointer is * passed, the current scope is returned. * zzs_rmscope(sc) -- Remove (zzs_del()) all elements of scope 'sc' * from the symbol table. The entries are NOT * free()'d. A pointer to the first * element in the "scope" is returned. The user * can then manipulate the list as he/she chooses * (such as freeing them all). NOTE that this * function sets your scope pointer to NULL, * but returns a pointer to the list for you to use. * zzs_stat() -- Print out the symbol table and some relevant stats. * zzs_new(key) -- Create a new record with calloc() of type Sym. * Add 'key' to the string table and make the new * records 'symbol' pointer point to it. * zzs_strdup(s) -- Add s to the string table and return a pointer * to it. Very fast allocation routine * and does not require strlen() nor calloc(). * * Example: * * #include * #include "sym.h" * * main() * { * Sym *scope1=NULL, *scope2=NULL, *a, *p; * * zzs_init(101, 100); * * a = zzs_new("Apple"); zzs_add(a->symbol, a); -- No scope * zzs_scope( &scope1 ); -- enter scope 1 * a = zzs_new("Plum"); zzs_add(a->symbol, a); * zzs_scope( &scope2 ); -- enter scope 2 * a = zzs_new("Truck"); zzs_add(a->symbol, a); * * p = zzs_get("Plum"); * if ( p == NULL ) fprintf(stderr, "Hmmm...Can't find 'Plum'\n"); * * p = zzs_rmscope(&scope1) * for (; p!=NULL; p=p->scope) {printf("Scope1: %s\n", p->symbol);} * p = zzs_rmscope(&scope2) * for (; p!=NULL; p=p->scope) {printf("Scope2: %s\n", p->symbol);} * } * * Terence Parr * Purdue University * February 1990 * * CHANGES * * Terence Parr * May 1991 * Renamed functions to be consistent with ANTLR * Made HASH macro * Added zzs_keydel() * Added zzs_newadd() * Fixed up zzs_stat() * * July 1991 * Made symbol table entry save its hash code for fast comparison * during searching etc... */ #include #if defined(__STDC__) || defined(__USE_PROTOS) #include #include #else #include #endif #include "sym.h" #define StrSame 0 static Sym **CurScope = NULL; static unsigned size = 0; static Sym **table=NULL; static char *strings; static char *strp; static int strsize = 0; #ifdef __USE_PROTOS void zzs_init(int sz,int strs) #else void zzs_init(sz, strs) int sz, strs; #endif { if ( sz <= 0 || strs <= 0 ) return; table = (Sym **) calloc(sz, sizeof(Sym *)); if ( table == NULL ) { fprintf(stderr, "Cannot allocate table of size %d\n", sz); exit(1); } strings = (char *) calloc(strs, sizeof(char)); if ( strings == NULL ) { fprintf(stderr, "Cannot allocate string table of size %d\n", strs); exit(1); } size = sz; strsize = strs; strp = strings; } #ifdef __USE_PROTOS void zzs_done(void) #else void zzs_done() #endif { if ( table != NULL ) free( table ); if ( strings != NULL ) free( strings ); } #ifdef __USE_PROTOS void zzs_add(char *key,Sym rec) #else void zzs_add(key, rec) char *key; register Sym *rec; #endif { register unsigned int h=0; register char *p=key; HASH(p, h); rec->hash = h; /* save hash code for fast comp later */ h %= size; if ( CurScope != NULL ) {rec->scope = *CurScope; *CurScope = rec;} rec->next = table[h]; /* Add to doubly-linked list */ rec->prev = NULL; if ( rec->next != NULL ) (rec->next)->prev = rec; table[h] = rec; rec->head = &(table[h]); } #ifdef __USE_PROTOS Sym * zzs_get(char *key) #else Sym * zzs_get(key) char *key; #endif { register unsigned int h=0; register char *p=key; register Sym *q; HASH(p, h); for (q = table[h%size]; q != NULL; q = q->next) { if ( q->hash == h ) /* do we even have a chance of matching? */ if ( strcmp(key, q->symbol) == StrSame ) return( q ); } return( NULL ); } /* * Unlink p from the symbol table. Hopefully, it's actually in the * symbol table. * * If p is not part of a bucket chain of the symbol table, bad things * will happen. * * Will do nothing if all list pointers are NULL */ #ifdef __USE_PROTOS void zzs_del(Sym *p) #else void zzs_del(p) register Sym *p; #endif { if ( p == NULL ) {fprintf(stderr, "zzs_del(NULL)\n"); exit(1);} if ( p->prev == NULL ) /* Head of list */ { register Sym **t = p->head; if ( t == NULL ) return; /* not part of symbol table */ (*t) = p->next; if ( (*t) != NULL ) (*t)->prev = NULL; } else { (p->prev)->next = p->next; if ( p->next != NULL ) (p->next)->prev = p->prev; } p->next = p->prev = NULL; /* not part of symbol table anymore */ p->head = NULL; } #ifdef __USE_PROTOS void zzs_keydel(char *key) #else void zzs_keydel(key) char *key; #endif { Sym *p = zzs_get(key); if ( p != NULL ) zzs_del( p ); } /* S c o p e S t u f f */ /* Set current scope to 'scope'; return current scope if 'scope' == NULL */ #ifdef __USE_PROTOS Sym ** zzs_scope(Sym **scope) #else Sym ** zzs_scope(scope) Sym **scope; #endif { if ( scope == NULL ) return( CurScope ); CurScope = scope; return( scope ); } /* Remove a scope described by 'scope'. Return pointer to 1st element in scope */ #ifdef __USE_PROTOS Sym * zzs_rmscope(Sym **scope) #else Sym * zzs_rmscope(scope) register Sym **scope; #endif { register Sym *p; Sym *start; if ( scope == NULL ) return(NULL); start = p = *scope; for (; p != NULL; p=p->scope) { zzs_del( p ); } *scope = NULL; return( start ); } #ifdef __USE_PROTOS void zzs_stat(void) #else void zzs_stat() #endif { static unsigned short count[20]; unsigned int i,n=0,low=0, hi=0; register Sym **p; float avg=0.0; for (i=0; i<20; i++) count[i] = 0; for (p=table; p<&(table[size]); p++) { register Sym *q = *p; unsigned int len; if ( q != NULL && low==0 ) low = p-table; len = 0; if ( q != NULL ) printf("[%d]", p-table); while ( q != NULL ) { len++; n++; printf(" %s", q->symbol); q = q->next; if ( q == NULL ) printf("\n"); } if ( len>=20 ) printf("zzs_stat: count table too small\n"); else count[len]++; if ( *p != NULL ) hi = p-table; } printf("Storing %d recs used %d hash positions out of %d\n", n, size-count[0], size); printf("%f %% utilization\n", ((float)(size-count[0]))/((float)size)); for (i=0; i<20; i++) { if ( count[i] != 0 ) { avg += (((float)(i*count[i]))/((float)n)) * i; printf("Buckets of len %d == %d (%f %% of recs)\n", i, count[i], 100.0*((float)(i*count[i]))/((float)n)); } } printf("Avg bucket length %f\n", avg); printf("Range of hash function: %d..%d\n", low, hi); } /* * Given a string, this function allocates and returns a pointer to a * symbol table record whose "symbol" pointer is reset to a position * in the string table. */ #ifdef __USE_PROTOS Sym * zzs_new(char *text) #else Sym * zzs_new(text) char *text; #endif { Sym *p; if ( (p = (Sym *) calloc(1,sizeof(Sym))) == 0 ) { fprintf(stderr,"Out of memory\n"); exit(1); } p->symbol = zzs_strdup(text); return p; } /* create a new symbol table entry and add it to the symbol table */ #ifdef __USE_PROTOS Sym * zzs_newadd(char *text) #else Sym * zzs_newadd(text) char *text; #endif { Sym *p = zzs_new(text); if ( p != NULL ) zzs_add(text, p); return p; } /* Add a string to the string table and return a pointer to it. * Bump the pointer into the string table to next avail position. */ #ifdef __USE_PROTOS char * zzs_strdup(char *s) #else char * zzs_strdup(s) register char *s; #endif { register char *start=strp; while ( *s != '\0' ) { if ( strp >= &(strings[strsize-2]) ) { fprintf(stderr, "sym: string table overflow (%d chars)\n", strsize); exit(-1); } *strp++ = *s++; } *strp++ = '\0'; return( start ); } gtkwave-3.3.86/contrib/pccts/KNOWN_PROBLEMS.txt0000664000175000017500000001654513166335473020333 0ustar bybellbybell ======================================================= Known Problems In PCCTS - Last revised 14 November 1998 ======================================================= #17. The dlg fix for handling characters up to 255 is incorrect. See item #207. Reported by Frank Hartmann. #16. A note about "&&" predicates (Mike Dimmick) Mike Dimmick has pointed out a potential pitfall in the use of the "&&" style predicate. Consider: r0: (g)? => <

>? r1 | ... ; r1: A | B; If the context guard g is not a subset of the lookahead context for r1 (in other words g is neither A nor B) then the code may execute r1 even when the lookahead context is not satisfied. This is an error by the person coding the grammer, and the error should be reported to the user, but it isn't. expect. Some examples I've run seem to indicate that such an error actually results in the rule becoming unreachable. When g is properly coded the code is correct, the problem is when g is not properly coded. A second problem reported by Mike Dimmick is that the test for a failed validation predicate is equivalent to a test on the predicate along. In other words, if the "&&" has not been hoisted then it may falsely report a validation error. #15. (Changed in MR23) Warning for LT(i), LATEXT(i) in token match actions An bug (or at least an oddity) is that a reference to LT(1), LA(1), or LATEXT(1) in an action which immediately follows a token match in a rule refers to the token matched, not the token which is in the lookahead buffer. Consider: r : abc <> D <> E; In this case LT(1) in action alpha will refer to the next token in the lookahead buffer ("D"), but LT(1) in action beta will refer to the token matched by D - the preceding token. A warning has been added which warns users about this when an action following a token match contains a reference to LT(1), LA(1), or LATEXT(1). This behavior should be changed, but it appears in too many programs now. Another problem, perhaps more significant, is that the obvious fix (moving the consume() call to before the action) could change the order in which input is requested and output appears in existing programs. This problem was reported, along with a fix by Benjamin Mandel (beny@sd.co.il). However, I felt that changing the behavior was too dangerous for existing code. #14. Parsing bug in dlg THM: I have been unable to reproduce this problem. Reported by Rick Howard Mijenix Corporation (rickh@mijenix.com). The regular expression parser (in rexpr.c) fails while trying to parse the following regular expression: {[a-zA-Z]:}(\\\\[a-zA-Z0-9]*)+ See my comment in the following excerpt from rexpr.c: /* * ::= ( '|' {} )* * * Return -1 if syntax error * Return 0 if none found * Return 1 if a regExrp was found */ static regExpr(g) GraphPtr g; { Graph g1, g2; if ( andExpr(&g1) == -1 ) { return -1; } while ( token == '|' ) { int a; next(); a = andExpr(&g2); if ( a == -1 ) return -1; /* syntax error below */ else if ( !a ) return 1; /* empty alternative */ g1 = BuildNFA_AorB(g1, g2); } if ( token!='\0' ) return -1; ***** ***** It appears to fail here becuause token is 125 - the closing '}' ***** If I change it to: ***** if ( token!='\0' && token!='}' && token!= ')' ) return -1; ***** ***** It succeeds, but I'm not sure this is the corrrect approach. ***** *g = g1; return 1; } #13. dlg reports an invalid range for: [\0x00-\0xff] Diagnosed by Piotr Eljasiak (eljasiak@no-spam.zt.gdansk.tpsa.pl): Fixed in MR16. #12. Strings containing comment actions Sequences that looked like C style comments appearing in string literals are improperly parsed by antlr/dlg. << fprintf(out," /* obsolete */ "); For this case use: << fprintf(out," \/\* obsolete \*\/ "); Reported by K.J. Cummings (cummings@peritus.com). #11. User hook for deallocation of variables on guess fail The mechanism outlined in Item #108 works only for heap allocated variables. #10. Label re-initialization in ( X {y:Y} )* If a label assignment is optional and appears in a (...)* or (...)+ block it will not be reset to NULL when it is skipped by a subsequent iteration. Consider the example: ( X { y:Y })* Z with input: X Y X Z The first time through the block Y will be matched and y will be set to point to the token. On the second iteration of the (...)* block there is no match for Y. But y will not be reset to NULL, as the user might expect, it will contain a reference to the Y that was matched in the first iteration. The work-around is to manually reset y: ( X << y = NULL; >> { y:Y } )* Z or ( X ( y:Y | << y = NULL; >> /* epsilon */ ) )* Z Reported by Jeff Vincent (JVincent@novell.com). #9. PCCTAST.h PCCTSAST::setType() is a noop #8. #tokdefs with ~Token and . THM: I have been unable to reproduce this problem. When antlr uses #tokdefs to define tokens the fields of #errclass and #tokclass do not get properly defined. When it subsequently attempts to take the complement of the set of tokens (using ~Token or .) it can refer to tokens which don't have names, generating a fatal error. #7. DLG crashes on some invalid inputs THM: In MR20 have fixed the most common cases. The following token defintion will cause DLG to crash. #token "()" Reported by Mengue Olivier (dolmen@bigfoot.com). #6. On MS systems \n\r is treated as two new lines Fixed. #5. Token expressions in #tokclass #errclass does not support TOK1..TOK2 or ~TOK syntax. #tokclass does not support ~TOKEN syntax A workaround for #errclass TOK1..TOK2 is to use a #tokclass. Reported by Dave Watola (dwatola@amtsun.jpl.nasa.gov) #4. A #tokdef must appear "early" in the grammar file. The "early" section of the grammar file is the only place where the following directives may appear: #header #first #tokdefs #parser Any other kind of statement signifiies the end of the "early" section. #3. Use of PURIFY macro for C++ mode Item #93 of the CHANGES_FROM_1.33 describes the use of the PURIFY macro to zero arguments to be passed by upward inheritance. #define PURIFY(r, s) memset((char *) &(r), '\0', (s)); This may not be the right thing to do for C++ objects that have constructors. Reported by Bonny Rais (bonny@werple.net.au). For those cases one should #define PURIFY to be an empty macro in the #header or #first actions. #2. Fixed in 1.33MR10 - See CHANGES_FROM_1.33 Item #80. #1. The quality of support for systems with 8.3 file names leaves much to be desired. Since the kit is distributed using the long file names and the make file uses long file names it requires some effort to generate. This will probably not be changed due to the large number of systems already written using the long file names. gtkwave-3.3.86/contrib/pccts/NOTES.bcc0000664000175000017500000001224613166335473016726 0ustar bybellbybellMarch 95 Version 1.32 of pccts At the moment this file is available via anonymous FTP at Node: marvin.ecn.purdue.edu File: pub/pccts/1.32/NOTES.BCC Mail corrections or additions to David Seidel <71333.1575@compuserve.com> =============================================================================== Notes on Building PCCTS 1.32 with Borland C++ David Seidel, Innovative Data Concepts Incorporated CompuServe: 71333,1575 Internet: 71333.1575@compuserve.com dseidel@delphi.com I have gotten ANTLR and DLG to succesfully build with BCC 4.0, but have found from experience that ANTLR, in particular, is likely to run out of memory with grammars over a certain size, or with larger values for the -k and -ck options. Now that BCC 4.02 and the new Borland Power Pack for DOS is now available, I feel that there is no excuse not to build these tools as 32-bit executables, as they ought to be. For people without the Power Pack, the makefiles below should be fairly easily modified to build 16-bit real-mode executables, but I don't really recommend it. As an alternative, you might consider the highly regarded DJGPP compiler (a DOS port of the Gnu GCC compiler, with a DOS extender included). Hopefully some other PCCTS who has DJGPP can provode whatever advice is necessary. The Watcom compiler is also an excellent possibility (albeit a commercial one), and I hope to make available Watcom makefiles in the near future. Here are the makefiles I am using. Both makefiles use a compiler configuration file that contains compiler switches such as optimization settings. I call this file bor32.cfg and keep a copy in both the ANTLR and DLG subdirectories. ==== File: bor32.cfg (cut here) =============================================== -w- -RT- -x- -N- -k- -d -O2-e-l -Z -D__STDC__=1 ==== End of file bor32.cfg (cut here) ========================================= ==== File: antlr\bor32.mak (cut here) ========================================= # # ANTLR 1.32 Makefile for Borland C++ 4.02 with DPMI 32-bit DOS extender by # David Seidel # Innovative Data Concepts Incorporated # 71333.1575@compuserve.com (or) dseidel@delphi.com # # Notes: 1. Compiler switches (optimization etc.) are contained in the # file bor32.cfg. # 2. This makefile requires Borland C++ 4.02 or greater with # the DOS Power Pack add-on package. # 3. Change the BCCDIR macro below to the topmost directory in # which BCC is installed on your system. # BCCDIR = d:\bc4 CC = bcc32 SET = ..\support\set PCCTS_H = ..\h ANTLR = ..\bin\antlr DLG = ..\bin\dlg CFLAGS = -I$(BCCDIR)\include -I. -I$(SET) -I$(PCCTS_H) -DUSER_ZZSYN \ +bor32.cfg LIBS = dpmi32 cw32 OBJ_EXT = obj OBJS = antlr.obj scan.obj err.obj bits.obj build.obj fset2.obj fset.obj \ gen.obj globals.obj hash.obj lex.obj main.obj misc.obj pred.obj dialog.obj \ set.obj .c.obj: $(CC) -c $(CFLAGS) {$&.c } antlr.exe: $(OBJS) tlink32 @&&| -Tpe -ax -c -s -L$(BCCDIR)\lib + $(BCCDIR)\lib\c0x32 $** $@ $(LIBS) ; | copy *.exe ..\bin # *********** Target list of PC machines *********** # # Don't worry about the ambiguity messages coming from antlr # for making antlr.c etc... [should be 10 of them, I think] # # leave this commented out for initial build! #antlr.c stdpccts.h parser.dlg tokens.h err.c : antlr.g # $(ANTLR) antlr.g antlr.$(OBJ_EXT): antlr.c mode.h tokens.h scan.$(OBJ_EXT): scan.c mode.h tokens.h # leave this commented out for initial build! #scan.c mode.h: parser.dlg # $(DLG) -C2 parser.dlg scan.c set.$(OBJ_EXT): $(SET)\set.c $(CC) -c $(CFLAGS) $(SET)\set.c ==== End of file antlr\bor32.mak (cut here) =================================== ==== File: dlg\bor32.mak (cut here) =========================================== # # DLG 1.32 Makefile for Borland C++ 4.02 with DPMI 32-bit DOS extender by # David Seidel # Innovative Data Concepts Incorporated # 71333.1575@compuserve.com (or) dseidel@delphi.com # # Notes: 1. Compiler switches (optimization etc.) are contained in the # file bor32.cfg. # 2. This makefile requires Borland C++ 4.02 or greater with # the DOS Power Pack add-on package. # 3. Change the BCCDIR macro below to the topmost directory in # which BCC is installed on your system. # BCCDIR = d:\bc4 CC = bcc32 SET = ..\support\set PCCTS_H = ..\h ANTLR = ..\bin\antlr DLG = ..\bin\dlg CFLAGS = -I$(BCCDIR)\include -I. -I$(SET) -I$(PCCTS_H) -DUSER_ZZSYN \ +bor32.cfg LIBS = dpmi32 cw32 OBJ_EXT = obj OBJS = dlg_p.obj dlg_a.obj main.obj err.obj support.obj \ output.obj relabel.obj automata.obj set.obj .c.obj: $(CC) -c $(CFLAGS) {$&.c } dlg.exe : $(OBJS) tlink32 @&&| -Tpe -ax -c -s -L$(BCCDIR)\lib + c0x32 $** $@ $(LIBS) ; | copy *.exe ..\bin dlg_p.obj: dlg_p.c dlg_a.obj: dlg_a.c main.obj: main.c err.obj: err.c support.obj: support.c output.obj: output.c relabel.obj: relabel.c automata.obj: automata.c set.$(OBJ_EXT): $(SET)\set.c $(CC) -c $(CFLAGS) $(SET)\set.c ==== End of file dlg\bor32.mak (cut here) ===================================== gtkwave-3.3.86/contrib/pccts/MPW_Read_Me0000664000175000017500000000076713166335473017334 0ustar bybellbybell 1. You can control the creator type of generated files by changing a value of #if control statement. pccts:h:pcctscfg.h line 225-231 #if 0 #define MAC_FILE_CREATOR 'MPS ' /* MPW Text files */ #endif #if 0 #define MAC_FILE_CREATOR 'KAHL' /* THINK C/Symantec C++ Text files */ #endif #if 0 #define MAC_FILE_CREATOR 'CWIE' /* Metrowerks C/C++ Text files */ #endif 2. If you want to build 68K version. You must convert all source files to Macintosh format before compile. gtkwave-3.3.86/contrib/pccts/history.txt0000664000175000017500000002036713166335473017632 0ustar bybellbybell The History of PCCTS The Purdue Compiler-Construction Tool Set Terence Parr Parr Research Corporation Minneapolis, Minnesota and University of Minnesota Army High Performance Computing Research Center [Updated 8-7-94] The PCCTS project began as a parser-generator project for a gra- duate course at Purdue University in the Fall of 1988 taught by Hank Dietz- translator-writing systems. Under the guidance of Professor Dietz, the parser generator, ANTLR (originally called YUCC), continued after the termination of the course and eventually became the subject of Terence Parr's Master's thesis. Originally, lexical analysis was performed via ALX which was soon replaced by Will Cohen's DLG in the Fall of 1989 (DFA-based lexical-analyzer generator, also an offshoot of the graduate translation course). The alpha version of ANTLR was totally rewritten resulting in 1.00B. Version 1.00B was released via an internet newsgroup (comp.compilers) posting in February of 1990 and quickly gathered a large following. 1.00B generated only LL(1) parsers, but allowed the merged description of lexical and syntactic analysis. It had rudimen- tary attribute handling similar to that of YACC and did not incor- porate rule parameters or return values; downward inheritance was very awkward. 1.00B-generated parsers terminated upon the first syntax error. Lexical classes (modes) were not allowed and DLG did not have an interactive mode. Upon starting his Ph.D. at Purdue in the Fall of 1990, Terence Parr began the second total rewrite of ANTLR. The method by which grammars may be practically analyzed to generate LL(k) lookahead information was discovered in August of 1990 just before his return. Version 1.00 incorporated this algorithm and included the AST mechan- ism, lexical classes, error classes, and automatic error recovery; code quality and portability were higher. In February of 1992 1.00 was released via an article in SIGPLAN Notices. Peter Dahl, Ph.D. candidate, and Professor Matt O'Keefe (both at the University of Min- nesota) tested this version extensively. Dana Hoggatt (Micro Data Base Systems, Inc.) came up with the idea of error grouping (strings attached to non-terminals) and tested 1.00 heavily. Version 1.06 was released in December 1992 and represented a large feature enhancement over 1.00. For example, rudimentary seman- tic predicates were introduced, error messages were significantly improved for k>1 lookahead and ANTLR parsers could indicate that loo- kahead fetches were to occur only when necessary for the parse Page 1 PCCTS (normally, the lookahead "pipe" was constantly full). Russell Quong joined the project in the Spring of 1992 to aid in the semantic predi- cate design. Beginning and advanced tutorials were created and released as well. A makefile generator was included that sets up dependencies and such correctly for ANTLR and DLG. Very few 1.00 incompatibilities were introduced (1.00 was quite different from 1.00B in some areas). 1.10 was released on August 31, 1993 and incorporated bug fixes, a few feature enhancements and a major new capability - an arbitrary lookahead operator (syntactic predicate), (alpha)?beta. This feature was co-designed with Professor Russell Quong also at Purdue. To sup- port infinite lookahead, a preprocessor flag, ZZINF_LOOK, was created that forced the ANTLR() macro to tokenize all input prior to parsing. Hence, at any moment, an action or predicate can see the entire input sentence. The predicate mechanism of 1.06 was extended to allow mul- tiple predicates to be hoisted; the syntactic context of a predicate was also moved along with the predicate. In February of 1994, SORCERER (a simple tree-parser generator) was released. This tool allows the user to parse child-sibling trees by specifying a grammar rather than building a recursive-descent tree walker by hand. Work towards a library of tree transformations is underway. Aaron Sawdey at The University of Minnesota became a second author of SORCERER after the initial release. On April 1, 1994, PCCTS 1.20 was released. This was the first version to actively support C++ output. It also included important fixes regarding semantic predicates and (..)+ subrules. This version also introduced token classes, the "not" operator, and token ranges. On June 19, 1994, SORCERER 1.00B9 was released. Gary Funck of Intrepid Technology joined the SORCERER team and provided very valu- able suggestions regarding the "transform" mode of SORCERER. On August 8, 1994, PCCTS 1.21 was released. It mainly cleaned up the C++ output and included a number of bug fixes. From the 1.21 release forward, the maintenance and support of all PCCTS tools will be primarily provided by Parr Research Corporation, Minneapolis MN---an organization founded on the principles of excel- lence in research and integrity in business; we are devoted to provid- ing really cool software tools. Please see file PCCTS.FUTURE for more information. All PCCTS tools currently in the public domain will con- tinue to be in the public domain. Looking towards the future, a graphical user-interface is in the design phase. This would allow users to view the syntax diagram representation of their grammars and would highlight nondeterministic productions. Parsing can be traced graphically as well. This system will be built using a multiplatform window library. We also antici- pate the introduction of a sophisticated error handling mechanism called "parser exception handling" in a near future release. Page 2 PCCTS Currently, PCCTS is used at over 1000 known academic, government, and commercial sites in 37 countries. Of course, the true number of users is unknown due to the large number of ftp sites. Credits _____________________________________________________________________________ _____________________________________________________________________________ |ANTLR 1.00A Terence Parr Hank Dietz | |ALX Terence Parr Hank Dietz | |ANTLR 1.00B Terence Parr Hank Dietz, Will Cohen | |DLG 1.00B Will Cohen Terence Parr, Hank Dietz | |NFA Relabelling Will Cohen | |LL(k) analysis Terence Parr Hank Dietz | |ANTLR 1.00 Terence Parr Hank Dietz, Will Cohen | |DLG 1.00 Will Cohen Terence Parr, Hank Dietz | |ANTLR 1.06 Terence Parr Will Cohen, Russell Quong, Hank Dietz| |DLG 1.06 Will Cohen Terence Parr, Hank Dietz | |ANTLR 1.10 Terence Parr Will Cohen, Russell Quong | |ANTLR 1.20 Terence Parr Will Cohen, Russell Quong | |ANTLR 1.21 Terence Parr Russell Quong | |DLG 1.10 Will Cohen Terence Parr | |DLG 1.20 Will Cohen Terence Parr | |DLG 1.21 Terence Parr | |Semantic predicates Terence Parr Russell Quonq | |Syntactic predicates Terence Parr Russell Quonq | |SORCERER 1.00A Terence Parr | |SORCERER 1.00B Terence Parr Aaron Sawdey | |SORCERER 1.00B9 Terence Parr Aaron Sawdey, Gary Funck | |___________________________________________________________________________| Page 3 gtkwave-3.3.86/contrib/pccts/IBM_VISUAL_AGE_PROJECTS/0000775000175000017500000000000013166335473021037 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/IBM_VISUAL_AGE_PROJECTS/Makefile.am0000664000175000017500000000010413166335473023066 0ustar bybellbybell## -*- makefile -*- ## EXTRA_DIST= antlr.icc dlg.icc sorcerer.icc gtkwave-3.3.86/contrib/pccts/IBM_VISUAL_AGE_PROJECTS/antlr.icc0000664000175000017500000000120313166335473022633 0ustar bybellbybelloption ProjectOptions = define("USER_ZZSYN", ), define("__USE_PROTOS", ), incl(searchpath, "..\\h"), incl(searchpath, "..\\support\\set"), link(pmtype, vio) { target "..\\bin\\antlr.exe" { option incl(searchpath, "..\\antlr") { source type("c") "antlr.c","bits.c","build.c","dumpcycles.c", "dumpnode.c","egman.c","main.c","err.c", "fcache.c","fset.c","fset2.c","gen.c", "globals.c","hash.c","lex.c","main.c", "misc.c","mrhoist.c","pred.c","scan.c"} option incl(searchpath, "..\\support\\set") source type("c") "set.c" } } gtkwave-3.3.86/contrib/pccts/IBM_VISUAL_AGE_PROJECTS/sorcerer.icc0000664000175000017500000000102113166335473023335 0ustar bybellbybell0ption ProjectOptions = define("__USE_PROTOS", ), incl(searchpath, "..\\sorcerer\\h"), incl(searchpath, "..\\h"), incl(searchpath, "..\\support\\set"), link(pmtype, vio) { target "..\\bin\\sorcerer.exe" { option incl(searchpath, "..\\sorcerer") { source type("c") 'sor.c','scan.c','err.c','main.c','globals.c','gen.c','hash.c','look.c','cpp.c' } option incl(searchpath, "..\\support\\set") { source type("c") "set.c" } } } gtkwave-3.3.86/contrib/pccts/IBM_VISUAL_AGE_PROJECTS/Makefile.in0000664000175000017500000003076413166335473023116 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = contrib/pccts/IBM_VISUAL_AGE_PROJECTS DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = antlr.icc dlg.icc sorcerer.icc all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/pccts/IBM_VISUAL_AGE_PROJECTS/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/pccts/IBM_VISUAL_AGE_PROJECTS/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/contrib/pccts/IBM_VISUAL_AGE_PROJECTS/dlg.icc0000664000175000017500000000104413166335473022264 0ustar bybellbybelloption ProjectOptions = define("USER_ZZSYN", ), define("__USE_PROTOS", ), incl(searchpath, "..\\h"), incl(searchpath, "..\\support\\set"), link(pmtype, vio) { target "..\\bin\\dlg.exe" { source type("c") "..\\dlg\\automata.c", "..\\dlg\\dlg_a.c", "..\\dlg\\dlg_p.c", "..\\dlg\\err.c", "..\\dlg\\main.c", "..\\dlg\\output.c", "..\\dlg\\relabel.c", "..\\dlg\\support.c", "..\\support\\set\\set.c" } } gtkwave-3.3.86/contrib/pccts/antlr/0000775000175000017500000000000013166335473016500 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/antlr/antlr68K.make0000664000175000017500000000650013166335473020751 0ustar bybellbybell# File: antlr68K.make # Target: antlr68K # Sources: ::support:set:set.c # antlr.c # bits.c # build.c # egman.c # err.c # fcache.c # fset2.c # fset.c # gen.c # globals.c # hash.c # lex.c # main.c # misc.c # mrhoist.c # pred.c # scan.c # Created: Sunday, May 17, 1998 10:12:02 PM # Author: Kenji Tanaka MAKEFILE = antlr68K.make ¥MondoBuild¥ = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified Includes = ¶ -i "::h:" ¶ -i "::support:set:" Sym¥68K = ObjDir¥68K = :Obj: COptions = {Includes} {Sym¥68K} -model far -w off -d MPW -d __STDC__=1 -d USER_ZZSYN Objects¥68K = ¶ "{ObjDir¥68K}set.c.o" ¶ "{ObjDir¥68K}antlr.c.o" ¶ "{ObjDir¥68K}bits.c.o" ¶ "{ObjDir¥68K}build.c.o" ¶ "{ObjDir¥68K}egman.c.o" ¶ "{ObjDir¥68K}err.c.o" ¶ "{ObjDir¥68K}fcache.c.o" ¶ "{ObjDir¥68K}fset2.c.o" ¶ "{ObjDir¥68K}fset.c.o" ¶ "{ObjDir¥68K}gen.c.o" ¶ "{ObjDir¥68K}globals.c.o" ¶ "{ObjDir¥68K}hash.c.o" ¶ "{ObjDir¥68K}lex.c.o" ¶ "{ObjDir¥68K}main.c.o" ¶ "{ObjDir¥68K}misc.c.o" ¶ "{ObjDir¥68K}mrhoist.c.o" ¶ "{ObjDir¥68K}pred.c.o" ¶ "{ObjDir¥68K}scan.c.o" antlr68K ÄÄ {¥MondoBuild¥} {Objects¥68K} Link ¶ -o {Targ} -d {Sym¥68K} ¶ {Objects¥68K} ¶ -t 'MPST' ¶ -c 'MPS ' ¶ -mf ¶ -model far ¶ -br ON ¶ -srtsg ALL ¶ "{Libraries}Stubs.o" ¶ #"{Libraries}MathLib.o" ¶ #"{CLibraries}Complex.o" ¶ "{CLibraries}StdCLib.o" ¶ "{Libraries}MacRuntime.o" ¶ "{Libraries}IntEnv.o" ¶ "{Libraries}ToolLibs.o" ¶ "{Libraries}Interface.o" "{ObjDir¥68K}set.c.o" Ä {¥MondoBuild¥} "::support:set:set.c" {C} "::support:set:set.c" -o {Targ} {COptions} "{ObjDir¥68K}antlr.c.o" Ä {¥MondoBuild¥} antlr.c {C} antlr.c -o {Targ} {COptions} "{ObjDir¥68K}bits.c.o" Ä {¥MondoBuild¥} bits.c {C} bits.c -o {Targ} {COptions} "{ObjDir¥68K}build.c.o" Ä {¥MondoBuild¥} build.c {C} build.c -o {Targ} {COptions} "{ObjDir¥68K}egman.c.o" Ä {¥MondoBuild¥} egman.c {C} egman.c -o {Targ} {COptions} "{ObjDir¥68K}err.c.o" Ä {¥MondoBuild¥} err.c {C} err.c -o {Targ} {COptions} "{ObjDir¥68K}fcache.c.o" Ä {¥MondoBuild¥} fcache.c {C} fcache.c -o {Targ} {COptions} "{ObjDir¥68K}fset2.c.o" Ä {¥MondoBuild¥} fset2.c {C} fset2.c -o {Targ} {COptions} "{ObjDir¥68K}fset.c.o" Ä {¥MondoBuild¥} fset.c {C} fset.c -o {Targ} {COptions} "{ObjDir¥68K}gen.c.o" Ä {¥MondoBuild¥} gen.c {C} gen.c -o {Targ} {COptions} "{ObjDir¥68K}globals.c.o" Ä {¥MondoBuild¥} globals.c {C} globals.c -o {Targ} {COptions} "{ObjDir¥68K}hash.c.o" Ä {¥MondoBuild¥} hash.c {C} hash.c -o {Targ} {COptions} "{ObjDir¥68K}lex.c.o" Ä {¥MondoBuild¥} lex.c {C} lex.c -o {Targ} {COptions} "{ObjDir¥68K}main.c.o" Ä {¥MondoBuild¥} main.c {C} main.c -o {Targ} {COptions} "{ObjDir¥68K}misc.c.o" Ä {¥MondoBuild¥} misc.c {C} misc.c -o {Targ} {COptions} "{ObjDir¥68K}mrhoist.c.o" Ä {¥MondoBuild¥} mrhoist.c {C} mrhoist.c -o {Targ} {COptions} "{ObjDir¥68K}pred.c.o" Ä {¥MondoBuild¥} pred.c {C} pred.c -o {Targ} {COptions} "{ObjDir¥68K}scan.c.o" Ä {¥MondoBuild¥} scan.c {C} scan.c -o {Targ} {COptions} antlr68K ÄÄ antlr.r Rez antlr.r -o antlr68K -a Install Ä antlr68K Duplicate -y antlr68K "{MPW}"Tools:antlr gtkwave-3.3.86/contrib/pccts/antlr/AntlrMS.mak0000664000175000017500000001233313166335473020514 0ustar bybellbybell# PCCTS directory PCCTS_HOME= ANTLR_SRC=$(PCCTS_HOME)\antlr PCCTS_H=$(PCCTS_HOME)\h # Support directories SET=$(PCCTS_HOME)\support\set # Compiler stuff CC = cl CFLAGS = -I "." -I "$(PCCTS_H)" -I "$(SET)" -D "USER_ZZSYN" -D "PC" \ -D "ZZLEXBUFSIZE=65536" /D "LONGFILENAMES" /Zi /W3 ANTLR_OBJS = antlr.obj scan.obj err.obj bits.obj build.obj fset2.obj \ fset.obj gen.obj globals.obj hash.obj lex.obj main.obj \ misc.obj pred.obj egman.obj mrhoist.obj fcache.obj SUPPORT_OBJS = set.obj # Dependencies antlr.exe: $(ANTLR_OBJS) $(SUPPORT_OBJS) $(CC) $(CFLAGS) -o antlr.exe $(ANTLR_OBJS) $(SUPPORT_OBJS) del *.obj antlr.obj: $(ANTLR_SRC)\antlr.c \ $(PCCTS_H)\antlr.h \ $(PCCTS_H)\config.h \ $(PCCTS_H)\dlgdef.h \ $(SET)\set.h \ $(ANTLR_SRC)\generic.h \ $(ANTLR_SRC)\hash.h \ $(ANTLR_SRC)\mode.h \ $(ANTLR_SRC)\proto.h \ $(ANTLR_SRC)\syn.h \ $(ANTLR_SRC)\tokens.h \ $(CC) -c $(CFLAGS) $(ANTLR_SRC)\antlr.c scan.obj: $(ANTLR_SRC)\scan.c \ $(PCCTS_H)\antlr.h \ $(PCCTS_H)\config.h \ $(PCCTS_H)\dlgauto.h \ $(PCCTS_H)\dlgdef.h \ $(SET)\set.h \ $(ANTLR_SRC)\generic.h \ $(ANTLR_SRC)\hash.h \ $(ANTLR_SRC)\mode.h \ $(ANTLR_SRC)\proto.h \ $(ANTLR_SRC)\syn.h \ $(ANTLR_SRC)\tokens.h \ $(CC) -c $(CFLAGS) $(ANTLR_SRC)\scan.c err.obj: $(ANTLR_SRC)\err.c \ $(PCCTS_H)\antlr.h \ $(PCCTS_H)\config.h \ $(PCCTS_H)\dlgdef.h \ $(PCCTS_H)\err.h \ $(SET)\set.h \ $(ANTLR_SRC)\generic.h \ $(ANTLR_SRC)\hash.h \ $(ANTLR_SRC)\proto.h \ $(ANTLR_SRC)\syn.h \ $(ANTLR_SRC)\tokens.h \ $(CC) -c $(CFLAGS) $(ANTLR_SRC)\err.c bits.obj: $(ANTLR_SRC)\bits.c \ $(PCCTS_H)\config.h \ $(PCCTS_H)\dlgdef.h \ $(SET)\set.h \ $(ANTLR_SRC)\generic.h \ $(ANTLR_SRC)\hash.h \ $(ANTLR_SRC)\proto.h \ $(ANTLR_SRC)\syn.h \ $(CC) -c $(CFLAGS) $(ANTLR_SRC)\bits.c build.obj: $(ANTLR_SRC)\build.c \ $(PCCTS_H)\config.h \ $(PCCTS_H)\dlgdef.h \ $(SET)\set.h \ $(ANTLR_SRC)\generic.h \ $(ANTLR_SRC)\hash.h \ $(ANTLR_SRC)\proto.h \ $(ANTLR_SRC)\syn.h \ $(CC) -c $(CFLAGS) $(ANTLR_SRC)\build.c fset2.obj: $(ANTLR_SRC)\fset2.c \ $(PCCTS_H)\config.h \ $(PCCTS_H)\dlgdef.h \ $(SET)\set.h \ $(ANTLR_SRC)\generic.h \ $(ANTLR_SRC)\hash.h \ $(ANTLR_SRC)\proto.h \ $(ANTLR_SRC)\syn.h \ $(CC) -c $(CFLAGS) $(ANTLR_SRC)\fset2.c fset.obj: $(ANTLR_SRC)\fset.c \ $(PCCTS_H)\config.h \ $(PCCTS_H)\dlgdef.h \ $(SET)\set.h \ $(ANTLR_SRC)\generic.h \ $(ANTLR_SRC)\hash.h \ $(ANTLR_SRC)\proto.h \ $(ANTLR_SRC)\syn.h \ $(CC) -c $(CFLAGS) $(ANTLR_SRC)\fset.c gen.obj: $(ANTLR_SRC)\gen.c \ $(PCCTS_H)\config.h \ $(PCCTS_H)\dlgdef.h \ $(SET)\set.h \ $(ANTLR_SRC)\generic.h \ $(ANTLR_SRC)\hash.h \ $(ANTLR_SRC)\proto.h \ $(ANTLR_SRC)\syn.h \ $(CC) -c $(CFLAGS) $(ANTLR_SRC)\gen.c globals.obj: $(ANTLR_SRC)\globals.c \ $(PCCTS_H)\config.h \ $(SET)\set.h \ $(ANTLR_SRC)\generic.h \ $(ANTLR_SRC)\hash.h \ $(ANTLR_SRC)\proto.h \ $(ANTLR_SRC)\syn.h \ $(CC) -c $(CFLAGS) $(ANTLR_SRC)\globals.c hash.obj: $(ANTLR_SRC)\hash.c \ $(PCCTS_H)\config.h \ $(ANTLR_SRC)\hash.h \ $(CC) -c $(CFLAGS) $(ANTLR_SRC)\hash.c lex.obj: $(ANTLR_SRC)\lex.c \ $(PCCTS_H)\config.h \ $(SET)\set.h \ $(ANTLR_SRC)\generic.h \ $(ANTLR_SRC)\hash.h \ $(ANTLR_SRC)\proto.h \ $(ANTLR_SRC)\syn.h \ $(CC) -c $(CFLAGS) $(ANTLR_SRC)\lex.c main.obj: $(ANTLR_SRC)\main.c \ $(PCCTS_H)\antlr.h \ $(PCCTS_H)\config.h \ $(PCCTS_H)\dlgdef.h \ $(SET)\set.h \ $(ANTLR_SRC)\generic.h \ $(ANTLR_SRC)\hash.h \ $(ANTLR_SRC)\mode.h \ $(ANTLR_SRC)\proto.h \ $(ANTLR_SRC)\stdpccts.h \ $(ANTLR_SRC)\syn.h \ $(ANTLR_SRC)\tokens.h \ $(CC) -c $(CFLAGS) $(ANTLR_SRC)\main.c misc.obj: $(ANTLR_SRC)\misc.c \ $(PCCTS_H)\config.h \ $(PCCTS_H)\dlgdef.h \ $(SET)\set.h \ $(ANTLR_SRC)\generic.h \ $(ANTLR_SRC)\hash.h \ $(ANTLR_SRC)\proto.h \ $(ANTLR_SRC)\syn.h \ $(CC) -c $(CFLAGS) $(ANTLR_SRC)\misc.c pred.obj: $(ANTLR_SRC)\pred.c \ $(PCCTS_H)\config.h \ $(PCCTS_H)\dlgdef.h \ $(SET)\set.h \ $(ANTLR_SRC)\generic.h \ $(ANTLR_SRC)\hash.h \ $(ANTLR_SRC)\proto.h \ $(ANTLR_SRC)\syn.h \ $(CC) -c $(CFLAGS) $(ANTLR_SRC)\pred.c egman.obj: $(ANTLR_SRC)\egman.c \ $(PCCTS_H)\config.h \ $(SET)\set.h \ $(ANTLR_SRC)\generic.h \ $(ANTLR_SRC)\hash.h \ $(ANTLR_SRC)\proto.h \ $(ANTLR_SRC)\syn.h \ $(CC) -c $(CFLAGS) $(ANTLR_SRC)\egman.c mrhoist.obj: $(ANTLR_SRC)\mrhoist.c \ $(ANTLR_SRC)\generic.h \ $(ANTLR_SRC)\hash.h \ $(ANTLR_SRC)\proto.h \ $(ANTLR_SRC)\syn.h \ $(CC) -c $(CFLAGS) $(ANTLR_SRC)\mrhoist.c fcache.obj: $(ANTLR_SRC)\fcache.c \ $(ANTLR_SRC)\generic.h \ $(ANTLR_SRC)\hash.h \ $(ANTLR_SRC)\proto.h \ $(ANTLR_SRC)\syn.h \ $(CC) -c $(CFLAGS) $(ANTLR_SRC)\fcache.c set.obj: $(SET)\set.c \ $(PCCTS_H)\config.h \ $(SET)\set.h \ $(CC) -c $(CFLAGS) $(SET)\set.c gtkwave-3.3.86/contrib/pccts/antlr/proto.h0000664000175000017500000011276413166335473020027 0ustar bybellbybell/* * proto.h -- function prototypes * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * ANTLR 1.33 * Terence Parr * Parr Research Corporation * with Purdue University and AHPCRC, University of Minnesota * 1989-2001 */ /* V a r i a b l e s */ extern int tp; extern Junction *SynDiag; extern char Version[]; extern char VersionDef[]; #ifdef __cplusplus extern void (*fpPrint[])(...); #else extern void (*fpPrint[])(); #endif #ifdef __cplusplus extern struct _set (*fpReach[])(...); #else extern struct _set (*fpReach[])(); #endif #ifdef __cplusplus extern struct _tree *(*fpTraverse[])(...); #else extern struct _tree *(*fpTraverse[])(); #endif #ifdef __cplusplus extern void (**fpTrans)(...); #else extern void (**fpTrans)(); #endif #ifdef __cplusplus extern void (**fpJTrans)(...); #else extern void (**fpJTrans)(); #endif #ifdef __cplusplus extern void (*C_Trans[NumNodeTypes+1])(...); #else extern void (*C_Trans[])(); #endif #ifdef __cplusplus extern void (*C_JTrans[NumJuncTypes+1])(...); #else extern void (*C_JTrans[])(); #endif extern int BlkLevel; extern int CurFile; extern char *CurPredName; extern char *CurRule; extern int CurRuleDebug; /* MR13 */ extern Junction *CurRuleBlk; extern RuleEntry *CurRuleNode; extern ListNode *CurElementLabels; extern ListNode *CurAstLabelsInActions; /* MR27 */ extern ListNode *ContextGuardPredicateList; /* MR13 */ extern ListNode *CurActionLabels; extern int numericActionLabel; /* MR10 << ... $1 ... >> or << ... $1 ... >>? */ extern ListNode *NumericPredLabels; /* MR10 << ... $1 ... >>? ONLY */ extern char *FileStr[]; extern int NumFiles; extern int EpToken; extern int WildCardToken; extern Entry **Tname, **Texpr, **Rname, **Fcache, **Tcache, **Elabel, **Sname, **Pname; /* MR11 */ extern ListNode *ExprOrder; extern ListNode **Cycles; extern int TokenNum; extern int LastTokenCounted; extern ListNode *BeforeActions, *AfterActions, *LexActions; /* MR1 */ /* MR1 11-Apr-97 Provide mechanism for inserting code into DLG class */ /* MR1 via #lexmember <<....>> & #lexprefix <<...>> */ /* MR1 */ extern ListNode *LexMemberActions; /* MR1 */ extern ListNode *LexPrefixActions; /* MR1 */ extern set *fset; /* for constrained search */ /* MR11 */ extern int maxk; /* for constrained search */ /* MR11 */ extern int Save_argc; /* MR10 */ extern char **Save_argv; /* MR10 */ extern ListNode *eclasses, *tclasses; extern char *HdrAction; extern char *FirstAction; /* MR11 */ extern FILE *ErrFile; extern char *RemapFileName; extern char *ErrFileName; extern char *DlgFileName; extern char *DefFileName; extern char *ModeFileName; extern char *StdMsgName; extern int NumRules; extern Junction **RulePtr; extern int LL_k; extern int CLL_k; extern char *decodeJType[]; extern int PrintOut; extern int PrintAnnotate; extern int CodeGen; extern int LexGen; extern int esetnum; extern int setnum; extern int wordnum; extern int GenAST; extern int GenANSI; extern int **FoStack; extern int **FoTOS; extern int GenExprSetsOpt; extern FILE *DefFile; extern int CannotContinue; extern int GenCR; extern int GenLineInfo; extern int GenLineInfoMS; extern int action_file, action_line; extern int TraceGen; extern int CurAmbigAlt1, CurAmbigAlt2, CurAmbigline, CurAmbigfile; extern char *CurAmbigbtype; extern int elevel; extern int GenEClasseForRules; extern FILE *input, *output; extern char **TokenStr, **ExprStr; extern int CurrentLexClass, NumLexClasses; extern LClass lclass[]; extern char LexStartSymbol[]; extern char *CurRetDef; extern char *CurParmDef; extern int OutputLL_k; extern int TreeResourceLimit; extern int DemandLookahead; extern char *RulePrefix; extern int GenStdPccts; extern char *stdpccts; extern int ParseWithPredicates; extern int ConstrainSearch; extern int PURIFY; /* MR23 */ extern set MR_CompromisedRules; /* MR14 */ extern int MR_AmbSourceSearch; /* MR11 */ extern int MR_SuppressSearch; /* MR13 */ extern int MR_AmbSourceSearchGroup; /* MR11 */ extern int MR_AmbSourceSearchChoice; /* MR11 */ extern int MR_AmbSourceSearchLimit; /* MR11 */ extern int MR_usingPredNames; /* MR11 */ extern int MR_ErrorSetComputationActive; /* MR14 */ extern char *MR_AmbAidRule; /* MR11 */ extern int MR_AmbAidLine; /* MR11 */ extern int MR_AmbAidMultiple; /* MR11 */ extern int MR_AmbAidDepth; /* MR11 */ extern int MR_skipped_e3_report; /* MR11 */ extern int MR_matched_AmbAidRule; /* MR11 */ extern int MR_Inhibit_Tokens_h_Gen; /* MR13 */ extern int NewAST; /* MR13 */ extern int tmakeInParser; /* MR23 */ extern int AlphaBetaTrace; /* MR14 */ extern int MR_BlkErr; /* MR21 */ extern int MR_AlphaBetaWarning; /* MR14 */ extern int MR_AlphaBetaMessageCount; /* MR14 */ extern int MR_MaintainBackTrace; /* MR14 */ extern int MR_BadExprSets; /* MR13 */ extern int FoundGuessBlk; extern int FoundException; extern int FoundAtOperator; /* MR6 */ extern int FoundExceptionGroup; /* MR6 */ extern int WarningLevel; extern int UseStdout; /* MR6 */ extern int TabWidth; /* MR6 */ extern int pLevel; extern int pAlt1; extern int pAlt2; extern int AImode; extern int HoistPredicateContext; extern int MRhoisting; /* MR9 */ extern int MRhoistingk; /* MR13 */ extern int MR_debugGenRule; /* MR11 */ extern int GenCC; extern char *ParserName; extern char *StandardSymbols[]; extern char *ASTSymbols[]; extern set reserved_positions; extern set all_tokens; extern set imag_tokens; extern set tokclasses; extern ListNode *ForcedTokens; extern int *TokenInd; extern FILE *Parser_h, *Parser_c; extern char CurrentClassName[]; extern int no_classes_found; extern char Parser_h_Name[]; extern char Parser_c_Name[]; extern char MRinfoFile_Name[]; /* MR10 */ extern FILE *MRinfoFile; /* MR10 */ extern int MRinfo; /* MR10 */ extern int MRinfoSeq; /* MR10 */ extern int InfoP; /* MR10 */ extern int InfoT; /* MR10 */ extern int InfoF; /* MR10 */ extern int InfoM; /* MR10 */ extern int InfoO; /* MR12 */ extern int PotentialSuppression; /* MR10 */ extern int PotentialDummy; /* MR10 */ extern int TnodesInUse; /* MR10 */ extern int TnodesPeak; /* MR10 */ extern int TnodesReportThreshold; /* MR11 */ extern int TnodesAllocated; /* MR10 */ extern char *ClassDeclStuff; /* MR10 */ extern char *BaseClassName; /* MR22 */ extern ListNode *class_before_actions, *class_after_actions; extern char *UserTokenDefsFile; extern int UserDefdTokens; extern ListNode *MetaTokenNodes; extern char *OutputDirectory; extern int DontCopyTokens; extern int LTinTokenAction; /* MR23 */ extern set AST_nodes_refd_in_actions; extern ListNode *CurExGroups; extern int CurBlockID; extern int CurAltNum; extern Junction *CurAltStart; extern Junction *OuterAltStart; /* chain exception groups MR7 */ extern ExceptionGroup *DefaultExGroup; extern int NumSignals; extern int ContextGuardTRAV; extern Junction *MR_RuleBlkWithHalt; /* MR10 */ extern PointerStack MR_BackTraceStack; /* MR10 */ extern PointerStack MR_PredRuleRefStack; /* MR10 */ extern PointerStack MR_RuleBlkWithHaltStack; /* MR10 */ /* */ /* MR1 10-Apr-97 MR1 Previously unable to put right shift operator */ /* MR1 in DLG action */ /* */ extern int tokenActionActive; /* MR1 */ extern char *PRED_OR_LIST; /* MR10 */ extern char *PRED_AND_LIST; /* MR10 */ #ifdef __VMS #define STRICMP strcasecmp /* MR21 */ #else #define STRICMP stricmp /* MR21 */ #endif /* MR26 */ #ifdef PCCTS_USE_STDARG extern Tree *tmake(Tree *root, ...); #else extern Tree *tmake(); #endif #ifdef __USE_PROTOS extern int STRICMP(const char*, const char*); extern void istackreset(void); extern int istacksize(void); extern void pushint(int); extern int popint( void ); extern int istackempty( void ); extern int topint( void ); extern void NewSetWd( void ); extern void DumpSetWd( void ); extern void DumpSetWdForC( void ); extern void DumpSetWdForCC( void ); extern void NewSet( void ); extern void FillSet( set ); extern void ComputeErrorSets( void ); extern void ComputeTokSets( void ); extern void SubstErrorClass( set * ); extern int DefErrSet( set *, int, char * ); extern int DefErrSetForC( set *, int, char * ); extern int DefErrSetForCC( set *, int, char * ); extern int DefErrSet1(int, set *, int, char *); /* MR21 */ extern int DefErrSetForC1(int, set *, int, char *, const char* ); /* MR21 */ extern int DefErrSetForCC1(int, set *, int, char *, const char* ); /* MR21 */ extern int DefErrSetWithSuffix(int, set *, int, char *, const char *); /* MR21 */ extern void GenErrHdr( void ); extern void dumpExpr( FILE *, char * ); extern void addParm( Node *, char * ); extern Graph buildAction( char *, int, int, int ); extern Graph buildToken( char * ); extern Graph buildWildCard( char * ); extern Graph buildRuleRef( char * ); extern Graph Or( Graph, Graph ); extern Graph Cat( Graph, Graph ); extern Graph makeOpt( Graph, int, char *); extern Graph makeBlk( Graph, int, char *); extern Graph makeLoop( Graph, int, char *); extern Graph makePlus( Graph, int, char *); extern Graph emptyAlt( void ); extern Graph emptyAlt3( void ); extern TokNode * newTokNode( void ); extern RuleRefNode * newRNode( void ); extern Junction * newJunction( void ); extern ActionNode * newActionNode( void ); extern char * makelocks( void ); extern void preorder( Tree * ); extern Tree * tnode( int ); extern void _Tfree( Tree * ); extern Tree * tdup( Tree * ); extern int is_single_tuple( Tree * ); extern Tree * tappend( Tree *, Tree * ); extern void Tfree( Tree * ); extern Tree * tlink( Tree *, Tree *, int ); extern Tree * tshrink( Tree * ); extern Tree * tflatten( Tree * ); extern Tree * tJunc( Junction *, int, set * ); extern Tree * tRuleRef( RuleRefNode *, int, set * ); extern Tree * tToken( TokNode *, int, set * ); extern Tree * tAction( ActionNode *, int, set * ); extern int tmember( Tree *, Tree * ); extern int tmember_constrained( Tree *, Tree * ); extern Tree * tleft_factor( Tree * ); extern Tree * trm_perm( Tree *, Tree * ); extern void tcvt( set *, Tree * ); extern Tree * permute( int, int ); extern Tree * VerifyAmbig( Junction *, Junction *, unsigned **, set *, Tree **, Tree **, int * ); extern set rJunc( Junction *, int, set * ); extern set rRuleRef( RuleRefNode *, int, set * ); extern set rToken( TokNode *, int, set * ); extern set rAction( ActionNode *, int, set * ); extern void HandleAmbiguity( Junction *, Junction *, Junction *, int ); extern set First( Junction *, int, int, int * ); extern void freeBlkFsets( Junction * ); extern void genAction( ActionNode * ); extern void genRuleRef( RuleRefNode * ); extern void genToken( TokNode * ); extern void genOptBlk( Junction * ); extern void genLoopBlk( Junction *, Junction *, Junction *, int ); extern void genLoopBegin( Junction * ); extern void genPlusBlk( Junction * ); extern void genSubBlk( Junction * ); extern void genRule( Junction * ); extern void genJunction( Junction * ); extern void genEndBlk( Junction * ); extern void genEndRule( Junction * ); extern void genHdr( int ); extern void genHdr1( int ); extern void dumpAction( char *, FILE *, int, int, int, int ); extern void dumpActionPlus(ActionNode*, char *, FILE *, int, int, int, int ); /* MR21 */ extern Entry ** newHashTable( void ); extern Entry * hash_add( Entry **, char *, Entry * ); extern Entry * hash_get( Entry **, char * ); extern void hashStat( Entry ** ); extern char * mystrdup( char * ); extern void genLexDescr( void ); extern void dumpLexClasses( FILE * ); extern void genDefFile( void ); extern void DumpListOfParmNames( char *, FILE *, int ); /* MR5 janm 26-May-97 */ extern int DumpNextNameInDef( char **, FILE * ); extern void DumpOldStyleParms( char *, FILE * ); extern void DumpType( char *, FILE * ); extern int strmember( char *, char * ); /* extern int HasComma( char * ); MR23 Replaced by hasMultipleOperands() */ extern void DumpRetValStruct( FILE *, char *, int ); extern char * StripQuotes( char * ); extern int main( int, char *[] ); extern void readDescr( void ); extern FILE * NextFile( void ); extern char * outnameX( char *, char *); extern char * outname( char * ); extern void fatalFL( char *, char *, int ); extern void fatal_intern( char *, char *, int ); extern void cleanUp( void ); extern char * eMsg3( char *, char *, char *, char * ); extern char * eMsgd( char *, int ); extern char * eMsgd2( char *, int, int ); extern void s_fprT( FILE *, set ); extern char * TerminalString( int ); extern void lexclass( char * ); extern void lexmode( int ); extern int LexClassIndex( char * ); extern int hasAction( char * ); extern void setHasAction( char *, char * ); extern int addTname( char * ); extern int addTexpr( char * ); extern int Tnum( char * ); extern void Tklink( char *, char * ); extern Entry * newEntry( char *, int ); extern void list_add( ListNode **, void * ); extern void list_free( ListNode **, int freeData ); /* MR10 */ extern void list_apply( ListNode *, void (*)(void *) ); extern int list_search_cstring (ListNode *, char *); /* MR27 */ extern char * Fkey( char *, int, int ); extern void FoPush( char *, int ); extern void FoPop( int ); extern void RegisterCycle( char *, int ); extern void ResolveFoCycles( int ); extern void pJunc( Junction * ); extern void pRuleRef( RuleRefNode * ); extern void pToken( TokNode * ); extern void pAction( ActionNode * ); extern void FoLink( Node * ); extern void addFoLink( Node *, char *, Junction * ); extern void GenCrossRef( Junction * ); extern void defErr( char *, long, long, long, long, long, long ); extern void genStdPCCTSIncludeFile(FILE *,char *); /* MR10 */ extern char * pcctsBaseName(char *); /* MR32 */ extern Predicate *find_predicates(Node *); /* MR10 */ extern Predicate *MR_find_predicates_and_supp(Node *); /* MR13 */ extern int predicateLookaheadDepth(ActionNode *); /* MR10 */ extern void predicate_free(Predicate *); /* MR10 */ extern Predicate * predicate_dup(Predicate *); /* MR10 */ extern Predicate * predicate_dup_without_context(Predicate *); /* MR11 */ extern void GenRulePrototypes(FILE *, Junction *); extern Junction *first_item_is_guess_block(Junction *); extern Junction *first_item_is_guess_block_extra(Junction * q); /* MR30 */ extern Junction *analysis_point(Junction *); extern Tree *make_tree_from_sets(set *, set *); extern Tree *tdup_chain(Tree *); extern Tree *tdif(Tree *, Predicate *, set *, set *); extern set covered_set(Predicate *); extern void AmbiguityDialog(Junction *, int, Junction *, Junction *, int *, int *); extern void dumpAmbigMsg(set *, FILE *, int); extern void GenRuleFuncRedefs(FILE *, Junction *); extern void GenPredefinedSymbolRedefs(FILE *); extern void GenASTSymbolRedefs(FILE *); extern void GenRemapFile(void); extern void GenSetRedefs(FILE *); extern ForcedToken *newForcedToken(char *, int); extern void RemapForcedTokens(void); extern char *TokenOrExpr(int); extern void setUpperRange(TokNode *, char *); extern void GenParser_c_Hdr(void); extern void GenParser_h_Hdr(void); extern void GenRuleMemberDeclarationsForCC(FILE *, Junction *); extern int addForcedTname( char *, int ); extern char *OutMetaName(char *); extern void OutFirstSetSymbol(Junction *q, char *); /* MR21 */ extern void warnNoFL(char *err); extern void warnFL(char *err,char *f,int l); extern void warn(char *err); extern void warnNoCR( char *err ); extern void errNoFL(char *err); extern void errFL(char *err,char *f,int l); extern void err(char *err); extern void errNoCR( char *err ); extern void genPredTree( Predicate *p, Node *j, int ,int); extern UserAction *newUserAction(char *); extern char *gate_symbol(char *name); extern char *makeAltID(int blockid, int altnum); extern void DumpRemainingTokSets(void); extern void DumpANSIFunctionArgDef(FILE *f, Junction *q, int bInit); /* MR23 */ extern void DumpFormals(FILE *, char *, int bInit); /* MR23 */ extern char* hideDefaultArgs(const char* pdecl); /* MR22 VHS */ extern Predicate *computePredFromContextGuard(Graph,int *msgDone); /* MR21 */ extern void recomputeContextGuard(Predicate *); /* MR13 */ extern Predicate *new_pred(void); extern void chkGTFlag(void); extern void leAdd(LabelEntry *); /* MR7 */ extern void leFixup(void); /* MR7 */ extern void egAdd(ExceptionGroup *); /* MR7 */ extern void egFixup(void); /* MR7 */ extern void altAdd(Junction *); /* MR7 */ extern void altFixup(void); /* MR7 */ extern Predicate * MR_find_in_aSubBlk(Junction *alt); /* MR10 */ extern Predicate * MR_predFlatten(Predicate *p); /* MR10 */ extern Predicate * MR_predSimplifyALL(Predicate *p); /* MR10 */ extern Predicate * MR_predSimplifyALLX(Predicate *p,int skipPass3); /* MR10 */ extern int MR_allPredLeaves(Predicate *p); /* MR10 */ extern void MR_cleanup_pred_trees(Predicate *p); /* MR10 */ extern int MR_predicate_context_completed(Predicate *p); /* MR10 */ extern void MR_check_pred_too_long(Predicate *p,set completion); /* MR10 */ extern Tree * MR_remove_epsilon_from_tree(Tree *t); /* MR10 */ extern Tree * MR_computeTreeAND(Tree *l,Tree *r); /* MR10 */ extern int MR_tree_equ(Tree *big, Tree *small); /* MR10 */ extern set MR_First(int ck,Junction *j,set *incomplete); /* MR10 */ extern set MR_compute_pred_set(Predicate *p); /* MR10 */ extern Tree * MR_compute_pred_tree_context(Predicate *p); /* MR10 */ extern int MR_pointerStackPush(PointerStack *,void *); /* MR10 */ extern void * MR_pointerStackPop(PointerStack *); /* MR10 */ extern void * MR_pointerStackTop(PointerStack *); /* MR10 */ extern void MR_pointerStackReset(PointerStack *); /* MR10 */ extern void MR_backTraceReport(void); /* MR10 */ extern void MR_alphaBetaTraceReport(void); /* MR14 */ extern void MR_dumpRuleSet(set); /* MR14 */ extern void MR_predContextPresent(Predicate *p,int *,int *); /* MR10 */ extern void MR_dumpPred(Predicate *p,int withContext); /* MR10 */ extern void MR_dumpPred1(int,Predicate *p,int withContext); /* MR10 */ extern void MR_xxxIndent(FILE *f,int depth); /* MR11 */ extern void MR_outputIndent(int depth); /* MR11 */ extern void MR_stderrIndent(int depth); /* MR11 */ extern Junction * MR_ruleReferenced(RuleRefNode *rrn); /* MR10 */ extern Junction * MR_nameToRuleBlk(char *); /* MR10 */ extern void MR_releaseResourcesUsedInRule(Node *); /* MR10 */ extern void MR_dumpTreeX(int depth,Tree *t,int across); /* MR10 */ extern void MR_dumpTreeF(FILE *f,int depth,Tree *t,int across); /* MR10 */ extern void DumpFcache(void); /* MR10 */ extern void MR_dumpTokenSet(FILE *f,int depth,set s); /* MR10 */ extern void MR_traceAmbSource(set *,Junction *,Junction *); /* MR11 */ extern void MR_traceAmbSourceK(Tree *,Junction *a1,Junction *a2); /* MR11 */ extern void MR_traceAmbSourceKclient(void); /* MR20 */ extern Node *MR_advance(Node *); /* MR11 */ extern int MR_offsetFromRule(Node *); /* MR11 */ extern char *MR_ruleNamePlusOffset(Node *); /* MR11 */ extern int MR_max_height_of_tree(Tree *); /* MR11 */ extern int MR_all_leaves_same_height(Tree *,int); /* MR11 */ extern void MR_projectTreeOntoSet(Tree *t,int k,set *); /* MR11 */ extern Tree *MR_make_tree_from_set(set); /* MR11 */ extern Predicate *MR_removeRedundantPredPass3(Predicate *); /* MR11 */ extern void MR_pred_depth(Predicate *,int *); /* MR11 */ extern int MR_comparePredicates(Predicate *,Predicate *); /* MR11 */ extern Predicate * MR_unfold(Predicate *); /* MR11 */ extern void MR_simplifyInverted(Predicate *,int); /* MR11 */ extern int MR_secondPredicateUnreachable /* MR11 */ (Predicate *first,Predicate *second); /* MR11 */ extern void MR_clearPredEntry(Predicate *); /* MR11 */ extern void MR_orphanRules(FILE *); /* MR12 */ extern void MR_merge_contexts(Tree *); /* MR12 */ extern int ci_strequ(char *,char *); /* MR12 */ extern void MR_guardPred_plainSet(ActionNode *anode,Predicate *); /* MR12c */ extern void MR_suppressSearchReport(void); /* MR12c */ extern Predicate * MR_suppressK(Node *,Predicate *); /* MR13 */ extern void MR_backTraceDumpItem(FILE *,int skip,Node *n); /* MR13 */ extern void MR_backTraceDumpItemReset(void); /* MR13 */ extern Junction * MR_junctionWithoutP2(Junction *); /* MR13 */ extern void MR_setConstrainPointer(set *); /* MR18 */ extern void BlockPreambleOption(Junction *q, char * pSymbol); /* MR23 */ extern char* getInitializer(char *); /* MR23 */ extern char *endFormal(char *pStart, /* MR23 */ char **ppDataType, /* MR23 */ char **ppSymbol, /* MR23 */ char **ppEqualSign, /* MR23 */ char **ppValue, /* MR23 */ char **ppSeparator, /* MR23 */ int *pNext); /* MR23 */ extern char *strBetween(char *pStart, /* MR23 */ char *pNext, /* MR23 */ char *pStop); /* MR23 */ extern int hasMultipleOperands(char *); /* MR23 */ extern void DumpInitializers(FILE*, RuleEntry*, char*); /* MR23 */ extern int isTermEntryTokClass(TermEntry *); /* MR23 */ extern int isEmptyAlt(Node *, Node *); /* MR23 */ #else extern int STRICMP(); extern void istackreset(); extern int istacksize(); extern void pushint(); extern int popint(); extern int istackempty(); extern int topint(); extern void NewSetWd(); extern void DumpSetWd(); extern void DumpSetWdForC(); extern void DumpSetWdForCC(); extern void NewSet(); extern void FillSet(); extern void ComputeErrorSets(); extern void ComputeTokSets(); extern void SubstErrorClass(); extern int DefErrSet(); extern int DefErrSetForC(); extern int DefErrSetForCC(); extern int DefErrSet1(); extern int DefErrSetForC1(); extern int DefErrSetForCC1(); extern int DefErrSetWithSuffix(); /* MR21 */ extern void GenErrHdr(); extern void dumpExpr(); extern void addParm(); extern Graph buildAction(); extern Graph buildToken(); extern Graph buildWildCard(); extern Graph buildRuleRef(); extern Graph Or(); extern Graph Cat(); extern Graph makeOpt(); extern Graph makeBlk(); extern Graph makeLoop(); extern Graph makePlus(); extern Graph emptyAlt(); extern Graph emptyAlt3(); extern TokNode * newTokNode(); extern RuleRefNode * newRNode(); extern Junction * newJunction(); extern ActionNode * newActionNode(); extern char * makelocks(); extern void preorder(); extern Tree * tnode(); extern void _Tfree(); extern Tree * tdup(); extern int is_single_tuple(); extern Tree * tappend(); extern void Tfree(); extern Tree * tlink(); extern Tree * tshrink(); extern Tree * tflatten(); extern Tree * tJunc(); extern Tree * tRuleRef(); extern Tree * tToken(); extern Tree * tAction(); extern int tmember(); extern int tmember_constrained(); extern Tree * tleft_factor(); extern Tree * trm_perm(); extern void tcvt(); extern Tree * permute(); extern Tree * VerifyAmbig(); extern set rJunc(); extern set rRuleRef(); extern set rToken(); extern set rAction(); extern void HandleAmbiguity(); extern set First(); extern void freeBlkFsets(); extern void genAction(); extern void genRuleRef(); extern void genToken(); extern void genOptBlk(); extern void genLoopBlk(); extern void genLoopBegin(); extern void genPlusBlk(); extern void genSubBlk(); extern void genRule(); extern void genJunction(); extern void genEndBlk(); extern void genEndRule(); extern void genHdr(); extern void genHdr1(); extern void dumpAction(); extern void dumpActionPlus(); /* MR21 */ extern Entry ** newHashTable(); extern Entry * hash_add(); extern Entry * hash_get(); extern void hashStat(); extern char * mystrdup(); extern void genLexDescr(); extern void dumpLexClasses(); extern void genDefFile(); extern void DumpListOfParmNames(); /* MR5 janm 26-May-97 */ extern int DumpNextNameInDef(); extern void DumpOldStyleParms(); extern void DumpType(); extern int strmember(); /* extern int HasComma(); MR23 Replaced by hasMultipleOperands() */ extern void DumpRetValStruct(); extern char * StripQuotes(); extern int main(); extern void readDescr(); extern FILE * NextFile(); extern char * outnameX(); extern char * outname(); extern void fatalFL(); extern void fatal_intern(); extern void cleanUp(); extern char * eMsg3(); extern char * eMsgd(); extern char * eMsgd2(); extern void s_fprT(); extern char * TerminalString(); extern void lexclass(); extern void lexmode(); extern int LexClassIndex(); extern int hasAction(); extern void setHasAction(); extern int addTname(); extern int addTexpr(); extern int Tnum(); extern void Tklink(); extern Entry * newEntry(); extern void list_add(); extern void list_free(); /* MR10 */ extern void list_apply(); extern int list_search_cstring (); /* MR27 */ extern char * Fkey(); extern void FoPush(); extern void FoPop(); extern void RegisterCycle(); extern void ResolveFoCycles(); extern void pJunc(); extern void pRuleRef(); extern void pToken(); extern void pAction(); extern void FoLink(); extern void addFoLink(); extern void GenCrossRef(); extern void defErr(); extern void genStdPCCTSIncludeFile(); extern char * pcctsBaseName(); /* MR32 */ extern Predicate *find_predicates(); extern Predicate *MR_find_predicates_and_supp(); /* MR13 */ extern int predicateLookaheadDepth(); /* MR10 */ extern void predicate_free(); /* MR10 */ extern Predicate * predicate_dup(); /* MR10 */ extern Predicate * predicate_dup_without_context(); /* MR11 */ extern void GenRulePrototypes(); extern Junction *first_item_is_guess_block(); extern Junction *first_item_is_guess_block_extra(); /* MR30 */ extern Junction *analysis_point(); extern Tree *make_tree_from_sets(); extern Tree *tdup_chain(); extern Tree *tdif(); extern set covered_set(); extern void AmbiguityDialog(); extern void dumpAmbigMsg(); extern void GenRuleFuncRedefs(); extern void GenPredefinedSymbolRedefs(); extern void GenASTSymbolRedefs(); extern void GenRemapFile(); extern void GenSetRedefs(); extern ForcedToken *newForcedToken(); extern void RemapForcedTokens(); extern char *TokenOrExpr(); extern void setUpperRange(); extern void GenParser_c_Hdr(); extern void GenParser_h_Hdr(); extern void GenRuleMemberDeclarationsForCC(); extern int addForcedTname(); extern char *OutMetaName(); extern void OutFirstSetSymbol(); /* MR21 */ extern void warnNoFL(); extern void warnFL(); extern void warn(); extern void warnNoCR(); extern void errNoFL(); extern void errFL(); extern void err(); extern void errNoCR(); extern void genPredTree(); extern UserAction *newUserAction(); extern char *gate_symbol(); extern char *makeAltID(); extern void DumpRemainingTokSets(); extern void DumpANSIFunctionArgDef(); extern void DumpFormals(); /* MR23 */ extern char* hideDefaultArgs(); /* MR22 VHS */ extern Predicate *computePredFromContextGuard(); extern void recomputeContextGuard(); /* MR13 */ extern Predicate *new_pred(); extern void chkGTFlag(); extern void leAdd(); /* MR7 */ extern void leFixup(); /* MR7 */ extern void egAdd(); /* MR7 */ extern void egFixup(); /* MR7 */ extern void altAdd(); /* MR7 */ extern void altFixup(); /* MR7 */ extern Predicate * MR_find_in_aSubBlk(); /* MR10 */ extern Predicate * MR_predFlatten(); /* MR10 */ extern Predicate * MR_predSimplifyALL(); /* MR10 */ extern Predicate * MR_predSimplifyALLX(); /* MR10 */ extern void MR_cleanup_pred_trees(); /* MR10 */ extern int MR_allPredLeaves(); /* MR10 */ extern int MR_predicate_context_completed(); /* MR10 */ extern void MR_check_pred_too_long(); /* MR10 */ extern Tree * MR_remove_epsilon_from_tree(); /* MR10 */ extern Tree * MR_computeTreeAND(); /* MR10 */ extern int MR_tree_equ(); /* MR10 */ extern set MR_First(); /* MR10 */ extern set MR_compute_pred_set(); /* MR10 */ extern Tree * MR_compute_pred_tree_context(); /* MR10 */ extern int MR_pointerStackPush(); /* MR10 */ extern void * MR_pointerStackPop(); /* MR10 */ extern void * MR_pointerStackTop(); /* MR10 */ extern void MR_pointerStackReset(); /* MR10 */ extern void MR_backTraceReport(); /* MR10 */ extern void MR_alphaBetaTraceReport(); /* MR14 */ extern void MR_dumpRuleSet(); /* MR14 */ extern void MR_predContextPresent(); /* MR10 */ extern void MR_dumpPred(); /* MR10 */ extern void MR_dumpPred1(); /* MR10 */ extern void MR_xxxIndent(); /* MR11 */ extern void MR_stderrIndent(); /* MR11 */ extern void MR_outputIndent(); /* MR11 */ extern Junction * MR_ruleReferenced(); /* MR10 */ extern void MR_releaseResourcesUsedInRule(); /* MR10 */ extern void MR_dumpTreeX(); /* MR10 */ extern void MR_dumpTreeF(); /* MR10 */ extern void DumpFcache(); /* MR10 */ extern void MR_dumpTokenSet(); /* MR10 */ extern void MR_traceAmbSource(); /* MR11 */ extern Node *MR_advance(); /* MR11 */ extern int MR_offsetFromRule(); /* MR11 */ extern char *MR_ruleNamePlusOffset(); /* MR11 */ extern void MR_traceAmbSourceK(); /* MR11 */ extern void MR_traceAmbSourceKclient(); /* [i_a] added */ extern int MR_max_height_of_tree(); /* MR11 */ extern int MR_all_leaves_same_height(); /* MR11 */ extern void MR_projectTreeOntoSet(); /* MR11 */ extern Tree *MR_make_tree_from_set(); /* MR11 */ extern Predicate *MR_removeRedundantPredPass3(); /* MR11 */ extern void MR_pred_depth(); /* MR11 */ extern int MR_comparePredicates(); /* MR11 */ extern Predicate * MR_unfold(); /* MR11 */ extern void MR_simplifyInverted(); /* MR11 */ extern int MR_secondPredicateUnreachable(); /* MR11 */ extern Junction * MR_nameToRuleBlk(); /* MR10 */ extern void MR_clearPredEntry(); /* MR11 */ extern void MR_orphanRules(); /* MR12 */ extern void MR_merge_contexts(); /* MR12 */ extern int ci_strequ(); /* MR12 */ extern void MR_guardPred_plainSet(); /* MR12c */ extern void MR_suppressSearchReport(); /* MR12c */ extern Predicate * MR_suppressK(); /* MR13 */ extern void MR_backTraceDumpItem(); /* MR13 */ extern void MR_backTraceDumpItemReset(); /* MR13 */ extern Junction * MR_junctionWithoutP2(); /* MR13 */ extern void MR_setConstrainPointer(); /* MR18 */ extern void BlockPreambleOption(); /* MR23 */ extern char* getInitializer(); /* MR23 */ extern int hasMultipleOperands(); /* MR23 */ extern char *endFormal(); /* MR23 */ extern char *strBetween(); /* MR23 */ extern void DumpInitializers(); /* MR23 */ extern int isTermEntryTokClass(); /* MR23 */ extern int isEmptyAlt(); #endif #ifdef __USE_PROTOS #include #endif /* MR20 G. Hobbelt Create proper externs for dlg variables */ extern set attribsRefdFromAction; extern int inAlt; extern int UsedOldStyleAttrib; extern int UsedNewStyleLabel; #define MAX_BLK_LEVEL 100 /* MR23 */ extern int CurBlockID_array[MAX_BLK_LEVEL]; /* MR23 */ extern int CurAltNum_array[MAX_BLK_LEVEL]; /* MR23 */ gtkwave-3.3.86/contrib/pccts/antlr/README0000664000175000017500000000133013166335473017355 0ustar bybellbybell ANTLR 1.33 This directory contains the files necessary to build ANTLR. If you do a "make scrub", ANTLR will have to run on antlr.g and DLG will have to run on parser.dlg. Either (1) ANTLR uses the previous antlr in that directory to rebuild itself (2) Needs to find antlr on the search path You will find that running "antlr -gh antlr.g" will result in about 10 ambiguity warnings. These are normal. Don't worry. If you do a "make clean" right after installation, ANTLR and DLG should not need to run; only the C files will compile. Don't forget to go into the makefile to uncomment the appropriate definitions for your OS/architecture/compiler or see the appropriate NOTES.?? file. gtkwave-3.3.86/contrib/pccts/antlr/syn.h0000664000175000017500000003330013166335473017461 0ustar bybellbybell/* * syn.h * * This file includes definitions and macros associated with syntax diagrams * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * ANTLR 1.33 * Terence Parr * Parr Research Corporation * with Purdue University and AHPCRC, University of Minnesota * 1989-2001 */ #include "set.h" #define NumNodeTypes 4 #define NumJuncTypes 9 /* List the different node types */ #define nJunction 1 #define nRuleRef 2 #define nToken 3 #define nAction 4 /* Different types of junctions */ #define aSubBlk 1 #define aOptBlk 2 #define aLoopBlk 3 #define EndBlk 4 #define RuleBlk 5 #define Generic 6 /* just a junction--no unusual characteristics */ #define EndRule 7 #define aPlusBlk 8 #define aLoopBegin 9 typedef int NodeType; #define TreeBlockAllocSize 500 #define JunctionBlockAllocSize 200 #define ActionBlockAllocSize 50 #define RRefBlockAllocSize 100 #define TokenBlockAllocSize 100 #ifdef __cplusplus class ActionNode; class Junction; #endif /* note that 'right' is used by the tree node allocator as a ptr for linked list */ typedef struct _tree { struct _tree *down, *right; int token; union { int rk; /* if token==EpToken, => how many more tokens req'd */ struct _tree *tref; /* if token==TREE_REF */ set sref; /* if token==SET */ } v; #ifdef TREE_DEBUG int in_use; int seq; #endif } Tree; /* a predicate is defined to be a predicate action and a token tree with * context info (if used); later, this struct may include the * "hoisting distance" when we hoist past tokens. * * A tree is used to indicate && vs || * * p * | * q--r * * indicates p && (q||r). * * If expr is PRED_AND_LIST or PRED_OR_LIST, then it's an operation node * and indicates the start of an && or || list. */ typedef struct _Predicate { struct _Predicate *down, *right; /* these have to be first */ struct _Predicate *up, *left; /* doubly-link me */ char *expr; Tree *tcontext; /* used if lookahead depth of > one is needed (tree) */ int k; /* lookahead depth for this tcontext */ set scontext[2];/* used if lookahead depth of one is needed (set) */ /* scontext[0] is not used; only needed so genExprSets() routine works (it expects an array) */ set completionTree; /* which lookahead depths are required to complete tcontext? */ set completionSet; /* MR10 separate completion set for sets and trees */ struct _PredEntry *predEntry; /* MR11 */ #ifdef __cplusplus ActionNode *source; /* where did this predicate come from? */ #else struct _anode *source; /* where did this predicate come from? */ #endif char cloned; /* MR10 don't want to free original guard pred */ char redundant; /* MR10 predicate tree simplification */ char ampersandStyle; /* MR10 (g)? && <

>? */ char inverted; /* MR11 ! predName */ char isConst; /* MR11 */ char constValue; /* MR11 */ char conflictReported; /* MR11 */ set plainSet; /* MR12b */ /*** remember to change new_predicate() and predicate_dup() when changing this ***/ } Predicate; typedef struct _ExceptionHandler { char *signalname; char *action; } ExceptionHandler; typedef struct _ExceptionGroup { struct _ListNode *handlers; /* list of ExceptionHandler's */ char *label; /* label==""; implies not attached to any * particular rule ref. */ char *altID; /* which alt did it come from (blk#:alt#) */ struct _ExceptionGroup *pendingLink; /* for alternative EG MR7 */ struct _ExceptionGroup *outerEG; /* for alternative EG MR7 */ struct _LabelEntry *labelEntry; /* for alternative EG MR7 */ int forRule; /* MR7 */ int used; /* MR7 */ } ExceptionGroup ; #define TokenString(_i) ((TokenInd!=NULL)?TokenStr[TokenInd[_i]]:TokenStr[_i]) #define ExprString(_i) ((TokenInd!=NULL)?ExprStr[TokenInd[_i]]:ExprStr[_i]) /* M e s s a g e P a s s i n g T o N o d e s */ /* * assumes a 'Junction *r' exists. This macro calls a function with * the pointer to the node to operate on and a pointer to the rule * in which it is enclosed. */ #define TRANS(p) {if ( (p)==NULL ) fatal("TRANS: NULL object"); \ if ( (p)->ntype == nJunction ) (*(fpJTrans[((Junction *)(p))->jtype]))( p );\ else (*(fpTrans[(p)->ntype]))( p );} #define PRINT(p) {if ( (p)==NULL ) fatal("PRINT: NULL object");\ (*(fpPrint[(p)->ntype]))( p );} #define REACH(p,k,rk,a) {if ( (p)==NULL ) fatal("REACH: NULL object");\ (a) = (*(fpReach[(p)->ntype]))( p, k, rk );} #define TRAV(p,k,rk,a) {if ( (p)==NULL ) {\ if ( ContextGuardTRAV ) (a)=NULL; \ else fatal("TRAV: NULL object");\ } \ else (a) = (*(fpTraverse[(p)->ntype]))( p, k, rk );} /** *** #define TRAV(p,k,rk,a) {if ( (p)==NULL ) fatal("TRAV: NULL object");\ *** (a) = (*(fpTraverse[(p)->ntype]))( p, k, rk );} **/ /* All syntax diagram nodes derive from Node -- superclass */ #ifdef __cplusplus class Node { public: NodeType ntype; char *rname; /* what rule does this element live in? */ int file; /* index in FileStr */ int line; /* line number that element occurs on */ }; #else typedef struct _node { NodeType ntype; char *rname; /* what rule does this element live in? */ int file; /* index in FileStr */ int line; /* line number that element occurs on */ } Node; #endif #ifdef __cplusplus class ActionNode : public Node { public: #else typedef struct _anode { NodeType ntype; char *rname; /* what rule does this action live in? */ int file; /* index in FileStr (name of file with action) */ int line; /* line number that action occurs on */ #endif Node *next; char *action; int is_predicate; /* true if action is a <<...>>? predicate action */ int done; /* don't dump if action dumped (used for predicates) */ int init_action; /* is this the 1st action of 1st prod of block? */ char *pred_fail; /* what to do/print when predicate fails */ Predicate *guardpred; /* if '(context)? =>' was present, already done */ unsigned char frmwarned;/* have we dumped a warning for pred yet? */ unsigned char ctxwarned;/* have we dumped a warning for pred yet? */ unsigned char predTooLong; /* MR10 have we dumped warning for pred yet */ unsigned char noHoist; /* MR12 literally "noHoist" */ Predicate *ampersandPred; /* MR10 (g)? && <

>? expr */ #ifdef __cplusplus Junction *guardNodes; /* MR11 */ #else struct _junct *guardNodes; /* MR11 */ #endif struct _PredEntry *predEntry; /* MR11 */ int inverted; /* MR11 <>? */ #ifdef __cplusplus }; #else } ActionNode; #endif #ifdef __cplusplus class TokNode : public Node { public: #else typedef struct _toknode { NodeType ntype; char *rname; /* name of rule it's in */ int file; /* index in FileStr (name of file with rule) */ int line; /* line number that token occurs on */ #endif Node *next; int token; int astnode; /* leaf/root/excluded (used to build AST's) */ unsigned char label;/* token label or expression ? */ unsigned char remapped; /* used if token id's are forced to certain positions; * a function walks the tree reassigning token numbers */ int upper_range; /* MR13 - was char */ /* used only if Token is of type T1..T2; in this case, * use token..upper_range as the range; else * upper_range must be 0 */ unsigned char wild_card; /* indicates that the token is the "." wild-card; * field token is ignored if wild_card is set */ unsigned int elnum; /* element number within the alternative */ #ifdef __cplusplus Junction *altstart; /* pointer to node that starts alt */ #else struct _junct *altstart; /* pointer to node that starts alt */ #endif struct _TCnode *tclass; /* token class if tokclass ref */ set tset; /* set of tokens represented by meta token */ char *el_label; /* el_label:toknode */ unsigned char complement; /* complement the set? */ ExceptionGroup *ex_group; /* any exception[el_label] attached? */ unsigned char use_def_MT_handler; unsigned char label_used_in_semantic_pred; /* MR10 */ #ifdef __cplusplus }; #else } TokNode; #endif #ifdef __cplusplus class RuleRefNode : public Node { public: #else typedef struct _rrnode { NodeType ntype; char *rname; /* name of rule it's in */ int file; /* index in FileStr (name of file with rule) it's in */ int line; /* line number that rule ref occurs on */ #endif Node *next; char *text; /* reference to which rule */ char *parms; /* point to parameters of rule invocation (if present) */ char *assign; /* point to left-hand-side of assignment (if any) */ int linked; /* Has a FoLink already been established? */ int astnode; /* excluded? (used to build AST's) */ unsigned int elnum; /* element number within the alternative */ #ifdef __cplusplus Junction *altstart; #else struct _junct *altstart; #endif char *el_label; /* el_label:rrnode */ ExceptionGroup *ex_group; /* any exception[el_label] attached? */ #ifdef __cplusplus }; #else } RuleRefNode; #endif #ifdef __cplusplus class Junction : public Node { public: #else typedef struct _junct { NodeType ntype; char *rname; /* name of rule junction is in */ int file; /* index in FileStr (name of file with rule) if blk == RuleBlk */ int line; /* line number that rule occurs on */ #endif int seq; /* MR10 sequence number */ char ignore; /* used by FIRST computation to ignore empty alt added for the (...)+ blks */ char visited; /* used by recursive routines to avoid infinite recursion */ char pvisited; /* used by print routines to avoid infinite recursion */ char fvisited; /* used by FoLink() to avoid infinite recursion */ char *lock; /* used by REACH to track infinite recursion */ char *pred_lock; /* used by find_predicates to track infinite recursion */ int altnum; /* used in subblocks. altnum==0 means not an alt of subrule */ int jtype; /* annotation for code-gen/FIRST/FOLLOW. Junction type */ #ifdef __cplusplus Junction *end; /* pointer to node with EndBlk in it if blk == a block type */ #else struct _junct *end; /* pointer to node with EndBlk in it if blk == a block type */ #endif Node *p1, *p2; char halt; /* never move past a junction with halt==TRUE */ /* MR10 was int */ char *pdecl; /* point to declaration of parameters on rule (if present) */ char *parm; /* point to parameter of block invocation (if present) */ char predparm; /* indicates that the 'parm' is a predicate * to be used in the while loop generated * for blocks */ /* MR10 was int */ char *ret; /* point to return type of rule (if present) */ char *erraction; /* point to error action (if present) */ int blockid; /* this is a unique ID */ char *exception_label; /* goto label for this alt */ set *fset; /* used for code generation */ Tree *ftree; /* used for code generation */ Predicate *predicate;/* predicate that can be used to disambiguate */ char guess; /* true if (...)? block */ char alpha_beta_guess_end; /* MR14 1 => end block of guess sub block */ Node *guess_analysis_point; /* MR14 */ char approx; /* limit block to use linear approx lookahead? */ set tokrefs; /* if ith element of alt is tokref then i is member */ set rulerefs; /* if ith element of alt is rule ref then i is member */ struct _ListNode *exceptions; /* list of exceptions groups for rule */ struct _ListNode *el_labels; /* list of element labels for rule */ ExceptionGroup *outerEG; /* MR7 */ int curAltNum; /* MR7 */ char* pFirstSetSymbol; /* #pragma FirstSetSymbol(Foo) MR21 */ #ifdef __cplusplus Junction *pendingLink; /* MR7 */ #else struct _junct *pendingLink; /* MR7 */ #endif char overlap_warning; /* MR10 */ #ifdef __cplusplus }; #else } Junction; #endif typedef struct { Node *left, *right;} Graph; gtkwave-3.3.86/contrib/pccts/antlr/generic.h0000664000175000017500000002230013166335473020262 0ustar bybellbybell/* * generic.h -- generic include stuff for new PCCTS ANTLR. * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * ANTLR 1.33 * Terence Parr * Parr Research Corporation * with Purdue University and AHPCRC, University of Minnesota * 1989-2001 */ #define StrSame 0 #define DefaultParserName "zzparser" /* MR9 JVincent@novell.com Allow user to override default ZZLEXBUFSIZE */ /* MR11 thm Raise antlr's own default ZZLEXBUFSIZE to 8k */ /* MR22 thm Raise antlr's own default ZZLEXBUFSIZE to 32k */ #ifndef ZZLEXBUFSIZE #define ZZLEXBUFSIZE 32000 #endif /* Tree/FIRST/FOLLOW defines -- valid only after all grammar has been read */ #define ALT TokenNum+1 #define SET TokenNum+2 #define TREE_REF TokenNum+3 /* E r r o r M a c r o s */ #define fatal(err) fatalFL(err, __FILE__, __LINE__) #define fatal_internal(err) fatal_intern(err, __FILE__, __LINE__) #define eMsg1(s,a) eMsg3(s,a,NULL,NULL) #define eMsg2(s,a,b) eMsg3(s,a,b,NULL) /* S a n i t y C h e c k i n g */ #ifndef require #define require(expr, err) {if ( !(expr) ) fatal_internal(err);} #endif /* L i s t N o d e s */ typedef struct _ListNode { void *elem; /* pointer to any kind of element */ struct _ListNode *next; } ListNode; /* Define a Cycle node which is used to track lists of cycles for later * reconciliation by ResolveFoCycles(). */ typedef struct _c { int croot; /* cycle root */ set cyclicDep; /* cyclic dependents */ unsigned deg; /* degree of FOLLOW set of croot */ } Cycle; typedef struct _e { int tok; /* error class name == TokenStr[tok] */ ListNode *elist; /* linked list of elements in error set */ set eset; int setdeg; /* how big is the set */ int lexclass; /* which lex class is it in? */ } ECnode; typedef struct _TCnode { int tok; /* token class name */ ListNode *tlist; /* linked list of elements in token set */ set tset; int lexclass; /* which lex class is it in? */ unsigned char dumped; /* this def has been been dumped */ unsigned char dumpedComplement; /* this def has been been dumped */ unsigned setnum; /* which set number is this guy? (if dumped) */ unsigned setnumComplement; /* MR23 */ unsigned setnumErrSet; /* MR23 which set is this #tokclass error set (if dumped) */ unsigned setnumErrSetComplement; /* MR23 */ } TCnode; typedef struct _ft { char *token; /* id of token type to remap */ int tnum; /* move token type to which token position */ } ForcedToken; typedef struct _ContextGuardPredicates { /* MR13 */ Predicate *pred; /* MR13 */ } ContextGuardPredicates; /* MR13 */ #define newListNode (ListNode *) calloc(1, sizeof(ListNode)); #define newCycle (Cycle *) calloc(1, sizeof(Cycle)); #define newECnode (ECnode *) calloc(1, sizeof(ECnode)); #define newTCnode (TCnode *) calloc(1, sizeof(TCnode)); /* H a s h T a b l e E n t r i e s */ typedef struct _t { /* Token name or expression */ char *str; struct _t *next; int token; /* token number */ unsigned char classname; /* is it a err/tok class name or token */ TCnode *tclass; /* ptr to token class */ char *action; char *akaString; } TermEntry; typedef struct _r { /* Rule name and ptr to start of rule */ char *str; struct _t *next; int rulenum; /* RulePtr[rulenum]== ptr to RuleBlk junction */ unsigned char noAST;/* gen AST construction code? (def==gen code) */ char *egroup; /* which error group (err reporting stuff) */ #if 0 /* MR27 This appears to never be used. Delete this code later. */ ListNode *el_labels;/* list of element labels ref in all of rule */ #endif ListNode *ast_labels_in_actions; /* MR27 */ unsigned char has_rule_exception; char dontComputeErrorSet; /* MR14 - don't compute error set special for rule in alpha part of (alpha)? beta block */ } RuleEntry; typedef struct _f { /* cache Fi/Fo set */ char *str; /* key == (rulename, computation, k) */ struct _f *next; set fset; /* First/Follow of rule */ set rk; /* set of k's remaining to be done after ruleref */ int incomplete; /* only w/FOLLOW sets. Use only if complete */ } CacheEntry; typedef struct _LabelEntry { /* element labels */ char *str; struct _f *next; Node *elem; /* which element does it point to? */ ExceptionGroup *ex_group; /* Is there an exception attached to label? */ ExceptionGroup *outerEG; /* MR7 */ /* next EG if ex_group doesn't catch it MR7 */ struct _LabelEntry *pendingLink; /* MR7 */ /* too lazy to use ListNode ? MR7 */ int curAltNum; /* MR7 */ } LabelEntry; typedef struct _SignalEntry { char *str; struct _f *next; int signum; /* unique signal number */ } SignalEntry; typedef struct _PredEntry { /* MR11 predicate name and ptr to string */ char *str; struct _PredEntry *next; int file; int line; Predicate *pred; char *predLiteral; } PredEntry; typedef struct _PointerStack { /* MR10 */ int count; int size; void **data; } PointerStack; #define newTermEntry(s) (TermEntry *) newEntry(s, sizeof(TermEntry)) #define newRuleEntry(s) (RuleEntry *) newEntry(s, sizeof(RuleEntry)) #define newCacheEntry(s) (CacheEntry *) newEntry(s, sizeof(CacheEntry)) #define newLabelEntry(s) (LabelEntry *) newEntry(s, sizeof(LabelEntry)) #define newSignalEntry(s) (SignalEntry *) newEntry(s, sizeof(SignalEntry)) #define newPredEntry(s) (PredEntry *) newEntry(s,sizeof(PredEntry)) typedef struct _UserAction { char *action; int file, line; } UserAction; /* L e x i c a l C l a s s */ /* to switch lex classes, switch ExprStr and Texpr (hash table) */ typedef struct _lc { char *classnum, **exprs; Entry **htable; } LClass; typedef struct _exprOrder { char *expr; int lclass; } Expr; typedef Graph Attrib; /* M a x i m u m s */ /* MR20 Note G. Hobbelt These values are superceded by values in hash.h */ #ifndef HashTableSize #define HashTableSize 253 #endif #ifndef StrTableSize #define StrTableSize 15000 /* all tokens, nonterminals, rexprs stored here */ #endif #define MaxLexClasses 50 /* how many automatons */ /* TokenStart and EofToken are ignored if #tokdefs meta-op is used */ #define TokenStart 2 /* MUST be in 1 + EofToken */ #define EofToken 1 /* Always predefined to be 1 */ #ifndef MaxNumFiles #define MaxNumFiles 99 #endif /**** MR9 JVincent@novell.com Move to pcctscfg.h */ /**** #define MaxFileName 300 ****/ /* MR9 Move to pcctscfg.h */ /* largest file name size */ #define MaxRuleName 100 /* largest rule name size */ #define TSChunk 100 /* how much to expand TokenStr/ExprStr each time */ #define TIChunk TSChunk /* expand TokenInd by same as TokenStr to mirror them */ #define FoStackSize 100 /* deepest FOLLOW recursion possible */ #define MaxClassDeclStuff 256 /* MR10 */ #define NumPredefinedSignals 3 /* S t a n d a r d S i g n a l s */ #define sigNoSignal 0 #define sigMismatchedToken 1 #define sigNoViableAlt 2 #define sigNoSemViableAlt 3 /* AST token types */ #define ASTexclude 0 #define ASTchild 1 #define ASTroot 2 #define ASTinclude 3 /* include subtree made by rule ref */ #define PredictionVariable "zzpr_expr" #define PredictionLexClassSuffix "_zzpred" #define WildCardString "WildCard" #if 0 /* Removed in version 1.33MR19 Don't understand why this never caused problems before */ /********************************************************* #ifndef ANTLRm #define ANTLRm(st, f, _m) zzbufsize = ZZLEXBUFSIZE;\ zzmode(_m); \ zzenterANTLR(f); \ st; ++zzasp; \ zzleaveANTLR(f); #endif *********************************************************/ #endif #include "proto.h" #include "pcctscfg.h" /* MR14 */ #include gtkwave-3.3.86/contrib/pccts/antlr/AntlrMSVC60.dsp0000664000175000017500000001561713166335473021141 0ustar bybellbybell# Microsoft Developer Studio Project File - Name="ANTLR" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=ANTLR - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "AntlrMSVC60.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "AntlrMSVC60.mak" CFG="ANTLR - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "ANTLR - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "ANTLR - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "AntlrMSVC60" # PROP Scc_LocalPath ".." CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "ANTLR - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "." # PROP Intermediate_Dir "." # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /W3 /O2 /I "." /I "..\h" /I "..\support\set" /D "__STDC__" /D "NDEBUG" /D "LONGFILENAMES" /D "PC" /D "USER_ZZSYN" /D ZZLEXBUFSIZE=65536 /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FR /FD /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"./Antlr.exe" # Begin Special Build Tool SOURCE="$(InputPath)" PostBuild_Desc=Copy antlr to ..\bin directory PostBuild_Cmds=mkdir ..\bin copy ..\bin\antlr.exe antlr_old.exe copy antlr.exe ..\bin\. # End Special Build Tool !ELSEIF "$(CFG)" == "ANTLR - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "." # PROP Intermediate_Dir "." # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /W3 /Gm /ZI /Od /I "." /I "..\h" /I "..\support\set" /D "__STDC__" /D "LONGFILENAMES" /D "PC" /D "USER_ZZSYN" /D ZZLEXBUFSIZE=65536 /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FR /FD /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo -DUSER_ZZSYN -D__STDC__ LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"./Antlr.exe" /pdbtype:sept # Begin Special Build Tool SOURCE="$(InputPath)" PostBuild_Desc=Copy antlr to ..\bin PostBuild_Cmds=mkdir ..\bin copy ..\bin\antlr.exe antlr_old.exe copy antlr.exe ..\bin\. # End Special Build Tool !ENDIF # Begin Target # Name "ANTLR - Win32 Release" # Name "ANTLR - Win32 Debug" # Begin Source File SOURCE=.\antlr.c # End Source File # Begin Source File SOURCE=.\antlr.g !IF "$(CFG)" == "ANTLR - Win32 Release" # Begin Custom Build - Building ANTLR Parser from ANTLR Grammar InputPath=.\antlr.g InputName=antlr BuildCmds= \ ..\bin\antlr -gh $(InputName).g \ ..\bin\dlg -C2 parser.dlg scan.c \ "antlr.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "err.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "mode.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "scan.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "tokens.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "parser.dlg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) # End Custom Build !ELSEIF "$(CFG)" == "ANTLR - Win32 Debug" # Begin Custom Build - Building ANTLR Parser from ANTLR Grammar InputPath=.\antlr.g InputName=antlr BuildCmds= \ ..\bin\antlr -gh $(InputName).g \ ..\bin\dlg -C2 parser.dlg scan.c \ "antlr.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "err.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "mode.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "scan.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "tokens.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "parser.dlg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\bits.c # End Source File # Begin Source File SOURCE=.\build.c # End Source File # Begin Source File SOURCE=.\dumpnode.c # End Source File # Begin Source File SOURCE=.\egman.c # End Source File # Begin Source File SOURCE=.\err.c !IF "$(CFG)" == "ANTLR - Win32 Release" !ELSEIF "$(CFG)" == "ANTLR - Win32 Debug" # SUBTRACT CPP /YX /Yc /Yu !ENDIF # End Source File # Begin Source File SOURCE=.\fcache.c # End Source File # Begin Source File SOURCE=.\fset.c # End Source File # Begin Source File SOURCE=.\fset2.c # End Source File # Begin Source File SOURCE=.\gen.c # End Source File # Begin Source File SOURCE=.\generic.h # End Source File # Begin Source File SOURCE=.\globals.c # End Source File # Begin Source File SOURCE=.\hash.c # End Source File # Begin Source File SOURCE=.\hash.h # End Source File # Begin Source File SOURCE=.\lex.c # End Source File # Begin Source File SOURCE=.\main.c # End Source File # Begin Source File SOURCE=.\misc.c # End Source File # Begin Source File SOURCE=.\mrhoist.c # End Source File # Begin Source File SOURCE=.\pred.c # End Source File # Begin Source File SOURCE=.\proto.h # End Source File # Begin Source File SOURCE=.\scan.c # End Source File # Begin Source File SOURCE=..\support\set\set.c # End Source File # Begin Source File SOURCE=.\syn.h # End Source File # End Target # End Project gtkwave-3.3.86/contrib/pccts/antlr/fset2.c0000664000175000017500000015742013166335473017700 0ustar bybellbybell/* * fset2.c * * Compute FIRST sets for full LL(k) * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * ANTLR 1.33 * Terence Parr * Parr Research Corporation * with Purdue University and AHPCRC, University of Minnesota * 1989-2001 */ #include #include "pcctscfg.h" #include #ifdef PCCTS_USE_STDARG #include #else #include #endif #include "set.h" #include "syn.h" #include "hash.h" #include "generic.h" #include "dlgdef.h" /* ick! globals. Used by permute() to track which elements of a set have been used */ static int *findex; set *fset; /* MR11 make global */ static unsigned **ftbl; static set *constrain; /* pts into fset. constrains tToken() to 'constrain' */ int ConstrainSearch; int maxk; /* set to initial k upon tree construction request */ /* MR11 make global */ static Tree *FreeList = NULL; #ifdef __USE_PROTOS static int tmember_of_context(Tree *, Predicate *); #else static int tmember_of_context(); #endif #if TREE_DEBUG set set_of_tnodes_in_use; int stop_on_tnode_seq_number=(-1); /* (-1) to disable */ #endif /* Do root * Then each sibling */ void #ifdef __USE_PROTOS preorder( Tree *tree ) #else preorder( tree ) Tree *tree; #endif { if ( tree == NULL ) return; if ( tree->down != NULL ) fprintf(stderr, " ("); if ( tree->token == ALT ) fprintf(stderr, " ALT"); else fprintf(stderr, " %s", TerminalString(tree->token)); if ( tree->token==EpToken ) fprintf(stderr, "(%d)", tree->v.rk); preorder(tree->down); if ( tree->down != NULL ) fprintf(stderr, " )"); preorder(tree->right); } #ifdef __USE_PROTOS int MR_tree_matches_constraints(int k,set * constrain,Tree *t) #else int MR_tree_matches_constraints(k,constrain,t) int k; set * constrain; Tree * t; #endif { int i; Tree *u; if (k == 0) return 1; /* for testing guard predicates: if the guard tree is shorter than the constraint then it is a match. The reason is that a guard of (A B) should be equivalent to a guard of (A B . . .) where "." matches every token. Thus a match which runs out of tree before constraint is a match. */ if (t == NULL) return 1; require (set_deg(constrain[0]) == 1, "MR_tree_matches_constraints: set_deg != 1"); i=set_int(constrain[0]); if (t->token != i) return 0; if (k-1 == 0) return 1; for (u=t->down; u != NULL; u=u->right) { if (MR_tree_matches_constraints(k-1,&constrain[1],u)) { return 1; }; }; return 0; } /* check the depth of each primary sibling to see that it is exactly * k deep. e.g.; * * ALT * | * A ------- B * | | * C -- D E * * Remove all branches <= k deep. * * Added by TJP 9-23-92 to make the LL(k) constraint mechanism to work. */ static int pruneCount=0; static int prunePeak=200; Tree * #ifdef __USE_PROTOS prune( Tree *t, int k ) #else prune( t, k ) Tree *t; int k; #endif { pruneCount++; if (pruneCount > prunePeak+100) { prunePeak=pruneCount; #if 0 *** fprintf(stderr,"pruneCount=%d\n",pruneCount); /*** preorder(t); ***/ *** fprintf(stderr,"\n",pruneCount); #endif }; if ( t == NULL ) { pruneCount--; return NULL; }; if ( t->token == ALT ) fatal_internal("prune: ALT node in FIRST tree"); if ( t->right!=NULL ) t->right = prune(t->right, k); if ( k>1 ) { if ( t->down!=NULL ) t->down = prune(t->down, k-1); if ( t->down == NULL ) { Tree *r = t->right; t->right = NULL; Tfree(t); pruneCount--; return r; } } pruneCount--; return t; } /* build a tree (root child1 child2 ... NULL) */ #ifdef PCCTS_USE_STDARG Tree *tmake(Tree *root, ...) #else Tree *tmake(va_alist) va_dcl #endif { Tree *w; va_list ap; Tree *child, *sibling=NULL, *tail=NULL; #ifndef PCCTS_USE_STDARG Tree *root; #endif #ifdef PCCTS_USE_STDARG va_start(ap, root); #else va_start(ap); root = va_arg(ap, Tree *); #endif child = va_arg(ap, Tree *); while ( child != NULL ) { #ifdef DUM /* added "find end of child" thing TJP March 1994 */ for (w=child; w->right!=NULL; w=w->right) {;} /* find end of child */ #else w = child; #endif if ( sibling == NULL ) {sibling = child; tail = w;} else {tail->right = child; tail = w;} child = va_arg(ap, Tree *); } /* was "root->down = sibling;" */ if ( root==NULL ) root = sibling; else root->down = sibling; va_end(ap); return root; } Tree * #ifdef __USE_PROTOS tnode( int tok ) #else tnode( tok ) int tok; #endif { Tree *p, *newblk; static int n=0; if ( FreeList == NULL ) { /*fprintf(stderr, "tnode: %d more nodes\n", TreeBlockAllocSize);*/ if ( TreeResourceLimit > 0 ) { if ( (n+TreeBlockAllocSize) >= TreeResourceLimit ) { fprintf(stderr, ErrHdr, FileStr[CurAmbigfile], CurAmbigline); fprintf(stderr, " hit analysis resource limit while analyzing alts %d and %d %s\n", CurAmbigAlt1, CurAmbigAlt2, CurAmbigbtype); exit(PCCTS_EXIT_FAILURE); } } newblk = (Tree *)calloc(TreeBlockAllocSize, sizeof(Tree)); if ( newblk == NULL ) { fprintf(stderr, ErrHdr, FileStr[CurAmbigfile], CurAmbigline); fprintf(stderr, " out of memory while analyzing alts %d and %d %s\n", CurAmbigAlt1, CurAmbigAlt2, CurAmbigbtype); exit(PCCTS_EXIT_FAILURE); } n += TreeBlockAllocSize; for (p=newblk; p<&(newblk[TreeBlockAllocSize]); p++) { p->right = FreeList; /* add all new Tree nodes to Free List */ FreeList = p; } } p = FreeList; FreeList = FreeList->right; /* remove a tree node */ p->right = NULL; /* zero out ptrs */ p->down = NULL; p->token = tok; TnodesAllocated++; /* MR10 */ TnodesInUse++; /* MR10 */ if (TnodesInUse > TnodesPeak) TnodesPeak=TnodesInUse; /* MR10 */ #ifdef TREE_DEBUG require(!p->in_use, "tnode: node in use!"); p->in_use = 1; p->seq=TnodesAllocated; set_orel( (unsigned) TnodesAllocated,&set_of_tnodes_in_use); if (stop_on_tnode_seq_number == p->seq) { fprintf(stderr,"\n*** just allocated tnode #%d ***\n", stop_on_tnode_seq_number); }; #endif return p; } static Tree * #ifdef __USE_PROTOS eofnode( int k ) #else eofnode( k ) int k; #endif { Tree *t=NULL; int i; for (i=1; i<=k; i++) { t = tmake(tnode((TokenInd!=NULL?TokenInd[EofToken]:EofToken)), t, NULL); } return t; } void #ifdef __USE_PROTOS _Tfree( Tree *t ) #else _Tfree( t ) Tree *t; #endif { if ( t!=NULL ) { #ifdef TREE_DEBUG if (t->seq == stop_on_tnode_seq_number) { fprintf(stderr,"\n*** just freed tnode #%d ***\n",t->seq); }; require(t->in_use, "_Tfree: node not in use!"); t->in_use = 0; set_rm( (unsigned) t->seq,set_of_tnodes_in_use); #endif t->right = FreeList; FreeList = t; TnodesInUse--; /* MR10 */ } } /* tree duplicate */ Tree * #ifdef __USE_PROTOS tdup( Tree *t ) #else tdup( t ) Tree *t; #endif { Tree *u; if ( t == NULL ) return NULL; u = tnode(t->token); u->v.rk = t->v.rk; u->right = tdup(t->right); u->down = tdup(t->down); return u; } /* tree duplicate (assume tree is a chain downwards) */ Tree * #ifdef __USE_PROTOS tdup_chain( Tree *t ) #else tdup_chain( t ) Tree *t; #endif { Tree *u; if ( t == NULL ) return NULL; u = tnode(t->token); u->v.rk = t->v.rk; u->down = tdup(t->down); return u; } Tree * #ifdef __USE_PROTOS tappend( Tree *t, Tree *u ) #else tappend( t, u ) Tree *t; Tree *u; #endif { Tree *w; /*** fprintf(stderr, "tappend("); *** preorder(t); fprintf(stderr, ","); *** preorder(u); fprintf(stderr, " )\n"); */ if ( t == NULL ) return u; if ( t->token == ALT && t->right == NULL ) return tappend(t->down, u); for (w=t; w->right!=NULL; w=w->right) {;} w->right = u; return t; } /* dealloc all nodes in a tree */ void #ifdef __USE_PROTOS Tfree( Tree *t ) #else Tfree( t ) Tree *t; #endif { if ( t == NULL ) return; Tfree( t->down ); Tfree( t->right ); _Tfree( t ); } /* find all children (alts) of t that require remaining_k nodes to be LL_k * tokens long. * * t-->o * | * a1--a2--...--an <-- LL(1) tokens * | | | * b1 b2 ... bn <-- LL(2) tokens * | | | * . . . * . . . * z1 z2 ... zn <-- LL(LL_k) tokens * * We look for all [Ep] needing remaining_k nodes and replace with u. * u is not destroyed or actually used by the tree (a copy is made). */ Tree * #ifdef __USE_PROTOS tlink( Tree *t, Tree *u, int remaining_k ) #else tlink( t, u, remaining_k ) Tree *t; Tree *u; int remaining_k; #endif { Tree *p; require(remaining_k!=0, "tlink: bad tree"); if ( t==NULL ) return NULL; /*fprintf(stderr, "tlink: u is:"); preorder(u); fprintf(stderr, "\n");*/ if ( t->token == EpToken && t->v.rk == remaining_k ) { require(t->down==NULL, "tlink: invalid tree"); if ( u == NULL ) { /* MR10 */ Tree *tt=t->right; /* MR10 */ _Tfree(t); /* MR10 */ return tt; }; p = tdup( u ); p->right = t->right; _Tfree( t ); return p; } t->down = tlink(t->down, u, remaining_k); t->right = tlink(t->right, u, remaining_k); return t; } /* remove as many ALT nodes as possible while still maintaining semantics */ Tree * #ifdef __USE_PROTOS tshrink( Tree *t ) #else tshrink( t ) Tree *t; #endif { if ( t == NULL ) return NULL; t->down = tshrink( t->down ); t->right = tshrink( t->right ); if ( t->down == NULL ) { if ( t->token == ALT ) { Tree *u = t->right; _Tfree(t); return u; /* remove useless alts */ } return t; } /* (? (ALT (? ...)) s) ==> (? (? ...) s) where s = sibling, ? = match any */ if ( t->token == ALT && t->down->right == NULL) { Tree *u = t->down; u->right = t->right; _Tfree( t ); return u; } /* (? (A (ALT t)) s) ==> (? (A t) s) where A is a token; s,t siblings */ if ( t->token != ALT && t->down->token == ALT && t->down->right == NULL ) { Tree *u = t->down->down; _Tfree( t->down ); t->down = u; return t; } return t; } Tree * #ifdef __USE_PROTOS tflatten( Tree *t ) #else tflatten( t ) Tree *t; #endif { if ( t == NULL ) return NULL; t->down = tflatten( t->down ); t->right = tflatten( t->right ); if ( t->down == NULL ) return t; if ( t->token == ALT ) { Tree *u; /* find tail of children */ for (u=t->down; u->right!=NULL; u=u->right) {;} u->right = t->right; u = t->down; _Tfree( t ); return u; } return t; } Tree * #ifdef __USE_PROTOS tJunc( Junction *p, int k, set *rk ) #else tJunc( p, k, rk ) Junction *p; int k; set *rk; #endif { Tree *t=NULL, *u=NULL; Junction *alt; Tree *tail=NULL, *r; #ifdef DBG_TRAV fprintf(stderr, "tJunc(%d): %s in rule %s\n", k, decodeJType[p->jtype], ((Junction *)p)->rname); #endif /* MR14 */ if (AlphaBetaTrace && p->alpha_beta_guess_end) { /* MR14 */ warnFL( /* MR14 */ "not possible to compute follow set for alpha in an \"(alpha)? beta\" block. ", /* MR14 */ FileStr[p->file],p->line); /* MR14 */ MR_alphaBetaTraceReport(); /* MR14 */ }; /* MR14 */ if (p->alpha_beta_guess_end) { /* MR14 */ return NULL; /* MR14 */ } if ( p->jtype==aLoopBlk || p->jtype==RuleBlk || p->jtype==aPlusBlk || p->jtype==aSubBlk || p->jtype==aOptBlk ) { if ( p->jtype!=aSubBlk && p->jtype!=aOptBlk ) { require(p->lock!=NULL, "rJunc: lock array is NULL"); if ( p->lock[k] ) return NULL; p->lock[k] = TRUE; } /* MR10 */ if (MR_MaintainBackTrace) { /* MR10 */ if (p->jtype != Generic) MR_pointerStackPush(&MR_BackTraceStack,p); /* MR10 */ }; TRAV(p->p1, k, rk, tail); /* MR10 */ if (MR_MaintainBackTrace) { /* MR10 */ if (p->jtype != Generic) MR_pointerStackPop(&MR_BackTraceStack); /* MR10 */ }; if ( p->jtype==RuleBlk ) {p->lock[k] = FALSE; return tail;} r = tmake(tnode(ALT), tail, NULL); for (alt=(Junction *)p->p2; alt!=NULL; alt = (Junction *)alt->p2) { /* if this is one of the added optional alts for (...)+ then break */ if ( alt->ignore ) break; if ( tail==NULL ) {TRAV(alt->p1, k, rk, tail); r->down = tail;} else { /* MR10 */ if (MR_MaintainBackTrace) { /* MR10 */ if (p->jtype != Generic) MR_pointerStackPush(&MR_BackTraceStack,p); /* MR10 */ }; TRAV(alt->p1, k, rk, tail->right); /* MR10 */ if (MR_MaintainBackTrace) { /* MR10 */ if (p->jtype != Generic) MR_pointerStackPop(&MR_BackTraceStack); /* MR10 */ }; if ( tail->right != NULL ) tail = tail->right; } } if ( p->jtype!=aSubBlk && p->jtype!=aOptBlk ) p->lock[k] = FALSE; #ifdef DBG_TREES fprintf(stderr, "blk(%s) returns:",((Junction *)p)->rname); preorder(r); fprintf(stderr, "\n"); #endif if ( r->down == NULL ) {_Tfree(r); return NULL;} return r; } if ( p->jtype==EndRule ) { if ( p->halt ) /* don't want FOLLOW here? */ { /**** if ( ContextGuardTRAV ) return NULL; ****/ set_orel( (unsigned) k, rk); /* indicate this k value needed */ /* MR10 cast */ t = tnode(EpToken); t->v.rk = k; return t; } require(p->lock!=NULL, "rJunc: lock array is NULL"); if ( p->lock[k] ) return NULL; /* if no FOLLOW assume k EOF's */ if ( p->p1 == NULL ) return eofnode(k); p->lock[k] = TRUE; } /* MR14 */ if (p->p1 != NULL && p->guess && p->guess_analysis_point == NULL) { /* MR14 */ Node * guess_point; /* MR14 */ guess_point=(Node *)analysis_point(p); /* MR14 */ if (guess_point == (Node *)p) { /* MR14 */ guess_point=p->p1; /* MR14 */ } /* MR14 */ p->guess_analysis_point=guess_point; /* MR14 */ } if ( p->p2 == NULL ) { /* MR10 */ if (MR_MaintainBackTrace) { /* MR10 */ if (p->jtype != Generic) MR_pointerStackPush(&MR_BackTraceStack,p); /* MR10 */ }; /* M14 */ if (p->guess_analysis_point != NULL) { /* M14 */ TRAV(p->guess_analysis_point, k, rk,t); /* M14 */ } else { TRAV(p->p1, k, rk,t); /* M14 */ } /* MR10 */ if (MR_MaintainBackTrace) { /* MR10 */ if (p->jtype != Generic) MR_pointerStackPop(&MR_BackTraceStack); /* MR10 */ }; if ( p->jtype==EndRule ) p->lock[k]=FALSE; return t; } /* MR10 */ if (MR_MaintainBackTrace) { /* MR10 */ if (p->jtype != Generic) MR_pointerStackPush(&MR_BackTraceStack,p); /* MR10 */ }; /* M14 */ if (p->guess_analysis_point != NULL) { /* M14 */ TRAV(p->guess_analysis_point, k, rk,t); /* M14 */ } else { TRAV(p->p1, k, rk,t); /* M14 */ } /* MR10 */ if (MR_MaintainBackTrace) { /* MR10 */ if (p->jtype != Generic) MR_pointerStackPop(&MR_BackTraceStack); /* MR10 */ }; if ( p->jtype!=RuleBlk && /* MR14 */ !p->guess) TRAV(p->p2, k, rk, u); if ( p->jtype==EndRule ) p->lock[k] = FALSE;/* unlock node */ if ( t==NULL ) return tmake(tnode(ALT), u, NULL); return tmake(tnode(ALT), t, u, NULL); } Tree * #ifdef __USE_PROTOS tRuleRef( RuleRefNode *p, int k, set *rk_out ) #else tRuleRef( p, k, rk_out ) RuleRefNode *p; int k; set *rk_out; #endif { int k2; Tree *t=NULL, *u=NULL; Junction *r; set rk, rk2; int save_halt; RuleEntry *q = (RuleEntry *) hash_get(Rname, p->text); #ifdef DBG_TRAV fprintf(stderr, "tRuleRef: %s\n", p->text); #endif if ( q == NULL ) { TRAV(p->next, k, rk_out, t);/* ignore undefined rules */ return t; } rk = rk2 = empty; if (RulePtr == NULL) fatal("RulePtr==NULL"); r = RulePtr[q->rulenum]; if ( r->lock[k] ) return NULL; save_halt = r->end->halt; r->end->halt = TRUE; /* don't let reach fall off end of rule here */ /* MR10 */ if (MR_MaintainBackTrace) { /* MR10 */ MR_pointerStackPush(&MR_BackTraceStack,p); /* MR10 */ }; TRAV(r, k, &rk, t); /* MR10 */ if (MR_MaintainBackTrace) { /* MR10 */ MR_pointerStackPop(&MR_BackTraceStack); /* MR10 */ }; r->end->halt = save_halt; #ifdef DBG_TREES fprintf(stderr, "after ruleref, t is:"); preorder(t); fprintf(stderr, "\n"); #endif t = tshrink( t ); while ( !set_nil(rk) ) { /* any k left to do? if so, link onto tree */ k2 = set_int(rk); set_rm(k2, rk); /* MR10 */ if (MR_MaintainBackTrace) { /* MR10 */ MR_pointerStackPush(&MR_BackTraceStack,p); /* MR10 */ }; TRAV(p->next, k2, &rk2, u); /* MR10 */ if (MR_MaintainBackTrace) { /* MR10 */ MR_pointerStackPop(&MR_BackTraceStack); /* MR10 */ }; t = tlink(t, u, k2); /* any alts missing k2 toks, add u onto end */ Tfree(u); /* MR10 */ } set_free(rk); /* rk is empty, but free it's memory */ set_orin(rk_out, rk2); /* remember what we couldn't do */ set_free(rk2); return t; } Tree * #ifdef __USE_PROTOS tToken( TokNode *p, int k, set *rk ) #else tToken( p, k, rk ) TokNode *p; int k; set *rk; #endif { Tree *t=NULL, *tset=NULL, *u; if (ConstrainSearch) { if (MR_AmbSourceSearch) { require(constrain>=fset&&constrain<=&(fset[CLL_k]),"tToken: constrain is not a valid set"); } else { require(constrain>=fset&&constrain<=&(fset[LL_k]),"tToken: constrain is not a valid set"); }; constrain = &fset[maxk-k+1]; } #ifdef DBG_TRAV fprintf(stderr, "tToken(%d): %s\n", k, TerminalString(p->token)); if ( ConstrainSearch ) { fprintf(stderr, "constrain is:"); s_fprT(stderr, *constrain); fprintf(stderr, "\n"); } #endif /* is it a meta token (set of tokens)? */ if ( !set_nil(p->tset) ) { unsigned e=0; set a; Tree *n, *tail = NULL; if ( ConstrainSearch ) { a = set_and(p->tset, *constrain); if (set_nil(a)) { /* MR10 */ set_free(a); /* MR11 */ return NULL; /* MR10 */ }; /* MR10 */ } else { a = set_dup(p->tset); }; for (; !set_nil(a); set_rm(e, a)) { e = set_int(a); n = tnode(e); if ( tset==NULL ) { tset = n; tail = n; } else { tail->right = n; tail = n; } } set_free( a ); } else if ( ConstrainSearch && !set_el(p->token, *constrain) ) { /* fprintf(stderr, "ignoring token %s(%d)\n", TerminalString(p->token), k);*/ return NULL; } else { tset = tnode( p->token ); }; /* MR10 */ if (MR_MaintainBackTrace) { /* MR10 */ if (k == 1) { /* MR10 */ MR_pointerStackPush(&MR_BackTraceStack,p); /* MR13 */ if (MR_SuppressSearch) { /* MR13 */ MR_suppressSearchReport(); /* MR13 */ } else { /* MR10 */ MR_backTraceReport(); /* MR13 */ }; /* MR10 */ MR_pointerStackPop(&MR_BackTraceStack); /* MR11 */ Tfree(tset); /* MR11 */ return NULL; /* MR10 */ }; /* MR10 */ }; if ( k == 1 ) return tset; if (MR_MaintainBackTrace) { MR_pointerStackPush(&MR_BackTraceStack,p); }; TRAV(p->next, k-1, rk, t); if (MR_MaintainBackTrace) { Tfree(t); Tfree(tset); MR_pointerStackPop(&MR_BackTraceStack); return NULL; }; /* here, we are positive that, at least, this tree will not contribute * to the LL(2) tree since it will be too shallow, IF t==NULL. * If doing a context guard walk, then don't prune. */ if ( t == NULL && !ContextGuardTRAV ) /* tree will be too shallow */ { if ( tset!=NULL ) Tfree( tset ); return NULL; } #ifdef DBG_TREES fprintf(stderr, "tToken(%d)->next:",k); preorder(t); fprintf(stderr, "\n"); #endif /* if single token root, then just make new tree and return */ /* MR10 - set_nil(p->tset) isn't a good test because of ConstraintSearch */ if (tset->right == NULL) return tmake(tset, t, NULL); /* MR10 */ /* here we must make a copy of t as a child of each element of the tset; * e.g., "T1..T3 A" would yield ( nil ( T1 A ) ( T2 A ) ( T3 A ) ) */ for (u=tset; u!=NULL; u=u->right) { /* make a copy of t and hook it onto bottom of u */ u->down = tdup(t); } Tfree( t ); #ifdef DBG_TREES fprintf(stderr, "range is:"); preorder(tset); fprintf(stderr, "\n"); #endif return tset; } Tree * #ifdef __USE_PROTOS tAction( ActionNode *p, int k, set *rk ) #else tAction( p, k, rk ) ActionNode *p; int k; set *rk; #endif { Tree *t=NULL; set *save_fset=NULL; int i; /* fprintf(stderr, "tAction\n"); */ /* An MR_SuppressSearch is looking for things that can be reached even when the predicate is false. There are three kinds of predicates: plain: r1: <

>? r2 guarded: r1: (A)? => <

>? r2 ampersand style: r1: (A)? && <

>? r2 Of the three kinds of predicates, only a guard predicate has things which are reachable even when the predicate is false. To be reachable the constraint must *not* match the guard. */ if (p->is_predicate && MR_SuppressSearch) { Predicate *pred=p->guardpred; if (pred == NULL) { t=NULL; goto EXIT; }; constrain = &fset[maxk-k+1]; if (pred->k == 1) { set dif; dif=set_dif(*constrain,pred->scontext[1]); if (set_nil(dif)) { set_free(dif); t=NULL; goto EXIT; }; set_free(dif); } else { if (MR_tree_matches_constraints(k,constrain,pred->tcontext)) { t=NULL; goto EXIT; }; } }; /* The ampersand predicate differs from the other predicates because its first set is a subset of the first set behind the predicate r1: (A)? && <

>? r2 ; r2: A | B; In this case first[1] of r1 is A, even though first[1] of r2 is {A B}. */ if (p->is_predicate && p->ampersandPred != NULL) { Predicate *pred=p->ampersandPred; Tree *tAND; Tree *tset; if (k <= pred->k) { if (MR_MaintainBackTrace) MR_pointerStackPush(&MR_BackTraceStack,p); TRAV(p->guardNodes,k,rk,t); if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack); return t; } else { require (k>1,"tAction for ampersandpred: k <= 1"); if (ConstrainSearch) { if (MR_AmbSourceSearch) { require(constrain>=fset&&constrain<=&(fset[CLL_k]), "tToken: constrain is not a valid set"); } else { require(constrain>=fset&&constrain<=&(fset[LL_k]), "tToken: constrain is not a valid set"); }; save_fset=(set *) calloc (CLL_k+1,sizeof(set)); require (save_fset != NULL,"tAction save_fset alloc"); for (i=1; i <= CLL_k ; i++) { save_fset[i]=set_dup(fset[i]); }; if (pred->k == 1) { constrain = &fset[maxk-k+1]; set_andin(constrain,pred->scontext[1]); if (set_nil(*constrain)) { t=NULL; goto EXIT; }; } else { constrain = &fset[maxk-k+1]; if (! MR_tree_matches_constraints(pred->k,constrain,pred->tcontext)) { t=NULL; goto EXIT; }; /* end loop on i */ }; /* end loop on pred scontext/tcontext */ }; /* end if on k > pred->k */ }; /* end if on constrain search */ TRAV(p->next,k,rk,t); if (t != NULL) { t=tshrink(t); t=tflatten(t); t=tleft_factor(t); if (pred->tcontext != NULL) { tAND=MR_computeTreeAND(t,pred->tcontext); } else { tset=MR_make_tree_from_set(pred->scontext[1]); tAND=MR_computeTreeAND(t,tset); Tfree(tset); }; Tfree(t); t=tAND; }; goto EXIT; }; /* end if on ampersand predicate */ TRAV(p->next,k,rk,t); EXIT: if (save_fset != NULL) { for (i=1 ; i <= CLL_k ; i++) { set_free(fset[i]); fset[i]=save_fset[i]; }; free ( (char *) save_fset); }; return t; } /* see if e exists in s as a possible input permutation (e is always a chain) */ int #ifdef __USE_PROTOS tmember( Tree *e, Tree *s ) #else tmember( e, s ) Tree *e; Tree *s; #endif { if ( e==NULL||s==NULL ) return 0; /** fprintf(stderr, "tmember("); *** preorder(e); fprintf(stderr, ","); *** preorder(s); fprintf(stderr, " )\n"); */ if ( s->token == ALT && s->right == NULL ) return tmember(e, s->down); if ( e->token!=s->token ) { if ( s->right==NULL ) return 0; return tmember(e, s->right); } if ( e->down==NULL && s->down == NULL ) return 1; if ( tmember(e->down, s->down) ) return 1; if ( s->right==NULL ) return 0; return tmember(e, s->right); } /* see if e exists in s as a possible input permutation (e is always a chain); * Only check s to the depth of e. In other words, 'e' can be a shorter * sequence than s. */ int #ifdef __USE_PROTOS tmember_constrained( Tree *e, Tree *s) #else tmember_constrained( e, s ) Tree *e; Tree *s; #endif { if ( e==NULL||s==NULL ) return 0; /** fprintf(stderr, "tmember_constrained("); *** preorder(e); fprintf(stderr, ","); *** preorder(s); fprintf(stderr, " )\n"); **/ if ( s->token == ALT && s->right == NULL ) return tmember_constrained(e, s->down); if ( e->token!=s->token ) { if ( s->right==NULL ) return 0; return tmember_constrained(e, s->right); } if ( e->down == NULL ) return 1; /* if s is matched to depth of e return */ if ( tmember_constrained(e->down, s->down) ) return 1; if ( s->right==NULL ) return 0; return tmember_constrained(e, s->right); } /* combine (? (A t) ... (A u) ...) into (? (A t u)) */ Tree * #ifdef __USE_PROTOS tleft_factor( Tree *t ) #else tleft_factor( t ) Tree *t; #endif { Tree *u, *v, *trail, *w; /* left-factor what is at this level */ if ( t == NULL ) return NULL; for (u=t; u!=NULL; u=u->right) { trail = u; v=u->right; while ( v!=NULL ) { if ( u->token == v->token ) { if ( u->down!=NULL ) { for (w=u->down; w->right!=NULL; w=w->right) {;} w->right = v->down; /* link children together */ } else u->down = v->down; trail->right = v->right; /* unlink factored node */ _Tfree( v ); v = trail->right; } else {trail = v; v=v->right;} } } /* left-factor what is below */ for (u=t; u!=NULL; u=u->right) u->down = tleft_factor( u->down ); return t; } /* remove the permutation p from t if present */ Tree * #ifdef __USE_PROTOS trm_perm( Tree *t, Tree *p ) #else trm_perm( t, p ) Tree *t; Tree *p; #endif { /* fprintf(stderr, "trm_perm("); preorder(t); fprintf(stderr, ","); preorder(p); fprintf(stderr, " )\n"); */ if ( t == NULL || p == NULL ) return NULL; if ( t->token == ALT ) { t->down = trm_perm(t->down, p); if ( t->down == NULL ) /* nothing left below, rm cur node */ { Tree *u = t->right; _Tfree( t ); return trm_perm(u, p); } t->right = trm_perm(t->right, p); /* look for more instances of p */ return t; } if ( p->token != t->token ) /* not found, try a sibling */ { t->right = trm_perm(t->right, p); return t; } t->down = trm_perm(t->down, p->down); if ( t->down == NULL ) /* nothing left below, rm cur node */ { Tree *u = t->right; _Tfree( t ); return trm_perm(u, p); } t->right = trm_perm(t->right, p); /* look for more instances of p */ return t; } /* add the permutation 'perm' to the LL_k sets in 'fset' */ void #ifdef __USE_PROTOS tcvt( set *fset, Tree *perm ) #else tcvt( fset, perm ) set *fset; Tree *perm; #endif { if ( perm==NULL ) return; set_orel(perm->token, fset); tcvt(fset+1, perm->down); } /* for each element of ftbl[k], make it the root of a tree with permute(ftbl[k+1]) * as a child. */ Tree * #ifdef __USE_PROTOS permute( int k, int max_k ) #else permute( k, max_k ) int k, max_k; #endif { Tree *t, *u; if ( k>max_k ) return NULL; if ( ftbl[k][findex[k]] == nil ) return NULL; t = permute(k+1, max_k); if ( t==NULL&&k maxk will have to change. */ Tree * #ifdef __USE_PROTOS VerifyAmbig( Junction *alt1, Junction *alt2, unsigned **ft, set *fs, Tree **t, Tree **u, int *numAmbig ) #else VerifyAmbig( alt1, alt2, ft, fs, t, u, numAmbig ) Junction *alt1; Junction *alt2; unsigned **ft; set *fs; Tree **t; Tree **u; int *numAmbig; #endif { set rk; Tree *perm, *ambig=NULL; Junction *p; int k; int tnodes_at_start=TnodesAllocated; int tnodes_at_end; int tnodes_used; set *save_fs; int j; save_fs=(set *) calloc(CLL_k+1,sizeof(set)); require(save_fs != NULL,"save_fs calloc"); for (j=0; j <= CLL_k ; j++) save_fs[j]=set_dup(fs[j]); maxk = LL_k; /* NOTE: for now, we look for LL_k */ ftbl = ft; fset = fs; constrain = &(fset[1]); findex = (int *) calloc(LL_k+1, sizeof(int)); if ( findex == NULL ) { fprintf(stderr, ErrHdr, FileStr[CurAmbigfile], CurAmbigline); fprintf(stderr, " out of memory while analyzing alts %d and %d of %s\n", CurAmbigAlt1, CurAmbigAlt2, CurAmbigbtype); exit(PCCTS_EXIT_FAILURE); } for (k=1; k<=LL_k; k++) findex[k] = 0; rk = empty; ConstrainSearch = 1; /* consider only tokens in ambig sets */ p = analysis_point((Junction *)alt1->p1); TRAV(p, LL_k, &rk, *t); *t = tshrink( *t ); *t = tflatten( *t ); *t = tleft_factor( *t ); /* MR10 */ *t = prune(*t, LL_k); *t = tleft_factor( *t ); /*** fprintf(stderr, "after shrink&flatten&prune&left_factor:"); preorder(*t); fprintf(stderr, "\n");*/ if ( *t == NULL ) { /*** fprintf(stderr, "TreeIncomplete --> no LL(%d) ambiguity\n", LL_k);*/ Tfree( *t ); /* kill if impossible to have ambig */ *t = NULL; } p = analysis_point((Junction *)alt2->p1); TRAV(p, LL_k, &rk, *u); *u = tshrink( *u ); *u = tflatten( *u ); *t = tleft_factor( *t ); /* MR10 */ *u = prune(*u, LL_k); *u = tleft_factor( *u ); /* fprintf(stderr, "after shrink&flatten&prune&lfactor:"); preorder(*u); fprintf(stderr, "\n");*/ if ( *u == NULL ) { /* fprintf(stderr, "TreeIncomplete --> no LL(%d) ambiguity\n", LL_k);*/ Tfree( *u ); *u = NULL; } for (k=1; k<=LL_k; k++) set_clr( fs[k] ); ambig = tnode(ALT); k = 0; if ( *t!=NULL && *u!=NULL ) { while ( (perm=permute(1,LL_k))!=NULL ) { /* fprintf(stderr, "chk perm:"); preorder(perm); fprintf(stderr, "\n");*/ if ( tmember(perm, *t) && tmember(perm, *u) ) { /* fprintf(stderr, "ambig upon"); preorder(perm); fprintf(stderr, "\n");*/ k++; perm->right = ambig->down; ambig->down = perm; tcvt(&(fs[1]), perm); } else Tfree( perm ); } } for (j=0; j <= CLL_k ; j++) fs[j]=save_fs[j]; free( (char *) save_fs); tnodes_at_end=TnodesAllocated; tnodes_used=tnodes_at_end - tnodes_at_start; if (TnodesReportThreshold > 0 && tnodes_used > TnodesReportThreshold) { fprintf(stdout,"There were %d tuples whose ambiguity could not be resolved by full lookahead\n",k); fprintf(stdout,"There were %d tnodes created to resolve ambiguity between:\n\n",tnodes_used); fprintf(stdout," Choice 1: %s line %d file %s\n", MR_ruleNamePlusOffset( (Node *) alt1),alt1->line,FileStr[alt1->file]); fprintf(stdout," Choice 2: %s line %d file %s\n", MR_ruleNamePlusOffset( (Node *) alt2),alt2->line,FileStr[alt2->file]); for (j=1; j <= CLL_k ; j++) { fprintf(stdout,"\n Intersection of lookahead[%d] sets:\n",j); MR_dumpTokenSet(stdout,2,fs[j]); }; fprintf(stdout,"\n"); }; *numAmbig = k; if ( ambig->down == NULL ) {_Tfree(ambig); ambig = NULL;} free( (char *)findex ); /* fprintf(stderr, "final ambig:"); preorder(ambig); fprintf(stderr, "\n");*/ return ambig; } static Tree * #ifdef __USE_PROTOS bottom_of_chain( Tree *t ) #else bottom_of_chain( t ) Tree *t; #endif { if ( t==NULL ) return NULL; for (; t->down != NULL; t=t->down) {;} return t; } /* * Make a tree from k sets where the degree of the first k-1 sets is 1. */ Tree * #ifdef __USE_PROTOS make_tree_from_sets( set *fset1, set *fset2 ) #else make_tree_from_sets( fset1, fset2 ) set *fset1; set *fset2; #endif { set inter; int i; Tree *t=NULL, *n, *u; unsigned *p,*q; require(LL_k>1, "make_tree_from_sets: LL_k must be > 1"); /* do the degree 1 sets first */ for (i=1; i<=LL_k-1; i++) { inter = set_and(fset1[i], fset2[i]); require(set_deg(inter)==1, "invalid set to tree conversion"); n = tnode(set_int(inter)); if (t==NULL) t=n; else tmake(t, n, NULL); set_free(inter); } /* now add the chain of tokens at depth k */ u = bottom_of_chain(t); inter = set_and(fset1[LL_k], fset2[LL_k]); if ( (q=p=set_pdq(inter)) == NULL ) fatal_internal("Can't alloc space for set_pdq"); /* first one is linked to bottom, then others are sibling linked */ n = tnode(*p++); u->down = n; u = u->down; while ( *p != nil ) { n = tnode(*p); u->right = n; u = u->right; p++; } free((char *)q); return t; } /* create and return the tree of lookahead k-sequences that are in t, but not * in the context of predicates in predicate list p. */ Tree * #ifdef __USE_PROTOS tdif( Tree *ambig_tuples, Predicate *p, set *fset1, set *fset2 ) #else tdif( ambig_tuples, p, fset1, fset2 ) Tree *ambig_tuples; Predicate *p; set *fset1; set *fset2; #endif { unsigned **ft; Tree *dif=NULL; Tree *perm; set b; int i,k; if ( p == NULL ) return tdup(ambig_tuples); ft = (unsigned **) calloc(CLL_k+1, sizeof(unsigned *)); require(ft!=NULL, "cannot allocate ft"); for (i=1; i<=CLL_k; i++) { b = set_and(fset1[i], fset2[i]); ft[i] = set_pdq(b); set_free(b); } findex = (int *) calloc(LL_k+1, sizeof(int)); if ( findex == NULL ) { fatal_internal("out of memory in tdif while checking predicates"); } for (k=1; k<=LL_k; k++) findex[k] = 0; #ifdef DBG_TRAV fprintf(stderr, "tdif_%d[", p->k); preorder(ambig_tuples); fprintf(stderr, ","); preorder(p->tcontext); fprintf(stderr, "] ="); #endif ftbl = ft; while ( (perm=permute(1,p->k))!=NULL ) { #ifdef DBG_TRAV fprintf(stderr, "test perm:"); preorder(perm); fprintf(stderr, "\n"); #endif if ( tmember_constrained(perm, ambig_tuples) && !tmember_of_context(perm, p) ) { #ifdef DBG_TRAV fprintf(stderr, "satisfied upon"); preorder(perm); fprintf(stderr, "\n"); #endif k++; if ( dif==NULL ) dif = perm; else { perm->right = dif; dif = perm; } } else Tfree( perm ); } #ifdef DBG_TRAV preorder(dif); fprintf(stderr, "\n"); #endif for (i=1; i<=CLL_k; i++) free( (char *)ft[i] ); free((char *)ft); free((char *)findex); return dif; } /* is lookahead sequence t a member of any context tree for any * predicate in p? */ static int #ifdef __USE_PROTOS tmember_of_context( Tree *t, Predicate *p ) #else tmember_of_context( t, p ) Tree *t; Predicate *p; #endif { for (; p!=NULL; p=p->right) { if ( p->expr==PRED_AND_LIST || p->expr==PRED_OR_LIST ) return tmember_of_context(t, p->down); if ( tmember_constrained(t, p->tcontext) ) return 1; if ( tmember_of_context(t, p->down) ) return 1; } return 0; } int #ifdef __USE_PROTOS is_single_tuple( Tree *t ) #else is_single_tuple( t ) Tree *t; #endif { if ( t == NULL ) return 0; if ( t->right != NULL ) return 0; if ( t->down == NULL ) return 1; return is_single_tuple(t->down); } /* MR10 Check that a context guard contains only allowed things */ /* MR10 (mainly token references). */ #ifdef __USE_PROTOS int contextGuardOK(Node *p,int h,int *hmax) #else int contextGuardOK(p,h,hmax) Node *p; int h; int *hmax; #endif { Junction *j; TokNode *tn; if (p == NULL) return 1; if (p->ntype == nToken) { h++; if (h > *hmax) *hmax=h; tn=(TokNode *)p; if (tn->el_label != NULL) { warnFL(eMsg1("a label (\"%s\") for a context guard element is meaningless",tn->el_label), FileStr[p->file],p->line); }; return contextGuardOK( ( (TokNode *) p)->next,h,hmax); } else if (p->ntype == nAction) { goto Fail; } else if (p->ntype == nRuleRef) { goto Fail; } else { require (p->ntype == nJunction,"Unexpected ntype"); j=(Junction *) p; if (j->jtype != Generic && j->jtype != aSubBlk && /* pretty sure this one is allowed */ /**** j->jtype != aOptBlk && ****/ /* pretty sure this one is allowed */ /* MR11 not any more ! */ j->jtype != EndBlk) { errFL("A context guard may not contain an option block: {...} or looping block: (...)* or (...)+", FileStr[p->file],p->line); contextGuardOK(j->p1,h,hmax); return 0; }; /* do both p1 and p2 so use | rather than || */ return contextGuardOK(j->p2,h,hmax) | contextGuardOK(j->p1,h,hmax); }; Fail: errFL("A context guard may contain only Token references - guard will be ignored", FileStr[p->file],p->line); contextGuardOK( ( (ActionNode *) p)->next,h,hmax); return 0; } /* * Look at a (...)? generalized-predicate context-guard and compute * either a lookahead set (k==1) or a lookahead tree for k>1. The * k level is determined by the guard itself rather than the LL_k * variable. For example, ( A B )? is an LL(2) guard and ( ID )? * is an LL(1) guard. For the moment, you can only have a single * tuple in the guard. Physically, the block must look like this * --o-->TOKEN-->o-->o-->TOKEN-->o-- ... -->o-->TOKEN-->o-- * An error is printed for any other type. */ Predicate * #ifdef __USE_PROTOS computePredFromContextGuard(Graph blk,int *msgDone) /* MR10 */ #else computePredFromContextGuard(blk,msgDone) /* MR10 */ Graph blk; int *msgDone; /* MR10 */ #endif { Junction *junc = (Junction *)blk.left, *p; Tree *t=NULL; Predicate *pred = NULL; set scontext, rk; int ok; int hmax=0; require(junc!=NULL && junc->ntype == nJunction, "bad context guard"); /* MR10 Check for anything other than Tokens and generic junctions */ *msgDone=0; /* MR10 */ ok=contextGuardOK( (Node *)junc,0,&hmax); /* MR10 */ if (! ok) { /* MR10 */ *msgDone=1; /* MR10 */ return NULL; /* MR10 */ }; /* MR10 */ if (hmax == 0) { errFL("guard is 0 tokens long",FileStr[junc->file],junc->line); /* MR11 */ *msgDone=1; return NULL; }; if (hmax > CLL_k) { /* MR10 */ errFL(eMsgd2("guard is %d tokens long - lookahead is limited to max(k,ck)==%d", /* MR10 */ hmax,CLL_k), /* MR10 */ FileStr[junc->file],junc->line); /* MR10 */ *msgDone=1; /* MR10 */ return NULL; /* MR10 */ }; /* MR10 */ rk = empty; p = junc; pred = new_pred(); pred->k = hmax; /* MR10 should be CLL_k, not LLK ? */ if (hmax > 1 ) /* MR10 was LL_k */ { ConstrainSearch = 0; ContextGuardTRAV = 1; TRAV(p, hmax, &rk, t); /* MR10 was LL_k */ ContextGuardTRAV = 0; set_free(rk); t = tshrink( t ); t = tflatten( t ); t = tleft_factor( t ); /* fprintf(stderr, "ctx guard:"); preorder(t); fprintf(stderr, "\n"); */ pred->tcontext = t; } else { REACH(p, 1, &rk, scontext); require(set_nil(rk), "rk != nil"); set_free(rk); /* fprintf(stderr, "LL(1) ctx guard is:"); s_fprT(stderr, scontext); fprintf(stderr, "\n"); */ pred->scontext[1] = scontext; } list_add(&ContextGuardPredicateList,pred); /* MR13 */ return pred; } /* MR13 When the context guard is originally computed the meta-tokens are not known. */ #ifdef __USE_PROTOS void recomputeContextGuard(Predicate *pred) #else void recomputeContextGuard(pred) Predicate *pred; #endif { Tree * t=NULL; set scontext; set rk; ActionNode * actionNode; Junction * p; actionNode=pred->source; require (actionNode != NULL,"context predicate's source == NULL"); p=actionNode->guardNodes; require (p != NULL,"context predicate's guardNodes == NULL"); rk = empty; if (pred->k > 1 ) { ConstrainSearch = 0; ContextGuardTRAV = 1; TRAV(p, pred->k, &rk, t); ContextGuardTRAV = 0; set_free(rk); t = tshrink( t ); t = tflatten( t ); t = tleft_factor( t ); Tfree(pred->tcontext); pred->tcontext = t; } else { REACH(p, 1, &rk, scontext); require(set_nil(rk), "rk != nil"); set_free(rk); set_free(pred->scontext[1]); pred->scontext[1] = scontext; } } /* MR11 - had enough of flags yet ? */ int MR_AmbSourceSearch=0; int MR_AmbSourceSearchGroup=0; int MR_AmbSourceSearchChoice=0; int MR_AmbSourceSearchLimit=0; int MR_matched_AmbAidRule=0; static set *matchSets[2]={NULL,NULL}; static int *tokensInChain=NULL; static Junction *MR_AmbSourceSearchJ[2]; void MR_traceAmbSourceKclient() { int i; set *save_fset; int save_ConstrainSearch; set incomplete; Tree *t; if (matchSets[0] == NULL) { matchSets[0]=(set *) calloc (CLL_k+1,sizeof(set)); require (matchSets[0] != NULL,"matchSets[0] alloc"); matchSets[1]=(set *) calloc (CLL_k+1,sizeof(set)); require (matchSets[1] != NULL,"matchSets[1] alloc"); }; for (i=1 ; i <= MR_AmbSourceSearchLimit ; i++) { set_clr(matchSets[0][i]); set_orel( (unsigned) tokensInChain[i], &matchSets[0][i]); set_clr(matchSets[1][i]); set_orel( (unsigned) tokensInChain[i], &matchSets[1][i]); }; save_fset=fset; save_ConstrainSearch=ConstrainSearch; for (i=0 ; i < 2 ; i++) { #if 0 ** fprintf(stdout," Choice:%d Depth:%d ",i+1,MR_AmbSourceSearchLimit); ** fprintf(stdout,"("); ** for (j=1 ; j <= MR_AmbSourceSearchLimit ; j++) { ** if (j != 1) fprintf(stdout," "); ** fprintf(stdout,"%s",TerminalString(tokensInChain[j])); ** }; ** fprintf(stdout,")\n\n"); #endif fset=matchSets[i]; MR_AmbSourceSearch=1; MR_MaintainBackTrace=1; MR_AmbSourceSearchChoice=i; ConstrainSearch=1; maxk = MR_AmbSourceSearchLimit; incomplete=empty; t=NULL; constrain = &(fset[1]); MR_pointerStackReset(&MR_BackTraceStack); TRAV(MR_AmbSourceSearchJ[i],maxk,&incomplete,t); Tfree(t); require (set_nil(incomplete),"MR_traceAmbSourceK TRAV incomplete"); require (MR_BackTraceStack.count == 0,"K: MR_BackTraceStack.count != 0"); set_free(incomplete); }; ConstrainSearch=save_ConstrainSearch; fset=save_fset; MR_AmbSourceSearch=0; MR_MaintainBackTrace=0; MR_AmbSourceSearchChoice=0; } #ifdef __USE_PROTOS Tree *tTrunc(Tree *t,int depth) #else Tree *tTrunc(t,depth) Tree *t; #endif { Tree *u; require ( ! (t == NULL && depth > 0),"tree too short"); if (depth == 0) return NULL; if (t->token == ALT) { u=tTrunc(t->down,depth); } else { u=tnode(t->token); u->down=tTrunc(t->down,depth-1); }; if (t->right != NULL) u->right=tTrunc(t->right,depth); return u; } #ifdef __USE_PROTOS void MR_iterateOverTree(Tree *t,int chain[]) #else void MR_iterateOverTree(t,chain) Tree *t; int chain[]; #endif { if (t == NULL) return; chain[0]=t->token; if (t->down != NULL) { MR_iterateOverTree(t->down,&chain[1]); } else { MR_traceAmbSourceKclient(); }; MR_iterateOverTree(t->right,&chain[0]); chain[0]=0; } #ifdef __USE_PROTOS void MR_traceAmbSourceK(Tree *t,Junction *alt1,Junction *alt2) #else void MR_traceAmbSourceK(t,alt1,alt2) Tree *t; Junction *alt1; Junction *alt2; #endif { int i; int depth; int maxDepth; Tree *truncatedTree; if (MR_AmbAidRule == NULL) return; if ( ! ( strcmp(MR_AmbAidRule,alt1->rname) == 0 || strcmp(MR_AmbAidRule,alt2->rname) == 0 || MR_AmbAidLine==alt1->line || MR_AmbAidLine==alt2->line ) ) return; MR_matched_AmbAidRule++; /* there are no token sets in trees, only in TokNodes */ MR_AmbSourceSearchJ[0]=analysis_point( (Junction *) alt1->p1); MR_AmbSourceSearchJ[1]=analysis_point( (Junction *) alt2->p1); if (tokensInChain == NULL) { tokensInChain=(int *) calloc (CLL_k+1,sizeof(int)); require (tokensInChain != NULL,"tokensInChain alloc"); }; MR_AmbSourceSearchGroup=0; fprintf(stdout,"\n"); fprintf(stdout," Ambiguity Aid "); fprintf(stdout, (MR_AmbAidDepth <= LL_k ? "(-k %d -aa %s %s -aad %d)\n\n" : "(-k %d -aa %s %s [-k value limits -aad %d])\n\n"), LL_k, MR_AmbAidRule, (MR_AmbAidMultiple ? "-aam" : ""), MR_AmbAidDepth); for (i=0 ; i < 2 ; i++) { fprintf(stdout," Choice %d: %-25s line %d file %s\n", (i+1), MR_ruleNamePlusOffset( (Node *) MR_AmbSourceSearchJ[i]), MR_AmbSourceSearchJ[i]->line, FileStr[MR_AmbSourceSearchJ[i]->file]); }; fprintf(stdout,"\n"); if (MR_AmbAidDepth < LL_k) { maxDepth=MR_AmbAidDepth; } else { maxDepth=LL_k; }; for (depth=1 ; depth <= maxDepth; depth++) { MR_AmbSourceSearchLimit=depth; if (depth < LL_k) { truncatedTree=tTrunc(t,depth); truncatedTree=tleft_factor(truncatedTree); MR_iterateOverTree(truncatedTree,&tokensInChain[1]); /* <===== */ Tfree(truncatedTree); } else { MR_iterateOverTree(t,tokensInChain); /* <===== */ }; fflush(stdout); fflush(stderr); }; fprintf(stdout,"\n"); MR_AmbSourceSearch=0; MR_MaintainBackTrace=0; MR_AmbSourceSearchGroup=0; MR_AmbSourceSearchChoice=0; MR_AmbSourceSearchLimit=0; } /* this if for k=1 grammars only this is approximate only because of the limitations of linear approximation lookahead. Don't want to do a k=3 search when the user only specified a ck=3 grammar */ #ifdef __USE_PROTOS void MR_traceAmbSource(set *matchSets,Junction *alt1, Junction *alt2) #else void MR_traceAmbSource(matchSets,alt1,alt2) set *matchSets; Junction *alt1; Junction *alt2; #endif { set *save_fset; Junction *p[2]; int i; int j; set *dup_matchSets; set intersection; set incomplete; set tokensUsed; int depth; if (MR_AmbAidRule == NULL) return; if ( ! ( strcmp(MR_AmbAidRule,alt1->rname) == 0 || strcmp(MR_AmbAidRule,alt2->rname) == 0 || MR_AmbAidLine==alt1->line || MR_AmbAidLine==alt2->line ) ) return; MR_matched_AmbAidRule++; save_fset=fset; dup_matchSets=(set *) calloc(CLL_k+1,sizeof(set)); require (dup_matchSets != NULL,"Can't allocate dup_matchSets"); p[0]=analysis_point( (Junction *) alt1->p1); p[1]=analysis_point( (Junction *) alt2->p1); fprintf(stdout,"\n"); fprintf(stdout," Ambiguity Aid "); fprintf(stdout, (MR_AmbAidDepth <= CLL_k ? "(-ck %d -aa %s %s -aad %d)\n\n" : "(-ck %d -aa %s %s [-ck value limits -aad %d])\n\n"), CLL_k, MR_AmbAidRule, (MR_AmbAidMultiple ? "-aam" : ""), MR_AmbAidDepth); for (i=0 ; i < 2 ; i++) { fprintf(stdout," Choice %d: %-25s line %d file %s\n", (i+1), MR_ruleNamePlusOffset( (Node *) p[i]), p[i]->line,FileStr[p[i]->file]); }; for (j=1; j <= CLL_k ; j++) { fprintf(stdout,"\n Intersection of lookahead[%d] sets:\n",j); intersection=set_and(alt1->fset[j],alt2->fset[j]); MR_dumpTokenSet(stdout,2,intersection); set_free(intersection); }; fprintf(stdout,"\n"); require (1 <= MR_AmbAidDepth && MR_AmbAidDepth <= CLL_k, "illegal MR_AmbAidDepth"); MR_AmbSourceSearchGroup=0; for (depth=1; depth <= MR_AmbAidDepth; depth++) { MR_AmbSourceSearchLimit=depth; for (i=0 ; i < 2 ; i++) { /*** fprintf(stdout," Choice:%d Depth:%d\n\n",i+1,depth); ***/ for (j=0 ; j <= CLL_k ; j++) { dup_matchSets[j]=set_dup(matchSets[j]); }; fset=dup_matchSets; fflush(output); fflush(stdout); MR_AmbSourceSearch=1; MR_MaintainBackTrace=1; MR_AmbSourceSearchChoice=i; maxk = depth; tokensUsed=empty; incomplete=empty; constrain = &(fset[1]); MR_pointerStackReset(&MR_BackTraceStack); REACH(p[i],depth,&incomplete,tokensUsed); fflush(output); fflush(stdout); require (set_nil(incomplete),"MR_traceAmbSource REACH incomplete"); require (MR_BackTraceStack.count == 0,"1: MR_BackTraceStack.count != 0"); set_free(incomplete); set_free(tokensUsed); for (j=0 ; j <= CLL_k ; j++) { set_free(dup_matchSets[j]); }; }; }; fprintf(stdout,"\n"); MR_AmbSourceSearch=0; MR_MaintainBackTrace=0; MR_AmbSourceSearchGroup=0; MR_AmbSourceSearchChoice=0; MR_AmbSourceSearchLimit=0; fset=save_fset; free ( (char *) dup_matchSets); } static int itemCount; void MR_backTraceDumpItemReset() { itemCount=0; } #ifdef __USE_PROTOS void MR_backTraceDumpItem(FILE *f,int skip,Node *n) #else void MR_backTraceDumpItem(f,skip,n) FILE *f; int skip; Node *n; #endif { TokNode *tn; RuleRefNode *rrn; Junction *j; ActionNode *a; switch (n->ntype) { case nToken: itemCount++; if (skip) goto EXIT; tn=(TokNode *)n; if (set_nil(tn->tset)) { fprintf(f," %2d #token %-23s",itemCount,TerminalString(tn->token)); } else { fprintf(f," %2d #tokclass %-20s",itemCount,TerminalString(tn->token)); }; break; case nRuleRef: itemCount++; if (skip) goto EXIT; rrn=(RuleRefNode *)n; fprintf(f," %2d to %-27s",itemCount,rrn->text); break; case nAction: a=(ActionNode *)n; goto EXIT; case nJunction: j=(Junction *)n; switch (j->jtype) { case aSubBlk: if (j->guess) { itemCount++; if (skip) goto EXIT; fprintf(f," %2d %-30s",itemCount,"in (...)? block at"); break; }; /****** fprintf(f," %2d %-32s",itemCount,"in (...) block at"); *******/ /****** break; *******/ goto EXIT; case aOptBlk: itemCount++; if (skip) goto EXIT; fprintf(f," %2d %-30s",itemCount,"in {...} block"); break; case aLoopBlk: itemCount++; if (skip) goto EXIT; fprintf(f," %2d %-30s",itemCount,"in (...)* block"); break; case EndBlk: if (j->alpha_beta_guess_end) { itemCount++; if (skip) goto EXIT; fprintf(f," %2d %-30s",itemCount,"end (...)? block at"); break; }; goto EXIT; /****** fprintf(f," %2d %-32s",itemCount,"end of a block at"); *****/ /****** break; *****/ case RuleBlk: itemCount++; if (skip) goto EXIT; fprintf(f," %2d %-30s",itemCount,j->rname); break; case Generic: goto EXIT; case EndRule: itemCount++; if (skip) goto EXIT; fprintf (f," %2d end %-26s",itemCount,j->rname); break; case aPlusBlk: itemCount++; if (skip) goto EXIT; fprintf(f," %2d %-30s",itemCount,"in (...)+ block"); break; case aLoopBegin: goto EXIT; }; break; }; fprintf(f," %-23s line %-4d %s\n",MR_ruleNamePlusOffset(n),n->line,FileStr[n->file]); EXIT: return; } static PointerStack previousBackTrace={0,0,NULL}; #ifdef __USE_PROTOS void MR_backTraceReport(void) #else void MR_backTraceReport() #endif { int i; int match = 0; int limitMatch; Node *p; TokNode *tn; set remainder; int depth; /* Even when doing a k=2 search this routine can get called when there is only 1 token on the stack. This is because something like rRuleRef can change the search value of k from 2 to 1 temporarily. It does this because the it wants to know the k=1 first set before it does a k=2 search */ depth=0; for (i=0; i < MR_BackTraceStack.count ; i++) { p=(Node *) MR_BackTraceStack.data[i]; if (p->ntype == nToken) depth++; }; /* MR14 */ if (MR_AmbSourceSearch) { /* MR14 */ require (depth <= MR_AmbSourceSearchLimit,"depth > MR_AmbSourceSearchLimit"); /* MR14 */ } /* MR23 THM - Traceback report was being called at the wrong time for -alpha reports */ /* Reported by Arpad Beszedes (beszedes@inf.u-szeged.hu) */ if (MR_AmbSourceSearchLimit == 0 || depth < MR_AmbSourceSearchLimit) { return; }; MR_backTraceDumpItemReset(); limitMatch=MR_BackTraceStack.count; if (limitMatch > previousBackTrace.count) { limitMatch=previousBackTrace.count; }; for (match=0; match < limitMatch; match++) { if (MR_BackTraceStack.data[match] != previousBackTrace.data[match]) { break; }; }; /* not sure at the moment why there would be duplicates */ if (match != MR_BackTraceStack.count) { fprintf(stdout," Choice:%d Depth:%d Group:%d", (MR_AmbSourceSearchChoice+1), MR_AmbSourceSearchLimit, ++MR_AmbSourceSearchGroup); depth=0; fprintf(stdout," ("); for (i=0; i < MR_BackTraceStack.count ; i++) { p=(Node *) MR_BackTraceStack.data[i]; if (p->ntype != nToken) continue; tn=(TokNode *)p; if (depth != 0) fprintf(stdout," "); fprintf(stdout,"%s",TerminalString(tn->token)); depth++; if (! MR_AmbAidMultiple) { if (set_nil(tn->tset)) { set_rm( (unsigned) tn->token,fset[depth]); } else { remainder=set_dif(fset[depth],tn->tset); set_free(fset[depth]); fset[depth]=remainder; }; }; }; fprintf(stdout,")\n"); for (i=0; i < MR_BackTraceStack.count ; i++) { MR_backTraceDumpItem(stdout, (i #include "pcctscfg.h" #include "stdpccts.h" #define MAX_INT_STACK 50 static int istack[MAX_INT_STACK]; /* Int stack */ static int isp = MAX_INT_STACK; static int DontAcceptFiles = 0; /* if stdin, don't read files */ static int DontAcceptStdin = 0; /* if files seen first, don't accept stdin */ static int tnodes_used_in_guard_predicates_etc; /* MR10 */ /* C m d - L i n e O p t i o n S t r u c t & F u n c s */ typedef struct _Opt { char *option; int arg; #ifdef __cplusplus void (*process)(...); #else void (*process)(); #endif char *descr; } Opt; #ifdef __USE_PROTOS extern void ProcessArgs(int, char **, Opt *); #else extern void ProcessArgs(); #endif #ifdef __USE_PROTOS int ci_strequ(char *a,char *b) #else int ci_strequ(a,b) char *a; char *b; #endif { for ( ;*a != 0 && *b != 0; a++, b++) { if (toupper(*a) != toupper(*b)) return 0; } return (*a == *b); } static void #ifdef __USE_PROTOS pStdin( void ) #else pStdin( ) #endif { if ( DontAcceptStdin ) { warnNoFL("'-' (stdin) ignored as files were specified first"); return; } require(NumFiles 8 ) { /* MR6 */ warnNoFL("tab width must be between 1 and 8"); /* MR6 */ TabWidth=0; /* MR6 */ } /* MR6 */ } /* MR6 */ static int ambAidDepthSpecified=0; /* MR11 */ static void /* MR11 */ #ifdef __USE_PROTOS pAAd( char *s, char *t ) /* MR11 */ #else pAAd( s, t ) /* MR11 */ char *s; /* MR11 */ char *t; /* MR11 */ #endif { /* MR11 */ ambAidDepthSpecified=1; /* MR11 */ MR_AmbAidDepth = atoi(t); /* MR11 */ } /* MR11 */ static void /* MR11 */ #ifdef __USE_PROTOS pTreport( char *s, char *t ) /* MR11 */ #else pTreport( s, t ) /* MR11 */ char *s; /* MR11 */ char *t; /* MR11 */ #endif { /* MR11 */ TnodesReportThreshold = atoi(t); /* MR11 */ } /* MR11 */ #ifdef __USE_PROTOS void chkGTFlag(void) /* 7-Apr-97 MR1 */ #else void chkGTFlag() /* 7-Apr-97 MR1 */ #endif { if ( !GenAST ) warn("#-variable or other AST item referenced w/o -gt option"); } #ifdef __USE_PROTOS static void pInfo(char *s, char *t) /* MR10 */ #else static void pInfo(s,t) /* MR10 */ char *s; char *t; #endif { char *p; int q; for (p=t; *p != 0; p++) { q=tolower(*p); if (q=='t') { InfoT=1; } else if (q=='p') { InfoP=1; } else if (q=='m') { InfoM=1; } else if (q=='o') { InfoO=1; } else if (q=='0') { ; /* nothing */ } else if (q=='f') { InfoF=1; } else { warnNoFL(eMsgd("unrecognized -info option \"%c\"",(int)*p)); }; }; } #ifdef __USE_PROTOS static void pCGen(void) { CodeGen = FALSE; LexGen = FALSE; } static void pLGen(void) { LexGen = FALSE; } static void pXTGen(void){ MR_Inhibit_Tokens_h_Gen = TRUE; } static void pTGen(void) { TraceGen = TRUE; } static void pSGen(void) { GenExprSetsOpt = FALSE; } static void pPrt(void) { PrintOut = TRUE; pCGen(); pLGen(); } static void pPrtA(void) { PrintOut = TRUE; PrintAnnotate = TRUE; pCGen(); pLGen(); } static void pAst(void) { GenAST = TRUE; } static void pANSI(void) { GenANSI = TRUE; } static void pCr(void) { GenCR = TRUE; } static void pNOPURIFY(void) { PURIFY = FALSE; } /*static void pCt(void) { warnNoFL("-ct option is now the default"); }*/ static void pLI(void) { GenLineInfo = TRUE; GenLineInfoMS = FALSE; } /* MR14 */ static void pLIms(void) { GenLineInfo = TRUE; GenLineInfoMS = TRUE; } /* MR14 */ static void pFr(char *s, char *t) {RemapFileName = t;} static void pFe(char *s, char *t) {ErrFileName = t;} static void pFl(char *s, char *t) {DlgFileName = t;} static void pFm(char *s, char *t) {ModeFileName = t;} static void pFt(char *s, char *t) {DefFileName = t;} static void pE1(void) { elevel = 1; } static void pE2(void) { elevel = 2; } static void pE3(void) { elevel = 3; } static void pEGen(void) { GenEClasseForRules = 1; } static void pDL(void) { DemandLookahead = 1; if ( GenCC ) { warnNoFL("-gk does not work currently in C++ mode; -gk turned off"); DemandLookahead = 0; } } static void pAA(char *s,char *t) {MR_AmbAidRule = t;} /* MR11 */ static void pAAm(char *s){MR_AmbAidMultiple = 1;} /* MR11 */ static void pGHdr(void) { GenStdPccts = 1; } static void pFHdr(char *s, char *t) { stdpccts = t; pGHdr(); } static void pW1(void) { WarningLevel = 1; } static void pNewAST(void) { NewAST = 1; } /* MR13 */ static void ptmakeInParser(void) { tmakeInParser = 1; } /* MR23 */ static void pAlpha(void) { AlphaBetaTrace = 1; } /* MR14 */ static void pMR_BlkErr(void) { MR_BlkErr = 1; } /* MR21 */ static void pStdout(void) {UseStdout = 1; } /* MR6 */ static void pW2(void) { WarningLevel = 2; } static void pCC(void) { GenCC = TRUE; } #else static void pCGen() { CodeGen = FALSE; LexGen = FALSE; } static void pLGen() { LexGen = FALSE; } static void pXTGen(){ MR_Inhibit_Tokens_h_Gen = TRUE; } /* MR14 */ static void pTGen() { TraceGen = TRUE; } static void pSGen() { GenExprSetsOpt = FALSE; } static void pPrt() { PrintOut = TRUE; pCGen(); pLGen(); } static void pPrtA() { PrintOut = TRUE; PrintAnnotate = TRUE; pCGen(); pLGen(); } static void pAst() { GenAST = TRUE; } static void pANSI() { GenANSI = TRUE; } static void pCr() { GenCR = TRUE; } static void pNOPURIFY() { PURIFY = FALSE; } /*static void pCt() { warnNoFL("-ct option is now the default"); }*/ static void pLI() { GenLineInfo = TRUE; GenLineInfoMS = FALSE; } /* MR14 */ static void pLIms() { GenLineInfo = TRUE; GenLineInfoMS = TRUE; } /* MR14 */ static void pFr(s,t) char *s, *t; {RemapFileName = t;} static void pFe(s,t) char *s, *t; {ErrFileName = t;} static void pFl(s,t) char *s, *t; {DlgFileName = t;} static void pFm(s,t) char *s, *t; {ModeFileName = t;} static void pFt(s,t) char *s, *t; {DefFileName = t;} static void pE1() { elevel = 1; } static void pE2() { elevel = 2; } static void pE3() { elevel = 3; } static void pEGen() { GenEClasseForRules = 1; } static void pDL() { DemandLookahead = 1; if ( GenCC ) { warnNoFL("-gk does not work currently in C++ mode; -gk turned off"); DemandLookahead = 0; } } static void pAA(s,t) char *s; char *t; {MR_AmbAidRule = t;} /* MR11 BJS 20-Mar-98 */ static void pAAm(s) char *s; {MR_AmbAidMultiple = 1;} /* MR11 BJS 20-Mar-98 */ static void pGHdr() { GenStdPccts = 1; } static void pFHdr(s,t) char *s, *t; { stdpccts = t; pGHdr(); } static void pW1() { WarningLevel = 1; } static void pNewAST() { NewAST = 1; } /* MR13 */ static void ptmakeInParser() { tmakeInParser = 1; } /* MR23 */ static void pAlpha() { AlphaBetaTrace = 1; } /* MR14 */ static void pMR_BlkErr() { MR_BlkErr = 1; } /* MR21 */ static void pStdout() {UseStdout = 1; } /* MR6 */ static void pW2() { WarningLevel = 2; } static void pCC() { GenCC = TRUE; } #endif static void #ifdef __USE_PROTOS pPre( char *s, char *t ) #else pPre( s, t ) char *s; char *t; #endif { RulePrefix = t; } static void #ifdef __USE_PROTOS pOut( char *s, char *t ) #else pOut( s, t ) char *s; char *t; #endif { OutputDirectory = t; } static void #ifdef __USE_PROTOS pPred( void ) #else pPred( ) #endif { warnNoFL("-pr is no longer used (predicates employed if present); see -prc, -mrhoist, -mrhoistk"); /* ** if ( DemandLookahead ) ** warnNoFL("-gk conflicts with -pr; -gk turned off"); ** DemandLookahead = 0; ** HoistPredicateContext = 0; */ } static void #ifdef __USE_PROTOS pPredCtx( char *s, char *t ) #else pPredCtx(s,t) char *s; char *t; #endif { if ( ci_strequ(t,"on")) HoistPredicateContext = 1; else if ( ci_strequ(t,"off")) HoistPredicateContext = 0; if ( DemandLookahead ) { warnNoFL("-gk incompatible with semantic predicate usage; -gk turned off"); DemandLookahead = 0; } } static void #ifdef __USE_PROTOS pMRhoist( char *s, char *t ) #else pMRhoist(s,t) char *s; char *t; #endif { if ( ci_strequ(t,"on")) MRhoisting = 1; else if ( ci_strequ(t,"off")==0 ) MRhoisting = 0; if (MRhoisting) { fprintf(stderr,"Maintenance Release style hoisting enabled for predicates with lookahead depth = 1\n"); fprintf(stderr," No longer considered experimental\n"); fprintf(stderr," Can't consider suppression for predicates with lookahead depth > 1\n"); fprintf(stderr," Implies -prc on but does *not* imply -mrhoistk for k>1 predicates\n"); fprintf(stderr," This is a reminder, not a warning or error.\n"); }; } static void #ifdef __USE_PROTOS pMRhoistk( char *s, char *t ) #else pMRhoistk(s,t) char *s; char *t; #endif { if ( ci_strequ(t,"on")) MRhoistingk = 1; else if ( ci_strequ(t,"off")==0 ) MRhoistingk = 0; if (MRhoistingk) { fprintf(stderr,"EXPERIMENTAL Maintenance Release style hoisting enabled\n"); fprintf(stderr," Applies to predicates with lookahead depth > 1\n"); fprintf(stderr," Implies -prc on and -mrhoist on\n"); }; } static void #ifdef __USE_PROTOS pTRes( char *s, char *t ) #else pTRes( s, t ) char *s; char *t; #endif { TreeResourceLimit = atoi(t); if ( TreeResourceLimit <= 0 ) { warnNoFL("analysis resource limit (# of tree nodes) must be greater than 0"); TreeResourceLimit = -1; /* set to no limit */ } } Opt options[] = { #ifdef __cplusplus { "-CC", 0, (void (*)(...)) pCC, "Generate C++ output (default=FALSE)"}, { "-ck", 1, (void (*)(...)) pCk, "Set compressed lookahead depth; fast approximate lookahead"}, { "-cr", 0, (void (*)(...)) pCr, "Generate cross reference (default=FALSE)"}, { "-e1", 0, (void (*)(...)) pE1, "Ambiguities/errors shown in low detail (default)"}, { "-e2", 0, (void (*)(...)) pE2, "Ambiguities/errors shown in more detail"}, { "-e3", 0, (void (*)(...)) pE3, "Ambiguities for k>1 grammars shown with exact tuples (not lookahead sets)"}, { "-f", 1, (void (*)(...)) pFileList,"Read names of grammar files from specified file"}, /* MR14 */ { "-fe", 1, (void (*)(...)) pFe, "Rename err.c"}, { "-fh", 1, (void (*)(...)) pFHdr, "Rename stdpccts.h header (turns on -gh)"}, { "-fl", 1, (void (*)(...)) pFl, "Rename lexical output--parser.dlg"}, { "-fm", 1, (void (*)(...)) pFm, "Rename mode.h"}, { "-fr", 1, (void (*)(...)) pFr, "Rename remap.h"}, { "-ft", 1, (void (*)(...)) pFt, "Rename tokens.h"}, { "-ga", 0, (void (*)(...)) pANSI, "Generate ANSI-compatible code (default=FALSE)"}, { "-gc", 0, (void (*)(...)) pCGen, "Do not generate output parser code (default=FALSE)"}, { "-gd", 0, (void (*)(...)) pTGen, "Generate code to trace rule invocation (default=FALSE)"}, { "-ge", 0, (void (*)(...)) pEGen, "Generate an error class for each non-terminal (default=FALSE)"}, { "-gh", 0, (void (*)(...)) pGHdr, "Generate stdpccts.h for non-ANTLR-generated-files to include"}, { "-gk", 0, (void (*)(...)) pDL, "Generate parsers that delay lookahead fetches until needed"}, { "-gl", 0, (void (*)(...)) pLI, "Generate line info about grammar actions in parser"}, { "-glms", 0, (void (*)(...)) pLIms,"Like -gl but replace '\\' with '/' in #line filenames for MS C/C++ systems"}, { "-gp", 1, (void (*)(...)) pPre, "Prefix all generated rule functions with a string"}, { "-gs", 0, (void (*)(...)) pSGen, "Do not generate sets for token expression lists (default=FALSE)"}, { "-gt", 0, (void (*)(...)) pAst, "Generate code for Abstract-Syntax-Trees (default=FALSE)"}, { "-gx", 0, (void (*)(...)) pLGen, "Do not generate lexical (dlg-related) files (default=FALSE)"}, { "-gxt",0, (void (*)(...)) pXTGen, "Do not generate tokens.h (default=FALSE)"}, { "-k", 1, (void (*)(...)) pLLK, "Set full LL(k) lookahead depth (default==1)"}, { "-o", 1, (void (*)(...)) pOut, OutputDirectoryOption}, { "-p", 0, (void (*)(...)) pPrt, "Print out the grammar w/o actions (default=no)"}, { "-pa", 0, (void (*)(...)) pPrtA, "Print out the grammar w/o actions & w/FIRST sets (default=no)"}, { "-pr",0, (void (*)(...)) pPred, "no longer used; predicates employed if present"}, { "-prc", 1, (void (*)(...)) pPredCtx,"Turn on/off computation of context for hoisted predicates"}, { "-rl", 1, (void (*)(...)) pTRes, "Limit max # of tree nodes used by grammar analysis"}, { "-stdout",0, (void (*)(...)) pStdout,"Send grammar.c/grammar.cpp to stdout"}, /* MR6 */ { "-tab", 1, (void (*)(...)) pTab, "Width of tabs (1 to 8) for grammar.c/grammar.cpp files"}, /* MR6 */ { "-w1", 0, (void (*)(...)) pW1, "Set the warning level to 1 (default)"}, { "-w2", 0, (void (*)(...)) pW2, "Ambiguities yield warnings even if predicates or (...)? block"}, { "-", 0, (void (*)(...)) pStdin, "Read grammar from stdin" }, { "-mrhoist",1, (void (*)(...)) pMRhoist, /* MR9 */ "Turn on/off k=1 Maintenance Release style hoisting"}, /* MR9 */ { "-mrhoistk",1, (void (*)(...)) pMRhoistk, /* MR9 */ "Turn on/off EXPERIMENTAL k>1 Maintenance Release style hoisting"}, /* MR13 */ { "-aa" , 1, (void (*)(...)) pAA, "Ambiguity aid for a rule (rule name or line number)"}, /* MR11 */ { "-aam" , 0, (void (*)(...)) pAAm, "Lookahead token may appear multiple times in -aa listing"}, /* MR11 */ { "-aad" , 1, (void (*)(...)) pAAd, "Limits exp growth of -aa listing - default=1 (max=ck value)"}, /* MR11 */ { "-info", 1, (void (*)(...)) pInfo, "Extra info: p=pred t=tnodes f=first/follow m=monitor o=orphans 0=noop"}, /* MR12 */ { "-treport",1,(void (*)(...)) pTreport, "Report when tnode usage exceeds value during ambiguity resolution"}, /* MR11 */ { "-newAST", 0, (void (*)(...)) pNewAST, "In C++ mode use \"newAST(...)\" rather than \"new AST(...)\""}, /* MR13 */ { "-tmake", 0, (void (*)(...)) ptmakeInParser, "In C++ mode use parser's tmake method rather than \"ASTBase::tmake(...)\""}, /* MR23 */ { "-alpha",0,(void (*)(...)) pAlpha, "Provide additional information for \"(alpha)? beta\" error messages"}, /* MR14 */ { "-mrblkerr",0,(void (*)(...)) pMR_BlkErr, /* MR21 */ "EXPERIMENTAL change to (...)* and (...)+ syntax error sets"}, /* MR21 */ { "-nopurify",0,(void (*)(...)) pNOPURIFY, "Don't use the notorious PURIFY macro (replaced by MR23 initial value syntax) to zero return arguments of rules"}, /* MR23 */ { "*", 0, (void (*)(...)) pFile, "" }, /* anything else is a file */ #else { "-CC", 0, pCC, "Generate C++ output (default=FALSE)"}, { "-cr", 0, pCr, "Generate cross reference (default=FALSE)"}, { "-ck", 1, pCk, "Set compressed lookahead depth; fast approximate lookahead"}, { "-e1", 0, pE1, "Ambiguities/errors shown in low detail (default)"}, { "-e2", 0, pE2, "Ambiguities/errors shown in more detail"}, { "-e3", 0, pE3, "Ambiguities for k>1 grammars shown with exact tuples (not lookahead sets)"}, { "-f", 1, pFileList,"Read names of grammar files from specified file"}, /* MR14 */ { "-fe", 1, pFe, "Rename err.c"}, { "-fh", 1, pFHdr, "Rename stdpccts.h header (turns on -gh)"}, { "-fl", 1, pFl, "Rename lexical output--parser.dlg"}, { "-fm", 1, pFm, "Rename mode.h"}, { "-fr", 1, pFr, "Rename remap.h"}, { "-ft", 1, pFt, "Rename tokens.h"}, { "-ga", 0, pANSI, "Generate ANSI-compatible code (default=FALSE)"}, { "-gc", 0, pCGen, "Do not generate output parser code (default=FALSE)"}, { "-gd", 0, pTGen, "Generate code to trace rule invocation (default=FALSE)"}, { "-ge", 0, pEGen, "Generate an error class for each non-terminal (default=FALSE)"}, { "-gh", 0, pGHdr, "Generate stdpccts.h for non-ANTLR-generated-files to include"}, { "-gk", 0, pDL, "Generate parsers that delay lookahead fetches until needed"}, { "-gl", 0, pLI, "Generate line info about grammar actions in C parser"}, { "-glms", 0, pLIms,"Like -gl but replace '\\' with '/' in #line filenames for MS C/C++ systems"}, { "-gp", 1, pPre, "Prefix all generated rule functions with a string"}, { "-gs", 0, pSGen, "Do not generate sets for token expression lists (default=FALSE)"}, { "-gt", 0, pAst, "Generate code for Abstract-Syntax-Trees (default=FALSE)"}, { "-gx", 0, pLGen, "Do not generate lexical (dlg-related) files (default=FALSE)"}, { "-gxt",0, pXTGen, "Do not generate tokens.h (default=FALSE)"}, { "-k", 1, pLLK, "Set full LL(k) lookahead depth (default==1)"}, { "-o", 1, pOut, OutputDirectoryOption}, { "-p", 0, pPrt, "Print out the grammar w/o actions (default=no)"}, { "-pa", 0, pPrtA, "Print out the grammar w/o actions & w/FIRST sets (default=no)"}, { "-pr",0, pPred, "no longer used; predicates employed if present"}, { "-prc", 1, pPredCtx,"Turn on/off computation of context for hoisted predicates"}, { "-rl", 1, pTRes, "Limit max # of tree nodes used by grammar analysis"}, { "-stdout",0, pStdout, "Send grammar.c/grammar.cpp to stdout"}, /* MR6 */ { "-tab", 1, pTab, "Width of tabs (1 to 8) for grammar.c/grammar.cpp files"}, /* MR6 */ { "-w1", 0, pW1, "Set the warning level to 1 (default)"}, { "-w2", 0, pW2, "Ambiguities yield warnings even if predicates or (...)? block"}, { "-mrhoist",1,pMRhoist, /* MR9 */ "Turn on/off k=1 Maintenance Release style hoisting"}, /* MR9 */ { "-mrhoistk",1,pMRhoistk, /* MR13 */ "Turn on/off k>1 EXPERIMENTAL Maintenance Release style hoisting"}, /* MR13 */ { "-aa" ,1,pAA, "Ambiguity aid for a rule (rule name or line number)"}, /* MR11 */ { "-aam" ,0,pAAm, "Lookahead token may appear multiple times in -aa listing"}, /* MR11 */ { "-aad" ,1,pAAd, "Limits exp growth of -aa listing - default=1 (max=ck value)"}, /* MR11 */ { "-info",1,pInfo, "Extra info: p=pred t=tnodes f=first/follow m=monitor o=orphans 0=noop"}, /* MR11 */ { "-treport",1,pTreport, "Report when tnode usage exceeds value during ambiguity resolution"}, /* MR11 */ { "-newAST", 0, pNewAST, "In C++ mode use \"newAST(...)\" rather than \"new AST(...)\""}, /* MR13 */ { "-tmake", 0, ptmakeInParser, "In C++ mode use parser's tmake method rather than \"ASTBase::tmake(...)\""}, /* MR23 */ { "-alpha",0, pAlpha, "Provide additional information for \"(alpha)? beta\" error messages"}, /* MR14 */ { "-mrblkerr",0,pMR_BlkErr, /* MR21 */ "EXPERIMENTAL change to (...)* and (...)+ syntax error sets"}, /* MR21 */ { "-nopurify",0,pNOPURIFY, "Don't use the notorious PURIFY macro (replaced by MR23 initial value syntax) to zero return arguments of rules"}, /* MR23 */ { "-", 0, pStdin, "Read grammar from stdin" }, { "*", 0, pFile, "" }, /* anything else is a file */ #endif { NULL, 0, NULL } }; void readDescr(); void cleanUp(); #ifdef __USE_PROTOS static void buildRulePtr( void ); static void help( void ); static void init( void ); static void CompleteTokenSetRefs( void ); static void ensure_no_C_file_collisions(char *); static void CompleteContextGuards(void); #else static void buildRulePtr( ); static void help( ); static void init( ); static void CompleteTokenSetRefs( ); static void ensure_no_C_file_collisions(); static void CompleteContextGuards(); #endif static void #ifdef __USE_PROTOS /* */ report_numericPredLabels(ActionNode *a) #else report_numericPredLabels(a) ActionNode *a; #endif { /* MR10 */ warnFL("numeric references to attributes (e.g. $i or $i.j) in semantic pred will be null during guess mode", /* MR10 */ FileStr[a->file],a->line); /* MR10 */ } /* MR10 */ /* M a i n */ int #ifdef __USE_PROTOS main( int argc, char *argv[] ) #else main( argc, argv ) int argc; char *argv[]; #endif { int i; static char EPSTR[] = "[Ep]"; Save_argc=argc; /* MR10 */ Save_argv=argv; /* MR10 */ /* malloc_debug(8);*/ #ifdef SPECIAL_INITS special_inits(); /* MR1 */ #endif fprintf(stderr, "Antlr parser generator Version %s 1989-2001\n", Version); if ( argc == 1 ) { help(); zzDIE; } ProcessArgs(argc-1, &(argv[1]), options); /* MR14 */ if (MR_AmbAidRule && AlphaBetaTrace) { /* MR14 */ fatal("Can't specify both -aa (ambiguity aid) and -alpha (\"(alpha)? beta\" aid)"); /* MR14 */ } if (MRhoistingk) { /* MR13 */ HoistPredicateContext=1; /* MR13 */ MRhoisting=1; /* MR13 */ }; /* MR13 */ if (MRhoisting && ! HoistPredicateContext) { /*** warnNoFL("Using \"-mrhoist\" forces \"-prc on\""); ***/ HoistPredicateContext=1; }; if (HoistPredicateContext && ! MRhoisting) { warnNoFL("When using predicate context (-prc on) -mrhoist on is recommended"); } /* Fix lookahead depth */ /* Compressed lookahead must always be larger than or equal to full lookahead */ if ( CLL_k < LL_k && CLL_k>0 ) { warnNoFL("must have compressed lookahead >= full LL(k) lookahead (setting -ck to -k)"); CLL_k = LL_k; } if ( CLL_k == -1 ) CLL_k = LL_k; OutputLL_k = CLL_k; if ( ((CLL_k-1)&CLL_k)!=0 ) { /* output ll(k) must be power of 2 */ int n; for(n=1; n 1) { warnNoFL("The -mrblkerr option is designed only for k=1 ck=1 grammars"); } }; if ( ! ambAidDepthSpecified) { MR_AmbAidDepth=1; } else { if (MR_AmbAidDepth > CLL_k || MR_AmbAidDepth <= 0) { warnNoFL(eMsgd( "Ambiguity aid depth (\"-aad ...\") must be a number between 1 and max(k,ck)=%d",CLL_k)); MR_AmbAidDepth=1; }; if (MR_AmbAidDepth == 0) { MR_AmbAidDepth=2; }; }; if (MR_AmbAidRule != NULL) MR_AmbAidLine=atoi(MR_AmbAidRule); fpTrans = &(C_Trans[0]); /* Translate to C Language */ fpJTrans = &(C_JTrans[0]); init(); lexclass(LexStartSymbol); readDescr(); LastTokenCounted = TokenNum; RemapForcedTokens(); if ( CannotContinue ) {cleanUp(); zzDIE;} if ( GenCC && no_classes_found ) fatal("required grammar class not found (exiting...)"); if ( WarningLevel>1 && HdrAction == NULL ) warnNoFL("no #header action was found"); if ( FoundAtOperator && ! FoundExceptionGroup) { warnNoFL("found the exception operator '@' - but no exception group was found"); }; EpToken = addTname(EPSTR); /* add imaginary token epsilon */ set_orel(EpToken, &imag_tokens); /* this won't work for hand-built scanners since EofToken is not * known. Forces EOF to be token type 1. */ set_orel(EofToken, &imag_tokens); set_size(NumWords(TokenNum-1)); /* compute the set of all known token types * It represents the set of tokens from 1 to last_token_num + the * reserved positions above that (if any). Don't include the set of * imaginary tokens such as the token/error classes or EOF. */ { set a; a = set_dup(reserved_positions); for (i=1; inext; p!=NULL; p=p->next) { UserAction *ua = (UserAction *)p->elem; dumpAction( ua->action, Parser_h, 0, ua->file, ua->line, 1); } } GenParser_c_Hdr(); fprintf(Parser_h, "protected:\n"); /* MR20 */ NewSetWd(); TRANS(SynDiag); /* Translate to the target language */ DumpSetWd(); GenRuleMemberDeclarationsForCC(Parser_h, SynDiag); if ( class_after_actions != NULL ) { ListNode *p; for (p = class_after_actions->next; p!=NULL; p=p->next) { UserAction *ua = (UserAction *)p->elem; dumpAction( ua->action, Parser_h, 0, ua->file, ua->line, 1); } } DumpRemainingTokSets(); fprintf(Parser_h, "};\n"); fprintf(Parser_h, "\n#endif /* %s_h */\n", CurrentClassName); fclose( Parser_h ); fclose( Parser_c ); } } MR_orphanRules(stderr); if (LTinTokenAction && WarningLevel >= 2) { if (GenCC) { warnNoFL("At least one <> following a token match contains a reference to LT(...)\n this will reference the immediately preceding token,\n not the one which follows as is the case with semantic predicates."); } warnNoFL("At least one <> following a token match contains a reference to LA(...) or LATEXT(...)\n this will reference the immediately preceding token,\n not the one which follows as is the case with semantic predicates."); } if ( PrintOut ) { if ( SynDiag == NULL ) {warnNoFL("no grammar description recognized");} else PRINT(SynDiag); } #ifdef DBG_LL1 #endif GenRemapFile(); /* create remap.h */ /* MR10 */ if (FoundGuessBlk) { #ifdef __cplusplus__ /* MR10 */ list_apply(NumericPredLabels, (void (*)(void *))report_numericPredLabels); #else #ifdef __USE_PROTOS /* MR10 */ list_apply(NumericPredLabels, (void (*)(void *))report_numericPredLabels); #else /* MR10 */ list_apply(NumericPredLabels,report_numericPredLabels); #endif #endif /* MR10 */ }; if (InfoT && TnodesAllocated > 0) { if (TnodesPeak > 10000) { fprintf(stdout,"\nTree Nodes: peak %dk created %dk lost %d\n", (TnodesPeak/1000), (TnodesAllocated/1000), TnodesInUse-tnodes_used_in_guard_predicates_etc); } else { fprintf(stdout,"\nTree Nodes: peak %d created %d lost %d\n", TnodesPeak, TnodesAllocated, TnodesInUse-tnodes_used_in_guard_predicates_etc); }; }; if (InfoF) { DumpFcache(); }; if (MR_skipped_e3_report) { fprintf(stderr,"note: use -e3 to get exact information on ambiguous tuples\n"); }; if (MR_BadExprSets != 0) { fprintf(stderr,"note: Unreachable C or C++ code was generated for empty expression sets,\n"); fprintf(stderr," probably due to undefined rules or infinite left recursion.\n"); fprintf(stderr," To locate: search the generated code for \"empty set expression\"\n"); }; if (MR_AmbAidRule != NULL && MR_matched_AmbAidRule==0) { RuleEntry *q = (RuleEntry *) hash_get(Rname,MR_AmbAidRule); if (MR_AmbAidLine == 0 && q == NULL) { warnNoFL(eMsg2("there is no rule \"%s\" so \"-aa %s\" will never match", MR_AmbAidRule,MR_AmbAidRule)); } else { warnNoFL(eMsg1("there was no ambiguity that matched \"-aa %s\"",MR_AmbAidRule)); }; }; if (AlphaBetaTrace) { if (MR_AlphaBetaMessageCount == 0) { fprintf(stderr,"note: there were no messages about \"(alpha)? beta\" blocks added to the generated code\n"); } else { fprintf(stderr,"note: there were %d messages about \"(alpha)? beta\" blocks added to the generated code\n", MR_AlphaBetaMessageCount); } if (set_null(MR_CompromisedRules)) { fprintf(stderr,"note: the list of rules with compromised follow sets is empty\n"); } else { fprintf(stderr,"note: the following is a list of rules which *may* have incorrect\n"); fprintf(stderr," follow sets computed as a result of an \"(alpha)? beta\" block\n"); fprintf(stderr,"\n"); MR_dumpRuleSet(MR_CompromisedRules); fprintf(stderr,"\n"); } } cleanUp(); exit(PCCTS_EXIT_SUCCESS); return 0; /* MR11 make compilers happy */ } static void #ifdef __USE_PROTOS init( void ) #else init( ) #endif { SignalEntry *q; Tname = newHashTable(); Rname = newHashTable(); Fcache = newHashTable(); Tcache = newHashTable(); Sname = newHashTable(); Pname = newHashTable(); /* MR11 */ /* Add default signal names */ q = (SignalEntry *)hash_add(Sname, "NoViableAlt", (Entry *)newSignalEntry("NoViableAlt")); require(q!=NULL, "cannot alloc signal entry"); q->signum = sigNoViableAlt; q = (SignalEntry *)hash_add(Sname, "MismatchedToken", (Entry *)newSignalEntry("MismatchedToken")); require(q!=NULL, "cannot alloc signal entry"); q->signum = sigMismatchedToken; q = (SignalEntry *)hash_add(Sname, "NoSemViableAlt", (Entry *)newSignalEntry("NoSemViableAlt")); require(q!=NULL, "cannot alloc signal entry"); q->signum = sigNoSemViableAlt; reserved_positions = empty; all_tokens = empty; imag_tokens = empty; tokclasses = empty; TokenStr = (char **) calloc(TSChunk, sizeof(char *)); require(TokenStr!=NULL, "main: cannot allocate TokenStr"); FoStack = (int **) calloc(CLL_k+1, sizeof(int *)); require(FoStack!=NULL, "main: cannot allocate FoStack"); FoTOS = (int **) calloc(CLL_k+1, sizeof(int *)); require(FoTOS!=NULL, "main: cannot allocate FoTOS"); Cycles = (ListNode **) calloc(CLL_k+1, sizeof(ListNode *)); require(Cycles!=NULL, "main: cannot allocate Cycles List"); MR_CompromisedRules=empty; /* MR14 */ } static void #ifdef __USE_PROTOS help( void ) #else help( ) #endif { Opt *p = options; fprintf(stderr, "antlr [options] f1 f2 ... fn\n"); while ( *(p->option) != '*' ) { fprintf(stderr, " %-9s%s %s\n", p->option, (p->arg)?"___":" ", p->descr); p++; } } /* The RulePtr array is filled in here. RulePtr exists primarily * so that sets of rules can be maintained for the FOLLOW caching * mechanism found in rJunc(). RulePtr maps a rule num from 1 to n * to a pointer to its RuleBlk junction where n is the number of rules. */ static void #ifdef __USE_PROTOS buildRulePtr( void ) #else buildRulePtr( ) #endif { int r=1; Junction *p = SynDiag; RulePtr = (Junction **) calloc(NumRules+1, sizeof(Junction *)); require(RulePtr!=NULL, "cannot allocate RulePtr array"); while ( p!=NULL ) { require(r<=NumRules, "too many rules???"); RulePtr[r++] = p; p = (Junction *)p->p2; } } void #ifdef __USE_PROTOS dlgerror(const char *s) #else dlgerror(s) char *s; #endif { fprintf(stderr, ErrHdr, FileStr[CurFile], zzline); fprintf(stderr, " lexical error: %s (text was '%s')\n", ((s == NULL) ? "Lexical error" : s), zzlextext); } void #ifdef __USE_PROTOS readDescr( void ) #else readDescr( ) #endif { zzerr = dlgerror; input = NextFile(); if ( input==NULL ) fatal("No grammar description found (exiting...)"); ANTLR(grammar(), input); tnodes_used_in_guard_predicates_etc=TnodesInUse; /* MR10 */ } FILE * #ifdef __USE_PROTOS NextFile( void ) #else NextFile( ) #endif { FILE *f; for (;;) { CurFile++; if ( CurFile >= NumFiles ) return(NULL); if ( ci_strequ(FileStr[CurFile],"stdin")) return stdin; f = fopen(FileStr[CurFile], "r"); if ( f == NULL ) { warnNoFL( eMsg1("file %s doesn't exist; ignored", FileStr[CurFile]) ); } else { return(f); } } } /* * Return a string corresponding to the output file name associated * with the input file name passed in. * * Observe the following rules: * * f.e --> f".c" * f --> f".c" * f. --> f".c" * f.e.g --> f.e".c" * * Where f,e,g are arbitrarily long sequences of characters in a file * name. * * In other words, if a ".x" appears on the end of a file name, make it * ".c". If no ".x" appears, append ".c" to the end of the file name. * * C++ mode using .cpp not .c. * * Use malloc() for new string. */ char * #ifdef __USE_PROTOS outname( char *fs ) #else outname( fs ) char *fs; #endif { if ( GenCC) { return outnameX(fs,CPP_FILE_SUFFIX); } else { return outnameX(fs,".c"); }; } char * #ifdef __USE_PROTOS outnameX( char *fs ,char *suffix) #else outnameX( fs , suffix ) char *fs; char *suffix; #endif { static char buf[MaxFileName+1]; char *p; require(fs!=NULL&&*fs!='\0', "outname: NULL filename"); p = buf; strcpy(buf, fs); while ( *p != '\0' ) {p++;} /* Stop on '\0' */ while ( *p != '.' && p != buf ) {--p;} /* Find '.' */ if ( p != buf ) *p = '\0'; /* Found '.' */ require(strlen(buf) + 2 < (size_t)MaxFileName, "outname: filename too big"); strcat(buf,suffix); return( buf ); } void #ifdef __USE_PROTOS fatalFL( char *err_, char *f, int l ) #else fatalFL( err_, f, l ) char *err_; char *f; int l; #endif { fprintf(stderr, ErrHdr, f, l); fprintf(stderr, " %s\n", err_); cleanUp(); exit(PCCTS_EXIT_FAILURE); } void #ifdef __USE_PROTOS fatal_intern( char *err_, char *f, int l ) #else fatal_intern( err_, f, l ) char *err_; char *f; int l; #endif { fprintf(stderr, ErrHdr, f, l); fprintf(stderr, " #$%%*&@# internal error: %s\n", err_); fprintf(stderr, ErrHdr, f, l); fprintf(stderr, " [complain to nearest government official\n"); fprintf(stderr, ErrHdr, f, l); fprintf(stderr, " or send hate-mail to parrt@parr-research.com;\n"); fprintf(stderr, ErrHdr, f, l); fprintf(stderr, " please pray to the ``bug'' gods that there is a trival fix.]\n"); cleanUp(); exit(PCCTS_EXIT_FAILURE); } void #ifdef __USE_PROTOS cleanUp( void ) #else cleanUp( ) #endif { if ( DefFile != NULL) fclose( DefFile ); } /* sprintf up to 3 strings */ char * #ifdef __USE_PROTOS eMsg3( char *s, char *a1, char *a2, char *a3 ) #else eMsg3( s, a1, a2, a3 ) char *s; char *a1; char *a2; char *a3; #endif { static char buf[250]; /* DANGEROUS as hell !!!!!! */ sprintf(buf, s, a1, a2, a3); return( buf ); } /* sprintf a decimal */ char * #ifdef __USE_PROTOS eMsgd( char *s, int d ) #else eMsgd( s, d ) char *s; int d; #endif { static char buf[250]; /* DANGEROUS as hell !!!!!! */ sprintf(buf, s, d); return( buf ); } char * #ifdef __USE_PROTOS eMsgd2( char *s, int d1,int d2) #else eMsgd2( s, d1, d2 ) char *s; int d1; int d2; #endif { static char buf[250]; /* DANGEROUS as hell !!!!!! */ sprintf(buf, s, d1, d2); return( buf ); } void #ifdef __USE_PROTOS s_fprT( FILE *f, set e ) #else s_fprT( f, e ) FILE *f; set e; #endif { register unsigned *p; unsigned *q; if ( set_nil(e) ) return; if ( (q=p=set_pdq(e)) == NULL ) fatal_internal("Can't alloc space for set_pdq"); fprintf(f, "{"); while ( *p != nil ) { fprintf(f, " %s", TerminalString(*p)); p++; } fprintf(f, " }"); free((char *)q); } /* Return the token name or regular expression for a token number. */ char * #ifdef __USE_PROTOS TerminalString( int token ) #else TerminalString( token ) int token; #endif { int j; static char imag_name[20]; /* look in all lexclasses for the token */ if ( TokenString(token) != NULL ) return TokenString(token); for (j=0; j0, "pushint: stack overflow"); istack[--isp] = i; } int #ifdef __USE_PROTOS popint( void ) #else popint( ) #endif { require(isp 0 ) { p = options; while ( p->option != NULL ) { if ( strcmp(p->option, "*") == 0 || ci_strequ(p->option, *argv) == 1 ) { if ( p->arg ) { /* MR9 26-Sep-97 Check for argv valid */ if (argc-- > 0) { (*p->process)( *argv, *(argv+1) ); argv++; } else { fprintf(stderr,"error: required argument for option %s omitted\n",*argv); exit(PCCTS_EXIT_FAILURE); }; } else (*p->process)( *argv ); break; } p++; } argv++; } } static void #ifdef __USE_PROTOS CompleteContextGuards(void) #else CompleteContextGuards() #endif { ListNode * p; Predicate * pred; if (ContextGuardPredicateList == NULL) return; for (p=ContextGuardPredicateList->next; p != NULL; p=p->next) { pred=(Predicate *)p->elem; recomputeContextGuard(pred); } } /* Go back into the syntax diagram and compute all meta tokens; i.e. * turn all '.', ranges, token class refs etc... into actual token sets */ static void #ifdef __USE_PROTOS CompleteTokenSetRefs(void) #else CompleteTokenSetRefs() #endif { ListNode *p; if ( MetaTokenNodes==NULL ) return; for (p = MetaTokenNodes->next; p!=NULL; p=p->next) { set a,b; TokNode *q = (TokNode *)p->elem; if ( q->wild_card ) { q->tset = all_tokens; } else if ( q->tclass!=NULL ) { if ( q->complement ) q->tset = set_dif(all_tokens, q->tclass->tset); else q->tset = q->tclass->tset; } else if ( q->upper_range!=0 ) { /* we have a range on our hands: make a set from q->token .. q->upper_range */ int i; a = empty; for (i=q->token; i<=q->upper_range; i++) { set_orel(i, &a); } /* MR13 */ /* MR13 */ if (q->complement) { /* MR13 */ q->tset = set_dif(all_tokens, a); /* MR13 */ set_free(a); /* MR13 */ } else { /* MR13 */ q->tset = a; /* MR13 */ } } /* at this point, it can only be a complemented single token */ else if ( q->complement ) { a = set_of(q->token); b = set_dif(all_tokens, a); set_free(a); q->tset=b; } else fatal("invalid meta token"); } } /* MR10: Jeff Vincent MR10: Changed to remove directory information from n only if MR10: if OutputDirectory was changed by user (-o option) */ char * #ifdef __USE_PROTOS OutMetaName(char *n) #else OutMetaName(n) char *n; #endif { static char *dir_sym = DirectorySymbol; static char newname[MaxFileName+1]; char *p; /* If OutputDirectory is same as TopDirectory (platform default) then leave n alone. */ if (strcmp(OutputDirectory, TopDirectory) == 0) /* TopDirectory is "." on Unix. */ return n; /* p will point to filename without path information */ if ((p = strrchr(n, *dir_sym)) != NULL) /* Directory symbol is "/" on Unix. */ p++; else p = n; /* Copy new output directory into newname[] */ strcpy(newname, OutputDirectory); /* if new output directory does not have trailing dir_sym, add it! */ if (newname[strlen(newname)-1] != *dir_sym) { strcat(newname, dir_sym); } strcat(newname, p); return newname; } char * #ifdef __USE_PROTOS pcctsBaseName(char *n) /* MR32 */ #else pcctsBaseName(n) char *n; #endif { static char newname[MaxFileName+1]; static char* dir_sym = DirectorySymbol; int count = 0; char *p; p = n; while ( *p != '\0' ) {p++;} /* go to end of string */ while ( (*p != *dir_sym) && (p != n) ) {--p;} /* Find last DirectorySymbol */ while ( *p == *dir_sym) p++; /* step forward if we're on a dir symbol */ while ( *p != '\0' && *p != '.') { newname[count++] = *p; p++; } /* create a new name */ newname[count] = '\0'; return newname; } static void #ifdef __USE_PROTOS ensure_no_C_file_collisions(char *class_c_file) #else ensure_no_C_file_collisions(class_c_file) char *class_c_file; #endif { int i; for (i=0; i= NumFiles && CurFile >= 1 ) CurFile--; fprintf(stderr, ErrHdr, FileStr[CurFile], zzline); fprintf(stderr, " warning: %s\n", err); } void #ifdef __USE_PROTOS warnNoCR( char *err ) #else warnNoCR( err ) char *err; #endif { /* back up the file number if we hit an error at the end of the last file */ if ( CurFile >= NumFiles && CurFile >= 1 ) CurFile--; fprintf(stderr, ErrHdr, FileStr[CurFile], zzline); fprintf(stderr, " warning: %s", err); } void #ifdef __USE_PROTOS errNoFL(char *err) #else errNoFL(err) char *err; #endif { fprintf(stderr, "error: %s\n", err); } void #ifdef __USE_PROTOS errFL(char *err,char *f,int l) #else errFL(err,f,l) char *err; char *f; int l; #endif { fprintf(stderr, ErrHdr, f, l); fprintf(stderr, " error: %s\n", err); } void #ifdef __USE_PROTOS err(char *err) #else err(err) char *err; #endif { /* back up the file number if we hit an error at the end of the last file */ if ( CurFile >= NumFiles && CurFile >= 1 ) CurFile--; fprintf(stderr, ErrHdr, FileStr[CurFile], zzline); fprintf(stderr, " error: %s\n", err); } void #ifdef __USE_PROTOS errNoCR( char *err ) #else errNoCR( err ) char *err; #endif { /* back up the file number if we hit an error at the end of the last file */ if ( CurFile >= NumFiles && CurFile >= 1 ) CurFile--; fprintf(stderr, ErrHdr, FileStr[CurFile], zzline); fprintf(stderr, " error: %s", err); } UserAction * #ifdef __USE_PROTOS newUserAction(char *s) #else newUserAction(s) char *s; #endif { UserAction *ua = (UserAction *) calloc(1, sizeof(UserAction)); require(ua!=NULL, "cannot allocate UserAction"); ua->action = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); strcpy(ua->action, s); return ua; } /* Added by TJP September 1994 */ /* Take in file.h and return file_h; names w/o '.'s are left alone */ char * #ifdef __USE_PROTOS gate_symbol(char *name) #else gate_symbol(name) char *name; #endif { static char buf[100]; char *p; sprintf(buf, "%s", name); for (p=buf; *p!='\0'; p++) { if ( *p=='.' ) *p = '_'; } return buf; } char * #ifdef __USE_PROTOS makeAltID(int blockid, int altnum) #else makeAltID(blockid, altnum) int blockid; int altnum; #endif { static char buf[100]; char *p; sprintf(buf, "_blk%d_alt%d", blockid, altnum); p = (char *)malloc(strlen(buf)+1); strcpy(p, buf); return p; } gtkwave-3.3.86/contrib/pccts/antlr/scan.c0000664000175000017500000043316013166335473017577 0ustar bybellbybell /* parser.dlg -- DLG Description of scanner * * Generated from: ./antlr.g * * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001 * Purdue University Electrical Engineering * With AHPCRC, University of Minnesota * ANTLR Version 1.33MR33 */ #define ANTLR_VERSION 13333 #include "pcctscfg.h" #include "pccts_stdio.h" #include "pcctscfg.h" #include "set.h" #include #include "syn.h" #include "hash.h" #include "generic.h" #define zzcr_attr(attr,tok,t) #include "antlr.h" #include "tokens.h" #include "dlgdef.h" LOOKAHEAD void #ifdef __USE_PROTOS zzerraction(void) #else zzerraction() #endif { (*zzerr)("invalid token"); zzadvance(); zzskip(); } /* * D L G tables * * Generated from: ./parser.dlg * * 1989-2001 by Will Cohen, Terence Parr, and Hank Dietz * Purdue University Electrical Engineering * DLG Version 1.33MR33 */ #include "mode.h" /* maintained, but not used for now */ set AST_nodes_refd_in_actions = set_init; int inAlt = 0; set attribsRefdFromAction = set_init; /* MR20 */ int UsedOldStyleAttrib = 0; int UsedNewStyleLabel = 0; #ifdef __USE_PROTOS char *inline_set(char *); #else char *inline_set(); #endif /* MR1 10-Apr-97 MR1 Previously unable to put right shift operator */ /* MR1 in DLG action */ int tokenActionActive=0; /* MR1 */ static char * #ifdef __USE_PROTOS getFileNameFromTheLineInfo(char *toStr, char *fromStr) #else getFileNameFromTheLineInfo(toStr, fromStr) char *toStr, *fromStr; #endif { int i, j, k; if (!fromStr || !toStr) return toStr; /* find the first " */ for (i=0; (ielem->ntype == nToken,"mark_label_used... ntype != nToken"); tn=(TokNode *)le->elem; require (tn->label != 0,"mark_label_used... TokNode has no label"); tn->label_used_in_semantic_pred=1; } static void act1() { NLA = Eof; /* L o o k F o r A n o t h e r F i l e */ { FILE *new_input; new_input = NextFile(); if ( new_input == NULL ) { NLA=Eof; return; } fclose( input ); input = new_input; zzrdstream( input ); zzskip(); /* Skip the Eof (@) char i.e continue */ } } static void act2() { NLA = 76; zzskip(); } static void act3() { NLA = 77; zzline++; zzskip(); } static void act4() { NLA = 78; zzmode(ACTIONS); zzmore(); istackreset(); pushint(']'); } static void act5() { NLA = 79; action_file=CurFile; action_line=zzline; zzmode(ACTIONS); zzmore(); list_free(&CurActionLabels,0); /* MR10 */ numericActionLabel=0; /* MR10 */ istackreset(); pushint('>'); } static void act6() { NLA = 80; zzmode(STRINGS); zzmore(); } static void act7() { NLA = 81; zzmode(COMMENTS); zzskip(); } static void act8() { NLA = 82; warn("Missing /*; found dangling */"); zzskip(); } static void act9() { NLA = 83; zzmode(CPP_COMMENTS); zzskip(); } static void act10() { NLA = 84; zzline = atoi(zzbegexpr+5) - 1; zzline++; zzmore(); getFileNameFromTheLineInfo(FileStr[CurFile], zzbegexpr); } static void act11() { NLA = 85; zzline++; zzmore(); } static void act12() { NLA = 86; warn("Missing <<; found dangling >>"); zzskip(); } static void act13() { NLA = WildCard; } static void act14() { NLA = 88; FoundException = 1; /* MR6 */ FoundAtOperator = 1; } static void act15() { NLA = Pragma; } static void act16() { NLA = FirstSetSymbol; } static void act17() { NLA = 94; } static void act18() { NLA = 95; } static void act19() { NLA = 96; } static void act20() { NLA = 97; } static void act21() { NLA = 98; } static void act22() { NLA = 99; } static void act23() { NLA = 102; } static void act24() { NLA = 103; } static void act25() { NLA = 104; } static void act26() { NLA = 105; } static void act27() { NLA = 106; } static void act28() { NLA = 107; } static void act29() { NLA = 108; } static void act30() { NLA = 109; } static void act31() { NLA = 110; } static void act32() { NLA = 111; } static void act33() { NLA = 112; } static void act34() { NLA = 113; } static void act35() { NLA = 114; } static void act36() { NLA = 115; } static void act37() { NLA = 116; } static void act38() { NLA = 117; } static void act39() { NLA = 118; } static void act40() { NLA = 119; } static void act41() { NLA = 120; } static void act42() { NLA = 121; } static void act43() { NLA = 122; } static void act44() { NLA = 123; } static void act45() { NLA = 124; } static void act46() { NLA = 125; } static void act47() { NLA = 126; } static void act48() { NLA = 127; } static void act49() { NLA = 128; } static void act50() { NLA = 129; } static void act51() { NLA = 130; } static void act52() { NLA = 131; } static void act53() { NLA = 132; } static void act54() { NLA = 133; } static void act55() { NLA = 134; } static void act56() { NLA = 135; } static void act57() { NLA = NonTerminal; while ( zzchar==' ' || zzchar=='\t' ) { zzadvance(); } if ( zzchar == ':' && inAlt ) NLA = LABEL; } static void act58() { NLA = TokenTerm; while ( zzchar==' ' || zzchar=='\t' ) { zzadvance(); } if ( zzchar == ':' && inAlt ) NLA = LABEL; } static void act59() { NLA = 136; warn(eMsg1("unknown meta-op: %s",LATEXT(1))); zzskip(); } static unsigned char shift0[257] = { 0, 58, 58, 58, 58, 58, 58, 58, 58, 58, 1, 2, 58, 58, 3, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 1, 40, 6, 9, 58, 58, 45, 58, 46, 47, 8, 52, 58, 58, 18, 7, 16, 14, 15, 16, 16, 16, 16, 16, 16, 16, 41, 42, 5, 48, 17, 53, 19, 56, 56, 56, 56, 56, 26, 56, 56, 56, 56, 56, 51, 56, 56, 56, 56, 56, 56, 29, 56, 56, 56, 56, 56, 56, 56, 4, 20, 58, 50, 57, 58, 23, 31, 38, 34, 13, 35, 24, 33, 11, 55, 36, 10, 25, 12, 32, 21, 55, 22, 27, 28, 54, 55, 55, 43, 30, 55, 39, 44, 37, 49, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58 }; static void act60() { NLA = Eof; } static void act61() { NLA = QuotedTerm; zzmode(START); } static void act62() { NLA = 3; zzline++; warn("eoln found in string"); zzskip(); } static void act63() { NLA = 4; zzline++; zzmore(); } static void act64() { NLA = 5; zzmore(); } static void act65() { NLA = 6; zzmore(); } static unsigned char shift1[257] = { 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5, 5, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }; static void act66() { NLA = Eof; } static void act67() { NLA = 7; zzmode(ACTIONS); zzmore(); } static void act68() { NLA = 8; zzline++; warn("eoln found in string (in user action)"); zzskip(); } static void act69() { NLA = 9; zzline++; zzmore(); } static void act70() { NLA = 10; zzmore(); } static void act71() { NLA = 11; zzmore(); } static unsigned char shift2[257] = { 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5, 5, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }; static void act72() { NLA = Eof; } static void act73() { NLA = 12; zzmode(ACTIONS); zzmore(); } static void act74() { NLA = 13; zzline++; warn("eoln found in char literal (in user action)"); zzskip(); } static void act75() { NLA = 14; zzmore(); } static void act76() { NLA = 15; zzmore(); } static unsigned char shift3[257] = { 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5, 5, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }; static void act77() { NLA = Eof; } static void act78() { NLA = 16; zzmode(ACTIONS); zzmore(); } static void act79() { NLA = 17; zzmore(); } static void act80() { NLA = 18; zzline++; zzmore(); DAWDLE; } static void act81() { NLA = 19; zzmore(); } static unsigned char shift4[257] = { 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }; static void act82() { NLA = Eof; } static void act83() { NLA = 20; zzmode(PARSE_ENUM_FILE); zzmore(); } static void act84() { NLA = 21; zzmore(); } static void act85() { NLA = 22; zzline++; zzmore(); DAWDLE; } static void act86() { NLA = 23; zzmore(); } static unsigned char shift5[257] = { 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }; static void act87() { NLA = Eof; } static void act88() { NLA = 24; zzline++; zzmode(PARSE_ENUM_FILE); zzskip(); DAWDLE; } static void act89() { NLA = 25; zzskip(); } static unsigned char shift6[257] = { 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; static void act90() { NLA = Eof; } static void act91() { NLA = 26; zzline++; zzmode(ACTIONS); zzmore(); DAWDLE; } static void act92() { NLA = 27; zzmore(); } static unsigned char shift7[257] = { 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; static void act93() { NLA = Eof; } static void act94() { NLA = 28; zzline++; zzmode(START); zzskip(); DAWDLE; } static void act95() { NLA = 29; zzskip(); } static unsigned char shift8[257] = { 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; static void act96() { NLA = Eof; } static void act97() { NLA = 30; zzmode(START); zzskip(); } static void act98() { NLA = 31; zzskip(); } static void act99() { NLA = 32; zzline++; zzskip(); DAWDLE; } static void act100() { NLA = 33; zzskip(); } static unsigned char shift9[257] = { 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }; static void act101() { NLA = Eof; } static void act102() { NLA = Action; /* these do not nest */ zzmode(START); NLATEXT[0] = ' '; NLATEXT[1] = ' '; zzbegexpr[0] = ' '; zzbegexpr[1] = ' '; if ( zzbufovf ) { err( eMsgd("action buffer overflow; size %d",ZZLEXBUFSIZE)); } /* MR1 10-Apr-97 MR1 Previously unable to put right shift operator */ /* MR1 in DLG action */ /* MR1 Doesn't matter what kind of action it is - reset*/ tokenActionActive=0; /* MR1 */ } static void act103() { NLA = Pred; /* these do not nest */ zzmode(START); NLATEXT[0] = ' '; NLATEXT[1] = ' '; zzbegexpr[0] = '\0'; if ( zzbufovf ) { err( eMsgd("predicate buffer overflow; size %d",ZZLEXBUFSIZE)); }; #ifdef __cplusplus__ /* MR10 */ list_apply(CurActionLabels, (void (*)(void *))mark_label_used_in_sem_pred); #else #ifdef __STDC__ /* MR10 */ list_apply(CurActionLabels, (void (*)(void *))mark_label_used_in_sem_pred); #else #ifdef __USE_PROTOS /* MRxx */ list_apply(CurActionLabels, (void (*)(void *))mark_label_used_in_sem_pred); #else /* MR10 */ list_apply(CurActionLabels,mark_label_used_in_sem_pred); #endif #endif #endif } static void act104() { NLA = PassAction; if ( topint() == ']' ) { popint(); if ( istackempty() ) /* terminate action */ { zzmode(START); NLATEXT[0] = ' '; zzbegexpr[0] = ' '; if ( zzbufovf ) { err( eMsgd("parameter buffer overflow; size %d",ZZLEXBUFSIZE)); } } else { /* terminate $[..] and #[..] */ if ( GenCC ) zzreplstr("))"); else zzreplstr(")"); zzmore(); } } else if ( topint() == '|' ) { /* end of simple [...] */ popint(); zzmore(); } else zzmore(); } static void act105() { NLA = 37; zzmore(); zzreplstr(inline_set(zzbegexpr+ strlen("consumeUntil("))); } static void act106() { NLA = 38; zzmore(); } static void act107() { NLA = 39; zzline++; zzmore(); DAWDLE; } static void act108() { NLA = 40; zzmore(); } static void act109() { NLA = 41; zzmore(); } static void act110() { NLA = 42; if ( !GenCC ) {zzreplstr("zzaRet"); zzmore();} else err("$$ use invalid in C++ mode"); } static void act111() { NLA = 43; if ( !GenCC ) {zzreplstr("zzempty_attr"); zzmore();} else err("$[] use invalid in C++ mode"); } static void act112() { NLA = 44; pushint(']'); if ( !GenCC ) zzreplstr("zzconstr_attr("); else err("$[..] use invalid in C++ mode"); zzmore(); } static void act113() { NLA = 45; { static char buf[100]; numericActionLabel=1; /* MR10 */ if ( strlen(zzbegexpr)>(size_t)85 ) fatal("$i attrib ref too big"); set_orel(atoi(zzbegexpr+1), &attribsRefdFromAction); if ( !GenCC ) sprintf(buf,"zzaArg(zztasp%d,%s)", BlkLevel-1,zzbegexpr+1); else sprintf(buf,"_t%d%s", BlkLevel-1,zzbegexpr+1); zzreplstr(buf); zzmore(); UsedOldStyleAttrib = 1; if ( UsedNewStyleLabel ) err("cannot mix old-style $i with new-style labels"); } } static void act114() { NLA = 46; { static char buf[100]; numericActionLabel=1; /* MR10 */ if ( strlen(zzbegexpr)>(size_t)85 ) fatal("$i.field attrib ref too big"); zzbegexpr[strlen(zzbegexpr)-1] = ' '; set_orel(atoi(zzbegexpr+1), &attribsRefdFromAction); if ( !GenCC ) sprintf(buf,"zzaArg(zztasp%d,%s).", BlkLevel-1,zzbegexpr+1); else sprintf(buf,"_t%d%s.", BlkLevel-1,zzbegexpr+1); zzreplstr(buf); zzmore(); UsedOldStyleAttrib = 1; if ( UsedNewStyleLabel ) err("cannot mix old-style $i with new-style labels"); } } static void act115() { NLA = 47; { static char buf[100]; static char i[20], j[20]; char *p,*q; numericActionLabel=1; /* MR10 */ if (strlen(zzbegexpr)>(size_t)85) fatal("$i.j attrib ref too big"); for (p=zzbegexpr+1,q= &i[0]; *p!='.'; p++) { if ( q == &i[20] ) fatalFL("i of $i.j attrib ref too big", FileStr[CurFile], zzline ); *q++ = *p; } *q = '\0'; for (p++, q= &j[0]; *p!='\0'; p++) { if ( q == &j[20] ) fatalFL("j of $i.j attrib ref too big", FileStr[CurFile], zzline ); *q++ = *p; } *q = '\0'; if ( !GenCC ) sprintf(buf,"zzaArg(zztasp%s,%s)",i,j); else sprintf(buf,"_t%s%s",i,j); zzreplstr(buf); zzmore(); UsedOldStyleAttrib = 1; if ( UsedNewStyleLabel ) err("cannot mix old-style $i with new-style labels"); } } static void act116() { NLA = 48; { static char buf[300]; LabelEntry *el; zzbegexpr[0] = ' '; if ( CurRule != NULL && strcmp(CurRule, &zzbegexpr[1])==0 ) { if ( !GenCC ) zzreplstr("zzaRet"); } else if ( CurRetDef != NULL && strmember(CurRetDef, &zzbegexpr[1])) { if ( hasMultipleOperands( CurRetDef ) ) { require (strlen(zzbegexpr)<=(size_t)285, "$retval attrib ref too big"); sprintf(buf,"_retv.%s",&zzbegexpr[1]); zzreplstr(buf); } else zzreplstr("_retv"); } else if ( CurParmDef != NULL && strmember(CurParmDef, &zzbegexpr[1])) { ; } else if ( Elabel==NULL ) { { err("$-variables in actions outside of rules are not allowed"); } } else if ( (el=(LabelEntry *)hash_get(Elabel, &zzbegexpr[1]))!=NULL ) { /* MR10 */ /* MR10 */ /* element labels might exist without an elem when */ /* MR10 */ /* it is a forward reference (to a rule) */ /* MR10 */ /* MR10 */ if ( GenCC && (el->elem == NULL || el->elem->ntype==nRuleRef) ) /* MR10 */ { err(eMsg1("There are no token ptrs for rule references: '$%s'",&zzbegexpr[1])); } /* MR10 */ /* MR10 */ if ( !GenCC && (el->elem == NULL || el->elem->ntype==nRuleRef) && GenAST) { /* MR10 */ err("You can no longer use attributes returned by rules when also using ASTs"); /* MR10 */ err(" Use upward inheritance (\"rule >[Attrib a] : ... <<$a=...>>\")"); /* MR10 */ }; /* MR10 */ /* MR10 */ /* keep track of <<... $label ...>> for semantic predicates in guess mode */ /* MR10 */ /* element labels contain pointer to the owners node */ /* MR10 */ /* MR10 */ if (el->elem != NULL && el->elem->ntype == nToken) { /* MR10 */ list_add(&CurActionLabels,el); /* MR10 */ }; } else warn(eMsg1("$%s not parameter, return value, (defined) element label",&zzbegexpr[1])); } zzmore(); } static void act117() { NLA = 49; zzreplstr("(*_root)"); zzmore(); chkGTFlag(); } static void act118() { NLA = 50; if ( GenCC ) { if (NewAST) zzreplstr("(newAST)"); else zzreplstr("(new AST)");} else {zzreplstr("zzastnew()");} zzmore(); chkGTFlag(); } static void act119() { NLA = 51; zzreplstr("NULL"); zzmore(); chkGTFlag(); } static void act120() { NLA = 52; { static char buf[100]; if ( strlen(zzbegexpr)>(size_t)85 ) fatal("#i AST ref too big"); if ( GenCC ) sprintf(buf,"_ast%d%s",BlkLevel-1,zzbegexpr+1); else sprintf(buf,"zzastArg(%s)",zzbegexpr+1); zzreplstr(buf); zzmore(); set_orel(atoi(zzbegexpr+1), &AST_nodes_refd_in_actions); chkGTFlag(); } } static void act121() { NLA = 53; zzline = atoi(zzbegexpr+5) - 1; zzline++; zzmore(); getFileNameFromTheLineInfo(FileStr[CurFile], zzbegexpr); } static void act122() { NLA = 54; zzline++; zzmore(); } static void act123() { NLA = 55; if ( !(strcmp(zzbegexpr, "#ifdef")==0 || strcmp(zzbegexpr, "#if")==0 || strcmp(zzbegexpr, "#else")==0 || strcmp(zzbegexpr, "#endif")==0 || strcmp(zzbegexpr, "#ifndef")==0 || strcmp(zzbegexpr, "#define")==0 || strcmp(zzbegexpr, "#pragma")==0 || strcmp(zzbegexpr, "#undef")==0 || strcmp(zzbegexpr, "#import")==0 || strcmp(zzbegexpr, "#line")==0 || strcmp(zzbegexpr, "#include")==0 || strcmp(zzbegexpr, "#error")==0) ) { static char buf[100]; sprintf(buf, "%s_ast", zzbegexpr+1); /* MR27 */ list_add(&CurAstLabelsInActions, mystrdup(zzbegexpr+1)); zzreplstr(buf); chkGTFlag(); } zzmore(); } static void act124() { NLA = 56; pushint(']'); if ( GenCC ) { if (NewAST) zzreplstr("(newAST("); else zzreplstr("(new AST("); } else zzreplstr("zzmk_ast(zzastnew(),"); zzmore(); chkGTFlag(); } static void act125() { NLA = 57; pushint('}'); if ( GenCC ) { if (tmakeInParser) { zzreplstr("tmake("); } else { zzreplstr("ASTBase::tmake("); } } else { zzreplstr("zztmake("); } zzmore(); chkGTFlag(); } static void act126() { NLA = 58; zzmore(); } static void act127() { NLA = 59; if ( istackempty() ) zzmore(); else if ( topint()==')' ) { popint(); } else if ( topint()=='}' ) { popint(); /* terminate #(..) */ zzreplstr(", NULL)"); } zzmore(); } static void act128() { NLA = 60; pushint('|'); /* look for '|' to terminate simple [...] */ zzmore(); } static void act129() { NLA = 61; pushint(')'); zzmore(); } static void act130() { NLA = 62; zzreplstr("]"); zzmore(); } static void act131() { NLA = 63; zzreplstr(")"); zzmore(); } static void act132() { NLA = 64; if (! tokenActionActive) zzreplstr(">"); /* MR1 */ zzmore(); /* MR1 */ } static void act133() { NLA = 65; zzmode(ACTION_CHARS); zzmore(); } static void act134() { NLA = 66; zzmode(ACTION_STRINGS); zzmore(); } static void act135() { NLA = 67; zzreplstr("$"); zzmore(); } static void act136() { NLA = 68; zzreplstr("#"); zzmore(); } static void act137() { NLA = 69; zzline++; zzmore(); } static void act138() { NLA = 70; zzmore(); } static void act139() { NLA = 71; zzmore(); } static void act140() { NLA = 72; zzmode(ACTION_COMMENTS); zzmore(); } static void act141() { NLA = 73; warn("Missing /*; found dangling */ in action"); zzmore(); } static void act142() { NLA = 74; zzmode(ACTION_CPP_COMMENTS); zzmore(); } static void act143() { NLA = 75; zzmore(); } static unsigned char shift10[257] = { 0, 33, 33, 33, 33, 33, 33, 33, 33, 33, 16, 19, 33, 33, 20, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 16, 33, 28, 27, 21, 33, 33, 30, 15, 18, 32, 33, 33, 33, 25, 31, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 33, 33, 33, 33, 1, 2, 33, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 11, 26, 26, 26, 26, 26, 22, 29, 3, 33, 26, 33, 26, 26, 4, 26, 10, 26, 26, 26, 13, 26, 26, 14, 9, 6, 5, 26, 26, 26, 7, 12, 8, 26, 26, 26, 26, 26, 17, 33, 34, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33 }; static void act144() { NLA = Eof; ; } static void act145() { NLA = 137; zzskip(); } static void act146() { NLA = 138; zzline++; zzskip(); } static void act147() { NLA = 139; zzmode(TOK_DEF_CPP_COMMENTS); zzmore(); } static void act148() { NLA = 140; zzmode(TOK_DEF_COMMENTS); zzskip(); } static void act149() { NLA = 141; zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); } static void act150() { NLA = 142; zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); } static void act151() { NLA = 143; ; } static void act152() { NLA = 144; zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); } static void act153() { NLA = 145; zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); } static void act154() { NLA = 146; zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); } static void act155() { NLA = 147; zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); } static void act156() { NLA = 149; } static void act157() { NLA = 151; } static void act158() { NLA = 152; } static void act159() { NLA = 153; } static void act160() { NLA = 154; } static void act161() { NLA = 155; } static void act162() { NLA = 156; } static void act163() { NLA = INT; } static void act164() { NLA = ID; } static unsigned char shift11[257] = { 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 1, 2, 27, 27, 3, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 1, 27, 27, 6, 27, 27, 27, 27, 27, 27, 5, 27, 22, 27, 27, 4, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 27, 24, 27, 21, 27, 27, 27, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 26, 27, 26, 26, 26, 9, 10, 8, 26, 26, 7, 26, 26, 12, 15, 11, 17, 16, 26, 18, 13, 19, 14, 26, 26, 26, 26, 26, 20, 27, 23, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27 }; #define DfaStates 436 typedef unsigned short DfaState; static DfaState st0[60] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 11, 12, 13, 13, 13, 14, 15, 16, 17, 11, 11, 18, 11, 11, 19, 11, 11, 19, 11, 11, 11, 11, 20, 11, 11, 21, 22, 23, 24, 25, 26, 11, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 11, 11, 19, 436, 436, 436 }; static DfaState st1[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st2[60] = { 436, 2, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st3[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st4[60] = { 436, 436, 37, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st5[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st6[60] = { 436, 436, 436, 436, 436, 38, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st7[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st8[60] = { 436, 436, 436, 436, 436, 436, 436, 39, 40, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st9[60] = { 436, 436, 436, 436, 436, 436, 436, 41, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st10[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 42, 43, 43, 44, 43, 43, 43, 436, 436, 436, 436, 45, 43, 43, 43, 43, 46, 43, 47, 43, 43, 43, 43, 48, 43, 49, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st11[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st12[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 51, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st13[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 13, 13, 13, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st14[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 52, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st15[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 53, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st16[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st17[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 54, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st18[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 55, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st19[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 56, 56, 56, 56, 56, 56, 56, 436, 436, 436, 436, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 436, 56, 436, 436, 436, 436, 56, 436, 436, 436, 436, 436, 436, 436, 56, 436, 436, 56, 56, 56, 56, 436, 436 }; static DfaState st20[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 57, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st21[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st22[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 58, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 59, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st23[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st24[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st25[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st26[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st27[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 60, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st28[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 61, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st29[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st30[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st31[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 62, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st32[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st33[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st34[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 56, 56, 56, 56, 56, 56, 56, 436, 436, 436, 436, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 436, 56, 436, 436, 436, 436, 56, 436, 436, 436, 436, 436, 436, 436, 63, 436, 436, 56, 56, 56, 56, 436, 436 }; static DfaState st35[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st36[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st37[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st38[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st39[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st40[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st41[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st42[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 64, 43, 65, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st43[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st44[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 66, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st45[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 67, 68, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st46[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 69, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st47[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 70, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st48[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 71, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st49[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 72, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st50[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st51[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 73, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st52[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st53[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st54[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 74, 43, 43, 44, 43, 43, 43, 436, 436, 436, 436, 45, 43, 43, 43, 43, 46, 43, 47, 43, 43, 43, 43, 48, 43, 49, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st55[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 75, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st56[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 56, 56, 56, 56, 56, 56, 56, 436, 436, 436, 436, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 436, 56, 436, 436, 436, 436, 56, 436, 436, 436, 436, 436, 436, 436, 56, 436, 436, 56, 56, 56, 56, 436, 436 }; static DfaState st57[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 76, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st58[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 77, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st59[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 78, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st60[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st61[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st62[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st63[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 56, 56, 56, 56, 56, 56, 56, 436, 436, 436, 436, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 436, 56, 436, 436, 436, 436, 56, 436, 436, 79, 436, 436, 436, 436, 56, 436, 436, 56, 56, 56, 56, 436, 436 }; static DfaState st64[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 80, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st65[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 81, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st66[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 82, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st67[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 83, 43, 43, 43, 436, 436, 436, 436, 43, 43, 84, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st68[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 85, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st69[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 86, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st70[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 87, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st71[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 88, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st72[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 89, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st73[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 90, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st74[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 65, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st75[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 91, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st76[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 92, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st77[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 93, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st78[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 94, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st79[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 95, 96, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st80[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 97, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st81[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 98, 43, 99, 43, 100, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 101, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st82[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 102, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st83[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 103, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st84[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 104, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st85[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 105, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st86[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 106, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st87[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 107, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 108, 43, 43, 436, 109, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st88[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 110, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st89[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 111, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st90[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 112, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st91[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 113, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st92[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 114, 50, 50, 50, 436, 436 }; static DfaState st93[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 115, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st94[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 116, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st95[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 117, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st96[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 118, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st97[60] = { 436, 119, 120, 121, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 124, 124, 124, 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 122, 123, 122, 122, 122, 122, 123, 122, 122, 122, 122, 122, 122, 122, 123, 122, 122, 123, 123, 123, 123, 122, 436 }; static DfaState st98[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 125, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st99[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 126, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st100[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 127, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st101[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 128, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st102[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 129, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st103[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st104[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 130, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st105[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 131, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st106[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 132, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st107[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 133, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st108[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 134, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st109[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 135, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st110[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 136, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st111[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 137, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st112[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 138, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st113[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 139, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st114[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 140, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st115[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st116[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st117[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st118[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st119[60] = { 436, 119, 120, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 141, 141, 141, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 436 }; static DfaState st120[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st121[60] = { 436, 436, 142, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st122[60] = { 436, 122, 120, 121, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 436 }; static DfaState st123[60] = { 436, 122, 120, 121, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 122, 123, 122, 122, 122, 122, 123, 122, 122, 122, 122, 122, 122, 122, 123, 122, 122, 123, 123, 123, 123, 122, 436 }; static DfaState st124[60] = { 436, 143, 144, 145, 122, 122, 146, 122, 122, 122, 123, 123, 123, 123, 124, 124, 124, 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 122, 123, 122, 122, 122, 122, 123, 122, 122, 122, 122, 122, 122, 122, 123, 122, 122, 123, 123, 123, 123, 122, 436 }; static DfaState st125[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 147, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st126[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 148, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st127[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 149, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st128[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 150, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st129[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 151, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st130[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 152, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st131[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 153, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st132[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 154, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st133[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st134[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 155, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st135[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 156, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st136[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 157, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st137[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st138[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 158, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st139[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st140[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 159, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st141[60] = { 436, 143, 144, 145, 122, 122, 146, 122, 122, 122, 122, 122, 122, 122, 141, 141, 141, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 436 }; static DfaState st142[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st143[60] = { 436, 143, 120, 121, 122, 122, 146, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 436 }; static DfaState st144[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st145[60] = { 436, 436, 160, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st146[60] = { 436, 161, 162, 163, 161, 161, 122, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 436 }; static DfaState st147[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 164, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st148[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 165, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st149[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 166, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st150[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 167, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st151[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 168, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st152[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st153[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st154[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 169, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st155[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 170, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st156[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 171, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st157[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st158[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 172, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st159[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st160[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st161[60] = { 436, 161, 162, 163, 161, 161, 173, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 436 }; static DfaState st162[60] = { 436, 174, 174, 174, 174, 174, 175, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 436 }; static DfaState st163[60] = { 436, 174, 176, 174, 174, 174, 175, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 436 }; static DfaState st164[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 177, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st165[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 178, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st166[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 179, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st167[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 180, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st168[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 181, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st169[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 182, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st170[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st171[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 183, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st172[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 184, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st173[60] = { 436, 185, 144, 145, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 186, 186, 186, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 436 }; static DfaState st174[60] = { 436, 174, 174, 174, 174, 174, 175, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 436 }; static DfaState st175[60] = { 436, 187, 188, 189, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 190, 190, 190, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st176[60] = { 436, 174, 174, 174, 174, 174, 175, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 436 }; static DfaState st177[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 191, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st178[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 192, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st179[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 193, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st180[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st181[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st182[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 194, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st183[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st184[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 436, 436, 436, 436, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 436, 50, 436, 436, 436, 436, 50, 436, 436, 436, 436, 436, 436, 436, 50, 436, 436, 50, 50, 50, 50, 436, 436 }; static DfaState st185[60] = { 436, 185, 144, 145, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 186, 186, 186, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 436 }; static DfaState st186[60] = { 436, 185, 144, 145, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 186, 186, 186, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 436 }; static DfaState st187[60] = { 436, 187, 188, 189, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 190, 190, 190, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st188[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st189[60] = { 436, 436, 195, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st190[60] = { 436, 187, 188, 189, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 190, 190, 190, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st191[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st192[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st193[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st194[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 196, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st195[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st196[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 197, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st197[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 198, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st198[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 199, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st199[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 200, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st200[60] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 436, 436, 436, 436, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 436, 43, 436, 436, 436, 436, 43, 436, 436, 436, 436, 436, 436, 436, 43, 436, 436, 43, 43, 43, 43, 436, 436 }; static DfaState st201[7] = { 202, 203, 204, 205, 206, 207, 436 }; static DfaState st202[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st203[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st204[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st205[7] = { 436, 436, 208, 436, 436, 436, 436 }; static DfaState st206[7] = { 436, 209, 210, 211, 209, 209, 436 }; static DfaState st207[7] = { 436, 436, 436, 436, 436, 207, 436 }; static DfaState st208[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st209[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st210[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st211[7] = { 436, 436, 212, 436, 436, 436, 436 }; static DfaState st212[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st213[7] = { 214, 215, 216, 217, 218, 219, 436 }; static DfaState st214[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st215[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st216[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st217[7] = { 436, 436, 220, 436, 436, 436, 436 }; static DfaState st218[7] = { 436, 221, 222, 223, 221, 221, 436 }; static DfaState st219[7] = { 436, 436, 436, 436, 436, 219, 436 }; static DfaState st220[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st221[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st222[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st223[7] = { 436, 436, 224, 436, 436, 436, 436 }; static DfaState st224[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st225[7] = { 226, 227, 228, 229, 230, 231, 436 }; static DfaState st226[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st227[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st228[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st229[7] = { 436, 436, 232, 436, 436, 436, 436 }; static DfaState st230[7] = { 436, 233, 233, 233, 233, 233, 436 }; static DfaState st231[7] = { 436, 436, 436, 436, 436, 231, 436 }; static DfaState st232[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st233[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st234[7] = { 235, 236, 237, 238, 239, 237, 436 }; static DfaState st235[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st236[7] = { 436, 436, 240, 436, 436, 436, 436 }; static DfaState st237[7] = { 436, 436, 237, 436, 436, 237, 436 }; static DfaState st238[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st239[7] = { 436, 436, 436, 241, 436, 436, 436 }; static DfaState st240[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st241[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st242[7] = { 243, 244, 245, 246, 247, 245, 436 }; static DfaState st243[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st244[7] = { 436, 436, 248, 436, 436, 436, 436 }; static DfaState st245[7] = { 436, 436, 245, 436, 436, 245, 436 }; static DfaState st246[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st247[7] = { 436, 436, 436, 249, 436, 436, 436 }; static DfaState st248[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st249[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st250[5] = { 251, 252, 253, 254, 436 }; static DfaState st251[5] = { 436, 436, 436, 436, 436 }; static DfaState st252[5] = { 436, 436, 436, 436, 436 }; static DfaState st253[5] = { 436, 255, 436, 436, 436 }; static DfaState st254[5] = { 436, 436, 436, 254, 436 }; static DfaState st255[5] = { 436, 436, 436, 436, 436 }; static DfaState st256[5] = { 257, 258, 259, 260, 436 }; static DfaState st257[5] = { 436, 436, 436, 436, 436 }; static DfaState st258[5] = { 436, 436, 436, 436, 436 }; static DfaState st259[5] = { 436, 261, 436, 436, 436 }; static DfaState st260[5] = { 436, 436, 436, 260, 436 }; static DfaState st261[5] = { 436, 436, 436, 436, 436 }; static DfaState st262[5] = { 263, 264, 265, 266, 436 }; static DfaState st263[5] = { 436, 436, 436, 436, 436 }; static DfaState st264[5] = { 436, 436, 436, 436, 436 }; static DfaState st265[5] = { 436, 267, 436, 436, 436 }; static DfaState st266[5] = { 436, 436, 436, 266, 436 }; static DfaState st267[5] = { 436, 436, 436, 436, 436 }; static DfaState st268[7] = { 269, 270, 271, 272, 273, 271, 436 }; static DfaState st269[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st270[7] = { 436, 436, 274, 436, 436, 436, 436 }; static DfaState st271[7] = { 436, 436, 271, 436, 436, 271, 436 }; static DfaState st272[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st273[7] = { 436, 436, 436, 275, 436, 436, 436 }; static DfaState st274[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st275[7] = { 436, 436, 436, 436, 436, 436, 436 }; static DfaState st276[36] = { 277, 278, 279, 280, 281, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 282, 279, 279, 283, 284, 285, 286, 287, 279, 279, 279, 279, 288, 289, 290, 291, 292, 293, 279, 279, 436 }; static DfaState st277[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st278[36] = { 436, 294, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st279[36] = { 436, 436, 279, 436, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 436, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 436 }; static DfaState st280[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st281[36] = { 436, 436, 279, 436, 279, 295, 279, 279, 279, 279, 279, 279, 279, 279, 279, 436, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 436 }; static DfaState st282[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st283[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st284[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st285[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 296, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st286[36] = { 436, 436, 436, 436, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 436, 436, 436, 436, 436, 436, 298, 299, 300, 300, 436, 297, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st287[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st288[36] = { 436, 436, 436, 436, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 302, 303, 436, 436, 436, 436, 436, 436, 304, 305, 306, 436, 301, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st289[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st290[36] = { 436, 307, 308, 309, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 310, 311, 312, 313, 308, 308, 308, 308, 308, 314, 308, 308, 308, 308, 308, 308, 308, 436 }; static DfaState st291[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st292[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 315, 316, 436, 436, 436 }; static DfaState st293[36] = { 436, 436, 279, 436, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 436, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 279, 436, 436, 436, 436, 317, 279, 279, 279, 436 }; static DfaState st294[36] = { 436, 436, 318, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st295[36] = { 436, 436, 279, 436, 279, 279, 319, 279, 279, 279, 279, 279, 279, 279, 279, 436, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 436 }; static DfaState st296[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st297[36] = { 436, 436, 436, 436, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 436, 436, 436, 436, 436, 436, 436, 436, 320, 320, 436, 320, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st298[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st299[36] = { 436, 436, 436, 321, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st300[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 300, 300, 322, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st301[36] = { 436, 436, 436, 436, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 436, 436, 436, 436, 436, 436, 436, 436, 323, 323, 436, 323, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st302[36] = { 436, 436, 436, 436, 323, 323, 323, 323, 323, 323, 323, 323, 323, 324, 323, 436, 436, 436, 436, 436, 436, 436, 436, 323, 323, 436, 323, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st303[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 325, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st304[36] = { 436, 436, 436, 326, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st305[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 306, 306, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st306[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 306, 306, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st307[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st308[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st309[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st310[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st311[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st312[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 327, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st313[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st314[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st315[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st316[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st317[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st318[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st319[36] = { 436, 436, 279, 436, 279, 279, 279, 328, 279, 279, 279, 279, 279, 279, 279, 436, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 436 }; static DfaState st320[36] = { 436, 436, 436, 436, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 436, 436, 436, 436, 436, 436, 436, 436, 320, 320, 436, 320, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st321[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st322[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 329, 329, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st323[36] = { 436, 436, 436, 436, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 436, 436, 436, 436, 436, 436, 436, 436, 323, 323, 436, 323, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st324[36] = { 436, 436, 436, 436, 323, 323, 330, 323, 323, 323, 323, 323, 323, 323, 323, 436, 436, 436, 436, 436, 436, 436, 436, 323, 323, 436, 323, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st325[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st326[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st327[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st328[36] = { 436, 436, 279, 436, 279, 279, 279, 279, 331, 279, 279, 279, 279, 279, 279, 436, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 436 }; static DfaState st329[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 329, 329, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st330[36] = { 436, 436, 436, 436, 323, 323, 323, 323, 323, 323, 332, 323, 323, 323, 323, 436, 436, 436, 436, 436, 436, 436, 436, 323, 323, 436, 323, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st331[36] = { 436, 436, 279, 436, 279, 279, 279, 279, 279, 333, 279, 279, 279, 279, 279, 436, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 436 }; static DfaState st332[36] = { 436, 334, 334, 334, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 334, 336, 334, 334, 337, 338, 334, 334, 339, 339, 334, 335, 334, 334, 334, 334, 334, 334, 334, 334, 436 }; static DfaState st333[36] = { 436, 436, 279, 436, 279, 279, 279, 279, 279, 279, 340, 279, 279, 279, 279, 436, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 436 }; static DfaState st334[36] = { 436, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 337, 338, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 436 }; static DfaState st335[36] = { 436, 334, 334, 334, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 334, 334, 334, 334, 337, 338, 334, 334, 335, 335, 334, 335, 334, 334, 334, 334, 334, 334, 334, 334, 436 }; static DfaState st336[36] = { 436, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 336, 334, 334, 337, 338, 334, 334, 341, 341, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 436 }; static DfaState st337[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st338[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 342, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st339[36] = { 436, 334, 334, 334, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 334, 343, 334, 334, 344, 345, 334, 334, 339, 339, 334, 335, 334, 346, 334, 334, 334, 334, 334, 334, 436 }; static DfaState st340[36] = { 436, 436, 279, 436, 279, 279, 279, 279, 279, 279, 279, 347, 279, 279, 279, 436, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 436 }; static DfaState st341[36] = { 436, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 343, 334, 334, 344, 345, 334, 334, 341, 341, 334, 334, 334, 346, 334, 334, 334, 334, 334, 334, 436 }; static DfaState st342[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st343[36] = { 436, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 343, 334, 334, 337, 338, 334, 334, 334, 334, 334, 334, 334, 346, 334, 334, 334, 334, 334, 334, 436 }; static DfaState st344[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st345[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 348, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st346[36] = { 436, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 350, 351, 349, 349, 349, 349, 349, 349, 349, 334, 349, 349, 349, 349, 349, 349, 436 }; static DfaState st347[36] = { 436, 436, 279, 436, 279, 279, 352, 279, 279, 279, 279, 279, 279, 279, 279, 436, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 436 }; static DfaState st348[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st349[36] = { 436, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 350, 351, 349, 349, 349, 349, 349, 349, 349, 353, 349, 349, 349, 349, 349, 349, 436 }; static DfaState st350[36] = { 436, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 355, 354, 354, 354, 354, 354, 354, 436 }; static DfaState st351[36] = { 436, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 356, 354, 354, 354, 354, 354, 354, 354, 354, 355, 354, 354, 354, 354, 354, 354, 436 }; static DfaState st352[36] = { 436, 436, 279, 436, 279, 279, 279, 279, 279, 279, 279, 279, 357, 279, 279, 436, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 436 }; static DfaState st353[36] = { 436, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 358, 334, 334, 344, 345, 334, 334, 359, 359, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 436 }; static DfaState st354[36] = { 436, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 355, 354, 354, 354, 354, 354, 354, 436 }; static DfaState st355[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 360, 436, 436, 361, 362, 436, 436, 363, 363, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st356[36] = { 436, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 355, 354, 354, 354, 354, 354, 354, 436 }; static DfaState st357[36] = { 436, 436, 279, 436, 279, 279, 279, 279, 279, 279, 279, 279, 279, 364, 279, 436, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 436 }; static DfaState st358[36] = { 436, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 358, 334, 334, 344, 345, 334, 334, 359, 359, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 436 }; static DfaState st359[36] = { 436, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 358, 334, 334, 344, 345, 334, 334, 359, 359, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 436 }; static DfaState st360[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 360, 436, 436, 361, 362, 436, 436, 363, 363, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st361[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st362[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 365, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st363[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 360, 436, 436, 361, 362, 436, 436, 363, 363, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st364[36] = { 436, 436, 279, 436, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 366, 436, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 436 }; static DfaState st365[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st366[36] = { 436, 436, 279, 436, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 367, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 279, 436, 436, 436, 436, 436, 279, 279, 279, 436 }; static DfaState st367[36] = { 436, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 369, 370, 436, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 436 }; static DfaState st368[36] = { 436, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 371, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 436 }; static DfaState st369[36] = { 436, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 369, 370, 371, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 436 }; static DfaState st370[36] = { 436, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 373, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 368, 436 }; static DfaState st371[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st372[36] = { 436, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 373, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 374, 436 }; static DfaState st373[36] = { 436, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 376, 436 }; static DfaState st374[36] = { 436, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 377, 368, 378, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 436 }; static DfaState st375[36] = { 436, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 376, 436 }; static DfaState st376[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 379, 436, 380, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st377[36] = { 436, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 377, 368, 378, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 436 }; static DfaState st378[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st379[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 379, 436, 380, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st380[36] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st381[28] = { 382, 383, 384, 385, 386, 436, 387, 388, 388, 388, 389, 388, 388, 388, 388, 388, 388, 388, 388, 388, 390, 391, 392, 393, 394, 395, 388, 436 }; static DfaState st382[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st383[28] = { 436, 383, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st384[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st385[28] = { 436, 436, 396, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st386[28] = { 436, 436, 436, 436, 397, 398, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st387[28] = { 436, 436, 436, 436, 436, 436, 436, 399, 436, 400, 401, 436, 436, 436, 402, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st388[28] = { 436, 436, 436, 436, 436, 436, 436, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 436, 436, 436, 436, 436, 403, 403, 436 }; static DfaState st389[28] = { 436, 436, 436, 436, 436, 436, 436, 403, 403, 403, 403, 404, 403, 403, 403, 403, 403, 403, 403, 403, 436, 436, 436, 436, 436, 403, 403, 436 }; static DfaState st390[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st391[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st392[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st393[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st394[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st395[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 395, 436, 436 }; static DfaState st396[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st397[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st398[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st399[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 405, 436, 436, 436, 436, 436, 436, 406, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st400[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 407, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st401[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 408, 409, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st402[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 410, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st403[28] = { 436, 436, 436, 436, 436, 436, 436, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 436, 436, 436, 436, 436, 403, 403, 436 }; static DfaState st404[28] = { 436, 436, 436, 436, 436, 436, 436, 403, 403, 403, 403, 403, 403, 403, 411, 403, 403, 403, 403, 403, 436, 436, 436, 436, 436, 403, 403, 436 }; static DfaState st405[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 412, 436, 413, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st406[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 414, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st407[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 415, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st408[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 416, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st409[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 417, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st410[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 418, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st411[28] = { 436, 436, 436, 436, 436, 436, 436, 403, 403, 403, 403, 403, 403, 403, 403, 419, 403, 403, 403, 403, 436, 436, 436, 436, 436, 403, 403, 436 }; static DfaState st412[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 420, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st413[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 421, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st414[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 422, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st415[28] = { 436, 436, 436, 436, 436, 436, 436, 423, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st416[28] = { 436, 436, 436, 436, 436, 436, 436, 424, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st417[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 425, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st418[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 426, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st419[28] = { 436, 436, 436, 436, 436, 436, 436, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 436, 436, 436, 436, 436, 403, 403, 436 }; static DfaState st420[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 427, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st421[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 428, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st422[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 429, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st423[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 430, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st424[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 431, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st425[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st426[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 432, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st427[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st428[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 433, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st429[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 434, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st430[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 435, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st431[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st432[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st433[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st434[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; static DfaState st435[28] = { 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436 }; DfaState *dfa[436] = { st0, st1, st2, st3, st4, st5, st6, st7, st8, st9, st10, st11, st12, st13, st14, st15, st16, st17, st18, st19, st20, st21, st22, st23, st24, st25, st26, st27, st28, st29, st30, st31, st32, st33, st34, st35, st36, st37, st38, st39, st40, st41, st42, st43, st44, st45, st46, st47, st48, st49, st50, st51, st52, st53, st54, st55, st56, st57, st58, st59, st60, st61, st62, st63, st64, st65, st66, st67, st68, st69, st70, st71, st72, st73, st74, st75, st76, st77, st78, st79, st80, st81, st82, st83, st84, st85, st86, st87, st88, st89, st90, st91, st92, st93, st94, st95, st96, st97, st98, st99, st100, st101, st102, st103, st104, st105, st106, st107, st108, st109, st110, st111, st112, st113, st114, st115, st116, st117, st118, st119, st120, st121, st122, st123, st124, st125, st126, st127, st128, st129, st130, st131, st132, st133, st134, st135, st136, st137, st138, st139, st140, st141, st142, st143, st144, st145, st146, st147, st148, st149, st150, st151, st152, st153, st154, st155, st156, st157, st158, st159, st160, st161, st162, st163, st164, st165, st166, st167, st168, st169, st170, st171, st172, st173, st174, st175, st176, st177, st178, st179, st180, st181, st182, st183, st184, st185, st186, st187, st188, st189, st190, st191, st192, st193, st194, st195, st196, st197, st198, st199, st200, st201, st202, st203, st204, st205, st206, st207, st208, st209, st210, st211, st212, st213, st214, st215, st216, st217, st218, st219, st220, st221, st222, st223, st224, st225, st226, st227, st228, st229, st230, st231, st232, st233, st234, st235, st236, st237, st238, st239, st240, st241, st242, st243, st244, st245, st246, st247, st248, st249, st250, st251, st252, st253, st254, st255, st256, st257, st258, st259, st260, st261, st262, st263, st264, st265, st266, st267, st268, st269, st270, st271, st272, st273, st274, st275, st276, st277, st278, st279, st280, st281, st282, st283, st284, st285, st286, st287, st288, st289, st290, st291, st292, st293, st294, st295, st296, st297, st298, st299, st300, st301, st302, st303, st304, st305, st306, st307, st308, st309, st310, st311, st312, st313, st314, st315, st316, st317, st318, st319, st320, st321, st322, st323, st324, st325, st326, st327, st328, st329, st330, st331, st332, st333, st334, st335, st336, st337, st338, st339, st340, st341, st342, st343, st344, st345, st346, st347, st348, st349, st350, st351, st352, st353, st354, st355, st356, st357, st358, st359, st360, st361, st362, st363, st364, st365, st366, st367, st368, st369, st370, st371, st372, st373, st374, st375, st376, st377, st378, st379, st380, st381, st382, st383, st384, st385, st386, st387, st388, st389, st390, st391, st392, st393, st394, st395, st396, st397, st398, st399, st400, st401, st402, st403, st404, st405, st406, st407, st408, st409, st410, st411, st412, st413, st414, st415, st416, st417, st418, st419, st420, st421, st422, st423, st424, st425, st426, st427, st428, st429, st430, st431, st432, st433, st434, st435 }; DfaState accepts[437] = { 0, 1, 2, 3, 3, 4, 25, 6, 0, 50, 59, 57, 57, 43, 26, 13, 14, 0, 57, 58, 57, 21, 57, 23, 24, 27, 28, 44, 0, 35, 36, 42, 45, 46, 58, 51, 52, 3, 5, 9, 7, 8, 59, 59, 59, 59, 59, 59, 59, 59, 57, 57, 12, 40, 59, 57, 58, 57, 57, 57, 33, 34, 53, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 57, 59, 57, 57, 57, 57, 0, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 57, 57, 57, 57, 57, 0, 0, 59, 59, 59, 59, 59, 59, 32, 59, 59, 59, 59, 59, 59, 59, 59, 57, 57, 57, 22, 56, 48, 49, 0, 11, 11, 0, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 41, 59, 59, 59, 18, 57, 47, 57, 0, 11, 0, 10, 10, 0, 59, 59, 59, 59, 59, 15, 19, 59, 59, 59, 17, 57, 55, 10, 0, 11, 11, 59, 59, 59, 59, 59, 59, 20, 59, 57, 0, 0, 0, 11, 59, 59, 59, 37, 38, 59, 39, 54, 0, 0, 0, 10, 10, 0, 31, 29, 30, 59, 10, 59, 59, 59, 59, 16, 0, 60, 61, 62, 62, 0, 65, 62, 64, 63, 63, 63, 0, 66, 67, 68, 68, 0, 71, 68, 70, 69, 69, 69, 0, 72, 73, 74, 74, 0, 76, 74, 75, 0, 77, 79, 81, 80, 80, 78, 80, 0, 82, 84, 86, 85, 85, 83, 85, 0, 87, 88, 88, 89, 88, 0, 90, 91, 91, 92, 91, 0, 93, 94, 94, 95, 94, 0, 96, 98, 100, 99, 99, 97, 99, 0, 101, 108, 143, 104, 143, 129, 127, 107, 107, 109, 128, 126, 134, 0, 133, 139, 143, 102, 143, 107, 116, 110, 112, 113, 123, 123, 125, 124, 117, 120, 132, 138, 130, 131, 137, 137, 135, 136, 142, 140, 141, 103, 143, 116, 111, 114, 123, 123, 119, 118, 137, 143, 115, 123, 143, 123, 143, 0, 123, 0, 122, 122, 123, 143, 0, 122, 0, 121, 121, 0, 143, 121, 0, 122, 122, 143, 0, 0, 0, 122, 143, 0, 0, 0, 121, 121, 0, 143, 121, 143, 0, 0, 0, 0, 106, 0, 106, 0, 0, 0, 0, 105, 0, 105, 0, 144, 145, 146, 146, 0, 0, 164, 164, 158, 159, 160, 161, 162, 163, 146, 147, 148, 0, 0, 0, 0, 164, 164, 150, 0, 0, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 0, 157, 0, 0, 0, 0, 0, 152, 0, 149, 0, 0, 0, 153, 154, 151, 155, 156, 0 }; void (*actions[165])() = { zzerraction, act1, act2, act3, act4, act5, act6, act7, act8, act9, act10, act11, act12, act13, act14, act15, act16, act17, act18, act19, act20, act21, act22, act23, act24, act25, act26, act27, act28, act29, act30, act31, act32, act33, act34, act35, act36, act37, act38, act39, act40, act41, act42, act43, act44, act45, act46, act47, act48, act49, act50, act51, act52, act53, act54, act55, act56, act57, act58, act59, act60, act61, act62, act63, act64, act65, act66, act67, act68, act69, act70, act71, act72, act73, act74, act75, act76, act77, act78, act79, act80, act81, act82, act83, act84, act85, act86, act87, act88, act89, act90, act91, act92, act93, act94, act95, act96, act97, act98, act99, act100, act101, act102, act103, act104, act105, act106, act107, act108, act109, act110, act111, act112, act113, act114, act115, act116, act117, act118, act119, act120, act121, act122, act123, act124, act125, act126, act127, act128, act129, act130, act131, act132, act133, act134, act135, act136, act137, act138, act139, act140, act141, act142, act143, act144, act145, act146, act147, act148, act149, act150, act151, act152, act153, act154, act155, act156, act157, act158, act159, act160, act161, act162, act163, act164 }; static DfaState dfa_base[] = { 0, 201, 213, 225, 234, 242, 250, 256, 262, 268, 276, 381 }; static unsigned char *b_class_no[] = { shift0, shift1, shift2, shift3, shift4, shift5, shift6, shift7, shift8, shift9, shift10, shift11 }; #define ZZSHIFT(c) (b_class_no[zzauto][1+c]) #define MAX_MODE 12 #include "dlgauto.h" gtkwave-3.3.86/contrib/pccts/antlr/mrhoist.c0000664000175000017500000023370613166335473020344 0ustar bybellbybell/* * mrhoist.c * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * ANTLR 1.33MR10 * */ #include #include "pcctscfg.h" #include "set.h" #include "syn.h" #include "hash.h" #include "generic.h" #include "dlgdef.h" #include #ifdef __USE_PROTOS void dumppred(Predicate *); #else void dumppred(); #endif /* Try to determine whether predicate "first" is true for all cases where "second" is true. Comparison takes place without regard to context. Assumes that predicate symbols have been expanded. Assumes that there are no NAND or NOR nodes */ #ifdef __USE_PROTOS int MR_secondPredicateUnreachable(Predicate *first,Predicate *second) #else int MR_secondPredicateUnreachable(first,second) Predicate *first; Predicate *second; #endif { Predicate *f; Predicate *s; if (first == NULL) { return 1; } else if (second == NULL) { return 0; } else if (first->down == NULL && second->down == NULL) { if (first->source == second->source && first->inverted == second->inverted) { return 1; /* look identical - will never reach alt2 */ } else { return 0; /* look different */ }; } else if (first->down == NULL && second->down != NULL) { if (second->expr == PRED_AND_LIST) { /* unreachable if first covers any child of second */ for (s=second->down; s != NULL; s=s->right) { if (MR_secondPredicateUnreachable(first,s)) { return 1; }; }; return 0; } else if (second->expr == PRED_OR_LIST) { /* unreachable if first covers every child of second */ for (s=second->down; s != NULL; s=s->right) { if (!MR_secondPredicateUnreachable(first,s)) { return 0; }; }; return 1; } else { require (0,"Illegal pred->expr"); return 0; /* MR20 Make compiler happy */ }; } else if (first->down != NULL && second->down == NULL) { if (first->expr == PRED_AND_LIST) { /* unreachable if every child of first covers second */ for (f=first->down; f != NULL; f=f->right) { if (!MR_secondPredicateUnreachable(f,second)) { return 0; }; }; return 1; } else if (first->expr == PRED_OR_LIST) { /* unreachable if any child of first covers second */ for (f=first->down; f != NULL; f=f->right) { if (MR_secondPredicateUnreachable(f,second)) { return 1; }; }; return 0; } else { require (0,"Illegal predicate->expr"); return 0; /* MR20 Make compiler happy */ }; } else { if (first->expr == PRED_AND_LIST && second->expr == PRED_AND_LIST) { /* unreachable if each child of first covers at least one child of second */ for (f=first->down; f != NULL ; f=f->right) { for (s=second->down; s != NULL ; s=s->right) { if (MR_secondPredicateUnreachable(f,s)) goto A_next_f; }; return 0; A_next_f: continue; }; return 1; } else if (first->expr == PRED_AND_LIST && second->expr == PRED_OR_LIST) { /* unreachable if each child of first covers ALL of second's children */ for (f=first->down; f != NULL ; f=f->right) { for (s=second->down; s != NULL ; s=s->right) { if (!MR_secondPredicateUnreachable(f,s)) return 0; }; }; return 1; } else if (first->expr == PRED_OR_LIST && second->expr == PRED_AND_LIST) { /* unreachable if any child of second is covered by any child of first */ for (f=first->down; f != NULL ; f=f->right) { for (s=second->down; s != NULL ; s=s->right) { if (MR_secondPredicateUnreachable(f,s)) return 1; }; }; return 0; } else if (first->expr == PRED_OR_LIST && second->expr == PRED_OR_LIST) { /* unreachable if every child of second is covered by some child of first */ for (f=first->down; f != NULL ; f=f->right) { for (s=second->down; s != NULL ; s=s->right) { if (MR_secondPredicateUnreachable(f,s)) goto B_next_f; }; return 0; B_next_f: continue; }; return 1; } else { require (0,"Illegal predicate->expr"); return 0; /* MR20 Make compiler happy */ }; }; return 0; /* MR20 MSVC 5.0 complains about missing return statement */ } #ifdef __USE_PROTOS void MR_xxxIndent(FILE *f,int depth) #else void MR_xxxIndent(f,depth) FILE *f; int depth; #endif { int i; for (i=0; irname,rrn->line,FileStr[rrn->file],rrn->text); }; lastOne=MR_ruleReferenced(rrn); if (lastOne != NULL) { for (j=0; jrname,lastOne->line,FileStr[lastOne->file]); }; } #ifdef __USE_PROTOS void MR_dumpTreeF(FILE *f,int depth,Tree *tree,int across) #else void MR_dumpTreeF(f,depth,tree,across) FILE *f; Tree *tree; int depth; int across; #endif { int newAcross=across; if (tree == NULL ) return; if (tree->down != NULL ) { fprintf(output,"\n"); MR_outputIndent(depth); fprintf(output, "(root ="); }; if (tree->token == ALT ) { fprintf(output," %-16s","Alt"); } else if (tree->token==EpToken ) { fprintf(output,"(%d)%13s",tree->v.rk," "); } else { fprintf(output," %-16s",TerminalString(tree->token)); }; if (tree->down != NULL) { fprintf(output,"\n"); MR_outputIndent(depth+1); MR_dumpTreeF(f,depth+1,tree->down,1); newAcross=0; fprintf(output,"\n"); MR_outputIndent(depth); fprintf(output,")"); }; if (newAcross > 3) { fprintf(output,"\n"); MR_outputIndent(depth); newAcross=0; }; MR_dumpTreeF(f,depth,tree->right,newAcross+1); } #ifdef __USE_PROTOS void MR_dumpTreeX(int depth,Tree *tree,int across) #else void MR_dumpTreeX(depth,tree,across) Tree *tree; int depth; int across; #endif { MR_dumpTreeF(output,depth,tree,across); } #ifdef __USE_PROTOS void MR_dumpTokenSet(FILE *f,int depth,set s) #else void MR_dumpTokenSet(f,depth,s) FILE *f; int depth; set s; #endif { int i; int j; unsigned *pdq; if (set_nil(s)) { fprintf(f,"\n"); MR_xxxIndent(f,depth+1); fprintf(f,"nil\n"); return; }; pdq=set_pdq(s); require(pdq != NULL,"set_pdq failed"); i=0; for (i=0 ; ; i=i+4) { fprintf(f,"\n"); MR_xxxIndent(f,depth+1); for (j=0; j < 4 ; j++) { if (pdq[i+j] == nil) break; fprintf(f," %-16s",TerminalString(pdq[i+j])); }; if (pdq[i+j] == nil) break; }; fprintf(f,"\n"); free( (char *) pdq); } #ifdef __USE_PROTOS void MR_dumpPred1(int depth,Predicate *p,int withContext) #else void MR_dumpPred1(depth,p,withContext) int depth; Predicate *p; int withContext; #endif { unsigned k; if (p == NULL) { MR_outputIndent(depth); fprintf(output,"The predicate is empty (or always true)\n\n"); return; }; if (p->down != NULL) { MR_outputIndent(depth); if (p->inverted) { /* MR14a Left out print expression in fprintf Reported by Manuel Kessler (mlkessle@cip.physik.uni-wuerzburg.de) */ if (p->expr == PRED_AND_LIST) fprintf(output,"%s NAND (not AND) expr\n\n",p->expr); if (p->expr == PRED_OR_LIST) fprintf(output,"%s NOR (not OR) expr\n\n",p->expr); } else { fprintf(output,"%s expr\n\n",p->expr); }; } else { MR_outputIndent(depth); fprintf(output,"pred %s <<%s>>?\n", (p->inverted ? " *not*" : ""), (p->expr == NULL ? "null expr" : p->expr)); MR_outputIndent(depth+1); fprintf(output," "); fprintf(output," depth=k=%d",p->k); if (p->source != NULL && p->source->guardpred) { fprintf(output," (\"=>\" guard)"); } if (p->source != NULL && p->source->ampersandPred != NULL) { fprintf(output," (\"&&\" guard)"); }; k=set_int(p->completionSet); if (k != nil) { fprintf(output," Incomplete Set at k=%d !",k); }; k=set_int(p->completionTree); if (k != nil) { fprintf(output," Incomplete Tree at k=%d !",k); }; if (p->source != NULL) { fprintf(output," rule %s line %d %s", p->source->rname,p->source->line,FileStr[p->source->file]); }; fprintf(output,"\n"); if (withContext && (HoistPredicateContext || ! set_nil(p->scontext[1]) || p->tcontext != NULL)) { if (p->k == 1) { MR_outputIndent(depth+1); fprintf(output,"set context: "); MR_dumpTokenSet(output,depth+1,p->scontext[1]); } if (p->k != 1) { MR_outputIndent(depth+1); fprintf(output,"tree context:"); if (p->tcontext == NULL) { fprintf(output," null"); } else { MR_dumpTreeX(depth+2,p->tcontext,0); }; fprintf(output,"\n"); }; }; fprintf(output,"\n"); }; if (p->down != NULL) { MR_dumpPred1(depth+1,p->down,withContext); }; if (p->right != NULL) { MR_dumpPred1(depth,p->right,withContext); }; } #ifdef __USE_PROTOS void MR_dumpPred(Predicate *p,int withContext) #else void MR_dumpPred(p,withContext) Predicate *p; int withContext; #endif { MR_dumpPred1(0,p,withContext); } #ifdef __USE_PROTOS Tree * MR_make_tree_from_set(set s) #else Tree * MR_make_tree_from_set(s) set s; #endif { Tree *t=NULL; Tree *node; Tree **tp=&t; int i; unsigned *pdq=set_pdq(s); if (pdq != NULL) { for (i=0 ; pdq[i] != nil ; i++) { node=tnode( (int) pdq[i]); *tp=node; tp=&(node->right); }; *tp=NULL; free ( (char *) pdq); }; return t; } #ifdef __USE_PROTOS void MR_check_pred_too_long(Predicate *p,set completion) #else void MR_check_pred_too_long(p,completion) Predicate *p; set completion; #endif { if (p != NULL && p->source != NULL && ! p->source->predTooLong) { if ( !set_nil(completion)) { p->source->predTooLong=1; warnFL("It is unusual (but ok) for a semantic predicate to test context past the end of its own rule", FileStr[p->source->file],p->source->line); }; }; } #ifdef __USE_PROTOS int MR_predicate_context_completed(Predicate *p) #else int MR_predicate_context_completed(p) Predicate *p; #endif { if (p == NULL) return 1; if (p->expr != PRED_AND_LIST && p->expr != PRED_OR_LIST) { if ( ! set_nil(p->completionSet)) return 0; if ( ! set_nil(p->completionTree)) return 0; }; return MR_predicate_context_completed(p->down) & MR_predicate_context_completed(p->right); } #ifdef __USE_PROTOS Node * MR_advance(Node *n) #else Node * MR_advance(n) Node *n; #endif { if (n == NULL) return NULL; switch (n->ntype) { case nJunction: return ((Junction *)n)->p1; case nToken: return ((TokNode *)n)->next; case nRuleRef: return ((RuleRefNode *)n)->next; case nAction: return ((ActionNode *)n)->next; default: return NULL; }; return NULL; /* MSVC 5.0 complains about missing return statement */ } #ifdef __USE_PROTOS Junction * MR_find_endRule(Node *n) #else Junction * MR_find_endRule(n) Node *n; #endif { Node *next; if (n == NULL) return NULL; for (next=n; next != NULL; next=MR_advance(next)) { if (next->ntype == nJunction && ( (Junction *) next)->jtype == EndRule) { break; }; }; return (Junction *)next; } /* Intersection: a branch which is shorter is chosen over one which is longer: (A B C) intersect (A B) yields (A B). AND: a branch which is longer is chosen over the one which is shorter: (A B C) AND (A B) yields (A B C) */ #ifdef __USE_PROTOS Tree *MR_computeTreeIntersection(Tree *l,Tree *r) #else Tree *MR_computeTreeIntersection(l,r) Tree *l; Tree *r; #endif { Tree *result=NULL; Tree **tail; Tree *p; Tree *q; Tree *match; if (l == NULL || r == NULL) return NULL; for (p=l; p != NULL; p=p->right) { require(p->token != EpToken,"MR_computeTreeIntersection: p->EpToken unexpected\n"); require (p->token != ALT,"MR_computeTreeIntersection: p->ALT unexpected\n"); }; for (q=r; q != NULL; q=q->right) { require(q->token != EpToken,"MR_computeTreeIntersection: q->EpToken unexpected\n"); require(q->token != ALT,"MR_computeTreeIntersection: q->ALT unexpected\n"); }; result=tnode(ALT); tail=&(result->down); for (p=l; p != NULL ; p=p->right) { for (q=r; q != NULL ; q=q->right) { if (p->token == q->token) { match=tnode(p->token); match->down=MR_computeTreeIntersection(p->down,q->down); *tail=match; tail=&(match->right); }; }; }; *tail=NULL; result=tshrink(result); result=tflatten( result ); result=tleft_factor( result ); return result; } /* the predicates which are ANDed together have a common context: they must all have common roots. Thus the AND operation is more like an OR operation because branches which are longer are grafted onto shorter branches of the AND tree. For instance combining (A B C) with (A B C D) gives (A B C D). There should never be a case of (A B C) and (A B D) because they have the same context. Actually, this may not be true once one throws in guard predicates which are defined by the user, not the context. */ /* requires input trees to be in "canonical" format */ #ifdef __USE_PROTOS Tree *MR_computeTreeAND(Tree *l,Tree *r) #else Tree *MR_computeTreeAND(l,r) Tree *l; Tree *r; #endif { Tree *result=NULL; Tree **tail; Tree *p; Tree *q; Tree *match; if (l == NULL) return tdup(r); if (r == NULL) return tdup(l); for (p=l; p != NULL; p=p->right) { /**** require(p->token != EpToken,"MR_computeTreeAND: p->EpToken unexpected\n"); ****/ require (p->token != ALT,"MR_computeTreeAND: p->ALT unexpected\n"); }; for (q=r; q != NULL; q=q->right) { /**** require(q->token != EpToken,"MR_computeTreeAND: q->EpToken unexpected\n"); ****/ require(q->token != ALT,"MR_computeTreeAND: q->ALT unexpected\n"); }; result=tnode(ALT); tail=&(result->down); for (p=l; p != NULL ; p=p->right) { for (q=r; q != NULL ; q=q->right) { if (p->token == q->token) { match=tnode(p->token); match->down=MR_computeTreeAND(p->down,q->down); *tail=match; tail=&(match->right); }; }; }; *tail=NULL; result=tshrink(result); result=tflatten( result ); result=tleft_factor( result ); return result; } #ifdef __USE_PROTOS void MR_union_plain_sets1(Predicate *p,set *theUnion) #else void MR_union_plain_sets1(p,theUnion) Predicate *p; set *theUnion; #endif { if (p == NULL) return; MR_union_plain_sets1(p->down,theUnion); MR_union_plain_sets1(p->right,theUnion); set_orin(theUnion,p->plainSet); return; } #ifdef __USE_PROTOS set MR_union_plain_sets(Predicate *p) #else set MR_union_plain_sets(p) Predicate *p; #endif { set theUnion; theUnion=empty; MR_union_plain_sets1(p,&theUnion); return theUnion; } /* does NOT left factor: do not want to merge (A B) with (A) to get (A B) in fact the opposite: (A B) with (A) gives (A) */ #ifdef __USE_PROTOS Tree *MR_compute_pred_tree_ctxXX(Predicate *p) #else Tree *MR_compute_pred_tree_ctxXX(p) Predicate *p; #endif { Tree *result=NULL; Predicate *q; Tree *t; if (p == NULL) return NULL; /* this appears strange: why do we OR the context of and AND predicate ? It is because of the way that predicates are evaluated: if the context is wrong then it's the same as if the predicate was true. That means that even when one leg of an AND has unmatched context, if the other leg has matched context and is true then the predicate succeeds. It's only when all the legs have unmatched context that this one can skip evaluation of the predicates. */ if (p->expr == PRED_OR_LIST || p->expr == PRED_AND_LIST) { for (q=p->down; q != NULL ; q=q->right) { t=MR_compute_pred_tree_ctxXX(q); result=tappend(result,t); t=NULL; }; result=tshrink(result); result=tflatten( result ); /* does NOT left factor: do not want to merge (A B) with (A) to get (A B) in fact the opposite: (A B) with (A) gives (A) */ /**** result=tleft_factor( result ); ****/ return result; }; #if 0 ** if (p->expr == PRED_AND_LIST) { ** ** Predicate *l; ** Predicate *r; ** Tree *l1; ** Tree *r1; ** Tree *prevl1; ** ** l=p->down; ** require (l->right != NULL,"MR_compute_pred_tree - AND has only one child"); ** **/* l1 and r1 should already be in "canonical" format */ ** ** l1=MR_compute_pred_tree(l); ** for (r=l->right; r != NULL; r=r->right) { ** r1=MR_compute_pred_tree(r); ** prevl1=l1; ** l1=MR_computeTreeAND(l1,r1); ** Tfree(r1); ** Tfree(prevl1); ** }; ** **/* result from computeTreeAND should be in "canonical" format */ ** ** result=l1; ** **/* result of MR_computeTreeAND should be in "canonical" format */ ** ** return result; ** }; #endif if (p->k == 1) { result=MR_make_tree_from_set(p->scontext[1]); } else { result=tdup(p->tcontext); result=MR_remove_epsilon_from_tree(result); result=tshrink(result); result=tflatten(result); result=tleft_factor(result); }; return result; } #ifdef __USE_PROTOS void MR_pred_depth(Predicate *p,int *maxDepth) #else void MR_pred_depth(p,maxDepth) Predicate *p; int *maxDepth; #endif { if (p == NULL) return; if (p->expr != PRED_OR_LIST && p->expr != PRED_AND_LIST) { if (p->k > *maxDepth) *maxDepth=p->k; }; MR_pred_depth(p->down,maxDepth); MR_pred_depth(p->right,maxDepth); } /* this computes the OR of all the contexts */ #ifdef __USE_PROTOS set MR_compute_pred_set(Predicate *p) #else set MR_compute_pred_set(p) Predicate *p; #endif { set result; Predicate *q; result=empty; if (p == NULL) return empty; if (p->expr == PRED_OR_LIST || p->expr == PRED_AND_LIST) { /* yes, I do mean PRED_AND_LIST ! */ /* remember: r1: (A)? => <

>? r2; */ /* r2: (B)? => <>? r3; */ set t; t=empty; result=empty; for (q=p->down; q != NULL; q=q->right) { t=MR_compute_pred_set(q); set_orin(&result,t); set_free(t); }; return result; } else if (p->k > 1) { return empty; } else { return set_dup(p->scontext[1]); }; } #ifdef __USE_PROTOS set MR_First(int ck,Junction *j,set *incomplete) #else set MR_First(ck,j,incomplete) int ck; Junction *j; set *incomplete; #endif { Junction *p; set tokensUsed; tokensUsed=empty; require(j->ntype==nJunction, "MR_First: non junction passed"); p = analysis_point((Junction *)j->p1); REACH(p,ck,incomplete,tokensUsed); return tokensUsed; } #ifdef __USE_PROTOS void MR_cleanup_pred_trees(Predicate *p) #else void MR_cleanup_pred_trees(p) Predicate *p; #endif { Tree *t; if (p == NULL) return; if (p->expr != PRED_OR_LIST && p->expr != PRED_AND_LIST) { t=p->tcontext; t=tshrink(t); t=tflatten(t); t=tleft_factor(t); p->tcontext=t; }; MR_cleanup_pred_trees(p->down); MR_cleanup_pred_trees(p->right); } /* does NOT return canonical tree */ #ifdef __USE_PROTOS Tree * MR_remove_epsilon_from_tree(Tree *t) #else Tree * MR_remove_epsilon_from_tree(t) Tree *t; #endif { if (t == NULL) return NULL; /* I think ALT can be ignored as a special case */ if (t->token != EpToken) { t->down=MR_remove_epsilon_from_tree(t->down); t->right=MR_remove_epsilon_from_tree(t->right); return t; } else { Tree *u; u=MR_remove_epsilon_from_tree(t->right); t->right=NULL; Tfree(t); return u; }; } #ifdef __USE_PROTOS void MR_complete_set(int predDepth,set *tokensUsed,set *incomplete) #else void MR_complete_set(predDepth,tokensUsed,incomplete) int predDepth; set *tokensUsed; set *incomplete; #endif { int i; RuleRefNode *ruleRef; set rk2; set b; int k2; Junction *save_MR_RuleBlkWithHalt; if (set_int(*incomplete) > (unsigned) predDepth) { return; }; require(MR_PredRuleRefStack.count == MR_RuleBlkWithHaltStack.count, "RuleRefStack and RuleBlkWithHaltStack not same size"); require(MR_RuleBlkWithHalt == NULL || (MR_RuleBlkWithHalt->jtype == RuleBlk && MR_RuleBlkWithHalt->end->halt == TRUE), "RuleBlkWithHalt has no halt set"); save_MR_RuleBlkWithHalt=MR_RuleBlkWithHalt; if (MR_RuleBlkWithHalt != NULL) { MR_RuleBlkWithHalt->end->halt=FALSE; }; for (i=MR_PredRuleRefStack.count-1; i >= 0 ; i--) { ruleRef=(RuleRefNode *)MR_PredRuleRefStack.data[i]; if (ruleRef == NULL) continue; MR_RuleBlkWithHalt=(Junction *)MR_RuleBlkWithHaltStack.data[i]; if (MR_RuleBlkWithHalt != NULL) MR_RuleBlkWithHalt->end->halt=TRUE; rk2=empty; b=empty; while ( !set_nil(*incomplete) ) { k2=set_int(*incomplete); if (k2 > predDepth) break; /* <=== another exit from loop */ set_rm(k2,*incomplete); REACH(ruleRef->next,k2,&rk2,b); set_orin(tokensUsed,b); set_free(b); }; if (MR_RuleBlkWithHalt != NULL) MR_RuleBlkWithHalt->end->halt=FALSE; set_orin(incomplete,rk2); /* remember what we couldn't do */ set_free(rk2); if (set_int(*incomplete) > (unsigned) predDepth) break; /* <=== another exit from loop */ }; MR_RuleBlkWithHalt=save_MR_RuleBlkWithHalt; if (MR_RuleBlkWithHalt != NULL) { MR_RuleBlkWithHalt->end->halt=TRUE; }; } #ifdef __USE_PROTOS void MR_complete_tree(int predDepth,Tree **t,set *incomplete) #else void MR_complete_tree(predDepth,t,incomplete) int predDepth; Tree **t; set *incomplete; #endif { int i; RuleRefNode *ruleRef; set rk2; Tree *u; unsigned k2; Junction *save_MR_RuleBlkWithHalt; int saveConstrainSearch; if (set_int(*incomplete) > (unsigned) predDepth) { return; }; require(MR_PredRuleRefStack.count == MR_RuleBlkWithHaltStack.count, "RuleRefStack and RuleBlkWithHaltStack not same size"); require(MR_RuleBlkWithHalt == NULL || (MR_RuleBlkWithHalt->jtype == RuleBlk && MR_RuleBlkWithHalt->end->halt == TRUE), "RuleBlkWithHalt has no halt set"); save_MR_RuleBlkWithHalt=MR_RuleBlkWithHalt; saveConstrainSearch=ConstrainSearch; ConstrainSearch=0; if (MR_RuleBlkWithHalt != NULL) { MR_RuleBlkWithHalt->end->halt=FALSE; }; for (i=MR_PredRuleRefStack.count-1; i >= 0 ; i--) { ruleRef=(RuleRefNode *)MR_PredRuleRefStack.data[i]; if (ruleRef == NULL) continue; MR_RuleBlkWithHalt=(Junction *)MR_RuleBlkWithHaltStack.data[i]; if (MR_RuleBlkWithHalt != NULL) MR_RuleBlkWithHalt->end->halt=TRUE; rk2=empty; while ( !set_nil(*incomplete) ) { k2 = set_int(*incomplete); if (k2 > (unsigned) predDepth) break; /* <=== another exit from loop */ set_rm(k2,*incomplete); u = NULL; TRAV(ruleRef->next,k2,&rk2,u); /* any subtrees missing k2 tokens, add u onto end */ *t=tlink(*t,u,k2); Tfree(u); } set_orin(incomplete,rk2); /* remember what we couldn't do */ set_free(rk2); if (MR_RuleBlkWithHalt != NULL) MR_RuleBlkWithHalt->end->halt=FALSE; if (set_int(*incomplete) > (unsigned) predDepth) break; /* <=== another exit from loop */ }; MR_RuleBlkWithHalt=save_MR_RuleBlkWithHalt; if (MR_RuleBlkWithHalt != NULL) { MR_RuleBlkWithHalt->end->halt=TRUE; }; ConstrainSearch=saveConstrainSearch; } #ifdef __USE_PROTOS void MR_complete_predicates(int predDepth,Predicate *pred) #else void MR_complete_predicates(predDepth,pred) int predDepth; Predicate *pred; #endif { if (pred == NULL) return; if (pred->expr != PRED_AND_LIST && pred->expr != PRED_OR_LIST) { MR_complete_set(predDepth,&(pred->scontext[1]),&(pred->completionSet)); MR_complete_tree(predDepth,&(pred->tcontext),&(pred->completionTree)); }; MR_complete_predicates(predDepth,pred->down); MR_complete_predicates(predDepth,pred->right); } #ifdef __USE_PROTOS Junction * MR_junctionWithoutP2(Junction *j) #else Junction * MR_junctionWithoutP2(j) Junction *j; #endif { Junction *thisAlt; /* don't want to follow p2 to the next alternative of this rule */ /* insert a generic node with null p2 if necessary */ /* however FIRST requires a junction */ thisAlt=j; if (thisAlt->p2 != NULL) { if (thisAlt->p1->ntype == nJunction) { thisAlt=(Junction *) thisAlt->p1; } else { thisAlt=newJunction(); thisAlt->p1=j->p1; thisAlt->rname=j->rname; thisAlt->file=j->file; thisAlt->line=j->line; j->p1=(Node *)thisAlt; }; }; return thisAlt; } #ifdef __USE_PROTOS int MR_tree_equ(Tree *big, Tree *small) { #else int MR_tree_equ(big,small) Tree *big; Tree *small; { #endif Tree *b; Tree *s; int bcount=0; int scount=0; if (small == NULL && big == NULL) return 1; if (small == NULL) return 0; if (big == NULL) return 0; if (small->token == ALT) { require(small->right == NULL, "MR_tree_equ: small: ALT node has siblings"); return MR_tree_equ(big,small->down); }; if (big->token == ALT) { require(big->right == NULL, "MR_tree_equ: big: ALT node has siblings"); return MR_tree_equ(big->down,small); }; for (s=small; s != NULL; s=s->right) { scount++; require(s->token != EpToken,"MR_tree_equ: s->EpToken unexpected\n"); }; for (b=big; b != NULL; b=b->right) { bcount++; require(b->token != EpToken,"MR_tree_equ: b->EpToken unexpected\n"); }; if (bcount != scount) return 0; for (s=small; s != NULL; s=s->right) { for (b=big; b!= NULL; b=b->right) { if (s->token == b->token) { if (MR_tree_equ(b->down,s->down)) goto next_s; }; }; return 0; next_s: continue; }; return 1; } /* this does not compare sources - only contexts ! */ #ifdef __USE_PROTOS int MR_identicalContext(Predicate *p,Predicate *q) #else int MR_identicalContext(p,q) Predicate *p; Predicate *q; #endif { if (p->k != q->k) return 0; require ( (p->tcontext == NULL) == (q->tcontext == NULL), "tcontext inconsistent"); if (p->k == 1) { return set_equ(p->scontext[1],q->scontext[1]); } else { return MR_tree_equ(p->tcontext,q->tcontext); }; } #ifdef __USE_PROTOS void MR_reportSetSuppression(int predDepth, set predSet,set plainSet,Junction *jPred,Junction *jPlain,Predicate *p) #else void MR_reportSetSuppression(predDepth,predSet,plainSet,jPred,jPlain,p) int predDepth; set predSet; set plainSet; Junction *jPred; Junction *jPlain; Predicate *p; #endif { if (InfoP) { fprintf(output,"\n#if 0\n\n"); fprintf(output,"Hoisting of predicate suppressed by alternative without predicate.\n"); fprintf(output,"The alt without the predicate includes all cases where the predicate is false.\n\n"); fprintf(output," WITH predicate: line %d %s\n",jPred->line,FileStr[jPred->file]); if (jPlain != NULL) { fprintf(output," WITHOUT predicate: line %d %s\n",jPlain->line,FileStr[jPlain->file]); } else { fprintf(output," WITHOUT predicate: all alternatives without predicates (combined)\n"); }; if (predDepth == 1) { fprintf(output,"\nThe context set for the predicate:\n"); MR_dumpTokenSet(output,1,predSet); }; fprintf(output,"\nThe lookahead set for the alt WITHOUT the semantic predicate:\n"); MR_dumpTokenSet(output,1,plainSet); fprintf(output,"\nThe predicate:\n\n"); MR_dumpPred1(1,p,1); fprintf(output,"Chain of referenced rules:\n\n"); MR_dumpPredRuleRefStack(output,4); fprintf(output,"\n#endif\n"); }; } #ifdef __USE_PROTOS void MR_reportSetRestriction(int predDepth,set predSet,set plainSet, Junction *jPred,Junction *jPlain,Predicate *origPred,Predicate *newPred) #else void MR_reportSetRestriction(predDepth,predSet,plainSet,jPred,jPlain,origPred,newPred) int predDepth; set predSet; set plainSet; Junction *jPred; Junction *jPlain; Predicate *origPred; Predicate *newPred; #endif { set intersect; intersect=empty; if (! InfoP) return; fprintf(output,"\n#if 0\n\n"); fprintf(output,"Restricting the context of a predicate because of overlap in the lookahead set\n"); fprintf(output," between the alternative with the semantic predicate and one without\n"); fprintf(output,"Without this restriction the alternative without the predicate could not\n"); fprintf(output," be reached when input matched the context of the predicate and the predicate\n"); fprintf(output," was false.\n\n"); fprintf(output," WITH predicate: line %d %s\n",jPred->line,FileStr[jPred->file]); if (jPlain != NULL) { fprintf(output," WITHOUT predicate: line %d %s\n",jPlain->line,FileStr[jPlain->file]); } else { fprintf(output," WITHOUT predicate: all alternatives without predicates (combined)\n"); }; if (predDepth == 1) { fprintf(output,"\nThe original context set for the predicate:\n"); MR_dumpTokenSet(output,1,predSet); }; fprintf(output,"\nThe lookahead set for the alt WITHOUT the semantic predicate:\n"); MR_dumpTokenSet(output,1,plainSet); if (predDepth == 1) { fprintf(output,"\nThe intersection of the two sets\n"); intersect=set_and(predSet,plainSet); MR_dumpTokenSet(output,1,intersect); set_free(intersect); }; fprintf(output,"\nThe original predicate:\n\n"); MR_dumpPred1(1,origPred,1); fprintf(output,"The new (modified) form of the predicate:\n\n"); MR_dumpPred1(1,newPred,1); fprintf(output,"#endif\n"); } /* don't use Pass3 by itself unless you know that inverted is not important */ #ifdef __USE_PROTOS Predicate * MR_removeRedundantPredPass3(Predicate *p) #else Predicate * MR_removeRedundantPredPass3(p) Predicate *p; #endif { Predicate *q; if (p == NULL) return NULL; p->right=MR_removeRedundantPredPass3(p->right); p->down=MR_removeRedundantPredPass3(p->down); if (p->redundant) { q=p->right; p->right=NULL; predicate_free(p); return q; }; if (p->expr == PRED_AND_LIST || p->expr == PRED_OR_LIST) { if (p->down == NULL) { q=p->right; p->right=NULL; predicate_free(p); return q; }; if (p->down != NULL && p->down->right == NULL) { q=p->down; q->right=p->right; p->right=NULL; p->down=NULL; return q; }; }; return p; } #ifdef __USE_PROTOS void MR_removeRedundantPredPass2(Predicate *p) #else void MR_removeRedundantPredPass2(p) Predicate *p; #endif { Predicate *q; if (p == NULL) return; if (p->expr == PRED_AND_LIST) { for (q=p->down ; q != NULL ; q=q->right) { MR_removeRedundantPredPass2(q); if (q->isConst) { if (q->constValue == 0) { p->isConst=1; p->constValue=0; return; } else { q->redundant=1; }; }; }; }; if (p->expr == PRED_OR_LIST) { for (q=p->down ; q != NULL ; q=q->right) { MR_removeRedundantPredPass2(q); if (q->isConst) { if (q->constValue == 0) { q->redundant=1; } else { p->isConst=1; p->constValue=1; return; }; }; }; }; return; } #if 0 this totally ignores the implications of guarded predicates in which the part after the guard could possibly cover a predicate. that would be much harder: rule : (A)? => <

>? sub1; /* 1 */ | (B)? => <>? sub2 /* 2 */ sub1 : (A)? => <>? A B /* 3 */ | B /* 4 - suppresses line 2 */ ; #endif #ifdef __USE_PROTOS void MR_apply_restriction1(Predicate *pred,set *plainSet,int *changed) #else void MR_apply_restriction1(pred,plainSet,changed) Predicate *pred; set *plainSet; int *changed; #endif { if (pred == NULL) return; MR_apply_restriction1(pred->right,plainSet,changed); if (pred->down != NULL) { MR_apply_restriction1(pred->down,plainSet,changed); } else { set t; if (pred->k == 1) { t=set_dif(pred->scontext[1],*plainSet); if (*changed == 0 && !set_equ(t,pred->scontext[1])) { *changed=1; }; if (set_nil(t)) { pred->redundant=1; }; set_free(pred->scontext[1]); pred->scontext[1]=t; }; }; } #ifdef __USE_PROTOS void MR_orin_plainSet(Predicate *p,set plainSet) #else void MR_orin_plainSet(p,plainSet) Predicate *p; set plainSet; #endif { if (p == NULL) return; MR_orin_plainSet(p->down,plainSet); MR_orin_plainSet(p->right,plainSet); set_orin(&p->plainSet,plainSet); } Predicate *PRED_SUPPRESS; #ifdef __USE_PROTOS Predicate * MR_find_in_aSubBlk(Junction *alt) #else Predicate * MR_find_in_aSubBlk(alt) Junction *alt; #endif { Predicate *root=NULL; Predicate **tail=NULL; Junction *p; int nAlts=0; Junction **jList; Predicate **predList; int *matchList; set predSet; int i; int j; int m; int predDepth; set incomplete; set union_plainSet; set setChange; int changed; Predicate *newPred; set setDif; Predicate *origPred; int depth1=1; /* const int */ set *plainContext; set plainSet; predSet=empty; incomplete=empty; union_plainSet=empty; setChange=empty; setDif=empty; plainSet=empty; if (PRED_SUPPRESS == NULL) { PRED_SUPPRESS=new_pred(); PRED_SUPPRESS->expr="Predicate Suppressed"; }; /* this section just counts the number of "interesting" alternatives */ /* in order to allocate arrays */ for (p=alt; p!=NULL; p=(Junction *)p->p2) { /* ignore empty alts */ if ( p->p1->ntype != nJunction || ((Junction *)p->p1)->jtype != EndBlk ) { nAlts++; }; }; /* if this is a (...)+ block then don't count the last alt because it can't be taken until at least one time through the block. In other words it isn't a real choice until the (...)+ is entered at which point the hoisting issue is moot. Maybe look at "ignore" instead ? */ if (alt->jtype == aPlusBlk) { nAlts--; }; jList=(Junction **)calloc(nAlts,sizeof(Junction *)); require(jList!=NULL,"cannot allocate MR_find_in_aSubBlk jList"); plainContext=(set *)calloc(nAlts,sizeof(set)); require(plainContext!=NULL,"cannot allocate MR_find_in_aSubBlk plainContext"); for (m=0; m < nAlts; m++) plainContext[m]=empty; predList=(Predicate **)calloc(nAlts,sizeof(Predicate *)); require(predList!=NULL,"cannot allocate MR_find_in_aSubBlk predList"); matchList=(int *)calloc(nAlts,sizeof(int)); require(matchList!=NULL,"cannot allocate MR_find_in_aSubBlk matchList"); /* this section just fills in the arrays previously allocated */ /* the most interesting one is matchList[] */ /* */ /* bit 0 => this alt has a semantic pred which is "covered" */ /* by an alt without a semantic pred. Don't hoist. */ for (i=0,p=alt; p!=NULL && ip2) { /* ignore empty alts */ if ( p->p1->ntype != nJunction || ((Junction *)p->p1)->jtype != EndBlk ) { jList[i]=MR_junctionWithoutP2(p); predList[i]=find_predicates(p->p1); /* should be jList ????? */ if (predList[i] != NULL) { MR_cleanup_pred_trees(predList[i]); /* flatten & left factor */ plainContext[i]=MR_union_plain_sets(predList[i]); } else { MR_set_reuse(&plainSet); MR_set_reuse(&incomplete); plainSet=MR_First(depth1,jList[i],&incomplete); MR_complete_set(depth1,&plainSet,&incomplete); require(set_nil(incomplete),"couldn't complete k=1"); plainContext[i]=plainSet; plainSet=empty; }; set_orin(&union_plainSet,plainContext[i]); }; }; if (nAlts == 1) { goto EXIT_SIMPLE; }; /* * Looking for cases where alt i has a semantic pred and alt j does not. * Don't care about cases where lookahead for semantic predicates overlap * because normal predicate hoisting does the correct thing automatically. * Don't care about cases where lookahead for alts without semantic predicates * overlap because normal prediction does the correct thing automatically. * * When we find such a case check for one of three subcases: * * 1. if lookahead for alt i is contained in the lookahead for any * alt j then ignore semantic predicate of alt i * 2. if lookahead for alt i is not contained in the lookahead for * any alt j then add add predicate i to the OR list to be hoisted * 3. if lookahead for alt i overlaps the lookahead for some alt j then * add a dummy semantic predicate for alt j * * There is an implicit assumption that the context of all alternatives following * the rule being processed here are identical (but may vary from hoist to * hoist depending on the place where the rule was invoked that led to hoisting * these predicates. In othere words in the fragment: * * ( <>? a1 a2 a3 | <>? b1 b2 b3 ) * * both a3 and b3 have the same follow sets because they are both at the end of * alternatives in the same block. */ for (i=0; i < nAlts; i++) { if (jList[i] == NULL) continue; if (predList[i] == NULL) continue; /* if the predicate depth turns out to be one token only */ /* then it is can be easily represented as a set and */ /* compared to the junction set create by MR_First() */ predDepth=0; MR_pred_depth(predList[i],&predDepth); require (predDepth >= 1,"MR_find_in_aSubBlk: pred depth < 1"); require (predDepth <= CLL_k,"MR_find_in_aSubBlk: predDepth > CLL_k"); /* complete predicates to predDepth If completed to depth=1 then the context would be incomplete. The context would be truncated and the predicate simplify routine would have incomplete information. It would lead to either false matches of failure to find true matches. */ MR_complete_predicates(predDepth,predList[i]); if (predList[i] != NULL) { MR_cleanup_pred_trees(predList[i]); /* flatten & left factor */ }; /* If the predicate depth is 1 then it is possible to suppress a predicate completely using a single plain alt. Check for suppression by a single plain alt first because it gives better messages. If that fails try the union of all the plain alts. */ if (predDepth == 1) { MR_set_reuse(&predSet); predSet=MR_compute_pred_set(predList[i]); /* ignores k>1 predicates */ for (j=0; j < nAlts; j++) { if (jList[j] == NULL) continue; if (j == i) continue; MR_set_reuse(&setDif); setDif=set_dif(predSet,plainContext[j]); if (set_nil(setDif)) { matchList[i] |= 1; MR_reportSetSuppression(predDepth,predSet,plainContext[j],jList[i],jList[j],predList[i]); predicate_free(predList[i]); predList[i]=PRED_SUPPRESS; goto next_i; }; }; /* end loop on j */ changed=0; /* predicate_dup is only to give good error messages */ /* remember to do a predicate_free() */ origPred=predicate_dup(predList[i]); MR_apply_restriction1(predList[i],&union_plainSet,&changed); if (changed) { /* don't use Pass3 by itself unless you know that inverted is not important */ newPred=MR_removeRedundantPredPass3(predList[i]); newPred=MR_predSimplifyALL(newPred); if (newPred == NULL) { matchList[i] |= 1; MR_reportSetSuppression(predDepth,predSet,union_plainSet,jList[i], NULL,origPred); predList[i]=PRED_SUPPRESS; } else { MR_reportSetRestriction(predDepth,predSet,union_plainSet,jList[i], NULL,origPred,newPred); predList[i]=newPred; }; }; predicate_free(origPred); origPred=NULL; }; /* If the predicate depth is > 1 then it can't be suppressed completely because the code doesn't support inspection of such things. They're much messier than k=1 sets. */ if (predDepth > 1 ) { changed=0; /* predicate_dup is only to give good error messages */ /* remember to do a predicate_free() */ origPred=predicate_dup(predList[i]); MR_apply_restriction1(predList[i],&union_plainSet,&changed); if (changed) { newPred=MR_removeRedundantPredPass3(predList[i]); newPred=MR_predSimplifyALL(newPred); if (newPred == NULL) { matchList[i] |= 1; MR_reportSetSuppression(predDepth,predSet,union_plainSet,jList[i], NULL,origPred); predList[i]=PRED_SUPPRESS; } else { MR_reportSetRestriction(predDepth,predSet,union_plainSet,jList[i], NULL,origPred,newPred); predList[i]=newPred; }; }; predicate_free(origPred); origPred=NULL; }; next_i: continue; }; EXIT_SIMPLE: root = new_pred(); root->expr=PRED_OR_LIST; tail = &(root->down); for (i=0 ; i< nAlts ; i++) { if (jList[i] == NULL) continue; if (predList[i] == NULL) { continue; } else if ( (matchList[i] & 1) != 0) { if (predList[i] != PRED_SUPPRESS) { predicate_free(predList[i]); }; continue; }; /* make an OR list of predicates */ *tail=predList[i]; tail=&(predList[i]->right); }; /* if just one pred, remove OR root */ if (root->down == NULL) { predicate_free(root); root=NULL; } else if (root->down->right == NULL) { Predicate *p=root->down; root->down=NULL; predicate_free(root); root=p; } root=MR_predSimplifyALL(root); MR_orin_plainSet(root,union_plainSet); set_free(predSet); set_free(union_plainSet); set_free(incomplete); set_free(setChange); set_free(setDif); for (m=0; m < nAlts; m++) set_free(plainContext[m]); free ( (char *) jList); free ( (char *) predList); free ( (char *) matchList); free ( (char *) plainContext); return root; } #ifdef __USE_PROTOS void MR_predContextPresent(Predicate *p,int *allHaveContext,int *noneHaveContext) #else void MR_predContextPresent(p,allHaveContext,noneHaveContext) Predicate *p; int *allHaveContext; int *noneHaveContext; #endif { if (p == NULL) return; MR_predContextPresent(p->right,allHaveContext,noneHaveContext); if (p->expr != PRED_AND_LIST && p->expr != PRED_OR_LIST) { if (set_nil(p->scontext[1]) == 0 || (p->tcontext != NULL)) { *noneHaveContext=0; } else { *allHaveContext=0; }; }; MR_predContextPresent(p->down,allHaveContext,noneHaveContext); } #ifdef __USE_PROTOS int MR_pointerStackPush(PointerStack *ps,void *dataPointer) #else int MR_pointerStackPush(ps,dataPointer) PointerStack *ps; void *dataPointer; #endif { void **newStack; int newSize; int i; if (ps->count == ps->size) { newSize=20+ps->size*2; newStack=(void **)calloc(newSize,sizeof(void *)); require (newStack != NULL,"cannot allocate PointerStack"); for (i=0; i < ps->size; i++) { newStack[i]=ps->data[i]; }; if (ps->data != NULL) free( (char *) ps->data); ps->data=newStack; ps->size=newSize; }; ps->data[ps->count]=dataPointer; ps->count++; return ps->count-1; } #ifdef __USE_PROTOS void * MR_pointerStackPop(PointerStack *ps) #else void * MR_pointerStackPop(ps) PointerStack *ps; #endif { void *dataPointer; require(ps->count > 0,"MR_pointerStackPop underflow"); dataPointer=ps->data[ps->count-1]; ps->data[ps->count-1]=NULL; (ps->count)--; return dataPointer; } #ifdef __USE_PROTOS void * MR_pointerStackTop(PointerStack *ps) #else void * MR_pointerStackTop(ps) PointerStack *ps; #endif { require(ps->count > 0,"MR_pointerStackTop underflow"); return ps->data[ps->count-1]; } #ifdef __USE_PROTOS void MR_pointerStackReset(PointerStack *ps) #else void MR_pointerStackReset(ps) PointerStack *ps; #endif { int i; if (ps->data != NULL) { for (i=0; i < ps->count ; i++) { ps->data[i]=NULL; }; }; ps->count=0; } #ifdef __USE_PROTOS Junction *MR_nameToRuleBlk(char *name) #else Junction *MR_nameToRuleBlk(name) char *name; #endif { RuleEntry *q; require (RulePtr != NULL,"MR_nameToRule: RulePtr not initialized"); if (name == NULL) return NULL; q = (RuleEntry *) hash_get(Rname,name); if ( q == NULL ) { return NULL; } else { return RulePtr[q->rulenum]; }; } #ifdef __USE_PROTOS Junction * MR_ruleReferenced(RuleRefNode *rrn) #else Junction * MR_ruleReferenced(rrn) RuleRefNode *rrn; #endif { return MR_nameToRuleBlk(rrn->text); } #ifdef __USE_PROTOS void MR_comparePredLeaves(Predicate *me,Predicate *myParent,Predicate *him,Predicate *hisParent) #else void MR_comparePredLeaves(me,myParent,him,hisParent) Predicate *me; Predicate *myParent; Predicate *him; Predicate *hisParent; #endif { if (me == NULL) return; if (me == him) { MR_comparePredLeaves(me->right,myParent,him,hisParent); return; } else if (me->expr == PRED_AND_LIST || me->expr == PRED_OR_LIST) { MR_comparePredLeaves(me->down,me,him,hisParent); MR_comparePredLeaves(me->right,myParent,him,hisParent); return; } else { if (me->source != NULL) { /* predicate->invert can be set only in the predEntry predicates */ /* thus they are only visible after the predEntry predicates have been "unfolded" */ int sameSource=(me->source == him->source); int sameInvert=1 & (1 + me->inverted + him->inverted + me->source->inverted + him->source->inverted); int samePredEntry=(me->source->predEntry != NULL && him->source->predEntry != NULL && me->source->predEntry == him->source->predEntry); if (sameInvert && (sameSource || samePredEntry)) { if (MR_identicalContext(me,him)) { /* identical predicates */ if (hisParent->expr == PRED_OR_LIST && myParent->expr == PRED_OR_LIST) { me->redundant=1; } else if (hisParent->expr == PRED_AND_LIST && myParent->expr == PRED_AND_LIST) { me->redundant=1; } else if ( (hisParent->expr == PRED_OR_LIST && myParent->expr == PRED_AND_LIST) || (hisParent->expr == PRED_AND_LIST && myParent->expr == PRED_OR_LIST) ) { myParent->redundant=1; } else { require (0,"MR_comparePredLeaves: not both PRED_LIST"); }; }; }; /* end same source or same predEntrr with same invert sense */ /* same predEntry but opposite invert sense */ if (!sameInvert && (sameSource || samePredEntry)) { if (MR_identicalContext(me,him)) { if (hisParent->expr == PRED_OR_LIST && myParent->expr == PRED_OR_LIST) { myParent->isConst=1; myParent->constValue=1; } else if (hisParent->expr == PRED_AND_LIST && myParent->expr == PRED_AND_LIST) { myParent->isConst=1; myParent->constValue=0; } else if ( (hisParent->expr == PRED_OR_LIST && myParent->expr == PRED_AND_LIST) || (hisParent->expr == PRED_AND_LIST && myParent->expr == PRED_OR_LIST) ) { me->redundant=1; } else { require (0,"MR_comparePredLeaves: not both PRED_LIST"); }; }; }; /* end same predEntry with opposite invert sense */ }; MR_comparePredLeaves(me->right,myParent,him,hisParent); return; }; } #ifdef __USE_PROTOS void MR_removeRedundantPredPass1(Predicate *me,Predicate *myParent) #else void MR_removeRedundantPredPass1(me,myParent) Predicate *me; Predicate *myParent; #endif { if (me == NULL) return; if (me->redundant) { MR_removeRedundantPredPass1(me->right,myParent); return; }; if (me->expr == PRED_AND_LIST || me->expr == PRED_OR_LIST) { MR_removeRedundantPredPass1(me->down,me); MR_removeRedundantPredPass1(me->right,myParent); } else { require (me->source != NULL,"me->source == NULL"); if (myParent != NULL) { MR_comparePredLeaves(myParent->down,myParent,me,myParent); }; MR_removeRedundantPredPass1(me->right,myParent); }; } /* pretty much ignores things with the inverted bit set */ #ifdef __USE_PROTOS Predicate *MR_predFlatten(Predicate *p) #else Predicate *MR_predFlatten(p) Predicate *p; #endif { if (p == NULL) return NULL; if (p->expr == PRED_OR_LIST || p->expr == PRED_AND_LIST) { Predicate *child; Predicate *gchild; Predicate **tail; Predicate *next; char *PRED_XXX_LIST=p->expr; require (p->down != NULL,"MR_predFlatten AND/OR no child"); p->down=MR_predFlatten(p->down); p->right=MR_predFlatten(p->right); child=p->down; if (child->right == NULL) { child->right=p->right; p->right=NULL; p->down=NULL; if (p->inverted) child->inverted=!child->inverted; predicate_free(p); return child; }; /* make a single list of all children and grandchildren */ tail=&(p->down); for (child=p->down; child != NULL; child=next) { if (child->expr != PRED_XXX_LIST || child->inverted || child->predEntry != NULL) { *tail=child; tail=&(child->right); next=child->right; } else { for (gchild=child->down; gchild != NULL; gchild=gchild->right) { *tail=gchild; tail=&(gchild->right); }; next=child->right; child->right=NULL; child->down=NULL; predicate_free(child); }; }; *tail=NULL; return p; } else { p->right=MR_predFlatten(p->right); return p; }; } static char *alwaysFalseWarning=NULL; #ifdef __USE_PROTOS Predicate *checkPredicateConflict(Predicate *p) #else Predicate *checkPredicateConflict(p) Predicate *p; #endif { if (p->isConst) { if (p->constValue == 1) { predicate_free(p); return NULL; } else { if (InfoP && !p->conflictReported) { p->conflictReported=1; fprintf(output,"\n#if 0\n\n"); fprintf(output,"The following predicate expression will always be false:\n\n"); MR_dumpPred1(1,p,1); fprintf(output,"\n#endif\n"); }; if (alwaysFalseWarning != CurRule) { alwaysFalseWarning=CurRule; if (InfoP) { warnNoFL(eMsg1("one (or more) predicate expression hoisted into rule \"%s\" are always false \ - see output file for more information",CurRule)); } else { warnNoFL(eMsg1("one (or more) predicate expressions hoisted into rule \"%s\" are always false \ - use \"-info p\" for more information",CurRule)); }; }; }; }; return p; } #ifdef __USE_PROTOS int MR_countPredNodes(Predicate *p) #else int MR_countPredNodes(p) Predicate *p; #endif { if (p == NULL) return 0; return 1 + MR_countPredNodes(p->down) + MR_countPredNodes(p->right); } #ifdef __USE_PROTOS Predicate *MR_predSimplifyALLX(Predicate *p,int skipPass3) #else Predicate *MR_predSimplifyALLX(p,skipPass3) Predicate *p; int skipPass3; #endif { int countBefore; int countAfter; countAfter=MR_countPredNodes(p); do { if (p == NULL) return NULL; if (p->right == NULL && p->down == NULL) return p; countBefore=countAfter; MR_simplifyInverted(p,0); p=MR_predFlatten(p); MR_removeRedundantPredPass1(p,NULL); MR_removeRedundantPredPass2(p); if (! skipPass3) { p=checkPredicateConflict(p); p=MR_removeRedundantPredPass3(p); }; countAfter=MR_countPredNodes(p); } while (countBefore != countAfter); return p; } #ifdef __USE_PROTOS Predicate *MR_predSimplifyALL(Predicate *p) #else Predicate *MR_predSimplifyALL(p) Predicate *p; #endif { return MR_predSimplifyALLX(p,0); } #ifdef __USE_PROTOS void MR_releaseResourcesUsedInRule(Node *n) #else void MR_releaseResourcesUsedInRule(n) Node *n; #endif { Node *next; Junction *j; int i; if (n == NULL) return; if (n->ntype == nJunction) { j=(Junction *) n; if (j->predicate != NULL) { predicate_free(j->predicate); j->predicate=NULL; }; for (i=0; i< CLL_k; i++) { set_free(j->fset[i]); j->fset[i]=empty; }; if (j->ftree != NULL) { Tfree(j->ftree); j->ftree=NULL; }; if (j->jtype == EndRule) return; if (j->jtype != RuleBlk && j->jtype != EndBlk) { if (j->p2 != NULL && !j->ignore) { /* MR11 */ MR_releaseResourcesUsedInRule(j->p2); }; }; }; next=MR_advance(n); MR_releaseResourcesUsedInRule(next); } #ifdef __USE_PROTOS int MR_allPredLeaves(Predicate *p) #else int MR_allPredLeaves(p) Predicate *p; #endif { Predicate *q; if (p == NULL) return 1; for (q=p; q != NULL; q=q->right) { if (q->down != NULL) return 0; }; return 1; } /* make sure it works for the last rule in a file */ #ifdef __USE_PROTOS int MR_offsetFromRule(Node *n) #else int MR_offsetFromRule(n) Node *n; #endif { Junction *j; int offset=(-1); for (j=SynDiag; j != NULL; j=(Junction *)j->p2) { require (j->ntype == nJunction && j->jtype == RuleBlk,"Not a rule block"); if (n->file < j->file) { return offset; }; if (n->file == j->file) { if (n->line < j->line) { return (offset < 0) ? 0 : offset; } else { offset=n->line - j->line; if (offset == 0) return 0; }; }; }; return offset; } #define ruleNameMax 50 static char ruleNameStatic1[ruleNameMax]; static char ruleNameStatic2[ruleNameMax+10]; #ifdef __USE_PROTOS char * MR_ruleNamePlusOffset(Node *n) #else char * MR_ruleNamePlusOffset(n) Node *n; #endif { int offset=MR_offsetFromRule(n); strncpy(ruleNameStatic1,n->rname,ruleNameMax); if (offset < 0) { sprintf(ruleNameStatic2,"%s/?",ruleNameStatic1); } else { sprintf(ruleNameStatic2,"%s/%d",ruleNameStatic1,offset+1); }; return ruleNameStatic2; } #ifdef __USE_PROTOS int MR_max_height_of_tree(Tree *t) #else int MR_max_height_of_tree(t) Tree *t; #endif { int h; int height=0; Tree *u; if (t == NULL) return 0; require (t->token != ALT && t->token != EpToken,"MR_max_height_of_tree ALT or EpToken"); for (u=t; u != NULL; u=u->right) { h=MR_max_height_of_tree(u->down)+1; if (h > height) height=h; }; return height; } #ifdef __USE_PROTOS int MR_all_leaves_same_height(Tree *t,int depth) #else int MR_all_leaves_same_height(t,depth) Tree *t; int depth; #endif { if (t == NULL) { return (depth==0); }; require (t->token != ALT && t->token != EpToken,"MR_all_leaves_same_height ALT or EpToken"); if (depth == 0) { return 0; } else { if ( ! MR_all_leaves_same_height(t->down,depth-1)) { return 0; }; if (t->right == NULL) { return 1; } else { return MR_all_leaves_same_height(t->right,depth); }; }; } #ifdef __USE_PROTOS void MR_projectTreeOntoSet(Tree *tree,int ck,set *ckset) #else void MR_projectTreeOntoSet(tree,ck,ckset) Tree *tree; int ck; set *ckset; #endif { if (tree == NULL) return; require(tree->token != EpToken,"MR_projectTreeOntoSet: EpToken unexpected\n"); MR_projectTreeOntoSet(tree->right,ck,ckset); if (tree->token == ALT) { MR_projectTreeOntoSet(tree->down,ck,ckset); } else { if (ck > 1) { MR_projectTreeOntoSet(tree->down,ck-1,ckset); } else { set_orel(tree->token,ckset); }; }; } #ifdef __USE_PROTOS int MR_comparePredicates(Predicate *a,Predicate *b) #else int MR_comparePredicates(a,b) Predicate *a; Predicate *b; #endif { Predicate *p; Predicate *q; if (a == b) return 1; if (a == NULL || b == NULL ) return 0; if (a->down == NULL && b->down == NULL) { /* predicate->invert can be set only in the predEntry predicates */ /* thus they are only visible after the predEntry predicates have been "unfolded" */ int sameSource=(a->source == b->source); int sameInvert= 1 & (1 +a->inverted + b->inverted + a->source->inverted + b->source->inverted); int samePredEntry=(a->source->predEntry != NULL && b->source->predEntry != NULL && a->source->predEntry == b->source->predEntry); if (sameInvert && (sameSource || samePredEntry)) { if (MR_identicalContext(a,b)) { return 1; }; }; return 0; }; if (a->down == NULL || b->down == NULL) return 0; if (a->expr != b->expr) return 0; for (p=a->down; p != NULL; p=p->right) { for (q=b->down; q != NULL; q=q->right) { if (MR_comparePredicates(p,q)) goto NEXT_P; }; return 0; NEXT_P: continue; }; return 1; } /* * action->inverted can be set only when a predicate symbol appears in * a rule: "rule : <>? X". It cannot be set under any * other circumstances. In particular it cannot be set by * "#pred NotA !A" or by "#pred Nota <>?". The first case * creates a predEntry and the predicate expression of that predEntry * has inverted set. In the second case, the code for handling "!" * is only present in buildAction, which is not called by the #pred * semantic routines, only when a <<...>>? is recognized as part of * a rule definition. * * predicate->inverted can only be set by a predicate created by a #pred * expression, such as "#pred NotA !A" or "#pred NotXY ! (X && Y) or * "#pred XbarY !(X && Y)". In particular, it cannot be set by any * predicate expression occurring under any other circumstances. * The #pred predicate expresssions are stored with in predEntry->pred * and do not normally appear anywhere else until the predicates are * "unfolded" in order to recognize redundancies, conflicts, and * tautologies. * * The unfold routine expands all references to #pred expressions. * * The simplifyInvert goes through and propagates the invert bit so that * all OR and AND nodes are un-inverted. * * Note that !(A and B) => (!A or !B) * !(A or B) => (!A and !B) * * MR_unfold() is called to expand predicate symbols by replacing predicates * that reference predicate entries with the copies of the predicate entries. * Each reference receives a duplicate of the original. This is necessary * because the next phase involves simplification and removal of redundant * predicate nodes. Anyway, the point I'm making is that predicate->invert * should not be set in any predicate until it has been expanded. * * This is a recursive structure, but there is no need for "recursive expansion" * by which I mean a predicate symbol refers to other predicate symbols which * must also be expanded. * * Recursive expansion is *not* performed by this routine because it is not * necessary. Expansion of references is performed by predPrimary when * a new predicate symbol is created by referring to others in the pred expr. */ #ifdef __USE_PROTOS Predicate *MR_unfold(Predicate *pred) #else Predicate *MR_unfold(pred) Predicate *pred; #endif { Predicate *result; if (pred == NULL) return NULL; pred->right=MR_unfold(pred->right); if (pred->down == NULL) { if (pred->source->predEntry != NULL) { if (pred->source->predEntry->pred == NULL) { ; /* do nothing */ /* a reference to a literal #pred (perhaps with "!" */ } else { result=predicate_dup_without_context(pred->source->predEntry->pred); if (pred->inverted) { result->inverted=!result->inverted; }; if (pred->source->inverted) { result->inverted=!result->inverted; }; result->right=pred->right; pred->right=NULL; predicate_free(pred); /*** result=MR_unfold(result); *** not necessary */ /* recursive expansion */ return result; }; } else { ; /* do nothing */ /* an inline literal predicate */ }; } else { pred->down=MR_unfold(pred->down); }; return pred; } /* this should be called immediately after MR_unfold() and at no other times */ #ifdef __USE_PROTOS void MR_simplifyInverted(Predicate *pred,int inverted) #else void MR_simplifyInverted(pred,inverted) Predicate *pred; int inverted; #endif { int newInverted; if (pred == NULL) return; MR_simplifyInverted(pred->right,inverted); newInverted= 1 & (inverted + pred->inverted); if (pred->down == NULL) { pred->inverted=newInverted; } else { if (newInverted != 0) { if (pred->expr == PRED_AND_LIST) { pred->expr=PRED_OR_LIST; } else { pred->expr=PRED_AND_LIST; }; }; pred->inverted=0; MR_simplifyInverted(pred->down,newInverted); }; } /* only remove it from AND and OR nodes, not leaves */ #ifdef __USE_PROTOS void MR_clearPredEntry(Predicate *p) #else void MR_clearPredEntry(p) Predicate *p; #endif { if (p == NULL) return; MR_clearPredEntry(p->down); MR_clearPredEntry(p->right); if (p->down != NULL) p->predEntry=NULL; } #ifdef __USE_PROTOS void MR_orphanRules(FILE *f) #else void MR_orphanRules(f) FILE *f; #endif { set a; Junction *p; unsigned e; RuleEntry *re; a=empty; if (! InfoO) return; for (p=SynDiag; p!=NULL; p = (Junction *)p->p2) { if ( (Junction *) (p->end)->p1 == NULL) { re=(RuleEntry *) hash_get(Rname,p->rname); require (re != NULL,"RuleEntry == NULL"); set_orel(re->rulenum, &a); } } if (set_deg(a) > 1) { fprintf(f,"note: Start rules: {"); for (; !set_nil(a); set_rm(e,a)) { e=set_int(a); fprintf(f," %s",RulePtr[e]->rname); }; fprintf(f," }\n"); }; set_free( a ); } /* merge (X Y) and (X) to create (X) */ static int *mergeChain; static Tree *mergeTree; #ifdef __USE_PROTOS Tree *MR_merge_tree_contexts_client(Tree *t,int chain[]) #else Tree *MR_merge_tree_contexts_client(t,chain) Tree *t; int chain[]; #endif { if (t == NULL) return NULL; if (chain[0] == 0) { Tree *u=t->right; t->right=NULL; Tfree(t); return MR_merge_tree_contexts_client(u,&chain[0]); } if (chain[0] == t->token) { t->down=MR_merge_tree_contexts_client(t->down,&chain[1]); }; t->right=MR_merge_tree_contexts_client(t->right,&chain[0]); return t; } #ifdef __USE_PROTOS void MR_iterateOverTreeContexts(Tree *t,int chain[]) #else void MR_iterateOverTreeContexts(t,chain) Tree *t; int chain[]; #endif { if (t == NULL) return; chain[0]=t->token; if (t->down != NULL) { MR_iterateOverTreeContexts(t->down,&chain[1]); } else { MR_merge_tree_contexts_client(mergeTree,mergeChain); }; MR_iterateOverTreeContexts(t->right,&chain[0]); chain[0]=0; } #ifdef __USE_PROTOS Tree *MR_merge_tree_contexts(Tree *t) #else Tree *MR_merge_tree_contexts(t) Tree *t; #endif { int h=MR_max_height_of_tree(t); mergeTree=t; mergeChain=(int *) calloc(h+1,sizeof(int)); require (mergeChain != NULL,"MR_merge_tree_contexts: can't alloc chain"); MR_iterateOverTreeContexts(t,mergeChain); t=tshrink(t); t=tflatten(t); t=tleft_factor(t); free ( (char *) mergeChain); mergeChain=NULL; return t; } #ifdef __USE_PROTOS Tree *MR_compute_pred_tree_context(Predicate *p) #else Tree *MR_compute_pred_tree_context(p) Predicate *p; #endif { Tree *t; t=MR_compute_pred_tree_ctxXX(p); MR_merge_tree_contexts(t); return t; } #ifdef __USE_PROTOS void MR_guardPred_plainSet(ActionNode *anode,Predicate *pred) #else void MR_guardPred_plainSet(anode,pred) ActionNode *anode; Predicate *pred; #endif { Junction *j; Predicate *workPred; set maskSet; maskSet=empty; if (!MRhoisting) return; /* it doesn't really matter whether the predicate has depth k=1 or k>1 because we're not really looking at the predicate itself, just the stuff "behind" the predicate. */ /* shouldn't have to worry about REACHing off the end of the rule containing the predicate because the Rule->end->halt should have been set already by the the code which handles RuleRef nodes. We don't want to REACH off the end of the rule because this would give the "global" follow context rather than the "local" context. r1a : (A)? => <

>? r2 (A|B) r1b : (A)? => <

>? r2 (A|C) r2 : (); For r1a we want follow of predicate = {A B} we want plainSet = {B} For r1b we want follow of predicate = {A C} we want plainSet = {C} */ require (anode->next->ntype == nJunction,"MR_guardpred_plainSet not Junction"); j=(Junction *)(anode->next); workPred=predicate_dup_without_context(pred); workPred->k=1; workPred->scontext[1]=MR_First(1,j, &(workPred->completionSet) ); MR_complete_predicates(1,workPred); if (pred->k == 1) { maskSet=pred->scontext[1]; } else { MR_projectTreeOntoSet(pred->tcontext,1,&maskSet); } pred->plainSet=set_dif(workPred->scontext[1],maskSet); predicate_free(workPred); } /*******************************************************************************/ static Tree * suppressTree; static int * suppressChain; /* element 0 not used */ static set * suppressSets; static Node * suppressNode; static int suppressChainLength; int MR_SuppressSearch=0; static int suppressSucceeded; static Predicate * suppressPredicate; #ifdef __USE_PROTOS int MR_isChain(Tree *t) #else int MR_isChain(t) Tree *t; #endif { Tree *u; for (u=t; u != NULL; u=u->down) { if (u->right != NULL) return 0; } return 1; } #ifdef __USE_PROTOS int MR_suppressK_client(Tree *tree,int tokensInChain[]) #else int MR_suppressK_client(tree,tokensInChain) Tree *tree; int tokensInChain[]; #endif { int i; set *save_fset; int save_ConstrainSearch; set incomplete; Tree *t; suppressSucceeded=0; /* volatile */ if (suppressSets == NULL) { suppressSets=(set *) calloc (CLL_k+1,sizeof(set)); require (suppressSets != NULL,"MR_suppressK_client: suppressSets alloc"); }; for (suppressChainLength=1; tokensInChain[suppressChainLength+1] != 0; suppressChainLength++) {}; require (suppressChainLength != 0,"MR_suppressK_client: chain empty"); for (i=1 ; i <= suppressChainLength ; i++) { set_clr(suppressSets[i]); set_orel( (unsigned) tokensInChain[i], &suppressSets[i]); }; save_fset=fset; save_ConstrainSearch=ConstrainSearch; fset=suppressSets; MR_SuppressSearch=1; MR_AmbSourceSearch=1; MR_MaintainBackTrace=1; ConstrainSearch=1; maxk = suppressChainLength; incomplete=empty; t=NULL; /*** constrain = &(fset[1]); ***/ MR_setConstrainPointer(&(fset[1])); /* MR18 */ MR_pointerStackReset(&MR_BackTraceStack); TRAV(suppressNode,maxk,&incomplete,t); Tfree(t); require (set_nil(incomplete),"MR_suppressK_client TRAV incomplete"); require (MR_BackTraceStack.count == 0, "MR_suppressK_client: MR_BackTraceStack.count != 0"); set_free(incomplete); ConstrainSearch=save_ConstrainSearch; fset=save_fset; MR_AmbSourceSearch=0; MR_MaintainBackTrace=0; MR_SuppressSearch=0; return suppressSucceeded; } #ifdef __USE_PROTOS Tree * MR_iterateOverTreeSuppressK(Tree *t,int chain[]) #else Tree * MR_iterateOverTreeSuppressK(t,chain) Tree *t; int chain[]; #endif { if (t == NULL) return NULL; t->right=MR_iterateOverTreeSuppressK(t->right,&chain[0]); chain[0]=t->token; if (t->down != NULL) { t->down=MR_iterateOverTreeSuppressK(t->down,&chain[1]); if (t->down == NULL) { Tree *u=t->right; t->right=NULL; Tfree(t); chain[0]=0; return u; }; } else { MR_suppressK_client(suppressTree,suppressChain); if (suppressSucceeded) { Tree *u=t->right; t->right=NULL; Tfree(t); chain[0]=0; return u; }; }; chain[0]=0; return t; } /* @@@ */ #ifdef __USE_PROTOS Predicate * MR_suppressK(Node *j,Predicate *p) #else Predicate * MR_suppressK(j,p) Node *j; Predicate *p; #endif { Predicate *result; int guardPred=0; int ampersandPred=0; Node *nodePrime; if (! MRhoistingk) { return p; } if (! MRhoisting) return p; if (CLL_k == 1) return p; if (suppressChain == NULL) { suppressChain=(int *) calloc(CLL_k+2,sizeof(int)); require (suppressChain != NULL,"MR_suppressK: can't allocate chain"); } if (p == NULL) return NULL; if (j->ntype == nJunction) { nodePrime=(Node *) MR_junctionWithoutP2( (Junction *) j); } else { nodePrime=j; }; p->down=MR_suppressK(j,p->down); p->right=MR_suppressK(j,p->right); if (p->down != NULL) { result=p; goto EXIT; }; if (p->k == 1) { result=p; goto EXIT; }; if (p->source != NULL) { if (p->source->guardpred != NULL) guardPred=1; if (p->source->ampersandPred != NULL) ampersandPred=1; } suppressPredicate=p; suppressNode=nodePrime; /* was j*/ suppressTree=p->tcontext; if (guardPred || ampersandPred) { p->tcontext=MR_iterateOverTreeSuppressK(suppressTree,&suppressChain[1]); if (p->tcontext == NULL) { predicate_free(p); result=NULL; goto EXIT; }; } else { if (MR_isChain(p->tcontext)) { p->tcontext=MR_iterateOverTreeSuppressK(suppressTree,&suppressChain[1]); if (p->tcontext == NULL) { predicate_free(p); result=NULL; goto EXIT; }; } } result=p; EXIT: return result; } #ifdef __USE_PROTOS void MR_suppressSearchReport(void) #else void MR_suppressSearchReport() #endif { int i; Node *p; TokNode *tn; int depth; set setAnd; /* number of tokens in back trace stack matches length of chain */ depth=0; for (i=0; i < MR_BackTraceStack.count ; i++) { p=(Node *) MR_BackTraceStack.data[i]; if (p->ntype == nToken) depth++; }; require (depth == suppressChainLength,"depth > suppressChainLength"); /* token codes match chain */ depth=0; for (i=0; i < MR_BackTraceStack.count ; i++) { p=(Node *) MR_BackTraceStack.data[i]; if (p->ntype != nToken) continue; tn=(TokNode *) p; depth++; if (set_nil(tn->tset)) { require(set_el( (unsigned) tn->token,fset[depth]), "MR_suppressSearchReport: no match to #token in chain"); } else { setAnd=set_and(fset[depth],tn->tset); require(!set_nil(setAnd), "MR_suppressSearchReport: no match to #token set in chain"); set_free(setAnd); }; }; /* have a match - now remove it from the predicate */ suppressSucceeded=1; if (suppressSucceeded) { fprintf(output,"\n"); fprintf(output,"#if 0\n"); fprintf(output,"\n"); fprintf(output,"Part (or all) of predicate with depth > 1 suppressed by "); fprintf(output,"alternative without predicate\n\n"); MR_dumpPred(suppressPredicate,1); fprintf(output,"The token sequence which is suppressed:"); fprintf(output," ("); for (i=1; i <= suppressChainLength; i++) { fprintf(output," %s",TerminalString(suppressChain[i])); }; fprintf(output," )\n"); fprintf(output,"The sequence of references which generate that sequence of tokens:\n\n"); MR_backTraceDumpItemReset(); for (i=0; i < MR_BackTraceStack.count ; i++) { MR_backTraceDumpItem(output,0,(Node *) MR_BackTraceStack.data[i]); }; fprintf(output,"\n"); fprintf(output,"#endif\n"); } } #ifdef __USE_PROTOS void MR_markCompromisedRule(Node *n) #else void MR_markCompromisedRule(n) Node *n; #endif { RuleEntry *q; Node *mark=NULL; Junction *j; if (n->ntype == nRuleRef) { mark=(Node *) MR_ruleReferenced( (RuleRefNode *) n); } else if (n->ntype == nToken) { mark=n; } else if (n->ntype == nJunction) { j=(Junction *)n; switch (j->jtype) { case aOptBlk: case aLoopBlk: case RuleBlk: case EndRule: case aPlusBlk: case aLoopBegin: mark=n; break; default: break; }; } if (mark == NULL) return; require (RulePtr != NULL,"RulePtr not initialized"); q = (RuleEntry *) hash_get(Rname,mark->rname); require (q != NULL,"RuleEntry not found"); set_orel(q->rulenum,&MR_CompromisedRules); } #ifdef __USE_PROTOS void MR_alphaBetaTraceReport(void) #else void MR_alphaBetaTraceReport() #endif { int i; if (! AlphaBetaTrace) return; MR_AlphaBetaMessageCount++; fprintf(output,"\n"); fprintf(output,"#if 0\n"); fprintf(output,"\n"); fprintf(output,"Trace of references leading to attempt to compute the follow set of\n"); fprintf(output,"alpha in an \"(alpha)? beta\" block. It is not possible for antlr to\n"); fprintf(output,"compute this follow set because it is not known what part of beta has\n"); fprintf(output,"already been matched by alpha and what part remains to be matched.\n"); fprintf(output,"\n"); fprintf(output,"Rules which make use of the incorrect follow set will also be incorrect\n"); fprintf(output,"\n"); MR_backTraceDumpItemReset(); for (i=0; i < MR_BackTraceStack.count ; i++) { MR_backTraceDumpItem(output,0,(Node *) MR_BackTraceStack.data[i]); if (i < MR_BackTraceStack.count-1) { MR_markCompromisedRule( (Node *) MR_BackTraceStack.data[i]); }; }; fprintf(output,"\n"); fprintf(output,"#endif\n"); } #ifdef __USE_PROTOS void MR_dumpRuleSet(set s) #else void MR_dumpRuleSet(s) set s; #endif { unsigned *cursor; unsigned *origin=set_pdq(s); require(origin != NULL,"set_pdq failed"); if (RulePtr == NULL) { fprintf(stderr,"RulePtr[] not yet initialized"); } else { for (cursor=origin; *cursor != nil ; cursor++) { /**** if (cursor != origin) fprintf(stderr,","); ****/ fprintf(stderr," %s",RulePtr[*cursor]->rname); fprintf(stderr,"\n"); }; free( (char *) origin); }; } gtkwave-3.3.86/contrib/pccts/antlr/egman.c0000664000175000017500000002203613166335473017736 0ustar bybellbybell/* * egman.c * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * ANTLR 1.33MR10 * 2001 * */ #include #include #include "set.h" #include "syn.h" #include "hash.h" #include "generic.h" #include "proto.h" static ExceptionGroup **egArray=NULL; /* ExceptionGroup by BlkLevel */ static LabelEntry **leArray=NULL; /* LabelEntry by BlkLevel */ static Junction **altArray=NULL; /* start of alternates */ static int arraySize=0; static int highWater=0; static ExceptionGroup *lastEG=NULL; /* used in altFixup() */ static int lastBlkLevel=0; /* used in altFixup() */ #ifdef __USE_PROTOS static void arrayCheck(void); #else static void arrayCheck(); #endif /* Called to add an exception group for an alternative EG */ #ifdef __USE_PROTOS void egAdd(ExceptionGroup * eg) #else void egAdd(eg) ExceptionGroup *eg; #endif { int i; ExceptionGroup *nextEG; ExceptionGroup *innerEG; LabelEntry *nextLE; LabelEntry *innerLE; Junction *nextAlt; Junction *innerAlt; lastEG=eg; lastBlkLevel=BlkLevel; arrayCheck(); eg->pendingLink=egArray[BlkLevel]; egArray[BlkLevel]=eg; /* EG for alternates already have their altID filled in */ for (i=BlkLevel+1; i<=highWater ; i++) { for (innerEG=egArray[i]; innerEG != NULL ; innerEG=nextEG) { nextEG=innerEG->pendingLink; innerEG->pendingLink=NULL; innerEG->outerEG=eg; }; egArray[i]=NULL; }; /* * for patching up the LabelEntry you might use an EG for the * current alternative - unlike patching up an alternative EG * i.e. start the loop at BlkLevel rather than (BlkLevel+1) * fill it in only if the EG and the LE are for the very * same alternative if they're at the same BlkLevel * it's easier to leave the LE on this list (filled in) rather than * trying to selectively remove it. It will eventually be * removed anyway when the BlkLevel gets small enough. */ for (i=BlkLevel; i<=highWater ; i++) { for (innerLE=leArray[i]; innerLE != NULL ; innerLE=nextLE) { nextLE=innerLE->pendingLink; if (BlkLevel != i || innerLE->curAltNum == CurAltNum_array[BlkLevel]) { if (innerLE->outerEG == NULL) { innerLE->outerEG=eg; }; }; }; if (BlkLevel != i) leArray[i]=NULL; }; /* * For the start of alternatives it is necessary to make a * distinction between the exception group for the current * alternative and the "fallback" EG for the block which * contains the alternative * * The fallback outerEG is used to handle the case where * no alternative of a block matches. In that case the * signal is "NoViableAlt" (or "NoSemViableAlt" and the * generator needs the EG of the block CONTAINING the * current one. * * rule: ( ( ( a * | b * ) * | c * ) * | d * ); */ for (i=BlkLevel; i <= highWater ; i++) { for (innerAlt=altArray[i]; innerAlt != NULL ; innerAlt=nextAlt) { nextAlt=innerAlt->pendingLink; /* first fill in the EG for the current alternative */ /* but leave it on the list in order to get the fallback EG */ /* if the EG is at the same LEVEL as the alternative then */ /* fill it in only if in the very same alternative */ /* */ /* rule: ( a */ /* | b */ /* | c exception ... */ /* ) */ /* */ /* if the EG is outside the alternative (e.g. BlkLevel < i) */ /* then it doesn't matter about the alternative */ /* */ /* rule: ( a */ /* | b */ /* | c */ /* ) exception ... */ /* */ #if 0 printf("BlkLevel=%d i=%d altnum=%d CurAltNum=%d altID=%s\n", BlkLevel,i,innerAlt->curAltNum,CurAltNum_array[BlkLevel],eg->altID); #endif if (BlkLevel != i || innerAlt->curAltNum == CurAltNum_array[BlkLevel]) { if (innerAlt->exception_label == NULL) { innerAlt->exception_label=eg->altID; }; }; /* ocurs at a later pass then for the exception_label */ /* if an outerEG has been found then fill in the outer EG */ /* remove if from the list when the BlkLevel gets smaller */ if (BlkLevel != i) { if (innerAlt->outerEG == NULL) { innerAlt->outerEG=eg; }; }; }; if (BlkLevel != i) altArray[i]=NULL; }; } #ifdef __USE_PROTOS void leAdd(LabelEntry * le) #else void leAdd(le) LabelEntry *le; #endif { arrayCheck(); le->pendingLink=leArray[BlkLevel]; le->curAltNum=CurAltNum_array[BlkLevel]; leArray[BlkLevel]=le; } #ifdef __USE_PROTOS void altAdd(Junction *alt) #else void altAdd(alt) Junction *alt; #endif { arrayCheck(); #if 0 printf("BlkLevel=%d CurAltNum=%d\n", BlkLevel,CurAltNum_array[BlkLevel]); #endif alt->curAltNum=CurAltNum_array[BlkLevel]; alt->pendingLink=altArray[BlkLevel]; altArray[BlkLevel]=alt; } static void #ifdef __USE_PROTOS arrayCheck(void) #else arrayCheck() #endif { ExceptionGroup **egArrayNew; LabelEntry **leArrayNew; Junction **altArrayNew; int arraySizeNew; int i; if (BlkLevel > highWater) highWater=BlkLevel; if (BlkLevel >= arraySize) { arraySizeNew=BlkLevel+5; /* MR20 */ egArrayNew=(ExceptionGroup **) calloc(arraySizeNew,sizeof(ExceptionGroup *)); leArrayNew=(LabelEntry **) calloc(arraySizeNew,sizeof(LabelEntry *)); altArrayNew=(Junction **) calloc(arraySizeNew,sizeof(Junction *)); for (i=0; ipendingLink; innerEG->pendingLink=NULL; }; egArray[i]=NULL; }; lastEG=NULL; lastBlkLevel=0; } /* always call leFixup() BEFORE egFixup() */ #ifdef __USE_PROTOS void leFixup(void) #else void leFixup() #endif { int i; LabelEntry *nextLE; LabelEntry *innerLE; for (i=BlkLevel; i<=highWater ; i++) { for (innerLE=leArray[i]; innerLE != NULL ; innerLE=nextLE) { nextLE=innerLE->pendingLink; innerLE->pendingLink=NULL; }; leArray[i]=NULL; }; } /* always call altFixup() BEFORE egFixup() */ #ifdef __USE_PROTOS void altFixup(void) #else void altFixup() #endif { int i; Junction *nextAlt; Junction *innerAlt; for (i=BlkLevel; i<=highWater ; i++) { for (innerAlt=altArray[i]; innerAlt != NULL ; innerAlt=nextAlt) { /* if an outerEG has been found then fill in the outer EG */ if (lastBlkLevel <= i) { if (innerAlt->outerEG == NULL) { innerAlt->outerEG=lastEG; }; }; nextAlt=innerAlt->pendingLink; innerAlt->pendingLink=NULL; }; altArray[i]=NULL; }; } gtkwave-3.3.86/contrib/pccts/antlr/err.c0000664000175000017500000004660413166335473017446 0ustar bybellbybell/* * A n t l r S e t s / E r r o r F i l e H e a d e r * * Generated from: ./antlr.g * * Terence Parr, Russell Quong, Will Cohen, and Hank Dietz: 1989-2001 * Parr Research Corporation * with Purdue University Electrical Engineering * With AHPCRC, University of Minnesota * ANTLR Version 1.33MR33 */ #define ANTLR_VERSION 13333 #include "pcctscfg.h" #include "pccts_stdio.h" #include "pcctscfg.h" #include "set.h" #include #include "syn.h" #include "hash.h" #include "generic.h" #define zzcr_attr(attr,tok,t) #define zzSET_SIZE 20 #include "antlr.h" #include "tokens.h" #include "dlgdef.h" #include "err.h" ANTLRChar *zztokens[157]={ /* 00 */ "Invalid", /* 01 */ "Eof", /* 02 */ "QuotedTerm", /* 03 */ "\\n|\\r|\\r\\n", /* 04 */ "\\(\\n|\\r|\\r\\n)", /* 05 */ "\\~[]", /* 06 */ "~[\\n\\r\"\\]+", /* 07 */ "\"", /* 08 */ "\\n|\\r|\\r\\n", /* 09 */ "\\(\\n|\\r|\\r\\n)", /* 10 */ "\\~[]", /* 11 */ "~[\\n\\r\"\\]+", /* 12 */ "'", /* 13 */ "\\n|\\r|\\r\\n", /* 14 */ "\\~[]", /* 15 */ "~[\\n\\r'\\]+", /* 16 */ "\\*/", /* 17 */ "\\*", /* 18 */ "\\n|\\r|\\r\\n", /* 19 */ "~[\\n\\r\\*]+", /* 20 */ "\\*/", /* 21 */ "\\*", /* 22 */ "\\n|\\r|\\r\\n", /* 23 */ "~[\\n\\r\\*]+", /* 24 */ "\\n|\\r|\\r\\n", /* 25 */ "~[\\n\\r]+", /* 26 */ "\\n|\\r|\\r\\n", /* 27 */ "~[\\n\\r]+", /* 28 */ "\\n|\\r|\\r\\n", /* 29 */ "~[\\n\\r]+", /* 30 */ "\\*/", /* 31 */ "\\*", /* 32 */ "\\n|\\r|\\r\\n", /* 33 */ "~[\\n\\r\\*]+", /* 34 */ "Action", /* 35 */ "Pred", /* 36 */ "PassAction", /* 37 */ "consumeUntil\\( [\\ \\t]* \\{~[\\}]+\\} [\\ \\t]* \\)", /* 38 */ "consumeUntil\\( ~[\\)]+ \\)", /* 39 */ "\\n|\\r|\\r\\n", /* 40 */ "\\>", /* 41 */ "$", /* 42 */ "$$", /* 43 */ "$\\[\\]", /* 44 */ "$\\[", /* 45 */ "$[0-9]+", /* 46 */ "$[0-9]+.", /* 47 */ "$[0-9]+.[0-9]+", /* 48 */ "$[_a-zA-Z][_a-zA-Z0-9]*", /* 49 */ "#0", /* 50 */ "#\\[\\]", /* 51 */ "#\\(\\)", /* 52 */ "#[0-9]+", /* 53 */ "#line[\\ \\t]* [0-9]+ {[\\ \\t]* \"~[\"]+\" ([\\ \\t]* [0-9]*)* } (\\n|\\r|\\r\\n)", /* 54 */ "#line ~[\\n\\r]* (\\n|\\r|\\r\\n)", /* 55 */ "#[_a-zA-Z][_a-zA-Z0-9]*", /* 56 */ "#\\[", /* 57 */ "#\\(", /* 58 */ "#", /* 59 */ "\\)", /* 60 */ "\\[", /* 61 */ "\\(", /* 62 */ "\\\\]", /* 63 */ "\\\\)", /* 64 */ "\\>", /* 65 */ "'", /* 66 */ "\"", /* 67 */ "\\$", /* 68 */ "\\#", /* 69 */ "\\(\\n|\\r|\\r\\n)", /* 70 */ "\\~[\\]\\)>$#]", /* 71 */ "/", /* 72 */ "/\\*", /* 73 */ "\\*/", /* 74 */ "//", /* 75 */ "~[\\n\\r\\)\\(\\$#\\>\\]\\[\"'/]+", /* 76 */ "[\\t\\ ]+", /* 77 */ "\\n|\\r|\\r\\n", /* 78 */ "\\[", /* 79 */ "\\<\\<", /* 80 */ "\"", /* 81 */ "/\\*", /* 82 */ "\\*/", /* 83 */ "//", /* 84 */ "#line[\\ \\t]* [0-9]+ {[\\ \\t]* \"~[\"]+\" ([\\ \\t]* [0-9]*)* } (\\n|\\r|\\r\\n)", /* 85 */ "#line ~[\\n\\r]* (\\n|\\r|\\r\\n)", /* 86 */ "\\>\\>", /* 87 */ "WildCard", /* 88 */ "\\@", /* 89 */ "LABEL", /* 90 */ "grammar-element", /* 91 */ "meta-symbol", /* 92 */ "Pragma", /* 93 */ "FirstSetSymbol", /* 94 */ "{\\}#header", /* 95 */ "{\\}#first", /* 96 */ "{\\}#parser", /* 97 */ "{\\}#tokdefs", /* 98 */ "\\}", /* 99 */ "class", /* 100 */ "NonTerminal", /* 101 */ "TokenTerm", /* 102 */ "\\{", /* 103 */ "!", /* 104 */ "\\<", /* 105 */ "\\>", /* 106 */ ":", /* 107 */ ";", /* 108 */ "{\\}#lexaction", /* 109 */ "{\\}#lexmember", /* 110 */ "{\\}#lexprefix", /* 111 */ "{\\}#pred", /* 112 */ "\\|\\|", /* 113 */ "&&", /* 114 */ "\\(", /* 115 */ "\\)", /* 116 */ "{\\}#lexclass", /* 117 */ "{\\}#errclass", /* 118 */ "{\\}#tokclass", /* 119 */ "..", /* 120 */ "{\\}#token", /* 121 */ "=", /* 122 */ "[0-9]+", /* 123 */ "\\|", /* 124 */ "\\~", /* 125 */ "^", /* 126 */ "approx", /* 127 */ "LL\\(1\\)", /* 128 */ "LL\\(2\\)", /* 129 */ "\\*", /* 130 */ "\\+", /* 131 */ "?", /* 132 */ "=>", /* 133 */ "exception", /* 134 */ "default", /* 135 */ "catch", /* 136 */ "{\\}#[A-Za-z0-9_]*", /* 137 */ "[\\t\\ ]+", /* 138 */ "\\n|\\r|\\r\\n", /* 139 */ "//", /* 140 */ "/\\*", /* 141 */ "#ifdef", /* 142 */ "#if", /* 143 */ "#ifndef", /* 144 */ "#else", /* 145 */ "#endif", /* 146 */ "#undef", /* 147 */ "#import", /* 148 */ "ID", /* 149 */ "#define", /* 150 */ "INT", /* 151 */ "enum", /* 152 */ "\\{", /* 153 */ "=", /* 154 */ ",", /* 155 */ "\\}", /* 156 */ ";" }; SetWordType zzerr1[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x30,0x0,0x0,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr2[20] = {0xfc,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xf3, 0xbf,0xff,0xff,0xff, 0xff,0xff,0xff,0x1f}; SetWordType zzerr3[20] = {0xfc,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xfb, 0x3b,0xf7,0xf7,0xc7, 0xff,0xff,0xff,0x1f}; SetWordType zzerr4[20] = {0x4,0x0,0x0,0x0, 0x10,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x80,0x7,0x0,0x0, 0x0,0x0,0x0,0x0}; SetWordType setwd1[157] = {0x0,0x50,0xa0,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x6a,0x20,0xa0,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x0,0x0,0x20,0x20,0x21, 0x21,0x21,0x21,0x6e,0x6e,0x64,0x20,0x0, 0x20,0xa0,0xa0,0xa0,0x20,0x6a,0x6a,0x6a, 0x6e,0x20,0x20,0x20,0x20,0x66,0x6e,0x6e, 0x20,0x66,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20}; SetWordType zzerr5[20] = {0x0,0x0,0x0,0x0, 0x10,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x1,0x0,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr6[20] = {0x4,0x0,0x0,0x0, 0x10,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x7,0x0,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr7[20] = {0x4,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x6,0x0,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr8[20] = {0x4,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x4,0x0,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr9[20] = {0x2,0x0,0x0,0x0, 0x4,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x1c,0xf0,0x70,0x1, 0x20,0x0,0x0,0x0}; SetWordType setwd2[157] = {0x0,0xf8,0x6,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0xf8,0x0,0x1,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0xf8,0xf8,0xf8,0x0,0x0, 0x0,0x1,0x2,0x6,0x0,0xf8,0xf8,0xf8, 0xf8,0x0,0x0,0x0,0x0,0xf8,0xf8,0xf8, 0x0,0xf8,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0xe8,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0}; SetWordType zzerr10[20] = {0x2,0x0,0x0,0x0, 0x4,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0xbc,0xf8,0x74,0x1, 0x20,0x0,0x0,0x0}; SetWordType zzerr11[20] = {0x0,0x0,0x0,0x0, 0x8,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0xa0,0x0,0x4,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr12[20] = {0x2,0x0,0x0,0x0, 0x4,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x1c,0xf8,0x70,0x1, 0x20,0x0,0x0,0x0}; SetWordType zzerr13[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0xa0,0x0,0x4,0x0, 0x0,0x0,0x0,0x0}; SetWordType setwd3[157] = {0x0,0xfa,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0xfa,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0xfa,0xfa,0xfa,0x5,0x0, 0x5,0x0,0x0,0x0,0xe2,0xfa,0xfa,0xfa, 0xfa,0xc0,0x80,0x5,0xe0,0xfa,0xfa,0xfa, 0x0,0xfa,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0xfa,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0}; SetWordType zzerr14[20] = {0x4,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x20,0x0,0x0,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr15[20] = {0x4,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x30,0x0,0x0,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr16[20] = {0x4,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x30,0x0,0x0,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr17[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x40,0x0,0x4,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr18[20] = {0x4,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x24,0x0,0x80,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr19[20] = {0x4,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x20,0x0,0x0,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr20[20] = {0x6,0x0,0x0,0x0, 0x4,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x1c,0xf8,0x74,0x3, 0x20,0x0,0x0,0x0}; SetWordType zzerr21[20] = {0x6,0x0,0x0,0x0, 0x4,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x1c,0xf8,0x70,0x3, 0x20,0x0,0x0,0x0}; SetWordType setwd4[157] = {0x0,0xe5,0xda,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0xe5,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0xed,0xe5,0xe7,0x1a,0x0, 0x0,0x0,0x0,0x0,0xc0,0xe5,0xe5,0xe5, 0xe5,0x0,0x0,0x0,0x0,0xe5,0xe5,0xe5, 0x0,0xe5,0x40,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0xe5,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0}; SetWordType zzerr22[20] = {0x6,0x0,0x0,0x0, 0x4,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x3c,0xf8,0x70,0x1, 0x20,0x0,0x0,0x0}; SetWordType zzerr23[20] = {0x6,0x0,0x0,0x0, 0x4,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x1c,0xf8,0x70,0x1, 0x20,0x0,0x0,0x0}; SetWordType zzerr24[20] = {0x2,0x0,0x0,0x0, 0x4,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x1c,0xf8,0x70,0x1, 0x20,0x0,0x0,0x0}; SetWordType zzerr25[20] = {0x2,0x0,0x0,0x0, 0x4,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x1c,0xf8,0x70,0x1, 0x20,0x0,0x0,0x0}; SetWordType zzerr26[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x5, 0x4,0x8,0x8,0x18, 0x20,0x0,0x0,0x0}; SetWordType setwd5[157] = {0x0,0x1f,0xc1,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0xdf,0xc0,0xc0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0xc0,0x0,0xc0,0x0,0x0,0xc0,0xc0,0x0, 0x0,0x0,0x0,0x7f,0x1f,0xdf,0xc0,0xc0, 0x0,0x0,0xc0,0x0,0x67,0x1f,0x1f,0x1f, 0x1f,0x0,0x0,0xc0,0x60,0x1f,0x1f,0x1f, 0x0,0x1f,0x0,0x0,0x40,0xc0,0x0,0x0, 0x0,0x0,0xc0,0xc0,0x0,0x0,0x5f,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0}; SetWordType zzerr27[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x4, 0x0,0x0,0x0,0x10, 0x0,0x0,0x0,0x0}; SetWordType zzerr28[20] = {0x4,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x80,0x2, 0x30,0x0,0x0,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr29[20] = {0x4,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x20,0x0,0x0,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr30[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0xd, 0x0,0x0,0x80,0x0, 0x20,0x0,0x0,0x0}; SetWordType zzerr31[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0xd, 0x0,0x0,0x0,0x0, 0x20,0x0,0x0,0x0}; SetWordType zzerr32[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x5, 0x4,0x8,0x8,0x18, 0x20,0x0,0x0,0x0}; SetWordType zzerr33[20] = {0x4,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x20,0x0,0x0,0x0, 0x0,0x0,0x0,0x0}; SetWordType setwd6[157] = {0x0,0x0,0xfd,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0xe1,0xe1,0xe1,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0xfd,0x60,0xe9,0x0,0x0,0xe1,0xe1,0x0, 0x0,0x0,0x0,0xe2,0x0,0xfd,0xfd,0xe1, 0x20,0x0,0xe1,0x0,0xe2,0x0,0x0,0x0, 0x0,0x0,0x0,0xe1,0xe2,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0xe2,0xe0,0x20,0x0, 0x0,0x0,0xe1,0xe1,0x0,0x0,0xe2,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0}; SetWordType zzerr34[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0xd, 0x0,0x0,0x80,0x0, 0x20,0x0,0x0,0x0}; SetWordType zzerr35[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0xd, 0x0,0x0,0x0,0x0, 0x20,0x0,0x0,0x0}; SetWordType zzerr36[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x5, 0x4,0x8,0x8,0x18, 0x20,0x0,0x0,0x0}; SetWordType zzerr37[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0xc, 0x0,0x0,0x0,0x0, 0x20,0x0,0x0,0x0}; SetWordType zzerr38[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x4, 0x84,0x9,0x8,0x18, 0x20,0x0,0x0,0x0}; SetWordType zzerr39[20] = {0x0,0x0,0x0,0x0, 0x10,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x1,0x0,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr40[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x4, 0x4,0x9,0x8,0x18, 0x20,0x0,0x0,0x0}; SetWordType zzerr41[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x4, 0x4,0x8,0x8,0x18, 0x20,0x0,0x0,0x0}; SetWordType zzerr42[20] = {0x4,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x80,0x0, 0x30,0x0,0x0,0x0, 0x0,0x0,0x0,0x0}; SetWordType setwd7[157] = {0x0,0x0,0xdf,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0xdf,0xdf,0xff,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0xdf,0x3,0xdf,0x0,0x0,0xdf,0xdf,0x0, 0x0,0x0,0x0,0xdf,0x0,0xdf,0xdf,0xdf, 0x1,0x30,0xdf,0x0,0xdf,0x0,0x0,0x0, 0x0,0x0,0x0,0xdf,0xdf,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0xdf,0xdf,0x1,0x0, 0x0,0x0,0xdf,0xdf,0x0,0x0,0xdf,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0}; SetWordType zzerr43[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x4, 0x4,0x8,0x8,0x18, 0x20,0x0,0x0,0x0}; SetWordType zzerr44[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0xc0, 0x1,0x0,0x0,0x0}; SetWordType zzerr45[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x30, 0x40,0x0,0x4,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr46[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x30,0x0,0x0,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr47[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x20, 0x40,0x0,0x4,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr48[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x2,0x0, 0x10,0x0,0x0,0x0}; SetWordType zzerr49[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x4, 0x4,0x8,0x8,0x18, 0x20,0x0,0x0,0x0}; SetWordType zzerr50[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x4, 0x4,0x8,0xa,0x18, 0x30,0x0,0x0,0x0}; SetWordType zzerr51[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x4, 0x4,0x8,0x8,0x18, 0x28,0x0,0x0,0x0}; SetWordType zzerr52[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x40,0x0,0x4,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr53[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x4, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0}; SetWordType setwd8[157] = {0x0,0x0,0xe1,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0xe1,0xe1,0xe1,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0xe1,0x0,0xe1,0x0,0x0,0xe3,0xe7,0x0, 0x0,0x0,0x0,0xe1,0x0,0xe1,0xe1,0xef, 0x0,0x0,0xe1,0x0,0xe1,0x0,0x0,0x0, 0x0,0x0,0x10,0xef,0xe1,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0xe1,0xe1,0x0,0x0, 0x0,0x0,0xe1,0xe1,0x0,0x10,0xe1,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0}; SetWordType zzerr54[20] = {0x2,0x0,0x0,0x0, 0x14,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x1c,0xf8,0x78,0x9, 0xe0,0x0,0x0,0x0}; SetWordType zzerr55[20] = {0x2,0x0,0x0,0x0, 0x4,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x1c,0xf8,0x78,0x9, 0x60,0x0,0x0,0x0}; SetWordType zzerr56[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x30,0x0,0x0,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr57[20] = {0x2,0x0,0x0,0x0, 0x4,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x1c,0xf8,0x78,0x9, 0xe0,0x0,0x0,0x0}; SetWordType setwd9[157] = {0x0,0x7c,0x1,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x7f,0x1,0x1,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x1,0x0,0x1,0x0,0x0,0x1,0x1,0x0, 0x0,0x0,0x0,0x7f,0x7e,0x7f,0x1,0x1, 0x0,0x0,0x1,0x0,0x7d,0x7e,0x7e,0x7e, 0x7e,0x0,0x0,0x1,0x7d,0x7e,0x7e,0x7e, 0x0,0x7e,0x0,0x0,0x7d,0x1,0x0,0x0, 0x0,0x0,0x1,0x1,0x0,0x0,0x7f,0x64, 0x64,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x80,0x0,0x0,0x0,0x0,0x0,0x80,0x0, 0x80,0x0,0x0,0x0,0x0,0x0}; SetWordType zzerr58[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0xa0,0x0}; SetWordType zzerr59[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x80,0xa0,0x0}; SetWordType zzerr60[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0xa0,0x0}; SetWordType zzerr61[20] = {0x2,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x80,0xa0,0x0}; SetWordType zzerr62[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0xe}; SetWordType zzerr63[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0xe}; SetWordType zzerr64[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0xe}; SetWordType zzerr65[20] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x10,0xc}; SetWordType setwd10[157] = {0x0,0xc,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x3,0x0, 0x3,0x0,0x0,0xf0,0xf0,0x0}; SetWordType setwd11[157] = {0x0,0x1,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x1,0x0,0x0,0x0,0x0,0x0}; gtkwave-3.3.86/contrib/pccts/antlr/AntlrMSVC60.dsw0000664000175000017500000000116013166335473021134 0ustar bybellbybellMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "ANTLR"=.\AntlrMSVC60.dsp - Package Owner=<4> Package=<5> {{{ begin source code control AntlrMSVC60 .. end source code control }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### gtkwave-3.3.86/contrib/pccts/antlr/misc.c0000664000175000017500000013372413166335473017611 0ustar bybellbybell/* * misc.c * * Manage tokens, regular expressions. * Print methods for debugging * Compute follow lists onto tail ends of rules. * * The following functions are visible: * * int addTname(char *); Add token name * int addTexpr(char *); Add token expression * int Tnum(char *); Get number of expr/token * void Tklink(char *, char *); Link a name with an expression * int hasAction(expr); Does expr already have action assigned? * void setHasAction(expr); Indicate that expr now has an action * Entry *newEntry(char *,int); Create new table entry with certain size * void list_add(ListNode **list, char *e) * void list_free(ListNode **list, int freeData); *** MR10 *** * void list_apply(ListNode *list, void (*f)()) * void lexclass(char *m); switch to new/old lexical class * void lexmode(int i); switch to old lexical class i * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * ANTLR 1.33 * Terence Parr * Parr Research Corporation * with Purdue University and AHPCRC, University of Minnesota * 1989-2001 */ #include #include "pcctscfg.h" #include "set.h" #include "syn.h" #include "hash.h" #include "generic.h" #include "dlgdef.h" #include static int tsize=TSChunk; /* size of token str arrays */ static void #ifdef __USE_PROTOS RemapForcedTokensInSyntaxDiagram(Node *); #else RemapForcedTokensInSyntaxDiagram(); #endif /* T o k e n M a n i p u l a t i o n */ /* * add token 't' to the TokenStr/Expr array. Make more room if necessary. * 't' is either an expression or a token name. * * There is only one TokenStr array, but multiple ExprStr's. Therefore, * for each lex class (element of lclass) we must extend the ExprStr array. * ExprStr's and TokenStr are always all the same size. * * Also, there is a Texpr hash table for each automaton. */ static void #ifdef __USE_PROTOS Ttrack( char *t ) #else Ttrack( t ) char *t; #endif { if ( TokenNum >= tsize ) /* terminal table overflow? */ { char **p; int i, more, j; more = TSChunk * (1 + ((TokenNum-tsize) / TSChunk)); tsize += more; TokenStr = (char **) realloc((char *)TokenStr, tsize*sizeof(char *)); require(TokenStr != NULL, "Ttrack: can't extend TokenStr"); for (i=0; iexpr = e; p->lclass = CurrentLexClass; return p; } /* switch to lexical class/mode m. This amounts to creating a new * lex mode if one does not already exist and making ExprStr point * to the correct char string array. We must also switch Texpr tables. * * BTW, we need multiple ExprStr arrays because more than one automaton * may have the same label for a token, but with different expressions. * We need to track an expr for each automaton. If we disallowed this * feature, only one ExprStr would be required. */ void #ifdef __USE_PROTOS lexclass( char *m ) #else lexclass( m ) char *m; #endif { int i; TermEntry *p; static char EOFSTR[] = "\"@\""; if ( hash_get(Tname, m) != NULL ) { warn(eMsg1("lexclass name conflicts with token/errclass label '%s'",m)); } /* does m already exist? */ i = LexClassIndex(m); if ( i != -1 ) {lexmode(i); return;} /* must make new one */ NumLexClasses++; CurrentLexClass = NumLexClasses-1; require(NumLexClasses<=MaxLexClasses, "number of allowable lexclasses exceeded\nIncrease MaxLexClasses in generic.h and recompile all C files"); lclass[CurrentLexClass].classnum = m; lclass[CurrentLexClass].exprs = (char **) calloc(tsize, sizeof(char *)); require(lclass[CurrentLexClass].exprs!=NULL, "lexclass: cannot allocate ExprStr"); lclass[CurrentLexClass].htable = newHashTable(); ExprStr = lclass[CurrentLexClass].exprs; Texpr = lclass[CurrentLexClass].htable; /* define EOF for each automaton */ p = newTermEntry( EOFSTR ); p->token = EofToken; /* couldn't have remapped tokens yet, use EofToken */ hash_add(Texpr, EOFSTR, (Entry *)p); list_add(&ExprOrder, (void *)newExpr(EOFSTR)); /* note: we use the actual ExprStr array * here as TokenInd doesn't exist yet */ ExprStr[EofToken] = EOFSTR; } void #ifdef __USE_PROTOS lexmode( int i ) #else lexmode( i ) int i; #endif { require(iaction!=NULL); } void #ifdef __USE_PROTOS setHasAction( char *expr, char *action ) #else setHasAction( expr, action ) char *expr; char *action; #endif { TermEntry *p; require(expr!=NULL, "setHasAction: invalid expr"); p = (TermEntry *) hash_get(Texpr, expr); require(p!=NULL, eMsg1("setHasAction: expr '%s' doesn't exist",expr)); p->action = action; } ForcedToken * #ifdef __USE_PROTOS newForcedToken(char *token, int tnum) #else newForcedToken(token, tnum) char *token; int tnum; #endif { ForcedToken *ft = (ForcedToken *) calloc(1, sizeof(ForcedToken)); require(ft!=NULL, "out of memory"); ft->token = token; ft->tnum = tnum; return ft; } /* * Make a token indirection array that remaps token numbers and then walk * the appropriate symbol tables and SynDiag to change token numbers */ void #ifdef __USE_PROTOS RemapForcedTokens(void) #else RemapForcedTokens() #endif { ListNode *p; ForcedToken *q; int max_token_number=0; /* MR9 23-Sep-97 Removed "unsigned" */ int i; if ( ForcedTokens == NULL ) return; /* find max token num */ for (p = ForcedTokens->next; p!=NULL; p=p->next) { q = (ForcedToken *) p->elem; if ( q->tnum > max_token_number ) max_token_number = q->tnum; } fprintf(stderr, "max token number is %d\n", max_token_number); /* make token indirection array */ TokenInd = (int *) calloc(max_token_number+1, sizeof(int)); LastTokenCounted = TokenNum; TokenNum = max_token_number+1; require(TokenInd!=NULL, "RemapForcedTokens: cannot allocate TokenInd"); /* fill token indirection array and change token id htable ; swap token indices */ for (i=1; inext; p!=NULL; p=p->next) { TermEntry *te; int old_pos, t; q = (ForcedToken *) p->elem; fprintf(stderr, "%s forced to %d\n", q->token, q->tnum); te = (TermEntry *) hash_get(Tname, q->token); require(te!=NULL, "RemapForcedTokens: token not in hash table"); old_pos = te->token; fprintf(stderr, "Before: TokenInd[old_pos==%d] is %d\n", old_pos, TokenInd[old_pos]); fprintf(stderr, "Before: TokenInd[target==%d] is %d\n", q->tnum, TokenInd[q->tnum]); q = (ForcedToken *) p->elem; t = TokenInd[old_pos]; TokenInd[old_pos] = q->tnum; TokenInd[q->tnum] = t; te->token = q->tnum; /* update token type id symbol table */ fprintf(stderr, "After: TokenInd[old_pos==%d] is %d\n", old_pos, TokenInd[old_pos]); fprintf(stderr, "After: TokenInd[target==%d] is %d\n", q->tnum, TokenInd[q->tnum]); /* Change the token number in the sym tab entry for the exprs * at the old position of the token id and the target position */ /* update expr at target (if any) of forced token id */ if ( q->tnum < TokenNum ) /* is it a valid position? */ { for (i=0; itnum]!=NULL ) { /* update the symbol table for this expr */ TermEntry *e = (TermEntry *) hash_get(lclass[i].htable, lclass[i].exprs[q->tnum]); require(e!=NULL, "RemapForcedTokens: expr not in hash table"); e->token = old_pos; fprintf(stderr, "found expr '%s' at target %d in lclass[%d]; changed to %d\n", lclass[i].exprs[q->tnum], q->tnum, i, old_pos); } } } /* update expr at old position (if any) of forced token id */ for (i=0; itoken = q->tnum; fprintf(stderr, "found expr '%s' for id %s in lclass[%d]; changed to %d\n", lclass[i].exprs[old_pos], q->token, i, q->tnum); } } } /* Update SynDiag */ RemapForcedTokensInSyntaxDiagram((Node *)SynDiag); } static void #ifdef __USE_PROTOS RemapForcedTokensInSyntaxDiagram(Node *p) #else RemapForcedTokensInSyntaxDiagram(p) Node *p; #endif { Junction *j = (Junction *) p; RuleRefNode *r = (RuleRefNode *) p; TokNode *t = (TokNode *)p; if ( p==NULL ) return; require(p->ntype>=1 && p->ntype<=NumNodeTypes, "Remap...: invalid diagram node"); switch ( p->ntype ) { case nJunction : if ( j->visited ) return; if ( j->jtype == EndRule ) return; j->visited = TRUE; RemapForcedTokensInSyntaxDiagram( j->p1 ); RemapForcedTokensInSyntaxDiagram( j->p2 ); j->visited = FALSE; return; case nRuleRef : RemapForcedTokensInSyntaxDiagram( r->next ); return; case nToken : if ( t->remapped ) return; /* we've been here before */ t->remapped = 1; fprintf(stderr, "remapping %d to %d\n", t->token, TokenInd[t->token]); t->token = TokenInd[t->token]; RemapForcedTokensInSyntaxDiagram( t->next ); return; case nAction : RemapForcedTokensInSyntaxDiagram( ((ActionNode *)p)->next ); return; default : fatal_internal("invalid node type"); } } /* * Add a token name. Return the token number associated with it. If it already * exists, then return the token number assigned to it. * * Track the order in which tokens are found so that the DLG output maintains * that order. It also lets us map token numbers to strings. */ int #ifdef __USE_PROTOS addTname( char *token ) #else addTname( token ) char *token; #endif { TermEntry *p; require(token!=NULL, "addTname: invalid token name"); if ( (p=(TermEntry *)hash_get(Tname, token)) != NULL ) return p->token; p = newTermEntry( token ); Ttrack( p->str ); p->token = TokenNum++; hash_add(Tname, token, (Entry *)p); return p->token; } /* This is the same as addTname except we force the TokenNum to be tnum. * We don't have to use the Forced token stuff as no tokens will have * been defined with #tokens when this is called. This is only called * when a #tokdefs meta-op is used. */ int #ifdef __USE_PROTOS addForcedTname( char *token, int tnum ) #else addForcedTname( token, tnum ) char *token; int tnum; #endif { TermEntry *p; require(token!=NULL, "addTname: invalid token name"); if ( (p=(TermEntry *)hash_get(Tname, token)) != NULL ) return p->token; p = newTermEntry( token ); Ttrack( p->str ); p->token = tnum; hash_add(Tname, token, (Entry *)p); return p->token; } /* * Add a token expr. Return the token number associated with it. If it already * exists, then return the token number assigned to it. */ int #ifdef __USE_PROTOS addTexpr( char *expr ) #else addTexpr( expr ) char *expr; #endif { TermEntry *p; require(expr!=NULL, "addTexpr: invalid regular expression"); if ( (p=(TermEntry *)hash_get(Texpr, expr)) != NULL ) return p->token; p = newTermEntry( expr ); Ttrack( p->str ); /* track the order in which they occur */ list_add(&ExprOrder, (void *)newExpr(p->str)); p->token = TokenNum++; hash_add(Texpr, expr, (Entry *)p); return p->token; } /* return the token number of 'term'. Return 0 if no 'term' exists */ int #ifdef __USE_PROTOS Tnum( char *term ) #else Tnum( term ) char *term; #endif { TermEntry *p; require(term!=NULL, "Tnum: invalid terminal"); if ( *term=='"' ) p = (TermEntry *) hash_get(Texpr, term); else p = (TermEntry *) hash_get(Tname, term); if ( p == NULL ) return 0; else return p->token; } /* associate a Name with an expr. If both have been already assigned * token numbers, then an error is reported. Add the token or expr * that has not been added if no error. This 'represents' the #token * ANTLR pseudo-op. If both have not been defined, define them both * linked to same token number. */ void #ifdef __USE_PROTOS Tklink( char *token, char *expr ) #else Tklink( token, expr ) char *token; char *expr; #endif { TermEntry *p, *q; require(token!=NULL && expr!=NULL, "Tklink: invalid token name and/or expr"); p = (TermEntry *) hash_get(Tname, token); q = (TermEntry *) hash_get(Texpr, expr); if ( p != NULL && q != NULL ) /* both defined */ { warn( eMsg2("token name %s and rexpr %s already defined; ignored", token, expr) ); return; } if ( p==NULL && q==NULL ) /* both not defined */ { int t = addTname( token ); q = newTermEntry( expr ); hash_add(Texpr, expr, (Entry *)q); q->token = t; /* note: we use the actual ExprStr array * here as TokenInd doesn't exist yet */ ExprStr[t] = q->str; /* track the order in which they occur */ list_add(&ExprOrder, (void *)newExpr(q->str)); return; } if ( p != NULL ) /* one is defined, one is not */ { q = newTermEntry( expr ); hash_add(Texpr, expr, (Entry *)q); q->token = p->token; ExprStr[p->token] = q->str; /* both expr and token str defined now */ list_add(&ExprOrder, (void *)newExpr(q->str)); } else /* trying to associate name with expr here*/ { p = newTermEntry( token ); hash_add(Tname, token, (Entry *)p); p->token = q->token; TokenStr[p->token] = p->str;/* both expr and token str defined now */ } } /* * Given a string, this function allocates and returns a pointer to a * hash table record of size 'sz' whose "str" pointer is reset to a position * in the string table. */ Entry * #ifdef __USE_PROTOS newEntry( char *text, int sz ) #else newEntry( text, sz ) char *text; int sz; #endif { Entry *p; require(text!=NULL, "new: NULL terminal"); if ( (p = (Entry *) calloc(1,sz)) == 0 ) { fatal_internal("newEntry: out of memory for terminals\n"); exit(PCCTS_EXIT_FAILURE); } p->str = mystrdup(text); return(p); } /* * add an element to a list. * * Any non-empty list has a sentinel node whose 'elem' pointer is really * a pointer to the last element. (i.e. length(list) = #elemIn(list)+1). * Elements are appended to the list. */ void #ifdef __USE_PROTOS list_add( ListNode **list, void *e ) #else list_add( list, e ) ListNode **list; void *e; #endif { ListNode *p, *tail; require(e!=NULL, "list_add: attempting to add NULL list element"); p = newListNode; require(p!=NULL, "list_add: cannot alloc new list node"); p->elem = e; if ( *list == NULL ) { ListNode *sentinel = newListNode; require(sentinel!=NULL, "list_add: cannot alloc sentinel node"); *list=sentinel; sentinel->next = p; sentinel->elem = (char *)p; /* set tail pointer */ } else /* find end of list */ { tail = (ListNode *) (*list)->elem; /* get tail pointer */ tail->next = p; (*list)->elem = (char *) p; /* reset tail */ } } /* MR10 list_free() frees the ListNode elements in the list */ /* MR10 if freeData then free the data elements of the list too */ void #ifdef __USE_PROTOS list_free(ListNode **list,int freeData) #else list_free(list,freeData) ListNode **list; int freeData; #endif { ListNode *p; ListNode *next; if (list == NULL) return; if (*list == NULL) return; for (p=*list; p != NULL; p=next) { next=p->next; if (freeData && p->elem != NULL) { free( (char *) p->elem); }; free( (char *) p); }; *list=NULL; } void #ifdef __USE_PROTOS list_apply( ListNode *list, void (*f)(void *) ) #else list_apply( list, f ) ListNode *list; void (*f)(); #endif { ListNode *p; require(f!=NULL, "list_apply: NULL function to apply"); if ( list == NULL ) return; for (p = list->next; p!=NULL; p=p->next) (*f)( p->elem ); } /* MR27 */ #ifdef __USE_PROTOS int list_search_cstring(ListNode *list, char * cstring) #else int list_search_cstring(list, cstring) ListNode * list; char * cstring; #endif { ListNode *p; if (list == NULL ) return 0; for (p = list->next; p!=NULL; p=p->next) { if (p->elem == NULL) continue; if (0 == strcmp((char *) p->elem , cstring)) return 1; } return 0; } /* F O L L O W C y c l e S t u f f */ /* make a key based upon (rulename, computation, k value). * Computation values are 'i'==FIRST, 'o'==FOLLOW. */ /* MR10 Make the key all characters so it can be read easily */ /* MR10 by a simple dump program. Also, separates */ /* MR10 'o' and 'i' from rule name */ char * #ifdef __USE_PROTOS Fkey( char *rule, int computation, int k ) #else Fkey( rule, computation, k ) char *rule; int computation; int k; #endif { static char key[MaxRuleName+2+2+1]; /* MR10 */ int i; if ( k > 99 ) /* MR10 */ fatal("k>99 is too big for this implementation of ANTLR!\n"); /* MR10 */ if ( (i=strlen(rule)) > MaxRuleName ) /* MR10 */ fatal( eMsgd("rule name > max of %d\n", MaxRuleName) ); /* MR10 */ strcpy(key,rule); /* MR10 */ key[i]='*'; /* MR10 */ key[i+1] = (char) computation; /* MR20 G. Hobbelt */ /* MR10 */ if (k < 10) { /* MR10 */ key[i+2] = (char) ( '0' + k); /* MR10 */ key[i+3] = '\0'; /* MR10 */ } else { /* MR10 */ key[i+2] = (char) ( '0' + k/10); /* MR10 */ key[i+3] = (char) ( '0' + k % 10); /* MR10 */ key[i+4] = '\0'; /* MR10 */ }; return key; } /* Push a rule onto the kth FOLLOW stack */ void #ifdef __USE_PROTOS FoPush( char *rule, int k ) #else FoPush( rule, k ) char *rule; int k; #endif { RuleEntry *r; require(rule!=NULL, "FoPush: tried to push NULL rule"); require(k<=CLL_k, "FoPush: tried to access non-existent stack"); /*fprintf(stderr, "FoPush(%s)\n", rule);*/ r = (RuleEntry *) hash_get(Rname, rule); if ( r == NULL ) {fatal_internal( eMsg1("rule %s must be defined but isn't", rule) );} if ( FoStack[k] == NULL ) /* Does the kth stack exist yet? */ { /*fprintf(stderr, "allocating FoStack\n");*/ FoStack[k] = (int *) calloc(FoStackSize, sizeof(int)); require(FoStack[k]!=NULL, "FoPush: cannot allocate FOLLOW stack\n"); } if ( FoTOS[k] == NULL ) { FoTOS[k]=FoStack[k]; *(FoTOS[k]) = r->rulenum; } else { #ifdef MEMCHK require(valid(FoStack[k]), "FoPush: invalid FoStack"); #endif if ( FoTOS[k] >= &(FoStack[k][FoStackSize-1]) ) fatal( eMsgd("exceeded max depth of FOLLOW recursion (%d)\n", FoStackSize) ); require(FoTOS[k]>=FoStack[k], eMsg1("FoPush: FoStack stack-ptr is playing out of its sandbox", rule)); ++(FoTOS[k]); *(FoTOS[k]) = r->rulenum; } { /* **** int *p; **** fprintf(stderr, "FoStack[k=%d]:\n", k); **** for (p=FoStack[k]; p<=FoTOS[k]; p++) **** { **** fprintf(stderr, "\t%s\n", RulePtr[*p]->rname); **** } */ } } /* Pop one rule off of the FOLLOW stack. TOS ptr is NULL if empty. */ void #ifdef __USE_PROTOS FoPop( int k ) #else FoPop( k ) int k; #endif { require(k<=CLL_k, "FoPop: tried to access non-existent stack"); /*fprintf(stderr, "FoPop\n");*/ require(FoTOS[k]>=FoStack[k]&&FoTOS[k]<=&(FoStack[k][FoStackSize-1]), "FoPop: FoStack stack-ptr is playing out of its sandbox"); if ( FoTOS[k] == FoStack[k] ) FoTOS[k] = NULL; else (FoTOS[k])--; } /* Compute FOLLOW cycle. * Mark all FOLLOW sets for rules in cycle as incomplete. * Then, save cycle on the cycle list (Cycles) for later resolution. * The Cycle is stored in the form: * (head of cycle==croot, rest of rules in cycle==cyclicDep) * * e.g. (Fo means "FOLLOW of", "-->" means requires or depends on) * * Fo(x)-->Fo(a)-->Fo(b)-->Fo(c)-->Fo(x) * ^----Infinite recursion (cycle) * * the cycle would be: x -> {a,b,c} or stored as (x,{a,b,c}). Fo(x) depends * on the FOLLOW of a,b, and c. The root of a cycle is always complete after * Fo(x) finishes. Fo(a,b,c) however are not. It turns out that all rules * in a FOLLOW cycle have the same FOLLOW set. */ void #ifdef __USE_PROTOS RegisterCycle( char *rule, int k ) #else RegisterCycle( rule, k ) char *rule; int k; #endif { CacheEntry *f; Cycle *c; int *p; RuleEntry *r; require(rule!=NULL, "RegisterCycle: tried to register NULL rule"); require(k<=CLL_k, "RegisterCycle: tried to access non-existent stack"); /*fprintf(stderr, "RegisterCycle(%s)\n", rule);*/ /* Find cycle start */ r = (RuleEntry *) hash_get(Rname, rule); require(r!=NULL,eMsg1("rule %s must be defined but isn't", rule)); require(FoTOS[k]>=FoStack[k]&&FoTOS[k]<=&(FoStack[k][FoStackSize-1]), eMsg1("RegisterCycle(%s): FoStack stack-ptr is playing out of its sandbox", rule)); /*** if ( FoTOS[k]&(FoStack[k][FoStackSize-1]) ) **** { **** fprintf(stderr, "RegisterCycle(%s): FoStack stack-ptr is playing out of its sandbox\n", **** rule); **** fprintf(stderr, "RegisterCycle: sp==0x%x out of bounds 0x%x...0x%x\n", **** FoTOS[k], FoStack[k], &(FoStack[k][FoStackSize-1])); **** exit(PCCTS_EXIT_FAILURE); **** } ****/ #ifdef MEMCHK require(valid(FoStack[k]), "RegisterCycle: invalid FoStack"); #endif for (p=FoTOS[k]; *p != r->rulenum && p >= FoStack[k]; --p) {;} require(p>=FoStack[k], "RegisterCycle: FoStack is screwed up beyond belief"); if ( p == FoTOS[k] ) return; /* don't worry about cycles to oneself */ /* compute cyclic dependents (rules in cycle except head) */ c = newCycle; require(c!=NULL, "RegisterCycle: couldn't alloc new cycle"); c->cyclicDep = empty; c->croot = *p++; /* record root of cycle */ for (; p<=FoTOS[k]; p++) { /* Mark all dependent rules as incomplete */ f = (CacheEntry *) hash_get(Fcache, Fkey(RulePtr[*p]->rname,'o',k)); if ( f==NULL ) { f = newCacheEntry( Fkey(RulePtr[*p]->rname,'o',k) ); hash_add(Fcache, Fkey(RulePtr[*p]->rname,'o',k), (Entry *)f); } f->incomplete = TRUE; set_orel(*p, &(c->cyclicDep)); /* mark rule as dependent of croot */ } list_add(&(Cycles[k]), (void *)c); } /* make all rules in cycle complete * * while ( some set has changed ) do * for each cycle do * if degree of FOLLOW set for croot > old degree then * update all FOLLOW sets for rules in cyclic dependency * change = TRUE * endif * endfor * endwhile */ void #ifdef __USE_PROTOS ResolveFoCycles( int k ) #else ResolveFoCycles( k ) int k; #endif { ListNode *p, *q; Cycle *c; int changed = 1; CacheEntry *f,*g; int r; /* int i; */ /* MR10 not useful */ unsigned d; unsigned *cursor; /* MR10 */ unsigned *origin; /* MR10 */ /*fprintf(stderr, "Resolving following cycles for %d\n", k);*/ while ( changed ) { changed = 0; /* MR10 i = 0; */ for (p = Cycles[k]->next; p!=NULL; p=p->next) { c = (Cycle *) p->elem; /*fprintf(stderr, "cycle %d: %s -->", i++, RulePtr[c->croot]->rname);*/ /*s_fprT(stderr, c->cyclicDep);*/ /*fprintf(stderr, "\n");*/ f = (CacheEntry *) hash_get(Fcache, Fkey(RulePtr[c->croot]->rname,'o',k)); require(f!=NULL, eMsg1("FOLLOW(%s) must be in cache but isn't", RulePtr[c->croot]->rname) ); if ( (d=set_deg(f->fset)) > c->deg ) { /*fprintf(stderr, "Fo(%s) has changed\n", RulePtr[c->croot]->rname);*/ changed = 1; c->deg = d; /* update cycle FOLLOW set degree */ /* MR10 */ origin=set_pdq(c->cyclicDep); /* MR10 */ for (cursor=origin; *cursor != nil; cursor++) { /* MR10 */ r=*cursor; /******** while ( !set_nil(c->cyclicDep) ) { *****/ /******** r = set_int(c->cyclicDep); *****/ /******** set_rm(r, c->cyclicDep); *****/ /*fprintf(stderr, "updating Fo(%s)\n", RulePtr[r]->rname);*/ g = (CacheEntry *) hash_get(Fcache, Fkey(RulePtr[r]->rname,'o',k)); require(g!=NULL, eMsg1("FOLLOW(%s) must be in cache but isn't", RulePtr[r]->rname) ); set_orin(&(g->fset), f->fset); g->incomplete = FALSE; } /* MR10 */ free( (char *) origin); /* MR10 */ origin=NULL; } } /* MR10 - this if statement appears to be meaningless since i is always 0 */ /* MR10 if ( i == 1 ) changed = 0; */ /* if only 1 cycle, no need to repeat */ } /* kill Cycle list */ for (q = Cycles[k]->next; q != NULL; q=p) { p = q->next; set_free( ((Cycle *)q->elem)->cyclicDep ); free((char *)q); } free( (char *)Cycles[k] ); Cycles[k] = NULL; } /* P r i n t i n g S y n t a x D i a g r a m s */ static void #ifdef __USE_PROTOS pBlk( Junction *q, int btype ) #else pBlk( q, btype ) Junction *q; int btype; #endif { int k,a; Junction *alt, *p; q->end->pvisited = TRUE; if ( btype == aLoopBegin ) { require(q->p2!=NULL, "pBlk: invalid ()* block"); PRINT(q->p1); alt = (Junction *)q->p2; PRINT(alt->p1); if ( PrintAnnotate ) { printf(" /* Opt "); k = 1; while ( !set_nil(alt->fset[k]) ) { s_fprT(stdout, alt->fset[k]); if ( k++ == CLL_k ) break; if ( !set_nil(alt->fset[k]) ) printf(", "); } printf(" */\n"); } return; } for (a=1,alt=q; alt != NULL; alt= (Junction *) alt->p2, a++) { if ( alt->p1 != NULL ) PRINT(alt->p1); if ( PrintAnnotate ) { printf( " /* [%d] ", alt->altnum); k = 1; while ( !set_nil(alt->fset[k]) ) { s_fprT(stdout, alt->fset[k]); if ( k++ == CLL_k ) break; if ( !set_nil(alt->fset[k]) ) printf(", "); } if ( alt->p2 == NULL && btype == aOptBlk ) printf( " (optional branch) */\n"); else printf( " */\n"); } /* ignore implied empty alt of Plus blocks */ if ( alt->p2 != NULL && ((Junction *)alt->p2)->ignore ) break; if ( alt->p2 != NULL && !(((Junction *)alt->p2)->p2==NULL && btype == aOptBlk) ) { if ( pLevel == 1 ) { printf("\n"); if ( a+1==pAlt1 || a+1==pAlt2 ) printf("=>"); printf("\t"); } else printf(" "); printf("|"); if ( pLevel == 1 ) { p = (Junction *) ((Junction *)alt->p2)->p1; while ( p!=NULL ) { if ( p->ntype==nAction ) { p=(Junction *)((ActionNode *)p)->next; continue; } if ( p->ntype!=nJunction ) { break; } if ( p->jtype==EndBlk || p->jtype==EndRule ) { p = NULL; break; } p = (Junction *)p->p1; } if ( p==NULL ) printf("\n\t"); /* Empty alt? */ } } } q->end->pvisited = FALSE; } /* How to print out a junction */ void #ifdef __USE_PROTOS pJunc( Junction *q ) #else pJunc( q ) Junction *q; #endif { int dum_k; int doing_rule; require(q!=NULL, "pJunc: NULL node"); require(q->ntype==nJunction, "pJunc: not junction"); if ( q->pvisited == TRUE ) return; q->pvisited = TRUE; switch ( q->jtype ) { case aSubBlk : if ( PrintAnnotate ) First(q, 1, q->jtype, &dum_k); if ( q->end->p1 != NULL && ((Junction *)q->end->p1)->ntype==nJunction && ((Junction *)q->end->p1)->jtype == EndRule ) doing_rule = 1; else doing_rule = 0; pLevel++; if ( pLevel==1 ) { if ( pAlt1==1 ) printf("=>"); printf("\t"); } else printf(" "); if ( doing_rule ) { if ( pLevel==1 ) printf(" "); pBlk(q,q->jtype); } else { printf("("); if ( pLevel==1 ) printf(" "); pBlk(q,q->jtype); if ( pLevel>1 ) printf(" "); printf(")"); } if ( q->guess ) printf("?"); pLevel--; if ( PrintAnnotate ) freeBlkFsets(q); if ( q->end->p1 != NULL ) PRINT(q->end->p1); break; case aOptBlk : if ( PrintAnnotate ) First(q, 1, q->jtype, &dum_k); pLevel++; if ( pLevel==1 ) { if ( pAlt1==1 ) printf("=>"); printf("\t"); } else printf(" "); printf("{"); if ( pLevel==1 ) printf(" "); pBlk(q,q->jtype); if ( pLevel>1 ) printf(" "); else printf("\n\t"); printf("}"); pLevel--; if ( PrintAnnotate ) freeBlkFsets(q); if ( q->end->p1 != NULL ) PRINT(q->end->p1); break; case aLoopBegin : if ( PrintAnnotate ) First(q, 1, q->jtype, &dum_k); pLevel++; if ( pLevel==1 ) { if ( pAlt1==1 ) printf("=>"); printf("\t"); } else printf(" "); printf("("); if ( pLevel==1 ) printf(" "); pBlk(q,q->jtype); if ( pLevel>1 ) printf(" "); else printf("\n\t"); printf(")*"); pLevel--; if ( PrintAnnotate ) freeBlkFsets(q); if ( q->end->p1 != NULL ) PRINT(q->end->p1); break; case aLoopBlk : if ( PrintAnnotate ) First(q, 1, q->jtype, &dum_k); pBlk(q,q->jtype); if ( PrintAnnotate ) freeBlkFsets(q); break; case aPlusBlk : if ( PrintAnnotate ) First(q, 1, q->jtype, &dum_k); pLevel++; if ( pLevel==1 ) { if ( pAlt1==1 ) printf("=>"); printf("\t"); } else printf(" "); printf("("); if ( pLevel==1 ) printf(" "); pBlk(q,q->jtype); if ( pLevel>1 ) printf(" "); printf(")+"); pLevel--; if ( PrintAnnotate ) freeBlkFsets(q); if ( q->end->p1 != NULL ) PRINT(q->end->p1); break; case EndBlk : break; case RuleBlk : printf( "\n%s :\n", q->rname); PRINT(q->p1); if ( q->p2 != NULL ) PRINT(q->p2); break; case Generic : if ( q->p1 != NULL ) PRINT(q->p1); q->pvisited = FALSE; if ( q->p2 != NULL ) PRINT(q->p2); break; case EndRule : printf( "\n\t;\n"); break; } q->pvisited = FALSE; } /* How to print out a rule reference node */ void #ifdef __USE_PROTOS pRuleRef( RuleRefNode *p ) #else pRuleRef( p ) RuleRefNode *p; #endif { require(p!=NULL, "pRuleRef: NULL node"); require(p->ntype==nRuleRef, "pRuleRef: not rule ref node"); printf( " %s", p->text); PRINT(p->next); } /* How to print out a terminal node */ void #ifdef __USE_PROTOS pToken( TokNode *p ) #else pToken( p ) TokNode *p; #endif { require(p!=NULL, "pToken: NULL node"); require(p->ntype==nToken, "pToken: not token node"); if ( p->wild_card ) printf(" ."); printf( " %s", TerminalString(p->token)); PRINT(p->next); } /* How to print out a terminal node */ void #ifdef __USE_PROTOS pAction( ActionNode *p ) #else pAction( p ) ActionNode *p; #endif { require(p!=NULL, "pAction: NULL node"); require(p->ntype==nAction, "pAction: not action node"); PRINT(p->next); } /* F i l l F o l l o w L i s t s */ /* * Search all rules for all rule reference nodes, q to rule, r. * Add q->next to follow list dangling off of rule r. * i.e. * * r: -o-R-o-->o--> Ptr to node following rule r in another rule * | * o--> Ptr to node following another reference to r. * * This is the data structure employed to avoid FOLLOW set computation. We * simply compute the FIRST (reach) of the EndRule Node which follows the * list found at the end of all rules which are referenced elsewhere. Rules * not invoked by other rules have no follow list (r->end->p1==NULL). * Generally, only start symbols are not invoked by another rule. * * Note that this mechanism also gives a free cross-reference mechanism. * * The entire syntax diagram is layed out like this: * * SynDiag * | * v * o-->R1--o * | * o-->R2--o * | * ... * | * o-->Rn--o * */ void #ifdef __USE_PROTOS FoLink( Node *p ) #else FoLink( p ) Node *p; #endif { RuleEntry *q; Junction *j = (Junction *) p; RuleRefNode *r = (RuleRefNode *) p; if ( p==NULL ) return; require(p->ntype>=1 && p->ntype<=NumNodeTypes, eMsgd("FoLink: invalid diagram node: ntype==%d",p->ntype)); switch ( p->ntype ) { case nJunction : if ( j->fvisited ) return; if ( j->jtype == EndRule ) return; j->fvisited = TRUE; FoLink( j->p1 ); FoLink( j->p2 ); /* MR14 */ /* MR14 */ /* Need to determine whether the guess block is an */ /* MR14 */ /* of the form (alpha)? beta before follow sets are */ /* MR14 */ /* computed. This is necessary to solve problem */ /* MR14 */ /* of doing follow on the alpha of an (alpha)? beta block. */ /* MR14 */ /* MR14 */ /* This is performed by analysis_point as a side-effect. */ /* MR14 */ /* MR14 */ /* MR14 */ if (j->jtype == aSubBlk && j->guess) { /* MR14 */ Junction *ignore; /* MR14 */ ignore=analysis_point(j); /* MR14 */ } /* MR14 */ return; case nRuleRef : if ( r->linked ) return; q = (RuleEntry *) hash_get(Rname, r->text); if ( q == NULL ) { warnFL( eMsg1("rule %s not defined",r->text), FileStr[r->file], r->line ); } else { if ( r->parms!=NULL && RulePtr[q->rulenum]->pdecl==NULL ) { warnFL( eMsg1("rule %s accepts no parameter(s)", r->text), FileStr[r->file], r->line ); } if ( r->parms==NULL && RulePtr[q->rulenum]->pdecl!=NULL ) { warnFL( eMsg1("rule %s requires parameter(s)", r->text), FileStr[r->file], r->line ); } if ( r->assign!=NULL && RulePtr[q->rulenum]->ret==NULL ) { warnFL( eMsg1("rule %s yields no return value(s)", r->text), FileStr[r->file], r->line ); } if ( r->assign==NULL && RulePtr[q->rulenum]->ret!=NULL ) { warnFL( eMsg1("rule %s returns a value(s)", r->text), FileStr[r->file], r->line ); } if ( !r->linked ) { addFoLink( r->next, r->rname, RulePtr[q->rulenum] ); r->linked = TRUE; } } FoLink( r->next ); return; case nToken : FoLink( ((TokNode *)p)->next ); return; case nAction : FoLink( ((ActionNode *)p)->next ); return; default : fatal_internal("invalid node type"); } } /* * Add a reference to the end of a rule. * * 'r' points to the RuleBlk node in a rule. r->end points to the last node * (EndRule jtype) in a rule. * * Initial: * r->end --> o * * After: * r->end --> o-->o--> Ptr to node following rule r in another rule * | * o--> Ptr to node following another reference to r. * * Note that the links are added to the head of the list so that r->end->p1 * always points to the most recently added follow-link. At the end, it should * point to the last reference found in the grammar (starting from the 1st rule). */ void #ifdef __USE_PROTOS addFoLink( Node *p, char *rname, Junction *r ) #else addFoLink( p, rname, r ) Node *p; char *rname; Junction *r; #endif { Junction *j; require(r!=NULL, "addFoLink: incorrect rule graph"); require(r->end!=NULL, "addFoLink: incorrect rule graph"); require(r->end->jtype==EndRule, "addFoLink: incorrect rule graph"); require(p!=NULL, "addFoLink: NULL FOLLOW link"); j = newJunction(); j->rname = rname; /* rname on follow links point to target rule */ j->p1 = p; /* link to other rule */ j->p2 = (Node *) r->end->p1;/* point to head of list */ r->end->p1 = (Node *) j; /* reset head to point to new node */ } void #ifdef __USE_PROTOS GenCrossRef( Junction *p ) #else GenCrossRef( p ) Junction *p; #endif { set a; Junction *j; RuleEntry *q; unsigned e; require(p!=NULL, "GenCrossRef: why are you passing me a null grammar?"); printf("Cross Reference:\n\n"); a = empty; for (; p!=NULL; p = (Junction *)p->p2) { printf("Rule %20s referenced by {", p->rname); /* make a set of rules for uniqueness */ for (j = (Junction *)(p->end)->p1; j!=NULL; j = (Junction *)j->p2) { q = (RuleEntry *) hash_get(Rname, j->rname); require(q!=NULL, "GenCrossRef: FoLinks are screwed up"); set_orel(q->rulenum, &a); } for (; !set_nil(a); set_rm(e, a)) { e = set_int(a); printf(" %s", RulePtr[e]->rname); } printf(" }\n"); } set_free( a ); } /* The single argument is a pointer to the start of an element of a C++ style function prototypet list. Given a pointer to the start of an formal we must locate the comma (or the end of the string) and locate the datatype, formal name, and initial value expression. The function returns a pointer to the character following the comma which terminates the formal declaration, or a pointer to the end of the string if none was found. I thought we were parsing specialists, how come I'm doing this by hand written code ? Examples of input: Foo f, Foo f = Foo(1), Foo f = Foo(1,2), Foo f = &farray[1,2], Foo f = ",", Foo f = ',', TFoo f = TFoo(1,2), A non-zero value for nesting indicates a problem matching '(' and ')', '[' and ']', '<' and '>', '{' and '}', or improperly terminated string or character literal. */ /* * Don't care if it is a valid string literal or not, just find the end * Start with pointer to leading "\"" */ #ifdef __USE_PROTOS char * skipStringLiteral(char *pCurrent) #else char * skipStringLiteral(pCurrent) char *pCurrent; #endif { char *p = pCurrent; if (*p == 0) return p; require (*p == '\"', "skipStringLiteral") p++; for (p = p; *p != 0; p++) { if (*p == '\\') { p++; if (*p == 0) break; p++; } if (*p == '\"') { p++; break; } } return p; } /* * Don't care if it is a valid character literal or not, just find the end * Start with pointer to leading "'" */ #ifdef __USE_PROTOS char * skipCharLiteral(char *pStart) #else char * skipCharLiteral(pStart) char *pStart; #endif { char *p = pStart; if (*p == 0) return p; require (*p == '\'', "skipCharLiteral") p++; for (p = p; *p != 0; p++) { if (*p == '\\') { p++; if (*p == 0) break; p++; } if (*p == '\'') { p++; break; } } return p; } #ifdef __USE_PROTOS char * skipSpaces(char *pStart) #else char * skipSpaces(pStart) char * pStart; #endif { char *p = pStart; while (*p != 0 && isspace(*p)) p++; return p; } #ifdef __USE_PROTOS char * skipToSeparatorOrEqualSign(char *pStart, int *pNest) #else char * skipToSeparatorOrEqualSign(pStart, pNest) char *pStart; int *pNest; #endif { char *p = pStart; int nest = 0; *pNest = (-1); while (*p != 0) { switch (*p) { case '(' : case '[' : case '<' : case '{' : nest++; p++; break; case ')' : case ']' : case '>' : case '}' : nest--; p++; break; case '"' : p = skipStringLiteral(p); break; case '\'' : p = skipCharLiteral(p); break; case '\\': p++; if (*p == 0) goto EXIT; p++; break; case ',': case '=': if (nest == 0) goto EXIT; p++; break; default: p++; } } EXIT: *pNest = nest; return p; } #ifdef __USE_PROTOS char * skipToSeparator(char *pStart, int *pNest) #else char * skipToSeparator(pStart, pNest) char *pStart; int *pNest; #endif { char * p = pStart; for ( ; ; ) { p = skipToSeparatorOrEqualSign(p, pNest); if (*pNest != 0) return p; if (*p == ',') return p; if (*p == 0) return p; p++; } } /* skip to just past the "=" separating the declaration from the initialization value */ #ifdef __USE_PROTOS char * getInitializer(char *pStart) #else char * getInitializer(pStart) char * pStart; #endif { char *p; char *pDataType; char *pSymbol; char *pEqualSign; char *pValue; char *pSeparator; int nest = 0; require(pStart!=NULL, "getInitializer: invalid string"); p = endFormal(pStart, &pDataType, &pSymbol, &pEqualSign, &pValue, &pSeparator, &nest); if (nest != 0) return NULL; if (pEqualSign == NULL) return NULL; if (pValue == NULL) return NULL; return strBetween(pValue, NULL, pSeparator); } /* Examines the string from pStart to pEnd-1. If the string has 0 length or is entirely white space returns 1. Otherwise 0. */ #ifdef __USE_PROTOS int isWhiteString(const char *pStart, const char *pEnd) #else int isWhiteString(pStart, pEnd) const char *pStart; const char *pEnd; #endif { const char *p; for (p = pStart; p < pEnd; p++) { if (! isspace(*p)) return 0; } return 1; } /* This replaces HasComma() which couldn't distinguish foo ["a,b"] from: foo[a,b] */ #ifdef __USE_PROTOS int hasMultipleOperands(char *pStart) #else int hasMultipleOperands(pStart) char *pStart; #endif { char *p = pStart; int nest = 0; p = skipSpaces(p); if (*p == 0) return 0; p = skipToSeparator(p, &nest); if (nest == 0 && *p == ',') return 1; return 0; } #define MAX_STR_BETWEEN_WORK_AREA 1000 static char strBetweenWorkArea[MAX_STR_BETWEEN_WORK_AREA]; /* strBetween(pStart, pNext, pStop) Creates a null terminated string by copying the text between two pointers to a work area. The start of the string is pStart. The end of the string is the character before pNext, or if pNext is null then the character before pStop. Trailing spaces are not included in the copy operation. This is used when a string contains several parts. The pNext part may be optional. The pStop will stop the scan when the optional part is not present (is a null pointer). */ #ifdef __USE_PROTOS char *strBetween(char *pStart, char *pNext, char *pStop) #else char *strBetween(pStart, pNext, pStop) char *pStart; char *pNext; char *pStop; #endif { char *p; char *q = strBetweenWorkArea; const char *pEnd; pEnd = (pNext != NULL) ? pNext : pStop; require (pEnd != NULL, "pEnd == NULL"); require (pEnd >= pStart, "pEnd < pStart"); for (pEnd--; pEnd >= pStart; pEnd--) { /* MR31 */ if (! isspace(*pEnd)) break; } for (p = pStart; p <= pEnd && q < &strBetweenWorkArea[MAX_STR_BETWEEN_WORK_AREA-2]; p++, q++) { *q = *p; } *q = 0; return strBetweenWorkArea; } /* function Returns pointer to character following separator at value which to continue search for next formal. If at the end of the string a pointer to the null byte at the end of the string is returned. pStart Pointer to the starting position of the formal list This may be the middle of a longer string, for example when looking for the end of formal #3 starting from the middle of the complete formal list. ppDataType Returns a pointer to the start of the data type in the formal. Example: pointer to "Foo". ppSymbol Returns a pointer to the start of the formal symbol. Example: pointer to "f". ppEqualSign Returns a pointer to the equal sign separating the formal symbol from the initial value. If there is no "=" then this will be NULL. ppValue Returns a pointer to the initial value part of the formal declaration. Example: pointer to "&farray[1,2]" ppSeparator Returns a pointer to the character which terminated the scan. This should be a pointer to a comma or a null byte which terminates the string. pNest Returns the nesting level when a separator was found. This is non-zero for any kind of error. This is zero for a successful parse of this portion of the formal list. */ #ifdef __USE_PROTOS char * endFormal(char *pStart, char **ppDataType, char **ppSymbol, char **ppEqualSign, char **ppValue, char **ppSeparator, int *pNest) #else char * endFormal(pStart, ppDataType, ppSymbol, ppEqualSign, ppValue, ppSeparator, pNest) char *pStart; char **ppDataType; char **ppSymbol; char **ppEqualSign; char **ppValue; char **ppSeparator; int *pNest; #endif { char *p = pStart; char *q; *ppDataType = NULL; *ppSymbol = NULL; *ppEqualSign = NULL; *ppValue = NULL; *ppSeparator = NULL; *pNest = 0; /* The first non-blank is the start of the datatype */ p = skipSpaces(p); if (*p == 0) goto EXIT; *ppDataType = p; /* We are not looking for the symbol, we are looking for the separator that follows the symbol. Then we'll back up. Search for the ',' or '=" or null terminator. */ p = skipToSeparatorOrEqualSign(p, pNest); if (*pNest != 0) goto EXIT; /* Work backwards to find start of symbol Skip spaces between the end of symbol and separator Assume that there are no spaces in the formal, but there is a space preceding the formal */ for (q = &p[-1]; q >= *ppDataType; q--) { if (! isspace(*q)) break; } if (q < *ppDataType) goto EXIT; /* MR26 Handle things like: IIR_Bool (IIR_Decl::*constraint)() Backup until we hit the end of a symbol string, then find the start of the symbol string. This wont' work for functions with prototypes, but works for the most common cases. For others, use typedef names. */ /* MR26 */ for (q = q; q >= *ppDataType; q--) { /* MR26 */ if (isalpha(*q) || isdigit(*q) || *q == '_' || *q == '$') break; /* MR26 */ } /* MR26 */ if (q < *ppDataType) goto EXIT; for (q = q; q >= *ppDataType; q--) { if ( ! (isalpha(*q) || isdigit(*q) || *q == '_' || *q == '$')) break; } *ppSymbol = &q[1]; if (*p == ',' || *p == 0) { *ppSeparator = p; goto EXIT; } *ppEqualSign = p; p = skipSpaces(++p); *ppValue = p; if (*p == 0) goto EXIT; while (*p != 0 && *pNest == 0 && *p != ',') { p = skipToSeparator(p, pNest); } if (*pNest == 0) *ppSeparator = p; EXIT: if (*p == ',') p++; return p; } gtkwave-3.3.86/contrib/pccts/antlr/stdpccts.h0000664000175000017500000000114413166335473020500 0ustar bybellbybell#ifndef STDPCCTS_H #define STDPCCTS_H /* * stdpccts.h -- P C C T S I n c l u d e * * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001 * Purdue University Electrical Engineering * With AHPCRC, University of Minnesota * ANTLR Version 1.33MR33 */ #ifndef ANTLR_VERSION #define ANTLR_VERSION 13333 #endif #include "pcctscfg.h" #include "pccts_stdio.h" #include "pcctscfg.h" #include "set.h" #include #include "syn.h" #include "hash.h" #include "generic.h" #define zzcr_attr(attr,tok,t) #define zzSET_SIZE 20 #include "antlr.h" #include "tokens.h" #include "dlgdef.h" #include "mode.h" #endif gtkwave-3.3.86/contrib/pccts/antlr/antlr1.txt0000664000175000017500000002624313166335473020451 0ustar bybellbybell ANTLR(1) PCCTS Manual Pages ANTLR(1) NAME antlr - ANother Tool for Language Recognition SYNTAX antlr [_o_p_t_i_o_n_s] _g_r_a_m_m_a_r__f_i_l_e_s DESCRIPTION _A_n_t_l_r converts an extended form of context-free grammar into a set of C functions which directly implement an efficient form of deterministic recursive-descent LL(k) parser. Context-free grammars may be augmented with predicates to allow semantics to influence parsing; this allows a form of context-sensitive parsing. Selective backtracking is also available to handle non-LL(k) and even non-LALR(k) con- structs. _A_n_t_l_r also produces a definition of a lexer which can be automatically converted into C code for a DFA-based lexer by _d_l_g. Hence, _a_n_t_l_r serves a function much like that of _y_a_c_c, however, it is notably more flexible and is more integrated with a lexer generator (_a_n_t_l_r directly generates _d_l_g code, whereas _y_a_c_c and _l_e_x are given independent descriptions). Unlike _y_a_c_c which accepts LALR(1) grammars, _a_n_t_l_r accepts LL(k) grammars in an extended BNF notation - which eliminates the need for precedence rules. Like _y_a_c_c grammars, _a_n_t_l_r grammars can use automatically- maintained symbol attribute values referenced as dollar variables. Further, because _a_n_t_l_r generates top-down parsers, arbitrary values may be inherited from parent rules (passed like function parameters). _A_n_t_l_r also has a mechan- ism for creating and manipulating abstract-syntax-trees. There are various other niceties in _a_n_t_l_r, including the ability to spread one grammar over multiple files or even multiple grammars in a single file, the ability to generate a version of the grammar with actions stripped out (for documentation purposes), and lots more. OPTIONS -ck _n Use up to _n symbols of lookahead when using compressed (linear approximation) lookahead. This type of looka- head is very cheap to compute and is attempted before full LL(k) lookahead, which is of exponential complex- ity in the worst case. In general, the compressed loo- kahead can be much deeper (e.g, -ck 10) _t_h_a_n _t_h_e _f_u_l_l _l_o_o_k_a_h_e_a_d (_w_h_i_c_h _u_s_u_a_l_l_y _m_u_s_t _b_e _l_e_s_s _t_h_a_n _4). -CC Generate C++ output from both ANTLR and DLG. -cr Generate a cross-reference for all rules. For each rule, print a list of all other rules that reference it. -e1 Ambiguities/errors shown in low detail (default). -e2 Ambiguities/errors shown in more detail. -e3 Ambiguities/errors shown in excruciating detail. -fe file Rename err.c to file. -fh file Rename stdpccts.h header (turns on -gh) to file. -fl file Rename lexical output, parser.dlg, to file. -fm file Rename file with lexical mode definitions, mode.h, to file. -fr file Rename file which remaps globally visible symbols, remap.h, to file. -ft file Rename tokens.h to file. -ga Generate ANSI-compatible code (default case). This has not been rigorously tested to be ANSI XJ11 C compliant, but it is close. The normal output of _a_n_t_l_r is currently compilable under both K&R, ANSI C, and C++- this option does nothing because _a_n_t_l_r generates a bunch of #ifdef's to do the right thing depending on the language. -gc Indicates that _a_n_t_l_r should generate no C code, i.e., only perform analysis on the grammar. -gd C code is inserted in each of the _a_n_t_l_r generated pars- ing functions to provide for user-defined handling of a detailed parse trace. The inserted code consists of calls to the user-supplied macros or functions called zzTRACEIN and zzTRACEOUT. The only argument is a _c_h_a_r * pointing to a C-style string which is the grammar rule recognized by the current parsing function. If no definition is given for the trace functions, upon rule entry and exit, a message will be printed indicating that a particular rule as been entered or exited. -ge Generate an error class for each non-terminal. -gh Generate stdpccts.h for non-ANTLR-generated files to include. This file contains all defines needed to describe the type of parser generated by _a_n_t_l_r (e.g. how much lookahead is used and whether or not trees are constructed) and contains the header action specified by the user. -gk Generate parsers that delay lookahead fetches until needed. Without this option, _a_n_t_l_r generates parsers which always have _k tokens of lookahead available. -gl Generate line info about grammar actions in C parser of the form # _l_i_n_e "_f_i_l_e" which makes error messages from the C/C++ compiler make more sense as they will point into the grammar file not the resulting C file. Debugging is easier as well, because you will step through the grammar not C file. -gs Do not generate sets for token expression lists; instead generate a ||-separated sequence of LA(1)==_t_o_k_e_n__n_u_m_b_e_r. The default is to generate sets. -gt Generate code for Abstract-Syntax Trees. -gx Do not create the lexical analyzer files (dlg-related). This option should be given when the user wishes to provide a customized lexical analyzer. It may also be used in _m_a_k_e scripts to cause only the parser to be rebuilt when a change not affecting the lexical struc- ture is made to the input grammars. -k _n Set k of LL(k) to _n; i.e. set tokens of look-ahead (default==1). -o dir Directory where output files should go (default="."). This is very nice for keeping the source directory clear of ANTLR and DLG spawn. -p The complete grammar, collected from all input grammar files and stripped of all comments and embedded actions, is listed to stdout. This is intended to aid in viewing the entire grammar as a whole and to elim- inate the need to keep actions concisely stated so that the grammar is easier to read. Hence, it is preferable to embed even complex actions directly in the grammar, rather than to call them as subroutines, since the sub- routine call overhead will be saved. -pa This option is the same as -p except that the output is annotated with the first sets determined from grammar analysis. -prc on Turn on the computation and hoisting of predicate con- text. -prc off Turn off the computation and hoisting of predicate con- text. This option makes 1.10 behave like the 1.06 release with option -pr on. Context computation is off by default. -rl _n Limit the maximum number of tree nodes used by grammar analysis to _n. Occasionally, _a_n_t_l_r is unable to analyze a grammar submitted by the user. This rare situation can only occur when the grammar is large and the amount of lookahead is greater than one. A non- linear analysis algorithm is used by PCCTS to handle the general case of LL(k) parsing. The average com- plexity of analysis, however, is near linear due to some fancy footwork in the implementation which reduces the number of calls to the full LL(k) algorithm. An error message will be displayed, if this limit is reached, which indicates the grammar construct being analyzed when _a_n_t_l_r hit a non-linearity. Use this option if _a_n_t_l_r seems to go out to lunch and your disk start thrashing; try _n=10000 to start. Once the offending construct has been identified, try to remove the ambiguity that _a_n_t_l_r was trying to overcome with large lookahead analysis. The introduction of (...)? backtracking blocks eliminates some of these problems - _a_n_t_l_r does not analyze alternatives that begin with (...)? (it simply backtracks, if necessary, at run time). -w1 Set low warning level. Do not warn if semantic predicates and/or (...)? blocks are assumed to cover ambiguous alternatives. -w2 Ambiguous parsing decisions yield warnings even if semantic predicates or (...)? blocks are used. Warn if predicate context computed and semantic predicates incompletely disambiguate alternative productions. - Read grammar from standard input and generate stdin.c as the parser file. SPECIAL CONSIDERATIONS _A_n_t_l_r works... we think. There is no implicit guarantee of anything. We reserve no legal rights to the software known as the Purdue Compiler Construction Tool Set (PCCTS) - PCCTS is in the public domain. An individual or company may do whatever they wish with source code distributed with PCCTS or the code generated by PCCTS, including the incorporation of PCCTS, or its output, into commercial software. We encourage users to develop software with PCCTS. However, we do ask that credit is given to us for developing PCCTS. By "credit", we mean that if you incorporate our source code into one of your programs (commercial product, research pro- ject, or otherwise) that you acknowledge this fact somewhere in the documentation, research report, etc... If you like PCCTS and have developed a nice tool with the output, please mention that you developed it using PCCTS. As long as these guidelines are followed, we expect to continue enhancing this system and expect to make other tools available as they are completed. FILES *.c output C parser. *.cpp output C++ parser when C++ mode is used. parser.dlg output _d_l_g lexical analyzer. err.c token string array, error sets and error support rou- tines. Not used in C++ mode. remap.h file that redefines all globally visible parser sym- bols. The use of the #parser directive creates this file. Not used in C++ mode. stdpccts.h list of definitions needed by C files, not generated by PCCTS, that reference PCCTS objects. This is not gen- erated by default. Not used in C++ mode. tokens.h output #_d_e_f_i_n_e_s for tokens used and function prototypes for functions generated for rules. SEE ALSO dlg(1), pccts(1) gtkwave-3.3.86/contrib/pccts/antlr/makefile.VMS0000664000175000017500000000232213166335473020643 0ustar bybellbybell$! File: MAKE.COM - Makefile for ANTLR 1.33 on OpenVMS, DECC $! $! History: $! --------- $! 20-Mar-1992 Fred Scholldorf Hacked together for VAX/VMS. $! 24-Mar-1992 Fred Scholldorf LINK against VAXCRTL sharable library. $! 24-Aug-1993 Fred Scholldorf Upgrade for ANTLR V1.10. $! 27-Jan-1998 J.F. Pieronne Upgrade for ANTLR V1.33, DECC $! $ set noon !Don't stop on errors. $! $ if P1 .eqs. "LINK" then goto relink $! $ define/nolog pccts_h "[-.h]" $ define/nolog support_set "[-.support.set]" $! $ delete/nolog *.obj;* !Get rid of existing .OBJ files. $! $ options = "/INCLUDE=(pccts_h,support_set)/define=(USER_ZZSYN)" $ CC 'options' antlr $ CC 'options' scan $ CC 'options' err $ CC 'options' bits $ CC 'options' build $ CC 'options' fset2 $ CC 'options' fset $ CC 'options' gen $ CC 'options' globals $ CC 'options' hash $ CC 'options' lex $ CC 'options' main $ CC 'options' misc $ CC 'options' pred $ CC 'options' egman $ CC 'options' mrhoist $ CC 'options' fcache $ CC 'options' [-.support.set]set $! $relink: $ LINK antlr,scan,err,bits,build, - fset2,fset,gen,globals,hash, - lex,main,misc,pred,egman,mrhoist,fcache,set, - sys$input:/options ! sys$share:vaxcrtl.exe/share $ EXIT gtkwave-3.3.86/contrib/pccts/antlr/bits.c0000664000175000017500000006674113166335473017623 0ustar bybellbybell/* bits.c -- manage creation and output of bit sets used by the parser. * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * ANTLR 1.33 * Terence Parr * Parr Research Corporation * with Purdue University and AHPCRC, University of Minnesota * 1989-2001 */ #include #include #include #include #include "pcctscfg.h" #include "set.h" #include "syn.h" #include "hash.h" #include "generic.h" #include "dlgdef.h" /* OSX warning fix */ #define GR_INT int /* char is only thing that is pretty much always known == 8 bits * This allows output of antlr (set stuff, anyway) to be androgynous (portable) */ typedef unsigned char SetWordType; #define BitsPerByte 8 #define BitsPerWord BitsPerByte*sizeof(SetWordType) static SetWordType *setwd = NULL; int setnum = -1; int wordnum = 0; int esetnum = 0; /* Used to convert native wordsize, which ANTLR uses (via set.c) to manipulate sets, to bytes that are most portable size-wise. */ void #ifdef __USE_PROTOS DumpIntAsChars( FILE *f, char *format, unsigned wd ) #else DumpIntAsChars( f, format, wd ) FILE *f; char *format; unsigned wd; #endif { int i; /* uses max of 32 bit unsigned integer for the moment */ static unsigned long byte_mask[sizeof(unsigned long)] = { 0xFF, 0xFF00UL, 0xFF0000UL, 0xFF000000UL }; /* MR20 G. Hobbelt */ /* 0xFF00000000, 0xFF0000000000, 0xFF000000000000, 0xFF00000000000000 };*/ /* for each byte in the word */ assert(sizeof(unsigned) <= 4); /* M20 G. Hobbelt Sanity check */ for (i=0; i>(i*BitsPerByte)); if ( itok))); return empty; } r = RulePtr[q->rulenum]; r->end->halt = TRUE; /* don't let reach fall off end of rule here */ rk = empty; REACH(r, 1, &rk, a); r->end->halt = FALSE; return a; } /* * scan the list of tokens/eclasses/nonterminals filling the new eclass * with the set described by the list. Note that an eclass can be * quoted to allow spaces etc... However, an eclass must not conflict * with a reg expr found elsewhere. The reg expr will be taken over * the eclass name. */ static void #ifdef __USE_PROTOS doEclass( char *eclass ) #else doEclass( eclass ) char *eclass; #endif { TermEntry *q; ECnode *p; TCnode *tcnode; ListNode *e; unsigned int t; unsigned deg=0; set a; require(eclass!=NULL, "doEclass: NULL eset"); p = (ECnode *) eclass; lexmode(p->lexclass); /* switch to lexclass where errclass is defined */ p->eset = empty; for (e = (p->elist)->next; e!=NULL; e=e->next) { q = NULL; /* MR23 */ if ( islower( *((char *)e->elem) ) ) /* is it a rule ref? (alias FIRST request) */ { a = Efirst((char *)e->elem, p); set_orin(&p->eset, a); deg += set_deg(a); set_free( a ); continue; } else if ( *((char *)e->elem)=='"' ) { t = 0; q = (TermEntry *) hash_get(Texpr, (char *) e->elem); if ( q == NULL ) { /* if quoted and not an expr look for eclass name */ /* fix to the following to avoid -fstrict-aliasing problems in compiler: */ char *e_ch = StripQuotes((char *)e->elem); e->elem = e_ch; q = (TermEntry *) hash_get(Tname, *((char **)&(e_ch)) ); /* above was: q = (TermEntry *) hash_get(Tname, *((char **)&(e->elem))=StripQuotes((char *)e->elem)); */ if ( q != NULL ) t = q->token; } else t = q->token; } else /* labelled token/eclass/tokclass */ { q = (TermEntry *) hash_get(Tname, (char *)e->elem); if ( q != NULL ) { if ( strcmp((char *)e->elem, TokenString(p->tok))==0 ) { warnNoFL(eMsg1("self-referential error class '%s'; ignored", (char *)e->elem)); continue; } else t = q->token; } else t=0; } if ( t!=0 ) { if (isTermEntryTokClass(q)) { /* MR23 */ tcnode = q->tclass; /* MR23 */ set_orin(&p->eset, tcnode->tset); /* MR23 */ deg = set_deg(p->eset); /* MR23 */ } /* MR23 */ else { set_orel(t, &p->eset); deg++; } } else warnNoFL(eMsg2("undefined token '%s' referenced in errclass '%s'; ignored", (char *)e->elem, TokenString(p->tok))); } p->setdeg = deg; } void #ifdef __USE_PROTOS ComputeErrorSets( void ) #else ComputeErrorSets( ) #endif { #ifdef __cplusplus list_apply(eclasses, (void (*)(void *)) doEclass); #else #ifdef __USE_PROTOS list_apply(eclasses, (void (*)(void *)) doEclass); #else list_apply(eclasses, doEclass); #endif #endif } void #ifdef __USE_PROTOS ComputeTokSets( void ) #else ComputeTokSets( ) #endif { ListNode *t, *e = NULL, *e1, *e2; int something_changed; int i; TCnode *p; TermEntry *q, *q1, *q2; if ( tclasses == NULL ) return; /* turn lists of token/tokclass references into sets */ for (t = tclasses->next; t!=NULL; t=t->next) { p = (TCnode *) t->elem; /* if wild card, then won't have entries in tclass, assume all_tokens */ if ( p->tok == WildCardToken ) { p->tset = set_dup(all_tokens); continue; } lexmode(p->lexclass); /* switch to lexclass where tokclass is defined */ p->tset = empty; /* instantiate all tokens/token_classes into the tset */ for (e = (p->tlist)->next; e!=NULL; e=e->next) { char *tokstr; tokstr = (char *)e->elem; if ( *tokstr == '"' ) { q = (TermEntry *) hash_get(Texpr, tokstr); require(q!=NULL, "ComputeTokSets: no token def"); set_orel(q->token, &p->tset); } else if (tokstr[0] == '.') { e1=e->next; e2=e1->next; e=e2; q1= (TermEntry *) hash_get(Tname, (char *)e1->elem); require(q1!=NULL, "ComputeTokSets: no token def"); q2= (TermEntry *) hash_get(Tname, (char *)e2->elem); require(q2!=NULL, "ComputeTokSets: no token def"); if (set_el(q1->token,imag_tokens)) { errNoFL(eMsg2("can't define #tokclass %s using #tokclass or #errclass %s", TokenString(p->tok),(char *)e1->elem) ); } if (set_el(q2->token,imag_tokens)) { errNoFL(eMsg2("can't define #tokclass %s using #tokclass or #errclass %s", TokenString(p->tok),(char *)e2->elem) ); } if (q1->token > q2->token) { errNoFL(eMsg3("for #tokclass %s %s..%s - first token number > second token number", TokenString(p->tok),(char *)e1->elem,(char *)e2->elem) ); for (i=q2->token; i<=q1->token; i++) { set_orel(i, &p->tset); } } else { for (i=q1->token; i<=q2->token; i++) { set_orel(i, &p->tset); } } } else { q = (TermEntry *) hash_get(Tname, tokstr); require(q!=NULL, "ComputeTokSets: no token def"); set_orel(q->token, &p->tset); } } } /* Go thru list of tokclasses again looking for tokclasses in sets */ again: something_changed = 0; for (t = tclasses->next; t!=NULL; t=t->next) { set tcl; p = (TCnode *) t->elem; tcl = set_and(p->tset, tokclasses); if ( !set_nil(tcl) ) { int tk; /* replace refs to tokclasses with the associated set of tokens */ something_changed = 1; while ( !set_nil(tcl) ) { tk = set_int(tcl); /* grab one of the tok class refs */ set_rm(tk, tcl); if ( p->tok != tk ) /* tokclass ref to yourself? */ { q = (TermEntry *) hash_get(Tname, TokenString(tk)); require(q!=NULL, "#tokclass not in hash table"); set_orin(&p->tset, q->tclass->tset); } set_rm(tk, p->tset); /* remove ref that we replaced */ } } set_free(tcl); } if ( something_changed ) goto again; } void #ifdef __USE_PROTOS DumpRemainingTokSets(void) #else DumpRemainingTokSets() #endif { TCnode *p; ListNode *t; /* Go thru tclasses (for the last time) and dump the sets not dumped * during code gen; yes, this is a bogus way to do this, but ComputeTokSets() * can't dump the defs as the error file and tok file has not been created * yet etc... */ if ( tclasses==NULL ) return; for (t = tclasses->next; t!=NULL; t=t->next) { unsigned e; p = (TCnode *) t->elem; if ( p->dumped ) continue; e = DefErrSet(&(p->tset), 0, TokenString(p->tok)); p->dumped = 1; p->setnum = e; } } /* replace a subset of an error set with an error class name if a subset is found * repeat process until no replacements made */ void #ifdef __USE_PROTOS SubstErrorClass( set *f ) #else SubstErrorClass( f ) set *f; #endif { int max, done = 0; ListNode *p; ECnode *ec, *maxclass = NULL; set a; require(f!=NULL, "SubstErrorClass: NULL eset"); if ( eclasses == NULL ) return; while ( !done ) { max = 0; maxclass = NULL; for (p=eclasses->next; p!=NULL; p=p->next) /* chk all error classes */ { ec = (ECnode *) p->elem; if ( ec->setdeg > max ) { if ( set_sub(ec->eset, *f) || set_equ(ec->eset, *f) ) {maxclass = ec; max=ec->setdeg;} } } if ( maxclass != NULL ) /* if subset found, replace with token */ { a = set_dif(*f, maxclass->eset); set_orel((unsigned)maxclass->tok, &a); set_free(*f); *f = a; } else done = 1; } } int #ifdef __USE_PROTOS DefErrSet1(int nilOK, set *f, int subst, char *name ) #else DefErrSet1(nilOK, f, subst, name ) int nilOK; set *f; int subst; /* should be substitute error classes? */ char *name; #endif { if ( GenCC ) return DefErrSetForCC1(nilOK, f, subst, name, "_set"); else return DefErrSetForC1(nilOK, f, subst, name, "_set"); } int #ifdef __USE_PROTOS DefErrSet( set *f, int subst, char *name ) #else DefErrSet( f, subst, name ) set *f; int subst; /* should be substitute error classes? */ char *name; #endif { return DefErrSet1(0,f,subst,name); } int #ifdef __USE_PROTOS DefErrSetWithSuffix(int nilOK, set *f, int subst, char *name, const char* suffix) #else DefErrSetWithSuffix(nilOK, f, subst, name, suffix ) int nilOK; set *f; int subst; /* should be substitute error classes? */ char *name; char *suffix; #endif { if ( GenCC ) return DefErrSetForCC1(nilOK, f, subst, name, suffix ); else return DefErrSetForC1(nilOK, f, subst, name, suffix); } /* Define a new error set. WARNING...set-implementation dependent. */ int #ifdef __USE_PROTOS DefErrSetForC1(int nilOK, set *f, int subst, char * name, const char * suffix) #else DefErrSetForC1(nilOK, f, subst, name, suffix) int nilOK; /* MR13 */ set *f; int subst; /* should be substitute error classes? */ char *name; const char *suffix; #endif { unsigned *p, *endp; int e=1; if (!nilOK) require(!set_nil(*f), "DefErrSetForC1: nil set to dump?"); if ( subst ) SubstErrorClass(f); p = f->setword; endp = &(f->setword[f->n]); esetnum++; if ( name!=NULL ) fprintf(DefFile, "extern SetWordType %s%s[];\n", name, suffix); else fprintf(DefFile, "extern SetWordType zzerr%d[];\n", esetnum); if ( name!=NULL ) { fprintf(ErrFile, "SetWordType %s%s[%d] = {", name, suffix, (GR_INT)(NumWords(TokenNum-1)*sizeof(unsigned))); } else { fprintf(ErrFile, "SetWordType zzerr%d[%d] = {", esetnum, (GR_INT)(NumWords(TokenNum-1)*sizeof(unsigned))); } while ( p < endp ) { if ( e > 1 ) fprintf(ErrFile, ", "); DumpIntAsChars(ErrFile, "0x%x", *p++); if ( e == 3 ) { DAWDLE; if ( p < endp ) fprintf(ErrFile, ","); fprintf(ErrFile, "\n\t"); e=1; } else e++; } fprintf(ErrFile, "};\n"); return esetnum; } int #ifdef __USE_PROTOS DefErrSetForC( set *f, int subst, char *name ) #else DefErrSetForC( f, subst, name ) set *f; int subst; /* should be substitute error classes? */ char *name; #endif { return DefErrSetForC1(0,f,subst,name, "_set"); } /* Define a new error set. WARNING...set-implementation dependent; * Only used when -CC on. */ int #ifdef __USE_PROTOS DefErrSetForCC1(int nilOK, set *f, int subst, char *name, const char *suffix ) #else DefErrSetForCC1(nilOK, f, subst, name, suffix ) int nilOK; /* MR13 */ set *f; int subst; /* should be substitute error classes? */ char *name; const char *suffix; #endif { unsigned *p, *endp; int e=1; if (!nilOK) require(!set_nil(*f), "DefErrSetForCC1: nil set to dump?"); if ( subst ) SubstErrorClass(f); p = f->setword; endp = &(f->setword[f->n]); esetnum++; if ( name!=NULL ) { fprintf(Parser_h, "\tstatic SetWordType %s%s[%d];\n", name, suffix, (GR_INT)(NumWords(TokenNum-1)*sizeof(unsigned))); fprintf(Parser_c, "SetWordType %s::%s%s[%d] = {", CurrentClassName, name, suffix, (GR_INT)(NumWords(TokenNum-1)*sizeof(unsigned))); } else { fprintf(Parser_c, "SetWordType %s::err%d[%d] = {", CurrentClassName, esetnum, (GR_INT)(NumWords(TokenNum-1)*sizeof(unsigned))); fprintf(Parser_h, "\tstatic SetWordType err%d[%d];\n", esetnum, (GR_INT)(NumWords(TokenNum-1)*sizeof(unsigned))); } while ( p < endp ) { if ( e > 1 ) fprintf(Parser_c, ", "); DumpIntAsChars(Parser_c, "0x%x", *p++); if ( e == 3 ) { if ( p < endp ) fprintf(Parser_c, ","); fprintf(Parser_c, "\n\t"); e=1; } else e++; } fprintf(Parser_c, "};\n"); return esetnum; } int #ifdef __USE_PROTOS DefErrSetForCC( set *f, int subst, char *name ) #else DefErrSetForCC( f, subst, name ) set *f; int subst; /* should be substitute error classes? */ char *name; #endif { return DefErrSetForCC1(0,f,subst,name, "_set"); } void #ifdef __USE_PROTOS GenParser_c_Hdr(void) #else GenParser_c_Hdr() #endif { int i,j; TermEntry *te; char * hasAkaName = NULL; /* MR23 */ hasAkaName = (char *) malloc(TokenNum+1); /* MR23 */ require(hasAkaName!=NULL, "Cannot alloc hasAkaName\n"); /* MR23 */ for (i = 0; i < TokenNum; i++) hasAkaName[i]='0'; /* MR23 */ hasAkaName[TokenNum] = 0; /* MR23 */ fprintf(Parser_c, "/*\n"); fprintf(Parser_c, " * %s: P a r s e r S u p p o r t\n", CurrentClassName); fprintf(Parser_c, " *\n"); fprintf(Parser_c, " * Generated from:"); for (i=0; i=LastTokenCounted ) { fprintf(Parser_c, ",\n\t/* %02d */\t\"invalid\"", i); continue; } if ( TokenString(i) != NULL ) { te=(TermEntry *) hash_get(Tname,TokenString(i)); /* MR11 */ if (te == NULL || te->akaString == NULL) { /* MR11 */ fprintf(Parser_c, ",\n\t/* %02d */\t\"%s\"", i, TokenString(i)); } else { hasAkaName[i] = '1'; /* MR23 */ fprintf(Parser_c, ",\n\t/* %02d */\t\"%s\"", i, te->akaString); /* MR11 */ } } else { /* look in all lexclasses for the reg expr */ for (j=0; j=NumLexClasses ) { if ( UserDefdTokens ) { fprintf(Parser_c, ",\n\t/* %02d */\t\"\"", i); } else fatal_internal(eMsgd("No label or expr for token %d",i)); } } } fprintf(Parser_c, "\n};\n"); /* Build constructors */ fprintf(Parser_c, "\n%s::", CurrentClassName); fprintf(Parser_c, "%s(ANTLRTokenBuffer *input) : %s(input,%d,%d,%d,%d)\n", CurrentClassName, (BaseClassName == NULL ? "ANTLRParser" : BaseClassName), OutputLL_k, FoundGuessBlk, DemandLookahead, (GR_INT)(NumWords(TokenNum-1)*sizeof(unsigned))); fprintf(Parser_c, "{\n"); fprintf(Parser_c, "\ttoken_tbl = _token_tbl;\n"); if (TraceGen) { fprintf(Parser_c, "\ttraceOptionValueDefault=1;\t\t// MR10 turn trace ON\n"); } else { fprintf(Parser_c, "\ttraceOptionValueDefault=0;\t\t// MR10 turn trace OFF\n"); }; fprintf(Parser_c, "}\n\n"); free ( (void *) hasAkaName); } void #ifdef __USE_PROTOS GenParser_h_Hdr(void) #else GenParser_h_Hdr() #endif { int i; fprintf(Parser_h, "/*\n"); fprintf(Parser_h, " * %s: P a r s e r H e a d e r \n", CurrentClassName); fprintf(Parser_h, " *\n"); fprintf(Parser_h, " * Generated from:"); for (i=0; i 1 ) fprintf(ErrFile, "#define LL_K %d\n", OutputLL_k); #ifdef DUM if ( LexGen ) fprintf(ErrFile, "#define zzEOF_TOKEN %d\n", (TokenInd!=NULL?TokenInd[EofToken]:EofToken)); #endif fprintf(ErrFile, "#define zzSET_SIZE %d\n", (GR_INT)(NumWords(TokenNum-1)*sizeof(unsigned))); if ( DemandLookahead ) fprintf(ErrFile, "#define DEMAND_LOOK\n"); fprintf(ErrFile, "#include \"antlr.h\"\n"); if ( GenAST ) fprintf(ErrFile, "#include \"ast.h\"\n"); if ( UserDefdTokens ) fprintf(ErrFile, "#include %s\n", UserTokenDefsFile); /* still need this one as it has the func prototypes */ fprintf(ErrFile, "#include \"%s\"\n", DefFileName); fprintf(ErrFile, "#include \"dlgdef.h\"\n"); fprintf(ErrFile, "#include \"err.h\"\n\n"); /* Dump a zztokens for each automaton */ if ( strcmp(ParserName, DefaultParserName)!=0 ) { fprintf(ErrFile, "ANTLRChar *%s_zztokens[%d]={\n", ParserName, TokenNum-1); } else { fprintf(ErrFile, "ANTLRChar *zztokens[%d]={\n", TokenNum-1); } fprintf(ErrFile, "\t/* 00 */\t\"Invalid\""); for (i=1; i=LastTokenCounted ) { fprintf(ErrFile, ",\n\t/* %02d */\t\"invalid\"", i); continue; } if ( TokenString(i) != NULL ) { te=(TermEntry *) hash_get(Tname,TokenString(i)); /* MR11 */ if (te == NULL || te->akaString == NULL) { /* MR11 */ fprintf(ErrFile, ",\n\t/* %02d */\t\"%s\"", i, TokenString(i)); } else { fprintf(ErrFile, ",\n\t/* %02d */\t\"%s\"", i, te->akaString); /* MR11 */ } } else { /* look in all lexclasses for the reg expr */ for (j=0; j=NumLexClasses ) { if ( UserDefdTokens ) { fprintf(ErrFile, ",\n\t/* %02d */\t\"\"", i); } else fatal_internal(eMsgd("No label or expr for token %d",i)); } } } fprintf(ErrFile, "\n};\n"); } void #ifdef __USE_PROTOS dumpExpr( FILE *f, char *e ) #else dumpExpr( f, e ) FILE *f; char *e; #endif { while ( *e!='\0' ) { if ( *e=='\\' && *(e+1)=='\\' ) {putc('\\', f); putc('\\', f); e+=2;} else if ( *e=='\\' && *(e+1)=='"' ) {putc('\\', f); putc('"', f); e+=2;} else if ( *e=='\\' ) {putc('\\', f); putc('\\', f); e++;} else {putc(*e, f); e++;} } } int #ifdef __USE_PROTOS isTermEntryTokClass(TermEntry *te) #else isTermEntryTokClass(te) TermEntry *te; #endif { ListNode *t; TCnode *p; TermEntry *q; char *tokstr; if (tclasses == NULL) return 0; for (t = tclasses->next; t!=NULL; t=t->next) { p = (TCnode *) t->elem; tokstr = TokenString(p->tok); lexmode(p->lexclass); /* switch to lexclass where tokclass is defined */ q = (TermEntry *) hash_get(Tname, tokstr); if (q == te) return 1; } return 0; } gtkwave-3.3.86/contrib/pccts/antlr/AntlrMSVC50.mak0000664000175000017500000004125713166335473021121 0ustar bybellbybell# Microsoft Developer Studio Generated NMAKE File, Based on AntlrMSVC50.dsp !IF "$(CFG)" == "" CFG=ANTLR - Win32 Debug !MESSAGE No configuration specified. Defaulting to ANTLR - Win32 Debug. !ENDIF !IF "$(CFG)" != "ANTLR - Win32 Release" && "$(CFG)" != "ANTLR - Win32 Debug" !MESSAGE Invalid configuration "$(CFG)" specified. !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "AntlrMSVC50.mak" CFG="ANTLR - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "ANTLR - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "ANTLR - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE !ERROR An invalid configuration is specified. !ENDIF !IF "$(OS)" == "Windows_NT" NULL= !ELSE NULL=nul !ENDIF !IF "$(CFG)" == "ANTLR - Win32 Release" OUTDIR=.\. INTDIR=.\. # Begin Custom Macros OutDir=.\. # End Custom Macros !IF "$(RECURSE)" == "0" ALL : "tokens.h" "scan.c" "parser.dlg" "mode.h" "err.c" "antlr.c"\ "$(OUTDIR)\Antlr.exe" "$(OUTDIR)\AntlrMSVC50.bsc" !ELSE ALL : "tokens.h" "scan.c" "parser.dlg" "mode.h" "err.c" "antlr.c"\ "$(OUTDIR)\Antlr.exe" "$(OUTDIR)\AntlrMSVC50.bsc" !ENDIF CLEAN : -@erase "$(INTDIR)\antlr.obj" -@erase "$(INTDIR)\antlr.sbr" -@erase "$(INTDIR)\bits.obj" -@erase "$(INTDIR)\bits.sbr" -@erase "$(INTDIR)\build.obj" -@erase "$(INTDIR)\build.sbr" -@erase "$(INTDIR)\egman.obj" -@erase "$(INTDIR)\egman.sbr" -@erase "$(INTDIR)\err.obj" -@erase "$(INTDIR)\err.sbr" -@erase "$(INTDIR)\fcache.obj" -@erase "$(INTDIR)\fcache.sbr" -@erase "$(INTDIR)\fset.obj" -@erase "$(INTDIR)\fset.sbr" -@erase "$(INTDIR)\fset2.obj" -@erase "$(INTDIR)\fset2.sbr" -@erase "$(INTDIR)\gen.obj" -@erase "$(INTDIR)\gen.sbr" -@erase "$(INTDIR)\globals.obj" -@erase "$(INTDIR)\globals.sbr" -@erase "$(INTDIR)\hash.obj" -@erase "$(INTDIR)\hash.sbr" -@erase "$(INTDIR)\lex.obj" -@erase "$(INTDIR)\lex.sbr" -@erase "$(INTDIR)\main.obj" -@erase "$(INTDIR)\main.sbr" -@erase "$(INTDIR)\misc.obj" -@erase "$(INTDIR)\misc.sbr" -@erase "$(INTDIR)\mrhoist.obj" -@erase "$(INTDIR)\mrhoist.sbr" -@erase "$(INTDIR)\pred.obj" -@erase "$(INTDIR)\pred.sbr" -@erase "$(INTDIR)\scan.obj" -@erase "$(INTDIR)\scan.sbr" -@erase "$(INTDIR)\set.obj" -@erase "$(INTDIR)\set.sbr" -@erase "$(INTDIR)\vc50.idb" -@erase "$(OUTDIR)\Antlr.exe" -@erase "$(OUTDIR)\AntlrMSVC50.bsc" -@erase "antlr.c" -@erase "err.c" -@erase "mode.h" -@erase "parser.dlg" -@erase "scan.c" -@erase "tokens.h" "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP=cl.exe CPP_PROJ=/nologo /ML /W3 /GX /O2 /I "." /I "..\h" /I "..\support\set" /D\ "NDEBUG" /D "LONGFILENAMES" /D "PC" /D "USER_ZZSYN" /D ZZLEXBUFSIZE=65536 /D\ "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\"\ /Fd"$(INTDIR)\\" /FD /c CPP_OBJS=./ CPP_SBRS=./ .c{$(CPP_OBJS)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(CPP_OBJS)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(CPP_OBJS)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .c{$(CPP_SBRS)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(CPP_SBRS)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(CPP_SBRS)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << RSC=rc.exe BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\AntlrMSVC50.bsc" BSC32_SBRS= \ "$(INTDIR)\antlr.sbr" \ "$(INTDIR)\bits.sbr" \ "$(INTDIR)\build.sbr" \ "$(INTDIR)\egman.sbr" \ "$(INTDIR)\err.sbr" \ "$(INTDIR)\fcache.sbr" \ "$(INTDIR)\fset.sbr" \ "$(INTDIR)\fset2.sbr" \ "$(INTDIR)\gen.sbr" \ "$(INTDIR)\globals.sbr" \ "$(INTDIR)\hash.sbr" \ "$(INTDIR)\lex.sbr" \ "$(INTDIR)\main.sbr" \ "$(INTDIR)\misc.sbr" \ "$(INTDIR)\mrhoist.sbr" \ "$(INTDIR)\pred.sbr" \ "$(INTDIR)\scan.sbr" \ "$(INTDIR)\set.sbr" "$(OUTDIR)\AntlrMSVC50.bsc" : "$(OUTDIR)" $(BSC32_SBRS) $(BSC32) @<< $(BSC32_FLAGS) $(BSC32_SBRS) << LINK32=link.exe LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\ odbccp32.lib /nologo /subsystem:console /incremental:no\ /pdb:"$(OUTDIR)\Antlr.pdb" /machine:I386 /out:"$(OUTDIR)\Antlr.exe" LINK32_OBJS= \ "$(INTDIR)\antlr.obj" \ "$(INTDIR)\bits.obj" \ "$(INTDIR)\build.obj" \ "$(INTDIR)\egman.obj" \ "$(INTDIR)\err.obj" \ "$(INTDIR)\fcache.obj" \ "$(INTDIR)\fset.obj" \ "$(INTDIR)\fset2.obj" \ "$(INTDIR)\gen.obj" \ "$(INTDIR)\globals.obj" \ "$(INTDIR)\hash.obj" \ "$(INTDIR)\lex.obj" \ "$(INTDIR)\main.obj" \ "$(INTDIR)\misc.obj" \ "$(INTDIR)\mrhoist.obj" \ "$(INTDIR)\pred.obj" \ "$(INTDIR)\scan.obj" \ "$(INTDIR)\set.obj" "$(OUTDIR)\Antlr.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << SOURCE=$(InputPath) PostBuild_Desc=Copy antlr to ..\bin directory DS_POSTBUILD_DEP=$(INTDIR)\postbld.dep ALL : $(DS_POSTBUILD_DEP) # Begin Custom Macros OutDir=.\. # End Custom Macros $(DS_POSTBUILD_DEP) : "tokens.h" "scan.c" "parser.dlg" "mode.h" "err.c"\ "antlr.c" "$(OUTDIR)\Antlr.exe" "$(OUTDIR)\AntlrMSVC50.bsc" mkdir ..\bin copy ..\bin\antlr.exe antlr_old.exe copy antlr.exe ..\bin\. echo Helper for Post-build step > "$(DS_POSTBUILD_DEP)" !ELSEIF "$(CFG)" == "ANTLR - Win32 Debug" OUTDIR=.\. INTDIR=.\. # Begin Custom Macros OutDir=.\. # End Custom Macros !IF "$(RECURSE)" == "0" ALL : "tokens.h" "scan.c" "parser.dlg" "mode.h" "err.c" "antlr.c"\ "$(OUTDIR)\Antlr.exe" "$(OUTDIR)\AntlrMSVC50.bsc" !ELSE ALL : "tokens.h" "scan.c" "parser.dlg" "mode.h" "err.c" "antlr.c"\ "$(OUTDIR)\Antlr.exe" "$(OUTDIR)\AntlrMSVC50.bsc" !ENDIF CLEAN : -@erase "$(INTDIR)\antlr.obj" -@erase "$(INTDIR)\antlr.sbr" -@erase "$(INTDIR)\bits.obj" -@erase "$(INTDIR)\bits.sbr" -@erase "$(INTDIR)\build.obj" -@erase "$(INTDIR)\build.sbr" -@erase "$(INTDIR)\egman.obj" -@erase "$(INTDIR)\egman.sbr" -@erase "$(INTDIR)\err.obj" -@erase "$(INTDIR)\err.sbr" -@erase "$(INTDIR)\fcache.obj" -@erase "$(INTDIR)\fcache.sbr" -@erase "$(INTDIR)\fset.obj" -@erase "$(INTDIR)\fset.sbr" -@erase "$(INTDIR)\fset2.obj" -@erase "$(INTDIR)\fset2.sbr" -@erase "$(INTDIR)\gen.obj" -@erase "$(INTDIR)\gen.sbr" -@erase "$(INTDIR)\globals.obj" -@erase "$(INTDIR)\globals.sbr" -@erase "$(INTDIR)\hash.obj" -@erase "$(INTDIR)\hash.sbr" -@erase "$(INTDIR)\lex.obj" -@erase "$(INTDIR)\lex.sbr" -@erase "$(INTDIR)\main.obj" -@erase "$(INTDIR)\main.sbr" -@erase "$(INTDIR)\misc.obj" -@erase "$(INTDIR)\misc.sbr" -@erase "$(INTDIR)\mrhoist.obj" -@erase "$(INTDIR)\mrhoist.sbr" -@erase "$(INTDIR)\pred.obj" -@erase "$(INTDIR)\pred.sbr" -@erase "$(INTDIR)\scan.obj" -@erase "$(INTDIR)\scan.sbr" -@erase "$(INTDIR)\set.obj" -@erase "$(INTDIR)\set.sbr" -@erase "$(INTDIR)\vc50.idb" -@erase "$(INTDIR)\vc50.pdb" -@erase "$(OUTDIR)\Antlr.exe" -@erase "$(OUTDIR)\Antlr.ilk" -@erase "$(OUTDIR)\Antlr.pdb" -@erase "$(OUTDIR)\AntlrMSVC50.bsc" -@erase "antlr.c" -@erase "err.c" -@erase "mode.h" -@erase "parser.dlg" -@erase "scan.c" -@erase "tokens.h" "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP=cl.exe CPP_PROJ=/nologo /MLd /W3 /Gm /GX /Zi /Od /I "." /I "..\h" /I "..\support\set"\ /D "LONGFILENAMES" /D "PC" /D "USER_ZZSYN" /D ZZLEXBUFSIZE=65536 /D "_DEBUG" /D\ "WIN32" /D "_CONSOLE" /D "_MBCS" /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\"\ /Fd"$(INTDIR)\\" /FD /c CPP_OBJS=./ CPP_SBRS=./ .c{$(CPP_OBJS)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(CPP_OBJS)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(CPP_OBJS)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .c{$(CPP_SBRS)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(CPP_SBRS)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(CPP_SBRS)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << RSC=rc.exe BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\AntlrMSVC50.bsc" -DUSER_ZZSYN -D__STDC__ BSC32_SBRS= \ "$(INTDIR)\antlr.sbr" \ "$(INTDIR)\bits.sbr" \ "$(INTDIR)\build.sbr" \ "$(INTDIR)\egman.sbr" \ "$(INTDIR)\err.sbr" \ "$(INTDIR)\fcache.sbr" \ "$(INTDIR)\fset.sbr" \ "$(INTDIR)\fset2.sbr" \ "$(INTDIR)\gen.sbr" \ "$(INTDIR)\globals.sbr" \ "$(INTDIR)\hash.sbr" \ "$(INTDIR)\lex.sbr" \ "$(INTDIR)\main.sbr" \ "$(INTDIR)\misc.sbr" \ "$(INTDIR)\mrhoist.sbr" \ "$(INTDIR)\pred.sbr" \ "$(INTDIR)\scan.sbr" \ "$(INTDIR)\set.sbr" "$(OUTDIR)\AntlrMSVC50.bsc" : "$(OUTDIR)" $(BSC32_SBRS) $(BSC32) @<< $(BSC32_FLAGS) $(BSC32_SBRS) << LINK32=link.exe LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\ odbccp32.lib /nologo /subsystem:console /incremental:yes\ /pdb:"$(OUTDIR)\Antlr.pdb" /debug /machine:I386 /out:"$(OUTDIR)\Antlr.exe"\ /pdbtype:sept LINK32_OBJS= \ "$(INTDIR)\antlr.obj" \ "$(INTDIR)\bits.obj" \ "$(INTDIR)\build.obj" \ "$(INTDIR)\egman.obj" \ "$(INTDIR)\err.obj" \ "$(INTDIR)\fcache.obj" \ "$(INTDIR)\fset.obj" \ "$(INTDIR)\fset2.obj" \ "$(INTDIR)\gen.obj" \ "$(INTDIR)\globals.obj" \ "$(INTDIR)\hash.obj" \ "$(INTDIR)\lex.obj" \ "$(INTDIR)\main.obj" \ "$(INTDIR)\misc.obj" \ "$(INTDIR)\mrhoist.obj" \ "$(INTDIR)\pred.obj" \ "$(INTDIR)\scan.obj" \ "$(INTDIR)\set.obj" "$(OUTDIR)\Antlr.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << SOURCE=$(InputPath) PostBuild_Desc=Copy antlr to ..\bin DS_POSTBUILD_DEP=$(INTDIR)\postbld.dep ALL : $(DS_POSTBUILD_DEP) # Begin Custom Macros OutDir=.\. # End Custom Macros $(DS_POSTBUILD_DEP) : "tokens.h" "scan.c" "parser.dlg" "mode.h" "err.c"\ "antlr.c" "$(OUTDIR)\Antlr.exe" "$(OUTDIR)\AntlrMSVC50.bsc" mkdir ..\bin copy ..\bin\antlr.exe antlr_old.exe copy antlr.exe ..\bin\. echo Helper for Post-build step > "$(DS_POSTBUILD_DEP)" !ENDIF !IF "$(CFG)" == "ANTLR - Win32 Release" || "$(CFG)" == "ANTLR - Win32 Debug" SOURCE=.\antlr.c DEP_CPP_ANTLR=\ "..\h\antlr.h"\ "..\h\dlgdef.h"\ "..\h\pccts_stdio.h"\ "..\h\pccts_stdlib.h"\ "..\h\pccts_string.h"\ "..\h\pcctscfg.h"\ "..\support\set\set.h"\ ".\generic.h"\ ".\hash.h"\ ".\mode.h"\ ".\proto.h"\ ".\syn.h"\ ".\tokens.h"\ "$(INTDIR)\antlr.obj" "$(INTDIR)\antlr.sbr" : $(SOURCE) $(DEP_CPP_ANTLR)\ "$(INTDIR)" "$(INTDIR)\tokens.h" "$(INTDIR)\mode.h" SOURCE=.\antlr.g !IF "$(CFG)" == "ANTLR - Win32 Release" InputPath=.\antlr.g InputName=antlr "antlr.c" "err.c" "mode.h" "scan.c" "tokens.h" "parser.dlg" : $(SOURCE)\ "$(INTDIR)" "$(OUTDIR)" ../bin/antlr -gh $(InputName).g ../bin/dlg -C2 parser.dlg scan.c !ELSEIF "$(CFG)" == "ANTLR - Win32 Debug" InputPath=.\antlr.g InputName=antlr "antlr.c" "err.c" "mode.h" "scan.c" "tokens.h" "parser.dlg" : $(SOURCE)\ "$(INTDIR)" "$(OUTDIR)" ..\bin\antlr -gh $(InputName).g ..\bin\dlg -C2 parser.dlg scan.c !ENDIF SOURCE=.\bits.c DEP_CPP_BITS_=\ "..\h\dlgdef.h"\ "..\h\pccts_stdio.h"\ "..\h\pccts_stdlib.h"\ "..\h\pccts_string.h"\ "..\h\pcctscfg.h"\ "..\support\set\set.h"\ ".\generic.h"\ ".\hash.h"\ ".\proto.h"\ ".\syn.h"\ "$(INTDIR)\bits.obj" "$(INTDIR)\bits.sbr" : $(SOURCE) $(DEP_CPP_BITS_)\ "$(INTDIR)" SOURCE=.\build.c DEP_CPP_BUILD=\ "..\h\dlgdef.h"\ "..\h\pccts_stdio.h"\ "..\h\pccts_stdlib.h"\ "..\h\pccts_string.h"\ "..\h\pcctscfg.h"\ "..\support\set\set.h"\ ".\generic.h"\ ".\hash.h"\ ".\proto.h"\ ".\syn.h"\ "$(INTDIR)\build.obj" "$(INTDIR)\build.sbr" : $(SOURCE) $(DEP_CPP_BUILD)\ "$(INTDIR)" SOURCE=.\egman.c DEP_CPP_EGMAN=\ "..\h\pccts_stdio.h"\ "..\h\pccts_stdlib.h"\ "..\h\pccts_string.h"\ "..\h\pcctscfg.h"\ "..\support\set\set.h"\ ".\generic.h"\ ".\hash.h"\ ".\proto.h"\ ".\syn.h"\ "$(INTDIR)\egman.obj" "$(INTDIR)\egman.sbr" : $(SOURCE) $(DEP_CPP_EGMAN)\ "$(INTDIR)" SOURCE=.\err.c DEP_CPP_ERR_C=\ "..\h\antlr.h"\ "..\h\dlgdef.h"\ "..\h\err.h"\ "..\h\pccts_stdarg.h"\ "..\h\pccts_stdio.h"\ "..\h\pccts_stdlib.h"\ "..\h\pccts_string.h"\ "..\h\pcctscfg.h"\ "..\support\set\set.h"\ ".\generic.h"\ ".\hash.h"\ ".\proto.h"\ ".\syn.h"\ ".\tokens.h"\ !IF "$(CFG)" == "ANTLR - Win32 Release" CPP_SWITCHES=/nologo /ML /W3 /GX /O2 /I "." /I "..\h" /I "..\support\set" /D\ "NDEBUG" /D "LONGFILENAMES" /D "PC" /D "USER_ZZSYN" /D ZZLEXBUFSIZE=65536 /D\ "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\"\ /Fd"$(INTDIR)\\" /FD /c "$(INTDIR)\err.obj" "$(INTDIR)\err.sbr" : $(SOURCE) $(DEP_CPP_ERR_C)\ "$(INTDIR)" "$(INTDIR)\tokens.h" $(CPP) @<< $(CPP_SWITCHES) $(SOURCE) << !ELSEIF "$(CFG)" == "ANTLR - Win32 Debug" CPP_SWITCHES=/nologo /MLd /W3 /Gm /GX /Zi /Od /I "." /I "..\h" /I\ "..\support\set" /D "LONGFILENAMES" /D "PC" /D "USER_ZZSYN" /D\ ZZLEXBUFSIZE=65536 /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS"\ /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c "$(INTDIR)\err.obj" "$(INTDIR)\err.sbr" : $(SOURCE) $(DEP_CPP_ERR_C)\ "$(INTDIR)" "$(INTDIR)\tokens.h" $(CPP) @<< $(CPP_SWITCHES) $(SOURCE) << !ENDIF SOURCE=.\fcache.c DEP_CPP_FCACH=\ "..\h\pccts_stdio.h"\ "..\h\pccts_stdlib.h"\ "..\h\pccts_string.h"\ "..\h\pcctscfg.h"\ "..\support\set\set.h"\ ".\generic.h"\ ".\hash.h"\ ".\proto.h"\ ".\syn.h"\ "$(INTDIR)\fcache.obj" "$(INTDIR)\fcache.sbr" : $(SOURCE) $(DEP_CPP_FCACH)\ "$(INTDIR)" SOURCE=.\fset.c DEP_CPP_FSET_=\ "..\h\dlgdef.h"\ "..\h\pccts_stdio.h"\ "..\h\pccts_stdlib.h"\ "..\h\pccts_string.h"\ "..\h\pcctscfg.h"\ "..\support\set\set.h"\ ".\generic.h"\ ".\hash.h"\ ".\proto.h"\ ".\syn.h"\ "$(INTDIR)\fset.obj" "$(INTDIR)\fset.sbr" : $(SOURCE) $(DEP_CPP_FSET_)\ "$(INTDIR)" SOURCE=.\fset2.c DEP_CPP_FSET2=\ "..\h\dlgdef.h"\ "..\h\pccts_stdio.h"\ "..\h\pccts_stdlib.h"\ "..\h\pccts_string.h"\ "..\h\pcctscfg.h"\ "..\support\set\set.h"\ ".\generic.h"\ ".\hash.h"\ ".\proto.h"\ ".\syn.h"\ "$(INTDIR)\fset2.obj" "$(INTDIR)\fset2.sbr" : $(SOURCE) $(DEP_CPP_FSET2)\ "$(INTDIR)" SOURCE=.\gen.c DEP_CPP_GEN_C=\ "..\h\dlgdef.h"\ "..\h\pccts_stdio.h"\ "..\h\pccts_stdlib.h"\ "..\h\pccts_string.h"\ "..\h\pcctscfg.h"\ "..\support\set\set.h"\ ".\generic.h"\ ".\hash.h"\ ".\proto.h"\ ".\syn.h"\ "$(INTDIR)\gen.obj" "$(INTDIR)\gen.sbr" : $(SOURCE) $(DEP_CPP_GEN_C)\ "$(INTDIR)" SOURCE=.\globals.c DEP_CPP_GLOBA=\ "..\h\pccts_stdio.h"\ "..\h\pccts_stdlib.h"\ "..\h\pccts_string.h"\ "..\h\pcctscfg.h"\ "..\support\set\set.h"\ ".\generic.h"\ ".\hash.h"\ ".\proto.h"\ ".\syn.h"\ "$(INTDIR)\globals.obj" "$(INTDIR)\globals.sbr" : $(SOURCE) $(DEP_CPP_GLOBA)\ "$(INTDIR)" SOURCE=.\hash.c DEP_CPP_HASH_=\ "..\h\pccts_stdio.h"\ "..\h\pccts_stdlib.h"\ "..\h\pccts_string.h"\ "..\h\pcctscfg.h"\ ".\hash.h"\ "$(INTDIR)\hash.obj" "$(INTDIR)\hash.sbr" : $(SOURCE) $(DEP_CPP_HASH_)\ "$(INTDIR)" SOURCE=.\lex.c DEP_CPP_LEX_C=\ "..\h\pccts_stdio.h"\ "..\h\pccts_stdlib.h"\ "..\h\pccts_string.h"\ "..\h\pcctscfg.h"\ "..\support\set\set.h"\ ".\generic.h"\ ".\hash.h"\ ".\proto.h"\ ".\syn.h"\ "$(INTDIR)\lex.obj" "$(INTDIR)\lex.sbr" : $(SOURCE) $(DEP_CPP_LEX_C)\ "$(INTDIR)" SOURCE=.\main.c DEP_CPP_MAIN_=\ "..\h\antlr.h"\ "..\h\dlgdef.h"\ "..\h\pccts_stdio.h"\ "..\h\pccts_stdlib.h"\ "..\h\pccts_string.h"\ "..\h\pcctscfg.h"\ "..\support\set\set.h"\ ".\generic.h"\ ".\hash.h"\ ".\mode.h"\ ".\proto.h"\ ".\stdpccts.h"\ ".\syn.h"\ ".\tokens.h"\ "$(INTDIR)\main.obj" "$(INTDIR)\main.sbr" : $(SOURCE) $(DEP_CPP_MAIN_)\ "$(INTDIR)" "$(INTDIR)\tokens.h" "$(INTDIR)\mode.h" SOURCE=.\misc.c DEP_CPP_MISC_=\ "..\h\dlgdef.h"\ "..\h\pccts_stdio.h"\ "..\h\pccts_stdlib.h"\ "..\h\pccts_string.h"\ "..\h\pcctscfg.h"\ "..\support\set\set.h"\ ".\generic.h"\ ".\hash.h"\ ".\proto.h"\ ".\syn.h"\ "$(INTDIR)\misc.obj" "$(INTDIR)\misc.sbr" : $(SOURCE) $(DEP_CPP_MISC_)\ "$(INTDIR)" SOURCE=.\mrhoist.c DEP_CPP_MRHOI=\ "..\h\dlgdef.h"\ "..\h\pccts_stdio.h"\ "..\h\pccts_stdlib.h"\ "..\h\pccts_string.h"\ "..\h\pcctscfg.h"\ "..\support\set\set.h"\ ".\generic.h"\ ".\hash.h"\ ".\proto.h"\ ".\syn.h"\ "$(INTDIR)\mrhoist.obj" "$(INTDIR)\mrhoist.sbr" : $(SOURCE) $(DEP_CPP_MRHOI)\ "$(INTDIR)" SOURCE=.\pred.c DEP_CPP_PRED_=\ "..\h\dlgdef.h"\ "..\h\pccts_stdio.h"\ "..\h\pccts_stdlib.h"\ "..\h\pccts_string.h"\ "..\h\pcctscfg.h"\ "..\support\set\set.h"\ ".\generic.h"\ ".\hash.h"\ ".\proto.h"\ ".\syn.h"\ "$(INTDIR)\pred.obj" "$(INTDIR)\pred.sbr" : $(SOURCE) $(DEP_CPP_PRED_)\ "$(INTDIR)" SOURCE=.\scan.c DEP_CPP_SCAN_=\ "..\h\antlr.h"\ "..\h\dlgauto.h"\ "..\h\dlgdef.h"\ "..\h\pccts_stdio.h"\ "..\h\pccts_stdlib.h"\ "..\h\pccts_string.h"\ "..\h\pcctscfg.h"\ "..\support\set\set.h"\ ".\generic.h"\ ".\hash.h"\ ".\mode.h"\ ".\proto.h"\ ".\syn.h"\ ".\tokens.h"\ "$(INTDIR)\scan.obj" "$(INTDIR)\scan.sbr" : $(SOURCE) $(DEP_CPP_SCAN_)\ "$(INTDIR)" "$(INTDIR)\tokens.h" "$(INTDIR)\mode.h" SOURCE=..\support\set\set.c DEP_CPP_SET_C=\ "..\h\pccts_stdio.h"\ "..\h\pccts_stdlib.h"\ "..\h\pccts_string.h"\ "..\h\pcctscfg.h"\ "..\support\set\set.h"\ "$(INTDIR)\set.obj" "$(INTDIR)\set.sbr" : $(SOURCE) $(DEP_CPP_SET_C)\ "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF gtkwave-3.3.86/contrib/pccts/antlr/tokens.h0000664000175000017500000001162313166335473020157 0ustar bybellbybell#ifndef tokens_h #define tokens_h /* tokens.h -- List of labelled tokens and stuff * * Generated from: ./antlr.g * * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001 * Purdue University Electrical Engineering * ANTLR Version 1.33MR33 */ #define zzEOF_TOKEN 1 #define Eof 1 #define QuotedTerm 2 #define Action 34 #define Pred 35 #define PassAction 36 #define WildCard 87 #define LABEL 89 #define Pragma 92 #define FirstSetSymbol 93 #define NonTerminal 100 #define TokenTerm 101 #define ID 148 #define INT 150 #ifdef __USE_PROTOS void grammar(void); #else extern void grammar(); #endif #ifdef __USE_PROTOS void class_def(void); #else extern void class_def(); #endif #ifdef __USE_PROTOS void rule(void); #else extern void rule(); #endif #ifdef __USE_PROTOS void laction(void); #else extern void laction(); #endif #ifdef __USE_PROTOS void lmember(void); #else extern void lmember(); #endif #ifdef __USE_PROTOS void lprefix(void); #else extern void lprefix(); #endif #ifdef __USE_PROTOS void aPred(void); #else extern void aPred(); #endif #ifdef __USE_PROTOS extern Predicate * predOrExpr(void); #else extern Predicate * predOrExpr(); #endif #ifdef __USE_PROTOS extern Predicate * predAndExpr(void); #else extern Predicate * predAndExpr(); #endif #ifdef __USE_PROTOS extern Predicate * predPrimary(void); #else extern Predicate * predPrimary(); #endif #ifdef __USE_PROTOS void aLexclass(void); #else extern void aLexclass(); #endif #ifdef __USE_PROTOS void error(void); #else extern void error(); #endif #ifdef __USE_PROTOS void tclass(void); #else extern void tclass(); #endif #ifdef __USE_PROTOS void token(void); #else extern void token(); #endif #ifdef __USE_PROTOS void block(set * toksrefd,set * rulesrefd); #else extern void block(); #endif #ifdef __USE_PROTOS void alt(set * toksrefd,set * rulesrefd); #else extern void alt(); #endif #ifdef __USE_PROTOS extern LabelEntry * element_label(void); #else extern LabelEntry * element_label(); #endif #ifdef __USE_PROTOS extern Node * element(int old_not,int first_on_line,int use_def_MT_handler); #else extern Node * element(); #endif #ifdef __USE_PROTOS void default_exception_handler(void); #else extern void default_exception_handler(); #endif #ifdef __USE_PROTOS extern ExceptionGroup * exception_group(void); #else extern ExceptionGroup * exception_group(); #endif #ifdef __USE_PROTOS extern ExceptionHandler * exception_handler(void); #else extern ExceptionHandler * exception_handler(); #endif #ifdef __USE_PROTOS void enum_file(char * fname); #else extern void enum_file(); #endif #ifdef __USE_PROTOS void defines(char * fname); #else extern void defines(); #endif #ifdef __USE_PROTOS void enum_def(char * fname); #else extern void enum_def(); #endif #endif extern SetWordType zzerr1[]; extern SetWordType zzerr2[]; extern SetWordType zzerr3[]; extern SetWordType zzerr4[]; extern SetWordType setwd1[]; extern SetWordType zzerr5[]; extern SetWordType zzerr6[]; extern SetWordType zzerr7[]; extern SetWordType zzerr8[]; extern SetWordType zzerr9[]; extern SetWordType setwd2[]; extern SetWordType zzerr10[]; extern SetWordType zzerr11[]; extern SetWordType zzerr12[]; extern SetWordType zzerr13[]; extern SetWordType setwd3[]; extern SetWordType zzerr14[]; extern SetWordType zzerr15[]; extern SetWordType zzerr16[]; extern SetWordType zzerr17[]; extern SetWordType zzerr18[]; extern SetWordType zzerr19[]; extern SetWordType zzerr20[]; extern SetWordType zzerr21[]; extern SetWordType setwd4[]; extern SetWordType zzerr22[]; extern SetWordType zzerr23[]; extern SetWordType zzerr24[]; extern SetWordType zzerr25[]; extern SetWordType zzerr26[]; extern SetWordType setwd5[]; extern SetWordType zzerr27[]; extern SetWordType zzerr28[]; extern SetWordType zzerr29[]; extern SetWordType zzerr30[]; extern SetWordType zzerr31[]; extern SetWordType zzerr32[]; extern SetWordType zzerr33[]; extern SetWordType setwd6[]; extern SetWordType zzerr34[]; extern SetWordType zzerr35[]; extern SetWordType zzerr36[]; extern SetWordType zzerr37[]; extern SetWordType zzerr38[]; extern SetWordType zzerr39[]; extern SetWordType zzerr40[]; extern SetWordType zzerr41[]; extern SetWordType zzerr42[]; extern SetWordType setwd7[]; extern SetWordType zzerr43[]; extern SetWordType zzerr44[]; extern SetWordType zzerr45[]; extern SetWordType zzerr46[]; extern SetWordType zzerr47[]; extern SetWordType zzerr48[]; extern SetWordType zzerr49[]; extern SetWordType zzerr50[]; extern SetWordType zzerr51[]; extern SetWordType zzerr52[]; extern SetWordType zzerr53[]; extern SetWordType setwd8[]; extern SetWordType zzerr54[]; extern SetWordType zzerr55[]; extern SetWordType zzerr56[]; extern SetWordType zzerr57[]; extern SetWordType setwd9[]; extern SetWordType zzerr58[]; extern SetWordType zzerr59[]; extern SetWordType zzerr60[]; extern SetWordType zzerr61[]; extern SetWordType zzerr62[]; extern SetWordType zzerr63[]; extern SetWordType zzerr64[]; extern SetWordType zzerr65[]; extern SetWordType setwd10[]; extern SetWordType setwd11[]; gtkwave-3.3.86/contrib/pccts/antlr/gen.c0000664000175000017500000041103613166335473017422 0ustar bybellbybell/* * gen.c * * Generate C code (ANSI, K&R, C++) * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * ANTLR 1.33 * Terence Parr * Parr Research Corporation * with Purdue University and AHPCRC, University of Minnesota * 1989-2001 */ #include #include #include #include "pcctscfg.h" #include "set.h" #include "syn.h" #include "hash.h" #include "generic.h" #include "dlgdef.h" /* OSX warning fix */ #define GR_INT int #define NumExprPerLine 4 static int on1line=0; static set tokensRefdInBlock; /* T r a n s l a t i o n T a b l e s */ /* C_Trans[node type] == pointer to function that knows how to translate that node. */ #ifdef __cplusplus void (*C_Trans[NumNodeTypes+1])(...) = { NULL, NULL, /* See next table. Junctions have many types */ (void (*)(...)) genRuleRef, (void (*)(...)) genToken, (void (*)(...)) genAction }; #else void (*C_Trans[NumNodeTypes+1])() = { NULL, NULL, /* See next table. Junctions have many types */ genRuleRef, genToken, genAction }; #endif /* C_JTrans[Junction type] == pointer to function that knows how to translate that * kind of junction node. */ #ifdef __cplusplus void (*C_JTrans[NumJuncTypes+1])(...) = { NULL, (void (*)(...)) genSubBlk, (void (*)(...)) genOptBlk, (void (*)(...)) genLoopBlk, (void (*)(...)) genEndBlk, (void (*)(...)) genRule, (void (*)(...)) genJunction, (void (*)(...)) genEndRule, (void (*)(...)) genPlusBlk, (void (*)(...)) genLoopBegin }; #else void (*C_JTrans[NumJuncTypes+1])() = { NULL, genSubBlk, genOptBlk, genLoopBlk, genEndBlk, genRule, genJunction, genEndRule, genPlusBlk, genLoopBegin }; #endif #define PastWhiteSpace(s) while (*(s) == ' ' || *(s) == '\t') {s++;} static int tabs = 0; /* MR6 Got tired of text running off page when using standard tab stops */ #define TAB { int i; \ if (TabWidth==0) { \ for (i=0; irname);} else gen1("zzTRACEOUT((ANTLRChar *)\"%s\");\n", q->rname); } } static void #ifdef __USE_PROTOS warn_about_using_gk_option(void) #else warn_about_using_gk_option() #endif { static int warned_already=0; if ( !DemandLookahead || warned_already ) return; warned_already = 1; warnNoFL("-gk option could cause trouble for <<...>>? predicates"); } void #ifdef __USE_PROTOS freeBlkFsets( Junction *q ) #else freeBlkFsets( q ) Junction *q; #endif { int i; Junction *alt; require(q!=NULL, "freeBlkFsets: invalid node"); for (alt=q; alt != NULL; alt= (Junction *) alt->p2 ) { for (i=1; i<=CLL_k; i++) set_free(alt->fset[i]); } } /* * Generate a local variable allocation for each token references * in this block. */ static void #ifdef __USE_PROTOS genTokenPointers( Junction *q ) #else genTokenPointers( q ) Junction *q; #endif { /* Rule refs are counted and can be referenced, but their * value is not set to anything useful ever. * * The ptrs are to be named _tij where i is the current level * and j is the element number within an alternative. */ int first=1, t=0; set a; tokensRefdInBlock = q->tokrefs; if ( set_deg(q->tokrefs) == 0 ) return; a = set_dup(q->tokrefs); gen("ANTLRTokenPtr "); for (; !set_nil(a); set_rm(t, a)) { t = set_int(a); if ( first ) first = 0; else _gen(","); if ( !DontCopyTokens ) _gen2("_tv%d%d,", BlkLevel, t); _gen2("_t%d%d", BlkLevel, t); if ( !DontCopyTokens ) {_gen2("= &_tv%d%d", BlkLevel, t);} else _gen("=NULL"); } _gen(";\n"); set_free(a); } static int #ifdef __USE_PROTOS hasDefaultException(ExceptionGroup *eg) #else hasDefaultException(eg) ExceptionGroup *eg; #endif { ListNode *q; for (q = eg->handlers->next; q!=NULL; q=q->next) { ExceptionHandler *eh = (ExceptionHandler *)q->elem; if ( strcmp("default", eh->signalname)==0 ) { return 1; } } return 0; } static void #ifdef __USE_PROTOS dumpException(ExceptionGroup *eg, int no_default_case) #else dumpException(eg, no_default_case) ExceptionGroup *eg; int no_default_case; #endif { char *outerLabel; /* MR7 */ int altHandler=0; /* MR7 */ int namedHandler=0; /* MR7 */ outerLabel=findOuterHandlerLabel(eg); /* MR7 */ if (eg->label != NULL) { /* MR7 */ namedHandler=1; /* MR7 */ } else if (eg->forRule) { /* MR7 */ /* nothing */ /* MR20 */ } else { /* MR7 */ altHandler=1; /* MR7 */ }; /* MR7 */ #if 0 ** if (! eg->used) { /* MR7 */ ** warnFL("exception group never used", /* MR7 */ ** FileStr[eg->altstart->file],eg->altstart->line); /* MR7 */ ** }; /* MR7 */ #endif if (namedHandler) { /* MR7 */ gen1("switch ( _signal ) { /* [%s] */\n",eg->label); /* MR7 */ } else { /* MR7 */ gen("switch ( _signal ) {\n"); /* MR7 */ gen("case NoSignal: break; /* MR7 */\n"); /* MR7 */ }; /* MR7 */ { ListNode *q; for (q = eg->handlers->next; q!=NULL; q=q->next) { ExceptionHandler *eh = (ExceptionHandler *)q->elem; if ( strcmp("default", eh->signalname)==0 ) { gen("default :\n"); tabs++; dumpAction(eh->action, output, tabs, -1, 1, 1); gen("_signal=NoSignal; /* MR7 */\n"); /* MR7 */ gen("break; /* MR7 */\n"); /* MR7 */ tabs--; gen("}\n"); /* copied from later code in dumpException */ /* MR7 */ if (namedHandler) { /* MR7 */ gen("if (_signal != NoSignal)"); /* MR7 */ _gen1(" goto %s_handler; /* MR7 */\n",outerLabel);/* MR7 */ } else if (altHandler) { /* MR7 */ gen1("goto %s_handler; /* MR7 */\n",outerLabel); /* MR7 */ }; return; } gen1("case %s :\n", eh->signalname); tabs++; if ( eh->action != NULL ) { dumpAction(eh->action, output, tabs, -1, 1, 1); gen("break; /* MR7 */\n"); /* MR7 */ } tabs--; } } if ( no_default_case ) return; gen("default :\n"); tabs++; /* MR7 */ gen("break; /* MR7 */\n"); /* MR7 */ tabs--; /* MR7 */ tabs++; /***** gen("*_retsignal = _signal;\n"); *****/ tabs--; gen("}\n"); if (namedHandler) { /* MR7 */ gen("if (_signal != NoSignal)"); /* MR7 */ _gen1(" goto %s_handler; /* MR7 */\n",outerLabel); /* MR7 */ } else if (altHandler) { /* MR7 */ gen1("goto %s_handler; /* MR7 */\n",outerLabel); /* MR7 */ }; } static void #ifdef __USE_PROTOS dumpExceptions(ListNode *list) #else dumpExceptions(list) ListNode *list; #endif { ListNode *p; for (p = list->next; p!=NULL; p=p->next) { ExceptionGroup *eg = (ExceptionGroup *) p->elem; _gen2("%s%s_handler:\n", eg->label==NULL?"":eg->label, eg->altID==NULL?"":eg->altID); if ( eg->altID!=NULL ) dumpException(eg, 0); else { /* This must be the rule exception handler */ dumpException(eg, 1); if ( !hasDefaultException(eg) ) { gen("default :\n"); tabs++; gen("zzdflthandlers(_signal,_retsignal);\n"); tabs--; gen("}\n"); } } } } /* For each element label that is found in a rule, generate a unique * Attribute (and AST pointer if GenAST) variable. */ void #ifdef __USE_PROTOS genElementLabels(ListNode *list) #else genElementLabels(list) ListNode *list; #endif { int first=1; ListNode *p; if ( GenCC ) {gen("ANTLRTokenPtr");} else {gen("Attrib");} for (p = list->next; p!=NULL; p=p->next) { char *ep = (char *)p->elem; if ( first ) first = 0; else _gen(","); if ( GenCC ) {_gen1(" %s=NULL",ep);} else {_gen1(" %s",ep);} } _gen(";\n"); if ( !GenAST ) return; first = 1; gen("AST"); for (p = list->next; p!=NULL; p=p->next) { char *ep = (char *)p->elem; if ( first ) first = 0; else _gen(","); _gen1(" *%s_ast=NULL",ep); } _gen(";\n"); } /* * Generate a local variable allocation for each token or rule reference * in this block. */ static void #ifdef __USE_PROTOS genASTPointers( Junction *q ) #else genASTPointers( q ) Junction *q; #endif { int first=1, t; set a; a = set_or(q->tokrefs, q->rulerefs); if ( set_deg(a) > 0 ) { gen("AST "); for (; !set_nil(a); set_rm(t, a)) { t = set_int(a); if ( first ) first = 0; else _gen(","); _gen2("*_ast%d%d=NULL", BlkLevel, t); } set_free(a); } _gen(";\n"); } static void #ifdef __USE_PROTOS BLOCK_Head( void ) #else BLOCK_Head( ) #endif { gen("{\n"); tabs++; if ( !GenCC ) gen1("zzBLOCK(zztasp%d);\n", BlkLevel); } static void #ifdef __USE_PROTOS BLOCK_Tail( void ) #else BLOCK_Tail( ) #endif { if ( !GenCC ) gen1("zzEXIT(zztasp%d);\n", BlkLevel); if ( !GenCC ) gen("}\n"); tabs--; gen("}\n"); } static void #ifdef __USE_PROTOS BLOCK_Preamble( Junction *q ) #else BLOCK_Preamble( q ) Junction *q; #endif { ActionNode *a; Junction *begin; BLOCK_Head(); if ( GenCC ) genTokenPointers(q); if ( GenCC&&GenAST ) genASTPointers(q); if ( q->jtype == aPlusBlk ) gen("int zzcnt=1;\n"); if ( q->parm != NULL && !q->predparm ) gen1("zzaPush(%s);\n", q->parm) else if ( !GenCC ) gen("zzMake0;\n"); if ( !GenCC ) gen("{\n"); if ( q->jtype == aLoopBegin ) begin = (Junction *) ((Junction *)q->p1); else begin = q; if ( has_guess_block_as_first_item(begin) ) { gen("zzGUESS_BLOCK\n"); } if ( q->jtype == aLoopBegin ) a = findImmedAction( ((Junction *)q->p1)->p1 ); /* look at aLoopBlk */ else a = findImmedAction( q->p1 ); if ( a!=NULL && !a->is_predicate) { /* MR21 */ if (!a->noHoist) dumpActionPlus(a, a->action, output, tabs, a->file, a->line, 1); a->done = 1; /* remove action. We have already handled it */ } } void #ifdef __USE_PROTOS genCombinedPredTreeContextOrig( Predicate *p ) #else genCombinedPredTreeContextOrig( p ) Predicate *p; #endif { static set *ctx=NULL; /* genExprSets() is destructive, make copy*/ require(p!=NULL, "can't make context tree for NULL pred tree"); #ifdef DBG_PRED fprintf(stderr, "enter genCombinedPredTreeContextOrig(%s,0x%x) with sets:\n", p->expr, p); s_fprT(stderr, p->scontext[1]); fprintf(stderr, "\n"); #endif if ( p->down == NULL ) { /*** if ( p->k>1 && p->tcontext!=NULL ) ***/ if ( p->tcontext!=NULL ) { _gen("("); genExprTree(p->tcontext, 1); _gen(")"); } /*** else if ( p->k==1 && set_deg(p->scontext[1])>0 ) ***/ else if ( set_deg(p->scontext[1])>0 ) { if ( ctx==NULL ) ctx = (set *)calloc(CLL_k+1, sizeof(set)); require(ctx!=NULL, "ctx cannot allocate"); ctx[0]=empty; ctx[1]=set_dup(p->scontext[1]); _gen("("); genExprSets(&(ctx[0]), p->k); _gen(")"); set_free(ctx[1]); } else if ( p->expr==PRED_AND_LIST || p->expr==PRED_OR_LIST ) { fatal_internal("pred tree is orphan OR or AND list"); } else { if (! HoistPredicateContext) { _gen(" 1 /* no context: prc is off */ "); } else { fatal_internal("pred tree context is empty"); }; } return; } /* MR10 - make AND just like OR */ if ( p->expr == PRED_AND_LIST ) { Predicate *list = p->down; for (; list!=NULL; list=list->right) { genCombinedPredTreeContextOrig(list); if ( list->right!=NULL ) _gen("|| /* MR10 was wrong */ "); }; return; } if ( p->expr == PRED_OR_LIST ) { Predicate *list = p->down; for (; list!=NULL; list=list->right) { genCombinedPredTreeContextOrig(list); if ( list->right!=NULL ) _gen("||"); }; return; }; fatal("pred tree is really wacked"); } /* [genCombinedPredTreeContext] */ void #ifdef __USE_PROTOS genCombinedPredTreeContext( Predicate *p ) #else genCombinedPredTreeContext( p ) Predicate *p; #endif { Tree *t; int predDepth=0; if (0 && ! MR_usingPredNames && ! MRhoisting) { genCombinedPredTreeContextOrig(p); } else { /* MR13 */ MR_pred_depth(p,&predDepth); /* MR13 */ if (predDepth == 1) { /* MR13 */ /* MR13 */ set scontext[2]; /* MR13 */ scontext[0]=empty; /* MR13 */ scontext[1]=MR_compute_pred_set(p); /* MR13 */ if (set_nil(scontext[1])) { /* MR13 */ _gen(" 1 /* MR12 no context (-prc off) */ "); /* MR13 */ } else { /* MR13 */ _gen("("); /* MR13 */ genExprSets(&scontext[0], 1); /* MR13 */ set_free(scontext[1]); /* MR13 */ _gen(")"); /* MR13 */ }; } else { t=MR_compute_pred_tree_context(p); if (t == NULL) { _gen(" 1 /* MR12 no context (-prc off) */ "); } else { _gen("("); genExprTree(t, 1); Tfree(t); /* MR10 */ _gen(")"); }; }; }; } /* [genPredTreeGate] */ void #ifdef __USE_PROTOS genPredTreeGate( Predicate *p, int in_and_expr ) #else genPredTreeGate( p, in_and_expr ) Predicate *p; int in_and_expr; #endif { if ( in_and_expr ) { _gen("!("); genCombinedPredTreeContext(p); _gen(")||"); if ( p->down!=NULL ) _gen("\n"); } else { _gen("("); genCombinedPredTreeContext(p); _gen(")&&"); if ( p->down!=NULL ) _gen("\n"); } } #ifdef __USE_PROTOS void genPredEntry(Predicate *p,int outer) #else void genPredEntry(p,outer) Predicate *p; int outer; #endif { int inverted=0; Predicate *q; int localOuter=outer; int needRP=0; if (p == NULL) return; if (p->predEntry != NULL && p->predEntry->predLiteral != NULL) { if (p->inverted != p->predEntry->pred->inverted) { _gen("! /* inverted pred */ ("); needRP=1; } else { if (!localOuter) _gen("("); needRP=1; }; dumpAction(p->predEntry->predLiteral,output,0,p->source->file,p->source->line,0); if (needRP) _gen(")"); return; }; inverted=p->inverted; if (inverted) { _gen(" ! /* inverted pred */ ("); localOuter=1; }; if (p->expr == PRED_OR_LIST) { if (!localOuter) _gen("("); for (q=p->down; q != NULL ; q=q->right) { genPredEntry(q,0); if (q->right != NULL) _gen(" || "); }; if (!localOuter) _gen(")"); } else if (p->expr == PRED_AND_LIST) { if (!localOuter) _gen("("); for (q=p->down; q != NULL ; q=q->right) { genPredEntry(q,0); if (q->right != NULL) _gen(" && "); }; if (!localOuter) _gen(")"); } else { if (!localOuter) _gen("("); require (p->source != NULL,"predEntry->source == NULL"); require (p->source->inverted == 0,"dumpPredEntry p->source->inverted != 0"); dumpAction(p->source->action,output,0,p->source->file,p->source->line,0); if (!localOuter) _gen(")"); }; if (inverted) { _gen(")"); } } void #ifdef __USE_PROTOS dumpPredAction(ActionNode *anode, char *s,FILE *output,int tabs,int file,int line,int final_newline) #else dumpPredAction(anode, s,output,tabs,file,line,final_newline) ActionNode *anode; char *s; FILE *output; int tabs; int file; int line; int final_newline; #endif { PredEntry *predEntry=anode->predEntry; int inverted=anode->inverted; Predicate *workPred; if (predEntry == NULL) { /* inline predicate literal */ require(inverted == 0,"dumpPredAction action->inverted"); dumpAction(s,output,tabs,file,line,final_newline); } else { /* a reference to a predicate - possibly with an inverted source */ if (predEntry->predLiteral != NULL) { if (inverted) _gen("! /* inverted pred */ ("); dumpAction(predEntry->predLiteral,output,0,anode->file,anode->line,0); if (inverted) _gen(")"); } else { workPred=predicate_dup(predEntry->pred); if (inverted) workPred->inverted=!workPred->inverted; genPredEntry(workPred,1); predicate_free(workPred); }; }; } /* [genPred] */ void #ifdef __USE_PROTOS genPred(Predicate *p, Node *j,int suppress_sva) #else genPred(p,j,suppress_sva) Predicate *p; Node *j; int suppress_sva; #endif { if ( FoundException && !suppress_sva) {_gen("(_sva=(");} /* MR11 suppress_sva */ else {_gen("(");} if ( GenLineInfo && j->file != -1 ) _gen("\n"); if (p->source != NULL && p->source->ampersandPred != NULL) { if (p->source->ampersandPred->k == 1) { set ctx[2]; ctx[0]=empty; ctx[1]=set_dup(p->source->ampersandPred->scontext[1]); _gen("("); genExprSets(&(ctx[0]), p->k); _gen(") && "); set_free(ctx[1]); } else { _gen("( "); genExprTree(p->source->ampersandPred->tcontext,1); _gen(" ) && "); }; }; dumpPredAction((ActionNode *)p->source, p->expr, output, 0, -1 /*indicates no line info*/, j->line, 0); if ( FoundException && !suppress_sva) /* MR11 suppress_sva */ {_gen("),_sva)");} /* MR10 - get red of "meant ==" messages */ else {_gen(")");} } void #ifdef __USE_PROTOS MR_distinctORcontextOpt(Predicate *p,Node *j,int in_and_expr) #else MR_distinctORcontextOpt(p,j,in_and_expr) Predicate *p; Node *j; int in_and_expr; #endif { Predicate *q; _gen(" /* MR10 Distinct OR context optimization */ \n"); if (in_and_expr) { gen("zzpf=0,\n"); for (q=p->down; q != NULL; q=q->right) { gen("( "); genCombinedPredTreeContext(q); _gen(" && (zzpf=1, "); genPred(q,j,0); _gen(" )) ||\n"); }; gen("!zzpf)"); } else { require (0, "MR_distinctORcontextOpt: can't get here when using MR_predSimplify"); #if 0 ** for (q=p->down; q != NULL; q=q->right) { ** gen("( "); ** genCombinedPredTreeContext(q); ** _gen(" && "); ** genPred(q,j); ** if (q->right != NULL) { ** _gen(" ) ||\n"); ** }; ** }; ** gen(")"); #endif }; } void #ifdef __USE_PROTOS genPredTreeOrig( Predicate *p, Node *j, int in_and_expr ) #else genPredTreeOrig( p, j, in_and_expr ) Predicate *p; Node *j; int in_and_expr; #endif { /* MR10 */ int allHaveContext=1; /* MR10 */ int noneHaveContext=1; /* MR10 */ MR_predContextPresent(p,&allHaveContext,&noneHaveContext); if ( ! noneHaveContext ) /* MR10 context guards ignored when -prc off */ { _gen("("); genPredTreeGate(p, in_and_expr); } /* if leaf node, just gen predicate */ if ( p->down==NULL ) { genPred(p,j,0); if ( ! noneHaveContext ) _gen(")"); /* MR10 context guards ignored when -prc off */ return; } /* if AND list, do both preds (only two possible) */ if ( p->expr == PRED_AND_LIST ) { #if 0 ** _gen("("); ** genPredTreeOrig(p->down, j, 1); ** _gen("&&"); ** genPredTreeOrig(p->down->right, j, 1); ** _gen(")"); ** if ( ! noneHaveContext ) _gen(")"); /* MR10 context guards ignored when -prc off */ ** return; #endif /* MR11 - make it work with AND with more than two children - like OR */ Predicate *list; _gen("("); list = p->down; for (; list!=NULL; list=list->right) { genPredTreeOrig(list, j, 1); if ( list->right!=NULL ) _gen("&&"); } _gen(")"); if ( ! noneHaveContext ) _gen(")"); /* MR10 context guards ignored when -prc off */ return; }; if ( p->expr == PRED_OR_LIST ) { Predicate *list; _gen("("); list = p->down; for (; list!=NULL; list=list->right) { genPredTreeOrig(list, j, 0); if ( list->right!=NULL ) _gen("||"); } _gen(")"); if ( ! noneHaveContext ) _gen(")"); /* MR10 context guards ignored when -prc off */ return; } fatal_internal("genPredTreeOrig: predicate tree is wacked"); } #if 0 ** Predicate member dummyPredDepth is no longer used in MR10 ** but we might need it again in the future ** ** if (MRhoisting) { ** if ( !noneHaveContext && ** ! in_and_expr && ** p->source != NULL && ** p->source->dummyPredicateDepth > 0 && ** p->down == NULL) { ** _gen("("); ** genCombinedPredTreeContext(p); ** _gen(" )\n"); ** return; ** }; ** }; #endif /* [genPredTree] */ /* in_and_expr what to do if the context is wrong what to do if the context is correct but the predicate is false remember: if the context is wrong it's the same as if the predicate is true as far as enabling an alternative Consider (AND p q r) if in an ... && ... expression then you don't want the entire predicate chain to fail just because the context for one component is wrong: so return true Consider (OR p q r) if in an ... || ... expression then you don't want the entire predicate chain to succeed just because the context for one component is correct when the corresponding test is false: so return false when the context is correct but the test is false. */ void #ifdef __USE_PROTOS genPredTree( Predicate *p, Node *j, int in_and_expr, int suppress_sva ) #else genPredTree( p, j, in_and_expr, suppress_sva) Predicate *p; Node *j; int in_and_expr; int suppress_sva; #endif { int allHaveContext=1; int noneHaveContext=1; Tree *groupTree; Tree *oneTree; Predicate *q; int identicalORcontextOptimization=0; int identicalANDcontextOptimization=0; if (0 && !MR_usingPredNames && !MRhoisting) { genPredTreeOrig(p,j,in_and_expr); return; }; MR_predContextPresent(p,&allHaveContext,&noneHaveContext); if ( ! noneHaveContext ) { /* MR10 context guards ignored when -prc off */ _gen("("); /* MR10 optimize OR predicates which are all leaves */ if (p->expr == PRED_OR_LIST && MR_allPredLeaves(p->down)) { groupTree=MR_compute_pred_tree_context(p); for (q=p->down ; q != NULL ; q=q->right) { oneTree=MR_compute_pred_tree_context(q); if (! MR_tree_equ(groupTree,oneTree)) { Tfree(oneTree); break; }; Tfree(oneTree); }; Tfree(groupTree); if (q == NULL) { _gen("/* MR10 individual OR gates suppressed when all predicates are leaves"); _gen(" with identical context */\n"); genPredTreeGate(p,in_and_expr); /* use the parent's in_and_expr for this gate */ identicalORcontextOptimization=1; } else { MR_distinctORcontextOpt(p,j,in_and_expr); return; }; } else if (p->expr == PRED_AND_LIST && MR_allPredLeaves(p->down)) { /* MR12 optimize AND predicates which are all leaves */ groupTree=MR_compute_pred_tree_context(p); for (q=p->down ; q != NULL ; q=q->right) { oneTree=MR_compute_pred_tree_context(q); if (! MR_tree_equ(groupTree,oneTree)) { Tfree(oneTree); break; }; Tfree(oneTree); }; Tfree(groupTree); if (q == NULL) { _gen("/* MR12 individual AND gates suppressed when all predicates are leaves"); _gen(" with identical context */\n"); genPredTreeGate(p,in_and_expr); /* use the parent's in_and_expr for this gate */ identicalANDcontextOptimization=1; } else { genPredTreeGate(p, in_and_expr); }; } else { genPredTreeGate(p, in_and_expr); }; } /* if leaf node, just gen predicate */ if ( p->down==NULL ) { genPred(p,j,suppress_sva); if ( ! noneHaveContext ) _gen(")"); /* MR10 context guards ignored when -prc off */ return; } /* if AND list, do both preds (only two possible) */ /* MR10 not any more ! */ if ( p->expr == PRED_AND_LIST ) { Predicate *list; _gen("("); list = p->down; for (; list != NULL; list=list->right) { if (identicalANDcontextOptimization) { genPred(list, j,suppress_sva); } else { genPredTree(list, j, 1, suppress_sva); /* in and context */ }; if ( list->right!=NULL ) _gen("&&"); }; _gen(")"); if ( ! noneHaveContext ) _gen(")"); /* MR10 context guards ignored when -prc off */ return; } if ( p->expr == PRED_OR_LIST ) { Predicate *list; _gen("("); list = p->down; for (; list!=NULL; list=list->right) { if (identicalORcontextOptimization) { genPred(list, j,suppress_sva); } else { genPredTree(list, j, 0, suppress_sva); }; if ( list->right!=NULL ) _gen("||"); } _gen(")"); if ( ! noneHaveContext ) _gen(")"); /* MR10 context guards ignored when -prc off */ return; } fatal_internal("predicate tree is wacked"); } /* [genPredTreeMainXX] */ Predicate * /* MR10 */ #ifdef __USE_PROTOS genPredTreeMainXX( Predicate *p, Node *j ,int in_and_expr) #else genPredTreeMainXX( p, j ,in_and_expr) Predicate *p; Node *j; int in_and_expr; #endif { int allHaveContext=1; int noneHaveContext=1; #if 0 fprintf(stderr,"Pred before\n"); dumppred(p); fprintf(stderr,"\n"); fprintf(stderr,"Pred after\n"); dumppred(p); fprintf(stderr,"\n"); #endif p=MR_predSimplifyALL(p); /* MR10 */ require (MR_predicate_context_completed(p),"predicate context is not complete"); MR_cleanup_pred_trees(p); /* MR10 */ MR_predContextPresent(p,&allHaveContext,&noneHaveContext); if (!noneHaveContext & !allHaveContext) { warnFL("predicate contains elements both with and without context", FileStr[j->file],j->line); }; if (InfoP) { _gen("\n#if 0\n\n"); MR_dumpPred(p,1); _gen("#endif\n"); }; genPredTree(p,j,in_and_expr,0); return p; } Predicate * /* MR10 */ #ifdef __USE_PROTOS genPredTreeMain( Predicate *p, Node *j) #else genPredTreeMain( p, j) Predicate *p; Node *j; #endif { return genPredTreeMainXX(p,j,1); } static void #ifdef __USE_PROTOS genExprTreeOriginal( Tree *t, int k ) #else genExprTreeOriginal( t, k ) Tree *t; int k; #endif { require(t!=NULL, "genExprTreeOriginal: NULL tree"); if ( t->token == ALT ) { _gen("("); genExprTreeOriginal(t->down, k); _gen(")"); if ( t->right!=NULL ) { _gen("||"); on1line++; if ( on1line > NumExprPerLine ) { on1line=0; _gen("\n"); } _gen("("); genExprTreeOriginal(t->right, k); _gen(")"); } return; } if ( t->down!=NULL ) _gen("("); _gen1("LA(%d)==",k); if ( TokenString(t->token) == NULL ) _gen1("%d", t->token) else _gen1("%s", TokenString(t->token)); if ( t->down!=NULL ) { _gen("&&"); on1line++; if ( on1line > NumExprPerLine ) { on1line=0; _gen("\n"); } _gen("("); genExprTreeOriginal(t->down, k+1); _gen(")"); } if ( t->down!=NULL ) _gen(")"); if ( t->right!=NULL ) { _gen("||"); on1line++; if ( on1line > NumExprPerLine ) { on1line=0; _gen("\n"); } _gen("("); genExprTreeOriginal(t->right, k); _gen(")"); } } #ifdef __USE_PROTOS static void MR_LAtokenString(int k,int token) #else static void MR_LAtokenString(k,token) int k; int token; #endif { char *ts; ts=TokenString(token); if (ts == NULL) { _gen2(" LA(%d)==%d",k,token); } else { _gen2(" LA(%d)==%s",k,ts); }; } #ifdef __USE_PROTOS static int MR_countLeaves(Tree *t) #else static int MR_countLeaves(t) Tree *t; #endif { if (t == NULL) return 0; if (t->token == ALT) { return MR_countLeaves(t->down)+MR_countLeaves(t->right); } else { return 1+MR_countLeaves(t->down)+MR_countLeaves(t->right); }; } #ifdef __USE_PROTOS static void MR_genOneLine(Tree *tree,int k) #else static void MR_genOneLine(tree,k) Tree *tree; int k; #endif { if (tree == NULL) return; if (tree->token == ALT) { MR_genOneLine(tree->down,k); } else { MR_LAtokenString(k,tree->token); if (tree->down != NULL && tree->down->right == NULL) { _gen(" &&"); MR_genOneLine(tree->down,k+1); } else if (tree->down != NULL) { _gen(" && ("); MR_genOneLine(tree->down,k+1); _gen(")"); }; }; if (tree->right != NULL) { _gen(" ||"); MR_genOneLine(tree->right,k); }; } static int across; static int depth; static int lastkonline; #ifdef __USE_PROTOS static void MR_genMultiLine(Tree *tree,int k) #else static void MR_genMultiLine(tree,k) Tree *tree; int k; #endif { int i; if (tree == NULL) return; if (tree->token == ALT) { MR_genMultiLine(tree,k); } else { MR_LAtokenString(k,tree->token); lastkonline=k; across++; if (tree->down != NULL && tree->down->right == NULL) { if (across > 3) { _gen("\n"); across=0; lastkonline=0; for (i=0 ; i < depth+k ; i++) _gen(" "); _gen("&&"); } else { _gen(" &&"); }; MR_genMultiLine(tree->down,k+1); } else if (tree->down != NULL) { _gen("\n"); lastkonline=0; across=0; for (i=0 ; i < depth+k ; i++) _gen(" "); _gen("&& ("); MR_genMultiLine(tree->down,k+1); _gen(")"); }; }; if (tree->right != NULL) { if (k < lastkonline) { _gen("\n"); across=0; lastkonline=0; for (i=0; i < depth+k-1 ; i++) _gen(" "); _gen("||"); } else if (across > 3 ) { _gen("\n"); across=0; lastkonline=0; for (i=0; i < depth+k ; i++) _gen(" "); _gen("||"); } else { _gen(" ||"); }; MR_genMultiLine(tree->right,k); }; } #ifdef __USE_PROTOS static void genExprTree(Tree *tree,int k) #else static void genExprTree(tree,k) Tree *tree; int k; #endif { int count; #if 0 /* MR20 THM This was probably an error. The routine should probably reference that static "across" and this declaration hides it. */ int across; #endif require (tree != NULL,"genExprTree: tree is NULL"); require (k > 0,"genExprTree: k <= 0"); if (0 && !MRhoisting) { /* MR11 make new version standard */ genExprTreeOriginal(tree,k); } else { count=MR_countLeaves(tree); if (count < 5) { MR_genOneLine(tree,k); } else { _gen("\n"); across=0; depth=0; lastkonline=0; MR_genMultiLine(tree,k); _gen("\n"); }; }; } /* * Generate LL(k) type expressions of the form: * * (LA(1) == T1 || LA(1) == T2 || ... || LA(1) == Tn) && * (LA(2) == T1 || LA(2) == T2 || ... || LA(2) == Tn) && * ..... * (LA(k) == T1 || LA(k) == T2 || ... || LA(k) == Tn) * * If GenExprSetsOpt generate: * * (setwdi[LA(1)]&(1<= 1. * * This routine is visible only to this file and cannot answer a TRANS message. * */ /* [genExpr] */ static int #ifdef __USE_PROTOS genExpr( Junction *j ) #else genExpr( j ) Junction *j; #endif { int max_k; /* if full LL(k) is sufficient, then don't use approximate (-ck) lookahead * from CLL_k..LL_k */ { int limit; if ( j->ftree!=NULL ) limit = LL_k; else limit = CLL_k; max_k = genExprSets(j->fset, limit); } /* Do tests for real tuples from other productions that conflict with * artificial tuples generated by compression (using sets of tokens * rather than k-trees). */ if ( j->ftree != NULL ) { _gen(" && !("); genExprTree(j->ftree, 1); _gen(")"); } if ( ParseWithPredicates && j->predicate!=NULL ) { Predicate *p = j->predicate; warn_about_using_gk_option(); _gen("&&"); j->predicate=genPredTreeMain(p, (Node *)j); /* MR10 */ } return max_k; } static int #ifdef __USE_PROTOS genExprSets( set *fset, int limit ) #else genExprSets( fset, limit ) set *fset; int limit; #endif { int k = 1; int max_k = 0; unsigned *e, *g, firstTime=1; if (set_nil(fset[1])) { _gen(" 0 /* MR13 empty set expression - undefined rule ? infinite left recursion ? */ "); MR_BadExprSets++; }; if ( GenExprSetsOpt ) { while ( k <= limit && !set_nil(fset[k]) ) /* MR11 */ { if ( set_deg(fset[k])==1 ) /* too simple for a set? */ { int e; _gen1("(LA(%d)==",k); e = set_int(fset[k]); if ( TokenString(e) == NULL ) _gen1("%d)", e) else _gen1("%s)", TokenString(e)); } else { NewSet(); FillSet( fset[k] ); _gen3("(setwd%d[LA(%d)]&0x%x)", wordnum, k, 1<max_k ) max_k = k; if ( k == CLL_k ) break; k++; if ( k<=limit && !set_nil(fset[k]) ) _gen(" && "); /* MR11 */ on1line++; if ( on1line > NumExprPerLine ) { on1line=0; _gen("\n"); } } return max_k; } while ( k<= limit && !set_nil(fset[k]) ) /* MR11 */ { if ( (e=g=set_pdq(fset[k])) == NULL ) fatal_internal("genExpr: cannot allocate IF expr pdq set"); for (; *e!=nil; e++) { if ( !firstTime ) _gen(" || ") else { _gen("("); firstTime = 0; } on1line++; if ( on1line > NumExprPerLine ) { on1line=0; _gen("\n"); } _gen1("LA(%d)==",k); if ( TokenString(*e) == NULL ) _gen1("%d", *e) else _gen1("%s", TokenString(*e)); } free( (char *)g ); _gen(")"); if ( k>max_k ) max_k = k; if ( k == CLL_k ) break; k++; if ( k <= limit && !set_nil(fset[k]) ) { firstTime=1; _gen(" && "); } /* MR11 */ on1line++; if ( on1line > NumExprPerLine ) { on1line=0; _gen("\n"); } } return max_k; } /* * Generate code for any type of block. If the last alternative in the block is * empty (not even an action) don't bother doing it. This permits us to handle * optional and loop blocks as well. * * Only do this block, return after completing the block. * This routine is visible only to this file and cannot answer a TRANS message. */ static set #ifdef __USE_PROTOS genBlk( Junction *q, int jtype, int *max_k, int *need_right_curly, int * lastAltEmpty /* MR23 */) #else genBlk( q, jtype, max_k, need_right_curly, lastAltEmpty /* MR23 */) Junction *q; int jtype; int *max_k; int *need_right_curly; int *lastAltEmpty; /* MR23 */ #endif { set f; Junction *alt; int a_guess_in_block = 0; require(q!=NULL, "genBlk: invalid node"); require(q->ntype == nJunction, "genBlk: not junction"); *need_right_curly=0; *lastAltEmpty = 0; /* MR23 */ if ( q->p2 == NULL ) /* only one alternative? Then don't need if */ { if (first_item_is_guess_block((Junction *)q->p1)!=NULL ) { if (jtype != aLoopBlk && jtype != aOptBlk && jtype != aPlusBlk) { warnFL("(...)? as only alternative of block is unnecessary", FileStr[q->file], q->line); }; gen("zzGUESS\n"); /* guess anyway to make output code consistent */ /* MR10 disable */ /**** gen("if ( !zzrv )\n"); ****/ /* MR10 */ gen("if ( !zzrv ) {\n"); tabs++; (*need_right_curly)++; }; TRANS(q->p1); return empty; /* no decision to be made-->no error set */ } f = First(q, 1, jtype, max_k); for (alt=q; alt != NULL; alt= (Junction *) alt->p2 ) { if ( alt->p2 == NULL ) /* chk for empty alt */ { Node *p = alt->p1; if ( p->ntype == nJunction ) { /* we have empty alt */ /* MR23 There is a conflict between giving good error information for non-exceptions and making life easy for those using parser exception handling. Consider: r: { A } b; b: B; with input "C" Before MR21 the error message would be "expecting B - found C". After MR21 the error message would be "expcect A, B - found C". This was good, but it caused problems for those using parser exceptions because the reference to B was generated inside the {...} where B really wasn't part of the block. In MR23 this has been changed for the case where exceptions are in use to not generate the extra check in the tail of the {A} block. */ /* MR23 */ if (isEmptyAlt( ((Junction *)p)->p1, (Node *)q->end)) { /* MR23 */ *lastAltEmpty = 1; /* MR23 */ if (FoundException) { /* MR23 */ /* code to restore state if a prev alt didn't follow guess */ /* MR23 */ if ( a_guess_in_block && jtype != aPlusBlk) { /* MR23 */ gen("if ( !zzrv ) zzGUESS_DONE; /* MR28 */\n"); /* MR23 */ } /* MR23 */ break; /* MR23 */ }; /* MR28 */ if (jtype == aPlusBlk) { /* MR28 */ break; /* MR28 */ } /* MR23 */ } } } /* end of for loop on alt */ /* MR10 */ if (alt->p2 == NULL && /* MR10 */ ( q->jtype == aSubBlk || q->jtype == RuleBlk) ) { /* MR10 */ if (first_item_is_guess_block(alt)) { /* MR10 */ warnFL("(...)? as last alternative of block is unnecessary", /* MR10 */ FileStr[alt->file],alt->line); /* MR10 */ }; /* MR10 */ }; if ( alt != q ) gen("else ") else { if ( DemandLookahead ) { if ( !GenCC ) {gen1("LOOK(%d);\n", *max_k);} else gen1("look(%d);\n", *max_k); } } if ( alt!=q ) { _gen("{\n"); tabs++; (*need_right_curly)++; /* code to restore state if a prev alt didn't follow guess */ if ( a_guess_in_block ) gen("if ( !zzrv ) zzGUESS_DONE;\n"); } if ( first_item_is_guess_block((Junction *)alt->p1)!=NULL ) { a_guess_in_block = 1; gen("zzGUESS\n"); } gen("if ( "); if ( first_item_is_guess_block((Junction *)alt->p1)!=NULL ) _gen("!zzrv && "); genExpr(alt); _gen(" ) "); _gen("{\n"); tabs++; TRANS(alt->p1); --tabs; gen("}\n"); /* MR10 */ if (alt->p2 == NULL) { /* MR10 */ if (first_item_is_guess_block(alt)) { /* MR10 */ gen("/* MR10 */ else {\n"); /* MR10 */ tabs++; /* MR10 */ (*need_right_curly)++; /* MR10 */ /* code to restore state if a prev alt didn't follow guess */ /* MR10 */ gen("/* MR10 */ if ( !zzrv ) zzGUESS_DONE;\n"); /* MR10 */ gen("/* MR10 */ if (0) {} /* last alternative of block is guess block */\n"); /* MR10 */ }; /* MR10 */ }; } return f; } static int #ifdef __USE_PROTOS has_guess_block_as_first_item( Junction *q ) #else has_guess_block_as_first_item( q ) Junction *q; #endif { Junction *alt; for (alt=q; alt != NULL; alt= (Junction *) alt->p2 ) { if ( first_item_is_guess_block((Junction *)alt->p1)!=NULL ) return 1; } return 0; } static int #ifdef __USE_PROTOS has_guess_block_as_last_item( Junction *q ) #else has_guess_block_as_last_item( q ) Junction *q; #endif { Junction *alt; if (q == NULL) return 0; for (alt=q; alt->p2 != NULL && !( (Junction *) alt->p2)->ignore; alt= (Junction *) alt->p2 ) {}; return first_item_is_guess_block( (Junction *) alt->p1) != NULL; } /* MR30 See description of first_item_is_guess_block for background */ Junction * #ifdef __USE_PROTOS first_item_is_guess_block_extra(Junction *q ) #else first_item_is_guess_block_extra(q) Junction *q; #endif { while ( q!=NULL && ( ( q->ntype==nAction ) || ( q->ntype==nJunction && (q->jtype==Generic || q->jtype == aLoopBlk) ) ) ) { if ( q->ntype==nJunction ) q = (Junction *)q->p1; else q = (Junction *) ((ActionNode *)q)->next; } if ( q==NULL ) return NULL; if ( q->ntype!=nJunction ) return NULL; if ( q->jtype!=aSubBlk ) return NULL; if ( !q->guess ) return NULL; return q; } /* return NULL if 1st item of alt is NOT (...)? block; else return ptr to aSubBlk node * of (...)?; This function ignores actions and predicates. */ Junction * #ifdef __USE_PROTOS first_item_is_guess_block( Junction *q ) #else first_item_is_guess_block( q ) Junction *q; #endif { Junction * qOriginal = q; /* DEBUG */ /* MR14 Couldn't find aSubBlock which was a guess block when it lay behind aLoopBlk. The aLoopBlk only appear in conjunction with aLoopBegin, but the routine didn't know that. I think. MR14a Added extra parentheses to clarify precedence MR30 This appears to have been a mistake. The First set was then computed incorrectly for: r : ( (A)? B | C )* The routine analysis_point was seeing the guess block when it was still analyzing the loopBegin block. As a consequence, when it looked for the analysis_point it was processing the B, but skipping over the C alternative altogether because it thought it was looking at a guess block, not realizing there was a loop block in front of the loopBegin. loopBegin loopBlk subBlk/guess A G EB G B EB EB EB ER | | | ^ ^ | | | | | +-> G C G ----------------------+ | | | +--- G G G -------------------------------------+ Reported by Arpad Beszedes (beszedes@inf.u-szeged.hu). MR30 This is still more complicated. This fix caused ambiguity messages to be reported for "( (A B)? )* A B" but not for "( (A B)? )+". Why is there a difference when these are outwardly identical ? It is because the start of a (...)* block is represented by two nodes: a loopBegin block followed by a loopBlock whereas the start of a (...)+ block is represented as a single node: a plusBlock. So if first_item_is_guess_block is called when the current node is a loopBegin it starts with the loop block rather than the the sub block which follows the loop block. However, we can't just skip past the loop block because some routines depend on the old implementation. So, we provide a new implementation which does skip the loopBlock. However, which should be called when ? I'm not sure, but my guess is that first_item_is_guess_block_extra (the new one) should only be called for the ambiguity routines. */ while ( q!=NULL && ( ( q->ntype==nAction ) || ( q->ntype==nJunction && (q->jtype==Generic /*** || q->jtype == aLoopBlk ***/ ) /*** MR30 Undo MR14 change ***/ ) ) ) { if ( q->ntype==nJunction ) q = (Junction *)q->p1; else q = (Junction *) ((ActionNode *)q)->next; } if ( q==NULL ) return NULL; if ( q->ntype!=nJunction ) return NULL; if ( q->jtype!=aSubBlk ) return NULL; if ( !q->guess ) return NULL; return q; } /* MR1 */ /* MR1 10-Apr-97 MR1 Routine to stringize failed semantic predicates msgs */ /* MR1 */ #define STRINGIZEBUFSIZE 1024 static char stringizeBuf[STRINGIZEBUFSIZE]; char * #ifdef __USE_PROTOS stringize(char * s) #else stringize(s) char *s; #endif { char *p; char *stop; p=stringizeBuf; stop=&stringizeBuf[1015]; if (s != 0) { while (*s != 0) { if (p >= stop) { goto stringizeStop; } else if (*s == '\n') { *p++='\\'; *p++='n'; *p++='\\'; *p++=*s++; } else if (*s == '\\') { *p++=*s; *p++=*s++; } else if (*s == '\"') { *p++='\\'; *p++=*s++; while (*s != 0) { if (p >= stop) { goto stringizeStop; } else if (*s == '\n') { *p++='\\'; *p++=*s++; } else if (*s == '\\') { *p++=*s++; *p++=*s++; } else if (*s == '\"') { *p++='\\'; *p++=*s++; break; } else { *p++=*s++; }; }; } else if (*s == '\'') { *p++=*s++; while (*s != 0) { if (p >= stop) { goto stringizeStop; } else if (*s == '\'') { *p++=*s++; break; } else if (*s == '\\') { *p++=*s++; *p++=*s++; } else if (*s == '\"') { *p++='\\'; *p++=*s++; break; } else { *p++=*s++; }; }; } else { *p++=*s++; }; }; }; goto stringizeExit; stringizeStop: *p++='.'; *p++='.'; *p++='.'; stringizeExit: *p=0; return stringizeBuf; } #ifdef __USE_PROTOS int isNullAction(char *s) #else int isNullAction(s) char *s; #endif { char *p; for (p=s; *p != '\0' ; p++) { if (*p != ';' && *p !=' ') return 0; }; return 1; } /* MR1 */ /* MR1 End of Routine to stringize code for failed predicates msgs */ /* MR1 */ /* Generate an action. Don't if action is NULL which means that it was already * handled as an init action. */ void #ifdef __USE_PROTOS genAction( ActionNode *p ) #else genAction( p ) ActionNode *p; #endif { require(p!=NULL, "genAction: invalid node and/or rule"); require(p->ntype==nAction, "genAction: not action"); if ( !p->done ) /* MR10 */ /* MR11 */ { if ( p->is_predicate) { if ( p->guardpred != NULL ) { Predicate *guardDup=predicate_dup(p->guardpred); /* MR10 */ gen("if (!"); guardDup=genPredTreeMain(guardDup, (Node *)p); predicate_free(guardDup); } /* MR10 */ else if (p->ampersandPred != NULL) { /* MR10 */ gen("if (!"); /* MR10 */ p->ampersandPred=genPredTreeMain(p->ampersandPred, (Node *)p); /* MR10 */ } else { gen("if (!("); /* make sure that '#line n' is on front of line */ if ( GenLineInfo && p->file != -1 ) _gen("\n"); dumpPredAction(p,p->action, output, 0, p->file, p->line, 0); _gen(")"); } /* MR23 Change failed predicate macro to have three arguments: macro arg 1: The stringized predicate itself macro arg 2: 0 => no user-defined error action 1 => user-defined error action macro arg 3: The user-defined error action This gives the user more control of the error action. */ tabs++; gen3(") {zzfailed_pred(\"%s\",%s, { %s } );}\n", /* MR23 */ stringize(p->action), /* MR23 */ (p->pred_fail == NULL ? /* MR23/MR27 */ "0 /* report */" : "1 /* user action */"), /* MR23/MR27 */ (p->pred_fail == NULL ? /* MR23 */ "0; /* no user action */" : p->pred_fail)); /* MR23 */ tabs--; } else /* not a predicate */ { if (! isNullAction(p->action) && !p->noHoist) { if ( FoundGuessBlk ) { if ( GenCC ) { gen("if ( !guessing ) {\n"); } else { gen("zzNON_GUESS_MODE {\n"); }; }; dumpActionPlus(p, p->action, output, tabs, p->file, p->line, 1); /* MR21 */ if ( FoundGuessBlk ) gen("}\n"); }; } } TRANS(p->next) } /* * if invoking rule has !noAST pass zzSTR to rule ref and zzlink it in * else pass addr of temp root ptr (&_ast) (don't zzlink it in). * * if ! modifies rule-ref, then never link it in and never pass zzSTR. * Always pass address of temp root ptr. */ void #ifdef __USE_PROTOS genRuleRef( RuleRefNode *p ) #else genRuleRef( p ) RuleRefNode *p; #endif { Junction *q; char *handler_id = ""; RuleEntry *r, *r2; char *parm = "", *exsig = ""; int genRuleRef_emittedGuessGuard=0; /* MR10 */ require(p!=NULL, "genRuleRef: invalid node and/or rule"); require(p->ntype==nRuleRef, "genRuleRef: not rule reference"); if ( p->altstart!=NULL && p->altstart->exception_label!=NULL ) handler_id = p->altstart->exception_label; r = (RuleEntry *) hash_get(Rname, p->text); if ( r == NULL ) { warnFL( eMsg1("rule %s not defined", p->text), FileStr[p->file], p->line ); return; } /* MR8 5-Aug-97 Reported by S.Bochnak@microtool.com.pl */ /* Don't do assign when no return values declared */ /* Move definition of q up and use it to guard p->assign */ q = RulePtr[r->rulenum]; /* find definition of ref'd rule */ /* MR8 */ r2 = (RuleEntry *) hash_get(Rname, p->rname); if ( r2 == NULL ) {warnNoFL("Rule hash table is screwed up beyond belief"); return;} OutLineInfo(output,p->line,FileStr[p->file]); if ( GenCC && GenAST ) { gen("_ast = NULL;\n"); } if ( FoundGuessBlk && p->assign!=NULL && q->ret != NULL ) { /* MR8 */ if ( GenCC ) { gen("if ( !guessing ) {\n"); } else { gen("zzNON_GUESS_MODE {\n"); }; tabs++; /* MR11 */ genRuleRef_emittedGuessGuard=1; /* MR11 */ }; if ( FoundException ) exsig = "&_signal"; tab(); if ( GenAST ) { if ( GenCC ) { /**** if ( r2->noAST || p->astnode==ASTexclude ) ****/ { /**** _gen("_ast = NULL;\n"); ****/ parm = "&_ast"; } /*** we always want to set just a pointer now, then set correct pointer after else { _gen("_astp = (_tail==NULL)?(&_sibling):(&(_tail->_right));\n"); parm = "_astp"; } ****/ } else { if ( r2->noAST || p->astnode==ASTexclude ) { _gen("_ast = NULL; "); parm = "&_ast"; } else parm = "zzSTR"; } if ( p->assign!=NULL && q->ret!=NULL ) /* MR8 */ { if ( !hasMultipleOperands(p->assign) ) {_gen1("%s = ",p->assign);} /* MR23 */ else _gen1("{ struct _rv%d _trv; _trv = ", r->rulenum); } if ( FoundException ) { _gen5("%s%s(%s,&_signal%s%s); ", RulePrefix, p->text, parm, (p->parms!=NULL)?",":"", (p->parms!=NULL)?p->parms:""); if ( p->ex_group!=NULL ) { _gen("\n"); gen("if (_signal) {\n"); tabs++; dumpException(p->ex_group, 0); tabs--; gen("}"); } else { _gen1("if (_signal) goto %s_handler;", handler_id); } } else { _gen5("%s%s(%s%s%s);", RulePrefix, p->text, parm, (p->parms!=NULL)?",":"", (p->parms!=NULL)?p->parms:""); } if ( GenCC && (r2->noAST || p->astnode==ASTexclude) ) { /* rule has a ! or element does */ /* still need to assign to #i so we can play with it */ _gen("\n"); gen2("_ast%d%d = (AST *)_ast;", BlkLevel-1, p->elnum); } else if ( !r2->noAST && p->astnode == ASTinclude ) { /* rule doesn't have a ! and neither does element */ /* MR10 */ if (FoundGuessBlk && !genRuleRef_emittedGuessGuard) { /* MR10 */ _gen("\n"); /* MR10 */ if (GenCC) gen ("if (!guessing) { /* MR10 */") /* MR10 */ else gen ("if (!zzguessing) { /* MR10 */\n"); /* MR10 */ tabs++; /* MR10 */ }; if ( GenCC ) { _gen("\n"); gen("if ( _tail==NULL ) _sibling = _ast; else _tail->setRight(_ast);\n"); gen2("_ast%d%d = (AST *)_ast;\n", BlkLevel-1, p->elnum); tab(); } else _gen(" "); if ( GenCC ) { _gen("ASTBase::"); } else _gen("zz"); _gen("link(_root, &_sibling, &_tail);"); /* MR10 */ if (FoundGuessBlk && !genRuleRef_emittedGuessGuard) { /* MR10 */ /* MR10 */ _gen("\n"); /* MR10 */ tabs--; /* MR10 */ if (GenCC) gen ("}; /* MR10 */") /* MR10 */ else gen ("}; /* MR10 */"); /* MR10 */ }; } } else { if ( p->assign!=NULL && q->ret!=NULL ) /* MR8 */ { if ( !hasMultipleOperands(p->assign) ) {_gen1("%s = ",p->assign);} /* MR23 */ else _gen1("{ struct _rv%d _trv; _trv = ", r->rulenum); } if ( FoundException ) { _gen4("%s%s(&_signal%s%s); ", RulePrefix, p->text, (p->parms!=NULL)?",":"", (p->parms!=NULL)?p->parms:""); if ( p->ex_group!=NULL ) { _gen("\n"); gen("if (_signal) {\n"); tabs++; dumpException(p->ex_group, 0); tabs--; gen("}"); } else { _gen1("if (_signal) goto %s_handler;", handler_id); } } else { _gen3("%s%s(%s);", RulePrefix, p->text, (p->parms!=NULL)?p->parms:""); } if ( p->assign!=NULL && q->ret!=NULL ) _gen("\n"); /* MR8 */ } if ( p->assign!=NULL && q->ret!=NULL) { /* MR8 */ if ( hasMultipleOperands(p->assign) ) /* MR23 */ { _gen("\n"); dumpRetValAssign(p->assign, q->ret, p); /* MR30 */ _gen("}"); } } _gen("\n"); /* Handle element labels now */ if ( p->el_label!=NULL ) { if ( GenAST ) { if ( GenCC ) { gen3("%s_ast = _ast%d%d;\n", p->el_label, BlkLevel-1, p->elnum); } else {gen1("%s_ast = zzastCur;\n", p->el_label);} } else if (!GenCC ) { gen1("%s = zzaCur;\n", p->el_label); } } if ( FoundGuessBlk && p->assign!=NULL && q->ret!=NULL ) { /* MR8 */ /* in guessing mode, don't branch to handler upon error */ tabs--; /* MR11 */ gen("} else {\n"); tabs++; /* MR11 */ if ( FoundException ) { gen6("%s%s(%s%s&_signal%s%s);\n", RulePrefix, p->text, parm, (*parm!='\0')?",":"", (p->parms!=NULL)?",":"", (p->parms!=NULL)?p->parms:""); } else { gen5("%s%s(%s%s%s);\n", RulePrefix, p->text, parm, (p->parms!=NULL && *parm!='\0')?",":"", (p->parms!=NULL)?p->parms:""); } tabs--; /* MR11 */ gen("}\n"); } TRANS(p->next) } /* * Generate code to match a token. * * Getting the next token is tricky. We want to ensure that any action * following a token is executed before the next GetToken(); */ void #ifdef __USE_PROTOS genToken( TokNode *p ) #else genToken( p ) TokNode *p; #endif { RuleEntry *r; char *handler_id = ""; ActionNode *a; char *set_name; char *set_nameErrSet; int complement; int ast_label_in_action = 0; /* MR27 */ int pushedCmodeAST = 0; /* MR27 */ require(p!=NULL, "genToken: invalid node and/or rule"); require(p->ntype==nToken, "genToken: not token"); if ( p->altstart!=NULL && p->altstart->exception_label!=NULL ) handler_id = p->altstart->exception_label; r = (RuleEntry *) hash_get(Rname, p->rname); if ( r == NULL ) {warnNoFL("Rule hash table is screwed up beyond belief"); return;} /* * MR27 Has the element label been referenced as an AST (with the # operator) ? * If so, then we'll want to build the AST even though the user has used * the ! operator. */ /* MR27 */ if (GenAST && p->el_label != NULL) { /* MR27 */ ast_label_in_action = list_search_cstring(r->ast_labels_in_actions, /* MR27 */ p->el_label); /* MR27 */ } OutLineInfo(output,p->line,FileStr[p->file]); if ( !set_nil(p->tset) ) /* implies '.', ~Tok, or tokenclass */ { unsigned e; unsigned eErrSet = 0; set b; set bErrSet; /* MR23 */ b = set_dup(p->tset); bErrSet = set_dup(p->tset); /* MR23 */ complement = p->complement; /* MR23 */ if ( p->tclass!=NULL && complement == 0 /* MR23 */) { /* token class not complemented*/ static char buf[MaxRuleName+20]; /* MR23 */ static char bufErrSet[MaxRuleName+20]; /* MR23 */ if ( p->tclass->dumped ) { e = p->tclass->setnum; eErrSet = p->tclass->setnumErrSet; } else { e = DefErrSet(&b, 0, TokenString(p->token)); eErrSet = DefErrSetWithSuffix(0, &bErrSet, 1, TokenString(p->token), "_errset"); p->tclass->dumped = 1; /* indicate set has been created */ p->tclass->setnum = e; p->tclass->setnumErrSet = eErrSet; /* MR23 */ } sprintf(buf, "%s_set", TokenString(p->token)); sprintf(bufErrSet, "%s_errset", TokenString(p->token)); /* MR23 */ set_name = buf; set_nameErrSet = bufErrSet; /* MR23 */ } /* MR23 - Forgot about the case of ~TOKCLASS. */ else if ( p->tclass!=NULL && complement != 0 /* MR23 */) { static char buf[MaxRuleName+20]; /* MR23 */ static char bufErrSet[MaxRuleName+20]; /* MR23 */ if ( p->tclass->dumpedComplement ) { e = p->tclass->setnumComplement; eErrSet = p->tclass->setnumErrSetComplement; } else { e = DefErrSetWithSuffix(0, &b, 0, TokenString(p->token), "_setbar"); eErrSet = DefErrSetWithSuffix(0, &bErrSet, 1, TokenString(p->token), "_errsetbar"); p->tclass->dumpedComplement = 1; /* indicate set has been created */ p->tclass->setnumComplement = e; p->tclass->setnumErrSetComplement = eErrSet; /* MR23 */ } sprintf(buf, "%s_setbar", TokenString(p->token)); sprintf(bufErrSet, "%s_errsetbar", TokenString(p->token)); /* MR23 */ set_name = buf; set_nameErrSet = bufErrSet; /* MR23 */ } else { /* wild card */ static char buf[sizeof("zzerr")+10]; static char bufErrSet[sizeof("zzerr")+10]; int n = DefErrSet( &b, 0, NULL ); int nErrSet = DefErrSetWithSuffix(0, &bErrSet, 1, NULL, "_set"); if ( GenCC ) sprintf(buf, "err%d", n); else sprintf(buf, "zzerr%d", n); if ( GenCC ) sprintf(bufErrSet, "err%d", nErrSet); else sprintf(bufErrSet, "zzerr%d", nErrSet); set_name = buf; set_nameErrSet = bufErrSet; } if ( !FoundException ) { /* MR23 */ gen2("zzsetmatch(%s, %s);", set_name, set_nameErrSet); } else if ( p->ex_group==NULL ) { if ( p->use_def_MT_handler ) gen3("zzsetmatch_wdfltsig(%s,(ANTLRTokenType)%d,%s);", set_name, p->token, tokenFollowSet(p)) else gen2("zzsetmatch_wsig(%s, %s_handler);", set_name, handler_id); } else { gen1("if ( !_setmatch_wsig(%s) ) {\n", set_name); tabs++; /* MR6 */ if (FoundGuessBlk) { /* MR6 */ if ( GenCC ) {gen("if ( guessing ) goto fail;\n");} /* MR6 */ else gen("if ( zzguessing ) goto fail;\n"); /* MR6 */ }; gen("_signal=MismatchedToken;\n"); dumpException(p->ex_group, 0); tabs--; gen("}\n"); } set_free(b); set_free(bErrSet); } else if ( TokenString(p->token)!=NULL ) { if ( FoundException ) { if ( p->use_def_MT_handler ) gen2("zzmatch_wdfltsig(%s,%s);",TokenString(p->token),tokenFollowSet(p)) else if ( p->ex_group==NULL ) { gen2("zzmatch_wsig(%s, %s_handler);", TokenString(p->token), handler_id); } else { /* MR6 */ if (GenCC) { /* MR6 */ gen1("if ( !_match_wsig(%s) ) {\n", TokenString(p->token)); /* MR6 */ } else { /* MR6 */ gen1("if ( !_zzmatch_wsig(%s) ) {\n", TokenString(p->token)); /* MR6 */ }; tabs++; /* MR6 */ if (FoundGuessBlk) { /* MR6 */ if ( GenCC ) {gen("if ( guessing ) goto fail;\n");} /* MR6 */ else gen("if ( zzguessing ) goto fail;\n"); /* MR6 */ }; gen("_signal=MismatchedToken;\n"); dumpException(p->ex_group, 0); tabs--; gen("}\n"); } } else gen1("zzmatch(%s);", TokenString(p->token)); } else { if ( FoundException ) { if ( p->use_def_MT_handler ) gen2("zzmatch_wdfltsig((ANTLRTokenType)%d,%s);", p->token,tokenFollowSet(p)) else gen2("zzmatch_wsig(%d,%s_handler);",p->token,handler_id); } else {gen1("zzmatch(%d);", p->token);} } a = findImmedAction( p->next ); /* generate the token labels */ if ( GenCC && p->elnum>0 ) { /* If building trees in C++, always gen the LT() assigns */ if ( set_el(p->elnum, tokensRefdInBlock) || GenAST ) { /* MR10 */ if ( FoundGuessBlk ) { /* MR10 */ gen("\n"); /* MR10 */ if (p->label_used_in_semantic_pred) { /* MR10 */ gen2(" _t%d%d = (ANTLRTokenPtr)LT(1); /* MR10 */\n", BlkLevel-1, p->elnum); /* MR10 */ } else { /* MR10 */ gen("if ( !guessing ) {\n"); tab(); /* MR10 */ _gen2(" _t%d%d = (ANTLRTokenPtr)LT(1);\n", BlkLevel-1, p->elnum); /* MR10 */ gen("}\n"); /* MR10 */ }; /* MR10 */ } else { /* MR10 */ _gen2(" _t%d%d = (ANTLRTokenPtr)LT(1);", BlkLevel-1, p->elnum); /* MR10 */ }; /* MR10 */ } /* * MR23 labase is never used in the C++ runtime library. * and this code is generated only in C++ mode */ /*** if ( LL_k>1 ) / * MR23 disabled */ /*** if ( !DemandLookahead ) _gen(" labase++;"); / * MR23 disabled */ /*** _gen("\n"); / * MR23 disabled */ /*** tab(); / * MR23 disabled */ } if ( GenAST ) { if ( FoundGuessBlk && (ast_label_in_action || !(p->astnode == ASTexclude || r->noAST)) ) { if ( GenCC ) {_gen("if ( !guessing ) {\n"); tab();} else {_gen("zzNON_GUESS_MODE {\n"); tab();} } /* MR27 addition when labels referenced when operator ! used */ pushedCmodeAST = 0; /* MR27 */ if (ast_label_in_action && (p->astnode == ASTexclude || r->noAST)) { _gen("\n"); if (GenCC) { /* MR13 */ if (NewAST) { /* MR13 */ gen4("_ast%d%d = newAST(_t%d%d); /* MR27 */\n", BlkLevel-1, p->elnum, BlkLevel-1, p->elnum); /* MR13 */ } else { /* MR13 */ gen4("_ast%d%d = new AST(_t%d%d); /* MR27 */\n", BlkLevel-1, p->elnum, BlkLevel-1, p->elnum); /* MR13 */ } } else { pushedCmodeAST = 1; gen("zzastPush(zzmk_ast(zzastnew(),zzaCur)); /* MR27 */"); } } /* end MR27 addition for labels referenced when operator ! used */ if (!r->noAST ) { if (GenCC && !(p->astnode == ASTexclude) ) { _gen("\n"); /* MR13 */ if (NewAST) { /* MR13 */ gen4("_ast%d%d = newAST(_t%d%d);\n", BlkLevel-1, p->elnum, BlkLevel-1, p->elnum); /* MR13 */ } else { /* MR13 */ gen4("_ast%d%d = new AST(_t%d%d);\n", BlkLevel-1, p->elnum, BlkLevel-1, p->elnum); /* MR13 */ } tab(); } if ( GenCC && !(p->astnode == ASTexclude) ) {_gen2("_ast%d%d->", BlkLevel-1, p->elnum);} else _gen(" "); if ( p->astnode==ASTchild ) { if ( !GenCC ) _gen("zz"); _gen("subchild(_root, &_sibling, &_tail);"); } else if ( p->astnode==ASTroot ) { if ( !GenCC ) _gen("zz"); _gen("subroot(_root, &_sibling, &_tail);"); } if ( GenCC && !(p->astnode == ASTexclude) ) { _gen("\n"); tab(); } } else if ( !GenCC ) { if (! pushedCmodeAST) _gen(" zzastDPush;"); } if ( FoundGuessBlk && (ast_label_in_action || !(p->astnode == ASTexclude || r->noAST)) ) {gen("}\n"); tab();} } /* Handle element labels now */ if ( p->el_label!=NULL ) { int done_NON_GUESSMODE=0; _gen("\n"); /* MR10 */ /* do Attrib / Token ptr for token label used in semantic pred */ /* MR10 */ /* for these cases do assign even in guess mode */ /* MR10 */ /* MR10 */ if (p->label_used_in_semantic_pred) { /* MR10 */ if ( GenCC ) { /* MR10 */ if ( set_el(p->elnum, tokensRefdInBlock) || GenAST ) { /* MR10 */ gen3("%s = _t%d%d;", p->el_label, BlkLevel-1, p->elnum); /* MR10 */ } else { /* MR10 */ gen1("%s = (ANTLRTokenPtr)LT(1);\n", p->el_label); /* MR10 */ }; /* MR10 */ } else { /* MR10 */ gen1("%s = zzaCur;", p->el_label); /* MR10 */ }; /* MR10 */ if (FoundGuessBlk) _gen(" /* MR10 */"); /* MR10 */ _gen("\n"); /* MR10 */ }; /* Do Attrib / Token ptr */ /* MR10 */ if (! p->label_used_in_semantic_pred) { /* MR10 */ /* MR10 */ if ( FoundGuessBlk ) { /* MR10 */ if (! done_NON_GUESSMODE) { /* MR10 */ done_NON_GUESSMODE=1; /* MR10 */ if ( GenCC ) {gen("if ( !guessing ) {\n"); tab();} /* MR10 */ else {gen("zzNON_GUESS_MODE {\n"); tab();} /* MR10 */ }; /* MR10 */ }; /* MR10 */ /* MR10 */ if ( GenCC ) { /* MR10 */ if ( set_el(p->elnum, tokensRefdInBlock) || GenAST ) { /* MR10 */ gen3("%s = _t%d%d;\n", p->el_label, BlkLevel-1, p->elnum); /* MR10 */ } else { /* MR10 */ gen1("%s = (ANTLRTokenPtr)LT(1);\n", p->el_label); /* MR10 */ }; /* MR10 */ } else { /* MR10 */ gen1("%s = zzaCur;\n", p->el_label); /* MR10 */ }; /* MR10 */ }; /* Do AST ptr */ if (GenAST && (ast_label_in_action || !(p->astnode == ASTexclude || r->noAST) )) /* MR27 */ { /* MR10 */ if ( FoundGuessBlk ) { /* MR10 */ if (! done_NON_GUESSMODE) { /* MR10 */ done_NON_GUESSMODE=1; /* MR10 */ if ( GenCC ) {gen("if ( !guessing ) {\n"); tab();} /* MR10 */ else {gen("zzNON_GUESS_MODE {\n"); tab();} /* MR10 */ }; /* MR10 */ }; if ( GenCC ) { gen3("%s_ast = _ast%d%d;\n", p->el_label, BlkLevel-1, p->elnum); } else {gen1("%s_ast = zzastCur;\n", p->el_label);} } /* MR10 */ if (done_NON_GUESSMODE) { /* MR10 */ gen("}\n"); tab(); /* MR10 */ }; } /* Handle any actions immediately following action */ if ( a != NULL ) /* MR10 */ /* MR11 */ { /* delay next token fetch until after action */ _gen("\n"); if ( a->is_predicate) { #if 0 /* Disabled in MR30 ************************************************************ And moved into genAction ***************************************************************************** */ gen("if (!("); /* make sure that '#line n' is on front of line */ /* MR14 */ if ( GenLineInfo && p->file != -1 ) _gen("\n"); /* MR14 */ dumpPredAction(a,a->action, output, 0, a->file, a->line, 0); /* MR23 Change failed predicate macro to have three arguments: macro arg 1: The stringized predicate itself macro arg 2: 0 => no user-defined error action 1 => user-defined error action macro arg 3: The user-defined error action This gives the user more control of the error action. */ _gen(")) \n"); tabs++; gen3(" {zzfailed_pred(\"%s\",%s,{ %s } );}\n", /* MR23 */ stringize(a->action), /* MR23 */ (a->pred_fail == NULL ? /* MR23/MR27 */ "0 /* report */" : "1 /* user action */"), /* MR23/MR27 */ (a->pred_fail == NULL ? /* MR23 */ "0; /* no user action */" : a->pred_fail)); /* MR23 */ tabs--; /* Disabled in MR30 ************************************************************ And moved into genAction ***************************************************************************** */ #endif } else /* MR9 a regular action - not a predicate action */ { /* MR23: Search an action which is not a predicate for LT(i), LA(i), or LATEXT(i) in order to warn novice users that it refers to the previous matched token, not the next one. This is different than the case for semantic predicates. */ /* MR23 */ if (GenCC) { /* MR23 */ if (strstr(a->action, "LT(") != NULL) LTinTokenAction = 1; /* MR23 */ } /* MR23 */ else { /* MR23 */ if (strstr(a->action, "LA(") != NULL) LTinTokenAction = 1; /* MR23 */ if (strstr(a->action, "LATEXT(") != NULL) LTinTokenAction = 1; /* MR23 */ } if ( FoundGuessBlk ) { if ( GenCC ) {gen("if ( !guessing ) {\n");} else gen("zzNON_GUESS_MODE {\n"); } dumpActionPlus(a, a->action, output, tabs, a->file, a->line, 1); /* MR21 */ if ( FoundGuessBlk ) gen("}\n"); a->done = 1; /* MR30 */ } /*** a->done = 1; MR30 Moved up into then branch for true actions, but not predicates ***/ if ( !DemandLookahead ) { if ( GenCC ) { if ( FoundException && p->use_def_MT_handler ) gen("if (!_signal)"); _gen(" consume();") if ( FoundException && p->use_def_MT_handler ) _gen(" _signal=NoSignal;"); _gen("\n"); } else { if ( FoundException && p->use_def_MT_handler ) _gen("if (!_signal)"); _gen(" zzCONSUME;\n"); if ( FoundException && p->use_def_MT_handler ) _gen(" _signal=NoSignal;"); _gen("\n"); } } else gen("\n"); if (a->done) { /* MR30 */ TRANS( a->next ); /* MR30 */ } /* MR30 */ else { /* MR30 */ TRANS( p->next ); /* MR30 */ } /* MR30 */ } else { if ( !DemandLookahead ) { if ( GenCC ) { if (FoundException && p->use_def_MT_handler) _gen("if (!_signal)"); _gen(" consume();") if (FoundException&&p->use_def_MT_handler) _gen(" _signal=NoSignal;"); _gen("\n"); } else { if (FoundException && p->use_def_MT_handler) _gen("if (!_signal)"); _gen(" zzCONSUME;"); if ( FoundException && p->use_def_MT_handler ) _gen(" _signal=NoSignal;"); _gen("\n"); } } else _gen("\n"); TRANS(p->next); } } /* MR21 * * There was a bug in the code generation for {...} which causes it * to omit the optional tokens from the error messages. The easiest * way to fix this was to make the opt block look like a sub block: * * { a | b | c } * * becomes (internally): * * ( a | b | c | ) * * The code for genOptBlk is now identical to genSubBlk except for * cosmetic changes. */ void #ifdef __USE_PROTOS genOptBlk( Junction *q ) #else genOptBlk( q ) Junction *q; #endif { int max_k; set f; int need_right_curly; set savetkref; int lastAltEmpty; /* MR23 */ savetkref = tokensRefdInBlock; require(q->ntype == nJunction, "genOptBlk: not junction"); require(q->jtype == aOptBlk, "genOptBlk: not opt block"); OutLineInfo(output,q->line,FileStr[q->file]); BLOCK_Preamble(q); BlkLevel++; BlockPreambleOption(q,q->pFirstSetSymbol); /* MR21 */ f = genBlk(q, aOptBlk, &max_k, &need_right_curly, &lastAltEmpty /* MR23 */); /* MR23 Bypass error clause generation when exceptions are used in {...} block See multi-line note in genBlk near call to isEmptyAlt. */ if (! FoundException) { if ( q->p2 != NULL ) {tab(); makeErrorClause(q,f,max_k,0 /* use plus block bypass ? */ );} } else { gen("/* MR23 skip error clause for {...} when exceptions in use */\n"); } { int i; for (i=1; i<=need_right_curly; i++) {tabs--; gen("}\n");} } freeBlkFsets(q); --BlkLevel; BLOCK_Tail(); if ( q->guess ) { gen("zzGUESS_DONE\n"); } /* must duplicate if (alpha)?; one guesses (validates), the * second pass matches */ if ( q->guess && analysis_point(q)==q ) { OutLineInfo(output,q->line,FileStr[q->file]); BLOCK_Preamble(q); BlkLevel++; f = genBlk(q, aSubBlk, &max_k, &need_right_curly, &lastAltEmpty /* MR23 */); if ( q->p2 != NULL ) {tab(); makeErrorClause(q,f,max_k,0 /* use plus block bypass ? */ );} { int i; for (i=1; i<=need_right_curly; i++) {tabs--; gen("}\n");} } freeBlkFsets(q); --BlkLevel; BLOCK_Tail(); } tokensRefdInBlock = savetkref; if (q->end->p1 != NULL) TRANS(q->end->p1); } /* * Generate code for a loop blk of form: * * |---| * v | * --o-G-o-->o-- */ void #ifdef __USE_PROTOS genLoopBlk( Junction *begin, Junction *q, Junction *start, int max_k ) #else genLoopBlk( begin, q, start, max_k ) Junction *begin; Junction *q; Junction *start; /* where to start generating code from */ int max_k; #endif { set f; int need_right_curly; set savetkref; Junction *guessBlock; /* MR10 */ int singleAlt; /* MR10 */ int lastAltEmpty; /* MR23 */ savetkref = tokensRefdInBlock; require(q->ntype == nJunction, "genLoopBlk: not junction"); require(q->jtype == aLoopBlk, "genLoopBlk: not loop block"); if ( q->visited ) return; q->visited = TRUE; /* first_item_is_guess_block doesn't care what kind of node it is */ guessBlock=first_item_is_guess_block( (Junction *) q->p1); /* MR10 */ singleAlt=q->p2==NULL; /* MR10 */ if (singleAlt && !guessBlock) /* MR10 */ /* only one alternative? */ { if ( DemandLookahead ) { if ( !GenCC ) {gen1("LOOK(%d);\n", max_k);} else gen1("look(%d);\n", max_k); } gen("while ( "); if ( begin!=NULL ) genExpr(begin); else genExpr(q); /* if no predicates have been hoisted for this single alt (..)* * do so now */ require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); if ( ParseWithPredicates && begin->predicate==NULL ) { Predicate *a = MR_find_predicates_and_supp((Node *)q->p1); require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); if ( a!=NULL ) { _gen("&&"); a=genPredTreeMain(a, (Node *)q); /* MR10 */ } /* MR10 */ if (MRhoisting) { /* MR10 */ predicate_free(a); /* MR10 */ }; } _gen(" ) {\n"); tabs++; TRANS(q->p1); if ( !GenCC ) gen1("zzLOOP(zztasp%d);\n", BlkLevel-1); if ( DemandLookahead ) { if ( !GenCC ) {gen1("LOOK(%d);\n", max_k);} else gen1("look(%d);\n", max_k); } --tabs; gen("}\n"); freeBlkFsets(q); q->visited = FALSE; tokensRefdInBlock = savetkref; return; } gen("for (;;) {\n"); /* MR20 G. Hobbelt */ tabs++; /* MR6 */ /* MR6 "begin" can never be null when called from genLoopBegin */ /* MR6 because q==(Junction *)begin->p1 and we know q is valid */ /* MR6 */ /* MR6 from genLoopBegin: */ /* MR6 */ /* MR6 if ( LL_k>1 && !set_nil(q->fset[2]) ) */ /* MR6 genLoopBlk( q, (Junction *)q->p1, q, max_k ); */ /* MR6 else genLoopBlk( q, (Junction *)q->p1, NULL, max_k ); */ /* MR6 */ if ( begin!=NULL ) { if ( DemandLookahead ) { if ( !GenCC ) {gen1("LOOK(%d);\n", max_k);} else gen1("look(%d);\n", max_k); } /* The bypass arc of the (...)* predicts what to do when you fail, but * ONLY after having tested the loop start expression. To avoid this, * we simply break out of the (...)* loop when we find something that * is not in the prediction of the loop (all alts thereof). */ gen("if ( !("); /*** TJP says: It used to use the prediction expression for the bypass arc of the (...)*. HOWEVER, if a non LL^1(k) decision was found, this thing would miss the ftree stored in the aLoopBegin node and generate an LL^1(k) decision anyway. *** genExpr((Junction *)begin->p2); ***/ genExpr((Junction *)begin); _gen(")) break;\n"); } /* generate code for terminating loop (this is optional branch) */ f = genBlk(q, aLoopBlk, &max_k, &need_right_curly, &lastAltEmpty /* MR23 */); set_free(f); freeBlkFsets(q); /* generate code for terminating loop (this is optional branch) */ /* MR6 */ /* MR6 30-May-97 Bug reported by Manuel Ornato */ /* MR6 A definite bug involving the exit from a loop block */ /* MR6 In 1.23 and later versions (including 1.33) Instead */ /* MR6 exiting the block and reporting a syntax error the */ /* MR6 code loops forever. */ /* MR6 Looking at 1.20 which generates proper code it is not */ /* MR6 clear which of two changes should be undone. */ /* MR6 This is my best guess. */ /* MR6 From earlier MR6 note we know that begin can never be */ /* MR6 null when genLoopBlk called from genLoopBegin */ /* MR6 */ /* MR6 */ if ( begin==NULL) { /* MR6 */ /* code for exiting loop "for sure" */ /* MR6 */ gen("/* Suppressed by MR6 */ /*** else break; ***/\n"); /* MR6 */ }; /* MR10 */if (singleAlt && guessBlock) { /* MR10 */ tabs--; /* MR6 */ gen("} else break; /* MR6 code for exiting loop \"for sure\" */\n"); /* MR10 */ need_right_curly--; /* MR10 */ } else { /* MR6 */ gen("else break; /* MR6 code for exiting loop \"for sure\" */\n"); /* MR10 */ }; { int i; for (i=1; i<=need_right_curly; i++) {tabs--; gen("}\n");} } if ( !GenCC ) gen1("zzLOOP(zztasp%d);\n", BlkLevel-1); --tabs; gen("}\n"); q->visited = FALSE; tokensRefdInBlock = savetkref; } /* * Generate code for a loop blk of form: * * |---| * v | * --o-->o-->o-G-o-->o-- * | ^ * v | * o-----------o * * q->end points to the last node (far right) in the blk. * * Note that q->end->jtype must be 'EndBlk'. * * Generate code roughly of the following form: * * do { * ... code for alternatives ... * } while ( First Set of aLoopBlk ); * * OR if > 1 alternative * * do { * ... code for alternatives ... * else break; * } while ( 1 ); */ void #ifdef __USE_PROTOS genLoopBegin( Junction *q ) #else genLoopBegin( q ) Junction *q; #endif { set f; int i; int max_k; set savetkref; savetkref = tokensRefdInBlock; require(q!=NULL, "genLoopBegin: invalid node and/or rule"); require(q->ntype == nJunction, "genLoopBegin: not junction"); require(q->jtype == aLoopBegin, "genLoopBegin: not loop block"); require(q->p2!=NULL, "genLoopBegin: invalid Loop Graph"); OutLineInfo(output,q->line,FileStr[q->file]); BLOCK_Preamble(q); BlkLevel++; BlockPreambleOption(q,q->pFirstSetSymbol); /* MR21 */ f = First(q, 1, aLoopBegin, &max_k); /* If not simple LL(1), must specify to start at LoopBegin, not LoopBlk */ if ( LL_k>1 && !set_nil(q->fset[2]) ) genLoopBlk( q, (Junction *)q->p1, q, max_k ); else genLoopBlk( q, (Junction *)q->p1, NULL, max_k ); for (i=1; i<=CLL_k; i++) set_free(q->fset[i]); for (i=1; i<=CLL_k; i++) set_free(((Junction *)q->p2)->fset[i]); --BlkLevel; BLOCK_Tail(); set_free(f); tokensRefdInBlock = savetkref; /* MR21 */ if (MR_BlkErr) { /* MR21 */ set f, fArray[2]; /* MR21 */ f = ComputeErrorSet(q,1,0 /* use plus block bypass ? */ ); /* MR21 */ fArray[0]= empty; /* MR21 */ fArray[1]= set_dup(f); /* MR21 */ gen("if ("); /* MR21 */ genExprSets(fArray,1); /* note: destroys set arguments */ /* MR21 */ _gen(") { /* MR21 option -mrblksynerr */\n"); /* MR21 */ tabs++; /* MR21 */ tab(); /* MR21 */ _gen("/* nothing */ }\n"); /* MR21 */ tab(); /* MR21 */ makeErrorClause(q,f,1,0 /* use plus block bypass ? */ ); /* frees set */ /* MR21 */ tabs--; /* MR21 */ }; if (q->end->p1 != NULL) TRANS(q->end->p1); } /* * Generate code for a loop blk of form: * * |---| * v | * --o-G-o-->o-- * * q->end points to the last node (far right) in the blk. * Note that q->end->jtype must be 'EndBlk'. * * Generate code roughly of the following form: * * do { * ... code for alternatives ... * } while ( First Set of aPlusBlk ); * * OR if > 1 alternative * * do { * ... code for alternatives ... * else if not 1st time through, break; * } while ( 1 ); */ void #ifdef __USE_PROTOS genPlusBlk( Junction *q ) #else genPlusBlk( q ) Junction *q; #endif { int max_k; set f; int need_right_curly; int lastAltEmpty; /* MR23 */ set savetkref; Junction *guessBlock; /* MR10 */ int singleAlt; /* MR10 */ savetkref = tokensRefdInBlock; require(q!=NULL, "genPlusBlk: invalid node and/or rule"); require(q->ntype == nJunction, "genPlusBlk: not junction"); require(q->jtype == aPlusBlk, "genPlusBlk: not Plus block"); require(q->p2 != NULL, "genPlusBlk: not a valid Plus block"); if ( q->visited ) return; q->visited = TRUE; OutLineInfo(output,q->line,FileStr[q->file]); BLOCK_Preamble(q); BlkLevel++; BlockPreambleOption((Junction *)q, q->pFirstSetSymbol); /* MR21 */ /* first_item_is_guess_block doesn't care what kind of node it is */ guessBlock=first_item_is_guess_block( (Junction *)q->p1); /* MR10 */ /* if the ignore flag is set on the 2nd alt and that alt is empty, * then it is the implied optional alternative that we added for (...)+ * and, hence, only 1 alt. */ /* MR10 Reported by Pulkkinen Esa (esap@cs.tut.fi) * Outer code for guess blocks ignored when there is only one alt * for a (...)+ block. * Force use of regular code rather than "optimized" code for that case */ singleAlt=( ( (Junction *) q->p2)->p2 == NULL) && ( ( (Junction *) q->p2)->ignore ); /* only one alternative? */ if (singleAlt && !guessBlock) /* MR10 */ { Predicate *a=NULL; /* if the only alt has a semantic predicate, hoist it; must test before * entering loop. */ if ( ParseWithPredicates ) { require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); a = MR_find_predicates_and_supp((Node *)q); require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); if ( a!=NULL ) { gen("if ("); a=genPredTreeMain(a, (Node *)q); /* MR10 */ _gen(") {\n"); } } gen("do {\n"); tabs++; TRANS(q->p1); if ( !GenCC ) gen1("zzLOOP(zztasp%d);\n", BlkLevel-1); f = First(q, 1, aPlusBlk, &max_k); if ( DemandLookahead ) { if ( !GenCC ) {gen1("LOOK(%d);\n", max_k);} else gen1("look(%d);\n", max_k); } --tabs; gen("} while ( "); if ( q->parm!=NULL && q->predparm ) _gen1("(%s) && ", q->parm); genExpr(q); if ( ParseWithPredicates && a!=NULL ) { if (! MR_comparePredicates(q->predicate,a)) { _gen("&&"); a=genPredTreeMain(a, (Node *)q); /* MR10 */ }; } _gen(" );\n"); if ( ParseWithPredicates && a!=NULL ) gen("}\n"); --BlkLevel; BLOCK_Tail(); q->visited = FALSE; freeBlkFsets(q); set_free(f); tokensRefdInBlock = savetkref; /* MR21 */ if (MR_BlkErr) { /* MR21 */ set f, fArray[2]; /* MR21 */ f = ComputeErrorSet(q,1,1 /* use plus block bypass ? */ ); /* MR21 */ fArray[0]= empty; /* MR21 */ fArray[1]= set_dup(f); /* MR21 */ gen("if ("); /* MR21 */ genExprSets(fArray,1); /* note: destroys set arguments */ /* MR21 */ _gen(") { /* MR21 option -mrblksynerr */\n"); /* MR21 */ tabs++; /* MR21 */ tab(); /* MR21 */ _gen("/* nothing */ }\n"); /* MR21 */ tab(); /* MR21 */ makeErrorClause(q,f,1,1 /* use plus block bypass ? */ ); /* frees set */ /* MR21 */ tabs--; /* MR21 */ }; if (q->end->p1 != NULL) TRANS(q->end->p1); /* MR10 */ if (MRhoisting) { /* MR10 */ predicate_free(a); /* MR10 */ }; return; } gen("do {\n"); tabs++; f = genBlk(q, aPlusBlk, &max_k, &need_right_curly, &lastAltEmpty /* MR23 */); /* MR6 */ /* MR6 Sinan Karasu (sinan@tardis.ds.boeing.com) */ /* MR6 Failed to turn off guess mode when leaving block */ /* MR6 */ /* MR6 */ if ( has_guess_block_as_last_item(q) ) { /* MR10 */ gen("/* MR10 ()+ */ else {\n"); /* MR10 */ tabs++; /* MR10 */ need_right_curly++; /* MR10 */ gen("/* MR10 ()+ */ if ( !zzrv ) zzGUESS_DONE;\n"); /* MR6 */ gen("/* MR10 ()+ */ if ( zzcnt > 1 ) break;\n"); /* MR10 */ } else { /* MR10 */ gen("/* MR10 ()+ */ else {\n"); /* MR10 */ tabs++; /* MR10 */ need_right_curly++; /* MR10 */ gen("if ( zzcnt > 1 ) break;\n"); /* MR10 */ }; /* MR21 */ if (MR_BlkErr && 1 >= max_k) { /* MR21 */ set f; /* MR21 */ f = ComputeErrorSet(q,1,0 /* use plus block bypass ? */ ); /* MR21 */ tabs++; /* MR21 */ tab(); /* MR21 */ makeErrorClause(q,f,1,0 /* use plus block bypass ? */ ); /* frees set */ /* MR21 */ tabs--; /* MR21 */ } /* MR21 */ else { tab(); makeErrorClause(q,f,max_k,1 /* use plus block bypass ? */); /* MR21 I think this generates the wrong set ? */ /* MR21 because it includes the plus block bypass ? */ /* MR21 but I'm afraid to change it without additional checking */ } { int i; for (i=1; i<=need_right_curly; i++) {tabs--; gen("}\n");} } freeBlkFsets(q); gen("zzcnt++;"); if ( !GenCC ) _gen1(" zzLOOP(zztasp%d);", BlkLevel-1); _gen("\n"); if ( DemandLookahead ) { if ( !GenCC ) {gen1("LOOK(%d);\n", max_k);} else gen1("look(%d);\n", max_k); } --tabs; if ( q->parm!=NULL && q->predparm ) {gen1("} while (%s);\n", q->parm);} else gen("} while ( 1 );\n"); --BlkLevel; BLOCK_Tail(); q->visited = FALSE; tokensRefdInBlock = savetkref; /* MR21 */ if (MR_BlkErr) { /* MR21 */ set f, fArray[2]; /* MR21 */ f = ComputeErrorSet(q,1,1 /* use plus block bypass ? */ ); /* MR21 */ fArray[0]= empty; /* MR21 */ fArray[1]= set_dup(f); /* MR21 */ gen("if ("); /* MR21 */ genExprSets(fArray,1); /* note: destroys set arguments */ /* MR21 */ _gen(") { /* MR21 option -mrblksynerr */\n"); /* MR21 */ tabs++; /* MR21 */ tab(); /* MR21 */ _gen("/* nothing */ }\n"); /* MR21 */ tab(); /* MR21 */ makeErrorClause(q,f,1,1 /* use plus block bypass ? */ ); /* frees set */ /* MR21 */ tabs--; /* MR21 */ }; if (q->end->p1 != NULL) TRANS(q->end->p1); } /* * Generate code for a sub blk of alternatives of form: * * --o-G1--o-- * | ^ * v /| * o-G2-o| * | ^ * v | * .......... * | ^ * v / * o-Gn-o * * q points to the 1st junction of blk (upper-left). * q->end points to the last node (far right) in the blk. * Note that q->end->jtype must be 'EndBlk'. * The last node in every alt points to q->end. * * Generate code of the following form: * if ( First(G1) ) { * ...code for G1... * } * else if ( First(G2) ) { * ...code for G2... * } * ... * else { * ...code for Gn... * } */ void #ifdef __USE_PROTOS genSubBlk( Junction *q ) #else genSubBlk( q ) Junction *q; #endif { int max_k; set f; int need_right_curly; int lastAltEmpty; /* MR23 */ set savetkref; savetkref = tokensRefdInBlock; require(q->ntype == nJunction, "genSubBlk: not junction"); require(q->jtype == aSubBlk, "genSubBlk: not subblock"); OutLineInfo(output,q->line,FileStr[q->file]); BLOCK_Preamble(q); BlkLevel++; BlockPreambleOption(q,q->pFirstSetSymbol); /* MR21 */ f = genBlk(q, aSubBlk, &max_k, &need_right_curly, &lastAltEmpty /* MR23 */); /* MR23 Bypass error clause generation when exceptions are used in a sub block in which the last alternative is epsilon. Example: "(A | B | )". See multi-line note in genBlk near call to isEmptyAlt. */ if (FoundException && lastAltEmpty) { gen("/* MR23 skip error clause for (...| epsilon) when exceptions in use */\n"); } else { if ( q->p2 != NULL ) {tab(); makeErrorClause(q,f,max_k,0 /* use plus block bypass ? */ );} } { int i; for (i=1; i<=need_right_curly; i++) {tabs--; gen("}\n");} } freeBlkFsets(q); --BlkLevel; BLOCK_Tail(); if ( q->guess ) { gen("zzGUESS_DONE\n"); } /* must duplicate if (alpha)?; one guesses (validates), the * second pass matches */ if ( q->guess && analysis_point(q)==q ) { OutLineInfo(output,q->line,FileStr[q->file]); BLOCK_Preamble(q); BlkLevel++; f = genBlk(q, aSubBlk, &max_k, &need_right_curly, &lastAltEmpty /* MR23 */); if ( q->p2 != NULL ) {tab(); makeErrorClause(q,f,max_k,0 /* use plus block bypass ? */);} { int i; for (i=1; i<=need_right_curly; i++) {tabs--; gen("}\n");} } freeBlkFsets(q); --BlkLevel; BLOCK_Tail(); } tokensRefdInBlock = savetkref; if (q->end->p1 != NULL) TRANS(q->end->p1); } static int TnodesAllocatedPrevRule=0; /* * Generate code for a rule. * * rule--> o-->o-Alternatives-o-->o * Or, * rule--> o-->o-Alternative-o-->o * * The 1st junction is a RuleBlk. The second can be a SubBlk or just a junction * (one alternative--no block), the last is EndRule. * The second to last is EndBlk if more than one alternative exists in the rule. * * To get to the init-action for a rule, we must bypass the RuleBlk, * and possible SubBlk. * Mark any init-action as generated so genBlk() does not regenerate it. */ void #ifdef __USE_PROTOS genRule( Junction *q ) #else genRule( q ) Junction *q; #endif { const char * returnValueInitializer; do { /* MR10 Change recursion into iteration */ int max_k; set follow, rk, f; ActionNode *a; RuleEntry *r; int lastAltEmpty; /* MR23 */ static int file = -1; int need_right_curly; require(q->ntype == nJunction, "genRule: not junction"); require(q->jtype == RuleBlk, "genRule: not rule"); /* MR14 */ require (MR_BackTraceStack.count == 0,"-alpha MR_BackTraceStack.count != 0"); /* MR14 */ MR_pointerStackReset(&MR_BackTraceStack); /* MR14 */ if (AlphaBetaTrace) MR_MaintainBackTrace=1; CurRule=q->rname; /* MR11 */ r = (RuleEntry *) hash_get(Rname, q->rname); if ( r == NULL ) warnNoFL("Rule hash table is screwed up beyond belief"); if ( q->file != file ) /* open new output file if need to */ { /* MR6 */ /* MR6 Simpler to debug when output goes to stdout rather than a file */ /* MR6 */ /* MR6 */ if (UseStdout) { /* MR6 */ output = stdout; /* MR6 */ } else { /* MR6 */ if ( output != NULL) fclose( output ); /* MR6 */ output = fopen(OutMetaName(outname(FileStr[q->file])), "w"); /* MR6 */ }; require(output != NULL, "genRule: can't open output file"); #ifdef SPECIAL_FOPEN special_fopen_actions(OutMetaName(outname(FileStr[q->file]))); /* MR1 */ #endif if ( file == -1 ) genHdr1(q->file); else genHdr(q->file); file = q->file; } if (InfoM) { fprintf(stderr," rule %s\n",q->rname); fflush(output); }; #if 0 if (strcmp(q->rname,"***debug***") == 0) { fprintf(stderr,"***debug*** %s reached\n",q->rname); MR_break(); }; #endif DumpFuncHeader(q,r); tabs++; /* MR23 If there is a single return value then it can be initialized in the declaration using assignment syntax. If there are multiple return values then antlr creates a struct and initialization takes place element by element for each element of the struct. For multiple elements the initialization is by assignment so we have to wait until all declarations are done before emitting that code - because of restrictions in C which don't exist in C++. In the past (before MR23) the only kind of initialization was the PURIFY macro which was just a memset() of 0. Now we allow the user to specify an initial value. PURIFY is still used in C mode because C does not have constructors. However, PURIFY is not used in C++ mode because it might overwrite information created by elements which have their own ctor. */ if ( q->ret!=NULL ) { if ( hasMultipleOperands(q->ret) ) /* MR23 */ { /* Emit initialization code later. */ gen1("struct _rv%d _retv;\n",r->rulenum); } else { /* Emit initialization code now. */ tab(); DumpType(q->ret, output); returnValueInitializer = getInitializer(q->ret); if (returnValueInitializer == NULL) { /* MR23 */ gen(" _retv;\n"); /* MR1 MR3 */ } /* MR23 */ else { /* MR23 */ gen1(" _retv = %s;\n", returnValueInitializer); /* MR23 */ } /* MR23 */ } } OutLineInfo(output,q->line,FileStr[q->file]); if (InfoM) { fflush(output); }; gen("zzRULE;\n"); if ( FoundException ) { gen("int _sva=1;\n"); } if ( GenCC && GenAST ) gen("ASTBase *_ast = NULL, *_sibling = NULL, *_tail = NULL;\n"); if ( GenCC ) genTokenPointers(q); if ( GenCC&&GenAST ) genASTPointers(q); if ( q->el_labels!=NULL ) genElementLabels(q->el_labels); if ( FoundException ) gen("int _signal=NoSignal;\n"); if ( !GenCC ) gen1("zzBLOCK(zztasp%d);\n", BlkLevel); /* MR10 */ /* move zzTRACEIN to before init action */ /* MR10 */ if ( TraceGen ) { /* MR10 */ if ( GenCC ) {gen1("zzTRACEIN(\"%s\");\n", q->rname);} /* MR10 */ else gen1("zzTRACEIN((ANTLRChar *)\"%s\");\n", q->rname); /* MR10 */ } /* MR7 Moved PURIFY() to after all local variables have been declared */ /* MR7 so that the generated code is valid C as well as C++ */ /* MR7 Jan Mikkelsen 10-June-1997 */ /* MR23 Do the PURIFY macro only for C mode. C++ users should use constructors or initialization expressions. */ if ( q->ret != NULL ) /* MR7 */ { /* MR7 */ if (hasMultipleOperands(q->ret)) { /* MR23 */ if (PURIFY == TRUE) { gen1("PCCTS_PURIFY(_retv,sizeof(struct _rv%d))\n",r->rulenum); /* MR23 */ } } /* MR7 */ else { /* MR7 */ /* MR23 If there were only one return value operand and it had an initializer then it would have been initiailized in the declaration. */ returnValueInitializer = getInitializer(q->ret); /* MR23 */ if (returnValueInitializer == NULL) { /* MR23 */ if (PURIFY == TRUE) { gen("PCCTS_PURIFY(_retv,sizeof("); /* MR23 */ DumpType(q->ret, output); /* MR7 */ gen("))\n"); /* MR7 */ } } /* MR23 */ } /* MR7 */ if (hasMultipleOperands(q->ret)) { /* MR23 */ DumpInitializers(output, r, q->ret); /* MR23 */ } } if ( !GenCC ) gen("zzMake0;\n"); if ( FoundException ) gen("*_retsignal = NoSignal;\n"); if ( !GenCC ) gen("{\n"); if ( has_guess_block_as_first_item((Junction *)q->p1) ) { gen("zzGUESS_BLOCK\n"); } /* L o o k F o r I n i t A c t i o n */ if ( ((Junction *)q->p1)->jtype == aSubBlk ) a = findImmedAction( ((Junction *)q->p1)->p1 ); else a = findImmedAction( q->p1 ); /* only one alternative in rule */ if ( a!=NULL && !a->is_predicate) { /* MR21 */ if (!a->noHoist) dumpActionPlus(a, a->action, output, tabs, a->file, a->line, 1); a->done = 1; /* ignore action. We have already handled it */ } BlkLevel++; q->visited = TRUE; /* mark RULE as visited for FIRST/FOLLOW */ BlockPreambleOption((Junction *)q->p1, NULL); /* MR21 */ f = genBlk((Junction *)q->p1, RuleBlk, &max_k, &need_right_curly, &lastAltEmpty /* MR23 */); if ( q->p1 != NULL ) if ( ((Junction *)q->p1)->p2 != NULL ) {tab(); makeErrorClause((Junction *)q->p1,f,max_k,0 /* use plus block bypass ? */);} { int i; for (i=1; i<=need_right_curly; i++) {tabs--; gen("}\n");} } freeBlkFsets((Junction *)q->p1); q->visited = FALSE; --BlkLevel; if ( !GenCC ) gen1("zzEXIT(zztasp%d);\n", BlkLevel); genTraceOut(q); if ( q->ret!=NULL ) gen("return _retv;\n") else gen("return;\n"); /* E r r o r R e c o v e r y */ NewSet(); rk = empty; /* MR14 */ if (r->dontComputeErrorSet) { /* MR14 */ follow=empty; } else { MR_pointerStackReset(&MR_BackTraceStack); /* MR14 */ MR_ErrorSetComputationActive=1; REACH(q->end, 1, &rk, follow); MR_ErrorSetComputationActive=0; require (MR_BackTraceStack.count == 0,"K: MR_BackTraceStack.count != 0"); } FillSet( follow ); set_free( follow ); /* MR20 G. Hobbelt Isn't it so that "fail:" is ONLY referenced when: !FoundException || FoundGuessBlk ? Therefore add the "if" around this piece of code generation... Should guessing mode also use _handler label instead of "fail" when exception handling is active? gen can automatically put "if (guessing)" there so as to skip all kinds of user code. */ if ( !FoundException || FoundGuessBlk ) /* MR20 G. Hobbelt */ { /* MR20 G. Hobbelt */ _gen("fail:\n"); if ( !GenCC ) gen("zzEXIT(zztasp1);\n"); if ( FoundGuessBlk ) { if ( !GenCC ) {gen("if ( zzguessing ) zzGUESS_FAIL;\n");} else gen("if ( guessing ) zzGUESS_FAIL;\n"); } if ( q->erraction!=NULL ) dumpAction(q->erraction, output, tabs, q->file, q->line, 1); if ( GenCC ) { gen1("syn(zzBadTok, %s, zzMissSet, zzMissTok, zzErrk);\n", r->egroup==NULL?"(ANTLRChar *)\"\"":r->egroup); } else { gen1("zzsyn(zzMissText, zzBadTok, %s, zzMissSet, zzMissTok, zzErrk, zzBadText);\n", r->egroup==NULL?"(ANTLRChar *)\"\"":r->egroup); } gen3("%sresynch(setwd%d, 0x%x);\n", GenCC?"":"zz", wordnum, 1<ret!=NULL ) { genTraceOut(q); gen("return _retv;\n"); } else if ( q->exceptions!=NULL ) { genTraceOut(q); gen("return;\n"); } else if (!FoundException) { /* MR10 */ genTraceOut(q); /* MR10 */ }; } /* MR20 G. Hobbelt */ if ( !GenCC ) gen("}\n"); /* Gen code for exception handlers */ /* make sure each path out contains genTraceOut() */ if ( q->exceptions!=NULL ) { gen("/* exception handlers */\n"); dumpExceptions(q->exceptions); if ( !r->has_rule_exception ) { _gen("_handler:\n"); gen("zzdflthandlers(_signal,_retsignal);\n"); } /* MR20 G. Gobbelt The label "adios" is never referenced */ #if 0 _gen("_adios:\n"); #endif if ( q->ret!=NULL ) { genTraceOut(q); gen("return _retv;\n"); } else { genTraceOut(q); gen("return;\n"); } } else if ( FoundException ) { _gen("_handler:\n"); gen("zzdflthandlers(_signal,_retsignal);\n"); /* MR1 */ /* MR1 7-Apr-97 Fix suggested by: John Bair (jbair@iftime.com) */ /* MR1 */ if ( q->ret != NULL) { /* MR1 */ genTraceOut(q); /* MR10 */ gen("return _retv;\n"); /* MR1 */ } else { /* MR1 */ genTraceOut(q); /* MR10 */ gen("return;\n") ; /* MR1 */ }; /* MR1 */ } tabs--; gen("}\n"); /* MR10 Tired of looking at stacks that are as deep as the number of */ /* MR10 rules. Changes recursion to iteration. */ MR_releaseResourcesUsedInRule( (Node *) q ); /* MR10 */ if (InfoT) { fprintf(output,"\n/* tnodes created for rule %s: %d */\n", q->rname, (TnodesAllocated-TnodesAllocatedPrevRule) ); }; TnodesAllocatedPrevRule=TnodesAllocated; if (q->p2 == NULL) dumpAfterActions( output ); q=(Junction *)q->p2; require(q==NULL || q->jtype==RuleBlk,"RuleBlk p2 does not point to another RuleBlk"); } while (q != NULL); /**** The old code ****/ /**** if ( q->p2 != NULL ) {TRANS(q->p2);} ****/ /* generate code for next rule too */ /**** else dumpAfterActions( output ); ****/ } /* This is for the function definition, not the declaration. */ static void #ifdef __USE_PROTOS DumpFuncHeader( Junction *q, RuleEntry *r ) #else DumpFuncHeader( q, r ) Junction *q; RuleEntry *r; #endif { /* */ /* MR1 10-Apr-97 MR1 Simplify insertion of commas in function header */ /* */ int needComma; /* MR1 */ /* A N S I */ _gen("\n"); if ( q->ret!=NULL ) { if ( hasMultipleOperands(q->ret) ) /* MR23 */ { if (GenCC) gen2("%s::_rv%d\n", CurrentClassName, r->rulenum) else gen1("struct _rv%d\n",r->rulenum); } else { DumpType(q->ret, output); gen("\n"); } } else { _gen("void\n"); } /* MR1 */ /* MR1 10-Apr-97 133MR1 Replace __STDC__ with __USE_PROTOS */ /* MR1 */ if ( !GenCC ) _gen("#ifdef __USE_PROTOS\n"); /* MR1 */ if ( !GenCC ) gen2("%s%s(", RulePrefix, q->rname) else gen3("%s::%s%s(", CurrentClassName, RulePrefix,q->rname); /* If we generate C++ method names, we must hide default arguments */ /* which can appear in the parameter declaration list. */ /* NOTICE: this is done only here, for the method definition, but */ /* not for the method declaration inside the class */ /* definition. This is exactly the behaviour defined in */ /* C++ standard for default paramters. */ DumpANSIFunctionArgDef(output,q, 0 /* emit initializers ? */); _gen("\n"); if ( GenCC ) { gen("{\n"); return; } /* K & R */ gen("#else\n"); gen2("%s%s(", RulePrefix, q->rname); needComma=0; /* MR1 */ if ( GenAST ) /* MR1 */ { /* MR1 */ _gen("_root"); /* MR1 */ needComma=1; /* MR1 */ } /* MR1 */ if ( FoundException ) /* MR1 */ { /* MR1 */ if (needComma) {_gen(",");needComma=0;}; /* MR1 */ _gen("_retsignal"); /* MR1 */ needComma=1; /* MR1 */ } /* MR1 */ /* MR5 Change below by Jan Mikkelsen (janm@zeta.org.au) 26-May-97 MR5 */ DumpListOfParmNames( q->pdecl, output, needComma ); /* MR5 */ gen(")\n"); if ( GenAST ) gen("AST **_root;\n"); if ( FoundException ) gen("int *_retsignal;\n"); DumpOldStyleParms( q->pdecl, output ); gen("#endif\n"); gen("{\n"); } void #ifdef __USE_PROTOS DumpANSIFunctionArgDef(FILE *f, Junction *q, int bInitializer) #else DumpANSIFunctionArgDef(f,q,bInitializer) FILE *f; Junction *q; int bInitializer; #endif { if ( GenAST ) { if ( GenCC ) {fprintf(f,"ASTBase **_root");} else fprintf(f,"AST**_root"); if ( !FoundException && q->pdecl!=NULL ) fprintf(f,","); } if ( FoundException ) { if ( GenAST ) fprintf(f,","); fprintf(f,"int *_retsignal"); if ( q->pdecl!=NULL ) { fprintf(f,","); } } if ( q->pdecl!=NULL ) { DumpFormals(f, q->pdecl, bInitializer); /* MR23 */ } else { if ( !GenAST && !FoundException ) { fprintf(f,"void"); } } fprintf(f,")"); } void #ifdef __USE_PROTOS genJunction( Junction *q ) #else genJunction( q ) Junction *q; #endif { require(q->ntype == nJunction, "genJunction: not junction"); require(q->jtype == Generic, "genJunction: not generic junction"); if ( q->p1 != NULL ) TRANS(q->p1); if ( q->p2 != NULL ) TRANS(q->p2); } void #ifdef __USE_PROTOS genEndBlk( Junction *q ) #else genEndBlk( q ) Junction *q; #endif { } void #ifdef __USE_PROTOS genEndRule( Junction *q ) #else genEndRule( q ) Junction *q; #endif { } void #ifdef __USE_PROTOS genHdr( int file ) #else genHdr( file ) int file; #endif { int i; _gen("/*\n"); _gen(" * A n t l r T r a n s l a t i o n H e a d e r\n"); _gen(" *\n"); _gen(" * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001\n"); _gen(" * Purdue University Electrical Engineering\n"); _gen(" * With AHPCRC, University of Minnesota\n"); _gen1(" * ANTLR Version %s\n", Version); _gen(" *\n"); /* MR10 */ _gen(" * "); /* MR10 */ for (i=0 ; i < Save_argc ; i++) { /* MR10 */ _gen(" "); /* MR10 */ _gen1("%s",Save_argv[i]); /* MR10 */ }; _gen("\n"); _gen(" *\n"); _gen(" */\n\n"); if (FirstAction != NULL ) dumpAction( FirstAction, output, 0, -1, 0, 1); /* MR11 MR15b */ _gen1("#define ANTLR_VERSION %s\n", VersionDef); _gen("#include \"pcctscfg.h\"\n"); _gen("#include \"pccts_stdio.h\"\n"); if ( strcmp(ParserName, DefaultParserName)!=0 ) _gen2("#define %s %s\n", DefaultParserName, ParserName); if ( strcmp(ParserName, DefaultParserName)!=0 ) {_gen1("#include \"%s\"\n", RemapFileName);} OutLineInfo(output,1,FileStr[file]); if ( GenCC ) { if ( UserTokenDefsFile != NULL ) fprintf(output, "#include %s\n", UserTokenDefsFile); else fprintf(output, "#include \"%s\"\n", DefFileName); } if ( HdrAction != NULL ) dumpAction( HdrAction, output, 0, -1, 0, 1); if ( !GenCC && FoundGuessBlk ) { _gen("#define ZZCAN_GUESS\n"); _gen("#include \"pccts_setjmp.h\"\n"); /* MR15 K.J. Cummings (cummings@peritus.com) */ } if ( FoundException ) { _gen("#define EXCEPTION_HANDLING\n"); _gen1("#define NUM_SIGNALS %d\n", NumSignals); } if ( !GenCC && OutputLL_k > 1 ) _gen1("#define LL_K %d\n", OutputLL_k); if ( GenAST&&!GenCC ) _gen("#define GENAST\n\n"); if ( GenAST ) { if ( GenCC ) {_gen1("#include \"%s\"\n\n", ASTBASE_H);} else _gen("#include \"ast.h\"\n\n"); } if ( !GenCC && DemandLookahead ) _gen("#define DEMAND_LOOK\n\n"); #ifdef DUM if ( !GenCC && LexGen ) { _gen1("#define zzEOF_TOKEN %d\n", (TokenInd!=NULL?TokenInd[EofToken]:EofToken)); } #endif /* ###WARNING: This will have to change when SetWordSize changes */ if ( !GenCC ) _gen1("#define zzSET_SIZE %d\n", (GR_INT)(NumWords(TokenNum-1)*sizeof(unsigned))); if (TraceGen) { _gen("#ifndef zzTRACE_RULES\n"); /* MR20 */ _gen("#define zzTRACE_RULES\n"); /* MR20 */ _gen("#endif\n"); /* MR22 */ }; if ( !GenCC ) {_gen("#include \"antlr.h\"\n");} else { _gen1("#include \"%s\"\n", APARSER_H); _gen1("#include \"%s.h\"\n", CurrentClassName); } if ( !GenCC ) { if ( UserDefdTokens ) {_gen1("#include %s\n", UserTokenDefsFile);} /* still need this one as it has the func prototypes */ _gen1("#include \"%s\"\n", DefFileName); } /* still need this one as it defines the DLG interface */ if ( !GenCC ) _gen("#include \"dlgdef.h\"\n"); if ( LexGen && GenCC ) _gen1("#include \"%s\"\n", DLEXERBASE_H); if ( GenCC ) _gen1("#include \"%s\"\n", ATOKPTR_H); if ( !GenCC && LexGen ) _gen1("#include \"%s\"\n", ModeFileName); /* MR10 Ofer Ben-Ami (gremlin@cs.huji.ac.il) */ /* MR10 Finally, a definition of the Purify macro */ if (PURIFY == TRUE) { /* MR23 */ _gen("\n/* MR23 In order to remove calls to PURIFY use the antlr"); /* MR23 */ _gen(" -nopurify option */\n\n"); /* MR23 */ _gen("#ifndef PCCTS_PURIFY\n"); _gen("#define PCCTS_PURIFY(r,s) memset((char *) &(r),'\\0',(s));\n"); _gen("#endif\n\n"); } /* MR23 */ } void #ifdef __USE_PROTOS genHdr1( int file ) #else genHdr1( file ) int file; #endif { ListNode *p; genHdr(file); if ( GenAST ) { if ( !GenCC ) { _gen("#include \"ast.c\"\n"); _gen("zzASTgvars\n\n"); } } if ( !GenCC ) _gen("ANTLR_INFO\n"); if ( BeforeActions != NULL ) { for (p = BeforeActions->next; p!=NULL; p=p->next) { UserAction *ua = (UserAction *)p->elem; dumpAction( ua->action, output, 0, ua->file, ua->line, 1); } } if ( !FoundException ) return; if ( GenCC ) { _gen1("\nvoid %s::\n", CurrentClassName); _gen("zzdflthandlers( int _signal, int *_retsignal )\n"); _gen("{\n"); } else { _gen("\nvoid\n"); /* MR1 */ /* MR1 10-Apr-97 133MR1 Replace __STDC__ with __USE_PROTOS */ /* MR1 */ _gen("#ifdef __USE_PROTOS\n"); /* MR1 */ _gen("zzdflthandlers( int _signal, int *_retsignal )\n"); _gen("#else\n"); _gen("zzdflthandlers( _signal, _retsignal )\n"); _gen("int _signal;\n"); _gen("int *_retsignal;\n"); _gen("#endif\n"); _gen("{\n"); } tabs++; if ( DefaultExGroup!=NULL ) { dumpException(DefaultExGroup, 1); if ( !hasDefaultException(DefaultExGroup) ) { gen("default :\n"); tabs++; gen("*_retsignal = _signal;\n"); tabs--; gen("}\n"); } } else { gen("*_retsignal = _signal;\n"); } tabs--; _gen("}\n\n"); } void #ifdef __USE_PROTOS genStdPCCTSIncludeFile( FILE *f,char *gate ) /* MR10 */ #else genStdPCCTSIncludeFile( f , gate) /* MR10 */ FILE *f; char * gate; /* MR10 */ #endif { /* MR10 Ramanathan Santhanam (ps@kumaran.com) */ /* MR10 Same preprocessor symbol use to gate stdpccts.h */ /* MR10 even when two grammars are in use. */ /* MR10 Derive gate symbol from -fh filename */ if (gate == NULL) { fprintf(f,"#ifndef STDPCCTS_H\n"); /* MR10 */ fprintf(f,"#define STDPCCTS_H\n"); /* MR10 */ } else { fprintf(f,"#ifndef STDPCCTS_%s_H\n",gate); /* MR10 */ fprintf(f,"#define STDPCCTS_%s_H\n",gate); /* MR10 */ }; fprintf(f,"/*\n"); if (gate == NULL) { fprintf(f," * %s -- P C C T S I n c l u d e\n", stdpccts); } else { fprintf(f," * Standard PCCTS include file with -fh %s -- P C C T S I n c l u d e\n", stdpccts); } fprintf(f," *\n"); fprintf(f," * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001\n"); fprintf(f," * Purdue University Electrical Engineering\n"); fprintf(f," * With AHPCRC, University of Minnesota\n"); fprintf(f," * ANTLR Version %s\n", Version); fprintf(f," */\n\n"); fprintf(f,"#ifndef ANTLR_VERSION\n"); fprintf(f,"#define ANTLR_VERSION %s\n", VersionDef); fprintf(f,"#endif\n\n"); if (FirstAction != NULL ) dumpAction(FirstAction, f, 0, -1, 0, 1); /* MR11 */ fprintf(f,"#include \"pcctscfg.h\"\n"); fprintf(f,"#include \"pccts_stdio.h\"\n"); if ( GenCC ) { if ( UserDefdTokens ) fprintf(f, "#include %s\n", UserTokenDefsFile); else { fprintf(f, "#include \"%s\"\n", DefFileName); } fprintf(f, "#include \"%s\"\n", ATOKEN_H); if ( HdrAction != NULL ) dumpAction( HdrAction, f, 0, -1, 0, 1); fprintf(f, "#include \"%s\"\n", ATOKENBUFFER_H); if ( OutputLL_k > 1 ) fprintf(f,"static const unsigned LL_K=%d;\n", OutputLL_k); if ( GenAST ) { fprintf(f, "#include \"%s\"\n", ASTBASE_H); } if (TraceGen) { fprintf(f,"#ifndef zzTRACE_RULES\n"); /* MR20 */ fprintf(f,"#define zzTRACE_RULES\n"); /* MR20 */ fprintf(f,"#endif\n"); /* MR22 */ }; fprintf(f,"#include \"%s\"\n", APARSER_H); fprintf(f,"#include \"%s.h\"\n", CurrentClassName); if ( LexGen ) fprintf(f,"#include \"%s\"\n", DLEXERBASE_H); fprintf(f, "#endif\n"); return; } if ( strcmp(ParserName, DefaultParserName)!=0 ) fprintf(f, "#define %s %s\n", DefaultParserName, ParserName); if ( strcmp(ParserName, DefaultParserName)!=0 ) fprintf(f, "#include \"%s\"\n", RemapFileName); if ( UserTokenDefsFile != NULL ) fprintf(f, "#include %s\n", UserTokenDefsFile); if ( HdrAction != NULL ) dumpAction( HdrAction, f, 0, -1, 0, 1); if ( FoundGuessBlk ) { fprintf(f,"#define ZZCAN_GUESS\n"); fprintf(f,"#include \"pccts_setjmp.h\"\n"); } if (TraceGen) { fprintf(f,"#ifndef zzTRACE_RULES\n"); /* MR20 */ fprintf(f,"#define zzTRACE_RULES\n"); /* MR20 */ fprintf(f,"#endif\n"); /* MR22 */ }; if ( OutputLL_k > 1 ) fprintf(f,"#define LL_K %d\n", OutputLL_k); if ( GenAST ) fprintf(f,"#define GENAST\n"); if ( FoundException ) { /* MR1 7-Apr-97 1.33MR1 */ /* MR1 Fix suggested by: */ /* MR1 Francois-Xavier Fontaine (fontaine_f@istvax.ist.lu) */ fprintf(f,"#define EXCEPTION_HANDLING\n"); /* MR1 */ fprintf(f,"#define NUM_SIGNALS %d\n", NumSignals); /* MR1 */ } if ( DemandLookahead ) fprintf(f,"#define DEMAND_LOOK\n"); #ifdef DUM if ( LexGen ) fprintf(f, "#define zzEOF_TOKEN %d\n", (TokenInd!=NULL?TokenInd[EofToken]:EofToken)); #endif /* ###WARNING: This will have to change when SetWordSize changes */ fprintf(f, "#define zzSET_SIZE %d\n", (GR_INT)(NumWords(TokenNum-1)*sizeof(unsigned))); if (TraceGen) { fprintf(f,"#ifndef zzTRACE_RULES\n"); /* MR20 */ fprintf(f,"#define zzTRACE_RULES\n"); /* MR20 */ fprintf(f,"#endif\n"); /* MR22 */ }; fprintf(f,"#include \"antlr.h\"\n"); if ( GenAST ) fprintf(f,"#include \"ast.h\"\n"); if ( UserDefdTokens ) fprintf(f, "#include %s\n", UserTokenDefsFile); /* still need this one as it has the func prototypes */ fprintf(f, "#include \"%s\"\n", DefFileName); /* still need this one as it defines the DLG interface */ fprintf(f,"#include \"dlgdef.h\"\n"); /* don't need this one unless DLG is used */ if ( LexGen ) fprintf(f,"#include \"%s\"\n", ModeFileName); fprintf(f,"#endif\n"); } /* dump action 's' to file 'output' starting at "local" tab 'tabs' Dump line information in front of action if GenLineInfo is set If file == -1 then GenLineInfo is ignored. The user may redefine the LineInfoFormatStr to his/her liking most compilers will like the default, however. June '93; changed so that empty lines are left alone so that line information is correct for the compiler/debuggers. */ void #ifdef __USE_PROTOS dumpAction( char *s, FILE *output, int tabs, int file, int line, int final_newline ) #else dumpAction( s, output, tabs, file, line, final_newline ) char *s; FILE *output; int tabs; int file; int line; int final_newline; #endif { int inDQuote, inSQuote; require(s!=NULL, "dumpAction: NULL action"); require(output!=NULL, eMsg1("dumpAction: output FILE is NULL for %s",s)); if ( GenLineInfo && file != -1 ) { OutLineInfo(output,line,FileStr[file]); } PastWhiteSpace( s ); /* don't print a tab if first non-white char is a # (preprocessor command) */ if ( *s!='#' ) {TAB;} inDQuote = inSQuote = FALSE; while ( *s != '\0' ) { if ( *s == '\\' ) { fputc( *s++, output ); /* Avoid '"' Case */ if ( *s == '\0' ) return; if ( *s == '\'' ) fputc( *s++, output ); if ( *s == '\"' ) fputc( *s++, output ); } if ( *s == '\'' ) { if ( !inDQuote ) inSQuote = !inSQuote; } if ( *s == '"' ) { if ( !inSQuote ) inDQuote = !inDQuote; } if ( *s == '\n' ) { fputc('\n', output); s++; PastWhiteSpace( s ); if ( *s == '}' ) { --tabs; TAB; fputc( *s++, output ); continue; } if ( *s == '\0' ) return; if ( *s != '#' ) /* #define, #endif etc.. start at col 1 */ { TAB; } } if ( *s == '}' && !(inSQuote || inDQuote) ) { --tabs; /* Indent one fewer */ } if ( *s == '{' && !(inSQuote || inDQuote) ) { tabs++; /* Indent one more */ } fputc( *s, output ); s++; } if ( final_newline ) fputc('\n', output); } static void #ifdef __USE_PROTOS dumpAfterActions( FILE *output ) #else dumpAfterActions( output ) FILE *output; #endif { ListNode *p; require(output!=NULL, "dumpAfterActions: output file was NULL for some reason"); if ( AfterActions != NULL ) { for (p = AfterActions->next; p!=NULL; p=p->next) { UserAction *ua = (UserAction *)p->elem; dumpAction( ua->action, output, 0, ua->file, ua->line, 1); } } fclose( output ); } /* * Find the next action in the stream of execution. Do not pass * junctions with more than one path leaving them. * Only pass generic junctions. * * Scan forward while (generic junction with p2==NULL) * If we stop on an action, return ptr to the action * else return NULL; */ static ActionNode * #ifdef __USE_PROTOS findImmedAction( Node *q ) #else findImmedAction( q ) Node *q; #endif { Junction *j; require(q!=NULL, "findImmedAction: NULL node"); require(q->ntype>=1 && q->ntype<=NumNodeTypes, "findImmedAction: invalid node"); while ( q->ntype == nJunction ) { j = (Junction *)q; if ( j->jtype != Generic || j->p2 != NULL ) return NULL; q = j->p1; if ( q == NULL ) return NULL; } if ( q->ntype == nAction ) return (ActionNode *)q; return NULL; } static void #ifdef __USE_PROTOS dumpRetValAssign( char *retval, char *ret_def, RuleRefNode * ruleRef /* MR30 */) #else dumpRetValAssign( retval, ret_def, ruleRef /* MR30 */) char *retval; char *ret_def; RuleRefNode *ruleRefNode; #endif { char *q = ret_def; tab(); while ( *retval != '\0' && *q != '\0') { while ( isspace((*retval)) ) retval++; while ( *retval!=',' && *retval!='\0' ) fputc(*retval++, output); fprintf(output, " = _trv."); DumpNextNameInDef(&q, output); while ( isspace(*q) ) q++; fputc(';', output); fputc(' ', output); if ( *retval == ',' ) retval++; } if (*retval == '\0' && *q != '\0') { /* MR30 */ errFL("Fewer output values than output formals for rule reference", /* MR30 */ FileStr[ruleRef->file],ruleRef->line); } if (*retval != '\0' && *q == '\0') { /* MR30 */ errFL("More output actuals than output formals for rule reference", /* MR30 */ FileStr[ruleRef->file],ruleRef->line); } } /* This function computes the set of tokens that can possibly be seen k * tokens in the future from point j */ static set #ifdef __USE_PROTOS ComputeErrorSet( Junction *j, int k, int usePlusBlockBypass) #else ComputeErrorSet( j, k, usePlusBlockBypass ) Junction *j; int k; int usePlusBlockBypass; #endif { Junction *alt1; set a, rk, f; require(j->ntype==nJunction, "ComputeErrorSet: non junction passed"); f = rk = empty; for (alt1=j; alt1!=NULL; alt1 = (Junction *)alt1->p2) { if (alt1->ignore && ! usePlusBlockBypass) continue; /* MR21 - Ignore aPlusBlk forward p2 */ REACH(alt1->p1, k, &rk, a); require(set_nil(rk), "ComputeErrorSet: rk != nil"); set_free(rk); set_orin(&f, a); set_free(a); } return f; } static char * #ifdef __USE_PROTOS tokenFollowSet(TokNode *p) #else tokenFollowSet(p) TokNode *p; #endif { static char buf[100]; set rk, a; int n; rk = empty; REACH(p->next, 1, &rk, a); require(set_nil(rk), "rk != nil"); set_free(rk); n = DefErrSet( &a, 0, NULL ); set_free(a); if ( GenCC ) sprintf(buf, "err%d", n); else sprintf(buf, "zzerr%d", n); return buf; } static void #ifdef __USE_PROTOS makeErrorClause( Junction *q, set f, int max_k, int usePlusBlockBypass ) #else makeErrorClause( q, f, max_k, usePlusBlockBypass ) Junction *q; set f; int max_k; int usePlusBlockBypass; #endif { char * handler_id=""; /* MR7 */ int nilf=0; /* MR13 */ RuleEntry *ruleEntry; /* MR14 */ if ( FoundException ) { _gen("else {\n"); tabs++; if ( FoundGuessBlk ) { if ( GenCC ) {gen("if ( guessing ) goto fail;\n");} else gen("if ( zzguessing ) goto fail;\n"); } gen("if (_sva) _signal=NoViableAlt;\n"); gen("else _signal=NoSemViableAlt;\n"); if (q->outerEG != NULL) { handler_id=q->outerEG->altID; #if 0 } else { printf("q->curAltNum=%d q->exception_label=%s\n",q->curAltNum,q->exception_label); gen("*** DEBUG *** outerEG==NULL\n"); #endif }; gen1("goto %s_handler; /* MR7 */\n",handler_id); /* MR7 */ tabs--; gen("}\n"); return; } if ( max_k == 1 ) { /* MR13 */ nilf=set_nil(f); if ( GenCC ) { _gen1("else {FAIL(1,err%d", DefErrSet1(1,&f,1,NULL)); } else { _gen1("else {zzFAIL(1,zzerr%d", DefErrSet1(1,&f,1,NULL)); }; set_free(f); } else { int i; set_free(f); if ( GenCC ) {_gen1("else {FAIL(%d", max_k);} else _gen1("else {zzFAIL(%d", max_k); ruleEntry = (RuleEntry *) hash_get(Rname,q->rname); for (i=1; i<=max_k; i++) { /* MR14 */ if (ruleEntry->dontComputeErrorSet) { /* MR14 */ f=empty; } else { f = ComputeErrorSet(q, i, usePlusBlockBypass /* use plus block bypass ? */ ); } if ( GenCC ) {_gen1(",err%d", DefErrSet( &f, 1, NULL ));} else _gen1(",zzerr%d", DefErrSet( &f, 1, NULL )); set_free(f); } } _gen(",&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}\n"); /* MR13 */ if (nilf) { /* MR13 */ errFL("empty error set for alt - probably because of undefined rule or infinite left recursion", /* MR13 */ FileStr[q->file],q->line); /* MR13 */ gen(" /* MR13 empty error set for this alt - undef rule ? infinite left recursion ? */"); /* MR13 */ }; } static /* MR7 */ #ifdef __USE_PROTOS char * findOuterHandlerLabel(ExceptionGroup *eg) /* MR7 */ #else char * findOuterHandlerLabel(eg) /* MR7 */ ExceptionGroup *eg; /* MR7 */ #endif { char *label=NULL; /* MR7 */ ExceptionGroup *outerEG; /* MR7 */ if (eg->forRule == 0) { /* MR7 */ if (eg->labelEntry != NULL) { /* MR7 */ outerEG=eg->labelEntry->outerEG; /* MR7 */ if (outerEG != NULL) { /* MR7 */ label=outerEG->altID; /* MR7 */ outerEG->used=1; /* MR7 */ }; /* MR7 */ } else if (eg->outerEG != NULL) { /* MR7 */ outerEG=eg->outerEG; /* MR7 */ label=outerEG->altID; /* MR7 */ outerEG->used=1; /* MR7 */ }; /* MR7 */ }; /* MR7 */ return (label==NULL ? "" : label); /* MR7 */ } /* MR7 */ /*** debug ***/ #if 0 ** static /* MR7 */ ** #ifdef __USE_PROTOS ** char * findOuterAltHandlerLabel(Junction *startJ) /* MR7 */ ** #else ** char * findOuterAltHandlerLabel(startJ) /* MR7 */ ** Junction *startJ; /* MR7 */ ** #endif ** { /* MR7 */ ** char *label=NULL; /* MR7 */ ** Junction *alt; /* MR7 */ ** /* MR7 */ ** for (alt=startJ; alt != NULL; alt=alt->outerAltstart) { /* MR7 */ ** label=alt->exception_label; /* MR7 */ ** if (label != NULL) break; /* MR7 */ ** }; /* MR7 */ ** return (label==NULL ? "" : label); /* MR7 */ ** } /* MR7 */ #endif #ifdef __USE_PROTOS static void OutLineInfo(FILE *file,int line,char *fileName) #else static void OutLineInfo(file,line,fileName) FILE * file; int line; char * fileName; #endif { static char * prevFileName=NULL; static char * prevFileNameMS=NULL; char * p; char * q; if (! GenLineInfo) return; if (!GenLineInfoMS) { fprintf(file, LineInfoFormatStr,line,fileName); } else { if (fileName == prevFileName) { fprintf(file, LineInfoFormatStr,line,prevFileNameMS); } else { if (prevFileNameMS != NULL) free (prevFileNameMS); prevFileNameMS=(char *)calloc(1,strlen(fileName)+1); require(prevFileNameMS != NULL,"why not do this in calloc wrapper"); q=prevFileNameMS; for (p=fileName; *p != 0; p++) { *q=*p; if (*q == '\\') *q='/'; q++; } } prevFileName=fileName; }; } #if 0 /* MR21 */ #ifdef __USE_PROTOS void OutFirstSetSymbol(Junction *q, char * pSymbol) #else void OutFirstSetSymbol(q, pSymbol) Junction* q; char * pSymbol #endif { set f; if (pSymbol == NULL) return; gen1("/** #FirstSetSymbol(%s) **/\n",pSymbol); f = ComputeErrorSet(q, 1, 0 /* use plus block bypass ? */); DefErrSetWithSuffix (0 /* nil ok */, &f,0 /* no substitute */, pSymbol, ""); set_free(f); } #endif /* MR21 */ #ifdef __USE_PROTOS void BlockPreambleOption(Junction *q, char * pSymbol) #else void BlockPreambleOption(q, pSymbol) Junction* q; char * pSymbol; #endif { set f = empty; if (pSymbol != NULL) { f = ComputeErrorSet(q, 1, 0 /* use plus block bypass ? */); gen1("/** #FirstSetSymbol(%s) **/\n",pSymbol); DefErrSetWithSuffix (0 /* nil ok */, &f,0 /* no substitute */, pSymbol, ""); } set_free(f); } /* MR21 */ void #ifdef __USE_PROTOS dumpActionPlus(ActionNode *a, char *s, FILE *output, int tabs, int file, int line, int final_newline ) #else dumpActionPlus(a, s, output, tabs, file, line, final_newline ) ActionNode *a; char *s; FILE *output; int tabs; int file; int line; int final_newline; #endif { dumpAction(s,output,tabs,file,line,final_newline); } #if 0 ** #ifdef __USE_PROTOS ** void MR_ErrorSets(Junction *q, int max_k, int usePlusBlockBypass) ** #else ** void MR_ErrorSets(q, max_k, usePlusBlockBypass) ** Junction *q; ** int max_k; ** int usePlusBlockBypass; ** #endif ** { ** int k; ** set setResult; ** Junction* alt1; ** Junction* p; ** set rk; ** ** require (max_k <= CLL_k, "k > CLL_k"); ** ** ** for (k = 1; k <= CLL_k; k++) {set_clr(q->fset[k]); } ** ** for (k = 1; k <= max_k; k++) { ** for (alt1=q; alt1 != NULL; alt1 = (Junction *)alt1->p2) ** { ** if (alt1->ignore && ! usePlusBlockBypass) continue; ** p = analysis_point((Junction *)alt1->p1); ** REACH(p, k, &rk, setResult); ** require(set_nil(rk), "rk != nil"); ** set_orin(&q->fset[k], setResult); ** } ** } ** } #endif #ifdef __USE_PROTOS void DumpInitializers(FILE* output, RuleEntry *r, char * pReturn) #else void DumpInitializers(output, r, pReturn) FILE* output; RuleEntry *r; char * pReturn; #endif { char *p = pReturn; char *pDataType; char *pSymbol; char *pEqualSign; char *pValue; char *pSeparator; int nest = 0; char *q; require(pReturn!=NULL, "DumpInitializer: invalid string"); while (*p != 0) { p = endFormal(p, &pDataType, &pSymbol, &pEqualSign, &pValue, &pSeparator, &nest); if (nest != 0) return; if (pValue != NULL) { tab(); q = strBetween(pSymbol, pEqualSign, pSeparator); fprintf(output, "_retv.%s", q); q = strBetween(pValue, NULL, pSeparator); fprintf(output, " = %s;\n", q); } } } #ifdef __USE_PROTOS void DumpFormals(FILE* output, char * pReturn, int bInitializer) #else void DumpFormals(output, pReturn, bInitializer) FILE* output; char * pReturn; int bInitializer; #endif { char *p = pReturn; char *pDataType; char *pSymbol; char *pEqualSign; char *pValue; char *pSeparator; int nest = 0; char *q; int count = 0; require(pReturn!=NULL, "DumpFormals: invalid string"); while (*p != 0) { p = endFormal(p, &pDataType, &pSymbol, &pEqualSign, &pValue, &pSeparator, &nest); if (nest != 0) return; if (count > 0) fprintf(output,","); if (pDataType != NULL && pSymbol != NULL) { q = strBetween(pDataType, pSymbol, pSeparator); fprintf(output, "%s", q); q = strBetween(pSymbol, pEqualSign, pSeparator); fprintf(output," %s",q); if (pValue != NULL) { q = strBetween(pValue, NULL, pSeparator); if (bInitializer != 0) { fprintf(output, " = %s", q); } } } count++; } } /* MR23 Check for empty alt in a more intelligent way. Previously, an empty alt for genBlk had to point directly to the endBlock. This did not work once I changed {...} blocks to look like (...|...| epsilon) since there were intervening generics. This fixes the problem for this particular case. Things like actions or empty blocks of various kinds will still cause problems, but I wasnt't prepared to handle pathological cases like (A|()*). It does handle (A | ()), which is a recommended idiom for epsilon. Actually, this isn't quite correct since it doesn't handle the case of the ignore bit in the plus block bypass, but I'm too tired to figure out the correct fix, and will just work around it. */ #ifdef __USE_PROTOS int isEmptyAlt(Node * alt, Node * endBlock) #else int isEmptyAlt(alt, endBlock) Node * alt; Node * endBlock; #endif { Node * n = alt; Junction * j; while (n != endBlock) { switch (n->ntype) { case nRuleRef: return 0; case nToken: return 0; case nAction: return 0; case nJunction: goto JUNCTION; default: fatal_internal("Invalid node type"); return 0; } JUNCTION: j = (Junction *) n; switch (j->jtype) { case Generic: { n = j->p1; goto NEXT; } case aSubBlk: { n = j->p1; /* MR26 */ goto NEXT; /* MR26 */ } case EndBlk: return 0; case EndRule: return 1; default: return 0; } NEXT: continue; } return 1; } gtkwave-3.3.86/contrib/pccts/antlr/fcache.c0000664000175000017500000000555013166335473020062 0ustar bybellbybell/* * fcache.c * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * ANTLR 1.33MR10 * */ #include #include #include "pcctscfg.h" #include "set.h" #include "syn.h" #include "hash.h" #include "generic.h" #ifdef __USE_PROTOS CacheEntry *dumpFcache1(char *prev) #else CacheEntry *dumpFcache1(prev) char *prev; #endif { Entry **table=Fcache; int low=0; int hi=0; CacheEntry *least=NULL; Entry **p; for (p=table; p<&(table[HashTableSize]); p++) { CacheEntry *q =(CacheEntry *) *p; if ( q != NULL && low==0 ) low = p-table; while ( q != NULL ) { if (strcmp(q->str,prev) > 0) { if (least == NULL) { least=q; } else { if (strcmp(q->str,least->str) < 0) { least=q; }; }; }; q = q->next; }; if ( *p != NULL ) hi = p-table; } return least; } #ifdef __USE_PROTOS void reportFcache(CacheEntry *q) #else void reportFcache(q) CacheEntry *q; #endif { char *qstr; fprintf(stdout,"\nrule "); for (qstr=q->str; *qstr != '*' ; qstr++) { fprintf(stdout,"%c",*qstr); }; qstr++; if (*qstr == 'i') fprintf(stdout," First["); if (*qstr == 'o') fprintf(stdout," Follow["); qstr++; fprintf(stdout,"%s]",qstr); if (q->incomplete) fprintf(stdout," *** incomplete ***"); fprintf(stdout,"\n"); MR_dumpTokenSet(stdout,1,q->fset); } void #ifdef __USE_PROTOS DumpFcache(void) #else DumpFcache() #endif { char *prev=""; int n=0; CacheEntry *next; fprintf(stdout,"\n\nDump of First/Follow Cache\n"); for(;;) { next=dumpFcache1(prev); if (next == NULL) break; reportFcache(next); ++n; prev=next->str; }; fprintf(stdout,"\nEnd dump of First/Follow Cache\n"); } gtkwave-3.3.86/contrib/pccts/antlr/makefile10000664000175000017500000000542613166335473020270 0ustar bybellbybell# # Makefile for ANTLR 1.33 # # SOFTWARE RIGHTS # # We reserve no LEGAL rights to the Purdue Compiler Construction Tool # Set (PCCTS) -- PCCTS is in the public domain. An individual or # company may do whatever they wish with source code distributed with # PCCTS or the code generated by PCCTS, including the incorporation of # PCCTS, or its output, into commerical software. # # We encourage users to develop software with PCCTS. However, we do ask # that credit is given to us for developing PCCTS. By "credit", # we mean that if you incorporate our source code into one of your # programs (commercial product, research project, or otherwise) that you # acknowledge this fact somewhere in the documentation, research report, # etc... If you like PCCTS and have developed a nice tool with the # output, please mention that you developed it using PCCTS. In # addition, we ask that this header remain intact in our source code. # As long as these guidelines are kept, we expect to continue enhancing # this system and expect to make other tools available as they are # completed. # # ANTLR 1.33 # Terence Parr # Parr Research Corporation # with Purdue University # and AHPCRC, University of Minnesota # 1989-1995 # # Ported to Borland C++, IBM C-Set/2 and Microsoft 6.0 by # Ed Harfmann # Micro Data Base Systems # Lafayette, Indiana # SET=../support/set PCCTS_H=../h # # UNIX (default) # CC=cc ANTLR=../bin/antlr DLG=../bin/dlg OBJ_EXT=o OUT_OBJ = -o ANSI=-ansi AOTHER= CFLAGS= -O0 -g -I. -I$(SET) -I$(PCCTS_H) -DUSER_ZZSYN $(COTHER) $(ANSI) -DZZLEXBUFSIZE=32000 # # SGI Users, use this CFLAGS # #CFLAGS= -O -I. -I$(SET) -I$(PCCTS_H) -DUSER_ZZSYN -woff 3262 OBJ=antlr.o scan.o err.o bits.o build.o fset2.o fset.o gen.o \ globals.o hash.o lex.o main.o misc.o set.o pred.o egman.o mrhoist.o fcache.o $(OBJOTHER) antlr : $(OBJ) $(SRC) $(CC) $(CFLAGS) -o antlr $(OBJ) mv antlr ../bin # what files does PCCTS generate (both ANTLR and DLG) PCCTS_GEN=antlr.c scan.c err.c tokens.h mode.h parser.dlg stdpccts.h remap.h SRC=antlr.c scan.c err.c bits.c build.c fset2.c fset.c gen.c globals.c \ hash.c lex.c main.c misc.c $(SET)/set.c pred.c egman.c mrhoist.c fcache.c # # Don't worry about the ambiguity messages coming from antlr # for making antlr.c etc... [should be 10 of them, I think] # antlr.c stdpccts.h parser.dlg tokens.h err.c : antlr.g $(ANTLR) -gh antlr.g $(AOTHER) antlr.o : antlr.c mode.h tokens.h scan.o : scan.c mode.h tokens.h scan.c mode.h: parser.dlg $(DLG) -C2 parser.dlg scan.c set.o : $(SET)/set.c $(CC) $(CFLAGS) -c -o set.o $(SET)/set.c # # ****** These next targets are common to UNIX and PC world ******** # #clean up all the intermediate files clean: rm -f *.$(OBJ_EXT) core #remove everything in clean plus the PCCTS files generated scrub: rm -f $(PCCTS_GEN) *.$(OBJ_EXT) core gtkwave-3.3.86/contrib/pccts/antlr/antlrPPC.make0000664000175000017500000000644013166335473021026 0ustar bybellbybell# Target: antlrPPC # Sources: ::support:set:set.c # antlr.c # bits.c # build.c # egman.c # err.c # fcache.c # fset2.c # fset.c # gen.c # globals.c # hash.c # lex.c # main.c # misc.c # mrhoist.c # pred.c # scan.c # Created: Sunday, May 17, 1998 10:24:53 PM # Author: Kenji Tanaka MAKEFILE = antlrPPC.make ¥MondoBuild¥ = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified Includes = ¶ -i "::h:" ¶ -i "::support:set:" Sym¥PPC = ObjDir¥PPC = :Obj: PPCCOptions = {Includes} {Sym¥PPC} -w off -d MPW -d __STDC__=1 -d USER_ZZSYN Objects¥PPC = ¶ "{ObjDir¥PPC}set.c.x" ¶ "{ObjDir¥PPC}antlr.c.x" ¶ "{ObjDir¥PPC}bits.c.x" ¶ "{ObjDir¥PPC}build.c.x" ¶ "{ObjDir¥PPC}egman.c.x" ¶ "{ObjDir¥PPC}err.c.x" ¶ "{ObjDir¥PPC}fcache.c.x" ¶ "{ObjDir¥PPC}fset2.c.x" ¶ "{ObjDir¥PPC}fset.c.x" ¶ "{ObjDir¥PPC}gen.c.x" ¶ "{ObjDir¥PPC}globals.c.x" ¶ "{ObjDir¥PPC}hash.c.x" ¶ "{ObjDir¥PPC}lex.c.x" ¶ "{ObjDir¥PPC}main.c.x" ¶ "{ObjDir¥PPC}misc.c.x" ¶ "{ObjDir¥PPC}mrhoist.c.x" ¶ "{ObjDir¥PPC}pred.c.x" ¶ "{ObjDir¥PPC}scan.c.x" antlrPPC ÄÄ {¥MondoBuild¥} {Objects¥PPC} PPCLink ¶ -o {Targ} {Sym¥PPC} ¶ {Objects¥PPC} ¶ -t 'MPST' ¶ -c 'MPS ' ¶ "{SharedLibraries}InterfaceLib" ¶ "{SharedLibraries}StdCLib" ¶ #"{SharedLibraries}MathLib" ¶ "{PPCLibraries}StdCRuntime.o" ¶ "{PPCLibraries}PPCCRuntime.o" ¶ "{PPCLibraries}PPCToolLibs.o" "{ObjDir¥PPC}set.c.x" Ä {¥MondoBuild¥} "::support:set:set.c" {PPCC} "::support:set:set.c" -o {Targ} {PPCCOptions} "{ObjDir¥PPC}antlr.c.x" Ä {¥MondoBuild¥} antlr.c {PPCC} antlr.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}bits.c.x" Ä {¥MondoBuild¥} bits.c {PPCC} bits.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}build.c.x" Ä {¥MondoBuild¥} build.c {PPCC} build.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}egman.c.x" Ä {¥MondoBuild¥} egman.c {PPCC} egman.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}err.c.x" Ä {¥MondoBuild¥} err.c {PPCC} err.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}fcache.c.x" Ä {¥MondoBuild¥} fcache.c {PPCC} fcache.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}fset2.c.x" Ä {¥MondoBuild¥} fset2.c {PPCC} fset2.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}fset.c.x" Ä {¥MondoBuild¥} fset.c {PPCC} fset.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}gen.c.x" Ä {¥MondoBuild¥} gen.c {PPCC} gen.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}globals.c.x" Ä {¥MondoBuild¥} globals.c {PPCC} globals.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}hash.c.x" Ä {¥MondoBuild¥} hash.c {PPCC} hash.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}lex.c.x" Ä {¥MondoBuild¥} lex.c {PPCC} lex.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}main.c.x" Ä {¥MondoBuild¥} main.c {PPCC} main.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}misc.c.x" Ä {¥MondoBuild¥} misc.c {PPCC} misc.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}mrhoist.c.x" Ä {¥MondoBuild¥} mrhoist.c {PPCC} mrhoist.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}pred.c.x" Ä {¥MondoBuild¥} pred.c {PPCC} pred.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}scan.c.x" Ä {¥MondoBuild¥} scan.c {PPCC} scan.c -o {Targ} {PPCCOptions} antlrPPC ÄÄ antlr.r Rez antlr.r -o antlrPPC -a Install Ä antlrPPC Duplicate -y antlrPPC "{MPW}"Tools:antlr gtkwave-3.3.86/contrib/pccts/antlr/antlr.c0000664000175000017500000027160013166335473017772 0ustar bybellbybell/* * A n t l r T r a n s l a t i o n H e a d e r * * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001 * Purdue University Electrical Engineering * With AHPCRC, University of Minnesota * ANTLR Version 1.33MR33 * * ./antlr -gh ./antlr.g * */ #define ANTLR_VERSION 13333 #include "pcctscfg.h" #include "pccts_stdio.h" #include "pcctscfg.h" #include "set.h" #include #include "syn.h" #include "hash.h" #include "generic.h" #define zzcr_attr(attr,tok,t) #define zzSET_SIZE 20 #include "antlr.h" #include "tokens.h" #include "dlgdef.h" #include "mode.h" /* MR23 In order to remove calls to PURIFY use the antlr -nopurify option */ #ifndef PCCTS_PURIFY #define PCCTS_PURIFY(r,s) memset((char *) &(r),'\0',(s)); #endif ANTLR_INFO /* MR20 G. Hobbelt For Borland C++ 4.x & 5.x compiling with ALL warnings enabled */ #if defined(__TURBOC__) #pragma warn -aus /* unused assignment of 'xxx' */ #endif #ifdef __USE_PROTOS static void chkToken(char *, char *, char *, int); #else static void chkToken(); #endif #ifdef __USE_PROTOS static int isDLGmaxToken(char *Token); /* MR3 */ #else static int isDLGmaxToken(); /* MR3 */ #endif static int class_nest_level = 0; /* MR20 G. Hobbelt extern definitions moved to antlr.h */ void #ifdef __USE_PROTOS grammar(void) #else grammar() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { Graph g; { zzBLOCK(zztasp2); zzMake0; { for (;;) { if ( !((setwd1[LA(1)]&0x1))) break; if ( (LA(1)==94) ) { zzmatch(94); zzCONSUME; zzmatch(Action); if ( HdrAction==NULL ) { HdrAction = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require(HdrAction!=NULL, "rule grammar: cannot allocate header action"); strcpy(HdrAction, LATEXT(1)); } else warn("additional #header statement ignored"); zzCONSUME; } else { if ( (LA(1)==95) ) { zzmatch(95); zzCONSUME; zzmatch(Action); if ( FirstAction==NULL ) { FirstAction = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require(FirstAction!=NULL, "rule grammar: cannot allocate #first action"); strcpy(FirstAction, LATEXT(1)); } else { warn("additional #first statement ignored"); }; zzCONSUME; } else { if ( (LA(1)==96) ) { zzmatch(96); zzCONSUME; zzmatch(QuotedTerm); if ( GenCC ) { warn("#parser meta-op incompatible with -CC; ignored"); } else { if ( strcmp(ParserName,"zzparser")==0 ) { ParserName=StripQuotes(mystrdup(LATEXT(1))); if ( RulePrefix[0]!='\0' ) { warn("#parser meta-op incompatible with '-gp prefix'; '-gp' ignored"); RulePrefix[0]='\0'; } } else warn("additional #parser statement ignored"); } zzCONSUME; } else { if ( (LA(1)==97) ) { zzmatch(97); zzCONSUME; zzmatch(QuotedTerm); { char *fname; zzantlr_state st; FILE *f; struct zzdlg_state dst; UserTokenDefsFile = mystrdup(LATEXT(1)); zzsave_antlr_state(&st); zzsave_dlg_state(&dst); fname = mystrdup(LATEXT(1)); f = fopen(StripQuotes(fname), "r"); if ( f==NULL ) {warn(eMsg1("cannot open token defs file '%s'", fname+1));} else { ANTLRm(enum_file(fname+1), f, PARSE_ENUM_FILE); UserDefdTokens = 1; } zzrestore_antlr_state(&st); zzrestore_dlg_state(&dst); } zzCONSUME; } else break; /* MR6 code for exiting loop "for sure" */ } } } zzLOOP(zztasp2); } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { for (;;) { if ( !((setwd1[LA(1)]&0x2))) break; if ( (LA(1)==Action) ) { zzmatch(Action); { UserAction *ua = newUserAction(LATEXT(1)); ua->file = action_file; ua->line = action_line; if ( class_nest_level>0 ) list_add(&class_before_actions, ua); else list_add(&BeforeActions, ua); } zzCONSUME; } else { if ( (LA(1)==108) ) { laction(); } else { if ( (LA(1)==109) ) { lmember(); } else { if ( (LA(1)==110) ) { lprefix(); } else { if ( (LA(1)==116) ) { aLexclass(); } else { if ( (LA(1)==120) ) { token(); } else { if ( (LA(1)==117) ) { error(); } else { if ( (LA(1)==118) ) { tclass(); } else { if ( (LA(1)==111) ) { aPred(); } else { if ( (LA(1)==133) ) { default_exception_handler(); } else { if ( (LA(1)==99) ) { class_def(); } else { if ( (LA(1)==98) ) { zzmatch(98); if ( class_nest_level==0 ) warn("missing class definition for trailing '}'"); class_nest_level--; zzCONSUME; } else break; /* MR6 code for exiting loop "for sure" */ } } } } } } } } } } } zzLOOP(zztasp2); } zzEXIT(zztasp2); } } rule(); g=zzaArg(zztasp1,3); SynDiag = (Junction *) zzaArg(zztasp1,3 ).left; { zzBLOCK(zztasp2); zzMake0; { for (;;) { if ( !((setwd1[LA(1)]&0x4))) break; if ( (LA(1)==NonTerminal) ) { rule(); if ( zzaArg(zztasp2,1 ).left!=NULL ) { g.right = NULL; /* MR21a */ /* Avoid use of a malformed graph when CannotContinue */ /* MR21a */ /* is already set */ /* MR21a */ /* MR21a */ if (! (CannotContinue && g.left == NULL)) { /* MR21a */ g = Or(g, zzaArg(zztasp2,1)); /* MR21a */ } /* MR21a */ } } else { if ( (LA(1)==116) ) { aLexclass(); } else { if ( (LA(1)==120) ) { token(); } else { if ( (LA(1)==117) ) { error(); } else { if ( (LA(1)==118) ) { tclass(); } else { if ( (LA(1)==111) ) { aPred(); } else { if ( (LA(1)==99) ) { class_def(); } else { if ( (LA(1)==98) ) { zzmatch(98); if ( class_nest_level==0 ) warn("missing class definition for trailing '}'"); class_nest_level--; zzCONSUME; } else break; /* MR6 code for exiting loop "for sure" */ } } } } } } } zzLOOP(zztasp2); } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { for (;;) { if ( !((setwd1[LA(1)]&0x8))) break; if ( (LA(1)==Action) ) { zzmatch(Action); { UserAction *ua = newUserAction(LATEXT(1)); ua->file = action_file; ua->line = action_line; if ( class_nest_level>0 ) list_add(&class_after_actions, ua); else list_add(&AfterActions, ua); } zzCONSUME; } else { if ( (LA(1)==108) ) { laction(); } else { if ( (LA(1)==109) ) { lmember(); } else { if ( (LA(1)==110) ) { lprefix(); } else { if ( (LA(1)==117) ) { error(); } else { if ( (LA(1)==118) ) { tclass(); } else { if ( (LA(1)==99) ) { class_def(); } else { if ( (LA(1)==111) ) { aPred(); } else { if ( (LA(1)==98) ) { zzmatch(98); if ( class_nest_level==0 ) warn("missing class definition for trailing '}'"); class_nest_level--; zzCONSUME; } else break; /* MR6 code for exiting loop "for sure" */ } } } } } } } } zzLOOP(zztasp2); } zzEXIT(zztasp2); } } zzmatch(Eof); zzCONSUME; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); CannotContinue=TRUE; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd1, 0x10); } } void #ifdef __USE_PROTOS class_def(void) #else class_def() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { int go=1; char name[MaxRuleName+1]; zzmatch(99); zzCONSUME; { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==NonTerminal) ) { zzmatch(NonTerminal); if(go) strncpy(name,LATEXT(1),MaxRuleName); zzCONSUME; } else { if ( (LA(1)==TokenTerm) ) { zzmatch(TokenTerm); if(go) strncpy(name,LATEXT(1),MaxRuleName); zzCONSUME; } else {zzFAIL(1,zzerr1,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } if ( CurrentClassName[0]!='\0' && strcmp(CurrentClassName,name)!=0 && GenCC ) { err("only one grammar class allowed in this release"); go = 0; } else strcpy(CurrentClassName, name); if ( !GenCC ) { err("class meta-op used without C++ option"); } { zzBLOCK(zztasp2); zzMake0; { while ( (setwd1[LA(1)]&0x20) ) { zzsetmatch(zzerr2, zzerr3); if (ClassDeclStuff == NULL) { /* MR10 */ ClassDeclStuff=(char *)calloc(MaxClassDeclStuff+1,sizeof(char)); /* MR10 */ }; /* MR10 */ strncat(ClassDeclStuff," ",MaxClassDeclStuff); /* MR10 */ strncat(ClassDeclStuff,LATEXT(1),MaxClassDeclStuff); /* MR22 */ do { /* MR22 */ if (0 == strcmp(LATEXT(1),"public")) break; /* MR22 */ if (0 == strcmp(LATEXT(1),"private")) break; /* MR22 */ if (0 == strcmp(LATEXT(1),"protected")) break; /* MR22 */ if (0 == strcmp(LATEXT(1),"virtual")) break; /* MR22 */ if (0 == strcmp(LATEXT(1),",")) break; /* MR22 */ if (0 == strcmp(LATEXT(1),":")) break; /* MR22 */ if (BaseClassName != NULL) break; /* MR22 */ BaseClassName=(char *)calloc(strlen(LATEXT(1))+1,sizeof(char)); /* MR22 */ require(BaseClassName!=NULL, "rule grammar: cannot allocate base class name"); /* MR22 */ strcpy(BaseClassName,LATEXT(1)); /* MR22 */ } while (0); /* MR10 */ zzCONSUME; zzLOOP(zztasp2); } zzEXIT(zztasp2); } } zzmatch(102); no_classes_found = 0; if ( class_nest_level>=1 ) {warn("cannot have nested classes");} else class_nest_level++; zzCONSUME; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); CannotContinue=TRUE; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd1, 0x40); } } void #ifdef __USE_PROTOS rule(void) #else rule() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { ExceptionGroup *eg; RuleEntry *q; Junction *p; Graph r; int f, l; ECnode *e; set toksrefd, rulesrefd; char *pdecl=NULL, *ret=NULL, *a; CurRetDef = CurParmDef = NULL; CurExGroups = NULL; CurElementLabels = NULL; CurAstLabelsInActions = NULL; /* MR27 */ /* We want a new element label hash table for each rule */ if ( Elabel!=NULL ) killHashTable(Elabel); Elabel = newHashTable(); attribsRefdFromAction = empty; zzmatch(NonTerminal); q=NULL; if ( hash_get(Rname, LATEXT(1))!=NULL ) { err(eMsg1("duplicate rule definition: '%s'",LATEXT(1))); CannotContinue=TRUE; } else { q = (RuleEntry *)hash_add(Rname, LATEXT(1), (Entry *)newRuleEntry(LATEXT(1))); CurRule = q->str; } CurRuleNode = q; f = CurFile; l = zzline; NumRules++; zzCONSUME; { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==103) ) { zzmatch(103); if ( q!=NULL ) q->noAST = TRUE; zzCONSUME; } else { if ( (setwd1[LA(1)]&0x80) ) { } else {zzFAIL(1,zzerr4,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { ; if ( (setwd2[LA(1)]&0x1) ) { { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==104) ) { zzmatch(104); zzCONSUME; } else { if ( (LA(1)==PassAction) ) { } else {zzFAIL(1,zzerr5,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } zzmatch(PassAction); pdecl = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require(pdecl!=NULL, "rule rule: cannot allocate param decl"); strcpy(pdecl, LATEXT(1)); CurParmDef = pdecl; zzCONSUME; } else { if ( (setwd2[LA(1)]&0x2) ) { } else {zzFAIL(1,zzerr6,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==105) ) { zzmatch(105); zzCONSUME; zzmatch(PassAction); ret = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require(ret!=NULL, "rule rule: cannot allocate ret type"); strcpy(ret, LATEXT(1)); CurRetDef = ret; zzCONSUME; } else { if ( (setwd2[LA(1)]&0x4) ) { } else {zzFAIL(1,zzerr7,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==QuotedTerm) ) { zzmatch(QuotedTerm); if ( q!=NULL ) q->egroup=mystrdup(LATEXT(1)); zzCONSUME; } else { if ( (LA(1)==106) ) { } else {zzFAIL(1,zzerr8,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } if ( GenEClasseForRules && q!=NULL ) { e = newECnode; require(e!=NULL, "cannot allocate error class node"); if ( q->egroup == NULL ) {a = q->str; a[0] = (char)toupper(a[0]);} else a = q->egroup; if ( Tnum( a ) == 0 ) { e->tok = addTname( a ); list_add(&eclasses, (char *)e); if ( q->egroup == NULL ) a[0] = (char)tolower(a[0]); /* refers to itself */ list_add(&(e->elist), mystrdup(q->str)); } else { warn(eMsg1("default errclass for '%s' would conflict with token/errclass/tokclass",a)); if ( q->egroup == NULL ) a[0] = (char)tolower(a[0]); free((char *)e); } } BlkLevel++; if (BlkLevel >= MAX_BLK_LEVEL) fatal("Blocks nested too deeply"); /* MR23 */ CurBlockID_array[BlkLevel] = CurBlockID; /* MR23 */ CurAltNum_array[BlkLevel] = CurAltNum; zzmatch(106); inAlt=1; zzCONSUME; block( &toksrefd, &rulesrefd ); r = makeBlk(zzaArg(zztasp1,7),0, NULL /* pFirstSetSymbol */ ); CurRuleBlk = (Junction *)r.left; CurRuleBlk->blockid = CurBlockID; CurRuleBlk->jtype = RuleBlk; if ( q!=NULL ) CurRuleBlk->rname = q->str; CurRuleBlk->file = f; CurRuleBlk->line = l; CurRuleBlk->pdecl = pdecl; CurRuleBlk->ret = ret; CurRuleBlk->lock = makelocks(); CurRuleBlk->pred_lock = makelocks(); CurRuleBlk->tokrefs = toksrefd; CurRuleBlk->rulerefs = rulesrefd; p = newJunction(); /* add EndRule Node */ ((Junction *)r.right)->p1 = (Node *)p; r.right = (Node *) p; p->jtype = EndRule; p->lock = makelocks(); p->pred_lock = makelocks(); CurRuleBlk->end = p; if ( q!=NULL ) q->rulenum = NumRules; zzaArg(zztasp1,7) = r; /* MR23 */ CurBlockID_array[BlkLevel] = (-1); /* MR23 */ CurAltNum_array[BlkLevel] = (-1); --BlkLevel; altFixup();leFixup();egFixup(); zzmatch(107); inAlt=0; zzCONSUME; { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==Action) ) { zzmatch(Action); a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require(a!=NULL, "rule rule: cannot allocate error action"); strcpy(a, LATEXT(1)); CurRuleBlk->erraction = a; zzCONSUME; } else { if ( (setwd2[LA(1)]&0x8) ) { } else {zzFAIL(1,zzerr9,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { while ( (LA(1)==133) ) { eg = exception_group(); if ( eg!=NULL ) { list_add(&CurExGroups, (void *)eg); if (eg->label == NULL || *eg->label=='\0' ) q->has_rule_exception = 1; } zzLOOP(zztasp2); } zzEXIT(zztasp2); } } if ( q==NULL ) zzaArg(zztasp1,0 ).left = NULL; else zzaArg(zztasp1,0) = zzaArg(zztasp1,7); CurRuleBlk->exceptions = CurExGroups; CurRuleBlk->el_labels = CurElementLabels; CurRuleNode->ast_labels_in_actions = CurAstLabelsInActions; CurRuleNode = NULL; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); CannotContinue=TRUE; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd2, 0x10); } } void #ifdef __USE_PROTOS laction(void) #else laction() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { char *a; zzmatch(108); zzCONSUME; zzmatch(Action); a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require(a!=NULL, "rule laction: cannot allocate action"); strcpy(a, LATEXT(1)); list_add(&LexActions, a); zzCONSUME; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); CannotContinue=TRUE; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd2, 0x20); } } void #ifdef __USE_PROTOS lmember(void) #else lmember() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { char *a; zzmatch(109); zzCONSUME; zzmatch(Action); /* MR1 */ if (! GenCC) { /* MR1 */ err("Use #lexmember only in C++ mode (to insert code in DLG class header"); /* MR1 */ } else { /* MR1 */ a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); /* MR1 */ require(a!=NULL, "rule lmember: cannot allocate action"); /* MR1 */ strcpy(a, LATEXT(1)); /* MR1 */ list_add(&LexMemberActions, a); /* MR1 */ }; /* MR1 */ zzCONSUME; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); CannotContinue=TRUE; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd2, 0x40); } } void #ifdef __USE_PROTOS lprefix(void) #else lprefix() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { char *a; zzmatch(110); zzCONSUME; zzmatch(Action); /* MR1 */ if (! GenCC) { /* MR1 */ err("Use #lexprefix only in C++ mode (to insert code in DLG class header"); /* MR1 */ } else { /* MR1 */ a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); /* MR1 */ require(a!=NULL, "rule lprefix: cannot allocate action"); /* MR1 */ strcpy(a, LATEXT(1)); /* MR1 */ list_add(&LexPrefixActions, a); /* MR1 */ }; /* MR1 */ zzCONSUME; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); CannotContinue=TRUE; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd2, 0x80); } } void #ifdef __USE_PROTOS aPred(void) #else aPred() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { PredEntry *predEntry=NULL; char *name=NULL; Predicate *predExpr=NULL; char *predLiteral=NULL; int save_file; int save_line; int predExprPresent=0; zzmatch(111); MR_usingPredNames=1; /* will need to use -mrhoist version of genPredTree */ zzCONSUME; zzmatch(TokenTerm); name=mystrdup(LATEXT(1)); zzCONSUME; /* don't free - referenced in predicates */ CurPredName=(char *)calloc(1,strlen(name) + 10); strcat(CurPredName,"#pred "); strcat(CurPredName,name); predEntry=(PredEntry *) hash_get(Pname,name); if (predEntry != NULL) { warnFL(eMsg1("#pred %s previously defined - ignored",name), FileStr[action_file],action_line); name=NULL; }; { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==Pred) ) { zzmatch(Pred); predLiteral=mystrdup(LATEXT(1)); save_line=action_line; save_file=action_file; zzCONSUME; { zzBLOCK(zztasp3); zzMake0; { if ( (setwd3[LA(1)]&0x1) ) { predExpr = predOrExpr(); predExprPresent=1; } else { if ( (setwd3[LA(1)]&0x2) ) { } else {zzFAIL(1,zzerr10,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } if (predLiteral != NULL && name != NULL) { /* * predExpr may be NULL due to syntax errors * or simply omitted by the user */ predEntry=newPredEntry(name); predEntry->file=save_file; predEntry->line=save_line; predExpr=MR_predFlatten(predExpr); predEntry->predLiteral=predLiteral; if (! predExprPresent || predExpr == NULL) { predExpr=new_pred(); predExpr->expr=predLiteral; predExpr->source=newActionNode(); predExpr->source->action=predExpr->expr; predExpr->source->rname=CurPredName; predExpr->source->line=action_line; predExpr->source->file=action_file; predExpr->source->is_predicate=1; predExpr->k=predicateLookaheadDepth(predExpr->source); }; predEntry->pred=predExpr; hash_add(Pname,name,(Entry *)predEntry); predExpr=NULL; }; predicate_free(predExpr); } else { if ( (setwd3[LA(1)]&0x4) ) { save_line=zzline; save_file=CurFile; predExpr = predOrExpr(); if (predExpr != NULL && name != NULL) { predEntry=newPredEntry(name); predEntry->file=CurFile; predEntry->line=zzline; predExpr=MR_predFlatten(predExpr); predEntry->pred=predExpr; hash_add(Pname,name,(Entry *)predEntry); predExpr=NULL; }; predicate_free(predExpr); } else {zzFAIL(1,zzerr11,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==107) ) { zzmatch(107); zzCONSUME; } else { if ( (setwd3[LA(1)]&0x8) ) { } else {zzFAIL(1,zzerr12,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); predicate_free(predExpr); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd3, 0x10); } } Predicate * #ifdef __USE_PROTOS predOrExpr(void) #else predOrExpr() #endif { Predicate * _retv; zzRULE; zzBLOCK(zztasp1); PCCTS_PURIFY(_retv,sizeof(Predicate * )) zzMake0; { Predicate *ORnode; Predicate *predExpr; Predicate **tail=NULL; predExpr = predAndExpr(); ORnode=new_pred(); ORnode->expr=PRED_OR_LIST; if (predExpr != NULL) { ORnode->down=predExpr; tail=&predExpr->right; }; { zzBLOCK(zztasp2); zzMake0; { while ( (LA(1)==112) ) { zzmatch(112); zzCONSUME; predExpr = predAndExpr(); if (predExpr != NULL) { *tail=predExpr; tail=&predExpr->right; }; zzLOOP(zztasp2); } zzEXIT(zztasp2); } } _retv=ORnode; ORnode=NULL; zzEXIT(zztasp1); return _retv; fail: zzEXIT(zztasp1); predicate_free(ORnode); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd3, 0x20); return _retv; } } Predicate * #ifdef __USE_PROTOS predAndExpr(void) #else predAndExpr() #endif { Predicate * _retv; zzRULE; zzBLOCK(zztasp1); PCCTS_PURIFY(_retv,sizeof(Predicate * )) zzMake0; { Predicate *ANDnode; Predicate *predExpr; Predicate **tail=NULL; predExpr = predPrimary(); ANDnode=new_pred(); ANDnode->expr=PRED_AND_LIST; if (predExpr != NULL) { ANDnode->down=predExpr; tail=&predExpr->right; }; { zzBLOCK(zztasp2); zzMake0; { while ( (LA(1)==113) ) { zzmatch(113); zzCONSUME; predExpr = predPrimary(); if (predExpr != NULL) { *tail=predExpr; tail=&predExpr->right; }; zzLOOP(zztasp2); } zzEXIT(zztasp2); } } _retv=ANDnode; ANDnode=NULL; zzEXIT(zztasp1); return _retv; fail: zzEXIT(zztasp1); predicate_free(ANDnode); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd3, 0x40); return _retv; } } Predicate * #ifdef __USE_PROTOS predPrimary(void) #else predPrimary() #endif { Predicate * _retv; zzRULE; zzBLOCK(zztasp1); PCCTS_PURIFY(_retv,sizeof(Predicate * )) zzMake0; { char *name=NULL; PredEntry *predEntry=NULL; Predicate *predExpr=NULL; if ( (LA(1)==TokenTerm) ) { zzmatch(TokenTerm); name=mystrdup(LATEXT(1)); zzCONSUME; predEntry=(PredEntry *) hash_get(Pname,name); if (predEntry == NULL) { warnFL(eMsg1("no previously defined #pred with name \"%s\"",name), FileStr[CurFile],zzline); name=NULL; _retv=NULL; } else { predExpr=predicate_dup(predEntry->pred); predExpr->predEntry=predEntry; _retv=predExpr; }; } else { if ( (LA(1)==114) ) { zzmatch(114); zzCONSUME; predExpr = predOrExpr(); zzmatch(115); _retv=predExpr; zzCONSUME; } else { if ( (LA(1)==103) ) { zzmatch(103); zzCONSUME; predExpr = predPrimary(); predExpr->inverted=!predExpr->inverted; _retv=predExpr; } else {zzFAIL(1,zzerr13,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } zzEXIT(zztasp1); return _retv; fail: zzEXIT(zztasp1); predicate_free(predExpr); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd3, 0x80); return _retv; } } void #ifdef __USE_PROTOS aLexclass(void) #else aLexclass() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { zzmatch(116); zzCONSUME; zzmatch(TokenTerm); lexclass(mystrdup(LATEXT(1))); zzCONSUME; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); CannotContinue=TRUE; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd4, 0x1); } } void #ifdef __USE_PROTOS error(void) #else error() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { char *t=NULL; ECnode *e; int go=1; TermEntry *p; zzmatch(117); zzCONSUME; { zzBLOCK(zztasp2); zzMake0; { ; if ( (LA(1)==TokenTerm) ) { zzmatch(TokenTerm); t=mystrdup(LATEXT(1)); zzCONSUME; } else { if ( (LA(1)==QuotedTerm) ) { zzmatch(QuotedTerm); t=mystrdup(LATEXT(1)); zzCONSUME; } else {zzFAIL(1,zzerr14,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } e = newECnode; require(e!=NULL, "cannot allocate error class node"); e->lexclass = CurrentLexClass; if ( Tnum( (t=StripQuotes(t)) ) == 0 ) { if ( hash_get(Texpr, t) != NULL ) warn(eMsg1("errclass name conflicts with regular expression '%s'",t)); e->tok = addTname( t ); set_orel(e->tok, &imag_tokens); require((p=(TermEntry *)hash_get(Tname, t)) != NULL, "hash table mechanism is broken"); p->classname = 1; /* entry is errclass name, not token */ list_add(&eclasses, (char *)e); } else { warn(eMsg1("redefinition of errclass or conflict w/token or tokclass '%s'; ignored",t)); free( (char *)e ); go=0; } zzmatch(102); zzCONSUME; { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==NonTerminal) ) { zzmatch(NonTerminal); if ( go ) t=mystrdup(LATEXT(1)); zzCONSUME; } else { if ( (LA(1)==TokenTerm) ) { zzmatch(TokenTerm); if ( go ) t=mystrdup(LATEXT(1)); zzCONSUME; } else { if ( (LA(1)==QuotedTerm) ) { zzmatch(QuotedTerm); if ( go ) t=mystrdup(LATEXT(1)); zzCONSUME; } else {zzFAIL(1,zzerr15,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } zzEXIT(zztasp2); } } if ( go ) list_add(&(e->elist), t); { zzBLOCK(zztasp2); zzMake0; { while ( (setwd4[LA(1)]&0x2) ) { { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==NonTerminal) ) { zzmatch(NonTerminal); if ( go ) t=mystrdup(LATEXT(1)); zzCONSUME; } else { if ( (LA(1)==TokenTerm) ) { zzmatch(TokenTerm); if ( go ) t=mystrdup(LATEXT(1)); zzCONSUME; } else { if ( (LA(1)==QuotedTerm) ) { zzmatch(QuotedTerm); if ( go ) t=mystrdup(LATEXT(1)); zzCONSUME; } else {zzFAIL(1,zzerr16,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } zzEXIT(zztasp3); } } if ( go ) list_add(&(e->elist), t); zzLOOP(zztasp2); } zzEXIT(zztasp2); } } zzmatch(98); zzCONSUME; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); CannotContinue=TRUE; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd4, 0x4); } } void #ifdef __USE_PROTOS tclass(void) #else tclass() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { char *t=NULL; TCnode *e; int go=1,tok,totok; TermEntry *p, *term, *toterm; char *akaString=NULL; int save_file; int save_line; char *totext=NULL; zzmatch(118); zzCONSUME; zzmatch(TokenTerm); t=mystrdup(LATEXT(1)); zzCONSUME; e = newTCnode; require(e!=NULL, "cannot allocate token class node"); e->lexclass = CurrentLexClass; if ( Tnum( t ) == 0 ) { e->tok = addTname( t ); set_orel(e->tok, &imag_tokens); set_orel(e->tok, &tokclasses); require((p=(TermEntry *)hash_get(Tname, t)) != NULL, "hash table mechanism is broken"); p->classname = 1; /* entry is class name, not token */ p->tclass = e; /* save ptr to this tclass def */ list_add(&tclasses, (char *)e); } else { warn(eMsg1("redefinition of tokclass or conflict w/token '%s'; ignored",t)); free( (char *)e ); go=0; } { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==114) ) { zzmatch(114); zzCONSUME; zzmatch(QuotedTerm); akaString=mystrdup(StripQuotes(LATEXT(1))); /* MR11 */ save_file=CurFile;save_line=zzline; /* MR23 */ zzCONSUME; zzmatch(115); zzCONSUME; } else { if ( (LA(1)==102) ) { } else {zzFAIL(1,zzerr17,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } /* MR23 */ if (p!= NULL && akaString != NULL) { /* MR23 */ if (p->akaString != NULL) { /* MR23 */ if (strcmp(p->akaString,akaString) != 0) { /* MR23 */ warnFL(eMsg2("this #tokclass statment conflicts with a previous #tokclass %s(\"%s\") statement", /* MR23 */ t,p->akaString), /* MR23 */ FileStr[save_file],save_line); /* MR23 */ }; /* MR23 */ } else { /* MR23 */ p->akaString=akaString; /* MR23 */ }; /* MR23 */ }; /* MR23 */ zzmatch(102); zzCONSUME; { zzBLOCK(zztasp2); int zzcnt=1; zzMake0; { do { { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==TokenTerm) ) { zzmatch(TokenTerm); if ( go ) { term = (TermEntry *) hash_get(Tname, LATEXT(1)); if ( term==NULL && UserDefdTokens ) { err("implicit token definition not allowed with #tokdefs"); go = 0; } else {t=mystrdup(LATEXT(1)); tok=addTname(LATEXT(1));} } zzCONSUME; { zzBLOCK(zztasp4); zzMake0; { if ( (LA(1)==119) ) { zzmatch(119); zzCONSUME; zzmatch(TokenTerm); if ( go ) { toterm = (TermEntry *) hash_get(Tname, LATEXT(1)); if ( toterm==NULL && UserDefdTokens ) { err("implicit token definition not allowed with #tokdefs"); go = 0; } else { totext=mystrdup(LATEXT(1)); totok=addTname(LATEXT(1)); } } zzCONSUME; } else { if ( (setwd4[LA(1)]&0x8) ) { } else {zzFAIL(1,zzerr18,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp4); } } } else { if ( (LA(1)==QuotedTerm) ) { zzmatch(QuotedTerm); if ( go ) { term = (TermEntry *) hash_get(Texpr, LATEXT(1)); if ( term==NULL && UserDefdTokens ) { err("implicit token definition not allowed with #tokdefs"); go = 0; } else {t=mystrdup(LATEXT(1)); tok=addTexpr(LATEXT(1));} } zzCONSUME; } else {zzFAIL(1,zzerr19,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } if ( go ) { if (totext == NULL) { list_add(&(e->tlist), t); } else { list_add(&(e->tlist),".."); list_add(&(e->tlist),t); list_add(&(e->tlist),totext); } totext=NULL; } zzLOOP(zztasp2); } while ( (setwd4[LA(1)]&0x10) ); zzEXIT(zztasp2); } } zzmatch(98); zzCONSUME; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); CannotContinue=TRUE; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd4, 0x20); } } void #ifdef __USE_PROTOS token(void) #else token() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { char *t=NULL, *e=NULL, *a=NULL; int tnum=0; char *akaString=NULL; TermEntry *te;int save_file=0,save_line=0; zzmatch(120); tokenActionActive=1; zzCONSUME; { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==TokenTerm) ) { zzmatch(TokenTerm); t=mystrdup(LATEXT(1)); zzCONSUME; { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==114) ) { zzmatch(114); zzCONSUME; zzmatch(QuotedTerm); akaString=mystrdup(StripQuotes(LATEXT(1))); /* MR11 */ save_file=CurFile;save_line=zzline; /* MR11 */ zzCONSUME; zzmatch(115); zzCONSUME; } else { if ( (setwd4[LA(1)]&0x40) ) { } else {zzFAIL(1,zzerr20,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==121) ) { zzmatch(121); zzCONSUME; zzmatch(122); tnum = atoi(LATEXT(1)); zzCONSUME; } else { if ( (setwd4[LA(1)]&0x80) ) { } else {zzFAIL(1,zzerr21,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } } else { if ( (setwd5[LA(1)]&0x1) ) { } else {zzFAIL(1,zzerr22,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==QuotedTerm) ) { zzmatch(QuotedTerm); e=mystrdup(LATEXT(1)); zzCONSUME; } else { if ( (setwd5[LA(1)]&0x2) ) { } else {zzFAIL(1,zzerr23,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==Action) ) { zzmatch(Action); a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require(a!=NULL, "rule token: cannot allocate action"); strcpy(a, LATEXT(1)); zzCONSUME; } else { if ( (setwd5[LA(1)]&0x4) ) { } else {zzFAIL(1,zzerr24,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==107) ) { zzmatch(107); zzCONSUME; } else { if ( (setwd5[LA(1)]&0x8) ) { } else {zzFAIL(1,zzerr25,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } chkToken(t, e, a, tnum); if (t != NULL) { te=(TermEntry *)hash_get(Tname,t); if (te != NULL && akaString != NULL) { if (te->akaString != NULL) { if (strcmp(te->akaString,akaString) != 0) { warnFL(eMsg2("this #token statment conflicts with a previous #token %s(\"%s\") statement", t,te->akaString), FileStr[save_file],save_line); }; } else { te->akaString=akaString; }; }; }; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); CannotContinue=TRUE; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd5, 0x10); } } void #ifdef __USE_PROTOS block(set * toksrefd,set * rulesrefd) #else block(toksrefd,rulesrefd) set *toksrefd; set *rulesrefd ; #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { Graph g, b; set saveblah; int saveinalt = inAlt; ExceptionGroup *eg; * toksrefd = empty; * rulesrefd = empty; set_clr(AST_nodes_refd_in_actions); CurBlockID++; /* MR23 */ CurBlockID_array[BlkLevel] = CurBlockID; CurAltNum = 1; /* MR23 */ CurAltNum_array[BlkLevel] = CurAltNum; saveblah = attribsRefdFromAction; attribsRefdFromAction = empty; alt( toksrefd,rulesrefd ); b = g = zzaArg(zztasp1,1); if ( ((Junction *)g.left)->p1->ntype == nAction ) { ActionNode *actionNode=(ActionNode *) ( ( (Junction *)g.left) ->p1); if (!actionNode->is_predicate ) { actionNode->init_action = TRUE; /* MR12c */ if (actionNode->noHoist) { /* MR12c */ errFL("<> appears as init-action - use <<>> <>", /* MR12c */ FileStr[actionNode->file],actionNode->line); /* MR12c */ }; } } ((Junction *)g.left)->blockid = CurBlockID; { zzBLOCK(zztasp2); zzMake0; { while ( (LA(1)==133) ) { eg = exception_group(); if ( eg!=NULL ) { /* MR7 ***** eg->altID = makeAltID(CurBlockID,CurAltNum); *****/ /* MR7 ***** CurAltStart->exception_label = eg->altID; *****/ list_add(&CurExGroups, (void *)eg); } zzLOOP(zztasp2); } zzEXIT(zztasp2); } } CurAltNum++; /* MR23 */ CurAltNum_array[BlkLevel] = CurAltNum; { zzBLOCK(zztasp2); zzMake0; { while ( (LA(1)==123) ) { zzmatch(123); inAlt=1; zzCONSUME; alt( toksrefd,rulesrefd ); g = Or(g, zzaArg(zztasp2,2)); ((Junction *)g.left)->blockid = CurBlockID; { zzBLOCK(zztasp3); zzMake0; { while ( (LA(1)==133) ) { eg = exception_group(); if ( eg!=NULL ) { /* MR7 ***** eg->altID = makeAltID(CurBlockID,CurAltNum); *****/ /* MR7 ***** CurAltStart->exception_label = eg->altID; *****/ list_add(&CurExGroups, (void *)eg); } zzLOOP(zztasp3); } zzEXIT(zztasp3); } } CurAltNum++; /* MR23 */ CurAltNum_array[BlkLevel] = CurAltNum; zzLOOP(zztasp2); } zzEXIT(zztasp2); } } zzaArg(zztasp1,0) = b; attribsRefdFromAction = saveblah; inAlt = saveinalt; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); CannotContinue=TRUE; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd5, 0x20); } } void #ifdef __USE_PROTOS alt(set * toksrefd,set * rulesrefd) #else alt(toksrefd,rulesrefd) set *toksrefd; set *rulesrefd ; #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { int n=0; Graph g; int e_num=0, old_not=0; Node *node; set elems, dif; int first_on_line = 1, use_def_MT_handler = 0; g.left=NULL; g.right=NULL; CurAltStart = NULL; elems = empty; inAlt = 1; { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==88) ) { zzmatch(88); use_def_MT_handler = 1; zzCONSUME; } else { if ( (setwd5[LA(1)]&0x40) ) { } else {zzFAIL(1,zzerr26,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { ; while ( (setwd5[LA(1)]&0x80) ) { { zzBLOCK(zztasp3); zzMake0; { old_not=0; if ( (LA(1)==124) ) { zzmatch(124); old_not=1; zzCONSUME; } else { if ( (setwd6[LA(1)]&0x1) ) { } else {zzFAIL(1,zzerr27,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } node = element( old_not, first_on_line, use_def_MT_handler ); if ( node!=NULL && node->ntype!=nAction ) first_on_line = 0; if ( zzaArg(zztasp2,2 ).left!=NULL ) { g = Cat(g, zzaArg(zztasp2,2)); n++; if ( node!=NULL ) { if ( node->ntype!=nAction ) e_num++; /* record record number of all rule and token refs */ if ( node->ntype==nToken ) { TokNode *tk = (TokNode *)((Junction *)zzaArg(zztasp2,2 ).left)->p1; tk->elnum = e_num; set_orel(e_num, &elems); } else if ( node->ntype==nRuleRef ) { RuleRefNode *rn = (RuleRefNode *)((Junction *)zzaArg(zztasp2,2 ).left)->p1; rn->elnum = e_num; set_orel(e_num, rulesrefd); } } } zzLOOP(zztasp2); } zzEXIT(zztasp2); } } if ( n == 0 ) g = emptyAlt(); zzaArg(zztasp1,0) = g; /* We want to reduce number of LT(i) calls and the number of * local attribute variables in C++ mode (for moment, later we'll * do for C also). However, if trees are being built, they * require most of the attrib variables to create the tree nodes * with; therefore, we gen a token ptr for each token ref in C++ */ if ( GenCC && !GenAST ) { /* This now free's the temp set -ATG 5/6/95 */ set temp; temp = set_and(elems, attribsRefdFromAction); set_orin( toksrefd, temp); set_free(temp); } else set_orin( toksrefd, elems); if ( GenCC ) { dif = set_dif(attribsRefdFromAction, elems); if ( set_deg(dif)>0 ) err("one or more $i in action(s) refer to non-token elements"); set_free(dif); } set_free(elems); set_free(attribsRefdFromAction); inAlt = 0; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); CannotContinue=TRUE; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd6, 0x2); } } LabelEntry * #ifdef __USE_PROTOS element_label(void) #else element_label() #endif { LabelEntry * _retv; zzRULE; zzBLOCK(zztasp1); PCCTS_PURIFY(_retv,sizeof(LabelEntry * )) zzMake0; { TermEntry *t=NULL; LabelEntry *l=NULL; RuleEntry *r=NULL; char *lab; zzmatch(LABEL); lab = mystrdup(LATEXT(1)); zzCONSUME; UsedNewStyleLabel = 1; if ( UsedOldStyleAttrib ) err("cannot mix with new-style labels with old-style $i"); t = (TermEntry *) hash_get(Tname, lab); if ( t==NULL ) t = (TermEntry *) hash_get(Texpr, lab); if ( t==NULL ) r = (RuleEntry *) hash_get(Rname, lab); if ( t!=NULL ) { err(eMsg1("label definition clashes with token/tokclass definition: '%s'", lab)); _retv = NULL; } else if ( r!=NULL ) { err(eMsg1("label definition clashes with rule definition: '%s'", lab)); _retv = NULL; } else { /* we don't clash with anybody else */ l = (LabelEntry *) hash_get(Elabel, lab); if ( l==NULL ) { /* ok to add new element label */ l = (LabelEntry *)hash_add(Elabel, lab, (Entry *)newLabelEntry(lab)); /* add to list of element labels for this rule */ list_add(&CurElementLabels, (void *)lab); /* MR7 */ leAdd(l); /* list of labels waiting for exception group definitions */ _retv = l; } else { err(eMsg1("label definitions must be unique per rule: '%s'", lab)); _retv = NULL; } } zzmatch(106); zzCONSUME; zzEXIT(zztasp1); return _retv; fail: zzEXIT(zztasp1); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd6, 0x4); return _retv; } } Node * #ifdef __USE_PROTOS element(int old_not,int first_on_line,int use_def_MT_handler) #else element(old_not,first_on_line,use_def_MT_handler) int old_not; int first_on_line; int use_def_MT_handler ; #endif { Node * _retv; zzRULE; zzBLOCK(zztasp1); PCCTS_PURIFY(_retv,sizeof(Node * )) zzMake0; { Attrib blk; Predicate *pred = NULL; int local_use_def_MT_handler=0; ActionNode *act; RuleRefNode *rr; set toksrefd, rulesrefd; TermEntry *term; TokNode *p=NULL; RuleRefNode *q; int approx=0; LabelEntry *label=NULL; int predMsgDone=0; int semDepth=0; int ampersandStyle; int height; /* MR11 */ int equal_height; /* MR11 */ char* pFirstSetSymbol = NULL; /* MR21 */ _retv = NULL; if ( (setwd6[LA(1)]&0x8) ) { { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==LABEL) ) { label = element_label(); } else { if ( (setwd6[LA(1)]&0x10) ) { } else {zzFAIL(1,zzerr28,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==TokenTerm) ) { zzmatch(TokenTerm); term = (TermEntry *) hash_get(Tname, LATEXT(1)); if ( term==NULL && UserDefdTokens ) { err("implicit token definition not allowed with #tokdefs"); zzaRet.left = zzaRet.right = NULL; } else { zzaRet = buildToken(LATEXT(1)); p=((TokNode *)((Junction *)zzaRet.left)->p1); term = (TermEntry *) hash_get(Tname, LATEXT(1)); require( term!= NULL, "hash table mechanism is broken"); p->tclass = term->tclass; p->complement = old_not; if ( label!=NULL ) { p->el_label = label->str; label->elem = (Node *)p; } } zzCONSUME; { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==119) ) { zzmatch(119); zzCONSUME; { zzBLOCK(zztasp4); zzMake0; { if ( (LA(1)==QuotedTerm) ) { zzmatch(QuotedTerm); if ( p!=NULL ) setUpperRange(p, LATEXT(1)); zzCONSUME; } else { if ( (LA(1)==TokenTerm) ) { zzmatch(TokenTerm); if ( p!=NULL ) setUpperRange(p, LATEXT(1)); zzCONSUME; } else {zzFAIL(1,zzerr29,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp4); } } } else { if ( (setwd6[LA(1)]&0x20) ) { } else {zzFAIL(1,zzerr30,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } if ( p!=NULL && (p->upper_range!=0 || p->tclass || old_not) ) list_add(&MetaTokenNodes, (void *)p); { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==125) ) { zzmatch(125); if ( p!=NULL ) p->astnode=ASTroot; zzCONSUME; } else { if ( (setwd6[LA(1)]&0x40) ) { if ( p!=NULL ) p->astnode=ASTchild; } else { if ( (LA(1)==103) ) { zzmatch(103); if ( p!=NULL ) p->astnode=ASTexclude; zzCONSUME; } else {zzFAIL(1,zzerr31,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } zzEXIT(zztasp3); } } { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==88) ) { zzmatch(88); local_use_def_MT_handler = 1; zzCONSUME; } else { if ( (setwd6[LA(1)]&0x80) ) { } else {zzFAIL(1,zzerr32,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } if ( p!=NULL && first_on_line ) { CurAltStart = (Junction *)zzaRet.left; altAdd(CurAltStart); /* MR7 */ p->altstart = CurAltStart; } if ( p!=NULL ) p->use_def_MT_handler = use_def_MT_handler || local_use_def_MT_handler; _retv = (Node *)p; } else { if ( (LA(1)==QuotedTerm) ) { zzmatch(QuotedTerm); term = (TermEntry *) hash_get(Texpr, LATEXT(1)); if ( term==NULL && UserDefdTokens ) { err("implicit token definition not allowed with #tokdefs"); zzaRet.left = zzaRet.right = NULL; } else { zzaRet = buildToken(LATEXT(1)); p=((TokNode *)((Junction *)zzaRet.left)->p1); p->complement = old_not; if ( label!=NULL ) { p->el_label = label->str; label->elem = (Node *)p; } } zzCONSUME; { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==119) ) { zzmatch(119); zzCONSUME; { zzBLOCK(zztasp4); zzMake0; { if ( (LA(1)==QuotedTerm) ) { zzmatch(QuotedTerm); if ( p!=NULL ) setUpperRange(p, LATEXT(1)); zzCONSUME; } else { if ( (LA(1)==TokenTerm) ) { zzmatch(TokenTerm); if ( p!=NULL ) setUpperRange(p, LATEXT(1)); zzCONSUME; } else {zzFAIL(1,zzerr33,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp4); } } } else { if ( (setwd7[LA(1)]&0x1) ) { } else {zzFAIL(1,zzerr34,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==125) ) { zzmatch(125); if ( p!=NULL ) p->astnode=ASTroot; zzCONSUME; } else { if ( (setwd7[LA(1)]&0x2) ) { if ( p!=NULL ) p->astnode=ASTchild; } else { if ( (LA(1)==103) ) { zzmatch(103); if ( p!=NULL ) p->astnode=ASTexclude; zzCONSUME; } else {zzFAIL(1,zzerr35,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } zzEXIT(zztasp3); } } { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==88) ) { zzmatch(88); local_use_def_MT_handler = 1; zzCONSUME; } else { if ( (setwd7[LA(1)]&0x4) ) { } else {zzFAIL(1,zzerr36,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } if ( p!=NULL && (p->upper_range!=0 || p->tclass || old_not) ) list_add(&MetaTokenNodes, (void *)p); if ( first_on_line ) { CurAltStart = (Junction *)zzaRet.left; altAdd(CurAltStart); /* MR7 */ p->altstart = CurAltStart; } if ( p!=NULL ) p->use_def_MT_handler = use_def_MT_handler || local_use_def_MT_handler; _retv = (Node *)p; } else { if ( (LA(1)==WildCard) ) { if ( old_not ) warn("~ WILDCARD is an undefined operation (implies 'nothing')"); zzmatch(WildCard); zzaRet = buildWildCard(LATEXT(1)); p=((TokNode *)((Junction *)zzaRet.left)->p1); zzCONSUME; { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==125) ) { zzmatch(125); p->astnode=ASTroot; zzCONSUME; } else { if ( (setwd7[LA(1)]&0x8) ) { p->astnode=ASTchild; } else { if ( (LA(1)==103) ) { zzmatch(103); p->astnode=ASTexclude; zzCONSUME; } else {zzFAIL(1,zzerr37,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } zzEXIT(zztasp3); } } list_add(&MetaTokenNodes, (void *)p); if ( first_on_line ) { CurAltStart = (Junction *)zzaRet.left; altAdd(CurAltStart); /* MR7 */ p->altstart = CurAltStart; if ( label!=NULL ) { p->el_label = label->str; label->elem = (Node *)p; } } _retv = (Node *)p; } else { if ( (LA(1)==NonTerminal) ) { if ( old_not ) warn("~ NONTERMINAL is an undefined operation"); zzmatch(NonTerminal); zzaRet = buildRuleRef(LATEXT(1)); zzCONSUME; { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==103) ) { zzmatch(103); q = (RuleRefNode *) ((Junction *)zzaRet.left)->p1; q->astnode=ASTexclude; zzCONSUME; } else { if ( (setwd7[LA(1)]&0x10) ) { } else {zzFAIL(1,zzerr38,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } { zzBLOCK(zztasp3); zzMake0; { if ( (setwd7[LA(1)]&0x20) ) { { zzBLOCK(zztasp4); zzMake0; { if ( (LA(1)==104) ) { zzmatch(104); zzCONSUME; } else { if ( (LA(1)==PassAction) ) { } else {zzFAIL(1,zzerr39,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp4); } } zzmatch(PassAction); addParm(((Junction *)zzaRet.left)->p1, LATEXT(1)); zzCONSUME; } else { if ( (setwd7[LA(1)]&0x40) ) { } else {zzFAIL(1,zzerr40,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } rr=(RuleRefNode *) ((Junction *)zzaRet.left)->p1; { zzBLOCK(zztasp3); zzMake0; { char *a; if ( (LA(1)==105) ) { zzmatch(105); zzCONSUME; zzmatch(PassAction); a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require(a!=NULL, "rule element: cannot allocate assignment"); strcpy(a, LATEXT(1)); rr->assign = a; zzCONSUME; } else { if ( (setwd7[LA(1)]&0x80) ) { } else {zzFAIL(1,zzerr41,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } if ( label!=NULL ) { rr->el_label = label->str; label->elem = (Node *)rr; } if ( first_on_line ) { CurAltStart = (Junction *)zzaRet.left; altAdd(CurAltStart); /* MR7 */ ((RuleRefNode *)((Junction *)zzaRet.left)->p1)->altstart = CurAltStart; } _retv = (Node *)rr; } else {zzFAIL(1,zzerr42,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } } zzEXIT(zztasp2); } } } else { if ( (LA(1)==Action) ) { if ( old_not ) warn("~ ACTION is an undefined operation"); zzmatch(Action); zzaArg(zztasp1,0) = buildAction(LATEXT(1),action_file,action_line, 0); zzCONSUME; if ( first_on_line ) { /* MR7 */ CurAltStart = (Junction *)zzaArg(zztasp1,0 ).left; /* MR7 */ altAdd(CurAltStart); /* MR7 */ }; _retv = (Node *) ((Junction *)zzaArg(zztasp1,0 ).left)->p1; } else { if ( (LA(1)==Pred) ) { if ( old_not ) warn("~ SEMANTIC-PREDICATE is an undefined operation"); zzmatch(Pred); zzaArg(zztasp1,0) = buildAction(LATEXT(1),action_file,action_line, 1); zzCONSUME; act = (ActionNode *) ((Junction *)zzaArg(zztasp1,0 ).left)->p1; if (numericActionLabel) { /* MR10 */ list_add(&NumericPredLabels,act); /* MR10 */ numericActionLabel=0; /* MR10 */ }; /* MR10 */ { zzBLOCK(zztasp2); zzMake0; { char *a; if ( (LA(1)==PassAction) ) { zzmatch(PassAction); a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require(a!=NULL, "rule element: cannot allocate predicate fail action"); strcpy(a, LATEXT(1)); act->pred_fail = a; zzCONSUME; } else { if ( (setwd8[LA(1)]&0x1) ) { } else {zzFAIL(1,zzerr43,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } if ( first_on_line ) { /* MR7 */ CurAltStart = (Junction *)zzaArg(zztasp1,0 ).left; /* MR7 */ altAdd(CurAltStart); /* MR7 */ }; _retv = (Node *)act; } else { if ( (setwd8[LA(1)]&0x2) ) { if ( old_not ) warn("~ BLOCK is an undefined operation"); BlkLevel++; if (BlkLevel >= MAX_BLK_LEVEL) fatal("Blocks nested too deeply"); /* MR23 */ CurBlockID_array[BlkLevel] = CurBlockID; /* MR23 */ CurAltNum_array[BlkLevel] = CurAltNum; { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==Pragma) ) { zzmatch(Pragma); zzCONSUME; { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==126) ) { zzmatch(126); approx=LL_k; zzCONSUME; } else { if ( (LA(1)==127) ) { zzmatch(127); approx = 1; zzCONSUME; } else { if ( (LA(1)==128) ) { zzmatch(128); approx = 2; zzCONSUME; } else {zzFAIL(1,zzerr44,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } zzEXIT(zztasp3); } } } else { if ( (setwd8[LA(1)]&0x4) ) { } else {zzFAIL(1,zzerr45,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==FirstSetSymbol) ) { zzmatch(FirstSetSymbol); zzCONSUME; zzmatch(114); zzCONSUME; { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==NonTerminal) ) { zzmatch(NonTerminal); /* MR21 */ pFirstSetSymbol = (char *) calloc(strlen(LATEXT(1))+1, /* MR21 */ sizeof(char)); /* MR21 */ require(pFirstSetSymbol!=NULL, /* MR21 */ "cannot allocate first set name"); /* MR21 */ strcpy(pFirstSetSymbol, LATEXT(1)); /* MR21 */ zzCONSUME; } else { if ( (LA(1)==TokenTerm) ) { zzmatch(TokenTerm); /* MR21 */ pFirstSetSymbol = (char *) calloc(strlen(LATEXT(1))+1, /* MR21 */ sizeof(char)); /* MR21 */ require(pFirstSetSymbol!=NULL, /* MR21 */ "cannot allocate first set name"); /* MR21 */ strcpy(pFirstSetSymbol, LATEXT(1)); /* MR21 */ zzCONSUME; } else {zzFAIL(1,zzerr46,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } zzmatch(115); zzCONSUME; } else { if ( (setwd8[LA(1)]&0x8) ) { } else {zzFAIL(1,zzerr47,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==114) ) { zzmatch(114); zzCONSUME; block( &toksrefd,&rulesrefd ); zzmatch(115); blk = zzaRet = zzaArg(zztasp2,2); /* MR23 */ CurBlockID_array[BlkLevel] = (-1); /* MR23 */ CurAltNum_array[BlkLevel] = (-1); --BlkLevel; zzCONSUME; { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==129) ) { zzmatch(129); zzaRet = makeLoop(zzaRet,approx,pFirstSetSymbol); zzCONSUME; } else { if ( (LA(1)==130) ) { zzmatch(130); zzaRet = makePlus(zzaRet,approx,pFirstSetSymbol); zzCONSUME; } else { if ( (LA(1)==131) ) { zzmatch(131); zzCONSUME; { zzBLOCK(zztasp4); zzMake0; { if ( (setwd8[LA(1)]&0x10) ) { { zzBLOCK(zztasp5); zzMake0; { if ( (LA(1)==132) ) { zzmatch(132); ampersandStyle=0; zzCONSUME; } else { if ( (LA(1)==113) ) { zzmatch(113); ampersandStyle=1; zzCONSUME; } else {zzFAIL(1,zzerr48,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp5); } } zzmatch(Pred); zzaRet = buildAction(LATEXT(1),action_file,action_line,1); zzCONSUME; act = (ActionNode *) ((Junction *)zzaRet.left)->p1; semDepth=predicateLookaheadDepth(act); if (numericActionLabel) { /* MR10 */ list_add(&NumericPredLabels,act); /* MR10 */ numericActionLabel=0; /* MR10 */ }; /* MR10 */ { zzBLOCK(zztasp5); zzMake0; { char *a; if ( (LA(1)==PassAction) ) { zzmatch(PassAction); a = (char *)calloc(strlen(LATEXT(1))+1, sizeof(char)); require(a!=NULL, "rule element: cannot allocate predicate fail action"); strcpy(a, LATEXT(1)); act->pred_fail = a; zzCONSUME; } else { if ( (setwd8[LA(1)]&0x20) ) { } else {zzFAIL(1,zzerr49,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp5); } } if ( first_on_line) { /* MR7 */ CurAltStart=(Junction *)zzaRet.left; /* MR7 */ altAdd(CurAltStart); /* MR7 */ }; _retv = (Node *)act; pred = computePredFromContextGuard(blk,&predMsgDone); /* MR10 */ if ( pred==NULL) { /* MR10 */ if ( !predMsgDone) err("invalid or missing context guard"); /* MR10 */ predMsgDone=1; /* MR10 */ } else { /* MR10 */ act->guardNodes=(Junction *)blk.left; /* MR11 */ pred->expr = act->action; pred->source = act; /* MR10 */ pred->ampersandStyle = ampersandStyle; /* 0 means (g)? => ... 1 means (g)? && ... */ /* MR13 */ if (pred->tcontext != NULL) { /* MR13 */ height=MR_max_height_of_tree(pred->tcontext); /* MR13 */ equal_height=MR_all_leaves_same_height(pred->tcontext,height); /* MR13 */ if (! equal_height) { /* MR13 */ errFL("in guarded predicates all tokens in the guard must be at the same height", /* MR13 */ FileStr[act->file],act->line); /* MR13 */ }; /* MR13 */ } /* MR10 */ if (ampersandStyle) { /* MR10 */ act->ampersandPred = pred; /* MR11 */ if (! HoistPredicateContext) { /* MR11 */ errFL("without \"-prc on\" (guard)? && <>? ... doesn't make sense", /* MR11 */ FileStr[act->file],act->line); /* MR11 */ }; /* MR10 */ } else { /* MR10 */ act->guardpred = pred; /* MR10 */ }; /* MR10 */ if (pred->k != semDepth) { /* MR10 */ warn(eMsgd2("length of guard (%d) does not match the length of semantic predicate (%d)", /* MR10 */ pred->k,semDepth)); /* MR10 */ }; } } else { if ( (setwd8[LA(1)]&0x40) ) { zzaRet = makeBlk(zzaRet,approx,pFirstSetSymbol); FoundGuessBlk = 1; ((Junction *) ((Junction *)zzaRet.left)->p1)->guess=1; if ( ! first_on_line ) { err("(...)? predicate must be first element of production"); } } else {zzFAIL(1,zzerr50,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp4); } } } else { if ( (setwd8[LA(1)]&0x80) ) { zzaRet = makeBlk(zzaRet,approx,pFirstSetSymbol); } else {zzFAIL(1,zzerr51,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } } zzEXIT(zztasp3); } } if ( pred==NULL && !predMsgDone) { /* MR10 */ ((Junction *)((Junction *)zzaRet.left)->p1)->blockid = CurBlockID; ((Junction *)((Junction *)zzaRet.left)->p1)->tokrefs = toksrefd; ((Junction *)((Junction *)zzaRet.left)->p1)->rulerefs = rulesrefd; if ( first_on_line ) { /* MR7 */ CurAltStart = (Junction *)((Junction *)((Junction *)zzaRet.left)->p1); /* MR7 */ altAdd(CurAltStart); /* MR7 */ }; /* MR7 */ _retv = (Node *) ((Junction *)zzaRet.left)->p1; } } else { if ( (LA(1)==102) ) { zzmatch(102); zzCONSUME; block( &toksrefd,&rulesrefd ); zzaRet = makeOpt(zzaArg(zztasp2,2),approx,pFirstSetSymbol); /* MR23 */ CurBlockID_array[BlkLevel] = (-1); /* MR23 */ CurAltNum_array[BlkLevel] = (-1); --BlkLevel; zzmatch(98); ((Junction *)((Junction *)zzaRet.left)->p1)->blockid = CurBlockID; ((Junction *)((Junction *)zzaRet.left)->p1)->tokrefs = toksrefd; ((Junction *)((Junction *)zzaRet.left)->p1)->rulerefs = rulesrefd; zzCONSUME; if ( first_on_line ) { /* MR7 */ CurAltStart = (Junction *) ((Junction *)((Junction *)zzaRet.left)->p1); /* MR7 */ altAdd(CurAltStart); /* MR7 */ }; _retv = (Node *) ((Junction *)zzaRet.left)->p1; } else {zzFAIL(1,zzerr52,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } } else { if ( (LA(1)==129) ) { zzmatch(129); warn("don't you want a ')' with that '*'?"); CannotContinue=TRUE; zzCONSUME; } else { if ( (LA(1)==130) ) { zzmatch(130); warn("don't you want a ')' with that '+'?"); CannotContinue=TRUE; zzCONSUME; } else { if ( (LA(1)==105) ) { zzmatch(105); warn("'>' can only appear after a nonterminal"); CannotContinue=TRUE; zzCONSUME; } else { if ( (LA(1)==PassAction) ) { zzmatch(PassAction); warn("[...] out of context 'rule > [...]'"); CannotContinue=TRUE; zzCONSUME; } else {zzFAIL(1,zzerr53,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } } } } } } zzEXIT(zztasp1); return _retv; fail: zzEXIT(zztasp1); CannotContinue=TRUE; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd9, 0x1); return _retv; } } void #ifdef __USE_PROTOS default_exception_handler(void) #else default_exception_handler() #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { DefaultExGroup = exception_group(); zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd9, 0x2); } } ExceptionGroup * #ifdef __USE_PROTOS exception_group(void) #else exception_group() #endif { ExceptionGroup * _retv; zzRULE; zzBLOCK(zztasp1); PCCTS_PURIFY(_retv,sizeof(ExceptionGroup * )) zzMake0; { ExceptionHandler *h; LabelEntry *label=NULL; /* MR6 */ FoundException = 1; FoundExceptionGroup = 1; zzmatch(133); _retv = (ExceptionGroup *)calloc(1, sizeof(ExceptionGroup)); zzCONSUME; { zzBLOCK(zztasp2); zzMake0; { char *p; if ( (LA(1)==PassAction) ) { zzmatch(PassAction); p = LATEXT(1)+1; p[strlen(p)-1] = '\0'; /* kill trailing space */ label = (LabelEntry *) hash_get(Elabel, LATEXT(1)+1); if ( label==NULL ) { err(eMsg1("unknown label in exception handler: '%s'", LATEXT(1)+1)); } zzCONSUME; } else { if ( (setwd9[LA(1)]&0x4) ) { } else {zzFAIL(1,zzerr54,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { while ( (LA(1)==135) ) { h = exception_handler(); list_add(&(_retv->handlers), (void *)h); zzLOOP(zztasp2); } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==134) ) { zzmatch(134); zzCONSUME; zzmatch(106); zzCONSUME; zzmatch(Action); { ExceptionHandler *eh = (ExceptionHandler *) calloc(1, sizeof(ExceptionHandler)); char *a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require(eh!=NULL, "exception: cannot allocate handler"); require(a!=NULL, "exception: cannot allocate action"); strcpy(a, LATEXT(1)); eh->action = a; eh->signalname = (char *) calloc(strlen("default")+1, sizeof(char)); require(eh->signalname!=NULL, "exception: cannot allocate sig name"); strcpy(eh->signalname, "default"); list_add(&(_retv->handlers), (void *)eh); } zzCONSUME; } else { if ( (setwd9[LA(1)]&0x8) ) { } else {zzFAIL(1,zzerr55,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } if ( label!=NULL ) { /* Record ex group in sym tab for this label */ if ( label->ex_group!=NULL ) { err(eMsg1("duplicate exception handler for label '%s'",label->str)); } else { label->ex_group = _retv; /* Label the exception group itself */ _retv->label = label->str; /* Make the labelled element pt to the exception also */ /* MR6 */ if (label->elem == NULL) { /* MR6 */ err(eMsg1("reference in exception handler to undefined label '%s'",label->str)); /* MR6 */ } else { switch ( label->elem->ntype ) { case nRuleRef : { RuleRefNode *r = (RuleRefNode *)label->elem; r->ex_group = _retv; break; } case nToken : { TokNode *t = (TokNode *)label->elem; t->ex_group = _retv; break; } } /* end switch */ /* MR6 */ }; /* end test on label->elem */ } /* end test on label->ex_group */ } /* end test on exception label */ /* MR7 */ /* MR7 */ if (BlkLevel == 1 && label == NULL) { /* MR7 */ _retv->forRule=1; /* MR7 */ } else if (label == NULL) { /* MR7 */ _retv->altID = makeAltID(CurBlockID_array[BlkLevel], CurAltNum_array[BlkLevel]); /* MR7 */ egAdd(_retv); /* MR7 */ } else { /* MR7 */ _retv->labelEntry=label; /* MR7 */ }; /* MR7 */ /* MR7 */ /* You may want to remove this exc from the rule list */ /* MR7 */ /* and handle at the labeled element site. */ /* MR7 */ /* MR7 */ if (label != NULL) { /* MR7 */ _retv = NULL; /* MR7 */ }; zzEXIT(zztasp1); return _retv; fail: zzEXIT(zztasp1); CannotContinue=TRUE; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd9, 0x10); return _retv; } } ExceptionHandler * #ifdef __USE_PROTOS exception_handler(void) #else exception_handler() #endif { ExceptionHandler * _retv; zzRULE; zzBLOCK(zztasp1); PCCTS_PURIFY(_retv,sizeof(ExceptionHandler * )) zzMake0; { ; zzmatch(135); _retv = (ExceptionHandler *)calloc(1, sizeof(ExceptionHandler)); require(_retv!=NULL, "exception: cannot allocate handler"); zzCONSUME; { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==NonTerminal) ) { zzmatch(NonTerminal); _retv->signalname = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require(_retv->signalname!=NULL, "exception: cannot allocate sig name"); strcpy(_retv->signalname, LATEXT(1)); zzCONSUME; } else { if ( (LA(1)==TokenTerm) ) { zzmatch(TokenTerm); _retv->signalname = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require(_retv->signalname!=NULL, "exception: cannot allocate sig name"); strcpy(_retv->signalname, LATEXT(1)); zzCONSUME; } else {zzFAIL(1,zzerr56,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } zzmatch(106); zzCONSUME; { zzBLOCK(zztasp2); zzMake0; { _retv->action = NULL; if ( (LA(1)==Action) ) { zzmatch(Action); _retv->action = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require(_retv->action!=NULL, "exception: cannot allocate action"); strcpy(_retv->action, LATEXT(1)); zzCONSUME; } else { if ( (setwd9[LA(1)]&0x20) ) { } else {zzFAIL(1,zzerr57,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } zzEXIT(zztasp1); return _retv; fail: zzEXIT(zztasp1); CannotContinue=TRUE; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd9, 0x40); return _retv; } } void #ifdef __USE_PROTOS enum_file(char * fname) #else enum_file(fname) char *fname ; #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { if ( (setwd9[LA(1)]&0x80) ) { { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==143) ) { zzmatch(143); zzCONSUME; zzmatch(ID); zzCONSUME; { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==149) ) { zzmatch(149); zzCONSUME; zzmatch(ID); zzCONSUME; } else { if ( (setwd10[LA(1)]&0x1) ) { } else {zzFAIL(1,zzerr58,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } } else { if ( (setwd10[LA(1)]&0x2) ) { } else {zzFAIL(1,zzerr59,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==151) ) { { zzBLOCK(zztasp3); int zzcnt=1; zzMake0; { do { enum_def( fname ); zzLOOP(zztasp3); } while ( (LA(1)==151) ); zzEXIT(zztasp3); } } } else { if ( (LA(1)==149) ) { defines( fname ); } else {zzFAIL(1,zzerr60,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } } else { if ( (LA(1)==Eof) ) { } else {zzFAIL(1,zzerr61,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd10, 0x4); } } void #ifdef __USE_PROTOS defines(char * fname) #else defines(fname) char *fname ; #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { int v; int maxt=(-1); char *t; { zzBLOCK(zztasp2); int zzcnt=1; zzMake0; { do { zzmatch(149); zzCONSUME; zzmatch(ID); t = mystrdup(LATEXT(1)); zzCONSUME; zzmatch(INT); v = atoi(LATEXT(1)); /* fprintf(stderr, "#token %s=%d\n", t, v);*/ /* MR2 Andreas Magnusson (Andreas.Magnusson@mailbox.swipnet.se) */ /* MR2 Fix to bug introduced by 1.33MR1 for #tokdefs */ /* MR2 Don't let #tokdefs be confused by */ /* MR2 DLGminToken and DLGmaxToken */ if ( ! isDLGmaxToken(t)) { /* MR2 */ TokenNum = v; if ( v>maxt ) maxt=v; if ( Tnum( t ) == 0 ) { addForcedTname( t, v ); } else { warnFL(eMsg1("redefinition of token %s; ignored",t), fname,zzline); }; }; zzCONSUME; zzLOOP(zztasp2); } while ( (LA(1)==149) ); zzEXIT(zztasp2); } } TokenNum = maxt + 1; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd10, 0x8); } } void #ifdef __USE_PROTOS enum_def(char * fname) #else enum_def(fname) char *fname ; #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { int v= 0; int maxt=(-1); char *t; zzmatch(151); zzCONSUME; zzmatch(ID); zzCONSUME; zzmatch(152); zzCONSUME; zzmatch(ID); t = mystrdup(LATEXT(1)); zzCONSUME; { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==153) ) { zzmatch(153); zzCONSUME; zzmatch(INT); v=atoi(LATEXT(1)); zzCONSUME; } else { if ( (setwd10[LA(1)]&0x10) ) { v++; } else {zzFAIL(1,zzerr62,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } /* fprintf(stderr, "#token %s=%d\n", t, v);*/ TokenNum = v; if ( v>maxt ) maxt=v; /* MR3 */ if ( Tnum( t ) == 0 ) addForcedTname( t, v ); else { warnFL(eMsg1("redefinition of token %s; ignored",t), fname,zzline); } { zzBLOCK(zztasp2); zzMake0; { while ( (LA(1)==154) ) { zzmatch(154); zzCONSUME; { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==ID)&&(isDLGmaxToken(LATEXT(1))) ) { if (!(isDLGmaxToken(LATEXT(1))) ) {zzfailed_pred(" isDLGmaxToken(LATEXT(1))",0 /* report */, { 0; /* no user action */ } );} zzmatch(ID); zzCONSUME; { zzBLOCK(zztasp4); zzMake0; { if ( (LA(1)==153) ) { zzmatch(153); zzCONSUME; zzmatch(INT); zzCONSUME; } else { if ( (setwd10[LA(1)]&0x20) ) { } else {zzFAIL(1,zzerr63,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp4); } } } else { if ( (LA(1)==ID) ) { zzmatch(ID); t = mystrdup(LATEXT(1)); zzCONSUME; { zzBLOCK(zztasp4); zzMake0; { if ( (LA(1)==153) ) { zzmatch(153); zzCONSUME; zzmatch(INT); v=atoi(LATEXT(1)); zzCONSUME; } else { if ( (setwd10[LA(1)]&0x40) ) { v++; } else {zzFAIL(1,zzerr64,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp4); } } /* fprintf(stderr, "#token %s=%d\n", t, v);*/ TokenNum = v; if ( v>maxt ) maxt=v; /* MR3 */ if ( Tnum( t ) == 0 ) addForcedTname( t, v ); else { warnFL(eMsg1("redefinition of token %s; ignored",t), fname,zzline); } } else { if ( (setwd10[LA(1)]&0x80) ) { } else {zzFAIL(1,zzerr65,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } zzEXIT(zztasp3); } } zzLOOP(zztasp2); } zzEXIT(zztasp2); } } zzmatch(155); zzCONSUME; zzmatch(156); TokenNum = maxt + 1; zzCONSUME; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd11, 0x1); } } /* MR2 Andreas Magnusson (Andreas.Magnusson@mailbox.swipnet.se) */ /* MR2 Fix to bug introduced by 1.33MR1 for #tokdefs */ /* MR2 Don't let #tokdefs be confused by */ /* MR2 DLGminToken and DLGmaxToken */ /* semantic check on DLGminToken and DLGmaxmaxToken in #tokdefs */ #ifdef __USE_PROTOS static int isDLGmaxToken(char *Token) #else static int isDLGmaxToken(Token) char * Token; #endif { static char checkStr1[] = "DLGmaxToken"; static char checkStr2[] = "DLGminToken"; if (strcmp(Token, checkStr1) == 0) return 1; else if (strcmp(Token, checkStr2) == 0) return 1; else return 0; } /* semantics of #token */ static void #ifdef __USE_PROTOS chkToken(char *t, char *e, char *a, int tnum) #else chkToken(t,e,a,tnum) char *t, *e, *a; int tnum; #endif { TermEntry *p; /* check to see that they don't try to redefine a token as a token class */ if ( t!=NULL ) { p = (TermEntry *) hash_get(Tname, t); if ( p!=NULL && p->classname ) { err(eMsg1("redefinition of #tokclass '%s' to #token not allowed; ignored",t)); if ( a!=NULL ) free((char *)a); return; } } if ( t==NULL && e==NULL ) { /* none found */ err("#token requires at least token name or rexpr"); } else if ( t!=NULL && e!=NULL ) { /* both found */ if ( UserDefdTokens ) { /* if #tokdefs, must not define new */ p = (TermEntry *) hash_get(Tname, t); if ( p == NULL) { err(eMsg1("new token definition '%s' not allowed - only #token with name already defined by #tokdefs file allowed",t)); return; }; } Tklink(t, e); if ( a!=NULL ) { if ( hasAction(e) ) { err(eMsg1("redefinition of action for %s; ignored",e)); } else setHasAction(e, a); } } else if ( t!=NULL ) { /* only one found */ if ( UserDefdTokens ) { p = (TermEntry *) hash_get(Tname, t); if (p == NULL) { err(eMsg1("new token definition '%s' not allowed - only #token with name already defined by #tokdefs file allowed",t)); }; return; } if ( Tnum( t ) == 0 ) addTname( t ); else { err(eMsg1("redefinition of token %s; ignored",t)); } if ( a!=NULL ) { err(eMsg1("action cannot be attached to a token name (%s); ignored",t)); free((char *)a); } } else if ( e!=NULL ) { if ( Tnum( e ) == 0 ) addTexpr( e ); else { if ( hasAction(e) ) { err(eMsg1("redefinition of action for expr %s; ignored",e)); } else if ( a==NULL ) { err(eMsg1("redefinition of expr %s; ignored",e)); } } if ( a!=NULL ) setHasAction(e, a); } /* if a token type number was specified, then add the token ID and 'tnum' * pair to the ForcedTokens list. (only applies if an id was given) */ if ( t!=NULL && tnum>0 ) { if ( set_el(tnum, reserved_positions) ) { err(eMsgd("a token has already been forced to token number %d; ignored", tnum)); } else { list_add(&ForcedTokens, newForcedToken(t,tnum)); set_orel(tnum, &reserved_positions); } } } static int #ifdef __USE_PROTOS match_token(char *s, char **nxt) #else match_token(s,nxt) char *s; char **nxt; #endif { if ( !(*s>='A' && *s<='Z') ) return 0; s++; while ( (*s>='a' && *s<='z') || (*s>='A' && *s<='Z') || (*s>='0' && *s<='9') || *s=='_' ) { s++; } if ( *s!=' ' && *s!='}' ) return 0; *nxt = s; return 1; } static int #ifdef __USE_PROTOS match_rexpr(char *s, char **nxt) #else match_rexpr(s,nxt) char *s; char **nxt; #endif { if ( *s!='"' ) return 0; s++; while ( *s!='"' ) { if ( *s=='\n' || *s=='\r' ) /* MR13 */ warn("eoln found in regular expression"); if ( *s=='\\' ) s++; s++; } *nxt = s+1; return 1; } /* * Walk a string "{ A .. Z }" where A..Z is a space separated list * of token references (either labels or reg exprs). Return a * string "inlineX_set" for some unique integer X. Basically, * we pretend as if we had seen "#tokclass inlineX { A .. Z }" * on the input stream outside of an action. */ char * #ifdef __USE_PROTOS inline_set(char *s) #else inline_set(s) char *s; #endif { char *nxt; fprintf(stderr, "found consumeUntil( {...} )\n"); while ( *s==' ' || *s=='\t' || *s=='\n' || *s=='\r' ) {s++;} if ( *s!='{' ) { err("malformed consumeUntil( {...} ); missing '{'"); return "bad_set"; } s++; while ( *s==' ' || *s=='\t' || *s=='\n' || *s=='\r' ) {s++;} while ( *s!='}' ) { if ( match_token(s,&nxt) ) fprintf(stderr, "found token %s\n", s); else if ( match_rexpr(s,&nxt) ) fprintf(stderr, "found rexpr %s\n", s); else { err("invalid element in consumeUntil( {...} )"); return "bad_set"; } s = nxt; while ( *s==' ' || *s=='\t' || *s=='\n' || *s=='\r' ) {s++;} } return "inlineX_set"; } /* ANTLR-specific syntax error message generator * (define USER_ZZSYN when compiling so don't get 2 definitions) */ void #ifdef __USE_PROTOS zzsyn(char *text, int tok, char *egroup, SetWordType *eset, int etok, int k, char *bad_text) #else zzsyn(text, tok, egroup, eset, etok, k, bad_text) char *text, *egroup, *bad_text; int tok; int etok; int k; SetWordType *eset; #endif { fprintf(stderr, ErrHdr, FileStr[CurFile]!=NULL?FileStr[CurFile]:"stdin", zzline); fprintf(stderr, " syntax error at \"%s\"", (tok==zzEOF_TOKEN)?"EOF":text); if ( !etok && !eset ) {fprintf(stderr, "\n"); return;} if ( k==1 ) fprintf(stderr, " missing"); else { fprintf(stderr, "; \"%s\" not", bad_text); if ( zzset_deg(eset)>1 ) fprintf(stderr, " in"); } if ( zzset_deg(eset)>0 ) zzedecode(eset); else fprintf(stderr, " %s", zztokens[etok]); if ( strlen(egroup) > (size_t)0 ) fprintf(stderr, " in %s", egroup); fprintf(stderr, "\n"); } gtkwave-3.3.86/contrib/pccts/antlr/parser.dlg0000664000175000017500000004671113166335473020475 0ustar bybellbybell<< /* parser.dlg -- DLG Description of scanner * * Generated from: ./antlr.g * * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001 * Purdue University Electrical Engineering * With AHPCRC, University of Minnesota * ANTLR Version 1.33MR33 */ #define ANTLR_VERSION 13333 #include "pcctscfg.h" #include "pccts_stdio.h" #include "pcctscfg.h" #include "set.h" #include #include "syn.h" #include "hash.h" #include "generic.h" #define zzcr_attr(attr,tok,t) #include "antlr.h" #include "tokens.h" #include "dlgdef.h" LOOKAHEAD void #ifdef __USE_PROTOS zzerraction(void) #else zzerraction() #endif { (*zzerr)("invalid token"); zzadvance(); zzskip(); } >> <<%%lexaction /* maintained, but not used for now */ set AST_nodes_refd_in_actions = set_init; int inAlt = 0; set attribsRefdFromAction = set_init; /* MR20 */ int UsedOldStyleAttrib = 0; int UsedNewStyleLabel = 0; #ifdef __USE_PROTOS char *inline_set(char *); #else char *inline_set(); #endif /* MR1 10-Apr-97 MR1 Previously unable to put right shift operator */ /* MR1 in DLG action */ int tokenActionActive=0; /* MR1 */ >> <<%%lexaction static char * #ifdef __USE_PROTOS getFileNameFromTheLineInfo(char *toStr, char *fromStr) #else getFileNameFromTheLineInfo(toStr, fromStr) char *toStr, *fromStr; #endif { int i, j, k; if (!fromStr || !toStr) return toStr; /* find the first " */ for (i=0; (i> <<%%lexaction #ifdef __USE_PROTOS void mark_label_used_in_sem_pred(LabelEntry *le) /* MR10 */ #else void mark_label_used_in_sem_pred(le) /* MR10 */ LabelEntry *le; #endif { TokNode *tn; require (le->elem->ntype == nToken,"mark_label_used... ntype != nToken"); tn=(TokNode *)le->elem; require (tn->label != 0,"mark_label_used... TokNode has no label"); tn->label_used_in_semantic_pred=1; } >> %%START @ << NLA = Eof; /* L o o k F o r A n o t h e r F i l e */ { FILE *new_input; new_input = NextFile(); if ( new_input == NULL ) { NLA=Eof; return; } fclose( input ); input = new_input; zzrdstream( input ); zzskip(); /* Skip the Eof (@) char i.e continue */ } >> [\t\ ]+ << NLA = 76; zzskip(); >> \n|\r|\r\n << NLA = 77; zzline++; zzskip(); >> \[ << NLA = 78; zzmode(ACTIONS); zzmore(); istackreset(); pushint(']'); >> \<\< << NLA = 79; action_file=CurFile; action_line=zzline; zzmode(ACTIONS); zzmore(); list_free(&CurActionLabels,0); /* MR10 */ numericActionLabel=0; /* MR10 */ istackreset(); pushint('>'); >> \" << NLA = 80; zzmode(STRINGS); zzmore(); >> /\* << NLA = 81; zzmode(COMMENTS); zzskip(); >> \*/ << NLA = 82; warn("Missing /*; found dangling */"); zzskip(); >> // << NLA = 83; zzmode(CPP_COMMENTS); zzskip(); >> #line[\ \t]* [0-9]+ {[\ \t]* \"~[\"]+\" ([\ \t]* [0-9]*)* } (\n|\r|\r\n) << NLA = 84; zzline = atoi(zzbegexpr+5) - 1; zzline++; zzmore(); getFileNameFromTheLineInfo(FileStr[CurFile], zzbegexpr); >> #line ~[\n\r]* (\n|\r|\r\n) << NLA = 85; zzline++; zzmore(); >> \>\> << NLA = 86; warn("Missing <<; found dangling \>\>"); zzskip(); >> . << NLA = WildCard; >> \@ << NLA = 88; FoundException = 1; /* MR6 */ FoundAtOperator = 1; >> {\\}#pragma << NLA = Pragma; >> {\\}#FirstSetSymbol << NLA = FirstSetSymbol; >> {\\}#header << NLA = 94; >> {\\}#first << NLA = 95; >> {\\}#parser << NLA = 96; >> {\\}#tokdefs << NLA = 97; >> \} << NLA = 98; >> class << NLA = 99; >> \{ << NLA = 102; >> ! << NLA = 103; >> \< << NLA = 104; >> \> << NLA = 105; >> : << NLA = 106; >> ; << NLA = 107; >> {\\}#lexaction << NLA = 108; >> {\\}#lexmember << NLA = 109; >> {\\}#lexprefix << NLA = 110; >> {\\}#pred << NLA = 111; >> \|\| << NLA = 112; >> && << NLA = 113; >> \( << NLA = 114; >> \) << NLA = 115; >> {\\}#lexclass << NLA = 116; >> {\\}#errclass << NLA = 117; >> {\\}#tokclass << NLA = 118; >> .. << NLA = 119; >> {\\}#token << NLA = 120; >> = << NLA = 121; >> [0-9]+ << NLA = 122; >> \| << NLA = 123; >> \~ << NLA = 124; >> ^ << NLA = 125; >> approx << NLA = 126; >> LL\(1\) << NLA = 127; >> LL\(2\) << NLA = 128; >> \* << NLA = 129; >> \+ << NLA = 130; >> ? << NLA = 131; >> => << NLA = 132; >> exception << NLA = 133; >> default << NLA = 134; >> catch << NLA = 135; >> [a-z] [A-Za-z0-9_]* << NLA = NonTerminal; while ( zzchar==' ' || zzchar=='\t' ) { zzadvance(); } if ( zzchar == ':' && inAlt ) NLA = LABEL; >> [A-Z] [A-Za-z0-9_]* << NLA = TokenTerm; while ( zzchar==' ' || zzchar=='\t' ) { zzadvance(); } if ( zzchar == ':' && inAlt ) NLA = LABEL; >> {\\}#[A-Za-z0-9_]* << NLA = 136; warn(eMsg1("unknown meta-op: %s",LATEXT(1))); zzskip(); >> %%STRINGS @ << NLA = Eof; >> \" << NLA = QuotedTerm; zzmode(START); >> \n|\r|\r\n << NLA = 3; zzline++; warn("eoln found in string"); zzskip(); >> \\(\n|\r|\r\n) << NLA = 4; zzline++; zzmore(); >> \\~[] << NLA = 5; zzmore(); >> ~[\n\r\"\\]+ << NLA = 6; zzmore(); >> %%ACTION_STRINGS @ << NLA = Eof; >> \" << NLA = 7; zzmode(ACTIONS); zzmore(); >> \n|\r|\r\n << NLA = 8; zzline++; warn("eoln found in string (in user action)"); zzskip(); >> \\(\n|\r|\r\n) << NLA = 9; zzline++; zzmore(); >> \\~[] << NLA = 10; zzmore(); >> ~[\n\r\"\\]+ << NLA = 11; zzmore(); >> %%ACTION_CHARS @ << NLA = Eof; >> ' << NLA = 12; zzmode(ACTIONS); zzmore(); >> \n|\r|\r\n << NLA = 13; zzline++; warn("eoln found in char literal (in user action)"); zzskip(); >> \\~[] << NLA = 14; zzmore(); >> ~[\n\r'\\]+ << NLA = 15; zzmore(); >> %%ACTION_COMMENTS @ << NLA = Eof; >> \*/ << NLA = 16; zzmode(ACTIONS); zzmore(); >> \* << NLA = 17; zzmore(); >> \n|\r|\r\n << NLA = 18; zzline++; zzmore(); DAWDLE; >> ~[\n\r\*]+ << NLA = 19; zzmore(); >> %%TOK_DEF_COMMENTS @ << NLA = Eof; >> \*/ << NLA = 20; zzmode(PARSE_ENUM_FILE); zzmore(); >> \* << NLA = 21; zzmore(); >> \n|\r|\r\n << NLA = 22; zzline++; zzmore(); DAWDLE; >> ~[\n\r\*]+ << NLA = 23; zzmore(); >> %%TOK_DEF_CPP_COMMENTS @ << NLA = Eof; >> \n|\r|\r\n << NLA = 24; zzline++; zzmode(PARSE_ENUM_FILE); zzskip(); DAWDLE; >> ~[\n\r]+ << NLA = 25; zzskip(); >> %%ACTION_CPP_COMMENTS @ << NLA = Eof; >> \n|\r|\r\n << NLA = 26; zzline++; zzmode(ACTIONS); zzmore(); DAWDLE; >> ~[\n\r]+ << NLA = 27; zzmore(); >> %%CPP_COMMENTS @ << NLA = Eof; >> \n|\r|\r\n << NLA = 28; zzline++; zzmode(START); zzskip(); DAWDLE; >> ~[\n\r]+ << NLA = 29; zzskip(); >> %%COMMENTS @ << NLA = Eof; >> \*/ << NLA = 30; zzmode(START); zzskip(); >> \* << NLA = 31; zzskip(); >> \n|\r|\r\n << NLA = 32; zzline++; zzskip(); DAWDLE; >> ~[\n\r\*]+ << NLA = 33; zzskip(); >> %%ACTIONS @ << NLA = Eof; >> \>\> << NLA = Action; /* these do not nest */ zzmode(START); NLATEXT[0] = ' '; NLATEXT[1] = ' '; zzbegexpr[0] = ' '; zzbegexpr[1] = ' '; if ( zzbufovf ) { err( eMsgd("action buffer overflow; size %d",ZZLEXBUFSIZE)); } /* MR1 10-Apr-97 MR1 Previously unable to put right shift operator */ /* MR1 in DLG action */ /* MR1 Doesn't matter what kind of action it is - reset*/ tokenActionActive=0; /* MR1 */ >> \>\>? << NLA = Pred; /* these do not nest */ zzmode(START); NLATEXT[0] = ' '; NLATEXT[1] = ' '; zzbegexpr[0] = '\0'; if ( zzbufovf ) { err( eMsgd("predicate buffer overflow; size %d",ZZLEXBUFSIZE)); }; #ifdef __cplusplus__ /* MR10 */ list_apply(CurActionLabels, (void (*)(void *))mark_label_used_in_sem_pred); #else #ifdef __STDC__ /* MR10 */ list_apply(CurActionLabels, (void (*)(void *))mark_label_used_in_sem_pred); #else #ifdef __USE_PROTOS /* MRxx */ list_apply(CurActionLabels, (void (*)(void *))mark_label_used_in_sem_pred); #else /* MR10 */ list_apply(CurActionLabels,mark_label_used_in_sem_pred); #endif #endif #endif >> \] << NLA = PassAction; if ( topint() == ']' ) { popint(); if ( istackempty() ) /* terminate action */ { zzmode(START); NLATEXT[0] = ' '; zzbegexpr[0] = ' '; if ( zzbufovf ) { err( eMsgd("parameter buffer overflow; size %d",ZZLEXBUFSIZE)); } } else { /* terminate $[..] and #[..] */ if ( GenCC ) zzreplstr("))"); else zzreplstr(")"); zzmore(); } } else if ( topint() == '|' ) { /* end of simple [...] */ popint(); zzmore(); } else zzmore(); >> consumeUntil\( [\ \t]* \{~[\}]+\} [\ \t]* \) << NLA = 37; zzmore(); zzreplstr(inline_set(zzbegexpr+ strlen("consumeUntil("))); >> consumeUntil\( ~[\)]+ \) << NLA = 38; zzmore(); >> \n|\r|\r\n << NLA = 39; zzline++; zzmore(); DAWDLE; >> \> << NLA = 40; zzmore(); >> $ << NLA = 41; zzmore(); >> $$ << NLA = 42; if ( !GenCC ) {zzreplstr("zzaRet"); zzmore();} else err("$$ use invalid in C++ mode"); >> $\[\] << NLA = 43; if ( !GenCC ) {zzreplstr("zzempty_attr"); zzmore();} else err("$[] use invalid in C++ mode"); >> $\[ << NLA = 44; pushint(']'); if ( !GenCC ) zzreplstr("zzconstr_attr("); else err("$[..] use invalid in C++ mode"); zzmore(); >> $[0-9]+ << NLA = 45; { static char buf[100]; numericActionLabel=1; /* MR10 */ if ( strlen(zzbegexpr)>(size_t)85 ) fatal("$i attrib ref too big"); set_orel(atoi(zzbegexpr+1), &attribsRefdFromAction); if ( !GenCC ) sprintf(buf,"zzaArg(zztasp%d,%s)", BlkLevel-1,zzbegexpr+1); else sprintf(buf,"_t%d%s", BlkLevel-1,zzbegexpr+1); zzreplstr(buf); zzmore(); UsedOldStyleAttrib = 1; if ( UsedNewStyleLabel ) err("cannot mix old-style $i with new-style labels"); } >> $[0-9]+. << NLA = 46; { static char buf[100]; numericActionLabel=1; /* MR10 */ if ( strlen(zzbegexpr)>(size_t)85 ) fatal("$i.field attrib ref too big"); zzbegexpr[strlen(zzbegexpr)-1] = ' '; set_orel(atoi(zzbegexpr+1), &attribsRefdFromAction); if ( !GenCC ) sprintf(buf,"zzaArg(zztasp%d,%s).", BlkLevel-1,zzbegexpr+1); else sprintf(buf,"_t%d%s.", BlkLevel-1,zzbegexpr+1); zzreplstr(buf); zzmore(); UsedOldStyleAttrib = 1; if ( UsedNewStyleLabel ) err("cannot mix old-style $i with new-style labels"); } >> $[0-9]+.[0-9]+ << NLA = 47; { static char buf[100]; static char i[20], j[20]; char *p,*q; numericActionLabel=1; /* MR10 */ if (strlen(zzbegexpr)>(size_t)85) fatal("$i.j attrib ref too big"); for (p=zzbegexpr+1,q= &i[0]; *p!='.'; p++) { if ( q == &i[20] ) fatalFL("i of $i.j attrib ref too big", FileStr[CurFile], zzline ); *q++ = *p; } *q = '\0'; for (p++, q= &j[0]; *p!='\0'; p++) { if ( q == &j[20] ) fatalFL("j of $i.j attrib ref too big", FileStr[CurFile], zzline ); *q++ = *p; } *q = '\0'; if ( !GenCC ) sprintf(buf,"zzaArg(zztasp%s,%s)",i,j); else sprintf(buf,"_t%s%s",i,j); zzreplstr(buf); zzmore(); UsedOldStyleAttrib = 1; if ( UsedNewStyleLabel ) err("cannot mix old-style $i with new-style labels"); } >> $[_a-zA-Z][_a-zA-Z0-9]* << NLA = 48; { static char buf[300]; LabelEntry *el; zzbegexpr[0] = ' '; if ( CurRule != NULL && strcmp(CurRule, &zzbegexpr[1])==0 ) { if ( !GenCC ) zzreplstr("zzaRet"); } else if ( CurRetDef != NULL && strmember(CurRetDef, &zzbegexpr[1])) { if ( hasMultipleOperands( CurRetDef ) ) { require (strlen(zzbegexpr)<=(size_t)285, "$retval attrib ref too big"); sprintf(buf,"_retv.%s",&zzbegexpr[1]); zzreplstr(buf); } else zzreplstr("_retv"); } else if ( CurParmDef != NULL && strmember(CurParmDef, &zzbegexpr[1])) { ; } else if ( Elabel==NULL ) { { err("$-variables in actions outside of rules are not allowed"); } } else if ( (el=(LabelEntry *)hash_get(Elabel, &zzbegexpr[1]))!=NULL ) { /* MR10 */ /* MR10 */ /* element labels might exist without an elem when */ /* MR10 */ /* it is a forward reference (to a rule) */ /* MR10 */ /* MR10 */ if ( GenCC && (el->elem == NULL || el->elem->ntype==nRuleRef) ) /* MR10 */ { err(eMsg1("There are no token ptrs for rule references: '$%s'",&zzbegexpr[1])); } /* MR10 */ /* MR10 */ if ( !GenCC && (el->elem == NULL || el->elem->ntype==nRuleRef) && GenAST) { /* MR10 */ err("You can no longer use attributes returned by rules when also using ASTs"); /* MR10 */ err(" Use upward inheritance (\"rule >[Attrib a] : ... <<$a=...\>\>\")"); /* MR10 */ }; /* MR10 */ /* MR10 */ /* keep track of <<... $label ...>> for semantic predicates in guess mode */ /* MR10 */ /* element labels contain pointer to the owners node */ /* MR10 */ /* MR10 */ if (el->elem != NULL && el->elem->ntype == nToken) { /* MR10 */ list_add(&CurActionLabels,el); /* MR10 */ }; } else warn(eMsg1("$%s not parameter, return value, (defined) element label",&zzbegexpr[1])); } zzmore(); >> #0 << NLA = 49; zzreplstr("(*_root)"); zzmore(); chkGTFlag(); >> #\[\] << NLA = 50; if ( GenCC ) { if (NewAST) zzreplstr("(newAST)"); else zzreplstr("(new AST)");} else {zzreplstr("zzastnew()");} zzmore(); chkGTFlag(); >> #\(\) << NLA = 51; zzreplstr("NULL"); zzmore(); chkGTFlag(); >> #[0-9]+ << NLA = 52; { static char buf[100]; if ( strlen(zzbegexpr)>(size_t)85 ) fatal("#i AST ref too big"); if ( GenCC ) sprintf(buf,"_ast%d%s",BlkLevel-1,zzbegexpr+1); else sprintf(buf,"zzastArg(%s)",zzbegexpr+1); zzreplstr(buf); zzmore(); set_orel(atoi(zzbegexpr+1), &AST_nodes_refd_in_actions); chkGTFlag(); } >> #line[\ \t]* [0-9]+ {[\ \t]* \"~[\"]+\" ([\ \t]* [0-9]*)* } (\n|\r|\r\n) << NLA = 53; zzline = atoi(zzbegexpr+5) - 1; zzline++; zzmore(); getFileNameFromTheLineInfo(FileStr[CurFile], zzbegexpr); >> #line ~[\n\r]* (\n|\r|\r\n) << NLA = 54; zzline++; zzmore(); >> #[_a-zA-Z][_a-zA-Z0-9]* << NLA = 55; if ( !(strcmp(zzbegexpr, "#ifdef")==0 || strcmp(zzbegexpr, "#if")==0 || strcmp(zzbegexpr, "#else")==0 || strcmp(zzbegexpr, "#endif")==0 || strcmp(zzbegexpr, "#ifndef")==0 || strcmp(zzbegexpr, "#define")==0 || strcmp(zzbegexpr, "#pragma")==0 || strcmp(zzbegexpr, "#undef")==0 || strcmp(zzbegexpr, "#import")==0 || strcmp(zzbegexpr, "#line")==0 || strcmp(zzbegexpr, "#include")==0 || strcmp(zzbegexpr, "#error")==0) ) { static char buf[100]; sprintf(buf, "%s_ast", zzbegexpr+1); /* MR27 */ list_add(&CurAstLabelsInActions, mystrdup(zzbegexpr+1)); zzreplstr(buf); chkGTFlag(); } zzmore(); >> #\[ << NLA = 56; pushint(']'); if ( GenCC ) { if (NewAST) zzreplstr("(newAST("); else zzreplstr("(new AST("); } else zzreplstr("zzmk_ast(zzastnew(),"); zzmore(); chkGTFlag(); >> #\( << NLA = 57; pushint('}'); if ( GenCC ) { if (tmakeInParser) { zzreplstr("tmake("); } else { zzreplstr("ASTBase::tmake("); } } else { zzreplstr("zztmake("); } zzmore(); chkGTFlag(); >> # << NLA = 58; zzmore(); >> \) << NLA = 59; if ( istackempty() ) zzmore(); else if ( topint()==')' ) { popint(); } else if ( topint()=='}' ) { popint(); /* terminate #(..) */ zzreplstr(", NULL)"); } zzmore(); >> \[ << NLA = 60; pushint('|'); /* look for '|' to terminate simple [...] */ zzmore(); >> \( << NLA = 61; pushint(')'); zzmore(); >> \\\] << NLA = 62; zzreplstr("]"); zzmore(); >> \\\) << NLA = 63; zzreplstr(")"); zzmore(); >> \\> << NLA = 64; if (! tokenActionActive) zzreplstr(">"); /* MR1 */ zzmore(); /* MR1 */ >> ' << NLA = 65; zzmode(ACTION_CHARS); zzmore(); >> \" << NLA = 66; zzmode(ACTION_STRINGS); zzmore(); >> \\$ << NLA = 67; zzreplstr("$"); zzmore(); >> \\# << NLA = 68; zzreplstr("#"); zzmore(); >> \\(\n|\r|\r\n) << NLA = 69; zzline++; zzmore(); >> \\~[\]\)>$#] << NLA = 70; zzmore(); >> / << NLA = 71; zzmore(); >> /\* << NLA = 72; zzmode(ACTION_COMMENTS); zzmore(); >> \*/ << NLA = 73; warn("Missing /*; found dangling */ in action"); zzmore(); >> // << NLA = 74; zzmode(ACTION_CPP_COMMENTS); zzmore(); >> ~[\n\r\)\(\\$#\>\]\[\"'/]+ << NLA = 75; zzmore(); >> %%PARSE_ENUM_FILE @ << NLA = Eof; ; >> [\t\ ]+ << NLA = 137; zzskip(); >> \n|\r|\r\n << NLA = 138; zzline++; zzskip(); >> // << NLA = 139; zzmode(TOK_DEF_CPP_COMMENTS); zzmore(); >> /\* << NLA = 140; zzmode(TOK_DEF_COMMENTS); zzskip(); >> #ifdef << NLA = 141; zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); >> #if << NLA = 142; zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); >> #ifndef << NLA = 143; ; >> #else << NLA = 144; zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); >> #endif << NLA = 145; zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); >> #undef << NLA = 146; zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); >> #import << NLA = 147; zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); >> #define << NLA = 149; >> enum << NLA = 151; >> \{ << NLA = 152; >> = << NLA = 153; >> , << NLA = 154; >> \} << NLA = 155; >> ; << NLA = 156; >> [0-9]+ << NLA = INT; >> [a-zA-Z_][_a-zA-Z0-9]* << NLA = ID; >> %% gtkwave-3.3.86/contrib/pccts/antlr/AntlrMSVC50.dsp0000664000175000017500000001505713166335473021136 0ustar bybellbybell# Microsoft Developer Studio Project File - Name="ANTLR" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 5.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=ANTLR - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "AntlrMSVC50.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "AntlrMSVC50.mak" CFG="ANTLR - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "ANTLR - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "ANTLR - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "ANTLR - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "." # PROP Intermediate_Dir "." # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /W3 /O2 /I "." /I "..\h" /I "..\support\set" /D "__STDC__" /D "NDEBUG" /D "LONGFILENAMES" /D "PC" /D "USER_ZZSYN" /D ZZLEXBUFSIZE=65536 /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FR /FD /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"./Antlr.exe" # Begin Special Build Tool SOURCE=$(InputPath) PostBuild_Desc=Copy antlr to ..\bin directory PostBuild_Cmds=mkdir ..\bin copy ..\bin\antlr.exe antlr_old.exe copy antlr.exe\ ..\bin\. # End Special Build Tool !ELSEIF "$(CFG)" == "ANTLR - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "." # PROP Intermediate_Dir "." # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /W3 /Gm /Zi /Od /I "." /I "..\h" /I "..\support\set" /D "__STDC__" /D "LONGFILENAMES" /D "PC" /D "USER_ZZSYN" /D ZZLEXBUFSIZE=65536 /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FR /FD /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo -DUSER_ZZSYN -D__STDC__ LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"./Antlr.exe" /pdbtype:sept # Begin Special Build Tool SOURCE=$(InputPath) PostBuild_Desc=Copy antlr to ..\bin PostBuild_Cmds=mkdir ..\bin copy ..\bin\antlr.exe antlr_old.exe copy antlr.exe\ ..\bin\. # End Special Build Tool !ENDIF # Begin Target # Name "ANTLR - Win32 Release" # Name "ANTLR - Win32 Debug" # Begin Source File SOURCE=.\antlr.c # End Source File # Begin Source File SOURCE=.\antlr.g !IF "$(CFG)" == "ANTLR - Win32 Release" # Begin Custom Build - Building ANTLR Parser from ANTLR Grammar InputPath=.\antlr.g InputName=antlr BuildCmds= \ ../bin/antlr -gh $(InputName).g \ ../bin/dlg -C2 parser.dlg scan.c \ "antlr.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "err.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "mode.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "scan.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "tokens.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "parser.dlg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) # End Custom Build !ELSEIF "$(CFG)" == "ANTLR - Win32 Debug" # Begin Custom Build - Building ANTLR Parser from ANTLR Grammar InputPath=.\antlr.g InputName=antlr BuildCmds= \ ..\bin\antlr -gh $(InputName).g \ ..\bin\dlg -C2 parser.dlg scan.c \ "antlr.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "err.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "mode.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "scan.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "tokens.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "parser.dlg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=.\bits.c # End Source File # Begin Source File SOURCE=.\build.c # End Source File # Begin Source File SOURCE=.\egman.c # End Source File # Begin Source File SOURCE=.\err.c !IF "$(CFG)" == "ANTLR - Win32 Release" !ELSEIF "$(CFG)" == "ANTLR - Win32 Debug" # SUBTRACT CPP /YX /Yc /Yu !ENDIF # End Source File # Begin Source File SOURCE=.\fcache.c # End Source File # Begin Source File SOURCE=.\fset.c # End Source File # Begin Source File SOURCE=.\fset2.c # End Source File # Begin Source File SOURCE=.\gen.c # End Source File # Begin Source File SOURCE=.\globals.c # End Source File # Begin Source File SOURCE=.\hash.c # End Source File # Begin Source File SOURCE=.\lex.c # End Source File # Begin Source File SOURCE=.\main.c # End Source File # Begin Source File SOURCE=.\misc.c # End Source File # Begin Source File SOURCE=.\mrhoist.c # End Source File # Begin Source File SOURCE=.\pred.c # End Source File # Begin Source File SOURCE=.\scan.c # End Source File # Begin Source File SOURCE=..\support\set\set.c # End Source File # End Target # End Project gtkwave-3.3.86/contrib/pccts/antlr/watantlr.mak0000664000175000017500000000220213166335473021022 0ustar bybellbybellSET=..\support\set PCCTS_H=..\h # # Watcom # CC=wcl386 ANTLR=..\bin\antlr DLG=..\bin\dlg CFLAGS= -I. -I$(SET) -I$(PCCTS_H) -DUSER_ZZSYN -DPC OUT_OBJ = -o OBJ_EXT = obj LINK = wcl386 .c.obj : $(CC) -c $[* $(CFLAGS) antlr.exe: antlr.obj scan.obj err.obj bits.obj build.obj fset2.obj & fset.obj gen.obj globals.obj hash.obj lex.obj main.obj & misc.obj set.obj pred.obj $(LINK) -fe=antlr.exe *.obj -k14336 copy *.exe ..\bin # *********** Target list of PC machines *********** # # Don't worry about the ambiguity messages coming from antlr # for making antlr.c etc... [should be 10 of them, I think] # antlr.c stdpccts.h parser.dlg tokens.h err.c : antlr.g $(ANTLR) antlr.g antlr.$(OBJ_EXT): antlr.c mode.h tokens.h scan.$(OBJ_EXT): scan.c mode.h tokens.h scan.c mode.h: parser.dlg $(DLG) -C2 parser.dlg scan.c set.$(OBJ_EXT): $(SET)\set.c $(CC) $(CFLAGS) -c set.$(OBJ_EXT) $(SET)\set.c # # ****** These next targets are common to UNIX and PC world ******** # #clean up all the intermediate files clean: del *.obj #remove everything in clean plus the PCCTS files generated scrub: del $(PCCTS_GEN) del *.$(OBJ_EXT) EOF_watantlr.mak gtkwave-3.3.86/contrib/pccts/antlr/hash.c0000664000175000017500000001237613166335473017600 0ustar bybellbybell/* * hash.c * * Manage hash tables. * * The following functions are visible: * * char *mystrdup(char *); Make space and copy string * Entry **newHashTable(); Create and return initialized hash table * Entry *hash_add(Entry **, char *, Entry *) * Entry *hash_get(Entry **, char *) * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * ANTLR 1.33 * Terence Parr * Parr Research Corporation * with Purdue University and AHPCRC, University of Minnesota * 1989-2001 */ #include #include "pcctscfg.h" #include "hash.h" #ifdef __USE_PROTOS #include #else #ifdef VAXC #include #else #include #endif #endif #include #define StrSame 0 #define fatal(err) \ {fprintf(stderr, "%s(%d):", __FILE__, __LINE__); \ fprintf(stderr, " %s\n", err); exit(PCCTS_EXIT_FAILURE);} #define require(expr, err) {if ( !(expr) ) fatal(err);} static unsigned size = HashTableSize; static char *strings = NULL; static char *strp; static unsigned strsize = StrTableSize; /* create the hash table and string table for terminals (string table only once) */ Entry ** #ifdef __USE_PROTOS newHashTable( void ) #else newHashTable( ) #endif { Entry **table; table = (Entry **) calloc(size, sizeof(Entry *)); require( table != NULL, "cannot allocate hash table"); if ( strings == NULL ) { strings = (char *) calloc(strsize, sizeof(char)); require( strings != NULL, "cannot allocate string table"); strp = strings; } return table; } void #ifdef __USE_PROTOS killHashTable( Entry **table ) #else killHashTable( table ) Entry **table; #endif { /* for now, just free table, forget entries */ free( (char *) table ); /* MR10 cast */ } /* Given a table, add 'rec' with key 'key' (add to front of list). return ptr to entry */ Entry * #ifdef __USE_PROTOS hash_add( Entry **table, char *key, Entry *rec ) #else hash_add( table, key, rec ) Entry **table; char *key; Entry *rec; #endif { unsigned h=0; char *p=key; require(table!=NULL && key!=NULL && rec!=NULL, "add: invalid addition"); Hash(p,h,size); rec->next = table[h]; /* Add to singly-linked list */ table[h] = rec; return rec; } /* Return ptr to 1st entry found in table under key (return NULL if none found) */ Entry * #ifdef __USE_PROTOS hash_get( Entry **table, char *key ) #else hash_get( table, key ) Entry **table; char *key; #endif { unsigned h=0; char *p=key; Entry *q; /* require(table!=NULL && key!=NULL, "get: invalid table and/or key");*/ if ( !(table!=NULL && key!=NULL) ) *((char *) 34) = 3; Hash(p,h,size); for (q = table[h]; q != NULL; q = q->next) { if ( strcmp(key, q->str) == StrSame ) return( q ); } return( NULL ); } #ifdef DEBUG_HASH void #ifdef __USE_PROTOS hashStat( Entry **table ) #else hashStat( table ) Entry **table; #endif { static unsigned short count[20]; int i,n=0,low=0, hi=0; Entry **p; float avg=0.0; for (i=0; i<20; i++) count[i] = 0; for (p=table; p<&(table[size]); p++) { Entry *q = *p; int len; if ( q != NULL && low==0 ) low = p-table; len = 0; if ( q != NULL ) fprintf(stderr, "[%d]", p-table); while ( q != NULL ) { len++; n++; fprintf(stderr, " %s", q->str); q = q->next; if ( q == NULL ) fprintf(stderr, "\n"); } count[len]++; if ( *p != NULL ) hi = p-table; } fprintf(stderr, "Storing %d recs used %d hash positions out of %d\n", n, size-count[0], size); fprintf(stderr, "%f %% utilization\n", ((float)(size-count[0]))/((float)size)); for (i=0; i<20; i++) { if ( count[i] != 0 ) { avg += (((float)(i*count[i]))/((float)n)) * i; fprintf(stderr, "Bucket len %d == %d (%f %% of recs)\n", i, count[i], ((float)(i*count[i]))/((float)n)); } } fprintf(stderr, "Avg bucket length %f\n", avg); fprintf(stderr, "Range of hash function: %d..%d\n", low, hi); } #endif /* Add a string to the string table and return a pointer to it. * Bump the pointer into the string table to next avail position. */ char * #ifdef __USE_PROTOS mystrdup( char *s ) #else mystrdup( s ) char *s; #endif { char *start=strp; require(s!=NULL, "mystrdup: NULL string"); while ( *s != '\0' ) { require( strp <= &(strings[strsize-2]), "string table overflow\nIncrease StrTableSize in hash.h and recompile hash.c\n"); *strp++ = *s++; } *strp++ = '\0'; return( start ); } gtkwave-3.3.86/contrib/pccts/antlr/globals.c0000664000175000017500000004146213166335473020276 0ustar bybellbybell/* * globals.c -- File containing all variables/tables visible to all files. * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * ANTLR 1.33 * Terence Parr * Parr Research Corporation * with Purdue University and AHPCRC, University of Minnesota * 1989-2001 */ #include #include "pcctscfg.h" #include "set.h" #include "syn.h" #include "hash.h" #include "generic.h" char Version[] = "1.33MR33" ; /* PCCTS version number */ /* MRXXX */ char VersionDef[] = "13333"; /* same (except int equiv for preproc symbol) */ /* MRXXX */ char LexStartSymbol[] = "START";/* Name of starting lexical class/automaton */ char *RemapFileName = "remap.h"; char *DlgFileName = "parser.dlg"; char *DefFileName = "tokens.h"; char *ErrFileName = "err.c"; char *ModeFileName = "mode.h"; char *StdMsgName = NULL; char *ParserName = DefaultParserName; /* list of PCCTS supplied support symbols; these are renamed when more than * one ANTLR-generated parsers are linked together to avoid name conflicts. * Can't use '##' ANSIC preprocessor concat operator with K&R and: * #define zzskip zzparser ## skip * will not work for ANSI/C++ as 'zzparserskip' is created w/o zzparser * being substituted--ack!!! */ char *StandardSymbols[] = { /* ANTLR stuff */ "zzStackOvfMsg", "zzasp", "zzaStack", "inf_tokens", "inf_text", "inf_text_buffer", "inf_text_buffer_ptr", "inf_text_buffer_size", "inf_labase", "inf_last", "inf_lap", "zztokenLA", "zztextLA", "zzlap", "zzlabase", "zztoktext", "zztoken", "zzdirty", "zzguessing", "zzguess_start", "zzresynch", "zzinf_tokens", "zzinf_text", "zzinf_text_buffer", "zzinf_labase", "zzinf_last", "zzfill_inf_look", "zzFAIL", "zzsave_antlr_state", "zzrestore_antlr_state", "zzsyn", "zzset_el", "zzset_deg", "zzedecode", "_zzsetmatch", "_zzmatch", "_inf_zzgettok", "zzconsumeUntil", "zzconsumeUntilToken", "_zzmatch_wsig", "_zzsetmatch_wsig", "_zzmatch_wdfltsig", "_zzsetmatch_wdfltsig", "zzdflthandlers", /* DLG stuff */ "zzreal_line", "zzcharfull", "zzerr", "zzlextext", "zzbegexpr", "zzendexpr", "zzbufsize", "zzbegcol", "zzendcol", "zzline", "zzchar", "zzbufovf", "zzrdstream", "zzrdfunc", "zzrdstr", "zzclose_stream", "zzsave_dlg_state", "zzrestore_dlg_state", "zzmode", "zzskip", "zzmore", "zzreplchar", "zzreplstr", "zzgettok", "zzadvance", "zzerrstd", "zzerr_in", "zzconstr_attr", "zzempty_attr", "zzerraction", "zztokens", /* list of token regular expressions */ "dfa", "accepts", "actions", "zzTraceOptionValue", /* MR10 */ "zzTraceGuessOptionValue", /* MR10 */ "zzTraceCurrentRuleName", /* MR10 */ "zzTraceDepth", /* MR10 */ "zzGuessSeq", /* MR10 */ "zzSyntaxErrCount", /* MR11 */ "zzLexErrCount", /* MR11 */ "zzTraceGuessDone", /* MR13 - BJS */ "zzTraceGuessFail", /* MR13 - BJS */ "zzTraceGuessOption", /* MR13 - BJS */ "zzTraceIn", /* MR13 - BJS */ "zzTraceOption", /* MR13 - BJS */ "zzTraceOut", /* MR13 - BJS */ "zzTraceReset", /* MR13 - BJS */ NULL /* must be present */ }; /* list of PCCTS supplied support functions; these are renamed when more than * one ANTLR-generated parsers are linked together to avoid name conflicts. */ char *ASTSymbols[] = { "AST", "zzast_sp", "zzastStack", "zzlink", "zzastnew", "zzsubchild", "zzsubroot", "zzpre_ast", "zzfree_ast", "zztmake", "zzdup_ast", "zztfree", "zzdouble_link", NULL /* must be present */ }; /* Current ambiguity examination information */ int CurAmbigAlt1, CurAmbigAlt2, CurAmbigline, CurAmbigfile; char *CurAmbigbtype; /* M e t h o d T a b l e s */ /* * The following tables are used to fill syntax diagram nodes with the correct * function pointers for computing FIRST sets and printing themselves. */ /* fpTraverse[node type] == pointer to function that calculates trees * representing the FIRST sets for that node (maintains spatial info). * We use 'struct _tree' not 'tree' due to a g++ 2.4.3 bug. */ #ifdef __cplusplus struct _tree *(*fpTraverse[NumNodeTypes+1])(... /* Node *, int, set * */) = { NULL, (struct _tree *(*)(...)) tJunc, (struct _tree *(*)(...)) tRuleRef, (struct _tree *(*)(...)) tToken, (struct _tree *(*)(...)) tAction }; #else Tree *(*fpTraverse[NumNodeTypes+1])() = { NULL, tJunc, tRuleRef, tToken, tAction }; #endif /* fpReach[node type] == pointer to function that calculates FIRST set for * that node. (r stands for reach). We use 'struct _set' not 'set' * due to a g++ 2.4.3 bug. */ #ifdef __cplusplus struct _set (*fpReach[NumNodeTypes+1])(... /* Node *, int, set * */) = { NULL, (struct _set (*)(...)) rJunc, (struct _set (*)(...)) rRuleRef, (struct _set (*)(...)) rToken, (struct _set (*)(...)) rAction }; #else set (*fpReach[NumNodeTypes+1])() = { NULL, rJunc, rRuleRef, rToken, rAction }; #endif /* fpPrint[node type] == pointer to function that knows how to print that node. */ #ifdef __cplusplus void (*fpPrint[NumNodeTypes+1])(... /* Node * */) = { NULL, (void (*)(...)) pJunc, (void (*)(...)) pRuleRef, (void (*)(...)) pToken, (void (*)(...)) pAction }; #else void (*fpPrint[NumNodeTypes+1])() = { NULL, pJunc, pRuleRef, pToken, pAction }; #endif char *decodeJType[] = { "invalid", "aSubBlk", "aOptBlk", "aLoopBlk", "EndBlk", "RuleBlk", "Generic", "EndRule", "aPlusBlk", "aLoopBegin" }; /* H a s h T a b l e s */ Entry **Tname, /* Table of all token names (maps name to tok num)*/ **Texpr, /* Table of all token expressions (maps expr to tok num) */ **Rname, /* Table of all Rules (has ptr to start of rule) */ **Fcache, /* Cache of First/Follow Computations */ **Tcache; /* Tree cache; First/Follow for permute trees */ Entry **Elabel; /* Table of all element label names */ Entry **Sname; /* Signal names */ Entry **Pname; /* symbolic predicate names MR11 */ /* V a r i a b l e s */ int Save_argc; /* MR10 */ char **Save_argv; /* MR10 */ int EpToken=0; /* Imaginary Epsilon token number */ int WildCardToken=0; int CurFile= -1; /* Index into FileStr table */ char *CurPredName=NULL; /* MR11 */ char *CurRule=NULL; /* Pointer to current rule name */ int CurRuleDebug=0; /* MR13 debug flag */ RuleEntry *CurRuleNode=NULL;/* Pointer to current rule node in syntax tree */ char *CurRetDef=NULL; /* Pointer to current return type definition */ char *CurParmDef=NULL; /* Pointer to current parameter definition */ Junction *CurRuleBlk=NULL; /* Pointer to current block node for enclosing block */ ListNode *CurExGroups=NULL; /* Current list of exception groups for rule/alts */ ListNode *CurElementLabels=NULL; ListNode *CurAstLabelsInActions=NULL; /* MR27 */ /* MR10 used by <<>>? to set "label_used_in_semantic_pred" */ /* MR10 this will force LT(i) assignment even in guess mode */ ListNode *CurActionLabels=NULL; /* MR10 Element Labels appearing in last action */ int numericActionLabel=0 ; /* MR10 << ... $1 ... >> or << ... $1 ... >>? */ ListNode *NumericPredLabels=NULL; /* MR10 << ... $1 ... >>? ONLY */ ListNode *ContextGuardPredicateList=NULL; /* MR13 for re-evaluating predicates after meta tokens are defined */ int CurBlockID=0; /* Unique int for each block */ int CurAltNum=0; Junction *CurAltStart = NULL; /* Junction node that starts the alt */ Junction *OuterAltStart = NULL; /* For chaining exception groups MR7 */ int NumRules=0; /* Rules are from 1 to n */ FILE *output=NULL; /* current parser output file */ FILE *input=NULL; /* current grammar input file */ char *FileStr[MaxNumFiles];/* Ptr to array of file names on command-line */ int NumFiles=0; /* current grammar file number */ #ifdef __cplusplus void (**fpTrans)(...), /* array of ptrs to funcs that translate nodes */ (**fpJTrans)(...); /* ... that translate junctions */ #else void (**fpTrans)(), /* array of ptrs to funcs that translate nodes */ (**fpJTrans)(); /* ... that translate junctions */ #endif int **FoStack; /* Array of LL_k ptrs to stacks of rule numbers */ int **FoTOS; /* FOLLOW stack top-of-stack pointers */ Junction *SynDiag = NULL; /* Pointer to start of syntax diagram */ int BlkLevel=1; /* Current block level. Set by antlr.g, used by * scanner to translate $i.j attributes */ set reserved_positions; /* set of token positions reserved by '#token T=i' cmds */ set all_tokens; /* set of all token types */ set imag_tokens; /* set of all imaginary token types (EpToken, errclasses...) */ set tokclasses; /* set of all token class token types */ ListNode *ForcedTokens = 0; /* list of token_id/token_num pairs to remap */ ListNode *MetaTokenNodes=NULL; /* list of meta token refs such as token classes etc... */ int *TokenInd=NULL; /* an indirection level between token num and position * of that token def in TokenStr and ExprStr */ int LastTokenCounted=0; /* ==TokenNum if no token renumbering (same as old TokenNum) */ int TokenNum=TokenStart; char **TokenStr=NULL; /* map token # to token name */ char **ExprStr=NULL; /* map token # to expr */ Junction **RulePtr=NULL; /* map rule # to RuleBlk node of rule */ ListNode *ExprOrder=NULL; /* list of exprs as they are found in grammar */ ListNode *BeforeActions=NULL;/* list of grammar actions before rules */ ListNode *AfterActions=NULL;/* list of grammar actions after rules */ ListNode *LexActions=NULL; /* list of lexical actions */ /* MR1 */ /* MR1 11-Apr-97 Provide mechanism for inserting code into DLG class */ /* MR1 via #lexmember <<....>> */ /* MR1 via #lexprefix <<....>> */ /* MR1 */ ListNode *LexMemberActions=NULL;/* list of lexical header member decl MR1 */ ListNode *LexPrefixActions=NULL;/* list of lexical header #include decl MR1 */ ListNode **Cycles=NULL; /* list of cycles (for each k) found when doing FOLLOWs */ ListNode *eclasses=NULL; /* list of error classes */ ListNode *tclasses=NULL; /* list of token classes */ LClass lclass[MaxLexClasses]; /* array of lex class definitions */ int CurrentLexClass; /* index into lclass */ int NumLexClasses=0; /* in range 1..MaxLexClasses (init 0) */ char *HdrAction=NULL; /* action defined with #header */ char *FirstAction=NULL; /* action defined with #first MR11 */ FILE *ErrFile; /* sets and error recovery stuff */ FILE *DefFile=NULL; /* list of tokens, return value structs, setwd defs */ FILE *MRinfoFile=NULL; /* MR10 information file */ int MRinfo=0; /* MR10 */ int MRinfoSeq=0; /* MR10 */ int InfoP=0; /* MR10 predicates */ int InfoT=0; /* MR10 tnodes */ int InfoF=0; /* MR10 first/follow sets */ int InfoM=0; /* MR10 monitor progress */ int InfoO=0; /* MR12 orphan rules */ int TnodesInUse=0; /* MR10 */ int TnodesPeak=0; /* MR10 */ int TnodesAllocated=0; /* MR10 */ int TnodesReportThreshold=0; /* MR11 */ int PotentialSuppression=0; /* MR10 */ int PotentialDummy=0; /* MR10 */ int CannotContinue=FALSE; int OutputLL_k = 1; /* LL_k for parsing must be power of 2 */ int action_file; /* used to track start of action */ int action_line; int FoundGuessBlk=0; /* there is a (...)? block somewhere in grammar */ int FoundException=0; /* there is an exception somewhere in grammar */ /* MR6 Distinguish between @ operator and real exception */ /* MR6 by keeping separate flags for @ operator and real exceptions */ int FoundAtOperator=0; /* MR6 */ int FoundExceptionGroup=0; /* MR6 */ int pLevel=0; /* print Level */ int pAlt1,pAlt2; /* print "==>" in front of these alts */ /* C++ output stuff */ FILE *Parser_h, /* where subclass of ANTLRParser goes */ *Parser_c; /* where code for subclass of ANTLRParser goes */ char Parser_h_Name[MaxFileName+1] = ""; char Parser_c_Name[MaxFileName+1] = ""; char MRinfoFile_Name[MaxFileName+1] = ""; /* MR10 */ char *ClassDeclStuff=NULL; /* MR10 */ char *BaseClassName=NULL; /* MR22 */ /* list of actions inside the #class {...} defs */ ListNode *class_before_actions=NULL; ListNode *class_after_actions=NULL; char CurrentClassName[MaxRuleName]=""; int no_classes_found=1; char *UserTokenDefsFile; int UserDefdTokens=0; /* found #tokdefs? */ char *OutputDirectory=TopDirectory; ExceptionGroup *DefaultExGroup = NULL; int NumSignals = NumPredefinedSignals; int ContextGuardTRAV=0; char *MR_AmbAidRule=NULL; /* MR11 */ int MR_AmbAidLine=0; /* MR11 */ int MR_AmbAidDepth=0; /* MR11 */ int MR_AmbAidMultiple=0; /* MR11 */ int MR_skipped_e3_report=0; /* MR11 */ int MR_usingPredNames=0; /* MR11 */ int MR_BadExprSets=0; /* MR13 */ int MR_Inhibit_Tokens_h_Gen=0; /* MR13 */ int NewAST=0; /* MR13 */ int tmakeInParser=0; /* MR23 */ int AlphaBetaTrace=0; /* MR14 */ int MR_BlkErr=0; /* MR21 */ int MR_AlphaBetaMessageCount=0; /* MR14 */ int MR_AlphaBetaWarning=0; /* MR14 */ int MR_ErrorSetComputationActive=0; /* MR14 */ int MR_MaintainBackTrace=0; /* MR14 */ set MR_CompromisedRules; /* MR14 */ Junction *MR_RuleBlkWithHalt; /* MR10 */ /* C m d - L i n e O p t i o n s */ int LL_k=1; /* how many tokens of full lookahead */ int CLL_k= -1; /* how many tokens of compressed lookahead */ int PrintOut = FALSE; /* print out the grammar */ int PrintAnnotate = FALSE;/* annotate printout with FIRST sets */ int CodeGen=TRUE; /* Generate output code? */ int LexGen=TRUE; /* Generate lexical files? (tokens.h, parser.dlg) */ int GenAST=FALSE; /* Generate AST's? */ int GenANSI=FALSE; /* Generate ANSI code where necessary */ int GenExprSetsOpt=TRUE;/* use sets not (LA(1)==tok) expression lists */ int GenCR=FALSE; /* Generate cross reference? */ int GenLineInfo=FALSE; /* Generate # line "file" stuff? */ int GenLineInfoMS=FALSE;/* Like -gl but replace "\" with "/" for MS C/C++ systems */ int TraceGen=FALSE; /* Generate code to trace rule invocation */ int elevel=1; /* error level for ambiguity messages */ int GenEClasseForRules=0;/* don't generate eclass for each rule */ int TreeResourceLimit= -1;/* don't limit tree resource */ int DemandLookahead = 0;/* demand/delayed lookahead or not */ char *RulePrefix = ""; /* prefix each generated rule with this */ char *stdpccts = "stdpccts.h";/* where to generate std pccts include file */ int GenStdPccts = 0; /* don't gen stdpccts.h? */ int ParseWithPredicates = 1; int WarningLevel = 1; int UseStdout = 0; /* MR6 */ int TabWidth = 2; /* MR6 */ /* MR27 */ int HoistPredicateContext = 0; int MRhoisting = 0; /* MR9 */ int MRhoistingk = 0; /* MR13 */ int MR_debugGenRule=0; /* MR11 */ int GenCC = 0; /* Generate C++ output */ PointerStack MR_BackTraceStack={0,0,NULL}; /* MR10 */ PointerStack MR_PredRuleRefStack={0,0,NULL}; /* MR10 */ PointerStack MR_RuleBlkWithHaltStack={0,0,NULL}; /* MR10 */ /* DontCopyTokens and Pragma_DupLabeledTokens were a bad idea. I've just turned them off rather than backpatching the code. Who knows? We may need them in the future. */ int DontCopyTokens = 1; /* in C++, don't copy ANTLRToken passed to ANTLR */ /* Remember if LT(i), LA(i), or LATEXT(i) used in an action which is not a predicate. If so, give a warning for novice users. */ int LTinTokenAction = 0; /* MR23 */ int PURIFY = 1; /* MR23 */ int CurBlockID_array[MAX_BLK_LEVEL]; /* MR23 */ int CurAltNum_array[MAX_BLK_LEVEL]; /* MR23 */ gtkwave-3.3.86/contrib/pccts/antlr/antlr.g0000664000175000017500000023563013166335473020001 0ustar bybellbybell/* * antlr.g -- PCCTS Version 1.xx ANTLR * * Parse an antlr input grammar and build a syntax-diagram. * * Written in itself (needs at least 1.06 to work) * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * ANTLR 1.33 * Terence Parr * Parr Research Corporation * with Purdue University and AHPCRC, University of Minnesota * 1989-1995 */ /* MR1 */ /* MR1 10-Apr-97 MR1 Replace #if logic with #include "pcctscfg.h" */ /* MR1 */ #header << #include "pcctscfg.h" #include "set.h" #include #include "syn.h" #include "hash.h" #include "generic.h" #define zzcr_attr(attr,tok,t) >> << /* MR20 G. Hobbelt For Borland C++ 4.x & 5.x compiling with ALL warnings enabled */ #if defined(__TURBOC__) #pragma warn -aus /* unused assignment of 'xxx' */ #endif #ifdef __USE_PROTOS static void chkToken(char *, char *, char *, int); #else static void chkToken(); #endif #ifdef __USE_PROTOS static int isDLGmaxToken(char *Token); /* MR3 */ #else static int isDLGmaxToken(); /* MR3 */ #endif static int class_nest_level = 0; /* MR20 G. Hobbelt extern definitions moved to antlr.h */ >> #lexaction << /* maintained, but not used for now */ set AST_nodes_refd_in_actions = set_init; int inAlt = 0; set attribsRefdFromAction = set_init; /* MR20 */ int UsedOldStyleAttrib = 0; int UsedNewStyleLabel = 0; #ifdef __USE_PROTOS char *inline_set(char *); #else char *inline_set(); #endif /* MR1 10-Apr-97 MR1 Previously unable to put right shift operator */ /* MR1 in DLG action */ int tokenActionActive=0; /* MR1 */ >> #lexclass STRINGS #token QuotedTerm "\"" << zzmode(START); >> #token "\n|\r|\r\n" << zzline++; warn("eoln found in string"); zzskip(); >> #token "\\(\n|\r|\r\n)" << zzline++; zzmore(); >> #token "\\~[]" << zzmore(); >> #token "~[\n\r\"\\]+" << zzmore(); >> #lexclass ACTION_STRINGS #token "\"" << zzmode(ACTIONS); zzmore(); >> #token "\n|\r|\r\n" << zzline++; warn("eoln found in string (in user action)"); zzskip(); >> #token "\\(\n|\r|\r\n)" << zzline++; zzmore(); >> #token "\\~[]" << zzmore(); >> #token "~[\n\r\"\\]+" << zzmore(); >> #lexclass ACTION_CHARS #token "'" << zzmode(ACTIONS); zzmore(); >> #token "\n|\r|\r\n" << zzline++; warn("eoln found in char literal (in user action)"); zzskip(); >> #token "\\~[]" << zzmore(); >> #token "~[\n\r'\\]+" << zzmore(); >> #lexclass ACTION_COMMENTS #token "\*/" << zzmode(ACTIONS); zzmore(); >> #token "\*" << zzmore(); >> #token "\n|\r|\r\n" << zzline++; zzmore(); DAWDLE; >> #token "~[\n\r\*]+" << zzmore(); >> #lexclass TOK_DEF_COMMENTS #token "\*/" << zzmode(PARSE_ENUM_FILE); zzmore(); >> #token "\*" << zzmore(); >> #token "\n|\r|\r\n" << zzline++; zzmore(); DAWDLE; >> #token "~[\n\r\*]+" << zzmore(); >> #lexclass TOK_DEF_CPP_COMMENTS #token "\n|\r|\r\n" << zzline++; zzmode(PARSE_ENUM_FILE); zzskip(); DAWDLE; >> #token "~[\n\r]+" << zzskip(); >> #lexclass ACTION_CPP_COMMENTS #token "\n|\r|\r\n" << zzline++; zzmode(ACTIONS); zzmore(); DAWDLE; >> #token "~[\n\r]+" << zzmore(); >> #lexclass CPP_COMMENTS #token "\n|\r|\r\n" << zzline++; zzmode(START); zzskip(); DAWDLE; >> #token "~[\n\r]+" << zzskip(); >> #lexclass COMMENTS #token "\*/" << zzmode(START); zzskip(); >> #token "\*" << zzskip(); >> #token "\n|\r|\r\n" << zzline++; zzskip(); DAWDLE; >> #token "~[\n\r\*]+" << zzskip(); >> /* * This lexical class accepts actions of type [..] and <<..>> * * It translates the following special items for C: * * $j --> "zzaArg(current zztasp, j)" * $i.j --> "zzaArg(zztaspi, j)" * $i.nondigit> "zzaArg(current zztasp, i).nondigit" * $$ --> "zzaRet" * $alnum --> "alnum" (used to ref parameters) * $rule --> "zzaRet" * $retval --> "_retv.retval" if > 1 return values else "_retv" * $[token, text] --> "zzconstr_attr(token, text)" * $[] --> "zzempty_attr()" * * It translates the following special items for C++: * (attributes are now stored with 'Token' and $i's are only * pointers to the Tokens. Rules don't have attributes now.) * * $j --> "_tbj" where b is the block level * $i.j --> "_tij" * $j->nondigit> "_tbj->nondigit" * $$ --> "$$" * $alnum --> "alnum" (used to ref parameters) * $rule --> "$rule" * $retval --> "_retv.retval" if > 1 return values else "_retv" * $[token, text] --> invalid * $[] --> invalid * * And, for trees: * * #0 --> "(*_root)" * #i --> "zzastArg(i)" * #[args] --> "zzmk_ast(zzastnew(), args)" * #[] --> "zzastnew()" * #( root, child1, ..., childn ) * --> "zztmake(root, child1, ...., childn, NULL)" * #() --> "NULL" * * For C++, ... * * #0 --> "(*_root)" * #i --> "_astbi" where b is the block level * #alnum --> "alnum_ast" (used to ref #label) * #[args] --> "new AST(args)" * #[] --> "new AST" * #( root, child1, ..., childn ) * --> "AST::tmake(root, child1, ...., childn, NULL)" * #() --> "NULL" * * To escape, * * \] --> ] * \) --> ) * \$ --> $ * \# --> # * * A stack is used to nest action terminators because they can be nested * like crazy: << #[$[..],..] >> */ #lexclass ACTIONS #token Action "\>\>" << /* these do not nest */ zzmode(START); NLATEXT[0] = ' '; NLATEXT[1] = ' '; zzbegexpr[0] = ' '; zzbegexpr[1] = ' '; if ( zzbufovf ) { err( eMsgd("action buffer overflow; size %d",ZZLEXBUFSIZE)); } /* MR1 10-Apr-97 MR1 Previously unable to put right shift operator */ /* MR1 in DLG action */ /* MR1 Doesn't matter what kind of action it is - reset*/ tokenActionActive=0; /* MR1 */ >> #token Pred "\>\>?" << /* these do not nest */ zzmode(START); NLATEXT[0] = ' '; NLATEXT[1] = ' '; zzbegexpr[0] = '\0'; if ( zzbufovf ) { err( eMsgd("predicate buffer overflow; size %d",ZZLEXBUFSIZE)); }; #ifdef __cplusplus__ /* MR10 */ list_apply(CurActionLabels, (void (*)(void *))mark_label_used_in_sem_pred); #else #ifdef __STDC__ /* MR10 */ list_apply(CurActionLabels, (void (*)(void *))mark_label_used_in_sem_pred); #else #ifdef __USE_PROTOS /* MRxx */ list_apply(CurActionLabels, (void (*)(void *))mark_label_used_in_sem_pred); #else /* MR10 */ list_apply(CurActionLabels,mark_label_used_in_sem_pred); #endif #endif #endif >> #token PassAction "\]" << if ( topint() == ']' ) { popint(); if ( istackempty() ) /* terminate action */ { zzmode(START); NLATEXT[0] = ' '; zzbegexpr[0] = ' '; if ( zzbufovf ) { err( eMsgd("parameter buffer overflow; size %d",ZZLEXBUFSIZE)); } } else { /* terminate $[..] and #[..] */ if ( GenCC ) zzreplstr("))"); else zzreplstr(")"); zzmore(); } } else if ( topint() == '|' ) { /* end of simple [...] */ popint(); zzmore(); } else zzmore(); >> #token "consumeUntil\( [\ \t]* \{~[\}]+\} [\ \t]* \)" << zzmore(); zzreplstr(inline_set(zzbegexpr+ strlen("consumeUntil("))); >> #token "consumeUntil\( ~[\)]+ \)" << zzmore(); >> #token "\n|\r|\r\n" << zzline++; zzmore(); DAWDLE; >> #token "\>" << zzmore(); >> #token "$" << zzmore(); >> #token "$$" << if ( !GenCC ) {zzreplstr("zzaRet"); zzmore();} else err("$$ use invalid in C++ mode"); >> #token "$\[\]" << if ( !GenCC ) {zzreplstr("zzempty_attr"); zzmore();} else err("$[] use invalid in C++ mode"); >> #token "$\[" << pushint(']'); if ( !GenCC ) zzreplstr("zzconstr_attr("); else err("$[..] use invalid in C++ mode"); zzmore(); >> #token "$[0-9]+" <<{ static char buf[100]; numericActionLabel=1; /* MR10 */ if ( strlen(zzbegexpr)>(size_t)85 ) fatal("$i attrib ref too big"); set_orel(atoi(zzbegexpr+1), &attribsRefdFromAction); if ( !GenCC ) sprintf(buf,"zzaArg(zztasp%d,%s)", BlkLevel-1,zzbegexpr+1); else sprintf(buf,"_t%d%s", BlkLevel-1,zzbegexpr+1); zzreplstr(buf); zzmore(); UsedOldStyleAttrib = 1; if ( UsedNewStyleLabel ) err("cannot mix old-style $i with new-style labels"); } >> #token "$[0-9]+." <<{ static char buf[100]; numericActionLabel=1; /* MR10 */ if ( strlen(zzbegexpr)>(size_t)85 ) fatal("$i.field attrib ref too big"); zzbegexpr[strlen(zzbegexpr)-1] = ' '; set_orel(atoi(zzbegexpr+1), &attribsRefdFromAction); if ( !GenCC ) sprintf(buf,"zzaArg(zztasp%d,%s).", BlkLevel-1,zzbegexpr+1); else sprintf(buf,"_t%d%s.", BlkLevel-1,zzbegexpr+1); zzreplstr(buf); zzmore(); UsedOldStyleAttrib = 1; if ( UsedNewStyleLabel ) err("cannot mix old-style $i with new-style labels"); } >> #token "$[0-9]+.[0-9]+" <<{ static char buf[100]; static char i[20], j[20]; char *p,*q; numericActionLabel=1; /* MR10 */ if (strlen(zzbegexpr)>(size_t)85) fatal("$i.j attrib ref too big"); for (p=zzbegexpr+1,q= &i[0]; *p!='.'; p++) { if ( q == &i[20] ) fatalFL("i of $i.j attrib ref too big", FileStr[CurFile], zzline ); *q++ = *p; } *q = '\0'; for (p++, q= &j[0]; *p!='\0'; p++) { if ( q == &j[20] ) fatalFL("j of $i.j attrib ref too big", FileStr[CurFile], zzline ); *q++ = *p; } *q = '\0'; if ( !GenCC ) sprintf(buf,"zzaArg(zztasp%s,%s)",i,j); else sprintf(buf,"_t%s%s",i,j); zzreplstr(buf); zzmore(); UsedOldStyleAttrib = 1; if ( UsedNewStyleLabel ) err("cannot mix old-style $i with new-style labels"); } >> #token "$[_a-zA-Z][_a-zA-Z0-9]*" <<{ static char buf[300]; LabelEntry *el; zzbegexpr[0] = ' '; if ( CurRule != NULL && strcmp(CurRule, &zzbegexpr[1])==0 ) { if ( !GenCC ) zzreplstr("zzaRet"); } else if ( CurRetDef != NULL && strmember(CurRetDef, &zzbegexpr[1])) { if ( hasMultipleOperands( CurRetDef ) ) { require (strlen(zzbegexpr)<=(size_t)285, "$retval attrib ref too big"); sprintf(buf,"_retv.%s",&zzbegexpr[1]); zzreplstr(buf); } else zzreplstr("_retv"); } else if ( CurParmDef != NULL && strmember(CurParmDef, &zzbegexpr[1])) { ; } else if ( Elabel==NULL ) { { err("$-variables in actions outside of rules are not allowed"); } } else if ( (el=(LabelEntry *)hash_get(Elabel, &zzbegexpr[1]))!=NULL ) { /* MR10 */ /* MR10 */ /* element labels might exist without an elem when */ /* MR10 */ /* it is a forward reference (to a rule) */ /* MR10 */ /* MR10 */ if ( GenCC && (el->elem == NULL || el->elem->ntype==nRuleRef) ) /* MR10 */ { err(eMsg1("There are no token ptrs for rule references: '$%s'",&zzbegexpr[1])); } /* MR10 */ /* MR10 */ if ( !GenCC && (el->elem == NULL || el->elem->ntype==nRuleRef) && GenAST) { /* MR10 */ err("You can no longer use attributes returned by rules when also using ASTs"); /* MR10 */ err(" Use upward inheritance (\"rule >[Attrib a] : ... <<$a=...\>\>\")"); /* MR10 */ }; /* MR10 */ /* MR10 */ /* keep track of <<... $label ...>> for semantic predicates in guess mode */ /* MR10 */ /* element labels contain pointer to the owners node */ /* MR10 */ /* MR10 */ if (el->elem != NULL && el->elem->ntype == nToken) { /* MR10 */ list_add(&CurActionLabels,el); /* MR10 */ }; } else warn(eMsg1("$%s not parameter, return value, (defined) element label",&zzbegexpr[1])); } zzmore(); >> #token "#0" << zzreplstr("(*_root)"); zzmore(); chkGTFlag(); >> #token "#\[\]" << if ( GenCC ) { if (NewAST) zzreplstr("(newAST)"); else zzreplstr("(new AST)");} else {zzreplstr("zzastnew()");} zzmore(); chkGTFlag(); >> #token "#\(\)" << zzreplstr("NULL"); zzmore(); chkGTFlag(); >> #token "#[0-9]+" <<{ static char buf[100]; if ( strlen(zzbegexpr)>(size_t)85 ) fatal("#i AST ref too big"); if ( GenCC ) sprintf(buf,"_ast%d%s",BlkLevel-1,zzbegexpr+1); else sprintf(buf,"zzastArg(%s)",zzbegexpr+1); zzreplstr(buf); zzmore(); set_orel(atoi(zzbegexpr+1), &AST_nodes_refd_in_actions); chkGTFlag(); } >> /* MR14 Arpad Beszedes 26-May-98 Add support for #line directives when antlr source is pre-processed #lexclass ACTIONS */ #token "#line[\ \t]* [0-9]+ {[\ \t]* \"~[\"]+\" ([\ \t]* [0-9]*)* } (\n|\r|\r\n)" << zzline = atoi(zzbegexpr+5) - 1; zzline++; zzmore(); getFileNameFromTheLineInfo(FileStr[CurFile], zzbegexpr); >> #token "#line ~[\n\r]* (\n|\r|\r\n)" << zzline++; zzmore(); >> /* MR14 end of a block to support #line in antlr source code */ #token "#[_a-zA-Z][_a-zA-Z0-9]*" << if ( !(strcmp(zzbegexpr, "#ifdef")==0 || strcmp(zzbegexpr, "#if")==0 || strcmp(zzbegexpr, "#else")==0 || strcmp(zzbegexpr, "#endif")==0 || strcmp(zzbegexpr, "#ifndef")==0 || strcmp(zzbegexpr, "#define")==0 || strcmp(zzbegexpr, "#pragma")==0 || strcmp(zzbegexpr, "#undef")==0 || strcmp(zzbegexpr, "#import")==0 || strcmp(zzbegexpr, "#line")==0 || strcmp(zzbegexpr, "#include")==0 || strcmp(zzbegexpr, "#error")==0) ) { static char buf[100]; sprintf(buf, "%s_ast", zzbegexpr+1); /* MR27 */ list_add(&CurAstLabelsInActions, mystrdup(zzbegexpr+1)); zzreplstr(buf); chkGTFlag(); } zzmore(); >> #token "#\[" << pushint(']'); if ( GenCC ) { if (NewAST) zzreplstr("(newAST("); else zzreplstr("(new AST("); } else zzreplstr("zzmk_ast(zzastnew(),"); zzmore(); chkGTFlag(); >> #token "#\(" << pushint('}'); if ( GenCC ) { if (tmakeInParser) { zzreplstr("tmake("); } else { zzreplstr("ASTBase::tmake("); } } else { zzreplstr("zztmake("); } zzmore(); chkGTFlag(); >> #token "#" << zzmore(); >> #token "\)" << if ( istackempty() ) zzmore(); else if ( topint()==')' ) { popint(); } else if ( topint()=='}' ) { popint(); /* terminate #(..) */ zzreplstr(", NULL)"); } zzmore(); >> #token "\[" << pushint('|'); /* look for '|' to terminate simple [...] */ zzmore(); >> #token "\(" << pushint(')'); zzmore(); >> #token "\\\]" << zzreplstr("]"); zzmore(); >> #token "\\\)" << zzreplstr(")"); zzmore(); >> /* MR1 10-Apr-97 MR1 Previously unable to put right shift operator */ /* MR1 in DLG action */ #token "\\>" << if (! tokenActionActive) zzreplstr(">"); /* MR1 */ zzmore(); /* MR1 */ >> /* MR1 */ #token "'" << zzmode(ACTION_CHARS); zzmore();>> #token "\"" << zzmode(ACTION_STRINGS); zzmore();>> #token "\\$" << zzreplstr("$"); zzmore(); >> #token "\\#" << zzreplstr("#"); zzmore(); >> #token "\\(\n|\r|\r\n)" << zzline++; zzmore(); >> #token "\\~[\]\)>$#]" << zzmore(); >> /* escaped char, always ignore */ #token "/" << zzmore(); >> #token "/\*" << zzmode(ACTION_COMMENTS); zzmore(); >> #token "\*/" << warn("Missing /*; found dangling */ in action"); zzmore(); >> #token "//" << zzmode(ACTION_CPP_COMMENTS); zzmore(); >> #token "~[\n\r\)\(\\$#\>\]\[\"'/]+" << zzmore(); >> #lexclass START #token "[\t\ ]+" << zzskip(); >> /* Ignore White */ #token "\n|\r|\r\n" << zzline++; zzskip(); >> /* Track Line # */ #token "\[" << zzmode(ACTIONS); zzmore(); istackreset(); pushint(']'); >> #token "\<\<" << action_file=CurFile; action_line=zzline; zzmode(ACTIONS); zzmore(); list_free(&CurActionLabels,0); /* MR10 */ numericActionLabel=0; /* MR10 */ istackreset(); pushint('>'); >> #token "\"" << zzmode(STRINGS); zzmore(); >> #token "/\*" << zzmode(COMMENTS); zzskip(); >> #token "\*/" << warn("Missing /*; found dangling */"); zzskip(); >> #token "//" << zzmode(CPP_COMMENTS); zzskip(); >> /* MR14 Arpad Beszedes 26-May-98 Add support for #line directives when antlr source is pre-processed #lexclass START */ #token "#line[\ \t]* [0-9]+ {[\ \t]* \"~[\"]+\" ([\ \t]* [0-9]*)* } (\n|\r|\r\n)" << zzline = atoi(zzbegexpr+5) - 1; zzline++; zzmore(); getFileNameFromTheLineInfo(FileStr[CurFile], zzbegexpr); >> #token "#line ~[\n\r]* (\n|\r|\r\n)" << zzline++; zzmore(); >> /* MR14 end of a block to support #line in antlr source code */ /* */ /* 8-Apr-97 Regularize escape sequence for ">>" */ /* appearing in string literals */ /* */ #token "\>\>" << warn("Missing <<; found dangling \>\>"); zzskip(); >> /* MR1 */ #token WildCard "." #token "\@" <> /* MR6 */ #token Eof "@" << /* L o o k F o r A n o t h e r F i l e */ { FILE *new_input; new_input = NextFile(); if ( new_input == NULL ) { NLA=Eof; return; } fclose( input ); input = new_input; zzrdstream( input ); zzskip(); /* Skip the Eof (@) char i.e continue */ } >> #token LABEL #errclass "grammar-element" { element } #errclass "meta-symbol" { "\}" "!" ";" "\|" "\~" "^" "\)" } #token Pragma "{\\}#pragma" /* MR21 */ #token FirstSetSymbol "{\\}#FirstSetSymbol" /* MR21 */ /* * Get a grammar -- Build a list of rules like: * * o-->Rule1--o * | * o-->Rule2--o * | * ... * | * o-->RuleN--o */ /* rule grammar */ grammar : <> ( "{\\}#header" Action /* MR13 */ << if ( HdrAction==NULL ) { HdrAction = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require(HdrAction!=NULL, "rule grammar: cannot allocate header action"); strcpy(HdrAction, LATEXT(1)); } else warn("additional #header statement ignored"); >> | "{\\}#first" Action << if ( FirstAction==NULL ) { FirstAction = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require(FirstAction!=NULL, "rule grammar: cannot allocate #first action"); strcpy(FirstAction, LATEXT(1)); } else { warn("additional #first statement ignored"); }; >> | "{\\}#parser" QuotedTerm << if ( GenCC ) { warn("#parser meta-op incompatible with -CC; ignored"); } else { if ( strcmp(ParserName,"zzparser")==0 ) { ParserName=StripQuotes(mystrdup(LATEXT(1))); if ( RulePrefix[0]!='\0' ) { warn("#parser meta-op incompatible with '-gp prefix'; '-gp' ignored"); RulePrefix[0]='\0'; } } else warn("additional #parser statement ignored"); } >> | "{\\}#tokdefs" QuotedTerm <<{ char *fname; zzantlr_state st; FILE *f; struct zzdlg_state dst; UserTokenDefsFile = mystrdup(LATEXT(1)); zzsave_antlr_state(&st); zzsave_dlg_state(&dst); fname = mystrdup(LATEXT(1)); f = fopen(StripQuotes(fname), "r"); if ( f==NULL ) {warn(eMsg1("cannot open token defs file '%s'", fname+1));} else { ANTLRm(enum_file(fname+1), f, PARSE_ENUM_FILE); UserDefdTokens = 1; } zzrestore_antlr_state(&st); zzrestore_dlg_state(&dst); }>> )* ( Action <<{ UserAction *ua = newUserAction(LATEXT(1)); ua->file = action_file; ua->line = action_line; if ( class_nest_level>0 ) list_add(&class_before_actions, ua); else list_add(&BeforeActions, ua); }>> | laction | lmember /* MR1 */ | lprefix /* MR1 */ | aLexclass | token | error | tclass | aPred /* MR11 */ | default_exception_handler | class_def | "\}" << if ( class_nest_level==0 ) warn("missing class definition for trailing '}'"); class_nest_level--; >> )* rule <> ( rule <> | aLexclass | token | error | tclass | aPred /* MR11 */ | class_def | "\}" << if ( class_nest_level==0 ) warn("missing class definition for trailing '}'"); class_nest_level--; >> )* ( Action <<{ UserAction *ua = newUserAction(LATEXT(1)); ua->file = action_file; ua->line = action_line; if ( class_nest_level>0 ) list_add(&class_after_actions, ua); else list_add(&AfterActions, ua); }>> | laction | lmember /* MR1 */ | lprefix /* MR1 */ | error | tclass | class_def | aPred /* MR11 */ | "\}" << if ( class_nest_level==0 ) warn("missing class definition for trailing '}'"); class_nest_level--; >> )* Eof ; <> /* rule class_def */ class_def : <> "class" ( NonTerminal <> | TokenTerm <> ) << if ( CurrentClassName[0]!='\0' && strcmp(CurrentClassName,name)!=0 && GenCC ) { err("only one grammar class allowed in this release"); go = 0; } else strcpy(CurrentClassName, name); >> <> /* MR10 */ (~ "\{" /* MR10 */ <> /* MR10 */ )* "\{" << no_classes_found = 0; if ( class_nest_level>=1 ) {warn("cannot have nested classes");} else class_nest_level++; >> ; <> /* * Build -o-->o-R-o-->o- where -o-R-o- is the block from rule 'block'. * Construct the RuleBlk front and EndRule node on the end of the * block. This is used to add FOLLOW pointers to the rule end. Add the * new rule name to the Rname hash table and sets its rulenum. * Store the parameter definitions if any are found. * * Note that locks are required on the RuleBlk and EndRule nodes to thwart * infinite recursion. * * Return the left graph pointer == NULL to indicate error/dupl rule def. */ /* rule rule */ rule : << ExceptionGroup *eg; RuleEntry *q; Junction *p; Graph r; int f, l; ECnode *e; set toksrefd, rulesrefd; char *pdecl=NULL, *ret=NULL, *a; CurRetDef = CurParmDef = NULL; CurExGroups = NULL; CurElementLabels = NULL; CurAstLabelsInActions = NULL; /* MR27 */ /* We want a new element label hash table for each rule */ if ( Elabel!=NULL ) killHashTable(Elabel); Elabel = newHashTable(); attribsRefdFromAction = empty; >> NonTerminal <str; } CurRuleNode = q; f = CurFile; l = zzline; NumRules++; >> { "!" <noAST = TRUE;>> } { <<;>> {"\<"} PassAction << pdecl = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require(pdecl!=NULL, "rule rule: cannot allocate param decl"); strcpy(pdecl, LATEXT(1)); CurParmDef = pdecl; >> } { "\>" PassAction << ret = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require(ret!=NULL, "rule rule: cannot allocate ret type"); strcpy(ret, LATEXT(1)); CurRetDef = ret; >> } { QuotedTerm <egroup=mystrdup(LATEXT(1));>> } << if ( GenEClasseForRules && q!=NULL ) { e = newECnode; require(e!=NULL, "cannot allocate error class node"); if ( q->egroup == NULL ) {a = q->str; a[0] = (char)toupper(a[0]);} else a = q->egroup; if ( Tnum( a ) == 0 ) { e->tok = addTname( a ); list_add(&eclasses, (char *)e); if ( q->egroup == NULL ) a[0] = (char)tolower(a[0]); /* refers to itself */ list_add(&(e->elist), mystrdup(q->str)); } else { warn(eMsg1("default errclass for '%s' would conflict with token/errclass/tokclass",a)); if ( q->egroup == NULL ) a[0] = (char)tolower(a[0]); free((char *)e); } } >> <= MAX_BLK_LEVEL) fatal("Blocks nested too deeply"); /* MR23 */ CurBlockID_array[BlkLevel] = CurBlockID; /* MR23 */ CurAltNum_array[BlkLevel] = CurAltNum; >> ":" <> block[&toksrefd, &rulesrefd] <blockid = CurBlockID; CurRuleBlk->jtype = RuleBlk; if ( q!=NULL ) CurRuleBlk->rname = q->str; CurRuleBlk->file = f; CurRuleBlk->line = l; CurRuleBlk->pdecl = pdecl; CurRuleBlk->ret = ret; CurRuleBlk->lock = makelocks(); CurRuleBlk->pred_lock = makelocks(); CurRuleBlk->tokrefs = toksrefd; CurRuleBlk->rulerefs = rulesrefd; p = newJunction(); /* add EndRule Node */ ((Junction *)r.right)->p1 = (Node *)p; r.right = (Node *) p; p->jtype = EndRule; p->lock = makelocks(); p->pred_lock = makelocks(); CurRuleBlk->end = p; if ( q!=NULL ) q->rulenum = NumRules; $7 = r; >> << /* MR23 */ CurBlockID_array[BlkLevel] = (-1); /* MR23 */ CurAltNum_array[BlkLevel] = (-1); --BlkLevel; >> <> /* MR7 */ ";" <> { Action << a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require(a!=NULL, "rule rule: cannot allocate error action"); strcpy(a, LATEXT(1)); CurRuleBlk->erraction = a; >> } ( exception_group > [eg] <label == NULL || *eg->label=='\0' ) q->has_rule_exception = 1; } >> )* <> <exceptions = CurExGroups;>> <el_labels = CurElementLabels;>> <ast_labels_in_actions = CurAstLabelsInActions;>> /* MR27 */ <> /* MR27 Moved */ ; <> /* * pragma : "{\\}#pragma" "dup\-labeled\-tokens" * <> * ; */ /* rule laction */ laction : <> "{\\}#lexaction" Action << a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require(a!=NULL, "rule laction: cannot allocate action"); strcpy(a, LATEXT(1)); list_add(&LexActions, a); >> ; <> /* MR1 */ /* MR1 11-Apr-97 Provide mechanism for inserting code into DLG class */ /* MR1 via #lexmember <<....>> & #lexprefix <<...>> */ /* MR1 */ /* rule lmember */ lmember: <> /* MR1 */ /* MR1 */ "{\\}#lexmember" /* MR1 */ Action /* MR1 */ << /* MR1 */ if (! GenCC) { /* MR1 */ err("Use #lexmember only in C++ mode (to insert code in DLG class header"); /* MR1 */ } else { /* MR1 */ a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); /* MR1 */ require(a!=NULL, "rule lmember: cannot allocate action"); /* MR1 */ strcpy(a, LATEXT(1)); /* MR1 */ list_add(&LexMemberActions, a); /* MR1 */ }; /* MR1 */ >> /* MR1 */ ; /* MR1 */ <> /* rule lprefix */ lprefix: <> /* MR1 */ /* MR1 */ "{\\}#lexprefix" /* MR1 */ Action /* MR1 */ << /* MR1 */ if (! GenCC) { /* MR1 */ err("Use #lexprefix only in C++ mode (to insert code in DLG class header"); /* MR1 */ } else { /* MR1 */ a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); /* MR1 */ require(a!=NULL, "rule lprefix: cannot allocate action"); /* MR1 */ strcpy(a, LATEXT(1)); /* MR1 */ list_add(&LexPrefixActions, a); /* MR1 */ }; /* MR1 */ >> /* MR1 */ ; /* MR1 */ <> /* * #pred upper <>? predicate literal * #pred lower <>? predicate literal * #pred up_or_low upper || lower predicate expression * concealed interdependence * #pred up_or_low_2 <>? A || B predicate literal equals predicate expr * analyze using lower||upper * generate using isLetter() */ /* rule aPref */ aPred: <> "{\\}#pred" << MR_usingPredNames=1; /* will need to use -mrhoist version of genPredTree */ >> /* used to allow NonTerminal but it caused problems when a rule name immediately followed a #pred statement */ TokenTerm <> << /* don't free - referenced in predicates */ CurPredName=(char *)calloc(1,strlen(name) + 10); strcat(CurPredName,"#pred "); strcat(CurPredName,name); predEntry=(PredEntry *) hash_get(Pname,name); if (predEntry != NULL) { warnFL(eMsg1("#pred %s previously defined - ignored",name), FileStr[action_file],action_line); name=NULL; }; >> ( Pred <> { predOrExpr>[predExpr] <> } <file=save_file; predEntry->line=save_line; predExpr=MR_predFlatten(predExpr); predEntry->predLiteral=predLiteral; if (! predExprPresent || predExpr == NULL) { predExpr=new_pred(); predExpr->expr=predLiteral; predExpr->source=newActionNode(); predExpr->source->action=predExpr->expr; predExpr->source->rname=CurPredName; predExpr->source->line=action_line; predExpr->source->file=action_file; predExpr->source->is_predicate=1; predExpr->k=predicateLookaheadDepth(predExpr->source); }; predEntry->pred=predExpr; hash_add(Pname,name,(Entry *)predEntry); predExpr=NULL; }; predicate_free(predExpr); >> | <> predOrExpr>[predExpr] <file=CurFile; predEntry->line=zzline; predExpr=MR_predFlatten(predExpr); predEntry->pred=predExpr; hash_add(Pname,name,(Entry *)predEntry); predExpr=NULL; }; predicate_free(predExpr); >> ) {";"} ; /* fail */ <> /* rule predOrExpr */ predOrExpr>[Predicate *result] : <> predAndExpr>[predExpr] << ORnode=new_pred(); ORnode->expr=PRED_OR_LIST; if (predExpr != NULL) { ORnode->down=predExpr; tail=&predExpr->right; }; >> ( "\|\|" predAndExpr>[predExpr] << if (predExpr != NULL) { *tail=predExpr; tail=&predExpr->right; }; >> )* << $result=ORnode; ORnode=NULL; >> ; /* fail */ <> /* rule predAndExpr */ predAndExpr>[Predicate *result] : <> predPrimary>[predExpr] << ANDnode=new_pred(); ANDnode->expr=PRED_AND_LIST; if (predExpr != NULL) { ANDnode->down=predExpr; tail=&predExpr->right; }; >> ( "&&" predPrimary>[predExpr] << if (predExpr != NULL) { *tail=predExpr; tail=&predExpr->right; }; >> )* << $result=ANDnode; ANDnode=NULL; >> ; /* fail */ <> /* rule predPrimary */ predPrimary>[Predicate *result] : << char *name=NULL; PredEntry *predEntry=NULL; Predicate *predExpr=NULL; >> TokenTerm <> << predEntry=(PredEntry *) hash_get(Pname,name); if (predEntry == NULL) { warnFL(eMsg1("no previously defined #pred with name \"%s\"",name), FileStr[CurFile],zzline); name=NULL; $result=NULL; } else { predExpr=predicate_dup(predEntry->pred); predExpr->predEntry=predEntry; $result=predExpr; }; >> | "\(" predOrExpr>[predExpr] "\)" << $result=predExpr; >> | "!" predPrimary>[predExpr] << predExpr->inverted=!predExpr->inverted; $result=predExpr; >> ; /* fail */ << predicate_free(predExpr); >> /* rule aLexclass */ aLexclass: "{\\}#lexclass" TokenTerm <> ; <> /* rule error */ error : <> "{\\}#errclass" (<<;>> TokenTerm <> | QuotedTerm <> ) <lexclass = CurrentLexClass; if ( Tnum( (t=StripQuotes(t)) ) == 0 ) { if ( hash_get(Texpr, t) != NULL ) warn(eMsg1("errclass name conflicts with regular expression '%s'",t)); e->tok = addTname( t ); set_orel(e->tok, &imag_tokens); require((p=(TermEntry *)hash_get(Tname, t)) != NULL, "hash table mechanism is broken"); p->classname = 1; /* entry is errclass name, not token */ list_add(&eclasses, (char *)e); } else { warn(eMsg1("redefinition of errclass or conflict w/token or tokclass '%s'; ignored",t)); free( (char *)e ); go=0; } >> "\{" ( NonTerminal <> | TokenTerm <> | QuotedTerm <> ) <elist), t);>> ( ( NonTerminal <> | TokenTerm <> | QuotedTerm <> ) <elist), t);>> )* "\}" ; <> /* rule tclass */ tclass : <> <> <> "{\\}#tokclass" TokenTerm <> <lexclass = CurrentLexClass; if ( Tnum( t ) == 0 ) { e->tok = addTname( t ); set_orel(e->tok, &imag_tokens); set_orel(e->tok, &tokclasses); require((p=(TermEntry *)hash_get(Tname, t)) != NULL, "hash table mechanism is broken"); p->classname = 1; /* entry is class name, not token */ p->tclass = e; /* save ptr to this tclass def */ list_add(&tclasses, (char *)e); } else { warn(eMsg1("redefinition of tokclass or conflict w/token '%s'; ignored",t)); free( (char *)e ); go=0; } >> /* MR23 */ { /* MR23 */ "\(" /* MR23 */ QuotedTerm /* MR23 */ <> /* MR23 */ "\)" /* MR23 */ } /* MR23 */ /* MR23 */ /* MR23 */ << /* MR23 */ if (p!= NULL && akaString != NULL) { /* MR23 */ if (p->akaString != NULL) { /* MR23 */ if (strcmp(p->akaString,akaString) != 0) { /* MR23 */ warnFL(eMsg2("this #tokclass statment conflicts with a previous #tokclass %s(\"%s\") statement", /* MR23 */ t,p->akaString), /* MR23 */ FileStr[save_file],save_line); /* MR23 */ }; /* MR23 */ } else { /* MR23 */ p->akaString=akaString; /* MR23 */ }; /* MR23 */ }; /* MR23 */ >> "\{" ( ( TokenTerm <> { ".." TokenTerm <> } | QuotedTerm <> ) <tlist), t); } else { list_add(&(e->tlist),".."); list_add(&(e->tlist),t); list_add(&(e->tlist),totext); } totext=NULL; } >> )+ // MR15 Manfred Kogler - forbid empty #tokclass sets (was "+") "\}" ; <> /* rule token */ token : <> <> /* MR11 */ "{\\}#token" /* MR1 10-Apr-97 MR1 Allow shift right operator in DLG actions */ /* MR1 Danger when parser feedback to lexer */ /* MR1 */ <> /* MR1 */ { TokenTerm <> /* MR11 */ { /* MR11 */ "\(" /* MR11 */ QuotedTerm /* MR11 */ <> /* MR11 */ "\)" /* MR11 */ } { "=" "[0-9]+" /* define the token type number */ <> } } { QuotedTerm <> } { Action << a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require(a!=NULL, "rule token: cannot allocate action"); strcpy(a, LATEXT(1)); >> } { ";" } /* MR11 */ <> <akaString != NULL) { if (strcmp(te->akaString,akaString) != 0) { warnFL(eMsg2("this #token statment conflicts with a previous #token %s(\"%s\") statement", t,te->akaString), FileStr[save_file],save_line); }; } else { te->akaString=akaString; }; }; }; >> ; <> /* rule block */ block[set *toksrefd, set *rulesrefd] : << Graph g, b; set saveblah; int saveinalt = inAlt; ExceptionGroup *eg; *$toksrefd = empty; *$rulesrefd = empty; set_clr(AST_nodes_refd_in_actions); CurBlockID++; /* MR23 */ CurBlockID_array[BlkLevel] = CurBlockID; CurAltNum = 1; /* MR23 */ CurAltNum_array[BlkLevel] = CurAltNum; saveblah = attribsRefdFromAction; attribsRefdFromAction = empty; >> alt[toksrefd,rulesrefd] <> << if ( ((Junction *)g.left)->p1->ntype == nAction ) { ActionNode *actionNode=(ActionNode *) ( ( (Junction *)g.left) ->p1); if (!actionNode->is_predicate ) { actionNode->init_action = TRUE; /* MR12c */ if (actionNode->noHoist) { /* MR12c */ errFL("<> appears as init-action - use <<>> <>", /* MR12c */ FileStr[actionNode->file],actionNode->line); /* MR12c */ }; } } ((Junction *)g.left)->blockid = CurBlockID; >> ( exception_group > [eg] << if ( eg!=NULL ) { /* MR7 ***** eg->altID = makeAltID(CurBlockID,CurAltNum); *****/ /* MR7 ***** CurAltStart->exception_label = eg->altID; *****/ list_add(&CurExGroups, (void *)eg); } >> )* <> ( "\|" <> alt[toksrefd,rulesrefd] <> << ((Junction *)g.left)->blockid = CurBlockID; >> ( exception_group > [eg] << if ( eg!=NULL ) { /* MR7 ***** eg->altID = makeAltID(CurBlockID,CurAltNum); *****/ /* MR7 ***** CurAltStart->exception_label = eg->altID; *****/ list_add(&CurExGroups, (void *)eg); } >> )* <> )* <<$0 = b;>> <> ; <> /* rule alt */ alt[set *toksrefd, set *rulesrefd] : <> { "\@" /* handle MismatchedToken signals with default handler */ <> } ( <<;>> /* MR9 Removed unreferenced variable "tok" */ { <> "\~" <> } element[old_not, first_on_line, use_def_MT_handler] > [node] <ntype!=nAction ) first_on_line = 0;>> << if ( $2.left!=NULL ) { g = Cat(g, $2); n++; if ( node!=NULL ) { if ( node->ntype!=nAction ) e_num++; /* record record number of all rule and token refs */ if ( node->ntype==nToken ) { TokNode *tk = (TokNode *)((Junction *)$2.left)->p1; tk->elnum = e_num; set_orel(e_num, &elems); } else if ( node->ntype==nRuleRef ) { RuleRefNode *rn = (RuleRefNode *)((Junction *)$2.left)->p1; rn->elnum = e_num; set_orel(e_num, $rulesrefd); } } } >> )* <0 ) err("one or more $i in action(s) refer to non-token elements"); set_free(dif); } set_free(elems); set_free(attribsRefdFromAction); inAlt = 0; >> ; <> /* rule element_label */ element_label > [LabelEntry *label] : <> LABEL <> << UsedNewStyleLabel = 1; if ( UsedOldStyleAttrib ) err("cannot mix with new-style labels with old-style $i"); t = (TermEntry *) hash_get(Tname, lab); if ( t==NULL ) t = (TermEntry *) hash_get(Texpr, lab); if ( t==NULL ) r = (RuleEntry *) hash_get(Rname, lab); if ( t!=NULL ) { err(eMsg1("label definition clashes with token/tokclass definition: '%s'", lab)); $label = NULL; } else if ( r!=NULL ) { err(eMsg1("label definition clashes with rule definition: '%s'", lab)); $label = NULL; } else { /* we don't clash with anybody else */ l = (LabelEntry *) hash_get(Elabel, lab); if ( l==NULL ) { /* ok to add new element label */ l = (LabelEntry *)hash_add(Elabel, lab, (Entry *)newLabelEntry(lab)); /* add to list of element labels for this rule */ list_add(&CurElementLabels, (void *)lab); /* MR7 */ leAdd(l); /* list of labels waiting for exception group definitions */ $label = l; } else { err(eMsg1("label definitions must be unique per rule: '%s'", lab)); $label = NULL; } } >> ":" ; /* rule element */ element[int old_not, int first_on_line, int use_def_MT_handler] > [Node *node] : << Attrib blk; Predicate *pred = NULL; int local_use_def_MT_handler=0; ActionNode *act; RuleRefNode *rr; set toksrefd, rulesrefd; TermEntry *term; TokNode *p=NULL; RuleRefNode *q; int approx=0; LabelEntry *label=NULL; int predMsgDone=0; int semDepth=0; int ampersandStyle; int height; /* MR11 */ int equal_height; /* MR11 */ char* pFirstSetSymbol = NULL; /* MR21 */ $node = NULL; >> {element_label>[label]} ( TokenTerm << term = (TermEntry *) hash_get(Tname, LATEXT(1)); if ( term==NULL && UserDefdTokens ) { err("implicit token definition not allowed with #tokdefs"); $$.left = $$.right = NULL; } else { $$ = buildToken(LATEXT(1)); p=((TokNode *)((Junction *)$$.left)->p1); term = (TermEntry *) hash_get(Tname, LATEXT(1)); require( term!= NULL, "hash table mechanism is broken"); p->tclass = term->tclass; p->complement = $old_not; if ( label!=NULL ) { p->el_label = label->str; label->elem = (Node *)p; } } >> { ".." ( QuotedTerm <> | TokenTerm <> ) } << if ( p!=NULL && (p->upper_range!=0 || p->tclass || $old_not) ) list_add(&MetaTokenNodes, (void *)p); >> ( "^" <astnode=ASTroot;>> | <astnode=ASTchild;>> | "!" <astnode=ASTexclude;>> ) { "\@" <> } << if ( p!=NULL && $first_on_line ) { CurAltStart = (Junction *)$$.left; altAdd(CurAltStart); /* MR7 */ p->altstart = CurAltStart; } if ( p!=NULL ) p->use_def_MT_handler = $use_def_MT_handler || local_use_def_MT_handler; $node = (Node *)p; >> | QuotedTerm << term = (TermEntry *) hash_get(Texpr, LATEXT(1)); if ( term==NULL && UserDefdTokens ) { err("implicit token definition not allowed with #tokdefs"); $$.left = $$.right = NULL; } else { $$ = buildToken(LATEXT(1)); p=((TokNode *)((Junction *)$$.left)->p1); p->complement = $old_not; if ( label!=NULL ) { p->el_label = label->str; label->elem = (Node *)p; } } >> { ".." ( QuotedTerm <> | TokenTerm <> ) } ( "^" <astnode=ASTroot;>> | <astnode=ASTchild;>> | "!" <astnode=ASTexclude;>> ) { "\@" <> } << if ( p!=NULL && (p->upper_range!=0 || p->tclass || $old_not) ) list_add(&MetaTokenNodes, (void *)p); >> << if ( $first_on_line ) { CurAltStart = (Junction *)$$.left; altAdd(CurAltStart); /* MR7 */ p->altstart = CurAltStart; } if ( p!=NULL ) p->use_def_MT_handler = $use_def_MT_handler || local_use_def_MT_handler; $node = (Node *)p; >> | <> "." <<$$ = buildWildCard(LATEXT(1)); p=((TokNode *)((Junction *)$$.left)->p1);>> ( "^" <astnode=ASTroot;>> | <astnode=ASTchild;>> | "!" <astnode=ASTexclude;>> ) <> << if ( $first_on_line ) { CurAltStart = (Junction *)$$.left; altAdd(CurAltStart); /* MR7 */ p->altstart = CurAltStart; if ( label!=NULL ) { p->el_label = label->str; label->elem = (Node *)p; } } $node = (Node *)p; >> | <> NonTerminal <<$$ = buildRuleRef(LATEXT(1));>> { "!" <p1; q->astnode=ASTexclude;>> } { {"\<"} PassAction <p1, LATEXT(1));>> } <p1;>> { <> "\>" PassAction << a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require(a!=NULL, "rule element: cannot allocate assignment"); strcpy(a, LATEXT(1)); rr->assign = a; >> } << if ( label!=NULL ) { rr->el_label = label->str; label->elem = (Node *)rr; } if ( $first_on_line ) { CurAltStart = (Junction *)$$.left; altAdd(CurAltStart); /* MR7 */ ((RuleRefNode *)((Junction *)$$.left)->p1)->altstart = CurAltStart; } $node = (Node *)rr; >> ) | <> Action <<$0 = buildAction(LATEXT(1),action_file,action_line, 0);>> <> /* MR7 */ <<$node = (Node *) ((Junction *)$0.left)->p1;>> | <> Pred <<$0 = buildAction(LATEXT(1),action_file,action_line, 1);>> <p1;>> <> { <> PassAction << a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require(a!=NULL, "rule element: cannot allocate predicate fail action"); strcpy(a, LATEXT(1)); act->pred_fail = a; >> } <> /* MR7 */ <<$node = (Node *)act;>> | <> <= MAX_BLK_LEVEL) fatal("Blocks nested too deeply"); /* MR23 */ CurBlockID_array[BlkLevel] = CurBlockID; /* MR23 */ CurAltNum_array[BlkLevel] = CurAltNum; >> { Pragma ( "approx" <> | "LL\(1\)" <> /* MR20 */ | "LL\(2\)" <> /* MR20 */ ) } /* MR21 */ { FirstSetSymbol /* MR21 */ "\(" /* MR21 */ ( NonTerminal /* MR21 */ << /* MR21 */ pFirstSetSymbol = (char *) calloc(strlen(LATEXT(1))+1, /* MR21 */ sizeof(char)); /* MR21 */ require(pFirstSetSymbol!=NULL, /* MR21 */ "cannot allocate first set name"); /* MR21 */ strcpy(pFirstSetSymbol, LATEXT(1)); /* MR21 */ >> /* MR21 */ | TokenTerm /* MR21 */ << /* MR21 */ pFirstSetSymbol = (char *) calloc(strlen(LATEXT(1))+1, /* MR21 */ sizeof(char)); /* MR21 */ require(pFirstSetSymbol!=NULL, /* MR21 */ "cannot allocate first set name"); /* MR21 */ strcpy(pFirstSetSymbol, LATEXT(1)); /* MR21 */ >> /* MR21 */ ) /* MR21 */ "\)" /* MR21 */ } ( "\(" block[&toksrefd,&rulesrefd] "\)" <> ( "\*" <<$$ = makeLoop($$,approx,pFirstSetSymbol);>> | "\+" <<$$ = makePlus($$,approx,pFirstSetSymbol);>> | "?" ( ( "=>" <> | "&&" <> /* MR10 (g)? && <

>? */ ) Pred /* generalized predicate */ /* first make into a predicate */ <<$$ = buildAction(LATEXT(1),action_file,action_line,1);>> <p1;>> <> /* MR10 */ <> { <> PassAction << a = (char *)calloc(strlen(LATEXT(1))+1, sizeof(char)); require(a!=NULL, "rule element: cannot allocate predicate fail action"); strcpy(a, LATEXT(1)); act->pred_fail = a; >> } <> <<$node = (Node *)act;>> /* for now, just snag context */ << pred = computePredFromContextGuard(blk,&predMsgDone); /* MR10 */ if ( pred==NULL) { /* MR10 */ if ( !predMsgDone) err("invalid or missing context guard"); /* MR10 */ predMsgDone=1; /* MR10 */ } else { /* MR10 */ act->guardNodes=(Junction *)blk.left; /* MR11 */ pred->expr = act->action; pred->source = act; /* MR10 */ pred->ampersandStyle = ampersandStyle; /* 0 means (g)? => ... 1 means (g)? && ... */ /* MR13 */ if (pred->tcontext != NULL) { /* MR13 */ height=MR_max_height_of_tree(pred->tcontext); /* MR13 */ equal_height=MR_all_leaves_same_height(pred->tcontext,height); /* MR13 */ if (! equal_height) { /* MR13 */ errFL("in guarded predicates all tokens in the guard must be at the same height", /* MR13 */ FileStr[act->file],act->line); /* MR13 */ }; /* MR13 */ } /* MR10 */ if (ampersandStyle) { /* MR10 */ act->ampersandPred = pred; /* MR11 */ if (! HoistPredicateContext) { /* MR11 */ errFL("without \"-prc on\" (guard)? && <>? ... doesn't make sense", /* MR11 */ FileStr[act->file],act->line); /* MR11 */ }; /* MR10 */ } else { /* MR10 */ act->guardpred = pred; /* MR10 */ }; /* MR10 */ if (pred->k != semDepth) { /* MR10 */ warn(eMsgd2("length of guard (%d) does not match the length of semantic predicate (%d)", /* MR10 */ pred->k,semDepth)); /* MR10 */ }; } >> | <<$$ = makeBlk($$,approx,pFirstSetSymbol); FoundGuessBlk = 1; ((Junction *) ((Junction *)$$.left)->p1)->guess=1; if ( !$first_on_line ) { err("(...)? predicate must be first element of production"); } >> ) | <<$$ = makeBlk($$,approx,pFirstSetSymbol);>> ) << if ( pred==NULL && !predMsgDone) { /* MR10 */ ((Junction *)((Junction *)$$.left)->p1)->blockid = CurBlockID; ((Junction *)((Junction *)$$.left)->p1)->tokrefs = toksrefd; ((Junction *)((Junction *)$$.left)->p1)->rulerefs = rulesrefd; if ( $first_on_line ) { /* MR7 */ CurAltStart = (Junction *)((Junction *)((Junction *)$$.left)->p1); /* MR7 */ altAdd(CurAltStart); /* MR7 */ }; /* MR7 */ $node = (Node *) ((Junction *)$$.left)->p1; } >> | "\{" block[&toksrefd,&rulesrefd] <<$$ = makeOpt($2,approx,pFirstSetSymbol); /* MR23 */ CurBlockID_array[BlkLevel] = (-1); /* MR23 */ CurAltNum_array[BlkLevel] = (-1); --BlkLevel; >> "\}" << ((Junction *)((Junction *)$$.left)->p1)->blockid = CurBlockID; ((Junction *)((Junction *)$$.left)->p1)->tokrefs = toksrefd; ((Junction *)((Junction *)$$.left)->p1)->rulerefs = rulesrefd; >> <p1); /* MR7 */ altAdd(CurAltStart); /* MR7 */ }; >> <<$node = (Node *) ((Junction *)$$.left)->p1;>> ) /* Error catching alternatives */ | "\*" <> | "\+" <> | "\>" <' can only appear after a nonterminal"); CannotContinue=TRUE;>> | PassAction < [...]'"); CannotContinue=TRUE;>> ; <> /* rule default_exception_handler */ default_exception_handler : exception_group > [DefaultExGroup] ; /* rule exception_group */ exception_group > [ExceptionGroup *eg] : <> /* MR6 */ "exception" <<$eg = (ExceptionGroup *)calloc(1, sizeof(ExceptionGroup));>> { <> PassAction /* did they attach a label? */ << p = LATEXT(1)+1; p[strlen(p)-1] = '\0'; /* kill trailing space */ label = (LabelEntry *) hash_get(Elabel, LATEXT(1)+1); if ( label==NULL ) { err(eMsg1("unknown label in exception handler: '%s'", LATEXT(1)+1)); } >> } ( exception_handler > [h] <handlers), (void *)h);>> )* { "default" ":" Action <<{ ExceptionHandler *eh = (ExceptionHandler *) calloc(1, sizeof(ExceptionHandler)); char *a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require(eh!=NULL, "exception: cannot allocate handler"); require(a!=NULL, "exception: cannot allocate action"); strcpy(a, LATEXT(1)); eh->action = a; eh->signalname = (char *) calloc(strlen("default")+1, sizeof(char)); require(eh->signalname!=NULL, "exception: cannot allocate sig name"); strcpy(eh->signalname, "default"); list_add(&($eg->handlers), (void *)eh); }>> } << if ( label!=NULL ) { /* Record ex group in sym tab for this label */ if ( label->ex_group!=NULL ) { err(eMsg1("duplicate exception handler for label '%s'",label->str)); } else { label->ex_group = $eg; /* Label the exception group itself */ $eg->label = label->str; /* Make the labelled element pt to the exception also */ /* MR6 */ if (label->elem == NULL) { /* MR6 */ err(eMsg1("reference in exception handler to undefined label '%s'",label->str)); /* MR6 */ } else { switch ( label->elem->ntype ) { case nRuleRef : { RuleRefNode *r = (RuleRefNode *)label->elem; r->ex_group = $eg; break; } case nToken : { TokNode *t = (TokNode *)label->elem; t->ex_group = $eg; break; } } /* end switch */ /* MR6 */ }; /* end test on label->elem */ } /* end test on label->ex_group */ } /* end test on exception label */ /* MR7 */ /* MR7 */ if (BlkLevel == 1 && label == NULL) { /* MR7 */ $eg->forRule=1; /* MR7 */ } else if (label == NULL) { /* MR7 */ $eg->altID = makeAltID(CurBlockID_array[BlkLevel], CurAltNum_array[BlkLevel]); /* MR7 */ egAdd($eg); /* MR7 */ } else { /* MR7 */ $eg->labelEntry=label; /* MR7 */ }; /* MR7 */ /* MR7 */ /* You may want to remove this exc from the rule list */ /* MR7 */ /* and handle at the labeled element site. */ /* MR7 */ /* MR7 */ if (label != NULL) { /* MR7 */ $eg = NULL; /* MR7 */ }; >> ; <> /* rule exception_handler */ exception_handler > [ExceptionHandler *eh] : <<;>> /* MR9 Removed unreferenced variable "a" */ "catch" << $eh = (ExceptionHandler *)calloc(1, sizeof(ExceptionHandler)); require($eh!=NULL, "exception: cannot allocate handler"); >> ( NonTerminal << $eh->signalname = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require($eh->signalname!=NULL, "exception: cannot allocate sig name"); strcpy($eh->signalname, LATEXT(1)); >> | TokenTerm << $eh->signalname = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require($eh->signalname!=NULL, "exception: cannot allocate sig name"); strcpy($eh->signalname, LATEXT(1)); >> ) ":" { <<$eh->action = NULL;>> Action << $eh->action = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); require($eh->action!=NULL, "exception: cannot allocate action"); strcpy($eh->action, LATEXT(1)); >> } ; <> #token NonTerminal "[a-z] [A-Za-z0-9_]*" << while ( zzchar==' ' || zzchar=='\t' ) { zzadvance(); } if ( zzchar == ':' && inAlt ) NLA = LABEL; >> #token TokenTerm "[A-Z] [A-Za-z0-9_]*" << while ( zzchar==' ' || zzchar=='\t' ) { zzadvance(); } if ( zzchar == ':' && inAlt ) NLA = LABEL; >> #token "{\\}#[A-Za-z0-9_]*" <> #lexclass PARSE_ENUM_FILE #token "[\t\ ]+" << zzskip(); >> /* Ignore White */ #token "\n|\r|\r\n" << zzline++; zzskip(); >> /* Track Line # */ #token "//" << zzmode(TOK_DEF_CPP_COMMENTS); zzmore(); >> #token "/\*" << zzmode(TOK_DEF_COMMENTS); zzskip(); >> #token "#ifdef" << zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); >> #token "#if" << zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); >> #token "#ifndef" << ; >> #token "#else" << zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); >> #token "#endif" << zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); >> #token "#undef" << zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); >> #token "#import" << zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); >> #token "@" << ; >> /* rule enum_file */ enum_file[char *fname] : { "#ifndef" ID { "#define" ID /* ignore if it smells like a gate */ /* First #define after the first #ifndef (if any) is ignored */ } } ( ( enum_def[$fname] )+ | defines[$fname] ) | ; /* rule defines */ defines[char *fname] : <> /* MR3 */ ( "#define" ID <> INT << v = atoi(LATEXT(1)); /* fprintf(stderr, "#token %s=%d\n", t, v);*/ /* MR2 Andreas Magnusson (Andreas.Magnusson@mailbox.swipnet.se) */ /* MR2 Fix to bug introduced by 1.33MR1 for #tokdefs */ /* MR2 Don't let #tokdefs be confused by */ /* MR2 DLGminToken and DLGmaxToken */ if ( ! isDLGmaxToken(t)) { /* MR2 */ TokenNum = v; if ( v>maxt ) maxt=v; if ( Tnum( t ) == 0 ) { addForcedTname( t, v ); } else { warnFL(eMsg1("redefinition of token %s; ignored",t),$fname,zzline); }; }; >> )+ <> ; /* rule enum_def */ enum_def[char *fname] : <> /* MR3 */ "enum" ID "\{" ID <> ( "=" INT <> | <> ) << /* fprintf(stderr, "#token %s=%d\n", t, v);*/ TokenNum = v; if ( v>maxt ) maxt=v; /* MR3 */ if ( Tnum( t ) == 0 ) addForcedTname( t, v ); else { warnFL(eMsg1("redefinition of token %s; ignored",t),$fname,zzline); } >> ( "," /* MR2 Andreas Magnusson (Andreas.Magnusson@mailbox.swipnet.se) */ /* MR2 Fix to bug introduced by 1.33MR1 for #tokdefs */ /* MR2 Don't let #tokdefs be confused by */ /* MR2 DLGminToken and DLGmaxToken */ { <>? ID { "=" INT } /* MR2 */ | ID /* MR2 */ <> ( "=" INT <> | <> ) << /* fprintf(stderr, "#token %s=%d\n", t, v);*/ TokenNum = v; if ( v>maxt ) maxt=v; /* MR3 */ if ( Tnum( t ) == 0 ) addForcedTname( t, v ); else { warnFL(eMsg1("redefinition of token %s; ignored",t),$fname,zzline); } >> } )* "\}" ";" <> /* MR3 */ ; #token INT "[0-9]+" #token ID "[a-zA-Z_][_a-zA-Z0-9]*" #lexclass START /* MR14 Arpad Beszedes 26-May-98 Add support for #line directives when antlr source is pre-processed */ #lexaction << static char * #ifdef __USE_PROTOS getFileNameFromTheLineInfo(char *toStr, char *fromStr) #else getFileNameFromTheLineInfo(toStr, fromStr) char *toStr, *fromStr; #endif { int i, j, k; if (!fromStr || !toStr) return toStr; /* find the first " */ for (i=0; (i> << /* MR2 Andreas Magnusson (Andreas.Magnusson@mailbox.swipnet.se) */ /* MR2 Fix to bug introduced by 1.33MR1 for #tokdefs */ /* MR2 Don't let #tokdefs be confused by */ /* MR2 DLGminToken and DLGmaxToken */ /* semantic check on DLGminToken and DLGmaxmaxToken in #tokdefs */ #ifdef __USE_PROTOS static int isDLGmaxToken(char *Token) #else static int isDLGmaxToken(Token) char * Token; #endif { static char checkStr1[] = "DLGmaxToken"; static char checkStr2[] = "DLGminToken"; if (strcmp(Token, checkStr1) == 0) return 1; else if (strcmp(Token, checkStr2) == 0) return 1; else return 0; } /* semantics of #token */ static void #ifdef __USE_PROTOS chkToken(char *t, char *e, char *a, int tnum) #else chkToken(t,e,a,tnum) char *t, *e, *a; int tnum; #endif { TermEntry *p; /* check to see that they don't try to redefine a token as a token class */ if ( t!=NULL ) { p = (TermEntry *) hash_get(Tname, t); if ( p!=NULL && p->classname ) { err(eMsg1("redefinition of #tokclass '%s' to #token not allowed; ignored",t)); if ( a!=NULL ) free((char *)a); return; } } if ( t==NULL && e==NULL ) { /* none found */ err("#token requires at least token name or rexpr"); } else if ( t!=NULL && e!=NULL ) { /* both found */ if ( UserDefdTokens ) { /* if #tokdefs, must not define new */ p = (TermEntry *) hash_get(Tname, t); if ( p == NULL) { err(eMsg1("new token definition '%s' not allowed - only #token with name already defined by #tokdefs file allowed",t)); return; }; } Tklink(t, e); if ( a!=NULL ) { if ( hasAction(e) ) { err(eMsg1("redefinition of action for %s; ignored",e)); } else setHasAction(e, a); } } else if ( t!=NULL ) { /* only one found */ if ( UserDefdTokens ) { p = (TermEntry *) hash_get(Tname, t); if (p == NULL) { err(eMsg1("new token definition '%s' not allowed - only #token with name already defined by #tokdefs file allowed",t)); }; return; } if ( Tnum( t ) == 0 ) addTname( t ); else { err(eMsg1("redefinition of token %s; ignored",t)); } if ( a!=NULL ) { err(eMsg1("action cannot be attached to a token name (%s); ignored",t)); free((char *)a); } } else if ( e!=NULL ) { if ( Tnum( e ) == 0 ) addTexpr( e ); else { if ( hasAction(e) ) { err(eMsg1("redefinition of action for expr %s; ignored",e)); } else if ( a==NULL ) { err(eMsg1("redefinition of expr %s; ignored",e)); } } if ( a!=NULL ) setHasAction(e, a); } /* if a token type number was specified, then add the token ID and 'tnum' * pair to the ForcedTokens list. (only applies if an id was given) */ if ( t!=NULL && tnum>0 ) { if ( set_el(tnum, reserved_positions) ) { err(eMsgd("a token has already been forced to token number %d; ignored", tnum)); } else { list_add(&ForcedTokens, newForcedToken(t,tnum)); set_orel(tnum, &reserved_positions); } } } >> << static int #ifdef __USE_PROTOS match_token(char *s, char **nxt) #else match_token(s,nxt) char *s; char **nxt; #endif { if ( !(*s>='A' && *s<='Z') ) return 0; s++; while ( (*s>='a' && *s<='z') || (*s>='A' && *s<='Z') || (*s>='0' && *s<='9') || *s=='_' ) { s++; } if ( *s!=' ' && *s!='}' ) return 0; *nxt = s; return 1; } static int #ifdef __USE_PROTOS match_rexpr(char *s, char **nxt) #else match_rexpr(s,nxt) char *s; char **nxt; #endif { if ( *s!='"' ) return 0; s++; while ( *s!='"' ) { if ( *s=='\n' || *s=='\r' ) /* MR13 */ warn("eoln found in regular expression"); if ( *s=='\\' ) s++; s++; } *nxt = s+1; return 1; } /* * Walk a string "{ A .. Z }" where A..Z is a space separated list * of token references (either labels or reg exprs). Return a * string "inlineX_set" for some unique integer X. Basically, * we pretend as if we had seen "#tokclass inlineX { A .. Z }" * on the input stream outside of an action. */ char * #ifdef __USE_PROTOS inline_set(char *s) #else inline_set(s) char *s; #endif { char *nxt; fprintf(stderr, "found consumeUntil( {...} )\n"); while ( *s==' ' || *s=='\t' || *s=='\n' || *s=='\r' ) {s++;} if ( *s!='{' ) { err("malformed consumeUntil( {...} ); missing '{'"); return "bad_set"; } s++; while ( *s==' ' || *s=='\t' || *s=='\n' || *s=='\r' ) {s++;} while ( *s!='}' ) { if ( match_token(s,&nxt) ) fprintf(stderr, "found token %s\n", s); else if ( match_rexpr(s,&nxt) ) fprintf(stderr, "found rexpr %s\n", s); else { err("invalid element in consumeUntil( {...} )"); return "bad_set"; } s = nxt; while ( *s==' ' || *s=='\t' || *s=='\n' || *s=='\r' ) {s++;} } return "inlineX_set"; } >> << /* ANTLR-specific syntax error message generator * (define USER_ZZSYN when compiling so don't get 2 definitions) */ void #ifdef __USE_PROTOS zzsyn(char *text, int tok, char *egroup, SetWordType *eset, int etok, int k, char *bad_text) #else zzsyn(text, tok, egroup, eset, etok, k, bad_text) char *text, *egroup, *bad_text; int tok; int etok; int k; SetWordType *eset; #endif { fprintf(stderr, ErrHdr, FileStr[CurFile]!=NULL?FileStr[CurFile]:"stdin", zzline); fprintf(stderr, " syntax error at \"%s\"", (tok==zzEOF_TOKEN)?"EOF":text); if ( !etok && !eset ) {fprintf(stderr, "\n"); return;} if ( k==1 ) fprintf(stderr, " missing"); else { fprintf(stderr, "; \"%s\" not", bad_text); if ( zzset_deg(eset)>1 ) fprintf(stderr, " in"); } if ( zzset_deg(eset)>0 ) zzedecode(eset); else fprintf(stderr, " %s", zztokens[etok]); if ( strlen(egroup) > (size_t)0 ) fprintf(stderr, " in %s", egroup); fprintf(stderr, "\n"); } >> #lexaction << #ifdef __USE_PROTOS void mark_label_used_in_sem_pred(LabelEntry *le) /* MR10 */ #else void mark_label_used_in_sem_pred(le) /* MR10 */ LabelEntry *le; #endif { TokNode *tn; require (le->elem->ntype == nToken,"mark_label_used... ntype != nToken"); tn=(TokNode *)le->elem; require (tn->label != 0,"mark_label_used... TokNode has no label"); tn->label_used_in_semantic_pred=1; } >> gtkwave-3.3.86/contrib/pccts/antlr/hash.h0000664000175000017500000000411313166335473017573 0ustar bybellbybell/* * hash.h -- define hash table entries, sizes, hash function... * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * ANTLR 1.33 * Terence Parr * Parr Research Corporation * with Purdue University and AHPCRC, University of Minnesota * 1989-2001 */ /* H a s h T a b l e S t u f f */ #ifndef HashTableSize #define HashTableSize 553 #endif #ifndef StrTableSize #ifdef PC32 #define StrTableSize 1000000 #endif #endif #ifndef StrTableSize #ifdef PC #define StrTableSize 655200 #endif #endif #ifndef StrTableSize #define StrTableSize 1000000 #endif typedef struct _entry { /* Minimum hash table entry -- superclass */ char *str; struct _entry *next; } Entry; /* Hash 's' using 'size', place into h (s is modified) */ #define Hash(s,h,size) \ {while ( *s != '\0' ) h = (h<<1) + *s++; \ h %= size;} #ifdef __USE_PROTOS Entry *hash_get(Entry **, char *), **newHashTable(void), *hash_add(Entry **, char *, Entry *); void killHashTable(Entry **); #else Entry *hash_get(), **newHashTable(), *hash_add(); void killHashTable(); /* MR9 23-Sep-97 */ #endif gtkwave-3.3.86/contrib/pccts/antlr/lex.c0000664000175000017500000005477113166335473017452 0ustar bybellbybell/* * lex.c -- Generate all of the lexical type files: parser.dlg tokens.h * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * ANTLR 1.33 * Terence Parr * Parr Research Corporation * with Purdue University and AHPCRC, University of Minnesota * 1989-2001 */ #include #include /* MR1 */ /* MR1 10-Apr-97 MR1 Replace use of __STDC__ with __USE_PROTOS */ /* MR1 */ #include "pcctscfg.h" #include "set.h" #include "syn.h" #include "hash.h" #include "generic.h" #define DLGErrorString "invalid token" /* Generate a complete lexical description of the lexemes found in the grammar */ void #ifdef __USE_PROTOS genLexDescr( void ) #else genLexDescr( ) #endif { ListNode *p; FILE *dlgFile = fopen(OutMetaName(DlgFileName), "w"); require(dlgFile!=NULL, eMsg1("genLexFile: cannot open %s", OutMetaName(DlgFileName)) ); #ifdef SPECIAL_FOPEN special_fopen_actions(OutMetaName(DlgFileName)); /* MR1 */ #endif fprintf(dlgFile, "<<\n"); fprintf(dlgFile, "/* %s -- DLG Description of scanner\n", DlgFileName); fprintf(dlgFile, " *\n"); fprintf(dlgFile, " * Generated from:"); {int i; for (i=0; i 1 ) fprintf(dlgFile, "#define LL_K %d\n", OutputLL_k); if ( DemandLookahead ) fprintf(dlgFile, "#define DEMAND_LOOK\n"); if (TraceGen) { fprintf(dlgFile,"#ifndef zzTRACE_RULES\n"); /* MR20 */ fprintf(dlgFile,"#define zzTRACE_RULES\n"); /* MR20 */ fprintf(dlgFile,"#endif\n"); /* MR22 */ }; fprintf(dlgFile, "#include \"antlr.h\"\n"); if ( GenAST ) { fprintf(dlgFile, "#include \"ast.h\"\n"); } if ( UserDefdTokens ) fprintf(dlgFile, "#include %s\n", UserTokenDefsFile); /* still need this one as it has the func prototypes */ fprintf(dlgFile, "#include \"%s\"\n", DefFileName); fprintf(dlgFile, "#include \"dlgdef.h\"\n"); fprintf(dlgFile, "LOOKAHEAD\n"); fprintf(dlgFile, "\n"); fprintf(dlgFile, "void\n"); fprintf(dlgFile, "#ifdef __USE_PROTOS\n"); fprintf(dlgFile, "zzerraction(void)\n"); fprintf(dlgFile, "#else\n"); fprintf(dlgFile, "zzerraction()\n"); fprintf(dlgFile, "#endif\n"); fprintf(dlgFile, "{\n"); fprintf(dlgFile, "\t(*zzerr)(\"%s\");\n", DLGErrorString); fprintf(dlgFile, "\tzzadvance();\n"); fprintf(dlgFile, "\tzzskip();\n"); fprintf(dlgFile, "}\n"); } fprintf(dlgFile, ">>\n\n"); /* dump all actions */ /* MR1 */ /* MR1 11-Apr-97 Provide mechanism for inserting code into DLG class */ /* MR1 via <<%%lexmember ....>> & <<%%lexprefix ...>> */ /* MR1 */ if (LexActions != NULL) { for (p = LexActions->next; p!=NULL; p=p->next) { /* MR1 */ fprintf(dlgFile, "<<%%%%lexaction\n"); dumpAction( (char *)p->elem, dlgFile, 0, -1, 0, 1 ); fprintf(dlgFile, ">>\n\n"); } }; /* MR1 */ if (GenCC) { /* MR1 */ fprintf(dlgFile,"<<%%%%parserclass %s>>\n\n",CurrentClassName); /* MR1 */ }; /* MR1 */ if (LexPrefixActions != NULL) { /* MR1 */ for (p = LexPrefixActions->next; p!=NULL; p=p->next) /* MR1 */ { /* MR1 */ fprintf(dlgFile, "<<%%%%lexprefix\n"); /* MR1 */ dumpAction( (char *)p->elem, dlgFile, 0, -1, 0, 1 ); /* MR1 */ fprintf(dlgFile, ">>\n\n"); /* MR1 */ } /* MR1 */ }; /* MR1 */ if (LexMemberActions != NULL) { /* MR1 */ for (p = LexMemberActions->next; p!=NULL; p=p->next) /* MR1 */ { /* MR1 */ fprintf(dlgFile, "<<%%%%lexmember\n"); /* MR1 */ dumpAction( (char *)p->elem, dlgFile, 0, -1, 0, 1 ); /* MR1 */ fprintf(dlgFile, ">>\n\n"); /* MR1 */ } /* MR1 */ }; /* dump all regular expression rules/actions (skip sentinel node) */ if ( ExprOrder == NULL ) { warnNoFL("no regular expressions found in grammar"); } else dumpLexClasses(dlgFile); fprintf(dlgFile, "%%%%\n"); fclose( dlgFile ); } /* For each lexical class, scan ExprOrder looking for expressions * in that lexical class. Print out only those that match. * Each element of the ExprOrder list has both an expr and an lclass * field. */ void #ifdef __USE_PROTOS dumpLexClasses( FILE *dlgFile ) #else dumpLexClasses( dlgFile ) FILE *dlgFile; #endif { int i; TermEntry *t; ListNode *p; Expr *q; for (i=0; inext; p!=NULL; p=p->next) { q = (Expr *) p->elem; if ( q->lclass != i ) continue; lexmode(i); t = (TermEntry *) hash_get(Texpr, q->expr); require(t!=NULL, eMsg1("genLexDescr: rexpr %s not in hash table",q->expr) ); if ( t->token == EpToken ) continue; fprintf(dlgFile, "%s\n\t<<\n", StripQuotes(q->expr)); /* replace " killed by StripQuotes() */ q->expr[ strlen(q->expr) ] = '"'; if ( !GenCC ) { if ( TokenString(t->token) != NULL ) fprintf(dlgFile, "\t\tNLA = %s;\n", TokenString(t->token)); else fprintf(dlgFile, "\t\tNLA = %d;\n", t->token); } if ( t->action != NULL ) dumpAction( t->action, dlgFile, 2,-1,0,1 ); if ( GenCC ) { if ( TokenString(t->token) != NULL ) fprintf(dlgFile, "\t\treturn %s;\n", TokenString(t->token)); else fprintf(dlgFile, "\t\treturn (ANTLRTokenType)%d;\n", t->token); } fprintf(dlgFile, "\t>>\n\n"); } } } /* Strip the leading path (if any) from a filename */ char * #ifdef __USE_PROTOS StripPath( char *fileName ) #else StripPath( fileName ) char *fileName; #endif { char *p; static char dirSym[2] = DirectorySymbol; if(NULL != (p = strrchr(fileName, dirSym[0]))) p++; else p = fileName; return(p); } /* Generate a list of #defines && list of struct definitions for * aggregate retv's */ void #ifdef __USE_PROTOS genDefFile( void ) #else genDefFile( ) #endif { int i; /* If C++ mode and #tokdef used, then don't need anything in here since * C++ puts all definitions in the class file name. */ if ( GenCC && UserTokenDefsFile ) return; if ( MR_Inhibit_Tokens_h_Gen) return; DefFile = fopen(OutMetaName(DefFileName), "w"); require(DefFile!=NULL, eMsg1("genDefFile: cannot open %s", OutMetaName(DefFileName)) ); #ifdef SPECIAL_FOPEN special_fopen_actions(OutMetaName(DefFileName)); /* MR1 */ #endif fprintf(DefFile, "#ifndef %s\n", StripPath(gate_symbol(DefFileName))); fprintf(DefFile, "#define %s\n", StripPath(gate_symbol(DefFileName))); fprintf(DefFile, "/* %s -- List of labelled tokens and stuff\n", DefFileName); fprintf(DefFile, " *\n"); fprintf(DefFile, " * Generated from:"); for (i=0; i1 ) { int j; /* look in all lexclasses for the reg expr */ /* MR10 Derek Pappas */ /* MR10 A #tokclass doesn't have associated regular expressiones */ /* MR10 so don't warn user about it's omission */ p = (TermEntry *) hash_get(Tname, TokenString(i)); if (p != NULL && ! p->classname) { for (j=0; j=NumLexClasses ) { warnNoFL(eMsg1("token label has no associated rexpr: %s",TokenString(i))); } }; } require((p=(TermEntry *)hash_get(Tname, TokenString(i))) != NULL, "token not in sym tab when it should be"); if ( !p->classname ) { if ( GenCC ) { if ( !first ) fprintf(DefFile, ",\n"); first = 0; fprintf(DefFile, "\t%s=%d", TokenString(i), i); } else fprintf(DefFile, "#define %s %d\n", TokenString(i), i); } } } /* MR1 */ /* MR1 10-Apr-97 133MR1 Prevent use of varying sizes of integer */ /* MR1 for the enum ANTLRTokenType */ /* MR1 */ if ( GenCC ) { /* MR1 */ if ( !first ) fprintf(DefFile, ",\n"); /* MR14 */ fprintf(DefFile, "\tDLGminToken=0"); /* MR1 */ fprintf(DefFile, ",\n\tDLGmaxToken=9999};\n"); /* MR1 */ }; /* MR1 */ } if ( !GenCC ) GenRulePrototypes(DefFile, SynDiag); fprintf(DefFile, "\n#endif\n"); } void #ifdef __USE_PROTOS GenRemapFile( void ) #else GenRemapFile( ) #endif { if ( strcmp(ParserName, DefaultParserName)!=0 ) { FILE *f; int i; f = fopen(OutMetaName(RemapFileName), "w"); require(f!=NULL, eMsg1("GenRemapFile: cannot open %s", OutMetaName(RemapFileName)) ); #ifdef SPECIAL_FOPEN special_fopen_actions(OutMetaName(RemapFileName)); /* MR1 */ #endif fprintf(f, "/* %s -- List of symbols to remap\n", RemapFileName); fprintf(f, " *\n"); fprintf(f, " * Generated from:"); for (i=0; irname, ParserName, p->rname); p = (Junction *)p->p2; } } /* Generate a bunch of #defines that rename all standard symbols to be * "ParserName_symbol". The list of standard symbols to change is in * globals.c. */ void #ifdef __USE_PROTOS GenPredefinedSymbolRedefs( FILE *f ) #else GenPredefinedSymbolRedefs( f ) FILE *f; #endif { char **p; fprintf(f, "\n/* rename PCCTS-supplied symbols to be 'ParserName_symbol' */\n"); for (p = &StandardSymbols[0]; *p!=NULL; p++) { fprintf(f, "#define %s %s_%s\n", *p, ParserName, *p); } } /* Generate a bunch of #defines that rename all AST symbols to be * "ParserName_symbol". The list of AST symbols to change is in * globals.c. */ void #ifdef __USE_PROTOS GenASTSymbolRedefs( FILE *f ) #else GenASTSymbolRedefs( f ) FILE *f; #endif { char **p; fprintf(f, "\n/* rename PCCTS-supplied AST symbols to be 'ParserName_symbol' */\n"); for (p = &ASTSymbols[0]; *p!=NULL; p++) { fprintf(f, "#define %s %s_%s\n", *p, ParserName, *p); } } /* redefine all sets generated by ANTLR; WARNING: 'zzerr', 'setwd' must match * use in bits.c (DumpSetWd() etc...) */ void #ifdef __USE_PROTOS GenSetRedefs( FILE *f ) #else GenSetRedefs( f ) FILE *f; #endif { int i; for (i=1; i<=wordnum; i++) { fprintf(f, "#define setwd%d %s_setwd%d\n", i, ParserName, i); } for (i=1; i<=esetnum; i++) { fprintf(f, "#define zzerr%d %s_err%d\n", i, ParserName, i); } } /* Find all return types/parameters that require structs and def * all rules with ret types. * * This is for the declaration, not the definition. */ void #ifdef __USE_PROTOS GenRulePrototypes( FILE *f, Junction *p ) #else GenRulePrototypes( f, p ) FILE *f; Junction *p; #endif { int i; i = 1; while ( p!=NULL ) { if ( p->ret != NULL ) { /* MR23 */ if ( hasMultipleOperands(p->ret) ) { DumpRetValStruct(f, p->ret, i); } fprintf(f, "\n#ifdef __USE_PROTOS\n"); /* MR23 */ if ( hasMultipleOperands(p->ret) ) { fprintf(f, "extern struct _rv%d", i); } else { fprintf(f, "extern "); DumpType(p->ret, f); } fprintf(f, " %s%s(", RulePrefix, p->rname); DumpANSIFunctionArgDef(f,p,1 /* emit initializers ? */); fprintf(f, ";\n"); fprintf(f, "#else\n"); /* MR23 */ if ( hasMultipleOperands(p->ret) ) { fprintf(f, "extern struct _rv%d", i); } else { fprintf(f, "extern "); DumpType(p->ret, f); } fprintf(f, " %s%s();\n", RulePrefix, p->rname); fprintf(f, "#endif\n"); } else { fprintf(f, "\n#ifdef __USE_PROTOS\n"); fprintf(f, "void %s%s(", RulePrefix, p->rname); DumpANSIFunctionArgDef(f,p, 1 /* emit initializers ? */ ); fprintf(f, ";\n"); #ifdef OLD if ( p->pdecl != NULL || GenAST ) { if ( GenAST ) { fprintf(f, "AST **%s",(p->pdecl!=NULL)?",":""); } if ( p->pdecl!=NULL ) fprintf(f, "%s", p->pdecl); } else fprintf(f, "void"); fprintf(f, ");\n"); #endif fprintf(f, "#else\n"); fprintf(f, "extern void %s%s();\n", RulePrefix, p->rname); fprintf(f, "#endif\n"); } i++; p = (Junction *)p->p2; } } /* Define all rules in the class.h file; generate any required * struct definitions first, however. */ void #ifdef __USE_PROTOS GenRuleMemberDeclarationsForCC( FILE *f, Junction *q ) #else GenRuleMemberDeclarationsForCC( f, q ) FILE *f; Junction *q; #endif { Junction *p = q; int i; fprintf(f, "private:\n"); /* Dump dflt handler declaration */ fprintf(f, "\tvoid zzdflthandlers( int _signal, int *_retsignal );\n\n"); fprintf(f, "public:\n"); /* Dump return value structs */ i = 1; while ( p!=NULL ) { if ( p->ret != NULL ) { /* MR23 */ if ( hasMultipleOperands(p->ret) ) { DumpRetValStruct(f, p->ret, i); } } i++; p = (Junction *)p->p2; } /* Dump member func defs && CONSTRUCTOR */ fprintf(f, "\t%s(ANTLRTokenBuffer *input);\n", CurrentClassName); /* fprintf(f, "\t%s(ANTLRTokenBuffer *input, ANTLRTokenType eof);\n", CurrentClassName); */ i = 1; p = q; while ( p!=NULL ) { if ( p->ret != NULL ) { /* MR23 */ if ( hasMultipleOperands(p->ret) ) { fprintf(f, "\tstruct _rv%d", i); } else { fprintf(f, "\t"); DumpType(p->ret, f); } fprintf(f, " %s%s(",RulePrefix,p->rname); DumpANSIFunctionArgDef(f,p, 1 /* emit initializers ? */ ); fprintf(f, ";\n"); #ifdef OLD if ( p->pdecl != NULL || GenAST ) { if ( GenAST ) fprintf(f, "ASTBase **%s",(p->pdecl!=NULL)?",":""); if ( p->pdecl!=NULL ) fprintf(f, "%s", p->pdecl); } fprintf(f, ");\n"); #endif } else { fprintf(f, "\tvoid %s%s(",RulePrefix,p->rname); DumpANSIFunctionArgDef(f,p, 1 /* emit initializers ? */); fprintf(f, ";\n"); #ifdef OLD if ( p->pdecl != NULL || GenAST ) { if ( GenAST ) fprintf(f, "ASTBase **%s",(p->pdecl!=NULL)?",":""); if ( p->pdecl!=NULL ) fprintf(f, "%s", p->pdecl); } fprintf(f, ");\n"); #endif } i++; p = (Junction *)p->p2; } } /* Given a list of ANSI-style parameter declarations, print out a * comma-separated list of the symbols (w/o types). * Basically, we look for a comma, then work backwards until start of * the symbol name. Then print it out until 1st non-alnum char. Now, * move on to next parameter. * */ /* MR5 Jan Mikkelsen 26-May-97 - added initalComma parameter */ void #ifdef __USE_PROTOS DumpListOfParmNames(char *pdecl, FILE *output, int initialComma) /* MR5 */ #else DumpListOfParmNames(pdecl, output, initialComma) /* MR5 */ char *pdecl; /* MR5 */ FILE *output; /* MR5 */ int initialComma; /* MR5 */ #endif { int firstTime = 1, done = 0; require(output!=NULL, "DumpListOfParmNames: NULL parm"); if ( pdecl == NULL ) return; while ( !done ) { if ( !firstTime || initialComma ) putc(',', output); /* MR5 */ done = DumpNextNameInDef(&pdecl, output); firstTime = 0; } } /* given a list of parameters or return values, dump the next * name to output. Return 1 if last one just printed, 0 if more to go. */ /* MR23 Total rewrite */ int #ifdef __USE_PROTOS DumpNextNameInDef( char **q, FILE *output ) #else DumpNextNameInDef( q, output ) char **q; FILE *output; #endif { char *p; char *t; char *pDataType; char *pSymbol; char *pEqualSign; char *pValue; char *pSeparator; int nest = 0; p = endFormal(*q, &pDataType, &pSymbol, &pEqualSign, &pValue, &pSeparator, &nest); /* MR26 Handle rule arguments such as: IIR_Bool (IIR_Decl::*contstraint)() For this we need to strip off anything which follows the symbol. */ /* MR26 */ t = pSymbol; /* MR26 */ if (t != NULL) { /* MR26 */ for (t = pSymbol; *t != 0; t++) { /* MR26 */ if (! (isalpha(*t) || isdigit(*t) || *t == '_' || *t == '$')) break; /* MR26 */ } /* MR26 */ } /* MR26 */ fprintf(output,"%s",strBetween(pSymbol, t, pSeparator)); *q = p; return (*pSeparator == 0); } /* Given a list of ANSI-style parameter declarations, dump K&R-style * declarations, one per line for each parameter. Basically, convert * comma to semi-colon, newline. */ void #ifdef __USE_PROTOS DumpOldStyleParms( char *pdecl, FILE *output ) #else DumpOldStyleParms( pdecl, output ) char *pdecl; FILE *output; #endif { require(output!=NULL, "DumpOldStyleParms: NULL parm"); if ( pdecl == NULL ) return; while ( *pdecl != '\0' ) { if ( *pdecl == ',' ) { pdecl++; putc(';', output); putc('\n', output); while ( *pdecl==' ' || *pdecl=='\t' || *pdecl=='\n' ) pdecl++; } else {putc(*pdecl, output); pdecl++;} } putc(';', output); putc('\n', output); } /* Take in a type definition (type + symbol) and print out type only */ /* MR23 Total rewrite */ void #ifdef __USE_PROTOS DumpType( char *s, FILE *f ) #else DumpType( s, f ) char *s; FILE *f; #endif { char *p; char *pDataType; char *pSymbol; char *pEqualSign; char *pValue; char *pSeparator; int nest = 0; require(s!=NULL, "DumpType: invalid type string"); p = endFormal(s, &pDataType, &pSymbol, &pEqualSign, &pValue, &pSeparator, &nest); fprintf(f,"%s",strBetween(pDataType, pSymbol, pSeparator)); } /* check to see if string e is a word in string s */ int #ifdef __USE_PROTOS strmember( char *s, char *e ) #else strmember( s, e ) char *s; char *e; #endif { register char *p; require(s!=NULL&&e!=NULL, "strmember: NULL string"); if ( *e=='\0' ) return 1; /* empty string is always member */ do { while ( *s!='\0' && !isalnum(*s) && *s!='_' ) ++s; p = e; while ( *p!='\0' && *p==*s ) {p++; s++;} if ( *p=='\0' ) { if ( *s=='\0' ) return 1; if ( !isalnum (*s) && *s != '_' ) return 1; } while ( isalnum(*s) || *s == '_' ) ++s; } while ( *s!='\0' ); return 0; } #if 0 /* MR23 Replaced by hasMultipleOperands() */ int #ifdef __USE_PROTOS HasComma( char *s ) #else HasComma( s ) char *s; #endif { while (*s!='\0') if ( *s++ == ',' ) return 1; return 0; } #endif /* MR23 Total rewrite */ void #ifdef __USE_PROTOS DumpRetValStruct( FILE *f, char *ret, int i ) #else DumpRetValStruct( f, ret, i ) FILE *f; char *ret; int i; #endif { char *p = ret; char *pDataType; char *pSymbol; char *pEqualSign; char *pValue; char *pSeparator; int nest = 0; fprintf(f, "\nstruct _rv%d {\n", i); while (*p != 0 && nest == 0) { p = endFormal(p, &pDataType, &pSymbol, &pEqualSign, &pValue, &pSeparator, &nest); fprintf(f,"\t"); fprintf(f,"%s",strBetween(pDataType, pSymbol, pSeparator)); fprintf(f," "); fprintf(f,"%s",strBetween(pSymbol, pEqualSign, pSeparator)); fprintf(f,";\n"); } fprintf(f,"};\n"); } /* given "s" yield s -- DESTRUCTIVE (we modify s if starts with " else return s) */ char * #ifdef __USE_PROTOS StripQuotes( char *s ) #else StripQuotes( s ) char *s; #endif { if ( *s == '"' ) { s[ strlen(s)-1 ] = '\0'; /* remove last quote */ return( s+1 ); /* return address past initial quote */ } return( s ); } gtkwave-3.3.86/contrib/pccts/antlr/Makefile.am0000664000175000017500000000424713166335473020543 0ustar bybellbybell## -*- makefile -*- ## noinst_PROGRAMS= antlr AM_CFLAGS= -I. -I$(srcdir)/../support/set \ -I$(srcdir)/../h -DUSER_ZZSYN $(COTHER) -DZZLEXBUFSIZE=32000 # # SGI Users, use this CFLAGS # # FIXME -- what are -DUSER_ZZSYN and -woff 3262 for? Whats the real # condition we need to detect to corectly turn those on? # # Think feature test, not OS test. #CFLAGS= -O -I. -I$(SET) -I$(PCCTS_H) -DUSER_ZZSYN -woff 3262 antlr_SOURCES= \ antlr.c err.c bits.c build.c egman.c fcache.c fset.c fset2.c \ gen.c generic.h globals.c hash.c hash.h lex.c main.c misc.c mode.h \ mrhoist.c pred.c proto.h scan.c $(srcdir)/../support/set/set.c \ stdpccts.h syn.h tokens.h # what files does PCCTS generate (both ANTLR and DLG) PCCTS_GEN=antlr.c scan.c err.c tokens.h mode.h parser.dlg stdpccts.h remap.h # hopefully this won't produce some sort of chicken and egg problem ANTLR= ./antlr # Don't worry about the ambiguity messages coming from antlr # for making antlr.c etc... [should be 10 of them, I think] antlr.c stdpccts.h parser.dlg tokens.h err.c : $(srcdir)/antlr.g @if test -x ${ANTLR} ; then \ echo "${ANTLR} -gh $(srcdir)/antlr.g" ; \ ${ANTLR} -gh $(srcdir)/antlr.g ; \ else \ echo "WARNING: $(srcdir)/antlr.g has changed making antlr.c stdpccts.h parser.dlg tokens.h " ; \ echo " and err.c out of date." ; \ echo " However you have not finished building $(ANTLR) yet. So you may want to" ; \ echo " build again a 2nd time after your build (hopefully) finishes." ; \ fi DLG= ../dlg/dlg scan.c mode.h: $(srcdir)/parser.dlg @if test -x ${DLG} ; then \ echo "${DLG} -C2 $(srcdir)/parser.dlg scan.c" ; \ ${DLG} -C2 $(srcdir)/parser.dlg scan.c ; \ else \ echo "WARNING: $(srcdir)/parser.g has changed making scan.c and mode.h out of date." ; \ echo " However you have not finished building $(DLG) yet. So you may want to" ; \ echo " build again a 2nd time after your build (hopefully) finishes." ; \ fi EXTRA_DIST= \ AntlrMS.mak AntlrMSVC50.dsp AntlrMSVC50.dsw AntlrMSVC50.mak \ AntlrMSVC60.dsp AntlrMSVC60.dsw README antlr.1 antlr.g \ antlr.r antlr1.txt antlr68K.make antlrPPC.make makefile.VMS \ makefile1 parser.dlg watantlr.mak gtkwave-3.3.86/contrib/pccts/antlr/mode.h0000664000175000017500000000043413166335473017576 0ustar bybellbybell#define START 0 #define STRINGS 1 #define ACTION_STRINGS 2 #define ACTION_CHARS 3 #define ACTION_COMMENTS 4 #define TOK_DEF_COMMENTS 5 #define TOK_DEF_CPP_COMMENTS 6 #define ACTION_CPP_COMMENTS 7 #define CPP_COMMENTS 8 #define COMMENTS 9 #define ACTIONS 10 #define PARSE_ENUM_FILE 11 gtkwave-3.3.86/contrib/pccts/antlr/AntlrMSVC50.dsw0000664000175000017500000000103313166335473021132 0ustar bybellbybellMicrosoft Developer Studio Workspace File, Format Version 5.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "ANTLR"=.\AntlrMSVC50.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### gtkwave-3.3.86/contrib/pccts/antlr/pred.c0000664000175000017500000004665313166335473017614 0ustar bybellbybell/* * pred.c -- source for predicate detection, manipulation * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * ANTLR 1.33 * Terence Parr * Parr Research Corporation * with Purdue University and AHPCRC, University of Minnesota * 1989-2001 */ #include #include "pcctscfg.h" #include "set.h" #include "syn.h" #include "hash.h" #include "generic.h" #include "dlgdef.h" #include #ifdef __USE_PROTOS static void complete_context_sets(RuleRefNode *, Predicate *); static void complete_context_trees(RuleRefNode *, Predicate *); #else static void complete_context_sets(); static void complete_context_trees(); #endif char *PRED_AND_LIST = "AND"; char *PRED_OR_LIST = "OR"; /* * In C mode, return the largest constant integer found as the * sole argument to LATEXT(i). * * In C++ mode, return the largest constant integer found as the * sole argument to LT(i) given that the char before is nonalpha. */ int #ifdef __USE_PROTOS predicateLookaheadDepth(ActionNode *a) #else predicateLookaheadDepth(a) ActionNode *a; #endif { int max_k=0; if (a->predEntry != NULL) { MR_pred_depth(a->predEntry->pred,&max_k); goto PREDENTRY_EXIT; } if ( GenCC ) { /* scan for LT(i) */ int k = 0; char *p = a->action; while ( p!=NULL ) { p = strstr(p, "LT("); if ( p!=NULL ) { if ( p>=a->action && !isalpha(*(p-1)) ) { k = atoi(p+strlen("LT(")); if ( k>max_k ) max_k=k; } p += strlen("LT("); } } } else { /* scan for LATEXT(i) */ int k = 0; char *p = a->action; while ( p!=NULL ) { p = strstr(p, "LATEXT("); if ( p!=NULL ) { p += strlen("LATEXT("); k = atoi(p); if ( k>max_k ) max_k=k; } } } if (max_k==0) { max_k = 1; /* MR33 Badly designed if didn't set max_k when CLL_k = 1 */ if (CLL_k > 1) /* MR27 Don't warn if max(k,ck) == 1 */ { if ( !a->frmwarned ) { a->frmwarned = 1; warnFL(eMsg1("predicate: %s missing, bad, or with i=0; assuming i=1", GenCC?"LT(i)":"LATEXT(i)"), FileStr[a->file], a->line); } } } /* MR10 */ if ( max_k > CLL_k) { /* MR10 */ if ( !a->frmwarned ) /* MR10 */ { /* MR10 */ a->frmwarned = 1; /* MR11 */ errFL(eMsgd2("predicate refers to lookahead token %d. Semantic lookahead is limited to max(k,ck)==%d", /* MR10 */ max_k,CLL_k), /* MR10 */ FileStr[a->file],a->line); /* MR10 */ if (max_k >= OutputLL_k) { /* MR10 */ if (!GenCC) { /* MR10 */ errFL(eMsgd(" the lookahead buffer size in C mode is %d token(s) (including the one just recognized)", /* MR10 */ OutputLL_k), /* MR10 */ FileStr[a->file],a->line); /* MR10 */ }; /* MR10 */ }; /* MR10 */ }; /* MR10 */ max_k= CLL_k; /* MR10 */ }; PREDENTRY_EXIT: return max_k; } /* Find all predicates in a block of alternatives. DO NOT find predicates * behind the block because that predicate could depend on things set in * one of the nonoptional blocks */ Predicate * #ifdef __USE_PROTOS find_in_aSubBlk( Junction *alt ) #else find_in_aSubBlk( alt ) Junction *alt; #endif { Predicate *a, *head=NULL, *tail=NULL, *root=NULL; Junction *p = alt; if (MRhoisting) { return MR_find_in_aSubBlk(alt); }; for (; p!=NULL; p=(Junction *)p->p2) { /* ignore empty alts */ if ( p->p1->ntype != nJunction || ((Junction *)p->p1)->jtype != EndBlk ) { a = find_predicates(p->p1); /* get preds for this alt */ if ( a==NULL ) continue; /* make an OR list of predicates */ if ( head==NULL ) { root = new_pred(); root->expr = PRED_OR_LIST; head = tail = a; root->down = head; } else { tail->right = a; a->left = tail; a->up = tail->up; tail = a; } } } /* if just one pred, remove OR root */ if ( root!=NULL && root->down->right == NULL ) { Predicate *d = root->down; free( (char *) root); return d; } return root; } Predicate * #ifdef __USE_PROTOS find_in_aOptBlk( Junction *alt ) #else find_in_aOptBlk( alt ) Junction *alt; #endif { return find_in_aSubBlk( alt ); } Predicate * #ifdef __USE_PROTOS find_in_aLoopBegin( Junction *alt ) #else find_in_aLoopBegin( alt ) Junction *alt; #endif { return find_in_aSubBlk( (Junction *) alt->p1 ); /* get preds in alts */ } Predicate * #ifdef __USE_PROTOS find_in_aPlusBlk( Junction *alt ) #else find_in_aPlusBlk( alt ) Junction *alt; #endif { require(alt!=NULL&&alt->p2!=NULL, "invalid aPlusBlk"); return find_in_aSubBlk( alt ); } /* Look for a predicate; * * Do not pass anything but Junction nodes; no Actions, Tokens, RuleRefs. * This means that a "hoisting distance" of zero is the only distance * allowable. Init actions are ignored. * * WARNING: * Assumes no (..)? block after predicate for the moment. * Does not check to see if pred is in production that can generate * a sequence contained in the set of ambiguous tuples. * * Return the predicate found if any. */ Predicate * #ifdef __USE_PROTOS find_predicates( Node *alt ) #else find_predicates( alt ) Node *alt; #endif { #ifdef DBG_PRED Junction *j; RuleRefNode *r; TokNode *t; #endif Predicate *pred; if ( alt==NULL ) return NULL; #ifdef DBG_PRED switch ( alt->ntype ) { case nJunction : j = (Junction *) alt; fprintf(stderr, "Junction(in %s)", j->rname); switch ( j->jtype ) { case aSubBlk : fprintf(stderr,"aSubBlk\n"); break; case aOptBlk : fprintf(stderr,"aOptBlk\n"); break; case aLoopBegin : fprintf(stderr,"aLoopBeginBlk\n"); break; case aLoopBlk : fprintf(stderr,"aLoopBlk\n"); break; case aPlusBlk : fprintf(stderr,"aPlusBlk\n"); break; case EndBlk : fprintf(stderr,"EndBlk\n"); break; case RuleBlk : fprintf(stderr,"RuleBlk\n"); break; case Generic : fprintf(stderr,"Generic\n"); break; case EndRule : fprintf(stderr,"EndRule\n"); break; } break; case nRuleRef : r = (RuleRefNode *) alt; fprintf(stderr, "RuleRef(in %s)\n", r->rname); break; case nToken : t = (TokNode *) alt; fprintf(stderr, "TokenNode(in %s)%s\n", t->rname, TokenString(t->token)); break; case nAction : fprintf(stderr, "Action\n"); break; } #endif switch ( alt->ntype ) { case nJunction : { Predicate *a, *b; Junction *p = (Junction *) alt; /* lock nodes */ if ( p->jtype==aLoopBlk || p->jtype==RuleBlk || p->jtype==aPlusBlk || p->jtype==EndRule ) { require(p->pred_lock!=NULL, "rJunc: lock array is NULL"); if ( p->pred_lock[1] ) { return NULL; } p->pred_lock[1] = TRUE; } switch ( p->jtype ) { case aSubBlk : a = find_in_aSubBlk(p); return a; /* nothing is visible past this guy */ case aOptBlk : a = find_in_aOptBlk(p); return a; case aLoopBegin : a = find_in_aLoopBegin(p); return a; case aLoopBlk : a = find_in_aSubBlk(p); p->pred_lock[1] = FALSE; return a; case aPlusBlk : a = find_in_aPlusBlk(p); p->pred_lock[1] = FALSE; return a; /* nothing is visible past this guy */ case RuleBlk : a = find_predicates(p->p1); p->pred_lock[1] = FALSE; return a; case Generic : a = find_predicates(p->p1); b = find_predicates(p->p2); if ( p->pred_lock!=NULL ) p->pred_lock[1] = FALSE; if ( a==NULL ) return b; if ( b==NULL ) return a; /* otherwise OR the two preds together */ { fatal_internal("hit unknown situation during predicate hoisting"); } case EndBlk : case EndRule : /* Find no predicates after a rule ref */ return NULL; default: fatal_internal("this cannot be printed\n"); break; } } case nAction : { ActionNode *p = (ActionNode *) alt; if ( p->noHoist) return NULL; /* MR12c */ if ( p->init_action ) return find_predicates(p->next); if ( p->is_predicate ) { Tree *t=NULL; #ifdef DBG_PRED fprintf(stderr, "predicate: <<%s>>?\n", p->action); #endif if ( p->guardpred!=NULL ) { pred = predicate_dup(p->guardpred); MR_guardPred_plainSet(p,pred); /* MR12c */ } else { pred = new_pred(); pred->k = predicateLookaheadDepth(p); pred->source = p; pred->expr = p->action; if ( HoistPredicateContext && pred->k > 1 ) { /* MR30 No need to use first_item_is_guess_block_extra since we know this is an action, not a (...)* or (...)+ block. */ if ( first_item_is_guess_block((Junction *)p->next) ) { warnFL("cannot compute context of predicate in front of (..)? block", FileStr[p->file], p->line); } else { ConstrainSearch = 0; /* MR11 */ if (p->ampersandPred != NULL) { /* MR11 */ TRAV(p, /* MR11 */ pred->k, /* MR11 */ &(pred->completionTree), t); /* MR11 */ } else { TRAV(p->next, pred->k, &(pred->completionTree), t); }; pred->tcontext = t; MR_check_pred_too_long(pred,pred->completionTree); #ifdef DBG_PRED fprintf(stderr, "LL(%d) context:", pred->k); preorder(t); fprintf(stderr, "\n"); #endif } } else if ( HoistPredicateContext && pred->k == 1 ) { pred->scontext[1] = empty; /* MR30 No need to use first_item_is_guess_block_extra since we know this is an action. */ if ( first_item_is_guess_block((Junction *)p->next) ) { warnFL("cannot compute context of predicate in front of (..)? block", FileStr[p->file], p->line); } else { REACH((Junction *)p->next, 1, &(pred->completionSet), pred->scontext[1]); MR_check_pred_too_long(pred,pred->completionSet); #ifdef DBG_PRED fprintf(stderr, "LL(1) context:"); s_fprT(stderr, pred->scontext[1]); fprintf(stderr, "\n"); #endif } } } { Predicate *d = find_predicates(p->next); Predicate *root; /* Warning: Doesn't seem like the up pointers will all be set correctly; * TJP: that's ok, we're not using them now. */ if ( d!=NULL ) { root = new_pred(); root->expr = PRED_AND_LIST; root->down = pred; pred->right = d; pred->up = root; d->left = pred; d->up = pred->up; return root; } } return pred; } return NULL; } case nRuleRef : { Predicate *a; RuleRefNode *p = (RuleRefNode *) alt; Junction *r; Junction *save_MR_RuleBlkWithHalt; RuleEntry *q = (RuleEntry *) hash_get(Rname, p->text); if ( q == NULL ) { warnFL( eMsg1("rule %s not defined",p->text), FileStr[p->file], p->line ); return NULL; } r = RulePtr[q->rulenum]; if ( r->pred_lock[1] ) { /* infinite left-recursion; ignore 'cause LL sup 1 (k) analysis * must have seen it earlier. */ return NULL; } /* MR10 There should only be one halt set at a time. */ /* MR10 Life would have been easier with a global variable */ /* MR10 (at least for this particular need) */ /* MR10 Unset the old one and set the new one, later undo. */ require(r->end->halt == FALSE,"should only have one halt at a time"); /* MR10 */ require(MR_RuleBlkWithHalt == NULL || /* MR10 */ (MR_RuleBlkWithHalt->jtype == RuleBlk && MR_RuleBlkWithHalt->end->halt == TRUE), /* MR10 */ "RuleBlkWithHalt->end not RuleBlk or does not have halt set"); /* MR10 */ if (MR_RuleBlkWithHalt != NULL) { /* MR10 */ MR_RuleBlkWithHalt->end->halt=FALSE; /* MR10 */ }; /*** fprintf(stderr,"\nSetting halt on junction #%d\n",r->end->seq); ***/ require(r->end->halt == FALSE,"rule->end->halt already set"); save_MR_RuleBlkWithHalt=MR_RuleBlkWithHalt; /* MR10 */ MR_pointerStackPush(&MR_RuleBlkWithHaltStack,MR_RuleBlkWithHalt); /* MR10 */ MR_pointerStackPush(&MR_PredRuleRefStack,p); r->end->halt = TRUE; /* MR10 */ MR_RuleBlkWithHalt=r; a = find_predicates((Node *)r); require(r->end->halt == TRUE,"rule->end->halt not set"); r->end->halt = FALSE; /* MR10 */ MR_pointerStackPop(&MR_PredRuleRefStack); /* MR10 */ MR_RuleBlkWithHalt=(Junction *) MR_pointerStackPop(&MR_RuleBlkWithHaltStack); require (MR_RuleBlkWithHalt==save_MR_RuleBlkWithHalt, "RuleBlkWithHaltStack not consistent"); /* MR10 */ require(MR_RuleBlkWithHalt == NULL || /* MR10 */ (MR_RuleBlkWithHalt->jtype == RuleBlk && MR_RuleBlkWithHalt->end->halt == FALSE), /* MR10 */ "RuleBlkWithHalt->end not RuleBlk or has no halt set"); /* MR10 */ if (MR_RuleBlkWithHalt != NULL) { /* MR10 */ MR_RuleBlkWithHalt->end->halt=TRUE; /* MR10 */ }; /*** fprintf(stderr,"\nRestoring halt on junction #%d\n",r->end->seq); ***/ if ( a==NULL ) return NULL; /* attempt to compute the "local" FOLLOW just like in normal lookahead * computation if needed */ complete_context_sets(p,a); complete_context_trees(p,a); /* MR10 */ MR_cleanup_pred_trees(a); return a; } case nToken : break; } return NULL; } #ifdef __USE_PROTOS Predicate *MR_find_predicates_and_supp(Node *alt) #else Predicate *MR_find_predicates_and_supp(alt) Node *alt; #endif { Predicate *p; p=find_predicates(alt); p=MR_suppressK(alt,p); return p; } Predicate * #ifdef __USE_PROTOS new_pred( void ) #else new_pred( ) #endif { Predicate *p = (Predicate *) calloc(1,sizeof(Predicate)); /* MR10 */ require(p!=NULL, "new_pred: cannot alloc predicate"); p->scontext[0]=empty; p->scontext[1]=empty; p->completionTree=empty; p->completionSet=empty; p->plainSet=empty; return p; } static void #ifdef __USE_PROTOS complete_context_sets( RuleRefNode *p, Predicate *a ) #else complete_context_sets( p, a ) RuleRefNode *p; Predicate *a; #endif { set rk2, b; int k2; #ifdef DBG_PRED fprintf(stderr, "enter complete_context_sets\n"); #endif for (; a!=NULL; a=a->right) { if ( a->expr == PRED_AND_LIST || a->expr == PRED_OR_LIST ) { complete_context_sets(p,a->down); continue; } rk2 = b = empty; while ( !set_nil(a->completionSet) ) { k2 = set_int(a->completionSet); set_rm(k2, a->completionSet); REACH(p->next, k2, &rk2, b); set_orin(&(a->scontext[1]), b); set_free(b); } set_orin(&(a->completionSet), rk2);/* remember what we couldn't do */ set_free(rk2); #ifdef DBG_PRED fprintf(stderr, "LL(1) context for %s(addr 0x%x) after ruleref:", a->expr, a); s_fprT(stderr, a->scontext[1]); fprintf(stderr, "\n"); #endif /* complete_context_sets(p, a->down);*/ } #ifdef DBG_PRED fprintf(stderr, "exit complete_context_sets\n"); #endif } static void #ifdef __USE_PROTOS complete_context_trees( RuleRefNode *p, Predicate *a ) #else complete_context_trees( p, a ) RuleRefNode *p; Predicate *a; #endif { set rk2; int k2; Tree *u; #ifdef DBG_PRED fprintf(stderr, "enter complete_context_trees\n"); #endif for (; a!=NULL; a=a->right) { if ( a->expr == PRED_AND_LIST || a->expr == PRED_OR_LIST ) { complete_context_trees(p, a->down); continue; } rk2 = empty; /* any k left to do? if so, link onto tree */ while ( !set_nil(a->completionTree) ) { k2 = set_int(a->completionTree); set_rm(k2, a->completionTree); u = NULL; TRAV(p->next, k2, &rk2, u); /* any subtrees missing k2 tokens, add u onto end */ a->tcontext = tlink(a->tcontext, u, k2); Tfree(u); /* MR10 */ } set_orin(&(a->completionTree), rk2);/* remember what we couldn't do */ set_free(rk2); #ifdef DBG_PRED fprintf(stderr, "LL(i<%d) context after ruleref:", LL_k); preorder(a->tcontext); fprintf(stderr, "\n"); #endif /* complete_context_trees(p, a->down);*/ } #ifdef DBG_PRED fprintf(stderr, "exit complete_context_trees\n"); #endif } /* Walk a list of predicates and return the set of all tokens in scontext[1]'s */ set #ifdef __USE_PROTOS covered_set( Predicate *p ) #else covered_set( p ) Predicate *p; #endif { set a; a = empty; for (; p!=NULL; p=p->right) { if ( p->expr == PRED_AND_LIST || p->expr == PRED_OR_LIST ) { set_orin(&a, covered_set(p->down)); continue; } set_orin(&a, p->scontext[1]); set_orin(&a, covered_set(p->down)); } return a; } /* MR10 predicate_free() MR10 Don't free the leaf nodes since they are part of the action node */ #ifdef __USE_PROTOS void predicate_free(Predicate *p) #else void predicate_free(p) Predicate *p; #endif { if (p == NULL) return; predicate_free(p->right); predicate_free(p->down); if (p->cloned || p->source == NULL || p->source->guardpred == NULL || p->expr == PRED_AND_LIST || p->expr == PRED_OR_LIST) { set_free(p->scontext[1]); set_free(p->completionSet); set_free(p->completionTree); set_free(p->plainSet); Tfree(p->tcontext); free( (char *) p); } else { p->right=NULL; p->down=NULL; /* MR13 *** debug */ }; } /* MR10 predicate_dup() */ #ifdef __USE_PROTOS Predicate * predicate_dup_xxx(Predicate *p,int contextToo) #else Predicate * predicate_dup_xxx(p,contextToo) Predicate *p; int contextToo; #endif { Predicate *q; if (p == NULL) return NULL; q=new_pred(); q->down=predicate_dup(p->down); q->right=predicate_dup(p->right); /* don't replicate expr - it is read-only and address comparison is used to look for identical predicates. */ q->expr=p->expr; q->k=p->k; q->source=p->source; q->cloned=1; q->ampersandStyle=p->ampersandStyle; q->inverted=p->inverted; q->predEntry=p->predEntry; q->plainSet=set_dup(p->plainSet); if (contextToo) { q->tcontext=tdup(p->tcontext); q->scontext[0]=set_dup(p->scontext[0]); q->scontext[1]=set_dup(p->scontext[1]); q->completionTree=set_dup(p->completionTree); q->completionSet=set_dup(p->completionSet); }; /* don't need to dup "redundant" */ return q; } #ifdef __USE_PROTOS Predicate * predicate_dup_without_context(Predicate *p) #else Predicate * predicate_dup_without_context(p) Predicate *p; #endif { return predicate_dup_xxx(p,0); } #ifdef __USE_PROTOS Predicate * predicate_dup(Predicate *p) #else Predicate * predicate_dup(p) Predicate *p; #endif { return predicate_dup_xxx(p,1); } gtkwave-3.3.86/contrib/pccts/antlr/antlr.10000664000175000017500000002362213166335473017707 0ustar bybellbybell.TH ANTLR 1 "September 1995" "ANTLR" "PCCTS Manual Pages" .SH NAME antlr \- ANother Tool for Language Recognition .SH SYNTAX .LP \fBantlr\fR [\fIoptions\fR] \fIgrammar_files\fR .SH DESCRIPTION .PP \fIAntlr\fP converts an extended form of context-free grammar into a set of C functions which directly implement an efficient form of deterministic recursive-descent LL(k) parser. Context-free grammars may be augmented with predicates to allow semantics to influence parsing; this allows a form of context-sensitive parsing. Selective backtracking is also available to handle non-LL(k) and even non-LALR(k) constructs. \fIAntlr\fP also produces a definition of a lexer which can be automatically converted into C code for a DFA-based lexer by \fIdlg\fR. Hence, \fIantlr\fR serves a function much like that of \fIyacc\fR, however, it is notably more flexible and is more integrated with a lexer generator (\fIantlr\fR directly generates \fIdlg\fR code, whereas \fIyacc\fR and \fIlex\fR are given independent descriptions). Unlike \fIyacc\fR which accepts LALR(1) grammars, \fIantlr\fR accepts LL(k) grammars in an extended BNF notation \(em which eliminates the need for precedence rules. .PP Like \fIyacc\fR grammars, \fIantlr\fR grammars can use automatically-maintained symbol attribute values referenced as dollar variables. Further, because \fIantlr\fR generates top-down parsers, arbitrary values may be inherited from parent rules (passed like function parameters). \fIAntlr\fP also has a mechanism for creating and manipulating abstract-syntax-trees. .PP There are various other niceties in \fIantlr\fR, including the ability to spread one grammar over multiple files or even multiple grammars in a single file, the ability to generate a version of the grammar with actions stripped out (for documentation purposes), and lots more. .SH OPTIONS .IP "\fB-ck \fIn\fR" Use up to \fIn\fR symbols of lookahead when using compressed (linear approximation) lookahead. This type of lookahead is very cheap to compute and is attempted before full LL(k) lookahead, which is of exponential complexity in the worst case. In general, the compressed lookahead can be much deeper (e.g, \f(CW-ck 10\fP) than the full lookahead (which usually must be less than 4). .IP \fB-CC\fP Generate C++ output from both ANTLR and DLG. .IP \fB-cr\fP Generate a cross-reference for all rules. For each rule, print a list of all other rules that reference it. .IP \fB-e1\fP Ambiguities/errors shown in low detail (default). .IP \fB-e2\fP Ambiguities/errors shown in more detail. .IP \fB-e3\fP Ambiguities/errors shown in excruciating detail. .IP "\fB-fe\fP file" Rename \fBerr.c\fP to file. .IP "\fB-fh\fP file" Rename \fBstdpccts.h\fP header (turns on \fB-gh\fP) to file. .IP "\fB-fl\fP file" Rename lexical output, \fBparser.dlg\fP, to file. .IP "\fB-fm\fP file" Rename file with lexical mode definitions, \fBmode.h\fP, to file. .IP "\fB-fr\fP file" Rename file which remaps globally visible symbols, \fBremap.h\fP, to file. .IP "\fB-ft\fP file" Rename \fBtokens.h\fP to file. .IP \fB-ga\fP Generate ANSI-compatible code (default case). This has not been rigorously tested to be ANSI XJ11 C compliant, but it is close. The normal output of \fIantlr\fP is currently compilable under both K&R, ANSI C, and C++\(emthis option does nothing because \fIantlr\fP generates a bunch of #ifdef's to do the right thing depending on the language. .IP \fB-gc\fP Indicates that \fIantlr\fP should generate no C code, i.e., only perform analysis on the grammar. .IP \fB-gd\fP C code is inserted in each of the \fIantlr\fR generated parsing functions to provide for user-defined handling of a detailed parse trace. The inserted code consists of calls to the user-supplied macros or functions called \fBzzTRACEIN\fR and \fBzzTRACEOUT\fP. The only argument is a \fIchar *\fR pointing to a C-style string which is the grammar rule recognized by the current parsing function. If no definition is given for the trace functions, upon rule entry and exit, a message will be printed indicating that a particular rule as been entered or exited. .IP \fB-ge\fP Generate an error class for each non-terminal. .IP \fB-gh\fP Generate \fBstdpccts.h\fP for non-ANTLR-generated files to include. This file contains all defines needed to describe the type of parser generated by \fIantlr\fP (e.g. how much lookahead is used and whether or not trees are constructed) and contains the \fBheader\fP action specified by the user. .IP \fB-gk\fP Generate parsers that delay lookahead fetches until needed. Without this option, \fIantlr\fP generates parsers which always have \fIk\fP tokens of lookahead available. .IP \fB-gl\fP Generate line info about grammar actions in C parser of the form \fB#\ \fIline\fP\ "\fIfile\fP"\fR which makes error messages from the C/C++ compiler make more sense as they will \*Qpoint\*U into the grammar file not the resulting C file. Debugging is easier as well, because you will step through the grammar not C file. .IP \fB-gs\fR Do not generate sets for token expression lists; instead generate a \fB||\fP-separated sequence of \fBLA(1)==\fItoken_number\fR. The default is to generate sets. .IP \fB-gt\fP Generate code for Abstract-Syntax Trees. .IP \fB-gx\fP Do not create the lexical analyzer files (dlg-related). This option should be given when the user wishes to provide a customized lexical analyzer. It may also be used in \fImake\fR scripts to cause only the parser to be rebuilt when a change not affecting the lexical structure is made to the input grammars. .IP "\fB-k \fIn\fR" Set k of LL(k) to \fIn\fR; i.e. set tokens of look-ahead (default==1). .IP "\fB-o\fP dir Directory where output files should go (default="."). This is very nice for keeping the source directory clear of ANTLR and DLG spawn. .IP \fB-p\fP The complete grammar, collected from all input grammar files and stripped of all comments and embedded actions, is listed to \fBstdout\fP. This is intended to aid in viewing the entire grammar as a whole and to eliminate the need to keep actions concisely stated so that the grammar is easier to read. Hence, it is preferable to embed even complex actions directly in the grammar, rather than to call them as subroutines, since the subroutine call overhead will be saved. .IP \fB-pa\fP This option is the same as \fB-p\fP except that the output is annotated with the first sets determined from grammar analysis. .IP "\fB-prc on\fR Turn on the computation and hoisting of predicate context. .IP "\fB-prc off\fR Turn off the computation and hoisting of predicate context. This option makes 1.10 behave like the 1.06 release with option \fB-pr\fR on. Context computation is off by default. .IP "\fB-rl \fIn\fR Limit the maximum number of tree nodes used by grammar analysis to \fIn\fP. Occasionally, \fIantlr\fP is unable to analyze a grammar submitted by the user. This rare situation can only occur when the grammar is large and the amount of lookahead is greater than one. A nonlinear analysis algorithm is used by PCCTS to handle the general case of LL(k) parsing. The average complexity of analysis, however, is near linear due to some fancy footwork in the implementation which reduces the number of calls to the full LL(k) algorithm. An error message will be displayed, if this limit is reached, which indicates the grammar construct being analyzed when \fIantlr\fP hit a non-linearity. Use this option if \fIantlr\fP seems to go out to lunch and your disk start thrashing; try \fIn\fP=10000 to start. Once the offending construct has been identified, try to remove the ambiguity that \fIantlr\fP was trying to overcome with large lookahead analysis. The introduction of (...)? backtracking blocks eliminates some of these problems\ \(em \fIantlr\fP does not analyze alternatives that begin with (...)? (it simply backtracks, if necessary, at run time). .IP \fB-w1\fR Set low warning level. Do not warn if semantic predicates and/or (...)? blocks are assumed to cover ambiguous alternatives. .IP \fB-w2\fR Ambiguous parsing decisions yield warnings even if semantic predicates or (...)? blocks are used. Warn if predicate context computed and semantic predicates incompletely disambiguate alternative productions. .IP \fB-\fR Read grammar from standard input and generate \fBstdin.c\fP as the parser file. .SH "SPECIAL CONSIDERATIONS" .PP \fIAntlr\fP works... we think. There is no implicit guarantee of anything. We reserve no \fBlegal\fP rights to the software known as the Purdue Compiler Construction Tool Set (PCCTS) \(em PCCTS is in the public domain. An individual or company may do whatever they wish with source code distributed with PCCTS or the code generated by PCCTS, including the incorporation of PCCTS, or its output, into commercial software. We encourage users to develop software with PCCTS. However, we do ask that credit is given to us for developing PCCTS. By "credit", we mean that if you incorporate our source code into one of your programs (commercial product, research project, or otherwise) that you acknowledge this fact somewhere in the documentation, research report, etc... If you like PCCTS and have developed a nice tool with the output, please mention that you developed it using PCCTS. As long as these guidelines are followed, we expect to continue enhancing this system and expect to make other tools available as they are completed. .SH FILES .IP *.c output C parser. .IP *.cpp output C++ parser when C++ mode is used. .IP \fBparser.dlg\fP output \fIdlg\fR lexical analyzer. .IP \fBerr.c\fP token string array, error sets and error support routines. Not used in C++ mode. .IP \fBremap.h\fP file that redefines all globally visible parser symbols. The use of the #parser directive creates this file. Not used in C++ mode. .IP \fBstdpccts.h\fP list of definitions needed by C files, not generated by PCCTS, that reference PCCTS objects. This is not generated by default. Not used in C++ mode. .IP \fBtokens.h\fP output \fI#defines\fR for tokens used and function prototypes for functions generated for rules. .SH "SEE ALSO" .LP dlg(1), pccts(1) gtkwave-3.3.86/contrib/pccts/antlr/build.c0000664000175000017500000004766713166335473017767 0ustar bybellbybell/* * build.c -- functions associated with building syntax diagrams. * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * ANTLR 1.33 * Terence Parr * Parr Research Corporation * with Purdue University and AHPCRC, University of Minnesota * 1989-2001 */ #include #include #include #include "pcctscfg.h" #include "set.h" #include "syn.h" #include "hash.h" #include "generic.h" #include "dlgdef.h" #define SetBlk(g, t, approx, first_set_symbol) { \ ((Junction *)g.left)->jtype = t; \ ((Junction *)g.left)->approx = approx; \ ((Junction *)g.left)->pFirstSetSymbol = first_set_symbol; \ ((Junction *)g.left)->end = (Junction *) g.right; \ ((Junction *)g.right)->jtype = EndBlk;} /* Add the parameter string 'parm' to the parms field of a block-type junction * g.left points to the sentinel node on a block. i.e. g.left->p1 points to * the actual junction with its jtype == some block-type. */ void #ifdef __USE_PROTOS addParm( Node *p, char *parm ) #else addParm( p, parm ) Node *p; char *parm; #endif { char *q = (char *) malloc( strlen(parm) + 1 ); require(p!=NULL, "addParm: NULL object\n"); require(q!=NULL, "addParm: unable to alloc parameter\n"); strcpy(q, parm); if ( p->ntype == nRuleRef ) { ((RuleRefNode *)p)->parms = q; } else if ( p->ntype == nJunction ) { ((Junction *)p)->parm = q; /* only one parameter allowed on subrules */ } else fatal_internal("addParm: invalid node for adding parm"); } /* * Build an action node for the syntax diagram * * buildAction(ACTION) ::= --o-->ACTION-->o-- * * Where o is a junction node. */ Graph #ifdef __USE_PROTOS buildAction( char *action, int file, int line, int is_predicate ) #else buildAction( action, file, line, is_predicate ) char *action; int file; int line; int is_predicate; #endif { Junction *j1, *j2; Graph g; ActionNode *a; require(action!=NULL, "buildAction: invalid action"); j1 = newJunction(); j2 = newJunction(); a = newActionNode(); a->action = (char *) malloc( strlen(action)+1 ); require(a->action!=NULL, "buildAction: cannot alloc space for action\n"); strcpy(a->action, action); j1->p1 = (Node *) a; a->next = (Node *) j2; a->is_predicate = is_predicate; if (is_predicate) { PredEntry *predEntry; char *t; char *key; char *u; int inverted=0; t=key=(char *)calloc(1,strlen(a->action)+1); for (u=a->action; *u != '\0' ; u++) { if (*u != ' ') { if (t==key && *u=='!') { inverted=!inverted; } else { *t++=*u; }; }; }; *t='\0'; predEntry=(PredEntry *)hash_get(Pname,key); a->predEntry=predEntry; if (predEntry != NULL) a->inverted=inverted; } else { /* MR12c */ char *strStart=a->action; /* MR12c */ char *strEnd; /* MR12c */ strEnd=strStart+strlen(strStart)-1; /* MR12c */ for ( ; strEnd >= strStart && isspace(*strEnd); strEnd--) *strEnd=0; /* MR12c */ while (*strStart != '\0' && isspace(*strStart)) strStart++; /* MR12c */ if (ci_strequ(strStart,"nohoist")) { /* MR12c */ a->noHoist=1; /* MR12c */ } } g.left = (Node *) j1; g.right = (Node *) j2; a->file = file; a->line = line; a->rname = CurRule; /* MR10 */ return g; } /* * Build a token node for the syntax diagram * * buildToken(TOKEN) ::= --o-->TOKEN-->o-- * * Where o is a junction node. */ Graph #ifdef __USE_PROTOS buildToken( char *text ) #else buildToken( text ) char *text; #endif { Junction *j1, *j2; Graph g; TokNode *t; require(text!=NULL, "buildToken: invalid token name"); j1 = newJunction(); j2 = newJunction(); t = newTokNode(); t->altstart = CurAltStart; if ( *text == '"' ) {t->label=FALSE; t->token = addTexpr( text );} else {t->label=TRUE; t->token = addTname( text );} j1->p1 = (Node *) t; t->next = (Node *) j2; g.left = (Node *) j1; g.right = (Node *) j2; return g; } /* * Build a wild-card node for the syntax diagram * * buildToken(TOKEN) ::= --o-->'.'-->o-- * * Where o is a junction node. */ Graph #ifdef __USE_PROTOS buildWildCard( char *text ) #else buildWildCard( text ) char *text; #endif { Junction *j1, *j2; Graph g; TokNode *t; TCnode *w; TermEntry *p; require(text!=NULL, "buildWildCard: invalid token name"); j1 = newJunction(); j2 = newJunction(); t = newTokNode(); /* If the ref a wild card, make a token class for it */ if ( Tnum(WildCardString) == 0 ) { w = newTCnode; w->tok = addTname( WildCardString ); set_orel(w->tok, &imag_tokens); set_orel(w->tok, &tokclasses); WildCardToken = w->tok; require((p=(TermEntry *)hash_get(Tname, WildCardString)) != NULL, "hash table mechanism is broken"); p->classname = 1; /* entry is class name, not token */ p->tclass = w; /* save ptr to this tclass def */ list_add(&tclasses, (char *)w); } else { p=(TermEntry *)hash_get(Tname, WildCardString); require( p!= NULL, "hash table mechanism is broken"); w = p->tclass; } t->token = w->tok; t->wild_card = 1; t->tclass = w; t->altstart = CurAltStart; j1->p1 = (Node *) t; t->next = (Node *) j2; g.left = (Node *) j1; g.right = (Node *) j2; return g; } void #ifdef __USE_PROTOS setUpperRange(TokNode *t, char *text) #else setUpperRange(t, text) TokNode *t; char *text; #endif { require(t!=NULL, "setUpperRange: NULL token node"); require(text!=NULL, "setUpperRange: NULL token string"); if ( *text == '"' ) {t->upper_range = addTexpr( text );} else {t->upper_range = addTname( text );} } /* * Build a rule reference node of the syntax diagram * * buildRuleRef(RULE) ::= --o-->RULE-->o-- * * Where o is a junction node. * * If rule 'text' has been defined already, don't alloc new space to store string. * Set r->text to point to old copy in string table. */ Graph #ifdef __USE_PROTOS buildRuleRef( char *text ) #else buildRuleRef( text ) char *text; #endif { Junction *j1, *j2; Graph g; RuleRefNode *r; RuleEntry *p; require(text!=NULL, "buildRuleRef: invalid rule name"); j1 = newJunction(); j2 = newJunction(); r = newRNode(); r->altstart = CurAltStart; r->assign = NULL; if ( (p=(RuleEntry *)hash_get(Rname, text)) != NULL ) r->text = p->str; else r->text = mystrdup( text ); j1->p1 = (Node *) r; r->next = (Node *) j2; g.left = (Node *) j1; g.right = (Node *) j2; return g; } /* * Or two subgraphs into one graph via: * * Or(G1, G2) ::= --o-G1-o-- * | ^ * v | * o-G2-o * * Set the altnum of junction starting G2 to 1 + altnum of junction starting G1. * If, however, the G1 altnum is 0, make it 1 and then * make G2 altnum = G1 altnum + 1. */ Graph #ifdef __USE_PROTOS Or( Graph g1, Graph g2 ) #else Or( g1, g2 ) Graph g1; Graph g2; #endif { Graph g; require(g1.left != NULL, "Or: invalid graph"); require(g2.left != NULL && g2.right != NULL, "Or: invalid graph"); ((Junction *)g1.left)->p2 = g2.left; ((Junction *)g2.right)->p1 = g1.right; /* set altnums */ if ( ((Junction *)g1.left)->altnum == 0 ) ((Junction *)g1.left)->altnum = 1; ((Junction *)g2.left)->altnum = ((Junction *)g1.left)->altnum + 1; g.left = g2.left; g.right = g1.right; return g; } /* * Catenate two subgraphs * * Cat(G1, G2) ::= --o-G1-o-->o-G2-o-- * Cat(NULL,G2)::= --o-G2-o-- * Cat(G1,NULL)::= --o-G1-o-- */ Graph #ifdef __USE_PROTOS Cat( Graph g1, Graph g2 ) #else Cat( g1, g2 ) Graph g1; Graph g2; #endif { Graph g; if ( g1.left == NULL && g1.right == NULL ) return g2; if ( g2.left == NULL && g2.right == NULL ) return g1; ((Junction *)g1.right)->p1 = g2.left; g.left = g1.left; g.right = g2.right; return g; } /* * Make a subgraph an optional block * * makeOpt(G) ::= --o-->o-G-o-->o-- * | ^ * v | * o-------o * * Note that this constructs {A|B|...|Z} as if (A|B|...|Z|) was found. * * The node on the far right is added so that every block owns its own * EndBlk node. */ Graph #ifdef __USE_PROTOS makeOpt( Graph g1, int approx, char * pFirstSetSymbol ) #else makeOpt( g1, approx, pFirstSetSymbol ) Graph g1; int approx; char * pFirstSetSymbol; #endif { Junction *j1,*j2,*p; Graph g; require(g1.left != NULL && g1.right != NULL, "makeOpt: invalid graph"); j1 = newJunction(); j2 = newJunction(); ((Junction *)g1.right)->p1 = (Node *) j2; /* add node to G at end */ /* MR21 * * There is code in genBlk which recognizes the node created * by emptyAlt() as a special case and bypasses it. We don't * want this to happen for the optBlk. */ g = emptyAlt3(); /* MR21 */ if ( ((Junction *)g1.left)->altnum == 0 ) ((Junction *)g1.left)->altnum = 1; ((Junction *)g.left)->altnum = ((Junction *)g1.left)->altnum + 1; for(p=(Junction *)g1.left; p->p2!=NULL; p=(Junction *)p->p2) {;} /* find last alt */ p->p2 = g.left; /* add optional alternative */ ((Junction *)g.right)->p1 = (Node *)j2; /* opt alt points to EndBlk */ g1.right = (Node *)j2; SetBlk(g1, aOptBlk, approx, pFirstSetSymbol); j1->p1 = g1.left; /* add generic node in front */ g.left = (Node *) j1; g.right = g1.right; return g; } /* * Make a graph into subblock * * makeBlk(G) ::= --o-->o-G-o-->o-- * * The node on the far right is added so that every block owns its own * EndBlk node. */ Graph #ifdef __USE_PROTOS makeBlk( Graph g1, int approx, char * pFirstSetSymbol ) #else makeBlk( g1, approx, pFirstSetSymbol ) Graph g1; int approx; char * pFirstSetSymbol; #endif { Junction *j,*j2; Graph g; require(g1.left != NULL && g1.right != NULL, "makeBlk: invalid graph"); j = newJunction(); j2 = newJunction(); ((Junction *)g1.right)->p1 = (Node *) j2; /* add node to G at end */ g1.right = (Node *)j2; SetBlk(g1, aSubBlk, approx, pFirstSetSymbol); j->p1 = g1.left; /* add node in front */ g.left = (Node *) j; g.right = g1.right; return g; } /* * Make a subgraph into a loop (closure) block -- (...)* * * makeLoop(G) ::= |---| * v | * --o-->o-->o-G-o-->o-- * | ^ * v | * o-----------o * * After making loop, always place generic node out front. It becomes * the start of enclosing block. The aLoopBlk is the target of the loop. * * Loop blks have TWO EndBlk nodes--the far right and the node that loops back * to the aLoopBlk node. Node with which we can branch past loop == aLoopBegin and * one which is loop target == aLoopBlk. * The branch-past (initial) aLoopBegin node has end * pointing to the last EndBlk node. The loop-target node has end==NULL. * * Loop blocks have a set of locks (from 1..CLL_k) on the aLoopBlk node. */ Graph #ifdef __USE_PROTOS makeLoop( Graph g1, int approx, char * pFirstSetSymbol ) #else makeLoop( g1, approx, pFirstSetSymbol) Graph g1; int approx; char * pFirstSetSymbol; #endif { Junction *back, *front, *begin; Graph g; require(g1.left != NULL && g1.right != NULL, "makeLoop: invalid graph"); back = newJunction(); front = newJunction(); begin = newJunction(); g = emptyAlt3(); ((Junction *)g1.right)->p2 = g1.left; /* add loop branch to G */ ((Junction *)g1.right)->p1 = (Node *) back; /* add node to G at end */ ((Junction *)g1.right)->jtype = EndBlk; /* mark 1st EndBlk node */ ((Junction *)g1.left)->jtype = aLoopBlk; /* mark 2nd aLoopBlk node */ ((Junction *)g1.left)->end = (Junction *) g1.right; ((Junction *)g1.left)->lock = makelocks(); ((Junction *)g1.left)->pred_lock = makelocks(); g1.right = (Node *) back; begin->p1 = (Node *) g1.left; g1.left = (Node *) begin; begin->p2 = (Node *) g.left; /* make bypass arc */ ((Junction *)g.right)->p1 = (Node *) back; SetBlk(g1, aLoopBegin, approx, pFirstSetSymbol); front->p1 = g1.left; /* add node to front */ g1.left = (Node *) front; return g1; } /* * Make a subgraph into a plus block -- (...)+ -- 1 or more times * * makePlus(G) ::= |---| * v | * --o-->o-G-o-->o-- * * After making loop, always place generic node out front. It becomes * the start of enclosing block. The aPlusBlk is the target of the loop. * * Plus blks have TWO EndBlk nodes--the far right and the node that loops back * to the aPlusBlk node. * * Plus blocks have a set of locks (from 1..CLL_k) on the aPlusBlk node. */ Graph #ifdef __USE_PROTOS makePlus( Graph g1, int approx, char * pFirstSetSymbol) #else makePlus( g1, approx, pFirstSetSymbol) Graph g1; int approx; char * pFirstSetSymbol; #endif { int has_empty_alt_already = 0; Graph g; Junction *j2, *j3, *first_alt; Junction *last_alt=NULL, *p; require(g1.left != NULL && g1.right != NULL, "makePlus: invalid graph"); first_alt = (Junction *)g1.left; j2 = newJunction(); j3 = newJunction(); if ( ((Junction *)g1.left)->altnum == 0 ) ((Junction *)g1.left)->altnum = 1; ((Junction *)g1.right)->p2 = g1.left; /* add loop branch to G */ ((Junction *)g1.right)->p1 = (Node *) j2; /* add node to G at end */ ((Junction *)g1.right)->jtype = EndBlk; /* mark 1st EndBlk node */ g1.right = (Node *) j2; SetBlk(g1, aPlusBlk, approx, pFirstSetSymbol); ((Junction *)g1.left)->lock = makelocks(); ((Junction *)g1.left)->pred_lock = makelocks(); j3->p1 = g1.left; /* add node to front */ g1.left = (Node *) j3; /* add an optional branch which is the "exit" branch of loop */ /* FIRST, check to ensure that there does not already exist * an optional path. */ /* find last alt */ for(p=first_alt; p!=NULL; p=(Junction *)p->p2) { if ( p->p1->ntype == nJunction && p->p1!=NULL && ((Junction *)p->p1)->jtype==Generic && ((Junction *)p->p1)->p1!=NULL && ((Junction *)((Junction *)p->p1)->p1)->jtype==EndBlk ) { has_empty_alt_already = 1; } last_alt = p; } if ( !has_empty_alt_already ) { require(last_alt!=NULL, "last_alt==NULL; bad (..)+"); g = emptyAlt(); last_alt->p2 = g.left; ((Junction *)g.right)->p1 = (Node *) j2; /* make sure lookahead computation ignores this alt for * FIRST("(..)+"); but it's still used for computing the FIRST * of each alternative. */ ((Junction *)g.left)->ignore = 1; } return g1; } /* * Return an optional path: --o-->o-- */ Graph #ifdef __USE_PROTOS emptyAlt( void ) #else emptyAlt( ) #endif { Junction *j1, *j2; Graph g; j1 = newJunction(); j2 = newJunction(); j1->p1 = (Node *) j2; g.left = (Node *) j1; g.right = (Node *) j2; return g; } /* MR21 * * There is code in genBlk which recognizes the node created * by emptyAlt() as a special case and bypasses it. We don't * want this to happen for the optBlk. */ Graph #ifdef __USE_PROTOS emptyAlt3( void ) #else emptyAlt3( ) #endif { Junction *j1, *j2, *j3; Graph g; j1 = newJunction(); j2 = newJunction(); j3 = newJunction(); j1->p1 = (Node *) j2; j2->p1 = (Node *) j3; g.left = (Node *) j1; g.right = (Node *) j3; return g; } /* N o d e A l l o c a t i o n */ TokNode * #ifdef __USE_PROTOS newTokNode( void ) #else newTokNode( ) #endif { static TokNode *FreeList = NULL; TokNode *p, *newblk; if ( FreeList == NULL ) { newblk = (TokNode *)calloc(TokenBlockAllocSize, sizeof(TokNode)); if ( newblk == NULL ) fatal_internal(eMsg1("out of memory while building rule '%s'",CurRule)); for (p=newblk; p<&(newblk[TokenBlockAllocSize]); p++) { p->next = (Node *)FreeList; /* add all new token nodes to FreeList */ FreeList = p; } } p = FreeList; FreeList = (TokNode *)FreeList->next;/* remove a TokNode node */ p->next = NULL; /* NULL the ptr we used */ memset( (char *) p, 0, sizeof(TokNode)); /* MR10 */ p->ntype = nToken; p->rname = CurRule; p->file = CurFile; p->line = zzline; p->altstart = NULL; return p; } RuleRefNode * #ifdef __USE_PROTOS newRNode( void ) #else newRNode( ) #endif { static RuleRefNode *FreeList = NULL; RuleRefNode *p, *newblk; if ( FreeList == NULL ) { newblk = (RuleRefNode *)calloc(RRefBlockAllocSize, sizeof(RuleRefNode)); if ( newblk == NULL ) fatal_internal(eMsg1("out of memory while building rule '%s'",CurRule)); for (p=newblk; p<&(newblk[RRefBlockAllocSize]); p++) { p->next = (Node *)FreeList; /* add all new rref nodes to FreeList */ FreeList = p; } } p = FreeList; FreeList = (RuleRefNode *)FreeList->next;/* remove a Junction node */ p->next = NULL; /* NULL the ptr we used */ memset( (char *) p, 0, sizeof(RuleRefNode)); /* MR10 */ p->ntype = nRuleRef; p->rname = CurRule; p->file = CurFile; p->line = zzline; p->astnode = ASTinclude; p->altstart = NULL; return p; } static int junctionSeqNumber=0; /* MR10 */ Junction * #ifdef __USE_PROTOS newJunction( void ) #else newJunction( ) #endif { static Junction *FreeList = NULL; Junction *p, *newblk; if ( FreeList == NULL ) { newblk = (Junction *)calloc(JunctionBlockAllocSize, sizeof(Junction)); if ( newblk == NULL ) fatal_internal(eMsg1("out of memory while building rule '%s'",CurRule)); for (p=newblk; p<&(newblk[JunctionBlockAllocSize]); p++) { p->p1 = (Node *)FreeList; /* add all new Junction nodes to FreeList */ FreeList = p; } } p = FreeList; FreeList = (Junction *)FreeList->p1;/* remove a Junction node */ p->p1 = NULL; /* NULL the ptr we used */ memset( (char *) p, 0, sizeof(Junction)); /* MR10 */ p->ntype = nJunction; p->visited = 0; p->jtype = Generic; p->rname = CurRule; p->file = CurFile; p->line = zzline; p->exception_label = NULL; p->fset = (set *) calloc(CLL_k+1, sizeof(set)); require(p->fset!=NULL, "cannot allocate fset in newJunction"); p->seq=++junctionSeqNumber; /* MR10 */ return p; } ActionNode * #ifdef __USE_PROTOS newActionNode( void ) #else newActionNode( ) #endif { static ActionNode *FreeList = NULL; ActionNode *p, *newblk; if ( FreeList == NULL ) { newblk = (ActionNode *)calloc(ActionBlockAllocSize, sizeof(ActionNode)); if ( newblk == NULL ) fatal_internal(eMsg1("out of memory while building rule '%s'",CurRule)); for (p=newblk; p<&(newblk[ActionBlockAllocSize]); p++) { p->next = (Node *)FreeList; /* add all new Action nodes to FreeList */ FreeList = p; } } p = FreeList; FreeList = (ActionNode *)FreeList->next;/* remove an Action node */ memset( (char *) p, 0, sizeof(ActionNode)); /* MR10 */ p->ntype = nAction; p->next = NULL; /* NULL the ptr we used */ p->done = 0; p->pred_fail = NULL; p->guardpred = NULL; p->ampersandPred = NULL; return p; } /* * allocate the array of locks (1..CLL_k) used to inhibit infinite recursion. * Infinite recursion can occur in (..)* blocks, FIRST calcs and FOLLOW calcs. * Therefore, we need locks on aLoopBlk, RuleBlk, EndRule nodes. * * if ( lock[k]==TRUE ) then we have been here before looking for k tokens * of lookahead. */ char * #ifdef __USE_PROTOS makelocks( void ) #else makelocks( ) #endif { char *p = (char *) calloc(CLL_k+1, sizeof(char)); require(p!=NULL, "cannot allocate lock array"); return p; } #if 0 ** #ifdef __USE_PROTOS ** void my_memset(char *p,char value,int count) ** #else ** void my_memset(p,value,count) ** char *p; ** char value; ** int count; ** #endif ** { ** int i; ** ** for (i=0; i1 EXPERIMENTAL Maintenance" " Release style hoisting." }, /* [6] */ NotDependent { }, CheckOption { NotSet, {116, 25, 131, 363}, "Compute context for hoisted predicates", "-prc on", "Turn on/off computation of context for h" "oisted predicates." }, /* [7] */ NotDependent { }, RegularEntry { "Ambiguity aid:", {140, 27, 155, 125}, {141, 135, 155, 209}, "", keepCase, "-aa", "Ambiguity aid for a rule (rule name or l" "ine number)." }, /* [8] */ NotDependent { }, RegularEntry { "Limits exp growth:", {140, 236, 155, 361}, {139, 372, 155, 452}, "", keepCase, "-aad", "Limits exp growth of -aa listing - defau" "lt=1 (max=ck value)." }, /* [9] */ NotDependent { }, CheckOption { NotSet, {164, 26, 179, 366}, "Lookahead token may appear multiple time" "s", "-aam", "Lookahead token may appear multiple time" "s in -aa listing." } } } }; gtkwave-3.3.86/contrib/pccts/antlr/fset.c0000664000175000017500000015064113166335473017614 0ustar bybellbybell/* * fset.c * * Compute FIRST and FOLLOW sets. * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * ANTLR 1.33 * Terence Parr * Parr Research Corporation * with Purdue University and AHPCRC, University of Minnesota * 1989-2001 */ #include #include #include "pcctscfg.h" #include "set.h" #include "syn.h" #include "hash.h" #include "generic.h" #include "dlgdef.h" #include "limits.h" #ifdef __USE_PROTOS static void ensure_predicates_cover_ambiguous_lookahead_sequences (Junction *, Junction *, char *, Tree *); #else static void ensure_predicates_cover_ambiguous_lookahead_sequences(); #endif /* * What tokens are k tokens away from junction q? * * Follow both p1 and p2 paths (unless RuleBlk) to collect the tokens k away from this * node. * We lock the junction according to k--the lookahead. If we have been at this * junction before looking for the same, k, number of lookahead tokens, we will * do it again and again...until we blow up the stack. Locks are only used on aLoopBlk, * RuleBlk, aPlusBlk and EndRule junctions to remove/detect infinite recursion from * FIRST and FOLLOW calcs. * * If p->jtype == EndRule we are going to attempt a FOLLOW. (FOLLOWs are really defined * in terms of FIRST's, however). To proceed with the FOLLOW, p->halt cannot be * set. p->halt is set to indicate that a reference to the current rule is in progress * and the FOLLOW is not desirable. * * If we attempt a FOLLOW and find that there is no FOLLOW or REACHing beyond the EndRule * junction yields an empty set, replace the empty set with EOF. No FOLLOW means that * only EOF can follow the current rule. This normally occurs only on the start symbol * since all other rules are referenced by another rule somewhere. * * Normally, both p1 and p2 are followed. However, checking p2 on a RuleBlk node is * the same as checking the next rule which is clearly incorrect. * * Cycles in the FOLLOW sense are possible. e.g. Fo(c) requires Fo(b) which requires * Fo(c). Both Fo(b) and Fo(c) are defined to be Fo(b) union Fo(c). Let's say * Fo(c) is attempted first. It finds all of the FOLLOW symbols and then attempts * to do Fo(b) which finds of its FOLLOW symbols. So, we have: * * Fo(c) * / \ * a set Fo(b) * / \ * a set Fo(c) .....Hmmmm..... Infinite recursion! * * The 2nd Fo(c) is not attempted and Fo(b) is left deficient, but Fo(c) is now * correctly Fo(c) union Fo(b). We wish to pick up where we left off, so the fact * that Fo(b) terminated early means that we lack Fo(c) in the Fo(b) set already * laying around. SOOOOoooo, we track FOLLOW cycles. All FOLLOW computations are * cached in a hash table. After the sequence of FOLLOWs finish, we reconcile all * cycles --> correct all Fo(rule) sets in the cache. * * Confused? Good! Read my MS thesis [Purdue Technical Report TR90-30]. * TJP 8/93 -- can now read PhD thesis from Purdue. * * Also, FIRST sets are cached in the hash table. Keys are (rulename,Fi/Fo,k). * Only FIRST sets, for which the FOLLOW is not included, are stored. * * SPECIAL CASE of (...)+ blocks: * I added an optional alt so that the alts could see what * was behind the (...)+ block--thus using enough lookahead * to branch out rather than just enough to distinguish * between alts in the (...)+. However, when the FIRST("(...)+") is * is needed, must not use this last "optional" alt. This routine * turns off this path by setting a new 'ignore' flag for * the alt and then resetting it afterwards. */ set #ifdef __USE_PROTOS rJunc( Junction *p, int k, set *rk ) #else rJunc( p, k, rk ) Junction *p; int k; set *rk; #endif { set a, b; require(p!=NULL, "rJunc: NULL node"); require(p->ntype==nJunction, "rJunc: not junction"); #ifdef DBG_LL1 if ( p->jtype == RuleBlk ) fprintf(stderr, "FIRST(%s,%d) \n",((Junction *)p)->rname,k); else fprintf(stderr, "rJunc: %s in rule %s\n", decodeJType[p->jtype], ((Junction *)p)->rname); #endif /* if this is one of the added optional alts for (...)+ then return */ /* no need to pop backtrace - hasn't been pushed */ if ( p->ignore ) return empty; if (MR_MaintainBackTrace) MR_pointerStackPush(&MR_BackTraceStack,p); /* MR14 */ if (AlphaBetaTrace && p->alpha_beta_guess_end) { /* MR14 */ warnFL( /* MR14 */ "not possible to compute follow set for alpha in an \"(alpha)? beta\" block. ", /* MR14 */ FileStr[p->file],p->line); /* MR14 */ MR_alphaBetaTraceReport(); /* MR14 */ }; /* MR14 */ if (p->alpha_beta_guess_end) { /* MR14 */ if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack); /* MR14 */ return empty; /* MR14 */ } /* locks are valid for aLoopBlk,aPlusBlk,RuleBlk,EndRule junctions only */ if ( p->jtype==aLoopBlk || p->jtype==RuleBlk || p->jtype==aPlusBlk || p->jtype==EndRule ) { require(p->lock!=NULL, "rJunc: lock array is NULL"); if ( p->lock[k] ) { if ( p->jtype == EndRule ) /* FOLLOW cycle? */ { #ifdef DBG_LL1 fprintf(stderr, "FOLLOW cycle to %s: panic!\n", p->rname); #endif if (! MR_AmbSourceSearch) RegisterCycle(p->rname, k); } if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack); return empty; } if ( p->jtype == RuleBlk && p->end->halt && ! MR_AmbSourceSearch) /* check for FIRST cache */ { CacheEntry *q = (CacheEntry *) hash_get(Fcache, Fkey(p->rname,'i',k)); if ( q != NULL ) { set_orin(rk, q->rk); if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack); return set_dup( q->fset ); } } if ( p->jtype == EndRule && !p->halt && /* MR11 was using cache even when halt set */ ! MR_AmbSourceSearch) /* FOLLOW set cached already? */ { CacheEntry *q = (CacheEntry *) hash_get(Fcache, Fkey(p->rname,'o',k)); if ( q != NULL ) { #ifdef DBG_LL1 fprintf(stderr, "cache for FOLLOW(%s,%d):", p->rname,k); s_fprT(stderr, q->fset); if ( q->incomplete ) fprintf(stderr, " (incomplete)"); fprintf(stderr, "\n"); #endif if ( !q->incomplete ) { if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack); return set_dup( q->fset ); } } } p->lock[k] = TRUE; /* This rule is busy */ } a = b = empty; if ( p->jtype == EndRule ) { if (p->halt ) /* don't want FOLLOW here? */ /* unless MR10 hoisting */ { p->lock[k] = FALSE; set_orel(k, rk); /* indicate this k value needed */ if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack); return empty; } if (! MR_AmbSourceSearch) FoPush(p->rname, k); /* Attempting FOLLOW */ if ( p->p1 == NULL ) set_orel((TokenInd!=NULL?TokenInd[EofToken]:EofToken), &a);/* if no FOLLOW assume EOF */ #ifdef DBG_LL1 fprintf(stderr, "-->FOLLOW(%s,%d)\n", p->rname,k); #endif } if ( p->p1 != NULL ) { /* MR14 */ if (p->guess) { /* MR14 */ if (p->guess_analysis_point == NULL) { /* MR14 */ Node * guess_point; /* MR14 */ guess_point=(Node *)analysis_point(p); /* MR14 */ if (guess_point == (Node *)p) { /* MR14 */ guess_point=p->p1; /* MR14 */ } /* MR14 */ p->guess_analysis_point=guess_point; /* MR14 */ } /* MR14 */ REACH(p->guess_analysis_point, k, rk, a); } else { REACH(p->p1, k, rk, a); } } /* C a c h e R e s u l t s */ if ( p->jtype == RuleBlk && p->end->halt && ! MR_AmbSourceSearch) /* can save FIRST set? */ { CacheEntry *q = newCacheEntry( Fkey(p->rname,'i',k) ); /*fprintf(stderr, "Caching %s FIRST %d\n", p->rname, k);*/ hash_add(Fcache, Fkey(p->rname,'i',k), (Entry *)q); q->fset = set_dup( a ); q->rk = set_dup( *rk ); } if ( p->jtype == EndRule && !p->halt && /* MR11 was using cache even with halt set */ ! MR_AmbSourceSearch) /* just completed FOLLOW? */ { /* Cache Follow set */ CacheEntry *q = (CacheEntry *) hash_get(Fcache, Fkey(p->rname,'o',k)); if ( q==NULL ) { q = newCacheEntry( Fkey(p->rname,'o',k) ); hash_add(Fcache, Fkey(p->rname,'o',k), (Entry *)q); } /*fprintf(stderr, "Caching %s FOLLOW %d\n", p->rname, k);*/ if ( set_nil(a) && !q->incomplete ) { /* Don't ever save a nil set as complete. * Turn it into an eof set. */ set_orel(EofToken, &a); } set_orin(&(q->fset), a); FoPop( k ); if ( FoTOS[k] == NULL && Cycles[k] != NULL ) ResolveFoCycles(k); #ifdef DBG_LL1 fprintf(stderr, "saving FOLLOW(%s,%d):", p->rname, k); s_fprT(stderr, q->fset); if ( q->incomplete ) fprintf(stderr, " (incomplete)"); fprintf(stderr, "\n"); #endif } if (p->jtype != RuleBlk && p->p2 != NULL && /* MR14 */ ! p->guess) { REACH(p->p2, k, rk, b); } if ( p->jtype==aLoopBlk || p->jtype==RuleBlk || p->jtype==aPlusBlk || p->jtype==EndRule ) p->lock[k] = FALSE; /* unlock node */ set_orin(&a, b); set_free(b); if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack); return a; } set #ifdef __USE_PROTOS rRuleRef( RuleRefNode *p, int k, set *rk_out ) #else rRuleRef( p, k, rk_out ) RuleRefNode *p; int k; set *rk_out; #endif { set rk; Junction *r; int k2; set a, rk2, b; int save_halt; RuleEntry *q = (RuleEntry *) hash_get(Rname, p->text); require(p!=NULL, "rRuleRef: NULL node"); require(p->ntype==nRuleRef, "rRuleRef: not rule ref"); #ifdef DBG_LL1 fprintf(stderr, "rRuleRef: %s\n", p->text); #endif if (MR_MaintainBackTrace) MR_pointerStackPush(&MR_BackTraceStack,p); if ( q == NULL ) { warnFL( eMsg1("rule %s not defined",p->text), FileStr[p->file], p->line ); REACH(p->next, k, rk_out, a); if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack); return a; } rk2 = empty; /* MR9 Problems with rule references in guarded predicates */ /* MR9 Perhaps can use hash table to find rule ? */ /* MR9 */ if (RulePtr == NULL) { /* MR9 */ fatalFL(eMsg2("Rule %s uses rule %s via RulePtr before it has been initialized", /* MR9 */ p->rname,q->str),FileStr[p->file],p->line); /* MR9 */ }; r = RulePtr[q->rulenum]; if ( r->lock[k] ) { errNoFL( eMsg2("infinite left-recursion to rule %s from rule %s", r->rname, p->rname) ); if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack); return empty; } save_halt = r->end->halt; r->end->halt = TRUE; /* don't let reach fall off end of rule here */ rk = empty; REACH(r, k, &rk, a); r->end->halt = save_halt; while ( !set_nil(rk) ) { k2 = set_int(rk); /* MR11 this messes up the ambiguity search routine */ set_rm(k2, rk); REACH(p->next, k2, &rk2, b); /* MR11 by changing the value of k */ set_orin(&a, b); set_free(b); } set_free(rk); /* this has no members, but free it's memory */ set_orin(rk_out, rk2); /* remember what we couldn't do */ set_free(rk2); if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack); return a; } /* * Return FIRST sub k ( token_node ) * * TJP 10/11/93 modified this so that token nodes that are actually * ranges (T1..T2) work. */ set #ifdef __USE_PROTOS rToken( TokNode *p, int k, set *rk ) #else rToken( p, k, rk ) TokNode *p; int k; set *rk; #endif { set a; require(p!=NULL, "rToken: NULL node"); require(p->ntype==nToken, "rToken: not token node"); #ifdef DBG_LL1 fprintf(stderr, "rToken: %s\n", (TokenString(p->token)!=NULL)?TokenString(p->token): ExprString(p->token)); #endif if (MR_MaintainBackTrace) MR_pointerStackPush(&MR_BackTraceStack,p); if (MR_AmbSourceSearch && (k-1) == 0) { set localConstrain; set intersection; localConstrain=fset[maxk-k+1]; if (! set_nil(p->tset)) { intersection=set_and(localConstrain,p->tset); if (! set_nil(intersection)) { MR_backTraceReport(); }; set_free(intersection); } else { if (set_el( (unsigned) p->token,localConstrain)) { MR_backTraceReport(); } }; }; if ( k-1 == 0 ) { if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack); if ( !set_nil(p->tset) ) { return set_dup(p->tset); } else { return set_of(p->token); }; } REACH(p->next, k-1, rk, a); if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack); return a; } set #ifdef __USE_PROTOS rAction( ActionNode *p, int k, set *rk ) #else rAction( p, k, rk ) ActionNode *p; int k; set *rk; #endif { set a; require(p!=NULL, "rJunc: NULL node"); require(p->ntype==nAction, "rJunc: not action"); /* MR11 */ if (p->is_predicate && p->ampersandPred != NULL) { /* MR11 */ Predicate *pred=p->ampersandPred; /* MR11 */ if (k <= pred->k) { /* MR11 */ REACH(p->guardNodes,k,rk,a); /* MR11 */ return a; /* MR11 */ }; /* MR11 */ }; /* it might be a good idea when doing an MR_AmbSourceSearch to *not* look behind predicates under some circumstances we'll look into that later */ REACH(p->next, k, rk, a); /* ignore actions */ return a; } /* A m b i g u i t y R e s o l u t i o n */ void #ifdef __USE_PROTOS dumpAmbigMsg( set *fset, FILE *f, int want_nls ) #else dumpAmbigMsg( fset, f, want_nls ) set *fset; FILE *f; int want_nls; #endif { int i; set copy; /* MR11 */ if ( want_nls ) fprintf(f, "\n\t"); else fprintf(f, " "); for (i=1; i<=CLL_k; i++) { copy=set_dup(fset[i]); /* MR11 */ if ( i>1 ) { if ( !want_nls ) fprintf(f, ", "); } if ( set_deg(copy) > 3 && elevel == 1 ) { int e,m; fprintf(f, "{"); for (m=1; m<=3; m++) { e=set_int(copy); fprintf(f, " %s", TerminalString(e)); set_rm(e, copy); } fprintf(f, " ... }"); } else s_fprT(f, copy); if ( want_nls ) fprintf(f, "\n\t"); set_free(copy); } fprintf(f, "\n"); } static void #ifdef __USE_PROTOS verify_context(Predicate *predicate) #else verify_context(predicate) Predicate *predicate; #endif { if ( predicate == NULL ) return; if ( predicate->expr == PRED_OR_LIST || predicate->expr == PRED_AND_LIST ) { verify_context(predicate->down); verify_context(predicate->right); /* MR10 */ return; } if ( !predicate->source->ctxwarned && predicate->source->guardpred==NULL && ((predicate->k > 1 && !is_single_tuple(predicate->tcontext)) || ( predicate->k == 1 && set_deg(predicate->scontext[1])>1 )) ) { /* MR9 Suppress annoying messages caused by our own clever(?) fix */ fprintf(stderr, ErrHdr, FileStr[predicate->source->file], predicate->source->line); fprintf(stderr, " warning: predicate applied for >1 lookahead %d-sequences\n", predicate->k); fprintf(stderr, ErrHdr, FileStr[predicate->source->file], predicate->source->line); fprintf(stderr, " predicate text: \"%s\"\n", (predicate->expr == NULL ? "(null)" : predicate->expr) ); fprintf(stderr, ErrHdr, FileStr[predicate->source->file], predicate->source->line); fprintf(stderr, " You may only want one lookahead %d-sequence to apply\n", predicate->k); fprintf(stderr, ErrHdr, FileStr[predicate->source->file], predicate->source->line); fprintf(stderr, " Try using a context guard '(...)? =>'\n"); predicate->source->ctxwarned = 1; } verify_context(predicate->right); /* MR10 */ } /* * If delta is the set of ambiguous lookahead sequences, then make sure that * the predicate(s) for productions alt1,alt2 cover the sequences in delta. * * For example, * a : <>? (A B|A C) * | b * ; * b : <>? A B * | A C * ; * * This should give a warning that (A C) predicts both productions and alt2 * does not have a predicate in the production that generates (A C). * * The warning detection is simple. Let delta = LOOK(alt1) intersection LOOK(alt2). * Now, if ( delta set-difference context(predicates-for-alt1) != empty then * alt1 does not "cover" all ambiguous sequences. * * If ambig is nonempty, then ambig in LL(k) sense -> use tree info; else use fset * info. Actually, sets are used only if k=1 for this grammar. */ static void #ifdef __USE_PROTOS ensure_predicates_cover_ambiguous_lookahead_sequences ( Junction *alt1, Junction *alt2, char *sub, Tree *ambig ) #else ensure_predicates_cover_ambiguous_lookahead_sequences( alt1, alt2, sub, ambig ) Junction *alt1; Junction *alt2; char *sub; Tree *ambig; #endif { if ( !ParseWithPredicates ) return; if ( ambig!=NULL ) { Tree *non_covered = NULL; if ( alt1->predicate!=NULL ) non_covered = tdif(ambig, alt1->predicate, alt1->fset, alt2->fset); if ( (non_covered!=NULL || alt1->predicate==NULL) && WarningLevel>1 ) { fprintf(stderr, ErrHdr, FileStr[alt1->file], alt1->line); fprintf(stderr, " warning: alt %d %shas no predicate to resolve ambiguity", alt1->altnum, sub); if ( alt1->predicate!=NULL && non_covered!=NULL ) { fprintf(stderr, " upon"); preorder(non_covered); } else if ( alt1->predicate==NULL ) { fprintf(stderr, " upon"); preorder(ambig->down); } fprintf(stderr, "\n"); } Tfree(non_covered); non_covered = NULL; if ( alt2->predicate!=NULL ) non_covered = tdif(ambig, alt2->predicate, alt1->fset, alt2->fset); if ( (non_covered!=NULL || alt2->predicate==NULL) && WarningLevel>1 ) { fprintf(stderr, ErrHdr, FileStr[alt2->file], alt2->line); fprintf(stderr, " warning: alt %d %shas no predicate to resolve ambiguity", alt2->altnum, sub); if ( alt2->predicate!=NULL && non_covered!=NULL ) { fprintf(stderr, " upon"); preorder(non_covered); } else if ( alt2->predicate==NULL ) { fprintf(stderr, " upon"); preorder(ambig->down); } fprintf(stderr, "\n"); } Tfree(non_covered); } else if ( !set_nil(alt1->fset[1]) ) { set delta, non_covered; delta = set_and(alt1->fset[1], alt2->fset[1]); non_covered = set_dif(delta, covered_set(alt1->predicate)); if ( set_deg(non_covered)>0 && WarningLevel>1 ) { fprintf(stderr, ErrHdr, FileStr[alt1->file], alt1->line); fprintf(stderr, " warning: alt %d %shas no predicate to resolve ambiguity", alt1->altnum, sub); if ( alt1->predicate!=NULL ) { fprintf(stderr, " upon "); s_fprT(stderr, non_covered); } fprintf(stderr, "\n"); } set_free( non_covered ); non_covered = set_dif(delta, covered_set(alt2->predicate)); if ( set_deg(non_covered)>0 && WarningLevel>1 ) { fprintf(stderr, ErrHdr, FileStr[alt2->file], alt2->line); fprintf(stderr, " warning: alt %d %shas no predicate to resolve ambiguity", alt2->altnum, sub); if ( alt2->predicate!=NULL ) { fprintf(stderr, " upon "); s_fprT(stderr, non_covered); } fprintf(stderr, "\n"); } set_free( non_covered ); set_free( delta ); } else fatal_internal("productions have no lookahead in predicate checking routine"); } #ifdef __USE_PROTOS void MR_doPredicatesHelp(int inGuessBlock,Junction *alt1,Junction *alt2,int jtype,char *sub) #else void MR_doPredicatesHelp(inGuessBlock,alt1,alt2,jtype,sub) int inGuessBlock; Junction *alt1; Junction *alt2; int jtype; char *sub; #endif { Predicate *p1; Predicate *p2; Junction *parentRule=MR_nameToRuleBlk(alt1->rname); if (inGuessBlock && WarningLevel <= 1) return; /* let antlr give the usual error message */ if (alt1->predicate == NULL && alt2->predicate == NULL) return; if ( (jtype == RuleBlk || jtype == aSubBlk) && (alt1->predicate == NULL && alt2->predicate != NULL)) { fprintf(stderr, ErrHdr, FileStr[parentRule->file],parentRule->line); fprintf(stderr," warning: alt %d line %d and alt %d line %d of %s\n%s%s%s", alt1->altnum, alt1->line, alt2->altnum, alt2->line, sub, " These alts have ambig lookahead sequences resolved by a predicate for\n", " the second choice. The second choice may not be reachable.\n", " You may want to use a complementary predicate or rearrange the alts\n" ); return; }; /* first do the easy comparison. then do the hard one */ if (MR_comparePredicates(alt1->predicate,alt2->predicate)) { if (jtype == aLoopBegin || jtype == aPlusBlk ) { /* I'm not sure this code is reachable. Predicates following a (...)+ or (...)* block are probably considered validation predicates and therefore not participate in the predication expression */ fprintf(stderr, ErrHdr,FileStr[parentRule->file],parentRule->line); fprintf(stderr," warning: %s of %s in rule %s\n (file %s alt %d line %d and alt %d line %d)\n%s", "the predicates used to disambiguate optional/exit paths of ", sub, CurRule, FileStr[alt1->file], alt1->altnum, alt1->line, alt2->altnum, alt2->line, " are identical and have no resolving power\n"); } else { fprintf(stderr, ErrHdr, FileStr[parentRule->file], parentRule->line); fprintf(stderr," warning: %s rule %s\n (file %s alt %d line %d and alt %d line %d)\n%s", "the predicates used to disambiguate", CurRule, FileStr[alt1->file], alt1->altnum, alt1->line, alt2->altnum, alt2->line, " are identical and have no resolving power\n"); }; } else { p1=predicate_dup_without_context(alt1->predicate); p1=MR_unfold(p1); MR_clearPredEntry(p1); MR_simplifyInverted(p1,0); p1=MR_predSimplifyALL(p1); p2=predicate_dup_without_context(alt2->predicate); p2=MR_unfold(p2); MR_clearPredEntry(p2); MR_simplifyInverted(p2,0); p2=MR_predSimplifyALL(p2); if (MR_comparePredicates(p1,p2)) { if (jtype == aLoopBegin || jtype == aPlusBlk ) { fprintf(stderr, ErrHdr, FileStr[parentRule->file], parentRule->line); fprintf(stderr," warning: %s of %s in rule %s\n (file %s alt %d line %d and alt %d line %d)\n%s%s", "the predicates used to disambiguate optional/exit paths of ", sub, CurRule, FileStr[alt1->file], alt1->altnum, alt1->line, alt2->altnum, alt2->line, " are identical when compared without context and may have no\n", " resolving power for some lookahead sequences.\n"); } else { fprintf(stderr, ErrHdr, FileStr[parentRule->file], parentRule->line); fprintf(stderr," warning: %s rule %s\n (file %s alt %d line %d and alt %d line %d)\n%s%s", "the predicates used to disambiguate", CurRule, FileStr[alt1->file], alt1->altnum, alt1->line, alt2->altnum, alt2->line, " are identical when compared without context and may have no\n", " resolving power for some lookahead sequences.\n"); }; if (InfoP) { fprintf(output,"\n#if 0\n\n"); fprintf(output,"The following predicates are identical when compared without\n"); fprintf(output," lookahead context information. For some ambiguous lookahead\n"); fprintf(output," sequences they may not have any power to resolve the ambiguity.\n"); fprintf(output,"\n"); fprintf(output,"Choice 1: %s alt %d line %d file %s\n\n", MR_ruleNamePlusOffset( (Node *) alt1), alt1->altnum, alt1->line, FileStr[alt1->file]); fprintf(output," The original predicate for choice 1 with available context information:\n\n"); MR_dumpPred1(2,alt1->predicate,1); fprintf(output," The predicate for choice 1 after expansion (but without context information):\n\n"); MR_dumpPred1(2,p1,0); if (p1 == NULL) { Predicate *phelp; fprintf(output," The predicate for choice 1 after expansion (but before simplification)\n\n"); phelp=predicate_dup_without_context(alt1->predicate); phelp=MR_unfold(phelp); MR_clearPredEntry(phelp); MR_simplifyInverted(phelp,0); phelp=MR_predSimplifyALLX(phelp,1); MR_dumpPred1(2,phelp,0); predicate_free(phelp); }; fprintf(output,"\n"); fprintf(output,"Choice 2: %s alt %d line %d file %s\n\n", MR_ruleNamePlusOffset( (Node *) alt2), alt2->altnum, alt2->line, FileStr[alt2->file]); fprintf(output," The original predicate for choice 2 with available context information:\n\n"); MR_dumpPred1(1,alt2->predicate,1); fprintf(output," The predicate for choice 2 after expansion (but without context information):\n\n"); MR_dumpPred1(1,p2,0); if (p2 == NULL) { Predicate *phelp; fprintf(output," The predicate for choice 2 after expansion (but before simplification)\n\n"); phelp=predicate_dup_without_context(alt2->predicate); phelp=MR_unfold(phelp); MR_clearPredEntry(phelp); MR_simplifyInverted(phelp,0); phelp=MR_predSimplifyALLX(phelp,1); MR_dumpPred1(2,phelp,0); predicate_free(phelp); }; fprintf(output,"\n#endif\n"); }; } else if (MR_secondPredicateUnreachable(p1,p2)) { if (jtype == aLoopBegin || jtype == aPlusBlk ) { fprintf(stderr, ErrHdr, FileStr[parentRule->file], parentRule->line); fprintf(stderr," warning: %s of %s in rule %s\n (file %s alt %d line %d and alt %d line %d)\n%s%s", "the predicate used to disambiguate the first choice of the optional/exit paths of ", sub, CurRule, FileStr[alt1->file], alt1->altnum, alt1->line, alt2->altnum, alt2->line, " appears to \"cover\" the second predicate when compared without context.\n", " The second predicate may have no resolving power for some lookahead sequences.\n"); } else { fprintf(stderr, ErrHdr, FileStr[parentRule->file], parentRule->line); fprintf(stderr," warning: %s rule %s\n (file %s alt %d line %d and alt %d line %d)\n%s%s", "the predicate used to disambiguate the first choice of", CurRule, FileStr[alt1->file], alt1->altnum, alt1->line, alt2->altnum, alt2->line, " appears to \"cover\" the second predicate when compared without context.\n", " The second predicate may have no resolving power for some lookahead sequences.\n"); }; if (InfoP) { fprintf(output,"\n#if 0\n\n"); fprintf(output,"The first predicate appears to \"cover\" the second predicate when they\n"); fprintf(output," are compared without lookahead context information. For some ambiguous\n"); fprintf(output," lookahead sequences the second predicate may not have any power to\n"); fprintf(output," resolve the ambiguity.\n"); fprintf(output,"\n"); fprintf(output,"Choice 1: %s alt %d line %d file %s\n\n", MR_ruleNamePlusOffset( (Node *) alt1), alt1->altnum, alt1->line, FileStr[alt1->file]); fprintf(output," The original predicate for choice 1 with available context information:\n\n"); MR_dumpPred1(2,alt1->predicate,1); fprintf(output," The predicate for choice 1 after expansion (but without context information):\n\n"); MR_dumpPred1(2,p1,0); if (p1 == NULL) { Predicate *phelp; fprintf(output," The predicate for choice 1 after expansion (but before simplification)\n\n"); phelp=predicate_dup_without_context(alt1->predicate); phelp=MR_unfold(phelp); MR_clearPredEntry(phelp); MR_simplifyInverted(phelp,0); phelp=MR_predSimplifyALLX(phelp,1); MR_dumpPred1(2,phelp,0); predicate_free(phelp); }; fprintf(output,"\n"); fprintf(output,"Choice 2: %s alt %d line %d file %s\n\n", MR_ruleNamePlusOffset( (Node *) alt2), alt2->altnum, alt2->line, FileStr[alt2->file]); fprintf(output," The original predicate for choice 2 with available context information:\n\n"); MR_dumpPred1(1,alt2->predicate,1); fprintf(output," The predicate for choice 2 after expansion (but without context information):\n\n"); MR_dumpPred1(1,p2,0); if (p2 == NULL) { Predicate *phelp; fprintf(output," The predicate for choice 2 after expansion (but before simplification)\n\n"); phelp=predicate_dup_without_context(alt2->predicate); phelp=MR_unfold(phelp); MR_clearPredEntry(phelp); MR_simplifyInverted(phelp,0); phelp=MR_predSimplifyALLX(phelp,1); MR_dumpPred1(2,phelp,0); predicate_free(phelp); }; fprintf(output,"\n#endif\n"); }; }; predicate_free(p1); predicate_free(p2); }; } static int totalOverflow=0; /* MR9 */ void #ifdef __USE_PROTOS HandleAmbiguity( Junction *block, Junction *alt1, Junction *alt2, int jtype ) #else HandleAmbiguity( block, alt1, alt2, jtype ) Junction *block; Junction *alt1; Junction *alt2; int jtype; #endif { unsigned **ftbl; set *fset, b; int i, numAmbig,n2; Tree *ambig=NULL, *t, *u; char *sub = ""; long n; int thisOverflow=0; /* MR9 */ long set_deg_value; /* MR10 */ long threshhold; /* MR10 */ require(block!=NULL, "NULL block"); require(block->ntype==nJunction, "invalid block"); /* These sets are used to constrain LL_k set, but are made CLL_k long anyway */ fset = (set *) calloc(CLL_k+1, sizeof(set)); require(fset!=NULL, "cannot allocate fset"); ftbl = (unsigned **) calloc(CLL_k+1, sizeof(unsigned *)); require(ftbl!=NULL, "cannot allocate ftbl"); /* create constraint table and count number of possible ambiguities (use<=LL_k) */ for (n=1,i=1; i<=CLL_k; i++) { b = set_and(alt1->fset[i], alt2->fset[i]); /* MR9 */ set_deg_value = set_deg(b); /* MR10 */ if (n > 0) { /* MR10 */ threshhold = LONG_MAX / n; /* MR10 */ if (set_deg_value <= threshhold) { /* MR10 */ n *= set_deg_value; /* MR10 */ } else { /* MR10 */ n=LONG_MAX; /* MR9 */ if (totalOverflow == 0) { #if 0 /* MR10 comment this out because it just makes users worry */ /* MR9 */ warnNoFL("Overflow in computing number of possible ambiguities in HandleAmbiguity\n"); #endif /* MR9 */ }; /* MR9 */ thisOverflow++; /* MR9 */ totalOverflow++; /* MR9 */ }; /* MR10 */ } else { /* MR10 */ n *= set_deg_value; /* MR9 */ }; fset[i] = set_dup(b); ftbl[i] = set_pdq(b); set_free(b); } switch ( jtype ) { case aSubBlk: sub = "of (..) "; break; case aOptBlk: sub = "of {..} "; break; case aLoopBegin: sub = "of (..)* "; break; case aLoopBlk: sub = "of (..)* "; break; case aPlusBlk: sub = "of (..)+ "; break; case RuleBlk: sub = "of the rule itself "; break; default : sub = ""; break; } /* If the block is marked as a compressed lookahead only block, then * simply return; ambiguity warning is given only at warning level 2. */ if ( block->approx>0 ) { if ( ParseWithPredicates ) { if (alt1->predicate != NULL) predicate_free(alt1->predicate); /* MR12 */ if (alt2->predicate != NULL) predicate_free(alt2->predicate); /* MR12 */ require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); alt1->predicate = MR_find_predicates_and_supp((Node *)alt1->p1); require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); require (MR_predicate_context_completed(alt1->predicate),"predicate alt 1 not completed"); alt1->predicate=MR_predSimplifyALL(alt1->predicate); require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); alt2->predicate = MR_find_predicates_and_supp((Node *)alt2->p1); require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); require (MR_predicate_context_completed(alt2->predicate),"predicate alt 2 not completed"); alt2->predicate=MR_predSimplifyALL(alt2->predicate); MR_doPredicatesHelp(0,alt1,alt2,jtype,sub); if ( HoistPredicateContext && (alt1->predicate!=NULL||alt2->predicate!=NULL) ) { verify_context(alt1->predicate); verify_context(alt2->predicate); } if ( HoistPredicateContext && (alt1->predicate!=NULL||alt2->predicate!=NULL) && WarningLevel>1 ) ensure_predicates_cover_ambiguous_lookahead_sequences(alt1, alt2, sub, ambig); } if ( WarningLevel>1 ) { fprintf(stderr, ErrHdr, FileStr[alt1->file], alt1->line); if ( jtype == aLoopBegin || jtype == aPlusBlk ) fprintf(stderr, " warning: optional/exit path and alt(s) %sambiguous upon", sub); else fprintf(stderr, " warning(approx): alts %d and %d %sambiguous upon", alt1->altnum, alt2->altnum, sub); dumpAmbigMsg(fset, stderr, 0); MR_traceAmbSource(fset,alt1,alt2); } for (i=1; i<=CLL_k; i++) set_free( fset[i] ); free((char *)fset); for (i=1; i<=CLL_k; i++) free( (char *)ftbl[i] ); free((char *)ftbl); return; } /* if all sets have degree 1 for k=1 permutation; * don't bother doing full LL(k) analysis. * (This "if" block handles the LL(1) case) */ n2 = 0; for (i=1; ifset[i])+set_deg(alt2->fset[i]); /* here STARTS the special case in which the lookahead sets for alt1 and alt2 all have degree 1 for kp1)!=NULL ) { if ( WarningLevel==1 ) { for (i=1; i<=CLL_k; i++) set_free( fset[i] ); free((char *)fset); for (i=1; i<=CLL_k; i++) free( (char *)ftbl[i] ); free((char *)ftbl); return; } fprintf(stderr, ErrHdr, FileStr[alt1->file], alt1->line); if ( jtype == aLoopBegin || jtype == aPlusBlk ) fprintf(stderr, " warning: optional/exit path and alt(s) %sambiguous upon", sub); else fprintf(stderr, " warning: alts %d and %d %sambiguous upon", alt1->altnum, alt2->altnum, sub); dumpAmbigMsg(fset, stderr, 0); MR_traceAmbSource(fset,alt1,alt2); } ambig = NULL; if ( LL_k>1 ) ambig = make_tree_from_sets(alt1->fset, alt2->fset); if ( ParseWithPredicates ) { if (alt1->predicate != NULL) predicate_free(alt1->predicate); /* MR12 */ if (alt2->predicate != NULL) predicate_free(alt2->predicate); /* MR12 */ require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); alt1->predicate = MR_find_predicates_and_supp((Node *)alt1->p1); require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); require (MR_predicate_context_completed(alt1->predicate),"predicate alt 1 not completed"); alt1->predicate=MR_predSimplifyALL(alt1->predicate); require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); alt2->predicate = MR_find_predicates_and_supp((Node *)alt2->p1); require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); require (MR_predicate_context_completed(alt2->predicate),"predicate alt 2 not completed"); alt2->predicate=MR_predSimplifyALL(alt2->predicate); MR_doPredicatesHelp(0,alt1,alt2,jtype,sub); if ( HoistPredicateContext && (alt1->predicate!=NULL||alt2->predicate!=NULL) ) { verify_context(alt1->predicate); verify_context(alt2->predicate); } if (HoistPredicateContext&&(alt1->predicate!=NULL||alt2->predicate!=NULL) && WarningLevel>1) ensure_predicates_cover_ambiguous_lookahead_sequences(alt1, alt2, sub, ambig); if ( WarningLevel == 1 && (alt1->predicate!=NULL||alt2->predicate!=NULL)) { for (i=1; i<=CLL_k; i++) set_free( fset[i] ); free((char *)fset); for (i=1; i<=CLL_k; i++) free( (char *)ftbl[i] ); free((char *)ftbl); Tfree(ambig); return; } } /* end TJP (10/24/93) */ fprintf(stderr, ErrHdr, FileStr[alt1->file], alt1->line); if ( jtype == aLoopBegin || jtype == aPlusBlk ) fprintf(stderr, " warning: optional/exit path and alt(s) %sambiguous upon", sub); else fprintf(stderr, " warning: alts %d and %d %sambiguous upon", alt1->altnum, alt2->altnum, sub); if ( elevel == 3 && LL_k>1 ) { preorder(ambig); fprintf(stderr, "\n"); for (i=1; i<=CLL_k; i++) set_free( fset[i] ); free((char *)fset); for (i=1; i<=CLL_k; i++) free( (char *)ftbl[i] ); free((char *)ftbl); Tfree(ambig); return; }; Tfree(ambig); dumpAmbigMsg(fset, stderr, 0); /* because this is a special case in which both alt1 and alt2 have lookahead sets of degree 1 for kaltnum; CurAmbigAlt2 = alt2->altnum; CurAmbigbtype = sub; CurAmbigfile = alt1->file; CurAmbigline = alt1->line; /* Don't do full LL(n) analysis if (...)? block because the block, by definition, defies LL(n) analysis. If guess (...)? block and ambiguous then don't remove anything from 2nd alt to resolve ambig. Want to predict with LL sup 1 ( n ) decision not LL(n) if guess block since it is much cheaper than LL(n). LL sup 1 ( n ) "covers" the LL(n) lookahead information. Note: LL(n) context cannot be computed for semantic predicates when followed by (..)?. If (..)? then we scream "AAAHHHH! No LL(n) analysis will help" Is 'ambig' always defined if we enter this if? I hope so because the 'ensure...()' func references it. TJP Nov 1993. */ /* THM MR30: Instead of using first_item_is_guss_block we use first_item_is_guess_block_extra which will look inside a loop block for a guess block. In other words ( (...)? )*. It there is an ambiguity in this circumstance then we suppress the normal methods of resolving ambiguities. */ if ( first_item_is_guess_block_extra((Junction *)alt1->p1)!=NULL ) { if ( ParseWithPredicates ) { if (alt1->predicate != NULL) predicate_free(alt1->predicate); /* MR12 */ if (alt2->predicate != NULL) predicate_free(alt2->predicate); /* MR12 */ require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); alt1->predicate = MR_find_predicates_and_supp((Node *)alt1->p1); require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); require (MR_predicate_context_completed(alt1->predicate),"predicate alt 1 not completed"); alt1->predicate=MR_predSimplifyALL(alt1->predicate); require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); alt2->predicate = MR_find_predicates_and_supp((Node *)alt2->p1); require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); require (MR_predicate_context_completed(alt2->predicate),"predicate alt 2 not completed"); alt2->predicate=MR_predSimplifyALL(alt2->predicate); MR_doPredicatesHelp(1,alt1,alt2,jtype,sub); if ( HoistPredicateContext && (alt1->predicate!=NULL||alt2->predicate!=NULL) ) { verify_context(alt1->predicate); verify_context(alt2->predicate); } if ( HoistPredicateContext && (alt1->predicate!=NULL||alt2->predicate!=NULL) && WarningLevel>1 ) ensure_predicates_cover_ambiguous_lookahead_sequences(alt1, alt2, sub, ambig); if ( WarningLevel==1 && (alt1->predicate!=NULL||alt2->predicate!=NULL)) { for (i=1; i<=CLL_k; i++) set_free( fset[i] ); free((char *)fset); for (i=1; i<=CLL_k; i++) free( (char *)ftbl[i] ); free((char *)ftbl); return; } } if ( WarningLevel>1 ) { fprintf(stderr, ErrHdr, FileStr[alt1->file], alt1->line); if ( jtype == aLoopBegin || jtype == aPlusBlk ) fprintf(stderr, " warning: optional/exit path and alt(s) %sambiguous upon", sub); else fprintf(stderr, " warning: alts %d and %d %sambiguous upon", alt1->altnum, alt2->altnum, sub); dumpAmbigMsg(fset, stderr, 0); MR_traceAmbSource(fset,alt1,alt2); } for (i=1; i<=CLL_k; i++) set_free( fset[i] ); free((char *)fset); for (i=1; i<=CLL_k; i++) free( (char *)ftbl[i] ); free((char *)ftbl); return; } /* Not resolved with (..)? block. Do full LL(n) analysis */ /* ambig is the set of k-tuples truly in common between alt 1 and alt 2 */ /* MR11 VerifyAmbig once used fset destructively */ ambig = VerifyAmbig(alt1, alt2, ftbl, fset, &t, &u, &numAmbig); /* are all things in intersection really ambigs? */ if (thisOverflow || numAmbig < n ) /* MR9 */ { Tree *v; /* remove ambig permutation from 2nd alternative to resolve ambig; * We want to compute the set of artificial tuples, arising from * LL sup 1 (n) compression, that collide with real tuples from the * 2nd alternative. This is the set of "special case" tuples that * the LL sup 1 (n) decision template maps incorrectly. */ /* when generating code in genExpr() it does * * if ( genExprSets(j->fset) && !genExprTree(j->ftree)) {... * * Sooooo the j->ftree is the tree of alt2 * after removal of conflicts, not alt1 ! */ if ( ambig!=NULL ) { /* at the top of ambig is an ALT node */ for (v=ambig->down; v!=NULL; v=v->right) { u = trm_perm(u, v); /* remove v FROM u */ } /* fprintf(stderr, "after rm alt2:"); preorder(u); fprintf(stderr, "\n");*/ } Tfree( t ); alt1->ftree = tappend(alt1->ftree, u); alt1->ftree = tleft_factor(alt1->ftree); } if ( ambig==NULL ) { for (i=1; i<=CLL_k; i++) set_free( fset[i] ); free((char *)fset); for (i=1; i<=CLL_k; i++) free( (char *)ftbl[i] ); free((char *)ftbl); return; } ambig = tleft_factor(ambig); /* TJP: * At this point, we surely have an LL(k) ambiguity. Check for predicates */ if ( ParseWithPredicates ) { if (alt1->predicate != NULL) predicate_free(alt1->predicate); /* MR12 */ if (alt2->predicate != NULL) predicate_free(alt2->predicate); /* MR12 */ require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); alt1->predicate = MR_find_predicates_and_supp((Node *)alt1->p1); require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); require (MR_predicate_context_completed(alt1->predicate),"predicate alt 1 not completed"); alt1->predicate=MR_predSimplifyALL(alt1->predicate); require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); alt2->predicate = MR_find_predicates_and_supp((Node *)alt2->p1); require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); require (MR_predicate_context_completed(alt2->predicate),"predicate alt 2 not completed"); alt2->predicate=MR_predSimplifyALL(alt2->predicate); MR_doPredicatesHelp(0,alt1,alt2,jtype,sub); if ( HoistPredicateContext && (alt1->predicate!=NULL||alt2->predicate!=NULL) ) { verify_context(alt1->predicate); verify_context(alt2->predicate); } if ( HoistPredicateContext && (alt1->predicate!=NULL||alt2->predicate!=NULL) && WarningLevel>1 ) ensure_predicates_cover_ambiguous_lookahead_sequences(alt1, alt2, sub, ambig); if ( WarningLevel==1 && (alt1->predicate!=NULL||alt2->predicate!=NULL)) { /* We found at least one pred for at least one of the alts; * If warnings are low, just return. */ Tfree(ambig); for (i=1; i<=CLL_k; i++) set_free( fset[i] ); free((char *)fset); for (i=1; i<=CLL_k; i++) free( (char *)ftbl[i] ); free((char *)ftbl); return; } /* else we're gonna give a warning */ } /* end TJP addition */ fprintf(stderr, ErrHdr, FileStr[alt1->file], alt1->line); if ( jtype == aLoopBegin || jtype == aPlusBlk ) fprintf(stderr, " warning: optional/exit path and alt(s) %sambiguous upon", sub); else fprintf(stderr, " warning: alts %d and %d %sambiguous upon", alt1->altnum, alt2->altnum, sub); if ( elevel == 3 ) { preorder(ambig->down); /* <===== k>1 ambiguity message data */ fprintf(stderr, "\n"); } else { MR_skipped_e3_report=1; dumpAmbigMsg(fset, stderr, 0); }; MR_traceAmbSourceK(ambig,alt1,alt2); /* <====== k>1 ambiguity aid */ Tfree(ambig); for (i=1; i<=CLL_k; i++) set_free( fset[i] ); free((char *)fset); for (i=1; i<=CLL_k; i++) free( (char *)ftbl[i] ); free((char *)ftbl); } /* Don't analyze alpha block of (alpha)?beta; if (alpha)? then analyze * Return the 1st node of the beta block if present else return j. */ Junction * #ifdef __USE_PROTOS analysis_point( Junction *j ) #else analysis_point( j ) Junction *j; #endif { Junction *gblock; /* MR13b When there was an action/predicate preceding a guess block the guess block became invisible at the analysis_point. first_item_is_guess_block accepts any kind of node, despite the fact that the formal is a junction. But I don't want to have to change it all over the place until I know it works. */ if ( j->ntype != nJunction && j->ntype != nAction) return j; gblock = first_item_is_guess_block((Junction *)j); if ( gblock!=NULL ) { Junction *past = gblock->end; Junction *p; require(past!=NULL, "analysis_point: no end block on (...)? block"); for (p=(Junction *)past->p1; p!=NULL; ) { if ( p->ntype==nAction ) { p=(Junction *)((ActionNode *)p)->next; continue; } if ( p->ntype!=nJunction ) { past->alpha_beta_guess_end=1; /* MR14 */ return (Junction *)past->p1; } if ( p->jtype==EndBlk || p->jtype==EndRule ) { return j; } /* MR6 */ /* MR6 A guess block is of the form "(alpha)? beta" or "(alpha)?". */ /* MR6 When beta is omitted (second form) this means "(alpha)? alpha". */ /* MR6 The program does not store another copy of alpha in this case. */ /* MR6 During analysis when the program needs to know what follows the */ /* MR6 guess clause. It calls this routine. */ /* MR6 */ /* MR6 If it is of the form "(alpha)? beta" it returns a pointer to beta.*/ /* MR6 */ /* MR6 If it is of the form "(alpha)?" it returns a pointer to the guess */ /* MR6 block itself thereby reusing the junction tree. */ /* MR6 */ /* MR6 It works by searching the "next in sequence" chain (skipping actions) */ /* MR6 searching for a RuleRef or Token node. (Those are the only 4 kinds */ /* MR6 of nodes: Junctions, RuleRef, Token, and Action.) */ /* MR6 */ /* MR6 This won't work for the special case "(alpha)? ()" because it has no */ /* MR6 rule references or token nodes. It eventually encounters a */ /* MR6 junction of type EndBlk or EndRule and says to its caller: nothing */ /* MR6 more here to analyze - must be of the form "(alpha)?". */ /* MR6 */ /* MR6 In the case of "(alpha)? ()" it should return a pointer to "()" */ /* MR6 */ /* MR6 I think. */ /* MR6 */ if ( p->jtype!=Generic) { /* MR6 */ past->alpha_beta_guess_end=1; /* MR14 */ return (Junction *)past->p1; /* MR6 */ }; /* MR6 */ p=(Junction *)p->p1; } } return j; } set #ifdef __USE_PROTOS First( Junction *j, int k, int jtype, int *max_k ) #else First( j, k, jtype, max_k ) Junction *j; int k; int jtype; int *max_k; #endif { Junction *alt1, *alt2; set a, rk, fCurBlk; int savek; int p1, p2; int save_maintainBackTrace; require(j->ntype==nJunction, "First: non junction passed"); /* C o m p u t e F I R S T s e t w i t h k l o o k a h e a d */ fCurBlk = rk = empty; for (alt1=j; alt1!=NULL; alt1 = (Junction *)alt1->p2 ) { Junction * p = NULL; Junction * p1junction = NULL; p = analysis_point((Junction *)alt1->p1); p1junction = (Junction *) (alt1->p1); #if 0 if (p != p1junction) { fprintf(stdout,"Analysis point for #%d is #%d", p1junction->seq, p->seq); /* debug */ } #endif REACH(p, k, &rk, alt1->fset[k]); require(set_nil(rk), "rk != nil"); set_free(rk); set_orin(&fCurBlk, alt1->fset[k]); } /* D e t e c t A m b i g u i t i e s */ *max_k = 1; for (p1=1,alt1=j; alt1!=NULL; alt1 = (Junction *)alt1->p2, p1++) { for (p2=1,alt2=(Junction *)alt1->p2; alt2!=NULL; alt2 = (Junction *)alt2->p2, p2++) { savek = k; a = set_and(alt1->fset[k], alt2->fset[k]); while ( !set_nil(a) ) { /* if we have hit the max k requested, just give warning */ if ( j->approx==k ) { } if ( k==CLL_k ) { #ifdef NOT_USED *** int save_LL_k = LL_k; *** int save_CLL_k = CLL_k; *** /* Get new LL_k from interactive feature if enabled */ *** if ( AImode ) *** AmbiguityDialog(j, jtype, alt1, alt2, &CLL_k, &LL_k); #endif *max_k = CLL_k; save_maintainBackTrace=MR_MaintainBackTrace; if (AlphaBetaTrace) MR_MaintainBackTrace=0; HandleAmbiguity(j, alt1, alt2, jtype); MR_MaintainBackTrace=save_maintainBackTrace; break; } else { Junction *p = analysis_point((Junction *)alt1->p1); Junction *q = analysis_point((Junction *)alt2->p1); k++; /* attempt ambig alts again with more lookahead */ REACH(p, k, &rk, alt1->fset[k]); require(set_nil(rk), "rk != nil"); REACH(q, k, &rk, alt2->fset[k]); require(set_nil(rk), "rk != nil"); set_free(a); a = set_and(alt1->fset[k], alt2->fset[k]); if ( k > *max_k ) *max_k = k; } } set_free(a); k = savek; } } return fCurBlk; } gtkwave-3.3.86/contrib/pccts/antlr/Makefile.in0000664000175000017500000005406313166335473020555 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : noinst_PROGRAMS = antlr$(EXEEXT) subdir = contrib/pccts/antlr DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_antlr_OBJECTS = antlr.$(OBJEXT) err.$(OBJEXT) bits.$(OBJEXT) \ build.$(OBJEXT) egman.$(OBJEXT) fcache.$(OBJEXT) \ fset.$(OBJEXT) fset2.$(OBJEXT) gen.$(OBJEXT) globals.$(OBJEXT) \ hash.$(OBJEXT) lex.$(OBJEXT) main.$(OBJEXT) misc.$(OBJEXT) \ mrhoist.$(OBJEXT) pred.$(OBJEXT) scan.$(OBJEXT) set.$(OBJEXT) antlr_OBJECTS = $(am_antlr_OBJECTS) antlr_LDADD = $(LDADD) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(antlr_SOURCES) DIST_SOURCES = $(antlr_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CFLAGS = -I. -I$(srcdir)/../support/set \ -I$(srcdir)/../h -DUSER_ZZSYN $(COTHER) -DZZLEXBUFSIZE=32000 # # SGI Users, use this CFLAGS # # FIXME -- what are -DUSER_ZZSYN and -woff 3262 for? Whats the real # condition we need to detect to corectly turn those on? # # Think feature test, not OS test. #CFLAGS= -O -I. -I$(SET) -I$(PCCTS_H) -DUSER_ZZSYN -woff 3262 antlr_SOURCES = \ antlr.c err.c bits.c build.c egman.c fcache.c fset.c fset2.c \ gen.c generic.h globals.c hash.c hash.h lex.c main.c misc.c mode.h \ mrhoist.c pred.c proto.h scan.c $(srcdir)/../support/set/set.c \ stdpccts.h syn.h tokens.h # what files does PCCTS generate (both ANTLR and DLG) PCCTS_GEN = antlr.c scan.c err.c tokens.h mode.h parser.dlg stdpccts.h remap.h # hopefully this won't produce some sort of chicken and egg problem ANTLR = ./antlr DLG = ../dlg/dlg EXTRA_DIST = \ AntlrMS.mak AntlrMSVC50.dsp AntlrMSVC50.dsw AntlrMSVC50.mak \ AntlrMSVC60.dsp AntlrMSVC60.dsw README antlr.1 antlr.g \ antlr.r antlr1.txt antlr68K.make antlrPPC.make makefile.VMS \ makefile1 parser.dlg watantlr.mak all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/pccts/antlr/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/pccts/antlr/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) antlr$(EXEEXT): $(antlr_OBJECTS) $(antlr_DEPENDENCIES) $(EXTRA_antlr_DEPENDENCIES) @rm -f antlr$(EXEEXT) $(AM_V_CCLD)$(LINK) $(antlr_OBJECTS) $(antlr_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/antlr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bits.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/build.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/egman.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/err.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fcache.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fset.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fset2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/globals.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mrhoist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pred.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scan.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/set.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` set.o: $(srcdir)/../support/set/set.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT set.o -MD -MP -MF $(DEPDIR)/set.Tpo -c -o set.o `test -f '$(srcdir)/../support/set/set.c' || echo '$(srcdir)/'`$(srcdir)/../support/set/set.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/set.Tpo $(DEPDIR)/set.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/../support/set/set.c' object='set.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o set.o `test -f '$(srcdir)/../support/set/set.c' || echo '$(srcdir)/'`$(srcdir)/../support/set/set.c set.obj: $(srcdir)/../support/set/set.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT set.obj -MD -MP -MF $(DEPDIR)/set.Tpo -c -o set.obj `if test -f '$(srcdir)/../support/set/set.c'; then $(CYGPATH_W) '$(srcdir)/../support/set/set.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../support/set/set.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/set.Tpo $(DEPDIR)/set.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/../support/set/set.c' object='set.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o set.obj `if test -f '$(srcdir)/../support/set/set.c'; then $(CYGPATH_W) '$(srcdir)/../support/set/set.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../support/set/set.c'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am # Don't worry about the ambiguity messages coming from antlr # for making antlr.c etc... [should be 10 of them, I think] antlr.c stdpccts.h parser.dlg tokens.h err.c : $(srcdir)/antlr.g @if test -x ${ANTLR} ; then \ echo "${ANTLR} -gh $(srcdir)/antlr.g" ; \ ${ANTLR} -gh $(srcdir)/antlr.g ; \ else \ echo "WARNING: $(srcdir)/antlr.g has changed making antlr.c stdpccts.h parser.dlg tokens.h " ; \ echo " and err.c out of date." ; \ echo " However you have not finished building $(ANTLR) yet. So you may want to" ; \ echo " build again a 2nd time after your build (hopefully) finishes." ; \ fi scan.c mode.h: $(srcdir)/parser.dlg @if test -x ${DLG} ; then \ echo "${DLG} -C2 $(srcdir)/parser.dlg scan.c" ; \ ${DLG} -C2 $(srcdir)/parser.dlg scan.c ; \ else \ echo "WARNING: $(srcdir)/parser.g has changed making scan.c and mode.h out of date." ; \ echo " However you have not finished building $(DLG) yet. So you may want to" ; \ echo " build again a 2nd time after your build (hopefully) finishes." ; \ fi # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/contrib/pccts/NOTES.watcom0000664000175000017500000000537713166335473017500 0ustar bybellbybellFrom Tom Zougas, zougas@civ.utoronto.ca These are the changes I had to make to get ANTLR to compile under Watcom C 10.0 32-bit mode. I'm including the makefiles for antlr and dlg: [Warning from T. Parr: I think that I may have expanded the tabs by mistake in this file. You might have to convert them back to tabs to have this file work correctly.] antlr.mak: ----------------------------------------------------------------------- SET=..\support\set PCCTS_H=..\h # # Watcom # CC=wcl386 ANTLR=..\bin\antlr DLG=..\bin\dlg CFLAGS= -I. -I$(SET) -I$(PCCTS_H) -DUSER_ZZSYN -DPC OUT_OBJ = -o OBJ_EXT = obj LINK = wcl386 .c.obj : $(CC) -c $[* $(CFLAGS) antlr.exe: antlr.obj scan.obj err.obj bits.obj build.obj fset2.obj & fset.obj gen.obj globals.obj hash.obj lex.obj main.obj & misc.obj set.obj pred.obj $(LINK) -fe=antlr.exe *.obj -k14336 copy *.exe ..\bin # *********** Target list of PC machines *********** # # Don't worry about the ambiguity messages coming from antlr # for making antlr.c etc... [should be 10 of them, I think] # antlr.c stdpccts.h parser.dlg tokens.h err.c : antlr.g $(ANTLR) antlr.g antlr.$(OBJ_EXT): antlr.c mode.h tokens.h scan.$(OBJ_EXT): scan.c mode.h tokens.h scan.c mode.h: parser.dlg $(DLG) -C2 parser.dlg scan.c set.$(OBJ_EXT): $(SET)\set.c $(CC) $(CFLAGS) -c set.$(OBJ_EXT) $(SET)\set.c # # ****** These next targets are common to UNIX and PC world ******** # #clean up all the intermediate files clean: del *.obj #remove everything in clean plus the PCCTS files generated scrub: del $(PCCTS_GEN) del *.$(OBJ_EXT) --------------------------------------------------------------------- dlg.mak: --------------------------------------------------------------------- SET=..\support\set PCCTS_H=..\h # # Watcom # CC=wcl386 ANTLR=..\bin\antlr DLG=..\bin\dlg CFLAGS= -I. -I$(SET) -I$(PCCTS_H) -DUSER_ZZSYN -DPC LIBS= OBJ_EXT = obj LINK = wcl386 .c.obj : $(CC) -c $[* $(CFLAGS) dlg.exe : dlg_p.obj dlg_a.obj main.obj err.obj set.obj support.obj & output.obj relabel.obj automata.obj $(LINK) -fe=dlg.exe *.obj -k14336 copy *.exe ..\bin SRC = dlg_p.c dlg_a.c main.c err.c $(SET)\set.c support.c output.c & relabel.c automata.c dlg_p.c parser.dlg err.c tokens.h : dlg_p.g $(ANTLR) dlg_p.g dlg_a.c mode.h : parser.dlg $(DLG) -C2 parser.dlg dlg_a.c dlg_p.$(OBJ_EXT) : dlg_p.c dlg.h tokens.h mode.h $(CC) $(CFLAGS) -c dlg_p.c dlg_a.$(OBJ_EXT) : dlg_a.c dlg.h tokens.h mode.h $(CC) $(CFLAGS) -c dlg_a.c main.$(OBJ_EXT) : main.c dlg.h $(CC) $(CFLAGS) -c main.c set.$(OBJ_EXT) : $(SET)\set.c $(CC) -c $(CFLAGS) $(SET)\set.c #clean up all the intermediate files clean: del *.$(OBJ_EXT) gtkwave-3.3.86/contrib/pccts/makefile.vms0000664000175000017500000000040513166335473017663 0ustar bybellbybell$ set def [.antlr] $ @makefile.vms $ rename *.exe [-.bin] $ set def [-.dlg] $ @makefile.vms $ rename *.exe [-.bin] $ set def [-.sorcerer] $ @makefile.vms $ rename *.exe [-.bin] $ set def [-.support.decmms] $ @makefile.vms $ rename *.exe [--.bin] $ set def [--] gtkwave-3.3.86/contrib/pccts/history.ps0000664000175000017500000004752413166335473017441 0ustar bybellbybell%!PS-Adobe-3.0 %%Creator: groff version 1.06 %%DocumentNeededResources: font Times-Roman %%+ font Times-Italic %%+ font Courier %%DocumentSuppliedResources: procset grops 1.06 0 %%Pages: 3 %%PageOrder: Ascend %%Orientation: Portrait %%EndComments %%BeginProlog %%BeginResource: procset grops 1.06 0 /setpacking where { pop currentpacking true setpacking } if /grops 120 dict dup begin % The ASCII code of the space character. /SC 32 def /A /show load def /B { 0 SC 3 -1 roll widthshow } bind def /C { 0 exch ashow } bind def /D { 0 exch 0 SC 5 2 roll awidthshow } bind def /E { 0 rmoveto show } bind def /F { 0 rmoveto 0 SC 3 -1 roll widthshow } bind def /G { 0 rmoveto 0 exch ashow } bind def /H { 0 rmoveto 0 exch 0 SC 5 2 roll awidthshow } bind def /I { 0 exch rmoveto show } bind def /J { 0 exch rmoveto 0 SC 3 -1 roll widthshow } bind def /K { 0 exch rmoveto 0 exch ashow } bind def /L { 0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow } bind def /M { rmoveto show } bind def /N { rmoveto 0 SC 3 -1 roll widthshow } bind def /O { rmoveto 0 exch ashow } bind def /P { rmoveto 0 exch 0 SC 5 2 roll awidthshow } bind def /Q { moveto show } bind def /R { moveto 0 SC 3 -1 roll widthshow } bind def /S { moveto 0 exch ashow } bind def /T { moveto 0 exch 0 SC 5 2 roll awidthshow } bind def % name size font SF - /SF { findfont exch [ exch dup 0 exch 0 exch neg 0 0 ] makefont dup setfont [ exch /setfont cvx ] cvx bind def } bind def % name a c d font MF - /MF { findfont [ 5 2 roll 0 3 1 roll % b neg 0 0 ] makefont dup setfont [ exch /setfont cvx ] cvx bind def } bind def /level0 0 def /RES 0 def /PL 0 def /LS 0 def % Guess the page length. % This assumes that the imageable area is vertically centered on the page. % PLG - length /PLG { gsave newpath clippath pathbbox grestore exch pop add exch pop } bind def % BP - /BP { /level0 save def 1 setlinecap 1 setlinejoin 72 RES div dup scale LS { 90 rotate } { 0 PL translate } ifelse 1 -1 scale } bind def /EP { level0 restore showpage } bind def % centerx centery radius startangle endangle DA - /DA { newpath arcn stroke } bind def % x y SN - x' y' % round a position to nearest (pixel + (.25,.25)) /SN { transform .25 sub exch .25 sub exch round .25 add exch round .25 add exch itransform } bind def % endx endy startx starty DL - % we round the endpoints of the line, so that parallel horizontal % and vertical lines will appear even /DL { SN moveto SN lineto stroke } bind def % centerx centery radius DC - /DC { newpath 0 360 arc closepath } bind def /TM matrix def % width height centerx centery DE - /DE { TM currentmatrix pop translate scale newpath 0 0 .5 0 360 arc closepath TM setmatrix } bind def % these are for splines /RC /rcurveto load def /RL /rlineto load def /ST /stroke load def /MT /moveto load def /CL /closepath load def % fill the last path % amount FL - /FL { currentgray exch setgray fill setgray } bind def % fill with the ``current color'' /BL /fill load def /LW /setlinewidth load def % new_font_name encoding_vector old_font_name RE - /RE { findfont dup maxlength dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /Encoding exch def dup /FontName exch def currentdict end definefont pop } bind def /DEFS 0 def % hpos vpos EBEGIN - /EBEGIN { moveto DEFS begin } bind def /EEND /end load def /CNT 0 def /level1 0 def % llx lly newwid wid newht ht newllx newlly PBEGIN - /PBEGIN { /level1 save def translate div 3 1 roll div exch scale neg exch neg exch translate % set the graphics state to default values 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash /setstrokeadjust where { pop false setstrokeadjust } if /setoverprint where { pop false setoverprint } if newpath /CNT countdictstack def userdict begin /showpage {} def } bind def /PEND { clear countdictstack CNT sub { end } repeat level1 restore } bind def end def /setpacking where { pop setpacking } if %%EndResource %%IncludeResource: font Times-Roman %%IncludeResource: font Times-Italic %%IncludeResource: font Courier grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 def/PL 792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron/scaron/zcaron /Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space /exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft /parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four /five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C /D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash /bracketright/circumflex/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q /r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase /guillemotleft/guillemotright/bullet/florin/fraction/perthousand/dagger /daggerdbl/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut /dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash /quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar /section/dieresis/copyright/ordfeminine/guilsinglleft/logicalnot/minus /registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu /paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guilsinglright /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]def/Courier@0 ENC0/Courier RE/Times-Italic@0 ENC0/Times-Italic RE/Times-Roman@0 ENC0/Times-Roman RE %%EndProlog %%Page: 1 1 %%BeginPageSetup BP %%EndPageSetup /F0 13/Times-Roman@0 SF(The History of PCCTS)228.232 84 Q/F1 11/Times-Roman@0 SF(The Purdue Compiler)190.468 108 Q(-Construction T)-.22 E(ool Set)-.88 E/F2 10/Times-Italic@0 SF -.92(Te)262.245 144 S -.37(re).92 G(nce P).37 E(arr)-.8 E /F3 10/Times-Roman@0 SF -.15(Pa)234.755 156 S(rr Research Corporation).15 E (Minneapolis, Minnesota)239.39 168 Q(and)280.78 180 Q(Uni)239.315 192 Q -.15 (ve)-.25 G(rsity of Minnesota).15 E (Army High Performance Computing Research Center)180.38 204 Q F2 ([Updated 8-7-94])252.31 228 Q F1 .084(The PCCTS project be)97 259.6 R -.055 (ga)-.165 G 2.834(na).055 G 2.833(sap)220.547 259.6 S(arser)240.876 259.6 Q .083(-generator project for a graduate course at Purdue Uni-)-.22 F -.165(ve)72 275.6 S 1.085(rsity in the F).165 F 1.086 (all of 1988 taught by Hank Dietz\212 translator)-.165 F 1.086 (-writing systems.)-.22 F 1.086(Under the guid-)6.586 F .627 (ance of Professor Dietz, the parser generator)72 291.6 R 3.377(,A)-.44 G .626 (NTLR \(originally called YUCC\), continued after)285.18 291.6 R .253 (the termination of the course and e)72 307.6 R -.165(ve)-.275 G .254 (ntually became the subject of T).165 F .254(erence P)-.77 F(arr')-.165 E 3.004 (sM)-.605 G(aster')445.083 307.6 Q 3.004(st)-.605 G(hesis.)479.25 307.6 Q (Originally)72 323.6 Q 4.092(,l)-.715 G -.165(ex)126.406 323.6 S 1.342 (ical analysis w).165 F 1.342(as performed via ALX which w)-.11 F 1.342 (as soon replaced by W)-.11 F 1.341(ill Cohen')-.44 F(s)-.605 E .594 (DLG in the F)72 339.6 R .594(all of 1989 \(DF)-.165 F .595(A-based le)-.814 F .595(xical-analyzer generator)-.165 F 3.345(,a)-.44 G .595(lso an of)367.188 339.6 R .595(fshoot of the graduate)-.275 F(translation course\).)72 355.6 Q .877(The alpha v)97 375.2 R .877(ersion of ANTLR w)-.165 F .877(as totally re) -.11 F .876(written resulting in 1.00B.)-.275 F -1.221(Ve)6.376 G .876 (rsion 1.00B w)1.221 F(as)-.11 E 1.577(released via an internet ne)72 391.2 R 1.577(wsgroup \(comp.compilers\) posting in February of 1990 and quickly)-.275 F -.055(ga)72 407.2 S .356(thered a lar).055 F .356(ge follo)-.198 F 3.106 (wing. 1.00B)-.275 F .356(generated only LL\(1\) parsers, b)3.106 F .356 (ut allo)-.22 F .356(wed the mer)-.275 F .356(ged descrip-)-.198 F 1.859 (tion of le)72 423.2 R 1.859(xical and syntactic analysis.)-.165 F 1.86 (It had rudimentary attrib)7.359 F 1.86(ute handling similar to that of)-.22 F -.55 -1.32(YA C)72 439.2 T 3.549(Ca)1.32 G .799 (nd did not incorporate rule parameters or return v)109.231 439.2 R .798 (alues; do)-.275 F(wnw)-.275 E .798(ard inheritance w)-.11 F .798(as v)-.11 F (ery)-.165 E -.165(aw)72 455.2 S(kw).165 E 6.433(ard. 1.00B-generated)-.11 F 3.684(parsers terminated upon the \214rst syntax error)6.433 F 9.184(.L)-.605 G -.165(ex)440.916 455.2 S 3.684(ical classes).165 F(\(modes\) were not allo)72 471.2 Q(wed and DLG did not ha)-.275 E .33 -.165(ve a)-.22 H 2.75(ni).165 G (nteracti)305.959 471.2 Q .33 -.165(ve m)-.275 H(ode.).165 E .831 (Upon starting his Ph.D. at Purdue in the F)97 490.8 R .83(all of 1990, T)-.165 F .83(erence P)-.77 F .83(arr be)-.165 F -.055(ga)-.165 G 3.58(nt).055 G .83 (he second total)436.351 490.8 R(re)72 506.8 Q 1.646(write of ANTLR.)-.275 F 1.646(The method by which grammars may be practically analyzed to generate) 7.146 F/F4 11/Times-Italic@0 SF(LL)72.638 522.8 Q F1(\().583 E F4(k).396 E F1 3.849(\)l).737 G 1.099(ookahead information w)105.703 522.8 R 1.099(as disco) -.11 F -.165(ve)-.165 G 1.099(red in August of 1990 just before his return.) .165 F -1.221(Ve)6.598 G(rsion)1.221 E .626 (1.00 incorporated this algorithm and included the AST mechanism, le)72 538.8 R .626(xical classes, error classes,)-.165 F .354(and automatic error reco)72 554.8 R -.165(ve)-.165 G .353(ry; code quality and portability were higher).165 F 5.853(.I)-.605 G 3.103(nF)395.965 554.8 S .353(ebruary of 1992 1.00)410.684 554.8 R -.11(wa)72 570.8 S 2.76(sr).11 G .01 (eleased via an article in SIGPLAN Notices.)95.418 570.8 R .01 (Peter Dahl, Ph.D. candidate, and Professor Matt)5.51 F(O'K)72 586.8 Q 2.074 (eefe \(both at the Uni)-.275 F -.165(ve)-.275 G 2.073 (rsity of Minnesota\) tested this v).165 F 2.073(ersion e)-.165 F(xtensi)-.165 E -.165(ve)-.275 G(ly).165 E 7.573(.D)-.715 G 2.073(ana Hogg)448.522 586.8 R (att)-.055 E .078(\(Micro Data Base Systems, Inc.\) came up with the idea of e\ rror grouping \(strings attached to non-)72 602.8 R (terminals\) and tested 1.00 hea)72 618.8 Q(vily)-.22 E(.)-.715 E -1.221(Ve)97 638.4 S .878(rsion 1.06 w)1.221 F .877 (as released in December 1992 and represented a lar)-.11 F .877 (ge feature enhancement)-.198 F -.165(ove)72 654.4 S 3.648(r1).165 G 3.648 (.00. F)100.365 654.4 R .898(or e)-.165 F .899 (xample, rudimentary semantic predicates were introduced, error messages were) -.165 F 2.281(signi\214cantly impro)72 670.4 R -.165(ve)-.165 G 5.031(df).165 G (or)181.953 670.4 Q F4(k)5.427 E F1 2.281 (>1 lookahead and ANTLR parsers could indicate that lookahead).737 F 1.381 (fetches were to occur only when necessary for the parse \(normally)72 686.4 R 4.131(,t)-.715 G 1.381(he lookahead `)387.051 686.4 R(`pipe')-.814 E 4.132('w) -.814 G(as)494.837 686.4 Q 1.182(constantly full\).)72 702.4 R 1.182 (Russell Quong joined the project in the Spring of 1992 to aid in the semantic) 6.682 F .681(predicate design.)72 718.4 R(Be)6.181 E .681(ginning and adv)-.165 F .682(anced tutorials were created and released as well.)-.275 F 3.432(Am) 6.182 G(ak)485.179 718.4 Q(e-)-.11 E .993(\214le generator w)72 734.4 R .993 (as included that sets up dependencies and such correctly for ANTLR and DLG.) -.11 F EP %%Page: 2 2 %%BeginPageSetup BP %%EndPageSetup /F0 11/Times-Roman@0 SF 2.75(-2-)278.837 52 S -1.221(Ve)72 88 S 1.414(ry fe) 1.221 F 4.164(w1)-.275 G 1.414(.00 incompatibilities were introduced \(1.00 w) 122.81 88 R 1.415(as quite dif)-.11 F 1.415(ferent from 1.00B in some)-.275 F (areas\).)72 104 Q 1.089(1.10 w)97 123.6 R 1.088 (as released on August 31, 1993 and incorporated b)-.11 F 1.088(ug \214x)-.22 F 1.088(es, a fe)-.165 F 3.838(wf)-.275 G 1.088(eature enhance-)433.59 123.6 R 3.112(ments and a major ne)72 139.6 R 5.863(wc)-.275 G(apability \212)196.957 139.6 Q 3.113(an arbitrary lookahead operator \(syntactic predicate\),)5.863 F /F1 11/Courier@0 SF(\(alpha\)?beta)72 155.6 Q F0 6.754(.T)C 1.254 (his feature w)167.425 155.6 R 1.254 (as co-designed with Professor Russell Quong also at Purdue.)-.11 F 3.297 -.88 (To s)72 171.6 T 1.537 (upport in\214nite lookahead, a preprocessor \215ag, ZZINF_LOOK, w).88 F 1.537 (as created that forced the)-.11 F .21(ANTLR\(\) macro to tok)72 187.6 R .21 (enize all input prior to parsing.)-.11 F .209(Hence, at an)5.709 F 2.959(ym) -.165 G .209(oment, an action or predi-)389.215 187.6 R .936 (cate can see the entire input sentence.)72 203.6 R .936 (The predicate mechanism of 1.06 w)6.436 F .937(as e)-.11 F .937 (xtended to allo)-.165 F(w)-.275 E .55 (multiple predicates to be hoisted; the syntactic conte)72 219.6 R .55 (xt of a predicate w)-.165 F .55(as also mo)-.11 F -.165(ve)-.165 G 3.299(da) .165 G .549(long with)461.585 219.6 R(the predicate.)72 235.6 Q .754 (In February of 1994, SORCERER \(a simple tree-parser generator\) w)97 255.2 R .755(as released.)-.11 F .755(This tool)6.255 F(allo)72 271.2 Q .6(ws the user\ to parse child-sibling trees by specifying a grammar rather than b)-.275 F .599(uilding a recur)-.22 F(-)-.22 E(si)72 287.2 Q -.165(ve)-.275 G 1.39 (-descent tree w).165 F(alk)-.11 E 1.391(er by hand.)-.11 F -.88(Wo)6.891 G 1.391(rk to).88 F -.11(wa)-.275 G 1.391 (rds a library of tree transformations is underw).11 F(ay)-.11 E(.)-.715 E .581 (Aaron Sa)72 303.2 R(wde)-.165 E 3.331(ya)-.165 G 3.331(tT)145.531 303.2 S .581 (he Uni)158.641 303.2 R -.165(ve)-.275 G .58 (rsity of Minnesota became a second author of SORCERER after the).165 F (initial release.)72 319.2 Q .627(On April 1, 1994, PCCTS 1.20 w)97 338.8 R .627(as released.)-.11 F .627(This w)6.127 F .627(as the \214rst v)-.11 F .627 (ersion to acti)-.165 F -.165(ve)-.275 G .627(ly support).165 F 1.664 (C++ output.)72 354.8 R 1.664(It also included important \214x)7.164 F 1.663 (es re)-.165 F -.055(ga)-.165 G 1.663 (rding semantic predicates and \(..\)+ subrules.).055 F(This v)72 370.8 Q (ersion also introduced tok)-.165 E(en classes, the `)-.11 E(`)-.814 E/F2 11 /Times-Italic@0 SF(not)A F0 1.628 -.814('' o)D(perator).814 E 2.75(,a)-.44 G (nd tok)355.294 370.8 Q(en ranges.)-.11 E .764 (On June 19, 1994, SORCERER 1.00B9 w)97 390.4 R .765(as released.)-.11 F .765 (Gary Funck of Intrepid T)6.265 F(echnology)-.77 E .807 (joined the SORCERER team and pro)72 406.4 R .807(vided v)-.165 F .807(ery v) -.165 F .807(aluable suggestions re)-.275 F -.055(ga)-.165 G .806(rding the `) .055 F(`transform')-.814 E(')-.814 E(mode of SORCERER.)72 422.4 Q 1.137 (On August 8, 1994, PCCTS 1.21 w)97 442 R 1.137(as released.)-.11 F 1.138 (It mainly cleaned up the C++ output and)6.637 F(included a number of b)72 458 Q(ug \214x)-.22 E(es.)-.165 E .316(From the 1.21 release forw)97 477.6 R .316 (ard, the maintenance and support of all PCCTS tools will be pri-)-.11 F 1.557 (marily pro)72 493.6 R 1.557(vided by P)-.165 F 1.557 (arr Research Corporation, Minneapolis MN---an or)-.165 F -.055(ga)-.198 G 1.558(nization founded on).055 F 1.616(the principles of e)72 509.6 R 1.616 (xcellence in research and inte)-.165 F 1.616(grity in b)-.165 F 1.616 (usiness; we are de)-.22 F -.22(vo)-.275 G 1.616(ted to pro).22 F(viding)-.165 E 1.202(really cool softw)72 525.6 R 1.202(are tools.)-.11 F 1.202 (Please see \214le PCCTS.FUTURE for more information.)6.702 F 1.203(All PCCTS) 6.703 F(tools currently in the public domain will continue to be in the public\ domain.)72 541.6 Q 1.198(Looking to)97 561.2 R -.11(wa)-.275 G 1.198 (rds the future, a graphical user).11 F(-interf)-.22 E 1.197 (ace is in the design phase.)-.11 F 1.197(This w)6.697 F(ould)-.11 E(allo)72 577.2 Q 2.753(wu)-.275 G .003(sers to vie)104.42 577.2 R 2.753(wt)-.275 G .004 (he syntax diagram representation of their grammars and w)162.509 577.2 R .004 (ould highlight non-)-.11 F 1.181(deterministic productions.)72 593.2 R -.165 (Pa)6.681 G 1.18(rsing can be traced graphically as well.).165 F 1.18 (This system will be b)6.68 F(uilt)-.22 E .167(using a multiplatform windo)72 609.2 R 2.917(wl)-.275 G(ibrary)211.73 609.2 Q 5.667(.W)-.715 G 2.917(ea) 255.204 609.2 S .168(lso anticipate the introduction of a sophisticated error) 267.889 609.2 R(handling mechanism called `)72 625.2 Q(`parser e)-.814 E (xception handling')-.165 E 2.75('i)-.814 G 2.75(nan)327.431 625.2 S (ear future release.)348.815 625.2 Q(Currently)97 644.8 Q 3.019(,P)-.715 G .269 (CCTS is used at o)150.333 644.8 R -.165(ve)-.165 G 3.019(r1).165 G .269 (000 kno)253.098 644.8 R .268(wn academic, go)-.275 F -.165(ve)-.165 G .268 (rnment, and commercial sites).165 F .859(in 37 countries.)72 660.8 R .859 (Of course, the true number of users is unkno)6.359 F .859(wn due to the lar) -.275 F .859(ge number of ftp)-.198 F(sites.)72 676.8 Q EP %%Page: 3 3 %%BeginPageSetup BP %%EndPageSetup /F0 11/Times-Roman@0 SF 2.75(-3-)278.837 52 S(Credits)272.11 88 Q .44 LW 472.162 103.75 103.838 103.75 DL(Idea/T)134.236 117 Q 52.987(ool Coder)-.88 F (Co-designer\(s\))345.436 117 Q 281.334 103.75 281.334 124.75 DL 209.273 103.75 209.273 124.75 DL 209.273 124.75 103.838 124.75 DL 103.838 126.75 209.273 126.75 DL 281.334 124.75 209.273 124.75 DL 209.273 126.75 281.334 126.75 DL 472.162 124.75 281.334 124.75 DL 281.334 126.75 472.162 126.75 DL(ANTLR 1.00A) 109.338 140 Q -.77(Te)217.523 140 S(rence P).77 E 13.75(arr Hank)-.165 F(Dietz) 2.75 E 82.83(ALX T)109.338 156 R(erence P)-.77 E 13.75(arr Hank)-.165 F(Dietz) 2.75 E(ANTLR 1.00B)109.338 172 Q -.77(Te)217.523 172 S(rence P).77 E 13.75 (arr Hank)-.165 F(Dietz, W)2.75 E(ill Cohen)-.44 E(DLG 1.00B)109.338 188 Q -.44 (Wi)217.523 188 S(ll Cohen).44 E -.77(Te)289.584 188 S(rence P).77 E(arr)-.165 E 2.75(,H)-.44 G(ank Dietz)358.147 188 Q(NF)109.338 204 Q 2.75(AR)-.814 G 30.778(elabelling W)140.611 204 R(ill Cohen)-.44 E/F1 11/Times-Italic@0 SF(LL) 109.976 220 Q F0(\().583 E F1(k).396 E F0 2.75(\)a).737 G 40.447(nalysis T) 143.768 220 R(erence P)-.77 E 13.75(arr Hank)-.165 F(Dietz)2.75 E(ANTLR 1.00) 109.338 236 Q -.77(Te)217.523 236 S(rence P).77 E 13.75(arr Hank)-.165 F (Dietz, W)2.75 E(ill Cohen)-.44 E(DLG 1.00)109.338 252 Q -.44(Wi)217.523 252 S (ll Cohen).44 E -.77(Te)289.584 252 S(rence P).77 E(arr)-.165 E 2.75(,H)-.44 G (ank Dietz)358.147 252 Q(ANTLR 1.06)109.338 268 Q -.77(Te)217.523 268 S (rence P).77 E 13.75(arr W)-.165 F(ill Cohen, Russell Quong, Hank Dietz)-.44 E (DLG 1.06)109.338 284 Q -.44(Wi)217.523 284 S(ll Cohen).44 E -.77(Te)289.584 284 S(rence P).77 E(arr)-.165 E 2.75(,H)-.44 G(ank Dietz)358.147 284 Q (ANTLR 1.10)109.338 300 Q -.77(Te)217.523 300 S(rence P).77 E 13.75(arr W)-.165 F(ill Cohen, Russell Quong)-.44 E(ANTLR 1.20)109.338 316 Q -.77(Te)217.523 316 S(rence P).77 E 13.75(arr W)-.165 F(ill Cohen, Russell Quong)-.44 E(ANTLR 1.21) 109.338 332 Q -.77(Te)217.523 332 S(rence P).77 E 13.75(arr Russell)-.165 F (Quong)2.75 E(DLG 1.10)109.338 348 Q -.44(Wi)217.523 348 S(ll Cohen).44 E -.77 (Te)289.584 348 S(rence P).77 E(arr)-.165 E(DLG 1.20)109.338 364 Q -.44(Wi) 217.523 364 S(ll Cohen).44 E -.77(Te)289.584 364 S(rence P).77 E(arr)-.165 E (DLG 1.21)109.338 380 Q -.77(Te)217.523 380 S(rence P).77 E(arr)-.165 E (Semantic predicates)109.338 396 Q -.77(Te)217.523 396 S(rence P).77 E 13.75 (arr Russell)-.165 F(Quonq)2.75 E(Syntactic predicates)109.338 412 Q -.77(Te) 217.523 412 S(rence P).77 E 13.75(arr Russell)-.165 F(Quonq)2.75 E (SORCERER 1.00A)109.338 428 Q -.77(Te)217.523 428 S(rence P).77 E(arr)-.165 E (SORCERER 1.00B)109.338 444 Q -.77(Te)217.523 444 S(rence P).77 E 13.75 (arr Aaron)-.165 F(Sa)2.75 E(wde)-.165 E(y)-.165 E(SORCERER 1.00B9)109.338 460 Q -.77(Te)217.523 460 S(rence P).77 E 13.75(arr Aaron)-.165 F(Sa)2.75 E(wde) -.165 E 1.43 -.715(y, G)-.165 H(ary Funck).715 E 472.162 467.75 103.838 467.75 DL 472.162 103.75 472.162 467.75 DL 103.838 103.75 103.838 467.75 DL EP %%Trailer end %%EOF gtkwave-3.3.86/contrib/pccts/Makefile.in0000664000175000017500000004572513166335473017442 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = contrib/pccts DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = IBM_VISUAL_AGE_PROJECTS antlr dlg h sorcerer support testcpp EXTRA_DIST = \ CHANGES_FROM_131.txt CHANGES_FROM_133.txt \ CHANGES_FROM_133_BEFORE_MR13.txt CHANGES_SUMMARY.txt \ KNOWN_PROBLEMS.txt MPW_Read_Me \ NOTES.OS2 NOTES.bcc NOTES.msvc NOTES.watcom README \ RIGHTS history.ps history.txt install68K.mpw \ installPPC.mpw makefile.vms all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/pccts/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/pccts/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-tags distdir dvi dvi-am \ html html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/contrib/pccts/testcpp/0000775000175000017500000000000013166335473017042 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/testcpp/1/0000775000175000017500000000000013166335473017202 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/testcpp/1/makefile0000664000175000017500000000314613166335473020706 0ustar bybellbybell# # PCCTS makefile for: test.g # # Created from: ../../bin/genmk -CC -class Expr -project t test.g # # PCCTS release 1.32 # Project: t # C++ output # DLG scanner # ANTLR-defined token types # TOKENS = tokens.h # # The following filenames must be consistent with ANTLR/DLG flags DLG_FILE = parser.dlg ERR = err HDR_FILE = SCAN = DLGLexer PCCTS = ../.. ANTLR_H = $(PCCTS)/h BIN = $(PCCTS)/bin ANTLR = $(BIN)/antlr DLG = $(BIN)/dlg CFLAGS = -I. -I$(ANTLR_H) AFLAGS = -CC DFLAGS = -C2 -i -CC GRM = test.g SRC = test.cpp \ Expr.cpp \ $(ANTLR_H)/AParser.cpp $(ANTLR_H)/DLexerBase.cpp $(ANTLR_H)/ATokenBuffer.cpp $(SCAN).cpp OBJ = test.o \ Expr.o \ AParser.o DLexerBase.o ATokenBuffer.o $(SCAN).o ANTLR_SPAWN = test.cpp Expr.cpp \ Expr.h $(DLG_FILE) $(TOKENS) DLG_SPAWN = $(SCAN).cpp $(SCAN).h #CCC=g++ CCC=CC t : $(OBJ) $(SRC) $(CCC) -o t $(CFLAGS) $(OBJ) test.o : $(TOKENS) $(SCAN).h test.cpp $(CCC) -c $(CFLAGS) -o test.o test.cpp Expr.o : $(TOKENS) $(SCAN).h Expr.cpp Expr.h $(CCC) -c $(CFLAGS) -o Expr.o Expr.cpp $(SCAN).o : $(SCAN).cpp $(TOKENS) $(CCC) -c $(CFLAGS) -o $(SCAN).o $(SCAN).cpp $(ANTLR_SPAWN) : $(GRM) $(ANTLR) $(AFLAGS) $(GRM) $(DLG_SPAWN) : $(DLG_FILE) $(DLG) $(DFLAGS) $(DLG_FILE) AParser.o : $(ANTLR_H)/AParser.cpp $(CCC) -c $(CFLAGS) -o AParser.o $(ANTLR_H)/AParser.cpp ATokenBuffer.o : $(ANTLR_H)/ATokenBuffer.cpp $(CCC) -c $(CFLAGS) -o ATokenBuffer.o $(ANTLR_H)/ATokenBuffer.cpp DLexerBase.o : $(ANTLR_H)/DLexerBase.cpp $(CCC) -c $(CFLAGS) -o DLexerBase.o $(ANTLR_H)/DLexerBase.cpp clean: rm -f *.o core t scrub: rm -f *.o core t $(ANTLR_SPAWN) $(DLG_SPAWN) gtkwave-3.3.86/contrib/pccts/testcpp/1/test.g0000664000175000017500000000536613166335473020343 0ustar bybellbybell/* This is test.g which tests a simple DLG-based scanner. * No garbage collection for tokens since our token can't * handle ref counting. */ /* ANTLR will assign token type numbers (by creating an enum which you * get in tokens.h) */ << /* user must define ANTLRToken */ typedef char ANTLRChar; class ANTLRToken : public ANTLRAbstractToken { protected: ANTLRTokenType _type; // what's the token type of the token object int _line; // track line info for errors /* For our simple purposes, a token and a string is enough for * our attribute */ ANTLRChar _text[30]; public: ANTLRToken(ANTLRTokenType t, ANTLRChar *s) { setType(t); _line = 0; setText(s); } /* Your derived class MUST have a blank constructor. */ ANTLRToken() { setType((ANTLRTokenType)0); _line = 0; setText(""); } // how to access the token type and line number stuff ANTLRTokenType getType() const { return _type; } void setType(ANTLRTokenType t) { _type = t; } virtual int getLine() const { return _line; } void setLine(int line) { _line = line; } // // warning - casting away const in ANTLRToken::getText() const // ANTLRChar *getText() const { return (ANTLRChar *) _text; } void setText(const ANTLRChar *s) { strncpy(_text, s, 30); } /* WARNING WARNING WARNING: you must return a stream of distinct tokens */ /* This function will disappear when I can use templates */ virtual ANTLRAbstractToken *makeToken(ANTLRTokenType tt, ANTLRChar *txt, int line) { ANTLRAbstractToken *t = new ANTLRToken(tt,txt); t->setLine(line); return t; } }; /* "DLGLexer" must match what you use on DLG command line (-cl); * "DLGLexer" is the default. */ #include "DLGLexer.h" /* include definition of DLGLexer. * This cannot be generated automatically because * ANTLR has no idea what you will call this file * with the DLG command-line options. */ int main() { DLGFileInput in(stdin); /* create input stream for DLG to get chars from */ DLGLexer scan(&in); /* create scanner reading from stdin */ ANTLRTokenBuffer pipe(&scan);/* make buffered pipe between lexer&parser */ ANTLRTokenPtr aToken=new ANTLRToken; // create a token to fill in for DLG scan.setToken(mytoken(aToken)); Expr parser(&pipe); /* create parser of type Expr hooked to scanner */ parser.init(); /* init the parser; prime lookahead etc... */ parser.e(); /* start parsing at rule 'e' of that parser */ return 0; } >> #token "[\ \t\n]+" <> #token Eof "@" #tokclass My { IDENTIFIER NUMBER } class Expr { /* Define a grammar class */ e : My My Eof <getText(), $2->getText());>> ; } #token IDENTIFIER "[a-z]+" #token NUMBER "[0-9]+" gtkwave-3.3.86/contrib/pccts/testcpp/10/0000775000175000017500000000000013166335473017262 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/testcpp/10/makefile0000664000175000017500000000314613166335473020766 0ustar bybellbybell# # PCCTS makefile for: test.g # # Created from: ../../bin/genmk -CC -class Expr -project t test.g # # PCCTS release 1.32 # Project: t # C++ output # DLG scanner # ANTLR-defined token types # TOKENS = tokens.h # # The following filenames must be consistent with ANTLR/DLG flags DLG_FILE = parser.dlg ERR = err HDR_FILE = SCAN = DLGLexer PCCTS = ../.. ANTLR_H = $(PCCTS)/h BIN = $(PCCTS)/bin ANTLR = $(BIN)/antlr DLG = $(BIN)/dlg CFLAGS = -I. -I$(ANTLR_H) AFLAGS = -CC DFLAGS = -C2 -i -CC GRM = test.g SRC = test.cpp \ Expr.cpp \ $(ANTLR_H)/AParser.cpp $(ANTLR_H)/DLexerBase.cpp $(ANTLR_H)/ATokenBuffer.cpp $(SCAN).cpp OBJ = test.o \ Expr.o \ AParser.o DLexerBase.o ATokenBuffer.o $(SCAN).o ANTLR_SPAWN = test.cpp Expr.cpp \ Expr.h $(DLG_FILE) $(TOKENS) DLG_SPAWN = $(SCAN).cpp $(SCAN).h #CCC=g++ CCC=CC t : $(OBJ) $(SRC) $(CCC) -o t $(CFLAGS) $(OBJ) test.o : $(TOKENS) $(SCAN).h test.cpp $(CCC) -c $(CFLAGS) -o test.o test.cpp Expr.o : $(TOKENS) $(SCAN).h Expr.cpp Expr.h $(CCC) -c $(CFLAGS) -o Expr.o Expr.cpp $(SCAN).o : $(SCAN).cpp $(TOKENS) $(CCC) -c $(CFLAGS) -o $(SCAN).o $(SCAN).cpp $(ANTLR_SPAWN) : $(GRM) $(ANTLR) $(AFLAGS) $(GRM) $(DLG_SPAWN) : $(DLG_FILE) $(DLG) $(DFLAGS) $(DLG_FILE) AParser.o : $(ANTLR_H)/AParser.cpp $(CCC) -c $(CFLAGS) -o AParser.o $(ANTLR_H)/AParser.cpp ATokenBuffer.o : $(ANTLR_H)/ATokenBuffer.cpp $(CCC) -c $(CFLAGS) -o ATokenBuffer.o $(ANTLR_H)/ATokenBuffer.cpp DLexerBase.o : $(ANTLR_H)/DLexerBase.cpp $(CCC) -c $(CFLAGS) -o DLexerBase.o $(ANTLR_H)/DLexerBase.cpp clean: rm -f *.o core t scrub: rm -f *.o core t $(ANTLR_SPAWN) $(DLG_SPAWN) gtkwave-3.3.86/contrib/pccts/testcpp/10/test.g0000664000175000017500000000321513166335473020412 0ustar bybellbybell/* This tests a simple DLG-based scanner plus (...)? predicates */ << typedef ANTLRCommonToken ANTLRToken; #include "DLGLexer.h" #include "PBlackBox.h" int main() { ParserBlackBox p(stdin); p.parser()->begin(); return 0; } void doit(Expr *p) { printf("LT(1) is %s\n", ((ANTLRToken *)p->LT(1))->getText()); printf("LT(2) is %s\n", ((ANTLRToken *)p->LT(2))->getText()); printf("LT(3) is %s\n", ((ANTLRToken *)p->LT(3))->getText()); printf("LT(4) is %s\n", ((ANTLRToken *)p->LT(4))->getText()); printf("LT(5) is %s\n", ((ANTLRToken *)p->LT(5))->getText()); printf("LT(6) is %s\n", ((ANTLRToken *)p->LT(6))->getText()); printf("LT(7) is %s\n", ((ANTLRToken *)p->LT(7))->getText()); printf("LT(8) is %s\n", ((ANTLRToken *)p->LT(8))->getText()); printf("LT(9) is %s\n", ((ANTLRToken *)p->LT(9))->getText()); printf("LT(10) is %s\n", ((ANTLRToken *)p->LT(10))->getText()); printf("LT(11) is %s\n", ((ANTLRToken *)p->LT(11))->getText()); } >> #token "[\ \t\n]+" <> #token Eof "@" class Expr { /* Define a grammar class */ begin : <> e ; e : ( list "=" )? list "=" list Eof <> | list Eof <> ; list: "\(" (IDENTIFIER|NUMBER)* "\)" ; predict : ( "\(" (IDENTIFIER|NUMBER)* "\)" "=")? | "\(" "\)" "=" ; /* Here's another example... #token INT "int" #token SEMI ";" #token STAR "\*" #token ASSIGN "=" begin: "extern" "char" declarator ";" ; e : (decl)? | expr ; expr: IDENTIFIER "=" NUMBER ; decl: "int" declarator ";" ; declarator : ( "\*" )? "\*" declarator | IDENTIFIER ; */ } #token IDENTIFIER "[a-z]+" #token NUMBER "[0-9]+" gtkwave-3.3.86/contrib/pccts/testcpp/11/0000775000175000017500000000000013166335473017263 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/testcpp/11/test.g0000664000175000017500000000255013166335473020414 0ustar bybellbybell/* This is test.g which tests multiple scanners/parsers; DLG-based scanner; * also, we test multiple lexical classes. */ << #include "Lexer.h" typedef ANTLRCommonToken ANTLRToken; #include "PBlackBox.h" int main() { ParserBlackBox p(stdin); p.parser()->input(); return 0; } >> #token "[\ \t\n]+" <> #lexclass START class Include { << /* this is automatically defined to be a member function of Include:: * since it is within the "class {...}" boundaries. */ private: char *stripquotes(ANTLRChar *s) { s[strlen(s)-1] = '\0'; return &s[1]; } >> input : ( cmd | include )* "@" ; cmd : "print" ( NUMBER <getText());>> | STRING <getText());>> ) ; include : "#data" STRING <<{ FILE *f; f = fopen(stripquotes($2->getText()), "r"); if ( f==NULL ) {fprintf(stderr, "can't open %s\n", $2->getText()+1);} else { ANTLRTokenPtr aToken = new ANTLRToken; DLGFileInput in(f); Lexer scan(&in); scan.setToken(mytoken(aToken)); scan.mode(Lexer::DATA); ANTLRTokenBuffer pipe(&scan); Include parser(&pipe); parser.init(); parser.data(); } }>> ; #lexclass DATA #token "[\ \t\n]+" <> data: "0x[0-9]+" ":" "0x[0-9]+" <getText());>> ; } #lexclass START #token STRING "\" [a-zA-Z0-9_.,\ \t]+ \"" #token NUMBER "[0-9]+" gtkwave-3.3.86/contrib/pccts/testcpp/11/input.h0000664000175000017500000000001213166335473020564 0ustar bybellbybell0x3 : 0x4 gtkwave-3.3.86/contrib/pccts/testcpp/11/makefile0000664000175000017500000000323413166335473020765 0ustar bybellbybell# # PCCTS makefile for: test.g # # Created from: ../../bin/genmk -CC -project t -class Include test.g -dlg-class Lexer # # PCCTS release 1.32 # Project: t # C++ output # DLG scanner # ANTLR-defined token types # TOKENS = tokens.h # # The following filenames must be consistent with ANTLR/DLG flags DLG_FILE = parser.dlg ERR = err HDR_FILE = SCAN = Lexer PCCTS = ../.. ANTLR_H = $(PCCTS)/h BIN = $(PCCTS)/bin ANTLR = $(BIN)/antlr DLG = $(BIN)/dlg CFLAGS = -I. -I$(ANTLR_H) AFLAGS = -CC DFLAGS = -C2 -i -CC -cl Lexer GRM = test.g SRC = test.cpp \ Include.cpp \ $(ANTLR_H)/AParser.cpp $(ANTLR_H)/DLexerBase.cpp $(ANTLR_H)/ATokenBuffer.cpp $(SCAN).cpp OBJ = test.o \ Include.o \ AParser.o DLexerBase.o ATokenBuffer.o $(SCAN).o ANTLR_SPAWN = test.cpp Include.cpp \ Include.h $(DLG_FILE) $(TOKENS) DLG_SPAWN = $(SCAN).cpp $(SCAN).h #CCC=g++ CCC=CC t : $(OBJ) $(SRC) $(CCC) -o t $(CFLAGS) $(OBJ) test.o : $(TOKENS) $(SCAN).h test.cpp $(CCC) -c $(CFLAGS) -o test.o test.cpp Include.o : $(TOKENS) $(SCAN).h Include.cpp Include.h $(CCC) -c $(CFLAGS) -o Include.o Include.cpp $(SCAN).o : $(SCAN).cpp $(TOKENS) $(CCC) -c $(CFLAGS) -o $(SCAN).o $(SCAN).cpp $(ANTLR_SPAWN) : $(GRM) $(ANTLR) $(AFLAGS) $(GRM) $(DLG_SPAWN) : $(DLG_FILE) $(DLG) $(DFLAGS) $(DLG_FILE) AParser.o : $(ANTLR_H)/AParser.cpp $(CCC) -c $(CFLAGS) -o AParser.o $(ANTLR_H)/AParser.cpp ATokenBuffer.o : $(ANTLR_H)/ATokenBuffer.cpp $(CCC) -c $(CFLAGS) -o ATokenBuffer.o $(ANTLR_H)/ATokenBuffer.cpp DLexerBase.o : $(ANTLR_H)/DLexerBase.cpp $(CCC) -c $(CFLAGS) -o DLexerBase.o $(ANTLR_H)/DLexerBase.cpp clean: rm -f *.o core t scrub: rm -f *.o core t $(ANTLR_SPAWN) $(DLG_SPAWN) gtkwave-3.3.86/contrib/pccts/testcpp/2/0000775000175000017500000000000013166335473017203 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/testcpp/2/test.g0000664000175000017500000000207513166335473020336 0ustar bybellbybell/* Ariel Tamches (tamches@cs.wisc.edu): * This tests linking in a simple non-DLG scanner */ /* We assume that #tokdefs is not employed for this example; i.e., * ANTLR assigns token numbers. * * ANTLR option -gx must be used to turn off generation of DLG crud (when you * want to define your own token stream). */ /* user must define ANTLRToken outside of #header */ << typedef ANTLRCommonToken ANTLRToken; /* use a predefined Token class */ >> /* At this point, ANTLRToken and ANTLRTokenStream are defined, user must now * derive a class from ANTLRTokenStream (which embodies the user's scanner) */ <<#include "MyLexer.h">> << int main() { /* create one of my scanners */ MyLexer scan; ANTLRTokenBuffer pipe(&scan); /* create a parser of type Expr hooked to my scanner */ Expr parser(&pipe); parser.init(); parser.setEofToken(Eof); parser.e(); /* start parsing at rule 'e' of that parser */ return 0; } >> class Expr { /* Define a grammar class */ e : IDENTIFIER NUMBER <getText(), $2->getText());>> Eof ; } gtkwave-3.3.86/contrib/pccts/testcpp/2/MyLexer.cpp0000664000175000017500000000330013166335473021270 0ustar bybellbybell/* MyTokenBuffer.c */ /* Sample replacement for DLGLexer */ /* Shows how to override DLG with your own lexer */ #include #include #include #include #include "config.h" /* include token defs */ #include "tokens.h" /* include token defs */ #include APARSER_H /* include all the ANTLR yuck */ #include "MyLexer.h" /* define your lexer */ typedef ANTLRCommonToken ANTLRToken;/* use a predefined Token class */ void panic(char *s) { cerr << s << '\n'; exit(5); } MyLexer::MyLexer() { c = getchar(); } /* Recognizes Tokens IDENTIFIER and NUMBER */ ANTLRAbstractToken *MyLexer:: getToken() { /* we will return a pointer to this next guy */ ANTLRToken *resultToken = new ANTLRToken; ANTLRChar TokenBuffer[100]; /* This routine will just crash if tokens become more than 99 chars; your code must of course gracefully recover/adapt */ int index=0; while ( c==' ' || c=='\n' ) c=getchar(); if (c==EOF) {resultToken->setType(Eof); return resultToken;} if (isdigit(c)) { /* Looks like we have ourselves a number token */ while (isdigit(c)) { TokenBuffer[index++]=c; c = getchar(); } TokenBuffer[index]='\0'; resultToken->setType(NUMBER); resultToken->setText(TokenBuffer); return resultToken; } if (isalpha(c)) { /* We have ourselves an IDENTIFIER token */ while (isalpha(c)) { TokenBuffer[index++]=c; c = getchar(); } TokenBuffer[index]='\0'; resultToken->setType(IDENTIFIER); resultToken->setText(TokenBuffer); return resultToken; } else panic("lexer error"); return NULL; } gtkwave-3.3.86/contrib/pccts/testcpp/2/MyLexer.h0000664000175000017500000000025313166335473020741 0ustar bybellbybell/* MyTokenBuffer.h */ #include ATOKENBUFFER_H class MyLexer : public ANTLRTokenStream { private: int c; public: MyLexer(); virtual ANTLRAbstractToken *getToken(); }; gtkwave-3.3.86/contrib/pccts/testcpp/2/makefile0000664000175000017500000000254613166335473020712 0ustar bybellbybell# # PCCTS makefile for: test.g # # Created from: ../../bin/genmk -CC -project t -class Expr test.g -user-lexer # # PCCTS release 1.32 # Project: t # C++ output # User-defined scanner # ANTLR-defined token types # TOKENS = tokens.h # # The following filenames must be consistent with ANTLR/DLG flags DLG_FILE = parser.dlg ERR = err HDR_FILE = SCAN = DLGLexer PCCTS = ../.. ANTLR_H = $(PCCTS)/h BIN = $(PCCTS)/bin ANTLR = $(BIN)/antlr DLG = $(BIN)/dlg CFLAGS = -I. -I$(ANTLR_H) AFLAGS = -gx -CC DFLAGS = -C2 -i -CC GRM = test.g SRC = test.cpp \ Expr.cpp \ $(ANTLR_H)/AParser.cpp $(ANTLR_H)/ATokenBuffer.cpp MyLexer.cpp OBJ = test.o \ Expr.o \ AParser.o ATokenBuffer.o MyLexer.o ANTLR_SPAWN = test.cpp Expr.cpp \ Expr.h $(TOKENS) #CCC=g++ CCC=CC t : $(OBJ) $(SRC) $(CCC) -o t $(CFLAGS) $(OBJ) test.o : $(TOKENS) test.cpp $(CCC) -c $(CFLAGS) -o test.o test.cpp MyLexer.o : $(TOKENS) MyLexer.cpp $(CCC) -c $(CFLAGS) -o MyLexer.o MyLexer.cpp Expr.o : $(TOKENS) Expr.cpp Expr.h $(CCC) -c $(CFLAGS) -o Expr.o Expr.cpp $(ANTLR_SPAWN) : $(GRM) $(ANTLR) $(AFLAGS) $(GRM) AParser.o : $(ANTLR_H)/AParser.cpp $(CCC) -c $(CFLAGS) -o AParser.o $(ANTLR_H)/AParser.cpp ATokenBuffer.o : $(ANTLR_H)/ATokenBuffer.cpp $(CCC) -c $(CFLAGS) -o ATokenBuffer.o $(ANTLR_H)/ATokenBuffer.cpp clean: rm -f *.o core t scrub: rm -f *.o core t $(ANTLR_SPAWN) gtkwave-3.3.86/contrib/pccts/testcpp/12/0000775000175000017500000000000013166335473017264 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/testcpp/12/makefile0000664000175000017500000000314613166335473020770 0ustar bybellbybell# # PCCTS makefile for: test.g # # Created from: ../../bin/genmk -CC -class Expr -project t test.g # # PCCTS release 1.32 # Project: t # C++ output # DLG scanner # ANTLR-defined token types # TOKENS = tokens.h # # The following filenames must be consistent with ANTLR/DLG flags DLG_FILE = parser.dlg ERR = err HDR_FILE = SCAN = DLGLexer PCCTS = ../.. ANTLR_H = $(PCCTS)/h BIN = $(PCCTS)/bin ANTLR = $(BIN)/antlr DLG = $(BIN)/dlg CFLAGS = -I. -I$(ANTLR_H) AFLAGS = -CC DFLAGS = -C2 -i -CC GRM = test.g SRC = test.cpp \ Expr.cpp \ $(ANTLR_H)/AParser.cpp $(ANTLR_H)/DLexerBase.cpp $(ANTLR_H)/ATokenBuffer.cpp $(SCAN).cpp OBJ = test.o \ Expr.o \ AParser.o DLexerBase.o ATokenBuffer.o $(SCAN).o ANTLR_SPAWN = test.cpp Expr.cpp \ Expr.h $(DLG_FILE) $(TOKENS) DLG_SPAWN = $(SCAN).cpp $(SCAN).h #CCC=g++ CCC=CC t : $(OBJ) $(SRC) $(CCC) -o t $(CFLAGS) $(OBJ) test.o : $(TOKENS) $(SCAN).h test.cpp $(CCC) -c $(CFLAGS) -o test.o test.cpp Expr.o : $(TOKENS) $(SCAN).h Expr.cpp Expr.h $(CCC) -c $(CFLAGS) -o Expr.o Expr.cpp $(SCAN).o : $(SCAN).cpp $(TOKENS) $(CCC) -c $(CFLAGS) -o $(SCAN).o $(SCAN).cpp $(ANTLR_SPAWN) : $(GRM) $(ANTLR) $(AFLAGS) $(GRM) $(DLG_SPAWN) : $(DLG_FILE) $(DLG) $(DFLAGS) $(DLG_FILE) AParser.o : $(ANTLR_H)/AParser.cpp $(CCC) -c $(CFLAGS) -o AParser.o $(ANTLR_H)/AParser.cpp ATokenBuffer.o : $(ANTLR_H)/ATokenBuffer.cpp $(CCC) -c $(CFLAGS) -o ATokenBuffer.o $(ANTLR_H)/ATokenBuffer.cpp DLexerBase.o : $(ANTLR_H)/DLexerBase.cpp $(CCC) -c $(CFLAGS) -o DLexerBase.o $(ANTLR_H)/DLexerBase.cpp clean: rm -f *.o core t scrub: rm -f *.o core t $(ANTLR_SPAWN) $(DLG_SPAWN) gtkwave-3.3.86/contrib/pccts/testcpp/12/test.g0000664000175000017500000000201613166335473020412 0ustar bybellbybell/* This is test.g which tests a simple DLG-based scanner using string input */ << typedef ANTLRCommonToken ANTLRToken; #include "DLGLexer.h" #include "PBlackBox.h" int main(int argc, char **argv) { if ( argc==1 ) {fprintf(stderr, "how about an argument?\n"); exit(1);} DLGStringInput in(argv[1]); /* create an input stream for DLG */ DLGLexer scan(&in); /* create scanner reading from stdin */ ANTLRTokenBuffer pipe(&scan); /* make pipe between lexer & parser */ ANTLRTokenPtr aToken = new ANTLRToken; scan.setToken(mytoken(aToken)); Expr parser(&pipe); /* create parser of type Expr hooked to scanner */ parser.init(); /* init the parser; prime lookahead etc... */ parser.e(); /* start parsing at rule 'e' of that parser */ return 0; } >> #token "[\ \t\n]+" <> #token Eof "@" #tokclass My { IDENTIFIER NUMBER } class Expr { /* Define a grammar class */ e : My My Eof <getText(), $2->getText());>> ; } #token IDENTIFIER "[a-z]+" #token NUMBER "[0-9]+" gtkwave-3.3.86/contrib/pccts/testcpp/3/0000775000175000017500000000000013166335473017204 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/testcpp/3/test.g0000664000175000017500000000253213166335473020335 0ustar bybellbybell/* Ariel Tamches (tamches@cs.wisc.edu): * This tests linking in a simple non-DLG scanner with user-defined token * types. */ /* All TokenType's must have some end-of-file token; You must define * it with setEofToken() to your end of input token. * * We assume that #tokdefs is employed for this example; i.e., ANTLR does * NOT assign token numbers. * * ANTLR option -gx must be used to turn off generation of DLG crud (when you * want to define your own token stream). */ #tokdefs "mytokens.h" /* user should define ANTLRToken outside of #header since AToken.h would * not have been included yet. You can force inclusion of AToken.h if * you must use #header, however. */ << typedef ANTLRCommonToken ANTLRToken; /* use a predefined Token class */ >> /* At this point, ANTLRToken and ANTLRTokenStream are defined, user must now * derive a class from ANTLRTokenStream (which embodies the user's scanner) */ <<#include "MyLexer.h">> << int main() { /* create one of my scanners */ MyLexer scan; ANTLRTokenBuffer pipe(&scan); /* create a parser of type Expr hooked to my scanner */ Expr parser(&pipe); parser.init(); parser.setEofToken(Eof); parser.e(); /* start parsing at rule 'e' of that parser */ return 0; } >> class Expr { e : IDENTIFIER NUMBER <getText(), $2->getText());>> Eof ; } gtkwave-3.3.86/contrib/pccts/testcpp/3/MyLexer.cpp0000664000175000017500000000342513166335473021301 0ustar bybellbybell/* MyTokenBuffer.c */ /* Sample replacement for DLGLexer */ /* Shows how to override DLG with your own lexer */ #include #include #include #include #include "config.h" /* include token defs */ #include "mytokens.h" /* include token defs */ #include APARSER_H /* include all the ANTLR yuck */ #include "MyLexer.h" /* define your lexer */ typedef ANTLRCommonToken ANTLRToken;/* use a predefined Token class */ void panic(char *s) { cerr << s << '\n'; exit(5); } MyLexer::MyLexer() { c = getchar(); } /* Recognizes Tokens IDENTIFIER and NUMBER */ ANTLRAbstractToken *MyLexer:: getToken() { /* we will return a pointer to this next guy */ ANTLRToken *resultToken = new ANTLRToken; ANTLRChar TokenBuffer[100]; /* This routine will just crash if tokens become more than 99 chars; your code must of course gracefully recover/adapt */ int index=0; while ( c==' ' || c=='\n' ) c=getchar(); if (c==EOF) {resultToken->setType(Eof); return resultToken;} if (isdigit(c)) { /* Looks like we have ourselves a number token */ while (isdigit(c)) { TokenBuffer[index++]=c; c = getchar(); } TokenBuffer[index]='\0'; resultToken->setType(NUMBER); resultToken->setText(TokenBuffer); /* not exactly swift, unfortunately... */ return resultToken; } if (isalpha(c)) { /* We have ourselves an IDENTIFIER token */ while (isalpha(c)) { TokenBuffer[index++]=c; c = getchar(); } TokenBuffer[index]='\0'; resultToken->setType(IDENTIFIER); resultToken->setText(TokenBuffer); /* not exactly swift, unfortunately... */ return resultToken; } else panic("lexer error"); return NULL; } gtkwave-3.3.86/contrib/pccts/testcpp/3/MyLexer.h0000664000175000017500000000025313166335473020742 0ustar bybellbybell/* MyTokenBuffer.h */ #include ATOKENBUFFER_H class MyLexer : public ANTLRTokenStream { private: int c; public: MyLexer(); virtual ANTLRAbstractToken *getToken(); }; gtkwave-3.3.86/contrib/pccts/testcpp/3/makefile0000664000175000017500000000270613166335473020711 0ustar bybellbybell# # PCCTS makefile for: test.g # # Created from: ../../bin/genmk -CC -project t -class Expr test.g -user-lexer -token-types mytokens.h # # PCCTS release 1.32 # Project: t # C++ output # User-defined scanner # User-defined token types in 'mytokens.h' # # Make sure #tokdefs directive in ANTLR grammar lists this file: TOKENS = mytokens.h # # The following filenames must be consistent with ANTLR/DLG flags DLG_FILE = parser.dlg ERR = err HDR_FILE = SCAN = DLGLexer PCCTS = ../.. ANTLR_H = $(PCCTS)/h BIN = $(PCCTS)/bin ANTLR = $(BIN)/antlr DLG = $(BIN)/dlg CFLAGS = -I. -I$(ANTLR_H) AFLAGS = -gx -CC DFLAGS = -C2 -i -CC GRM = test.g SRC = test.cpp \ Expr.cpp \ $(ANTLR_H)/AParser.cpp $(ANTLR_H)/ATokenBuffer.cpp MyLexer.cpp OBJ = test.o \ Expr.o \ AParser.o ATokenBuffer.o MyLexer.o ANTLR_SPAWN = test.cpp Expr.cpp \ Expr.h #CCC=g++ CCC=CC t : $(OBJ) $(SRC) $(CCC) -o t $(CFLAGS) $(OBJ) test.o : $(TOKENS) test.cpp $(CCC) -c $(CFLAGS) -o test.o test.cpp MyLexer.o : $(TOKENS) MyLexer.cpp $(CCC) -c $(CFLAGS) -o MyLexer.o MyLexer.cpp Expr.o : $(TOKENS) Expr.cpp Expr.h $(CCC) -c $(CFLAGS) -o Expr.o Expr.cpp $(ANTLR_SPAWN) : $(GRM) $(ANTLR) $(AFLAGS) $(GRM) AParser.o : $(ANTLR_H)/AParser.cpp $(CCC) -c $(CFLAGS) -o AParser.o $(ANTLR_H)/AParser.cpp ATokenBuffer.o : $(ANTLR_H)/ATokenBuffer.cpp $(CCC) -c $(CFLAGS) -o ATokenBuffer.o $(ANTLR_H)/ATokenBuffer.cpp clean: rm -f *.o core t scrub: rm -f *.o core t $(ANTLR_SPAWN) gtkwave-3.3.86/contrib/pccts/testcpp/3/mytokens.h0000664000175000017500000000007213166335473021225 0ustar bybellbybellenum ANTLRTokenType { IDENTIFIER=1, NUMBER=2, Eof=3 }; gtkwave-3.3.86/contrib/pccts/testcpp/Makefile.in0000664000175000017500000003157013166335473021115 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = contrib/pccts/testcpp DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ 1/makefile 1/test.g \ 2/MyLexer.cpp 2/MyLexer.h 2/makefile 2/test.g \ 3/MyLexer.cpp 3/MyLexer.h 3/makefile 3/mytokens.h 3/test.g \ 4/makefile 4/mytokens.h 4/test.g \ 5/input.h 5/makefile 5/test.g \ 6/file1 6/file2 6/main.cpp 6/makefile 6/makefile2 6/test.g 6/test2.g \ 7/makefile 7/test.g \ 8/main.cpp 8/makefile 8/test.g \ 9/makefile 9/test.g \ 10/makefile 10/test.g \ 11/input.h 11/makefile 11/test.g \ 12/makefile 12/test.g \ 13/makefile 13/test.g all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/pccts/testcpp/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/pccts/testcpp/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/contrib/pccts/testcpp/13/0000775000175000017500000000000013166335473017265 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/testcpp/13/makefile0000664000175000017500000000321613166335473020767 0ustar bybellbybell# # PCCTS makefile for: test.g # # Created from: ../../bin/genmk -CC -class PEHTest -project t test.g # # PCCTS release 1.32 # Project: t # C++ output # DLG scanner # ANTLR-defined token types # TOKENS = tokens.h # # The following filenames must be consistent with ANTLR/DLG flags DLG_FILE = parser.dlg ERR = err HDR_FILE = SCAN = DLGLexer PCCTS = ../.. ANTLR_H = $(PCCTS)/h BIN = $(PCCTS)/bin ANTLR = $(BIN)/antlr DLG = $(BIN)/dlg CFLAGS = -I. -I$(ANTLR_H) AFLAGS = -CC $(AOTHER) DFLAGS = -C2 -i -CC GRM = test.g SRC = test.cpp \ PEHTest.cpp \ $(ANTLR_H)/AParser.cpp $(ANTLR_H)/DLexerBase.cpp $(ANTLR_H)/ATokenBuffer.cpp $(SCAN).cpp OBJ = test.o \ PEHTest.o \ AParser.o DLexerBase.o ATokenBuffer.o $(SCAN).o ANTLR_SPAWN = test.cpp PEHTest.cpp \ PEHTest.h $(DLG_FILE) $(TOKENS) DLG_SPAWN = $(SCAN).cpp $(SCAN).h #CCC=g++ CCC=CC t : $(OBJ) $(SRC) $(CCC) -o t $(CFLAGS) $(OBJ) test.o : $(TOKENS) $(SCAN).h test.cpp $(CCC) -c $(CFLAGS) -o test.o test.cpp PEHTest.o : $(TOKENS) $(SCAN).h PEHTest.cpp PEHTest.h $(CCC) -c $(CFLAGS) -o PEHTest.o PEHTest.cpp $(SCAN).o : $(SCAN).cpp $(TOKENS) $(CCC) -c $(CFLAGS) -o $(SCAN).o $(SCAN).cpp $(ANTLR_SPAWN) : $(GRM) $(ANTLR) $(AFLAGS) $(GRM) $(DLG_SPAWN) : $(DLG_FILE) $(DLG) $(DFLAGS) $(DLG_FILE) AParser.o : $(ANTLR_H)/AParser.cpp $(CCC) -c $(CFLAGS) -o AParser.o $(ANTLR_H)/AParser.cpp ATokenBuffer.o : $(ANTLR_H)/ATokenBuffer.cpp $(CCC) -c $(CFLAGS) -o ATokenBuffer.o $(ANTLR_H)/ATokenBuffer.cpp DLexerBase.o : $(ANTLR_H)/DLexerBase.cpp $(CCC) -c $(CFLAGS) -o DLexerBase.o $(ANTLR_H)/DLexerBase.cpp clean: rm -f *.o core t scrub: rm -f *.o core t $(ANTLR_SPAWN) $(DLG_SPAWN) gtkwave-3.3.86/contrib/pccts/testcpp/13/test.g0000664000175000017500000000255713166335473020425 0ustar bybellbybell/* C++ interface test of Parser Exception Handling * * Given input: * * if a+ then a=b+b; * * the program should respond with * * invalid conditional in 'if' statement * found assignment to a */ << #include #include "DLGLexer.h" #include "PBlackBox.h" typedef ANTLRCommonToken ANTLRToken; int main() { ParserBlackBox p(stdin); int retsignal; p.parser()->rule(&retsignal); return 0; } >> /* Uncommenting this will make ANTLR think you put these handlers at the end of each rule: exception catch MismatchedToken : <> default : <> */ #token "[\ \t]+" <> #token "\n" <> #token THEN "then" #tokclass DIE { "@" "if" ID "else" } class PEHTest { rule: ( stat )+ ; stat: "if" t:expr THEN stat { "else" stat } | id:ID "=" expr ";" <getText());>> ; exception[t] default : << printf("invalid conditional in 'if' statement\n"); consumeUntilToken(THEN); suppressSignal; >> exception catch MismatchedToken : catch NoViableAlt : catch NoSemViableAlt : << printf("stat:caught predefined signal\n"); consumeUntil(DIE_set); suppressSignal; >> expr: expr1 ("\+" expr1)* ; expr1 : expr2 ("\*" expr2)* ; expr2: ID ; } #token ID "[a-z]+" gtkwave-3.3.86/contrib/pccts/testcpp/4/0000775000175000017500000000000013166335473017205 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/testcpp/4/test.g0000664000175000017500000000171713166335473020342 0ustar bybellbybell/* This is test.g which tests a simple DLG-based scanner * with user-defined tokens */ /* Here, we use #tokdefs to define token types, but still let DLG do the * lexing. ANTLR will not create a tokens.h file. */ #tokdefs "mytokens.h" << #include "DLGLexer.h" /* include definition of DLGLexer. * This cannot be generated automatically because * ANTLR has no idea what you will call this file * with the DLG command-line options. */ typedef ANTLRCommonToken ANTLRToken; int main() { ANTLRTokenPtr aToken = new ANTLRToken; DLGFileInput in(stdin); DLGLexer scan(&in); ANTLRTokenBuffer pipe(&scan); scan.setToken(mytoken(aToken)); Expr parser(&pipe); parser.init(); parser.e(); return 0; } >> #token "[\ \t\n]+" <> class Expr { /* Define a grammar class */ e : IDENTIFIER NUMBER "@" <getText(), $2->getText());>> ; } #token IDENTIFIER "[a-z]+" #token NUMBER "[0-9]+" gtkwave-3.3.86/contrib/pccts/testcpp/4/makefile0000664000175000017500000000330613166335473020707 0ustar bybellbybell# # PCCTS makefile for: test.g # # Created from: ../../bin/genmk -CC -project t -class Expr test.g -token-types mytokens.h # # PCCTS release 1.32 # Project: t # C++ output # DLG scanner # User-defined token types in 'mytokens.h' # # Make sure #tokdefs directive in ANTLR grammar lists this file: TOKENS = mytokens.h # # The following filenames must be consistent with ANTLR/DLG flags DLG_FILE = parser.dlg ERR = err HDR_FILE = SCAN = DLGLexer PCCTS = ../.. ANTLR_H = $(PCCTS)/h BIN = $(PCCTS)/bin ANTLR = $(BIN)/antlr DLG = $(BIN)/dlg CFLAGS = -I. -I$(ANTLR_H) AFLAGS = -CC DFLAGS = -C2 -i -CC GRM = test.g SRC = test.cpp \ Expr.cpp \ $(ANTLR_H)/AParser.cpp $(ANTLR_H)/DLexerBase.cpp $(ANTLR_H)/ATokenBuffer.cpp $(SCAN).cpp OBJ = test.o \ Expr.o \ AParser.o DLexerBase.o ATokenBuffer.o $(SCAN).o ANTLR_SPAWN = test.cpp Expr.cpp \ Expr.h $(DLG_FILE) DLG_SPAWN = $(SCAN).cpp $(SCAN).h #CCC=g++ CCC=CC t : $(OBJ) $(SRC) $(CCC) -o t $(CFLAGS) $(OBJ) test.o : $(TOKENS) $(SCAN).h test.cpp $(CCC) -c $(CFLAGS) -o test.o test.cpp Expr.o : $(TOKENS) $(SCAN).h Expr.cpp Expr.h $(CCC) -c $(CFLAGS) -o Expr.o Expr.cpp $(SCAN).o : $(SCAN).cpp $(TOKENS) $(CCC) -c $(CFLAGS) -o $(SCAN).o $(SCAN).cpp $(ANTLR_SPAWN) : $(GRM) $(ANTLR) $(AFLAGS) $(GRM) $(DLG_SPAWN) : $(DLG_FILE) $(DLG) $(DFLAGS) $(DLG_FILE) AParser.o : $(ANTLR_H)/AParser.cpp $(CCC) -c $(CFLAGS) -o AParser.o $(ANTLR_H)/AParser.cpp ATokenBuffer.o : $(ANTLR_H)/ATokenBuffer.cpp $(CCC) -c $(CFLAGS) -o ATokenBuffer.o $(ANTLR_H)/ATokenBuffer.cpp DLexerBase.o : $(ANTLR_H)/DLexerBase.cpp $(CCC) -c $(CFLAGS) -o DLexerBase.o $(ANTLR_H)/DLexerBase.cpp clean: rm -f *.o core t scrub: rm -f *.o core t $(ANTLR_SPAWN) $(DLG_SPAWN) gtkwave-3.3.86/contrib/pccts/testcpp/4/mytokens.h0000664000175000017500000000006213166335473021225 0ustar bybellbybellenum ANTLRTokenType { IDENTIFIER=2, NUMBER=3 }; gtkwave-3.3.86/contrib/pccts/testcpp/5/0000775000175000017500000000000013166335473017206 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/testcpp/5/makefile0000664000175000017500000000323413166335473020710 0ustar bybellbybell# # PCCTS makefile for: test.g # # Created from: ../../bin/genmk -CC -project t -class Include test.g -dlg-class Lexer # # PCCTS release 1.32 # Project: t # C++ output # DLG scanner # ANTLR-defined token types # TOKENS = tokens.h # # The following filenames must be consistent with ANTLR/DLG flags DLG_FILE = parser.dlg ERR = err HDR_FILE = SCAN = Lexer PCCTS = ../.. ANTLR_H = $(PCCTS)/h BIN = $(PCCTS)/bin ANTLR = $(BIN)/antlr DLG = $(BIN)/dlg CFLAGS = -I. -I$(ANTLR_H) AFLAGS = -CC DFLAGS = -C2 -i -CC -cl Lexer GRM = test.g SRC = test.cpp \ Include.cpp \ $(ANTLR_H)/AParser.cpp $(ANTLR_H)/DLexerBase.cpp $(ANTLR_H)/ATokenBuffer.cpp $(SCAN).cpp OBJ = test.o \ Include.o \ AParser.o DLexerBase.o ATokenBuffer.o $(SCAN).o ANTLR_SPAWN = test.cpp Include.cpp \ Include.h $(DLG_FILE) $(TOKENS) DLG_SPAWN = $(SCAN).cpp $(SCAN).h #CCC=g++ CCC=CC t : $(OBJ) $(SRC) $(CCC) -o t $(CFLAGS) $(OBJ) test.o : $(TOKENS) $(SCAN).h test.cpp $(CCC) -c $(CFLAGS) -o test.o test.cpp Include.o : $(TOKENS) $(SCAN).h Include.cpp Include.h $(CCC) -c $(CFLAGS) -o Include.o Include.cpp $(SCAN).o : $(SCAN).cpp $(TOKENS) $(CCC) -c $(CFLAGS) -o $(SCAN).o $(SCAN).cpp $(ANTLR_SPAWN) : $(GRM) $(ANTLR) $(AFLAGS) $(GRM) $(DLG_SPAWN) : $(DLG_FILE) $(DLG) $(DFLAGS) $(DLG_FILE) AParser.o : $(ANTLR_H)/AParser.cpp $(CCC) -c $(CFLAGS) -o AParser.o $(ANTLR_H)/AParser.cpp ATokenBuffer.o : $(ANTLR_H)/ATokenBuffer.cpp $(CCC) -c $(CFLAGS) -o ATokenBuffer.o $(ANTLR_H)/ATokenBuffer.cpp DLexerBase.o : $(ANTLR_H)/DLexerBase.cpp $(CCC) -c $(CFLAGS) -o DLexerBase.o $(ANTLR_H)/DLexerBase.cpp clean: rm -f *.o core t scrub: rm -f *.o core t $(ANTLR_SPAWN) $(DLG_SPAWN) gtkwave-3.3.86/contrib/pccts/testcpp/5/test.g0000664000175000017500000000237513166335473020344 0ustar bybellbybell/* This is test.g which tests multiple scanners/parsers; DLG-based scanner */ << #include "Lexer.h" typedef ANTLRCommonToken ANTLRToken; int main() { ANTLRTokenPtr aToken = new ANTLRToken; DLGFileInput in(stdin); Lexer scan(&in); scan.setToken(mytoken(aToken)); ANTLRTokenBuffer pipe(&scan); Include parser(&pipe); parser.init(); parser.input(); return 0; } >> #token "[\ \t\n]+" <> #token Eof "@" class Include { << /* this is automatically defined to be a member function of Include:: * since it is within the "class {...}" boundaries. */ private: char *stripquotes(ANTLRChar *s) { s[strlen(s)-1] = '\0'; return &s[1]; } >> input : ( cmd | include )* Eof ; cmd : "print" ( NUMBER <getText());>> | STRING <getText());>> ) ; include : "#include" STRING <<{ FILE *f; f = fopen(stripquotes($2->getText()), "r"); if ( f==NULL ) {fprintf(stderr, "can't open %s\n", $2->getText()+1);} else { ANTLRTokenPtr aToken = new ANTLRToken; DLGFileInput in(f); Lexer scan(&in); scan.setToken(mytoken(aToken)); ANTLRTokenBuffer pipe(&scan); Include parser(&pipe); parser.init(); parser.input(); } }>> ; } #token STRING "\" [a-zA-Z0-9_.,\ \t]+ \"" #token NUMBER "[0-9]+" gtkwave-3.3.86/contrib/pccts/testcpp/5/input.h0000664000175000017500000000003513166335473020514 0ustar bybellbybellprint 34 print "hello world" gtkwave-3.3.86/contrib/pccts/testcpp/6/0000775000175000017500000000000013166335473017207 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/testcpp/6/makefile0000664000175000017500000000352513166335473020714 0ustar bybellbybell# # PCCTS makefile for: test.g # # PCCTS release 1.21 # Project: t # C++ output # D scanner # A-defined token types # TOKENS = A/tokens.h # # The following filenames must be consistent with A/D flags D_FILE = A/parser.dlg ERR = A/err HDR_FILE = SCAN = A/ALexer PCCTS = ../.. A_H = $(PCCTS)/h BIN = $(PCCTS)/bin A = $(BIN)/antlr D = $(BIN)/dlg CFLAGS = -I. -I$(A_H) -IA -IB -g # # Delay lookahead so that an extra fetch is not done by # 'A' parser which is needed by 'B' parser. # AFLAGS = -o A -CC DFLAGS = -C2 -i -CC -cl ALexer -o A GRM = test.g SRC = A/test.cpp \ A/A.cpp \ $(A_H)/AParser.cpp $(A_H)/DLexerBase.cpp $(SCAN).cpp main.cpp \ $(A_H)/ATokenBuffer.cpp OBJ = A/test.o A/A.o A/AParser.o A/DLexerBase.o $(SCAN).o main.o \ A/ATokenBuffer.o OBJ2 = B/test2.o B/B.o B/BLexer.o A_SPAWN = A/test.cpp A/A.cpp \ A/A.h \ $(HDR_FILE) $(D_FILE) $(TOKENS) D_SPAWN = $(SCAN).cpp $(SCAN).h #CCC=g++ CCC=CC t: $(OBJ) $(OBJ2) $(SRC) make -f makefile2 $(CCC) -o t $(CFLAGS) $(OBJ) $(OBJ2) A/test.o : $(TOKENS) $(SCAN).h A/test.cpp $(HDR_FILE) $(CCC) -c $(CFLAGS) -o A/test.o A/test.cpp A/A.o : $(TOKENS) $(SCAN).h A/A.cpp A/A.h $(HDR_FILE) $(CCC) -c $(CFLAGS) -o A/A.o A/A.cpp $(SCAN).o : $(SCAN).cpp $(TOKENS) $(CCC) -c $(CFLAGS) -o $(SCAN).o $(SCAN).cpp $(A_SPAWN) : $(GRM) $(A) $(AFLAGS) $(GRM) $(D_SPAWN) : $(D_FILE) $(D) $(DFLAGS) $(D_FILE) A/ATokenBuffer.o : $(A_H)/ATokenBuffer.cpp $(CCC) -c $(CFLAGS) -o A/ATokenBuffer.o $(A_H)/ATokenBuffer.cpp A/AParser.o : $(A_H)/AParser.cpp $(CCC) -c $(CFLAGS) -o A/AParser.o $(A_H)/AParser.cpp A/DLexerBase.o : $(A_H)/DLexerBase.cpp $(CCC) -c $(CFLAGS) -o A/DLexerBase.o $(A_H)/DLexerBase.cpp main.o : main.cpp B/B.h $(CCC) -c $(CFLAGS) -o main.o main.cpp B/B.h : make -f makefile2 clean: rm -f *.o core t A/*.o scrub: rm -f *.o core t A/*.o $(A_SPAWN) $(D_SPAWN) gtkwave-3.3.86/contrib/pccts/testcpp/6/makefile20000664000175000017500000000220213166335473020765 0ustar bybellbybell# # PCCTS makefile for: test2.g # # PCCTS release 1.21 # Project: t # C++ output # D scanner # A-defined token types # TOKENS = B/tokens.h # # The following filenames must be consistent with A/D flags D_FILE = B/parser.dlg ERR = B/err HDR_FILE = SCAN = B/BLexer PCCTS = ../.. A_H = $(PCCTS)/h BIN = $(PCCTS)/bin A = $(BIN)/antlr D = $(BIN)/dlg CFLAGS = -I. -I$(A_H) -IB -g AFLAGS = -o B -CC DFLAGS = -C2 -i -CC -cl BLexer -o B GRM = test2.g SRC = B/test2.cpp \ B/B.cpp \ $(SCAN).cpp OBJ = B/test2.o B/B.o $(SCAN).o A_SPAWN = B/test2.cpp B/B.cpp \ B/B.h \ $(HDR_FILE) $(D_FILE) $(TOKENS) D_SPAWN = $(SCAN).cpp $(SCAN).h #CCC=g++ CCC=$(CC) t: $(OBJ) $(SRC) B/test2.o : $(TOKENS) $(SCAN).h B/test2.cpp $(HDR_FILE) $(CCC) -c $(CFLAGS) -o B/test2.o B/test2.cpp B/B.o : $(TOKENS) $(SCAN).h B/B.cpp B/B.h $(HDR_FILE) $(CCC) -c $(CFLAGS) -o B/B.o B/B.cpp $(SCAN).o : $(SCAN).cpp $(TOKENS) $(CCC) -c $(CFLAGS) -o $(SCAN).o $(SCAN).cpp $(A_SPAWN) : $(GRM) $(A) $(AFLAGS) $(GRM) $(D_SPAWN) : $(D_FILE) $(D) $(DFLAGS) $(D_FILE) clean: rm -f *.o core t B/*.o scrub: rm -f *.o core t B/*.o $(A_SPAWN) $(D_SPAWN) gtkwave-3.3.86/contrib/pccts/testcpp/6/file10000664000175000017500000000000713166335473020127 0ustar bybellbybellabc 34 gtkwave-3.3.86/contrib/pccts/testcpp/6/file20000664000175000017500000000000713166335473020130 0ustar bybellbybelldef 56 gtkwave-3.3.86/contrib/pccts/testcpp/6/test.g0000664000175000017500000000052313166335473020336 0ustar bybellbybell/* This is test.g which tests linking multiple scanners/parsers together; * DLG-based scanner */ << typedef ANTLRCommonToken ANTLRToken; >> #token "[\ \t\n]+" <> class A { e : IDENTIFIER NUMBER <getText(), $2->getText());>> ; } #token IDENTIFIER "[a-z]+" #token NUMBER "[0-9]+" gtkwave-3.3.86/contrib/pccts/testcpp/6/main.cpp0000664000175000017500000000207513166335473020643 0ustar bybellbybell/* we must define ANTLRTokenType, but it will be different for parsers A and B; * so, we just define it as an 'int', which is bad, but we can do nothing * else. */ #include #include #include "A/tokens.h" #include "A.h" #include "B.h" #include "ALexer.h" #include "BLexer.h" #include "PBlackBox.h" typedef ANTLRCommonToken ANTLRToken; int main(int argc, char *argv[]) { ANTLRToken aToken; /* create a token to fill in for DLG */ DLGFileInput in(stdin); if ( argc!=3 ) { fprintf(stderr, "usage: t file1 file2\n"); // // 7-Apr-97 MR1 // //// MR1 exit(EXIT_SUCCESS); exit(PCCTS_EXIT_SUCCESS); //// MR1 } ParserBlackBox p1(argv[1]); p1.parser()->e(); ParserBlackBox p2(argv[2]); p2.parser()->e(); /* ALexer scan1(&in,2000); ANTLRTokenBuffer pipe1(&scan1); scan1.setToken(&aToken); A parser1(&pipe1); parser1.init(); parser1.e(); BLexer scan2(&in,2000); ANTLRTokenBuffer pipe2(&scan2); scan2.setToken(&aToken); B parser2(&pipe2); parser2.init(); parser2.e(); */ return 0; } gtkwave-3.3.86/contrib/pccts/testcpp/6/test2.g0000664000175000017500000000060013166335473020414 0ustar bybellbybell/* This is test2.g which is a copy of test.g and tests linking * multiple scanners/parsers together; DLG-based scanner */ << typedef ANTLRCommonToken ANTLRToken; >> #token "[\ \t\n]+" <> #token Eof "@" class B { e : IDENTIFIER NUMBER <getText(), $2->getText());>> Eof ; } #token IDENTIFIER "[a-z]+" #token NUMBER "[0-9]+" gtkwave-3.3.86/contrib/pccts/testcpp/7/0000775000175000017500000000000013166335473017210 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/testcpp/7/test.g0000664000175000017500000000166513166335473020347 0ustar bybellbybell<< #include ATOKPTR_H // define smart pointers class ANTLRToken : public ANTLRCommonToken { public: int muck; public: ANTLRToken(ANTLRTokenType t, ANTLRChar *s) : ANTLRCommonToken(t,s) { muck = atoi(s); } ANTLRToken() {;} ANTLRChar *getText() const { return ""; } void setText(const ANTLRChar *s) { ; } virtual ANTLRAbstractToken *makeToken(ANTLRTokenType t, char *s, int line) { ANTLRToken *tk = new ANTLRToken(t,s); tk->muck = atoi(s); return tk; } }; #include "DLGLexer.h" #include "PBlackBox.h" int main() { ParserBlackBox p(stdin); p.parser()->calc(); return 0; } >> #token "[\ \t\n]+" <> class Expr { calc: <> e>[r] <> ; e > [int r] : <> e2>[$r] ( "\+" e2>[b] <<$r+=b;>> )* ; e2 > [int r] : NUMBER <<$r=mytoken($1)->muck;>> ( "\*" NUMBER <<$r*=mytoken($2)->muck;>> )* ; } #token NUMBER "[0-9]+" gtkwave-3.3.86/contrib/pccts/testcpp/7/makefile0000664000175000017500000000314613166335473020714 0ustar bybellbybell# # PCCTS makefile for: test.g # # Created from: ../../bin/genmk -CC -project t -class Expr test.g # # PCCTS release 1.32 # Project: t # C++ output # DLG scanner # ANTLR-defined token types # TOKENS = tokens.h # # The following filenames must be consistent with ANTLR/DLG flags DLG_FILE = parser.dlg ERR = err HDR_FILE = SCAN = DLGLexer PCCTS = ../.. ANTLR_H = $(PCCTS)/h BIN = $(PCCTS)/bin ANTLR = $(BIN)/antlr DLG = $(BIN)/dlg CFLAGS = -I. -I$(ANTLR_H) AFLAGS = -CC DFLAGS = -C2 -i -CC GRM = test.g SRC = test.cpp \ Expr.cpp \ $(ANTLR_H)/AParser.cpp $(ANTLR_H)/DLexerBase.cpp $(ANTLR_H)/ATokenBuffer.cpp $(SCAN).cpp OBJ = test.o \ Expr.o \ AParser.o DLexerBase.o ATokenBuffer.o $(SCAN).o ANTLR_SPAWN = test.cpp Expr.cpp \ Expr.h $(DLG_FILE) $(TOKENS) DLG_SPAWN = $(SCAN).cpp $(SCAN).h #CCC=g++ CCC=CC t : $(OBJ) $(SRC) $(CCC) -o t $(CFLAGS) $(OBJ) test.o : $(TOKENS) $(SCAN).h test.cpp $(CCC) -c $(CFLAGS) -o test.o test.cpp Expr.o : $(TOKENS) $(SCAN).h Expr.cpp Expr.h $(CCC) -c $(CFLAGS) -o Expr.o Expr.cpp $(SCAN).o : $(SCAN).cpp $(TOKENS) $(CCC) -c $(CFLAGS) -o $(SCAN).o $(SCAN).cpp $(ANTLR_SPAWN) : $(GRM) $(ANTLR) $(AFLAGS) $(GRM) $(DLG_SPAWN) : $(DLG_FILE) $(DLG) $(DFLAGS) $(DLG_FILE) AParser.o : $(ANTLR_H)/AParser.cpp $(CCC) -c $(CFLAGS) -o AParser.o $(ANTLR_H)/AParser.cpp ATokenBuffer.o : $(ANTLR_H)/ATokenBuffer.cpp $(CCC) -c $(CFLAGS) -o ATokenBuffer.o $(ANTLR_H)/ATokenBuffer.cpp DLexerBase.o : $(ANTLR_H)/DLexerBase.cpp $(CCC) -c $(CFLAGS) -o DLexerBase.o $(ANTLR_H)/DLexerBase.cpp clean: rm -f *.o core t scrub: rm -f *.o core t $(ANTLR_SPAWN) $(DLG_SPAWN) gtkwave-3.3.86/contrib/pccts/testcpp/8/0000775000175000017500000000000013166335473017211 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/testcpp/8/test.g0000664000175000017500000000077113166335473020345 0ustar bybellbybell/* This is test.g which tests a simple DLG-based scanner, but with * a main() in another file. */ #header << #include "AToken.h" // what's ANTLRCommonToken look like? typedef ANTLRCommonToken ANTLRToken; // by placing in header, Expr.h gets it >> #token "[\ \t\n]+" <> #token Eof "@" class Expr { /* Define a grammar class */ e : IDENTIFIER NUMBER Eof <getText(), $2->getText());>> ; } #token IDENTIFIER "[a-z]+" #token NUMBER "[0-9]+" gtkwave-3.3.86/contrib/pccts/testcpp/8/main.cpp0000664000175000017500000000056413166335473020646 0ustar bybellbybell/* Simple main() to call a parser in another file */ #include "tokens.h" // define TokenType #include "Expr.h" // define parser #include "DLGLexer.h" // define scanner #include "PBlackBox.h" // Define ParserBlackBox int main() { ParserBlackBox p(stdin); p.parser()->e(); /* start parsing at rule 'e' of that parser */ return 0; } gtkwave-3.3.86/contrib/pccts/testcpp/8/makefile0000664000175000017500000000330513166335473020712 0ustar bybellbybell# # PCCTS makefile for: test.g # # Created from: ../../bin/genmk -CC -project t -class Expr test.g # # PCCTS release 1.32 # Project: t # C++ output # DLG scanner # ANTLR-defined token types # TOKENS = tokens.h # # The following filenames must be consistent with ANTLR/DLG flags DLG_FILE = parser.dlg ERR = err HDR_FILE = SCAN = DLGLexer PCCTS = ../.. ANTLR_H = $(PCCTS)/h BIN = $(PCCTS)/bin ANTLR = $(BIN)/antlr DLG = $(BIN)/dlg CFLAGS = -I. -I$(ANTLR_H) AFLAGS = -CC DFLAGS = -C2 -i -CC GRM = test.g SRC = test.cpp \ Expr.cpp \ $(ANTLR_H)/AParser.cpp $(ANTLR_H)/DLexerBase.cpp $(ANTLR_H)/ATokenBuffer.cpp $(SCAN).cpp main.cpp OBJ = test.o \ Expr.o \ AParser.o DLexerBase.o ATokenBuffer.o $(SCAN).o main.o ANTLR_SPAWN = test.cpp Expr.cpp \ Expr.h $(DLG_FILE) $(TOKENS) DLG_SPAWN = $(SCAN).cpp $(SCAN).h #CCC=g++ CCC=CC t : $(OBJ) $(SRC) $(CCC) -o t $(CFLAGS) $(OBJ) test.o : $(TOKENS) $(SCAN).h test.cpp $(CCC) -c $(CFLAGS) -o test.o test.cpp main.o : $(TOKENS) $(SCAN).h main.cpp $(CCC) -c $(CFLAGS) -o main.o main.cpp Expr.o : $(TOKENS) $(SCAN).h Expr.cpp Expr.h $(CCC) -c $(CFLAGS) -o Expr.o Expr.cpp $(SCAN).o : $(SCAN).cpp $(TOKENS) $(CCC) -c $(CFLAGS) -o $(SCAN).o $(SCAN).cpp $(ANTLR_SPAWN) : $(GRM) $(ANTLR) $(AFLAGS) $(GRM) $(DLG_SPAWN) : $(DLG_FILE) $(DLG) $(DFLAGS) $(DLG_FILE) AParser.o : $(ANTLR_H)/AParser.cpp $(CCC) -c $(CFLAGS) -o AParser.o $(ANTLR_H)/AParser.cpp ATokenBuffer.o : $(ANTLR_H)/ATokenBuffer.cpp $(CCC) -c $(CFLAGS) -o ATokenBuffer.o $(ANTLR_H)/ATokenBuffer.cpp DLexerBase.o : $(ANTLR_H)/DLexerBase.cpp $(CCC) -c $(CFLAGS) -o DLexerBase.o $(ANTLR_H)/DLexerBase.cpp clean: rm -f *.o core t scrub: rm -f *.o core t $(ANTLR_SPAWN) $(DLG_SPAWN) gtkwave-3.3.86/contrib/pccts/testcpp/9/0000775000175000017500000000000013166335473017212 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/testcpp/9/test.g0000664000175000017500000000170113166335473020340 0ustar bybellbybell/* This is test.g which tests simple AST refs and construction */ /* Revised 2002-2-15: preorder_action prototype no longer matched prototype of base class. (Eero Ivask, Tallinn Technical University, Estonia). */ << typedef ANTLRCommonToken ANTLRToken; #include "DLGLexer.h" #include "PBlackBox.h" class AST : public ASTBase { public: ANTLRTokenPtr token; AST(ANTLRTokenPtr t) { token = t; } void preorder_action(void * clientData) { char *s = token->getText(); printf(" %s", s); } }; int main() { ParserBlackBox p(stdin); ASTBase *root = NULL; p.parser()->e(&root); root->preorder(); printf("\n"); root->destroy(); return 0; } >> #token "[\ \t\n]+" <> #token Eof "@" class Expr { /* Define a grammar class */ e : mult_expr ( ("\+"^|"\-"^) mult_expr )* ; mult_expr : atom ( ("\*"^|"\/"^) atom )* ; atom: IDENTIFIER | NUMBER ; } #token IDENTIFIER "[a-z]+" #token NUMBER "[0-9]+" gtkwave-3.3.86/contrib/pccts/testcpp/9/makefile0000664000175000017500000000362613166335473020721 0ustar bybellbybell# # PCCTS makefile for: test.g # # Created from: ../../bin/genmk -CC -project t -class Expr test.g -trees # # PCCTS release 1.32 # Project: t # C++ output # DLG scanner # ANTLR-defined token types # TOKENS = tokens.h # # The following filenames must be consistent with ANTLR/DLG flags DLG_FILE = parser.dlg ERR = err HDR_FILE = SCAN = DLGLexer PCCTS = ../.. ANTLR_H = $(PCCTS)/h BIN = $(PCCTS)/bin ANTLR = $(BIN)/antlr DLG = $(BIN)/dlg CFLAGS = -I. -I$(ANTLR_H) AFLAGS = -CC -gt DFLAGS = -C2 -i -CC GRM = test.g SRC = test.cpp \ Expr.cpp \ $(ANTLR_H)/AParser.cpp $(ANTLR_H)/DLexerBase.cpp \ $(ANTLR_H)/ASTBase.cpp $(ANTLR_H)/PCCTSAST.cpp \ $(ANTLR_H)/ATokenBuffer.cpp $(SCAN).cpp OBJ = test.o \ Expr.o \ AParser.o DLexerBase.o \ ASTBase.o PCCTSAST.o \ ATokenBuffer.o $(SCAN).o ANTLR_SPAWN = test.cpp Expr.cpp \ Expr.h $(DLG_FILE) $(TOKENS) DLG_SPAWN = $(SCAN).cpp $(SCAN).h #CCC=g++ CCC=CC t : $(OBJ) $(SRC) $(CCC) -o t $(CFLAGS) $(OBJ) test.o : $(TOKENS) $(SCAN).h test.cpp $(CCC) -c $(CFLAGS) -o test.o test.cpp Expr.o : $(TOKENS) $(SCAN).h Expr.cpp Expr.h $(CCC) -c $(CFLAGS) -o Expr.o Expr.cpp $(SCAN).o : $(SCAN).cpp $(TOKENS) $(CCC) -c $(CFLAGS) -o $(SCAN).o $(SCAN).cpp $(ANTLR_SPAWN) : $(GRM) $(ANTLR) $(AFLAGS) $(GRM) $(DLG_SPAWN) : $(DLG_FILE) $(DLG) $(DFLAGS) $(DLG_FILE) AParser.o : $(ANTLR_H)/AParser.cpp $(CCC) -c $(CFLAGS) -o AParser.o $(ANTLR_H)/AParser.cpp ATokenBuffer.o : $(ANTLR_H)/ATokenBuffer.cpp $(CCC) -c $(CFLAGS) -o ATokenBuffer.o $(ANTLR_H)/ATokenBuffer.cpp DLexerBase.o : $(ANTLR_H)/DLexerBase.cpp $(CCC) -c $(CFLAGS) -o DLexerBase.o $(ANTLR_H)/DLexerBase.cpp ASTBase.o : $(ANTLR_H)/ASTBase.cpp $(CCC) -c $(CFLAGS) -o ASTBase.o $(ANTLR_H)/ASTBase.cpp PCCTSAST.o : $(ANTLR_H)/PCCTSAST.cpp $(CCC) -c $(CFLAGS) -o PCCTSAST.o $(ANTLR_H)/PCCTSAST.cpp clean: rm -f *.o core t scrub: rm -f *.o core t $(ANTLR_SPAWN) $(DLG_SPAWN) gtkwave-3.3.86/contrib/pccts/testcpp/Makefile.am0000664000175000017500000000076713166335473021110 0ustar bybellbybell## -*- makefile -*- ## EXTRA_DIST= \ 1/makefile 1/test.g \ 2/MyLexer.cpp 2/MyLexer.h 2/makefile 2/test.g \ 3/MyLexer.cpp 3/MyLexer.h 3/makefile 3/mytokens.h 3/test.g \ 4/makefile 4/mytokens.h 4/test.g \ 5/input.h 5/makefile 5/test.g \ 6/file1 6/file2 6/main.cpp 6/makefile 6/makefile2 6/test.g 6/test2.g \ 7/makefile 7/test.g \ 8/main.cpp 8/makefile 8/test.g \ 9/makefile 9/test.g \ 10/makefile 10/test.g \ 11/input.h 11/makefile 11/test.g \ 12/makefile 12/test.g \ 13/makefile 13/test.g gtkwave-3.3.86/contrib/pccts/CHANGES_FROM_133_BEFORE_MR13.txt0000664000175000017500000042147713166335473022205 0ustar bybellbybell ------------------------------------------------------------ This is the second part of a two part file. This is a list of changes to pccts 1.33 prior to MR13 For more recent information see CHANGES_FROM_133.txt ------------------------------------------------------------ DISCLAIMER The software and these notes are provided "as is". They may include typographical or technical errors and their authors disclaims all liability of any kind or nature for damages due to error, fault, defect, or deficiency regardless of cause. All warranties of any kind, either express or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. #153. (Changed in MR12b) Bug in computation of -mrhoist suppression set Consider the following grammar with k=1 and "-mrhoist on": r1 : (A)? => ((p>>? x /* l1 */ | r2 /* l2 */ ; r2 : A /* l4 */ | (B)? => <>? y /* l5 */ ; In earlier versions the mrhoist routine would see that both l1 and l2 contained predicates and would assume that this prevented either from acting to suppress the other predicate. In the example above it didn't realize the A at line l4 is capable of suppressing the predicate at l1 even though alt l2 contains (indirectly) a predicate. This is fixed in MR12b. Reported by Reinier van den Born (reinier@vnet.ibm.com) #153. (Changed in MR12a) Bug in computation of -mrhoist suppression set An oversight similar to that described in Item #152 appeared in the computation of the set that "covered" a predicate. If a predicate expression included a term such as p=AND(q,r) the context of p was taken to be context(q) & context(r), when it should have been context(q) | context(r). This is fixed in MR12a. #152. (Changed in MR12) Bug in generation of predicate expressions The primary purpose for MR12 is to make quite clear that MR11 is obsolete and to fix the bug related to predicate expressions. In MR10 code was added to optimize the code generated for predicate expression tests. Unfortunately, there was a significant oversight in the code which resulted in a bug in the generation of code for predicate expression tests which contained predicates combined using AND: r0 : (r1)* "@" ; r1 : (AAA)? => <

>? r2 ; r2 : (BBB)? => <>? Q | (BBB)? => <>? Q ; In MR11 (and MR10 when using "-mrhoist on") the code generated for r0 to predict r1 would be equivalent to: if ( LA(1)==Q && (LA(1)==AAA && LA(1)==BBB) && ( p && ( q || r )) ) { This is incorrect because it expresses the idea that LA(1) *must* be AAA in order to attempt r1, and *must* be BBB to attempt r2. The result was that r1 became unreachable since both condition can not be simultaneously true. The general philosophy of code generation for predicates can be summarized as follows: a. If the context is true don't enter an alt for which the corresponding predicate is false. If the context is false then it is okay to enter the alt without evaluating the predicate at all. b. A predicate created by ORing of predicates has context which is the OR of their individual contexts. c. A predicate created by ANDing of predicates has (surprise) context which is the OR of their individual contexts. d. Apply these rules recursively. e. Remember rule (a) The correct code should express the idea that *if* LA(1) is AAA then p must be true to attempt r1, but if LA(1) is *not* AAA then it is okay to attempt r1, provided that *if* LA(1) is BBB then one of q or r must be true. if ( LA(1)==Q && ( !(LA(1)==AAA || LA(1)==BBB) || ( ! LA(1) == AAA || p) && ( ! LA(1) == BBB || q || r ) ) ) { I believe this is fixed in MR12. Reported by Reinier van den Born (reinier@vnet.ibm.com) #151a. (Changed in MR12) ANTLRParser::getLexer() As a result of several requests, I have added public methods to get a pointer to the lexer belonging to a parser. ANTLRTokenStream *ANTLRParser::getLexer() const Returns a pointer to the lexer being used by the parser. ANTLRTokenStream is the base class of DLGLexer ANTLRTokenStream *ANTLRTokenBuffer::getLexer() const Returns a pointer to the lexer being used by the ANTLRTokenBuffer. ANTLRTokenStream is the base class of DLGLexer You must manually cast the ANTLRTokenStream to your program's lexer class. Because the name of the lexer's class is not fixed. Thus it is impossible to incorporate it into the DLGLexerBase class. #151b.(Changed in MR12) ParserBlackBox member getLexer() The template class ParserBlackBox now has a member getLexer() which returns a pointer to the lexer. #150. (Changed in MR12) syntaxErrCount and lexErrCount now public See Item #127 for more information. #149. (Changed in MR12) antlr option -info o (letter o for orphan) If there is more than one rule which is not referenced by any other rule then all such rules are listed. This is useful for alerting one to rules which are not used, but which can still contribute to ambiguity. For example: start : a Z ; unused: a A ; a : (A)+ ; will cause an ambiguity report for rule "a" which will be difficult to understand if the user forgets about rule "unused" simply because it is not used in the grammar. #148. (Changed in MR11) #token names appearing in zztokens,token_tbl In a #token statement like the following: #token Plus "\+" the string "Plus" appears in the zztokens array (C mode) and token_tbl (C++ mode). This string is used in most error messages. In MR11 one has the option of using some other string, (e.g. "+") in those tables. In MR11 one can write: #token Plus ("+") "\+" #token RP ("(") "\(" #token COM ("comment begin") "/\*" A #token statement is allowed to appear in more than one #lexclass with different regular expressions. However, the token name appears only once in the zztokens/token_tbl array. This means that only one substitute can be specified for a given #token name. The second attempt to define a substitute name (different from the first) will result in an error message. #147. (Changed in MR11) Bug in follow set computation There is a bug in 1.33 vanilla and all maintenance releases prior to MR11 in the computation of the follow set. The bug is different than that described in Item #82 and probably more common. It was discovered in the ansi.g grammar while testing the "ambiguity aid" (Item #119). The search for a bug started when the ambiguity aid was unable to discover the actual source of an ambiguity reported by antlr. The problem appears when an optimization of the follow set computation is used inappropriately. The result is that the follow set used is the "worst case". In other words, the error can lead to false reports of ambiguity. The good news is that if you have a grammar in which you have addressed all reported ambiguities you are ok. The bad news is that you may have spent time fixing ambiguities that were not real, or used k=2 when ck=2 might have been sufficient, and so on. The following grammar demonstrates the problem: ------------------------------------------------------------ expr : ID ; start : stmt SEMI ; stmt : CASE expr COLON | expr SEMI | plain_stmt ; plain_stmt : ID COLON ; ------------------------------------------------------------ When compiled with k=1 and ck=2 it will report: warning: alts 2 and 3 of the rule itself ambiguous upon { IDENTIFIER }, { COLON } When antlr analyzes "stmt" it computes the first[1] set of all alternatives. It finds an ambiguity between alts 2 and 3 for ID. It then computes the first[2] set for alternatives 2 and 3 to resolve the ambiguity. In computing the first[2] set of "expr" (which is only one token long) it needs to determine what could follow "expr". Under a certain combination of circumstances antlr forgets that it is trying to analyze "stmt" which can only be followed by SEMI and adds to the first[2] set of "expr" the "global" follow set (including "COLON") which could follow "expr" (under other conditions) in the phrase "CASE expr COLON". #146. (Changed in MR11) Option -treport for locating "difficult" alts It can be difficult to determine which alternatives are causing pccts to work hard to resolve an ambiguity. In some cases the ambiguity is successfully resolved after much CPU time so there is no message at all. A rough measure of the amount of work being peformed which is independent of the CPU speed and system load is the number of tnodes created. Using "-info t" gives information about the total number of tnodes created and the peak number of tnodes. Tree Nodes: peak 1300k created 1416k lost 0 It also puts in the generated C or C++ file the number of tnodes created for a rule (at the end of the rule). However this information is not sufficient to locate the alternatives within a rule which are causing the creation of tnodes. Using: antlr -treport 100000 .... causes antlr to list on stdout any alternatives which require the creation of more than 100,000 tnodes, along with the lookahead sets for those alternatives. The following is a trivial case from the ansi.g grammar which shows the format of the report. This report might be of more interest in cases where 1,000,000 tuples were created to resolve the ambiguity. ------------------------------------------------------------------------- There were 0 tuples whose ambiguity could not be resolved by full lookahead There were 157 tnodes created to resolve ambiguity between: Choice 1: statement/2 line 475 file ansi.g Choice 2: statement/3 line 476 file ansi.g Intersection of lookahead[1] sets: IDENTIFIER Intersection of lookahead[2] sets: LPARENTHESIS COLON AMPERSAND MINUS STAR PLUSPLUS MINUSMINUS ONESCOMPLEMENT NOT SIZEOF OCTALINT DECIMALINT HEXADECIMALINT FLOATONE FLOATTWO IDENTIFIER STRING CHARACTER ------------------------------------------------------------------------- #145. (Documentation) Generation of Expression Trees Item #99 was misleading because it implied that the optimization for tree expressions was available only for trees created by predicate expressions and neglected to mention that it required the use of "-mrhoist on". The optimization applies to tree expressions created for grammars with k>1 and for predicates with lookahead depth >1. In MR11 the optimized version is always used so the -mrhoist on option need not be specified. #144. (Changed in MR11) Incorrect test for exception group In testing for a rule's exception group the label a pointer is compared against '\0'. The intention is "*pointer". Reported by Jeffrey C. Fried (Jeff@Fried.net). #143. (Changed in MR11) Optional ";" at end of #token statement Fixes problem of: #token X "x" << parser action >> Being confused with: #token X "x" <> #142. (Changed in MR11) class BufFileInput subclass of DLGInputStream Alexey Demakov (demakov@kazbek.ispras.ru) has supplied class BufFileInput derived from DLGInputStream which provides a function lookahead(char *string) to test characters in the input stream more than one character ahead. The default amount of lookahead is specified by the constructor and defaults to 8 characters. This does *not* include the one character of lookahead maintained internally by DLG in member "ch" and which is not available for testing via BufFileInput::lookahead(). This is a useful class for overcoming the one-character-lookahead limitation of DLG without resorting to a lexer capable of backtracking (like flex) which is not integrated with antlr as is DLG. There are no restrictions on copying or using BufFileInput.* except that the authorship and related information must be retained in the source code. The class is located in pccts/h/BufFileInput.* of the kit. #141. (Changed in MR11) ZZDEBUG_CONSUME for ANTLRParser::consume() A debug aid has been added to file ANTLRParser::consume() in file AParser.cpp: #ifdef ZZDEBUG_CONSUME_ACTION zzdebug_consume_action(); #endif Suggested by Sramji Ramanathan (ps@kumaran.com). #140. (Changed in MR11) #pred to define predicates +---------------------------------------------------+ | Note: Assume "-prc on" for this entire discussion | +---------------------------------------------------+ A problem with predicates is that each one is regarded as unique and capable of disambiguating cases where two alternatives have identical lookahead. For example: rule : <>? A | <>? A ; will not cause any error messages or warnings to be issued by earlier versions of pccts. To compare the text of the predicates is an incomplete solution. In 1.33MR11 I am introducing the #pred statement in order to solve some problems with predicates. The #pred statement allows one to give a symbolic name to a "predicate literal" or a "predicate expression" in order to refer to it in other predicate expressions or in the rules of the grammar. The predicate literal associated with a predicate symbol is C or C++ code which can be used to test the condition. A predicate expression defines a predicate symbol in terms of other predicate symbols using "!", "&&", and "||". A predicate symbol can be defined in terms of a predicate literal, a predicate expression, or *both*. When a predicate symbol is defined with both a predicate literal and a predicate expression, the predicate literal is used to generate code, but the predicate expression is used to check for two alternatives with identical predicates in both alternatives. Here are some examples of #pred statements: #pred IsLabel <>? #pred IsLocalVar <>? #pred IsGlobalVar <>? #pred IsVar <>? IsLocalVar || IsGlobalVar #pred IsScoped <>? IsLabel || IsLocalVar I hope that the use of EBNF notation to describe the syntax of the #pred statement will not cause problems for my readers (joke). predStatement : "#pred" CapitalizedName ( "<>?" | "<>?" predOrExpr | predOrExpr ) ; predOrExpr : predAndExpr ( "||" predAndExpr ) * ; predAndExpr : predPrimary ( "&&" predPrimary ) * ; predPrimary : CapitalizedName | "!" predPrimary | "(" predOrExpr ")" ; What is the purpose of this nonsense ? To understand how predicate symbols help, you need to realize that predicate symbols are used in two different ways with two different goals. a. Allow simplification of predicates which have been combined during predicate hoisting. b. Allow recognition of identical predicates which can't disambiguate alternatives with common lookahead. First we will discuss goal (a). Consider the following rule: rule0: rule1 | ID | ... ; rule1: rule2 | rule3 ; rule2: <>? ID ; rule3: <>? ID ; When the predicates in rule2 and rule3 are combined by hoisting to create a prediction expression for rule1 the result is: if ( LA(1)==ID && ( isX(LATEXT(1) || !isX(LATEXT(1) ) ) { rule1(); ... This is inefficient, but more importantly, can lead to false assumptions that the predicate expression distinguishes the rule1 alternative with some other alternative with lookahead ID. In MR11 one can write: #pred IsX <>? ... rule2: <>? ID ; rule3: <>? ID ; During hoisting MR11 recognizes this as a special case and eliminates the predicates. The result is a prediction expression like the following: if ( LA(1)==ID ) { rule1(); ... Please note that the following cases which appear to be equivalent *cannot* be simplified by MR11 during hoisting because the hoisting logic only checks for a "!" in the predicate action, not in the predicate expression for a predicate symbol. *Not* equivalent and is not simplified during hoisting: #pred IsX <>? #pred NotX <>? ... rule2: <>? ID ; rule3: <>? ID ; *Not* equivalent and is not simplified during hoisting: #pred IsX <>? #pred NotX !IsX ... rule2: <>? ID ; rule3: <>? ID ; Now we will discuss goal (b). When antlr discovers that there is a lookahead ambiguity between two alternatives it attempts to resolve the ambiguity by searching for predicates in both alternatives. In the past any predicate would do, even if the same one appeared in both alternatives: rule: <>? X | <>? X ; The #pred statement is a start towards solving this problem. During ambiguity resolution (*not* predicate hoisting) the predicates for the two alternatives are expanded and compared. Consider the following example: #pred Upper <>? #pred Lower <>? #pred Alpha <>? Upper || Lower rule0: rule1 | <>? ID ; rule1: | rule2 | rule3 ... ; rule2: <>? ID; rule3: <>? ID; The definition of #pred Alpha expresses: a. to test the predicate use the C code "isAlpha(LATEXT(1))" b. to analyze the predicate use the information that Alpha is equivalent to the union of Upper and Lower, During ambiguity resolution the definition of Alpha is expanded into "Upper || Lower" and compared with the predicate in the other alternative, which is also "Upper || Lower". Because they are identical MR11 will report a problem. ------------------------------------------------------------------------- t10.g, line 5: warning: the predicates used to disambiguate rule rule0 (file t10.g alt 1 line 5 and alt 2 line 6) are identical when compared without context and may have no resolving power for some lookahead sequences. ------------------------------------------------------------------------- If you use the "-info p" option the output file will contain: +----------------------------------------------------------------------+ |#if 0 | | | |The following predicates are identical when compared without | | lookahead context information. For some ambiguous lookahead | | sequences they may not have any power to resolve the ambiguity. | | | |Choice 1: rule0/1 alt 1 line 5 file t10.g | | | | The original predicate for choice 1 with available context | | information: | | | | OR expr | | | | pred << Upper>>? | | depth=k=1 rule rule2 line 14 t10.g | | set context: | | ID | | | | pred << Lower>>? | | depth=k=1 rule rule3 line 15 t10.g | | set context: | | ID | | | | The predicate for choice 1 after expansion (but without context | | information): | | | | OR expr | | | | pred << isUpper(LATEXT(1))>>? | | depth=k=1 rule line 1 t10.g | | | | pred << isLower(LATEXT(1))>>? | | depth=k=1 rule line 2 t10.g | | | | | |Choice 2: rule0/2 alt 2 line 6 file t10.g | | | | The original predicate for choice 2 with available context | | information: | | | | pred << Alpha>>? | | depth=k=1 rule rule0 line 6 t10.g | | set context: | | ID | | | | The predicate for choice 2 after expansion (but without context | | information): | | | | OR expr | | | | pred << isUpper(LATEXT(1))>>? | | depth=k=1 rule line 1 t10.g | | | | pred << isLower(LATEXT(1))>>? | | depth=k=1 rule line 2 t10.g | | | | | |#endif | +----------------------------------------------------------------------+ The comparison of the predicates for the two alternatives takes place without context information, which means that in some cases the predicates will be considered identical even though they operate on disjoint lookahead sets. Consider: #pred Alpha rule1: <>? ID | <>? Label ; Because the comparison of predicates takes place without context these will be considered identical. The reason for comparing without context is that otherwise it would be necessary to re-evaluate the entire predicate expression for each possible lookahead sequence. This would require more code to be written and more CPU time during grammar analysis, and it is not yet clear whether anyone will even make use of the new #pred facility. A temporary workaround might be to use different #pred statements for predicates you know have different context. This would avoid extraneous warnings. The above example might be termed a "false positive". Comparison without context will also lead to "false negatives". Consider the following example: #pred Alpha #pred Beta rule1: <>? A | rule2 ; rule2: <>? A | <>? B ; The predicate used for alt 2 of rule1 is (Alpha || Beta). This appears to be different than the predicate Alpha used for alt1. However, the context of Beta is B. Thus when the lookahead is A Beta will have no resolving power and Alpha will be used for both alternatives. Using the same predicate for both alternatives isn't very helpful, but this will not be detected with 1.33MR11. To properly handle this the predicate expression would have to be evaluated for each distinct lookahead context. To determine whether two predicate expressions are identical is difficult. The routine may fail to identify identical predicates. The #pred feature also compares predicates to see if a choice between alternatives which is resolved by a predicate which makes the second choice unreachable. Consider the following example: #pred A <>? #pred B <>? #pred A_or_B A || B r : s | t ; s : <>? ID ; t : <>? ID ; ---------------------------------------------------------------------------- t11.g, line 5: warning: the predicate used to disambiguate the first choice of rule r (file t11.g alt 1 line 5 and alt 2 line 6) appears to "cover" the second predicate when compared without context. The second predicate may have no resolving power for some lookahead sequences. ---------------------------------------------------------------------------- #139. (Changed in MR11) Problem with -gp in C++ mode The -gp option to add a prefix to rule names did not work in C++ mode. This has been fixed. Reported by Alexey Demakov (demakov@kazbek.ispras.ru). #138. (Changed in MR11) Additional makefiles for non-MSVC++ MS systems Sramji Ramanathan (ps@kumaran.com) has supplied makefiles for building antlr and dlg with Win95/NT development tools that are not based on MSVC5. They are pccts/antlr/AntlrMS.mak and pccts/dlg/DlgMS.mak. The first line of the makefiles require a definition of PCCTS_HOME. These are in additiion to the AntlrMSVC50.* and DlgMSVC50.* supplied by Jeff Vincent (JVincent@novell.com). #137. (Changed in MR11) Token getType(), getText(), getLine() const members -------------------------------------------------------------------- If you use ANTLRCommonToken this change probably does not affect you. -------------------------------------------------------------------- For a long time it has bothered me that these accessor functions in ANTLRAbstractToken were not const member functions. I have refrained from changing them because it require users to modify existing token class definitions which are derived directly from ANTLRAbstractToken. I think it is now time. For those who are not used to C++, a "const member function" is a member function which does not modify its own object - the thing to which "this" points. This is quite different from a function which does not modify its arguments Most token definitions based on ANTLRAbstractToken have something like the following in order to create concrete definitions of the pure virtual methods in ANTLRAbstractToken: class MyToken : public ANTLRAbstractToken { ... ANTLRTokenType getType() {return _type; } int getLine() {return _line; } ANTLRChar * getText() {return _text; } ... } The required change is simply to put "const" following the function prototype in the header (.h file) and the definition file (.cpp if it is not inline): class MyToken : public ANTLRAbstractToken { ... ANTLRTokenType getType() const {return _type; } int getLine() const {return _line; } ANTLRChar * getText() const {return _text; } ... } This was originally proposed a long time ago by Bruce Guenter (bruceg@qcc.sk.ca). #136. (Changed in MR11) Added getLength() to ANTLRCommonToken Classes ANTLRCommonToken and ANTLRCommonTokenNoRefCountToken now have a member function: int getLength() const { return strlen(getText()) } Suggested by Sramji Ramanathan (ps@kumaran.com). #135. (Changed in MR11) Raised antlr's own default ZZLEXBUFSIZE to 8k #134a. (ansi_mr10.zip) T.J. Parr's ANSI C grammar made 1.33MR11 compatible There is a typographical error in the definition of BITWISEOREQ: #token BITWISEOREQ "!=" should be "\|=" When this change is combined with the bugfix to the follow set cache problem (Item #147) and a minor rearrangement of the grammar (Item #134b) it becomes a k=1 ck=2 grammar. #134b. (ansi_mr10.zip) T.J. Parr's ANSI C grammar made 1.33MR11 compatible The following changes were made in the ansi.g grammar (along with using -mrhoist on): ansi.g ====== void tracein(char *) ====> void tracein(const char *) void traceout(char *) ====> void traceout(const char *) getType()==IDENTIFIER ? isTypeName(LT(1)->getText()) : 1>>? ====> <getText())>>? <<(LT(1)->getType()==LPARENTHESIS && LT(2)->getType()==IDENTIFIER) ? \ isTypeName(LT(2)->getText()) : 1>>? ====> (LPARENTHESIS IDENTIFIER)? => <getText())>>? <<(LT(1)->getType()==LPARENTHESIS && LT(2)->getType()==IDENTIFIER) ? \ isTypeName(LT(2)->getText()) : 1>>? ====> (LPARENTHESIS IDENTIFIER)? => <getText())>>? added to init(): traceOptionValueDefault=0; added to init(): traceOption(-1); change rule "statement": statement : plain_label_statement | case_label_statement | <<;>> expression SEMICOLON | compound_statement | selection_statement | iteration_statement | jump_statement | SEMICOLON ; plain_label_statement : IDENTIFIER COLON statement ; case_label_statement : CASE constant_expression COLON statement | DEFAULT COLON statement ; support.cpp =========== void tracein(char *) ====> void tracein(const char *) void traceout(char *) ====> void traceout(const char *) added to tracein(): ANTLRParser::tracein(r); // call superclass method added to traceout(): ANTLRParser::traceout(r); // call superclass method Makefile ======== added to AFLAGS: -mrhoist on -prc on #133. (Changed in 1.33MR11) Make trace options public in ANTLRParser In checking T.J. Parr's ANSI C grammar for compatibility with 1.33MR11 discovered that it was inconvenient to have the trace facilities with protected access. #132. (Changed in 1.33MR11) Recognition of identical predicates in alts Prior to 1.33MR11, there would be no ambiguity warning when the very same predicate was used to disambiguate both alternatives: test: ref B | ref C ; ref : <>? A In 1.33MR11 this will cause the warning: warning: the predicates used to disambiguate rule test (file v98.g alt 1 line 1 and alt 2 line 2) are identical and have no resolving power ----------------- Note ----------------- This is different than the following case test: <>? A B | <>? A C ; In this case there are two distinct predicates which have exactly the same text. In the first example there are two references to the same predicate. The problem represented by this grammar will be addressed later. #131. (Changed in 1.33MR11) Case insensitive command line options Command line switches like "-CC" and keywords like "on", "off", and "stdin" are no longer case sensitive in antlr, dlg, and sorcerer. #130. (Changed in 1.33MR11) Changed ANTLR_VERSION to int from string The ANTLR_VERSION was not an integer, making it difficult to perform conditional compilation based on the antlr version. Henceforth, ANTLR_VERSION will be: (base_version * 10000) + release number thus 1.33MR11 will be: 133*100+11 = 13311 Suggested by Rainer Janssen (Rainer.Janssen@Informatik.Uni-Oldenburg.DE). #129. (Changed in 1.33MR11) Addition of ANTLR_VERSION to .h The following code is now inserted into .h amd stdpccts.h: #ifndef ANTLR_VERSION #define ANTLR_VERSION 13311 #endif Suggested by Rainer Janssen (Rainer.Janssen@Informatik.Uni-Oldenburg.DE) #128. (Changed in 1.33MR11) Redundant predicate code in (<>? ...)+ Prior to 1.33MR11, the following grammar would generate redundant tests for the "while" condition. rule2 : (<>? X)+ X | B ; The code would resemble: if (LA(1)==X) { if (pred) { do { if (!pred) {zzfailed_pred(" pred");} zzmatch(X); zzCONSUME; } while (LA(1)==X && pred && pred); } else {... With 1.33MR11 the redundant predicate test is omitted. #127. (Changed in 1.33MR11) Count Syntax Errors Count DLG Errors ------------------- ---------------- C++ mode ANTLRParser:: DLGLexerBase:: syntaxErrCount lexErrCount C mode zzSyntaxErrCount zzLexErrCount The C mode variables are global and initialized to 0. They are *not* reset to 0 automatically when antlr is restarted. The C++ mode variables are public. They are initialized to 0 by the constructors. They are *not* reset to 0 by the ANTLRParser::init() method. Suggested by Reinier van den Born (reinier@vnet.ibm.com). #126. (Changed in 1.33MR11) Addition of #first <<...>> The #first <<...>> inserts the specified text in the output files before any other #include statements required by pccts. The only things before the #first text are comments and a #define ANTLR_VERSION. Requested by and Esa Pulkkinen (esap@cs.tut.fi) and Alexin Zoltan (alexin@inf.u-szeged.hu). #125. (Changed in 1.33MR11) Lookahead for (guard)? && <

>? predicates When implementing the new style of guard predicate (Item #113) in 1.33MR10 I decided to temporarily ignore the problem of computing the "narrowest" lookahead context. Consider the following k=1 grammar: start : a | b ; a : (A)? && <>? ab ; b : (B)? && <>? ab ; ab : A | B ; In MR10 the context for both "a" and "b" was {A B} because this is the first set of rule "ab". Normally, this is not a problem because the predicate which follows the guard inhibits any ambiguity report by antlr. In MR11 the first set for rule "a" is {A} and for rule "b" it is {B}. #124. A Note on the New "&&" Style Guarded Predicates I've been asked several times, "What is the difference between the old "=>" style guard predicates and the new style "&&" guard predicates, and how do you choose one over the other" ? The main difference is that the "=>" does not apply the predicate if the context guard doesn't match, whereas the && form always does. What is the significance ? If you have a predicate which is not on the "leading edge" it cannot be hoisted. Suppose you need a predicate that looks at LA(2). You must introduce it manually. The classic example is: castExpr : LP typeName RP | .... ; typeName : <>? ID | STRUCT ID ; The problem is that typeName isn't on the leading edge of castExpr, so the predicate isTypeName won't be hoisted into castExpr to help make a decision on which production to choose. The *first* attempt to fix it is this: castExpr : <>? LP typeName RP | .... ; Unfortunately, this won't work because it ignores the problem of STRUCT. The solution is to apply isTypeName() in castExpr if LA(2) is an ID and don't apply it when LA(2) is STRUCT: castExpr : (LP ID)? => <>? LP typeName RP | .... ; In conclusion, the "=>" style guarded predicate is useful when: a. the tokens required for the predicate are not on the leading edge b. there are alternatives in the expression selected by the predicate for which the predicate is inappropriate If (b) were false, then one could use a simple predicate (assuming "-prc on"): castExpr : <>? LP typeName RP | .... ; typeName : <>? ID ; So, when do you use the "&&" style guarded predicate ? The new-style "&&" predicate should always be used with predicate context. The context guard is in ADDITION to the automatically computed context. Thus it useful for predicates which depend on the token type for reasons other than context. The following example is contributed by Reinier van den Born (reinier@vnet.ibm.com). +-------------------------------------------------------------------------+ | This grammar has two ways to call functions: | | | | - a "standard" call syntax with parens and comma separated args | | - a shell command like syntax (no parens and spacing separated args) | | | | The former also allows a variable to hold the name of the function, | | the latter can also be used to call external commands. | | | | The grammar (simplified) looks like this: | | | | fun_call : ID "(" { expr ("," expr)* } ")" | | /* ID is function name */ | | | "@" ID "(" { expr ("," expr)* } ")" | | /* ID is var containing fun name */ | | ; | | | | command : ID expr* /* ID is function name */ | | | path expr* /* path is external command name */ | | ; | | | | path : ID /* left out slashes and such */ | | | "@" ID /* ID is environment var */ | | ; | | | | expr : .... | | | "(" expr ")"; | | | | call : fun_call | | | command | | ; | | | | Obviously the call is wildly ambiguous. This is more or less how this | | is to be resolved: | | | | A call begins with an ID or an @ followed by an ID. | | | | If it is an ID and if it is an ext. command name -> command | | if followed by a paren -> fun_call | | otherwise -> command | | | | If it is an @ and if the ID is a var name -> fun_call | | otherwise -> command | | | | One can implement these rules quite neatly using && predicates: | | | | call : ("@" ID)? && <>? fun_call | | | (ID)? && <>? command | | | (ID "(")? fun_call | | | command | | ; | | | | This can be done better, so it is not an ideal example, but it | | conveys the principle. | +-------------------------------------------------------------------------+ #123. (Changed in 1.33MR11) Correct definition of operators in ATokPtr.h The return value of operators in ANTLRTokenPtr: changed: unsigned ... operator !=(...) to: int ... operator != (...) changed: unsigned ... operator ==(...) to: int ... operator == (...) Suggested by R.A. Nelson (cowboy@VNET.IBM.COM) #122. (Changed in 1.33MR11) Member functions to reset DLG in C++ mode void DLGFileReset(FILE *f) { input = f; found_eof = 0; } void DLGStringReset(DLGChar *s) { input = s; p = &input[0]; } Supplied by R.A. Nelson (cowboy@VNET.IBM.COM) #121. (Changed in 1.33MR11) Another attempt to fix -o (output dir) option Another attempt is made to improve the -o option of antlr, dlg, and sorcerer. This one by JVincent (JVincent@novell.com). The current rule: a. If -o is not specified than any explicit directory names are retained. b. If -o is specified than the -o directory name overrides any explicit directory names. c. The directory name of the grammar file is *not* stripped to create the main output file. However it is stil subject to override by the -o directory name. #120. (Changed in 1.33MR11) "-info f" output to stdout rather than stderr Added option 0 (e.g. "-info 0") which is a noop. #119. (Changed in 1.33MR11) Ambiguity aid for grammars The user can ask for additional information on ambiguities reported by antlr to stdout. At the moment, only one ambiguity report can be created in an antlr run. This feature is enabled using the "-aa" (Ambiguity Aid) option. The following options control the reporting of ambiguities: -aa ruleName Selects reporting by name of rule -aa lineNumber Selects reporting by line number (file name not compared) -aam Selects "multiple" reporting for a token in the intersection set of the alternatives. For instance, the token ID may appear dozens of times in various paths as the program explores the rules which are reachable from the point of an ambiguity. With option -aam every possible path the search program encounters is reported. Without -aam only the first encounter is reported. This may result in incomplete information, but the information may be sufficient and much shorter. -aad depth Selects the depth of the search. The default value is 1. The number of paths to be searched, and the size of the report can grow geometrically with the -ck value if a full search for all contributions to the source of the ambiguity is explored. The depth represents the number of tokens in the lookahead set which are matched against the set of ambiguous tokens. A depth of 1 means that the search stops when a lookahead sequence of just one token is matched. A k=1 ck=6 grammar might generate 5,000 items in a report if a full depth 6 search is made with the Ambiguity Aid. The source of the problem may be in the first token and obscured by the volume of data - I hesitate to call it information. When the user selects a depth > 1, the search is first performed at depth=1 for both alternatives, then depth=2 for both alternatives, etc. Sample output for rule grammar in antlr.g itself: +---------------------------------------------------------------------+ | Ambiguity Aid | | | | Choice 1: grammar/70 line 632 file a.g | | Choice 2: grammar/82 line 644 file a.g | | | | Intersection of lookahead[1] sets: | | | | "\}" "class" "#errclass" "#tokclass" | | | | Choice:1 Depth:1 Group:1 ("#errclass") | | 1 in (...)* block grammar/70 line 632 a.g | | 2 to error grammar/73 line 635 a.g | | 3 error error/1 line 894 a.g | | 4 #token "#errclass" error/2 line 895 a.g | | | | Choice:1 Depth:1 Group:2 ("#tokclass") | | 2 to tclass grammar/74 line 636 a.g | | 3 tclass tclass/1 line 937 a.g | | 4 #token "#tokclass" tclass/2 line 938 a.g | | | | Choice:1 Depth:1 Group:3 ("class") | | 2 to class_def grammar/75 line 637 a.g | | 3 class_def class_def/1 line 669 a.g | | 4 #token "class" class_def/3 line 671 a.g | | | | Choice:1 Depth:1 Group:4 ("\}") | | 2 #token "\}" grammar/76 line 638 a.g | | | | Choice:2 Depth:1 Group:5 ("#errclass") | | 1 in (...)* block grammar/83 line 645 a.g | | 2 to error grammar/93 line 655 a.g | | 3 error error/1 line 894 a.g | | 4 #token "#errclass" error/2 line 895 a.g | | | | Choice:2 Depth:1 Group:6 ("#tokclass") | | 2 to tclass grammar/94 line 656 a.g | | 3 tclass tclass/1 line 937 a.g | | 4 #token "#tokclass" tclass/2 line 938 a.g | | | | Choice:2 Depth:1 Group:7 ("class") | | 2 to class_def grammar/95 line 657 a.g | | 3 class_def class_def/1 line 669 a.g | | 4 #token "class" class_def/3 line 671 a.g | | | | Choice:2 Depth:1 Group:8 ("\}") | | 2 #token "\}" grammar/96 line 658 a.g | +---------------------------------------------------------------------+ For a linear lookahead set ambiguity (where k=1 or for k>1 but when all lookahead sets [i] with i>? A ; c : A ; Prior to 1.33MR10 the code generated for "start" would resemble: while { if (LA(1)==A && (!LA(1)==A || isUpper())) { a(); } }; This code is wrong because it makes rule "c" unreachable from "start". The essence of the problem is that antlr fails to recognize that there can be a valid alternative within "a" even when the predicate <>? is false. In 1.33MR10 with -mrhoist the hoisting of the predicate into "start" is suppressed because it recognizes that "c" can cover all the cases where the predicate is false: while { if (LA(1)==A) { a(); } }; With the antlr "-info p" switch the user will receive information about the predicate suppression in the generated file: -------------------------------------------------------------- #if 0 Hoisting of predicate suppressed by alternative without predicate. The alt without the predicate includes all cases where the predicate is false. WITH predicate: line 7 v1.g WITHOUT predicate: line 7 v1.g The context set for the predicate: A The lookahead set for the alt WITHOUT the semantic predicate: A The predicate: pred << isUpper(LATEXT(1))>>? depth=k=1 rule b line 9 v1.g set context: A tree context: null Chain of referenced rules: #0 in rule start (line 5 v1.g) to rule a #1 in rule a (line 7 v1.g) #endif -------------------------------------------------------------- A predicate can be suppressed by a combination of alternatives which, taken together, cover a predicate: start : (a)* "@" ; a : b | ca | cb | cc ; b : <>? ( A | B | C ) ; ca : A ; cb : B ; cc : C ; Consider a more complex example in which "c" covers only part of a predicate: start : (a)* "@" ; a : b | c ; b : <>? ( A | X ); c : A ; Prior to 1.33MR10 the code generated for "start" would resemble: while { if ( (LA(1)==A || LA(1)==X) && (! (LA(1)==A || LA(1)==X) || isUpper()) { a(); } }; With 1.33MR10 and -mrhoist the predicate context is restricted to the non-covered lookahead. The code resembles: while { if ( (LA(1)==A || LA(1)==X) && (! (LA(1)==X) || isUpper()) { a(); } }; With the antlr "-info p" switch the user will receive information about the predicate restriction in the generated file: -------------------------------------------------------------- #if 0 Restricting the context of a predicate because of overlap in the lookahead set between the alternative with the semantic predicate and one without Without this restriction the alternative without the predicate could not be reached when input matched the context of the predicate and the predicate was false. WITH predicate: line 11 v4.g WITHOUT predicate: line 12 v4.g The original context set for the predicate: A X The lookahead set for the alt WITHOUT the semantic predicate: A The intersection of the two sets A The original predicate: pred << isUpper(LATEXT(1))>>? depth=k=1 rule b line 15 v4.g set context: A X tree context: null The new (modified) form of the predicate: pred << isUpper(LATEXT(1))>>? depth=k=1 rule b line 15 v4.g set context: X tree context: null #endif -------------------------------------------------------------- The bad news about -mrhoist: (a) -mrhoist does not analyze predicates with lookahead depth > 1. (b) -mrhoist does not look past a guarded predicate to find context which might cover other predicates. For these cases you might want to use syntactic predicates. When a semantic predicate fails during guess mode the guess fails and the next alternative is tried. Limitation (a) is illustrated by the following example: start : (stmt)* EOF ; stmt : cast | expr ; cast : <>? LP ID RP ; expr : LP ID RP ; This is not much different from the first example, except that it requires two tokens of lookahead context to determine what to do. This predicate is NOT suppressed because the current version is unable to handle predicates with depth > 1. A predicate can be combined with other predicates during hoisting. In those cases the depth=1 predicates are still handled. Thus, in the following example the isUpper() predicate will be suppressed by line #4 when hoisted from "bizarre" into "start", but will still be present in "bizarre" in order to predict "stmt". start : (bizarre)* EOF ; // #1 // #2 bizarre : stmt // #3 | A // #4 ; stmt : cast | expr ; cast : <>? LP ID RP ; expr : LP ID RP ; | <>? A Limitation (b) is illustrated by the following example of a context guarded predicate: rule : (A)? <

>? // #1 (A // #2 |B // #3 ) // #4 | <> B // #5 ; Recall that this means that when the lookahead is NOT A then the predicate "p" is ignored and it attempts to match "A|B". Ideally, the "B" at line #3 should suppress predicate "q". However, the current version does not attempt to look past the guard predicate to find context which might suppress other predicates. In some cases -mrhoist will lead to the reporting of ambiguities which were not visible before: start : (a)* "@"; a : bc | d; bc : b | c ; b : <>? A; c : A ; d : A ; In this case there is a true ambiguity in "a" between "bc" and "d" which can both match "A". Without -mrhoist the predicate in "b" is hoisted into "a" and there is no ambiguity reported. However, with -mrhoist, the predicate in "b" is suppressed by "c" (as it should be) making the ambiguity in "a" apparent. The motivations for these changes were hoisting problems reported by Reinier van den Born (reinier@vnet.ibm.com) and several others. #116. (Changed in 1.33MR10) C++ mode: tracein/traceout rule name is (const char *) The prototype for C++ mode routine tracein (and traceout) has changed from "char *" to "const char *". #115. (Changed in 1.33MR10) Using guess mode with exception handlers in C mode The definition of the C mode macros zzmatch_wsig and zzsetmatch_wsig neglected to consider guess mode. When control passed to the rule's parse exception handler the routine would exit without ever closing the guess block. This would lead to unpredictable behavior. In 1.33MR10 the behavior of exceptions in C mode and C++ mode should be identical. #114. (Changed in 1.33MR10) difference in [zz]resynch() between C and C++ modes There was a slight difference in the way C and C++ mode resynchronized following a parsing error. The C routine would sometimes skip an extra token before attempting to resynchronize. The C routine was changed to match the C++ routine. #113. (Changed in 1.33MR10) new context guarded pred: (g)? && <

>? expr The existing context guarded predicate: rule : (guard)? => <

>? expr | next_alternative ; generates code which resembles: if (lookahead(expr) && (!guard || pred)) { expr() } else .... This is not suitable for some applications because it allows expr() to be invoked when the predicate is false. This is intentional because it is meant to mimic automatically computed predicate context. The new context guarded predicate uses the guard information differently because it has a different goal. Consider: rule : (guard)? && <

>? expr | next_alternative ; The new style of context guarded predicate is equivalent to: rule : <>? expr | next_alternative ; It generates code which resembles: if (lookahead(expr) && guard && pred) { expr(); } else ... Both forms of guarded predicates severely restrict the form of the context guard: it can contain no rule references, no (...)*, no (...)+, and no {...}. It may contain token and token class references, and alternation ("|"). Addition for 1.33MR11: in the token expression all tokens must be at the same height of the token tree: (A ( B | C))? && ... is ok (all height 2) (A ( B | ))? && ... is not ok (some 1, some 2) (A B C D | E F G H)? && ... is ok (all height 4) (A B C D | E )? && ... is not ok (some 4, some 1) This restriction is required in order to properly compute the lookahead set for expressions like: rule1 : (A B C)? && <>? rule2 ; rule2 : (A|X) (B|Y) (C|Z); This addition was suggested by Rienier van den Born (reinier@vnet.ibm.com) #112. (Changed in 1.33MR10) failed validation predicate in C guess mode John Lilley (jlilley@empathy.com) suggested that failed validation predicates abort a guess rather than reporting a failed error. This was installed in C++ mode (Item #4). Only now was it noticed that the fix was never installed for C mode. #111. (Changed in 1.33MR10) moved zzTRACEIN to before init action When the antlr -gd switch is present antlr generates calls to zzTRACEIN at the start of a rule and zzTRACEOUT at the exit from a rule. Prior to 1.33MR10 Tthe call to zzTRACEIN was after the init-action, which could cause confusion because the init-actions were reported with the name of the enclosing rule, rather than the active rule. #110. (Changed in 1.33MR10) antlr command line copied to generated file The antlr command line is now copied to the generated file near the start. #109. (Changed in 1.33MR10) improved trace information The quality of the trace information provided by the "-gd" switch has been improved significantly. Here is an example of the output from a test program. It shows the rule name, the first token of lookahead, the call depth, and the guess status: exit rule gusxx {"?"} depth 2 enter rule gusxx {"?"} depth 2 enter rule gus1 {"o"} depth 3 guessing guess done - returning to rule gus1 {"o"} at depth 3 (guess mode continues - an enclosing guess is still active) guess done - returning to rule gus1 {"Z"} at depth 3 (guess mode continues - an enclosing guess is still active) exit rule gus1 {"Z"} depth 3 guessing guess done - returning to rule gusxx {"o"} at depth 2 (guess mode ends) enter rule gus1 {"o"} depth 3 guess done - returning to rule gus1 {"o"} at depth 3 (guess mode ends) guess done - returning to rule gus1 {"Z"} at depth 3 (guess mode ends) exit rule gus1 {"Z"} depth 3 line 1: syntax error at "Z" missing SC ... Rule trace reporting is controlled by the value of the integer [zz]traceOptionValue: when it is positive tracing is enabled, otherwise it is disabled. Tracing during guess mode is controlled by the value of the integer [zz]traceGuessOptionValue. When it is positive AND [zz]traceOptionValue is positive rule trace is reported in guess mode. The values of [zz]traceOptionValue and [zz]traceGuessOptionValue can be adjusted by subroutine calls listed below. Depending on the presence or absence of the antlr -gd switch the variable [zz]traceOptionValueDefault is set to 0 or 1. When the parser is initialized or [zz]traceReset() is called the value of [zz]traceOptionValueDefault is copied to [zz]traceOptionValue. The value of [zz]traceGuessOptionValue is always initialzed to 1, but, as noted earlier, nothing will be reported unless [zz]traceOptionValue is also positive. When the parser state is saved/restored the value of the trace variables are also saved/restored. If a restore causes a change in reporting behavior from on to off or vice versa this will be reported. When the -gd option is selected, the macro "#define zzTRACE_RULES" is added to appropriate output files. C++ mode -------- int traceOption(int delta) int traceGuessOption(int delta) void traceReset() int traceOptionValueDefault C mode -------- int zzTraceOption(int delta) int zzTraceGuessOption(int delta) void zzTraceReset() int zzTraceOptionValueDefault The argument "delta" is added to the traceOptionValue. To turn on trace when inside a particular rule one: rule : <> ( rest-of-rule ) <> ; /* fail clause */ <> One can use the same idea to turn *off* tracing within a rule by using a delta of (-1). An improvement in the rule trace was suggested by Sramji Ramanathan (ps@kumaran.com). #108. A Note on Deallocation of Variables Allocated in Guess Mode NOTE ------------------------------------------------------ This mechanism only works for heap allocated variables ------------------------------------------------------ The rewrite of the trace provides the machinery necessary to properly free variables or undo actions following a failed guess. The macro zzUSER_GUESS_HOOK(guessSeq,zzrv) is expanded as part of the zzGUESS macro. When a guess is opened the value of zzrv is 0. When a longjmp() is executed to undo the guess, the value of zzrv will be 1. The macro zzUSER_GUESS_DONE_HOOK(guessSeq) is expanded as part of the zzGUESS_DONE macro. This is executed whether the guess succeeds or fails as part of closing the guess. The guessSeq is a sequence number which is assigned to each guess and is incremented by 1 for each guess which becomes active. It is needed by the user to associate the start of a guess with the failure and/or completion (closing) of a guess. Guesses are nested. They must be closed in the reverse of the order that they are opened. In order to free memory used by a variable during a guess a user must write a routine which can be called to register the variable along with the current guess sequence number provided by the zzUSER_GUESS_HOOK macro. If the guess fails, all variables tagged with the corresponding guess sequence number should be released. This is ugly, but it would require a major rewrite of antlr 1.33 to use some mechanism other than setjmp()/longjmp(). The order of calls for a *successful* guess would be: zzUSER_GUESS_HOOK(guessSeq,0); zzUSER_GUESS_DONE_HOOK(guessSeq); The order of calls for a *failed* guess would be: zzUSER_GUESS_HOOK(guessSeq,0); zzUSER_GUESS_HOOK(guessSeq,1); zzUSER_GUESS_DONE_HOOK(guessSeq); The default definitions of these macros are empty strings. Here is an example in C++ mode. The zzUSER_GUESS_HOOK and zzUSER_GUESS_DONE_HOOK macros and myGuessHook() routine can be used without change in both C and C++ versions. ---------------------------------------------------------------------- << #include "AToken.h" typedef ANTLRCommonToken ANTLRToken; #include "DLGLexer.h" int main() { { DLGFileInput in(stdin); DLGLexer lexer(&in,2000); ANTLRTokenBuffer pipe(&lexer,1); ANTLRCommonToken aToken; P parser(&pipe); lexer.setToken(&aToken); parser.init(); parser.start(); }; fclose(stdin); fclose(stdout); return 0; } >> << char *s=NULL; #undef zzUSER_GUESS_HOOK #define zzUSER_GUESS_HOOK(guessSeq,zzrv) myGuessHook(guessSeq,zzrv); #undef zzUSER_GUESS_DONE_HOOK #define zzUSER_GUESS_DONE_HOOK(guessSeq) myGuessHook(guessSeq,2); void myGuessHook(int guessSeq,int zzrv) { if (zzrv == 0) { fprintf(stderr,"User hook: starting guess #%d\n",guessSeq); } else if (zzrv == 1) { free (s); s=NULL; fprintf(stderr,"User hook: failed guess #%d\n",guessSeq); } else if (zzrv == 2) { free (s); s=NULL; fprintf(stderr,"User hook: ending guess #%d\n",guessSeq); }; } >> #token A "a" #token "[\t \ \n]" <> class P { start : (top)+ ; top : (which) ? <> | other <> ; <> which : which2 ; which2 : which3 ; which3 : (label)? <> | (global)? <> | (exclamation)? <> ; label : <getText());>> A ":" ; global : <getText());>> A "::" ; exclamation : <getText());>> A "!" ; other : <getText());>> "other" ; } ---------------------------------------------------------------------- This is a silly example, but illustrates the idea. For the input "a ::" with tracing enabled the output begins: ---------------------------------------------------------------------- enter rule "start" depth 1 enter rule "top" depth 2 User hook: starting guess #1 enter rule "which" depth 3 guessing enter rule "which2" depth 4 guessing enter rule "which3" depth 5 guessing User hook: starting guess #2 enter rule "label" depth 6 guessing guess failed User hook: failed guess #2 guess done - returning to rule "which3" at depth 5 (guess mode continues - an enclosing guess is still active) User hook: ending guess #2 User hook: starting guess #3 enter rule "global" depth 6 guessing exit rule "global" depth 6 guessing guess done - returning to rule "which3" at depth 5 (guess mode continues - an enclosing guess is still active) User hook: ending guess #3 enter rule "global" depth 6 guessing exit rule "global" depth 6 guessing exit rule "which3" depth 5 guessing exit rule "which2" depth 4 guessing exit rule "which" depth 3 guessing guess done - returning to rule "top" at depth 2 (guess mode ends) User hook: ending guess #1 enter rule "which" depth 3 ..... ---------------------------------------------------------------------- Remember: (a) Only init-actions are executed during guess mode. (b) A rule can be invoked multiple times during guess mode. (c) If the guess succeeds the rule will be called once more without guess mode so that normal actions will be executed. This means that the init-action might need to distinguish between guess mode and non-guess mode using the variable [zz]guessing. #107. (Changed in 1.33MR10) construction of ASTs in guess mode Prior to 1.33MR10, when using automatic AST construction in C++ mode for a rule, an AST would be constructed for elements of the rule even while in guess mode. In MR10 this no longer occurs. #106. (Changed in 1.33MR10) guess variable confusion In C++ mode a guess which failed always restored the parser state using zzGUESS_DONE as part of zzGUESS_FAIL. Prior to 1.33MR10, C mode required an explicit call to zzGUESS_DONE after the call to zzGUESS_FAIL. Consider: rule : (alpha)? beta | ... ; The generated code resembles: zzGUESS if (!zzrv && LA(1)==ID) { <==== line #1 alpha zzGUESS_DONE beta } else { if (! zzrv) zzGUESS_DONE <==== line #2a .... However, in some cases line #2 was rendered: if (guessing) zzGUESS_DONE <==== line #2b This would work for simple test cases, but would fail in some cases where there was a guess while another guess was active. One kind of failure would be to match up the zzGUESS_DONE at line #2b with the "outer" guess which was still active. The outer guess would "succeed" when only the inner guess should have succeeded. In 1.33MR10 the behavior of zzGUESS and zzGUESS_FAIL in C and and C++ mode should be identical. The same problem appears in 1.33 vanilla in some places. For example: start : { (sub)? } ; or: start : ( B | ( sub )? | C )+ ; generates incorrect code. The general principle is: (a) use [zz]guessing only when deciding between a call to zzFAIL or zzGUESS_FAIL (b) use zzrv in all other cases This problem was discovered while testing changes to item #105. I believe this is now fixed. My apologies. #105. (Changed in 1.33MR10) guess block as single alt of (...)+ Prior to 1.33MR10 the following constructs: rule_plus : ( (sub)? )+ ; rule_star : ( (sub)? )* ; generated incorrect code for the guess block (which could result in runtime errors) because of an incorrect optimization of a block with only a single alternative. The fix caused some changes to the fix described in Item #49 because there are now three code generation sequences for (...)+ blocks containing a guess block: a. single alternative which is a guess block b. multiple alternatives in which the last is a guess block c. all other cases Forms like "rule_star" can have unexpected behavior when there is a syntax error: if the subrule "sub" is not matched *exactly* then "rule_star" will consume no tokens. Reported by Esa Pulkkinen (esap@cs.tut.fi). #104. (Changed in 1.33MR10) -o option for dlg There was problem with the code added by item #74 to handle the -o option of dlg. This should fix it. #103. (Changed in 1.33MR10) ANDed semantic predicates Rescinded. The optimization was a mistake. The resulting problem is described in Item #150. #102. (Changed in 1.33MR10) allow "class parser : .... {" The syntax of the class statement ("class parser-name {") has been extended to allow for the specification of base classes. An arbirtrary number of tokens may now appear between the class name and the "{". They are output again when the class declaration is generated. For example: class Parser : public MyBaseClassANTLRparser { This was suggested by a user, but I don't have a record of who it was. #101. (Changed in 1.33MR10) antlr -info command line switch -info p - extra predicate information in generated file t - information about tnode use: at the end of each rule in generated file summary on stderr at end of program m - monitor progress prints name of each rule as it is started flushes output at start of each rule f - first/follow set information to stdout 0 - no operation (added in 1.33MR11) The options may be combined and may appear in any order. For example: antlr -info ptm -CC -gt -mrhoist on mygrammar.g #100a. (Changed in 1.33MR10) Predicate tree simplification When the same predicates can be referenced in more than one alternative of a block large predicate trees can be formed. The difference that these optimizations make is so dramatic that I have decided to use it even when -mrhoist is not selected. Consider the following grammar: start : ( all )* ; all : a | d | e | f ; a : c A B | c A C ; c : <>? ; d : <>? B C ; e : <>? B C ; f : e X Y ; In rule "a" there is a reference to rule "c" in both alternatives. The length of the predicate AAA is k=2 and it can be followed in alternative 1 only by (A B) while in alternative 2 it can be followed only by (A C). Thus they do not have identical context. In rule "all" the alternatives which refer to rules "e" and "f" allow elimination of the duplicate reference to predicate CCC. The table below summarized the kind of simplification performed by 1.33MR10. In the table, X and Y stand for single predicates (not trees). (OR X (OR Y (OR Z))) => (OR X Y Z) (AND X (AND Y (AND Z))) => (AND X Y Z) (OR X (... (OR X Y) ... )) => (OR X (... Y ... )) (AND X (... (AND X Y) ... )) => (AND X (... Y ... )) (OR X (... (AND X Y) ... )) => (OR X (... ... )) (AND X (... (OR X Y) ... )) => (AND X (... ... )) (AND X) => X (OR X) => X In a test with a complex grammar for a real application, a predicate tree with six OR nodes and 12 leaves was reduced to "(OR X Y Z)". In 1.33MR10 there is a greater effort to release memory used by predicates once they are no longer in use. #100b. (Changed in 1.33MR10) Suppression of extra predicate tests The following optimizations require that -mrhoist be selected. It is relatively easy to optimize the code generated for predicate gates when they are of the form: (AND X Y Z ...) or (OR X Y Z ...) where X, Y, Z, and "..." represent individual predicates (leaves) not predicate trees. If the predicate is an AND the contexts of the X, Y, Z, etc. are ANDed together to create a single Tree context for the group and context tests for the individual predicates are suppressed: -------------------------------------------------- Note: This was incorrect. The contexts should be ORed together. This has been fixed. A more complete description is available in item #152. --------------------------------------------------- Optimization 1: (AND X Y Z ...) Suppose the context for Xtest is LA(1)==LP and the context for Ytest is LA(1)==LP && LA(2)==ID. Without the optimization the code would resemble: if (lookaheadContext && !(LA(1)==LP && LA(1)==LP && LA(2)==ID) || ( (! LA(1)==LP || Xtest) && (! (LA(1)==LP || LA(2)==ID) || Xtest) )) {... With the -mrhoist optimization the code would resemble: if (lookaheadContext && ! (LA(1)==LP && LA(2)==ID) || (Xtest && Ytest) {... Optimization 2: (OR X Y Z ...) with identical contexts Suppose the context for Xtest is LA(1)==ID and for Ytest the context is also LA(1)==ID. Without the optimization the code would resemble: if (lookaheadContext && ! (LA(1)==ID || LA(1)==ID) || (LA(1)==ID && Xtest) || (LA(1)==ID && Ytest) {... With the -mrhoist optimization the code would resemble: if (lookaheadContext && (! LA(1)==ID) || (Xtest || Ytest) {... Optimization 3: (OR X Y Z ...) with distinct contexts Suppose the context for Xtest is LA(1)==ID and for Ytest the context is LA(1)==LP. Without the optimization the code would resemble: if (lookaheadContext && ! (LA(1)==ID || LA(1)==LP) || (LA(1)==ID && Xtest) || (LA(1)==LP && Ytest) {... With the -mrhoist optimization the code would resemble: if (lookaheadContext && (zzpf=0, (LA(1)==ID && (zzpf=1) && Xtest) || (LA(1)==LP && (zzpf=1) && Ytest) || !zzpf) { These may appear to be of similar complexity at first, but the non-optimized version contains two tests of each context while the optimized version contains only one such test, as well as eliminating some of the inverted logic (" !(...) || "). Optimization 4: Computation of predicate gate trees When generating code for the gates of predicate expressions antlr 1.33 vanilla uses a recursive procedure to generate "&&" and "||" expressions for testing the lookahead. As each layer of the predicate tree is exposed a new set of "&&" and "||" expressions on the lookahead are generated. In many cases the lookahead being tested has already been tested. With -mrhoist a lookahead tree is computed for the entire lookahead expression. This means that predicates with identical context or context which is a subset of another predicate's context disappear. This is especially important for predicates formed by rules like the following: uppperCaseVowel : <>? vowel; vowel: : <>? LETTERS; These predicates are combined using AND since both must be satisfied for rule upperCaseVowel. They have identical context which makes this optimization very effective. The affect of Items #100a and #100b together can be dramatic. In a very large (but real world) grammar one particular predicate expression was reduced from an (unreadable) 50 predicate leaves, 195 LA(1) terms, and 5500 characters to an (easily comprehensible) 3 predicate leaves (all different) and a *single* LA(1) term. #99. (Changed in 1.33MR10) Code generation for expression trees Expression trees are used for k>1 grammars and predicates with lookahead depth >1. This optimization must be enabled using "-mrhoist on". (Clarification added for 1.33MR11). In the processing of expression trees, antlr can generate long chains of token comparisons. Prior to 1.33MR10 there were many redundant parenthesis which caused problems for compilers which could handle expressions of only limited complexity. For example, to test an expression tree (root R A B C D), antlr would generate something resembling: (LA(1)==R && (LA(2)==A || (LA(2)==B || (LA(2)==C || LA(2)==D))))) If there were twenty tokens to test then there would be twenty parenthesis at the end of the expression. In 1.33MR10 the generated code for tree expressions resembles: (LA(1)==R && (LA(2)==A || LA(2)==B || LA(2)==C || LA(2)==D)) For "complex" expressions the output is indented to reflect the LA number being tested: (LA(1)==R && (LA(2)==A || LA(2)==B || LA(2)==C || LA(2)==D || LA(2)==E || LA(2)==F) || LA(1)==S && (LA(2)==G || LA(2)==H)) Suggested by S. Bochnak (S.Bochnak@@microTool.com.pl), #98. (Changed in 1.33MR10) Option "-info p" When the user selects option "-info p" the program will generate detailed information about predicates. If the user selects "-mrhoist on" additional detail will be provided explaining the promotion and suppression of predicates. The output is part of the generated file and sandwiched between #if 0/#endif statements. Consider the following k=1 grammar: start : ( all ) * ; all : ( a | b ) ; a : c B ; c : <>? | B ; b : <>? X ; Below is an excerpt of the output for rule "start" for the three predicate options (off, on, and maintenance release style hoisting). For those who do not wish to use the "-mrhoist on" option for code generation the option can be used in a "diagnostic" mode to provide valuable information: a. where one should insert null actions to inhibit hoisting b. a chain of rule references which shows where predicates are being hoisted ====================================================================== Example of "-info p" with "-mrhoist on" ====================================================================== #if 0 Hoisting of predicate suppressed by alternative without predicate. The alt without the predicate includes all cases where the predicate is false. WITH predicate: line 11 v36.g WITHOUT predicate: line 12 v36.g The context set for the predicate: B The lookahead set for alt WITHOUT the semantic predicate: B The predicate: pred << LATEXT(1)>>? depth=k=1 rule c line 11 v36.g set context: B tree context: null Chain of referenced rules: #0 in rule start (line 1 v36.g) to rule all #1 in rule all (line 3 v36.g) to rule a #2 in rule a (line 8 v36.g) to rule c #3 in rule c (line 11 v36.g) #endif && #if 0 pred << LATEXT(1)>>? depth=k=1 rule b line 15 v36.g set context: X tree context: null #endif ====================================================================== Example of "-info p" with the default -prc setting ( "-prc off") ====================================================================== #if 0 OR pred << LATEXT(1)>>? depth=k=1 rule c line 11 v36.g set context: nil tree context: null pred << LATEXT(1)>>? depth=k=1 rule b line 15 v36.g set context: nil tree context: null #endif ====================================================================== Example of "-info p" with "-prc on" and "-mrhoist off" ====================================================================== #if 0 OR pred << LATEXT(1)>>? depth=k=1 rule c line 11 v36.g set context: B tree context: null pred << LATEXT(1)>>? depth=k=1 rule b line 15 v36.g set context: X tree context: null #endif ====================================================================== #97. (Fixed in 1.33MR10) "Predicate applied for more than one ... " In 1.33 vanilla, the grammar listed below produced this message for the first alternative (only) of rule "b": warning: predicate applied for >1 lookahead 1-sequences [you may only want one lookahead 1-sequence to apply. Try using a context guard '(...)? =>' In 1.33MR10 the message is issued for both alternatives. top : (a)*; a : b | c ; b : <>? ( AAA | BBB ) | <>? ( XXX | YYY ) ; c : AAA | XXX; #96. (Fixed in 1.33MR10) Guard predicates ignored when -prc off Prior to 1.33MR10, guard predicate code was not generated unless "-prc on" was selected. This was incorrect, since "-prc off" (the default) is supposed to disable only AUTOMATIC computation of predicate context, not the programmer specified context supplied by guard predicates. #95. (Fixed in 1.33MR10) Predicate guard context length was k, not max(k,ck) Prior to 1.33MR10, predicate guards were computed to k tokens rather than max(k,ck). Consider the following grammar: a : ( A B C)? => <>? (A|X) (B|Y) (C|Z) ; The code generated by 1.33 vanilla with "-k 1 -ck 3 -prc on" for the predicate in "a" resembles: if ( (! LA(1)==A) || AAA(LATEXT(1))) {... With 1.33MR10 and the same options the code resembles: if ( (! (LA(1)==A && LA(2)==B && LA(3)==C) || AAA(LATEXT(1))) {... #94. (Fixed in 1.33MR10) Predicates followed by rule references Prior to 1.33MR10, a semantic predicate which referenced a token which was off the end of the rule caused an incomplete context to be computed (with "-prc on") for the predicate under some circum- stances. In some cases this manifested itself as illegal C code (e.g. "LA(2)==[Ep](1)" in the k=2 examples below: all : ( a ) *; a : <>? ID X | <>? Y | Z ; This might also occur when the semantic predicate was followed by a rule reference which was shorter than the length of the semantic predicate: all : ( a ) *; a : <>? ID X | <>? y | Z ; y : Y ; Depending on circumstance, the resulting context might be too generous because it was too short, or too restrictive because of missing alternatives. #93. (Changed in 1.33MR10) Definition of Purify macro Ofer Ben-Ami (gremlin@cs.huji.ac.il) has supplied a definition for the Purify macro: #define PURIFY(r, s) memset((char *) &(r), '\0', (s)); Note: This may not be the right thing to do for C++ objects that have constructors. Reported by Bonny Rais (bonny@werple.net.au). For those cases one should #define PURIFY to an empty macro in the #header or #first actions. #92. (Fixed in 1.33MR10) Guarded predicates and hoisting When a guarded predicate participates in hoisting it is linked into a predicate expression tree. Prior to 1.33MR10 this link was never cleared and the next time the guard was used to construct a new tree the link could contain a spurious reference to another element which had previosly been joined to it in the semantic predicate tree. For example: start : ( all ) *; all : ( a | b ) ; start2 : ( all2 ) *; all2 : ( a ) ; a : (A)? => <>? A ; b : (B)? => <>? B ; Prior to 1.33MR10 the code for "start2" would include a spurious reference to the BBB predicate which was left from constructing the predicate tree for rule "start" (i.e. or(AAA,BBB) ). In 1.33MR10 this problem is avoided by cloning the original guard each time it is linked into a predicate tree. #91. (Changed in 1.33MR10) Extensive changes to semantic pred hoisting ============================================ This has been rendered obsolete by Item #117 ============================================ #90. (Fixed in 1.33MR10) Semantic pred with LT(i) and i>max(k,ck) There is a bug in antlr 1.33 vanilla and all maintenance releases prior to 1.33MR10 which allows semantic predicates to reference an LT(i) or LATEXT(i) where i is larger than max(k,ck). When this occurs antlr will attempt to mark the ith element of an array in which there are only max(k,ck) elements. The result cannot be predicted. Using LT(i) or LATEXT(i) for i>max(k,ck) is reported as an error in 1.33MR10. #89. Rescinded #88. (Fixed in 1.33MR10) Tokens used in semantic predicates in guess mode Consider the behavior of a semantic predicate during guess mode: rule : a:A ( <>? b:B | c:C ); Prior to MR10 the assignment of the token or attribute to $a did not occur during guess mode, which would cause the semantic predicate to misbehave because $a would be null. In 1.33MR10 a semantic predicate with a reference to an element label (such as $a) forces the assignment to take place even in guess mode. In order to work, this fix REQUIRES use of the $label format for token pointers and attributes referenced in semantic predicates. The fix does not apply to semantic predicates using the numeric form to refer to attributes (e.g. <>?). The user will receive a warning for this case. Reported by Rob Trout (trout@mcs.cs.kent.edu). #87. (Fixed in 1.33MR10) Malformed guard predicates Context guard predicates may contain only references to tokens. They may not contain references to (...)+ and (...)* blocks. This is now checked. This replaces the fatal error message in item #78 with an appropriate (non-fatal) error messge. In theory, context guards should be allowed to reference rules. However, I have not had time to fix this. Evaluation of the guard takes place before all rules have been read, making it difficult to resolve a forward reference to rule "zzz" - it hasn't been read yet ! To postpone evaluation of the guard until all rules have been read is too much for the moment. #86. (Fixed in 1.33MR10) Unequal set size in set_sub Routine set_sub() in pccts/support/set/set.h did not work correctly when the sets were of unequal sizes. Rewrote set_equ to make it simpler and remove unnecessary and expensive calls to set_deg(). This routine was not used in 1.33 vanila. #85. (Changed in 1.33MR10) Allow redefinition of MaxNumFiles Raised the maximum number of input files to 99 from 20. Put a #ifndef/#endif around the "#define MaxNumFiles 99". #84. (Fixed in 1.33MR10) Initialize zzBadTok in macro zzRULE Initialize zzBadTok to NULL in zzRULE macro of AParser.h. in order to get rid of warning messages. #83. (Fixed in 1.33MR10) False warnings with -w2 for #tokclass When -w2 is selected antlr gives inappropriate warnings about #tokclass names not having any associated regular expressions. Since a #tokclass is not a "real" token it will never have an associated regular expression and there should be no warning. Reported by Derek Pappas (derek.pappas@eng.sun.com) #82. (Fixed in 1.33MR10) Computation of follow sets with multiple cycles Reinier van den Born (reinier@vnet.ibm.com) reported a problem in the computation of follow sets by antlr. The problem (bug) exists in 1.33 vanilla and all maintenance releases prior to 1.33MR10. The problem involves the computation of follow sets when there are cycles - rules which have mutual references. I believe the problem is restricted to cases where there is more than one cycle AND elements of those cycles have rules in common. Even when this occurs it may not affect the code generated - but it might. It might also lead to undetected ambiguities. There were no changes in antlr or dlg output from the revised version. The following fragment demonstates the problem by giving different follow sets (option -pa) for var_access when built with k=1 and ck=2 on 1.33 vanilla and 1.33MR10: echo_statement : ECHO ( echo_expr )* ; echo_expr : ( command )? | expression ; command : IDENTIFIER { concat } ; expression : operand ( OPERATOR operand )* ; operand : value | START command END ; value : concat | TYPE operand ; concat : var_access { CONCAT value } ; var_access : IDENTIFIER { INDEX } ; #81. (Changed in 1.33MR10) C mode use of attributes and ASTs Reported by Isaac Clark (irclark@mindspring.com). C mode code ignores attributes returned by rules which are referenced using element labels when ASTs are enabled (-gt option). 1. start : r:rule t:Token <<$start=$r;>> The $r refrence will not work when combined with the -gt option. 2. start : t:Token <<$start=$t;>> The $t reference works in all cases. 3. start : rule <<$0=$1;>> Numeric labels work in all cases. With MR10 the user will receive an error message for case 1 when the -gt option is used. #80. (Fixed in 1.33MR10) (...)? as last alternative of block A construct like the following: rule : a | (b)? ; does not make sense because there is no alternative when the guess block fails. This is now reported as a warning to the user. Previously, there was a code generation error for this case: the guess block was not "closed" when the guess failed. This could cause an infinite loop or other problems. This is now fixed. Example problem: #header<< #include #include "charptr.h" >> << #include "charptr.c" main () { ANTLR(start(),stdin); } >> #token "[\ \t]+" << zzskip(); >> #token "[\n]" << zzline++; zzskip(); >> #token Word "[a-z]+" #token Number "[0-9]+" start : (test1)? | (test2)? ; test1 : (Word Word Word Word)? | (Word Word Word Number)? ; test2 : (Word Word Number Word)? | (Word Word Number Number)? ; Test data which caused infinite loop: a 1 a a #79. (Changed in 1.33MR10) Use of -fh with multiple parsers Previously, antlr always used the pre-processor symbol STDPCCTS_H as a gate for the file stdpccts.h. This caused problems when there were multiple parsers defined because they used the same gate symbol. In 1.33MR10, the -fh filename is used to generate the gate file for stdpccts.h. For instance: antlr -fh std_parser1.h generates the pre-processor symbol "STDPCCTS_std_parser1_H". Reported by Ramanathan Santhanam (ps@kumaran.com). #78. (Changed in 1.33MR9) Guard predicates that refer to rules ------------------------ Please refer to Item #87 ------------------------ Guard predicates are processed during an early phase of antlr (during parsing) before all data structures are completed. There is an apparent bug in earlier versions of 1.33 which caused guard predicates which contained references to rules (rather than tokens) to reference a structure which hadn't yet been initialized. In some cases (perhaps all cases) references to rules in guard predicates resulted in the use of "garbage". #79. (Changed in 1.33MR9) Jeff Vincent (JVincent@novell.com) Previously, the maximum length file name was set arbitrarily to 300 characters in antlr, dlg, and sorcerer. The config.h file now attempts to define the maximum length filename using _MAX_PATH from stdlib.h before falling back to using the value 300. #78. (Changed in 1.33MR9) Jeff Vincent (JVincent@novell.com) Put #ifndef/#endif around definition of ZZLEXBUFSIZE in antlr. #77. (Changed in 1.33MR9) Arithmetic overflow for very large grammars In routine HandleAmbiguities() antlr attempts to compute the number of possible elements in a set that is order of number-of-tokens raised to the number-of-lookahead-tokens power. For large grammars or large lookahead (e.g. -ck 7) this can cause arithmetic overflow. With 1.33MR9, arithmetic overflow in this computation is reported the first time it happens. The program continues to run and the program branches based on the assumption that the computed value is larger than any number computed by counting actual cases because 2**31 is larger than the number of bits in most computers. Before 1.33MR9 overflow was not reported. The behavior following overflow is not predictable by anyone but the original author. NOTE In 1.33MR10 the warning message is suppressed. The code which detects the overflow allows the computation to continue without an error. The error message itself made made users worry. #76. (Changed in 1.33MR9) Jeff Vincent (JVincent@novell.com) Jeff Vincent has convinced me to make ANTLRCommonToken and ANTLRCommonNoRefCountToken use variable length strings allocated from the heap rather than fixed length strings. By suitable definition of setText(), the copy constructor, and operator =() it is possible to maintain "copy" semantics. By "copy" semantics I mean that when a token is copied from an existing token it receives its own, distinct, copy of the text allocated from the heap rather than simply a pointer to the original token's text. ============================================================ W * A * R * N * I * N * G ============================================================ It is possible that this may cause problems for some users. For those users I have included the old version of AToken.h as pccts/h/AToken_traditional.h. #75. (Changed in 1.33MR9) Bruce Guenter (bruceg@qcc.sk.ca) Make DLGStringInput const correct. Since this is infrequently subclassed, it should affect few users, I hope. #74. (Changed in 1.33MR9) -o (output directory) option Antlr does not properly handle the -o output directory option when the filename of the grammar contains a directory part. For example: antlr -o outdir pccts_src/myfile.g causes antlr create a file called "outdir/pccts_src/myfile.cpp. It SHOULD create outdir/myfile.cpp The suggested code fix has been installed in antlr, dlg, and Sorcerer. #73. (Changed in 1.33MR9) Hoisting of semantic predicates and -mrhoist ============================================ This has been rendered obsolete by Item #117 ============================================ #72. (Changed in 1.33MR9) virtual saveState()/restoreState()/guess_XXX The following methods in ANTLRParser were made virtual at the request of S. Bochnak (S.Bochnak@microTool.com.pl): saveState() and restoreState() guess(), guess_fail(), and guess_done() #71. (Changed in 1.33MR9) Access to omitted command line argument If a switch requiring arguments is the last thing on the command line, and the argument is omitted, antlr would core. antlr test.g -prc instead of antlr test.g -prc off #70. (Changed in 1.33MR9) Addition of MSVC .dsp and .mak build files The following MSVC .dsp and .mak files for pccts and sorcerer were contributed by Stanislaw Bochnak (S.Bochnak@microTool.com.pl) and Jeff Vincent (JVincent@novell.com) PCCTS Distribution Kit ---------------------- pccts/PCCTSMSVC50.dsw pccts/antlr/AntlrMSVC50.dsp pccts/antlr/AntlrMSVC50.mak pccts/dlg/DlgMSVC50.dsp pccts/dlg/DlgMSVC50.mak pccts/support/msvc.dsp Sorcerer Distribution Kit ------------------------- pccts/sorcerer/SorcererMSVC50.dsp pccts/sorcerer/SorcererMSVC50.mak pccts/sorcerer/lib/msvc.dsp #69. (Changed in 1.33MR9) Change "unsigned int" to plain "int" Declaration of max_token_num in misc.c as "unsigned int" caused comparison between signed and unsigned ints giving warning message without any special benefit. #68. (Changed in 1.33MR9) Add void return for dlg internal_error() Get rid of "no return value" message in internal_error() in file dlg/support.c and dlg/dlg.h. #67. (Changed in Sor) sor.g: lisp() has no return value Added a "void" for the return type. #66. (Added to Sor) sor.g: ZZLEXBUFSIZE enclosed in #ifndef/#endif A user needed to be able to change the ZZLEXBUFSIZE for sor. Put the definition of ZZLEXBUFSIZE inside #ifndef/#endif #65. (Changed in 1.33MR9) PCCTSAST::deepCopy() and ast_dup() bug Jeff Vincent (JVincent@novell.com) found that deepCopy() made new copies of only the direct descendents. No new copies were made of sibling nodes, Sibling pointers are set to zero by shallowCopy(). PCCTS_AST::deepCopy() has been changed to make a deep copy in the traditional sense. The deepCopy() routine depends on the behavior of shallowCopy(). In all sor examples I've found, shallowCopy() zeroes the right and down pointers. Original Tree Original deepCopy() Revised deepCopy ------------- ------------------- ---------------- a->b->c A A | | | d->e->f D D->E->F | | | g->h->i G G->H->I | | j->k J->K While comparing deepCopy() for C++ mode with ast_dup for C mode I found a problem with ast_dup(). Routine ast_dup() has been changed to make a deep copy in the traditional sense. Original Tree Original ast_dup() Revised ast_dup() ------------- ------------------- ---------------- a->b->c A->B->C A | | | d->e->f D->E->F D->E->F | | | g->h->i G->H->I G->H->I | | | j->k J->K J->K I believe this affects transform mode sorcerer programs only. #64. (Changed in 1.33MR9) anltr/hash.h prototype for killHashTable() #63. (Changed in 1.33MR8) h/charptr.h does not zero pointer after free The charptr.h routine now zeroes the pointer after free(). Reported by Jens Tingleff (jensting@imaginet.fr) #62. (Changed in 1.33MR8) ANTLRParser::resynch had static variable The static variable "consumed" in ANTLRParser::resynch was changed into an instance variable of the class with the name "resynchConsumed". Reported by S.Bochnak@microTool.com.pl #61. (Changed in 1.33MR8) Using rule>[i,j] when rule has no return values Previously, the following code would cause antlr to core when it tried to generate code for rule1 because rule2 had no return values ("upward inheritance"): rule1 : <> rule2 > [i,j] ; rule2 : Anything ; Reported by S.Bochnak@microTool.com.pl Verified correct operation of antlr MR8 when missing or extra inheritance arguments for all combinations. When there are missing or extra arguments code will still be generated even though this might cause the invocation of a subroutine with the wrong number of arguments. #60. (Changed in 1.33MR7) Major changes to exception handling There were significant problems in the handling of exceptions in 1.33 vanilla. The general problem is that it can only process one level of exception handler. For example, a named exception handler, an exception handler for an alternative, or an exception for a subrule always went to the rule's exception handler if there was no "catch" which matched the exception. In 1.33MR7 the exception handlers properly "nest". If an exception handler does not have a matching "catch" then the nextmost outer exception handler is checked for an appropriate "catch" clause, and so on until an exception handler with an appropriate "catch" is found. There are still undesirable features in the way exception handlers are implemented, but I do not have time to fix them at the moment: The exception handlers for alternatives are outside the block containing the alternative. This makes it impossible to access variables declared in a block or to resume the parse by "falling through". The parse can still be easily resumed in other ways, but not in the most natural fashion. This results in an inconsistentcy between named exception handlers and exception handlers for alternatives. When an exception handler for an alternative "falls through" it goes to the nextmost outer handler - not the "normal action". A major difference between 1.33MR7 and 1.33 vanilla is the default action after an exception is caught: 1.33 Vanilla ------------ In 1.33 vanilla the signal value is set to zero ("NoSignal") and the code drops through to the code following the exception. For named exception handlers this is the "normal action". For alternative exception handlers this is the rule's handler. 1.33MR7 ------- In 1.33MR7 the signal value is NOT automatically set to zero. There are two cases: For named exception handlers: if the signal value has been set to zero the code drops through to the "normal action". For all other cases the code branches to the nextmost outer exception handler until it reaches the handler for the rule. The following macros have been defined for convenience: C/C++ Mode Name -------------------- (zz)suppressSignal set signal & return signal arg to 0 ("NoSignal") (zz)setSignal(intValue) set signal & return signal arg to some value (zz)exportSignal copy the signal value to the return signal arg I'm not sure why PCCTS make a distinction between the local signal value and the return signal argument, but I'm loathe to change the code. The burden of copying the local signal value to the return signal argument can be given to the default signal handler, I suppose. #59. (Changed in 1.33MR7) Prototypes for some functions Added prototypes for the following functions to antlr.h zzconsumeUntil() zzconsumeUntilToken() #58. (Changed in 1.33MR7) Added defintion of zzbufsize to dlgauto.h #57. (Changed in 1.33MR7) Format of #line directive Previously, the -gl directive for line 1234 would resemble: "# 1234 filename.g". This caused problems for some compilers/pre-processors. In MR7 it generates "#line 1234 filename.g". #56. (Added in 1.33MR7) Jan Mikkelsen Move PURIFY macro invocaton to after rule's init action. #55. (Fixed in 1.33MR7) Unitialized variables in ANTLRParser Member variables inf_labase and inf_last were not initialized. (See item #50.) #54. (Fixed in 1.33MR6) Brad Schick (schick@interacess.com) Previously, the following constructs generated the same code: rule1 : (A B C)? | something-else ; rule2 : (A B C)? () | something-else ; In all versions of pccts rule1 guesses (A B C) and then consume all three tokens if the guess succeeds. In MR6 rule2 guesses (A B C) but consumes NONE of the tokens when the guess succeeds because "()" matches epsilon. #53. (Explanation for 1.33MR6) What happens after an exception is caught ? The Book is silent about what happens after an exception is caught. The following code fragment prints "Error Action" followed by "Normal Action". test : Word ex:Number <> exception[ex] catch NoViableAlt: <> ; The reason for "Normal Action" is that the normal flow of the program after a user-written exception handler is to "drop through". In the case of an exception handler for a rule this results in the exection of a "return" statement. In the case of an exception handler attached to an alternative, rule, or token this is the code that would have executed had there been no exception. The user can achieve the desired result by using a "return" statement. test : Word ex:Number <> exception[ex] catch NoViableAlt: <> ; The most powerful mechanism for recovery from parse errors in pccts is syntactic predicates because they provide backtracking. Exceptions allow "return", "break", "consumeUntil(...)", "goto _handler", "goto _fail", and changing the _signal value. #52. (Fixed in 1.33MR6) Exceptions without syntactic predicates The following generates bad code in 1.33 if no syntactic predicates are present in the grammar. test : Word ex:Number <> exception[ex] catch NoViableAlt: <> There is a reference to a guess variable. In C mode this causes a compiler error. In C++ mode it generates an extraneous check on member "guessing". In MR6 correct code is generated for both C and C++ mode. #51. (Added to 1.33MR6) Exception operator "@" used without exceptions In MR6 added a warning when the exception operator "@" is used and no exception group is defined. This is probably a case where "\@" or "@" is meant. #50. (Fixed in 1.33MR6) Gunnar Rxnning (gunnar@candleweb.no) http://www.candleweb.no/~gunnar/ Routines zzsave_antlr_state and zzrestore_antlr_state don't save and restore all the data needed when switching states. Suggested patch applied to antlr.h and err.h for MR6. #49. (Fixed in 1.33MR6) Sinan Karasu (sinan@boeing.com) Generated code failed to turn off guess mode when leaving a (...)+ block which contained a guess block. The result was an infinite loop. For example: rule : ( (x)? | y )+ Suggested code fix implemented in MR6. Replaced ... else if (zzcnt>1) break; with: C++ mode: ... else if (zzcnt>1) {if (!zzrv) zzGUESS_DONE; break;}; C mode: ... else if (zzcnt>1) {if (zzguessing) zzGUESS_DONE; break;}; #48. (Fixed in 1.33MR6) Invalid exception element causes core A label attached to an invalid construct can cause pccts to crash while processing the exception associated with the label. For example: rule : t:(B C) exception[t] catch MismatchedToken: <> Version MR6 generates the message: reference in exception handler to undefined label 't' #47. (Fixed in 1.33MR6) Manuel Ornato Under some circumstances involving a k >1 or ck >1 grammar and a loop block (i.e. (...)* ) pccts will fail to detect a syntax error and loop indefinitely. The problem did not exist in 1.20, but has existed from 1.23 to the present. Fixed in MR6. --------------------------------------------------- Complete test program --------------------------------------------------- #header<< #include #include "charptr.h" >> << #include "charptr.c" main () { ANTLR(global(),stdin); } >> #token "[\ \t]+" << zzskip(); >> #token "[\n]" << zzline++; zzskip(); >> #token B "b" #token C "c" #token D "d" #token E "e" #token LP "\(" #token RP "\)" #token ANTLREOF "@" global : ( (E liste) | liste | listed ) ANTLREOF ; listeb : LP ( B ( B | C )* ) RP ; listec : LP ( C ( B | C )* ) RP ; listed : LP ( D ( B | C )* ) RP ; liste : ( listeb | listec )* ; --------------------------------------------------- Sample data causing infinite loop --------------------------------------------------- e (d c) --------------------------------------------------- #46. (Fixed in 1.33MR6) Robert Richter (Robert.Richter@infotech.tu-chemnitz.de) This item from the list of known problems was fixed by item #18 (below). #45. (Fixed in 1.33MR6) Brad Schick (schick@interaccess.com) The dependency scanner in VC++ mistakenly sees a reference to an MPW #include file even though properly #ifdef/#endif in config.h. The suggested workaround has been implemented: #ifdef MPW ..... #define MPW_CursorCtl_Header #include MPW_CursorCtl_Header ..... #endif #44. (Fixed in 1.33MR6) cast malloc() to (char *) in charptr.c Added (char *) cast for systems where malloc returns "void *". #43. (Added to 1.33MR6) Bruce Guenter (bruceg@qcc.sk.ca) Add setLeft() and setUp methods to ASTDoublyLinkedBase for symmetry with setRight() and setDown() methods. #42. (Fixed in 1.33MR6) Jeff Katcher (jkatcher@nortel.ca) C++ style comment in antlr.c corrected. #41. (Added in 1.33MR6) antlr -stdout Using "antlr -stdout ..." forces the text that would normally go to the grammar.c or grammar.cpp file to stdout. #40. (Added in 1.33MR6) antlr -tab to change tab stops Using "antlr -tab number ..." changes the tab stops for the grammar.c or grammar.cpp file. The number must be between 0 and 8. Using 0 gives tab characters, values between 1 and 8 give the appropriate number of space characters. #39. (Fixed in 1.33MR5) Jan Mikkelsen Commas in function prototype still not correct under some circumstances. Suggested code fix installed. #38. (Fixed in 1.33MR5) ANTLRTokenBuffer constructor Have ANTLRTokenBuffer ctor initialize member "parser" to null. #37. (Fixed in 1.33MR4) Bruce Guenter (bruceg@qcc.sk.ca) In ANTLRParser::FAIL(int k,...) released memory pointed to by f[i] (as well as f itself. Should only free f itself. #36. (Fixed in 1.33MR3) Cortland D. Starrett (cort@shay.ecn.purdue.edu) Neglected to properly declare isDLGmaxToken() when fixing problem reported by Andreas Magnusson. Undo "_retv=NULL;" change which caused problems for return values from rules whose return values weren't pointers. Failed to create bin directory if it didn't exist. #35. (Fixed in 1.33MR2) Andreas Magnusson (Andreas.Magnusson@mailbox.swipnet.se) Repair bug introduced by 1.33MR1 for #tokdefs. The original fix placed "DLGmaxToken=9999" and "DLGminToken=0" in the TokenType enum in order to fix a problem with an aggresive compiler assigning an 8 bit enum which might be too narrow. This caused #tokdefs to assume that there were 9999 real tokens. The repair to the fix causes antlr to ignore TokenTypes "DLGmaxToken" and "DLGminToken" in a #tokdefs file. #34. (Added to 1.33MR1) Add public DLGLexerBase::set_line(int newValue) Previously there was no public function for changing the line number maintained by the lexer. #33. (Fixed in 1.33MR1) Franklin Chen (chen@adi.com) Accidental use of EXIT_FAILURE rather than PCCTS_EXIT_FAILURE in pccts/h/AParser.cpp. #32. (Fixed in 1.33MR1) Franklin Chen (chen@adi.com) In PCCTSAST.cpp lines 405 and 466: Change free (t) to free ( (char *)t ); to match prototype. #31. (Added to 1.33MR1) Pointer to parser in ANTLRTokenBuffer Pointer to parser in DLGLexerBase The ANTLRTokenBuffer class now contains a pointer to the parser which is using it. This is established by the ANTLRParser constructor calling ANTLRTokenBuffer:: setParser(ANTLRParser *p). When ANTLRTokenBuffer::setParser(ANTLRParser *p) is called it saves the pointer to the parser and then calls ANTLRTokenStream::setParser(ANTLRParser *p) so that the lexer can also save a pointer to the parser. There is also a function getParser() in each class with the obvious purpose. It is possible that these functions will return NULL under some circumstances (e.g. a non-DLG lexer is used). #30. (Added to 1.33MR1) function tokenName(int token) standard The generated parser class now includes the function: static const ANTLRChar * tokenName(int token) which returns a pointer to the "name" corresponding to the token. The base class (ANTLRParser) always includes the member function: const ANTLRChar * parserTokenName(int token) which can be accessed by objects which have a pointer to an ANTLRParser, but do not know the name of the parser class (e.g. ANTLRTokenBuffer and DLGLexerBase). #29. (Added to 1.33MR1) Debugging DLG lexers If the pre-processor symbol DEBUG_LEXER is defined then DLexerBase will include code for printing out key information about tokens which are recognized. The debug feature of the lexer is controlled by: int previousDebugValue=lexer.debugLexer(newValue); a value of 0 disables output a value of 1 enables output Even if the lexer debug code is compiled into DLexerBase it must be enabled before any output is generated. For example: DLGFileInput in(stdin); MyDLG lexer(&in,2000); lexer.setToken(&aToken); #if DEBUG_LEXER lexer.debugLexer(1); // enable debug information #endif #28. (Added to 1.33MR1) More control over DLG header Version 1.33MR1 adds the following directives to PCCTS for C++ mode: #lexprefix <> Adds source code to the DLGLexer.h file after the #include "DLexerBase.h" but before the start of the class definition. #lexmember <> Adds source code to the DLGLexer.h file as part of the DLGLexer class body. It appears immediately after the start of the class and a "public: statement. #27. (Fixed in 1.33MR1) Comments in DLG actions Previously, DLG would not recognize comments as a special case. Thus, ">>" in the comments would cause errors. This is fixed. #26. (Fixed in 1.33MR1) Removed static variables from error routines Previously, the existence of statically allocated variables in some of the parser's member functions posed a danger when there was more than one parser active. Replaced with dynamically allocated/freed variables in 1.33MR1. #25. (Fixed in 1.33MR1) Use of string literals in semantic predicates Previously, it was not possible to place a string literal in a semantic predicate because it was not properly "stringized" for the report of a failed predicate. #24. (Fixed in 1.33MR1) Continuation lines for semantic predicates Previously, it was not possible to continue semantic predicates across a line because it was not properly "stringized" for the report of a failed predicate. rule : <>?[ a very long statement ] #23. (Fixed in 1.33MR1) {...} envelope for failed semantic predicates Previously, there was a code generation error for failed semantic predicates: rule : <>?[ stmt1; stmt2; ] which generated code which resembled: if (! xyz()) stmt1; stmt2; It now puts the statements in a {...} envelope: if (! xyz()) { stmt1; stmt2; }; #22. (Fixed in 1.33MR1) Continuation of #token across lines using "\" Previously, it was not possible to continue a #token regular expression across a line. The trailing "\" and newline caused a newline to be inserted into the regular expression by DLG. Fixed in 1.33MR1. #21. (Fixed in 1.33MR1) Use of ">>" (right shift operator in DLG actions It is now possible to use the C++ right shift operator ">>" in DLG actions by using the normal escapes: #token "shift-right" << value=value \>\> 1;>> #20. (Version 1.33/19-Jan-97 Karl Eccleson P.A. Keller (P.A.Keller@bath.ac.uk) There is a problem due to using exceptions with the -gh option. Suggested fix now in 1.33MR1. #19. (Fixed in 1.33MR1) Tom Piscotti and John Lilley There were problems suppressing messages to stdin and stdout when running in a window environment because some functions which uses fprint were not virtual. Suggested change now in 1.33MR1. I believe all functions containing error messages (excluding those indicating internal inconsistency) have been placed in functions which are virtual. #18. (Version 1.33/ 22-Nov-96) John Bair (jbair@iftime.com) Under some combination of options a required "return _retv" is not generated. Suggested fix now in 1.33MR1. #17. (Version 1.33/3-Sep-96) Ron House (house@helios.usq.edu.au) The routine ASTBase::predorder_action omits two "tree->" prefixes, which results in the preorder_action belonging to the wrong node to be invoked. Suggested fix now in 1.33MR1. #16. (Version 1.33/7-Jun-96) Eli Sternheim Routine consumeUntilToken() does not check for end-of-file condition. Suggested fix now in 1.33MR1. #15. (Version 1.33/8 Apr 96) Asgeir Olafsson Problem with tree duplication of doubly linked ASTs in ASTBase.cpp. Suggested fix now in 1.33MR1. #14. (Version 1.33/28-Feb-96) Andreas.Magnusson@mailbox.swipnet.se Problem with definition of operator = (const ANTLRTokenPtr rhs). Suggested fix now in 1.33MR1. #13. (Version 1.33/13-Feb-96) Franklin Chen (chen@adi.com) Sun C++ Compiler 3.0.1 can't compile testcpp/1 due to goto in block with destructors. Apparently fixed. Can't locate "goto". #12. (Version 1.33/10-Nov-95) Minor problems with 1.33 code The following items have been fixed in 1.33MR1: 1. pccts/antlr/main.c line 142 "void" appears in classic C code 2. no makefile in support/genmk 3. EXIT_FAILURE/_SUCCESS instead of PCCTS_EXIT_FAILURE/_SUCCESS pccts/h/PCCTSAST.cpp pccts/h/DLexerBase.cpp pccts/testcpp/6/test.g 4. use of "signed int" isn't accepted by AT&T cfront pccts/h/PCCTSAST.h line 42 5. in call to ANTLRParser::FAIL the var arg err_k is passed as "int" but is declared "unsigned int". 6. I believe that a failed validation predicate still does not get put in a "{...}" envelope, despite the release notes. 7. The #token ">>" appearing in the DLG grammar description causes DLG to generate the string literal "\>\>" which is non-conforming and will cause some compilers to complain (scan.c function act10 line 143 of source code). #11. (Version 1.32b6) Dave Kuhlman (dkuhlman@netcom.com) Problem with file close in gen.c. Already fixed in 1.33. #10. (Version 1.32b6/29-Aug-95) pccts/antlr/main.c contains a C++ style comments on lines 149 and 176 which causes problems for most C compilers. Already fixed in 1.33. #9. (Version 1.32b4/14-Mar-95) dlgauto.h #include "config.h" The file pccts/h/dlgauto.h should probably contain a #include "config.h" as it uses the #define symbol __USE_PROTOS. Added to 1.33MR1. #8. (Version 1.32b4/6-Mar-95) Michael T. Richter (mtr@igs.net) In C++ output mode anonymous tokens from in-line regular expressions can create enum values which are too wide for the datatype of the enum assigned by the C++ compiler. Fixed in 1.33MR1. #7. (Version 1.32b4/6-Mar-95) C++ does not imply __STDC__ In err.h the combination of # directives assumes that a C++ compiler has __STDC__ defined. This is not necessarily true. This problem also appears in the use of __USE_PROTOS which is appropriate for both Standard C and C++ in antlr/gen.c and antlr/lex.c Fixed in 1.33MR1. #6. (Version 1.32 ?/15-Feb-95) Name conflict for "TokenType" Already fixed in 1.33. #5. (23-Jan-95) Douglas_Cuthbertson.JTIDS@jtids_qmail.hanscom.af.mil The fail action following a semantic predicate is not enclosed in "{...}". This can lead to problems when the fail action contains more than one statement. Fixed in 1.33MR1. #4 . (Version 1.33/31-Mar-96) jlilley@empathy.com (John Lilley) Put briefly, a semantic predicate ought to abort a guess if it fails. Correction suggested by J. Lilley has been added to 1.33MR1. #3 . (Version 1.33) P.A.Keller@bath.ac.uk Extra commas are placed in the K&R style argument list for rules when using both exceptions and ASTs. Fixed in 1.33MR1. #2. (Version 1.32b6/2-Oct-95) Brad Schick Construct #[] generates zzastnew() in C++ mode. Already fixed in 1.33. #1. (Version 1.33) Bob Bailey (robert@oakhill.sps.mot.com) Previously, config.h assumed that all PC systems required "short" file names. The user can now override that assumption with "#define LONGFILENAMES". Added to 1.33MR1. gtkwave-3.3.86/contrib/pccts/sorcerer/0000775000175000017500000000000013166335473017204 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/sorcerer/sor.r0000664000175000017500000001250613166335473020176 0ustar bybellbybell#include "cmdo.r" resource 'cmdo' (128, "Sourcerer") { { /* array dialogs: 2 elements */ /* [1] */ 295, "Sorcerer -- Purdue Compiler Construction" " Tool Set (PCCTS) simple tree-parser gen" "erator.", { /* array itemArray: 7 elements */ /* [1] */ NotDependent { }, CheckOption { NotSet, {18, 23, 33, 223}, "Read grammar from stdin", "-", "Read grammar from stdin." }, /* [2] */ NotDependent { }, MultiFiles { "Grammar File(s)É", "Choose the grammar specification files y" "ou wish to have Sorcerer process.", {79, 22, 98, 152}, "Grammar specification:", "", MultiInputFiles { { /* array MultiTypesArray: 1 elements */ /* [1] */ text }, ".g", "Files ending in .g", "All text files" } }, /* [3] */ NotDependent { }, Files { DirOnly, OptionalFile { {58, 168, 74, 298}, {79, 169, 98, 299}, "Output Directory", ":", "-out-dir", "", "Choose the directory where SORCERER will" " put its output.", dim, "Output DirectoryÉ", "", "" }, NoMore { } }, /* [4] */ NotDependent { }, Redirection { StandardOutput, {126, 27} }, /* [5] */ NotDependent { }, Redirection { DiagnosticOutput, {126, 178} }, /* [6] */ NotDependent { }, TextBox { gray, {117, 20, 167, 300}, "Redirection" }, /* [7] */ NotDependent { }, NestedDialog { 2, {20, 324, 40, 460}, "OptionsÉ", "Other options may be set with this butto" "n." } }, /* [2] */ 295, "Use this dialog to specify command line " "Generate Options.", { /* array itemArray: 10 elements */ /* [1] */ NotDependent { }, CheckOption { NotSet, {18, 25, 33, 225}, "Generate C++ code", "-CPP", "Turn on C++ output mode. You must define" " a class around your grammar rules. An \"" ".h\" and \".c\" file are created for the cl" "ass definition as well as the normal \".c" "\" file for the parser your grammar rules" "." }, /* [2] */ Or { { /* array OrArray: 1 elements */ /* [1] */ 1 } }, CheckOption { NotSet, {39, 25, 54, 354}, "Define referenced tokens in class defini" "tion file", "-def-tokens", "For each token referenced in the grammar" ", generate an enum STokenType definition" " in the class definition file. This shou" "ld not be used with the #tokedefs direct" "ive, which specifies token types you've " "already defined." }, /* [3] */ Or { { /* array OrArray: 1 elements */ /* [1] */ -1 } }, RegularEntry { "Define referenced tokens in:", {63, 25, 78, 208}, {63, 220, 79, 291}, "", keepCase, "-def-tokens-file", "For each token referenced in the grammar" ", generate a #define in the specified fi" "le This should not be used with the #tok" "defs directive, which specifies token t" "ypes you've already defined." }, /* [4] */ Or { { /* array OrArray: 1 elements */ /* [1] */ -1 } }, RadioButtons { { /* array radioArray: 3 elements */ /* [1] */ {37, 374, 52, 434}, "ANSI", "-funcs ANSI", Set, "When this option is selected, SORCERER w" "ill generate ANSI style function headers" " and prototypes.", /* [2] */ {55, 374, 70, 434}, "K&R", "-funcs KR", NotSet, "When this option is selected, SORCERER w" "ill generate K&R style function headers " "and prototypes.", /* [3] */ {73, 374, 88, 434}, "Both", "-funcs both", NotSet, "When this option is selected, SORCERER w" "ill generate both ANSI and K&R style fun" "ction headers and prototypes." } }, /* [5] */ NotDependent { }, TextBox { gray, {29, 359, 101, 450}, "Style" }, /* [6] */ NotDependent { }, CheckOption { NotSet, {90, 25, 105, 229}, "Print out internal data structure", "-guts", "Print out a bunch of interna data struct" "ures." }, /* [7] */ NotDependent { }, CheckOption { NotSet, {113, 25, 128, 226}, "Transformation mode", "-transform", "Assume that a tree transformation will t" "ake place." }, /* [8] */ NotDependent { }, CheckOption { NotSet, {137, 25, 152, 238}, "Don't generate header info.. ", "-inline", "Only generate actions and functions for " "the given rules. Do not generate header " "information in the output. The usefulnes" "s of this options for anything but docum" "entation has not been established." }, /* [9] */ Or { { /* array OrArray: 1 elements */ /* [1] */ -1 } }, RegularEntry { "Prefix:", {163, 25, 177, 83}, {163, 98, 179, 193}, " ", keepCase, "-prefix", "Prefix all globally visible symbols with" " this, including the error routines. Act" "ions that call rules must prefix the fun" "ction with this as well. " }, /* [10] */ Or { { /* array OrArray: 1 elements */ /* [1] */ -1 } }, RegularEntry { "Proto file:", {163, 228, 178, 309}, {163, 318, 179, 413}, " ", keepCase, "-proto-file", "Put all prototypes for rule functions in" " this file. " } } } }; gtkwave-3.3.86/contrib/pccts/sorcerer/cpp.c0000664000175000017500000001071113166335473020132 0ustar bybellbybell/* * cpp.c -- support for generating C++ output * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public * domain. An individual or company may do whatever they wish with * source code distributed with SORCERER or the code generated by * SORCERER, including the incorporation of SORCERER, or its output, into * commerical software. * * We encourage users to develop software with SORCERER. However, we do * ask that credit is given to us for developing SORCERER. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like SORCERER and have developed a nice tool with the * output, please mention that you developed it using SORCERER. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * SORCERER 1.00B * Terence Parr * AHPCRC, University of Minnesota * 1992-2001 */ #include "stdpccts.h" #include "sym.h" #include "pcctscfg.h" #include "proto.h" void GenCPPClassHeader() { FILE *Parser_h; char CPPParser_h_Name[MaxFileName+1]; strcpy(CPPParser_h_Name, CurClassName); strcat(CPPParser_h_Name, ".h"); Parser_h = fopen(OutMetaName(CPPParser_h_Name), "w"); require(Parser_h != NULL, "can't open parser.h file"); #ifdef SPECIAL_FOPEN special_fopen_actions(OutMetaName(CPPParser_h_Name)); #endif /* Put a gate on the header file */ fprintf(Parser_h, "#ifndef %s_h\n", CurClassName); fprintf(Parser_h, "#define %s_h\n", CurClassName); gen_info_hdr(Parser_h); fprintf(Parser_h, "#include \"%s\"\n", STPARSER_H); if ( header_action!=NULL ) dumpAction(header_action, Parser_h, 0, -1, 0, 1); fprintf(Parser_h, "\n"); fprintf(Parser_h, "class %s : public STreeParser {\n", CurClassName); fprintf(Parser_h, "protected:\n"); /* Define @-vars in class */ if ( AllRefVars!=NULL ) { ListNode *p; for (p = AllRefVars->next; p!=NULL; p=p->next) { RefVarRec *r = (RefVarRec *)p->elem; fprintf(Parser_h, "\t%s;\n", r->decl); } } /* Generate list of tokens if demanded */ if ( def_tokens ) { ListNode *p; fprintf(Parser_h, "public:\n"); fprintf(Parser_h, "\tenum STokenType {\n"); for (p = token_list->next; p!=NULL; p=p->next) { SymEntry *t = (SymEntry *) p->elem; fprintf(Parser_h, "\t\t%s=%d", t->str, t->token_type); if ( p->next!=NULL ) fprintf(Parser_h, ",\n"); else fprintf(Parser_h, "\n"); } fprintf(Parser_h, "\t};\n"); } fprintf(Parser_h, "public:\n"); if (NoCtor) { /* MR23 */ fprintf(Parser_h, "#if 0\n"); fprintf(Parser_h, "\t// The default ctor has been suppressed\n\t// by the -noctor option.\n\n"); } fprintf(Parser_h, " %s();\n", CurClassName); if (NoCtor) { /* MR23 */ fprintf(Parser_h, "#endif\n"); } /* fprintf(Parser_h, " virtual AST *ast_node(int, char *) {return NULL;}\n");*/ fprintf(Parser_h, "\n"); GenRulePrototypes( Parser_h, 1 ); if ( class_actions != NULL ) { ListNode *p; for (p = class_actions->next; p!=NULL; p=p->next) dumpAction( (char *)p->elem, output, 1, -1, 0, 1); } fprintf(Parser_h, "};\n"); fprintf(Parser_h, "\n#endif /* %s_h */\n", CurClassName); fclose(Parser_h); } void GenCPPClassCode() { FILE *Parser_c; char CPPParser_C_Name[MaxFileName+1]; strcpy(CPPParser_C_Name, CurClassName); strcat(CPPParser_C_Name, CPP_FILE_SUFFIX); ensure_no_C_file_collisions(CPPParser_C_Name); Parser_c = fopen(OutMetaName(CPPParser_C_Name), "w"); require(Parser_c != NULL, "can't open class Parserx.c file"); #ifdef SPECIAL_FOPEN special_fopen_actions(OutMetaName(CPPParser_C_Name)); #endif gen_info_hdr(Parser_c); fprintf(Parser_c, "#include \"%s.h\"\n\n", CurClassName); if (NoCtor) { /* MR23 */ fprintf(Parser_c, "#if 0\n\n"); fprintf(Parser_c, "\t// The default ctor has been suppressed\n\t// by the -noctor option.\n\n"); } /* Build constructor (init @-vars) */ fprintf(Parser_c, "%s::%s()\n{\n", CurClassName, CurClassName); if ( AllRefVars!=NULL ) { ListNode *p; for (p = AllRefVars->next; p!=NULL; p=p->next) { RefVarRec *r = (RefVarRec *)p->elem; if ( r->init[0]!='\0' ) fprintf(Parser_c, "\t%s=%s;\n", r->var, r->init); } } fprintf(Parser_c, "}\n\n"); if (NoCtor) { /* MR23 */ fprintf(Parser_c, "#endif\n\n"); } fclose(Parser_c); } gtkwave-3.3.86/contrib/pccts/sorcerer/msvc.dsw0000664000175000017500000000077613166335473020705 0ustar bybellbybellMicrosoft Developer Studio Workspace File, Format Version 5.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "Sorcerer"=.\Sorcerer.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### gtkwave-3.3.86/contrib/pccts/sorcerer/main.c0000664000175000017500000005761413166335473020311 0ustar bybellbybell/* * main.c * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public * domain. An individual or company may do whatever they wish with * source code distributed with SORCERER or the code generated by * SORCERER, including the incorporation of SORCERER, or its output, into * commerical software. * * We encourage users to develop software with SORCERER. However, we do * ask that credit is given to us for developing SORCERER. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like SORCERER and have developed a nice tool with the * output, please mention that you developed it using SORCERER. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * SORCERER 1.00B * Terence Parr * AHPCRC, University of Minnesota * 1992-2001 */ #include "pcctscfg.h" #include "stdpccts.h" #include "sym.h" #include "proto.h" #include #define MAX_INT_STACK 50 static int istack[MAX_INT_STACK]; /* Int stack */ static int isp = MAX_INT_STACK; static int DontAcceptStdin = 0; static int DontAcceptFiles = 0; typedef struct _Opt { char *option; int arg; #ifdef __cplusplus void (*process)(...); #else void (*process)(); #endif char *descr; } Opt; #ifdef __USE_PROTOS static int cistrequ(char *a,char *b) #else static int cistrequ(a,b) char *a; char *b; #endif { for ( ;*a != 0 && *b != 0; a++, b++) { if (toupper(*a) != toupper(*b)) return 0; } return (*a == *b); } #ifdef __USE_PROTOS static void ProcessArgs(int, char **, Opt *); #else static void ProcessArgs(); #endif static void #ifdef __USE_PROTOS pOut( char *s, char *t ) #else pOut( s, t ) char *s; char *t; #endif { OutputDirectory = t; } static void #ifdef __USE_PROTOS pFile( char *s ) #else pFile( s ) char *s; #endif { if ( *s=='-' ) { warnNoFL( eMsg1("invalid option: '%s'",s) ); return; } if ( DontAcceptFiles ) { warnNoFL(eMsg1("file '%s' ignored as '-' (stdin option) was specified first",s)); return; } require(NumFiles argc = ccommand (&argv); #endif fprintf(stderr, "Sorcerer - A simple tree-parser generator Version %s 1992-2001\n", VersionText); if ( argc == 1 ) { help(); zzDONE; } ProcessArgs(argc-1, &(argv[1]), options); symbols = newHashTable(); token_dict = (char **) calloc(token_table_size, sizeof(char *)); require(token_dict != NULL, "main: can't create token_dict"); output = stdout; input = NextFile(); require(input!=NULL, "No grammar description found (exiting...)"); root = read_sor_desc(input); if ( root!=NULL ) gen(root); if ( found_error ) { fprintf(stderr, "no parser generated due to parsing errors; exiting...\n"); zzDIE; } if ( GenCPP ) { GenCPPClassHeader(); GenCPPClassCode(); } if ( !UserDefdTokens ) gen_tokens_file(); else if ( def_token_file!=NULL ) { warnNoFL("tokens file not generated; it conflicts with use of #tokdefs"); } if ( GenProtoFile!=NULL ) { FILE *ProtoFILE; ProtoFILE = fopen(OutMetaName(GenProtoFile), "w"); if ( ProtoFILE==NULL ) {warnNoFL(eMsg1("Can't open prototype file '%s'; ignored",GenProtoFile));} else { #ifdef SPECIAL_FOPEN special_fopen_actions(OutMetaName(GenProtoFile)); #endif gen_info_hdr( ProtoFILE ); if ( header_action!=NULL ) dumpAction(header_action, ProtoFILE, 0, -1, 0, 1); GenRulePrototypes( ProtoFILE, 0 ); fclose(ProtoFILE); } } if ( found_error ) {zzDIE;} else zzDONE; } void #ifdef __USE_PROTOS help(void) #else help() #endif { Opt *p = options; static char buf[MaxRuleName+1]; fprintf(stderr, "sor [options] f1.sor ... fn.sor\n"); while ( p->option!=NULL && *(p->option) != '*' ) { buf[0]='\0'; if ( p->arg ) sprintf(buf, "%s ___", p->option); else strcpy(buf, p->option); fprintf(stderr, " %-20s %s\n", buf, p->descr); p++; } } FILE * #ifdef __USE_PROTOS NextFile( void ) #else NextFile( ) #endif { FILE *f; for (;;) { if ( CurFile+1 >= NumFiles ) return(NULL); CurFile++; if ( cistrequ(FileStr[CurFile],"stdin")) return stdin; f = fopen(FileStr[CurFile], "r"); if ( f == NULL ) { warnNoFL( eMsg1("file %s doesn't exist; ignored", FileStr[CurFile]) ); } else { return(f); } } } void #ifdef __USE_PROTOS pushint( int i ) #else pushint( i ) int i; #endif { require(isp>0, "pushint: stack overflow"); istack[--isp] = i; } int #ifdef __USE_PROTOS popint( void ) #else popint( ) #endif { require(ispelem = e; if ( *list == NULL ) { ListNode *sentinel = newListNode; require(sentinel!=NULL, "list_add: cannot alloc sentinel node"); *list=sentinel; sentinel->next = p; sentinel->elem = (char *)p; /* set tail pointer */ } else /* find end of list */ { tail = (ListNode *) (*list)->elem; /* get tail pointer */ tail->next = p; (*list)->elem = (char *) p; /* reset tail */ } } static void #ifdef __USE_PROTOS ProcessArgs( int argc, char **argv, Opt *options ) #else ProcessArgs( argc, argv, options ) int argc; char **argv; Opt *options; #endif { Opt *p; require(argv!=NULL, "ProcessArgs: command line NULL"); while ( argc-- > 0 ) { p = options; while ( p->option != NULL ) { if ( strcmp(p->option, "*") == 0 || cistrequ(p->option, *argv)) { if ( p->arg ) { (*p->process)( *argv, *(argv+1) ); argv++; argc--; } else (*p->process)( *argv ); break; } p++; } argv++; } } /* * Given a string, this function allocates and returns a pointer to a * hash table record of size 'sz' whose "str" pointer is reset to a position * in the string table. */ Entry * #ifdef __USE_PROTOS newEntry( char *text, int sz ) #else newEntry( text, sz ) char *text; int sz; #endif { Entry *p; require(text!=NULL, "new: NULL terminal"); if ( (p = (Entry *) calloc(1,sz)) == 0 ) { fatal("newEntry: out of memory for terminals\n"); exit(1); } p->str = mystrdup(text); return(p); } void #ifdef __USE_PROTOS token_association(int token_type, char *text) #else token_association( token_type, text ) int token_type; char *text; #endif { if ( token_type >= token_table_size ) /* overflow? */ { char **p; int i, more; more = 100; token_table_size += more; token_dict = (char **) realloc(token_dict, token_table_size*sizeof(char *)); require(token_dict != NULL, "token_association: can't extend token_dict"); for (p= &token_dict[token_table_size-more],i=1; i<=more; i++) *p++ = NULL; } token_dict[token_type] = text; } /* * Return a string corresponding to the output file name associated * with the input file name passed in. * * Observe the following rules: * * f.e --> f".c" * f --> f".c" * f. --> f".c" * f.e.t --> f.e".c" * * Where f,e,t are arbitrarily long sequences of characters in a file * name. * * In other words, if a ".x" appears on the end of a file name, make it * ".c". If no ".x" appears, append ".c" to the end of the file name. * * Use malloc() for new string. */ char * #ifdef __USE_PROTOS outname( char *fs ) #else outname( fs ) char *fs; #endif { static char buf[MaxFileName+1]; char *p; p = buf; strcpy(buf, fs); while ( *p != '\0' ) {p++;} /* Stop on '\0' */ while ( *p != '.' && p != buf ) {--p;} /* Find '.' */ if ( p != buf ) *p = '\0'; /* Found '.' */ require(strlen(buf) + 2 < (size_t)MaxFileName, "outname: filename too big"); if ( GenCPP ) strcat(buf, CPP_FILE_SUFFIX); else strcat(buf, ".c"); return( buf ); } void #ifdef __USE_PROTOS ensure_no_C_file_collisions(char *class_c_file) #else ensure_no_C_file_collisions(class_c_file) char *class_c_file; #endif { int i; for (i=0; itoken = REFVAR; q->defined = 1; } else err(eMsg2("Reference variable clashes with %s: '%s'", zztokens[q->token], lab)); p = (RefVarRec *) calloc(1, sizeof(RefVarRec)); require(p!=NULL, "newRefVarRec: no memory"); strcpy(p->type, t); strcpy(p->label, lab); strcpy(p->init, init); return p; } #endif /* From one of the following ref var defs, create a record to track * the info: * * @(int *p); * @(int *p=NULL); -- initialized * @(static int *p); -- global * * The 'def' pointer should point to the first char after the '(' */ RefVarRec * #ifdef __USE_PROTOS refVarRec(char *def) #else refVarRec(def) char *def; #endif { RefVarRec *p; char *s,*decl; p = (RefVarRec *) calloc(1, sizeof(RefVarRec)); require(p!=NULL, "newRefVarRec: no memory"); /* find first word; must be type or "static" */ s = def; while ( isalpha(*s) ) s++; if ( strncmp(def, "static", s-def)==0 ) p->global = 1; else s = def; /* now get type from s position until '=' or ')' */ decl = s; while ( *s!='=' && *s!='\0' ) s++; if ( *s=='=' ) { /* there is an initializer */ strcpy(p->init, s+1); *s='\0'; } strcpy(p->decl, decl); strcpy(p->var, id_in_decl(decl)); return p; } /* given a decl (type + id) return a ptr to the id; nondestructive to 'decl'. * Just scan backwards from the end looking for the start of the first id. */ char * #ifdef __USE_PROTOS id_in_decl( char *decl ) #else id_in_decl( decl ) char *decl; #endif { static char id[MaxAtom+1]; char *p = &(decl[strlen(decl)-1]); char *end, *start; require(decl!=NULL, "id_in_decl: NULL decl"); require(strlen(decl)>(size_t)0, "id_in_decl: empty decl"); /* scan back until valid var character */ while ( !isalnum(*p) || *p=='_' ) --p; end = p+1; /* scan back until beginning of variable */ while ( isalnum(*p) || *p=='_' ) --p; p++; /* move to start of variable */ start = p; strncpy(id, start, end-start); id[end-start] = '\0'; return id; } /* Take in a decl (type + id) and print it out with a prefix on id */ void #ifdef __USE_PROTOS dump_prefixed_decl( char *prefix, char *s, FILE *f ) #else dump_prefixed_decl( prefix, s, f ) char *prefix; char *s; FILE *f; #endif { char *p, *id; require(s!=NULL, "invalid type string"); p = &s[strlen(s)-1]; /* start at end of string and work back */ /* scan back until valid variable character */ while ( !isalnum(*p) && *p!='_' ) --p; /* scan back until beginning of variable */ while ( isalnum(*p) || *p=='_' ) --p; require(p>s, "invalid decl"); p++; id = p; /* here is where id is */ p = s; while ( p!=id ) {fputc(*p, f); p++;} /* dump until just before variable */ fprintf(f, "%s", prefix); while ( isspace(*p) ) p++; while ( *p!='\0' ) /* dump rest */ { fputc(*p, f); p++; } } /* * Convert * * 0, "#( RangeOp #(Minus %1:IConst %2:Var) #(Plus %3:Var %4:Var) )", * t, &w, &x, &y, &z); * * to * * 0, "#( 6 #(5 %1:4 %2:3) #(1 %3:3 %4:3) )", * t, &w, &x, &y, &z); */ char * #ifdef __USE_PROTOS cvt_token_str(char *prefix, char *s) #else cvt_token_str(prefix, s) char *prefix, *s; #endif { SymEntry *q; char *b, *e, *p; char tname[MaxRuleName+1]; char duh[MaxRuleName+1]; static char call[MaxAtom+1]; require(prefix!=NULL&&s!=NULL, "cvt_token_str: NULL string"); require(s[0]!='\0', "cvt_token_str: empty string"); /* printf("cvt incoming: '%s'\n", s);*/ strcpy(call, prefix); p = &call[strlen(prefix)]; while ( *s!='"' ) *p++ = *s++; /* ignore until string start */ *p++ = *s++; do { while ( !isalpha(*s) ) { if ( *s=='"' ) { *p='\0'; goto done; } *p++ = *s++; /* ignore until a token name */ } *p='\0'; b = s; while ( isalpha(*s) ) s++; /* ignore until end of token name */ e = s-1; strncpy(tname, b, e-b+1); tname[e-b+1] = '\0'; /* printf("looking up %s\n", tname);*/ q = (SymEntry *) hash_get(symbols, tname); if ( q==NULL ) { warnNoFL(eMsg1("call to ast_scan() has reference to unknown token: '%s'",tname)); } else { sprintf(duh, "%d", q->token_type); strcpy(p, duh); p += strlen(duh); *p='\0'; } } while ( *s!='\0' && *s!='"' ); done: strcat(call, s); /* printf("cvt: result is '%s'\n", call);*/ return call; } gtkwave-3.3.86/contrib/pccts/sorcerer/scan.c0000664000175000017500000017456313166335473020314 0ustar bybellbybell /* parser.dlg -- DLG Description of scanner * * Generated from: sor.g * * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001 * Purdue University Electrical Engineering * With AHPCRC, University of Minnesota * ANTLR Version 1.33MR33 */ #define ANTLR_VERSION 13333 #include "pcctscfg.h" #include "pccts_stdio.h" /* 23-Sep-97 thm Accomodate user who needs to redefine ZZLEXBUFSIZE */ #ifndef ZZLEXBUFSIZE #define ZZLEXBUFSIZE 8000 #endif #include "pcctscfg.h" /* MR20 G. Hobbelt __USE_PROTOS #define */ #include "charbuf.h" #include "hash.h" #include "set.h" #include "sor.h" #define AST_FIELDS \ int token; char text[MaxAtom+1], label[MaxRuleName+1]; \ char *action; /* if action node, here is ptr to it */ \ char in,out; \ char init_action; /* set if Action and 1st action of alt */ \ int file; int line; /* set for BLOCK, ALT, nonterm nodes */ \ int upper_range; /* only if T1..T2 found */ \ GLA *start_state; /* ptr into GLA for this block */ \ int no_copy; /* copy input ptr to output ptr? */ \ ListNode *refvars; /* any ref vars defined for this rule */ \ unsigned char is_root; /* this token is a root #( A ... ) */ #define zzcr_ast(node, cur, _tok, _text) \ {(node)->token=_tok; strncpy((node)->text, _text,MaxAtom);} #define USER_ZZSYN #define zzAST_DOUBLE extern int define_num; #define LL_K 2 #include "antlr.h" #include "ast.h" #include "tokens.h" #include "dlgdef.h" LOOKAHEAD void #ifdef __USE_PROTOS zzerraction(void) #else zzerraction() #endif { (*zzerr)("invalid token"); zzadvance(); zzskip(); } /* * D L G tables * * Generated from: parser.dlg * * 1989-2001 by Will Cohen, Terence Parr, and Hank Dietz * Purdue University Electrical Engineering * DLG Version 1.33MR33 */ #include "mode.h" #include "sym.h" #include "proto.h" int define_num = 0; char * #ifdef __USE_PROTOS scarf_to_end_of_func_call(void) #else scarf_to_end_of_func_call() #endif { static char func_call_str[MaxAtom+1]; char *p; p = &func_call_str[0]; more: if ( zzchar==')' ) { *p++ = zzchar; *p++ = '\0'; zzadvance(); return func_call_str; } if ( zzchar=='"' ) { *p++ = zzchar; zzadvance(); while ( zzchar!='"' ) { if ( zzchar=='\\' ) { *p++ = zzchar; zzadvance(); } *p++ = zzchar; zzadvance(); } } *p++ = zzchar; zzadvance(); goto more; } static void act1() { NLA = Eof; /* L o o k F o r A n o t h e r F i l e */ { FILE *new_input; new_input = NextFile(); if ( new_input != NULL ) { fclose( input ); input = new_input; zzrdstream( input ); /*zzadvance(); ** Get 1st char of this file */ zzskip(); /* Skip the Eof (@) char i.e continue */ } } } static void act2() { NLA = 56; zzskip(); } static void act3() { NLA = 57; zzline++; zzskip(); } static void act4() { NLA = 58; zzmode(ACTIONS); zzmore(); istackreset(); pushint(']'); } static void act5() { NLA = 59; action_file=CurFile; action_line=zzline; zzmode(ACTIONS); zzmore(); istackreset(); pushint('>'); } static void act6() { NLA = 60; zzmode(STRINGS); zzmore(); } static void act7() { NLA = 61; zzmode(COMMENTS); zzskip(); } static void act8() { NLA = 62; err("Missing /*; found dangling */"); zzskip(); } static void act9() { NLA = 63; zzmode(CPP_COMMENTS); zzskip(); } static void act10() { NLA = 64; err("Missing <<; found dangling >>"); zzskip(); } static void act11() { NLA = Header; } static void act12() { NLA = Tokdef; } static void act13() { NLA = LABEL; } static void act14() { NLA = OPT; } static void act15() { NLA = POS_CLOSURE; } static void act16() { NLA = CLOSURE; } static void act17() { NLA = WILD; } static void act18() { NLA = PRED_OP; } static void act19() { NLA = BT; } static void act20() { NLA = 80; } static void act21() { NLA = 81; } static void act22() { NLA = 84; } static void act23() { NLA = 85; } static void act24() { NLA = 86; } static void act25() { NLA = 87; } static void act26() { NLA = 88; } static void act27() { NLA = 89; } static void act28() { NLA = 90; } static void act29() { NLA = 91; } static void act30() { NLA = NonTerm; } static void act31() { NLA = Token; } static void act32() { NLA = 92; warn(eMsg1("unknown meta-op: %s",LATEXT(1))); zzskip(); } static unsigned char shift0[257] = { 0, 37, 37, 37, 37, 37, 37, 37, 37, 37, 1, 2, 37, 37, 3, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 1, 30, 6, 10, 37, 37, 37, 37, 26, 33, 8, 23, 37, 37, 24, 7, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 21, 31, 5, 37, 9, 25, 37, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 4, 37, 37, 37, 36, 37, 13, 34, 28, 14, 12, 19, 34, 11, 34, 34, 18, 29, 34, 34, 17, 34, 34, 15, 20, 16, 34, 34, 34, 34, 34, 34, 22, 32, 27, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37 }; static void act33() { NLA = Eof; } static void act34() { NLA = RExpr; zzmode(START); } static void act35() { NLA = 3; /* MR16a */ zzline++; warn("eoln found in string"); zzskip(); } static void act36() { NLA = 4; zzmore(); } static void act37() { NLA = 5; zzmore(); } static unsigned char shift1[257] = { 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5, 5, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }; static void act38() { NLA = Eof; } static void act39() { NLA = 6; zzmode(ACTIONS); zzmore(); } static void act40() { NLA = 7; /* MR16a */ zzline++; warn("eoln found in string (in user action)"); zzskip(); } static void act41() { NLA = 8; zzmore(); } static void act42() { NLA = 9; zzmore(); } static unsigned char shift2[257] = { 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5, 5, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }; static void act43() { NLA = Eof; } static void act44() { NLA = 10; zzmode(ACTIONS); zzmore(); } static void act45() { NLA = 11; /* MR16a */ zzline++; warn("eoln found in char literal (in user action)"); zzskip(); } static void act46() { NLA = 12; zzmore(); } static void act47() { NLA = 13; zzmore(); } static unsigned char shift3[257] = { 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5, 5, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }; static void act48() { NLA = Eof; } static void act49() { NLA = 14; zzmode(ACTIONS); zzmore(); } static void act50() { NLA = 15; zzmore(); } static void act51() { NLA = 16; zzline++; zzmore(); } static void act52() { NLA = 17; zzmore(); } static unsigned char shift4[257] = { 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }; static void act53() { NLA = Eof; } static void act54() { NLA = 18; zzline++; zzmode(ACTIONS); zzmore(); } static void act55() { NLA = 19; zzmore(); } static unsigned char shift5[257] = { 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; static void act56() { NLA = Eof; } static void act57() { NLA = 20; zzline++; zzmode(START); zzskip(); } static void act58() { NLA = 21; zzskip(); } static unsigned char shift6[257] = { 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; static void act59() { NLA = Eof; } static void act60() { NLA = 22; zzmode(START); zzskip(); } static void act61() { NLA = 23; zzskip(); } static void act62() { NLA = 24; zzline++; zzskip(); } static void act63() { NLA = 25; zzskip(); } static unsigned char shift7[257] = { 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }; static void act64() { NLA = Eof; } static void act65() { NLA = 26; { RefVarRec *rf; zzskip(); zzbegexpr[strlen(zzbegexpr)-1] = '\0'; rf=refVarRec(zzbegexpr); list_add(&AllRefVars, rf); list_add(&RefVars, rf); zzmode(ACTIONS); zzmore(); zzreplstr(""); } } static unsigned char shift8[257] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; static void act66() { NLA = Eof; } static void act67() { NLA = Action; /* these do not nest */ zzmode(START); NLATEXT[0] = ' '; NLATEXT[1] = ' '; zzbegexpr[0] = ' '; zzbegexpr[1] = ' '; if ( zzbufovf ) { found_error = 1; err( eMsgd("action buffer overflow; size %d",ZZLEXBUFSIZE)); } } static void act68() { NLA = PassAction; if ( topint() == ']' ) { popint(); if ( istackempty() ) /* terminate action */ { zzmode(START); NLATEXT[0] = ' '; zzbegexpr[0] = ' '; if ( zzbufovf ) { found_error = 1; err( eMsgd("parameter buffer overflow; size %d",ZZLEXBUFSIZE)); } } else { /* terminate #[..] */ zzreplstr(")"); zzmore(); } } else if ( topint() == '|' ) { /* end of simple [...] */ popint(); zzmore(); } else zzmore(); } static void act69() { NLA = 29; zzline++; zzmore(); } static void act70() { NLA = 30; zzmore(); } static void act71() { NLA = 31; if ( !(strcmp(zzbegexpr, "#ifdef")==0 || strcmp(zzbegexpr, "#else")==0 || strcmp(zzbegexpr, "#endif")==0 || strcmp(zzbegexpr, "#ifndef")==0 || strcmp(zzbegexpr, "#if")==0 || strcmp(zzbegexpr, "#define")==0 || strcmp(zzbegexpr, "#pragma")==0 || strcmp(zzbegexpr, "#undef")==0 || strcmp(zzbegexpr, "#import")==0 || strcmp(zzbegexpr, "#line")==0 || strcmp(zzbegexpr, "#include")==0 || strcmp(zzbegexpr, "#error")==0) ) { static char buf[100]; if ( !transform ) { warn("#id used in nontransform mode; # ignored"); sprintf(buf, "%s", zzbegexpr+1); } else { if ( CurRule==NULL ) {warn("#id used in action outside of rule; ignored");} else if ( strcmp(zzbegexpr+1,CurRule)==0 ) strcpy(buf, "(*_result)"); } zzreplstr(buf); } zzmore(); } static void act72() { NLA = 32; if ( GenCPP ) zzreplstr("new SORAST"); else zzreplstr("ast_empty_node()"); zzmore(); } static void act73() { NLA = 33; zzreplstr("NULL"); zzmore(); } static void act74() { NLA = 34; pushint(']'); if ( GenCPP ) zzreplstr("new SORAST("); else zzreplstr("ast_node("); zzmore(); } static void act75() { NLA = 35; pushint('}'); if ( GenCPP ) zzreplstr("PCCTS_AST::make("); else zzreplstr("ast_make("); zzmore(); } static void act76() { NLA = 36; zzmore(); } static void act77() { NLA = 37; if ( istackempty() ) zzmore(); else if ( topint()==')' ) { popint(); } else if ( topint()=='}' ) { popint(); /* terminate #(..) */ zzreplstr(", NULL)"); } zzmore(); } static void act78() { NLA = 38; pushint('|'); /* look for '|' to terminate simple [...] */ zzmore(); } static void act79() { NLA = 39; pushint(')'); zzmore(); } static void act80() { NLA = 40; zzreplstr("]"); zzmore(); } static void act81() { NLA = 41; zzreplstr(")"); zzmore(); } static void act82() { NLA = 42; zzreplstr(">"); zzmore(); } static void act83() { NLA = 43; zzmode(ACTION_CHARS); zzmore(); } static void act84() { NLA = 44; zzmode(ACTION_STRINGS); zzmore(); } static void act85() { NLA = 45; zzreplstr("#"); zzmore(); } static void act86() { NLA = 46; zzmore(); } static void act87() { NLA = 47; zzmore(); } static void act88() { NLA = 48; zzmode(ACTION_COMMENTS); zzmore(); } static void act89() { NLA = 49; err("Missing /*; found dangling */ in action"); zzmore(); } static void act90() { NLA = 50; zzmode(ACTION_CPP_COMMENTS); zzmore(); } static void act91() { NLA = 51; zzmode(REFVAR_SCARF); zzmore(); zzreplstr(""); } static void act92() { NLA = 52; zzmore(); if ( !GenCPP ) zzreplstr("_parser->"); } static void act93() { NLA = 53; if ( (GenCPP && strcmp(zzbegexpr,"ast_scan(")==0) || (!GenCPP && strcmp(zzbegexpr,"ast_scan(")==0) ) { char *args=scarf_to_end_of_func_call(); zzreplstr(cvt_token_str(zzbegexpr, args)); zzmore(); } else { pushint(')'); zzmore(); } } static void act94() { NLA = 54; zzmore(); } static void act95() { NLA = 55; zzmore(); } static unsigned char shift9[257] = { 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 3, 17, 17, 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 13, 5, 17, 17, 17, 12, 9, 10, 15, 17, 17, 17, 17, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 17, 17, 17, 17, 1, 17, 16, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 11, 2, 17, 6, 17, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17 }; static void act96() { NLA = Eof; } static void act97() { NLA = 93; zzmode(PARSE_ENUM_FILE); zzmore(); } static void act98() { NLA = 94; zzmore(); } static void act99() { NLA = 95; zzline++; zzmore(); } static void act100() { NLA = 96; zzmore(); } static unsigned char shift10[257] = { 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 }; static void act101() { NLA = Eof; } static void act102() { NLA = 97; zzline++; zzmode(PARSE_ENUM_FILE); zzskip(); } static void act103() { NLA = 98; zzskip(); } static unsigned char shift11[257] = { 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; static void act104() { NLA = Eof; /*zzmode(START); zzskip();*/ } static void act105() { NLA = 99; zzskip(); } static void act106() { NLA = 100; zzline++; zzskip(); } static void act107() { NLA = 101; zzmode(TOK_DEF_CPP_COMMENTS); zzmore(); } static void act108() { NLA = 102; zzmode(TOK_DEF_COMMENTS); zzmore(); } static void act109() { NLA = 103; } static void act110() { NLA = 104; zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); } static void act111() { NLA = 105; zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); } static void act112() { NLA = 106; } static void act113() { NLA = 107; zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); } static void act114() { NLA = 110; } static void act115() { NLA = 111; } static void act116() { NLA = 112; } static void act117() { NLA = 113; } static void act118() { NLA = 114; } static void act119() { NLA = 115; } static void act120() { NLA = 116; } static void act121() { NLA = 117; } static void act122() { NLA = INT; } static void act123() { NLA = ID; } static unsigned char shift12[257] = { 0, 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 2, 31, 31, 3, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 31, 31, 6, 31, 31, 31, 31, 31, 31, 5, 31, 18, 31, 31, 4, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 31, 28, 31, 17, 31, 31, 31, 30, 30, 30, 19, 30, 30, 21, 30, 30, 30, 30, 20, 30, 30, 30, 30, 30, 30, 30, 22, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 30, 31, 25, 30, 30, 10, 11, 8, 30, 30, 7, 30, 24, 12, 15, 9, 23, 30, 30, 30, 13, 30, 14, 30, 30, 26, 30, 30, 16, 31, 27, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31 }; #define DfaStates 226 typedef unsigned short DfaState; static DfaState st0[38] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 20, 12, 21, 22, 23, 24, 12, 25, 226, 226 }; static DfaState st1[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st2[38] = { 226, 2, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st3[38] = { 226, 226, 226, 26, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st4[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st5[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st6[38] = { 226, 226, 226, 226, 226, 27, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st7[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st8[38] = { 226, 226, 226, 226, 226, 226, 226, 28, 29, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st9[38] = { 226, 226, 226, 226, 226, 226, 226, 30, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st10[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 31, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st11[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 32, 33, 33, 33, 33, 34, 33, 33, 33, 33, 226, 226, 226, 226, 226, 35, 226, 33, 33, 226, 226, 226, 226, 33, 33, 33, 226 }; static DfaState st12[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 226, 226, 226, 226, 226, 226, 226, 36, 36, 226, 226, 226, 226, 36, 36, 36, 226 }; static DfaState st13[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st14[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st15[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st16[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 37, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st17[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st18[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st19[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st20[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 226, 226, 226, 226, 226, 226, 226, 36, 38, 226, 226, 226, 226, 36, 36, 36, 226 }; static DfaState st21[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st22[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st23[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st24[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st25[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 226, 226, 226, 226, 226, 226, 226, 39, 39, 226, 226, 226, 226, 39, 39, 39, 226 }; static DfaState st26[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st27[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st28[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st29[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st30[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st31[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st32[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 33, 40, 33, 33, 33, 33, 33, 33, 33, 33, 226, 226, 226, 226, 226, 226, 226, 33, 33, 226, 226, 226, 226, 33, 33, 33, 226 }; static DfaState st33[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 226, 226, 226, 226, 226, 226, 226, 33, 33, 226, 226, 226, 226, 33, 33, 33, 226 }; static DfaState st34[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 33, 33, 33, 33, 33, 33, 41, 33, 33, 33, 226, 226, 226, 226, 226, 226, 226, 33, 33, 226, 226, 226, 226, 33, 33, 33, 226 }; static DfaState st35[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st36[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 226, 226, 226, 226, 226, 226, 226, 36, 36, 226, 226, 226, 226, 36, 36, 36, 226 }; static DfaState st37[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st38[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 36, 36, 42, 36, 36, 36, 36, 36, 36, 36, 226, 226, 226, 226, 226, 226, 226, 36, 36, 226, 226, 226, 226, 36, 36, 36, 226 }; static DfaState st39[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 226, 226, 226, 226, 226, 226, 226, 39, 39, 226, 226, 226, 226, 39, 39, 39, 226 }; static DfaState st40[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 33, 33, 43, 33, 33, 33, 33, 33, 33, 33, 226, 226, 226, 226, 226, 226, 226, 33, 33, 226, 226, 226, 226, 33, 33, 33, 226 }; static DfaState st41[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 33, 33, 33, 33, 33, 33, 33, 44, 33, 33, 226, 226, 226, 226, 226, 226, 226, 33, 33, 226, 226, 226, 226, 33, 33, 33, 226 }; static DfaState st42[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 36, 36, 36, 36, 36, 36, 36, 36, 36, 45, 226, 226, 226, 226, 226, 226, 226, 36, 36, 226, 226, 226, 226, 36, 36, 36, 226 }; static DfaState st43[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 33, 33, 33, 46, 33, 33, 33, 33, 33, 33, 226, 226, 226, 226, 226, 226, 226, 33, 33, 226, 226, 226, 226, 33, 33, 33, 226 }; static DfaState st44[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 33, 33, 33, 47, 33, 33, 33, 33, 33, 33, 226, 226, 226, 226, 226, 226, 226, 33, 33, 226, 226, 226, 226, 33, 33, 33, 226 }; static DfaState st45[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 36, 36, 36, 36, 36, 36, 36, 36, 36, 48, 226, 226, 226, 226, 226, 226, 226, 36, 36, 226, 226, 226, 226, 36, 36, 36, 226 }; static DfaState st46[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 33, 49, 33, 33, 33, 33, 33, 33, 33, 33, 226, 226, 226, 226, 226, 226, 226, 33, 33, 226, 226, 226, 226, 33, 33, 33, 226 }; static DfaState st47[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 33, 50, 33, 33, 33, 33, 33, 33, 33, 33, 226, 226, 226, 226, 226, 226, 226, 33, 33, 226, 226, 226, 226, 33, 33, 33, 226 }; static DfaState st48[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 226, 226, 226, 226, 226, 226, 226, 36, 36, 226, 226, 226, 226, 36, 36, 36, 226 }; static DfaState st49[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 33, 33, 33, 33, 51, 33, 33, 33, 33, 33, 226, 226, 226, 226, 226, 226, 226, 33, 33, 226, 226, 226, 226, 33, 33, 33, 226 }; static DfaState st50[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 33, 33, 33, 33, 33, 33, 33, 33, 52, 33, 226, 226, 226, 226, 226, 226, 226, 33, 33, 226, 226, 226, 226, 33, 33, 33, 226 }; static DfaState st51[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 226, 226, 226, 226, 226, 226, 226, 33, 33, 226, 226, 226, 226, 33, 33, 33, 226 }; static DfaState st52[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 33, 33, 33, 33, 33, 33, 33, 33, 33, 53, 226, 226, 226, 226, 226, 226, 226, 33, 33, 226, 226, 226, 226, 33, 33, 33, 226 }; static DfaState st53[38] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 226, 226, 226, 226, 226, 226, 226, 33, 33, 226, 226, 226, 226, 33, 33, 33, 226 }; static DfaState st54[7] = { 55, 56, 57, 58, 59, 60, 226 }; static DfaState st55[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st56[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st57[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st58[7] = { 226, 226, 61, 226, 226, 226, 226 }; static DfaState st59[7] = { 226, 62, 62, 62, 62, 62, 226 }; static DfaState st60[7] = { 226, 226, 226, 226, 226, 60, 226 }; static DfaState st61[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st62[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st63[7] = { 64, 65, 66, 67, 68, 69, 226 }; static DfaState st64[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st65[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st66[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st67[7] = { 226, 226, 70, 226, 226, 226, 226 }; static DfaState st68[7] = { 226, 71, 71, 71, 71, 71, 226 }; static DfaState st69[7] = { 226, 226, 226, 226, 226, 69, 226 }; static DfaState st70[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st71[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st72[7] = { 73, 74, 75, 76, 77, 78, 226 }; static DfaState st73[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st74[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st75[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st76[7] = { 226, 226, 79, 226, 226, 226, 226 }; static DfaState st77[7] = { 226, 80, 80, 80, 80, 80, 226 }; static DfaState st78[7] = { 226, 226, 226, 226, 226, 78, 226 }; static DfaState st79[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st80[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st81[7] = { 82, 83, 84, 85, 86, 84, 226 }; static DfaState st82[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st83[7] = { 226, 226, 87, 226, 226, 226, 226 }; static DfaState st84[7] = { 226, 226, 84, 226, 226, 84, 226 }; static DfaState st85[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st86[7] = { 226, 226, 226, 88, 226, 226, 226 }; static DfaState st87[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st88[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st89[5] = { 90, 91, 92, 93, 226 }; static DfaState st90[5] = { 226, 226, 226, 226, 226 }; static DfaState st91[5] = { 226, 226, 226, 226, 226 }; static DfaState st92[5] = { 226, 94, 226, 226, 226 }; static DfaState st93[5] = { 226, 226, 226, 93, 226 }; static DfaState st94[5] = { 226, 226, 226, 226, 226 }; static DfaState st95[5] = { 96, 97, 98, 99, 226 }; static DfaState st96[5] = { 226, 226, 226, 226, 226 }; static DfaState st97[5] = { 226, 226, 226, 226, 226 }; static DfaState st98[5] = { 226, 100, 226, 226, 226 }; static DfaState st99[5] = { 226, 226, 226, 99, 226 }; static DfaState st100[5] = { 226, 226, 226, 226, 226 }; static DfaState st101[7] = { 102, 103, 104, 105, 106, 104, 226 }; static DfaState st102[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st103[7] = { 226, 226, 107, 226, 226, 226, 226 }; static DfaState st104[7] = { 226, 226, 104, 226, 226, 104, 226 }; static DfaState st105[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st106[7] = { 226, 226, 226, 108, 226, 226, 226 }; static DfaState st107[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st108[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st109[4] = { 110, 111, 226, 226 }; static DfaState st110[4] = { 226, 226, 226, 226 }; static DfaState st111[4] = { 226, 111, 112, 226 }; static DfaState st112[4] = { 226, 226, 226, 226 }; static DfaState st113[19] = { 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 121, 226 }; static DfaState st114[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st115[19] = { 226, 131, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st116[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st117[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st118[19] = { 226, 226, 226, 132, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st119[19] = { 226, 226, 226, 226, 226, 226, 133, 226, 134, 135, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st120[19] = { 226, 226, 226, 226, 226, 226, 120, 226, 226, 136, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st121[19] = { 226, 226, 226, 226, 226, 226, 226, 121, 226, 226, 226, 226, 226, 226, 226, 121, 226, 121, 226 }; static DfaState st122[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st123[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st124[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st125[19] = { 226, 137, 138, 139, 139, 140, 139, 139, 139, 139, 141, 139, 139, 139, 139, 139, 139, 139, 226 }; static DfaState st126[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st127[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st128[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 142, 143, 226, 226, 226 }; static DfaState st129[19] = { 226, 226, 226, 226, 226, 226, 226, 121, 226, 226, 226, 226, 226, 226, 144, 121, 226, 121, 226 }; static DfaState st130[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 145, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st131[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st132[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st133[19] = { 226, 226, 226, 226, 226, 226, 146, 146, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st134[19] = { 226, 226, 147, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st135[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 148, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st136[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st137[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st138[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st139[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st140[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st141[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st142[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st143[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st144[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st145[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st146[19] = { 226, 226, 226, 226, 226, 226, 146, 146, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st147[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st148[19] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st149[7] = { 150, 151, 152, 153, 154, 152, 226 }; static DfaState st150[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st151[7] = { 226, 226, 155, 226, 226, 226, 226 }; static DfaState st152[7] = { 226, 226, 152, 226, 226, 152, 226 }; static DfaState st153[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st154[7] = { 226, 226, 226, 156, 226, 226, 226 }; static DfaState st155[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st156[7] = { 226, 226, 226, 226, 226, 226, 226 }; static DfaState st157[5] = { 158, 159, 160, 161, 226 }; static DfaState st158[5] = { 226, 226, 226, 226, 226 }; static DfaState st159[5] = { 226, 226, 226, 226, 226 }; static DfaState st160[5] = { 226, 162, 226, 226, 226 }; static DfaState st161[5] = { 226, 226, 226, 161, 226 }; static DfaState st162[5] = { 226, 226, 226, 226, 226 }; static DfaState st163[32] = { 164, 165, 166, 167, 168, 226, 169, 170, 170, 170, 170, 171, 170, 170, 170, 170, 172, 173, 174, 175, 170, 170, 170, 170, 170, 170, 170, 176, 177, 178, 170, 226 }; static DfaState st164[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st165[32] = { 226, 165, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st166[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st167[32] = { 226, 226, 179, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st168[32] = { 226, 226, 226, 226, 180, 181, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st169[32] = { 226, 226, 226, 226, 226, 226, 226, 182, 226, 226, 183, 184, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st170[32] = { 226, 226, 226, 226, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 185, 185, 226 }; static DfaState st171[32] = { 226, 226, 226, 226, 226, 226, 226, 185, 185, 186, 185, 185, 185, 185, 185, 185, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 185, 185, 226 }; static DfaState st172[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st173[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st174[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st175[32] = { 226, 226, 226, 226, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 226, 185, 187, 185, 185, 185, 185, 185, 185, 226, 226, 185, 185, 226 }; static DfaState st176[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st177[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st178[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 178, 226, 226 }; static DfaState st179[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st180[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st181[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st182[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 188, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st183[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 189, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st184[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 190, 226, 226, 191, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st185[32] = { 226, 226, 226, 226, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 185, 185, 226 }; static DfaState st186[32] = { 226, 226, 226, 226, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 192, 185, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 185, 185, 226 }; static DfaState st187[32] = { 226, 226, 226, 226, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 226, 185, 185, 193, 185, 185, 185, 185, 185, 226, 226, 185, 185, 226 }; static DfaState st188[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 194, 195, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st189[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 196, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st190[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 197, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st191[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 198, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st192[32] = { 226, 226, 226, 226, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 199, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 185, 185, 226 }; static DfaState st193[32] = { 226, 226, 226, 226, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 200, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 185, 185, 226 }; static DfaState st194[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 201, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st195[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 202, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st196[32] = { 226, 226, 226, 226, 226, 226, 226, 203, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st197[32] = { 226, 226, 226, 226, 226, 226, 226, 204, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st198[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 205, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st199[32] = { 226, 226, 226, 226, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 185, 185, 226 }; static DfaState st200[32] = { 226, 226, 226, 226, 226, 226, 226, 206, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 226, 185, 185, 185, 185, 185, 185, 207, 185, 226, 226, 185, 185, 226 }; static DfaState st201[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 208, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st202[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 209, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st203[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 210, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st204[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 211, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st205[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st206[32] = { 226, 226, 226, 226, 226, 226, 226, 185, 185, 212, 185, 185, 185, 185, 185, 185, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 185, 185, 226 }; static DfaState st207[32] = { 226, 226, 226, 226, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 213, 226, 226, 185, 185, 226 }; static DfaState st208[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 214, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st209[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st210[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 215, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st211[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st212[32] = { 226, 226, 226, 226, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 226, 185, 185, 185, 216, 185, 185, 185, 185, 226, 226, 185, 185, 226 }; static DfaState st213[32] = { 226, 226, 226, 226, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 226, 185, 185, 185, 217, 185, 185, 185, 185, 226, 226, 185, 185, 226 }; static DfaState st214[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st215[32] = { 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226 }; static DfaState st216[32] = { 226, 226, 226, 226, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 226, 185, 185, 185, 185, 218, 185, 185, 185, 226, 226, 185, 185, 226 }; static DfaState st217[32] = { 226, 226, 226, 226, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 226, 185, 185, 185, 185, 219, 185, 185, 185, 226, 226, 185, 185, 226 }; static DfaState st218[32] = { 226, 226, 226, 226, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 226, 185, 185, 185, 185, 185, 220, 185, 185, 226, 226, 185, 185, 226 }; static DfaState st219[32] = { 226, 226, 226, 226, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 226, 185, 185, 185, 185, 185, 221, 185, 185, 226, 226, 185, 185, 226 }; static DfaState st220[32] = { 226, 226, 226, 226, 226, 226, 226, 185, 185, 185, 185, 222, 185, 185, 185, 185, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 185, 185, 226 }; static DfaState st221[32] = { 226, 226, 226, 226, 226, 226, 226, 185, 185, 185, 185, 223, 185, 185, 185, 185, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 185, 185, 226 }; static DfaState st222[32] = { 226, 226, 226, 226, 226, 226, 226, 185, 185, 224, 185, 185, 185, 185, 185, 185, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 185, 185, 226 }; static DfaState st223[32] = { 226, 226, 226, 226, 226, 226, 226, 185, 185, 225, 185, 185, 185, 185, 185, 185, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 185, 185, 226 }; static DfaState st224[32] = { 226, 226, 226, 226, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 185, 185, 226 }; static DfaState st225[32] = { 226, 226, 226, 226, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 226, 185, 185, 185, 185, 185, 185, 185, 185, 226, 226, 185, 185, 226 }; DfaState *dfa[226] = { st0, st1, st2, st3, st4, st5, st6, st7, st8, st9, st10, st11, st12, st13, st14, st15, st16, st17, st18, st19, st20, st21, st22, st23, st24, st25, st26, st27, st28, st29, st30, st31, st32, st33, st34, st35, st36, st37, st38, st39, st40, st41, st42, st43, st44, st45, st46, st47, st48, st49, st50, st51, st52, st53, st54, st55, st56, st57, st58, st59, st60, st61, st62, st63, st64, st65, st66, st67, st68, st69, st70, st71, st72, st73, st74, st75, st76, st77, st78, st79, st80, st81, st82, st83, st84, st85, st86, st87, st88, st89, st90, st91, st92, st93, st94, st95, st96, st97, st98, st99, st100, st101, st102, st103, st104, st105, st106, st107, st108, st109, st110, st111, st112, st113, st114, st115, st116, st117, st118, st119, st120, st121, st122, st123, st124, st125, st126, st127, st128, st129, st130, st131, st132, st133, st134, st135, st136, st137, st138, st139, st140, st141, st142, st143, st144, st145, st146, st147, st148, st149, st150, st151, st152, st153, st154, st155, st156, st157, st158, st159, st160, st161, st162, st163, st164, st165, st166, st167, st168, st169, st170, st171, st172, st173, st174, st175, st176, st177, st178, st179, st180, st181, st182, st183, st184, st185, st186, st187, st188, st189, st190, st191, st192, st193, st194, st195, st196, st197, st198, st199, st200, st201, st202, st203, st204, st205, st206, st207, st208, st209, st210, st211, st212, st213, st214, st215, st216, st217, st218, st219, st220, st221, st222, st223, st224, st225 }; DfaState accepts[227] = { 0, 1, 2, 3, 3, 4, 23, 6, 0, 16, 24, 32, 30, 13, 14, 15, 17, 18, 27, 20, 30, 22, 25, 26, 28, 31, 3, 5, 9, 7, 8, 10, 32, 32, 32, 19, 30, 29, 30, 31, 32, 32, 30, 32, 32, 30, 32, 32, 21, 32, 32, 11, 32, 12, 0, 33, 34, 35, 35, 0, 37, 35, 36, 0, 38, 39, 40, 40, 0, 42, 40, 41, 0, 43, 44, 45, 45, 0, 47, 45, 46, 0, 48, 50, 52, 51, 51, 49, 51, 0, 53, 54, 54, 55, 54, 0, 56, 57, 57, 58, 57, 0, 59, 61, 63, 62, 62, 60, 62, 0, 64, 0, 65, 0, 66, 70, 68, 69, 69, 76, 94, 95, 78, 79, 77, 0, 83, 84, 87, 95, 92, 67, 69, 71, 74, 75, 93, 82, 80, 86, 85, 81, 90, 88, 89, 91, 71, 72, 73, 0, 96, 98, 100, 99, 99, 97, 99, 0, 101, 102, 102, 103, 102, 0, 104, 105, 106, 106, 0, 0, 123, 123, 115, 116, 117, 123, 120, 121, 122, 106, 107, 108, 0, 0, 0, 123, 123, 123, 0, 0, 0, 0, 123, 123, 0, 0, 0, 0, 0, 114, 123, 0, 0, 0, 0, 111, 123, 123, 0, 110, 0, 113, 123, 123, 109, 112, 123, 123, 123, 123, 123, 123, 123, 123, 118, 119, 0 }; void (*actions[124])() = { zzerraction, act1, act2, act3, act4, act5, act6, act7, act8, act9, act10, act11, act12, act13, act14, act15, act16, act17, act18, act19, act20, act21, act22, act23, act24, act25, act26, act27, act28, act29, act30, act31, act32, act33, act34, act35, act36, act37, act38, act39, act40, act41, act42, act43, act44, act45, act46, act47, act48, act49, act50, act51, act52, act53, act54, act55, act56, act57, act58, act59, act60, act61, act62, act63, act64, act65, act66, act67, act68, act69, act70, act71, act72, act73, act74, act75, act76, act77, act78, act79, act80, act81, act82, act83, act84, act85, act86, act87, act88, act89, act90, act91, act92, act93, act94, act95, act96, act97, act98, act99, act100, act101, act102, act103, act104, act105, act106, act107, act108, act109, act110, act111, act112, act113, act114, act115, act116, act117, act118, act119, act120, act121, act122, act123 }; static DfaState dfa_base[] = { 0, 54, 63, 72, 81, 89, 95, 101, 109, 113, 149, 157, 163 }; static unsigned char *b_class_no[] = { shift0, shift1, shift2, shift3, shift4, shift5, shift6, shift7, shift8, shift9, shift10, shift11, shift12 }; #define ZZSHIFT(c) (b_class_no[zzauto][1+c]) #define MAX_MODE 13 #include "dlgauto.h" gtkwave-3.3.86/contrib/pccts/sorcerer/UPDATES0000664000175000017500000001104213166335473020232 0ustar bybellbybell1.00B1 Fixes: Missing includes from antlr.h 1.00B2 Fixes: Didn't save _t during (...)? 1.00B3 Fixes: Fixed bug that wouldn't allow labels on wildcard nodes Would dump argument list to some labelled rule refs Fixed code gen bug with #(. B) as last element of production 1.00B4 Fixes: Another teeny-weeny little code gen fix related to "rule > [result]" 1.00B5 Fixes: Made tar file create a root directory called sorcerer Line 465 in gen.c had an 'stdout' where an 'output' was needed. 1.00B6 Fixes: K&R function headers were missing a ',' in the argument list Made the default prototype style the same as how you compiled SORCERER itself. 1.00B7 Rik Faith : [...] patch fixes a bug in sorcerer where the "actions" in the input file which appeared between the second set of << >>'s (i.e., the user's main routine) would format poorly in the output file. 1.00B8: changed the STreeTry() macro (it's much better now) added -transform option (double pointers now needed in tree structure) added ``!'' operator to indicate what is not to be included in tree copy from input to output tree in transform mode. Added _result parameter for transform mode Changed sorcerer.c to errsupport.c; sorcerer.c is now regular support code. function sorcerer_panic() was added Added all of the libraries for tree rewrite support (ast.c slist.c sint.c hash.c sstack.c) Added a very cool function ast_scan(); check it out Added @-variables; e.g., @(int i = 3) ... @i = 4; Added __USE_PROTOS definition in sorcerer.h SORCERER now reads the config.h file used by ANTLR/DLG. Uses ast_right(rw) and ast_down(rw) so C/C++ compatible -- also means C/C++ can have different tree layout and use these as functions to simulate child-sibling trees. Fixed: Bad error messages: a : A | (b)? b; b : B; error: infinite recursion from rule a to rule b Fixed a bug: Sorcerer a simple tree-parser generator Version 1.00B3 1992-1994 warning: missing #header statement test.t, line 3: warning: (...)? predicate in block with one alternative; will genera! bash$ more test.t expr: ; variable: #( VARIABLE ID ( DOT ID | UPARROW | LBRACK expr ( COMMA expr )* RBRACK | COLON_COLON ID )* ) ; 1.00B9: Fixed support/ast.c so K&R C would compile it. 1.00B13: Totally new, cool, simple tree rewriting mechanism. Not many bug fixes Made enum def ignore #ifdef #else #endif etc... in #tokdefs Added C++ support Made h and lib directory Changed name: AST_NONTRANSFORM_FIELDS -> AST_REQD_FIELDS -def-tokens and -proto-file are not valid in C++ mode. Changed name: AST -> SORAST in C and C++. When you -def-tokens, it generates them ast consts inside class def. Ref with classname::def. All #[] constructor calls must be done in class A { ... } def of grammar so it knows which to call. Else, put Classname:: on front manually. 1.00B14 [Not completed yet] #label -> label; #label is no longer valid. Just use label to access output node in transform mode. label_in is the input node (for token references only). ast_node, ast_dup -> shallowCopy() (user must define for transform mode), deepCopy(). Fixed the C support functions for ASTs #[] -> new SORAST token() -> type() (sorry, but had to make more consistent) setToken() -> setType() (you can just add type() { token(); } if you want). Remove guessing gate on actions if no (...)? Wildcard as root of tree made SOR bomb All the token field refs in PCCTSAST.C -> type() ASTBase::double_link didn't check for NULL pointers. #if in action caused trouble. made action buffer bigger (8k bytes) SORCERER had a bug in that it did not update the tree result before returning sometimes. PCCTS_AST::ast_scan() is now non-virtual C++ support functions like tail(), bottom(), etc... now use 'this' pointer rather a passed argument. Sorcerer spun when it found identifier+ instead of (identifier)+ in a tree rule. This version corresponds pretty to the state of the book. 1.00B15 All .C files are changed to .cpp. ASTBase::dup() and ASTDoublyLinkedBase::dup() now call shallowCopy() to actually duplicate a node. shallowCopy() can either call a copy constructor or can just duplicate things right there. C++ keyword "template" was used as a variable in some SORCERER files. 1.00b20 (2-Oct-1998) Minor changes as reported in CHANGES_FROM_1.33 of the main pccts distribution kit. Main reason for change in version number is to indicate that it matches the new release of pccts 1.33MR15. gtkwave-3.3.86/contrib/pccts/sorcerer/lib/0000775000175000017500000000000013166335473017752 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/sorcerer/lib/sorcerer.c0000664000175000017500000000713513166335473021750 0ustar bybellbybell/* * sorcerer.c -- support code for SORCERER output * * Define your own or compile and link this in. * * Terence Parr * U of MN, AHPCRC * February 1994 */ /*********************************************************************** 2-Oct-97 The routine ast_dup() appeared to have a bug in it. Instead of providing a deep copy of its argument it made a bushy copy of its argument - by duplicating the nodes pointed to by its right link. This is certainly not deliberate and does not match code in PCCTSAST.cpp (which had its own bug). This has been changed to do a deep copy in the traditional sense. ***********************************************************************/ #ifdef OLD /* Given a result pointer, return the same one if *t is NULL, * else find the end of the sibling list and return the address * the 'next[write]' field in that last node. */ AST ** #ifdef __USE_PROTOS _nextresult(STreeParser *_parser, AST **t) #else _nextresult(_parser, t) AST **t; STreeParser *_parser; #endif { AST *p = *t; if ( p==NULL ) return t; while ( p->ast_right(_parser->write) != NULL ) { p = p->ast_right(_parser->write); } return &(p->ast_right(_parser->write)); } /* * Copy the read pointers to the write pointers for a node or entire subtree */ void #ifdef __USE_PROTOS _copy_wildcard(STreeParser *_parser, AST *t, int root) #else _copy_wildcard(_parser, t, root) STreeParser *_parser; AST *t; int root; #endif { while ( t!=NULL ) { if ( !root ) t->ast_right(_parser->write) = t->ast_right(_parser->read); t->ast_down(_parser->write) = t->ast_down(_parser->read); if ( t->ast_down(_parser->read)!=NULL ) _copy_wildcard(_parser, t->ast_down(_parser->read), 0); if ( root ) return; else root=0; t = t->ast_right(_parser->read); } } #endif void #ifdef __USE_PROTOS _mkroot(SORAST **r, SORAST **s, SORAST **e, SORAST *t) #else _mkroot(r,s,e,t) SORAST **r, **s, **e, *t; #endif { *r = t; } void #ifdef __USE_PROTOS _mkchild(SORAST **r, SORAST **s, SORAST **e, SORAST *t) #else _mkchild(r,s,e,t) SORAST **r, **s, **e, *t; #endif { /* if no sibling list, must attach to any existing root */ if ( *s==NULL ) { *s = *e = t; /* If r is NULL, then there was no root defined--must be sibling list */ if ( *r==NULL ) *r = *s; else (*r)->ast_down = t; } else { (*e)->ast_right = t; *e = t; } } /* THESE FUNCS HAVE TO GO HERE BECAUSE THEY ARE SENSITIVE TO USER'S SORAST DEF */ SORAST * #ifdef __USE_PROTOS ast_alloc(void) #else ast_alloc() #endif { SORAST *t = (SORAST *)calloc(1, sizeof(SORAST)); if ( t==NULL ) sorcerer_panic("out of memory"); return t; } SORAST * #ifdef __USE_PROTOS ast_dup_bushy(SORAST *t) #else ast_dup_bushy(t) SORAST *t; #endif { SORAST *u; if ( t == NULL ) return NULL; u = ast_alloc(); *u = *t; /* copy contents */ u->ast_down = ast_dup_bushy(t->ast_down); /* copy the rest of the tree */ u->ast_right = ast_dup_bushy(t->ast_right); return u; } /* Assume t is a root node of a tree--duplicate that node and what's below */ SORAST * #ifdef __USE_PROTOS ast_dup(SORAST *t) #else ast_dup(t) SORAST *t; #endif { SORAST *u; if ( t == NULL ) return NULL; u = ast_alloc(); *u = *t; /* copy contents */ u->ast_down = ast_dup_bushy(t->ast_down); /* copy the rest of the tree */ u->ast_right = NULL; return u; } /* Assume t is a root node of a tree--duplicate that node and what's below */ SORAST * #ifdef __USE_PROTOS ast_dup_node(SORAST *t) #else ast_dup_node(t) SORAST *t; #endif { SORAST *u; if ( t == NULL ) return NULL; u = ast_alloc(); *u = *t; /* copy contents */ u->down = NULL; u->right = NULL; return u; } gtkwave-3.3.86/contrib/pccts/sorcerer/lib/errsupport.c0000664000175000017500000000370313166335473022346 0ustar bybellbybell/* * errsupport.c -- error support code for SORCERER output * * Define your own or compile and link this in. * * Terence Parr * U of MN, AHPCRC * February 1994 */ #include "sorcerer.h" void #ifdef __USE_PROTOS mismatched_range( STreeParser *_parser, int looking_for, int upper_token, SORAST *found ) #else mismatched_range( _parser, looking_for, upper_token, found ) int looking_for; int upper_token; SORAST *found; STreeParser *_parser; #endif { if ( found!=NULL ) { fprintf(stderr, "parse error: expected token range %d..%d found token %d\n", looking_for, upper_token, found->token); } else { fprintf(stderr, "parse error: expected token range %d..%d found NULL tree\n", looking_for, upper_token); } } void #ifdef __USE_PROTOS missing_wildcard(STreeParser *_parser) #else missing_wildcard(_parser) STreeParser *_parser; #endif { fprintf(stderr, "parse error: expected any token/tree found found NULL tree\n"); } void #ifdef __USE_PROTOS mismatched_token( STreeParser *_parser, int looking_for, SORAST *found ) #else mismatched_token( _parser, looking_for, found ) int looking_for; SORAST *found; STreeParser *_parser; #endif { if ( found!=NULL ) { fprintf(stderr, "parse error: expected token %d found token %d\n", looking_for, found->token); } else { fprintf(stderr, "parse error: expected token %d found NULL tree\n", looking_for); } } void #ifdef __USE_PROTOS no_viable_alt( STreeParser *_parser, char *rulename, SORAST *root ) #else no_viable_alt( _parser, rulename, root ) char *rulename; SORAST *root; STreeParser *_parser; #endif { if ( root==NULL ) fprintf(stderr, "parse error: in rule %s, no viable alternative for NULL tree\n", rulename); else fprintf(stderr, "parse error: in rule %s, no viable alternative for tree\n", rulename); } void #ifdef __USE_PROTOS sorcerer_panic(char *err) #else sorcerer_panic(err) char *err; #endif { fprintf(stderr, "panic: %s\n", err); exit(-1); } gtkwave-3.3.86/contrib/pccts/sorcerer/lib/Makefile.am0000664000175000017500000000042013166335473022002 0ustar bybellbybell## -*- makefile -*- ## #SRC = astlib.c sstack.c sorlist.c sintstack.c #OBJ = astlib.o sstack.o sorlist.o sintstack.o #CFLAGS=$(COPT) -I../../h -I../h EXTRA_DIST= \ CASTBase.h STreeParser.cpp astlib.c errsupport.c \ msvc.dsp sintstack.c sorcerer.c sorlist.c sstack.c gtkwave-3.3.86/contrib/pccts/sorcerer/lib/sstack.c0000664000175000017500000000350113166335473021405 0ustar bybellbybell/* * sstack.c * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public * domain. An individual or company may do whatever they wish with * source code distributed with SORCERER or the code generated by * SORCERER, including the incorporation of SORCERER, or its output, into * commerical software. * * We encourage users to develop software with SORCERER. However, we do * ask that credit is given to us for developing SORCERER. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like SORCERER and have developed a nice tool with the * output, please mention that you developed it using SORCERER. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * SORCERER 1.00B * Terence Parr * AHPCRC, University of Minnesota * 1992-1994 */ #include "pcctscfg.h" #include #include #ifdef PCCTS_USE_STDARG #include #else #include #endif #include "CASTBase.h" #include "sstack.h" void #ifdef __USE_PROTOS sstack_push( SStack **st, void *e ) #else sstack_push( st, e ) SStack **st; void *e; #endif { SStack *p; require(e!=NULL, "sstack_push: attempting to add NULL list element"); p = newSStack; require(p!=NULL, "sstack_push: cannot alloc new list node"); p->elem = e; p->next = *st; *st = p; } void * #ifdef __USE_PROTOS sstack_pop( SStack **st ) #else sstack_pop( st ) SStack **st; #endif { SStack *p = *st; void *r; *st = (*st)->next; r = p->elem; free(p); return r; } gtkwave-3.3.86/contrib/pccts/sorcerer/lib/CASTBase.h0000664000175000017500000000312313166335473021447 0ustar bybellbybell#ifndef CASTBase_h #define CASTBase_h /* * CASTBase.h * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public * domain. An individual or company may do whatever they wish with * source code distributed with SORCERER or the code generated by * SORCERER, including the incorporation of SORCERER, or its output, into * commerical software. * * We encourage users to develop software with SORCERER. However, we do * ask that credit is given to us for developing SORCERER. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like SORCERER and have developed a nice tool with the * output, please mention that you developed it using SORCERER. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * SORCERER 1.00B * Terence Parr * AHPCRC, University of Minnesota * 1992-1994 */ /* ONLY USED TO C COMPILE LIBRARY FUNCTIONS; YOU CAN FORCE THEM TO COMPILE WITH * YOUR SORAST DEF IF YOU WANT (THAT WAY, ORDER OF FIELD DEFINITION IS IRRELEVANT) */ /* Typically, this file is not used / seen by the programmer */ /* Used as "super-class" for compiling C library routines */ typedef struct _nodebase { struct _nodebase *right, *down; int token; } SORAST; #endif gtkwave-3.3.86/contrib/pccts/sorcerer/lib/msvc.dsp0000664000175000017500000000613013166335473021432 0ustar bybellbybell# Microsoft Developer Studio Project File - Name="lib" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 5.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Static Library" 0x0104 CFG=lib - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "lib.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "lib.mak" CFG="lib - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "lib - Win32 Release" (based on "Win32 (x86) Static Library") !MESSAGE "lib - Win32 Debug" (based on "Win32 (x86) Static Library") !MESSAGE # Begin Project # PROP Scc_ProjName ""$/pccts/Sorcerer/lib", EPABAAAA" # PROP Scc_LocalPath "." CPP=cl.exe !IF "$(CFG)" == "lib - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /nologo /W3 /GX /O2 /I "h" /I "..\h" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "PC" /YX /FD /c BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo !ELSEIF "$(CFG)" == "lib - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /nologo /W3 /GX /Z7 /Od /I "h" /I "..\h" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "PC" /YX /FD /c BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo !ENDIF # Begin Target # Name "lib - Win32 Release" # Name "lib - Win32 Debug" # Begin Group "Header files" # PROP Default_Filter "h" # Begin Source File SOURCE=.\CASTBase.h # End Source File # End Group # Begin Group "Source files" # PROP Default_Filter "c,cpp" # Begin Source File SOURCE=.\astlib.c # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=.\errsupport.c # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=.\PCCTSAST.cpp # End Source File # Begin Source File SOURCE=.\sintstack.c # End Source File # Begin Source File SOURCE=.\SList.cpp # End Source File # Begin Source File SOURCE=.\sorcerer.c # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=.\sorlist.c # PROP Exclude_From_Build 1 # End Source File # Begin Source File SOURCE=.\sstack.c # End Source File # Begin Source File SOURCE=.\STreeParser.cpp # End Source File # End Group # End Target # End Project gtkwave-3.3.86/contrib/pccts/sorcerer/lib/astlib.c0000664000175000017500000004427013166335473021403 0ustar bybellbybell/* * astlib.c * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public * domain. An individual or company may do whatever they wish with * source code distributed with SORCERER or the code generated by * SORCERER, including the incorporation of SORCERER, or its output, into * commerical software. * * We encourage users to develop software with SORCERER. However, we do * ask that credit is given to us for developing SORCERER. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like SORCERER and have developed a nice tool with the * output, please mention that you developed it using SORCERER. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * SORCERER 1.00B * Terence Parr * AHPCRC, University of Minnesota * 1992-1994 */ #include #include "pcctscfg.h" #include #define SORCERER_TRANSFORM #include "CASTBase.h" #include "astlib.h" #ifdef PCCTS_USE_STDARG #include #else #include #endif /* String Scanning/Parsing Stuff */ #define StringScanMaxText 50 typedef struct stringlexer { #ifdef __USE_PROTOS signed int c; #else int c; #endif char *input; char *p; char text[StringScanMaxText]; } StringLexer; #define LPAREN 1 #define RPAREN 2 #define PERCENT 3 #define INT 4 #define COLON 5 #define POUND 6 #define PERIOD 7 #define StringScanEOF -1 #define VALID_SCAN_TOKEN(t) (t>=LPAREN && t<=PERIOD) static char *scan_token_tbl[] = { "invalid", /* 0 */ "LPAREN", /* 1 */ "RPAREN", /* 2 */ "PERCENT", /* 3 */ "INT", /* 4 */ "COLON", /* 5 */ "POUND", /* 6 */ "PERIOD", /* 7 */ }; char * #ifdef __USE_PROTOS scan_token_str(int t) #else scan_token_str(t) int t; #endif { if ( VALID_SCAN_TOKEN(t) ) return scan_token_tbl[t]; else if ( t==StringScanEOF ) return ""; else return ""; } typedef struct stringparser { int token; StringLexer *lexer; int num_labels; } StringParser; /* This type ONLY USED by ast_scan() */ typedef struct _scanast { struct _scanast *right, *down; int token; int label_num; } ScanAST; #ifdef __USE_PROTOS static void stringlexer_init(StringLexer *scanner, char *input); static void stringparser_init(StringParser *, StringLexer *); static ScanAST *stringparser_parse_scanast(char *templ, int *n); static ScanAST *stringparser_parse_tree(StringParser *parser); static ScanAST *stringparser_parse_element(StringParser *parser); static void stringscan_advance(StringLexer *scanner); static int stringscan_gettok(StringLexer *scanner); #else static void stringlexer_init(); static void stringparser_init(); static ScanAST *stringparser_parse_scanast(); static ScanAST *stringparser_parse_tree(); static ScanAST *stringparser_parse_element(); static void stringscan_advance(); static int stringscan_gettok(); #endif /* build a tree (root child1 child2 ... NULL) * If root is NULL, simply make the children siblings and return ptr * to 1st sibling (child1). If root is not single node, return NULL. * * Siblings that are actually sibling lists themselves are handled * correctly. For example #( NULL, #( NULL, A, B, C), D) results * in the tree ( NULL A B C D ). * * Requires at least two parameters with the last one being NULL. If * both are NULL, return NULL. * * The ast_down and ast_right down/right pointers are used to make the tree. */ SORAST * #ifdef PCCTS_USE_STDARG ast_make(SORAST *rt, ...) #else ast_make(va_alist) va_dcl #endif { va_list ap; register SORAST *child, *sibling=NULL, *tail = NULL, *w; SORAST *root; #ifdef PCCTS_USE_STDARG va_start(ap, rt); root = rt; #else va_start(ap); root = va_arg(ap, SORAST *); #endif if ( root != NULL ) if ( root->ast_down != NULL ) return NULL; child = va_arg(ap, SORAST *); while ( child != NULL ) { /* find end of child */ for (w=child; w->ast_right!=NULL; w=w->ast_right) {;} if ( sibling == NULL ) {sibling = child; tail = w;} else {tail->ast_right = child; tail = w;} child = va_arg(ap, SORAST *); } if ( root==NULL ) root = sibling; else root->ast_down = sibling; va_end(ap); return root; } /* The following push and pop routines are only used by ast_find_all() */ static void #ifdef __USE_PROTOS _push(SORAST **st, int *sp, SORAST *e) #else _push(st, sp, e) SORAST **st; int *sp; SORAST *e; #endif { (*sp)--; require((*sp)>=0, "stack overflow"); st[(*sp)] = e; } static SORAST * #ifdef __USE_PROTOS _pop(SORAST **st, int *sp) #else _pop(st, sp) SORAST **st; int *sp; #endif { SORAST *e = st[*sp]; (*sp)++; require((*sp)<=MaxTreeStackDepth, "stack underflow"); return e; } /* Is 'u' a subtree of 't' beginning at the root? */ int #ifdef __USE_PROTOS ast_match_partial(SORAST *t, SORAST *u) #else ast_match_partial(t, u) SORAST *t, *u; #endif { SORAST *sib; if ( u==NULL ) return 1; if ( t==NULL ) if ( u!=NULL ) return 0; else return 1; for (sib=t; sib!=NULL&&u!=NULL; sib=sib->ast_right, u=u->ast_right) { if ( sib->token != u->token ) return 0; if ( sib->ast_down!=NULL ) if ( !ast_match_partial(sib->ast_down, u->ast_down) ) return 0; } return 1; } /* Find all occurrences of u in t. * 'cursor' must be initialized to 't'. It eventually * returns NULL when no more occurrences of 'u' are found. */ SORAST * #ifdef __USE_PROTOS ast_find_all(SORAST *t, SORAST *u, SORAST **cursor) #else ast_find_all(t, u, cursor) SORAST *t, *u, **cursor; #endif { SORAST *sib; static SORAST *template_stack[MaxTreeStackDepth]; static int tsp = MaxTreeStackDepth; if ( *cursor == NULL ) return NULL; if ( *cursor!=t ) sib = *cursor; else { /* else, first time--start at top of template 't' */ tsp = MaxTreeStackDepth; sib = t; /* bottom of stack is always a NULL--"cookie" indicates "done" */ _push(template_stack, &tsp, NULL); } keep_looking: if ( sib==NULL ) /* hit end of sibling list */ { sib = _pop(template_stack, &tsp); if ( sib == NULL ) { *cursor = NULL; return NULL; } } if ( sib->token != u->token ) { /* look for another match */ if ( sib->ast_down!=NULL ) { if ( sib->ast_right!=NULL ) _push(template_stack, &tsp, sib->ast_right); sib=sib->ast_down; goto keep_looking; } /* nothing below to try, try next sibling */ sib=sib->ast_right; goto keep_looking; } /* found a matching root node, try to match what's below */ if ( ast_match_partial(sib, u) ) { /* record sibling cursor so we can pick up next from there */ if ( sib->ast_down!=NULL ) { if ( sib->ast_right!=NULL ) _push(template_stack, &tsp, sib->ast_right); *cursor = sib->ast_down; } else if ( sib->ast_right!=NULL ) *cursor = sib->ast_right; else *cursor = _pop(template_stack, &tsp); return sib; } /* no match, keep searching */ if ( sib->ast_down!=NULL ) { if ( sib->ast_right!=NULL ) _push(template_stack, &tsp, sib->ast_right); sib=sib->ast_down; } else sib = sib->ast_right; /* else, try to right if zip below */ goto keep_looking; } /* are two trees exactly alike? */ int #ifdef __USE_PROTOS ast_match(SORAST *t, SORAST *u) #else ast_match(t, u) SORAST *t, *u; #endif { SORAST *sib; if ( t==NULL ) if ( u!=NULL ) return 0; else return 1; if ( u==NULL ) return 0; for (sib=t; sib!=NULL&&u!=NULL; sib=sib->ast_right, u=u->ast_right) { if ( sib->token != u->token ) return 0; if ( sib->ast_down!=NULL ) if ( !ast_match(sib->ast_down, u->ast_down) ) return 0; } return 1; } static int #ifdef __USE_PROTOS ast_scanmatch(ScanAST *t, SORAST *u, SORAST **labels[], int *n) #else ast_scanmatch(t, u, labels, n) ScanAST *t; SORAST *u; SORAST **labels[]; int *n; #endif { ScanAST *sib; if ( t==NULL ) if ( u!=NULL ) return 0; else return 1; if ( u==NULL ) return 0; for (sib=t; sib!=NULL&&u!=NULL; sib=sib->right, u=u->ast_right) { /* make sure tokens match; token of '0' means wildcard match */ if ( sib->token != u->token && sib->token!=0 ) return 0; /* we have a matched token here; set label pointers if exists */ if ( sib->label_num>0 ) { require(labels!=NULL, "label found in template, but no array of labels"); (*n)++; *(labels[sib->label_num-1]) = u; } /* match what's below if something there and current node is not wildcard */ if ( sib->down!=NULL && sib->token!=0 ) if ( !ast_scanmatch(sib->down, u->ast_down, labels, n) ) return 0; } return 1; } void #ifdef __USE_PROTOS ast_insert_after(SORAST *a, SORAST *b) #else ast_insert_after(a, b) SORAST *a,*b; #endif { SORAST *end; require(a!=NULL, "ast_insert_after: NULL input tree"); if ( b==NULL ) return; /* find end of b's child list */ for (end=b; end->ast_right!=NULL; end=end->ast_right) {;} end->ast_right = a->ast_right; a->ast_right = b; } void #ifdef __USE_PROTOS ast_append(SORAST *a, SORAST *b) #else ast_append(a, b) SORAST *a,*b; #endif { SORAST *end; require(a!=NULL&&b!=NULL, "ast_append: NULL input tree"); /* find end of child list */ for (end=a; end->ast_right!=NULL; end=end->ast_right) {;} end->ast_right = b; } SORAST * #ifdef __USE_PROTOS ast_tail(SORAST *a) #else ast_tail(a) SORAST *a; #endif { SORAST *end; require(a!=NULL, "ast_tail: NULL input tree"); /* find end of child list */ for (end=a; end->ast_right!=NULL; end=end->ast_right) {;} return end; } SORAST * #ifdef __USE_PROTOS ast_bottom(SORAST *a) #else ast_bottom(a) SORAST *a; #endif { SORAST *end; require(a!=NULL, "ast_bottom: NULL input tree"); /* find end of child list */ for (end=a; end->ast_down!=NULL; end=end->ast_down) {;} return end; } SORAST * #ifdef __USE_PROTOS ast_cut_between(SORAST *a, SORAST *b) #else ast_cut_between(a, b) SORAST *a,*b; #endif { SORAST *end, *ret; require(a!=NULL&&b!=NULL, "ast_cut_between: NULL input tree"); /* find node pointing to b */ for (end=a; end->ast_right!=NULL&&end->ast_right!=b; end=end->ast_right) {;} require(end->ast_right!=NULL, "ast_cut_between: a,b not connected"); end->ast_right = NULL; /* don't want it point to 'b' anymore */ ret = a->ast_right; a->ast_right = b; return ret; } SList * #ifdef __USE_PROTOS ast_to_slist(SORAST *t) #else ast_to_slist(t) SORAST *t; #endif { SList *list=NULL; SORAST *p; for (p=t; p!=NULL; p=p->ast_right) { slist_add(&list, p); } return list; } SORAST * #ifdef __USE_PROTOS slist_to_ast(SList *list) #else slist_to_ast(list) SList *list; #endif { SORAST *t=NULL, *last=NULL; SList *p; for (p = list->next; p!=NULL; p=p->next) { SORAST *u = (SORAST *)p->elem; if ( last==NULL ) last = t = u; else { last->ast_right = u; last = u; } } return t; } void #ifdef __USE_PROTOS ast_free(SORAST *t) #else ast_free(t) SORAST *t; #endif { if ( t == NULL ) return; ast_free( t->ast_down ); ast_free( t->ast_right ); free( t ); } int #ifdef __USE_PROTOS ast_nsiblings(SORAST *t) #else ast_nsiblings(t) SORAST *t; #endif { int n=0; while ( t!=NULL ) { n++; t = t->ast_right; } return n; } SORAST * #ifdef __USE_PROTOS ast_sibling_index(SORAST *t, int i) #else ast_sibling_index(t,i) SORAST *t; int i; #endif { int j=1; require(i>0, "ast_sibling_index: i<=0"); while ( t!=NULL ) { if ( j==i ) return t; j++; t = t->ast_right; } return NULL; } static void #ifdef __USE_PROTOS scanast_free(ScanAST *t) #else scanast_free(t) ScanAST *t; #endif { if ( t == NULL ) return; scanast_free( t->down ); scanast_free( t->right ); free( t ); } /* * ast_scan * * This function is like scanf(): it attempts to match a template * against an input tree. A variable number of tree pointers * may be set according to the '%i' labels in the template string. * For example: * * ast_scan("#( 6 #(5 %1:4 %2:3) #(1 %3:3 %4:3) )", * t, &w, &x, &y, &z); * * Naturally, you'd want this converted from * * ast_scan("#( RangeOp #(Minus %1:IConst %2:Var) #(Plus %3:Var %4Var) )", * t, &w, &x, &y, &z); * * by SORCERER. * * This function call must be done withing a SORCERER file because SORCERER * must convert the token references to the associated token number. * * This functions parses the template and creates trees which are then * matched against the input tree. The labels are set as they are * encountered; hence, partial matches may leave some pointers set * and some NULL. This routines initializes all argument pointers to NULL * at the beginning. * * This function returns the number of labels matched. */ int #ifdef PCCTS_USE_STDARG ast_scan(char *templ, SORAST *tree, ...) #else ast_scan(va_alist) va_dcl #endif { va_list ap; ScanAST *t; int n, i, found=0; SORAST ***label_ptrs=NULL; #ifdef PCCTS_USE_STDARG va_start(ap, tree); #else char *templ; SORAST *tree; va_start(ap); templ = va_arg(ap, char *); tree = va_arg(ap, SORAST *); #endif /* make a ScanAST tree out of the template */ t = stringparser_parse_scanast(templ, &n); /* make an array out of the labels */ if ( n>0 ) { label_ptrs = (SORAST ***) calloc(n, sizeof(SORAST **)); require(label_ptrs!=NULL, "ast_scan: out of memory"); for (i=1; i<=n; i++) { label_ptrs[i-1] = va_arg(ap, SORAST **); *(label_ptrs[i-1]) = NULL; } } /* match the input tree against the template */ ast_scanmatch(t, tree, label_ptrs, &found); scanast_free(t); free(label_ptrs); return found; } static ScanAST * #ifdef __USE_PROTOS new_scanast(int tok) #else new_scanast(tok) int tok; #endif { ScanAST *p = (ScanAST *) calloc(1, sizeof(ScanAST)); if ( p == NULL ) {fprintf(stderr, "out of mem\n"); exit(-1);} p->token = tok; return p; } static ScanAST * #ifdef __USE_PROTOS stringparser_parse_scanast(char *templ, int *num_labels) #else stringparser_parse_scanast(templ, num_labels) char *templ; int *num_labels; #endif { StringLexer lex; StringParser parser; ScanAST *t; stringlexer_init(&lex, templ); stringparser_init(&parser, &lex); t = stringparser_parse_tree(&parser); *num_labels = parser.num_labels; return t; } static void #ifdef __USE_PROTOS stringparser_match(StringParser *parser, int token) #else stringparser_match(parser, token) StringParser *parser; int token; #endif { if ( parser->token != token ) sorcerer_panic("bad tree in ast_scan()"); } /* * Match a tree of the form: * (root child1 child2 ... childn) * or, * node * * where the elements are integers or labeled integers. */ static ScanAST * #ifdef __USE_PROTOS stringparser_parse_tree(StringParser *parser) #else stringparser_parse_tree(parser) StringParser *parser; #endif { ScanAST *t=NULL, *root, *child, *last = NULL; if ( parser->token != POUND ) { return stringparser_parse_element(parser); } stringparser_match(parser,POUND); parser->token = stringscan_gettok(parser->lexer); stringparser_match(parser,LPAREN); parser->token = stringscan_gettok(parser->lexer); root = stringparser_parse_element(parser); while ( parser->token != RPAREN ) { child = stringparser_parse_element(parser); if ( t==NULL ) { t = child; last = t; } else { last->right = child; last = child; } } stringparser_match(parser,RPAREN); parser->token = stringscan_gettok(parser->lexer); root->down = t; return root; } static ScanAST * #ifdef __USE_PROTOS stringparser_parse_element(StringParser *parser) #else stringparser_parse_element(parser) StringParser *parser; #endif { static char ebuf[100]; int label = 0; if ( parser->token == POUND ) { return stringparser_parse_tree(parser); } if ( parser->token == PERCENT ) { parser->token = stringscan_gettok(parser->lexer); stringparser_match(parser,INT); label = atoi(parser->lexer->text); parser->num_labels++; if ( label==0 ) sorcerer_panic("%%0 is an invalid label"); parser->token = stringscan_gettok(parser->lexer); stringparser_match(parser,COLON); parser->token = stringscan_gettok(parser->lexer); /* can label tokens and wildcards */ if ( parser->token != INT && parser->token != PERIOD ) sorcerer_panic("can only label tokens"); } if ( parser->token == INT ) { ScanAST *p = new_scanast(atoi(parser->lexer->text)); parser->token = stringscan_gettok(parser->lexer); p->label_num = label; return p; } if ( parser->token == PERIOD ) { ScanAST *p = new_scanast(0); /* token of 0 is wildcard */ parser->token = stringscan_gettok(parser->lexer); p->label_num = label; return p; } sprintf(ebuf, "mismatch token in ast_scan(): %s", scan_token_str(parser->token)); sorcerer_panic(ebuf); return NULL; /* MR20 make -Wall happy */ } static void #ifdef __USE_PROTOS stringparser_init(StringParser *parser, StringLexer *input) #else stringparser_init(parser, input) StringParser *parser; StringLexer *input; #endif { parser->lexer = input; parser->token = stringscan_gettok(parser->lexer); parser->num_labels = 0; } static void #ifdef __USE_PROTOS stringlexer_init(StringLexer *scanner, char *input) #else stringlexer_init(scanner, input) StringLexer *scanner; char *input; #endif { scanner->text[0]='\0'; scanner->input = input; scanner->p = input; stringscan_advance(scanner); } static void #ifdef __USE_PROTOS stringscan_advance(StringLexer *scanner) #else stringscan_advance(scanner) StringLexer *scanner; #endif { if ( *(scanner->p) == '\0' ) scanner->c = StringScanEOF; scanner->c = *(scanner->p)++; } static int #ifdef __USE_PROTOS stringscan_gettok(StringLexer *scanner) #else stringscan_gettok(scanner) StringLexer *scanner; #endif { char *index = &scanner->text[0]; static char ebuf[100]; while ( isspace(scanner->c) ) { stringscan_advance(scanner); } if ( isdigit(scanner->c) ) { int tok = INT; while ( isdigit(scanner->c) ) { *index++ = scanner->c; stringscan_advance(scanner); } *index = '\0'; return tok; } switch ( scanner->c ) { case '#' : stringscan_advance(scanner); return POUND; case '(' : stringscan_advance(scanner); return LPAREN; case ')' : stringscan_advance(scanner); return RPAREN; case '%' : stringscan_advance(scanner); return PERCENT; case ':' : stringscan_advance(scanner); return COLON; case '.' : stringscan_advance(scanner); return PERIOD; case '\0' : return StringScanEOF; case StringScanEOF : return StringScanEOF; default : sprintf(ebuf, "invalid char in ast_scan: '%c'", scanner->c); sorcerer_panic(ebuf); return 0; /* MR20 Make -Wall happy */ } } gtkwave-3.3.86/contrib/pccts/sorcerer/lib/STreeParser.cpp0000664000175000017500000000657113166335473022666 0ustar bybellbybell#include "pccts_stdio.h" //MR23 #include "pccts_stdarg.h" //MR23 #include "STreeParser.h" void STreeParser:: MATCH(SORASTBase *_t,int tok) { if ( _t->type()!=tok ) { if ( guessing ) _GUESS_FAIL; else mismatched_token(tok, _t); } } void STreeParser:: MATCHRANGE(SORASTBase *_t,int tok,int tok2) { if ( _t->type()type()>tok2 ) { if ( guessing ) _GUESS_FAIL; else mismatched_range(tok, tok2, _t); } } void STreeParser:: WILDCARD(SORASTBase *_t) { if ( _t==NULL ) { if ( guessing ) _GUESS_FAIL; else missing_wildcard(); } } void STreeParser:: mismatched_range(int looking_for, int upper_token, SORASTBase *found) { if ( found!=NULL ) { /* MR23 */ printMessage(stderr, "parse error: expected token range %d..%d found token %d\n", looking_for, upper_token, found->type()); } else { /* MR23 */ printMessage(stderr, "parse error: expected token range %d..%d found NULL tree\n", looking_for, upper_token); } } void STreeParser:: missing_wildcard() { /* MR23 */ printMessage(stderr, "parse error: expected any token/tree found found NULL tree\n"); } void STreeParser:: mismatched_token(int looking_for, SORASTBase *found) { if ( found!=NULL ) { /* MR23 */ printMessage(stderr, "parse error: expected token %d found token %d\n", looking_for, found->type()); } else { /* MR23 */ printMessage(stderr, "parse error: expected token %d found NULL tree\n", looking_for); } } void STreeParser:: no_viable_alt(char *rulename, SORASTBase *root) { if ( root==NULL ) /* MR23 */ printMessage(stderr, "parse error: in rule %s, no viable alternative for NULL tree\n", rulename); else /* MR23 */ printMessage(stderr, "parse error: in rule %s, no viable alternative for tree\n", rulename); } void STreeParser:: panic(char *err) { /* MR23 */ printMessage(stderr, "panic: %s\n", err); exit(-1); } void STreeParser:: save_state(STreeParser *buf) { buf->try_ok = this->try_ok; buf->sjrv = this->sjrv; buf->guessing = this->guessing; buf->startofguess = this->startofguess; } void STreeParser:: restore_state(STreeParser *buf) { this->try_ok = buf->try_ok; this->sjrv = buf->sjrv; this->guessing = buf->guessing; this->startofguess = buf->startofguess; } void STreeParser:: _mkroot(SORASTBase **r, SORASTBase ** /*s*/, SORASTBase ** /*e*/, SORASTBase *t) { *r = t; } void STreeParser:: _mkchild(SORASTBase **r, SORASTBase **s, SORASTBase **e, SORASTBase *t) { #ifdef BEFORE_GARYS_FIX /* if no sibling list, must attach to any existing root */ if ( *s==NULL ) { *s = *e = t; /* If r is NULL, then there was no root defined--must be sibling list */ if ( *r==NULL ) *r = *s; else (*r)->setDown(t); } else { (*e)->setRight(t); *e = t; } #endif /* should do nothing if asked to add a NULL argument. NULL's come up when a rule wants to return "nothing". */ /* if no sibling list, must attach to any existing root */ if (*s == NULL) { *s = *e = t; // If r is NULL then there was no root defined--must be sibling list if (*r == NULL) *r = *s; else (*r)->setDown(t); } else if (*e != NULL) { (*e)->setRight(t); *e = t; } if (*e != NULL) { while ((*e)->right() != NULL) *e = (SORASTBase *)(*e)->right(); } } //MR23 int STreeParser::printMessage(FILE* pFile, const char* pFormat, ...) { va_list marker; va_start( marker, pFormat ); int iRet = vfprintf(pFile, pFormat, marker); va_end( marker ); return iRet; } gtkwave-3.3.86/contrib/pccts/sorcerer/lib/sorlist.c0000664000175000017500000000607513166335473021625 0ustar bybellbybell/* * slist.c * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public * domain. An individual or company may do whatever they wish with * source code distributed with SORCERER or the code generated by * SORCERER, including the incorporation of SORCERER, or its output, into * commerical software. * * We encourage users to develop software with SORCERER. However, we do * ask that credit is given to us for developing SORCERER. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like SORCERER and have developed a nice tool with the * output, please mention that you developed it using SORCERER. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * SORCERER 1.00B * Terence Parr * AHPCRC, University of Minnesota * 1992-1994 */ #include #include #ifdef PCCTS_USE_STDARG #include #else #include #endif #include "CASTBase.h" #include "sorlist.h" /* Iterate over a list of elements; returns ptr to a new element * in list upon every call and NULL when no more are left. * Very useful like this: * * cursor = mylist; * while ( (p=slist_iterate(mylist,&cursor)) ) { * / * place with element p * / * } * * The cursor must be initialized to point to the list to iterate over. */ void * #ifdef __USE_PROTOS slist_iterate(SList *list, SList **cursor) #else slist_iterate(list, cursor) SList *list, **cursor; #endif { void *e; if ( list==NULL || cursor == NULL || *cursor==NULL ) return NULL; if ( list== *cursor ) { *cursor = (*cursor)->next; } e = (*cursor)->elem; (*cursor) = (*cursor)->next; return e; } /* * add an element to a list. * * Any non-empty list has a sentinel node whose 'elem' pointer is really * a pointer to the last element. (i.e. length(list) = #elemIn(list)+1). * Elements are appended to the list. */ void #ifdef __USE_PROTOS slist_add( SList **list, void *e ) #else slist_add( list, e ) SList **list; void *e; #endif { SList *p, *tail; require(e!=NULL, "slist_add: attempting to add NULL list element"); p = newSList; require(p!=NULL, "slist_add: cannot alloc new list node"); p->elem = e; if ( *list == NULL ) { SList *sentinel = newSList; require(sentinel!=NULL, "slist_add: cannot alloc sentinel node"); *list=sentinel; sentinel->next = p; sentinel->elem = (char *)p; /* set tail pointer */ } else /* find end of list */ { tail = (SList *) (*list)->elem; /* get tail pointer */ tail->next = p; (*list)->elem = (char *) p; /* reset tail */ } } void #ifdef __USE_PROTOS slist_free(SList *list) #else slist_free(list) SList *list; #endif { SList *p,*q; if ( list==NULL ) return; /* empty list */ for (p = list->next; p!=NULL; p=q) { q = p->next; free(p); } } gtkwave-3.3.86/contrib/pccts/sorcerer/lib/Makefile.in0000664000175000017500000003123713166335473022025 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ #SRC = astlib.c sstack.c sorlist.c sintstack.c #OBJ = astlib.o sstack.o sorlist.o sintstack.o #CFLAGS=$(COPT) -I../../h -I../h VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = contrib/pccts/sorcerer/lib DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ CASTBase.h STreeParser.cpp astlib.c errsupport.c \ msvc.dsp sintstack.c sorcerer.c sorlist.c sstack.c all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/pccts/sorcerer/lib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/pccts/sorcerer/lib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/contrib/pccts/sorcerer/lib/sintstack.c0000664000175000017500000000537113166335473022127 0ustar bybellbybell/* * sint.c * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public * domain. An individual or company may do whatever they wish with * source code distributed with SORCERER or the code generated by * SORCERER, including the incorporation of SORCERER, or its output, into * commerical software. * * We encourage users to develop software with SORCERER. However, we do * ask that credit is given to us for developing SORCERER. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like SORCERER and have developed a nice tool with the * output, please mention that you developed it using SORCERER. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * SORCERER 1.00B * Terence Parr * AHPCRC, University of Minnesota * 1992-1994 */ #include #include #ifdef PCCTS_USE_STDARG #include #else #include #endif #include "CASTBase.h" #include "sintstack.h" SIntStack * #ifdef __USE_PROTOS sint_newstack(int size) #else sint_newstack(size) int size; #endif { SIntStack *p = (SIntStack *) calloc(1, sizeof(SIntStack)); require(p!=NULL, "sint_newstack: out of memory"); p->data = (int *) calloc(size, sizeof(int)); require(p!=NULL, "sint_newstack: out of memory"); p->size = size; p->sp = size; return p; } void #ifdef __USE_PROTOS sint_freestack(SIntStack *st) #else sint_freestack(st) SIntStack *st; #endif { if ( st==NULL ) return; if ( st->data==NULL ) return; free(st->data); free(st); } void #ifdef __USE_PROTOS sint_push(SIntStack *st,int i) #else sint_push(st,i) SIntStack *st; int i; #endif { require(st->sp>0, "sint_push: stack overflow"); st->data[--(st->sp)] = i; } int #ifdef __USE_PROTOS sint_pop(SIntStack *st) #else sint_pop(st) SIntStack *st; #endif { require(st->spsize, "sint_pop: stack underflow"); return st->data[st->sp++]; } int #ifdef __USE_PROTOS sint_stacksize(SIntStack *st) #else sint_stacksize(st) SIntStack *st; #endif { return st->size - st->sp; } void #ifdef __USE_PROTOS sint_stackreset(SIntStack *st) #else sint_stackreset(st) SIntStack *st; #endif { st->sp = st->size; } int #ifdef __USE_PROTOS sint_stackempty(SIntStack *st) #else sint_stackempty(st) SIntStack *st; #endif { return st->sp==st->size; } int #ifdef __USE_PROTOS sint_top(SIntStack *st) #else sint_top(st) SIntStack *st; #endif { require(st->spsize, "sint_top: stack underflow"); return st->data[st->sp]; } gtkwave-3.3.86/contrib/pccts/sorcerer/SorcererMSVC60.dsp0000664000175000017500000001411013166335473022334 0ustar bybellbybell# Microsoft Developer Studio Project File - Name="Sorcerer" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=Sorcerer - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "SorcererMSVC60.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "SorcererMSVC60.mak" CFG="Sorcerer - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "Sorcerer - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "Sorcerer - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "SorcererMSVC60" # PROP Scc_LocalPath ".." CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "Sorcerer - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "." # PROP Intermediate_Dir "." # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /W3 /O2 /I "." /I "..\h" /I "..\support\set" /D "__STDC__" /D "NDEBUG" /D "LONGFILENAMES" /D "PC" /D ZZLEXBUFSIZE=65536 /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FD /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"./Sorcerer.exe" # Begin Special Build Tool SOURCE="$(InputPath)" PostBuild_Desc=Update executables in BIN directory PostBuild_Cmds=rename ..\bin\Sorcerer.exe Sorcerer_old.exe copy ..\Sorcerer\Sorcerer.exe ..\bin\ # End Special Build Tool !ELSEIF "$(CFG)" == "Sorcerer - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "." # PROP Intermediate_Dir "." # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /W3 /Gm /ZI /Od /I "." /I "..\h" /I "..\support\set" /D "__STDC__" /D "LONGFILENAMES" /D "PC" /D ZZLEXBUFSIZE=65536 /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FR /FD /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"./Sorcerer.exe" /pdbtype:sept # Begin Special Build Tool SOURCE="$(InputPath)" PostBuild_Desc=Update executables in BIN directory PostBuild_Cmds=rename ..\bin\Sorcerer.exe Sorcerer_old.exe copy ..\Sorcerer\Sorcerer.exe ..\bin\ # End Special Build Tool !ENDIF # Begin Target # Name "Sorcerer - Win32 Release" # Name "Sorcerer - Win32 Debug" # Begin Source File SOURCE=.\cpp.c # End Source File # Begin Source File SOURCE=.\err.c # End Source File # Begin Source File SOURCE=.\gen.c # End Source File # Begin Source File SOURCE=.\globals.c # End Source File # Begin Source File SOURCE=.\hash.c # End Source File # Begin Source File SOURCE=.\look.c # End Source File # Begin Source File SOURCE=.\main.c # End Source File # Begin Source File SOURCE=.\scan.c # End Source File # Begin Source File SOURCE=..\support\set\set.c # End Source File # Begin Source File SOURCE=.\sor.c # End Source File # Begin Source File SOURCE=.\sor.g !IF "$(CFG)" == "Sorcerer - Win32 Release" # Begin Custom Build - Generating Parser InputPath=.\sor.g InputName=sor BuildCmds= \ ..\bin\antlr -gh -k 2 -gt $(InputName).g \ ..\bin\dlg -C2 parser.dlg scan.c \ "parser.dlg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "mode.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "stdpccts.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "sor.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "scan.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "err.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) # End Custom Build !ELSEIF "$(CFG)" == "Sorcerer - Win32 Debug" # Begin Custom Build - Generating Parser InputPath=.\sor.g InputName=sor BuildCmds= \ ..\bin\antlr -gh -k 2 -gt $(InputName).g \ ..\bin\dlg -C2 parser.dlg scan.c \ "parser.dlg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "mode.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "stdpccts.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "sor.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "scan.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "err.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) # End Custom Build !ENDIF # End Source File # End Target # End Project gtkwave-3.3.86/contrib/pccts/sorcerer/sor68K.make0000664000175000017500000000435113166335473021142 0ustar bybellbybell# File: sor68K.make # Target: sor68K # Sources: cpp.c # err.c # gen.c # globals.c # hash.c # look.c # main.c # scan.c # sor.c # ::support:set:set.c # Created: Monday, May 18, 1998 12:20:50 AM # Author: Kenji Tanaka MAKEFILE = sor68K.make ¥MondoBuild¥ = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified Includes = ¶ -i "::h:" ¶ -i "::support:set:" Sym¥68K = ObjDir¥68K = :Obj: COptions = {Includes} {Sym¥68K} -w off -model far -mc68020 -d __STDC__ -d MPW -d USER_ZZSYN Objects¥68K = ¶ "{ObjDir¥68K}cpp.c.o" ¶ "{ObjDir¥68K}err.c.o" ¶ "{ObjDir¥68K}gen.c.o" ¶ "{ObjDir¥68K}globals.c.o" ¶ "{ObjDir¥68K}hash.c.o" ¶ "{ObjDir¥68K}look.c.o" ¶ "{ObjDir¥68K}main.c.o" ¶ "{ObjDir¥68K}scan.c.o" ¶ "{ObjDir¥68K}sor.c.o" ¶ "{ObjDir¥68K}set.c.o" sor68K ÄÄ {¥MondoBuild¥} {Objects¥68K} Link ¶ -o {Targ} -d {Sym¥68K} ¶ {Objects¥68K} ¶ -t 'MPST' ¶ -c 'MPS ' ¶ -mf ¶ -model far ¶ -br ON ¶ -srtsg ALL ¶ "{Libraries}Stubs.o" ¶ #"{Libraries}MathLib.o" ¶ #"{CLibraries}Complex.o" ¶ "{CLibraries}StdCLib.o" ¶ "{Libraries}MacRuntime.o" ¶ "{Libraries}IntEnv.o" ¶ #"{Libraries}ToolLibs.o" ¶ "{Libraries}Interface.o" "{ObjDir¥68K}cpp.c.o" Ä {¥MondoBuild¥} cpp.c {C} cpp.c -o {Targ} {COptions} "{ObjDir¥68K}err.c.o" Ä {¥MondoBuild¥} err.c {C} err.c -o {Targ} {COptions} "{ObjDir¥68K}gen.c.o" Ä {¥MondoBuild¥} gen.c {C} gen.c -o {Targ} {COptions} "{ObjDir¥68K}globals.c.o" Ä {¥MondoBuild¥} globals.c {C} globals.c -o {Targ} {COptions} "{ObjDir¥68K}hash.c.o" Ä {¥MondoBuild¥} hash.c {C} hash.c -o {Targ} {COptions} "{ObjDir¥68K}look.c.o" Ä {¥MondoBuild¥} look.c {C} look.c -o {Targ} {COptions} "{ObjDir¥68K}main.c.o" Ä {¥MondoBuild¥} main.c {C} main.c -o {Targ} {COptions} "{ObjDir¥68K}scan.c.o" Ä {¥MondoBuild¥} scan.c {C} scan.c -o {Targ} {COptions} "{ObjDir¥68K}sor.c.o" Ä {¥MondoBuild¥} sor.c {C} sor.c -o {Targ} {COptions} "{ObjDir¥68K}set.c.o" Ä {¥MondoBuild¥} "::support:set:set.c" {C} "::support:set:set.c" -o {Targ} {COptions} sor68K ÄÄ sor.r Rez sor.r -o sor68K -a Install Ä sor68K Duplicate -y sor68K "{MPW}"Tools:sor gtkwave-3.3.86/contrib/pccts/sorcerer/err.c0000664000175000017500000003142713166335473020147 0ustar bybellbybell/* * A n t l r S e t s / E r r o r F i l e H e a d e r * * Generated from: sor.g * * Terence Parr, Russell Quong, Will Cohen, and Hank Dietz: 1989-2001 * Parr Research Corporation * with Purdue University Electrical Engineering * With AHPCRC, University of Minnesota * ANTLR Version 1.33MR33 */ #define ANTLR_VERSION 13333 #include "pcctscfg.h" #include "pccts_stdio.h" /* 23-Sep-97 thm Accomodate user who needs to redefine ZZLEXBUFSIZE */ #ifndef ZZLEXBUFSIZE #define ZZLEXBUFSIZE 8000 #endif #include "pcctscfg.h" /* MR20 G. Hobbelt __USE_PROTOS #define */ #include "charbuf.h" #include "hash.h" #include "set.h" #include "sor.h" #define AST_FIELDS \ int token; char text[MaxAtom+1], label[MaxRuleName+1]; \ char *action; /* if action node, here is ptr to it */ \ char in,out; \ char init_action; /* set if Action and 1st action of alt */ \ int file; int line; /* set for BLOCK, ALT, nonterm nodes */ \ int upper_range; /* only if T1..T2 found */ \ GLA *start_state; /* ptr into GLA for this block */ \ int no_copy; /* copy input ptr to output ptr? */ \ ListNode *refvars; /* any ref vars defined for this rule */ \ unsigned char is_root; /* this token is a root #( A ... ) */ #define zzcr_ast(node, cur, _tok, _text) \ {(node)->token=_tok; strncpy((node)->text, _text,MaxAtom);} #define USER_ZZSYN #define zzAST_DOUBLE extern int define_num; #define LL_K 2 #define zzSET_SIZE 16 #include "antlr.h" #include "ast.h" #include "tokens.h" #include "dlgdef.h" #include "err.h" ANTLRChar *zztokens[118]={ /* 00 */ "Invalid", /* 01 */ "Eof", /* 02 */ "RExpr", /* 03 */ "\\n|\\r|\\r\\n", /* 04 */ "\\~[]", /* 05 */ "~[\\n\\r\"\\]+", /* 06 */ "\"", /* 07 */ "\\n|\\r|\\r\\n", /* 08 */ "\\~[]", /* 09 */ "~[\\n\\r\"\\]+", /* 10 */ "'", /* 11 */ "\\n|\\r|\\r\\n", /* 12 */ "\\~[]", /* 13 */ "~[\\n\\r'\\]+", /* 14 */ "\\*/", /* 15 */ "\\*", /* 16 */ "\\n|\\r|\\r\\n", /* 17 */ "~[\\n\\r\\*]+", /* 18 */ "\\n|\\r|\\r\\n", /* 19 */ "~[\\n\\r]+", /* 20 */ "\\n|\\r|\\r\\n", /* 21 */ "~[\\n\\r]+", /* 22 */ "\\*/", /* 23 */ "\\*", /* 24 */ "\\n|\\r|\\r\\n", /* 25 */ "~[\\n\\r\\*]+", /* 26 */ "~[\\)]+ \\)", /* 27 */ "Action", /* 28 */ "PassAction", /* 29 */ "\\n|\\r|\\r\\n", /* 30 */ "\\>", /* 31 */ "#[_a-zA-Z][_a-zA-Z0-9]*", /* 32 */ "#\\[\\]", /* 33 */ "#\\(\\)", /* 34 */ "#\\[", /* 35 */ "#\\(", /* 36 */ "#", /* 37 */ "\\)", /* 38 */ "\\[", /* 39 */ "\\(", /* 40 */ "\\\\]", /* 41 */ "\\\\)", /* 42 */ "\\>", /* 43 */ "'", /* 44 */ "\"", /* 45 */ "\\#", /* 46 */ "\\~[\\]\\)>#]", /* 47 */ "/", /* 48 */ "/\\*", /* 49 */ "\\*/", /* 50 */ "//", /* 51 */ "\\@\\(", /* 52 */ "\\@", /* 53 */ "[a-zA-Z_]+\\(", /* 54 */ "[a-zA-Z_]+", /* 55 */ "~[a-zA-Z_\\n\\r\\)\\(\\#\\>\\]\\[\"'/\\@]+", /* 56 */ "[\\t\\ ]+", /* 57 */ "\\n|\\r|\\n\\r", /* 58 */ "\\[", /* 59 */ "\\<\\<", /* 60 */ "\"", /* 61 */ "/\\*", /* 62 */ "\\*/", /* 63 */ "//", /* 64 */ "\\>\\>", /* 65 */ "Header", /* 66 */ "Tokdef", /* 67 */ "BLOCK", /* 68 */ "ALT", /* 69 */ "LABEL", /* 70 */ "OPT", /* 71 */ "POS_CLOSURE", /* 72 */ "CLOSURE", /* 73 */ "WILD", /* 74 */ "PRED_OP", /* 75 */ "BT", /* 76 */ "RULE", /* 77 */ "REFVAR", /* 78 */ "atomic-element", /* 79 */ "rule-header", /* 80 */ "\\}", /* 81 */ "class", /* 82 */ "NonTerm", /* 83 */ "Token", /* 84 */ "!", /* 85 */ "\\<", /* 86 */ "\\>", /* 87 */ ";", /* 88 */ "\\|", /* 89 */ "\\(", /* 90 */ "\\)", /* 91 */ "..", /* 92 */ "#[A-Za-z0-9_]*", /* 93 */ "\\*/", /* 94 */ "\\*", /* 95 */ "\\n|\\r|\\r\\n", /* 96 */ "~[\\n\\r\\*]+", /* 97 */ "\\n|\\r|\\r\\n", /* 98 */ "~[\\n\\r]+", /* 99 */ "[\\t\\ ]+", /* 100 */ "\\n|\\r|\\r\\n", /* 101 */ "//", /* 102 */ "/\\*", /* 103 */ "#ifndef", /* 104 */ "#ifdef", /* 105 */ "#else", /* 106 */ "#define", /* 107 */ "#endif", /* 108 */ "ID", /* 109 */ "INT", /* 110 */ "enum", /* 111 */ "\\{", /* 112 */ "=", /* 113 */ ",", /* 114 */ "DLGminToken", /* 115 */ "DLGmaxToken", /* 116 */ "\\}", /* 117 */ ";" }; SetWordType zzerr1[16] = {0x2,0x0,0x0,0x8, 0x0,0x0,0x0,0x0, 0x0,0x0,0x7,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr2[16] = {0x2,0x0,0x0,0x8, 0x0,0x0,0x0,0x0, 0x0,0x0,0x1,0x0, 0x0,0x0,0x0,0x0}; SetWordType setwd1[118] = {0x0,0xfe,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0xbe,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x81,0x81,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x9e,0x82,0x8e,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0}; SetWordType zzerr3[16] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0xc,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr4[16] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x80,0x10,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr5[16] = {0x0,0x0,0x0,0x10, 0x0,0x0,0x0,0x0, 0x0,0x0,0x20,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr6[16] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x80,0x0,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr7[16] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x20,0x0,0x40,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr8[16] = {0x0,0x0,0x0,0x8, 0x0,0x0,0x0,0x0, 0x40,0x48,0x91,0x7, 0x0,0x0,0x0,0x0}; SetWordType setwd2[118] = {0x0,0x23,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0xa3,0xc,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x1,0x1,0x0,0x0,0x14,0x80, 0x0,0x0,0x80,0x0,0x80,0x0,0x0,0x0, 0x0,0xe3,0x1,0xa3,0x80,0x0,0xc,0x14, 0xc0,0x80,0x80,0xc0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0}; SetWordType zzerr9[16] = {0x0,0x0,0x0,0x8, 0x0,0x0,0x0,0x0, 0x40,0x48,0x81,0x7, 0x0,0x0,0x0,0x0}; SetWordType zzerr10[16] = {0x2,0x0,0x0,0x8, 0x0,0x0,0x0,0x0, 0xc0,0xcd,0x91,0xf, 0x0,0x0,0x0,0x0}; SetWordType zzerr11[16] = {0x0,0x0,0x0,0x8, 0x0,0x0,0x0,0x0, 0x40,0x48,0x81,0x7, 0x0,0x0,0x0,0x0}; SetWordType zzerr12[16] = {0x0,0x0,0x0,0x18, 0x0,0x0,0x0,0x0, 0x40,0x48,0xf1,0x7, 0x0,0x0,0x0,0x0}; SetWordType zzerr13[16] = {0x0,0x0,0x0,0x10, 0x0,0x0,0x0,0x0, 0x0,0x0,0x20,0x0, 0x0,0x0,0x0,0x0}; SetWordType setwd3[118] = {0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x4d,0xc8,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4d, 0x0,0x0,0x4d,0x8,0x49,0x0,0x0,0x0, 0x0,0x78,0x0,0x4f,0x4f,0x8,0xc8,0x48, 0x78,0x78,0x4d,0x78,0x8,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0}; SetWordType zzerr14[16] = {0x0,0x0,0x0,0x18, 0x0,0x0,0x0,0x0, 0x40,0x48,0xe1,0x7, 0x0,0x0,0x0,0x0}; SetWordType zzerr15[16] = {0x0,0x0,0x0,0x8, 0x0,0x0,0x0,0x0, 0x40,0x48,0xc1,0x7, 0x0,0x0,0x0,0x0}; SetWordType zzerr16[16] = {0x0,0x0,0x0,0x8, 0x0,0x0,0x0,0x0, 0x40,0x4c,0x81,0x7, 0x0,0x0,0x0,0x0}; SetWordType zzerr17[16] = {0x0,0x0,0x0,0x8, 0x0,0x0,0x0,0x0, 0xc0,0x4d,0x81,0x7, 0x0,0x0,0x0,0x0}; SetWordType zzerr18[16] = {0x0,0x0,0x0,0x8, 0x0,0x0,0x0,0x0, 0x40,0x48,0x91,0x7, 0x0,0x0,0x0,0x0}; SetWordType zzerr19[16] = {0x0,0x0,0x0,0x8, 0x0,0x0,0x0,0x0, 0x40,0x40,0x0,0x2, 0x0,0x0,0x0,0x0}; SetWordType zzerr20[16] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0xc,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr21[16] = {0x0,0x0,0x0,0x18, 0x0,0x0,0x0,0x0, 0x40,0x48,0xf1,0x7, 0x0,0x0,0x0,0x0}; SetWordType zzerr22[16] = {0x0,0x0,0x0,0x10, 0x0,0x0,0x0,0x0, 0x0,0x0,0x20,0x0, 0x0,0x0,0x0,0x0}; SetWordType setwd4[118] = {0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x7f,0xc0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7f, 0x0,0x0,0x7f,0x0,0x7f,0x0,0x0,0x0, 0x0,0x7f,0x0,0x7f,0x7f,0x0,0xc0,0x41, 0x7f,0x7f,0x7f,0x7f,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0}; SetWordType zzerr23[16] = {0x0,0x0,0x0,0x18, 0x0,0x0,0x0,0x0, 0x40,0x48,0xe1,0x7, 0x0,0x0,0x0,0x0}; SetWordType zzerr24[16] = {0x0,0x0,0x0,0x8, 0x0,0x0,0x0,0x0, 0x40,0x48,0xc1,0x7, 0x0,0x0,0x0,0x0}; SetWordType zzerr25[16] = {0x0,0x0,0x0,0x8, 0x0,0x0,0x0,0x0, 0x40,0x48,0x91,0x7, 0x0,0x0,0x0,0x0}; SetWordType zzerr26[16] = {0x2,0x0,0x0,0x18, 0x0,0x0,0x0,0x0, 0x40,0x8,0x81,0x7, 0x0,0x0,0x0,0x0}; SetWordType zzerr27[16] = {0x2,0x0,0x0,0x18, 0x0,0x0,0x0,0x0, 0x40,0x48,0x81,0x7, 0x0,0x0,0x0,0x0}; SetWordType zzerr28[16] = {0x0,0x0,0x0,0x8, 0x0,0x0,0x0,0x0, 0x40,0x48,0x91,0x7, 0x0,0x0,0x0,0x0}; SetWordType zzerr29[16] = {0x0,0x0,0x0,0x8, 0x0,0x0,0x0,0x0, 0x40,0x48,0x91,0xf, 0x0,0x0,0x0,0x0}; SetWordType setwd5[118] = {0x0,0x8,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0xff,0x8,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xff, 0x0,0x0,0xf7,0x0,0xff,0x0,0x0,0x0, 0x0,0xff,0x0,0xf7,0xf7,0x0,0x0,0x1, 0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0}; SetWordType zzerr30[16] = {0x0,0x0,0x0,0x8, 0x0,0x0,0x0,0x0, 0x40,0x48,0x10,0x6, 0x0,0x0,0x0,0x0}; SetWordType zzerr31[16] = {0x0,0x0,0x0,0x8, 0x0,0x0,0x0,0x0, 0x40,0x48,0x10,0xe, 0x0,0x0,0x0,0x0}; SetWordType zzerr32[16] = {0x0,0x0,0x0,0x8, 0x0,0x0,0x0,0x0, 0x40,0x48,0x10,0x6, 0x0,0x0,0x0,0x0}; SetWordType zzerr33[16] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0xc,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr34[16] = {0x0,0x0,0x0,0x8, 0x0,0x0,0x0,0x0, 0x40,0x48,0x10,0x6, 0x0,0x0,0x0,0x0}; SetWordType zzerr35[16] = {0x0,0x0,0x0,0x8, 0x0,0x0,0x0,0x0, 0x40,0x48,0x10,0xe, 0x0,0x0,0x0,0x0}; SetWordType zzerr36[16] = {0x0,0x0,0x0,0x8, 0x0,0x0,0x0,0x0, 0x40,0x48,0x10,0x6, 0x0,0x0,0x0,0x0}; SetWordType zzerr37[16] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x2,0x8,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr38[16] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x40,0x0,0x0, 0x0,0x0,0x0,0x0}; SetWordType zzerr39[16] = {0x0,0x0,0x0,0x8, 0x0,0x0,0x0,0x0, 0x60,0x48,0x10,0xe, 0x0,0x0,0x0,0x0}; SetWordType setwd6[118] = {0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0xef,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xef, 0x0,0x0,0xef,0x0,0xef,0x0,0x0,0x0, 0x0,0x0,0x0,0xff,0xff,0x1,0x0,0x0, 0x0,0x0,0xef,0xef,0x1,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0}; SetWordType zzerr40[16] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x44,0x0,0x0}; SetWordType zzerr41[16] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x80,0x40,0x0,0x0}; SetWordType zzerr42[16] = {0x2,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x80,0x44,0x0,0x0}; SetWordType zzerr43[16] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x90,0x0,0x0}; SetWordType setwd7[118] = {0x0,0xc0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x1d,0x8,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1d, 0x0,0x0,0x1d,0x8,0x19,0x0,0x0,0x0, 0x0,0x18,0x0,0x1f,0x1f,0x8,0x8,0x8, 0x10,0x18,0x1d,0x18,0x8,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x20, 0x0,0x0,0x0,0x0,0x0,0x0,0x0}; SetWordType zzerr44[16] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x13,0x0}; SetWordType zzerr45[16] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x13,0x0}; SetWordType zzerr46[16] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x13,0x0}; SetWordType zzerr47[16] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x13,0x0}; SetWordType zzerr48[16] = {0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0, 0x0,0x10,0x1e,0x0}; SetWordType setwd8[118] = {0x0,0x20,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20, 0x0,0x0,0x1f,0x0,0x0,0x1f,0x0}; gtkwave-3.3.86/contrib/pccts/sorcerer/stdpccts.h0000664000175000017500000000274113166335473021210 0ustar bybellbybell#ifndef STDPCCTS_H #define STDPCCTS_H /* * stdpccts.h -- P C C T S I n c l u d e * * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001 * Purdue University Electrical Engineering * With AHPCRC, University of Minnesota * ANTLR Version 1.33MR33 */ #ifndef ANTLR_VERSION #define ANTLR_VERSION 13333 #endif #include "pcctscfg.h" #include "pccts_stdio.h" /* 23-Sep-97 thm Accomodate user who needs to redefine ZZLEXBUFSIZE */ #ifndef ZZLEXBUFSIZE #define ZZLEXBUFSIZE 8000 #endif #include "pcctscfg.h" /* MR20 G. Hobbelt __USE_PROTOS #define */ #include "charbuf.h" #include "hash.h" #include "set.h" #include "sor.h" #define AST_FIELDS \ int token; char text[MaxAtom+1], label[MaxRuleName+1]; \ char *action; /* if action node, here is ptr to it */ \ char in,out; \ char init_action; /* set if Action and 1st action of alt */ \ int file; int line; /* set for BLOCK, ALT, nonterm nodes */ \ int upper_range; /* only if T1..T2 found */ \ GLA *start_state; /* ptr into GLA for this block */ \ int no_copy; /* copy input ptr to output ptr? */ \ ListNode *refvars; /* any ref vars defined for this rule */ \ unsigned char is_root; /* this token is a root #( A ... ) */ #define zzcr_ast(node, cur, _tok, _text) \ {(node)->token=_tok; strncpy((node)->text, _text,MaxAtom);} #define USER_ZZSYN #define zzAST_DOUBLE extern int define_num; #define LL_K 2 #define GENAST #define zzSET_SIZE 16 #include "antlr.h" #include "ast.h" #include "tokens.h" #include "dlgdef.h" #include "mode.h" #endif gtkwave-3.3.86/contrib/pccts/sorcerer/SorcererMSVC60.dsw0000664000175000017500000000117113166335473022346 0ustar bybellbybellMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "Sorcerer"=.\SorcererMSVC60.dsp - Package Owner=<4> Package=<5> {{{ begin source code control SorcererMSVC60 .. end source code control }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### gtkwave-3.3.86/contrib/pccts/sorcerer/makefile.VMS0000664000175000017500000000140513166335473021350 0ustar bybellbybell$! File: MAKE.COM - Makefile for SORCERER on OpenVMS, DECC $! $! History: $! --------- $! 27-Jan-1998 J.F. Pieronne Initial Version $! $ set noon !Don't stop on errors. $! $ if P1 .eqs. "LINK" then goto relink $! $ define/nolog pccts_h "[-.h]" $ define/nolog support_set "[-.support.set]" $! $ delete/nolog *.obj;* !Get rid of existing .OBJ files. $! $ options = "/INCLUDE=(pccts_h,support_set)" $ CC 'options' sor $ CC 'options' scan $ CC 'options' err $ CC 'options' main $ CC 'options' globals $ CC 'options' gen $ CC 'options' hash $ CC 'options' look $ CC 'options' cpp $ CC 'options' [-.support.set]set $! $relink: $ LINK/EXE=SOR.EXE sor,scan,err,main,globals, - gen,hash,look,cpp,set, - sys$input:/options ! sys$share:vaxcrtl.exe/share $ EXIT gtkwave-3.3.86/contrib/pccts/sorcerer/testcpp/0000775000175000017500000000000013166335473020666 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/sorcerer/testcpp/Makefile.in0000664000175000017500000003450513166335473022742 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ #PCCTS=../.. #BIN=$(PCCTS)/bin #PCCTS_H=$(PCCTS)/h #SOR = $(BIN)/sor #CFLAGS = -I. -I.. -I../h -I../lib -I$(PCCTS_H) -g #DFLAGS = -C2 -i #SRC = test.cpp ExprTreeParser.cpp ../lib/STreeParser.cpp \ # $(PCCTS_H)/PCCTSAST.cpp #OBJ = test.o ExprTreeParser.o STreeParser.o PCCTSAST.o #SRC2 = test2.cpp Cool.cpp ../lib/STreeParser.cpp $(PCCTS_H)/PCCTSAST.cpp #OBJ2 = test2.o Cool.o STreeParser.o PCCTSAST.o #SRC3 = test3.cpp Cool.cpp ../lib/STreeParser.cpp $(PCCTS_H)/PCCTSAST.cpp #OBJ3 = test3.o Cool.o STreeParser.o PCCTSAST.o #SRC4 = test4.cpp #OBJ4 = test4.o #SRC5 = test5.cpp Cool.cpp ../lib/STreeParser.cpp $(PCCTS_H)/PCCTSAST.cpp #OBJ5 = test5.o Cool.o STreeParser.o PCCTSAST.o #CCC=CC #CCC=g++ #SPAWN = test.cpp test2.cpp ExprTreeParser.h ExprTreeParser.cpp Cool.h Cool.cpp \ # test3.cpp test5.cpp #test: $(OBJ) $(SRC) # $(CCC) -o t $(CFLAGS) $(OBJ) #test.o : test.cpp # $(CCC) -c $(CFLAGS) test.cpp #ExprTreeParser.o : ExprTreeParser.cpp # $(CCC) -c $(CFLAGS) ExprTreeParser.cpp #STreeParser.o : ../lib/STreeParser.cpp # $(CCC) -o STreeParser.o -c $(CFLAGS) ../lib/STreeParser.cpp #PCCTSAST.o : $(PCCTS_H)/PCCTSAST.cpp # $(CCC) -o PCCTSAST.o -c $(CFLAGS) $(PCCTS_H)/PCCTSAST.cpp #test.cpp ExprTreeParser.cpp ExprTreeParser.h : test.sor # $(SOR) -CPP -def-tokens test.sor #test2: $(OBJ2) $(SRC2) # $(CCC) -o t2 $(CFLAGS) $(OBJ2) #test2.cpp : test2.sor # $(SOR) -CPP -transform -def-tokens test2.sor #test2.o : test2.cpp # $(CCC) -c $(CFLAGS) test2.cpp #test3: $(OBJ3) $(SRC3) # $(CCC) -o t3 $(CFLAGS) $(OBJ3) #test3.cpp : test3.sor # $(SOR) -CPP -transform test3.sor #test3.o : test3.cpp # $(CCC) -c $(CFLAGS) test3.cpp #test5: $(OBJ5) $(SRC5) # $(CCC) -o t5 $(CFLAGS) $(OBJ5) #test5.cpp : test5.sor # $(SOR) -CPP -transform test5.sor #test5.o : test5.cpp # $(CCC) -c $(CFLAGS) test5.cpp #Cool.o : Cool.cpp # $(CCC) -c $(CFLAGS) Cool.cpp VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = contrib/pccts/sorcerer/testcpp DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/pccts/sorcerer/testcpp/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/pccts/sorcerer/testcpp/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am #scrub: # (cd ./test4; make scrub) # rm -rf *.o core $(SPAWN) t t2 t3 t5 # # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/contrib/pccts/sorcerer/testcpp/Makefile.am0000664000175000017500000000366413166335473022733 0ustar bybellbybell## -*- makefile -*- ## ## FIXME #PCCTS=../.. #BIN=$(PCCTS)/bin #PCCTS_H=$(PCCTS)/h #SOR = $(BIN)/sor #CFLAGS = -I. -I.. -I../h -I../lib -I$(PCCTS_H) -g #DFLAGS = -C2 -i #SRC = test.cpp ExprTreeParser.cpp ../lib/STreeParser.cpp \ # $(PCCTS_H)/PCCTSAST.cpp #OBJ = test.o ExprTreeParser.o STreeParser.o PCCTSAST.o #SRC2 = test2.cpp Cool.cpp ../lib/STreeParser.cpp $(PCCTS_H)/PCCTSAST.cpp #OBJ2 = test2.o Cool.o STreeParser.o PCCTSAST.o #SRC3 = test3.cpp Cool.cpp ../lib/STreeParser.cpp $(PCCTS_H)/PCCTSAST.cpp #OBJ3 = test3.o Cool.o STreeParser.o PCCTSAST.o #SRC4 = test4.cpp #OBJ4 = test4.o #SRC5 = test5.cpp Cool.cpp ../lib/STreeParser.cpp $(PCCTS_H)/PCCTSAST.cpp #OBJ5 = test5.o Cool.o STreeParser.o PCCTSAST.o #CCC=CC #CCC=g++ #SPAWN = test.cpp test2.cpp ExprTreeParser.h ExprTreeParser.cpp Cool.h Cool.cpp \ # test3.cpp test5.cpp #test: $(OBJ) $(SRC) # $(CCC) -o t $(CFLAGS) $(OBJ) #test.o : test.cpp # $(CCC) -c $(CFLAGS) test.cpp #ExprTreeParser.o : ExprTreeParser.cpp # $(CCC) -c $(CFLAGS) ExprTreeParser.cpp #STreeParser.o : ../lib/STreeParser.cpp # $(CCC) -o STreeParser.o -c $(CFLAGS) ../lib/STreeParser.cpp #PCCTSAST.o : $(PCCTS_H)/PCCTSAST.cpp # $(CCC) -o PCCTSAST.o -c $(CFLAGS) $(PCCTS_H)/PCCTSAST.cpp #test.cpp ExprTreeParser.cpp ExprTreeParser.h : test.sor # $(SOR) -CPP -def-tokens test.sor #test2: $(OBJ2) $(SRC2) # $(CCC) -o t2 $(CFLAGS) $(OBJ2) #test2.cpp : test2.sor # $(SOR) -CPP -transform -def-tokens test2.sor #test2.o : test2.cpp # $(CCC) -c $(CFLAGS) test2.cpp #test3: $(OBJ3) $(SRC3) # $(CCC) -o t3 $(CFLAGS) $(OBJ3) #test3.cpp : test3.sor # $(SOR) -CPP -transform test3.sor #test3.o : test3.cpp # $(CCC) -c $(CFLAGS) test3.cpp #test5: $(OBJ5) $(SRC5) # $(CCC) -o t5 $(CFLAGS) $(OBJ5) #test5.cpp : test5.sor # $(SOR) -CPP -transform test5.sor #test5.o : test5.cpp # $(CCC) -c $(CFLAGS) test5.cpp #Cool.o : Cool.cpp # $(CCC) -c $(CFLAGS) Cool.cpp #scrub: # (cd ./test4; make scrub) # rm -rf *.o core $(SPAWN) t t2 t3 t5 # gtkwave-3.3.86/contrib/pccts/sorcerer/h/0000775000175000017500000000000013166335473017433 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/sorcerer/h/Makefile.in0000664000175000017500000003101313166335473021476 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = contrib/pccts/sorcerer/h DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = SASTBase.h SCommonAST.h STreeParser.h astlib.h \ sintstack.h sorcerer.h sorlist.h sstack.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/pccts/sorcerer/h/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/pccts/sorcerer/h/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/contrib/pccts/sorcerer/h/astlib.h0000664000175000017500000000476413166335473021075 0ustar bybellbybell#ifndef astlib_h #define astlib_h /* * astlib.h -- C ast_* library header * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public * domain. An individual or company may do whatever they wish with * source code distributed with SORCERER or the code generated by * SORCERER, including the incorporation of SORCERER, or its output, into * commerical software. * * We encourage users to develop software with SORCERER. However, we do * ask that credit is given to us for developing SORCERER. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like SORCERER and have developed a nice tool with the * output, please mention that you developed it using SORCERER. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * SORCERER 1.00B * Terence Parr * AHPCRC, University of Minnesota * 1992-1994 */ #include #include "sorcerer.h" #include "sorlist.h" #define MaxTreeStackDepth 400 /* MR26 */ #ifdef PCCTS_USE_STDARG extern SORAST *ast_make(SORAST *rt, ...); extern int ast_scan(char *_template /* MR32 */, SORAST *tree, ...); #else extern SORAST *ast_make(); extern int ast_scan(); #endif #ifdef __USE_PROTOS extern SORAST *ast_find_all(SORAST *t, SORAST *u, SORAST **cursor); extern int ast_match(SORAST *t, SORAST *u); extern void ast_insert_after(SORAST *a, SORAST *b); extern void ast_append(SORAST *a, SORAST *b); extern SORAST *ast_tail(SORAST *a); extern SORAST *ast_bottom(SORAST *a); extern SORAST *ast_cut_between(SORAST *a, SORAST *b); extern SList *ast_to_slist(SORAST *t); extern SORAST *slist_to_ast(SList *list); extern void ast_free(SORAST *t); extern int ast_nsiblings(SORAST *t); extern SORAST *ast_sibling_index(SORAST *t, int i); extern int ast_match_partial(SORAST *t, SORAST *u); #else extern SORAST *ast_find_all(); extern int ast_match(); extern void ast_insert_after(); extern void ast_append(); extern SORAST *ast_tail(); extern SORAST *ast_bottom(); extern SORAST *ast_cut_between(); extern SList *ast_to_slist(); extern SORAST *slist_to_ast(); extern void ast_free(); extern int ast_nsiblings(); extern SORAST *ast_sibling_index(); extern int ast_match_partial(); #endif #endif gtkwave-3.3.86/contrib/pccts/sorcerer/h/STreeParser.h0000664000175000017500000000730613166335473022011 0ustar bybellbybell#ifndef STreeParser_h #define STreeParser_h /* * STreeParser.h * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public * domain. An individual or company may do whatever they wish with * source code distributed with SORCERER or the code generated by * SORCERER, including the incorporation of SORCERER, or its output, into * commerical software. * * We encourage users to develop software with SORCERER. However, we do * ask that credit is given to us for developing SORCERER. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like SORCERER and have developed a nice tool with the * output, please mention that you developed it using SORCERER. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * SORCERER 1.00B * Parr Research Corporation * with Purdue University and AHPCRC, University of Minnesota * 1992-1994 */ /* The programmer should derive a class from SORASTBase; SORASTBase defines * the minimum public interface that a tree node must follow for SORCERER to * be able to walk the trees. */ /* The @-vars are added by the subclass created by SORCERER; the constructor * is used to init the @-vars. */ #include #include #include #include "SASTBase.h" #define _DOWN _t=(SORASTBase *)_t->down() #define _RIGHT _t=(SORASTBase *)_t->right() #define _SAVE SORASTBase *_save=_t #define _RESTORE _t = _save #define _GUESS_BLOCK STreeParser _st; int _gv; SORASTBase *_savet=NULL; #define _GUESS {save_state(&_st); \ _savet = _t; \ guessing = 1; \ _gv = setjmp(startofguess.state);} #define _GUESS_FAIL longjmp(startofguess.state, 1) #define _GUESS_DONE {restore_state(&_st); _t = _savet;} #define _MATCH(tok) MATCH(_t,tok) #define _MATCHRANGE(t1,t2) MATCHRANGE(_t,t1,t2) #define _WILDCARD WILDCARD(_t) #define ast_return(t) *_result = (SORASTBase *)t; #define STreeTry(r,p,t) \ (p)->try_result = NULL; \ (p)->sjrv = setjmp((p)->startofguess); \ if ( !(p)->sjrv ) { \ rule(p,t,&try_result); \ (p)->try_ok = 1; \ } \ else { \ (p)->try_ok = 0; \ } \ if ( (p)->try_ok ) /* Used only during TRANSFORM mode */ #define TREE_CONSTR_PTRS SORASTBase *_r=NULL,*_s=NULL,*_e=NULL typedef struct _Sjmp_buf { jmp_buf state; } Sjmp_buf; class STreeParser { protected: int try_ok, sjrv; /* used by STreeTry macro */ SORASTBase *try_result; /* tree coming back from try */ int guessing; Sjmp_buf startofguess; // SORASTBase *t; void _mkroot(SORASTBase **, SORASTBase **, SORASTBase **, SORASTBase *); void _mkchild(SORASTBase **, SORASTBase **, SORASTBase **, SORASTBase *); virtual void mismatched_range(int looking_for, int upper_token, SORASTBase *found); virtual void missing_wildcard(); virtual void mismatched_token(int looking_for, SORASTBase *found); virtual void no_viable_alt(char *rulename, SORASTBase *root); virtual void MATCH(SORASTBase *_t, int tok); virtual void MATCHRANGE(SORASTBase *_t, int tok, int tok2); virtual void WILDCARD(SORASTBase *_t); public: STreeParser() { guessing = 0; } virtual void panic(char *err); void save_state(STreeParser *); void restore_state(STreeParser *); virtual int printMessage(FILE* pFile, const char* pFormat, ...); // MR23 }; #endif gtkwave-3.3.86/contrib/pccts/sorcerer/h/sorlist.h0000664000175000017500000000315513166335473021307 0ustar bybellbybell#ifndef SLIST_H #define SLIST_H /* * SList.h * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public * domain. An individual or company may do whatever they wish with * source code distributed with SORCERER or the code generated by * SORCERER, including the incorporation of SORCERER, or its output, into * commerical software. * * We encourage users to develop software with SORCERER. However, we do * ask that credit is given to us for developing SORCERER. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like SORCERER and have developed a nice tool with the * output, please mention that you developed it using SORCERER. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * SORCERER 1.00B * Terence Parr * AHPCRC, University of Minnesota * 1992-1994 */ #include "sorcerer.h" typedef struct _SList { void *elem; /* pointer to any kind of element */ struct _SList *next; } SList; #define newSList (SList *) calloc(1, sizeof(SList)); #ifdef __USE_PROTOS extern void *slist_iterate(SList *list, SList **); extern void slist_add( SList **list, void *e ); extern void slist_free(SList *list); #else extern void *slist_iterate(); extern void slist_add(); extern void slist_free(); #endif #endif gtkwave-3.3.86/contrib/pccts/sorcerer/h/Makefile.am0000664000175000017500000000020113166335473021460 0ustar bybellbybell## -*- makefile -*- ## EXTRA_DIST= SASTBase.h SCommonAST.h STreeParser.h astlib.h \ sintstack.h sorcerer.h sorlist.h sstack.h gtkwave-3.3.86/contrib/pccts/sorcerer/h/SCommonAST.h0000664000175000017500000000126513166335473021533 0ustar bybellbybell#ifndef SCommonAST_h #define SCommonAST_h #include #include "PCCTSAST.h" #include "SASTBase.h" /* If you use SORCERER alone, you can subclass this to get a nice tree def */ class SORCommonAST : public SORASTBase { protected: SORCommonAST *_right, *_down; int _type; public: SORCommonAST() { _right = _down = NULL; } PCCTS_AST *right() { return _right; } // define the SORCERER interface PCCTS_AST *down() { return _down; } int type() { return _type; } void setRight(PCCTS_AST *t) { _right = (SORCommonAST *)t; } void setDown(PCCTS_AST *t) { _down = (SORCommonAST *)t; } void setType(int t) { _type = t; } virtual PCCTS_AST *shallowCopy() {return NULL;} }; #endif gtkwave-3.3.86/contrib/pccts/sorcerer/h/sintstack.h0000664000175000017500000000356113166335473021614 0ustar bybellbybell#ifndef SINTSTACK_H #define SINTSTACK_H /* * SIntStack.h * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public * domain. An individual or company may do whatever they wish with * source code distributed with SORCERER or the code generated by * SORCERER, including the incorporation of SORCERER, or its output, into * commerical software. * * We encourage users to develop software with SORCERER. However, we do * ask that credit is given to us for developing SORCERER. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like SORCERER and have developed a nice tool with the * output, please mention that you developed it using SORCERER. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * SORCERER 1.00B * Terence Parr * AHPCRC, University of Minnesota * 1992-1994 */ #include "sorcerer.h" typedef struct _istack { int *data; int sp; int size; } SIntStack; #ifdef __USE_PROTOS extern SIntStack *sint_newstack(int size); extern void sint_freestack(SIntStack *st); extern void sint_push(SIntStack *st, int i); extern int sint_pop(SIntStack *st); extern int sint_stacksize(SIntStack *st); extern void sint_stackreset(SIntStack *st); extern int sint_stackempty(SIntStack *st); extern int sint_top(SIntStack *st); #else extern SIntStack *sint_newstack(); extern void sint_freestack(); extern void sint_push(); extern int sint_pop(); extern int sint_stacksize(); extern void sint_stackreset(); extern int sint_stackempty(); extern int sint_top(); #endif #endif gtkwave-3.3.86/contrib/pccts/sorcerer/h/sorcerer.h0000664000175000017500000001252313166335473021433 0ustar bybellbybell#ifndef sorcerer_h #define sorcerer_h /* * sorcerer.h -- header for all sorcerer files * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public * domain. An individual or company may do whatever they wish with * source code distributed with SORCERER or the code generated by * SORCERER, including the incorporation of SORCERER, or its output, into * commerical software. * * We encourage users to develop software with SORCERER. However, we do * ask that credit is given to us for developing SORCERER. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like SORCERER and have developed a nice tool with the * output, please mention that you developed it using SORCERER. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * SORCERER 1.00B * Terence Parr * AHPCRC, University of Minnesota * 1992-1994 */ #include "pcctscfg.h" #ifdef __USE_PROTOS #include #else #include #endif #include /* SUPERCLASS SORAST (your tree must look at minimum like this) typedef struct _node { struct _node *right, *down; int token; -- user-defined stuff goes here } SORAST; */ /* Can be used sort of like inheritance to get the desired struct def */ #define AST_REQD_FIELDS \ struct _node *right, *down; \ int token; /* C MATCH */ /* MR21 Short circuit on null pointer */ #define _MATCH(tok) if (! _t || _t->token!=tok ) if ( _parser->guessing ) _GUESS_FAIL; else mismatched_token(_parser, tok, _t) #define _MATCHRANGE(tok,tok2) \ if (! _t || _t->tokentoken>tok2 ) if ( _parser->guessing ) _GUESS_FAIL; else mismatched_range(_parser, tok, tok2, _t) /* C++ MATCH */ #define _CPPMATCH(tok) if ( _t->token()!=tok ) if ( _parser->guessing ) _GUESS_FAIL; else mismatched_token(_parser, tok, _t) #define _CPPMATCHRANGE(tok,tok2) \ if ( _t->token()token()>tok2 ) if ( _parser->guessing ) _GUESS_FAIL; else mismatched_range(_parser, tok, tok2, _t) /* Normal DOWN and RIGHT */ #define _DOWN _t=_t->down #define _RIGHT _t=_t->right /* C++ DOWN and RIGHT */ #define _CPPDOWN _t=(SORAST *) _t->down() #define _CPPRIGHT _t=(SORAST *) _t->right() #define _SAVE SORAST *_save=_t #define _RESTORE _t = _save #define _SETLABEL(u) u=_t #define _WILDCARD if ( _t==NULL ) if ( _parser->guessing ) _GUESS_FAIL; else missing_wildcard(_parser) #define _GUESS_BLOCK STreeParser _st; int _gv; SORAST *_savet=NULL; #define _GUESS {_st = *_parser; \ _savet = _t; \ _parser->guessing = 1; \ _gv = setjmp(_parser->startofguess.state);} #define _GUESS_FAIL longjmp(_parser->startofguess.state, 1) #define _GUESS_DONE {*_parser = _st; _t = _savet;} /* These are used mainly by the C output */ #ifndef ast_down #define ast_down down #endif #ifndef ast_right #define ast_right right #endif #define STreeTry(r,p,t) \ (p)->try_result = NULL; \ (p)->sjrv = setjmp((p)->startofguess); \ if ( !(p)->sjrv ) { \ rule(p,t,&try_result); \ (p)->try_ok = 1; \ } \ else { \ (p)->try_ok = 0; \ } \ if ( (p)->try_ok ) /* Used only during TRANSFORM mode */ #define TREE_CONSTR_PTRS SORAST *_r=NULL,*_s=NULL,*_e=NULL typedef struct _Sjmp_buf { jmp_buf state; } Sjmp_buf; #ifndef _PARSER_VARS #define _PARSER_VARS #endif #ifndef _REFVARS #define _REFVARS #endif typedef struct _STreeParser { int try_ok, sjrv; /* used by STreeTry macro */ SORAST *try_result; /* tree coming back from try */ int guessing; Sjmp_buf startofguess; SORAST *t; _REFVARS _PARSER_VARS } STreeParser; #define STreeParserInit(_p) { (_p)->guessing = 0; _refvar_inits(_p); } /* S a n i t y C h e c k i n g */ #ifndef require #define require(expr, err) {if ( !(expr) ) sorcerer_panic(err);} #endif /* T r a n s f o r m M a c r o s */ #define ast_return(_t) *_result = _t #ifdef __USE_PROTOS extern void mismatched_range(STreeParser *_parser, int looking_for, int upper_token, SORAST *found); extern void missing_wildcard(STreeParser *_parser); extern void mismatched_token(STreeParser *_parser, int looking_for, SORAST *found); extern void no_viable_alt(STreeParser *_parser, char *rulename, SORAST *root); extern void sorcerer_panic(char *err); extern void _refvar_inits(STreeParser *); /* MR15 Kevin J. Cummings */ extern void _mkroot(SORAST **, SORAST **, SORAST **, SORAST *); extern void _mkchild(SORAST **, SORAST **, SORAST **, SORAST *); extern SORAST *ast_alloc(void); extern SORAST *ast_dup(SORAST *t); extern SORAST *ast_dup_node(SORAST *t); #else extern void mismatched_range(); extern void missing_wildcard(); extern void mismatched_token(); extern void no_viable_alt(); extern void sorcerer_panic(); extern void _refvar_inits(); /* MR15 Kevin J. Cummings */ extern void _mkroot(); extern void _mkchild(); extern SORAST *ast_alloc(); extern SORAST *ast_dup(); extern SORAST *ast_dup_node(); #endif #endif gtkwave-3.3.86/contrib/pccts/sorcerer/h/SASTBase.h0000664000175000017500000000014413166335473021150 0ustar bybellbybell#ifndef SASTBase_h #define SASTBase_h #include "PCCTSAST.h" typedef PCCTS_AST SORASTBase; #endif gtkwave-3.3.86/contrib/pccts/sorcerer/h/sstack.h0000664000175000017500000000271413166335473021100 0ustar bybellbybell#ifndef SSTACK_H #define SSTACK_H /* * SStack.h * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public * domain. An individual or company may do whatever they wish with * source code distributed with SORCERER or the code generated by * SORCERER, including the incorporation of SORCERER, or its output, into * commerical software. * * We encourage users to develop software with SORCERER. However, we do * ask that credit is given to us for developing SORCERER. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like SORCERER and have developed a nice tool with the * output, please mention that you developed it using SORCERER. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * SORCERER 1.00B * Terence Parr * AHPCRC, University of Minnesota * 1992-1994 */ #include "sorlist.h" typedef SList SStack; #define newSStack (SStack *) calloc(1, sizeof(SStack)); #ifdef __USE_PROTOS extern void sstack_push( SStack **st, void *e ); extern void *sstack_pop( SStack **st ); #else extern void sstack_push(); extern void *sstack_pop(); #endif #endif gtkwave-3.3.86/contrib/pccts/sorcerer/SorcererMSVC50.mak0000664000175000017500000003640213166335473022325 0ustar bybellbybell# Microsoft Developer Studio Generated NMAKE File, Based on SorcererMSVC50.dsp !IF "$(CFG)" == "" CFG=Sorcerer - Win32 Debug !MESSAGE No configuration specified. Defaulting to Sorcerer - Win32 Debug. !ENDIF !IF "$(CFG)" != "Sorcerer - Win32 Release" && "$(CFG)" !=\ "Sorcerer - Win32 Debug" !MESSAGE Invalid configuration "$(CFG)" specified. !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "SorcererMSVC50.mak" CFG="Sorcerer - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "Sorcerer - Win32 Release" (based on\ "Win32 (x86) Console Application") !MESSAGE "Sorcerer - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE !ERROR An invalid configuration is specified. !ENDIF !IF "$(OS)" == "Windows_NT" NULL= !ELSE NULL=nul !ENDIF !IF "$(CFG)" == "Sorcerer - Win32 Release" OUTDIR=.\. INTDIR=.\. # Begin Custom Macros OutDir=.\. # End Custom Macros !IF "$(RECURSE)" == "0" ALL : "stdpccts.h" "sor.c" "scan.c" "parser.dlg" "mode.h" "err.c"\ "$(OUTDIR)\Sorcerer.exe" !ELSE ALL : "DLG - Win32 Release" "ANTLR - Win32 Release" "stdpccts.h" "sor.c"\ "scan.c" "parser.dlg" "mode.h" "err.c" "$(OUTDIR)\Sorcerer.exe" !ENDIF !IF "$(RECURSE)" == "1" CLEAN :"ANTLR - Win32 ReleaseCLEAN" "DLG - Win32 ReleaseCLEAN" !ELSE CLEAN : !ENDIF -@erase "$(INTDIR)\cpp.obj" -@erase "$(INTDIR)\err.obj" -@erase "$(INTDIR)\gen.obj" -@erase "$(INTDIR)\globals.obj" -@erase "$(INTDIR)\hash.obj" -@erase "$(INTDIR)\look.obj" -@erase "$(INTDIR)\main.obj" -@erase "$(INTDIR)\scan.obj" -@erase "$(INTDIR)\set.obj" -@erase "$(INTDIR)\sor.obj" -@erase "$(INTDIR)\vc50.idb" -@erase "$(OUTDIR)\Sorcerer.exe" -@erase "err.c" -@erase "mode.h" -@erase "parser.dlg" -@erase "scan.c" -@erase "sor.c" -@erase "stdpccts.h" "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP=cl.exe CPP_PROJ=/nologo /ML /W3 /GX /O2 /I "." /I "..\h" /I "..\support\set" /D\ "NDEBUG" /D "LONGFILENAMES" /D "PC" /D ZZLEXBUFSIZE=65536 /D "_DEBUG" /D\ "WIN32" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\SorcererMSVC50.pch" /YX\ /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c CPP_OBJS=./ CPP_SBRS=. .c{$(CPP_OBJS)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(CPP_OBJS)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(CPP_OBJS)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .c{$(CPP_SBRS)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(CPP_SBRS)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(CPP_SBRS)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << RSC=rc.exe BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\SorcererMSVC50.bsc" BSC32_SBRS= \ LINK32=link.exe LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\ odbccp32.lib /nologo /subsystem:console /incremental:no\ /pdb:"$(OUTDIR)\Sorcerer.pdb" /machine:I386 /out:"$(OUTDIR)\Sorcerer.exe" LINK32_OBJS= \ "$(INTDIR)\cpp.obj" \ "$(INTDIR)\err.obj" \ "$(INTDIR)\gen.obj" \ "$(INTDIR)\globals.obj" \ "$(INTDIR)\hash.obj" \ "$(INTDIR)\look.obj" \ "$(INTDIR)\main.obj" \ "$(INTDIR)\scan.obj" \ "$(INTDIR)\set.obj" \ "$(INTDIR)\sor.obj" "$(OUTDIR)\Sorcerer.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << SOURCE=$(InputPath) PostBuild_Desc=Update executables in BIN directory and remove intermediate\ files DS_POSTBUILD_DEP=$(INTDIR)\postbld.dep ALL : $(DS_POSTBUILD_DEP) # Begin Custom Macros OutDir=.\. # End Custom Macros $(DS_POSTBUILD_DEP) : "DLG - Win32 Release" "ANTLR - Win32 Release"\ "stdpccts.h" "sor.c" "scan.c" "parser.dlg" "mode.h" "err.c"\ "$(OUTDIR)\Sorcerer.exe" del ..\bin\Win32\Antlr.old rename ..\bin\Win32\Antlr.exe Antlr.old copy ..\Antlr\Antlr.exe ..\bin\Win32 del ..\bin\Win32\Dlg.old rename ..\bin\Win32\Dlg.exe Dlg.old copy ..\Dlg\dlg.exe ..\bin\Win32 del ..\bin\Win32\Sorcerer.old rename ..\bin\Win32\Sorcerer.exe Sorcerer.old copy ..\Sorcerer\Sorcerer.exe ..\bin\Win32 echo Helper for Post-build step > "$(DS_POSTBUILD_DEP)" !ELSEIF "$(CFG)" == "Sorcerer - Win32 Debug" OUTDIR=.\. INTDIR=.\. # Begin Custom Macros OutDir=.\. # End Custom Macros !IF "$(RECURSE)" == "0" ALL : "stdpccts.h" "sor.c" "scan.c" "parser.dlg" "mode.h" "err.c"\ "$(OUTDIR)\Sorcerer.exe" "$(OUTDIR)\SorcererMSVC50.bsc" !ELSE ALL : "DLG - Win32 Debug" "ANTLR - Win32 Debug" "stdpccts.h" "sor.c" "scan.c"\ "parser.dlg" "mode.h" "err.c" "$(OUTDIR)\Sorcerer.exe"\ "$(OUTDIR)\SorcererMSVC50.bsc" !ENDIF !IF "$(RECURSE)" == "1" CLEAN :"ANTLR - Win32 DebugCLEAN" "DLG - Win32 DebugCLEAN" !ELSE CLEAN : !ENDIF -@erase "$(INTDIR)\cpp.obj" -@erase "$(INTDIR)\cpp.sbr" -@erase "$(INTDIR)\err.obj" -@erase "$(INTDIR)\err.sbr" -@erase "$(INTDIR)\gen.obj" -@erase "$(INTDIR)\gen.sbr" -@erase "$(INTDIR)\globals.obj" -@erase "$(INTDIR)\globals.sbr" -@erase "$(INTDIR)\hash.obj" -@erase "$(INTDIR)\hash.sbr" -@erase "$(INTDIR)\look.obj" -@erase "$(INTDIR)\look.sbr" -@erase "$(INTDIR)\main.obj" -@erase "$(INTDIR)\main.sbr" -@erase "$(INTDIR)\scan.obj" -@erase "$(INTDIR)\scan.sbr" -@erase "$(INTDIR)\set.obj" -@erase "$(INTDIR)\set.sbr" -@erase "$(INTDIR)\sor.obj" -@erase "$(INTDIR)\sor.sbr" -@erase "$(INTDIR)\vc50.idb" -@erase "$(INTDIR)\vc50.pdb" -@erase "$(OUTDIR)\Sorcerer.exe" -@erase "$(OUTDIR)\Sorcerer.ilk" -@erase "$(OUTDIR)\Sorcerer.pdb" -@erase "$(OUTDIR)\SorcererMSVC50.bsc" -@erase "err.c" -@erase "mode.h" -@erase "parser.dlg" -@erase "scan.c" -@erase "sor.c" -@erase "stdpccts.h" "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP=cl.exe CPP_PROJ=/nologo /MLd /W3 /Gm /GX /Zi /Od /I "." /I "..\h" /I "..\support\set"\ /D "LONGFILENAMES" /D "PC" /D ZZLEXBUFSIZE=65536 /D "_DEBUG" /D "WIN32" /D\ "_CONSOLE" /D "_MBCS" /FR"$(INTDIR)\\" /Fp"$(INTDIR)\SorcererMSVC50.pch" /YX\ /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c CPP_OBJS=./ CPP_SBRS=./ .c{$(CPP_OBJS)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(CPP_OBJS)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(CPP_OBJS)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .c{$(CPP_SBRS)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(CPP_SBRS)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(CPP_SBRS)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << RSC=rc.exe BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\SorcererMSVC50.bsc" BSC32_SBRS= \ "$(INTDIR)\cpp.sbr" \ "$(INTDIR)\err.sbr" \ "$(INTDIR)\gen.sbr" \ "$(INTDIR)\globals.sbr" \ "$(INTDIR)\hash.sbr" \ "$(INTDIR)\look.sbr" \ "$(INTDIR)\main.sbr" \ "$(INTDIR)\scan.sbr" \ "$(INTDIR)\set.sbr" \ "$(INTDIR)\sor.sbr" "$(OUTDIR)\SorcererMSVC50.bsc" : "$(OUTDIR)" $(BSC32_SBRS) $(BSC32) @<< $(BSC32_FLAGS) $(BSC32_SBRS) << LINK32=link.exe LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\ odbccp32.lib /nologo /subsystem:console /incremental:yes\ /pdb:"$(OUTDIR)\Sorcerer.pdb" /debug /machine:I386\ /out:"$(OUTDIR)\Sorcerer.exe" /pdbtype:sept LINK32_OBJS= \ "$(INTDIR)\cpp.obj" \ "$(INTDIR)\err.obj" \ "$(INTDIR)\gen.obj" \ "$(INTDIR)\globals.obj" \ "$(INTDIR)\hash.obj" \ "$(INTDIR)\look.obj" \ "$(INTDIR)\main.obj" \ "$(INTDIR)\scan.obj" \ "$(INTDIR)\set.obj" \ "$(INTDIR)\sor.obj" "$(OUTDIR)\Sorcerer.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << SOURCE=$(InputPath) PostBuild_Desc=Update executables in BIN directory and remove intermediate\ files DS_POSTBUILD_DEP=$(INTDIR)\postbld.dep ALL : $(DS_POSTBUILD_DEP) # Begin Custom Macros OutDir=.\. # End Custom Macros $(DS_POSTBUILD_DEP) : "DLG - Win32 Debug" "ANTLR - Win32 Debug" "stdpccts.h"\ "sor.c" "scan.c" "parser.dlg" "mode.h" "err.c" "$(OUTDIR)\Sorcerer.exe"\ "$(OUTDIR)\SorcererMSVC50.bsc" del ..\bin\Win32\Antlr.old rename ..\bin\Win32\Antlr.exe Antlr.old copy ..\Antlr\Antlr.exe ..\bin\Win32 del ..\bin\Win32\Dlg.old rename ..\bin\Win32\Dlg.exe Dlg.old copy ..\Dlg\dlg.exe ..\bin\Win32 del ..\bin\Win32\Sorcerer.old rename ..\bin\Win32\Sorcerer.exe Sorcerer.old copy ..\Sorcerer\Sorcerer.exe ..\bin\Win32 echo Helper for Post-build step > "$(DS_POSTBUILD_DEP)" !ENDIF !IF "$(CFG)" == "Sorcerer - Win32 Release" || "$(CFG)" ==\ "Sorcerer - Win32 Debug" !IF "$(CFG)" == "Sorcerer - Win32 Release" "ANTLR - Win32 Release" : cd "\SDK\pccts\antlr" $(MAKE) /$(MAKEFLAGS) /F .\AntlrMSVC50.mak CFG="ANTLR - Win32 Release" cd "..\sorcerer" "ANTLR - Win32 ReleaseCLEAN" : cd "\SDK\pccts\antlr" $(MAKE) /$(MAKEFLAGS) CLEAN /F .\AntlrMSVC50.mak CFG="ANTLR - Win32 Release"\ RECURSE=1 cd "..\sorcerer" !ELSEIF "$(CFG)" == "Sorcerer - Win32 Debug" "ANTLR - Win32 Debug" : cd "\SDK\pccts\antlr" $(MAKE) /$(MAKEFLAGS) /F .\AntlrMSVC50.mak CFG="ANTLR - Win32 Debug" cd "..\sorcerer" "ANTLR - Win32 DebugCLEAN" : cd "\SDK\pccts\antlr" $(MAKE) /$(MAKEFLAGS) CLEAN /F .\AntlrMSVC50.mak CFG="ANTLR - Win32 Debug"\ RECURSE=1 cd "..\sorcerer" !ENDIF !IF "$(CFG)" == "Sorcerer - Win32 Release" "DLG - Win32 Release" : cd "\SDK\pccts\dlg" $(MAKE) /$(MAKEFLAGS) /F .\DlgMSVC50.mak CFG="DLG - Win32 Release" cd "..\sorcerer" "DLG - Win32 ReleaseCLEAN" : cd "\SDK\pccts\dlg" $(MAKE) /$(MAKEFLAGS) CLEAN /F .\DlgMSVC50.mak CFG="DLG - Win32 Release"\ RECURSE=1 cd "..\sorcerer" !ELSEIF "$(CFG)" == "Sorcerer - Win32 Debug" "DLG - Win32 Debug" : cd "\SDK\pccts\dlg" $(MAKE) /$(MAKEFLAGS) /F .\DlgMSVC50.mak CFG="DLG - Win32 Debug" cd "..\sorcerer" "DLG - Win32 DebugCLEAN" : cd "\SDK\pccts\dlg" $(MAKE) /$(MAKEFLAGS) CLEAN /F .\DlgMSVC50.mak CFG="DLG - Win32 Debug"\ RECURSE=1 cd "..\sorcerer" !ENDIF SOURCE=.\cpp.c DEP_CPP_CPP_C=\ "..\h\antlr.h"\ "..\h\ast.h"\ "..\h\charbuf.h"\ "..\h\pcctscfg.h"\ "..\h\dlgdef.h"\ "..\support\set\set.h"\ ".\hash.h"\ ".\mode.h"\ ".\proto.h"\ ".\sor.h"\ ".\stdpccts.h"\ ".\sym.h"\ ".\tokens.h"\ !IF "$(CFG)" == "Sorcerer - Win32 Release" "$(INTDIR)\cpp.obj" : $(SOURCE) $(DEP_CPP_CPP_C) "$(INTDIR)"\ "$(INTDIR)\stdpccts.h" "$(INTDIR)\mode.h" !ELSEIF "$(CFG)" == "Sorcerer - Win32 Debug" "$(INTDIR)\cpp.obj" "$(INTDIR)\cpp.sbr" : $(SOURCE) $(DEP_CPP_CPP_C)\ "$(INTDIR)" "$(INTDIR)\stdpccts.h" "$(INTDIR)\mode.h" !ENDIF SOURCE=.\err.c DEP_CPP_ERR_C=\ "..\h\antlr.h"\ "..\h\ast.h"\ "..\h\charbuf.h"\ "..\h\pcctscfg.h"\ "..\h\dlgdef.h"\ "..\h\err.h"\ "..\support\set\set.h"\ ".\hash.h"\ ".\sor.h"\ ".\tokens.h"\ !IF "$(CFG)" == "Sorcerer - Win32 Release" "$(INTDIR)\err.obj" : $(SOURCE) $(DEP_CPP_ERR_C) "$(INTDIR)" !ELSEIF "$(CFG)" == "Sorcerer - Win32 Debug" "$(INTDIR)\err.obj" "$(INTDIR)\err.sbr" : $(SOURCE) $(DEP_CPP_ERR_C)\ "$(INTDIR)" !ENDIF SOURCE=.\gen.c DEP_CPP_GEN_C=\ "..\h\antlr.h"\ "..\h\ast.h"\ "..\h\charbuf.h"\ "..\h\pcctscfg.h"\ "..\h\dlgdef.h"\ "..\support\set\set.h"\ ".\hash.h"\ ".\mode.h"\ ".\proto.h"\ ".\sor.h"\ ".\stdpccts.h"\ ".\sym.h"\ ".\tokens.h"\ !IF "$(CFG)" == "Sorcerer - Win32 Release" "$(INTDIR)\gen.obj" : $(SOURCE) $(DEP_CPP_GEN_C) "$(INTDIR)"\ "$(INTDIR)\stdpccts.h" "$(INTDIR)\mode.h" !ELSEIF "$(CFG)" == "Sorcerer - Win32 Debug" "$(INTDIR)\gen.obj" "$(INTDIR)\gen.sbr" : $(SOURCE) $(DEP_CPP_GEN_C)\ "$(INTDIR)" "$(INTDIR)\stdpccts.h" "$(INTDIR)\mode.h" !ENDIF SOURCE=.\globals.c DEP_CPP_GLOBA=\ "..\h\antlr.h"\ "..\h\ast.h"\ "..\h\charbuf.h"\ "..\h\pcctscfg.h"\ "..\h\dlgdef.h"\ "..\support\set\set.h"\ ".\hash.h"\ ".\mode.h"\ ".\sor.h"\ ".\stdpccts.h"\ ".\tokens.h"\ !IF "$(CFG)" == "Sorcerer - Win32 Release" "$(INTDIR)\globals.obj" : $(SOURCE) $(DEP_CPP_GLOBA) "$(INTDIR)"\ "$(INTDIR)\stdpccts.h" "$(INTDIR)\mode.h" !ELSEIF "$(CFG)" == "Sorcerer - Win32 Debug" "$(INTDIR)\globals.obj" "$(INTDIR)\globals.sbr" : $(SOURCE) $(DEP_CPP_GLOBA)\ "$(INTDIR)" "$(INTDIR)\stdpccts.h" "$(INTDIR)\mode.h" !ENDIF SOURCE=.\hash.c DEP_CPP_HASH_=\ ".\hash.h"\ !IF "$(CFG)" == "Sorcerer - Win32 Release" "$(INTDIR)\hash.obj" : $(SOURCE) $(DEP_CPP_HASH_) "$(INTDIR)" !ELSEIF "$(CFG)" == "Sorcerer - Win32 Debug" "$(INTDIR)\hash.obj" "$(INTDIR)\hash.sbr" : $(SOURCE) $(DEP_CPP_HASH_)\ "$(INTDIR)" !ENDIF SOURCE=.\look.c DEP_CPP_LOOK_=\ "..\h\antlr.h"\ "..\h\ast.h"\ "..\h\charbuf.h"\ "..\h\pcctscfg.h"\ "..\h\dlgdef.h"\ "..\support\set\set.h"\ ".\hash.h"\ ".\mode.h"\ ".\proto.h"\ ".\sor.h"\ ".\stdpccts.h"\ ".\sym.h"\ ".\tokens.h"\ !IF "$(CFG)" == "Sorcerer - Win32 Release" "$(INTDIR)\look.obj" : $(SOURCE) $(DEP_CPP_LOOK_) "$(INTDIR)"\ "$(INTDIR)\stdpccts.h" "$(INTDIR)\mode.h" !ELSEIF "$(CFG)" == "Sorcerer - Win32 Debug" "$(INTDIR)\look.obj" "$(INTDIR)\look.sbr" : $(SOURCE) $(DEP_CPP_LOOK_)\ "$(INTDIR)" "$(INTDIR)\stdpccts.h" "$(INTDIR)\mode.h" !ENDIF SOURCE=.\main.c DEP_CPP_MAIN_=\ "..\h\antlr.h"\ "..\h\ast.h"\ "..\h\charbuf.h"\ "..\h\pcctscfg.h"\ "..\h\dlgdef.h"\ "..\support\set\set.h"\ ".\hash.h"\ ".\mode.h"\ ".\proto.h"\ ".\sor.h"\ ".\stdpccts.h"\ ".\sym.h"\ ".\tokens.h"\ !IF "$(CFG)" == "Sorcerer - Win32 Release" "$(INTDIR)\main.obj" : $(SOURCE) $(DEP_CPP_MAIN_) "$(INTDIR)"\ "$(INTDIR)\stdpccts.h" "$(INTDIR)\mode.h" !ELSEIF "$(CFG)" == "Sorcerer - Win32 Debug" "$(INTDIR)\main.obj" "$(INTDIR)\main.sbr" : $(SOURCE) $(DEP_CPP_MAIN_)\ "$(INTDIR)" "$(INTDIR)\stdpccts.h" "$(INTDIR)\mode.h" !ENDIF SOURCE=.\scan.c DEP_CPP_SCAN_=\ "..\h\antlr.h"\ "..\h\ast.h"\ "..\h\charbuf.h"\ "..\h\pcctscfg.h"\ "..\h\dlgauto.h"\ "..\h\dlgdef.h"\ "..\support\set\set.h"\ ".\hash.h"\ ".\mode.h"\ ".\proto.h"\ ".\sor.h"\ ".\sym.h"\ ".\tokens.h"\ !IF "$(CFG)" == "Sorcerer - Win32 Release" "$(INTDIR)\scan.obj" : $(SOURCE) $(DEP_CPP_SCAN_) "$(INTDIR)"\ "$(INTDIR)\mode.h" !ELSEIF "$(CFG)" == "Sorcerer - Win32 Debug" "$(INTDIR)\scan.obj" "$(INTDIR)\scan.sbr" : $(SOURCE) $(DEP_CPP_SCAN_)\ "$(INTDIR)" "$(INTDIR)\mode.h" !ENDIF SOURCE=..\support\set\set.c DEP_CPP_SET_C=\ "..\h\pcctscfg.h"\ "..\support\set\set.h"\ !IF "$(CFG)" == "Sorcerer - Win32 Release" "$(INTDIR)\set.obj" : $(SOURCE) $(DEP_CPP_SET_C) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "Sorcerer - Win32 Debug" "$(INTDIR)\set.obj" "$(INTDIR)\set.sbr" : $(SOURCE) $(DEP_CPP_SET_C)\ "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF SOURCE=.\sor.c DEP_CPP_SOR_C=\ "..\h\antlr.h"\ "..\h\ast.c"\ "..\h\ast.h"\ "..\h\charbuf.h"\ "..\h\pcctscfg.h"\ "..\h\dlgdef.h"\ "..\support\set\set.h"\ ".\hash.h"\ ".\mode.h"\ ".\proto.h"\ ".\sor.h"\ ".\sym.h"\ ".\tokens.h"\ !IF "$(CFG)" == "Sorcerer - Win32 Release" "$(INTDIR)\sor.obj" : $(SOURCE) $(DEP_CPP_SOR_C) "$(INTDIR)" "$(INTDIR)\mode.h" !ELSEIF "$(CFG)" == "Sorcerer - Win32 Debug" "$(INTDIR)\sor.obj" "$(INTDIR)\sor.sbr" : $(SOURCE) $(DEP_CPP_SOR_C)\ "$(INTDIR)" "$(INTDIR)\mode.h" !ENDIF SOURCE=.\sor.g !IF "$(CFG)" == "Sorcerer - Win32 Release" InputPath=.\sor.g InputName=sor "parser.dlg" "mode.h" "stdpccts.h" "sor.c" "scan.c" "err.c" : $(SOURCE)\ "$(INTDIR)" "$(OUTDIR)" ..\bin\Win32\antlr -gh -k 2 -gt $(InputName).g ..\bin\Win32\dlg -C2 parser.dlg scan.c !ELSEIF "$(CFG)" == "Sorcerer - Win32 Debug" InputPath=.\sor.g InputName=sor "parser.dlg" "mode.h" "stdpccts.h" "sor.c" "scan.c" "err.c" : $(SOURCE)\ "$(INTDIR)" "$(OUTDIR)" ..\bin\Win32\antlr -gh -k 2 -gt $(InputName).g ..\bin\Win32\dlg -C2 parser.dlg scan.c !ENDIF !ENDIF gtkwave-3.3.86/contrib/pccts/sorcerer/tokens.h0000664000175000017500000000670613166335473020671 0ustar bybellbybell#ifndef tokens_h #define tokens_h /* tokens.h -- List of labelled tokens and stuff * * Generated from: sor.g * * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001 * Purdue University Electrical Engineering * ANTLR Version 1.33MR33 */ #define zzEOF_TOKEN 1 #define Eof 1 #define RExpr 2 #define Action 27 #define PassAction 28 #define Header 65 #define Tokdef 66 #define BLOCK 67 #define ALT 68 #define LABEL 69 #define OPT 70 #define POS_CLOSURE 71 #define CLOSURE 72 #define WILD 73 #define PRED_OP 74 #define BT 75 #define RULE 76 #define REFVAR 77 #define NonTerm 82 #define Token 83 #define ID 108 #define INT 109 #ifdef __USE_PROTOS void sordesc(AST**_root); #else extern void sordesc(); #endif #ifdef __USE_PROTOS void header(AST**_root); #else extern void header(); #endif #ifdef __USE_PROTOS void tokdef(AST**_root); #else extern void tokdef(); #endif #ifdef __USE_PROTOS void class_def(AST**_root); #else extern void class_def(); #endif #ifdef __USE_PROTOS void rule(AST**_root); #else extern void rule(); #endif #ifdef __USE_PROTOS void block(AST**_root,int no_copy); #else extern void block(); #endif #ifdef __USE_PROTOS void alt(AST**_root,int no_copy); #else extern void alt(); #endif #ifdef __USE_PROTOS void element(AST**_root,int no_copy); #else extern void element(); #endif #ifdef __USE_PROTOS void labeled_element(AST**_root,int no_copy); #else extern void labeled_element(); #endif #ifdef __USE_PROTOS void token(AST**_root,int no_copy); #else extern void token(); #endif #ifdef __USE_PROTOS void tree(AST**_root,int no_copy); #else extern void tree(); #endif #ifdef __USE_PROTOS void enum_file(AST**_root); #else extern void enum_file(); #endif #ifdef __USE_PROTOS void defines(AST**_root); #else extern void defines(); #endif #ifdef __USE_PROTOS void enum_def(AST**_root); #else extern void enum_def(); #endif #endif extern SetWordType zzerr1[]; extern SetWordType zzerr2[]; extern SetWordType setwd1[]; extern SetWordType zzerr3[]; extern SetWordType zzerr4[]; extern SetWordType zzerr5[]; extern SetWordType zzerr6[]; extern SetWordType zzerr7[]; extern SetWordType zzerr8[]; extern SetWordType setwd2[]; extern SetWordType zzerr9[]; extern SetWordType zzerr10[]; extern SetWordType zzerr11[]; extern SetWordType zzerr12[]; extern SetWordType zzerr13[]; extern SetWordType setwd3[]; extern SetWordType zzerr14[]; extern SetWordType zzerr15[]; extern SetWordType zzerr16[]; extern SetWordType zzerr17[]; extern SetWordType zzerr18[]; extern SetWordType zzerr19[]; extern SetWordType zzerr20[]; extern SetWordType zzerr21[]; extern SetWordType zzerr22[]; extern SetWordType setwd4[]; extern SetWordType zzerr23[]; extern SetWordType zzerr24[]; extern SetWordType zzerr25[]; extern SetWordType zzerr26[]; extern SetWordType zzerr27[]; extern SetWordType zzerr28[]; extern SetWordType zzerr29[]; extern SetWordType setwd5[]; extern SetWordType zzerr30[]; extern SetWordType zzerr31[]; extern SetWordType zzerr32[]; extern SetWordType zzerr33[]; extern SetWordType zzerr34[]; extern SetWordType zzerr35[]; extern SetWordType zzerr36[]; extern SetWordType zzerr37[]; extern SetWordType zzerr38[]; extern SetWordType zzerr39[]; extern SetWordType setwd6[]; extern SetWordType zzerr40[]; extern SetWordType zzerr41[]; extern SetWordType zzerr42[]; extern SetWordType zzerr43[]; extern SetWordType setwd7[]; extern SetWordType zzerr44[]; extern SetWordType zzerr45[]; extern SetWordType zzerr46[]; extern SetWordType zzerr47[]; extern SetWordType zzerr48[]; extern SetWordType setwd8[]; gtkwave-3.3.86/contrib/pccts/sorcerer/gen.c0000664000175000017500000007642213166335473020134 0ustar bybellbybell/* Code generator for SORCERER * * Translate sorcerer rules (in intermediate trees) to C / C++ * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public * domain. An individual or company may do whatever they wish with * source code distributed with SORCERER or the code generated by * SORCERER, including the incorporation of SORCERER, or its output, into * commerical software. * * We encourage users to develop software with SORCERER. However, we do * ask that credit is given to us for developing SORCERER. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like SORCERER and have developed a nice tool with the * output, please mention that you developed it using SORCERER. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * SORCERER 1.00B * Terence Parr * AHPCRC, University of Minnesota * 1992-2001 * * The latest (October 1994) transformation mode works as follows: * * o All elements set _tresult, a function-scoped var * o All rules are passed the address of a SORAST ptr * called '_result' that is set at the end of each * alternative. The return tree is guaranteed to * be complete only at this point. * o Each alt AND #(...) tree have their own root (_r), * sibling (_s) and tail/end pointers (_e). #(...) trees * set _tresult just before exiting their scope. Hence, * #(...) are just like elements--they set _tresult. * o At the end of a rule, *_result is set to _tresult. * o After each root node ref, a _mkroot(&_r,&_s,&_e,_tresult) * is generated to set the pointers. * o After each child node ref, a _mkchild(&_r,&_s,&_e,_tresult) * is generated to set the pointers. * o After each rule ref, a _mkroot(&_r,&_s,&_e,_tresult) * is generated to set the pointers. * o After each #(...) ref, a _mkroot(&_r,&_s,&_e,_tresult) * is generated to set the pointers. * o token references: gen a _tresult=ast_dup(_t); * (only if labeled, however). * o rules or alts with nocopy set don't construct trees. */ #include "pcctscfg.h" #include "stdpccts.h" #include "sym.h" #include "proto.h" static int outfile = -1; /* added missing int def : ajb 11nov11 */ static char *current_rule; static ListNode *labels_for_func = NULL; static AST *whichRule; static int tabs=0; #define TAB {int i=1; for (;i<=tabs;i++) {putc('\t', output);}} #define PastWhiteSpace(s) while (*(s) == ' ' || *(s) == '\t') {s++;} static void #ifdef __USE_PROTOS go_down(int nl) #else go_down(nl) int nl; #endif { fprintf(output, "_DOWN;"); if ( nl ) fprintf(output, "\n"); } static void #ifdef __USE_PROTOS go_right(int nl) #else go_right(nl) int nl; #endif { fprintf(output, "_RIGHT;"); if ( nl ) fprintf(output, "\n"); } void #ifdef __USE_PROTOS gen_info_hdr( FILE *f ) #else gen_info_hdr( f ) FILE *f; #endif { fprintf(f, "/*\n"); fprintf(f, " * S O R C E R E R T r a n s l a t i o n H e a d e r\n"); fprintf(f, " *\n"); fprintf(f, " * SORCERER Developed by Terence Parr, Aaron Sawdey, & Gary Funck\n"); fprintf(f, " * Parr Research Corporation, Intrepid Technology, University of Minnesota\n"); fprintf(f, " * 1992-1994\n"); fprintf(f, " * SORCERER Version %s\n", VersionText); fprintf(f, " */\n"); } void #ifdef __USE_PROTOS gen_hdr_CPP( void ) #else gen_hdr_CPP( ) #endif { char CPPParser_h_Name[MaxFileName+1]; gen_info_hdr(output); fprintf(output, "#define SORCERER_VERSION\t%s\n", VersionNumber); if ( transform ) fprintf(output, "#define SORCERER_TRANSFORM\n"); else fprintf(output, "#define SORCERER_NONTRANSFORM\n"); /* Don't gen header action here as it's in the ClassName.h if ( header_action!=NULL ) dumpAction(header_action, output, 0, -1, 0, 1); */ fprintf(output, "#include \"%s\"\n", STPARSER_H); if ( UserDefdTokens ) fprintf(output, "#include \"%s\"\n", tokdefs_file); strcpy(CPPParser_h_Name, CurClassName); strcat(CPPParser_h_Name, ".h"); fprintf(output, "#include \"%s\"\n", CPPParser_h_Name); } void #ifdef __USE_PROTOS gen_hdr_C( void ) #else gen_hdr_C( ) #endif { if ( Inline ) return; gen_info_hdr(output); fprintf(output, "#define SORCERER_VERSION\t%s\n", VersionNumber); if ( transform ) fprintf(output, "#define SORCERER_TRANSFORM\n"); else fprintf(output, "#define SORCERER_NONTRANSFORM\n"); fprintf(output, "#include \"pcctscfg.h\"\n"); fprintf(output, "#include \n"); fprintf(output, "#include \n"); if ( Prefix[0]!='\0' ) { fprintf(output, "/* rename error routines; used in macros, must use /lib/cpp */\n"); fprintf(output, "#define mismatched_token %smismatched_token\n", Prefix); fprintf(output, "#define mismatched_range %smismatched_range\n", Prefix); fprintf(output, "#define missing_wildcard %smissing_wildcard\n", Prefix); fprintf(output, "#define no_viable_alt %sno_viable_alt\n", Prefix); fprintf(output, "#define sorcerer_panic %ssorcerer_panic\n", Prefix); } if ( header_action!=NULL ) dumpAction(header_action, output, 0, -1, 0, 1); /* make a #define for the STreeParser containing the ref vars */ if ( AllRefVars!=NULL ) { ListNode *p; fprintf(output, "#define _REFVARS \\\n"); for (p = AllRefVars->next; p!=NULL; p=p->next) { RefVarRec *r = (RefVarRec *)p->elem; fprintf(output, "\t%s; \\\n", r->decl); } fprintf(output, "\n\n"); } fprintf(output, "#include \"sorcerer.h\"\n"); if ( UserDefdTokens ) fprintf(output, "#include \"%s\"\n", tokdefs_file); if ( GenProtoFile!=NULL ) fprintf(output, "#include \"%s\"\n", GenProtoFile); else GenRulePrototypes( output, 0 ); if ( transform ) fprintf(output, "#include \"sorcerer.c\"\n"); } void #ifdef __USE_PROTOS gen_hdr( void ) #else gen_hdr( ) #endif { if ( GenCPP ) gen_hdr_CPP(); else gen_hdr_C(); } void #ifdef __USE_PROTOS gen_hdr1( void ) #else gen_hdr1( ) #endif { if ( !Inline ) { gen_hdr(); } if ( GenCPP ) { /* fprintf(output, "#include \"%s\"\n", STREESUPPORT_C); */ } else { /* make a func to init the ref vars with inits */ fprintf(output, "\nvoid\n"); fprintf(output, "#ifdef __USE_PROTOS\n"); fprintf(output, "_refvar_inits(STreeParser *p)\n"); fprintf(output, "#else\n"); fprintf(output, "_refvar_inits(p)\n"); fprintf(output, "STreeParser *p;\n"); fprintf(output, "#endif\n"); fprintf(output, "{\n"); if ( AllRefVars!=NULL ) { ListNode *p; for (p = AllRefVars->next; p!=NULL; p=p->next) { RefVarRec *r = (RefVarRec *)p->elem; if ( r->init[0]!='\0' ) fprintf(output, "\tp->%s=%s;\n", r->var, r->init); } } fprintf(output, "}\n\n"); } if ( before_actions != NULL ) { ListNode *p; for (p = before_actions->next; p!=NULL; p=p->next) dumpAction( (char *)p->elem, output, 0, -1, 0, 1); } } void #ifdef __USE_PROTOS gen( AST *t ) #else gen( t ) AST *t; #endif { if ( t==NULL ) return; while ( t!=NULL && t->token == NonTerm ) { if ( labels_for_func != NULL ) { /* reset 'defined' flag for previously defined labels and free list */ ListNode *p, *q; for (p = labels_for_func->next; p!=NULL; p=q) { SymEntry *s = (SymEntry *)p->elem; s->defined = 0; q = p->next; free(p); } free(labels_for_func); labels_for_func = NULL; } gen_rule(t); t = t->right; } if ( after_actions != NULL ) { ListNode *p; for (p = after_actions->next; p!=NULL; p=p->next) dumpAction( (char *)p->elem, output, 0, -1, 0, 1); } fclose(output); } void #ifdef __USE_PROTOS gen_rule( AST *t ) #else gen_rule( t ) AST *t; #endif { SymEntry *s; if ( t==NULL ) return; whichRule=t; s = (SymEntry *) hash_get(symbols, t->text); require(s!=NULL, "gen_rule: sym tab broken"); if ( t->file != outfile ) /* open new output file if need to */ { if (strcmp(FileStr[t->file], "stdin")==0) output = stdout; else { if ( output != NULL ) fclose( output ); output = fopen(OutMetaName(outname(FileStr[t->file])), "w"); require(output != NULL, "gen_rule: can't open output file"); #ifdef SPECIAL_FOPEN special_fopen_actions(OutMetaName(outname(FileStr[t->file]))); #endif } if ( outfile == -1 ) gen_hdr1(); else gen_hdr(); outfile = t->file; } fprintf(output, "\n"); current_rule = t->text; GenRulePrototype(output, t, s, 0); /* What locals do we need? */ tabs=1; if ( GenCPP ) fprintf(output, "{\n\tSORASTBase *_t = *_root;\n"); else fprintf(output, "{\n\tSORAST *_t = *_root;\n"); if ( s->rt!=NULL ) fprintf(output, "\t%s;\n", s->rt); if ( transform ) { if ( GenCPP ) fprintf(output, "\tSORASTBase *_tresult=NULL;\n"); else fprintf(output, "\tSORAST *_tresult=NULL;\n"); fprintf(output, "\tTREE_CONSTR_PTRS;\n"); } if ( t->refvars!=NULL ) { ListNode *p; for (p = t->refvars->next; p!=NULL; p=p->next) { RefVarRec *r = (RefVarRec *)p->elem; if ( !r->global ) { TAB; dump_prefixed_decl("_save_", r->decl, output); if ( GenCPP ) fprintf(output, "=%s;\n", r->var); else fprintf(output, "=_parser->%s;\n", r->var); } } } define_labels_in_block(t->down); if ( found_guess_block ) fprintf(output, "\t_GUESS_BLOCK;\n"); if ( transform ) fprintf(output, " *_result = NULL;\n"); gen_block(t->down, BLOCK); TAB; fprintf(output, "*_root = _t;\n"); /* reset any ref vars defined in this routine */ if ( t->refvars!=NULL ) { ListNode *p; for (p = t->refvars->next; p!=NULL; p=p->next) { RefVarRec *r = (RefVarRec *)p->elem; if ( !r->global ) { if ( GenCPP ) fprintf(output, "\t%s = _save_%s;\n", r->var, r->var); else fprintf(output, "\t_parser->%s = _save_%s;\n", r->var, r->var); } } } /* set result of tree copying efforts if no ! on rule */ if ( transform&&!t->no_copy ) { TAB; /* The 'if' check in front of the *_result assignment ensures * that if someone sets the result before here, don't mess with * it. This assignment is the default. */ fprintf(output, "if ( (*_result) == NULL ) *_result = _r;\n"); } /* send back and return value */ if ( s->rt!=NULL ) { char *str = s->rt; TAB; fprintf(output, "return "); DumpNextNameInDef(&str, output); fprintf(output, ";\n"); } tabs=0; fprintf(output, "}\n"); } /* * The lookahead is stored in the 1st node of each alt of the block. * The Lookahead of what follows (for CLOSURE and OPT) blocks, is stored * in the node which branches over the enclosed, optional block. */ void #ifdef __USE_PROTOS gen_block( AST *q, int block_type ) #else gen_block( q, block_type ) AST *q; int block_type; #endif { AST *t = q, *u, *g; GLA *start_state, *follow=NULL; int need_right_curly=0, guess_block_in_prev_alt=0, num_alts=0; require(q!=NULL, "gen_block: NULL block"); require(q->start_state!=NULL, "gen_block: NULL start state"); start_state = t->start_state->p1; require(start_state!=NULL, "gen_block: no GLA start state for AST block"); switch ( block_type ) { case PRED_OP : TAB; fprintf(output, "{_SAVE; TREE_CONSTR_PTRS;\n"); break; case CLOSURE : TAB; fprintf(output, "{int _done=0;\n"); TAB; fprintf(output, "while ( !_done ) {\n"); tabs++; break; case POS_CLOSURE : TAB; fprintf(output, "{int _done=0;\n"); TAB; fprintf(output, "do {\n"); tabs++; } /* Error if (...)? with only one alt */ for (u = q->down; u!=NULL; u=u->right ) {num_alts++;} g = first_guess_block(q->down); if ( num_alts==1 && g!=NULL ) { warnFL("(...)? predicate in block with one alternative; will generate bad code", FileStr[g->file], g->line); } t = t->down; /* move down to first alt */ while ( t!=NULL && t->token == ALT ) { require(start_state!=NULL, "gen_block: invalid GLA for block"); if ( t!=q->down ) { TAB; fprintf(output, "else {\n"); need_right_curly++; } code_for_guess_block(t, &guess_block_in_prev_alt); TAB; fprintf(output, "if ("); /* To prevent/detect infinite recursion, ensure 'visited' flag is set * on node starting this alt */ start_state->visited = 1; start_state->lookahead = gen_prediction_expr(t, start_state->p1); start_state->visited = 0; fprintf(output, " ) {\n"); tabs++; gen_alt(t); tabs--; TAB; fprintf(output, "}\n"); t = t->right; /* move to next alt in AST */ start_state = start_state->p2; /* move to next alt in GLA */ } switch ( block_type ) { case OPT : case CLOSURE : follow = q->start_state->p2; break; case POS_CLOSURE : follow = q->start_state->next; } if ( block_type == OPT || block_type == CLOSURE || block_type == POS_CLOSURE ) { TAB; fprintf(output, "else {\n"); need_right_curly++; TAB; fprintf(output, "if ("); /* what follows the block? */ q->start_state->visited = 1; q->start_state->lookahead = gen_prediction_expr(NULL, follow); q->start_state->visited = 0; fprintf(output, " ) {\n"); if ( block_type != OPT ) { tabs++; TAB; fprintf(output, "_done = 1;\n"); tabs--; } TAB; fprintf(output, "}\n"); } /* Generate error clause */ TAB; fprintf(output, "else {\n"); /* generate the _GUESS_FAIL even if no (..)? found because calling * routine may be using STreeTest() */ tabs++; TAB; if ( GenCPP ) fprintf(output, "if ( guessing ) _GUESS_FAIL;\n"); else fprintf(output, "if ( _parser->guessing ) _GUESS_FAIL;\n"); TAB; if ( GenCPP ) fprintf(output, "no_viable_alt(\"%s\", _t);\n", current_rule); else fprintf(output, "no_viable_alt(_parser, \"%s\", _t);\n", current_rule); tabs--; TAB; fprintf(output, "}\n"); if ( transform ) { TAB; fprintf(output, " _tresult = _r;\n"); } for (;need_right_curly>0; need_right_curly--) { TAB; fprintf(output, "}\n"); } switch ( block_type ) { case BLOCK : break; case CLOSURE : tabs--; TAB; fprintf(output, "}\n"); /* if ( transform ) fprintf(output, " _tresult = _r;\n"); */ TAB; fprintf(output, "}\n"); break; case POS_CLOSURE : tabs--; TAB; fprintf(output, "} while ( !_done );\n"); /* if ( transform ) { TAB; fprintf(output, " _tresult = _r;\n"); } */ TAB; fprintf(output, "}\n"); break; case PRED_OP : TAB; fprintf(output, "_RESTORE;\n"); /* if ( transform ) { TAB; fprintf(output, " _tresult = _r;\n"); } */ TAB; fprintf(output, "}\n"); TAB; fprintf(output, "_GUESS_DONE;\n"); break; } test_block_consistency(q, block_type); } void #ifdef __USE_PROTOS gen_alt( AST *t ) #else gen_alt( t ) AST *t; #endif { require(t!=NULL && t->token==ALT, "gen_alt: invalid alt"); t = t->down; if ( t==NULL ) return; if ( t->token==Action ) t->init_action = 1; gen_tree_pattern(t); /* find last element of alternative to see if it's a simple token */ while ( t->right!=NULL ) { t = t->right; } if ( t->down==NULL && (t->token == Token || t->token == WILD) ) { TAB; go_right(1); } } void #ifdef __USE_PROTOS gen_tree_pattern( AST *t ) #else gen_tree_pattern( t ) AST *t; #endif { while ( t != NULL ) { /* could be root of a tree, check it */ if ( t->down != NULL && (t->token==Token||t->token==WILD) ) { TAB; fprintf(output, "{_SAVE; TREE_CONSTR_PTRS;\n"); } gen_element(t); if ( t->down != NULL ) { if ( t->token == Token || t->token==WILD ) { gen_tree_pattern(t->down); /* only token/wildcard can be root of tree */ TAB; fprintf(output, "_RESTORE;"); if ( transform ) fprintf(output, " _tresult = _r;"); fprintf(output, "\n"); TAB; fprintf(output, "}\n"); /* link in result of #(...) */ if ( transform && !whichRule->no_copy ) { TAB; fprintf(output, "_mkchild(&_r,&_s,&_e,_tresult);\n"); } TAB; go_right(1); } } t = t->right; } } void #ifdef __USE_PROTOS gen_element( AST *t ) #else gen_element( t ) AST *t; #endif { char *res; require(t!=NULL, "gen_element: NULL tree pointer"); switch ( t->token ) { case Token : TAB; if ( t->upper_range!=0 ) fprintf(output, "_MATCHRANGE(%s,%s);", t->text, token_dict[t->upper_range]); else fprintf(output, "_MATCH(%s);", t->text); fprintf(output, "\n"); /* Make copy of token if transform && (copy or (labeled&&!copy)) */ if ( transform && (t->label[0]!='\0'||!t->no_copy) ) { TAB; if ( GenCPP ) fprintf(output, "_tresult=_t->shallowCopy();\n"); else fprintf(output, "_tresult=ast_dup_node(_t);\n"); } if ( transform && !t->no_copy ) { if ( t->is_root ) fprintf(output, " _mkroot(&_r,&_s,&_e,_tresult);\n"); else fprintf(output, " _mkchild(&_r,&_s,&_e,_tresult);\n"); } /* Do Label if any */ if ( transform ) { /* label is output, label_in is input */ if ( t->label[0]!='\0' ) { TAB; fprintf(output, "%s=(SORAST *)_tresult; %s_in=(SORAST *)_t;\n", t->label,t->label); } } else { if ( t->label[0]!='\0' ) { TAB; fprintf(output, "%s=(SORAST *)_t;\n", t->label); } } /* Move tree parser pointer */ if ( t->down != NULL ) { TAB; go_down(1); } else if ( t->right != NULL ) { TAB; go_right(1); } break; case WILD : TAB; fprintf(output, "_WILDCARD;"); /* Make copy of token or tree if transform */ if ( transform ) { TAB; if ( GenCPP ) fprintf(output, "_tresult=_t->deepCopy();"); else fprintf(output, "_tresult=ast_dup(_t);"); /* wildcard can't be root, must be child */ if ( !t->no_copy ) { if ( t->is_root ) fprintf(output, " _mkroot(&_r,&_s,&_e,_tresult);"); else fprintf(output, " _mkchild(&_r,&_s,&_e,_tresult);"); } } fprintf(output, "\n"); if ( transform ) { if ( t->label[0]!='\0' ) { TAB; fprintf(output, "%s=(SORAST *)_tresult; %s_in=(SORAST *)_t;\n", t->label,t->label); } } else { if ( t->label[0]!='\0' ) { TAB; fprintf(output, "%s=(SORAST *)_t;\n", t->label); } } if ( t->down != NULL ) { TAB; go_down(1); } else if ( t->right != NULL ) { TAB; go_right(1); } break; case NonTerm : TAB; /* For nontransform mode, do labels first */ if (t->label[0]!='\0') fprintf(output, "%s=(SORAST *)_t; ", t->label); if ( t->out ) { if ( t->in ) fprintf(output, "%s=", t->down->right->text); else fprintf(output, "%s=", t->down->text); } fprintf(output, "%s%s", Prefix, t->text); if ( transform ) res = ", &_tresult"; else res = ""; if ( GenCPP ) { if ( t->in ) fprintf(output, "(&_t%s, %s);", res, t->down->text); else fprintf(output, "(&_t%s);", res); } else { if ( t->in ) fprintf(output, "(_parser, &_t%s, %s);", res, t->down->text); else fprintf(output, "(_parser, &_t%s);", res); } fprintf(output, "\n"); if (transform && t->label[0]!='\0') { TAB; fprintf(output, "%s=(SORAST *)_tresult;\n", t->label); } /* Link in result of rule */ if ( transform&&!t->no_copy ) { TAB; fprintf(output, "_mkchild(&_r,&_s,&_e,_tresult);\n"); } break; case Action : if ( !t->init_action && found_guess_block ) { TAB; if ( GenCPP ) fprintf(output, "if ( !guessing ) {\n"); else fprintf(output, "if ( !_parser->guessing ) {\n"); } dumpAction(t->action, output, tabs, 0, 0, 1); if ( !t->init_action && found_guess_block ) {TAB; fprintf(output, "}\n");} break; case CLOSURE : gen_block(t->down, CLOSURE); break; case POS_CLOSURE : gen_block(t->down, POS_CLOSURE); break; case OPT : gen_block(t->down, OPT); break; case BLOCK : gen_block(t, BLOCK); break; case PRED_OP : require(t->up!=NULL, "define_labels_in_element: GLA is broken"); if ( t->up->down==t ) { if ( t->down->token == BLOCK ) gen_block(t->down, PRED_OP); } else if ( t->up->down->token==Action && t->up->down->right==t ) { if ( t->down->token == BLOCK ) gen_block(t->down, PRED_OP); } else { warnFL("predicate not at beginning of alternative; ignored", FileStr[t->file], t->line); } break; default : fatal(eMsgd("invalid elemental node type: %d", t->token)); } } /* walk the block of a rule and define all labels to be "SORAST *label_i" */ void #ifdef __USE_PROTOS define_labels_in_block( AST *t ) #else define_labels_in_block( t ) AST *t; #endif { require(t!=NULL, "define_labels_in_block: NULL tree pointer"); require(t->token==BLOCK, "define_labels_in_block: invalid block"); t = t->down; while ( t!=NULL ) { define_labels_in_alt(t); t = t->right; } } void #ifdef __USE_PROTOS define_labels_in_alt( AST *t ) #else define_labels_in_alt( t ) AST *t; #endif { require(t!=NULL, "define_labels_in_alt: NULL tree pointer"); require(t->token==ALT, "gen_alt: invalid alt"); define_labels_in_tree(t->down); } void #ifdef __USE_PROTOS define_labels_in_tree( AST *t ) #else define_labels_in_tree( t ) AST *t; #endif { while ( t != NULL ) { define_labels_in_element(t); /* could be root of a tree, check it */ if ( t->down != NULL ) { if ( t->token == Token || t->token==WILD ) { define_labels_in_tree(t->down); } } t = t->right; } } void #ifdef __USE_PROTOS define_labels_in_element( AST *t ) #else define_labels_in_element( t ) AST *t; #endif { require(t!=NULL, "define_labels_in_element: NULL tree pointer"); switch ( t->token ) { case Token : case WILD : case NonTerm : if ( t->label[0]!='\0' ) { SymEntry *s; s = (SymEntry *) hash_get(symbols, t->label); require(s!=NULL, "define_labels_in_element: sym tab broken"); if ( s->token==LABEL && !s->defined ) { s->defined = 1; TAB; fprintf(output, "SORAST *%s=NULL", t->label); if ( transform ) fprintf(output, ",*%s_in=NULL", t->label); fprintf(output, ";\n"); /* track which ones we define so that we can undefine * them for the next rule */ list_add(&labels_for_func, (void *)s); } } break; case Action : break; case CLOSURE : case POS_CLOSURE : define_labels_in_block(t->down); break; case PRED_OP : if ( t->down->token != Action ) { define_labels_in_block(t->down); } break; case OPT : define_labels_in_block(t->down); break; case BLOCK : define_labels_in_block(t); break; } } /* dump action 's' to file 'output' starting at "local" tab 'tabs' Dump line information in front of action if GenLineInfo is set If file == -1 then GenLineInfo is ignored. The user may redefine the LineInfoFormatStr to his/her liking most compilers will like the default, however. June '93; changed so that empty lines are left alone so that line information is correct for the compiler/debuggers. */ void #ifdef __USE_PROTOS dumpAction( char *s, FILE *output, int tabs, int file, int line, int final_newline ) #else dumpAction( s, output, tabs, file, line, final_newline ) char *s; FILE *output; int tabs; int file; int line; int final_newline; #endif { int inDQuote, inSQuote; require(s!=NULL, "dumpAction: NULL action"); require(output!=NULL, eMsg1("dumpAction: output FILE is NULL for %s",s)); /* if ( GenLineInfo && file != -1 ) { fprintf(output, LineInfoFormatStr, line, FileStr[file]); }*/ PastWhiteSpace( s ); /* don't print a tab if first non-white char is a # (preprocessor command) */ if ( *s!='#' ) {TAB;} inDQuote = inSQuote = 0; while ( *s != '\0' ) { if ( *s == '\\' ) { putc( *s++, output ); /* Avoid '"' Case */ if ( *s == '\0' ) return; if ( *s == '\'' ) putc( *s++, output ); if ( *s == '\"' ) putc( *s++, output ); } if ( *s == '\'' ) { if ( !inDQuote ) inSQuote = !inSQuote; } if ( *s == '"' ) { if ( !inSQuote ) inDQuote = !inDQuote; } if ( *s == '\n' ) { putc('\n', output); s++; while (*s == '\n') { putc('\n', output); s++; } PastWhiteSpace( s ); if ( *s == '}' ) { --tabs; TAB; putc( *s++, output ); continue; } if ( *s == '\0' ) return; if ( *s != '#' ) /* #define, #endif etc.. start at col 1 */ { TAB; } } if ( *s == '}' && !(inSQuote || inDQuote) ) { --tabs; /* Indent one fewer */ } if ( *s == '{' && !(inSQuote || inDQuote) ) { tabs++; /* Indent one more */ } putc( *s, output ); s++; } if ( final_newline ) putc('\n', output); } char * #ifdef __USE_PROTOS find_predicate( AST *t ) #else find_predicate( t ) AST *t; #endif { if ( t==NULL ) return NULL; if ( t->token == Action ) { if ( t->right!=NULL && t->right->token==PRED_OP && t->right->down->token!=BLOCK ) { return t->right->down->action; } } else if ( t->token == PRED_OP && t->down->token!=BLOCK ) { return t->down->action; } return NULL; } /* Given a pointer to a tree pattern element (Token, BLOCK, etc...), * generate an expression that predicts when that path would match. */ set #ifdef __USE_PROTOS gen_prediction_expr( AST *alt, GLA *t ) #else gen_prediction_expr( alt, t ) AST *alt; GLA *t; #endif { char *sempred; set a, rs; int tok, first=1, num_on_line=0; require(alt==NULL||alt->token==ALT, "gen_prediction_expr: AST node is invalid"); a = Lookahead(t); rs = set_dup(a); /* if this production is a guess block, then test return value of setjmp() */ /* MR21 Problem reported by Peter Keller THM: Sor doesn't see predicate because of intervening action. */ if (alt != NULL) { AST* cursor; for (cursor = alt->down; cursor != NULL && Action == cursor->token; cursor = cursor->right) { /* nothing */ } if (cursor != NULL && cursor->token == PRED_OP && cursor->down->token == BLOCK) { fprintf(output," !_gv &&"); } } #if 0 /* The old code which was replaced */ if ( alt!=NULL && alt->down!=NULL && alt->down->token==PRED_OP && alt->down->down->token==BLOCK ) fprintf(output, " !_gv &&"); #endif /* handle end of input first */ if ( set_el(end_of_input, a) ) { fprintf(output, " _t==NULL"); set_rm(end_of_input, a); if ( !set_nil(a) ) fprintf(output, " ||"); } else if ( set_el(wild_card, a) ) { fprintf(output, " _t!=NULL"); if ( alt!=NULL ) { sempred = find_predicate(alt->down); if ( sempred!=NULL ) fprintf(output, " && (%s)", sempred); } set_free(a); return rs; } else { fprintf(output, " _t!=NULL"); if ( !set_nil(a) ) fprintf(output, " &&"); } if ( set_nil(a) ) { set_free(a); return rs; } fprintf(output, " ("); while ( !set_nil(a) ) { tok = set_int(a); set_rm(tok, a); if ( first ) first = 0; else fprintf(output, "||"); if ( num_on_line>=2 ) {num_on_line=0; fprintf(output,"\n"); TAB;} else num_on_line++; if ( tok==wild_card ) fprintf(output, "_t!=NULL"); else if ( token_dict[tok]==0 ) { if ( GenCPP ) fprintf(output, "_t->type()==UNDEFINED_TOKEN"); else fprintf(output, "_t->token==UNDEFINED_TOKEN"); } else { if ( GenCPP ) fprintf(output, "_t->type()==%s", token_dict[tok]); else fprintf(output, "_t->token==%s", token_dict[tok]); } } fprintf(output, ")"); if ( alt!=NULL ) { sempred = find_predicate(alt->down); if ( sempred!=NULL ) fprintf(output, " && (%s)", sempred); } set_free(a); return rs; } /* Find all return types/parameters that require structs and def * all rules with ret types. */ void #ifdef __USE_PROTOS GenRulePrototypes( FILE *f, int tabs ) #else GenRulePrototypes( f, tabs ) FILE *f; int tabs; #endif { AST *p; SymEntry *s; for (p=rules; p!=NULL; p=p->right) { int i; s = (SymEntry *) hash_get(symbols, p->text); require(s!=NULL, "GenRulePrototypes: sym tab broken"); for (i=1; i<=tabs; i++) fprintf(f, "\t"); GenRulePrototype(f, p, s, 1); } } void #ifdef __USE_PROTOS GenRulePrototype(FILE *f, AST *p, SymEntry *s, int decl_not_def) #else GenRulePrototype(f, p, s, decl_not_def) FILE *f; SymEntry *s; AST *p; int decl_not_def; #endif { require(s!=NULL&&s->definition!=NULL, "GenRulePrototype: no def for rule"); if ( GenCPP ) { if ( s->rt != NULL ) DumpType(s->rt, f, FileStr[s->definition->file], s->definition->line); else fprintf(f, "void"); if ( decl_not_def ) fprintf(f, " %s(SORASTBase **_root%s", p->text, transform?", SORASTBase **_result":""); else fprintf(f, " %s::%s(SORASTBase **_root%s", CurClassName, p->text, transform?", SORASTBase **_result":""); if ( s->args != NULL ) fprintf(f, ",%s", s->args); fprintf(f, ")"); if ( decl_not_def ) fprintf(f, ";"); fprintf(f, "\n"); return; } if ( decl_not_def ) fprintf(f, "extern "); if ( GenAnsiProtos && GenKRProtos ) fprintf(f, "\n#ifdef __USE_PROTOS\n"); if ( GenAnsiProtos ) { if ( s->rt != NULL ) DumpType(s->rt, f, FileStr[s->definition->file], s->definition->line); else fprintf(f, "void"); fprintf(f, " %s%s(STreeParser *_parser, SORAST **_root%s", Prefix, p->text, transform?", SORAST **_result":""); if ( s->args != NULL ) fprintf(f, ",%s", s->args); fprintf(f, ")"); if ( decl_not_def ) fprintf(f, ";"); fprintf(f, "\n"); } if ( GenAnsiProtos && GenKRProtos ) fprintf(f, "#else\n"); if ( GenKRProtos ) { if ( s->rt != NULL ) DumpType(s->rt, f, FileStr[s->definition->file], s->definition->line); else fprintf(f, "void"); if ( decl_not_def) fprintf(f, " %s%s();\n", Prefix, p->text); else { fprintf(f, " %s%s(_parser, _root%s", Prefix, p->text,transform?", _result":""); if ( s->args!=NULL ) fprintf(f, ","); DumpListOfParmNames(s->args, f); fprintf(f, ")\n"); fprintf(f, "STreeParser *_parser;\n"); fprintf(f, "SORAST **_root%s;\n", transform?", **_result":""); DumpOldStyleParms(s->args, f); } } if ( GenAnsiProtos && GenKRProtos ) fprintf(f, "#endif\n"); } /* * For each referenced token, generate a #define in a file defined in * 'def_token_file'. */ void #ifdef __USE_PROTOS gen_tokens_file( void ) #else gen_tokens_file( ) #endif { FILE *f; ListNode *p; if ( def_token_file==NULL ) return; f = fopen(def_token_file, "w"); if ( f==NULL ) { errNoFL(eMsg1("cannot write token definition file %s", def_token_file)); return; } #ifdef SPECIAL_FOPEN special_fopen_actions(def_token_file); #endif gen_info_hdr(f); fprintf(f, "\n"); for (p = token_list->next; p!=NULL; p=p->next) { SymEntry *t = (SymEntry *) p->elem; fprintf(f, "#define %s %d\n", t->str, t->token_type); } fclose(f); } AST * #ifdef __USE_PROTOS first_guess_block(AST *q) #else first_guess_block(q) AST *q; #endif { require(q!=NULL&&q->token==ALT, "first_guess_block: non-ALT ptr"); if ( q->down!=NULL ) { if ( (q->down->token==PRED_OP && q->down->down!=NULL && q->down->down->token==BLOCK) ) { return q->down; } else if (q->down->token==Action && q->down->right!=NULL && q->down->right->token==PRED_OP && q->down->right->down!=NULL && q->down->right->down->token==BLOCK) { return q->down->right; } else return NULL; } return NULL; } void #ifdef __USE_PROTOS code_for_guess_block( AST *t, int *guess_block_in_prev_alt ) #else code_for_guess_block( t, guess_block_in_prev_alt ) AST *t; int *guess_block_in_prev_alt; #endif { if ( found_guess_block ) { /* if previous alt had a guess block, check to turn it off */ if ( *guess_block_in_prev_alt ) { TAB; if ( GenCPP ) fprintf(output, "if ( guessing ) _GUESS_DONE;\n"); else fprintf(output, "if ( _parser->guessing ) _GUESS_DONE;\n"); } /* if current alt has a guess block... */ if ( first_guess_block(t)!=NULL ) { TAB; fprintf(output, "_GUESS;\n"); *guess_block_in_prev_alt = 1; } } } gtkwave-3.3.86/contrib/pccts/sorcerer/makefile10000664000175000017500000000222213166335473020763 0ustar bybellbybell# # PCCTS makefile for: SORCERER 1.00B # Uses PCCTS release 1.20 # PCCTS=.. BIN = $(PCCTS)/bin ANTLR = $(BIN)/antlr DLG = $(BIN)/dlg PCCTS_H = $(PCCTS)/h SET = $(PCCTS)/support/set CFLAGS = -Ih -I. -I$(PCCTS_H) -I$(SET) -g -O $(ANSI) $(COTHER) -DZZLEXBUFSIZE=32000 AFLAGS = -gh -k 2 -gt DFLAGS = -C2 GRM = sor.g SRC = sor.c scan.c err.c main.c globals.c gen.c $(SET)/set.c hash.c look.c cpp.c OBJ = sor.o scan.o err.o main.o globals.o gen.o set.o hash.o look.o cpp.o GENHFILES = tokens.h mode.h stdpccts.h CC=cc SHELL=/bin/sh all: make sor (cd lib; make) sor: $(OBJ) $(SRC) $(CC) -o sor $(CFLAGS) $(OBJ) -O sor.o : sor.c mode.h tokens.h $(CC) $(CFLAGS) -c -o sor.o sor.c sor.c stdpccts.h parser.dlg tokens.h err.c : sor.g $(ANTLR) $(AFLAGS) sor.g set.o : $(SET)/set.c $(CC) $(CFLAGS) -c -o set.o $(SET)/set.c scan.c mode.h : parser.dlg $(DLG) $(DFLAGS) parser.dlg scan.c scan.o : scan.c mode.h tokens.h clean: rm -f *.o core sor scrub: rm -f *.o core $(GENHFILES) parser.dlg scan.c err.c sor.c sor ci: ci -u sor.g Makefile main.c globals.c gen.c set.c hash.c look.c cpp.c co: co -l sor.g Makefile main.c globals.c gen.c set.c hash.c look.c cpp.c gtkwave-3.3.86/contrib/pccts/sorcerer/parser.dlg0000664000175000017500000002625313166335473021200 0ustar bybellbybell<< /* parser.dlg -- DLG Description of scanner * * Generated from: sor.g * * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001 * Purdue University Electrical Engineering * With AHPCRC, University of Minnesota * ANTLR Version 1.33MR33 */ #define ANTLR_VERSION 13333 #include "pcctscfg.h" #include "pccts_stdio.h" /* 23-Sep-97 thm Accomodate user who needs to redefine ZZLEXBUFSIZE */ #ifndef ZZLEXBUFSIZE #define ZZLEXBUFSIZE 8000 #endif #include "pcctscfg.h" /* MR20 G. Hobbelt __USE_PROTOS #define */ #include "charbuf.h" #include "hash.h" #include "set.h" #include "sor.h" #define AST_FIELDS \ int token; char text[MaxAtom+1], label[MaxRuleName+1]; \ char *action; /* if action node, here is ptr to it */ \ char in,out; \ char init_action; /* set if Action and 1st action of alt */ \ int file; int line; /* set for BLOCK, ALT, nonterm nodes */ \ int upper_range; /* only if T1..T2 found */ \ GLA *start_state; /* ptr into GLA for this block */ \ int no_copy; /* copy input ptr to output ptr? */ \ ListNode *refvars; /* any ref vars defined for this rule */ \ unsigned char is_root; /* this token is a root #( A ... ) */ #define zzcr_ast(node, cur, _tok, _text) \ {(node)->token=_tok; strncpy((node)->text, _text,MaxAtom);} #define USER_ZZSYN #define zzAST_DOUBLE extern int define_num; #define LL_K 2 #include "antlr.h" #include "ast.h" #include "tokens.h" #include "dlgdef.h" LOOKAHEAD void #ifdef __USE_PROTOS zzerraction(void) #else zzerraction() #endif { (*zzerr)("invalid token"); zzadvance(); zzskip(); } >> <<%%lexaction #include "sym.h" #include "proto.h" int define_num = 0; char * #ifdef __USE_PROTOS scarf_to_end_of_func_call(void) #else scarf_to_end_of_func_call() #endif { static char func_call_str[MaxAtom+1]; char *p; p = &func_call_str[0]; more: if ( zzchar==')' ) { *p++ = zzchar; *p++ = '\0'; zzadvance(); return func_call_str; } if ( zzchar=='"' ) { *p++ = zzchar; zzadvance(); while ( zzchar!='"' ) { if ( zzchar=='\\' ) { *p++ = zzchar; zzadvance(); } *p++ = zzchar; zzadvance(); } } *p++ = zzchar; zzadvance(); goto more; } >> %%START @ << NLA = Eof; /* L o o k F o r A n o t h e r F i l e */ { FILE *new_input; new_input = NextFile(); if ( new_input != NULL ) { fclose( input ); input = new_input; zzrdstream( input ); /*zzadvance(); ** Get 1st char of this file */ zzskip(); /* Skip the Eof (@) char i.e continue */ } } >> [\t\ ]+ << NLA = 56; zzskip(); >> \n|\r|\n\r << NLA = 57; zzline++; zzskip(); >> \[ << NLA = 58; zzmode(ACTIONS); zzmore(); istackreset(); pushint(']'); >> \<\< << NLA = 59; action_file=CurFile; action_line=zzline; zzmode(ACTIONS); zzmore(); istackreset(); pushint('>'); >> \" << NLA = 60; zzmode(STRINGS); zzmore(); >> /\* << NLA = 61; zzmode(COMMENTS); zzskip(); >> \*/ << NLA = 62; err("Missing /*; found dangling */"); zzskip(); >> // << NLA = 63; zzmode(CPP_COMMENTS); zzskip(); >> \>\> << NLA = 64; err("Missing <<; found dangling \>\>"); zzskip(); >> #header << NLA = Header; >> #tokdefs << NLA = Tokdef; >> : << NLA = LABEL; >> \{ << NLA = OPT; >> \+ << NLA = POS_CLOSURE; >> \* << NLA = CLOSURE; >> . << NLA = WILD; >> ? << NLA = PRED_OP; >> #\( << NLA = BT; >> \} << NLA = 80; >> class << NLA = 81; >> ! << NLA = 84; >> \< << NLA = 85; >> \> << NLA = 86; >> ; << NLA = 87; >> \| << NLA = 88; >> \( << NLA = 89; >> \) << NLA = 90; >> .. << NLA = 91; >> [a-z] [A-Za-z0-9_]* << NLA = NonTerm; >> [A-Z] [A-Za-z0-9_]* << NLA = Token; >> #[A-Za-z0-9_]* << NLA = 92; warn(eMsg1("unknown meta-op: %s",LATEXT(1))); zzskip(); >> %%STRINGS @ << NLA = Eof; >> \" << NLA = RExpr; zzmode(START); >> \n|\r|\r\n << NLA = 3; /* MR16a */ zzline++; warn("eoln found in string"); zzskip(); >> \\~[] << NLA = 4; zzmore(); >> ~[\n\r\"\\]+ << NLA = 5; zzmore(); >> %%ACTION_STRINGS @ << NLA = Eof; >> \" << NLA = 6; zzmode(ACTIONS); zzmore(); >> \n|\r|\r\n << NLA = 7; /* MR16a */ zzline++; warn("eoln found in string (in user action)"); zzskip(); >> \\~[] << NLA = 8; zzmore(); >> ~[\n\r\"\\]+ << NLA = 9; zzmore(); >> %%ACTION_CHARS @ << NLA = Eof; >> ' << NLA = 10; zzmode(ACTIONS); zzmore(); >> \n|\r|\r\n << NLA = 11; /* MR16a */ zzline++; warn("eoln found in char literal (in user action)"); zzskip(); >> \\~[] << NLA = 12; zzmore(); >> ~[\n\r'\\]+ << NLA = 13; zzmore(); >> %%ACTION_COMMENTS @ << NLA = Eof; >> \*/ << NLA = 14; zzmode(ACTIONS); zzmore(); >> \* << NLA = 15; zzmore(); >> \n|\r|\r\n << NLA = 16; zzline++; zzmore(); >> ~[\n\r\*]+ << NLA = 17; zzmore(); >> %%ACTION_CPP_COMMENTS @ << NLA = Eof; >> \n|\r|\r\n << NLA = 18; zzline++; zzmode(ACTIONS); zzmore(); >> ~[\n\r]+ << NLA = 19; zzmore(); >> %%CPP_COMMENTS @ << NLA = Eof; >> \n|\r|\r\n << NLA = 20; zzline++; zzmode(START); zzskip(); >> ~[\n\r]+ << NLA = 21; zzskip(); >> %%COMMENTS @ << NLA = Eof; >> \*/ << NLA = 22; zzmode(START); zzskip(); >> \* << NLA = 23; zzskip(); >> \n|\r|\r\n << NLA = 24; zzline++; zzskip(); >> ~[\n\r\*]+ << NLA = 25; zzskip(); >> %%REFVAR_SCARF @ << NLA = Eof; >> ~[\)]+ \) << NLA = 26; { RefVarRec *rf; zzskip(); zzbegexpr[strlen(zzbegexpr)-1] = '\0'; rf=refVarRec(zzbegexpr); list_add(&AllRefVars, rf); list_add(&RefVars, rf); zzmode(ACTIONS); zzmore(); zzreplstr(""); } >> %%ACTIONS @ << NLA = Eof; >> \>\> << NLA = Action; /* these do not nest */ zzmode(START); NLATEXT[0] = ' '; NLATEXT[1] = ' '; zzbegexpr[0] = ' '; zzbegexpr[1] = ' '; if ( zzbufovf ) { found_error = 1; err( eMsgd("action buffer overflow; size %d",ZZLEXBUFSIZE)); } >> \] << NLA = PassAction; if ( topint() == ']' ) { popint(); if ( istackempty() ) /* terminate action */ { zzmode(START); NLATEXT[0] = ' '; zzbegexpr[0] = ' '; if ( zzbufovf ) { found_error = 1; err( eMsgd("parameter buffer overflow; size %d",ZZLEXBUFSIZE)); } } else { /* terminate #[..] */ zzreplstr(")"); zzmore(); } } else if ( topint() == '|' ) { /* end of simple [...] */ popint(); zzmore(); } else zzmore(); >> \n|\r|\r\n << NLA = 29; zzline++; zzmore(); >> \> << NLA = 30; zzmore(); >> #[_a-zA-Z][_a-zA-Z0-9]* << NLA = 31; if ( !(strcmp(zzbegexpr, "#ifdef")==0 || strcmp(zzbegexpr, "#else")==0 || strcmp(zzbegexpr, "#endif")==0 || strcmp(zzbegexpr, "#ifndef")==0 || strcmp(zzbegexpr, "#if")==0 || strcmp(zzbegexpr, "#define")==0 || strcmp(zzbegexpr, "#pragma")==0 || strcmp(zzbegexpr, "#undef")==0 || strcmp(zzbegexpr, "#import")==0 || strcmp(zzbegexpr, "#line")==0 || strcmp(zzbegexpr, "#include")==0 || strcmp(zzbegexpr, "#error")==0) ) { static char buf[100]; if ( !transform ) { warn("#id used in nontransform mode; # ignored"); sprintf(buf, "%s", zzbegexpr+1); } else { if ( CurRule==NULL ) {warn("#id used in action outside of rule; ignored");} else if ( strcmp(zzbegexpr+1,CurRule)==0 ) strcpy(buf, "(*_result)"); } zzreplstr(buf); } zzmore(); >> #\[\] << NLA = 32; if ( GenCPP ) zzreplstr("new SORAST"); else zzreplstr("ast_empty_node()"); zzmore(); >> #\(\) << NLA = 33; zzreplstr("NULL"); zzmore(); >> #\[ << NLA = 34; pushint(']'); if ( GenCPP ) zzreplstr("new SORAST("); else zzreplstr("ast_node("); zzmore(); >> #\( << NLA = 35; pushint('}'); if ( GenCPP ) zzreplstr("PCCTS_AST::make("); else zzreplstr("ast_make("); zzmore(); >> # << NLA = 36; zzmore(); >> \) << NLA = 37; if ( istackempty() ) zzmore(); else if ( topint()==')' ) { popint(); } else if ( topint()=='}' ) { popint(); /* terminate #(..) */ zzreplstr(", NULL)"); } zzmore(); >> \[ << NLA = 38; pushint('|'); /* look for '|' to terminate simple [...] */ zzmore(); >> \( << NLA = 39; pushint(')'); zzmore(); >> \\\] << NLA = 40; zzreplstr("]"); zzmore(); >> \\\) << NLA = 41; zzreplstr(")"); zzmore(); >> \\> << NLA = 42; zzreplstr(">"); zzmore(); >> ' << NLA = 43; zzmode(ACTION_CHARS); zzmore(); >> \" << NLA = 44; zzmode(ACTION_STRINGS); zzmore(); >> \\# << NLA = 45; zzreplstr("#"); zzmore(); >> \\~[\]\)>#] << NLA = 46; zzmore(); >> / << NLA = 47; zzmore(); >> /\* << NLA = 48; zzmode(ACTION_COMMENTS); zzmore(); >> \*/ << NLA = 49; err("Missing /*; found dangling */ in action"); zzmore(); >> // << NLA = 50; zzmode(ACTION_CPP_COMMENTS); zzmore(); >> \@\( << NLA = 51; zzmode(REFVAR_SCARF); zzmore(); zzreplstr(""); >> \@ << NLA = 52; zzmore(); if ( !GenCPP ) zzreplstr("_parser->"); >> [a-zA-Z_]+\( << NLA = 53; if ( (GenCPP && strcmp(zzbegexpr,"ast_scan(")==0) || (!GenCPP && strcmp(zzbegexpr,"ast_scan(")==0) ) { char *args=scarf_to_end_of_func_call(); zzreplstr(cvt_token_str(zzbegexpr, args)); zzmore(); } else { pushint(')'); zzmore(); } >> [a-zA-Z_]+ << NLA = 54; zzmore(); >> ~[a-zA-Z_\n\r\)\(\\#\>\]\[\"'/\@]+ << NLA = 55; zzmore(); >> %%TOK_DEF_COMMENTS @ << NLA = Eof; >> \*/ << NLA = 93; zzmode(PARSE_ENUM_FILE); zzmore(); >> \* << NLA = 94; zzmore(); >> \n|\r|\r\n << NLA = 95; zzline++; zzmore(); >> ~[\n\r\*]+ << NLA = 96; zzmore(); >> %%TOK_DEF_CPP_COMMENTS @ << NLA = Eof; >> \n|\r|\r\n << NLA = 97; zzline++; zzmode(PARSE_ENUM_FILE); zzskip(); >> ~[\n\r]+ << NLA = 98; zzskip(); >> %%PARSE_ENUM_FILE @ << NLA = Eof; /*zzmode(START); zzskip();*/ >> [\t\ ]+ << NLA = 99; zzskip(); >> \n|\r|\r\n << NLA = 100; zzline++; zzskip(); >> // << NLA = 101; zzmode(TOK_DEF_CPP_COMMENTS); zzmore(); >> /\* << NLA = 102; zzmode(TOK_DEF_COMMENTS); zzmore(); >> #ifndef << NLA = 103; >> #ifdef << NLA = 104; zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); >> #else << NLA = 105; zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); >> #define << NLA = 106; >> #endif << NLA = 107; zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); >> enum << NLA = 110; >> \{ << NLA = 111; >> = << NLA = 112; >> , << NLA = 113; >> DLGminToken << NLA = 114; >> DLGmaxToken << NLA = 115; >> \} << NLA = 116; >> ; << NLA = 117; >> [0-9]+ << NLA = INT; >> [a-zA-Z_][_a-zA-Z0-9]* << NLA = ID; >> %% gtkwave-3.3.86/contrib/pccts/sorcerer/globals.c0000664000175000017500000000616313166335473021001 0ustar bybellbybell/* * globals.c * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public * domain. An individual or company may do whatever they wish with * source code distributed with SORCERER or the code generated by * SORCERER, including the incorporation of SORCERER, or its output, into * commerical software. * * We encourage users to develop software with SORCERER. However, we do * ask that credit is given to us for developing SORCERER. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like SORCERER and have developed a nice tool with the * output, please mention that you developed it using SORCERER. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * SORCERER 1.00B24 * Terence Parr * Parr Research Corporation * With AHPCRC, University of Minnesota * 1992-2001 */ #include "stdpccts.h" char *VersionNumber = "13333"; /* mrxxx */ char *VersionText = "13333"; /* mrxxx */ char *FileStr[MaxNumFiles];/* Ptr to array of file names on command-line */ int NumFiles=0; /* current grammar file number */ int action_file; /* used to track start of action */ int action_line; int CurFile= -1; /* Index into FileStr table */ char *CurRule=NULL; /* Pointer to current rule name */ char *CurRetDef=NULL; /* Pointer to current return type definition */ char *CurParmDef=NULL; /* Pointer to current parameter definition */ FILE *output=NULL; /* current parser output file */ FILE *input=NULL; /* current grammar input file */ Entry **symbols; /* both tokens and nonterminals */ int token_table_size = 1000; char **token_dict=NULL; int token_type = 1; /* used only if #tokdefs it not used */ int end_of_input = 0; int epsilon = 0; int last_valid_token = 0; int DumpIR = 0; char *OutputDirectory = TopDirectory; ListNode *before_actions = NULL, *after_actions = NULL, *class_actions = NULL; char translator[MaxFileName+1]; char tokdefs_file[MaxFileName+1]; char *header_action = NULL; AST *rules=NULL; int print_guts = 0; int transform = 0; /* Don't assume a transformation */ int found_guess_block = 0; char *def_token_file=NULL; int def_tokens=0; ListNode *token_list = NULL; int found_error=0; set referenced_tokens = set_init; int wild_card = 0; int UserDefdTokens=0; int Inline = 0; char *Prefix=""; FILE *ProtoFILE = NULL; char *GenProtoFile = NULL; ListNode *RefVars = NULL; ListNode *AllRefVars = NULL; char CurRefVarType[MaxAtom+1]; char CurRefVarLabel[MaxAtom+1]; char CurClassName[MaxAtom+1]=""; int GenCPP = 0; int NoCtor = 0; /* MR23 */ #if defined(__STDC__) || defined(__cplusplus) || defined(__USE_PROTOS) int GenAnsiProtos=1; /* Gen both if both Protos are on */ int GenKRProtos=0; #else int GenAnsiProtos=0; int GenKRProtos=1; #endif gtkwave-3.3.86/contrib/pccts/sorcerer/hash.c0000664000175000017500000001137113166335473020276 0ustar bybellbybell/* * hash.c -- Manage hash tables. * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public * domain. An individual or company may do whatever they wish with * source code distributed with SORCERER or the code generated by * SORCERER, including the incorporation of SORCERER, or its output, into * commerical software. * * We encourage users to develop software with SORCERER. However, we do * ask that credit is given to us for developing SORCERER. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like SORCERER and have developed a nice tool with the * output, please mention that you developed it using SORCERER. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * SORCERER 1.00B * Terence Parr * AHPCRC, University of Minnesota * 1992-2001 */ #include #include "pcctscfg.h" #include "hash.h" #ifdef __USE_PROTOS #include #else #ifdef VAXC #include #else #include #endif #endif #include /* OSX warning fix */ #define GR_INT int #define StrSame 0 #define fatal(err) \ {fprintf(stderr, "%s(%d):", __FILE__, __LINE__); \ fprintf(stderr, " %s\n", err); exit(1);} #define require(expr, err) {if ( !(expr) ) fatal(err);} static unsigned size = HashTableSize; static char *strings = NULL; static char *strp; static unsigned strsize = StrTableSize; /* create the hash table and string table for terminals (string table only once) */ Entry ** #ifdef __USE_PROTOS newHashTable( void ) #else newHashTable( ) #endif { Entry **table; table = (Entry **) calloc(size, sizeof(Entry *)); require( table != NULL, "cannot allocate hash table"); if ( strings == NULL ) { strings = (char *) calloc(strsize, sizeof(char)); require( strings != NULL, "cannot allocate string table"); strp = strings; } return table; } /* Given a table, add 'rec' with key 'key' (add to front of list). return ptr to entry */ Entry * #ifdef __USE_PROTOS hash_add( Entry **table, char *key, Entry *rec ) #else hash_add( table, key, rec ) Entry **table; char *key; Entry *rec; #endif { unsigned h=0; char *p=key; /* extern Entry *Globals; MR20 G. Hobbelt unused reference */ require(table!=NULL && key!=NULL && rec!=NULL, "add: invalid addition"); Hash(p,h,size); rec->next = table[h]; /* Add to singly-linked list */ table[h] = rec; return rec; } /* Return ptr to 1st entry found in table under key (return NULL if none found) */ Entry * #ifdef __USE_PROTOS hash_get( Entry **table, char *key ) #else hash_get( table, key ) Entry **table; char *key; #endif { unsigned h=0; char *p=key; Entry *q; require(table!=NULL && key!=NULL, "get: invalid table and/or key"); Hash(p,h,size); for (q = table[h]; q != NULL; q = q->next) { if ( strcmp(key, q->str) == StrSame ) return( q ); } return( NULL ); } void #ifdef __USE_PROTOS hashStat( Entry **table ) #else hashStat( table ) Entry **table; #endif { static unsigned short count[20]; int i,n=0,low=0, hi=0; Entry **p; float avg=0.0; for (i=0; i<20; i++) count[i] = 0; for (p=table; p<&(table[size]); p++) { Entry *q = *p; int len; if ( q != NULL && low==0 ) low = p-table; len = 0; if ( q != NULL ) fprintf(stderr, "[%d]", (GR_INT)(p-table)); while ( q != NULL ) { len++; n++; fprintf(stderr, " %s", q->str); q = q->next; if ( q == NULL ) fprintf(stderr, "\n"); } count[len]++; if ( *p != NULL ) hi = p-table; } fprintf(stderr, "Storing %d recs used %d hash positions out of %d\n", n, size-count[0], size); fprintf(stderr, "%f %% utilization\n", ((float)(size-count[0]))/((float)size)); for (i=0; i<20; i++) { if ( count[i] != 0 ) { avg += (((float)(i*count[i]))/((float)n)) * i; fprintf(stderr, "Bucket len %d == %d (%f %% of recs)\n", i, count[i], ((float)(i*count[i]))/((float)n)); } } fprintf(stderr, "Avg bucket length %f\n", avg); fprintf(stderr, "Range of hash function: %d..%d\n", low, hi); } /* Add a string to the string table and return a pointer to it. * Bump the pointer into the string table to next avail position. */ char * #ifdef __USE_PROTOS mystrdup( char *s ) #else mystrdup( s ) char *s; #endif { char *start=strp; require(s!=NULL, "mystrdup: NULL string"); while ( *s != '\0' ) { require( strp <= &(strings[strsize-2]), "string table overflow\nIncrease StrTableSize in hash.h and recompile hash.c\n"); *strp++ = *s++; } *strp++ = '\0'; return( start ); } gtkwave-3.3.86/contrib/pccts/sorcerer/SorcererMSVC50.dsp0000664000175000017500000001400213166335473022333 0ustar bybellbybell# Microsoft Developer Studio Project File - Name="Sorcerer" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 5.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=Sorcerer - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "SorcererMSVC50.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "SorcererMSVC50.mak" CFG="Sorcerer - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "Sorcerer - Win32 Release" (based on\ "Win32 (x86) Console Application") !MESSAGE "Sorcerer - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "Sorcerer - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "." # PROP Intermediate_Dir "." # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /W3 /O2 /I "." /I "..\h" /I "..\support\set" /D "__STDC__" /D "NDEBUG" /D "LONGFILENAMES" /D "PC" /D ZZLEXBUFSIZE=65536 /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FD /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"./Sorcerer.exe" # Begin Special Build Tool SOURCE=$(InputPath) PostBuild_Desc=Update executables in BIN directory PostBuild_Cmds=rename ..\bin\Sorcerer.exe Sorcerer_old.exe \ copy ..\Sorcerer\Sorcerer.exe ..\bin\ # End Special Build Tool !ELSEIF "$(CFG)" == "Sorcerer - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "." # PROP Intermediate_Dir "." # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /W3 /Gm /Zi /Od /I "." /I "..\h" /I "..\support\set" /D "__STDC__" /D "LONGFILENAMES" /D "PC" /D ZZLEXBUFSIZE=65536 /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FR /FD /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"./Sorcerer.exe" /pdbtype:sept # Begin Special Build Tool SOURCE=$(InputPath) PostBuild_Desc=Update executables in BIN directory PostBuild_Cmds=rename ..\bin\Sorcerer.exe Sorcerer_old.exe \ copy ..\Sorcerer\Sorcerer.exe ..\bin\ # End Special Build Tool !ENDIF # Begin Target # Name "Sorcerer - Win32 Release" # Name "Sorcerer - Win32 Debug" # Begin Source File SOURCE=.\cpp.c # End Source File # Begin Source File SOURCE=.\err.c # End Source File # Begin Source File SOURCE=.\gen.c # End Source File # Begin Source File SOURCE=.\globals.c # End Source File # Begin Source File SOURCE=.\hash.c # End Source File # Begin Source File SOURCE=.\look.c # End Source File # Begin Source File SOURCE=.\main.c # End Source File # Begin Source File SOURCE=.\scan.c # End Source File # Begin Source File SOURCE=..\support\set\set.c # End Source File # Begin Source File SOURCE=.\sor.c # End Source File # Begin Source File SOURCE=.\sor.g !IF "$(CFG)" == "Sorcerer - Win32 Release" # Begin Custom Build - Generating Parser InputPath=.\sor.g InputName=sor BuildCmds= \ ..\bin\antlr -gh -k 2 -gt $(InputName).g \ ..\bin\dlg -C2 parser.dlg scan.c \ "parser.dlg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "mode.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "stdpccts.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "sor.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "scan.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "err.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) # End Custom Build !ELSEIF "$(CFG)" == "Sorcerer - Win32 Debug" # Begin Custom Build - Generating Parser InputPath=.\sor.g InputName=sor BuildCmds= \ ..\bin\antlr -gh -k 2 -gt $(InputName).g \ ..\bin\dlg -C2 parser.dlg scan.c \ "parser.dlg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "mode.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "stdpccts.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "sor.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "scan.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "err.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) # End Custom Build !ENDIF # End Source File # End Target # End Project gtkwave-3.3.86/contrib/pccts/sorcerer/Makefile.am0000664000175000017500000000174613166335473021250 0ustar bybellbybell## -*- makefile -*- ## SUBDIRS= h lib test testcpp #PCCTS=.. #BIN = $(PCCTS)/bin #ANTLR = $(BIN)/antlr #DLG = $(BIN)/dlg #PCCTS_H = $(PCCTS)/h #SET = $(PCCTS)/support/set AM_CFLAGS = -I$(srcdir)/h -I$(srcdir) -I$(srcdir)/../h \ -I$(srcdir)/../support/set -DZZLEXBUFSIZE=32000 #AFLAGS = -gh -k 2 -gt #DFLAGS = -C2 #GRM = sor.g #GENHFILES = tokens.h mode.h stdpccts.h noinst_PROGRAMS= sor sor_SOURCES= \ cpp.c err.c gen.c globals.c hash.c hash.h look.c \ main.c mode.h proto.h scan.c $(srcdir)/../support/set/set.c \ sor.c sor.h stdpccts.h sym.h tokens.h #sor.c stdpccts.h parser.dlg tokens.h err.c : sor.g # $(ANTLR) $(AFLAGS) sor.g #scan.c mode.h : parser.dlg # $(DLG) $(DFLAGS) parser.dlg scan.c #scrub: # rm -f *.o core $(GENHFILES) parser.dlg scan.c err.c sor.c sor EXTRA_DIST= \ README SorcererMSVC50.dsp SorcererMSVC50.dsw SorcererMSVC50.mak \ SorcererMSVC60.dsp SorcererMSVC60.dsw UPDATES makefile.VMS \ makefile1 msvc.dsw parser.dlg sor.g sor.r sor68K.make \ sorPPC.make gtkwave-3.3.86/contrib/pccts/sorcerer/hash.h0000664000175000017500000000376213166335473020310 0ustar bybellbybell/* * hash.h -- define hash table entries, sizes, hash function... * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public * domain. An individual or company may do whatever they wish with * source code distributed with SORCERER or the code generated by * SORCERER, including the incorporation of SORCERER, or its output, into * commerical software. * * We encourage users to develop software with SORCERER. However, we do * ask that credit is given to us for developing SORCERER. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like SORCERER and have developed a nice tool with the * output, please mention that you developed it using SORCERER. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * SORCERER 1.00B * Terence Parr * AHPCRC, University of Minnesota * 1992-2001 */ /* H a s h T a b l e S t u f f */ #ifndef __sorcerer_hash_h__ #define __sorcerer_hash_h__ #include "pcctscfg.h" /* MR20 G. Hobbelt - Use __USE_PROTOS */ #ifndef HashTableSize #define HashTableSize 553 #endif #ifndef StrTableSize #define StrTableSize 40000 #endif typedef struct _entry { /* Minimum hash table entry -- superclass */ char *str; struct _entry *next; } Entry; /* Hash 's' using 'size', place into h (s is modified) */ #define Hash(s,h,size) \ {while ( *s != '\0' ) h = (h<<1) + *s++; \ h %= size;} #ifdef __USE_PROTOS Entry *hash_get(Entry **, char *), **newHashTable(void), *hash_add(Entry **, char *, Entry *); char *mystrdup(char *); void hashStat( Entry ** ); #else Entry *hash_get(), **newHashTable(), *hash_add(); char *mystrdup(); void hashStat(); #endif #endif gtkwave-3.3.86/contrib/pccts/sorcerer/mode.h0000664000175000017500000000046413166335473020305 0ustar bybellbybell#define START 0 #define STRINGS 1 #define ACTION_STRINGS 2 #define ACTION_CHARS 3 #define ACTION_COMMENTS 4 #define ACTION_CPP_COMMENTS 5 #define CPP_COMMENTS 6 #define COMMENTS 7 #define REFVAR_SCARF 8 #define ACTIONS 9 #define TOK_DEF_COMMENTS 10 #define TOK_DEF_CPP_COMMENTS 11 #define PARSE_ENUM_FILE 12 gtkwave-3.3.86/contrib/pccts/sorcerer/SorcererMSVC50.dsw0000664000175000017500000000104113166335473022341 0ustar bybellbybellMicrosoft Developer Studio Workspace File, Format Version 5.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "Sorcerer"=.\SorcererMSVC50.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### gtkwave-3.3.86/contrib/pccts/sorcerer/test/0000775000175000017500000000000013166335473020163 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/sorcerer/test/test7/0000775000175000017500000000000013166335473021231 5ustar bybellbybellgtkwave-3.3.86/contrib/pccts/sorcerer/test/test7/Makefile.in0000664000175000017500000003067413166335473023310 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = contrib/pccts/sorcerer/test/test7 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/pccts/sorcerer/test/test7/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/pccts/sorcerer/test/test7/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/contrib/pccts/sorcerer/test/test7/Makefile.am0000664000175000017500000000004213166335473023261 0ustar bybellbybell## -*- makefile -*- ## ## FIXME gtkwave-3.3.86/contrib/pccts/sorcerer/test/Makefile.am0000664000175000017500000000245513166335473022225 0ustar bybellbybell## -*- makefile -*- ## ## FIXME SUBDIRS= test7 #PCCTS=../.. #BIN=$(PCCTS)/bin #SOR = $(BIN)/sor #CFLAGS = -I. -I../../h -I../h -I../lib -g -ansi #DFLAGS = -C2 -i #SRC = test.c #OBJ = test.o #SRC2 = test2.c #OBJ2 = test2.o ../lib/astlib.o ../lib/sorlist.o #SRC3 = test3.c #OBJ3 = test3.o ../lib/astlib.o ../lib/sorlist.o #SRC4 = test4.c #OBJ4 = test4.o #SRC5 = test5.c #OBJ5 = test5.o ../lib/astlib.o ../lib/sorlist.o #SRC6 = test6.c #OBJ6 = test6.o ../lib/astlib.o ../lib/sorlist.o ##CC=gcc #CC=cc #TEST_SPAWN = test.c test2.c test3.c test4.c test5.c #test1: $(OBJ) $(SRC) # $(CC) -o t $(CFLAGS) $(OBJ) #test.c : test.sor # $(SOR) -funcs both test.sor #test2: $(OBJ2) $(SRC2) # $(CC) -o t2 $(CFLAGS) $(OBJ2) #test2.c : test2.sor # $(SOR) -funcs KR test2.sor #test3: $(OBJ3) $(SRC3) # $(CC) -o t3 $(CFLAGS) $(OBJ3) #test3.c : test3.sor # $(SOR) -transform -funcs KR test3.sor #test4: $(OBJ4) $(SRC4) # $(CC) -o t4 $(CFLAGS) $(OBJ4) #test4.c : test4.sor # $(SOR) -funcs KR test4.sor #test5: $(OBJ5) $(SRC5) # $(CC) -o t5 $(CFLAGS) $(OBJ5) #test5.c : test5.sor # $(SOR) -transform -funcs KR test5.sor #test6: $(OBJ6) $(SRC6) # $(CC) -o t6 $(CFLAGS) $(OBJ6) #test6.c : test6.sor # $(SOR) -def-tokens-file tokens6.h -transform -funcs KR test6.sor #scrub: # rm -rf *.o core $(TEST_SPAWN) #clean: # rm -rf *.o core gtkwave-3.3.86/contrib/pccts/sorcerer/test/Makefile.in0000664000175000017500000004763213166335473022244 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = contrib/pccts/sorcerer/test DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = test7 all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/pccts/sorcerer/test/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/pccts/sorcerer/test/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-tags distdir dvi dvi-am \ html html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am #PCCTS=../.. #BIN=$(PCCTS)/bin #SOR = $(BIN)/sor #CFLAGS = -I. -I../../h -I../h -I../lib -g -ansi #DFLAGS = -C2 -i #SRC = test.c #OBJ = test.o #SRC2 = test2.c #OBJ2 = test2.o ../lib/astlib.o ../lib/sorlist.o #SRC3 = test3.c #OBJ3 = test3.o ../lib/astlib.o ../lib/sorlist.o #SRC4 = test4.c #OBJ4 = test4.o #SRC5 = test5.c #OBJ5 = test5.o ../lib/astlib.o ../lib/sorlist.o #SRC6 = test6.c #OBJ6 = test6.o ../lib/astlib.o ../lib/sorlist.o #CC=cc #TEST_SPAWN = test.c test2.c test3.c test4.c test5.c #test1: $(OBJ) $(SRC) # $(CC) -o t $(CFLAGS) $(OBJ) #test.c : test.sor # $(SOR) -funcs both test.sor #test2: $(OBJ2) $(SRC2) # $(CC) -o t2 $(CFLAGS) $(OBJ2) #test2.c : test2.sor # $(SOR) -funcs KR test2.sor #test3: $(OBJ3) $(SRC3) # $(CC) -o t3 $(CFLAGS) $(OBJ3) #test3.c : test3.sor # $(SOR) -transform -funcs KR test3.sor #test4: $(OBJ4) $(SRC4) # $(CC) -o t4 $(CFLAGS) $(OBJ4) #test4.c : test4.sor # $(SOR) -funcs KR test4.sor #test5: $(OBJ5) $(SRC5) # $(CC) -o t5 $(CFLAGS) $(OBJ5) #test5.c : test5.sor # $(SOR) -transform -funcs KR test5.sor #test6: $(OBJ6) $(SRC6) # $(CC) -o t6 $(CFLAGS) $(OBJ6) #test6.c : test6.sor # $(SOR) -def-tokens-file tokens6.h -transform -funcs KR test6.sor #scrub: # rm -rf *.o core $(TEST_SPAWN) #clean: # rm -rf *.o core # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/contrib/pccts/sorcerer/sorPPC.make0000664000175000017500000000430713166335473021215 0ustar bybellbybell# File: sorPPC.make # Target: sorPPC # Sources: cpp.c # err.c # gen.c # globals.c # hash.c # look.c # main.c # scan.c # sor.c # ::support:set:set.c # Created: Monday, May 18, 1998 12:20:50 AM # Author: Kenji Tanaka MAKEFILE = sorPPC.make ¥MondoBuild¥ = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified Includes = ¶ -i "::h:" ¶ -i "::support:set:" Sym¥PPC = ObjDir¥PPC = :Obj: PPCCOptions = {Includes} {Sym¥PPC} -w off -d __STDC__ -d MPW -d USER_ZZSYN Objects¥PPC = ¶ "{ObjDir¥PPC}cpp.c.x" ¶ "{ObjDir¥PPC}err.c.x" ¶ "{ObjDir¥PPC}gen.c.x" ¶ "{ObjDir¥PPC}globals.c.x" ¶ "{ObjDir¥PPC}hash.c.x" ¶ "{ObjDir¥PPC}look.c.x" ¶ "{ObjDir¥PPC}main.c.x" ¶ "{ObjDir¥PPC}scan.c.x" ¶ "{ObjDir¥PPC}sor.c.x" ¶ "{ObjDir¥PPC}set.c.x" sorPPC ÄÄ {¥MondoBuild¥} {Objects¥PPC} PPCLink ¶ -o {Targ} {Sym¥PPC} ¶ {Objects¥PPC} ¶ -t 'MPST' ¶ -c 'MPS ' ¶ "{SharedLibraries}InterfaceLib" ¶ "{SharedLibraries}StdCLib" ¶ "{SharedLibraries}MathLib" ¶ "{PPCLibraries}StdCRuntime.o" ¶ "{PPCLibraries}PPCCRuntime.o" ¶ "{PPCLibraries}PPCToolLibs.o" "{ObjDir¥PPC}cpp.c.x" Ä {¥MondoBuild¥} cpp.c {PPCC} cpp.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}err.c.x" Ä {¥MondoBuild¥} err.c {PPCC} err.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}gen.c.x" Ä {¥MondoBuild¥} gen.c {PPCC} gen.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}globals.c.x" Ä {¥MondoBuild¥} globals.c {PPCC} globals.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}hash.c.x" Ä {¥MondoBuild¥} hash.c {PPCC} hash.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}look.c.x" Ä {¥MondoBuild¥} look.c {PPCC} look.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}main.c.x" Ä {¥MondoBuild¥} main.c {PPCC} main.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}scan.c.x" Ä {¥MondoBuild¥} scan.c {PPCC} scan.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}sor.c.x" Ä {¥MondoBuild¥} sor.c {PPCC} sor.c -o {Targ} {PPCCOptions} "{ObjDir¥PPC}set.c.x" Ä {¥MondoBuild¥} "::support:set:set.c" {PPCC} "::support:set:set.c" -o {Targ} {PPCCOptions} sorPPC ÄÄ sor.r Rez sor.r -o sorPPC -a Install Ä sorPPC Duplicate -y sorPPC "{MPW}"Tools:sor gtkwave-3.3.86/contrib/pccts/sorcerer/Makefile.in0000664000175000017500000006047713166335473021267 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : noinst_PROGRAMS = sor$(EXEEXT) subdir = contrib/pccts/sorcerer DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_sor_OBJECTS = cpp.$(OBJEXT) err.$(OBJEXT) gen.$(OBJEXT) \ globals.$(OBJEXT) hash.$(OBJEXT) look.$(OBJEXT) main.$(OBJEXT) \ scan.$(OBJEXT) set.$(OBJEXT) sor.$(OBJEXT) sor_OBJECTS = $(am_sor_OBJECTS) sor_LDADD = $(LDADD) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(sor_SOURCES) DIST_SOURCES = $(sor_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = h lib test testcpp #PCCTS=.. #BIN = $(PCCTS)/bin #ANTLR = $(BIN)/antlr #DLG = $(BIN)/dlg #PCCTS_H = $(PCCTS)/h #SET = $(PCCTS)/support/set AM_CFLAGS = -I$(srcdir)/h -I$(srcdir) -I$(srcdir)/../h \ -I$(srcdir)/../support/set -DZZLEXBUFSIZE=32000 sor_SOURCES = \ cpp.c err.c gen.c globals.c hash.c hash.h look.c \ main.c mode.h proto.h scan.c $(srcdir)/../support/set/set.c \ sor.c sor.h stdpccts.h sym.h tokens.h #sor.c stdpccts.h parser.dlg tokens.h err.c : sor.g # $(ANTLR) $(AFLAGS) sor.g #scan.c mode.h : parser.dlg # $(DLG) $(DFLAGS) parser.dlg scan.c #scrub: # rm -f *.o core $(GENHFILES) parser.dlg scan.c err.c sor.c sor EXTRA_DIST = \ README SorcererMSVC50.dsp SorcererMSVC50.dsw SorcererMSVC50.mak \ SorcererMSVC60.dsp SorcererMSVC60.dsw UPDATES makefile.VMS \ makefile1 msvc.dsw parser.dlg sor.g sor.r sor68K.make \ sorPPC.make all: all-recursive .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/pccts/sorcerer/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/pccts/sorcerer/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) sor$(EXEEXT): $(sor_OBJECTS) $(sor_DEPENDENCIES) $(EXTRA_sor_DEPENDENCIES) @rm -f sor$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sor_OBJECTS) $(sor_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/err.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/globals.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/look.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scan.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/set.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sor.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` set.o: $(srcdir)/../support/set/set.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT set.o -MD -MP -MF $(DEPDIR)/set.Tpo -c -o set.o `test -f '$(srcdir)/../support/set/set.c' || echo '$(srcdir)/'`$(srcdir)/../support/set/set.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/set.Tpo $(DEPDIR)/set.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/../support/set/set.c' object='set.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o set.o `test -f '$(srcdir)/../support/set/set.c' || echo '$(srcdir)/'`$(srcdir)/../support/set/set.c set.obj: $(srcdir)/../support/set/set.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT set.obj -MD -MP -MF $(DEPDIR)/set.Tpo -c -o set.obj `if test -f '$(srcdir)/../support/set/set.c'; then $(CYGPATH_W) '$(srcdir)/../support/set/set.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../support/set/set.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/set.Tpo $(DEPDIR)/set.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/../support/set/set.c' object='set.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o set.obj `if test -f '$(srcdir)/../support/set/set.c'; then $(CYGPATH_W) '$(srcdir)/../support/set/set.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../support/set/set.c'; fi` # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(PROGRAMS) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-noinstPROGRAMS \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/contrib/pccts/sorcerer/sor.c0000664000175000017500000013406313166335473020162 0ustar bybellbybell/* * A n t l r T r a n s l a t i o n H e a d e r * * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001 * Purdue University Electrical Engineering * With AHPCRC, University of Minnesota * ANTLR Version 1.33MR33 * * ../bin/antlr -gh -k 2 -gt sor.g * */ #define ANTLR_VERSION 13333 #include "pcctscfg.h" #include "pccts_stdio.h" /* 23-Sep-97 thm Accomodate user who needs to redefine ZZLEXBUFSIZE */ #ifndef ZZLEXBUFSIZE #define ZZLEXBUFSIZE 8000 #endif #include "pcctscfg.h" /* MR20 G. Hobbelt __USE_PROTOS #define */ #include "charbuf.h" #include "hash.h" #include "set.h" #include "sor.h" #define AST_FIELDS \ int token; char text[MaxAtom+1], label[MaxRuleName+1]; \ char *action; /* if action node, here is ptr to it */ \ char in,out; \ char init_action; /* set if Action and 1st action of alt */ \ int file; int line; /* set for BLOCK, ALT, nonterm nodes */ \ int upper_range; /* only if T1..T2 found */ \ GLA *start_state; /* ptr into GLA for this block */ \ int no_copy; /* copy input ptr to output ptr? */ \ ListNode *refvars; /* any ref vars defined for this rule */ \ unsigned char is_root; /* this token is a root #( A ... ) */ #define zzcr_ast(node, cur, _tok, _text) \ {(node)->token=_tok; strncpy((node)->text, _text,MaxAtom);} #define USER_ZZSYN #define zzAST_DOUBLE extern int define_num; #define LL_K 2 #define GENAST #include "ast.h" #define zzSET_SIZE 16 #include "antlr.h" #include "tokens.h" #include "dlgdef.h" #include "mode.h" /* MR23 In order to remove calls to PURIFY use the antlr -nopurify option */ #ifndef PCCTS_PURIFY #define PCCTS_PURIFY(r,s) memset((char *) &(r),'\0',(s)); #endif #include "ast.c" zzASTgvars ANTLR_INFO /* MR20 G. Hobbelt Fix for Borland C++ 4.x & 5.x compiling with ALL warnings enabled */ #if defined(__TURBOC__) #pragma warn -aus /* unused assignment of 'xxx' */ #endif #include "sym.h" #include "proto.h" void /* MR9 23-Sep-97 Eliminate complaint about no return value */ #ifdef __USE_PROTOS lisp( AST *tree, FILE *output ) #else lisp( tree, output ) AST *tree; FILE *output; #endif { while ( tree != NULL ) { if ( tree->down != NULL ) fprintf(output," ("); if ( tree->text[0]!='\0' ) { fprintf(output, " \""); if ( tree->label[0]!='\0' ) fprintf(output, "%s:", tree->label); switch ( tree->token ) { case OPT : case POS_CLOSURE : case CLOSURE : case PRED_OP : fprintf(output, "%s", tree->text); break; default : fprintf(output, "%s[%s]", zztokens[tree->token], tree->text); } fprintf(output, "\""); } else { fprintf(output, " %s", zztokens[tree->token]); } lisp(tree->down, output); if ( tree->down != NULL ) fprintf(output," )"); tree = tree->right; } } AST * #ifdef __USE_PROTOS zzmk_ast(AST *node, int token) #else zzmk_ast(node, token) AST *node; int token; #endif { node->token = token; return node; } AST * #ifdef __USE_PROTOS read_sor_desc(FILE *f) #else read_sor_desc(f) FILE *f; #endif { AST *root = NULL; zzline = 1; ANTLR(sordesc(&root), f); if ( found_error ) return NULL; if ( print_guts ) { fprintf(stderr, "Internal Represenation of Tree Grammar:\n"); lisp(root, stderr); fprintf(stderr, "\n"); } last_valid_token = token_type; end_of_input = token_type++;/* end of input token type is 1 + last real token */ epsilon = token_type++; /* epsilon token type is 2 + last real token */ wild_card = token_type++; /* wild_card_token is 3 + last real token */ token_association(end_of_input, "$"); token_association(epsilon, "[Ep]"); token_association(wild_card, "."); zzdouble_link(root, NULL, NULL); rules = root; if ( root!=NULL ) build_GLA(root); if ( print_guts ) { fprintf(stderr, "Internal Represenation of Grammar Lookahead Automaton:\n"); dump_GLAs(root); fprintf(stderr, "\n"); } return root; } void #ifdef __USE_PROTOS sordesc(AST**_root) #else sordesc(_root) AST **_root; #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { int he=0,to=0; { zzBLOCK(zztasp2); zzMake0; { for (;;) { if ( !((setwd1[LA(1)]&0x1))) break; if ( (LA(1)==Header) ) { header(zzSTR); zzlink(_root, &_sibling, &_tail); he++; } else { if ( (LA(1)==Tokdef) ) { tokdef(zzSTR); zzlink(_root, &_sibling, &_tail); to++; } else break; /* MR6 code for exiting loop "for sure" */ } zzLOOP(zztasp2); } zzEXIT(zztasp2); } } if ( he==0 && !Inline && !GenCPP ) warnNoFL("missing #header statement"); if ( he>1 ) warnNoFL("extra #header statement"); if ( to>1 ) warnNoFL("extra #tokdef statement"); { zzBLOCK(zztasp2); zzMake0; { while ( (LA(1)==Action) && (setwd1[LA(2)]&0x2) ) { zzmatch(Action); list_add(&before_actions, actiondup(LATEXT(1))); zzCONSUME; zzLOOP(zztasp2); } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==81) ) { class_def(zzSTR); zzlink(_root, &_sibling, &_tail); } else { if ( (setwd1[LA(1)]&0x4) ) { } else {zzFAIL(1,zzerr1,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { while ( (LA(1)==Action) && (setwd1[LA(2)]&0x8) ) { zzmatch(Action); if ( CurClassName[0]!='\0' ) list_add(&class_actions, actiondup(LATEXT(1))); else list_add(&before_actions, actiondup(LATEXT(1))); zzCONSUME; zzLOOP(zztasp2); } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { while ( (LA(1)==NonTerm) ) { rule(zzSTR); zzlink(_root, &_sibling, &_tail); zzLOOP(zztasp2); } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { while ( (LA(1)==Action) && (setwd1[LA(2)]&0x10) ) { zzmatch(Action); if ( CurClassName[0]!='\0' ) list_add(&class_actions, actiondup(LATEXT(1))); else list_add(&before_actions, actiondup(LATEXT(1))); zzCONSUME; zzLOOP(zztasp2); } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==80) ) { zzmatch(80); if ( CurClassName[0]=='\0' ) err("missing class definition for trailing '}'"); zzCONSUME; } else { if ( (setwd1[LA(1)]&0x20) ) { } else {zzFAIL(1,zzerr2,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { while ( (LA(1)==Action) ) { zzmatch(Action); list_add(&after_actions, actiondup(LATEXT(1))); zzCONSUME; zzLOOP(zztasp2); } zzEXIT(zztasp2); } } zzmatch(Eof); zzCONSUME; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); found_error=1; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd1, 0x40); } } void #ifdef __USE_PROTOS header(AST**_root) #else header(_root) AST **_root; #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { zzmatch(Header); zzCONSUME; zzmatch(Action); header_action = actiondup(LATEXT(1)); zzCONSUME; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); found_error=1; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd1, 0x80); } } void #ifdef __USE_PROTOS tokdef(AST**_root) #else tokdef(_root) AST **_root; #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { zzmatch(Tokdef); zzCONSUME; zzmatch(RExpr); { AST *dumb = NULL; zzantlr_state st; FILE *f; struct zzdlg_state dst; strcpy(tokdefs_file, LATEXT(1)); strcpy(tokdefs_file, tokdefs_file+1); /* remove quotes */ tokdefs_file[strlen(tokdefs_file)-1] = '\0'; zzsave_antlr_state(&st); zzsave_dlg_state(&dst); define_num=0; f = fopen(tokdefs_file, "r"); if ( f==NULL ) {found_error=1; err(eMsg1("cannot open token defs file '%s'", tokdefs_file));} else {ANTLRm(enum_file(&dumb), f, PARSE_ENUM_FILE);} zzrestore_antlr_state(&st); zzrestore_dlg_state(&dst); UserDefdTokens = 1; } zzCONSUME; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); found_error=1; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd2, 0x1); } } void #ifdef __USE_PROTOS class_def(AST**_root) #else class_def(_root) AST **_root; #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { zzmatch(81); zzastDPush; zzCONSUME; { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==NonTerm) ) { zzmatch(NonTerm); zzastDPush; strncpy(CurClassName,LATEXT(1),MaxAtom); zzCONSUME; } else { if ( (LA(1)==Token) ) { zzmatch(Token); zzastDPush; strncpy(CurClassName,LATEXT(1),MaxAtom); zzCONSUME; } else {zzFAIL(1,zzerr3,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } if ( !GenCPP ) { err("class meta-op used without C++ option"); } zzmatch(OPT); zzastDPush; zzCONSUME; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd2, 0x2); } } void #ifdef __USE_PROTOS rule(AST**_root) #else rule(_root) AST **_root; #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { SymEntry *p; int trouble=0, no_copy=0; zzmatch(NonTerm); zzsubroot(_root, &_sibling, &_tail); (*_root)->file = CurFile; (*_root)->line = zzline; CurRule = zzaArg(zztasp1,1 ).text; p = (SymEntry *) hash_get(symbols, zzaArg(zztasp1,1 ).text); if ( p==NULL ) { p = (SymEntry *) hash_add(symbols, zzaArg(zztasp1,1 ).text, (Entry *) newSymEntry(zzaArg(zztasp1,1 ).text)); p->token = NonTerm; p->defined = 1; p->definition = (*_root); } else if ( p->token != NonTerm ) { err(eMsg2("rule definition clashes with %s definition: '%s'", zztokens[p->token], p->str)); trouble = 1; } else { if ( p->defined ) { trouble = 1; err(eMsg1("rule multiply defined: '%s'", zzaArg(zztasp1,1 ).text)); } else { p->defined = 1; p->definition = (*_root); } } zzCONSUME; { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==84) ) { zzmatch(84); if (!trouble) (*_root)->no_copy=no_copy=1; zzCONSUME; } else { if ( (setwd2[LA(1)]&0x4) ) { } else {zzFAIL(1,zzerr4,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { if ( (setwd2[LA(1)]&0x8) ) { { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==85) ) { zzmatch(85); zzCONSUME; } else { if ( (LA(1)==PassAction) ) { } else {zzFAIL(1,zzerr5,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } zzmatch(PassAction); if (!trouble) p->args = actiondup(LATEXT(1)); zzCONSUME; } else { if ( (setwd2[LA(1)]&0x10) ) { } else {zzFAIL(1,zzerr6,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==86) ) { zzmatch(86); zzCONSUME; zzmatch(PassAction); if (!trouble) p->rt = actiondup(LATEXT(1)); zzCONSUME; } else { if ( (LA(1)==LABEL) ) { } else {zzFAIL(1,zzerr7,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } zzmatch(LABEL); zzCONSUME; block(zzSTR, no_copy ); zzlink(_root, &_sibling, &_tail); zzmatch(87); if ( !trouble ) (*_root)->refvars = RefVars; RefVars=NULL; zzCONSUME; if ( trouble ) (*_root) = NULL; CurRule = NULL; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); found_error=1; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd2, 0x20); } } void #ifdef __USE_PROTOS block(AST**_root,int no_copy) #else block(_root,no_copy) AST **_root; int no_copy ; #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { int line=zzline, file=CurFile; alt(zzSTR, no_copy ); zzlink(_root, &_sibling, &_tail); { zzBLOCK(zztasp2); zzMake0; { while ( (LA(1)==88) ) { zzmatch(88); zzCONSUME; alt(zzSTR, no_copy ); zzlink(_root, &_sibling, &_tail); zzLOOP(zztasp2); } zzEXIT(zztasp2); } } (*_root) = zztmake( zzmk_ast(zzastnew(),BLOCK), (*_root) , NULL); (*_root)->file = file; (*_root)->line = line; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); found_error=1; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd2, 0x40); } } void #ifdef __USE_PROTOS alt(AST**_root,int no_copy) #else alt(_root,no_copy) AST **_root; int no_copy ; #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { int line=zzline, file=CurFile; int local_no_copy=0; { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==84) ) { zzmatch(84); local_no_copy=1; zzCONSUME; } else { if ( (setwd2[LA(1)]&0x80) ) { } else {zzFAIL(1,zzerr8,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { if ( (setwd3[LA(1)]&0x1) ) { { zzBLOCK(zztasp3); int zzcnt=1; zzMake0; { do { if ( (setwd3[LA(1)]&0x2) && (LA(2)==LABEL) ) { labeled_element(zzSTR, no_copy||local_no_copy ); zzlink(_root, &_sibling, &_tail); } else { if ( (setwd3[LA(1)]&0x4) && (setwd3[LA(2)]&0x8) ) { element(zzSTR, no_copy||local_no_copy ); zzlink(_root, &_sibling, &_tail); } else { if ( (LA(1)==BT) ) { tree(zzSTR, no_copy||local_no_copy ); zzlink(_root, &_sibling, &_tail); } /* MR10 ()+ */ else { if ( zzcnt > 1 ) break; else {zzFAIL(2,zzerr9,zzerr10,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } } zzcnt++; zzLOOP(zztasp3); } while ( 1 ); zzEXIT(zztasp3); } } } else { if ( (setwd3[LA(1)]&0x10) ) { } else {zzFAIL(1,zzerr11,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } (*_root) = zztmake( zzmk_ast(zzastnew(),ALT), (*_root) , NULL); (*_root)->file = file; (*_root)->line = line; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); found_error=1; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd3, 0x20); } } void #ifdef __USE_PROTOS element(AST**_root,int no_copy) #else element(_root,no_copy) AST **_root; int no_copy ; #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { /**** SymEntry *p; **** MR10 ****/ int file,line; int local_no_copy=0; if ( (LA(1)==Token) ) { token(zzSTR, no_copy ); zzlink(_root, &_sibling, &_tail); } else { if ( (LA(1)==NonTerm) ) { file = CurFile; line=zzline; zzmatch(NonTerm); zzsubroot(_root, &_sibling, &_tail); zzCONSUME; { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==84) ) { zzmatch(84); local_no_copy = 1; zzCONSUME; } else { if ( (setwd3[LA(1)]&0x40) ) { } else {zzFAIL(1,zzerr12,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { if ( (setwd3[LA(1)]&0x80) ) { { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==85) ) { zzmatch(85); zzCONSUME; } else { if ( (LA(1)==PassAction) ) { } else {zzFAIL(1,zzerr13,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } zzmatch(PassAction); zzsubchild(_root, &_sibling, &_tail); (*_root)->in = 1; zzCONSUME; } else { if ( (setwd4[LA(1)]&0x1) ) { } else {zzFAIL(1,zzerr14,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==86) ) { zzmatch(86); zzCONSUME; zzmatch(PassAction); zzsubchild(_root, &_sibling, &_tail); (*_root)->out = 1; zzCONSUME; } else { if ( (setwd4[LA(1)]&0x2) ) { } else {zzFAIL(1,zzerr15,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } (*_root)->file = file; (*_root)->line=line; (*_root)->no_copy = no_copy || local_no_copy; } else { if ( (LA(1)==Action) ) { file = CurFile; line=zzline; zzmatch(Action); zzsubchild(_root, &_sibling, &_tail); zzastArg(1)->action = actiondup(LATEXT(1)); zzCONSUME; { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==PRED_OP) ) { zzmatch(PRED_OP); zzsubroot(_root, &_sibling, &_tail); zzCONSUME; } else { if ( (setwd4[LA(1)]&0x4) ) { } else {zzFAIL(1,zzerr16,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } (*_root)->file = file; (*_root)->line=line; } else { if ( (LA(1)==89) ) { file = CurFile; line=zzline; zzmatch(89); zzCONSUME; block(zzSTR, no_copy ); zzlink(_root, &_sibling, &_tail); zzmatch(90); zzCONSUME; { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==CLOSURE) ) { zzmatch(CLOSURE); zzsubroot(_root, &_sibling, &_tail); zzCONSUME; } else { if ( (LA(1)==POS_CLOSURE) ) { zzmatch(POS_CLOSURE); zzsubroot(_root, &_sibling, &_tail); zzCONSUME; } else { if ( (LA(1)==PRED_OP) ) { zzmatch(PRED_OP); zzsubroot(_root, &_sibling, &_tail); found_guess_block=1; zzCONSUME; } else { if ( (setwd4[LA(1)]&0x8) ) { } else {zzFAIL(1,zzerr17,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } } zzEXIT(zztasp2); } } (*_root)->file = file; (*_root)->line=line; } else { if ( (LA(1)==OPT) ) { zzmatch(OPT); zzsubroot(_root, &_sibling, &_tail); zzCONSUME; block(zzSTR, no_copy ); zzlink(_root, &_sibling, &_tail); zzmatch(80); zzCONSUME; } else { if ( (LA(1)==WILD) ) { file = CurFile; line=zzline; zzmatch(WILD); zzsubchild(_root, &_sibling, &_tail); zzCONSUME; { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==84) ) { zzmatch(84); local_no_copy = 1; zzCONSUME; } else { if ( (setwd4[LA(1)]&0x10) ) { } else {zzFAIL(1,zzerr18,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } (*_root)->no_copy = no_copy || local_no_copy; (*_root)->file = file; (*_root)->line=line; } else {zzFAIL(1,zzerr19,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } } } } zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); found_error=1; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd4, 0x20); } } void #ifdef __USE_PROTOS labeled_element(AST**_root,int no_copy) #else labeled_element(_root,no_copy) AST **_root; int no_copy ; #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { Attrib label; int file,line; SymEntry *s; int local_no_copy=0; { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==Token) ) { zzmatch(Token); label = zzaArg(zztasp2,1); zzCONSUME; } else { if ( (LA(1)==NonTerm) ) { zzmatch(NonTerm); label = zzaArg(zztasp2,1); zzCONSUME; } else {zzFAIL(1,zzerr20,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } s = (SymEntry *) hash_get(symbols, label.text); if ( s==NULL ) { s = (SymEntry *) hash_add(symbols, label.text, (Entry *) newSymEntry(label.text)); s->token = LABEL; } else if ( s->token!=LABEL ) { err(eMsg2("label definition clashes with %s definition: '%s'", zztokens[s->token], label.text)); } zzmatch(LABEL); zzCONSUME; { zzBLOCK(zztasp2); zzMake0; { file = CurFile; line=zzline; if ( (LA(1)==Token) ) { token(zzSTR, no_copy ); zzlink(_root, &_sibling, &_tail); strcpy(zzastArg(1)->label, label.text); (*_root)->file = file; (*_root)->line=line; } else { if ( (LA(1)==NonTerm) ) { file = CurFile; line=zzline; zzmatch(NonTerm); zzsubroot(_root, &_sibling, &_tail); strcpy(zzastArg(1)->label, label.text); zzCONSUME; { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==84) ) { zzmatch(84); local_no_copy = 1; zzCONSUME; } else { if ( (setwd4[LA(1)]&0x40) ) { } else {zzFAIL(1,zzerr21,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } { zzBLOCK(zztasp3); zzMake0; { if ( (setwd4[LA(1)]&0x80) ) { { zzBLOCK(zztasp4); zzMake0; { if ( (LA(1)==85) ) { zzmatch(85); zzCONSUME; } else { if ( (LA(1)==PassAction) ) { } else {zzFAIL(1,zzerr22,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp4); } } zzmatch(PassAction); zzsubchild(_root, &_sibling, &_tail); (*_root)->in = 1; zzCONSUME; } else { if ( (setwd5[LA(1)]&0x1) ) { } else {zzFAIL(1,zzerr23,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==86) ) { zzmatch(86); zzCONSUME; zzmatch(PassAction); zzsubchild(_root, &_sibling, &_tail); (*_root)->out = 1; zzCONSUME; } else { if ( (setwd5[LA(1)]&0x2) ) { } else {zzFAIL(1,zzerr24,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } (*_root)->file = file; (*_root)->line=line; (*_root)->no_copy = no_copy || local_no_copy; } else { if ( (LA(1)==WILD) ) { file = CurFile; line=zzline; zzmatch(WILD); zzsubchild(_root, &_sibling, &_tail); strcpy(zzastArg(1)->label, label.text); zzCONSUME; { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==84) ) { zzmatch(84); local_no_copy = 1; zzCONSUME; } else { if ( (setwd5[LA(1)]&0x4) ) { } else {zzFAIL(1,zzerr25,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } (*_root)->no_copy = no_copy || local_no_copy; (*_root)->file = file; (*_root)->line=line; } else { if ( (setwd5[LA(1)]&0x8) ) { { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==88) ) { zzmatch(88); zzsubchild(_root, &_sibling, &_tail); zzCONSUME; } else { if ( (LA(1)==87) ) { zzmatch(87); zzsubchild(_root, &_sibling, &_tail); zzCONSUME; } else { if ( (LA(1)==PassAction) ) { zzmatch(PassAction); zzsubchild(_root, &_sibling, &_tail); zzCONSUME; } else { if ( (LA(1)==Action) ) { zzmatch(Action); zzsubchild(_root, &_sibling, &_tail); zzCONSUME; } else { if ( (LA(1)==Eof) ) { zzmatch(Eof); zzsubchild(_root, &_sibling, &_tail); zzCONSUME; } else { if ( (LA(1)==89) ) { zzmatch(89); zzsubchild(_root, &_sibling, &_tail); zzCONSUME; } else { if ( (LA(1)==OPT) ) { zzmatch(OPT); zzsubchild(_root, &_sibling, &_tail); zzCONSUME; } else { if ( (LA(1)==90) ) { zzmatch(90); zzsubchild(_root, &_sibling, &_tail); zzCONSUME; } else { if ( (LA(1)==80) ) { zzmatch(80); zzsubchild(_root, &_sibling, &_tail); zzCONSUME; } else { if ( (LA(1)==BT) ) { zzmatch(BT); zzsubchild(_root, &_sibling, &_tail); zzCONSUME; } else {zzFAIL(1,zzerr26,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } } } } } } } } zzEXIT(zztasp3); } } err("cannot label this grammar construct"); found_error = 1; } else {zzFAIL(1,zzerr27,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } } zzEXIT(zztasp2); } } zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); found_error=1; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd5, 0x10); } } void #ifdef __USE_PROTOS token(AST**_root,int no_copy) #else token(_root,no_copy) AST **_root; int no_copy ; #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { SymEntry *p; int file, line; int local_no_copy=0; file = CurFile; line=zzline; zzmatch(Token); zzsubchild(_root, &_sibling, &_tail); (*_root)->file = file; (*_root)->line=line; zzCONSUME; define_token(zzaArg(zztasp1,1 ).text); { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==91) ) { zzmatch(91); zzCONSUME; zzmatch(Token); zzCONSUME; { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==84) ) { zzmatch(84); local_no_copy=1; zzCONSUME; } else { if ( (setwd5[LA(1)]&0x20) ) { } else {zzFAIL(1,zzerr28,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } if ( !UserDefdTokens ) { err("range operator is illegal without #tokdefs directive"); } else { p = define_token(zzaArg(zztasp2,2 ).text); require(p!=NULL, "token: hash table is broken"); (*_root)->upper_range = p->token_type; } } else { if ( (LA(1)==84) ) { zzmatch(84); local_no_copy=1; zzCONSUME; } else { if ( (setwd5[LA(1)]&0x40) ) { } else {zzFAIL(1,zzerr29,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } zzEXIT(zztasp2); } } (*_root)->no_copy = no_copy||local_no_copy; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd5, 0x80); } } void #ifdef __USE_PROTOS tree(AST**_root,int no_copy) #else tree(_root,no_copy) AST **_root; int no_copy ; #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { Attrib label; SymEntry *p, *s; int local_no_copy=0; AST *t=NULL; zzmatch(BT); zzCONSUME; { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==Token) && (setwd6[LA(2)]&0x1) ) { zzmatch(Token); zzsubroot(_root, &_sibling, &_tail); t=zzastArg(1); zzCONSUME; define_token(zzaArg(zztasp2,1 ).text); { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==91) ) { zzmatch(91); zzCONSUME; zzmatch(Token); zzCONSUME; { zzBLOCK(zztasp4); zzMake0; { if ( (LA(1)==84) ) { zzmatch(84); local_no_copy=1; zzCONSUME; } else { if ( (setwd6[LA(1)]&0x2) ) { } else {zzFAIL(1,zzerr30,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp4); } } if ( !UserDefdTokens ) { err("range operator is illegal without #tokdefs directive"); } else { p = define_token(zzaArg(zztasp3,2 ).text); require(p!=NULL, "element: hash table is broken"); t->upper_range = p->token_type; } } else { if ( (LA(1)==84) ) { zzmatch(84); local_no_copy=1; zzCONSUME; } else { if ( (setwd6[LA(1)]&0x4) ) { } else {zzFAIL(1,zzerr31,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } zzEXIT(zztasp3); } } t->no_copy = no_copy||local_no_copy; t->is_root = 1; } else { if ( (LA(1)==WILD) ) { zzmatch(WILD); zzsubroot(_root, &_sibling, &_tail); zzCONSUME; { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==84) ) { zzmatch(84); local_no_copy = 1; zzCONSUME; } else { if ( (setwd6[LA(1)]&0x8) ) { } else {zzFAIL(1,zzerr32,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } zzastArg(1)->no_copy = no_copy || local_no_copy; zzastArg(1)->is_root = 1; } else { if ( (setwd6[LA(1)]&0x10) && (LA(2)==LABEL) ) { { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==Token) ) { zzmatch(Token); label = zzaArg(zztasp3,1); zzCONSUME; } else { if ( (LA(1)==NonTerm) ) { zzmatch(NonTerm); label = zzaArg(zztasp3,1); zzCONSUME; } else {zzFAIL(1,zzerr33,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } s = (SymEntry *) hash_get(symbols, label.text); if ( s==NULL ) { s = (SymEntry *) hash_add(symbols, label.text, (Entry *) newSymEntry(label.text)); s->token = LABEL; } else if ( s->token!=LABEL ) { err(eMsg2("label definition clashes with %s definition: '%s'", zztokens[s->token], label.text)); } zzmatch(LABEL); zzCONSUME; { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==Token) ) { zzmatch(Token); zzsubroot(_root, &_sibling, &_tail); strcpy(zzastArg(1)->label, label.text); t = zzastArg(1); zzCONSUME; define_token(zzaArg(zztasp3,1 ).text); { zzBLOCK(zztasp4); zzMake0; { if ( (LA(1)==91) ) { zzmatch(91); zzCONSUME; zzmatch(Token); zzCONSUME; { zzBLOCK(zztasp5); zzMake0; { if ( (LA(1)==84) ) { zzmatch(84); local_no_copy=1; zzCONSUME; } else { if ( (setwd6[LA(1)]&0x20) ) { } else {zzFAIL(1,zzerr34,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp5); } } if ( !UserDefdTokens ) { err("range operator is illegal without #tokdefs directive"); } else { p = define_token(zzaArg(zztasp4,2 ).text); require(p!=NULL, "element: hash table is broken"); t->upper_range = p->token_type; } } else { if ( (LA(1)==84) ) { zzmatch(84); local_no_copy=1; zzCONSUME; } else { if ( (setwd6[LA(1)]&0x40) ) { } else {zzFAIL(1,zzerr35,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } zzEXIT(zztasp4); } } t->no_copy = no_copy||local_no_copy; } else { if ( (LA(1)==WILD) ) { zzmatch(WILD); zzsubroot(_root, &_sibling, &_tail); strcpy(zzastArg(1)->label, label.text); zzCONSUME; { zzBLOCK(zztasp4); zzMake0; { if ( (LA(1)==84) ) { zzmatch(84); local_no_copy = 1; zzCONSUME; } else { if ( (setwd6[LA(1)]&0x80) ) { } else {zzFAIL(1,zzerr36,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp4); } } zzastArg(1)->no_copy = no_copy || local_no_copy; } else {zzFAIL(1,zzerr37,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } t->is_root = 1; } else {zzFAIL(2,zzerr38,zzerr39,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); zzMake0; { for (;;) { if ( !((setwd7[LA(1)]&0x1) )) break; if ( (setwd7[LA(1)]&0x2) && (LA(2)==LABEL) ) { labeled_element(zzSTR, no_copy ); zzlink(_root, &_sibling, &_tail); } else { if ( (setwd7[LA(1)]&0x4) && (setwd7[LA(2)]&0x8) ) { element(zzSTR, no_copy ); zzlink(_root, &_sibling, &_tail); } else { if ( (LA(1)==BT) ) { tree(zzSTR, no_copy ); zzlink(_root, &_sibling, &_tail); } else break; /* MR6 code for exiting loop "for sure" */ } } zzLOOP(zztasp2); } zzEXIT(zztasp2); } } zzmatch(90); zzCONSUME; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); found_error=1; zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd7, 0x10); } } void #ifdef __USE_PROTOS enum_file(AST**_root) #else enum_file(_root) AST **_root; #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { SymEntry *p=NULL; if ( (setwd7[LA(1)]&0x20) ) { { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==103) ) { zzmatch(103); zzastDPush; zzCONSUME; zzmatch(ID); zzastDPush; zzCONSUME; { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==106) ) { zzmatch(106); zzastDPush; zzCONSUME; zzmatch(ID); zzastDPush; zzCONSUME; } else { if ( (LA(1)==110) ) { } else {zzFAIL(1,zzerr40,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp3); } } } else { if ( (LA(1)==110) ) { } else {zzFAIL(1,zzerr41,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } { zzBLOCK(zztasp2); int zzcnt=1; zzMake0; { do { _ast = NULL; enum_def(&_ast); zzLOOP(zztasp2); } while ( (LA(1)==110) ); zzEXIT(zztasp2); } } } else { if ( (LA(1)==106) ) { _ast = NULL; defines(&_ast); } else { if ( (LA(1)==Eof) ) { } else {zzFAIL(1,zzerr42,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd7, 0x40); } } void #ifdef __USE_PROTOS defines(AST**_root) #else defines(_root) AST **_root; #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { int maxt= -1; /**** char *t; **** MR10 ****/ SymEntry *p; int ignore=0; { zzBLOCK(zztasp2); int zzcnt=1; zzMake0; { do { zzmatch(106); zzastDPush; zzCONSUME; zzmatch(ID); zzastDPush; p = (SymEntry *) hash_get(symbols, zzaArg(zztasp2,2 ).text); if ( p==NULL ) { p = (SymEntry *) hash_add(symbols, zzaArg(zztasp2,2 ).text, (Entry *) newSymEntry(zzaArg(zztasp2,2 ).text)); require(p!=NULL, "can't add to sym tab"); p->token = Token; list_add(&token_list, (void *)p); set_orel(p->token_type, &referenced_tokens); } else { err(eMsg1("redefinition of token %s; ignored",zzaArg(zztasp2,2 ).text)); ignore = 1; } zzCONSUME; zzmatch(INT); zzastDPush; if ( !ignore ) { p->token_type = atoi(zzaArg(zztasp2,3 ).text); token_association(p->token_type, p->str); /* fprintf(stderr, "#token %s=%d\n", p->str, p->token_type);*/ if ( p->token_type>maxt ) maxt=p->token_type; ignore = 0; } zzCONSUME; zzLOOP(zztasp2); } while ( (LA(1)==106) ); zzEXIT(zztasp2); } } token_type = maxt + 1; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd7, 0x80); } } void #ifdef __USE_PROTOS enum_def(AST**_root) #else enum_def(_root) AST **_root; #endif { zzRULE; zzBLOCK(zztasp1); zzMake0; { int maxt = -1, v= -1; /**** char *t; **** MR10 ****/ SymEntry *p; int ignore=0; zzmatch(110); zzastDPush; zzCONSUME; { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==ID) ) { zzmatch(ID); zzastDPush; zzCONSUME; } else { if ( (LA(1)==111) ) { } else {zzFAIL(1,zzerr43,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } zzmatch(111); zzastDPush; zzCONSUME; zzmatch(ID); zzastDPush; p = (SymEntry *) hash_get(symbols, zzaArg(zztasp1,4 ).text); if ( p==NULL ) { p = (SymEntry *) hash_add(symbols, zzaArg(zztasp1,4 ).text, (Entry *) newSymEntry(zzaArg(zztasp1,4 ).text)); require(p!=NULL, "can't add to sym tab"); p->token = Token; list_add(&token_list, (void *)p); set_orel(p->token_type, &referenced_tokens); } else { err(eMsg1("redefinition of token %s; ignored",zzaArg(zztasp1,4 ).text)); ignore = 1; } zzCONSUME; { zzBLOCK(zztasp2); zzMake0; { if ( (LA(1)==112) ) { zzmatch(112); zzastDPush; zzCONSUME; zzmatch(INT); zzastDPush; v=atoi(zzaArg(zztasp2,2 ).text); zzCONSUME; } else { if ( (setwd8[LA(1)]&0x1) ) { v++; } else {zzFAIL(1,zzerr44,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp2); } } if ( !ignore ) { /* fprintf(stderr, "#token %s=%d\n", p->str, v);*/ if ( v>maxt ) maxt=v; p->token_type = v; token_association(p->token_type, p->str); ignore = 0; } { zzBLOCK(zztasp2); zzMake0; { while ( (LA(1)==113) ) { zzmatch(113); zzastDPush; zzCONSUME; { zzBLOCK(zztasp3); zzMake0; { if ( (LA(1)==114) ) { zzmatch(114); zzastDPush; zzCONSUME; { zzBLOCK(zztasp4); zzMake0; { if ( (LA(1)==112) ) { zzmatch(112); zzastDPush; zzCONSUME; zzmatch(INT); zzastDPush; zzCONSUME; } else { if ( (setwd8[LA(1)]&0x2) ) { } else {zzFAIL(1,zzerr45,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp4); } } } else { if ( (LA(1)==115) ) { zzmatch(115); zzastDPush; zzCONSUME; { zzBLOCK(zztasp4); zzMake0; { if ( (LA(1)==112) ) { zzmatch(112); zzastDPush; zzCONSUME; zzmatch(INT); zzastDPush; zzCONSUME; } else { if ( (setwd8[LA(1)]&0x4) ) { } else {zzFAIL(1,zzerr46,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp4); } } } else { if ( (LA(1)==ID) ) { zzmatch(ID); zzastDPush; p = (SymEntry *) hash_get(symbols, zzaArg(zztasp3,1 ).text); if ( p==NULL ) { p = (SymEntry *) hash_add(symbols, zzaArg(zztasp3,1 ).text, (Entry *) newSymEntry(zzaArg(zztasp3,1 ).text)); require(p!=NULL, "can't add to sym tab"); p->token = Token; list_add(&token_list, (void *)p); set_orel(p->token_type, &referenced_tokens); } else { err(eMsg1("redefinition of token %s; ignored",zzaArg(zztasp3,1 ).text)); ignore = 1; } zzCONSUME; { zzBLOCK(zztasp4); zzMake0; { if ( (LA(1)==112) ) { zzmatch(112); zzastDPush; zzCONSUME; zzmatch(INT); zzastDPush; v=atoi(zzaArg(zztasp4,2 ).text); zzCONSUME; } else { if ( (setwd8[LA(1)]&0x8) ) { v++; } else {zzFAIL(1,zzerr47,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } zzEXIT(zztasp4); } } if ( !ignore ) { /* fprintf(stderr, "#token %s=%d\n", p->str, v);*/ if ( v>maxt ) maxt=v; p->token_type = v; token_association(p->token_type, p->str); ignore = 0; } } else { if ( (setwd8[LA(1)]&0x10) ) { } else {zzFAIL(1,zzerr48,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} } } } zzEXIT(zztasp3); } } zzLOOP(zztasp2); } zzEXIT(zztasp2); } } zzmatch(116); zzastDPush; zzCONSUME; zzmatch(117); zzastDPush; token_type = maxt + 1; zzCONSUME; zzEXIT(zztasp1); return; fail: zzEXIT(zztasp1); zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); zzresynch(setwd8, 0x20); } } /* SORCERER-specific syntax error message generator * (define USER_ZZSYN when compiling so don't get 2 definitions) */ void #ifdef __USE_PROTOS zzsyn(char *text, int tok, char *egroup, SetWordType *eset, int etok, int k, char *bad_text) #else zzsyn(text, tok, egroup, eset, etok, k, bad_text) char *text, *egroup, *bad_text; int tok; int etok; int k; SetWordType *eset; #endif { fprintf(stderr, ErrHdr, FileStr[CurFile]!=NULL?FileStr[CurFile]:"stdin", zzline); fprintf(stderr, " syntax error at \"%s\"", (tok==zzEOF_TOKEN)?"EOF":text); if ( !etok && !eset ) {fprintf(stderr, "\n"); return;} if ( k==1 ) fprintf(stderr, " missing"); else { fprintf(stderr, "; \"%s\" not", bad_text); if ( zzset_deg(eset)>1 ) fprintf(stderr, " in"); } if ( zzset_deg(eset)>0 ) zzedecode(eset); else fprintf(stderr, " %s", zztokens[etok]); if ( strlen(egroup) > (size_t)0 ) fprintf(stderr, " in %s", egroup); fprintf(stderr, "\n"); } SymEntry * #ifdef __USE_PROTOS define_token(char *text) #else define_token(text) char *text; #endif { SymEntry *p; p = (SymEntry *) hash_get(symbols, text); if ( p==NULL ) { if ( UserDefdTokens ) { err(eMsg1("implicit token definition of '%s' not allowed with #tokdefs",text)); } p = (SymEntry *) hash_add(symbols, text, (Entry *) newSymEntry(text)); p->token = Token; p->token_type = token_type++; token_association(p->token_type, p->str); list_add(&token_list, (void *)p); set_orel(p->token_type, &referenced_tokens); } else { if ( p->token!=Token ) err(eMsg2("token definition clashes with %s definition: '%s'", zztokens[p->token], text)); } return p; } gtkwave-3.3.86/contrib/pccts/sorcerer/look.c0000664000175000017500000004173613166335473020327 0ustar bybellbybell/* * look.c * * Compute LL(1) lookahead sets for SORCERER code-generator * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public * domain. An individual or company may do whatever they wish with * source code distributed with SORCERER or the code generated by * SORCERER, including the incorporation of SORCERER, or its output, into * commerical software. * * We encourage users to develop software with SORCERER. However, we do * ask that credit is given to us for developing SORCERER. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like SORCERER and have developed a nice tool with the * output, please mention that you developed it using SORCERER. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * SORCERER 1.00B * Terence Parr * AHPCRC, University of Minnesota * 1992-2001 */ #include "stdpccts.h" #include "sym.h" #include "proto.h" static GLA *end_node; static GLA * #ifdef __USE_PROTOS newGLANode(void); #else newGLANode(); #endif set #ifdef __USE_PROTOS Lookahead( GLA *p ) #else Lookahead( p ) GLA *p; #endif { set r, rv; if ( p == NULL ) return empty; r = rv = empty; /* have we been here before for this k? Detect cycles */ if ( p->visited ) { return empty; } p->visited = 1; /* Does edge 1 have a token label? */ if ( p->label1 <= last_valid_token ) { rv = set_of(p->label1); if ( p->upper_range!=0 ) { int i; /* put all elements of range into lookahead set */ for (i=p->label1+1; i<=p->upper_range; i++) { set_orel(i, &rv); } } } else if ( p->label1 == wild_card || p->label1 == end_of_input ) { rv = set_of(p->label1); } else /* must be an epsilon transfer */ { int trouble = 0; if ( p->p1!=NULL ) { /* check for infinite-recursion */ /* o->o->o->o-A->o.. Rule def (p->p1 points to far left node) * | for 'a : A | B;' * o->o-B->o.. * * the visited flag is set on the start of the alts. */ if ( p->is_rule_ref && p->p1->is_rule_entry ) { require(p->p1->p1!=NULL, "Lookahead: invalid GLA"); require(p->p1->p1->p1!=NULL, "Lookahead: invalid GLA"); if ( p->p1->p1->p1->visited ) { errNoFL(eMsg2("infinite recursion from rule %s to rule %s", p->in_rule,p->p1->in_rule)); rv = set_of(wild_card); trouble = 1; } } if ( !trouble ) { r = Lookahead(p->p1); rv = set_or(r, rv); set_free(r); } } } /* handle edge 2 */ r = Lookahead(p->p2); /* tokens can't be on e2 edges */ set_orin(&rv, r); set_free(r); /* this node is no longer visited */ p->visited = 0; return rv; } /* * Build a big, interwined, lookahead GLA from the lookahead GLA created * for each rule. From this, lookahead computation is trivial. * * [1] Build the GLA start states for each nonterminal. Each nonterminal * looks like "o-->o" where the 2nd 'o' is the start of the GLA list * of alts for the grammar block. Alternatives are connected like this: * * o-->o-->alt1 -->o * | ^ * o-->alt2 ---| * ... | * | | * o-->altn ---| * * The BLOCK building function actually makes the ALT list. This * function only builds the first 'o' node (upper left). * * [2] Make GLA for block of each rule. * * [3] Make a set of links to the nodes following all references to * this rule. */ void #ifdef __USE_PROTOS build_GLA( AST *rules ) #else build_GLA( rules ) AST *rules; #endif { SymEntry *s; AST *r; GLA *end_of_rule, *blk_start; require(rules!=NULL, "build_GLA: NULL rule list"); for (r=rules; r!=NULL; r=r->right) { s = (SymEntry *) hash_get(symbols, r->text); require(s!=NULL, "build_GLA: sym tab broken"); CurRule = s->str; s->start_state = newGLANode(); s->start_state->is_rule_entry = 1; } end_node = newGLANode(); for (r=rules; r!=NULL; r=r->right) { s = (SymEntry *) hash_get(symbols, r->text); require(s!=NULL, "build_GLA: sym tab broken"); CurRule = s->str; blk_start = newGLANode(); blk_start->p1 = build_GLA_for_block(r->down, &end_of_rule); blk_start->label1 = epsilon; s->start_state->p1 = blk_start; s->start_state->label1 = epsilon; s->end_rule = end_of_rule; /* make this BLOCK correspond to the GLA for this rule */ r->down->start_state = s->start_state->p1; } for (r=rules; r!=NULL; r=r->right) { s = (SymEntry *) hash_get(symbols, r->text); require(s!=NULL, "build_GLA: sym tab broken"); build_follow_links(s->end_rule, s->refs); } } /* * Tree looks like ( BLOCK ( ALT alpha ) ... ( AST beta ) ). * * For each ALT of BLOCK, build a new alternative into the GLA. * * Build a block that looks like: * * o-->alt1 -->o * | ^ * o-->alt2 ---| * ... | * | | * o-->altn ---| */ GLA * #ifdef __USE_PROTOS build_GLA_for_block( AST *block, GLA **tail ) #else build_GLA_for_block( block, tail ) AST *block; GLA **tail; #endif { GLA *p, *alt_tail, *blk_tail, *prev=NULL, *first=NULL; AST *alt; require(block!=NULL, "build_GLA_for_block: NULL tree pointer"); blk_tail = newGLANode(); for (alt=block->down; alt!=NULL; alt=alt->right) { p = newGLANode(); p->p1 = build_GLA_for_ALT(alt, &alt_tail); p->label1 = epsilon; /* connect new alt into downward link */ if ( prev!=NULL ) { prev->p2 = p; prev->label2 = epsilon; } else { first = p; } prev = p; /* link alt to block tail node */ alt_tail->p1 = blk_tail; alt_tail->label1 = epsilon; } *tail = blk_tail; return first; } /* * Tree looks like ( ALT elem1 ... elemn ). Generate a GLA for each * element with build_GLA_for_element; make a tail node and return * pointer to GLA element built for first element. * * Tree patterns such as #(A b C) must be included because they may * invoke other rules or have subrules in them for which lookahead * must be computed. The '#(' and ')' are basically ignored and #(A b C) * turns into 'A b C' for GLA construction purposes. Note that this would * NOT work for LL(k>1). */ GLA * #ifdef __USE_PROTOS build_GLA_for_ALT( AST *alt, GLA **alt_tail ) #else build_GLA_for_ALT( alt, alt_tail ) AST *alt; GLA **alt_tail; #endif { GLA *elem_tail, *first; require(alt!=NULL, "build_GLA_for_alt: NULL tree pointer"); first = build_GLA_for_tree(alt->down, &elem_tail); *alt_tail = elem_tail; return first; } GLA * #ifdef __USE_PROTOS build_GLA_for_tree( AST *q, GLA **tree_tail ) #else build_GLA_for_tree( q, tree_tail ) AST *q; GLA **tree_tail; #endif { AST *t; GLA *elem_tail, *alt_tail=NULL, *start=NULL, *elem; for (t=q; t!=NULL; t = t->right) { elem = build_GLA_for_element(t, &elem_tail); if ( elem!=NULL ) { if ( start==NULL ) { start = elem; alt_tail = elem_tail; } else { alt_tail->p1 = elem; alt_tail->label1 = epsilon; alt_tail = elem_tail; } } if ( t->down != NULL && (t->token == Token||t->token == WILD) ) { elem = build_GLA_for_tree(t->down, &elem_tail); if ( elem==NULL ) continue; alt_tail->p1 = elem; alt_tail->label1 = epsilon; /* put an end-of-input node at the end of each sibling list so * that lookahead computation don't take '#(A b) D' to be same * as 'A b D'; i.e., 'D' CANNOT follow a reference to a 'b' in * this context as the 'b' is at a lower level. Only a NULL ptr * can follow a ref to 'b'. For example, * * a : #(A b) D; * b : E * | * ; * * The lookahead for 'b' is {E} for alt1 and {end_of_input} of * alt2 because for the second alt to match, the input subtree * must be NULL. */ elem_tail->p1 = newGLANode(); elem_tail->label1 = end_of_input; elem_tail = elem_tail->p1; alt_tail = elem_tail; } } if ( start==NULL ) { start = newGLANode(); *tree_tail = start; } else *tree_tail = alt_tail; return start; } GLA * #ifdef __USE_PROTOS build_GLA_for_element( AST *elem, GLA **elem_tail ) #else build_GLA_for_element( elem, elem_tail ) AST *elem; GLA **elem_tail; #endif { SymEntry *p; GLA *blkstart, *blkend, *blkloopback, *start=NULL; require(elem!=NULL, "build_GLA_for_element: NULL tree pointer"); if ( elem == NULL ) return NULL; switch ( elem->token ) { case Token : p = (SymEntry *) hash_get(symbols, elem->text); require(p!=NULL, "build_GLA_for_element: token not in sym tab"); start = newGLANode(); start->p1 = newGLANode(); start->label1 = p->token_type; start->upper_range = elem->upper_range; *elem_tail = start->p1; break; case NonTerm : /* edge 1 points to the start of the GLA for the referenced rule. * Make a new node as if it * were connected, however, so that this node can be connected to the end * of block node by the build BLOCK routine. */ p = (SymEntry *) hash_get(symbols, elem->text); if ( p==NULL || !p->defined ) { errNoFL(eMsg1("rule not defined: '%s'", elem->text)); start = newGLANode(); start->p1 = newGLANode(); start->label1 = wild_card; *elem_tail = start->p1; break; } start = newGLANode(); start->is_rule_ref = 1; start->p1 = p->start_state; start->label1 = epsilon; start->next = newGLANode(); *elem_tail = start->next; /* maintain reference list for this nonterminal */ list_add(&p->refs, start->next); break; case WILD : start = newGLANode(); start->p1 = newGLANode(); start->label1 = wild_card; *elem_tail = start->p1; break; case Action : *elem_tail = NULL; break; case PRED_OP : /* return o->blk */ start = newGLANode(); start->p1 = build_GLA_for_block(elem->down, elem_tail); start->label1 = epsilon; elem->down->start_state = start; /* DO NOT RETURN the block ptr because we don't want the lookahead * analysis to see it. However, the AST BLOCK node will pt to it. */ start = NULL; *elem_tail = NULL; break; case CLOSURE : /* Make a blk like this: * v---------| * o-->o-->blk-->o-->o * |-------------^ * where the farthest left node is the start node passed in, * the 2nd from the right is created here, and the 2nd from the left * is a node created here. The farthest right node is created * here as the end_blk node for the CLOSURE block. The 'p2' ptr * of the blkloopback node goes back to the blkstart node. */ blkstart = newGLANode(); blkloopback = newGLANode(); blkend = newGLANode(); blkstart->p1 = build_GLA_for_block(elem->down, elem_tail); blkstart->label1 = epsilon; blkstart->p2 = blkend; blkstart->label2 = epsilon; blkloopback->p1 = blkend; blkloopback->label1 = epsilon; blkloopback->p2 = blkstart; blkloopback->label2 = epsilon; (*elem_tail)->p1 = blkloopback; (*elem_tail)->label1 = epsilon; *elem_tail = blkend; elem->down->start_state = blkstart; start = newGLANode(); start->p1 = blkstart; start->label1 = epsilon; break; case POS_CLOSURE : /* Make a blk like this: * o-->o-->blk-->o-->o * ^---------| * where the farthest left node is the start node passed in. * The 'next' ptr of the blkstart node points to the endblk node. */ blkstart = newGLANode(); blkloopback = newGLANode(); blkend = newGLANode(); blkstart->p1 = build_GLA_for_block(elem->down, elem_tail); blkstart->label1 = epsilon; /* record the end of loop for "follow" computation */ blkstart->next = blkend; blkloopback->p1 = blkend; blkloopback->label1 = epsilon; blkloopback->p2 = blkstart; blkloopback->label2 = epsilon; (*elem_tail)->p1 = blkloopback; (*elem_tail)->label1 = epsilon; *elem_tail = blkend; elem->down->start_state = blkstart; start = newGLANode(); start->p1 = blkstart; start->label1 = epsilon; break; case OPT : /* Make a blk like this: * o-->o-->blk-->o * |---------^ * where the farthest left node is the start node passed in. */ blkstart = newGLANode(); blkend = newGLANode(); blkstart->p1 = build_GLA_for_block(elem->down, elem_tail); blkstart->label1 = epsilon; blkstart->p2 = blkend; blkstart->label2 = epsilon; (*elem_tail)->p1 = blkend; (*elem_tail)->label1 = epsilon; *elem_tail = (*elem_tail)->p1; elem->down->start_state = blkstart; start = newGLANode(); start->p1 = blkstart; start->label1 = epsilon; break; case BLOCK : /* return o->blk */ start = newGLANode(); start->p1 = build_GLA_for_block(elem, elem_tail); start->label1 = epsilon; elem->start_state = start; break; } return start; } void #ifdef __USE_PROTOS build_follow_links( GLA *end_of_rule, ListNode *refs ) #else build_follow_links( end_of_rule, refs ) GLA *end_of_rule; ListNode *refs; #endif { ListNode *p; GLA *f, *prev, *first=NULL; require(end_of_rule!=NULL, "build_follow_links: NULL tree pointer"); if ( refs == NULL ) /* no ref list, must be start symbol */ { /* append a '$' link to the end_input node */ end_of_rule->p1 = end_node; end_of_rule->label1 = end_of_input; return; } /* the refs list is a list of GLA nodes that follow references to * the rule associated with 'end_of_rule'. */ prev = NULL; for (p = refs->next; p!=NULL; p=p->next) { f = newGLANode(); f->p1 = (GLA *)p->elem; f->label1 = epsilon; /* connect new follow link into downward list */ if ( prev!=NULL ) { prev->p2 = f; prev->label2 = epsilon; } else { first = f; } prev = f; } /* connect end of rule to follow list */ end_of_rule->p1 = first; end_of_rule->label1 = epsilon; } void #ifdef __USE_PROTOS dump_GLAs( AST *rules ) #else dump_GLAs( rules ) AST *rules; #endif { AST *r; SymEntry *s; require(rules!=NULL, "dump_GLAs: NULL rules pointer"); fprintf(stderr,"\n"); for (r=rules; r!=NULL; r=r->right) { s = (SymEntry *) hash_get(symbols, r->text); require(s!=NULL, "build_GLA: sym tab broken"); dump_GLA( s->start_state ); fprintf(stderr,"\n"); } } /* Can only dump GLA's for BNF for the moment */ void #ifdef __USE_PROTOS dump_GLA( GLA *q ) #else dump_GLA( q ) GLA *q; #endif { GLA *prod, *p; fprintf(stderr,"o-->"); for (prod=q->p1; prod!=NULL; prod=prod->p2) { fprintf(stderr,"o"); for (p = prod; p->p1!=NULL;) { if ( p->visited ) break; p->visited = 1; if ( p->label1 > 0 && p->label1!=epsilon ) { fprintf(stderr,"--%s-->o", token_dict[p->label1]); p = p->p1; if ( p->label1 == end_of_input ) break; } else if ( p->next!=NULL ) { /*fprintf(stderr,"-%d-^ o", p->context); */ fprintf(stderr,"---^ o"); p = p->next; } else { fprintf(stderr,"----->o"); p = p->p1; } } fprintf(stderr,"\n"); if ( prod->p2!=NULL ) fprintf(stderr," |\n "); } } /* * Compare each alt of a BLOCK against every other to determine * whether or not any tokens predict more than one alt. */ void #ifdef __USE_PROTOS test_block_consistency( AST *blk, int block_type ) #else test_block_consistency( blk, block_type ) AST *blk; int block_type; #endif { AST *t; set in_common; GLA *alt1, *alt2, *start; int i1, i2; require(blk!=NULL&&blk->token==BLOCK, "test_BLOCK_consistency: NULL or invalid block"); t = blk->down; require(t!=NULL&&t->token==ALT, "test_BLOCK_consistency: invalid AST structure"); require(blk->start_state!=NULL, "test_BLOCK_consistency: no GLA structure for block"); start = blk->start_state->p1; for (alt1=start,i1=1; alt1!=NULL; alt1=alt1->p2,i1++, t=t->right) { require(!set_nil(alt1->lookahead), "test_BLOCK_consistency: invalid lookahead set"); for (alt2=alt1->p2,i2=i1+1; alt2!=NULL; alt2=alt2->p2,i2++) { in_common = set_and(alt1->lookahead, alt2->lookahead); if ( !set_nil(in_common) ) { fprintf(stderr, ErrHdr, FileStr[t->file], t->line); fprintf(stderr, " warning: alts %d and %d of (...) nondeterministic upon ", i1, i2); set_fprint(stderr, in_common); fprintf(stderr, "\n"); } set_free(in_common); } } if ( block_type == OPT || block_type == CLOSURE ) { /* test optional alt against all regular alts */ t = blk->down; for (alt1=blk->start_state->p1,i1=1; alt1!=NULL; alt1=alt1->p2,i1++, t=t->right) { in_common = set_and(alt1->lookahead, blk->start_state->lookahead); if ( !set_nil(in_common) ) { fprintf(stderr, ErrHdr, FileStr[t->file], t->line); fprintf(stderr, " warning: alt %d and optional branch of %s nondeterministic upon ", i1, block_type==OPT?"{...}":"(...)*"); set_fprint(stderr, in_common); fprintf(stderr, "\n"); } set_free(in_common); } } } static GLA * #ifdef __USE_PROTOS newGLANode(void) #else newGLANode() #endif { GLA *p; p = (GLA *) calloc(1, sizeof(GLA)); require(p!=NULL, "newGLANode: can't alloc memory"); p->in_rule = CurRule; return p; } gtkwave-3.3.86/contrib/pccts/sorcerer/sor.g0000664000175000017500000006612313166335473020167 0ustar bybellbybell/* * SORCERER Version 1.00B * * Terence Parr * U of MN, AHPCRC * April 1995 */ #header << /* 23-Sep-97 thm Accomodate user who needs to redefine ZZLEXBUFSIZE */ #ifndef ZZLEXBUFSIZE #define ZZLEXBUFSIZE 8000 #endif #include "pcctscfg.h" /* MR20 G. Hobbelt __USE_PROTOS #define */ #include "charbuf.h" #include "hash.h" #include "set.h" #include "sor.h" #define AST_FIELDS \ int token; char text[MaxAtom+1], label[MaxRuleName+1]; \ char *action; /* if action node, here is ptr to it */ \ char in,out; \ char init_action; /* set if Action and 1st action of alt */ \ int file; int line; /* set for BLOCK, ALT, nonterm nodes */ \ int upper_range; /* only if T1..T2 found */ \ GLA *start_state; /* ptr into GLA for this block */ \ int no_copy; /* copy input ptr to output ptr? */ \ ListNode *refvars; /* any ref vars defined for this rule */ \ unsigned char is_root; /* this token is a root #( A ... ) */ #define zzcr_ast(node, cur, _tok, _text) \ {(node)->token=_tok; strncpy((node)->text, _text,MaxAtom);} #define USER_ZZSYN #define zzAST_DOUBLE extern int define_num; >> << /* MR20 G. Hobbelt Fix for Borland C++ 4.x & 5.x compiling with ALL warnings enabled */ #if defined(__TURBOC__) #pragma warn -aus /* unused assignment of 'xxx' */ #endif #include "sym.h" #include "proto.h" >> #lexaction << #include "sym.h" #include "proto.h" int define_num = 0; char * #ifdef __USE_PROTOS scarf_to_end_of_func_call(void) #else scarf_to_end_of_func_call() #endif { static char func_call_str[MaxAtom+1]; char *p; p = &func_call_str[0]; more: if ( zzchar==')' ) { *p++ = zzchar; *p++ = '\0'; zzadvance(); return func_call_str; } if ( zzchar=='"' ) { *p++ = zzchar; zzadvance(); while ( zzchar!='"' ) { if ( zzchar=='\\' ) { *p++ = zzchar; zzadvance(); } *p++ = zzchar; zzadvance(); } } *p++ = zzchar; zzadvance(); goto more; } >> << void /* MR9 23-Sep-97 Eliminate complaint about no return value */ #ifdef __USE_PROTOS lisp( AST *tree, FILE *output ) #else lisp( tree, output ) AST *tree; FILE *output; #endif { while ( tree != NULL ) { if ( tree->down != NULL ) fprintf(output," ("); if ( tree->text[0]!='\0' ) { fprintf(output, " \""); if ( tree->label[0]!='\0' ) fprintf(output, "%s:", tree->label); switch ( tree->token ) { case OPT : case POS_CLOSURE : case CLOSURE : case PRED_OP : fprintf(output, "%s", tree->text); break; default : fprintf(output, "%s[%s]", zztokens[tree->token], tree->text); } fprintf(output, "\""); } else { fprintf(output, " %s", zztokens[tree->token]); } lisp(tree->down, output); if ( tree->down != NULL ) fprintf(output," )"); tree = tree->right; } } AST * #ifdef __USE_PROTOS zzmk_ast(AST *node, int token) #else zzmk_ast(node, token) AST *node; int token; #endif { node->token = token; return node; } AST * #ifdef __USE_PROTOS read_sor_desc(FILE *f) #else read_sor_desc(f) FILE *f; #endif { AST *root = NULL; zzline = 1; ANTLR(sordesc(&root), f); if ( found_error ) return NULL; if ( print_guts ) { fprintf(stderr, "Internal Represenation of Tree Grammar:\n"); lisp(root, stderr); fprintf(stderr, "\n"); } last_valid_token = token_type; end_of_input = token_type++;/* end of input token type is 1 + last real token */ epsilon = token_type++; /* epsilon token type is 2 + last real token */ wild_card = token_type++; /* wild_card_token is 3 + last real token */ token_association(end_of_input, "$"); token_association(epsilon, "[Ep]"); token_association(wild_card, "."); zzdouble_link(root, NULL, NULL); rules = root; if ( root!=NULL ) build_GLA(root); if ( print_guts ) { fprintf(stderr, "Internal Represenation of Grammar Lookahead Automaton:\n"); dump_GLAs(root); fprintf(stderr, "\n"); } return root; } >> #lexclass STRINGS #token RExpr "\"" << zzmode(START); >> #token "\n|\r|\r\n" << /* MR16a */ zzline++; warn("eoln found in string"); zzskip(); >> #token "\\~[]" << zzmore(); >> #token "~[\n\r\"\\]+" << zzmore(); >> /* MR16a */ #lexclass ACTION_STRINGS #token "\"" << zzmode(ACTIONS); zzmore(); >> #token "\n|\r|\r\n" << /* MR16a */ zzline++; warn("eoln found in string (in user action)"); zzskip(); >> #token "\\~[]" << zzmore(); >> #token "~[\n\r\"\\]+" << zzmore(); >> /* MR16a */ #lexclass ACTION_CHARS #token "'" << zzmode(ACTIONS); zzmore(); >> #token "\n|\r|\r\n" << /* MR16a */ zzline++; warn("eoln found in char literal (in user action)"); zzskip(); >> #token "\\~[]" << zzmore(); >> #token "~[\n\r'\\]+" << zzmore(); >> /* MR16a */ #lexclass ACTION_COMMENTS #token "\*/" << zzmode(ACTIONS); zzmore(); >> #token "\*" << zzmore(); >> #token "\n|\r|\r\n" << zzline++; zzmore(); >> /* MR16a */ #token "~[\n\r\*]+" << zzmore(); >> /* MR16a */ #lexclass ACTION_CPP_COMMENTS #token "\n|\r|\r\n" << zzline++; zzmode(ACTIONS); zzmore(); >> /* MR16a */ #token "~[\n\r]+" << zzmore(); >> /* MR16a */ #lexclass CPP_COMMENTS #token "\n|\r|\r\n" << zzline++; zzmode(START); zzskip(); >> /* MR16a */ #token "~[\n\r]+" << zzskip(); >> /* MR16a */ #lexclass COMMENTS #token "\*/" << zzmode(START); zzskip(); >> #token "\*" << zzskip(); >> #token "\n|\r|\r\n" << zzline++; zzskip(); >> /* MR16a */ #token "~[\n\r\*]+" << zzskip(); >> /* MR16a */ #lexclass REFVAR_SCARF /* everything until a ')' */ #token "~[\)]+ \)" <<{ RefVarRec *rf; zzskip(); zzbegexpr[strlen(zzbegexpr)-1] = '\0'; rf=refVarRec(zzbegexpr); list_add(&AllRefVars, rf); list_add(&RefVars, rf); zzmode(ACTIONS); zzmore(); zzreplstr(""); }>> /* * This lexical class accepts actions of type [..] and <<..>> * * It translates the following special items: * * #[args] --> "ast_node(args)" add "classname::" for C++, however. * #[] --> "ast_empty_node()" * #( root, child1, ..., childn ) --> "ast_make(root, child1, ...., childn, NULL)" * #() --> "NULL" * * Things for reference variables are also recognized: * blah blah * * To escape, * * \] --> ] * \) --> ) * \$ --> $ * \# --> # * * A stack is used to nest action terminators because they can be nested * like crazy: << #[#[..],..] >> */ #lexclass ACTIONS #token Action "\>\>" << /* these do not nest */ zzmode(START); NLATEXT[0] = ' '; NLATEXT[1] = ' '; zzbegexpr[0] = ' '; zzbegexpr[1] = ' '; if ( zzbufovf ) { found_error = 1; err( eMsgd("action buffer overflow; size %d",ZZLEXBUFSIZE)); } >> #token PassAction "\]" << if ( topint() == ']' ) { popint(); if ( istackempty() ) /* terminate action */ { zzmode(START); NLATEXT[0] = ' '; zzbegexpr[0] = ' '; if ( zzbufovf ) { found_error = 1; err( eMsgd("parameter buffer overflow; size %d",ZZLEXBUFSIZE)); } } else { /* terminate #[..] */ zzreplstr(")"); zzmore(); } } else if ( topint() == '|' ) { /* end of simple [...] */ popint(); zzmore(); } else zzmore(); >> #token "\n|\r|\r\n" << zzline++; zzmore(); >> /* MR16a */ #token "\>" << zzmore(); >> #token "#[_a-zA-Z][_a-zA-Z0-9]*" << if ( !(strcmp(zzbegexpr, "#ifdef")==0 || strcmp(zzbegexpr, "#else")==0 || strcmp(zzbegexpr, "#endif")==0 || strcmp(zzbegexpr, "#ifndef")==0 || strcmp(zzbegexpr, "#if")==0 || strcmp(zzbegexpr, "#define")==0 || strcmp(zzbegexpr, "#pragma")==0 || strcmp(zzbegexpr, "#undef")==0 || strcmp(zzbegexpr, "#import")==0 || strcmp(zzbegexpr, "#line")==0 || strcmp(zzbegexpr, "#include")==0 || strcmp(zzbegexpr, "#error")==0) ) { static char buf[100]; if ( !transform ) { warn("#id used in nontransform mode; # ignored"); sprintf(buf, "%s", zzbegexpr+1); } else { if ( CurRule==NULL ) {warn("#id used in action outside of rule; ignored");} else if ( strcmp(zzbegexpr+1,CurRule)==0 ) strcpy(buf, "(*_result)"); } zzreplstr(buf); } zzmore(); >> #token "#\[\]" << if ( GenCPP ) zzreplstr("new SORAST"); else zzreplstr("ast_empty_node()"); zzmore(); >> #token "#\(\)" << zzreplstr("NULL"); zzmore(); >> #token "#\[" << pushint(']'); if ( GenCPP ) zzreplstr("new SORAST("); else zzreplstr("ast_node("); zzmore(); >> #token "#\(" << pushint('}'); if ( GenCPP ) zzreplstr("PCCTS_AST::make("); else zzreplstr("ast_make("); zzmore(); >> #token "#" << zzmore(); >> #token "\)" << if ( istackempty() ) zzmore(); else if ( topint()==')' ) { popint(); } else if ( topint()=='}' ) { popint(); /* terminate #(..) */ zzreplstr(", NULL)"); } zzmore(); >> #token "\[" << pushint('|'); /* look for '|' to terminate simple [...] */ zzmore(); >> #token "\(" << pushint(')'); zzmore(); >> #token "\\\]" << zzreplstr("]"); zzmore(); >> #token "\\\)" << zzreplstr(")"); zzmore(); >> #token "\\>" << zzreplstr(">"); zzmore(); >> #token "'" << zzmode(ACTION_CHARS); zzmore();>> #token "\"" << zzmode(ACTION_STRINGS); zzmore();>> #token "\\#" << zzreplstr("#"); zzmore(); >> /*#token "\\\\" << zzmore(); >> /* need this for some reason */ #token "\\~[\]\)>#]" << zzmore(); >> /* escaped char, always ignore */ #token "/" << zzmore(); >> #token "/\*" << zzmode(ACTION_COMMENTS); zzmore(); >> #token "\*/" << err("Missing /*; found dangling */ in action"); zzmore(); >> #token "//" << zzmode(ACTION_CPP_COMMENTS); zzmore(); >> #token "\@\(" <> #token "\@" << zzmore(); if ( !GenCPP ) zzreplstr("_parser->"); >> #token "[a-zA-Z_]+\(" << if ( (GenCPP && strcmp(zzbegexpr,"ast_scan(")==0) || (!GenCPP && strcmp(zzbegexpr,"ast_scan(")==0) ) { char *args=scarf_to_end_of_func_call(); zzreplstr(cvt_token_str(zzbegexpr, args)); zzmore(); } else { pushint(')'); zzmore(); } >> #token "[a-zA-Z_]+" << zzmore(); >> #token "~[a-zA-Z_\n\r\)\(\\#\>\]\[\"'/\@]+" << zzmore(); >> /* MR16a */ #lexclass START #token "[\t\ ]+" << zzskip(); >> /* Ignore White */ #token "\n|\r|\n\r" << zzline++; zzskip(); >> /* Track Line # */ /* MR16a */ #token "\[" << zzmode(ACTIONS); zzmore(); istackreset(); pushint(']'); >> #token "\<\<" << action_file=CurFile; action_line=zzline; zzmode(ACTIONS); zzmore(); istackreset(); pushint('>'); >> #token "\"" << zzmode(STRINGS); zzmore(); >> #token "/\*" << zzmode(COMMENTS); zzskip(); >> #token "\*/" << err("Missing /*; found dangling */"); zzskip(); >> #token "//" << zzmode(CPP_COMMENTS); zzskip(); >> #token "\>\>" << err("Missing <<; found dangling \>\>"); zzskip(); >> #token Eof "@" << /* L o o k F o r A n o t h e r F i l e */ { FILE *new_input; new_input = NextFile(); if ( new_input != NULL ) { fclose( input ); input = new_input; zzrdstream( input ); /*zzadvance(); ** Get 1st char of this file */ zzskip(); /* Skip the Eof (@) char i.e continue */ } } >> #token Header "#header" #token Tokdef "#tokdefs" #token BLOCK /* used only as place-holder in intermediate tree */ #token ALT /* used only as place-holder in intermediate tree */ #token LABEL ":" /* used only as place-holder in intermediate tree */ #token OPT "\{" /* These are labeled so we can ref them in trees */ #token POS_CLOSURE "\+" #token CLOSURE "\*" #token WILD "." #token PRED_OP "?" #token BT "#\(" #token RULE #token REFVAR #errclass "atomic-element" { WILD NonTerm Token } #errclass "rule-header" { PassAction LABEL "\<" "\>" } /* * Build trees for a sorcerer description */ sordesc : <> ( header <> | tokdef <> )* << if ( he==0 && !Inline && !GenCPP ) warnNoFL("missing #header statement"); if ( he>1 ) warnNoFL("extra #header statement"); if ( to>1 ) warnNoFL("extra #tokdef statement"); >> ( Action! <> )* { class_def } ( Action! << if ( CurClassName[0]!='\0' ) list_add(&class_actions, actiondup(LATEXT(1))); else list_add(&before_actions, actiondup(LATEXT(1))); >> )* ( rule )* ( Action! << if ( CurClassName[0]!='\0' ) list_add(&class_actions, actiondup(LATEXT(1))); else list_add(&before_actions, actiondup(LATEXT(1))); >> )* { "\}"! // end of class def << if ( CurClassName[0]=='\0' ) err("missing class definition for trailing '}'"); >> } ( Action! <> )* "@"! ; <> header: "#header"! Action! <> ; <> tokdef: "#tokdefs"! RExpr! <<{ AST *dumb = NULL; zzantlr_state st; FILE *f; struct zzdlg_state dst; strcpy(tokdefs_file, LATEXT(1)); strcpy(tokdefs_file, tokdefs_file+1); /* remove quotes */ tokdefs_file[strlen(tokdefs_file)-1] = '\0'; zzsave_antlr_state(&st); zzsave_dlg_state(&dst); define_num=0; f = fopen(tokdefs_file, "r"); if ( f==NULL ) {found_error=1; err(eMsg1("cannot open token defs file '%s'", tokdefs_file));} else {ANTLRm(enum_file(&dumb), f, PARSE_ENUM_FILE);} zzrestore_antlr_state(&st); zzrestore_dlg_state(&dst); UserDefdTokens = 1; }>> ; <> class_def! : "class" ( NonTerm <> | Token <> ) <> "\{" ; /* * Create a rule tree: * * NonTerm[arg_action, ret_val_action] * | * v * block */ rule: <> NonTerm^ << #0->file = CurFile; #0->line = zzline; CurRule = $1.text; p = (SymEntry *) hash_get(symbols, $1.text); if ( p==NULL ) { p = (SymEntry *) hash_add(symbols, $1.text, (Entry *) newSymEntry($1.text)); p->token = NonTerm; p->defined = 1; p->definition = #0; } else if ( p->token != NonTerm ) { err(eMsg2("rule definition clashes with %s definition: '%s'", zztokens[p->token], p->str)); trouble = 1; } else { if ( p->defined ) { trouble = 1; err(eMsg1("rule multiply defined: '%s'", $1.text)); } else { p->defined = 1; p->definition = #0; } } >> { "!"! <no_copy=no_copy=1;>> } ( { "\<"! } PassAction! <args = actiondup(LATEXT(1));>> | ) { "\>"! PassAction! <rt = actiondup(LATEXT(1));>> } ":"! block[no_copy] ";"! << if ( !trouble ) #0->refvars = RefVars; RefVars=NULL; >> << if ( trouble ) #0 = NULL; CurRule = NULL; >> ; <> /* Create a tree for a block: * * BLOCK * | * v * alt1 ---> alt2 ---> ... ---> altn */ block[int no_copy] : <> alt[$no_copy] ( "\|"! alt[$no_copy] )* << #0 = #( #[BLOCK], #0 ); #0->file = file; #0->line = line; >> ; <> /* Create a tree for an alternative: * * ALT * | * v * e1 ---> e2 ---> ... ---> en */ alt[int no_copy] : <> { "!"! <> } { ( labeled_element[$no_copy||local_no_copy] | element[$no_copy||local_no_copy] | tree[$no_copy||local_no_copy] )+ } << #0 = #( #[ALT], #0 ); #0->file = file; #0->line = line; >> ; <> /* a rule ref looks like: * * NonTerm * | * v * arg_action ---> ret_val_action * * Blocks that have a suffix look like this: * * OP * | * v * block * * Optional blocks look like: * * OPT * | * v * block * * Predicates are like actions except they have a root: #( PRED_OP Action ) */ element[int no_copy] : <> token[$no_copy] | <> NonTerm^ { "!"! <> } { { "\<"! } PassAction <<#0->in = 1;>> } { "\>"! PassAction <<#0->out = 1;>> } <<#0->file = file; #0->line=line;>> <<#0->no_copy = $no_copy || local_no_copy;>> | <> Action <<#1->action = actiondup(LATEXT(1));>> { "?"^ } <<#0->file = file; #0->line=line;>> | <> "\("! block[$no_copy] "\)"! ( "\*"^ | "\+"^ | "?"^ <> | ) <<#0->file = file; #0->line=line;>> | "\{"^ block[$no_copy] "\}"! | <> "." { "!"! <> } <<#0->no_copy = $no_copy || local_no_copy;>> <<#0->file = file; #0->line=line;>> ; <> /* labels on an element look like: #( LABEL element ) */ labeled_element[int no_copy] : <> ( Token! <

Electronic waveform viewer for viewing simulation results

GTKWave is a fully featured GTK+ based waveform viewer which reads FST, LXT, LXT2, VZT, and GHW files as well as standard Verilog VCD/EVCD files and allows their viewing.

The viewer supports both post-mortem viewing of VCD files and interactive viewing of VCD data. Tcl scripting and callback capability allow for remote control by other applications.

http://gtkwave.sourceforge.net/ http://gtkwave.sourceforge.net/gtkwave-appdata.png bybell@rocketmail.com gtkwave-3.3.86/share/appdata/Makefile.in0000664000175000017500000003064113166335473017371 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = share/appdata DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = gtkwave.appdata.xml all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign share/appdata/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign share/appdata/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/share/appdata/Makefile.am0000664000175000017500000000007013166335473017351 0ustar bybellbybell## -*- makefile -*- ## EXTRA_DIST= gtkwave.appdata.xml gtkwave-3.3.86/share/icons/0000775000175000017500000000000013166335473015021 5ustar bybellbybellgtkwave-3.3.86/share/icons/gnome/0000775000175000017500000000000013166335473016126 5ustar bybellbybellgtkwave-3.3.86/share/icons/gnome/Makefile.am0000664000175000017500000000006213166335473020160 0ustar bybellbybell## -*- makefile -*- ## SUBDIRS= 16x16 32x32 48x48 gtkwave-3.3.86/share/icons/gnome/48x48/0000775000175000017500000000000013166335473016725 5ustar bybellbybellgtkwave-3.3.86/share/icons/gnome/48x48/mimetypes/0000775000175000017500000000000013166335473020741 5ustar bybellbybellgtkwave-3.3.86/share/icons/gnome/48x48/mimetypes/gnome-mime-application-vnd.gtkwave-ghw.png0000664000175000017500000000472213166335473031026 0ustar bybellbybell‰PNG  IHDR00Wù‡bKGDÿÿÿ ½§“ ‡IDAThÞÕš[lWÇߙˮw×Yß’ÆI/iÉ­nÚ´å"D6iZB$ŠÊ ÑHH´¼ðP!/ÐâñŠ@ª*$$¤V‚Tú‚D€&i“($¨U\ÇN¼IÇ^{os9‡‡™Ù¯÷V'TâH³3>·ùþçÿÝÎÃÿy‘® Q±3èdÆ ÜõÃcŒÑñÚ|4e""Ƴyóæ;9ò£B¡°”R""ˆZkŒ1h­×=÷ú; ÃuãÚëÚÆcŒ=33óÊÌÌÌk±¼¦'¥”¥µ=úÛ—^zéè¶mÛB­µ•ŸcLÇ h Ñ«_ºo{¿¤^DÌêêª;vléÕW_}¨Z­Î& œÈa·Hs¹Üãã㸮–Ëe,˃ã8kŒY£`Rßé¹W]{{.—ctttÈqœÍÀl; v§A1µÚC¥R±–——-Û¶ÑZ344D†É u¦ßßcY–cBPÕV:1z§`Ûvó Ã¥T¢j=WùV$r$ïéVì^´«IúÙ³Nmn€ä½ƒŒ±ûM’ž(í…”RLOO“ØGû˜^@zÅ ¥{öì!“É Wú26Ð4€ÉÉI&&&:ªÓFY\×8(vÐîiÒ/H¹zõ*årÛ¶ûÒžÔ'‹Ò À®]»š ôÝW…ÚÕ']¶nÝÊøøøCë`PÚAßíÆÙÎ@b½„´ˆHÓºxÎÁ¤½P·@•0p;½‘ˆà8Îõ¹%: \ƒ0ðaý¿RŠÝ»w¯ñBdY–e†ášö0ÐÏ»¤d\_RJQ©T°m›L&³F¨R©Ô•N+¯”bjjŠl6ÛU $CtOJ_¾|™ÉÉI …šÉñBíl(¥‚ / iÁoÙ íØ±ƒ±±1ªÕ*¶m7'Íò(Që\ú¹Ð žå¶¥ÉD®ëR«Õš)D"„5F:»Ún Æm˜dÒu‚! ߓݑ5Çw‘¨¾]µˆ’ziî©Ló7j3ë6Eb ãFa:ü;¾UÆC+EÕJëTÆjZóŠŠÁ™d± 5aÀ½Öãäd4‚r»HCð¬e^þî/xÿL‰ÌÍÔÓ›˜9QaiÞÇv8\dö*KW<”-˜å«~ä  C}E3¾ÆÒ¼Çö}yªË!+×–¯úMè'|Oè‰ã:ë·-4V5{Y¹PºPCTçq‘íDÏçþºÄþ/bt«.é%ÍÞ·¨B]Ò°÷Ð0…cd²¢ >;Îâ¥>;N¶h14l1õÔoZ60bqÿ¡•Ëî~´Àìé ùq4šü˜…À€ Gb¥„¹wjüûÄÙ!—‡žed›Ëk?˜aa¦Ží*¦žaöÝ KW¢8`4ì;<Ê¥“«”¯ù ÍžEîÜ_àøË‘Úch|GG^É¿ÉdžŽ%N“g=ÿöì{j‚â¤ÃÜÙ ÿµÒÒwßP¾æ³\jÙ@èÊ×#Ÿpêµ|å'wS¼ãcxUÍ+ßz¯¢ÛTjƒºëOôãdÿüÝ5.¾Uc×Þ}ý&–­ÐĘ8M,KÐa”ç«8DZ,áíß/0¼Åfþ\›s>õU±eKèíG>ng ¾ÿ˯QY Á@aÂæ™ƒt²‘¡ ïö‰Ý…±h¼¨ÑAœ´ipóBí&lhìœâ®4êyÕÿ c/zÌv¨Ï³óÁ'°í(ÍЉ¢m²Á‘‡Rªµ+Óauf ‘€6ÆÐ¨{8z-!ŠfÇŽòt`Jkm÷òBC2ÚÜpˆN5[_€RˆOsÛ)GW?ýH,8&>,!” ]²ÐÊ0º °zÐÍ•F  RGñq/Q‘ð&•ã4÷ɤƒ•ÁHó)Ñ(¡6F€<0 x@ó਀¸€mŒQq–öO -Û¢>ÊDÖGÓí$íñnÝ$Mñ=½WnBIeq&¬1n,@#Ù‰X#AP(´mÛbYZë®ç ÝÕ› Ùì×íÜ'‰;©LØxž'aZ*m4=T( N¡ß·ùþçÿÝÎÃÿy‘® Q±3èdÆ ÜõÃcŒÑñÚ|4e""Ƴyóæ;9ò£B¡°”R""ˆZkŒ1h­×=÷ú; ÃuãÚëÚÆcŒ=33óÊÌÌÌk±¼¦'¥”¥µ=úÛ—^zéè¶mÛB­µ•ŸcLÇ h Ñ«_ºo{¿¤^DÌêêª;vléÕW_}¨Z­Î& œÈa·Hs¹Üãã㸮–Ëe,˃ã8kŒY£`Rßé¹W]{{.—ctttÈqœÍÀl; v§A1µÚC¥R±–——-Û¶ÑZ344D†É u¦ßßcY–cBPÕV:1z§`Ûvó Ã¥T¢j=WùV$r$ïéVì^´«IúÙ³Nmn€ä½ƒŒ±ûM’ž(í…”RLOO“ØGû˜^@zÅ ¥{öì!“É Wú26Ð4€ÉÉI&&&:ªÓFY\×8(vÐîiÒ/H¹zõ*årÛ¶ûÒžÔ'‹Ò À®]»š ôÝW…ÚÕ']¶nÝÊøøøCë`PÚAßíÆÙÎ@b½„´ˆHÓºxÎÁ¤½P·@•0p;½‘ˆà8Îõ¹%: \ƒ0ðaý¿RŠÝ»w¯ñBdY–e†ášö0ÐÏ»¤d\_RJQ©T°m›L&³F¨R©Ô•N+¯”bjjŠl6ÛU $CtOJ_¾|™ÉÉI …šÉñBíl(¥‚ / iÁoÙ íØ±ƒ±±1ªÕ*¶m7'Íò(Që\ú¹Ð žå¶¥ÉD®ëR«Õš)D"„5F:»Ún Æm˜dÒu‚! ߓݑ5Çw‘¨¾]µˆ’ziî©Ló7j3ë6Eb ãFa:ü;¾UÆC+EÕJëTÆjZóŠŠÁ™d± 5aÀ½Öãäd4‚r»HCð¬e^þî/xÿL‰ÌÍÔÓ›˜9QaiÞÇv8\dö*KW<”-˜å«~ä  C}E3¾ÆÒ¼Çö}yªË!+×–¯úMè'|Oè‰ã:ë·-4V5{Y¹PºPCTçq‘íDÏçþºÄþ/bt«.é%ÍÞ·¨B]Ò°÷Ð0…cd²¢ >;Îâ¥>;N¶h14l1õÔoZ60bqÿ¡•Ëî~´Àìé ùq4šü˜…À€ Gb¥„¹wjüûÄÙ!—‡žed›Ëk?˜aa¦Ží*¦žaöÝ KW¢8`4ì;<Ê¥“«”¯ù ÍžEîÜ_àøË‘Úch|GG^É¿ÉdžŽ%N“g=ÿöì{j‚â¤ÃÜÙ ÿµÒÒwßP¾æ³\jÙ@èÊ×#Ÿpêµ|å'wS¼ãcxUÍ+ßz¯¢ÛTjƒºëOôãdÿüÝ5.¾Uc×Þ}ý&–­ÐĘ8M,KÐa”ç«8DZ,áíß/0¼Åfþ\›s>õU±eKèíG>ng ¾ÿ˯QY Á@aÂæ™ƒt²‘¡ ïö‰Ý…±h¼¨ÑAœ´ipóBí&lhìœâ®4êyÕÿ c/zÌv¨Ï³óÁ'°í(ÍЉ¢m²Á‘‡Rªµ+Óauf ‘€6ÆÐ¨{8z-!ŠfÇŽòt`Jkm÷òBC2ÚÜpˆN5[_€RˆOsÛ)GW?ýH,8&>,!” ]²ÐÊ0º °zÐÍ•F  RGñq/Q‘ð&•ã4÷ɤƒ•ÁHó)Ñ(¡6F€<0 x@ó਀¸€mŒQq–öO -Û¢>ÊDÖGÓí$íñnÝ$Mñ=½WnBIeq&¬1n,@#Ù‰X#AP(´mÛbYZë®ç ÝÕ› Ùì×íÜ'‰;©LØxž'aZ*m4=T( N¡ß·ùþçÿÝÎÃÿy‘® Q±3èdÆ ÜõÃcŒÑñÚ|4e""Ƴyóæ;9ò£B¡°”R""ˆZkŒ1h­×=÷ú; ÃuãÚëÚÆcŒ=33óÊÌÌÌk±¼¦'¥”¥µ=úÛ—^zéè¶mÛB­µ•ŸcLÇ h Ñ«_ºo{¿¤^DÌêêª;vléÕW_}¨Z­Î& œÈa·Hs¹Üãã㸮–Ëe,˃ã8kŒY£`Rßé¹W]{{.—ctttÈqœÍÀl; v§A1µÚC¥R±–——-Û¶ÑZ344D†É u¦ßßcY–cBPÕV:1z§`Ûvó Ã¥T¢j=WùV$r$ïéVì^´«IúÙ³Nmn€ä½ƒŒ±ûM’ž(í…”RLOO“ØGû˜^@zÅ ¥{öì!“É Wú26Ð4€ÉÉI&&&:ªÓFY\×8(vÐîiÒ/H¹zõ*årÛ¶ûÒžÔ'‹Ò À®]»š ôÝW…ÚÕ']¶nÝÊøøøCë`PÚAßíÆÙÎ@b½„´ˆHÓºxÎÁ¤½P·@•0p;½‘ˆà8Îõ¹%: \ƒ0ðaý¿RŠÝ»w¯ñBdY–e†ášö0ÐÏ»¤d\_RJQ©T°m›L&³F¨R©Ô•N+¯”bjjŠl6ÛU $CtOJ_¾|™ÉÉI …šÉñBíl(¥‚ / iÁoÙ íØ±ƒ±±1ªÕ*¶m7'Íò(Që\ú¹Ð žå¶¥ÉD®ëR«Õš)D"„5F:»Ún Æm˜dÒu‚! ߓݑ5Çw‘¨¾]µˆ’ziî©Ló7j3ë6Eb ãFa:ü;¾UÆC+EÕJëTÆjZóŠŠÁ™d± 5aÀ½Öãäd4‚r»HCð¬e^þî/xÿL‰ÌÍÔÓ›˜9QaiÞÇv8\dö*KW<”-˜å«~ä  C}E3¾ÆÒ¼Çö}yªË!+×–¯úMè'|Oè‰ã:ë·-4V5{Y¹PºPCTçq‘íDÏçþºÄþ/bt«.é%ÍÞ·¨B]Ò°÷Ð0…cd²¢ >;Îâ¥>;N¶h14l1õÔoZ60bqÿ¡•Ëî~´Àìé ùq4šü˜…À€ Gb¥„¹wjüûÄÙ!—‡žed›Ëk?˜aa¦Ží*¦žaöÝ KW¢8`4ì;<Ê¥“«”¯ù ÍžEîÜ_àøË‘Úch|GG^É¿ÉdžŽ%N“g=ÿöì{j‚â¤ÃÜÙ ÿµÒÒwßP¾æ³\jÙ@èÊ×#Ÿpêµ|å'wS¼ãcxUÍ+ßz¯¢ÛTjƒºëOôãdÿüÝ5.¾Uc×Þ}ý&–­ÐĘ8M,KÐa”ç«8DZ,áíß/0¼Åfþ\›s>õU±eKèíG>ng ¾ÿ˯QY Á@aÂæ™ƒt²‘¡ ïö‰Ý…±h¼¨ÑAœ´ipóBí&lhìœâ®4êyÕÿ c/zÌv¨Ï³óÁ'°í(ÍЉ¢m²Á‘‡Rªµ+Óauf ‘€6ÆÐ¨{8z-!ŠfÇŽòt`Jkm÷òBC2ÚÜpˆN5[_€RˆOsÛ)GW?ýH,8&>,!” ]²ÐÊ0º °zÐÍ•F  RGñq/Q‘ð&•ã4÷ɤƒ•ÁHó)Ñ(¡6F€<0 x@ó਀¸€mŒQq–öO -Û¢>ÊDÖGÓí$íñnÝ$Mñ=½WnBIeq&¬1n,@#Ù‰X#AP(´mÛbYZë®ç ÝÕ› Ùì×íÜ'‰;©LØxž'aZ*m4=T( N¡ß·ùþçÿÝÎÃÿy‘® Q±3èdÆ ÜõÃcŒÑñÚ|4e""Ƴyóæ;9ò£B¡°”R""ˆZkŒ1h­×=÷ú; ÃuãÚëÚÆcŒ=33óÊÌÌÌk±¼¦'¥”¥µ=úÛ—^zéè¶mÛB­µ•ŸcLÇ h Ñ«_ºo{¿¤^DÌêêª;vléÕW_}¨Z­Î& œÈa·Hs¹Üãã㸮–Ëe,˃ã8kŒY£`Rßé¹W]{{.—ctttÈqœÍÀl; v§A1µÚC¥R±–——-Û¶ÑZ344D†É u¦ßßcY–cBPÕV:1z§`Ûvó Ã¥T¢j=WùV$r$ïéVì^´«IúÙ³Nmn€ä½ƒŒ±ûM’ž(í…”RLOO“ØGû˜^@zÅ ¥{öì!“É Wú26Ð4€ÉÉI&&&:ªÓFY\×8(vÐîiÒ/H¹zõ*årÛ¶ûÒžÔ'‹Ò À®]»š ôÝW…ÚÕ']¶nÝÊøøøCë`PÚAßíÆÙÎ@b½„´ˆHÓºxÎÁ¤½P·@•0p;½‘ˆà8Îõ¹%: \ƒ0ðaý¿RŠÝ»w¯ñBdY–e†ášö0ÐÏ»¤d\_RJQ©T°m›L&³F¨R©Ô•N+¯”bjjŠl6ÛU $CtOJ_¾|™ÉÉI …šÉñBíl(¥‚ / iÁoÙ íØ±ƒ±±1ªÕ*¶m7'Íò(Që\ú¹Ð žå¶¥ÉD®ëR«Õš)D"„5F:»Ún Æm˜dÒu‚! ߓݑ5Çw‘¨¾]µˆ’ziî©Ló7j3ë6Eb ãFa:ü;¾UÆC+EÕJëTÆjZóŠŠÁ™d± 5aÀ½Öãäd4‚r»HCð¬e^þî/xÿL‰ÌÍÔÓ›˜9QaiÞÇv8\dö*KW<”-˜å«~ä  C}E3¾ÆÒ¼Çö}yªË!+×–¯úMè'|Oè‰ã:ë·-4V5{Y¹PºPCTçq‘íDÏçþºÄþ/bt«.é%ÍÞ·¨B]Ò°÷Ð0…cd²¢ >;Îâ¥>;N¶h14l1õÔoZ60bqÿ¡•Ëî~´Àìé ùq4šü˜…À€ Gb¥„¹wjüûÄÙ!—‡žed›Ëk?˜aa¦Ží*¦žaöÝ KW¢8`4ì;<Ê¥“«”¯ù ÍžEîÜ_àøË‘Úch|GG^É¿ÉdžŽ%N“g=ÿöì{j‚â¤ÃÜÙ ÿµÒÒwßP¾æ³\jÙ@èÊ×#Ÿpêµ|å'wS¼ãcxUÍ+ßz¯¢ÛTjƒºëOôãdÿüÝ5.¾Uc×Þ}ý&–­ÐĘ8M,KÐa”ç«8DZ,áíß/0¼Åfþ\›s>õU±eKèíG>ng ¾ÿ˯QY Á@aÂæ™ƒt²‘¡ ïö‰Ý…±h¼¨ÑAœ´ipóBí&lhìœâ®4êyÕÿ c/zÌv¨Ï³óÁ'°í(ÍЉ¢m²Á‘‡Rªµ+Óauf ‘€6ÆÐ¨{8z-!ŠfÇŽòt`Jkm÷òBC2ÚÜpˆN5[_€RˆOsÛ)GW?ýH,8&>,!” ]²ÐÊ0º °zÐÍ•F  RGñq/Q‘ð&•ã4÷ɤƒ•ÁHó)Ñ(¡6F€<0 x@ó਀¸€mŒQq–öO -Û¢>ÊDÖGÓí$íñnÝ$Mñ=½WnBIeq&¬1n,@#Ù‰X#AP(´mÛbYZë®ç ÝÕ› Ùì×íÜ'‰;©LØxž'aZ*m4=T( N¡ß·ùþçÿÝÎÃÿy‘® Q±3èdÆ ÜõÃcŒÑñÚ|4e""Ƴyóæ;9ò£B¡°”R""ˆZkŒ1h­×=÷ú; ÃuãÚëÚÆcŒ=33óÊÌÌÌk±¼¦'¥”¥µ=úÛ—^zéè¶mÛB­µ•ŸcLÇ h Ñ«_ºo{¿¤^DÌêêª;vléÕW_}¨Z­Î& œÈa·Hs¹Üãã㸮–Ëe,˃ã8kŒY£`Rßé¹W]{{.—ctttÈqœÍÀl; v§A1µÚC¥R±–——-Û¶ÑZ344D†É u¦ßßcY–cBPÕV:1z§`Ûvó Ã¥T¢j=WùV$r$ïéVì^´«IúÙ³Nmn€ä½ƒŒ±ûM’ž(í…”RLOO“ØGû˜^@zÅ ¥{öì!“É Wú26Ð4€ÉÉI&&&:ªÓFY\×8(vÐîiÒ/H¹zõ*årÛ¶ûÒžÔ'‹Ò À®]»š ôÝW…ÚÕ']¶nÝÊøøøCë`PÚAßíÆÙÎ@b½„´ˆHÓºxÎÁ¤½P·@•0p;½‘ˆà8Îõ¹%: \ƒ0ðaý¿RŠÝ»w¯ñBdY–e†ášö0ÐÏ»¤d\_RJQ©T°m›L&³F¨R©Ô•N+¯”bjjŠl6ÛU $CtOJ_¾|™ÉÉI …šÉñBíl(¥‚ / iÁoÙ íØ±ƒ±±1ªÕ*¶m7'Íò(Që\ú¹Ð žå¶¥ÉD®ëR«Õš)D"„5F:»Ún Æm˜dÒu‚! ߓݑ5Çw‘¨¾]µˆ’ziî©Ló7j3ë6Eb ãFa:ü;¾UÆC+EÕJëTÆjZóŠŠÁ™d± 5aÀ½Öãäd4‚r»HCð¬e^þî/xÿL‰ÌÍÔÓ›˜9QaiÞÇv8\dö*KW<”-˜å«~ä  C}E3¾ÆÒ¼Çö}yªË!+×–¯úMè'|Oè‰ã:ë·-4V5{Y¹PºPCTçq‘íDÏçþºÄþ/bt«.é%ÍÞ·¨B]Ò°÷Ð0…cd²¢ >;Îâ¥>;N¶h14l1õÔoZ60bqÿ¡•Ëî~´Àìé ùq4šü˜…À€ Gb¥„¹wjüûÄÙ!—‡žed›Ëk?˜aa¦Ží*¦žaöÝ KW¢8`4ì;<Ê¥“«”¯ù ÍžEîÜ_àøË‘Úch|GG^É¿ÉdžŽ%N“g=ÿöì{j‚â¤ÃÜÙ ÿµÒÒwßP¾æ³\jÙ@èÊ×#Ÿpêµ|å'wS¼ãcxUÍ+ßz¯¢ÛTjƒºëOôãdÿüÝ5.¾Uc×Þ}ý&–­ÐĘ8M,KÐa”ç«8DZ,áíß/0¼Åfþ\›s>õU±eKèíG>ng ¾ÿ˯QY Á@aÂæ™ƒt²‘¡ ïö‰Ý…±h¼¨ÑAœ´ipóBí&lhìœâ®4êyÕÿ c/zÌv¨Ï³óÁ'°í(ÍЉ¢m²Á‘‡Rªµ+Óauf ‘€6ÆÐ¨{8z-!ŠfÇŽòt`Jkm÷òBC2ÚÜpˆN5[_€RˆOsÛ)GW?ýH,8&>,!” ]²ÐÊ0º °zÐÍ•F  RGñq/Q‘ð&•ã4÷ɤƒ•ÁHó)Ñ(¡6F€<0 x@ó਀¸€mŒQq–öO -Û¢>ÊDÖGÓí$íñnÝ$Mñ=½WnBIeq&¬1n,@#Ù‰X#AP(´mÛbYZë®ç ÝÕ› Ùì×íÜ'‰;©LØxž'aZ*m4=T( N¡ß·ùþçÿÝÎÃÿy‘® Q±3èdÆ ÜõÃcŒÑñÚ|4e""Ƴyóæ;9ò£B¡°”R""ˆZkŒ1h­×=÷ú; ÃuãÚëÚÆcŒ=33óÊÌÌÌk±¼¦'¥”¥µ=úÛ—^zéè¶mÛB­µ•ŸcLÇ h Ñ«_ºo{¿¤^DÌêêª;vléÕW_}¨Z­Î& œÈa·Hs¹Üãã㸮–Ëe,˃ã8kŒY£`Rßé¹W]{{.—ctttÈqœÍÀl; v§A1µÚC¥R±–——-Û¶ÑZ344D†É u¦ßßcY–cBPÕV:1z§`Ûvó Ã¥T¢j=WùV$r$ïéVì^´«IúÙ³Nmn€ä½ƒŒ±ûM’ž(í…”RLOO“ØGû˜^@zÅ ¥{öì!“É Wú26Ð4€ÉÉI&&&:ªÓFY\×8(vÐîiÒ/H¹zõ*årÛ¶ûÒžÔ'‹Ò À®]»š ôÝW…ÚÕ']¶nÝÊøøøCë`PÚAßíÆÙÎ@b½„´ˆHÓºxÎÁ¤½P·@•0p;½‘ˆà8Îõ¹%: \ƒ0ðaý¿RŠÝ»w¯ñBdY–e†ášö0ÐÏ»¤d\_RJQ©T°m›L&³F¨R©Ô•N+¯”bjjŠl6ÛU $CtOJ_¾|™ÉÉI …šÉñBíl(¥‚ / iÁoÙ íØ±ƒ±±1ªÕ*¶m7'Íò(Që\ú¹Ð žå¶¥ÉD®ëR«Õš)D"„5F:»Ún Æm˜dÒu‚! ߓݑ5Çw‘¨¾]µˆ’ziî©Ló7j3ë6Eb ãFa:ü;¾UÆC+EÕJëTÆjZóŠŠÁ™d± 5aÀ½Öãäd4‚r»HCð¬e^þî/xÿL‰ÌÍÔÓ›˜9QaiÞÇv8\dö*KW<”-˜å«~ä  C}E3¾ÆÒ¼Çö}yªË!+×–¯úMè'|Oè‰ã:ë·-4V5{Y¹PºPCTçq‘íDÏçþºÄþ/bt«.é%ÍÞ·¨B]Ò°÷Ð0…cd²¢ >;Îâ¥>;N¶h14l1õÔoZ60bqÿ¡•Ëî~´Àìé ùq4šü˜…À€ Gb¥„¹wjüûÄÙ!—‡žed›Ëk?˜aa¦Ží*¦žaöÝ KW¢8`4ì;<Ê¥“«”¯ù ÍžEîÜ_àøË‘Úch|GG^É¿ÉdžŽ%N“g=ÿöì{j‚â¤ÃÜÙ ÿµÒÒwßP¾æ³\jÙ@èÊ×#Ÿpêµ|å'wS¼ãcxUÍ+ßz¯¢ÛTjƒºëOôãdÿüÝ5.¾Uc×Þ}ý&–­ÐĘ8M,KÐa”ç«8DZ,áíß/0¼Åfþ\›s>õU±eKèíG>ng ¾ÿ˯QY Á@aÂæ™ƒt²‘¡ ïö‰Ý…±h¼¨ÑAœ´ipóBí&lhìœâ®4êyÕÿ c/zÌv¨Ï³óÁ'°í(ÍЉ¢m²Á‘‡Rªµ+Óauf ‘€6ÆÐ¨{8z-!ŠfÇŽòt`Jkm÷òBC2ÚÜpˆN5[_€RˆOsÛ)GW?ýH,8&>,!” ]²ÐÊ0º °zÐÍ•F  RGñq/Q‘ð&•ã4÷ɤƒ•ÁHó)Ñ(¡6F€<0 x@ó਀¸€mŒQq–öO -Û¢>ÊDÖGÓí$íñnÝ$Mñ=½WnBIeq&¬1n,@#Ù‰X#AP(´mÛbYZë®ç ÝÕ› Ùì×íÜ'‰;©LØxž'aZ*m4=T( N¡ß&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = share/icons/gnome/48x48/mimetypes DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(icondir)" DATA = $(icon_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ xdgdatadir = @XDGDATADIR@ icondir = $(xdgdatadir)/icons/gnome/48x48/mimetypes icon_DATA = \ gnome-mime-application-vnd.gtkwave-ae2.png gnome-mime-application-vnd.gtkwave-aet.png \ gnome-mime-application-vnd.gtkwave-evcd.png gnome-mime-application-vnd.gtkwave-fst.png \ gnome-mime-application-vnd.gtkwave-ghw.png gnome-mime-application-vnd.gtkwave-gtkw.png \ gnome-mime-application-vnd.gtkwave-lx2.png gnome-mime-application-vnd.gtkwave-lxt2.png \ gnome-mime-application-vnd.gtkwave-lxt.png gnome-mime-application-vnd.gtkwave-vcd.png \ gnome-mime-application-vnd.gtkwave-vzt.png gtkwave.png EXTRA_DIST = \ gnome-mime-application-vnd.gtkwave-ae2.png gnome-mime-application-vnd.gtkwave-aet.png \ gnome-mime-application-vnd.gtkwave-evcd.png gnome-mime-application-vnd.gtkwave-fst.png \ gnome-mime-application-vnd.gtkwave-ghw.png gnome-mime-application-vnd.gtkwave-gtkw.png \ gnome-mime-application-vnd.gtkwave-lx2.png gnome-mime-application-vnd.gtkwave-lxt2.png \ gnome-mime-application-vnd.gtkwave-lxt.png gnome-mime-application-vnd.gtkwave-vcd.png \ gnome-mime-application-vnd.gtkwave-vzt.png gtkwave.png all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign share/icons/gnome/48x48/mimetypes/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign share/icons/gnome/48x48/mimetypes/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-iconDATA: $(icon_DATA) @$(NORMAL_INSTALL) @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(icondir)'"; \ $(MKDIR_P) "$(DESTDIR)$(icondir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icondir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icondir)" || exit $$?; \ done uninstall-iconDATA: @$(NORMAL_UNINSTALL) @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(icondir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(icondir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-iconDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-iconDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-iconDATA \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am \ uninstall-iconDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/share/icons/gnome/48x48/mimetypes/gnome-mime-application-vnd.gtkwave-fst.png0000664000175000017500000000472213166335473031035 0ustar bybellbybell‰PNG  IHDR00Wù‡bKGDÿÿÿ ½§“ ‡IDAThÞÕš[lWÇߙˮw×Yß’ÆI/iÉ­nÚ´å"D6iZB$ŠÊ ÑHH´¼ðP!/ÐâñŠ@ª*$$¤V‚Tú‚D€&i“($¨U\ÇN¼IÇ^{os9‡‡™Ù¯÷V'TâH³3>·ùþçÿÝÎÃÿy‘® Q±3èdÆ ÜõÃcŒÑñÚ|4e""Ƴyóæ;9ò£B¡°”R""ˆZkŒ1h­×=÷ú; ÃuãÚëÚÆcŒ=33óÊÌÌÌk±¼¦'¥”¥µ=úÛ—^zéè¶mÛB­µ•ŸcLÇ h Ñ«_ºo{¿¤^DÌêêª;vléÕW_}¨Z­Î& œÈa·Hs¹Üãã㸮–Ëe,˃ã8kŒY£`Rßé¹W]{{.—ctttÈqœÍÀl; v§A1µÚC¥R±–——-Û¶ÑZ344D†É u¦ßßcY–cBPÕV:1z§`Ûvó Ã¥T¢j=WùV$r$ïéVì^´«IúÙ³Nmn€ä½ƒŒ±ûM’ž(í…”RLOO“ØGû˜^@zÅ ¥{öì!“É Wú26Ð4€ÉÉI&&&:ªÓFY\×8(vÐîiÒ/H¹zõ*årÛ¶ûÒžÔ'‹Ò À®]»š ôÝW…ÚÕ']¶nÝÊøøøCë`PÚAßíÆÙÎ@b½„´ˆHÓºxÎÁ¤½P·@•0p;½‘ˆà8Îõ¹%: \ƒ0ðaý¿RŠÝ»w¯ñBdY–e†ášö0ÐÏ»¤d\_RJQ©T°m›L&³F¨R©Ô•N+¯”bjjŠl6ÛU $CtOJ_¾|™ÉÉI …šÉñBíl(¥‚ / iÁoÙ íØ±ƒ±±1ªÕ*¶m7'Íò(Që\ú¹Ð žå¶¥ÉD®ëR«Õš)D"„5F:»Ún Æm˜dÒu‚! ߓݑ5Çw‘¨¾]µˆ’ziî©Ló7j3ë6Eb ãFa:ü;¾UÆC+EÕJëTÆjZóŠŠÁ™d± 5aÀ½Öãäd4‚r»HCð¬e^þî/xÿL‰ÌÍÔÓ›˜9QaiÞÇv8\dö*KW<”-˜å«~ä  C}E3¾ÆÒ¼Çö}yªË!+×–¯úMè'|Oè‰ã:ë·-4V5{Y¹PºPCTçq‘íDÏçþºÄþ/bt«.é%ÍÞ·¨B]Ò°÷Ð0…cd²¢ >;Îâ¥>;N¶h14l1õÔoZ60bqÿ¡•Ëî~´Àìé ùq4šü˜…À€ Gb¥„¹wjüûÄÙ!—‡žed›Ëk?˜aa¦Ží*¦žaöÝ KW¢8`4ì;<Ê¥“«”¯ù ÍžEîÜ_àøË‘Úch|GG^É¿ÉdžŽ%N“g=ÿöì{j‚â¤ÃÜÙ ÿµÒÒwßP¾æ³\jÙ@èÊ×#Ÿpêµ|å'wS¼ãcxUÍ+ßz¯¢ÛTjƒºëOôãdÿüÝ5.¾Uc×Þ}ý&–­ÐĘ8M,KÐa”ç«8DZ,áíß/0¼Åfþ\›s>õU±eKèíG>ng ¾ÿ˯QY Á@aÂæ™ƒt²‘¡ ïö‰Ý…±h¼¨ÑAœ´ipóBí&lhìœâ®4êyÕÿ c/zÌv¨Ï³óÁ'°í(ÍЉ¢m²Á‘‡Rªµ+Óauf ‘€6ÆÐ¨{8z-!ŠfÇŽòt`Jkm÷òBC2ÚÜpˆN5[_€RˆOsÛ)GW?ýH,8&>,!” ]²ÐÊ0º °zÐÍ•F  RGñq/Q‘ð&•ã4÷ɤƒ•ÁHó)Ñ(¡6F€<0 x@ó਀¸€mŒQq–öO -Û¢>ÊDÖGÓí$íñnÝ$Mñ=½WnBIeq&¬1n,@#Ù‰X#AP(´mÛbYZë®ç ÝÕ› Ùì×íÜ'‰;©LØxž'aZ*m4=T( N¡ߤéåáú^P]Ôôªªö·¬›ßΘÀˆˆªjww÷å»víú«D"ÑÆ©üŽª¢ªXk+‡¢Z>¯½_^û_kÞ©Ç6ΣªøCCCû†††DØÀãXkÃÛn»mï]w}õöÕ¡ª:"RHè˜ïžª¢((¨ÚʽùÞ­½µ1F3™ŒìÙ³gjß¾}×åóù¡ æ*·Q€HÂŽŽŽþîî<Ï Òé´:Žƒªây6 «3ˆHõt40:‡tiâyµÏª*"ÂÚµkéííMø¾?Ïç‡Ypi2Â0TU%—˹étÚq]—ÐZâ±8¡ ˪ù`³óˆfnis  ®ëŠª–hLÜæÁqÇÅq\DBÇ€(©@«T>¯¿! ¿Í*P)›L£yFÃÓ0áâˆtõ æ1™Faæ7§fïD÷#_EPÕT€(4ÞÃéÓ§I¥¦1Ž G‡Æ¯ç{~ppß÷ç†% PûR­ƒÖF£z{WR‰°ËݨÏófß#"¦|mj“Ú‚”Ígn‰>466F*ÂuÜ: -ð|¬_¿žX,VžSÊ2X«ŠÑÚHt ªÕbÄÄ,À¾¾>zzzæØv3#˜ˆTÍGD0Æ+K]ñXï½_ùê}ÿ²ÿ±GuìÄKFÄXU{Iš<ä… H¥R8ŽsIPUVk¢Ò|ß4ưap˜ïƒª„ªtÇŒ9ð݇ï¿~ÇÇ×þÞÖܸýæ[·%óŤˆÈ%Lˆ¹À™ yÍX.‘Ö}ÏCÕâû1’lßõG±þµkÖä½PØ<Ð~íõ®¸áࡓϳˆ(…P­:UäÈKe`1ÃÆ ëiimgââãSi<Ïãð©3¥?h/žýÀý:ù ¬µ‹0!À8.Æ8„¡­üVª¿¿¿ÊÀb²²ˆ`íBU±bDpüÈÔ tLd,·’Ya¯Zëßsß7ùû‡~úD,ª¢ —dÀ83Ù,®ë‹ÅªŒˆ£££MhÔºªâ87n$Ï×Ë×–82ñ4-é´Ž>Îeé_ØÌæ‡Í?Ü{÷ýÿü­‡þÔ1F¬µe°ÕÓßßG"‘¨‚SÕyX°&ªD• Õ¬zøÉ'ð§D8ü,Ù³SšÎŽšÇŽ?<üÈöVð…0zsQ>°fͺºº˜™™©j[UI$c–äÄsMHA<Ô ñéŸàMýðÜs¤Î&™¹Š¾Oïgâ[ÿ¦†²¹7æû˜­G|ß'ŸÏÏIVQR®gšƒ¯-ðêžCÁxhOÀ\ÜOpîE’g³ŒêV~æ»ô­¹‡}b•ygQ D‚TM¥Ï£jT@ª«€ËéCª÷k€PãÓ´$`F¿OñìË$ÏoßÉÀÍ{iïè"È¥±Êrj!KÄÖ\[6œž§ä¤p‡ ¨UÄT2u©µZ¡*@\GÈ—ɲ©8Œ9÷$ùá_‘¿h8Ó¿p÷­¼¯E°Å´Ä›‚¿„ÊïQr¦ù›?ÿ'N%Öâ²qgg^Í’<_Âõ(×ìîdèõ’#EŒ+h¨üî'»9ò|’NuøÎ=7Òf‘úÍ›Óq¾q°•ïŸ:Ã×6ãšÛÛNÔj.Y€È„ê[Æ*8x ½=Ιãc#tæ8y8Ez¬aÖmkçºÏöpåGã„¥8"à ø–Η/õ]ÏÕú:“'™nåoŸlaï3ÓÀ$ùŒÅõ<(Î*s™ ÔÖB‘]K¹ép¼rD2®Áyx¾‹¢(Ûnï§žº÷¥¼Åó S©Ÿýâ:ö|arä “'Þad8ÁÞé=|!¨dúYEEÜ’} ëšúèXeÃM ¿Óóˆw6îì,ƒÖ~¨W÷ÓÚãâ:ÂD2Ëîk®ä/7_GøÒOÈŽ1šìä“+8jKlýTÅbj-­]6§RÂ,Ä€¹” Õ ©91Âð›9Þ:8͉ç¦)d-CofyãñIüVÃÄÙçßÊ‘)ñÊÏ.rÓ•WñП}Ää¿“ãøÙÜöaß÷Fðs§_Ërüé$o?›¢UŒ3åÞ•8ŽSöYÒB2BfŒ%,)©Ñ"…LÈšýy’bÆ2üNŠÛ?¶™ûïXOþð˜Íóúùžßú>Þzà…‰Å¤FK$GÊF-bñ¥2udåÞ÷£££8Ž[Ç„©”@â bÀвÂå²ky2IQŠ|í+ÛÙû×W=ñÙá"/Môó¹oçIº¶ìê,ÏcãHuîHY‹©a/Ù‘©*±X¼¾î§œËw´Ñ¶®ß÷hé4 ~´“+¶$1ô þâ–ܺI™|õÇI§&zÙ—±ú÷‹.†lý|…¼ÒÚé°qç lI±ª´v¹Ø\ó.¨5¡Õ«WÇËE˜ZɲC¯å8úó$Ç&)ÎXNýwŠUk[9ø¯§X|„[>ü2GžÁzùæsí|iÏ4Ùd–‹ÇòY¤ ‰µ»´®‚‘ ûîû:Îå½\|ùEîÙÿ,Ì€-b‹m̤B¦Ž˜>_â²M­äS™ñ€é±Ryv+x¾‹ \0 ¯ª/è‘óÏ·€e»0®PÈX6îèâÂÐ4ŸûÄlýð&öýìq>q÷Ë<ðô$epbf}çðL±iwAAëô<96͹¡Ο?ÏÄø8…Ba9>P¿âÐÆÀû[ÈM‡$º=ÚWy¬ý`W}¨ 1ÐÖíób´úmø-.¾ï/GÛ<þ †^ÏqìÕ$ñŸÍŸì¢³¯…Gîüμý_˜eËî>†Žd˜IcAC¸f× FßÊ‘ºP$ à†O÷põŽN~úwC”fÊßLÜ™`e_&×8á‚=õ"›úy&0ÂäP‘íwôqíÇzéð8w(ˉ_•Ë (–Ìd‰Ìx@µ w„™d@úb¹fzã±In¾ûJ:û|ŠYËÃ_>ÁL²„Õlˆ˜e:qc1×@ xqÃË^äÔ 9ÖߨÆ?žÇÊ—-.;Ž`ÃJoQYÙ6ŽðÊ÷Æi[årþhŽ©s%òiʼn—¹6:Ÿ)…AÈ]ß¼…ìd ‰^—Oݤ`g››–Å;,a‰jsӺ¡ð'”±¡â' ù– hñZ„Ë×­¤+Ò*u›1Kg ùPÖ˜m¬Û´×-—6¨Ô/2»g Œ#Ñ?X+•{5\†åèDe¯ Ÿ+âk;*!¦y \œ ÍZLäg+U×¢RS HÅTf¯‘Jv-Õ÷ÊU=WBwBÀJ°¨-ØE/¯ÏP£Ú]*Ù™JKYs-Å3»(l+ÈgCªµ‰Få3ÔYŽVþ–Ê€Öo¥Î‘€Ñš¯V—©Õ-£ ¨J³\Qê5øcÄ6s…… hkk³®ëJ´KÙsãX(V/g¿ ò-- & CGD‚ùž›O˜˜˜xüÁüøO<á†a(ïfÓb¹CDl±X”#GŽü2—Ë­¶ðFw­ÖZ[[·cV©j0ß³µëþ‘Éü_ *"šËå~]*•’4lr_òÝ÷N·K—£žAŠÈâSâ{8´¶¶oÿ š!khfûIEND®B`‚gtkwave-3.3.86/share/icons/gnome/48x48/mimetypes/gnome-mime-application-vnd.gtkwave-vcd.png0000664000175000017500000000472213166335473031015 0ustar bybellbybell‰PNG  IHDR00Wù‡bKGDÿÿÿ ½§“ ‡IDAThÞÕš[lWÇߙˮw×Yß’ÆI/iÉ­nÚ´å"D6iZB$ŠÊ ÑHH´¼ðP!/ÐâñŠ@ª*$$¤V‚Tú‚D€&i“($¨U\ÇN¼IÇ^{os9‡‡™Ù¯÷V'TâH³3>·ùþçÿÝÎÃÿy‘® Q±3èdÆ ÜõÃcŒÑñÚ|4e""Ƴyóæ;9ò£B¡°”R""ˆZkŒ1h­×=÷ú; ÃuãÚëÚÆcŒ=33óÊÌÌÌk±¼¦'¥”¥µ=úÛ—^zéè¶mÛB­µ•ŸcLÇ h Ñ«_ºo{¿¤^DÌêêª;vléÕW_}¨Z­Î& œÈa·Hs¹Üãã㸮–Ëe,˃ã8kŒY£`Rßé¹W]{{.—ctttÈqœÍÀl; v§A1µÚC¥R±–——-Û¶ÑZ344D†É u¦ßßcY–cBPÕV:1z§`Ûvó Ã¥T¢j=WùV$r$ïéVì^´«IúÙ³Nmn€ä½ƒŒ±ûM’ž(í…”RLOO“ØGû˜^@zÅ ¥{öì!“É Wú26Ð4€ÉÉI&&&:ªÓFY\×8(vÐîiÒ/H¹zõ*årÛ¶ûÒžÔ'‹Ò À®]»š ôÝW…ÚÕ']¶nÝÊøøøCë`PÚAßíÆÙÎ@b½„´ˆHÓºxÎÁ¤½P·@•0p;½‘ˆà8Îõ¹%: \ƒ0ðaý¿RŠÝ»w¯ñBdY–e†ášö0ÐÏ»¤d\_RJQ©T°m›L&³F¨R©Ô•N+¯”bjjŠl6ÛU $CtOJ_¾|™ÉÉI …šÉñBíl(¥‚ / iÁoÙ íØ±ƒ±±1ªÕ*¶m7'Íò(Që\ú¹Ð žå¶¥ÉD®ëR«Õš)D"„5F:»Ún Æm˜dÒu‚! ߓݑ5Çw‘¨¾]µˆ’ziî©Ló7j3ë6Eb ãFa:ü;¾UÆC+EÕJëTÆjZóŠŠÁ™d± 5aÀ½Öãäd4‚r»HCð¬e^þî/xÿL‰ÌÍÔÓ›˜9QaiÞÇv8\dö*KW<”-˜å«~ä  C}E3¾ÆÒ¼Çö}yªË!+×–¯úMè'|Oè‰ã:ë·-4V5{Y¹PºPCTçq‘íDÏçþºÄþ/bt«.é%ÍÞ·¨B]Ò°÷Ð0…cd²¢ >;Îâ¥>;N¶h14l1õÔoZ60bqÿ¡•Ëî~´Àìé ùq4šü˜…À€ Gb¥„¹wjüûÄÙ!—‡žed›Ëk?˜aa¦Ží*¦žaöÝ KW¢8`4ì;<Ê¥“«”¯ù ÍžEîÜ_àøË‘Úch|GG^É¿ÉdžŽ%N“g=ÿöì{j‚â¤ÃÜÙ ÿµÒÒwßP¾æ³\jÙ@èÊ×#Ÿpêµ|å'wS¼ãcxUÍ+ßz¯¢ÛTjƒºëOôãdÿüÝ5.¾Uc×Þ}ý&–­ÐĘ8M,KÐa”ç«8DZ,áíß/0¼Åfþ\›s>õU±eKèíG>ng ¾ÿ˯QY Á@aÂæ™ƒt²‘¡ ïö‰Ý…±h¼¨ÑAœ´ipóBí&lhìœâ®4êyÕÿ c/zÌv¨Ï³óÁ'°í(ÍЉ¢m²Á‘‡Rªµ+Óauf ‘€6ÆÐ¨{8z-!ŠfÇŽòt`Jkm÷òBC2ÚÜpˆN5[_€RˆOsÛ)GW?ýH,8&>,!” ]²ÐÊ0º °zÐÍ•F  RGñq/Q‘ð&•ã4÷ɤƒ•ÁHó)Ñ(¡6F€<0 x@ó਀¸€mŒQq–öO -Û¢>ÊDÖGÓí$íñnÝ$Mñ=½WnBIeq&¬1n,@#Ù‰X#AP(´mÛbYZë®ç ÝÕ› Ùì×íÜ'‰;©LØxž'aZ*m4=T( N¡ß·ùþçÿÝÎÃÿy‘® Q±3èdÆ ÜõÃcŒÑñÚ|4e""Ƴyóæ;9ò£B¡°”R""ˆZkŒ1h­×=÷ú; ÃuãÚëÚÆcŒ=33óÊÌÌÌk±¼¦'¥”¥µ=úÛ—^zéè¶mÛB­µ•ŸcLÇ h Ñ«_ºo{¿¤^DÌêêª;vléÕW_}¨Z­Î& œÈa·Hs¹Üãã㸮–Ëe,˃ã8kŒY£`Rßé¹W]{{.—ctttÈqœÍÀl; v§A1µÚC¥R±–——-Û¶ÑZ344D†É u¦ßßcY–cBPÕV:1z§`Ûvó Ã¥T¢j=WùV$r$ïéVì^´«IúÙ³Nmn€ä½ƒŒ±ûM’ž(í…”RLOO“ØGû˜^@zÅ ¥{öì!“É Wú26Ð4€ÉÉI&&&:ªÓFY\×8(vÐîiÒ/H¹zõ*årÛ¶ûÒžÔ'‹Ò À®]»š ôÝW…ÚÕ']¶nÝÊøøøCë`PÚAßíÆÙÎ@b½„´ˆHÓºxÎÁ¤½P·@•0p;½‘ˆà8Îõ¹%: \ƒ0ðaý¿RŠÝ»w¯ñBdY–e†ášö0ÐÏ»¤d\_RJQ©T°m›L&³F¨R©Ô•N+¯”bjjŠl6ÛU $CtOJ_¾|™ÉÉI …šÉñBíl(¥‚ / iÁoÙ íØ±ƒ±±1ªÕ*¶m7'Íò(Që\ú¹Ð žå¶¥ÉD®ëR«Õš)D"„5F:»Ún Æm˜dÒu‚! ߓݑ5Çw‘¨¾]µˆ’ziî©Ló7j3ë6Eb ãFa:ü;¾UÆC+EÕJëTÆjZóŠŠÁ™d± 5aÀ½Öãäd4‚r»HCð¬e^þî/xÿL‰ÌÍÔÓ›˜9QaiÞÇv8\dö*KW<”-˜å«~ä  C}E3¾ÆÒ¼Çö}yªË!+×–¯úMè'|Oè‰ã:ë·-4V5{Y¹PºPCTçq‘íDÏçþºÄþ/bt«.é%ÍÞ·¨B]Ò°÷Ð0…cd²¢ >;Îâ¥>;N¶h14l1õÔoZ60bqÿ¡•Ëî~´Àìé ùq4šü˜…À€ Gb¥„¹wjüûÄÙ!—‡žed›Ëk?˜aa¦Ží*¦žaöÝ KW¢8`4ì;<Ê¥“«”¯ù ÍžEîÜ_àøË‘Úch|GG^É¿ÉdžŽ%N“g=ÿöì{j‚â¤ÃÜÙ ÿµÒÒwßP¾æ³\jÙ@èÊ×#Ÿpêµ|å'wS¼ãcxUÍ+ßz¯¢ÛTjƒºëOôãdÿüÝ5.¾Uc×Þ}ý&–­ÐĘ8M,KÐa”ç«8DZ,áíß/0¼Åfþ\›s>õU±eKèíG>ng ¾ÿ˯QY Á@aÂæ™ƒt²‘¡ ïö‰Ý…±h¼¨ÑAœ´ipóBí&lhìœâ®4êyÕÿ c/zÌv¨Ï³óÁ'°í(ÍЉ¢m²Á‘‡Rªµ+Óauf ‘€6ÆÐ¨{8z-!ŠfÇŽòt`Jkm÷òBC2ÚÜpˆN5[_€RˆOsÛ)GW?ýH,8&>,!” ]²ÐÊ0º °zÐÍ•F  RGñq/Q‘ð&•ã4÷ɤƒ•ÁHó)Ñ(¡6F€<0 x@ó਀¸€mŒQq–öO -Û¢>ÊDÖGÓí$íñnÝ$Mñ=½WnBIeq&¬1n,@#Ù‰X#AP(´mÛbYZë®ç ÝÕ› Ùì×íÜ'‰;©LØxž'aZ*m4=T( N¡ß·ùþçÿÝÎÃÿy‘® Q±3èdÆ ÜõÃcŒÑñÚ|4e""Ƴyóæ;9ò£B¡°”R""ˆZkŒ1h­×=÷ú; ÃuãÚëÚÆcŒ=33óÊÌÌÌk±¼¦'¥”¥µ=úÛ—^zéè¶mÛB­µ•ŸcLÇ h Ñ«_ºo{¿¤^DÌêêª;vléÕW_}¨Z­Î& œÈa·Hs¹Üãã㸮–Ëe,˃ã8kŒY£`Rßé¹W]{{.—ctttÈqœÍÀl; v§A1µÚC¥R±–——-Û¶ÑZ344D†É u¦ßßcY–cBPÕV:1z§`Ûvó Ã¥T¢j=WùV$r$ïéVì^´«IúÙ³Nmn€ä½ƒŒ±ûM’ž(í…”RLOO“ØGû˜^@zÅ ¥{öì!“É Wú26Ð4€ÉÉI&&&:ªÓFY\×8(vÐîiÒ/H¹zõ*årÛ¶ûÒžÔ'‹Ò À®]»š ôÝW…ÚÕ']¶nÝÊøøøCë`PÚAßíÆÙÎ@b½„´ˆHÓºxÎÁ¤½P·@•0p;½‘ˆà8Îõ¹%: \ƒ0ðaý¿RŠÝ»w¯ñBdY–e†ášö0ÐÏ»¤d\_RJQ©T°m›L&³F¨R©Ô•N+¯”bjjŠl6ÛU $CtOJ_¾|™ÉÉI …šÉñBíl(¥‚ / iÁoÙ íØ±ƒ±±1ªÕ*¶m7'Íò(Që\ú¹Ð žå¶¥ÉD®ëR«Õš)D"„5F:»Ún Æm˜dÒu‚! ߓݑ5Çw‘¨¾]µˆ’ziî©Ló7j3ë6Eb ãFa:ü;¾UÆC+EÕJëTÆjZóŠŠÁ™d± 5aÀ½Öãäd4‚r»HCð¬e^þî/xÿL‰ÌÍÔÓ›˜9QaiÞÇv8\dö*KW<”-˜å«~ä  C}E3¾ÆÒ¼Çö}yªË!+×–¯úMè'|Oè‰ã:ë·-4V5{Y¹PºPCTçq‘íDÏçþºÄþ/bt«.é%ÍÞ·¨B]Ò°÷Ð0…cd²¢ >;Îâ¥>;N¶h14l1õÔoZ60bqÿ¡•Ëî~´Àìé ùq4šü˜…À€ Gb¥„¹wjüûÄÙ!—‡žed›Ëk?˜aa¦Ží*¦žaöÝ KW¢8`4ì;<Ê¥“«”¯ù ÍžEîÜ_àøË‘Úch|GG^É¿ÉdžŽ%N“g=ÿöì{j‚â¤ÃÜÙ ÿµÒÒwßP¾æ³\jÙ@èÊ×#Ÿpêµ|å'wS¼ãcxUÍ+ßz¯¢ÛTjƒºëOôãdÿüÝ5.¾Uc×Þ}ý&–­ÐĘ8M,KÐa”ç«8DZ,áíß/0¼Åfþ\›s>õU±eKèíG>ng ¾ÿ˯QY Á@aÂæ™ƒt²‘¡ ïö‰Ý…±h¼¨ÑAœ´ipóBí&lhìœâ®4êyÕÿ c/zÌv¨Ï³óÁ'°í(ÍЉ¢m²Á‘‡Rªµ+Óauf ‘€6ÆÐ¨{8z-!ŠfÇŽòt`Jkm÷òBC2ÚÜpˆN5[_€RˆOsÛ)GW?ýH,8&>,!” ]²ÐÊ0º °zÐÍ•F  RGñq/Q‘ð&•ã4÷ɤƒ•ÁHó)Ñ(¡6F€<0 x@ó਀¸€mŒQq–öO -Û¢>ÊDÖGÓí$íñnÝ$Mñ=½WnBIeq&¬1n,@#Ù‰X#AP(´mÛbYZë®ç ÝÕ› Ùì×íÜ'‰;©LØxž'aZ*m4=T( N¡ß vpAg00ÎîŒW €IDAThÞ½šYoÙuÇ÷ÖÖ]ÝÍÞHJ$% GšE g<›ã@8ñdHâØFàOàgA^ò /y˜ûÉK;3ðý0°23ÒHi49©K«»º»ºªîÉCu7»ØM²IM|‚]Uÿ:çžåÞsî¹¥Þ¿ÿ®€€RFêÈçCNÿ¯¤PØ‚A´¥P¨ñÁ‹ŒŽêàÁ‹¤,ÕØê(ýÅ &IåÙQ/fõÓ‡ôÂ(3@m) u €`+Á$’*¹´ ~ÍFÁv‚$XÌ"Ã/ƒa;”+lŘœ ¸žÃòÅÓ¸ž‹­´¢±ðoßÿ!›k[h­†ÍÏX¼þÍ|ø“m:O“‰â>üé§öádz\Ùæõ¿«NÄcX|n–ù÷ï1¿ä¥:AH'³Ì´Eö Õ¥ÛšlZ£,:0µXó\;•q.•[@D&Êm!Òm›)è°VZqáj‰å7Šˆ€‰…^ÇLô”ëkž{£ v7zÜ|¿9˜÷¡%oöÑÀéX·yç—X¸ä#FxíokGD+N½”gõw­'щäö—ôÈÕ‰¨þœGeÉ”¥øS©;ª‹.õsîÉ÷É~ë,\öÉ—,#î_¸½MÔ•q£89ÅÒ+>g^)P:å°pÉgõZðl <Ëø•‚3¯úh[ñèN‡Û¿|Êï~´E·9yræf,Þüû:nÞ¢²äræÕüà1È1g ¦¿|*½g±Á=­Ijï¹_µY¸˜'î ÍG¨t ÏàF< µBixú("é —óøe›N#ÎðUZ ¯õ ìú×bÒ{ƒk{àÚ—¿>Ãìãìºl9 7¯à⟕I¢=S‰Õ%¹ó9ºÍ„`'Æ+Xc¸Q²…ë[ÛÝVÂÜù_ý‡:;÷{ãrs¹•1¹³óeœœé{@ÛŠÙç=ìj~_bĤ¿fŸ÷2f/ûäJO~ËQc¸ýna`¶cêËËo•p ícÉ­V=´­öBHzmC/Ø—Ø^SQÛŒÅj±n£´bw£GÒK'î$Ü~~IOØÝè1w>G¡n§ïLÀM’+"ô¼½{6 ¢ŽðÉÏwyðÅÖ^Ü x%‹+oW„›ïí¶Lj ¯¨y寫$‘áÆí¤ñm)n¾·³‡Û7¼’æÊÛU’D¸ñóέ„¶×¶C/á]²¸òDöÉŒÏ)¢ï J<`„`;¦µgdÆ=ƒégÊÖvL÷éÞê’¯ä¨,¸4ŸÄ|ñQÀ¹× `ÆqY~Æb„õÛ´¶"*‹.ÚR4GZÜ3iµ)“ùµŠñ°ÕœN½”§8çðäó.ÍèÈ=B&B´¢±ÙãÉïCJsó/æŽ%{TÒ‰XZñq<ÅÆ'm 9V6W@·•°q³“Si>8!HÛÓ,­ø$‘°~½$ÇÏD&Ö?HbaiÅNÚ?ˆ3óó/ä vb|Ú9r :‰”R<øßíÝ„ùr”æ¦*Œ¿æ.ä˜9í°½²³ždü( Ûë=¶×Bʧ]æÎo<“K+>n^³q³C§‘œH€N#fãf××,®øS¿7°6¤©{qÅÇ©w3yÀÉ+l7½>óŠOÔ´®–ÒŒÚJ8ûZ¯ ±]…gVüƒ«Ñ>?éó Û†°• /\áÞ-$ÁÉ8?1Âü¢íê¾¶§xþŠÔñ„=júÿü×Jˆ€W´Xºâu ¹’Åů—Qj÷ǥí7‚“ò‹:†¥Ÿ•¿¬¶’Cù‰•j'7P`„±Èá‚Å@¾lá•,:„ön<öŽL¹ Iš§hïÆt› ¹’E~ÆJ“–>˜ŸÈ^ )ú¥D wÝäáÆn¦+áúšå·ŠÜû E$¼õYœœæÎ¯žòÑî`ö'ÞÓ–âôËy.ýy…N#á“÷vðŠÖüŒN/ÙDß6Pé÷…’Hxx»ÃæZ'#4?cqö+i’yp»C·™àWm”‚»¿m²þq0w@)1Ä <ø´3ÜøÜým“Ëߨ¯XlÞêdqø© 3,±õž3Žò9ø›…KyÂÀ°q£=]¬D#"7n´éµ ‹—}ò{ê0*0Í*(jg]jg=z<þ¼ûl ŒÐãÏ»4ô¨õ¨q«Àt‹¸ˆpú¢O¾lóèvçÄíIÔ|óè³.~ÕâôÅüô+LßVѶêoàaýF›¸÷ ;ñ}‡†û×ÛXvZØikúÌ8U&\Ñbñrºþß¿þŒñ?î߈ºÂâ¯hM¯Àtñ/T–\f—=š"}öåÅÿ€ÞîÒ|1»ìQ^t‡{â£ÈÒvGé”CÐs2yÀ+ê¡;Ͻ^ PwøâÃ¥¡¼à3æ(nfÞÁ+XóÀ'YœHZÜ56{œyµÀ¹× ý6Ì8?c„Ò)g(ϰóŠËo—YÜÍ`(Ò:I^ü“–­0±°òN%SB+V¿K°òNõà=ýa8’X°Å•·+|öë&JãD„Zµ‚›×{m¥ÀÉiœœžØÞ°EyÁÅ¡µa{:ÓômƒØ¹I]­£q"’f¡¼àb¹©±&áìœÎÞ‘LÜåÉ£ B¶«©óð+6~ͦÓH¸û›&»½ao€«?ç°µ÷&—‡áĤuÑ…«% 5¯`Ñ|±½–Å#ôNå0Qjx[õk¡;¿j²¹ÚÈ´øòe‹7¿U§PË“+Z¬ýOÀµoÑyšŒáÞúÎ,·ÙÈ>gN&àò›7¾YçìW ë6[«Ý‰¸Åe‡¨›¶ZtÆD}À èjiÞÁr›7ÛtÛ\¦ñ4úCŽ#ÝàlÞê`9ŠÒ¼£òD>jü„æÒ7*,¿Y@OsúRžS/凸gé$Ië$ßåÔ‹9LR¡zÖ#Óº÷A‹[¿hd^ÉìüšÅ_ýÓg^õ‡'ƒƒ³¨önÂæ­/?í§[mº„Ò¼CiÞáå?- -øâ£€{×Z™J#ã íݘ(”áÙ•R eÁöZÈÖj8ýHNHÛk!Ûë!‹eI@úË–ÒŠöN‚‰³ÛÕ½óݦá'ÿ¼–vÊú WK(¥øð?¶hïÆÇÐq)ØŽùÙ¿Þ絿©!"ÜýM“^;°ït[U?À‚ÞI76¹’E®œ8¯^ Mï2E)£¸àb`õZ‹¹ó"ðÉ{»žø ÐZ3S-4ý<äKšb1ÝiUê!]wr×97cQ(¦é¿RëÑu’£qõ]÷`\±”.$ûqb„™Z­û…ôo¾+Q³yo‹(J5|«¡µ"WNݧf¢éÉ—5"Ü„£ÃþñSn¦Ï¯Ñç7¡©¤5{rcúšIú©ãÚ,.Ïâ8êýÍw$µ|¿?êŸs¬ÃjpF6jïŒyô›¥“4°5RúɸöãRþ{ágLú݆ma#ŒXwA ŒÚ7”,@ îîSl§˜ì™IG½ãw$3o¬>êÿ÷½8i瀕%tEXtdate:create2012-01-07T05:16:05-05:002Î~%tEXtdate:modify2012-01-05T14:31:59-05:00Ÿ¦­úIEND®B`‚gtkwave-3.3.86/share/icons/gnome/48x48/Makefile.in0000664000175000017500000004523713166335473021005 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = share/icons/gnome/48x48 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = mimetypes all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign share/icons/gnome/48x48/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign share/icons/gnome/48x48/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-tags distdir dvi dvi-am \ html html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/share/icons/gnome/48x48/Makefile.am0000664000175000017500000000005213166335473020756 0ustar bybellbybell## -*- makefile -*- ## SUBDIRS= mimetypes gtkwave-3.3.86/share/icons/gnome/32x32/0000775000175000017500000000000013166335473016707 5ustar bybellbybellgtkwave-3.3.86/share/icons/gnome/32x32/mimetypes/0000775000175000017500000000000013166335473020723 5ustar bybellbybellgtkwave-3.3.86/share/icons/gnome/32x32/mimetypes/gnome-mime-application-vnd.gtkwave-ghw.png0000664000175000017500000000423113166335473031003 0ustar bybellbybell‰PNG  IHDR szzô`IDATX…­WkPU×&p  Kx¦©©IGV×ÐР«¯¯×íÛ·O·wï^]mm­®ººZ·{÷n]UU•®¢¢BW^^®Û¹s§®¬¬LWRR¢+**ÒêòóóŸÉËË;¡ÕjHj­¹‹“œY&;³4é1“ɤú|>‰ …,‡×ëU<âv»—Ë¥8Ån·+6›M±Z­ŠÙlVh¬b4•ÉÉIebb‚ÃÃÃ*YñòåËêöíÛO0?ápÜE YZéIrÀxFFFfi¢A¨ƒ½ qS" X,–K‰\ˆì,wÓ8µ¸¸ø¥0„e ÌÏÓêTú³866¦’#¶ÂhR¾jf#툰~êsLï"S‚ÂòëÕœdÈaˆVÍì9”厎¹»»[îêêâ–áúõë7nÜX@äÙ›7oÎ14gˆ-ˆ¬¬@]]Þét2ÇB˜€L000€+W®àÚµk¸zõ*·Dˆ#Òîìì䈴™edà éê(Ãõ”\*‹)Å[¥Ë$%HîxÑÄìYRãž>f™J´•òŠ ]±2Ú^zŠÛ²2Åï‹DÚ$9Hú»,…@¦E¨”„_Ž@MM 'À2™IÇâÏéÎ;Üqd¥Ì.E$‹Aä8Úœ@AAÁòرÉ,BzZ1ËÚ´×qûöm´·/Q “IQ CCC9Âè(Ùጎ1ٹ С´2ÊÊJ=9Toݺ%ì*µyØ„$'zzzÐóùçèííEo_/úúú½è¿Õ’`SSS„y e‡ÃùÕЪYò±E%ù9‹Õ ¦†ÃA°;N»•¬Í‹ÅÊa%Øh ÇÆ³N€Žä• Й®g1£@§‘°Ùì ­ ÿ”Køý>Lü ˆ3AÌ 49ÒŒQ"ˆ"QÀôŒ${Üž;vìX™NÀnwF“AuØœ²É9Šö¾‰¿~Ò‚ó]møÛ•38wñ Îþû þò¯V¼sáþôÑi¼ûi+ï{ïÒ+8ßÙ†Ú_ÅÙK-r»á‚*Ê‘{ DªR„À®]»ô,ùœ§`±™T³Á.{fŒ8ò‹A?#¿! ëµÞ.9„'þ‰=Gסá¹T|çÍL$ožÿ-go>¦º]Áf§íh"¢Ï¿u £Q<;ê×b÷“©8ñQrk±ugÒ âP÷£Ð}˜mk°ûû°ëàh«ãä¿w¿¦ '››»<ˆ$tV“ãtØ„Iã„j39e߬ GµŸK»ë`Ú¼§aÿ [QÀûãc[„ïh±!+™e ÈÈ[ËCðþå×Tz ¬B€N*Ê uèÎ02:¤ºìÙ2à䯿2 )°EßHÆÓçòQwl8”Šr\òÐ:”}k=·jq¨E‹âý)¨þ^:²kâåo¼1O`ðK(À°ºíq{‡ËN!pÈÞ3žþ]3¢b£PP¿µGÓðØ)-ÒóPþÈ$¤hžŸ€R" ­HÄSo碰)Ù)ˆK‰’/t¼± Àªè Ð³íâv¹i˜‰€SöËfüà…or©³ÊñXËV5¥ >)†¥ð~MÜ}(m^ÇÛ^ÞŠºã‘²)n>Ÿ}…P–r^W°Ú,ªÝê’Ý‚ ?ÿóÃØR˳ýÅO‹QõDǾ§c'%[ù£©hzv3 Sx~ò~²«RPÜœ(ÿãæ¼ƒ·WW€þ §ÂÃC`µ[h:ä)XqäŇY¡¡,/Â#§·ò•nÊ‹''‰a¢Ô`Êœø8Ÿ¶¨ 4ò¹O^çnõ¯° #ÙÙÙz–,R€…ÀfrÑAd€®í J܈co—¡òÛ[žµ4gbßSZlÙžŠ¼ÊMh<žƒd3é½YŸ‹ïž*Aa}šüÁÕ¶Õs ÒAßî'YôûýôUkfJÈ6— ƒžÿ Ïü_ô.aØßޱÐ5Œç1!vbRìâ0LwÃ8sã. Z:0è'7Õ¹Y™jÁ°šóòˆc6++ë7ýýýì F2M¬(Q!r)n»_ñ{JÀR|® âw…”) }¢ôJJÈ?­ˆÙ̈²BN™EÐ/ªÓÓÓ}ÔìÖÅþ`…˜ÌÌ̦]HüT ç¨ú‰^¯Gòø\’×ç!x¥© O S„€ƒ’8’¤iA¢J(Mφ1#IT©-I!!8ÀÏ¾Š‰ÀïÉÏýäoÍRL’ØŒŒŒß^¼xQ¥ÑiúQ#7œÉ ºLùýÀ0Éî FÅh0rËÛt2Ù­ˆ`[‚Ùd¡±“¬¬Kííí*)ÜF~âÉßÚ¨%#GwÃbÊÔ·èH>Æ9úKx¦©©IGV×ÐР«¯¯×íÛ·O·wï^]mm­®ººZ·{÷n]UU•®¢¢BW^^®Û¹s§®¬¬LWRR¢+**ÒêòóóŸÉËË;¡ÕjHj­¹‹“œY&;³4é1“ɤú|>‰ …,‡×ëU<âv»—Ë¥8Ån·+6›M±Z­ŠÙlVh¬b4•ÉÉIebb‚ÃÃÃ*YñòåËêöíÛO0?ápÜE YZéIrÀxFFFfi¢A¨ƒ½ qS" X,–K‰\ˆì,wÓ8µ¸¸ø¥0„e ÌÏÓêTú³866¦’#¶ÂhR¾jf#툰~êsLï"S‚ÂòëÕœdÈaˆVÍì9”厎¹»»[îêêâ–áúõë7nÜX@äÙ›7oÎ14gˆ-ˆ¬¬@]]Þét2ÇB˜€L000€+W®àÚµk¸zõ*·Dˆ#Òîìì䈴™edà éê(Ãõ”\*‹)Å[¥Ë$%HîxÑÄìYRãž>f™J´•òŠ ]±2Ú^zŠÛ²2Åï‹DÚ$9Hú»,…@¦E¨”„_Ž@MM 'À2™IÇâÏéÎ;Üqd¥Ì.E$‹Aä8Úœ@AAÁòرÉ,BzZ1ËÚ´×qûöm´·/Q “IQ CCC9Âè(Ùጎ1ٹ С´2ÊÊJ=9Toݺ%ì*µyØ„$'zzzÐóùçèííEo_/úúú½è¿Õ’`SSS„y e‡ÃùÕЪYò±E%ù9‹Õ ¦†ÃA°;N»•¬Í‹ÅÊa%Øh ÇÆ³N€Žä• Й®g1£@§‘°Ùì ­ ÿ”Køý>Lü ˆ3AÌ 49ÒŒQ"ˆ"QÀôŒ${Üž;vìX™NÀnwF“AuØœ²É9Šö¾‰¿~Ò‚ó]møÛ•38wñ Îþû þò¯V¼sáþôÑi¼ûi+ï{ïÒ+8ßÙ†Ú_ÅÙK-r»á‚*Ê‘{ DªR„À®]»ô,ùœ§`±™T³Á.{fŒ8ò‹A?#¿! ëµÞ.9„'þ‰=Gסá¹T|çÍL$ožÿ-go>¦º]Áf§íh"¢Ï¿u £Q<;ê×b÷“©8ñQrk±ugÒ âP÷£Ð}˜mk°ûû°ëàh«ãä¿w¿¦ '››»<ˆ$tV“ãtØ„Iã„j39e߬ GµŸK»ë`Ú¼§aÿ [QÀûãc[„ïh±!+™e ÈÈ[ËCðþå×Tz ¬B€N*Ê uèÎ02:¤ºìÙ2à䯿2 )°EßHÆÓçòQwl8”Šr\òÐ:”}k=·jq¨E‹âý)¨þ^:²kâåo¼1O`ðK(À°ºíq{‡ËN!pÈÞ3žþ]3¢b£PP¿µGÓðØ)-ÒóPþÈ$¤hžŸ€R" ­HÄSo碰)Ù)ˆK‰’/t¼± Àªè Ð³íâv¹i˜‰€SöËfüà…or©³ÊñXËV5¥ >)†¥ð~MÜ}(m^ÇÛ^ÞŠºã‘²)n>Ÿ}…P–r^W°Ú,ªÝê’Ý‚ ?ÿóÃØR˳ýÅO‹QõDǾ§c'%[ù£©hzv3 Sx~ò~²«RPÜœ(ÿãæ¼ƒ·WW€þ §ÂÃC`µ[h:ä)XqäŇY¡¡,/Â#§·ò•nÊ‹''‰a¢Ô`Êœø8Ÿ¶¨ 4ò¹O^çnõ¯° #ÙÙÙz–,R€…ÀfrÑAd€®í J܈co—¡òÛ[žµ4gbßSZlÙžŠ¼ÊMh<žƒd3é½YŸ‹ïž*Aa}šüÁÕ¶Õs ÒAßî'YôûýôUkfJÈ6— ƒžÿ Ïü_ô.aØßޱÐ5Œç1!vbRìâ0LwÃ8sã. Z:0è'7Õ¹Y™jÁ°šóòˆc6++ë7ýýýì F2M¬(Q!r)n»_ñ{JÀR|® âw…”) }¢ôJJÈ?­ˆÙ̈²BN™EÐ/ªÓÓÓ}ÔìÖÅþ`…˜ÌÌ̦]HüT ç¨ú‰^¯Gòø\’×ç!x¥© O S„€ƒ’8’¤iA¢J(Mφ1#IT©-I!!8ÀÏ¾Š‰ÀïÉÏýäoÍRL’ØŒŒŒß^¼xQ¥ÑiúQ#7œÉ ºLùýÀ0Éî FÅh0rËÛt2Ù­ˆ`[‚Ùd¡±“¬¬Kííí*)ÜF~âÉßÚ¨%#GwÃbÊÔ·èH>Æ9úKx¦©©IGV×ÐР«¯¯×íÛ·O·wï^]mm­®ººZ·{÷n]UU•®¢¢BW^^®Û¹s§®¬¬LWRR¢+**ÒêòóóŸÉËË;¡ÕjHj­¹‹“œY&;³4é1“ɤú|>‰ …,‡×ëU<âv»—Ë¥8Ån·+6›M±Z­ŠÙlVh¬b4•ÉÉIebb‚ÃÃÃ*YñòåËêöíÛO0?ápÜE YZéIrÀxFFFfi¢A¨ƒ½ qS" X,–K‰\ˆì,wÓ8µ¸¸ø¥0„e ÌÏÓêTú³866¦’#¶ÂhR¾jf#툰~êsLï"S‚ÂòëÕœdÈaˆVÍì9”厎¹»»[îêêâ–áúõë7nÜX@äÙ›7oÎ14gˆ-ˆ¬¬@]]Þét2ÇB˜€L000€+W®àÚµk¸zõ*·Dˆ#Òîìì䈴™edà éê(Ãõ”\*‹)Å[¥Ë$%HîxÑÄìYRãž>f™J´•òŠ ]±2Ú^zŠÛ²2Åï‹DÚ$9Hú»,…@¦E¨”„_Ž@MM 'À2™IÇâÏéÎ;Üqd¥Ì.E$‹Aä8Úœ@AAÁòرÉ,BzZ1ËÚ´×qûöm´·/Q “IQ CCC9Âè(Ùጎ1ٹ С´2ÊÊJ=9Toݺ%ì*µyØ„$'zzzÐóùçèííEo_/úúú½è¿Õ’`SSS„y e‡ÃùÕЪYò±E%ù9‹Õ ¦†ÃA°;N»•¬Í‹ÅÊa%Øh ÇÆ³N€Žä• Й®g1£@§‘°Ùì ­ ÿ”Køý>Lü ˆ3AÌ 49ÒŒQ"ˆ"QÀôŒ${Üž;vìX™NÀnwF“AuØœ²É9Šö¾‰¿~Ò‚ó]møÛ•38wñ Îþû þò¯V¼sáþôÑi¼ûi+ï{ïÒ+8ßÙ†Ú_ÅÙK-r»á‚*Ê‘{ DªR„À®]»ô,ùœ§`±™T³Á.{fŒ8ò‹A?#¿! ëµÞ.9„'þ‰=Gסá¹T|çÍL$ožÿ-go>¦º]Áf§íh"¢Ï¿u £Q<;ê×b÷“©8ñQrk±ugÒ âP÷£Ð}˜mk°ûû°ëàh«ãä¿w¿¦ '››»<ˆ$tV“ãtØ„Iã„j39e߬ GµŸK»ë`Ú¼§aÿ [QÀûãc[„ïh±!+™e ÈÈ[ËCðþå×Tz ¬B€N*Ê uèÎ02:¤ºìÙ2à䯿2 )°EßHÆÓçòQwl8”Šr\òÐ:”}k=·jq¨E‹âý)¨þ^:²kâåo¼1O`ðK(À°ºíq{‡ËN!pÈÞ3žþ]3¢b£PP¿µGÓðØ)-ÒóPþÈ$¤hžŸ€R" ­HÄSo碰)Ù)ˆK‰’/t¼± Àªè Ð³íâv¹i˜‰€SöËfüà…or©³ÊñXËV5¥ >)†¥ð~MÜ}(m^ÇÛ^ÞŠºã‘²)n>Ÿ}…P–r^W°Ú,ªÝê’Ý‚ ?ÿóÃØR˳ýÅO‹QõDǾ§c'%[ù£©hzv3 Sx~ò~²«RPÜœ(ÿãæ¼ƒ·WW€þ §ÂÃC`µ[h:ä)XqäŇY¡¡,/Â#§·ò•nÊ‹''‰a¢Ô`Êœø8Ÿ¶¨ 4ò¹O^çnõ¯° #ÙÙÙz–,R€…ÀfrÑAd€®í J܈co—¡òÛ[žµ4gbßSZlÙžŠ¼ÊMh<žƒd3é½YŸ‹ïž*Aa}šüÁÕ¶Õs ÒAßî'YôûýôUkfJÈ6— ƒžÿ Ïü_ô.aØßޱÐ5Œç1!vbRìâ0LwÃ8sã. Z:0è'7Õ¹Y™jÁ°šóòˆc6++ë7ýýýì F2M¬(Q!r)n»_ñ{JÀR|® âw…”) }¢ôJJÈ?­ˆÙ̈²BN™EÐ/ªÓÓÓ}ÔìÖÅþ`…˜ÌÌ̦]HüT ç¨ú‰^¯Gòø\’×ç!x¥© O S„€ƒ’8’¤iA¢J(Mφ1#IT©-I!!8ÀÏ¾Š‰ÀïÉÏýäoÍRL’ØŒŒŒß^¼xQ¥ÑiúQ#7œÉ ºLùýÀ0Éî FÅh0rËÛt2Ù­ˆ`[‚Ùd¡±“¬¬Kííí*)ÜF~âÉßÚ¨%#GwÃbÊÔ·èH>Æ9úKx¦©©IGV×ÐР«¯¯×íÛ·O·wï^]mm­®ººZ·{÷n]UU•®¢¢BW^^®Û¹s§®¬¬LWRR¢+**ÒêòóóŸÉËË;¡ÕjHj­¹‹“œY&;³4é1“ɤú|>‰ …,‡×ëU<âv»—Ë¥8Ån·+6›M±Z­ŠÙlVh¬b4•ÉÉIebb‚ÃÃÃ*YñòåËêöíÛO0?ápÜE YZéIrÀxFFFfi¢A¨ƒ½ qS" X,–K‰\ˆì,wÓ8µ¸¸ø¥0„e ÌÏÓêTú³866¦’#¶ÂhR¾jf#툰~êsLï"S‚ÂòëÕœdÈaˆVÍì9”厎¹»»[îêêâ–áúõë7nÜX@äÙ›7oÎ14gˆ-ˆ¬¬@]]Þét2ÇB˜€L000€+W®àÚµk¸zõ*·Dˆ#Òîìì䈴™edà éê(Ãõ”\*‹)Å[¥Ë$%HîxÑÄìYRãž>f™J´•òŠ ]±2Ú^zŠÛ²2Åï‹DÚ$9Hú»,…@¦E¨”„_Ž@MM 'À2™IÇâÏéÎ;Üqd¥Ì.E$‹Aä8Úœ@AAÁòرÉ,BzZ1ËÚ´×qûöm´·/Q “IQ CCC9Âè(Ùጎ1ٹ С´2ÊÊJ=9Toݺ%ì*µyØ„$'zzzÐóùçèííEo_/úúú½è¿Õ’`SSS„y e‡ÃùÕЪYò±E%ù9‹Õ ¦†ÃA°;N»•¬Í‹ÅÊa%Øh ÇÆ³N€Žä• Й®g1£@§‘°Ùì ­ ÿ”Køý>Lü ˆ3AÌ 49ÒŒQ"ˆ"QÀôŒ${Üž;vìX™NÀnwF“AuØœ²É9Šö¾‰¿~Ò‚ó]møÛ•38wñ Îþû þò¯V¼sáþôÑi¼ûi+ï{ïÒ+8ßÙ†Ú_ÅÙK-r»á‚*Ê‘{ DªR„À®]»ô,ùœ§`±™T³Á.{fŒ8ò‹A?#¿! ëµÞ.9„'þ‰=Gסá¹T|çÍL$ožÿ-go>¦º]Áf§íh"¢Ï¿u £Q<;ê×b÷“©8ñQrk±ugÒ âP÷£Ð}˜mk°ûû°ëàh«ãä¿w¿¦ '››»<ˆ$tV“ãtØ„Iã„j39e߬ GµŸK»ë`Ú¼§aÿ [QÀûãc[„ïh±!+™e ÈÈ[ËCðþå×Tz ¬B€N*Ê uèÎ02:¤ºìÙ2à䯿2 )°EßHÆÓçòQwl8”Šr\òÐ:”}k=·jq¨E‹âý)¨þ^:²kâåo¼1O`ðK(À°ºíq{‡ËN!pÈÞ3žþ]3¢b£PP¿µGÓðØ)-ÒóPþÈ$¤hžŸ€R" ­HÄSo碰)Ù)ˆK‰’/t¼± Àªè Ð³íâv¹i˜‰€SöËfüà…or©³ÊñXËV5¥ >)†¥ð~MÜ}(m^ÇÛ^ÞŠºã‘²)n>Ÿ}…P–r^W°Ú,ªÝê’Ý‚ ?ÿóÃØR˳ýÅO‹QõDǾ§c'%[ù£©hzv3 Sx~ò~²«RPÜœ(ÿãæ¼ƒ·WW€þ §ÂÃC`µ[h:ä)XqäŇY¡¡,/Â#§·ò•nÊ‹''‰a¢Ô`Êœø8Ÿ¶¨ 4ò¹O^çnõ¯° #ÙÙÙz–,R€…ÀfrÑAd€®í J܈co—¡òÛ[žµ4gbßSZlÙžŠ¼ÊMh<žƒd3é½YŸ‹ïž*Aa}šüÁÕ¶Õs ÒAßî'YôûýôUkfJÈ6— ƒžÿ Ïü_ô.aØßޱÐ5Œç1!vbRìâ0LwÃ8sã. Z:0è'7Õ¹Y™jÁ°šóòˆc6++ë7ýýýì F2M¬(Q!r)n»_ñ{JÀR|® âw…”) }¢ôJJÈ?­ˆÙ̈²BN™EÐ/ªÓÓÓ}ÔìÖÅþ`…˜ÌÌ̦]HüT ç¨ú‰^¯Gòø\’×ç!x¥© O S„€ƒ’8’¤iA¢J(Mφ1#IT©-I!!8ÀÏ¾Š‰ÀïÉÏýäoÍRL’ØŒŒŒß^¼xQ¥ÑiúQ#7œÉ ºLùýÀ0Éî FÅh0rËÛt2Ù­ˆ`[‚Ùd¡±“¬¬Kííí*)ÜF~âÉßÚ¨%#GwÃbÊÔ·èH>Æ9úKx¦©©IGV×ÐР«¯¯×íÛ·O·wï^]mm­®ººZ·{÷n]UU•®¢¢BW^^®Û¹s§®¬¬LWRR¢+**ÒêòóóŸÉËË;¡ÕjHj­¹‹“œY&;³4é1“ɤú|>‰ …,‡×ëU<âv»—Ë¥8Ån·+6›M±Z­ŠÙlVh¬b4•ÉÉIebb‚ÃÃÃ*YñòåËêöíÛO0?ápÜE YZéIrÀxFFFfi¢A¨ƒ½ qS" X,–K‰\ˆì,wÓ8µ¸¸ø¥0„e ÌÏÓêTú³866¦’#¶ÂhR¾jf#툰~êsLï"S‚ÂòëÕœdÈaˆVÍì9”厎¹»»[îêêâ–áúõë7nÜX@äÙ›7oÎ14gˆ-ˆ¬¬@]]Þét2ÇB˜€L000€+W®àÚµk¸zõ*·Dˆ#Òîìì䈴™edà éê(Ãõ”\*‹)Å[¥Ë$%HîxÑÄìYRãž>f™J´•òŠ ]±2Ú^zŠÛ²2Åï‹DÚ$9Hú»,…@¦E¨”„_Ž@MM 'À2™IÇâÏéÎ;Üqd¥Ì.E$‹Aä8Úœ@AAÁòرÉ,BzZ1ËÚ´×qûöm´·/Q “IQ CCC9Âè(Ùጎ1ٹ С´2ÊÊJ=9Toݺ%ì*µyØ„$'zzzÐóùçèííEo_/úúú½è¿Õ’`SSS„y e‡ÃùÕЪYò±E%ù9‹Õ ¦†ÃA°;N»•¬Í‹ÅÊa%Øh ÇÆ³N€Žä• Й®g1£@§‘°Ùì ­ ÿ”Køý>Lü ˆ3AÌ 49ÒŒQ"ˆ"QÀôŒ${Üž;vìX™NÀnwF“AuØœ²É9Šö¾‰¿~Ò‚ó]møÛ•38wñ Îþû þò¯V¼sáþôÑi¼ûi+ï{ïÒ+8ßÙ†Ú_ÅÙK-r»á‚*Ê‘{ DªR„À®]»ô,ùœ§`±™T³Á.{fŒ8ò‹A?#¿! ëµÞ.9„'þ‰=Gסá¹T|çÍL$ožÿ-go>¦º]Áf§íh"¢Ï¿u £Q<;ê×b÷“©8ñQrk±ugÒ âP÷£Ð}˜mk°ûû°ëàh«ãä¿w¿¦ '››»<ˆ$tV“ãtØ„Iã„j39e߬ GµŸK»ë`Ú¼§aÿ [QÀûãc[„ïh±!+™e ÈÈ[ËCðþå×Tz ¬B€N*Ê uèÎ02:¤ºìÙ2à䯿2 )°EßHÆÓçòQwl8”Šr\òÐ:”}k=·jq¨E‹âý)¨þ^:²kâåo¼1O`ðK(À°ºíq{‡ËN!pÈÞ3žþ]3¢b£PP¿µGÓðØ)-ÒóPþÈ$¤hžŸ€R" ­HÄSo碰)Ù)ˆK‰’/t¼± Àªè Ð³íâv¹i˜‰€SöËfüà…or©³ÊñXËV5¥ >)†¥ð~MÜ}(m^ÇÛ^ÞŠºã‘²)n>Ÿ}…P–r^W°Ú,ªÝê’Ý‚ ?ÿóÃØR˳ýÅO‹QõDǾ§c'%[ù£©hzv3 Sx~ò~²«RPÜœ(ÿãæ¼ƒ·WW€þ §ÂÃC`µ[h:ä)XqäŇY¡¡,/Â#§·ò•nÊ‹''‰a¢Ô`Êœø8Ÿ¶¨ 4ò¹O^çnõ¯° #ÙÙÙz–,R€…ÀfrÑAd€®í J܈co—¡òÛ[žµ4gbßSZlÙžŠ¼ÊMh<žƒd3é½YŸ‹ïž*Aa}šüÁÕ¶Õs ÒAßî'YôûýôUkfJÈ6— ƒžÿ Ïü_ô.aØßޱÐ5Œç1!vbRìâ0LwÃ8sã. Z:0è'7Õ¹Y™jÁ°šóòˆc6++ë7ýýýì F2M¬(Q!r)n»_ñ{JÀR|® âw…”) }¢ôJJÈ?­ˆÙ̈²BN™EÐ/ªÓÓÓ}ÔìÖÅþ`…˜ÌÌ̦]HüT ç¨ú‰^¯Gòø\’×ç!x¥© O S„€ƒ’8’¤iA¢J(Mφ1#IT©-I!!8ÀÏ¾Š‰ÀïÉÏýäoÍRL’ØŒŒŒß^¼xQ¥ÑiúQ#7œÉ ºLùýÀ0Éî FÅh0rËÛt2Ù­ˆ`[‚Ùd¡±“¬¬Kííí*)ÜF~âÉßÚ¨%#GwÃbÊÔ·èH>Æ9úKx¦©©IGV×ÐР«¯¯×íÛ·O·wï^]mm­®ººZ·{÷n]UU•®¢¢BW^^®Û¹s§®¬¬LWRR¢+**ÒêòóóŸÉËË;¡ÕjHj­¹‹“œY&;³4é1“ɤú|>‰ …,‡×ëU<âv»—Ë¥8Ån·+6›M±Z­ŠÙlVh¬b4•ÉÉIebb‚ÃÃÃ*YñòåËêöíÛO0?ápÜE YZéIrÀxFFFfi¢A¨ƒ½ qS" X,–K‰\ˆì,wÓ8µ¸¸ø¥0„e ÌÏÓêTú³866¦’#¶ÂhR¾jf#툰~êsLï"S‚ÂòëÕœdÈaˆVÍì9”厎¹»»[îêêâ–áúõë7nÜX@äÙ›7oÎ14gˆ-ˆ¬¬@]]Þét2ÇB˜€L000€+W®àÚµk¸zõ*·Dˆ#Òîìì䈴™edà éê(Ãõ”\*‹)Å[¥Ë$%HîxÑÄìYRãž>f™J´•òŠ ]±2Ú^zŠÛ²2Åï‹DÚ$9Hú»,…@¦E¨”„_Ž@MM 'À2™IÇâÏéÎ;Üqd¥Ì.E$‹Aä8Úœ@AAÁòرÉ,BzZ1ËÚ´×qûöm´·/Q “IQ CCC9Âè(Ùጎ1ٹ С´2ÊÊJ=9Toݺ%ì*µyØ„$'zzzÐóùçèííEo_/úúú½è¿Õ’`SSS„y e‡ÃùÕЪYò±E%ù9‹Õ ¦†ÃA°;N»•¬Í‹ÅÊa%Øh ÇÆ³N€Žä• Й®g1£@§‘°Ùì ­ ÿ”Køý>Lü ˆ3AÌ 49ÒŒQ"ˆ"QÀôŒ${Üž;vìX™NÀnwF“AuØœ²É9Šö¾‰¿~Ò‚ó]møÛ•38wñ Îþû þò¯V¼sáþôÑi¼ûi+ï{ïÒ+8ßÙ†Ú_ÅÙK-r»á‚*Ê‘{ DªR„À®]»ô,ùœ§`±™T³Á.{fŒ8ò‹A?#¿! ëµÞ.9„'þ‰=Gסá¹T|çÍL$ožÿ-go>¦º]Áf§íh"¢Ï¿u £Q<;ê×b÷“©8ñQrk±ugÒ âP÷£Ð}˜mk°ûû°ëàh«ãä¿w¿¦ '››»<ˆ$tV“ãtØ„Iã„j39e߬ GµŸK»ë`Ú¼§aÿ [QÀûãc[„ïh±!+™e ÈÈ[ËCðþå×Tz ¬B€N*Ê uèÎ02:¤ºìÙ2à䯿2 )°EßHÆÓçòQwl8”Šr\òÐ:”}k=·jq¨E‹âý)¨þ^:²kâåo¼1O`ðK(À°ºíq{‡ËN!pÈÞ3žþ]3¢b£PP¿µGÓðØ)-ÒóPþÈ$¤hžŸ€R" ­HÄSo碰)Ù)ˆK‰’/t¼± Àªè Ð³íâv¹i˜‰€SöËfüà…or©³ÊñXËV5¥ >)†¥ð~MÜ}(m^ÇÛ^ÞŠºã‘²)n>Ÿ}…P–r^W°Ú,ªÝê’Ý‚ ?ÿóÃØR˳ýÅO‹QõDǾ§c'%[ù£©hzv3 Sx~ò~²«RPÜœ(ÿãæ¼ƒ·WW€þ §ÂÃC`µ[h:ä)XqäŇY¡¡,/Â#§·ò•nÊ‹''‰a¢Ô`Êœø8Ÿ¶¨ 4ò¹O^çnõ¯° #ÙÙÙz–,R€…ÀfrÑAd€®í J܈co—¡òÛ[žµ4gbßSZlÙžŠ¼ÊMh<žƒd3é½YŸ‹ïž*Aa}šüÁÕ¶Õs ÒAßî'YôûýôUkfJÈ6— ƒžÿ Ïü_ô.aØßޱÐ5Œç1!vbRìâ0LwÃ8sã. Z:0è'7Õ¹Y™jÁ°šóòˆc6++ë7ýýýì F2M¬(Q!r)n»_ñ{JÀR|® âw…”) }¢ôJJÈ?­ˆÙ̈²BN™EÐ/ªÓÓÓ}ÔìÖÅþ`…˜ÌÌ̦]HüT ç¨ú‰^¯Gòø\’×ç!x¥© O S„€ƒ’8’¤iA¢J(Mφ1#IT©-I!!8ÀÏ¾Š‰ÀïÉÏýäoÍRL’ØŒŒŒß^¼xQ¥ÑiúQ#7œÉ ºLùýÀ0Éî FÅh0rËÛt2Ù­ˆ`[‚Ùd¡±“¬¬Kííí*)ÜF~âÉßÚ¨%#GwÃbÊÔ·èH>Æ9ú&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = share/icons/gnome/32x32/mimetypes DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(icondir)" DATA = $(icon_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ xdgdatadir = @XDGDATADIR@ icondir = $(xdgdatadir)/icons/gnome/32x32/mimetypes icon_DATA = \ gnome-mime-application-vnd.gtkwave-ae2.png gnome-mime-application-vnd.gtkwave-aet.png \ gnome-mime-application-vnd.gtkwave-evcd.png gnome-mime-application-vnd.gtkwave-fst.png \ gnome-mime-application-vnd.gtkwave-ghw.png gnome-mime-application-vnd.gtkwave-gtkw.png \ gnome-mime-application-vnd.gtkwave-lx2.png gnome-mime-application-vnd.gtkwave-lxt2.png \ gnome-mime-application-vnd.gtkwave-lxt.png gnome-mime-application-vnd.gtkwave-vcd.png \ gnome-mime-application-vnd.gtkwave-vzt.png gtkwave.png EXTRA_DIST = \ gnome-mime-application-vnd.gtkwave-ae2.png gnome-mime-application-vnd.gtkwave-aet.png \ gnome-mime-application-vnd.gtkwave-evcd.png gnome-mime-application-vnd.gtkwave-fst.png \ gnome-mime-application-vnd.gtkwave-ghw.png gnome-mime-application-vnd.gtkwave-gtkw.png \ gnome-mime-application-vnd.gtkwave-lx2.png gnome-mime-application-vnd.gtkwave-lxt2.png \ gnome-mime-application-vnd.gtkwave-lxt.png gnome-mime-application-vnd.gtkwave-vcd.png \ gnome-mime-application-vnd.gtkwave-vzt.png gtkwave.png all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign share/icons/gnome/32x32/mimetypes/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign share/icons/gnome/32x32/mimetypes/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-iconDATA: $(icon_DATA) @$(NORMAL_INSTALL) @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(icondir)'"; \ $(MKDIR_P) "$(DESTDIR)$(icondir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icondir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icondir)" || exit $$?; \ done uninstall-iconDATA: @$(NORMAL_UNINSTALL) @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(icondir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(icondir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-iconDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-iconDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-iconDATA \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am \ uninstall-iconDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/share/icons/gnome/32x32/mimetypes/gnome-mime-application-vnd.gtkwave-fst.png0000664000175000017500000000423113166335473031012 0ustar bybellbybell‰PNG  IHDR szzô`IDATX…­WkPU×&p  Kx¦©©IGV×ÐР«¯¯×íÛ·O·wï^]mm­®ººZ·{÷n]UU•®¢¢BW^^®Û¹s§®¬¬LWRR¢+**ÒêòóóŸÉËË;¡ÕjHj­¹‹“œY&;³4é1“ɤú|>‰ …,‡×ëU<âv»—Ë¥8Ån·+6›M±Z­ŠÙlVh¬b4•ÉÉIebb‚ÃÃÃ*YñòåËêöíÛO0?ápÜE YZéIrÀxFFFfi¢A¨ƒ½ qS" X,–K‰\ˆì,wÓ8µ¸¸ø¥0„e ÌÏÓêTú³866¦’#¶ÂhR¾jf#툰~êsLï"S‚ÂòëÕœdÈaˆVÍì9”厎¹»»[îêêâ–áúõë7nÜX@äÙ›7oÎ14gˆ-ˆ¬¬@]]Þét2ÇB˜€L000€+W®àÚµk¸zõ*·Dˆ#Òîìì䈴™edà éê(Ãõ”\*‹)Å[¥Ë$%HîxÑÄìYRãž>f™J´•òŠ ]±2Ú^zŠÛ²2Åï‹DÚ$9Hú»,…@¦E¨”„_Ž@MM 'À2™IÇâÏéÎ;Üqd¥Ì.E$‹Aä8Úœ@AAÁòرÉ,BzZ1ËÚ´×qûöm´·/Q “IQ CCC9Âè(Ùጎ1ٹ С´2ÊÊJ=9Toݺ%ì*µyØ„$'zzzÐóùçèííEo_/úúú½è¿Õ’`SSS„y e‡ÃùÕЪYò±E%ù9‹Õ ¦†ÃA°;N»•¬Í‹ÅÊa%Øh ÇÆ³N€Žä• Й®g1£@§‘°Ùì ­ ÿ”Køý>Lü ˆ3AÌ 49ÒŒQ"ˆ"QÀôŒ${Üž;vìX™NÀnwF“AuØœ²É9Šö¾‰¿~Ò‚ó]møÛ•38wñ Îþû þò¯V¼sáþôÑi¼ûi+ï{ïÒ+8ßÙ†Ú_ÅÙK-r»á‚*Ê‘{ DªR„À®]»ô,ùœ§`±™T³Á.{fŒ8ò‹A?#¿! ëµÞ.9„'þ‰=Gסá¹T|çÍL$ožÿ-go>¦º]Áf§íh"¢Ï¿u £Q<;ê×b÷“©8ñQrk±ugÒ âP÷£Ð}˜mk°ûû°ëàh«ãä¿w¿¦ '››»<ˆ$tV“ãtØ„Iã„j39e߬ GµŸK»ë`Ú¼§aÿ [QÀûãc[„ïh±!+™e ÈÈ[ËCðþå×Tz ¬B€N*Ê uèÎ02:¤ºìÙ2à䯿2 )°EßHÆÓçòQwl8”Šr\òÐ:”}k=·jq¨E‹âý)¨þ^:²kâåo¼1O`ðK(À°ºíq{‡ËN!pÈÞ3žþ]3¢b£PP¿µGÓðØ)-ÒóPþÈ$¤hžŸ€R" ­HÄSo碰)Ù)ˆK‰’/t¼± Àªè Ð³íâv¹i˜‰€SöËfüà…or©³ÊñXËV5¥ >)†¥ð~MÜ}(m^ÇÛ^ÞŠºã‘²)n>Ÿ}…P–r^W°Ú,ªÝê’Ý‚ ?ÿóÃØR˳ýÅO‹QõDǾ§c'%[ù£©hzv3 Sx~ò~²«RPÜœ(ÿãæ¼ƒ·WW€þ §ÂÃC`µ[h:ä)XqäŇY¡¡,/Â#§·ò•nÊ‹''‰a¢Ô`Êœø8Ÿ¶¨ 4ò¹O^çnõ¯° #ÙÙÙz–,R€…ÀfrÑAd€®í J܈co—¡òÛ[žµ4gbßSZlÙžŠ¼ÊMh<žƒd3é½YŸ‹ïž*Aa}šüÁÕ¶Õs ÒAßî'YôûýôUkfJÈ6— ƒžÿ Ïü_ô.aØßޱÐ5Œç1!vbRìâ0LwÃ8sã. Z:0è'7Õ¹Y™jÁ°šóòˆc6++ë7ýýýì F2M¬(Q!r)n»_ñ{JÀR|® âw…”) }¢ôJJÈ?­ˆÙ̈²BN™EÐ/ªÓÓÓ}ÔìÖÅþ`…˜ÌÌ̦]HüT ç¨ú‰^¯Gòø\’×ç!x¥© O S„€ƒ’8’¤iA¢J(Mφ1#IT©-I!!8ÀÏ¾Š‰ÀïÉÏýäoÍRL’ØŒŒŒß^¼xQ¥ÑiúQ#7œÉ ºLùýÀ0Éî FÅh0rËÛt2Ù­ˆ`[‚Ùd¡±“¬¬Kííí*)ÜF~âÉßÚ¨%#GwÃbÊÔ·èH>Æ9ú@`ܾýóÐñåøl—,YòÓåË—ÿ’°kÅŠJ²ÊeË–)KJJ”K—.U) ”ùùùÊÅ‹+-Z¤\¸p¡277G™­ÌÌÌTfdd(ÓÒÒ”©©©J…B±K¡HþÅüùñ/’2“G ΘKÉmaaáÏÕj5³Ûíýæt:%»Í.Ùl6V«U²X,R__Ÿd6›%“É$É`ÐKzNÒjµ’F£‘h ©§§GêííEGG£¶ÿÚµk,99y/÷3ŽQ&q»zõê2rÀè¶®®®AFí£Á@ >üœÈ ‡ Óé½^ƒÃO}d‰¼O,++ëðIc ÉC³cô±¿»»›‘ðqÐÀàÙÒ £`4ïÁðûH?¸c²~®…çУ¨8rè£Ys;DNÅ––±²²R¬©©«««eÄ­[·dÔÖÖʶ¹­««¢1…ÎGŠr¯N%\ÉÆ #D"€ææf\¿~7oÞÄ7dËA¤F¡ªjô;'˰Z-'#‡ 2""jL”í*N€Ç–âÍ­HR‚WUU8ªâƒ?Þ?üÛ°å ©I»Ýáomkgy¹9Ç/.(Ž›:&Zj*ŠãIÅ yÇ"ð³aç$ù7¨­%[ƒººzÐ8’Ïë[šاçÿbdÌÏv=ùƒ=c(..VÑŒe\:Rm­­²cš‘ìŒÛ{Áò߃¡‘QÉÉÞ„Á`„Ád£ïêØÍš[±ê2ÛV’³}L´Ñ¨È)ÏÚ»h½£•Œ¥€<û*®@ ÚÛÛAqFgg'Ùtuv ³«f}7œµYÍWç†*kئu+vs_aáaáw Ð%((È—s ©©I Äcä\øöíZÔ××£®¾ h¸Ó€;wÐØØÚ¸àõzàt¹árÚát p÷u‹ýMeÌýaˆÐrn{úG[ßâ~&Mš<: ƒh{U‘ürrKdd<M&3¸´L‡a¶È0Éš¬0’ÔZ­úL°ØÜ°éá­þ‰hy/„µž)j*®0…"eì(H€ê€Š¯[r@;V&ÀsÀb±ÂåvÂápÀårÂíqÁ+xàx€I@ÿ ’€ÃãƒËX ïõRxÏ…ˆgW2‹¥OPkõŒêëã ÂBÔÌl2 Z†¬EÔYºðφ·qþ?Gð÷ê¸pýþzõ>ºr þû(Î|ZŽ3Ÿ•ãÂÕ“xçÒaÔ·ýý«à?‚ÏË“Ä+]Y` ´47²””ÔÑ «R@^^žŠ/?’V0˜tL¯1‹ö€/X úi«¢0=!\nç”Fcó;ó¿m6ŒÅãGb°ggl_dÁý^lŒá߉»ú:‡„ÖÖv–š Á„± äææ"Ð'è ZfÐ~v-ÕKäÿ0ŠâhL‰‰Ä¯/eã¹cÉøþÖ9Èzf.^~¬¡¶³ðÆyˆÉˆBÔ¬ñ“Š?0@"š™"e˜ ?6œœ/B6«M0™ Ì 3‹6¿ûþTŠY™¡X±cRWNAá–øÕ¥4$MÆÔaxÿôJHÿJFÏÉl^5Ï}EÏÌDBÉdñbÍ)BsK3/ÇcÆ„Š…ª»§› &JšfÔYDç /ý~½,{^éLY‰%ÏÎÀúýqˆMŸŠ÷¯»‘€*U^y;SæEbÁÂIˆM™"‡àãk§=´¬[h<‚@zzšœímíBGg³ší¢UРìÏOcnn8VôµÑØýq&ŠH…/?Y öe,îœ~ ¥ÏÇaCy<6I@ÚºiXºe6—N$Þ”CÀ÷•G*žž®âuÛns}3)Ð':zìzm#&<‚”eÑD"kFᣯ€ivâJJδ™HÝE~¶¾«@Öºh$æOCdLˆøyÍiYÚMM€ÎpªöŽvÊ;­½—hÀ û‡Cœ?k_žŽ‡6BÓiÅ©ãÛMÄ(‰÷Ä4ù›'_ŽCÉK35#RÁ—_g^¯W šÁ’’’Æ'’’¢¢=—OÁh20³Ñ*Ú~÷… /E›ç`ßåt¼¸·Ï—å#mS$2ÖÄ g} Š·Ç"¹0 ë‡mg“ŸEáš"~ôu9óù¶n–œôH"—J&@«À¨íÝ0’·${>ËÄ&Š3ŸéìÔIH*ˆ–Ûá‘¡H_3Üž†½_¤áÙ#‰˜•.^øê-9-Í­OÂ`GbbbON€‡À¤³ÒF¤Áž¥È^; ?{w!–<5qI³PøÔo‰Ç<Å ¤ÌÆšIHÉŸyÉ3°q_2~\žŒå3Å ×ËššÆIÂ`GBB‚ŠtwùèðÉ“qÈdÕ‰-öÿŠwôÿë5_‹® ±ÓCpWˆ=¾J±×ÏQ%ö Õ¢¦¿FÔn‰=žj±ÅP)v{*‡ÔžÛlhPôuvv°¤Ä‡ä@°cþüùeTZù½ÀÏ«!¯zTˆ$›Ù%¹ÉãöIN«WrY}’Çá—¼NŽ~ÉçüžÁ IA”È©ð‹ðºül``ÀßÖÖÆHáCãˆ/ã x<;UÁAª~>‡Ã.ØVÁá´‚Û㼂›à|~¯àï÷ ý‚Ðð ƒýµý~·)ÿ¼Ú í|‡€|S™3gÎî«W¯2~©à§X:Ég:u/Ý ÔÃ÷Ùªµ’Vs/ø­H7l :íð»^§‡ºWÍ˺¿¢¢‚‘Âûï'0ŠͦÑ]îpVfæ›™™'hk>I÷¼„“ßüÿ§RR¯ÑÝsƈ¿Ðû Œ"ò>£Æÿ?ƒÇJâ`d°IEND®B`‚gtkwave-3.3.86/share/icons/gnome/32x32/mimetypes/gnome-mime-application-vnd.gtkwave-vcd.png0000664000175000017500000000423113166335473030772 0ustar bybellbybell‰PNG  IHDR szzô`IDATX…­WkPU×&p  Kx¦©©IGV×ÐР«¯¯×íÛ·O·wï^]mm­®ººZ·{÷n]UU•®¢¢BW^^®Û¹s§®¬¬LWRR¢+**ÒêòóóŸÉËË;¡ÕjHj­¹‹“œY&;³4é1“ɤú|>‰ …,‡×ëU<âv»—Ë¥8Ån·+6›M±Z­ŠÙlVh¬b4•ÉÉIebb‚ÃÃÃ*YñòåËêöíÛO0?ápÜE YZéIrÀxFFFfi¢A¨ƒ½ qS" X,–K‰\ˆì,wÓ8µ¸¸ø¥0„e ÌÏÓêTú³866¦’#¶ÂhR¾jf#툰~êsLï"S‚ÂòëÕœdÈaˆVÍì9”厎¹»»[îêêâ–áúõë7nÜX@äÙ›7oÎ14gˆ-ˆ¬¬@]]Þét2ÇB˜€L000€+W®àÚµk¸zõ*·Dˆ#Òîìì䈴™edà éê(Ãõ”\*‹)Å[¥Ë$%HîxÑÄìYRãž>f™J´•òŠ ]±2Ú^zŠÛ²2Åï‹DÚ$9Hú»,…@¦E¨”„_Ž@MM 'À2™IÇâÏéÎ;Üqd¥Ì.E$‹Aä8Úœ@AAÁòرÉ,BzZ1ËÚ´×qûöm´·/Q “IQ CCC9Âè(Ùጎ1ٹ С´2ÊÊJ=9Toݺ%ì*µyØ„$'zzzÐóùçèííEo_/úúú½è¿Õ’`SSS„y e‡ÃùÕЪYò±E%ù9‹Õ ¦†ÃA°;N»•¬Í‹ÅÊa%Øh ÇÆ³N€Žä• Й®g1£@§‘°Ùì ­ ÿ”Køý>Lü ˆ3AÌ 49ÒŒQ"ˆ"QÀôŒ${Üž;vìX™NÀnwF“AuØœ²É9Šö¾‰¿~Ò‚ó]møÛ•38wñ Îþû þò¯V¼sáþôÑi¼ûi+ï{ïÒ+8ßÙ†Ú_ÅÙK-r»á‚*Ê‘{ DªR„À®]»ô,ùœ§`±™T³Á.{fŒ8ò‹A?#¿! ëµÞ.9„'þ‰=Gסá¹T|çÍL$ožÿ-go>¦º]Áf§íh"¢Ï¿u £Q<;ê×b÷“©8ñQrk±ugÒ âP÷£Ð}˜mk°ûû°ëàh«ãä¿w¿¦ '››»<ˆ$tV“ãtØ„Iã„j39e߬ GµŸK»ë`Ú¼§aÿ [QÀûãc[„ïh±!+™e ÈÈ[ËCðþå×Tz ¬B€N*Ê uèÎ02:¤ºìÙ2à䯿2 )°EßHÆÓçòQwl8”Šr\òÐ:”}k=·jq¨E‹âý)¨þ^:²kâåo¼1O`ðK(À°ºíq{‡ËN!pÈÞ3žþ]3¢b£PP¿µGÓðØ)-ÒóPþÈ$¤hžŸ€R" ­HÄSo碰)Ù)ˆK‰’/t¼± Àªè Ð³íâv¹i˜‰€SöËfüà…or©³ÊñXËV5¥ >)†¥ð~MÜ}(m^ÇÛ^ÞŠºã‘²)n>Ÿ}…P–r^W°Ú,ªÝê’Ý‚ ?ÿóÃØR˳ýÅO‹QõDǾ§c'%[ù£©hzv3 Sx~ò~²«RPÜœ(ÿãæ¼ƒ·WW€þ §ÂÃC`µ[h:ä)XqäŇY¡¡,/Â#§·ò•nÊ‹''‰a¢Ô`Êœø8Ÿ¶¨ 4ò¹O^çnõ¯° #ÙÙÙz–,R€…ÀfrÑAd€®í J܈co—¡òÛ[žµ4gbßSZlÙžŠ¼ÊMh<žƒd3é½YŸ‹ïž*Aa}šüÁÕ¶Õs ÒAßî'YôûýôUkfJÈ6— ƒžÿ Ïü_ô.aØßޱÐ5Œç1!vbRìâ0LwÃ8sã. Z:0è'7Õ¹Y™jÁ°šóòˆc6++ë7ýýýì F2M¬(Q!r)n»_ñ{JÀR|® âw…”) }¢ôJJÈ?­ˆÙ̈²BN™EÐ/ªÓÓÓ}ÔìÖÅþ`…˜ÌÌ̦]HüT ç¨ú‰^¯Gòø\’×ç!x¥© O S„€ƒ’8’¤iA¢J(Mφ1#IT©-I!!8ÀÏ¾Š‰ÀïÉÏýäoÍRL’ØŒŒŒß^¼xQ¥ÑiúQ#7œÉ ºLùýÀ0Éî FÅh0rËÛt2Ù­ˆ`[‚Ùd¡±“¬¬Kííí*)ÜF~âÉßÚ¨%#GwÃbÊÔ·èH>Æ9úKx¦©©IGV×ÐР«¯¯×íÛ·O·wï^]mm­®ººZ·{÷n]UU•®¢¢BW^^®Û¹s§®¬¬LWRR¢+**ÒêòóóŸÉËË;¡ÕjHj­¹‹“œY&;³4é1“ɤú|>‰ …,‡×ëU<âv»—Ë¥8Ån·+6›M±Z­ŠÙlVh¬b4•ÉÉIebb‚ÃÃÃ*YñòåËêöíÛO0?ápÜE YZéIrÀxFFFfi¢A¨ƒ½ qS" X,–K‰\ˆì,wÓ8µ¸¸ø¥0„e ÌÏÓêTú³866¦’#¶ÂhR¾jf#툰~êsLï"S‚ÂòëÕœdÈaˆVÍì9”厎¹»»[îêêâ–áúõë7nÜX@äÙ›7oÎ14gˆ-ˆ¬¬@]]Þét2ÇB˜€L000€+W®àÚµk¸zõ*·Dˆ#Òîìì䈴™edà éê(Ãõ”\*‹)Å[¥Ë$%HîxÑÄìYRãž>f™J´•òŠ ]±2Ú^zŠÛ²2Åï‹DÚ$9Hú»,…@¦E¨”„_Ž@MM 'À2™IÇâÏéÎ;Üqd¥Ì.E$‹Aä8Úœ@AAÁòرÉ,BzZ1ËÚ´×qûöm´·/Q “IQ CCC9Âè(Ùጎ1ٹ С´2ÊÊJ=9Toݺ%ì*µyØ„$'zzzÐóùçèííEo_/úúú½è¿Õ’`SSS„y e‡ÃùÕЪYò±E%ù9‹Õ ¦†ÃA°;N»•¬Í‹ÅÊa%Øh ÇÆ³N€Žä• Й®g1£@§‘°Ùì ­ ÿ”Køý>Lü ˆ3AÌ 49ÒŒQ"ˆ"QÀôŒ${Üž;vìX™NÀnwF“AuØœ²É9Šö¾‰¿~Ò‚ó]møÛ•38wñ Îþû þò¯V¼sáþôÑi¼ûi+ï{ïÒ+8ßÙ†Ú_ÅÙK-r»á‚*Ê‘{ DªR„À®]»ô,ùœ§`±™T³Á.{fŒ8ò‹A?#¿! ëµÞ.9„'þ‰=Gסá¹T|çÍL$ožÿ-go>¦º]Áf§íh"¢Ï¿u £Q<;ê×b÷“©8ñQrk±ugÒ âP÷£Ð}˜mk°ûû°ëàh«ãä¿w¿¦ '››»<ˆ$tV“ãtØ„Iã„j39e߬ GµŸK»ë`Ú¼§aÿ [QÀûãc[„ïh±!+™e ÈÈ[ËCðþå×Tz ¬B€N*Ê uèÎ02:¤ºìÙ2à䯿2 )°EßHÆÓçòQwl8”Šr\òÐ:”}k=·jq¨E‹âý)¨þ^:²kâåo¼1O`ðK(À°ºíq{‡ËN!pÈÞ3žþ]3¢b£PP¿µGÓðØ)-ÒóPþÈ$¤hžŸ€R" ­HÄSo碰)Ù)ˆK‰’/t¼± Àªè Ð³íâv¹i˜‰€SöËfüà…or©³ÊñXËV5¥ >)†¥ð~MÜ}(m^ÇÛ^ÞŠºã‘²)n>Ÿ}…P–r^W°Ú,ªÝê’Ý‚ ?ÿóÃØR˳ýÅO‹QõDǾ§c'%[ù£©hzv3 Sx~ò~²«RPÜœ(ÿãæ¼ƒ·WW€þ §ÂÃC`µ[h:ä)XqäŇY¡¡,/Â#§·ò•nÊ‹''‰a¢Ô`Êœø8Ÿ¶¨ 4ò¹O^çnõ¯° #ÙÙÙz–,R€…ÀfrÑAd€®í J܈co—¡òÛ[žµ4gbßSZlÙžŠ¼ÊMh<žƒd3é½YŸ‹ïž*Aa}šüÁÕ¶Õs ÒAßî'YôûýôUkfJÈ6— ƒžÿ Ïü_ô.aØßޱÐ5Œç1!vbRìâ0LwÃ8sã. Z:0è'7Õ¹Y™jÁ°šóòˆc6++ë7ýýýì F2M¬(Q!r)n»_ñ{JÀR|® âw…”) }¢ôJJÈ?­ˆÙ̈²BN™EÐ/ªÓÓÓ}ÔìÖÅþ`…˜ÌÌ̦]HüT ç¨ú‰^¯Gòø\’×ç!x¥© O S„€ƒ’8’¤iA¢J(Mφ1#IT©-I!!8ÀÏ¾Š‰ÀïÉÏýäoÍRL’ØŒŒŒß^¼xQ¥ÑiúQ#7œÉ ºLùýÀ0Éî FÅh0rËÛt2Ù­ˆ`[‚Ùd¡±“¬¬Kííí*)ÜF~âÉßÚ¨%#GwÃbÊÔ·èH>Æ9úKx¦©©IGV×ÐР«¯¯×íÛ·O·wï^]mm­®ººZ·{÷n]UU•®¢¢BW^^®Û¹s§®¬¬LWRR¢+**ÒêòóóŸÉËË;¡ÕjHj­¹‹“œY&;³4é1“ɤú|>‰ …,‡×ëU<âv»—Ë¥8Ån·+6›M±Z­ŠÙlVh¬b4•ÉÉIebb‚ÃÃÃ*YñòåËêöíÛO0?ápÜE YZéIrÀxFFFfi¢A¨ƒ½ qS" X,–K‰\ˆì,wÓ8µ¸¸ø¥0„e ÌÏÓêTú³866¦’#¶ÂhR¾jf#툰~êsLï"S‚ÂòëÕœdÈaˆVÍì9”厎¹»»[îêêâ–áúõë7nÜX@äÙ›7oÎ14gˆ-ˆ¬¬@]]Þét2ÇB˜€L000€+W®àÚµk¸zõ*·Dˆ#Òîìì䈴™edà éê(Ãõ”\*‹)Å[¥Ë$%HîxÑÄìYRãž>f™J´•òŠ ]±2Ú^zŠÛ²2Åï‹DÚ$9Hú»,…@¦E¨”„_Ž@MM 'À2™IÇâÏéÎ;Üqd¥Ì.E$‹Aä8Úœ@AAÁòرÉ,BzZ1ËÚ´×qûöm´·/Q “IQ CCC9Âè(Ùጎ1ٹ С´2ÊÊJ=9Toݺ%ì*µyØ„$'zzzÐóùçèííEo_/úúú½è¿Õ’`SSS„y e‡ÃùÕЪYò±E%ù9‹Õ ¦†ÃA°;N»•¬Í‹ÅÊa%Øh ÇÆ³N€Žä• Й®g1£@§‘°Ùì ­ ÿ”Køý>Lü ˆ3AÌ 49ÒŒQ"ˆ"QÀôŒ${Üž;vìX™NÀnwF“AuØœ²É9Šö¾‰¿~Ò‚ó]møÛ•38wñ Îþû þò¯V¼sáþôÑi¼ûi+ï{ïÒ+8ßÙ†Ú_ÅÙK-r»á‚*Ê‘{ DªR„À®]»ô,ùœ§`±™T³Á.{fŒ8ò‹A?#¿! ëµÞ.9„'þ‰=Gסá¹T|çÍL$ožÿ-go>¦º]Áf§íh"¢Ï¿u £Q<;ê×b÷“©8ñQrk±ugÒ âP÷£Ð}˜mk°ûû°ëàh«ãä¿w¿¦ '››»<ˆ$tV“ãtØ„Iã„j39e߬ GµŸK»ë`Ú¼§aÿ [QÀûãc[„ïh±!+™e ÈÈ[ËCðþå×Tz ¬B€N*Ê uèÎ02:¤ºìÙ2à䯿2 )°EßHÆÓçòQwl8”Šr\òÐ:”}k=·jq¨E‹âý)¨þ^:²kâåo¼1O`ðK(À°ºíq{‡ËN!pÈÞ3žþ]3¢b£PP¿µGÓðØ)-ÒóPþÈ$¤hžŸ€R" ­HÄSo碰)Ù)ˆK‰’/t¼± Àªè Ð³íâv¹i˜‰€SöËfüà…or©³ÊñXËV5¥ >)†¥ð~MÜ}(m^ÇÛ^ÞŠºã‘²)n>Ÿ}…P–r^W°Ú,ªÝê’Ý‚ ?ÿóÃØR˳ýÅO‹QõDǾ§c'%[ù£©hzv3 Sx~ò~²«RPÜœ(ÿãæ¼ƒ·WW€þ §ÂÃC`µ[h:ä)XqäŇY¡¡,/Â#§·ò•nÊ‹''‰a¢Ô`Êœø8Ÿ¶¨ 4ò¹O^çnõ¯° #ÙÙÙz–,R€…ÀfrÑAd€®í J܈co—¡òÛ[žµ4gbßSZlÙžŠ¼ÊMh<žƒd3é½YŸ‹ïž*Aa}šüÁÕ¶Õs ÒAßî'YôûýôUkfJÈ6— ƒžÿ Ïü_ô.aØßޱÐ5Œç1!vbRìâ0LwÃ8sã. Z:0è'7Õ¹Y™jÁ°šóòˆc6++ë7ýýýì F2M¬(Q!r)n»_ñ{JÀR|® âw…”) }¢ôJJÈ?­ˆÙ̈²BN™EÐ/ªÓÓÓ}ÔìÖÅþ`…˜ÌÌ̦]HüT ç¨ú‰^¯Gòø\’×ç!x¥© O S„€ƒ’8’¤iA¢J(Mφ1#IT©-I!!8ÀÏ¾Š‰ÀïÉÏýäoÍRL’ØŒŒŒß^¼xQ¥ÑiúQ#7œÉ ºLùýÀ0Éî FÅh0rËÛt2Ù­ˆ`[‚Ùd¡±“¬¬Kííí*)ÜF~âÉßÚ¨%#GwÃbÊÔ·èH>Æ9ú vpAg ‡úœ3IDATXÕ—Ës\GÆÝ÷}ç%Æ’FYòC¶å’“ \$)( ÞJQ,H vdÉŸÀ:P°bÇ2Ee‘¢XàÄ•J…GpÀŽmbÇŽcE–,É–%ÏKsçÑÝ,î͌ƒm¥ÒÔ=§Oçôùúë[~Ó B„`âzß’a ˆ]¾o·í4ôâõ| Fƒm0¬ÝÙ¤úp+øY‰šÝ7IJA0`ÑÚÒt"Ó³p|‰›’4*´î­(/+Á@TU]ÿÌ`Èðxcxëç9ÿöÇX¶ÀÑ—s|z®Ü—Ÿ–ÌŸÍsûß5V¯7ºÙ£³Ó§Ó\zgƒfM÷*!àèKI¼wË`@u4/¾zŠ7~ó*6@ToR¯FÝ õš @åa½W> 3’- e‰ô-É*Ú04%É– n¶ÃúR£7I@½î‚Êf/^To‚ØñF÷oÙnû($|ûÃ<ûZ­ØuH ,Wòç_/`t†íyô}·ìi„9›±c!•µ6‹—ê4ʪo ‚œÅþ“)Æ…9›­ÍΞâÚ[ß<yp¿G®èòù‡Þýí k7}öÑÃ/¾QäÀ·²äKîÞf<&¿"- BÊÛLŸÎ€1h G¾—òµõÃ|œÕÇ‚ô>‡Úƒ–#8öƒA,O"%»ÇSš}3~ÀÈÁ€ƒ­,Rʾì;ÝŸÉUͺ¢8À‘`GÅš5ETUÌžÉaT¦ÆÓZ3rÈ‘Xù´Á§çÊXV `l.àîÕ­ý^ɳt9Þûõ…ˆòJ»¯rE‡Â”ÏÒå:Ãný«Ú¥ãØ\îþo ¥«?1€;Mî^mt[s°äb ܹÓfäP€—²øüïU6›¬\ëïÕȸÜúG•‰)j÷۬݌v°q´…äãšc;‹³HXÙvøì:)£³á“»Ot§<}ύ¬¶x¸ÜDµ—ÐO`À $ãÇCV®5ˆ* žpp!ˆ*Š»×¶?âør÷èQ¶'±}ðÒ^ÊBÚi ÜPR˜ôšôX½ÞÀö$BÆþn(cÿ´…J?¶Y®dõzƒ¡džJ¤-°l—Šým/NĘ>â´]@ÊXŒÜ0.̳¯9dmK.ó¯äñR3ßÌ0ùLº/Ë8žäÄÙ<ƒ%—pÀæ…ׇY»ÑÀK[ÝxZ+¦Oe@ˆ¸Zƒê€î´2SK+C~Â#ª*ÊkmŒ6€Áhƒê˜Ø¿ÿ6ªg«¬¶‰ªŠÁ wG¼ØŒ6‰ ê\xkÛ–‰|` Üø Ì±ïòåküóO÷ðÒ'Îæ¹}!–ãäÜÂèXާN¥¹ü×MšuÅþ“)ÜPré 7‡1pí½‡` ÓÑ ‰ü$TË ÛÐjhZ ÝEê…C“‹ëÉ%Dc ¨–¦ÓÔ]ÿvSÓiŶv¤iÕ5‹ëä'}ÜЊ«¥L/~TË<™F 3>~ÚbéJ}O”Ú>–®ld, Ó^Ÿ4ïdÁ–Òñ¨ªX¿ÝüÚÖoGD5EéxŠ'qñ±°\Ii>Ž[µõv\x*¯¿Õûmî11ŸÂrÜØCS.¥–Ó%°ñ³ãs! ן BàÛ¦|œ@voÆÆr#.¶'(Í…´#ƒ1†­Í“Ϥc«ª.u•R My@"F£³³\W޵‚1—̰ƒåŸÉu`£¡x$ x´_ŽI¨6ó|¦ëgق̈CaÚ§¼Ò"7Ú“ãâl˱V¯7¸~¾Œ´,0rØgÿÉQEqù/TÖÚ â«÷Ä|Šõ…&•ÕVF]†¦<î|R§i0±0Í<—!;â°x±ÆÚh¥vˆ'[ð`¡ÅÒ'±¼ ÙQ‡1—{·">{¿ü¬Eq6äÁB´CŽ‹G4¹¢ËòÕ­D3À Ü»10æÒ(+¾¼XëöЃÙf¯Œ6ä']^úÕnÊ"7êP˜òøìýrwqHdh—X€vC³|e‹^ßÇw~9ÂüÙ<ͺâ½ß-w©0ñ¥a8‰à¨¶añâ×çÿ£cñR羉)J&õŸ·×»×4@Z‚ÛÕøãÏnàø‚™ç2he¸ùaåÑ>‹Ñ>†Š†¶›T8ÿû„€/>ªÒŽ4ËW·8ø“mRYŸt&MõN\ߑɄŽ~ŠÐO‚²éLšÜD§yŸL&M~_›ÈW}[Õ¸gc lÞ”$™lšt6f‘8·ò¦y°V¡^it§n:ŽÜª÷Ò„~Æ¢ÝШV?ØžÄ ͪÆèþ׳›ú*žŽ_ÅÆÎ `K,†‹yÄX²Œè]£…ÉÉßÄ&IöbÀ¸ú¢(’×^ÏÖ'bÊÆßâçùÿPï5ß~qQ%tEXtdate:create2012-01-07T05:16:05-05:002Î~%tEXtdate:modify2012-01-05T14:31:59-05:00Ÿ¦­úIEND®B`‚gtkwave-3.3.86/share/icons/gnome/32x32/Makefile.in0000664000175000017500000004523713166335473020767 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = share/icons/gnome/32x32 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = mimetypes all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign share/icons/gnome/32x32/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign share/icons/gnome/32x32/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-tags distdir dvi dvi-am \ html html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/share/icons/gnome/32x32/Makefile.am0000664000175000017500000000005213166335473020740 0ustar bybellbybell## -*- makefile -*- ## SUBDIRS= mimetypes gtkwave-3.3.86/share/icons/gnome/Makefile.in0000664000175000017500000004522513166335473020203 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = share/icons/gnome DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = 16x16 32x32 48x48 all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign share/icons/gnome/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign share/icons/gnome/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-tags distdir dvi dvi-am \ html html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/share/icons/gnome/16x16/0000775000175000017500000000000013166335473016713 5ustar bybellbybellgtkwave-3.3.86/share/icons/gnome/16x16/Makefile.am0000664000175000017500000000005213166335473020744 0ustar bybellbybell## -*- makefile -*- ## SUBDIRS= mimetypes gtkwave-3.3.86/share/icons/gnome/16x16/mimetypes/0000775000175000017500000000000013166335473020727 5ustar bybellbybellgtkwave-3.3.86/share/icons/gnome/16x16/mimetypes/Makefile.am0000664000175000017500000000216013166335473022762 0ustar bybellbybell## -*- makefile -*- ## xdgdatadir=@XDGDATADIR@ icondir=$(xdgdatadir)/icons/gnome/16x16/mimetypes icon_DATA = \ gnome-mime-application-vnd.gtkwave-ae2.png gnome-mime-application-vnd.gtkwave-aet.png \ gnome-mime-application-vnd.gtkwave-evcd.png gnome-mime-application-vnd.gtkwave-fst.png \ gnome-mime-application-vnd.gtkwave-ghw.png gnome-mime-application-vnd.gtkwave-gtkw.png \ gnome-mime-application-vnd.gtkwave-lx2.png gnome-mime-application-vnd.gtkwave-lxt2.png \ gnome-mime-application-vnd.gtkwave-lxt.png gnome-mime-application-vnd.gtkwave-vcd.png \ gnome-mime-application-vnd.gtkwave-vzt.png gtkwave.png EXTRA_DIST = \ gnome-mime-application-vnd.gtkwave-ae2.png gnome-mime-application-vnd.gtkwave-aet.png \ gnome-mime-application-vnd.gtkwave-evcd.png gnome-mime-application-vnd.gtkwave-fst.png \ gnome-mime-application-vnd.gtkwave-ghw.png gnome-mime-application-vnd.gtkwave-gtkw.png \ gnome-mime-application-vnd.gtkwave-lx2.png gnome-mime-application-vnd.gtkwave-lxt2.png \ gnome-mime-application-vnd.gtkwave-lxt.png gnome-mime-application-vnd.gtkwave-vcd.png \ gnome-mime-application-vnd.gtkwave-vzt.png gtkwave.png gtkwave-3.3.86/share/icons/gnome/16x16/mimetypes/gnome-mime-application-vnd.gtkwave-evcd.png0000664000175000017500000000150313166335473031142 0ustar bybellbybell‰PNG  IHDRóÿa IDAT8¥“[HQÇ55J»ìF®Šei¡&HB¹¶»³k®w% z(„ ´u /ÐKHÑ£PAI½= =T·½&šy)w]ÍËêÌŽëî™ÝUçÌ×Sb}íƒ?ß7ÎïüÏ™ï“Éþ7""""¥œ˜˜xº¾¾¾­¶¶¶¹®®Ž®©©1VUUµTTTËÊÊZ ƒ±¸¸˜ÖétMEEEí …"s ³WÊd# $X–åƒÁ „0Ïó⎤oiÝãñð¢(uìb¥LN»ïv»att” õ÷÷ûÍf32™MÈb± «Õê·Ûí!R³ÄɃ0ÕÕÕ49\.ï˜vÀÐ ÛlvÑjµ‰6"‹ÅŠI D|(½^ߨ¬¬lñz½àp8üSS“Ð×ÿuÓd“É$ØlÖÍoÃv°Ù­~r%ÉA{ ¼¼œ&÷§Ó‰æ\¿adø»0ñcOŒOb‡Ã‰™eV`W8X˜_BÁ@Püu½())¡}>Ì8gÐ<ã„9æ§0ÏLc×Â4ž•äþ%¸½.p.Ž£@Eí”––Òœ‡ÎË¢Ö'·áĹBÞ•“¸êa®{œU éBÖ…d(¼š…¼¡e 4úp€¡Ä@3 «kj~Ô‘‡dBþ %Î)ÇI9±XkT ‡S£ »P‰ü hÕ»HM²¸°^‡š î¸LÐÞKÁÉgcq¼2 4&§ öCÖ%%âE4…T8€ü–fÅ|hͧµŽÚÔÝM3÷ Égâ„ÜŠ£›o&@F^²VA­¢ÚÃEÑ· â›:¯Aî­(œ–/ƧÈDyz¤(OÛƒóBþõ$mp £þ½ÁV'ªT*#Ã00;;Ëõônô|yÎ÷|ì¼ÿÔøðù5ѾwàÝF¯é-ç jMÛ fÐ)õøšw-€ÔX ,ÍÊúúz@ÊÄñÓ°i”Ëå*ò/ɤuéôÔ VýL£ÑlK½%­VCÖ/w‘É|¥PÑJûþ;³û9À!^IEND®B`‚gtkwave-3.3.86/share/icons/gnome/16x16/mimetypes/gnome-mime-application-vnd.gtkwave-vzt.png0000664000175000017500000000150313166335473031044 0ustar bybellbybell‰PNG  IHDRóÿa IDAT8¥“[HQÇ55J»ìF®Šei¡&HB¹¶»³k®w% z(„ ´u /ÐKHÑ£PAI½= =T·½&šy)w]ÍËêÌŽëî™ÝUçÌ×Sb}íƒ?ß7ÎïüÏ™ï“Éþ7""""¥œ˜˜xº¾¾¾­¶¶¶¹®®Ž®©©1VUUµTTTËÊÊZ ƒ±¸¸˜ÖétMEEEí …"s ³WÊd# $X–åƒÁ „0Ïó⎤oiÝãñð¢(uìb¥LN»ïv»att” õ÷÷ûÍf32™MÈb± «Õê·Ûí!R³ÄɃ0ÕÕÕ49\.ï˜vÀÐ ÛlvÑjµ‰6"‹ÅŠI D|(½^ߨ¬¬lñz½àp8üSS“Ð×ÿuÓd“É$ØlÖÍoÃv°Ù­~r%ÉA{ ¼¼œ&÷§Ó‰æ\¿adø»0ñcOŒOb‡Ã‰™eV`W8X˜_BÁ@Püu½())¡}>Ì8gÐ<ã„9æ§0ÏLc×Â4ž•äþ%¸½.p.Ž£@Eí”––Òœ‡ÎË¢Ö'·áĹBÞ•“¸êa®{œU éBÖ…d(¼š…¼¡e 4úp€¡Ä@3 «kj~Ô‘‡dBþ %Î)ÇI9±XkT ‡S£ »P‰ü hÕ»HM²¸°^‡š î¸LÐÞKÁÉgcq¼2 4&§ öCÖ%%âE4…T8€ü–fÅ|hͧµŽÚÔÝM3÷ Égâ„ÜŠ£›o&@F^²VA­¢ÚÃEÑ· â›:¯Aî­(œ–/ƧÈDyz¤(OÛƒóBþõ$mp £þ½ÁV'ªT*#Ã00;;Ëõônô|yÎ÷|ì¼ÿÔøðù5ѾwàÝF¯é-ç jMÛ fÐ)õøšw-€ÔX ,ÍÊúúz@ÊÄñÓ°i”Ëå*ò/ɤuéôÔ VýL£ÑlK½%­VCÖ/w‘É|¥PÑJûþ;³û9À!^IEND®B`‚gtkwave-3.3.86/share/icons/gnome/16x16/mimetypes/gtkwave.png0000664000175000017500000000167313166335473023114 0ustar bybellbybell‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYsHHFÉk> vpAg\Æ­ÃäIDAT8ËM“ÝjW…¿sæhFi$,Éò‚±-×ù)-¥iJM `ZzQzÓgÈ[ô6ÑGÈMÈE PZ ¥¸PZˆí´vl¥qäèÏR$[ÒÌhÎ韥› ›µ÷^,Ööš~{„r ˆCƒ lI8Ñ8YÉ<4Í5æ¡\+ ö¾?äÛ‡O(o8àÍŸSüU›Æý<í¿f,n¥9úiÄà,¤öN€îIÀƒo¾BÓ~{„*8 zS6wËÜü2Míïä[é†ÃE{ÄÉï#œ…€þ›€`¢ÒyEeÝÁ«¦®©iÖ>̱ÿtÈÁwCn}^dínŽÓ½ñ8=‡tÞB¹‹Úv''Á@¡fS\±éÏðë «ðJS\¶Y»ë!$dò ·¨Pƒ³gO‡,6´+%¨¿çÒ:˜ðâç1Ÿx”ê6­ƒ qdÚGŸí†HcÀhÿ½²‘¦ÿ2 ŽL2׆84ô_TÖÓÿÃT¾ªXÿØ#»`ÆŽGï4À_±áž‡P\¶‘–`sÇÃhr¥^5…4$׌ÛµH{Š‹Wˆ„‘Ž“…‹W™¼Âv-ŒX5îÎ9Ý»¤ºéPÛÎÐkÎxñ˘¥m—毗@¢Ëùó)Ë·]¢iLçhJç8dÜ™#…y­le#Ͱ¢#ƒ ¤HJtdx{RÙLŒ$%Ê_µ¹ó…O*+X}×¥µ?aëÓY_‘)XäÊ)\_áUS,ßr¶Bj[¿n£&ƒ˜Îñ”JÃAÙ’ç?¼%šÊkç‡S–nB¯0|rãýáUL÷8`2ˆQ³qÌÚG9>øºD÷dÆÙœœ$ë[ô›I K)†¯‚+ͨrÿÁ"¿=º`6ŽQ™¬CïPpð8à²7§T)à~9MeE%Y¨äˆ–&Ã9ÍcºÏú‡’ÌŽƒº·{›Æ:–¦#–@9‚ùؙ̀ë8Ç`Ù4Ì#ÍÂbÜ™=¹‚ç–n%tEXtdate:create2012-01-07T05:16:05-05:002Î~%tEXtdate:modify2012-01-05T14:31:59-05:00Ÿ¦­úIEND®B`‚gtkwave-3.3.86/share/icons/gnome/16x16/mimetypes/gnome-mime-application-vnd.gtkwave-ghw.png0000664000175000017500000000150313166335473031006 0ustar bybellbybell‰PNG  IHDRóÿa IDAT8¥“[HQÇ55J»ìF®Šei¡&HB¹¶»³k®w% z(„ ´u /ÐKHÑ£PAI½= =T·½&šy)w]ÍËêÌŽëî™ÝUçÌ×Sb}íƒ?ß7ÎïüÏ™ï“Éþ7""""¥œ˜˜xº¾¾¾­¶¶¶¹®®Ž®©©1VUUµTTTËÊÊZ ƒ±¸¸˜ÖétMEEEí …"s ³WÊd# $X–åƒÁ „0Ïó⎤oiÝãñð¢(uìb¥LN»ïv»att” õ÷÷ûÍf32™MÈb± «Õê·Ûí!R³ÄɃ0ÕÕÕ49\.ï˜vÀÐ ÛlvÑjµ‰6"‹ÅŠI D|(½^ߨ¬¬lñz½àp8üSS“Ð×ÿuÓd“É$ØlÖÍoÃv°Ù­~r%ÉA{ ¼¼œ&÷§Ó‰æ\¿adø»0ñcOŒOb‡Ã‰™eV`W8X˜_BÁ@Püu½())¡}>Ì8gÐ<ã„9æ§0ÏLc×Â4ž•äþ%¸½.p.Ž£@Eí”––Òœ‡ÎË¢Ö'·áĹBÞ•“¸êa®{œU éBÖ…d(¼š…¼¡e 4úp€¡Ä@3 «kj~Ô‘‡dBþ %Î)ÇI9±XkT ‡S£ »P‰ü hÕ»HM²¸°^‡š î¸LÐÞKÁÉgcq¼2 4&§ öCÖ%%âE4…T8€ü–fÅ|hͧµŽÚÔÝM3÷ Égâ„ÜŠ£›o&@F^²VA­¢ÚÃEÑ· â›:¯Aî­(œ–/ƧÈDyz¤(OÛƒóBþõ$mp £þ½ÁV'ªT*#Ã00;;Ëõônô|yÎ÷|ì¼ÿÔøðù5ѾwàÝF¯é-ç jMÛ fÐ)õøšw-€ÔX ,ÍÊúúz@ÊÄñÓ°i”Ëå*ò/ɤuéôÔ VýL£ÑlK½%­VCÖ/w‘É|¥PÑJûþ;³û9À!^IEND®B`‚gtkwave-3.3.86/share/icons/gnome/16x16/mimetypes/gnome-mime-application-vnd.gtkwave-lx2.png0000664000175000017500000000150313166335473030726 0ustar bybellbybell‰PNG  IHDRóÿa IDAT8¥“[HQÇ55J»ìF®Šei¡&HB¹¶»³k®w% z(„ ´u /ÐKHÑ£PAI½= =T·½&šy)w]ÍËêÌŽëî™ÝUçÌ×Sb}íƒ?ß7ÎïüÏ™ï“Éþ7""""¥œ˜˜xº¾¾¾­¶¶¶¹®®Ž®©©1VUUµTTTËÊÊZ ƒ±¸¸˜ÖétMEEEí …"s ³WÊd# $X–åƒÁ „0Ïó⎤oiÝãñð¢(uìb¥LN»ïv»att” õ÷÷ûÍf32™MÈb± «Õê·Ûí!R³ÄɃ0ÕÕÕ49\.ï˜vÀÐ ÛlvÑjµ‰6"‹ÅŠI D|(½^ߨ¬¬lñz½àp8üSS“Ð×ÿuÓd“É$ØlÖÍoÃv°Ù­~r%ÉA{ ¼¼œ&÷§Ó‰æ\¿adø»0ñcOŒOb‡Ã‰™eV`W8X˜_BÁ@Püu½())¡}>Ì8gÐ<ã„9æ§0ÏLc×Â4ž•äþ%¸½.p.Ž£@Eí”––Òœ‡ÎË¢Ö'·áĹBÞ•“¸êa®{œU éBÖ…d(¼š…¼¡e 4úp€¡Ä@3 «kj~Ô‘‡dBþ %Î)ÇI9±XkT ‡S£ »P‰ü hÕ»HM²¸°^‡š î¸LÐÞKÁÉgcq¼2 4&§ öCÖ%%âE4…T8€ü–fÅ|hͧµŽÚÔÝM3÷ Égâ„ÜŠ£›o&@F^²VA­¢ÚÃEÑ· â›:¯Aî­(œ–/ƧÈDyz¤(OÛƒóBþõ$mp £þ½ÁV'ªT*#Ã00;;Ëõônô|yÎ÷|ì¼ÿÔøðù5ѾwàÝF¯é-ç jMÛ fÐ)õøšw-€ÔX ,ÍÊúúz@ÊÄñÓ°i”Ëå*ò/ɤuéôÔ VýL£ÑlK½%­VCÖ/w‘É|¥PÑJûþ;³û9À!^IEND®B`‚gtkwave-3.3.86/share/icons/gnome/16x16/mimetypes/gnome-mime-application-vnd.gtkwave-ae2.png0000664000175000017500000000150313166335473030670 0ustar bybellbybell‰PNG  IHDRóÿa IDAT8¥“[HQÇ55J»ìF®Šei¡&HB¹¶»³k®w% z(„ ´u /ÐKHÑ£PAI½= =T·½&šy)w]ÍËêÌŽëî™ÝUçÌ×Sb}íƒ?ß7ÎïüÏ™ï“Éþ7""""¥œ˜˜xº¾¾¾­¶¶¶¹®®Ž®©©1VUUµTTTËÊÊZ ƒ±¸¸˜ÖétMEEEí …"s ³WÊd# $X–åƒÁ „0Ïó⎤oiÝãñð¢(uìb¥LN»ïv»att” õ÷÷ûÍf32™MÈb± «Õê·Ûí!R³ÄɃ0ÕÕÕ49\.ï˜vÀÐ ÛlvÑjµ‰6"‹ÅŠI D|(½^ߨ¬¬lñz½àp8üSS“Ð×ÿuÓd“É$ØlÖÍoÃv°Ù­~r%ÉA{ ¼¼œ&÷§Ó‰æ\¿adø»0ñcOŒOb‡Ã‰™eV`W8X˜_BÁ@Püu½())¡}>Ì8gÐ<ã„9æ§0ÏLc×Â4ž•äþ%¸½.p.Ž£@Eí”––Òœ‡ÎË¢Ö'·áĹBÞ•“¸êa®{œU éBÖ…d(¼š…¼¡e 4úp€¡Ä@3 «kj~Ô‘‡dBþ %Î)ÇI9±XkT ‡S£ »P‰ü hÕ»HM²¸°^‡š î¸LÐÞKÁÉgcq¼2 4&§ öCÖ%%âE4…T8€ü–fÅ|hͧµŽÚÔÝM3÷ Égâ„ÜŠ£›o&@F^²VA­¢ÚÃEÑ· â›:¯Aî­(œ–/ƧÈDyz¤(OÛƒóBþõ$mp £þ½ÁV'ªT*#Ã00;;Ëõônô|yÎ÷|ì¼ÿÔøðù5ѾwàÝF¯é-ç jMÛ fÐ)õøšw-€ÔX ,ÍÊúúz@ÊÄñÓ°i”Ëå*ò/ɤuéôÔ VýL£ÑlK½%­VCÖ/w‘É|¥PÑJûþ;³û9À!^IEND®B`‚gtkwave-3.3.86/share/icons/gnome/16x16/mimetypes/gnome-mime-application-vnd.gtkwave-lxt.png0000664000175000017500000000150313166335473031030 0ustar bybellbybell‰PNG  IHDRóÿa IDAT8¥“[HQÇ55J»ìF®Šei¡&HB¹¶»³k®w% z(„ ´u /ÐKHÑ£PAI½= =T·½&šy)w]ÍËêÌŽëî™ÝUçÌ×Sb}íƒ?ß7ÎïüÏ™ï“Éþ7""""¥œ˜˜xº¾¾¾­¶¶¶¹®®Ž®©©1VUUµTTTËÊÊZ ƒ±¸¸˜ÖétMEEEí …"s ³WÊd# $X–åƒÁ „0Ïó⎤oiÝãñð¢(uìb¥LN»ïv»att” õ÷÷ûÍf32™MÈb± «Õê·Ûí!R³ÄɃ0ÕÕÕ49\.ï˜vÀÐ ÛlvÑjµ‰6"‹ÅŠI D|(½^ߨ¬¬lñz½àp8üSS“Ð×ÿuÓd“É$ØlÖÍoÃv°Ù­~r%ÉA{ ¼¼œ&÷§Ó‰æ\¿adø»0ñcOŒOb‡Ã‰™eV`W8X˜_BÁ@Püu½())¡}>Ì8gÐ<ã„9æ§0ÏLc×Â4ž•äþ%¸½.p.Ž£@Eí”––Òœ‡ÎË¢Ö'·áĹBÞ•“¸êa®{œU éBÖ…d(¼š…¼¡e 4úp€¡Ä@3 «kj~Ô‘‡dBþ %Î)ÇI9±XkT ‡S£ »P‰ü hÕ»HM²¸°^‡š î¸LÐÞKÁÉgcq¼2 4&§ öCÖ%%âE4…T8€ü–fÅ|hͧµŽÚÔÝM3÷ Égâ„ÜŠ£›o&@F^²VA­¢ÚÃEÑ· â›:¯Aî­(œ–/ƧÈDyz¤(OÛƒóBþõ$mp £þ½ÁV'ªT*#Ã00;;Ëõônô|yÎ÷|ì¼ÿÔøðù5ѾwàÝF¯é-ç jMÛ fÐ)õøšw-€ÔX ,ÍÊúúz@ÊÄñÓ°i”Ëå*ò/ɤuéôÔ VýL£ÑlK½%­VCÖ/w‘É|¥PÑJûþ;³û9À!^IEND®B`‚gtkwave-3.3.86/share/icons/gnome/16x16/mimetypes/gnome-mime-application-vnd.gtkwave-aet.png0000664000175000017500000000150313166335473030772 0ustar bybellbybell‰PNG  IHDRóÿa IDAT8¥“[HQÇ55J»ìF®Šei¡&HB¹¶»³k®w% z(„ ´u /ÐKHÑ£PAI½= =T·½&šy)w]ÍËêÌŽëî™ÝUçÌ×Sb}íƒ?ß7ÎïüÏ™ï“Éþ7""""¥œ˜˜xº¾¾¾­¶¶¶¹®®Ž®©©1VUUµTTTËÊÊZ ƒ±¸¸˜ÖétMEEEí …"s ³WÊd# $X–åƒÁ „0Ïó⎤oiÝãñð¢(uìb¥LN»ïv»att” õ÷÷ûÍf32™MÈb± «Õê·Ûí!R³ÄɃ0ÕÕÕ49\.ï˜vÀÐ ÛlvÑjµ‰6"‹ÅŠI D|(½^ߨ¬¬lñz½àp8üSS“Ð×ÿuÓd“É$ØlÖÍoÃv°Ù­~r%ÉA{ ¼¼œ&÷§Ó‰æ\¿adø»0ñcOŒOb‡Ã‰™eV`W8X˜_BÁ@Püu½())¡}>Ì8gÐ<ã„9æ§0ÏLc×Â4ž•äþ%¸½.p.Ž£@Eí”––Òœ‡ÎË¢Ö'·áĹBÞ•“¸êa®{œU éBÖ…d(¼š…¼¡e 4úp€¡Ä@3 «kj~Ô‘‡dBþ %Î)ÇI9±XkT ‡S£ »P‰ü hÕ»HM²¸°^‡š î¸LÐÞKÁÉgcq¼2 4&§ öCÖ%%âE4…T8€ü–fÅ|hͧµŽÚÔÝM3÷ Égâ„ÜŠ£›o&@F^²VA­¢ÚÃEÑ· â›:¯Aî­(œ–/ƧÈDyz¤(OÛƒóBþõ$mp £þ½ÁV'ªT*#Ã00;;Ëõônô|yÎ÷|ì¼ÿÔøðù5ѾwàÝF¯é-ç jMÛ fÐ)õøšw-€ÔX ,ÍÊúúz@ÊÄñÓ°i”Ëå*ò/ɤuéôÔ VýL£ÑlK½%­VCÖ/w‘É|¥PÑJûþ;³û9À!^IEND®B`‚gtkwave-3.3.86/share/icons/gnome/16x16/mimetypes/gnome-mime-application-vnd.gtkwave-lxt2.png0000664000175000017500000000150313166335473031112 0ustar bybellbybell‰PNG  IHDRóÿa IDAT8¥“[HQÇ55J»ìF®Šei¡&HB¹¶»³k®w% z(„ ´u /ÐKHÑ£PAI½= =T·½&šy)w]ÍËêÌŽëî™ÝUçÌ×Sb}íƒ?ß7ÎïüÏ™ï“Éþ7""""¥œ˜˜xº¾¾¾­¶¶¶¹®®Ž®©©1VUUµTTTËÊÊZ ƒ±¸¸˜ÖétMEEEí …"s ³WÊd# $X–åƒÁ „0Ïó⎤oiÝãñð¢(uìb¥LN»ïv»att” õ÷÷ûÍf32™MÈb± «Õê·Ûí!R³ÄɃ0ÕÕÕ49\.ï˜vÀÐ ÛlvÑjµ‰6"‹ÅŠI D|(½^ߨ¬¬lñz½àp8üSS“Ð×ÿuÓd“É$ØlÖÍoÃv°Ù­~r%ÉA{ ¼¼œ&÷§Ó‰æ\¿adø»0ñcOŒOb‡Ã‰™eV`W8X˜_BÁ@Püu½())¡}>Ì8gÐ<ã„9æ§0ÏLc×Â4ž•äþ%¸½.p.Ž£@Eí”––Òœ‡ÎË¢Ö'·áĹBÞ•“¸êa®{œU éBÖ…d(¼š…¼¡e 4úp€¡Ä@3 «kj~Ô‘‡dBþ %Î)ÇI9±XkT ‡S£ »P‰ü hÕ»HM²¸°^‡š î¸LÐÞKÁÉgcq¼2 4&§ öCÖ%%âE4…T8€ü–fÅ|hͧµŽÚÔÝM3÷ Égâ„ÜŠ£›o&@F^²VA­¢ÚÃEÑ· â›:¯Aî­(œ–/ƧÈDyz¤(OÛƒóBþõ$mp £þ½ÁV'ªT*#Ã00;;Ëõônô|yÎ÷|ì¼ÿÔøðù5ѾwàÝF¯é-ç jMÛ fÐ)õøšw-€ÔX ,ÍÊúúz@ÊÄñÓ°i”Ëå*ò/ɤuéôÔ VýL£ÑlK½%­VCÖ/w‘É|¥PÑJûþ;³û9À!^IEND®B`‚gtkwave-3.3.86/share/icons/gnome/16x16/mimetypes/Makefile.in0000664000175000017500000003724213166335473023004 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = share/icons/gnome/16x16/mimetypes DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(icondir)" DATA = $(icon_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ xdgdatadir = @XDGDATADIR@ icondir = $(xdgdatadir)/icons/gnome/16x16/mimetypes icon_DATA = \ gnome-mime-application-vnd.gtkwave-ae2.png gnome-mime-application-vnd.gtkwave-aet.png \ gnome-mime-application-vnd.gtkwave-evcd.png gnome-mime-application-vnd.gtkwave-fst.png \ gnome-mime-application-vnd.gtkwave-ghw.png gnome-mime-application-vnd.gtkwave-gtkw.png \ gnome-mime-application-vnd.gtkwave-lx2.png gnome-mime-application-vnd.gtkwave-lxt2.png \ gnome-mime-application-vnd.gtkwave-lxt.png gnome-mime-application-vnd.gtkwave-vcd.png \ gnome-mime-application-vnd.gtkwave-vzt.png gtkwave.png EXTRA_DIST = \ gnome-mime-application-vnd.gtkwave-ae2.png gnome-mime-application-vnd.gtkwave-aet.png \ gnome-mime-application-vnd.gtkwave-evcd.png gnome-mime-application-vnd.gtkwave-fst.png \ gnome-mime-application-vnd.gtkwave-ghw.png gnome-mime-application-vnd.gtkwave-gtkw.png \ gnome-mime-application-vnd.gtkwave-lx2.png gnome-mime-application-vnd.gtkwave-lxt2.png \ gnome-mime-application-vnd.gtkwave-lxt.png gnome-mime-application-vnd.gtkwave-vcd.png \ gnome-mime-application-vnd.gtkwave-vzt.png gtkwave.png all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign share/icons/gnome/16x16/mimetypes/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign share/icons/gnome/16x16/mimetypes/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-iconDATA: $(icon_DATA) @$(NORMAL_INSTALL) @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(icondir)'"; \ $(MKDIR_P) "$(DESTDIR)$(icondir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icondir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icondir)" || exit $$?; \ done uninstall-iconDATA: @$(NORMAL_UNINSTALL) @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(icondir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(icondir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-iconDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-iconDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-iconDATA \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am \ uninstall-iconDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/share/icons/gnome/16x16/mimetypes/gnome-mime-application-vnd.gtkwave-fst.png0000664000175000017500000000150313166335473031015 0ustar bybellbybell‰PNG  IHDRóÿa IDAT8¥“[HQÇ55J»ìF®Šei¡&HB¹¶»³k®w% z(„ ´u /ÐKHÑ£PAI½= =T·½&šy)w]ÍËêÌŽëî™ÝUçÌ×Sb}íƒ?ß7ÎïüÏ™ï“Éþ7""""¥œ˜˜xº¾¾¾­¶¶¶¹®®Ž®©©1VUUµTTTËÊÊZ ƒ±¸¸˜ÖétMEEEí …"s ³WÊd# $X–åƒÁ „0Ïó⎤oiÝãñð¢(uìb¥LN»ïv»att” õ÷÷ûÍf32™MÈb± «Õê·Ûí!R³ÄɃ0ÕÕÕ49\.ï˜vÀÐ ÛlvÑjµ‰6"‹ÅŠI D|(½^ߨ¬¬lñz½àp8üSS“Ð×ÿuÓd“É$ØlÖÍoÃv°Ù­~r%ÉA{ ¼¼œ&÷§Ó‰æ\¿adø»0ñcOŒOb‡Ã‰™eV`W8X˜_BÁ@Püu½())¡}>Ì8gÐ<ã„9æ§0ÏLc×Â4ž•äþ%¸½.p.Ž£@Eí”––Òœ‡ÎË¢Ö'·áĹBÞ•“¸êa®{œU éBÖ…d(¼š…¼¡e 4úp€¡Ä@3 «kj~Ô‘‡dBþ %Î)ÇI9±XkT ‡S£ »P‰ü hÕ»HM²¸°^‡š î¸LÐÞKÁÉgcq¼2 4&§ öCÖ%%âE4…T8€ü–fÅ|hͧµŽÚÔÝM3÷ Égâ„ÜŠ£›o&@F^²VA­¢ÚÃEÑ· â›:¯Aî­(œ–/ƧÈDyz¤(OÛƒóBþõ$mp £þ½ÁV'ªT*#Ã00;;Ëõônô|yÎ÷|ì¼ÿÔøðù5ѾwàÝF¯é-ç jMÛ fÐ)õøšw-€ÔX ,ÍÊúúz@ÊÄñÓ°i”Ëå*ò/ɤuéôÔ VýL£ÑlK½%­VCÖ/w‘É|¥PÑJûþ;³û9À!^IEND®B`‚gtkwave-3.3.86/share/icons/gnome/16x16/mimetypes/gnome-mime-application-vnd.gtkwave-gtkw.png0000664000175000017500000000157213166335473031203 0ustar bybellbybell‰PNG  IHDRóÿaAIDAT8¥“mLSWÇ$à&Ó¤EfN2Pç·8ßÈŒ,ÅÞö¶ô…–×0|š˜°$¸M‰(Ÿð‹L܇%N]pÆý f³i¹½eSƤt¶”W;{oi{Ï¥TιÏîeJÒÏ>É“ÿÉ“œßù?çœG¥zÛÈÉÉY¥¨V«ÝÖÔÔÔ]__¢¡¡¡³¦¦¦ÝéttØíöv«ÕÚQUUÕn6›; ÃqMwk4šO–ùùùï(ÚØØè9b±˜˜N§!DDQ”Þ¤ D©ó<¿€ Guõ¹7€ÕŠÖÖÖvD£QáFGGÝn·À0 b†ÏçC>–†‡ý‹Œåxžš¦Og9¨««ë’OH$">¯ÇKüþa‰eý’_N–e ãóÓ?ØW‡ïNul)Ö~¸p:®DbB¡Àc÷ïKCŒ{<ÌÈêóc–q/# ‰/O Õ\Ùºp8.¹‡Ãh*2 Oÿü ý=NÆžyIqÿâhœÀ‹ñ_Eán9´4Õ\Zn!//o`³Ù\©T &Âh&†éXOÇþ!áÙyÉÉÈÔ^˜¹sW×£è³;@›«Ïfìv›‹çâOp¨»ÿ|´w-Þc.#-}Ÿ’/m#·oéðèÅ5`4oFdÀDÑÙ«Í*·ÀÁ|2ŽNžo†µ h~Ÿ”Ø È•žR¸RˆËv¾ë>@Bzôé²K•knv)?×êRÞ´„ܼ¸‹<ø¾€ìk-Â¥ïÂgI04žÉ˜L&÷’‡ÔB\h?Ûꪥއñå _ã­ ïvnZ:Ð\[v ‰Ì,T~Ee;0ÒÆ®x|Ä´ žì;»ÛrÉö ”«QIE[WIê’\Rþí:ØÿÍF1™Žm4­8Xþ‰:®CyÆÉÉIîñÓÁÅ_ý(ܼÿüíg4ðà*ºýðšpÏ{cqpè:'¤@é©ÓYd@—$IL$E òšHÙA”YÉd2¢¢Fãë;§1WQµZý¹Åbé—'®‡6/P}/EéÏSê¥ô½¥Ô{äéì/,,üBÙ÷ÆòB'P5ÑIEND®B`‚gtkwave-3.3.86/share/icons/gnome/16x16/mimetypes/gnome-mime-application-vnd.gtkwave-vcd.png0000664000175000017500000000150313166335473030775 0ustar bybellbybell‰PNG  IHDRóÿa IDAT8¥“[HQÇ55J»ìF®Šei¡&HB¹¶»³k®w% z(„ ´u /ÐKHÑ£PAI½= =T·½&šy)w]ÍËêÌŽëî™ÝUçÌ×Sb}íƒ?ß7ÎïüÏ™ï“Éþ7""""¥œ˜˜xº¾¾¾­¶¶¶¹®®Ž®©©1VUUµTTTËÊÊZ ƒ±¸¸˜ÖétMEEEí …"s ³WÊd# $X–åƒÁ „0Ïó⎤oiÝãñð¢(uìb¥LN»ïv»att” õ÷÷ûÍf32™MÈb± «Õê·Ûí!R³ÄɃ0ÕÕÕ49\.ï˜vÀÐ ÛlvÑjµ‰6"‹ÅŠI D|(½^ߨ¬¬lñz½àp8üSS“Ð×ÿuÓd“É$ØlÖÍoÃv°Ù­~r%ÉA{ ¼¼œ&÷§Ó‰æ\¿adø»0ñcOŒOb‡Ã‰™eV`W8X˜_BÁ@Püu½())¡}>Ì8gÐ<ã„9æ§0ÏLc×Â4ž•äþ%¸½.p.Ž£@Eí”––Òœ‡ÎË¢Ö'·áĹBÞ•“¸êa®{œU éBÖ…d(¼š…¼¡e 4úp€¡Ä@3 «kj~Ô‘‡dBþ %Î)ÇI9±XkT ‡S£ »P‰ü hÕ»HM²¸°^‡š î¸LÐÞKÁÉgcq¼2 4&§ öCÖ%%âE4…T8€ü–fÅ|hͧµŽÚÔÝM3÷ Égâ„ÜŠ£›o&@F^²VA­¢ÚÃEÑ· â›:¯Aî­(œ–/ƧÈDyz¤(OÛƒóBþõ$mp £þ½ÁV'ªT*#Ã00;;Ëõônô|yÎ÷|ì¼ÿÔøðù5ѾwàÝF¯é-ç jMÛ fÐ)õøšw-€ÔX ,ÍÊúúz@ÊÄñÓ°i”Ëå*ò/ɤuéôÔ VýL£ÑlK½%­VCÖ/w‘É|¥PÑJûþ;³û9À!^IEND®B`‚gtkwave-3.3.86/share/icons/gnome/16x16/Makefile.in0000664000175000017500000004523713166335473020773 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = share/icons/gnome/16x16 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = mimetypes all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign share/icons/gnome/16x16/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign share/icons/gnome/16x16/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-tags distdir dvi dvi-am \ html html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/share/icons/gtkwave_256x256x32.png0000664000175000017500000002434313166335473020563 0ustar bybellbybell‰PNG  IHDR\r¨f IDATxœíçcÕ¶ÀIïôžÞ R”b€ÐKéˆBOHB Ui"¢^¹6슠¢*‚®Âµ\¹^¹ïÝk½ï½ÿ`½Yƒ)§¬s2söœ™õá÷íœ9{ÏìùÙ{Ö^«×ù? ïýëMyÿßjË©Ê9Í8ç~ÒžŸg›|ü˳ÐëÌ¿éíÕ”·þ½Ï­xûÇýnÍ;?`»¼ÿó#,#Ýü²ã^¸D²oh³Üü,ÆQX€ìÁĸš @ö m†›_ö bÜM û†f0ŒmXn|óË<Œû£™dßÐ|ó3Œ}4€ìÚÈ7¿ìà S @öÍÌ`dÃp3dÆX¨.Ù7µQo~ÙÅÝ9ýó}.Cv_Y|ó›WÞìî.‡püê.xôý&+¬ké}uÆ-ã aú–JR¿&¯(‡›†èžþà ¡Fi+¥OÓ7UÂÍc ¥·™BõÌRŸæìê #f”HkçÍÕ%ðà[kÕÀÞV€—·—4òƒ ze¢]F4$ŠÏÊl+•Ð?4?–Ô¯â1‘ÒÛKÁ7À[´•Ò§sb!8ÒWz›)$ÒÆß°ú©ã/08v?[¯žo€^½zI#.'F¬H°Ë°eñâ³2ÛJ%(ÒnžCêWá¨éí¥àåã…#ÃI}0;¼¤·™B|müݺ$NþÒÚéçï »Ž-aÈ0X,µa°¤Â`h €  @uX,µa°¤Â`h € ÷¿”>`(°Xjƒà8€4Xúe/ @2,€ÚX€5 °$Ã`¨5X’ @2,€ÚØ@W 8¼Hæ`°dbt ÀÅ„ÆúÀâs¡å³AëÅØò×2Øúµ}6].½ñ==Óúy lVÚJéö?ßþÝúãyà¬O!Mȹ_¥ `  Ç¤”Á¶ïÊa÷?+ ´}]IEÒ¯“%L-L¥Åè½ ÿŒhé7™žÙù}Ütgoèå!ÿzu…Àè87¾}Ošô›LïLÚšÞ¾Ò¯WWX,€í oäK¿ÁôÎ’Wr!¸·ôëÕÓ  =›.  g$*s[\“}ƒé–OK ¡@ë,@¨˜»~ƒé¶oÊ¡lR”ôëÕ Ài<<{Áí{yþO%9®%Y¬™È¾n1¥:Ô`8O`¸,;‘'ýærîúsEyK¿na°œç´­Ÿ•H¿±Ü…5ïBl¶¼›È¦@×’Z,ç)«‰‚íW9ˆ .–ÕWè3 €à45ÛRxÐvþ£ªW'ˆµÙ×®S ÀRQM€søxŠøÙ7•»1óp&ø‡èg_€i`­ª. À9búøCãù"é7”»±â­|ˆLñ“~ýÚa°œ¢d\´}]Fô ¿éJ lºÜÖ‹ÅÐøA‘þQd×úy±Å>l¾R*ï)çbÓ¥[&ýúµÃ`8ÅèÆDqcSýúŠaÆ¡ ˜~0½£Ö&BÞ°pÝS02B´ÕRf΀õ“ÎÅö«0tqœn6™BÖn~€sxy{Àü'²`×5û~×µ Xô|T¯´Ü/#$©^•H_QÎÙûÒÁÇßSzŸ Àa"“|aÝ9Úü0mºÕ~A#¹M?˜A¢X8U ’¨ÈîÂ`8LÎPØúWÚüãƬO2¶&nIñþ”s²ñËRH-–Þ'„Àp|‡=¤6޼èÕüI±ÕÇ# `tS’Xë J±ÿÌhé}B /[7? À¹½¨»u/çÙì—QP½*áú¾ÒºH%LÝ• ž^ò7±Xs×U§ h¯ÿ”§„é‡2L!\˜ýp&ìúöd„ITô(Ôаwó³'µ"Hdò¥ ò¶oË`âæs@aòÎTØö7Ú:ÀÖoÊ!2ÅWz¿ +€³ÿ~ 28ÿ¯¼=Šüø;G®I4p¿?uw$î¡(PŽ';€À ƒñÿS”9ÊG–¼š+Í"Œh8•OäøÉÒ×X,2!1>P÷-àçÿséc·_Fr÷“YäÉEÏå€o€Ü€  €LRq 9ä+äLÝj:LÛ—Û¾%Æü¥Tz@ €@ €”ÕDÂö¿ÓßÿµdTLØ”,Ê‚‘¦IÊT!{H¨Ô~±X$¼ý9)m¥ô ƒŸ¨ÅRqºpóÜyão&müáP‰ã¯ïÔ8tZz¯ŽvšœdÀâê6–ÄÆW\²Û, ¬¸ñ5 B,Ên³Þµ:ü€ Œs_øly^»òí|½ÎþüߨŒnL)À©ç«ö™émÖ;,™'M"¬y—ÿ,x:[ÅÈn·,p÷#¥áÞ \ ”Ýn=þÚÚô%-þ»2÷v€igV¦LÄW¦”éÂO™(°$2í@š¸±)ƒƒ[09†ì6Ëk&l!&MÁ D·ï¡-šš€D0¼•ú8»öÝBÓh?ÈèŒmN‚¦iQ“øÊpþŸ³¥·Yϰd¡ÌgWŸ¡Ïÿñ8Ïg¯/œ.}V8åºâ­ñÙíÖ+,IŒiJ"ïÿÇM0ö€˜‰9Ê$—NÃÐéq­¼` €$n»'Mä²§ bœóâÜWv›õBÍöTú¹û 7Oñ:€5P_Æp5w¥Ïÿ1)& ‘Ýf½€›¡6\¤aÕÜÇìoŸ6+í8óËA€+¡æÿÃmõ¯äò<¶ ±ü ÚùCÉâ*Êþ 3ÒQö$ÀP Ü͇uï¨+ÙsþDÛd&æÉ"/ 6}X$Ö\d·Yt€- °T¢¦-…Ì‚I00]˜ì6ëšm©ä)Ô–+eâó²Û¬G, ÀšÀýgë`ÈÂ8iÜZO> ·.‰wiÛf=”)J{Q/nÂ-£ø=,~‰»Ç(}¶Ôµ}ršEq"'¥OØw<âú*× +“ÖÙb‰1—Ž¿%Äñ× Œ¿:y翪.<×]–$à_1™þÒÈJTøYWµ+.;f=˜A¾êšûhŸßM. ‚Áµ´­³•·õ–zþÉç#'*§F‘ú4èîXH* ß‹Íò‡yÓ¦8ºc:Äôq]¿°Ì¥OUЍ]9þº’˜û_³,€®àŒ@*àè KOÐYvü½\ úöïEzÃÍóbHý2ZF dÀìû½è‡G/ñô@ÀT˜}ÉUýr§Œ@÷<·Ôª:ÂP˜ ò£+nÊrã»,€PÈèB.Òt¡Hd_rU¿Œ(€~}ŒÐSJ'E’ƒXV)„è?²Û²: 8ÊÖD+§ŽëÙƒB\–'À°8Ø1 ‡Rè?3ï±>àéõÇ÷Yàíç!ª¨¯‡,ŠOo× a°ºê%’zR+Îm‡-ïô}@g`I5ÌL]˜þ@ºXƒqE¿X,€nàÊ5ÎE)ƒuëWe5¨sn{@g XãýISªÓ™ìšÂ¡,@7 G…““Y4~P¤ Ö΋V,€îÀW{ˆU•Q¤÷ vI¿X,€N`±Ê*å·¨yíÅk+ßÎóU@w†{Cí3´º ¸®ÒoFo—e°:wæá ò‚ÕðñÝŽÁè./o‘%ˆ|ûÞ4QYë~±Xèî+ߦí`¯¬†„u;  »ò©Q°õkZ<f sAáP  X¬rÃ%Z.öNï´Â°,,­E­®ŒÉU±³Öýb°þÀ£—ˆá§-Pæ´~ÁÝ: À²°àâiVpª€Õ˜µb°n€ïž±¦uþÁB€ÚaX€¿'LÜ’L^À­ÁZ±X7Oð%g²Å·…£ÃÅSC×ã°, ÿÍÌŽ&×X¨Sž0(KË~±X7H­&WÞp±T KÇaX’90DT¦œc\/À ,-ûÅ`Ü`àÜò®µ…ÏåˆÝÒqXÖæÀS& -¯íùa°Ì3y;=}–ÿÂM.–ŽÅ°.¿`O¸c/}eü†dMûÅ`0R­îÅ\òÀ¬˜žž–Ű.Œî²0–iY÷Rn·HK5a°®„ÜòÜ÷ $ZGͰ.$kp(l¾BÛkÑüI Dgjwã±X‚òšHòüóׇD[žÿ#,ÛOô…5ï’Î5^ñ¶E£~±XàááãZ’hûÕ¯UÂ÷eØ|,eØ€o'Ìy”šo¡F­IÔ¬_,€HB¹ðYZ„Î]-ˆI.¬`[¸€Ÿ#-¸*Ÿ©=–c1ÞB X,‰ñ!ïÿßúu¤Ù٫ΰ-$·* ¶‚š?.†°8m„°XÐç–rºªÕg !"Ñö`dØ®l¸D[tÅ!–v]ª ÀäÀðÔ[ëãè @d‰˜v[ÇdØæ ‡]_CÅi2 `˜\8ÿ¿‹X¹÷ÿcñO{ÇdØŠwü†$ØIxòµ‚¹]2/« ÀäŠð†æOh{ÔñÝ5&·´{L€] e¢öm`íû…aýÕ«³°L.€”Ò rTÂXBX4ÄfûÃæË´ä+[®”BJ™ú‰BYfÖ­[G€ÈÝOd?a{* €&ÜKAM¿†’î?#ÚæëWg`˜X¸˜7ûáLòBÔøÖdR†MÈ”]ôASw§Ú]€u€‰€)ªVŸ¡ýáûÿò)Q¤ã²è¸iZo!WÊ5¨5WÔT³_, ¥4Ú¾¡aqKj’J]˜(”Z…¹å“Õ…²L,€[æÇÀ.âàÂg³!ˆøïà À/È V¼EOÃŽÛ°ÕLÊ0©p@ß±/„Q‚Sv¦’+Õ°èÀE½;ö§“×°¸ˆ·Šë,“ ãÿ—¼BK‚ïªÌŠ&›@‚©Ø¨™˜ðMLŠñ,“ ¥,Z/ÒbѱHÎU©Çf8&€´~Á°‘¸€ÅX Ô[`˜TýîìMN²ìdžxc@=6 À1`:ö†SÄ·1_•Añ¸Õö°L(œwÖ´¥#§Ý—.ö PÏpLX…Z×c†7$ˆö¨Ñ/€ €7èÂcôUƒæÇ8||]"Qè¢8ò:ÀœG2:¾-X&@ba (ìI[¬phþ°’=8”œ”s2¨•(”`B”Lˆ$¶uçŠ $Ú±2Õ,Ç€74ÞØ”k²éËRȦN‚ã àG€5ƬOA%´ÇÍ>ÇŸ³~~Þã´D¡¸v3x¡í¼ŒT ,€‡X–Nd',xŠ–¼ Öáß`8.<>^cêu™y8|zÄ0™zgøÃÚ÷hšHj¹có„à¸0¼· :\¬¹P®ËªÓ"˜«§ýr'ÜûÜ28ûëýê ààÛõP:1RýfD“.Àˆ†è?=ºÇ¿W½&Ú¾¥½ÿÇ8~Nü&Æ«WÕÇ‘ú…)Æež*e5Q0èîXâÍS¢þ y_V2Ãu²'€Ž`X3É4LûgÙ¡Ìÿ±|µì6›•ùOd‘wj¶~VÕ«Œÿ¤F@»XsKâþ|Ç\³=Uz›ÍÊm÷¦‰5Òb­" 3¬ÕP€œgt¦ú÷ÕeRÐ^ÏŒO ²ÛmVƵ&“³5íºV3È”Þf­qH¿atD¼_&æÿC–Ìk²ÛmVªW%Àš³…´„­Šê^Ê’—Ýn-aô€1MIbUŸôH©ÌÿÍa¦Wje“×0OàèuÆ6  LjKózÚü¿nß“&½ÍfgÚtØöqÍæë2˜°ÉØë,€0ýþ ñΘ2˜Z>-† &XTÒ;·¤ˆlÌÔ·6wÞ—!½ÍZ¢™î?[CÇI£ª>ž|ð³ŽÿÖº8Xø,-ÿ‚±Ãÿ®¿‰Ç ô ·9Ë<ÿd”>a[)}¤xzò{ø[kˆû60f`ÁÓÙNý&yü587þÔbØÒDxè pàär‘g]yÃh{̇/OP>æðñÓú+7u>íŸäïbõsö¤Oé7‹Œ5”~aqL™çŸJRIôUÚJé&QI« îñoNÞ‘BÞ°ø…\ÈèâøøNÖƋ4d²ÎZy˜r¯.S_û^\)5Ñ„Ö Az§ù‰E"Ê ÂGÎܪžçšã„ Ž'±DáèrìÆÊw !*ÕÏáßpÇ„ ,ÈJDX*\l³,u€×»ùcZ~¬,”uK¨Ã¿Á0¸F®J$Ïÿg=”¡=¸,uàì%r2P®¦Ã5G+³ ,/oXðT6m! +Î(¿ãéÝóŠ3,u€73¾Þ£.NÛŸ&ª 9ò¦À~ ,ÁÖ½O›ÿ·}SEcÔ¹YêÁ:€Ô'¸ú㹞èëÐñY@Ö zµÜ)ˆƒÕè @=Ädú‹B ”kØòY‰xãÈñYf§ÅÐ^Êà©}&üBÔ´,õ€ÇÁXÒSÜ·åâ¼;r|S àí÷Zsþ”IJ,JpšZgYê ×dpk6ugÊÎT±öC=> À À(v”†’–MŽR­O,õ€ •·E‘×ð­ApooòñY@z¿`òÜqó•2èîx‰5Xê ‰Éò''iþ´‹ÉÇfTgGÃö«´A³êðöëy¹vXê Ï'æ ¤½Í)‡ò)ô§9€€˜VŠ´ðZ%ܱ?Ýá{– žPÎwH' sàzއ'mÀ´À›ß¨À²§ hF™ÿc}85ûÄPWX|àœhr¦à…DzÁŸøF‡`@Äç÷’ã#cb}ÎH ®z)Og)¥Aä!ÍŸCTmM‡`0à£|É„Hr ¦ Åà¤Þüa¨,…XXGÜÕ¹]EÎÐ0!{ÇeLÞ¾bO?5ðÌ3Uï @}à:ÀÜGi•ľކ1u°w\€Á€K€“æÿ?T(sKÇ"Ç(°Ôþ›c–¥ÄÈN,ç`ÿÉŽ`0ÄfûCãyÚ£"¾ÿÇxµûÄÐ@ ˜½gë×´uœÚGûØ=¦)Ð~óQù#Â`ë7´ @8§ ! Gah#LÖ‚76õu`aq—` x)óü,e€ X-Hýÿ]ah#ÿP/˜÷xùúZkw€` à ›ý§LòBfº¥,9 @àµ×’L.‚©ÂíEx² $Œç_ù6-‹I`–a-úÄÐFHÅÔ(ØB,òÒpª‚¢lo bH˜Ñ—ºsÎG«”¤+,í€)Û©‹¼˜SjÛ: À ðôò€Áµ±°‹øx8÷Hr¸¨£°´@p´·õ¥®ô›n;ÌÛtèxóI͇›z¨+«•¤+,í€ ½˜ „Z0ä¶{ÒÄŸƒµã± "€ð_r ¬P<6\Õ€ah'dÀìhñxO¹ÖKçÙ\`D™C`Ã%Úü+á†!­úÄÐV©åA"ñåZoº\ I6„° ü'ï?+š¼¨öXŽÝÕážÀÐVø´WÿjéZã+C|s`íX¦@×›ß(ÀÁ9™˜8Áb>þêîì @[`Œÿ4âzæ¨Ù–jõX,[ôùÿÎTBéÄHM€Úah+ä–ù1Êm îå\«ía@ø®wÃÅÒ`hý¼’K‚4í @{dô›¹(×¼éÃbHÈ·¼À0€Êj"EÒªð‰<‰QPGXÚ ×0˜‹rÍ1ë–³t€0a3­€$2õž4ðQ1°%XÚ ‹€âf.êBà¸Ö$‹Ça¸¹<½{Á²“´ù?`PObÆXgah/|óSUGKzízé7 •ƒYn.€ðx_Ø|™öþ …¦÷U?HWXÚ Áâ¯ÔÚkß³¼÷Ã4°tóAÕáä÷ÿ8´žÿ#,×…nú‚Zý©òªºïþd¸±ð1pl+-(>*Îy$“\0¢'°\#L[û4mcþIT¯Jèv € ³ùÔ½H+É$‡/ï>´€à`,ÇèFúÀÜÇútËÅpcFx‹XoÒüÿ«2Èî’>±\#¤`T89CЪӅbÚÐñû,7@öPršèµïBTªz€mÁppO5S0þ `QÇï³ÜTøø7|y¼òhg_»~ ä­Ñþÿnƒ’à2à8Xú}cÐÀ¹1ÖÜJϳn|Ï7ÀfAð)ÁZ ˆ°\'dâ–Ò8À?‚Û÷¤‰¤"íßu7¼ûÛ!ªÌåðµå·}SÅã]w£±\+€òÉQ°ý;ÚTpÙ‰<îýÇVpÀK+EêdYàFª•϶/{p(l%f‡]ÿQ$¹¬O¡q¾dzþ©`Éõ¢1¤>a¹5¬Ê㪶aÂj2¬Ö7øïÑÆ_•"€„Âiç?(Ìö¼x]ö$ÐMÖn~ä¾7–AŸ›C¤Q26¨°Ø#~V|ï–å±/™¼¸úL(ÿ^®êSÞð0º8Žøo-õüSAá˜MêÓEq"èÆUmÃkÛH¬ŒÛÁ1 ë–ëß-HøtcüI oh$ÜÿÖrõpèÝ:¨ª—žXÊh¿øŠ ðQŽrÁñ1~¶j© û´ôzIb[ž õü;¶•*k×¶+–$Ž…Å/äÞ8ïÎŒ?ŒXžŸÿC¶$à˜Þ«#Ÿ½0~C2´sÂá \,”ÝfF[0ȇÐt¡H”—ÝfGµ:¾À`ªg¬ìC[,‡);R¥·™ÑxLÜ›&®5eLl¹R5ÛS¤·ÙXÀÚïÔ @-Ÿ–ÀØõîe{ÆqÆ·*O…ŸÑ²Bá‡2¤·Ù, Àš -,èY}(ñßÖ ¨^)¿ÝŒ¶ŒZ› oÒòB\_ÈcIv»Éýc\«ÃRkÄ#¸Pv›íAÉÏ"[T}¦Œ ÇD²ÛM…ð;“•ù<5䎫"]¸ì63®áÎûÒa±bæÀBÙm¦ÂøY÷íWióÌ<¶Å},ÏôŒ‰›S`ã%Ú:®!M;.½ÍT¬ À’ +|Ì[òJ-œÎ ÝižÇô |¤_uº€<=Ä b#Üd}ˆ€¸)I™»Ñ"¾»Žöá@Q½:je“ÿ VŸ-t›?[è*à çl›¾¤Å|cP¦—ÝfƵÌx C¬ýPÆî p—)" /î¡ òüã¥b °ì63®eÒÖr¢ÐíWËáö½îñ'ÁPå=—#B{Iwg Å»aéíf\Êœ&ž£Mqª0ÿ‰,ém¦`zŒ\“(võQçÿ åðüß„àœ‹RÇɪw ¤·™‚=t”€cÛ__©•ÁÒ(MÛŽ9®5™<ÿÇmÂæDCj_9}Ê CѶc-ÐSŸžIDAT¥"™çŸJz¿è?ƒ¸¸6NlÙ–ÕVÜùI ß|¹Œ„;q¬ÊêSŸápðM € A0U²,âóh p³õ¢6\,€Êê¡&Á$2Ï?ŸO("Ê3aV$Ymu¤Z4®)MÝm jI<ÄçHëS@°ìyÁ غù…Ü!%†yþ9‹üz§Vyü÷ Ò¶¨-8%˜kS‚uÅ?Ä Þ Ö‹¬„yGì¯è)%˜= N#W'ÀŠS´ù?¾þ›°)YT ’Õ'€\à?æm{ÒÈ…CW¼™ÏEcÖ'‰w¶àžpLÝ$³O,¹è¥Èÿ¦éѰã{â¾€/Kí±4‚"€Im)"—iþÿI±2W ”Ú'€d(¤–‘«Fã:ư$@À,bþdñK¹Ò>Ë€ _aÞ°Ž°ó‡ ˜ù ímã,°'ÌàJMøˆAB¸ý×ÓË5€¬Á/sARŽë_ÍcÍÝ€Jc“Äc=uþi¶e<€>€éÉ©©ã›>,‚Ñ묯°4žpж¿Ñs0'\F¿`é `-ƒ-Äâ1[þZf3Aˆ; àÂ7Žf¦Ïÿ—σðD_é „Æù@ãyÚ:™ÙJÊЛX™@®üŠs½;ö¥ƒ¿¼ vXúVÆÍ>Ô?EÏç@õ*ËÓ€FØÆh7€nÿ®\”ãê%1¨€>€`…&ªÖœ-°º/€ ¶€ïf©s8 æÈ*}À!,ý wXy iÃ¥˜°Ùò: @#l `æärO+NåCd²Ÿô‡°ô#Ôx€íŠ(¦´œ(”ÐuGy‹lCÅŠ­’΂+¯¸wßëÞ/"¿ÇÅ`!,a-{À‰sÃа´ö‚§³ÉëHkÎZ‹ žÊ†IÊXíÉX¼ òG„C`„ãjú€2ÇŽÉò‡YfBëg%¢ÌuŽ¥ø”€ !enê @?À11º)QúEðMÆ´LÛŸQi~­WéCJƒ#Sý`ñó9ä ,®€r«Â¤6€þ€à¿.5—„kþ°*áî'³ 4Ö‡Ü]“B`¸$u^î*Öx=ˆìÖ @_Àu&#²ÇiW àô™¶® Dgú‹Å6Ù'¯+8ÇóÕÏ€cèKÊõXølŽôqÚÌGN[. ª(A~¥âJÆ6'IßÄЯ¼}=`ÂÆdéã´+ø@ ]—.×ÅK?i]Á•Ûe`Êd,ý ÿ¼J&DênêŠ ®u`ˆí„Íú³hÛ×åºyÿÏЧ¤â è#{¼v+QÚ¯ LÜ¢?,=|åÇÿw„ ?àŠ;u_‰+·ÁM€`˜§ã7¥(xú™ÿ#,ý À[ù›¼#Uúxí QÚ/]PQ<.BÔS“}ÒÚÁ @¥£¤®®°ô'\$î7½·ô1Û‰k•90„Ô~§`ïæwô5 ¾O]÷½<·Ö`2ÇÞiúšÿ#,ý I­Ac²Çm;ë?*c…Òv]×0m’¬è嫯Ç„ O`‚•oÓëKj F&b 3êôU@¢Óýañ 9º­Äraz›ÿ#,} ÿ,p uƒ™f7¿2®}&B´ÖBøN5c@Üýd6l¸T*ƒPN£¢n#›×t#ÄÓ«D¦øÁMÓzøÖ$˜²#ÕifÎi¿ír"OälÿÞÄÍ)Ÿ }PY‚ O I%APÓ–rcáeü-}-WŒÕžŒu¬pU15"’|…Œi·® &¤â +®—gÆÏÊ@Xú@WâóhãÏ-‚°äÀ`¨ €  @X,™°XªÃ`¨ €  @X,™°XªÃ`¨ €  @X,™°XªÃ`¨ô„ ZÁ`È„ÀP @m4À}¯¬† ài¤—FÀ˜µ©vµ*ÒÊ" ($@÷D§íµ‰¤~ULŠ•Þ^ ¡‘P11–Ô§!w'BTB°ô6SH¯'õidC ¤—…Kkgdtì{©A}<õɸkíDuXç8KvN„æg&ÙçéI°dÇ$˜¯|GÐèj&‘Y¸i4-Çjì²êpÅcÜí,M5N±ÀµÍ5°Zik볓íÒtt2,Úhç˜ë'ë‚e÷ØïÒòÌdXº»‡¿G8ÏÖXÔ:žù¬M}¼ù_{á•ow©Â«sœãWwÁ‰hàg_ýÛnÁñï\Í=ðÚU'þ~œ¼¶›Ä‰ì¶rœ{•㸖“ßï±Éë×î…7þ‹À?íëä÷{áõÈçk{áÍÿÞC?ëìï`íŸç^9ÆéŸª/5yç§.åôÏ÷¹”3¿t)g½ß¥P—š¼÷ŸLƒ+Ï+ €à0“X, €À`˜M®>§, @G°X,KÀ4pµX,½#ã|²Xn%Ù7) € K˜å)@öMÊ`°X, @Æ€5ªdKÓÀÕ`°ÜB¿aEf€% ë<žG\úéuøôǗ᳟^q˜Ï~Õ).þ|.þâ:.ýò\úÕqþòë çùÍ9¾øí¤S|ùŸ×ãÞpŠË=áßtš+ÿ‡œ2=9'¯ÃWÿ{þ±ãf­Áj¦†IEND®B`‚gtkwave-3.3.86/share/icons/Makefile.am0000664000175000017500000000045113166335473017055 0ustar bybellbybell## -*- makefile -*- ## SUBDIRS= gnome hicolor xdgdatadir=@XDGDATADIR@ icondir=$(xdgdatadir)/icons icon_DATA = gtkwave_256x256x32.png gtkwave_files_256x256x32.png gtkwave_savefiles_256x256x32.png EXTRA_DIST = gtkwave_256x256x32.png gtkwave_files_256x256x32.png gtkwave_savefiles_256x256x32.png gtkwave-3.3.86/share/icons/gtkwave_savefiles_256x256x32.png0000664000175000017500000012066613166335473022631 0ustar bybellbybell‰PNG  IHDR\r¨f IDATxœì]|ÅÖ'„€ˆ ÒT°ë{êõ½OìÅ(MP@@zï5„Þ±a§Z¤„Þ{“@J’›{Ó{„É=ßœÙÝÙÙÙ½÷PÑ»¿ßÉl™-Ù»çþçÌ™™råü‹ñ/þÅ¿øÿâ_ü‹ñ/þÅ¿øÿâ_ü‹ñ/þÅ¿øÿâ_ü‹ñ/þÅ¿øÿâ_ü‹ñ/þÅ¿øÿâ_ü‹ñ/þÅ¿øÿâ_ü‹ñ/þår–€è‚ÿº_þ¶â_¼X˜"øÿòw[ü@`·ðŠT>$$¤Bppp¨_.O‚P‚‚BƒQØ>uK¿\ŽÒ20P/•õ@n=( ËrºòûA@\˜ò“E¾Ëàòöóøÿr¥ü¶‰°oÛÜB_AÊ|I¸^·nÝÿ¾ýöÛÓzõêÕ»wï¨>}úheß¾}iÙ¯_?­¥ÿþ0`~eàÀ†cì8.]¼7¿Îž…•øŒ¼àó3éÙ³'•=zh%J÷îÝ5éÖ­›AºvíJ¥K—.ùðÃ5éܹ3'¢:wêÕ©SG"¢:vìHåƒ>à¤CTRvèОH‡¨öíÛ+Ò®-Û‘åý÷ß×ä½÷Þã¤mTÛ¶mˆ´jÓ¦ ‘w©¼û®"­[·6H«V­HÙŠ–­Zµ Ò2ªeKRiÙ¢ET *Í£š7GyG+ßyçm"ïD‘ï@“fÍšiÒ´iSMš4i¢É[o½õæ›ojòÆoh%Ê믿®•¯½ö)_#ecM7~•Hã¨W_}U•W¨¼ò J#M5By™ÊË/¿Dä娗^z‰Éº_|q Ù¿ñ¿ÿýïÜš5k> ¿mò‡ðßý?za–é(–Õ«W¿‡(ÅÚ/¿ü²dáÂ…0oÞ<*óçϧ²`ÁMðø¢E‹4Y¼x±&?üðƒ&?þø#•Ÿ~úÉ£°º(ü5Øuùû±û³çaψžûûï¿§òÝwßiòÍ7ßÀ·ß~ _ýµA¾úê+*ä§2wî\øâ‹/hùùçŸSùì³Ï´òÓO?ÕÊO>ù„Êœ9sàã?6ÈìÙ³á£P>‚Y³fi2sæL*3fÌ 2}út*Ó¦Mƒ©S§jå”)SˆL†É“™4i‘‰T&Nœ@e„ 0~ü8RއqãÆÒu,Ç‹„±c#!2r •1c"hAd4•Ñ£QFÁ¨QŠŒ9’ʈ#¨ >\“¡C‡R2dˆV<˜Ê Aƒ¨Pâš°¦B@Z+ XS! ­J/*½zõ$Ò @éA¥GîTºwïF¥[·®T0éB¥K—©|øag*ˆyq:Çn¾ùæ†øû™@9]ùÑßÇòá‡~‡|À…¨8¤¼H>Þ"òñ“²˜|ÜTÈÇNKòᛄ(K1QZ2!Ê£ Q*“…3íãÏa×Àë2Á{±Ÿ‰=ynZâ3ã:–ø? ÔJ¢„ÅD©¤%Q@ºŽ%Q@Mˆ"R!ÊH…(¢&D! 2qâÄb¢TÆOeܸqšŒ;–Jdd$•1cÆhB“ QJ*D!UYL”’ QÊâáÇ‘rxñ°aÃTZ‘Zõñª EW-:bÉ#5«®Xt³U=j$±êhÑGXXõa@ÀCÞ‘Zw&hÝ phÂ[zfݱD‹ÎD±ì=‰EïÁ oÝ™ˆÖ½ |(±ð<ˆt„Ž?ÐJ"€ŠŽB@ˆ[€€BÉ»ï¶>‡ÇëÔ©ÓBýþÿÙL€¼€@B‚Éǰ••K¢ ¥DIÜäãvEpã:¢@šºšÅ£BQ+‰rR!J«•DyiɄ߿ëâùìZ(ìX"8¡°ç`ÏF”Ù äÿpe¦‚ÿ–D¡©ÿÕ D©5Áÿ›(3¢ÐTˆBkBZ¢ÔTˆb»‰B“r2-‰B»'NœDʉ¤œàž0a"‘ñî ãÇÓ’(³{<BÕÝD¡‰Dº‰RkB›(µ&D©Uå&ʬÊ7Qh"ÃÝä7¤%QdU†Ð’°7Qf*D™ÝCr4È=ˆÊ@7aT  @éï& M¤¢ÔTˆb»ûöéã&Jí&ÊM…(µ*=ÝD™ÝD¹Ý„P!ŠL…°Mˆ"S!L€ QPMˆ2»;uìHÊŽ„²à&ŠªJ*„P!,@¨@…0*Äâ»Û´y×ݬY3Zë_Ê@€+mÙ²eF… j¡ï?ðÏÖÃ?taÔ?$$$ Ë ´DkK” -%*?³Š;wî„””dÈÌÌ„¬¬,­ôF²³³}«ó¬î!>–¼ÈöeddÖy‘íã%==]+EICIKSÖù’‰º­Ã2UÛf’šJö¥¦jëV’’’b*­%Y•HNN¦‚Ûl]—Ë¥–Â>".NœN§­$%%K-“œIÚ¾¤$'8Iê:'Â>‡Ã‰‰‰´t2‘‡Ã¸’@ÊmûäÉ“°aÃÊ2ZµjÄe  @Ü‚"d>úèTüþ±™©ÆŸ¤’ø¢Eý±Äˆ8ÒhÔ ZJúq)--¥¥Ûí¦‚ÛLømñØ!Ê3•jÏöWåݰÍïm_Ämÿ¢/â{ä÷³}ì»E0E ôAà–o½õÖIÖêõ\õ!T3ýf— ý]·n}yç΃ .@qq1\ÿÛŠðÿ±ÿÙ/žÁùó硈-Õíó¤ÔŽ ëXâw‹ççååÑï™@Ó¦M¡C‡Þ…6mÚ”¢\wÝuwªºÀ€àoÏ´„,oºé¦;ˆ?|Iõ•i€ \ǧ/_bII \ºt‰ÊÅ‹ýâ—?LˆYiµ.+Qð»ÅmdèF¼ÿ>ÆhA€²€ªU«>®êÃ?&7ÀÕªU«Ç‚dÈbbb( š¢â³‹/õj ™K—®Þ=®¶àóûTßÇsÌïF~î%Ó¾KÆõKÆk*ÏÀÕ±y&Ùï¤ï»dùŒû.qç•®Çדý^Æ}¬dì ·‘ `Ì[08ˆq€V­Zan@ýúõÛ£w¸¯çÅëat\d±±±À—‰/5''G¤“ïú99Ùj© ge^^.äççɇ‚”JÛXÝÜ\"Ú¹¹†ëäææ ¢ï£uØ~C]Ùyb”¾ÄcøM1·•}³ @h×®R 0X·n½÷Qþ±À€7PTtNŸ> §NTËSJ©®ó‚ûQâÕR.§hä79ÙÅE§Sh´˜žo!x,âhä7!!žˆÖö oŠ›%Áb]ˆ@³È´ƒ•­vÐȶ¸_“¤DHJ’ìW%)É¡F¿jœŽ;¸è¸Cˆž;Lûåvóy§wç*û”g;d×uëÖM÷üo¦ÿW¼‡ü¤ÄßÁŠ1ü~uÐé¿êÕ«çg¼ €€‰-¢ €€ëzsK"UF¦`T9¬•F<Î¾É ×P¡’ J¢~l¨\ü!ûعÕaø€œä#›«’ôuÉ1<îw)¢7éâšÇ\ô\ó1SÝd§ÚÔæRJÚüÆÖ•f8E\ê1¥.;F·].mÝåÒ4Y;‡;kÚSîonú3Ôç¯G%E¸ŽxR¬'¨$iЬ³ƒ$Q™ L!ÉBጲY¦uŒ*ˆKýèíë1%¶¶ÒÉÖVX².c¶â²º†ìš:’ýÿ :`(u6æÔ·Ê³áo‡`fN?P¯€0Z³ø "$ên||€Ê!f¹áÇcpT‹ ž¨ùÑ &Å7¨ìfWAôsœ¥·Éq—1ÓMS~í#u]ÎÒ‹À3#PX+»‹Qct+’åÛL÷­(»@é¿ù:V×77ÒxÏbÅ^ŒïÌX  ­Ÿà‘¨,ÀkŸoŒp ¯•‰äx¢ Jð.ÞÀ0ë‚?VcœÕOä=‘Àñ,€Ûœu÷-˜¤¥±š)¸“+“$q§ ˜NíceërEç¶z}§ôÃç•ÏeR¹Bºl”Ô…婾wu5^óéÅg·«û]Éõñ7ÎÏ/€‹—¬c˜ àI{¿y&H,"ÈÜøD¡§üx dHá]QêÅ’'š-»u$Ý>·\0dН*»KqœI‚µOrÌú3@°³ÔNÁ×Õè+ýº8•ºN—$kˬ¼K ùÖÊé˜'@ð6Àç­÷ýñµ{öüv Àï(‹%ðKo¡ø‰í×[ 4æ a¬ %%U‹˜>‘ZwG"ïç››œ¼—D Õ”[BýÍû$~½“ÑS§ÉR1%ר€àðt^ª8.E!¬”‚WdŸ•ÎGJžlŠè{ëJxy}‹ýVn kB¶–вeK?`É`ŸvOÍ€f¿_ÝŸ¨ïgméÄ\Þà€BûY¤žEù“Ôˆ>^O÷ómÎN¯@Wv¶îâ|w«ÞmÆàžn½Í>¾­¿n §á£?nOJåYÁŒþ¶Œ‚ó€Â»ÒæEvLk~ó¬Ü²ëxr\â½\É’g4ßC€-K¿Y\tÀòü e8P€] À*úÏ”ž2-‘Æ¡3€=ÀJS @Ëଢ IJ€%åGŸßÁšÝ¬~JßåtšÞ¨àrfà‚«ÍS.Îÿ7œ£WHÞ™”ÀKŸØh½õ¯Íõ´îÂ)æî¦.ÆÉj7cÉùb×c_ÁËüÿ{~J]9°Ëô€Ïàà}‰š²ëÁ@øþÚ à™€,ˆ?¨¦ä† _¢1KÌé9¨' ð‰þ}O÷MÇ”>ívVœo‡×"úHÁÂ{ŰSvÞ"{Rx+e—•ŠrËE >Šl’­ÁB‘I$›þwV—ö͊жm[¿ à ¬\š`£YúƒÕט€ƒÑEiYæàiCC3 2‡žð£¸‰:Õ75çyP|.r¯Eñ-#ûF`Êk ê1ëž .ÎÊ;…çAT|o¨½¯õeÖÚJaíëy»ëÊΑ7íózÆlB—!Ò›€ÊYbÇP)­“€´l<¾?A[D eü±@ $ݳðQ|1°ÇÇ”ãI†}¢•g` ÒyUÙY ÀéÔÀ@ ’Y‹œžË}]#ÍO‘(‘ݶ $Ê¢Ôö×(;€Hϱa "Xzô»ÀÁ/pPKkàv¸I´¦‰Ê)^h€iÔM4düy/Ž$%óOO¹Eåup`NôIbÖŸfœ™é¾4ç_hú£ÇÖ>¸‰² Š/s ìüt_-¼/VÚ“õ. 㸠ðt=þ9ð÷´ë àoé-°øs0ºÏzÑ%?Ñ‘ €Ç  æصí[ùþÖ»€ÏÕ—³Þº Íy†RŒü'ël ™ ê|UëhµÑê›sî­̬¾+˜¯,@oÁÅÛkZ]ßê~vÀƒïûf¥.€Æêú€’Ë€G€ëèà©>*»CpôVìÌ³Ë ¶Ó;uÅÖƒ~´jê3úúI<ýO2Ò~¼c ¦¨>Kãµêí'¸>·Ÿó%ßÌÅS{+ç ·W^;Fá ã°oŸ×0±c)bü @¾H‡Åö ¸f@]É ¯ïs¶íRÅoù¬=½û¯hùÚ11ˆ—Ä%íS|y°0*³,#ÏÐ[“B{Èo—ºZXYDܳ/o¥°žö{ .ž”Vv-«:žÀÑ`ý_,Üö‹%à¤8¡…7ãè´_PvG¼Ò2 îCÅ¥®ƒ$^ùéxäG5ˆ¡+­žð£·°7,:¯ùò\$^´èšõz¿ñýÜ])N06=¹$žw~3]·ø Eðã÷ÉêÚí“g5”8¿.ŽÉ`µÍ—âpæâ~ñwµêÜ[&c^7Ö“6â98 $ Z¯@é—Ïžg<íWGÉIbMxm4+À>Ê$Á=m´¡]_±Ï€ZŸï+àPݧ &óŒÇí²eýdbO`/x.~ľ\Ã#û°a Võ½±äe¼§'šoçX1=à}m<uëúcõ¸Ùqèd v ´Í'h= Ôï¢ÿt ]!@ž ,Z†­rp~]ùÑ:cëAJJ*')´LM1Z!ÝꤩÂo‹–I·fü¤šˆƒhûØÄæÉC22¬'á÷󓈓xª#N„Â&;a“¤ˆõdçør\Ügõ,ÞÜÿ‘©xbâ~Ù`Œèyü €N‡å (t^ôõ?G¢ž¸£uåML252@2ëÌ%ó¸”}øƒã(C;vì€m۶¶­[aëV½Üºu lß¶MÝ&å¶ít}›º–êúöm¬Î6å¤Ü¾MßfëV²}ûv}]ØÏŽêëvÇÄz¼àÿŽÂo[­{ªÇﳫÃ_Ë×ëÊÎÃg¡ÂoCÞ΂dà\8G€8ÀÁ@p"K#8’Œ–^øÓi·qL}@Oð"‡¡ ¦èºPùOÀ²eËàÇ~€Ÿ~úÑ09?Õ8Û÷­÷“V—ß÷ã?hçÑ÷ã:ž/§17ÞGßÏ®/{þÜŸ¸g‘Õóvzõk]–.]JÙ~ì{ð45ïÈ’%à”3 b,€ïècHþÁ>üjÆž>r®:§Ú|ÈŸu+怱­À©*~늫S¼Öß¹kUÔ_ý–,ù…~@(¿ü¢¯Û‰·õ̲Ìòz¾Þ[¬€ÆÊŠàÿ»|ùr tÈtÐ@¥µ+a.€¬ÀÏ”ÅlF\tì€2b½ý8ŸÛî5êÏ —”hh`ã ˆÀ|í®À˜ªË,¿“^ð;¶SËÀi™ `ì3)&Ù^¶L¯Ï+ XWTV+%g÷²:Ovmñü¢0ÀßrË–-ØY}YK†8/€Œ‹%0€sس©Á¤©ÀªµOi’I¼òsë˜Ä(bsP60‡–ìãPüÿ¸¸8ªP"çi¥ŒB[Qr¾ÞÏ?ÿlÚgµÍêŠçÊî'Ò^¶ÏÅj¿Õq~[vŒ>q]¬#ëysž·Â_ SæˆMœVÊo²f@?”3NŠ€#1° :ppÖ_îók-ê:sø”`¹ ª¶ï³þûÆŽ=¬ÓŽƒ@llÙº6mÚDeãÆDÔõM´}ú1}}ófrÞÆ Ú¹(¸Õ±vܪ.»6+™ˆõøcž¤,çð‚–Å›z¾\Ó×s¬îƒVT~d¼õ—å7Xñ¼ÂÂB£ Pê~‘€ €=íbŒ`_ƒ¢'Z€€:Нâ:$h3ô0¹øCš‡Þ’ Öá¢û°ó8¬˜§còŠ1Á…o“_Äæ@C dŸÕ1¾YOÖü'kêó´ÏJ¼iÖû£Eö<ØL‰ë|,È[ßߎðAÀwß}×øG€™3g¢P°cJo@ÑÒ'qe¢:ˆ=s/!NÜèð F@’7‰5J&_’M–=È:Ùõô3õûwš“jømYâ옧DYŠ«Uæ›]BŒ'±ªg—M艂{Êä³»ŽÕq1›ÐS¡7Àb Z´hQ„“…ú€€ªü°?À”)S,‚€EJ3 ÃØW?ÉÆùñôÔ]'e <ˆ.³f”2ïø¼~u¯`ÜZÞdÅɳÐäyüžRTíÄëå«¥“ Ï6¤‰K^ˆ)±©Œ×°ÛötoQéeu­ƒV1ÖÀ~à( €€âÛ ÓÍ@câTbøÃˆ”HMÙ5…êÐûã+`Áïç&È(ãð[¼åÅéÊt¥öMñí€ÀʪéîLŠWŠï‹2ZY׿‚°ÿÙÊúËžY|x>Ÿ ÈZÌ.@ âø€%ÈZX3`¢ƒ÷÷•”ßDm.>y7]ço¿ýFåÀ¶n€'÷@ÞÀ?žÜtÓMõˆâk€É@RP|^íž+Œ×§NÄé§îæ{ð©Í‡ñ ê ‰:;Ť¤ƒ€.Îâ+ÛÉô8 £££á‡Å‹aÉ’%ùyÉφí¥K1WÛµÙ6æà6–l[<ÆŸËöûåʈò-…Åä·üý÷ß)@eÁÀF`! M›6~À3€éÓ§k0iÒ$ËD s×[}ønO4›Ÿ2<‘&c Y˜a‡­ãõðÇ´QTHÌ&c Le‰*Ü&[]þãÏ+K 1žìeOMöýþWâÜ+u=\WÒ¹—МlôxW€å†ã\o @uýo R ‚`.€0Àçù3¿ßv n• ˆ‰0 J}c ÉìÛ·Z 1?&«]±.__VOYÅzvâm=¿˜ßº^ø[îÞ½rrr4ð]S"E ›E ËŸ§šÌbÕúÀ®/€NùUúOmSß}ÙhBˆ§C>‹A@\—QC¤_]ÇëFEEI{艩»bû}zÏ GŽ¡¥.dû÷ÃÚ1_ýQV–EŽ=jÙ>«:|]~ÿW¾ä÷ÉŽËöËÎ÷t«søëËêÚÝ›­ã7‡Š,S~QÄ&Nd ãF¢ À@p°¨è!AA!¢Ò «:p»– S€‘Xsô<ë&6 ¬Ÿ±Og52³Òóãï³}úaýÑXª#uçrÓe1ˆu%%;;ÛR.£ðÛvõ½‘˹†§síþ^¹}vŽ)(d¶nÝš€v& ŲÅCw¾wpÐ{Çû nT£'¦\R5éÊøÁµ¶˜€(>*?eØ!h„ ƒ€üd›¶ãè¹ôI:Œ ¶ð1\Ú,; t`Îâ³oo·ª/®ÛµƒÓu-×z4\O}¼I×õ&ñGLòó”TãmS›ì^V×·{«çõUñe@ ò1"\*pݨ!ÁÁá!AXÔ¥ÅXù9”n\T[—¬ü¢ÇtuÜvcåºX÷ZgR@à‰èà9±FLå]€¡€ï¸Â3}Ä_1'ß$»Þc£M‡ IDATtžzÚyã”ÕU`”Ùj¿XúêFˆtmón…UÉ×ϳ۶r ø,À²cò€ p8ðÖ­4àüûíÚÁ½wÕÿõ æõ×ÕÙ;²ËˆÞg3RŠ¡´JJJÜ%—JÜxþùìôKîèípbö¨“µ«T¾…ê0¼Ö[ÀtàñãÇ[Æèp\‚Â;Då·èÉgdñ ˜bBÆáÕ†(üj¥ÀeRzÖç_3P=x©)·_Lí¥ëK—Òyýò×üm°Ü²y3 0ð‡a@ÀF²ÌDðnèÒ¶%|ݳ $|2ÎÚv±¸ ïR)¡øŠò+ŠéÂE(=“î$„OìˆÝ îØ}n8yÎߢ7Á÷}ÚÏC £Šu  ˆåw«¢2€q–Ý]p¨I?¼ßï4Ä’8& M0uÊ—&õ÷ Ô_QHÐj(Šnî cèp•óì¯v.þÙgàÏz/ø[bâcv3$ÉXpL@G"´%¾»`ü€>°gö8(:¾ è ~ßÔ×gÊ‘œW’—I”ÿQú=Çwĺ1¤$Ûn¥‡6–ž]ñÕ¹ûkU{õèZj´ì8cÆLÊäP¬Dôµ>ô²9óÌûÐZ»œN}DauB‘„y+þ2Úïr™pì€]JiN¹‡œs¤™(¿ª%]Çc’uo…¿îåˆøŒ†c’ç–ý/—óLVïG&|·i»ºâ{ötM¤ÿÞX}«i€Ú¸Gî0jô(øô£é°~ÉBHq$Àù¢"÷…‹Šò_@ËOXniv*¸Ž…'Ê®*=n8¾.Xw6-€=ÛîWôéÚiÀd 0hÜXÏ.€Öù‡Y|5Ù'É0‡q,>d l>@„@*× ÀšÅð¢ý^mƒgõõ JôQˆµQ‹U¶b5†Ø«Q$‰sqLûL ¨ÿÏV“„ZÕ—%(Ñu‹&Ÿë‰çð,‹O~òbC}‰T²d,ñùÌ‘úÛY{OM¶VA@üîÙ~ýõ×0þ<:~đÇè3ž=sJÐêŸ?¥é(9uHQ~£âSP½J÷¯÷Îen÷Š/ ÷£yU¯ ¯Juêi4Q|·*ÆŽ+êX'ú8-æd?°a1uˆ0žðDÊbVÉ:,. #Î*;În¿U€ÉªÚ.Øë\‚?h¤^–“àMúñå¤4Û+{^½}oV®EEEp†(øž={èhרÃcsd܉´ù ENz*\H:—ˆ_Št}þ˜]j¹[¡ÿG·å_°})”nXP Ë?†ìYýsn»êÔµ ªõwc/@|I–À3Ë;Öyœjþ¾ƒcÄbÍ1£U‘eá]΀œÞfª¥òÛW SŽÛÀàKO‰I¢²ùÒ—A¶íÍ5Ä:Þžƒ À×÷Á€€¹¨ðø½¢òã·‚ã Ì;¾üòKmîŒA>O]Ý];wÂÆõQ·sEïR,~Ì5ð·‡ûÈfpï]îíKÀ½þ;(]ý¹L€¼Ù}ò¯qpc=¢øˆŒŒ„cÒ<€båeSu9“8ÊÏûý†NÒcôÝî^2pðÈ·C]€ PŸO›‰¿ùæ*QëÖÑ 1ŽH…€³SãqŠ g“Z»òWHÚ³ .W”ŸÊñPzdU~ضJ£¾uê/àüâ‰çaÞ(XÖ镨G!A×Nj°Ä˜äžH@û  @à˜¼ÀåW›û\Ʀ?>‹Ï©¹ÆVdl HýÇ–ÇD¥ç·YR«Èê£1X4z*ÒÙ²ötc)±¹¹¹†YoEvîû£„,óòò|¾†Ý9xŒ1OŒB$Ìx ((ȧ,víÚµ´u§ GåGë"îu:Dg'Z½z¬X±–¯XÛ¢VAÖ¡­qÄòCåߥ»Wlý‘(ÿ×+>…K?N,…¹ƒ!ulçôª+T£JuX\LÀæDŽc™Ä¶øÙzIzÎ?ËãwrwÐ :“pB‚ždžÈ}~Þz#%ÇnÅ»ví2Ìko7W=¿-Î_Ïö])Ù¹S™÷že¿|[<Æ þL<íK»z²s¬î-;O¯àJs¹ÏäéÚ˜€ €,]üX 5dë7pìø1XE,øüyóè·€ßZ}œ Œ6Çc88$9ºû÷ï£#.á䘇°iófص ά#ÊÿÛWPúËÇ¥0dOëVtl|G˜þþ«û*„†T ¤ƒƒ\3ŠÏð `Ê”©1Ú²@ šåç’}ôIDÕ¶ytÒˆ )g2Ÿ_Dnü1¯uàŸýj)ةЗHÏ1ÀÀhñëXºOÀ¡½;Éù¿jã ¢2ó½.qH8–õë×iIcË—¯€ 6ÐD²ãä{ÇzÇ¢£a×î=°sÃ*HZþœ_2Ë ß†”‰]Ï!Ê?¼Õó[B‰ò Ñ¿ö”ËïV…2€ˆˆú",]6¤­_Ÿµ‡ÄSÀi¢lŽAl°r¬FÜaû0úè¾ô—_¶.™§©:º¬™TƘòg8Ž@âîY°|ÑTX´h1¡ñ[i·æqqTùÅßIýû Äúc3 6 ¢›°zõjZ¢Á®áèz`—d îÚ¹Ã}`åBwѼñàûÁù}‘ O‹6UÀñ¹AB¯90Å`/@L=ZΦ˒ùüªßïtñ¬ ™¢¸ItNA )©ê©ûtXZY~¾ÙKüÑÐóu~z«9ëù9ïeóÞ‹ûÙ¶•ØÕÁRÙ~o÷±ýüõ­ê™dÛª@[·nÓöá{•ÕµÚïk^Ðò# [µ$=2“CÆÞɾì°ýÇ>„Þo€Ø˜ãpš(ò©S§é7Œÿ;ºˆ,x¤ùxܲu ¡û›è>ŒÄwû§œ$àqä÷ß݇·DAì´¾ç¶í-^T|~uìÀkNéùÅÌÆ×;5Ê&Ð¥û0@Wx#å×FôáÚæÙ´búœ‰¶A@QñÅ6{¼¥Û´=‘ø`’¯YmeÓS3ßäf%ì:²f:o›Å渼\²‡û½o¶ãëÈêñûMuØ~¡¾<ø§oge*¹™Ž½sä¬úœÝÕ2 …˜ƒK)s=}ú$mêÛµ{7mÞ£cEv±jÕ*ØF”È °Ä: ˆ#çáÔux kVœ_6c<õ@]:jPpP`˜¨G×âb€o¼±Q|÷¸qãT0…2€h;€‹þó–ßôÓ³tÞ$uúpÚ¨ÆÒÔf@±-×Ó€›b¢Ž]®€U2xM1-Øjœ?Ùøy²„Y=Y‹]®»]ª±,YÇ*sÐ*Â׬;ñZ¾žou¾4‚®hÓ[!{k_È[û í|JNõ…ÒÄP7â.§sE¢bcDã¿­\Ic ØÄ·iÓ&`#>a`p¯Ú @ÁMö»OÇŸÆ:E«–.‚ÿy°êIyí¿†Ÿ-Fp#ÆÆ埀  ¸”˜€o ,@³þI‚Õwjë|.?uÔÙ„µV€ÔTîG¶ŽX¥÷ŠYy¢‚^ÉA(=)„诊ud -²Y1×*9É—¥kI”ÿ…g[øæ@VùVN®‡Ì-½!uC(Úý¸‡8†8G@ѱ>àÜÒ­ëV,†õŸ'A0À8*<ư•@7÷ŽÛaÓ†uÅ›¢~…†ÿkÐu¤|ùŠTq®¡¦>»ÅÄÐú3€éÀ#GŽ´m0¦ùÊÆïg–ߘͧO&ê ÃŠáÐà²D 1ÀÚü­†ÏfuË2­˜¾ê-Èß ¼Í¿·«k—•ÈóäÎx+Þ 2úÇH6•ŒôdÈ<9;BþšÿÁù­ˆòÅOnÇp(9Ù26¿ Îyµ!}a-8øS'ؼf ñïwÐŽ@XҘ͖-ÔÚ#Ý?uò$íã>xð ¬]»ÆýõWŸŸýüãñÐà‘ûÛ¡~„\ƒíüžK7n,dÖ.€ìãÔc|X}Ô^ÔiÅô™…‰ ¦»V *¼¸Žõqõ ´êEh×£ÐÁ—a¿=åð{ËPdn„Œþ³&3ô£ÿ|¥-;˜dgñu³©ÏŸ™™Ù±¿BîúVP°þ(>ÒÜ ƒ©ò£õ¿t²/d®}2VƒÂ…AT2Ý —öí[7ÂÁûààÁC°oß^-óðÀýŒ¸ãOŸvïܱ£ä›/?=ûåœQðÌÿ=<u#´|H%ª0å®™4_oKÀ^€˜ 0rä)èybÐÏèëëmøFT\‡:½¸ÂðöcVJÏ·`@›tìæŸçË«-l®û«)зñà»À@ÏÊjÍÅóømÙ1qˆïËô#Àvt>ä¬{ 7¾~o§*ÿ†Añ±îµæIÈ\t,‚³‹T çâ{áàªH8´/ÍS„1Ah×®ºqçãÇ¢/þ~p7Ìœ44ó{ê¶!ºÄ:÷\#Ã|ù²˜€(¾[Â&R@Ê Ró™~(Ê].uÆ ½§ ?Оǻl†!°€¨ø¼Òãq¬‡œÄóÏÓîÏ¢ ï.œ]?tdø.½/@Tb»V _:Bñû¼#úû¥ C èH'ÈYód/¬L”?Î-fÊ_Î,B&§~z¶mZÑÇŽÓ&Fôù±É°÷ö;`Õo+/®[½Ì=mR䎚ի>€:A”¿Ò9L ÁÌ.™^iÅä¯'*>ŸÑç©ô”(^ÓÓyx³!ñy0ð%@ÙƒqW6ÀLjáúœ ‰ r² ¹k^†³[^„K±=ÊŸDüýSá졽ê1ÈžN>Îi–_—üù7÷nØ´x 9¸‡vBC FÃÙ?,šqÞ×A.­7 .³¢*ÀßUùq1@dd¤Ê")Œaí(ÖžËü#먘˜ŒƒÑV¤£q=xð°9ôt Ig èðæöy+œmã½ñƒÁ&´zøñÿY©­žÆØãëX­û2žŸì8îCßF¹óóóé{ü£\¼®o“Œæ(>?*ÿ¡9»òI8·ó-(‰ë¥DúQùO„‚ýïAöŠ!a(±ôDÌÊŸ;/æ„áq7ÀŽYÏÁžÍ+áXL, ¿âÄIؼ1ªdöôQеC³ß¯«~s *DpPyUAþ¶Ê‹P@ÀtHYTbLä9|ä|óí·ð-‘ PJŽ"‚+™o‡whA@1 îͨ>ÌX·~ÐA–bk5‡½¸¯Ç—²yìùu1í—ß{ñÉêÙïéš²ý¾ø^®æì¾W4Pˆ¿Ÿ“J”ï8È]ý4íyJN0å—N€œÍ!û×{ `a˜IñÏ,$åâ@¢üå!þ£ ;! b#àðä[`ݳañýãâbÝöï…/?ŸZ4lpw¨_÷Žv¨DùÕhÿµÓ¯¿¬‹ DÐIA†nÙ œ¬[~T>¤TßÿUxfý×oXOS,Ñ"# 5BkïJ6Î) Å2­@ÊÒ”Ydq›–d;&ö8üþ»2ß<6ñXÍ{o5Ï=?˜7ÂO1V‘MGf5=;‡ŸVŒ¶»Àww%ØŠ”ݺ{¾_–ódïyQÏCÑî&Pzªñù‡QŸ¿8¶dn} r–Õ‡ü!pva9“Õ§Ñÿï ~v8ÄŽ …¸1p"¢D»6|ÒÖ¯XQkW¹¿ýr6ôêÑùüí߃úõëvB= ô¿¯çÅÄòk ;!È ¦·é;§óÚ¾mÌ#€h̵ÆTK:¸ÃžÝ4|ÛömÔuÀGÜurnÈÌ0iÇÄl=åæÀ–Õd–b)¦ÒÊF¿×ùW1õÕAPD±Z·Ûf%ÎÇ„ÕaÊôgXqï…ü>9¼ògBvâNÈÞ5ò×> E{›Ð7úüΑpþxÈÚÜ2¼•XyæïjŠnQ9‚ í›08=«ÄŒ !Ê'Æ”ƒ“D~+"Ÿ„ï?Ó&tå‡wÞy»g ºãŽÛÛ£üã{* `˜<pþ¼æû£§¥¥Óî”?þø-±»åáC‡5«…MR8à"~  Æyx€oÆÔã·=µÝÛeÚ̘†/YƒV# _Nʬ,ÓP&WÒÚ—…xžA`¤?3•(ÿVÈÝ=òVÿжU|íw'Ž€ ±½ cÝ‹±¨Uz™¿Ÿ¿ R¾ ‡“Ó í ¢ŠGähD(¬y;|<ì Ùÿ]èÒ±•»uëVЬY“"œ$ôŽ;îð€£é¤ Æ!ÈÀy-ªÏ`±ø,òŒ‘U¤¡5ç×Î;GÏgÀ!ºôÀ,GêU];E“åÛ‹Ù|²ŽB²”[»ÎAVûË*¾ŽèéZ¾Ü·í:&ÉžÏÛûPA”ÿÔFÈÞÚ Ö= °™/a°BûÉò÷„Ôßž„Ì…Ui³6ï™#ýA4·ÄM­@”>@³ü±c‚à÷ˆ0X7ö˜7µ#Ì=‚(ÿ»ÐªÅ;î–-[@Ó¦M)Ü~û?žÜPX~·"£)@° ê @‰þÇÆÆÀò_¥Ô•c¨`ø##`ϪœwMu¼_-µÌJ{Êý·êHc7J­]®¿ H|M~±Êï·Û.+Èx«èÞR*s•´cZ=õþi·r7…›^!ÊÿšÚ;œÊùè.¶â1ÈZxmÏ7ûTÚŸ¿0>»â&?2*µü”ö¯÷¬Y4NņÃ÷AÛ6ïBóæï¸[´hA@3?`É`̘7öD0tèPÛkÿG @ –‡\Þ·¡ÿ1JGƒíô)jýñ|£u!f@ê¨`!*Øî/Sv”µSU/<HÞæò—Uñ¯cAŒxcÅ=)¹Õ¹žY MQþdÈ=¾ò¶åßò*\ŒîH}}%¯j™¿=™ó¯S"û¢ò/.¹óËCü§• vr¸jù?6"öG\«&? [–ΆÓ'béwŒß RÿæÍ›»›·hîg¼ @,?QþQ*ŒµÚ Àõïg©¿ør££Ñ «£ÑÑ4Û ³‹Šå¿t©²壊OgJTGrÐÄ!O.À•ìÕgeõ­zù•E|Qt«À¥"{¢ö¾(xY\ ;€)½^7rRã!÷ØBÈÛÒÎl}.ÅtW”Ÿ(~ÉéAPtð=ÈZþ d}F›ôXZ¯ð£Í|!pjNe861\¥ü í?N”OÄM5ãظ|.¤¸’¨ÛŠ ¿ÓÖ­[Ców€€AÀ<Üpà õˆâ£ò»G˜ 4dÈ`[`èdãÒA ##Ξ=C§dÂùØðÅã:ú u#v(ŠÏÜO1€+­ü¾ôy—‰]?Ûâû¢ø"X0E¶òëËê&hŠŸ Ùé‰sôÈÛøœÛÝJNô¦ŠV¿äÔ8»ï]Èú¥>±î¡ŠòkÖ_‚Üù!pr6QþñÄç,Ç)0쎨¿M¶D-‚Ìô¸PŒSƒ©Óƒ§$Sx‡@s?`eFøÝ:è2÷®c„ âæ%OýXXJ0îw:Í“jÊ€¹vA¿«©üå·£îÞR|+‹l ó†î_æ ^(n†röOƒ¼ o@Ѿ–PrRQ~ô÷/žì;›AÎ/·CÁÂò í_ÈÓþ@ Yß_&¡ýãË+–?)?úüA°uTMX9«ì\¿„|.ò­^оÙRuvàV­Z©Ðš4iâ,FéV…Î 4x°œà:íå'¸v3¿ò£û&iM€ú<V €Wv»&º?’ö[ü®†Õ·£üž”»¬–úJ\èüäzè󧜀ì=c!S8¿¿”žê î$¥SÏ…ØÞ·­1ä.¹•(°4Ò’þM(œœYbh‚ñù‰âŸŒDËëGÝ«?í {¶¬¤£L={Ö4;0~­Z+мys?@aØ 82r 4ˆfÓÉ\6$w²Ȇàbû•^‚m&aÖbà ¸š´_Öüw¹”_Å/«\¾U6+»ÝuËBý³5¿ŸPç!ÈÝ7 7¾ç´†ÒøADñ‡S8Ýr7½9?ׂÂRÅÇ.¾i_‡Á©™ápll¨ÖÆÔ?zT0lˆ¨+¾èûw®…ut©3Ô •@+?àb€‘#G¢ò«€ Àt…w™Üq?ºÎ1~>A‘°õ+Vþ+ð“ñ®¦¯¹JîIdMxe•¼¼|È!Š˜“tr÷ަƒx\8ÚÜ C(åÇ~üEG»BfÔ³³¸ª)ÐǶóæc‚ñõ§†Cldˆ!Áç÷Ñåa]ä½°ü‹pôÀvò§*¿Gfe¨ü2xûí·Ý4¨S§Žåé1b8lР^1—@ù= ÎéTØ ¢I'M&ÂŽ)~€<¸’M}²f>o)ÿåøü¾úôÞR}ÞMð®ôÄ¡üè¾9™ië$Ê¿£/lx.ï îøJ‚OÒ08÷û‡¾ò È[\E¢ø,»/’æV$Êq‘Az?¡þ¿GT€ß"‚ߌ„Øèä·$Fÿ'âv`¦áÙ3J gfàâ~à°ý^ ‚õW”Üz¨-Ö…WMØivØÇŒ æ«ågJm¥ü|ß“å¿RŠ/6íÉ‚w—cñeýì(¼7Ã}_8s³3 ×±r·vÂ-¯ÁÅc yýgµ‡”_üÅ•¥Š’=??«q“Ê˨X~ì €CaEäã°vñd8qü0íC¢?·òÿ²‹[QPƒ€ÈÐxë­·Š°UÀFŒÊïÆ>˜ hÅ”  ¼@´úb‰ N"*ü!qÝ.Ý×\nSß•TþË¥úÞúêž,üUSx,É5èõ‰åÏ9µrwvƒ3[SåÇ@Kð)Ø×Ò—ý rT”*>&ødÍ«§çT‚؉aZZövÚl IDATï 5»oßè`å¤g!êç .æ(ää ÿsŽt Ôï¨1?”c0Ü­ €p`ÅìØ4 êI€2‘h’Ó ¼X1_€_­ÿaõ=Q{;Å·} ÂÙ){Ùüy‹kqÀA'Áf¾Ø_!g8»õe(‰ë©e÷•úf+H[r7dÏ £É<¢òcS_æw¡prNeˆF->kãÁŸÑ7Áêé`í/ŸCBüIš[`˜| ;°)Í€NhÙ²%€fš €€à –ßÀ èoÉŒÍ}ž§ðæ[X§<¹V /ö¶ó6àç‹ àm„ßJáYlÃÊ÷÷·‰+oÕ½µüyä¤%BnÌÈßÞÎîx&õ`gp ÒÓàÌÞæþÃíį/¯Ü!üPùcgVØq婯Bõ÷1ÁgWD X5ãmØðÛ|â::”ÿ=[Œx ÓÏù  žÐR ¢ à€r 0lØP=z”ä1߬¿")ê ¢¨üµIPÞGfA@{åO3¬§1ù2à4Ré–?â¼¼`¦LðIù’Xþ©áxdyUùà) …u‘wÃê¯{Á¾= %-U¹ޱ¹Q&b €ÏÞ|óM?`ÉÀСCÓû÷ï+1`Gýey(‰*@—:§ïðL€Y~¤¥CVz‘\Nò ;3²2ÈŸ‘§ ¿ŽÇ‰5%ud‚Çs²Ìûs³ ¼’¼ìB"¬T%§Ð¸­J~ÎÈÏ=£”¼¨û øõܳÚq\§’wV[/ÌÓ· ó¸ã\ñ¥î9ºK™œÉ'e~‘äØYzì 9vÿ¿äcwhlmÆ%ø¨cõíyëž„ÜÅ×C¡:H§˜Þ‹#ø$Ï­Ç'W„˜È`=»ÐþC£Ã`ýØÿÀšï"!†°ÐìÌ\òìÊ{Èc®‡MÀ¿%¾€uêø@€*èç‘xcùõ2U€$5 ˆ ,bÕ ³þ§ÒÃÉ´p"m?œL?@×±<•~[?DJr<ƒ¬§„Ó‡ˆ†S¤óœÎe6]rÍ¢ÛÒf{”õ(ä¼ L¼8gcúdžrCÚÇܺ²-®+ÇÙ¨íÿØpœ—MªÐõŒ9ú~«uþ\n?¿Ov®ýµç(×ÍøvÅ ‚ø¯Aá®&PÓ]U|¤ýƒ!ow È\zä/ “ôæ ¤l ãûpHü8â&†èÊO|þ“Dv®K'< ‹~î +â&† ñ}̆-éŸH¡`×ÌÉ¿U™ дI?à# !Ö0 €~ýúÚ€UöŸ™ú{ò3[Ë46ùe( À5Ö$Ë”2Ö&O×Ê5Nb%R¦0˜¦î'’:Ö©Å•¢Xí—Õ[—6Ó(©3 €Ì4ï÷(Æk­§B@‹X9Z2Áíô™úþt¡¿­ígõgê’>SßoºÖLùõÈþ(RnL™ »czÃé¯Á™í¯À¥“}ˆò³Yz@Á®·!㧺´™ïœ¤+/*?6óšU‘6óÅE¨ÃuG*wî]–N¾ÿ¹/¬:9•€ ‚÷,jñµÿ”F™¹© ðyÀ~«Åš PB]€æÍé8Þxã ?`I@Q~7öÄYX¹ ¬òþe³ùê‰@ÉZðÏ X$—)> ¦¦'æ”ψ‚O£,•Ÿ²TuËä܇/|Üeýü éÙˆ§ãö²-^YÏPÖé~º®n³céܺZ?W‘Ùê>³làΗݟ ½FæÇ°…¸{O ǶFpvçëÔÚ+ÃuS”û›¶¨6Qò)åÇÁ<Ó¾%Vfeˆ¬%ø D†£o†ÅS_‚ù+ŸÎ=ùýnJÿ„@~^äæÙä4p 2µ°»Y³f~à@±þCÜ8¦÷éã› Nå-Ï?UHÔÌÄL7…Ûÿ‘h@,ÄÚdEéW'Mƒ•ñSà·"‰SI9V%Š2M²OÝï ¥s ¬JâÄ1ÅPoµc•Uª¬ö «,ÖW;§RYãbå4úá¯qIò,«…õÕ²ýìZìÚ.umK®·ÚÁï›A˨Sã`ûÁîàÜô<á ØÌ—4T¾«ämn‹n&J"ă¶ñMüýi•!nl–ÏÇÆ”‡ícoƒÅ³ß€k‡ÀŠ““Õû«÷vÍ Š¯/€ yy¹j~‚™x€¦Ð@—à¶Ûnó€bý»q {À)>¢µ—±6¸6· Ð (HISb¨<øQ¬ŒŸ ; ?ƒ¶}Ax¥0¨]·T­^ªßr#Ü\Û^ªÕ¼jÜvÜpSø_ËÛàíqwÁ›Ãî„7‡ß Í"ï‚§ÛÕ›n¾ªßJêÖò|=B®Q£ÎMðjÿzÐdôÐd¹×°úð¹ïƒÏÔ„ÉsÔ$Ïs3y®êµ­åf»cµ”ÿé¦j7À=×€·#•ÿ©ÉHEÞ ÷»õ®›èÿNßQ-ãu™Ô$ÇêÖ¯ï½Q 6Ïù7¡øÍUåA­ÿ¥¸^·þiÈù±’[šà³0€Fúc¦^G-?ó÷„èˆò°jø­0è½Á î„Ûî¨5È=«Ö¨µo¯¯ ‡Æ­ÿvý‚Ö&ÂD(À„<ó,LžÀ©@Ó¦MÜM›6¥ Àåx€0N Ö»w/[À“õ—±lÏç§]^d­©Š €€”uÅéIô#y«Ý3@þ (BË€€ZZJ€R+õî}¡2¼<¨&<Û£:<Û³:¼4°üû*J ×òAð~Ov¬/ô­ Ï÷©Aï×hH-¨y_Ãó°ç+Ó=Ôç½éöPxi@MxŽü?/{=ß»<Ó­:”Tß‘õ5*…@“ÿ†ÃêI÷BѾDéÓ³ÿ±!ý“½è(\ ¤ñÒz)óó9?‡ã“*ALdª[iã€Ã£ÃaÙ[ ËÛ÷Á]õjCpp°á7 U¶ÿïåÁîss)lÎ2sòU Š7.Üö€Áƒ© @€>}z{°žŠKÜf)½8‚°Öˆ=]z& ˜Î©§þ¦ÓTÞ4S>¥.e„òï=÷94mÿ,ýhÂÂCiD!ÐZ‚ÉÁ¡A´þn„ÆÃn…ûÔ‚ûÖ†W‡Þ 4­JŽ@pù ´¹–—‚× "÷}ªS x©_mzŸç{Ö¢÷ªuE”zå¨2”M”{•ƒªwT€Fƒnç{Õ‚—Ƚ^ìSžëQ B+«ïÈø|äùHY»Z(´{± ìþâQ(‰~J•Yyq¯â# pÝã³ ’i¢&ØÆïú¢›X‰¶ñã̼Hù® ÜíÞ¼î¨S“(?¹·zß `å¹C+”§åS¯>{ŠØÄ@ž ¹òyqnDå¨ò£ì'ÊÿM¿» e£û vͪd¸¿È¾òoòÛ~i àÁÀð›S»û]üàJ•*õPùÍp˜€C À*å×Ódž.mjq—:6€“fý±È¿5™ ’?¡Á,d+ì.úš´ê²\€û_ªB,ñ-ðQþ x…PԇߺñŠZWv¿ÿ¶­Ïv#t¼k ªSÖQãnÁ¸7C}Þo % £&<ÝY¹JÃÕ!$LuT$ea8wÔ …áïVƒã‹Bññ®4Ÿò@å/ÜÛòVÜ Dùe½ùÎ6€ >§g‡Ã±ñaJv_¡ü‘7ºì}=|Ñï~xõé;¡zµë‰å2¿#œÿÖºf`Ž’ `3'kÍ€Êü.@9ˆâS0`€‡u(á]šþL *?uÝPºó*°)õ3XCÀ¦LŒ0¸<pÕ@½Oyb•ߌ¼ ZÏ® =WÞ }£îƒ>kïƒÞkîƒ~ëï‡vßÜ ïL½ZμZL'2£ŒBÎÅkàµÞ›[ú®»ú¬QîEï·ú>hýq]x{òíPñ&EÑÊpº÷¶0˜Ð±Äþòœ2KOâêócŸþüM ùP¸HÖ•·°3ã»08ýñùÇ…B,®[¡ý±¨üÕà£÷Ãóÿ­ Uo¬L)¿ì]‰ðd#¶dÏ¡€¿9ãSÍ`ÀšE Tø7ß|ScÈü  N Ö³gO8|Xw0•RæXM¹m Éýg‚ ‹ˆ}ü1`£Ú ¸> c“éGÒDüe@½~Pˆrî] +×þ³ó‡r‡™™é’ñÝ?çì0çÌr­É5ñÚì>3ˆà½gå<_ÃÿÁÃMn¢ÏöØýá0«S-Hú­”žì­ ÚI”ÿ≾¿í ÈYr›ÚÆ_NìKû¦œœE”¬’àÃææ;6:vŽ® S»ÝÏ<^*_WÁöw‘1€½çÑ €€¬<¥@ÆxÑ\.X‹ð3€r\ €À ýû÷×€wJJäÍ€VJÏö‰£ú0à'®3 ôóWJÚ À@ÆGð[Â$ Mÿb €E؃CºÝtb˜•ýD}¦$= ãÿ“ºLJøÝwE%A¸Þ“Ü;òØÃ @{Âî«ó†ßikÓ¤6%÷%¢ü¹[Aæâêpvq°Áâë >Aúu8ÄM¯H#ý'¸Ÿc!°eÄÍ0¶ó¿¡Á¿ï€Šá¡4ÐgÿÎä.À¤)Ÿ§Ñ}Ysà9®;°Tàµ×^ó–Ȉå×;õìÙƒNõ-¤z™øcÓ#¦ºl8q€>ŠO† 6¦#L¦VBsþ‚1ô¹‡íþ€)®GaZê£0•”¨ŒL&¡‚&^y™ìÐï1ÕÕ¦¦I~f¥5€o÷ÿVŒ»²¶¼ %ñiû>ŽÝwéd?ÈŽz²U#–?XôÑ®½¨üI_V†˜©i*¯>hg±ü!°aT-Ûó1xðîZP¡B¨çßà °Y4àW@A€?~áY Š 1€·•qÜ( Üzë­~@@aУ‡J$y2¥ç÷óÓz±íädú3°rȤC{eÒfÀ\+@Âò‘p­ÐÿYÙÄÓÿ!Ѐ*åç£0#½Ì }Fúc„–?³ó®¬|D®I¯O¥½'²)äþ?~b·>…[$ ÒÆê¿Hüÿ¬Õÿ…ìE7ššù”®½tê.Çç•!vršÝÇzòay,2V­†?ZÞ !Á!¦Ö+±v¦«0K€|òU —F ·8áÐð@9ˆâ£ò»ûõëGç´ûv\·šÐ“÷ýE M ]ÛOe,`cælšú«ÀÓ0Ñÿ uàâ—O8õLKQ­óàÂÀ-ÀRvûåh÷M}ø`ÞÐá;"ß_†k´ÿ¶>tùén¼ýA´íALdUΗÔ†ÆÃo…[¯J"Pú?5ê_ ÞXf}~7¤íz .ýÀÉ|ÂùCm wù½³|‚LÖ·sçéˆò«H•-þqÌî#@°wäu°pð]ЧxsÀÝðbï²½?«€œ%JŠU& Ú ÈÏðÈúöíKgF8tè-°bvzòs È\^ŒÃ|g*ÝSÍðWa2ú?G ÿ‡ã½jÁsð^µî¿â  êíaðÊÀZЬ_møhưö9u!êDýáÜÞ·!ÿ×z¿°Yî[–ö+ÒÖzÀO&êµ €©ÀÈxHü‹1N¤ôŸøý˜•×hææ×„ÆÃ®Ü\/ Þy+Ìy$nx Jâº*‘~ç¸t¢œÙþ,« C,³ûplæÃ)¹ù)ºöou3Lë~/4|èx¼ñ-ð {Wˆ4l$fç§+AÀ‚|¯bž·ÿñpýõ××#–­¿Ç@èÚµ«1(€ï冀xrÄ~L.€ Í:*‰@®+å‰ò•¤Qx;Á“ÑåÝ`€Áän¢|ÀèÇSZîázHÁ1â]¾¢rÍ»Ÿ¹Þ’þ?ÝÅ·ü[|z¯2Ð*ä9x‚Éÿöäÿ®‡…_=Ž ¯œì¥ ßu!¶ny ~©-íЃ#úW í+¢üÓÂ!:RŸŸ“|Ž †#kBd‡ûàé'êAÅðŠp# CV£¼¿ÚðHÓ›|zø›áû «¨€øÓo(}Ä@6a…gˆ¯Ÿoˆˆl@N^ýu ¯¾úª°DÀöèÒ¥‹%ðü“)?îC…f ÆDå§ ÍèÃRS`“ 8² ¨±=ïsèóY#hÐæzx®Û-ðdÇ›áékÂSkx% ;Õ Tü¥~µh@Ž YG*‹=÷¼½ÎS’ku¬Ïv« O´©Ý—Þ£Q|l{×èÿˆ[éµñ~¨,Xâ9>ÝË$Õµò¹«C{BûϹÒw6¡u(Êuô€‚Ï@ÁÏÕ¤V€… ƒ!ù«pˆN•MÔA|Æ„Àúµ`ê Ъûƒð|çÛàéNÕ)]öû#‚¿Ý³ÝjÃcm«@Çéÿ;ò¿ #=áx:¤S@€?&[T öÔÀï”S€(¾xväÁ?»i½©Ò'‹1A@:eW¤g!øŒ€2tÀ¶ÜÏ`Àw/ÃSÝo„Wß/ô­/õ¯å“¼È¼œøz&Ø›0òøÃz³Ÿã?ýGeÇàß }¸ûô+û½^ê_›ÊËd½ñ€ZÐ+âvˆúþ!ÈÙÛJN³Ÿápøÿ9«Ÿ€‚«˜"ýgXo¾ù!àø¢ÄL ‡˜1A4àG§äŽ Ù}k†ßã>­±cOÿ:´[3ÞûJ½?üí^t+ý-»~ò‡ÑàAÀ lpœÐLéà&âg¼ €Ð»wo7vÂþv €Yt1heýù©½d1Ï­é d¦j1žôÿ¦4ìv#ùxn£mÐÒ‘|¼Ì’y+/ôÅ.¾µiO¿æÓï€éi h{?‚¦ú"h÷u}x†Ð¬‡tY»·¯ÏÛ¯–Ñâö©Ipƒ"nƒõ ‚ÜýmÀÊŸ4”æõGw‚ìßþù‹¯—öáGÚŸ3?â?½b'…ÆêÇ}˜à³|d}3èQh9àxeÀmÆwtÞe ä·k4ðVú[vù¤¡ 3as&ç¤k.æˆÀš¥.€Ó©1¸íT ðá‡ÂÁƒ}ŠÈ‚~"°ŽD2ç`íÿXâ<}|1€í„ôûúeø_§*ðr¿[é(;¨\HA½Þ3Á}¾\i0ž‡Ýo{ývÌÌzŒ*>¦ý" òg`ôÿEîž{ðå^Ús“óž#ÿë«Ä šP¶ÿð(<ôMðF-Ñ¡÷!{%……á¬ØÄ§&øä̯§æT†Ø‰¸`_¥þ‡FU€Ÿ‡ÜCúþšô¾0‚.Ó•~(øÛ½Ô÷ø¿Î7À‡³Ÿ`–! cL<Àk¯½æüÃZÆ0ÀÀ*ó€´´t­P– ÌÏJkì )a\Š 0p~#x®oUxcdB¿kQEóZ†ÝB)ù‹ÂGŒ”Ô§ëp2&ú!þO¦ô¿ Ýù U|jýù{‘u âsøvBûßM‰»1¹>^ò?:bõ÷qÔ^Lð9ÔrVÜO¼¼iè.&Y߇ÂÉÙ•áØ„pÚ¾Ïçõˆ¨KFÝCF<͇ÝïÓû{¹mŸß_Qžï[ zÌ}F€,¶d~¦¹6€bP;Qxå•Wü€%ÆxÀ¦À+ÁdS{ë.€u€¬3P¦À°GóÅ1Û}®¿µÜþÈõPãÞ0¨ý`EÚ´Vûpy‰Çï ‡[þU‘&Ì<Ö¼*UBTL”FDI1Wãž ´Ö¥ç©­^G¿V8Ô¼7œ&óà8|ÿ{ïf˜•¥DÿÑ À>³s‡çº×„ªw„j÷ AÀÞŠòc3$>½—zM,k±{0Q÷ã‚·c÷>~ôîP¢z ŠpŠ.ìJ'é< 5dÿRrq¬þÅÔÚ&êXHÛøc?ª±ã+zóÅFÁžQ×ÃW}êCë&ÃïSäS IDAT=Þ¬þßÊóÝ"¼¿G…÷‡ ‡ŸÔ¼'\û-jñ¿ô=V¤¿]‡*C•:ðfçÇ`÷Ù¹•2¶dbrº_h‚ÂÂBÛVÄ ðψâ sçΗͬ€¢Øå(ÖŸc’fÀËT–ðЛ޵c³äŸ5ùçˆ[MÉ?ãN<•««Í[]j(A?5RŽ÷õ5€üx^ºÏkEÇzÐÌ>TþÒSýáÜž·!wÉ­j‚™öc>´ü1Ó¯ƒããÃh°¦ö«3:vŒ¼>êq/¼Üðn¸¾r%ëœ6¤Ú ìýÕÒò¼}ú{3‚½ç¿¢C¿oÉù„Îc@@™0ß_Æ A@tü@) `' Ö ÀÜëÏ[ÀÉDÄt`xÇ`@À»<4ý@É «Xž*OPˆÒöl)!t˜®`ux¬ûÅ<€!z¶«Ù\‹ ©Z1†ïûµü¬ÙûèðíÊóU‚†«+”™´ìô^aÊàœø|²ëÑõ@¨vC mSb~mpº7õõiWÞ¸^pvÛ+OÛøƒ¬Çêÿ* b§U‚c4»ûÊÁñÑÁ°yÔÍ0¾Ó½ðTƒúP¥Je p²ÿŸ¾?ôîéX€:àˆ·ï3üíBYÀk*¸ŒCàLáYÛ€ÀVµ€ð={öt£ `:p§N¬À Ú/S~Þ@œ€@¦w  I‡?)XÈý¿ë©Ê4ø‡´A`»ª !Apç-`tûÛ }cSpŸî¯ôès(cõŸÙØÎü|£JùÍ}ùépÝs+@Ì$"c‚µh?ëÇEžãûoBçq@P¹`Ê6ÊñJ*þÿ¼ `6ïÏø.U Yd(}t(PÀžðA@ o½å€r6 €ÖA@™ ‚¨üì<0¥g@ Š6 ˆø t¢]wúŸn¤ÿíUú¢¤ ?ݹº–|ä- ‚ûꔇé½î†ì­àÒÉþÔê£ß_|ôÈzÎþTI ð™Æê_œ¥g"Q~u¸n:vߘ@8Ž >£ëÂÇŸ=Óv= G`U UôOd¯í „  €3`ë¶ Àt1Q|¤ÿnì„ àƒ>°mà­¿§äSÐ¥€¬3[—6Ê‚€ƈ@"ýZéú«Ñÿ“„þ> š+ô?û sp_•ÿ?wU€¯†?™Ûß…RLðq£yýØÌ—ÿÛpæÇJB”_®;áÓJ3!T’[ ö¡å?:º<,uÌù²!LÝÿŒ?Nž9ÿ ƒÿ®¼Ï?4@€•ð³«ü ,—žþ`Çd`ÅD·1ë `“þx výEúÏGÿ5ú_=D«×zʆ0ÚÍ®]\û…‡+Áü±CΞvtŠ.7Q|ÂëìþV¿â(\gšƒ}Øô—9/N}¬*D ÞÆ?ºƒ³ôÜ 3æ6„Éûþ¦$ý‡‚×ÇÃ{sëi Å¿/Q4xéêÄöË‚€*ßoùÿ¿½ë¯¢èÚ„@:¡C¨"Mš@¤Z€ EDéETi$‚‚]@š   6>ýT¬Ÿ]ŠŠbE¤wPé=1çŸsfgïܹ»÷î½IPvžç<[ï–¹{ÞyÏ™3g,1Û@Řâ#ý/Æ1 ˆðÃ?xŒP•_žÉÇŒx±îl¸Æü­ @þ'w4ôþ EB3ÀȃDûÃÍÝ*û‹®ƒ¼Ÿ&R®~Rþã ÿýHÿ 1 åÍ7hõq”߹ׂáðŠ08ðt Ó”ÜÚûíÜpøÏƒM¡_§k`²Vð\{æ£Ñ4hiñï×Qæà°êŸòw™m]LŒp@6[溰*ˆ¬Àv//† A@À„ <2#Ú/OjæT'>spß xÙ³»xÿµ¡¿²÷éÿˆjN,Á*T«ÃºG–Õ] ïTm~¾‡˜òÏ¢$©ïD™*?:“_©ûŸ­ û1W¿Ó8~øæ‘X5µ9 Šk Áþ• Eʰ"ƒ1—£íÉ1_ë¹°bü½œ¸*¾ (ùJ & @!xbF´ûí…£Òª¦€/ à¼U¸LóxÊüƒôÿÉý÷³ÆØñpÖòOX ¾[ß ~›Å8Kø{òvÞ éjNÔ!ä—‚`ßR¦üOêÁ=4Gßã8QGUX>½ ÄtmBuàd¢ƒý`îî¶°ô,nd/c×z6Ê ÝûrssõÞð›52làÅ&£à(@œÄÀ@ Uùåß³g|óÍ7ðý÷ßÃñãÇ¥Y~Ïé AŒ€<ÀÈ@`Á|Ûþa)Á(óâý_)Ñ‘œÖ €Ý·žÖ X£j˜5¢ü¸!.ì›pšÇõÿyhä&ö&åç>-ÿ›~púÅØ·8Œµüδ»ý¶Î­ +ÚÁChXˆ“rãTb«r:“M4¬˜—¤ X9)—›g¨ø( f‘€¶ÐQœ <<\gÈÆg çι*?*û»ï¾ /¿ü2¬_ÿ¼ñưaäðx.ž'·ü8Rëoì0gƒ.g€ö[L܉Kï?c¨L"øGDòEP(ð´Ú0€1€Z-‚¡V˜Ì»³ìÿp \Â$§¡Öÿâ¾I·­;dm¨ Ù¯—sÔƒf@ÖþÔÇ¿ï™Pøíñ@}4ßaJâ›æÕ…ų¯…1÷µƒÊÕ>„iAÓ†‰wÐÍ-«O€<¡èe‹hkÈ8äCN®«ò1—8›PQ ¢ñäÉ“þßs€ñãÇ»í”(6¼¯¾ú*|ôÑGðùçŸÃÆáË/¿„÷Þ{:DC4Ź2 €,¢P€óô8€”¿'ÐcÞ¤ÿûÛIôßñ[ˆ¢s=èÏîu}ïš0o\3HIº)uñÁ‰áâÞ» oK7È|+Œµü<†_mù³þ§×ÁÞ¡°OŸ¢‹'òØóX%øb^˜ÏZþQ3¯…>ÓêAÅ?§: zcfÀÃßµ!3`‘fÀß 7—·ö¢ÅWAÀÈ8c3½¸0T~ˆÓ‚ws€°çQQwïÞMÊÿé§ŸÂ_|Û¶mƒ¤¤$øú›¯aë¶­°sçNú*ôœ5`)N­¿i/€”Ìy,g•B} à’ÐâXáý_¦Ðœà£œ¦X¢å§„ì|½î« }ã£`ÌÜzðîš› g÷$¸t,gð9‘E¿ŒƒÜ/ÛCî†Ã>~J×ýz8ñ|0ì}:Ø)‰fïÝóX|4ï*x$!†Ç·¸øz4Ž?(ÜŸ?S ÷À>U7Î*Ìý´Þ€hx\2(ç¡ÿå p#X1PëLÒMÎr™)Àýž{lÀ¹¸£þLÓL÷ðS^´ñ·nÝ o¾ù&lÚ´‰™Ã¯¿þ {öüBŽÄ;wÐUXX¨Ï(lä”Å ˜j”rùGê­ sÞ'êÌÀ̃N àîš÷@ÄÞwÍk ›þÛ²¿¯OÏ…Pðã(Èù¤9ä½dhïcbÔÿT„£+Cø”ÜOH}üL~~4Þ~°)<4³ o±÷×'““–(IÌD}—ªà¦7 ,GÞg‘sž@N6ù PAÀ÷Řâ3ûÿiZ°;î0grP:çPé‘êoKL„Ýß}û÷ï'ŸÀ±cÇaÿ¾ýt¼¼\ú½Cà \œ€)Á>;µvf¯‰ bàªë+AÛÕ EïpjÑ[ÆVv/Lé[ÅU†½" ÛøŽ<}÷ñd³Mï:ϥ߰uÜ×f@$4éã_iB¶3¶ürâOìþC»ºUßÊ$#îÙªo$wüͬ ÓŸh[7t‡œ'ŸEStaÑÏc!÷Ó‹>†ž~ÞÇdSþ§EtOà6ÿîG"à¿^3¦µƒ[g2å¯+eªmúGògïÇŸñÚUÈñ·äw­7àxš_pò{Í¡ÉõáôÎHõéw&õ×Û¥þø9ÿ ¬öŸá‡ÿa£ë+ÂÈ9]`WÞ:J€Ïé½ùy¤ä2¨¦€Ùpà[m bÀd˜Â`¬i7 ×°wï^øàƒˆêcëäÈ:ŽŠ‹öÿÁƒibú­Ò @Lêh")èùÔd$kÒnžÛð²eºy^=ŠôC¯¹˜ï3ÿ$$¶¢Öv£öØÊ÷éÏ–ÀO´€mow‡¢_ïÒ&êàóó]Ü/äm½ r߉0ŒéÇŒ½g_ †ÃËy®~§ >lý»G*Ãú9-aF|4 ŠoÂÞ)Ê%U—úL˜}{<6ãók(u9¾‹He†iÍ=UŸÎÃæýf[­?ï3ÅÍ®Ã3ÅWƒ©/Þ_g¿ÈmÿTÍ xž€jÈâÖ8sÆvjÅ€LDú_9Å: ©Ê{ >GUèt[m¸ýn¸å¸pôi€3áÒ©Pxê%Èýa*ä~ÔPkí¹Ý‰=rÞ '¼¾6ì_AÊ~àQG½—sëÁ““ÛBÿá-!zP ¸v`$½{Û›#¡ãÈj<âð>çß~z= r~7ìÂC0[àôná¶§·_¼›^ì^˜åˆbœê¯´è¨?+ÿþwø6ë cæu…]¹ëœL81¹å×€bðÁ@ l›XèË—/ïÄp/Ü~ûfx"Xxúe_Û/‡ûF¡À—©Pt…Ýòx}çÄŸÊÐ_?¿òNÏÑ n}xlÎHÞ³þú}Z y§7@Ö¾!û³œæ“ò—ÓÄŸ™òz}8¶ºœû™ò# ìy,>bÏ8cd+¸¦Yð÷ós ÎÁ Ä8C¾“˜DÄ©Ðdˆo`cl€#(¨Œ~^ 2ëô2©ª£¤ »‹^¦¬À_ Èã`dûë `tú´ÍDq¦ø˜ Àí·#ØíÑ ¶þ²²ËCƒ…uvj‘€©æð]Ñ:¸U…jýí~ôá™ ²”w²´Š5Ò"ÙhÒÊòŽà=j.Ù8óO M8Š÷ÁßBBaäÈ¡ð÷CΩ7 ûô'qî dÛ Ù[oa­}„ÖúsÉ}«"£ÿ‘pþ­prMFû™ÍÏ”Çóÿöhõñ¿—PîÜ®jX´çó燴œØ((@I@ ÉFéÙƒyPа% ¥  >6àÉ}RPBí.¨ˆÔºû?èøµ*‹¤ í8üÎ Cäæå’Y©šbÝ ä¾³ÿ‹1Ž3f´W`”þËÔÖ_t%ÊŠïÌRé¸j %üDÀ„Ògj,»hù®¾>œœjìÿuÇþ’R2éÖ¹¼¼îE8sò¤$‡´s'!=ù(dýü,Sôõg²!²?j éŸÄÀ™W;ÁÁ…a°)þþ'*ýÿùÑ`øO|cÕ¯%ԪΔßßåÝ €@ŒµÈ?™¨NØ¢c €à„ §ƒ¢Þle,@ Bw_P`­!±ÜÍ À]Œ LÒÀº  *½¼mBd0 àp@ަÈüãLÿŸæô¿rmÎ>ôA- nTM˜÷ÈCÔ#r–ÕEZj:¤edAƉ¼õGO?vó½ÁZþw*CΖÈØ2ά¿-Œ„óÃàȳµi(ïwFÂKñ-`p¯fP§VUbFïæÓuU$æ~¯šaì‹W;E™@?#pef,À¸Ð6Dqq2ÅGåg `‚Ï`&Â8/õÈŽ@á0 ˜ª1€4F£ËœHpFïçì2Ïûï/ÙÇ¡¡A0|øPزe3&iiç!3+²~YÆ>Œ+þÛAóé5ûÍ8ÈØõ$œß0/Š„_ç–c  GW^ ß<ÞÖÞ×ú÷¸ªW„z&ãwôÔANÃkfÀÑz¦ Z5Àå^e•H7Ðp^@Š 1›¸/Š F€ @ÀèÑ£hOi€' :å‰AÈ&Àå€rRKÇãå;9eþq¦ÿ¢õ÷‡Ö­ZÀk¯¾'Nœ úIKCpKƒœì|Èùmä|Þr¾è¹;‡@þ¡ ÷àöÙ¦ôá°ïQìç÷'°óéV°â¾ë î†P¥J8³ÛÝ+R‰@6ÄásbŽƒNÐ^«9ÏA™1 ¶{`*˜Ž´€^\|‚L˜0ž¦G0óx²ÿe@V~Ù è tšjj8 ìL€rRË®ÒÿEýÐè¿øØëׯ ³gÏ„Ÿú‘=wŠ阕•ÉcØ3S ïüAÈO9EgàBú¾k1YV <Àì~&OÁ¶'šÀ¢iÝᆎM!<,„)¿1í—¥4Lc3À‘0”@Q»FY$½±ÿµN €âRÌ@Û๸0ÖòcëO€#=1£©¿½abT ‘@˜*œK=ë2/Àî /]@§ÿJÞÿ ¯É™ÊCXXÜrËHLܪ÷ppåç9ìpPTAA!ýÉê“Õé…KsdüñFøí1?rúý´¸|öd $ÜÙ:´n!!Ažß©@5ôLAG:8% ­æÜвŒ€@ˆÝ `­¸89Ü©ÀD5jd©˜r— ÊĺY(°!†vb1%(K³þà´_jâÏURÞq^tôµ°vÍóp’Q‘QŒRäpLÄú8 áÒÅ?!ëûµpxÝuðË¢ÆðÅcíaÑÔŽ0¸o4\}u= ¬`I„” ¨fÀÙ À!¼nDLA˲H Þ÷Z§n@ìõÙ.ǘ€ã@ ÛŘâ3åŸP<~ü8ÀAž@ef  šr÷Ÿ°dèPF&€ò‘Ó´_nè?öcW¯Vî»o:ìýuåMDP£ôÕ¹¹ºòcý]dJéÒ_ìã¼çYýºq%|¶¨¬œÑÆÝv=´kÓ„œˆô.^(¹€Z?•BÍÌÞÀcÊ z¶§®…,u,ÖmྸøPù‘ 9r|÷Ýw–ÆX¥ÿFN@‘IXV|3@l>;©@¤‘l˜ÍÆ(ñ§“÷¿‚T „ÛnŸ|òåLć‚öë­>û/þù'™Y™épìÈAøòó·`þSÓaÄ кe} „ žáEnߣ ÀÐ P2¡RÅÑ` Xb@?)(}µn˜€Ê°Îñ»ÅzÇ}8åäÉ“ÚhÀ~Ä Ô­{…@XXXc¦øLùÇkp7ë&€Qß¿Q €;`ät(¿Ô  ÀÊ2c¸Žñîâ|ôþË1DÿsÞÿà°@hÞ¤ ¬]ûœ>uŠ€+[¥üøÈ´¼ü<8qü0|µñ}X»ú1˜=8téÙBƒC R¥@·ÏkEJ Lz­bfŽ'¿iѳ2å(ý¬À˜ ³¯rM šã˜„;þøºh<äIfñ;ÄuŒÇ`­?ôîÝ»8..zõêU0`ÀˆŠŠ"ðóó»’`<æ@`Ĉá>€Pz±Ÿz˜ôx2dpe”rZp€‘úy8ÈGžõ—'þdô¿ŸD³f­ª0kÖL;ÁÁ,K§¤œŠ^ l§N‡¯7Ák¯-†9óGÃèøë`èCÍ ªeˆÓóx£ðªø 讎¨7`w[„AO ´éÃÆ¼ÐX?·yi@ €®½ZÃæ3Ëáퟞ€ö-€w~~ Þß3öü < ûì£ÌS¨Ôûöñåo¿ýFÉiPø~~ÎolsTìØ±ƒ)/èÙ³g1èÑ£G3 víÚW6`/€L*À“ `•þËë¾2C&@iÀXöA<–[ÌÙ_·vIüy×ëœþGDà ݺÁêÕ«àÈáú Jö>kõq™|ö4üôývXÿêJxdþ¸ó(cO¯i|bº­CtÚMsxŽ7JÔéÃX׸|ç±×6"\p”àÙhA ЍÅÓyáðcl„‚÷ Šz ´´ßîDïmÑ@ô Íàõ]ÀÊÏ›„Õ_΄µgÃW‰_BRÒvHLJ„ÄÄ$&‰°}ûvJHƒKÌJ…²k×. dÃܘ¥êÀ}bû@LL @Ϙ˜‚›o¶1¦øLùÇÀAÇ#ð îæ”g÷U‡‹ár/€%HVÀK¥:rÚÍŠ‚衜Þ7ïϦ*É2t¸oß¡Ü?#æ/x 6oÞLïÉg§Í…óÉgaßžá7^™Sî„î]:@ÿÉM!îºLIXë<­Ž¥éÁ½4¬DJ©€šÔ‚Ð1õY8ÜÛ†Çö\KÛm53õ˜R›†w›P“Ÿ¢Y@÷ñ³Ê4Ó£¶]šÀšM³`éÓ`Õç3aÅÇ÷ÃêÏ`ó¶/ iûؾ•ýkš„“Ð`c…Šþ3Sxœœ[þC‡SnJ ÆÂÿ™RþØØØâþýúA\l¬íĥÀ0pHððáÃ,õxã4Õ èÑ€þXÊàÔbØ•ÿ"ŒžÕ*U-uZ„A•úPýª &•ˆë¢m‹ýU™‚Ô¸:"£*Ò}©µtŒgï:®T ó‡ËÑ”Ùh ï?:ÄwŽ€&­¢àöñ#`áÂ…0gÎl˜7w.|øápêÔI8zø|þÉaÁ‚0rLOh×­4l=&×&eé¹ð¾ÍÈTfÏσÏU½‘HæQs IDATò슨ïæòNõ¡q×02ñN”q‡1€ÚÍÙ=Täç㲡Cª¢4àR…]£JýЬ~Ù5+Á”›Ã[[Aü¦–0ã³k`VR+ôx20°ã¨j=¬'úFZÄT†° ¢N „× ¤Þ]p»Ž&Ú>¼O8cÕêAÅÊå ÛÍ-àÕsaÕ3á¥Ä9°nÛlx-iìúa;üôãÏðÓÏ?Qæi¤ýغfì “Ðž:uÊ)Ë”`døíâ1töëÇ€ýì^°–é1fÂA¾˜f£Õ^™˜0sbJ°¯Î¯„/Î,™k`ÖúB÷éU)›LŸYµ)ë Ò_#q96;Š'ÎP2ç`«‰™}ÐÖ‰?[CÌÔ(˜øøxô‰‡àþûï§D11=á±GçÀÆÏÞÖ<3Ÿ¼ FÄ_ îo±ðŒ7BùeAEí«>k‚Áó'ðó„Ä=è¼M‚¿KàYz05YOÖ2÷¸·6tŸ\‹’tô·'ñ}7M¬E­öwÕ„ëY+~ý„pýøÐul Êø‹Š=tIC˜öq ¸çíf0ùýæ´œøVSjñ; ãÊßa¨C0>¢Ó¨ê\Fóeg¶ì<¥t¹ÉX”êÐõv¸]ÇUgÏP:Ž© £¿>سÞüþQx÷—§à½_Ÿ‚O,c'2“Š[^®7™z·+O š§÷¼àR„Û9y14 æ˜15H5¼qª@9'FBl|=è1µ&µzèý¶*½”¬9¨<¨ C7"ç—œ$3[×úÝu-ÌxxÜ?ý~F+ûCôu×Bÿ¸Þ?ã˜ýøH¸ýh0£±#7ž–¨ÔS¢NzZW’jâ³2…î1•+°¬Ä˜°³¡s®It\PrR®;Pé¸"vQô:­ÅÖeSÞ!|‰ÛísÅn;°*½Ã´ZÀ¤wšÁTÆ&³å´OZP& ô— r“Ò¬® ÞG¬ãqRúÛ¹Â#ÃBpÁgÅg¾ñnöw×`€ÇE‹»ÁÖäUdæmþcͰ5y5¤fž¥ÉA±7¿Kô±ˆÞTzшJo™0Vc·“`ذ¡%2ŒZ#&€™[~w°3s-ÌZßn˜\ú%Ôgj-ÊK-¸UÑ•1ž+*¶È¨\Ó?mÁjùñS~¼vpËì&pWü˜2m :zv¿bnêcÆ÷„;î»Li }0%·rí>­¿ž²K$Çœ^Ç`ÓjëŽ5l¹11')ü=µteï6+)øX®`ÔÊj­.‰¤”Õ}ÊquŸ8¿ kµQùïûâL!žÔƽr5;¯)2µä’R PLë´ûd^â½x–aþþ13jAßYõàÆ{«À½Ïß»r_â3I)ÁD@Å䛯؃Ü`-?¶þÅcÆŒ8tèÐRežL¯|Ïé `æ«})“lܬúôaV`³L¿V[6ôt »á‰h¢ÿñŸ³–~l'¸gê0fäHÐ÷¸uH1±Ü<µ Ý;öþº†Šî`yõ ”“¿êƒ4(,(¢Öž·úù: °Àz140N î ˜¥“—*˜9Q,›/õ®wUfŠWºO©IŠ…/!ØšêëÒ~!½´”Ø‚þ£B_Öˆ¼þ¨øèÀå¢ß;ÀØ¥maè¨þ0|D1"†ÝÝúÜÕzOaìcª£+ ©:¶ØÂöæv¶¶~ƒ¶MWCWìÎ’R˶s§QÕ¸Œ4›¯wYM_×Ïa‚¿éŠ€A6vuzÓµoçûIÑ5:Î)¹Örë­7>#ú j±g¬ C5ÔXP{Xt’;C1LxÌó¡;/š]iºÃ”2ªk'™*ÿGuXÕbÌ©.t½;&­Ô€ä´ßï‹ 0ÅGú¯1€;aÈ!eÊŒâÔ BÝ1= p ™Ä»ëU‚€ òP),*†ùS¾*èÙÇc8)fPDu½átYØ ˆ$:Ú°%F‡—Lÿ—üM1ZT‡æÍ3iW5ªµ¢"(f¾b0^ß¼ât¯M‚ù»ßpbNTjT.¢ÌL‘Îc7 vßá³á¨C<×!þʶa¿Åk`ß{Í&AD·ñ^:“¸ÙV­ÝÃéÍ$TZ²çÀQ€ó~h«‡Dc:tô‰ÌüŠÏ@±L™1¨Ãઓ€qú5B•k†ÈÿK{®òV…Wõ¼µ=|áØôÇrJý¾5u¥ž€+~Í|,†€‚€ ûW}³0`rë/™uÇ(Aˆ 'Jq,ÀCuõ°Yìóäᇎ-‚Áík0úÍ‚C+B€¿¿å!ºBð~Ø¢ã¼y¨˜Hï‘mÔläUÔœÛ{h×À.=1!¨p*b€åH@µ^d ZÚVæ8ŠÂúAÕ»6K)X€LÛÓÖ*à `r`ŠO0zôh?~¼%ð6 ÐxJ5f ÈC+9Òrã‡kú‘+€ýØ}êêN·aŒþ/:Ã~ž9É¿<{®#DáÑ*ùë7ºh÷r+äRž(wO͓ϧ‹‚Ú-8ˆñõ˜Ý×ãõ „®¡½Æ¥G†Àëˆ?“§kŠ D´lGØ¿ÿœ66€zH°gä<G4w„ÕrZpý>Zôa%7õoçĶ¥:›¶ dÅP <Ø­ fò¶ÐÈ º… ÀÀ,€}<#y>ü°°år‘J~¤lZkØf@è?·žnÿOù_sjÝž>Ôž>pŒ|ì×vzÞÿòÒr™ *'¶þ}â9Ør–I$` 3™‰ž)ó"ž’Ì€-- @c™€l »ñ@Æ?Ðà?ÐD<‡øÏõр׺˜|8p÷( ‚vŠ8›¸=šÀ¨Q£`ܸqV€»|îLOƒ¬ø.ç¤VÅCë#Ã}ÑC´æñ½×ò¡¯Ú|ØâáTàx®žøÓB¸qbMxÏ»úÊ,¸ÀÕ h¤e jï‰>€&Ô¤ºD³J~ÓçÕØN9—áÀ . x^3^Ô€@ž9˜1{n@^ `4¶þ:`ÅÀÊ@3üú PŽ0Õ0Ê ,1a 2 ˆÎ.ôhgv+ŽkGû'½@Á}èé²°L|³)ÄonIýþ8&*>R¤¸4ü5§t¡æý¿À`ˆ0Öæƒ;ZÃôOZP]bÌö —ê\í¿@“$(B{?g`æpey6øP¼‘P+Ô ¸ ²àjÀZ‰€P¤;_okÿì Ïev‚Õù©ÕÂqüºàv^gëóáá õ÷Ì©hÍËÍYeþ©U2ú_î_ ªT ñÓÍœCp±VW¸MuÈêr9«S§º–êÿ L¨²æbWêmñ×f]*WNq^TL‰¨&€'€ è\ €)1&ÁXQ8¤R0WmÔ\žÆÈIA=ú ‚àdByt¥~Ø‚cWã5<޶,É)Þí'bðƒÿ OUú_î_3€_[r"Œ£±®h&aVwÏhué®Î‘9 ` °"(´ŒÕFú³ë¸ÆòÍ}2ØN@÷Å” àx¬(Ù@ú/*Ó Å,+°¡À˜Ø#h-ôUÞ:ÔžZttæáGi$ø1â9$l[5tpa$ RÝÒ ÿåþåPN5zW&çßûõ«Ö£Y}Sý2Öðäv”\¤ &_¡÷guäo` ¤8›Þøòmp).€­¿`8jJ0aXaîbÜ9U`œð,$J&€ºÓG£›þ¼knêÿZ €}øø¡¡3ÍU8õçÔU~ܘ 4è? ö<`  Q­þ ¡³ô…Â.Ô ˆõ¥×á9¾mT×øàà¼æBHØÞš¦]S3û^t0€ÄÅ7€jµÃÙûëç›]ë0¼²ã>ŽûCD$Έ*!Äî=ˆ×Ö]¿Y aмFÐeDÆsÙyúµC•¥tmv/üïªÔˆ¿ò~ÐgHgšL d è](° ¼˜&ÁAªÀ×^_ºÍr `Sò2Ø’¼6}–RF}|t¼»÷ixß|xï7.ïÿæX§í}B8Ëo àÃCóá£cOÁÿŽ>ü |zr!|rB““ hIÇ>£Ÿû±þ»Ål}‰¾üø[û—:Î?´„öósùñOŽ/dlìºþg'±u|Ïg´ëókñuÇ=øs8?Ëÿôç>;¾ÓW3Å_‰i|éjØàkqÖòcë¯æOÇœë¥eÈ£} à`63Øœ¼œÓƒmMUe¥Óö¶´•æÂ>.’”UŽu:Î>Àt_d5$eHÚó$‰š`¶›$é\ø²#óØžù¼W‚¿Ù‘µ†É \2ÙzÆvlóº8Îd'²––;Ù’‹8÷½@ûøúý7â<:Æ®»3s[®Õ„ßSœ³]¿†ãZQž'“/ñSW“òãÿw¡ÀF£m0/†€,óP€:À—¤ jF ÷)ÁN@ÇhÀ`còRË 6%?KNÁxv2cYÆ%YZ&;Î@ÃEÝ^NÏàX×¶Ï-‡-šl>ÇÁjË9gÙ,-7kça ,œ™º$q:þœ´ï92‹PpgÓEÙª‰Øæçñ%¦UãÇWé¿%Ô¶·¥¬&áÇViç®”ÎÇÀ:í_¥ã¿ILyÞéNr^y>¼‡ö.ˆ9#ˆ'¥­qe6ð¥˜2$3+Ý€ž&5KâÎ h481yÑÿ¯’W²%S¶Äõ¯Î¹—­çØGtÞŠ¬vÙŠàç ö¹Jbêó&òMtit,‰KJ³ ©k\ömO_ã*i¸\Ë%Íà¸&;Ò_„é/i묕N_Gûvd0ÑkûðxÆ:mß‹ŽëÓïÄ’Ÿ·=c ] ¯‹¿ß©­ïÐÎÝ¡ÿV~þ¬Iiü·kËi/Ù&@)`Ôé¿8‹ª`e4 Üÿo¾ä&À–³+áóäðeò"ø"ù}ùÅY÷‚çù*Ï-öI6_b¸öŸw>®ïgë›S–’l:/–K¤}Kh¿Ø'~'Ž Ù’ºÌ±L•÷-SÎ]FûùyŽu};g›öÛ-)Ï:ÎIY&ÝãYMpÿrí·Ké¾_I¿Ù,=‹¡¤:ž[~v±YO Väóp`x1d˜D0€² `–ÔSJ°fNù¦ì‚C)ß1ùÖP§²cL§²íT¾}˜$m7 mãRÛÖ%]ÙNåË£éßÈ\2¾‡c|ýXÆlû]Žgü@ÇŽgþH‚Çù’ï;‘õÏúQ?.äDöOtìDÖÏÚÒ!'³6•S9¿èK·’»‡–§¥%—_á÷œ_õí3yl]ˆØ§-ùyŽý¿çðc§´ëœarJ;ïwýú{èZâ9øýÅóîÑ÷ëï"=3íËþrò²ôP`;%˜ïÅXË­?êׯŸGÀ“#PŒÛV†«€ AÅzfj6d¥åBfZ _Ï…¬t!yÁ$ §%íχM²5Û¹Yºäd²ef´¯òP² ùº´ÌÏ)‚ülÖ"á’I^v‘¾¯ ÷—œ ÊúE(DÉ3Xæ1¦•o. .qÉ¿äX×¶/þå*òv1üYä*—ŠþdÇ.](†¿.[rùKYK±Ëùâ:(^(vœ#ß×åYø3\(àÏyÁå]Šé= ¤à¯“‚Ú ¯@Œ ZzoÒɽ¾&áIA° ¤‡T’ZâvJª¶Î÷á2MÜŸžÁÀD’ti™ž™Æ–i|©I†¾L‡Ì¬tÈÈJƒÌlöl´Î%3+ƒöee;/i='“$—b;›KvNääfѱl\æŠm¾ÌÉË6•ÜüÈÍËáK!Úv^A®³ä‹eä³e~až³ˆ%?V€R”Ï¥0Ÿoæ»JQ¾Á¹Ò¾B×ãŽ{‹Ë³ËÏÏßÑÓßzêÚ +© €ÈàëÔ`¾0Õ˜Ž“B’dh¢m§gddjë™Ú6SJœ@2#K“L>¡¤¶ž™™YLø2ÛI²³œ%‹–9´ž“99Œeà2;—¶ëì£ÍÍãËœ<&¹\´í¼\öáææI’Oç£ÐXwC)М`Ô Á1ï´^PH3çÒR^çË¢Â"I.(Ûš]€ E ði)‹Ñ>õ¸zÎEº^¡týBeIë\ ôç–¤ïÏ7iýK uëÚИµüØú€™°´§s71ˆC°5çf¾Í¯á4iÉZò qýtå^l=3ƒ„€H¬K‘‰YY ²p)K‰˜‘6+×…d;IN[2ÉÉÍ¡õœÖbÓzM_í¼žk:ç8æbççé­#ÅÅà2__r)àRXÀþGgáû µíB]è?/ë…ºjRTä8¯Èi»Pÿ^Ô{9îé¸_~üÜÒ3ómz“Öß“ €Çÿúë d0;pݺQø]™Ò˜U„`•_ýµ©ÀSZpoC=ÏìðÈÊo&x \Ê€`dfÈûQÑÍD(»¬ôb¿ªì¥Ï1qL(»,b¿˜‚“AWt nU îX½¾§çu÷¾FÊïŽ%½â€L‚#ãâ✀Q(°/Óƒ—ÔÁ@Ü/Ú™ XOÊO­<2ÌÀQ__AÀ“By ¾(¾Õ{XyV_À›^Áüü®p L*°bÈûÜeò”À"+¼ D(·`È`àŽXùC÷ÌÒ ¨Àà-«(ië/@Ð]½X€(³Š!€™€pD ¨&€/>1˜™ 3O`ªâ{ fL@(»™9à‰ˆVÞÀ¥lëûÊ<€8î«âºSh+Ǭ´ü¾¶þ6x.†€" 66Ö°Ò€ýÿª p¹€Àª— ( •½$ À“r”¦9PÚ`Q–Êo`’(Ê€ÆÌö÷ ¬0y€/‘€e %5ÌÀÀ¬‚AY²€’8ËRñ­€ÓÈ*°@Ì€C‚ûôéSf&€U' sZðËÞô¨Â’:€ÀŠàߥ¥ü6”¼¸kù½•˜”Íw À[ÀJw ‘ò{kÈûÜ1oA@õ øÚPš¦@IƒÞ*¿Ùs©Jî­òcÙྸS|¤ÿT18"°wïÞ°sçN À[3Àð•å—¾4ü¥a˜+io@iƒ@i±oïgå=|wiÁ¯x&€f€7`dxÊ `u4 *±; <ýÞ˜VÀ¨W ¤ÝV{Ôõ’€*€ Å¾ŠU&P’{”†ò£`½™15èÖÛnePÇ™à€ ð°2EËo…¸¾0+~£h@oü²CЊ)àMo€”Ĩ€'@ø'Чç6µnDZ7lÐó ÄÄĸ€@xYùB‚Õ` u8°0„È @¦ì%€’vzа ê>+ŽÀ²6Ü/aõ7fçY}n+ï/êÊN›„Û`½zõòÈ|$@ùêðÄ8_üâXIÍwÝ‚îÆøâûäcbÝ….ma¬¼Q~ï€W8 UVJ1¦ÃJA°cÇ ûä¥ ­¾ÌPÑÕœ€¸Žç{ ªOÀ(,X#6`d”„Xé4rªµº¿$LÀ ÊÒD}f~Š’*¿¨CCpú4Mz«šulp€ž={ZfÞøD(°•@ ’2³nÀÒŽ( ðÆ(mSàrû¼y>+`g”Æ Àx8ðß €À¨¿H“<€:¿ŸY\.Õ¹… ]m ƒXKy4  f Àª) ‚™`4rÐP™€™ƒÐ xc[—%xº§Ù~«ï¨šKfN@#€ßúÏЀ€‚‰@¨&€ pB1圸®*©ºE6„ RªŠ„bÔ§ïÍ_3‡žû•#úÔ¥ìÄ3káÍú÷­´òî¼ÿF¸º.Û÷êzI™@i‚/Ï`ä¿0óg8× _’Éái,@? jÛ @= {¼n´ß½…}(ÿΛ{y{¾»s­Þ_>^Z÷.ɹ¶‹K€3($¨SçÔƒ+®bÊÿ—¬$•ˆŠ,id˜…+ë–$RírüÆ–Ë_ŸÂ @¦P\\lšØÎBpIfÝ»w‡¯¾Ú¢"(‚F"À¥u[Þ§.ÎSE=fv®Ù==‰Ñu­>¿§÷qwO_¶îgåÝ­<Ÿ»ºV÷¹ûÿ¼Ùoõû0{+ÿ•|>†#à¾ãÇ*>úº°»›}ëpôkµjÕbQ¨(ëÇSúÄÄÄœÄÊ`¨xIó?ñÄz(0Š'»¶4ÄÈ66“ Ú¦­üE¯dØ=‚` Uœ-¶ü+Eû޾s»»‚ìòÿ±”/gÛ^•ò¶ØòÿHìb»ØÅ.v±‹]ìb»ØÅ.v±‹]ìb»ØÅ.v±‹]ìb»ØÅ.v±‹]ìb»ØÅ.v±‹]ìb»Ø¥4ÊÿwCE°€yHIEND®B`‚gtkwave-3.3.86/share/icons/gtkwave_files_256x256x32.png0000664000175000017500000005224413166335473021746 0ustar bybellbybell‰PNG  IHDR\r¨f IDATxœí˜TEÖ÷›fÒs €Š(Á€ 9g1gÄ@Pãš•œL˜×}¿× ¾»kT‚¢wÍYŒ„ À ¢Rßù×½u§úöÍ}; UÏóŸî™é¾±Î¯NU:7QEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUTQEUT‰§TÑ Þ¦úXTQ%ŽRE’*nÅlôøUIÉN¦ºó·4,i€)+Uô»‡—êÕ«g“ré}6ý©*)KI)ÓDõ·zVVVnÕªUs$8)˜‹0~ºPÕpÑÄß³³³#¹¹¹‘5jø¾†‚ì;™ÊÉÉá2ÿžŽÂý„œþ—n¢†ˆËü»Q}–ëx5ú=[üš\ KïÂ/F5*ô’…Êp"•+®¸béwÜñÊòåËÿ»dÉ’—.]ʵlÙ2.ú;׊+ ­\¹ÒЪU«¸î½÷ÞÝwß}†¬þ/¾ ÉÛûû†Äñˆãƒp¼ÐâÅ‹c´hÑ"®… r-X°ÀÐ=÷ÜÃu÷Ýw|×]wºóÎ;¹èzºýöÛ¹n»í6®[o½ÕÐ-·Ü¥›o¾9F7Ýt×7ÞÈuà 7p]ýõ†®»î:®ùóçs]{íµ\óæÍãš;w®¡k®¹†ëꫯæš3gNŒfÍš¥™3gºêª«¸®¼òJ.ºÿ†.¿ür®3fp]vÙe\Ó§O7t饗r]rÉ%\_|1×E]¥ /¼ðã .¸ JçŸ>×yçgèÜsÏå:çœs¸Î>ûl®³Î:ËЙgžÉ5mÚ4®3Î8ƒkêÔ©øý£ &l0`ÀC]ºtIðà yÕ­á0+Üø«—TºuëÖ‰ aýŸÿügöä“OzôÑGÙC=Äyä‘(áï=ö×ã?nè‰'žàÂ÷Å+m'JùË_,eþ¾+¶#$ö#ö áXÌLJcZ½z5׃>ÈõÀpÝÿý†D\.A‡‹ ÃEÀ1DÐá"àpp h¸4\Ct}¹4\.!‚ †‹@ÃE á"Èp\ ýéOâ"¸p\¸.†0\.‚‹! †‹cˆÃE€á"ÀpT Íž=›‹ÀÂ(†*\.Š!‚ A…‹ bˆ ÂEPá"¨pT P¸*\.‚ ÞÓçá³S¦Lù¢C‡§¡žräúXáöSÃÏÝ¢qãÆ 'ƒ+ƒÑPåÿ´ŸŒáËA!2 .2(.ú¬¡‡~˜‹ ÐèA2P.¼'ã5^…ð»ü?ñyHlGlûljãÇIFmˆ ›‹Î…‹ÎË77¶!2îƒdØ\dԆȰ¹È°¹È¨¹È¨ ‘as‘as‘Q"ÃŽv”ÈÀ’qG‰ ÜùA2ì(‘q$ÃŽøA2ì(‘aG‰ŒÛ88¸!2p.2p.2r.2pCdä\däɸ ‘s‘s‘q"ç"ç"7DFËEÎEÎEFmˆŒœ‹<.ò¸Ècà"ïàWòö“·ðy¿ ½{÷ž‰úŽqa )2Á”£Ï×>}úOÆ_NÆð;ͯz«y­)!Ù½Ù[lÑŠË­ºÙ 0ÿO|Gnýe/Cnù…Äq‰ãôâÈ^€Ù^€Ù½³ {‰ò„î€ì¤Â^>C``èwòöcÇ{ì™zý?|Çt +//¯*Uötc8c¡×Cd,‡¨¢"Ã8DÆÂ…¿A€DÆEFgˆ ‘‹ “‹ŒÕ°£ÄçÄw!±=±}±Oq 8.qœÎÂñCdÔ\t®†È¸¹È°¹p¾Bd܇Ȩ¹È¨ ‘as‘as‘Q"Ãæ"Ãæ"Ãæ"£6D†ÍE†ÍEFÍE†mˆŒ›‹ ›‹ Û÷!2l.2jCdØ\dØ\dԆȰ¹È°¹È¨¹È¨ ‘as‘as‘Q"Ãæ"Ãæ"Ãæ"Ã6DÆÍE†ÍE†ÍE†ÍEFÍEFmˆ ›‹Œ’Kw׹Ȱ¹È°¹È¨¹È° ‘qsQ«ÏEFnˆZÿC'N䝸yŒ^ÿ8ãŒ3~§ïîlC…•ÔZb’‹pý©ÛÏ] Ñ£GOC+K†P®ÿ¢u|óÍ7ÙöíÛYqq1Û¹s§'íÚµ+!²ÚŽËMEEETXXèI†vìØX¸Î^µmÛ6C[·nõ­_~ù%~þùg®Ÿ~úɳ~üñÇÀúᇠ}ÿý÷¾ôõ×_³W_}•{dôÜøÂ~x\€úOö_C˜FŠL2éEÌ÷s÷‡ZgáFS‹ˆþ>Üd´”ì›o¾a(üñSE•L+‡⯀+ 0mÚ4ÞÀx øªN:Ùº-¤Ò“_„×Ó¸qãr·è}àßáÀý]»v-¿x¿þú+Àï¿ÿÎ…÷é(q|~ôÛo¿…¦ƒ&]¸7ÉÖ’ªòòrßÚ¿?Û·oÿþîÝ»y=†'0aÂ>.@†ý®C‹-ŽÔí¡šn‡ D¿§Q£FÍ©µß«}k>ÀõÙgŸñ C1S5]•‰ŠGa,]AçPòwq¼¢C—­?uøXu 0£ÀÄ´àá4¨üeeñ)òZ‘á—‹QpÝ`Ÿþ97x\DÙðU±/‡ðÜ d÷·  ‹xo㘠×_àWŒ´oß~ìàpšŒy–øâ‹/ø…“€›åu Ðë``II +--åÚ³gÞ{„‹'ËÏ ¢ù»JîJÔo˜ÅpÿÐ%@ݵÀG1v à\P btÕMøœ•¾ýöÛ¨ß1ºkiÆè/>ç¤ï¾ûÎR[¶l±”ùÿ~G”Í’G§ÃR<£åJ?òÜ4*ÂPˆ-=\T\`;#s3.+£Ä1Oaš*†âgêÊJb ,LŽSŠê îŸìV?S ?Õ†˜NRð_l€ð_?ðjøA¤åO¥á+ƒO½0ŽäS§NUÀ+@†ï~ _¸ò~ ãOWÃOµ!eªüÌ(ØëåÝÄø€Ê2%˜jã© RðV, ’`¸ÀK€Ý´]ØP†ŸXcŠW éY’«ùø0lã¯,F†a‡-€äW µU""Ã@¦þánäɃ€·’P8EäÅ €L3|eìɃ€·€U«V•‹$˜ñÀ-$7(’Ùê§»á§ÚøÒQ þŠ#Ì/Ü ?jãÊ$‰u$ ÎÅâA~àÕø!óB"7$Ãø•ÑW)x+®@^{/ðcü0h¯ÀÍ<ÜŒ?ÕÆSä€sÏ=W â<Ã+ü¿Wˆ¥Á~ ?™Æf…MùIG¯ÜŽE ñ%x@¢ æ¹@NâÇøñ^­LýôcXžPP@ûöíñ,< Ä 0¤ ÆïsF ¯ÆˆßqsÙÊÅó°!ùá!‰”ׇ™¤£ð0\++ïH ¼â <Ó.^XµÀv°J æÕøÑj ³Ð¦M›ØÆ-õú믧To¼ñW˜Û’…s—eõ™LžB…za7 (x+¶Àƒ/¬Ò‚{€ n•N 7Æ+ìŒÿ_ÿúûÛßþV©õ÷¿ÿý°Ðÿýßÿñ{êf (x+1 Ã7€UñÀ©.@¼÷ s?Ûà G«ñ׿þ•ýûßÿæ•çŸÿüg¥àv8çúÌ3ÏpÀÓA—€÷2p(wóð7à±` &ˆG_Ç·A8aô"¡ˆØ ¤ ÀåE Y™jcL5ÐmSH\qžgï^FáÍ©ÄÜà4š.º_~ù%{úé§3ÎM¶:Þüã SªÏ׫p¬¸§ÐD=xT¸ž¨@X¾|9’€×äæ|‚Nð2¥&C­Æk¯½æYëÖ­K¹Ö¯_¯$ ÷÷Òoÿ_À_±ŒšÀë,€ŸÌ=^€÷¸™~æÖƒ´j:0ý„i@»¸G ‰)¶@"`áÂ…ž<?ÆŸˆ`á $2'B}ã‰L‰sEèS¦LQÀ+@†ovÀ{¿Æï¢•ô+ã ÛxÓÑ “¶›l‰ûïå³ Á‹%`ü ,pô‚¿d¹Àlà¢õËøÓÍðSm˜É’ð‚~WÀ[±–;ï㉻·nú}^`eàø;>/¦ãýO—8ÿTÇä§B¸  =Qwðˆy3°}­D aÆQ@@P¼°3.3 ¯°3~´|ð{þùçÙ³Ï>›2=÷ÜsJq÷ï…^`ï¿ÿ¾QSb@†_ã¸çž{À©u5?UÈ+¬ZGÑòòÉ'ì©§žâ±É”ÂîåG}Ägw¯c^pÎ9ç(D7÷ÚüT!/°s±=Üt„"€ÑdÉ4ÊTG V6áš"š÷1 ‰+¶À2à ðÒ¿6çt€SÿXàwÞaÿû¿ÿË+O"Ãhåmc_Já סÀð6oÞÌŠ‹‹y=P¿Ä€ ß"ï¾ûn_ð:Àö½)Ÿ p3½–a»kÖ¬Q+ò*‰^zé%~_Q'„Q›ëF¼ )˜ã—ðÙgŸy€ŸÑu/7Þ+à&bŸ~ú)ûðãôßÿþ×xïý ýÑ úøã•|uNÌX¿•ü`Ú´i$T@Vú€ß©57ˆ0V/ƒðšˆÜxÃZÃÜáÃEæ 0¿Bƒ à\b@†owÝu—\H+™Ww€,7XÍ!‡=§žA@©ÌI…â]gm(8KÀøí€ æ¹|; Åô ;ƒ ÃðSý—©†ç×Uw’y<(Q8ýôÓð*«íðÇð÷ñDÔYÆãN†o…Ž·‹W=ž®Bª\î;w&UNÇ‚ë¼àŒ3ÎPÀdøxçwÚ@¬¼ Nkän-7–/#(€ á\ƒ ³%ñ|7YÂõIw! kPˆ+¸KÀøÃ€S¬¼ ñÞ œŒÿG‚x2ÐnJ—ó¶:ŽW^yŘ õA Üb ,ND>78µøØn:bÇ„@?z©Î§d@îBwõÀ\7œ€ Æ¼•á@@ÐwÜn«åÌ©ÄÂBÑr áUÅïg¦poD8÷† `7 ¸€ `üñÀËrY¯ÀÍtëó €­†ŠáÏl‰{oX^`5…ì’€° ñ~àu½¼9Ÿ ðÞ ²pÃß}÷]î>ºÅ›ã3^äç³Já ˪áþû5zsãax”ư‹Ç~áÙò©~ƽü¬ûTèÅ_ä×iA63]nc'NTÀ+@†_ã \\‘ñG^)èñÞ N­«hù±lù¯ýkÊsÚ¥:Ýö`\ ŒßÀÀõqëW ¥²o¶'à€ÓO?]?¬€U€n°Êèc)÷—íEB·.€°=|a£ A4Y*ŒPÞg*£±DCâx0§n€Tò% nP€ pà 7xŒ‰‡: ??\Ñ—_~™}ðÁ1Ýs-;ˆ>½ð=¤GRPTþT…Ѧ:—„ã@(-<äÕ+))á×Ñíi<é¨d ??_€ ¿ÆE@^ ÆøŸÿü‡=þøã\ÿïÿý?^ ‘Ý@Ÿ ¼@ôã¼ ´‰ECx˜D<¡¸XLäWéBl¥5kÖðkš‰†¼tT0ñN[~\TÄâÿùÏæ­0ZT@äºuëx‹Œ´Ýh`ðb=@GÆñ;ô¹ôâ‘b~ä÷ñca?’ÌJ_~ù%¿†ˆªKGw?0Pp/1 ÃÀõ×_ï\L/ ñÛO>ù$…‡ñ#&+ô6oÞÌßCxª0nŽ9ë®òH®×é5ñ· ƒZABfÑ¿ö+ówÅ0TZZj¿ #Iµ¡¦ n˜Z|Œ Àq3¤ìBùý÷ß®ƒ¹ `¦¸Ân¥“Λjp$ÚÈÓ ¸fV@½Õ¢€V@L¢ €ÖÆo5 €WZþµk×òW ÆÁ°‘× k»qP8`; à€ÃÍø+£Á' n€@àÀ˜€€ ¿Æ/0þ|Ã@ Ž÷2Ä{)úüp÷ñ=@ÇçEÁͱzô–ðì*㯠†Ÿj£N Ü‹-° ³×^{­-ìúÀXa8û÷ïç\¼Çè·˜:”+&ã@¦¿2úð€`10iÒ$ü¨_¿~+2|ϰ[]'‡㦉©/ž²€“IÆŸÊV?ÕšN0p€ž„`üøñ x€ñcpPÈ+Í …ÄÊ=ócÅœPÙ_}b@ à^€éÀyóæÙÀj™¯æ%»B^£ÊãW†ŸŠmÛ¶U Ã/‡ñÇ ·Äæd¢VÀû°P™Œ?†”È„ŸÉ‚Lž<™c ° ÓsçÎMÌ E­½ ÓŒ?Ý ?ÕÙ \3»Y+¨.€ ?}ô‘/xI«eÙ•Þ ‡‹ñWFƒOÜ0qâD€qãÆ)àUÆU€é €ÃÁøGÃV@ýEÝÓó(à‡®¹æˆàs€×¤šN]YVÈ$ãO•á§ÚhÓ~@ÈðËaüâüÀOFÝt@e4þTg:À &Mš¤`,N6`¸âÆÙ <ã÷€D¿2üðA €ºª`]\põÕW{€ß|úVÏ„a: ÊÈwÄh©° ÐQü•Œ´Ð› õ×â¢bWñWª|Åî*6ÞS%Þé];uñßwíæÚ’ì·UR¡Ý>$Ï×þ¼«;ÌBÓeL˜0Á~W á—Ãø± 0°}ÇV mc; \T¸øÒVXäQŬȳȣØYÈŠ}«ˆkç®øU¬Kû½¸B»5íJ€ø¶w™e>wyñd ¾ÊЗsŒ;Vyx5sæÌq@§é˜Ÿ+ˆW§.€ÙÍ/Ú±“´«B»XqÁngîf; K¼«¨„í**õ¤ÝÅ{<«d'´×·Jw•…§Ýel×¾4’v\^Ž—`€s‰¾gxiýíÒoYÀɈný·³o¶ȾÞþ>éM;œõ Tð_ú¶ð¿ìÛIÿû®ðCÏÚRôQ }_üqxÚ©éIß§P–Çápü?½7 .!êª&NœÈ º‘ Àø‘An@Ðg陟+h ¨E·þlÛŽŸÙ+[W²¶ÞÍ^ܺti{ñ{½DŸsÕ69|þåm‹§í‹Øší‹•vÈZÄ^Ù±‚ìü…-ìÜe?ªà^\0{öìÀpJÀéxo €_غ­«Ùš­KÙÚ­+HËHËmõʶµÒFÖŸmÇ*öêö•\xÿÚvâß‹ÕkÛWUl‹´®à^.ùýºº ¼ëµ±òó}ÏÚa£8¶)®E…V²õ; lãÇ7€ß{Ô«W¯~9ŒË€Ý`^áçæ§ ùÀk[ï§V˜ZI‚ÀË[“–Xj ´mièZ»}Y¸Ú-e¯ÐûWv,ÏLm_žðã_»c‡JÁ.oÀê­ú*@€1cÆ(¯f "pÖ¬YìÃ?ô ·ÜV0:{pÃ_C­?7r÷¶ÉZ¦WÊ0µŒ½J.¨¦åÒûT@^EyüÕü>­ô©0¶ïö´ÏášD_§å€ûXá®m¬dw)ÛµÛ}Ð à´iÓF€ ?)°z® ìˆ©?xñÇÅìùï²ç·hzáûEþô}çG“~0mç‡ÅìÅ0ôÓ¢(½ôóböÒOKØK?&@ضYŽßYZ¡Ÿbõ²~&¯ë“èoü{ò6}ûË?/u€ù+~0aÂ3`üÈ€€  ðòŽ0ðÒ/‹x¥xnËöfÙƒì¬YÃYn­¬eû&¬a³z¬i«†¬IËŽjܼkÖ¦!«ß°;yJ6ùöÎlÜõظ:±É·ufýÎÍg ×gÍZ7d[8oË“hÍÚ6d#¯îÀ&ü©s'6öúŽìô;dÝú·` è8p<8® ûÀqb è¸;÷nÆ&Ñyà|&оÆßDû»®#kÕ±ßGÓVÚ1ÉßoêCønsÚWÃFõÙI¸~whûwc'6‰®eÿóóY£&¸~Úg›º;îY#ºw-Û5aµê䲑gžÌÞ*[ÍḮh÷Âì`àw Ìœ93i]YVØ^°5›÷¯fcÏ;•Ñi°ìÕùk•*Uø«­ªh¯YÕ´Ï5¨.:¯9;튦ì´+›²!s›±cF×Ó>SÕe[>„ýrQc6hvS6píëŠ&lØüæ¬y—ܨãÇhúñ6ÌÏfC®iÆÐù š¥í¯ÿŒ&,»f–~B8}_ÄýÄ=«žS¿ž<ôº·ù€Æ§€2ÈðËaüAàõñ[APà€ñô畦F­þZµZUªxYöª–E.‹UË©Ê?ßmX6òúÖlð¬lðì–lÄu­Yñ éUXµìª¬J–ö< ÛªJû=õâflÈœ–|?¯lÁ÷Õ¢k-Úç"Ü‚IÛW„5j—ˆÍkÅ^Õ‚ ¡} žÕ’VÙĨ IDAT ¸¼Ë©UM¿Fñ¿~ÙÚõë:´¾~ýZêׯë1¡‘¯ë‡{†måÔÌæ¯}Gv xvÐWrŒ=Z¯2AW]uUÒ€.€9¦;…@¿¸<€.ƒë±áóÉ ¯jÆÎlΆ]Û’u[?<€ö—U½ o}û_Ö” ³:°iÎFÝØŠµî^SkýjfñcªšCÊö/ì£z®€¦j!¶$ØÐùо†^Ó‚<æ¬fýj¬JUºFYáyG ÊÓ¯_sýúµ ë× .à”áDz·ËæX¯z ^?0 lð€óã@×!õx«5ˆ*ï ò†ÏoÅŽç¯;©JVc'žÝ˜6£ yM¹×Ѭ³© ‚Q6hCFsÖïm_§‘ú^ДU¯¡wBª]¿¯Ÿ0¸¡øÞÐ0~üxdøå0~,B@P²!ì× ÚR^{ŒKWèûɦVyìmmØ´•íÙ•ÏÅf¯éÂf½Ü…Í|© ›óJWvÞcØäEùlê²vlÊÒÒ€¢ïbØÖ9u`³×jûÀ¾øþ^ìÂaÒ‚|V»aµ¸ALà~¯/¸Ÿíø]@òW^y%ЧüT¬å·ÀÛå¥ôíW­®}·Sߺlõo'±•%½ÙŠ]½Ù²Â^*èÅÿ~oYvïÞDÛZEÛĶÅ~–’°ï;{±GÙɬÇĆüتåL ¶³Ò’=dèÁ0vìX€Q£F)à Ã/‡ñ'â½SÀ[Ò˜„qM¸«-[^Ü‹Ýòqw¶ðÇØÝßÏüP¡{¶Ïÿª¶Dïþoýô8„sV¡cv𙇔 d7+))õ } ~X]]qÅqÀ*©§DgóÉȪN¸î­c8þ|[¼í¶ˆ^üX¡{ï×¼ìsñVzÝÚ“-%Ïà6AíFâzeR@@‰!¿ n€€Ö­[+8)•`ü¿ýö[ü¶þv°ê (È }þû…é ÷yqov×·ÔÿÜ“ZãØÂŸN`Kwôↈ×å;{³•»ÃÕ Ú&ß¾.ìû^ôKOvç7=تÒެDŽøºé~€ßdøå0~,F@‚¶þ2äŠV&X¹ÿ÷Q¿ü.2ºÅÔúÂÑ:_ûF76wC76ÓÑlÆÓG²óíÀ.üsGvÁã¤'‚ Û8ÿ±Žlúß;³k_ïÆæÑ>æmì¦uhß‹ €ÑªÒ>윇âë¤# 7Œ3F?œpùå—;zAZÿ°ðò/‹Ùk…+yܺ@¦Ü®ß| oå¹+N-0Zã¹ë»±~—4åÓsƒg·`ÍJ@$`mpÀåÍXß ›²«^èÂûþ€ÆŒÙ€´èð°Ø #GŽTÀ+@†ï ¸¨A_ÀüHq_ئ-â@º@¸ÿz‹Ú‘»ÿ½xë»x[O>ØÇàîÀsè5-ÙÈZ³ÖݵHÀprÙ:ìÑ€SW´gKvôäXBÇ3ñt2ú*@ü0Æ<š1cFšàÁ´€•û¯Éý¿›Üo=ö3€ €}µèZ3t Q~ 6tnK¾A³[ð÷·~[ôË \Ý€Ú1èd2ÆŽ«à€ÿüç?–]rª°> ¸Ž»ÿ=£Ýê“#pØ<2Î+š³‘×'íj°á×jÀ¾úOoÆŒnÀÏZ7³µ JŠKv°=¥{Q§fà÷Ãyyy­ÈðËaüXÜém~¨H\ÐÇ_¤ ·v6‹d¡5Ëâ£ð¶‚»\µÂ]î6¬~4®mÅzŒ×*0úñÜ-wÚž¾MPv-m›ûçYºÿç’ûc”ÐêØð×4é(€ZŒ7œ±¢Ö Ø"u0 åÔ®ÊÏÞ€Ûùò맇wjíWt-¼^?Ü3Ü»µ5ˆŸ:ºë-PRZÂã‚x£Gæ1b„^áÈ@DàôéÓ£€ /Øvn3ðꎕ<¡Æ»d3We=ÏÊcf´b§\Ô„õ»´9;õ’fžÔ÷âfÜH†ÌiÁä¸è=¶`åž×íœz)më¢fÔº7g}ÎjÌfüóH\n¸ÿw}׃ÜÿV|ÛØŒ¯øN_?ûrÓňÿoÎÏC[ᨽŠnZ~xð¥Ùkº²ÏiÂúã8.ò¿/\¿Áñ^?îÝ€-Y¯³ë±‹–œÂ6•®æy×Y ´´”Ë /RÀÙ Ã/‡ñ \vÙe¾àÖúÇ|&+8^ßõ»ú‰a¬ï jůmCýÝflèÕ-Ù«[xVTå•äg²°šð¶ÏŽ«˜öûáxcôÿ´ËµÁ¿A³¤ýÌ ¾/[Í©0F´ÌCu/`¦4€à è®oŽg£nl­Ë5þ÷Öõý>¯5;õòì²ûû²M%«yz·õ…Î0ƒÀ ¨ `ä@@P ±(²ô8ÆN¹¬>Už6là,}½ýœÞeQy…ñx•hCÿþô%äjo×FÜxË‹zñ¹~!>£ ²Ÿ çØ:ý騦­jÏa$~?ë#´c›§Ã)É×{ tï†ÍmM0oÀ¦ßç~€ß,p饗† ±²/ 0çѡ줋뱡sZó¬40.¾6Ý£äÖX6?Û@•Ëo¯zžZÙ"ÝýÿYsÿïüºîÿ`iŸ{ð³/OçDÛŒ1Hݰoýä8,‚’à\³®›ÀçàÒ'ûúA¸wCf·b'_RŸ]ºR€KÀ,§1ü¨Q£8†®€W€ ¿ÆE@AàÅøƒ@{J¯ÔøYÀÜ¿ cf7bcnÌçÉ(eƒRžt½6W>ØT‰á’zÞ†¤á¤[?én¸ÿ t÷þ›GómšÝì‚8Ž û³=Žk[F¤Þ À¾¯~µkL7€}skžØÃ×±Ø^¿–¾yØülômÙÀ9Øõco–<Äóø¼;@_¤€v@@Ð%—\’àO÷µf¹‰#Ï™?€åµŽ°üãê²æGÖ`­ºÕb-»ÖtT‹.5Y«£k±fsYÏÓq#„q@5Ç@^óιôí³¶ÛêFÿ?*—µé^‹5ÊÏa'Ó„»ûýG7óíˆÍ‡‡€©9±!zßûÅ4$ŽÇã¸/OçT“'éÜ/OƒÍÌŠ}@ø_ïi-­pƒ69¬íqµè:Òñtó°¯N¹ìÓõhøD\¿–Î ÷ ÷.¿{]V¯M6æ’žìí}óìÏŠïã÷;LP7@@ÀUW]Å€D ~à¥ïonõˆçŠÖ߉ŒðšÒJÿT׃ÆÜÒ:&øçŽ/{°ºMµcë7½™6è§”HTÁˆåÌŠ@ÓrÐï˧'Ñú˜<ó¾öZ ƒäX‘T5øõ«¸Ž¦8€aÝÙ;ak~YÆ6îÔ°¡ð€Š%`üð|ðÁqÀüt_;ØzNqj¨8€*X‰§Í=Ûªzž¦«Z ›8²èqè©RÕa[Bô™œZUÙ ïÃçÚyÔ’}œÿxGíøêVe}/jª¹Ì´ß–GkÀñà¸p|®û³ŽSD!6éP# ùê4Ñ@„¬A«öôá­?V·Q*×àpÞüúéûªhEÀqãúº~¸g¸w9µô8€QØ `gé¶wOY\9r¤~È Ã/‡ñc pñÅ'â½*Œ?ù€§H6‹Ø þÁ¨àZkËnûð.þ@œr¡ ŒÄtä@3šñ¤ ½ÕÆ’aq¬bm€h¹½¬ Ht$ • Pº§”<= ‹-°A]t‘'øqÿ€ täê@Î*{é!¯YÕ=@6J“D謈ˆg[v_Y…ûVõ´ªÍ²u£ªÂú^Ü”E [ͨãáÇçtüv’Ž·Qûh`èäÔÑÒo× ×Þ=†ÿB£ -Îq9i_Žp¸~Ñ×R@ #º³wݰg/)NÐ)à‡ jùC€ÙøýJ{@ pÝ[GÛºÿU«k¡ÂX,‚g’é` +qœUõýLZ˜¯WTt°D¸NcRoûJ”à€=†üKÀýÇÄ$"©HÆÀäþwê§-ý5Üÿ¯{ð>¶pÿ1°wºß¥ÍR €Ü,ã3GÈã‰Bù1ïkúDõßµë™þ! à^\pá…ºÀ¯ûïâ}:À¼ôî¿<úÏÝiôŸÇ¶NM¡€ŒCˆÏbáÒïÃ-”f¼& M7)¸—ë_÷?^ȹü+3diî?Fÿ{E»ÿOtŒ2$tR€ÚUcÆ+fîÝ#u~ñÞ HWÀ Pp.¶À" Ä\pÁ¶°rÿaÜòr_¼âw3ÌËHĸÿúÒ_yôîÿ”FQ^B:@ï˜g¨ÐÃC7@ sKêÖ­ÛŠZþÀ€a‹¿‰G|Èa¸ø[e€[âOóœºáN'ˆ–=‡º7¼w,ï,’fÎöÐ Hví)P¡ÄxܬD@Ìn?Œ\´ô}ô{ë­·Ø{ï½Ç¾ÿþ{?Ÿñž®Å3ÿ˜FÿW™FÿÅg1úžrHc¸nÀ·Ý€Û¾‡±ïñ7Ü|Ë«H@OØžÂÕ€6yÿÍñôv¹ö¹pq’<ój@=˜CIòLDëÞñ”ºQ3FÂP‡ÙËÕ€3Ã[ èŰ‚€€{‰¹þåpÿ± A~°qãFîêoذ½óÎ;ìóÏ?çcß}÷í`‡rô€+Ù ?.doîy]rÏ –r6ë>ª;jp]Þ¢#S­£Èè» «G•7|~“ŠDXÏ~uK³ßepÿ >Ë¿ƒÏÓߎUŸu8¹;ï±<’-¿Hü êIýô«» ¯Çº ©Ø'~(%Щº0]ˆãˆÚWIçtüĆ|Íœ|ÆyÌÈúÚ1‰} ÓŽ±û˜¼Å_Œó@7`Ëñ|zð²§äpÀ9ÃÕçß³¹~ƒc®Ÿö/ÇŽ{†{w,ÝÃv§ä°©×ÈÞÞ÷[»m¹‘À 2ì€ÆG-ÒŠ+Î=÷\OÀS|?ùäöÏþ“»ú7øúë¯ùg`¸xÿå—_òí`vc~êŒ@£ojÍ#ýà.‹ÔZK zòÄŸ0p$ÙDzqó÷¢²'1#ZgùÜqŒ£è\pòsD*3¤5w{þ9¤01ß´¯d gz«ôa~Ÿ7ßï  î%äú—Ãý÷ô#ñ;¼€µk×ò$"0záæñÅü† ;p¦ž0ôSý¹RÂPx5H&‚shuN!îÝP‚ø)Ó°é÷žZ€b ‹ôx Î…Ÿ`•*U PË © ðä0vÚ¬Flô ùlè<¸¹­¹!zÜr›.€Ó÷nùä8ÛÄŸxöß°k­¿“F[Ï¡‡ãð|Ì„n…eÀ⸆ÍkÅÇ2Ç”0t¡Hz“ý9Ùuü3îݨÚ²Ó¨;w9ºؽ·Ðꛀ}‰ñ¸ÿXŒ€ ³Ï>ÛdÀ˜ÑmÀgü.…mpSéƒlúâÁ¬Ó \ÖsRvÌèzì¸q ù(´£Æ4àsÕÜ2Òtͪ0þ~—6eÇŽÖ>ƒÏã=¡…Á/TÖeZë¼z\^Ü›÷•ùܤ†ôùú¬û¸è}b[p¹Íƒ€H@ŠãàûãrÜ.Â6°ï^g4ÒffE·È˜¡8VÞǸès8³»£Î­_íˆÑ~íÜ¢÷…ëÇ“œD]¿fQ×Ïý¸ò{wÂÄ&¬óà\væÍ'±Íeð¬À¢   ˆí+Û¯g ò @aäòÿaÄñ 8 ÑÓ€ý“2 (¦ÂÆÜÚÆ:ñg³èØót^ZMÚì#;W_"¼=z‰ð™÷›‚‚ì¦ÃJ :¼;{ï×GÙÚ­ËÉË‹ö€½eöƯà^bºäú—ÃýòR`!óïfˆ™·Y'L¸P@ZÙº¡iI/l…@–*,݆Zé‘lxh%>‹ï! týÛºÈKëhPD7ލ}9Ø1(Gß—ù»Ńs²õ@ #lêV3`„cÂ÷D† ìšZPÐäÅùàŒµŸKAAzȲ§¤ Ùzp“˱ãžáó95E Ðqì]”••),¶@uÖY f ¬€E(\Éž#¼sàa6þ‚ð=s,»hù:œ¬%þ”—þÞk±ôת…M§P`ùøŒðfý» aè®è%€Ütù8 Ü׃PV¶O `I8ì<;8uð+ ™yÿ'Ü»ôî^sÍûpJ ‘r\i ³xzówYpÎC¢@‘PŒð€2[/@À¹Ä€\ÿr¸ÿXŒ€ 3Ï<3íð|2 U`#óÙýK]Rh¥3Ì‹œøá½b‰ð ¼+€)ÂÚ «Åì+Õ°‚€€sI ˆ÷N(*,²À÷Æ%©¥Óbÿ{rÿÅvÒb‰°Ñ èµÎAtä<é3œK Èõ/‡û^?ŠÒºQŒ¿Ózôß‹ûIs˜…ÏÝÓ èm<7€C±Š@¦[ ‚¦M›Æ—ùîé´ãqÿ#ÛnÀ7Ýd ªÝ(z6 ] C@À¹(x€ÈžÛ©oôrYDÇÁý?átoî$“ Ïì4e *©xn€ˆ)èbžL1 ¬à\¢P§NVäú—ÃýÇ2`qÆé €Â•ì…ï%nPO"*¹9ï…ûo þqPºÀ,¤»ñ=«n€6 b’ €²"G(8—ŒÀº@D²‰,;ZÞûÇ~ÉÛµS&À½p»í³ãX­³‘€‰@ `ÿ¾r€8K Èõ/‡ûŸ9X•0à=âØÅç1ú¿Âjô߇ûÉ4H³V C±fA|ÏÀy(dN±ò hêÔ©qÀlü2ÄsP”BŒªo|‹|ä§þ ¸ý‹ãbòþ»)å°‰tºF<((&ahovÖƒG$vkÊ)8—Ðà§õ÷ € ã·À:Â^ ÀcÙ€e¾KMî¿Hü) ]ã÷Óx-@l\~ôÚ€)KÛ™Öôd·||ËÓ{Ž´_0úd¬0°¯Œ‡++1 ׿î?ò hÊ”)éᄸP¬Ï?a²æÞwîŸû/’ez}‚®¬LX (ÿOtp ÌÉOWî®H~Š<ƒ|_³Z„¼ð1G`©¹@°â Hð™vàiÁ—ÀÛûbÓ®ÀrDX‹#ë°úm²Yãö¹ÜvRÃü¬I‡\V¯e_ V -˜XÏ~òyM¨µ¬Ê¦.oÇ#àPù…û1€v½j³­sXã#rù¶Üö×HßϬ#òqb¿ûåñãÀÿ=mËáœSË_¿Ukß§Ù =Ó<8§ùQ5Yö5øƒC\·ÙÛÌa-ºÔdú°»±ö^¢áåæUåIPE>…AzŽÃÞÓ³úüúÔðtN¸g èÞ5ï\›å6аçõdïxŒ'ݨz‰¹þåpÿ3k¶-a¯¬b/ý¼˜½±ûA-#ÐÌlô m©Ò7ײÞayo‘M™s`¤H‚‰¾~tâO-EŒÿGe÷³¯˜Œ@³õŒ@>¶áEÃæÚdòq¼ØÆÈZqpX% ÆÜÒÆr?<£’Ïcƽu}º— Ù«û±Í{¡û(û[ ‚N?ýôŒÀ¦’Õ<)èI×cCç´f§]Ñ”·z¨´^•:[ÏÒƒ–S`ÈŠ#'É„œûHêË73ÖüìË.Q§Ÿmx:'›¤ ~¶1@Ïmˆ„¡g¬lÏÇAŒk¡ÃðÌûŽàÿ7¼ é:ú=fÜ»!³[±“/ARÐSu¬ŒÊdöì¼çjù3ð®~|ë{Y}6b^ªxTç´ä-¸W2GKä‰Ê \õüQ¼ïk$þÔ[=´Š0°¡ÔÊ ™í}?1)Á%o# k_ÂKÁ#Ï™†^CÞÐi3šWuT§a V-· «Q§cwæ¸ñ LL½=R‹@ƒzèÓ^ùÜQ|úOníûQqLýÕ¨[•?XÓm?†è³¹õªi 1Å´íQ›ŽÇåy›æsª¥SÕì,>ÚoŽÀó ðÔbLÖ¨£“Ÿã¯Ý¨š¶6€À¸àGxE'p\ýZ7ÖF3>hCÆ4 ²kשš§ë„{Vî]í9ü^ž6¡Ÿ|eÛ òò€{B,¶@Mœ81ýfÀõÚ=`œCt÷ߘöúV{êïùOø‹ý7+©qz$à  ‘€æ˜±6 C÷HQ‘úQ2ñ4 °r¾0¯¯¶€ Î%Ôò—£õÇ2`Äx€ßþÂp€œ\ ˆpCŵ­ä&`=ûðy­x×.¯ìþ#•ýÞÒ>¬×T-8ȈþËŠûqŒ¨ºu(pËn5£ÀRÅÏv%E"Ù‹··®FíªÇqßf–žä¤z޾6``ž‘0”ϘºbÌÀs ±=ú°†€‘ ‰,®À…yûí·3 f -WŒÈ€ñ<úl½5ó™»§›»?À— c  ïÚÃYÑ­’Çöxuo-b±P qÅXŒx\¨Lÿ=7‹õ½°)›²$ŸõœN¯¨¼\ô;þ>iA[vÉÿvbs^éÊçý凃\¨Ü<öO…ûï'ö߬Œ@LÂPm6ƒ€åµoÍ®zî(~-§ÿO\ŸçSIDAT½3›¼P»ÆÆ5—®=îº[%æûÈr÷Þ(~ˆP¬Bñ\\ñhp<ó/Ý ±ê«;‰/\¹o_ÞjaU[”Êúð´W˜Þ‚Ûh7?vùA{8&ÏüÓÌ[âO'e*ÌÊ®•et0=ºè'mF¿ókH××4æZïÕîîVT®>xŸmá«3³Ü=€ðJ Èõ/‡ûeÀˆ7n\Æ zõj†ñ´=¾¶¶‚ZpôåÁg'ü}Y®µ ½„‡ŸÀ+lî$Ã`5€ ÷lÑ ×lá×ÑéšÃs0V@At¨6²jÕ\°O Œ’Öï@o¡±n9µFw|Õƒ·è­F¥´*#Ÿ×Öç¶ñY pa*®nî$Ã1u0s‚Á¿Û>¯¸¾1×ÑæzÃkIU°´ˉµó§kTU %äú—ÃýÇ*ÀôÀj÷.€nW h›«Ïtä€z<ú,ýg †¾e…[‚á e<,ίȤ]¿æÚõ›Ó’=ÂÛõ«b ÚrT¥Ä€úþåèÿc0‚ÆŒ“шDD PÞbE)[ËCW]Ïkôðú|‰ïàÙ͹aÂ({LÔ"ÙªåT"ð@ øÆ1äã3r*«§_?í¼F\×’gYÂÿàÞã¼bîAõ*|~M[6|n[6æÆ|ÖgjsV3·&Ë«OÛªS‹Õ©§hy´¿AW´f#ç·e#®mˆ]݆öÛŽuèÙÕ ãÀÿk×vØFž³p^ØF.wÛ£ë³Ñ7hç4’ö5b^[6tNÖ°y~>uëyÛ¦ë¾jÔä×oÌMׯfMV·¾öY·íÕ­W›îI.ÝÃ<òL²ØI}ŒåÀ¯«iÀÐKZÀ-híö¥ìÕí+ØÚmËØ«;V°g¿]ÈþñÉìÿ>»‹=ý©µð?KÑÿþõÕìßßFë__c{w³~LÿúüK=ûÝÝìÙ-’¾¿›ýû+úßgÚÿÿýÅ‚@zæË…ú‚ôõöÜ÷÷Ä虯F}öٯŭç¾[ÈžÿaA”žÛ²Àñ;Ï|¹(ú˜%á|^ܲ„ç„áo(¾­/V³Ä€\ÿr¸ÿ“&Mâ ‚Fe4Ýð à•í˹5f]ÑJG­/^Å+‘¥ŠlDßÙ°“*àÎû| ©¬-µÓBÒÿ_ß}?oñüêèÁhí¶é3› ÒÕñ©ÄF߉9V“pN0|!*8”’¡ØÆÖm€­Ù¾„ °œƒ`íöeÔ%XÊÖluÖÚmK¹Ç`)¾ éÿ ñ#x&–*X«¨Ï¬äyð‚Ý¢(YÁÐü’-=k•X“l>ü~VÇs\¤×Ñö^/¶Ï¤à¯Ä€\ÿr¸ÿH"ðÖ[o¥¶³ Ûæ­ÿ«Ûï%­$­b¯A;ܵ®à^ÝgRÅß×Ó†¢û-ô€…¢ÿ¿‘*ºµœþG­æÎÕôÆ.衤h^=׃Üà+ôÛTüˆòB*Ž@@]¤4À6nô/m¿›½¼}!éÒöÒ6oÒ¾ã_kv, ¤µ‹é•Â%ôjÑÒÀz­xYÒì—pÏa·òÂ+µjÕjM®š ˆ°¯ Þc_n&½m©¯‹Þ±Õ7ÅïÒ·;ß³Õw»Þ·Õ–ÝÒ÷%ÿ±Õ¥ÿµÕ{>tÔO{?b?Úÿû¹ìcöI¼†¥¨íºƒã9”~Äö–•ò'9MÀPØÁááTÃ+ @ÿA#FŒp@r“‚jÚ]TÊJŠ÷Úªtg™­öìÚg«½»÷Ûª¬¤ÜVûö°Õþ½¿Úª¼ì ­ìûÍV¿îÿÝQËÿ°Õo9ê÷_YBõÛæz NÇó³3þ€8ˆúÞªU«°@®l•¹àÉþ«pâŽÈí`…Ŷ*ÚYh«â]E¶Ú¹»ØV»JvÚjwé.[•ìÙm«Ò½%¶ÚC­œÐîÝ·ÇVeû÷:j_y™£ö—ïcû$@.û…ÜŽççÅø`ì€P[·ª‘J œZþj€šôZ•Љ\ÿr¸ÿ¸@‰@°ƒh*."£,Þi«];wÙj÷®Ý¶*Ù]b«Ò’R[í)Ýc«½{öÚk/UT;•Q¥vÐ~jíT¾¿ÜQʸê׿†ª‡ý:7Œx¿ÇÖ?ÆÀ0yºmd믕YíÄÐòçêÐkuÀ‘düD'.ØA ^pCÅ–Â÷ì´k×Î/CŽ>´SI Tb©ÒR¨ÔZ{{öØjïÞ½¶*+Ûkóä[jÅmÂ`Åß¹±XJûîayù~ •G½‡8P.é€E¶b›Vû¬øŸ||V²3|+ã€ñÜ8²²è¶®€€@VŠl5ô·¦z¤âs ^ @Wºkãw€ÿÐ ` 6(Ö½†œŒÁû%x“7£·–×}¸o0öAhL¯ðŠkë6’£ÛLFw DŸF¿8ÁÚ€†x%àb ‚† ÆÞ|óÍŒ€»` w/ ¹H'øßmÇcüa eË–“ɲ Íè^qžn#5#ÙøkD*Œ'˜GñêºgâñÒ ñxnðÒªú5T'ÝV"Œ?¦äZÒk=R}ØE¤°ìHBÀªåljáëšâ•p<]˜¸8È„x€Ì@¢!†âuýCÀ° @kzÅ8@#ÝFdO F$Ã< ^Ø?\ÿF€x%ô”`èС ©Ý€TB ‘Æg’äòé^qÝFÌž€è¤ýÀ ˜ê~fãÇ 6!´Â+ 7~” þã™ 0Œ?dœ Û ´§WxÅÍ#Öƒi=E(úýè³Àm©Ñ6з{Âá$›Úà•p"õý ÿL@À!C<Ào,€0zdàp뤼K<Æç’4"t ×ºšê¶Ò@·ºº-‰ñ€´…€Ùõ£š¢o#ׂЎ^[NN¬ à………iå¤c7 l$~öFëkæç‘4!t¢WxÅ­uiªÛL݆êDÒ¼+ ·þpW@, ®?¦:0ÚÙŠp½¶®Y³f_2üpÿqa¬<¤#Âßý…aü~€ß À.GÒk]°Ñƒ‚rW -½§Ö_¸þpo@¸6¸ \LqÀµánހހA‡RÕ 8Ü!à÷¸‚L';h§ £®öº­´ŠxHy±t@F= Àý÷sVÈ Vp€ÁÿòË/Q²€€†•ÒÑ H4D Èq5þ8Ð=¢§H4äq«éÀ´€À ‡% eÀ€ì7Þ°€“AÚ© ` Õl`0ÂD·äéläaxº@ è1x=G+Yà§Ÿ~ 9((#àätÐð« €ÓN;-ÆÀ`< " «›&n–’RØ2{ˆv­Ì@1€fIö`¤âBÆfGëd.FQ:| ~:tÈÒ@wW@¾1˜QcæY1 ˆ‘KyPžÀ4 ºýÉøËpQ‡p‘ú÷ïÏ^}õUÃAá "PI)„úúûï¿sà÷-[¶ðinªç‡ôÆî7ÔõæÍ›#¸4 èw ­¦í€ÍqÀ‰Y½zõc‡ú∊¿ëc‡n»í6ÃVJJ™"ŒÅ îbÌå©§žâ ê7<]‚ÀƒßëÖ­;2¢u‰ ØA·üHt@Ú‡ÛEÚ ¢Ð^~jݧOŸ—õþï  aAГO>Éé JU2­ÀsEÙ¸q#núl×oø}ðàÁ_W«V 6Е„ÈXó ]$`Zæ°Špê ßƒoѦM›Ët2òˆ@º@ #Ÿ¼ì²ËØâŋْ%KزeËR¦åË—g¤V¬X¡”"áúÏ›7¯nÅ·Þ꣞—£ÿß­[·U° =€ÏŽE¼»ÿiÓÿEÎû/'uò0Ø+É=z ‚pqt¢ß%õë×ïЩ§žª¤”qBw-?ü£×ߪç;jÖ¬Ù‡l ³‹X·þÂýOûœVÙ€ìò˜µËËËÚ€Ýú©ˆ®Ö()e¢àÙÊ®?þ¯z"‹`ú*@±(?Û÷7·þi·P.n^€¼.'Ê—?êS‚m7n<ž.P¡>]òºÆ ;0tèÐ_M:¨¤”Æ2ê*Õß_áÕ¢>ã%lÛ¶íìˆfüèÿ ×??b½ Øj`Úµþr1? @^hî ˆñLƒp Ih¯^½ž#·‰Ï“JJ™,Ôc2ü?úöíûNƒ FG*Öÿ›ßù'ü§Ý »bžƒŠA²'p¤ž)¨u †wîÜyAÏž=Ÿ9ñÄ7‘ÞÒµÙ¤·môŽ’RdWßÌõ’××Þ½{¿Ôµk×{5j4…êv~DkììŒ_î÷Û¹þi5òoW䮀œÜœØÜȧ‹ÔQ¿@ù­$þ'b*‰q œÀk@HqWIÝt«¤”‰ú%×9ÔAÔEÔIÔMÔQÔU‘܆ºÝM÷tE}ÎD»ýVÆo~V`Úºþæ"YA@îȃ\ðªV­z4"¤tu'GêA:žt©'©—®Þ&¤¤”‰úÕKz…PQ'Q7QGQWQg¥z|l–6åÝ^’ÈúãfüÑï·+^ f@I1.Ñ.ZŠL)N­7“º+)%@æzæäˆÈ>‘놟‰vùEƹÏoÕò§u¿ß©˜! Æò"O 2w dˆ)fu•^Sí**UNÉuL¼—ß f÷jõÅóÅ€_FºývEŒ ˆùy žðd€§èq‘h ˆÕSL 袤” ã–%ê¡lð|L+Ráêˆo×êË£ý"Ô7ã_ùqávÞ€¢k ¼\ÔüH„pÌ7II) õ/?Rað¨£²Ñ W_´øÂðÍ­~ÍHôã¿*ñ‹"C'iö¬@R Ï@A@A€AÈXp¤¤²„ ‰ú'ê£0xÑÒ£î¢[¾<Ðgîï§ýT_<ÅÊ E×@À€?R< !±èHI)l õOÔGaðÂÅGÝF:-Z|;ÃÏŠ&ÀÉÂÕ Ü!\02„ÄcÈ””–là¢e­»lðf£­½ìê£ÎËî~¥nõíŠd¯@†è&(0É€h¢¤”™ \HÔGQ?Å žlô¨ÓÂðQ×k÷*¸pƒÄŒð dÈ@P0 7 ¡’R$ŒÛ,Qeƒ7=ê´ìê+÷)Â+0ƒ†Â;Pªin@ž’R$·,Q…±Ë:¬Œ>Ž"A†‚P¶I¸øµ”” aØf‰º(Œ]|‚KIY&áâ×PRJ€D¿]–\UIƒ"–$+)…­JeäÿY¡ç—„¢;eIEND®B`‚gtkwave-3.3.86/share/icons/hicolor/0000775000175000017500000000000013166335473016460 5ustar bybellbybellgtkwave-3.3.86/share/icons/hicolor/Makefile.in0000664000175000017500000004522213166335473020532 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = share/icons/hicolor DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = scalable all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign share/icons/hicolor/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign share/icons/hicolor/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-tags distdir dvi dvi-am \ html html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/share/icons/hicolor/scalable/0000775000175000017500000000000013166335473020226 5ustar bybellbybellgtkwave-3.3.86/share/icons/hicolor/scalable/Makefile.in0000664000175000017500000004525113166335473022302 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = share/icons/hicolor/scalable DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = apps all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign share/icons/hicolor/scalable/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign share/icons/hicolor/scalable/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-tags distdir dvi dvi-am \ html html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/share/icons/hicolor/scalable/apps/0000775000175000017500000000000013166335473021171 5ustar bybellbybellgtkwave-3.3.86/share/icons/hicolor/scalable/apps/Makefile.in0000664000175000017500000003531413166335473023244 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = share/icons/hicolor/scalable/apps DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(icondir)" DATA = $(icon_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ xdgdatadir = @XDGDATADIR@ icondir = $(xdgdatadir)/icons/hicolor/scalable/apps icon_DATA = \ gtkwave.svg EXTRA_DIST = \ gtkwave.svg all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign share/icons/hicolor/scalable/apps/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign share/icons/hicolor/scalable/apps/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-iconDATA: $(icon_DATA) @$(NORMAL_INSTALL) @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(icondir)'"; \ $(MKDIR_P) "$(DESTDIR)$(icondir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icondir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icondir)" || exit $$?; \ done uninstall-iconDATA: @$(NORMAL_UNINSTALL) @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(icondir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(icondir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-iconDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-iconDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-iconDATA \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am \ uninstall-iconDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/share/icons/hicolor/scalable/apps/gtkwave.svg0000664000175000017500000003701013166335473023363 0ustar bybellbybell image/svg+xml gtkwave-3.3.86/share/icons/hicolor/scalable/apps/Makefile.am0000664000175000017500000000023213166335473023222 0ustar bybellbybell## -*- makefile -*- ## xdgdatadir=@XDGDATADIR@ icondir=$(xdgdatadir)/icons/hicolor/scalable/apps icon_DATA = \ gtkwave.svg EXTRA_DIST = \ gtkwave.svg gtkwave-3.3.86/share/icons/hicolor/scalable/Makefile.am0000664000175000017500000000004513166335473022261 0ustar bybellbybell## -*- makefile -*- ## SUBDIRS= apps gtkwave-3.3.86/share/icons/hicolor/Makefile.am0000664000175000017500000000005113166335473020510 0ustar bybellbybell## -*- makefile -*- ## SUBDIRS= scalable gtkwave-3.3.86/share/icons/Makefile.in0000664000175000017500000005200313166335473017066 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = share/icons DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(icondir)" DATA = $(icon_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = gnome hicolor xdgdatadir = @XDGDATADIR@ icondir = $(xdgdatadir)/icons icon_DATA = gtkwave_256x256x32.png gtkwave_files_256x256x32.png gtkwave_savefiles_256x256x32.png EXTRA_DIST = gtkwave_256x256x32.png gtkwave_files_256x256x32.png gtkwave_savefiles_256x256x32.png all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign share/icons/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign share/icons/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-iconDATA: $(icon_DATA) @$(NORMAL_INSTALL) @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(icondir)'"; \ $(MKDIR_P) "$(DESTDIR)$(icondir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icondir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icondir)" || exit $$?; \ done uninstall-iconDATA: @$(NORMAL_UNINSTALL) @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(icondir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(icondir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-iconDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-iconDATA .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-tags distdir dvi dvi-am \ html html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-iconDATA \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-iconDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/share/Makefile.in0000664000175000017500000004517713166335473015771 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = share DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = mime icons applications appdata all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign share/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign share/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-tags distdir dvi dvi-am \ html html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/configure.ac0000664000175000017500000006227213166335473015103 0ustar bybellbybell# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ(2.59) AC_INIT(gtkwave, 3.3.86, bybell@rocketmail.com) AC_CONFIG_SRCDIR([src/vcd.c]) AM_INIT_AUTOMAKE AC_CONFIG_HEADER([config.h]) AM_MAINTAINER_MODE # ------------- GCONF ------------------- AC_ARG_WITH([gconf], [AS_HELP_STRING([--with-gconf], [Use GConf to store preferences])], [], [with_gconf=check]) # ------------- XDG ------------------- AC_ARG_WITH(xdgdatadir, [ --with-xdgdatadir=path Change where the theme icons and mime registrations are installed [[DATADIR]]], [opt_xdgdatadir=$withval]) if test x$opt_xdgdatadir = x; then # path was not specified with --with-xdgdatadir XDGDATADIR='${datadir}' else # path WAS specified with --with-xdgdatadir XDGDATADIR="$opt_xdgdatadir" fi AC_SUBST(XDGDATADIR) AC_MSG_CHECKING([if MIME and desktop updates should be disabled]) EMIM=yes DMIM=no AC_ARG_ENABLE([mime_update], [ --disable-mime-update Disables MIME type and desktop/icon updating], [ if test "X$enable_mime_update" = "Xno" ; then EMIM=no DMIM=yes else EMIM=yes DMIM=no fi ], [ EMIM=yes ]) AC_MSG_RESULT([$DMIM]) AC_PATH_PROG(UPDATE_MIME_DATABASE, update-mime-database, no) AC_PATH_PROG(UPDATE_DESKTOP_DATABASE, update-desktop-database, no) if test "X$DMIM" = "Xyes" ; then UPDATE_MIME_DATABASE=: UPDATE_DESKTOP_DATABASE=: fi AM_CONDITIONAL(FDO_MIME, test x$UPDATE_MIME_DATABASE != xno -a x$UPDATE_DESKTOP_DATABASE != xno) # ------------- Set simarama base ------------------- if test "X$SIMARAMA_BASE" = "X" ; then SIMARAMA_BASE="/afs/awd/projects/simarama/releases/latest" fi # ------------- Set fsdbreader base ------------------- if test "X$FSDBREADER_HDRS" = "X" ; then FSDBREADER_HDRS="/pub/FsdbReader" fi if test "X$FSDBREADER_LIBS" = "X" ; then FSDBREADER_LIBS="/pub/FsdbReader" fi # Checks for build options # ------------- Structure Packing ------------------- AC_MSG_CHECKING([if structure packing should be enabled]) ESTP=no STRUCT_PACK= AC_ARG_ENABLE([struct_pack], [ --enable-struct-pack Enables C language structure packing pragmas intended for use on architectures which support misaligned loads and stores (x86/x86_64/AVR32/ M68K/PowerPC/S390). This can reduce memory on traces with very many signals.], [ if test "X$enable_struct_pack" = "Xyes" ; then ESTP=yes STRUCT_PACK=-DWAVE_USE_STRUCT_PACKING fi ]) AC_MSG_RESULT([$ESTP]) AC_SUBST(STRUCT_PACK) # ------------- Tcl ------------------- AC_MSG_CHECKING([if Tcl usage should be disabled]) ETCL=yes DTCL=no AC_ARG_ENABLE([tcl], [ --disable-tcl Disables Tcl if found], [ if test "X$enable_tcl" = "Xno" ; then ETCL=no DTCL=yes else ETCL=yes DTCL=no fi ], [ ETCL=yes ]) AC_MSG_RESULT([$DTCL]) if test "X$ETCL" = "Xyes" ; then SC_PATH_TCLCONFIG if test "X$TCL_BIN_DIR" = "X# no Tcl configs found" ; then AC_MSG_WARN([Tcl not found, skipping.]) ETCL=no DTCL=yes else SC_LOAD_TCLCONFIG AC_SUBST(TCL_INCLUDE_SPEC) AC_SUBST(TCL_LIB_SPEC) AC_SUBST(TCL_MAJOR_VERSION) AC_SUBST(TCL_MINOR_VERSION) if test "$TCL_MAJOR_VERSION" -lt "8" ; then AC_MSG_ERROR([Upgrade to at least Tcl version 8.4.]) else if test "$TCL_MAJOR_VERSION" -eq "8" ; then if test "$TCL_MINOR_VERSION" -lt "4" ; then AC_MSG_ERROR([Upgrade to at least Tcl version 8.4.]) fi fi fi fi fi if test "X$ETCL" = "Xyes" ; then SC_PATH_TKCONFIG if test "X$TK_BIN_DIR" = "X# no Tk configs found" ; then AC_MSG_WARN([Tk not found, skipping.]) ETCL=no DTCL=yes else SC_LOAD_TKCONFIG AC_SUBST(TK_INCLUDE_SPEC) AC_SUBST(TK_LIB_SPEC) fi fi AC_MSG_CHECKING([if Tcl/Tk (if present) should be stubified]) STUBIFY=no AC_ARG_ENABLE([stubify], [ --enable-stubify Causes the Tcl/Tk libraries to be dynamically loaded.], [ if test "X$enable_stubify" = "Xno" ; then STUBIFY=no else STUBIFY=yes fi ], [ STUBIFY=no ]) AC_MSG_RESULT([$STUBIFY]) AC_MSG_CHECKING([if gtk1 or gtk2 should be used]) GTK1=no AC_ARG_ENABLE([gtk1], [ --enable-gtk1 Causes the GTK+ frontend to be built with gtk1 instead of gtk2.], [ if test "X$enable_gtk1" = "Xno" ; then GTK1=no else GTK1=yes fi ], [ GTK1=no ]) if test "X$GTK1" = "Xyes" ; then AC_MSG_RESULT([gtk1]) CPPFLAGS="$CPPFLAGS" else AC_MSG_RESULT([gtk2]) CPPFLAGS="-DWAVE_USE_GTK2 $CPPFLAGS" fi # check for "fisher price" (simvision rendering style) mode AC_MSG_CHECKING([if fatlines should be used]) FLN=no AC_ARG_ENABLE([fatlines], [ --enable-fatlines Renders lines as double width in gtkwave.], [ if test "X$enable_fatlines" = "Xno" ; then FLN=no else FLN=yes fi ], [ FLN=no ]) if test "X$FLN" = "Xno" ; then AC_MSG_RESULT([no]) else AC_MSG_RESULT([yes]) CPPFLAGS="-DWAVE_DOUBLE_LINE_WIDTH_MODE $CPPFLAGS" fi # check for massive amounts of named markers enabled AC_MSG_CHECKING([if manymarkers should be used]) MMC=no AC_ARG_ENABLE([manymarkers], [ --enable-manymarkers Expands named marker count from 26 to 702.], [ if test "X$enable_manymarkers" = "Xno" ; then MMC=no else MMC=yes fi ], [ MMC=no ]) if test "X$MMC" = "Xno" ; then AC_MSG_RESULT([no]) else AC_MSG_RESULT([yes]) CPPFLAGS="-DWAVE_MANYMARKERS_MODE $CPPFLAGS" fi AC_MSG_CHECKING([if ae2 support should be used]) AE2_CFLAGS= AET2_LDADD= AE2=no AC_ARG_ENABLE([ae2], [ --enable-ae2 Compiles in AE2 from env var SIMARAMA_BASE location.], [ if test "X$enable_ae2" = "Xno" ; then AE2=no else AE2=yes fi ], [ AE2=no ]) if test "X$AE2" = "Xyes" ; then AC_CHECK_FILE("$SIMARAMA_BASE/libae2rw.so", AET2_SO=yes, AET2_SO=no) if test "X$AET2_SO" = "Xyes" ; then AET2_CFLAGS="-DAET2_IS_PRESENT -I$SIMARAMA_BASE" AET2_LDADD="$SIMARAMA_BASE/libae2rw.so" else AC_CHECK_FILE("$SIMARAMA_BASE/libae2rw.a", AET2_A=yes, AET2_A=no) if test "X$AET2_A" = "Xyes" ; then AET2_CFLAGS="-DAET2_IS_PRESENT -I$SIMARAMA_BASE" AET2_LDADD="$SIMARAMA_BASE/libae2rw.a" else AC_MSG_WARN([AET2 library not found, skipping.]) fi fi AC_CHECK_FILE("$SIMARAMA_BASE/libaliasdb.so", AAET2_SO=yes, AAET2_SO=no) if test "X$AAET2_SO" = "Xyes" ; then AC_CHECK_FILE("$SIMARAMA_BASE/aliasdb.h", AAET2_SOY=yes, AAET2_SOY=no) if test "X$AAET2_SOY" = "Xyes" ; then AET2_CFLAGS="-DAET2_ALIASDB_IS_PRESENT $AET2_CFLAGS" AET2_LDADD="$SIMARAMA_BASE/libaliasdb.so $AET2_LDADD" else AC_MSG_WARN([AET2 alias header not found, skipping.]) fi else AC_CHECK_FILE("$SIMARAMA_BASE/libaliasdb.a", AET2_A=yes, AET2_A=no) if test "X$AAET2_A" = "Xyes" ; then AC_CHECK_FILE("$SIMARAMA_BASE/aliasdb.h", AAET2_SOY=yes, AAET2_SOY=no) if test "X$AAET2_SOY" = "Xyes" ; then AET2_CFLAGS="-DAET2_ALIASDB_IS_PRESENT $AET2_CFLAGS" AET2_LDADD="$SIMARAMA_BASE/libaliasdb.a $AET2_LDADD" else AC_MSG_WARN([AET2 alias header not found, skipping.]) fi else AC_MSG_WARN([AET2 alias library not found, skipping.]) fi fi AC_CHECK_FILE("$SIMARAMA_BASE/ae2rw.h", AET2_SOY=yes, AET2_SOY=no) if test "X$AET2_SOY" = "Xno" ; then AET2_CFLAGS= AET2_LDADD= AC_MSG_WARN([AET2 header not found, skipping.]) fi else AC_MSG_RESULT([no]) fi AC_SUBST(AET2_CFLAGS) AC_SUBST(AET2_LDADD) AC_MSG_CHECKING([if FsdbReader support should be used]) FFR_CFLAGS= FSDB_LDADD= FFR=no AC_ARG_ENABLE([fsdb], [ --enable-fsdb Compiles in FsdbReader from env vars FSDBREADER_HDRS header and FSDBREADER_LIBS library directories.], [ if test "X$enable_fsdb" = "Xno" ; then FFR=no else FFR=yes fi ], [ FFR=no ]) EXTLOAD_CFLAGS= if test "X$FFR" = "Xyes" ; then AC_CHECK_FILE("$FSDBREADER_LIBS/libnffr.so", FSDB_SO=yes, FSDB_SO=no) if test "X$FSDB_SO" = "Xyes" ; then FSDB_CFLAGS="-DFSDB_IS_PRESENT -I$FSDBREADER_HDRS" FSDB_LDADD="$FSDBREADER_LIBS/libnffr.so" EXTLOAD_CFLAGS="-DEXTLOAD_SUFFIX=\\\"fsdb\\\"" else AC_CHECK_FILE("$FSDBREADER_LIBS/libnffr.a", FSDB_A=yes, FSDB_A=no) if test "X$FSDB_A" = "Xyes" ; then FSDB_CFLAGS="-DFSDB_IS_PRESENT -I$FSDBREADER_HDRS" FSDB_LDADD="$FSDBREADER_LIBS/libnffr.a" EXTLOAD_CFLAGS="-DEXTLOAD_SUFFIX=\\\"fsdb\\\"" else AC_MSG_WARN([FSDB reader library not found, skipping.]) fi fi AC_CHECK_FILE("$FSDBREADER_LIBS/libnsys.so", AFSDB_SO=yes, AFSDB_SO=no) if test "X$AFSDB_SO" = "Xyes" ; then FSDB_CFLAGS="-DFSDB_NSYS_IS_PRESENT $FSDB_CFLAGS" FSDB_LDADD="$FSDBREADER_LIBS/libnsys.so $FSDB_LDADD" EXTLOAD_CFLAGS="-DEXTLOAD_SUFFIX=\\\"fsdb\\\"" else AC_CHECK_FILE("$FSDBREADER_LIBS/libnsys.a", AFSDB_A=yes, AFSDB_A=no) if test "X$AFSDB_A" = "Xyes" ; then FSDB_CFLAGS="-DFSDB_NSYS_IS_PRESENT $FSDB_CFLAGS" FSDB_LDADD="$FSDB_LDADD $FSDBREADER_LIBS/libnsys.a" EXTLOAD_CFLAGS="-DEXTLOAD_SUFFIX=\\\"fsdb\\\"" else FSDB_CFLAGS= FSDB_LDADD= EXTLOAD_CFLAGS= AC_MSG_WARN([FSDB system library not found, skipping.]) fi fi AC_CHECK_FILE("$FSDBREADER_HDRS/ffrAPI.h", FSDB_SOY=yes, FSDB_SOY=no) if test "X$FSDB_SOY" = "Xno" ; then FSDB_CFLAGS= FSDB_LDADD= EXTLOAD_CFLAGS= AC_MSG_WARN([FSDB header not found, skipping.]) fi else AC_MSG_RESULT([no]) fi AC_SUBST(FSDB_CFLAGS) AC_SUBST(FSDB_LDADD) # Checks for programs. AC_PROG_CXX AC_PROG_AWK AC_PROG_CC AC_PROG_MAKE_SET AC_PROG_LEX AC_PROG_RANLIB AM_PROG_CC_C_O # # for "Open Hierarchy Source" # AC_PATH_PROG(GEDITTEST, [gedit], [notfound]) if test "$GEDITTEST" = "notfound" ; then GEDIT_CFLAGS= else GEDIT_CFLAGS="-DGEDIT_PATH=\\\"$GEDITTEST\\\"" fi AC_SUBST(GEDIT_CFLAGS) # # only needed if user wishes to process various files with an external reader # AC_PATH_PROG(EXTDEBUG, [fsdbdebug], [notfound]) if test "$EXTDEBUG" = "notfound" ; then EXTLOAD_CFLAGS="$EXTLOAD_CFLAGS" else EXTLOAD_CFLAGS="-DEXTLOAD_PATH=\\\"$EXTDEBUG\\\" -DEXTLOAD_SUFFIX=\\\"fsdb\\\"" fi # enables .fsdb as input filetype in vcd2fst, and also gtkwave -o AC_PATH_PROG(EXTDEBUG2, [fsdb2vcd], [notfound]) if test "$EXTDEBUG2" != "notfound" ; then EXTLOAD_CFLAGS="$EXTLOAD_CFLAGS -DEXTCONV_PATH=\\\"$EXTDEBUG2\\\"" fi # enables .vpd as input filetype in vcd2fst, and also gtkwave -o AC_PATH_PROG(EXTDEBUG3, [vpd2vcd], [notfound]) if test "$EXTDEBUG3" != "notfound" ; then EXTLOAD_CFLAGS="$EXTLOAD_CFLAGS -DEXT2CONV_PATH=\\\"$EXTDEBUG3\\\" -DEXT2LOAD_SUFFIX=\\\"vpd\\\"" fi # enables .wlf as input filetype in vcd2fst, and also gtkwave -o AC_PATH_PROG(EXTDEBUG4, [wlf2vcd], [notfound]) if test "$EXTDEBUG4" != "notfound" ; then EXTLOAD_CFLAGS="$EXTLOAD_CFLAGS -DEXT3CONV_PATH=\\\"$EXTDEBUG4\\\" -DEXT3LOAD_SUFFIX=\\\"wlf\\\"" fi AC_SUBST(EXTLOAD_CFLAGS) # # gperf only needed if the user updates the gperf data # files which only developers will be doing... # AC_PATH_PROG(GPERF, [gperf], [notfound]) if test "$GPERF" = "notfound" ; then AC_MSG_ERROR([Couldn't find a usable gperf program. Please install gperf which is available from ftp://ftp.gnu.org/pub/gnu/gperf/ ]) fi # Checks for libraries. AC_CHECK_LIB([dl], [dlopen]) AC_CHECK_LIB([m], [sqrt]) AC_CHECK_LIB([pthread], [main]) # included or system libz and libbz2. By default, we search for the # system libz and libbz2. If not found, build the included ones. # The --enable-local-libz and --enable-local_libbz2 arguments can be # used to force the use of the included libs. --disable-local-libz # and --disable-local-libbz2 can be used to force the use of system # libs AC_ARG_ENABLE([local-libz], [ --enable-local-libz Use the bundled libz instead of any libz which may already be installed on your system. Default is to first look for an installed libz and fall back to using the bundled one.], [ if test "X$enable_local_libz" = "Xno" ; then force_system_libz=yes else force_bundled_libz=yes fi ], , ) need_libz=no LIBZ_LDADD= LIBZ_CFLAGS= if test "X$force_bundled_libz" != "Xyes" ; then AC_TRY_COMPILE([#include ], [gzdopen(0,"rb");],, [need_libz=yes]) if test "$need_libz" = "yes" -a "X$force_system_libz" = "Xyes" ; then AC_MSG_ERROR([ You have disabled building the bundled libz but no system libz headers could be found. Either allow building the bundled libz (by not using --disable-local-libz) or make sure your system has a libz installed]) fi AC_CHECK_LIB([z], [gzread], [LIBZ_LDADD=-lz] , [need_libz=yes]) if test "$need_libz" = "yes" -a "X$force_system_libz" = "Xyes" ; then AC_MSG_ERROR([ You have disabled building the bundled libz but no system libz could be found. Either allow building the bundled libz (by not using --disable-local-libz) or make sure your system has a libz installed]) fi else need_libz=yes fi AC_ARG_ENABLE([local-libbz2], [ --enable-local-libbz2 Use the bundled libbz2 instead of any libbz2 which may already be installed on your system. Default is to first look for an installed libbz2 and fall back to using the bundled one.], [ if test "X$enable_local_libbz2" = "Xno" ; then force_system_libbz2=yes else force_bundled_libbz2=yes fi ], , ) need_libbz2=no LIBBZ2_LDADD= LIBBZ2_CFLAGS= if test "X$force_bundled_libbz2" != "Xyes" ; then AC_TRY_COMPILE([#include ], [BZ2_bzdopen(0,"rb");],, [need_libbz2=yes]) if test "$need_libbz2" = "yes" -a "X$force_system_libbz2" = "Xyes" ; then AC_MSG_ERROR([ You have disabled building the bundled libbz2 but no system libbz2 headers could be found. Either allow building the bundled libbz2 (by not using --disable-local-libbz2) or make sure your system has a libbz2 installed]) fi AC_CHECK_LIB([bz2], [BZ2_bzread], [LIBBZ2_LDADD=-lbz2], [need_libbz2=yes]) if test "$need_libbz2" = "yes" -a "X$force_system_libbz2" = "Xyes" ; then AC_MSG_ERROR([ You have disabled building the bundled libbz2 but no system libbz2 could be found. Either allow building the bundled libbz2 (by not using --disable-local-libbz2) or make sure your system has a libbz2 installed]) fi else need_libbz2=yes fi LIBZ_DIR= if test "$need_libz" = "yes" ; then LIBZ_CFLAGS='-I$(top_srcdir)/src/libz' LIBZ_LDADD='$(top_builddir)/src/libz/libz.a' LIBZ_DIR=libz fi AC_SUBST(LIBZ_CFLAGS) AC_SUBST(LIBZ_LDADD) AC_SUBST(LIBZ_DIR) LIBBZ2_DIR= if test "$need_libbz2" = "yes" ; then LIBBZ2_CFLAGS='-I$(top_srcdir)/src/libbz2' LIBBZ2_LDADD='$(top_builddir)/src/libbz2/libbz2.a' LIBBZ2_DIR=libbz2 fi AC_SUBST(LIBBZ2_CFLAGS) AC_SUBST(LIBBZ2_LDADD) AC_SUBST(LIBBZ2_DIR) # ------------- LZMA / XZ ------------------- AC_MSG_CHECKING([if XZ should be enabled]) EXZ=yes AC_ARG_ENABLE([xz], [ --disable-xz Disables LZMA support for VZT], [ if test "X$enable_xz" = "Xno" ; then EXZ=no fi ]) AC_MSG_RESULT([$EXZ]) LIBXZ_LDADD= LIBXZ_CFLAGS= if test "X$EXZ" == "Xyes"; then have_liblzma=no AC_TRY_COMPILE([#include ], [lzma_end(NULL);],, [have_liblzma=yes]) AC_CHECK_LIB([lzma], [lzma_end], [LIBLZMA_LDADD=-llzma] , [have_liblzma=yes]) if test "$have_liblzma" = "yes" ; then AC_MSG_ERROR([LZMA support for VZT is enabled, but xz could not be found. Please install the xz-devel package, see the http://tukaani.org/xz website, or use the --disable-xz flag.]) fi LIBXZ_LDADD='-llzma' LIBXZ_CFLAGS='-D_WAVE_HAVE_XZ' fi AC_SUBST(LIBXZ_LDADD) AC_SUBST(LIBXZ_CFLAGS) # ------------- Fast Tree ------------------- AC_MSG_CHECKING([if Fast SST Tree should be enabled]) FASTTREE=yes AC_ARG_ENABLE([fasttree], [ --disable-fasttree Disables experimental Fast SST Tree widget code], [ if test "X$enable_fasttree" = "Xno" ; then FASTTREE=no fi ]) AC_MSG_RESULT([$FASTTREE]) FASTTREE_CFLAGS= if test "X$FASTTREE" == "Xno"; then FASTTREE_CFLAGS='-DWAVE_DISABLE_FAST_TREE' fi AC_SUBST(FASTTREE_CFLAGS) # ------------- Judy ------------------- AC_MSG_CHECKING([if Judy array support should be enabled]) EJUDY=no AC_ARG_ENABLE([judy], [ --enable-judy Enables Judy array support], [ if test "X$enable_judy" = "Xno" ; then EJUDY=no else EJUDY=yes fi ]) AC_MSG_RESULT([$EJUDY]) LIBJUDY_LDADD= LIBJUDY_CFLAGS= if test "X$EJUDY" == "Xyes"; then have_libjudy=no AC_TRY_COMPILE([#include ], [ JudySLIns (NULL, NULL, NULL);],, [have_libjudy=yes]) AC_CHECK_LIB([Judy], [JudySLIns], [LIBJUDY_LDADD=-lJudy] , [have_libjudy=yes]) if test "$have_libjudy" = "yes" ; then AC_MSG_ERROR([Judy support is enabled, but could not be found. Please install Judy, see the http://judy.sourceforge.net website or use the --disable-judy flag.]) fi LIBJUDY_LDADD='-lJudy' LIBJUDY_CFLAGS='-D_WAVE_HAVE_JUDY' fi AC_SUBST(LIBJUDY_LDADD) AC_SUBST(LIBJUDY_CFLAGS) # ------------- GTK ------------------- if test "X$GTK1" = "Xyes" ; then AC_PATH_PROG(GTK_CONFIG, [gtk-config], [notfound]) if test "$GTK_CONFIG" = "notfound"; then AC_MSG_ERROR([You must have gtk installed on your system]) else AC_MSG_CHECKING([gtk1 version]) GTK_VER=`$GTK_CONFIG --version` AC_MSG_RESULT([$GTK_VER]) case $GTK_VER in 1.2.* ) AC_MSG_CHECKING([for gtk1 CFLAGS]) GTK_CFLAGS=`$GTK_CONFIG --cflags` AC_MSG_RESULT([$GTK_CFLAGS]) AC_MSG_CHECKING([for gtk1 libs]) GTK_LIBS=`$GTK_CONFIG --libs` AC_MSG_RESULT([$GTK_LIBS]) ;; * ) AC_MSG_ERROR([when building with gtk1, you need version 1.2.*]) ;; esac fi else PKG_CHECK_MODULES(GTK, gtk+-2.0 >= 2.2.0) GTK_VER=`$PKG_CONFIG gtk+-2.0 --modversion` _gdk_tgt=`$PKG_CONFIG --variable=target gdk-2.0` # removed...causes problems with gtk-1.2... # AM_CONDITIONAL([GDK_TARGET_QUARTZ], [test x$_gdk_tgt = xquartz]) if test "x$_gdk_tgt" = xquartz; then PKG_CHECK_MODULES(GTK_MAC, gtk-mac-integration >= 2.0.0) AC_SUBST(GTK_MAC_LIBS) AC_SUBST(GTK_MAC_CFLAGS) COCOA_GTK_CFLAGS="-xobjective-c -DWAVE_COCOA_GTK" AC_SUBST(COCOA_GTK_CFLAGS) COCOA_GTK_LDADD="-lobjc" AC_SUBST(COCOA_GTK_LDADD) COCOA_GTK_LDFLAGS="-framework Cocoa -framework ApplicationServices" AC_SUBST(COCOA_GTK_LDFLAGS) fi if test x$with_gconf = xyes; then PKG_CHECK_MODULES(GCONF, gconf-2.0 >= 2.0) GCONF_CFLAGS="-DWAVE_HAVE_GCONF $GCONF_CFLAGS" AC_SUBST(GCONF_CFLAGS) AC_SUBST(GCONF_LIBS) fi PKG_CHECK_MODULES(GTK_UNIX_PRINT,gtk+-unix-print-2.0, GUP_F="yes", GUP_F="no") if test "x$GUP_F" = xyes; then GTK_UNIX_PRINT_CFLAGS="${GTK_UNIX_PRINT_CFLAGS} -DWAVE_GTK_UNIX_PRINT" fi AC_SUBST(GTK_UNIX_PRINT_LIBS) AC_SUBST(GTK_UNIX_PRINT_CFLAGS) fi # Checks for header files. AC_FUNC_ALLOCA AC_HEADER_DIRENT AC_HEADER_STDC AC_HEADER_SYS_WAIT AC_CHECK_HEADERS([fcntl.h inttypes.h libintl.h limits.h malloc.h stddef.h stdint.h stdlib.h string.h strings.h sys/time.h unistd.h wchar.h wctype.h getopt.h]) # rpc workaround for cygwin AC_CHECK_HEADERS([rpc/types.h rpc/xdr.h], [], [], [[#ifdef HAVE_RPC_TYPES_H # include #endif ]]) # Checks for operand sizes. AC_CHECK_SIZEOF(void *) AC_CHECK_SIZEOF(double) AC_CHECK_SIZEOF(long) AC_CHECK_SIZEOF(int) # Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_HEADER_STDBOOL AC_C_INLINE AC_TYPE_OFF_T AC_TYPE_PID_T AC_TYPE_SIZE_T AC_HEADER_TIME AC_STRUCT_TM AC_CHECK_TYPES([ptrdiff_t]) AC_SYS_LARGEFILE # Checks for library functions. (malloc/realloc removed to get rid of rpl_xxx substitutions) # AC_FUNC_MALLOC # AC_FUNC_REALLOC AC_FUNC_ERROR_AT_LINE AC_FUNC_FORK AC_FUNC_FSEEKO AC_FUNC_MEMCMP AC_FUNC_MMAP AC_FUNC_SELECT_ARGTYPES AC_FUNC_SETVBUF_REVERSED AC_FUNC_STAT AC_FUNC_STRTOD AC_FUNC_VPRINTF AC_CHECK_FUNCS([atexit btowc bzero dup2 memmove memset munmap pow putenv re_comp realpath regcomp select setenv strcasecmp strchr strdup strerror strncasecmp strrchr strstr getopt_long setenv unsetenv]) AC_CHECK_LIB(nsl,xdrmem_create) AC_CHECK_LIB(rpc,xdrmem_create) # some AIX adds (linker flag for 32 bit compiles) if test "X$OSTYPE" = "Xaix" ; then if test "X$MACHTYPE" = "Xrs6000" ; then CFLAGS="${CFLAGS} -D_WAVE_BE32" if test "X$CC" = "Xxlc" ; then LDFLAGS="${LDFLAGS} -bmaxdata:0xd0000000/dsa" else LDFLAGS="${LDFLAGS} -Wl,-bmaxdata:0xd0000000/dsa" fi fi fi CFLAGS="${CFLAGS} ${STRUCT_PACK}" if test "X$OSTYPE" = "Xmsys" ; then # add library for common dialog found in file.c MINGW_LDADD="-lcomdlg32" else # there are conflicts with struct timespec in pthreads vs mingw CFLAGS="${CFLAGS} -DFST_WRITER_PARALLEL" fi if test "X$ETCL" = "Xyes" ; then if test "X$OSTYPE" = "Xcygwin" ; then # skip Tcl_CreateInterp check on cygwin... if test "X$STUBIFY" = "Xyes" ; then TCL_DEFADD="-DHAVE_LIBTCL -DWAVE_TCL_STUBIFY -DUSE_TCL_STUBS -DUSE_TK_STUBS" TCL_LDADD="${TCL_STUB_LIB_SPEC}" TK_LDADD="${TK_STUB_LIB_SPEC}" else TCL_DEFADD="-DHAVE_LIBTCL" TCL_LDADD="${TCL_LIB_SPEC}" TK_LDADD="${TK_LIB_SPEC}" # cygwin tkConfig.sh has issues... if test "X$TK_LDADD" = "X" ; then TK_LDADD="${TK_BUILD_LIB_SPEC}" fi fi else if test "X$OSTYPE" = "Xdarwin" ; then # skip Tcl_CreateInterp check on darwin (until we figure out)... if test "X$STUBIFY" = "Xyes" ; then TCL_DEFADD="-DHAVE_LIBTCL -DWAVE_TCL_STUBIFY -DUSE_TCL_STUBS -DUSE_TK_STUBS" TCL_LDADD="${TCL_STUB_LIB_SPEC}" TK_LDADD="${TK_STUB_LIB_SPEC}" else TCL_DEFADD="-DHAVE_LIBTCL" TCL_LDADD="${TCL_LIB_SPEC}" TK_LDADD="${TK_LIB_SPEC}" fi else if test "X$OSTYPE" = "Xmsys" ; then # skip Tcl_CreateInterp check on mingw (until we figure out)... if test "X$STUBIFY" = "Xyes" ; then TCL_DEFADD="-DHAVE_LIBTCL -DWAVE_TCL_STUBIFY -DUSE_TCL_STUBS -DUSE_TK_STUBS" TCL_LDADD="${TCL_STUB_LIB_SPEC}" TK_LDADD="${TK_STUB_LIB_SPEC}" else TCL_DEFADD="-DHAVE_LIBTCL" TCL_LDADD="${TCL_LIB_SPEC}" TK_LDADD="${TK_LIB_SPEC}" fi else OLD_LDFLAGS="${LDFLAGS}" TCLSPEC_LHS="${TCL_LIB_SPEC% *}" TKLSPEC_LHS="${TK_LIB_SPEC% *}" LDFLAGS="${LDFLAGS} ${TCLSPEC_LHS} ${TKLSPEC_LHS}" AC_CHECK_LIB(tcl${TCL_VERSION},Tcl_CreateInterp, [TCL_LDADD=${TCL_LIB_SPEC}], [need_tcl=yes]) if test "$need_tcl" = "yes" ; then AC_MSG_WARN([ Tcl support not enabled.]) else if test "X$STUBIFY" = "Xyes" ; then TCL_DEFADD="-DHAVE_LIBTCL -DWAVE_TCL_STUBIFY -DUSE_TCL_STUBS -DUSE_TK_STUBS" TCL_LDADD="${TCL_STUB_LIB_SPEC}" TK_LDADD="${TK_STUB_LIB_SPEC}" else TCL_DEFADD="-DHAVE_LIBTCL" TCL_LDADD="${TCL_LIB_SPEC}" TK_LDADD="${TK_LIB_SPEC}" fi fi LDFLAGS="${OLD_LDFLAGS}" fi fi fi fi AC_SUBST(MINGW_LDADD) AC_SUBST(TCL_LDADD) AC_SUBST(TCL_DEFADD) AC_SUBST(TK_LDADD) AC_CONFIG_FILES([Makefile doc/Makefile contrib/Makefile contrib/pccts/IBM_VISUAL_AGE_PROJECTS/Makefile contrib/pccts/Makefile contrib/pccts/antlr/Makefile contrib/pccts/dlg/Makefile contrib/pccts/h/Makefile contrib/pccts/sorcerer/Makefile contrib/pccts/sorcerer/h/Makefile contrib/pccts/sorcerer/lib/Makefile contrib/pccts/sorcerer/test/Makefile contrib/pccts/sorcerer/test/test7/Makefile contrib/pccts/sorcerer/testcpp/Makefile contrib/pccts/support/DECmms/Makefile contrib/pccts/support/Makefile contrib/pccts/support/genmk/Makefile contrib/pccts/support/rexpr/Makefile contrib/pccts/support/set/Makefile contrib/pccts/support/sym/Makefile contrib/pccts/testcpp/Makefile contrib/rtlbrowse/Makefile contrib/vermin/Makefile contrib/bundle_for_osx/Makefile contrib/fst_jni/Makefile contrib/wlf2vcd/Makefile contrib/fsdb2vcd/Makefile examples/Makefile man/Makefile src/Makefile src/cocoa/Makefile src/helpers/Makefile src/liblzma/Makefile src/libbz2/Makefile src/libz/Makefile src/helpers/fst/Makefile share/Makefile share/mime/Makefile share/mime/packages/Makefile share/icons/Makefile share/icons/gnome/Makefile share/icons/gnome/16x16/Makefile share/icons/gnome/16x16/mimetypes/Makefile share/icons/gnome/32x32/Makefile share/icons/gnome/32x32/mimetypes/Makefile share/icons/gnome/48x48/Makefile share/icons/gnome/48x48/mimetypes/Makefile share/icons/hicolor/Makefile share/icons/hicolor/scalable/Makefile share/icons/hicolor/scalable/apps/Makefile share/applications/Makefile share/appdata/Makefile ]) AC_MSG_NOTICE([ -------------------------------------------- Configuration summary: FASTTREE_CFLAGS : $FASTTREE_CFLAGS gtk1 : $GTK1 gtk version : $GTK_VER GTK_CFLAGS : $GTK_CFLAGS GTK_LIBS : $GTK_LIBS LIBZ_CFLAGS : $LIBZ_CFLAGS LIBZ_LDADD : $LIBZ_LDADD LIBBZ2_CFLAGS : $LIBBZ2_CFLAGS LIBBZ2_LDADD : $LIBBZ2_LDADD LIBXZ_CFLAGS : $LIBXZ_CFLAGS LIBXZ_LDADD : $LIBXZ_LDADD LIBJUDY_CFLAGS : $LIBJUDY_CFLAGS LIBJUDY_LDADD : $LIBJUDY_LDADD AET2_CFLAGS : $AET2_CFLAGS AET2_LDADD : $AET2_LDADD FSDB_CFLAGS : $FSDB_CFLAGS FSDB_LDADD : $FSDB_LDADD EXTLOAD_CFLAGS : $EXTLOAD_CFLAGS TCL_INCLUDE_SPEC : $TCL_INCLUDE_SPEC TCL_LIB_SPEC : $TCL_LIB_SPEC TCL_LDADD : $TCL_LDADD TCL_DEFADD : $TCL_DEFADD TK_INCLUDE_SPEC : $TK_INCLUDE_SPEC TK_LIB_SPEC : $TK_LIB_SPEC TK_LDADD : $TK_LDADD CPPFLAGS : $CPPFLAGS CFLAGS : $CFLAGS LDFLAGS : $LDFLAGS LIBS : $LIBS MINGW_LDADD : $MINGW_LDADD GTK_MAC_CFLAGS : $GTK_MAC_CFLAGS GTK_MAC_LIBS : $GTK_MAC_LIBS COCOA_GTK_CFLAGS : $COCOA_GTK_CFLAGS COCOA_GTK_LDADD : $COCOA_GTK_LDADD COCOA_GTK_LDFLAGS : $COCOA_GTK_LDFLAGS GCONF_CFLAGS : $GCONF_CFLAGS GCONF_LIBS : $GCONF_LIBS GTK_UNIX_PRINT_CFLAGS : $GTK_UNIX_PRINT_CFLAGS GTK_UNIX_PRINT_LIBS : $GTK_UNIX_PRINT_LIBS GEDIT_CFLAGS : $GEDIT_CFLAGS -------------------------------------------- ]) AC_OUTPUT gtkwave-3.3.86/doc/0000775000175000017500000000000013166335473013351 5ustar bybellbybellgtkwave-3.3.86/doc/Makefile.am0000664000175000017500000000007013166335473015402 0ustar bybellbybell## -*- makefile -*- ## dist_pkgdata_DATA= gtkwave.odt gtkwave-3.3.86/doc/gtkwave.odt0000664000175000017500000536337013166335473015552 0ustar bybellbybellPKcK^Æ2 ''mimetypeapplication/vnd.oasis.opendocument.textPKcKðb,b,Thumbnails/thumbnail.png‰PNG  IHDRÆ߃ùrPLTE   "1 $" ,! 9(%&&35+=1"!*!4' &()&)5&1.'656-)31.688,,H+7D0/J7:E57X;@d?]a(cJ.kQ$qM*yU8aN:eV8x[>f`;~`D;6C÷¹ÏÄÙ»{Ï{’CHrÂïs¾ï¿ß9'ù/a1,‹Áb°,‹Áb°,‹Áb°,‹Áb°,‹Áb°,‹Áb°,‹Áb°,‹Áb°,‹Áb°,‹ñŸcìµ×ކåÈ‘_|kGŽVÕT;¦SȵZ­F«eÖš ýÐN¯˜5³¨5ê«0¨óEYkòÔæ†3ít;IQZjj*¯èÔY¢Dc6ŸÜ–ôä#¦Œƽw^ûùwì—òäz¼R.øBLV¬,F†1V,SÊŠšòáYq9,êŠ Å²Ò’’Væ)ÕZ‹I÷ü߀åÔž9Sª*­=¥äÇÅ|øçïž8üÒú¬L1AârQúÜéÙ0ôé+Ñzú¥r†AY¬Vk´ÚŠ ÐçI’‡ôòÌ”ïÍ_’””šž%ÚðÂ~ðƒu¥þöÃÒ·kÏœ*â<.Œ4uôªšw9öî/ÞAëׯ>-·¿‘• 4.)]ˆ»×g†¯.žv#ð­Cä!RK’õF#m±˜Lƪ}ëRR-Z´pźÌu/üí~𷵟|ôA‘¸öTí¶¤¹±±#\WJÐ4N7ÒUïLûÔÏ_|ñHͱ×2F̬D>ö G¹ŒÙûZ’‰P€$T=Uo¬·˜Ìhª9väùui`ëž_ÿ ÷w»Nü»ßÕŠrjO½Ÿ“²è{ß›û80B›O^hkSBœ/ݶ©èÔIQZÊߤñÆFcSDÔ‰÷×5žQmæ­? iê0cºòò2Ó-ŒOÊÆ€A}ˆÐ’»ÑHÁ$«I‹å¡¦ÇH²æØßÃG¼vÙ/@Ú×Ö‹OÒôÉý9oªh•(mH¼<+6ÚqK8©óžÉÙ&Þ¶qåkïžxï½÷Nüñ¿?vìèÑ7*å¢L¸sLì¢Ü µ¦‚$áCGfDƒ' Õ¦ã¦ã5†ƒÁ€ku¸B_ET½qdf?ü%×ÖKêÎÓ¥onÞRTgV‰²ô„(iáüùó¤0šœ•KcŸ~fåæœ%¼š«×¯y½»ûòåËŸ¾wôè¾¼<‘ˆ·rÑÜØ$eÀqa‚êêjªíx\Q©À!3¿^Y©RÉÁöI*ñÊ}ûö1… ~¾~}ž(0ŸnÞ¸q¥ßWÕb׉<þÊô¤Uô0†“¶m[9wÑæMé+sÈk7¿D64«Ï½öR^žD"gæ¤ H§ i`ª6¼«ÐétU…B®R«*%r9Œ?O¬Ú'—äÁ/yyyY™¢}ˆä%Há/fådf Ä?ñɧ—n.%ôy57¿0Õ8&P*7•DcteΦԅ+ÅÛDXóÍËŸ~úùÕî/‡†ã½õ/¾ƒ8ä*U‘·;“ÂP…ë`8NUUÊUz½jÆôè±D®–Ì®KËIòÖ¯áç/dñr9éé+çÅÄ<ñÄÓû‰Ê¬ªî/NwÐj!ižŽ¦SÅÍ›—J¨ä–k·®3UWŸ»Šé>±.í…ç¿ôpè ‚ ÁO‚$p~¥i‚P¡G®×zô$z›^Ÿ—É[—™™ Aµ²nRgyúò¤„Y(¢gói|ÜêÔ,&¢°¢ñm"Š w!üAϧ­_\k=×l:w”¸Þý.oÕsiϯ?|É“èÑÁJU$`pÀ` „ƒF¯ø•D,ÊÌÌÉäñV¬X´0nv|Ü“ ©K˜Ä›c2l›ñ×u¥ÆHk‰9Šå/þÖu`àêµsçšymh0ÎmXµ†Ç{>ï¥#¯½´>/o_% SUªV0|ŠÀÑðá©ÒiŒR½^>”GðÒV,šÇŒ>!}Õ|THçfšŽå©êÔyj’RËŒmÑĘÀçÆ¦ž¸y­ûæÍëÝ7!,††®*dL’ÑU•ûŽ«ÒCS(ÃÄ…T¹ ×CðKòôD¥DR©WÉ%ªR½œ8¹JR$óV-œ·tóæOÆcz)¨“™#ªªª¹Ös¢Êî ´˜ÉYr6Š™*eþ×@÷§¿l½ykhhxbll茔‰^qŽ˜¨’èi¡RÊ”Jq.tWju1³( ½J þÅ"Èf*•„8)G`’JÀ‘ m3ÓW¬\²ù'?ysi\êQ¥*2³¯þÇã'`/DSP†¡{èzw«ë굡±‰‰±á¡f…0Aœ$êT*p“FC¥Ä”J%ÆôVåj¦3S)A™ÆY·TŸ'yò$Ä4NNf*ORTô«_½ÅOZ˜’EQU-Wªäôå¡¡÷Ž;#רTEŒ­C·®^»~ÕuëPLŒ]7¡”DŸ'ä9â:G£ƒnéd(¾irÕ»[T^¬>¥L&Ó#ž<1!‰óİVˆˆ:¢ÎlÖ*Ö¤äQÿpâÖ°}_ë@÷Õc5--”Z`qÿL=Œ©¡¡ë—/Ÿkv!-Âc­$…²í UÛÄ„ÝÑæé´«…òÛ9 hÊK4%ç|j¥Z¦,–aq‘D¬R‰‡ƒJ­¡,P2óy•vûåá¡?ê¾vtý±ÖJ–kj*Œ¢SP¸¯ßºvi¾Û¬%ˆ*Úã Kë4 »ÇgWC}K¡.™ö*5šºÂüUƒÔ)VÂÞ"SB"ÀÄ`ÛrD99"¡T«V*2x¸ýÓþ‰áQwø¦.K×Ò j˜ÜÂhb\¿|íÖЭ±1À +ñ*¨mú•"º­Ía÷tR(¾Î\ËÁ›4È€y .gœ ž ƒ.$´œmÛ€D˜ÃK]”‘•ÆË\•EÛ/=¸û®´;<öËÕ´6SÊ\S[a4êú¹«¢†¾»AA&À‹êˆózÈOŽNÅw1 €‡j€%êé„Åó0dŠn&X.`˜0#}Ujúš44ç”ç‹úueá±sGŽwÙÈb­©°.Š·n݃T;|zVh6Úú•+©+žNТ…À”X!ã-ŒSiŠ#0Àcå7“[P J)C^•+Ø4;„j…H$’‹²x™zÏ•/†oXއÇNùôJ3.XÚ¢ÙSMÝc(ZÍ4M·´Ùéºóz±Þáñ´xÚôÊB<ž*Q£»â£\pӔϤ_ÈVÈ£dØCË•ºZM•rB•–’*qЕûL–ªk7×4_±”˜­)»$ª™ jøKLãhºÓç)Í)m¡v ]ÏxÔ´M{8R‰zúÒ„‰ ¦’À# 5 e¨ÞÃjçõµþþ.\"㥤ˆ5¸¨²‘¬´[Žö*ÊßA3'ŠÇ©¦†oݺasÒmŸ´ äÇg”‹iFâ%pÓhP\—OÇF bb´{•3rȰ ,Ãrc`lÀ°üJií2Éå„Bá _ÇÝô‘Y›¾&7‹¦Su÷¸lN‹ÅÝãpÐÛ6Š@Så€D+VN§Úo+†š‰ˆéá :Î&“=t,3$;°Ö›Ãý†ITôIgËq ĉÊF¤ TªUéjláü…qQœÄNÝè»ÑÔl¥Ü.;t¯^N•§…¦¯Ðª)f¢»Ö%ÅꙚ§AHJ¯’MP ” D.¶³âFÿØØ5J›ß¦M"AV&¤JŠsÒóIóçÎGñPt³Ãë4ãF Z%ÑQU”‡VNS(¿UxÔLˆ—3åc:4 ÄÕߦÝé —åîÁrwXn‚OU¿ŽUZ¬éØñJyÖ:…Y•¾Ê`•®"5Ë#.б1Ùá¾ÔÑá´YÜ^TošÆ©(ß må·$=@ò­Ë•3¹ “BšÚ‰]»1<Ö-׫åÖÎô4†ñRx.”“©B-HJM]Åò7áìð8Á<í6§hGgç´GÉTjå#k¿ÛU©™2R>]¾ì-°ÜݘÀpóÆØXs¾J.ÇÉ}i)PÌy<žT-5®¬¦Ns4ÑT£Ëëêðz;ܰ¸ÜnG›¯“&4Ðî)sBè.˜<¥ü†CùðPîŒ<ȵÀÇ”ÓåÑbOîžÜ;\7†‡›*UžÜN¥¥‰ =‰”Â¥B½ˆ''…«Ö•'£â==—¼==ý=Þž®+ÏmAj!¯¢d¦™ö&%SªgdØtbzèiJ™º¦#¶›©|¹;vÞè0árÑš,¾"SœÉ[•º"/)vn†\ŒWç œV¾6ªjôôôøÁÐÊ×áõ˜P ñ]2³ÿ&cM+ƒA½†_<½‚¡+§“šVƒOå¢,… ŒÝ]øY1O$*]“*¯HÍLKUÉRå’,œÌ´¶½BF£Qý7¯Õf)Qo{%ÃIâ,çƒWaØL dÎÑ EÆ@1mö°D Xanî4¸” ëfÿDø—r9ï¹Tž‚—V$NyNU”VYºÙa§«H`GW?Šúä  ?Øïï ý>«ÑBi0¡Å\\”˜Ÿ˜ÄÏb rýâBPAÆÐÈfVLÍ.Är÷ -h{†® ?¸k D+RžKIIå‰E))ù>=±‘}p-_ÖEEÕ©üýýýÁàÝ ˜2–ÍR¯Æ4Ðt˜­•R8{V̬Yñ‰œôì\€)dÊÁЄÁ¦'K{0”g÷L«‘aè©d–J²(RRDb^JæYQ¥pÉÓz…8 ×®Îèqóë¢Yþ`üƒÈ@7jf#¥U¾](ÜVÒ)Kœøä¬˜'bfÏYÌÉÞš‹F‹â$)DŽU8])à¶3wg.†ÄØ)\}ã‹ð°bEÚŠçR¸*§§¥<'⥥ÄÄÎËÌ““j¾ÌaÞv(Šjܼ; Fp0Ðî²-—ÅætYh+!ܶÛ¦ME%˜š*ä<ƒ`fÅ?µxyvî.€a”)fêTm Û¾ €On›¸›õô´5䕪R•(…±…©‹rÔ"žZ 8ÍÑŒH(¡{¡Á»ôû›ŒM¶¦zSS‡ËÙÕQo±ÙÂý›7 …|³Y˜Ãê t"-þ©¤dÁ.äd§|ÐÑ.[¶*yŠñ«›û»„oÈ¥•jWÉEiÏ¥>—ò¼>/%Ó^ sã‹0»ÔÍF=‡GF"A_;r¬z›Ñesuôt¸z: ¼«…EÂ¥‰›6q¶™1¡VËÀ,XþÊŽÜB3»A’‚ ÁÎ ‘ £¿õîd¸Y™yÍžÏZŸY™™§ôd‘-ª•"O®VV £y¶)-î‡Bƒpƒ ¹x]6›Íb4™œ–f§³ùÒŽ.ÕEkÉþÒ›÷ 4Z~úâY11±1³þjñòí; C¡²ÇÜs³+†ZÇÂc5ºÊ¼ç³T=Ô‘*½ÞlÜiáÏUSisç§Š°ÑlÔ#ããã÷Â!ã­Gƒþ¯¿ëR»Ñh"›ÆasXìvWO—³Çët¶“j+ÆÉá'>½…ÏQš…¹ÊÅñè(slÜ‚ÅÉ‚;™|»cõ§×z&&ü•¯WâÇ*ł̴¢·T5×tÇxi$)øžÊÛ&XµpQFb\4Õ„d‹òThdtdpô~h^oG;$,‘$-¨WtØf7Q k64Ã4Ñg ݲð™DþÒD~‰@YŸÍá0'0ââ,[-X´æZóÀØØT^‹Ï¾·Å ‰ï©<ÆK-J\¸øª‘/X´¿$¡(Š™*èGCa°QäZþo»¥Ãfª6«M6«qÐužc %…;es¹lWœT—ShVs8ü¥ñ>§pZ˜xæ<ñœx©ml¨_º¯êõ<—‚·Ž';j(Ã*»Ýã.ÉÌL—‘© ÁæÆEsÛ„*>Mñœ e«K^—Ëi #d_«£ÍÑöug áôÂ\„ÒÑ3å´›L–'å¶æÚÌË· —>ÉYú$_È/!gCäÇÆÆ¹†‡lië6àrUQƒ!-+Gô£ Y«$Åd«}QBÒʤ…ëD¢œÔE¥Qtª;ÁÁàHè>ƒ1 { gïò»,&Òd(w8.téõž:Ó4…“8~Jcµ(òIc«ÍâµbMõMq"‡ŸÏaäˆS\®®1ˆx¤y£K“î§+ßнîlו.Z©âÏìã-J]ÕØ ‡Báû!Fñq ßÝêt»<nK³É„œªŽÓm‚ är‚¢ðÊ}âºÏ¾v‰K)Ó§¤×¦u›³”/×!й< ×7¸Å ºôYñÂü´ÔU"2kÕ’•Ù©x^JªÜ$àe –¬ÜÍØßc<*„~„|—¼S“Ë™×îp¶8~I[é×\îÚõtÌÝûÕ)5ASQESUÚJ5VÑEšÛա츧Ÿ\ȓ╘…R‹DóbbÓ «žK‘úÞ~«ÔÃÏ«ÊJM?wajj:?q~Tî½pn8<ÎÜC!ÈUA¯»ËE;:¬$e²{ÚÚh˜×Ô {‹öø*ºôÔ%`zZ~æèpSº8nѸxú•‹Ò²pƒDa¯ëP¬[ÄÓTʸNšžðDüÆWoÚzaUó ?G¨îD³y€´ ‡ï‡Æï†F!:n':^â4Ö˜,NºÍáøÓgA¨b÷ܾÓFDΖ9ršÆqJ¯Àq‡ÙJž^7…+DµoQ{¥”“ÓJ¾! ϱÕèš½égÍ­J“`-ï«ãÃt&š=UøÁƒðŠ‹ðø½Ðxhtta½¶®§ÓÉŽ¢£ÑÓ‰¯£­­¶‘"ô'ß/Z)¡¨óÿBT¸žôTÑ4-ôà„šãŠ…"??ß[Ú¡È'U^¾Q+Ôn[–˜ä²‰x©àP{˨z¡L¸\] y€4G^5::u]V›­Ãâ t|èg# ˜vh&(!ÞOã¤'žÞ¯ˆJÏ„Œ7ò ò¥ùZ…tƒêÍR²$!!]VQ}°¬Ã©–ÖžR­rBcFäÊ*œÑÆ@6ãPËÁ©PÖmwÐÕE ú*_K[‹§³ÍÇôóö–ÞÛ’4=eo¤ô8Ž“$A9zëªÌŽN\EëIRQP (Ø+•îÍÇõUeÆšâœtiµ‘1­¹±óæ ±²2w41&b0#ƒ#¡¤†·£š2Y $Šr4zæÞ´&mg>sˆ(‚þéYªŠ$ˆ*µjÿ& I¸­2$i]™bo.µž¥åù–Ó¸üƒqÐX}ˆ¬0Ú\ÎbÁŽåÎÇ>Býz( ÞxÝÐØœ“ái2Qt‹¢íWޝ}ŸÙ)”u!U‘º°‡òyÄ„Ÿ£hÄ …Õ¤(0y<ž×xß 5·WlPMÕÕ‡ŒÕVTÀ=w»`OSô1˜G¡q?4 øÛaRn3L¤1 $©¢ìpGïù;¨½Ÿý 0È*’r|vÞBT™´žÆ¸Å[V Ð©)—šñü½˜ÉeÒU›Ž#9&¬ŒÅshÆt²Ev§Ýí¶›AaªÖ)®3Táê„ËÞŒ¼ë³6TøèÒóö™Ëz4EVÚr¾ÑBº2\c–)t \¯ ô¤·>òVY™¡Úd41¨áw—ßújXA™¢€³ñÇ?ùÕ¯* e±™ÉMq s6JYTXˆ  9R« %Y¦ƒº ™ùŒEþêY^š,s`¶ûêÛc¸¼.Õá 8IŠŠü‚½{7d,KZºùŸó¯êÁÅL]-f­FƒÄ(B‚¨ Ű2GyÐñD£“4'ë oÛ“¿cYÌ¿µYqóÊÆh0èóÂŒÎÁІ°w‹,X¸ñן|òa™§ÓFž&4F ¤Há~îÇŒRVŒj 8j!eò|éÞ¼˜×¢â÷ 0`@ý¶´ø8ŠîEÆêe $$&&nþøãqHA&‹Y«=­)).A°æ Á@ 1Ð ¡[¢ìRMŸ…W(Þx)má÷b?Fø 4‡ ½[‡Ã ' 2éÎÅ ‹ùœø9‰?ûªi¡5š™sQÈÞÆ„ „+œÜܾªöC3A#ŸÒéŽæ}ïÑï:<6ŒPøÁ7$L£¼ãuX\–êÒ~†%Ι‰sâ—eC׊Žï˜•…¡p›+bÎJ¡ØF1:ìŽB!g“ ¯ƒ‚H×A„뎽±0&æñcLÂü·º!¸•7|ðÆ?@âãŸùÕ– 6H÷ê ¸RÀç,/ãpÒùB1Úÿp‡îàsÒaBˆÓgè:&SÍZø—Pc0z4:w¼i(ÝŸ4'>0âããü›÷7lØ»w¯b&ŒÄøYOÄÌš='f¢ÙÙ J€.[[ÁÁ(—Äñ:ÈT”n+__ûøÕ‡ÃTŽÐýñÑ`¯ßcµÕ-^öÔœ¹p«¤-ý¦A{÷æï• écz OÌ‚¨YÆá 2,†Öáðƒ»$®o£R.]4÷ñ«1zŸ™¾†™fÍÅ!ÊPËšÅË<µl9'1aÍé?R^µ7?_*5â¿SÏf?™°ðÌÞš-Üj¼1ö Y›÷ïsD5ÄC÷ ì…g&N0ÿ Þn÷ú½+Í@NHä,]¼8uCƯ?b0 ¹D .ä®MNær¹ßOܾ– ËZî³1[×.Ž™•XÌ}¥ÿwW¡ÂÌ}EE‘ Ü—KóSs8±;á†Ð™¿ñ™£#ã÷¡;´º]N¯ƒ'&Î…¿lqâ*©òãÜ,rnP«Ê¹ÜÅsâ_Î~jöìÙO­å.ž={VÌ.î÷cb¶n¶=<¸–[_k¹\Œn­ç ÌØ"NÎæù] ˜¶†FîÝ›nGîßíõ9iÚBË ŸILHHG©uYšŒŸå¢\U`€©7 <)‰oîñÞ´ôé§™ñÇÆ_Çdo6wxb²œ»Û@íærwÙ¿(O6Þì(Ærùóæ§góQ+ÅçÄÄp¶îZåi¢€¨ ƒo Ã¹‹¯ åØ¦Ä§æ¥¯IJä/]¼UPô» à(PT÷ÙU«Ò‰`8Ü[ûÖO ãòÉø'€fùöäY[ûÂázî.mw;7ÛÒ³=Ùukwò_'s—ñÌÛ¹Ëâb9à{[w%ƒ=]Œã Æ (rxPÎñZI˜k±màUIÒôÄôMo~„Éþ{áÀШòµÉ¼4ãþƒ·?¬­}WòòÍ[„‰»“¿_º,sML´s¹ËÚ­ÉÛI×Zî¹[»f?±˜›œIìæn]9?›ûWO”ƒpÉÜ9ÑM¸£ƒèdÀ ÜÑñ©ºrÄFªå ,_’ éÒŒôúãßR–|¢”B;b8¾{íZ eµ654=sæÌyÝ×ápùvˆùÅqé2ÒT¿[^ž¬ÝÅÅÁ¯¹ù`Æå&¤ ¸kEy»“c_ár—s¶JTcctppd$8øÛ­Î& aPäM!†¢±\*a¿ýí{{ÇG¿Ã¤ùŠ* aX U½R{êÔ™W¹…÷Ó¡C\pîËb e®•[¾ëºœ[¾;9ÛríЫÜdnòÂùIàUjî³é¹À ÌÏF·nØè: Þé´X,Mõ¤^­)d9‹ßÜ/fýæ“ß ¥%*¥R¹âÝ .×ôK«ùô«Ü—üæ['wq '&ÂÀ‘…f³¹b|m6©á¾ºöÙ\—›¼\ÆåÖ»*öp¹¸d?øÜ‚9³æÌŠæ×#Áà€H ñ·»›œô…KB­zûWŸÔJ¿þä_?ÈíTJEÒ½:ÃZ§06oÞ¼e7w÷È$8ÕÚgSWq¹ÙšFš6C1٪њ³ ¬‚»Vnviâ^ûZPaðA¤Hˆ‹›U5‚(,ÐA6F‹;Á`o{»Ój©§Íä©_ôÑÇ¿Û/}ëãO>‹¤2D¬ò ÞÝ“ÌÝeljŒŸüxówq·ºƒý­‡¸ÉRQþvîöO£êa¡¬b7ù•—Óp·—ï^Ëm›ƒ$œ;žh§Ú±+;š“ƒÁ :5Ã`ÜA(·¿ê¸èl²Z¬ýáüÑ ûð_+–J3¤ÒЫCÎ5ìdj8÷Ù-µï¿õÖög_iìpw'/7è ’“w]±ìJ~¶X&Û•ü×%˜ôÐv ÙÍMöO„듟=àê Þ-‡í“¿e§wŸºb©q;ÐëmÿÊý/üã>:s†&4|ò‘J"Ã;a^Ÿ¿§@÷nÅRº¡á´ùÌ©jß*¹ìï²7»šÑ|›{ü÷¾ÐçæChaÊ“ú2ºßíîsÉö8n6ïÙI6»œ6Ûìes¢z¸mjF1ÂÇí>ÿ×n³öOøýë…¶óÙO~GZtP¡8°§  @¡;nk½q÷îE”oáþ5ôÈcè‹,­Õªú[?É\U©Ðkµú œö„û=dY…ÑVm »CcÃ=FlGFR\T1nß àÎpLû‚þ?]¼èýÊ{Ñív4þñü¾Ña±Ð¦z“‘¬®®17Ùš^÷éÚÚÚ“µ§~œ>ý oo¯¯§×ïïñùzººš›n·µáíýoþøÍŸ¾õöùÁ&™ÃDCŸž0µ\ë鲨1L¦6XZ[ÏÙMžª£)‚ü¥Ëii‡'&Œ2iÆêe†h^ù #õ_ ôúṴ̂ý½½0âÛ¿R¯µ¡a¶X­·ÓÕâjéhíh½Ôð9O½ý“77£„[Û‹Î)Føæç'®|ÑßeªØ‘-ØUw _5)p}:ÀÞÜÑs㊫k`xb솭l¶3£!ŠÞoxH{;øõŸ>cìëàØð —k`xxøË//_¾>p«ƒÌNZº˜Sf»6<91¾õùçW.¶o°Pèßò`vKµ¡‚4MÆKSÑËTÿ6õ|âÏû¸¿ÆŒ±,‹ñÿ3ƤÛ×0Ù~Qã÷•Û¬óäˆ÷;ïp»¿‚µÿ«†ÉHX 5DÚCßýˆG¾*¦¹ø¿~¾× ?z©ÑÌ〷³}z¢ãLnü³1J#ƒáð`a$,¼íê+šàúF‚áÉ@(š N2'¢hQáÝ~/?Ò{? À‹!æÏ¶ôE‚¡`$ ï¶6Áv¨QŽLà—D">x=ïGÏœF#¡"xÞ BSAa(28øçað#a8„™¤?™zÙï>íón™ú}¡ýƒh.0ÙÀìÁ€˜|Ÿ0èsûJœ©Îv«½â½Ti0k¼ƒÂHƒ»È×Û.1•÷ùÖ^,hÕk-q‡ ‹"œ6ÿTƒ6ò6D‚ÈhwÚ¬%}ü »­­ýÏÂØ69e½D ÂÉHaãßÛж|Â_äí^š¾œñefÝÞHÿM_QçÖˆÒ,±~# [}œIM[¹—±ºû„Þˆwë$§×ä#-5BšgÜÂÞ†J*á„#ø¨ˆÛŠ–—#°»Ú¼FŸµ·äR¤—™äûJÂíÖÈ¿ÆýLpêåÐd‰æö¯”£ÞˆÕ_‚®4>=3µµ}ãdpKÄßàíg¿?UxÁl>m~•Ö4D„#áD¯×쵆8·‘–…>°³W„›à€_¶û‹À«|^aį<­ Û_î½Ôàõþ™™jºš)Øq““ð=ŽLMÁs¨×™d^gÖS“ÓoŽ WÑSSÓ[¢Õ$<›À[&'ƒæuôëäÃÏGŸ›N?Ãl™yÈlùðÿ%ÜÞI¶n°,‹Áb°,‹Áb°,‹Áb°,‹Áb°,‹Áb°,‹Áb°,‹Áb°,‹Áb°,‹Áb°,‹Áb°,‹Áb°,‹Áb°,‹Áb°,‹Ábü×ÀÃ`( ON~óUøàdd2™ MF¾ù xø;? ~óâ$ó1Ó¯†¿}ê/‰ Û/öy½C¨½wpÐ猽_ âu6øƒ!àv$bìó‡Aoß ×××òõF¼oÐîôõöú&Cè¿ &{ÝAæ¿ÛiÿËbø'ïûaHmS½V[°·­Í Oú"‘‹Áˆ¯·­³!Üë77EBnwï¤ÏwáÒHûýÞ¯Ú/z§"¾©Þö‹n¯»oª·s¢w*äïõööNu6´MÀÇÞ ÿe1&}Þ>ïdgÈ «Þö`ç˜÷Ò”ß{ÛëõFü¡vo[È=õµwÊ}ßí~àv7}vXÛ½þ¦HÄë ^lz¿†à Oz{û:­ðkS¯}ÝÚ×÷âSSèÛåSÌÏGžý·ÿºŽÿþ¿»õ£Û°™ŠÅ`1X ƒÅ`1X ƒÅ`1X ƒÅøÏoÿq)û aØßIEND®B`‚PKcK layout-cache]–LÔeÇ?wÞÇÜÇœ Š!Pn:W†?Öú12Ìšm­MdQö‡Ú¤Ùædn­™:765k5‰-s+u:kQ™lØj¥3gf%8™àêýðý¼ŸXl<{=ß×çóyžïó}¾Ï÷\â’Î"Kâ"`ówÍ'ò4.I±È–<‘•~O¦(1Ñ,Ô¡móˆì ‹¼êqþ§bêÜNØNè%ôŽŽÎrˆ€4 í@Ù—""c)‘ÍV-Põg®£~ŽiúÖc ÔkpIØ *¶ê~Uï‡U;SÓ'M,‘‚h®K¯&%„—ÖÊ•4´÷PË[$rb¶HFÔ*7Ú Pç"G1L}žU®iÊÌàí|­¼•#’®³|¯À‰‹YåQU¬ê©¸Î{ Òp ¢Ò„¶=Gä0êžçßA«B‡òaYvC¯È´ª­?ËÉZ‰-[ÕŒö‡ '«¼P¤,‹óΓͽ… ^Á §³¬zíõLGM¢rk¶¦¯fz¾xÑ~ß…¸$îíÃ|«f Ý¤êSð"–Ö“gf%o@}“ùY/çêT×qª1Áìäx®S" 1›s¬ ªò¤;*²Ê¼–k4ëÔ»¬ü:+JH×ð\ŸÄ¥#a«Âª~Wµ4dU¶.¯É:„y*GwU7*Ïêql_‘_÷ÁvôÚEl´,s!Ûa»ü˜ ä?NüGºÈaºÉë¿ Ë‚® Z}u²õêH«Æa=k^žx1-‹†ÚH,ÒÓF¾Ù uþŽZï¤êËä?=Z¹Áæ9GµlS¾)«%/>_øòáÂ÷ÿTøÿ„ÿWøAás…>Gøqáÿ~Rx¾ð3Âó„Ÿ>Cø³…_ž%¼V¸AøáéÂë…§ ož,ü†ðá7…O~[ødáw…O~_x¤ð&áa›…$üá!Â[„ ãN) C¤ÅäB²Šô#²v¯nOäbr)Y§ ªÇwœÏcpþŽõÑKë—mP߃ú…'†1,éõé5-¬’Æõw2h.í³¿ðá Ú¯§ð™Â½ Ú·A{«ô´ý …ÏVùkÿ”ôW™AÿÅ úóxöûPr¹:}ß½Îvìvôg)kŒõû@ùÝ:-£Æ–ScPcQcQc¿£ÆÖPcÏQc/Rc/ 7 ÿY¸^ø¯Âu¯ × ¿&\#üwáñÂ…Ç ¿%D¢RÛbÁ¥‚õ‚c¤Vµ‚KË:àºbRõË+¯ úÈuU ~#xVÐEn q‚;Ï ¶ Êåfš"¸A°UP*7ÕDÁŠŽVË›¾‚s/ ºÉ¨þcÁ]>­qŠÚbôe_ä°/ê`_ä´/rÙ¹m‹âöEÚòvEíh_Tîµ/òÙeÛùí«a_Tžc_°? }Qyо(×¾(d_”g_¶/ŠØåÛ_—}QyÔ¾hû¢}í‹:Ùu¶/ÚϾòöEå]싺Úu³?—}QùþöEöEÝí‹°¯†}QùöE=싲/êi_ôû¢ƒí‹zÙb[”üÿ?;W¿p <Ë cæîy`-×í×u0Íû'˹Òc)Ïw¡j:÷ü„sëök;˜æýSæ\µ¦!Ò(V\n’î\àD¬x”ié\•þÎÕFúÞΖ|„‰@_r‘  '³T'ˆÁN$xÇ;‘` u"ááD2Ú‰/îD‚rŠ Þ©N$0œHhjœHpjHðNs"šáD‚×àD‚ÔèDÂ4Û‰êt'ª¹N$XóœH¸Ît"û‰ ™Þ)š ©H‹É…déÙäËØžÈÅäR²ï Ž¥ç»Êó_í@}~é@ý®q ¾×9Pÿ_9àÝèÀõÝì@‚w«×›íñ[Úç.¼¥´ß}$x+hß•´÷#´ÿ$xO9Ð?Ï:Ð_¿w ÿ^r ?ײßב77&p²œ«7xÌC-ùð6ÐX#5VOÕQcµÔX 56žK¡Æª©±*j¬’« ÆbÔX¹„Z+"’uTþò®4VD.!—Qc1j¬‚«¤Æª¨±jjl 56–›@ÕPcS©±:j¬žkL¢Æ^ ÆþHý™ýþ ù5ò œ2ç*3°e6»-¢‘8W'vhŸÎÕ,œ«i6[º5pjÔ—9ÝL‘“¥t¶åÍL¡—3S¶4˜)Ÿd•ön÷Í–-3¬-ºÇd3]^7Xïœ)ïeù>Ó¹}²™'˜$ïš#Go°¼ŸiÖ¹dï¦mxÇ™Öþõ–¤ï¯1jä«•¿;g¬«Ä ˆYrµ£wÐS ×±Hð„à ù¥ÍŽœ*X,xQÐÝ-ƒ¿`±à+ÁÜ«‚‚üŽòÁ!¸P°^p˜WîAÁc‚RŸ1— ž¼/¨Í6æ!AÀ/‚ó· >ôÊ‘{_p‹`³ {@Ž#¸Bp¿À”}ˆSÚkeܻݺw­³èâÉvïZgѵ¥oÏ]<=Ü»¤[t­óáâöE­³èÚµo•EW~¨}Qoû¢>öE‡Ùn_yû¢ò#싎´/:Êþ\öEå}í‹úÙÚõ·/`_Td_Tl_t´}Ñ@ûÖ°/j6ºÚ*´üš“¢û8Ûsh9ÈìoMøkó]j`=肉,, PtÓôÊ4m•à3A¹ò™°¸³³дsµ GÚì(A\ðkÁjAHbˆÁ½§  æ žód¼4 ó’ËÅÛóLl»žnÍl{{f¯« ™×ƒ‰«ï /o2-×í=ݦyÿdÍìuqÁÖsé ^x§sk¹—çnÚ?e3{­iˆ4òÒ–›¤Ïì­sÃKëkZÎìõMÿ™½ Ï•î–üˆFéä§Ý0PŸsÃP}Ñ ƒõe7 ð¿¸aÀ¾ê†!»Á ƒv£øÛn¸ï»a€ovÃàÕ¥Zjø~ä†ü/7 ðÏÜ0ˆ·¹a€«y¥òv7 e]+©³ÃÃY#5 ]Òn j†uG li1¹¬"Í&wsa{"“KÉz¼ý]8~ çëîÂùp¡>ºP¿ƒ\¨ï\¨/ ðC]¸¾Ã\0ÀpáúûºÐý]hŸb ðA.´ß±.àhûþÐ…ö>Á…öî‚>Ò…þ9Ñ…þ:Ù…þSsPûs"û} ¹ŽÜÀÉšÙk:æƒî–ü0µõ8ù)jìYjì÷ÔØKÔØZjl5ö5ö5ö5ö5¶É™«-nÌdýÓ™­OܘÙûÔ™¯/ܘÙûÒ™±¯Ý˜)SUScUÔX%5VAŨ±2j¬„š*ÚIcyÔXDÝžÈEärµ£Ö*¨µJj­ŠZÓúõp¡¾=]¨ÿÁ.Ü3‡¸p}º\Rï©Ã]¸~äµ= ]hŸ"jl 5v 5v56„û56,‰KÙÌ^f`Ë lv¢K£h$3{Ýísfo í—aRu Ë%Ÿa“%Ÿm­¿ž+ÿ›f™ ½-ã ÞZ…}ºìUÓl64­Àžhí9ÛÚo–eœiôÈzlw»Sp°œs~¾µ]0H畘~Z0@êÓ ¸J°F¯‹7wkååjF æ žtÓ7FŽ‘»o¢àZÁ&ÁÑ+Ÿ*¸W°V- u…`†àAÁ‡‚’IϬðimSÒ ›# ÎÓ6+žl$Þ†æH¼ }“ïêZôÝLtÅÛp-zë&ºâi?¶7l©;ß-ôÂu¹™£ÐBŽawÒ¥¹¯£iÞ?Y¶ÔLh~é…ýÔtî_&œÛËs7íŸ2[ª5 ‘Fàr“t[j²`?ÓÒ–ê—þ¶Ô—Dë1oKÖXI£üJòH/¢ÿ½Ì¼ÈNõ"{›èEö0Å‹lâ4/²‹z/²·F/²Ó½ÈÞæy‘Ì÷"[9Û‹ìå`޼ëa°úE׫ԚÓåõé–…3[¶`]ÍŒæ50º:f†uN]Ï‚ÇLh^é2›VÐ,ëµVM&XGšÌÚè£ ~’ðŽ¦µ8“h8É}h%‚ko ö•î«,|.è-mt–à&Áfâp¥à~ÁfA±4èÁJÁ‡N˜°«[a·Ü¡‚¥nÌÐ Öîì/GI»W nüKÐYG,/>Ÿ¼'(±þ‚•W¶1½•‚›ôô˨!X(X%øR0‚KÖ¿ b¹>Á&AiPîrbÞ÷¯Ç3ö`Ú¬‚ÚϬ‚JlŒÑ÷팾4qóZgÙÅÓãÉ»Y¶Oí»Y¶ϬhO,JöŠöòAöE%ömh_Ôæëà/aÄ{¤÷ûñ–šƒ¬ç2²ÚØ;ÿ”eáÑ„úÌÊ"ýâ²-óK[,X×_ Ÿ,X"xIð‰>@ZúÁZA7pžàϺZS‚“þj€õ ?"QÉõ‚·EÒ?üVð‚7¶ûh´-¿z™&jÒ£Ñx{TÛ2§Çrývýœ³æiç+\ݬoýYŒ©ÕŸÅ‡È>ñ?‹'™ë±·ê@é·Ùž¼oðàÒ1‚³+Ni§±Ä=úðŽ™ÏÊvÿYÙ–Ï"ø6Ÿzm€ë3q׿¿7ýLÓÑz¶Ž¼ºòd‰±ÚÌ'¸RðGAÀ‘¹Á[ƒÇÛó½¿7–Yõ÷a¾ò?Võf¸{Ç-×íÇd›æý“µÌªÐ‡ z=—wçÖrÝ^šmš÷OÙ2«Ö4DMl.7I_fõQ6&6 MËeV…{v·îeVù0ûürvKþK6f­_%¿žÙì7³9»ÙîMÙX°5³ágcvüÓlÌ–oËÆj„¯³1›îðc5‚ËÙöŽ~̾ûü˜Ïñc5B®³õa?V#äû1›¿³ûü˜íßÏÙÿ®~¬èæÇê€ýýü‹«ºû±š@EZL.$«H{ø°=‘‹É¥d=^‘Ç/öá|Gûp~‡Ôú ò¡~ú-­ï±>Ôÿ8V# öáú~èÃj„ ®¨í1܇öéÃj„jÚoŒ«ôaõÚ¾ã|hïI>´­«ê|èŸúk¶ý7ׇþœÏ~?‡¼€|Q'k™UÓ1_ÊnÉk©­uä ÔØFjìjìjl 5ö5öojì jì+j,‹sú±ŒÈãDz"ÕX5VKÕPc㩱±ÔØj¬š«¢Æ*©± j,F•Qc%ÔTÑNË£Æò8 êöD."—˨µµVA­URkUԚ֯ćúãCýË|¸g4ÖÕëâÃ=u¼×‚í1̇ö©¢ÆFSc'Qc§´ÆR¶Ì*3°e6;Ñ¥Q4’‚eV£³Ûç2«¯ &ôI“Úø;ïmÇ7ÚvÎëæXîÙ‘½éûõÿé;~¿vàáÃ?³ž!¸^ðA}†®àFÁZ'¾ß§=Êr#‹kuY¡ßï{Ë£gþ/ê1o¾»滺ì¦u³ñôxøÐÞ0VóyYyòJ cµ³šyõó9¦yÿd «‚. À0xç^špn/ÏÝ´ÊŒ„Ö4D}t/7I7Îࣻ¿ii$ôO#!?ñÕ©–<1€¸l ¹.€x­!Àø-€xnnñöüâ½sˆÿ~@ðóƒ˜/¼èG¼ýGæò#Þ^Ë|ãæë™lð#Þ~Ãö{Ûxû=?Úw³íý¡íÿ‰ñög~ô.˜ÖþÒ¹8í?gú³#ûÝO‘ó8YFBd/iìòå«HœH_€‘pC‰öM ·ˆ/ 1¿-€DýŽ÷;HäUkÔZŒZ+£ÖJ¨µ"r!YGå{È»ÒX¹„\FŨ± j¬’«¢Æª©±1ÔØXjl5VCM¥Æê¨±zj¬q{‹{—ÛDm¥Æ>¦Æ>¥Æ¶QcÛýè¿Ô˜‡ýžMÎ%G8eFBf`Ë lv[E#)0.ÎiŸFB®^½Aê‚Ñûx²õ\á™Öäê¤o< gÒN {ˤ|Çtr­õ¬àÉÖ#tvL4ã Âs8áÛòOÀΔ#϶¿Ó4™;§yÂYÿ¨².ù(¸Wõ’…?þ±8 ÞúA¡\ɹ‚å‚rE=õOž– ¾twâ=àÄcµ.<*È‘¤|¨àbÁ+‚Þ’‰,üCÐ]rìé‚+®ß1ÜîňÔI¾R°Q/éóxÁUÙ0IÝr¿ŒÜîǽÛIZù4ÁÍ‚¿ dœ¬c”àaÁ낈Döµ‚û‰ÒµO2L \–xz,'Mú³Úµó]]Nš&O1Š·ç¿ä‘ô?×·/j×É#é_nŠ·á÷žâéñ•¨¸}Q³ÕV‘ãO²9VÒ9r,1£Ÿ€£ ¾™ô¶O:‘X!ð:ðüñ‚%«éÌ‚Ù2Ñ—MQzD_i2ýµ›èkoÌ™ Â|‚Ôc ½2:ÓrÝ~R®iÞ?Ys&ÂpÛô\Þ]œ[Ëu»~'©iÿ”Í™´¦!ÒÈ¥Xn’>g’‚K1À´œ3þs&·a%mÊmÉ[saA}Lþ,ÖÔ—¹´ªB°®œ!X‹C°¶ü!X]¹!X_‘¬ÅhÖXç¬Å®!Xg!Xi†`­õ ÁZì‚õÖ;kñ°¬¹#B°êŽ Áºë‚•×?ko@V_QˆkˆB°ÁT‘“ É*Òòˆ ¶'r1¹”¬Ç« âø#ƒ8ߨ Î?:ˆúTQ?Íø´¾c‚¨ÿ)AX‹cƒ¸¾ñAX‹ƒ¸þÉA´‡ZÚ>§a-΢ýƒ°çѾó‚hﳂhÿsƒ°Ñ?Ñ_?¢ÿ.¢?¯f¿_K¾‘|K'kΤé˜ä¶ä-ÔÖGäO©±mÔØö\\CjÌCeScAj,¼5RcõÔX5VKÕPc㩱±ÔØj¬š«¢Æ*©± j,F•Qc%ÔTÑNË£Æò8 êöD."—˨µµVA­URkUÔšÖïÄ ê{Rõ?9ˆ{æÇA\߸ î© A\Mí¡kÜËKÙœIf`Ë lv¢K£h$s&3rÛçœÉƒÌ÷\©¿yö‹w?§±ŸõîÖ,¼Ü"(“*-X$ØFŒ:/¬|."×u‚G~ž±•uÍd›i“mf[¶h´ŸØÀz~–>F†û2Ûö6ÿzfÄo噿ý“e¬gð¸&ŒTÿ%ž{M¹½Fdú»0"Õ'È\Ÿ #’}:ŒÈVïtU¤ÅäB²Šô9òßA'r1¹”¬Ç{‘øFæ¯3Rÿ;#÷7É¿ÉÈþmFúï†)¿ÏL`s‘òf ÿdæð 3‰OCˆ”¿`¦ñu‘rVÚו‡ööæ¡ýsò)‡òÐ?ùyè¯Nyè¿®yèÏîì÷ƒÈ‡KàdY}R¤±_ñ7Qc·Rc·Scw†‘â. #å]F |_ÀŠ0RäðV…‘B?FJýh)öãa¤Ü«ÃHÁUkÔZŒZ+£ÖJ¨µ"r!YGågÉ»ÒX¹„\FŨ± j¬’«¢Æª©±1ÔØXjl5¦×·‰Ùç?h|HKäcZ$ÿ¦Æ>§Æ¾¢Æ 5æ¤Æ:Rc~j,—‹PcûRc]¨±ö{r/rŸN™Ø2›ÝÀ–FÑH ,€ÏóÚ§ð¢à—zh.aŸVk:=ƒ¯v¤þûXïjMêÿ11Kªó¸à-Á>RÏÁ‚õ‚CÜz†=¬S&ÅϤø;Ù§ømù§ [·Òoo¤ÝÓ"øüªŽ"«G›¡šÕÔrÝ>+ß4´{j›žË»‹sk¹noÌ7Íû§,ínMC¤ÑÝr“ô´»GtŦeÚ]œþi÷CD#®hKöFÅäó¢ˆn¢QD;£ˆ~ºEv"::(Šh©WÑSŸ(¢Ó#¢ˆ®úEˆ"ú::Šh¬$ŠèìØ(¢S½ù5zEtz|ÑÝ¢ˆö†Fý ‹"EtXE´82ŠèqTÑäè(¢Ki1¹¬"“O‹`{"“KÉz¼ºŽ?=‚ó͈àüõÔ§!‚ú5FPßYÔNÑé\ß™D§ó#¸þ³#hó"hŸD§FÐ~?‹ :½,‚ö½2‚ö^Aû_AtúëúçÖúëöúoqý¹”ý~ùòC œ¬´{錶äŽÔ–Ÿ¢Æò©±NÔX×ÿBcÔX=5VGÕRc5ÔØxjl,56†«¦Æª¨±Jj¬‚‹QceÔX 5U´“Æò¨±<ˆº=‘‹È%ä2j-F­UPk•ÔZµ¦õ›A}Ucc©± ÔX 56•«£Æê©±Æ½ ±U œ²´;3°e6»-¢‘¤Ýæ·Ï´ûvƒ´ûº|Ëð3C¬ÓM‚M\•=‘“­3º§î[aÝÿ’4 rä’T ®¼ž…gbëß©ø¹N ¶ FÊ¹æ žäHEªz´ouÖL:I§w*²Ï™“Öÿ?PKö>éú8¦¾PKcK5Pictures/20000105000011470000108C23467976F5D02F5B.svmíœ ”Õ¹€«gºgº«{¦gUDEPYAQ–a}dXeÙ•M¢C¾0‡¼îhlÅ!Ç<¹Ûr“\ƒpX‡,5‡HÝ^`©ìhÝ—q´-d™C8t¬­ÚXÛñº#ÎýÆ€«ûI[÷HÛ†åÌ!"õ°ÜÂ! à(sÈmæ‡à4sÈ£‡¼g9æqÈ1ØærmªI²&‰CúÁ*ÔÓ`sÈpsÈHø[sÆ2GšCd¿#ö9qˆçrsÈ€‡üÁ²1]ó%É5‡H¾ÏMá›üZîÙ~C¢CÞòkܾ0‡¤{²Û²"Á!R/°ìléÐzìߥ^û™;Š<œcë'†Ô5âqOýº(¶5‡4ƒÛÌ!O$qHv†GÌ!ï{òOsȸÐ2-‰Cî„áX1…CÖyRÛRögšCJ›C¤Oð•¹C1‡Ä¯wërüÈøOÓªGûoÏk.[~\NPÎo×ä:.˜j1©”tLJ:&%“Ó·câwÎŒ¥–óÓì7]•JàŒŸtUò;¶úaWv’«®¬Ó«{~¯îE[´íؽ[›óìÐÈÏtéÒ8òu}±#_òyF8n¸n|*¦*Žõƒ§BþNp<=†;M~>gêr;îÜÁ~3ÝXvø–åO(áŸZ¡…s)ùëæ âZã ay_õƒá ,Ã,œÎÈØ–ÁüIJ¬àL`Ûhö­ÂçÆ±4ˆ­ãù7œuCé°H—E– =GÊåœ}|zU–#¯£I’>#µ£‹,Õ>u¹¢6ÎðYmäwÊóVTÂ&_ÊM…©7奥ޔžú€©7åùSo ¤Þ”‘zSfêMÁÔ9L½)/”z“›zS8õ¦Hêl¤ÞÔ>¾¥¸®¥C,?BXf¥Úk)‹BJˆE’\Z`Ò:ÒAù¶KÓôó¿vþoÈÏÿ*(öæ÷5˵ÈO·ôSÛüÊ:G®º~¤UZrçÒ$Ò_HÙäu¬¥í¤:éšJšâ)mŠ'ݺ…©7{ÛþËÍ({9ÿ©mÛUב`IÛ–#$i0sIï’j’×N¤'H¾’6ýÿئh‚?ÝÔÙ»élPú§mO—<~¿¿çù§’<—hkœAç”·€¨UÙ£1½Ùü])÷\-çËäöŽíËù{(ŒÎ9ÁçÙ8‰óeØn†Õáv胻á;u|~çÂ/ár+¯‚YäïRX)KoyêÁcä³%|Âõp$\ 'ûá<8®†EðUØ~Âp6q€çÁXS¢¡ð0¼¾Á7áf¸~ 7Âì¨ã¼/‚ÏÂîð‰|ÚÃ9¶~í·¾(c`9ÄÖ‚¯Â+á8”ÛMø•Ü~B?ùÛËHþa-É®ã4…ç®8ö…·ÁëáÃp\ Â]ø%Üœ«C@oÁ á!Ø…ãdè§”ãü7̆«äî‘z(¥ãfUaê±̇çÂaÊúAÝoyP?·+¨Ç9ÔãžÒó\Òó…4“Bš¯!Íçó!Í·ŒJ9¾i¹*¸ZΆ®–»£«qêj\nq5N³]ÛWã¸ÖÕ¸¾âjœ÷¹÷O\­‡#®Ö‹O†$ ÖzË k=–‘ñbX^+xØÍÖ_Õ!,˜ ?¡Ý„e¦ÃÇá7œg*ü¼áN9?|Q†¤à“ðSÚí|¸Nƒ†ãá\ØÞå{òÚ,é³a x˜xÕ»aE¸†áðŸùB†à°‘Ä–¯Á¿S_¯DtèmSDÇY7Ș5|)¢õ¿ÞOÆó v¬ —´¶sWƒÛÌ!»à۴Žp-é;RïtMÕNÖùKžküË!‡Â’¶Ä á–W¡¤‚àɼ"N†#5T±•t>ê6K?·_œ£e…©7{íË„’ Ô~$t2k¿9–+M¦y,vtºF_‚¿Œ”™¦étnÿB^…©7{ãØÌò¾#wœÔÆQá9Ô^ÒP’oúOXïkxa§¥Aäô"¾ ÈÖÅð5þN“>¨”€Ô$¤÷ˆXΔùm,guðê’°Î`iÖ9tñãè€{ˆ*¾D&:åIzi‡3u–Êv¹O‚‚•}:Gï<Ÿæ£l[H›…a0SŸÆL½…[äþ>‚÷f¨å>v#¼¾ [Áo`XZæ aì?è\Ã}p:|.ÏÉ},|JÇàc0‹F8Ö…÷É|+xœ§ÃûáTø4¼ÃÃ}¶^ ûU‡³`8Ž€óep .‚ËàÊ€ÎÝ’û_™‹¶S惑ê‘þAê@ QŽá° œ/ÉÐcu’ûW9v†Þ‹OÀ…øŒHŒH•2tœ@btv¦À5ƒpì’¡½ù«àãR:‡l°Ücá°”L¼†<”õ½ƒºßÍAýÜ g}PûQPÏéyk‡4Cš¯Ñ!ÍçÌæû‰–cKHËu0¤åLsµÜg¹¹Ï•¸Èœ<‰Ó@Wã6ÑÕ8Nw5®s]ó]ûWëa½«õ²M& Ã7\­7¹ÿ•z<÷R¯À5𠇳mýxøžL4†o»úÈþ¯0wÀC´« pü \ —Áiðwr~x·ÌéLÓA¿zðZxì Ю[À}>½} æÈý:üš¸<÷ÂÛ}:Ø8.”‰Ìp2ì‡Àf0Ö‡5B:WÖ/ñ‡¨Ÿ2ðù ÞoÍêÚ›`öø´¾ã×ûÉpyŽÙÈrF‚C¶™Cþ˜àaæØÜÒI:H°~”Â!÷dhìd€}C‡ÔÎÐØ—ÍкHæ©»­­Ëuæ'Z×âH‚C:›CÆ'8d¹#ν ©f)HpÈ øx@çµ®0‡ÈØ›L’—±³œ+K<`£$‘‡“3tœoA‚Cö™CäFmsÈ¥æÖ°¿8ÜÒÛ"㌛R8¤¡‡^‡ü&¨Ÿ[ÔãˆCä¸õ¶”óïZ2@^¼óL So*öñ¬,»|âÍl‚a%ëgi­–"öEZ|Mí¤7÷ Ê©´Ä«/ZM•Nb¦>Øl ¯ ëCð‡`Øn è÷Eüs': ãfêÌŒ8Ãðž,}¡kt–¾°Ù–—¾¬ƒð|›Õ S~¶€ˆèŒœ)½1¸&¢ÑÛÂ)ð8Fåå@øùÞ(ßÃ: âEø-\Ö¾Û}òN‚ƒZî‘°OXgr\ —À¦R~XO·ä‰Œ-ß=Ügë}®îWfÁ6òÖïŠp&¬ÖïNŒ{6“— ¥®Âú°»¿äŸ4^òOºƒ4œô0i i%éÒ+¤5¤HÛIiÄçX~ /‡Y¤>¤³I7‘êæ‘.“Ùh¤™Fê"K¨Ÿ«d¢ ì/Û²ôÅKy(> ÎÊÒ·¼Wx(ëß°ý¾³ÏUÎÖã´ÌÖãÊŒ9L ‘ó.ÉÖ|lÉÖ|ɤÉg8ªù>?ªåhÕr Žj9'EµÜ2y@âðTTã²9ªqz7ªqûÊ& dæh\ËçhœeR‚ĽQŽÖCË­—ö°@úçh½]•£õX”£}’p äáý¶~<ì;Ã>°.왣Ïx:ÊL+ÚU+¸YXef¬ §É¤9?Ì‚íáwä»ü8ª»àÑL4!ƒ°Á—àL¸N€Ê 4œ ›Â1° ìÓ$.ð@¶ö‘_„ÃGa-xk¶ö¡‹²õk¸"['µTÌÖ·½RŸ!øz–ÞÓ¬ð\ï'e@ÇŽ§k‘sÊR‡‰CÊ™C*ÃL™ ‘Ä!¿7‡Lö8Df÷µ‰hl·%qÈž°ÆöøM‡ÜÖñ‘a­««<YlÙœàˆ9DÚB®9$lÉ kÛ‰»#ÝÃ}¶^žØdšC"æqшÙáqHGsHQXó4NòŸàÉæù¤­¤Õ¤"×å7°)Œ˜C*y27…CäýÓÞæ"sˆü#àPsÈ0;VØú×m¿ïìsâ9N‹‡L5‡,ö8¤’9DòéF5߉ÕrÞÕr‹C&{²)ªqz'ªqKæ‰sMsHCsH‹­—væî‡8ÿÆ!³S8¤NH]$í¨ƒ9$n‚á"xÇ!#Ì!í<ùÈò<’©³9÷%qÈxøìÕûfqÈhç0‡ø’8¤>\˜­ãâJæyÉûòl}™[6‡ˆ;vgé`ë Ïõ~JtJ:&%“’ŽÉéÛ1ùeèÜÌòl"¯t‹Xne÷Ã#¹)o¯=ÊËŽò䀨ÇÞ_—ÿBj>i©†OÒþ$ƒÛ¤+Ó4åžÈñJs~ ï¯ßÈòXòÓ3ûDRÈ Æþ«"”y’ô‰£Pç“þNjÂYï-æFôóŸtòÆ}þPK_UÂÓfBTPKcKûÿŽX¤X¤5Pictures/10000000000001AE000001D36B511361F44DAAA6.gifGIF87a®Ó÷L†„„*,BL¼‚DD &4¤ÍÜTF<*dÌâäT²Ô,).„L¬Z$Tj¼Ô¸\DB<>¤üþü\œÌÔ´€ &\9läâËÜÒ”$DN”l5”ÂÜ\ŠÄ$24I <6$ŒZ<¼ÚÌ\" "$ P´z4DDGÜæä$2l<',DJTd~Ÿ 4*1NŒ”v\ A‹¾Ô<2<$Z ´Úä´fT”ÏÜ<><œZ$ [äæäD‚¼ü¼Â¼dÂÜÜË|Ì¢„DªÌ,2>|j\<|ÊܪÚä¬r4Ô¾alžÌ\–Äܾ”œšœDR]|B$„>,tR=L>/<ŽÄÌž|œFt" <$¼ŽTLz¼LrŒTšÌL4,:|ÌÎÌ—>dfhtvt”VLD24l޼tJDÄŽ44V”t>¤~d\^\”R$tÊÜŒnT<>DÌš\´žtŒ^T¾ÞäÜÞÜÉ¥•ŽR&‰þ‘ø¨¤&:¨šœ¦9cR-ÔGH‘J'Qvâ9¤å Wäeþñ5h ƒ¦x颂bŠë—•5ªi¯’‚I¨ffzY¨¡PÚé²ÖyPPo6xМ²éžÔé‰!ŸshF_¬™%ŠèHÃ*:î°ç*›l¤•î:e°›YIn“òº+³ør÷)R5ŽÚ”©Õ:g„EÙÀz‘¹7Ÿ¬G†›+¯Nª{¯¸Sª,ÅQžK1–C¼i²Ûjl¾$3ç,BÑÆYµ…§ª:î)[·°"Ù°’·›³Æ“Þ ¬»ºŠ‹lÄ–»iÈð¢YòÒ¾ñˆ£câù[jŽ,Шq¼ž«4{øÞÍ?_2˜Ž)¶Ï•–=ïÆK~¬ô€ôNZæ‰kÌôÝMt£þÊs¤¼7žt$pQ}[(³†^ .ÞÄv,#ãGîàu›éíˆêÕi=dd¯JÞ¢ã‹nzä2XbI%«·Îzë º.ûëªW«ºìª³þºáÛ~wúè(’þûðœþmüñÆO†üÞ¬ Ç&ñÐG/}¾‡ t*I\Ÿ=öÚwÏý÷Û‡ï½øào~ù蓯þùë§ÏþûîÇßþüðÓ/ýøß¯¿ýü¿Å'ÿ (Àð€L ˜Àô/}Ø‹`$HÁ Z°‚Ô/hÁë!¬=sHBú!Bް„(<¡ Mȶp….Œ! gøÂÊІ4¼¡sÈCúp‡þ?ì!‡(Ä"ñˆ(|á'x²Ää"$b I‡~TñŠVÌ"·¨Å.V1 p!¹8B}„*CÖÃÞ×HÅ6‚Ñl|£ãHG8ÚqŽw¬#÷¨Ç>æñ|¤IÈARˆ,d"9ÇÂýX¢>n0ÉJRò’–Ì$&7©ÉJ&$ä$&'ñ H†ñ‘a´¢W©ÊTFñ•°Œ¥,a‰ W†q–`Ìe?¶Æ&]‚QÀü¥09Ì`ó˜ÆLf1—‰Lf*³™Ð|¦4IÍhVsšÖÌ&6·yÍnjÓ›Ó$¡8OhB,È—èL'.w)ª0—)!:>1Å\Ö{$þ¼ç#ÇÙ~úóŸ ¨@רOHþ³Š÷$á ª7|:•§¤"Dç8Ñ5VT¢µŒ(/ºÑŒRÔ£)Fá Q’Š´£$ýhJCºÒ‘–”£&m)J_zÒ˜ÒT¦6UéMwªÓž²”§,uä/O9Â%:ЋHcR“:Btœs•_§FûAÊ Uª(Íå)k Ouz•«TjÃêÊÄ‘÷\a0Y¸Ö¶u„oíG\ç*L¶ÖÕ­w…k^åºWºÓ®Åk`õ:X¾Ö¯%lb »Xε¯=ldÕ8Áz¢’œ¿4á1+Bìu6ŠžµàgG+ZÑ’$rݪja8Oqt«¾Üþ§/%jE’Ööж%)n·ˆVWÂ’'4cï†rT­¦ò”mer‘ëQå6—¹)unt¡{Ü™Bu¹Ö•nusªÝë>7»ÔõîtÁK^»è=¯zË‹]“ªò½˜µåP3+I~æ¶¶øÅm~ó»ÅË‚$‰ó½,«[Ìòs¶ö$¦h%¸à5¾\µ%XáÊËL8ŸaL+†­êP®jت>¡‡;âg˜Ä'6qˆ7üá‹8Å/^1ˆ[ c£XÆ.¶±ŠiŒãÏøÆ<2‡LYkUŸ¾¥9ÉêáÑz6´Ov2i©ˆÚùºVÂI˜àzU+¸ª°~ï›[2GØËaM3þ…[8n«ï-©DY¹]8V7Î|¼s)Jg¨Ú¹Ï­ü3žÍçAËy£€>ôxñLG=û¹ÐŽnt¢ó<é8ZÉj¦"’ Æ%:TÓeÖbù+êK§ò¿jîrX œÊM÷Á¨Dri¡ Ú(ÆúÖB0¦? $"5T¾#–á`O,ìÄ{†Ã1²­ì&›«ËVá±ÍlhS[ÚÍNá³oymN[ÛÕæ6¸±míq{;ÛÃD¡|S Ö3“М¯kiåY«û“ç¼u>ĹoÌÎ3¡Zýòeà šÌYÔu—ï¼kTœ‘[Å®©¥šÑZ•éÅ-.ÆŠGõ¸75Æþérˆ¦¡Ó-¹Ç7þñ•“¼åyÆGg•Ǽæ0§9Ès^òŽóüã>w#|AÍá…s9—žF³Åm{[R‡Z·v*eû‘Týê¾­*¨KV4Ç÷ÕR¦¥|o½kUrH\;2Œ)ìq‹ÛÒ.²³S¹kÄJ`û ënOO0€ù²Ý.Bh*!îðœ;âß~îÅ·Ýñƒ‡¼â½mw¸SžÍç­ Jvß&ÁœëNBpŠÎÔÃPÁúˆòÔGXåqZýöóE)Ý`ÍëZíB•ê˜MÉiÍ üËa]èp…r=1?zÐâŒ>J….ý~N_ŽÖŸ8Èþ©çï=ÎÛß'4lTÜ`¼`eõ1*ò$`ç#¥þ¥ó¨®ÿúöŸ¿þëëó_ÿÙØwîQ åep—t¾·€\Jpa¤µ~ưi FW_ Á{%€ %P\¶eÆGt&|\—`ÁfA—Õ[ §vgkgW BDÅx(Tnp—MwWM…GY¨ãä˜ ÌÀI@cÀ Dè~pàMÈ ¨°©O€=ÛGEZ ¹ôzF`Là ¨`mÀðH  ®`…XmSà~IàAÐ÷À$¢pËx…„Ìôƒ>؃þÏdˆ‰ˆˆ…Ȉo—b¸v‚¯…Yð¦f8€ `øKzpo€=À†ÄTy§B»ö_²¥P%àeº÷ ‰Çdª¶yÜgpB%`e·‚öp3£=WÖsõ7U#gS'5q3ÅqQe‡¦ #€ ЉÚ0ý°…Ûw]àK¨ b8T ©u< J @€ Æ zp Wbp#TwW°ŒÍxg0„Xs.5ŒÁh€2EŒÂØûèqÀhŒü8ßWQ1ØjFÇOžFp( IP¯PKª§I zîÇUÞV ‡ R‡`ñ–e¥”€ª5‰¾·Z[»–jFæ[\Uaþ|À6lø$„·Äv.vlzgYCHN|ד éHBJ¥GBºjч`Õ…_ˆ‘Û7„-`©P• ˆ º0Ÿ€¨px]é~BÙ“b)‚˜`„Hli¥“6bji–i©l8¹vp¹–o m…UY½’®¸Y.¹ ?P$¤zP° 3ð‰C˜au†%jUFp'(O¬xa_çylweµh’Çw`œf™¹¤|möÅe™ésÀtˆFŒ8g¯˜‘§¤Œ¨àF€ å0à Ip3pBb ý }8TG±w~¼œ8`ð «„Œ½ù›µ¤î±i`~O¨šðþ—š:‡š)w‰š«É=çÛ‰s¥µ| ˜O ˜K/PŽp Ž € ¸„J€Žuç÷&_¨Zs€:œF`(HN›–Q]W|2ˆ’ G™‡kf“[‡emynoùbáfw™öKÀ %°Žc xpI0 Ýðï…ûÀù@…À•°àš'ä Ø°Ø÷0°õ( ?À '—˜¨@ð £;àP(…(z}øHd©wrɡ䶓2Æ‚‚øa`*nbº¥Ö¡˜W“¯æŠ‘V•HNé Ä´³p‘'Ô°zÜÀ ?q¯UK¦VJ þž§e4p3ؚȔ’š‹· ­Ø’ÙÃPçeÂè÷8säÙŠ*¡Q&”œoéJ³©š~úS†—Á¦fW€úR;gÈešØ—ž¶šs›J«»z«ˆ¦ª÷¨  k-9u¡Å™¯ ìi|¤u*¬¶t’GšcW` zU/‰v½Ä™e–]Ê–m•c^·¨±•ƒØ“‡jø  ¥™ˆj‡L¦KÎwU%YQ1Æ¥™÷câzWÁ––㊖Ödcû:dûÊW†E’ÕŠ­ŸwN'y‹[õ¡¶xkéj%)’À„kú{«u¡ìÙŠ¯ fŠd Äu|9xq¾š^¹z¬ ºþ™¯ ƒ×*[èê±4ËYž—Z´[d%hµŠžÞ×}æÅ¦ù³/×^@k´{t¡j­vNÂj²Íúu,ù‘[—‚`4OR|jµ9’ÙÚ±K;_Šƒ3ø­4™nbzy›°®T®GFt¤ù¡_©+³`k#•¶x)b×v—Àµx‹µ·j¸;¸0T¸gI¸6™늠·¦e˨­ ·—okÚš¤Ôurk©”U¯`V™¼§¬ÞzY#‹F ¥K¸x]C tß™f1è{‹º¡Ç´VK­£{t—õº¯‹ºçúf³š«B·\5¥©ígi‹SÄ SÉËJ°&¡ÀI2à§7Û±Q»±'þ$uÉeH†µG­É‘eµ Ûµ1Ë{Ç­ge·«U¦Ì†¯&›hµžmŠVË’9v´jÖ뙚w` zd…ˆ¸@(À>HÀ‰hÀÜ·¬z Zµñ»Y_˵Ô늨ô˜™Õ©"é½Û™ºÆÊO&Áçš%«¦hžü«°dS©KÁðë¬/K¹JKp+»ñ;³™êžéåÃ=lQâµãe^Ù\Ô+Ãøë[ï™’;aú4¿a ŸË¸I€µ3 ©Ç·»Ž ‰’šƒ¹k½»ô9l2ÃbMu‰·ÇʱU©:›9 ©ZÌÆ¼§ÙjÆj_õ»ˆùXÆ´ƒþ~œn|+X<ÈŠ%Ȧ¹â²«µ°“ðÈèðÈ’ ɓɕ,É‘lÉ”œÉ—|É‘<“¼Éž<ÊZÆapûŬ´’ñ] xÁ˜i[¯VºnÖ¼ûŒx¿œÛe5\±Î«¬Òú¾F§ÃŠ|Çü½¾](˺ÝIhÒµÌ÷ØÌ§ys÷§Nœ¿½õ ¤Íÿ³ÍݬÍàÎÜ,Îä ÎÝ|ÎåœÎIºá+ÆF™ÆçÁ “¿VÅGM”ÇÁÃêÊ.`ïUP,Y»ÚÊÅld8KÙ r,,¿¯øÇ9IÈn¹“m¦Í–„¼ü¼I¦BDZ²´A † =o±A&ÍA‡ þ³Õ|¿Z̦Ǵ¨—ДÉf$k=A±–¼L¹ê+p¸bÙë™KìnÖìj\Ãô{®gЍj¼Â髯û|‡Æh™š²ÓlÐ -¹L’FF‚–µfÇOÙ—=ë9½Ú;» mª—«¾•j.,¹§Õk7ºLÑâ{ׯ¼’ ¿ê)ÔöŒÑÞ›³­ì™VÅÊh=¾bÕB9Yy:†È;¸vŒ=cÀ<¹–Jו-ʼnÊÔÖ<ØêÖn§¨€°èÊ,{Ù+}ÁÉt™ÎËi#\ÓìpT¤<ÉšlɲMɰýÚ˜,ʳ]Ûœ|Û£ÌɾÝÛLÛ¯ýÛ¤Û¸ ÜÄÉ¿½ÛÅÊË-ÜšÜɹþmܼ=ݼMÛÖÝÇýÜѽÛÉ]ÝÚ-Ý¢\Û¡ìÜÈ ÝæýÜÁmÜÙíݶÞâÍÜÜ½Þ [ƒÎca"4 L´ßüÝßþýßà>à¾a$Ë3sOú- Þàþàá>á^á~ážá¾áÞáþá â">â$^â&îà8AckBN%•{) 2Ž 1{2NI•Dã6Žã8®ã:NI¨`ã/ã3^ä2^œGä6äL¾ä;NäBä/ÎãN.å=^ãT>åU¾åMÞäYžå:^äM®åPNä^~ã3^ãfþä/ækÎædÞå\ææ‡æ™Ôæ1~åGnäþCŽãi~ät^ãuNæzèyÎæ`~èvþå‹ç>.è\¾är>é) ú}Bºèú@B .Òä”}UäZ‚›ad°$gd\wŒÑe|µ‚Ob4NGA°þi˜•ê´Îªõôê·®Wûiþ„꾞E .bºêÅ^ë}ŒìXå@Ôê}ŒÕýKLjªìxyióÇì'¤A°~RêÍ^êÕŽOÄŽUæëŸÖƺÎA¦ÎËdg¼C¯.ißì1T&‚ðŸgœÐŽИw¹ç6NØ'¯ »¸lØ‹­œÄ¤­ÃâÖµ©Öu˜g™òUñ©@B0šÏñXôPƒÈë솒½Ûþïñ•fœæKˆ—Õïmoð/ñ[ ]œµð“}ñ–.ÎP›žeúÞóÞÚ°Œ Ï>W®©Å}¯ &|ñ¢ ÔÚ¨™Ù‹ª~t™æÙDýÖÒnÊYôVvxý LæÀ/¸¶c-Áó»†Ô,aŸUG_»Ó›‚/hjJoÔyy™‘Åq?[¨@ïÑ+B+.Oún»mvy,ï´ìu° Ö0ûêN]Ö]øI ð¯|·½ÖYkÅ}x¥ŒÑ.¹¿œ»dò¤‚ݵ¢~Ø[¯—EÁȧ—£šÐÓ«Æ&ä÷ Åó$Ôâ@¿™ÑúË hŒªL·uŒú—›¨ïº{¿¹8«ÖÌ­aþËÁ«¨êL0Ap«—ÖгŸÚw Ð*½üÑ CÌŸÙ¬¿³£M¾meåÔ‚­ù%ÂA`9ßóô,N-n¿YÌV/n”ÿýÑ/‰@pPÁI‚PáÀ„"$ÈPaATZŒ˜±¡Eƒ¼øQáA’1J”2¢G'W&ÔÖŠ"„¤¤1ØrcJ,E6ôTdÅŸ{¦ô™³hÈŽ¨P.Ô™‘äH¡ýN6 :•hÒ­N©†ìGU%Ó$¨¡“!Õ¶–Ì‘ÁŽ­>„“dÒ‡QkV¨HvÈw*ÒÁ}ÅFZváC’A~]Yåã±€¿rÜ ñ1XÇBïþ:€‰*) ,óPÀWC&Úo¬FÃ)3ïÒ5ä¦/RŽÌ¹õÆÊ·«îÄøÏÍ+— ²›7ɹ•ÞÊ`;Gv´‚h'¦(öòjµI;¿.ì0²Aô3 ÊqvnÄ|u«g=Ø7èðÀõÃ物+f H §ð—“Ì<‚@³ì¯Ûœ‹Ï¯à(Ì%Ê$|ÁÍì{ ±ä$ì- ¦ 3É8ÌBK­ìÜ‚K®9¤³ /— Ëð>Ù’ŠCYË>ß²m,ü<Ûl9ñNì±9 KCÿ>ƒ,$'˜øa MƒÃ4+lxêȧ¶R‘+¥°Zj7úƬ²<⎌1¬ ¼þÊÉþªÂM©äÌkj©6“€Né²³ŽìØ".ïü2DáÆ 2L u|­¬öüRn¢Ðî¼Ä•$ËQ4³ /ÔJ3…!§^:(¬þäãÍRå둼JÙ«ÏÖIw•ˆ*øÒ‹p¸L3±`/ZQX‰JÕL,@ÑHŸ¯“‘®$j”NYØF=uYc'ÓöÑ7*ÄÛL-µ2ÏÔÏNÎhÅ9°”tw¥;=’”Ò9‡#uÓxïœªÊ‘Ž ØI¡pSìÍ ?üHTÿBÔ\Fb°Ø@Mì‡Ðë²£¸;N>vØô(þnD„>Áâ•Wfyå”[Vùe˜Qž9æš]¶ùfsfÙX&Ùþdز ×5®¡ØäÝé2 3y¹Yñ“êWŸÃ/ÅŽàñGÈò”7ÖÇõXfÛõH¸œºAFãšK lyõìQ¡Ë«zaƒ>‘!o½÷æ»o¿ÿ“U”Ž#*¡‘R&ÊѸž¨Â•ÓœçDg:Õ¹NvæMŸÚf¥.;¶ ;raˆÇ²¸?ûðI8|šî˜éÍb*^¢‹[?}&M‚ÊkXð&þ.A5¾P7Àbªè³p¡iHE:Ò¿-JÙÔˆYìR‘\®-;«z[üÂWuu.(?êÞ–ù1Ó%Lh·KQTè»ëñªT“ø„…ü¿ÿ‰ŽŽ!IVq´(A¤@op(VGªUp5«{ó*X¯JÒu†Õœ6bbrK†H‘ŠlÓŽ‰ºãJpb™SÃ&—þÅŒ\,Žv¡„0Tl)y(J ¡óÉ \¯¹ÑWÕ¾iÕ²yãêe»ŠYÎnÖ³šœfAÛÙ±zÖo¢í,j?›ZÖ®–oªEí¢PêFÜ`ž7˜VåÓjó]‹s*k,R¯ 6‘?™þŠ'® åhpÈGG¢û¤Špd½]67:¥ËuÅG*¡,YÓ™Yvš•´æ¯xѪ,½ ç€ÍkÝ¡æÐA}j—qASB"&Ô¾`‹Èk1P&¸p€ KòQ‚7ø3HmßèìFW$AE˜­(±$CÙÑ’vpañkÏéUô–WÄbEqiUÜZÓzسï¤Y³ºþ–2p7pÊÛ¾&Se–ëŸEÅO€l¡8ˆæ$1”.#DfF‘_šX´/gû ƒµ¬ÜêV s9Ý?¦†Šh€[éãßBÜÚ5¯¸Å§uq9É[Ù8¿¹Í.¾³šO¬7]9ƒa+ëê¹1|u–ßá°»\ã~„¯» "Ó`SÆ—®ÉˆšLØ}%x,7h°^®…¥˜(ÁÄ£`jH"Gë7¼é¯žWÜa:ËÖ!•íèÖ§*(&!m Œ[@R# ¦:¿Ï½o‰’¥=ö…ÀAö¡Ù˜¦˜@‘.@‡X*hÀ€bD;"ÑnŠƒhþ;è67¶ð!Ĺ•*ÁðNRÝæpM‹R%Ñ®o„Lú).(¯.1¬i}k†¸Îpö¥8—v’¶uЮcK>±¨Å°a¸~2dVdoèFš%°Ç;jr1tàšUÀPAm¼›þ&P nè W˜G?hþŠ$HZ @@…1Ì iB¬6Þó£á5[ ,°«¸l^½ç9›¶ë ]x­ÝlÖ9“ØÍçE;‹Áþð´‡ÆÍBvÒTŠËÜÂux¨Ðñ~êíg9¡aŠ! Þô-’hß@ gàvBqˆ"db ¦™ùA$ €Sti%èvˆ`yÊ÷£ÉÀ0@*`Š œþ §ƒér»‹Ç©ëšõ>e û²õ77|϶?;îk¯æCçkH©8쪳1aö√8ðŒ< uN¥«¡‡)A ½£…¶T„ˆ˜Ç0¸”ó”ha4ˆ6øÅŠü¢+ iºH怎ùÏ¡/qóÖ aÎîj1ô·Ð¯„»=ˆ3§y=‰ÆÐ#ÊÈBݳ=Ü=Ot80'2«;Ú@ 3¶T£ æ’*ú¢ŸX<nHÀ€„ › ]äE+»"9 'ìIä0à 9y&áJ…Ù•4s-[3/. -»ÆÃF±Ë³1ü(Ü›õ2FŸ¾Œ´**¾Œ¹ ª›!‰ò-æ«•>Á›#ŒdÄ|ô'XiÄhŒ¨þ{F¸‰@×{ý«(&Q.[éÄ4ÀÀE±ûD3t8¯CC®S1APæ®@©-µ±1ñ¥¸ÑÄ›€)™Àé°Ç_´³(3³šbd¯¥H=×Sª+ü§Ÿ@y#‚Z´NÇP\@† Eü:ñ Êl,œõj"fcC@‘&§ˆ/)’ûˆ°_¬07ЧÔ9Žçë* ‹IÎ!ŸÀÊ$ªÚi"ü#3`’ ƒŸE$–÷i,‘T¢º´Ë»Ä˼ÔË!¨e< D µ6ùÂ1V¤‹å°2Ä ¥I)4)®X™’|‰§¹Ù¿¢1,ëYAÆó¦òyI¤ñ3ýÛ;2ßÑ}HþÓTMÔTÍÔdÍÕ„MׄÍÙ¤ÍÓ”ÍÚœM×¼MÜlMÛ|MÞôÍßÎáäMÙ$¤ eÓˆsœJ|BE‰Ú#ߊŠÈ£áð/}éÀÏ<¨r¼0OÃѵ3ê)5É › £>±àèJ2‚}Ó·÷ «OøôµùûÌÏû”ý¤OÿôOT°O«ÀÏÐÅWÁšÝO}ûÅ~ÐOþÐûÔ· íOþ¬ÐøtPëŠKfdTLU̱ˆ ŠáÌ: UQ*A ¼A‡IxQ•ѵQ}Ñ­QÕÑÑQ­Ñ!ƒ!ÝQ µÑ!MªšZ*b¢Cs0ãþ"äŠ|¤˜»¢˜Ð”Lß³´+Ÿ(Y&£ÙÊxËòŒÇ²$Ð¥¥Šx/q+â›/{³J2ãRõ©0 »Ÿ5é/–‘™–éSšá™ÔAÍ™—ùS?µRÛ"ûzæH(íÌ¿2 '¢ ·|Ÿ§¸8ÄI_l&e|B½ Ïþ#(5l2’2Ü Ñ–%«˜:YIñäJ#I!KižÂU]í \õÕ]åäÖ_%V^åÕbí UÔTK¾ ™0Áª†ÒË“øYÏDƒËŪC3ª&5Kí¢jÝÇ‘lÊ@8|vì½;U5/;.=j’™t•ÀXV2Z [!’ÚÐ?Îþ¼ !ÐÊJc£•„lH š #K·Äœ¸d„ìVâ–/%¬ 2ŠE5I®Ùú©É`+_óH É·AÉܵñðC‚åŸHi¢'¨Å¸ù’«Þ∎îaBœXd&£úÝ [I•]X3­ e”š¹…KŒ…Øûñ[”X­È€ 'gU““ äÕV¥±º¬½Cw­ÚI\Zƒèµ_Ó%b}#¶ _µšG;Ôצ¼Äã}Üã•Ö¡Ô¯Õ߂߀WqmÒÇ" 7á‚Ù‹ÝØÒUÚðÅ´‘¹”©×æ]…’Äwí@ÐÜ`Z7„Zu´?§˜Ãêì©™tGv]—Íu²|XâLD3š‚dµ·G¸ÍÓá`”£í§ê­¡gR4ð±Vø}aÐ}Ö›Ì\GÜGøaš°­G»þ¥ë Ü3‘ÁE¶RýŠ«ã?ˆÂññ+Æ„ÞK9[†ÙY:M5/%Mxê·èÝÚø•`ÂX —â®ì‚]/žY® Ûù™)mQ¹ÔVÃ}š^˘á«]ŒÎÊt3úß¾•T;…Yìò¿X=¸u* >³úA ì­Ù¾õᤥ5ZâD–_?ÑH}¬Þ’4Óï" º]ªËEŸv=¨¸­8 ÜôMˆ¼“dÕÏGMÑøãKä&×èL.5Ÿ’ÂøXÑŸ˜œ“Œ4Kš_æ%ÙUfÞºz×±m=ydbhæaÑ}Ç{Jjn AÖfîÈÞ;Ê ‰ºÚ Õð°ÓÏaÉ<ª£[\þy½h6ÑjͰÅ\å‘Õ;iM]Iå¦É,Y‹” –`öQá%1[„m×âõ1Ô 8¨¤»V‘^B«ÐõÀK–¬Õ¦;2\ÊlféT܉UÑÀðßVÆä#Wœ\µ E‰î fÚñǵIX~àHIÏš¥Zþ5bÆ 0HåÜ,ö2Zš'Á¤Ý8dväŸx%ãüçIö¢§VÙY1Ä%3Ÿ­¶ÎK¥j¶\µ°&ÆEݱӉ̎³›e_ ¾`½[K39a¡ ÄH\ÕÓá¦0­¼`x¥k>†V²eZž]i$¾lά#ÏÝ®ÑUèµ´-hÐ(V_ç̌ՄmØXÞ[¨0Ù;¨d&I*-í»2kþSe¦õÌòæ)õÕk.3lãpŽ dã1Pžß®aFÝâõ.Åg¹7E×â»"Ù²æÏ¶Ôožjó.êƒý2JF®’ Àîïm¡Ò†j´…Â.Ý«ímÛ¦SìéîîT fcô6Iª Èч@AóÝ%Á%ïê„Öë2 ÚOþ›½ËçÁšN˜Þñ›Õpù͆Ƕ½ñÆk†åh: —®g•n&7†ãÖ]ÜÍ–èB×Ç'g5.’r)6ü.Ù¸šîî&VôXþ/ò=œs×õ‰‰‹ oŒö *NõNAKñmrå`”®¥ƒ™¡•žê-á±h¶æÀE&Õìéë L¿_¥ŸÒÎÖÚ¨*sX_SäÅé¯ÕxrÃrvöC6ñ÷½4Nr¡ñ´ÖXpIÞ´îç;—%Æ,ž^Æñe–¾ºçFOžöólñFõ•y—BëtåÚVÞ'À”¿– Tɶ®k4ùÜ{.Kƒk÷¨³ÌUq^XŽkÎ$.bÚ‰_„¾)›òé±ïæ.žqf%øô1’ýFz~1sî^x2*MŸ]{²"tžã€ôçýâï¡·îvH·Ö’iPÝ=FSþ=—ò…_wfÎØ›vËoß7ûŒu,¾mÉyáÔ[7ØŒÍ.~",òÔèl±´;ùå­rw˜GÑ>_ëR,p‡dÔGe^ÿ=ùíI•(þJ¼[¤Ç…M–‚>ëÓåRCuNQJGiŽŠ fù×A°ãÓTFù¼^WnnPWðÐnï._n¾Ç»þèÅZû¡_’¡ˆ$pPÁIÒO A lˆ¡Á…>|ˆª"ņìXðàÁG†ô¸0aI‡ =¢ŒØ/¡È˜ Až¤IÓ¡Í™'W&„NÆA}s†Z0G»¡úN’!èbΛÂl™¦ËŠ!1VþÙRäU°#JõºâÕœ8'~EI°ßY·kqªd«•M–b·¦´­Ý¹V³ž:Ó¤F»Ö¼‰uoVÇ‚'·¥\+_»˜1ïÔ øïHAM¡ÎIZ ;Cç\„sTg‰}á|D¬Xêl¨„+G&©3êX½rõƸÛ,BÙ&·"g¾\±Ìϲ ‡L1¬Ö‡ñöŽnðkwÛ%¹r¬Ë<¸÷²àŸKV³ûãÃ?nÇ•O…5Št(TM rCkáŇo…5&Ð_ˆ7×wÞ]†\s;qfÝcVÑÆÝF½õ5›q’¹ä ZI!\´¡Ç[Šœ}avÆj­¸R^þ g_Ž¿¡×MŇLpM—™h26ÔiG­vP?=Eaw>·ÖKåù–å‰0fv—o{áTÕ—Åqô"š¾‘Ô‘}žiæq>Vu?ꦥY %1h_z´ay¶qäY‚0v¡t%"XWmÑ(¡^—¥‹=µßjE•ÔK%! >·í©`l“Eú •x²™Š*ubWë Šê‹Zæ¶Ñ«µÆV–V2v^‘†5T&¥®’,‘•éÆ+HufÆW¬ÍR&"±Jë׉Õ]§F ¢•d{®vZj«EôIÁ¥l£¢ë×…p¦ÕŽa†x¤\>ÛY Þn›ƒ­]çeþ¾†Âëm©Äáì†ühС û*‡¢~v¡ƒ8FjáŒU’Êh[f²ÔÓO˜ö·ii7$à‹„-ˆ·ŽÊ'¤µ^™]bYð‚tZd¬lâÎ ×Øm®Ð,§EA¾çœ¢a±HU*ú³JK‹5yõRlì«3¾ú·_˜¤ÊI”6G“ª ¥”š…»îœI+8'ÌV“½ˆ±½û~í.ÓoªY¸ûÝ'[úZ#¾n&¢£e„-Þ®Z·„q;]tëÁ'ú° Èu?úä·ç ™úÇ©§,V4‡¨o,"žÅÙ\5Î*:^¹ÐìÞתÎ,Žnº{뙟|œgÇþÞÒÔ ëªÓ£äì-§íy¸a=«ÏuöKÝŪj97taïjP~©Í$jnÏÒktóší«øX·Ò(ԑ䀦_AãI±*†»š/Lß#U÷€t˜ M­l 3 ’Ç“úÜ‹j¿ª‰;†¨þÎl‹“Ѻž—0ÁL¹§4õŸNDvY ]þ ±ÊéÊXÇk™¢†u£lÅ$­ÚŒ‘Ȫ-YŒcH䓼–ءåÏ|ÜI–˜Pd•záj[4ÕµØ.èQ0„Ó’²Þ‡$yj\þyÒE¤ÁõáŽyŽ!aع2ÍQ„3EæCÍ .JTªþ˜žÆUþ‘%YƒÞÕé§µe¼Öò×ÄÏù jrÚœ|30í•Gu?¡ŠëPÖ)¦8ÅS¦2Íð-…mgÅê•­¬7¸F=ðt´ñašµ»R=–RáølT4泄™Ó)¿E.Q3Þ0û6hùÑ<ø KÎrY¤Õ…kmä’ýœ23`F&^(‚X”»)Â)&€zÐÿ–¨LTˆŽ¤ëçä„´,úà3ÛaÜÏÕ°ƒn3‘åãZ&ƒ¦;‚)óvf "­ÈÅAÊh*ÜÝEÀ…ŠÖl†ú¨¡S*eMƧ/µ4 ‰F”»­‰¤ eì¡ÂdžIz=íqHØðIÌYLþb!9jýuLŒzîGÖÜÊ_Y;†ÉÊ|Ÿ<*Ùõ¸êD—:ˆô¶pI©5ös¤CJÌɳy{ËY•O*VJìÄÐ3[º'í,0‡òñâªBÀÀIL#ƒ»Š>í¸½{>—„ °ÔÄ=ìsïáeV/“¤‹À°¤°c%lÈÊjzTY$çrŠ,a©r˜«T$ó–É¿³KF‚R§é°™&¶E¥c‹:©"¯ydÒcpݤÚqˆí,f»l9p‰ ~åk?Ðõ'¶:Ö+ë¬.GMòƒú’+ؤ Iñ2cš»vKu%Rzê)ˆôÝÆ‚Œþ´ÅDÛX¼êO¶¤û`ù–ª+‚.oÎ͉Wõó’Tš´*³'sçÒ1ìñóhÇÅìÉû±*ºwTo²gUØ? %G¼ìå2ÚZDÆŒ‰mEXçüKÆR‘P¨=,•°LûUv‡Ìçj‹y“Í–~beMAâ&Ù û”¤JDÙE‹fSX;´Ö}B|âS±tPU…Ì,¿Ë1·úEW…S,M¹°"cÔ(KUÉ)9”µêxñä=­.uþì§ZI¹Ž.‡Ê̡۽¼7[^½3X½«g›i/A8™&q…'³6É¥pè½³ELÊ‚ý—Åfÿ¤sG1jùþëÇfÁj]ùË)_SbŠí'ÞK ¹i‘#rYk«VƒÓŒ¢Õë}!Yb7ŸÚ¾jÞs×ʨê¥å2Åž¼&§ç݇vä±^õKÓÁXJ?Ièìd˜v\T+ýœ³TÚYKÔ›V…î¸ ƒê_Én¬žˆY/žò–c¤£SMTÁ7[ò²×,¤OÏüjaV»¼âô{‰æ1"Oº'M9—“åG)q“ÁâÜOÄiÙÒœ£IT7‰'TŸýW¨êvS-cåFÎSÄ.9¨±äK™JænÕ•ký«Þ$ò|/àS ÖZhþÄûuJíRD.íó: rËÛåÄbÞœC\ç´£þ²ÃÇÖêÐí’ˆç>TZíÊà¾!üÁN¤VÂi¥¨‘ý¢úä¢ð€ºT(*x3WÉ’GcsÆïI“O)ùö~ê =Ý kžD}ðƒšÜúïÜ…1s¿Ù€«n½m(îò\§é˜<ú˜,©®‰ãô õ¬³Gtcs™ƒuN»MÖuUÆ.¥”~˜á‚nû‰]•_þô´AÌ#&þÞ¡{Z}ÏÏßXã1Ø7/¿_‹{nkÚz˜Ý&øk[. w7Õï/¼Ô¨—Ó†ÉÙM¹¹D™:˜ùýäTÔ©ÛŽ0º^DéÕ‘8i‹YPO¬9 fX=`‡‡ žù•ßÚ5þ1œÖ¬P‰Ò?Uƒ¸ÔÖZÊì Ë Ö¶üÌ™)ÆeÔ!íôŒ™]wdƒ x”·áŸt]P÷A]ôÔgäÊÎÁÔËÚ‚ÝÔ´mÕ{^›Fí\Vl“ÿqÊ9™ËAÄMþ­Ù}]ÇÜEFêQã¡o^}ÙݾeØB¹ÑàaÒ9Ú]lyZ˵¡ÏÝ ÆpÓ*¡…ìß]Ÿ‹™UµÝGeŒ±˜P4ÙòÍP€8ÈX^mÔe8±ÎóÊDäàNÍÂ}ÙîQÕ>%| ŸÅùáöêMfqŸ4½æEâ Õö¼ÓÕÅ ™.9‘þÛ¼ÑXE æí­ÊwDˆô¤ÈÁ=ÏÈE\ÕU¶±ú`_ÍWYÒªÈ.jÔ'ÍÖ½VŸ9é Ú_ÄXAáßëD‡‰^7Ε‰ÉI×ÉÛ×%š ,…ÔñØ‹‘™õ¨l5á#SÝÖŠd£û¹.zÌ[MGïÄâbÕ÷9¾HZ–áÝxyÞÃA—‹YœÞq å×ß –1ÎKG´O9™Få%E¯ ‚ b&<Ñ”¡à! j {´aGÖ"ÜÆ!Þ ØR©åHÎh£Õ-!ψL¦‰ãV.âÈ- >êžb¸ßæô›— NXþHWÚôIÄ@²…­FÚ€Š­ÙÞ§)þÍJ™Øß´‚ÓHÔKùáúT“HؾEÜÇñKËøÛ.>ßDÒYf²¹Úl~ÓÀEÕ9”T!"o-“nM¡½Ï3– O–¡S$T%õÜØýXhÊŸ·-›½…RiÕƒÙ&åpÕ^òÞnfàϨ‘WŽÅ„K¡H›Ã#mM9² ÿìc’™"”P¼$k„ ‘z‰žK¡ÙâAæÕ¢Z>—žÔS¡D :â,®fC¶¤ÁA›)ÎSì¥"\µ£\ÙâѰpÍ‹b*§Yz†ñYdV]E„qGXñZ9_ƒYä F8 Œ=VâÎoÖRÒ]5Ð2Ú‡þM–Mð„©¤yÒ™ ®Ö &xÖ`ª1:všžÔQhN%á dPÀऔœT_Ò_z•[sÝÒ½ážEd#®Sø]’S½# ¦~MRæÞa®¥b¾]€ ‘~Íçå'w>KNõ—PêÔ+ÞþÐ9e—N^”¡‚€¸JyÛ0ž<¡%p¾Ÿg„ÜC§ ©0N§·È$V(*”DgCñg)6¥¡é¶UšV•J)aê#)f¡œ¡yÖAÒåDô*œâ¹WkeKJ°“êYüégýÕ•ð¬SÃÁ*§‚ßgRߊœúø¢Ô ®d§•þ&¹DæXBDÊ=ã“õäsNéY^‚@Ú¤tç³1ˆ&ᇎžŽ¡þkîÄmI¤œ5¡eL”Þ›)Ž–§Ðù)(U)~©ÿ쑌HS€Ë¨fâ¼Õ[JÑ^¹nß‚ æ¬áw Û© \_¸(5R”pÑ$@Éš«¾äÀUìŠúX=^œ‘¢^¾Úó=7þPÂEûüÄ’”&¯UÁž[Ö]ùÜR_¥Ÿ§Âë èç£Þ—Qj¤zÜÈ]- IªXjy×p^Oú˜ú`H­ì´MbÈ)ãBÚ©µ J’Äuz]v©ÂãIŠkÐUDCÙÇÅÑ*Z„'†¨NT¥éíþщ¾SÕ&ñÑÐEžÖ†™"Ù@Õ¬ ´IßÝήzP7&âãý ”Š9‘fÛ¡Ú¨Ó€v( žDo¹â`é Üqã„be›¥ßÑ¡‰\Ñ1UâîQÙjú­Á¢"mî„ÙÁDña_¹å«Ñ’dJúÒº&¬Çfl¨êÇHÅØnâ€8$ =îvÙÕsÒQöY„²¢’ ÇÎæMsãÛ"å66­Lèbb.ëqMÀü%ôcD Å}Þ^¬‹¢ÝbœÆníÆbÍhº‘œ*„”¥®Žþ›×p UÝÊÜ3ͯé²%˜4Ç|œ7ÆÖÇ’'L~)Ì©ßjíáLŽðµ6/RŠ á§¥6Šê®….§òpÅÙ !ÆqIäâ/:‘•¯q'ÊÒ'pâ쉠ÝjÙÆjþ$‚îÝÚÙ}rœ™J*(†°$åÑ·ÒJûs''íšUì!°±š#‡q.Ã!Ùý§DÆÆ tíHùhó%¤zo'íFÙMªž”0Og šÝß}›zÞ펞R2óŽáÓ°b¬2d=lEY¡ó–ŠèÒæ ï:Ö`ƺO~œTˆ!4ÎAOšï«B&稰dîÉ߀YÄ1Ÿt5ñ Öö-nµ¸t(ã%1Lñ¬AŒÖ2i’Q–-EnD.îb­¦5‹u¦0ÁNIA/é¹_”º“˜Q´§>ð 2 c W¦ÕsÛÞ¢.› º¤Dç³ Vãpar®²€Iþò©VsÒ–l=2§¶›ûà2å¢ HgjýÞžfŸQv©:×îéç"&ï5E×+g¡Û55G!cc›,æM˜á.e‘¾NòyªÌ˜õV¯nItí»¯*!¯§ðm­žž;aEan¨`«nÊ#?.•9&‚ -H·ðRsZ3oqÍ×¥å¨üöNÉѯ6ÔG&ýÕ¥YGßâ 9¡Â‚ 4 BŸ:%|Úžj›ˆMŽZVwhÏ\]{¸uQu1õ½âpXÖq9S¼6³ÏQeùТ`}¶[¯­9)^ŸaUì óôZ-I⇨Z7©ª0B®6û~+x³#r"Ô5¦¼¤-ºþ­æw*ÒÏI¦¤Ð4jr…d G°Jc8xRJÎW@í5åJ ¹FV™x´fqåm1æÝ´»ö°Itk+Ö0éy(-Ç·˜É3îò Kbí½Î5²ü yŸ˜í€…†ìÏíw1á[rw×,ñí Œ‘ðèi/rkÌ`•h蟷¬Ùe1¶©Ÿ&̺-é€+o­ås«,ª…O‹s©ÓÅ"C:ò<—rV“[SuS†ìïÌ&­‰®1õPú¾Ä _ÄuG£Y[yÒ´ˆìçÀ(FæAmš­t‘6˜Òž¡xÎ-“³œC!äÝé;NÙÜgóZpôªJ3þ<+ëïFêì^ÌM”öɽ›:ƒ–õ*„ª¯žn¨ ãðM!”âñd{Øl€Íª•6 o™ëâùÓXªå ªuJLR^ZSè&kq- «;ḭ̀eú&èAh´œ¦ÓS8Xßê`‹v\Òì8NsVm™Ñxo¿Ì “œ,ZgiFŒc´x¹¥|ÁSbx3k¦zÝ´+÷R/ò:‹5ëÞÁ¾ÖŒþ¬1ÂÁùR›©c¼n¡©àJµzi@rY =C¬‹M™Äwñm»–Dß®‰˜¥ªf C©K$²än4ÜXîkñ®¤–­DíŸäyòD/ÌÀhÉG]{{¨×þº|ÝÓ¹ïù£lw>Ô¾ØüŒ¤®€ûŠ‰Ý¡Nñ©‡[ÃKs½eÀbç:»’ÎÚíc—½â¶£G_n¶—§M§cÁ¨ÙBû·›ÇC;nE«ú·‘0™oz{åCoÆB‚.Bá®þq½Ú,ŒÊOíÚ«+OaÛò×í¢£I£:m('YKꆠš¢îEj³m(Ì–ökÛ;ùj‘¼œôˆ;kíÜIÄ??òD1st•K›PÅP­ô­¬3»:¶D66T³W1ÌÖOŠÙ“ÖÙY›[ÒŒ&¥-©9$p©š’÷/¬ÓÎÒ³¾> ‘¥ãõõ1…«<‰¶Zï+$ f=yOXž¯ìË™ùí°ª²ÕØÈˆ”jM–ݤpi¥«–.QÒºE ÜÖfš2ëfÛò+èg'3±·P«U¦Hµ«uKÅÎÌH›„žºoðúž×hëTÖHü<žX<]Rñcªþ…ùÐT)Ï’®Œëk±×|ïÔßlY(¢0U ª¦VdÐNÈ(=ãõ.Ü÷ÑŠµ‚µ,®u>—&£廣w?"< ›µpU!¯ÎÐu4Q’•ÃÁÈËún¿^÷ò­Acì"À[/Ñ2™–+‰mKó6µÕ ”R¶Jék”ã@ùië«)ÊÑ®Ž{Öxݦ²— ¦<…I—Þô³‘@_þ*L¯Hç;¨pUöªVx4g4)ä0Íã—å¤%“ï9«N 焟I¥­)Y¦„""¹Î<˃Î,¶±ÂE«X·ãŸ±¥˜‹%pO¢#Iå÷°ÅQåˆO¬$Æ¥Ênƒ_âþÛ Ýs.qDÔ“Þ‡rW;¹±%z^ÜÏtòæ%bï'K2û†RµùJGf"“ç¨Uh<ñë’˼¦7w5qB¢]u´Ä›Šn¦b À×¹& ¤ %RiKTåÍp#(jT˜¤“¾GvŒ«S‚_¡åÓÅáo£§Ú×]ñø¸ø Ë“ƒœë.“ÂÙU6D½|˦iXj:4»`ìíûÏü¸9nýT)É÷â'ÅáÝê6©Ò’ 0#¹6§Ý†Tt”­t7iΫ¢xx55høÐ¨_ÞI®¸Ú$,¤ xÑ”&M²Jm `•ˆ³^í•ÇÇé—]£9cû¨¥œŠ¼°À4‚¾²…·­KIÈ”ÞÚÔ¦>mA:Â8HR6‰ÓMk»$|IœC:®ˆ¸ Ι>©LÇ• ¢ÚÍ_ôxwÀrþ"ƒ&sõþWfýÈ2£œš鯉˜®#+Êi­  W˼ãT¿HÆ! Ω³Py%g¿ö‡9C*‡Z•gÉÒn»ŠN¥¾˜DC&Ó2g…Û2c”þh~-3L`,¹v¦­áï<©tCø†¤Dü *ówÇ7!£3ë!-àißYÏÈ‹Øó0ÊæƒÝOx¹y3^“Qt‡6Oz•ZP2¸ÚDûLM„åÎ[})Ï1){.§bRŸ‘9>-SÂì¼àöÒ´º›¯ÜxRÌ!— ̸Hm›Ê¿©ÓïÖ«ˆ5>g¤!–ÎLì ±—Æ!çã–iж‰L)_Æèš»-þÛ­º¾<Ï'ž•jÔàŒ˜½¾«¤Ð.gDg· èû‘/³'»ëÞ|Öˆv1´ÓUjú±í/ZMi1{U²g…q!¦ d)ÙÍ7Ÿ# ÆP.h{aqCaÿ×÷Ì ·W«kGØ]lf"YÜ1?wŠŸuäÖ¥¹§Ú¶­gOï,!,ÚúA{*I"s|?Æ/œI¸’<ó—÷}nÚ4o“Yé:jRMAï«s+tsïwÞ­ð{ Ç_sÞOqF§Ýh Õ¥ÿÞŸþä™u¹GÕ/uDI=l˜™OdÆ‹NÖz©ÉÄʺ|ÉúkÎûWêûü’o0ݹÛ/¸m»Ý”Ó~žŠÅÙLkþ_¶è:¾âßj 3øÇ’t&îr”ˆë6zl½GîØHžàhàǼRŠ )åErªG¥žhÐÆùzÏÞ)Š P¿(¨ˆr(â”iõØÍÓºj/f+á²+Ø–f¡Ê¶ Fš„êÍÄ*ÿ¾G<†ÑÎÒâ@^Mi§°OÌ<‰ú§¦æNø¼Ä¨Pãv¨ä.ëÿMä*+:dÛF ‘’Jý«z\/Ç„Ïæ *Û¦¨áx®ð0nL¤,ô¨,\ðÊÞÇZ)ëê¦Þœìž6 غg~r«È˜¶:0ÀÖã¿pìZìÌDìÄ-ÝX˃”‹yúäÔÊüLŒÅ˜fÂ’þ1ð‰ðL04BÆú8lßb¦dƒ¡TNÐX¥Ç¬j*°*þøç—8ÆÉ ¬ÿtL³vM{GëŒ/ÑRè¤h0bjQÛ¤mäì“YŽêj¨ÈâôèÏŒ¾ô°Êð}.Fù*-K0qº8Ñÿ„Ù0KÔ¢NÙ, ©Ž³,Pö@‰ÇÄj —1þV,lZ‰ÓÖ0± A穤Ê6ƒÂÄôög…â±o"¤T~ëa€'ýîÏ-$¯ éÑyÍ0ê꾆Q]œÎüä Ôê-²º,¿úé™VF qþÜëÁdዯhÈ‹±Åˆînà±1® #>[‚Bôæ®´QDzÔþtE{RÌ”éÅÄ®‹þÍ ÁqH0â¦i89nêð¯iô!šÎg" ]2Å.š$h& ¬ k¬E¸Êï‚þ ЂÂcRÆôm!QQ «ò„+€VÉÓtÐõãý.GVR®ààÂÍD Øüðéã*#(ª­_ðK~ÒòŒ2näKÀöάîïˆG÷ºd#†mÊÖéPà»úÇž¤Ï 1‰ÈÌÃG“„†ÉðÉ( ƒŠr>†håÐÖÌÓƒÊ(ãˆ1ïc„«Ý¢æÏÞÑÞ b7¿Ñ×ì…~òm:\Pã"V˜Q6“Q ÇH lãËÄ8ù@Ðþ÷\«ãœeÿ¢+€Q{(+&+ðÔ&¯®InëO¢ÀD‡ôœ$±Óf/!¤ æâ°5ôA Wà‹fìóVˆé“ŠÒ,ɽÒì(Ù’:tÎ<Ä*鯾F'9wÏË"ktîÚ ’p†Pše1‰ð/oð›†]rðÝŒ¨#¢ìì2)TÃ_ƒupH.qÍûœ-%(³)©‡Æ,E3"téÿ|,CjG?îÛ¸Òe‚ÅàæS"å1/x0çe¨ÚüÎ/h/Mjâòˆ3½0'_ã€2Yó¨‚Ñ#Z§B"&Ô²înê=ÃBgÆdòjsÞd0+ÄiG÷#>_þ³LõkcòS,ÜÏ,.бTN9I0‰’nŇÎÂêÔT!D)m!M†ú²·TY)'3÷(µ t¹Úãø©Mµ$îJìcBèÒíŽ"r&qÒõ*hŸôI£†²œôLÁª¹Ï(Á®w¬’,Æ"I^®HSS#T(©:‘x*OB½ŠXÚ%Ë™B¨éd‡üvïLœu}è¡EjËŽøpgîH^IÛLèùöŽJ rȪy¯'üã'¯ï;ALdQ2AnòjÒ0:HKlTE«¸Ò”ö*ó´&{¦æüT)Á4 ‹Ó{ÖkZî:õunTÔ†„ñVnRY…@þåîAŠeǰ5ìpIš¤ý4B¡‰Ç·¨s*ìõȬ&«FÅA.ð¶°¢$ʦjäÁ¯·49èü"àº51¾’Äâ#Bµ®.o”$£4Í4j«@LKVU+m«rúü:/#œQTá5{äŠÕ’²xs²N”ðæÕ]“µ±tígDˆL‰NŒ*ÑÏ@k°I×É¿uÇze©0ÆA\ã)(Õ†EËáXKóv°¨íÐ&Žø ð©øŽkê(ë²ÕÐ,癲cù&’ž¦‰¢Ôe%V$'×cוÜ0ïsqê” É‚l~V; /kÉD¢U:;¥&3Ô õqþÓ°Èn†ScËþÒìZÈ0Ϫt¦hsw¾ÃI}ö¨Ú›$ŠØVÕ#ò ÷sô!ùôA‡ÂO3¯OȲF'b%Pbó3M³¾z¯Ç[sm"aKRU É/ìη6ª–qõ'ÛTûŒùà,…·ô zUµ'XŠccáà@X(*š÷T;7#7 LóO Q “>±{lN«“àžÎS˜a%Lcj¬ð÷É‚‰âHDîÞQt%¢8гÕtW.ˆ=µ‚P·;^ÃtÀ«\!t5ÿ°km,ˆ•V€ W³êîâæ@of‹1dkQaåu¾PGvÓëJõ]zWz‘«~Nþ×}m³¶U%X?R×DS"ÔoK)T‡–dh~P0„¯R0s•·ê–0Cif3V8;µ°r F±‹¤QíLT¿Î>ôÓÒ& ~Cu`Ûì9ëê€æÃ”$l—,GäóÔêŠ 5hcJÖòäT ¡Ï›·L´˜-ŒZÒ€§C ÍÊxrûQ’“Âøõõ,®TÜTÊxe2ŒËyE%™cƒÓ”.ªvèYJ(¼·Ê²ï”}ÄhÝW~‡æ³×ã,µ3iÐa¯¡ûðL!®pÓvemù YYj{‰qsU°$5‘NˆŠP¾u]X3}k…´\G&›O¹v¬“Dït„þNîÈ s,9ÛC&¾àöù¸É"*—uc¤»µKD©!yñœµgõlïV$Ýo‰ñk}köõî}fâ.a(/m‡IÝ•g)—. ®g)m0¤Òk8tt‡0µêpy‰&aó¾|ÆEÔ( ‘½jXýQÆt´ìî·°“«=WÄ(‰¦¯QßjB-‰|ª…¨¶g™kãD—àwŠ?òKùΫ¬Í[y‰‹µèŒáå!ÂÁü˜‹™tJH¹U—/ ‡lTuIò~ãvŽA ºÑþvdXˆ!Y{:–aqu#XGÔØ’©»Î:ï¶zT>yI±qÿÊMº ¤!¶Ÿú«påÍþ‡°Ò)¥×«3r¥SµfR”Ö]c5³,X󈡑ˆÜć «:´°EÕ­â–Ov)}¥ÅT†-ÔE‚óq®ª¹Qêf‡÷(¿+‰“ÒjéZ‹?|R”_h(Ú)f" n:‡ëU¤Ð$:s9>’rðƒ/.Ý’µÌÌä½"góÅT+ë0séPx¸6\Ù\Ù¹D&Å âøuq:]ÕmU«P²+£©wÉ^Oð¯7Ñ6‰ †&ãÄÈ}tº,ÏtñóƒSQ0ì¬Ý$:?²–C-’j¤Í¬8:UÑ7“û¸Iû"ir¶u&;8¨rÎùŒÛ{ÐM¸<ˬB—¹ê¡åmõÁt‹½åϪÜE9´mh´‰CòÍ{M1†fc¤Œ mý+ÉWK_yoI…ã_ÁGžØŸÊŸåzÇOÉŠ¾ýÖéô{RÙJn¯·èö1»ÉÖÝ\Ë|ÌÚü¼¦_×OÝ+ÑÜÝ<ÝðzÁo´HR2˜ËãpëÍw3TUвŽë©Kþ]4;ˆl£†U7UÃz±»zs£zÇóY€‚¯%¶“ÀPÐ}¤á”øÀ8$òNû Lb*‚ \Q!C‡6ŒhѠƃ *¼è°#E„IP=YPáÆ„$ûÁù¸±¢H&%¶$i“åÈ~"´¨’ãB+2\™ä§Í¥YмYq E 'qF¬³gH«z½èó)*Asd Ô7'­%eÙ¥Õgp’ Ap¡BŒÉñfÖœ>—j…j·ëVÁ‘>5Šj#͉BrMŒ3¯àÈ";ÅŠs¯Rª:©Jä{$œÃUmÞmš—¨_“™:õ,õäUž|Ÿ^–h°0eþÙ–%sÝíwæKÈ£K œDܤýÜΩ€Œ´s–ä8»lá %›4 ¼(fÒx¹wÝ}ØãêÓSY§~|Þvøö>}ë,½9hnĈ;&͉\J^µÙVØqzF } ÍØ_¡í„}´ñvÕGÃ6• èÈ`Ð Ô­ÕÖ[qÍUWvâ¡$^â‡kºñ·`W1i'œI32¨ vƒ×Û¡†`QìuGya #|öäb€å{Ç]ÙR•š¥Gaz¹b‹KÞg^¿)'C]ÔAWu5]‡ß„ÞÅØe´!·WZí9$HO&A}Ƙ!qPjXŸqf)hþMŽ2%'Lx2×]Ž} ¸d¤’Nv›¡FùBrÚ ã—¾w!cí—àTš©8ädc}hZj±%ƒsßÉ%È ¦Ú” i¦¾ ;a€J]t`•«=¶,™èÍiœ¨R¶쥟}ög„¡¶Š,péÇ[~b&ê–ö¡Çg‹ZR®|¶z°Ý^¨®V^¥šß9tÔ”ć‚$U`© %F+=Ù—GªV®kåÚ6j´ðêõ¢މ*ŠZè'‚”ºº gœõ…$Dó7eyÆúW¬Œœ2Ìbm,÷vào]æßxÉ••”ˆ·–8G]¼~W£·>cºØÎ=.ëà˜%Ûµþß³—[i`>9Œ¤“t:+U¡MréK3(ÓÅ›eÕé« ƒêìlBFh²?Ê|ŸaÂr¶2x&GŠuKþ´&®s¸Eœ:{Iò^¬êeö´ë¹87’·û-ª b%¦ÇŸ.J#J ’J®@TóÚÊæ¼1Ýõ¶ž¨êdºþ4áÍ‚ÚX·©w­sŽ‘šä¡YIØ:‰¹¦uÃ@K+üåŽHQz{—ôfnÙl!¯ËÞ‘yÄlîµ›ð53…©–_²W=?'Ø(/ 7ðC9Í·Û;}sG¤¢N¶Ö-¬O;9\÷œèL'-%9à\,75y5U »™úRC¯k•llòWH\wþ­ˆP°t K”´Ðv›ó Ð}]3ß 5t¯ñy©zO£§b•Š)ë}MKÆž…2îä¦xE®t5šç¥JhUS•§bF-žeކ©œÄ4÷ô {âB–³Î6Ás GÚ"[ ‡´"µñ.…2 Î|øõ’‡í¯cÔZg†šoaJˆñ‰¿J’¸610)c¶èG9½i qîH²Ä`²šC„Šr¤NG÷¿ÍYìqœs’l^ʷ¸Œ;ÉùÐYŒˆ´æ%A˜/ib¢þã²ñåmJ4å3ïôº[j‹|°Sé¯êt=6Ê*7|ŒyN‡½1ª1y,(Œº³÷@q/+æ2½Æ» …"KÑZËf±?Ð-lZà÷ÀŽˆì‚D²ÛÈÞª‘޵ÐHTü;GÎóÑ‹[ âoà)*’þ%U_zÃÝ«²XN±y’šÙrIM°²RTNÔ@˜„"_§Ú*F5ótTYŒg´äqq̓OIºßDÔŠémÛViŸwŠÍ·,ÉV¼ 9sÍr< „P(áˆ0Ê 4ˆDjY×'¸ªøv’µ á5‹K8jЭ9šç±Â*ÙäÈ¥y¨Ð§]§GéÆ?«LfUä•Z ¬r[£'—7òÐ*gTa˜T¢¡zÎTÜ­Óïøš &è°ž ©iMóPe‚‰äïB»ÍŸAê;ì›$e€èyœT­õx©T†aãŠÛ'[%òþK†"3Nöm7y,õ‰ˆdAîaŒ_¥nÇ8;›´U¥´H·è ã…Œ$Yˆ•ˆVÈäH¶–T·#6ãlcR()…SË’‡”ó^ä8Ù;éñrǦQ‹ÕRiµPO5 ŸÁÉ”HcTuUãeÞxvòÖJzŒ¢';ȆF‹¡ŒE‡$YMShJ˜:Ê—=tšf„&±S(`ñäcÆG-‚¦T+U8ùRtå-Ø(jSd:sk3GqW“t·•1”/LDi øf¥rbl×Ç4k Èlåvýð€ˆS”Š“ñ‡¹VmíW‡\)d“‰oÈÕR>2VPŽ‚}þw€Ö‡™úQUÀ5oÝö˜Y‰¦(u5R‹=©q•Ã-P¦Q`ÔMŠu`i¹iG¸—tÁGlô7˜?õñ1Ao77ØW,{WävŠ®™yT—1Ùœ ˆ{+µær`gÖ9?œ IÄ7…¡Äy"qî§^2ðd”XŽX–ü6˜`Ñ~%øu£VK¶l÷nÛ¨JµÆ‘?Tû·œÀU?k¹˜u”• >ë|’irÿ‡–]X““Ø]ãIkJ…‡bÚi„u—„L‚v—T—Ú(–Ò¹ç…ܱy‡÷¤€5_º§¡yv™í‰žk–5‰Gàcœ&‚Öã—þLèL 2ݘ~/èa Ú ©Ù&Œƒ”‚Ÿ C9g¸ñ¦F5Úâf³N:Ñ`œw‰ZúV9Øq x¨$.Š>·aK5‡ƒ ÊöT8&?èDP–˜Ïx)Ù)wÉb»Â—[%œÿ D5@ĘôÄ|ø¨'fè’Ãuè#¹ªPÇ‚<jTö©*1*¹n A}I"¦™àéNèS5*Jˆƒz«t@¨.!#d9\5˜fõI%#z\ £Á–?Q¢()ª¢¹Õ[9ªÑ`F†Rp¥Ê¼HhÉUª”r©¡bú¡üÉ…õd¼Ë€’7þ‡9’øPM(~v Éæ¾é´[rd¤<YQùtÈõ-ùë—R*X&CNk÷å's;™¼ùtz‚´³x0°©Í`˜†Y«»4Âèè¹è³üv»,Årœ"´u‚4…¦¡Mås:<ÝÓÐr,G3EÇÁ‰j¥P/XXÑÍLÕIÉÏy™p|éÈìM5º°¬H¢i²)œG…ZKU(Ò­fä)³GWÄ{, ªø¹RlÑY£™}ÊýÅ:S¢’qLv°æÖé‰:CmÚ*Óý:G4:K¿ÙŒmgœâ·›ʼnñÑ¥$Ï&½&¦Z¨õCEÇ´Ê4é$Šç‚8®¨þ 5ZÇT¹§ ‡v‰—H#¤ua_[ÜË@y¢3ÈË %¿7wnþ—N¨¶¨=e#½¦§kŠ÷¼‚ls›¤¨7щ0oJqløË­–¤5êƒÒ4ÎÝâUD„š Óª§¥´œ=¯é‹kÍR nò$>v«FÖÝ’§ì©éÝhÉÒÚm'®ÀZ¹X&”ûætå +×ÛÆQëœæ¹99úpšh»<ùbBw¼Ÿì'¤Î`8~E›k²1|uÎa~ů2ê´•Áß…F¬í)¶ ¦iZµ–‡Yû Ï-Èl¿—žGÕƒhvÆìÒ ¤¹ˆCzJÁS³¾+=ÛΞMºËè8Âżþ÷˜›Æ²ê™sú¹Æî+ZLw‚i §CsìN#ÍÍ¢Ö¦~õ¬²·³E`íáâIÄ*Þá„q²yãfÜßËqñâo^ ¬5ãŽ.>>åܙԓ¥ÍªÑ+ÅàM­å ÝÁüÔº;×À–nOlàøÞu•zu:«“¢»Zv÷f¶Æßf¢.zmig9´ú’ݨ­´Ò çOÛ~hÍn†8¯'‘X?4«S©EÖPëÑá Ë^ 7|¾GÊQO© ÂFdð9Ú0^!“5Q|¦+k‹ÓõˆkÓ+„2öì7vÂîOYʉ /Vµx¼Ô}á´þÔLÑÒ`Ó“ÔY¯›Š¯‹fRe<6Ë¥´Îë_¬¤Õ…ùz?LXn­¡Î@ËÔË"Œœuƒ¼ÝËÊÑ¥ÓÒ$AÔ9š›Ô½®ÔwRµ®"¿mW5Á+^}Zã)_ÉÔ]gº6‚û”…-íáÖ"VÎf¼½æl ãœÇ1Ûc*ѵn„ûŸÆ­O¹è챈¥yögžèØ0;.¿Dd /ßXw¸uNˆ*G.Ô³TëZÈËŠ'0”â.ŠËëes¢}|ew,~¿Ö «„ßapÅݵÇ#U]óÒ^2WRƒ¬¹AÏ–Xc­ìîÝçœÖCíïnžNê:Xþ'ï{/×àæ{ÊÍô°Âŧx¯A¦€‹EVǪ®?½Zâ{k ¬‚ãB¼LÅBˆ•:Q¤©h,É‚c&§Aï‡ÔMŠŸ Bôu‡Y–4jç% ÁW} ]óRh¨$ ®2"£q6³‹&).5ŠoÈX®Š IúÁƒª œ$ LȰŸÀƒ%*Dñ!Â~5¼h°"œŽ*4G†@}sTZ`’Ê$ 'ÉtUÂ#FÙsã‹6ÌXq§N£'¥Ø°iP‹D‘:ý©”§Ô‡AµâŒ©Ç«P¿öÄJãЊYG®=kU¢Ú¬U«R…º“éϬþ=‚Lb×mE§\Ñ.d;˜lÔ¤CC*žZ· ª‡\%_43&*•s*`'#3ä$èhNžj1çVÀ 3þ+Y¬Ï«MɪUÔ¡ßµ[‹]ü´tN£¬åÚ†¸8O¹•¿öx35ÛÀ€½¶}+Ô6Bœ:cœ«.ðÆ"½ŽÿÛ/Z©©W~Vh”™YºTy3ÉLAΫÏvÝ·6SÁ`[n¸Û®Ûo"ètëO¼þº 4Q Уö$­¹‡(|ªé<ΠæŠë?Ø@‹Í?ä8úh#Úx3Î,ëd±ódñE·vS¯ ‰: ¨Êd¸¡¯Ì63)³˜ú1Ië\,n:¾6þ,0½Õv¤’(¼ªë §Sl¬4öÈ[LAÕ$üRAݸû¨Ì¯\ã1B‰¶û’¿Ñ1Êò†‚‘D‹2 ­°tNÁºLO'úˆ¼$Þ;©Ÿ”VjI†—æüô!³´Å;m¹Éœ‹«³s­æ5кtÑ@Ù K‘ÀëÈ?ÐPï¸ñÔÔˆ¶‘€u,TÄ”*ÆÞ€ÓQVRU…1Cßh”ŽV k[ŠÁAëï¡ oRrŽXêlŽ—ú & ¥e*JÃÊò2Ö@“ý°«ÂzwNܬ4J+ vŽ5b£cëMǤûm*\Í[Õ]€·¤7^Úö-= ïYc[3ØZSþ7Þ¯JTK:‰È—æó¬>2Õqײ =ßµ¬7ºW!”kÛS­÷ÓG$MBa¹œ’"‚Ô9=Ÿzq:¥=Ðé-û”^a©®pYCýl«U½‹k?‡…3¢n*rÒJ#-?š©ÖéëÚ-1î:}‹Ùkg6tãœk~T6“õ8lsƒ¶²8ô~Õ[Уá$ï][1.õcºÍ·Æ¥Ýýó9}#·G/“oRrçð?o¯ÞGž“aöè>ô°‰Ó­±é<=µ‘öb÷=T+ƒŸ´YM‡øŽöòàGÝ[ñ…çE´k*{÷Üï?ßæšã&wörØ‹‚2‰³ÇUImt•ǸVþ¸å®·ãð¾ûu¦îÛ4«<K« W]¬ö[ü½Ú—AÌk²ÛÝÔ2g;uˆcí^û6;£µmqÇk”IbrƒJ™¬RšºMôÑ1\ýPÎ‹ßæÐ«÷±.y³Š·º»íU ƒVN˜§¹å%ïq~“[“f“/Ö‰0o"™á‰²1g¥KKSË’à¨g‘²O%F:Ù²¤„Í<s ŸÇ?Í)E$ÐX¢¿õïgýŠYÌü›ÃàÉzoúÑô´±ª…š]– ¢gm$Z_9cä´ö<ÕìIu°Âßô"IŠ>¦KMô#ýø€gÞØø?çmTþú e¶s£¿¬P!^±ÔB¬ª(ñ)­¼ñ8é@й2‚@ÁÞÜìÂ=Æ¡¨‘ü¹Hˆ¨v#yÕñPQ _É'ô]K1FéÚ©T—×LÆ< |ИE¢ò$È#z”\³³;¦îMÔÚ‘%“$™ äx óšwH4`ú …*ìæÖŒgÍ–}ˆ hFDvÁ ¢M%TކAúHEòs£âÞw;0f´ˆÃ1U)±#’òš Óð J{ÊlC¿„Ü)_ÃèùpN‚]æT6E±v\ x‚GC âò ÝŠÉÙŽT„`1‰ýÌMDNX/Ÿª´aà cë¨ ’ÄØ³=¼þürœ(J"…/0“•;#r%~Õ-œ$´é/W–y³€7aÇø"<¸a8ëJ]dB—„Œn’ ¥‰M(DûuÇD,ó§Àt?ª5_<²ÃÊJWõ­r±½œãVc¸Ö¥ê¤^Dg>©J¦Ö¥ =Ü^)ú“À /—æC ”¯¦-On ¤e Ù¬á„R8œ‹àcF«á§ºQÇofò”}ic5xªõt¨PE¬Æ†‹»Û™9EÎ83&kC¯ ¡ö Ð"wyÙ]"8¯ò±äBð"a&o8ùG¢`O{×Ãkõ6Ò¶uµâ|`^Õh\‹Áб†j]‹¸ÐAJ°÷þaÁAnŠ-Õ›:nœWÉMJim„WÏsŽ2˜Ô•õ£Ë{ÙaÇêÃè|,¸MU­¨úôðܸˆÃn"’ÆÿÝV’T:*~&©£³j¥<ì O›gÛ‹sÀÒÄX[Ó»lЇ0 ÆÒ¸¦Ì‘°îª'4U)-P¶·“ù†Ç¡Xˆ ”œ2µFºäíz¤ ©9heýPOUHõ¸ÌΜbmã:rɘ¦J¢ää*G¹g™¾[é]ê§{Úˬ}6ñÈCìõÄšsð}jÑ»ŽÓŽu¸râùë·Z¼Ûg Bîs§{Ýí~w¼ç]ï{ç{ßýþwÀ^ðƒ'|áþ xÄ'^ñ‹güÜ-£lûnð!“˜å'ŽËc›ç|ç3ÿyÏo>óš}è/zѧ>ôšï<çQ_zÒ³¾õ³§½ëe_{Üç^õ¯W=ëyû߯ž÷ ‡ýìzà·žøÂW~òco|ÙÃùÈÏ=êw¯{çú´/~﹟úé?üâY?rëâ9dHëgûÝÿ~øÇ_þó§ýíüç_ÿûçÿýÿ @@,Àø{ˆúÊ9…j¶È¸}¬t@s™ÀË0—›¸À ÄÀ›p@ œÀ |@}Ð@ ÌÀôÀ¾Ð ´s AŒ |AtAûø@¬@ÁœþÁAÄAs‘@DÁ|@¤A!D!L"ŒÁ B $BDB äÁ,Á Â'TALB $A*ÔB¤Á"œÂ0<ÁŒB%dÂ,C´Â6üÀ34Ã|@ ì«VyÄ?ì‡br7*ó&áaBFŒ œÀȰK|%‰éZDùRD†øžÔ9ÄïDxZÅLTÁŒ¨>E>¬E–‹V,ÄL\"ZdÅA¼D]²EB4Ä\ÔD|œÓ9D”»b/­¢¸à³Á‘Djlâ²Xˆ'ɸ˦< &“«¬jþ¤Æ·DŒÈ‹âaïrF‹óuÌ –+©Ã)êJcÇéÈ&bR©¦‘34ZñèGñ0&¡P‰pA?€9–šÇý²(܈ÁÊ*\Ôˆ”®À 6]$‘ÍŠA²H’VKš&¹È+C…Oø,HI•LÉ•dÉ–tI˜|I˜¬I›œI›¤I¼Iš¬ÉžìɘôÉ–|ÉŸdÉuÚÈ•“™tª¡Z©˜IÞ8Š8)eä ®à¥J|:§C¬2Ç/j52ù4-Ó¬°ò´F# k| qŽ´%ˆùŒK¹ô þÃ} ªtêÇ€„ ›«‰P£þÄ„ÔCMë5Uœûq/ÉPÁþoz²¥R—«%Á1š…ƒL„Fޤ°åÒ°$À›»Â:DÂ!M3TB´C$´Ã $MÕ,M”CÒDBÙ|Í$Í9Í”’¼ ÂIøV´HÌ´Ÿ†&™ŠEj£ÌÆÊ±žZ6É5À2ºb:èd%kä£/Ã¥¡#N‚j7AÓ¨4ù¢Š6ìj38€Ëc„ÁWJEùÊ_Š ľbDmiDS,œûìDcÁM|AMD‡OÈ%ó1¸ì,¯ïܤ³¤Žˆ0*Ï(—‘C¦¡!5µ²·Ë©©1øzšŸ#:˜£0º ŠŸ¯È<§çÚ ô”D‡@¹97¡ ÁŽjë’x<0 þ‰¼Gå‹ß$+B"¤KDÿùF©Á«ä/2‹<•°‰ %6<2¤ÖJ „LÊ»±$»û©¶.3O¡YÇø29Qµ ËïÙ:½œ’¸0Æ`¯pRSr“@:=i’I°Käê8œºþ«ޞ]¤%L$©¸óRX³70Ð…-ÝY2«P¬ïÌÐ9Û·x›Î ]4>mÏT'q#Rƒ4-'‹!« у° ;;ˆWÚÑæqµ» ÑPq¬ N 2Ôd\@urR±+»®ÓHUǦÚÓeÙ'#=·F½©¢ ëú4ŽÃ›+Ë ô4%¨»§ð‚,ʘb;Ñ -©Ð"H…³—uþC Nå5l…3ª8ôK˜ÆÔ(S3Sål26 .i"I}ÙRU{®ÒrÕ: ©&SN´sJ‰9ÑE·á9¬®,}RȨѤTu3a- mÕæ‘-Vé¢ ™Uú`‡KÏD‹˲Äê\4„¡´ŠÊøÒ3ÍË\eN†ã°”M"”üLƒ\²”2uu7nMNÀ¸Öȇ‹È‡¨˜Ó´:¯r µˆX”’²]RßYÎfÊ /…%á*U꬟T‹ àšÌå Q‡ñ‹T赜­&˜ ºA[4TêLèXPM;…H$àñ„—‚Š(©ý‰eˆȇ¼Ý[ÁØQYª²UKEaÅ’ñ¬7JKTþþÁXf3,ÎI¸yϲHq£“ÈI^Õª‡€À V€®BÏ=%(©_ÝØ‚"H†yŽopÄô‘zs-¸t¸ŠÐ…‚|ÀƒÊ2«Hxf(8]p@…Ö]Ôoë Ëê‰7Õ ½ÞEˆ9•¦/‹SUÙ¿¡«û'²˜ºêÀ L;*+J äÙ,[íš(ÕâB‹µ¡ÓTP‚oP„`ÏM& 2ˆ€‚p†Ñí£ƒ}ÜâQ‚p´ ´ 18…„ …Ì}%€4¥ùõ_Ú]³ VP3 Û¸è-Ž@Uc¹Æ¬±‹ ;û—a5ŒŽjÅ} -þ«m9aÃŽ¯Ë0}З 6=X„YHeÏ]ƒT‚'ÐW€ϵ†.è‡ÐQ8€`€ Ø_£Øß~°‚UCà†-øƒ~¸âbÈß(žâe0 ˜n˜ë â à„~8äµ2®˜Ýô ‚G°……€;–ã'0ˆ$vAv„¢p‚ €–À†-ȇgè )wr(ïë‡ØGhˆ@Ø‚6Àƒ3ˆ -Fb§î‹îkT…|hƒ¯™óŠÊ.Špƒ™S¹RÕ¤àΖå=âG†1Rñ}»*²*u,-1KŒ{m_ˆS¤ã§Xî>¬„Œ,Xg"‚¨I$"gЃ“Ò$¯h¤ MZz¬…­íÐçʛ͎7’˜U [ªªXi~-ˆß|Èv¬²T*ZL"fT«Óø@ÒÏ"µ$;aµþZ5ýÆ3æ¥äiû»tL–³ ‚6` ¸˜àL‚ sç±­]_”V Ï”‘;ª# Ù þU;iºVfŠE_Ì:Öaÿž† NS; 0Wò5í¨’«|÷v«U‘€ÎoôÖ 'Î%5&…Œ c9a&µWBpãÖ‹Zô,9rZá+¥Ö‹w_“H¦Ä à [i„:O0[s9íQÈSÀŒ½QÉ÷Ï…¨`6‘º±G©€Œ_ŒØ¾0/SSÆxU´;ÛA‰Ôx*ËT±õ"hNze«÷úTèx^€dŒ’fW¤¤kÂi:Ûdm8Ê…‹§}1ÊÉP#WÖ>–J-–þªàŽ5Ôx-ÎMWí:¥] V=†Ÿ¥ €%£’‹Ö¯£Y•VsÓ“P^ÒXeÉŽNX_+ì”T¬ E¹2c¶GÊÿüîÊi ¥›DR.É/»§kÀ7ûþZmµmL‹4U™]c›YÝg_âGÚ³ë÷F,á¹Oø,{p¼ÔïbT³e¤Ý!íú 7’ÇÒg….î’à˜Ó©­£ùâ®jåÇ\+V] VåðÌì$}óŒ~ZÞ#7YðÙü޼Õ)€è—N¢‚ƒêàA…"lXp"A/&„hq¢D‡ B¬XPßœ’–Ì‘Á®$ª>¼sfÌþ?ŠŒYS&Û³Þ@ë¬úÔŠë­»Þš+¯½ê“„®Âæš+*ÁÖJ¬­Áês¬²¿.ˬ®¸¦ì´ÐÞ€Î'3ZŸPÖþà`[úÈa2)ÕO”Y†™fÖæX©?¦ªîK •K¦•>F)$¼å´d¾¨ª7è~=JÚÙ¥å¡Y}ÍøðŒõÓ}s[PÅW<±@¼^Æ 'qqÉßpîÅÄòŒ)<ñD)§ŒqÚªZ_ºýø´¼ /kT>ÉYo{™»F–Ôuz¿Måô¨:/n_ôò¼UÕ¥–°i4þŠ”˜a£(§T¾î$B]ù)©^+¹ZL;è6lê.é¹…]”’cø”Äá?žn;j„ (Á žÞ¯ên/ Ÿ£7€ f¥®leõ“ÃýÙI@Ê~úi_j>—ANµëôj ´âvÍPW˜2Ä&øYêÆÄ³ViŽr~s DÐ!ƒöUN6ÚjŸ©º5½'©köSØæä¥B)ª$íÊLæ §6x ÏoBsÕÔ¬µ¬;©‚ZíH×))é­gØ#ÇÃ%ÚœI3Ðo6çê•Ijè!š`¶æ·û¤¤‡BÅ󌨺®o^<UMˆ=ò%†!ÒV2¾olMc þ½xª+a8üìú$C2H+ó‹÷%ùŸË"S&R¼tíI†ÕËO`ä×ÇÕ¤Ä6“È$“BÜx°g:BÝM¨C§,ñA¡‘,“Íxn{`Z¡Ÿ6?þùKvùS C§;ÜàÑhØÓäÂ6ʪ0rB±ôÔDÖ)±¯jâ›d¼4‡È½±"0cH>’]*¤Š«sPïÈUÇéu‘A®Ïbs6Ý {bɧ„9ÃX¤€Iñ¤â¼I<гA Kër’ ÿ¬qy«2Ÿ–5%öw¤hó2 9%HàG IKO~‡o>ràTJ‚ô#•DÍ¡ZþÈŸÙ• S¸¼åbp.Vk—sKž8CP†!ûQ_«Œ²Âz*]²dhm„°B sÀAÄÀÇÜ)D B>ð Lþñm­Ü`2%sÁ [`ÀJÀšú‰ R …”Ì(8à ‚_®U2ù)¿,Å›€ô£²qÞ¶lIRéyÕŽPƒŸ-UšJ=iïY磼˜È’–n¯Ñ´è;¹ø4Ä*1N¼Þ"• „fÁ DVk< ýG §(¢„‚^¤œ¶Sêß«ÜUˆüAİ¿—3É¥ ×—“Q¡P‘¬ÊGóq±¬R¯¤Ý!¡‰þÒÐÚ3)d;”M.wÊÌáñ‹Xrkñ𨿽’~Á[9aоÚèa €Ã€ Ü5¤"œ 4áƒ$0•ÿ@0Eqe$càFrB„GØÂ!mÀ*€‰6܃@-Âá TáÅ€ÄF,`8løý¸kÓ(´ÿ9F­‘€(a ox#Nøpˆû±aFÇVL„UÔâ«(™!ÚÀ lIŽø\b?¦y“\“0ÚêÓÕHEOMÎ ƒÍ (?Û¹1–±$.Iç [¹-Ÿd ÂŒH”ÏeʳŸê‡¤…$(b·5ˆF,Œ…€iqBpþT0Uó臎-…<ä`ªÈj¯0T<à ¤æA,T1t`6éAA”zDƒõc‚Að¸Q ´ÄҘ9Ímœ:ÕYîE˜½Z8àœŽÇ n+…£BAãÁéªvIú&»Rìá®±¨ÒB欖ïe•¿2S> {.%jš8ÐrÅw‡9»E Ó['A7ê€`Tè –ark ðŠ3Y Æ€^ýX9–B Q*Åï£VL³úHÄ!¨ð §èb–xJïÛ0… WT˜VˆSŬF#¤ã3gðcV;áòœ·Lm` $°±Wˆ—Ï9‘1þkÏ'õc;eùÉwî×pö^I®º$ÈÖ;}udfPÛùBÞ„½‹,·PA ð⫃PуJ#D ^ðÅ) =#תµóƳ]ÂŽÃç¥>u5Œì$àÀÂB…>ºœ ¶Ÿj€Ë WäÙLÝÆåˆN¥ÍMIÓ×pFlÝyÍøˆc "îÁ’,b"º"î]KÕHºm’Ï4Ä¿µ×‚¼¸Ò+J£çÝ ºþØ#íK6Îb8êá"ÓLh }UtÅ Uú¨›oMa6îŽA”Dœ„»¬„ǼT&NÊ®I¢>YÑ’VV=$®õ0šÊPµØñSÔ1ÈËM^±%¢ ñ…ËÙ•BÙ¢c=RÐNAÙÙÙÐ:ò@}Š¢¬DœUVÔ0âa!6NÝWøAeíÜO$†DzŒÝ4bB*Œ*¤¾l8A”F¢!öÑFˆþÆÞYdTÒa•:º”/-] 5%»a!7™¼ #F9FR£Òí[HÎ¥RåÕ­J&‚Ñ¥E•[7*“@  /æLª‘Cr_òA…}ü›—Y‘’TQ:.Ý,PäÌ‘ôL¥ÔPaoc L ¸lZºJTJ$’Ì,~×N=â[Úe=E€›,ÚÑ-‘#×€†½¦OîRþTaièÞøxÄW:]ïxUÌ'q™ÒõÕ$aƒ(";Aäv•eJQ%VyHª—!ȼµYöÍ‘ýáW#6’…2Źt)0½¤/¹ ™g~„©ºWôÍ^ÖX¬~añýhuW`†NA]…4¶¦äøâ&Fh•Ij"amÐÄæ$*N*#jÞTyè2ö’µá@ (®"Œ¬6ê®2Ñzí&@!I›u×Ф æ!ÀáÙú¤’èˆ#3Ñ[ÒYVCpDB–pj%–Gx¬“†S‡ŠÄZjih‚:Äe>ÆòåPthéÜftò$½9—išê·þæcMÕ%¤>Š$–5†QOªSR0¢,Jgšþa³Úà`*–Ùy …ƒÆÙawîåL°js…K“HÕeá#Ú“¾Îþ,ŸuRÍáˆÙ1Öa&§"¨ñ±m7=g_B¬s†£ ½íiðìh©!ÞYh¨¬¡°2ÉtÎÁÙhæUâ „ˆjZæ™a…§í=ìØŠµV*ræ%yñPi:ìa‘ 6më®bî,lÓPOna|¹P+õÄDO‘â®M},öùÇg: í.1sE꓊ìŽx ÞfÔ;Yä%:*zré n”@NO½Ê¹½.©bç4~#À8?™(àžÙÞòQô*§Ü×Ï6¬`šá–f…ËfÎ)ÒfÍR, aeøþL,1‚Žð>-K.yͤ”Ž©U .9 ßí:S½ý¢¼F%’ÑÚÎðn§÷"fÚk…j/>íŸjº^)PŽoL2im*Pås>ïg5÷&Ý\z)šQÅS”¨ÇÊv&Ä?ù Pn–ö\’]b¥mšpdŒ'YZïoÆHÆêk­Õ¬¶0g…îMä@ÂÛmð•¤0pQrŸ“v°¦¶-ÚiQxt›ãfäç\, 3\ €Þ—(•”6lAUn ‡Í%pC<Áˆå6,A 0ÿÝ0o ›âÙÍÎTòáü6®X-àþf¯#m B:Ý$„êzˆJ·êÛÉZþ4Zî#J?2ìÞjá¿2N<] {„i)€@¨ÖÉ‚Dáa=$@ÅÁ-PfcÜVípà]ÖØ*$øV2\Öï*²QýX1h­ÙjÖbìÂ62î]Ý)2¢±nYEN2.ÉáøN¬nšF*ß 'ˆzF®å× ‚2øW¸Ø0™%RYCTȃÞÇ¥Âð-[ƒ=Œƒ]]Å40à 0dC°„hõ¢™;®7Ò,”‚+-¢šu³o¥£#Ç3þ-Ørزoo‘/‚ {äö¢mêÖóåãR—»"ÔÚ¡%šk±SAÛ£A›¤EþðL™ª½ÞAÛˆ]Zrw˜À/ XÀûÄC×å)JR6WðBî¹5¬?Â5H†ì´ÖpPn¼âêE^¥ö©æQ/Ry&Ð[£o¼¦§˜âÓ3BÁœp%\%ˆ“±ŸÃ5Å6ÐA’¥@È94§Yvnœk‚ÜÇ€œ1|äåD¶tÜΦóê MÊp&ÅÔöa&^«n?Ñ0MSﲫm«“ë2•ç?Úûò-c po– ›¦x´ÝÛñÈažqù݈í]ß9DÔ@3ÃA$©…Ÿã!˜>žV?Ûæ5E;À1´]jTƒ¶Y,(Ÿ"§ñü6õåìàþzÉ#åÀ/p¦ñ‡/Òš®‡âoåhU¦ƒ¯è‚OkJzó†*_ÿÂë·Z)];vø_@£‚ùE ú1uûÙÀSX@ôB>€`*ÜÃD'ôÂ#è˜W÷Ÿ#ôÃÃD!lÁlAä7 ¦A`ƒ×aª ìw%etÕ­¿%lôfëH“Ög‘F™'ÜMÒÔ´ƒ/¹Ú¡HžòlÆe]†¦¥ú&ÉgØov~IÂW /û„Ìsù-áè$Öx s½¶AA—÷}ÓRô*»² ãȰhäñA¸æX_ëé:S®lŒOI8ÕfCV"X®N^£3ðNÅ!Ú^÷Jk#F­þvÂDO(l¿Ù÷ÐØê¨c«õˆÎƶyÌ[m¾:=óiIO¹!M¸uÞ—Gð6h®[`ÏîòŠñÚ‰ú¤€ùò•: ¦ç}E¸”öb„€­7(æõc¹«ãÙb¨É>„n-._Ÿ³b!úY­Ga¢pã·ps $¸¶'æKU»xªó–¡¹O5&nKÑ*‡¬“¦l·&†‡%!nãK¸©cf(j,Z}0aW]n¹“QÞÈ”ôu“¹Ú!ŸÄPŸÎ’bL‰ñÊŸût¢šÁ£­ks3ŸÛö,#ûѶ< Ka”r¨‰J)ã*“&öôµ¯ç^¼w¢Ñî8ü»Î›È:…,;„É;a ÿc¸]£åù,Ï÷ÍC1^.¥Ê%Ü¿-§ðd5á(‹oùð”â<¸Ó›þ,»©wPn÷õÅoï>aºÛ·$Ð4ˆsþKàObø>ª”ã°ô*8“À)˜¤ƒLø¡@‰BxQáʼn)ö#h"È‚3&™Èp$Æ)S ‰b?vsæTÀNÍ9 9~DeU–Aö#Z‘eßOªxPéK©¥º Ú)O­=ám‰1*J<±ªäº1$I°ŸVŪ4aI/ÂY)’¬Ï”]GB­Ø”©È»~ç’ôvïÕÀ=‡Êå˜uhй„}ÆTé“(LÈG§>Õi À3ç`ùdÚô'Õ©U·^íú5lÙ³i×f}º6lT¹cçNÍú6îÙÁyÿv ¼7*Ë™7wþztéÓ©Wwþ¾6qÞ½[£öÝ{pâÆgcÿ.=wðÛÓ³®þ´N›¢u~’q~ýûù÷÷ÿÀñûd7 <Á÷û$ |Âñ ,$¼Ã´0Ã=ð³Ðdè`& õ¹Á¤$nÐ'(TXd•MrQÆ ^¤ñÆWÄÇO|qÇk¤‘HõAgCx„QÈt²Æ…4éÆ%§„²H} jÅ¥Ò$$•S’É&Í<Í4Õ\“Í6cD€±„ȳƃü‘È&g4“J3Ÿ¼K1í£³OB×|rÆ'«ÌÓJG³äSE}*ÕÉ9:¨é¦œh²O(¡‚‚,®Rþ*&R’ 2VYõ ÕXSMh,’8²ƒƒèTS‘z+TUb5.¤Bõ5‰Itp·[eÚg¥–Úi­­Ûkµ­v’8qå)«QgíõÔcW5Ö `uM7®tËŠõTe+”!ÅTƒuW¨tCVXcg%6Ür=Š•!°Q4Ò,D±ŸÃüZI«q/ëL,Ç"+ªÇ´’ÔTͲˆ°’ÖZ«!·²‹)‡ÞÊ(Täeöܸ–2IæšEµ™æ›uΙç™}ÆùgQ“¥ÐÂ|EÎÈd¡jX.¼*ꊯ˜ºä‹CFòV%7ƒz©Y£V:/Á ‚¸ ’Á{¤Zå±>z Jy¤þqÛՌ캻þ5BÉå$–»¥Œ­~×cÌ’ªØ¬È„RvÌ[K.H«¢ÐæË!É+‡|òÈ1¿œr¶6Gè“~àÌ:ï±›Jð·=¦Š1“×®ž”Jö“:Ö[±‰ûÊŒ,‘»–h1³Ëkfe¦¢7óý­‘7¼jÍN>äZIÿXoì!~žú‡-†Û!¢3†*NÚ HÒ®Ür—ÿy¯0¦»‹ð|·ºÞyDm›² NÚF<Þy¯-Áë×EÀ Þ "}³ Âb·´\ÐiHhÊ ™°ÁÒ)í)Œsã6³¾ôþ X Iôú5+,ÀatEœÓêB× ! ŸÞÂÆÄôÑ*I/|ŠÄœèÁ{½`2EÐ$LSÊœÆúg  [(8N÷äï{©#¢²¨5·Xì€ Aãr „(ƒ%yãMˆ”OkZ´àb,€Œ„B_B(¤;KNlñûÖWþ,"– ÜÈ"ÉåÝfù’F(«ŒŒlo8TÈÓøŠ(Áj¨ ÷ f<šÌÇSsÕQbDzuoA *Ä  fl—Œb)C¶"R±À¦€R—7Æ‘“Ƅ☚U8kfJPA ÂSšþ-Ní›d`–ºÑ*˜ü Aúð $„ áf÷Jh¼Ý"t<ÔÉ,˜Ï´Äó†ä£©î% ›šÃ‘WÌO‰Ï_ö Úm4= C¢À@’†Ä4-ª¬V†¬¢°lHœúa…U„BÖèÂøÑ1Ð-}i<—I?tÂÁzÌš˜áPI=,bIxÀ.(´†Tá Ô„+àÔ.˜sWx\œ·”tÅ¢%%ÛÇU®"ICpc €ƒWƒÀ JŽU‡ÃÞ!¡E/ÖAót7 Ì; $ JL‘Ïè V!¾ä?eX™Švû7¸QŒ`¸ãþ/ DPm¼B9Š /¸¸OÔ‘uSU%ø”ƒpà)Î Ôª6ÎÈ‚6æÁ̳…­qy½¤Ó}æ ˆ@ú¡ˆ=pS"b0 ØH¡¸ó„ãàò ͰZ¬!G>¬%NRBŒa†®‰a ˆ!“K¿ÈËBKqž2 ¬=åL ÜÐ*v€%Œw Jp¨ìÒúŒOaJz Ï2˜²¾í1 Ä Ì  ÀRâ}Heè>ÎDÁñ­1­{â$8ã¥,À+ú‘âëÁÅ0NB3ol@»õ#ª‰|âK=0sö(kt›%žþý@„¡D*‘"ÝÊšô«ºÉ&€†ÚƒTÀAƒø“+ùÌ¢Ž• *qö¶¾’&! %…RÉÏ*6Ï3žÙ¶©aÆ2},´F¾™c|  IXQµ08š.ecU“1hzMÏ“N °AŒ4È fPÀ @ŠQó£Ô§æJ,yyQ*©º¼®DòreJ€Ià¦ÒF?E ÒÐ5bÁÒT¦0NªÚŸˆÓ$  CH„‹ŠüB)Ô6j»uËæk„vud6 ÙÜcå0%&¨@=â÷9“"I@ÇÁ¼(¢ëØD1£[ zbŠDƒ¨þØ„’ Žo<UEY4w¥P)ÛØÞÙi JP„d˜7 °>0ž„M˜¡ã9&-êd… r…ÄT¶Y‚ü4CÌI À*±ü[¸1·Aîù.¬hÒmùÃHCQt#ùÃx…"Š|´áÎ`AÓ YÂUldÁš ©ËgÜ(7Љ$€¢ ÿîÇš`F4‹´Á´[g…I§B…ÊÀ¢kÂWrrßx2àÂZѺHû•îòs%êv\B¤ÛYòu a6rÄsê³=awóÞ5;*–ÌtÕ2=ªïvˆKɱ‚‰7ÆÌ‡³$ XÂ;WPŠ©^EµÒþ(GÎPövÛÀ¹¿¡,IùçÒn„ãLS{Þ‡½•ºT9T¦K,™bÞ øKI˸}ØÜ>ž'AÁ:¦MøÙ;°lØ‚ÀÖË™”Âz.möÒoý^Ç„ªÜL‡W4 ˜Ú&v0‹÷tÇÛæéølßÐG€nÇøJOÓÎ鋯Šj‹"Ä„Y’­_'ÿØ‹‘³н‚ÈŽ6íñl,­œ¯Ø"ùŽüði‹|îÿ°ˆ½¢ËÜœŠôÔ¦áÀ¨LÄú¢çL±„®nÜ' -Ç\G°0ˆ$¬û6m‘|ð⯠گD oe7ÚZšE áÐ áà ×ZàðYð0ë0íPÿ(þcPw&c½†­ó<Èœ¤pâ2ë¶ì¤ñ”Öï²,ªþºîÑ4bÒ6+˜ì£ÁðþŽ0„´«ª~®v†‰¶º òìÂàªÒšF1¢g+TPØ%#Ñ,Ä/\ÞÂ0BBtà Mâèëø>O÷xOþk^Žˆô¢'GLqÜ60•FÂ`@,yd`ºqÐáñÁ‘½űË1Ïq×ÑÓãÙ±QèñݱÏq÷Qõ‘û1 ó‘Ý‘AD²Åq!Rò² ñq"’­ü± 2"½‘ Íq!²#AR!Ãñï‘#²#þ2$W²"[òÕñ#?amèãSÖ#;Þ£=pÒ&݃'7nå6´£'ác'}ò<†R9¬C)—’)›:n%'eƒ<Öc*·C(‡’7È(‰+»²'Å#6n£NShB£æ€4Hƒ&ÒR'Ú’-Ѳ-ãò-çr-ë.ï’.ï2.ÝÒ.Ùr&þ.S/ñÒ.uB0û²0 S1ór/Ó12#S2'32ý20S-å².ó0/s1ó3=³2A3/K“4O3434÷’Ò(H5)6cS6gÓ,iÓ6mó-g“3/s7{“7Ó7ƒ8‡S8Iã,o9“S2Ùò8'ó5•S3¡³Þ ƒ©3 “/ï²9ß’Djó5-35QS-5jSr3:—³1ss<¯5ùR-Mó9¥>‘ó=S<³>É“>£Ó2Ý313³=1ý3@¿ó7Ó3ó=ïs&-¡Ô´A#B”B%TB+ôA'tB-4CC?ÔCCTC=C9ÔD7E/ôDWôAEE[´Da”DS”FYÔFkGo”EstDe4FyôDF?”F{TDƒÔG_´C‡TE3”HgÔE‹ôHÔ)«ÔJ¯K³TK·”K»ÔK¿LÃTLÇ4K;PKcKÜ׺…hshs5Pictures/10000000000000DD000001ABB128168F3FFFDB27.gifGIF87aÝ«÷D†L‰-,BL¼‚D¤ÊÜD (8©ãôXD5\Áä "tôæ¥,f¬0*,„¼¦¼|žÔÔÂl„F(Úãä464) ”jT<ŽÄ"C~DžÔÜöüܤLF*,ŽÏÜä×·Ì¢„IB/\j|/,4¬La…»ÜÒ”ôòä\^\„¹âLrŒl5FHO,7<¤Öìºf, "¬š\„R4Ô¶\¼êôôîÜ\ ÌD6DìÕ‚ôýü€ÊÜ3|,.,DN”<8>tD,Df¬Ôæô(\’ÔÄÖäd /4D:4$Ô¹‡<2>LNS”R$ üóÊ Säæä„|´R’¾JÌ©i„ÞôÔ’L\ªÜ &$7ÔÞìLJ4325¨Z$3>E‡ZAÀòüìÓ¤üþüDl¼Ü¶” `\" TNT´¶œ|¬ÔEED\ŠÄtvt޾ØLtR<Ô²|\>4”²ÔœBZ 4ôڬܾ”¼Žlôîü4DdäÖ¨DJd´žtIOa$N´Š]RQ…Ô”F4#¿ÞäœZ$”ÊÜäÖÌ„TLÔ–d<71œfDL¢ÔäòìüöØ48C 4/*Lf¬L6||¦Ì<><\šÌTVTÔº|ÌÞì ÜÞÜ,Ý«þ H° Áƒ*\Ȱ¡Ã‡#JœHQ!A;2jÜȱ£Ç CŠI²¤É“(Sª\ùñÍE×Äœ)HfMš6sâÜy³§NŸ< J¨Ñ¡G‹"]ª´iÒ§LºÄhsà!šV± ¼Ú3k×­Zq­ ö«Ø°c ¦%¸Ö+Ù³fÛ–}+.]´xãæ½«·æÔgu޽jspOÃ…cž»ØncÄŒ+–\óñäÄ•)¯±œófÍœ?{M´éÑ’ÿÞ|Àºµë×°cËžM»¶íÛ¸sëÞÍ»·ï7U üM¼¸ñãÈ“+ϽUµÌåУKŸîZZFë;¬k¿¾Àöìܱþ[Àú»xðàÉ? ¬ú*õ÷ðãïÌÐ%ý….YßW˜¸À©ÒÄäZ [ ±m'~ þ–]‚à5ˆÜƒ²E¡|¯&Óf2²¡‡öÉÀˆ$’è—zÞÄ¡Xö×âE ôZakgl;ê·Cr=Ò–#†<Â¥Ö@ö Tâ’bõØU#å!ýõ׆°Ñˆ k[Â6äRæ‚câ¨^þÈ ƒ‚y¦›p^æmò¨fœd¾éfÄÅX–‡­¢ T¨“=("6UùßEO r t›F®å¸#¦œþØcŽ|úxçŸzª&¨¡ ÞœJèšþ¥êØUb&IhgPžXÞV‹Fi¥z/b$ã¤Z:Ûª¤Ò©æ¦ ò¹c^ÆšìkÏŠ)ay§^›éoö¸i¶Çí°W¹$ ”)Ù$ŠoE™“£TBŠ¥lÅÖXÛu`–gœ§ö»CÊ 9¦FÍfp¾ff¨/«—ººðžÿÒyž¬vÍÄôÊ¢º‚¢hW‰põ¢^p›e¥”6ÜÚÁšö;í´ÞJmk;¼-¶/?`3ŽàÞˆ3k;ÿœ\éï"™´ ˆÞ䫯L¼®°ÏÌeÊÔÞ *™Ó¹p˜à~I³Ö2³ú©¾_Æü²Ø7£¹fœ_ú[€J.I®­a–wþB™wݺ>ÐèE}K:ãŒXo‹ïË5› ô²¨BË3²s~¹*ÁÕaÊp¨B×¹ÑäÚþc¯&¾˜ñ’&ÆËšŸjU¥º ÂúáY&®çDæ}äz5ÒFÄ7®}5k¿ rnMÔ É¶îÐ/'ÍÔSßË×W=ÆÕcïýõà÷÷G÷Ö“¿=ò ;uâEï~t¨Ç/ÿü#²F?ꬻüï÷ïÿÿ¿iNÉB üƒR8`¨À2𠌠%Á Z°‚¤ /¸Á rðƒ aGBŠ„H*™L()°ð…-„¡ cHÃÚP†8¬ao¨Ãòð‡þ; ¢…Ä!±ˆH$¢{ˆ@+Rœá?¤HEV1Wœ¢·ˆE.j±‹`ü¢³HF/–1Œg£׈F6ª±p|ã›ÑD¦Py©# õÃ:æÐLœáH>î‘<d"ÙGFÒ„„$ )ÉH²ˆäãYF£›°Ð‚ð(E9ÊRš2”¦<¥(Q¹JR¢’•ªL%+_IÊXÂr–­t¥.e¹Ë[ö²–¸äe.}9L`þr—¥$f*¥ÑÄ;.O.ü‡'²S€Y§ פ¦5«™Míl›ó¦6»IÍq†³œÒàæ9ÓiNk¢Sîdg:ÁÏo’SžðþŒ=×¹Ïz¶SŸÿç<ï 0m¢g†OŒÉ §9ˆ†:ô¡¨D'JÑŠZô¢ͨF7ÊÑŽ^ô€HH÷!Ò‘–”¤)˜&¥àL®4ÑÒw6òìÔ”#7IN?²Sô´#?Å)vx:TŸ¨GjH‚JÓ¤6u©EDSÔ‚jdž(C3A4À5,tƒ8…XÇ*Võ¬hM«Z×ÊÖ¶ºõ­p«\çJ×´B‹)ØA §È×.z"¥;hfú 7CÙ…µ™¨Äü2‘ØÆ"Ö±},b'YÆRö²–­,e5ÛXÎn³ŸõlfA;ZΊV´’5ídO!Õæõ‹“ôþV¥CÊ..Ìê fÀØL`¬#`¬21Üá÷¸Å=®r“›Üå"×¹Ïm®q™ ]êNW¸ÑÅnv¯»]íZ×»Ùu.uÅûÜÞf‚µxe¦VjÃ)þ#‚U˜[„UÃõοÒ9žî~÷¿þ 0€,àøÀN0‚‹‹ßó¶6¤z•¢À(ˆ”–A‹,ŽWÈÐS V+ "V†à ¡ÅEñvU<`G×Åÿ…1rel]ׯÌÅ1Žgã븹VàkgèÐCf|Û#z¾§8.Æ–Ô/n±–ý»ão¹Ç\þòŠÅ\ã/瘵 ¤jþ\ä çv¶‚ðšœ[°Î ¸!Þˆ4€‚2×e€€&Œ‹XL¿Ø˜C? ‰”y¸ŽFnr#íåWºÑÌtŠñ»iHgú¸”F±¥EiIƒºÓ.µ•=}cN·šÕV®Šƒì¼¶°Í[(2=8 X&ï>/…ò‰}« € Ç~Î(2¡ )0vS06\íeâZÚÒ?À.µ-mm7Û’öv¸»M\p‹›Ú䦶¹ÓÍím[Û×Îô¹Y\iüV͵¦­}P@ ðûÍ0ó•èK 7ĨfÂMŒÜiï ø-~ÿ0\‰ —Ó2î¶½ñÛ€áª8Ô w¥þ;žXX“Zä¢&ùÇSrŽ{Üä!÷öÈ_®ê“{[Ô1z8dCr«µãÔRÄBŒ6¿ò+÷qýlƒe;ˆ•¸n€Üt¿ÙBÖ…{uyo»ã['n×E~m°/wì2/»ÖÏŽnN}íÓE»ÆËžu­_Zf?ñ ¼­¶—ž&BÓÇ»¯†U»æííªA MôƒÐS î ùswä”.¹ª ëOg~åbI?kηzôÉ=ÞEoeÒo¾ón;§àèU£·…j>$’Sª^ Ä@\Ùë“ÃzŠkˆÕm5þZÍ:Vã+ßù§˜X/}çÏàÕ/¾ö±þ¿}ígû܇¾õ»Oýí_ÿûæ'ôÍ~ò£ŸúÆ·Çõ‹ÿ~ú+þÚ§¿÷õ?ˆhæ™°t‚/ê³/V0b; €#†5õ˜€¡€ ؘ ¨}¦€"F0Õ´xÑ¥x‚A‚ó‚(H¡‚h‚è‚ó‚6(‚,‚}VPˆwUk)€R&5„p&tò5gEVî0LXMN¸‚"Æ„$fKH0SøùÔgà!…XˆW¸€UØ„çTƒR¨…Ù$†îD†³_ç$†COr†#v†_¸…$f–WèqàU~ç{\¥>‡Cº5bRxMþ†˜pe ˆS¸gò³…‡ø/†¨†\h‡ˆ¸MZˆ†m¸…f…$V‰ää‰éd†Š$ÖgtX‰K†v‰\øƒ!ÅL“ôR)õµ5X.•[1uР׋%‰iø[‘gL˜‰ÿ"ŠÀÈ‰Å¨ŠØ†™hŒÌŠÏÈŒ\¸ˆpè‰Ø˜ŒÈ˜‘xO–ˆý‡@}×HH6[v"hxÜÁ„餈 LjKˆÃ_Ö4­èÜÐ8ÚÈØè¹Œý(Ûh©W˜‰ð‡ÿòŽØèŽ½˜p1…Wz5G0$[JfG21pt&Mö%‡‰MÜ´ˆí(…P†Æ‘’è XMûH›˜þŠ_hЬ“®h5E’5‰h¸ƒ©ˆóÔ‹8”x8U½GC_xh[ÀÆa`†wèé‹Ö8e%ÒØ$‘ã¼8“ IŠè3<ù•’B–UèË…"é;8PNø€‹‹¶[„ô^z…@wDt ÄPm©ˆ"9˜¹MÝQTã1"Nˆ uÐóøwP* bêàù`­(–üõ… RŠ­È™ ŠWØŽÒ –Øh¼ˆš©h…IbR‰–1•fêåBÍÀC×{V2WñR»˜š‰ :‰“Øbgø[¥Y” (À•Çð eµ.P.¹“É“)œþI–Ú™þø„ é–ÛÁ„ÞyˆNh—8˜Àyœ g—IH?(I¶—,5X¸Up0Ü—M’;Ø}–p鑉ҠÐPZP1pwp-ð/g[ÍèŠÇ( õT˜…)ž1y¡Õ9˜qÙ†Ö Nø™Â9N¨¹Mp9—½†!‰‡34Ž74úVp@7x±3:tVpO9“ïxœoù}6?ÉÈÑÐC =0… ·20ßè–Ú¤%Iži)”ÿ 0SÙXZ¢ ¤9Ù‰9ùšì„P¨¡ô´_¬Yv9›S$Suô^K95Ïäd`EŠQ˜“à‰žú•ˆâP Z`þÏðwàÿ’ùšŠª™¢À(œ‚‰¦%9O!ª¢ƒIšèÉ…”Yê¡ç9’¹¦”ú% ”`5UïI4 x¼7xGxŸ0%SÜ‘¡º©ü9Šñ¨‰6x†VÊ¡›z…Y9’“J¥y¢A*˜Ä:¢M¸¥ÇyMÊ Ù1•š«!I­™*‘ñ)£¬º ´PµXXWáÉP])žQœzŠ’ð‰}ڒƆ%É¥Åj‰@¹nY¬¢ˆ¯¹‚$z¯äI”! Œzª¬zê¡S¹©ÁI­`åB±èB­Š@†‘{é{èlu&S^žìy¬ôt©xº†{v®"©¦Ãz²;¸¦BÉ¥@ªþU*‘?ÚŸ§ú¡¯Ùh©¡A¦¢ZÀé“繡"9‘¸t±½—d¸I§€l4j‰|Š©™*ÐêÉx‰’1›°*Ù¯_j¬sY©WÚ²C™°S+ªót¯hú¥á™p“Ø¥À©¶‹Ø°DUí%Så(xNDx¡@æJAÙ¯¯ ¦ …\Ê…!gK¬ë–$j«ù·UJ癲b;³qY³3 ¸¡jšR[᤬"æžuD£[¤—âz„6‘„´š‰¤¤¡j©†IžÚ(OÃgոަÐ6p­ì)¬}ö¶]Û‹ÿj«tù£‚©® û«„ù¢®Ëžº1зÍÊ¢Z˜‡´þ•@v [H+pº¹£…˜šåÇ)­ÇéšèyŒÏȲ HŒZ\ РˆÀ»¬ÐH°ÁÛ„üº;Ûµ&»¦)+­Á9³òû„ÇzŒŸ¤—[²ãžDº‹E[XC‡[,¥„TyšJ¥œÙ…ĸ_biÚ»„[«ÀK—«N¿Ëš-KM7õ¶ejˆ)³À›³뉨X¬6Ü¢0*Ž~'HËR€«É·lºŽ&;¾^›Z‹… IOñsŒùÁÐßÀnpŒ‰[¿ãiMË¢;¹–^ù·øÊ¶ŠžZ\¬ ,¼mêGpJ‹gGã:@åSù:³;,¾ê©ÕiŒþ+8á‰|Ö0ऎ˩-š§ËšN0̬­ °9y® 0;Ⱥö[¢é™°Y ”­™‡ôùú9E„(€B'gž”[ùi0>«Çû Æk:–¤ê j’ÿò[ §ÇÉÅBÙ¼}ú¬m)—c\¦U›¶ü¬Q©Ú4¬‘*¶ŠŸ¹'lEÛk„r…õ”Õȼï†ê ¤‹[¿öTbX‰'i ¼«\‹­Ë꥕³Ê“3ÌMh\¯\˸˳¿jo;báøwÇ‚d£x+ÁÂ:¤\ˆË˜²‰8˜æYMÒZ¼RK¯UiÀbÐLôû«.¬°`º©(©M’jYþÆ,Š…ì³[ª¼þ¹²RèžT´W„®|©·+Ä—O™Š>ëÄV •¯Û… N')ÎkxÎŒL̰+ÉùȽœ¢¤ÚÂ]¶:Ò)ÊŸ ܉.:ÂÌ yxa–ôREˆ‚ÀI²›-¤[^…#MMÄÌÈ1«O_MÎ×(–Ó[«Œ,ªZ8bÚ³žkÆ]+¸¾øÅ°é¹­{†úh0Ù9…Ûê¦3´R×kÖL8‘ÍM;žÑœÒ˺+©]849“Ü•?Ý»ý)¤6©®+ì„Ø¼k–ì8ÞAyŒ¦j¢ÎÔ(ŠÜñmϼ»¬h àáôµ®í’Ö›KÈ4ÄtŒÊ5±P»XÏh›¯Â¹ÁšK¹Ù9“°›™«¨Õh<­ÚéjœØýŒÒ¼® ÛÎÈ É*û/vYR&%„$g9-_uú—ÚÜÌ,,”l°Ž|Ã+ÚkšMO0¥íªÈ ú“œ½ÜÏ=ÿ8ζš¹Í»‚¹ÂܽÒ[ž†­%Ê 1YÅB“Ž ú›¶Fnؤ ³¼ÌO ’«ŠÌmÆþhŠª6†S Õ Àt~ž@ú‰ÕiàhüÝÚªEƒpæž`‹9M€„U@ÃÇO0^Ï' ¦ÀÜÄC?½xÎ |P±œåú;¬?½¼e Þ OE>¢è‹¯È«“cZ¾‰+˜ ¶© ±J¡ìÀŽæ¿=8·E@N©±×ºƒ«¯›Ë×t.­‰(Œ£ˆ}ÈO:˜çê¼ ©­À )Û+ª•9[Âj ›êâ;âË=¢á(Íìæ’ÎRu<_åz§½ŒÂV:ÀgëÏË ‘eZÄù¡)ijÛ<Ô0^ÜåËáÚ°Nå_©º>¯> ð@›Õ þ°øè1Jñ.h>þ§¾aòÙ›ó´žcî’“po‹¡}ÜØ$f¼ø'IÎé<ë_i³ º¯­¯çà[~Ü+ï–æIÑ›ç0~²âmèQØZðì ñèôÉ”ØìÞCþÄ*‰³ž¸GÎÍVk»<)ê-ÐÑ I‡ÝÛ7Õá±-OÛ–ôHñR؇}­$}«1 NÈ› ò!?ò DìMdìHØæ\(—5Ûóúšë.‰‡+å ‡Ñ,ž¦§IO®ËˆLœ÷Ì;âÉèðRyôß½Ë «ØXhM/øó~пvÙ<­Ÿ ^³[½ÈÚ”“È»¡õ«Ô›ؤݚû Ú|mðŠÿ¡§:ÒÑ›¶ån¾ñ=ñ/‹O9þõî€_"/%Ͻó…ò溅}Ìö–ÿ²Ë Ñ/]»çª•Rn¦§>š¸ãÅhÑWª¿%¼û^å˜ïÉ.«? ‘©OõòNV/Áˆ±ñÏ“´A;¤•ùSF!B†;&tˆ¢ŒA„–9˜P"¶…w2äE‹Ëx<9ñbBŒ¥E¼¸Ò¥Bƒ0¶¬ˆ1¡Å 5ªtx3£E’,w e¹ƒãŸ—7%¶|9ˆ‚ ƒ< šõ*Ö«V¥Q•²FК7ítH…©žv BTKž3o:dé“$Д*ìø£ÃŒ ›:D쒢ΛI‡*,™3©á¼1õªŒ\S%ã…Ørþ$ú4¯Qšœ ãe8èÕAZ³rÍjuÇT YË ú“uªÀ·AY.U)ú Í¾PÂDŒ€Ëå/HÌÛ¢aJ˜¤ó>õ(}aB¦ÛËÔ)LᎧe8¶¤È§fè=®ˆZ¡Ä¹Ó/¼Y<*Õf­_ Úê5«Ê˜J µÈ2Kš±Ö¢j ¸sì.ï‚SÉ3õ~J콿œSް”–ã,1Èòª¯¸¯;…´8*!ŽÊc ±örò©©ÉJÌpÂÂòc » P"O%ÕX6×°jm°l3kµèAbJo¸”º‹ÑDñ,B ¾ÁDú Ä?”˽üp¤n¢æ.:"\ IÄòPšþÏ;¢z䬡¦hlŒ¨ÓTÊ21Ë¿ÿ^ëÊ“2V3p¬ÛЊ6· Í2:ñÛI³ŸÔKSà ‰¡¿œ˜…sÂHG…¸Bš(C‘ÚÀ¡ 2êÈ'Ÿ“dÀƒž 0:çŽ/T¦Úx.&däë)õ²2¨”v¬ô©9 ÏN3ßZ­*Ø® 0¶hÃêÛKR ÚÌÚf+jñ¡;ò¨åâJv°œ>Â¥Žùe(¢¦ovE2\(`!JVŽ i´ø· £øƒ’PÊÐ3¾6ë2± !£ð²£ä”d•O2&“Þ*ôPD‘t‹ª˜Ä­\°&­é0õàþ›G¨~Þö/7:Ù!†ò¹£…ÚQ‚D:#-VáX™ÃŒîØé;Úh&Ö뽚ëËÏË`ŠÌ©:wRϳÆxŒ,Ú!½Ýªïÿ¼"w s›K)?kʻ筮¤ºdšðe0Eº €>PÙ FJ+c’˜yiÌ=d†’,[n85É .BÁ€£6SOДëÆH¹íû˜Ä¢pâ,SêŠyæ#e#«G±Zƒ-)Œ«N†¬ñnñ{QÛÃû+0‹2úË•{¤yæ…|špHòp(•|’ø¤ŒjøøÂ‡ÀV¨ü¨Ë@G‰Jà ôZ‚”|Ï)¶‹´þˆc·Ù±‰v;JŽj¦âŸp…K²iÆTÔ‹&¥ÅpRà »*…©é´É€ ’ÈZbú|dZo›`bø0@q‘aÈ|£˜zå°]zí ”¦ÐÇ0G¼ˆMâõ“™¨¨#Š‘ ‘²2Š ÒLISyÒ£ ç<žñ¥>*:He2;›ìh: 1š ëÒ%Å0\òÒ}^VÄÒè®zj«Ï¼°Tiñz&âÝzÒt‘è!gHR0ÔÂ%›n1oy‘á¤cFòå+ŒOÊÊ1G¶ Y ßõ’Ú>v<‰ˆFcœL¦R*ª ›˜D;:«ˆ!þÑpI@Ká´þ) –¡ šb ,¥gâÇ0;¼ÈäF²F !‡Ž=DMíÒÄ6k jOÅ‘ÏcˆC¢Ù3¤^v„§½%Òx]9KÊõÈ5Ž“!½b²'îÀ•{ôcKR'˜MG3 $ÛÊ£²õð]}Ê‘2“(¯ÉÄv%"™ •U'À䑊”Ù€¨R±,O-’êM_<½%â$Z›1à ƒ4 gMÛ¤cÏ>ɤr8„žꥸ OGtQ¢PH6™¼x&€mCª–ÚY¤ùí‚nIÞà¡ ¬ðÇë²e|726ŽÌ™™º×`$"»ñT³wnÅ£ r£Íò¥¢(¶¼óþFº-õÞáTÏ2)hVJ‡u§Ì®ú•©Ó,¹IWƒz“Ó–€æ2DIÛcY4~D$.¤fwÔÆQ@&¤céX!1IÊp’¦0LüæÝ*Úà…ÖN2à‰(Á~Ë—WýÃ’• 'ífR=£Rõ²C. G[MãH”sŽUT#mp :Ë15ùAÆ@Aꀬ”tÌz3cÜÖ©˜óT¶L™ý§ló8ÄüˆÆ›oÙ /»Ù3-ôÜAœEÊe¢w/½[¥6¤Ö2t%`%¢± A!øûH9v@1J\»¨=§_g;ŸÖÒ )±îöô8ŒÒeŸµËD¦êþ .–Q8C‹ZlvÜû´5›ßû7ÉPû¤ñkA!ÓG Až¿ @9mêäÊ"îBÙ4gÍÝ´ÂTÊŒŸ|-4‘ÈD»¶]ˆý-U­è¼ “A÷|K!³åDV’4Ñ#ïþ M˜iC”àAt…ûý¡Â¢Ñ‡4ºF´õ²3(«r…BÍ÷<$ÑÝ•YY™ñ‘þV3¶Ì³ƒ]Õà[„hFÈH).å1‰Tîf›ÔÆu¿ˆ‰Là&èØH§: Cÿ›+Ú° ÑI™›²EIX%*­q^—Ùè:ÕKZ˜MPÔ¾Üá{±ÂžŠ¢T~F<™ÛþI=©Ô§ÜJùé á––’3Qg‹x¢wÞá*_kÉ€†³)»ÖÜ$Ä-o¿f e$Uyj(9ÈcWÚ5Ýuàéè¥;I¶QÉP)ûћ‡}qöA€#¯LÝÛe1Ýö¥ýmÔJz„ø6Hwi$«Zq¤¦>Ë‚Pú ‰˜¤>mâcÑùäâ””'nƒiÊÓßeM"w¹¡„i=ÞJ—½Ûظ™£ÇÒßÕ.ÔÆ‹ $qåÕ!,#dWLE&ˆíAŸ—óñm2m µ Õ]»JY“ȵU÷jź£kxø‰J(X$ãyÅ¿ úX|LMN•ÊŸêE“îþ´®®lãh£ ʺ0u¶xÂd*¿8p6ezSÞMep›×³Â+Mg繸fÃvA¸Ù¸R ñcª Ÿhë~LËOê¤Ñ6;¡]|zÚñ9«ÌîïN|+­´P=±’K Éý 'Ò^ç8YôKùCõWƒ‡À|ŽßŒOKÇI“椈•ŠœÆX°èÚ!0³‰²G;‡¨ƒb!tÚ:®s¼f’:ð4ÄÀX[‰á€Žƒ7ݾ"y8q‘†Fj»Ì3œTc—¸¨“™¨Žs7· “Ïj´7K?Å+X˜š{ñ>±»Ã;¡Å ¬S7#j¨šû˜ŒÂ/"ÙŠ¤¼D¹þ¢Úø/¤ç!ˆƒ2™@Ú@:j#}j5„H«î™>ˆ¦Y¨®ë"N0C‡€“={/ø•>ødA  Ä6J;s·¾²Ê ¸Û‹±s‰?"Ä$:¤Dª1+BÁâë ±Ø±8“ŒÚY*+ßc·µR0´B€ „(ƒ@ƒƒx2ŽY+^ã°hø0i;° Ç!ßøkË“39+Jʲ‰‚¦¢ÊÈè¶)# ·ÚÀ¿G:„颮›ŸA8”Ùá¹PB–0³ùÁس‰€“ÁP ƒ†* ( ܹ i?L*ö³,- =CÄ’¸ÙÅË ىG¤¿oþK{Âix’K,ˆŸ Ž…ÂˆX¹[Ò»#ê¤SÜ>ˆ‚ ÛHH ÑixF+r8is$bµ2Ùøb:ß`“Ú¿8“ Ä«¨ë”é7Ôë&B“Æt#x¸7"¸¹¬‘9!--Ý/·A°¤Š%l« kᭆ݋n‰$½>’Ҫآ+ÅëD¿LŠ;/¬ ¬ŒkÒ)¢¢(nÂMðŒ= Ķ©+-ø,§1t±¥NmŠ )ÍÃaélÔ\»›IAH©§¶è ¹ia©Á»³ã³öp½Å™ C–›µÎÈ´xËö4“$C"*£9ZËwD‰½IEÐÕpQOH³X±à 4.UÓ²AbŠKÂG†¿ã(=Á0kÛ—?y4ñ¤%u+³I"$$E¨ÑÊÅd’þ“›C¯ ‰" €N{ònñIÑKÆjJ$7b’µ#:nÃ(ÀZ Ý‹L¢©¦ÅßôEvK>h ½X¢$i*·B uG¿ZŒâ”=š³œ>pTzxÔÝË3® Ó1ÉRœ@±Œ+Q9ÈñÑ#-ÏILc„ªŠŠÀÏ… E¸ƒTm’¤û§úÀù,#âà'Ùz>”q¿6¥¦n“‚}Xª€TGýÒ±N›:íÄŠh +,…óÓe2ŠùêPõ¨ÁÐtj¯åäÄhŠÓš(¨LÚ4"*°:"Ñës¥%™l©Õ¤øÀŸIN‚èè¤ )ð-þèRIIÍè\MŠ»Qv‰*pí«æ1;Á–hèRç6´®|`0Òù0ð®_Á&H‚Sƒ/°#ªÁÄ´¹»u}[2W ¤;ÚÔ$TŒÑ\Ña  Ò˵cÆü+·I©ËEÇc5Zu¦1š¼ ’î±( £04àÓ2C@ذ§ …«E +è·„l|¼Ïs+t¢JÚº"R¡£“9ùàªÀW°¡AVÕ åIXúµ\¥'šX99štêÙa25Y‘ƒH–Žv˜ÅZs¹1ûQAòC ¸Œk “}–Æ›‰šÐ¹¸¢fÈYþBV`j¬JE‹È‚3¸ ÔÏ“–yÔ »C#>S!£4A#´1…±ÜX(ƒ=ð€{Óå,I°Åòk:¿eÓËL“‘Y(„µ{½"¸ÍW°Î¬:—⊤”RÔmÁ¸¾àU1ˆóRÝÌ{ɵ;¨@x‰ Ø`C\bËÊÿIˆpp‡/˜ƒ5̗߳ã6ê0N è‰²D.µdÉU"BqÛ2O— ¦àÍÞqƒ”ý#ˆAðàáá&á6áFáVáfávávÖ`µË¼L»¼KR;SµðË V³ þá^â&â^*â#bVâ .â$fþb#V³#Fâ ~b'^b+ö­!Öâ(b öâ þb/®`€ÅÂ<)ªÐM>öõ;ÌäœûbÙä ¨96ÍÊ!9®Α´>R™÷[c:¾ã:®c?v£}C2gJÖê’1i¹ ¨%Sf]Aÿ4]›1]ê”Û|ÝÞK6]éôäéeétQ¸e”R>JeQæäPÞd]²än¡n‘åNåJ6åÁdZÆdêåÒåe_îdç¡ M){ æeebîåQfæe¦äV~fZ^å_VefÖeb¶ÙÒUe¹µfZÎdc¶eTædkNeNþdRŽfS6çuÎfFÑfcΠœHðåwVfcþ¶f­æqöfí5fle|h\þçK.ç_6èg>è~h}ögr–æ}nQí%] ¨hK®d‹.ÝË{$(ÙhêÌè€vèl&æwgêŒçþè‚Nibné‚~ç\îe`Îföç‰þO‘¦d{èÎטFç|űi’Öå›þçœÎitj“þä[.èœÞä¦AØ]ÚŠ¶êüú ÖØ¢èÿ¼è^nèz®éXg‚þé’Öç‹>çFR‹85sË×x–ê‡èSžŠxÞk\®ëŸ^j°.é>j¤ækÓ-{Új¯.”ë\l‡FêµÖi¸æ¸=e°Hi–f”fë´~gÛÎþ‚îl¥Njž–lš6k§ViÁ®eÉ® ÆÚ%ž’nYìØPŒö䱎fŠeÖîä\Vk¤¶iLvk· Õ½Û¦–‚x>ìήi¨îk½6ìà>là†ghî낈áÇæîáC$2nmálÕnç€gë^îýkÌîìNžgÍ£ ãæéáÆkM&]më¥6jªg›ÖèÓFë•®hçqgh–êûþïð>p¤¦f˜è¨vpŸn”„$ÀŽhqŽîàöo•6ïmNoöqh~iþög»&ï—Þoô&íõ&hÓ>i ?gÉ–iy¶ÛÈŠlví~kžfmëÞo7mSžeònê³>ê©Fò6þêÛ6òŸÞíøÆëð¶Ù‘kKõh°^éè¦ïÏðh>ìéñ§oévò‘>oÊnðïi/Ýææ‰î6óOVóä!S®Ú?1®b ã0¶`%Ös1ô?ObBô@/t@ïóAã=gtDçóAÿóE7tCïóF?tI§ô*2:Èâ`ÍàI’ãÖùÖÍÔ©™%u;FBÁôÁh$÷™õTõ#Œ¡Â:SÇõ1DuE¶ã[uZçõôÔ!($Õw‹Û÷®8Ԥ˻ÄKhö¦ö¼”ögŸáj§amßv¦vo÷ömçöl¿öj¿vh/wtÏvnWwnwpgwk÷vþÇvs¯÷hWriF•,ÑäXßVŸãXäµ1øƒvÓÔ¡‚'x:nø‚#ˆöˆÿ÷1±µ¨ÃcŠ7øF†x€gøÀSyªq9ÓxÛ|¶dWå|î–‹¾ïYvåÿ´è˜OùN6nˆ†ù…f‹–g²Vy!çgÇð[¾ç7÷dWf”‡ùJ®gXˆÔÌ`ä>ã{*ƒþœïò.ëçrËï_rwm2wq±/ë¯ÿf³gú–ò®×i¹…Qµ³sãëIÑ o†Fó´éçoVðVçòfð½GpÏþíº¯é•.üÿûœ¥fãvèŇìF y‰Û÷Ì;Ðç1y€Õ锞Nþhs l:ó.ÿäêfú­çì'gé8fçÎñ¥¾q wsëþrÅᡆ$ÞÖÈÇ{éŽò°·YùNò°ÏqþFëà'rOm€Î{%÷{ç?þÕ^ûâÿñ{‚z°h3-ä`ºoþsèÌ–‚; åÏe/ño6ýžÞìënj¨6|¦¾k€6ýñöì.oó©q÷¿§];JÍN R(xÚ‘BÚÀkðàùð!ÀÀÿ¤LQ F#R¼è‘#ÆŽ!%~ÄXQ Ȉ'-Žlùq¥G Íbvä¸1¤K›OÞLÙÓ%…ž1gõ”“4Œk z@ÐŽ¥‚þ+¸o‡@-ã(PþÁ%KoB¤ê±™E´/Á²µèeDµfSŠD9qãݸkkŽ„)PnÍžæ6!žzŠES#õG]a|zôXdMV™ Ò²Ô•eì£Ý? Ðó=&p‘þTòâ{4 Ð ™)EùTð‰“}åØ\ |Ya?ýNÖj#99(ž‚U$޾YˆpçÝVR$^–Å-¨M-.ý“\Gx ˜'’~uëßœ¹ †¤YÅv’Z ¶gÙhgKv¦è†–-z¥AI[Q:a8€[ê*‰­þpCÁû#Kµ>·Ó°ÎYR‘ý›p¸ÙꟻUn”úJ±Tw–IõáWÉy­X¹¹ê’®lÕH!¡Öò*¨ÊuÕ\®ÍŠa+§Æ;·nƒ9§{ÝQX „Y•LáË™Ë7Ã5®À9cusË ñÀ;†U,y5łԲ»WáMQΫ壂§™4“¢Œ³‚s×È߯M¿ºïZÒöìwÐ:É`Î lhÝ:§¶UߌhR(!m¯‡Ï´ƒ'™ ’¹'›sîù皇.:ç“:覗Nz驟>:믷ûì°£¾ºë²×®;î«Ûî»êžß^tG”… •³•œB û0ÿþ<óÎC/=ôÍWýõÕSO=öÜ;ï½õ×o?}øägo=÷åkÿü÷ì«O>øâ£¿úã§/ôU4y£f&… ʰiì`€$ ˆÀð€` Á 6P”à3hA>Pƒì`HA °ƒ$!GxB6„*üƒ”޶”<¥YJÓL¨ÃVP€<܃Äúð‡?Dà“hD"±ˆIt"w(Ä!:q‡!üa£ˆD&N±ˆSlâÁˆÅ1vQ‰LDáËPíPÉ^KéHARhÀ2Hc‡)¤có(Ç;ÖñŽC$ ùÄ>F€äëÄ@êþ±‘†œã ˆÇI†ðŽ”d'IH9Ò±“œT¤%÷èÈMJ‘ŠŒÄ\ä”U/äUNy¥Œ"¹ËRZq–±DäyhE;æRˆˆ¤¥-mYJa.ò‰¶üe/uyKeî2™À¬¥QÀKH& €KñŽ£nX•9Js™eèæ3‰™Cpv™´”"#ŸùM^†ëÌ$8¹™Î9¾sžìüã=uøÊLŠ’Š´'8í˜(U‚YþÃW4Ù ¶€‘¢|(?iYN ’3äth1úNQêTüÃ8;úÌ‹:s¢""HYÑÎr¢¥¨9¹L\z`áŸ4(“™ªÈ4‡ ÝÔ2€”þ¨>=ªQ“úÓyšs–èœ%H— Î¥ÂÔ¨0uj„ZÀ½:a˜½-»Ù´–Õž˜iTsxÖ¢Ú³¨ƒ•l;ÍêÌ«6•¬I5'fØØÌ:÷´£_³+\„(Ë¢ÜN ¢CiPB9â^Ë+4¥HMj7ûŠTË"•«œíd=ÜéJw¿þd*1{ZY¯ºT¸Áå$q…{T³v’c_‰U@VS*n£«[Qº-(ãA*%:A\ÝÖ½G•îqõ Z`þ3´DEn‚],\Ï.x¸˜…gJÕ±R9|ìn»)M鲨ªØM°„u[Ú·-®I[ƒdðKÞyPq¯@=*`±µ¨ –’ç‹Ë®2Ÿ?¾åtyâ¤2vªGÅ,›iÜË:VÍå2[ûO$ƒò£g®gJåëbÀ‚¹šü›« "’áWƒ/HÇl¿)ƒ`á‹4®‹êãþÊÙù¥¥h·ìS8Kب>–r—¥¨g´yÇj=§uåȯ™¯Ãþ52kƒ[U—¸’uëþV•ÉØ%Ž‘â4×ÝzžU·lN5W/ªIS–´ø²{­Ãýâר_ö3˜©Ë\#_u¿J¦ugŸ-_ɦÛÚC>owuM{1E"âŵCÉýÞÒsÂ^žµ‚½ùßýºÛ¼Fg³õMè5—8Ç î$r/í`tÖqÓÚ%ø¬w]Vwö­ç%`5W%Õàö}dµÿÛƒoûfíYñ óàbc€vmæs¡:ÝúÎúÎÙ¦d:Ÿ Ó·šÖ·þªynôU÷· Ô£ÕJ¤è[â»Õmb%îý–»ffíÜÉSË<à{ܹUoË뿹±—Öþ­Üa…|̇|n~§“Ë ¯}Ù‘«û¥Š>Õó!,LïÌ(oÙ‘wqÇ}lJirYÝI?pàNäuÿXìyÆ>æÇéÞb&>©þŸ¯Ž¡UßE^Ëu^þE˜î‰Ú" –‚©Ý:e`S\…×s‰Tñ=œ9}VêÉÖ±ÜO5Ù_˜ÉßhþYÜvÕÞÐÕØÖUÜtiàØ¡vmÔŸ¡”³åÇqžH1ß‚aΛ\Y‰¢„ÔÍí·užÍ‰¨e—|u¡ÝH•SÁ—†Þ½—šù˜ãí[ý=\Î=×™X7ùÙ-R÷™ßˆ- -]Þ?Å^A=EN݈—ÕÉ—µ™JùÞŽŸ”Y]éý_Ïá—šyßó½:ÝßîõÞ¦ƒÁ`šÓZ˜=… ‘à– ^ø¡Öe¨Ö6RHyÛÈ@CýÁ(ØaÄåÐ ´A×»ÝÎI³­ ÿ=¡Ñ"¾YØݳÙxíœÅ’ÊY›eáÃ5X`aèAäI,¾Sþ¼PŽɬ™ÿQ-äP ×= ¨ÕÇ]ã!Ù5÷%T©y›p1Vè휭 c‰EWÖ½—¹õ³%Ø-R"ŸÕ b6R•[±‘\-Å–a 6¡ €Ù*~“ \[ h€A,X5äbÚ*á§e¤.Ò" ê×1.ôU×Ña+ã†[´}\Òi·‘ZéA!ÄÁÞÚ0E"R]T‘A*„Aì€#€3”Aè ü” ”¬Á>Œ€2HS €Ð56]þq¤íÁäÉ£s%Ý?)/r¤UÝn) †e˜]ׄÇåÝÿ}e¿¡¤Uþ˜&ÎÞ6áWyíÐPÕBJi0 )è¥QAX@%ån¹Þ,–žÄi.rn\_™ãŒÕ˜-Bž!º¤z–¡œ1vÜâ£ÿyæ'ÞäéO“EN}È¡ AG5å8æ,%ÄY€2ФiÁ ø€|ÁÔ‚¨ÑšÅ™fhµXÛcÁ B[Òù¢ý%¦¦¯U—s±ÝÐý^ËaV@™`_-R:c*}O’_A€%Ãicde¸ÀmM0” -¦%%E™˜³ñ¢$Z )abÕœóYçjÊXuVæ^Ÿõõâî(UQ#=W0&HŽWEÆDþèäÈQ ‘A Q)¥8&8Â.HäíA$„AtÂ1æÐgvúUa†¥b•¥ƒŽ`¦_" !RW—ñ‘_¶›Þõâv¦ .ݯ­ø±{æ£×É@6TÑOõ§HAA>DÁ±]žÐõèçéŸÇ½›=_Á_dÞbÛéZ=Éš„΢"Ö"ÚR’Ý×åuè ªQ¾æ…‘(Kݘ§5[.eÕb`õmà "“r(ËéÓW–$ġߌɤWáéjú¢vyŸt%çÄe'2Á)Èé‹*ýà£D™0ɘ] Ñ&`…ßa\Zþ™¡éX!ã°’q•Ú B©þù}õ%dÝ…çšaV~"òÅŸiR[¸ñàFˆ¨ꔢõRþçû©CñÞIÎe~Ú¢z¥-‡¦äyœ©Ÿ" ·n±òÀ+„iæ…! ™é*ʱîçŸ_ËWënêÍ«ó´t¢³ØÞ¬†ÆÙŽÞ÷JðÈöQÓr­kP^r¢*ÿyéoñá'ÚšúJn*q›±-ï)Î*uŽcÛ$þa¯Ñ•d×a¬?:›Rÿ´FâåNÝ/Qû½ì.9žgªÝë41ts Ùr3 ñHà…5lç©G´ÒÍïþµñfAŸR˯Q=W ö°…—ëÆZ€yS +Åwu:`ެéñöíãM‚LNîÒ¹¥¤ê2ùܸ½£ þ — ´Å1–4à¥"lnjÃk4);‡ö¿íõÙJëŸÚò}]ÛŸ1Ði%›©žµ7öê1¯ŠVYV3ún¡—Vz¶M·j“OæžrÑ÷(›ã 6ßÛÜ^Ïos¡KaÜdn Ón¡ƒwÛíùuLã!)ŒSjƒqW²è÷á½íµF}‹™XRv6/þt·a!åa_Áròyd•[3ëm¶\Òiq×25Š$f*ïuˆ–°SHî ©^ ôÄÚßinfß¹Ÿ ûþ¡Ò«Ч@rf‹7E³œ9?÷*ষ¥ƒ²Ý]FÎÇ9Odz”¿©úžßÖ¥c*èþCã_±B-Új!Æñ±²3"×îºRc}¹Þ­øsv7² aè©i¶âd"h±™óÚaûûR(·­X|Ûr’öÚT©¦uKìfžxøºÂ-…à‚ÞqÂ"¦C­šF6ºé`Ñ ø-Š#ÊÄ‘¶€‹õp—ýï79ëÓAA 4D÷kÖíÉ⪹)ð´¦óÅ bô¨²kÄ륞kŒ%¸êugé(kæk[=[ë];¦ '];<‚;¨Ac%åÖ¥ z£•ƒÒ‹KWª7ºûªïÃ÷?ñð^;ç^ÔÅYî/J¢ÉöëRÙ»ËÅP­ÃêTP/9MMÆ1Fº—þY2øQ¤EJCCÂàNs’‘퉲P/y©mäf+lÜþ}è"ð×a tVj’Þa‚œÑ@z£Äæ<ûe8 ”Á#ÜA¨ÀÀ”Á æ5‘`• ?eTþf”‚U 3³twCGkšu`Øb8§ZvrKªH¾²wjæ–/x©·bò#uÕÀ;½ABz{íÀ1ü‚W_ã1x ˆ‚y!'©ýv¦a.@`/ø'  p~[z_ ö=Ëštê´©™Ø´_ó¹êñŸg—´ùS³G´ñ‘x :'Ì@¬$ˆ‚ ž¤í(£pJ¡¤Å8pçN‹2ÒÞAKôþçO”2eþ¸`¨Ðņ;d4|áCË— AJûóñ"Me–¹ùq§´…>gîœ t¡Nš;ˆú¬ùGéÌNieXó'È¥8mZušSéÔ©3‘Z¥uìG…N¥¹¶èO; Rxè A;"(EÊÛŸ ôA¥ŒX¯%4PXK¡4CN¶ƒÁ‚°e,|d<–-S´Gu~kÖ¨UŸ^§…ó#¶šØ ½x֨§4a—Þ:šm¢=iç¼É”'ÒÏ9ÅÚVJÅ[¾rÖ½;PÁžj/°˽~´±ˆB€<3k-¼ É®?Ov쉔/Œ©™wD ZÆ5þÕÛJo²-6¬búŒ´R-*äf»Í+¢Â²m?œ‹(µ¨Ë7­Ê*ЬãhZnÀµ.sKš Êk évH zkÀ‘<œª2³ÈÆ,Û<)+… È¦©Pî6§l˪xºÈ@ÚLsr¬á¢DjÆ›ü6àxà *ä˜Lp?Ïü“­³ä24ê­‚þ¡ŽEAb¡éüivHÒ·$ë¼ò¦$£d«&†JÐC°xkj9²p2PA¯ŒðÐÿ$´2A$TPÒ8Ë.ÌM”!„ ‚nE»ðÊË ¾Nò É¿²SÒ)Hù„ÒoóÒ*Ñ(m0KÖ8„ʵWGóÉ·+gþýë´®Êõµ§û’?ã0$ ­œÈlöB·à‚1/A¤“F¯½®ûB%i­ÊÓ¶öD÷Xv!¶Q)³ül?(×Rª&=¥Q@g]ÔPYë¸? \ÐÁÑl3j'&;­Êæ¤)u S§¨Ô·Ž}ÕJ[aõ]s?N _P¡êÚ_‹"οiÙ²r &²ÉƶÚTâÝ¢ÄV_—{R9;ƒR60ÅšÕ9çz3N)®ó±±‘ô“4B­|w×Ó&°Z`ÝU­¦vå·Ù[‡“tª–wFY߇­êÏBFAªMÔ¨’­Ù¥r® ßÔØ ŽKn°ÖZ­†2I½k=³µ4ƒÖuR²þC¶´ÁdÅþ8O·r­ÈÛ>¯Ð\]C.©“­Rz¿ÖÉo¹ôrš\ì Ì|h’•¬rd®$ðsÅ×\£%pµœKƒð]*³:tÛÐFw™òÓ là›«Õ{s·Ê@ÑÔ7õÚø2®°ï÷Æflw‡€ ´')ßÇ>ßK›ÏÚy­•¼VäÒ/ ÐZƒu{uŠ]èÛn¿2øM nB•‹ Ò ÚíìVëÒ\Ue7¨èMZ¢ÁÜüþS– †0W›"¶–Ï\¯hmIU(çE±+i${B±U c©Zê<‘À%Q¨PØÆBFÁ«ªáämØLRõ*úægÔ»þé¤d ™”e/ WxÕ•Ÿl‡*C§ y åBºyòî¶À?xÏ‚—àBBD¹&? Y®Pðˆ0¨aWõØN~H˜¥–5ñÂö>²‘É`ÕËÖtu0]I-4[ðNó³\Që2*a‚Òœ2XL/#@uää#Ë•!%ÒÐÏG´ ¤dhÀG>‚,,°˜&iSGcY ‰ã³#ñm½)ËÔ"V½7vª \›n´²¨Ü)o ¾Dh–·4£ uÄËÓ¢VÈà|(B>`‹ŽE ¾@¸°†¤@3 23OGö{b+å&1`µ1JÆË&þXn2¬ˆ8âœð°ù;G.SB Šb š‹J¥opùœw 0ØCJ¶S†Íìà1¤P`]pÇø¼Iȶ¸…0ESgj“:WšG g™<g²xg:GÍm’˜¤aÜʤ.¯Ågiƒ*#±ÊEçáK:tHüA ‰Bl\p3 (ã$)Ñ‚¾—Ü’I«£«²61î ?>‘×äÚµ,lÚÚUaˇA`Ðf äGÇ¢ÂF*Å9):D/Fr*«!”y+~ „N“ÈB€BeF¦mY"•"·L*ÆfK¶õWè'/}‘PÎ*] þè œÔi5 ýQQž*Ê1o£dg9É:½¬ÔAhQ€cé)Ãzî° ZÆ'ùÈG'ŽÅ……˜÷ƒÐeÛfÆ«‘¦x£Tê“£µm¡ü9[»&K>¶„››#‹˜Ä6Ù…XÔu&•‚^zè"ñmhœÒŽŽ|ËI’Ý oetis©ªJ …bY"Ï€æÛÚxxp»Lkh£œª«¹<ƒRpÜXf†P YZó¸Ù‘l;ê;ʆ"t»‘´Š¿S d:(®É†lrËàÂ’¶ÈƇHUdŠ‘ZÕ÷U—lÂ!l—úJ2ž\eÝËAç®í íp°ºœ¯°þI¿Í¹ŒLî»ênpuÆÒ$šx¢¢by‹â£&¯KàDsBÒˆ&Én¹‚Ü¢cì^‰NìÐÉɉÙÚL˜ÃDª«að FÌbm™ô’TíJÍH½ª’dZ3 —:¢4ÑšOرJ_©ªÁe ͦ¬„&!Š(Gëý¦ÀŸE_Ð ap”sZ¡÷RçÍžU¡¹›w-›¹ªEeæDn±RšÐ—ǼbLðº"Uº>&6¢².-B¥uX}ô™5F“"Π;²žØÛÍŽÕÌŽñAÅJÂÌrd¡ À“w±ÖGBåí–¨Áå¤,õ¶#ö»çYÐÂÉ㣃·Èö¶ü9ó’þ^¤§øKnTh âúöË¥¼qó*\ çùœ,°æAî\–/м9þ- ö½?ñ˳°—™¶þ­Fþ“ìU(P%T“jsjÍÇ,„«ðT­ï*¥²¶ê¡X#Ÿí$ÜÎ xˆE’î ¨€€ç÷tÌ‘ÄM¸¦…ßÐéŽ÷Î$'®.€x¯6 $Ú€ ~ÌІmÛôïvPP:„XÌHÐOó` jw˜$Ú¯¡bìóˆËpæåQlS fêÌLzÜæ¾™2ÐáÄ BvìËjFþäÍdç@ÆÓŒÎ•üÂÙúl¿ìæ‘$ïÏî˹ S81ÿ(Qb&j”Êt2)ßîQ†FãDë[È/Âgpî1xBР¸ç¢«HCÀ8 €4ëóüNÛhZ¿ˆ‡î8,‹n±©›l¦èì褡£&•øCˆ’º²uòò/Gæ&‡¬9±6ú± ¤…'½f÷.‘…eÆÎ-c]¸eã0æVrcbþû2ÍìpFùTŽ~襷M]‹÷­‚ô³N|37*œ„çs¾êZ.@ÿŒ¤®D8g캠Ã8»Ñ© ÓdBÖ0›¼0#ñ‡k˜2z´ê·†Ù<…«ÏWó›´a®'”Rî(@¸ï3„­÷MÞ>KÉħ³I0¹’€fÔÀîúödÌdåVÃURÊŽ…rð3ࢉÌpÝ$6˜ÇCrÃ,ßf¿^ V0oejXÅXvƒÿT Õ‚ÂbEk"SŒ¾ì: 4í"ò7•SlnèQ¤0ûXQWÜìÓ Ròðw 2fžT |J„J” 5uŒ”H.°Wvþ®"CJr`î˜ÇH˜nÀ„íÞ4xåÁ 4Ê Ø<æºhí,‚<ßD†z>Ê”*ÏCþ45:*Ì »Îq˜ ËèqCal­BødŸe{Ú˜RQmŒj¬-õbç‡:ox>ŠQ.d‘Dih ÉRÖ õÙZðöæÓ¨Ô‹g˜00TóT¿„+ŽE16²ñ[¸Ñ sÑVDåO²¤ŒÒð4ƒÀ)…6‹²XHIõè“ ’< *ë¤ Ù”•©6L$ó²u¥¸XK&ônúÓ+¶™” Œì‹³e€– VÀIˆX³ßma™TZ^¥Ç~óCÃÉ+Rr þ ÒŽÔ®#ïB±©>Iê°$ªšQU祸ÚR詪CŠR±Hšðî‘ÆÇ9©kR¶š4Ö ·íuêˆ=Í0ò¤;%È’±ªV.¯G~ØpYÊÖ”ö“ð+gìmóÇ&°ªÂmÈÆÐ„Å?4d8Qà9V²B PdVAÆV²ºUŸçsÞ‡ëvµ°¯ìG±¶öš*Â42ŸK'ÍCÉâ\Ÿ$¯h-l\xÔ™”õŠÑæ²AK6ÑH»6î…@¥Ô?°T5©Âs^﹞4ìrˆ“£JP&/Å+úQ4–¥Ûu½nöKOðŠ ÇH>&¬>m=ÛsÙ†ë%w˾<Ã*ùëqF0`Ël€<çuK“õÄÏ%3ú–°3x³Ð$Y Qh}­ÊÐV˜Þ*´\„MkÜø‘¦5@êv‘ìäW©`òÉÞM/{õ½V« eu†j£ kbz$þ‡8díÕR*3æ ñ¯Pö®;½5 Y,è~ìezÃ|JéÏÄüÐwäI³”ÅóH µ<¡GæJÐå~‹ÓóURÔ YÈb†åóv–Ôáíà4+U1´7ýã…lGÛoqóÚvçR®z&a3±Å¬m[i*—MDÙHg= XL-Pg†\½ y¤v-÷„Û:íàœ1m–uô¥’XÃSìÒbÁZ­ÿÌ49êØŽ>kvp1ïž%àøZüó s`úàeÖÎÈCó«nG¹‘UÍiˆÐÄH¢róÝFEÔ“GcäÇS­Hm¨zrqú+i ; Ï¡efþ»„u¸Mð²Ìñ„•i[‰©XÚ– &L'”çh=wè$R suCY Eg2zvåTpA¤5£ñ¿tõ}Øôܘ©¡%ùj–v¢$a´>Ó 6Œtfo•Ü:… Ny6‡hƒG91Tdåq¬*mšÍ7SYÜvs'‘#$}—CV3' :Uì­Ajj7›YkRC™µéšV†çúúSCèê:ÊF½2”³ýÌñ„ØötU)ä_4óÂànó^dîÌx×¼èbõÐhЃǺe³{˜Z÷v}‹Yz¤ªyê®n…ðŽÖ,Žo´nÅð©ÅwŽr¸Šk± 2Ëþ™±-`l–znt§•zþ¸‰[–¡7qX³uéeövBÇäÕ<˜4yój1¬ú”Ð,¡†ÚƒoûÑØ¨ÃzA#G ·6vÕð7Á˜Ò0§Åò´zi”9GQ;Å©{±‹¼ÍE·ó0ºx”‹íÑl‡l₪öˆ’¡6j¿]qy$ÑiÜ ùFÜ2ˆ«&)fË7VŒ{XI:sŠÓiÌró¯»5Ÿ­GV.Ž]?X>Ÿ¤¡¼ì?~np¡—µÕ²ŠRÜ‹CÄ+Lˆ›K•Çkº ëÍ=‹‹Œ¨³“'_І4qòxsN)’ËN5†ìÓ@)ïŒ#å˜[ˆÛê‘'ñXþ nÎÓQ!0*wûb¸ T·ø÷UO _œY¦Ÿò$`ÝiÇûŠ;¢æAIT,-ÁŠ­bÄÔÎäd`éqÂúvÈ€«á¸ 7¥(ùDþN°¢Sáëjkì'›WÆîØøÆ¸(õ,iœ™ü•êzéfÆEõt LÌ·2sËd©­\))Ó¾wì×R´O¤û®µv¶ƒlb¡7@œÃ—ÓÏ_È9‰-X½K«›ˆhS")°xÝA#p¥s¹šSBµë QÞ+·¡Š=âÑ ±$,¥EK ¼e„mö÷}– áœêç²m;ƒÎD3,A×|íS¤þÇ77ç$¦Y0Xk;¦iC¶â¸×ãž%¥û\2gE}9 †©EzŽø6¬–ŸYF—DRÞS¹pHöÇE1qc&)5=7sG#WÎ)ùÊß(-ƒôÎ+š¬aûŠÂU2+Pá\Yö£ÀÍ£Qª×¥püE§’‚( ÖŒVÞe• žy¸*nV¶#§²%˜Wl—­Vj¦½=4T{ÏÊÔÓL—6k©Œ’&tj®rÖÙã´$ÍÅâlBÎz]q&å…Àn¸U‰e%9-fhu”ßZ)ªÛ™sÊÉßÀîªÀ;Ùíc–BÖmxý0}™.Ö¤œ(¶ #ÁÕ’„¨¯X‰ž°4ãaZpÂE¨—*S„ëQË.çQ^¾Ýèjm¥¨Vµ,ÉÖ‡ÐÜÐ@è>¤n©Ì­¬“ú¶jµÚISá”À^8þ¬¶ÔùRÑZÛìpuuíž½bM—F,ã㬩¦Š)Ñ}‰]Ž/»µž©@1 ¶‘ŒõD£D‘ÂtêkP6eáw£Æ!W(eÌ"œi½ï‚HöI±³sëÓ®²˜Ö§#dX#Œãåë­hÙ×.YŠVžÞìÔ>¹kR^ì!WžolŸuÑG·§õa²ëf¶Ÿ2“=qtOÏ—©ÏÿžÄÀØox‘ 4pÏj ¬tª¹b,¯¾Buõ•&V¨Z’–}mW_9¢G«ßeг‡I-25È1ù²ÛÏØÃ3ÇøçA“cÏo(Ç-‚ùᙚF/§@CUb\½˜Sþ(=á/`¸)Žâ✻ìå5 „ àˆT¹äå„ô‰ž—n³½›‘3g‚œ|ºGC±tl8BÔ?žâ»ö™&K(”ŸÁNr5õ'0È{U„ ä?›p)Š|[rp¤® ©Ð&E"aÂd¶)ç Ð…©«ÈôgM-^Í…²¢båœóÙû6DÅΉtóªn'¡P2‘#šl„Ÿ2ÙÆn9»àÐnÃÀ‚ÉŒR¸2”ÆÓ¨Ì;Kœ ñÐã&œñÅVتbejhF@Ùå„ósÒ޶ŸZÞðEC˜ËÈ­7Ò .½¤Ž¹øbp‰bUþ¬Æ¡h%‚«Ö4—¦´þÝÈ®tГ_sîs¹BpÀÌlÂÅ?–ÄŠy*j^¶—EÓÅ¥!éIUvØV7Ìjn Ûâ~U¥;6N8Òë æ2r¿ý,o[Ûâ-‘ýŒÓ_®)u앦T*Ô<É`í4ö£®îqî$àž¨Éº¶p…ŽíCjâ"((’i#L"gœä4Ã7–nE´‚éyY:.Ï…kû_!š€nì•àú¨6‚ÅT! %•ªr•ßq†M ›˜2ÏwUn©„úéSÅz­lÞH…!ˆä¼d"2ÒÌNKU'Ó&ÙʰyÎ%”lªª¨€Šç}qÙÞZ'‘´€ÄñV'V“tþº|-kfèÓ´õ²„®±ÓªÖéÎýô°Œ‰…S¸Ú ˆ,”Ūx€w¼!V\ˆ¬[Òø2—·þQ¯‹£ùêÉ×ŸŽ¯z¾¹ƒL©K­ñ@–‰jÅåªà¬ìGpÚ‘4Bf¡:’f YƒMgA·ÉI!p%“Ú¶ÊjدAè^m)•ÅÈØW!R§‰½µü’c¾ìÅäLO‹arE‹½¬Tƒ¢ìàk_ª­Ï± \´5Éwæ©YæL:æÕVsÔʸåÒ9ûkÐÄ(æK=}s7ÕM-p:?+®ëe‡Ù3µX;FÅQ«a7Ÿ6ou¶^´äkÖ+ ‡ñ0†5©ohquáÅþèZ›tÑï H7AʳSŒØ$‚ÇwW’‚ã„wžkZ”÷±}ë„÷;á¹cøÀãýï‡Ç{Ò ÏøÇçýènGzáñnø¨G~òh?ºå±®öÄ+ód‡ñµeÜ(­ôªë”o¼ØÕNt²w~öt¯¼ÓÕNûÎ_ýíþŽ—ýíq?ú×û¾öd/=Ýoü¦·žøz½Þov…ØdV'=ïyŸö¿¿>ív—»êµŽ}Ø}û‹?¾í×záßôÕ»Û׌ÂcŸýáÏýÖãoô¨hwƒ„|ñ€¤×{¸zF·zÐ×y8xkÇzäWu¼gx€gw^'w•Wy È€ôW|È~¯×}½·w½C}‘‡èGw·{‘u­7xŒ× ˆ‚L‡.h}˜u%˜~˜gwK×=¸ƒ°y)¨ƒsç8y1x2US`‹3XEX“g„k7SH…Uh…Wˆ…Y¨…[È…]è…_†a(†VÈxñ}xGís„þ2y øvƒà ÿpr(‡q8‡wh‡xX‡th‡y؇{Ø Fˆ|¸‡…¨‡…‡8ˆwȈ؈‡è‡†‰ˆ(‰”øˆw8R‚u>wz±†5¿~ÆGƒf7ÿàpM²f<†ñp©Èб˜Š—ŠRÊ´øŠ¹(‹×º¸‹·øp¿8‹<ç‹Ãx‹ACŒÀ˜ŒÒ‰“w‚˜e°M²w|þG‚íwŠ5—ŒåÁsÜxjcŽå¡*žäpâÈ‹7—ÙASèxOmÑŽ?ÑŽÚhŽæ¸*ñÜhŽ0–çF(NcJá; 8w£hÙRí%cRa]¶H]ߣlfþ‘ÙQëX‘©‘Ô5&9‘¹‘!¹Ž9‘epŠN8„«w€‡öLÓØvCXŠ¢øÙ¨*™%Éí¨ %‘¡VŽ·æ“¡V“BY=)_v”%ÒŒ8Šÿ´„Ò PÈgtwðykg„ˆsŠCÂg7AYaíU,&f]ÄãI.ä•< –fy'ìD”C‰0q’O8„Í$¾3àðà/ ZàÐÞW}¦A“¡¶"ûƒ˜kÉgÔ…”‰ÙC&_Œ &¥\o)dQ‘‹9I˜ K9„@8˜¦]ŒC0Ц)¨‰’~gtÙ8–Z´bi™è¸cž5›MU’#Ò<û¢‘ñþÁ˜Éb^§Ã–•I$;p’Ôø™E×ZVò—[˜¥)wšÐ >€9 &@OÀt3ù=´\ –#ùšÅt;õÑ-‘i\Ð…=— Ôt›=t-EVa¿¹–°á™S—vy·Aór%ðéPóÐ ¨ MašPÿÀ µ PàçšIù 1ZDr²òY1œåÉ“%äU1ÁJ‘¡ÄY)à')Ò–Ô—KW‚P˜OIJÿðœòœ9*`pmpTi£œW˜q…\Ä4kc+ÉR?ëÙaÈ(gA…;EbÙ&–7²DYa$±I~f€1Mâ‘ <˜šþЦ¤ S§š€‡æÕ?ÌÁ^JƒfÓ’\Š≧ðU=/ÃÑvT >ô^G /JÎz— Ðù,  pHPmМNñˆžÊd¨SVÄäHÿáf$J™¥zgÈ“PfG©?ë¹'½ôkÓ@î虣BÈ’v4~-X~nú­Xjù™Y‚&-ÄV–aÅH:Æ\ìä6¼±0žUF!•Hfßè›Ç€ÿ}ÎTÁ2€=X„kuI7²)-+[Ôféä*šÓž7dp¡‘ð±¢ÁäL•tÓh á™ÔÈ”Ÿqzд!Öˆ’›÷y­ÉþDæ›Ôð£T‰„6ÖNëqaÇ£kÔ*±”2)£"<Þ%OsY#J™ˆêŒ (}®•8h® ~€×©S,Z«Sƒ³bóºl¸±2|¢[͵7ûA*iy/QºV”Á™ ±”%£1ùsA7—ȃþ÷NA“3³•=e[ã£TCóÃ/6!hS-âÔHÕAPyj™¶Bëò]Éxèg€S÷²%óƒ¹yý „c(¸ƒK¸…k¸‡Ë…;—,…mø{¡i³"‡@xDG„—khtH‡ Y¹™K¹š º¡+ºÛ¹†fº–[¹¢‹¹©[¹ãAºªKº—k¹²›ºŸ»¹¯{»§þK»r؃«‡vyÛ#3}‰g9x†¤Èƒˆ‚sY®’g˜¼fj¦’—œÒ»¼Ð+½§¼¢g½Ýë½Óˆ±·µ½ç;Wµ]Ψ{€w•3‹¼¦Qu_Ç»hw[‹µ‡§| {}Oø¾œ8~³æ¾ò u¼+{ûëºü¾^¿åZ»‡y{Ëp,è¸ì{·âˬ™|ë×z雽ËgÀ'xзu1šDX~ÇK³'¬‰5ˆûׄÀ[•й3Üý'³ û¼É§Ã98-k‚Šú}wgyQ¨+ywhƒRà „V…h&¨xèÊ”›èƒMì¥Ç ÁZK¼ÏXÃM¾ <ÁÉù’þh¼ÿ˜}LÃÈK—‹"^ÆoýÆoö¶noŒpÇ7ÇÿFÇé¶Ç}ünwŒpy,Ço|ÇqüLJ¬oÒ°;uI}£±Ž½ Iù‘±xÛ¡)€‹Á‹À8ÖªœŒ¹1(ÖiŒhm“ùŠÖ·˜Ø×Ör½ŒyýoÖ°×Qײw×=Œs‹eØâOë£8|[/a—(m€èÌ)œw)Œ8@è H~‘ÝÜZÙÁ\!)ÌËK„ÔèÙÎ Ìfç|I˜Ù³Ö~’ËÚ› ~žþ]ÍkHÚÖì(‰(Ä;‚õÕŠìbM:\~º÷Λ]ufÙÍ›µžÇΔýž°ÖÄGÜ£·€øl®–'w0HÝØÜÁÛÝ‚› J+ÅØºDº3ÜÌô·è‹Û°-ŠÝqÚd·TS¿ðÇÚ#l‚LIÛy—ìݾ6솀{Ãl÷ß_àÚ烘g°[ØÀÓLû7[!ÜÐܾj~V ÐÈÿ x©ÍÍ=HÂôëeû€’¾ë+Ï'„a¬¨›'õu×]Šýù€s9ãõjlüÕ/Ö ‘MÅ@ÌÝjü«æ}Åÿ Ö%<ÑØMƒ mÚÿ¸ìýÞE7ƒñ ßPÜ!õÍÜìMþùŒœ[Ît„D.,t®ÖÞò§ÄZœßPLYKݵíOV©¸Ë ßìÜþ—áí†ÇG•Ï÷’&ç­wÝdw€ØàSݧqá/k%IÇ<8åoG `÷å_¬ZÀ©æMxSÞ ¬#}ÆùWßœºälðâ°mv¦9äÕ¹ž~vÍ݉x©—ðX·©5ÜÅ žË)=}\·UÞª‡€NÄDˆ8~ é‹^t×½’¦ƒÜ±Äi‡š€âxÙËÍ!eÊ ¦YÒNx£k¨¨»-çÝ×í˜u¨u3>,®e¼*,nBÎ!'€¡I|`¥y_þ×™¥y"À Ý~‰Ýåm'êÐð/4ðùà Jü AàùŸ€H¾‰“ïÏi Z€Oðgj "• üÀP"OòøÀàb.¾KîâgÊtrððr€gªòŸ€ Næÿ9}¸übR°çR ë@\ðZ' ¥ùf ›à µ  *@œN <Ââþ·[_t÷Òî‡À!° ð d¦y7è!.ÜX‡—P @‚OønŸšeö€YuZ@”0?ø…oyƒnuáÞu ôéðÀ‹p ÍYš‘«Üúþ>VÜÒÄt0oh€/`¿p—†fš9Ê£?ú稩ùeŠùXáÕÎÒŒDeªùÿ"@&°£=ú£™ú¨8hëÕ¾õD'ë\ן>ú—Àÿú×Ð)Àé0ž1üæøœuy?€7ª•þ çÏôŒ·ã ¤¬$è A;’"…‚'i¥¤ˆØ°F xÉP%…µ(| IJD=J±Àƒ€¥xÚ‡RfŠÿ¢ü8Ò¡–ÿ´É `R`Ì‘GUÚ¤¹S&Š6ªäçaœÑ§$ky¤ ¥£)”pè”Ò¨Y¤ c6•UJ3‰ÿ`Êlvi†ž˜þ*—J‰93ÅNˆ; ®9˜°  £žv8ü—¢ÌND<R@ÄInxsF&ù‡Â3$éîLm@Š=•LNñtò¾Ç eÊM™Òa…|Z9|F/ßhŸYÄQËØÓ_¾“¥À>:{5r›>#É׆/Ìå’ÒЫT¦%||TÈøÌÇo™³ËFÚ8vó‘äû ‡ƒ‚“8Á‡+Ïx<ñû‚)lA¬"¨*‚+£Ù’RK¥ô’; > jª8ÜJkB×\sêÃ=ôo6‡pJÏ©´úâk§½vʈAb°/²úKA'›Lì EqtŠ=夤5sè°Â¤9¤ ÀÞsìÇädþš«¶ä6Œ²9×þYÏCQ ¥f:Ü1L)HË¿|2L,m2óDÓR” D‰ø“ Í:wÚG¿|ò›ŸöÖþí£¯¾|µÜ• ÉD»v1/ß´¿X Uý©öÐÝsñTÛ¨6W,B,(ûƒœúg¿F }“º_ÿT§¿û=@‡J°²4¤Q-„< aÑFx4£ýÌ„$L! «æ³œ±Pj' ™–4¾0†2<^¯.w(–¡ ;ƆXD$шD¢¥ñ‡$J£‰Q¢•xE%щSœ"w`E*~QŠb¬bØE3fQRÔ"јÅ"‚ŒoLbÌÈF+¶q‰aÌ£µˆ5DfQ3]Á`”»§˜.x8²UìRG»¸ì®XÌ·èô¡Ô….‘+ê]$ ¹IH‚Ò‘þ‰Ä$·ÒBƒÄ $ВЍu=Wvj|á;V”lÉÊë‘U¯¬¥¾xiËìIk}¹_žº…%ë —OIב8¿y2SVšf«j…–JN³B’ZUƒ.ö*WI_ž ’É)ˆas›Â&;9$AV¦(_B—MÈÒM›ÀOÒ8 ô´%-€Z{ÿ¤SºšÙ&ìÑS* :h²ÌÉÊSEJq½T(† *Lˆ6s[Ï“ò¶ö«_¡r0‡©HG ÒàR¥$=)KIjR“¦´¥+-iK]*S–Âô¥;Í)OQJS Úô¦"©K‹SþÔ‡û\RÖ\ÚT”Êô¨Q L¡º$‚dÕ©‡½¹jH«*T®Õ©ZÕiL¡JÔ­Žô¬8¥êMŸêU­Ú”¬¿êªH±jÕ·Æ+~ ÅjWǺÕ%ݵ©¥+[[:ØÒ°aýë]ÕÊׯÖ¤}Å)aS Õ“Z± ),g9ûU’j6­~µ+J‹×Á,©0oèÅ\ûÚ×¶¶³¥mmmÛÛºV¶¹Å-o}{Ûü6·»®p‰û†àW¹°%îqèFWºÓ¥nu­{]ìfW»Ûånw½û]ð†W¼Ù ;PKcK“È–]$&$&5Pictures/10000000000000DC000000EB2D485DFD9111EC9B.png‰PNG  IHDRÜëGoÃsBITÛáOàtEXtSoftwaregnome-screenshotï¿> IDATxœíw\ÉûÇ' Eƒ: „„¦*ÅBNÅzâù ê儯Ø‚åà°žφ rž•¢"",´EQ³ 'MéŠHB2¿?V—’’…Ìû^¯Íìì<ϳûavv³Ï©²â=y¨T%À§OõYèü=@(HH”¢A–¶„àö­X/Eõ” Ó7Á@¢DtúF$Já×®%'IÑ„Œã6j ¾,Ç»bÂä©î âÎîÕ«÷ǰ¯r|«;Ý%âøE `±;ß]è ‡€žBØù~ 8!ÊûÙ™öCG°Ù¬Žm–°víD€(Áwê)¥Õ£Ž¿«!`L ÅÃÃÓsç®]âÔlS³ˆøvÅE|¾G›Ý1Dùõ3Õ{U©U©—ªš:ƒi6sÖ¬ôŒ |­›››¹¹9ä©/ìÃ×,ÖfËÏýœâ´&þ‡Ï. ¸¤dæ¬YºzôÞÊ4SÓgæÌʪª6ÅÒëè#z_áˆSÂqãÆ†„„°Ùìâââӧϸ»ÿ¸{÷®9sæ¾­ü6›-///¢Ù{÷îa Û·oùòå¾}û°¯¦¦&-[k?¼mNš4YQQñèÑ£úúôââ’¤¤¤?ªªª ‹¥}v±OÇGÔítKèëî(++›š˜X˜›ÿèî~øÐÁÿ®Zµºª²@8vì¸Ý»wc5]\\BCB§L™¢«£»cûž`óîë×V–ØGC]]IIi€•eú½{³fÎ졨ˆU`³Xúúqâ°–ƒ7O˜0‘Á`ZZZ%&$`ušØìÁMLLÕÔÔœœ2ÒÓù¶°[^VöøñãM¡¡în#¦¦®.ο‡Óõôøb©®ªšþót MKK«ø¸x]Ý7n`žlݲõçi?Óéú óÂù Xý˜˜{{55u:]ñ¢Å Ÿ>ñXÿbúÔ©S ¤ÑTôôè>3|¸*ãŸVEùÍ©ÞsÿâÅ‹êëëoܼ !âkþüsñâÅoßþ·xñ"#AC ˆ•ÿôÓ”7ÿý—_¹’ÌårÇŒUùóàÁÕ«Væ?{º{×ÎÙs|Ÿ=ˇ®Z½úÖ­['c¢>È™0~¤I“ËË߉¶«¬¬Ü³gÏ”kךššZÔlŽeÁÂE¥¥¥7oÞ8ý÷ß<ø©¡|uöσÞ¼.Úâçï_SS!¤É¿ý¶õQîÃSý•óàAhè&¾6KËÊüüüW­ZùìÙÓÔk)îîîv…lÓQ€ý5£®®®®®þúõk!Ïq„€É“'9Ž!ìÙ³§@“\ù¢I¨¢¢â1fLlì_Xyì_±S&O–——Ç6ž0aü!C „......ÇO¯­­=rähddäàÁƒõôô–0ÍÌDÛUTTܽkסC‡úMœ4yûöí¥¥¥¸'X,ïßW\ºtiûömæffL&ã÷ð06›7çííy2eÊyyùœœ¡···“££ŽŽŽƒƒý†õëùÚ¬ªª"‘Hîîî}´µMLLfÌø?QÇG&áS €1%›Íþr8¹Ëåâ_ñcÌåpÙl6B.‡ƒ­…öïߟ¯¦°fq¸\.äB¬|Ú4ï mÞ¼éãÇÉÉWð–™L&¾­“ùèñ£¼'OØlöà!Cx[st!ÐÞÂÉ“'3ú^zzNNΙ³ç¶ïØ™˜oee…Ç’ŸÿŒD"™™™a[™˜˜ôèÑ£©‰ƒISŸNÇ[SVV®ªªf³Ù™YY!!¡=jhhôìÙ«ƒ·idhhog÷ƒµ»››““Óøñ^T*UÄŽB´vúþ¶ƒ{ÿþ}UU®‡­„øé …"úÿ@ÐŠæžØÙÙY^^>ùêÕó.ÐéôAƒlðm›û*Yl6€€Ëá^½ªxÿÿ¬Z¹R»={öéêº|Ù²ë©×ôôôöíl _#Ø oÊ!÷Ó§O?ÿ<ÝÕÅ%÷áƒ÷ïÊããâ¸\.O!$‘HçÏŸ;zôH_¾;vîttrþðჰ}%›ð)°•«oì€à«öï¤R©ŽŽŽðËÉo‘¿¦Èf››ÇËÉd²÷Ô©§ÿ>]^^>Íׇۛ²ÿÁ¿Þ¿ßÚúSSS99¹k×R½¼Æ‰°(Ô.˜E:^WWË‹±±1„ðÑ£Ç<{öìóçÏ_Æ”ü1BÁ‹/jkk-Z¨¨¨xúô)ÅæýC"‘F >bøðeAA&¦Œ¬¬,—V=—YDŠ‚ºººÿý·©©©¸¤äüù çÎÛñ;FƒØˆ?H§;B˵Xxù´iÞNÎ.çàÁ?y}H»}ûĉh÷ÝÏŸ;ÿÏ?ÿDü®¬¬y:ú‡ 1›­®®Ž‹‹ÿð¡ÎÓï&lm´Ú»-yðàá‡uïÞ¿_»vÝðáõ´´PÇÖ™E”vöòòòaaaØmÎo6lm´Ú»-ihhX½zÍë7ozôèáèèöÛV¤ÈN†(¢ÌöT`µ‹‰ ít©­ÛÚÛÛݾ֞í¤3DihÔ¿¼¬´cÛ$²]D;A9:Ârt„ƒ_”§c£¥âÃ/Ê©Ó}¤âB–áë јA8(„‰A8(„ƒ¸¢ôöö>pà€´½@HVDéëëØ9®ðáììÌ`0:¼Ù²²² XXXèëë2Äßß¿ººZD¹¯¯¯î·ìÝ»·Ã½Bð"èµ-Ä`Á‚Ë…å•‹‰‚‚ÂÞ½{õôôJKK¯]»V__¯ªª*¬àîî¾|ùr¼ôÛw§²â=öùûä‰ÆÏŸù’'æÌ™ "»B2._¾|8qâÄ®]»lllôôô.\hjjzåÊ•VíöèÑ#<<üøñãVVV3fÌØ³gOyy¹ˆrŒ3gÎðŽ)oß¾ÝQû!©]}ÛÙÙeeeUTT”••Íž=;//¯±±133ÓÎÎN`ýþýûãË………MMMNNN¸Pîß¿_V&VÇ”)SrrröîÝkccïää”——'¢àîî~•›vG…ÔDikk›‘‘‘••ecc£¢¢bbb’“““••ekk+°¾œ\ó5—ËóÀ{-"*•êêêºtéÒäädƒŠ.WQQ±àAI MŸø}‘fOùâÅ‹¤¤${{{ìkllleeåoß{!,ïûÆíôB¡Ðéôºº:1˃Ôn Ñéô¾}ûÆÇÇÿý÷ß[[Û ˜™™õîÝ»Õmi4Ú¬Y³Ö®]K&“­­­+++“’’<<<,,ä}óR]]íçç7uêT ‰”ššzãÆ-[¶+Ƕª©©yòä ÞˆššZß¾}Û:¢¤yŸÒÎÎîÒ¥KØÍÖÖ–ÃáP¶$88X]]=44ËûvppÐÐÐhu+%%%++«ÈÈÈW¯^q¹\##£àà`‹%°Û*%%%%%odÆŒááám!.ò¾¥ëB9Í›÷MÜß¾2 %‚p Q"%‚p Q"%‚p Q"%‚p Q"%‚p Q"qEÙ™)¶¼¶ÆŽÕ9v‘¹[ñ‘¹[ñ‘Îé;)) ÂüìÙ³ººº×¯_p¹\&“‰e6òRÃÃÃgΜÉd2±ùÁ›ššÂÂÂlllúõëçéé™-¦é¦¦¦ˆˆˆ!C† 6,))IDåððp;;»×¯_K)B¤ÓSâ)¶zzzxŠ­«««èÛ#GŽœ8qâÓ§O€>|XKK+!!ÁÇÇçöíÛššš­šÞ¸qcrrrxx8“É,**b±XÂj†„„$''Ÿ?^WW·=Á"ÚŠtD‰§ØN™2K±ÅnÚ”b›ššŠ¥8.\¸ðÊ•+W®\ÁŸF]]]tttTT”««+@GGG`5áš5kîÞ½{áÂô>ŒÎGjcJ,ÅÖÙÙK±Ý³g)¶¼FŒѪт‚‚¦¦¦¡C‡Š®¶oß>2™œ””$NŠ¢Ã‘ÅÛV±³³«­­m¶$B2d+ÅÛ0==]tµ!C†:thõêÕ/^l« Dû‘š(ñ[ì|mkkßÖÛË—/—––æååEDDðfÁŠØpúôé+W®¼~ýziiéÝ»w…)ÛÉÉiïÞ½©©©m ÑNd+ÅJ£Ñ‚‚‚ªªªètúºuë„Õ=ztDD„ŸŸßñãDZk,Dç€RlÒ¥Ø"ˆ%‚p Q"%‚p Q"%‚p Q"%‚p Q"%‚p Q"qEÙ9)¶L&›¬ièСt:}РAßÛ"Æœ9sôõõuuuÑ-A)¶ÍìÝ»÷þýûØrJJÊÏ?ÿlnn®««[ZZÊ[-88˜w²eË–‰hóÀƒ 222š6moZTTTZZÚ÷ˆ¢€RlóéÓ';;;77· 6´\ëêêºjÕ*l›éV gÏžˆˆøã?LMMûí·Y³f¥¦¦R(”ïåtwAæRl?|øðË/¿988\ºtIXµñãÇbOÅ·„w2aÙg€#GŽøøøxzzš˜˜lÛ¶íÕ«W¨wٚŰlÙ²¢¢¢‹/FEE>|¸¡¡AÿSRRLLL¸téÒšš¼üСCL&[f±XOžxð@s²†lÍb[UUuùòå-[¶˜››3™Ì¦¦¦¶:ooo¿k×®¸¸¸-[¶¤§§Ïž=_¥­­ýÃ?`ËÕÕÕ‡7]SS³¢¢¢­ædÙJ±}þü9„¬¬$žŽ3[°°°Ð××3fÌãÇ­¬¬^^^^^^Â6$‘Hmµ%›HM”¶¶¶üñGËÛiÓ¦ ¬/0ÅV‚ eÉd2~©A"‘ÚyÙaii (--ÅDÉ‹ªª*…BáT¼{÷®Ón9uid+ŶÿþÂ/^`_ß¼yóùóç¶6ÂËãÇ}úôi¹JAAÁÂÂOç­®®.,,8\Fð![)¶jjjcÆŒ c±Xl6;,,ŒL¼êêêžÜ™æº¨§D$Já@¢D$Já@¢D$Já@¢D$Já@¢DY%žbûñãGCCC@||ü AƒtuuÛšæ‹RuÛ¬‹çÌ™3¯_¿¾sçNNN`ݺu‹-zúô©¯¯o[›B©ºí„¢d³ÙÒvcÒéÝ»wCCCUUÕˆ#h4šÀ„!ñÁRuƒ‚‚®uuu½ú•¥K— kKÕ MNN¦R©³fÍâp8íñŠàHM”âgÍÖÔÔÌ›7OŠÅO¸’!0ÅÖ××722211ë´°| ggg]]Ý¢¢"qÚæJÕ•iö”bfÍ•••]¾|ùرcÇŽ“,)G`ŠíÑ£Gýüü¼¼¼°õ ·nÝ*..îׯŸ°vþûï¿K—.;v,** ¥êv Ò|tMœ‰i=<<’““/_¾Œ¤M›69Rb‹XŠíùóçÍÍÍ!!!xj¢í$$$˜™™BCCÝÝÝÛÚˆ½½½ƒƒNõêÕ–-[fÏž‡­’ñT]iŠRœ¬Ù/^H$,iÀd2Û1ýT‡¤Øbíˆ}533“`è‰Ru…!MQŠ“5›••Õ±F;6Ŷ£@©º¼âêÏš566†æååa_óóó%¶ÒQ)¶XŸ››‹}}öì‹Å’Ø+€Ru¿…(¢–5«®®>jÔ¨5kÖäçç®_¿^NNNâó—ø)¶â´ƒyUPP°aÃaiŠ(UW”£#,kvûöíAAAZZZëׯøða{b+f;šššëׯÇûr>Pª®$t­Ûׯ_ëè蔕•IÛ~ FZZD©ºÑõRl}ããþºDQJÿB‡Ëå–••jjjIÛDGÒÏШ´´D²éÔ¥/J‡ÃAgín…B‘øò€¢D x%ʉ“&c¯Íå[F ¾+_Déã3S]Cÿ˜™™Fºº2ÍÌZnãá9 ñýh¾ú=jÔêÕ_^./''X¼xQG™ijjBïvBˆIóé[EUÕò+L&9eûû/ÈÌÌܼQ]CÓÄ”àp8›7o±°´ê«£ëæþcfVVóÇQ£·lÝúóôé†FÆ»vï]ž6_è8igg²±²âý¿…€µë֧ݾ}üر¬¬Ìñ^^ÞÞÓð××>|dႯ^¾X¸`àÀŸwlˆîG³(O:…)·ïØ!æöuuuÇŽÛ·wÏàÁƒèzz¿þº˜Éd^ºt [;qâìŽT* ­­^e‹hÁcJmmm1·/(,d³ÙöCy œ±¾™%&N˜0qÂÉEÈÍ¢ÄÆ”mÝ{®çÍë"%%%­SÐÅ ¢ÍHróœB!ã³32 99¹k©©éB¶‘D”º:ºYÙÙååå555*4š¯ïœ•+W^¼x©¤¤äñãÇ¿…… {‘x|BÂToïö9ŒèþHrzýõ×Å¿øù[ H£Ñþ-,ؼi“††Æú JJJÔTU‡ &ìø¥¥¥ÙÙÿ\…@à|ó2©ð¡®nÏ»þ´BWOOºž :–eÿ[±½®¶¶­¢2„‰A8(„ƒ¢¤P((±›Áápx§‰oÒ%™LîÓ§oIñ[i;‚èHŠ^½ìÛWG²¾Fú¢”WP6bøµ”äügOQ~m7€Ãáä?{z*6f”‡«Q’I‚¥K@&SŠŠ^ÜHM-++CºìêP(”>}úººd0Í?}ú·MB”EÅò ò’%¿!ˆ—Ëe³ØŸ%Ûœ(L46~–8D7õLÂD‰ H”ÂD‰ H”ÂÑ|õ}-9IŠ~ d·Qcðåon M˜<µÓA @ܹӽzõ<¹@ó;!S"%‚pˆú™‘D"qšš8Ä3j ‰D"SÈ‘9楄 &âD*j‹Å*).ÎË{T]UÝѾud2™¦Lcš›ëÈËË «FäXºAb"f¤BEÉåp+޿˹ÿ³‹«¡a_äÇb±^¿z™–vSŽB¡ë)$¥„ &âD Dˆ’ÃiÊ}ðÐÕÍÝÐÈBHØS†¼¼|SE^>ýöm-m­žTo!x,Ý 1'R âBBXU]E×7èñëéÑkjkšØlk»D,Ý 1)=¦är¹ ¥Kì999‡Ãî*ñcé!ˆI«‘¢[BÂD‰ ­_Äó|¡®®~úôé‘#G¶i+bÆÒ&¾w?þøãèÑ£—.]ú]­ˆF’žòäÉ“rrr›6mêpo¤Å¤I“|}}¿« GGÇb¿´[&Mš$'''''§¨¨Ø¿ÿM›6uÝ÷;H"Ê'N <8::ºt<[øefÇ2~üø'Oždgg/Z´(444::ºsìv8­ˆ¶àíÛ·iii111•••wîÜÁˇºfÍ~ýú™˜˜ÄÅʼn.g³Ùk×®Õ××§R©öööwïÞÅ뇄„Lž_µÿþ¤¤${{û”””‰'fgg›™™ +_¶lYvvöéÓ§ûöí{úôéqãÆ={öLKK yáÂ…³gÏž:uÊ×××ÍÍF£ùûû?þüîÝ» eÑ¢EŸ>}j«çâÓÒ††__ß#GޏººÖÕÕ¥§§c5ED±ÿþ3gÎÄÇÇ×××+))?¾ÆjMMMׯ_/**²±±iÕCÇ ‡B¡lÛ¶ÍÔÔ´¨¨(000888""”˜˜¸oß>++«çÏŸ³X,цÚLeÅ{ìó÷ÉŸ?ã_K‹ßîÞ±Ãá°¿…Á`ÄÄİÙì»wï*++×ÖÖbå¶¶¶³gÏÆ«yzz +¯¨¨——ÏËËÃËííí÷íÛ‡Õ_²d ^®¢¢råÊ•²²22™|ëÖ-¬033påÊ^ÇvïØöòy!î?ïGX,8^^^3gÎÄié@nn®œœ\yy9ïV¢£˜?>oå¡C‡†‡‡ s CB ‘H ›xóæÍ­z(ðx¹ºº ô3!!ÁÐÐo311QÌ]!N¤|Úk¥§äpššššð¯YYYeeežžl6ËÚúRÜW«IDATóçÏy{{ „ffflö—wǘ››åææ²Ù,å?f³Ù|“Q¸¸8cõ ðúÊÊÊUUUyyyBkë°rKK § ¯&|±ðÂår¹\Öš@†6tèP&“9jÔ(WW—I“&Q©TÑQ˜˜˜ðº!äp8mr¸­!xzznÜ\UU½iÓ¦ÄÄÄÀÀÑ ;^¸ŸééëÖ­ËÍÍÅÎKT*•Ífåææ²ÙìaÆòÆ"Âa¶"J!ïE\LLLmm­††&¾#¢£c~úé'ì+‹ÅÂ+³Xl¿LhÒ²œÃi”——ñMtòµÚ7F¹\„\2™L"‘ðr …ÂåÂ6]`òÅÒb%àYËïàâÅÄ´´´ë×oüþûïáááwïÞ…BþÖé@„@£©0™LÀ‰Ç-,,ccÿ222á¡Àã…ù¸\nCCÃäÉ“~ýõ×S§þRSS»sç΄ ¹\.„\ðå߸ٓÖhÛhõB§yØÛØØxöì¹"ï}%11ñæÍ›%%%B`VV^9;;›Éd+Ç&:IN¾*h yb>˜˜˜@ ±Â¢¢¢††¾q«¡ò6+hä-Ê!‰Drrr ÙxïÞ½·o‹322ÄBH&S ä w #CÐÐИ>}úž={D{(äx}içߟ×ÔÔ¨©©òòž`+°6oß¾ÍÛšCDÚê-¡æ†.]ºÄår§NjfÆÄ>ŽŽ#ÌÍÍccÿ ݼy3**ª´´t÷î?²²²fÌðVN£ÑæÏŸŸP\\œ››»yóæGñí\lßÕÔÔÆ·qcHcc#‹ÅÚ¸q#™LnSœ|±´Ü–çx p ''gÏž½ùù¥¥¥gÏžc³ÙúúúâG!ÔÓÓÍÌÌ*++«ªª’ìPµ%øË/¿<~ü8//O„‡þ蠟§«¨¨˜””!|ñâÅÞ½{0ó4möìYK–\½zµ¸¸øÖ­[)))"wE›#mýô7qòd¬»»;ß3cÇŽýßÿW®$¯X±RKK+*ê(þŸ'°|Ë–-êêkÖ¬)))QSS>|¸††ïÎýêÀöìùcñâÅL¦™ššš¿¿ÿÕ«)bH±´\ ¿QÞe*U)9ùJxxøÇ:dll,~€%K–Ì›7ŸÉ4£Ñh¯^½ßmÉB`0L###;&ÌCÇÿw¢Ñhû÷ï_µjõêÕ«uuõ~ýuÉÚµk±ÕáááÊÊ´E‹WTTlÚ*zW´•æW^KNš0y*žÍÈjl<ý÷©ùþ Y¬Fqrss÷öž:þ|1Ë;œãGŒóò¢©¨¶\ÕÖX¤Eg†ÐiÇE |‘òi¯µû”B1ǪØqËÊÂÊ;‚¸Ñ:0â—´vúâž"ñA”˜åø±– 8Ç¥%bô”âù}5ù ô ‹°r)@ÔcÐ:.—´"J."žîZtƒXºAâ J”d2¹¾þc—x9–* ¢ñcé!ˆI«‘ %‰DRQQ©¨x¯ùõ÷"SYQ¡ªªF& >`]"–n‚˜ˆŽˆ%™B±0 ãî][;{ M-2™ô}¬LMUÔ³y”²Ô œšœ$24TX-J‚½ˆf´îô<3´œt¼²Œ™D&±ÂÄFR\´fTX„ÔmÃây$uR<#%!äâ̤^TZ ìÆd´Òä=ZŒÊ¾©<˜Èbgq”Åß<âôz;ÌÎÌ­åôÌ~4T¬ÎLz¼T–”S"47\:\¬ºÌ4B\4 üöÌlž´¬Úóœv\̆<ä¾t”. &4Äj,ôîüTVW´^$¬z\,nÃLJDÜÊtL2$ŒÖìdfd}¾ã̪t¼Žl\ŠÄ,ôêþUXHp Á‚*LÈp¡Ã†JŒHq¢ÅŠ/jÌÈq£G‚,zÒã  ’'M’Ùƒ¥I”(WÊ„ùReË™5S²ÜI2gÌ›@}ÚäISçL—:JiÑ£=“Å)µiÔ§@æ„ZTiÏ4T¼¹ï!ŒžÄH‹¬eºH›VŒZµ¥ÓfS«(ýšul×°GÏ^ݶõîÚ½oÿÎ-›6qܶuO^œw_ß˃+w.{­\Ú„ÁŠÔÌÖ--p þ{ïxà™-x}ù£ŸüAóõç·ÏÏ¿üþðý÷ž_îÝ }éç[YÖ ôÚ@û€&ZjThá…f¨á†vèᇠ†(âˆ$–hâ‰(Zè—v€˜¥BŠ0Æ(ãŒ4Öhã¦%–ƒ7öèã@¦ÔHT=ÀO @…7ä¤JO.ù€Z:>[Xf©%–Oø…–A_‚Õå—syi XŽi&™gJYX¢‚@b§¢aO$¥ÙCŠ}fXÒ 5ºå¡Bàh¼5"&YD*©¤¯¡ùÀXµ¥¦éhŽJIV›bÕ†áxÖ©aIš$£ª²zéþ4ºŠè–=dz˜mN8é®Yª(¤aV›ÖÆ¢_’ªg…ËfèêH zéŸ}Vû§Ÿj!´‰^ÛÓµÓfKí¸¢ªí¬@*ZeŠf hêR§iÆlj‘ªGïo†ÕÃhy’ú@³{žt¡ªæB«Ò¥€D ë«p‹!J7 ±´I2 åÛÔpÆè9e’õh#órªBH*XŠim“.f)•auéÖ†w b’×BË­ªÜJœèÇü°´€=´ÃËqÏà†ì£ºÑõÕ©¢ïò%м.3ª^¾œZê ‹jq¨gÎ-ÑLÂÚRÛiºäp‡{L±Æ¨&m¡þ´©6­´Ô7Öúé§=ú®­f…Ĉ)RbJWÌs;e\`1¢n#8,ðžàê­°· ÿü1è ;Û9¬BO·ê«_ôÀ÷èn#öÞ*X-¾[¦ƒðú \¾ï ©¥Ÿ²8Wž*[ðÞ°ݼÞúü°ÏQ·®:«ÕZ¬pÑÏ--ß±Ûèø®,§&æœ)§–VH’Ÿrð·»i²„&;êæ­ÆäçÒ}þÜ3´úËRRu“¾¹-i°ÓÇü>Ù†|ÕÁ¾È)ÊIérêÑŒ_ö•£-£ ÚJ”ºšPKµšSje—‰æS"#,%¸¿´…fÅrKå&d •+þ' ¢ÈÒ°4‘ˆF4ÅÅtÄC±ˆHLƒ—Ä%ZшR¢-ÈF'.Lˆ` ÇHÆ1V¨ŒäËá Ãr¹0ºñpÜP-‘BKxBž0ñ¨Ç;æqôcùÈA’‚,¤"ÉHD:ò4¤$ùÈI62’”Ää%-YÉ=ò“ž åA9JQj€”§4åŠj6 ÐÁ•w|%b KWÖR–´œ¥-u‰Ë]æò—¾ f/‡yËbòÒ˜À$æ1—™Ld Ó™Êlæ1=ñJjÆ’š°Ä¥6³ÉÍYV“—àŒe8_9.ÚQ–ÐL'3Ÿ¹Îh²Sšð|§<ÝIOuƳžíþ4æ.•ÉOcÊàÄ#@«i˳0nG©ù¦8êÊ€b“ýçB!ÚÐ…>4¢m(C!jQ‰jô¢Í(EAúQŽÔ¤ßiJ9ZR•nô¢Ýœh-:S€ú‘ è—‰ÇUîhNæå*†JÔ¢õ¨H5ª ’ÊÔ¦:õ©PªT§JÕª*ÕªW%êRúˆ’Ó|!©Uivª"™5IhU‰ZÓzV¶ò$­j%[“$W´¶u®kµ+]áW¾ÞU¯yÝk`û ׿ ¶®‡õ+`7ö×»¶Nzëcué ƒT -] À °t ç9(   À'ÄôdÀàž@äDz0Ko@d@Kѧ ð ;}××xèõP‚¶kæp;&NÒfg¶T0y#ð§pp¶TExGe0®D  Ðç„w wûö\,5cfq^ÆM1–’Bå`Õfp¢þ( eK øe±ös%ye.·mÄ·t¨PrLJÅÔL´äƒ¸(_¸¨KJ–s¹ô`ç&Ùƒ*æfRV’C™MÖ‚+9K÷]³dm$XMÙ¦’Èær¹N¢es‰¦t&FSe y§œFŒaÖRÝ„\ëu‚UKÜ…¶gi™j'mXqÊh{f h8ìU‚›%Kå4‚ðO¨öJp™š¹™œÙ™žù™ š¢9š¤Yš¦yš¨™šª¹šI–`iÎè.*ÀPšKp`j ß° 怛JЛ¹‰›½Ù›¼é›œœ¿YwÈyœ¹yœÅYœÊiœÅiœÃ¹œÖ‰œÄ™Âþ œÕÙœÓé›ÛYÜ9œÑùÍYÓ9ÞIžÉ™œ\žç žÁ¹Áè©ÐÙžò 4 gÕ4Ÿ¡q3 Q—i·Y2!XHb¥.Œ@uvˆ™ÞUNútª¥]±¥(Q¥SÑ©Wº«\ºt*¦mšŽ ¡YjªŠÊjªI¡«Gº©¥š¬Ã­\ZbZ©jz›¯T›6™º‡|Tqyt #qÄz©Fj¨Áz¬gz©ìº1Æ*§Œ5¯“ʬô*©Vê¬ÈÊXœz¨pZ¤û:­az¯Áª©ˆJ©zGÁWY;Ú"c9mpæJ·é1§îJª;¦0á©oʨK ¬ ¬ŒÊ®dÚ¤»º«Ëª¯†þ¦r ¦fú±U¤0ë¨M2¤Ôú¯Š@v dþùJiÑ&7– u›7FŠ«þÚ±\Ѭ̊±”z¤O:²«¤K­P ¦ËzcÚµ ­,{ª;+¬“º˯#q£Óe´©uÙÜå§p Nr±`À&áÄð­ÐƒJª…z°¥²!;¸ÁJ¤6¸L¯hz©.{¶…¡8 ¯Úš5û¦.{²oʱIÓ³Òhd9qZÁg®F" ¤Ñ Ý ¥a ¡g[¶‹[¨Hš¡¶k»ø ¥ZZ«Êš°{¨Ä;µ¼Ú©];¶Ÿú¸ŠÚ¼Š{¼*Á¶oFP«d ˜þÂ` U–HkP¡]@Wº:¹+a¸öš¸&¼š‹±-Q°ZÚ²úʵ…ë3K­.‹¾Qª­•J²4‹³ÂН" ²&a§u(NC®#U ; APrB±àZÀ«¼+¹‰û¾É;¯³Û®fú¡ˆ‹©½¹!|Âì+»¼ÈÛ»-,œ»¿O°°@«¢ÇTå­jûN€€)à O€¹ÊJ³5{³õ*à l¶ý ¯L¿´ Åô»¹¼ÂXì¾b›¸Ï;ªÏz¾é ·)± ?e¥]z–ºæÂêš¹ÀÛ¹q,¼*¸-ü©ð›ÇW›Ç/Kµþj«¾ ³Q¬Áֵ曶YÌüIM¢VP`Å£n±SÚ+¤û+¼)ü²ŸµÚúŃ ÃÜʼn<$Ë ÃûµrjÂµŠ¯RÊÇ{¹tüÇùê$lK@zGEdZ‡/ØÀýJ¸Ùжõ ºÖŠ­r¶fK¬Vü¯{ÈÂJ²Å Ř ͵»É%<Çïj¬º‹¼|™=5?Û1UÉ&‹­¸›­ÉŒÈZk¹ØœÎ^\¼ÓZµÈœÍû¡…,°Jü¸`|É+ëÎ# Yµ,®|:®vxGp Y|¯|ÊËì© Æ1 ½ÄŒ¾ƒºÇ˜*­…,»#‡»´eÌVÒê[¬ïj§þ«=õ°.²K7K¬Ó2=Ó4]Ó6}Ó«éa‡5ã =æ­€ÓB=ÔD]ÔFmÓd©Ò *#3›ÑÈŒA]&Ü8tñöR±³¡õqÕv‘Õ`­ÕaÕWÍÕVM fQfqÖfÕ¥ñÖ‚ñaÝÕXísÕZ}Öh!×UM×öÖ[­ÖqíÕc-ÖÏöRÜê³{fÚQ+DK“m sB srÙ˜Ù\­Ùœ½ÙýÙ Ús MÚ¢}Ú—mÙ¨ÝÙ¦-Ú­]Ú«Û§ªm‹dñRjf‘ZGFp Û¾ýÛÀÜÂ=ÜÄ]ÜŽØeé <'±K¢†™ÆÝÒþ=ÝÔ]ÝÖÚ(£t›±QgÔ×Þâ=Þä]Þ*p›Ô”ÜC&ÍíMÞÜÛ¡½ æ=ßší±ôß«Ý`¹Ýó#j1ΛE±ú]à¥Ý *@ù@10*0¦ð• *pd`à®ÙÈ=à¸ÉrbE `ðá$^ ‹ ŽP*€ x0';  0'Àð4€$~ãvªÜ6¼Ô¥¦i›7Nâf0p ~s‚ &@*ÀFÎÕ/äÐË{7!NͰ±JÙRnàÁÂ2Œ,—}êÀrÐ+ÓåÞÍFËQÕ ±çjÎÛj^à50'5páT€äþ—Í Ú ;ÀX |^çôMÛ¶ü]®$;D¸äq\nèó­ >°â->'” á*° *€”å’nÞœÒwX)”éÒþ Þ£nÞ° ž_ÎÕŠpÙfÞ†pé­^Þˆ^–N§§qrº­•º¢-ßK5'ȾìÊÞìÉ®ªÍìÏ.íÔîìÕ>íÖžíÏ>'³Û·ÐÙ×î•­íâŽíæ^îè®í—Ýȼü­êÛNÆ0ýÙȮښ­ÚöÚønÜûíãîïßï™M±í¨-ð²ÝïùŽÙðÀ­ð™ýë«^YiÑãñ®ã¦8â½ÞëȾñÔ}£¢åqäôîaeþjØ$òïñ’¾ð*Üý[CVV§+T]…МÝñÄó-ïìáM õþï*ŸãLNDGµQc»ò@ÏðKŸÙÏòLïðRßð†õQOÜV/Ú/õ¨-ñ Ö+=-9õÜzÔföhŸöB]ì6¬sT+f1aÔ5`3æc˜V÷u÷zß›¢¥÷}÷~iø„?ø ×p…ø‚Ÿø|o÷†Ïøø‘ùuÿò²äŒrò{®Ùb*¦bwßlȶpkÖùŶp¤ú§ï÷¥–Öúg™eMfe.æù´ÿù ?ú®?ø¬Ïøxú¨ÿù®RCO±ñصÑ`j†ø©úË¿ú¸þ_ûkYùÒoú¤?ú ý¹ÿlâÔ‚ˆ¿fÖßùÞOû(éû¯ÿýäiÝýåï_ÔUmj,›¦UCµU[5ÿö_ÿEEÿòUùßÿN…ÿ±J @ ,ˆð`Â>T¸ "Ã-ZdHñâFˆ36\RãÆ 9V|H:Yj”€Š'Œ©XÙÐ@;{úÜɨÏ'E %ÊSéÒžJ›2-ê4èT©B­þ”ÚT+Ñ¡H¯nõJuëØªNÍvËíQ²g£5ÊöëW@žVjPqSf£'*,álIÇ®'s‚ {j‰8pᜅé8vܘ¥c–“[–\øðâÊš/Cþf™ónåÑ-#Ö€ZpêÔ‰/Nœ1ãË£iׯlù2çÝ”uƒîÚ´çÊ–‰ƒÎ™ø0kå~-ÉTèf#–v…½{%më¶M·fÙ5xÁÃ1[øîìÕ†Û/Ç-}öØé·'WÍœ³lٵы/-5s°S¯ÀñÚ‹m3Òê[i6øè & ëë¯Ëk1Ô¬ãÐ4ªk@ÿÈ ¬»ö4 N9÷V¼Ð;ìT3ñ;öäk?ïHÛ7)Óб?ÌnCC,Q>Ój3g3þ įFÍTÈK&K¤óË:sb\ï;û&Ë®KéÛN·Ò ï:Ùƒïµ üoµ4»»þRËýN4‘ÀÒ m>óâ›-K6ñÓ>ë,AT&F*LK+íCÓ¿>=¯»Ç3¶»Ä«OÄ;dS8ںİO׈ ’É I ³Ä!sdn4?)UÕLÕ4TÏ.Y Õ“¼ž`Êé0•qÎõ¤­Ò0K»3¹ÛÂÌQÙÝ8DV8Xy#<Õâ»®ÍÉ„ÔØüìLî5óenÖÃÖÌ9Ñk JFö @þ²$ÜÝlM.VKe ®¾©å6Á>—-RÒo?Ó®T^§­OÅ!#‹lÜùý—µQAmÕZc;X2s9=Ö˜€¥É&œ¶=ø±ÖŠÎ^«­5È‹“ËL^ÝÓÄþeÀAôxÝ9|CpÍ /[ãpMo@ŸÓ]3'¿‘ò^ è$“Bék±KúÈ£ŠÌ.Û¤³Ã>»#°Í î°'Ѝk¸;º[î´ßöZî“R)´F¡…B•E[å*¸Æ’‹+ŵbJ­¹$‡Üªª¼q¶°J+sÏ×b<«ÉÓÚ¼sÒ±Z*®ÏGWéPK°¶|7LÛoÇ=wÝwç½wß>xá‡'¾xãGøÄ+3™p ól¥UCŽyæ±û뵟DŽî­7AïÃ|ñ¿GŸûð¯_Ÿ}óÑ'{ïÏO_ûöÝß>ûõïÏ~øû?_ç‡?ïmÏ€$ ýþô@öå/ûëŸúÞÁúM|݃Ct/˜@Gv~q Mà`‚Í=nqnIŠã4w9¶P,”»œ åÊÐ…,„œ ÏbCÇ¡0…;ôa å‡éµgpÀšô"3=8Ìã °‚¢ÒˆÕš!ÆŠTœ¢'sE-ÂÆ‹YŒ"µ•˜.º†‹RÔ­¨F1V±j]l#¦°ˆÅ/ÖqŒh4£Va‚ >Á4ˆ‚Mnb +­¢#ÀŒÔ¢k}L^úÖ±˜ÔRL¦º«r¥žJ^HK4%·Dª…i’”¢$Ð$Q¹Šy±.‰y]áf¨ÕΉ×ò“•¶e3;õR?¾\v þ˜!‚‘+—§4¦¸@U*Ôh‹5Ì"?‰'—¡'O£ÖªBæ‰=öñzÀ¢ ×Ú‘\Ëœ"‚$cø°däqg<5f¦i&ìQ “ÑÜ£)kÙÊh®9’³ÒƒO1´Uå"и€´%]‡•®ÌÐKx/^¦vrx¢$™)Ii>&š “Gº$æ½ë]kY®¥=åf¥¡Ê4·ƒ¥iægUÐôgH›õžÐt3:ݽ¢3,•3p_rÔ‘Ð3Ü\,U×3[êÉNJÑHNýd‡” (ÒÓOý‡pÕR¤éëšœ)¦¿ô8Äé­_Y×i ÙD?Ò@¸‹/þ«i®d¯Ë’&KUµ`J*d\"STÝÄÈ£9J2=SiJc4ÖbÒó¤T;¬ŽéXLÒÁ§umÉK`'ÎFä‹Fµ Þð –˜űÎ^/•Z™2”¯KVÄP´ _îö@{f@%%"gÔPc l_F²-}•`·áÔµ´dއ¶u0ˆŠI°¨¤‚%>®-‘Å&\aøa¯˜ÐFA=À à0(ÐÔ£h 'ôð…Ø…˜Aæ'¦ó¹¼ý*œŽXmj”À§*.ºš£-‚³uº-Ë$¬¡©X[«`ëCó+EUˆë1*xiàO£¯=Ìk5°WþP¸B=èƒ'à C\…`@†k.’¦õœ§Ó`S³†‰²¡Ïj0o1Ä£ôDUg—T%Àz´ Íj•IÕõcƒÞªÝÒÒjÔÃ(bda¨a3Ö$.A/ÄìµÍkÀ€^[ˆ(bvX‰Îщ¼,¹8âhb›äÔ\æFa·âW:7<ØŸuP:š†#µIÆT‘£´ªOërèíå^ŒPAŸR¬Yx‚(‡]uü Ó— ØF3_[ë ¸`TôÀ`YÍg—bÖ‹ ¦›VŒ”¸LåS‰¶I{V•Úš¶2…Ù.¢#îà,µ&:¼È0c:þpbû8-4p‚W qˆKþºc \ z´'¦ ßDðl°NÞ`ë¯Ü{jR¶ç9«­N‚&˜ÙDc©riZ²¢EÖ.ŸÝ_&$g®æ4v¢)é!ŽeÜÈ0ÝtÄ^P1%í ÷T'{&I°…öÕ¹¼ÔæÆH4±êT*⢑eîRÝDÞå%Ùµ„ìnBT7&l*…ËÜOC²eT)ÏßÈË 6,]Nf0±ú3z¦SŽ0‹)©ÒúuÔ€<0¥9M ”¯Öˆ„&ŤΊMmX‘C«r&ì.Qå4cÝbXÆQ¹-g{Ü·¼<¼pé3Ö\q~UL_²+È*þ†‰e<„’–´^nìQîgc2d(ðµí(ª"vž7Æ©·ÆøduÛ­ÞKÞЖUõŸ1jÁŒ9‰ƒ ¡wI8´a2Ì3iÕæoŸå5y&ÚÇ®)„Ü2Ï—‰ñj×m”á©°¢)Ý—,¶FŸÁÇåÝ=J$·â¨çľ±MmcÃ’ µÑŠØ¶Áô¿ì¿¾á·@ÿ[›¸ñ$‰´ù›‹h¥ŸÊ‰1³˜`„Ø8¹ñéž4ìžDA$A|Á4ALÁ,´Á\Á„ÁôA´A”ÁœAäA#B Â4Á%$Â#„ADÂ\A" þ³Ç½çñ‹î‚¸è¸Ã¨Š/Ã2L 0¤ŠÔÑ!¨x r 64 4<¡Ô!ÃÔม;dC<ÔÃ=, 2 9„Ã/¤žŸ‚¥—xžÒR5ï„H Hì I|ı0ÄG´ J”DCäD¡€Ä'ØDOlŠMÅIä‰P¬DLLÅKdÅIÜ RŠV¬DP,EUäÄWü YäW´Å\EZLE¤¸E`ÆYüDRÆW´Bõ 1íz èè®øDú U´DkdœâÆâ!"‹  GÖŸ(F¤ GÅquÌÇq¥:¡|*©ã;–¨L<`4Džþ0ZÜ!JlŠ{ Š`‚ä `P$…¡hG¬H;ØxÜE¬ DìÇK`ŽäV:˜ŽKåfÚÌÆUQ}‚U@3à(Êdpˉ‚¡4k[…  †Bp…SÌÕ]½N¡L³VaUç#ØkfÔÁ…ÏÌÁc`TlHU^ ÀãGèÌTäkœl*†\”„Ä®G¿PŠÊGnéþ¦ ×l(;˜‚vÕÒ{`Wwetž|vHÎ{­Í2XܬP t‚n€Nðm_0X„=ψÍh`[–D]Šý‚eðé‘ÄÄäUK'¦ÅǶ`Džh¤^\|ìľÙhY²|‚ÇŠÇoë‹!Ýâ뵄'$Õ°ÉåÙ6¶!ÂÌ6\[%S¨VV@ÏxtVë yGµ\I„h…lgV „îØb<ÒÐ,ïôÅOF>Eôâ¼Á¢ÊKoŠîÌÒ¥ìŦìÞ÷ßÒtÚùT òVÙ¦}ñÖèNÊ¥‹³D ïNè­ÌÅÆÉèh]F'--¸B”}Í&æq‰þþÝÏõáÆý›f?ì¬\ñTTOvÄÖžÐqòÍ`«íÊÌá`ÂeLjLÚ_L[ýå@VaÒRÑTí.ßÕñ`Îyf'6l8gâ“ÍÝ¿Ù$&]ê´$ï¼\-ïñ¬ØÓuVíVT¯æ&¥K Ÿ‰29¯žæÛmE"-Þ(·â"Ë_^ ï^¡=žs©–[Šn_>ÖÆBV_ɶÈôtžøÏòpª ZÁÁ¨GÔ£(àcåJ«°Ýo†|ćÜZ¬í;ÇsùuG©ÖX×ñK¿ãßE¸TfèNÆã=ã‹NjaäV“álìå®3›FC4ïªÅv ¦ÚŒnãOþ°ƒ2˜ƒ´äa.Å ~1X‚*ø‚\nõ¥òþŒ¡³o‡ò©ulâ^ö¼É 'Jê„åªÐF´Ù >qɆXêñOœa e‹g?LÂão~ÌÈÜkbžög…Dó¾Ï*®à¥_Í#e÷m”ZCæ/¯êr3½+-ôèæOŒÍLȆ|½MM††8E(Î,å qè 0˜XN­hÎà 6 Vp‚é„eÍNL´å'p„\~ñ$Ï>ðéc†Ü‚¿nÇÆA×yàfµÍ[²…vž uBEYϤpª¶ Ívd’K5íµY«`JpPrlž Pþ ÅÐV•Lm[x>Æ:hëu˜e ö 'P†'V(ˆ!Ð5`{ÍYð'÷‡—Þì&z:‡` ÊcòµÏ¶Eô§Ç/ òHG"©KwÄXú¯®ÒÎÍ¢0Û¡Q0ý³{ˆés®iPHWÊž†DÃì_Mÿ/jø@ð†ŠTy/ßãÌÍr³ aÆÖvÏnÏrä@€ž ìAðI‚L¸p!‡pTò¤F–™ â‰ –0jð´ê œ‡O<¥¾b S73Ȇ±Læâ Ã'QŽü¸F€ä •Õ#–ƒ1e1¬(!Ð'fÕøþ#”¨L…òÄ.4(ð*Aƒc˪„Èð퓵 ±bE;6"Á³xéºm[¨Y½oë¾-xé`Ááœ$IÇ’È4Ÿ4RшÎE:á8$-S6##¦ Ài@R1C7‡& fôÜ#xÌŽ+W¯|âÏ“J(œòÕë €vÔ` @oôšy¹/-žPª0o[ðyñ~ï\8âÜñ‚ý’WïmaûG˜w-ý¾ÞN¬X’#IÖ d'¥ÔÞC ±$XVú5¸ŸzeÀ 癕–^O¤£sW±zßÅ7!|)šˆ¢y*r^ƒ*%tW]Þ‰'‰þgÕØ"xøÕµØ*€dfŽ’}  C G}p%DÓ8®‡^‰‡•c„„…gžz9N‰[ãy™WŽîU&`ÞG¥—ïÍ7—~5Jyã†ç½Õ‚X¦Â>XR H˜ÑaŽ‚$š'gA/ºe%\JX"D%T&ŽMnÈ—)V¡|Ц…埦¸_yšÚw–›ä…÷f¥)ÖßE%9Ye— jJ¢jÊj_"VHX`„íåäM®§²ñq˜,{­¾É©†î5+"|ø%FgC1µÞ™â ‹¢ŒŒ=fZ2 "%)èfàŠ¹e«]ÚÉi‹È’ù¡‰Â×ä©`> '•z}ËÖþŠ]a¤«Žº¥cj‰^°ᇧ9ƒÎúÑžÿ%ˆÒŽÍ2JüJ _Žö»‘blƒRØ!S›¦»k[w©)P·&/¬©¤Æ'—„7·š¦—ÖÒ ”¸˜y¢Ye}þi cí*jÖÀTTC¨ñªôàBîÀ¦WX#@™¢×€ˆ¡G_üˆ,îÕcÐj){¨Ûà¶k±¬æ—•Caš:åÃûúŒï@Œ ‰‘‘Ñj™Ò,©×ÙŠ\¶Îæõ`BQ\Sß!>A9ašsJ 2'“¨Ë¦î+ëïžlX}”f-ëøÞ»lŽ9מžàZ--Ò!h#¡ÒHJ+ŸØ™xþ1¬³Ðü³Ð0FØÁR<ÌPF ]0Ã}|Çü<1´CÌ­lÃöBV4 Bp° Æ*ØÛ¦¦:_ l<þ>’_'Æùˆ A1ž/Eb‰Š]„˜˜µ]¼êÅ—}:>†ò§]ßu·3EWÂȪïœ*ÜÙ¦ºÓ³Qºï)=®òëU ¨‚dÐðÒaií­ª6{Á-J%÷HðÀP`·H:Îá9Þ™ra Zo=ÖY÷îlUùuQ_d\Xª$ƒÙ eŒ¨ÇJ«·t—CRùµÑFÉ«èD'º±ž‰ÍQ^k"ÚŒ‹tâóK¼²eÖœŒOòÌó©ÄÕ]…çÔº¾g¸}¶O5UcL#$ÁÕ‚ÌvÎ3ñØz³)¶]nBéØ Hg:#¢)–Ð%`Ž™«Ï  XÒþÝ—nÝ,>ùcêôr¹,A Ùö@$Œøãruç€Æz(€ê] PÐMº7 „9ä3ß[з\BÜxß”ÈçÏ¡å QÅþžÀ ÿ5#€U‘¶äºâ0ZÐd½®àØÔ(ÐÎ XNPB‘X=¦2L¬¤W!Ç ±Ä%€ÈÃfÒB¢ †2Ü<$ÀˆÂ­ªÙ@°"…3Hà CìADi¿³8A€˜©Æ=¨!±Te×0»¥`i.ão„(ÃÎÂ@?±Â $m°x²”ç`Ó¬„ÒÞM8ó¨špZƒÌÐÀqŽqì9Ü  þ(ŽÒÁ’PH’ ÌyRz8ùN€Oåº-çÙN pÐê´Vã¤Îùº²Ñ‰”¤† ±¼À ¶:쌌éð%1™É2Ó•“Ð$.°8n E)á†S ¢ðswÈV<ªÜÊ\ZºÜ&ô#Þùv•صYWË"‰Yö=3#UÀŽ’“,MVV÷¥FFRf@0I!'ö¦÷Ó¤f5N@‡-`ÓŒ8pÔ6z°Ã+fBR–üæ _°CR0”Cœ€pÎKÝBÌTMÀˆÃ{íñ±Xï bôH•éZ^P_ÉLÓ]YãM_) ˆWyÖÕ–fþ(ÛªŒ‡WÉ e˜dÁ…`ÈYY¨Uǘ£øÜH;i`¦M©ÙdiËŠá.ÅSê8„áhÞ¬üI­ˆ×’xŒMà(` ªØÝˆ ž{µÕÛ˜Ñ1Ÿ•ô ¾1Zšù“v!j­È¶8Õš<š†ÀJõ! º@ Œ¡DÑEîMfeSY‘€íŒøÂð×V`–Rñ[µÖÎ~%ßf™Ô}`¬ÄØd˜ Õ=+© ÓI pµ`b¤tI“*Þ‰MRˆÌ}ÚRµÏØ“–ÐÈ„LÄTß5Íd¨KÔØ¡{ ß«iÍ–{í“_ézM!þò_ÑôXŽ5U–LPdEŸ˜¡r¹Ž­‰Ž@)ZFf$÷] …QZ|¾ÚC Ý™ ö)Ü!Z½Ly zèŽ(Z`Ó5Z –¡+¢]1 jñÈ&Þ‰àIm…Ad`FÅÄÑ‚,Dò|PŽy½ ]p tÔ_Ð9åEÙœMè©’Þ¤I2ª £\!Œ ªbX=ãÁÈ+ ¤IfèI]0 S²1IšFB l K²hZ^Ѓ5èZÌUŰˆNK”N:œÜ`ã€ùÍ·ÄÌsM >6ߺáQ>^^!Uš0äÒÖDj÷é…Ø¬À4ÜF ”þÜJP›YdO<`·Á ØAl rðƒ4‚˜Â0C ‘€ÍÑ%=þèÏLõÏ3ÔK%œÏ”R‰…¥pa–®Õ¢rý JŠÈÃteÞ,#-Nßáh€9ÄÖ/j„0mL÷]NKèC íÁnlÜ ‘Öl€Ø•\|@ø4ÁlÀ¸,À\öÀš‚‘Ù<ÑÿÅN¿M˜š`ÊÐPa‡)qŸYùTg¶cÓÑÎs%CbDwýbDÂ&\rƧEIÛL„ÝA𑠙ݔL­]"Q(pW¸Q$ƒ$MEýô‹Þ=Ò9Ìä_žf Ì 2š”\$—þìÊŒ¤¢7N´< BÖGÒì‚YB±YZõ™Ø\\ˆ°„M€„VînOIày2¬âfá§ Ë¿Õ ãE P- d)DÚj†â`ÌFàG¤Dóæ¦j\5„ÇÑ„0øÈ Da- œ}ô€$”@¼Ü@ WFÍÝ\vBƒôϦ@b×Vé®él1Ú’L*Íhi5BÌÊïknпº(Äm_þ‚Ý~Ê؉Zo°› ÀƒØÚ©Û‰ $èBÈ@)„ÝuB„u.ðlÒ&ù…BºNkÍæ,hqè ‡î¨…è‰ÆS€YàPÁðÂÅá CdÖÕØ oMªyÞ -ÓÂèAS2ÇöðI*(EêÙÑSðÂD%AhdÀÌÔ9UÓþ£Æ¯Ÿ5–%«´:íÎÎ’¯5báÝU z(©N¢ °qUl€8á9ÖÅg„jŒß8ãéùÙ‚ý4ÃýuÔ1€Tü©Æ$ÑD‡ . ¤T£6éÿL%CP*vhGìú¡i~ÀIà…§Ÿ!«&^;U‹. ñ¢YØŠì.²‹Ã]¢òÂæò¼W]HzöË‹­Í®DYÉ$—„Ó‡ˆRƒ"íxèŸqqÈî ä:ŸòÅ 4ljwzâ§¼–¬ˆ# ÐB `„'ì˜êˆfåÀ)ݧ"5» ½<Тô¾™\þœgâ¿ $vå£Ç*LjRt” –@]^ÛV†E4Ç„•Í^Šè~þéÄB˜¾á4SÑŠg2>Ÿ>5Éíþãz_,†qÇ^KÌÒGåYŸa ‘‹ã4íï|¢^G›ç½Z9 õÓYóâõŽZ?ÞS_•í¥`¨4ëÍFe†Fp„/—}5ójc"rª&?ÖQih2Lsѱ\ó#ˆ ›•q™±få«Ùî[4Šˆ\ÔZ} a•²ºHþ¢É9ÕBAØÕýËLd=r#Ñ¥U¿pLš‡i™Ö4¦W¬¹õ¼ÞŽxÚÒì^˜Ö–´bõ5dF#–æjÝl×·:¢è~ñBŒœÃ=Ü@.À êÔ™ª”¤¼J®U)ÉSÁm*Tþþ6h†r!†ï4ë—…©‰½RËŽkÉ@aŸHä‰ÄÅqR'cƒ€Ç怂ß]¥zPL=Ä©Ž÷²Z¿oóÚFÖ`¿5.qÇ A3 ã¢Ù"ÆK|j@²í˜]ZGë/XÁ4äóED\›sÌ€æ`æ§ ?Ì[fÞüÈOwÎ[& `f3ü@ìÒŽooå‡nÉ`¥Ä7:féÈÀ)…¶Sßts¥WTÕØÚ‰æ.oÜ„Q¢ õ¦ Ä‚pŽs…—/0çÁËÙ]A€ÎB\gu8ÑÎqçyìë¸0ZZYÐ}0jOžJ(²§ð 7þ´ž’„İlZ•ö‘·†ëØñç‹]q ˜]„ÄCÀ‚£`‚jÅ|Ò8è$±»Ea#sRWô(釪ÖJóQjm§$'Çu¾ï=ùtíá†<:˜%6e0Q;ØŒS¦M¤‹V ,û(X¥B) CRóȞݕÖš“W¸…ƒ1UØv-¢áÕ^ÇãN[5ë´°ñmuUÛM¤1’ôIÛ ƒ¥l^|_68Tj¬Ä=E­Fk`Ô@hÔt÷mè VÔåoxØÁÜÀqðG*LáîÑÔ@ý2<*`(–•¯äyq®¿µw¦åÊU†Âþ`{,Kú$n×cHwOdÓ¦'ªÔªÍªëÂâýííF¯ž•Í’7îòT%³$N{òjZʯC]×baÙ–+‡‰&CÀ¡ÚfôÓ@†Üwôù*9ɬ,.ú¿ùàÔl#®îÔ/s³EM³µ'â ⽬…Õ˜ÖQ7äã÷¸u¤ÿ{0Õ–QKdA­àc“‰®PbKàoàh7³½‡L?†îÊ ÚÃêZÎ ZÊßÓĨQYVÛn„c ÈsV_<¯ -áX¬‡ôãSˉÞïúã¯ö¬Ø"¾o ¤Úÿ z6@<$P œU€4ÐÑàÉ’ Ki¨x¨‘¥… Â8þc‚€<)’#G=Jn$©ò¤ÈQ¾LiÒåJ—(oŽü(ÏfÍ’8KÒ r&Ñ™€x>Á©ræF¥9[: ÚñåÆ˜C£ú”:ä8*yRH‡¢¥C,²ÔŽBO«¼ú¬Ó¦Ò“oÔ|zSê“*BaúÀF)©§{‡L§gMÇ! ÒÅjò*K­(yþ¼‹Tkà¤s•Ë’¨Õ¦=‹¶üüÑëÁ„ž44|ñI#bì¡ñjæªtmö´jב6†™Q¥V‰ª²DŽÞ×Ýp1Šª|Éz`Ë-[øø­äÅî¼Ùqâô)Ãë5.z(ɯÇ–…ØþCtÌ.8RšN¤Òô¢«†‘êSϤáªÀ¹aÖ )¤Æ‚P¥t®©à PœKg‡'F\¨ßón=ãJ»ª)ºØ3 Áž.¸–Tô'¢2S±¯Ö @Ù ’ˆKI(@°4rÉ2É&ŸbXÇ#ø€æކ1âI8¡Œº`†ú 90ø©Á9Ž`†˜'ÚQ†Äjxê¥Ta¥@H0æ™fÒìÎ4ùF;&©&ë‰=F³âj«—&›ÔQÊN;ê<§\Š«¯ž€­-KlÛ‡¶Û,rk@ïE@òØ#C$¢8Â%PRy"Oapx" k¥R6hà fâþ˜Ç䢥 CIC‘œ°Ó @ ˆa-Ô ÑG£ìêÊ·òÈÍ‘)Ñú*É7O·šñ³ŸÕÉBË>ÑÈ ¤-s4`Ä!ˆÒrˆÛP½áàF©é{¢a@dAà±c;@ãœqra PøˆYž€.*QWV) €/jøoFlL4yöºŒ¤¤N\©ÓÙw)=%é¨F+­ Fã6“¬(â`UT†H…ˆ‘ÚŽUƒUv3Úá_ŧDähl4Ìà ä’Áƒµ'ž€S$Ðp† œ ]zˆ…—1 % ™þŒÙW[I‰'ÈäÑ5Ÿïê1]{þ!¿—]Ìtlo<¾$õúÒI‰Îq |ÛJÉÙFRI:˜|)šL<ðr $ Š)8'>˜Âfâ°ã‘–PDWD ˆŸpf8Gš'|éå‰BʤD=8'˜'Þ(ÉŒ'€àœ/ÈÄÐFõhiGqZ¼¼Ð¡Ú\󩨪‰çº÷®ÇÌft.Ðâ>1Ç‘a5@ÐâH IˆÁ˜ö¸ ±D&ß9MºàÖ¼À)MK Üz C5N'D‰¢>®ûEæ^õcšÏàó„Å‘fE ‚š¥ZTœÒäËt Z&ÂÀ‹l€&ŒWĘò(Рp>ä)Ϧæ’D¨]*S›1þ ¥nÔDÍïŠ?ãß·4Õ) …Q^;aAÀb@©§+Ý[âBHÅEœ Íãnè9ùh>éâÜ¢úx ;ZÊ*sW1%9D=±#±Q_Zô˜©àñPwÉ—¨ÌñôJüjK낃®šÇiäãÑé8Ï¥Fgð)3WHþ9ÈŽ*ZÚ 9C¹£ý†)û#£H@õÆÛ¨€²y〠SGOÕ4Q)•¨3J>ò…t¡º`8ÃXbN”) Ï ¹JY¾d\ì) éåðP,pHÑŠt²tQ¥+u(h`p—÷xOƒ,T?Âr>FØ‹<†ç*pfQ þdB®tŒ[ÚÉUKÒ ²‘œÛ§8Ê”Ê4“#÷‹9ücµ'¬E YȪÚŸ©É‰L¤Ëp" I9zmZ悘^¦õ%¹”H:ü« Ä ‡ìtl„¡3åSù3ZÊ£”œyGà ²S!kŒgYƲ5¯ä,bùÛiHÒ_ÖŠ@y ˪)¤õ8QI+Œ0ôÓ½ô€CÑD¤=+vî…{f¼´ Èn2´8% ï …üðjþÙ¸F ‚pvù°C•j—¥- ¤KOI˜(Ђ\ çèƒTÖÄð`e €²(,`˜^› èAµƒÄ þ$pZ1‰ã ¥«ÃQ ~$ON˜S+”Á<áÄVO˜þ¨Aýà #äß»P¬‹3)t¬4+.O ‘ár‰AžV¯¦Å6¸QÕXi+W=!c£ÕžD‚«Ÿò ¿¢î3΀:KÄ„ˆž ?¢ Е(8  â ü+@(À‘°±’’8+e]É“Iêˆñ‰!ЀÇ:‹Ñ>2n”ðJQcÏÓÑ;Þ±”N ×}ÚéÃ#©Ô?CDæGÓ°íkl]ÅF0‚ U"˜ö1‡}6 5ÈÉhZO^,…Ôò+ëþ-Úˆ"rC¬xC”ÅS¶­‘–.$â Ÿz°@–ˆQzª¬8á¾Í6ƒ¨¦+†Á:”J;‚ÌœO”âg ©ÉjðD²ŠŠvæ ,DŇJ%"ˆ-(³xJ C ܉ ËoóDþg‚”&(n¬+pê -zÊ["]" :äCò,°‡{„ÈH†>‘Š€OQÌóÔ‹±8Ǿœâõ²nʾ I6 H ¸ç¦Áô D!CDk#†á Î!bx@n@µžà(À^Kîž Z ø ¶È$·Œ·X Ÿ@¸¢'C ¡A x@LÊ ¼Ä@&ˆMN˜Až ¶A»D‚®l„ÀOz€¥à ‰F­ K®NÃ^¢pDŒdé¥l6ô­"Xíû¼CÀ^¥ÀjçÀn%Wj 6 W«jÂê„ÁXbÒWv 4l =¬&CÌòjÇÄþZLü€'WÌ%ãÅ\B˜«Y\ Ñ8b¢Ztì xl[X!ȪÐh>5¤ªÊšŒ/^âÂ.`Ï«$B¢3b\²La„c‚¸Œy$†Í*F8©6¦cä®­ÍÞ $˜€è Ú 0&Ïêj/ S̺Œ®’‡0•B–A ’ád¾&Mãe Òd†f¼er"C­‘qšp­4J^®jª"/1,r#Sí6J‡uº¦$Z%l0„lÌmÔf8rÀm¼æpæn PaئÒ$Œ ÙAnt  c:ä8ŧ8ç¦nšSØ ¡ •"` P"¯¦å# ç”3þZðœÚEÔþЧæÈ”4ý\-Ç¢"¶nÏð@)$N Jd'd ævnwzçwΟ¡ Hyfy# v x„Çã +#Ôô`ÞB€Øj/ACý‰w|'y,ô œà:¡ªg3 ¼D‚{ìà{ÂGèèŒ.}Q›X3a(4J(Ÿ˜hõ229­&@’²°ëÆ"gÉ%žË”äJþêb‡SÞƒK‚5Žà/%H…K„:*\æ3É,’úºÉ‚)sšî©¢H'ë6oßT¥ˆªJîŽlFª°øN©*G©üˆL–rHýŒŒ‰2qLÓ~üþ°Œ,*¨;C›²Â}°©¤17𭪔ž0b¬<ôpÄ^.õšð‚fJ³è qïRÅnòz)¦*G—D/ç0Fõ;$°X놄Ábß.”A–`úÈ⨒j©¸#µ4ú%zü\È™XȆšŽ`cé¾\C Qh¯^›¤*©6Tñ‰ÝͶ$,S/!ÃrB=û¨¯>$DjF«”°•äÔX3’Kõ.Ôc5¤ð&LJHæÉTôÍ!NjUž‚³²áì¥QK\¹”‚¶Æ¤LfÀÔ¡@Æ‘µTK£ º1À²Á¢Ç¸K$ÎѶ¡K¸'*bK$æá "! ¡:À QŽ%²ò!É+¯ÚJaIIS=þ s$ýüÕŒH^#6ÖB °lo¬Àf¥×ÌBQÌÂTLW ¬'p’ÂxD’Á F¬& 4!ƒ †¹2.lDŒ®2¤X"£§YÆ@$l¦å\¢Zž`ÇzìǼÝÞ-’b0¢C¯÷ôÓhk#¤ÆTU혼¢4„†9í-O&óÁ!îì0€0{€b,Îj@1áÆÎ¶dFKÚLü¬aʰv@Fw;ÑÊë$¬b(àÍp(­l©c—L[—”,UIs?÷NáNIg_4I-t37t‚@!Öø—yÊæ à"mòP×Þ†Ü|þ Кo ­ØŽ­&àä t€Ùøö§ŽÓ)Òæ¨Ù’³oô¥ÁdÛÂ4¯èŠqÄMfz-¯B Û { TbpG*—~ö£ä#²\ UL,*¢¥þËE¢@nàrÇaîÁ”>`¦ãå6´F®âh9lîå:ŽÀ:t &Îg Ê vRQ$šæ†' zçÆ”çkhàY*a(àn |€Ž¥ãç¼×h†ôàèºÃ#Òmú²’ (îšïóÑݼ…˜õÔð-`ts,Z‡W‡õÂ쩃JBí.—‚ùɪVúLå®HIB ì@eœ Þ RÕÐõVþ-õÓÖ­#N°_*B¥~ø52#uÂ@rþ¨*‰•(“I«„Y9#;’r ‰5†{"êbˆ¤–l$zd ƒB~¦ŠÔð·0ua7÷Xƒ™˜Éƒ.cÓÌÚŒÎǵ‰Æ——høNo¬¯gõªèsMƒº¢±)$¤fÿÓ6”ù¥âB `vþép¹±nPò\âcK"ßo#ê ƒ~ÔÃîÒҩص¢w4¸iµÙ/~-‡&°6ÞI…èJÁ®gq#º3Êêí„*X äJ^¢:ªÂfL‹8ò©ÁŒ cîga³†ú¾ÂÚ¿³HðÚð–§´­·Û¦Æ$â{Í •L˜]‡«bÕì`+†äDÇW:äªGWú‚ýJrOsýž½?µI-»aµè¯‘”ùÊë4¥Šš6~XÁÃð T—uCÈfIë ª9f õævà w÷ h7u+zÀ‹w, !fA$|[Œ Í_bz÷æ¤ R}Êþ0|¼ ¼å!s·Ä71IÙÏfÓƒ¯‹,—’ ˜Ñ’J•Â!΢tßz!úí»ÇÎUöàJX%X ÅzEÅ$¦€ $'Ÿ€W :4¬¸€?„(¦‘ØìÖ‛ÇRø Dx …ƒ{À ¬Aǰe aˆ@GoZ\>·FbðHQ˜×%¥³* ‚?MÇYWõ 3+ÈæÂ"¦a†Œù¬b(ÀÁ1“v¨xx01éì š¸Ð sìŠícø(¢˜v Ž)ÀN†„å›§íe Ç4mz­J?'§WD‡rµg$•=°O,ˆVŒi™YåC@ Öþƒ³:ÃÖáù3*|B¬í Ž`ð&è]b:]B9?ŠcŒØ8 ~>bÎÆaœ³„ŽÛ¼DÐêpÛÓW ÃfšìÈx;Œöh§÷І<Õ&L﵂Oâbk£[uÌáubgf'C.dN& îw‚BGî(Ty˜'F{€ _ ð¡œ%nBO.åfÀoLEAáZTw¾& 3…o´2€Ž¹‡ ïpÚËÇÐç *ªïÒïW»Õî4øœpPétô@,Jò¡?L—`(ñG´‚Uo" QÔn§"*ÓÏ ?c:MIZŠÚ´; ”ó 0Ô;û¹7'RÍuÿ¾I­ Hþ“êžÆ•DZÃ.½žkÅC°{ù Õ­à—ødXWÍOt¨ü‚ØÕì'©hp&Å¢ O’¨Ç“„€ 6|˜p!Á%6Tx¢Å…pTò¤Ž9F–¥àQE#Ft4x¢³ê œŒnœˆQ Ä…: ö¬q Æ…;ÚÄ8±(Å¡?s>ìYPiT=jô)QçO¢IƒVZ”+P©R%ºµlQ¤2W éÒ’%Z'-’k‰NK:á}šõoØ \ ^å¹ÔâU§/Š |âOÀÓözS)c¡ÍZDø”&f¬ }B\,!ϵ=î¥ÃhåÉFOT¨lù2&þ¶U#ïÔJsò×£¥¹þî<8òå¯Ëm‚EþçW¦ÐYEÊ­YÏAw ­ühßz2GïI,©€ËÐLšR{52˜iQ6ù}gTZÅqˆñd„c€(RÐðÂ@TTvÖ@éè±Cc_!¤ hŠY×sI6˜€aøX‡:‡[ µDR#ëÕÖˆ ¸Á$[˜M&` ¦& þIvx>:çY  Ù Ñ f;44Â?¹ã£zTñE.OÈ’”†åôb‡4•dþgPwÌ­ö%eU¶SŠOèÒJ–Ôu— –¼R_E@˜_ UP6¨¡lòþD‰.6‘‘=ŠèõU8§EqMO€RÂé<‰)UÍ™Y¡Ñ™•–q‚úg]™•RKzª°Œc#{y¢DzÉ4ùè‚( Á4ÿ4Œv ÉÃF´ÐÐ3ØÑ[>‚Á œŒ@¶tH ô í}<‘3,‘$$7Hz” Fœ£©N>Ãϰ7ÌHðD+ÛÂåB’òÆBBp`ÆÌóL3}@ì&› YçÝ€@.çgŠñ¨èª+&“k yRÒXR›{ðùÙ  èóD{,QÁ(© ˆ08ˆŠi Ï<ÖÃu4ðþ„0~¤[a2~4¬ÀRKŠ5 Ó<E…J‹-4ð'g0 ,.4ôdB>æä„2O˜Ñƒ1 Oô ™›ô}¸Ý†œÈ2›™ å²Z$çŠéŸ *åµâ*=Ì´ €4äê‰l©Ž2ÀcÇ/Î9ãä¢pÐC<ðŒ0‚Lp#ÉBà$0"ˆþ1ÑF oGõ•"  OQ:>&º KÜû@A Ðóò¤,˜éÜ¢§™säj^®2¬jίàQm½¥sèÉE7ë{T`ŽZñì!>‚†)@1 B«@ƒ8@¥'$Ã9ZA*ˆþ¨l¡9ÀƒX*¬=„G„‘:ò•+fHÅ0E K@„¡j>¸ ha!¥ÒÔU<¥>@0À}O¢ÚÖD/ ‡D™KÎhÎôŸ”]¥<+ÒÀ­Bg‰•ÔJÁÚI42á2Øa ÈHÒ=Ê€ƒ¥" ˜ƒŽžÀŽ8Ø¡A€(Ã9ô`…$¥vÎØ[íp…ä¬HôpŽ<ÁР@’”©4ƒ#¸ ˜ŽQ܃ ºñ„/ ¾pÅÀ- dX#ÆÞ@&3" C°Ã°Å%­%BYdwJ2™Ê‰Ç™ˆÛ2'¸´OzÊ‹9^â§þ¤Xj~”2NˆŒ¢–²l§! X€7‡Ó•¡œJ9â¤jªoö€BÚYæ@¼dª{b®C†Ê¢~‚Oå„Å>á¢HÒC’ÙÀ{ –UÂi°šà(M“+Q™ Ò˜­Ö±Ìüˆ?‰"s*½yb3-‡“ôod‚JŽä®ÓÑ›”4ÐÜ‹ÃF=­ÈÙüɲr²±œl¥×©æPåAáH:bògfs#X}é}S§È ˆ˜’í(¦c ’AÑS³“0FyihW˜”!S ™I£ojB…ÔKäï5è,‹jóªB•I)Z=Í¡0#§½h`š7ã•mзþø¥ªXœ)\[ê¦C5åª9ÓCCSÌúÑo<ƒ%ÿj¦uÊÏ@û Xò÷O´ED«9G^V=á©fè IU×Ë<¡@2¬F9Z"Ù“(žÌ [ Ñ>ºu4k)¼ò¸†LhKý΀ö‡2"MÅK—Sg>W–‘’a‘Ó `ÐDp€…y›‘œö„¶ dl˜€0°¦5Q¡¢iOk…Ù¨ý)Mœ­=´¥­4ìUÄÚX@ž°pþ‚‚|y–ÊÝî Æd‚$Jv´ùêîÈ@“× ‡H Eøˆ(—›çKßžà …ZÇ.͉ÂéÝ– “¢Aµèˆ#]Ô66£JÈÜÝxKÉ >’ý„ ö ‚5¼¡÷¶‘h“šÜ0X6vAB¸S„)œÈÑz ƒ^ESßÓ; .èv@äÐîx¯F/ÒŽ…Q )òßnR= D…0ë¡€Þ„¼Xçl[•ÅÔ@h³ü„æNÁœÓ‹Xò)ÊÓ8‚)ÄQþkl#)€Ž9 i“z@î1 ùŠL- PNÀ š¡Gä.’ 9¾’OÉ8,v¢~>Šÿ'|@”IBóñ…?êa¾x<, €€×Hæyé˼ª(]æˆ×Ûò@WÆô&2…¢NH!€%ŠE*ð"£C|RF#c2Q•uhQÓ0®u©§]±M$˜$)wS&*Šà>HÅTpõ0ÅVÔ¡! è\ùSkh•"T= 'dæ[g…LHAibBW §_Ì¡Õf‚¢ 5mÂR‚‘V6XP”ÀAZUT8¸9•€©ÒQ+1b3þñ%.aHkB…Q%‡"ˆY‡%^Éec!&ƒtÅÂÄR)3…*%XUÉ„„ZôÔ![v:íµa…bÆPaW{^Øcn$ÐQe\¨‡Òa%R‹"9'å!ý÷Rš1R,Ãp«¸eœ†°ö#-ÅEõ5:?FÖ¤Â6·ƒ6B[Óµ…¨bÎÁz[UEp’…rXÌèjý¤^C–ˆã¡cv9Ñоáeqbl¨Sõ¥¢LøóBTA…\çtâ Æ(5A\Ñ\­g„ òXt(vÐD€xŠF•ŒAE#RÿXŠføj_Q‹zF¸ :í1C8þ ˜NLhFˆ$ðÓÆ4·f` B4>èð°ñy/ ‘A%€`%/`? K !z2fzÖV2(UN%z¨T5õe 5‰AX+oX{{–?Áå:2ŠUxqÈŠ¢(s"âV8wc€Q eÁ7À!ò)%£âyå•Zª§\¸€C‘hÂO:) ‰PklàX#<%År #Êb0Íò, 1 S0g Á û‚-O -zð16(àòÕòK€° èò¦-v€€h3p q$p/ Q-7 iÒB`•ØÒÉÐÌ@ jsoÐþpjc V?Æ!OÈUZTƒË¡ÅØe1A'#Sõ€×äá¸g?4Cƒ(FCjJ4:â4\Sà=×–5O“¨ A[ãßö Q6g“6>" Äp–n³|†"7XÃ’*ôt™4N` ‡·oã Z°¬6e!ROæ8{%`X¤Rõ1Zòab i”cF`GFÃC«so°; 7=ð #`±<»Ó;€€0;µÓ =ðR<€àrZÔPÒƒ£Ãc;ˆÂ¢½³=:!¥0àƒ.‹ƒ’âèStIÄ>žWLAZDbZV×8YV`? þYv* ±t qUM¯±@%é@D4iGAÄP(i×Bk‡!4B|:|§B Ál:à Ž1so7f€zºñ…(Ã0B~šq’'Dzo#™§>r7œ‹HUãÔO:¹Y3ŒcºEšÝèX¾2‘p8oh¤FläFÇà{©|ä‡GœÔ\K vHrDHÄß×\‹ A¬z IÓ ª„IbÓyÔIŸ|``¥ô…N°’OÐ~¯T Q¢äQ ‘1azðËà …(Š«gZŒ¢¯2ÅeR±4£¸¨'pº”CñZ™òMèþ© Xå4kùªpuµa7ñN†¨Û%‚\X?i¡aKåDþÈLkòŽÄ—Œ@ x”1‚è!vüÃZü€GÕYHÅNø8Ι]Hõ2Q÷³y¸VP(I‡D‹cB Tþ'³öp(’hî±'ด¬…U EêdŒ"FS™•æT”1—þ“RÂè¥ùË)+‘q¦M—!P•‡c5x†+b°§+ ‘åb‹‰Q™´"ëpä8]ñDZ´Ö]"†@»¸‘³¡A{œ¦á¯aR—Q(°”µÑÄ"FijÈ'0q:âe3øÙø>šu2˜ËzsiW ‹U+Œ—E´K‡ þy¶lŹh‹p”k[qP¹8y’ ¸m¦áq0H—òÈY†è…€`¶Ð5ü\=s;€@¤8uòQÿ˜Œ¯"QöjžU¡Ãu¨•€Q @ܨ—±ñ˜µøUL6)+/É“ÎY§U¤„ÂH"a¦%ÑD.¦œ–ú4py·O¶‰$Ŏξœ+\cÛ”ІzA¿¹Rµ ‹¿…Iá•RwôއA`­â³3T¡•ܧdL&mQD˜Á)™*Q!\ŒVHÌôŠUˆSxe=·\û?I©“Ø+ kqO0-iv v7Š(<à,1i ™þYh# ½–¹šæÂ™ Æ3 ™O0 ò2~Óh Æä¢Ãð‹¹gàBªV·é0OÀž 11BÀ ™Èó1¥’Ár8L˜ai[•Äè*RŪÊX1Ûk&ñ¢£3'Ü—Wù3€ÉÆGÓlû©5gLR“¶p5=mëÙž`#6ñ9óI@nöù5mÓÎFlè 1 ð@y3|C8·NПÚ/  –ne«{€ª‡…G¥ªÍTÁ µêH‰å^4l#.a‰“e>²¢¢’(®̱s¤Äc"÷rëö;O <þœÇó£Ö<ˆBþ¤W)j(§¤Ý—s7ZG—tRZyŽRåYzt[Š)æ%ž8ŽÞŒ•Wä”j%X.èÁ;º 9qeu.v6Ÿblg‡I$:Ü`Èàv„Z~Ú 0€w”†j¢xSAx€0CqAz:ñew#ªG3yÒÜ:⺔DQà>ÝÜ!zÅ!•VO$´ÆpC›¶ªWì,\÷"S¬@—ø·'-ºG4½‡(¾Š¶pGgàÇ ÒJ4æ·K}ˆ´øÀHÕg€Ôª}7VñØžJ¢D4àÚ|ø÷Ðà~éÚ‚£¶Ä› á)¼4õÁàÑ–£þŠsH[#{Ržª‡ù+"Ó ‘·-†:Aí”BL(V§DnÌ´ÊÅÜGP½r%Qz Äf²Ó1kÏXYãáQ‚!×4c”ñE¿òLFx}Á™”Òì”&šÁ?OÀ³¶¹Ó2;‰N•|U»«µl¡_ȉïýM7W{Z×'íÓŠe:ǽ–P…z´[²˜û‡ªˆqUŒÔÁ‰¨´¾1½"ÓÄöÔ…*âÉ‘hJzO»ƒíl°z9Å{_~A²qø8$†Äã[™»á¼ÛÉÖ{àºT¬p˜ËÖ=É–—\Ö(Å&Ü'÷’#N•¢VeAÂq-MÝ5) &^=•=P¡2 Î÷-–5džòãpæûíCÎé.µâê‰(%Ò a ãÔ³ò,v%V0þ Y7Z˜_<þ2,6e@n¹-gL™i\0|0ür.Ñæ™š¢)/ôb0 xÜigr¬˜R‚`à²s~º0€@j8÷᛺ôÈð1Áä‚iêݿۊ>kÄĹŒU)×^äàGé£{_UcÓÛI4ÞùÊLËm#1Ssý™5øÉõ^Þ6c^¯dfÌwfŸêù$ÚIcˆ‚žÌó` €ÍDæc5‘oÃoðР˜²¹æRʵßÑ;ÁȈš¡³r[4^wº·Q+(ü-´¢~ƒ`6œù-ú¢|¤L <]<剒q3ê<=>†­9jþ2sÞb£51A>Ñ„âN_pèSL–t‹ÓcÇÞ‰{ulËæGÅæx¨Îÿí-a'XÊ×t_•¢«\§·_úÓ&D¤x:” ¨@BàOJ½MôB1$j„ºm‡CDÃC—ƺ ©C¤®Ø\“Õ-;=¨`A‚{$Øã`A‡ %.4HpbEƒ ÊäãG‚?jìG stRZ²Ä( K€1²”’ކU€àˆ|-S6#v¦  J$€ta†n€ì¾Œ¸7p‰=V .UúÄ@ìâP%˜+ƒÇ°jB‚PŸÔˆÇNÕ¦þ£è>YúäÈ'xnPÐ#퉯^OÀdx"ðÉ9#‚zs° 0ô|iHÖ&äxq¢ÄŽ!Q‹Lq´GÐ-‚Œ(›¶D8«žxÒ@ÇSKZ/U¸ü#ƒÐV]»í„G¨5°9ȃRì8ıvûÖ ¹?䉱þöê÷gGäÿ¢AŠXKÈ$@踉±ä¥F±¤4àÝàh ¶Œ"‚ʵ‘Ò¨¿‹:ª¨ˆ ´¸{O¾Å ¿ýð¿Ø¸£N53$mFÔæSˆ:Öº±Çåj›ŽÃ…r{B%•ZZ€áŠþ‹Ð@srRÎ6#e G!õ‹ï<æFÚî>’ú#©FïF<¿Û òÆÖpDÑ>ê±´÷æ´QL=ܱ½u:iÂß|)¦-á· é2Ðù ]Òü\ M»]Œ´Ò"4ÍÓs„Q¼!3"‰Cø>òÈAµÏ"/9ú¤Üéí&hî šT0P %ò=/+EÕØªM¤-y5EùˆÄ¯Xž0¬ó»ýXÕSYà E÷¼RÔOCÄ‘À ÍIô%FˆSpBœz°ðÃSWã²ÆlQÀV÷ìvS3¥1Ùr¿döÇøÔ,Õ Y%ÝÓºÛP xHkqË©7 -)îP™þT˜ò¦`W«}\]ÜŸ‡¥Y«Ï-\œJV6a¬¨ORš‚˜„ :ŠŸ¼nIã“Km·Žë,Væ²4C~Ö½4ͨ‡KªZwþµk€s¡í6= @hÊUJR²ÏÁún_þ…--7é/þŒ½œpá’83ÖÌÚ¤_3dý\ç!ŸxˆçeþÑ¢ØËÈŠjì‹»–QѲ˜Ó´Ë3+ø§ƒÞr´OUàµ%ÙgUNyc½]l¾]«àв„'9Ý¢"œÊØ©µfb¥´±'ÚPói3ȶ*œ þ@0𩵻»†¼8ßÑŒ[ 4ª¥½™ÜŠ©WÚ"¨kF9›Õv"¶-Q†é¬Ú¹ÔƒïÇ15Ë}=—åJdCoWÁŠÕê@pÞ¡zpºWèpî1Û™#þäºüxˆ|m‘•K)î,†À^ŒHûç¼zÚ†döøÌü,Ÿy¢º· Þ«ÈYbÄÉJ6æ`EvÑ;·l—%«Â"ÉU׎k4š„y‡ß¸Àü[ÊØµ²–þ!ÜsGÆÉ©«î<’ÍrS,Ž>CÕî7÷2‘Ïšá~O ÑC‘‹^¾·ÜjÜÌhzÁ1{¼ˆ»,K¨F¥ýa´<2g[eùðu šYßÜZpŸÕößóÞiï/¨¢vâfæ¦äت.–xTcAš¥Åäˆý3òAîíYÄäæ^sÙ‹6²W׿úÜDYçÐg{ï í襄Qd[ö$}|1ÉÂj¯L‰§ókŸí£Ÿvšš‹(¨ð:Öн”â«™¨Æs²Y•ø(þ©·[‘«’A¬L“3Mª£Z*0«É s ÀŒº¯ÁªtºÓØ)Ó‚)Fü‰ƒþøc?ÞXŒcA:092ò@©s¤ܶ7뱚Ñb*¸`K')¬9##½ºµ'³¯j6;s1z±›ãX˜ø¹âп{û–“㵑K84c'´ÒAD“3Ë3¹ˆ)7¯#¬F#?ê22jŠ”q’C@ªD¹Õ‘½ªrÁÚR3œ¤»7ó³VºD-B0÷Ò»ôÙ½« MŒKÄ6³1\°èSD1}ª>¼3-;óãa¸q*½¨5µ*ÜŠšX[¶å"°ë²ÅŠqÃÂ6%ãP:Dñ¹aš Y…D+¿à›P3°´­(¬øK=Ô‚“îÃ:™þ+-Â˵f¹$6‹N•sºÑ .K/C!I8¸G|ÌG}ÜG~ìGüG€ HH‚,HƒÕSLÐË\JüTMÝP{ûM ¥Ð uÏáäÏ¥ôL•R!MÕø4Q¹LÕ-/R"}Rî„Ñ…SÚDÓ$ÝÑ< ÎREÕ4¥Óà”½ÜO5­Ï õÓݼNýQÈÏÒŒÕ$­ÔÉ´PVÐ?þ­Ñ3Loµ8De„V„NQÍÕ³œU.]Í•TteÍ9ÍQ½S­PNuÑ{ Ìâ ÐëÔl%Vg ÕÒtRS}LêŒUi›Ï'US(]×Ú´?Ó14ý#J¼H‹%JÅØÍXŒHýØŽY‘åX%Ù“ÝX’UÙõX”娖]Y–uÙ˜ÍØ”5YšÙ›½ÙŽÅÙ’ÅÈšY–E‰PÐä!E_à„ßB6eRåºd ™¦y@µœ°T!´óRTæ saWØê¤VçÍU…•0ÖÍ*^Þ-Å\åd^ÙõÜ ™_PeUùŒaùá`6QxqQ…0}þ}aìlÑa**JQ@’Ö<‰:ß -ß ý×ÖìSïµÓ>=SiFµP,vUFÖääü¡Ìë¬Íz¾ =î×lmTàÜå }ØîågYµÍpžâc·R5×Åc (æ3=æ_MñìT&Ôof¸›*¾WxÕO6PéUîb õ\Ïf*:é÷åVÑÔ×i=hoh„¦ÑsÎdfÊr6禉eÞ¸ç‡ VA _ߌgIîå ›‡ÖLâõÅLvXƒÆÑU=Ž,GýŒë8¥L–`¢%R/6Ð%}^ÿÄS^vP†•fß ^\±Ò‰§©é%iëØ=;ÀLîjþ:Õ;¸‰ÃfÑ*ãŒ&a…NHÅWTåÕ@ý@ƬNˆƒÐì8ë¶eì*žW-žT{ÓÀ×zMiŒ9lÃÞÒD™¾Ñ{+[žh‚Þ2AsEŒ/ˆƒý<ÈÐ¥fU:  ‚E n:Pî:]9¸1u†—MЄé1ƒRèjø‚m(ÒlöÔ0e=ܾ›8è„̾eunèÞJÖ N ø€G†SwîÊ®OÓ½‰ 5À,åîå¤é³Tû‹‰™¨‰pŽí$fØé©QP %hXæ^V΀»Ô€M°€ ø ‡oò¤ëÁ,fÝô{ÐxƒP‰]þq àONÎÕy.)ÝìÐù¬"º¾‰$~_øMYèOÛ•QåöhëdîÒ Ðç å.LpÞë14Ú·R /uvÔ,H5øcN(ƒ/øpN˜øsƒ˜  =+hÍlØØ_n yƒò]…Wþ•EfX|Ø ð‚-€oÀ?ð‡YÐL2…ó€f8 0‡_€€20s4ÿíôy¦ƒNpU?'›ÖÍøÆ˜#è KÇtÞà ˜&¸ NЃ4—OOs:`sÂ0;óÖ„,¸óç põsÌ2D¢&´×Ó'Îe°¾L.8„!þ70 †GÇðm7.@:(€E€0ææ è (€ò›øðqOhpA­o"Р€o ˆƒÀ€Àüp¸sÀpw_îâæv.xôÅÛ äTšòÛ^Ñx×qÞrøFxå®2©mïöxoø—sW¨Ky¿‰u7w‡wøžK³³xq®GÊâ£/›êÍh÷žñÁÔ^huz8€Ѓðà.ú£øVƒSnŒ©€8 €ÀW×õòhŸOVyB t/ †L7ƒÐH¸¤Éx†Gô™/xÐEHúÖdǾÏï³Lö=ÞMþDŸÌV_nWÄpOsèi z˜ûpz=o|=°ƒ¤÷otïMª·z¬×sOàó⤪æyÜþÁ\Aü{—¤¥¢oÎ~ñàÞ€pÐæøÞèPH‚ÃpWËn§hõ™~Á¤wjÞOm?€r@ñ#X³¿‰_ø€o@ts¨­gt˜/‚~OØ€1XsOÌ'É ã¾±÷Ü…E¸‰Xñ™gôæÕhuî¿ËÙï~Œ¹}£4|õçö~ƒWk€Ð°Ê tT2H‡Ž¥F–Ò@¨Â’ ƒæè¬zâi¡  n¬òåË8i<5§gÄB4¤\I´8þ žxuRƒM'élr¥Á%¢ ®š÷SCÇGéÀ€ì¥]‚!6aÀ¾¶†@ǺQDSΰCçâE„žžªˆwáÑæÞÒiºðnA(FnÄ©õ,lØ‚efPHô2&Ë¡ϬgaNƒ6¹{Y¨KOoŽ:]%Ç §ŒkONTÑR†Œ@ Té“Na| òâR¼–më¶|{§ï·N=™˜ÛDBºÅIëF¾ð­eètél„Šj6váZ¿¸Ð9ì Í1Ͻ[½÷ÞO5ð6.¼útøðë÷ݾ rþ€²kÀHC©ðÄD–Ü–ÑFž0·Ha÷ào¿·þ„xù¦yì‰FZ^)t‡âÕÝmÒA_ü°”…¤x^æ8ZRÜ5åb{ñvÝxÖ•¸ßªwâOÇÙ¨Ô[¦Yf‰€؈ %W›AóÈ¢uO•hÜZ>:¤Œœr–aéÜ}*$æoÇåV&„хЗqúè›rNaùTw"’‰›˜Bß–^ÎèKäßIm9´ ©]´äéå`~\¾—áaú9!~%udŽãá‰boìEX!†î[?áy^i£}”i†jøž…¯ªù¥xs~:’(–º‘‚QdÉ>4%‚–­’Ð[ 멪Äv„sËþc~ÉdYG"fXc„¡â'*±~2b%€ªêIqéi (­3’I¡ŸÏ±%,•crJå™±R©B#ŒEu·,m«P¬BÅ_l1Ư¢±Å_ÜqÈ“¼qÉæáÅ_´ºÈê«é.HgÀü„P,ŠÔ<Ë=12Ç?Ÿ ²È" }²Ñ]2ҸƶԒº_µ ™`‚&ÌSµÖXo]uÖ^kýõÖ_‹=6×Y£¶Õ\cØçœâq‰â·#V¨î«àýù[¶=S.vY_ öÙ‚ƒ]¶Ù]>xÚ†/®vÙ_ƒdHN>ÑZ’›Ä_îôuÔuNœè§=7ÛK§£ž:u¦ëþ–«Gš®ê/ç_zúæÜ>ºÕæ¡.–guˆÊ—zè;åùéŸï9lë.<è¡ÉŠWC*!‘gDc#)ÇO‚Ò‘eãhH3úFaÔ#®GE!08±üv*e˘y —^j•‰´·ž„|Øñ_.7¤?yÂ8¹Ä¥‰ h7^ 3™æ«Ttªy¢dB‡™ÒÌ¥·I¾#u¯{1£ÿ&ç@XÂ@ Ë&}tÇ­wq‹B¬š ÁÕ+}Ivl™¶8Ï‚ùê…yÊWÝÀDÏxôžíÔПJFäzñ‘« ö2 ÁÊP‚€ä³(A%ª¡tË[édþ(Ã]±s£°Èt³—Õ­¥.b)R5¢Žª4Q/eÖ“Ðé0•î]Fbh@"¸m ]~"Ò z¢‚õšîÒ`¿zƒæ‹]w*T‰<¨&#ÕŽ{BjY¡V¹VN¯¦´Û‘ÌÚÕÐW kGHÅèþš¼½5Tb*Ìl«‹®%ÍÎ[ÄSºÃú+`ÈŒë‹d>±Š 8mÖjz@)ÜøU•áÞ è¯æóDÃò…‚,ñ5³Á è±`çÕr¾)³î´'¬:ešt®¾»¦÷¬™u«Gz!-ãVÛrvUonMH³*Vz)Šn4 Ö „‹Ì;…•ªH•›ƒ¶{þÔ`!´VA­¸ÞD9¨©€ÝÕ|À‡Ì©†7Qˆ¢àZÊÉ9àI€œÂá§å£ÍÊt·õµ+x‘º7’Ô¢áÁëG]kÛ?M„a¬”Vy”fá)‰B»"Ò2ÜD#^ØÃ!â?lÅ#¶‰C4qý´(â-†ØÃ~1DzôFТ‡%ÕíÈHNú8È@^#‘ƒ\ÇFn‚t#\dBÙŽCN2;éãJöØÉQÖ2#»{™iГå4§yÉ0W¤ÌŸ`‚švÜådö2);iÊ™·ñæÅ¢‹Îy¾ó™#Ý””T²ÍÒ£ þ¡'éL:͢¿7Ù‰4”µ5×o¦ô ¾sîÍ2‡Ì`x–™GP—3Á•ñ(€¼‹2ûŒv&Å£ÔUŸµ¹Ñ¸£=ð„V{ivF` 饘ó‚;0cf•šYRê!EÚ´½k5G†Üõu=B®œç\±µ!çWm™Ï37o â¯P1K[fËî=ê„°eîŽ{‡[*ÈßZ—]ïžWaå¹”ëø ëÖß´ª¥¹9»œ’x¦,Æ‚µ‡PöꋜKn%ªþb'X-‰í£Ïö_‡ûyùj³æÑx¤)Vºbüù"iÒä¡8˜v}çKPÖîµØž´¹•´YciÀîþÅ’`I¹ —ôÍS3éSˆDŽÐáÓN¸MùÊ÷}_Äðžs, S:u]Šó}]u•Ÿh†ÀPSïÈoðº¤^r©š|!ÅÍe¦|»ñË?áÔg½ÈŒÔˆõ1ÚVeŠc­V|aG©PȲ]„oE”Êñ˜ˆàË·ÅNdáV…|A½¨ÛªÈAsðßæÖÁžš D—€¾àÞWÝ—ˆ¨i½[÷@Çèu¬žë‘ÕB‡@4J·DÞIlõDØÊŠsðÝ€t^¬QÕU”óU`^_‰€9¬LR]ÔuÀa€~ÀÜ:hƒZ‡QÜ»éÈuø¨Œ‡'R”þ9|-"ÄÄgÜÎw0Ÿö|"0ÂäYÎÂXB(H·] Aè€X…”»… Q,Äî=šÓÕ‡ÛxžKälð×Uu†Ú iùFöMQp4âÌQ|#[Y[ ì^?åý!IgäÞˆT"™œáœ,Û[Ø›±ùÔ FŒlü‰®xÀ€,Xp4¬ÀP,ä+x'PÀ üÀU4Ã9H€ÃèÔ‹TЇ_vTâP\FÒPÀ (ÃIp PäF6üCG¾±0¡ÜÔWâAÇ="BF$L¶ˆ'($C:&Œ@Œ‚9ˆÁ ¨ÈZHdLŠÊì¹Õ|]Kœ Hþ€àB€…D6¡R˜a¿ÅÅYQ˜BtÚ˜È@h@€ÀUœ ÁP ƒ]Ò1hìÀ[ÀÈ¢9€BÅ^v‡á†ý‰È,~*`T&\&^Úåa>J h(¸ÂGœæeòÖèÓ8¶ewÌ¢P ˜Ã B h¦#êê•HÖ-„Cøc¨MÄq£UGØD àÀ]l¦K<¬K°¦X8¦’e_qD¿EˆcžÄfŠÀt‚4Ð=p§4†GbÇ„¤²A¢‡ÜÌ©üY%z‚ðƒ'l§þÈ'V¦K@Â%”8HÖ)9ÚZnd*`ÖTèOhåÝ‘†^ÌJXe`´±©àʲK nÈj#ÒJª° ©4+ë)›"¥Á©^ˆÞF JTæ(„ïÁ‡’«æ…#‚ëãµÌQTaÉ‚_ª-î9ÕŸ‰Oéõ—?ÙÕqÔ©J­UвþZìQÔ£œ¡è°\r×ÑiHÌFœJ= °mÞΜĩº^ !’§¯ŠË»Êá`Á^1 ØúŸ«ù›GŒÛ”Bl]P EOÍ„ DM itmàæ ‚ ˜˜<[¢PãñihzŠF‰ãèu.©ù b^»šT¯> ÓNj™ˆíÕÚ¼PÒí›t­'ô£,‹f0‡‹­Xuï6kwíJG@ьɌ¹ØîíM•È<¬Š¯‰ÉX‰}‚ÕœoÁOÒâÅæˆjLXø¶ rDà˜Mã8Æ¥Mר/ÅÒÁ¥ïàˆPûºï -tTÍÕ4ŽýŠœ þͯÅaœ}uûίÃYœØtÕžÁú”IàæOóOò?ÏtAólðg0ë0Ï#O«ÕσðèTps9V{ÍÇ ‡Ž §I} l]#8Œ“hNæÉÝ6AZ ¹.y€–ª½SÓ[µžÿtSÓ^ºÖС‘Swßþ˜O4-oREíÃV4åZÓ|„¨læ|ïUzqÐô)mÍÈbí>Á‰®¹ éÉÓ*¾¬é=  špkå-;¦qÄîÞ›å¯Zjo1²ñ2rŒ=r$k¯#oï#Sr©XýH21E詨AG˜]é‘aÒÒÕ\þ“-Y•­ò-Ò*Ò%))±r”1] ¥²ù$™òËér+×ò—Å\Ò'2HøB7 jZ2UÊSõê¤Ys®å™ÙYó4ÏÙùe³4í!#7‡38åÙ¥EÚ:ПÍ×0Á3ràÒ£6Cà+NSßñÚYÄDø#pìªÁS­9AçªýB›-Aå``áÚv^tu#¾òZSøÄÛBgmt Kjhå9#6ÇòýKв¡5B`Žžºq#‚Ñ•‰F  íU¡7îG=F–g]ïv¥~õF¸!‰3ç´PT«ý™tå×sA,­™Û^PÅþ[BsË CeP?áPºiÞíD,j¹ÈÍ Œ Ö¦±@«3«åæ´5[Ãu„5Ë[¿ujÌ5åȵ]Óõ]ïuøÚ[_ãu`ö^Ëu]Ãõ[Çu`6_+vb6åܵ^7‹d?v^7öc6`û3”øµa¹uC4Ëôô£Y™¶Cä©\³õgû³?ß5å|Zl·ö_ÿõ§c³ødß¶“ضn{ò„¶g˵p‹m‡6o«vj÷£'—6iw0F˜p×6s/6æH7hë›hŸ6\6s²I‰iãvjc?‡/1Zvj öo+çdOi·¶r¦åy«Ò§™•'Ÿ÷ô©à7ö0·¨)·Y·xo·]GXvË··­µ_CPdv~×uo«·hË·x7s8ƒË÷ds8¨Bˆøˆ§Á>ø‰—8Š‹¸)¬¸ˆ›ø‰¿8Œ«xŠ«xŒ»øŒãxŽ8‹ç¸£¸ß8¹ŽÇø‹û¸‘ùŽ·¸’Ó8‘'ùˆû8C¹Œ»8Xù•cy–kù–sy—{ù—ƒy˜‹ù˜“y™›ù™£yš‹y@;PKcKìa·â%â%5Pictures/10000000000000C6000000C143C1F71DF62AFF4F.png‰PNG  IHDRÆÁüX²sBITÛáOàtEXtSoftwaregnome-screenshotï¿> IDATxœíyXW÷Ço@öUP¢‚Z¨ .¸[¡jÝ÷Z—"Z+þ¬o[EÁ­…¢u«¥. b­-¼Õ×¥*E T”M,ˆ‚ŠAÙÂ’dæÞ;¿?ÆÆ4›&p>ÏÓÉͽ÷œ„Ó;wf¾9‡Sõò`aan{;ÀÒÙ`CŠ…a˜ ©òòò+W:õu¶éÖ}à;ƒ–¯XQSS£°½ôÙ3«®Ö ÿ1â K»£Cÿ'55uê´éê ¸pþ>>>2óæÏ×Óërøð=íìþþ»<þ÷ø†ÆF ùv ã›I7èQûöï/~\¼ÿ>?K»Ã‘lÏSSS—-_÷____ù~III³gÏŠŽŠ’§ÊÊÊ~nîò¡¦¬]Â矑ŸŸáÂy>‹ÖðúÄçãã5{ö¬¤¤$™N*â `jjj` ýú „:í,›í¥F•êxèëë»çÛ¨èhg×9sçîÛ·ÿùóç*ÚY:7²Ûs™¨zc<ÑÌ™3û~^îáÃ?xxxœ=wÎË{ø_ý¥¢¥ÃQx«“ÞW­YóÉ¡Cß½1žd@ö3 ÿÈÈïU·³{©N‰ŽÂVz­š:mºŠÍµ2x<ž}Ïž@Ív–N†âøøø”>}bhhøÆ)jjj>Z¶|þ¼yôε„k×#¾ WÖΨÿ,Z‡Ò¨O##£wüîСÇcŒvîÜñᇡ°!ÏY´Å{)–£j•ReÏRØ`};aW)†a•, Æ ð!ÅÂ0lH±0 R, Æ ð!ÅÂ0¯ou^‹¿ÒŽ~°tþu÷|úÌ9íåK§AöÌϧcÚÅ–Îÿ´<ã[²l¥ÂÞ¶¶¶eeev‰¥}°ÛsÆa@‰ Œ”b’€XH¢FÎdª9C,Z…W)bg3ànÎmš³Ò\üýý?.ß>wîÜ~ø¡íýé|h0¤šH’˜ p}©9+LáëëëââBOŸ>½ÅáÕš± žøÄðúS²^H´}H‘$©««Û¬!ræ´À[mFƒ«Ô¼!f˽»åoñ梁gllìøñã{÷îíîî¾qãF¡PØ‚ÎþþþáááK–,quu=tèBáééÙ«W/Ÿ+W^ÝËmjjúôÓOœœ<<<.]ºD7JN|k×®MOOß±c‡­­mÿþýéy† Ò»wo??¿ôôtzˆüüòc‡þÛo¿IœïÛ·ï­[·”y«ÐJÇ£êå úß/§cÄ"Ñɨ#”ø|¾²·”ñàÁƒ¼¼¼7v‹‹‹KNN.++KKK›0aBhhh :ûùù¹¸¸¤¤¤PÕØØHQÔæÍ›=<<ËÊÊRSSoܸAw0`@LLLQQQXX˜££c]]EQsæÌ‰ŒŒ¤§š6mšä˜¢¨àà`??¿ÌÌÌÒÒÒC‡¹¸¸TVV*›_f¬··÷¥K—$/œœþüóO…Þ*³Ò8u¤êå †O|EEEEaŒ1Æ$IADRR’P(‰Db±X,ËÿHfÖ¬YôŸÏÿâ‹/6oޢ̄ŠÎÓ¦M£uhhh(N:uüøñ±cÇÒ%3Lœ8qñâÅ€Ï>û,***''gäÈ‘ÊÌÕ××ÇÄÄ$&&:99V¯^}õêÕ«W¯N›6MÙüj"í­2+´Ÿ‹æ…”­­­L‹ÌÍO„³³³ŠŽ=*ߘžž¾k×®ÜÜ\ú,f`` bé¿ÍÇ!„Ç—Ÿ¡_¿~ôdz°°PýkÕ‚‚áèÑ£¥GŽ©b~5‘öV™•OÞŽ4/¤Þx÷\u<V®”½5/ —,Ymaa‘––¶`ÁeÃUwÖÑQëãp¹ÍØAbŒFFFÒíjîu8ŽôKŠ¢$ÇÒÞ*³ÒaìÄ[|SSSh‘S êÁAbHŠIÑçCCAIkD$A"PTÔ{¯& ‚ÀÀÀ.]ºòóóUXQ¿³³³³ŽŽÎ­[·ÆŒÓÜÏÂãñ${zž7nøûû«3¿ôX€‰‰‰d|ùò¥²+eV:"Œ]ñ!Œšy¾cî ñ«lRb$h6t Å !Ñ-"R4˜?ÐÃnƯ¿t[[[==½k×®JJJŽ9¢ÂŠúÍÌÌ,XðùçŸ_¿~½¼¼œÞ>«ùYø|~fffeeemm­™™Ù‡~¸yóæË—/———çææFDDäåå)›_z,ÀËËë×_¥7‘_}õ•²R™5Ö*˜ ) a a ¡BJDM¨±64¯BŠ„$ÂQSX2ÐÌÌlïÞ½!!!žžžëÖ­[µj• +Íê¼}ûö3flذÁËËëóÏ?‹Åj~–ÀÀÀÇ{xxŒ1²lÙ²íÛ·{yy-Z´èñãÇ]»vU6¿ÌØ   ƒAƒMœ8qÔ¨QúúúÊŒ*³ÒáxýÓÐkñW¦Ïœóó阖)ND" aŠB¸¾ÊØ*"E"HˆHѱ?>úm1 0M'ýO3ýYXÚ™˜è£ŠÅ--ãCgٻϛ<¶Ë´÷;Å”9­EƒdZCii©———L£››[BBB»øÃ¢>ZR={ödå~V‚ÇÂ0lH±0Œ¦N|;²¾ÄŒBíòÚ«!+,ZˆW)#ç¾&NêäÑW¦´ÔB\]]“““ÛÛ ­FS!Eb’¤È&±ˆ„PC&X´&O|;s6Ñ·ÎB„˜ Œ®Ž„pMür„„ðØÔ4§-ÑIj‰m “«ÂÈÉÐÑÉÐÑÉØÉÍÊ bHQÀÍÚͽ»Û~ÕË•@ X¹r¥£££···D~©ÿ¯¿þzáÂ…Òåu’MMMŸ}ö™›››““ÓG}$)7¢Pí©LTY__ÿñÇ;88x{{Kë3ßF¹¦z0¹J!„(0…ÿnxZ+ª…ÄÅ€ƒ©3TR‘‘‘[¶lÙ±cÇùóçW­Z• B'süøñ3gÎ :ôæÍ›K—.§;?~<***&&¦©© °qãÆ¼¼¼Ó§OmݺuñâÅ¿ÿþ;‡Ã wuu-))!°mÛ¶ìììcÇŽÙØØ\¸pañâÅÉÉÉÖÖÖŸ}öYIIÉ¥K—¸\î—_~©ZÄ,qOÚ e37óÛí00ºJA”û2÷™ ÌÚ€Ob )‚â¢del53æýiÑïù™(?vôèÑ .ìÞ½{@@€§§ç™3gTò÷÷:t(=jÔ¨Q’ÎÒ:Éêêê .ìÚµkðàÁÎÎÎxðàÁ;whµgxxøØ±cù|þðáÃ}}}iQå¾}û† bgg·zõjggç«W¯VWW_¾|y×®]nnn®®®Û¶mSý?†¼ÊfnÁ×ÛQ`RÕIß,ºÐÕ +LQC (D¡ÇUEöÝìí¬{b€ndÜ”ŸyðàÁÒǪUSY&}œ››KKë$‹ŠŠ0ÆtälllzöìYPPÀåråÕ˜ÊD•=¢(JâÛ€ÔÙuV¹¦š0¬ê$¤% C‰LQˆ‡ F˜‚\Ž„­-ÏG’¤Âc5Uò(UÞ¹s‡Ëåòx<ú%‡Ã‘>–îù6È5Õ„ÉߺÄ×Ä/7×7'0 1$)(„"ˆ1¦(¾1¿ð飤ô”„´ëHѹ#;;[ú¸oß¾* eee½±³££#—ËÍÌ̤_VVV–––º¸¸HÔ˜Ò%¢J™Iœœœ(Š***¢_>}úT$z¥ýj®\SÅÇéd0¹=‡¹uëÇápŠj‹\,ݘƒ¢º.G§ôù³ß×(ýfoÞ¼ùÓO?7îüùóôTJIIùñÇ'L˜pîܹÌÌ̯¿þZ¾¥¥åÔ©S7oÞ¼wï^z{Þ¯_?OOO‡C«1ÃÂÂúõë÷øñc‚ ÆŒC‹*¹\îàÁƒ«ªª®\¹2eÊww÷÷Þ{/,,ìûï¿çp8aaaY&-ל1c@¹¦üÌê± &CŠ„”S™Õßê’çOž½(CY›[Û÷°' I_X)#000!!!88ØÆÆæûï¿—ü–\YçÄÄÄ­[·ªî±uëÖ $9räÈ“'OÒg«íÛ·›™™mذ¡ºººgÏžÁÁÁ€++«íÛ·———[XXx{{Ó¢ÊÝ»woذÁÃÃÃÂÂbùòåׯ_§' Z»ví AƒlllÖ¯_ñâEeÞ*›¹³Â˜ª°âÂ"7;7Š¢¦nçßþuÉEÀ¤È±>ƒ†“ˆLNOIZŸÚzýýýgΜùÑGµ~*faXÕ 2£ "„"ÉW&ÑÛIE±OfÞ˜ ©˜Y¿È7^[«à–ÁaU—ާê”$Æ`ÑNX  ð!ÅÂ0m}âkò›J‘$EÆI×ÚØ4KÛÐÖ«%ëÏšF-Ì‹×Ðаxñâ>}ú¨¾½Þؤ­¤MCªqÜ$ ¡¦gZRqqqOžH!2)üõfÅïë«yÏߨ8œTq8©âÎãúy__•¼õð¹èÂ=A\Fm\Fí_Ïš$oQUUUeggwçÎúeNNŸÏÿã?”òóóûÏþ#y)ìíí %-ï¿ÿ~LLL]]½½}bb¢ôXÚVJJ ý²¢¢ÂÎÎ.--M~ÚæzÅBQÔɨ#U/_0\€1@Ë4$XŒ¹€’ݦ´ ¦:É0j8U 5¥§mY–NÀl®N$€næææÆ³Fö¥÷L3Fô­%¸]ôtô¹\].Êm~•åÃTê´É0[^\&Õgs½b¡aòН²º~ˆƒùÈwºs3ãqÁàþÛ>ò þз§ýsˆp£uὨ©“¥"¦:(K†©Pé¾P³•^½Í0Rg¾˜ߣw¾ ¨!p­”Õ§ :Å5œ²ºWËǵ1Ññ÷¥ï¡[ZZÒù0 ‚ IR:¦:4«BºúBÍVzõ6Ãð×w³PG’ÛHA‰ÄHL"Š¢Ä$Òá^–ºùOäGíÞ½›ÃáxxxŒ?ÞËË«¹ùœ›U!]}¡f+½zka2W'øçúè¡}_4r^6 ¡Ìô…NÖýâ‹iÅìc¾Î ó¹:g¾˜4?,þbZñ²In]-ÍôŒºÀ%Åâ5uÛÎÝìcã·æ•tдRÜ ;;.šÒKµr5b…ö*†…a4¨=¿sçýX c÷!„úôé3vìX++«Ý»w3h”EÛ`òÄ'‰è<*AHj÷bŒ]]]Åb1B¨¤¤äæÍ›ªK^1ÂÛYú\K`r•z÷ÝwAˆD¢ººº§OŸ¦¤¤¤§§¿xñB Ô××WUUuíÚõÛo¿•جåm\ý×_õññ±··wssûøãU4²Ð0¶JÑ×wcúñj]]ÝíÛ·ºtéR]]íááèÞ½ûÇéò›7o–Œmnò6«ÀNQÔúõë¿ýöÛ‘#GÖ××gdd*++åY^Ôª399¹¢¢âþýû·oßÎÊÊ:uêÔÎ;é·Ž9ò믿&''ÿþûïÉÉÉ=Z³fd 2Y¦2C~~~ëׯ—¼\²dIhh(¥D–)/àT¨öTæÃƒìíí«««¥;+ld¡Wu …BúQ?Aººº&&&’G÷$ùºd(Ƹ±±QZÇÝ‚åmV½oß¾žžž>>>ãÆ9r¤¿¿¿¡¡¡ÂFÞ¾m0¦ê¬¨¨ÈË˳´´4hý?}]]ÝÑ£Géxâóùt}àéé9pà@kkë»wïÊ lnò6«À^__íÚµ½{÷666öéÓçàÁƒ=’odâûë$0¬êܹsguuu]]µµµ‰‰É”)SH’<|ø0ý[€††’$/_¾ÜÙ ìZ ­êdø_pp0BÈÀÀ€ËåRõòåËòòréÛå­Œ'í‡y%ÂþýûéƒuëÖEGGÓWdÒûqu`U ê¥$±ÕØ ìVÕÉÂ0šZ¥’““ëêêjjjfffªoˆ³t4RåååsæÌ‘¼ŒÕ!mƒÉ’^™ÌÌÌòóó]\\(ŠÊÏÏ×××?uêP²b544¦¤¤èèè*œ\Ù½ƒ¹sçŽ3FaÍOÕ°7#4“!%½2=yò$##ƒ¾Ü+(( ÅIô[ò+–¤®:[˵ÀØöüܹsººº÷ïßÇcŒËËË îÝ»wïÞ=CCÃòòr„„ð¯¿þÒÕÕŽŽ–+©«nbb”?,íc!…1vss‰D999¹¹¹eeeS¦LY´hÑ¢E‹¦L™RVV–———““SSScnnŽ¥ršÉ×UW†@ X¹r¥£££´˜SšfÉ8¥ 6lý‰¥•0REÙÚÚÚÙÙ™™™™˜˜ØØØÒ+Vaa!ý쯦¦†  JªJgttt@@ÀÔ©SËÊÊ<¨ÂDdd¤¯¯ojjêÒ¥KW­ZUPP ÓaãÆ§OŸ¾|ù²P(\¼x1m(444666<<üÖ­[Ò£¶mÛvþüù³gÏJNÍ,­±½ýÇÓ×××ÕÕ­¯¯×ÕÕ­««£Åq$IVWW‹D"ú'´°&F½páB@@@@BB™3gBBB$ïÒÓþùg:â†zçÎ~ýú:uêøñãcÇŽðù|iŸ7mÚ”ššzîܹnݺµêó³ücªN:J(ŠÂôìÙ³©© cL—611ÑÑÑáp8!„PËBJ’9“>ÎÏÏ—~·Y2NšC‡q¹Ü+W®¨>°4 ÆT!úQ1I’!’$9ÆBØ¥KºAt£äçÈí˰aî]»vãÆÙ³g··/&÷R·oß®««344äñxcz)¢(ЋŦ¦¦\.·¨¨¨e«Tvv¶ô±Œ˜³Y2NOOÏ£G~ùå—ìsCa,¤,X0f̘ëׯ߽{—ÃᘚšÒJpúw놆†ÆÆÆ%%%¹¹¹óçÏ_³fM Lܼyó§Ÿ~ª¨¨8räHzzú¼yó¤ßU–‡Su…÷Ñ£G÷ÝwëÖ­KLLlå7ÀBÃðcã%K–ýöÛo&&&––––––ÏŸ?ÏÊʪ¨¨hY0Ñ&$$x{{GGG+s*ËéºÂûäÉ“#""RSS[싆UŽ;FQÔСCkkkŸ={ÖÐаzõjf\fÑV4’«SŠ+?üðEQ²Â¢…h¶\vsŸæ²bÎN€vU`gStvXU' ð!ÅÂ0lH±0Œ÷Rk?B#ˆDǦžajZu$ ,íˆFBj]Òò|Ïnïè"Œ"Á— ëK*ŠÏ,ú_ë'ï¬ÐéÓ§Ož<¹Šgmƒùß§IËíz;™÷åpxA„—ËuîæÜÇÚáƒ#“[? $ ZRQ]KÜÐ4̇Twý=Mì!FáÂ…Ï „£^6½zXò©­­]±b…¤Ö¹««krr²ÂžòPõ+ª7Ë´²Ôþþþ{öìY¾|¹»»»‡‡‡äy³Šþ2nÄÆÆŽ?¾wïÞîîî7n¤Ón­]»6==}ÇŽ¶¶¶ýû÷W1a€©ÄŠ4«ÿ0*统ò¢Žf\;sþOÓçœ|Ʊ)ûn‡ïNÛµ3i˸ðò£–-[æçç—ŸŸÿàÁƒY³fÙÛÛ«(L½mÛ¶U«V½¶¸zõèÑ£³²²>|8wîÜñãÇÓÚ???:±bcc£²Ù”™öóóËÌÌ,--=tè‹‹Kee%=mÿþý322(Š:{ö¬££c]]êþ2nÄÅÅ%''—••¥¥¥M˜0Î IQÔ´iÓ"##%Ž)›P›¡+2R_^´üÂü¥gç,úe¦¤qjäÄuçöÞÛ¶kÔN/™!/_¾´µµÍÉÉ¡_æçç«®u.RêWTWˆ2Ó*Ò‡úùù…„„HÚ]]]ߨ_…‰‰‰^^¯¾éjnþR-A#Ø¿wJr<çäû±^$!$1‰1 (3CQQ‡Ã¡W{€«««D²÷FÔ¯¨®l¸BÓªÓ‡J'(355ªû˸‘žž¾k×®ÜÜ\ú”'#„§iAþRíÉ ìÒÌ>áI˜r`,$ߦGÑ n" )RšC©;ò…kU÷—vC(.Y²$ ::ÚÂÂ"--mÁ‚Íu@ËÑÈ­ÎYÇý»›uïnÞý½ýcº[öë=ŽÃãêpt‹Š‹n•-ÓÙÑÑ‘¢(IVàÈè™T ~EueÚnnúPõû ‚ÀÀ@KKK‡#-ŸçñxÔ?b×ä/Õ˜¿/5+Ú¯›yG['ˆq;ŒQ#Ñ ÇÓ{XXPTôX¾¿••Õ¤I“6mÚ´{÷n.—»eËú‡êØR–SMW•™nnúPõûÛÚÚêéé]»vÍÏϯ¤¤äÈ‘#’·ø|~fffee¥žžž¹¹ysó—j̇IB!DRc„(,jÝ/yPü¸8k÷_ ‡ìÙ³gÆ S¦L±±±Ù²eËÝ»wõôôÔ4§,!§š(3ÝÜô¡jö733Û»woHHHhh(ŸÏ_µjÕ¶mÛè·?ùäSSÓÜÜÜæ: =hDÕ9é[ßî]»C„Ÿ<)Be„ç¨éÐÓ§O½½½³²²Úþ‡uíhºs AUgüÿ%ÞéI”ºM­tÙÙÙõõõîîî/^¼öññi³?j;šî¬hê±ñÍà´a›¿¹‘H´yóæ§OŸêëë5j×®]ÌÊ;UÌ&oºó³H£A%‚üÅ2¼½½åŸÀ0(ïT!Uhš¥5°z)†aCŠ…aÚ.¤æšÖf¶XÚ‘¶ )‚ §FNTø–¿¿ÿñãÇÕœgîܹ’`òViIDATªF ‹/îÓ§ÂbW,ícÛó€Ë éŒ0FA|bVÜ’¸Ù„„FzÆnvn/k_Žymc«¶Ã¾¾¾’G.KáÙit›ªaòŠoÑÀ¥ (ŠÂUXY°î›ðL\z¹êëu# uµè*Š|B<Õ¼_¥éß.KžL¸ÏlåwÀl2 (LaLaL¡>]<{{ÖÔÖèêèÒÊ‘$‚$ IB^¶©©éÓO?urr’–J*DrâS3É'«Ûlc[¥0Ä'îCq1¯¯µ³»m +J·èÙãçUå?/çw³E>z\”¦àáÌáÇ7nÜ4jÔ¨7žË¢££éG`‘‘‘*ºmذ¡¢¢âòåË'88XRVYEÙ÷'Nœ8q"**êܹsgTô—©üÎårCCCJKK·lÙòÍ7ß„„„ÅÃßëÖm‚ukfh=Ož<áóùÏŸ?o_7:+-¹âk ˆDÏ^´™9 ¬n³i»jV<5WÕÉê6µíÊÕ)¡¹I;YݦöÀJðX† )†aCŠ…aÚ.¤ý¤Ö$,åÙ´d¤k¬ÇÓ% ‰)„ø~å´é_Õñ´ªÈ «Ìl% ŸøÖ$,ígéÞ×ÒÙP×€ËáˆDK≀°¾¡Q~ÔO|¬2³Áð*Å7²íjØSXLE•ùÅÏ‹!D¤ˆÄó»ÚB„ŠŸ>–Y¢ÔUfv$|Æ÷ño f|•sðpÖ¾y?N›}Â_úÝ1a>£v S8PZ¨)«Ìì(0¯ê„éþ®.…$Œ[ú¯_%\ÿ<¥eAÏ*3;Læê„$!!ðH­sìͰÊLí„Éí9"Q]ƒ@…–&V¤ˆœ¼o #Ó²5;LnÏœwvý…5Žü>@û ôùëÙ½±á# EMbI@H"„PÞw›5-›Q³cÁðߣÒ=kËn"JÜß~ «ÂB˜B" aŠºw±Ó²ÊÌó¹:'ïÓ£+ßÜÔÜØÄ˜nÁFBEatþ—‹…QÅ­ñ˜Í¨©µh*WçÕ €á!ˆDôÓŒ)HBŒ0„·hÛÎ*3;šzÆ÷ç¶Œæa•™-Ru²ÊÌΫ—ba«TLôQ…]¿Þªì- ÿºâk_WX:¯C `l¬nµ`eüëÄ×ÐPß^~°tþñ‡9'‘éÔIEND®B`‚PKcK3é…Ÿ&Ÿ&5Pictures/10000000000001E100000118B3A2F8FAD46BDA31.gifGIF87aá÷€Àü p(,(@@@@DH@DX@LHH@@HD@HLxHPˆHTHXHHXhH\˜H\ PD@P\˜Pd˜Pp°Pt°Pt¸XDHXHPXPhXX`X\XXx¸XˆÀ``h`hh`lx`p`À` ÈhH@hL@hP`h``hdXhdhhh`hlhh€ hˆ¸h¬Èh¬Ðplppppppxpx€p°°xl`x”¸x¼¸x¼Ð€PP€ˆ€°Ð€È؈THˆˆˆlX|h¨ÈÌØÐØ˜XH˜\H˜˜˜˜¸Ð |` €h¨`P¨dP¨Œx¨Øà°ÈаØà°Üà¸xXÀ„XÀˆXÀˆxÀ`À¤ˆÀÄÀȘ`Èœ`ÈÌÈÈààаhаpд Ð¸xмxÐààØÐØÔ˜ØààØäààØ¨àØ°àܸàÜÀààÈààààäØàäàðôðø€€øü€øüø@à g@ BXÄ8ñ-ïÿÿ¿@¿ÞÐîué@- i¨A˜¡ñ¯ÿ¿@Ä-@´þAð0ô;ÿ¿¨Hñðÿÿ¿¿n ´@@ 0 ™;g° IdXBïÿ¿tùØB0 ;iðôÿ¿h ðÚÿ¿@¾Lð @Bkà g ¨Äxñ-òбÿuŒ ð@á¨ALu±@ piBüĘòðò‚ÿðò@ð¨ôA¨Lñÿ¿,Cï@ÿB¿,áþßH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\™ÑH'blò„¥Í›8sêÜɳçÉ-$Þ I AàŸH“*]Ê´©Ó‡Y¢fyS¦Á-6˜!ãÁÊ .Þ!òF …7BZ¤H"pIˆ=JK·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸.œ‚YàH˜aÌ.?|TñÑFà‚7b,¼¹¢ãË…7lœ… ä×°cËžM»¶íÛ¸sëÞÍ»·ïßÀƒ N¼¸ñãÈ“¿Ž ùñ@&9\Űà –@¼q£a Š3T þÈAC ˜†<]Ͼ½û÷L™”/Ð˃BDx³àŒ›ÏoL1Âo„QAAg¼±ð5èàƒFh}r9'PD! 0¼¡„<ñUH! ´PÞ+´ÀÆ(ãŒ4¶Gá7Ö¨ãŽ<öß9ú(äD™©ä’L69’NF)å”QB)Ðs å–\véå—`†)æ˜d–Ù%–``æšl¶é&›Xf™æ›tÖig™qŠ©æ|öy'šaî¹%GV¾A ~&ª¨˜qÊ饠‹F*©–h"Ú%¤“fÚg¥Ž>ªé§~æh—„&‰£…‡v êªnZºežþ€6Êê¬cº ¬rÊJë®^Úgª”ŠÊ+¯YúÊi°¥67°Ã6û¥­ÁÞZ,´Î®Jí±ÂV;k¶\b ,·Ú~zl¯ÓJ;B¤«îºì*;ªÔ†»­ª¯–k.½òJ︺æ *´ÞÆ ®¿Š6j¬´ÈÔÁ cÙ»ÑÇ,Á»^ko°øRÌç¸g^l®Æ‘rÜí ²¾øŠŒî¹ qñð»Ç{ò¢ ?ÚðÀ3×i0˜7Ëœs«ûöü3Íß¼òB.C\á²Ck‹iÓ¼> 5­ROÍ*¦G·ürĦJlõ°UýiØbgJvÙ’b­0ËPPÒ0Çm(t×m÷Ýxç­÷þÞ|÷í÷߀.øà„nøáˆ'®øâŒ7îøãwg-P”7ׇMöæzv>êçs†.º§ Éy餞úꦣ~©çª¿î:—§·;ë²ÇNûí¸ï>»–g«mÐÂmS^¹@—/-·æ¼çn»î[Öþ|ïÑÿ|ó¾C½õ0ÿ¥àËñ}øâþôÔo¯}÷Ø«¯½ôé³Ï=üÎ×ÏzÖÆçüÖÊc.÷ë£_öÐg¿°zlŸûâ'@pKáÓùÎ×¥ –ï€ Ä ü¸¾ 2Püàü¸BɹmrIÞ©27Ârð…"| e˜Aj°!ä’ø.XÁz‰‚þ0Œ! s8CâˆE¼!¨:É!D……b¢§¨DëáðˆX\¢«F>Bp‡^‡˜EƉhLcƒˆÁà‘jmHãß —gF*ÚðŽIÄ£ëXE6ê\ãøÄF ’Q‹|Ì£×xÈD*2%„£Ö”6GC9²†Üã%¯ˆH?f’“?´ »(Á1þ‘‘vÄä#QÙÇF¾oLÂ+ȸ@ËZÚ’–rŒâ%5éIUr‹t¥0ÓçÆ^òr˜­Ôà/wÉÊS’0–a—4×EIú Vq¸æ¬Â¨C1qS›à¤ØÊz§\vÍBáU6Ó©©ojÉbd§< æÄƒ@ñœþ™ç¤Ö©ÏEÁóŸý h³êi{BL’€BÊÐ 4L èCÁцNÔKe(?¿”Ñ…^£u¨˜B*Rˆvô£]"é?C O’¢”K!}é–\:Ò˜Öô¤7ͨL@S“âÔ§:}ãðØöDsTR;@R—*&¦‚)©õ’SŸÚÔª†iªRµª½ÉÕ«jõK;ÅjV½JVª–¬_í’XÕšV¶ž}›Qå–Ô:­•KwÝR^•*¦¨ºÕ¬€Eë[ÿ*ØÂö‡]Ýê`ñÚV½6Ö±‹…l`Ç:YÂZö²Œ¬–ÄWËÍÕo¨+öÊWÍ–¶²’ý’_3‹ÚÔRö°˜uþ-ka;Û×Ú6¶›}ìii+ÛÚâv··õ­pskZÒrV’ 1(]‘ª[àþv¯Pm®q¥«Ûé—ºšµnk‰»]ç—»Áí­xÁ^òv6…ŸíŸhߤ]Þ’·Ñ½®|» Ýæ4Lðlïs±K_þºW¿û}ëy÷WM ­×Mþ®wÇßþÎ×½ ~ïx#Oü&Âõ}py)œ`ûwÃÇj <·©ÃžpXûúá;x»¤½¯b_üß+ÅÖ°‹1,TYÕžé­¤‰Ù„c7˜Ç:¾quí{aÄ&ÙÃON±”så"xÀoP.h‡¼&+W™ÅQ¦2Ëã&WÐÆPóþŽAŒf1#yÌXÖ²z™f#ƒYÍJ®s˜eü½6GØËxVñ’õ¬á8™>\6 ß¼áÕ šÐv3›!]cJO:Òö³~ Mb$ºL‹¾t£5Mêì–ÓFõ©½æVçyPÈ-j§ß€ZÛúָε®oÔ]ۺ׾°w Õ`›Øb ¶°“mì0);©rö?›íljéÙÌöõ±u½í\w›×ÙFvµµîZsZný›ÔÙ@K:‘ÍѾl·»ë´îõñÙÉd7 õ½ï~QÞoª7¬EóÉϸre–œä&9Ìîム½³VwÈEÎs0Á’/gyË3™òn=“AwùÑã½t ¯œ H`›œ+©óy[ÝMïNúŽõ«÷ÙÂ`—¹ÐgNö±—}ëZGz£ùã¨{6ç ©ÜçN÷ºÛýîÞ÷Î÷¾ûýàOøÂ~ïpµÛßnpk~šëmøÙ3ùsÉ›ýòJŸ¼Ú›ny´s~ç‘}è×$¹Å3¾ãT|Ú™¾ô¬Þë£ïzØ¿>cͳÞöN{æ1ïy±gÍô7'pãщPaáŒLï½í]¯{åó~óC,:WŸûçß÷É¿¾õ«þŸx‚ÄôSG4°•1ȳ)ûÚÿcåE~ö›‰lÒ'õÑ~îïÞúõÏ?›êiú,ÚÀãW.>Ó|з|#·}ú{kfft˜~ˆ€îW& ØseâDýç³öP¢"2 8¨€\²~"ø~ h~H{*({²×‚X‚!HzÈ•8|%€:ø‚<è‚í&$ƒ1(„3X{ø¶‚÷—„¨„Kè|Nø„ø{l|7ˆzâG~Óƒ?H„Èw€LM†ö…`X†¨…Cèƒ[ˆ†auR÷9h2r¨†iH‡E¨Zów‚(x‡vȇkø‡€X‡è‡‚XˆmkþoÐáG|‘r†}¸‡Z„lHˆ&È…f„*÷€cX†›È‰ô§‡A‡?¶ˆù¤z¯g‰ $‰‰]h‰ñw‰Ø'ƒ­ˆŠ«çˆƒ&¥÷cUØ?éfŠšh‹•èsy(‹¬B¯OÀH‰Ê8‹“XŒÃh&RdpwxÔX!¥wÖ˜Ú¨PrÀRÞ¸àŽâ8Ž Õ}5WpVˆNGŒµè…dØ‰ðø‰³w„ôø…˜ŒË茿Š\Âq¼xpŠÃpY†Sqyƒg Ù8þXI׈üø€Ì‹ìØz‰‘ͨûH‹§xˆXPp(U’éŽbiøÈŒ·þ“1é‘,ˆ’Z‘…r’ÙŽ@øŒ;©‘ó˜‰HøŽòh“5¹Š>I&8‰O&wäø”|‡P9•w×e•…•T¹•\Ù•eŽl7b8Ø”™‘)Ù“!‰”@‰‰)XDi–ù“q©–4–èøŽW–Fù…y”ti€AÙ–Bé—†˜IY˜2‰˜^²”ÃWƇ(é(¢’*’ ™–I2S/•¹™šÙ™™Ù—.Ù’|Ù€Ó˜+Y”r9—Šy˜b˜˅…°)€²©ƒ±I›³I~ßr›² šo —øGšògšžè›¡Iœ§Ù’®¹e¶¹œµÙœºÉœº™›Ð)-¼yœÆ)†/I“¿þyù—½ #)W8ÎIžÏYž¸‰žÓRÝéØ)šßù—„¹ši”É9gêižú™Ÿéyž»©’홚ÛÉ–¥I :“¬ŒòYœàé}²6–¡µŸþ)¡ÚŸÊž,É÷œ°è–Ö)  ¢* ÷)d™y¢r™À£¢(ú+-z™ž™¢0Š¡Ù™ ‰Y C‰£ói˜i‰ õI¢áyzxɈ‹R£k‰‡=JŸgi :˜!ê£?º #*Ÿ%š—E Ÿï‰–Q ¥€É¤¯h¤ª©¤]*¢Q¤8¡¦¡`?ªÈ¥;z£Áé¥6ªOê¦ñI¥ksKzJŠMé•~ÚPRù§‚:¨þ„Z¨†:`9Ó´¨9·Žîi†š¡º¡jŠ¥’J¦Z©4hHÀT8¤Ëò¢ª79ª¦Z7 y7©j7«zª®úª ‡ºŸ*‘T稘J©Â˜¤ *¥¾tŒs¬Âº¥bš¨1«zQ«9‰«¾š©»J¬½j§DÇ¡Èh©kú¦tz§c"«žÚ¨z™«¨é%mZ¬u­‚y®:Z®< ­ëŠ­ÚÉ­´:‡º•:¯S©•…¯ ¥¯öÚ¯þJRÆšˆÝЦ¾¦æºŒãz°í: 9§ {©Ò:¥ ±n ¯É wßÚ¬ºŠ¤ì §;¬ ²û±"°ÈšÊÊ”oà˜0úþ¢œÙ=,*£˜)³1³*J£–J± K²¼Ê³!Ë““jy‹²ãÉŸj´J2F‹³šú¨ (œMª­;›­;µ%;´x‘²G…´\{´^+ÎÉ´Ak­ÔÊ¡×*µV{¤+´67°é˜ƒ]›´rk¡ê)¶àJ¶Pû¥x;¶Üy¶Î‡µw¡µ¯éµsK¸u»´‘ê·U»ŒÀÚ³T{ «¸Ú¸v!¸Ê·˜k¸»‰¸Z:²>;¦ê°¡«³ «®¥»¸ K¹ua¹sF³.ë™”Y³—¹'6Û²®û1v»¶{û°zÛ·9+¹’Ë}ªK¬›z;±+®%kºKº§ ¹äJ†Á˶œê¶ þJ–WÚ´˜°Ï ½Ý뼟˼Í®ÈK½q²Y‹±ÙË·ÍȽá+¾ÜÓ¸?;¿ô뮡ضñJ°ÿú”õº¿áȯ ÀÜè¿\À e²Ök«ÖĬå+‹î;¾»;º½ë´¿Á ¼©ç›ÀQ«£Zªì­J7!L#üÁ&|€3¼sQ¼ |¼Ñ›¥Ïê¹ìŠeë¸Ë‹¶ï‹Ã_¢ÂRÁÂêèÂi»¤+Ã7ü«5\¿ðkÃJütø{±hÊÀ/ì¬Cl¿KLÄULÅH¬ÃïÚÄD ¡kÅB¬¼WŒÅd\ÆZ\Äà»ÅÕ›¿oëiPÄ Û%ŒÆÉë¤è*ºI ÆzœÇeÇÃQáÃþq¸¾wk‰s<Æ£™·fkÁQœÆ†ü·\œ¾^üÆßK¾#HÇÀ{Ä{ÉÚÛ¬Ó»¸ã Ä“ìÀ–¬ÈézÇQ‹º3̾ºë›~œ€ìÆ¢œÃ0<Å|lÆÓŠÈì½£ÌÊxºÆNÜÆ:Ë«¼½¥ì»ºÌ¤šìË‘[Áü}¬²_ŒËµ,ÆY|Æ×¬ÊÇLÁ›¼­Ÿ\¹¡,ȭܾی©ŒÌÌÅçÜ ÌÆ×;Ìâ|Áä¼Ë¼ÌŠò»Ç؜͌ÌÄÀÜÅÂ<Í·|È1LÍõlŒ˜LÐëlÎÎÌÎÐìÎ €ÄŒÆ¹+Ï Ì™lʽÌÍé|ˆý Éÿ,É´,ÅÖŒÏùŒrÐÚ,þÑ -’ ʪl0Ó2=Ó4]ÓÁ6Ó:½Ó<½kÑæk?íÓ==ÔD]ÔF}ÔHÓ¯Ë+ ÒÅ“…¬ÏuŒÊ\Ñݽ ­”ß¼º³†Â éÁ^Öb=Öd­7Kí­ñ¼È”¼%QMÒÕLÑœ¼ÒqÝÍ­¹ÕÄ«,TØÂi Ç ;Ò½ÏÑwÒ%Ò)-ÕæÛÐÁ¼4l£×Š’ÕˆÙÖ½ÖxLÕ*M×|=Ø÷wÖúkÀÛØ¿œ]<¡ÚŸ]Ú]‰À“]Øa,Çå<×r µË<ÈMÛ,ÝΉýÐ¥Ñô<ÑjÑ©<Ù§ÌÚ‘ ÜOíÍ- Î0“׌X»/k2±;ÎÆþLÏ€mÒÐrÝÌ–‹v½Âʲؘ¹Ë ×ýÚÚ}Õ!íØêœÝuÜ\Éâ…ä½³MØ"=ß—MÜØ½Ý;ÜÝ=\´š«Ÿøí±õÙÒ+ØÃ]ÐÔ=ÛÒ­Õî}×ðàå9à¬Xàú-м›ÈèlÛ°ÍáÈÛþ¼4Ì ·>¡žŠæ½Þ×mÇÞâ.^Ý—§Ù˜Þqèܲ+'Ñ}âÜcá ®¶,.Ü@ãþâêÍÑ îÑèý¸¾ßDŽàAÎà:îã¿ý̾.-ÌJîá*>Ðö-ä¹Ûú\äXÍÞFŽØ!®ÛØÛØfNà)îä`þäüÍämÞßîÝË ZJeÚþÖèÙ|þç€肇ڹÍ4n’N]Ù^>ä=Ø+ÎèdžÞu¾˜þýÇ]]ÖÖ˜îp#Üé›þé^-ãIžè½¸“´.ÛÆýæ! 㢮æMÍÛcnêsŽê¬áµÝàçÍåg~åÑœˆzNê³Þ¹Å½á·®êÆ>å­]å íë©ý‡Ï %è{çç ¥z‘nÐ.çKnëÊ~“•Ëá¼aÇÝ嶬`åçÙîíÌnÕ¼ÎÝwþß‘Ü]é^æÄþ[õ.éµNåpçþ.¼áÎÔ+¶ïËÎÖÍ•ït¾íQ¾ê Nð}ðãŽï¬^á?ñÚ.ænýïRÞî~äYþÎßíü‰ßþð4¬ðþ¾î#ßê‡íì….ͦ…ðìnð1oññ å)ê+/óýñóa<_ð$_ó&ߌ÷¼ß"/ô,ïÉñné?Oî6¿>?‡í:ïèôï®ïIîM/îO/ñE?ÝôõŸóß×ßNèi^(!Ÿõ ¿èôqÌñ»®ëæn÷½~¬¿¾\cöP]ò†-‹Goß*¯ôr¯öHëm÷ö÷Svø~ìÊÌð¿õ1îóÂlmn?óC&Iýù kA­k£Ÿk¥ú¨Ÿúª¿ú;ýêË*ëßäíî’ÑÉN÷wŸö®¯² nqšÞûãéüÄ請ߘÂû´nù‘ÿãÁþýüßïÑ?ûæ‰ÿú{Mýåí÷uŸöÍûê^õ\ïñÊ­åÉõ~ýåÓ¿ô·/ý”¿ÇÇÏ÷‹ÒSeS@UQ;ER?GÿeÿõÿS@à@ D(€àB”àœ‡#J,Xñ BŒ 5àˆñ£ÁG‚ìèñcI†'Yt™2fÇ™ßÜÄyIž=}öD’óM8B‰â|™R)Á¤› | êÔŽQ㤤ZëV­]%fÅx1lJ±_¹b| ֬׵h϶…»P-ùrߊsçO¾Y‚æ< ¸èͨKÙÒ½k÷°â¸ ¯.fš82d§’¡ZX–¡æ…œ'»þ¥,³èФAŸnüq麪WÛÌûfo_Ÿq¾=øMaé+³6åcÔ¯}_ºõ@ÏÌÉǼyqÆÇM[žœºëêxcϦÍÓöMÜäuóîÝ]=wö¿·O—H;tíÇ¥hžùy}ãëÝÏçÏ?øúko@¯#еØd ¯6£t3©ô&¼¯Â膣ï= DPÀûòÃo? ;,ÐÂ94ÀShAðÂo(e”pÂÞXLð¿IH¾yÜPÇ¥ÃqÈ í;òÇ"Q5յ̸LmÕq“ÔÆ\AåO_eí5Í@m”Y^‘]vWi­ÅvY`aœ3ÂUY5\ë”uóØk«(ÚÎ\¥¶\vÛÅô\mSØ9À7_}÷å·_}£ò7_€``­"ØàƒS"¸`†î¨á¨ä ˜Sˆ#¾X"‰Xá~=æä9^ãŽIÆw[Úì…ô&p•"ܘYùÊšãKéfužçô|þ6 è e&ÚN¡—:æ¢m^šéôTî‹e:o" j«¯Æ:k­·æºk¯¿;l«ã»l³ÏF;mµ×f»m·ß†;n¹«†š/©½}ã圛ޙfX%Jzo¿wz,hÇ(ðŽœïžïñÆ 7¬îŸîV5o½‡i)MJ¦s¡ M¦DjÑŒBT"€üæ‹I}z”“KdÞ9;ºNh*o„¨IÛ ÓmjÓ¦3e?ë̼t£Å%C—IÓ›Ú“¥1•©QZÒ£"µ©E%*Ní'üE§ ªP™ªU‚ T•IjXÅ V².u«\ý)F³ªÖ-v3!Õöè7Wºno|uÅk^Âþ¾Šðõ!~Õk`;XÂ:dª9©ªÝ®Ú»§Bµ¬hˆW/ÊÖ³²‘¢—çX«TÈÖÔ±f%ih;Rfnn§E­ØÈ–ZÖ¶krèl¹&[×ÖÖ¶·Å-×H‹·ì1´i¥¬%»Òß:µ³ð,¡f‹ûÙå2·³Rm®Tw›¹Þú6¸Àµì‡»ÖìVV¥˜M.xŸ Ýëw¼œí®h:ÝT]кåõ,yÓÛ#ùÎ×¼ðå$r'ºYô~——ÎÅoýËTöëŸïMi‚û·ÝÿÖwÀØ}0„™§àÉÚÀþl#õ^ ;xÂꌮ€)ÌÝß·ÃÊ=/ЬâkVú󩄿º\þ{·Äñ¥©~eÉâ{xÆ!~lŠËúâÝÅØÄ=®ïÑj¬^³øh:~iW,åSÉ<±'u J¸ÖɺYn0M—,ã ?Ù¥!q…¯Œe5ƒÙ—[f—¿õå ™Æ>nsÿ Œf6×Î@¦²›™üG·ZUλáðš­üáöÙÏS~êžA$è#SÚÄ–nrN©ÚOž9Óüu2ˆÿ@“üp›ÝÝmÔ·ó[ûu·à»!oãmÌqr¿œÝ§A¿ÿÅæã}úL޾ù³Nýj[ÿÝØ÷§(Á?~ï×üâ·ùkoû½Kß»î/3²ƒ8¿{+Õ¦ù³?úCÀðKÀÒ¿ÌÀçã¿õ;? ì¿}Ú´B6äÀ\@òóÀ$=d¡ôÛ?öƒ½e‹@-Ë@.3@DóÀüÀü Á×[Aö3³Ù‹2Ì=]›À ;Ž@¾!*>á3¨"$B:>àKÂ&T>'ì!”¶D¿ÏãþÁôA »Øè€.ôÂ/ëJ6õÃ.) =ä%¼B-DÁÒ»À!ãB’Ã9œƒÃCCíâ<›K8䳬@ ÌÂ-Ì‹˜ƒÁ .°ÃÞÃÃÔ¦šÛÃ$³ÂsA,ì¼êËÃ7 CDÄ›PD1Œ¼P¬ÃÅR4ÅSDÅT”¼áÄNüDË«:6d2Hô¿7¬DKŒÄZDÌcÅC¼‰À `ôÄE|Á¨3F®)ºcTƪiº«iF«yÆe”Æi<­^üÅÀÆlÆÅjD\œ&Z$ÃK›Ds›BGäCo4*k¼FmÜFXìFY®\ GmRÃ[lÃLÄõŠÃœ`Çv|A¸þ£ÂxÔÅ]¬B?Lµ4GILH‚PÇ`ŠWüÇX¼Ç6G@ü¿q¤½5œHt´H[lÈHís¯wÜH^ªHÄAŒÜA{ D‚ÌÇOûÈØIêÚ‰lÉG”ÇŽtÉ—ÌI”´E–ÔÄœhEDœÉöŠ9’¼É“êI äÉ¥<Ã…ÔI},Ä9à‚ª´Ê«¬JbÉ£;¨|ª“dÊ2TÉ?ôɦÈs\)VõôBnìJŽüJ§|ÊË® H±ôÊÉ뼤ɑ|Kxt&°,G„,·Œ¤ÄÁ̼Dº;=¾t̾äJ:ËËÎ̹t=ƒ<3»ÄG¼„K½|ÌØ0ÊÏÍÑ$ÍÒ4ÍÓDÍþÔTÍÕdÍÖtÍ×„ÍØ”ÍÙÍФÍÛÄÍÜÔÍÝäÍÞôÍßNß´Íà$Îâ4ÎãDÎäTÎå|ÍádÎç„Îè”Îé¤ÎêDDç´ÎìÔÎíäÎîôNÇÄÎïÏñ$Ïò4OÝÄN¶TÏõdÏöD‚÷„Ïø”Ïù¤Ïú´ÏûÄÏüÔÏýäÏþôÏÿÐÐ%Ð5Ð=ÐöüBØLO:tPCtЕP9ìG±Ð ÅÐ ÕÐ åÐõÐÑÑ%ÑåPÐ:dPÛD_$Ê¡TME4ѥѵÑÅÑÕÑ¥Q•I­dÍÝKEtÑ­PEÒ$UÒ%eÒ&uRõѼ˜þÉÕR¡Æa,Òï@¬-Í }Ò/Ó0Ó1%Ó …Ñ+MD ¥RÊ,íG"íD$pÑñÓ‡<Ò2ÅÓ<ÕÓ=åSÊ~ôÇÖ¬ÒuìÒ(Õ‹9}_¬S;íÓFuÔG…ÔF=Sl,ÔÕŸ?T8ýŽ9­!ÈÒaŒÔPÕQ%ÕTJ Ô eSœ8ÕBýTÙàÔCÉ;-ÕZµÕ[ÅÕðhÕ4µÔoòÑ7ÒE…UYÕ\5ÖcEÖPÅT4}ƒ)UÍAuÈ4}UÓôÒdµÖkÅÖ/=S)UÓg]Õ›0TWmÍjÍÖr5×síÑiåÕæüÖ7WiWZE×y¥×z½ÐwMÕ5½Tª§ÄÊ~5Ä~Ø€Xyµ×‚5Ø‚ýWÍÊ^--u؇]K•؉¥ØŠµØ‹ÅØŒÕØ5PˆeXí;ÏÙ‘%Ù’ÝJ“EÙ”UÙ•ÎðdÙ—…Ù˜•YUÕŸ™µÙ›ÅÙœɃåÙžõYt8Ú¡%Ú¢5Ú£EÚ¤UÚ¥eÚ¦uÚ§…Ú¨•Ú©¥ÚªµÚ«ÅÚ¬ÕÚ­åÚ®õÚ¥ÕÙ°Û±%Û²5Û³EÛì ;PKcKûSÑ–((5Pictures/100000000000029F000001A191A0C2963F9E391C.jpgÿØÿàJFIFÿþK CREATOR: XV Version 3.10a Rev: 12/29/94 Quality = 100, Smoothing = 0 ÿÛCÿÛCÿÀ¡Ÿ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?þ–ô [ÇR|#øAã_†Þ øYâß‹ßôÿøßÆÚŸÅ ÝSDÓæü:Õ~&_ÙÁ¯h>ñwˆdÒ|#=Ä>ðƒ}ky‹á{[õK‹ËY¯ušÒ÷öŸðÞ©á[ï‰ÿ ¿eÛOk>$Óü=ª]øÆ~<Ö¼Sfú¬c¸°ÒüAð“ÚUÒ¥Ô%Ê\k¬°HòEæÈ‚&ò¿†ž0Ñî¾þÎ0éþ8¾ð¾«áƒÿîâÔtK}öáo ø5¤hÖø@ñšðªêW‹0K4¹ŽîÚ-—1¢M½ýïŽæÖ?²`ñÆø‡KÒ5‹-v="÷Eø}akq§ ~Æ×7:€tWʉæi vú¸‘‘…ã/ò!˜Ò…*”未·5µ&㲚’µ´×½Žß©ÎU)T£AÉ'ð¹{®.ï§o’ºúcÌÐÿè£ÿà¦ÃÿŒÑæhôÑÿðSaÿÆkÄ?áiøgþ‚~Sñº?áiøgþ‚~Sñºó¾¹[¥Z>Ü¿»oÓúNý¿V¥ÿ>éôû1þïù~/³=¿ÌÐÿè£ÿà¦ÃÿŒÑæhôÑÿðSaÿÆkÄ?áixgþ‚~Sñº?áiøgþ‚~SñºK[OÞÔéöåýß?Oé;ŸV¥ÿ>éôû1þïù~/³=¿ÌÐÿè£ÿà¦ÃÿŒÑæhôÑÿðSaÿÆkÄ?áiøgþ‚~Sñº?áiøgþ‚~Sñº2¶Ÿ½©ÓíËû¾~ŸÒw>­Kþ}Óéöcýßòü_f{™¡ÿÐGÿÁM‡ÿ£ÌÐÿè£ÿà¦ÃÿŒ×ˆÂÓðÏý ü¦ÿãtÂÓðÏý ü¦ÿãt,em?{S§Û—÷|ý?¤î}Z•ÿ‡ éöcýßÎß“=¿ÌÐÿè£ÿà¦ÃÿŒÑæhôÑÿðSaÿÆkÄ?áiøgþ‚~Sñº?áiøgþ‚~Sñº2¶Ÿ½©ÓíËû¾~ŸÒw>­Kù)ôû1þïù~>Löÿ3Cÿ ÿ‚›þ3G™¡ÿÐGÿÁM‡ÿ¯ÿ…¥áŸú AùMÿÆèÿ…§áŸú AùMÿÆèXÊÚ~ö§O·/îùúIÜúµ+üï¿Ãîÿ—ÊþLöÿ3Cÿ ÿ‚›þ3G™¡ÿÐGÿÁM‡ÿ¯ÿ…§áŸú AùMÿÆèÿ…§áŸú AùMÿÆèXÊÚ~ö§O·/îùúIÜúµ&ÿ‡ôû1þïù~>Löÿ3Cÿ ÿ‚›þ3G™¡ÿÐGÿÁM‡ÿ¯ÿ…§áŸú AùMÿÆèÿ…§áŸú AùMÿÆèXÊÚ~ö§O·/îùúIÜúµ/ù÷O§Ù÷Ëñ}™íþf‡ÿ@ÿ6üf3Cÿ ÿ‚›þ3^!ÿ OÃ?ôƒò›ÿÑÿ KÃ_ôƒò›ÿб•´ýíNŸn_Ýóôþ“¹õjWø)߆?Ýÿ/•ü™íþf‡ÿ@ÿ6üf3Cÿ ÿ‚›þ3^!ÿ OÃ?ôƒò›ÿÑÿ KÃ?ôƒò›ÿб•¿çìú}¹vÝ}?¤î}Z–ÙÃV¾Ìu~ïù/¿Èöÿ3Cÿ ÿ‚›þ3G™¡ÿÐGÿÁM‡ÿ¯ÿ…§áŸú AùMÿÆèÿ…§áŸú AùMÿÆèXÊÚ~ö§O·/îùúIÜúµ+üï¿Ãîÿ—ÊþLöÿ3Cÿ ÿ‚›þ3G™¡ÿÐGÿÁM‡ÿ¯ÿ…¥áŸú AùMÿÆèÿ…§áŸú AùMÿÆèXÊÚ~ö§O·/îùúIÜúµ/ù÷á÷;/¿Èöÿ3Cÿ ÿ‚›þ3G™¡ÿÐGÿÁM‡ÿ¯ÿ…§áŸú AùMÿÆèÿ…§áŸú AùMÿÆèXÊÚ~ö§O·/îùúIÜúµ&ÿ‡ôû1þïù~>Löÿ3Cÿ ÿ‚›þ3G™¡ÿÐGÿÁM‡ÿ¯ÿ…§áŸú AùMÿÆèÿ…§áŸú AùMÿÆèXÊÚ~ö§O·/îùúIÜúµ/ù÷O§Ù÷Ëñ}™/íûA|ý—~ øïãÏÅ}:ÞËÀŸ¬4û½Xèþ·Ö5«ûÍk[Ó<1áÝ DÒm¡jZ߈üK­húdŒŸiÔõ+XÞHÑšEøkâü@ø]ðƒã?ÆO~Ä4ýà™¥ø‡â‡íu?Ù7Yñ_†|/¨éž%ÔnuÍCGÐÿh-I¬_F>û§ êÙøŒÝjºqÓôBÞ=N}?è/~ø#ûKü!ñ¿Àï‹‘o|=ñþka¯XYê:ž¨$šf«a¯èº®•«éÍþ•­h:þ“¥kš.¥i*OcªéÖwQ’Ñ`üW§Á?e˜|û_øKľ3øßRý¸| á?‡_¾ x«ÄÞ>:Ô|9à7ÅZW†ÛE»ð÷ÃøzÓY´µñ–¹ö½{UðÞµ«kÍúÕÞ¡%º5m g»zµy”•Ò”õ‹•>·ÓFÝÞªÉ4ÕÙœ°ëERµ´|±½ì»ï{GKí~Ö]‡?à¯ÿþøãÀ? þ'þË_¼ñ›â÷È>!|øD|7ðkÅž6ø¬5ÛxGBð§„müñ7Äš[xX–[Ýyޝ©éZ…á­XÖüDø;ñß|!ñßàïÀ¯xm¼7ðçQ›H—ã7Ã;OŠz?Äé¯t¿ÝiÏð»Ãš×úмCÔ—¶¾‡¬Ãi¥_[Z­Ô¼Çíû þÈ?´§|)ñ7âF©ã¤ñÏÃÿƒz_Áχ^%ð·Š#ðÞ¹ðî ŰxÓ@ø‡àrË@:ç‡þ&èúÌ –Úõž¥ý“s¥Íw¤jžÔ4ûÛ»y¹ß‰?ðO¯Ùâ÷ÅOüiø‘âÿŠ>)ø‹ñ öooÙŸÆ:åljø›ãO†ŸÇÞ¾‹GñÆ¡àÿŠ:çÁØõ½+ÅþÓxGÃRxWPº¹_…¤ø££xŽî÷\øqªÝi~(ñŠ.µ7ñÍÿƒåð½§‹¬õ{èõM>K¿²^Zý gûþÄvú¯í‰¨^ZøŸY´ý¶´»½ ⟇õ_ÈÚ…tMVûV×¼A¤|'¶²Ò,®¼§ø›ÆÕïŽuëa{ª%ç‹<‹øü‹h#² âáuË^¾ý墽;jÛ{;íºëpXgeûªWvéZQÓnéi¶×ÙŸ¡ÿ³ïíQû3~Õֻѯü?®Åciªf뺉tm^ÑîfÒïìu;A¨é–É{¦Þ[j=¤ñÌÞ×¥kÞ ×­PÐí¼+¬Ø4ßiPhú£KHÖæÌM ’2@t¹ €&¿;ÿd߀Ÿ³Ïìqàxámü·ºgŒ5¸ußßk¾øq£j:”öÚ%‡ím¯aøeðëáÞ‡oo¦XGͨèךœòOw-Þ¡t× ^Ó4‚Þøgâ/… ,t~×tŸiöËðO@ðÿÃɼ/¨ø›O¸²»ñW…­4h:oŠ­%™5;RãE½UÔímn/-oR&ñx¹©{•jòÞ6¼¤Þ¼—o]5·—~¥ÇNËš+õ´U“÷l“謵¿—cÞ~1|XðÁ/…þ5ø«âŸ Áy¢ø+BºÕåÒô]J¸×5ÛÅ)m¤øo@µ¹kK{½ÄzµÅŽ…¡ÚOwm Ϋ¨ÙÁ-Ä #JŸ=¿ü7ö!ƒâWŒþ \üLðRü[øu¡ø§\ñ¯Ãë ë:þ»¤hQx“Ç: “øwú¶™â¯ø;FßxƒÁ¾¿×üSaoò¾c†F_+ñÂ/xžëÃÃÄ?>.ø¯AÒ)þÑ ñŒ<ñ+âÖ©ñ+ÄÚ¾¯áë_†7ÞñÇÅŸßøwÆ^9ð_Š|Mð§Ä>?еۘµ+íVÇOoÞøGNÖî_P¶ðÊå †.Ë߯[dïN×÷4wmè»nKÃFë–•;i{¨Ý[•_®—·â}i7ü³ö á®­ñŽ×⯅µ¯…º‰´¿j><ð¿Ãx·Ã1x—Wðœ>8·ÒàÔ¼/àZ ùlü1so¨ë“iæê×ÃRLšoˆ§ÒµF' \ÿ‚ªÁ8ü;­i:«ñãáÌwúö‹ðãÄ:4–~ñV©¤êzOÅÿË⯅÷6~ Ò¼!{ Í'4hZO Y¦¥öÝWPh4K{wÖ®môé~Ô?à“ÿ°½ï¿|‹ÅßìþxCâ=ïÅ ø!üo¢ø‹BѼK¯ø-|ãA—Œü âhµÅçxŸZ]hjwÚW/5x*ÿ—z…êO¿àoø&ìUðþËÁv'Œ>.O'xSÆ^8ðv¨žñ­ìW¾øwâ ? ø÷YÕ"±ðMÕÏ… ð^¹} ŸŠbñT-Öƒw·ºœÚ~¨][`ÜÿÁUaÿÏñþ#ø‹Jøg¢üøÓcð1¼Aâ/Yë6|Oð£Â¿WWøs§x<[âsÂö¾ ñmÝhÚréÂÎöæú+}7ì—×_œž:ÿ‚Vü ñ7ć.‹ñÆÞý›´ÿµçÃ/ˆúN›ã!§ü[ñmçí_ñGÂÞ?ñg‡âÔàø}?†eøsªiöÞ-ðîµk4v:õ­†¡¥ 2æ]BÜë6¾Ëãø%Çì!ã¸õ¯íÚÝj->1iW?jðO‰ ðž¹oðwÂ'ðö… xóáÏ‹ü){áCÀ¾ðâ]éÞ,Ð'øOàç…þ$x3ÅŸ|máxÏúW„¼âisø_â>’uïëZ—‹¼?áKÁÞ³ñfˆUЈuý*Ký>H.áŒÃqÉóïÆ/ø+‡ìWð;àþ±ñ_ÆÑßý¶ßáÿ~,xcážàë _ÇÞ7øcàŸjþ Óüy¥-”’øWÃþø‡©éB_‡š·Åâë-gÄ õŸh:Âør;yMŸ†ük£xfMbÚ=R_¼²Þ-Îïìåû~Ïß²ÍíõÿÂOŒ?4w×~(蟼[`ž#ð^á¿ÜxÂ׃¬|¬ø3Áß <-àëOMo¬ sV³ðÞ kú߉tVÕüGyöY ¸O­îׯ~XÚîVæ÷n´{mg÷•ºýÕ+kü©ÛÝK{ßÎÇÖºgüö-×tHüCáÏèÞ*ÓdøQeñÃo„~ø÷ź¤ õ‡6^&¸Ð|7à}S^µ3xÑntA¡Üi±xNÖodÒMÑ5{Ëðüö!ø§ñ¯àßÁ_†óx›Æw>jŸþøçHø!ãÄð>¥a¥üF»ø].¨^j²ÖtK‡ñN©ÆúƯ¢YxOO±³KÍWÄ6êI¾ð½ þ ûû%xCÁŸµ·ƒ< 㟌>OÛþi> ø“Â^8±ÓüUà]x—]ñmjw¼·ðGou¿øÎâmKcË1ñ´ºµ{›i-:ïþÈ?~øÛöxø‹áß_­Ü¿»çéý'sêÔ¿çÝ>Ÿf?Ýÿ/Åög·ùšýtüØñš<Íþ€:?þ l?øÍx‡ü-? ÿÐRÊoþ7Gü-? ÿÐRÊoþ7BÆVÓ÷µ:}¹wÏÓúNçÕ©Ϻ}>Ì»þ_‹ìÏoó4?úèÿø)°ÿã4yšýtüØñšñøZ~ÿ ¤”ßünøZ~ÿ ¤”ßün…Œ­§ïjtûrþôÏ«RÿŸtú}˜ÿwü¿ÙžßæhôÑÿðSaÿÆhó4?úèÿø)°ÿã5âð´ü3ÿAH?)¿øÝð´ü3ÿAH?)¿øÝ [OÞÔéöåýß?Oé;ŸV¥ÿ>éôû1þïù~/³=¿ÌÐÿè£ÿà¦ÃÿŒÑæhôÑÿðSaÿÆkÄ?áiøgþ‚~Sñº?áiøgþ‚~Sñº2¶Ÿ½©ÓíËû¾~ŸÒw>­Kþ}Óéöcýßòü_f{™¡ÿÐGÿÁM‡ÿ£ÌÐÿè£ÿà¦ÃÿŒ×ˆÂÓðÏý ü¦ÿãtÂÓðÏý ü¦ÿãt,em?{S§Û—÷|ý?¤î}Z—üû§ÓìÇû¿åø¾Ìöÿ3Cÿ ÿ‚›þ3G™¡ÿÐGÿÁM‡ÿ¯ÿ…§áŸú AùMÿÆèÿ…§áŸú AùMÿÆèXÊÚ~ö§O·/îùúIÜúµ/ù÷O§Ù÷Ëñ}™íþf‡ÿ@ÿ6üf3Cÿ ÿ‚›þ3^!ÿ OÃ?ôƒò›ÿÑÿ OÃ?ôƒò›ÿб•´ýíNŸn_Ýóôþ“¹õj_óîŸO³îÿ—âû3ÛüÍþ€:?þ l?øÍf‡ÿ@ÿ6üf¼CþŸ†è)å7ÿ£þŸ†è)å7ÿ¡c+iûÚ>Ü¿»çéý'sêÔ¿çÝ>Ÿf?Ýÿ/Åög·ùšýtüØñš<Íþ€:?þ l?øÍx‡ü-? ÿÐRÊoþ7Gü-? ÿÐRÊoþ7BÆVÓ÷µ:}¹wÏÓúNçÕ©Ϻ}>Ì»þ_‹ìÏoó4?úèÿø)°ÿã4yšýtüØñšñøZ~ÿ ¤”ßünøZ~ÿ ¤”ßün…Œ­§ïjtûrþôÏ«RÿŸtú}˜ÿwü¿Ùžâ4«½CÂ: é–66~$×µ=?U¹°²µ²ÔVÇKð7Œ|V±XßCšÊK«ÿXÚÜ\@VàXMy¬¶·RCwn‡À^Á+¼­ƒµ¿á,ñ maÐí“StlBº:C+Añ­oâ&=ΪiÚ…•Í߇µ-SQŽÆ{‰¬–øj^ñ?…¼kiã¶šñ!¾ˆÍ†w³’Mh·k·ø¿á×Ào† >+¯Æ/kß´F¥â•¾ñøÒ!²ÖàÔtû«[ËHôù$ƒQÇñ–‘á_ø"×Àz½ÝÞ¯¦Ã­øÅj¾ñ®µðÿ_Ò|Ià /ÁVº5iï§jPG©àë}N ­µna¹ŸNÔl"‚=ú…/‡ÞðŸ‚G‰­ôëÍz/‡îµx¬î‡Äÿ ØhRÏLÑ´©<@š~•ie?¶‡ˆ´›Ùâõ¼×é —:'Á ØÙÞkw~!ÔVÇÁŸlæ‚÷T×ïwÏ©j:‚ø‚Qq%Ä÷w/ö}w¨\Ýê3ÛÙß×öqŒ«)s{òr“‹¿-¬›Ù6ºo©+“•ãMÆÞêå×Ã¥’íuo'òý?ýžfòf¿Ù¸ç¿gï‚c®:|.ð™úžžžsª~Öþ Ò¼mã/Éá˦|>øà¯„¾.ø†ËàM/ÀzGÄéÿ5O xl]ëþ;ÑüI¨ÞÞÙüSðH„i¿[Ëí^='K:†®¦ÄöŸ¥ò¿f¯Ù¤“Œüø*:ú|-ð—¦kæß~Ä|_⟈þ=Ô-´ÁñâÇŸƒ¿ÇÇÂ^ŸÆ¾OƒÍðF];áöâ‰ì[Áúäÿ,î5+C|‚)üQ®Koÿ)ŽòtÕF¥µÖº/å×ç¿Ð˜s{8¸·võ½ü¿=˹ôÃïÚ£àĸ¾EáψZ ^ ø±à |Jðo‚õmFËMñç…üeáµñnƒ-χä¸{»[ëÍ~ú{¸[{KÉãYmí¥˜{ßÛ÷ýô+ó/áüïÀüsðׯ:Œ5]r‡þøcc&™â[+›æÔÔ,üFoøÀÚ¤¾ñ•÷uq¦Ëkã]SÄ0©×´Ëè¬_\ð°Â†#ö‹‹[y¸ /þ 'û-êú‡†l­~!B!ñ—Ä+߆>Ô™¬e³Õ¼Wa¯|Pðã$PZj:­¾“sª|!ñ•½†¹{¦ÛiWò[[Û[]Kxo-l¼[¿ðOß øSÃ><ðΟâ_éòø§Æ_ð±4oxwà—ƒ|=ñ?Nñ•‡Çk/Ú Ãw~1ñ¬×SüJÑ´_éº|:½akk¬i–pÇu,S"Ì+ø7þ ùcàßé_m¾3øƒQø‰¥üB›âHÖï|!áØ´ksSøñÛÇý«ørÂk8£Óoí¿hxzÆ(õu¦Á§hš”—züW¦öÔ¨Ù»ëöVŸÜÕù½:iäOïm¯§3×Mc²ôk^öK¡ú‘öÃýãÿ} ùÓÿµOÃïx‹â&—egâkO ü+Ô|Y¢xßâ¶­…¥ü5Ñuï2'‹4kíNï_ÄèÒ‰ã}GTðÕ†|Öwo¥ê÷ÑD$dûgû¯ÿZ¾ø©û xGã?>!ø«Ç^0Kxüwàx Gð'¼3à?ϤxÉ4u….ð–âH~*ÅãëØêö~5»ø£áïøaüM«i×þ6ÔîõxWGðe•†ªø“Zñ6’–Z–¯i7‡š)lFŸïvß²m§‡´ŸIàOˆº‡7ÛA?3`’@è9'¶Hõ5ñ^û/hZgÄ=3â]ÏŒ5KÿÙ~Зÿ´MÞ4½.ÊßQñ.¥û,¿ì·y¢º[®ûm´)Å‘yNg‹Y+`¥´õÅ}]öÏöÿ_þµCœ4µ¶WÛGîöíuóVìSêím¯¯Á«ó»ßÈùŸDýµ<)âŸxWÄŸ ¾,ü7›Áž#ð7„|U¬üAo…>£øâDšðn.¡§|TÖ^þóY¶×ìom¡Òmµ’5šÊ=ú¹·Ón:ýöÎý–|U>‘máÏÚ áNµ>¿y¢Xh±éÞ5Ñ.[S¹ñ0¶ÿ„lZîŠÍˆòÖ-åOÙuYîa·±šây:óoˆ²·†~ j?ußkš|Ÿ~)| ø©­­„±éÚÀÃás£év¦eÌ–Zçü"ößÚRÍ™àûLÿf ¤uÇÚ~Ä~²ðÅφañv´°\|"ý’þ‹ÄÓt˜îaÒ¿d¯øÆžÕb) }âÛÏ=®»"ÞÒYlÌ ¥E½ì´Ú×µ£¯kÿO ­>×óÕv²Û¯Múy'ö'ƒþ4ü0øƒ­ø—Ã~øá_ëþ ¸û7Št[°Ô¯ôI¾Ù}¦•¿·¶™Þ%]GMÔtç— wö–léuo,i'ÅŸ‹ø1ðÃâÅß>¤<#ðËÁ¾#ñ߉ޑdu-Wû ÂÚMÖµªféѼo}}ö;9…¥šHq1Hƒà•?fÿÙÁß³gŠ"Úü9ÓüM{¨Aik©ÜéŸÿi/‹´ƒØC}i8¿†?ëõo ß\%÷Ûmt}/OÔ-.†ªež©Jƒ[ÛT¬ÒÕ^)¿É¯—Êy²¶ÉÞïwKyi{yZÖ>ó´ÏÀSªøkD_Œ?›Uñ•ÝÕ—…,WÅZKMâ ›=bçÃÓÇ¥„¹+x§^²»Ñà’&x®õKi¬m{˜š5ÆÐ¿kŸÙ»Å^²ð߯ï‡Zõߌ51£øZ#Äúv þ ÔLšD?gÒ~Ë$«zÆ¿£Z¼ð¶K½JÒÑå[™DUò4ŸðOÏKã‡~3»ø…¬kàá·‚ãÓð¾½/‰“LQ¨xÆÔZÏñ+â6ð˜|MñWÒ<7®øÒÖºbꚵ̈́1µÅÉ{r¢’jZ¤šV¿»ùîûh$¦Ú½–©_]½ÝÈûÇ<Ñþx/ÅÞ<ñ—Iáÿøg]ñf¸öq}ªíté—Z¾¤Ö¶¡Ü\‹;9Œ0S,2–Èó [ö¡øAáÝ^÷IñW‹-ü(ºÃß|KºÕ|JÐé:*xw⻬øsÂÐ&¡q0Yu«ý_B½µD(÷EšÙb¼êƒkâ_„ìþ&|9ñïÛýBçL±ñïƒÙþßëÿÖ£ž=—õËåçø.èv}ÚÛÿmü®¾ã§ûaþñÿ¾…l?Þ?÷ЮcíŸíþ¿ýj>ÙþßëÿÖ£ž=—õËåçø.èI>ý¿ößÊëî:¶ïûèQöÃýãÿ} æ>ÙþßëÿÖ£íŸíþ¿ýj9ãÙ\¾^‚î'ß·þÛù]}ÇOöÃýãÿ} >ؼï¡\ÇÛ?ÛýúÔ}³ý¿×ÿ­G<{/ë—ËÏð]Ð$ûöÿÛ+¯¸éþؼï¡GÛ÷ýô+˜ûgû¯ÿZ¶·úÿõ¨çeýrùyþ ºMÚÍôïýßÊëî:¶ïûèQöÃýãÿ} æ>ÙþßëÿÖ£íŸíþ¿ýj9ãÙ\¾^‚î‚Ï»[wßÝü®¾î‡OöÃýãÿ} >ؼï¡\ÇÛ?ÛýúÔ}³ý¿×ÿ­G<{/ë—ËÏð]Ð’}ûí¿•×Ütÿl?Þ?÷Уí‡ûÇþúÌ}³ý¿×ÿ­GÛ?ÛýúÔsDzþ¹|¼ÿÝO¿oý·òºûŽŸí‡ûÇþú}°ÿxÿßB¹¶·úÿõ¨ûgû¯ÿZŽxö_×/—Ÿà» I÷íÿ¶þW_qÓý°ÿxÿßB¶ïûèW1öÏöÿ_þµlÿoõÿëQÏlº~<ºm÷z.è}ûí¿•×Ütÿl?Þ?÷Уí‡ûÇþúÌ}³ý¿×ÿ­GÛ?ÛýúÔsDzþ¹|¼ÿÝÏM^¶·þKù]}ÇOöÃýãÿ} >ؼï¡\ÇÛ?ÛýúÔ}³ý¿×ÿ­G<{/ë—ËÏð]Ð’}ûí¿•×Ütÿl?Þ?÷Уí‡ûÇþúÌ}³ý¿×ÿ­GÛ?ÛýúÔsDzþ¹|¼ÿÝO¿oý·òºûŽŸí‡ûÇþú}°ÿxÿßB¹¶·úÿõ¨ûgû¯ÿZŽxö_×/—Ÿà»¡Ù÷koý·òºûŽŸí‡ûÇþú}°ÿxÿßB¹¶·úÿõ¨ûgû¯ÿZŽxö_×/—Ÿà»¡$ûöÿÛ+¯¸éþؼï¡GÛ÷ýô+˜ûgû¯ÿZ¶·úÿõ¨çeýrùyþ ºŸ~ßûoåu÷?Û÷ýô(ûaþñÿ¾…slÿoõÿëQöÏöÿ_þµñì¿®_/?ÁwC³îÖßûoåu÷?Û÷ýô(ûaþñÿ¾…slÿoõÿëQöÏöÿ_þµñì¿®_/?ÁwBI÷íÿ¶þW_qÓý°ÿxÿßB¶ïûèW1öÏöÿ_þµlÿoõÿëQÏËúåòóüt;>ímÿ¶þW_qÓý°ÿxÿßB¶ïûèW1öÏöÿ_þµlÿoõÿëQÏËúåòóüt$Ÿ~ßûoåu÷?Û÷ýô(ûaþñÿ¾…slÿoõÿëQöÏöÿ_þµñì¿®_/?Áw@“ïÛÿmü®¾ã§ûaþñÿ¾…l?Þ?÷ЮcíŸíþ¿ýj>ÙþßëÿÖ£ž=—õËåçø.èv}ÚÛÿmü®¾ã§ûaþñÿ¾…l?Þ?÷ЮcíŸíþ¿ýj>ÙþßëÿÖ£ž=—õËåçø.è,ûµ·þÛù]}ÇOöÃýãÿ} >ؼï¡\ÇÛ?ÛýúÔ}³ý¿×ÿ­G<|ºí¾^‚î‚Ï»[í¿•×Ütÿl?Þ?÷Я†?à¥Óy¿±ÆFÎqwðädž?ä¨x+¾=ú~uöÛ?ÛýúÕñüvO7öøÌÙÿ‡QÿE;Àç¾=hRŒ¶KF¾_—¾DËDµ{®ëùá¼Ñõìå¥èÚŸìÛû8.±iÒEû?|húu® Ÿáw…•[©#A)’À`ã>Áÿ¯‚èaÿ„Ö“ÿÉUäß³gü›oìåÿfûðGÿU…+à¯þÕŸQøá[_ÚökøEâWÔþ#é^Ò<_ð'ÅzµöŸk§üNø—ð»áõÆ¡ãgöžð§ƒ¯üC®^ü<Ô/Ö;¯ XØËuiw hWvë½ßT(εIF1„ši¶ìŸ-·ÞÞ»zœœüŠ7“Ž‹gmtþ½.~§Â+àŸúXá5¤ÿòUðŠø'þøMi?ü•_þÍ?õ=F]â÷Œ´;½jãÁß þ!xcź¶‘àɵï|MÓ¯íG†õý.àÑí~!x+Ç~ñ—„|Ee£¥µ­ÒÙè÷vÚ}ÝÍý…§ÚcžG Œ‚9È럦9¬d£ ’¦ý›6”â¹dãÌ¢ÕÒÕs+=m{³DªrB§ïT'¤&ù”dãËt›Ñµetž—óEøE<ÿ@‹ü&´ŸþJ£þOÐ"Ãÿ ­'ÿ’«ðÇöÑý½>,i¿þ)þÈ~ñ-×Ãëë{h> Ô~ü!ø•ñcã—‹5MGá_…~'ÝÃáäðŽ«%–l$ñ Xj­‡†­†tVçK×ô­VúÛSÑ{Ø»öÕý©tÍ_Rð'í“ð‡ã•ð×Þ ‚O ~Ðz·ì½ûEøwR¾Ö,2|`¿þ#|ø'ðËâψ> ü:ðÁ­GEðÏ‹%|U¾¿¿øqñCÅ¿ôÛ߇Þø¥ð«Ç>&´Ñm¼eyáMhÅo¬ø{ÆhÚ}†£{áùõ>Ÿ«É`ºÜz•þ™ªjõî„þ#Ö~“¹¶'¥žÕÃÒŽ³§f¤¹Òª”©·¼d¬ôm«ê‘óøn)Êq9½L’†.U1ô•G*jü·¢âª.dþ(5všW³jëo½?áðOý,?ðšÒù*øE<ÿ@‹ü&´ŸþJ«õüè~дí7ñ»ã§ÅÍÃ_|Cðoá‡Ã|JðWÿxOÆZGÂöñJüÿ„§Gñç‹|Uãô»Ò|a®êzÇŒ|¬Ùéz‰«ÛxcÁÞ¼Òõé׳5Åô¿Ä9þKÂyiļA‹¥—d¹.b³ déT«4]ZTbýN¤œêÔ§£^z¸Æí}F†'ŒÂåøU*¸¼e_e‡¤¦¢ç5RKšME(Ó§);½¢ì›?¢øE|ÿ@‹ü&´ŸþJ£þ_ÿÐ"Ãÿ ­'ÿ’«óëöøËñ#Åë¬øâ‰õˆXðÆŸão…þ=ñ-–‹gâÝWÃqëzŸ…üG¢øž_Ûiú^´ú¯k¥\h*‚Æ9uý+X’»ízçE—Å÷è¥{ Ó:5hÊ•Z8Š414+AK’¶Nj5cÌ£+T¥(M)E5{4ÑËN£©e)§Μã){ЩJ\“„¬Ú¼gfÕÓ³jÌ¡ÿ¯‚èaÿ„Ö“ÿÉTÂ+àŸúXá5¤ÿòU?ÿhO‹?~:üdµñíãÙ÷á'Ã_ˆ^9øuðÏÀ_ õÁ:—‹%ø]âÝcá÷Š<_â¯ɪø_ÄZµæ·ã/ ëŸÙú-—‰ ðö‰áã¤Ã{¡ÝêW7:´¿ ß°ÏÆoøÒ-sÁ>9ñŽ¡ñ7I‹Ãz_~üHÖìt‹k^“XÕ|1¯h~'þIJÒì5k¿kZe›i¾(L·“\³Õ¥´¹¹Öï4+ëñO—VÄãp|Ë/Äf™m,=|Ç,¥)¼f †.4§‡«^¤©rUU)µìêMÇs(½°X©9Ó½,T(×Jx|T¢–½J ª”éÍMÉÊœÓRŒ~YŸÂ+àŸúXá5¤ÿòUðŠø'þøMi?ü•Wëå_Ú7ö£ð×Áiàý,éz÷Å¿ékZ…õ ¹í4½Ãë5̓xçÆW–ÐÏ=§†­µyll4ë$“_ñn­šFlRÛYÕ´NLÇ2ÀeFe™W£„Àá)ºØŒEUhS§^NÊîú$’nMÙ+³×˲üÃ6Æáò쳉ÇcñU,>Õ­Zo•(Ó„“z]ôI6ì‘ôßü"¾ ÿ E‡þZOÿ%Qÿ¯‚èaÿ„Ö“ÿÉUòŸìãû\xKãci ×ìî| ñ©|#‰5¿ê/ ]ZêPX:ÏÄσõŸ ø«Ç>Ôô{WQ¶Ž]-üS7Štk[í:MJ³KËiî>»£.̲ìÛ G–b0øÜxóRÄQqœ$•”•ÖÍ8ÙÅÙ­nƒ1Ës,£Sša1™~2“^× ‹¥SZQqr§QFI4“‹µšÕ6¬Pÿ„WÁ?ô°ÿÂkIÿäª?áðOý,?ðšÒù*¿*tßÛÇ>ý­þ3|2ø‡}¤k_´Í'Åcá„<=á¸ìüg}â¿ ø“EÐt¿ ÙëjkªÍâooõ CSÖ×FÐ|1ciw®ëº¶á­'UÔí¬xþ âßO¨YþÔüI¢Áâ¾øqàü7¹øg«ü<³Ð>*øÇÃ~øi¥ÿÅkŠ:—öN¹âk_øÅð¬ô¹u3esâxü% XÝÅ¢Ù{ðÊ1õ)J½,êѧs•HRrŒc:qª®íkrZMôëfÕüYfX:uiÑž.0©RN0„ª(ÎR„ã (Å»¶æ¬´×Sõ;þ_ÿÐ"Ãÿ ­'ÿ’¨ÿ„WÁ?ô°ÿÂkIÿ䪺ŒEå]U”ú‚7œt9ã×é_˜ßÿnoˆ“Åö/ÙçàLjuGÃ_<[áoxâ6³ðLð'ˆü=ð£Ä8🎴­*+ã%÷Å ÷Å>-ðkøWÂ>#½økuý—>¥gâmWÃWº$³áƒÀb±õU &UêéîS§ÌÒ¼UådùR•“oK¿4kˆÆPÂSö¸œDhÓ_n¤ùSi_FÞ²²Ñ-tÓcô³þOÐ"Ãÿ ­'ÿ’¨ÿ„SÁ_ô°ÿÂkIÿäªü†ñü3Ä>1øÕûI)&“MN 5ÞåQÄÓÄGž…gR ‘sFM©sBH´Ó³N2‹ô|¿ðŠø'þøMi?ü•Gü"¾ ÿ E‡þZOÿ%Vƒ = ­|ññ÷ã½§Â=.ÓHЬí™á-&W%0¨ëÚƒA¡h¨×sÏua40Õq5©áðô}µiË–„9¥'¥ôZÛݽú]·¸ëb!‡£*Õêû*TÒ”§9YE+nßÉyžïÿ¯‚èaÿ„Ö“ÿÉTÂ+àŸúXá5¤ÿòU~w~Í_·ßŽï¾|øéð§âÃo¿ü$º½íÄ_ .þêþ=ðw…,5ˆ6ž¸ðOÅŸëViºkÛ­jút1½™†ÞKãs´IúAO…¯‚ªèb°ò¡UEI¤9d¢íÊìúJÚwÔœ>&–* ®º­ÒS„ù•×+µ×UeVPÿ„WÁ?ô°ÿÂkIÿäª?áðWý,?ðšÒù*¾ý¦m+߅׿>ü-øMñâ/Æ ü4ms׺[|'³ð-Œ¼W x‚‡¶:ôþ>ø¹ðÿVº³—VÒà›Z:f›sožÌ‹znKÅû/~ÔvŸmõ/xÛO°ðWÇ_YAsãÛ]I>•®hòÌm,¾!xîã÷º·‚µ¹”+ÂòO«xGUwð߈‰ºK GWéþÊÌ#‚þÐx±Á§ö‡Mû?{á|ÝbÚ·6×vÝ£íÖ£‚XÈ<[RµQ{OqFRM.©YÛ{_±õgü"¾ ÿ E‡þZOÿ%Qÿ§‚¿èaÿ„ΓÿÉ^Çòª~&š[x‚âhgƒDÕf†T%^)c±ãt`AVGUe äן|køÏ¤ü¾ð>›'ƒ¼iã¿|Oñåÿ€<áÃáOíW]°ðwŒ~ ß#]x×Åž ðÖŸgaá/øQ–ãQñ©•ìâ²´ŽêöêÞÞNÕÔc½¾[Vÿ-üßC³™«{óßngÓ‘_òü~^›ÿ§‚¿èaÿ„ΓÿÉTÂ+àŸúXá5¤ÿòU|æ¿¶7ìÙ‘¨jºçůxe´Mj x›NÖuÝ-¯|/âû×c×|#«Üh÷º¶Úÿ†&ðLjâñ4V«©Úh«¢ßÝÞ^%„qÝÉsYý°?f Ä·…uެüE¡ÝSF:ý´×ÖÚ—ö>—â¥müãq«I kzN¹•kçj2è÷öúœVÏdþp|þ}®ŸewþÞÚ_Ï.Ÿiÿvß}—Þ}ÿ¯‚èaÿ„Ö“ÿÉTÂ)à¯úXá3¤ÿòUyn¯ñAñg†|7qðãÇ:-øñ®«ð®=?^ðåþ“­OiáO‰Þ+²Ðô¿iöÒ}²Ò[}BËûVoÞ_ZϦ_\é÷8Šñ,îàx6_†>%xá„ÿjÿŒšŸ<,þ'‹RÓ¤ð'ƒ4½&òë‡|ooáŸë,<ãKŸøƒUÓ´/Ûx;^×gð®±w™¯Ç§ßºt'Vü”àÒå½ÒNúouÚÏÏ_’umÍRjûY··/nö_sÖáðOý,?ðšÒù*øE|ÿ@‹ü&´ŸþJ®6o ü4·ºñÅ•Çíµ©Á{ðÊÝ.¾$ÚMâ¯ÙÊ+¯‡Ö²dÇsã‹wøz²øNÝÀ%&×’Â6ÁÚÇbóÂôæðB궆·bßZÙ>­çˆÿgkVø‚÷©o%šx Oðí‹î;»Y-—Aæt¹·hƒ¬Ñ–Óêu¿çÝ>W÷|½äªñÓ÷•:wþàû£ªÿ„WÁ?ô°ÿÂkIÿäª?áðOý,?ðšÒù*¶¿áœµŸú8‹ÿø-ø7ÿ΢øg-gþŽâÿþ ~ ÿó¨£êu¿çÝ>W÷|½à«ÇOÞTéßû¾~_ƒîŒ_øE|ÿ@‹ü&´ŸþJ£þ_ÿÐ&Ãÿ ­'ÿ’«kþËYÿ£€ø¿ÿ‚߃üê+ Å?üEá¿ x‡Äþ(^ÝèZ­¬[YêºO‰tË©ôË‹Øí¯ÓMøo¥ß½¤íÅ8³ÔlnLnÞEÔ2m‘SÂÖŠrt©µ›Õ7eÊ­n·íëµÂ5¢ÚJ¤îÜRßû¶[í§àí¸ÿøE<ÿ@‹ü&´ŸþJ£þOÐ"Ãÿ ­'ÿ’«åO‰_µ¶™ð‡Wð&ㄟî¬<{i$šG4k߃־2iµ_‰~.šóPñoÅß kº6áøwÄZ¶±¨kZ…£E£ÜC¥Oª\Ícß«i¿>xÃÀš¾øç¾-²x¢ÛGk ^ÜGÄÑnµ­GBŽÕž+ã©YXÛëë„^Ûéßñ0h–ЬÇ[$ù#k];-Wº¾}>÷ÜÒò½¹åtíñ=mËþHõ_øE<ÿ@‹ü&´ŸþJ£þ_ÿÐ"Ãÿ ­'ÿ’«ÁuísÁ~Ô~øwâOíûGøÅçðái<;ð÷Ä?.|añ΋EðÊ|GÑ?gxÃ×wk|òÙø·Çv÷š.nšÏˆ.mt¹#Ô¦­á|ñ‡†¾"øÃCý²~.?†~øiW÷|½à«ÇOÞTéßû¾~_ƒîŒ_øE|ÿ@‹ü&´ŸþJ£þ_ÿÐ"Ãÿ ­'ÿ’«kþËYÿ£€ø¿ÿ‚߃üê+Ìü={ª·†/bÔµ)u=GDñ·‹ü%.¯$0ZÜêpøGâ^µá5 ˜,ÒXnµ "+‹È­"†Õgžd·†(6D±:¦â§.ghÚÎïÝ¿§ë¯qÆ¢›´jMµkÞêßß·O?—eÿ¯‚èaÿ„Ö“ÿÉTÂ+àŸúXá5¤ÿòUsÿ¼q |1ðþ$øªâ[O ü>ð‡‰|qâK¨-绚Û@ðž‹{¯kÃkk×W2çi÷2Goo ³ÌÊ#†)$eSüùÜÁGµOã.“¯øâ¾¹kñïDÓ5ÿøöHøiáKWÁGXñtÞÖõo…~<×_tø—â½×DÑtýKân¥hvÿ ®uÝoÅvÜjºoˆ;rüŸ™ÓÄÕÂÒ¥*xH)Ö•Iš^ë”cv¹æÕ95­”žÈãÆf˜lL=T•ù¯GË£ømÓ­Ÿ­ýM9šûrÿÀŸN_ò_yôü"ž ÿ E‡þ:Oÿ%Qÿ§‚¿èaÿ„ΓÿÉUóoƒlÏÙ¿ÇÞ#»ð÷…~&èšE¦ü7Ô´Ÿ-Ô1øgÅŸðµ®þ![xFϤ’¯ü$W“§Ã/êa­-´›{}Mn§²’y­´“ö½ý˜¥Ó,õˆ~7ü>¸Óµ/Áà}6k}n+‡Õ<[w j+²Ðô»hK­J÷QðΕ©ëúh±†â-OH°»Ô,$¸¶‚IrÛþ]­-ö}-÷é÷¾áÌÿž]>Óþïù/¿Í@Â+àŸúXá5¤ÿòUðŠø'þøMi?ü•^]ñKãg„>|>›â-Ì:ŸŒô¿øKü-à ;Lð$š««k^5ñ—Ä='á^‰á» uMsCðüÍã­jÓAÔ¤Ö5í.ËE¹KÏík»5²º1sžý¦~xÀ_ð°u7×ücoñkOø«è¾*Ñ̺îƒñoUø¥|&Óü¨Gá+i3]x÷]ÑôD×´McWðš%ôzœºôzL—Öç*åRäM^×åM]r´½Ï@¼´÷çÿ>œ¿ä¿Ý?áðOý,?ðšÒù*øE|ÿ@‹ü&´ŸþJ¯|AûY|*ðÇÄmwáö¶ÔuGÔ×]>"ŸáÃ[øµ¯,¼9yá[;Ký;LÔ>½ñ=¶‰¡ø =üvÞ ð¦¥ãOê·÷5ñ‡‚tˆ,4ÍJ»¸1ê\êw“í¬4멜("“²PW{]/-þç˜sKùåÓí?->vG¶ÿÂ+àŸúXá5¤ÿòUðŠø'þøMi?ü•^¥~Ô¿u[oÎ~&øwGˆtÿŠ~´ñ,ÓxnóQðF¥áGñ¼Z³C¬Ãf-¤¶ð¤7:\þ]"ðiÚ´vW–×Riz²³ÔÅŽ¢I#Y^7QÓõkr"œÙ_YÝ„ò. ‘þ0Õ?ࡳž•ð;ãOí .£âÛ¯‡Ÿ|e«ø[{ Ïs¯xÇ[Òü/áïÁ'Ã\­ÏŠ´½sÂÞ'Ó5ýTV±µºÐÅî»pöš%•Æ¢­Fö´O³éý|ØsI[ß—þúrÿ’ûÏ´?áðOý,?ðšÒù*øE|ÿ@›ü&´ŸþJ¯›ì¿k?†·ß“à4_¿á!“ÅR|?‹Å/¢Ø/‚¤ø‰Áø>=Mà‘x5“â4Ô¢øUq‰ÛZ“à àÇ/Iâ`4cÞê_´ÁMÄž5ðŽ«ñ7Âzwˆ~ië¾=°»Ôã€x?JƒJÓ5Ù®|Cy"‹ -£Ñu#V{k«¨î×NÕ,/<Ÿ"òs–ÚrGD¹VÞí¿O½‚rþyéo´úrÿ’üOSÿ„WÁ?ô°ÿÂkIÿäª?áðOý,?ðšÒù*¼N_Úöz‹Að߉_â烱ü_©ëZ7†§ME¥¸Õµ_ Ü¥Ÿˆì`Ób‰õ4ŸÃ÷2Á¸³ÙÄ4†¸¶:¶[˜O{£–ÛÂ=©wþÞÁJ]'.Ÿiÿwü‘Cþ_ÿÐ"Ãÿ ­'ÿ’¨ÿ„WÁ?ô°ÿÂkIÿ䪿E-?–?ròÿ/Å÷åüóéöŸKò+ñ(Â+àŸúXá5¤ÿòUðŠø'þøMi?ü•Wè£Oåܼ¿Ëñ}ÂòþyôûO¥¿ùø”?áðOý,?ðšÒù*¾ÿ‚™éú^›û|cƒI¶†ÖÙî¾Ê齂´Ç⇂‘¡¶y#f(ˆ¾amÅUT€WßÕð?üëþL—ãý||9ÿÕ¥àºRVKDµŽÊÛ¸ÿ’~ ›º¼¤õZ6ßeú#éÙ³þM·örÿ³}ø#ÿª¿Â•ñþ¿ð›ã=•—Œ$ð_Â_éŸçÕ¾4é:/Ž´¯‹_ `ð‹üãï‹~9ñç‡ô¯ˆ¾ñ_¼W6¿áÈm¼Qkw{¦jUÖ¿¢^ɬÃáMSI“R½¸¼úÏöxžòÙ³ön6–?mfýŸ¾ _´Åmåð»Â˜;¥S¿q$`cÏzõŸ·ë_ôÿÊ¥§ÿ[*Ó¥9òhä”nÖߺö¿Þ‰TÔÔ•ÒiÚö¾©[¿_ëCøk°ðçí?ÿGøõ¢~ÆÖQ|ø_¬üø¯iHøS«ø_õ´ø›s©x£E³:N—s¨ÚjÓOâ‰tK 5ÞŸáíS^ðÜëe&‘o©k_Û_ÁïOð«áÂÏ…÷~$Õ’Çâ j<ñ>©Ì7v“+Ä +?ìí#g¥ü2øK¯i~5Ñ4ßë¾>Ðîþü1ðãø¡µí{Åþ7ñ…¨Ñì4_ ø{C¬wW^¼7šµåãi«´“_M,¢ÒgEøÛÁþø—áûŸ |GøYá/ˆ¼–ÚâïÃ^7°ðçŠü?uqg žÒ{^Óïôéæ¶™D¶òËlÒA +|ÕÂøö~ø%ð»X>#øeû3üøuâ ÛwÀžøyá dÛHdƒûSÃúŸ}亻‹ÏØÊÌpMvpþY…È#œ,<êÕyÆmˆÍêFj*4kbháéÔ§ jáz\÷n÷›ìyÎg_9þÊU©Ò¥ý—–áòÊn›mÕ¥B¤ç •.´«8»]Z)õ×è:ËÐAðêA_è*ÀŒeÒ,ƒ)T‚<‚<Нöýkþ€?ùT´ÿâ(û~µÿ@¿õ´ãÿä~¹ö¯G›Kwkôÿä/‘Ý;­­¿~_ëúWøgâŸì—â3â¯x£á‡‡¾øÿGñÿŠáñÖ¯ðËã\šÎ¡è>9–ÎgÅžñF•á?ˆénšØŽmWQÐo< ,ïâ íSR°ñF™§wbß’Ÿ?kÿ¿ðOïÚãNñ'Ä_xI<7ÿ?„>Ý|<ð½•ÿü"ß¾hÓ]ê–ZÇì×®ÝÙGuáßx;ľ0 x»ÀºÕ¼·+Ö´? £Á£èzÿ„¯´ÏéGíú×ýò©iÿÄV³¢ÙøŠãF»ñÃí]ºð椚χîu•Ñu;WŽ7†=WFšöÎy4ÍI!’H’úÉ ºXäxÖP®ÀÆu‹Ïs<¯ •ásÜfއÄRŒR­EœâêaêQ¨ùeJ¬$âöiÚI¦¬z|%È3Ìnsšp¦[žK—c05ãVrÃW…LMJÊ8Š6”qj¾Î¤dÓæJI§tvñ¸’8ä”HŠáXa€u cø€888#µ~vübýŽ<Ö¾|Pñ/|§h>1¿±Š5ÏxÏÁZî$ÒüZ³jš—ˆ¼!¨ø5£Ôõo]—þ;m7Z¼ÒÇß?oÖ¿èÿ•KOè˜ãÛùQöýkþ€?ùT´ÿâ)T…ôjáñhâpøŠNŽ#ˆ¥ Ô+ÓŸ/4*Ѩ¥Npm¦ã$ÒjëT™æJœe8Í^§QU£(ÍÆt¥œe‘jQi;^-6´ÙëüÛüxý³ÿhØOöÌ>,ø±àÿê^³áø[ðF‹§s¥|Sø_§^jz¶ŸâÏÙÃĺ…©Ôtßø{Åž:ºð÷| ¯­Õÿ‹|G¤ø}gþÊÓ5ÿ jZôÉ\6±¢Ùx†ëE¾×þhZåï†õ«xzóXMSºÐuQB5=âöÒyt½@Bï½±x.|§hüͬAÝû~µÿ@üªZñÂÃã¨âs¸¼Ê¦:Ž/Ø:)B/IÓ„e†„ánz1–´â×îãî¦Ï¢Î3——pþ,áì.KŠÊ²÷‚̱XJÕ%沬çKZŒÛT±Î|•eûÙ%&–—øŸÆŸ³/Ä øÃÆÞ,ø'eð¯ÅoÄ/]øÓVð7Å]Wľ¶ðߊµ±lÞ*Ö|7â¿ø[â›Oñ%üW>"Ô<7{àÈ.冧}oâ«kKïìûoÉ/‹ß¶Wíû þÚÐêÿ¼áÛ½'Äš~k>Ðmu t ìuMRóAñ·ìßâ Ûo¶ÚøƒEñWޝ‡¦ø†;4‰bk›M+V³óÙ»þ³ûKx—^Ò¼_ûK~Ñ^%ð¦¥ð¯ö‰ð÷‹t‡º†…âoxçÿ ~ x{Æž ×luË«¹µë=7ųh6ÓÏe©¥¾»¤Ã<–·0Cwcý=ý§]ÿ ÿÁ­§ÿGÚußú§öµ§ÿùþö°â\Úž¦Ž*tpõiQ¥R•4£Æ•aÕ÷~ý4•K[™«½µø©dYuJô±Up𫈥9Ô§V¥Ü£*µ•v×øjJñß•6—CNòáŠ<çË#ϮŠŸÇüÉþÙßðFß÷>$ñÅÙßãN¡ã{âWÇ¿ø¦çá·Š4_øÃÞð×Å¿ˆ(ñŸŠõ9üGgk«jV^ ¾ñ#Égiekq­k–ðژ̯5Ü_ÒÏÚußúüZñ}§^ÿ ÿÁ­§ÿÓ<×&[›ãòŠï—âjaêÉ(ÊP·¿hË–WNño•µ¥þV:1ù^3£Ü=¾ÿgŒÌqùR©‰“©R”ehþ9º•§^R¨ï¬œëIß¶‹cL6 Ž3†*œ©Ë‘irR¥F1е”T! %Öîúé°zŸ©þuùÿý€äý¬ü$¾5øSâI~~Ѿ Ò¤¶ð¯‰#¿ÔtýÇZ,=ßü+ψéó ŸK¸¹ši¼9â_²ÞjÞ Õî%½²Ž÷FÔoEÒ§W ŸPû~µŸùñéý©iϹ;?O×µ/Ûõ¯úÿåRÓaòW”¥¥’{Þþ©~_Ÿm}íªûüâÿ¯øküc{û xjÓÁžðÇ>!kÞÔ|#âßÚ;^ѵí3Ã~ÔáƒAý§|WâßøïÂKáÍOO“CŽÏI'·Ó¼'¨Ål·zL>Òüõ½´›RÓïv<ûü9øoà{Ÿë¾!?¾2ÜücÐ4ÛåÓîñxÿ³<ÿ³Ÿ‡o/¤·û]Öaá9c×c½y?´e×`O6sfZ#õ·Ûõ¯úÿåRÓÿˆ£íú×ýò©iÿÄQí$þÔµóïË׿¾æºuô·õÖÎÝ/ó÷…~ÿ þøHÖµ_xGáf­ðbÞŸEŠmn#Á^=´ÕüC¯Ý¶“êô“Òiöv;lbÒf–Ù%k¹V7ü ø{ð×áÆ£ñëãÞ¯ø+×ÿ´Ž¥ðËÀ°|3ñ&­øjëö§ø±¤|cø”¾)ñ«ë´1¶ÓüU¦Ïmàøí<)ái´Íýíu[rêÞ Å÷ï·ë_ô÷ÿ­§ÿǸëGÛõ¯úÿåRÓÿˆ­©b¥Jü©>k]5Û–ÚÞýUöêL©sò¦Õ–Ö}ùoøY~]/ðWŽ?e‡þ4“ãœ?µ¯ƒü!ñâw†~0øOÀžð/ÆíÃþø |c¹øÇ¨x«\½‹ã+x¢]CÅú¼Ëmâ«_„~ ø#¡ê7â_&‰$Ñú?Áƒ~x¿Áž'øyñ¿áäVv¿¼?ðëâ⟄_|x𖙢|`øñŽãRøaâ|bñ~jºî»ñcÄQjÇÅ^#ø§a$šo…®­¬m£ðý¥•}]öýkþ€?ùT´ÿâ(û~µÿ@üªZñªÇÏOr=?ößóü_dOÕ£Ýôêºòùúþbÿ…ýð‹þ‡ðQâþTÑÿ ûáý0ÿà£Äü©¯û~µÿ@üªZñ}¿Zÿ þU-?øŠ>z{‘éÿ¶ÿŸâû ú´{¾W^_?_Ó¡ì_ð¿¾Ðãþ x×ų_‹¼iñK àG„ñ/íâXcð¾ |-øS¨ü:øQ¥øzïHø{û=ßøßSøkcñMø¢übðŸÄ~ÖÿÆzŽ««·†¼5§Ük>ðî·¤è:6§l÷ïO·ë_ôÿÊ­§ÿôïëÓ­oÖ¿èÿ•KOþ"º£Žœc¨¦’Š×·º¿_ÇÉ_/«EÝÝêÓÝuåÓ_é£å›¿ƒ¿ö0øû+ÇûEØkþ-ø ᯆº?†~4øÃáÇ,µ[moá·…›ÂÚW‹<=¢üñ‡Á½SÂúÅ•›¼:ÎôÛi¥´ïKãºÔ¯/üŠãö6ø-­|L×|ãÚs[ñtž.𵧈õôžñ]¯#ý–aý•µoxBÏÁÿ´‚º#jÞ[ÿG¤ëüU.®kšºi:½­ºèÇFýû~µÿ@üªZñ}¿Zÿ þU-?øŠk==ÈôÿÛÏñ}}Z=ßN«¯/Ÿ¯éЧðÇ>ø[àM7Áž5ø­ðÓÅ áý;EÐW÷{z¿ÃÈö/ø_ß¿èq‡ÿ ÿåM|åáß2o ê÷¿g»‚kâGÄiéyiueu.â_‹Þ#ñ‹w-•ÜP]Ú›ÝR²½X.¡†â(æUž(äVAÕý¿Zÿ þU-?øŠ>ß­ÐòÕ-ü>C×éYTÄÊ«ƒ’K‘¦’êß'Ÿ§ãäT(¨]§{Ù6ß’üÛ§C/â'´‰ÿüsðÓÅPÍsáˆ~ñ7üGoos=Äú‹tKíX† ËY!ºµš];P¹Ž;›i¢že–DVˆžÿ‚rü{øEð*çJ¼Ó> üsñÿÂï‰ÿüUáI%Ò®4?|qøiñcX´ñÄx»Å7†ÄøKVñ§´ý#Æz¿…´ÉåðŸŠ-|1£|,ñ>»wà½KU¿_Üÿ·ë_ôÿÊ¥§ÿGÛõ¯úåR×ÿˆ­py…l#^ÍFPöôkÊ•XóB¤¨ÝEN7Ö.5%'¼dÌq*x”ùÛŒý”誗-H¯#“Œ¬ìÓŒkf´¹øû ~Í¿~2übø?ûMøÓà烿fƒ>Ô|Sñ3Áß 4x5+oxÇâ7Œ|1¯øMoÇZN©kcàûxcÄ ±·ð®¡öˈo5X’+M-$Ǩ~ýë›XŸímà ð5Í8“Ç`$ö“ÀªË{¬¨!t½N©h2O9á:“É?&—íú×ý=?æ)iŸÃäÿ>‡¦cšWÌñ+^4 ãB*ãJ•(E¦¡+Ù^Ww½Ûlœ_OGØÑ”æœÜçR­Nz•*K–󜴻µ’²Ñ$—KüóñƒöFøIñãâ7‡¾ |QÓîüK†<1g¡i>7·šf™£¥øûÃÿtŸ=æw§ê²ÜZê~M½Ò&»“A×ôGUÑ5ý;RÒuÛ•u/ø%×…µAðÛO»øëñN |1Ñü ¦è>ºM*êÖ| á}S°µ’É;J°×`Õ§Ö5»+M(^\kÑÇw­ “M¦Íúaöýkþ€?ùT´ÿâ(û~µÿ@üªZñªÉ-/gm:}›[ð_'Ôêä¿o¿ü?ð>ï5‡“þ ïðÚÛâ†>)iþ0ñfŸã üøaû5¥í¼ZI¶ÔþøÓÆÚ‰¼5a-¬–¨ß,üešŽ«cž³áÝOÃ: ÷†µ Ž­c©×ø#ÿõø}ðO[øg®é¾+Ôu‹ß…>)ÒõÍòãBÓ-5M[Hð÷Š_¼7áÿê¦kËY4]âLj5k[»%Ò ‹U@Öz]•½íüWtý¿Zÿ þU-?øŠ>ß­Ðÿ*–ŸüEÖZêõItþïù¥épö~:ÿ†ß§Ý篋||øgûAüÕ¾ø»Äëo©x¿Â^.þҗš&³¦LÞø›¢üHðþ…­xKWûN‹â gðþ›áߨ_€šþÚŸìòß0çÃÿäø3¨ü!ð¯Âoßj×öžøÅ£ücÓ¯|?ð¦Þéÿ|9ñ’ÿÁ¾ðOƒît¿ øcÁ:Ž¥áØ´+m2ÆÚ[½M½¼½ÒïáÕßíÕ÷gÛõ¯úÿåRÓÿˆ£íú×ýò©iÿÄRUI&Òº7Ëþkñ[X|};^ýíþ庿Ç_ÿ`Ÿƒ_~$xGÆž"µŽ Â>µÑ 𶛦A þµ}§x'Å? ô[Ä^3º¸»×uvÑüâÛý&À\(ÕA‚Ô\k·wÚtËŽÃà§ì¥¢üÑ~#iÃÅ—>)¾ø…áOx[›ï øOGÑô¯|9ðïƒ|¤/„´m>ê·vzV¥{ý¹ªjV²Éâöºuĺ.—¥év_Jý¿Zÿ þU-?øŠ>ß­Ðÿ*–ŸüEÑèºim÷mù¯Ä9•ýW[šû½/ù·}ÿÃð>©áohz¯Äïê×ÞÕ>$&œ5=ÚëÁVø©£ü>ÒÔÃx‹Yñ¥ßÃKÏ èŸâÿÚéðëÚ_Š¡ŠnâîÁµ(4;•ºW7s[ZßǤÇi¦ÚûÛõ¯úÿåRÓÿˆ£íú×ýò©iÿÄQíVwküù_ê¿!(v·N¾‹õüíçá?üâßüpý”üa¡éB÷ß |kñCVñ¶£öý2ÛûNñÁ¯xSG¸w—°_j?l×õk +I¶¿žÜNn®£‚Ê)®cåk/ÙÂßµu¯Ãˆ˜¹·üÀº÷†ü)£kßÖ4 } QÒ­5ÿê:ͽԿñ1º‡[Óï4ýNÌ_G¤±&?ø‡þ MðÄ~ø»à{¯üzŠßân³âíkGÕGÇŠRßü?›Æ?|-ð#P¶Ò–_5¿ˆlcð‡†#‰mß­Ðÿ*–ŸüE(Ôkf÷O½þ_ï_Âö½ŸÏÓü×ôÕþ2ð¿ì'àß þÒº_ígãŸjΑs 彎·e¤ë~'¹0üµø$<=«üUÕc¼øƒ­|>m"Ño ëþðe†›á›kÛñià˜4x®öÔÊž8×ü+/4³á{ísNšvŸqy¡ÜÞ_èÿe³µûWíú×ýò©iÿÄQöýkþ€?ùT´ÿâ)ª®÷»O•$ÿðóûÇɾ‘Ö××®–üÿ>­_â¿~ÄQ|7¿ð‹>üO¸ðŸÄOÂȳÖ|QaàOÞéÞ0Ñ>)^|<¼ñ%®³ kwz¤ƒZI~ø7û;Ä«­K©EŸ-­Ú^é³EaÞ‡öýkþ€?ùT´ÿâ(û~µÿ@üªZñœù­/Ç—ü×ãä .:®É-¿®Û«îQXoÖ¿èÿ•KOþ"·ë_ôÿÊ¥§ÿK™^vÿär¿.{Ûüÿ­/¹Eaý¿Zÿ þU-?øŠ>ß­Ðÿ*–ŸüEËúó·ÿ$…Êüº~6ÿ?Ìܯÿà§_òd¿ëãáÏþ­/×ÛŸoÖ¿èÿ•KOþ"¾ÿ‚—Ës7ìCñ‰î­>Ç(ºøt^z\eGÅa¼ÈÀ^rxê1Ö“iýëó‹ýPÒiÅé«_£ý­[øà?øYÿ±gÁïxÏÀ²ø›öeø7§ZøÇáï‰uxËÃ7Ò|,ð«Yk:½¡ÞXßÚ^X],7!qö[Øã{+èg²¸ž<á×ìÙñ;SñσŒ.¾4|2Ò>ë—þ!ñv™ûgþÓôÿÚ_ZÓ0t‹‹øÇãWŠ´Ï|2¼„Á«x˾*°ÔüI{â?;Áúuõǃt¹|IãO«g»ûm3ödý/.Ý’øð&"ɳ¹–ïῃí-Ñb…^G2\M`*[,UU˜u‡âïÅۻŚJï`©›”˜‚B®OÌÄ@$ŠßžIÍ$­'mRmY­›Öû'Ýêf£uk´•·ënÞi ~Úž-ñ§‚¾*ü1×t_x×Å:,:E… øàügøcâw^¿ñ¾›n¾7ðÿŒ¾hš¯…ÛC ½¿‰4k{x"Ž †H¢†bEŽ(bŠ=©Q"ªG*¢*…P€+%îݤµÓû¯ðêõvü k}uzhúòßï·Ë_—‘þÄÚ½¢~ÊŸnü_©|FÕÒ&ñg‚¬ø­âeÕt-oWø;¦jžÐ~ê·zÖ‡ãÙÀŸ¼Oã "þmIîàKOˆž!Ô4}& ¦Ú}–ëÃú•ÝÍðŽ{ ¨¿k€Ÿ´…â]IñÇÀŒ‡ì“\ñf—áhÞ2MO®„z޵…üK{saf^Öò%–èE Á†æß÷…eŒzÃÿÚ#Lñ7€¼âO‡ÞÔ>xƒÂ×<¨h0ÝÇ¡_x3VѬµ ÞhÑ¥Ä(šM·=Œúr$q"Y¼ ±¢¨QÓõz¶ø#Ñ4ÞËÝûž×òÛk*‘ÓÞíßû¿ðoó>^Ó?h_ÚWÆZ¡—O±ÖôK=÷Z×´oÄ^ñ6›¢K½ð㩦è?Ó¼?¤2j–ñï†ü5-âiv÷·Vú­ý¦‘$—Úµ´·_vüñ·Ž¼wðÓKñ¿g+jÒjöŸw?‰¬¤ðµÕãizÅå„wÚm†£Kou¡^Cw6¬ðiÓêVRGs6›i#ml!ñ·Ä?ô Ñ¿ï›áǧü~zRÿÂîñý´QŽƒeñ÷éö¾}=O„¼5gkS‚Ûw¯Ùÿ7~úüš©²¿ªÿåøkÛ_ 7ø‹þ|ôüjüÏQ¿Ä_óç ÿàãSÿæz¾~ÿ…Ûâúhß÷Í÷ÿ&Qÿ ·Ä?ô Ñ¿ï›ïþL£êµ’=>×§ôþ{ëwíaßúÓüÿØúˆ¿çÏAÿÁƧÿÌõGöÝbÍ6ÞòÏJXoîæµ2Zêw³Í‹M¿ÔwˆfÑ­c2ذgŒƒ"¶NݧÀ¿ávø‡þZ7ýó}ÿɕ߸7Æþ0“M¹¾¶´¶{/Mkh& Ë'…!‹IºÕõI^ñu;]CM·³M2{yoxßöŒý¥§ðç‚øKÆ–K¦_ëZ5×Äki5üð¿ÆÝgÂ_üQ£j^øY6£-Šï´_…^:ñ•üϪØé²-ÕÖšáÛå]CUÕt= ÞÿR´û'^ÿ‚ƒÿÁZ<'/„-5ð¾·ñW_µø©[h? ´¯M­kŸ¾iú¥®Í«ëðŽé<&Œ”gs8S¨­$ýÚ§R é£å’~­ú UƒIó»].½â»úúÝüÿ£]þ!ÿŸMÿ§ÿ3´oñüúhø8Õ?ù¯à#ãü­ûx| ø­ñ#áU÷ìõûøŽó῎;ØézÍÏ…õ«ÍmJÆËÄ>:Ñõë+k¹-x­5+NÕ-UÄÖv÷1ÉùÏüF9ûsѰþÉÿø ñÿžef°µ´÷#Óí/îßõ¿«ùžÒÌútÝ¿äÿŸúïñüúhø8Õ?ù£ˆçÓ@ÿÁÆ©ÿÌížüF9ûsѰþÉÿø ñÿžeñçíÍÿFÃû'ÿà7Åÿþy”}V·òG§Ú_Ýÿ'÷¿™í!üϧGýÛþOñùÿ¡îÿÿϦÿƒSÿ™Ú7ø‡þ}4üjŸüÎ×ã€?à¥ß¼A iW¿~øWà—ˆn?c/ã~·áï蚤0xoÄú…Ö°úŸÅ;¿Áñ#û&ûá?€´<'¯|Qøc¦µÅÇÃÏøX¾ðÿ‰?i+O¶½ h›ßðT/ø8'ö†ý†᛿áWxönø™ÿ ‡àæ§ã­kûz/Kö÷ÑŸÃ+¥|Qðoü#¿`û?ŠƒÄü º}ßü$iÿ~³öˆþ5ógþƺXEY¨Bæz«´—º“»~‹ï¿`uaw'Ó¥ßÙÿƒøõZÿWûüCÿ>šþ5OþghßâùôÐ?ðqªó;_Î@ÿ‚†ÿÁWŸáìÃ_ðOH<1yû2ÃûBé“êúí¡kZÞ öú÷où?Ççþ‡»üCÿ>šþ5OþghßâùôÐ?ðqªó;_ÄÇüÛþ{ý«?l?ÚÃáGÀo‰>ýŠþ ø3Æ^&ðö¬ø›Z»ø—¥ëzÔZ·ŠtEà߇_ÛßbÐ/¾"ø†}v8ü;g­Ý[ië¶¡|é©Oeo¢jŸÑfûyxÊüðíõïÁ NoOãÛ{Í#ܺ•ÿĶÐï>Áx~êúu›ãøÿ _³øÇ4wĈµk߆>%go…F{ëO ŸU­§¹Ÿiwþãój¤4÷ßMÓ_Ë~¾¿ÏôïˆçÓ@ÿÁÆ©ÿÌíüCÿ>šþ5Oþgkøáý–¿àáÛçö¹ý®¼Iû'ü2øqûEw¥kß´Ï|BºðŸÇÝwBñ½·Ã;ë=3ÃÙkáO‰ZÆ… Oñ#QÔ4Ë-_ñ·Œ<5ðÛM¸Õì"Ö<gçØ>¥÷ ðQOø*Ìß ´ÝkBÿ‚tXj¼ã¿_hš&ûC|B×´¼®xSA“Ú-§ÃŸˆ*Ó¾"øÃO¼ñEÉñç…ü¬êZß ð7ÄkÖ±×´Ï E¨jºO‰£%ÂÎê+I?v¤)ÔƒzhùdŸ«~‚H;{Ï{lú8§ù?Ççýïñüúhø8Õ?ù£ˆçÓ@ÿÁÆ©ÿÌíž®·ÿ„~Ý&³«hÒ~ÍŸ²üšF©¥½öÆi4ûÖÓk».~"ÚÜIgrÑ­žâÖÚvÑ¥‚ F¹ŸñçíÍÿFÁû'ÿà7Åÿþy•ŸÕk$z}¥ýßò{ùžÒÌútÝ¿äÿŸúïñüúhø8Õ?ù£ˆçÓ@ÿÁÆ©ÿÌížüF9ûsѰ~Éÿø ñÿžeu~ÿƒÀmøßÁ¾Õ?fÙvßLñŠü;¢j3ézÆ+­N WW´°»›NµOˆ·Os}½ÄiÛ\4×8Ö ‹yl}V·òG§Ú_Ýÿ'÷¿™í!üϧGýÛþOñùÿ –ÿÿϦÿƒSÿ™Ú7ø‡þ}4üjŸüÎ×ãÿŒà¦þ)†Ú?]Ðl~øÂ¼ >Kñ*çÆðøÛHð´žý´(øUÄ}kö`ð?à ü-Õí4]WL»øÛà_IñÄw^&оMùSÿEÿƒ…¿iŸØ‡ö¸ð¿ìñðáOìëãýÄßõï=ß‹lþ%ê^%еmã'Ç…: ¾Á>4I/tψ>øSá_>³²ðÐÕWÁ_4 ?K>-¶‹Jñ‰î–Z¥:P„yêN4’\ÒqI?+½wÝõk®äôWz>Š-þOñùÿZÛüCÿ>šþ5OþghßâùôÐ?ðqªó;_ÎÅø('üៅ>(xÖÿDÿ‚pxáÏ‚~#h·ºÌ¼=uã]Ŷ_u µ†ðÃüIÔ¼wðïÁÚbü-×´aâŠ~ðmÄÞ(’;K@Ñ4.|Oå·íÑÿ,ÁB?az¯À_|ý|{¬iY¿¹Öô/ þÑ^²-ˆ¼Iá‰~Ïgâßi—Z†“©ÜxjøKĺKê^ñwõ¿ ø£K¿ «ËacU¬¹#§÷—N[ôõü~gµ†žû{tÝõìÿŸöï¿Ä?óé àãTÿævþ!ÿŸMÿ§ÿ3µþx_ñçíÍÿFÁû'ÿà7Åÿþy”ÄcŸ·7ýìŸÿ€ßÿùæQõJÚ{‘éö—N[þ·õ3ÚCùŸNû·üŸãóÿCÝþ!ÿŸMÿ§ÿ3´oñüúhø8Õ?ù¯óÂÿˆÇ?noú6Ù?ÿ¾/ÿó̯èCöCÿ‚Î|yý¡¿e_ÙKöƒ×üû>C«ünñׯ-Ç~ðÆ­â5ô=Cá׆?i­kÁ|1£x—ÆÓêZŸÅo‹—¼/‡¬èz‡5­>/x`êÿ$Òæð¯ˆ¼r}V²Þéö—÷àýïæ*þwÓt×òßõü_¯ô[¿Ä?óé àãTÿævþ!ÿŸMÿ§ÿ3µüîÿÁBÿà³?cïÙWâ§Ç_‡6ß³Äÿx ö•¸øC¤[ÞÃâoøF5Ý5þ/~Ðÿ n¼äh¥¿ÿ…©àOüð¯ÄŸêºÄÐ]h_tØ$ø{ák´ïk>/û*ÿÁY¿à©µÏÀ¯†?|ð÷öÐ|9ñâg‰>jºŒ´ÏŽo EñN¥£]Ýk>2ø£á 7â³ñ/PðOˆü/ðë@ø<> ÚÍâÛ{_ xçÄ>Õ®M¼w&T§YB”çN¼•ùª&㥶jœ®új%VIÉÝ«ìí§%õüý_ÏúŠßâùôÐ?ðqªó;FÿÿϦÿƒSÿ™ÚþAkOø.ÏüöIøß|GàOØ+ÇZS|bñOÂ{=/Á¾ý¨BÜÉá¿üYø~on5ÍkÄzf• x¢k„—¾,¼ømâwÑ<_eàø Å–Öú–¹s™ùyÿŽ~Üßôl?²þ|_ÿç™P°•¿’=>Òþïü½üß´‡ó¾÷}{?Ççþ‡»üCÿ>šþ5OþghßâùôÐ?ðqªó;_ç…ÿŽ~Üßôl?²þ|_ÿç™GüF9ûsѰþÉÿø ñÿžeU­ü‘éö—÷Éýïæ{H3éÑÿvÿ“ü~è{¿Ä?óé àãTÿævþ!ÿŸMÿ§ÿ3µügÁ9ÿà鋟´wÄŸ‰Þý¥?g†>ðÃσ^4øÑ®øçá>«âmßÀÞøkiý¯ã gÅ+ã_x¯ûnmR t¿øÃzLD¾!ø‹â_ èz—ˆ43P¸Ö,?sü/ÿñn¹kàyîuÏ¿‰¿g]âeàu=„ëzìåy¨þÐú™ñ"B¿³·ƒeøÛâû={DÝyÒü%×Lÿ´6›S‡Ã‡Õk$z}¥ýß/_Ƕ­T†žûéºkùo××ñùþ±oñüúhø8Õ?ù£wˆ¿çÓ@ÿÁ¾©ÿÌíðOOø8?þ Aÿñ‡Äo|;ø#ûx[ÄþðLÞ1Ó¬5O |xÔÆW)r–ðøWMÖÏÄ­+À^Õ®¢ûUü‡Ä_ø+Hš×N¼‹O¹Ô¯U­¡þ¸<)ãßx£Â_¤³ðæƒ7>"ü=°ñ¶«§Üë“é~Ñ< ×Þ"HµK+/^\Å«âK &{{ñs ½Ä·Â8<ÙU|-l2£*°ŠU¢¥M'w%Ì£wÚî-[ϨéÉMµ;­î­ü¿.þz¿Ÿ§ïñüúhø8Õ?ù¯„ÿà¥O}û |O¿tXZþÛáUùŠ7iR/¶üFð-ÐŒJÑÂÒyk6Ï0Ãr yhÕW>3ñ¿‡õ_Aâ¿ øCû_×í¼2º„üaªk—V:ëÍoj×6:§„F°ý¿ükÁØWâî¥ð¾Î÷Lý¡ü¬ø›ã”÷ž*ð þ ·ðgìñ®|hñ†·ðËÂþ$´ÕuOè“Üxk[›Áëuª^ÚxÃÖúögˆ¯Æ¯k®Ç¥ÿ¹“Tð¿‚í?gÏñCÅ·z%Þ›àçø‰à4ؼ⟂5øíá¯ÞøÉ®ŸHK»Ï|?ñ&áÛxn¯tÏAiþ“wá›ëo?ÜW_þ Þø_ែ®þø*ãÂ?$ðô¿ ü;.ƒ`úOÃ×ðž…/…ü6<'dbò´hô Ï6gšÅ hóM¦²5¤²Dß—º›ÿÁøçñûAýžü¨~ÊWz/ÂûßüWðgƒ<ñᵤümñÿÄï|nø_â ¿„4Ù.o5­Gá—€ü)cªµ·‡õ «û 3WÓa¾±Ó4E‡RîåòÇî_åä¾ãžï»ûÙú»ð³âƒñ{áß‹Žö/ |Pð„>!øv-NÝmu(ô/ø{Oñ.‘¡j¯*Ûß&Ÿ©[­Ü ,‚Ä‘‰.ãÞ×8o|%àËO è{áÿ Y^\XøGÁÚ4—Zv‹oywm¦\ϧxkÃvIn—7PhúMäöšF™“G¦é·2Ån-¬åhú:9cü±û—ùy/¸.û¿½† ç¯½QG,–?rÿ/%÷ßw÷°Àôõ÷¢Š(åòÇî_åä¾à»îþöƒž¾ôQE±þXýËü¼—Ü}ßÞÃÐs×ÞŠ(£–?˹—’û‚ï»ûØ`zzûÑErÇùc÷/òò_p]÷{><ý°]âðf§,LñHŸ ~6É‘»$‘ÈžÓJH²++#«ÈêT«ÀŽ*߉ì|E³q¥Á¥øNßáä– Ú/WWûBE¶(àÓ!ÒKM5!b[F¼CµŒÅÕ@h~ØÈ²xWÔ2?ÂoŽês†Vð¦œO#‚ `òyôÀñÏÁ¿…öɨù Ñ"د·d2.Ü1‰}ëÇ®Ÿ¶Ä%´œRºµ½ÈÝ«ik~7= :ŠÕ7)$ד§¾ºï§Uärß³¯ü߆c$…ðôª71buUTnbI€ 3¾5ø NøŸðÃÅ^×<'Ž<3âÝS_ðï‹<)u¤¾·¦ë¾×´SE×´­cLXgK½#SÓõ ´ÝB ãkyà»kyr³m6ÿfÈ£‡à/ÂÈbP‘Ãᦊ48õ}QFI8UF{¦½ûÀÿñóªãþ‚:—OO2Ö« üH_~X_ÿ$&¶Óôÿ#ùÛøÿ÷ø—ð³à÷íUi®~ÎÞoŠß¾*þÑ:‡ƒeÐ.5«sqð‡â?ÆüYø[àÍkÆQø2ÃPÑ-ü ©øûX¹:=¦Ÿ¨ØØêñ^Ýé·2L˜ÿ?þ%ÿÁ-?àª>;ð_à +úÉðˆüû"üøâ Bßãřnjþ/ü8ýœjo‡> ø­5݇-¦I+üM×üQâ{ øãÅ>;ñ=—5ئ¼øsâ¿é6žø+ðúûá¯câÀåž™áû;»Ox6[›éŸìµ;ø÷Ç^¹ýÿ„'Æô(øŸÿ¯ÿ"Wé ù½ÿOŒÿèQñ?þ5_þD£þŸÿУâüj¿ü‰]ÿ·>§¬ü`ñ‡Ãï…¿³¿Ä?оøcûG|=ý–~+|MÐüCàýøâ_4Ï x_Öäðˆõ ;ÄÚÏÃ/‡^ñ×…5/xÓLO}ªKaá]^°ÒuwNøâíßûJü)ýà£.¼ua¯øËö3ý¿ü=ð'Áúêü2Òµ¿ü$¸Ö?e+}WJÖ|á»5¿Ëcñ§Æ auá½>ÛX¹¼·Ð಴žâ7†ðíøB|gÿB‰ÿðAªÿò%{ÃVÒ¤z¶—¨érMâGxcÔl®lžT_ xYã[˜¢gUo•™A¸'5ÈxCöíðž¿û)øoö¼×<þøwã½BÊi>èZåټ¿jÞ*×>'üKø]ðÓÁž,œ%Ä^#øm{ãûïøST¶¸ðõìw> ²Õ4½;Õ¼ñƒÃ¿üðçâw…m¾Ç¡ëÚω-ímÿá/ø[ã £Yx¿G¹ÿŠ›à×ÄŠo÷\ØJÆ=Æš¤Ö[¾Ç«E§j°]éöØb?‡ÿoÓÿÒâkGã^ŒêµùxsþÂ׿úŒxŠ¿Ç ööÕÊ~ßß¶­Ì:3[ÅûJ~Ò ]hº,’5Ä9ñ¤¶[®'°iæÞG–%•Úi6DDöŸö=Ô?ä!áÏû ^ÿê1â*þÿhßÙÛà&¯ûC|vÖ5_ƒ 5SQøÍñ7PÔ5 ïxrêîþúçÆZé¹»½ž}=亸¸yžiäœÈÓ\7Ú$-:¬ƒòOW_Ýü?ð¼'l‹µŽbÓ†ÁÌr}øÛ+ Ñÿ Ëû:ïÂŒøK»Óþÿ…öp6óög•È9ûœŸ˜üÀÑý<¸_™ËýMâå,Díí²=¼!ÁkkRåæƒ¶»ôb_´?Ãë/øÀx»eÿ1™M¯¿×¯o3ù3Mbâ-Õ­ü=ý›0ðá½?Øz”>Óe§Iª '‹ÉuçbDû;oAåùaW:Ç]wµÖž{m΃OŠKú‡Ð›“«i¿–¿Ùª&sg%ÑòÈp±‰$Ûòn_ëtþÌß³«Ÿ åÝøáu¸*SîéƒïQ7üüÂ0;†OøfOÙÔoàgÂc¹B’|á–À Î “¦’¹ÈgB®Ê¶"*§ôòág)KýMâå—Ö5Ä øA1€–~ ¬gMòÕŽöÞêªÒÙ„hfÖbõõ°ƒÃÿÙÑTÀF‡áóî¬îžÐ,ßÙùß$[>vóCîÚ­)?fŸÙâT¿Àï„ÛiçTO‡þ[€‹)T‹L@,q€ƒ‚4ª@øfÙßä?ð¢þþí·¯ü[Ï rp«‡ÿ‰V$\ù$ ™,Änv&¿â|ø_šÿSxŠ|²ÂIÆXŒ¥ßê´•7 ÿ-WïIt²Zî×üTCÃö¿äâÔß2ÿ}Ê4æwNþÛt·èõi\þGa×dm2þW·Ð~׿ž–àøÃáÌE¨›±ÿf€ë¾+m﵌g` ¾a ^k²Gk¥<6ú škIžð/‡ü>Ì']Fú$Þ‡M>[}š80Srl“n\³\öeý +ŸŸ r»Háÿ…Â’2 0# C+ É CÇìÑû;)R>ü$£?<(À1äùÒ°í¹Êî`XG¶ |¤D\¿â|8_““ýNâª*—7¶ÊooþÓ}f’öWÛÙ«o ÿâ¢-Wqs»½¾»”.‰[øú÷þ’?’É5˜Æ»ª[­¿‡ÿ³âïÙм>b&ÞÎùôð“g“&fŽßÊÌç¶Ô"MåZ‡öôŸÙ-?ÙôyöõˆøGü?æ}ŸÈf'ÊþÍÆß0Ÿg\.îÕýoÃ2þΙ'þgÂl‘"Ÿø |1ŒJT±û3Š#aóD ˆŠ $ ÿøfÙßþˆWÂ?¸WþIç…>é‡ìùÿWÞÙȾ&ÿH .?{W/§— K® âÏ:ó²­”®OmìÒŒ]ïj|–ßÍ/ _´?ÃëE.âý_ï¹F­[K{{ëÞÝ=Qü’É­âëHmô ðYµá‡ÈI!Y÷·öq1£æ]ɳ¨ Ö¬Ùë—i×ãŠßEòa°¿òLzƒµ£IãT—Nýê üÅ•¸<ðGõÿ Éû:çwü(Ï„¹Qþ `ˆ‹•ù?³v±;ÛÍfÌ Œ‚8ÂL¿³_ìò#/ÀÏ„ŠdÉp¿|(ÌIvíVÐK"‡`¡Þ=г™Ð¸}=8^3R\ÄJһ寔§­(Ój÷m/µ¢µýn“ý¡þZË€x¹»$¯Ê-¼oÿ/º$úYÛÎçò9.»"é6%¶ƒöÉ/õ(îÐ<>dñA¥5©h¿³HDMvÂ/˜D€³y`%äÖb:ö™lmü?ýŸ(ÐÍÑ:€#}‹êI¾Á˜±4—oïÉmÈ<½Wúг7ìê›þ_Â\¸lçáÿ…ÊüܨÚfÈú¾X]£!1“•Ù—öuf,~ü&ÈÒ>ø]s£Æ@DÓV0®JÄ£ÊG ""ȈÊGéå¼ñ“àÎ j3ÃT³­”ê°ôÕ9EûÛVmJ¦ŸMüT?Ãë¯øÀ¸¾Ü²×ë™C³n-/ã¦í­Ÿãßù³×d{=ZI­ô: H^Ì7‡ü>¬fmFÎ)6(Ó”HßfyÉB®7I€P0&×d].Âd·Ð~×-æ —xÃìâ£ÓͶø¿³HEÝ%ÎÇØ¾aÜ `ƒoõ¾Ÿ³7ìê‡+ð3á)ÃÇ ßðÿÂî7F("M1ƒ! ¾dDå;šTrîJÙ“öu;sð3á?È6ø |087Í4ol¨ùŸs`•ÎÖ ÇüO rò©üC¥d§í²›ßë ¿=¯ñÙ*]½šõ)~ѯÿ$Y´ÿß2žÉ[øÛ-ýOäÉu˜µ¤€ÛøxÙæt?ØzÏ·/†åºˆ †L¿Úvü†›þYÊ9ðë®ÚMüÏo ‹Èõ .;p|? 6²ÛêívR/ìÜ:y°ÙorŒc>Z†_4‡þ·—öeýT’>ü%$ù¼‡þoõ¬ÌÜ6˜Ã‚Ì"Æ<… °ùhˆ ÿ†eýwïþn9ÿ…á}Ÿ0â?ìÏ,´…Êœ•ÁbM¿§— Jr—ú›Ä 9âf’¯”¤¾±MAEk¤hÛšz±/Úáößêh£¯×2l×OmeSù!½×]-tg··ÐLÓéòÉzÃþv#VÔáO1NšÞS‹8­1 f9v“.÷ظÖ]µë˜n­ô3 è÷S!ŸBÐFnbðÜ“Ù1´ðÌßlHQ—!ÛdF¬dý™¿gXÆà_ÂB0çøáyNvšM1ÎqÉaó3|ìÌø`¯û3~Îò3>|(fdŸÀ^ÈX‹ðÇM%XÚθy$nY#UÇéç±VÿSx‰¥W S—ëJŒ–›§$ã{¿jä¥6š³NÉ©]ñPÿ¹“ÿPxºÊ2_ï™Mï'§ï´²O¯cù ‹]vÒ5 žßAûlZŽ—¸>ðøsm-¾®×e"þÎç› ˜y 1Œj|Ü9}®¼vº3Áo ™§Óå’ûg‡ü>ä\ [S…<Å:kyMö8­HŒÝIvŸ3{[ÃöfýBÇÀ¿„¸(S'áÿ…ËãzI‘!Ó<ÀÛáÄ› ÄË‘Ñû3~Ρ̇à_Â\–/øWþ)“FG–tÏ/nÔ Pªåå %y²ÿ‰ïágõ;ˆ¯ì.om”ÝÚº¬¦­-$×îµÚ Ð?â¢kÿouþÛ”k¢Vþ?«õGòg.±ñ±j–þþ͇þ/±¡è ú5¦ úhа6fŠÛÉ&GûCSæ 0ÙqkÒ2öW·ÐEÜwÚtpgÃÞy`Ôšä¬_Ù 2y‘Zn“a1’Š|Òúâÿ†hýòHøð,ÈÇþ-ç…ʤˆ¡GöVH—EÂHÁÕž8ÙìËû:ÄA_ IÊ·ï>ø^PJ¶áĺc® eÀW_‘”§oéãÂÍ·þ¦q¼ñIWÊ´XˆÅr­l•¹©é½ôØ?â¢[þH.Våÿ˜Ì£¥›ÿ—îݺŸÉ¢khö­oáïìÙ‡‡>ÚN‡áñûM–&¨$Ÿì‹Éuç~ñ>ÎÛÐy~XU̱×^KMeç·Ð|è4ø¤²Ýáÿ£“«i·–¿ÙÊ%sg-Þc!ñyvƒuþ·¿á™¿g]›?áEü%Úrsÿ ûÂûù98“û/Ìê00Ü ¨À$P¿³7ìê£à_Â_ùk÷¾ø]¿×++òÚa?(bbç÷ µ ”Bôñáfç/õ7ˆU牒µl§jôãÅk¢¢×5;«ó7}~Ðÿ¬—úƒÅ×\«ýó)ÖÎÿóû®ÏNÖ?’›zñ|?¥Kö}/«ëˆAðþ‚P³ðû±4¢±2 ®Ì#@³6³×/í„þÏ5o³ì/˜÷Ccw%IŽžLŸé LÈÞkƒ‡*ßÖ£~ÍŸ³Ë$q·Àß„¾\RI,h>øP(’HâÉK÷¤¸e7cq$ÆŸ³7ìë~ü%8DŒoøáyNØÊ•$ɦ9.JòÉ(Ü$wàÓúyð·4$ø7ˆ›„°r´ëå2¿Õ©*Rî½ÊßãÒÉ+Úí/Ú!áÿ^âäýå¦7(zJ[ÝÖZ¥­­kéw¹üîÈÚeüÏo ý®+Í=-ÁÐ<<Á$Z‰¹Ûöh»ã¶ÜûÆvÊ$!¦}Zòåt+m6ÃH»Ô5<§µ´ðÖ…su=üÚ­õ­µ¼vÑé’Hn&…mx£1xÙ#f”3ÿ[Mû2þά›OÀ¿„ hò>ø]k;¹!ÓLWÞØ A"]cHÕz~Í_³Ä^0ð«'À߄Ѱñ6†ë"|?ðºÉV̓Å(Ó² !Œ©&•/§g Vt¨.â)Â8xÎUò%,Ljª­¦ß5¿vìŸîÕ·fÔ?h_V­N”x ‹c*µc|nSdæãÝ«6Ö·Ñ7¦Ý¿‘=BêçJñ_ˆ4=KKÒtæÒgñ=ŒÖÞÑmnl/ô»mJ8l®c¸Ó#¹ŠîÚþÚ(Þ|Nnìò£9hÎ'öì¿Ùfo³è?kûx‹ðøÙü‚ÙòÆœFß3øöuùsÚ¿±ß‹³OìósñGâd×~Ï=ÇÄ/ÜO<ÞðÜ“Í<šõø–Y&m8ÊÍ+,¤±ó'w÷M#ÈÜ'ü3?ìë´øQþV¿äŸxWq1 ÏöVâ˜Þj–+1fcŒ®˜¯§o ѯˆ£.Ïù£ˆÄ)J5²žUí%J<±Mß’›¦Ô6~óo¥ž#ö„ð½\<ø‹g*J8Ì©FNœ¹\’•m›O{;%ÜþJ[÷Fm´ Ä6 zFƒáò¡å“lþcg ÷€dØ9Âõ©´½ràë7ñEo¢ˆSOñ1‰£Ðt”‹DÕ0$M83¡ ¡b²¦R@èì§úÍ?³ìéÁÿ…ðŸ–Ýÿ"†º‰üücû7wü»Ëäÿ£íû?îªdýš¿g˜òcøð™ ­Â1_‡Þ Rê?&d ý—»cD * ,A¤ò‚d/œ~ž|-´ª©¼EjuáUò×Êbä ©§îùSåwѤÛÓ¾ö‡ø}m8‹ž$ñ¹Oefÿ}¢ÒÚ_kÛV#®È4¨æúÛ¡Q^e‹í~dŸÙùˆ‚ϼnO,çqÇõ¤?f?ÙÐ_øQŸ ÈRXà/ ’I£ù‰ÓIe äí9Q Y@óQ$?³?ìêUSþ_ÂL&Üð÷ÂÊÇi$nq¥ï~Oͽ›xÀl€?â|xYYÿ©¼Bõ£{×ÊojNí½uçû[_ÎÃÿЇø|š·ñ}ºÿ¶emÞ·Kmù£ù#¶×ßVY-ôCk3Ù x|fe»·HÄñ.kžL)/¹rÛI…R÷SÒ ’ÇSÒ´Í7_°Öu=3UÓoü/¢Új6X¥´RÙßi÷ROiqmv. š) ŽhçIa”ˆªÿZ_ðÌ_³¦Ôà_Âbª›>ðÑÈœÿfþñŽÐ È]Ø¥°ÌWãßÙ¿ö~Ô|oãKÛï‚ .ïoüSâ[›ÛÉü á©.ï.﵋éîï.nN›çÏyq<²M%ܲ=É•‹ù»ùª_N¾–¥UÂÿ,$¨K÷ÙW:•iʬj/{—ÝÓj×I¤´¹ëQú}ð\—œ.âÕO˜åØ RxÌ«šo‡Ç֌ի5˨5+´ï5dõ·ò ºÌGYÓmÌûÖÚSÝì?ùbY¬-ä»W›û?1°¸iw®õ¾c…-uÙÇT’k}O vÆÐ7‡ü<¬Y®£Iv'öpó’_# µrÜc#úáÿ†gý—qÿ…ðŒïmÇþ-ï…HÈVQ·:Q¸s•MªX#r!V·ìÍû:‘ƒð/á/ü²<|>ð²ÿ©©‚º`$6ÁæÿÏr\ÏærÐþž|-'Íþ¦q»¯%ûì§OoJÒßþ\´êAÿ;}Ï#þ*áö‹ýAâﱯ×r†½×ôöÚ_TíÛcù Ÿ]‘tí:X­ôu,·«r‡ü>ÎÜA¾?ìÓåŒ4›HUßÉËc‰õ¦m~ò¸4?%tËùQ¦Ðt›˜¼?<öCÌm<3?ÛeÈ‘öC±ÃÛúÉÿ†eýLb1ð3á&Þá_ø_ÌI<Ëý—æõ'9|06@,ß³Oìïq!’_¿ ‹,J|?ð¼y$ƒ‚#ÓSî¢|ˆ>Z¨ý<øZ6_êo4ªa*[Ûå<²XZR¦Ô£{¿låÍ7uf“æºíðÿ™ÆÅÖ´Õþ»”Ý]Å«/mäúée¹üîÈÚF¡3Ûh?l‹QÒâ·Ãþimµw»+öhžd{ä(ÞQòÔ2ù¸rû]tµÑ¤‚ß@ó§Óå’ø/‡ü<Ä\[S…D‹ýœDN,â´Ä`G˜öK´™w?õ¾fÙØáEü#ʳ8ÿ‹yá@ tD ¨Ò¶²€€ª6Q¼ˆ«$’3´þÌ¿³©q'ü(¿„»²øWþ •GýXÓev±% ìg !S"#.qúxp¿,aþ§qðU5'_)¿2Ä*ÊMs/zËÙväºÜköˆx}×€8¹uÿ|Ê;%oãüþGòbúÌC_Õ­–ßÃÿÙðýŒÿah/ôk=Aôß.o°f\Ï·•ó¿žÛùžf:-vC¥^LöúÚãÔ,"„Â?áýÿf’ E® Ä4ѹ<ÈíCHQ¼³±C/˜C\Kû4~ÎË·>~ïnÒß|(Äí•¥·éDÉó1 _qx¶ÂÙ‰5þ“öuã?>p@ðÈ8vGbHÓA, (G?xÏ\¿ð¿„þËð~ßÄz·‡~>øWÄš6™kð›á]ç‚e¿ømà›¿ÙFÖ¡ºñN£’[x§ÇZœv×üB¢FÕL¹´ý¢¢»Îcòö…ýŠ?hŸŠ?´Éø™áMgÁú}Œ_m<{ௌz—Ä/Zøçá„`ý•|cðb/‡øeiáËŸ jÖzwÅÝ}þ/A¨Mâ]6+ë¯j“]Ú cDÒ®'ñk_ø'Ïí5Àhü1a®ÙxÇüAÐñ/í_¯øƒCøO£øWÀ'ÔüKãéº>£§išOŽ"¸ð‡Š×Âþ'ÑuóáZiÚ^±wá)î΋â+]#[ÑuKRû6¥«éwÒ[-¶¡i,ß›þÓ¼O¤ÿÁa~1ø]ðoŒ´ýÇ¿ðNÙWÂÞñu¿ƒ|_©ü<½ñ—‚~?~Ø^$ñ—„“â5¯‡—ÁÐkÞÑüUáÝB}+UÕ4½V{oH¸‡Ooí xÛÍ¿f/>|?ÿ‚§x~ãökøŸðÆßã÷í ñ{ãŸÀ]áÿÅ/‚_ üKâOøÇötø7ðÇJð÷‚íøÁðëö,ð‹´ÏÚGãÏ…~x?Æ:V±áHtÏŒÿ_À^¿¶ñ‡†¤<±xËÅQØFÚþˆ·šŸü"Îׯ©éÂ[‘¤´![o,Ÿ²÷ìáû«¯†Cà¿ìë¥_|x×`øŸqà ôŸ[ß|^ñÃ{/ÄxðxbâØ]xçSðUËhz¼¾#ŽËSŸDa£Þ\]Û„°uø»þ gû9~Ú?µ_ÙCâ¯ì­į€þý¨-4˜¤ñ/Ãõ/ |cø£ðWKð·Á_x¤|Ycá?ø;¾1Òõ 7âV· ¾¥ñx‹P> е¸õemøOö=ý±üËöwý°üYá/|GðáŸñÄ ëš_‡®þü.ñÂ_è~øy7„üI¬Zx‹Ä—R|TÒ~"øãU×ü-eª[Þ\|FŽÞæËHÓ|=§ÚZ€~¯~ϲ~ÌRøkÆ_²í×ÂGÁúŸÄïë¾9»ø%¯x;XðíÇÅÿÞ[øâ÷ˆî<×zjx÷X¿Õmµß éZººÔáÔµ4io–i»/Mnú߅≇™¡tÒÂfŽI#Y|9âO)UQ‘_c„Þ¿>ÇÚß)ò§öLðGÆÏxGþ ¨|3‡Æ_ uˆßðR‰^>ð½ã­Å¿î¼Kðþ_„t–ñŽž5øYâm^ãAÕ5VÓ¬µðl¶ZÖ•} ¶£ ZÊÕ÷Oÿ øÿšW„4Š™Öü}íéÖ¼z5m_‡ÄöÒÙøþãHÓ£Ö­|7à}jñ¼5§O2Ǫø#D³´:’Á¤Ýë$j7‹†#øöý?ý.&´~5èÎÿPÿ‡‡?ì-{ÿ¨Çˆ«üØ?l/Á@t/Û3öðV…€"‡Kø»ñ3ÄÚNâÿ…Ö×öþÕöÊ0o“þß…÷ŧK ‹Huµ·-.ïíïãL¶œÇ>¡g§siÐé·òÚú‰Ç‡.¼ð·N‡ã_ÃBòÚÏ\³¼¾“â—Pð´÷&¾ÕPHÛÅfHæñ-–§™¬àÄö¶zDfæK„O&?WÐÿk~Ê_´‹þ2üø·ˆüBþñÄžѼñ÷Á~ðŒü}s¡[Ið—Ä¿tøüc·|!û=x÷Qðÿм)à JäAâ]{úMÍÅ­÷„´oxoTü{„ð™^uŸå™fcá÷àðxÇšýc¸ESXÁP%ø_ðßà¯Ã+߇¾,ñ‡†|ðZïáÄý?Æ´_ìÿâ½Gã•w©þÏZÜŸ ›Æ··¶*øqà[-Oà œ~ñ.4Ïx@×­4Ï øR×Ä>½ñ§Šÿ)¼7ª\ëZŸÀ«=cÀ¿³ïÂ[O„Ÿ õŸ†“ø7âG†Œ5-OÇ)ñäZ—Ä)/~ k0içJ·Õæ¼´¹ž)-Ž·¡ÛÀ/WûgÃ:/‡ÿdÎ<7à¿*Çã0œ3Â8¼N V¦ øR‡ïªF$¡>y9>X¦šŒ]¥7È™ûæ{á?„y^K™ãð<=À¸üf^¶þ­PoVr…+SÅ:’ç’II5_šrPRgÔÓxÛþ Gˆ­ü'%ŸÃˆüIw¸¶Ñ¿á4øN/eŠÞ .¥ÛÜL¦ÖÞK©àÎ-n|¸àžãÏø(ߨ† ©ðÒK)µ‘ḮÇÝ$ÖÃ’¶'̸‘O hå²U½‰ÚÌý¡½dê¶øç¢kR|xøq¨iPYxyäñlÿ<ÓÚ ÂöZv£,kÿ cÏöÏ]i—^±5l¯EÄæò ¢Y9$ƒÃ±ü?´ÑÛãÇÃ…Ô#ø…#º¯ÅO¼ÖP5¥­ªøÂܧ‹@{5àmÍÐî—H™¯ ¹ŠÐ”¯çZxº/ê©øiÁ‘U°˜ òo€³ib>³íšRjQ…aNŒÒĹ77 ÓoùV–a•Ê84ü*ðý*ø,·Qÿ¨YäyjâÞ-b,ñ tá…xjT凩l[”GMÓ«FRÂÿ„Ïþ ;>¯7†aµøoÿ %‹ÞÜjZjxÓá@{;4´Ónãy¤w1*ÇéwL‰!B+8Ï—N×ÇßðQÛ»ÝÛÛü2šÛÄ·’Yè2¯þlÕna•íg‚U˜Ás[O‚É!´•’æâÞõ·¾ðÇÅ¿j©ñÇᾦj)ñ ì¼GÅ,zñ?†>Ç¥iÆqâ¨×o†§ÔìÚÅ^cå¶•mˆí6ƒFsá4°ø5#üløe§ÅZ¥î©¥GñOÀ‚Ö}[M–&*_àìÒü{ømZG…µkMGQ?¼.<-rouÝe`·CâÁ)’[-^ËÁê¨có4«geS/i â±´h¤¡á—ÊTéJp‡ú‰˜Iɬ¶x¸«ÓmiZ1‹[ÔV¥Kš»Œ^˜Ì~YF]? ør§J¥Jp| IÉÃ(«ZÒÄÛJð)$ïQ~æ—>!Â/Æm~$ÁD¯lõ½FÔü2žÃÃ̉¬\Çã„ ™»‘ã³|®Léw-¼és[ùÑê3 “]Jè§px·þ R×ñi‰§ü47ÓhKâ4¶ÿ„ßá&á ¾-°ì_bYyÜ›‡aÌ˜ì ¯'‡müñ&ÆŒÿ ôû»–Ð’ÊÒ?Š~-©}—UûTÛlñfÛ˜<´—~’,¥ü÷ˆ‚I7¦%çƒÏŠ­d?~,ðpè‹«Šž šœ¾ /„YÏ‹‚¥„»,²u†b`I•µ¥|U uqP†¼£‡UU6ø1›Ÿ.^>õ95>j¸š‘Q‡4š‚‚÷éÔJñ8쪕lm8øWáú†VTe.Φêû<[‰ƒ½,KŒÔêâ«Á*W•©{8Þ¥:Ê>kñ/þ !y¢ÏâHÃ'Ñ-/ãÒnuã„©k¤<¦6S< w";¸f»Š@ml­qr ‚ äMããø(ýµßˆ¬¯l¾AwáÍõmZãO„Äé–¨©v..ðàAºÔyÌ$,ëi=¼íÇyi,šZlÞ…šÍ‰ø¹ðÂÎõüi ß 7Å/$:Õž™§jvWÚÕø>*TŽoO®YZëèñ4¶ÖšWfæOÙ»­RãÂrëßå‹ãçËèµ/[ZØÝŸŠ^oøJn-n¼9¨ÜCxÃÅ®mFÛE»ðUÜR³²èm3-Å­Ì6²]LUx¹Q†\*qXó>Ì$Ò…\ªšMÅ´ÛŽ6¼œ£x·II{´ë¸˜¬nS dðñð¯€U(Ô©mþ¢g2äTëä”ãN8—NnPÇâ_4Sƒö7‹å£Špñë?ˆðQ«í;MÖ-"øk>®jñèMÊøÛá7“}¬\ö6™¤šo-¼Œ ²©W$žh¼uÿ»Ö5]†ŸÚÚ-¼Ú†«d¾7øH­ceŠ;™îÈHí¬¤¹Š;¹L›m.3ËÇ,2ƽ¦—?…›Á> µþéWüGÔ.çÒ£ø£à`¾´Õ­t;k/X„ñd;æðSè·¯¡´+•5‰ZÞ{MøŸVÊóÂoñ'âeßü.߆6¶š¾—ãwÓu†ø¥à5˜ñ½Õ¾™á'ü%jMiµ+oO$§É¶Õtņh#¸‰§…O‡Œ±VðÓƒ[£ kü`˜ýèbiѧïZNp÷›‚ýã´¨¹AO”ÅâÚð«ÃöèSǺñ‚ç¾OF.øŸ}Γçnš^Õûô©žokãŸø(ýÀðûÁmðÚøJ¥¹Œø×á)}Qôï’ú+x²²æÕÐ¥ò:£[NëÞTÒ$F­¿Ä/ø(Åäž ŽÕ>LÞŽá¼Cåxãá+.˜-¤•'ûQèöòª¬eÙþQ·Wðåÿ„,¦øqsñ¿á™M VÔ®õc7Å/‰´XañêŽ$þ¦t>5µlë`ªµ¼ÖöðÝ›™¹oÿÂ5ogñf¿ l®.´I4ë=F?Š^3øÖêÓÅn³.«rWÅŸ=æ§a¤Ýé#Kq$–Z«{…”CXûÊRX†¾­(ÍåO•Éb¼*ðþ•Jp¦ßgm:o;Äeη,kÉÎ1ÂÒ…W^jSX©±¸Txvþ.ÿ‚“Ü^ét_ æ½×´ÙumÝ|mð‘ÞÿMxÒ^ÛmlI@Í%›ƒ‹ˆà¸hDÂÒí¢ÅµøŸÿ¾ÒuoZÉð¾]D–µ;õñÏÂO±ZµìÂÞÔ´¤~ñn.H‚ÞXšHæ¹ßO$ªñ§¶i×>ÿ„£áµÉý ¾i–ö^Ô4ËËÛoŠž#Ã7×Zn¼ Ó-ŠøµX ÿlZizAG„Omö£l KY¡_<ðóøf|C‚oŠ¿ ¬î/5? ÏgàïøZ~þϼ†ÂïUK›+f(Mg§6¡ˆídX9µ;%Š8¼ô7†.Œ¹ßüC. n3Ë ­À¸å­æ5ðµaÌåĘ́ÒXÔ‹öT5–"P„é¶áŽÊåíeÿŸ€[U2¨(ÿ¨¹¼\¾»šâpuáÌñ\¬5(×…h¿c‡Ö¦.P£R”øK?à¥0^Ýi³Y|6[Û-ûzòÞãÇ?ã’ÓFCå>§pYãHm¢%$¸–G rA<â8'…ä¢ß¿à¢réçY¶O‡?ÙjÚ*\Ïã…Vκ¼‘CqöÉ[˜®Ú+pñK‘§©Ô Çd’L¾¿uqáñg‰®×ã÷ÃKëkÏ…z~“o{qñ[À‘RþÏÃg‡gðôí'‹c·ñ§g6µ«ˤÁo4ñJ³Åtx‰"ðüßäÓ[ãÏ?´%ñ”þ]ïÄß[êOnºJÂÞ+¸·—ÅÏ,W’}ª? Ê­™WA·Í3ZÆaŽðøºpÜòð˃œ§<½º«€óÓ‚ÄS©*×§6ª¯e(¨ò¸ª’³qŒ–ÓC•Õ²ð¯€Sœ0Jmpu/¬ÁN´Ý)ât°“Ч*n1«.fã ‹XàÏã?ø)%¬¾!³žÏáºÜxRÖÖãÄIÿ ¯Âg›I†þ}b÷j„²Kyn„ÚE±¥¹YpG$’D K?ÿÁF¯í4MRÒ?†Séþ%¿m?@¹Ç?Ú×U½=“[ZH¼·{RÁö é"µ2}¢æÚ}Å7þ¿Ôþ:O í·¬ty4}VÓâšïÄñ9Ò¼E· âÕc?„4í6çÂZLM!{>ùã´âQi.—qáIµø©à?°øZ×T¼Ðâ²–Ý—ÅIC¦>ƒ}ãY"Ž(†¹©ý”ˆnnâ|)ciK ²ð˃c:•0ð”_æ:*ÙBÇ»'-zéÓ§'jxT k¥Šjhæ9dðÔëKŸáR­\-9Áðx½Úṳ̀ÒuÅÇØÒœ­K¼6a*8É(>ëâüjÆË_Ôï!øaoaá«Û{rê_|&[}2öIÑm.$ݵ$ûTéo:îcäoo!Žk{ˆ’kOÿÁI'$g—ÅpÞ\øzݼiðŸÎÕaÓ#WæÖ²Y>ÏnÂIã(²$aòªc“goªOáDð÷ÅÅÿ…Ëð¿[}KÆ^Ôì<;sñWÀ_añM•Æ»ÕÄí'Š^=º»ëv>*Ô¤Æ_KJâš ß ê°¼ø-ßǯ‡&‡a®®«¨OñGÀßkð쉭êúïËü%fO;Å•·„µÔ©]6ÉD¿iŽ?³FTÆÒ†¥HøgÁ²œjׂú‡™=(åÇ%£½éWJ5%éâbÕ ,ªâS€UÌ2ÊxZµcáG΢¯ˆ¦©®Ï,ãC!Žb–˜‹¹QĵJ­H·OŸÕ°2­‹‹‚ñÛ¯ˆßðQ[M]jdøgý•©6ˆ×ÑøÛá<ÁµX‡˜ö¬^cÏ9…Zæ%‚9<û oa2Ù‘=jÁâ¿ø)L—öZ\V? ¦¾Ôtƒ¯Z@Îç}Z9Qš§Kë[ç(œbê«] &übóâ‡üÓÃÚ/ˆ'…ðéúÅíüVWÍã„âÖî;V‚Õš9‹²yV×q]Axì±%ÉŽ+©–K›hëJOÿÁJm.õ]>{/†éy¡i_ÚúÄxÛáɧé‘(’Kë£ÂÄ«¬Óî!£·ž‰8.­d’ÿˆO‡'ø{ðñaø©ðÂæK-OÄÍ{á?øZ>}ª^^iÆ:b|Så%ž¨ldñ£ ˆGi©^EÌF[ˆ§EÔ®| Þ'ø•rŸ´Ã}J Káõ……ÕÏÅO…ñ%å…·‡£¹Ón™¼\Ìâ3¢^húªJò4v2Aq2ÜÛÜDuqt¢éßÇ4ñ°q| vXL~ E))8óN…YW•Vý•k)ДéÆmÆåpT×üBŽ\õ³XK›syò¬o†ÁЦ§ SŠo Zu¥VOØâ9Tð²©JY/ºø‡ÿµ_-Ä_ "/‡U¼kðeÕ„òD!{E –iZî„»”6˜&)ÛøÆŸðQ¸üw¤C}iðìAáßø>¬5øM%Þšš¦±d- òc/+Ý]öÖ0E³]_†ÓíÖ[ðmÅ?†.l¾[Áñ»áµÄ–š,ZeÞ£ÿ GÀßjð5Üž&¾Ö©f‡ÅbAw£XjÖš5¨í™ì´•1ÉBñ[z–…qá]CâŽ^ÇãÏÃË&ñÄßè—:gÅÍ ß-5x¥±·‹Å‘Kqwàk_ôßÛ# îuIäÓíMµÞVˆâ¨©á|5àß~¿,§Ì“Œcœa°*¤o¬9hT”Òž®PúÂÿeR‘¤q¹\g‚pð¯€S«‰q”áÀyÜeN+>Âåʼ/_÷vÃUU—nTþ²“ÁÆS8ÿŒ~2ÿ‚Š·Æˆé6ßÎâ‹?tÿ ­ÏŒþC{}ŸâíbÅí¾Ï2¥Ì3Ù¼+o¨ÃwsÙj2%ç“{<6Ïæà£6:~­©ÝCðÎ V}V¼oü&ò¬õ{GÜéÓ8ÈûL^rËw a†7¸Å¼ò/Óî|-gñŽÆKÏæmã§ÄËÝdê_<mg ?/.$ŸT´›Å=¥ÇŒÖÂokðÜ2Ë]1Y_ nåŽVò R_ Çà¯YŸ uK±ñN¿LŠ^+âë-&×\±¼ñé“ÅÒ+O㙵»¯+ý¡áƒJYîe¼Šh4–*Œñuc? ¸;\t¨§>ÌåíZØ>yNí9J…*u9ÿ‡y{VýŒ¡)i$±}[B·_|$óu=9!ˆ¹µCƒ$2Z3<r÷°Ý4!Å¥ÔÖà¡–ú:ø‚ð|2] âïRÓ-u(¼ið¦xnuX¬nçŠÖÛÈ%§ÃÙ´É’'‡uˆ=þ¿§^øCûsá5Ã|~ømaŸà{í>þî?Š^Â7²?ˆuhìì‡ü%êí&“i®Yx#NÄú,wnc‚Ú[8¸Û‡ðÐøi¤XÇñ{ᤷÖÞ-ñuÔ¾µø¡ài“G¶Õt {-RÄGâ‚'_ ¶‰{o¥KA$µ×®¥†[hÙ…ÂÂbèTÇQ¥? ø5Ò•z1n<˜§5*ù”%¶ÜTœptlÚpN£“¼jÐçž;*«Š øWÀ¤çûXðt´lÞ”¹Ä8©F +R’pN·3ҾϞ+ÿ‚”‹ßìÓeðáoSE_5¾­x&{&¶µ—qYw–ïm¹HA{$V­!¸¹µ†FÁãßø(íÖ¡­XCÃCwá»{‹ÝfñÇÂHãÓí¬“,òÊV!4Šš›$®4ë…^›yŒúqáIt„cþ?Âý ´Ÿë÷š‡­>*xì>µÕ/t8¬§“ÅiE§I _øÎÖH£Ž1®jŸfýÍÕÄwérøU8ü50j:/ˆãÓÍÇÅ?Çg¯5ÕìŦ‰ŸÅ¥Zý¡â2w ÌÃ|“È b©~ÿþ5—^“ÄEAp>58û<{ÂÆ“›—$æ©%Yצ冨¿ƒRIÅ=7*_YÿOÀ7¥,LcMp>mtéfRÂF„§,W%Yý],CÅR“ÂTÞ¬“„eÅÛøÛþ G;ørl~Ë?Ša½¸ðôÆ_ EƯ–†îýíàb²¹¶·uk”(K‡Dt“¶¿¿à¢—ÖúõÅ™øeqoár«®ÍþȺyžI~ÌÓË?ÚžÖhôæ„Hº dnšX·{†ïüa}ð6K¯ åM Ë]þÕÔçø¡àµømâ×5}|¢D|Wç‰M}6›«èZ”W––‘Yææ}ZîÉŒ–z]›l],°ËeYày?ÓWöoµ–Ë@ý•,¥h^k?ÙfâÖW¶ž»w–ß@ø) µ½Õ³Ëms :ż’A4ed‰Þ7V?æÇñ®OÍ©x–þÏãg‚¯«>1ÈWáÇý”ßÿéÁ«å?ø(ßü˜/¿ì ðgÿSŸ‡Õúü¾:¿ã¥ÿ¤£ú©ïKÑþp=Ûá?üš?ìùÿd3örÿÔ;ÀúGáù¼=ÿ`='ÿH-ëósá?üš?ìùÿd3örÿÔ;ÀúGáù¼=ÿ`='ÿH-ëÒÂ|u=þÚrÖþ?Wÿ¤ÄÜ¢Š+¼æ øËöF±ð–§ÿôý˜4ßÛè~¿ý¾ YøÊ×ÅKbþºð½ÏÁO C¯Aâ$Õ?âZú$Ú[ÝGª¦¡þ„lZquû0×ÙµùCû4~Ï2ñücÀz/„>2|KÕüWñsöðWƒ|!¤xÿÅ–KàOx‹ÆŸt4=CH>ð·ˆ4K]þ{{[[Èîu›Ë ÎÛß]¬RPÙoì§ð0|oÖ?hÛø{Ä¿µm#áöŸá­kVÑ<9©¯,¾é Ò´9ü¨ (jz1½ÓüO~.å‹Q¸B­ÓÅœrN³ý-_ÿ±ìÙñãßõ_Š~1Ñ,|£h?¿k=;Ä"Ôü*Y%yä_ ’gTW•×VÕJéGy,Ë$`œ"*€µô™–ëV*̤ê˜Ê’§K^ãµxìÝÿ$áoý‹oÿ§R½ÿÀ¡ Öª™Gö†¥ˆ“æÚ mg9ÎrÇ$ŽÜ'ÇOüÿöà ûOÑ~HôŸ:_ùë'ýößã_)þÕ´êþÍv?g›I‹RoŒŸ´À€pêÈñœÑßã'Å? |9óîµø;ƯeâIÏŠ<§x‚ÏCð¾¿â(íôÏøÇÂCÞëöVâùé/ýùOþ?_6þÒ¿²ßÃßÚŸCð‡¾!x—â6‰¦ü8øàOŒ~_köÞ™~"ü/ñV‹ãŸ‡^!¿šKI¯dð‹¼?¥ëÚ]”l'»…áÕ-¯ì¥’Ôû'ÁCûNøóUýºü}û#h~ ðÔ¾øuû+|,ý¢µ?êž.ÕìµÍ[Vø±ñã¯ÃÍÁÚvƒká»í>ÒÃL»ø3£©ø‚ëVšá­õ÷ŽÛF’M8Ï"øgûjüwñ_ƒ?m™|Ið'ÂZwÄoØò÷KÒ¤²±ø‰ã½'á¿Ä7Â]⇋´-#Å>3ø? øÞ&­&ŸiâøþÝxcÇöW¹ák‘¦ê·2éžÓgû*Þi¿¶_‹?jˉÌúWÄÙ‡á—ìÑã/‡×þ¾> ¸²øW㌞;ðÿŒü9ñ7Fñþ…'‡µkýCã£k­ÚÉàÍZG‡E³¸ÑõMîá犿„?aŸƒÞ ð—Ço é^-øË¨k´~ámâ·ÄÿüBÔ|WñW^Ð<໇žÑ›Æ>!þÑžHô¿ÙϣɫßÚßø“Xm[XÕ5íoTÖ¯F£÷ÀŸÚžßâÇì÷û|j×|âíSý®¾ü$ñu‡‡üáÿüAÑ<­|Mø4ßç³ñŠ´Mm<3àýÒÎÿ@‡Ç¾/·ðÞ…¯Máý¤¶×|M¤iw?0iðR{½Kö¬µø.>y_ uOÚׯ°†™ñþùâ~ÒýöœÕµ;ï t ƒW>³Õ¼?aâh<}uã&ñU­ŸàhtBk½;놲Ï>|2ýŸ>x7Çí<û4É¢Ûü<°oˆ:µ´º—†<3à}káï†<ñô‰t¨~!xÃÞÕàþÎðߊmõ oíŸx[ÄWy®h6WëÎÚ~Ãß³•—íß´…¿‡5•ñ°ñf§ñ2ßÇ]Õà :ׂàøg¬üx±øroÿá´øÏ«|4ƒþýÿb´¤Þ¹ÔmÎÛÍWS¾¼à¾þÚz0²Žù~  ËQ ÞYiŸÙku>«åÞ*Cô$^8Ñ~"ØøÅž_¦‘¨jÚÌvÉâ¿xÇÀzÚµŽ‘â‹+µx_Çš†üM§§Ÿo!¶’ûG¶ŽòÛʽ³k‹9ณÃ~þÄ~ð7†ÿh}ã^£àÏëûF~Ó>)ý¦|M§j m´è¾ ñƒþøB×CÒ<%â|Gš[}×áý­õ¾«¯\]Ëw©]m†Ö(£SîQx Àß ì¼ àï‡>Ð<á=7VÖeÓü9áÃ@Ñ,%Ô4_ßIi¦i©¤-y{sqwrÑÆ†k™åšMÏ#1Ãü?û~Ÿþ—Z?ôc5ùxsþÂ׿úŒxŠ¿Íö³ýžÿgýKöÓý±#ñ_†hÄô—_³—ìÕ&“ñM'Â>%ºÖ´/h'†-.Ø~Í?²õÏÅ-/Â6>ñ<ž¹³Ðg¼ÕŸÆ'M^&ñf‹k¨øváQ§4·ÚžŸ§Kj¶uˆIï.nš9DVÜê|ý—¥ðt^&>ñ²ö)øã8ð&©yªé·/‰ÞâúkýN=Ré5G_(˜yðZùl¶ZÅn Ø4öRÖ'%ñŽ3¡ g¹Âœ0˜Y­Ô#ûè常Í;Jüq50ŸXm'Z¬Xº1§*u2|9ã­°ñY‡ÆTðøzx”øÓ,RúÝ<gK¥þÓz8ê˜/¬»%‰­צðôéN•KWìñû4^êŸmfðŸˆÅ®‡¤^j>X¼eât¸ÔþÕ©Ùi¾mZg¹’5þÛžþÓz$6Ùn>ÚnKÆö»:_ì×û-__ü8·ŸÃž*K?x{QÕüOwŒ|L&Ó.aÔ5OÀº|-$žm¢x—F¼±hX\ÎÐOmwö±mm)½á¬iïXø£Ç:L_²Æ Ü×QÙ¢›Æ±È“©¶>Y7í#âxcÅk_²7ÆMAñ<þ¶»Õ¼CoªéñérØjM&‹ia}wà [’}FâÞ]B+ëV_*Úùõ" ôøiï‰QkÐk2~ÃÿæßÁ ðþk&Ð|V–ͦ"´Ü*7Œðê¦Ð¶ö—šVK ÚÈ’*ŒU|ŸÅ×S*yîtéMÕú¿'R¦¢þ§€ŒN¬œ\kÇ)]ÎÎ~ѦªÆ¼Oxá*ØÉÓÌ8‹ÙM×X?gÆ™m(żW i)c&Ô¡ŠŽ*MIÔ´ªJ¬£ËVœcƒcû=~Ï-à;ÝsPðv¼'´Ô.´;á$—·Miyª>®Ú$wWS&ŽÂÒêþÚñì÷}ßìãû-Yjÿlì<5â™­4_[êž’oxŸ~©yªê6…iöìI‚ÙüM¬[i1ö -ൺÔnn.-ï :cñÓÇÖ>ÔüŸ±Ç««S^!–öãGñÕEð-ž‡°Â– ln£ŽÚÞÞ -Zþêk ‹9š9#ØÓkøãþ蟱ïÅ]_Nñׇï´Ëí Ï\Ô4¸Í‡ÙtyNyià{˜#Ô-.4¸EÄFY£ƒUÓ|è ³»[Ñq£É¼_©‹“¥çÁÔª’ÿ[¨Æ-9峇*•I('JŽaË6Ò•H§z‘pxžñ¹âjU†?ˆ~¦ªÔº\i–¤Ôëd󢣊n Ò£™òA·%TW~Ò”šìíû5?…ü7©ê~ñ:½×u=#Å6öþ3ñ9µÒ¼=á¸4›ÝØn¹”Ü_i‘kÚHD×_Ú3©líÖ"-­oÚþÍ¿³9ñ·Ž´K¿ ø‘t/ Zxž.æø™/¯5ï ÚÜj-§_;Ï:¯´½7R¿[È,í!¶>E†'¹Q5ÆŸûA|@Ó¼=á¯ìWñÎæÛž*¶ñ]ÕÖ‰âG»½º·D¬µ7_‡ñÇsar‘[ÅuGÝEij.šyÒK‰jÇûTø«Oø…­]Íû |^>*ñï‡üAxZî×Z[™ô»Ùc›Ä:¦…¥¯aÕXDÆUŸPf¿Q^InÓ%±ŽRÉü\oÉžg/šÏd—Rvo”W¶^ÍB‚–ë÷qN2s³eˇ¼noÉâ&çO0öã<µûÒÅS«†•5õÏݨaT¬š^Ê Q©)»·Õ蟳Oì˪·Â¨›Âþ& ã=F[/MŒüL‹h×Ú¼º_†N—Í#Fš¼±Iq2Ï%ûi¶;™ÞêdÔSHøû5^Úü@Ôï<%¯Áa£èòk^ ò¼eâ¦mJÆïÄ6^Ón5t7o*“«éq5º6Ÿ(Ûw<›!•>ÅkOý¤~#éÍà9 ýŠ~7´¾¹Õ®tÇ}ÄÙ¿“X½ûtïª,^Š9ZÞà ›/²%œv—ýš(lä’ɹ›ŸÚcÄ^Òþ"ëzçì…ñ‹Dð÷‹`’=sPñ®±§i>†ûR‰¬ÆŸ}yà+[6Ôæ°ŠÝoŒñIwž±í¸y ÄSÉü^~ÕK<Î¥)Õ¦¨¨q}g›U¨áy¥9`eJ Ù§°ê*ªuå•.ñÉûxËÄr•JÔÖ1ã\·ÓyåzÒ§õ‰¨Ô–Y,<š’tÙTtñô;_Ù»öS÷‚ôÝCÃ~-‚ÏWð†¥¯xŠTñŸ‰e¸ÓõMÏT­¥©C²kM>ÿIšß)¨5սŵÌösCÈhÿ³÷ìûyá?^Þx/[Åz¥¢éÚv•¼QýŸæß¾¥uyíÁ½\Ie£é—šƒ]AuiÛ}žÂÞÚ „’k®‚Ïöœø‘a«xOU±Ɖ.<áÕðÍœh(k{»$°»°Y¯âo4’Þ‘}|óÈdXnMÔ†êÚkˆí®-¹7ãw4Ï øÂ~Æ_¥²ñ$ÚTóêé^#mZÍ´{éoíVÎé>"mM,l÷Os$Ü[Í<ÖÏ 6ä2Z•óÜÞî¦\ãÍÅ´¤­O1­SÒUÓäx9RJ~ÓžºQ…:”%)ºYŽ6Ÿ6cÄ•L©ÓoŒòÙ%y®"®5¤±×öo.V¥íLLyiÒ­‡9J}üß³o쨑á]ëžñ6ƒ¢xbÊãÇ%ŠßQ´Öÿµ¯¬®5 ̱,wzƒªêYm£=¦Ÿ-¹¹†Iï´´Ù£ö]Ö§øVŸðŽxŸì¾0±Ô®|KyŒ|MXK&µ¨ø_@m.ÞY¥co{âM*òÒkyMÜö–ó]º£ÜOÆx›ö™ñm¿…¾!G¯þÇ_t Å”%×õÛ›/iqèe}& òA©^x[iÚr=ÍÜA®žÚÚúîÙn–Ñ­à·ÛÒ?iÿˆvçáέ§~ÅŸ®“Àú~¤Ú Êh¾"šËX´ñ <7÷ßfðCy´ÝɪióYÉ’ÝÝÉyii$K©“xÅõy¨g¹Êªêâ%þ·ÑW_Øð¤’|öQxùFT`Ü¥…«|EyâéÉQEnñ×êµ<LjUiWĺR|k–+Áä4褤ñM(ÿjJ3¡MÊSÁÖZ¯ÛÃpE½ü–ñ^YÝ\ÝÛêiRB—öò]LójÑÅ‘K{8?fŸÙOþO¸ðÏ‹£Òîü{â=J_øM|I%Ü~ Ò¼7sâ­OLÐ$mgk¢Û‰ÍÂ[¦]\G´°ýš[[Ž&ëãÏ.|2ÞOد㵭ˆñ;ø¢ ¨4]}¯á¹k§%{Ÿ‡WrØÇm˜ü™¬¤óJCspe¾Y/&ÐÑ?kŸjìzÖû|TÖ.|!¡Ëð»T´Óì|C¨[XϧZ5½ý†¬°ø.â{/[Új?g½·¼˜]GcwW¶Ò·•4«“ø¼éTöYæsÍlg//RŒ¢§G z’©8' &œÜ%Ý•(7w­~ñÊTk{ó[0ääã\²3‚«KÝYbêAJ3r\î›Ý•?«k?gû/x!í|­Iâ}sV×-õ :_ø£ìIqéimcr·¨°>¥¤\é÷éus5õ¾žñÏg=µÄóy°u·_³o즺÷tÛ ø¶â×Cðu†·áù$ñŸ‰¢›SÕu¤ÒH†ô³*Áky¬ÛX(Ù±Kk«»¹îî°âu?Œþ:Ô|á ÍûüzK}û^[[¸4¿®­p/î¬uKèÊÿ4SM-¼0Of¶w1Cbmmç†6'ÑÖ¿k¯ÅâUõoØãâ®—«üNÑ.|g¥Oa®ØÍ¨4:}¬n<1g7‚RæãR´Ó´ûIÚawöcií¼dݵ֕r_¹©©g™Ã’xéÍC‹)FôªcpµðråöÏ÷qË•HBÊT<*Ô«))E>ñÆJŸ³Ì8…òÖÍ¥S“Œ²è'æØZØY4ñÎ^Êt1„9Ô°ñs…Z؉TS‹uÙÿöi°³ø{{má_Kg­i\ñµÄž1ñO›¥XÃ⯠êRèñ-Úoû.£¤êðÁ ®¡4Û¬î349¼ô¯ ~Îß²÷‡¾ ë³ÉáïZÇàˆ^²Ñ¯Åþ+»Î•â›Þêv–÷Ü]ÿaîM^;{;9µh4«`¹ŠKù¼³RøýñSób¿ŽˆÞŽÞáÑ_ø†ÛW“UŠkÿ5…­Œ7b][UmZ;»YaŠhµ›OT†²°ßð»›òª·®¥Åô_5í|5^I¥R*oê­ ®UìŸÕÚöÛFÖAãuðmãøÂ5ÛÄ)q¦[>jÛ˜Zü’Ki/ì¸×‚qQ^ÆO om%]v?¿g¿Ù‡_øÍ{s&âk©üñ·â¦±y‹|Si Sñî¤Þ»Ólæžil·ôËÈu‰­î®uÒ-â—F¹‘õ “R¶òïÙçöi_ x›WÓ|)â)µ8|a¥hÞ´¹ñ—Ц¡ ø–-RëÂ×÷…nàxoõh´VÚU’æôÉM½Åå£*}žëÓ>.þÒ¾=·øÃâY´ßØããµká‹¿ußë¶:>½-‰ ñu-}u_6ÃÀŸ`ŸN¿?cÔ4Y´³ÚAmä-‹6‘3ÙM亇íãýCAñO‡Ÿö*øéogâŸÝxªâ{]ÄQÞX_Ü«Ä-4ùdø},0é¶Ö×pYÛ›s5˜¼ž[Kˆ%òÝ+û#ů¬Ôo<Î=—Öå*|¼]F0ŽûSR1äU~•|š¾Hû>e(¹Êÿ°þÎöÞ µ×,ü!®Gâiµïé•…׌¼Ss¦éÚW‡´[y5yÃ{i%ÝÍ‹øƒC·gŽíF£4—w6QZË{(ô?ÚãÅÓëZ Ò?c¿ŠÚ¶­ð›M‡Â—š}­Ž¹{%‘»Òo"±OÙÛx!®-õ[ˆou MäÚ¥ûÝOzörͽմIñËÇ·þ±ðXýŒ¾;ZYi:ž­â;MI4Ÿi_E¼‚[)§¸øwqÄRÂBŠöÅ®^ÓOûaºš9'š°™?‹ëCŸ<Î=“¯‡|³âê2²u³ >h9¾x:u°-Æ×œ#šösuq§Ãþ8G¥[Ä_VR¥)F\k–»SusyÊRŠÄÉÎ|µ¸¤ÝHFšMûžÛ¯³?ì¬ué¬×Ã>.m*ßáÅ·‰Rsã_ ¹üMsáˆüq‘#µ,§ð³›ƒu¬kÔM?Ÿ"[§­|ýœ,|-àjÇÂzü×Zã_ÿÂAçxÇÅK u m´8ô˜þÖ­o.¹7Ç-Ôº¬zŽ(õu) I.–¥û\x¿I×tí[Wý~*é—ž#ðíÂM2ÊþÇÄ6kW:Šy:~‹׃#¸»ñEõ³iööó^^Íg Ãmo",¡²5OŽž=Õ´_ è“~ÅßâƒÂÛ?eš ÄI6¢ºåོUSðõ¢’3 Y±OšÏtßÙ’éé"¤YQÉü_\+©ç*š•7]ÔâêSŒÔp¸ÈTvHó_<=œT”c7Zr„ï ÃÞ8¶U±ÜD¨§Eâ}§eµUHÇާZü¸È{Fñu08rEN1¨ã(Ó©N§o¬~Ͳ֟¨üKŠ/ x¡¬<-áë}KÃSIã/³êw“êZ_‡'mIXäŽÖjöš|Æmfh ¸¼{™a¸ŠK.£ã—À¿Ù†ïãv§we¢x“T±ñ|[âOêSx£Å–—*%ñ®·‰ît›cr‰e™%¥åÔvR[ê |“Çm`öÿg?ŸjÿµÄ¸ø…­ßþÅ_íañ¦„,uÆ“HñzU®Ÿg }¾ÆIüa²xþÅo¨^Kr&¶7v‘Þyp¿Ú~ßãwíãmkã_ˆuk?Ùâî·kàˆ¾%°Ñõé:ÌÞñ]Ÿ†¼k«½® ímà;¸nm/î–îi?³/¢µ¸K††ãík erÃdþ/EQUóÜâU#F*r—Д[Y~œ—*œ_7×c)ÎW´¥zŠ4ã(ÆŸ¥•ä7à ÆGâ b/&NRã<²¢æY6Tœq1q“Ì#)T—´J­KVŒ(Óq….KQýœ?fxm>&&Ÿá?Ï«xO_Ó4O[Ïão-½ê\M©Iu6¢âX³*éMî¯û©-ƒÚé1Ä·Ëy{l~Ìÿ³-×Ä¿ xWOð·‰äð¶¥iá$Ôµi|iâUÕàÔüm¤[꾊(ÌÉCv5M*)JÙf‹vÓÊT[\-GöŠø‡©XxßO—ö)øå øëRÓõmFæÛFñ.j¾Õ<1âk ÛÛø¬õ(‹wªi[ü™ôïí€nÕ,c?èòx_ö²ñ~©iðÏÅ~ý¾,ëúWƒí|A†u&Ã[Õt/Es{§ÞÜÜÜéÞk-FM7V‹RhžÂâkq/Œp[ËA m'㿎ô‹/é¶ÿ±glj,üf4Ôº7ˆ&›KH¸’òÂ=$ÿ»Kx£ŠãìòN·vצøÙÛµù¹pò2ŽMâü}¼gžçIª˜uN2âú>Ò4á›×«‰¦çt•WtbçìÔ]ýQQhêÚöK§°º‹QÉeeö+€'Š+¿ÙÛöi:7n´Ï x–çSÒ¼[¡h~´›ÆÞ%ŠCJñ ê·ÚMÝì¦e__éZ§>Y¢ƒO’KH®lä’Ø ûRx§Rñ¯‡Œ²ÅçñGÃÍÂñMá«KMn[¡¤éwFMS×4·ð=ƯÝέ€–Õ.ü¨­ç–ú{wоý¡> ßèþ.ѤýŠ~9CŒÇLo‚"˜éÖV¶ (ñŽš¢Sgvæ@§E;C˜÷$í žµöÜ)Â8ø¥¦x%î|IðóÄRÛIøãÅÚ‡ö7€¼+ñáf­â/^Å¥èö‰ã=>´_™$†í‘ oÍØóö´øÇàØçƺ.¯á˜¯eý›ÿàž_þ5ü!¾ñÁ|+Š->Óág¬4ŸüY´Ô>/xìk~$2|7Òõ$Ô<3¨x"/èú–¥a£hñ¥·—Åü`ÿ‚³þÌþ<ð­·‡þ=~̾ño‚¥×4ë«Mâ¾»à]kÃOâKT¹}&âÚÇž¸Ó[[‚3xÚ|±Eöèã7Mnʾn|Ãà_íéû|øy­þÏ_ ¾|7ø¤hÞÐ>|[ñ‡„o¾´_¡ðχî<¾5ø—g èÚ¿ˆßÇöºÆ­'ü$ºÔwðë:¤k{ ×3MÉ/ ¸ê¨`%ÔŽ2p•Xa^/±¥U)ªOÏË«»j¹š¿,­Õ86xYãc›'„…HÒž%a±.„jKშ©r)7¥¹·²ê¯÷«ÿWÓm|ðËÅþýŸ~(|F›âv›ñWÄš‡|¡øÓÄ~2ºð—À“à]#âuåç|àˆž ð‡î<_ã‹MÀÿ ¼mý…uuoŸñÄßu “I¯f×o¨,µïˆÞðÏÁøßâçÂ'⿈¼ið»Ã÷ÖÒø—Mðß‚m¼{ðïW-„×Wã^Ÿñ·þ °·ÓÞùâ´ñÅ¥¤:ΫàCNºüññüöIñ_›ÿ ?ì+àyÚÜ%›ûoHøyªy¾"¶Òlt+}vO¶ø6múÄ:&›§iêMþ˜š]…•€˜ZÚÁ`i?·¿ìõi㿎üIûqð÷üÄþøQ¤x×ã_À©`×*ð0_|Yøo­Cý'Å GR𖡬ê±é–^"Ó“Á|íaûwþÊwöþ Ò4¿ØÁ7–ß XÖ¼¦Øx{Àü=ˆ]?Š×þ?xƒNñ»¢ØèÚ¿‚aˆxSÄ~*ðÆ•­êš}½¿öN«¯ø{OÔ®cŸPÒ­æ‚„þ :Š’áÚãOë8hÕ®Ú‡Ö¹šKWe¢»{1¿øCÚ<ê šÞn†!A;¥g/eË{»o¾›Ø÷ÁKüsô׼ û=jÞñ~‡¤ü8×þ&i.|Cà ¼¤üFý¨u¿Ù—Ã÷^ðoм;àüC·×õxËÅzeÆ©kðÒkoKàÏÿgjÚÇŠ4ßÝ~»×ó¯¨þÞ±¶¯gàÍ?Uý>êvDËðúËQð÷Ã[Û_,úÌ"˜xJ ˇ–oZÛk² %-kðjl ìI2ûßü>gÂ?ôCÌËþ"ÏÿÐÿÿ‚ëòÕŸ•ÿkh¯Å/ø|Ï„è†xÿ =3ÿ””Ãæ|#ÿD3ÄøYéŸü¤£þ!ˆÿôKãðnÿš<ÿ>Ì?â,ðýðÿø.·ÿ!ýYù_ö¶ŠüRÿ‡ÌøGþˆgˆÿð³Ó?ùIGü>gÂ?ôCÕ<'„¾üfÖ¥º¿×m5d½KíÆÄ[ǽ…›BѰóLŒî~P€ó^©gÿѸ¿ú¯È¸³#Í8{8¯–gIà±Ô£JupõâªÒ„àÛ§)ÇÞ„£-$ìšGé|9œå¹öWG2ʱ1Åà«N¤iÖ‚”T)rMZIIZQkn‡ªþÍßòAþÿضÿúxÕ+¥ø…mk{ð[ãå•îyâ ;χ?ínô ;AÔ|U¨k–×½†}ÃÃEާ«xŽóS‰ÞÊ×AÒôÝCRÖ'4û+»›ˆ­ßšý›¿äƒü-ÿ±mÿôñªW¿øÙ.õR6ø˜jcæ\s%Ÿ8uaÛ¨ÀêsŽã§þ ûa×_iú/ÉÍWìŸñÛþ ™ðÏöø!à}gáOÅýãOÃû?Øáw‹ü=¬|ñÃhß ?e=sà—…«ñ—ž*½ø)ñ?Ç¿iWñ5„> øýàíSÁÞ9¹ø â­_¹½ø®økáðñŸ}OÇß¶çü·áÏÁïÙ³Ç:Ö‡¡ãÚ×OøÅûü)ðU¯ÂOxGUÐl­ÄZ¾¥û%þÓ>>ðwÅß„¿ þ$èÞ—á_þ$øãç…õ? x{á%‡ü#‘x§EO xFâ»þ‚¾%|døUðgHÒèZ¦¯©ëz––º5¦oa¬é/uú¿¾jŸ¶Î©û5Úü ×õoŒ^ ýŸ|ñ¯]øÌ¾ø\¾ð·Ã¿‰>4ø¯àŸ x`ø“Qñm¯Å õKÄ? üeçèþðF§ Y[j}Õö¯öêZ7àçí³ð‹âï†?iŸÞC®üð¯ì“ñwÆ_þ3kÿm<ð÷FÐ5|6øñ[ľ3—U“Äšž¥|<°ð‡Ämîoø®ëÃsÚ› jâÿL³ÒímuàÍŸø+­ÿí3mmû&xŸáÁÝ{ö‘ðG†|)ûKx×Ç¿uo„?¾"x âÆ= à®›¨þÎ~ø±ð×ᯓ¬ÙÛø¯ÅÇÅš.?Œåƒá¿¼e©i¾$ñdw·‡<3i//®Íû^^ÿÁeÿdÿxÿàßíáÿ6ž øÿðëÂ1xñgì×á?\üøy©èÞ:ø•«xoÅWúO„¾%x·â‘ø…á³øÏÂþ»ƒÂ^øc§xdx†òÝÛ~¯ü{ý¯þüÕ¾ ø^ïDñÄŸ||Ô¼Akð¿Á¿ÛáÌÚþ•á ßÄ^+ñdÞ&ø•ão‡?4Ÿ è~¡¢%Åþ«ãKK­FûÄ:&Ÿ¡Xê×w¾Tx^ ý¹¾xwöÃøYûÜØxÖûãwÅ/‡^0ø›š_„ì.| à½Áú|œº_¼e.¡ocmâ­nÒI®4_xr_­°Õ5µÑ4KBÔ5`€¿bíkâ†< ÿ·ý˜t-'Ä3xsþ uñGAð?†¼=áOxÛÃ:?ƒÿáMþÏ7z…‡†ü1¯~П³/„ì´›[ÛË뱇Š>;;Û»Û‹mW¸¹¸H¼«|R×<ðãSøË¢|BŸYñ"ëZOü"þðwÙà†ËÅÑiMÿÿ…~9~Ñš%ŸŸ¥%¤ûí~.xîüϵ\[hW3K¡iüŸìÕûMüñ÷†~6Ëáï‡ò~ÎÀïÚÅ_>"ètï„> ·o‰º…üâGTÓï>xÏÆÕ4í[Gñ¦–©.¹±yqkwmw¦[­¤7¸ë"ÐüU/ƒu¯kZ7ˆ4‹SSKm[A¾°Ô´Û–·Ð|Kop°Þé²Kk3Cÿ°­ñü¼/â#_ÁÇÚ þ àÿ‰ßü!ñÛà—Š~9hÿµ?Çiu¯ÞþÎ-ãác«êZŸíœŸ¾$xÛÅqi§ü'¿ô3â쉧j? _þ{ˆõ„ž0ºŸà¦£4+©xïûпÿ‡?ì+}ÿ¨·ˆëü׿ißø'OíYñö…øóñGÀ6_õOøëöœøìº~©¥xãán¥è–¾4ø÷­xÄZ†•¯j ¬é~ ðÔß¾3i7ÚõÜM%Ρðã]kk)ïG:Íâ¹a*5 •|T}¥:xIa*ã#:3ä•jþΓN.Œ©Ò‚›éYÅjÏâÊ•è㲚øL%<~%añôã„«„­ŠN”ç‚•JÜ´c'Iœ.ô~Ö×NÇMûJ~ÒŸðGø /‡±ßæ?l]Æš…þüƒáÄËï„v¿i¯xâëNø—£ëVv_ <]ð{Æ?³§„ü/ð…µ{i-ï~ø‡Eµð¿Áë‰,þ%]|Qû'øËö[ðìÿûZë?>Áã¿Å¡ø__ý•> ü]Ô~"x‡Æ7$¶ø§£Ígoâ|.øg¥XIáà{/Œ¾ñ~£ªøcÀú_ˆüEâ?hÞÖ|­Êþ=ð.¿ÄŸø'í±ð¯AMwÅ>øû)›ã‡Àëm Ãþ2øGâ/Ýx×Yñ¿Äφþ¸·Ñ´{û«§ðLjÚ]èÔþZŸü.ÒÏ„~/#Hñ9}[Åð²tì?‰>7Ѐÿ˜^ Ôþͨ|†ß þ*ü2›Ã? &Ð?hKâÖ³£üO±ø›ñBû↭©ø*óá߆,|ðãí7PÛ]xTKáë­wM¼×ü?¤]øRÖ8.|7ªøÓâ'Ôÿâý¸‘oüñl.Ÿ è(¿#öý ³ðÏŠÇ‚›ÂÞ"¹ ñWt‰‡ÄŸ‡ðj²±Öϼ4Ë‹“â _üi7Ãx€ü9·×õO‹>‹â›eñÀwÿcð>¢x§Á‹¯<#âøgV׿Ò4{ÿÞXjš‹ÞkÚ†‹¤iº—©x[Ö4o¤­ÑŽ©Z¾½^† V1\Gö.^Ê<Ñj|¾Ñ«§¢“MGãi¤–+5Äàq|vGƒÀa+AB¾-eÙûóFÓQåi¸¶­&š¦í9+FI~íꟵ/ü¦;oŒðø“ö`‡ÇjÄÓxöIO j?—BÑ>[xšçàö©§øoá‘ðá´Bø§©üI“Gð‡ì©¦øûOñ&Ÿ¤ÇáˆÒÃq«_þqþß¿aÏŠ?~$Ïû0þÍߢñn·áZWÿü#Ð,~ü·ñæ…a¬CñX´ø/ÂK]a,uf¾ðÆŸy§xOk:>¡{m¤èwÏâ¯t‰ÿÑý´î®~&Øéø­â-Ká]ÿÂÍ3\±ðßÅ:éÖõ‹ÞøUñ;Ã6Þ ¿ÓuÙôÇeà¿ 5ý~ÿEÔ®4­6ÓÅVž]õÛ[Þ­¿~г/ÇÙ³Ä^)ðïÅ­7ö‚¶Ò|%¤ø[ñ'¼1yàxËÃß-ïeðÖ®ºæ Óo-n†™«[Ü[Mwdö·ZmŶ¢ö1Íks6ï‹tšYeM®id˜Çxò¯yþó]ÚêÓV½íÐó,ñÒ’ÿVpj.›\òÊ1ïÝå^ó\‹›Gv·v}¾àøSâÏÙMðì™}ñ†çö\ÕƒÂ>ðÞ³ðËXñ'‚þx§Â~>ñ]®§§x¦óLðt~#o†1êcO!ÕOˆSÅ6y·ŠµÏØJøaàkxwÁ?¥ðwü+ÇßüQá¯Ùçá/Ç„¿>!~Ç~2‡ÂöÞøTÿ>'þÎ>ƒ-ÿõUñ§¨ü4}gÁÞo ÛǤø7ÆúOŠu!¬Zxoÿسãn·à?Ùö/ xÆ-Q~6|zÔgOÍá_ÿ³Ç†<(>2ê.…â«_^Yø“Åze炵+XÓ|?ÆÚ…¼Gâ?^®áÍ[§†.5Ù¼3û||ñwü+Oì_ø‘¿ám~Ó(ý‘<öÿÚöhÒ·|wð‡Ø¿µüâ/í/ZÿÂ!¨Mý£cÿý‡Š²5}¿Iÿ„[KÖ·ü?ý«žrÃap”08J8Ü%,.8|bÈñ‹ë4•|µÝª$ÝTÜÛZ6ÛZ4rexÜÓ €Âað‚¡B°˜ïì|jxÜ4cQ…›ÄSå­'%)·ÕÛÓ?à—?e¿„_|]âOÚûáSk_o¥šëá÷þ(|>ƒöƒñ'…4Øþ&ü,½×µoèVôè¼Q¦k_ ´ü+ð÷Œl~[è–ß|M§_E¥øá[Å^ú[à·Ä?ø'-³~Éž*ñ„_<§ý¦5ŠÿõïØ«ã'ÄÝWâVƒñÇß µÏÙ÷À_µgàŒ´ s]ð_‚ôxwâ_Œ¬?øéþ¯‡üAâIOÆÚ[Äÿ²?…÷íû3éFoŽÞ}uëãQñ…³xOU™µýèW‰—K×¼T5,ø_FÕÆ·¡NpË…–"pË£QâñÄÔö™.<•*F”!ËU·¡~i>iJ÷I40µsœñs§Ã´jËŠž.·µÉñ‘TêÔ:r§O‘Kš 0OžmJRræI#ÆPøE}⿃Ñüø[㟆#ðΑâûŒ_¾'ø†ãPø%â¿ê_<[?Ãÿh ºðø³ÂÞ ´:ÇÃè—Oñ/‰|E®iþ²¶ðeÝ—‹üM£Ïãþ‘øßÄ?°®³qñâ++ÿÙkAŸâü£àÀÿ%¯ìûViÓøöáøtÿWâ·ÅMSöf¸>ðŸÁÿVóâÔ~.xüK¤zÂÀëž(ò0õ_‚ß|Fº^v>0èö~!ø¥â…>ñGÄ[? Ü|5Ö> |7Ô4ã v8 “Ãú^»«µÜi²‹{ƒÆ×OÖït«þ,~ÀµÁ_âþã»è÷?>_|rñ½½ÏÆ¿ÙÙ5h~èÿïgkÚf€ñ—Œ-ü{àoÑÙÏö„ÿ‚cx/öøKáÚOàV‹ñã6ñ+SÔücâ»ÙÜüC:ójž&Œ|QÔüoi¤ÜÛø»öwðþ«*éçÁȯõá©jz]Ýãüñí6­}ùEñköyøÍðrêôxþ5x§ÃzwÂãÍÿ~x¯á_ÅŸ‡©ðƒÄ;¸øeaã«Ox"ÿTðæ§£Mã[;Ý*Ö{=RXu; fñV™=ç‚æ¶ñ,Þåð3þ ¡ûZxûáW…¾ ü=·ñ‰¼ãë^Ñõ?x×áG†ôQg¯«C'¤ÒµBÓT‹áüVÚ<——‹®ì­¢–íäûŸ}aö-Rÿª•Zµ3<j˜*ÄÓ§‹†,‡Qb)T§^³^ÒðxgNŠRÑ/o³mZ1xÜÎxÜz¹ž.”1ð¸“c§õª5•Н¬9 ðŽ•§¢¶!§«HúÛö“ý£àž*ø5âíáßì“ã µû¯Ú¯BñCé_> Eð‹â·á+ SÆÞ.ð_ÄÝCÃ:Õ§ƒ¾ø«À+?†|/ðVGѾí\Aåüøs)ÇÚŰî·û*è>8ý§u¿¿ µx¾êß >4]| øQñN÷Æž'ñÙñŠhV‡À0ø§á§Â½Fx/ìþ!Ü|5Ô5Ý|8Ö<+ øCIñl~ ÑüFËâ}¿‰?ðNÏÛ7áWƒuoø£Áÿ¦Ó4ŸŠšÂQ§ø{Æ_ üGâ SZÖu¯øFthÚ‘ys}¨x#]ñÇ¢iž%Š5·kÉU²vŸ?|ý—þ,~Óu¯|>Õ~!Yxãá¾ãûÿèž=½ð„|Yá+/é^Ö&“[מÊÏOÓ"ÑmüAªßZ¶u «ê³iZ¸Šà[a­R¬)¬^Žœq4*Bk#Æ{õéÎ2¡CZ—ë5”(7kÉMÅ4ä3 vgZÉ0xPÅá«S¨²ŒsuqTªFx\*n GëuÔ0îV¼•GN-Jhýjøqñþá¬ø[áoˆ>#|ø5àïjŸu©>/ø×àßíÍ­Úh_µ{‰‡„íü©éÞš_ ø2mcáÖ…ãIo|I㈼ZÞž÷Ã?رi:­ßÅoÉë³ ÷-bý›~ |tøYa£ütý¢|C¨øïã‡4SÁŸ³^½s¿Áï _øvO-æ…â­;CHô´}cÇÒiž&½6òø‡Æ·¾&Òï¼ìMûþÑZÇ€´/ø‹^ðv¥ñãwÇÙËCƒÄÿ´ì×blþ5~Îëátø—ðß_[oÞÉ¢xÚ×Pñ—‡toø2ö5ñŒ5]RÂßÃZ§þ5ßÍ>|PÑþ×á?Áñ›ÁÓßøçâà #Xø›oá Gá–¯ñáí¸ñ¯…[\ÑãÔ,uì¤V·Ñoôík-kW6qèòÞZ‹Ûë‹­Z¾G‚£ƒÂÖ¡Vž'ý‰Œ_V¡88ÕÄ.j–n”¦º^7Ùšcñ¹®'ŒÃãr,&_ Z–3²œrx<5JnñKš­Ð§)ÕIéî]«\ý8ñŸÇÿ؃â^—âüCø ðDøÉáÙ¿áö›¢üU_ØóÇÿ¾x³ã¯o>"x·öÑuo†³|Ôÿá#økªxáoÃ/Þ*ñ%„še½Ãoø¯Äþ)ñ=–½¤ø_Äþ1ûh^ÿÁ.[TþÚýœ~üfñÐÕÿgy¾Ùè¿ ´Oˆ_4ï |wð/Å;i,h/iŸ¼#ñM5}3ã?ÃiRî}Âþ$´O ^izdž®ü¥Iâm+Ä~Ïø•ÿíý«~_x«NñkxÿL øñ3öˆÔã¹øÅû=Ùê¯ð×àÔúõ¯ÄÓ¥x`ø®}w_ñ?n¼9i⯠øNÓÄRhW2iëqxÖºž™yyó·Ä/€¿´ÂíZóFñ‡„i˜nì>xkö€º¸ðö­ð·Ç:BüñŽ´Þð¿Ä8µÿê>$Юt sUI`ÓäµÔg¹ž{›ñoö iî£ÖŽ'¨ÓåË(òªPJ_ؘÈ^±´¬ê.[­mm-c|>cž*T8kȨÓQšÊ1ôï¥$œ#ËxûÉimºnxsâwìcÿô›á7~x÷öÀ¿×§¶ð×Ä/üñoŒ,|=¬Šß²ž¯e}ãOˆ~ðÖ½ã]#ÂÞðÿkMâO€´VojMñwáù‹À>.žs«ø ý­>'ÿÁ;¯<=ûzÛ|:ø{¤xÚ/Œ_|7ãÙ£Â?fÝgàÏŒ¾xçÇ?u]SÃÞøŸã/Ö3|11|=ð§ÄÍ{ eñÿÍâk]7Oø9ñUñ­ßÄ„(ø öý¤üEðÁß~ÛüVøàŠßî~xOøIoáÝCÄ:ߎ5]{ÀZ'‡ü3¬xwKÓµÑ+Áöšü:µ´ºšÏá‹üg«G¦KyñgáM£êïd4«kŸŠ_ -§¼†OøJ=br×:9zXLU*5U:Xì,\=¤g*²”•§½b½åñüI»¶qe˜ÌÓ†¡C‘`±ØZ~ÙQÆbãi{Uí“æŠPIûÒ~ônª8óóuz²ï¿fÝö¼ø×ñTøEâþȾ"Ô¾0?Â…¼;oñ“ÄÚþ©ðÃâ]—ÂÍrïÂö>–?øGá/Ä-oÀ_~%ø[Jðÿ.<;ðãJK×-þ.¶žÓø³î«ÏÚ“þ ™âø§F»ýœ>ZþÏ÷¿µ¿íñWÂú©ûjZÄ/ þΞð¿Äÿüø?þé~ø›â}Kö’øÍñš #ZO|cµðçÁŸƒŸ¼ £éöþ¼Ðô}+_ü¬øû5üVø»ñïVø1¦_|LðßÅß„wí¼àŸˆòøÃþ5ðÜðW‰|Wâ=S@Õõ)`ÒàÑ|9¡x;ĺ÷Ä ÷»†8<§Eªxlx¶îþÏH—ØüyûþÓ_,üi&·ÄíGYøqñÂ_Ùïâ'ƒ|+ñ_àOŠümàˆâ_ˆKooão h:õî¡á=òÇáW|E»âÓ¬,ü¡/µi4ïjÚ/ˆ5,0õgOŽ%,ElEzUq”¿±1m`«¬=0Ã&§d¥†¥CÔ›wĹh¤‡„ÅæT±™”ðÙ&ˆÅbhÖÌ(¼£ÿ³±QÂÐÃÒÁ©(^ÓÁQÃc¹dîž1½#(œGÇëØãHø™¨øoö_ð?ƽkIÒ?i?þ7OŽ:Íþ¯á†ºßìµâÍ7ÁºÇ<mð»Æ¿ ô¯ø{Ä_´ýƒ~(ü7ý«~ jŸþ>ë«me¥jþ[j<‚¿áÐ>|bÔ|;¬X|ñÏÃ]+Kñ­ßÄôÖ›CmNOèpjºÅËeÿ„sMù+Týš?h½'á¿Â?ŠSøOö™¹ð߯Ýâß‹| c§\xPñXð¯ÁO øCÆ^7ñ‰ü!h²ø‡ÁÚcø;Ç~ño…[Äú~—são ëºGˆ|)m«éÆy¨f|ý—>,|Uð¿Äÿ|5×¼e«ø+ÀÞŸâÿ‹ücŠ>|8ðžà««ï é6ÒxŸÅ^7Õ4] çǶڎ¹2x»Jµ¾ž×Ã:~‘{¬jZ¿öeýÕ…W©V¦'V¾øyÖ–‡ö&-¼LåI¬Su—%7*­GYò§²+ŒÌêâòêøŒ—C†«^X,?öN5¼eJ”eN´nàÚTéNuyc­G×ÂÏÕïÚ£âßüSâìAl~þÎ^(ðßí¿ þh~ðç‚þüPðÄ=ÄÞ³ø'oâ=\ñ”>¶øMâÞ[ÙüLÄ_uËïI<Ú…Ÿˆ.¼ñbêx|7§þ{~Ê~8ý•ü9ûsIñ/[øñ Ã?±’øãM¼‡á7Æ(l¾.kóÃŽ¿4³ÜèV>ðý·‰|3¤hM­Þêþ‚×Å÷­jöv7gÆqOös¹ñgöý«>ü;ºø‰®iÿͼoá¿ê^Ñ<#ió¯Æ cöZñíãýGöXøgâÈ5ÏÁ@ÇÅÿ?4dÔþ~Î_ ÿgâV¯â-á׈~ ø«à_„µ¿ [øÃwºNŸâm#LÔo<¤E¤Üj:/‰¯|1¤Vï5Ÿø%×í« CàÙõ]#âż_þ-ÙüðeÌ^;øo{¥ë>0Ô“@½Ò¼Ccφ´]'Zðÿ‰t¿h7"Öt‹ÍÃÍ{u¢i÷÷zuý•¿Ïúßìùñ—à¿ÆË_|\´øé฼)ñ³á÷ÂßxÏÄíàÍWá=‡‹<^šGˆ¼"ºç‰tðö2xS^Ñ5-/X»Õ`yZËC¾-5£êȺ4®¦':5#<¶:r¥8Σȱ­F.+š\®§¾’m¸ý«4“:jæ9ÝL=hTá¬*r£8Ô©,›Ô áiIÂPJI&Ûƒø’kkÛöWãÇ¿ø&b~Òß`ñ¯Áÿ„Ðjÿ¼yñÞ_ÚÄ^&ý–$¶‘¦KáéÓIð6µ¥êšžŸ¦ë:†©as§évPêúž™ez°ØœL(P…¶ŒéÆ•8ÓšÈq°S‚ŒTf£Î”Wj-+-ƒÌsªxl5:9ƒ«J4iF•U“c骔ãÆåäJ޼»Gm¯nÓö2øû"|:øyñ2Ëö¶øAã_øÄÿ³·íàŸ†šâøGJø¹gðË⋾øúËáÙÔ¾]xsI¹¶ø™¨êú¿À‹ÿ†.õÏXxKRð7Œ.m¬¼=e­\xºÏ꿈ÿ?àœ¾#Ðÿi[¿x_áÊkzÏì~žð_…“öÕ¼?Œþ:C§ü}Õ¯>$xÇ>øQegð¿ÄúV¯ü4𮎾ðgÀíøî Uøƒª|lð—Â-gPý¡?ð6«âßxžox‹T´ñŠtí&óHÕücâ-&ÆãB›ÆÖÞ ¼ÔtÏkú†ïý;ı'ÇßøËã÷5ßê÷^<ý›~ø¿Ç< ~Ð?³Æ¿ãÝCð¶‘ã_øLþÏàÄ·>+¹¼ð<ÞÕ ñU¬ºMºYÜ\øVÚ7½>?ð"x™e«KØÑÃàèã)KRn¬²o*©_êW ¢ªi5j•0ê=+6ä›9rìfg†ÂÊ– #Âãè{lMW_ûWÄWlV1äJ1Áâ*ÕÃE_HÑ´Ÿ2“\ìßâŸÙ¯Jý´>xÿþGÅ? ~Éš ¿ìùiñ‡á‡ÅíWLø£âˆwÞÁ‹ñ£Cðöw„~iúLj>"YèÞ9‹Â^‰mõoêSjZµŒž²Ö£ðw„?CuÚ_þ Ñ®xãÆþ ›àßÂ=3á7¼wûøcXñPý…M•ç…ô øá7ˆ?n?Žÿ5Ï ü7Ò~-éV~4ñŸÁøwðká7‡µ…úEñÓ⇉5ïèvÞ'»Ö¼'ù¿x‡âW†>x£_ø•ðÃÆ[<ãx¬¾9Þ|;ðEšø;Æ–:v¥¡ëú?‰|[y¡øsÃúÅõ¦¹¢I¤ßx›UÐü?jnµñ'ˆ¼7.‘u}³ªÁ0¿o;;Í"#áÏÆßéþ"ñ„ü-áÝÁŸ?fýsGÖ5ïéÖü!¥£[êU÷ˆ,¾*|0]>ËÄ:~z÷ÿü¥½¼z—<1kªçN¥Hc±•)a(UÄ×T^*‡ö&-}YS‹…¾{¿iÍÊMÇ¢I³Z¼Êža­G$ÁWÆâa†xÜ/öF1ýR4aìðêSP¼•Z~üc'î¤ùRM³Éj«¿ØšûÆ?¥ýþüZO|Lñ§ìãñàLj­&ñ_€þ~Ï6‰àZürø9⟇ÿ¼ âÿk–Ú/Äë»û_Oø™âí/Å>Õíücá«øÂß?O?iOŸðLk]wà6ñ7ömÖ~!|TøwñâóUøÕª|*øKg¡ÅªM§k­¼Mâ/Š6ºðÌñ|{ømâWİÖ5©n´Ÿ‡~#ð¬“|6²½»ðçŒÿ¾#üøÑðÔøºË⇿iOhÞÕ~økÅ~.ñÕ¾hòüeð¥ßŒ¾j·&Ñå¾ð߈<ãÛ7Š4¯h:¾£á½GÃÓØ^C«4zÎöÿ·¼Kÿþý¡þ(|EñŸ‰¾ø´øÓÁþ$ø§ñåõOü?øÙðüðâŸ|DñUŽ¢]~çRð3é>Ó/5Y´ïÚÚx†Þ±¹Öô}#û{D[üêV¯ý©‡ªð>°°XŠj‚Èq²“¥*¸yJ§µUQƒ„cìî®åÍg¡êÓÇæïŠ«.ÁýmUÀÓ†d˜ù7‡pƹÖöÊ-ÅBj4Õ+YóÝÛCÔ?nŽ_ðHßjßõ_³‡Æ;ŸxwãŽGâoÂ߆¼ðÄZ¿„uüIÖ4¿ß|CŸá]ƹw¡_Á¬x*ü/—Å~*ÒôÿX[iVöÿ³¶¥á;Ÿ |Bùkö9ñÇìÿð÷á÷ÅŸøhÿÛëžÕ¾|fÑþü?ñGÁûŽ´}ÅÞø—kðVÃ[ñE¯‚ôMOÂÞ5´ñ6¥áÿøÄF¥ð¼G£iSx¯Nø‘áýÃü-øƒÏxŸö(ý©ü1ðÛáÅuð÷Ç/ø?ã—Šµü<¼øuãƒÿ­®YÏâØìÃKàÝOYÓÿ²õûø¿RÐ5Ë[û­ÿKÑ&¾kø"»ÓMï|&ýŸ¼{ñ?CøÑñ3Àþ0ñ-͇߆^%ø»ã]ãÅÿ <ñSIðgÂ[U>%Üø‹Âþ(Ö4Ïø¯QðµÍ¥²ézoƒtoÜZi•¥×‰¿á¸Õ4}?S¬UJµj`§_G:¨ÕÂQþÃÅ·Äû*´žÎmÚ4*×Å]%®šöLññ¸¼ÎµL¾xœ†©†ÆÆ¶öF9ýì+QxFœ/hakb±©Å]<"z%+~¬ËûFÁ0þ'üñ¶‹ñãö}øh|áO€>³ðo‹¾ ~ɾ6øñâ'Æÿü#ý üiñUt­àσ¾ü#Ñ´O†üqû:ü.øe{ãæMBëÁßü^ñ~¹ñƒöN´Õ<1ð»áíð’ |ðŸì½ðKá×í?>‹ásá÷Ã/k>(×~7ø7âÇŽü¿Ž¼«jº‡Œ¼=ãoø‡^7^2øywò×üâì%ñKâŸÅ[Ùƒöjø§ÿ 6¿àïƒú?Ã?üðÝ—À‚öŸtGÄx·W´ø/Âk=\[\臃|;ª.¥x_øÃúÕÕ®¦Ï;xÿƇŒÿà?¶w„¦ñר|-ñwâ.Ÿð×Ç^øeãmSáGÅïÙÓâ"xk≯¼+¥XøC]Ѽ9âëÏèzíž¡ã?E®ØëZœú•ëkú¹³ðÌRkCÈh?Ù{ãçìÍâøoâÞ•ûBÁ¦x+Eðˆ¼Uã?^ü?ñç‚´ÿ xêçQÓômb=oE˜i×CF×t»»Y®ìž×PÑï!¿’ÎÙ­ïfYÆ{;fQåpøžIŒÕYjÿzµw½ž®Ú#·ûG=övÿVpn.ŸÇý“Žw*÷šäZ´ïm×M¿I~þѰ•ðßögÐ?h/„ßüIã^øŽ;Ÿ|*ý™SâxêÇÅ>ý°íŠ?hok?î4ïi?üeâÙŽÇá™øcªünÓôIü%ãkŸŠ?>#Åà­/ᆯå¾'øñÿŒ½ðÇÇÛ{Øûã•ÅÆ¹û~ü2øµáË xHðF¯â¯Ù¿Nø‘ûD]x£Â 5][GñµßÀ߆v |Eð{NñÁKÏɪøëÅ:4McãY½­÷ÃøeÿÎý­õï„ÿ¥Ãê:_ÑþøùÿÜðW€¾øCÅ~øñ(Ëû8Ùx+âßÄ;ØOÄÚÆýÅ–ðx‚êóáF›âO¾"øCâж³XÜxÁ¾&øœ×ƒÄËã|]øÕ­èþ"ð¯Ão~T~Î?³ÆÚsâ•—„>ÍñCXñŸŠ§ÃÃJÔÀþ ×ü?«iº…Æ›«[|Gñ_ŠMÐ|9¦Ù_Ÿ èº\Zµå®¡¨ø§Æþ ð•–Ÿ&¿â]ËUúÏFÿ‚[þÜZü>ŸJðßÅk¨üWð¯Eøµ¡²|Sø >Ù¤x‘ü†ü6Õò¾3ñ Ÿ|¢œÛÝϬýŸûE'Ó5˜ôå‚«R‡ÖV GªbêÖ«QdxËÒ¯S–uðí©ûÎ…G*wÕÚ)7u¬åøÌÏõµƒÉ0xØÔÆ×¯^§ö>:ôqU\gˆÂ¹Æ›ÃUr¤¤Û•¡·¥ÏÊOóü,Õ>|-„>5ü4½ðç„4Í#ã6«ñ;ÆŒtÏxùõ\®¹áß쯇þ MO:eÖ›fÿo–fºOÓaÒ¬¦Ðîµß¯gìÉÿ"¯ì—ÿf õø#_äcñº/xSá¦ÿ eÇm?‰Zn•âŸ'Ä­7@¶ð÷Š<4׺¶Ÿ.­m Z¬ò¬WZUà·–4ŽòÖâ;+°!·ºµšoõÎý™?äUý’ÿìÔþ£kê\ªO €\40ÓrÖ•<\:U#j’…YJS”¶u´’Il~ÃXŒe|-yãp4ð•yÅP§B®2ЧJÕ9+{Íɶ¹öj+³;oŒ_òøqÿe7ÁÿúpjùOþ 7ÿ& ãïû|ÿÔçáõ}Yñ‹þB¿?ì¦ø?ÿN _)ÿÁFÿäÁ|}ÿ`Oƒ?úœü>®9|uÇKÿIGÔ=éz?λ|'ÿ“GýŸ?ì†~Î_ú‡x¿œé| ㇖GOø­ÑävV_j쬬ī+ 2 A9WôcðŸþMö|ÿ²û9êà ý!ðÊ!ð߇‰I:“’Tÿ A×#õÏáÞ¿_ð»ÄšþÖÍç‡Êèæo2Ž2U±êK êkTærö»4­Ë¾§åÞ#ø{K(e0«˜ÔÀ,ºx™'NŒjºŸXÓæk——Ù+Z÷¿‘üTÿÂã¯úüYÿ„æ±ÿÈtÂã¯úüYÿ„æ±ÿÈuý¸ùqÿÏ4ÿ¾Wü(òãÿžiÿ|¯øWì?ñ3ý¸/ü9Wòÿ¨o_ÃÌü§þ%ß ÿE'ÿ )ò~¿Ò×ø—ðö‹ñgÀŸ¾üJðßïj÷ß|câ tÈu?ü9ÔîlõOxÛÁ3I¡xÒÃÀ^<›@×4æñdZ¶›vÞÔ¢ó¬<§™Tëô 3ↇñOÀ¾5ð&½â=àÿ‚>ü%OCâŸ|kñ'´ï€ú·Ž¥âx|e«|8øek'‡üUŠ#“Ãz°½·†ÂÊÈÜk“#¿Ô‡íiñ7âWÂÿ |.éþ(ñŽ·ãÿéÚ߀m´¡ákÏxᾯk§é·ú~­©^lÑl¼-â+K}b,nÒký:k; 7’æK_ØÙÿo/è,ðφ¼mðOÑVîO€ö¾3“Eø±kâcÇí?â_xoà͆…¡Mà ülÑOáèdø«{g¤é¾mBçþk¿‰V:±¨Ûó:ü•<]¬~Ï^økðVÓÅ>7ý¢~þÏ?¼?¤êÿtÿèÞÚáßÇïˆVšWе»?x–ú _ØüÖ­µ}RÃÃ÷׺ÕºNƒ=ÞštÛîÙxáU§Qð¼W³«íU(çx¨Ñ—½ 8N’ÃrÊŽÏ]ynà”W <« r¦¸†/šš¦æò¼;¨’\·ŒÜïYµÌ¼¯vÿ(føˆ¯cã±øñcD—ÄZ'ÄË ô­3áýši>&Õüyà‹_Øk^#uyl¦Ðµq¨ÍÙØêŒ,5 ‰lÞÖk½JÎûÄ~(è³øƒNøsiáMâΫ?„üqábãÅ?_AûDÃÅ~#ñ%­õ‹i¾%ñkÜ “Ä’Ú\CtmÝ´èæŽ[¯¶´V³×?ðRßø¹>†¿´M&ß[ø¡û"xâÿ¼ijú‡„î?hïŽÓ|,Õ´_ø[I³³—Ç-¢éžñ‰‹Æ-¯hv¶:´šì>ñM¯Šl4Oª¿eÏ‹_¾&øÓãFã-_á§Äo‡~—ÁÚ?ƒ~1|-ð‰<á?øæi•óŸü{Åþâÿè"¿™|H⺼gÅ8Ìú¶âiáàðôêÊ´!ìpô©]T”c)sr_X«^ÖÒïú €¸f#ÃxLŽž*XÈa§^j¼à©Ê^Ú«ªÓ‚m.W5ýÏUý›¿äƒü-ÿ±mÿôñªW¿øwÝjÃr®5 HåÎýí ÀàóÎ~€žÕà³wü…¿ö-¿þž5J÷ßÇΫÿaKÿFZWƒ„øéÿ‚ŸþØ} }§è¿$|aÿ<ø ñcöˆøð»ÀŸü?'ˆüK¡þן²GÅhÛj>µ›Bð7ÁoŽ~ø«ã-z_‰ž™ázþ ‡/Eü߈5&ÃT³‹@“YÔ´ÿ8Ñÿà˜:§ƒÂïü?ý£®|/ñ×áïǯÛ[ãíÏÄŸ…ÚOˆ<qâ_ÛÇUñn¹ñzßÂÿ õ,þÿ„?Uñ…ßÂ|Q㟈z~„4g·ñþñ6ßShì÷¿à¬?üyû>üø!ãÿ‡¬¾øŽãöæýмu{­xž×Â^ñ7„|}ñûÂñÿƒ¼Óo´ýbHü==ªØÅqðwö4ø¡ð£Fý¶lÇÇÏjšÏí‡ñ3ÆŸíõ»/€¾E¿Â2øYào„­tžñÅ_xÇÞ Ò´?†¾Õ ð‡ˆl¬šÿX#®¹y£k6:F‡àÿ ¿à£þ/ñçíýâ/ؤèãÐ|5ã?‰ËÆ­;ÆúÍçƒ'øŸö/ÿ‚ƒü[ñ¯í ãŸx·ÂŸµ?üCÁž ñõî©àƒÃ üý£~.øáW‡|#eãO kž Ó,­´è>”jš§{©†ŽxîS^{MF rý¿?àšžý½5xëL»ø¨üOÖüaà]kž:¶ø…­üMøYà?„w6Þ!Ô¼W`ž Ó4Oü1ð-®™áÍ'÷Ú'Fu·°´K˜Å¶—ì‹ûJø£Æÿ±·üÇšÏÄïƒ~'ñgíðÃà6™ñKÄ?>"ÁáÏxëÆZ¿ìͪx÷Ç? 4½GÔ4ïükxvëUÖü3ørÛOð†›ñ^k«{Ÿ Ť]ü¿uûkxêÃþ ëâoÙ»ÇÇâßàñçÁσü=àè~ðÌž6ý”¾"þÑ~(ø‘ñ'ÀÓÚÜx¯â66¯áøQñzk:7„|}aðßFÑ|9¬ø‹Qñ¦«lôÿÀØŸÆv^ý®4_ÚQðž?íûgxÏö˜Ñtïƒ^5ÕüS‡|7­|?øSàýCÕ|yøƒ}k£êþ*ׯ`¸—áΡnŸÚO«¯i¶ÑÛ5}Íàˆ"øŸàï‡>4ñW„uÍSYñ$W^û/Å+?°.eâý>ÚO³üeø?ð#âfòÞÚ+Ìë_ t_ÏÝ¥O¬éFÏX¾Ãü?û~Ÿþ—Z?ôgWÿ!ØVûÿQo×ù¤þÔßðSoŒ hßÚá?ƒ¾;xãÂ>ðíAñÚEð·À…ž6±o¼eñçHñg„/üM­üAÑõ{ÀzõïÇ?:£è—–ÚÏñWŠ ãZKØÿ¥µÿü„|9ÿa[ïýE¼G_ÂgÆoÁ:ïþ"|CÕ¾/~Ö‡ÃOŒ·_µWÇÛMgáì_µ†³ð®ÎûÄv³ûhÍà¯øÏÀö¾'ÑmüðkÆx öLñ±ñ^ÞG¨kßÄ*N®k)º5¡ˆ£/í •:±VSNžWdá)ÁÓ¨§JQ¨Ó…ÔZýKñßüÅßÿá}â÷Šâ´‡Á„³¯Äq£~Í^ÑÄ_ ~ ¹ðׄ—Ç8ǃWNðHÕ.ô²\x‹þM(k­¨yÚ·ö—˱|Wðµ¼ß¤ñÄ?‹_ìþè#áïƒt‰~ Ò Ñ<ðóZñ-þ¿âë= oŠšójï¨Ç¬ëúkhwÃNƒP±Ö䳓_Ómô­m~V´_íž~8ü`Ç·ÄçÿOÃEþÐÿô\~/ÿáÇñÿ.)V˱؊S¡^j¥‰F¤mŠæŠÑ•×/5ï½ÿO~þßÿðƒ|:øS£h+á¯/Ã#ö‘ðÞœ¿³¾%®ñÿÃö~Ót¿‰6~1ñÅêºæ«™áïÈjº¶—hð(iwvÖßÞíéðQk½þÏì½CÂöð‰~ѳþÖþòÿcO…íý•ûF\ÿayÿ ó>:>ýrOøF4Ösùºþ·n”7Íæý±«xþ áá_Øßöi¿ñí‡ã?ÙÏâÌß4{ˆþ ðÆ¿jšÎ™a{?íC¨øŸÂš¿Âo sSðƒ5½/Áÿ²Ž³§üSOêRøfÿãÏŒüC4ß Ó`ðW†?ÿo¯‰÷ÿ ÿmoÚáïì»ûNøëÆÿ³§„¾7xÿFø+â|pñïŽ|7©|7¶×®ÿá_/õ‰&ñtVS[é²øšÞëSÓ5Ë›Iõ=YÖô‹›-bû,&¼ðx)ào‡ÁÔÁá*á°òÍñS• hR©J”å,GÍNP’ö“JWJM$yÙ.[œb2¼|e[ €­†§W…©™Ju0ø9¨ËFryufåJŒ£M§V§+\¼ò²oê­'þ ?>‡?…†•«xRÊãÁ?´}ßísáeö6ø\Ï£~Ñ÷Íᦻø«n²|trúäÇÁþg³¸hCû& ºPß?.‰ÿ½ðÛøEô=KÂúsøöŽŸö¹ð‹Cûü.c¡þÑ÷GÃ-?Å[o;㤂MvFðo†KYÝ ô/ø”[ãJçóz¿ø$¼¾4|@Õµ¯Û£âî¡à¿ [ixk@ø¯ã/šŸÂ&ÖÍ×Ä_…Rx£ÁZ¯ÄËŸhWú}·…~j¿¾%ønÆ?h²ë~0Ñ4ŸXÉ/€|OÇ~Ý—~øKû4þÍ>(ýŸÿiÍGÅßü_âKãSÀ_·8ø½â9>]éÚ£ðËþïÂÛO[ø£áïÅ×ûgV× ±ð?ÿø?MÕ´o†ú¬^6ø‹¡x§]°Œ3ÆâÞ&4åRUÄK QÔͪµ:9¹SpÀ;AÆkÝšSŒ¯¥­}°xlû,\if¸Šo‹ž«©˜Åª•)œÜé¸emªn5´Ôgs&¬“:x³ö·ÔµÛOÝüKø¯Xé|MñKBø]?ÃíáÿÂÝÆŸ ðî‘ñ ÄZ6¦|Qñjé7šæ¡![ }-¬†§=ì¶gI:¶«=ÇÕ>*ÿ‚ ü@ñ玾%|Añ÷Äé>!ë¿þê|bÞ4ýŽþ jš~§ð£]øÓ©~Ñ~)ðŸöD?-´Ë{?ürÕo¾'x­â®5\4Ïo¡…Òkósà‡Å‹?<}¤øKÇ,ñ¯Åß—¹ø¿Çºœº^£ªi;umÕo¼C}w¦hw7úÝ•†–šì¨©¦E¨Ï=Ë›µÅ'ï·ÄßÙ»ö]Öþüdñ‡„à¢ø]ãû/ÙWöpñÀ‡ÓÿÁV~xÐ럴ãþÍ>,ø³ûLx+â:•âëMXÁãÿËð«Ã•¯‰þx‰þ2ðÖ¢5¶•©húeÆT¨b%™b©ÁJ8Èað²Äb?¶k8Õ¡9VXjQ¦°nP•9ÇäåN<Ê¢jU÷1£–æòÍq´iæ5c§…ÁOŠþÕN°Ó•e„¢¨Ç.r¦èΞ.R”¨ÓæöÜÞÒ«v§ùwñ÷öÅÔ¿h¯ø¿Æ>2øÓãÿ\üCøi£ü"ø‹¤üý›>ü'ðߎü xÍ|o£i^+Ð|ñNÓµytkËmú-íÌFãCøuá |.ÒÇá׆t Z{Á¯ø*OÆ/† ¼-ð×áçÆ|6ð|Aâ-š?Àÿ†¿í-ôxï5 ð=Ç‹|KãZÕü ¨é·É6³á{ë ªËzñj’¡ŽSù#oûEþÐÞ|9øÝñrQæG¹$ø‡âÙca¸edŠMY’D#‡GVGRU”ƒ_Ô'ì·ðÃþ ¿sû9|%¾øãûL]| ø¯¨|OÕ#ñ—€4¿Ú£QøQ5Ÿˆ¯u/jVŸ ¼IàK wLø¨—ÓŠþ8ÜiÚ$öá½°OÚ–°ÛxkGè… _ö®_BR\©G<6%gá TiŸÖiÎÂBu=³–ÆÑš‹§w*kJ‘ŒË³ˆæ9u ¹YãªRÅÏ ŠŽiÉ )ý]béΗöt'Uâ%S âÕ*ª>É·:JÑ«ù½ñ'þ uñß⯃µx£ö¬øÁ—«üU°ø¹öÿ~Ο |9â /Zѵ¡â]ú.¹¤|Zµ¿Ó¼ øcÖôÏ Å!¶[Ø•n¥º³2Z¿ƒ|ý®%ýšþ(x“â/Ã߉ÿµ/üBÒ¼geã¿øÛá—„"Ó5ok¾,Ò¯ïnÚI´ûFNöíø­?ßÚëã·‚?e¯Ú[â§‹~xÆ"Óáþ·¦|mñgtW¶—GÒîõÝ3þ1‹Yš?øc@ñMÆ· xgÄK¨kƒYÐ4½7Q>%ñA¸ÿ„‹Súþ ±,?¾+é×´GÄÃ០e5O‰Ÿ¿hûß‚v~ðlÚC_ø”ØüH¿ñg„õ­GY·¿Óü=¢ø;á¾—ãï·Ž|Qã‹m"ïÆ¾Ð'ñ½iŽeGN•c¯JXÌ-:q†qZŽ&u©Ã VïNU#J»§UÓNWQæäŸ'+¼Û.ÍèÐü~aWJxü:Tá™F”£‹«^•<%fÞ]EÔ… K¥ZTÔ¥¤y½NNIzw„?à¨^=ðt–öþ?²×üG§üWøëñÖÛÆ>-ýŒ~ x‡Å‘|dý¥­4}?ãgÄ»]bóâÿ™¥ø¿ÆÚg‡ô]2m[H‹N›F²Ó¢‹ÃÃIiîÞçãüsÐõyÓUÔ>#|Bñ>“ øçÇß¼ð~ãá„~ü🌾%ÜÀuÙ|+ ø;âF­¥øAÒ’+yþf|%ø­ñwâ/Ž4¿xãÆþ<øáMzFkÂÞ)ñŸˆµ}"æÖÓNºÔ´%µ¾Ôå‹ÎФ²MvÙÐ,¦m9cVd’HÞ±ô1Tp8ʸÇ,Fž´ñt#š×R­‡6ëRŒž 2œ¢Ÿ<5’÷㤖¹ž[œÐËqÕ±Ù•\Vž½Lf—,ñXSrÄQ„ÞYK’U))Æ-U¤ï%ûØ/y~ŸxŸþ “ñ#Æþ*Ô|]ã?‹Z§Ž/õ/ƒ>Ê<[û&|"Ô¡†ï5»ÿ‹Z|±Yü`Ó¡}câÆ½u/uÔŽ;ûç†ÈéÏ¥­²-p?´oü?â‡íF¶Çâ‡í'ñbÞH<+âß]\xö}øuàIõo‡ž.ñͧÄYü«ÉáÏŒöbóÁþñ=šËàͪAá=*â÷@Ѷ‰yq`ÿ§Wÿ¿aO|/ÕÿÁC¼Yð ÃN‹ðGâ6¹ðkRÐ|Eá›Ñâ üømã_ø§MøuñáïÄï7‰|Mâ_i“¤Qx¯áWÃGRð¢XßéðIàÍ:Ú núÃPÕ-eè¼ÿ ñw‰þkß³>—ñSQøeð“^Õ.5KCø7û"|ø_xóêº÷ÁÏê0[êþø¯¥_Ú.¡âO€µ­RöÖHµWUø¦jZ®§}¨ê>"¼Ö¾£øgá/؉ÿ`øN>/~Õž+ý™¾>ë^2M_V¸ð7ÅmrÅo­ü[ý“ôÆñ^û9xs\Ñï~!ézçÃOþÖZ·ˆut›Öƒ_øàË{oø6ÞI|7ãoÏ¿ø)oÄáOíIqáØóö§ñ׎¾Ý|ýšüMa©xcã×Ĉ6úw¼SðáÖ·ñGGÕ|W¬ÃáÉ/;ŸâÅ|6ð–«âƒÆ¾ñ/… ñu•î«á¤ðï…¯·øX5ä6°[} ñþ iñ‹ânŽ-uOÚ?âG…¼cÅOˆß­þ3|1ýš~|-øíaãÿ‹·^6?µ}#âÿ€~0xÆÚ!ñöãÍGÀ5]UÓ߯ t|7ñDºÇƒ>ø;EÑ~vý‰´Òl|Pöv:}í•ÇÄφñj«ö-§Äo‡7š×ü&šGØ¿ðPÍ/öeø9ðÏÄþ4ý¿m‹¿üKª~м3¢Ùèÿ·&âíÀ^ðÿÆÏŽ~ð¿‡âøQ'€´/ŒtÍsáƒ~|FÒþ;BðïÂ8–¾&ÔÄw랎"¦+1ŽJ•z8ª4ñÕm^QÄâ^Va©IB1ÂTÃPk’šn›\’²œë—æÕq¹¬0¹…ZŠºóÒ̹¡ŒÅ¼­*ôáý›5ÇS ‡iS£*M{98ûj¿)þÐÿ¶GŒ¿hÏø‡âïÆOÚ/ã‡Äïj_¼UñžÓÃÿÃÿ øOÀ6ÿüS¤økG—T²³Ò¾+kv¾Ólí|á+m/LÓôí3E±ÑËFÒìÒúý®=»Iÿ‚‘kºF±àgÃþ*¶ÐtÏ‡Þ øÕàÏx&ÛöPøW«xOÁº_í!à-'áÇ(ô±7ÅÍ9õ+ÿ|8Ñ4‡ú޹}io;xoI³“KÓ´-Aæš¿4>üdøÁã_hžñ¯Å?ˆž%ð—ˆ.Jñ&•â?ø]ÑßE½…àÔo.ô­CQ¸µ»:M£Ë«[+DÒGue Öæ;ˆâuþŸ>ü=ÿ‚gëZwÃcñËö­¸ø%âËÏ‚Ïqã'íëwm¤øx>"~Ï:¿®A‡ã KH±ø§à¿‡~*øÛ¬xáÐÕ|7ªkú§ƒ ðö«û(Ì<©ñtö5ÞgìR’ÆÇϳšÊúÎ4èûƒæ”ÔãVn«¤”TÔ}¤œ¹bgfï9ö 1ª³eÑ«W³UsÂKáF‹ ²îiÎ5aZ~ÛØG•K“ÚÎü´ÿükûzüdñ÷€|ðÓÄ¿¶§ía{á†iñ^ÏÂ6“x6ÂòöÃ@øÅá}Á>(ð¤ú¶¥ñþÿSÔ|/£ø3Ãzw…|£_Ý\[ü<ÐÞöËÁ§GKÉ‹Cû<~ß>9ýœt/ø+àçÇO‹~øq­h:‡uï„Íà?üNøEñÃw×~¿ÔüQão…^.ø§càh¼kâù|2to©Ñ¼Açø:òûÁÍâ CÚ­þš7Óö‹ý¡÷¯ü_‹Çæ\ƒñÅäGlwô¯è+öøWû>|OøIªjß´÷Æ?| ºñÇŠþÂu}7þ ðçöUøÒ/|Iâo'Ä?Œ^ø¥«ÇáM{Â6 UñO‰µ_xOâ^³ã/jš?‚~h޽м}ã(ëG ^_Nº•Jõg^8Z±ÍëEQ¨¨¹T”áõ(ºŠT¹ã£?fäšIµ$ñy~oK•RÄæjâ+TÄÃZ9š„pÕʬ§Kû6ª©CÚB/’¯²rMF7SÉ_´·üÄÿµ7Ã5ðÄoŠzÖ‹¢ê_›ãn¹ðÇöYøað×Ä~'ø¥¦xOÃ^‡Æ>,×|'ñ¢ÃPñ&ºÚ6áôŸWÖ¦½Ôî¯4 Pšèßi°Ü øsûX^ü"øýcûGèŸ~-x³ãEïˆ!Õõ/‰^9ð….µ½-,¡¼¸…,|7{ñÄ/Šm/õvÓ$Ô4+ûXEa§¼6×^K¿ÿ ñü(oŽš‡€?eÿÚƒã?þÚy·zŒ¯jÏür¿×#»µÓ%óï<[ð[¸ð™2DÑ+xUoïµÍ%‹\ëMau©cižwû'xׯ¿¼qüMâÏéÞÔô‹½3SñOÇm#á}ç‡eÔ¾Û¥k/£ü]øŸ.©á_‡'†.uÏË®jpý™æðeŒE5+>X÷Îp¸Œ.¼gûFKÝ:yÆ"œ½®!ᾯ%V¦ʽJS—ï÷%Ë .ZRœÓ/ÎheÕg̪b°îµ{(fŠ„Ýz¸ºT°“Uç—Räö™Qª×µI¨4¡RꔾµÖÿञ?ñLj.õ¯‹Wšœþ0ñ‡ÃßøËûGö5øªZøÂÏá>»¦ø‡áÇ‚¼O¦j¯tgÁ>¿Ðü6šF™u`Ú„v~ðͤڴÐèzzÁæú×í?}ñãã…‡‹~/ü|øÛñ|qøuñ'ÄõO†Þð‡ÃŸø£Â¿ØÞð®wm¡ü\¾Oèv^Ó´ß ôý#P¸²Ó-ãÔM¦©¬Û$ò}ÿ:Ñ?d?Ùßá÷‰õÿÙö½øóñ#â¯?ioÚO 4…ß·ÏÁß¼ð+ÀŸ,Óà猼[¥x;VñÆ ñàÝä±x~Ë\×ïf¼ñ¬Úî¹âm*]=¼®~B~ÏŸ¾>ëß~è7ÿ¾$ü@±×>'xF¼ð>½ãÏ^èþ.µÕ|Q¥Ø\xoQ·¾Õ%µ6ºÔW§I$©ûsç£G$i"ºØ\Â4*Êuy©ªUÒÍ«Á¸rÞIMà-MÛíÝr^é«\ñ 0µåS6œéª5ãý£ÈåNî*£ÊÿvÚûjQpo™I%¯ê¯íÿ#ø›©|]Õ4H~8øÛÃ6|Sû@øCᦡþÏ_ ukŸ‡2|Aø{ìç¨ê~ñÝÇÄ­ÄÓø·À?ü3áÏ|-øš°h~1ðÆá} ÄZ{i¾(W­òÿí®?ÿ‡? |5ñóâ¿Ã|1ÑüY¤h¶_ ¾|>ðEÖ¬Þ<ø5à€>5Ö"ð§Å8t1ð»öøƒñãÂ>±ð_ËI¾ü$¸ñ߈üS7öRüDñÇòã/ŒŸ´o‚¼eâ¯ÜþÑ:ñÇ„üK­øjã^ðoÆ]wÅ~×&еK.]_ÂÞ'Ñõë'ÄžÔÞÔÞhšî™q>Ÿ«é“[_ÙÍ%½ÄnV –*uiº4åÏ6­VQ‹„mTú„”ÚNÎw’“Õ7£'•ñ°˜iÑͪS§*¥Nœ³/m8AÓƒŒeQåu=£IÛÎJMós=õWïÚCIøs࿈?<ñ ÇÞ¶ñ†“áok>7Ð>x;_ø…âŸøsÇžø¿†µ-[Rø‹¥ê> Ðî¾-øvËÅÚ÷…´}s^Ñ|s5¾Œ|Vn×Ã:$ÿ`øïþ ñOãøáÄ¿‹’xÂëã÷Ãëï|@ÖuØÇàCøôH>'ëÖ«¢ø‚?‰é«é7zw>(øÃâ>‡,wr'‡þ$Iáïøv=#Xðwƒ®tÿdÄøAâ?Ù·ö€ñ·Ç?ˆWþ$\ü ño‹< ã/øj(>xÃǼ;à/€ü%g¤Üx‚ßSñ¾©­ëzÃVÔuûŸüXÒÔ|C¸ðÿ‰­>Ãâ¯Þ ñ_ø(¸ÿþ5ü:±ý›?hêß |Uû+|ñVµeàÿÛODý¥o<9ñ®÷ö}ðÞ§ñ×Ã~)ñ‡Ãojv6Ú߇~-]øL|è¾Ðï籞ëÁº-¿‡â·†Ú2L>'¨¬6”±µ¨¸ÔÎq~Þ8—KWÚSÁɸT¯µ#ËR-)h©¿vøCöÿø}ñÃþ ñ€Ñ¿cïí iŸ 4{Ï|[Ñ,ïõÏŠß´üM~¿¾.xWÂr~Ïʶß¼}¢øIÖïò¥F¼ó }:JtñTÖëUžq_Ù׿ƒt¹)¬½›…?vO’í©>f¹ŠÃeù½LÏ2§G0­KF8/®bfÝM¯ü3Óþx7Á?ukO€¾o†Ÿ 4Ò´ŒÁ¤i^ð+Â1ÄW·Z‹}GT‹XÔôÝ>x>èñÇüâÂïŠ÷:Ã_i_ -þü@øÝ០iþý“~ k·6ZouèŸt+ïÞøÿAñO‰t¿_ë—'ñ…ÅÕ¶‘¨x›ÄúW…u|ßêðõÍ—â/†¾?þÐZŽ¿¤ióüPøâØ/u ;I¼/«øûÄ÷šWˆ¢¹¹Ž4MBÖóT–Ò{-Qd6W1]Föï î²£!e?×Ö·û>Á2|ym ^>ý³|Xeø™âx/Â_ðQ†uÙë&×¼⯠|[¶ñ'…ü%ae®i_ ´ßiúW…|®x“LøƒâOO¬üJµÒu g@‰ÐÆ,×MÊN»Àâ%‹9¬ ©F¶N.‡ÔT¥)ÊQj¿#²NËgìC-Ï MšTúË©‚œkjòÅQŒ1‘7Ae«šS”¡%YÓ“V²©†_‚Þ%ý¼>!ø“Âðl´‡Å/Øx;⿊¾8é|8ý™þ|8ÖüCñ_Å÷>(ŸUñ¿Œ5|PÑWÄšÒÅãOXCq¨@âM7U6wë}†•öà?í]ᯀöÿt/ê7‹ãx«á—‰¼Uã_‚¾ø™âOø+â´Wñ[Fñ‘¯üU±·ðšë„i:[^hÚëÚ~ ýÍî‰} Šçå_¾%ø/ã/ůü,ý¨¾0üEøcá?‰¾<ð×ÈãÿZ¿Žü¡x«UÒü!ãµ]R·oø~×NÖÚÝaˆDoŒb4 ~þÄÚ?†~)|(øíâ_‹ÿ£ø{ñUý˜þ0ë >&ø³öÈðìâþ;øõà«GMø-¥ë–Þ>ñ?…5¯Šwr_M¡Ù[Øø¯Lð߇WIûWmucâ- kKÆQÄÓ«—ÃÍZ­\g&pÍëSú¾'êÕêJ´¯‚‡<^š\¿¼»ª”iý¸xÙ†]›Ò¯•ØխZ¾?Ùåó†iìÖõ\MYWòÚ~ÒOC‘ª©ºñJÚ©O¥Õ¿à®µ>«ñ?Mø¹í³ûEè+²ð‰>jVÞø9à¿x_ÆWЬ¾'ÛjÇ|)áϺnƒã_é×ÿ¾ øÂZ÷ˆìu ¯ø—]}gÁ#Ã÷6Öþ_Æ—Ÿ-4oŠþøÏ¨üføÕñâƒ,¼á¿ x›Æþдû¿x{Áºg‡ô6÷Ã÷âWŠ`Ô5]#š=ž—§[ZêÓ]\j:¾¬5÷³ýSÿl×~|øðOKý‚?kŸˆ_ü7®x Æ·^>ŸÃ_´×‰~,XÆt‹~5ðÿ¿ëz­§ˆ/ãðç|ðŸNð·‹¼wàÑu¤®…­ß²Åà/‡Ñܯ‡bøgàïÄ߈Þ?øÚÄ/xËÇþÓa°ñÁâ¿êíi êš%Æ•y£jv:–¹ˆít+íGX6žþÚmUM*\j7:f¡ok-¬Xü6*žOŽ­Œ—Ö0TåAbpñÎ1§V›U\’›ÂR‡Ã ¦œ”§Ì©ÆqRw3Œ»9¡ÄUÇæU1XaäñXxfžÆu¨)Ðs„j<ºŠ÷£Íuía*‰ªJiMßôÓÆðYŸÚ_ÆúŽt;ÏÚOźWü,wÞ#Öu¿þÉ?tÝ~ SÂÉáQ£Ï¦êGâ¬æð†—"½Ì7sÂòÞY­Ä–âÛäÿÚöÇñ?í;â_ø‡âÏí'ñÂ]?Ç„<5âøCீüà«ßx"ãQ¿Ðô¨ü;¡üe†ÂcÔµsV»•£š[ýCW½{ÇžØ[ÛAúÕû@øOþ Éáÿ‚¶o‰| ûhë6_|ð¯ÀZïÃ?øcöèÖ¥üCñö•ñQ|gñB]KÂtíâ/í5cà]õÈügðjæþãOð·ó)cûF~Ðë{jGÆ‹j³ÂM­ß¼Qyk:‡Rb¹´¹Õ&µ¹‚AòKÄRÁ4e£š7™M}W1özT´=ù^k]5»]åíEÙZÿfÿ¡ý•ÄJ‹’ÍåÉìù¹^`“Qq‹åæyKåvVNþënÝoú½ðÿþ ™ñ‹Â üðï¿üQàø4k6Ñ|=Ñ>|3øáÁ¢júgÇ j~ ¼ñoˆ¼y ø‹Å Ö4ÚSã–£y¦jZvŸs§êÿ‰eð3Âÿ·fðjóÄ:¥ð'ö¤ñFw¯x{\øåðÓJðg†4¿‹ZÀ_^Kâ}gàÞ£©§‰îì¼!ñ'ãn­ñOø[ð×ñö°ø½ãÏ~Ó?¼ðgöŸño¾xKâÇŽ|=ðçÆß>"|QOx«ÁºGˆ/¬t wŸð–øÿƾ#} RÓ¡‚çN›Wñw‰nç·‘'moRIêNL®†&®W͇ÁTÃÒžS5¯9ÐÃÉ)Q¥)}J¥Ü ãûÊ›róJ×|9>_œb2Ì|·1©„ÀUÃQ«‚ÂÏ1u'‡ÂN1–„›Ëk;Ó¦ãzµ]½ÙTžïß¿f¯ÛSÅ¿²wŽí1ñ ×€þøgÁ‡4ðÜZÿì´iüuq¢ÝÇá+ê ñ*ÀQÄUX§„æ£cq4ªFYÅjœøŠsåÄUŠX:žÎk*’6ãË{û:zB3•åùÅuŒx,Æ®ó ]°žhªûLU*œ˜ªÐK.«ì£V¿´”i7$ý•+ªqøã/‰4Ÿü<Ñ-µ/þ Ýü9Ó4ß xGø‡àíMÑô?Çy¬jsiZ¥¿ÅÝÙEæjz…Ì;t‹ÉnîÊÂ{ˆ-!¶’Ïýy¿fOùd¿û5ÿ¨ßÁÿMãÅßø/TÑ|_ñGâ/‰´‹­[J:Oˆg{.Ûãü…~ÙMðþœ¾Sÿ‚ÿÉ‚øûþÀŸõ9ø}_V|bÿ¯Ãû)¾ÿÓƒWÊðQ¿ù0_ØàÏþ§?«Í—ÇWüt¿ô”}Þ—£üà{·Âù4ÙóþÈgìåÿ¨w€+ôÃò-x{þÀzOëaoŠüòø¥6·û,þÏr\­£Kðà âg„Ü*ý‹À ½#ÉY`2oÞXhð\ÜW¶Xëÿtû;#³Õ ñͽơy!Öíî–Fkä=wÅoüQø¿aák|OÐôSàÿ'Œô]CÁþ×¼=¬[ëQøgÄÞŠXõh>'M}h!ÓüU¨ÜA>›5Ž¡m¨ÃcuìBŠoœ|ûëÿ<ãi|i¬é~7ýœ<5û0k7Þ+‡Ä~ Õ“À¾Ó¼U¥èÞ!´žóâ³Çö–>0Õ-müGqcsm§ÙÅe§iZVŸ¦E5•ÁõÚ?ßéö_—ù¿¹‡°ŸxýþŸæþæ~¨ßü#øMªø»Ã_uO†õ/ø*Èi~ ñ½ÿ‚ü5{âï é¢;ˆNáŸ\i²kZ —•us´Ò¯m òîn#òöÌá¹Ï þγπµŸøHü ðà¿‚üDuXuïxOáoü9­m[Úø–Ê _ûSGÐì￵!²ñŸŒ-"Ô<ÿµÇmâ¿@’¬Z_šÖÿ±6™¦k^ñ‡<[ øOXðJü<‹Á7þøu¦\øF×ÀúÖµ®xŠÓB™|y,Ð'Æëk6ÿî®$ºÔ~(Ax’ê÷°êvÖ™·ß± ž¢>'‹¾$Ûø¿@ø7à_ƒ¿tï xÃÁ’êÞñŽƒðW¼áqñG—ÆÁâ™õ»‹šíߌ¡‘ì´¿êZO†Äúl:uþ›ª]£ýþŸeù›û˜{ ÷ßéþoîgé‰þ þË>½ð_Œ|cðŸà©xcÄ>Ð>ø£Ä^ø}e¨xwÅçŽ,î<£ø7YÔ4˜îtmsUø‘ªØ]xjÇE¹·½ºñ®¡ms¦ÆúÝÔr?/û3iŸ±N’#økÃ>¾#ÙøOZÖ~ËcãÍ65’Ohú>o-åç‡t[û¤>øÄ~)üPø»áoŠ~›ÄßôÿÙø–×Zðω|M¥møy?Œ'Ó¤ð§öçŽCXЬâ²Ô£¹ðΙ¬'‚´Ão߇ü5¡jþ!¼ÖϯPþ÷O³ß—ÿ’Õæ·²õvíþúaE|uÄ?‹²ý›Êø—ð²O¶y¦×gÃMY¾Ò Ì`Ûñdù¾P“fí€Ø«ñø¿ãtÑE4^<øq$SÆ“C"|,Ö™$†EˆËñ\«¤ˆÊèêJ²°e$hXÚ/ùº}—×—üÿ{ ÷ßéþoîgÖÔWÉŸð•ürÿ¡çá×þ­oÿžµð•ürÿ¡çá×þ­oÿžµ]£ýþŸeù›û˜{ ÷ßéþoîgÖtWÉŸð•ürÿ¡çá×þ­oÿžµð•ürÿ¡çá×þ­oÿžµ]£ýþŸeù›û˜{ ÷Þ¼¿ÍýÌÉý²PKàMb6,O„ŸPJ¶×𞞤« nNÒ9¨¯¼Yñ à‡ÿjëØÊ 'ö«O‹ÞŸâ.Ÿ¬C£üA¹øYÿE¨ònÝì׉ñE,¾Òåi=.;&¹A§¬j°:¯²©R­ICŸÚrò^÷»ô¶‰5ó{èŽÊNTã¥Ê×Ä•šwpk^¶¶¿ðåOÙºÀo…°‘Ö ´!ås$¬±êú¢’Fù¤‘‚æGo™˜–'$׿ø•nµbÈ’ÄÃSÀràÞZ|ÃcÆÀã#‘É'p>ð•§€üáߨÝK}káÛ,a»ž!Ó£^Ý݆‘<éþu>[·˜|ÆBác #^ÿÀ±¼—Z²¢–?Ú:‘Àœy–ƒ8ãž¾ãÔ®Z¤hÁwÛ‘oÔΫ¼&û«˜>,üøM¦xQøÕ>—¦èþ5ø»ðãáO‚.õ? ø‡Å/ñgâ^»…>i’É£é:ì^¸×¼I¨[xKñ6¶t×WÕtý6çZ³ºÕ¬¢¹òߎ¿´/ìuðSð7ÃÏŽš¿Ãß ]kšmÞ»áoê~ Õµý/ÃÞOø+ÀŸµöÑtgEøiðþ×Ǽ á}WâŒç𿂬µÏèö:†» ÷h£ÎÿࣲÇÅÚßà—Ã߆ €­µ/þÔ?³/Æ_KñÄ1ðÞ/‚þ|^ð×Å_iºmϼ;®ëךþ¾ž·ðî›iß…cukXx¯M¸Òí­ï¾)Ó¿à_µT<ð3Å?³ÇŒ?gÍOö‡ý¡~:ü[øKiñ;â/‚æÓü!ãÚ6çã_ÀoÙƒáï“à‹_ÙïáU¥Æš|Oá½Â_n|U«ø+ÁþÑO…ü ÁÂ~ØÛø[“Ãsiá [\Zê7º½µÅ¾kÖú¶¡A¨jpKW‹Q¾‚(¡¼½–æê8Ò)¤uEâ/ƒÞ<ý‚üàÚŸÇ ®4|$ð¿Æß‹÷ß´–¹â½?âÕ›_šgÄ'Æ»+þl+à}KT_ŠËâTñ“ü+ŽóG»ñ”.¼ýR}wm§ÞiRkZ¸—A¦±°Ô–ßQ– Èa–Kˆ«”ºøËð1~;Cð’/²ëŸí<;§j:§†üã/_ø#Ã:äzÕÆƒ/ÄxkÃÚ¿‡þéž%]\o Aãÿøb?ËktšZ„ÌþfýŸ¿eï‹¿ÿfßø'wˆ¾ ø%â/~ÈZoà ø³^±ñÿÄ­OLÒ¬>þÏž*ø3mñ#á=Àø}àɵ¯øŠkën<ãÍOðΉáŸø«Ê×õsCЮu/“ö ý¤ôø)_‰kŸü_Ó|3ðgâ/Ä¿…ÿ¾%øVÇÆŸ¬5Ïøwáçì¯ã/€7? 5¯…¶šü8ñM†±ãk¿‡ÿì>$ë>,ƒ\ðãøQü5¦xO÷ÒëWà]þÇ÷Ÿ²ÄÞøÄŸ²Ý…ýµ·ÇŸÛüo‹Äִϩ៿‹O¡øØ¶Þ<—ÄgÂ’x͸¼I,dÓ–¶2´hê¾ïã6 «øS¤ñ2½Bäÿ爹;ÝÎzô {Wæ_ìçû1|lñ_‚n»?i^.ýžï>8ÁA|{ñÇáåψî|@šö£ðÚóáwÁ/ éÚµÄ_>6x ^Ó£Ö5 kö±ØMãûI4ñ6§¢\Á=¨o¶¼ð×ZøIà߇>×üS?5M+Yñ$ÓxŽåüq,·Ë©Ùx»Q… üEø‰ñSŬ,âºKAý£ãV5c›b-ôë\1Ãÿ·éÿéq5£ñ¯FuWÿòðçý…o¿õñ—í‰û?þÔ>#ý«¿h?hžðçŠ<9ã?Ú›â÷„¼ ®\þËŸ>%>¹­ËâÿjÚ_‚,ük¥|ñN™â?é¾Ñõ3CÒüAªÝi–z§iåŇy§úˆ_ÿÈGßö¾ÿÔ[Äuþzß´'üsâ—ÁŸŒ¾xKAø¬xO´_í¢ëZ‡‹õŸ‰šGŠõox»ÅŸµý¿‹<¶úO†µ 'Dñ=޽û]ü`}#ÇË®i¿`Ó|’ø>åô­füö+ÚΜ)JoƒuJ¸¸až&qÄB6¡E% ¸F¬gZmÙ]ÒŠ½ìׯñ”0Õq9],v"<¥œ±RÂ}iªñ–R¢½Ùr)ÆUfÕ½ïfµV×ðOÅW÷_õåøúßÞÿá3µÿ¢—û'á‰Õ?ùÉSãñÂBé5¯ÅOÙbÊæ&Y-ï,~ kvw–³! ŭݯÁh®mnap²Aso,SÁ"¬È’*ºøü3ô¿ôTþÿàOŒ¿ù£þú_ú* ð'Æ_üÆÐ°ùz·ü*âÞÚ<½´íÉk§ƒi­5ªùŸSá/úIúåðiíºx-vëß[ë~°ñ=¾™ámI_‹¿³~¥k¦]ë¶Rx‡áOŒ…¦ÛÿÂÑøcºWY·Úübr²ÚhH¿/ü!™Âüž$†þú_ú* ð'Æ_üÆ×V3 €u“y¶%¹RÃÎðË=œS•2²‚Âr«;GÝJ-ëÆ-E%„á99ÎYërJ““Yt#yNnMò¬•Ûè’×ÝIh}‹ð¿áíñ³Å«Á«_‡¿D¾Ô4Ô°øoð3ÇÞ5Ò&N×t½SQðêü/ðßÂJíõki¯tßϯ tø­d‚7ñ2ê/˜òxÏÀÿ~x_Á¾8ø…eð[ÀÞ øŠš„¾ñgŒ?e?øoÃ~7J­©·…5½cà–›âÓÖúÉï“suöhï-^b‰q ?Wû|_Ðÿbï‰øoÃ¯Šž5ðf¿eñEƒÄúÇŽôŸ‡vš¿‡õ=,øf {Ý;Â7Wâë-NÖ]fàj^Ô´Eðë¯êþø§økÄ:¤~Ùÿ¶/ÅoÛWàÀ¿€Þ6¾ýŸ<'gðsWµñ÷‰¼=­üYÔuk/¯üðÌžGˆ´RãG´°ðÃÍk yªø“Q×¼Q>¥¯¶­§[\G£AæP¥ “¬±XêØxS¬éáy2§JUðÊ0”+MªRœª6NX©(|©˜|>KV¦!cs8áiR®éà¹r—NXœ„e D›¥>iÔ©9¯h¡ÉAµMss‹xØ'†¼ ãO€¾!×õ;ý}á÷Ã}{Á~#Õœëš`µŠR×áׄâÞÒÿìz•Æ.²©r,UÒÒòâ {vúÅÿ¿iïÞxå|kà/è73‡ÍÉø¡û([Íæ!Štø«Âðɸl•eà˜’&°Ë$dH…C! ÷ðïötý¬õhúí§€4­sAñŒ5Ÿ†^Õ.fωß­õ?ˆ—Zö§qÿ™ãk„^;Ó5?ê×Qê:Ý„´¿^êKÙ™tÛY^æþ ƒöq4FOŠ¿ cA"´xÑ‚(`YŠÇàÆ‘‚ŒœF¬çEf ÞïÙÓþ Ùñ#à?Àÿ‡ÿ~øs஥á¯jšÅ’êµoˆÚWŒ5?…³êzä—ƒïl4Þé.ÖÛS›^°ø‰g{¨XYA­ß.¯ ºwè¥JšÆa©RÌkýRq­øãñ³ÆºF‘ð]¾üP»]ÅLÚ7Ã?‚þ8ñ „vÖQézÜß ü9ð¾K½zêx$Ó/VÁZÄVº|wwú¦˜’ÃÊ~ׇŠ?kÏÚ;â§íâ¯|ð®³ñ;\³ÔO†ôï\iš™¢èzW…ü?¥ÇyáºÔ.­4 L‡RÔäKTÔõ5»Ô!ÓôÈ.cÓ­};ö,ñï?d¿ˆ>+ñNàš­¤·^(ðî«kÞ3Ðü¤ø·AÓ§Ó<%©ë·‘xVþÒ¸Ó¿á$ñ»aáÍcÃ%ðŽ±®èÞ_XM¥[ÜØ_ሧNŒ!,;‰¯*´©Î3Ê]XÃQÆž&ºŒ¨AÁУÍZ3ç“N*<³rIÞ3‘Ò§Måù¢Åâ%V*°–RªÂž«T±˜ž_aIÓúµ Ô®¤êKXò8TçjX^2ð·ÄχP ¿ˆ)ð?À¶¯¨6’·^1ý•¼oá›gÕQ'‘´Õ¸Ö~XÄ÷ë¥Ì†Ñ\ÜyvÓ¹l2ó[ÛýwÅÚf©áïx×ö{ñ³bî¾ð7Ã=kÁž&Ö¬ôùbÔïí¬5è¾x<@¶¶¶Rj—pÍâîlôùà_µLÐÙ\}ïÿý³u/ÛÃáOÃO†ZŽ—à?KðÏZŠúÃÅz—Ç¿?µLMoâÿ‰^ËÅóøŸá͆£ãmyuÏŒzäšüu«x¯Å.›i=†‘}eqâïê>)üÄð'Ãm3á·‰l¼q®øóà ²ðòÏxšƒ_Ä—"Õ/ž&¶ÓíìcÔü/a§#½ž ½Wí—öjÚ=¶¡¼Æùía–«R£F…J¸<~#‹§ O †žXçO^1^ÆŒé¼2æIÆ0kžRø£¹­|>ACV¶4XÜ•9TÁa%–' V. › ‡”>­ÕjÑ…7j´ÛRÒ¤¼}µû=~ÕcP×cÔ<àëíGFð |cñÝÏìmñ^òæßál÷zå¹ø±«\Ü~ÎÏr¾¾¼ðçˆöxßPeÑï&Ñ5¦:ƒÉ§ßù?8Âglxÿdà{càN¨N{cþ,—ZýÐàª~$øoá§ð¯ÃO|”Ù~Í^ýš4¯ü@øÃñGÆz…ΑðßNý¢to‡^5Õ"ƒàß„&¾Õ,ì?j_‹Oâm-¤Óâñ«à_±Ëáqábþ§À QÑÏÅ/†$++.|e“´ƒù}ª©aðn”ólK›ŒŒrǧh6¹~­$—2IGìèµ  :P•LóßpƒåŽV©8Ë•s'«TKUd“÷v¼µoîÿ‡_³íq㯠Zø—ÃÑü{ x§â-߇|9­ZþÍ¿þ1Øø‡Å¾'×tÍ#Mµðþ¿¥|ñͽ½ßŒµíOLµÐ|º†®K¨XÆÞ°¸Ö4õ¾à>#Eâ‡>1Õ¼ñij§ƒ<[£¦™ý­á¯~Î^#Ð|C¦›ý&ÃQ²úN¥ð.ÚöÐ\é÷v—v‚hPÍe=¼ë¹%V?c~Ìÿ·F¡û1|8»ðŸÂkÛx“Qñë¯|LÕ|uñ?Á~?ûÁß|-ñ΂| s£øG[±Òt«Ý[á…5/ÝÞÛ}µ CÄÚ§þx‹\Óþjžø‹öÁ›Rý©þ?ø·ãf¡â?‚þ »ñ&‰ðïE—GÑõ_Ïx<ðãÂ~Å(×eð-œÞ*ø…ãHü2ž-øãì,'ñ޵¯x’m>ÆMI­bx*~×9ã±õ°Õg^­BžQ,?²¨^HÆ H¨Ê:¶Ü¥'Ë$Ó½ùpX|ެ)ÖÌóXá1Söî¶;£ìäëFÉ)R®’i){În|üêI9'wÁ>ø·ñgÆ>Ó~jß ¼}æ¹¥.™ðßáŒnà±Ô¼Q¢½…¦›ª|:Ð~Aã[ïÅk7‡ô8,»ø‡2~Çÿ¼S«ÞøÃúä¾ Ö¼juh¾jÒx‡Ã:/‹lo<%«xÚßPÕ49 é#Høi¬|Fñ…¼?â½ úKáׇþÁ?ÃÍSEñ®¥xþ2T©¼Lh¬}xà£CÚCò—)Ëç΋­ìQ„#Fq¥È¹œÜ¹Ý’JxlãaEf‘†\°Ó©O,¡NSÆJ¤#[ êûrÆaF¢¦©^nnR©.^XþUÂejNÄ¿Ù?'§üXS9ÿÃ'^›áo„ÿ´6¯áoøêÓLð/ˆ¼ ¦ø¯MºÔ¼Y?Àˆ_ü+ksñ焵˜u‹?„þ/Ò|añU×|+áï xvöo êZޝ6›¥Gá¸.îtèn~8_€‚ ø¥ðÇ‚qsã,à¿ñFõÅ~­þÊ?µö‘û,|=ñ‡„<¥h2Öµ}càlÍ«ø÷âO|7á»OþÍ_üûHxÄú„t…Z¿ö߇µ_‹^†ÇW“Qñ…â cáå¬Þ[/êfÓÅ3:´©Â®|uz¸z²’ÅמUÏ,=8B3§*u}„'R¤aM®ZœÊV·ºÚªø|Žð°Âæj®¬§~"yR›ÂÒŒéJ5 J›«Z0¦Ô¡YOšÊ Ç|Óñ;@ø…ðkYo|^ºøð»Ç:UÔ—Ÿ‚þ"~Ì>.ðoˆtë}SHÐ5M2æã@ñÀ]?V¶]KN¼µ¾‚i­»¬®-ÚHä yøwâ¯ÅŸx;ÿuŸ„>;×nüEý—k ü1øKâè®dÕµ]X[+}GÁzÃ=6ÿÇm«ØÚêÚU†i x¶å¤ž{q§Aì’K蟷¯Å~Ý?ôŸ‹úþ¹ð_áäz7„ü?ðãþÑuïë‚ÃÃ> ðö‡¦ØI©ëWþ³—VÕ¯n›Q¼º¼‡KÒm+‹k8lwZIssä_³„>øã½+ľ&Õ< ñ.µ½ SáÕ½ñͯ…gÓü9¨EâÉmüY¨ÙxrËR±´Õµ @Ò#–Êß\·–ÊóVµÖô-KH¹¸µ›§2¥N>la_ˆX|,y%”:öu)P†"jŒèǙТêTïlåÒq´âpÙ%I`3EŒÆke,¥Õƒ£Rª§Šª¨º4å/«á§V¼cí¬Ý5îÎ?»—¿ø¿ötý©~ø#Ä¿)øÁ¾ñÆŸáÙ´/x›Uý-tmW‹^Õô­ôýBöÞéu]SOÓÌ_j½¶Š_3øS¯jZ÷Ä߇ú†¾"~ÍWšöµãi:^›á¯„šÇ‡_r“Ã7RóÑÅJ<éò«jßß?´ŸÀßÚ_Ã|w¨ø³Á¾ Ó¬|Mã‰WþÔ¼Uû,|Kñ ºÆ‰áÅo« ?Ið/Z±ñŒ~‡XÐt½{^ÒÉo{4ñKá‰J×bÇÚüb¼Ï¢j©Éðn8i#©-€{°Ø|¾x¬;þ×ÄÁº´£u–Z1IÓŠnðpºI&Ô\e'¯5Ýͧ„á9FOûqß‘Fë.„U£Â:C£´³}ïvýãF‡Ç~=Õü?¥ü9ñÀïjV>'Ñu™ì<ðÃÅÆœ¶Bñ!ñ>³¦iŸ 4+èú)¸’ÚÓÄúÛêiŸáMî&Eõ_ü!øûàM;Çú¿ü)ðÃÂOÂhžø¡ªø£ö?ø éß¼Uâ[x®ü;á¿ßjŸ³Í­¯…uýzÖxn´}#\–ÆÿR·š)ìíæŠTfùçàÿ‚¼'ðÛÄ yã_Økzf¾m<<`øu¯x£Ãú¾ö»Û{æÖï|IwàKûGÓßLŠíWNѼC­Ú}º7ÃzÁ†xcý2ý¢?mŸþÐ^ýµ4+ÿø7úŸí¹¯üñ§Ž¯ãý¡¼{«è¾ñ¯À­7PÓü­xGÃ7?³Õ¨K;Ã}ž6°Ôõ{ÛïCcike­è+ʾz¥ bkB®6½,-5O금å.51)¾z¼õUê:s\±¼" šÒZ·Ë >G,Uzu³HÑÀÒ©b?²­-k>%ñ Ÿíñ{ÁÞ7ø•­x§Zñ.“ãø…¦Z|0ñ7†&ŸQ²¹>´Fÿ„–Ëž]OAøk?ƒ&ñ‡‹5M[”(,u pÌký]áªÎX‰dîRhN„iÒXa %8·'EFM¨ssEoéà ÃÿQÅžql#Äà%\B¥Ž:*¼hSINGFP“~ÍË™ú¶»u êºž…®xëö[Ñõ­P½Òu}'Rø­Xê:^©¦ÜKe§ßÙ\|ŽâÒúÆî­î­®#I ¸ŽH¦Eue÷€>~пm>#xÛÁ€¼wà}@Ñ—ÅÞ Ô5ù<7àí |%:è¾ÐßPm3ÃÚJÍ2éºE­¥˜–Aóú7ûþÚ¾'ýŠ>|_øAðáþx³Rñþ†Ðë ñõçÄ ÓÅZÏÃŽÿ ôsÁGEð×ÚuÍÂÞ øïã[Oøw\·ðýÅÿ$ðΩ¡k³hzf­kª^":o 6:µhV­ xÚµ2¯iõ\2ƒ’ÄSÿgƒ„¥‰†¤œíïÜÓž>^&†GNXh`³Hâ)Ö¯ 9•iå^Ñ`ði{U‰ŠTir9c)a0ÜÏÚ¤±-¸9%R6üJðwÅ/ƒ7Ú™ñ~/‚? 5/h6þ)ðæŸñöWñ·ƒ/uÿ ^\\ÚZøƒGµñÀ:}KFžîÊòÖJÍ&³{«K›q1– Q9)OŒüm«Zi_¼oð;_Ö!×¼'rÖømâ ëQ4šÆ•a¦ê—²iß4Áã¯k~"ðgˆ¼3©øNÃLOêšl:ÔwÚj¶©â›Fðî=LJ4­9u »¸´½B-\^¦œö1OåÍuÖ£NŽYŠ«‚Ì+âñ«†x|4ò™U…z¼µy"âèF)+$Û’k™TŒâ Óœf"£FUrüÑcs tå,6å>ÒëÆ¥:j„M­eíT¡­E$¡+û÷Š¿g_Ú—ÀÖ¿ïükðÏÁ~±ø=oáË¿‹Wþ$ýŠþ)è–Ÿ -|asxVïÇ×:—ìçm„­¼K ÑˡϮ½Œz¬R$–M20'çÛOƒuoö/Š¿²¥àš#k{oðKZ²žÒàH¦˜o-þ Çqk,2m’;˜f‘dˆ‡Pkôãã÷ü¿Çß¡ý¨Åׂ¿fÏ ê?´GÁ ~Ïz>¿gãŒ×º×ÃχZ~½ªøŸÅ¶âèøRÁuÛÿëšî­uo6‹m>Å&Ÿáÿˆ6?¼9¥Á£·âm§À.íŒÿþAž/:o?ÆòyQoS$¾\> ’gò×sìŠ)%`6¤nä)Íaðj–k‰såNË,n<Ê0ӑᦤ¹£¢½¬ÒÖ×}Áðdz¼óËÔpMF9Z·7*¼\^|ךvWÕ>]]äþØðWìûûRÝøGáÚÃà ßÃâgXðW‚íµ/Ù«â_Å ýCÄö0kž3Ô|¤øÊÃàÿŽtÿköž‹PñµÆ‡¡x«^¹Ñ|54—±éɧßÚiþgâ[ígÁ¾!×<#âÿþÍñ_†5kýÄžñìïâ_ðþ¹¤ÝIe©èÚÖ‘©| ¶Ô4½ON¼‚kKí>öÞ «Kˆ¤‚x£‘GÛ^ý°¼ üðÂè>øÅÚ†þ<êß´ušüZø½ã ?U°ñ¶«à+¿ƒš®‰¨xIø7®øf'„QõíD—^ñ^}â[­?\ñµ—‰´¯ü2¸øö—²ñ'í;ûBüjý¢|UãÏ„ˆþ6üMñŸÄíkCÒu‰º–—¤j2×/uË7O¿ñ.¬ë×––Oxmà¸Õ5;»¹#Œ3È£li–•*´iUÇãëa1u#âp”²·N\DœeV„b¨TJ4¦8¥)?u7)7wž‘W¡N¾iš,aV>Ó‚†V©¬&2mO‡\Ôk·5é®iÎO—™ÔÛ~±ðËá?í ñrÿÅÚÏÂÍ7À¿|?¡ø?M×5›Ÿü øãÿ iÞ±Ôõ{f»oh? µÅð¬>¥¨×Þ »ð†…`Ó_HXºŸSdŸ7ƺĆö¾¾ø‡sðÀv|6¾2ð׌eÿxfÛÆž:¶§ øV]kà”~ ðñ×4]cG]gJ7zkjzV£b·âÎâ4ú‹þ õûlø£þ ÷¥xïCøzß µ~¨R…YW–/_á^TèBK¤êa©¨*¥%Bj¤«B0©*–Üšä‹VQ…Ãä•g‰–ašG ቕ<<#”ªr«‚§C ˆstjª’¯F0©*–îáì©Û–?8üMñUµ÷ÃvÔxÓö}×̺†’‘à…:Ÿ…µù›t̳Ùkgៅ–Ö[2>Ñ">·oÕ¬W6ÒEx³9ÿ×ödÿ‘WöKÿ³P?úü¯ñÈñ ø+VÔ£ñÇ‚<@ÖÚ–9Ót)¼M.§,^Eì2É z‡†4ëSºMö™ÞK¸‚A¤$oþÆÿ³'üŠ¿²_ýšÿÔoà}4aNž8ª˜ºnwU*a凔dçÂÒ„9í£çŒT]ì•Ó?Iá:y}!e˜·Œ ñ”ª:N…ª:TS‚‡³¤­Ê¢ù”,Üšm´ÎÛãü…~ÙMðþœ¾Sÿ‚ÿÉ‚øûþÀŸõ9ø}_V|bÿ¯Ãû)¾ÿÓƒWÊðQ¿ù0_ØàÏþ§?«š__ñÒÿÒQõÏz^óôÏìõtÖŸ³?ìÛ"[Éu,ÿ¿gý>ÞÞ'Š7–ëUøà½2Õ“¼Q"›‹¸üÉ$uTs€eó5×Eø:Ðÿù>¼Wö}ÿ“oý–ì•~Ëú|8¯ø—ûi‡|}ðßYðW†t ÀžÔ¼A»ãïˆZç‚üIñÛLømuñÿPøEáX~ø‹Bñþ…¥ÇkwáÝjK/Zx¯MÕô_J¾ º°Ò ¹Ô¶iofß7Fþʃýuò2Oml­—ÝÿÀ·ÌûoÌÖ?è ?ðu¡ÿò}f±ÿ@Qÿƒ­ÿ“ëá?ÿÁG¾øGOŸW×ôï‰'C´±ñc¿Š4/êZ×…oõÿ|:xáÇŠþ&xâÏÆÞÒ<ãíCáßÄÄÚo‡´/x3ZÒü¢üAº¹Ô´½SÅ6‘jÖGÁ%ð÷‰m`ðçˆõËë fÖãQŽòÆÕr½?võÛWýzöê5~÷ù//Ï_¿Èû'ÌÖ?è ?ðu¡ÿò}f±ÿ@Qÿƒ­ÿ“ëâ¯~Þ_ ¼iã­ á°ðÿˆíü[⯈?¼áÈ4ù´‹½2óDøñÿÀ?ð˜K¨kw¾’æRâŵ{xfÏÅ Ðt¶{ÍJÐØ"_Í÷%'e¼-ÿo0Wï’òüõûüŠf±ÿ@Qÿƒ­ÿ“ê­õ¾¥m-¥ÆˆÆ|²Á5Í _1J’®íÇø£\ñÈÏ­lÑJñþ_ü™†½ÿOò‘æÖ¿ílΔ`Ðïö5µõ¥Žïhm¶GwÚ¿écÌc½¶7Ë·= í,±¼ðaE¨Åa¿Äšá5Mÿjó¿ÒÿxNöòÉÛ³ óŠôš)Zš·îÖžo§-¿ô•÷Í?çÕ¯÷ÙßÕüüÞËÀ6¶B6úà>Ówx“Cm£U ·^úXóI|¼ãË8Æp+¯±ƒRÓìl4ë}…¾cg§Û 5Í Ü[XÛEi‘þÞ¸†Ø˜ÀÍlÑG¸¶…¿íçÙ/Ñ òÛ™µ×ðŸÞPó5úühüŸG™¬ÐàëCÿäú¿E;Çùòf+>ÿ‡§ù?¿È¡ækôø:Ðÿù>3Xÿ (ÿÁÖ‡ÿÉõ~Š/åÿɘY÷ü=?ÉýþF-ö§{¦YÝj:†›­ŒÝ]ÝK­è‹µ­´O5ÅÄî/ˆŠ"ŽI%•ÈK1šó™>2èñD.$ð·Äaiåù«ÿ Óâ+iÍnFátšŠøLؽ›'ïVñn «Eûå”ÅóÒ|i“gÊÛÜ,Kðoâ$¹±íÑn3#d…P°,q…-ÐVߊ~!øFo]j©ñÇá°ðÂésY§…aÔ|94²ÝÞ/ÛZ)Öa ˆ×NxÛ)å4Ìf¢ÔÔyRv½Û»óédÊŠ½•œ›’[h­É­—¯Ë^Èë<=¯iþ&Ñl5í*hî4ýI&’ÎxfŠæâ†ê{Q<3Û³Ã435»K ‘ÈÊñ26Al¯ÁÜêÝ¿âc©èËCÓëÓ·Jùûöl–)¾|5–ŽXeÐ¥’au’)"}SQhäÐíxÝeeb¬ •8Á¯ ü P]jÛðþÐÔð‚œù–K+ c=ºãšÛ ïV ÛXÁé¶®UV„×ecåø(gíñCö\øOðƒâÂ#Cñ«âoÚûöKø1â êú#ë7þ%ðÇ/ŽøQâ½Âx6ÃCñÓYø±/|%®ëz…æi«Yñ¦Oaw5ͧÌ?à _nÿgsûMþÏ?…¼1áÿ†´¾½û/|løsñ¿ÂÚtóhßüûPè_³ßµ|XÑ>3è~øð¿ÃÓé¾3KŸiz/Äˉo5¿kk£[èºn¿Ÿ¢¿´WÃ?Ù¯âç†<àïÚgGðf¿á~*xVðW‡¾ x†ßHÑuÏ‹Z%íÆ¥ðúÊÆÊ{ý2ßÅ>"‡S·—QÐ<3:ê‚óQ±Šú*æïM·–ßÌ|Mûþú/…|>Þ3ø=ðïIð€µ½sÄQj>'Õn,tÛcÇ_t/‰^'ºøƒ­jº¤Câ ~4ø­¤xwÆ>"³ø‘{âk/xÎÃKÕu[kýR;y+Ø8NÂðP/ xÇöÆñGì;ið_âí‡ÆoOâ_øÑõð:xSÿ,ôï Kà/òëÐø¾k}KÀÿ¼Câ;Ÿø7ÃZ2ê,5|Nøs Ëã“ÄYu?k~%ðÿ‚,¯uKÝ"ãÁ¶vúÅÄío§ &[xþ»Ñ¿cÿÙ“ÃߣøÃ£|&Òl>(ÅñÇ¿á:‡T×OˆåñïÄïøwÂ>9Ö®u 57’òß_ðÇ„|/ Ë¡] ¼=e¥øH´Ó4«l Tò?‚³§ìÃáoþÓÿü9ñgWø«ðßâÆÏ?~0ø'Qø—à‰ ø]ãoŒŸüYñGâ·…?¶þhž ñŸ†4KÏkZó\è>;ñ³ªéÚ]œš+ê §G©[Ü€t¿³7í ñâßì³û |f×þj>)ñGí7ðƒà‡~&_|;þÁÒ<ð®ûâ7ÀȾ'k¾/Ô´ïx¾ tx/,ÒôÏMãoÛê&ðû]XÝéÚüÈ?à zŒ¿ðR?~ÈÞ£¦øÁñoÂß„¾y¾ø«Æ¿~+üIýž<]ûI¶–~'Zø›DðÏÃ1§øÃz Òt9|)ã;‹ù<®ÞëZÞƒ‰|-bÿmü>ýf½áÿÀ áïƒ4‹¯‡?ï´ß~Ï«câ}_ÄÚ‚ÚoëžÐu_j·š¾¨$Сð'Œ5 ÖpÞ]x~ÇÚ¤vÚ5¥½”6 O|ý-¿i |RñG†þXþÓ:ÛCªx6óXñ›aã_ê^ðž¿àëè¾ºÔ ‡Ä>+ð÷5ßøFÛÆ°h7þ&Ñü¨øvfÛA/d /ü ý¶|cià¿ÚÿÄ´9ðψÿ᜿mþÍ>Õ>éžøfšß…´Ÿ‡¿ ¼[¢jz½¯Å_‹Qø~-sûCÇšµµü°xÊÕ/-m¬³ôo=. ¿Yx;â·‡þ5x[áçÄ_ ZÝÙhÚÖ±â(-mïµOk7(ÚNŸâÝ*àɨxÅ1ðÌÁî,åd>!¼’$eŠñ-okH¸ÿÙOà·ÀOxkãEïÃ?Š7_´5ŸÆþ-øÏñ/Æ ñ'ÂßÄÿ5¿ x#ÃZΗøgá x?F·ÒôOxhÁ¡¦Šº”—Ý]\KöèÊû·‰l4Ý6ûÂzU…¶›e§¨˜í- ‚ÚÚ6“Ãþ$‘Ìp[E IæHÌîU2ÎÌìI$ÖáÿÛôÿô¸šÑø×£9«ÿùøsþ·ßú‹xŽ¿‚ÏŒ_ðIÿ‡?>"üSøàßü'áÛßþÔß´LŸ…¦ø?à?_ë—¾ñ?í¯wðïÃZþ·zu[-Ôÿe«cO†ê Q4ý3ã—ƒ­ ð•ìZMŒþ)þôïÿä#áÏû ßê-â:ÿ)OÛ¢]nçöÌý¨¤×~þÏ——vß´WÅ{:ûÆŸSÁ%¸µ´ñ¦±gáíf÷ÃQüxð Ò¯§Ðmô×·ºÒî®ìþÏy"»\¤ùìT"áN¦"t僄å ágŒx7S4ÊJPsTa °jú{TìÚGÈqs¡ ^WS‡úæQÇFXUŽŽN¬¥„të'*ÔUEN1©i7Q5ºù3öÞÒ#ý’¿kÚöiÐí>|FÑþ üPñ'€´ï„ÞӤ׭tk¯.;‹«8u+[[øý‹R† Ù£Kûk«úˆ¾Xÿ…ã¨ÿÑ>øEÿ†ÏÂ<å/ù澟—FÓ'’I¦ø9û"K4²<²Ë/í9nòK$Œ]äwoÚT³»¹,îÄ–bKNiŸØ:?ýÙÿj×ÿ¢R¹”²}?Ùhôÿ™¿§ý?éúz6±YŸðƒ>Ÿó6þßõ0ׯ­ŸsæOø^:ýï„_ølü%ÿʺö¿€š…ŸÇ_ˆšÃÍcán•©Þjšž›q Xü-ø]¡ê*Ôõ{-FÒUðõ¶¦Üør_Mâ{?¶hZG…¶t™"øí¯FšEí핔׿ÙÑéú›5¤?fÔ­HbÜøµ€©‡« :|L’TkË9œ#J|Ѵܩթ;$µŒa.{r=Î\ul²®­<Rð˜ÉF*†&yÍ8FŒïMÊ–2­KE^ñ99Û‘é&×í?ǯø$·„þüý±>,¿Š­¼9¬þÍþѼW§øâ?ìÝðÓI›OÕaðÃÏkñO‰¬nŽ‹âë/ëþ3Ö>ü9ñ瀄~ÕüYà¿Åá«ÿˆv‹{/óueñ¾éï-RïáÇÂK›gž¸µO†þ„Ï H‚XDÖvV·‘cÜ‚K[«{„,á”,‰õ5Ð{Ñt·Ÿ ekµ¾[u½[ŸÚ¤Î/Í™íédý¦œ\-«³=²Ë¼@ÌÍRI4-ô;EžÓþ þÉ2ß,ˆlã´ý£ìµ §¹ mc'ít—“´»6­kp'¬F ƒ˜Úr_V¢çÈí'œÉ.e®ç*׆ª÷kK9yýc"Tgì))û7i<æ¹ÔRsxöáï-d“å·6­Ÿµß?à’ ñoìÁû*üMð§ªxÃQø·ãè¼;¨|<Óþ|+ñ'‹¡°Öö°ÿ„›PºñŒ%øVµð¥ªxnÆÓÇß„´Î±/ÀOÚ#ãÁ3 Õô߄߼yðïOÕ|sû>hß á­F[M#þ Ûx÷Uñ—Š53c}ü9ð–§f,4뻹xƒÃ¾"ý›tZÉsá øSÅxÇÀ ªYÊþ#ð0¸ñ$ž´ñ6‹}âßx“ȱ×,|E¥]^ÞøOHøÎÎóÅ–:ö%‡Ã?ÖžMëVþȵøá  ã¾›U²Ó®|F¾;‡ãB”ñ£§Ùt)4EñâÎú»ÛÃ-læü$ºuÄ6ÖÓü"ý’f¶²YVÎÞ_Ú†) ´YßÍ™m¡ÚXÇn²ÉûÉJ‚I>g¹¬0ñÁBx‰bc†ÄFx‰KÉžJ§Õðü°Q¡4êÁBQ’”4æ¡Í¤›VU„«–¦&X¼³ëqž*rÂFžyN§Õp®0Œ0ÓŒ±ŒjS’œ¥J.q‚•IY#Çþø¿Hø£âëx¿á÷…—E¾Y¯îeø}à-ÇÅË‚ŸÛ·ú°Lû~£ªÚi×Z-–•wp-5+­J+F{IäƒP³ý´ø©ûüø=¢ür×|{oñ Âú€ÿ`¯‚?¶7‚¼wâÿÙSá?ÃÿÏâ¿ÿô}SÂß|[e«k¾$Ôí¾"ê¿üoà†V~ðæ³â+Ý©ñ#ůŠooüºoˆ?'çþÝðÔWðÂß»k}£´:·Â¿¾7ñu¡mkNâÛIüu$wWßd³¿Ô#ÐÃ[[ÎÈoì’g’·õSu©Iq¯ð»öV¹bíö×µGæ2y)?i©# Ãr Ê£¨eäJ1À,UZ’†XIB”há–{>z5¡üzÒ¤ª¨ÁWŒ¨AZo›ê÷i] ¹_׫ԩ”óà§NŒha}MÔÃצÛÄו%ŒPŠÄBxx«T“—Õ¯(Ç™9|›ÇóÙã?‡Ÿ¯õ?´ëº”W¿>7Çà?Kˆu$–òã@ã7€„_`ÔMþŸ§kðEpö–±F—÷QÄ’žŠkõì%XSì%8â#ˆÂ<ö¥)׫R•°õ£u&ê,:hµuom{4›SŒ«–O…©O+PÁSUcŠÁK<§NxŠÕ>­Z0†2J¢Ã(b#%)ůl¥+IÆÛD‹öHý¬~7~Îz ‡Âé |U‰câk¯„ÞÓµâ½Ñ4téšÍµå­¿ˆ<7&¬þñC$Ju½#Po°é„:××ÿàžô¯Ûoã‘à»ï…úæ­ö­•Ãü'øeà­JËJѦÐïuû¿x¿HÖït¿Xx;ÀÚo†uë¿x©tßxƒL‡VÒ,|;àïx‡PÑ4:ñ)´6âin.>þÈ·Ï+Í<óþÓ¶òÍ4Ò±ye–Gý¥™ä–WfyË3¹,Ä’IžÂÿÆ&©i¦ø{á¯Á-/ÃÚF¸Ú¥‡þ5Á'ÃËà—Z ·7~$ñä?.¥Òu[»_;M>9ÑŒÒÉh©¤Þý¹–ã \p5aá#†ÃTU©Êsžy:jt Ô±•i9ʽÎŒbÒÖ\ÍÅFæ˜ê¹]Zt£‚ʾ©UW¥*•'Ó¤§†¦ÔñXx¸cfçø=q­Øx3^øµ¥Úx×Dðö±s{â1-“áŒoˆ4‰[ÄWgе]sþ'jÞÓôÿþexÇÄÏØøÅ>ðM®‘â%žÑï¼à¯h~#Ó®áîì/,5;;kx#½·uc*\Fú,šŠ,"v‚X}ÖêÒ ÔHï~þÉבÇ5ÍÄqÜþÔ‰x—â¾8ÐüBº/ó>Ÿ5uSðÿá ʹ ü# ã:Yýs__ê—:ÍÕÖ ºÏÃ/Ù‡í—^u®«myûS5¼™ek‹»#ûKEQ¤ÒN¯d`Hbf‘(2µÌÿai¾ ~ÈDöÇí5kœöÇüd§_Jt²U8)ahsrA6³©T‹j1NJR®¹•õæûV»ÖÅáñ9£MO"—?³¦¥(çtjÅÉF)ÉJXõÌ›»RûV»ÕŸµÿ°üÿÀ?¶‡À|Cð×Ä]#ዾ&|OÔ<-ö ïÙóÂôŸjú‡ÄÙ[Â~šmµ_øk[}ëNý¦åñe¤QjöW^ðŸÁ/Šš—Øñ~Ò¼¨Á®x÷öaÒþ x“TµñÃÏ øÒÖòo‡Þ!}{UÒôÙ­¼Aè:„ú¥Ä^#ÐÎâ;D·´Õ`¶Šm3UñµÕ£7‰>|‘ôÝs[±Ò$ñ×Ç4ø}§[Z^\+i±·øÑàeÔ|-¤\Þê0hzÌv:¤s‹½FÞê+©úý…¦¥ªÜ^j? díBòhí<ÛÍGöŸŠ{É„vVÑD%–Ú]åq1ÇE˜â$EPh§X*X)SÆC ‰«í“«ˆ§žÔ¯“Sª””œá¹^Òå”qŒZRqåÀWÊéS¥O•}w¾±í1pÏiâ#Uûh&ã:˜ºnÉ(.G:m:q”™¯ûx/Â_µ‡Ç‡_ücà©4›Ígâƒü¦êŸ ~ øwÇkmñ'P¿Õ£gâ‹=" ]ýóûuÁ5üEûþËw¿µ<^&ð«¥Áñzëá¨øiñ'öSðÇÃ/Ëg/Ç?Ú¿àž—ªxs^_xžßÆ7)7ì­¨xßT€øwÃGàO‰_¼ClìÚ¬úm¯æõß‹4[EÓü)ðÓà†“ ë#Ä ¯ØxGãt‡µÃ¦èÏ4ñ ÅÐüfÕÃ/ G<Ú—…OxKíú´ÓAënícWu7VŽ8u_†?²¶¥.dŠ-Cöª7‘Ç!R¥ãKŸÚjUG*J–@­´‘œV4#‚…|TëÇ ^Z–œs¹JX<:§O8{HÆ–*ž#’”ôÄk$×)xzÙl18ÉârÈâhU­Nx QÏ)JX *¥N•L$é¼\cOO\³¨šÅòóÆQ•8üóà¯Ä?i>Ö< ðÎÎÇÅ7#C{ý+ÀþÑo´éõ%kK=N-WM±‚îÉ4ÛÉ­õ ‰£gQom*ÍÍ»Km7ôiàø#«ñÇÀ~ñ—ÁC}àø¼WðÄß4ï |eý–~éºÄßí¯~ h~êz‡‰¾+x>óFÔ~=x‡âçöO‚|@©ã­/Tµð­Çˆôí_[¿Öu/ø?ðÇP²›JÓ5Kÿ ü$ý›ôíZßJÔš-GÀìü[âë f±5 ÍÃÍñËÅ¿Úvú{ÝJU|9«ImÉv–ë%ºÏ[=÷ˆç”Ýk¿ ¿gÖîRÎçTmsö˜:·5ül׿hÖ4Xÿh­4­T_Ü\_]iãGÒΩÜ]ªiÚ|¡àBPÀ¬d*òa¥„xyB8WžN3†"3‹©_ت®2„éÊ”=§3p•>UÍv¥[-þÐ…ì®|ÂÊÁ<öœeOu1‚Æ:u!R”éÓöŽnP•;(.~i|™wñ“]Ó¯®´ÝKá§ÂË û¹¬¯ìo>xZÖöÊîÖf‚êÒêÖ}!'·º·™$†x&e†TxäEu*?iaØÂß¶OÃ/x§ÂÚoŠüâ‹/~ÍÖјe¯üZð<7´/íð»à.»q¹}ãòÛLøyŠ5ŸˆÍà}?IÓ¤Óü >%Ôügy ÀÒ´ÿÎæÑtÉ$iàßì‰,Ò;Hîß´Ý»É$ŒÛ™Ù›ö•,ÎìI%‰fbI$äÖ¦›¯xöXµ}sÀ>ǧkךvŒ>;ŸÛi––zn‹'ƒÚÛãWƒGˆü#¦éɦZâh§Žáš/ßm®´p2­†•á©Q¦êKFYÜ¡,D9b©ÂI{OgQÆsmÃ’1Ѿk7ˆ­–σ–+TpôåVxÌ4³Êt勇$U(S§ dãWÙVq©79SäŒnœœù\¿¶m§†ÿf?ŒÞ0øàgáŸÆX>xÇÅ^ñ‹5Ù»Aø\ðøÇÃóiÚgˆ´X¼-©j>*¹éwvÂí&ÔÔ]³´e€ÛýüÓáW„ÿmÿÚWáÏÁ_éþ ðZω¬m­¼KáÿxsÈêV׺iÒ®t%—HÓ¼Eª_ê×Z#hV:Œ¯ 2[_\}IQô}K‡¼Òtû«.n~~ÉW3Ϫj³O5Ïí9¦[‰ ÒZišâOÚYžk‰Irì\m‰ß>`'6'ñ.¢ÛxGágÀ­?NÔu+…ÖmüñšÓÄ^ÔþÏ¡k"(•ñ/À§…þ~Ìö> Ó¼eá«ý#PðgÇû?ø·M¾³Ö,î-õ/ èMñ÷Ä?ÚúþŸ$ky¤X®ƒ¬Iq¨CoZeô…m䙼«ØÔPÃáéÏÙÍBO:”crû²•_j圧Ë'œµiq9'Õê(䎕Oe5 ’ΨÆ0’‡»9ÕXç8¤õ•E J6r´™ûóñþñà¯ücøc¬øWQñ7‰´>+ø‹â/ižý›~øãÆðœ^ýžþ$]üCÔEî¿'ˆ2ñ‡ÄÚÂÚwÃh>Ö>#Zé~þS?ßøŽo5=káßìöÚüÿþ Ëu©x£ö>ñuçö—Šõ û›ïh0þÐ~:µ­LcÕuí,h:&Í^Y¼í&Êt6Ðø)Ðô—bÍðgöBvv,Å¿i»fff9$ŸøiL’Ç$’I$žiaÿ²£F’«‡¡R§³‚Eʪœ”cy©Ê¬\Ôß=“–ŽÛ ˆÉ#† ªä²«SØÓ窳Êuã9rÆóU*ca)©;ÉMÆ.j׊>c?u/ú'ÿûÍ3ð—Oø•÷þ•³¡ülÔe¾™?áøF˜Ò5÷Ê|3ð—ü³Ðuœi‹•r»XgH#y·Ñ­eŸRŠãöxý›4¨tÛ›kQ¨k¿µJÕdº²‡Q‰ü=«k?´ Ž›â[acsks-燮µK8êÐOq]@²liº‘ö‰qðköE_ø—êÙ1~ÒöÎŲ¯w)ö”â6\¬¯ÀH‹»ªHíÃO%Ž"‹ú®¢U);C:v•å %ÏJ¼Ú¼l½Õ)/åºHÚX¾ä“Y”yN9ÆI§Ö°Ì%Ñì®Õ¶¾†¿ì3àï þØ?´¿Â;Ò¼à=?Ç_þønhßü; †gñGŒôOÿjx»M†ãÃöºï‚ì?á#Ljô‹­OM’êÛIŽ;mgJFº’oÕ¯Ûþ yáßÙ«öYøÍûFø_Å~ñÕÿÉ~ßOðþçà¯ÁÍ'Tøs¦øÛá_ìñ ëJø«.¡«éw3kÚÏíSsàxSÃz|~)þØøoy{oðçUѯü[©|4üŒø‡A¸Ò?á øYðK]W]Óô}hxãU¯Šmµ6ò+±?†üqt¿¼R|9àVæ:æ²÷>··KXž_éæ$z½=²\­Ú]|)ý”g[éÒâù'ý©VE»¹ˆ0Ž{µ“ö˜a<ñ`’JÐ3eÉÏ`c‹ÄN¬pÕ0ÓT~­‡YäÜðÊ7ö¾Ò—µQƒ©;Î/šni;òÚÇ%:¹bÆâªVË=¶Qì&g°sÂr§íÔèýqBÚ§ï#iÔö‘^÷'Â|ˤüfú••–³ðÛáµæ“us ¾¥k¢ü9ðŶ¯qc4‹Ü:]ŵµÄ„<‹g47Ëɉã–6‡õ¯©ÿÁ¼ñÖÄ|Wð'Å…ðÖ£ñ ¾%|NÔ4}GöMðWÆ=BèC®|cÕ5­Òå¾$x?V“Vðµ×ÃuѼEª]ßêÝø‹âƒtäøF)!†óù¸·Ó Œ©yáÌzå©L¾ý¡í5­vBÞZM£èíûAêëªj‘\,rXiçIÔþÙt±[ÿgÞ¼žáñ×VñUÇÇ‹·ºß€¾ͪŸ‰ßÑu~Ñ-àŸ^Ù?‹ukw¬øj^þǹÔ,­¬'’øG4†ºŽ;[Éí^G¾U\ó?°XJêT^}(ÊU]Z•>®«8¸ÂÑu[ºrå³Ñž¬käÿTÅN97î| e‡yì!9Uöxç ÞÂ8¹Rq„9àêJ¢•åe /y|uñ«ÄÚçÁoŒŸ¾ßx{à/Šï~|LñçÃKÏx[áß…®ü3âK¯ø§UðµÆ¿áÛ©´x¦¹Ðµ™´§Ôt‹‰bŽY´û›y˜¨ýý…ÿeÿþÖø»âÛÏ_ø;Äø3ñ#â=Þ¿¦|ð·Œ~èگ‡¿<_§[jzΣa£øÏÇø^ÏH{[ÖÒm6g†5 ZßNRÕ^ËIHš;H¤×,Àóºq+S,ÅQÂSÃá1U*áÕ TóÊ´áB¢ö‘Œœ”嬓JKšN>Î1”dÚŒ}|®¥ RÀå_RÆÎ”ã†ÅÏ<§Nz²«‡Q¨êGRME´ùy¨Ò¥Ê3›_±µü×ÀÿtïÛfëJñêÒþÌŸ<ñ·@ºÖ?f†–ž‚ÿ_Öu=ûáŸÄEyociã_A¥Çâ é’ÅàýFkº6© iŸ/üýÿ:–o ݸ¸øoð†êݧ„Mlß ü5 Ϙ¾d--•­äk*nF{[«{„ º â•REú–xÚçíßiø[û*Lu3ký¨³~ÔâSö}Œ_ý¦_í_cØ·æ }«ä•ÀªVú¸…¬¾ ~ȳ]ùˆmbƒö²¼šK€ÃÉH­ö.diª[´ ˜„1H©ŸøITÜ~­AÉBÜÏ8i9(Å]·_ÝW[Û§3×C³ë9i8¼ŠNj¹žsA'%®g7¼UÓnVèäÕäÑúqð'þ ·gñoà·Áü,ømñÅpø³ö›ñwÀ_hS~͵­/ÃÁíwâôÿSâÇ‹GÛmÿ×södÿ‘WöKÿ³P?úü¯¤RÃK ‚ú­8R¥Ž.ÅÏ¥58¹OžnJMGÙÂRŒmtîÚ_¢pµLL.!àpIbd¥Iâ#‰n§²¢Üý¤jÖŠ¼\W*›·-쯯mñ‹þB¿?ì¦ø?ÿN _)ÿÁFÿäÁ|}ÿ`Oƒ?úœü>¯«>1ÈWáÇý”ßÿéÁ«å?ø(ßü˜/¿ì ðgÿSŸ‡ÕË/ޝøéé(ú·½/GùÀúCà‰ìÕû.Í+Ž/„ß²ì’;ª¨žørÌÌÄ€ ($’@œ×–|Iøgû-|\ñ%׈>"xTñ8™u!‡/>0xÍ<cwªxKVð5æ±¥ø"×ÅøWLÖÛÂúî­§Å«Øip_Û¾¡q}o§-ú(ÿG·Ž-jÉÄÛ˜2É'”‘î1‰¯:<¼°ç»“zµd•>Ý×§ÞUQ¨¯)5¤RõZÿŸ‘÷v½û~ÎÞ)ø¿‰u¯xr‚öºWŒcáâOY¾©âü<Ó¾kºæ­©Ý|T¾ðÖŸ5LJm®Þêó ðψumEìoum~îkkÖÔý«â‡ìçûüaÔšß•/O/øÿ@ð·>ÐÝ ÿàÖÃÿ’(ÿ…¹ðëþ†íÿ¶ü‘_Í—ü$GþzÌñTÂDç¡üÇÿSõùϨÿàRòÿ'÷ùõHÿ<¾åýwþ–¿Òoü-χ_ô7h?ø5°ÿäŠ?án|:ÿ¡»AÿÁ­‡ÿ$Wóeÿ ÿž‡óüUð‘ùè1ÿÅQõùϨÿàRòÿ'÷ùÕ#üòû—õßúZÿI¿ð·>ÐÝ ÿàÖÃÿ’(ÿ…¹ðëþ†íÿ¶ü‘_Í—ü$GþzÌñTÂDç¡üÇÿG×åÿ>£ÿKËüŸßäTóËî_×éký&ÿÂÜøuÿCvƒÿƒ[þH£þçïú´üØòE6_ð‘ùè1ÿÅQÿ ÿž‡óüU_—üúþ//ò}R?Ï/¹]ÿ¥¯ô›ÿ sá×ý Úþ l?ù"ø[Ÿ¿ènÐðkaÿÉüÙÂDç¡üÇÿGü$GþzÌñT}~_óê?ø¼¿ÉýþAõHÿ<¾åýwþ–¿Ðwįx[Äþø­‰®iZ”Éðsâø-/í.g ý‹;3´PÊòy``<…vu‚ࡼ}¥ia5,i¶ &1gn;×?å_²Þ­öíWãT!‰ÇìåñbL?†ÇL\õ?Þö=«úñÿÜÔÿÝ“ù îÃÔöôå7ŸÃmö^y„éû*”Ô[wm¾—»<öl~|5 0ƒ `©¨€z«èÇΫÿaKÿFZ×Ïÿ³oü¿†ßö—ÿNº}àY;­X£º1Ô50J3)Ç™hpH ‘3œ €qœ ëÂÿ=ØiÛà9ëí?Eù#á?ø*¯Â‹Ÿ¾| ð¯Á_x¿Ç~.Ð?m?Ø×âü^Ö~è#ð¯ƒ>|~ðoÄ¿ø×MÕ>%kO† ¿Ð|5á}Gû&7‹Z¸¹×.ôËfе ¯¼ŸÉïÛ_öFÿ‚ž~Ò?±0ðV«à+¿‹6þý¡þ=|@øyðOÆŸ¼= |tŸÃ‘þÔ–—?²¡ãŸ ?Åž ñí‡ÂÏÙ®oøsÄßì5»¿ë>ñ^©¯ø·Ä>°ÒouÿmoÚâOØãáÇÉ×Þ_ø{Åß´‡ìõð/Åjþ+Ô¼9yáã¿ÄýátŸ4»]7Áþ3¸ñ}÷ƒuiÚ¼¾ Xt3ë uItïˆ×~ðÕÞ›¨Zßi>1ðþ³©j‘X*Ö gI¹šhì_ѯþß_³?þ/Cû=h/uŽ«âŸø3Tøm¦øâÝÆ¥¥k>ð¿ƒü_ânîö÷Àm­§Âã¡øóÂWžøÏªÿe|-ø„5Û _ø«\Ôžm>8øSûqxóâÀÚ·ã­ŸÁXì?goŒÿµÂ/ xKJø¼5|LOÙs⟎~x£ÄšÍιà è__ŸÁþ•¤[êž‚Ò]4x5é<3«"€|ûèŸüSàÏø(Σû=êsxWSñ‡ü×âwŠ< â_íÍ áÆ›¯ø%¾~Ïz}æ­ kÞ7ýœÿióF¼¾Óu §¶øU}õÝ…å½§ˆ4™­g‘¿E|¤|RÐüðçMøÍ­ÿÂCñ gĬêßð”xwÆ?h†k/M¥/ü$>øû9hwžF”öplµøGáÆ´òþËss®ÜC.»¨ù¯ÀŸÛ†ÇÇÞý£µ¿:ƒðEÿgÚƒÅ_³&»>›ñYø‘áÏjÞðwÿÚx—MÖn~|?Õm!Õàøƒ€Ñî|2Ïeq¥M)Ô®£ºA¼Gãï üL²ð7Œ<¯Ûø›ÃzŽ«¬Åa«Ú}§ì÷Xhþ(°¼HÅÜPL 7–óÀùAxØ©+‚pÄþß§ÿ¥ÄÖÆ½Ëÿùøsþ·ßú‹xŽ¿„ŒŸðR?†¿>!üEø7©~Êÿþ"k>ý«>?êÇâ/„4ÏêzW†®¼K®~ÚVº_Æ¿\jº†©?Æÿ·íðïÂðè2Ÿ Imiû8xZ+O‹v¶§ø3û·¿ÿ‡?ì+}ÿ¨·ˆëüì¿hoø$Ä¿Œ~9|qðÆ­á(¼/ã¯Ú?öÖuXõ6ѵŸxcÃþ0ý«õøÊçFѾksé¶Z·ì­ñ›LÒü7£êšŽ¿wŸá{£n‘ø‡u—ÏÖ¨¨Ô£Z„kÖÇ%V°ô ªFXY:RÄUœ\é¤éÎxÅó_÷’I;Øù^'¯Ãæ9U\¶›¯Žú¶aMPú»¯†•L ­QòÖ á(NcÌù¹ä¹[Õ~þܶ^3ý©?kÿÚ+ö‡ø{ðÄ¿ <ñ‡â¯Š2Ðâ/üoþ.¾¨ý¨ü)¥þÉ´?ÅÿÙ³â7„µ]KÆß|q«øÄ:—†~.k·¾Ôot©P.¡£ÜÞøSO½’ÂúÚXn –6—q¤‚+›xgGEðOø[Ÿ ¿èEñ—þ-SÛþ çò÷­;9i?ìêû-éáÓéÑãO}]4Üò–cÆM'ý™BÍ'®)ê•îžlš{èÒ¶Þœ—ü3ÇÆOú/«Joû6’ƒƒ»ú—½Ë(FWTçš.vOݳ\ÉÁûÉ£úgø=ÿBøIàÙßö_ð ~Í?~)Üü8×|QysñcÁú/€g³…®|ûbxeü{á(õODñ’øáïi¯‡>ñ­®µð“ÆË¡þÌþÕ|%ñ“EÕ/|¬xùæý¬|+ñã÷í?ûBürðwÁŸx/¾3|Hø“á¿ _iž†÷Ãz'Œ¼[ªøƒLѯ!ðv‹á¯ Gu§ÙßÅmq‡´ +HI£u²´H–û›á—ì)£øãÀÿ³MÞñkÀº‹|wý®_ö6M{Ä^;øÉáÛŸ |dÖü5áèöÞ.Ñ´ŸƒÞ#ŠÃJ»¶ñN‡ i’øcUñ¥œÚ•Ä–«ªh¶—Ú”>üõø‹â|5øƒã¯‡Zǃ¼M{«xÆ^&ðN«{¦üTÖŸN»Ô|-­ßhW×6sá›k–³žêÂYmZ{x&h °Å&äYÂcq±Âàéåø\V#G„¥„¯SF”ªá©aèÓ£RQ–"•¤éÅ6”"ïw˹ÓãxŽŽ]ƒ¡•àU|ºŽ<zø/gR¾ ±ÂÖñø{Ô©C–rýÕ)6Ût¡±ú ÿÂø›¤þÇŸ,¼añ~O‰ªxrOƾøeðsDð~³â«éÅç‡t+-KÅw‹¼gà›mGÀZ•âÏм'¥ø“OÖ|Oaáû=^±Ôþø—Å–÷‰ák ‰üIâ Jü:ð§ÃÝ—wZ'‚>ü;øàïiZ…<=káÍ)¼k¬øæò]í"Òu»ß?ý¾øö¼ø‡¡øOBñ}ÇÃW_mCÃöZG¼Yñ.ÿÃöú½”QøŠOjÞ'ð/ÃoOáÿ i¾´ñ&¥â›ïéº7„üáÿ xƒÇ^&ñ¶›§ØÛè×ýíkû)Þ~Ç_ g¯Š_ìÄz_íák/xRüFø›«i6Z·á? øç×gÇ÷Ÿ ô߆ÚôúÇ…|c£jRi>ñn©¯ér¾­¤Zé×z^¥¨s`±xÊU1‹ …ÅÖLdêbÔ°´iÆŽ*P‡=8Kë1ŒãqƒŒÔ¦¤ä½ëµ°Þ ¥[°8?mR®:u1ʦÂq²§MT£NkN§q§(Ïž­ÛW«'%ñ¿Á_†Þ8økãÍ/ž4M[á¾bd´›Åwºl7gI¾ÖèÚN£g¥ÜÝÚ&³£ê·öZå¾”³Gö±¦?Ú&³±Žîþ×úø»ûp~Ì3ýŸ¾-ü9Ö?do‹¿~+x«ösø;ðWž,ñçìÅû6x6ÓBñ—Âoاǟ²äþ8Ò|qᯊ>=ñ7‚ôcâίðÓö“Ó|;à8éÚN¯ðŸLðm¡ž/^x²Çù÷øo?~4øÇDøu¤Ùø·Á·ˆoí ³ñ ×µMfÊÆ(.`ºÕ$½Ó—E‚iíÓF‹R“ýhîc–8å…nÝŸwúýûPÿÁ >+~ÊþøŸñ?ÆšßÂkü)ý¾½{í ñ*×S—\ÐÖ5¶ ÃÞ.¹¶Ò­4‹¥Ô®´ˆ-e½ÒMÔw†eŠÆN•¯a1t(Ä«NT°¸z²–&éÏ FQX™Êœkb:S”bšRår‚“’¬ÛÄUpô?´°WíJ¥jÎXÊuéÔÀÑœ´+Nœ+c*U%AÚN›©KÍ}ÿNý¥~~Ú |áïÙ÷öñÁωðüQºø…âo¿Áïƒ_"ðö…¨jß5}OáÞ‹«ü.½ºÕ~"隌_þh®ø«O𜖶Ÿt-VßBûGŒ¯´ï þ9ü)ø]ã߇5Ó|mã=?Tð7…ü? ýί¯ßÚºÂ\ØÜiÑé« nnn_]¸¼‡DhíbžX¢Ô%¼–´µ¹xþüý©¿d] öRø?ñKÅ>1ð¿ŒuOþÔÿdO|=ðÄ‹–Úþƒñ‡áxþ}†›ªøÇá/…¼7ã]À龟ÄÚï‚õ]sKÓGҵÓÞj÷ÖºgÁ^ñÃωÄ ³Ó¼aà­OZI¢Ò¼I'޵M~ FÞ3wm ÎŽ4‹¾UhŒ¸¿²[9õu§k{)mç¬n3ˆÀâ¡Áâ°ø*˜zÔñu–„ªRú|µªF“ÅJR”)¹Ê+ÙO™ÆÊ½ž¸üwârìe<˰ùm\5zxúðÀþúŽTÜq5iÓ–>¤¥(Qu%öz×i%J¯Ã/è}à üñóágŒ£ý”~?þÐ>øqû0|@ýœSâÅ-á–…ñ‹Ã âO |]Ò¯µë^ñ‡Œ<%â­ ÆúïÄ-* _R—DÒþxA¶ðïÁ-HÑ®uÝ;ÅŸÌÇü3ׯ>ôø{â8âó·¢5›HÉýÊ…Á]åW¾ÅÜFBŒâ¿¡?Š_ðCÏÚ'áþâ söÿ¼w†¼;âMoQðæ™ûCxãNñJê>?ηáK3℺‡õMZÚ?‚Þ>û&ªu/BÕI’æÈj:tw‚«ñk᳃À¾2ùÈ\ÂÒÔÇÞ ÐzŸËÞ·¡ŽÍJ~#Ùû8(ÊT0ôåÉË7‹‹‹å»µ’LèÃf<\ðÔ2êN—±¦ ç‚T§È£é¼Ò.—ì´­d­ß÷£ö ý­> ~ÏŸcðŸÆÏ|Pý¢|<ßÿeßëŸüû=| ø›à}?Lý™Û⎙ñCáGˆ|Cñ⧇ï|QÆ~%µÊÏá­KÂþ xßSðØñö©}.ù9ûpøC_øáûKøëâ_Â…~-Ñ<¯é_`Ñô›Ï†>ø`öà èÕ½¿‚üâ¯énžºî™©2æïÆ~+ñ.¯§µ¶¯âÿj¾(¾Õ¯%õÏ ~ÌÞ Õg?ˆ¿´T<>Þøgñà…~ è¾+ñ÷Å'ÄžÓ¿iGñÍÏÃ+ýF/ü"ñ®èf‘ðûV¿×5¯êš—ˆ.EÚB¾ Óî-R ß/ý¯ü!áÏÙöšøÏû4xÓÃú‡ˆ¼Uð_Æwž×µßüSñ+øoUÔ4«kO:ûFm_Â:V¦Ö3‰D‘í:ÎäóæÁ òÌn2–]8,&.¶U^Æup´0ò©N.§4åIV§§?ŠÐ”ß#nVáʱÜIK BŽ[Uð4ãZ4kWË£†HûHµ)Acpë›ÞiKÙÓu-)8J\îìu¬þÌÿüã‰ø¯ÃPiŸü ã›/h>ð‡¼SñMøW¨¿Œƒm¢\}‹ûB~Ñß|û*þÚß³Ã?Ùâf“âoÚ'öªø{ûFøGãn§£èž×õÖ°ø‹ûBøûÄöß|+oã/C¤ê^ðÿÆmá€ôïxšç¾%ð÷„£ñþ±¥ø3ÅWz¾•â€?fÏ|;ý§~'x+À¶!¼ø]¨ë¾4ðç€ìãñ¯)×|9â™ì>Öðxg]]­¥„’xbÒÞÿÄ0}ûS~ÆZïì•ð¯@øÅñ_kñþ!øÁ¶~øñã™|Uâkß…¾"üñÆ¡a¡ëß t(~Çáÿˆ_ <]¥_@u&ÔÅ­­¦µmcs¡ß[joŽŒ§ŠÌ Š«ˆ­ˆ¥S0„°Ô! >)apô¡F>²•HËO Züõ9]gïE¹S§X1Ÿàî¯ +¯Øx÷U‡PøM­Ià½vÇAðO‰4-CáG€4+_ Ýx›ö|øÏâŸüa¿ñgóáßxÇÚ½—ƒt¿ øÏCÕüC#iz.¦¿¯ïŶµwE£‰,æÑm¡¸†}MímfŽK«T1Lì×v ãý~Òÿà•Z÷‰¾ é?>üOøA⿃óx|y¨øßľ3øéÚ§ˆ|à½W\Õt¿|¶žÇI°ñwÄŸ èÚž¨ÀhÚ}ÔúÅäZ…ï„ü=â²<^5fjªÂc>x8Ó„ èà Ò:ŸXX‹Fu*J´}œªÙ¨)rEÚSOÄk8U– ùœð1¥V„rå*ÁƳ¯±Ï’¤ê¼D'ˆ’”a{(4§Sðñ?gŸŒ”ÿÂâ!†?an0AÏ ž=¹¯ÙÙçö‡Ó¾þÊ~êšGÅ?ˆ¾'øŸá|7†ûÁþðü#ðçÅÞñ|UâOø[ƾ&³Ñ5íᶦÚDž¼Smâ¹mÖÃá÷Ä_—xÏÄúÿä ø·ðÕˆ_øA¼e†àÿÅÑÕ;àÐÞ¿I¿eoØN?Ú¿ÂÞ-Ö>ø×HÕü[¦Ý|=Õì¾øÓâÄ êø{â—Äü)Ьãñ—Ã[ÁS6‹ñÄ÷Z<ú†¡âM;Vñ iz…凅l,,¬ï5—ŠÅceŠÀTÄa1tñêÕx*TðÔ'õeEª©Qb¥ìã 2©4›„dÒ¼Ÿ/+xÌoË–UÅàý–.ZÏ.¥K¯Zt:Ñ­8ãêÊœa‡•YÆõ(ÆRŠnsqP~uÿ0º¸ý­¿hÝOã×Á߇ß-4Oøsá¶“­hß~x;À:–—â/†¾ü"ÔgÓtß|@ñæ‰w¤ø‘ü<[ ±Ë ¾™>»sáôÒnaÑãÖõJŸðMï]þÆÿ´§ÃÿŒ|«kzFâ½.óNð‡G]sÄ·šUž«q«øbÛ^•4«¯øvÂ;˜toçÓ"ŸZ×,RÛ\ÒoWiÍ~Ù ôOØÏã·ð'Æú½âMÃ3Ãq>¹£ø¿â†¬/¢Ö<=á­b/±ÙüBømá föÊ¿dµÖtë ÿ k­¨x{\մ똮/Ùàž‘ûo|oðOÁ‡ÇXðW‰õ½n+f%ø‹®É Þéw€–ïQÔì|/¨ipizªhñJl4­^úþ=PÃmc†kÛnœó­‡qÌ0xº8g€›<% Õ=¥5…ž*Œ«ÊRUkB”%û½#'%8ÛÚÆs²Ò¼M¦jZùωî_H‚ÞKølmßíz„ðGef’ÝÜAþ~а†û:|)ý þ$øŸâ7‚5ÍKörñ—ÂøÇÀÄ?6ºÞ§sñûHÒüaðxx{Ä!ø;¢xUÖüeðÖï[ø”<%aâk¿h~ð_Œf׬´ûÍ!-nÿ?~ üGøU®üZøe£ßh^1ð½¶§ãÿØIâcñVÕSæó_ÓíãצÒcÐV]^ÛG–EÔ.´ˆ$‚ãT¶¶–ÂÞêÒk˜îbSÆæ•(USÀbaJP”g/«ÐsŒy#ÌãJxµÎÔ[qŽªOÝîŽÊ™TÃVU2èB‹¥8Ô“À~ò0ä\Î4§™~ñ¨¹Z<²Œšå÷µGô-ã/Û½> |cø5âoIûOøïâ/ì½âOÛFßZÕ¼)ðŸá‡Ã¿‡´ ü]øƒcñ£àæ‹âxkã-ç‰õ?†žøÑðÛá3üH±×|!‰þ#ø:ß_oØZêêžñóâ‚ßüQâ oÄúß‚5û­gÄZÎ¥¯j÷Qé0Ú%Ƨ«ÞϨßΖ¶‹­²Íuq4‹ok 6ð«áŠ8ÕP~Üü]ÿ‚}j^1ñí÷Äoø×á·Š~üG½ý¨>*xƒâw‰~9xçá§…¾xSà—Çß|ñ¿ˆ¾(¿‹¾é‡ÃQ_|SøÁà½ÚËÃ)ãM#ÃÖú冭âi<+¡jþ.‡ñ¯Tø™ðÛKÕ5--¼#â;öÓµ ½=¯´¯‹š…þ—|m.$¶7zmô~ yarcó¬î£.-ž9—àQ…Ææ«F4p‰R8Fœ§‡ÃÑ“„cź_[³m&ùI](û¶0âÕ…¡u9QF”ª`#Br§Æ1”©iSTÜ•ß"Œb´åJ6?Sÿc/Œ~ ø)ðGöø_ñ2×â¯o>%ü‡àï¾ü#øMñüã¾4üøó¦øóÄÞ$ñ÷Ä/_éÑÝø_ᜟî¼§è^"ÑeòÓ_ñDW¾³ð•ÿÿMø½¨~Þÿµ}¯Ç/„Ÿ¾%|=ð½ŸÂ=oÁ²é~1Ñü+c­ßjRø¯â÷ ™âð­Î§´ÑthžÓÛRñ±›O BžÓþ|:_|øwÅþ̲F‰ûJø[â‹|ãÍKÔüðëCøÁ/€ü{ñ âN‘©Yü:½øÅð—ö}¿ÖtÝcà |S£j¶v¿¾+A —÷úF½§hÚ Ìº~ƒâE»‚ýùoÚóö{ñGì%ñ> üwøu9ñE÷ƒü]â}'PðÇ-GÄžÕ´Ï ø¯âwÂÍgy'…4ËøgÐ~&ü)øáˆõ 2Áç¿ðÌš¶•ý£áÍCEÖµ7‘âñô§‡Ž‹­McgQÊ®… ¼LñR©ˆ¦©Æ¼U©â%V”yiÊñ‚iÕN3—&WâJ8:”ò쯇U±u%:Ùt0ÓúÕZõ*c)¨GB6¥‹•zPq§/r|õ´©>wö¹Õÿe?ÚcáWÆŠþŸRð¿…>"ü?Õ$øw¬Å¥ÅÅÉt_è~(Ÿáz.³Þ™5Òü=©x~ëTÖlgðî™ý¡ km70Eqú1û^þßÿ¾4|"ýª¾ü(øUñïIÒ¿h+öYðÚxêÃÃøbóÃßþü0Ñþ;üfñ‡t}{\Ž?¿þ%üø=ª]ë7w^0Ôü=àý'ÄVŸÅ÷‰|Kˆÿ#~§Â¿Œ~.Òü=}¨kÿ ¬m5-"÷Vñ»ãëšÚ+ê6Úmö™¨Åá¯k¾"ÒÒæãR±—ûEÐ|^Óõí&þçÃÚç…­ìõ [«ÜZàÐ!·ž9eÖfy&‰zdh÷¾XÁÞ¤äMÑ~×?>øßá5—Ž.?kÏø£öeý©lÿ‹–~5ø/ð3à΃¤xÞÏãÖƒð·ÁZɼdŸ|3㉼9à‹Ï…Z•¿‹üGö_ |Bñ®â=CÂz—RÐj—_Í}‡Äï…z¥í¾Ÿáh–W“Gms¬§Ä­Ví´¨&uŠMHZ/‡™î’1º6È Î#0¨ËŠýÓ¿ÿ‚]xƒö†Õ¼}ñkàŸÄ†ž9Òõ¯‹¢×âñÄÿŒŸõMXðµâoøÆÌØ^ü¾Ò®ÛDÒ4ûÛÛ¨¼5ªëº]´_Ùö6zÖ«ªÞ=¤3S™,ÏRX_Ö>©^§TÝ'Wç)b–%ÎN)*.¢‹O›‘É)G׎;ŠU MI`Åûl:tã—Æt] C*µ%ˆŽa'ƤiÅBUa6ù$ÚkñãW‰¿~2üZñ÷‡þøµtüMñç‹ôAàï ø:ùtø«UÖtÑyá/ðg…®Åìiðç„|1¢M¿Lðú®“khìOüGö·ð§ìeð‹ãÃ_‰? ¼_ñoÅ~0ðÐÒî´Ÿ xsÀ~,½ð%¯ˆþ~Ð^Òü ã Æú¾™a¬xÅz¯Å? üa×-­§ÖôØÒæ{y#•þ ý›ÿgþÑ^ø³ãøïNðÓü?ø'ãÏŽ÷þ ñ÷¾%X^Xø;àÕŒ²üGCÕ¼%ð¿Å¶>"½ž;Ý\†=V_ 6“c¨Ç¥ØGâëÑ}q¦¹ûj|ºýƒþ+?Á_ŒÚF«üB´‚êMwFøyñÛÄÞ >¸µºû!³ÖΩàK—|Üi·¶0ß镲JÖZ”òÛÝEoàÞ½øañ/Å¿ðŒÈ›¢|?ñ…Þ¥ðNÖÛľ2ø‰àÿ|=ÒþþþÖ×>5~Ó?þ.|ýœõƒ ~$üYñÏ>|(³±±[_‡Þñˆ/µ-ÂÐŤÃk¥ÀšNŸ<6ßeÓ O´*m¬‹ÛE·ê¿Â/ø#çÄŸ‰~|QðÇŒü#â|H–wmc[ø›ñÚÌz<£ö¯º³×åðµ—ÃÍn^kŸØ÷â÷„l|7¦ëÚÞ­}«i¾Õe’ÆÃÆI‡ùoûBØxsönøëñ{öñŸ…õM_ÅŸ~"ø·á¯ˆõ_ ü]×/ü9©kÖ®ôKûíò÷šu寙sqg$Ör]XYܘYöÐ˺5ãË1˜ÊX%» ‹Ä`)aéSÁâ*a©Q•|,#ѬÔñ¬êS´íËïw{.,£Ä4²ü)Áýg,¡†¥O/ÄWÀ:S¯‚‚ŒpÕ¦åŽÃ§:´Tj;Q¤åÍÍ쩦¢¾øÿ‚l|fð¿ì›Å%øãwâ¹<­èÖ>øGá·Žæßý†Éþ*xSâ‹ü+câ?øR'Xñ‡‚f½Ô¼1âxËEÿ…“á_x#MÔ<-âžWþ ]ñ¾çöÔðgìuáφ³§Äχ÷¿³ÏÁ«?‡þ/ŸÄš/­-µJ/|(ð°Ó<4|k ÜxwLÔþëºý”‘Aà ™Ö¯|àxßâ,šÞ·àé#ºñmµ§Š|'ðãÄöZ|V&­á^îëÅ­áÍ"ÎÏTº6Z®·©Z¶‘+ûU|ñ'ìycð#Vø»ðïW:?íð‹AøÕðÓUð÷Å\ZÜøWÄÛÝ[éºÌzï€|?{£x·O²¾Ò¯õ¯\Zµî•g­h³Ü•MJßq€Åci¼RÁàñ•£,f"¥gW ‡£É‰«5 Õ5øCYÒ´»m_J7×vÞTyðßZü–$y—Åq‚îFký“?fOùd¿û5ÿ¨ßÁÿ?|Cð†µàZ×Að¯‰ômFmCO‚=N÷Çú†± q<7muštšUš\Åsm¶î¯:iL8MþÅŸ³'üŠ¿²_ýšÿÔoà}jتØ|¾xº0õU”aR0骉ÆK’S‹\ÎJêOmÙ÷Ùlξ¼³ZÃâiF0„=št½78ªø…w'5uUè¬Òiß¶øÅÿ!_‡öS|ÿ§¯”ÿà£ò`¾>ÿ°'ÁŸýN~WÕŸ¿ä+ðãþÊoƒÿôàÕòŸüoþLÇßöø3ÿ©ÏÃêó¥ñÕÿ/ý%F÷¥èÿ8áðÁ¶þÇÿû¿¿g†ÿ¾|à#_Ï—‡ÿh ôGàèü9§]^ZCñ×Lñ ºú\YÚüMÐ4Ï øŠ)4Øäm“¦ºiÒÈ©%µÍä—ç˜`Xÿ¡…$Ùö~$£àWìé@ øC¼AÀ#Œ=q_ƒÃÁ·ïᘼg‚ãŸÂÒ]ߨn×Gµº±¶ºÓœ/þKxåm4!Õôô†[õ¶ŠéîZ<ïâ>\sšpp¿Û½•ô^Éëåvo„IÅß²·®Ÿ¥û6ß´”:&©ðó_ðŸƒmtMá‡oô/ j7zõÞµ77:ε¯ÙëwÚÛ[]_iz¯ˆõyííîDÚtêöPÞÚ\Gk"ÝU×þ6øOÄ:_…ž÷÷âûGñÇŽ¼OªøzÚðÛèwvž0ƒAEˆ¥¾½Ömæ´Õ´yfk+&á ¥Â ÕYã`ýf«à CFÓíõ[Ÿ hWšmȾ }¡Oá[[>›¥Ö¡¡/‡/5UÒî,­ïì纷ԤðCsÉ«RÃðçT–ßEº“ÃÓâñ­¨èzHÖîü) ÜM¨iVv—÷ësi­_Ø]iÖZßY?ö–¥ ¦›4—0[Áy-Ä‹àæªÓ‹W‹Qºi[NDŸ­”SòíÓ«’žŽêéÛ}¯míÞîý®ßkyÆ£ñåäø¥{ñ_CÑB×.¼mŽa³]bîúÆÛQ–îïQÕ-T¼V×/m}teÄ©>Ÿn†Þ)f2…ÜŸãæ•ªXxºÝ6ûM7? ¬~xCN³k)1øÎËÅ—WÞ!×õMFÚýäGŽý-šßN½Ü—6–+•¥„nú—~’ËÅW~ŸÂúqñM޽sá‹"ÚËK½—ûrÖýôÉ´øf³ûE¥Ë­üOOkq-´ÄoŠi!es«7ÃëÈ“Ä.º'ƒ®Óº=¶»®¶›®xUº]Ö¥’—3V»„±jVÖ÷–za¼¾Óüèå¿¶¶Ä¦Tª+üM]Ý4Ú»ZüÖöò¾ÈnºÛEY·§»oÑ}þ§ËŸð‘7÷ÿñáþ4ÂDßßÿLJø×¶nпè¤ÿàºÏÿQ»Bÿ V“ÿ‚ë?þ5Y–xŸü$Mýÿüxð‘7÷ÿñáþ5í›´/úi?ø.³ÿãTnпè¤ÿàºÏÿP‰ÿÂDßßÿLJøÑÿ ÿã^Ù»Bÿ V“ÿ‚ë?þ5Fí þZOþ ¬ÿøÕxŸü$Mýÿüxð‘7÷ÿñáþ5í›´/úi?ø.³ÿãTnпè¤ÿàºÏÿP‰ÿÂDßßÿLJøÑÿ ÿã^Ù»Bÿ V“ÿ‚ë?þ5Fí þZOþ ¬ÿøÕzÿìU«ß|n„¶qû2ü^“³÷m´eãŸFú~uý(øÿîjîÉü…>¿²«i‡VøÖ,ì¬må³Åœ½µ¼6ZfW|Q«mÎÜØ$.A*1û•ñÅ3ÿÂ[«h?ÚÚ*ij†žáþÓ!ì㜧ÏñN-ygÞ¸ð˜FT%¤ñm»cÒÃÉ·Õþ7GtÝj~M·÷Ó8/Ù·þH_ÃoûKÿ§]F¾‚ð(Su«nmƒûCRÁÁl·›f1€8$çÚ¾}ý›Hþdãþ$Rÿé×Q¯ <ÿ:¯ý„u/ýi^†Z}ãý°â¯´ý?Dy×íCû.øö±ðOƒ¼ãï|@ð¶‰à¿Œ þ7Ø]|8Õôßk—¾-ø1âûxÖïYÔ4 vúÇH´ñ†‘¢k·OáÉ4~kÎÞß_µ°—Q´¾ðmkþ µðsXýŸ|iû8GñG㾉àÏŠþ(ý¤|QñÃWм[á{?ün—ö¹»ñ®¡ûAi>>³›ÀW^µÒ~Óô¯øáþ—àÿøFý§~/xÛâ·ŠüqyãWâ÷„Føû`~Ö>/ý¸“à?‹tTðŸìÍgâˆxkâu×ÀÿÁyâŸè¿~ëW±Ô×wóB¾Õ~\ø“_ñÿíS¬Çÿ çãÁuøaàNñÏ‚üWrø³ ãVý…ÿà¤.ñ_‹¾%?ˆ5/Ûþ gáȼQ£øÿât>5±‹À_µGÆ |(ð÷„5 k©âYhQYè>Ñ4oM¦ÚeG-´ša–Ü€~›ü#ý–´_ƒ ¿g/ƒøÁñšþÌøwGðq¾Ö¼c¨x·Àþð¯ðëÂ_ þ&7…¼á½7ž ðö…¨é—V±¦™¦x†ÿ^ðŸ†5ÝwÄ:µý®£.©çš×üçà»ûVÙþ××—þ;OˆV¾8ðŸÅI¼/o®X'€5оø1ãOÙ뿯lß@“Å©«i?ü{¯øDx~ÃÆV^½/iâ GÁ×~(·:Ûøçìwñ?Æ-ûÁ-WWø‡â Åþ(øsð#áçÅû|ø¡ñÆž9ñžƒû1kw>=ð?Š|Gú}ßÁYøóÃë¾ ø­ñ> G@¹Ô¼5}à9á›Å>>Ðoaù–óâ_í¤ÿÁb¼Gá¿|,ñ‡ÄO…Ï>|>øI¬OyñCIÐþü(¼ý”~$üHñ÷ůéÚ ¿Â}gDƒã¶ƒsð߯:ߌS]ñv±®ø÷Ã^·Ö|7¦xÃÚf°÷—ÀØžÏÀý¤ôoŒ:Óþ*MûGþÔ¾+ý¦õSàïøÇàî›á«ßx/áǃ¬ü)bšoÄÏxŠú.?‡É¨MªËâ{hõ)5W·“F‚;4iýö/xcá½¼%àû[»-NÕu™m-¯uw^¹ï´_\ïÕÍ^.ƒJa x{ã'ÇÝ*ÏÏÒã´ŸÌ·ø¥¯5×™ö©­ôY¦“F±Ãü?û~Ÿþ—Z?ôgYÿ!ØVûÿQo×ù„~×?´‡í?¥~Ô¿´‡¼ ÿ¶¾•àÏ~Õ_6™ì$okïý=ï¿ä#áÏû ßê/â:þ>?üTÿ‚Dxâ¯Ä½öðö'í¥þÔßî|Eª|3ø³â9t­f]GöÊ_†^;ñ¾­á UÐØ©ûrkßüCû_~ÑZçì‹c«hÿ³F©ñOÄ÷¿4謼G¤ÚÁ੯ iía¤øžCâ 'K¸“íZV—«Gky§iÓZÙI§é¾@°¶ùSÎñ—üõÖ?ï¹ÆšÃã´ÿ…\?OùŒÅyÓï_¿Èò¿³s_ú))ÿáv+ËþŸùþ]ôúÛþƒÿFÝûZßëŸþp¼þ§ÛŸüâ/…zÕŸ‰¾þÏŸ´Öâ[{ý%Æ»©Ûk÷Z¦•§Ùêvz•ôžÔ4_„Zÿ†üQp,aµÓüK Õçö\^¡Ó/èˆþó¼eÚ]cþû—ühó¼eÿ=uûî_ñ¬ê`q5éÊ•|Ç ZŒÒU)TÅâÜ*$âí$«¦ÕÕÚ¾·Öé4ò­“c±4¥CŸPÄP©oiF®7*sIÅòÎ+¹¢Ý›‹v–‰Ý;°#ý£?jÿÁñRÛÅšWíÅâ[º.ᯊ°ëÑhÚÄ~3ð߇ãÓ—@ðö¤/ÿf«ƒ‡ Üi:~­¢é6ÒÃJñ²ø¢ÆÞßÄo.©'ÇÖ¿ô+Kˆ.GìÓûWÎmåŽ_&inü©|·WÈSà2±GÛµöªŸ”ƒÓä;Æ_ó×Xÿ¾åÿ_7ÆX'ÍÖ0?Û›üjÞ×+Í0Ü­r¸¬^).[$ã¥em.´ï¦É—,¯3”\Räk—•cñir´“ZW½í£Z5k±þý¥¿k_xÀš‘àÏÚ{‹áÝxûKÓ|à¯èÞÒ>#éñh±iß¼9¦kÿ³×‹5­ÆQXØé1¿ˆoõã}a-Åž«kf¶Zf›ò¿Ä/j_|iâ/ˆž?ø û[x‡Æ~,Ô«â=rH-ì'Õµ'Š(f¿¹¶Òg› µÜˆVK¹âµŽK»–šò饺ži¤øÂy|Wý¦ì“Wóÿµµ¯76íŸbÐ<­Ù8۸ɷgw|Ö7ã/ùë¬ßrÿi<"‚§G˜àhЧB„iQ¡ÅJ(*4íJ­x¨+Ç‘¶àï)8¹<°Ù>? F0Ùþ… \ÔèÐ¥ŽÅÆ•q›Œ)R·|°¦’„`´ŠŠÝÓ€¾0~Ëž-¿ÐgÿþÓ )øÙñ×ÂÞðGÆþÞ<#ðþïT¿ðw‡¼OâGPÓ4;íf ;ÛËkvø ¢k¯ìÝ/MÑ짺7éZa éme£YÛXÅèðLÏ|ð—|!®þØÉðÖ_6Þ/Xücÿ +Ã?ñž Þ ’ïÃçÄÐiÚ€|ñVºJ$´ðòêþ›Ã­¯\ê°Øx“á玥ðÏįc~Ó¾/ÿ‚~꟰¿Âÿ~ËšwÄ]ö¨Ò¿i¿ê‡| ­ÚkzïÂWá……¥î—ã©|wã †š_`Ô4χ žá¼yofº­ïŽà“R‰?ø+_øoñMý½~#xÄž$Ѽ_«xgÅú²kv×^$ðüÚõΉ­½ÕÏìì/—U±»ñ_‹¯ÚþÞ{y®õ_øÛW»óu/øžçUø#ök>'›âž§qa‘"ȺŒÞ4þÓ“ÂLÓZ_&››÷ÐcñWö jkd ù¶4ßø™›:ý½øÑâø&>±¬þÔº…¼}û&5Ø;Hð_Á¿Šžø7ûwx7S¾ý°ôïÚOÔõhÿ5/„ú„~Øß|!Ñõoõ-/źìo†°ë_ÁÊÑú´©Ö•I+ba%º’rü~àG‡á‘&Ù·ö³e‰„¬âåªä3ÿ„;‚Ø;A'€+ë?…¿µgí@<¢hÞ¹ý¯ôOøWÅÚŽt /ைµmáöâ« FòUÒtÁð›ÄâM;NºHÔ|-.¯uá{ë‹iîî¼?÷2DŸ“v²øØÝ[ùRk~gŸ–"yüÍû×nͧ~üãnߘ¶1Î+ú˜ýŸ~)Á"|7ð á‡ûYxgÂ÷_ôïˆúŽ©ãi#øqñgÄok­¾©âg·ñøCIÔ|5âÙÛBÔç‹HÖ¾é:ž¼ºÖ©¦Þê·ß|Os¯ê1Ž"¦”±Ø'ˆ©K:8Ú™Ž*—ÕéÓ§ZŠjs»Å9Òi]&¨=“QŽÂã!˜eô'œaêbêÓÅTÃã§™âàð´©{^„Rœœž-Ô¥+sÅ5‡rq“„mø‘ñÁ:çÅÏø£âWÄσ¶ü{ã=Zç\ñOмE©ßê¾³ª]ó..®eø HHâX­­-aX­,,¡·±²‚ÞÎÚÞúOƒ¿|û5øâÊÇàÏÃßÚOῊu½Ä~iÓnn­þ&êÖz”Z]Ûér¿Â$²»ðÌzBk:>¹¥ê^×,õ 3]Öí$¹³ŽæZòoÛ³ÄüEû\|tÖÿd‹[Ý?öxÔ¼`· ÓtÏøGšÔèúZxƒQðÿ‡üM¦¹ xgXñjëú·†t-CMÑdÑ´ Ý;M‹ÃÞ·¶‡CÓþœÿ‚ißü/ÓÏV´!C­:œï VPÄYÅZ4ÝE(8)/<ømñâþáÝ+â—Ã_Û‡ÇÖ>Ôüw­xz/뺖±&¬üPñmç>!êÉuyðK»OÆ^2Ôo¼Iâû©î.õZêk©æg|)oiÿà¹ñæ—ð#ãφõ="‹O×þ%Åu}àÝ*ãS+¥µÞ©f>xa®'ÝÍ‘·]ÓÚ×Y—O½W­…¥ÇÝðP_ÿÁ5ìíàWö3ø«à›ÚcCø©ãG⯆~x+öÙ±ð_¾üGñÇÄGÁZ?‚¼OûI]¾›_³÷„ô?‡^œÞx#á¾³ã»OO®\^k:Ψé6¿—Ÿ¤ñ;|HÑÆ¦Èú)¶Õ¿·ÄŒ§C:OöUßÚÍð»?d2ªÚWÚ~Oí¡¦ù`Üy´ÇB½*¶'…Ça©aêξ븤±T£êaù½¬¿é¯uÝÏg{æx§û0Å£kÿµ?i·bñmž¯y‡cUü¿G7Œ<ÄÝ.¯·zîËË»†sÏLu­¨QÆJ'Ó ËìàÔ!ÅJ)8Ũ§í“’IY6“w¾‡N/Ì¥‡£(ñe¡O1ÅÎ*.j*~Ùs$´RqMèÞú~¥|4ý£~8ißuð7Ç«‡÷~"·µñ‡¼á j^×'ðd×ÇÁ–ž?¶ñÀ/ÿÂIã/ZëšžŸg©ê7V˦Úê-• è{¿·qÿm|sûE|LÖ>)üjøEû`üCø‡­Ádšß‹õDµ‡WÖ¤Ž4]j×gìñd5ME¤¸”ÜjW«q¨\©qs"C Gúcûx¯þ ¡iàm ÂðQè>}—Xñ·Ã»›‰®<'ûT^üJƒÃQxßá¤ßux»ö}Ñ-õV·ðÕ¿Æ[? &…ñ&Ÿ_»Ñ¬~$ü!ñtZ§…|}ðÿñ·öìo‚‘þÔìw>®g¹l¼qàËxåø…5–©\ü9ð”þ:Ò4›ÿ‰æ/ˆ·£ü@“Äún‰¯øªÇFÕµí.ÖÓW›@ÐRò="Ï,«ÛÖË£,>3ƒ¥R«<<3\Ý(Æ¥X¸«ÎrnóÑ*r÷R•î¼ìŸ Äá0õ°™Î‡šÄºx:y¦.ª¥o½ç:w|ÜÜë‘(J\‰µ©Þ|0ñˆg_xRO†_¾=x3ÅšÍýÞ³§\jÖ0j?åÕ|+§ÏyáíSá…Æ§ðcìzMç…µ ™u½ré¼3âI綎ͬåðåõ•¶²ž…ñãÆ¿iµð„þþÙÿãðü%ßð†¦±lžÿ„ûÄ“xÇÆŸa]#örÓ€ÿ„›Å×z‡Šµ —í~#Õu­r\êzΩsyÌÿÁ<äðŸü,C7íãOxá5¦¥î½ãŠ?<_ñjÒÇÃÞ"»Ô›Â¿|m¨k¾,Ö/Än˜tÙtÍWÁÚ·žºø¹¤ê¿ íüK§]}ÿñïüSŲ²Ø~È–þð·í kûEx÷XÖ|=ðóáÿÇëý7Yð6»ñ›öÔô=OÁ_~0xkáî¹¢|9ð÷Á[ßÙ×ÃZ†|[iªßkÚÍž¡qað“á±¢x›Äÿ1Â*Õ1YŒ(âð˜z”14©b«}{å¬ðÔjÇãí\”'G•å®JéE"°8\e\nkK›ÐÃUÃbèÑÆWþÓÅÊyy`ðõá‹å玔ðÕh`Uå9_ (ó(B0_›gáÞ™ðâ+X|ý£¼=}¡ZÜ\YkÞ2’ñ¼7¢ÞË–¶z®¦‘|Ð$e°ºž+›/ZÓ\]Å[¸ÛýýáÏÛ—öäÓ,l®<%­þÞZF‘q¡ønÏN²ðÖ®“øbÛJÑEÔ|>žƒRýŸõ§´Ótù´ ˡη÷º„„ü k.­}ƒ|5.ù+ð†O?ÄO ZMPè¦{‘â1œ ðÙ²¹$âOÝnþÁþÑ)æƒìyÀǼWôù⟉?ðF}GâÃ;µ½ýŸ|#/‡¾ ø¯EøÁáß|ý¬õ=Åž2Õþ~ËÚ6‹à4ñG€<âËx—GøÕ§~ÔÞ7ñ?ÆÍÃÞ<ñQøO­øÂ? >!èšþ¥àÝWáã_ûMPX¼ÄÃíe–?ÎŒ«¨G £ÎÓŒ'Ô”œ“µI+7rXLoöÏÕÖo‡X¸åʼó fX¨Nxyâ!„Œß<)Ô„ê9Ê~㪔b¹¤åü÷€šGìÝûZeH<Ís‚zù œ\~5ô/ߟôø¯áŸÂý+ö·ðo‚¢ñ™§ê^ø'âgà `þŸÃºŽcâiôÿ„úµí·Žl5}ÃWñ.³¥Oáyñf«ñ>úÉÓàêø^o†~1ŠÒ_‡¾ ñÏ„´Û?êßàñ§ˆ<¾,›\Ð4ÏAãí:ÓJÑ47Šjx̺L^½jõ+Ç]ã±JXG Ju*F £æU )Kš<ŽqJêMŒÂbéãòª5³zиЏ……ļ˧‚•:õjFŸ<•ERè¹sSpö‘Õª |jµñÿí âøñ¯áoí§ñ'Æ×²:ox“QžëPLÑ´éZV›o _áµÓô>ÂÎ,,,-mlâeº•c3K<Ê|7×Ôm¾hÆÒþÖþú×V¿Ž]7ĖׇOÓá¹Ó4ó¯ÿ‚“x«öMñ_޾ j¿°U¯ˆô_†)û?ü1Ó|qáýCÁzïƒ5MâÞ›á}&ÛÆ¶Zôšß‰|Qqâ¿™–Òoø²ÃU¾Ð5OI©Â?ªëz\Vú­Ï•~Çs”ñF¥/Ä!à©|æ& >-ÂÍmXõS­Y~0ø ÖðÂnÛ<ZMi4œ>œ×‘¿Nwôpò«‰Ç`±Ô¹0tža‹ö|óXjTjJ¢¨ù>«RP­4¢ù)E|*Dæ˜Lm º­\^q‡ÇQö´ ðòÌñp‡=L]:Tjʧ<ùV¬©â$Ô/bÒjIMz÷ÄÝwãÆ]'Wо)øöæñÞ®üH¿ø½ªéž!Ö¯/lî¾$j~Ð|sâ¯%¾ªE|ž ð¿‡|+e ¸ŠÇKðþ‰¦ém¥¥¤0/ð£áf‡à‰ÿü\Ÿ³§ík'†üoámj ¿­Åç„,îtÝrÂîÖ÷ÅmðOK[ßÚ\EƱbÚž˜·º|w6‡P²›˜¿J?à¡·¿ðFýSöøù®~Éš·†o?imoöø³¯| tÛ3ÂöÖÿõßÚj¿ 4øcãNᯂš‡ô?Ùúû[Ò5-3Áú-‡‰l¼a¦x .´ñâ‹»ßÄÿÙªoˆGö…ø$4·/~ß<!O4‡Ãì‰ôµ|@ùØ-m殸&Å·öI¼8·óh«G=YÏ3ÂN£9Nœ±ø¨ÂQ;Ê2¨«^i4æ•âítvWËóá+Î|CB¤#B¤§NY–.åÓ¼¡*гpƒZJj-Æ/™&ô?_~+þןµÆ—ñcÆ0x ÛÂþðŸÄ_‰‹à«„Ðé>ðf•i®øÖ]gZ“Á1éÿ³Ýõͧ…üAâM'Hñ•µ„Úî¸?·ôo øšçTÕ¼QáÄvÿšwô»ë«‹ûïÙÛö¼½¾¼¸šòòöîòöæêòêâVšâæêâo€ï5ÍÅÄÏ$³Í+¼’HìîÅ™‰þ†føËÿ­ð¿íðòÚ·Â?|Iâíãoí§þÒRiý¤•¡øPñ÷ÀÉôi`»Ñ¾xCñ¿Žn´/ãÖ™á]è?|9o¦xžMOÀ¿>ÚÜ|%Òþ)þ5»»¸ñ§‹gðLZý—ƒ'ñ>¿/„l¯%½{«O KªÝ¾kt×w7wMqo¥5¤S5ÍÝÕÁ‘Íq<›¤e„£Œ©†ÃÊŽ9Q¥(R†?R0ƒŒ\`¦êÅÉF+•JË™jÖš¬1ž *yþ9aèÊ*yž.¬)ÂP‹Œ#QÔƒœ"¬£6—2Ý+Ÿ£_¿hOí|kூž ý¡<kk‡…µû_‡zN“7Š×Ãþ~¯?ƒ~%ßë|S>¥§Ëã? éÞ9Ó4U²ðæ•mâ+fÖG¼Õm­µ;\ÅOÚ_â-ÇÄïm¿Š~=“ÃÚÖÿ /Œuk‹ÛÈ´¹ÓĺÝÍ¢¯À(--#¾×|Eâ ~æ;H"þÑñ6½¬kw¢çVÖ5 ›¯°¿dŸþÂ:'ì?ñ—Ãß¶áø_~&Ðõ»o„Ú·ˆ<ñ[Äú±Ô'ýþ7i>ŠÃXøqg{7ƒàðïÆ-KöFñÖ«¨]ßxKWÖ<áÿˆZ¬ø‹A¹Õ<­ü}ÿÖÿgm_öˆð´¿±ÿˆ~ø«á­ŸÀK]/Å~,ø/àŒ_ ü+â‰ÚmßÄ‹]g]¹øiñwÂÞÔ¼}{¤Gáoìm Ãâ½2Çá ¼[ãïü^Ÿâgˆ¯§#Uë:0ØÜšÆÕ‡³þÑÅÆ>Ö–%¶%ÍÏÝŽ"¬g‰ç´­ ªošçU…Æbpu*a3|>_EWÇSö0ÌñrNµó§_~h^8ºðž+™Ý¸UŒäç)Èòï¾¥û=ø¯Ã>*ð'ÁÿÚ+ÀÞ+¿ñ&§éZæ»w¨ÚøˆÏÒßAmð×Q´øK ]hWQ´Óu ø†ÝuÉô[븇Ãú„Œ¾GÕþ.ý©?lx;Ä¿¼c/íùâøÇÃ> ðo‰|!©jpÍáí_ÂÞ'‡áí¶¯¡\i_ð΋h, ¯Â_†šlPÅÐlþøB×Cm:ÛÃúdVß2ÿÁ:5_é?´—Ãý[ö•ÓäÖ¿g/ƾÔ>2i:œzÕÄÚ‡ÃûOhóxÆÓöú%Õž¹7Œ.< ž.‡ÃqxvêßÄÒ\=Ìz©pÎkô#ö©ñoüGÆ_¿lûo:ÏÀÏ |TÔ´ŸØ¿Rø­éÿ ?jÏø£ÅÞ;ð?Â-¿l;XÏð<ã߉-}ÿu¡|-¼ÔõKq5ètZx=l1£òÌ1ô¡ŒÂR­Ia½¾'ëø§j\ÔÜÒ‚¡Nðƒö“swº‚?/ øA xbUñ~Íÿ´Ø] :±o›‰¼>ƒOj2kq¶bm)<ú„_kµÚ “íóSôÇǶoí៉¿ì~ê_¶v‹á]Ç_<9 Ø|1ÔP|8]#Qñž½o«Çá­/Pø⨣ÒoÝõŠÖ]cZMXñŸ¦]ÛiÚÞ«gsøwàÉ~ ŸøtivÚ™ÖtßìåÔžoìó{öØ>Ì/pÀý“ÍØ.yÿQæd×õûã/ÿÁ u«—ð§íI£ü-Ó¾5è+ñüs<þý¶tSgñ>-W⸹—Xñ—ìáiøÏLñ–¥yðcQð¥£kÞ,ð·…<+¡xÎÃM´ø{©^dë³:X…›aé<~ ×– ½EˆyŽ-T…(×ÃFt½´qp©7 :ŽI§VÏZ8,|ibh¼÷ íåSSë2Íqq­QXÈÊŒh{F¥ ÍÆn§2k’Íisù§ñÂ1â½[ñOŠ>~Øþ"ñ7‰u}KÄ"ñ·©ê:ž±®kºÍìÚŽ¯¬jÚ•çÀ™®õOSÔ.n/oïn¥–æîêy®'‘åwjö/‚¿¾,|øàç€?h [ÁáÛëú_„4}"óÇáo[ê—~(ðïÅ+­wàg‰WÑ/U¶ñ‰BKý¸ÞþÉ:°‘VA~n7*¶E~¢~ĺ¯ìïcð‹â¥¿íkyð+NŸ^ýœ~-hµoŠÚí)â?Ø|lÔ`Ô#ø;uqìÿ¡x’ßJ±IÓYŽûÄ^:Ó#×´o 6‰7ÂÝGO/â)ÍcaZ•\+âð˜‰×Åû<5Yã±Qú•xЫUâRUZ“•u°©7q)]§gäf8L]Ù\1Å MLF9QÂV–eЧõ BÃW¬ñ‹÷’½èÒ­ƒV”ñq‹—,å|ßñ‹Gñ‡Çÿ‰>(ø¿ñ“àÿí•ñâg.í¯üYã=r`Úψ/­4ûM2ýN[OÙöڋϱXÛE=ÓEçܼF{©&¸’I_œM2‚Þ!´ñf‘ð'ãf‹ª^jÞÒáÔ>"Ú6§¦\À÷š}åÞ‰¢ÚÜ|Ñm¿·5ëkÑ£k‡ÕíeÓ®õ[½Vµ½šÞ»ø)§‰ÿdMWöžñN‡ÿîøyƒÿfï ÈöñŽ‹ã_ÚÅ/ñJ øíu8üC§~Ñ1ØøÛÂ3èââ_>ƒý• BêÂîìjzõ´öZ“ùìׯwñ‚+MrÿDÓü%pšD:Æ£ã˜üWqáí:â]SBO_^Áàâ|i5·ŠN.·ƒ¼c'…×Ä áp5†µ#«ô2Œm\N?‹Ã¦up“Ì1Pxˆ¯ixF*sçMéµ¹§n2U/8Âc0ø*õñyÕ v T­ƒžg‹¦±0Upÿ»MT¨›—5£ )ÊP¦Õª3îï~Ö¶o<ãO‡Þ*·f§àψº·†|q Ñ,­ðßÀMcOø«¦ê¾:ø£áM"óÃ^Ö<¬øsÃz‡‹>>ø†ÓÅ_3šTÞ=þÔÓ¿³ä×þÝöë_²}•î¾Òn|øü#È>oæíò¼œHnÏŸN†5Ò“þÔÃ$¡~UÅ$—$eËuU8­ÕÖÉßÈïþÏÌÝ/õŠŠ³¿'öŽ.)GÙ©r¹*׊WåºÕFÒÝÙ~©xö®ý©µø<'uûcÚøgÃŽ¥¬x~ÃàÞ½©é ÓQhü{á‹Ñáÿ?Â/[}Ǿ=Ò5ÿ êÞ¿áëÝgÆ¿/ÞÂÚOx†ÆOŸ|sðóSø›ã/üDø…ðSöÏñŸŽ¼m¯jž(ñ‹|I«jZ¶¿â?ëw’ßêÚέ¨Ýü ’æöþþòyn.g•Ë<’7EÚîÇÁŸÿÁ›àÃÿþ×^økyñƒMðω5Ee£þÖž7>6³Ñ¿l»ÿ]hß?g=R´>ñ]æ«ûø[û"ŸøKÃÚ—†~0ë·ÞÑüMq­k¾,þ_>#ø’oø÷Åþ#ð‚/>x/[ñ§©x_áÖŸâ/øªËÁzÍÌ’i¾·ñ'Нµ뉥Û펩­^OxÊÓÌÀ¾ÕåË#_€ÂVÃbð¸=Z4êÐÀÇŠ’ÁÑœS§†»«:0µ9.Ug–ÇO„Æb²Ì# œQ˰ÕðÔ«a²øæ©, ‘Œ¨á[S¤“£ *RQ§ÆQqŒR±÷—ÁOŒ¿¾ê^(ð7Á þÔ î¤ðÕ®©aðÿTÔt¯‰pÚÞjsjwˆ®Óá%ÜfÎòé´Y´k» é:¦“{áýÿN×ÍŒ ½ÇOˆŸ¿i;CÒ~=øCöáø¥¦ø_W¾×<7g⛨®aÐ5-Kþð•üº(ƒöx·:e½×†üák #žÖ^ÑÓì Ø[²z¿ü{Å¿³_„¬®/¿m»o‡_ /|'â ;Pâ„~)øÏÄ70Ï«?ü"¶^ Ó¾èšÎ¡µ{x>#Å}w©ü3ÔLŠÁ<ñ¯ág‰ä·Öî¸ø*iÿ‚xG¨| ?ðN —{†ðö¯ÿ ½|!7í8þ]DxGá;h§·íIÿÏü$'Çïñ²=@hŽ|*<ó qµ×’p¯Wë~ÃÂ(ckÓ©c±Ru«SqlDÓ©YWšulœ•ª)96Ù^_ëßVÎ(`•<ÃF¤!™b§*øŠRŒ+â§:jÄÍ:¼‘ç¼gJ£œ¤ßÅ>é^øs®ê°|ý <mõ-)—_ñë\Ká»Y\Ïn‘^¡øMáno|ãejçZµXï®-˜‹€>Í7úúþÌŸò*þÉöjÿQ¿‚5þ0—RkÍá»Ñ©>¢Éý«cÅÃJSËš9íÀ,œ÷ÛžÕþϳ'üŠ¿²_ýšÿÔoà}%EV8l +bib¦¥¥JUêW勜mJN£“§(¶åìÓi)'vä}÷ÐÄaèW§ˆÇ,}GYµZ5ªWP‹§M*|Õe9&šrqæ·½t•Ú;oŒ_òøqÿe7ÁÿúpjùOþ 7ÿ& ãïû|ÿÔçáõ}Yñ‹þB¿?ì¦ø?ÿN _)ÿÁFÿäÁ|}ÿ`Oƒ?úœü>®|uÇKÿIGÒ=éz?θ|/;cÿ€Ù~~Îç>˜ð_€ô¯Àï þж>øs‚ßÃw÷š­¥¿Å k m|Uö]!aø£á½Ã“j:É¿¸Ò¬´¹n4Ùã×,¾žÞi£d±Oûëð¨)ý‘?gðÀ?g@Êy §ÁÞܤt!†A濟ɼ)¢A¦ÙkøRÆ=/Q¸¾´±¿m=>Ísu¦-›_ØÃIhº…‘™r6‹¨¿¾+›)EÓq¾ó¿§î¿_øcl*‹^òzrµnïM>MßÉÜêì¿iO øoWðN«àjÚ,Óõ¥h:·Ž,µÍ÷ĺžoe{â=nÖÏÁ¾ÖŽ¥,RI¬é:Ž¥se©X.Ÿ «Zè–&Êë7Å_| â}3·—–>"iì~ üCñ6»áhuÄŽþK/GáÛËI,¼o¨èº¼r¼Z®“uç-ÿ‡®îþÆÑE$ÓÎò_+5¯‡6þ³±Ô5ØÚXjfd²¼û5•ͬòÛÇ×â{YgŠ;˜"¹·–kiZ;ˆ£ž'xÕdReÓ~^×H¼Óü ism¯jwÚ>*ÚZ"ê:Ž™kî¡kn%–6f³µžîd`°D² i2Šóý¥K8¸«>Wn[-áo¾Ñës©(;5çªÿɯ®¿¿mz#:ûöµ‹âÞ£ñSÂú>·¢µçÄkˆ°xvÿŶúÍ”7Æ÷RÔ/­§ž×Ã"]Ïö­Nh´mHY[Ï£ØÉsm$:Œ÷&î-íOãöƒâh|uy© kO½½øO§|?ÐWVÔ‹µízþ/éž#ŸUñ?‰ÆŸ Ç4ÖöP\ÙA9Óã°µÒ4åYM«Ü¿;wàÝ*Ç\ºðÍ׃íañž«>‡s£ÿf£_C«Û]µŒúq·Œ3¨ï­Œ(ŒªQA5µu𱬆´×°Qáí6ÛXÖ¼¸tùÿ³tË»ÔÓ`¼¸\J|¦¿‘-$ ¹àÒ9Ö"Ë•í*jµ³në—«µ×“_ðýÉ’ÙÚ6îÒq·ù+ùï¡ó¿ü$?ô×üþtÂCÿMÏç^±ý•á/úi?øøQý•á/úi?øøVEßÉÿVÿ?Áö<Ÿþúkþ:?á!ÿ¦¿çó¯XþÊð—ý´Ÿü‹ü(þÊð—ý´Ÿü‹ü( ù?»ÓüÿØòøHé¯ùüèÿ„‡þšÿŸÎ½cû+Â_ôÒð/ð£û+Â_ôÒð/ð /äþïOóücÉÿá!ÿ¦¿çó£þúkþ:õì¯ Ð IÿÀ8¿Âì¯ Ð IÿÀ8¿Â€¿“û½?Ïð}'ÿ„‡þšÿŸÎøHé¯ùüëÖ?²¼%ÿ@-'ÿâÿ ?²¼%ÿ@-'ÿâÿ þOîôÿ?Áö=Ãö.Õ~ÛâÐïÝÙ›âëãýÛmzÿµ_Ò®®D¤âàBÉ hDò™~ñSm˜'$äIäzÿ<ÿ²Ž…o¬|k}7M±³¸?³‡Å”im Ž) Mg¦BË‚P°Faœªzâ¿¡ýÍOýÙ?¯g—Õå§Y~§ãRõ3ãφÚöìñð’/øGá$òí_²ÿkÛâÿU_´ùûãóqžNH;÷cåÍ}‡ðø˜¤Ô6¢¡w뱕& óYü¹upJôÞ0O® 㯇xÔg„‘6'ˆDv(µSY€‹ýU~Òe,¢P¹Ùåsû±Å}‹ðú2Ϩ(UmÝðØò"…ÃY.ÍîT9\ã ä€[±ÇføËÒœNlGðÿð/ý´ãÿh¿ÚcÀ¿³†üâïˆö:äÞøñ·àÿÀk]OÃúw‡®að7øÓNø{à­oÄë«ë$–þ_k:.—­j:Jë:ž•©¦ú,ºMž©}§ùgÇ_Û¿áÀßøcâ¢øWÆÿþx¦ ÙÙ|Rø¿ ümà¿í?xóGøká-Lº¿ø‹áíSÇ#ñ‹õ»M7LðçÃ-'Ç눮çŸO‚+rÌÿÛ«öEÕlÏ„ÞøYcñß­ü)ûB|øåªj!øyeñVÃÄV_¾$hŸ­üþºñ·ƒ´ØbñVµáÍ'MÕ5MYüE¦Ã¡>«c/…õ)u®l|@ÿ‚hOeðçáo€+‡ÐèzÄÏëÿ~&þÐZÃoimñV×¾økÁüWð÷Ç:&²Þ/ñ®©©[|,ƒÂ¾%ƒZðÿŒuûTöÏ4ûâÏã¿ÁGZ·ðÞŸñwáEÿˆ¯|×¾ø3áwÆ?^øÁâÏüð¤¾#øÁñ'àü]à/ŠÞ$Òü/ðŽoüDñ¤º_4/E7‰#i7šß‚,5ï†:¥¶¿¢øCÆvúuæÿ uµ¼û˜µ FÂÅí¯€>Ûø]ûB|5ø±ð§àGÆ^±Ñ<-ûHø3À¾6øKcã¢øwÄ~$´ø…àDø“áý ÛH¸»Ýø©| nõkýKŸRºµ¶Òµ{•3Yé×7IÎXþÓ~×ÿh~Ξ ð·Œ,ºø?ñ{kÝR×>"i:߉Åý…§Š¼/cá'Jñ”’hÞ­ÿÁ0lu?ø(T?·—ÆÒe—âþ'jþ¶ðL-â}CZðGìÙãÙª?ÛüP‹ÇÖÖÖ þÃ>-ñ/?l ~Ñz†|)mûEþÜ3ý¥|3£h ð‡ãÒü'¨ü;øIá= ×Y³øÃð³Ç^:ãê^Ö'ºHü!{s§ÚÍe&¬Áq4á~¶ðÁ¯ üðwƸKBÖ|Iqg*øgá—ƒòúÍŸ‹µ‹ |=ðƒÀß|e¶êúQ¿Ið†›5ØkÔä¿Ô滿¹Ãü?û~Ÿþ—Z?ôg5à­7û?Y-ÿÏü#ÿiñ%ìžoöÏö¯ö–<5â³öžcýníÞWËŸ3n>Jÿ;/Ú_ö(ý·¼]ûB|wñïÃ_~Ò“|8ñÏíCñËNðÅׂ&ø9cá"Eñ·ÆŸjòÜÇâïÚWÁï†üáÄøOñ^ÇYø“ã xWáüÇßض¾.t{…¯ôKðFš–Ó°ðäº ¸ñ-äždº ÔF¡ÿÏ‹žˆ¨ÃygóÇËÏùÛþÔðTŽÿ ¿h_Ÿ<ñ{Áz| ûMüxŠx‹áF›âOTÑ5~ÑZgŒ¾ëºì&Óç›ÀÚÆ«ûE|vÕ-ï´h¼?ñÄ|@h-üoi†ü%káÿ ªÒ§MTŽÍʵZ4èÔ«RVÃC–µ*Ë’t刔œb¬á»;?•âï«}s-XõUeîŽ1Îtp”qRŽ%K ìUpØžH¸:×jšÕ$ä¯gùKñƒÆ~=øñGÇŸ¾/þÐÿµï‚~'|3ñ.§áøRÿÁ¾½¹ÐüA¤NmïlšûHý¡µ #P„8[j:V¡}¦j²C{§Þ]ZO òy¿ü4¯ý‡ícÿ„'‡ÿùýS?h=rÇöøÙñ?öø·ñ²ÏVø“ñoÅú¯|_}¦x ÓEÓ_VÕ¦ÞðéúU†½µ•…¤ ”#̘[[Ä×w7wm5ÌÞ;ÿ —ág?ñv›·üÊǯüT=ût¬ÕŸ¿Çôÿ˜\÷mÿ0>Ÿsùüʇ éûÜoOù“á¿»où“ÿ‡ú¹ì¿ðÒ6¿ôvµþžÿçõGü4¯ý‡ícÿ„'‡ÿùýWÂ¥øYÏü]¦íÿ2±ãëÿ~Ý(ÿ…Kð³Ÿø»MÛþecÇ×þ*ýºP¨à´ýþ?§üÂàÿ»oùôûŸÌäá?ùûéÿ2|7÷mÿ2ðÿW=—þF×þŽÃö±ÿÂÃÿüþª{oÚ& »ˆm“öµýªày厚çÀº·‰¤uA$Æ/ŽÒÈ"BÁ¤òã‘öƒµ°§ÄÿáRü,Ïü•¦Àëÿ±Èüá!þ•b×áWÂX. –ëâ¼ò[E4o4pxUv…\4‹ Ëâ{hžV@ÞZIqo9ç‰I‘T¨àù_%|7+å¶ß5£Ë£À¤õåÑ»;k¦ñ8pª„¹*ãœù_%²l+|Ö-“ÉÒnüº6“ÚèýkðŸìkÿñ'Ão^1_þÒú­¿Çˆ:Wÿj¾Ö~_øs[ñ—õ/èÞ Ò"Ô<[ûHøYÒ´ÍzÿáwÄ*ÇÅ~0ð·„¼7sâoøÏ@¶ÕoÆêçá|iÔüâŸø+ŵíc¥ø›Áþ Ö|/â-7þï ßgk¾Ônt^Çíºwíw§Ýý“P´¸·ûMÝÕ”þ_›kq4’7Û¾ÿ‚›üR°øUû9x|5²ðOìÿñ_Â_üðïÅŸï#üoøñKGµŒèÏy­ø×þ_¯‹¼á¯h°þq|\Òþü_ø›ãŸŠZ¼9á-WÇÞ#Ôð§ˆcðÝ®·­Lou«6/|BñN·jº¬·šµÅ½Î»y½åõÄtvZdvz}© P•,3ÇTÆÓÆ<.â¡ .ÙÓĺ4hSPÂÔŠ¥­ÆšS’4•ÛZòåË"x›K×çÖì‡àOˆ‡VñŠå‡Ãš/ƒïõK±Ðürð·Ç¿Ù³Ãß¼Kñ¿ãíYðþÏâ~š5Ÿéz…¯ÂMGÆ¥Kaa«Xßø—À:íCªøçÀ–ºÎ“©Øê¾—Ç~ðÚø—L™µÿiYÃq4|§ì‹ûIxsö2ñUÖ»ðáþø³Å²è:È´ñ§ÄÿMâ}7H»ÖfÓôk#EðÆ™ñúƩ ®¿ž6°ÕâšëIñ?ˆ|£]i¬×ë«ûN~ÕÞ4ý­¾| ø)ñkã‚_À_³¥•Ö—ðÆÏÃ?ì4+Í#Fÿ„wà Ñt½_]6áï x3ÁžðÖ‘ xn=G½J_x¢ËÄ^6»ÔZ~ÎRåÂÉ»ÍÍ'% Y+Å=]aÖLçˆY×)ÁW’Ë¥Ÿz˜Zn”§É–Õ|ÞÑÔIIS©d¥*Qº”¼&/^|k–ÛÀºíñ«Å:­þ¡¦Ïe¢üR𧇴¿ Èö×öÆâþãP“⯊ⴸÑìžçV‚yô‘ bÊS-öž™ºíGötý°ôßøÏáô¿ÿkçñ'€?gû[ø²(­~ K¦èß³Û|-¾øÕmã˽~Ú®o‹Ûÿ…úf¥âÍ?ÀpêóüE¾‡MÔ´» \ëZ}æçGƒ4… uë7‰ãøö`ÖxJæËþ»-cLÖ i> ³½ÖÄð]ØÛ\xvïW€Ë§°ÔZYbŽÊ[‡MNÇôÖçþ sñ£O¹¿‡á×Åßü1ð¾©û:Ãû.j¾ ð—€¼osàÿü/Ð~kÿ³OÛýsÃ^7øËã›)|{ð»àç‰µß ø#ÆÎºÔO«ê7~'¼ñd÷×r\¤þ³V5*cÖ^©Ò–RÀ',L›X¨¹¬3”£C ËÍJô¦”¦“PPY/Öë*¯²¥J“ÁTþÅÁ)KÿßS’Ë\Ü!M`ùe:Ó”çÔª Õ?öŒ´–ûXþÕÁfa2x@dC´—Qñç,¸'ràîM}íð'ö ý¹|Mð£Ã4øe­ü}Ô< ã_kžðí×¹> ÚxRmgûgV…üLl¼EûB|9×tßK“q{®üY×<#¤|)Òµ¸Óu/µõ¬¥¿)¢øQð¡&åø·($Fs…:¨`X¢?‰"Gp*,JÄiNáúÕðSþ «ñÓá7¿ü.ø[ñCÁðg5ÝKTÒü=®|5Ò¥âxüQnš‡ÃýsO¾]GTÔ °Ñþ'Úê·—–ºwÄ k0ÛÒ§ã0Ñ…LÁåÎ5匩.^¥ ñ¦ž*sÃAÆ3R¯ÏË §Ê“”.•IĬ‘WÃF‹ÇK,’¨ñÕM‚R§‰Œaõ©K-„Ô'Šæp¥Q&¡T¥Î£Wä?Œ¾.øû>üPñ§ÁŸŒ´Gís࿉?µ‡ÐüYá» x+UþÏ¿Ay Úëíªè:Ö›cui©i:Þ…ªjz.³¥ÞYêšV¡{awos/Iû=ü+ø×û_üM´_€¿>4ø÷Äþðu}OUÖl>x;ÆÞÐ|7¥Ç­êòïxßã~‰á­£>«ªjšž·ñ#Ã6ñÛhú°†ÃR¼?ö‡ñ‡í?ñ£âǯŠÿôûßüGÖcÕõÇѼ£ÙÇg§Ùhº>‘¤é¶þ"s™¡h:f™¢éÆî{íRâÒÂcTÕui¯u+¯Tý’ÿh¸?bßjZßÂ蚆­â¿ xÇÃ^#Õ’?áÔ Ö±…’‹w¹[¸=Ëö®ý§&¿†õwGÖ­¬­|+¤xËâ¿õm;@ðΓáÛɵËyOð·‡þ|5Ö!ñ¥¿ŒO5 9¦Òü5%Œ>†ÿRž6´´–ã[Ÿ^,#ÒÞàë*M¥âÞͧŦKn ½–â ­J1£VY}\tñѧ)àá,&Æx˜¥*’–q•EMKšp\­ÞqÕ­1 "ެ²§Œžgr–] äøE ãWÕc9O+¥ÁÖTÔå:ÔTcw*´ìæ¿Tí¿cÛ¶â]b×Fñ§ímªÛø{à–‹ûBÍ>—/À†µŸàÿˆOĵðν¤!ý­õ=s_¶ø5ñ>ûEøm¦%ßÄ»Ý/Á:Þ¡mà÷°µ[‡üð´}³0AûXþÖbøA<>F[œ|zè ç÷Í—üŸÆžŸK¹øU­|øeyáŸÙ³Wý’|â?|,ñÕ牴?·ïãÓ¼?ö¯|sñ¥­íÎÿ|ox°êã\ÑõS_·ÔðO‰t½_ñ-Ä*÷Þ#“Kñ/ľ¨+Ãöš=Ö›¡$6vÍc£ÚÊ÷S\¬9<-ó ã©â[â!õ\©ÍS“÷pÃTMrí8ÊJÚ¹^Zó`ÖG8Sy·×éf¿úÄ?±ðJ*N¬ZÒ–]Z2÷y9g“ºm¹'7}„:Ä_ڃ◀tŸ„_¾5øÛÆVúÓø_I"Ñ< áÿØk~5´“Lð݇ÃëŸüh‹F‘|1ñ§Æ/|oý¨ì~ü8ø«'ÁOˆ¶™?Á/ê^ ø’$ZÝx+Lý¥hoê:å¥Ì>ñ¿‚4(¼1®]à Ý[i:¤±ü^ñ+¢ßÏvÖ̺¨ßl’ÝE«grþ’ø7ö ý¾¼K¦xn?‡ž2ý¥|e¡j^—^Ð5o†þ ý5Ï\Ùèwÿ¼5sá}Yµý­¬¬ãñ|ßÅ?‡:‹ð²ú×Fø§©IãAgà®oÅ”?’Þð¯Ã‡úÍ—Œôkz§‡$mWGÒÆ‡m¦‹­nÑm̾½ñµ·†M-.e’x®bò¡pÖwŠÆÚ_ÕŸ ÿÁU¾6x ßÂÖ?>#|ð—†<ðcXø)á_ ]|ðþºÚ„|A©ø]¸¶¹ÕnüSuq¨­•ÿÃOEyá®-¾ x´Úø–ïÅ 5™>#|CO7Nø¨ÅÏýš¨9BªÁà.ñn¢U)¹¼/:q¥.1öJ.ò|ò’´SþÅxØÅ¼wöJÃ7J¬r\åu ªÂSywµ-AÁ{Â|ÒýìÜiþxÚBÕˆQûX~Ö’'Àš2xçþ/×O\WÒÿ?g¿ÚSƾñçÄÿ…~<ø‡Áö¾3øzš½ÿÂÍ7ᬚ¾«¨üoñŸ‚>ü-½×¼9ª|sðo‰u_øßâŽ4?^iÒ¼jÚ6¥ºMSÄ-am}saðøMð±H'âÓ|¤ÿ±yÿЇŒöô÷¯¹¾~Õ^øWð›âwÁßè¿æÐ>#éÞðo‹µO‰ñG޵/ø{ጼ3ñOÀ½¾¦ü^Ò|%¦EmñoE“Ç“øO[ð®½gup†üQ}ã_Ká[uV›lŸþÑ9ðn™àoÚ7â¾¹­i:üpE¨|K±øà›Ï É«XÞ›=gþ$ñoÆá]9¯´û}+WÖ2ëš$úç„.¼[bþ+‚/XøS\ŽÎ »)-åðìnng·žãO¼èÌ©F¾[S0«ˆöUÉ,&_Uû7N„q)a¡áAÖp‹¨­ËÉ&•78…’G RYSÆÕÆ^ÊÉðsýíiT˨Á¸aiB®®1„aRV£?­þ<|ý³fO ê^:øßâÛ·Á>Òu{MóÇŸð€ø#Ä~7z‰´eÅŸŒ¼%ûGkÞÔ´}[ûGK:Oˆ4íRïAÕWYÑOÔ®W[ÒßÍ ~3G㟉¼oûS~Ñ×%ñ·…´;m?Æþ ðýƒµ­K\±³µÓ¼Q|~4k a ÞÜM¶­|ÚN¨–VÏtÚ}à„ÛÉõgí-ÿø—ûQ|×ÿfŸx×à¿„>ø«â-×ÅoÙx á'ˆâÕ5¯êzÕ¿‰µß\ê4ø¯ãU´ñ‰Ê§±©˜}cÙÉRK&ÂÊn£‚åå_Ù)]ÊÖR”UômjÏÖ/‹±ßíÁuñ#Äz‡5ÏÚëÅžñ·Šþ-ëþ ¶ø)á8Ðî<=àÿŠšwÃý~Oiíoâk/ i:ñ‡†<áë¿xC³ø†÷[ÐaÒ´e¸ÔíìSòþëö†67w6ßµ?íse}gs5åçÃíÚêÒîÞV†âÚêÞoŽé5½Å¼ÈñO ¨²E"2:«)õÖïþ «ã¿Ù¯â¯‹´€©ð#áŧï|uðO„šûÀŸüWâ?i><ø7ãWÄTÕï~?Ë ø¹uß‹? ¼¬ê·‡#ѵ»ãÃëáÀÞ(ñ/ï¿ uO‡ õSRÖoþ-Ä÷ú®¡w©ß5¯‚¬ôëf»¾¹’îäÛéún±i§ið¥s …­µ•¬{`µ·†Ò%Tháý•7^¶aüö±xL ~Ó–<ë–89F-Ië&“Ñ6•҇ {_YžaG²§í”²l"—µå‡=㪤T¹÷JRWÑJKWö÷Á_ÿ¾%xgâÇÅ¿…?þ-k:“¤ê!ø#âoÛoˆ~×F¥àïÚW^Òã}gÂzΗ¬¦—=ôz®ž÷ §k–:uüW6Éðkö­ðÿÂ/ÿ¿g¿ é_5/|Oð©øqâÏ|Aðï‰üW¯øòÃPÔFÑoü=ñ/ÃמÒô?ëz¿Žôí+T]nÒ÷ÆÖžñËÛXkÿ<º'ûF|Sð¿íUãx¿ÆÿÃê¿~ xOàŽˆ>x+Ç–³ü:øOðÇOøiðÏFÕ ñ‡Å¿´óx?ÁÒ4 ]ZÞK-GU†ÚMOÅ7zÞ¯,ú›VYI:”gS0§[ëq†/¦þ« ±ŽZa§Ô–Q”½õi·u¹cÍ…Y$°õkõêXžjÊ*96ìq“ŽOÙåÕ”*O¨NiT¼''N.œ9ê~ ý |WáO x?öøÉâsKñF‹©Ãÿ 'Bðg†—AF»[?øH¼)«ëõ /i÷—60ijº¿„,dk·šëÅÚ5½´³®>2þζ¯Àê?~)x«öâÑþizn­ÜüLÐ|!ðçÇ¿%Ð|Q¥ø#Zðÿˆ4ÿ|>ý¥üSáMWÃÚ®•ñ3áÝõ¶»¥ê÷šO‘㯠o¼A¥­×Â?µ†ß<_¥ø»NñVŸãOûWHŠÞ-kÂú=΋áõµÔ­µ„ñV£ k~ ŸNñ¤Z6¥¥irŸÞÁâkinìõBÊÝ w¢?ÿà¨??h_€??fï|NøE§|:ø£ªéú·ŒdÐ>j¯â-Rm/Kø) éóÜê¾&ø™âXouû}öyøK£ÂÁÔìo¾'Ïi ësÜøÚmGâÄkïç rxœDkÔÇG•/¨Ïê˜åvÞ"òXVåËRËÞŒl®£ÌÞ”ÿ±ž+KÆ,¹FölÖO‚¼÷úÓ•²ÙM(Ö²ýå*M­aΟ3ø /Žvþ)aá´ý«¿ii]Ix—Á>ƒÃÓ@A¹9øÝ¨t™L¡5šÂøEhÓHÖ—!L/ú}âØãöÊñÅÈ´ÿ…ß¾7ë¶??iü.øg¦ü'ñ7ìù{áˆ~"ñ_е-À:ƒê?µ'…5‡·Ú•®«ÞhÏñOÓÄVšV¯¬èÐÞi6’êñ—OøgðL½¶Ô5‰k66sEsu¤&€,ŸT·…„²éËz|Kµ7ȆØ\ù±q)˜0hÅ~Ãø×þ ↟<¦x>ÿàÞ•¢þɵgÄ?ÿü/âO†š¶»'†þ2ØøïÄ7¶*ÕuÝâg‡eÖ®4]bóQÔÒÎFñÜÒéW4ê>ðÅÆ‹„èÓY…ªf𵜧õ ½ÅbL:§Yá9ùœ›‚ƒ…•ܹšOÕ§X,ZŒó€úÆÚIdØE­*xßbòÅ)KÙ:ø2QKã‹•§ù¹}ûBfß^i·ßµgícîŸwqcwü þ“ɺµ™à¸ˆÉÇÉ"“Ë–7O2)6ÆävR úKözý?iŸº?ÅÿŒÿ>#|zñ—…ü?áý;ľ-ñ?„4߆zWŽï´ÿø_â¿©ÙøÇKñ?Ç_ÝêÞ$Ñ´‡>6Õ|á ë_¼Uâ? x{Äzî£i¶šMÝ»üKão|'ñ—‹¼G⸼o¡øEx¸øšëÄÿãìz-Ɖ}§Ï¡ié¡kÓNñdדZxÇHÔoa¼ð¤šÎ‚Úv©é„ÑëR]éšæ‰©ÙXjPôW¥—âg—ÕÌ*cÕ\;ÃRú®_8ÎV©¤á<=(µ~DæçH¹>x¶®±qÈÕ)K*xéæ*œž›É°N«ÏEÅMT˨BÖJóu¡ìàæÕHI«þŠx³öLý¹<áÏŽ^,ñ?¿kë önмâoŒ7ð·ÀÝHøwDø“ðÇÁÿ<3}¤Yi_µ•ö¡ã±¿x?Ç^.µøkâ›Ï‡z»kuñßÂì—1Áð<´5•ë­¤Ÿµ—íT±Ý0·‘®|áù-Õ&>[™ãž¬Lª‹¦å ÙÁûïâüëâçþühø]mãσ>ðÇÇ_x#áç_Áÿ ~ÊŸµ¬žø,žøñÆ+âßÅÛ€l>]ü‹Àº‡Æë-CÆkà­ õßÚáýýŸÃÒ.¹ªx‡Ä>ð§†"Ö®õ,j×—p-Õ÷Í^3øÅ¬|>ñ‡ŠüâÿÚö±Ò-ø¿[пhO ÛÚx{ÃÞ:›Äþý ü#¢ø,ü= h o Iá7Â"4[M[Âú¾¥ö¿­|Sñ–Ïá߯¯Š¾?ø·«øÛÃ~Öþ#x›Rñ†½¢x3Â^!‹Ãpø‡\˜ßk÷Út(ø…âfØkzÌ׺ÝÕ´úåÍ¥­ö¡uo¤Á§i1Øé¶YaióÐ¥,ʦ6–a()ca &B©rºñ‚Ž¢åVÔZœ®•ùîñÂbKFYÃÅÓÍ%,ÊÉðN”qÒi⣠C-¯Sg% ªµc8¥5R|×M~Îß>:~Òž/×µïŸþ-ø³^Ôü=cö#g'Âo |^ñŒöz…͕DŽlô|zðyñ†«dml&Ñ<%àÿxÇÅúºjšci¾™e…¿´ÿŒß|'ð£Ç_h/ÚEðwÆýRÖþxF‹áŽ4¯A¢Zør÷_Ó.n¼ûQx™<7â¯Zø»Ãø“Á^*þÄñ‡‡·´ÄÖô; .âVËý–¿jGý‘®uÈ~x¯Â6úõǃõßAãxIñ|ñ¬öëâ˜lü77ŠatŽK-ÁÖ÷šWˆ¿·<âë=ëEñ‚uíQ½´½åhoŒ×´Ïƒ~x â'ÅOYøkörð$žøwgá…V~’=*ê ÞþçT¸‹ÄדxžÒe‹ÃÚ1Ñ| £j ¬k>ð–­x³ÆŽ¿8znn¿×§Ž§%^qÃ¥‚ÀÅK¹#…ã…©ÍÍEBR”¹eÎÚtéòò©Â¬–Oý¤ñ´êG5…k&Á¨Ï” w†[YÉÊ‚§)9¸MM¸Ê•'gø•ñ© ÿêsðú¸nU\•Ÿ´§ÿ¤­Oª•¯JÚ®_þ@÷…Í·ö@øßÝø û;·åà¿ü.ðŸí £xáCx å|O-Ú'ŤÓmn,‡…5£ñú…¦^jÉ$âéo<#u¥I®éÄZ^,Ú‚X¤O§”šèþêü*ß²'ìþ’ÈßgEpKPø7À!Á+‚7rT†ÂE=rx#ÂqZÛßKá¹c²»–æ [É.5¤µ¹žÌ@ná·¸kÑÒÚ‹«csnϸ€ÊKîlÂRƒ¦ã­Ü“Òöþ¿×o6m…W‹Oû­tií¿š{uµºž¡áïÚ3ÂÞ·ðm¥·ˆ¼[eá üU¨%Ÿˆlô].ÃW‹ÄzN—¥§‚5« +ÍZ=GÂI%Œ×šµìòCSIþÃgc£/’‡¾+øÆZg„¯®üM­Æð|Eø‹®ëz[é’ê¾,Óô¯ÃákÍhÞC¢xWS·ŽëIºÒvÁ¯Ø]E0ÝcÚÂÑÛ/qà/ ÚYØê7^º¶ÓõAptËë‰5Ølõi(‚ìØÜÉx°Ý‹Yˆ†àÛ¼žD¤G.×8­…6¥½…Þ™àoQµÕu ô.æÂ×Ä×–ú–©kn.îtÛ ­ç’;ÍBÞÕ–æ{;v’ævIÆCWŸí*4âÕî£ÒÛr$ûÙò®»¿“ëä‡{Y÷ë×Nú¿KöÐ×½øé¡X|iÔ¾)xtë7zmÇÅ~!ÛhZÖ™¤ÚHâãRÔõk»[™¢Õ5˜ãL—P6Zsˆg¶Ôbw¾»ŽÆH’Åö¯>2ø/Y¶ø…tºƒi÷—?ôÿXͪiË\ñ´n}VâËÃVwú%¦nl$kýZ=ž‘c(º¼Ôn¦<êçÀ¾²¿¸Òï<3=¦§iw-…Ös6·ýµô5¼öWrÞ¥Ä7pζÒF³G2´NŠà¨Û¼øAœ5¨|9ñ€Ñì­5-\ÞXxªÔizuüâÚÂÿQ3Ê‚ÆÊöä‹{K«Ÿ* ™ÈŠO–…R¦½nÛzuz?žÞzk ½œt³i®[;î“OóôÕö±â¿ð‘/÷ÿñãþ4ÂD¿ßÿÇø×¢Â+àúGÿú¯ÿ,(ÿ„WÀÿôÿõ_þXVF§ÿÂD¿ßÿÇøÑÿ ÿÿ?ã^‰ÿ¯ÿè þê¿ü°£þ_ÿÐ?üÕùa@wÿ ÿÿ?ãGü$Kýÿüxÿz'ü"¾ÿ 4øªÿòÂøE|ÿ@hÿð?Uÿå…yßü$Kýÿüxÿð‘/÷ÿñãþ5èŸðŠøþ€Ñÿà~«ÿË ?áð?ý£ÿÀýWÿ–çð‘/÷ÿñãþ4ÂD¿ßÿÇø×¢Â+àúGÿú¯ÿ,(ÿ„WÀÿôÿõ_þXPб–¬/¼MñºÙÛû3ü]“ÎÛhëÓ?íWô‰ãÿ¹©ÿ»'òüñþÊš?‡4Wã…î¦,qþÍ_e»½‘ž1a¦HbÅÍÔñ.÷>}›—ìGˆ>:ø§Ä\½¿ÂãºS³Îñ¶šJïnÙ¤ŸÇüëÕÁÔ…:2Svm¶—Y][O×üÎJДªÁ¥¤^¿7LãþÙ-÷ìóð’7Ðn5ð–nâÚÛP:kÀVÿUhi§˜ª R„¶Kn#åÈû À+_¥¼¾ ÜSÌ,z‘Ó=Ï5óWìû¡é>"øð®-LK´Ck¤¶7ú•ºÛ\¶£¨†Äú]儳ˆ÷:#4.>(0R¿Mø Gƨ¢0È—ÚŠ"îp+Ù…ÁÉfÂŒd’ORKW¥…·´ƒ¶ñ¦ÿô†¾gwîIvOñ±ðïü+ãÏÅÙÃà_Áω_ üsmàjOÛWö3ð‰¿µ&ð]‡†ü]ðãâwÇÿ|>ø‡àkÞ5ð¯Ší¼'á­ž#Ô¿´|c¡Úé¾$ð«YÁ®éÚ½¼V7–ן‘ßµ7üöŸÕ|Káûß„Z¬?í¾§í]¤ü[𞂾'xs^ñ'ì·ÿý™?d-WÅÖÞ&ñ¿Ãk_xçáïˆ|9㟶Ÿà/ i¿ üuv |ûô±ðwá‡ögÃI5†ºwü ÞûÃÝ^;ȵõ_Úf  êQêA~—Ú z}ÊÞÃДM8öO<üýðüGž3ý½ü[û MðkÀšeÏßj¿aøùe©øWYø} øSáî½ám3ÁÚT-õ=ö7>8–ãâ÷ìù4šaø5à[o üD¾ø…â}ÇÞµ»âg?Œß´Ä_Ùö÷ø±âññï¿iïø(7€þëZƒ¾¾‘ð³Áß³‡Çÿ‹~øo øEÓü¡Á®$~ð–¥j:‡Ä ¯jº…ÜCQšù[ÓûO„?¬5{}~Çá/Ã{-vÓž ñõ¦·kà¿ÛjöÞ;ñm¼~*ñ­¾£œ·ø·ÄÖ–ÖÖ¾ ñs®³­[[Á¥yqQ¢ùï€ÿe?Ùçῇ¾*xCÃ_ mn¼ñ«â7Œ¾,üHðGŒüIã/‰^×|ñƯÄëÖž øâx_ÃQøÆºÎ£âmKF𮕡è2jÓEs—ZY}œÀeoÚ#â?dø&ßÄ_j¿|aãÚ[áÀ ÏŠÞ'ñ—t/†ZÎ¥â_þÍ—?|Y®ü:ð†á+­â5i/,ß ´üg§øVïÅ~)±¾µ±ð`Ð5/”î?nÚÁVÜ|ý¿üyðáôÞ%³ðï…µ»?‡? > ø›IÒ¯§øAð–;]EôcÅþ ¸R¸ð\ºÔW©¡«­mŠ}¯à‰·?üðçÇ×^ŸXÖ|I èŸlÕo…¨Òì¼]¦#}§Zðß„µ)>Ò¶‹s‰ô+0†]½Ì+ÌÝÏÁo€_ ?gÍ?ÇZw¯ êÚ<~#ëü}{â|Bø…­ø§â/ˆ´Ÿè:ljµOüFñGŠõ÷¸¼Ñü-áý=lâÔâÓ- Ó!û•»<Í/Gã6VÕü)µí+Üà±ÏüSž"þñ$`z`Ãü?û~Ÿþ—Z?ôg€x*Álõ¦eðýÖ‰çø’õÌ—‘¿øð׋ìÊ71¿ëcå¯â;ã7ìÙûx·â7ÄüLý§-þ|U×jßÚfµðþ/‹ <šÆ¿£ë¿¶u׆¾]x[Ò%Õü/eãsð£öoñ ×Äˈcººøù|–ºÔ"óEM'û¨‡ÃÚ‡ªhòhújØI¬ßMzâ÷T»72ÿÂ1âVóÔo¯]ÎËU‚3»T þE·çíâ}+öâý¯´‰¼/ðÃ\Gí+ñ¯IµÔ|Ið›á‡ˆµ‡°Ó>"ø†ËO‚ëY×<¨j—¢ÎÊ--ÞòòâH­ †qH«ã¼º¦*ŸÖ= ÿá‹ø5ÇþXÏ4ÃHø‡þ„‚øbþ qÿ–óÍ?ìø¯ù§°?øQƒòþç’þ›–Ÿñ‡eÝ?æ3ýßú†éÿ¶¿3Ÿÿ††øµÿC]ÏþéœäóÍðÐß¿èk¹ÿÀ=3ü‘þy®ƒþGÄ?ô |ÿÃðkü°ÿžhÿ†‘ñýÿðÅüãÿ,?çš?³â¿æžÀÿáFËûžKúlZÆ—tÿ˜Ì÷ê§þÚüÈn?h‹+áý2aâÛ’ÒjúÚö=3…K?²ãýÖFêMbÿÃC|Zÿ¡®çÿôÎ?òGùæ»yÿh¯¦‡¦Ü ð\‰µMb?(ü ø5塆ÓCmê¿ðpò ‚¹êV(ÁÎÑYðÒ>!ÿ¡à§þ¿ƒ_üÁ×N+/J¬áÜÙð®Ïƒ–øj.÷pz;&–Ëe £•¿äŽË—½->¹ƒþû۪앶º_§ÿðLoxcö–øg'Ç{}ÛÃ60jz_Š~%jß¾ü½ƒÁ°^øsQ¹Ðü9«üAÐ.|;â¯^úÒÇÂÚÔ¼)s>¡â?Wñ·¼/ðkÁž;š´?à :Gƒ??fþÏ?µ;xµm|3ñkáÿŒ¼wð£âŽßÄ:oÂ_†ž1×~"èwÿ Û*Ô¢ñ”œpôœ`£AFªq\®2“T¢©.ou7y>,&Mˆ¡S:ü3‚ÄûlT«Ð‹ÇÒåÃQ”iÆxÆ¥9ÅF N|´á W›´.œŸsðcâGŒ~&xïKðŒì¦ø… ßù—Sø[v™¥\j×z0]cKÒì5“¥Ü6‹­êv𠾦Ê-ŽªÂâÞúÅî´ë¿ßŸì§áoƒÿ4‡öOø9ñ£á•ÿŠh/Ùûâgƒü;ñUÿd¯|JøëðOÄéðãÄ_üY}ñB_ÃÁÿ ~>‡ð¯Qðt~!šïBÕü;§ØÝ‹­#ùÀ¼ý¢üWslöÖžøwáö’k9š÷Â? >x;VÍí¾¡oÖ|/á]#U[µÚ[K=¨½×B%Šê)¢,†ÜŸ´¯‰&w’Oüy%fyü ø5¹¤s¹ØãÀ@ÌIÀ á@œri,M\D²|¨Õ§Jð«M:)9:•õýÇûBœ Õ(©ÿ³ÅÕn𱚺ÇWÅO…ðÃÕ£‡§K |#i9{jötý…ñ8OÙÒ„ÚÃAÔœôPĵý¡¾- á'Å2ȱ’²ØiRÆØuùdŠM=â•£E":H¹WR¤ŠþœÿeÙkþ ýâŸÙÓá?Š>*~Ðñ|ø‹â?‰šž•â‡ñü[øoáIlõ=CQñ«cðjÿÃÞ#Ðä×ô{J6Ó#½ø««ÊÎrÖ0k:E¤6z6›üÓ/í'â4`ñøàª:°duøðl20åYü y ¤dpp~¶ôÚÅ‚ÊòÒïAø{®ýŽÃT¹Kß|5øwã]þÛªIª\Ã.µâŸ êú¼¶ï}w4Vòß<ÞiŠÚ8aTŒuPɧS1Âb#“`£J…i^?ø§à½&Þáþø@Õtx›Dð×Ⱥe†¯xÏeá¯\éúŽö›[ Vÿò÷ágÅüGñ®›à—ñ—†|Cý®­¡Í­±0[XϨũÇygf—Ö¡\ÙÁ­É%œöÒOm§Ïc<âÆîéšÿ†‘ñ?ñ@|ÿÃðk§üPãTõÚÄ×ú}柆>èbö%‚mC ~x?\H±Ë$V¾!ð¿…trÅ.<± ÚØêÿkµy¬î<ÛK‹ˆ%Ó”ʾ¶ŽO‚ÁÕ«Jt©bþ³‡o Rqå†!:QU¯EÚ¢t¤ª^>䔬ÍqyU|F†Ãp¾^µ Ñ¡ŒŽ6ƒž­H(CJ„+sГUbéÔ…Nh.YÆ^òþ <û~Ì£à×|tÿõ/ü[ðoÁÿ x’/‡~ý»ÿa_x3Åßuy~+j>4ðþ‹©ë¾ðΠ.¾h^ðt>- ¦x#ÂÞ3ñO‰…ðjßSðñð牼Iü¶§í ñi¤E>+¹Ã:©ÿDÓx€8ÿB®ŽÚcÅSKquàƒ773ÈòÏsqð?àä³M4Œ^Ie•üL’HìY݉,Ä“ÉÍCÿ #âÞø(b>üÈ>£><ýsWK,TéB›È0.Q„båõ¬,®â’r¼âæõW÷›—}niC-*4é¾ËÜ¡NrúöWj0MÞ¥ MÝÝÞNí-zŸ»ÿ¾þÇöŸ°­‡ÇøªHþ?ÂÀ³Ôeø ¥|}ø]ðNïâî¿ñƒöMðîŸáËIüSà¯\xLøƒà¿Šÿ´=äþ<“KÔü%àY¿gÖÕà¶Ò4ȼE¦ê˜ÿ·ÿÅO|:ý®~0|=ý™|u¨êÿ|¨xsÁzf¶úµŠôÍÅ~ðo‡´O‰šÿ…[mÂI®ÆÂØÜOælë?´Wˆmõ bÿ„à«â6Üß> –ùìíÜŒŸrm£ý1Šx Žx\¾¤jäøLUJxŠq©_ë´¥ Ò©õ‰Æn8ŽzŽV‹³“÷}åk4reù6#F•O ౕãí¥S<œÝYJ²”dÖ&ZœÎ2÷¹¥.V¬¬¶àgÂ?´ÅÙ´ïÚ;ZƒOðÇ…¼7ñSÐ¥á[ÝÄ)¬C÷üsá—ì‹ð?ö}ñŒd¯Ú.÷ÅÞ/ð'íâo‡š‡Šþ |/ñ¬Ÿ¼}ñËö¥ðׇ%þоÔÿáhiÚM—ˆWö{±ð‚]øcÄ'Ôüogü¸ÞþÑ^%»³¼³‹Â ´¶ÚÜÙK}áß„ÿ |5¬Åmw ÛÝ%–¹ ø?NÖ4縷–X$šÂúÚs ’EævV´ÿ´·Š§a%çƒþêW;#I¯õOƒ? uMJñ£cûEþ¥à‹‹ýBò]¡îo¯®./.æi'ºžiä’FK'ŒX·“à«: ±t£ÉWMâ,­‡n¤i¹({déFòqåQKˆ–b±’ᜠÃ}OêñÁ,}(Æoh§,BЦ°îU ãNRöJ²ö0~ÒQISÌ¿ø÷ñNËR¼²·ñäzŵ­õÍ¥¾«¦Ø¬V¤\<1j1jÚ—ªÇe~ˆ·V©©éš~ É¼°´¹Y-ãýôý¿fÏ‚¿þjÞ#øÙ©[ü ¹ñW‹~[[ø£Cý©ÿgoƒþ2Vñ‡‰¼ ¦üEñÿü+Œ~ÞøÃno>#뺒ë7­ªO­èž øCà o´¯‰~,Ò?᤼CÛÀÁìGÀ¿ƒyÔÅÔTÿ´w‹¢‚ëÃÿõ¥½Ôîµmž$øgðëÄÑØ\ÝÁgm4*kþÔW@ÒVÞÂÎmD’@¢ËN·Üû|žu«ákC'ÁQ§†œçVŠÅQO¥XSjšTœa+T~ÙI'Èœ›iâ2|M|N µ>ÀP£†Ib(GE}n3¦¡N”Õ:0§(S›U_·HóS\±RnQû_þ dý™~9ê? þ |M×üYðöÀÉ}¡x›YøƒðGâ½Þ½k}g¥I¬¾"ø5džÓc¾¶X.…µ{=;ÅžšIìµË%qoqqþ Ä|ûF~Òð‡íCâäðÿà Ÿ;TÖ#òÀσ^\fM Œˆ¿ðc|¢`²¥bŒdíƒ'íâãs§ÜZøáæ’º}Ä×?bоü;Ðt­NK‹­5ÓÄ:Ná[-3ĶËc}{oŸˆ-u+8êá¡‚9%‘Û§7É犃¡K%ÁàªJ†J¯Öè¶ã8yÔ‡5J©biÆT]¤¡UûE*|ÑsÉñ8ÌL>†08:Ò© *ëF/’xT«IÊ…*UT14ã,<¹jYB¬¹ãR TåûÛûrþÉ_>þÍ¿¾9~Îß¶7…¼OñÁß4[ÍàÝÇÇŸƒ^8¹Ô¾Éá¿èÿ/t}#BðNŸ­ÝøÛÀ_üg¬x6ÃK“ÅÚ´Ú÷Ãë^<‚+ö’T´üVøñÇâ~»ñËᇨ<þ7°Ö¾%øG½ðqƒO€øžÏTñ.™§Ýh1]ŧK=Œú´2XÛjV‹öí6æx¯ì+ÛkyS‚ÿ†‘ñ Î|ðPŸSð/àÖ}Ïüˆ|“ßúWuð»öŽñ<ßþAoá…:T—^6ðµ Ô4/„? ôfÍ.õ»ifÒõ½#Á–z¶“|‘Êæ×RÓ/-5 )Â\ÙÜÁqr,K,R¥:qÈ00”á(FrÅa½Öãʧ)F§ºí&âÜ´m{Ìê«–Ô ”©ð†]“¥(FrÆá’RpQŒœ£‡uNÎñ|Êͦž§õñCöcý‚oh–WßÓHŠ¿f­ÌÛVS†ÊêP¡F•NÀU© TéÔ¨ñô&§(Æ*RNµ ͦîï)94—3íûiû|ý•>-~Ç¿>+ü{øãgðã4z–¥áín_xÃku6ðã¶»á­eü®iê>=’ëâÏÿ‚~Õ´ÿ_Ú5ÝÇï2ò;]u4¿Eñ_íât¿Ù³ö˜×~üø³âOø Að׎ÛǺ¿Ä/_­ü}ý•â‰ú‡¾ xvûàÕ³éžð×¼ ø?ƺ_€|f‘øÿÃ?ÛÓŬI¨iw:­¨|1íâøäÔã@ø{ªÃ¨\Û]?]økðï^Òt¹m,`Ó"Oé:Ç…otß Û5…­¥¼ö^µÓ,®VÒÕî-å’ÞMÝöŠñÅä±ÿ ðZZUªÊ¥4~±N¬Ôp”§ -7Ì“…Ê* ö_ÙWÆš×Å_‰úF‹ñLOˆ“ªh^ ŠÒëž ø^t‹»=sNÓßZ?ü_ êžð}ž§êº…Ýî«ãM;Sð=’C©â½'P°ÒÐCúÛñŸà·ìIá þß:·ƒÿmÍ"/‰ÿ?g…?>|ºñ¤ïÙ> jÐþÊ×¾=ÒÇ~øk¯ø#âÍî§®üUø½ðëCøwáßÅâÿ†úÃ×ñå×ü%>©ã_þOûFøµ¤°{O|:Ñ¿³µK=YcðïÃ/‡^†þæÀN[k°è^Ó¢ñŒés:]ø{^MGAÔößé·!T ÿ᤼CÏüP?2Nr~ü'ÿP.§œúç â°†M8bñ8‰å:´«ªQ£†úå+a½’jzI{$êÊÓ½›×Ú6÷ª96&Ü^&§ àªÐ¯ øõñOP×4« «é¼Mmykk?‡ÏM ®Ã<ñÃ.ÄéÒ…ŒnÖ{¼© yÛÕ”ýMMû6þÊ÷ž ðïˆ>5K¬|3×¾ |Jøõ¤jžðíaû2ø²O }»SñD_ ¼gñ?áCðgÇ>Šû_´)Öü¡ëzü?µ»¼ñÏŽÓÅÞ0ðî‹¢-ƒö’ñJókàï„ZuÁC¥|øI¦jVrUnl5[ßi÷p±Û^YÏÕ´Ê“[M¨Ž=“ö‹ý üO¦|~øÛ¦Ïá…úÙÓþ-|F±‡Rñ'Âo†>$Öæµ´ñ†³ª_ëº÷„5cS’ xã.5ë« qÅæã*™G6aB¿ö4ã…¯MÒŽ.œ¦êPq›ä¶Æ 5yGÚÞV‹åº~´2š²Áâ«ÿª™|iG€¦èGNuê¿m¼5ðûãýý¯‰ô‹ŸxcXÓ®õÇ^øEð§û/JÓ¯,õ;¿‰ëÞ'Ò5ýV 2óJüQÿ†‘ñýÿðÅüÿæ¿ãõ¨!ý£¼YΧ<žøu}©ý—'TøgðïUðþ˜4{{›kAáïê>¹Ðü2+Ë–Ô‡´ý,j÷2 ÍX^ÝÇɦ''©^XWK(ÁaᇯÕé¬Uñ”T%Ma›¥«F¤éâR¬Ý',:¼\ù|œfO‰ÄË*<3ÃSÃb¡_J8ú1úõÒ5…¨éQ…áӥеoiMÔÂA8s8Î¥_ðUoøOö5øå¢|=ýš~9kÿ¾jZoˆ.lþ!êg¿ŠÑø˜èÞ%¼ÐcÔì-¾ X[\x.ÎãìSIo¤xßNµÔµ[G´×ôKCCÔ-îÌ¿³‹¤ø½ñçžøÕ®;ü4ºñ„o¼Oâ¹íthG€të kAš 'Ò.ìØ˜o¤Z•µÖ”Óë°]jV¬vƒO¹ùØ~Ò>!'þD‚|àÉ ø5Ç?ö!ûãœôuÍÏþÐþ.Kÿ"ÏBø}¢kíSûG†>|<ð­ÕÕÆšÖÚ…œ:…׆ü+¥\jZj]Å óhú„·:MÛÁ¼²¸òb ÙˆÉç‰Ê±”(ä¸,%J•ðц-bè'‡—&"Õ¢£QÎ)sAÅÞð¶ÒaÊq¬=\6…ð:ÕiJ±ÇQSÃMÊ“h:4iÕç§g*mN>ôydÔdïý!~Ø_³ïìð¿áíU}ðOö–÷â7Ã_ÅãŸêZÏÆo„?~C¨Xé²›àþ?ƒ¼[¤øçUø›ã h¾2ðmñð7|!v×úÇ…oo´µÐ5»ß 3v?´?Å¥¼µcâWºÛq yfuo.ÙTùSÚÜi³[\Ã&6Ëoq°M1K‘»)Öÿ†’ñ äøà¡'©?þ džäãÀ@sßñÆ8§ÇûKxš k|·ž'Y!žßbšQƒ$±Hžˆà::ÊÀ2@5”r¸¨r.À¶â£Í,VÝÚÉ»ÅÉ&õvwߩҲÙF›‚á ¤à£Ï*_øNÏÁÍûKüŠ_øqþ~Òÿ‡Ú|!¨è/㯉~øI %—µM?Ĥ­åÑüiƒãß[ø'ñoö½ø?ÂÚ›ö†øgð?â¤Þ6ø;à/Œ|'ðÇÅÑêÞñjx‹Àú‰µ;Ú²ø£EÑ4Ý#Ä {¥ÛÛÌ5}6ÆÚÊü7Ú-âXäR|.Ãö‰ñEŽ›c¦Má†ÚàÓ¢– }GÅŸ ~øÇ^’®îo|»ßxŸÂ𾽩eºš;S¨êW-gf °µhlmm-¡±ÿ #ââø)ìGÀ¿ƒ\sïà.‡§<Ö8LžX\=òŒ:½*q§[,U}j¤l¥ˆqÄ)TR­$êKÚ7?y©=†_“â0˜L>Ã8,~&•(ÓÄcjãèÊxʱ·´ÅMW¥Vjuåz³Sœ¤¤Ü\¥kŸ²ÿðK_…¿³/í |SñGíuñfƒºŸ…|9k£xØø×Àßnnôˆ¾#èºG‰üT—>)Ñn-ñ‡‰þ#7Žþø£ÂÞ(»×¾ü-ñDïá_|>ž>øK‡Î*Jp96# ñN¿ àqrÄbêâ)ÊXúOÙQ¨àéaÔkS¨¢°ñJ”U%\”ãË/r<οñw⋼ªhúÿˆf¾Ó.u}+ε{[ÒC W·1þòH¦f‚'%*7Šÿd¿Ù“þE_Ù/þÍ@ÿê7ðF¿Ç3Äßu_ø'VÒo¼#ðÇN·ºÔ´èÞ|-øoámN9#†òæmõ xOIÖ-ŠK Þþ8î`im.D¶ÓK ÿ±ŸìÉÿ"¯ì—ÿf õø#^Þ'°ø|¾+KÌ”½*°¬¤½¢^ÕºiBVåPZ¥Þúý–GIÑ¡^/,£•~öRXz5iÕ„ýÊ½æ¥ i9[•ÅÆö‚w×NÛãü…~ÙMðþœ¾Sÿ‚ÿÉ‚øûþÀŸõ9ø}_V|bÿ¯Ãû)¾ÿÓƒWÊðQ¿ù0_ØàÏþ§?«Í—ÇWüt¿ô”} Þ—£üà{ÂæÛû |n›~þÎçòðg€~ øGã—‚t¿„1x/\¸Õî¯í›â£Máøô=2ãJÕî|gáï é~¾>"žðßi³øgXÒe×?w§Ì–¶Ë/u1‹÷áZ+þÈŸÇÈÿgEr ´ø7À*ÀÄ‚yí׌Wó¶| á ªæ-H#³*1Ô&Úì»w*·—†eÜ»€$ËœdW.>rƒ§Ëf¯=Z¾ÞÉÞÝ:ab¥wkr½žÚþ_4}#/í)ðš÷þgð‡ŠMðsøÞ;ßêz¾‹¯hLJµÃznàÛkè´ ïK±º}&ioõÑÖµ¦È²êvó_ëZ€½²æ‰?ooMµ…Œ^%ÑtnÛÂWZ&ï iº•’%Œ‘Ø]é½ÔZlkláL@¥«xÜÿ<3jP]ZkÆEÝžòæê ’%Ü ñ•ÈÏz#øyá™V7ŠÓX‘eÅGyrë$ª»š8ÊÄCÈ«óRX/$cšàug.dãm¯hÛn[mÒÉ+i«gO²ŠµžÏMo£éÛ«³ô^žŸ¨|gð~ŸñßTø•¤]\ëÞŸâÌ^>¶±Õ|7ei©Íaw«jzÅÄ»ßßKo&š×©ltø¯Í†±:Ã{pQ¬­•6/>&xU·ø—}£ßéÖM/ÁËÝ\ϧi^—Åþ2¸ø¢ê’Ýh¾Óîî-ívèÖé ÜzrˆÝô›Zî8'ÔŠ·‰·€ü&ŽÑ¼:šÈŒQãmBeuum¬Œ†0ÊÁ¾R¤‚3S¿ÃŸ Åæy–:Ô~J$’ﻺO*9lrIº±¾Tf³p¤šJ´ýôÒwnúkªM½–ÿ>ãökMvK¯KÆÝ<š_%éÂÂF?ç¡ÿ¾ÏøÑÿ ÿž‡þû?ã]ü Þþî¡ÿƒ)øŠ?áð÷uüKÿÄVFšù~>_ð3Žÿ„ŒÏCÿ}Ÿñ£þ1ÿ=ýöÆ»øA¼ýÝCÿRÿñ àÿîêø2—ÿˆ 5òü|¿àþgÿ ÿž‡þû?ãGü$cþzûìÿv?ðƒx?ûº‡þ ¥ÿâ(ÿ„ÁÿÝÔ?ðe/ÿ@kåøùÁü<Î;þ1ÿ=ýöÆøHÇüô?÷Ùÿìáð÷uüKÿÄQÿ7ƒÿ»¨àÊ_þ"€×Ëñòÿƒøyœwü$cþzûìÿð‘ùèï³þ5Øÿ àÿîêø2—ÿˆ£þoÿwPÿÁ”¿üE¯—ãåÿðó>‰ý5·ëŸ¡Þ[³Æ)1¸Ÿ»e¥.y?í×뵟ü{Eþâÿè"¿*?eO hN§ñÎïL[¡rfŒ“=ãÜ'’ú~˜Í„ePrG†ç2ާªöñíû‹ÿ ŠèðáÿoéFSøŸËòG¨~Í_òB>ÿØOý:jô‚?ãçUÿ°Ž¥ÿ£-+çßÙ«þHGÃ?ûIÿ§MB¾‚ðGü|ê¿öÔ¿ôe¥{øOŽŸø)ÿ퇙_iú/ÉEW²pQ@Q@yÿŒ?ä-áOû ^ÿê9â*ô óÿÈ[Ÿö½ÿÔsÄU†#øöý?ý.&´~5èÎJÿþB>ÿ°­÷þ¢Þ#¯ñ–ÿ‚ŠÉüþÚ_ötßõgøž¿Ù¦ÿþB>ÿ°­÷þ¢Þ#¯ñ–ÿ‚ŠÉüþÚ_ötßõgøž¯.ÿpÅÿØVÿMbGˆøéÿ†§çLøÖŠ(­ BŠ( Š(  û¯ù´û ëßúCáÊÀ­û¯ù´û ëßúCáÊÀ®Ìwñ¡ÿ`¸/ýD %·Î_› (¢¸ÆQE»¡ýÝcþÀ×ú2 ­Ýîëö»ÿÑW^ýæ“ÿÒ3ø_ËóFQ\²Ýú¿Ì ¢Š)QE«Ô}Gó­¿ÿÈZoú÷ÓÿôßkX‹Ô}Gó­¿ÿÈZoú÷Óÿôßk]ÿpÄÿØVÿMbÉÃ/ÎQ\eQ@Q@÷_ò-hÿö׿ô‡Ã•[÷_ò-hÿö׿ô‡Ã•]˜ïãCþÁp_ú‰@Koœ¿6è ¿äª|4ÿ²àßýHôÚóúô„ßòU>Ù@ðoþ¤zmqŒêi/ù8ŸŸöZ~)ÿês®×‹W´þÒ_òq??ì´üSÿÔç]¯ ·¼9ÿ!ÿì âOýGµJÁ­ïÈFûø“ÿQíRºðïØ?û ¡ÿ§")lýäa7Sõ?Î’•ºŸ©þt•Ë-ß«üÆ9>úÿ¼¿ÌWº~Ô?òr??ì²|MÿÔ×[¯ O¾¿ï/óüœÇÏû,Ÿõ5ÖëŸýz­ÿ¥Ð=_ò*ÆØnÿLãO ¢Š+SÎz¨þuµâ/ù Üÿ¹kÿ¤V*õQüëkÄ_ò¹ÿr×ÿI ®È¸bì+ ÿ¦±d¿Ž?á—çŠ(®2‚Š( Š(  Èä]½ÿ°Å‡þêuþÒ¿³'üŠ¿²_ýšÿÔoà‹T?ò.ÞÿØbÃÿHu:ÿi_Ù“þE_Ù/þÍ@ÿê7ðF§7ørÏúóý:Ͱÿþ_’;oŒ_òøqÿe7ÁÿúpjùOþ 7ÿ& ãïû|ÿÔçáõ}Yñ‹þB¿?ì¦ø?ÿN _)ÿÁFÿäÁ|}ÿ`Oƒ?úœü>¯__ñÒÿÒQÚ÷¥èÿ8ãðµ¶þÈ?›û¿ÿgfü¼à#_Šø¯ðêƒV~ñ£¢M¬isüY»]÷·š†»&©â?xZ×ÀZ†ƒâUÓ&´Ò"Ó¼I¥>£­Dš®™$úuœ¶óG©}ª3ûað±OÙàm²|ýQˆÆB·ƒ|¬Fà@ ‚A Ž+ùÑÿ…qáÏú k÷öÃÿ+›QÁÓÒ÷uË÷O³ò¾ÆØX©EÝÚÎ>ËÓ_¾ÇÔz§Æ†~"ñƒâo‰ZÆã[Ö¸ñ…ïŒl¼;§xæM3TÐõ[KItßè£ÆQZÉá¯Í­K©NšÎ‡‡‡ô+U¶šu&ˆi“Ðñ?´ÙtO‡·žø‡ ø[C·ø§ñNöÞûN“RÐáðí–¡aá94[™ü Zêž,ÓÆ—o}£%õ¾‹×iyÕo"iïdù¯þLJ?è)­ÿßÛþ@ ü7ðçý5¿ûûaøtÿÄW«'§*wi·¯3Ö-êº>[|Ûëc«Ù­m.Šú{Öèþvë·d{~¯ñ?ÀÖŸ´³ãæÕ´?xBçãñ¢Ë∯oôKYÕu©c𯓣7•b—6ðë–—QÃuq¨ÇlºD×¶îìuÚ§ÄÍ[·ø±{¤ø²Îò;‚ZN—â ·u»M']ñpø‹£^[ÛxSLñÕì~*Ô­­´uIšÖK9^Òþ jòÞÞÛN– æ/øWÿ ¦·ÿl?ùƒðßßôÖÿïí‡ÿ ˆ©Uei+&›”š¶«š××§Ï»èÆé«¦ÛºQW륭óm~?=ÿ ÿžŸúøQÿ ÿžŸúøWCÿ ãßôÖÿïí‡ÿ Qÿ ãßôÖÿïí‡ÿ VF‡=ÿ ÿžŸúøQÿ ÿžŸúøWCÿ ãßôÖÿïí‡ÿ Qÿ ãßôÖÿïí‡ÿ P=ÿ ÿžŸúøQÿ ÿžŸúøWCÿ ãßôÖÿïí‡ÿ Qÿ ãßôÖÿïí‡ÿ P=ÿ ÿžŸúøQÿ ÿžŸúøWCÿ ãßôÖÿïí‡ÿ Qÿ ãßôÖÿïí‡ÿ P=ÿ ÿžŸúøQÿ ÿžŸúøWCÿ ãßôÖÿïí‡ÿ Qÿ ãßôÖÿïí‡ÿ PÒÿ²¬/µ¯Ž°ïÎßÙ‡ãŸÃ–ÇJ=8ù½kõÆÏþ=¢ÿqô_”²‡„tUøé{a{¨ÜLß³/Æ wolÑ’ÃLvaäÚÂáÃF Ì0X$‚?W,ÿãÚ/÷ÿAÑáÃþÞÿÒŒgñ?—äPýš¿ä„|3ÿ°ŸútÔ+è/ÇΫÿaKÿFZWÏ¿³Wü†ö“ÿNš…}àøùÕì#©èËJ÷ðŸ?ðSÿÛ2¾Óô_’=Š(¯dà (¢€ (¢€ óÿÈ[Ÿö½ÿÔsÄUèçþ0ÿ·…?ì%{ÿ¨çˆ« Gðÿíúú\MhükÑœ•ÿü„|9ÿa[ïýE¼G_ã-ÿÿ“ùý´¿ìé¾<ÿêÏñ=³Mÿü„|9ÿa[ïýE¼G_ã-ÿÿ“ùý´¿ìé¾<ÿêÏñ=^]þá‹ÿ°¬/þšÄñÓÿ OΙñ­QZ…Q@Q@÷_ò-hÿö׿ô‡Ã•[÷_ò-hÿö׿ô‡Ã•]˜ïãCþÁp_ú‰@Koœ¿6QEqŒ(¢Š+wCûºÇý®ÿôd…[ºÝÖ?ì wÿ£ ®¼ûÌ='ÿ¤2gð¿—æŒ*(¢¹e»õ™AER¢Š(W¨úç[~#ÿ´ßõï§ÿé¾Ö±¨úç[~#ÿ´ßõï§ÿé¾Ö»!þá‰ÿ°¬'þšÅ’þ8ÿ†_œ :(¢¸Ê (¢€ (¢€7î¿äZÑÿì3¯é‡+·î¿äZÑÿì3¯é‡+»1߯‡ý‚à¿õ€–ß9~l+Ð>ÉTøiÿeÁ¿ú‘éµçõè ¿äª|4ÿ²àßýHôÚãÔþÒ_òq??ì´üSÿÔç]¯¯iý¤¿äâ~>Ùiø§ÿ©Î»^-@oxsþB3ÿØÄŸúj•ƒ[ÞÿŒÿöñ'þ£Ú¥uà?ß°öCÿNDRÙú?ÈÂn§ê%+u?Süé+–[¿WùŒr}õÿy˜¯tý¨ää~>Ùdø›ÿ©®·^Ÿ}Þ_æ+Ý?jù9ŸöY>&ÿêk­Ö2þ=?úõ[ÿK z4¿äUŒÿ°Üþ™ÆžEV§œ*õQüëkÄ_ò¹ÿr×ÿI ¬Uê>£ùÖ׈¿ä/sþå¯þ’A]ÿpÄÿØVÿMbÉÃ/Î%Q\eQ@Q@ÿÈ»{ÿa‹ý!Ôëý¥fOùd¿û5ÿ¨ßÁÿ¨ä]½ÿ°Å‡þêuþÒ¿³'üŠ¿²_ýšÿÔoàNoðåŸõæúu›aþ)ü¿$vß¿ä+ðãþÊoƒÿôàÕòŸüoþLÇßöø3ÿ©ÏÃêú³ãü…~ÙMðþœ¾Sÿ‚ÿÉ‚øûþÀŸõ9ø}^¾:¿ã¥ÿ¤£µïKÑþp=Çákmý~7uøû;7åàÏé_‹^ñoÃK¯‚¶–%¸ð“júlß®ç†y58|k¡}áÏ ½:*Ûl±º³¼ñ5”Ñ_ ‘r¶ú|z“ʶêÑ;þÓ|,ŒIû!|ˆ¢O³´e€¨ox sŽ3€rG ¿:צ”¿;5÷›a`ç-RJ.éëÚßÕÏ´ ñ‡æÖ5[~ZÝø´/†´MWV¼»ÒþdéCòèº|è–š'Äéo^æÒ-(È47º²[ÍnÞH>Óªjœ÷‰5ù¬tO‡W~Õô=Ãÿð¶>*7]²º¹µð•šG¦øEôc>§¬¬¯ûh2Þ%²ê‡ûI&’ícXä2|¡ÿ ÎÏþ†+ŸüÅÿÉT³³ãþ*+ŸüEïéuÇãÛ°Íp:׺äI»YÇGuËÿÈì—[y*•œW4¶Mï²wó×ðGÐúÏ‹< gûCkzþ¯?…üGà+Œ§_{Í6ý®íî¼)ªkš¶«Ù@ ie-·öÄO§Msa,0X*Äfš û=cÅ–ÚÕ·ÅÝCMÕßY~èÒø±¬5MKÄÑüR>#èÑéº^•­jA§žÞ=%㸱[‹‹†µ¼»Ö4í>âK;@‰ò/ü+;?ú®ð_ÿ%Qÿ ÊÏþ†+ŸüÅè{ý«ŽœëÖUWªåŠæm·¶ú;»k×~÷²ctžžóÑE>ÎܯïVûúé­/øH¿Ú£þ/öªïü+;?ú®ð_ÿ%Qÿ ÎÏþ†+ŸüÅÿÉU‘©Kþ/ö¨ÿ„‹ýª»ÿ ÎÏþ†+ŸüÅÿÉT³³ÿ¡ŠçÿñòURÿ„‹ýª?á"ÿj®ÿ³³ÿ¡ŠçÿñòUð¬ìÿèb¹ÿÁ|_ü•@¿á"ÿjøH¿Ú«¿ð¬ìÿèb¹ÿÁ|_ü•Gü+;?ú®ð_ÿ%P/øH¿Ú£þ/öªïü+;?ú®ð_ÿ%Qÿ ÎÏþ†+ŸüÅÿÉTõ?ì«}·Yøë9Ûû1üa“§÷ltµÿÙ«õ®Ïþ=¢ÿqô_“¿²gƒ Ð5oŽ·±jÓ^³þÌŸmü‰-R %†–þfñ<„‘åÞCdž9ýb³ÿh¿Ü_ýWD‡û{ÿJ1ŸÄþ_’=Cöjÿ’ðÏþÀéÓP¯ ¼ÿ:¯ý„u/ýi_>þÍ_òB>ÿØOý:jô‚?ãçUÿ°Ž¥ÿ£-+ßÂ|tÿÁOÿl<ÊûOÑ~Hôz(¢½“€(¢Š(¢Š+Ïüaÿ!o ØJ÷ÿQÏW WŸøÃþBÞÿ°•ïþ£ž"¬1Ãÿ·éÿéq5£ñ¯FrWßòðçý…o¿õñŒ·üSþOçöÒÿ³¦øóÿ«?ÄõþÍ7ç‡?ì-z?? øˆWøËÁE?äþm/û:o?ú³üOW—¸bÿì+ ÿ¦±#Ä|tÿÃSó¦|kEV†!EPEPý×ü‹Z?ý†uïý!ðå`Vý×ü‹Z?ý†uïý!ðå`Wf;øÐÿ°\þ¢PÛç/Í…Q\c (¢€ ÝÐþî±ÿ`k¿ýaVî‡÷uû]ÿèÈ+¯þóIÿé ™ü/åù£ Š(®Yný_æPQE€(¢ŠUê>£ùÖ߈ÿä-7ý{éÿúoµ¬Eê>£ùÖ߈ÿä-7ý{éÿúoµ®È¸bì+ ÿ¦±d¿Ž?á—çŠ(®2‚Š( Š(  û¯ù´û ëßúCáÊÀ­û¯ù´û ëßúCáÊÀ®Ìwñ¡ÿ`¸/ýD %·Î_› ô„ßòU>Ù@ðoþ¤zmyýzÂoù*Ÿ ?ì x7ÿR=6¸Æu?´—üœOÇÏû-?ÿõ9×kÅ«Úi/ù8ŸŸöZ~)ÿês®×‹P[ÞÿŒÿöñ'þ£Ú¥`Ö÷‡?ä#?ý|Iÿ¨ö©]x÷ìý„ÐÿÓ‘¶~ò0›©úŸçIJÝOÔÿ:Jå–ïÕþcŸ}Þ_æ+Ý?jù9ŸöY>&ÿêk­×…§ß_÷—ùŠ÷OÚ‡þNGãçý–O‰¿úšëuŒ¿Oþ½VÿÒè/ùc?ì7ÿ¦q§„ÑE©ç ½GÔ:Úñü…îܵÿÒH+z¨þuµâ/ù Üÿ¹kÿ¤Wd?Ü1?ö„ÿÓX²_ÇðËó‰EWAEPEPä?ò.ÞÿØbÃÿHu:ÿi_Ù“þE_Ù/þÍ@ÿê7ðF¿Åªùoì1aÿ¤:´¯ìÉÿ"¯ì—ÿf õø#S›ü9gýy‡þfØŠ/É·Æ/ù ü8ÿ²›àÿý85|§ÿÿ“ñ÷ý> ÿêsðú¾¬øÅÿ!_‡öS|ÿ§¯”ÿà£ò`¾>ÿ°'ÁŸýN~W/ޝøéé(í{ÒôœrøXvþÈ_[û¿?gfü¼à#ý+ñÃ2ü7Õ> Û]ksx:ÛÄVR|^»ºÔŸÅšf—ã{[»xZïáí„°ê^ ÓõÏ%Þ”¦m;R†ÒÒãV¸³m5ຼ?´ cód/€1† døû;F‚Bïðg€”1Æ  'µ7¿ð­/¿èb¶ÿÀ¿ù&¹ñòPp¼TÓsV¾š{'óZacx½\mÊîºÙY/ÅÛFî}_gâox’O†~ñµÿ¬tÅðƽâ¿xÇÃZwƒü3ªèm­ ‹HÑl‡…´ËøJuïiÚV›†/¢½½½Öµý[Lºk ·öV¼G%®§|>Ò¾ý†çâ‡ÅK]gW›Áz¿‡µ &ÇÂcF‹XñÏ‹#·Òõ+DÒ¯¯/ Óõ›û[Õ.d1höš€ŽÒ‘¿áZ_ÿÐÅmÿ€3òMX>ÖšÑl[Å›¬¢™îc²6÷FÑ.]7-ÍÙ…&t`‚FP±P+ÎU•à¯îÚK}4o³Q×Íúß«Ùê­-5Ó¦«W£óMtØúCYŸÀV´&¶šÜ¾ŸááøÈYgðŸ‹|!wá…ð>§­ê×Ö°iöÚ÷Ö¦>˜,•î´Û¨ì<7miš•œwwv‘AÖk·ž>)Í¥Ûx[R‚‚ZV¹™aðë^·ð_‰GÄMO‚ÏOñW4 /@7òiS¤ójZ,6WwÚ³hڴ׳éóšøïþ¥÷ý Vßø7ÿ$Õˆ¼­[Ãso‹<˜/8ï †Þê(nÒ)±%ÌIv©:G F²‡ãzá°hö¿¹yÊW[«ôù1º{ZzÅEk¢zÂú^÷í¯_1¿ð‘ŸïŸÖøHÏ÷ÏëPÿ´¾ÿ¡ŠÛÿfÿäš?áZ_ÐÅmÿ€3òMbiuÝ_ðëï&ÿ„Œÿ|þ´ÂF¾Z‡þ¥÷ý Vßø7ÿ$Ñÿ Òûþ†+oü›ÿ’h ®ëúÿ‡_y7ü$gûçõ£þ3ýóúÔ?ð­/¿èb¶ÿÀ¿ù&øV—ßô1[à ßü“@]w_×ü:ûÉ¿á#?ß?­ð‘ŸïŸÖ¡ÿ…i}ÿC·þÍÿÉ4´¾ÿ¡ŠÛÿfÿäšëºþ¿á×ÞMÿ þùýhÿ„Œÿ|þµü+Kïú­¿ðoþI£þ¥÷ý Vßø7ÿ$Ð]×õÿ¾óëÙ+Wûv¯ñÒÄãödøÃ&ªØicù5~²ÙÿÇ´_î/þ‚+ò_öGð}ά|t½›W†ùöcøÃoäÇm$%L–[ï.Ó8 Ê• “¸kõ¢Ïþ=¢ÿqô]þ?íïý(Æ_ù~HõÙ«þHGÃ?ûIÿ§MB¾‚ðGü|ê¿öÔ¿ôe¥|ûû5Éøgÿ` ?ôé¨WÐ^ÿWþÂ:—þŒ´¯ ñÓÿ?ý°ó+í?Eù#Ñ袊öN¢Š(¢Š(¯?ñ‡ü…¼)ÿa+ßýGÉTøiÿeÁ¿ú‘éµçõè ¿äª|4ÿ²àßýHôÚãÔþÒ_òq??ì´üSÿÔç]¯¯iý¤¿äâ~>Ùiø§ÿ©Î»^-@oxsþB3ÿØÄŸúj•ƒ[ÞÿŒÿöñ'þ£Ú¥uà?ß°öCÿNDRÙú?ÈÂn§ê%+u?Süé+–[¿WùŒr}õÿy˜¯tý¨ää~>Ùdø›ÿ©®·^Ÿ}Þ_æ+Ý?jù9ŸöY>&ÿêk­Ö2þ=?úõ[ÿK z4¿äUŒÿ°Üþ™ÆžEV§œ*õQüëkÄ_ò¹ÿr×ÿI ¬Uê>£ùÖ׈¿ä/sþå¯þ’A]ÿpÄÿØVÿMbÉÃ/Î%Q\eQ@Q@ÿÈ»{ÿa‹ý!Ôëý¥fOùd¿û5ÿ¨ßÁÿ¨ä]½ÿ°Å‡þêuþÒ¿³'üŠ¿²_ýšÿÔoàNoðåŸõæúu›aþ)ü¿$vß¿ä+ðãþÊoƒÿôàÕòŸüoþLÇßöø3ÿ©ÏÃêú³ãü…~ÙMðþœ¾Sÿ‚ÿÉ‚øûþÀŸõ9ø}^¾:¿ã¥ÿ¤£µïKÑþp=ËáaÛû!|oîüý[òðg€~6x[ÃñÁ[OßÛ_Úk6S|^º½ñE¦µ§[i¶áŸøSTð–‘â2êÊêêuñ«=惢Ému¦;_j,bþÐ’·OÙÿƒztÚÇì£û9éÏw:§ÁOÙ³N·’vu†9ï|'ðþÚ™£Y$,’)”¤r6ÀØFlù·ÿhý§ÿè¤| ÿÁïÿùÝÿœqšœMÕ\}•[•ÉI«Z7öM;¾ü¯kèµV*Jp§5ùZzßOÂÝïØåËàíçTñ”W¾+±6úu®á}/BÐn´¯Âo5-TüDð]®¡up¶ž+„xsZñ…Ä×nŸ¥Û^Åknþo¯é–~_é~ðL>"Ô¯~$üKÓ£´Ôá>&Õ|C¤èžM)n%ÐÒßQ°[Nó]¶Z‹7Yb¸3ÞZÄ%—ÜÿáÍ´ÿý¼ÔwÇüþ?ð®¿ÏzÕ—þ û]Í£[xr_Œ¥ðõýÆ©g¡Iâ߉O£ZjwÅow©[ioàcosÃqy q<1E’:Fª9ž­°sM¨{Ê×M86µvµ¢Ò{ݚƭ—ï㣻Zé{+ùZëM´ò>cÖtiŸ´.¹áiš—‡<ÆS£–HÞÏI±ðv¥®jÓipGwxñ2G¨èÖö³h—O|Ï¥¥ÍàÑVáw¼Ke ÚKñ6Ñ4ËISྛâÛ]"ãJ‡K×|­'´Yêöw×QÛê³éw/væB$ºÑµm*K«h®ƒ±öŸøsGí?ÿE#àaÿ¸ïÇþó¯×ŸÄÖ¥üö»Òìu}3LøÁð‡NÓuûx,õÝ>ÃÅ¿­,u»K[”¼µµÕ­-üµµÜQ]AìrÅ Ìi—Õt¶ú!ºô_-«EYE=^éÃ_-.µ}<Ùù£ÿ ÿžƒþú4ÂBç ÿ¾~Ú?iÿú)?ð{ãÿþwTÚ?iÿú)?ð{ãÿþwUö~7þê}ËüÍ~µ‡ÿŸéú~Z}ϱùËÿ ÿžƒþú4ÂBç ÿ¾~Ú?iÿú)?ð{ãÿþwTÚ?iÿú)?ð{ãÿþwTgãè§Ü¿Ì>µ‡ÿŸéú~Z}ϱùËÿ ÿžƒþú4ÂBç ÿ¾~Ú?iÿú)?ð{ãÿþwTÚ?iÿú)?ð{ãÿþwTgãè§Ü¿Ì>µ‡ÿŸéú~Z}ϱùËÿ ÿžƒþú4ÂBç ÿ¾~Ú?iÿú)?ð{ãÿþwTÚ?iÿú)?ð{ãÿþwTgãè§Ü¿Ì>µ‡ÿŸéú~Z}ϱùËÿ ÿžƒþú4ÂBç ÿ¾~Ú?iÿú)?ð{ãÿþwTÚ?iÿú)?ð{ãÿþwTgãè§Ü¿Ì>µ‡ÿŸéú~Z}ϱâ_²v¬ou_Ž— ٓ㠘܆ÃKŸíc§|×êýŸü{Eþâÿè"¾Uðüçã?ì·¡ülø‘ñÅ¿ 5íóàÅO ÅgáOÅš¢ê–ˆº…¼òE­xKD´[4‡HºI].Þu–XB@èÒ<UYÿÇ´_î/þ‚)Ô¥RŠ„*ÁÂVnÏ{=N/(I8讽žv¾ÞG¨~Í_òB>ØOý:jô‚?ãçUÿ°Ž¥ÿ£-+çÿÙ­HøðÁ²>»l꺒àþ*JúÁñóªÿØGRÿÑ–•ía>:à§ÿ¶u}§è¿$z=Q^ÉÀQEQEçþ0ÿ·…?ì%{ÿ¨çˆ«Ð+Ïüaÿ!o ØJ÷ÿQÏVáÿÛôÿô¸šÑø×£9CþBÿ°µïþ£"¯ñ—ÿ‚ŠÉüþÚ_ötßõgøž¿Ù£Pÿ‡‡?ì-{ÿ¨Çˆ«üeÿ࢟ò?¶—ý7ÇŸýYþ'«Ë¿Ü1ö…ÿÓX‘â>:á©ùÓ>5¢Š+C¢Š(¢Š(~ëþE­þÃ:÷þør°+~ëþE­þÃ:÷þør°+³ühØ. ÿQ( mó—æÂŠ(®1…Q@nèwXÿ°5ßþŒ‚°«wCûºÇý®ÿôd×ÿy‡¤ÿô†LþòüÑ…EW,·~¯ó((¢Š@QE*õQüëoÄò›þ½ôÿý7ÚÖ"õQüëoÄò›þ½ôÿý7Ú×d?Ü1?ö„ÿÓX²_ÇðËó‡EWAEPEPý×ü‹Z?ý†uïý!ðå`Vý×ü‹Z?ý†uïý!ðå`Wf;øÐÿ°\þ¢PÛç/Í…zÂoù*Ÿ ?ì x7ÿR=6¼þ½á7ü•O†ŸöP<ÿ©›\c:ŸÚKþN'ãçý–ŸŠúœëµâÕí?´—üœOÇÏû-?ÿõ9×kŨ­ïÈFûø“ÿQíR°k{ßòŸþÀ¾$ÿÔ{T®¼ûöþÂhéÈŠ[?GùMÔýOó¤¥n§ê%rËwêÿ1ŽO¾¿ï/óüœÇÏû,Ÿõ5ÖëÂÓï¯ûËüÅ{§íCÿ'#ñóþË'ÄßýMuºÆ_ǧÿ^«étF—üбŸöÿÓ8ÓÂh¢ŠÔó…^£ê?mx‹þB÷?îZÿé$нGÔ:Úñü…îܵÿÒH+²îŸû Âé¬Y/ãøeùÀÄ¢Š+Œ ¢Š(¢Š(rùoì1aÿ¤:´¯ìÉÿ"¯ì—ÿf õø#_âÕü‹·¿ö°ÿÒN¿ÚWödÿ‘WöKÿ³P?úü©Íþ³þ¼ÃÿN³l?Å?—äŽÛãü…~ÙMðþœ¾Sÿ‚ÿÉ‚øûþÀŸõ9ø}_V|bÿ¯Ãû)¾ÿÓƒWÊðQ¿ù0_ØàÏþ§?«À—ÇWüt¿ô”v½éz?ÎÒÿ³Ïü›—ì«ÿd·öYÿÓÃzô¿ˆ´Ÿˆ4?ÚYþiú‡ÂŸéú_ÃχދkÇöŒÞiû<ÿɹþÊ¿öKeý0ü7¯ÐËÝHÔ.m/oô­6öóOs&Ÿwyckssc)Á2YÏÓ<[uâÏØ»ö`øµâ†ß tÿéÖÚv¿ãËüJñÄ?ÚëV2øÀÚÖmáÝ7\Ób»~ÖÖl6‘l!iZtÚhî-Ä66±."²M:)à ˆfOŽ;–0®–h¶ÊD ±Ö•v…Q@Q@Q@Q@Q@Q@9~ÖŸòoì@ñÇþ¡ž!¯ˆí?ãÚ/÷ÿAö÷íd/ì÷ñ^4*'€|m³)eVø…C2©VeRÀ1ƒÍ|ªéÓè.†ò|xø'Äv¢xIJßdûj*øa¼zu¼Éd>Ø€X±kSö˜~aóù9Õ¯xEÉB JËoêÌõ0’Q¤¢Ý››jûmó=§ömÿ’ ð³þŧÿÓ¾©^ýàøùÕì#©èËJðÙ±%O€Ÿ ÒfF<2É3D¬±4««j‹#F®ÎËpJ+³²©™ˆ$ûÿ‚?ãçUÿ°Ž¥ÿ£-+|'ÇOüÿöÃ*ÛOÓüG¢Š+Ù8Š( Š( ¼ÿÆòð§ý„¯õñzyÿŒ?ä-áOû ^ÿê9â*Ãü?û~Ÿþ—Z?ôg#¨ÈCßö½ÿÔcÄUþ2ÿðQOù?ŸÛKþΛãÏþ¬ÿ×û4jòðçý…¯õñŒ¿üSþOçöÒÿ³¦øóÿ«?Äõywû†/þ°¿úk¬ ߺÿ‘kGÿ°Î½ÿ¤>¬ ìÇö ‚ÿÔJ[|åù°¯@øMÿ%Sá§ý”ÿêG¦×Ÿ× |&ÿ’©ðÓþʃõ#ÓkŒgSûIÉÄü|ÿ²ÓñOÿSv¼Z½§ö’ÿ“‰øùÿe§âŸþ§:íxµ½áÏùÏÿ`_ê=ªV oxsþB3ÿØÄŸúj•×€ÿ~ÁÿØMý9Kgèÿ# ºŸ©þt”­ÔýOó¤®Yný_æ1É÷×ýåþb½Óö¡ÿ“‘øùÿe“âoþ¦ºÝxZ}õÿy˜¯tý¨ää~>Ùdø›ÿ©®·XËøôÿëÕoý.èÒÿ‘V3þÃp?úgxMQZžp«Ô}Gó­¯È^çýË_ý$‚±W¨úç[^"ÿ½Ïû–¿úIvCýÃÿaXOý5‹%üqÿ ¿8”QEq”QEQEnCÿ"íïý†,?ô‡S¯ö•ý™?äUý’ÿìÔþ£küZ¡ÿ‘v÷þÃúC©×ûJþÌŸò*þÉöjÿQ¿‚59¿Ã–טéÖm‡ø§òü‘Û|bÿ¯Ãû)¾ÿÓƒWÊðQ¿ù0_ØàÏþ§?«êÏŒ_òøqÿe7ÁÿúpjùOþ 7ÿ& ãïû|ÿÔçáõxøêÿŽ—þ’Ž×½/GùÀú_özÿÃ6þËòÅ— gðöhÔ$†&…dkm7Ÿõ ²†âXaÜ–¶ÓH’ %vîÉ÷¯|tø›¦øÏ@Ѽð9¼Qà{»{oøIüq©|Kð¿‡5mæúêòÕBðC[jƒÅqi ®¥®µÿм Ëa{z ëúŒWxŸìÙÿ&Ûû9Ù¾üÿÕ_áJöŠêyÑrQI¦ÓwWè—áúú:jj-ßD¿Gþkæxdžþ!þÙ‰£~ËúŸŠdøm>³púOü5Ÿ…tïÚZEh5_ ê×ÚÀø[âFøÅy¬~ñgö>‡joô¿Kâ}0]j„élë ]ÇÇïŒÿ´2ü7»ÿ†jøi¤ŠRx¥,­_➧ṋs®E®jöòţϤÞuõÉøÛ_»ðÞ€÷úu½½Ö§w«øgúL7rI‘Õü]âmÂzL—ÒB’Lš|:–µk=ûÁζqÌaG—b›úí^Ñ'ØG»þ­þOïò8{o‰¿¶EÏÄ3áæ•ðÇR¿ø¡£øjðþŸ¨ëþÓ4íɾøÖóT?­ÇŒo¼G¯=Ü~,ðkø{–úM’È-|DÆÒÚãYúá?Å/Oð·á´ß¼8->-Ëà/KñF×ÂgC¶ø‰'‡ôöñ­¿†Äþ+¿œhø‘µ$ÑüëëɳÖÜIwrÛ¥~7þOí y>6ø6 ì<ãB¶á9]Øé«ž¸(ÿ…QûBÿÐïðsÿoów[{\_üúü?à“ìéÏÅÓ¯ø|½ǹÂÍÓ?è ¯þ~ÿæ‚øYºgý5ÿÏÃÿüÐW†ÿ¨ý¡èwø9ÿ„7?ù»£þGí ÿC¿ÁÏü!¼iÿÍÝ×ÿ>ø!ìéÏÅÓ¯ø|½ǹÂÍÓ?è ¯þ~ÿæ‚øYºgý5ÿÏÃÿüÐW†ÿ¨ý¡èwø9ÿ„7?ù»£þGí ÿC¿ÁÏü!¼iÿÍÝ×ÿ>ø!ìéÏÅÓ¯ø|½ǹÂÍÓ?è ¯þ~ÿæ‚øYºgý5ÿÏÃÿüÐW†ÿ¨ý¡èwø9ÿ„7?ù»£þGí ÿC¿ÁÏü!¼iÿÍÝ×ÿ>ø!ìéÏÅÓ¯ø|½ǹÂÍÓ?è ¯þ~ÿæ‚øYºgý5ÿÏÃÿüÐW†ÿ¨ý¡èwø9ÿ„7?ù»£þGí ÿC¿ÁÏü!¼iÿÍÝ×ÿ>ø!ìéÏÅÓ¯ø|½ǹÂÍÓ?è ¯þ~ÿæ‚øYºgý5ÿÏÃÿüÐW†ÿ¨ý¡èwø9ÿ„7?ù»£þGí ÿC¿ÁÏü!¼iÿÍÝ×ÿ>ø!ìéÏÅÓ¯ø|½Æ÷Æ­_þ/ÃOx/HÒµ{kïh:æÍÑðø¶¶}[CÔô´¸•WÄ Ò$2ÞÇ,‘£tV Àkáÿ|"ðV½û@ÛþÕ³þÅQŸÚVÏáý×Ã+O‹?ð‘|"}ZßÂ÷—Iy>Ÿ¤Þ7K¹ ‡¶ƒ[—F!‡DšçKŒEas6šßQø›Ã¿>iKâŸk¿ üAáûMSA°Õ4ýÃÞ'Ðõ»®iú]XÞj"×,ÞK;J—µžÍæän`‘‘e\•¥S¹§ J*êúYm¢Û­ûõ6§hÅrµ$ŸÜíÿOÅuð‹ÂÚ§‚~ø+ÂzЄjÚ“-ð‚Hf„LÚ¦¡p¦9 –xʼSFê¬ê®@¯¹G«x#þ>u_ûê_ú2Ò³«GÁñóªÿØGRÿÑ–”ð¿Å••£¾ûÁk÷|…Sà—¡èôQE{QEQEWŸøÃþBÞÿ°•ïþ£ž"¯@¯?ñ‡ü…¼)ÿa+ßýGÙ@ðoþ¤zmqŒêi/ù8ŸŸöZ~)ÿês®×‹W´þÒ_òq??ì´üSÿÔç]¯ ·¼9ÿ!ÿì âOýGµJÁ­ïÈFûø“ÿQíRºðïØ?û ¡ÿ§")lýäa7Sõ?Î’•ºŸ©þt•Ë-ß«üÆ9>úÿ¼¿ÌWº~Ô?òr??ì²|MÿÔ×[¯ O¾¿ï/óüœÇÏû,Ÿõ5ÖëŸýz­ÿ¥Ð=_ò*ÆØnÿLãO ¢Š+SÎz¨þuµâ/ù Üÿ¹kÿ¤V*õQüëkÄ_ò¹ÿr×ÿI ®È¸bì+ ÿ¦±d¿Ž?á—çŠ(®2‚Š( Š(  Èä]½ÿ°Å‡þêuþÒ¿³'üŠ¿²_ýšÿÔoà‹T?ò.ÞÿØbÃÿHu:ÿi_Ù“þE_Ù/þÍ@ÿê7ðF§7ørÏúóý:Ͱÿþ_’;oŒ_òøqÿe7ÁÿúpjùOþ 7ÿ& ãïû|ÿÔçáõ}Yñ‹þB¿?ì¦ø?ÿN _)ÿÁFÿäÁ|}ÿ`Oƒ?úœü>¯__ñÒÿÒQÚ÷¥èÿ8¿Ä_üIøû~Â~øi6«ms}ÿ ›'‹®ì_Æ«¥ÚxÛá2ë“ø±~ø³ÀÞ%—ÂË:éÉ·Št˜éìMÌÒD¦ ~>ŸÁ_¶n‰ñ›Ã-6±ûDxGá¿€~-èzv¡«ü0ðÖ½¯iZ¿Ãí/â7ÅMmáè_5xzûMÔü¨_ÞKeâ'†ãÓµMS^»±Ó®µûû6ɶþÎ_öo¿õWøV½¢¶såmY?Ïìÿ•¾fJ:EÝôÓ¦Š?×ùŸŒ üoÿ&ñÅÞ¢xóVñËwâŸÃÝâþøc±©|5Ò®­¾)]|EÁÚïŽ?fïü5¾ð$I§x Oðæ»g¯~Ðiš”‚ÿRø…¬Újñèïúiâ‰îæðŽî§«Ígñ³á€¼Ô|5{á‹—ŠÏ〠M½Ý­œ:¢*¦_Òí¢ÑµMî–‹i$j=®¹¿xxøŸEm2;Ó¦ÝCªx]ÓoͰ½KMgÂÞ Ó"øZHá[ø³“ÜÿÉZúbøMþ5ÿÐÃð·ÿ Ç‹?ùíW¢±”RKßÙ}—åþƒìrû ÿwÿôÿ?Áö>¦¢¾Yÿ„ßã_ý ? ðÛø·ÿžÕÆÿÇ_ü-_†þ-ÿçµOë´¿ÿ€¿/??Áöa?îÿà^Ÿçø>ÇÔÔWË?ð›ükÿ¡‡áoþóÚ£þô0ü-ÿÃoâÏþ{T}v÷ÿðåççø>Áì'ýßü ÓüÿØúšŠùgþô0ü-ÿÃoâÏþ{TÂoñ¯þ†…¿øn»Gûÿø òóóü`öþïþéþƒìw_´Gü’msþÞÿÕ‡áZàëÄ×_ÿWþÂ:—þŒ´¬êÑðGü|ê¿öÔ¿ôe¥:á©ùÓ>5¢Š+C¢Š(¢Š(~ëþE­þÃ:÷þør°+~ëþE­þÃ:÷þør°+³ühØ. ÿQ( mó—æÂŠ(®1…Q@nèwXÿ°5ßþŒ‚°«wCûºÇý®ÿôd×ÿy‡¤ÿô†LþòüÑ…EW,·~¯ó((¢Š@QE*õQüëoÄò›þ½ôÿý7ÚÖ"õQüëoÄò›þ½ôÿý µ®È¸bì+ ÿ¦±d¿Ž?á—çŠ(®2‚Š( Š(  û¯ù´û ëßúCáÊÀ­û¯ù´û ëßúCáÊÀ®Ìwñ¡ÿ`¸/ýD %·Î_› ô„ßòU>Ù@ðoþ¤zmyýzÂoù*Ÿ ?ì x7ÿR=6¸Æu?´—üœOÇÏû-?ÿõ9×kÅ«Úi/ù8ŸŸöZ~)ÿês®×‹P[ÞÿŒÿöñ'þ£Ú¥`Ö÷‡?ä#?ý|Iÿ¨ö©]x÷ìý„ÐÿÓ‘¶~ò0›©úŸçIJÝOÔÿ:Jå–ïÕþcŸ}Þ_æ+Ý?jù9ŸöY>&ÿêk­×…§ß_÷—ùŠ÷OÚ‡þNGãçý–O‰¿úšëuŒ¿Oþ½VÿÒè/ùc?ì7ÿ¦q§„ÑE©ç ½GÔ:Úñü…îܵÿÒH+z¨þuµâ/ù Üÿ¹kÿ¤Wd?Ü1?ö„ÿÓX²_ÇðËó‰EWAEPEPä?ò.ÞÿØbÃÿHu:ÿi_Ù“þE_Ù/þÍ@ÿê7ðF¿Åªùoì1aÿ¤:³ÏÀOøkÂ~ý‘õ/ø‡CðÖ7ì²–Q_øƒV°Ñ¬¥¼—ÂÿæŠÒ;­FâÚ¹’+yåŽÊñÃ+ªÊÎoðå¿õæúu›aþ)ü¿$z—Æ/ù ü8ÿ²›àÿý85|§ÿÿ“ñ÷ý> ÿêsðú½ïâOÄ_‡Þ$ñÃ]7þ:ðv½¨Ëñ/Âo†‹â}T½‘!½yexílo§Ö(Õ¤‘–2» šðOø(ßü˜/¿ì ðgÿSŸ‡Õà=eU­W=-VÚE'÷3µïKÓÿ>Žø‹7ìÉû2À弫Ÿƒß³5¤ê®ñ™m®ü-ðöÚæñ²¾Éíå–a¹”ü¬sØK>§¨ëæ•࿇iâˆ|5ug¦kº”þ$Òü=ii­ÞiVòéG~ÒÝ^O‰«èÚÌñÛ¥œqê¶ÐÇq-Ê]EoÈüÿ“iý—ì“~ËßúŽ|9®[âwÇm7ölø9ûa|d¿.î<ãuáͬòIâOj_~ h¾ð¬6±Ms5ïŠüc¨èž³Š¤vŸQF!Q]ס$ä”®““½–·Jj—빚·-ú¨¦¾øÿ^G­ÿeüGÿ¢1§áÅÐùÜ~teüGÿ¢1§áÅÐù¿2üÿSñÔ^°Ñõ¿|6ø¥ñCáï„ÿjmsãv¿Ä=Kàž4_²õç½Z]CÀ~Õü ãÛíGPøðÏâÿ…¼wáíëW²²Ò¤óô»í}ìÅæ±¥ú…÷ü2]Mø—âýà…°ð‚®i+B›ÃgñWÄkZýœü/gã-R?|5¶øog'ƒ4èw‘¥¾§oâ_^é:­Æ“gw¢Ïk®éÞêŒ4ÖMéÕ_ìyy2¶m-ú-­Ëù~ireüGÿ¢1§áÅÐù¥üFŸƒ~1Étzó…6àŽƒ#=2|;uÿ'ø¬šUíſ즖ڧ‡¾~ÐÿüKk㉟~XÜx#à¯ÀýNïRð4>>ýœ|=ãoŸY|iŠÏH>#ð-`ñ…uKuw¡]Ûx;Ÿ þܾ7øûHü$øuáÿxOà üañãïÃûÝ[Qñ¹Õþ&k—ÿ¾Á®j\ü?_ éqø/Iê6iz¤^)ñ\ÚÆ‚öº†áôñö‰öPJ÷—Þºro¦Ú1§¶‹§þÙþ‚ì}]¦k>Ô<þ8šÅ´Ý&ÓMÕ5Z;´fºÒN‚×qkÖ—)nó$³éWZ}õ¬ÆÕæŠi-™­dš'ŽG©kkñúÚ Ëo‚öñÛÝÃÄ }ãÿÛ^,3 –!um ÝÇo8F_:¹œE&äó®kÏ,ÎïÙ³â{Cøê=Çfº¿Úgã7‰~ |)ð‹¼-Ÿ=ýïÆOÙËÀwðêPIq¾ø‘ñŸÀ>ñDpm’#o¨?‡¼A© 6ô‰RÆüÛݽµÊB`“ )NV“²´mª[µßÊ+ú¹mr­ÚkîåKÓN«ñ7ÿ²þ#ÑÓðâè_ü‹GöWÄoú#Zoþ] ÿ‘ká¯ÁIþ,k´ÿÜþÊúl:¶¯ð“övøím£èüIã=?EøWñ÷Køý½â™¼ÔÓöV´ý©´sm⫯ƒÀþñ¨é~ ÑüQyãx|mqâFÞð|):Nû•ßÙA>»'£ÿ—MôÌÔ¼—Nû¿ðm輯÷oöWÄoú#Zoþ] ÿ‘jï†&Ó<|}øñãÏ‚¾,ü:øaà_|<²ø]wᨼñ;Ä><ñ w9ð”^"šÇ\MKáw´ËˆÊ›‰%Ô,5 ¢°¾·:U¬ųi=?ÀïæøËã³ÿ{âÅ—¿Oƒß ‡ô¬j¨ÅEÁ»»]ok$õ_+}Û•z÷’IÝiÖ;}ß’} elj¼KhºÏ…>Cªøvî{µÒu[ïhš<Úµ¥ÜöoM6U¸¸¶¶¹’Ýåµ[¦ŠáíÚ)d‚þXÐþÊøÿDkMÿË¡ò-y?ÄŠž$ø/ûüPø¯àÑb|]ðËàÄßøgûRÙ¯t³¯xWÃÞ Öô¡¨Y ‹Sufo¬àûM¸¹·2þ14e÷,ÿà£>ê>'øsñáŠ~!|V_‰š‡<áWúŸ†×5ÿˆßðøÆËâ_€d];ö«µoˆ?­ü¥E øf-2ú㺕Ä?µ+¨üCg§@m§ˆm®­=#ÇŸðT øâoŽ>Ûx é¾ð·ÄGÃ^-ѵψF™­x¯á‡ÄO†ß |eá¯êþ/ø3á߇z&ŸáÿüG·±ñ'‰|ñ#⌲Ðu»¿éÚlÐ¥“?eO»Ù=×÷<º~šõ»S{Ùlµ·øo§Ïç¡ööWÄoú#Zoþ] ÿ‘jÍÞ¯ Ýè£ÆŸ "ðî—®kV~¶Õ­¹û<'þ#xÃÂÞ9ñæ­áß„¾1øñ'GÓ|'à]{Áš-ìZˆü?û;JÚ‹/£ñ¥¥ì:Ž´o†³KI#Ô¼}h—vw}gñ®ïÎÑü ¼ß~ÿÐÁ Ç=ÿ ûTNŒ•öºm­×+Ú×{Oz‹»I¥m/§~Wþ~Ÿ3wAt´Q÷SRñ( c¶+ok6ÐF $íŠb‰xŽ5ð+¨ðGü|ê¿öÔ¿ôe¥süƒý…¼Sÿ©n»U?á.Ó¼iw¨êßFo|Ks¤Ù[éz.«â-WP¾¹h¬´íCÓõMVþàÃm=ËÇgc3Ckmqu/—oÒ$Q”iÏíÅ»zÃólN.På[´—廩ï4W켂 #I·K½OOøŸcm%î™§G=ÏÀÿ‹±Æ÷ÚÆ£k£évªÍðÿkýRúÎÆÙ:ÉssC–£ÿ f?úüWÿÃñ{ÿýv}zŸòOÏM“å×oï?»ÌÃêóòé׿/ÿ%øãExwü-”ÿ Åü1¿ùß×}ûPxLÔµþóÇöº¦‘<ºŒß¾.-ÅÅÍ…ž«71ÿ¿&9%ÓµÔVù½Ô2 )céÆÎQ”Sv»Ñ_OópÖ¤¶³ôÿ·o÷_ð>¦¢¾Qÿ†ªøsÿA/á–ø¹ÿÎúøj¯‡?ôñçþo‹Ÿüïª?´ðþ}?öß/ï~ú¥nßÖŸæþï3êêóÿÈ[Ÿö½ÿÔsÄUæZÇÿxžÃûSÃöÿu};íW–_l²ø%ñrh>×§\Ég}o½~æÚÝÁ,&2’£!äV·4ïßé e.¦·F¿ue¨iú߇µ¿ ëËá]~â!w¢x‹KÑõh"¹‰ÄÖ·2Ù,qî{ieUb â¡VŒbÒ” Ó “‹Ñí×ð(μ­¢wWÛoó.jòðçý…¯õñŒ¿üSþOçöÒÿ³¦øóÿ«?Äõþ͇ü„<9ÿakßýF¯Sû½:÷·—÷—â—×ü‹Z?ý†uïý!ðå`Wú¢·üãÿE{hmö ø¬màžââÿ·à¢Cd×ImÃî;|ij·Y™ËÊ*³ÈZø‡£þÿFñ[ÿ ø(¯ÿ7µ¾#2¡V¤'Ô²£‡§g Ý*©·ºÑ¸ß[hì%‡©ýÝÛß»MéJÿ3ü°h¯õ>ÿˆz?à‡ÿô`ÿ¿ð ÿ‚Šÿó{GüCÑÿ?ÿ£ø­ÿ…üWÿ›ÚÃë´»TÿÀ=<üÐþ¯Sû½:÷·—÷—â– þ§ßñGüÿþŒâ·þðQ_þohÿˆz?à‡ÿô`ÿ¿ð ÿ‚Šÿó{G×hö©ÿ€zyù ú½OîôëÞÞ_Þ_‰þX5»¢}ÝcþÀ×_ú2 ÿRø‡£þÿFñ[ÿ ø(¯ÿ7µ<ðoüÛÎ~Á_“ÏíæÎ½ÿmðÈTº|þ;m¤”ríqŒ)9Û ˜Ð¥V5j´“Ó“_z6]ZûJä¼5F­îën¾qòóGù]Q_ê}ÿôÁÿèÁþ+áAÿÿæöø‡£þÿFñ[ÿ ø(¯ÿ7µ‹ÆÒm¾Zš»üíçæŠú½OîôëÞÞ_Þ_‰þX4WúŸÄ=ðCÿú0ŠßøPÁEù½£þ!èÿ‚ÿуüVÿƒþ +ÿÍí]¥Ú§þéçæƒêõ?»Ó¯{yy~'ù`Ñ_ê}ÿôÁÿèÁþ+áAÿÿæöø‡£þÿFñ[ÿ ø(¯ÿ7´}vjŸø§Ÿš«ÔþïN½íåýåøŸå„½GÔ:Ûñü…¦ÿ¯}?ÿH-kýH¿âø!ÿý?Åoü(?ࢿüÞÔ÷?ðoüîVžãö ø¬ò²Æ…Æ»ÿL¬Q¬1©ãµA¶4EÈPNܶæ%Žñ̨,5Z.5yªV¡Q>M•8V‹O]ß¶­Ù“õjŽJZhšµÿ™Áöéþgù]Q_ê}ÿôÁÿèÁþ+áAÿÿæöø‡£þÿFñ[ÿ ø(¯ÿ7µ‡×iv©ÿ€zyù¢¾¯Sû½:÷·—÷—â– þ§ßñGüÿþŒâ·þðQ_þohÿˆz?à‡ÿô`ÿ¿ð ÿ‚Šÿó{G×hö©Óìwµºù¡{ š|:ù÷·—Ÿæ– þ§ßñGüÿþŒâ·þðQ_þohÿˆz?à‡ÿô`ÿ¿ð ÿ‚Šÿó{G×iv©ÿ€zyù¡ý^§÷zuïo/ï/Äÿ. ¯ù´û ëßúCáÊÀ¯õEoø7ÇþŠöÐÚ7ìñXÛÁ=ÅÄ1ÿnÿÁD†É®’Ú;‡Ü9–Þo&âäòçŠX_nÉct,‡®ÒíSÿôóóCú½OîôëÞÞ_Þ_‰þc_´—üœOÇÏû-?ÿõ9×kÅ«ýV»KµOüÓÏÍÕêw§^öòþòüOòÁ­ïÈFûø“ÿQíR¿Ôƒþ!èÿ‚ÿуüVÿƒþ +ÿÍíOmÿøÿÁ­$imÿ`¯ŠÑÈÐ\Û3oÁD˜˜o-å´¸L?ŽÙG™o4±î:nßW ˶1¡GB¬£UÆ•Zu õP”ee«Õémž£M{º®ýíåýåøŸåvÝOÔÿ:JÿSïø‡£þÿFñ[ÿ ø(¯ÿ7´Ä=ðCÿú0ŠßøPÁEù½¬ž6‹mÚ¦¯ù;ÛÏͰ©ýß¿ÓËÍ~'ùa§ß_÷—ùŠ÷OÚ‡þNGãçý–O‰¿úšëx¯ôÉðoOüüGìñ[ äÄÿþ +ÔÜû[¾(ÿ‚Á|gâMÅþ%ý…>+j^"ñFµªx‡]Ô¯ÿ ³Ú¾³}>¥©]ý’ÃÆÖ¶6Âæöæy¾Ïgmok*Þ¡TsxºN¤'j–P©îuœ©5×û¿‰×ク‡kß«ˆÃV‹¾Š4©×Œ¯çzÑ·£?ÊŽŠÿSïø‡£þÿFñ[ÿ ø(¯ÿ7´Ä=ðCÿú0ŠßøPÁEù½«úíÕ?ðO?4rý^§÷zuïo/ï/Äÿ,%ê>£ùÖ׈¿ä/sþå¯þ’A_êGÿôÁÿèÁþ+áAÿÿæö§¸ÿƒ|àˆ·s=ÅÇìñZIœ(wïüI25>Xüv¨0Šªp£89ù‰5¼s* V‹^j•¨TO“eN¢Ó×wí£kvdýZ£iû»5¿ó8yåuE©÷üCÑÿ?ÿ£ø­ÿ…üWÿ›Ú?âø!ÿý?Åoü(?ࢿüÞÖ]¥Ú§þéçæŠú½OîôëÞÞ_Þ_‰þX4WúŸÄ=ðCÿú0ŠßøPÁEù½£þ!èÿ‚ÿуüVÿƒþ +ÿÍí]¥Ú§þéçæƒêõ?»Ó¯{yy~'ù`Ñ_ê}ÿôÁÿèÁþ+áAÿÿæö¨jðoçü»F´kýSöøŸad“ÙÛ5Íψÿà¢qijê–ú}Œ%Ïqæ]_][ÚĸËË2 å¸>»GµOüÓÏÍ ØTÓá×Ͻ¼¼ÿ3ü»!ÿ‘v÷þÃúC©×ûEþÍãw„d„_³ùÏû)¸µûJy›‘á_‚íèÃÆÒ î飘–M®¼°ü”Ÿþ þÿ‚ÙXN·Ÿ°·Ä»1eŽòîæûÄßðP»;;o³Ç*}®òþëÇÑÅgkoÓ=ÅÄ÷ÚAéî#"~èØü>ð(ðw„¼#c£ÚËá? hú6áe¼¾¹}/JÒt˜´ Xk]ɪ»E¤*Z}¹ïå»»·i>Õq9žWxÇã)b£„Œ#;Ф£58Ù6¦ä­Ý4ÕÍhÓ•9IÊÖvÙê“K]ŽǃĦ×áìþ2¶ðöŸ¬ÍñsÂðÚÙhy K(5iÞynîfv’æö8¤º±D¿f¶Ø&‘æ2ÇÍðQ¿ù0_ØàÏþ§?«ím3áÇ‚´J×W±Ð¢‰‘¬¯.îµ F[9&ŠH%–Ðê7wKm4I,4 “e–"þ\Ž­ñOüoþLÇßöø3ÿ©ÏÃêó,í9h¹§ʺl¼¯w®î¹ ®Ý–ïþÜ_¡ô‡À/ù6ŸÙwþÉ7ì½ÿ¨ïÚn§má?xÚßÄÿuïéÞ!øƒ üEðÝî™àOÆÖwš/þøzÆçf‘¤ëRé!Ñ5ïÜjVW7örÛ¬Úmî™v÷qkwöv‚Òïöiýœ ºã_€¿®B¥ÍŬ‹=ÃÞÛH—“[ÜÂðÜÛÃ2<3Fáa¹¯ZþÇÑ»©áaãOþikY?ï¸ÉM»¥º|‹ð·ßbct—»}ÓÓ¬¯øsãÿø_àw>+x{ã'Œ~x»Äž2ð߆ xº÷Ŭ^8ñ ωµŸ Ükëà5KÇ«]Í6ŸáÛ»››EnVIýký¢ÿwRÿÂÃÆŸüÒÑý¢ÿwRÿÂÃÆŸüÒÔ)KEí¥Ó¢éËòþ´¿ZOoÝG§î—õt|Ýáû¿ƒ^ÒÛCð§ìÕwáì5ý)ô~Î^ Ñ´¦ÒüW&Ÿ7ŠtÖÓôï‡ÖÖ†ÃIJé:T¾ ³0›}fM3O}F;–²¶1_´×þYx¾_ˆ³Ö³iãë‹kk)|mkðÄÖž/žÎÎÆM.ÊÊ_¯aÕšÖ×Mš]6ÚµµŒ²Z'—lî‡è/ì}ûº—þ4ÿæ–ì}ûº—þ4ÿæ–Žgÿ?¥µ¶_Ý]ïýuÒç6ß»]:¿îÁûüõòmÁþ!ŸàV·á+»!§xÄ~ø„±é÷sÄMߌï|G¨ØYßMMMlºÍ¼7Æ%Ž9ÒP’Jˆ™¨|MÒµK }#Äß ¼}©Åes¦^6ªü*ñ^¿go«h—v÷ÚuäRÛxoVÑç¼Òµ;;ký;RӮ½¶·½ÓïKÅ ã×?±ô_îê_øXxÓÿšZ?±ô_îê_øXxÓÿšZJÑ·-Ki´•ݹZÞöµÞÛùÝ&E»ÝÂë{^Ú·í×Ë®ž§ÍÚô¿‹ýÝKÿ óKBo¥f¼¹U—Ákkwk|÷ë«RZ^þ­w÷àwßÌøïÂ~øá|Mñeì÷âCÄ5KûïjšçÀÏj—·^§áŸ øR÷Á–·rü>[¨ü 6—á'…'šçJk£w3ÄË8Ž>ÚÚïàõŸˆ‹ýÝKÿ óKGö>‹ýÝKÿ óKKâJõ¤Öš8¥}#½šíò¾—¸sv¤“ï{Ûà]­uÓ¿MÇhò ÿ¸·Šõ-×kÌ|q®éþ¾øwâ­fö /AÐ>0kÖ±y2[éúU®£ðËâ'‡ìîµ ¹`´¶›YÖtÍ<\ÌñijÞÀ¯"†Èõ»hl¬­ãµ³U†ÞÒ6»º»r÷W3^\I%ÍýÍÕäòMuq<Îó\HÛ¤ Uj¥©…îßY»·K›™.š$‡M‘I¶ ÓÛI.ß—#s’ =¸tÔ¬ÕÚ‡+{]J]û+Zÿv¤ÆêͦôI÷ÖÉþiŸ1ø¿ãÃû_kj_¼ â‹ÝCãGÃi¾GŠ<>’é¾´øƒðÊâ=8ZÛêOC¤&™«\ÍÿÈ5 Õ”¹Hj¢›éËþ}~âã(¥É7gu~ï’ý´Úݺm¯‘è´wÂ>Éà»ø¹àY¦kÛÙ•Ïô9±×24 ¹õ FØ|¼§D9Q¸OÍw¿þê¿>+êŸð±|`¿ñ–‹%¥Ä¾,ÐÑ. ƒáû'š{ð&….ínmŒ±–A=¼ÐçÌÕ~ðòî?è?{ÿ€ú?ÿ ÑåÜ÷×ïqÎ?Ñô~:Ó–;zwüâ¤'V ©+=[zÚ+«Ó2á8Á¹F÷’OM¯Êí÷Û^Ú ÂÑø_ÿEÀøXxÿ–4ÂÑø_ÿEÀøXxÿ–5÷?—qÿAûßüÑÿù.ãþƒ÷¿ø£ÿò sýSþžG§ãËþÕµ¿n¿’}?òKñ?+>)k¾(øðGÁžýŸÿkÏþÎ>=ð÷íOgãýgDzëלü7Ñ0Ñî£ÒâÓ5yaÒ'Žð_K86°çïOx“Lñ¯ÄMsÅZ­gâvð†…ˆ4Éá»Òïõ]Âÿ&Õ ³¼µymnZÍu[´›ieŠn>Ì_ΆXãõÿ.çþƒ÷¸ÿ¯m?˜²éü½¹¤K`nìn®u{Ë¡a<÷@ÑéqFóM§ÞéàÈÐÙ¤¥#ŽúI£¦çD Ûw)ë¥ÍJ© |¶Kª´V«Ñ§¡”¥9IA©JÉß·ºïëÝùÛÖCþBÿ°µïþ£"¯¼5ñWÂz…á? jŸ¼-à]OÂ<ÕîKþD«jœdïg¦Y«ë柯cÁ<#ûFü'±ñ_Æ)¦ø£àxaÔ~!éW¶R·‹´%ŠêÙ>|/ÓÞâÝ΢©÷?¯ødpŸðÓŸÿè¬xÿ -ÿ–TÃN|ÿ¢±àOü,´þYWwöK¯úÞßÿ•ô}’ëþƒ÷Ÿ÷çGÿå} Utýìzî?0^ÏOr}:/î_ðÈá?á§>ÿÑXð'þZÿ,¨ÿ†œø?ÿEcÀŸøYhü²®ïì—_ô¼ÿ¿:?ÿ+èû%×ýï?ïÎÿÊúªéûØôÿÜ~`½žžäút_Üþ¿á‘ÂÃN|ÿ¢±àOü,´þYQÿ 9ðþŠÇ?ð²Ð?ùe]ßÙ.¿è?yÿ~tþWÑöK¯úÞßÿ•ô)UÓ÷±éÿ¸üÁ{==Éô迹ýÃ#„ÿ†œø?ÿEcÀŸøYhü²£þsàÿýáe òÊ»¿²]Ð~óþüèÿü¯£ì—_ô¼ÿ¿:?ÿ+èR«§ïcÓÿqù‚öz{“éÑsúÿ†G ÿ 9ðþŠÇ?ð²Ð?ùeGü4çÁÿú+ÿÂË@ÿå•wdºÿ ýçýùÑÿù_GÙ.¿è?yÿ~tþWÐ¥WOÞǧþãóìô÷'Ó¢þçõÿ Žþsàÿýáe òÊøiσÿôV< ÿ…–ÿË*îþÉuÿAûÏûó£ÿò¾²]Ð~óþüèÿü¯¡J®Ÿ½OýÇæ ÙéîO§EýÏëþ'ü4çÁÿú+ÿÂË@ÿå•ðÓŸÿè¬xÿ -ÿ–UÝý’ëþƒ÷Ÿ÷çGÿå}dºÿ ýçýùÑÿù_B•]?{Ÿû̳ÓÜŸN‹ûŸ×ü28OøiσÿôV< ÿ…–ÿË*?á§>ÿÑXð'þZÿ,«»û%×ýï?ïÎÿÊú>ÉuÿAûÏûó£ÿò¾…*º~ö=?÷˜/g§¹>÷?¯ødpŸðÓŸÿè¬xÿ -ÿ–TÃN|ÿ¢±àOü,´þYWwöK¯úÞßÿ•ô}’ëþƒ÷Ÿ÷çGÿå} Utýìzî?0^ÏOr}:/î_ðÈá?á§>ÿÑXð'þZÿ,¨ÿ†œø?ÿEcÀŸøYhü²®ïì—_ô¼ÿ¿:?ÿ+èû%×ýï?ïÎÿÊúªéûØôÿÜ~`½žžäút_Üþ¿á‘åúÇí#ð¢öÚÖ+_‹žŠHµ òV6Ðã-g§ëV·±n]D–ó¬íç‡Ê?$»ü§!šÏð§íð¿HÒÚ×SøÁà[›’ÚQè·ZøWÚU×ï%ÔCæMSMÔ.üõ7h|K4 {Ù.¿è?yÿ~tþWÑöK¯úÞßÿ•ô“©tý¬~ÏþÛçæ4éÙ/g>šÙwîÝZÛyœ'ü4çÁÿú+ÿÂË@ÿå•ðÓŸÿè¬xÿ -ÿ–UÝý’ëþƒ÷Ÿ÷çGÿå}dºÿ ýçýùÑÿù_MJ®Ÿ½OýÇæ%ìô÷'Ó¢þçõÿ Žþsàÿýáe òÊøiσÿôV< ÿ…–ÿË*îþÉuÿAûÏûó£ÿò¾²]Ð~óþüèÿü¯¡J®Ÿ½OýÇæ ÙéîO§EýÏëþ'ü4çÁÿú+ÿÂË@ÿå•ðÓŸÿè¬xÿ -ÿ–UÝý’ëþƒ÷Ÿ÷çGÿå}dºÿ ýçýùÑÿù_B•]?{Ÿû̳ÓÜŸN‹ûŸ×ü28OøiσÿôV< ÿ…–ÿË*?á§>ÿÑXð'þZÿ,«»û%×ýï?ïÎÿÊú>ÉuÿAûÏûó£ÿò¾…*º~ö=?÷˜/g§¹>÷?¯ødpŸðÓŸÿè¬xÿ -ÿ–TÃN|ÿ¢±àOü,´þYWwöK¯úÞßÿ•ô}’ëþƒ÷Ÿ÷çGÿå} Utýìzî?0^ÏOr}:/î_ðÈá?á§>ÿÑXð'þZÿ,¨ÿ†œø?ÿEcÀŸøYhü²®ïì—_ô¼ÿ¿:?ÿ+èû%×ýï?ïÎÿÊúªéûØôÿÜ~`½žžäút_Üþ¿á‘ÂÃN|ÿ¢±àOü,´þYQÿ 9ðþŠÇ?ð²Ð?ùe]ßÙ.¿è?yÿ~tþWÑöK¯úÞßÿ•ô)UÓ÷±éÿ¸üÁ{==Éô迹ýÃ#„ÿ†œø?ÿEcÀŸøYhü²£þsàÿýáe òÊ»¿²]Ð~óþüèÿü¯£ì—_ô¼ÿ¿:?ÿ+èR«§ïcÓÿqù‚öz{“éÑsúÿ†G ÿ 9ðþŠÇ?ð²Ð?ùeGü4çÁÿú+ÿÂË@ÿå•wdºÿ ýçýùÑÿù_GÙ.¿è?yÿ~tþWÐ¥WOÞǧþãóìô÷'Ó¢þçõÿ Žþsàÿýáe òÊøiσÿôV< ÿ…–ÿË*îþÉuÿAûÏûó£ÿò¾²]Ð~óþüèÿü¯¡J®Ÿ½OýÇæ ÙéîO§EýÏëþ'ü4çÁÿú+ÿÂË@ÿå•ðÓŸÿè¬xÿ -ÿ–UÝý’ëþƒ÷Ÿ÷çGÿå}dºÿ ýçýùÑÿù_B•]?{Ÿû̳ÓÜŸN‹ûŸ×ü28OøiσÿôV< ÿ…–ÿË*óÏŠ_´wÂ}KÁÒÚZüPðMÔÏâ?J!‡ÅºÎcµñ׆îç“bj,vCM+clqFò9 „~û%×ýï?ïÎÿÊú>ÉuÿAûÏûó£ÿò¾“u·µŽ©/¿“ÌqpM5 égª_Ýþ­òè¿øëðä^xãS?<¨éºÎƒ›¡ø>ÃÄz¡r5$°’ o-¾Ï5ì×Z„ÒÇem¤Ø[Ì÷RâVý÷•ž¡à+K?Àþ °¼‰íï,¼'áÛK¨$’ ›}Îâáâ•“†S‚qšÔû%Ïýï?ïÎŽ>¹?ÙÿÔË„û%×ýï?ïΑÛþáã·§šæ“Ns‹²I[þÝ»w{»¯ºÂrVIBVºnþ‘VüMŠüòÿ‚ÿÉ‚øûþÀŸõ9ø}_zý’ëþƒ÷Ÿ÷çGÿå}|+ÿ-† ?Øcâ–Ÿ­$v|*°‰¥xÞiÇâ7mY<¤Š=ò,GƈˆUÀ¢VåÒI·(½>_æ¿­’Oš:?éÄü/Óä áŸû|!ÿ¨Æ“V¨¢¦_¿ÅúÀêŽÑôåL(¢Š•Óåÿ¸Æº|¿÷QE.Ÿ/ýÆ §Ëÿq…QBéòÿÜ`º|¿÷QE.Ÿ/ýÆ §Ëÿq…QBéòÿÜ`º|¿÷QE.Ÿ/ýÆ §Ëÿq…QBéòÿÜ`º|¿÷QE.Ÿ/ýÆ §Ëÿq…QBéòÿÜ`º|¿÷QE.Ÿ/ýÆ §Ëÿq…QBéòÿÜ`º|¿÷QE.Ÿ/ýÆ §Ëÿq…QBéòÿÜ`º|¿÷QE.Ÿ/ýÆ §Ëÿq…QBéòÿÜ`º|¿÷QE.Ÿ/ýÆ §Ëÿq…QBéòÿÜ`º|¿÷QE.Ÿ/ýÆ §Ëÿq…QBéòÿÜ`º|¿÷QE.Ÿ/ýÆ §Ëÿq…QBéòÿÜ`º|¿÷QE.Ÿ/ýÆ §Ëÿq…QBéòÿÜ`º|¿÷QE.Ÿ/ýÆ §Ëÿq…QBéòÿÜ`º|¿÷QE.Ÿ/ýÆ §Ëÿq…QBéòÿÜ`º|¿÷QE.Ÿ/ýÆ §Ëÿq…QBéòÿÜ`º|¿÷QE.Ÿ/ýÆ §Ëÿq…QBéòÿÜ`º|¿÷QE.Ÿ/ýÆ §Ëÿq…QBéòÿÜ`º|¿÷QE.Ÿ/ýÆ §Ëÿq…QBéòÿÜ`º|¿÷QE.Ÿ/ýÆ §Ëÿq…QBéòÿÜ`º|¿÷QE.Ÿ/ýÆ §Ëÿq…QBéòÿÜ`º|¿÷QE.Ÿ/ýÆ §Ëÿq…xŸíÿ$oÆ?÷/êS¡ÑE8ïXþtÄöù/ÊÿÙPKcK¶SÈe5e55Pictures/10000000000000D9000000FF644ACCE55DFA25EF.png‰PNG  IHDRÙÿó)ä sBITÛáOàtEXtSoftwaregnome-screenshotï¿> IDATxœíy\TÕÿÿß³!þ¨à ¤€€¨…Ê„ .™_4sI\±Lý¨¿L4EÓhæ–K.à’ÙGS?jâ†[‚© „a∠²ƒ¬³Ü{Ïýýqm>³0Àõ<=zÜ9÷l—Þs—×yNeE9`0F÷ewƒyŽEŒ±€cc,àXÄ ,ÄbqqñÌO>qïáÑÙÁñíw|fÌœY]]­1½ðéSûŽ4þÓön`^uø––>zŒ>¹Oüo@@@“Ä&M21éðý÷;»v}ö¬øü…óõ ¶¶¶êé4B×®^aJmÚ¼ùqÞãÍ›7±{=˜WóN'--múŒGþ¬žéêÕ«ãÇKÜ»W=ËÊÊzz÷RQméJ¾øbɃN:ÉÎu`^}^Ìщ{÷Ž?îêÕ«MrèD°²² M/_¾BQ”>éŒ6þw¿¨1u"˜šš~»áÛ½‰‰ž^&NÜ´isII‰Žt FÿxviŽÍ"Ä ãÿ¼Ÿýý÷;}}}Ÿ81Ààü¡#ƒÑGý sïøé§ŸmÛö]³ØŠ¢‚‚‡ôéÝ{ÇŽíºÓñý"¦ |õ$ft =FÇ“‡6x<ž‹³smm­žéŒ ±…OÌÌÌš-_]]=múŒI}Ô§OoàpR.¦¤\º´~]‚¶t¶ûy}Ћ O €¹¹ù;o¿ýݶmyyy!WWׯ¿^=eÊ…B¡1½žc^74Ü/b0/­ã¢žhû|‡CÓRð¸ˆ1°Nc,àXÄ 81ÆŽEŒ±€cc,àXÄ 81ÆÂ‹wÝ)çϾÜ~`Þd†¿? T¿»ŒùpÂËë æÍå¿ÇŽXXXÖ××ýãàO‡¼¬aÞXLMM™ƒ¦ß££¦¢±€““SQQ‘a;…yó8¸[yŒŸ]0ÆB[u:ÚH}L(H$%¨9ÁÇÊ@­`^' 5.*Häa ½l¸õr…šh;^^^ׯ_בaâĉ;wîl·þ¼áj\lTÁ%º®‘0P˜× CÅb½œ¼\@ÔI81zb¨9ú£~Ö3ü;Î*Zö–îœGŽ>|x·nÝzõêµxñb©Tª#sXXØÖ­[cbbÜÜÜ‚‚‚233srrBCC»wï>~üxÆS -Zäíííîî>mÚ4¥M@]]ݬY³\]]ýýýÏœ9£¬vàÀª?{ôèñÛo¿5iš$Éøøø~ýúuëÖ-444==]ÿ¿F øýðáÃ?ÿü³ùp¹+W®¼qãFbbbVVÖºuëtçß½{÷àÁƒ/\¸àãã3wîܯ¾úêË/¿<}útee寙<‹/ÎÈÈ8tèPrr²T*ŒŒ¤i-Z”ŸŸÿË/¿$%%íÙ³GwÜ7!...55uÏž=©©©¡¡¡‘‘‘ååXÏ&lÎѹ¹¹4M#„BA( …BqõêU©T*“Éär¹\.W_ 8nÜ8æ@$-Y²$66vÅŠ:Z9rä¤I“`þüùK–, €©S§ù¤éG©T˜˜hkk{óæÍˆˆÝ•p¹\m?™‰XwYÇs8ÕcÕlêõ „@"‘˜››ënÓjØ™£<Þ‡h„h„hj²{4ìÍÙª@ 9IÈ ÙýWÀü«ŸÊA)€¦÷Žzñáûñãǵµµ111:t€´½3nnn\.÷Î;ŒKYYYaa¡§§§»»;MÓ¹¹¹Ì<[PP “ɘ"–––J•ŠŠ õûH>ŸåÊ•°°°¶÷£vž](D½m-~ÇFL¢n‹rJþ¶uÿ·m}¤ä‹ÿÞ2BÖWô¶o×~ýoÔqrr211III€üüü]»vµ½3vvvááá±±±™™™‰äóÏ?ïÙ³§X,¶³³5jT||¼B¡ ">>^9¦0àØ±cÌíÚµk› ½`mm=eÊ”ØØØäääâââìììõë×ß¿¿í½Å(a)i Ñ¢)êïX”ŠFª¡¬oT¼ˆE‚$(DQ4B4R´¶¶Þ¸qãŠ+Äbñ¼yófÏžÍJÖ¯_ïëë" ÷ïßÏÌÂß|ó ‡Ãñõõ>|ø€”îüùó…B¡Ïˆ#¬Tލ²bÅŠéÓ§¯ZµjÀ€“'OÎËËëØ±#+½Å0¼X«Ÿrþì˜'ütè@ët:û%;(šB4M!*Ú{>¬ÍøJFÈd¤BFȶ Ý ÓÎD˜0ÜvÈׂyõ8¸ÛÔÔṫšê[͘&)K}W5II =ÈJ[˜×C}l ……… h’èíí}ñâÅ—ÒLû`Œ±èììŒu»o XK‹1 5.Þ¾}[¡PBhðàÁjó:Ár,Þ»wO¹¡‹««+ܼyóìÙ³ …‚¢¨±cDzÛæu‚Í9Zˆ …B*•J¥RÇ¢B¡øá‡ÔK………%%%±Ø m´[C˜ÖÁZ,Þ»wÏÜÜü­·Þ²²²©TÊèt€¢¨îÝ»:ÔÞÞþ›o¾iK+cÆŒÁ¢ÿ×Öæh™LÆ|ÒU(:½0NFyyyÉårŠ¢òóó¯]»ÆD'£kãâ»ï¾ …B&“ÕÔÔ¤¦¦¦§§———×ÖÖÖÕÕUVVvìØñÛo¿U/[[[ûÉ'Ÿ¸¹¹ùûûŸ=«ÕMeîܹééé«W¯vrrêÝ»7hׄ;v, ÀÅÅÅÛÛ{Ö¬YêU%$$øùù=yò„‹Ç°;±xûöíÔÔT„£*¨©©¹uëÖ£Grss322˜<ŽŽŽ|>Íš5kÖ¬iR|ÇŽÁÁÁiiiS§N={¶D"ÑØÊÖ­[ÅbñòåË‹ŠŠ²³³A‹&¼¬¬lÁ‚ ,HOO?uêÔСC›ÔwòäÉãÇ¿õV3ë0í ;±¨P(<<<:uêTSS¥¥¥'>>>..ÎÜܼ¬¬ŒËåVTTøúú~ôÑGÅÅÅMŠ}üñÇŽŽŽÑÑÑb±øðáÃz¶;nܸÀÀ@‘Häçç·dÉ’sçÎ@uu5‡Ã6l˜ƒƒƒ»»ûG}¤ÌOÓôÒ¥K/_¾|âÄ ui0æåÂŽ®[*•ÊårP(ÀÒÒR)a0Ç¡††uu RkÍë¯bÔ¨ ïÑ£‡X,6lØ AƒÂ”û&mÛ¶Ëåž={KlŒvtÝ¥¥¥÷ïß·³³óññ©­­uqq©©©Ù½{7ˆ"‘ˆ‰•ýû÷766;«Tµi¹\î‘#Gnܸñ믿nÙ²eóæÍçÏŸ·°°??¿”””+W®Œ?ž•>`X„çèÉ“'ÀñãÇkkk™ÁÏËË+//$I¹\N’dMMP(Ü»w¯zñÌÌLÕã>}úhkˆÇã)èЄs¹ÜÀÀÀÀÀÀ x{{gdd€X,ž8qâŒ3„B!Vh¬=G?~\¡PØÛÛs¹\sssSSSWWWKKK¡PhnnîêêÊãñ4ªe¯]»öã?–––îÚµ+==]õ¯ "‘èÎ;eeeÏŸ?צ ÏÊÊÚµk×£GJKKO:Åüÿ ¬!((è»ï¾›7oÞ¥K—غv +°‹ööö&&&ùùùÉÉɧOŸ–Éd2™lß¾}G-((055íÔ©SEE…zÙ˜˜˜‹/úûû'&&nß¾]¹ÒOcμ¼<__ßÀÀ@mšpssó”””ððp±X¼}ûö­[·2_#•Œ9rýúõÑÑÑiiil]>¦í°£ëføú믫ªªjjj:uêdiiBÄ÷ßÏ,qª¯¯'"99™õkÀ¼º¨êºÙü½lÙ2Š¢„B!—Ë¥iº¢¢¢¸¸XõC DŒXÖélÞ¼™9˜7o^bb"óÈüóÏ?·¨¬ë~31”~Q”­ëºßL°®c,àXÄ íºöª14œ&ZAX\MiÏv1¯í:.Ò2¹é¸Ñ´¢•ßëëë###»wïÞ£Gv;¦t¿DÚ/†½OSTã¾Ã­ŽÅ£G>yò$55õîÝ»lõª‰P<88XÇ›vŒAi¿9É4AEYeÜh] EEEÞÞÞÕzÅÄ45ÀÀ´G¬¼÷ÞW™C—Þ€ºA4AÒ¡ˆ$I®_¿^,¿õÖ[ÚtÝÓ§Oß±cÇéÓ§œœæÎ ÚM¶ÃÂÂ6lØ0cÆŒ^½zùúúþòË/ÚRŠ«ÎÑÚL¿µÕi#쌋ägs€ iŠìùŸ QÄ$1?»ªþãÏŽo@¼»éâOÅœ¢•ñýÊl+W®<þ|BB‚——W~~¾¶1‰‰‰«V­*..Þ±cG³ýÙ·oß¾}ûöîÝ{âĉùóç<ØÊÊJ½¡­[·Ž9R£bcñâÅ÷ïß?tè¹¹ùW_}yáÂƯLcý-þ«aþ Kã"AòFÿ­ ä“^¸Ê_~QÔÁ´†?³Ð†Œï~³r?ÒÅŸ¢ˆü­)’T–«­­=xð`BBÂСCE"ÑÀqWùðÃä>ø@ deeµ´!Æô{Íš5}ûöõððزeKNNÎíÛ·µÕßö>cØÑu#‚@?¥ ’VÒð1§lûÓ]†#š¾š0°Öw RÜÜõ€oô‰®•"ê±øðáC’$Øö+QEU$feeU[[ÛÒ†´™~ûùùi¬Ÿ½¾¿¹°£ë6I|±þ½¯2C‹Ó•fþ(‰"¢Ö—B ˆÁ§:5·&ÛMN±Ž¡ë3aóÙeøò;Iœ¶ïÿ¯žÓ…ˆ  ÂrÆÇ´\aó S[Æ[}c}hÖd[Ÿ†T…âª(M¿™ŸJÓïVô£'ìÄ∕÷˜DD‘—âý¯%XݺNKåÏ7í¢IJGAkk눈ˆ/¾øâòåËÅÅÅiiiW®\ѳÑfM¶õiHU(®š_›é·ž}ôvb‘TÈÆø(Џšð¿2›™¶³ìr³u—]µjÕØ±c.\8`À€/¾ø‚YO¨ú˜l7ÛªP¼I~m¦ßÁŽ®{èÒÛE ’¸¾!Ø@ż–°ï×}yí»¬Ôƒy“1:d,ê~c1ºXÄ¢î7¬¥Å 81Æ‚çèbÇòíe2sñÜlHn]W K®EÌ+¡ÆÅ÷¿Ûsåç“ÿßœ°éþ£Òß±_”tÏ·w—øI.º zyy]¿~]ÛY¶<·±~Ûam\/p9Š@rëÓsˆ€kB"°sHp·þÅi;J«dF2.bý¶ÂZ,ò÷ O @wà› 8‚i•Àî™4_AYÉ/lsÿ0¢¼²Ž­æÚÖo!¬ÍѦ¦U¥Ò§)%?§”ˬ¼þ¨6«ÏTŽd4вºâNæ ­z,““êëêêfÍšåêêêïﯪÓÖ†Fso’$ãããûõë×­[·ÐÐÐôôt&ýùóç3gÎTV®¼P£±NÛH`/4—Ãá—|àrø<މœjD4e¡°îhoÉ7µÖXpÑ¢Eùùù¿üòKRRÒž={tËm@‹¹w\\\jjêž={RSSCCC###ËËË`áÂ…%%%ÉÉÉŒ[[åûöí›3gÎýû÷cccçÏŸõˆ/vbqвýá#ž+ªx>—Ëçr¸\ÏR`-äYt6uª*xÞ¹sÇ’G·Ô VUU%''¯Y³ÆÛÛÛËË+..Ž$5Œª¨›{×ÕÕ8p`Ó¦MýúõëÚµëœ9s<<<Î;WYYyþüùµk×zyyyzz®^½Z[åX§m °£ë®r:Øÿ*¿NѤHØÝɬ»ßòi}Þí¢4‚kh*é­ÒŠzõ:ÿúë/š¦•~Ý}úôº»¡nî-‘HH’ RÍ6hРÜÜ\‡Ã,ª///ÆÁV¬Ó6ØÑu›ÛüÙ@¸÷· €<ÓÛeW²ž¥;Ô‹Å>áùEÔÚ93Ä *«¨ÑøÍåry<sÌáp”Çúƒ‰D¢4¬gP.Oi,3ØyŽîPS°/-k- ^@=étñË¿ãÀ ÜÃ;sù¼Ê* ƒ»»;MÓ¹¹¹îîîPPPÀ‡ê@ÝÜ›Ñl_¹r¥‰·››MÓÙÙÙo¿ý6äääè/ŽÄ´?ìÄ⥥?j;?ÉÅÛKë–>vvv£FŠß¾};³%Œny6ümî=lذ“'O2{jX[[O™2%66–ËåöíÛ·²²òìÙ³!!!½zõzÿý÷—.]úÍ7ßp¹ÜåË—óù|<-íñ=º‹ƒ­Ž³ß|ó ‡Ãñõõ>|ø€šÌ³êh4÷^±bÅôéÓW­Z5`À€É“'çåå1;¸lذÁÁÁ!$$$**jêÔ©&&&&&&,^†EÚC3fa.,)«ÖvÖÊÊj÷îÝÊŸQQQ:ªÒöòÇãÍ›7oÞ¼yMÒmll”»x4662û®ýç?ÿÑVç­[ž÷1í@;髪ë^Ê׿ÌÌ̺ºº^½z•——/[¶, ÀÁÁ¡ý»Ñ‡öˆÅ“É-[rÊ¢´[&“ÅÆÆ2;z åçñ“a·-Ìk›±¸ðF´c‘£‰ãg—¦©¦OþilgsG‘èƒÝ£ÚØD«-»Ù„c ;Ï.‹~‹¡i䨡‹›•;I‘AD'O& ’$(’ D6Nž]øÏþqGM:~dÊéÜgyEˆÌ-È% òÊÒXvk“d«£nÙ­ÃR;!!!**ÊËËkÛ¶mMêIHHðóó{òä +׎a Öî)’"IФ("éeÒGï|Éi’¦HDI*šŠÚ$Ùê$&&FGG‡‡‡mݺ/^œ‘‘qèСääd©T©4SLJJŠŽŽÎÉÉ™5kV“æNž›L‘ˆ"šY{Á0*oÿ[×¼¬lÙýfbt~Ý€-»ßT°–c,àXÄ 81Æ‚¡îç^šFQˆ")Фö„Ö‘³¾¾>&&&55•Ïç?zôÈ@ýÁ?ìÇ⼫3ºEb‡w…3 ¡ZYí—ä—>><ù¿ó¿ZRí1cÆŒ9röìÙ/»#¯!,ÏÑŸ_ábÞÍݦ‡Ã#)’B—ËõpðèÞÉõƒ]#5QJµ---ÙíLë âewá …åXt4íâléB" QèQù#I‰„$I Qou~«‹H=¿ºT[#Úl·µiµYpëÈßD~äÈ‘áÇwëÖ­W¯^‹/fÌ•çΛžž¾zõj'''ÆbTQ:¦YØŒÅO/Nu4ëB!ª^ÞpéaJγ‡9E9OiP4Ö+œ:u¾®©0Q]ª­m¶Û:4á-¸uäo¢çr¹+W®¼qãFbbbVVÖºuë`ëÖ­b±xùòåEEEÙÙÙº+Ä´6c‘$©OÒ.<<MrõÀøŸœtâ?Q§H‚|ü,Çᙚš­ú¨Ív[·&\Ý‚[wþ&:ðqãÆŠD"??¿%K–h”š·E”ŽQ‡5]7|?ê òxÂþÿ;2å4 ’ IѤ¢5±¨Ív[·&\Ý‚[wþ&:pÆe4;;›ƒ…B¡zÇÚ"JǨÚ®[•ñûÂH‚€-CI‚uîR¯¨—7*HVuº5áêâ1ÝùUuàR©4***:::11ÑÖÖöæÍ›-í¦¥°ÿ®{\R˜£µ££ã¨ÍCíº õÆáqùAîãÜ[k3›/¯†Òv›ù©´Ýn©&\ÿü?®­­‰‰±³³ãp8ýôSeA¥f;''G"‘(5Û[ÉÊÊÚµk×£GJKKO:E’$³ÀJ©µ~þü¹Æ‚ 8vì˜\.—Ëåk×®år¹`mmñÅ_\¾|¹¸¸8--Y-ÐlmÁ¦6"***77÷Ì™3‰ÄÒÒÒÎÎÎÖÖÖÎή¤¤äîÝ»¥¥¥ªQ¨dÆ !!!QQQS§N511a4Ûꘛ›§¤¤„‡‡‹ÅâíÛ·oݺÕÕÕbbbòòò|}}5œ?¾P(ôññ1bÄàÁƒMMM™ôU«V;váÂ… øâ‹/˜!¹ÙÚ0 ~Ý{öì¡iºÿþÏŸ?úôi}}ýœ9sô)ˆ5Ûo÷ëž9s&ìܹ“¦é˜˜Ý™±fÃ`@d=_«k¶±_÷›ÉË÷ëÖ¨ÙÆú!úÏìIDAT~Ýo X×1 8.2L i›H FƒD …3O¾X~µgt_À‰iöçh’$gžÌœýKÖð~Þ]ºt™ØoæÉÌ™'3•ÃdÂÂÂ’’’XïÃĉwîÜi Ê1ìÂæX¥'ö+©kE–Ô5Nìþ;}é³°vƒƒƒuìâ‹1*X‹ Š¢vÞœÓA` âÀK3àÇÑÒ ~+®5wz‹­¶ô§Ù·›ã9š$ɿż'÷v14766~þùçîîîªÞÚѦÐÖfЭ:G766.Z´ÈÛÛÛÝÝ}Ú´i%%%Lº¶²˜v†ÍûEÏ#lÌÑpèa¥‡9moeN4MÐöVæ”–ûEøþûïÅbñ… ƯôÖn) ºUY¼xqFFÆ¡C‡’““¥Ridd¤RÓlYL;Àf,–“g“w  NÞÍÖ¾¤‘àÏÙ±“³c§Â’òg•UDÎda5)8bĈÈÈHWW×E‹q¹Ü¬¬Öø’©t«ž­ªª:uêÔš5kúöíëáá±eË–œœœÛ·oëSÓ>°é׭ʬ5K††ýûÒŸK†úÐ4‡omþ´²âÜLÈvåëÄäÀ¡#®_jROÏž=™gkkÛºaIÝ [õlnn.Bˆ 8èܹ³³³³D"ñóók¶,¦}`Ó¯ûBfm‚l,;¾çµüÁªÿ¥çÿ*:Rëf¦as+FP¨:ÚÚnF[Q-æ¥ÀÚ={Àö†ÆÚïOÀœÿíŸïŽôÈŽ˜-îXYø¬â⯲m’i m}pssãr¹wîÜa~–••â×=F;±Èçóù|þì€ §¢NN¹v÷M×ì;„<=Ììíhš iÂ̾#Iµi+ m}°³³ ÍÌÌ”H$ŸþyÏž=Åbq[:ƒa6Ÿ]ø|þúÑ7™@‘_`íÙ,.áñ8]::»TT=+iKÚÚú°~ýz__߈ˆˆ¡P¸ÿ~<5Ñu3OÊ¿GÎê³l1‡¦kwý¿ŸM€à€¿McþÆàºn&Ô|îºÚÓW™8$çMÓ8 1Ú0`dðù|fdàñxzĺî7ÃŽR­uwc^c°®c,àXÄ ™£WßýqEQI­°ÑM`^? 5.zš{ô°t×ÇÆ©uÒk,Ø~ý0H,ˆ h¢Q.#´ëÄ”`é5†µ9ú묥¢€ñs’+h ðù$I~z~£ÛþƒÆ‚Xza`m\¤ånæænæænáîmïM"’¦Á»“w/Gï>¢Þ:Èfg[uWí&Ž92|øðnݺõêÕkñâÅJÁ„º¹·¶DŒ1ÀæzÑèY}ÁsÙs’&Ms€®VÚꃺ«v“ \.wåÊ•®®®………Ë—/_·nÝŠ+4š{kLÄ ìÅ"IeWd[ ¬ÌEåŠ&M“ˆ$²·°ÿðÀÿ1ûœŸ™uAÿjõqÕ7ns ‰–,Y»bÅ æÞú;~cÚÖtÝÌ»›ù—£; ;*(…hЦò*s]\ºvrF@]ɸ֢þé㪞ž¾fÍšììlfv … ÅÜ[ÇoLûÓ‚ûÅ"5ÔóIш@P ’")E"Фå@’­4ëÖ†T*ŠŠ ¾}ûöÓ§OþùgæEcî½k×®.]ºlÙ²å½÷Þ«¯¯×˜Èn0­†µ9zÞ¥Y$IÙ˜Ú(A"’ I’"M€ÈBô¨à¯Â’§B:VjDéª=dÈ?~\[[ØÔ?xð@yŠ1÷ \°`··wFFFpp°ÆÄÖ_6†=X‹E’¤¼zr8œÜ繞v½Ñ!È­‘p9üÂ’§>½ÒŠj•®Úñññ={öÌËËS(ªqéäädbb’’’šŸŸ¿k×.&=++ëÖ­[C† ±²²ºzõ*cî­1‘•ËÇ´Öb‘ I¨¬²»½íßÉ/yò´¼ˆ¢¨N6\º¸(HBýáWV­Zemm½p᪪*ggçeË–©žµ¶¶Þ¸qãŠ+V®\)‰fÏž›{oܸ±¡¡¡{÷÷_ý¥žØÖ+ǰkºî™§&{wõ¦išBô­·ŽE€÷w ðHPÄõôÔ« Ò q˜Wƒèº "Cr‡¤(Š¢âÅM!ERWn]¥iZŸ˜7ÖbñÀ¸ÿ¨'¦ÌÕ÷ ÖrcŒeõ Örc°–c,°3..¾;ŠPÚ¸«I†è³‘шBÑ¡ýc5Lè˜7ÖÆE‡]œ…o1øùÕ™ª§¢ÏF~?ê дƒ™£ƒ° ¢[b^'XÛ':8vº,ºÞt»5D¡§":™:8Ytåò¡Xê4«3¨„»¾¾>22²{÷î=zô0P=a') 5<ͯϷà˜÷¶~ýsiBtßÎý-øEõO—å7›Õuë#ü3fLëâõèÑ£OžŠB`Ê7+¬.<q¼ÉîÌ111Ú¾5뙡uEEEÞÞÞNNN–––¬7iìÄ¢ò1£üÖí’›MÎR$u³à·ô‚Û$AM88ú§O¨žmÑ­Ñ[{îܹééé«W¯vrrêÝ»7$߯_¿nݺ…††¦§§+‹'$$DEEyyymÛ¶múôé;vì8}ú´““ÓܹsA»D\£¶\[+˜VRYQ^YQþŸCä2Ùþ½»h-ˆD"m§ÚÈ„ vìØ¡g†ÐÐÐÞ½{gddÐ4}üøq77·ššš¦G­ZɲeËBCCïܹSXX¸mÛ6OOϲ²2¦¸§§gjj*MÓ 4MÇÅÅÍž=[Yðèѣׯ_/**ºyóæ{ï½·råJ&=66Ö××÷Ò¥KEEEÌ®ç:ZÁèÏþ½»˜Ø«¬(õÞ/6ë­]WWwàÀM›6õëׯk×®sæÌñðð8wîsvôèÑ QE;nܸÀÀ@‘Häçç·dɦ£-OHH:t¨H$8p`pp°îV0­€M¿îö¡Yom‰DB’dPPjâ Aƒ˜Ýë 4JÄ5jËu·‚ilúu·Íx"„@"‘˜››«ŸÕa7ÅHÄ£££mmmoÞ¼ѺV0­€µïÑ3NEE!š¦I‚:4ñg婱Ia4¢) q—DÄ™9-X{¥'<þûñœ‘‚_¹r%,,¬E•h“ˆkÔ–·ºŒ6ع_Œ>¹7üGèeß§OGŸ&gE¿-z§·¨7ˆ#· g¥QUD"Ñ;wÊÊÊž?nmm=eÊ”ØØØäääâââìììõë×ß¿¿ÙJ”qP•ˆ+µå—/_...fž]ZÝ F쌋 99õÄGŽf¢éss¥¶ÀŠ ˆêÆêŽB¶¾ÇÌnìóÙgŸùúúZYYegg¯X±ÂÞÞ~ÕªUÅÅŶ¶¶þþþ;vl¶mqТ-o]+m°£ëžr|bs'»vEµE¥u%¡#‘'•gC·às-;Ù[Ø=«zV\UriáUåÙqãÆ5jÆŒ¬]æÕAU×ÍÚ;©\ZT[TZ_òÓÇ'Ô÷p99ûLayAiM)­ò1š ˆû÷ï?xð¯™Çks´Œ(… !46)ìø´l5zfÎ…›†@qU1E!e8fffNœ81<<|РAX×a'G×áÂüËê‰ï¾ûîãÇ™c¬ëƼzß]0¯+ŒÅ‡§ÃrNãwo}1ÈÚ+IòhDQönPÒŠûG߀^ãñm¦Ø%É£-DÃ{ŒØm×}„¹­§ÇÀÏ,;¿ýÇZˆaaaIII¬wCíß"FØ%É£;Øú¸ø¯6µí´‚¬~Tòû~gïÇîl;»ýuzF]ùƒ¾Óo°Ø"æu‚X”$€ŽîMíú4>¯(~”J)ꉆâ]PÕ} —wFÖ•ºþyxlcõß9wXió:ÁÚÝcØVKûž²â«¨êF‡F TÝ©ý+ݹÿ'f.£Ìœšðe‚†»öNÝ=Þí´o´‘àçç÷äÉmÂÂÂþýïüñǾ¾¾þþþJïîé±µµ¨­’çÏŸÏœ9ÓÕÕÕßßÿÌ™3^^^ׯ_¬ëfvÆEDQqL,mËef¶66¶B!4‚¬(´PZ|³þqši·i-kRãââΟ?üøqu¡¤*III‡îß¿ÿµkצNzþüy–ÝМ×w“µU²páÂÒÒÒääd‡³lÙ2eŒÆÅÅeffîÙ³§sçΧNŠŒŒ¼~ýz§NXù“¾°úìÂl¼­ûsf ¯ð€Ó˜ u* Uå_­ãšÒ&v4AÒjÚš¦—.]zùòå'NèD ctÝAAAƒ>|ø0´D­£E•TVVž?~íÚµ^^^žžž«W¯f|ð±®›uØÑu#ÆXŒF@Ë€ßÁ´“i"4•U¢’‹5DmfIu°D iZšŠgÛ¶m\.÷ìÙ³úè\zöì©zœ -ÑcëhQc%¹¹¹‡YÒ^^^ŒºëºY‡¿n𹤕ÿVð-œ,= è`*—”TFÖ7rŠƒÚ¸èççWSSsåŠ^ƵÌZRÕcm–Ý:Po±¥•(uݪÅ‹ës °äpùÀÕD PR0‘4Ðr 5*È‚lT¬{Áß&ªˆÅâÝ»wùå—ÌSݨ.ªÏÌÌìÑ£‡RmggÇápÔõØê•¨·¨­777š¦™Ñrrrär9¨èº[ô‡Âè€XD$•Ÿ¶YZ]º‚À(ÐТd ²QÁ3q±òøQ¼ôßhMãMPPÐwß}7oÞ¼K—.én+55õ‡~(--ݹsç;w>úè£é±µµ¨­{{û÷ßéÒ¥999‰dùòå|>ŸÃá`]7û°¸>úî^ÿü«ËɪßèÚ ºèz²½øÂ§'ß«¾½®üÚªßw|xýk7õR¡¡¡‰‰‰Ìñ±cÇÜÜܘõË Ý´iÓÔ©S»wïîçç÷Ë/¿0é'Nœèß¿¿¯¯oxxxRRR·nݘt…BñïÿÛÇÇÇÅÅ…y§££Em•TWWOŸ>]Ù¢»»û­[·hš&IrÓ¦M~~~...ï¼óÎìÙ³KJJšý+aTQ]Íš_7ÃïÅ4…DïŒù„!«yr*þó~eÁ øRÒÆÿsÂÂÂ>üðÃiÓ¦µ±žVSPPàïï÷î]‡—Õ‡× ƒøu3ôN€Û[} Óº ž.-+|ö ‹”µ= _"™™™uuu½zõ*//_¶lY@@DC`λs€ëzB—úa ÖucŒ‹cµ9úÛSy• 4¢iQI#шy›H‘$…• ±æ“¶Zļf°‹kåYZš;š6Ÿsþæ_7ͬš2qâÄ!C†Ìž=›•ž`^]؉ÅF‚n¬jº3ó©OÕŒ¦AJ¨­ãÇ`€­X¤)zÍÇzy?̌ת“m A‚—[¦°µ§9IÉIJ¦ ddƒœ¬nWÕËÊŸK‹Êë‹Êë—Ô…šQШ£MËÝÄ|-Zäíííîî>mÚ´’’&§6a¶z Ú¤Ýaaa[·n‰‰qss ÊÌÌÌÉÉ íÞ½ûøñã«««Yø#¾ñ°ùÍår8@s¸x0áóø<>_À55˜˜ðÍ|P/êCRRÒ¿þõ¯ŒŒŒøøø9sæH$eztttNNάY³`ñâŇJNN–J¥‘‘‘4MÀÂ… KJJ’““÷íÛ·oß>e„©×ÀH»oܸ‘˜˜˜••µnÝ:eÎÝ»w<øÂ… >>>sçÎýꫯ¾üòËÓ§OWVVnܸ± 6Ì ØÚß…— \.‡ÇQ­ x\ž©€Çårø&\hݦWµÜðOóíªªªS§N­Y³¦oß¾[¶lÉÉɹ}û¶6a¶z  EÚÍ0räÈI“&¹¹¹ÍŸ?ÿñãÇQQQ½{÷ž:uªFY¦¥°£ëfìš„8\®€Ë%âñ¹@Ó@Ñ&< h0𘜨ås4hÑrÃ?Í·sssBLÈ@çÎ% ‡ÃÑ(ÌV¯´H»”ûÙÛÛ€‡‡‡òg]]]+. Ó}cQ·HÑþ‰¿eÛ<‡â—¦ix\AÐ𷺥¨k¹t˜oë‰j ºýº¹ÜÌ!ª?iu“?LËagŽ& "¨üGâq8.—Ï  @¤–:t¡®åVÏãææÆårïÜy±òº¬¬¬°°ÐÓÓS›0[mÒnLûÀÖý".— Dåü=Xò8/n"Õꃺ–[=]xxxlllff¦D"ùüóÏ{öì)‹µ ³ÕkÐ&íÆ´,=G# “T“ÐdŽ‘¦œÍséÒ%ÿ}ûömß¾]ÛV•ëׯ÷õõˆˆ  …û÷ïgbnÆ !!!QQQS§N511111Q/®ôë‹ÅóæÍß‚Ú}uݺ·èh'§.ˆ¢×x’$)‚@!„hQ$ •v´?3¾E•³«åÆÂl£‚}]wKëÁÂìWji[„AµÜX˜ýJ`,±hP-7f¿`--ÆXÀ±ˆ1p,bŒ‹cÇ"ÆXÀ±ˆ1p,bŒ‹c¡é»î‰»_J?0˜ÿÅâ15Õc…3c^ètÀÂÂòåvó&S__÷ÿvB‘;æÔpIEND®B`‚PKcKAuw°··5Pictures/100000000000033E000001AB590C68E959954610.gifGIF87a>«÷‚¼‚ ˆ(œÂ”(E[ÚÇzWF:J ÌŒ7ÊåÆ &/Âdb\LcED†LˆŽ”ôèšy¦u #l C††­„ˆàô„F$ÆÈÆÙ§47$„–hTe™DŽÄäæä3 $[.§¦¨«Çª\zT236ɦ…éóð DDF_Qi©ÇÜ»k-ÈÚÅi‡´USTDI[ß×£D0+©ÊmddÉòüF¨Ñ54FKQ‚ü÷Öãܾ .ªLª‹|Ô¹|jªÕÉçíi„a¼ÜÁ“lR©Ñ©Äˆi„’¤Ï´cKLIy”²l’evD*¥»§:<;ÛÈ¡(D‰U3ôöô“}d3wˆ³…/-80Y˜i:$oll³ÜêØèÕtvt¦ÒßÓÔÕd²ß ƒddëííD´r4ßºŽ”V, #%(cdhìåºXv©LEBˆ¹Ú´¶œ˜–HšÌ=R5<44wRCìÖ„žjMüþü±íø¨˜X„ÊÜ\´,nÀ(@LM[H;6p~ü<•Êþü‚„ S2}À>!W¶Ù;‘{ÅÜLrŒ´‚\Ô— T^œ¼š„JYjЙfÅk,È|4'T'+†Ë©Ux‡”j˜ÊiÃàã¹W0ŒËœC\r„²]$^[d–ž¦Ùöï\§×èÊ„Üδٮ…ÙääëÉ•$,Dš¸–X™ÈÜ«L{›ÑWLT±eT”f\sLG$S°´{YµÒàYwÄW=1hÒì¼®œÜÝÜ{¦Ðu›l†YMy"˜»ÖðתŒj4–‘‘¼Â¼¹Ð·-.,DZ.§»Æ™ZL¹ºº gÌr\Y v=<$šÏÞ¸šh$"t$œE·ÈÔTjD+K…åíãÔ½`blxl^TºŒcм Lbt—âô—ÅÜLz¼\‚\<44EV|xxœšœìúû\^\4«þ¥a“&àÀ‚*4È0aÃ…#Bœø°¢D‹/jÌÈ£Ç;‚)²dÈ“$QšLÉr¥K•0[Æ|)³&Í›3sÚÔ‰s§Ïž@y ý94¨4ÒîH¹Ã´S¦K›>UúÔéÓ¨w¬B­:«VªR¯rvkY°Y»Ž5›–l[¶_½ª=+×mܵhïÒÅ[îÜ·yÿêÜ7°]Áˆ+ö»Ø0ãÇŽ#žÌ·òÞË„-gÆ<¸sbÈ”9–¬ÙsãЛS›]z4êÕ¤EŸn=[6kÛ`µfAzGÚ…¿}<È„`pâÆ‡,.!óãË“;—޼yuèÒž+ÏN=ºuïØµþOÿμøëÛσOß½|øöêݳ7¿>ýûïñÏÏÏ¿ÿñýøzHàë˜ ‚ò)Ø ƒñEh_€N8à‚>˜¡„ú9È!…Z衈vX"ˆ¦ÈasÜq6õ„Í•·áxŽñèÝÌÉÐŽAæX$‘Cöx¤’Iþhd“>F¹¤“HÊȤ•T^)$–RB9e—\~)¦—d†Yæ–h>iæšiVÙ¦–j¾™åœ`ÊYgœxº™'œzöÉçŸtŽÉæžžIè~:h¢ˆÚ¨¢v zcpÜݸ[RA¥ 2´i•œf*ê•¡6Ç©xžŽš`ª,vZЧþ¤î8ê©Ò±Jk«³‚*«©ºö˜k¬¾ò ¬­½;쫪ºúëªÈ¶Šj³·– +³Ë*+,µ×Z;­¶É>[­·Ù‚»­¸ÝÖ m±çû­¹ëâ.»ïº;.¼óÊ[®½ÎÒ{¯´ûîZ/¿ùâ­¿ýþ¯.J£@4ìðÃG,ñÄWlñÅg¬ñÆwìñÇ ‡,òÈ$—lòÉ(§¬òÊ,·ìòË0Ç,óÌ%|‡4άóÎ<÷ìóÏ@-ôÐDmôÑH'ýp¦»aÓÃJG-õÔTWmõÕXg­õÖ+µ”`‡íµR€=vØh“ݰÙ_S•¶4lÍÌqm÷Ýxç­÷þÞ|÷í7ËRøÖ£qƒàâÓ„N‹k K£àÒ0¾‹¿ø´¢¹æ21ÚR¬ :Ø.zé¡£~ºË¦›^1é®Sûß´×nûí¸çõÓ3BÞû@»õ† Ä_ù¯g¾ìáëîþûðÇ/ÿü®Üý=ºøÆ÷?äûR2EOFrDJ䎈¸â±ˆÒh“²Ä:sØãž×§Åaªï˜¢3#ÁǶ)†-bi‘9ÆhFs™c<¥6·ÉÍn*펕\þÄ£dJ yôø˜£?"°aLC 8'æ¹&J성þ;!#ÉIiNR|Ä$Æ@yFPŠÒ‘¡ÔdA-é͆:ô¡uYoŠÎ’s‡rÕ%ÄXx½Óå“ÂÎ9ÌžÐÌ¢1£ˆB•úóšâs)1VÌb›ãÃ"êiÅiFô§@ ªPiÚ£þÉ’ $(Ax,У;é,FGB. ¾¤Þæ&æµ Rò«(T¨I7A~^1›“¤A?)ÖN*´ŸC«\çÚÐ; Ðx•:ÜoŒZ<1!räTóž½L1‘[uZ/¶Xº:ö±5¥+“´VR¶‡üÓóø?yÊq”ýÜ[#KÚÒšV†wà²@‚Õr¡µYxþ­jË&ÛØ¶¶¶²å#СZ×ÞÖµ"Í%o2ÊÆJ¬m§M®r—«;¾:÷¹Îmt ÏßòrÌÍ®v·Ë]8îraÒØB2¶ðòŠ·¼åMzÏk^õ¶w½îM/|çûÞúÊ׾콯~óËßøòw¿þõïzL_ã7Àîo‚|à;¸Á6°„a O˜Á~p†+Œa {¸Ã Öð‡Eb“øÄ&Nñ†Wï™Î€¾óŸíçBºÏ‡4¢ hC3úÑ‹Ž´¢'íhIWšÒÎ4¤1½éK{Ê=þñ•{ŒÞZÔ¦ó—SêSëxnÃ%ˆ¨­÷·×=ítÏ»ÝõŽ÷½û½ï€w{àÛNx² þð…?»áÏöÅ;^ñ`O¯zCýs5»çO5¶K=ùòÆS$5È,oÌWÛôÏF=é­®z¡³þÞ­Ç|Î{ïœOÕ§‡òëGŸzÝçž÷ÃÎrï_lá÷ÿ}ò‡¿üã+ßøÅG>ôQ-ýê?ßúÌŸ¾ï³þ}çsÿúàÿ¾ø½Oþ臿üÔ?¿ùÇ¿~ôoßýÄO?ûåÿæ·ÿþôÇÿûõÿýçÿÿþ€ý×GjI§j®g€£Fd_6{ñ•qÃa3ákZvu™çz™‡y}‘·Ô×躧jçrxrPÖuîesòås+øu/è‚-Ør%Hƒ,Xƒ8wƒ:ƒ3˜ƒ<ˆƒc„¹¶ƒ2(„1hƒ?H„HX„JèƒL˜„Pø„R¸„Tè„U„Mˆ…Qx…C¸…Vø…Z8…`Ø…b†\x„cˆ†f˜†=¸†nH†g؆p¨fNH†Zçdâ• ˜‚Z&^4Ø;×]÷c;–|:Vˆþe†ˆQ¦ˆSƈ‡˜~è{‘8z“hˆzXkwx‰$(‰µ§{—tÇ÷‰w}¢xyžHl£H}¥¸Š¨hŠMŠ­ÈŠ°8‹¤‹¶H‹ªx‹µˆ‹§È‹¯¸‹À˜‹¾ŠÁØ‹Åø‹ÂxŒÄ˜ŒÌhŒÍˆŒÎÐ8Ë(ÕH©hÙˆ®xÞ¸ßèˆ(‰&x{ÅG^A–j…XèkØ€Š³gk{(¥–‰õHñHˆ÷¨ùxˆûèý¨‡õˆ`÷hyvx‡ÓÖq ©f Ip ipÙöV×o¹nÉÙ‰‘9‘ù‘i‘é‘! ’Y’(y’*¹‘+I’-y‘/9þ’0É’4é’59“6™“8¹“2Ù“ù“É“@)’Ci’7é“A‰”D™”Gõˆ‚x(ƒ”§‡Ì–zC7Šèd¡v ÓG²¦yj†j³×eb™|g™egI 8iÙ–ø–9¦{é¨^)°z³wd 8l9‡ŽA¨Ž¦ˆ^¢'˜ÉF˜½–Ž»–¬ö—ˆÙk†_ù€~y˜…9™Y™`I˜·–”çjÈ—Z7˜~ š©™i™¦ùk¥9š§™™¬©š¨ùšŽ›€ ›®Y›³y›‘irº‰™¢‰›’Ù›¤I›»Ù—ÂÙš¿Yœ¡É˜¾ÉœÃyœ¶™œÍI™Ï)Õù—{)|_þf€Áw™ËGy ¨eH¦–5÷EÔ4˃s¥ÔPÔp¦&Ÿ·`eà©••§j¤v àžÔ@ Þ@j ^ge§örªŸ íI Vs }¸ÆŸšWžéˆ€¤æžìùž·à¹€ *e×¢ ðs, Ÿ g€=6 †˜‹¦ÖrÙtw(q æ ¢hˆ€ù¡ŠŸñ)˜ò©u?Ç£> ¡¥v 2j‹1úrNʤP ‹Oš•µX¥œxŠXJ‰0*¥VÚ¥MJ¥^š¥4:¦\ª¥fú¢h¦Wš¦3z€n¥l ¦SÚ¦sº¦uJ§_Ч{Z¦wJ£œwŠu™Šþ“wg¦Ù‚åYšI‰Ó— °†)4B}¢=V©©F©X –/g{T†©l¦¢AV¤x˜e›JªWZ c:Àc\Æš{˜ g d¬i–C†ežz ·@u³f{i™¶Ç«É;°W˜:—‹Ÿ ˜^6šã¸q=fcÀªªêø«åyr¢‡­gæ©Áz¡Nv¬˜(sl–cJºqa¹¤nvf(8¨df®ÙI®æx®«–®ô*¯Cv¯å9¯ñº¯ùÚ¯ïÚ®ëj¯+fðʬþz°îj°‹®´ª¯«®˯±˰[¯[°åÚ°Ë©Ùjˆ®fkºJŽoz°ØI²´ú€Âáþ"L°<ö8yEz©ó¹:@M@ Ê`y[pm¿)³cv >`MP¤šàO†˜>ë˜É° ‹Ð¬†³:› ¿Ô ó ¤PP%0Ÿ§ 'š¤N«¦J³üÉ Æ@Ìðå`³T»³«V|êy ;Ð ˆp ç °W+W°µ¤ÀŸ[?ðÁÐh  „{ Q@ M° Pz^®• ·`‰0Ÿå5··° ]   ¡‹€¸÷¦*³· ‹«³žËŸQ ¤€Ž1l¼jP‰ºÉ–»Ô¸»º¨Áë»Þ¼¿+¼ÇK¼àh¼Å‹¼Í«¼ÝȼËë¼Ó ½Ÿþ(½ÑK½Ùk½½›¨Ûë½×«½µÖy|ˆ•TI®=šº’v–H¾%ˆ¼ºŸWNØ0—ÀÚŸ% ?ð­CÚ ¢ :°½w²J^ýÙ%€·€z0¤°jÀy›gV^:•p3ð­[c@j:àêÞ°ð¢?@ºšÈqÈæ€ÞŠ©$¼$Lºü¿\•éqŽij;Ð – â * Áñé W°­@6»§ŠÄàîÐ?ŠŠ·ËšpªÉÐÄ<­¯`ç Ž"Zˆ¶÷lìéŸò鿼-Ú¢zžš‚Æ¢ä)[þÛêœyìÇ}HÈ}lf€œÈm¶ÈD¦ÈˆüÈÉ;É=*Ƀ|É•<Éš¬™ ¢›üÉ`éɇÜÉ‚\Ê LÊzlʆ¼Ê©|Ê®<ʰ<ª¬lɯÜÊ´|Ëk<|(fñ;£åx¨gÚy¸¶e†¹WÆ•žEƒšòi^4<Ÿ·ð MÀ™ ¨ÇeJ©ç¢ôùÍ ºÆÆ§Ã˜±JÍŠÉqàŸZ°Ÿ2 ¬çÈg«»ß\^”JÍÖ¬˜”'ŠTVŸ°[àB@ 4| ê  ¢EÊŸ œ üœÎž{eð•à`6ª‡ Ãu¬ÍáeÖpe¤»‰«=æ@С•½ »0fôé»yŸœ—ÂéHÙ‡M©‰½îê’0MLJ†ÀŸJ¬¨}Øñéc «:&®;{õL›·ÍOÛT`©þL РЭl¿\ÜHÝ–úÚ·ðÜé*}ôü¦iYrm¤êmÅçl´ÜÞ¢øÞë¨Ã\ÏÆ\ßôíÞmßìM¦ø-ßðØßúMàüß.àÁ·ßómà Žà®àõj1½¬A;duÉlâ̬Jš¥ÚʃŒýßNf—N´|^i[ŸJ¡[0’«˜¼Ùyª8eü ¶`» ùpWÏÉ€ïཚ§¤èxhPh@ ¦æâ&M÷ÐX` ikО±+ J¼Pê¹èˆÓ8=hpÍSYÏž9yÉ}ÐüiPiÀ ¦«@ Ñíå&Íâ ¼vkàþ_gg.ÓJN–[† ªPÙù¡xmçÊš ŽÏ)PÎÐÆ”ˆ×˜¦»æsJƒCh×£Æé+èé[zyšþéêê´Œéžê ž^¢®ê¨n¤°îê¬~ê´.ë­î‡µŽÞ¥>ê™þê¹Þë³®ë¸n뾤ÁìÆ.ìɾë2®_‹¹z<˜Žõ)ê V^êÁ]È«˜é‘·ŸÅfKtó•äk–ŒŠŽÄ ®Fšˆ¯s ̲‰ˆu îÄ-g©='Û«Ý H€àþì‰>™.¼€Üjã•«©Ž–ú™|<ž—™® éjé~ᵺnX.¼ùïÜ›ã9ŽÌÛáOg# ml6þòÔVòë~òXfò›·ò)ßòöùò㺴2/ò5¿f,?ó8ód–ó6Á:ä<ÿó>/f@ßóBô!ï°þºj1˜.ï·Ý/là2hˆãTH±f!ÿ¾({ÁÙÊ…v¡ö7×/xëÆ×_wÞ hzÏ»z õ?tJfÞÞ…A磮¼õå¾éÁ,ðHÔûŽ× ^ÌÈu.j~(ö (öøJôÑ&£â‰€íLgùš/uœ/¤ž?ùžIÎo6ú™ú÷ùWžú¢ùªOù¤of¦ÿú³ßú›oû¡ÿôµ¯û®û¬Ïû½:Á€MòPÉéÇ>ð¢õ­ØÌ·›_Rþ–‡£¸ø#gQ¼ô•ªiÌ–x¶×JñÎÖï:<ˆ‡(׎ü°¼×Î{sœcî:ŽØvùÉúªÿZ¡µ:£ŸH°à6¾ûÚË󿘿|ÿШqëÇdæ L60á…Íd˜ð A…#L&p`Ä„7¼Ø‘áEŠC‚ü@RâB““,¹2¥K”*^ SfËŽ5cÞäés'Ëž/g=šÔ¨Í "“þÄéRgæB©U:*Í¥?ƒæ|*ódW¤Q2ÅzÖ+V°m'}HufC=¶üit.˘w£Jzw.U’YˆMš4.°ÝYŒMcA‰[‹$·è`Ê oyþœÉ”$øo§´Ûy§e¯Ÿ¡¦ž)éÀÐ}KÊ6\æÝdKÓEMW5m™”¸õ°´_®ëb~õéèªb¡oLˆ9ÅÉÆ-Œ8;m5¶<ßœ¡FÄçY÷D¾|;qšë?Þu¿9~åùÀY²Ÿ+?šöû(½Íì«­¿÷n“ÏÀúæk<ý’ãÏA» PÂ),6õ0ÄOCø8ŒÍÃA|+¸4ñACÄnCé“®¤íp’ 7Ö¶ÃJ·½°+m¡çÞâ«§î¬3/.×lôȲŤÉiî`b1ßøêÏFæŠ$N<Á"âͰ mÓk%íJä ±¤¨Óë#Ç ©7&m<þsµÄ1¨–sOž¬ëÎ9s¦úë?=7ŒiLB ÌÎ W ‘¤#QòR¹ä4®3¹bjR©;1UNS9%ÏSø Ëô7ÐVêt,&¯ •Æ«Zm®.XE]U!Z7³UP\[¼®6^‰»UU`弯Vb}5öÍ]›Ó•Ù!g-ÕÕ^)ãm¬FM¶›ç&™3Ô®<9þè[ðNôæÜB³R‘ÜH±¢œÒ]l¶xƒÈ“\É+§üÉÌ'×sË9÷üòÏ/¯sÑCç\óÎWW]ôÍ]w}ôÏ'‡õÌO—}vÙqW½÷ͧ=÷Ûu7}vÞï½tßc_ÝóÖ‘Çyá¡×}úâ‡Çöè«g^ùæ³ßuÔ«Ï]ûݹGŸüÚKÿ{ПWžýóÅgÝùõ)o?ø÷Ý7{ý_‡øæç>òÏxùÃ^þËç»ÆãÞéŽ9ç Ðzÿ+ýâ'vÍ«1ҨǼ8H›ó %WBa Oè•o§0=ºT µ©hnþAav&C­Á‡`?“aS–›ÂTìp7:ÕSdš.qT-Mžúœª¨ŠáŠ!mx“u5±Š)ÜâÍ<åÅz(Œk¿ˆÂ3'‚¢i^3F5–‘„¹ã“G ‰¥‹uäcY£Ç'ÒPŽ~¤#7'&Îo‚›™‡5E@>êdÓú[G¥CÀ%ãI„̼Tð m`§´¤} F„„J+}¢‹Íl2I®4ls•2ËdOuÊ3ŸÏÜ'<û‰Ï¹“™étÉ:ç©Ïw†óžQù§A+…P¾AôC]á– ó‘r…éD:j!7Õâ5âX‡(1R,)iT)J©w¨‡á™¬)PNx&7–ª› ‹ÙyD%²¤¡£Àâ ù¬G>ܤŸD†ÇñtXr“Ö¾‚!Ü`Ì3sQS«‚4·¸QÒlYõ–ÉøeÄŽ•ZbëIÇõÂ#Òµ­ÒQ+\aþU¨â…®DœÓ]·¢ÄÚU®û«S›¨Ÿ¹Î °Ï¹«MÖ²îH ŠÈ‚“NßÔKv½“‹¡ú OôÔMQ% £‰l<¹PŠÐšud›DÚ·U^(™±ád´¯ ü–'jÀø]ð|¼’x8–.…Œ¦Ii×”eÃYˆNõ4V¢µ\?ÒmTõÉ(Úúk0LR¦Í|EBþ¢Ã1wp×9d+ÃU¨z Tºô´R¹f–Qµ×Ê%gjUbÞÝ›ÈvÓÉ™QmLŽY’­øaÂY÷/¨²"Ært”G™ÊÈò©~£–-íä3|AÚq£9ªõ¤”ª)RìL©³éà¹h›ªó2ûœ¥?ÓyÏ ò¡«bh×ð™:Šî¢&è¿¥§Ð’¶ó -½hL úÑn ßðÈ–})Fãbápû#{,7«Lh£µ°LÊ'³ƒÌ1(ó¸;ÜA ½öu°…íë_÷ºØÇ6¶°‘lb[ÙÉV¶Š ì_3›ÚÒ66³«­mj'{ÚÕö¶³¡ nrC[Üàö¶Í½ìeþ÷Úï~=â oy¿Û¯]+ŒxCí’s/pþ±¸~4ð¦1[l¨f÷M¯zö47,s¾¢õS0›ëOgîZp¹U̺)ãCÙ¸<;Î™Ž‘Ê¼OôÇ©ur¢Øiâ}Å™Å[ŽñŽƒ<Ñ"w¹Ê™Ö"æ·cƤøQ¥ÕU2ǹ”ñ ×UœÛzPGm‘'…ÌëØF÷¹í`s}Úé^·³ëÑí®›»ìßîöØÉ>n­s}ØZ_ûÙÍ.în—;ìh{Ý©m¯¿Ý×öPjO8®&ñ-]bþ꬧…lI?Ä«º»,aÍi}†YJü1¼AÜ™š/‘óÔþ.ôUýâG³yÑ‹‘ôTe=ê]¯zÝÄk©gótlß³…Ñ>Ö§¿=×~s™éLÆ …Má«Ô@µR6uÖx;ýè: $ Q c¤„ãÅlîõø5ø=ö¯÷] qȺڅ ~jÈ]üíûÖÙNþ·[ííîµ-€‡iƒ ¿NñÃ?ùë5ñ ¿¬£»ò#À¼;¸³‡;°Œ-Ø‚[ˆÀ—H†xÁbp)”g¬C&Æó“‚¹ŠHÊ0‡±/+’°º¾.q¼ÀR¸e’Ÿr\r¦3y´ Ù¬5#«Ï3µ,y:6ñÀ4˜­˜˜ÜÀÁ”+ ¼A¤Ác9«,½'ÜÁ_JþŠ$ü› Q& 2‹!©´­¸<:±sÉ0Y³ƒX¼öB™ÔàH±’ÛŽ–‚’“Ãd¸ƒS †&ÈÃ^ò“‚f°€^è5Ohµ±ëºûë5'`»bs‚j»?ò£?)pD»Ãij«DoY;ú»ƒEÅ;¸Dõó5K ·rÛÄV¤?ULÅñkDcËÄSä»,é °‡zÙ™nñ21"Û,ª/<˜HÙ¤,¼B*‚š¾Y¡ ©3Í™Šú9.@£ cÆW›' ²ŒÛF1ÄÆ ±…,ЂAÒFŠ#ºŸÊFpTÇÑbG7JǾZG¾’Gw¤Gx´GtÄG¯¨G£þÊ‹.Ô0œæ#«j3x¤²gR­b >Fz.òž Q›¢V ‰OÚ¾Û‚I €P̱ëCc[Äàƒzˆ°ð«„d[ÄK”»_#ES,7H,;¹K6ñ{6ŒÉ›E»«‡—$E´ãIpÓIncÅž ¶¢ìɤt€; ¥dÐÅ}Ù‚°‡4°‡舥ʲ´¤–«DSõغW;¦ ™ª™h‚ÀJ$èé ^*¢¿Y?Hƒht@…x§&ÀÅ™Ž-ø{h€(…»`ƒÊÁ‹L‚0·l€]ü€&H§„H8€€LdJ9W“1$)¯AC™ÐÔ©ÑÌAþÐlÌÎüÊÓ`LÒrLÏTÆ×ÄÛ*'€Š-”Ú–4©˜‚Ä„,ÿ8 3“òŒð¬g´ªÄ Å`‚Æ`îã °TüCĘ)HèÃ:†i[Äg¸‡.¸mˆ90…; …HEÌ:ˆƒè÷„ÏEœ6h(8ø_;L„Ä:&h‚;¨9h‚¶(Hûì5hXЈЅ;h(†RäPR<ƒz€AD*HʤÄÉmÊg»Inû;¨ jh/x‚ˆ[€†Lx±ÂHd¹-DZ©$CÇS«WÛ‘K<‰ˆ&XÐJ¢b"à’ÆÖHþ |<…¸…Ð),=¥†œÌ$h( ”$a2œ([8-ðŒ&õ¸ÌL†Ìä.¼²ŽS„)S“˜Ó1k8%¢´^UUĨ¶äƒ@_+ƒéMðýêµ^çíP_ ЇЀLá>áFá Æ’ÅÛˆY{@‡¸[, †.¸…Å<‚5¸€¤a)†Î`ªmþ€,Hƒ68‚wbHˆ•¥ƒ6ÐŽ&hƒ¬mˆ`†`b%®ÌìÐ&ÀL†`ˆ½…,.-Ö`^â FèÈá”hg¸…?PZ¥Mˆ{ Š> 82U²¦›¨›– ¼Ù‚ F¦GަW*›pÚ)Y³86±µá´ÓD cËi5!Îd‘§OéÌò¼¼1¾ƒ!¼Aä¯ ”ºä¸ÓÅX)AbÅH€Y8W‘¼?ýÌ€V€•äÕ;ðU`-„z8 žDhZÄM ‚d³fl.Àð»5Ø™¬Ä0¸Ð_Û† õ5m–ÖP”TØD…ýCuþ-g¡<_x>ø5 Å£\ÊvK?û#èH\¿¤»ü uè~]œá•Èb„øƒŽL?&Ë|Ó>ÙI¹+ªÙ§«‚5ŠÐÿH¢¢8š9ã¨Mˆ&¸[0.À„?ø€?@`6øFÞ,È`Û¨5ä†Ì»àiŸæ‚“½é}À ,ýaÆꉦ,eˆ'ð†ðÒQÈ‚˜¥¦Užã’•áì`ðR­Ü¾R¥þ§®8–ŠZ•¬ “#i¤sºþ*^âòÒ\‹ë,Tª¥äj‘±ëaáLH„``LîplëÚ j(¸…3ÀÓ‰F‘­è³&þn¤´¤bBV)R¦lˆ]k-Qºƒ@ƒ yæj#Åþ»ƒB”V>”‚ƒõ†;0y@‡ ð‡H@T Å)Èc|hnb¶&øƒ& S¼4 …•=$Ð=¼ƒ)(&øÞ;ÈîX_Ëî&x‡ó½€\pRœ]_«ƒÝæÃADÑû…Éy%7G¤×›ÔW~@‰à…P‡5 !¾À[oˆð 7À\ëµN¨ CÝÀ-€ ûXÄàT<]%ŠHâ%VbÊpSîðÒÅTàuLèöê²—j†LŠ8‚XS´móhÒÅÌT©^q¶ìþˆUj×Ð,¥ƒ~"†‘Êj†‡:vj-µé+ÅÌ[X륹‡T‰,9˜)H߯]>?³6Ç#_ó-ƒ*7O8÷8¾…n€mLˆ@ר€[r±Éå—áZd+››Ž¸¡e<²/M°Ô¬Á쫺x¡’îCÀT;øýí¹‹;uS?´;¶þ¶SgûÛɸ›ßïcÕí”Öpt3hz½W½èyå;6‰€ ãø¨·†åÚ4X¨…'†… ~Ó?ÎZø‚dQ®E¸‡C+D½¹y’c©$Ù¸PÒþ8tÀ„!pu@@@è½üiqA(þ×ñŸíŒÀáŸþ`0ÚtÈË$}’aÿö”HÐK#8/¥t $øÚt°‡,¨Ü» x&.0L{PªUÚŸåp~N±Ö.,é“Uc'×ì&“gC¤2mÜÔ&Cù¬ptR15kzTš¿#ê †Øf°8Qpì_xPHø RØǾ€@[=ìødPz¦oˆÈtføƒràúrH‰%ÐÃ^°%kÑ)#N¿n¦êÀÂR—Þ¸˜Ü#®۾ȸ…­SE¢„6GŒõZu²su\7Y$||¥6VÇWWgÀMô5€W°;6˜LÑøåDy]EZLÅÝßEþ9FŽ»Ý—# ¼»õ—ã 9ñªK¾&ØÌ¦jwBzoñ#¾:.b ª$~ˆ¡î™§@0óiÈCóü3ÒGñ }¤þè±~Y܉p»]1&cþ ,¯ÙÔµšµ‰ü7Ãþï”í×ë—–#9:ë~Ë-‡[–(j$äØV ‚=ô…päoÐÿV¸‚-ˆV’éØñáo’-<àÇWl@@²V¢¶„Øp ÃEނȰdÈKFLf.¥I ‚<(²åÍɺTI¢9‘wæ¤ÙÐæGlÒ¤q MÊRiÉîÔ£zGÊÕ¬X«ÞÉþjÕ+Ö®\­b ÛÕj½°f×jm»5kÚ³UËÂ¥KlWºqφå:¯]±wÕ¶uK•pàÀ†ËÚ“ÑcÉ…1ØK†áÄQ£™mÂܬÙ(Q˜‘eŠ =´ôLɨS§4çHÐEE>øTf2–qn¡Ž†3”±g¸móêº É\õÐË 1HéIšócçHaò.-ÝrõÓ¥³¿|¹9²vÍÆq ç‰z¥x÷Ép~žß¼ýæîîaç^hÞ~Jøq7œl ¡ô¾G`|ò[K¦íŒBôQÑ-êÄ‘%u(èñÁ+ ¤ÐD ڗ݇ }ø¢‡·”ˆb ?5÷ÚjþÍÍÆg» …Þuîù§œP9 ç{Éá¶™HJ1Ñ”4w0! 6[äµ–ƒ]Å•beýXU_r‰×b_v&bc&f&bW¶å›]Æé¦ZfÏè¹'ŸzÚSfîEF_iæJägBAè™Q_v%¤sF¦àmÅ…÷\‘DÆt<™÷C¤êô)ƒ,í×Y©á™é-BU“| š×4˜mñ]N5 ÷­±˜+sÎáX ¢CÝJœv¾úØÒ²ƒÚˆªx69Š#´ÎI‹µ°Y›ì±ÑæÄ­¯Ý¡¶íJ;ÜrH† ôF:t>Œ±Ï%TàˆÐhô~ôлc”¯þM±Þt’Ž4µ¨gÌföß§IúªpsË: ÂCjRTY8uGTSWÞ•C…Ôu„/x9X|aùf\X±ìòœZbEMb&{u˜ÏuÍܦÎ^Õì³^=Ë)…ö8ý4ÔPƒ—ÌÓ/ØcõÕPcõÖUgÍõK\;½5Ö][}ö×^[]Ò×e{-vÚh§íôqÓaFöÕrÃ÷Üc; éd˜=øÞnÏwÖ[Ô8áf_Ý´áQþÂ߯ÝÖöÛxw9æS¿DŸ£‰îD¤p5…áEJ{$«•Ò÷L²®ÎdJ®Ï;j²I{i•&»P¢H•¤î9tï-Q`¦`¸þз¨¢ïh ý~ ê#òðFM.×Óüí—û¯©å×) ¹†[¸>¥JQ5…”TZ©23HP“‰ ð‡8”à9 Ã=ªa•1Ø ²ˆ‹™ªr†®€*ôʉV˜«€ÀfÊ™Wœ@˜Âh°N$ô›Ð”;iÉ0c‚Ó_ð37åÅŠsLcÎò³êP vÒáþ´<q†A+âÿD5 ö‰=|¢ÉlhªÚ4æ…P,™Y‚ö'bN†W”i˜Å jŠ6‚» ¿è¥’‘‘‹Td£áÄÊðjH:ŠTðŒ¤‘ŒkbÀË¢(¦?Zkc AßÁb2ÈΰþÄCAdL‚¬ZäVÈ@|DV]íç”zPI[¨Çò‚ŠH!Ç~74€@  ³ÒC4Åê ‡&4‚®•æRRHá X¡ûqh4!? ‹l‹ñ P XÉàëq;Äw E d»Ã¶°ºCK¡uM8´—¥*V‘(ø;hg4SÝj‘>`ÊlÁ2¤šGoñ§ùÊ7¾6œ¯GóK_sL#¨þC¼ÃsþêÉôê5âÍ¥p^팋9æ' hƒÃ;ì‘Àéeðnr`WU§1îÔjÌk, o‘ÃCT°y¹%¼çU$”+Õ‡WPª”òéɲhé+iÁx7VU]cÂã†HK’¼ ²é´ê Þ]'À?Žó¸¾÷J}§ò‘]×Ǫ ™“ &T¤&É»«PµJ%Åv£ix #PÊT~ynüàOÈ…  x@ ùÂJ3Ï2Í®8¡ÛЄWª©hªT¶†r0¬8¡ f‰K·Ñ )Ô!Ú$4VÛmX¶éTÌ9UÈ]TCSœÜLõ7ÙIÉ–Ü‚½·þù.QægXyÕ°”)IDÛÓ¾²®5Bú5DÛ¹Vâ°?ÙjÁ †ª©›þÑ>èanR‚[+¸n¸ŠOy?…ÛIp±wýYf«Å?•¢‚ËøíÁšFÛ3ñÔ|hJšŒe;ÈB:ÖPúfè @þq‹Å­Ÿ†ññ9šñëN´¾kxZ”%•(HYù’:_ÅÓ£e$5cik¶‡—tä W™!ý°¼•ͤ†ûÝw y1èã],}êÇ2a¯tIËá„&­Ü=âݨX5ëß«:¹ü æ`™2Éùê,’$ôÉYÞÂ8nÄeÇfé^ú0nï€@’åÑ”tßbõ¸Ñ×ïÙÔʬÃãùou$"Sl ØP ” ¢?_J³‹¸Ìd‰ÃHAdCWÐTP¡I7mÃ$ÚUPÝÓ¹Ö&$˜TÅdéE¦uB=Ôœ‰<“©þy´- `¥ÚÒ`™¸ «ÅáÉ–µ„¾­Ô’<5Pü ÐZð5{yy™ŸH”€áÂ)‡ T²ùTv`Հܑ‹Ñ‡E¡V%üÁ8`ÄÆ@ÁmT·I‡ .ÈÆOvxÊd‡-QTù”TɆ!=ÙÜ`ŸèQŠ•©Øêð•·ÖS…Õú”¹y™•éZïì‹j|R²ô‹Ã5ÜNØ™ÈßÃä¥@Ì2±U+yKö0̕צRyˆR•aÕ_¹Ï,í!úˆŠŠNÈ5ÇRŒÀ.IÁ,Å-HAdÀü`=DB%4´*Cþ܃TE ¹VÈ:\€?<ƒPCk™Ý§Ý7¼lÕÃ)Pƒ< ÁU°VÐÖWØV ÈA ”€7\Å )xÓ8ŠP$ @*à#X€vùÐv•‰Ü½à:¹Òp“œè ÅȆ˜&Cr=0¼AT€Xgˆ—|I{-PCЃ\dFnäˆåÚ»ADè˜^Œ%É „MQ‡ÉoœˆD+q^ÅT^«@$ó!Å-Á"“ ”MBdŽå(åÈkÀ©„.ž~Ć•¢8Òñ…ÄÐX~e4ÐÃW‚eXÒC4ˆåW–¥X’%Zº¥[¶e4¤e\¢åZÂþ%]š%Xæ¥]šåXÊ%]Þ%(ñKÞBʇ¡œÏS–‹ ü‡#- „’˜]åû‘¬YÇ]Yk¨„#ù¾Í^Æǵ4$y¤DD„d~ÄR`ƒÍ)E•H  Ñ SÊŒnÒÐ^ŒÅWˆE4‘€Éùæ[ŒP4 ܵ9¹Z8µP8ɠѬÓ99€=˜Á›jK%؃è‰è‰4|BœÁ²5 z¡TB0w‚ç'  ,›GÕy’­~~Hgèg™åšRÕyâKÌA)¼D Ѓ~¢Êá`å(XG}¸ÙCÜLd‡<¡®Üš²ë¸·Èëþaç ý-"aE”Ò¾[Ý¢#NDC2xÁ茎ŒÖèŒÞ¨ŒÆ(îèŒæèþèNøhúhî¨éè¼æÝß™&fn&ˆÑžIßË¡áöM¢ÁßYU¡u4Tꤢ™Id‹$òÞü=4€/”BŠ1DìÑ”º)UÄšÝÈc)ÆÓÌMw9Y0Qg±Åe× Ñ Bš4ÉÉ ¦PWœaó‰Äé¡Û#¡`€xÁˆˆÁx6Øyn¥s¡ ÕWO`ª¦2„xj¨Žj|Mˆ×ÈÐj€´À„ ~Š^‹õ—9 X=- ` X†þž”jïýäx‚u€U•"á'ù5)P•ãt[B~ÖάˆJåIX²… IèÑ·òžpÛÃùN)m‹´¼ÁTIµÉtaѩӠ§¡]Dƒä%G1˜ÈE^ýùŽÉìÈqR’¬d-‰Ò+Áß-+Âr‹a" $³¡‡ÅˆD„|ì­D |_€}@å[)6ðâbIÔ|À¥åë[j¬9g5Ñ•„ÉV´]ŽPn*Ϫ‘“£¢“^€rÚ«¢Ö÷Í^V¾× T hj0gYˆA2HC œ'úšaOP-d/ £œm°4ü ìÄrÛCÙþ >ÀŒ@‹Üðª¹2»–QAƱJÁwz4`@SøN¿0^ݨTQeF³À4$¨Ääßj(Rò•äêçû¬âáGY›ßÁËä Äéì¡b“f¢PÈ«Ÿö¬9qW9í,ÒÆ ¡ÂnÎÊÅ`нIJ>èØQî,‹(Zéè4!nže¦*ÉU§ü›+’[È=fj´îáæFÊÖ ,Ä C:8ÃB¤H-Ð@4À8ÜBpAB2¬ƒùþA¤DE¼• •¼æRX ÍÅXÔlB†5Ýk¢–“@joðñkrê+Ï  uÁPváUú˜ÐTßýÄ`C þ|À}jPˆÀ”Ÿ£ ”{µÓCmÁ·´ð `¼@ ß‚CŸI@ÛBœad€9àm"uÈäb&o„èOÕT²†Hè l*öb€¼­)-âN[M+.ÑK øpËŠTJk³ÇÞú0öKCdzÈ_÷ªÉ¥W¥ž(ž™QÒÈk£¾Ý &¤u- ®É›(é[E“ å·`l¸V"©•ðú˜bòÆÆ€q\k\¥ÇœÆf\¥¬_ýµ^†‡ GЀ=ø1|À¼ƒ9è@÷ÞBÐ7$ÃàÀG¬²BÔHhgmÐDË2àOc‰ ÉlPÍ®ªå@”ä@þ D–Î*ÐØ®¾ÆÍmÑÜÏ<ðÒâñ@²µ6Eª}¦êb'C~ÀdŒçƒê:)IF¾ä-Œ³ŒÊ0µp¨¾À„â„ܲÍãæ†Ýâ­pØí4HC~tÞZÆn7&˜Ã¦ÖÂáb6|B”A[«"ÍÓŠ^Îf™‹d±@W4FœŠæž¥NžÞz4H'hdü§mH«“òDtE£Ä`e%_a™“¾¢HÀèͪ8m³ fÓÑNW›(ég„R£œ&òüá‘nˆÌYá¶(¢ˆU(îNÅiò’ G•Êr´K¼ Ê–D0¸Ã0$˜/”DÉ–þ,G¤ˆ p&üÁ°Á|°AŒi+CÀfþýblªLC(Ðþ 'ÜøO&ÜAô5(ƒ4!¶ÁÀ4ÕƒÊì¬rž‰m°Ü‰QíñËT…7ÅÝ£Â`6SóŸþé`P繘FK^ƹ ˆ€¼ª['ì¼AHwdØØ 0Äض{¡£VH ƒoŸæA°W‡ã-½ðŒÀ4\·<µ€h(=ä¶ …<0A¬ê lBþÆh˜w×ÞÉØÞNƒuÇ÷uÀvç]Mfá{I¼·|[7|owr4I×$!D À7‚û7}‡t¤è[£`žVúÎäܪ¹EÝ$Ñþ:°AVø›ìÂùH‡ÊÒ§|wpéó*îkwkëE5e6Ìãa¦ÁÒ_–™¢•55ôºÇâxìB< $Ãt€ôÕH0xÃ-¼²*—„^@<ȱÐDÇ| Îé\=(“›lÓÙmÐ!S=`9¡åÅ/)*Ÿú´ …Å6P6%F¡E0×î2oó™5˜˜ö{]Ÿä ²EÄ`€KHd]ÖýAP$6Ø­¤ êž@Ÿÿ¹9çE'£³@— Q°yD?¿ÈÀ÷t:x:AAOÃAOeB³C¨.DcC,ÐÜ€˜ƒ¬×Ã@çæ¼µJ¹.^Gwº¯ûú§ÃþÀø­ˆšú(vô§ÿº§€°¯_¡~DÄÞ&»²º¨›+·aÕæ]uð2O¿95+j¬E'¹«¹›jÑøq'Fé)ŠáêE¢T¡á`É¡»g €,%r$ûïÂ4¥ÊÒª9ðØ ÕUŒùDKÏDÉBÄ0¬Á-ô€=dAD lÁ˜¯=¬Àœ:`¸€  ÐòHÜÆJ(…Ë2ÁbÃ-ðßf¥;Ô€6ù&ÔW¨mY1@C€Ì‡ lÚ]n•€nA—l…Ú W ÜCtÅrÅA9to¥@…Ep1½Ó»VmsM=Ò7Z@þ/¶Ò°+­žÒþ;…©s@+q+£K…9œ@Öõа–ÖŠªæ‰Ç鑨ÝwòUç |êBð½Á»ÄyÊžCôðC ÁÍýz²°V§*I܃¼B4„g4´€V>T@B¯²Äjë25d±²µãC¯båYÞ„â¼~ì˾¯ÓþJ®þRr¾ü ìW»¯ ;`e%BPƒÞC‹ãùQ¸n¤C @ÑÕ®¹/ª5à £°É\8ø‡Àþ˜ø) a¥i*¬L*¹02Rˆ22üù‹‡$.ŒRkeM„”¢"@$ûÌA? <˜Pš·$¼õa"E‹“MŒxþPàĉ/6ä(M6.¤ÝaBrË1wx¨wÉÒ)wÌA£pÇæ’w äÒE Ïœ;m:¹SÏ%Ï›0ÛÝá%LJŽ1R¶Y¸£æmêÕ)Ä€»®RœtYzóf=^ÁŠ%ËS©[o]³n}Z­ÍµNûí;8ðÓ¾|÷õûWðⶆ;¢q`Á1ØK&ÒÞ[œðhNŒ”R¤ˆQ½Å‹>&Œø!3E{R6š b"$§O§öÝúuì„ö¶dŽØ9Yótá`Z• ®WÐ^Áº°&Ìœ Éå?0G’˜’s°½qç„9sJ'{3üþlÚÈEú€3ÜÚ~²ÃNë¶“€ð@ú<‡”âƒíû 5 Q„Æ»ðŽ[òMæ {N U» 6¼@XaÙ:úoF ½€ ¾39XnÙeªàL|+¨D’º¥€7X‚X+ 5Q¸ÐڔƔ¢mèCŠI %ØAû¤°>V¹jqÆhÂ=´pjœô.˜Ð …H aoºZé=¼Á”<5õ0µœ2jXì>˜ƒ)¢EÂÈ!%¸‹¸xÂÔ&¼c1õ8ƒ–ÚÔ§^ ¤àŠµÞ’9¤"©8Ý3ÓÂvµ†juWZ×¥@Ê…Q{:òÙJ´µƒ˜LhÍ_‡è…Z`Ô0š—*R›}IÁd›Q*1Єe¥`ˆ“m6Ðð±m¶€l[`ZGÆH¼µ²qABÕRm œyôµµŠÜÂd-Átp;¡‰À2¤ÈN´™¥Ýaa*RËþªqÚÔš6¾…ó¥4³-¶^Û3YH«Úå¦Ö¹á¹…Ül†›6’iv-Ì–«ÚÕ¾.nš¤@=“EûxìîX¤6Ë.KIÜâv0,›øÀÚºC²â@TÔ2çb+èNǶ>¸†~¡Çõž;(@]„“Ý{Þ—V÷©ðq)ÃÅC2¡#kIOh¨D!Vе6܈"Np¢Ò!0j )ˆeÂ$(›O{æÄfl¯”$%ÃuÉMVòMÈö^ð‘D§rK`"$=ÅÉM>Ì’‡•ƒ&¼ 1j=ÖSÔðSÅk]Îä2›ý"à$sù1l0bD'/3¦ÂTš’þ¶°E©q¼>À H2X ,%qe5‡5ÍdHh4£]’<}„‹`$O¾Ò#È …è!^‹YnqË)¹G“Zm§1‚XÇZ$lâ'Î ¢‚àK£˜Ñd†¥(S£:Õƒ¢YpÑC2Ú¤–+;5±Wt?^ª‘¢f“Mìéðˆa‹¤o÷Àƒ€~Üâc¨å¹o› Iw8á=ÀM$ÏÛðß—_ØfhB&†û¶saè7îuR‚¾Ïò<¬:‚ï·PÔ„ï‰A1c[¨ÈÇ@ …€a kÏÇñ‡J¸ i ¯šIÐk"vK`Ô£xÄFÏjv5§9ggþ›ïÜP=ßBÍ1à€×†ŠTí«Çª>`çïÌL_ó’¿ü¹¶À;I’•ƒ®ºç'K]ÎS×:`äÌ­|ç™Âúnó3ÝjöÒéµy ù.^[ÍcøRã ]¢‘Ùé r6ŠÝZgA[‚º—¤$n€€ÞöÏÝud‚TQhû´RÒöú"Üë5â‚Ö#ðüçáa-l°#¾D^õf© ;‡¶’Wå)¿×‡0>“ÔE“ ®û6Ø÷³y«Ö×gAö%•éÞ#ýìct-d2ʘx2h f\<é­p‡“–I ‹Ät® ¤XÊ)†Š„; -Îiræõ 0"È©Kš¦äª+‘€lk˜Àóþð¥C ¼ p¤È¦mZ-m¸GGæ<ÄäÛK£Š9²i{J9âÇöþª‡Â+ ¿PØ4å"—­LrdRFp#R§¿nË|Ð˪ψ°ÎЪÂp°Á¢ÙJǚĊ Çt$È@¥®b§`À¥Ð`Pé¥*Áâþ •`@*¡O”$>n"ð©Ö #”ˆS‚Ûø¯åˆÌáæ›%RÉB¸¨â#º)ݱ@¾è{>à}ÚGUHå¶ ê¸ÎqœD®¶Ž ©Î§®IììÔO0ÌL鈙^¨ìÔe올ý”dkl'On &ùž´PÍ"n¡øƒj Âïš(b¸ÆdBÒ#Hrï@‚5Èæ0„ÓnDbF Ôƹf†M¦îb¸t„E"‰’þ@ ˜ h´g!|Oikæn(w2QöÏ‘µÆB2ðzX’*Í'\«öø¥áJ &Bþ¶ÀÆ< #‘|å ¶ÀëÊŽ!·Î"õ,ÏìR†Ò¯# nQp'* *vª+ Jæ >,d(ãSr$Gˆ±S¶rLÄÑ’BÈHáZ‡F,šÌ‰þn&C^ÎSâË 8Ñþ¥ï¢ ¶f§TT0UVBúk/–p C ù­Î&2uó!óÍý ßÜï•iýŒóߌ"ÇÎêMèaóéj¨à˜öÒ ¶šÆb€í4³É:!;µÙp9ØQçn¤Ø(3‰´ þºj¦l,ÑiâÀÔK½0!‰Îˆ^€qQ² B$qk„Bòª‰àQ'?…@qKNIæ\AËz&ÅGN‰ ¤òš$Hf“[póshñ0‚³™Ž“I|30j0 ?ƒy¨{Ä'1"*;I|tòÈFðmt¯jçåÆ5ý #då‚­àxo;Lve)%SÖ“RNáà3¸8ªèPBá§%Œý†sKÏO/•³KýR/¹ Åý¸49õ-Ç”[ $42&×ÒaìïQ®kæ¡<é1_¨«³˜'á òÔ,e2!p†G#ç‚M Žïj:Бm´­Ð Q ¥ Âþ¶ND2RŽÈ‚±áį4U(ÉDÈ@U»mè T¸Íœ"ó·¤ ùà2Ãå ¹æ^莂­ÒTíÖíR"«DšF3 ŠïHy¬T%ÇnOçÏNƒ­Ã"VA äo)©|~ëO-Iuf#4Ið€ÌiÜâ !íÈ",)Dœ¨ÌÊX$úËmðÌöle8›I g±÷•D ’JbH_ÕT_õutÔTI˜g>€ôÐ"Ôh>utÈБ¾Ò€?bC9Â0GƒçõbÁ#ÊÚP=Žô#9Ñi'B-D=‚ìi`£ø(·éôÐm3FíôBa®6¤¬Ú.ÈN.gþÛrJÙñ½ •#šu›fµÛµ2þ©u”ÈL‹3Éh‘_o“j)aâ-KNþ¦éuä#Ê•|~hËÄS.uFÏg[ jÍç›NFmGG×.; !|Vá ·„À[TÄìô#Ôè <Ê$VP¤Z"EO´Ïº4D!·DÒÏBt/Õtk)—ýØô8…ó&Â(’¯a‚]=K4á²[Y‡%g†ñ4ïBÞvYs'å´³vyVSNS#æô÷ˆ‹Ã¦rP¸i%ÕRV}Wgí…š$Ex¢4C,­Myé/*3-Ç&>¢#ŸUJ³Uw¬Ç÷"ðÚ²ÉIí4æÒ…ÒŽWK´þ/wóKÿ‘™RÇFëÔ4ÇgngPœti­•mMN2Ó2&—Rv=Å帇SxäUSWñ"EÈÊ54õvFP`F@ ‚Ý‚|öQ´¼¦ÌJ¯L6Ò6ùòj‘ÐDùÒ†D˜^Ó_ÛlD‰stPÔ}5÷„PbDÔ :[[ÇvQ–o‰P„ìwl¹ò8þŒØ1Pjõfç|ü¨hÍCb릟ZTS"$)R™7IáÖ»-9¨Í! 42b ¡Úˆ3ÄʇFj$kXÎZí”Ò 0è! ß@³0÷xýØÿXyYéùY‘ù¸™‘óøÂ†þØLr¶T#M~ ®zȸCÏçlK51³Z Z[gháfA=v“鯎1¢fÍ?naª@(¸‚-B@” »š&uD¤¾#UV¥q]LØswµ}1÷r7™×4„a8/ C M·ô"÷ Þ€¸6Bn¨‹mɵnëïU?à')‚dT²Z)”;õ$Aiä÷n5ÀŒƒ9C–ÇÈ44Zá¹lŽ·þžg¿ÆYÊñ$²l8Uˆ[n]UCÀyUAÆIÓ6gvU›ø 3TüŽá¸ºŠQ¤=:ÙxKN¤Cp¥ÍuÞr{]Ûî ùP«‡0íQX¯péoBþ3¬í0±®–÷ÕòöJlkf,…E–á–q—‰À·L†BOC­FÊ"‚TWŽn%^a‹Ð_©ùü$WLKX†¯ù¬ _)R…‘Ó¬«J2²I#sgÕn÷ÙKÿ¤òÓŽC^ ±Òc_´v5#_Ȇl [°íá»4c_ôÙGš2MÏÛ|—m?zþš3¿8“PSäv•T55êцp9©“)Q å‰Õ¸‰œ§Lá~á!~â)¾âõüà+㉶ÝÃUN*Ãú1[C‡l§õ+ÃÞv3ElÏu,H Ô•=uz¡ûh¢ØÖƒþ@ ¦f:–!Dèë ¨£ÖŽ<:ßë!V¤·Mß7ÀvJêL¼éM'í¢„Âʺ…Áº¬Ã”]˜b“x¬›­ò?ªìÍþì˾¡íù£ jí% îÙ¾Àí/jFʾî'ÊìÝ>ïѾ¡°W“JîÙ¾ð _@ÄÀl´ÆðÑ^ï ßñß³ö~òÍžðÜ3ïòÓ¾ò1ÊòáîÅ{´pw‰¿ŸYÏÄTÕÿµÔ“L™’0ñȨr0'S IQ† vÎ6ÿX‡G™75sû§a1¯5 :§“\Z}½gm@ B¯õdäIÍkjím{wFHÅT®ô}Hÿß6sý’þÕA‡„ÁŸÖýÍü•07ÛTüOÕiXüõí6Ì×›ˆ‹ÜH`Á &ü@ðÖ‡d!2$˜l¢ÀŠ2„¨qbÆ… JL†A Ai*'Vôˆ1æEˆ'2dȲ K›u‡:.!EÙiÇ×a'%¼Ë㙂Ê$ŽB©Š Ë222žñ¡£I©ÆGR§,dìÈ!ùˆÆKÚ1~n#™!ýxT†r•g|$ ”ä¡M*op‹`¤°ŽïYîˆ[lVy©D¡‘‡1‚¡Gg´²–ªX*…63ÍP„ôüƒ% 5Æö(þ…%FǬ&¨yƒ[œ¡I›YÚ¤N³Á°ŠkCZšG@H¤ü&m™[tN✼ÕPB¨‚H C.%»AxÇ8ðëtüß­Ës¤ÛeÿÖ4Ì)QZtS€ ˜,ù$gäÄ@ñrâ€aˆ2IzÔ2‰ò ÞGj@yéÚ• /Ov¢â‘OW*#sL㤠3R‚$‘¤ª¨D ü€P‰Ê0Ù‰0H–ª©† 2Ôõaå<ÅSED#mH“[ÍXYjÚR -sChQÓbÍoRã‚Q-ë¢CŠö‡‰ú“œGCʳ¾òGgŽb <˜B–*jCi”„È@…}þ,¥wJæes!ŒóD³ [Í’™Õ|MP$)7£FOJe' ªß á!+?`´­­ðÐS…"Tfx¶Ã+)€G<Ý£b²xň&†¯ßB¢ÏÃ&a¶rVt¨æ|i݈ž§‹T’&á&=…ä#’I›V 'Óñžæ'Ìl¬1àƒÌ“™ÓùÒ3%ZW®/A‡‚f¹ÊÉ´yê:*á®ÙYÚPÇ:EJWK(ôÌmÖW3mQN:I?ÿ¾fÃ’Lun‘#¹!5k¢‰†°Þr†n S»ûi®ŠëD++Z\‹y7¸Mób“´!©É@ ‰…üi‡D)„³Rlþ!M †22€!ü¡·øÞa§ä@ùnÌøC9ºLåСÉO~L¥Pd3«šHƒU«ÒÒ%.,*9ªZÆm• „89â’wžìŠ% ‹¯«KŒb¹Öí¨èžë×C/šº¼äÜE¥À_z&DŒ·P†n£°v$ðÍw›:j©]ð!®ÛçG¥Aµ“ 6ª¸n#ÛSa ±˜é­ƒI3©Ïš¡§iÄ(¾Lsª¿ ™%Õ‡Ò`‹ÔªÍ ×"± ÎrHÜ‘‘ÍB³såîå?\ê¶ 4J‡H£Æ¥÷‹ýJE¹6ƒ ‰Úg`äB¬1sþ© €k];!áîH¸7nÑ lA;HxF•pÌî0á ïÂðp$£¢HÅ9ÆC¥È"f£ÔÍf”XÖŠËœ¦-øm[•*rr&«;‹v°ÐŸG1D·ÐH÷,¯húaºíšîâ|·h-VÓÑ9¥TP6èÛTZ£ŒX dGÄ„/̬ÜDûx³y¨Â™Òf<~`¿O‹l“ìÁ•šÈôß7´Î® ,.­ØÏåiй@\ÔµPkþÚÓæwmGõÔZc|Öèþlì¤e‡·@@?>àƒB„…-ÂŒ®WƒKx˜½]œ@ ¬;·þ×¥–ETãò"6S þ|SHÁk‚I iÎÝ0’œW,  )HÁó…“ð“\†Î¹›÷…³éS?Tuçx!8¤™à—~ÛÌœ)HøÙÜ‚Ź[á)•I"âwÀã¢ÃPQ'j‚]ëÁ\ÙEø{Xu5 U9Äb˜:¡’|ca+bPHKÖÄôÀnð P sÀ)@ò…côzâ$¢uY¼µvüå'³ÔTfq$¥¡S[F\7Å6(bàg0kÿ†(=xžÒZ€B6§XzÚ3F¡($DNÍ6L¨=ò„(Wã_ü–S'%?²5þ"w :°qNAnuáÿvpía l€½ÐP ˜hºwo 'Æ„B‰%ƒ©¡…`±5†bc,0-ëp[`º–— —@‚q݇}6"r¨Âq7*·À‰¡a@^•žÅˆš#2÷ŠÂÆM7+’¢(…çƒ>wP¼â+À2têQQ•E€ÈhSˆrá3x]Ì]ňHS4͸tJ×B{"#šÔI©öà€^ ŽÒð H€ª–wôj[xê$%€ÂŽyôiý68â• 8Wš„._'ƒ(`'à-𺖃R’yƒ$O‰7mŸqìt^§oþ7¼6!Qxz%ªó4»¥QB—§IŠÉ€Šp çPa÷µ´õðz½T‡èf‡Ãr¨P‡è\Yä{̘\.6c[äŽ!±‘@fVBôsLeÓ:Ù@É s@v~ ܰ‹àwƒt6h@}Ñï`3ZŠÎŠÐ`MÐæ0?>&|¥Q3—Ç”‰UOYžrjsÉ5ª’r*Òj,ƒ+à1h€¥t%uÄ“Ùe¼‡&¸Q%X”ciö†™•y­¥@¤–=éEhã˜b eáØ`(ÐráV“x,7Èáf%BÉ›ì“Yþ7Š[p%p-K‰lëã™î!ްY7f6<yWˆpV¢!Èq]ÁÈf1RE´*o¨„`qœÛ³.—k‚)4%œe%e@ MPm`gpX0 MM rQ‡R°7ynÙ¤p™ó6•ùWYwF鈸¦UC†q5…BHer†3(÷×oø¸r Æ6ºRLcW¥i8¸XBá^T#yg•—kµrx‰(•’±©I ‰Ã+ߡ،‘EÖØ, (¤ZÄhHˆF”DF¤¤û‘t1ö3áBmF2œ4s1ö0Ž·@=_*b€àš³þfJ©õ Ü7!~f‘ ”w–Óðg#€–צ0d1w˜ ã( Àð(…æ¢Upf^ƒ¥¦R£n‡ f…죦-š’J^²F¤I Fa©{ªž6pO©fôиc€÷]ô1E“cut~AXJ5&Ò6!’\×~™ÅMnF"K5žvÂy©APX|¥±c[ˆYYOxô#fZ¢Ùšñg.šG?ÇÞ,†¦WËXŒù\¨c9öÆ™¤ç&@“€¤¤3R%tX=ÔU 1ØÐP=Õ÷bà"°Y)÷:lW)‡5*:Pþ8×”·aR²é#â%Å)+M•*zÊA=4‘¼IsP é…Z¨"ŽÖjZµ&s)¤i 7 ²Ò(Ú)8 æy±¨&³k¦k#FdÁS»&Š3{*_‘6ÇÙ°b“M0ø’Eôhæ=½d™ ˜hU»¤Ò¨ÁwwHZN{vj6n×S×%|Ò­\³T#Z…­^õYN«¶‚ž¶˜"¾lÆ·l.‡ù‡mˆÒ=:\@ZŒÒ%¥‚¸b†1”S‡€É%iðÚ¤‹»¤y-œ£,¶R…×§ó%sPšK)Ðo¦ S›E)1Å]&ʦuàºupª€–C²‘i*C8×*[þ0²¢$Å©§mÃ|™x€ æàÇ[¨ "%€»|F5¨ªÉ÷¼È1»;»“RžXš6wS½×ë·)s‘‚‹Ï ¾oVV:2&i‘Ë” qȤí ËÅh‰;«ÕcÄØDJ3k M”wy¦‘‚L-GA@‘fªÞ 2¨`èÇ$hæŠ5 v¥Ô´‚¶6Ò]Lû–¿¥8¾¢+¤øWØ{ù+ˆ»G@“¹WÔe¯1ü{4ÜK06Èo‚lÙX( ^€šqA°Ô—ÉP†"hêiÒºu`R캗p´}«¨ ›pRpæà[ -p½þJP¦£’§;ä%^(>.L`ºØ Žpìà†¡ŸÝ»½é…£2 }ÜÇ-0 ×;d(/¡ÆûuV—2~< €,ÈJ€„88«#`#wãÇ€ÜÈlŸˆø©°“mQÉx jbˆA«’&™éú¸Q[ z±o—³„·ŠdA¨¥Zp·«`Òˆ\¨'u%6ðT,Ë…þ&œ"Bþ6x[yºêUŽRsi³ªDÝqC$ ET¹8Œu’›u·ŠÊFs¿ÞLñAL?Ù3ªL”N.¯ù©ý(S±ñ(€¦!Õ‡ÏÔ÷ºšƒ“´5H1 —@ ¯ûºSÜ ¹zß:þw ѱ#À#@-ÑØ+–ºëÏŸ¬{'Cì`ºàØ€ ± wpëÅõð‹ã{vð‚|½@ÓÀ»gó­/ͽ$2Ó7}Ӽ뵨%«»?Ñ6mÓ5½±-×çÒsžàͬ  5 Ôçm)T± ¦0W·©†ŸÝ"ø¦\«ø&ùV'\Xm¡V¬„y\ãµ?’(mÌ4ÇAÃg‹GrX@ÒxcË¡(´‹}gm•Ç"/ãñÒ1íòâ-nãñRã{ÌÃ¥8ˆéÆÙb¹-¬ÊX½€1ö¤Ó˜Ù†«¸–äáluIÚ¤²Ši*M…ª– g a©yþÔ×Åbz¼,Ml ñ ²c—/ÄÛ¹²[Ó¡º1-Cº€øp[wŽçx~[:„ßèí‰Ù23' á!Òo &ý¨™šs08 ák0ml çy~çwvç:Kׯ2Â{Û—éz¾çx†ÕÐÝP!½NX‘ˆ‚é¦^êy®C΂NfMÑ@oð½Þë¿.ìÁ>ì¾ì¾.ìÆ^ìÇÎìÊNìÁíË^ìÈ~ì¿ÞìÉ^ìN— Ñ«qýÁH‹âû¦»Q—™k¶6¦HžZ®ˆðh|†"a¤aÖ1¢¢iAO#i4Ö¢w;Úã…µ­ -, 92lþQù±Ùž³Ù„hµEEfâ®Èh™uA(š¯¶gðâe°Ô—¦KŽHC¯q†Æ£§·Ý*·Í GpÅÒƒZ<*ü@9¯ó;Oª>*P¯ÈÐQµ° t¦ÔÓ* ê9RV@¬‚<õªÎ·+õ/[UVõ<ïóZ…B„— öa¯ó>Ï%Šº%´¹ÀR³²Öáto",u÷”‡÷wÿRŠÕ÷x­€B³$‹'ÊAø÷ÚÚ sݽ7³7Å¡z?‚_Ò¢LÙ°Æ ·N#.Ä)¡¼Ê›¼¹Búå˜+¢²¡?úåˆúª_T…©+þ­P‹i¸FñBþ®÷Kû(¹±ÚW-'G¾hóuUï ÓZqnà¼á–_’S@Zf?lDÏL¶Ü ±°¸Bñe»Êó$@äÿå_þž.@¯eÁ*è¢N XÑë;ãÅÕ³0³Å}fNJE]ô2AH#1ÐàÀjn}Hö¡¹d[0ØÛ"MÊ–“Ù»‘¡Ãd4HîÁ8 ?bløabE)-n±w¤Ã"Kž,ˆRå–'&à %Dœ?,\úhÓ–[*útªSªVW:ÄHµ+V­Z*ÍÊ’+б8¯VÕªtaЧ8¶üØnÕ¯þv6Ü{ómRµO™ÆåK˜!K³fíÞt:8íãÄûn­š,­S†t 3”rBÊgÏŸEƒ=ÚóéΩQ‹ý9-6iÒ¸Àv'6¶-wîHÙÝ›÷oÝÀy÷Þ]/¸oãÀ‰ÿN~|ùsèÌîÛzóêÊ©[·.=ºñåà…cïÎ}{ö;5ÏZ^,Ñ^Æ‹å†l‚¡–üɼèÇ€5 ³Ë‹záŽ-kÊ-¼¥ÁFê°®³&ºe£˜ø@ rp€œ z ! ù!'@³\zo&ø0DŠ¡[`À$Ü®Aa™ “š>†ŠÂP2Á€çCC,(¡¶>2çG‹dþŠA <²C$ "D ëj¡@2:თš*¤+?‘$&Ó J£Ârs=ÌlNÅ(TpN»¼ Ϻ z±½?ýÌl.Êb‹ÎCóL+±£,«»6³Œ«Hç»)«˜Ò,E²Å‹HÍ6+0²@zë1´îÔÓ/L;ëÒʺ´ÓÍL+Âf„,¦i`Ûb¸çª»£žá-ï<â”Õ®7g̓¶<¶Øf™NYj¹Ý=p©}vÙéŽs #Ì¡ó¥(”Êœýˆ­?z16…Ÿ ҥ䓓B•Bjå…Òbê–i¢²¡sô©/* á'–„©¡™8bHþ°´˜fä‘[%P`Ï!v2Gš15æ´a !„|‘êËÂ0-ºE½¿¦€‡ŸŠŒ¨ãRc”šè-úÊ*ŒZvk«.»kÔLãŠìëS½têJÆú²­S={«½àZ‹0A/S4Ý®/=›ì)“ªÏLµ&òê³6E´®=ʸ/,)²¼I£1{ ñNa“¶;Fˆ-Ý’k[c³\r·KýÚÒÅ]ZôH‡}öéÄ;NõÒ‹Ó]vêÔ+ÌNɾté„î€è ØÜˆ %uèÉ÷ÈDÐ.¤R½P2.ÉcÂJõ+pHÁ–Zè–þà£%Ÿ+81Ò¨¦ÙÏ.N¸qþù' aŠ@ð‘ߘÎÅ–dœOPìªOHb²Þ§š‚>ó10!) S¶0@ÁÌšÚùÌ—A¤¤T&tÈ4ÀÆ%{˜iÕf–ʼˆ1¥bIÜêGÃYÁmT’ëŠf'8º(…N}áZS´VA±1…ªœ&Ó)Æ1pgÒÔ¡Î6C´J†ÒT¡ÁíA12;\ éÆ˜õt ‡Òð\¯,,iä&\¹Ë¸nçXËZÚZ]ì¼Å»rAëYÏŠ–!5Èëð†<¡ã GêuIzQ$J@3Lƒš0z¼ þMhЃpÄĆ …&0Ì›Z0ŒjyÉjâ©Á !W€‰ö‘–Ii•“a$îaý„L'ëü‡ŸH$ÜŠ’“]ÆÅƒŠJc¸ØÊ!ºüåÞê‚~E‰(Fa¢ØBνЪPp2g×¢DþëqÑÛóD¸µ…±,aÁ!bª˜ZÍ­|¢:Ô6±hD¨¤È#Wìâ͘Defo¥ûó*öí0P™[¥®8Ð’‚MpMÚÛáãQ®àq6Ò¸ƒæ@Ǻrá99wÆ#»BæT\=ý#ul®Ùk‘ˆ ªQ‰ó{8ÀS¥jU§*¦âYPC þ»`%æÐ Ë ¬zLÛf€#LElü€ R¦D±¬^ ‰Ú$zR°L‘yP.J WèC'Z",—€’W˜YïTb\Jƒ$jF O˜î*iXL¹½¸P†z-" ýÄV¤]&OU[јËв­DA cX09¯Ñ‰RY\鞒ª«T6Qz[ø”2*(TŒ‹•\ƒŒ•)¦Œm bKÊ(*:† h‰ÛAik§P•ñVuR(A·CWíI‡™‹;',Ý”‡<“´V$ÿxÈ¥"U©~D$»EÈûU¿}”¤NƒÊb¥÷vöX§ÂÂy”½(`i eÎTé;ÚîyPþkkY[vŸ°U .srJã¦Ý$ºðyÁAo òPARÂD“ø›è2L^rbBãÓbê\•<:ÛxØÂeá™Mæ§áÍdE%Š«®ŠÖ –£j¤C4¨a{â¨LmpucéÚl9DQÊT¹!9Ú¸¦aí±Œª§T0BÊ…èàM¸‡Ɖ†9pb!ðªž?`†{ÈÄL3eRE{Úö+¸„ ¬wb&ˆ$½ŠåTÝ/ƒ6¼j›H¨òí騅º:úŠ:8Ø9ê±pžU×wwçiõ|Uý¦R9{H¯´÷´ÂP\”ÁÀ…4h%²žþ ÃhЦ/¤½zZVÛ•‡MÆ.R&J}C#—‡Øoß!ÌpÜ^jñ‚îUþvT j•”#¥ÎÞAºŽ"麧¥1­¶N…é lÈ–3²Y´0»P=ÁÈt! þæbîå_>æa6æ`þebnffFæhæi6f¥Yæfþ&fjæædFæi¶—lÞf^®fr®æo&g#çpFçh–æpžfòåoŽçxöæm–怓 öÈF«(L 5WWÁ¸Ð›UíËîËGRý® 9yŒ*‘¸œ iåßùe´g_ñò߈ËLMÙÖÑc=qTŒ0[àÙ6°¸7ºTµ˜´%¶èjbS`A¯ËåÜfÙÜ9µi…•–Øë<ØNÄéã`ØœV–F:œm# Ö(Ò@ÕP §nj§n ªŽjÓH©ÖjÒXÐøj­¶êÑhˆ©k¦6k¦nj¨аæj°†j·~긎¸îê³–k«†ëµ5®Æë¶Æj»Æj9úþ̹ѳͽteGˆÁZ½‹}NX‰á«0ïʨ­•yÅÇGPƒæÍÇ™Ì}L[$´)†(Å©ßŽÌ K3"2 ¿˜[¨)–ÕÜ*`"aIÎñO65 †Xé`–:Íi§Š/üãDžäVË`›TeTKì=ÝÒå7<½ôU¼(Ü®Þß±É6´§„ãBˆƒãyìnyª•„ú®LGéÎ'»©¸ê¶íV-íÞ_8 N]-õÂ|-I»2÷FöS,´-‚£ÃlUãÊÊ“6Vë¾­¼•å®’žX ĵýÚ]-ºuÇš£¨cå²éf?ášh—&¸FFÓvíÊ÷Ä×M±‹Möþø£¶®6rq ¶§ñ$ÖqÂÆq¯ñ¯ñ–ñßq"Çññ*’qoò$/ò!ÿñ¯@xdò$?ò¯"-÷q²ðñ*Òâ÷$è&ÑÈÂ& ±#”DpëzÂÀ ܺÆÝÃń޽Aî²ÍÆìõ]èØj¢Ù2‹"ð ×tÙ§@gÕÁµG?„¶7ðÙ6ßù =ü9ÄЋ³°´¿•Ê{ßHÓ²·U8ˆ¯µ=ÓBûóËNq³$c¹P#=Ñ3ïaêUJ!¿½•ÇX<)ëo|ªˆ`ºÛ0”ÅY”®ÛÃ`wd:p†.GhcWä9GöV*ÂZýèšsÖ2þUSF×Ò»@àÝÂÊj_וúO®ÇsA–²@FD?ôp#{l4u-)EW3Æ¡7ñ¶¹Ðü¾B_³±Õ²Ãt£º™7ˆF86ƒO$LàY-.7/ÓIAÎØDtï¹|Äo„.J“9Œöiw¸)*t|œ•m'ͧëz_ü ä0÷“Æô¾†"ô÷îä–¼ƒ¢Ë£W©¸ŒÞ½zââ¬äÔW±0õ]<’DFUÑÁ´5“ŸÇ÷ÈNúg­G~*?6»_V¥ ®ÕóEÉ×¾ð¬åù43q‹òt„7)}̨ûô”2W×Y/ôA®26RoÆ´FµysËîCÊãbFÞšPyx èZŸ¢ÝôþÚs¬l¸>tèt¤½3›m“ÔØkwÇî>¼idÉμÃmÕ¾B5ž(S!IuÝBb?xéž7®ÑQoT^](«HÜÅ -wt|Ïü2ËÍ®Xi—“ïáªí9kªý.s¶OéÞ7ðn=-ÕÕ•ÞÒi_DRç;ßÁ1'Sµ¡WãêEɧ×ÏÉU÷¹þ.V'Ü!ôl³¿z>,ðx'ñ-”à"L¾›GÄ6C\B~æC°ŒŠ€ô-î+ø–þß”O-Jó¥ c€Ø’ìƒÀ[>$37p  ?ÜrØð Cƒ >ŒøãÄ 2‰1¤A„“•”ñ`Ã’(!N<)“¡@‡5þ ÙÑá­YRÄxPãœmNlx±àG–%>ݨ±æÀˆq^$(m+Ò¤Hs3b#̇N—âDŠ0YÐ-\ˆ5I´¬K¤ƒ65Yêȶ-%®5ÛÒ©Ú”)‘ê¤É“oI«çÆuúð˧ B©9*^Ž–ã¾D¬1íh«i ›†šÌ4ÃÔ.K²”x—±ç«qW.6œ6©n¿O%ó%¬™#ÙØ§“®ÅíÑóf…YŽ;êoâQ9ÎUÌöoõ픇×5ιÎئAëU{4©ïÚ®Öÿï_ŠYS7´Ú›9ëã,³kf_Bø‘×|°í4ÚS ·QgÈ=ø9Cùwàþl¡µÆÜlIÝ‚4Lt%Í[I“M&ØCCö@ÄaèÉQ »ñ––e´ &Ôq!õdiz-U—O1ÞSkU!¶Me…˜MËGÙ5zHxÀÙ¡“ÕuÒŽ5Ö(Ü‘jÕI;EÕ“†ô阡•ɶe…>™^~ÉÇæh5ÍX†‘íDÑop®IdY·a¤s{=ÉyÂFÝp{:)ÜDPR•N.Ý÷ܦ6’ÙZÝý¨im€ùµØlN¶—¢F)æé™/ÒwãªG¡W&’—òExUÙ†gŒ"9))PW}Ôg¯•žy”ɘØÔ#‡•™óÐZ@¤ÃbùŠþh~™êv´:ë™BCºæ©ªocáWÑ„6"úZƒvZÕ*A­¸pK H8r «%Êæ¼óùŠ•aæd#ƒ¸õ¥™¢Ó5è”N¿݃á·ÑKêhWG ÕѧŒÞ{>–0y>ú]ƒ‡é—£½»¹ȵú 1oÈž ³Ð`.Ôž˜£õ×T5ʇàÎ 3}•‘NVõvï$’‡‘zµxáBå¯nÞ¥<$EÊb¸Ù£® 'hÏI]±cJâ#lu‹BH8Dt”âL·Ì¸NiüAP =d±ÈêdÑ ¥i 3B€o:à£Nbè$Šnz꤃þŽz鬟޺ê¯Ó.ûé®Ó^ºë©Çž»ì'ÜIÜéãpK$ dþÄEpay2×x³…ŽÜòOåÎ8´ym8´{︃»é¹ÏÞ;ï¸c`;éã{Ï;ìâß>û꺳ûúèÓ¸íá›Oþþô·~öc_ǧ>òÉ€õ;ŸÏw?ݽ‚ß[ûÇ@÷!~÷{ -ˆ?n0Ì_íÀW Ư€aw÷¿~°„ô^ù¾'AÑðvR06ø&-lÜ×ÒŠN°Ãè /@‡5dt‹`tálˆHV°…ÆU%l™Q2°‚ EĈR(âhÆ1¢±Œi<#þÅxF6¶‘ŒoT£Ó(Ç;ÂÑŽq¼#÷¨F:ò±Ž_!Ž0@FˆàQÐB¡EDDŠ·8‡?>~áÉÐ "†qäqœãíXGR–R¦ìãGÉJ@ª¬œc[ K>ÆòuLew¹J]ÊÒ—¹œ%.ùËW"•¥Ü¥0©G6º1™€$e4« Kk2“—Ó\&1¹éGWҘʄã)‹ÙÌb¾’š«ôe9׉ÎlºS•çg0ÍùÍo’óšÏ´ã â!l„¨Z[aÉWsdtò3J>À†dΡ·0 Ð8…FdYxÁ ŠT§LÝ(¤ÜAÓNHþ:R‘Ö NÕ!©QJêÒHx—*ILr~àà‘ðG’AQÌèH† nÁHd! \ˆF9¤’ h’–Jý‘ŠŒ¥#õÙVD4ªš¬_«V=ZVQ5'QmÕ0ÄÖ®ÒÆ2¡i[ÉJV ÁMH :)ªBÃׯJ•WE¢+TAV«r°xZ+bíjÕ%yVQºÉnByXÀФm[ÕjXËV¢ö#5ÕJõækQÀcH‰6©ÅŒ+ÞXG2#)b4S„-R8IAMi“)™¿Ò–×ã¦Ê¸öiÏHュ ¦{R ËCÉ#Äaˆ Rþ¸[è`·ÃÀ)¶àƒÐå œ„rÃä^Á-º³‚šoF7¿(7°É¥š_Îc²”@÷@PsNBŒ  gQ t·2‹ím¼9Éd†Û²ÿŽ„À²W¹2–$ÊXøfÄ}”|>Ö^NmIÃøÕ–ZEà{Õ§XI›s†»²ŠåHÆkaTˆó¢×¸8Ãç‚Z¥0¼ã–8)ÖýÀ?»Dið­!ýDì‘{èCFÉÁ-Kôè€ÀvÛdIxªÈF/ìì•$žŒbÞl'IQ­Q%«›Ûz6‚ŠD tDbb8ÄJ3&þá‚dÄ  Üú@ì‘ÔþˆÐ j.ÖL 3g‘l¯miR¦ìD× ‡dËaó‰clû~'WÌñWÝvš¼8M—9²„°Êâ¬d»hEÎnžÖZ#FVX‹Ml -(KKDL°ÖJÍ¡²D’“ö6RŸp£”Õ¬ÞëA·ƒÓÃ\¢Õ8×¶¿KÈ>¥Í¹KÔ”#Y„Ãçý:¹Ãu߈I›76ÖTÒ ¼š˜lÏÓÙ¾dl }Í3©¯a&à s¨Yß×ZÚSôÁþ˜Õé3uÐÇÝtîÄg¥Ñtô­—‹‡¬æ[oÉΑçàºPéÙvØÕå`ŒYêÁ}.öi¤¤¦<èrª»’dö3¶]Šݹ«=´¯üÄZyó X¶ÂÕÒPi¸ÞQêü“ ±ÚÄþÏu„L#@ù8Ú‹ï ˆ•u¸~¦RH¶Á±jµoAãsãW äfðjƪ)ÌYo\” —'ò²Ï8¡ ü§!mÙxr—l¼4ú<…²Íëæ*Æ~L«½9¥±Üµð/©9{©W =ü6›iÆìõ/ï=®´åó(Ÿ"ížög²zdæ,ƒ6kJ6nÐÆlƒJë¶bkÏJèdZä]_20âÄ-\®%Öbmw¾mxNlë–¥ŒÞëT.g¥N,îÚ.Y¾nïFéÙ*gíþ.ZvéÛ:'«ï©oVʨ]/óÒ®óêåÊmA–Ž5ooþeç3ðu:ð?gKðqR0v’ÅÞ Z2PPCH€¬£D-^á:ž‰d¦/´ìù¥N®p »° óä̆hÎÒ¦rîèr(³âo¶êIªìäNk†¶¯ä®dù ºb$ëV°\^ðfK1^RqÇåcñ[jñqÊ ð-BPÃñvü*N¬®â¡Ã´Q”„Á½éPb® kd «/ € ׯ7.ÌÂ$‚B®?&º©Ëæ/ òGz(ûž¤kj+nn_`¬+8Pr%[ò%cr&kò&sr'{ò'sr6€ò(“r)›ò)²þ(£ò*³r+»2%«ò+Ëò,Óò%Çr-ãr.£ò-ër'…®Ä{°so2xà¾ñ|"&™*žAì¦1«d ‡.'nÛñfJó²êïNÖ¯ Öéÿ&(ä²û*òµ:.hö¯­ürävø[¶x‡êÏA\0G±=/å=3¥>+%?'%>÷ó>çó@ô?7¥?#%@tA'4C7t@;´Q"ôC/4DW4E_ôQ*4Fk´@[tFKtD‡ôGsôHƒ´I?4”|ÀÞZ5lÁK£ÁO€l,†/ˆ@"jÑô~ögË~35Ó±å ·o"êèâdGÖBQ{«´íÎþìÍòg7óþdµšäç)#c€F,íø[={ôI//XËnG“4J“µXuX£õDŸuI·õ[›5\«µ[©HÏu\ãu]—u^§õ]ûµ^ï5`¯µ] ¶\ÿu_#vbo´a'vyBô)³ÌÉ1ç§3oEEž°<7!Ë0k¶lG^³ ñ³s7{óþŽnT$‚rh³V5„öðUûq!¨ît8ê~€W¶c¶b5]÷o7q³5_û¶q÷vr3vq ·s?÷q6s7·t6rS÷t/6v[wvkwpW7xtŸh¯I©® ñj1ÙÈ>™É&sU$k Çwÿ´5Ó7O¿0éªì…þ~k^ëÿ.²i:è ßo‚ò:힪¬fޤSÖŸ…)o+wow·wC7ro÷t[ø†gøu‡7qs¸x7…‹¸‡›ø‰oxˆƒx…ww‡7v‹—ø‹“øŒŸ0·`Bœ±K¤‘) kuït~W3RRs~eðæ‚ëe ¸9‡è®©çNh´Úék¢æ";«¶mGTnvocî=¯ørÃøŒö˜£ù™O¸™?·Š¯y›³8›GwŒ»¹šÛys×ùœ§9œËù‡SÌd©“ ª=\7ãm…™Êçf zü±³ú÷’{¦åz®±Ñ~+´êkû,Ò.h_«¦›ëýmþ~^WGøžãy™¿ù‡£už»:Ÿƒ8¬kxœ·z¬ëù«Ûúãz¯×:™÷9†Óù®§´8|®'²'»zB2i€Þ(^È6&žrúË6ù¿&›Ž¶J&+•ƒú”ïoO×ö€Ÿ3ˆâ©…nk·:¨d:ót‘QP¢˜ë:°ßº°×;ŠÓúˆÏû¬³:¯Ûû¾|®û»¾ËzÀû:Á üªÓûÀ£øXú—®jić§=€iUúW𢳠A¸¬å>:¨#èkƒ®cúGZú¶ªS{«gŠºèV:Ò6«É÷ww¹ÖÁTªtBá#~•ìí "ÅGDAù“ø2Áˆ Q°Ä hþæÑæ{>çƒ>¾æw¾™é£~ç¿ÑçŸ~ë{¾ê³~ëÃþè¾é¿þí¯þéÏþíÃ~ççç<âæP(þðñ+åáò3°ƒdi{hį°OެÀA f#Ä0ÅR;E“YSˆ‘÷«øÛS7¥’ˆ)ÿùÑùã’ø¯9½?>™ÿ‰¿ø{D»þ²Õ&ƒòóÿ >ò 4xaB…-tøbD‰)V´x1á­É’}øðâÎFs?lñ؃=“É0Hé˜LiY`»#M¶¤I)ùá„”9‚zÔ(ÒG™& ªTŠÐ¢E—ž0:4êЧ[³"íjõ+ѯR…ŠmÊ)W¯ZÇnëôjÑ=_–$i’î‡[ÁìË×o`Àƒ þ-,˜ð@Ê3N,p1äÆŽ?ùòäÌš1wÖ¼¹rhÊ£Iƒ.Ù´dËž9·.Hè3kѪg§¶  áj×µeóÞ}ú7màÁm÷~<3I[ìù\¾sç–”?ónÁþ) iw°I1ץǩ^ÍæÓ5m×·RÖ¿}zlÔô`¹&Uú¾¾W)æä=O@ùÎ3/?§Ø£=þ¢:¯?Ÿð’Â$“N: ƒvÒ Cß2nCäŒ+Ž8;±69,ÍDc#µ]<èEË`³,Å1Ë­DOTÑ2‘³‘Å GrÄŸÛÈž;HÚ) ?H‰¤žLº¥;lHÐNŠr¢.¼[ÌBï„ÿ ŠÁÿ„2“,²$³+¥8M7½c)©ªzó(: ÜO@¡zÊÌþL“Ì:ÍüoMØ\ËÎðxrn²H!5¼S3%²ÒNKŒqSNwÔtTQþIõÃ?µ´4qcÈ Wo$NVY=ÕÔs¸%“1¤•:’pØé:’ÆÂpÂ&»žr’&J7òJÁ5åÃs=öÜ JA<Ç2SA6ƒkÍóø3Oª÷Ä(Ð[»E3(Eñ|JQµê{ ]®: ]l×´ðØðšÔ ºžNòÕ[oãW†VØá]WDøG‡[„ØVŠPE‹5sÕÕW ªuäcýŒäM=ÖXbûÒhàd’Ö£è™p‚/¹Ç 9e»÷vüñ†[ƒ®¤$bÒ#0xË•r¡Ù;Fè.Úaó<][|¹Úö(°ù ›@°ÜEoÀÿ<ËM8µE«ÚÝË*SŠzS/(^y¢÷x’’×j©•ó˜…îˆïÈsmÙú±‡œ{]ý~87pð­?ÜpXOýŇÌGÆÅ—<üê†¹íæˆ}î%/ìÑèQséM˜ÀœláX'ÉÊŸøXÅ)DÞ‚ª¨³]ëiáJÚVèÔº¦$%\R´F(­m¥„‚êš ­2o©p, x~ò«»þLJ/ö£Ÿõ¶·ÃR}/b@Ô[÷.V¿ñÍoc;ßû.ƒ>÷µO NŒ¢_â§>ö‹Câ‹v²@ØlB%ÙÜ\N0,lh)t1ZI Ö2íZ‹šWSÖóÀ±ˆ[Qé|˜ò¯k}i\_Ó#˜˜ÆµOyó’ ËÆB¦”Mƒf uµ’‚ùd#:ì¡÷¶¨°M‰Ÿ¢‰¨ÄˆµiÜ¡ØÄXU±•RYa`ËNjR”•âŸ9šC0&-ðI*ñˆÁLR¥fIá:Ñú Z’†¦>¶éi¸[Š3™I»Bºî=`CÔ¼öô¦:å„ql$"ÁÙµp&å?Z{!Ï#!d…þ±†<)c³HÊë —ø •>ëi¾îåR“¨¥md)Kp€¬–O¼¢B ?¾ô–ýhÂH2¬/ÚŒfÒ±O‚“ôÌ€ØÈÀ€2ÈßñË\òÏ3oǧùðivl ¼äC®hbͤëbi:™R¢0‘ŒLäXÄɨ$(4|‰“v¡~ò3pšüÞDqEU{joªP½*ù˜8ËV1QV>:è+G–Ð(šÕ«¥%X#ZʶJf?™SLwúäWÆÄ’–€Æ6½ŒÍ‚„Z`ÓóL@9 -sôÏ4ÓÕÀ°a¥][ÃZÖºv–‚í„.„áºNÈSJ²t—Ó‹ uFO·>Õþ”[Íç[ý©Z©”«ÕXùä—8[>·eÕíBÏÚʱ®¸†C«AY›ÊÓ&Ì#ºH*zCŽxs~½_CW¥µ(Ws)uš-¦%_j$:?˜X1íPQ á!¹/ä¹0+É3Þ ¸Fß«å%B;‰Ú ÷×þÀÇð=C©ÕMZu“´µbCÓÚà°æV¸»]\üÐú[ÆèȾ-o­ŠÕâ€$IÒJÌaÉŸàl#Óã 6˜lÔã:„^2y¨ï¾L… SýÈÇBîÉhÖ:Vši–Be…±ôYéxv¼Á—(>ü™àš¸d—äÒŒ˜É°kµ¸e{Ù¸þ\p˜¿,Ñï)˜­ÖppÕa7¯νesf0ŒP ³’ÃZe™ÇÜšº °—mƒÌZÀ91&k ?©r’³Ibp\@ž#ŽWG6Õîuþ2i~tw67Er@ãY—¤½«]üXsÒhù&º(”,Êå—¤`.ð‡éFk/#8«³ž-ÓÌa;Ϲ/¾3n„ýæ6K¦Îd5¶ƒ{Íà\Ë0GJ†î`⺤øÃtÔÏÒˆ“Ð20LFæàRÀV'lBÓÇ첊ÕRîÕ%¶[S‹Ñ¼Eí˜Ç…ì4MG(&!ƒ øÀ‡™,·õùÖZ}6jû¦k3{ÒÀs*!:ì_+F¬iþD±ãLìag˜Î‡á¸œ\q`CÜÖŒQ›åâiÉ-@õª½êHÊÕ›¾u¯kýéTÏAØï0öŸ+}ëAo5å0WZÿ2îqóÜcûpÙò0â´â*„K®ìŽoœï!_6à?rWŠñ…·øpyíë)¼50›Rsx9š¡˜%ÂKwÒØðHÊŒ =[D¿™Ž·ôIK}éÛ¨իÞÉê~=£Ú™ÀHÝð„¶ÝåÎgº§öÀy7â€s5ñÆÞï$Wþá/l8þï†þy°ýÅ«ùØÌ®õîÃö‹V4s7‹nK¢h,%s$ú¥±~Âû´@2ê-FîO~Ð{ ô<­<§–¿òdýG:±°,+²%j"¹°km(“î÷.åª òîîˆoá,Pï^ãø¬Oñ–mú¼j2,Gn?.ã0 ©ÿn™/û>{Ï3$I\ÂåÚN˜(©mºtöª;Ž˜JꃄÈ^Ê¥ìˆþެ±Îä,f§± HODÈ,¢ !h-ö0.& >І)B‹à€pž°Ãáð.‡oîŠoïæÌã:p_0u$g©GqãQÐþŸOúÄê-ãbð ƒr˜#$0çr4ªfòâFg&´Ã€ %ýæ (Ä¢_nÌŽê­O¼Åvéh”&AâÝâHŽ,èä­õ€ öîÓ,mA P.RÌQØŽ’œ*ÕPQŽûzÑ1°‘C–Êð où”1›Ï£hïG¤QÑ«öp3p©Ap§¯Â`ëÃ$¯#‚ÅòÂJÄspÂÅn'hhZ˜lÒ&¨wœ §Âæ+lÇ^:H ‹‚uâäǬ)ÜëÇ:HNK9­Mäï¼H zî8BÛÚ&ƒ/ =ì"qÍ í‰#mkΡåpí°«þ­q£‘%¯Ñ%gé/VR%õÐ$ ¯q$ñ¬Ë~0±—BlŠe£´-H;`L&®ËÁÍ ß¥¢2°Úši+®’M klj¦2->ëÞž‚?ÖË>’â›bOtàAjæ‰Ò$Pð"ëNår[ #‹Ñ÷îR•ZP$#ÿÿÐ1d’0«±0»Q0UCñìE†Sò0_0'ÙN.#AL´˜k#H̆‚‰"%‘iYdÌըɛ@(+Ø›DȰP3„ÎË[bó*’‚ idótVJõãLÈ­ÿ1²¶‹47‚"Áïrhã’S9ëò™óñÒð#yïþŸ„o/¯/Q²•ï1·3_2237¸“•3Ó<»Ñ1c1 óäàr1Óír:8bÄj&®¦d:ðBó`Â(·ãY”‰#äCÊè±_¢FqÓw ux O§¥B jb±,™PþšÐ¤4_p<´+hÈI,‰%%1b>§ó2Ñ9Y+:Q/gÅ:'3ãL<#³<“=Ñ3<Õ3%ÓÏxôFƒ ÐÀh'0À"“’ºj‚;´„£LâwADq5—FLVê!SÓPzÉ.¨¼è@ûˆ±¶¥É"ë¾ÆÄ°šr^Ä"¦¨þ#Y®Oí¢DMÃDS´I·'×P:=’:KÎ& â:Ÿ2s4RדRqÔR'ÕH‹tH3õR #7€tSC•G7•2ƒTIarIípÁV”>ïBfB‚fFK$ŒåQÚæY@êYmh2­¥doO©A.4Øt6­PßœNVñÉË»úEA”2­LÔ¥š¢B@k¨ò Æ´Ž<o16îD£êP:µ ›óÀ ªQâQ+SRkô]Ou1­ÑGëuG݇T=•6>õ‰óUD_õÕT—”•Ö`”¸díHnA0¹° ÖæÂ;z&K¶„mÜ(5—pQ¨ _(°îñ™POMáÈþçdMÓídï1Ê$IԾ˥ð°Ð)ÉbŽ`ø«KC<§È_ç’ Õg{¯E5”Ô5Fã;[Ò^‹4øu/R6³V=gEÐiG&\YÕEÇUƒ6/§ŠhQ6Ü3^éõ^“v_Owj£VkV¸¶öU"cgU·uYw¾UPo÷[cWPuT»3–Æö~(g®ØòÚ „(•ŵT”iZ^þO¶ ÝB,¿+N½Ð›P‘d;Ö—¬DH§i±(-6*âÍd}Ìc‰âOEÂOsOËTÉ$éõ¬`×\ËÐPy–Eë—.Ó5ù²³TC·2dÒt¶^ÁvŠl7kiw~g×j-׸k‚Ñ3‚+¸¡vV'SWvãðÁ4Hn¯—jÖ†h^`ªãs@ꌤfTŒ{™ ]$¼œ)½š)uÈâ\,è¼åjÐDÊîoXëL÷H+dC ]Š«éZopD¦:iu6wé5—“6R¯8s‰¿x2ø<9•€ÿuuö˜Øªx‚Áõ-8ƒ§–40ƒµ/ϘþF%x”“_“S1½5HvfN¢Äl&%–#/`ÂmÏÏb#w ¢+X‘eO“’!XsìzíC?ÊdlHïpOÍõr§hþ­B«Z.T 寜«à,rS”±Œ×x‚…ögÅ•ÑpDdÉaÙwqdFæU€K·tÍXuŠõx•™‚›9Ž÷Ì~¶7üx-—¯Ù{².dÆAêâ€i:´-BV¸ó¤á®Hbz©æW“°ô~øp÷’ßäýî… ëÖ_¬’ ë|ç…±7+í-HKó^ yWâ§r©x–ëX#±¸¡oYš;²s›-Ž{9~E÷ov€z™;ڙ阎þ­8™s¢ÏUp&#vïp—Ð1ûçtU#žöÊÛpn'¾=uBH|«žo,Où–|«’Ÿ19MH12՞ɥfj¢PO8êö:g[ÝPU«á˜¡{Ö¡¹zs·˜ 'Ú·ÖuóÏ‚™2Šyƒ™™³ŽìrsMz˺5%Áï Ã(Bhµ:¸íü~ЦM"§ôNYge]ªýœŒ¦Ìf‰·R KV‰™&¼Öë†[**áȧ҃´ $V/É ­š}¦ñ˜Cú»ú~çº.9w;ƒ¬ãsF1Õ¬YIU¾–­s{­ey¤ã˜ÌâÚ«Yûµ‘ˆšSfh£§þf0Oýp¢Å,qY0j†ìºÎº©îºÁîèzNè¢îé¬;»}Ž=ŠŽêÊ›»½ûèÌî¼Ãnì¸;¼»;ëš.$ø3Œh&ó\¹{¾˜1›v¡Eº·£™\µX¢Ñu¸o>á•‚¿67n›[Sš{{«UÀmY¸¹¸.0ª—Â0:ÆèAÌ'hîdZøf\ÏnSeUœQ0{ôòÅùHÅg|Æ_‘®5V%5F¿¯Z­åØ­Yއ|Âå3ÜÂÅÚƒiüv9™™yÈ#\—U»–õ²¤UúrVIàIÐÂ9ó$; »;dL`h×”ô:*¤×±êÄ-蔉þƧë|NÆf+«ÕCëœCùœÎ}šÈhvJ0ç8ÉPâªÈÇj·ƒ<Èyû­›P#úEŸS7à³wù;«_wd§Ž©ü«#½¤]›µBmÐQ9bgØf$Ô¨g`lt@tnõÑN;t< pÞð É£»tŠ×Y¼°ØÂ=ˆê{Ó§VÜÓ‚郪ð®F[âNFU¯:·Ú©½Ñ=½µ!—éºÊÍ;ǸŒw›ÈÑìÊ‹\®Í=É/wãhÙ×I¦t()©ÇÜY;̧¥d…LÈö²·æÝO„´‹ÍRõ‹ß. Q*¨“=±0h|1‰ü(’X"×Ð30}¢ýŠÂó´þøÁýÈ|ÒÃ:bV˜Ó:Á¼Óßp'CÝ%\Û»˜µ7ÎûªM…’y­cæ {K>|x › ’Þ€Ç ù}“‘]± R§~w¬¥±o8MecË‹ ]g-t ¦—s|þ},j3¾´}¿u7¥µG^ÒË=²ƒSÁ…#9?^È1C @½ÂaïÏ]Ý€_•ÔÅn49OKWX™{d©Ð çˆÍåÙÏ%àuó±£õL¯÷ßÌF\Þ핵>à\²józ¥`8¶3qèâyWûõ˜SWåý»îÓ=äÙžÀC¤¸K•î}ÊæîË=æ)ü廽ÂQþ3¡C"ÕÖ_‘+Ñgͦ=Âê»éYwØkæÙ+!ê-h†_È»–~¥º%ÓpL§†~×·p½tõç™»éÓÜÏdö¤ %Úó'Ñ-¼š÷m5BWI! 6Ò$CÔiDÅÕ™f±ÙfxýYYluÈÙ\9ÈeVbÈ%!fvQ™a%ú•–[viFâ[ZX‹&.¦ãŒ âE_Fy¥_2öùtÔXýôÁ|ë=´8Ûц[m³Qél½†ÝoÁ¹6ÜpÀiG“ñW¦wcʧþæšh"Ô%™æµ—“E75ɦfÊùÞžÝáÙægúù'Ÿ‚¶ÔÓ‘ù‘–TW0åÓS¡1h6wlÕ RI"åÙ‹‚5¢`c‰HcŒ|]f˜„?žeu]¨VŒ)zöêc?ƪY§t%¶*`5ÒUج]eê_i˜œ¬9É”a6Ûl•¸]Y[˜½iéå– ·³êmš„~W¨žá^4lßÖ™®BtÂGî¸ê¾»nžÈ*oœõ–«i?½pÇ¢ü¡æ…€ê·E2–"(ÍTIÓ¤r¸)`nu¨á­-JYżވëf:b8˜džUâ§l¹åب6Έ«r:²È&ïþ˜ª±NAuTQG‰†T¾Þ=åmÏR9-–DWY-qºa»¬¶Ënû弃ê{'¼W;—ЖÛbM¨×ݵK¯½@W öÙgS6¸f«Í“‘F 5š’<7Ú“þ-8‚UXm…Í€]u*¬ƒój*˰z¨X]oè–Ê–M«6’,Ø©ŸRøë_/ëh²®“Ýjq§€u±™ÞR6yCÇìëIK;%Ó¼eI»oN{uÔÙ>}o¼«³ ö—:mí¦Mõé¶ðŠ­üïd/ýôVWÿ<õm è‰97R†•Q J£p¥T=|‚=Ɖœƒš²e®J¿Æ+~Hȃ˜1åˆþcÕ¯:£š¹lq9Õ­4g?ÊO ê#Í÷Nóì§u®á윕×%­i ¬Ýµv§»º©w® T×–G®©™Ð78Ižì:è. ®!ÎÏ £ÇÃì1i‡Öb—ן¦%wãYQõ0c}€A{îP¾ a¥?j1щw™]]¬%`®JÖ!²4†3›ŠÇÁH.kÜL­£«³pì.¥òUáœø• )éPx;VÓ–<ÝdЃ,"¡…4:w‡$á _xߥВÄd%/I0!‡K ´ÝÒŒ÷,EvëIÌƒÞ E’C‘m,ä+cù5ZfOQ[ðþ×QN¤[´@@¦ÑÂt¾]*gûÁ˜gFô?)Nt¶Ê‹ÃøáÈ~¢:ËcMÍ)Ž2o\ÜYÄgŠ3G[”X>€Üm4¥Q,È:Ú3“³1¥ÑfÇÁÛYËMÙˆ¤!CÉI´[šŽÔPˆPN6t! Uhî¨e;Úa)J¨T¥Ù^ÙÊTÒÓ£«|×,5 K’~«?EIÔ°>G i?åã[V¶â 8ñWf¹ÙäôººX(s¢»LÍN°!e¢ŠF›qãÄ>óSqc¡»Ü³MÏQ(o'8‘N×GAQ^…\IX©…Oò¦¬ìg(ÍJV‚J”’ozèþ&×µ:t®¶™è?)šÖRjphÀ ©I)ÒÑÁ–m¤‡µ%bk(X{Õg«rS”’~ )iØ8P‚ŒÙ³ueâ쌆Fw±ø°œ dãý>†¿·dn~á ü<”±ºïeõƒQˆ’º@Ä´hCVRk .©±á+”Œ³\´žu üdä> úÜêòõ‘o=(^oúN4»ÔÍë ÷*%éV‘Y3¬ ûÑ*6P‹ýª{Õ[.”Å_@ñÉd›²”ÿøl˜Øà[¥dY ˜±WƒS-©dÅF¦~&3¹§OQT«•mLV þŠÂ™S Ž E¾#U;F£`éŒX£I]{þ•#4æŽõ5ËÒ ŒûIã¢E—hm}ä^ÁËã¸ö˜[àݱ‡ ÊZt“Js. ƒ_ù² _ÈÝè{E:åGymJ÷ŽD7 ¨XQ‰)(Õ°å,wH³Ô|‡5·ùdi3š×Lç9¿9ÎovsßÌg:ç™Í~þs f9 šÍ†Fô­˜C;ÚÏv†ôŸÛ\:^nbÇurr•‘y¬9¶±¨Í;jØ äõ'w‰ŒR”°®«‘wÓÈ$O— M¯ ÕÆÞ+÷ʺö5}¯'ìéÒ'G$±(ë(„ál+L°ßJ÷A3~ Îѵ-—ímc{œvôö¶ÅþýmtnqæÙ_””:ï ˆ?V§‚ÁB7Ô,5IÝÈëú[Èvµnª_íV"#Éçe멯“ëZÛ‡s‚²¦¥üð_Wüâ·×dã6”ÓÌ{ᣬ±´…ÕŠÁ Ë~õZlJµGܶªºøòs»Üå"kyË?œ–O•f›AÙÎ{^¿û<-ìÊdí)ŸÄ»PBsFc|Ï[÷uƒü>šª P/ôÞ5vòuG"-Ÿ®f«BûpŽJâL¶ÃŸ®Ø&˾Ðåp£Â({ Ñ+'3¥üv·>F¨2ñ›£39GεÑÛùv›–&3Ejjož¢ÅfŽh„ðÊBK«1æ%S¬Æt ‹0*º¦kšG¯4;ƒLN×zCôzö{‹du´7{úVj—cù†u¶7{´vÜ%ó6-qç|$ÕkWRÍXø|ÉÇw£$þbi@GrHB ² 25m’U>ñ`±sœAT&£@­Â?6'Fû—1ˆ±@o„!õsF,Ry•SâtþŽ}q"*³E s„"yc0’e ð‹n#‹T†µè‹¾Ø‹¹h‹´'‘ù:m¸v((¯TŒÇwŒu˜ŒÌ‡y8‚ìá‡[ЇGˆr4L擈n ݧ…ɰ‰ã?æ1È`ŠÑM¶åZë×+ '1™sG’9*r"Ð4NJyŽ’¸`#!æGId\ËX€b’ø‘‘Y† Y†Á÷•‰ôW°§‘jÑsè‘ Ù…Æ×–oy•1ñŒ=É0ÿÑw—vbSˆƒ·ÿQÉtŠ“!f9,s`7 bŒåhyâˆBÕ„–‘xàvŽ„?GúLj98{þ!y6($ߣ_€rIHY ‡`˜€ºøš´8†¹-jňPÀcóÅvrX6è–$ÕŒs'’½IœÁ‡Cñ*‰ÑPÓðErÙWr‰HÓ™òNY‰„Ù?3éä92a3ø7n¤Ø~œ˜”¢X~žh<Òsæ†mA“®èGæð(TAÆù@³¸•aé,ˆ. ' ²é{¤¶•®Y‘˜I:œÊÈŒÉX$É–©)œÀ‰¡"ylø¡Šˆ-h‡’$DE“2`—Bš7˜ƒè¸LOi1 ã¢$&~Äž8ŽòW„øL*£˜èç`¢uЬ:y•€³Uþ(æb€šý¹¡ºÉ𨠾X Â8–]9;·9¥JÆ•ª8’êŸ:6j¡P:¦iº¦h —‘zr3,Ñð/Kd&¶Æ´} ’t5?[¾%Ž„ù3¢"0£#ná2@U"¦åž@‰@‹ñY£è§7ó‰N¿¥1ñ´NMQ$/õ3Oº‘, Ú•.F ¥†°™¥XªªJ|j ‚º–hª¡lš–xXœgú(Õ/tú˹UÓ3•YÚØ7[Q`5 b¡¹Fáæ§Uã*‚m}M{ô9/—aŒ÷¬4’”GÊ1®’Fæ`':)ç©~ØGa‘š¸j.Z™ª­zþªšv»¸ªDc¥\juc‰‘dœq9H¿i«Ê禺«lJ°o}·(D1§î vš…y³ÒÆ þ%r[=)Û¤Eûƒ84W?(sT”3Z#s@ªÂZá¶­H•ñ‰sœQTà¤#ï–ïôRóªïª•_*VóÊVú  öНZ¯A˯jj=[|#Ù…›«îJ‡ë´S‹RH‘l˹‚Õ8ˆ/X mRDE2Y,J2N2t¼’¤{ÇnãÃz«–>k€(´Êj©z´÷J´I{cýÊ´{¹º µTût þ{°·ú´ k’øE7·0§=q Öè3$÷’ ÃY«4GFÊ•6"œ~ä7U…Ú¨87z‘ •þh?YF_¤¶ Dz”9{9\‚:Â5µ¼)¥b%u­É¸.Fª\¹½ôz½ûj]ÿÙ´±*¾šë¹ˆË³ u¸ä«°9‹Éù¼s:Y-@¢ú¹z‚Ç–…G‘@Uu!H9­ sžæd&[+ü«@#ÓM¥âx“HbÛn-òFá'y}QaL «l¤¡bè;½;¡¸:–Í5|¦½K¹%¼ßÂ)¡ »¾0ü.Q[µ\«R;¾nªl')\Êù/£Ñ(„ ¶Zq>åçþž¡²Ÿp[y¥X™ž“sEus˜•KyT‰÷ƒ9uk"»x~ûTo¡37sãŠÒkµ,f½$¼Æ@ÛÂml›‘ ;Ù«Â‹ËÆ,ìÂ¢Š¹³ê›› ‹kÃ4LŒ7<—‹¢wwˆ¥ÁtƒèbÆ$`ÆšrF‘g–‹ÖgjhnVh{&i†Fg–¬gÜhLhöh¡\h‡6h¢ŒÉhöÉ“æÉˆöÊšÌg…'\»\©¾ ;ª‰;Çvœ c%ÌÚÛªµyo#,Œy É|LJ›Ç™{63œ¡ƒ¬CÕÃͧD k0ô >ªg 3fЏ¢ÆUÅä&nЇÎß6@3Gþ©Û¦²[©ÎDzâMiŠœ³©Îë¼f\Ã8œ¸jüÆíÌÍ Þ[ÇM´ÔkÐ?ËÐ~ŒÍhDÓªl¦ŸË¹× Xë¾'H,ýÄ«x¢˜%SZÁóJ2s6Ž’ZN…NŠ)U~úr•šŠÚÖÀãÖ­—÷ÒeD*¦2zs!>Kš¹ËÑÕñ†AÌn NmÇÍŒÐ+ÌÌÃÌ´L]ÐýÐçÐ]¾€¬ÑlÍc-Ѽœe;¼¤KÎ-ùȉˆ Ân)„RXnãgN;¨²[ÓíÜ[.·[tŠáwÓÒt5+!4MÁU'hŽ-ÈKýËO½Õþ›ÕT­ÐÕ–­Ì ýÌfMÙ|l¾Ë˦]Ö}ÌËxwDGq‚éR>#Ò YÒ€¿“Á5™`0]„?òZäÒ ¤¶ÚZ#‰áxæ­Vzˆg9Eʶ?x*KìΛÒÎlQë¤DÞ¸…MÚ€¢Ù˜ÍQmã]½ ½Ù Þ ÞbíÁ/L«m«ÝMÖgìÕgí¼Ó·q¥10DM>2HÎ˜Õ LçYŽšÏDø„Sø±uØ#Ò­¬R9¨…“/Ë~ýc¨ë7áàö-²Ø¡5!¦ò´(ÍŸ¨½Ç®'ЗíÙØ»âR­â¡ ÑbúÞî Í»ÚI=Ùôãwµ(æÚIÑ=þON$f “麬û99ÝEšMr.UòH­l‹×…x´v¶²ƒ"ó?ü)«' 9 ÃŒ3õíÝXÙÐìýâ0žÞ,nÞMíât~çmÍ;nâmã]}ã1>ß{^âEaÈõ3,É®H’Y £ 4…4©å’ŽTŒÄÂáÄáµaÍÖ1d[an@jôF1;T?·å5bb½ºl!¾æ²Úæ/þæxçÍœë™íæÛbë¸îçƒÎæ2^ã©­çc-èzLè„ÜKÉÖÏÏ ÄL'FŽ>³Š&ZFʰ…xKžF"c”½B»ˆM@›Ã­‹ó¿Qn~I(þ»ùç»’ã!ínÃ"† 讚n¯ ë»Þ⧺ワïÅlö-ìÒ ì½|ì=ãx¨Áˆ.âìd§5fCLÎ~C¬÷ÁFÝÆ#¼kÓÚ´!ï­ç$Ø«%áòYM±û>v}òÂñ„zàçöLš¾S©$;#$nï§­óúç˜ ÌZݸZ u»Éç?Ú‚RÑÊÎóE¿ôH?e½z’ÔˆŸM!±r)ˆxÛÆtz+÷˜Ý™ÀŸ!®3S2¿{å§²±x¤Nžr[LÓ^z ò¶ðhÜNÄÃ2YNѤܽðÏô¼Þóä-ô)ŽâJmìM?ì}>ðÿ*ëÈÎð9<,æþ_OÔ3Î àFÌÄò>ŸhnðÉ™,W+./¤‡ ²O9*¼+…ñ±:MäOI„q!¸ùõ¼”i‚ÿø<Ûpµ®ÞÿþÁmyïÁNãÖ‰ã‘ÿÕì»(‘7-äù%SÒäŒäáܧü£E´ò)w¤À¾R»ƒñyèÌ+æbÓ~9˜þs¤À5ýÓÙVGb¤Ë¤tòôŠNŸì¿/e1ÀÀà`aƒ"·0¡Ä‰ #Z”x"E3~ÄrcÈ‘$=š,(²äÉ•)RÉR¦Ë–kvœi3'N4wrŒÙS(O¢A‹¢ô™t¨Q¦É>|¸õaþË‹;N>ýàtË ö°J“¢›´YH»CÛÖ`·n‘"å„1RrÌ¥+7nܹ}÷æÅë·®Þuñò¥Øîà…õîõûXò\ÇŠõž\¹2b)æ ÿ=,¯çsëflš³a½WÁf…õíë§HÞdj;èRݽq#eh±aÁáÁ!¿ý[yNÞË•6ÿ™Û¹PèJyžܺtæÚ«÷žûvßÑË“Ÿ^4êÕdöî¼Íjõi²®Éœ‚½:—³õ°…í5§:C ³Ë#‡Çê"-®óâKÁÒSí0ÀüêKBÀâòŒ@ ìÁA¼l4!KÐ4Óîú¬E þ93qE¹ K*©®zJš²ºå<ñ|ôާÓ:¢CR8‡4È%ƒÜ Ê'‹¼.J*¯ÄÒÉé˜D¯É.¿SJ"³2G+÷¢Ší­dÌéj‹21Øq‹d¤¡“?´è\++8çÛ«CÄX¤Ð²¸Xœp®“k³¼Xs°À ƒ±O ù²ŒÑÃõ32¹TëÐ3D7ë”3Bç²Ñ-¬æCSÀ€ÌÒË︄ƯˈÖ)YÍ®ÕçdÝUW#}Å®¦X}Way-VËî|E6¢¨¶rŠ*«Ê<5+/^ S@s°a?°¹ƒ :i”óƒÈX3pRÀµô¯Iôð\Å%ÑD½÷Qþ¼P;ñÃt²½,TAÉFT-.פ€Í>öÚª±GeÃd(c]Ev([»ã"“]¶cŠo€`C.9ãf+f9ebW9¢‡·pï)5o”ª«RkÜBš±ÌºÓçÙÎÊ®«KÑGõìPI!¼Ôh {Likp³O #TàÅö=µÂô{BF㽌F­l†­g†·Š¹eWAyËf7žæcåö8׸ù6ÙÊ¿í\åÂGœÈõ¨•–­ùžŠª¾¥Øê–±¤!¡?Ÿ¥IuG§ MÔßM™ÖPP¯3=ø2~-ìD—¦i 1ŒEÃ2 Æ „:ÂÁ>±TÏ!g»þ­¡¼ï’éf^H½•wÙï蓇LæOî•úWŸ¯åê›ÿ˜ûam4³*È×¾jš¨Õq><ù·[i¶ñŽ;¤°/ûïßÿñçßÿðg°;((üËAûwÀú/ ïçÀÆ…t ígÀ 0ƒ`!¨@†„!¤´§§}/|a6`CÎ5œ!ihÃòP‡1ôa…˜Ã!îІ?ìá‹Ä%&‘ˆJ„â¥8E&RщFŒ"µXÅ-rÑ‹Wü"ňD2òpŒMD"!~ˆÄ3fñ‹etãÑ8Ç8²ŽV¼có(Ç8¶tü#šØBþÂMô±Ç³T¥;ÝA?ì;^2Þõ¯½èh–œ$&i—ÉINJSŠÁ$'c$Êßq²“—,Ú°‚>ˆÝH{â ,>’}Ïy³-µ‡½_½RpÓûž.m¾Äý$6·hÏÒ›5élrb! Ф0:%c+ª¢Œe¢ÆÂhÓER«eÎ&0@¡R”,êš^P÷/¯•S]ò‹;»9OR]“r²yJ4vv_öÓŸÃ,¦õdÐîe˜E/oùOƒ"4˜=èöªž4Ùãžì)[êcO¶\~iPކ·¡ÝaFBcÚeÜ JÞ•¦/¸S©%4˜–B¦t£“˃Rª)þ”" ¦t¹©ë¯‚µPUOyÃR1† Ó¡•hSQ§BuªOµªDj±ˆÆr¢¿Ä*D½—UV±Í)}\!³ÒlMîF›š#Éb HA[‰Ì؈j¯²©k^ýÂWJwº ¿xF3/â¾ÌNKF^%ÊPëØi(|ÑTEª´&=”I®ÚŒdŸmhE;ZÒ–v´Ë+Y¥ VÕv•«Å%°X[Õ«¶ª´%(nuc¶*óÉèS$7'£’ÅNõØÜÎÐt© x(^‡RÔ;Áê‹íŠ]ÂF$T%lº‡ñ7E]Ê–ò_I©îó¶D£*òP2JëÚþ–p«­¥m£JÕÔ귪כmk«Û½á—¿_ÅÈ-¨%´^E­[Й=+.lÄU~ôPº6XÄžw²Õ}gy7*Ðð._2ÌcÒW)¬k«‘Ìc\ÌR íó)U1|ðƒ<ú:É´ Õo.à—ÅVdÿßV\àçmÉX%ðOÖ÷¨ðY±‘Ä\S§oÉì»hèN£ÒièÅ¡C›t5D06l]£³ìušr‚W±'È›ñ €ÅÞ º'2Lž÷ h¾ ô*{B=V9CϾA6r“Ì<$Y{–^X‰ÜhMsÒe5kƒccHDªr Ü’F\Õ-D›þ ΟiÝK‹´æž82Í]®ƒÒlfl„Aˆ#—f.y®©¬¿Æ™b·˜Ï%~u|öÄ–[h–®Ç[•¤…ùè( ôÉn*¥û‹i&ƒ{¬ÝÇ=äÝRûU&ßÚ„kVÇ©-cr$á­Ä˜²¡Øë€*™³Í™à¡)JþØÎ¯@•iš-c„È… H  ‚çwå¹A~ž‘„a“ÔµÅ×ÓB&ˆhOþÚO—Û¿ë¶ôE¦ä•{¿æn¹º™rȬ õq vŠúv6ŸËÅÕ Ô\êUb0M’´¯¿Nç¿sª:œ¶Ž5ŸÚÖ€]¯Iå™^ÅL³½çc‹þ/7Eö̬X{ÁøÉqÍQûnç|Òì7̬÷’Ñ\ç™¶ûÍÏwœ/eÊ[qO2Y99“>ž3‡4ÄõQ:ÍO¤°A¿¦;ðN~×éÕ)ç9¿ÍÐYÈi½7«+èx!»/¬/6ë ×; Φ6Ÿ w,±Â~;Ÿí=ËÑ]éK£¼ø²üðñîd¹ÃvåX–ÏËU-®Ðû>qšâªV‡¥L‘jzz»lSj“Êscb­Î½¤s¼ÿõ_'Nq°M<öϾ$Øg½ ï?ÞF6R´7Á¶æ»-19­ÂC·3>™›»ã›¹MÓ¶„ÀàÛ;›“Œò­ù(Þrþ¼ºrŸh:‹iò™¯a 3C”¦Ù)o2©«a ƒC=àé‹va±Ô  ©=ƒ×Ë3dó¤ù{=‰˜‘ë[!÷ª7!@X)Ð"¾¿Ë»Hs>ü¿£@—“@ „ÂÁû›)Ÿgq02I†khò´¸kj¥~;Œ»P‘[Ãsé„Ù?`ÒË Ûá é¸`‹Di¶í2;g+;>#;º4³Û.Yà ¶P•d ¢Y¯5ɶ*„2î -)ÔÂÜò=%ÜDd¡ÂL´Âå»;,Ì/ Dج๭ȲEApA5׈¤ß©5ÒÉ)ƒ! ä&Pê©ìººFQÄ ƒ1P:©ÉþB½XˆÙÙ¸‹Û3ft¶Š;±TZ/Iª¶Ñ2£Ä—c•«@OkÂJŒ9p|ÀäEPd>'GtL §@&S&ùœ¡7=±7 k¤Íé¾r±`´=œÊÃFÑ€T6¯‰šlÆr²šx¹ª¥Kz©‚L¶L]Ó Uú€ÜûŠ{šDsÔÆWºDN´¹oìÈÄDXùÄ+LB$ÅûRlj8Å­ð-ø`¼êÓ Ú¸7i°Ć¬øÄCnršwaAM /ñ[”Ùéz±ŒíBIj—y¿`c)€;¿J““2¡q¥–\@sãFoóÆN ÇÌB“œÀÀCÉs+Çþ°Ó’ËÒÂcÁ¨h¶;54C:šøxÃÓC¼èEIÉFšÊ:¢tëQ¿3óצä0„Ôø+>D™=Y%k£G¬HIbÂ/à<åKK¸I컵É¶ÌÆJ›Ë¹tž»xS¼ù‰D¨ÐãÚœºHÒ »X ²  :N ê ! "!ä¡ÿ!¡äì ŠNJ rNè¼ ðDÎéŒNÞzr!9ã=Ž·'Ët›ÍØdMÃqÍ)„M³,Ë•ŒŽÚDÍÙŒkl»\%aE{X´¬¨¼œ\5¶sµª4¥[#%E¯x ?«ÐÈbþÁ®1§ =' БŠû€¤R!ÿsŠÒ,Å·ÔTÉ'¬Ï‘ŒÂt´OrÔDýôO£ø1·üª)ë¹÷À§¼¤ø-m &¸GùÍ[ªÆè.{§Òƒ‘›bR‡[È1³À0³É©ƒÒS’Ò1&Å)oB3Ë8ÐdØ,¶Ù=eÉM¹tS-IúœÓ"9IµQødOƒ8À6ÝS »d&j±6ñŠË““Ê3 pËsب5¬Ã–ÒЩ٤SB±6¼ô$ò“š`¤§£ñJjÈMYH8|Hxº(´ 9ѧÑÌ 6=Ç8=‰þÄS9•Q´|Qµ¤Q\ýS ¬;]þKÀMx;¼ÿ«i” : ’F 3JY³~ í ›i…Pa{Á1¯~±®ÑI1¯±AÓ,Ò³Ãô£—™‚¶ 7ÍÚFÖnœ×•xOÕÜÕù4Í:õ‘; É[ÕÑŽÉQ~Õ9õ¹@…¾½¼Æžáiª<ºPy©)†[8e³Ö;Ìq¶ÄÜPH‰³|?9mÒCÍ<ø‹ÒM:=B®PGÔÈV:ÑzÑ_Ý[­Ñ|=ËÖ$XWñ×üLBº±¯r”M—\%shœÝÍRsŠVcV° ¦¼¦žTà ¸LщŒ³¬ ‹³Üñ—æÒ©P©º[,SvUþ õ•E/~´ÃYâb‹jŒk\Ï¢¥SZ5¨>•ÏÕ×\;½ÏÕü×ñÚÃ}>œ¡™4-TÙ1¼¦ã95jÚ¾jb;IŠº@Uö»še+/šr ¬3R­”ɪJ³™ÙÜ~AH·åGƒÛµ¬ÉŒáÙ14…0c Y%KšEhü$É\åYâõÄÂÕY ­‰ÓØßÕ¹vDŪ`$/ðC³Ô›­@´»²óLÞMÍæÕS›ðÛÀ^Vã%Ü^@0Òr`äu­jþ\-Ã"LTí ÁÊS$Æ¡êLÛ3, ]ÝAéÚ!š’_p¢šQ™:H±:¦ÉZAéØõ#[ÃJA‡S¬ŒT!Ç¡G~òÝâµÙ€õ,¦W$öÓöÇPÌÙ!žÑŠ`Á]­+‹¶¨Þ¥rŸni$ý AHM¸+…ß'5¿róå«oÊVp…³¡‚ ¹Òi5Ûd ©œš]üÆ|ÁÈØÞ»:ó$š¼â%.d-)à}Uâš%b&~MFÀBö[½Uä?5šÄ}ßÄÛ±( Íéhµ‘1_ùµí*ÙÏ`]N™µmšaHI”³ÉÖŒÝÜ>¶R‹å+ÃŒµQ±þ¡ýÌá)${² ö*^ƒØ[vdF6`Ÿ•àE¶»÷<äþÓõ¸Š˜l˜ÇÙKÿ»&|kV0&¢Hx/)E8\ÛX<ÜS%)óJ,YNÁ.E)YÖcóû‹Éô<|5Ðá¬/\v4æhfOaB*>àf¶f…æU'öUÚR¹âcÖ«xQ›[B5TYüÀTë2íu«ÏA8«e¸ý+¬ãXÕÖ>CU¸•‘ aŠ´ØFÙV1ÔÁ”˜¶ÝLž–õÚ݉®dJ.œþ àÁMâ…~f0ùÙ–Ä­Iàj.ê*f&x Tøè溂–ÍQÐniWH½‹ñ W]³31MÝØy¬þÍ›Œ0½ZßÁZž‚R€“AJý:¶Ù¬oª‹xhᜆä"î´{}j£Nèefèãýë¿5–{¥h¾mdCAý­ÿCNÞ±žñK¹²¼4ü€ÞI§I¡š9k®Un:„ÊR’,Yû5ì$ÉâÃcç[ªtò 9¤CÑ`‘UæZ.žYÇ6l¨†èáhg&ìYefÄvèö8 îñ—bçdÛM]úÛûM‹Öo¦Âwþ÷DNìwÏ÷ä~yç +]§yt÷õ‚e 9I<©:›ÃhŸnùâjâ7W+8 ùe±qÓfLufHÅÀéÏŽoó)ã`#†ti•¶ü‰å¿xEØXÇñ¸'û?ùÞ`Âbw`7yyGýÖ>b_ý¬â¹wÓÈcmZë]¤Ÿ&p$jâè {±ñºá¿ÕñP`ñDŒãI8B;aîºë;{gúu燤ã­ç úÉoŽÂF×_yå=pÄ…ûâþóï7ä¶lVqjòÇ×±7ý¯J«d€ù§ÿúÇ¡KRjÂÉ‹î³ Š)RN X°`1 $˜ð þCs2\XP¡A‚ V܈‘ ÈŒ-JÙÈð£A1'r„DY’$E…SŽT™ãC‚3O|HöAšŸn}èY4ž=0e ®iÓ§PH…Z5êTªY¯:Ýêõ«U°X§rÕJVlW´fÞmËö-Ü´qͪ[7ëÚ±sË–Í+W/àÀ~óÅ[Ø­`Bj «åjñ_Á‡÷6^‘Øà‰tvöa‡s~Vg„}ú™'Sê9!ŸJg¡e]øà€Öuèž&jž•j¢¤™zE”QÉÐ#cŒ¡Ö#=õ%6#`ã4wä† l§útJ(yFÛEù‘uÅUþw‘rä…¬™Ì•G^šÂ]7°Çµ$\­ ývÞJy÷R°õ„”óµ}?IÑÚ-—ZŠ"†çÚ¢¦æªë§V Nú®¡ôÞé.T‹ 6˜£ƒ´Ë¨½ô΋.Áûþ»îYG™“Œ9шJ#ĹÑ+~[ü(M`s¹–Ô·$4S”¾v)žFË9k¥H.qyÉÍŽ7ž­["Gf™WùvMd²va;PœžzÔ­!¥T2ø"\p¤;õÔ…lðT‚þéaÕWS 5úîÙïÁð–íõÖUŸ}/ØšÞRßPŸÂX#ݤ%®Q©Jꫳá[д*{,­Ë óDÔþ¦Ôs‘1- ´² «xH/ûl­±h^+´Í2y8HÖQ4Èpƒ‹£Oå¶-µ„h¯Íõꃺ»^ý"zöì¬7%6] ¾.ûï`ç{ëÁ¯‹tQÓ=*Ý¥ºVñÅKSOn#¨xt2OŽ©“AØ¡i²´ÆÚÄd®Ÿ3™“‘>o>“MN΄ÊÈqDåH’óÜ‘ö2×z+“lŽëfÒĵéÎlDÛðnwÀi k]3ÞÓ€~1ˆx¼`1A«m°CDQ‹"&½áoCÑ6v1¡È§'ÄÉÍ¢d¬Ì%Ž|ŸZ³Ü32‘UiZñ•²ØS9ôñrXúH’G8šÔPþ ÉðI›¼.¼‹€V,Þq×AJ]qu¬`ÚÖE NpA„ã×ȼ,²‹c¬×;´"Ÿ|*bË›Q4p´›ÙHc?¢˜QÈžÏë}bŠ_Cæg?&¥éZÖúÎÏjr¦%e«XÃòÞælE’AjŽˆC$Ö¶"û ®(qtã)ߘABmpx¶Ãà*'ôÅ©ðŽmjÄb*qiÁ0Âr‹úÒäfGQÙHi¥ûInXå£Ü na VF§ÉËÇ%ºrÏNŽåÈòD"$cät,â2déj:F²Ö™àw%‹ ’=.Û ORÀŸ(Eu·¼§sÙKT:p—¼Ìçå%F–1 þRK-i÷Oò3Ÿþô¥>·6ÊÔqn˳Û}L•ª>®ð>J£$ø¸ƒL¢ÄIáD É yL†©~NR$zÔé$MžÓ"P’ß!mâ‘⨯r\"ÈõrB¸!?M{hC Q¤®Q•­ìA£ê;©Rðl M*¦°ÊE¦rµ«[ÍQ„iQbÞŠÿKÆ«”‰X=/‰œü~ú¸VKI;ÔfEvⲟòo‰á ³:ÂÒÌ…¤Ÿ©X戨H;š=•ªÕÉ o©i”lRب6Víªe%eû‰ÏUÚ³(ú–Q*Z7PÙˆ…JÙ ms‡ÙHƒ> kMþRÏuNh>þ£ÈM7dzߊ[î1âM« “!æôsó+nIð'Ò[©g| ì È‹ õŸ}jh:Ú¬:uZ4/½<ëUÐ~w«ãͬeéúˆuµ4¢ÇÇðs‹‹Õ† }ÓMF‹";HÀ.0‚ ¬àßÀ^°ƒœ`OøÀ¶ðƒŸäà ¸Âf0†/La ‡xÂ&Žðƒ!¼à ÖgŠ>Á€QÁ!cgcÆ3®±ÁcïøÆ9Öñ{Lã ¹È<6²s,d +ÉCv2“Üä)K¹ÊV~ò•£œd*o¹ËXöò—ìe1¹Ì?.ó’Ñ e!gƒPV3—żä9Ÿ™Îq†þs–í|g=ƒ™Ïr^ó›ýŒç>¿Ûº›jGˆG6½–¶|ëXm±Ï-œŒLŸDÖ¥ãwéšq°ÎÒô[k jPošÔ˜Ö¨û&¥æ5KY/xÛÛTX+T³è}à­Á¦Þ÷Κ׺ô5°ƒ "†ÁÆSs#æ¨JhÖ=Ž@zË0=‡¤3Å®39@ÔåzõÖ’pmÎyB½m/Á59%SÜáÆ-Z{Ý'X˜ÀìF–´¹¶¤ì®òò»²÷^è®M»OYßÿÖwXæÛzóa0Êc|zƒÖñMc¬QÄÃR‡´O§¸òin³åéü!2|]"ÓÈ+ç=#õL¤ã£þËm:•m}N„OœÌÑ“¡“à£EøÀi ߃ç;Öºv¯ÀÅ›t†ú|é@'X[óÖ2¯F7jkOpƒ±½ ÞØƒHu˜¥™¯›"àÔ\6Emén>3<Ö"¶¢EåîìVÒAg"eW&©Ú[+ÚoŠr‹€.Ýèïuá‘në~ýçVU||ŸÎ^¡4¾…éTQ*êðæ=Q€Pœ ßh¤xSZ¸ä;{qC:žçÎ̸Ïn´$g²Iþõ¤ì® ‡†oQI°×’ ‘BÞŒ1m:)¯@äÇÒð m~z!?tä—Vòç¥>>Ö±^ÏQOªçìµÆJ)˜f¸þ³£Mu÷ôÝömüvMN[L‘C÷  "&ŠèŸˆÑD@…_ýTPu ¼`~ È,%Þ¾)ŸÒIô1Þó9_¡œõÕšåa`x1j…PÐÃU²•P€ÁÅÉ–èa—QIIø¨ îÉŒêÝÐÿ]‹5‰ŒÙQ’J‘DN„]K…ShÉ@0ܹ ѨÇNaþC<×qÅ1‘ œ…œÏ+E`’WZ¡ã JŠfàbááU^f_O,Œ9LÝj1\(A‘ª¤«tLP}T8µ_C¸SÞ‰4õ ü¨Ïæ|š{X JÑ•ù {!¬GAü `K°T›@ü`þ¶`ÛBtÞ© Š@Q=åR^ßJßgi¡Óâv–(®×6àžb(¢Ù×j)éÍF³¡ nMc}À§áJ÷Ü Ç!b‘”Ú'ÉÔî­žvô &„:ùŸq0„ŠÄTDSPc4JTäŸë]#ç0DÒǪáÍŽá'rV(²"\)9º"}ᮢ:Êcã¥#f(܈ÕÙͲ ÅÅ(Ó«8a·øµ$–ÌÍ̧•Sbù¢á¤ÏÉD¢°HxðTÞyzDcá(b*¡F&áo4EC€dÊàÅ@¸–ŠlbßÕÔc,ß9Îcäu!ΤV`* =^VNr`+vþ…¼[ÃU4˜dÐGI€ñ¢sdÉ7I¥ÅPÜ¡Œ!·)ZwœŒ#6Fv$6*á5z$WâÝ9yc?~ Î™Õ½äXTaòõääÁ%).ž¿Õ¤Þ¤=Â¥æå\f §À†Ü¬ÃæÝÆF2iŒIÅØáÐ,Ò 1d6ùb]I"*‘v‘x¨TM’ààU4&Ö5*F áVÇ."'ñ‹ I±¥¸åNî%Ê$®Ý&¢":Öföfn¾¢<e`Ã9O´ÉÜb«¼Š11 çì–@EÔQ”ŒÈ"©0¹Ø¢þ³Iƒªè‘€ÝÌw¶G/ŠDv§¯^M‡éaÙ‰ŽÞµp5‡\ÕMU¨©1ÍœÕm<õ„Þ©KF *ó é; <î*¡ZU«±ú¡‚%,ÚY¦ æ†}ÈŠ„vçÐhª•âJÌ”HÛUi%.%È­íM ê¹ÛCz©& ªíb… Ü´IkØêîGŽâäžòj½ú)Ú¤ NlúɱFÕ¯BÅÀëSŒžQ¨!³ZÝÇÄ©ÅímPÏè"l€(y$É5åÞ^aÉìa§rx)ŽS®À•AÎ ‡ýEewT¦ÛA¤µA ‹Õ¶P­,mæþ‰[ö«®þæþ©‘ú+L쎲d±ªP] 5,Ý”kHœŒDê¤.›OX G‰)X|Ö^Ø…umŠØ€‰Øem‡A˜Öž‚eØÖ’-Š}؈­-ØbXÚ‚Ÿ($Š£wál;bVõ*ÑjÐúª]~H°)*I½®V%ªÜÔ qÎÍ€ ŒÅŽD+6¬¦„jÛ’Z»£©µê¨‰®ˆ’n¦ â2¦n"}.H|#ò”ÒÍí¯ž@®â.¿þ­ãkÒꮄß"-â] ² gÃbÀPF­F)§«ä†£ÂǦ^I3îÝùœ$¾_]QgvzhþÀ·áþ’œ¸i\§y/ú6ÒAØVotJ¼Uãâ.°½RÎnïâ©àî®ïþ«¡ªUñ,¡Öo{)Ü-èã.¨ æÍaúWª`Ã÷eœ8iÛô–Û·¦ê\q&è„Jô"pt þ±[Yz®¹ !͵ ã(Çàpç~KÍþÏì*þ°ÑmÿoþÖîýÒIâÊ¥TTÏÒî Ü¡Å"ÄLîÃ8ÏÒÔ‡Þô‘èX2¬LÛ5Ú!¤ëucÆ¢Gq$—'…ïvN&w&‘Ø1ÒËQ¥¥ Vµ®¾Öͧ)ùmñ‚á}hÁñðÒäÑñ/SQPÀΦïè_ÅÔåòT.ýèõùE­Š8£þ¯\æÐp)Ü©”`"ªF%®@“…êÌGDò–ÖÄR¨dú_ †(ƒ ÊëQñ¾ºq×°Ï®üÂ2âþn‰, *¿¥ Ër{Áë(Ï0Qn„Nm´FZQ Å„æ^çøŒ!Eçfj“uiÓCŒÓt™\ÍtrËx'8 øî] V°ë™”ˆ–Z²¯º1ïYè1¾Îñ*Ó1ÐÞ%7ˆ-ç'Ÿ¢³;o‘ö!h÷9\YÕ¢¤F*ô.Ì15su…›ýDâç #}SMEæ1sæ sN"Ú©Š]LÀOtDð¹ž&‹DªHkâMÞr,óqf<†¾¾s·³.KÈÈñ•t¾0ïfþ`8†  ßW(e×Ä­ŠlAZs.òµ¥ÉP—ê5 M6ÉݺARú–ÏRZ±pÝ`ªoV†ŽTCÎ`˦ñ<Á†çõ-I×ô°z†í°þưJŸµ+Þ<çp.¿uJãóÕ×/OÌ|2LËá ùcà¹ÐÚ R#©%r¨"¢›±°bGg’ï'Í߯p³t¸ÞÉBì.ºØOtËHÃõJ›ôÔÜ«L¶YŸ3iϲ[ø°ýÎtüŠu{mbÜHîæòј óuÔrJ0¶^'O’D€s°Ü'Áh%ït=åwö˜š“drÉÊA'û køä‹‘Òœs‡õµºÐ/-þßjKƒ·[OˆbÌ3kï±=³ô*\/ïãä.Ú”²ÄªÐ”2ÌîÐ$« âôÕ:EµÞ]ë&Î%—ðÆ2‘·njàd’Ê.¯WßÍŠ(òkj·i7n}Ñ~ž¶Z×q‡†£œQ<ó%h›ó='+k"ïÆ-FÑ-åOKë]ó"/KtÚ! Wc²“ÿ‘Œ÷@¢TW¶n¥Ýz* LõàÜb3ÖÝJ•O­³÷ñ³8¯@Öw€ÝÂyð` ªj”´Ó±g&‘S#5t¦/ªu*^ Ç#вK´&‹šþДòñÒSê´övcøLÛòh8—ÃÒ—[H˜oùjÓôˆÛÛ'ÚŠç|Ó?ÊÖ^ßB¬Ž±÷foIMÉ2æÏûXåìýáú},ýDs­S2‘›\0Ú`OÉÜpûºš‹ ô.:ú…_¹°¦6ÁÒsi‹w†üoôuz\o:²;ûãÒ©>qóX,Îý3"KëYFÓ°TÉüEËy(cè4v×9TÂ6%õ ª+qu2ɯÇOßÁv}$E£›¸•ßr=[J–W» RU¦+ÊÂsxî |\z¶‹-©9«H'Ãlø4P¬@ÇiÍq#qÚ«^å«¿Lt~¬˜„a¯» .ôMutïþ %™·u«‘ŽYM‘uË+X{6¥Ëñ²ïÒÁý]}³w9jÓ°*¦·Ïk¹_Â6]³á‚æü·o]«Ð– eç¤0 ]ðT—ÆÎUÈ£8‰ê¹MRŽÛÜz‘u4e•úˆ^ʧðÎ5l?V'B|¥7½²;=M‚Ѥ#ýþ*ý:C:§'»Ã"¨¯! ÆZ¥ «PªØ}µº$¥ü&E±4W" ÷«Ž«ÚÛŸ÷6e Šü·þ÷Ë ù0fäxœáÑD¹âGÏ“ùÞ|Ðÿì³¼zÃ3á“8ÓÓ¾k›ù(m»Ãµa„[ !æÅ¬æ˜Øš­×Ž­ŠÝ­ÙJÛ–Ø„=¿Ûþ‚-ˆuØó7÷×mõg˜ÛRÿ÷—¿ó+ø§-ûz‹Wsâ¶ì É?ýçYÍ¿ý×?¡áÿþç– @€—M`ÁDx¡Bƒ BL¸áÃ…+Zlx‘ãÆŽAFlHècȉMf<™ReKŒ/K®Ó%M˜(g¦¼‰SfÏš<[ ülèPzÒ0 UšT©´hE¥I!º›4i\H»ÃD¶->D-*åY³eÍžUk.-Ú²oÏæ€k–­Z¸sÝÚÕ{·íZ²rõŠÁ»0߆÷šÓ÷ć¯bÁ½Ut‹Ø¯0c—9ófÎÜ7ñâÇ#O¾¸¥»ò´»QÇÑã1Çß¾ë‘< ÏûѸ T®H$“dÒ»%—œ.;'qd’J¯ÄÊ*·œ²Ë!…$Í“Iæ¨÷°IJM¤žzLН’±êª¬î¨JšdÜ„ÑÂÅV<ë­Ã¤`+þ>-üóÄÁå«° áT1²Üê­º-K°BWüQÃEÁº …t²°è“,F¢Ä"JK.Yõ²U0›|òÕ0•œµÖU]ÅUWZcµMJ"mÍVa{ öK^EÖXÕ&KfÔh¬Zs¦ä”o(ÿ†2§*&°ŠjlF0*¢’ ±D¶Ðò­!}ÔÜu-MË\Ol^²æµ·^zùÐ9”7Åu e—Å€ëBwOœÎõ¶Wªa ³A0®³Œ-Þ˜c1î8cYäKFÙdIN¹e”]î8æ‹C¦¹f—I^g™aîùæ™Y>ùf.Zç£}~Y奇Nšþg¦svÚæ§›®Zé«©ŽúfB ¦Úk›µ[h±§.ä¬ÇN;èµÏ6Û蟓&{g¶‘†Ûn¬ÁV{î½1–±FzÖ\*ڤ艘TÇâ´ê>­ät,@MP]¥œÑv)A>;œT^ºTœ‹òÑAý÷R):ݼÝÅêJPÌÑG_/xß¿ÞZ¬SSó«ÈWUæá1ë˜øâ‘Oþøå33¾ùäpz食Þúê•>ûí±?¾{í™ç>üï¯ßüëÉÇ>}êÙ_ûõÑo_ýóçw_|û±ÿU~øë¿¿úù@ùÑÏ{ÄŸËwÀú/€ ô0*<} ð\þ´¬• l EßÂJ~ªÂŸÇÐ({¾R´0Ë,]šÐç*DΨî3¬œ†"õ Ì0 3§ƒ— s¡¾%3±sá¿Úµi4æa”!ÕWlT@"°t`±¸?*jqYt ÿ÷¾-^qŒý㟭ØE.†Q˜Ñ_üÚ˜F4¢ŒœbíÈF:’bìcö€–öÀÇ‚ô˜à¸Ó•9I£ô XR LQnQ¨»” gW–Ö) v–Œ`*—:³`f0¤”æâÕSÖÅ”éŠÜ¦txµÒ,¢¬œ[æãDrA²T0£ôêøEaÊ1e &1‡9Ç2*3Žg4¦þÙÌeNSš×{c4õXÌjfŽÜôæ‘NmŠšã´ØËô7¸GNË ¶ˆR•,®N]Q¢TÆDCƒá%‡ïêÐ$sx—ý r| ŠÎrP¾è“v¦´Ý¡”/‚Ÿ’aEáÕ§SB¥1šÌÃÅrvÓœÉ\cIïèÍc‚S¥#M©IjR>~“š4Ýæñ®¹Ò“Ê›ãdéNÉùRžÂ´¥là¨`¸h-Õ=o˜ÏTöÓ­;|ëN¨zÓPj»uu’…“ WcÑ ¡%35¤¥Z/SÎŽP€aËM)ÎXj†s5+)e™ ‡"È”;$EßR LŒL`qÓïzþÓ þt¨Ü$¾K—|  @fT°cTp3£c0Yg1CsÐwQP_Ðpy0o°}P°‰p “— ° ‘ð o° ¥P ¹p ­ðÁ°µþp ±°©P™Ð £0~¥ Ó Ãp ãÐ á Ñp ËPÍ0 ï°ÅÐípÕ0éŸð õ0ÝÐb$,ìA R‹E°ì!ð`«+¤j?zM ~§v8äŸ,ÅA0΢ú%Ý‚ lÈ•àlãFGÎì¥;¸ÈNãZ±/ªCQ ¤—,ƒú¬êú†%YˆÅJ„±«dqYr%©#w¥I±4~åHœQY”‘—ѱq©ñ•%Ç’Áî ôJPǼ`ÿ,2¬bžÊŒª¯(èÏþìo@ðÿä1í1ïÑïq÷Ñþô±þr²ë±ï€þï‘! R! Ò!ýD 2AîÀëH¨úòä+(â#A2$Er$I²$Mò$Q2%Ur%Y²%]ò%a2&a’0B&mò&q2'ur'u’nGeþ¦‰ˆ*‘— ¢*2ÑžÒ‘(1$%1 2ù¦²*ßL*±r¡#+¹R+¹2ÜFˆ2Ƥ)ž1Ï-¹«±XÎrIÔ²Ó²-—#.E-ÝR×Ò.ë’.ýòÿK²ôd Ä1[ÐÀ°¨A2Zg¤(rMײ;¨?DðæD\hB@©–m=ALÌB£’@é4ƒ4?3`JÓÏn5ÓÂAF33áâþžb$µ«FÞÒÙ’7ù’/…8Ÿ#0wÓ7eå,§ñVö28‰S/S8çÒ8·£ÃñªÐ€¨á:±³(íÁÖ.”’Nº‚ö)@0.R $=-n÷D=)Î.p‹1R©-%WTàì„®òiG_ìÂÄæìù0D*¬Š(ÉÒ¶Šs9S:£3Ay:T9ŸBô3’³/X"t)4/=ôCÿÒ‰ sIP;³SÇŒÒõÖñ>òƒª4²( å«N)©Mw.,6‡M_èåB‚k‘¨ÐÎŽ«0§’€-A6SA’¯^ÔS!eúÀë»ò¤L6´9%D}³C‰ñJ©ÔJ3´B9þãBÓKtK™³K¹TCÅ´W¯:uì´ÓæŒR™èNö¬BNÇ‚IitBžòÃ+ÉŽF#ÿ©Ï=7'Ûòź<'#CÖì>mG÷ÐBÌÈÑT¬O7ÓKÃô9·”S›QKEµA7•/Át8ÍC§tAWµU]õ‡ò×Ã1³FŠrÿòÄ1Àe‘¸î‘*ã25ª3ÁJI-Ê”TFeO‘ Úö”‰uoT_†Ú¶ªìJÄ’~Ú*L ¦O=Êí‰ÀâUÏT.7•.A/óSÍU]ƒåTS.É”UË5UÏU<ñ„’\~Òæ¶ E.)¥!ö´ÂÁøƒ—DÍþ$Pž2ù4Ç7®RüÅ?Õ>ñeA(6^"Uí$Z „-|h?uÑO4 ¢ò“a g‰âx°NS=õ]QU\94^Ñu]Gu/±ÔTCf;u\?´^[vf]Ö‰nAVcDe? NQWý?ôã[ð”(àeG´­ 0«Šu4=eG…- ÐkL6wTã<®mŒÂúÉ“t‹ÂHó’‚­a®…>82âTe^aÖg{VfÑôgë–f7gvo]öoé¶Tñ=ÖTÛt‚dÄ_ÍM¥[²¢‘ªÒDDD8çý3>ÛvD²lQ‰]øe= •à¢aÆOƒ¨sO1bGZ]±bûâþ^¤MceY–gíwÙUg_–pkvBww/Ý•wWoÇ4p}—x[#eGœ÷y¡Αÿ*Cqijëé2?6Ɇd‘Z•; Ñ6w^‰ìÆntî%u4ç·¶RsˆÂ:³ZAQ.lóÑvIƒKy·o¶p«4]÷nx‡wp—€XMƒ:Gõ$x‚íáE¿‚̼¥* Ç×~‹+PELl=‘R"ö)G÷`PW¬ðÓau+E4.}Ê^B„l§õ,r Nv)7mu·wý—o}XU“·ˆ·€…ñ€ƒX^—Kr7x›XêÕ'bÚ2pþM2µÂN$qƒ¤®úŠBÀ1L%&‘LnðÄ8þ*>€Œ‡B_ÉpȘ(t࣠Ç8'2îµ°â¸úÔãTjäÁâŽË„(ÑLFl2$c2~R’%yרV)“k¤’3y’7Y“/Ù“CÙ’9ù“ט”A¹”G¹“QY”Uù•Sy“[y–Y¹–M™–MÙ•cY—y¹•{Ù–Wù–;ù—…¹˜C™˜ƒ9™aù”y™qY™e¹™wù™y˜©y𥙗Y›±Ù˜«Ù›»š™œ¹¹œq¹Å˜ùEQ%<ó#kDr`ŽYhSvŠó×°ÊØh½UŒ§ÙpdÄÑþÀ¢ŠÙŠ» SïÙ Šš¡ýyðyŸGð6G¸µ‰ ÙŒ×C7ú£=:¤áX¤?ºhIšMz¤U:¥YÚ£[º£W¥e¦Kz¦9ú¦7úÑ^§OŽw¤qú§{ú¦uÚ¦Z¨ƒÚ¨‡ú¨mº¨iZ©cú©¥š¨gª‘úª­:«}Z«y:ª»ZŸ%z ¾Ë£þXŸoÍN§W!ì¨sŠÃz£i·°lŽ\Æ’ w¸hS6ç:Ú¤Ía(¾u™w  ›LÆÚŠû®ú_¹(7r(É-e'èa&;²);q[²1»²Ée³3»³5;´/[´-»´A²Aû´M;³G»þµW;µYûµ7³G[µm;¶o¶9·y»¶y{·Û³Ñé·g›´oÛ·ƒÛ¸‰[¹u»¸];·{µ‘;º¡›¹©{¹Ÿ;²«;»“›»G» úTùªè´ƒXtª˜2xYVŸí:2 Teëz¡©o(¹0Ípò9ôš2òûÕ Ó½«®ão¾i:°ËñõŒ!ûW y—ø»£K¾‹zÂ#œÂ«ÚÂÙ[Âu±bàø[Áú¿‹VÄ {Äz®5|Å+¼Å3¼ÃãúÄeÜÄ¿U£UÜÅ9üÅgÕÃg<ÄñÄ1<Ç…<ÈA¼Æ}¼ÄœÄÃÛo6œÈ/üÉ›üÉyœÆ“È•þÜÊ±ÜÆ‡ÊY\Ç·<ÊÁ¼Ëg5Æ©ÉÍüÊQ¬G¼Šÿ˜!<‡þžoa\ŸïüÃ?›°Q;ô÷Œ™|°ÃXŸ·Ï{Ïœ¡Ñé°Üцû®);Ñ+Ú¥#©ŸÙNP;ÓuIÓÓãϾ3Û­Ã{Ôï™ÔùÔkzÏ9»»e›¹WÔK=Ö¦=qY=·_Ýe=Õk=þný·sýÃQ]® yÖUö¹=Ù7;Øù¼ØØ¡ýÇñº¹}ýº•ݺ±²™ÝÈ£]—¤ÝÔOåÏwü¿+ÛÖN2ºb–òN )Á Âû¼‰âºáÂ'\Ïã–½ûÍ|±ÿyÀþk.ŸùõR½ýwö³‹œž›¨=Sµ\ß1ܰ!âù[âO%Ï1þ¾#ºÛÁãw=¿ÿñz¯šÍû}=LžÐUvâŸ]Úü®iZÍO¾ O<Æ:¢m<äýfä¼hSžÇožå‡Ýå G¿w^§I^£^ék¾°YÞã‡ÞÛ¥þå©Ï§“Þç›þÑ–ëEœé»Þé!Zê;þÛSœµž'š¥s5q$3?¸âÁRôHõæ¾îKÏîíþî#˜îõ~ïûžôð^‚ó^ð'ø ¢Þ€ñß🠟ñ?ñ_ñ+Ÿòò3Ÿò)¿ò3ÿó#¿îïñ´¾ÿ,?þ‚çžïíaòéaõYŸð'öõÞõmòoÿò3ÿòqŸ÷Ÿó÷wò‡ø¿÷=_òÿðßñßð™¿ò¥Ÿø£ø#?ñÿù§?ûú-ßð?úƒ_÷«ù{?û{ßõÇÿú¿?ÂßòÇŸú¿ßü“_ûyŸó¹û¥Ÿý—ÿý›Ÿû"=oèÑ+xð`4 "t80aB„+:l8ã %n”h0!Áh? ìHQ!C7®L™ñ%ĘaBä˜Ò"Ê–q ´÷ÂСBƒý°é¥É–&K–ôC²[R•~&êU&Ò¸vGš4lU±6ÝòâŽZ)kÕþº½cïÛ·sçÒm+÷m½·|ùÚ½ûW®=i6\8qa±b7FìØ1ãÈŒ/¶|9îݾ/ÊJÙÒ´iÕ¥ÒNHÝ¢¹¯”½j_8ŽËvµÛجóÊn{ÛeÄy¦¼Xòdá/c þ{øáÉ•-CNnüòóãÍ1'¯Î|7rêÒ—gŸ.œzvÅØ¿KFîÝ<ôðÒÉ‹/ÜyeîÍß§wîžýüõØó—ÇØv*×}ÝÈ~ã]WÕù÷ ƒðñ\zôÍ…Ò¤¶Ù\öˆæÔRH8šUM•¶Ô؈•ÅWõ¬(VXUh[lA•PaP#TZáxã-:™Ô>þyd’A*)$ŽGò¸œvêõv‚ ç[viÙ˜ã-PáÈcT32E&Y-µ%TBþ( VcR6™¢šQqy'”û1ç–îמ|} (…†þ9¨Ÿˆî¶h”V:Zh|U"J(Ÿú¤†NJi–˜VºioYþ‰¥¤¢VøÝ©Tzºê§R J*Ÿ­ª÷j§áY ઇ6zk¬³rJÜ¥²ÆZ˜=Ÿ)‰”aJuV‰Z5ÛUmžùŒ^asÇc‰ùRÆ~ mUáN“ˆá’®ˆ&–(¢´ÒF®ºñ.%m ® «* ¢v:å¨R: Eºì.Å£gO¥b2¥™ÓÀ‹š9<þf&Uè&¬n³!ne•¨z¬+È‚ªoŒNúñ &«Šrª-¯,²Ë!«üòÊÛŸ|Ââš²Î3ã\2z¾î<+¥¯–úsÊ1ÐLÃú´¦=Š*Õ,û<4ÌZ—»‹È£Å Ó«qhU‰v¢iM€Í-b5ÖNa`šTq™Œ9hˆËãEbÌìÙ£i¼=ÏÒ3Ú?»xˆ=2Ï¿ò*óywWE ãÉØ«VIY,•9IÑMã¡…FœèY¬éNÆláL)•âf?žµÍJ箩£¼W}óî=O-<Í3+jkÒ¹o5å¾\u¦”C¯¼« 2/µïQ=óþÖ³Êê…Ø—ì¼÷ÕŸìùùFÍÜ·Qíýw2ç­±¸Jåø:i'5VW_…µ"ƒyK + ¨‘:‚}kDUù›œÆö7wÑ#`K¡]ïÐÀuA‹LLð‚V´ÈáŒh–IKŠH òH4f‘×hP4@«l”îU˜-Y¥*戆ë> uùP4£ó ÑNv<™mM„-3Õ—8¹îamwZkšújF½¬Yñƒß“"Æ£%1„cô¢ù¢÷»0ênŒ¹£¢ù¾øÄ,.ŒÐËå’AÃIböØ#Ú÷5g™é,0z›Ä‚ nUE‡MA`æªÒ·¨ì0o!dT’1A¥þ(ƒÉða£¥”KŽm4¸“#ù8Â9F‡HAá%—%?µ™ílƒDÓ¤…G^Ò ƒIÌåÎÆ°7`0)ŠËJáL7ÊÍyrSœÜ×ÅâűÎÜ^C%M)Z“‰×4c›ÉÌéaSÓ”ÒµYÎqrÏfÐ\g;Ó Go–¯Šl Ž“’ÇÐÉÏúdŠèÎvIÕAÅsKY‘Û¾"mIC€¨¹%Rò?¤ô*^ª#V¶S4>t0É”±:P¢º§ÁgÎn>æ[gAàÏâ…ÎèD#Ehâ2"Gîí,¸»þ0ùCabðôpœšò¸”ª3•éTj̦¹Fy>þõœß”ê<­FÕÈy1ªÕL"7ŸùÎÞm³y'åfÉú(S6sl­ª[µˆ>(þ2—¬ çð'¸ú‘ˆ…ûSØŠ¼–%²MuKÆ¡âHIò(`¬¤ê@'­Óu@ý£æ'IÑP…uV²*3ÝØª‰È•é‚%éâ7Ê1} \'Ô%$¸¡n‰«¨Eò$T&(IˆqVœPu¢©@kMÒ󷧤æ³ÊÕ¥R5šçÅèÔ®×¹`Õªp­hÕ¯>—Œª´n[ŸYÖå5Wœ‰aä uI¿e“~&*RM©% ¶öm[è‰ÎÔPØI%Ú”L:%Zy+å8{««°ŽõÁÕ•ñ:¼Ú\4W¼L-anL\(‚·Ç¹ú1V×ÏébWÈ"4rtÝ]¸>8¥$[®½ ]ÿLË›…V0ûE°’  Ußa«2’­ C9éÌC%.™Uæ~âíNë³HÕAîŠeHC.È]4Ã\Ÿ°+/å4£øé“tMa¥hˆTØk¤ì=M^ñÚ¦’6U¹ßäm–?›«K7›Ò@4y[=eñŠPÕWí¢¯\N)‡ðª~25µüA\—×þ²fî‘k­¼? ›ÊŶ.ZS&ì!{ mä¶ÂÌ"ÌÓЊ_-oÑ?À&T,s+ì·@·®Hš vÍzW³@SÀNòîž%ÜKǤ‰Æ@¯µ·µ_‚æ£ä˜L¯ÂØP"¬Ãç%W—ïØÒKD¦_¼)Þâ|S/8@YÇ|ªû»1"§RÉ©;äWß ÆËéõÉŸÖV˜ÿzä¦Öw«A5ò3¢š‰%ßñukýò´Ò“ä&:¡¬³àÒzÿ6NÇåó<½h º nQ{S¼’O[Š ù?l¬G×ÊÖ¬Å"ì\!­dŸ7˜ÑK¶ë~“„xÑh]¥e;xŸþ #¿-X¶p±tÊ/ÑN¯¤²6pü$™Ð¦'eWÈÕÉÎ5«£-,½kKšçâ+âàNàîâÎà‚åÞlàqƒÞ5.Þ%ÞâòÝâíÍãAÎâ"þâ~âç}ßN.àBàîä^åõ…à®áô­P9¾á:®Þå@ŽàGîßö­Päá6.â ÎÞ%.æENæožâ^ß^ç`náóÍâžævîÞ6î?ØR_!^¥iÞå…åÕñÞ‡îãX¾è‘þèŽ~ãøíãŽèòÍã#`è—.\aáGŽå\ñÝœŽH]~å].êñÕé“~ê¯^¦îçž¾èèèã½ß¦êûÍêq³¶½^ëj>å²Þéšë—é”N䦞ì®~þãåëŽnì¿NéŽêx¾éÂÎ<¾¶ª>ã²þêÔîà»îìñá®#fþé§>íl£-Në”Þ뺉ížîéÌáÒžä EêÀ.ï¶~é­®éeíïêÿÎçíŽÁ~èù-íîë¾íx^åæŽêÇŽå/ ¤>ã Ïð¥^ðñîìµ^áˆÞÝ ïïá®P3îä åîý£î¸ù?ááe>âÿÍ㤾ên_ýCê+¢óç^ÞÙ¾ñ ¾íéÝñæ.ä|ÍfNô>åEïåÝôîëV_åÜó@ê•ôþóR¯Þ_óŒ~õLìE/é~Þ·æ¾å÷i¯õéMê\þÁZ?åqžä=/Þýnæé^Þ]¿÷çÝïb?âf¯Þ,ÏóæÍl_á0NóåÍö+.åvoé8Îí¹®è=äO^õJÿã>÷d>õQú?ëƒoôZŸôGïù=Î÷‚/ñožór_ô!þåoï÷aß÷]ßùÞôs®ôOøÿëbþç¼íj/ú@~ä8_Þ€…\@\ØÏÛŸýׯýÖ¿ýáÏýßÿýYàýà_þäŸýáŸýë?þì?þîýëßýðOþö_ÿõÿþíÿþß?ÿè\¸d!!p`Á fÈ0¡C„\81"„è(:ÄXQ!B‚?NdÈ0"G“r±LxåÀ”*%Š\Ù‘¦Æ‰9 ^¤É’eÅ‚1c¶Ì©ÑáQ…=OÚDФM.F¡Õ)RèÆ–%™Ò”ù°'Q‰TÁ2Ä™4gÓ¤C#.-ù´cH«43ZôxU N±?»}ëu¨Zºgu†Ô*X.W¬X‘†W+H·[›…ûR`d´lS]<2 СE&]ÚôiÔ©U¯fÝÚõkرeϦ]ÛömܹuïæÝÛ÷oàÁ…'^Üxê€;PKcKµWP'P'5Pictures/10000000000004000000032A7EE6CB0B8CEC342C.gifGIF89a*÷S ”x…¥ÌŽ1RŒˆŽ•# J±HËKÈöE•+‰Ð(HUJŠÀÅÈ HÍ3'MDÂ8"%9©Ú,fh©¤™äâÜh†S8e›ªÈíMLN«HKO&Tkc‰ÕŒ®ÉªˆP+ͪqk‡˜iNŽ®íæ‰‹$el§ÑÄ¢\K)WIoÀé“gÑz£´—¥Rj¯edcµÕî?†ºn)rC JcƒùÇwO@h•¦³vè„Ï.p¨í&5À½Änkt'0ÌÍÌVVXçÉÃì÷§¼Ð¥ƒm&)jÅO˜˜˜bH"El̸¸¸ ˆî—hitŠªkz788g˜Îü¡>F6Jo,*„H¯wvyv•°oàúšíKåçí’6/8KÕÜïn4v›ºïÏÆ¶!WZ娩mºîSTz6…ÀËí0OL9S-4¹˜r´¥wòÈhü’tÆèFEDª©§’®Øøùø`[pXx¯)()¢mØØ×gZ^+­c))æHHaÖL >Óþe¬ |¨Püþ†yˆqéPä46ôg|â<¯æsœI/,„|”î5“üT‹&4»/¾å¬„5|ù¯Û§DB+h®–TlI ;Ïij›*/i1Y”ɉ7MJ—N dÈsá~„`hC‰¦rûã|ƒ‡{Òs,†¡î'XôÐ¥ZPY©Ñ«hÝP?gôj¨(vÃp·ûÉšUÓõ®”’r—”Åó–GwÞ™šÒZ\Ê•%6‰¦Ø”¨-\š7—Ѱ´“àõʨXV`ŸxToY´Úg6 p—ï,6i™ô–|oè٪λ¶V96/x·Öwy85¬{16uv¾ÕÔ YÎÕ»‹!zÑbvPpW% Y±™¸v›Y5WZŒ¨Öwx¼°iX)gqÒ çs~‰§y.ÉçŸzöYg €úI衆&:¨¢{"ºè£2*h¤Nji¡•bJ馗:Ê©¦J ꨞ†ši©¤ŠŠêªª¶zª«Ÿ²ÿúꬱÂjj­´Z¨¡mºèEŒS°æ+~iì±1 {ì²Ë¶Ùë’U9yÖ*Ü´IŽÌ:©í²¾êÈf˜š°8‰‰m~Yîˆç2klºM¢›cºÉ~/²áª{ì³½nm»ûæËï]ÿê °¿û(ðÁ'\p¿+ÜðÂ?,1ÃG\1Âc<±Åk|±Ãg rÇ#{L²È(olòÊ%·œrÈ*»óË'Ïl3Ì8ל3Ë4ó|³Î@û¼³ÌC÷LtÐG tÊï[•PG µ3š0‘MÔ«˜¡ Rwµ%[{- b‹AÙhCM dO ÙiÇ-7Ø'@ýÛ][“6iŸÿ-·ØTs=uØf­IÝ'®øâŒ7îøãG.ùä”Wnùå˜g®ùæœwîùç ‡.ú褗.÷eSN(\ˆÁÇá„MŽ”ÜLŒ”Ê8ã†:R^mÎÖTkÓ»ÚRâ­8É(#Æ µ.Æ?ÅÓ@ŽòÎcS»âλžüóÅ[³ýòX€ÈãÎ=lq;Ê+.~ÔÕG¸î¼pµéøç¯ÿþü÷ïÿÿ  HÀPr^HÝÖ®%lôld€ßÖwø} 4XA ¸@528ÃDb˜ÅuǵUd#Š£FÄ0=1LxnàÚ,²A­åMá„Ô¨ öÇ0(ã}+ aíÿ00½¢yÑ@¡—'DÇ}PJPH(Îï‚4ÀF ÈÅ.zñ‹` £ÇHÆ2𱀍ÜÖ(=8oR’"6X'A®Íxa 6>Åë)ÎÖà=Ä G>ÒŽÞPG/¬ñ‡Aî0‚^à4è±Ç>:ƒuÎÀ‚÷:ªÍàÆ¯f„®¡Ðk¥Ì!×JnÜQpÓ+ågIËZÚò–¸Ì¥.wYËSv­ƒ|˜†"i Ç òsX š´Êvð…d€¦ e´¶Ö9œ°E/G†jŠ!Ø ‡¬1alsq1œ2½ 5/ä0‡ÍTfÔØµO°m¾„š˜¢–ÿNz>sk‘ü^e5úÒ RChAÛ™P†.ô› …èCêP‡RT¢èE7ªÑŽNÔ£ý¨HCJR‰rt¤&iJQªÐ’¶t¥.­(LgúÒšÊÔ¦¥éMwšSœž4¦=åéOuÔ¢Õ§*E*K…šT¦.Õ¨M…êSêT RUªVêU·ªÕ®Nmgqh*ÃUET°ƒ+À ˜Œû­ÒŽxœ"Y¯xŽS&ЮE(5ì784ŒK‡P£Æ Å@ "¬°¢x=¥ó,ñelòuç2ÆÐºÀa ­P{ld¥F«µ” ¥š#ßZ"À^ñjkmDM)¶|Êô¡¬õšks ÛÕÿÚ¶¶¸}­ni»ÛÙú¶µÀ•mpcKÜÛöv¸Æå­r+Üæ7·ËE.t™ûÜã:7¹ÔÅ®t­[Ýè^wºÛõnw³ ÞïrW»æ/zÇ^òž·¼ìM¯{Õ ßõ¢÷”iTh:ÍFÙ_mí²XFÈ`„(±šÞZ:÷™N/`£ÏÅ«°„†î³."¨á®6Ÿ6$7a_¶vþåšû`Úµ¢x\P(Bíº_ ‡ ô[°&Ä;YÞ5£2^éSä"ùÈDFòŒ•ÌP#'ùÉK†r“™ Q'GùÊS–r•©¶²“Íìe›GŸþ&¦¥]ePW›Úªv6©¯="l›ÚÚÝ÷´ÃímnûÜæÃ>Ãnq§ÛÝð.w¼ÙýnyÛ›Þó÷½õï}cÛßäî·ÀùMðÜàxÂÛ p†\á8Ä'îð…×ûá—xÆ)~q‹ç[ãùÇ9>ò›<ä$ÿo8ÊO^ò•»¼å0WyÌ1þr™ß›GÒþRÎw®óž³Ô@GxÐíEtcåüçEÇ÷Бnt¥/ýé<ÿyÔ¡îó»ÆkêX¯zÖ¥®õ®sýëTûÖÃNö±›ÝëeGûÙÅ®ö¶³ýíi‡ûÚãN÷¹ÛÝíuÇûÝå®÷¾óýïyüÞOøÁÞï…Güá¯øÆ3ì «¶1tƒ×ºç<÷´Òåy‡7ûó“½èCOúÑ›¾ô¨?½êSÏúÕ»¾õ°½ìcOûb3)é¸Ï½îwÏô£ÛË÷E>ï‡OüâÿøÈO¾ò—Ïüæ;ÿùоô§Oýê[ÿúØÏ¾ö·Ïýî{ßètê¾ÿð¿Oþò›ÿüèO¿ú×Ïþö»ÿýð¿üçþ;áÀ¿þóÏÿýû¿ÿøxú÷g€ùg€G € x€ØX€¸€XØ€ ˜€H€Ø ø"‚$8‚&X‚(x‚*˜‚,¸‚.Ø‚0ø‚2ƒ48ƒ6Xƒ8xƒ:˜ƒ<¸ƒ>؃@øƒB„D8„FX„Hx„J˜„L-¡ Ê€Q…RX…Tx…S˜…V¸…S(…]¨…P†^h…_8†aè…Q‘†j¸†l؆nø†p‡r¸u x˜‡z¸‡|؇~ø‡€ˆ‚ˆsXˆ†xˆˆ˜ˆŠ¸ˆŒØˆÿ10w8ˆ”X‰–H‰ì€™ˆ‡ŽØ‰žø‰ Š¢8Ф˜_àw¸‰™ÈŠšøŠ­‹°¸‰¯(‹²èŠ­Èº‹·h‹¼¸‡¥ŒÂ8ŒÄXŒ NàKpN€ÆÈ†CtÀA05±z Š«¸‹ÜØÞØd°šøäXŽæxŽÝhZ(A0áÎøu°¡¸ŽÆXϸnXuà þø‰îá#71_ðz@ 9/á Éup0‘Ú˜踑<’ ù‘ YŽ ÁP$%y(É$Y’qŠÎX uE|àDÿ@ñ% Et ’)y$i1𓱒+vHuðw“B‰”a3™RÉZÿ8ÂN”0q ápAMy ‰ “a tD©L óhØÈ“S!—t‰- z`w0”ÁG9Að︩-¡ I )–é é ¡‹¯°‹Ÿù¡™‰@»Ø‘žÙ£™šì°šÞ蚪ɟ¹š AS0CÀÖxZp“@ɶ‰›ºiFéŒ| ™w€ÈI_ÐQy¹}À¡›|`•u›7Ù›)A‘HZðIÿ)–(a”»)}‘iD@•w°W‰Ó¹•ôÙé›w”|ÁS€Ÿј_@–1TÉ“WAÐÅy}`š˜Džê”Öèt•¡z¶ ØÖèn)áy¢1ŽiÉŽ*A –©4Z£5ª“ 1š¡9›­Ù£ ™ ¨3›¹£¬Ù£:šš<ê£<º¤¬y¤Ÿ9’îiJ©¥—á` až"AÔ©Z+Á :zðVªSª°œ* £(Q¥a•µ‰£õ™§DŒršŸ–dê0_0\º}°ñ”uÿùð)Ö %Ú˜Š ¥ñ:ºŠ©‚¦ZjD@[Цj*Šª*¡6«5¨ÑšDê£kp©ðM¯@ˆk¡ ìÀ#ÀŠ^p¯°b€Ÿ™@­I¬Êz4p ‹'P¬³AŸ© O£ KJ¤¯P›V:Ú¨”^@’zPÑž¡¡ ŸÎvȦJ£pºfz®3¦ Š¢AP‡Dé ÉU1@¨™:Z  â °N@¨ö¨€Ÿ”ù¡Ah˜,:nɯþ:Z°z@”JY¡"»zSP錰šªA™‹Ê¡#ÿ›²J† z°›§°°¡®ñ¨(º:Ÿ¼°„ ‘zÚ´71N°béNpža¦Y쪨NÀŽI« Àް¡déWY® é—k1—Sà® ¡+«©žJjZ:r‹B+¶öÈX—Šé±¡¡ΩSP£‹Û¸4:xš¯0›“[¹¯­ÅÊ#w ‹¹êd ¬Âú 4¹3b¬Ê Ê:#“+k ÑJ¯pº^`«w»²{¨k¹¶:¹ì¥Rš’J‰¸ÑÈ¡Á†ŠY¡Se x™ŸWi•]KÈ´hJÃ+C CpŠ)IÊÿ[7ÙN°Ÿ¾…y §ZcJ'¾AÔèoŠ¢Ù¨¥ Æ‹¢3€ z Ýû¾-ëŒpwÀ”q ÷ ㊸ªè_›l;й›Dð¯Y «éÀ Œ”+zPÁWûŸ|ÀÊy• 2©Y ¾-ž†é´4üé”1½‘¨ ¹‰  ™¦AÌ›={0ê3 t “m)Â}½"¼¼Íû¼‡;·ÚkÅq ù{¾k‰¦@+tzÍ@¢‡É¿H©3 …ûš֋S`™‹û¸Ê;SÇa¹|Ü»w ¬~<¹§+•+¬°¹“Kˆ4ÿð 3rÆêÀÇ„h“›»§«¬UÁ­¸ »|l¹µ E”ú›¿™·'Iž1˜à—Zº›ª¥QëKê[Äw@Ê¢<€‹ž_p£Z‰ê›€ÄѰ}@U!¶ÈI¸*i˜¹WÛ ZÙ**ÆL›¨Y’KðyÌbŒ£ðÃÝ|¨ ¡ÿ èzH ·©“®|zÀÔ©˜ÊPt’Μ¸HÛ'úÌ5Ð-1K rë,7üÛà y¯ áÐ=,ÂöØÿú`ʲN@³K\ËV¼’«œÅ`+ÏhYFy¡zù(½·Áz` SL[¡ÓÿlÄNÀÑÍV«½_ Ì&QÇÊ«¼å0U ÍÑÉ•{ºwP¹!Èw°ÈÁ#¹j¬L½ÔžûԽ˭“{Èz¤{‘Œ¬•|kÐÕœ<¹ªÀÇ#iÂø©”+©¾t0séÓ1Æ Ÿp)“ ËQ^ð QkæËÙ¹_ ™ý²^𦼰ŒgA—WI™ ãÛ äñ}zPÒðÒ¡¥$üÆâ-æÁÍàçc‘¢ Jë\ÊaÎWQMü¿ÌÞìÅ9ÊÇ/þ­ˆ ¤$Þ«Aª’3‰‡,/¤UÁÈa•Ö§ÉÔþâO³Ôi]-ãhíâï®âp¢WáÎàÜ©`.ý›¥ñ-“B~ªcZä ×léÁoÌ´•TÙ©Â,´ŸÞ¨ËÁ!-نٷ¿åh«ÇÕá±ßúÏÚn Çá|åYêïÎjð¡·Þò&ÿÏæÁÀÐP‘t‰#±ïUy•2mB+´‡É\Ñm!ð!²®aæA‚±ô)!ð†!êÑRôbA¦[;ú"bQ°PYµŠíÍR"@Lën‰ïñ ý^·Ï1€Åwf|~›w/˜Ð Šª8ÿÃQêàÝ=L×M`‚|@éÉ #;²Að¿¹í'ÓñàžÿùÇÕš ïqºùLí'ðà~¼ªà«©ßúg¡ Îní4àùJ}8ÀâŸßûîå*‰ÂqÀUÎ^ ¼!›b¼'|Â#Ø;¢K~ª}?!e°U¡÷ÍPÿЗ\î•rÝì–ô¬,гTëŒêZ®Z‘Ï2¹›Åo^ÑòèÀUá±UêòÈà<ÿáE\;|ñrgÆ”;^¦ÐÁ°ä Ã;84¼sÀ’;§ÔɨÀ…‚e2nÄXç™ ø`L˜#Ì™1;”é…ÈE/;,ñ‚HÃ2$ô-£MšKk6ä@¦ }^j²âÅ;D¾€¼ðÅÓœ>µYV¦Y§iϲ…ëV-M¹mÏ®…ko^¾zïÒõûð^´3 —õ[·°[Àoß"V<qÞºk'3røN:ûBAÏèÑ¢õP4kyqÏ/3žú™Z6ÿá¥Ð6&$@KÌÓC‡dö€È zdf›ƒ—/»½Äôò ›žeäÀÉ3'@ž7|Þü{ͨÉïÐ!hðKÆ…”ÍûØg†>eZÇf¬z0øÁi¿{9¥ ´ °@g âÿ`R¥A|EŒ;ÖÀ!#S1â$£ªªðvL‡3zÅÁ 2:a;hp0#T†­¤Q•¿ã@)è4â(¸ù˜Â¨ŸvüÈéØÐ('¼X¨).8î(¿ 'þм:'¾8H¸˜€’£:¸¤£Étç¹ç†ò !tâ ¦/ÔQ¼:±¼s³ãþ 7©¼à€•šB¹*ÿ"BÍ;]*‚¼Ø®¡t: <“ˆ?êS¡/ÊxN$DŸëÀƒ¾h&KUol(ÐøÓ¼C¿à‰¹?[¢Ó?Vÿ;›<2tCžˆHS§)¦àòU#¡kÏ+íd¦eUôY^½–Y;¡¥VZj¿¶Hm¤ ÏÊÂÍVÜ,++×Zk§…v[l¥•wÚjÉmÖ\>.pçÍ †p§Ž%Ç%&:HCx4_ïÍ0Öƒ?u™V$à¨Ð6‡ôB£ô¨#Êh¹ÜP‹†œH“ â9ã’\ù’jK:þƒGÕ‹…ºeX®½Xº¯|'¦\¥%b-NÑ¢™¨ÿìci/jÄZ•Å ñ’¼#k±Ç&›l«­æÖ àÎVÚ[5ù—Z¸Ùþ–'æV¼Ÿ››åÀõ›nÁ§Û_ ïûpµ­Þ[ñÁ w;íEÛF[ôÈŸÏñË—>¨ç‚þ¹:Ô"å ¢%‰žk±Éðb ïxñÁ¯Á.»{ïÅÆx1‚ƒòÏ'?}óÕG}÷Û‡Ÿ}ùߟ?~ú×—¿xá/W:xÿõÞèô÷»âýÍ€û `éÆ?5A T ø@æm€œ 1¸Aÿ0ƒÄ{`Eø?r!àè@‚P€dÛÿ`(A–\.\` ¨A²…;Ü¡ HÂöpƒ6¼  G˜@чA„"ù' p¡Eà ¦P‰|!#H--†€ c-B'žqŒKS!Ëx9ê¼±ˆ _ø‚b¾<æQ ~Ô£80'œŒDxÃ÷G>Ž' 6=í¥Ì(aû^&¿ÇÈ>vÒ“Ÿe(E9JR–Ò”ŸdäI¹GUž²•£ää+O9Ë=rr–·¥,§HE겕µü¤,S¹H=âÒ“œ&/ÃG bîÒ–ž¦1ûMSRÿs•Å”¦.a‰MY²²™|æ3]yLlŠS”Ã4'6K™Ìt~Ó”Éìc,›©M=îO”ÞŒ')Ù©Î|N•þ'@ûÉOw S €Ì£AJÎ…´¡¥Te:áÉGzºÓ“|ÀhF5ŠQ1lt£hˆÞüRzT“5Ú^Ê0yR–b­¤/…iLe:SšÖÔ¦7ÅiGù SЦ<êO9:ÔÖ”§2ÕiR‰ªÔ¢µ©O=êL£ŠTš2U£SjS™ºUœîÔ§/ÅjIƒúT†µ«W]ªSÅšQ³žUªT%k\¡zÓ¶²5­rݨUíºW¼îU¯w=ªYëºV­Þµ¯q+]ݺXÆ6Ö±ÿnmë_aêÓ¯ú £_­ìcqÚÒ©”-œmƒ4;ZÒºÕ¥EmjU»ZÖ¶Öµ¯…mle;[ÚÖÖ¶·Åmnu[Ò!Ìô´ý­E„;\áÒ¸ÇEnr+æ6׹υ.s¿6ÝèV׺×Å®s£²]ãv—»ßõnxÁ;^ñ–—¼ç5ozÑ»]‹·½ÞU.{ã‹\÷Î×¾÷Åo~õ»_þö׿ÿp€<`ØÀFp‚¼`7ØÁ†p„‰+áRx¾t°ðp -¡¡Kô߇¹ÉOäôÅÄp©Š†N¼b·ØÅ/†qŒeð| Åpƒ¸^iq{úÜã®ôœßP¼×'5ÆOmqŠCì®õ«ç=r’—ÆN‚Æ+^jŽgœå«^ùÊUžë–£zæ.WuÍknmŒï\å>9΃nó”óZ穾ùБ.ôžo¼èO/ºÆgÞñ¡ÿÜéOúË_^¬ =ê.§zÌ©Þò+½ì^×úÒ¡~v³+èjïzÚ“Þô«×}긖ºÛ}ö¤ýèq‡zÛÓ.x´[}ðG¼á óÃ+>èçú¯óg0<á—7ænÍ»ç§| 0 h uÂß=Ñ7‚Óh¬³z›Üö·Ç=¼'¾ÿú°>ë‚7¼êµNöÏûþëbÿMä‰?v™_øqÏ:Ýÿýª¾øˆBäoóÞw=ì¿—¾©µ¿}¿ŸúÙ7>ªËÀ|°ãíØG¾ûÏoõ»?ÿæá?zøÏÿõõÇ]ùÎo¿ïk¾µs»åk¾ß›¿ø›>ác;‚sÀhË¿ö3¾Í£@Ìã<Í»@Ï£:®ó¸g0€?€b€( †iø$àæë@$à„FÐ$Ø]p=èŽ2¨½ÜÃÁÔÁ›¸õã½”=ü?<À¨ BB „<Âò;$$B$Â'tÂ#´Â$œÂ"4@cB'ôB4B,l¦[=%,?°‹B*„Âÿ¢Ã%ôÂ5¤B˜kC-”¹°ëŒ2œ<,¬Â7ÔÃ8\>öƒ<¿#Â9DBBC%üÁ4L>A´ÂJÄCJC5¼BGlD@|Ã,äÄPÜÄQìÄRES$ÅSTÅTdETlÄ04Dï˾ËÓÌ«E[ì¼Ëã=Þs(†ièèNøx†]\? 00T å h0…î¸Á ŸäÆnŒµ‰‚õ[FqäÂ]4ÇsDÇtTÇuTÆ%tGrtGv\=¤Çr”Ç{ŒG|ôA|ä½}LGr„Gt4 ‚S‚%0¹€ 8…Õ[€€S¸Ã2Ђÿ;„-èG~dGÔÈsÜG‰ DÄC{TG޼G“ìÈ”TÉ•,I–ôÈ—ŒG”$ÉytÉzÌÇ™ÄÉ›”GޔəìI—Ê Ê¡lǔԼZ¼E7HÊ£ÔE“¬ƒ?à„DØi8ƒ3Ø„}àcœHÞ«ƒHTø„V(sø‡O@…ƒ hµ:h—€µðƹ´=‚» GH½Ô+Ê}´Éw,G€¤IüË|LräKsLLxüËŸÌ›äÉ¢\ÂÄ LšÌÇ´L¿œÇ½tG¾,Ï\=ÊüÌ|t=ø§é X‚Sà"÷2-Г%€=èƒõ3ÝüÈ4ÌÿŒœÌÊ Èxä .\LŸ„€ èAÊ$>°†áä Â$I ƒ)p³`“;P³€€ 9ÍŒhà.¯ˆ –½½å Žh1™]ÒfRkeÒ¦YžYŽašµaÆÆ–_þ½ážá¦aža!&b* b#b$Þß%Vb¦afbîáÞ߃ (ÆK±]aGå€)ÐËýƒüw؈ùÌÿ¨ƒ!ˆ *ÚµÕ³å€!Í*¾KîXa¿…ÞQ]¿Ø ƒ¸K³†ÞþÝßæÇ…H¹ý=[bîpyXØdn_÷]f u♆}¸X]Ø„jŽAÝ+xf'Ëuà{ç{àuø„Nà X«Ô>`‹”]6Qg=™‚†”³@®àŠ”åb+$vvçŒ:˜¢ %a“[m˜f°£[aèmv臆èÿˆ–è‰¶å‰¶è‹ÆèŒÖè¾hPÒŠîÅØb øDbáQ] Ø™‚%%]-ø‚%5®*Ò(1€ ÐbN¦['¦çq‚ €:@H=XÒÓPK#nc'‚V]Ò Ð\L¦“æèª¶ê«Æê¬Öê;Þê®öê¯ë°ë±ëgXXMð€LHM¸³nØfÖ‡&† fi…\@…$ÑmÎYøfSlpàYÈ¢Ž5øäèŠh’Œ¶ vÓŽ;è®èƒ£`‹ÆÎˆÇ¾ƒ)xç.a‚`KS^RÕ&ëÖví׆í‡n\í0^áœjÿBi-@¤›A%•ÍшévM iÒ˜Ú^a×<)€†gÕ%Íå^á !%]j'nŽ™­T=PN³uŽíò6ïóFïôVïõfoØ>k<0€6Xæ`f¶v_'VÒQè€MÈ…ªÄëQ†8üv‚7ì{ì7…þ$@ìXƒ ˜Ž;0Í  ¶hÍÍX{ΈӀ‹ ?Í™»í–uY>í¾X‚à Ψ¢öÞhÖ¦q¬VR7oZYá9…¦ ™-Û&yã%m=(p˜c'h’v†nŽŸ8à(ºgNÌEvâKj¨Î¸‰àm`n¦€ÿ Xᛣ6[DÒñ±–Ù6¿h8‡sõ¶ñ97p‰¶ó'ë<×ó>Ïê7¿h7øMhµ^æö¥oû>k¥ìq'&†Mðïª|†3Àëj^ígVXð[Xð{hà ˜5æPg= ƒgË 7‹ ×™ŒK — ¶@uU—‰!@’CHñ’Ó‚P§ÑŠKí:€ñߟñÏtdgveGveoèhOöiö%=v@¯ölÏvlwön_voßöe?vjgöG×vpÇöf7wu_m‘0sÎs ‰ž5?Û^R£˜&)nªP iîÖ¸n=Xhggaƒ?£†÷>ˆvÚÖƒÿ ˜/0ó* ƒ‡_R˜²=n5gwtÿö÷ƒ'y‘g÷rw‘oèpWá”'÷•—ö–_ö’wù‘÷™Oyi?wvwoWöžGv ÏysWR Ït@‡ö£¯ö¤Oúioz‡yjú©Wú§—ú¥Çz§Wz­'w”_we_fyXæ4È{úvëùŽk¿v†Þ„ÿ~†¸¯ô\†˜Ÿñ lìu j–µ ®ˆg V7‹0†KïŠ3 ¯01˜Þu’óu_ŠKUñdv»¿v­·ûÏ÷|–ÇzÐzÏýÓ}Ô‡úÑO}ÖWýÖ˜cذƒP*¢Šÿ€©"GUÒJÕx'¨ÜwàG’(oi¢ˆŸq ª?öÎwh—ˆÉÝ’ƒhé* †ß’wÏŽ/ x'€ñÁå|cGÿØOò_ÿÎoûi‡þÖiŸÿÐg}ø7ýg}†Žù÷?þ'uh° ƒ;2DØð D†#"\8Q¢Œ7jìÈñ£Ç GŠ,¹ñdB7ò4iº!ïF›:‡n°¬YÓ M7š6©#-×™gÏÎäBbð¨‹NH¼YWäž©8ÿf]¨SÕÀ¬Z·rí:¤Ž—;ChKÃYëàÚÀ­}8d…`†/NÒžM›u Úq»ÿ.lø0âÄŠkÕDËÆK–ÔqWç2æƒ%•*%9)DÐ-FìœÔ$j”(Iü,PôëØ—eÞ}ÈrÏvÂ{ q¿Þ={HOÝÄ!ô| æ¿e3TÊœ`îè‡@Âøõ:Ö’wHœ÷öŒ³M{NM}i‰Hٿ׺5õ…úOÞžä~¡©R€îÙ–_lôý‡ BV„ JXß„VÈ…Z¨!†zØ!ˆ¦‰!‡#Nh¢:i²’òxð@/ÙÔ5uTF.ä’c.È¡o´²ÂoôTÙX1Æ•_àdZ5 z„Å“,¡ÿDhU‡“ÐuÇ”U†5Å“S¨µ$›mºù¦VAl¹¤”]`™e;dV‡‚±¶  Õ‰t`h…è`G¬õyÑ¢‡^ä(¤ÅGèC‘†di ’¶–©|“b”¥œ~v”¨¡r8ê¡ð‰Š)««ºÚ*«ì¹ñCM.É£"M5ÎHÓž½:CøØ+±uxÇÝwî,qA’pf…aq…´p¢5mµYeë,·ÝzËfK¸SU±{êyÙ¹åb¦ç¹íòù.»ð¾+¯»êúÚkº~Ú¶î¼ñúK¯¼ò¾/¿Åþ{°½ +¼0à 'üºK<1ÅÛkѹ<1ÆóFŒ°ÂùzŒp½é¦ë±ÿ¹˜ékÁ§ÜòÊŒ²¹úþërÉ™¬q¿[ü3ÐA =´Ã'c¶"һθtKDëÜ븓5û-ÕU[}5ÖŒ"u”áé4Ø`›ì³ÓF‡}6Úi«½¶Úc³ ´Ûm“MqÜoÛ}7Þyß­K|纒M¹j’FŒ;©]ÕËNvJÖ;þ8äàNvÁäê}9æ™k¾9ç{þ9è¡‹>:éåò 8Ò¹º´4?c¼D±s»ì´Ûûí³×;ï²s ŽìtÐ9ñÅßøtÄNð¿ãþüó¼K¯{íÕ÷>}—³c½öÝOO}î´û~½î䛿½÷׫_~ùâgÿþîé{Ï>ÿøÐ‡o?þõëÿþùóÏ?õâ¿ñù¯€ý;àÿ ˜@æ/€æcß÷è@º}Ùó]÷HAùÁï‚l¸¾è‰ƒ” 3è>¾Ï‚Œàø¾÷ÁBo‚5¤¡ sˆÃVï†=ÔáyèÃ!‘ˆB´^ Å¡¬p¨SÚ hr P«Š^°"¯¨Å,V‘Š^Ĭ!”á+Ç;#ÓÈ&'”QXbä÷xE*ÎÑ‹rÄbíøÅ=ò‘Ž}¬#ïxÇ<öñ…<¤‰G=nQ‘Œ $$ÉIJ²’”¼ä ÙHKr“žì$(?IHG†2“{lä!3‰JGòuÿ\å&Y¹ÈYÊÒ€Ô$+o©KBJ2ޏ,¥()Ì`s˜Æ,¦/çÈD› Î‰º²É¶–¼` 2j¼&6³ *Þ!šÙü&8Ã)Îq’³œæ<':Ó©Nq*bI3i$¸I-s„c-©(†=o £°¸S‡u´ djãþÉÇ~z‘¡þÌ'DÁÈJ|Jô¡ õ"EkéÐ|f´bÀ'C?Q}b`Ÿ&-)JOªÒ”²t¥.m)L_*Ó˜¢£ÝhEkjSšÎ´§<ý©Oƒ Ó/vT–8-ª#CzHœ–©-dQªH>0•©… ©TEjÕ‘ö‘ªþ´ê>½ Æ~е¬d=ëÿWÓ:Vµš•­h]+\Û׷ʵ®t½«[ó:W½êô‹lÁ@Mh…4gÖŠ%ó I‰ºÓ­vŸb¬G@˰ƒRöœuØÅXQDz’¬\…èV)Õ|^‘¢¡]ègS«ÚÕ²Ö£m-lc«ÈÓ>õ¢e,Gi;R‘¦¤£E$oe \zÁ´üíiƒ+Üå2·¹Îµ) /ÐÎ/6u†§a[‚–ˆâô¨p¨°Ê œÊ’—œlÌlB9;Õ­zvUî»»Sò³¯«uì-ŪVûæS¹¦í¨nŸ+à¤×µ>pR× Uî*¶ïÍj}Qý¾Õ¹Žµêo¬á sX–ý«Šÿ»ºÂ®ä°w0ðg+Æ€2§¼.çeÛèŒ7Ú¶¡¿}oãšØœ&rÇK¥¯b»*ZÔ:2ÃWí0’“¬ä%Û”¶ ¥(id>Â1À?nNy _æN™«]f2˜Ã[麓°/iâ3å©Ýn.7Œ` ÖË0мйÎÔ´3µð|gAî¹Ï~Ösó|gAû™Ðt6´µxh@ÛùωfôŸ éIúŠw¨C@úe" Y¶›¦²Ṙ[æX̦†h—­|j_ôÓ©ujXSke¤–•¨¤îê“<Ú oTÕPí5Qñº×aÛU¯Å&¶°­ìd3ÛØÍFv|©b4'miRô@ yâÿRqpBp)û“]3€: `‹²¼¸Ýj¬BÓ Ç29¾ÿå£3œ»Uz[”Çù´„~í ÇâÎVªêm¬"«" «Ôaá g¸Ãñ‰?¼â·xÄ3Nñ‹s\ãßøg?.òŽoÜã$¹ÉS^ò•WEÂþ.5–‹\SõúzÔ_Þ¨«ë=ÕÏ|¾ç¹bZTÞFyÕF?:Éì†Ó­HuÙ­‰ø!EMl7±ýt‚^¢\ 8ÁàoVÇ4¯Xw“ýŒ(D¦Ý\B¼<Ÿ°8EAˆ¹ç£–wª3ØtˆÂÂör|ÙB¥Á¾ð†?<â¯øÅ3^ñlž¯#ßøÉSÿ¾ò–_üãu»Ql!À†ò‚ŒâÁÆ-z[ëëÃ×FE:ìcQפ™ØÍUL|Hats›_Ì ×¹mÑ0.áž|BÙ“O<|  é%ÀÜ__ȹûÝ¢„`Ä-A§n=¢Ð×ûRmìÞ=Îþ¹_[‹ð> £-Ê7 b}äŽbéý…‰ú'º „€ Ö ÁAhÀ‘ä"ußj=™¬ù–FUY¿éÂ1 ÌÅ„…Ÿìe`˜)™ÊTà8]K¨Ž=Öy0ìÑÖéÅqa”m AF\€ýÕàÕt!”‘,¸Àö‘›"‚ ̃ù}‘>ÿ‚ÒœqÀ<Р_²!ÜvZ ”F½TêRýÙàVTmÑVŠá³l›_=ÞRa‚Ѐ¨Ì¡l@ðßh0|×~aÀŽJ}UUºÜÞ1×JµÚÞTgIa۹׳-›³M"´U¢$Zb$f"%Ê"Ñäàt,Ô-XæÜeff ÿ#C}Ÿff&0C=ÌÃPÖ¤ ã1ªà‰9S‰ÂÒ-ìâgf¦(H•gÎfhŽfiF^`á@V£ûiŵØ9Î^p7ÆpŽ¡›ÄC™c!mÁÊ€ €- À\¥t¥0<ƒ›5dorÕÌhY L”°ÙÖoªV*úc]ÎçÑ)Ý`ée_Ò“_²ÕE¦œ¡…x‘ÛwÁ  :Ac>æ‹ · ä´ÂÛ¹€„ŠfP:#0Þ¤º@lÆfhÆæ-Ül’¦i"¡O®!º&l~¨…Z(‡b(• ahƨ‡‚h0Ö]\šh´}Ž~ÄVzAòèã¼_ êÿŽ>‰ŽBgVèÁ pÅ)|Á—P‰“hPé“nE”jËt)ðVP)LÒJÉp€¬ caQÞš?yÞT……@ØB=Æ¡ 0øF>Þ’Ži(à!9A;)™ $YñÁ |A—~AhpÀÐÁ«¤N™å¦Ö§~ª§†êŽê¨Šj§–*ªžªª’ꪚª ¶Ó;ÁÓßH¤~º©} Cd°à>ñ•V%(äƒ,*h8Ùb>D¨„ºÀ-0k³.ë-L‚Oò!г:ë‡fë‡ å#÷硨µjk¶Jh³B¡TÂ$\+¹j«Pòÿ¦}}ÜWÒg°Û°iÙ§ €,µWÁV@€‘jÅdéVÐÁdq…ÁJ)WÌ@–zÄnŽfE¾b,˜:°Iq&ãQÊÀmÕF-Õf­Õj-Ön­×:™ÕÞê„à~ŠàSöÑzA´pdТ¯òHÆ`Fë’Áðh…¸ß\†t¬±ÆÐm],'ŒVˆÃÝfÅ)0©a dú#D®äF® 0BåZnjšÿ&åNnåfŸçZ!1ÞdQA'N¡èåbßän.æÞ¨æZnêv.öè<(AV$}ÌRÑ)H,Ï:ªŽÎÔ‘Z¤‚PÀ6…!€éhÂj‹¥Vlð¨5aÀôΉ8‘á>éA3`Ô£J*>å«§ÐAÂn…Œ…V¸Côf4¬ú²/W@â2nófô^šßÞÁÈïÄo|ÁvÓôÚ*ÈòmAfq–Un'„'ýÙnš"í3LÁl]hð‘aɈê§s긑!&Ð)fi‘à.@ÃVäíZ TWÆßvÅ)LÐ-hðœ,¤&. ƒÞ+†-‚8؃"388òäÚƒ>ô€ö¹—ö€>Ø$§.çÚdæB¥ÎåÃ<œ&'§®$÷€:µº&3r)GnXî<Ø(ö& „ >j€[ßf„“Þ,Ãðlj#§ýr…cœØ_Ѐ—ÜA—‚ir^¿žB?iÁøróspzA.Aß\Å"ìÿgEïV¤ó:sŇékE2ãíðœÂ˜P³ö6)î&3˜63µ&tN!aÔç5ôçixæ#á.ä²l°Öp€y"*ht ŸÂ¢VÓ˜>Cób€.ƒ›; ±b•âõ(BR‘t5FcÀŒ›GwÝ L*›´ AŒô /Á6­4#RÑÑö˜'J×}Á¥*«Nµ©RµTW5V_µV·êV[5W«ªLÃ*3X(þ%‚«  T´´-ÌŠQ+Æ o…:0nÄÆëï4K,WðAÇÚ4Æ¢…®8èõÜõb$r4¶ØdGvc7ö;¤2ùÿÃd·rdG¶>d²ö1‚>¸¨jŠÖ캀$gòfCvf¿8°SfgvjK2m»€ÌCTI›RêÁFL±°îò,¢ ê@5€pû•ûÑï,b?ï8/:/A°´ÅX Ÿ9ÙªÌëí:q”¾ª•Tú^š—ÔsVA”’¤¬I¤wÅfED/,™ftK÷óNóÐA±ÞÁw7é@iAu;3%tbYƒ:4èù“d]â#&pMýïwÛt2³ô!÷qŸq¡’o CƒxMÁ¸·”ÕiFtÝ0‚=d6£3z¡·vº‚ƒ¢oº£ãn³.ƒÛ4CSQÍ–ïÍJ› L—£ûa@púsW¼ÅVI—‚8Ÿƒþu¯Ûº;8ù‡¹¢öÁÏž)в€ÿãÒÁ47û³ø D»VxA¡žØ­ÓÅ2¸=OÖб®#ð©§µÐÿ€Ѐ»ç;ê‘QwÀ@xŠçD-Š)F?C˜©¯{‘IëÁ¤R‘¥êÂÏë ¬z!A@¯W3s÷: ÒtbEOt÷Ý4˜tZ_ic¯Sß.`à.+ùõAÁ/¼î4Ä'“¿üsÍ´R( ŽÓ-¥CÍÂìü΃'ðüÎÏ‚*ƒ‘·%Iº˜#­ª}ÉXÌ@,\è¯ôD·—d—XSVðA—@é[H,ôTËÒ¿‘Ó+F),Ì8º¢ ú<ú¡_¶Üǽ 3²¥ÃvÔ½"þ!®ú"ãýÜÓ=/\¢ãý ë=>\¾ï˜¼~Q0ÿü8ñEóÇc€;ÄzsÓºVdìœ0a Áx@…¾ŽÓÙê’†7e¾s?KeÌ7Ã^še,î;w=lK¯Eîg}¸Æ=ûïš>ôïp}“’û;›þÙ&ã=ñÈ€¨ÀžÞ¡oð¡Yeíjp4ûÈo¤g¿ºˆ'¹ >AAÈ/÷ÑX€÷Õ´Æ—°_M¾`”Œ[Ž9@ÐÁ0 "}ö!BpÈ!F”8‘bE‹1fÔ¸‘cGu`p£‰$É4&IÞ(©’¥&•^îHœµ§È¿U«jQƒ°GÎÍÿöÌ’Èg Ÿ!eÊ ™òÀ’§úPU»–m[·oá>u2£ž¨‚Ìp2Uë¾Q­f½ ·¡2…`‰Â÷î8QŽÁE~ŒD>„ðA޼ãàæá»Ü!¢b"Ö‰‰5Å|óÀ)aÌY²cÊD‡b~üXsçwJ@çèZâ—%ƒ„Žrí¸›ê”ÈûB@¥Ò㻨ø@Tƒ*>€à)ïÀï©/öªÃ®÷2Oµò¦¨"â(BìPÁŽ#0qÿ§9>P# `¶à7‰ˆÛ1п¨ãÁ øà»g¤Ã : –À '¸` !0HŽ g ðˆ¢ê*š¡È+­Ô£™!¬r‡Ê¢ž!jŠã@zƒfÄãCãâr"-Ѝ™)00€… ª:|ôRÑEmÔÑG3jmºÜ§$KKZÉ¥M[ÒƒÕ ÚãŸOöØã9¨)cZH-UŽ=вŒ(‡‚2€pj>¨ˆ #ªSúâê)=ºzJ›±(Ôƒ:¾k×g¡v*g‡¥Ê‹èÊ€@ÊO¡âÀW¨%,€2†À'±yæ…uÙeW”ˆhW^Ѐ m BH3m"/êÿ&]{ÞQW^v H´ x^W”ßD™G¸áÀ‹è Sþ¾€¹51pL¦ ªÂI£¢cŠ;§“X¨f@/`²ó‹/N‘Öfª>µï†˜mË»i*„êG¨´8™ ‡¥C´¤:úŽè°r¶A§ (ùd³žBY=Ê‹JÏ»Cå‡@Å EI1À LXlÑŽ4ˆÂ k¬"L4ȆŸ÷¸ /ä¬Ï1ƒ˜™N-žÌS:-¾èÒ€™'ÎÒb´€4Hƒ â#¾ÐCŠ'Ÿø +™$ˆˆ™H ÐÇ O 0虌A§¸ „ä`†…¢}J͉/Þøã‘ÿI$’,mI¥“8MIzÛ&HTXW ƒ™jÁ¾û¡ŠÒѨ[›Š–hà ÷aïЃ–‘à”:èâæûñoëç¨E:t—…ô2]Uå[OQÇ_ÚRˆÔjùH >ÔU½êq®s¼Œ(€Cˆn_¤¿.¢. FÐQ¨Á—”0 f„iNG.€À˜HKBù³õ8G+‰ÄpWac´0Pçp+j»¢AZHÔ¨hG8‚¨`;Ô °bò@ 8K¸IT ½+ ¾ð… £_xF5Šqf#˜ØÈÆgülV:ŠcÛÄ+£´‘wÄ ‹ÒE?Ò…ì£!ÿ yHE&’‘ˆtä"ÙÈ6B$†Ð¦˜—)éE¯%Ÿò‚eö°Š= '{ )_µQæFqÆ”R3hõêW}G±f@-"8 ´á/Ù¿ý=%<0é‹VÂí]FE}nÇa”|"ê:d#BQ8ð]¡¾x*ŒÄ«š•”6¹¹~A’b$0á-OrDm2Œç=á2Ï‚$qw°ƒ0!E*¨€ (Z·9‚o:âDÞC!b1ˆN”¢µèEç#åä’š<‰ó¤×’#%{¥A­ ‚RÂáUe$ȬZ‰R'\À|ýS-ïCXƒNÎz]„†€ÿO¡Îg˜ý»ƒÀÒa;OY3í©–g2PGÿÀ 8EMB@‚ÐæW±™‡NdGñ¢LW¥U®ZD£c}(‡W¶˜ˆmd¥dTåšWº"Ñ­ ¨¤ ƒRT¨akÀ·:”ÁŽÃèc!YÉN–²o ‰&Q’)•prS9Hø R9|"'u˜c.ЉZŒvÔà¢ÃG«ZeK5³,à€µ•byAW™X:@-¯ÅÊË‹ ¨$®HO¡ÎІӧD .SeìŒV׈$*QëZkA¨¹M¬žHœÜ•Â,“Þ°ºÓ«„ðÅzÑÊ׋ ͸õõ,|)Hßúÿ÷¾òU¯QdÀ'ÄyØBAX H)E̓ý a ³†Â¶p…1|a g˜Ãöp‡Aüa‡˜Ä#6q‰Q|b§˜Å+vq‹a¼OJaR›}^H]Â’—ŒÕ(*-Sš3„™–j"à"Òˇzˆo¶!ª„8ÄýN9.BŒò®PˆZí‘(ñ’à…)f{ÕiM7Øõ°ÖŒy5kþì›3ì sŠÎn¦s˜½Z%֙ϭ‰É‹W<©|’ÐA4t¡}hE'šÑ‹vt£!ýèE‹ÓΕ³ò$iMgšÓ›öt¦)=?ó9 tB¬ `,8¦mŽv!Ò×ÊΚÿÖµ¶õ­WIÍ®S ©>;gªžf¶Ø2+™Ì@Ô–ÊÍvö~@®c‹/šŒÒ3dç¨lãzŸÏΫ¢˜ím¡vD â”B?¦Ì±±Üv÷»áoyRm^H}­cMŒT#°v§¹X'‹›àÏ_nÕœhÚ‘‚óvøÃ!qˆËvØ —øÅ1žqï벚¼÷f9ÛIY3ÊÜ{|å² žr•GË Æžö7s™Ïœæ5·ùÍq^óJV*³*©±& ç¼ ýüvÔŽ’m«p¯œéM_ËbÂe†çœêU·úÕ±žu­_Ý ºÎä®m tÎ[s%ø–îtµ«½ ÿœL·w¹Ïîu·ûݵQÌFOìœÒqÑGî‘O[Ø€ÀÀמx¦·]ÚoÇûã!yÉOžò÷zß¡‡¡GïSu¸€çAÿyчžô£7ýPŸzÔ/áKPG3Š[‡¬É‡W~ ¤øf7c ¬g½êQ_zá›~øÅ'þñŸ|ä/_ùÍÿ¼ó¡Ï|éGŸúÓ·~õ±}ígŸûÛ÷~÷Áÿ}ñ‡Ÿüã7ùÑ~õ§Ÿýëw?õg¬©¡‹ýÆúfɃ“ýïŸÿû¯i-·â¶Xf˜ÜBL®bl BB@Âö†ª Ö#Ö¨âŠf*€ öÀãøàƒú'·Þ¢ÿ@0EpÿI°MðQ0UpY°]ða0epi°mðq0upy°-‰y@n“BŽèÈmÏþ+¶d‹¶¢e™À¥/è‡*’&.¬Â~¼ eBÄ fojðJ®¦+fOH®Â¨žâúc¡ÂdŒcºš¥€¤ëš©-¢­âàŽ" ƼðK½^ Ù+¾ì0ï¾.7üÍ튭¶Kùûp1ÿÐ!‘qQ+Ñ#-1±)‘?qEQIÑ/ÑAñC±WGÑYQe1iq b$zþÄî£tñþ #ÆÌ™¬ðO>¼%*¨-€ë-´%Üÿ¦ÀYf €ô«Ù–@¹Ø"ˆà)~K*¼&&¤:Ú§<Ž*’ñ- Žª–Œ½`ÍÒîŒÝ‘ÔÞ±áqåÏÌÌâ°©F6â4öÐÌè1ò²’ ² ò Ò 2!r!2"!r"²"%Ò")ò"52#9#=r#?r »ª£nàç4É×rL%öŒ‚Ê +HGê¡9È¥ Ò.>Æñ)ÔG ŠÆ ^†rÉh†*úÀï$†`r\æ;”guÜ(eIDg<œ€\Ƈ ebÚb‘†¸†e€åe@”‹ qr ¥¢å¢®äÑån‘Œ- ‘±"Æl+ï.ÿñ2/õ’ÛêêRJâ£n€O‚‰p"ì#ê(鯦Ìíu¶"ï` ø J|J€$Šq sB L¦PЦ@ ¨cöÒ#3¥„,ž&D*§Ÿ¥Ù‚ˆÀ‡ø€6éÃúf eúà)ïÀd¸Ì1ÍQÚ¤n‚ñ.s/™³9ó9o®5€Çðíï: γM ‚\èpËf«&ã‚ôÏ+pI¹¢Ð/¸†:*¾ ÷¢B~î`µkúà[Êâ, sPBlhtÔ òb˜ôà·Šñ˜¦B<ó.âpÚª§õ b9¡3B%tB)´B#‹£.)ó3zsè.¢®f@ÿ¦à ÔÄCF”œ€r`‡p’íÌç¶nªX83,âGY˜E Ÿ&jî3¡B¿x4Y–¥YÈ"Üv!ðG6ÙB˜p*¤ ¤DBnÒ Í2*¯âb$ê.ññGð$q"r,4LÅtLÉ´#4ÏïrŒþæ/ æ#R´‹ˆâN܉IߎâPn–ú‡ºî Še@‘Æ.(Ä4l*”D*˜Ô~xT.º#~Õ B¤J¤â¹˜æfüs-úG !'€ºxŦ¦´G]Îܪçwör9}r ºPÏx’•Ê´U]õUŸÓ£úŽ%3%‡. Bÿ"":†g ðbWN÷¨É^ªóB¨¥xÉ ÿ#5X£‚>D>}Ô>™•?§Å=mIÕBI£âGŒ‰,2d=¼%}>uC¦@„Œf?,çJgfvžó:"tŽã"=¾`!¼7 `0  º°u²ä]aµ` ö`knðâ/eµVÓydÌB𛬂]¡8 Ûè´m–¬VœÁðÀ.¢4F (r|ª¹¼ ¨¦EXVPj+JÖcZŸr€jHfÀ£Rï‡g§%*Œ*H"óC¦€©ÄFËÕ §`ŽÂÊ ‰K1àv„Mò¶(`M[„Œú!èÀJ †`L¦€]ß4µ€? €R´jömá6n!.C]bCÿ7Ån‰.0=tŸŠ$v$âuö¹äÄqôÌìl6Ãó¶ôT!ºÅ·Îó^'c¸2*Z&c8h'S â€"w¸p¶k(tÖófb( §"tBçe¦‚¹jë¹¢ iᢢñØœ´K´à!¢ÃJHÝx·w}÷w7x…wx‰·xƒWÖxw^—@ ´@B&X b væêDJʧ¶,öÉx½÷{Á7|Åw|É·|Í÷|Ñ7}Õw}Ù·}Ý÷}á7~åw~ÁT0k³6ôyôwMÝ©FÀH”oýµ(F” 66éŽ"d劈ւ(¬%ŸÚ‚§Lˆ˜år©V¢1U1@jEcº¤‚ÿuøI¬†È øÔ´ªP Ä[hæb‚U Â2Eg!0X–FÔB8‡ux‡y¸‡}ø‡ñ‰_PzSMiõV%= ‚I>˜I àlÅExЇJvé`r‰œ´9n—!Â0·Bµ«®>ÉG®%=b.SyÅé:Äà H“2±¤UOH¢ãƒ ¢!,Ð`Ìù9 y ¹ 9ç âYÞæ‘9Æ(B»8Gˆ1ÉnówóWÙ’‚µm–…¤ƒqƒIÒÈ䔎ŠU9j¨‚€98@ŽôLj A9y-“3¬¼èj_j—·‹’à ˜ùJaµ;ÿèx[.@<€€´€(J§(žæ”0à–ùDn ¶®¶T›½™.ã+»mðpQC1oVëïÄ™ %t–flhv¢CX…í(w•ñÙ‚™£™óÀFKb€X…mÐ8"ÐxŒGRÊÍ ÔX#ZHRÖf^"K¤ƒºPA€$P ‚'Yçb…ç› ÖGZƒ«§¤Ã̤U:¥Y¥]:V^ú¤aÚcz¥kº¥gZ¦uÚ¦sš§ó𦺧qz§‡Ú§}Úæ$EµKˆÓS0ùÆØèòV%‚»V=»vƧ“9¶ž•0ŸÁúfÚÎåŽmÛ.ç0ß2˜ýÑ2ìò-k¯›°öÿÚzm¾È­Ö¨‹ÉÒ¨m)’»[’{° [°»°û°»±[¤ñn±%Û±a.'¹Ûâ’sˆ50ö$,{Q¼Èp.¬M;ZÎñ8çR„¡#ë êƒÊ ²i»¶m¢ZÛ¿~ÐRˆXV.€!%1ÝîNOû¸ãcAO®C;ºQê*·±–…Øø¶­ûº±[QÒúË iœVz»nÏy³Ù4 Ì›%1)®´YyRã Ö¾‘[ZÎØ¤nVJz—¹¹!±›Û‘ÂùŽúÛ±<» œ¡d޹¹æü愸£6T0×Tªw¢ˆûc{W¦£÷. >ÿ¸ž–ñ– ÇÇw¼NþÇ#}ÒG­m$TŽ Þµ½¹€Å·¼ 0ÞeœÄØ2¦×•<D2y³ã?;Ðräµý*¼ ´_'å=>J@¾åiý国*8¾æ0ä$Ûµ]BºpTÞæY¾Pp‡ä{ð ¬aÙ0 tÞço^é…Ú¥B[¦~å~Ó™~Y˜”æ¹¾W bÎÕ™Äjð.ÉRÀ›þÔ]oÿÍ{³)j½3|>–€eÆ,€ÀíBü=˜ œÌ ¬LÞŸ0ß¹¥Îù½ß€KžÑ þÑgÑ!žÐq¼Æ-á3?Æ5_|]·×¸È»Û³üi!`æ „*K€Àæ».çuþ*ÀbDƒcoÿõa>†¾^ɃàAV÷©R÷ ö{ŸÁÑ*‚¿õ‰ÿã?½Û—?÷aßæŸË@P°bú‡¿ú¯^çàŽoŸù½ÿû¹¼€Å@ffü©?$ˆ¦ QRxH·y{Ì¡š¼Î¼×=;Üøzo âÔ B‰%Š4©R£L‡:5ºf©Ô©M“-Juê¨K1x­sǫر`Åb‰X€ÚµlÛº} 7.\'§Ôjñ¢†:_î ^,nµPKaˆZ=N¼xI+7²d¶3ðÁ @.|@âÅO>¹À˜Ñr,ᶆ+ÀØ1dÔ¼×ÒÅÀu^ ›ýÂÆ<{mmÑ·s›îÝÛ ¶—‡ï[6íУq—Þ }²ž;S¨·&þÚ³Úäv¹7ÿ>¼ªgFo\ýz¶Ë»;_d§ðñÅ!ŠÿÙ§ÙkcyUÒ‚¦ÖWb ‰<š¤q¡<bx‡vø!†dåDâH^‰YTÇJ´4 ݱDŠ,¥CÕáÒ6äKÑŒ*‰d’JƤeøôSQW)õVY]i%SL­ÔQSFuÕ”WvI%Sb•%–#Š…¬`œq¡…ZÕç&SÜñÀÝ¡][-(u¤EÁtrN6…tÜ©…›eìÙ矲5(n…*𢋯¥)Ùy`ž”úÉ ìÙ Ùxjqšè§rAp*©“ò‰j¡«fꪡˆz*«[#9¡Ç­€Izª¥—²Jè«ÃÿûVeD”aM]2Ë«³¿¶ºé´ÔÂÕèÊæºk¥©®Å°áv:î[œ˜ì¶ºRªÇXj¢äà‚ž9¡…i|á…v¸aÁŽX‡0u\ÐðÃCì0ÅW<ño|ÁK¨ÓÌ’aÕ±w8D`‘Ó*Ÿ\eÈØQ˽8Ò¡i¤È>ÿ\âM;õPVz æ˜Yn¥%\-%&–HEmVU–)ÀýJ(–zœr[¼:Qç£|aðõtêDã}±*€«–C”'¶[~Áê^|a€Úl»ÍgÜsG €ÝxçMY`Nñhƒ½vâ„ÃíÖášÖ}7ãkÿéá5¶>ä7à‚[þö³rÓxçž«õÅ3`ôé^yÛ©¯ªy°Š¿@eôAZØnzî—«Þ{¡¿¯3ô}ûéºó¹ßZÍs¾¸ç_uGpÈãζƒ Šåd0áÊ^U¨a…i$œ0ˆiØÃг/2I ña€”•¥g:cÙˆ²‘ÄMK0€Ç P¤\h¬ Ï†ö$ D‰jXkšÔÈÄÁ£MÍiT Ó¥R%­m MØ‚¡·¿ÓM-§Q]v2ž (†ªÊë¾À=e“›èòÂî°‡mÙ€x!Bo<}¨!qx€‡ª[â (Åÿ¼9A"(шoˆ¬,.1{Úûa»ç¹=ÍàMWL£¹È<7FŽãÚSÙÞtÆ$ªq‹¾j¢ÃȸùhïˆhT"!ÙÅ'‚‘ãBZ¢0R:ôŠš¼Â/±À0cûTH!…ehCó3˜+[™ýÅ„HrŒc0ð£%½ìEÉ‘R‡2 "(¡‘/£‚\ÀFî€I3-Íhæ¤IP Š5:x5Žp›ôRV¦Tª5ML!Tß^&ô ;œ„qH eX—àL-á_yN.jN …B XÌÅ8N­eó@=rÏ|2üd þ¹?ã”ô\‚=€O}2ÿ´Ÿ¢hÞˆ …’$­èE3šG»pô¡ØƒHZЃ’£ùL)`VêѼyá/€BI jQ„Ò”jÙ'N[Ê8/ôa 1 êLQú,£:4§ñ¢À(  œâ§2‚ùÔÉ jág:%×Þ'øÑO•kmåˆL9KœA b An™ËÁÄ  KIb4#´(% $¬¨\Ö³›¹Ã X,LöXiJv²93ƒ‡þäÁ™Âµ©…K(ÄiE Úqjéi¬E WN µ®œµ_,Äž’õNÉÌP-^¨Ëm uvQ ;4™Zx /P²X3eKoð[Dï0ÿq#î»Åµ(×s¸MU²žÝàR·0Å-r· <[%×·wH–t \ÕY·xæÕîre…[‚b¼íît‰ ˜ò×¾žd†P'þºW¼ž/vÏ{_YõW»ì]ð‰êàúò6‹2Žß¦£`ÿŽE}¡¬ƒXCZPšõœb!X[çÇJVL–¡eMŒà˜ Ä–Ã8Q^sò˜‡ÔhÇMÉŒ¢¸w$sÇ€‰E⤻’µfôe¯M:ôDàÀtø8-Ô_èfRžVÚ4_éiAA3U¼©Ú:m›æ<ç:1À‡O²Ø+‰gn㇕d‹^(ÃsŸ(\ø‰‚áÿú Š!¼ˆ»© }èïIš>]”œ](IKÚ¢ŒO¤³x\LÇSÓŠît£-êI»48„6ôªÍiÕyÔôŒ´¬óæ7¢§Ö™Æ5$Ù²kXûšÔŒk”ú`xi[ÃÎØNv¨—ýºÔ­%ÚÅÞ4[Øcí^úuw‘4d¸}kI/è|‚9È^Vì> ¥u`ô†å+ïK€Aˆ q¡‰æªã‚ÜrHIZ –Žð„$Ttøf0;:ÐÁ(ˆÁÒ\[¥ŒËk—s›Ë)5®DMÝ,®óš¼Â €þ: oËpÛEļæ+o9[^~l½Í| –Zl¾œ/Zæn¡ùŸÿ®¡«EßßøˆtèÒõZ=ëããú×÷&ö²G íkšÛã¾-xö$/ïLÛ·‹~ôÖ+/c ]è­6Æûݼc¼~úÔ/| 9` ÅÏcKˆÁgÍÜq2…Vüß8È'Og¬hMÏ'g'ÞÿøËþô¯¿ýïÿüëÿüï¿ÿÿÿ€(€H€h€ˆ€ ¨€ È€ è€Xj‡NÁ×>"?«d0j…o0fw€Rc5gV¸T}%h‚W¦@@§ðp³óeád5èƒYrBJ#ƒ5H¨”NfáT7>ø?„CØ@X„DømH˜„G؃J8tBØ„L(…KH…U˜sWˆ…1…S˜…FÈ…1×E^˜…Z…_†NH†f(†Oˆ†k˜†VȆj؆p±…pè†gX†v(:ëÖ1Ø0o·N«Do c°doù&!ûö|máqK^!C #‡x?v‚™¨‰Jr}`³x‡á–Ä#7HŠ¥(Nâ~Z’ÿŠJ¡ƒ gµ•‡]ˆ†x(‡µ‡´x‹u8†º¸hnx‡¼ø†»‹½8‹Àè‹t8Œ¸(Œ¶¨‡ÃxŒÉhŒsèŒÒÈŒqø…¥ÕHŒÐØ„¾‡gn78|iEŽóƒ|†Hwè|ý}Ò·‰ï*’‚À‚÷§ðùH<²Šý¨Šÿ8ƒWg4hŠ¡¥~{F[#˜¹H ©ÏøÅÈ9‘y )‹¹Œ‰‘ÛH‘ÙŒ ’I’ÖX’i‘c¨Œ(y’¿Ø|Xì³N,$?Æ7oè¸!Æ7cWywë8F NEi”3Ñ$d4CðYé”O •W‚Jb`ÿr°8’&‰•,©•+ŒYÉ• y’_Ù‘b©d)’g™‘WÙ•k ‘)é•`™•.Y–Àh–a —Ä(l§bâèâ—: cƒ|õVwúÖ|X“ ˜–0–à 9±“銘x”— CSMU•é™OzØ~w)—n¹•¤)‘s©‘q™š¦Y—¬¹škÉ•¯)›wI›mÙ’­™›Ó›¥©’¨Ù›º¹ ‚2zùn8ˆ‡hŽ1vˆƒ©!ê1 ^0 “ИÃ` ¾™@ép"G‡™ã™pªñ$e Aç÷™ëÉž¬8[;èÀ©–¸yš±I›·9–ôÉ–ùiŸ¶Iÿ—òiš¾ ›h9 ÊŸª‰ ·ˆŸÁœ’(k§/eÅ—ò¶œ~¹œ„˜pˆx“0 `wà Š ‘Ü™^a™äÉ¢Ô'iŽ¡N-ªp­8"¤·{‹¢{7ŠŒ:Úz<'9ê£ ¤‘¤C:tFÊÊn½ç/‡V„‰ˆÊ™6@ üÀ< ”3¡˜“À˜"Ê%zé“écCiKgЦiª¦kʦmê¦o §q*§s §‚¦vzKtª¦ ‘ƒ'1 }·c8!ž1ap…*‚€Z¨ˆ*žŠ­øŠR¤C:©AZ©>z©˜Š¤¼‘©:Ú©žº©q‘—]£vNJ!Ňÿª89%p™ ¡ŠxNŒHAŽÑc$(£·Z}á¶£ŽZpƒ*¨!hÀšpˆz3|£ª¹·¬“ñ©»÷¬ÐÚ¬’­µW­Ö:­¼Ç¤¼4b"ˆ}i¡ƒÙœi` î`…¹ˆYz$üc"§†«óJxc$÷ ¨ùš¨‹Šp꯸¯Á*¬ÀJ£¨T ‹° «° ˰ ë° ±+±K±k±‹±«±˱ë± ²!+²#K²%k²'ë°£ª/uö/³Eˆ6‰ªóã”p¹Ðª6«`!«"#“Cxô ´ §«vÚ«¬Æª¯þ*Jk¨ÀŠ´IbN,dÿrvæ•pW{€µZ{µ\›µ[ ¶]¶_+¶eK¶gëµi;¶jk¶l‹¶X[ ¸w­¯7·t›­rQ·©—·z{·kÑ­%‘¬MŠœï300+¥0æ™ 8;?ÌGA´t‰A+¹XæT™§å«O;LÛ´ŠJAà³´žû¨³Å~iµX‹º©«º«Ëº­ëº¯ »±ûºq‹­};‹¶ †}»·+·»¼‹»ÞØv¢¹ n7¡òS¸ôæ¯j00ƸËg˜< 'Rh“K½’Uæ£#!°›¨6¡¹7±TÇ7ODGF#z¢ƒjlº€Z°³uº²+¿óK¿õ[¿´+{½›[ú»ÿ¿¸›Œ¶Ë¿ïÀy£¤aQºë3¡rwˆ3«œË»¡Ï»$·îX½LA@ >Òk2œ»¹;°ÝÛÁÁj.`1Z@^ub#i1XÑ '|K8ñ¾¦»¶5ܶ6ü¶7¬Ã9ÌÃnëÃc{øk·þ+¤ºKÄEœ­¼?J/*¡_aªÆk¡0˜‡¸¼ú®w(Ò»¢ìÅ$2´0ºÁü½džNK¬ùºz@Pk£NZ6_Ð"øÆü¯µ˜gÈZµö È,È÷+·G¬’lÈGjĉœ»›ê  "¼ 0ë®y¸—ì¸\cÜ?_L½høz¨!|´5QÿÆ5q S }áÆp|î`Ue¾%ìÊ!ì"ïé/¿ƒÌ˽ÜËBÌzLü:Â<ÌŒLÌŒsÌÈü»Ã‹NT9¼Q<˜xˆs?Ü®<ËQÉ•\‚!Lýžž¬‰VVa¬½IKÊZ|ÆH’Ie­œ2ìó8˜KoÌ«y<ºT›bqº?¼ÃüÜÃ8ìÏ Ð5 Ì|›ÈÉœ7/ =. ÝÐËì KJ¨´JâjÉQz¥×¬É?™U]lPæÂòŒiqÊà<Î5¶z3‹si7a¯÷z¦éì½hüÁþŠÓaÑÎ_ w`½_Neã«R¥ìn\3µðëËKÍÔö[ЦçÿÐÅÕRmÌUmÕ} ¼:ѳ5o†[o—Œ0X¬"xçÛŒÂJ‚±ã| V5D´ÒwÒGBSP;,;®ü7^u2è{äì¹ü ¢KÊ']KÀÊA°'YäÊcˆzÇ0j˃›ë´ËMÙ™­ºOí»ÍÈœÄWmÈS_å ìײøLÍÈgÑ—œ³wГJ²ŽÉU¦IÂ7GQdñ<×$2¦ÆÊ’Ó^0Q'‘OºM•»«D+Øí{p^Ö1Óã?=LãAQ)"žÔÆ3±~ib°¨+Ðý<ÐâMÞÿ\ÞnËÙFÚ8úÙë­z¢}ÄîÍÄ©ÕÛÚv¦*0^mÿÅ®-Ö$œ<ÖA`—¥Nz`#iä2 ÃX¥ãÑÛ8ÁÆuq ‡±Un (^Dàà4q½»ÊðÝx¬pxAA@RÂØ!;sŒáqÇfü¯3ÌB—­Ù5ŽÙéÝ¿ž ßþ+ß=ºãÍ ¼€«—©M“Tlä®­œý½$ñúÍ8AQ$Lu¡N†2LücÒwгüà›kKqÁc.Bå!å5ÊÒ[ÏÍݾ9-ºlîæ.CÛÁ<¤S@‰Aài 1æáÓS€ß{Ë Ÿ@ã6nè¿\È:®èñýã¸Ûã§1ª ÅÅ[¡HŽÉ\A´ZÛGò8³ìê›8U^åÁÿΆ½å>‰w«1Ën§Ò2AÎLÛÜ£Œe3PÇ;“\eótpXá n.AÔYu{Lœ“üLJŽì¾ŒãÜ舼èDüè°ѽ·¤},É~|ªÎiéIŽ¥$h›®"Šå¡2 ‡µoûö8§ž°2“8g cN‡±Û¬é<¯Baê÷ÌBÀ;ãÉ.ðƒ¼ì1íÐqðßìw›ð³7í ÉÅËùÕÛn¥J®$—ëÑ4QC½'x1#êÎ?ôÑï½½ÊÉÒà¸ñ-Þñ1‹M€]Î삸Ü~(‹ó$›è£ÝÞ Ú>o¤Ì­§-¡¨4ÅÛ~¸_KÑ'¯H¢ÿáqS€BÂ|#êp^ò(ÖÁ?2é7ñô·ò6Á¤jÏ4ïïo•<ÿì<ÞókïèmÕÞ]ß‚KÑäV*¥J_K‘›$ùÄCqÜ( 7Æc.±îwWdfÿ¨ãñÛEzùTëÒó4ñ¢’­ø7a앟èùŸú¡/ú£Oú¥oú§ú©¯úøUÀ7µD>‚Æ‹ôóƒ÷iÀ™œé>‹‰†Í!ýDÇÐéNKuÂÊ™xþ$Ìa¯ÇÉb.]ïËí§ú¨²Þ¹6}Óx̨i ë¡Bά¬nïìjOþ‹lþ韭yYgŸ6Äkô•~¸µŸ÷˜>«Ô ÿîÇ” GãþÁ+ w¼ã…àA„ .dØÐáÆbHèeˆ:_ˆÔq ^ J”XP`I“Q:$YÑeD†+!"ÄP“cMœ9oÖÄÀçO A…%ZÔèÑ¢=‘.eÚÔ)P¥O¥N•êU¬F­fåÊukW°UÃŽ½ú•ìY 91ðYRP­Ú:îà܉AS¼yõîMÃ/M(½:ïÄYx¤ C ?Ò‡Èâ‡2!O¦\ÙòÀÆáÒsAÉ %¾¬raÉÐI”HwnN6_c0‹ÖvÐÚ·uçÖm›wo´¿>lqã]‘'wZ³sÍ ¯c¿%ì§<ÿ¼øj×ë¯_¿‚ —61˜ä'§VßÞý{†ež‹LÙÒô}Õ/ ¢Þ’õ}öøûoÀ”ü蹺¨s 9tðA#”pB +´ðB -dN« wëÐì2qDK4ñDSTqE[Ì6 ÚÊé#¸är 1»ÒàŽ¯¾òò®;Á„‘ >ÐSŒH$“TrÉÊ8óL$úô‹IJ™Ì2ëÞ’Í99ÈñòK0ÉI&L2Ë4óL4ÓTsM1Ôãá–ƒÓ)9çlªÎ¡Þ´ó'<÷äÐϰú€·¢Ó2§ lܲ&ì°ãÑGH¿KC¼!ß; ô¬dISN;Ì£šèƤ«4Õ@ÿÑú£l>Ø£Õn<”#»$Œ/Ç$SW/ym3W0}6Xb5¶×b‘=ö×0q%GO?·i•ã Ú=¥­Ö'm· [;ß’ñP›Å .Gý±Gvû¢I(ót^zë]ÌIó(Bi%W×khJÒâ':œðo =ôø‚Ð;‚J øb ƒOý/K-wâÃV6;öøcAÆÖNp§-Ùäk=ЕYö¶)ç0ÉPrÏ5·®»¶ã JÜÙd^kºêdÃ1ݽ¼s\Òù ²RK¡„ ÓTÝëiΓtˆœcº@U5/ôB"-è0‰Ž>¢€ƒ[Gì`Ÿ c¹Tî[Á~xá‹ÿ’øã÷ùå•>yeŸUYð§'™ïh©§Sûí¹ªÐµLt6tÝñqÈ%ÿ™òö ò S <ÚâÎë¯ìs>:[šôÒÓ¶ØÕ•œb §øÂ@p'„Íñ;È hwÞ!ü“ ‚ÂG£s-ÈVÀ£[=(7»ÁÉz"ôSÀÂ0…%\Š £¶,hV7› ã²#)ð#ÿ‡}áx|& -_@pBëpÄ:\ QK`b °„d@Š`¢6´1Žq,ÁXÄb™øÄ/:QŒZ\‚-¼F4ŽÑ‹k£ÕñÅ7†qs¤cÓÈÆ:ÆàK˜OqŠœâ€ücÿ¸Ç'&rXÂÜqÄ":!¡ Éþøç?©eò’ÑÃ)€€LEÐ %EÒ:ú°ÎuåüÄ;¸¼fcaòÕmyË3¡°C.Ü/{‰½À±0)Â<Š/o3èÌå9£áu©ui}Iª¤sø0l^D@$½ùMp†Sœã$g9ÍyNoÖœêDg$ÙIÎ%8A Nÿhd=ÉHw4ƒžŒt$ýÙÏH¡ —Ã&«ô§¯§™j5N£_øÅ|á[eÒÀ–J•Äa?Ñ‚@"ˆ:>@–‚©•™†µ¬“FY+M)K“åR”¾Wºü%1‰bÌäœpz6OoêSµGÎa[â2¸8ueLJ‘óÎäàåÄäïšC¸\¶ÙÍvfU«[åjW½*Î ÈÓ HbYɪÄy&1žêdç;‹„g ‰y–¶¹ÿ½Ê@+¹@ï0ƒ)x´¢­Œ‹Lp¥± 6`šÈ¢2&KŽáR²“­ÛN} •Ë E§}Ë,·:‹Yž‚Ïp‡Æž ¹óá…6PÿÙ×>÷á(…UQ'Ѐ~îsD|Æçv°¸ƒˆºÕíp‰hÜ·&· Ê èqáêܸ·¸ÛŒî6­»ÍÝb—ºÇ•îsµ ×ìZ·ºÞ­înÝé„Sôó¬f=bzËJNë´ R •HFÕWnr¡ý+¦ÀD‡…Ôv¹€îðP̰¢&‰`79 5–%}e-,Yš2§ÃÙ0‡y½Ï~+Äž íZp2.rµ|cÏ\ÌLjšI‚RT¥šM”aÛ´jâêãë–AE„A*и™Çñ]2“·™cêB ®Ïr•©|e+gùÊÏÅòáªe-9ÉV²˜ÁÿÜå#—¡h†š‘øæ#¶‰àä-\©!_CA>I«V ß× ©Àó½ï~ÇVk[¦c#{aˆÛ²ÔÆyµoF,âY¶³·x‰s‚bÿרÖ8ÊÙÎz9”;õ©5¶æCYUPl‚²¶9UC$;Ý&¦°> aa@ ê €IŒb3gúµm‹í¢[ûéÁžºm§Ns¬gûêßÂ?ÙªÎStýˆO®ò´ñœg=§r$›B•€ äö…A3 ØF¿@ ¤_HÃ6úŠØï3j‚b黈'þƒ÷0«/®ê`nüñ@-hF®Ò:Ö†é;y}¸kçËšyA! sÔ§^õØä€œÍ×/ÌÕ–Ð:\„Ñ«ç}ï}ÿ{àõ¯»‹( 㿈fÇ:Ì¥ºnÑ!”¿öc6ñ ™Øÿž¤5y¸â½/2g–ãÁùðÝN=yŸ8|£¥5Æ6¯¥úe‡ðÿaƒ’ôÍD¯éÿ!°†—#8l*¢ü±‚@>°†Qª‚#¸»Ã·!Ø)ø‚:°†>È=>  @$Àü@AAœ*T@ü@I2>è-'€ÁHz†SàƒHÊ&ÚJ½ç;¨k‰ë£>&)Œq",B#ìC=D@? Ä>|>pÁéÿê-ërÁ)#ÀÜÁÉ»Bêk›Þá‰ós¶d¼F¶±+>“Du!t,,xGxŒGyœGz¬G{¼G|ÌG}ÜG~ìGüG€ HH‚,HƒØÉ„/P˜—t‚bä€ùäI­$M}AGÎ4ÍxY͹PM­|Í]Me7»"P#ñ‚ H Vq†—£Ê!¸Ð‚òIÕ¬¦Tb‘ …K¨-ί\ÑùAL" J±ÙpNkQKž¢ÑN½QÊû¸Â!ËöSœš°Ët1ñ¡ÖÊ !‘•‹ _X@_Ì!°„ļƒtˆO„€¡€„Q/ €2ð‚±2_ü+"P;]»T•‘(P>sRA¨µÛÒ5u‹8Q;eS“/h‹Õ»&@e•ÓÿÐÓ·ëJÌ$¸3Œ¶Ëᢚ C¨TK½TLÍTMÝTNíTOýTP UQUR-US=UTMUU]UVmUW}UXUYUZ­UN…ìºÜ¼ÎÃ˼LRޏ?NY;'õÁ;ð_ €)½Q…XH‡‚`LheS‹ SÿèAÍV>ÍVR!‰5V> W®|q¥Ö‚hÚALWlŠÍÅVq%…·)QÔÕØœÍQNZ© C¨ýW€ XX‚-Xƒ=X„MX…]X†mX‡}XˆX‰XŠ­X‹½XŒÍXÝXŽíX%؆‹‘õEÇÊ™ŒœBETì!ñ¤—ÅÿâÊEÑÑÎm…šk•Ùr寜U8pÕÖ›åVƒ©èèáÍ0< D¥Ù™M›צí3£É/}•¥~ýX«½Z¬ÍZ­ÝZ®íZ¯ýZ° [±X‰”5ºØU“`-ú[Ù–]G…[£Ú[ G´¼ËŸpÝY¨í[$郗mŸ¸»Š‚  ˜‚Ÿ°I‚h@ÿø‰»;˜˜Zœ¨Ú±½\ÌÍ\ÍÝ\Îí\Ïý\ÐØi9f¹!í¥úNJðÕâ¡ÉAØ…ÝSˆÝÙ]Û½]ÜE‚Úm†Ü]ÞmÞàå]c ^ÞE‚ßE‚/  ä^ä^èý]ê^c@‚ëÿMÞê=ÞìmÐ^éÅ^ãßâ}^ó=ÞóÞïEÞì5ßômßç=^ïU_ä¥[¢ÍÛÚV¾UÚàÎE£Ã@%@И-ˆ:Ђµ˜Š\IÛ³"xYäÔNœ ˺°ÜÐÝ`î`þ`a¦X‰ƒ­ÈãžAÅÒ¡ja` @)‚~ȃ¾aî–‚‚<ðá!bîá.âÎá®á;hb#Æá"¶á¦;ƒ5€b&^â)®á)î#b0¦b(Öaöâ0c%Fc)6â1>ã1ã&nc4–c2~c*–ã5c$ ˆ›pÆ[Ô˜Dÿ×yµY™=dˆOR; Ý9‰"ˆ/è¨E«=‚€è°(ÉÕ›•ÑàeR.eS>eTNå‡]&P”¡Òu¿uO$eÝ£”Sâ þa c6¾aVã â]΃ vã9–‚¢ ã–â “Ü6cenbb[8c^®ã5Žã"ãjã/fb4¦â6îá%>brFçrVç6Öã1îãÁ¥«ìŒ?.8ýíŸDnQ¯j†/ˆZĈ)‚HàèƒØ¹˼à;°†™>v¤´Ã[ QVeÞhŽîhþh¬­K Æ€tIÙCRŽá¸ÿ atVã&ÖeÖb Ææh.b]Æé׺¨i<Öa 9˜qži6‚“8‚†/ƒ“ô‚<°…'îâa6j(Ææ_b=öé_böê->æîjc¶á( i0Nb2Æáfðã¹0aZNé# ×}=0Ô %Å*‰)hI¶ä;°@0«äÐdèƒöŸµ©D ÈhžlÊ®l˾lÙP„‘³5] ˆ”Öõ‹ÃË•eY×>cfbŽfµŽâ­†â¬Þá"®Ûþj_çqç´6‚ȸƒ-nÈa[‚àk3Îíl>g%†éj†é(¦flvãÖÿöb˜îb8ní3þbb^bxNj\΂De(ˆxZõ–—“̉J,̸(‚6è×9`ð/Sš‚Chƒ`:¬>àßû \~Ål?pOp[Q4”Y[&¶5ÈA9ZvaÓv-fm±þnjÎêbâ`c²c/¶íÄ^fãµÀîqÆá;Ø ~q1€—â-¸ƒ_ÆábFg®þî™Öbbæñ;îêc]Îf2qëq4.f_Îpëš© ÂÓ+w#‰è+ ¬†ék‚l‚ö n (ƒ;¥#€€C€T‚ ðÈ^p9Ÿs:¯s;GXÂáM› »\ÙÑfÝ ÿ·?¸elní®~ãŽ3Vëœ6bEgf¹xò0®&©²†+¢ë®aß–‚¸ƒ(xñÕnâäVmi>æêgÖÖð ®!>ëéVu_þj)põ<€õrfn/^u1¦t)@ƒÐ>Á€Düø3»îÿj$€°ŠÚ;I¦oHà•ˆ‹&²=v‡;˜ÃòvÞÁ`J½spwq÷fåëY’v¿žÉ¡\³‚Õ}a¼d-J¡a`&q\¦êYgr"§í#fr‡`0ôêžm.îê(P/nì€ñv&r&b#ßã{·ã|Ÿx鮸26tŒ'qò >)—Q‰ +‰õFdXÿÌA›‡‰ŽH“d0O\ÁNhÕqy=X%ÞÏÇHd”ˆQPÆÉ&w¢/z£?zÌÍs³%Ù²4iïðNϳÈ!ÖbÛT<íÆåÞjD§ã(Îjí¶c#þwžÖnu–î†u46Ø‚(æ;Çá7â`þð×þú5Öð®÷x×ñhÞu¯gæ½ü{·î_yΖëÒ)d}ößV’ {}ã·“ð‚1—h°dò¬/(,žÆv2í&ÿq‹öGzÖo}×}Ž}Äs×’éˆðë@ ÷¼µ…±xgé¬ßu®vc¯¾ûsþïî™ÞéžÖê<˜çŸ¶dõÿŽëJ¿…â éänô™Žø¶cæÞaa&â7ÿð_õæ Fbô`g »è¹&Nº4%‘;‚p€àE _è¹s‡OÁ†z†Ñ¢p¢1¨s'ãD"z¼L )òŽ 4z1©R¥F•†jÁŒ)s&Íš6oâÌ©s'Ïž> *t(Ñ¢F"Mªt)Ó¦NŸBµ¹’†%wVb º²€«&[šL“ÆC~eÍòóÀo-[¶6Øn½Ã‰”àÓ.øEßÅ\í¿SîØä•c~9æ”k¾yÀ{Î/è¡ç;:éöš~ú¹ÞùV 3+Y¦)¤»ÕöÜÔÁmFˆAÃîïÐËvƒM¥”Ò5~]ó|C·xÜÏ;žxµwW‰Aꪷ»=÷ëzÿ}ºâW>ùâš>¸é«?oûñlÕØdçÚh©}ûZ”ZÚ{ñ"ù:b‘ðþg@º!ç`Ìa˜•¨¸þíY{“ÿÞà¬3AÄa0ƒ;«s½©„}ïÛ–Gؘš° (L!VhBކ1d!ºX‡< \KaeëŽ~бÿàn¹ãW¸‘nQÇ^0ÂŒèDio~`yN·ÔÁ*:0ƒÑ¡`–¨—½i…YÉc öaÆ3¢1j\#ÛèÆ7Â1Žrœ#ëhÇ;â1zÜ#ûèÇ?2‚$! iÈ5À$Ì‘ŸJ\WÄj5Êah©˜Å*I±‹1€ÄÓäF¨Cl ‰ÑуFîpŠ/Lä y#*„V–OD ±§šy‘q޳`y©8çU‡‹;³°0ú ™ÉTæ¾ÿ˜ÙLgŽšÑ”¦¹dȽƒ y |$¶0ÐÃÚ¥Rám`Nݰwê|Ö $r:$r!QˆAJy‡/8a"˜Á,ãEb:‹y½¼b?£ã- T §  À‡è n{;EBµ0ŸÀyPQŠÜ™”ŒIÍrYS}!=ßHIúQž})UéJ†FvÙsT[$&1‹]’ DÿŒ¸Nzft:˜§HyA!K  ˆ0-p`"z€@AiÙG: ‹X"(F9(’XD!A(Ȧυ8æ# Ñ–àVwo e€UzÙK` X¨\ܺ:$U—óVCxÿÌ–v«¤âSì÷ÛXÄz˱ª“ìd![®¤`X‰™«%²Ø`,i©iËI žfÒ§GlH'w(>ða€€Ί8 AH*ÎjÖ!„•! áƒ,«:­*2f`:ôºXA/|#b¥ƒÊ@ª^Å SÐá´Ð‡‘èá»2b®A@UHw"3àg1’ÆE%‡µ¬åèKBûÖ¿'ÔoC(K:ÿþ—¾ñ«Ò_·ÃEá/´æ´.I1Ûÿûéj¹DJàS¸§Bˆ« Ôõm½Bk³ºIÑ+Ýâ@[ì^š¡WAÈ›è0:|w"S8„{µàÔÿpÅ«Ð!@‚^‡D ìÍ¥ñºiK“ÌW¿öÜ”7We+óW…Yná–¹lYbQÃ4Égk÷¨Kâ§æœ”„‹GaN^iA ‚Cà„ “XÆA˜Â<ºa ÁÄ5Cn}–«E+º˜«v5ešË ùK賈ÝùÔ®x†ŽÔJO¾NA¯„“30áŸås |Ðë†êUÄÕÔ¼rù¶LëZgùÖŸë²®ëU¨سf.gƒ'õ`sRbÍ== '(")äD¾ð…BP« µ•eåëNáV¼:Ft¥´ ¡WKfå—Wbò•ôp ˜wº «ˆùúÔëXÿ C8Ä ì©`Å^àÈÌpŒ½\4|«uØ 0K(Ä ñöº_¯míñCv£%Ñ,6&S•H2œJ³ƒ)Ó6o‰!‘Œ,¡K ÃàPHgb¥·¼*žv¥;€ó¸ÜÇRÉ5J^us•ÝY CÝíµ"Ù ÀøŽEâ]‘|a_PèÕ煇׼©s¸BêEG§~…îÎ|­‘•ÆØ!¹”;žk¾÷ýË/µ[¹©<2±,+öšlì¥Vé ™f&qsQûùŒH(àÎC´’!– ,¹òtÉs ÅÌÙæUJÒÕÔ':ö¿ÿ¼@+g€gHÏ{oSà+sœ·èž5Èq7ïzïP‘‹Uá‚õ"Ǭù~÷‰þI7®/ë—ÎïüÅ>ê´X0ϯ³Ý-GËòcæ&‘g¢ýªXðüÚ¨7ññt†îÓÃ}x„ã@[—Ö‡ÖØD UHl—×aZЩ’ñ@ÛˆÝqLܨVâ¼ØB8GAYCðxh zଞ}q_÷ýÝ ¢à÷M…بDJðÁÙÄÉ……Ã0ØùÛ‚)w\Êüñ`BÔÍÝ- Ôë¡Ô±Øà$ÜXYîòíž×á›BH_ÞõÜEÍ@¤%_v4\7™\@ÿEÔÞaFè4• ¼¬a¼´¡Ž }½á2…œÁÈáÉŒ bùãÝ ã-˜úùà –¡ÑÌ¡s¡‹IGEì 8[ñˆÚÉÈvÉÈS-Y‡íHp€ïuýMEpÍÇ޼ݡÄ’‘1Ítø,ÜÄ©aZÖv.B–.>“ ‚ #¹ÙHÉrÉC â΃©™'à`„E!B£Ò¡@)Ò]ÐßAìMŽ•A´AB UcÀ’ NEèÁA<Ð…^é•¥MDÂåß±b1E ò"bù"øÜcKå#ºô£·€ßØì $–ùÛã5# b42¤ÿ"â_CJÇ×)ŽC)ò!4ÏneÇ©eÏ!fGmß>®Ô?VI¦”I¢”à­LMÅ©é¡âÙTãÑdBž“™Dê$ñL#|°žîätt†ÀèmÉå(_F‘Ñ“•Ñ!AeTJåTReUZåUbeVjåVr%%’ÁŒ}¸Žø‘Ñ0Ø[0ÞAÚ¤B>cPºåðÃð'UA’*é’2i“:é“Bi”Jé”R©”¾ˆ2Ó†F–*“–^VÜÿ”ÌfwˆVZ⦠é‹:ãŒÚh›&Ó5ËòL¨–\#‚R …‘uÆ…”TøéŸj  ê j¡ê¡"j¢j\i‡z¨£â㇦ÔF™„K^ç˜íáâ`Œnê˜S‹v§›Šê/›\b¤ÜYÔE¨¢iÉœª/½ä¡Iô©¢Úê­âj®ê*£Î¤Fª¯–¤¤žTl&×cbê™Ý&²qjBÆ(fŽªFÑ0vfõ¬*#>‘BËÕÞt#ôÖD”ÁœãäM·DþµgSÞ_­êj»ºë»Þ*¯¾—Ž‹°ö"—"½˜ýåá……d®å²r§n>ë¨öä¬FdÍ`kÿÜß;R—u@ÄÈØÅÈüX¥D&¶×ë¦J°+¼‚lȆ¬¼¶½Þ¾²Éæ°:Óíg}Œ©J +nn*R‰lÁÆ¥GÊéœnÕöhµ­{ȘÃÞØw9¢BTÄq8¡*ÆÓëáaÀÇŠìÕb­­’¬H¡lÊvm£²,3‘(gÆ ¦†ÍÖì‚5+NælÎ,ÂTKª mqBÔÂv% ‰EÚ¤ÝÁ DÕDpT gº–j7YmÖ"nâêÖšTØfˆBnä¶øIkÌšÄL¬M¢)j±iÛ>«o:þõÓÞè”A¼ÝÁÓ:¢FÐ4!uilÝF~˜hÿw®âânÖ2.ù¨ì~}m¯J®}Öá"éé6AfX4Úª­  é¨³z.o쓽ª¡+ªêÐ 'FHTÙ B  Ž-”¹Jĵƪº¾çíænû‚ìî.Öïoà/ˆcˆå!êaòfîòª-šBoôz&èR­ö íÆ.¬õ*U+홼1­@p€;–nêÚXìîRrº§Ü±¯ûrð®‚-ýÖ°ß/UXêÝtŠ¢ÜYVf²qjŒÂðšRÉ °›ödaáгòß\ÀÿéíDÔôí.Ö©}xÚn31¼Âïc9îÞEqtNñt†Y6ÍÁì/fÂiù/ÿó‚ñ¦p Ó%¡5ß{lîXÍÇÓ*å(LÞ„/¯[ÇÒjã±ϯðŽð¯ö±ßo¥êi¿ÊÊÙÀP ›9½0#‡± kÎ’±&Ђ’çÜb²krööÍÒzbT±ÕA|}^z‰©š«¾ µb0Á­áæq-kíó1ç²ýêòJ L˜Âìè"?r ƒñOrP°¡‰êœ…„;D78ÞAŒ•U¹:FÂÚ•GŸÚò7êsOïö—½ò.ó²/¿[7ñï!/˜‹sÃp¨&³wN/ºUï=Wó>k‡W-8 ô ŠseU14‘³ÿ–´| سw äøµABʳ#Óó1,?k¦‚6kôÍt•ŠôH“tI›ôI£tJ«ôJ³tK»ôKÃtLËôLÓtMÛôMÃ4už0!;ÝÙš“"«© ƒ±1×sFô[N¯ŽjóQo @'´—ýq°ÊoÉN5U³$þÖÁdõVkuW sËåsøìÏ&b{=èà¢çõB-á:f1UuãFµTwöã~¶2Ùa¥Ai—¶3˜vjZµð/P/ra 5Fw®ÿb¿¥!*W@ýO.QÏ îÂÞéœJíÎ >uqo6g÷²š³4Êi«ö ¶iûk¦º6"‡õPuQÏ6m%cW ,s²e‹7…¡nï’0­çc¶%÷Bwér{vr+÷USÅ”Ásß·i£ö±.˜k6vÃpš®ívs·N.söœ#'ÑZèc_öcKoc*Hv$Xø…cx†kø†sx‡{ø‡ƒxˆw8ˆx‰›ø‰£xŠ«øŠ³x‹»xŠ“¸ŠÇø‹ÓxÛøãxŽë¸ŒÑ<÷¯¶;ã `«i€6€Ûs7ä f §"Óo,”+ø„ß@‚{D–gùÿ¼7ïÊ —³‹˜gŸ–çkCgÖäw~«¹j›íDµ‹Â(=uŒrîÍÒ¨’ûàÇ])«ÊîƒkGT”;B@Nù¸*E$Tzuäi7S–›9™[uhK1¼`ú¹t:~yü^5iyiç÷_gBþw‘/«€§©Yëy¹yw7%xdCǶ¾#Y™Õ„¼âSõßÔAÞHŸ^vD^Åš”W³¸^s5ûA¬gUË,·b—Ë·¹9Ì@„¶s{A<5F¸ƒº™ÓP }z¹dû¶7†·;¹;<µ·¹ŸOs—zjó÷O/o»ºvãy¬x%7 P:xÁWèÿ=¥¤U×u_Ày|¦)ÕÕÿDÅ,åàP¬vMaëbpg°ÓYûµc{A¼¢TÊ{Á°Û¢`€8TtÁ¼Ìšü99§³¼ÊÛâ+º|¯ÇüÌíÐóA/„:3¦Vø8të÷ç»"¹¹‘sj’ü æ³ßoÛºìQ6ø­Â=­*7<±÷9wÑQNÄ ’ ßxàÓUÄ?<ñAÉ£3ºd9*éUTÑ*Á“à[œ-zÁÄ]œ@Øâ/ö= · ß{ºAˆ>á[þ;~A$þæ'R$ý8 صðÁ”zt—ö±Æ¹1‹µa«óÚ9ÿ¬g}Uqôp¯5¬–·xŸB£ãÞ>ÄÒÕß’( ±ÄOP€mûYzü‹Ñ­ršD–««¹ÚõÇš^ô‰¡ôu?Åy?˜‡9pWA@ÀIÌúcÀ ˜?@×À¿È?Î?þ½–¿ö·š^Dã!ÐâE  u‚  pÇ—;D bð"‘CÅ;9vôødH‘#Ib!yeJ•M®tù%™3— )3Ä&N9‡Ü™Y玙ilŒ)jt ¥¤jl0uªæÁƒ¦6f.¼SÀ­[¹võúlX±cÉ–5{mZµe½\õÉG¦¸?ßbØÚ6hÿX¼k¹îÕªç@´¡³ÕIÖÄm1|ªU ¯mé,ÑŠw‰–/}ü.``+É| ùqÖ±~éVÅ ¦5>\ ÄsíÛ¹Ó ‚A`ïß0‰³,.°`MƒN à²Ü@™)w¾PÀÀáÎáê×7Âly|xßÅ—÷ž¶íÁ¹:ü˜ü¹æÎ¡K§n»v=›÷ï’¼ÿ)Àt ƒ vÒé¦}’ ¨™<0Ê(±pª§2TƒÃ¦ª +¾D‘ÄM<‘D»€ Aƒ’I¯ËbÌ‹F³Ú"­§/N)ì° žã#1"føÂ²­´è,:PÛê>ô˜Â ïÿèi«)´˜èÊ)vÌ+±»ºòk+ºXDpE™hÀÙ8J“´ °ˆ7á4¥]J®Ž/0lwò¼È€!ús"=î@B ýâ<:íÈÎG ŒT¥3Ùì¨1ðÔ“O?¿TÐ=TÔB©“TRJQõOÕUarš\ÐÁØ0à§B¤ŽšêB§6¬ðÃ;„Q Åb=Ùd¿t«ÅØøP ̯ðšVJ®.莦»C‹ïX,±%fàY#%«Q+%ÁÒ‚ÜÉ´â@¾O7Zò[b½t÷A«f’+Ø™ÎDòŽîhJ‚Ÿsõ£VO*(0'®Ãa bCƒxN2‹1îî%…ÿ.Î㉠Y¤ï€Spšr¬:bXâ‡#ž¸â;. c›ŸCTdIîy¥ŸI¦¹¤u'gtÊ7B™&ÌÃ1|Õ°C§‚ QÙ¬µÞšk°Tô ¶›¶ëÞhÁŒ­½8˜b‰%‚h×°­.0t±;ôð–Û’\’5Šüj:ôŠ´Ç´ê]±l%óE ÎÒ =‚\rjò‚]ˇÀ|èñÐ@ï6‡÷Ñ=ÓjŠ”C]õ‘;7Oè× ü\ ʸ{ /8Ü£‚BhôßK;ýŽÔOY½ø”Ý“ý¸Ø™Éyæ¬I'¥qšue1eµ¨¢˜êUj¦š_|ªèºëôÕÿ_¿Ä¶Æ;ßÄûZMJ´õÂ9ˆƵ¬Û­Âлn‚1\d’ô·®Çp^¹°S¯gáqÒªÓòŸ¢A¢ HLÚ¤A剑LêBø…-zÁ ¼°éH®…x!ÅÆаv7lÔó@ÆCð¤ Ü`›’©÷$†3L¢ÝpH®Öá`CP€{HE×Yñ$U˰G«QPBÝӕԼǡ©eèjöbßÙØF¯|­Ea+Ùl4A°P‹F~©Û»$£…)ðAÐS½ð2$¼ÉK^P$N¡H­ÔÁ.˜d[ 0Âå"WÊNSƒ/°Ìå}® 1ƒÿ‹ÔN\§$×>E¿ñA^påˆ(2    abˆ3/ðe_àÃ0“˜Æ¼"ƒÆÌŽ'—¦dÔ*œ÷àÒ—ÀÈ.{‰Ìbs˜Åì…3›IN•Ürhq¡ ƒ¶4[y Bb4 ÕÆç+`ÑeXnÔç>×è¾ òËV˪–ýHä… pf+ž1è@è@/,¦-Ñ$¹â2Ž´…Q©ÓÃ%µâzAà ©›§‚ziq¯±)ÍY'hb38Ód¨L2…Ê Ä¦Ík©Kwz’[æò%@iGè@SÞ´¦’Cçó–ÊÔžzA ê¢õvF§!e d<#=+¤†4òÿ¬aÍ›¥/T¬aÑ‚ÞØ2'”«+˜ÌàÊ•šEŽ/2šö0ÀÒ§†ä§0í\SeGØÂ¾ôL•ìÿ*þš^;iEAá «óÌÐf9ûÕ´~´"ògYÍ*†Ð¦E z0€NaÀcaµWZZ6Qæ‹”ÔínyÛ[ßþ¸Áîp‰ \\¹ÉUîr™Û\ç>ºÑ]îq™K]é^»ÙÕîv¹ÛÝêNv'SÍž‹$4ƬjöŒS‰§gOÛ^÷zYeã{Ë„S°vµY³/~éU–”öK&‘š€{F`[6Ö±†ž‚Æà+x&s¡U¯W+ò: jÿR ߯ÔK¾`哾!~ïhÕyÛ™ˆÅaùïJ±Ðb¿Æ1–ñŒi\cßÇ9ÖñŽyÜcÿÈAò‰\d#ÉIVò’™Üä«´h ¢ì¬¬Š§åªC]í*ùâÉö¦Ì`%kÑlkV’B«~vDÖ^ÎF<¢õ^nžŸVWæ9øcxF˜ž]Åç>;R€æˆŸWEhMO¼•å+?Ì»Y{jy½çSc˜)ÍF7klu”ýjg¾rV3ºì­_¸¯‚ˆ¡ÅjG¹úÕª¬'%ëY38ªFÚßÙ½]éŠËéýr¥‰½¾1ÃElNóÛ·ì7/[Ólÿ ZC½¬Åíu”¶¦õ€¶í3[{NÖÝþ¸Çk-RH«2<Ýa-— ‘vˆ‹]ïô]~q)¨³%h¬6ošßýž§éŒj™ŒilÞUøÂ™GnØ}Ûá剸x&NqsMÊ”u'ªáI!»Ûñîò=]„>{Ÿ|¬n”Q-êj‹Z ûŽóÀÓâ´yÚ²Zä+$<ÑsŸÿèAúЉ^t£éDO, µ ñ¦‡Ûév º)Láž°hŽDi´ÐËÙ›¯ä“FùØQ„oÙ˜ŽÏ.;³ópœóe˜oŸöœOmfž'ïy×ûÞù¾ô?êWuÅÃCø•@y‹]\õÿÖýq_S(ž‘ü°É^ùÁ±Ìh­Û>"›ke\{y[p¢Ä1Ž`Ç EÕÃ.™¹–>yÛ,×˹J°åÛL|×ýîy¿w¿ðƒ>  ¯S©W…z³R|Ol޼|_Ÿ<>Ånyë£9”&>ëÀiÿic1 ö†ù%»ä:LX^ .ÙÊÝnhñC€ü¨; ÁÉΧԶ ïýþùßÿžÿþÀOøø¢ÁÀkתª×–jÄÈ×D.žDŽò®ÏâØXÎ*XD äŽÓJóÚî^C‚`+â&]¤J¶$((f+Xг­¤£ªÏÚ î¶XäîüOw0é0φÿ¯ ÐÁНŠpê–OÑ\„E:Îu <ò¸g+ ç.û¬®hîOŠËâ¬D^¸Å[–ÀPªä¸„…òbúh c©x¶d ¦CÙä§îôïƒÎ÷ ‡°Œ—©±Šf&2n¬'”fÝŠ‚ÝâIW°Œ) ì¬ÂäªÐU,¾0-~.æN¤ cNµÊà!x$5öBKäÆ^úǽàTCK¼¤`íªÌ‚r/o÷ðÏ„Ðy pm+V«Œ(2Lò4Ë×* øáÃhð£ñÒ* æ¬ûÒÚðEíh86GG Ã[Œ ®¦à ; [´Â(ÿ@ ·âG’‡QÂQíëqu±Ðþð}Áq‡Ñ5¤ y‚ù8Nò*„#Ï(DŽ{pe £1/ð·à¶1=ék„• c[^p¼àƒÂÎñd¦Ã#Óp .¦ôà\ÔŽ+ê°qrÐg’÷ðUü@€1Í VÐ-ÝëçÊÒ(#WœQÒ ’)—å côêmm–àÆåYúG+æ†+d°¤D ·"OäO+Úqà`Ò_h-wÏ&SEû±-ÿ 'sRÁöêh‚2 ÍÌŠò(2Þ’rA,B0…‚0Ó0 1S1“1Ó12S2#ÿ“2'Ó2+3 Såäk‰ !ˆ ÞælÆ[¦@oð‚Ã$Q.ƒHH³JØ*$ICÅÂö\#ÿòE&ÓR7‘n-[í-áò7{*.ËÉ#LV¼(ÇËÌŽ±ã‰$Ñ9m )¯¦)«³¢êb_Ê"Ap;»s 9¢Þ;üh€@¢uv¤ÖÏ3ì‚<Íó ¢ÒJ`‘ÂÐ%ÃÑ.7w“?‡®7c­'k8Sb@y*@)×4nãðÒ’ Bš3:¿.)›ñ/ëÀB/C3TC7”C;ÔC?DCTDG”DKÔDOÔ'V.X4°Ø‚à\´ÂXhô¾ ¡º"5ïBõFÑfŽ©FYÿ'8¨¤,òJEw®?‹Té.8…3I[ª@  ‘oñÚ)ç0à2òü’BùA)aÄ:»ô%çb›& ½2Ò¿òÓVöÓHô?é¤IKB'{‘'çô¯Îîì¸H×Òí&ªLl€Ý<ÀAù!PCnB“RK·”´UQ•QÕ6R#,R'•R+Ù¸ÔKÓ*é2áÎS?TCUTG•TKÕTOUSUUŸ Ãë.dž(ÔJ²Pµ´EèWaEWuŽW%µW ñWíÔW-•Q3XÕQérQ3-S5MQíMgç@•tIÍ)Z¬Z}(AóôUó¥OT:ÃÕ/ŸÓPµ´‡ÿµÄÂF]Ó•]¡l]ݵ]ßU^ãµ]‘5Qa_U*_÷U_û•_ÿÕ_`–唕qX´Y¹æ¿„4ÀœÌab#Vb'–b+Öb/c3Vcƒ¬Ä0` P(•ÐiøÝdÕdÅ•\›ñPÄXíÕe'uåb¶*dv&höeoÖQ[ÍjL¹³Ù8qÎ:h;çÌÆûhQûRmZwêZ+N¬i,[y¨U«Çj r9žÆ5\“ \ÕV;gÇR ŽlNlÑVm¹”lÛVQÃÆhøÀ jSá,Ô¨íæÍÖ¢Ú<ÍhÉÂö†Z§–™¢öÁ––I ·pÍ J““²ŒÑPÿÿe¥Se¥óÂÖm3—Q}"0í8`äs=·s9tG7t5u³SkÖD\Òó:Ïíè»ïo«ÍV2/Û×Z‹ ×8tww/ÊÒUtlúžUPÔ\Õk/weÅ6u§×šf¢ˆdâz«{;W{»—z¿wE1õƒVÓþ³±h…6Î@ v%&Y *A~ç—~ë×~ïóW÷—û×ÿ€X€˜€ Ø€x~yÈww_ÇW’[·qˆBPqePËÕkÁVKC|?„C˜l›&*ߎÙ÷g÷ÖLÕâÚÐ.~×™xО6%*˜Š 3ÿnùÏY<€dqˆ“rƒ/˜ƒùárEX‰—˜‰5¯Ðvó|V}NA ªX áÊnçj/¨ØŠGs}'¨Î\؆éTNM†g˜8ÊIa8†—&@VQ- .X:•WK‹lC!z›Øÿ8„ô3¥øn¥-à¤8[Ò2J¿ Ü¡m¢„"Rç €ôdü†|¹â†RG“ê m–À7êÈ,Œwq؇€¨”! •oøø$ŒV¨ŠÊl¥OƒøŽóøˆ‘XK¡{Ù—ÛVpùê´NÉpÄoâO+#®"ŠØ –ô@µæ.1äʘ([ØÊ,ÞW&VùŒMÙ›¿y%¸ùïÜxq…ÿW&&LA§” Hvƒ‡8—‘¸ŽÕƒâDëÙžïŸóYŸ÷ÙC+¨{¬Œié0(©Ãš5[ê@ ø4NŠÎEñ&o&èåFÄyÍji¸†Šœ{ŽeÂíR9auƒ™×ˆz;˜B!‰é"a™ò)[îóù;q:qi šá_ ·â dÑ/L³+*c~Rk/ uRÇ/f€gnÎWXmņÿˆ’‡` °*9uìK . `Àº6&0¢ƒ«½z­µz0PF¬‰ó”CÚŠnI££;Zxáâ8)K‡r&nˆáÉqÙ¥¡÷êxž]„k q¦Eÿ„{/€*%û(Û²©2•Y‡–kŠú¬åÊ5»R+~`E¸"36LÔ¥+2böX0£®ò-j ÷2:¬wã¶×#8²c8@8¬i•b)NtC·‰7vÛ7€›@[¹éº£[º§›º«Ûº¯»~;¶¤“fŽÍLpYÁ6ž]ú¥õ1œ¸RCDE ¶Y悽«Zz›nçvzá–QÙ+h¢,²â}øÀÎ'´p„:¶+ï@“9¡OÁI DJT›ÍàŠ4â!¼¢ºÓìhaEÖ¶âR¢ÃâMROND¼¦J‡=ÐDM<<ÅA|Näœ7:¯?º¹çÚ¹Óé¯VÝøÿŠ †x¼[z—ËžyY¦«B5n1-+€µQ[v¯t6ŽÀô½åÊßvÊ_#Êï»;—F3Qó©¦yvsÚ;u3°E[HQ´ºl¹®T_€ôǸB¶E £Ùx`"Ï¢`8¢Ï"J(@`.YÏ ÏÆÅ»YÑ]%îúkÜ•0n·{Ax ÕÖ9 .7 68ӏޛC! Û*Gu•œRÕûÔo•eã¨X)Õ¿#5Ö+uÖeCgåˆ{-#˜!„¿ýy"#鳦ÒmÚ¥ÀµÁU “·©ÇtI¡¸ªGí4¼7œ\œ r&Ûoêr2Ço6ÇÛé•ÿ©v¶]Û³]s8'Ñõ:ÆÝ²8!¤‹st­A°§Êä!ˆãy¼ã¦Ô;X|}Õ…UYuvÕÑUòuW öÊ5R¼¬ŒfËÊX¨>Ë3÷ÐS¬>3ö'´‹Ç”þb=Ü|Ó2Œƒ`[J›¹Êp7_ä·6†(¬uÞ—L(yBˆò£=†tȃ8hç?h›D(ö–[Þ ‡á}Û]@G:A䘂gbÓù¡Ó»^Ó5½¼ùxÔIý¼‰\âW6öŠS“üìÛ>â'nã~áåÛÖçÞÕec×!5¿Ï¹‚bÛz}åþmÇœðÅ\FöèDƒ[þ>ÑÿS™iÄ"J3"i‘É/ @Ü/#1zâ9Jô,¼,èöRûª¤ •L•ZÉr`I–V?Q\¦7P?VdŸ•Zÿ•ÖÆ_<÷Ã9ÒiœêX%øqu< êˆù½¼G=±û¥™àíž´ZÖ¶Â&á'îÞÊ•¾³Ÿû›eûêâ ~_À4XD˹¼h @ Þä'z}W/  õÉEM[Fy”£Ôœ+2êv.É¢b/â †ÜxÇ€)Ny!80ÈŒ J¼³ƒÅ:w,Zä£FX*I²¤É“(Sª\É2%––0cÊœiò%Í›8sÚÌɳ'Ë8EúZ(Ñ£:‘ÿ*åit©S“-^BÕÕ!V«RÍx‘+6iŽñ ;öY²lBñ •6M¨P1RŒJ×¢˜ºx£Ö0wc™¼€ó^XRW ÇÀˆ+F|/ŸÆïÕ¸¤ï-˜/h¼À÷#d½}'ŠMº´éÓ¦¿È%èeˆ>¨!–èHD‰A‚Ä(Ù+†Ï-†|Jügñã.‘+/º¼9€¦3…:7>ý8ôêJ¯cÇi—r™«àà Ôük~lÆ¢WëÖ-¿±aÝš…K~àï)_¾ÈÿåÐbÀ{qÅG ¤YüW‚™‚F脜mÆU˜eXÇEùFWy»…(∣}чÿ à‰»-¢S<´[}y•R%8æ¨ãŽ<öèã@)äDiä‘H&©ä’L6éä“8n§’vRöDe•Laé]K„÷Ý_^åUylxÆyd•õÞ1`£Ö›iÅe_Gzœ¢˜ƒáÉ!WÏ|Á q˜žº`‚6öØFŸÆè£€)*©‚À@™W·$gw”×±(ꨦ-qЧ®Hji¦¢j€ª±ZF^§ev·"ue®2íÊkL¾þJ°Yk¥±2qIU˜^nU«G}µß™f¹•ÖZie;ŸœÖi‘thÔÇÏèq_ØYhèá]œZäÿjtÊ ©“Ÿptï)_Lñ×|A1ˆAù†—avZØa'VqÅSLq]z‡t Ó!€^­jòÉ(§<‘¬z…ÅË0Ç,óÌ4×lóÍ8ç¬óÎ<÷ìóÏ@-ôÐDmôÑH'­ôÒL7íôÓ6o´™xTוFÀ§f(iR˵›n±Åí³éá00|ÌK‡Í0àqJ¸zñõ, i4 Àʽð81Ew¹ÄÍ NøI]‹þ—¹æ&¶ù“YTÙ³Ž\ch¬…Ñê´M”©ˆ¬“{ë1”éë¥ÝÎP}¤Ë ²ÿIS°Â3WýYÉ~r„‘+" Â;¯zE䈫\ç×dе®tÃ]åj×»öU®zÝ+9þ:WÂ’#°{5¬`ã*‡‰jty…¬F9z+ÊVV•QéR˜ª·,g] øæ#ZÒ"q=Iìeƒô`q&‹ÓôÿŠíúBN;B?ƒ|Atȩ¢ɽpAù WòÓhAøí76>êj|”Gµ›Éên»yïøàEÌÕl‰ÏEB2’h…]ÿÔʈ•võEàºØþú÷¿°€ÿØÆæÊ²XBp‚#«`)5ØÁ˜íH—\i½Ïfk–l KJWÊ]ªT|æ\‚4m*(:±ŽzÛÈ3ÂɇSôÏœs«¯‰çHã9î´¼•yЇ:Ô;9 R‘t/%csψ°ë6ì*ÉîÀ’ wà€îp ÄO3 É–p›!¬!À”"¿ð/? ïg¹ßÃæuÀ{E,œ;ç7ذ¾ìc¼>WÇÏÓt #L™«„”³?Œåö2ŒÄZÖ’kNmK=•) Œ¦Ši ý3„Åõá —®±¨GM!u~,¼¿qmWgÿO´ªU„ÑÏj¼@k/4ùÀ» @‡/xaZ¸Ã‘½À— ÐÁÖKе}ЇŠÀÆ P¾Ã‚Ý)¸c Cxïëdõ¹àð¿q•ó`çŠX9ÿUÜ„-waé¼nv»™¯îÆ«»Å-ׇžÈ G$š^Ÿˆà®k @Dט‚·„2,Yë™é§Öd“×LWÕ{à øÎüÛo¾ð‡ÏXÇN–îy·Ž¿ŸÃºÒ‡²rCá®R…ž¥rA˜É‚'Öw}·‚ ¥“)p7ð˜„w}„7}Bi”˜™™š©I¹sì˜VgµyP9O@6/´6À)7‚(L‡†„„[ ‘ePÆQ‡[ ak¡‘„4/u°þx_”€|%™œ$y’&˜ƒéœÐc˜Åòoá5¶²‚7™“”)Іד‘†}š9žäI”Ï’cIih‡£YA0ui†%uM›1a01_DgapÖÖ›fIî`Eú¡V½A:‹ ¨œ|Ì9h“x¡vÿÑ©‰šE“›…Ÿ%K‘©“iq“ÛÙr™å¹¢,º*œ)–’ Ù¢,Š6ô•m3r5‹o5¡>*|êÒ‰CJ¤ʼČÜÈŽüÈÜÄ ÅQLÉ/ÀLf+ǘ ™¸»“v-ÇÐpl ¢^‡kCmh|´,"qÈSD´²\ráuöå+ò¯xœÇã™°LÿÙ*+€üÇŬµÝ[ôùDœAT#Áu ŒÁ†kŵ^±ÈÜÍÞüÍ,ÉzÆ|–üœålΚ|]"Ûw%{Ab [|‰Ú¨ia¢˜x*ú?L·‘­œŸ¹¥VÄk†XG[ùqÍG[E[–¬û±ÔÖË4,:ë»cÄ´?g¹Þ‹µ¼7ÈF9m­ñM a?I'?|àÈJÇ„1¸%¾>fÜ Î0Ó1-Î÷&Å¿‚ÉuÎ+„Ó°ëwX!ÏRn0¢¹ ƒFT}’Î*ÃÝ‘ ”+¹¿gÌDw¹3lÈX]ÈÒFmœr–´Dmɶô‚mZy,SGòÒÿ2ÝÖnÍÈ4-wä<×OÜ¿: <…‚=T“Ù9Ï¡µ*‹xqºÛÔ†M*züÂîÔ½"¡i‹Z{ÈVSpf¶‹n¨6ÖË&ð1w` –‚ÌsK‚èÒoÚª}Äq½6íÄâx×ÎÃәŤ"ÕðL»Ü ƒ¶ÔhõzØÀ+O­L«¶Seê‘„¬ÒY;”SÐ w[Âà»%mšQÖe-le§ÜÚ¬l½ÚÞÚ­-‰t]×äÛ²m,\R=_«·­C½¨‚—¢L™¥xÊ…ÜøMd­G|Ôß~ÄG0¼ž­–ŸŠú‘– 1¸ÖL›=ÚWV±Œ3О:\pÿSÝýÝ>Ó°½ºd;ÞþÚØÑÓ|]ÑOš“¡ÕÀ$ Š…÷Ûùýâ(:1a°2Úy†Ì^YÜ9¾ã”´8PzŸE{ó"œ½ÁQŒÉ6½ÌV‰üY¾áRÞÍá Žç]ª"^ÓY>':gˉMêmò,ÏRêh”Y϶”¢÷ ãlN^®Ž5YÑ zÕÊmvEYÙf {qÉVc—kžœ‡0Ú P<Ú¾S¾èà\å(¹årm×’>é+»éȘð|x%êh‰G}.Þæ/>°hÛJ4Ã'SÃä©à‡+l12ÍD&ìàCÖ ÍÌšã쨦åŒÞëHìèÿÍyå«*ìa éͱJë ‹©^‰Z» <Êfîékêmî±çÔŠ:5Lj°jyd¾O™ç$AašlE/ó2ÍÓ[ A¯ŒÖ:Z.ï(ÿÃÀn¡ â-˜þ®eÅ#»×ímn`¢"JÏŸÎðÀ}žpþë-”uô噦ì‹Ú)ÿôC¼òBóÎïcKõÇAG… ç²Ú×[삦LßÚ¢æs«ôÕ.é(ðÿÃüYfߢi ú÷r?÷t_÷v÷xŸ÷z¿÷|ß÷~ÿ÷€ø‚?ø„_ø†ÿ÷ðâJYœDm¢£lâÛ ßö‡pi/&±H(ŽMùä¹Ý¶bõ§ûò0/úèLúÅC¨ì]â¦ÝŽòÜa+®²i^xIÍùlp×I~¢zÜ´Ÿ™'”s.ƒ®ÀüÂ?üÄ_üÆüÈŸüQ3¹âÁÎ7Z¶:Ê_ÿŽ Gx?¯¥I¿û®óæ­”ÕSêm%Ü^þ7޾ ÙíÏ:LßÒ€Ó'ÿú¡Oé.oú“×_ç>Ô^‘óàÆ lR° … † ²9¶ÃD uî\ĘQÿ£'=~‰‘È—Œ_L~™b £–/tè|ÑrG =5!Ü9‰ReHž=}þ#Å%ΆEšé‹Rl:1£—‹TïXõˆUèÕ© µöüºµ+ưcÍjµŠê§N£bÀ@î\ºuíÞÅ›WïÞ¼qùþX0]¿ƒ >\ñbÆz7† ùqdʉ+_^<ófºm—(=Z4Û‰o²¹‘„ÂÓC uì¡Äµ@ËŠÕà‹Å‹zxÑ3ãâŒ)X©já°ñwpÜÍ?×H4ôt¥F™’n[;ô´U¢zÛ,W²áÇ“/F{öõ5s†_÷}|úóé÷Ÿs~ýÿ—ù÷§ì?#p@Á<:ІÀÎ"/&r£ cÒ0ˆ¡ƒÂÐ56ÜÒˆƒ2zëèŽ)îàà&>8ò펾Ѓ­– b"0Ú #˜5ÒbÆ’x»ãF  #²H ¤[0Á¥ÞšˆõÚÃ@<òºûÎ;ô¼ÒˆJñ¨¬òJ/¿ÄÒÊÖ¢ˆ§ÞÂb5×d³M7ß„3N9礳Î8°3O=÷ä³O?ÿ4PA%´PCE4QEMG3)º`A¤Œ:ªAì`ã´LâôÙ8å4 Ù8\)ˆ;œ@¸!è¸#E>à€Á%8ðb V…šÂ‰!°*Å‹0À T?ÒbŠ:긩ÿU ÑHgŸ%k¢%”L²RÙ«è*©Ê3ËæÀû,óÎ#7$ã~ÕîAŠžÌVÝ4 ¬¯±Að„¯ë5ì^|Ów_Àúõ—/€Þk`‚åzŠÏ$UÊRŠÜȵƒ0eh¶ +<æ†PHŨ޵B™TâèŽW1âÀ> )(>Z¦`‰‹jÄ€c –‚>ú' ï°Z¡…T)j“ºn"v9¤è¹s»÷#)?rB «­þv¬N¹Z‹Ÿ}"ƒ¥¡|÷`å¥÷`ƒÍ–íÝ– îÆÖ–ºn+Ò£(‚ïžÓº!Ë5ì”ãš½ÐË/²ä“gÖcÿ ˇJ =‚b ‘•Å!ÀÙ#ä” ‡fý9$ùži&ÛŠJ 0µSÜ)¹=o ¹ZÂü"TyóU¹‚êØ%–wçŽSìÚñË}?å¢:–¿áÄ|Ýl±EsÞº-cl^ñ)˜AºÐW_¿»Ý~þñ‹ßìúíŸÿ¯2¥âè-UW„25¸Š%ÄbÉØCŽ¡¸‹¤dD8Åç$W:œôl+_8ÅònÄ !‰%€1Ò#ÐL&-k] ÅÒ$½1lIØÉÎ[¸5µ¬8GŒÐGáž!¬ 𪆧î@º¯qN(akÿÓ&"¾ü ænâ›êP+¹„qŒKp_ù¥Æ5²ñ_n|#ÿr?x‰Í) CJ‚Ž8 Ž )Ü…ò)6PHTa ó`¤/˜ªU™œL¦< 8ás¡ƒ©(À›:ÐŒ%;*žL’“_uòk*D%X¤u4¿½Ð)¢³¸$¬LáAcIÔD':ï’Z(bH¬&"øHt<ìáö|B,ÒN[à¢û™y‘„`¬‰M݇Žû&8¥Y°q:¦œæ<'Žž‚G2H]¦AM¦0åØ<ä J…I:½jGÌÈ 0…Ç…"ìd«~G‡d]d&,šBóÿª›[¶¯% MeFyR4ýovvlÏê¼µ;’nÉJ¸ãWÂÐ \ç"»ªC…×Kð˜Od%#<ÄDD¾ÓJ¶‡R­4sio™×øà»/ ÁrKÕSÙøÅžzA.àÃrxU 41^é´K8ý%V|‘µ^f=+X=Ó7†QŠ˜B@kRÀ¹b‘µ! ‹DIöÕuüëò˜Ñ\G]1|fJ·¢×0y‡SüB³ ²EB‘™‘µÊM½„Ìf„ª«JЖ+ÐreŽ<”œIñ-áU@@c_ëU5RÕ»òÚ`[†žÖÁ¤û*X #ܰw¸Æ• Zá¥ÿÜøììdkG¡‚Àõp‚H2!Úhǯß/x‘Ôц½–±”¥Ó2ÂT VD· ÙLû°"’wDpoUDêO`‰Õ‚2yb£jšsáC‚éb¦W¹‘ªuØÁ0 ‡S a Cœp…½‰Üär¸Ãf.€B,bµ.­…þC)¦Â9¤žœ¢ë¨ð^טuê‚nu–" ‚Ja"jîfxR!d A€@ôà£þB‘A¨Z‚@E*w¬ Šõ‚U!ÐS¡jʧË,M¦Ú3=“‹3zÞ\f4S§(ƒžW'@Xs6^|FœFïyà ö°ÝÔúÊÿ÷o4X`ÄèZWˆhl®‰´q¤%Ý¢À.ºåÅÎØ¾7pe4,Vyìv墘.2CUô€LûnD„!I•„ï€Æ  ‡±Æ"1àÆ!¸#í«­›…Ó` [.þ3rýœlã.[Ïv6eòfhj'Å­*ŽgáXcϹò!žt¸Å½QÀm×r »Ð­Øq1ö‰ë­žÉ‚u‡>lN¨«¶ìDçÁ`¦Etbî.ÐCdª(¿=YËaËÌÚy]`x v¸ÍlyÍË ÏP1."f7ÚøésÈE~Î,¶ J8„}¡m+°Ûßžñ¸e>󌌷Ió±¥Fä’™ÿçPk`!0’,Ï›*1-^/W”Ù#vŒ‚Vªi–­§#Q yäêKÚÌ…»gaü‚\v±Ç¶‹t3ˆàxÍko;›ƒÛlhœîvgÂ.ÀÊÁVJÅDÍiäÚbO"Š9Í/n+Éný¨ÎÝ-´îyÁwr¡Ã“{)o:óŠ*bè©Cƒ™‘É–åšSž^è5æ <)òéò: Ë—6l†./éÏÇ7£ûÝã]¸¼Ç ð³Ö“£ö`á(æŠÉf®„÷â¥OcŽêÓØÚ´í¦ïœVgÊU_{xpro±)ÛÝ“vµùþ÷îO§ð+#ÿÃ(­ú­ÿl¶ 28m Òb0F<ïÚ¾¤>À²41¬¦¡u#@±(–S0€4’%ˆ@˜‚*C¸ãóóKFñ@DÁ“Á$Á4ÁDÁTÁdA5Q§2)4kó;(† ˜ºb¾F3<~H‚èkÀdª–ëk`A/ ¬¤C0Ü "¡@<…fù‰X2B²¿s¢¿¸¹Ârʹ©»tš6="¬[>ðRˆ4d´C$X†1ðA$”Ã"i¼âÃ9¥A˜›C l¦@¡V9‰”ÀˆÙ•°Ó)š©fyÿ(æˆHs1¹›³È*4¿Åê’b·îùHs‰G‘!ªD·*˱œ‹±˲$K¹0Ë*@Ë´³l˳TK¸|Kº¬K²Œ‹µœK·Ô˽dK¿üË»”˾ÌÀìK½ÌK»TÌÅäËÆtÌÁdL¹LA#ÌÊ|LäK˼LÀŒK¶LLÉÔLÈÜLÎ,ÌÎŒKÓüLÐÍÒdÍÖŒLÌ|LÊ|MÒtÍÌœM¿4MÎĂЄMÑTÍØ¤ÍМ â3SüC ˆ«ˆÙÆŠa9Œ) 8T!Ýh𧬑]q¨KÒ¦Ñ#!Çyµ§ þIJáÈë1?”!`ì4wd|Á·Í²´ÿOµÄÏü|ËûÜÏü4LþüÏþÐÿÌËû Ð5PUPÕÏýKeÐþtЕP Ð mPü,Ð åP ePÅP¥LеÐQÿTÐ ýÐUQ½PmQ QQMPÕÐmQ­P½Ñd!Ç[ë@´À3Àc>Ô"‚É•º:€¤¤¤€P‰ €‘%ÐÁ%ìdŠÒqœaq( 5ðŒŽ¨t¡dü ö,F”Ò:ÄSžë4¿«ôÅ6=ÎÕšˆúÔQ ÒQÒ-QF5Ô UÔmÔµÑEUÑHÔGÔL=Ñ ÕTMýÿÑM5QHåTKýÔJ½TQµÔUÕVÝÏÝDÕPEÔXUu‚¥$ÃãLN?RÈ5L‚Ec ˆ T`• Š•Y£/0€¦û‰\Ù«0¡Wéˆë,—¸ˆSŽ/è™ñ‚&ú>6ÅŽBtì±® W’¤G?ý®ËûÈHòä°¼[2n­ =hÂ’„…3?B-UW­ÕYÅÑH=US¥UR­ÑUX=UL]ØVÕ†UX†µXI%X…Ø‹=XÕP‰MXõXXåXTXýœ6Р%y+m³. a¹$ƒot>r‚‰/- Hê%"p-2Š—éð²£Ä¦Zÿ¤tž‘‰¹ØRq­ŠUC\4W§¸ÈíFÛIÅÃ!ÂÖ‹Ð&Ñ¡Š·’è™>¸bd&=äuØˆíØŒPƒ5Ù»-Ù•[¼Y„ÝXJEؼmTOåÛ¹uØ Xº=Ü’ý[Y-ÜÅUU’Yà \!Å…ÉÅ7=ÒšL—UÈ…øUsH\œÆy=ˆž­™Ê±w ™ (–Ï1!Ñq‘!')Þ"-äð ØW©ÅŽ…9@"” °$t½’=í’9ÕÓçIèň)ˆ·&º*r¬[*|í¤(‘ȯœOìˆ[ YÊÕXVUÜB-_ûüÛ“Ü»mÜC…\ó…ÿPŠMÜÇUߊܾå߇í_ü½ß‚u_ú…Üœ#WŠ4>ó;HåŒ !¤^M$"‘Éy+Êïü ¢À Óê ‹Ú"X=ˆ ¢]á Ïçǻà ßuìH®üS¬Ô(Pó©ÑÂ%’ø óˆ/P™ ñ9ïIGô_ÎßÿÕ_ÇMâôýßö]ßÊÕøuÔùàú\$F_ö à.Þ[¿Uâ0þâÁà+.àuRÁ¢·*H/0“]U4´«æ[ˆƒH$–¨žS¨,€ÊÎ^ô˜ŒÈ$Ÿ¹ Sš~:  ž% ûê§Uáê{<]ŒSÒÐ>®}¢O›9ê…,Þ˜‚kÿ {EÛ ÜÚ1!3ßýÕbù]bûãV¶b(Îb+V_*ÆXYc.feòå&Æe]¾eT†ß_öb_NÔ2–b¾}¥®ªZ«å£ƒ¬. Y´ÜIØy•dáãá ‰+ó ŸÍˆ„R“`¨¢4äo.¸`Ñ,Ç ^6­Ã“ƒÓ{?’bÇæ©<Þ{¾ öB­# Mž ”€éÚðÊsµÇSÞâcæåUÞåaæeX~_…æTZfb‡¶hϬhW^èa†h'Öè‰æVe2ŽâöeâC1–µGøåc`æŒf˜#]~d7½4j{á¬möäÈKÖð:²$[²‹èg :náÿV:hu%b­5åT&f[ÆâZÞh‘ŽêŽ6c`žåˆ6i­>ß\öjŽj½ë‹®b0ëª.ëº5æ®fÕ˽£“¬f¶Éå”+…lNè¤éq|©„!¶_ÆeI³¥—-hã8ìZÎjºÛ 0 D^Š@è‘Në„þê³6kª~âÎÖl«NU¨öìÌÆh°m©^ë ëÕní­6m×NmHmëØÞ_âŒI1|«ˆ±® ¹A»ªãiÞkš¾Åe¶–ó ìm ³u¥¥z†^{ÎS¦Ö)š7ðg²ÀWÒYg¯O,ºlζíŒîåÒ–mÌ~eÐ6ïמQ®ïô~UñVoÑÿo¬Vëø&_Z®mÕ¦í’noF]«•e˜fŽ«TŒ'M¹˜^e½nZlç¾ËÜwv&u¡SôGyv^ûÚ¡+(·k‘—ê H°›™aÖÿâžÜq=ƒ>¾ï&ïúží÷vïïó–ooñõ&mø6k•èþ\ônè)vk×qÍoØdÆÕ™<¾€+W4M n×PðŸC¢Pc¿Æ¾Ú±òš‹Ì (€¥Ëû™‰ŒÊJ.¿×û×'rÔ>í·ïß[úrÆeoýÞñ"—s ÿñòÃÅoþÖs#'t$?i#×¾ãKy7 ð'g4¿*ïr>¤ZIaY‹\ÿ@­½tsÁª ÔÀN·l7ïs·Û/ï«ös>§ó¥h8?õUçñ;uò¶s@Ù ô@ŸóW=òV¯U!/‚<¾'¯I캘œd Kÿt´9ò¬È¿®lå~v¿¢Â䯀ßäö½MÖäÍÓ ÎÈÌMpÿös'÷qOËp'MvŸLu÷ÍÞ”wxïÍrNzÇwÜÌ÷w¯ÍuGw_Íw{·Í€7xàì÷‡w‚Gxvw÷ÃKܾé\}‹Y1Þ®Wvá¾vˆÄ±â3W…3âuìxlW­‘ÇG–|?•_ù•tù—Ï;XÂ\MÏÅéBΖL¹å4 Bg/ùŃ””~p6¯ÿʠרcÄ"Qdú¦wú§‡ú¨—ú©§úª·ú«ÇzKLYãfrp8NÈ䌖z¤Ÿ¹r,öãÞrO_îue¬ _&Âhežö 7Ô2Ãû}Ì”œ*—T¿À|i"¾â¥xƒäm—FHÃáL){³·âpN—¼vÃJÂäÂ.2½ÚH–ìNÏ“dùøóû¿},ü¼£Fð®ø—'mŒãøíŠy|È·oá:,À¶Çráüy®SágnvÌüŸ @_{äû6‚ù–~°j~/J}‡ëËe' 7ÆøTœ'±ïy²HÜÀñ*Ïi·?`Iîp…{ óiº—ÿ{ ÿEÍ'I¶Ý¹î&HÐÿýçÿþ÷ÿÿH,hð „ 2lèð!Ĉ'R¬hñ"Fˆ6rìèñ#ÈXB’,iò$Ê“#S²léåÊ—2g–Ä`óæ…!e†ðìé“ç›u‚Útƒ6G•†bªôi 6R£ÞÄ0ôÖ¬Z·ríêõ+X¯^´hñ’•Y¯²b ö-ܸrçÞ\òóîgCî ­ê×*ѵwÒ‚%<¸kZ‰g5ŒUñÜÂ’¹:ž Vèà¿6‡zრ$š¢G‹$mútÌÓªe¦^íšeë×CËî»6nÛ¹wƒ¼Íûô_»wwæí™°›~ÜPÿÚRèЛJ• ]jÕ«põ8‰ü–È­_Æ™b ë—¡C¸c½ð…È-”§ÐÑsþŽÞ÷óïÏÖæÄéÔ“€@õ¥Ùf½eXe‡ù×_ZN5aV< öUe† ÁGVN(ŸƒZ-ö`–hh¿ý曊®±Ø¢j/ˆšŠ´å&㌣ᘣh;òˆ’MbØÄGN=é…×^˜ÝdÔR<÷œulD%uld'Wƒ^Vz\µÞ Xyyz`ÅÇYÞш@€UšÊ9§X6 ‡ä€{hVW&wac=˜¥aSlô‚qèÝ‘ÉÑ b¥ÅK,qÁPî ÇÜÿw&pH™V|ÁéfA`éZè—YJòr(ÚøcŒ¸¾æ£®°õêb¼ñú«JÄæjìKÁ8P²b`ÔSÒY tÍ57¥”Vb¦eˆéèwpðf™NŒ9é£Êµ3žv°—eb5C˜[±V¢ÞœjÒ9°w8ñ´ì]|ÑÔ¼ (†" ±c#ŸCÐAǤtx«@< ù]•ï ê™YÄÉ¡ªbc‘b5…ʾ:ñeó‰AÃ'òq+²3 [toH÷¨ôÒÁÞÈ´ÑPG-µIIÖ?¶'“OFËFsÙ^‡í•Zip~ajÿ|ǘ|ļ×x±Çs5:iÙ'ݵmæthÁÁc‡@gµD¸w|(Á‘ïW×]Gj½§M9–ÀsNq VK¼D݇éö›âÃ@h¦ÀC}aS"Ø·Sl¤LtýÇÄSa#}¨"·dÄ,ÑPPlb‘W=’4je4c‹ž·š3*mcG‚³=Ëm-(B2Ê ~ \§ZتN¶Î—•¼éÁ iÒÃZÞ·³Sq ‹ô„ L!€Ú©"‡þ†:¬Î lLÞ°b¬¦Ä’¶ç…ýI3Â[Kç:1 Šåfò)Ã%ÂÁH §¨¤ Ó"iEtŸâÀ»Ü6„/| ?;‹%™º‡ WÒf n‚èàMáá'‡Îÿ o^K($62NpÊó›æÀ:Û)F8~ÄEóç?Ó˜‘´ =(BzÐ Qî'–[¥³˜MD‹_K’ðm%h+æ NÀîÀNú‹ÌNa)yíEÚш•>óQ\)â½@ô²Sòô+û Âôì‰{>ƒe¤TÆt…ˆXÝ´P:¼ñÁmê›VNñ.Ã8a¡V\ȳdžtDÏç´¢CZö.¬?,ꕆd£ªº#ž©ëF à/*¯{í+ÂŇpn„®¹kGôÊ×—ÔX%Öc!›ÆÝD¶W•µ,?5ç—%é¡âÞ‰0ðMHÿËI}œVùØ@Abå6sÙê‰2GFÆ\Záä(p•:p‰mC± UR%-Z“!GµÓž2×­ÙÛ‰gód ã¸RA‹˜,y¦Á¬L!C¨ƒT¶KkvÆ@×KkªAxJ+³ KÁ»–öîŽwŒá¡Ÿ†Ç‘w…ïrUG˜#C¡@Gø›à¨zDÀ¬ÉlÒ ì‘ËêŠÂ!Qã±$Ì ÿˆÃ¼‘#³´†ïA')¥5mu@­"€µ0ô—4¿eÓ¬Ì °Ë NÊ—ðänKtHoÉ8WR0Dø¦ð…“Þ¸¹Ìmè…jÁ=Ùw»Vžå•'ŸúKªÿYq‡™b|‡c¦ËX!Bé6³ÊÌ >¿õŸZwüÊjh)™z,*¿qÄ.céóŒÏ±÷ÎNȳ]ù,Ï@3VúqôF<œ#IwÃ4‚4( #M×fHP–nÂ"Ú¤=öqÅ,ä¶ä„M9•if´2šìdžþI{<‰®”}ø*Ê©lýµVÒú¨îŒw §@êD‡²Öu…*+X4EÜüÐ+k½n[ïàCÌù…›¡¹@~d·pû¯®r£À» uîtoÄ è€¼@nqË;ÜæöºOèN¯Ó™ö÷¿†~ àwƒ*â~¯ZÒ²¨´¦HϺ`tÿ›wøÀ4W¼§8ÉšO TÁªè:´Ì`1ðSˆBšÊK2ÞÁ¸*Ä Ãý˜Œ`€„ÀDfC‚ÕÙ[Yëªy¨ë=f†,ìœ~ÕÁ¦‰õ,¤ÕÅ 4'ØŸ¦{º¨¢vª{!ëKЧô0}ð§ù›Ó–¾4¤×Îv~Z /–;R—tK'â/t(ÞñÁþ”Ÿõ*1gTmÂ’s³„ Ï "³–&\Ô9Eö¨CÕeê…ݦ:uÒ¬ïwqôÅ { EÛ8ïP›‹ÿaŠâÞöÙÓž7o7Ük“{ÝC˜¡žY‚Â^«gõÔ¥d¶°“êÂ3¿ù‘ûi”ÿG¾M¢ Õùr&Wøà„ÊÈ¥z¡µå %•ÜY±wôîwU{Ùÿæö¤I?ôÔÞ{¿éÖ!‡è“byô=ÅþŠ´žõ .ˆ(œÈq[·YWîG$V“äÖXë…Ö®h(v ~ † Ž Bœü­ßØý…ã@“°ßYT 8ù(…6 âà§áÚt‘ÜÞDzžžÒy!^ š Jü­‘Á5!„=!f–§=ÐÕ Þ9‹õ”øGF–a6ÔCE—ô I+½’¾¡a`É1Ô¡Þ!æ¡î!ö¡ÿþ! ¢ "!¢!""&¢"."#6¢#>"$F¢$N"%Vâ*ˆ þ!‡g@‹HÀR|a”H:Ç Â!*:ÙÔŸö ‰ø¥b-aÛªmÅTŒv9ÁžfÂû#úE¡ÒßÁ•ðq RX‡(ŽbòUU,Ÿ,N£“ÕÚ²+½âqh—äQãdÜ"ÊV`âå×gô"?ý"î£0j˜:®c1úÐ`©˜rtatDÄåã©¢7þ#@_PQP_¼^Áň$äÄ(d¶1¤C.$7ÎI-ÒÅÙDÆ;ê:ÂQFjä ¶£;Î_Uä„€ð`ÞÅQÿ|!ĕ֊•bsø#@ÆdÔÅ@^u=Pg0ž•Md2¤¯1Df¶M̶ݤQí &eD8ÖFrdSVOG6 ÝmV+n➸à÷èãøø]T¤LÊ$XR$°bqàÅÈ•ŸÏÄbLÖ"ÊAÈøUä'Ì%]Ö¥]Þ%^æ¥^î%_ö¥_ê¥ûõÛG‚ä>%TΟQiOð¤hR„ω%_JcXVf8¦’*¹âôýIä…%OÎâ 8W_ åðAÂ_ž&j¦¦j®¦'¦ fafH&Ô¨à –åq¼’Q˜X´,ÅFµeš¡ZZ惬â1&§‘H™6>Œ¯åC6$tÿN§tVg° Œ 敇þ¤…‰Ç¡ÌÀ¨ÔØ– ÐÉu…Ò9‹i²&{¶§{ú¥kRmFOTN lúb]ð U†‰á# JKXtÌàW² ÑI|Û‡yÂNá茊«è…jžq^ ðU¥fúàðeÙg6a`Œ—Wu†¼ÈP~„œ@ÉÔÇ½È ¤h•IÌ.†Öz¾§Žî¨{ÆçÜ ã|O}>X"m–%¨ÕÑŸHdÒ`TƒŽ!ÿtÜ–ÈPoA€äK›e…ËLÊÍeè’%ž¬!\$˜rˆ˜Ó½Þ|Ð¤äŽ ‰Ó™À™»t‰›‚&cfàMä(ÿö©ŸÂ'SÊælÞ§SiÑ€‚ÖU†oB¦ÿ!@)²€ ¸IéPÀÌЩ˜Ðº´ qYè4LÏi…} ×™^föäÉ‘€snæ¬d-RgtÖ*­R§…NãÔ©˜œ”}èˆÒIÑèA¨VÊyrÅrÓŸ6«³â¥œ¡RÍ6š :¡H~Úb:Ë÷ü@tœX)ž– Jã ÈGÚÀÇ(ÀÇÀ—†Åݰho [mE»DÕÔAx_ª¾ô©Òêée@NA3×Uð*o¥Þ L¡ÇI1yVðVõM†³”éñé³v¬ŸF+ï]klêU«µÿÒöx†˜Ú_.IŠ…â úæ”Ì`‹I£¨O°û‹7!\ÜÛÜÇÞô‹¾Š_ÂTÌ€ökÏlÿT— ÎåÎE­±ì˜¾Ru!°Éä¸)UÍл°—þ;¸Cí.YüÈG²×É,HŸ0C1žîò.Ÿ¦ïªŸÈâgêÏ‘Ž©³H@´€Œbø„ë1¢”rLŽkˆl½)O¦Ïm —xo]Å! Ò½Žå®ïœÈöH¥ìÚ:­°¹ ±Ì­EÚàK¨Ì—þ1Ù—«¼šZÀe\ÉeW1j>püiæsñTzI*§r2¦·D/òÅl´¸XÃ>Jê¤ð½„Þªù¬VðÛlIáxŸkÿ)™á0X§Ø ûÔf®M¶Rr&Ê…®"î"—nY@Ë5qŸ|A˜à (ýÏ) ÁÍŠqR¾Dg6•i"¥—2 JVOðRO*Óg¶b&!‡=b$ôŽ_¤gg ‡ECßNœåM,Q¨eˆ6`å™ÅV,9ÁYVÐA€Ý°SŒ¢9å0®í›²7Ï%WaÜz±—³9WÏëÙÿÐx«}Íi‰«uè/¯%,K—gìRm=7îþI7³)‡s†3¶¶²²#Ùftma ¦ß:j´`4^o?§êὯÚvîEû³«§R†´H4Iÿ—´IŸ4J§´J¯tB\O*ñ§,çßÞIoÿÞFÑsGO#åxÂè³9ætááWQÞÄ*§Ý8»²ñB't1V…­G>s¡cÆì³ACjtà4P£â¿¶¢ôi¬ÃÉV^Æ.Z"Z§µZ¯5[·µ[¿5\ǵ\Ï5]#bÝi¢tåZìæT÷í þfùhõX›¡5.çgÇnÎ,†®;ÞOåsâ©cÏï[¤­6þIQÏQ'Ofk¶AKðRj ‰:#IÞbV6œDÃ3V®E6Xf´i+ 1ËobÉv Œ8FF[ÒŒš„(PNÞoóŸchKMg—Dr+wR#Ërÿ“Ñ+%¨a£¨1iñõQkG‰`Ãv³aÛä”m#eóödgYg2ÐRaYoóGóâqÓífsvsÃm|)U~wYóŸp†gt!ßæcd:ãvsw~\”½*ZÂâb.BŽ÷mãj²>eOdz7æÌ!FV‚†o8‡w¸‡8ˆ‡¸ˆ8‰—xˆ€‰§¸Š¯8‹·¸‹¿8ŒÇ¸ŒÏx% 8ß8Žç¸Žï8÷8ŽÏËâ•öOðA’üPj7éØHï_[/¸L¶ïa÷tbÿP.º%dK¶„«Z¯a¹}Éê,2ŠÔx}D‹9f½7|«F™OÚ|Ów Þ÷tÖiEDKtß]uÿ°“ˤl¶Ô ,ä$36} ÷iņø‡‡PÈ:v‰£'º[ˆeAÆo˜£ùF¬ù¯ÇNàx ôM8õ<9JLþk~6h/4œ»*nî÷q¹×ƒÚô²Á€‡x8è§ŒG`éÏz8ŠÿÄ“v˜ èÁçuˆp€Ö’É)pœNß³%ÞFO1232Ïâ¿X‚Jò ‰¤Üi°—Y‰Ža”VÑp¿l¼¡p•ø%k¬´whÕ8@Lá3À—!S4HÐÉ)ê8lø0"€S@öÁ˜°àAŽ L„èðaI“'bA¹’eÉJ´xy8Ã…˜3ù\ør‡€C¼ììyˆÏêÐS”ÈÍ£|ê8…ÀÇŽPŸE[fÕº•+W•]Á†ëu,×—=ìÈdE‘/fܨÖà7´l)’,»wïW¾³ô˜°X |0$®9„qcÇŽï(®91‚ldÖŒ€MgÿΚ٤à,Z1†ÉwP§V­ÚËjׯa«.xúŽžÓCôÌ@mûŽîðѓڋ—)´e]mð„w€Ð‰=zuë×/y¼½ñÉ¥Á›¾ã%ñxÔ­¯OŸ¢åN™/NZ{é¹D5ö©¿ÄÀp45‡S©ù`ˆÕ´èõ†¦ÐcÀóîXb Q£ådšÌAß”CÍ7Ñ‹M2ÊÂO±—X"@ –xÈD€¸à!éèb?`”±$ –Ðà K<1ÅYt‘Æ;bœ1¬Áözi `ªÃ´kr ü‚ `¼ÃJ,Â@ ʘ –„É Ê0`‚pB ÑòJéÿ «,$í̳+< #qEU%­%J-µ<>´ãΙÇ@ü.±>ÛÌTRÀì˜Ï0c£4äîࠌݜ@íA N'x›á‹¥ÒCm "f ?Ú øMËï&Ôu5ÞVÛ/5½µ/€èMº`¹í–Ûì¶+Ã1q1ÂU o©SˆMC¹)šapŠSÌ5 0/_óPÓÂØÕœ˜‹VsÐ5/2 &0×\°µ ƒý0ÄÄÌ%qB>, ±Ž2 8‚B¹¤95‰c'<Ì$‘ S°^º Ž/0Ðã”!ܹ٠ÿÔ¤Ó -†30$¢µô¢0âC ›¿êÉ:|þ€5„Fú‹L-™ëI%Õxe•]. f’8ûäà~|hì¯>~Ùä¯ óšn;í¾»¬ð.`ìSîÈ Ä2sc3ÌXÍ̳V9{•À z@·!¤ã-@\‚/–Ø6½)œX=h# ©¶:0˜ÁZáV;N5‚=5úî8…ƒÔ¦ /:vyï}áÄ–ø›;ÈÌMŒt116ô˜çÐù;¦bˆ:ôؼ!(`Î>Õô0àß}ÿCÍa |žÉ~g¸ÕŠ;ªÈ1Tmßï1ñÈ q²ü56V/Œõ%“ÜaM,`I&C“ÿøow`IX–¼iå%pÂDêÐ `WwkãÁ5kB1Ñî0lÐ!¼ð ’Pox«á×&(–þÕ®|H x’6Ð!_ àI€xþ(1S9d¢Vs¿%ËoÃ\þHu*V!Nq© Mg§š:'t[­|Y¢!xáÿÚ!fIèà0éF½ô0KbLî)0/ÑMdž°„kÎ$Y¶²ˆ´ ÷MÓ¥h8Sئ€´¹Æ í€9…‘žÈ'ÆóNak¦‚Éhªh˜Åì'2•ÉÌ_Önûæ1éYÏ„Úp¡{Á¥bú8På0ÜáçÅV¥ÀIÀLeƒÏ à8j ~ô€)ç:D Bì¬Eº¦ÕfJÍr–j¦àŽ×˜N5Ãî©H¡bxC âðÊ%Ét)o}‰¼—øxª-<ÈllÎodR+ZH@*ÐtèÊVNç`@M¤Ó!Zl:ÊŸñ(Z‰šù¦»];¶9 ‹ zÿåëC¼à+ $ w…ˆ]ñú¿†óHÕ|‰ð ‚xÁ!’…H­‘¬:`6YÆR ÷[ÙpR6²wÅe’Ù†Jpµ…™gWäZØÄÊö°ŠýÙ_K²À⌰†Ý¬J|›×Û2¶µ‚)n`^ÛÚMuʨHE³h™Ãqñ‹œaC<ꪵη:ELkuÒkÑŽ[_8Å–¬ 6ZxNïÐõ±§°ŠÐ}Rã„çhi@‡ê‰º˜q1†ŠŸŠ¤bç8ÅÀ¦ykpƒ¡!jÐÑ>Ù#µñ„µ5S˜o€Óšï¥f †î8/t·82@2Ñ“”­I§òC¡ÿ%|‹%XÁ‰ÁB%f·iSÈZBÔzÒ#%y ûqBR†D‡ oÍÈS2’UO²üå%/!‚²%À/‡ù!_àMÊPæ3c Í*òÂ0I6fÈÌT‰™Ñ|ÜÆêYžz겕«\dNaYÉòÉrH  #@ó!‹>²¡K¤e> ¹“¦´¥·Â·æïo‚SŒEµh*.fæ­é)¿À|rµ ¯U§ÊÒôt£ÀinvhYí¦}\Xa39­lQ5»ð±—¼£"õÀÃ_y,é;´ÑaA„•PÐÃ$=|a è‰#·£ZJéF5APÊÖh'!Ò¦¨IAðÿ›_«^yÅÏþ|¬1Lo™/]F&•ÿ}’ <˜eæ‘IèðmÍ/ßwV*=鈷Äß7œøq/Žñ‡·$ŠE0w®8ªPƒ¦T«ò̪N&e|®^£jfÙ [‡äõÎN|ù:˜ò=¨I Çø¸ê‚TxÕm @«»”I :AEöÓAÄ\‰2¦Ù¥I°º î ›T¹× 8Lë|u5ú»u¶0ÈÚÆßJx®¢oœßI€¾ã™ñÖê}ï~¾»ùÞÐÀ žî+yhb"ú˜¿QÑÓ‰!ÜEGêÈ#®ºÝn"£u]½ìÔ‘µƨù¬3RxŽì޽o)¢ÿòˆ^ôD3Àëm~l ¼þ1w»ê'©˜Ë•÷½÷ýï|áŸøÅ7¾ðï~|å/ŸùÍwþó¡}éOŸúɧþõ±Ÿ}íoŸûÝ÷~l—[Eç6<«DSyΘ<å¬*–6'TÍÅÛýC…¨s‰§Ô{3µþOÂ) I ÙÎðöì­Ç0`ðŠéÉó®ðêNWŸÈ/M‚o–ÍŠrÉ ¢+ÔgýBC3Ú¯ÿP0Q0;–\ÈÅÀÐqòGi°Uí.ß x°}ð0…p‰°ð‘0 •p ™° ð ¡0 ¥p ©° ­ð ±0 µpÿ ¹PáÊã, i@òg㢣PEqJÍ3Hím0å°wîO ­(ãÎx†:2¯©¼¥Œ}XƒëG!dy‘¢–J÷4°%0ðѸ"±'ñR*ñ$#QÓ:pÓ¨ºN…òºH3DJ àpUq«#¦©O'iÙʧ_#Ú2¯uÑÂn‘w€15vÌxòÐÇ.Ñ$2±†–QošÑ“±$ž‘n¦‘'±4Cê:ñ“'FîüÇäçòX±Í6i ANTø€aöO ±+ɇ±±©pQô:$Çâ5ñ‘1/M «‘ÿk Ò r £ñ ›èOꦎüB䨫KŒÈñ5òÓQñ@E—ŠŸ§[òÓcçñéñ¹¥$Åçírp<|Lh²&mò&q2'ur'y²'}ò'w€r(‰²(ò(‘2)•r)™²)ò)¡2*¥r*©²*§ò7ÀC;LÏôž«ENºÔpUÒOÅ27ò,mðþ\P¢ŒÇzŒóúÑ%ñÑé².U²‘%ƒeïñ ä€ #0s¡²R121õ„1Ó!K#ñðüÒ"-“ ;Ãò’-9S]qêòÏÙž¥vq$}‘5 @.ó²%ÅG \Óÿ5á’Ï®7^Ó5DÜÒ\S0ÿ‚0 73“¡‚“¿G Ì1 E 4,rU2£µk3;³:k°#Çs‰óTÓ)'² Æ êD¬$RÍçºê¬èÀ7P¬P#æØ.ÍÐëL5žÛìÑ’Þ &T½–àKòS/ý’¢vs!S(‚TÇ$´àºf1R!…B)´Ã"™Í–**ÔÄQÔT#©Ó:E´ÿ²£ô<’êbÙN5Q $§5V¯ÃJª€€—f´6ÊçDFŸ«Ïck´Jåæí=iD}îÅf…I`…–òFa2÷£0 ô@_Ô pä!‚¬ÿ8‡*tJ½tB»Ô8³²1ÖR9ÉÐ+1€T.£9%:S%UPÅ,GtN ;=14,õØ1/ùQ/yèóÒGh§å8 Õ|#W †A¾'Û”":„IâãcN9PÖÿ5×5$G–b©y˜ÔOu¬Srs‚—ðé™Î8tôœ²‰Û†u]—ÑY+v7î8µ1C»1,¸`GmýP1#g€=|C7  r^ s$™ •¬tjøy¡*HËö=™?ˆw€ ¦À”vØö‘&õ$v.Ì4]ÃŒJ3c[®›f[™•8h^êFáW%³x}zÂ=c‡`†´:ôIi’¶ê*ggkßÜ50IëANh™k#ã8šXš§YLKCÅ0p˜sºT…ÛTqRÎ ÈÈŒ(^ =ˆÀDÖŽž£{Z”~*5ˆà’'ƒtŒ¢ž„´—N±Ó‘(X$éÿ­òVŸÈí0ZgPYÄ4œ}“UZ}#R9àR¹˜58§ÛšçÅ:DÆ"HKÛŽ­øBêM’ÐõIÛ¨ŒSMùÂ7¿¬ H‹Î`Z€Á¦hØŽ5ŽëØBÇT”í2T´2­k¾ÁþX:Y¥ýdIG¢¦c]N¼Œ"¥B5Í(¦ÊZ2y¦vƒ¼ÈY6$«›¾N–wØx.àiñô8³ÙøÀÓ£Ïc brÍÓQ] –Æd=H¬¸ø–eyÝV6q÷“þ,·–Äø/¥”UTJî$›KmzŽqšuZfyrâa¡Ö\&JÀ–¡` –,QåjíËYo剟Úÿª*¹¼ÎëõºŠtÜ §È+)dÍgl8`Úù4Âm‡?ó§m$÷O$M € ;ìŠÑ씉íð·bÐ4$g2²¹Â7 s²)» ¯²Å‚»9.+Ø÷xCg® H±"uµýÜë?Æú>L ÖÒ7=B¯Öžô2™¦¸ç é¾sí¹9S-ÉÔ‡Q4b)ê“_ƒIÐ{iö^Ïö [DR@­ò¯Ã5|Ã9¼Ã=üÃA<ÄE|ÄI¼&±22ÚLo—³Á’qºy3žS3±–†»ê{âæÎM.ÓYŒpnèv.¡Y#á¦àæe~æi¾æmþæqÞæWká)1áõŒç-Ñçêð¨·Ów=jCQ3(^ò2Øâgããý·öÓ‡Ú|ÇÔYÓë{ÇI[½ê1ÀjaìɾìÍþìÑ>íÕ~íÙ¾íÝ^í aç…^ã þËÁ‚¯9\@NE;ÛT,2òÓ¡>níôo É\ø—Ù¡äÕ+Õ߉#5©óäýëßRìß>ó5ó9¿óãþ7åX²ë¾ÌG_Ï:®&6^ÿÓ½ïß\éß¼Ôð}\ÙŠ§¤úãGÚ¹žß}Ÿ[¾“ Ä“®äí!t=Ì“ÚL“~ÌU&ió;?ú¥ú5ÿó¯»ôYššozîãéBÿõèY|ä ÓM[?öeŸŸCÙ¹`°ÞU¯ÙËëÑc?‚,22ÄÜÈ :6Æ×(܆ 'ÂË ÞxƒÂ: ù(|¸0¡BCµ*Z¼ˆ1£Æ;zü’£!$Kš<‰2¥Ê•'±°| 3¦Ì™.gÚ¼‰seÍœ<{ÆÜé3¨Ð’@‡íYô¨Ò•^5ª³¨T%b`øÖ­Z!`õëV¯ 24ˆ6­ÚµlÛºÿ} 7®Ü¹tÕzQ¸¤ Õ!zùVÅÚÔìA…Ö=Œ8-ÂÅ…<CÚ/ztùà\ÀÅh2¼øê` Cº~ ;¶ì‘Ky&­[åíܼMîîÍû7p܇×.n¼'D‡y÷Rí;Úôê`Ãr%–ì1Á‰»{ÿ>|â‡K¢Bw>pjÕ ùd|Ð1üùòëÇ¿O¿ãýs§hy?ÐÔ@€aw 85™¶–t뱇­ÉÆa‡¾F[r,!'¢P$–Ô‰(Ú¶bp-ºø¢P ‰AžTæ9g•z#X7Vb!p X܉Gd‘FIWÿ{AݧAD£t¨!I%…ru¶DZèqÇÿÝ dàăŸÝÑÇ YÙ˜…ME©Þ†ÎI'!ÆH’Šxʤçž?ùyTŸ€ê4¨Q‚Xyèá(¥C<²!Öa§ÝT^Ši¦ß=tÁy‹¦×ÐC¹éž¦GæA|›SœrG\‚™Ù@ð 3LÑ›úä&bŒÑCrÖ‰l²®Ý‰ç¡…¶ô¬‰Ñúäì´Tk-¶{öT_ž1UtÅbàÅŽÖ- X^Q:–šJ—Z¡j’iá ¼—¢¦(¸Ÿ‚ŠZjêø+ªö\ðÁûùúÖb$ƒb6ÿfb>È3l†+jI¹^œÊŽLrGÌÆ¨í³)«l-‹-ã´r¡1·ØýînT9ZenXI$Q)écYÒÁ¥G™âñEA_<ýÅߡǒ1zœu‡t<¼ætèÑ1td©/•í=…^ÎS9™P” ÌpÚš¾ŠÖ,Á÷Þ´Šé…hºsd¥¾e¡Ü‚[rãŽ×rò‹3û99å/Ã|ùM•ï¹¹ˆíqêÜ·âbˆ\ícFGW݈ð×[¨‡šT>P³äÅ\ÔÇ—äÚvIžè8ª7£`SÂù¤ÅV1E3Ì d€ÿõ¤÷%<ШÌ7õ$k¿¯lä-v.yæšÛOþ|ê¿?ÿ'%ª<¨ôe5íûV –¡‰;cy D5¥Máp’6»PwoYf`¾ÄŽ ÈŒ8x dvqBPªa ƒòœr# PgëcŸD'=…¡/ˆCôX]â=@!b’!Bäaz«CgçÌ(-L$Ýܬr,ø‰‘Cò[ýæç?˜œÑŒiQÝøÆÈ4…m:ÜaU‚5‚žýh dC Üu4êÍ3j‚÷f·*Œf ð¼'—)8A@aaBÈt;‚¸£D¸ÿØ@|,¬Xf K˜`¬ŒgÃððË/ÿÕ…Tó¼T¦aÀà̆Au@IªF°A®#œ¬"¬ÅMdŒÌìPQ´FhÆQ7ÓDI4KtMlN³yÌi¥ÎU:Óe‡G^yW&¨YÝA ¸JÚVE€hZ\ø`O  m„ÁdÈ rŠ±Ñ«  4ˆ€RJ¢R–ÞQÒ’–g•aù°= = PL"닌k¦GA4¨l&G¤#­&´LJ”úf›MQtr¦Ã=Dãd êÈHÖ„3Ä´ž$ãNxŠPS(ª'Û¢=k³²$‚ÜóÏ‚È S Üšÿ8>ž²¢àqè§ÞÖC熫d=ÒF}ˆC¨u­lm«[ß ×¸Êu®t­«]ïŠ×¼êu¯|í«_ÿ ØÀ v°„-¬a‹ØÄ*6®‰ò&Tv†гhêÒÊ»î µ ràM-“P»´P¸|á|+áh„Àµê $ª; A j/¸v_ªaYǃ·Q¦p ŒÜvÛàvu\³ I‡s\à$·7Ëe®JóôÜkEWºqÌDºeGo}s\嚬о›ºÕ©Æ §ðÒÂ7þs”ëœÂQÝâ„ÝÝ3¤ÀYêÀOÖ’«¯ý]©´ &/|¡TÅîaVéØÞ^¨}n0b@6ÿ*b© ®°…/Œá kxÃî°‡? â‹xÄ$.±‰OŒâ«xÅ,n±‹_ ãËxÆ4ÞpÍnö/™*„¦âôŠ(Þ߆ëumPÙ{‡ØR|oá*ñK5’|ùÊ$f‰jÉðÁN|ç$¦ðãÙÖÁq©ÑyÎüذ’J•q)fªÐâ:†!Œ`m¡Pª¬”¸‡üÖ¸ÑmnnüLœéú8}4K¯ëØÑéˆG@ã#Ѻ’‚˘Jî,LFáü"„–Ìlñ*šy¸šâÎè|—®³1Ýð©ÔCõù肳Šƒ^J­•rë@ú¹¹6Ô®ß(*¼@E·ÃÞ.,Å£eÿ$á:n¶¤o;91} Ã9í¯æ+ÄšèX×$Äé­åÍöA5¹ÁMšïÜ9Ý‘u°z=xK‹×¿F©¼STï4&SÛèÑ‹Ž»;©ÊŽS+C{6¶ž©U”• 5\ðøj⦮ø«F0q_¼u®ö‚¢fÒ bä$/¹ÉOŽò”«|å,o¹ËW€—Ë|æ4¯¹ÍoŽóœë|ç<ï¹Ïô  }èDº!Ò;2ü±xôn³·¢ÀíáT×èZ Ö¸…Ì*¿’øSIq»ÈÅÝÄÅ bnï œýì–£w¡Ý®Ò{㻺sL´ŽÃ‰Éh@&‹Á«xñ$ÏÿF9L32¿KtQÕ\ÄhbÜÜB-H^ §`uAøàÚwN^ò™Ïxi"0´*„äqW;ÚÛ^ú·§~õ¬×÷rp¼t¡¦}<ö.ƒøÜ#‰ß‹RðÖ­k*CÚÒ3ë,‰µ[X’Ú dU\#Â!Î[ضw Xád’çoü t Ìè… ¸£ú˜lµØïž¡=?„ô ÷⨭µ“Äý•) ý#w¤ä»šùwÜÛø98TlÎ.wW{ÌuDãwS§{ ¨nÂÆp gxP"z€sjÑS 2ãA@^0ZÐ ]CYôj²*»³Yw°p‡P+ëÔ_Cÿt>»"åWjê#ŠC\ò·V´m”2l·N€Ix„Ž„\ª×züG…iGwH@wD\Zq€{wç€cXfN±…r¢ƒEĆl¸NÞ#t0ƒº4Iµ^C°> R~ëBO$_\„Kwè7;umB´ ÄÅQ£sMó5*ô5i´„°ƒY ‰ˆ‰ó¥\WhRý— ˆ9žÈ?Ë~UGLG\_ˆSŽfY H†±8v¨tõJw)þˆP\b‡çå=«Ò³ÂÏ·%éCdwh;epÖ;_’E‚# SBÁ”ˆã¶ˆ^T#Z8 ~SÿÀ·$[·t9•è$W߸Žzã\ÿ‡…U8M¢8ŠÀ¶oOX‹Ï¡Š°´cÞ¥@Õ±.D#†²hŸwŠß²p¾§gÁb~D‚‡X¼ˆ|Ñ1_àY !{È‚MƒTZP¹åc ¦ä$XE§ *9&eÂjd'rgWN`r«IxŽBa“¢:ù“’“;Ù‰òø‰¤ûWŠ-µ(žrwN‡€aQ©•«{¨xÂjÖaæne‰ŒJcy¡Á˜ñAa†Œ|p\²‚%ô%éIZ0ƒÁu`JFž$>\rÄtŒ†ñ‡lÿˆ~Þ†ܸø%` ` ‚?•™_€zp Cà’ù”¹”ôXNùFöx?YèUhl§á_˜@ZQYl u:µ•¹ùy|@G0E•Üö{ßV%`C=D‚ÑxJV*«¢RŒ9NМI=#y>Cðéuq`=+0ù ר4©Üx @àQ˜3öS‰ç™ž’žè©žì #¦ù”Lyš¨i?b™[ÿR€MW{p{@¶Y©›±È/ŸQ¡ç˜i$ºhj¹¾ÈI¤U«âœÅ‘ǸZS`l5kAH{I±˜o!„¨á{†k‡‚$1IÿØ–IŸB©1yX£3*@ùgþ©„Bê?ªiFª{Œz 1Yì^ :†Ñ0|`y uu_5Š£~B–mX–Ie%jI‡ÇI+ Áœq—Ƹ;ÙS§ÆËX$!&‡‘N@DÙDX“gç1A•q˜Q«’9Kè§€ejKQú™šDÊ?HÚ?ø(–8Ö Ùt=6N~” °¸•Ó ,z`ªw©B"ø4ÈB‡`O]âªZ;9eÝ`*‰OË76fÅiµ… ‰x„q¥u!Ê'íÅ@Ôù‹ÓyÉXB|è‚|PBxz‡{I@P*îàD…ÿ±‚ñÁƒÐwT+ÊE©LÉDàeÀ¨x—0¤ÙbzgÇ®îúž÷ʨ¥9J‰’:©‡6xŸ2@³Ç3N‡ >"¥F;×( ô"’äs ´5_#ˆjŠ6»òsg#B°xk£JÇå& ¢)|ð5·D8A et0P¿8AÀ¡¼óƘ|Vu‡Öi—$ñ; "_^Ð}·tæ:žŒè˜ìÝ·Ÿ=!$á´&1µüÚ”›™X›µ¬)€¡³Ui.² ¥¯ˆ›w@$AóåYz°IF×A¤U1«k¶p˜¶JK0C‹Yÿ8UFBM“P™{ÿæM¡ðrQÅZz g…VZ¹Ž‡HËÇ´`«av§g…>µœ£µ9ÊŸO믗Ó<¢(á¢<…lVÉGåÄ€KHkyH©H,ø`n!I”’¯± ²‚°TT&"ézã¢'8`4ô»—¥®‹Œ›®¹™T¾S3á{­s±QgE§¾Csëë¾ï ¿ñ+¿óK¿õk¿÷‹¿ÜÈ-X׋f•:4Ç€N€NêÄNêµ*¡i˜‡dnO!J²EÕS¶³5à{4J"H£$©²Œ x«¥Ü 2ï‹:y °Âê¶Â/¼†¦´éÿJ©jTºAyÃ/SÃ/±Ã<,°Âö-TyÂ;ò… {{—ÅS–D@•‘ÁDTEÅj²/Ù¦ÚÚ^îJ}DƒdIZÐH·2eÐÀ­EjYuYJ€ ç[¹ dEžÆUcsLÇulÇwŒÇy¬Ç{ÌÇ}ìÇŒbÈ›vç&‡²™° tY™EA zdLt1ZK¾‚S^¸Ì¨ö5"±O5&›ö UE× Ùµ½i\‹g–¬Œ>Fb%ç–nŒw~±Ö¤¢òqþHk9Ü2=L(¼L¯§‹º®§…„ÇŠv°²k:—U=°R^_òÈwHLsÑe^f³Ä’Ö™’+8xÿÛ¦T=®•EÁÔy݃9ˆ½´8•Ø¹ìÆ ¹ìævk3ÃïÌÓâËÔ”ÏѲÏ)ñÏýç¸Æ_[Ȳ9pCãc—% £±*ùÍ4T’Læš&U£yæ#¹+”^åE={9™†hªS`<Ý\-Û=1\¼W‹p¡³vp®,Ëx~t6Ózªu¸ËÂ<¤<ÝÓ©°ýŒ'«k3ûȤdža Ë ª[©Ò•›ÆÂFl¶Ø¹AË2ÝÊY½}ç1ä&g ³BXÕ QemÖgÖi]&¡Ö'‘ÖnýÖlÖp=×%ÑÖr]×$q×v×zÝ×~}ÖtØxmÖ‚]Ø|ÿ×€=ØŠ}؈}Ö;±×Œ½Ö„ÝØ’mØeM٘ٓ-ÙœÝÙ›}Ù—íÙðפýבmÚ‰Ú‘½Ús Ù¥ Û§Ûª=Û‹Ú¶}ÛšíØ•Û£ÍÚh½¿¨XGÿÖ3MpÇ{o¬ÜŠÛJ Ƨ¢²ÏX$wÏ·\ ÝÛÍÝÜíÛlíÖám×â=Þà]ÞçížýÝæ}Þ¤MÞzýÞëÝÞò ßìíÞö}ßõÝÞù­ßüíß¾ ÙïÍßôýßøMßÎÙémà®Þ ¾àÞß¾ßáÞà¾ÖŽá>ánáä­ànß>âîß”`›j:<)ŸZ¶Ê½•jÿüR6bÂÄEÓd…ÕÛç˜Ûi7gÚnJÛ¥ÝÝmäÚ}à&Nâó ânâN^áP.â¾áU>åý½äz­áWžåRNå_®ß!æ>æ~å^Næižæ]næ`žágÞækþäq.ßb®æt®äyn¨…§]Ȭ†|ÈÊìâããºIÂÛ†L×½ž¦žã^wÂwKŸŸ$!“Ý÷5Þ¹*h#`¢ qüE~äÝäV^ænçlå§ÎåsÞê±^â­¾ånëp.ëÒ…ç¨.ç¹~美æY.ìÔõë¸nìL®êÁß·žêû­¤®É…ºlÜàõh øâ‡nJòiMÿ¢Ê\‡í¡1H+VêqH„­˜õÅâ³´¤ƒ²ÄE꥾ݮnë¾^çÊÎëÞïzþêö>çµÞëÇ^ìÍ®ëÀ¾ëÈ.ðúžðÌ>ðî ðôð?ð«Îï¯ðtZw)¾Šƒþ¿a‘S†þíÉÜŠžÇô<Ó­)9ž*"h%Ã`JÆë±—b½u¨ïò.ÏóŸßïïAßï ¿ïE?á¿ìB_ïSôD?ôïóßðÃŽô³þôSïáM¿ôPÏëÜô„žâš°‹wâ”°Ö±°!pj í®4Ö¤òZíÊâA_û&èvx35_}>¢NÖ:ïÝIõRŸàøÿ>øQ/ø\øFoáUðŠ¿õd®õXÏøoù„ø%îøXžù‹Þ†ÏùJoùÁ­<ºñƒŽÐ $À׎ö˜è±—u/ýÎ0>ó–Ë&/¹Fœ[ÓcMä€?ï‰ù?ù˜_ùù=Ÿün½ù _üVÿåÇßù¡ïôË_ýÑÏäϯüÐÏüŸßýáOü¯¤…Ç['Ìñ„Îgßú¿Úµ=£òîjÈioß÷ð VâKRfëÎAD0ܹã…àA„ b`XçCˆB¬"ÀâEŒ«àÈqcÇ ;z’dÉ‘LšTÙKK‘(eÆlÈWÌF"°á–˜ÐñcÈ‘%O¦\ÙòeÌ™5GöÂÐn™» õâ½ã°sÄÆ§ *d½ÚµÁ×­aÏ–];öíͽxà°µ|v»¾ãî Ÿ„C8áÜš/ÓùˆCÅŒÙ-2u+•m\µàÁVýî}|ÚópÍ£o[~ìWöoá«w)>þzùÝÃêOŸ¿ü‘Þãï>Ë:o­þð›oA¹P³kgô´êž 0Â2Ô± sóÿðCCqDÈæº`´¼&,í9ÔúbH c”ѱ)Nq +€!œã  xL¶Ç*lÑH†°Ó.#îØšÏ¾ž$¼ ¤JöžT°;°½ôà“òJ³üÊ&«T³Ìüº óK- “A+éìêLL‘ ‡í9ë0D@Ð 7llFDUtÑÈêêBWÄóHèžcôÒÍ´ø‚H‚€!/ôXÂ1à„›‚ç"£«ÒI[œ(É%³KÓÌ:­šóÌ-½ÔuM2{E“K^ã vÀ[kÝuJd}ÍõM/ݤ•ÙaÑ*Údíä¨Å%E±G$1 TCÄXLÜÄR8StÓUÿ×2ˆNÜV/I)e•¡Ûh«×6{óÅwß{ûÕwµPƒXh !‚ºî€ ø8¹;¦`®4†‡´­[WŸS2Öíö;¶× ¦­Wc£¥d\õÏägÑå­]yä’ÍTyÖ™a>ðW,unY ÔÜÅKÛ»}ˆ®A UZ°s×uúéuO{Ò¡ór&Þˆò¬T5¨»¾c:˜wîn¤QÏ w 2 hØu1ë OÛ˜cœó†ÓVžO–Yï˜=fY½›§Ùo¾—ýpÄ{þ{ïfg|ñÄkö9ç¹æzðÑ÷ª›! C_:æ'Óà ¿P úb×Uÿb Rÿ]ìQ½Öý ûì³ó_}qÕ¹!Þýi àôRŒQþîX'ï›rŽ^~géË·r|ó”ÜðËÅW}öqnQèm;7š!/¾MáÛ Çå°/Ë,Dzpˆ(p:|! A† ØÝ¡ž:žîêò.x ïH«`Õ¼ÆP¤ #$a M¸”–Ä„+Y! Sè‘VO%/„! gXBâP…:I kÈÃ’p‡@¼¡‡hÄq…9±á8Â"±ˆRœ"_•&ú0ˆV¢ŸÈÂ,*Q‹UŒ"ŸXF0Š‘†^L"Ù¸E4ÖgŒo|cÓÿèFbëQD»è’öÇ …k0¥ã@r:‚Lá€ÀøpºÎà z0^e¾à%èá SH oîpɃ G Ä@p<µv…¦j«ÄÚ-uJXƨ[b Þ¼00–”äR—»äe/}ùË‘à˜Ã$f1)Lc&S™ÅDæ2ùL]6šÓt¦4©yMfbS›ÕÜf7{)Ïàx‘BRþÿ¥!¦tZ`p`6 :„à@–À/,˜ÑÃ) 0…Ö=ä wÐÂ>éÉR¢Ž€˜&c5Ïm4­Ì×zQðs·ÄBG=úQ†T¤#%iIMzR”¦T¥+eiK]úRÿ˜ÆT¦3¥iMmzSœæT§;åiOGŠ-‰xFó]Ð9ºAvŠd§&µP;DÎó 0 0ÐËÌNSø;ï` ·”é9âPŒ¢+•õÛ‹3ö¢Ê8C”½&#WºR¯›ÑèÜnéMÀþÒš ì` ëMö›‰U,6ÛXj>²Ó”ìd‰Ù*†ÐO¢Üò«èŽzÐ2M©d •6¥‡DubÝê¸z™«_ B´Åó 8BލJ•Vµ†SœïZÑi00Òk®ÍÑMfþµ\½Ú&UÍ+u—G$Ø ×­©¡Ke-«Lï~טá/1É[Þažÿ½¾TïzyÙ^÷î¾îÕ#ÿtš@!5(]Äþ¹ÈS8Tµ¶Ë]fÆ '8K0Àúàбt¶™"˼ã^`z‰¤j™ÜOä¹ÔuÌ¿öJâkÆ® ’.sóê˜æiMxóo0kìØ_“Æ9ÀŽoìã9Èõ‚]}ƒ""4¢ý©œ„µ¡(vÜˈͱW%E•}µ§*ø!¯óC0ƒ ìb@ðn0›:^a^°íˆà6ÞxaøÄ€(Í|ä­Êa•)Vƒ ¡Úò« 10ónë;þÞ–¾éÿùçßþú¯ÿñ¿ô?þû?´¹Ð‹¯¨;¬TÀÖë¥,¬tÀ¼ÿ1¶†³%ˆs²ÄøŸJÉ=$¶  >Ò d›!¾¹’¶Ã+:…AˆR (ב»ƒ8Tàƒ P=8„(Ã>P™2³yAÚú³Ä‹1$Ù6¢“7zë¹'lÂ(tB(¬B)´B*Œ7pKq;@K›À\z@ÔCÄ"Ã0Ã㊈ÏH2?ñœÎ:'9Œ8Á0Œþú@<̨ˆr˜Í a<Ä㳌.̘óCˆy2$D¬„XE:È–}Ú¾MÊC¤3Qz¤Üš§€R;㊎ÛšA›BRÄÂR¼BTÌBU2§ aôº4Fˆt.á ³Ž¹1K11=³¶’+>â˜'`ƒÁ”h%X-èp‚¢ê¸:0‘¤x0UÉé*É4%$¤«¾Úº€¿zÄÇ{üI¡”Ç¡ºWäG[$HH¦lÊ*eÄ:Q¤†Ü@bŒH¬,’ÌrC_\Æ8{¥äÈóÈ*«=K¨ÿ‚€¾)ƒ±y¾ã³ ‚Q Qq-3KÇH5µ\¿‘ƒ±öS6ˆˆÇ$@Â@ÃÌÃ,@Å,LÄ´¿.DJZTJ HʬÌT¸mé“„¬J—«ÌJÐ$Gq³‰z•wÅ@ÌÉ#DèBˆ)„àÄ=›'ßÀ‘€Óá DšTY˜ ؤClT;ˆDœ3Å#ÁÔÅÏ[N}dNçlNè|NélN{ƒENsÊÈ´ÌìÔÎÖ«:» e„CÔÄà̤úºÐLO.‰²Ÿ³+:ƒÆÕDA;ÓjGF±/˜Û4+äÀÁ;àÁ,{Aº”«yò5±š˜ÌØImLW|PPÿ P ­Ðw³Îò’LÊÒÅ\ÄN2ÔÐ åÅ ¤È¢™JA©½®ûLõŒH6³@¯¤:1ùL<c61€ Y¾ŠáAÉ…X­WÞTˆ×ñÁðS®”ô5ƒÀÓPµgûDÉ68{¿è¼ÒéÌR,ÝR-½·nÃÐãN4Ñg"ÓóÐÔû´ ÏÁ¯‚Ð:@šÃB]Qc;ªŽûCÌ2ÍÍX?Dჶ#ã“A„H ­Ê‘ ‚ÀÉ; D‚ˆ¾€TÀ+‚8Єp=ØT8Ak) µPR-US=UŸÓƒCS04Ó€ÓUÃÌÁúÁ ÍÜ: ¬S;ÍÃÿÑ|CâzOÔL+/‚–ƒ€Ôt6bE9õ»Œ<±È5FåäRiíÒi­Vj=J¤cÕ tUð‚ÕV•U6ôU*ÑÎZHó´ÊÛV¯bÞY׈ÄÓ_}ZLåÚÕÝaÐç€4}ÝW~íWýW€ XX‚-Xƒ=X„MX…]X†mX‡}X„Ŭ#³À›ÊÀXHÁ¨J]=¤ ‘ºãµŽKR¾s¤/¨”΂˜:è§NIGˆ”š«+M>1{=wt%ˆàV¥óÖäÙžÕÖÚñ× "»_Ï8ÕÀ'COu%-@«Z-±rˆèK>´b %ˆ>0¿/ð5ª…È£O7¬ÈÿšE»›õ%ô+Ÿj[·}[¸[¹[º­[»½[¼Í[™2²Z%[_å¬y1'9<×Ò!`›‚ý:`5= ØG$U³Œʤƒ ƒú̓*Sz$Ç0¹Ó‚Ü1%‚Š ˜½Ó‰4¶âúJ®áK?#¹<#K±´¸¾KÕô—ùôËÅû=† ZÒÚÖóÝßMJŸýY£ '=%.7…ÀÀX¦-ŒÒ™*s'…Ù'Õª§Â£/]Ìø‚S8…)ð5$(ƒŠ'>x°KÍZú'@5ª5ƒ:Ýbl—äýÛ7kŒœ ñD±ìßÜDÙå—Á+|ÝÙâ ÞF`à]=áM¯ãåƒÿ¾Ý–>Âs Œý,Ï„2'`*º$(¨b5ò#‚%p˜°¥Œ­Ò:ø”S`ŽyúâTßÚr å8G«cõÀ ªûm*µ¨;›Qg„.|ÝÿeͰËìúKk`Ö[àÔsâ'&^(ŽbYÕšlY8_µŸçÍUŠs=°5ÔZ5G¢ZÜt­)P;PrÔ/àÛ€8¤%à­ôEˆ«*ª=…ü¤¬Ûw1[fœˆ„¡O#ŽOFbü_!à~ñ_Ýžyí,H´Ž8ØK†X€MîdOþdPeQeR.eSÆdÌ´À >Q9Eªþ¢E¢*áƒ•Í 3S°ÿ%`°8 ݪ°;¾ÜrŒ¯%é«á»06'6õ½äü”d®¸C`A$Äh®æ v¿JN‰ÐSÕbêæ1t&~óf§K`6çÓ“böz੉Jñ4 ­/c§•0‘2óÃ2‚cÍh ô‚/»ËF%ÓªÏMƒAØæ0-ˆ‘_^ Áqµ_ßËßBâŽüSc¥Ql¾TvҞܯÉaâH¹Ni”nÍ‹abJ†ÅqÖ¦—çeŠiDçt¶éÑSg äÅZŠà¤}ÁÍyîL‡ô¤ƒPŽÁT3n5cÆMˆŽ ]ƒÄQ!?‚À5Ý ¶ƒ.¬:ˆ€&:˜[Ff¬ìUÿÕV9£«FFëDö»Auˆ %´â>pÍ”Pµ…Y‚ Øå®š¤r”Œ«ª»5V˜]¾€Û:âKýËüí]—æd˜fl]¢€Ž¸n}¦˜¦€† 胱‰» HœÎéÏN:~¯ã=2ÎÑâUF€ N'ÒIWŒz ’NaÓÁkÆ(xe¸ÕÙã‚äºb ¹^ˆÿ/0ï³Â'0˜žÌ*¾éøíÐæ15UÝÙóâÁpWví‹ò:À'Íà(ߘýN¿¥YãDg[ëÿ̸­å¹ÄFE«¨Mh„îÖØǸá¯É¹Š¾•ì”~±AM÷ËnǾ&îîˆ%(¥:À‘W…&~¨°Ù'°qHT\†9o/’¥¤âùžºÑŽ&-rƒÔbP+äèâ‹•Ó$H‚aôï´ýÀ±ú]ÆU™d¿Râi6äØõj½\áF+=0=PPƒX‚Hˆ…±å@-`ÔÝB$cv¨2Kƒ î$.àAÛ%~›>›mt­A€BgìEÏ¥@?ôD߇ˆj Xô:hôo-à áƒ:ØtŽ8˜²>8· òírÑ®o„Còdói%ó+Õ~òÁX†+`ƒÿ¥ÙØ*;@¶UgåÝ«í!æ Í%‰A>ˆZâJ Çã'(  6›œ*TI54ËÆÕz¶ãô‹ =ºîqŽ(w 8ï}¢ƒ €;]"wN>'D??@ïd‰ ïx¾Í~w G˜‘€y€¢÷‚£Ï÷ñ¾€€~‚:¨ú«?x'Pö÷Q!ûÿ1}øNCòEZPKíVÎØˆÓõ¶eNpàäÓ VµvFÐÜš/s¯6?§14wsª…»ÆØFè÷2|_ ]ÏënÖ*÷Ž@LÇü”èp^ =ÍzCúzÎW½ñ6€gp¬ÔÔï 'Ф PTAx²¿´†·1U_ueCÜüúâ¡V·û ëõxd¾0aÿÓòs :ð{ÞKG´°¹ÛjƒØ‘åဎŽMˆhYyÂË"Ì+¹êy?:>P( WÿsW¿ÛBzôgÿ{ç‘èk/xÿ)çã;cq0þ€XàÎ)Na p!Æÿby(q"ÅŠ/6Œˆq#ÇŽ5z )’#È‘&O:,‰råI•,_VÄ€L K†àÄYF'Ï!wjÖù)Á?ˆ"Hªt)S¥51%(u*ÕªV¯bͪu+×®^¿‚[ófβf}}ZSŒÌ ^djõBPîºvç†%D]©S´H5 çN3fáCàÁS! œêÀ©_Nau€A'øÔíÙ+M¨uÕŠ$‡­[_ð\‡ÂØf+äü…HÁ‡¯)˦ ÀËŒÍwôßÝÛ¢K¬‡Ÿ0¥÷fÒ{×¢˜Ía‚¯ø=fRuäWšÊôð“QN¹·â*ôò½#ï¼øš‡s¢:£t3Ï ùü³BAÓ‹šƒCì”S¿eý+“ýLpÁL|±ÕWcÝU¬KLL±Ä¯¢œ5Öb€Ù$DÙ'V…OÑ÷¶LQ²V7·vã·Þy»¼·ßøÞd ^¸á‡#ž¸â‹ÿ3Þ¸ãC¹ä“S^¹å—cŽøb3µÓŸI—•´¶OŽ@pEI=uÕb³ÞºÕ ƒ Ô×2Ŷë pÊeƒœvî¿»mZì+ =Ñ<¯sòÊÿhó’>}ô•ÖDÓÑ cê/ÊPèi€«ß>³†_¾W«Æš²“³§\»[p™ÿÂ(S¬-÷㟿þûóß¿ÿÿ0€  hÀ"0 \ èÀB0‚œ +hÁ úO_ûbZjF„Ô¥N)Þ£Zjº¢'”ê *¤ ïÀ:Üh _(Ö€¥…tÆ1ò»]Ê*#“â02û^µ´QÅCRb‚6d'ÿjm‰H‡¨¨¤¬ô…~ÙªÉòðÕE{}‘^aãôHRÆŒÑfg”È|žr)~•eiMÃÀÓˆÒ©¤ŒTàâ©ô-8æ Ì"ˆ§rCúi‡áÛšPÄ@rÉ.B±ƒüª¨ &:‘|I”Š&§8«Nb”SŒË(Ó÷¾‡É JkŒÓ*ëÕÊô¼Ò•±ÌÙ,SRK‰¤±PÄ^¦R‰º©è£*¡T8PB¶p:(NXÈ|AHÔJ ›5U¥šR¹á‡Z¨H×Á.eÈ‘fƒŠX¿”J”[Qç799Ê«0©v(Ë%¥è){: Ÿù¼¥-ùÉ}.  å1/‘–ÑmÿHY(C—²Œ<´@@Ä$ˆ‚pÏàpt8NPhß,GKبWôP¶) pE¢J!·9:`¦à” ×Ò§Q@Eò}í#U¬6Ù!)þÔ’‚¢}ZÅLÕA]jç· ŪR*U«jÕ«b5«ZÝ*W»ºUœ 4>a«?ÿYV ­µÔ`öÌò¯X…˜II‚;¾ÁðÕa:ŒžuBކà¾ð•/„t p˜MÄ›2[8c1IÏBï*P™¸ÎP^2´Luê9eR‰ µHíjUËÚ׺6¶híla[[ÙÒ6·¶Õ-nwkÛÔV¬iÿÀXÝS\ô÷<ÉUî-9Ç94?Lß~ù©¤ÄU))`$Z!ª ‡/]ÒcþJËèa êíV Ù;¤,µá –ÈÉŠ‘“„Ê×äÙÁJ.ˆ¡ÌX€9ưwÀžÊ¨šÓÞ6µž0…+lá c8ÃÞp…ƒëÅá.×]g ±¼†KÜæªåfYšOœ:ëúç{%È  ÌS8Ƽ£ù×¢M8¡0šÔ&Eq8â÷j•1 ¶#5¨˜ ÂÞ3ÿŸûìg?{Œ 61‰gVÖBú•lUZ/…Ǥd˜{<… {õ‹…票´ÂRÈèÈEòhZZds&ÉWc¤0êÐê ¸:Ö°6g¶zZà(C1!Uú hþ’eA1p.Hf¢ §+’Ê›:ö%ºp ‘#ºƒv¢bÃÞA †‘ ,eNz[<5-…yas£Û·½]÷¹ÕÝnv·¶µ&cZíA×›Ð(v.YX¼bŸÄŠtØ]Jeü]h†6hÖñTŠ#ÃR!tè1©Q—ZšaEçRiU_¬œqrI…Ît~%:ì-]P´eÆ3rÁ2A>ÿ~‡hv‰Ùº¢6|™sèÈ?©¡\Tn`­ÐOeþ3Ó›ît@ 7ßøñÔ©¾ÖÚ-{Ø›£J'BN‰°{N™± Εi‚¼|5ù ¶ºÝàÎÂ]Êa‘‹¯«8…˜öj0/·/Èî.•>8¶ÚøA(çÅ4 ÛT¡Í ÃºoÖ§ôsßÒ#üôËcÞéóV£Ô;èª~­).hAß*ÓÅõ?ÿÕØÛR‡×Ã>ö²Ÿ=íkoûÛã>÷ºß=ï{ïûß¿k&Ÿ ­jÉ7Ue Aàó©e #Û/& Reò~s^݆ €'ÈK“t-h‰@ȿʩ¢Åác@Ïðvwº×ïþÿwÿýðnÔ­îyÚÛPú½7hÐû’÷\ص^‚¥Ý‚Ü$éÔíІdјƩèt(Þh”,|étÌÀÐ aZUÐÆtmÞ‚õEiˆ[ƒ©_æÉà j˜¼Õ_èÝ?åß΀^+UMÅѾ˜ÞŪŽ¹]ì$áZ Ò~ÑN±EBáJaRáZabájaráza‚á2ai‘Ì”É]RÇd_†@žËÙ¥M…AHÇDB“g ™a8Ëß­”%AÞdTŸR¢ù¥Ri¥ *â"bØæ½ËöÌþÙN¢¢a][ù›Sýÿ‡ÔxŠ:á'¢Æ>•‚b)šâ)¢b*ªâ*ªâßÑqÈt U¼áòÐA ÒEa,A/Ž_öEÇ…\VÈâh1T=YåÅû9ãûÉ_4>ãü9b»@bKH"%â_6*ÚèùŸö@UÀ,T'ÊÕS4¡ú¬â9²â:²c;ºã;6 jÄ ”ÝNÄUМõÛ÷õc(bˆZá¹…É–9 ]ø]hù•!:š Rž1bEZäTc=õ nd-]#6ò_}¦ô‹&^×IŠ •<Æ#KºäKÂdLîד¤!¢áR}’Á’04ð Ê Í`(ÿ Ñ…f0ÆmÈEa´ Æ´IßTˆì€¢9ÚSQR"^dWÎ`FÞSGz¤XÆÒG2ʾ‰ä7!*Á,ƒèØ4¡:ª…Éä]âe^®¢DŸ·ÝŽœåÊ„ÁON ·‰Á¬È`–Ìp°Hö&A_Ô4Dªqàâ=’A]\œÊÄ W‚&Óå>å G–æX’åô8—õÀ‘YlÝöp9.CÜR¼JÜX¡\êånòfo²¢+–˜ëÔ Ú=˜]¶)£ƒÕÄg†æsîÙhTj¾’Y:Ïi¢æ,-Ú½MÜQCÉ•DÑå«”Æx®dÀÚ«ÉÚzªg{¢ÿ'{¾§{¦g|Òç|Ú'|Þ§|âç~êgÖ'þ§æçë=!""àZEg¦’W1hƒ:èƒBh„Jè„Rh…Zè…bh†jè†rh‡z臂hˆj¨¾`‹•¤¦< ر¥z::—Æ ]†‰Ñ¨BŸí hŽ’V­Í u®’uJv–¥þ辕ÆE8f¥À`×éÄx–"*ÉSŒMµèè•rO.ãÚa颌(® ‰é˜’i™šé™¢išªéš²i›ºéÍÿ…Ž[%Ôw6…÷$Á1 ÅÒ‡]ò)ŒªŒ•vé VE°ýàoój¯ëbÁô/öB/øÚ®‹Žêƒ<ë½Þ)CýGM|ÿ<© îæh´âµî•ji°¢M·~¤"lÂ<ä'•¯¬QQѹÑåf®ø*ïö6°ôf¯ñ:ðO¯÷^oöÖn3ð÷bpïNð0sðöJ0‡¯ƒ° Ç.[0 »pøVo³ð§pw/ ¿ð Ë0CìÒ¿q/Ý‘“æm\ ÛPÈ)ðëಠP@˜Ø— ÉC„…îý¾*âhV²0Ã2nW@@f¦v ™T¼\—-l2feýX.æjp?0—î«pϰ·pó±;°ß±Ïq ¯ø–ð ˱ Çñãp#2 ;ò"2!—îOÿ²ó22§˜kr2À-ççѤÀÞŽû8 @ÄïL4Z²  ÁÌÀÇÁÄ Àbñ ìDj–Æ+¯>ªtùÛmËTlÙS~A 0È!nÑL(°$?ò%Ÿ0÷*rgr$7²6‹3Ëp ó8csñvó6£s8gó;¯³·³9ßq:{³ ß°»36(d]Yð/5 u)”êI«“°]Ü„Ià>ƒüÒL4ALÁ`À @ÃðØo/{é.çQùo1bù‘+{E1æT˜1UìcÌý¯;Qê‹êÔ5ßó;[² Çs=ß´=ïð9ãÿô Ó3ëóOãóN#u!5Pû´<õP+5S÷t%ïsUõæ¸ÑNÐm£éTé1[‚u߆IMîàb€D4ÁLÁŹoà>YG{ôæoiù¥1#cÅ{E ¦`?rÈÞ}¬¬1‹¼ … jÊØôU75Oî!çtc583öTCr;/µc“pR'2%W6;õg32Tc²fc6 G¶UuœnÝ.©AKkA×fߺ/YÓ¯Y£õMÁÃÀµÉõ\' „¼…«†0+(± ÂØø‰`£1ô9 Ò-§ËÄbKµh›6íB¶jg·dGuw[ö “6h{wo7vOöiƒÿ7z{öhSöuÃ7ìæó{«wzcuÊ éHþðVÊvÞ²¨X?EYoŽ`Ì„lÌMô¶Ç@Ìow’å/M˜Rq3,‘4)Y 5`U˜ñ¬lY[GîÑ«Z÷zÇ·}ìyÓ·‰‡7‰“sŠòx;uy÷1г¸Š³wggöS»xi‡6jswg·‹B—ZÂf´ªoØ9)ûÖ¶L¸8Õt‡|Á!`@o¸«6xŽj1M··f)I7*_פ¢º“ṓÂQÅ–mÙ1ŽkˈÛx‰·vs6yó¸ŒÇø¯ø÷Âx‹×÷œ«s{û9: ï¹ ÓqŸ×ù8/ú|ÿù¡³îS•/W«ÿ†ȶ‘ãk‹‚"‚Õ§;ág9‚Öu5 ùt'÷í@žT 9‡@Æ-Bœ›+6Cº‹6ºžß¸­çù®ƒ®¢#º¡óº|/:<»®÷ºœã¸è{Žã¹£çº¯ã.A5ëÒ¸¶Àù÷A§oQ´äK‚z¨# ¬dV¬LøãÊ”M6äâ97A¤ñ±aVLî¸W7­K{±Ç3®ã¹±/û£K; G»²Ïx±§¶³#{ûeÿû ?ûÀï8h“ï7*iW9)ë­mêæ:R/ƒ;]7Ri$ö|x¹Áštùߘ›|cˆˆHÂÝóÑÄìc°H&®‘Ö&0½|²“8¾×:£ÿ¼ÎÛûÏSoÃç|6óü°Ç¹Áï{Â':Ñ+|ÏC{¾ |C°6‘`Å£jÁq»ZÌ%×{½9zÍÆ´vyÙa«­XÏ1`l™Å¼brŵh "¹°ý½=Á×»Ð3ìƒ4‹=Ò §©„8©×}Á¾Ý}Ñ÷=Ó ýÔÿ½Ïë=7óýçûñÛ½ß'>àÿ<ãï}Žoñ fÅ@$TåO¼ØÕ%LËî§Ù+ÿ®ùg›[®Èf­ÚJí×~íÙ¦­ÛÆíØÞ?ý×ÿþóÿÖÚÿ„xp`AƒåÀRaBˆ .¤¨0bň '^ìˆcÆ G’ü(‘àFSŠlÉҢɘWÊœ‰ò¦Ã“8]¾”©²$ÍwÖ´Ùó&QŸ<{FÄðê’;P©R­`êÓ:w¼<áf‚°aÅ"0;¶,Y³PÅTuûn\¹séÖµ{o^½{ñ¶µšÃÁƒ 6|qbÅ‹7vü2Ô­q'?}XsfÍ›9wöŒùògÑ£I]ujÔ§U·v½™õkÙ¯c϶½úvîÖµu÷.X•ÏÀÿp/`•œUÌ´d—Ÿ5û|,_éÓ©W·~;\¿øT­rxñãÉ—7/ø8Õí¾cqÿ~|ùóé×·~ýûù÷÷ÿÀÀ <Á\Á¬ï©í¤êŠ2ã´Œ9çÔ*ˬØàìD‘ÄM¤î;®Äó‚1s±0“ñ0!sÇcÔqÇ Ë±ô êNH xó I…ŽL2É%™ôÍÉ'{‹RÊÛ¨¬r¶+±”MË-GsK8àª*°ï” ­´œ[æ¹³N|Î8å¼n+ {ôQÅÅ€|ÌFëóÇóÔO"ë„ëP#½|²ËEqsÉF!%MÒÿI?«ÔÒÎ0Í”³M9À-©žê£¢´²=®¼R3Í4¡ãpÎXe5Öí*ãO?#Ô<^óìqÏÆ|•F^m,Ò­ö>µrYÛå”U^™å–]~æ˜ež™æšm¾°SíÖ_`­q_€sýh¢õÍóߟÍ—G‘õ0‰•zQª½´újŠUÃK®»Öú3ÿ Ö ª!è‚*a<>d‘Õ ë/~åž›îºí>ï»·RTºÅ»çfšobç~ÚÖy½–òpFÁ~tqJwüqÑW<ǫ̀êNT¹Ê-M3Q¬¿Þtvóæ˜à§ŒšOŸ{~é£/Úî>ŸݲÊ/Õݳɛä½wà;6â‹7¾*1ÈŽ‹LÎ=[Ë·ôä«w õëíÊ{àDïlšïØ¿‡½õñe§}u¢‹ FCçM6jã3ó=RùA³ÿ~ü£Õþ©•¿[QyŸÞÖF¡3Aïsî0Ð6‚”`)8A Vƒp™àS.• ~0ƒ„àå¨Bbð„ÿ) aêä¡~½|½ºQß‚Cô•'=Ùc!ý ä?ø‡=¢ƒ8%Žéu¸€™¸D'®;ÉA×óšÃ@¿™TTÝ!“Ūpqn^Ìüì”>~Ñ(_6B£°µFóÝÐ\Ôû …Š˜›:2kˆDÔcù(<±Qe ¢‰£W”#–ç©+tBrÚ[th½½ø¥;+Î[†c¿èŒ‘t¹ [88•FbO/Ÿ¤‹­ÄXI¨ñlhøŠ¡*mȾñ N}°cå¾Ô¨4À-rgCbàµGþñ²—}Ä0³tDªD†…C Û¢3=ÕÉ“ê!¡¹¡¸ÒšP1e6G™MŽ­§‘m™ÿ¤[¨Å¶¬’Þ”&'ÿXMj~r“¢Ð7YF{Þ“näÚæ}©?bÒÆ‡?üe?ýiÌnESgú„Ê IE·YqšíÔ¥D»™—q–pŸÔœN4%ãÅcFô-]'v.ZLž¤ÖLç\>é-1r¢"E‘DêNsÞ4¥0ma; ç–•^S£!ÕÞP‰ZT£©IUªœ8ÖH6Ò Ý‘c„Pg¦).-ÝKS™Évf/ž_œ¨WƒjÉ Õ”5Å‹(GêÒSÝnŽ]¥¨PåJÍ„fóœu)E£Iϩզsåf`©·y…s¬páª\ØZVé4v­Øì]&k—ÊÖå²tÉ,Kÿ%ÛÙël–±žµhãBZÅŠ¶:—Ýl^GªÙº|ìLž£"îp©³HÖ…µtÕí8Q·Mzž6Á=-U.êÁá¨õ¶ÂM¬ro;—’f4—ƒÝ&Á)Øéú·zQ+uµ«[‰v/£cl-;õ:XÂ’µ´Žu'dÝ Söª·½é=¯ß;ßõºÖ¾ñnKÕ;MþÚ׿ûÅïëKà ˜³ùíïD œà‡VÁf0‚!ü`ù:uÁuÍ­vØjÕ´4«‰”§êäˆXšš×z™ ë1)ÄQÀÊW°,teuÒRjŽÆè…æŽéNÀ¶åÄf=quº½ð¨Ó¼ëK_*Jý6¹ÂQ¾°”)ìÿU¶>9ÀSÖr•ÝKe+{¹Ë[þ²˜ÃÌe(“ùÌfβš'Œæ5™ÍôsšC™aÍŠ¼ 퇩ØÌzŽ—/—­ƒ¬âÅíTR¦1î˘<ªMKç¶Pt‘sûÜ”Šw¦‰Õôy›åø^Y£Î)~™<ßï€Õ·›†ñRYÝjW¿Ö±–uj1›X§nW‡f2¤!e²i›ø‚iñrŠ)š’pqˆ]k“sª|¸Ê@‡:à%âÀNXuÉÂÎZ։⦸«×ìRSÇÜ£4jÑÍîé¤[Õëþ¬»KoyÖÞ[wª b4íz9ÿ¦­)‡@í%ØYÇ/56qÝÀ}ÿ®˜:§ ó¼È±áplÙÜ!±ïÌeª‡«‚³„ \Àä(?yÊMÎò•«Üå.W9ÌiÞòšÏÜæ9¿yÌwÞóžëÜæ4ÇùËUn.GæIºÒó%<½åpˆzÐcþôš[} RG¹Ö™Žu§O}ëT9Ô¯ö¬‹ýëeûÚ»t¬sëDo¹×çnö¸ì9»ÙåŽrºûÝîh¯»ÚÏÎö¾ç=í…Wüáÿžw¸ ð„üПøÉ·]ò|Ç{ã÷nøÍ»=ð”¼ÞCyÒ³ýîU}Ìã®sÑ¿<ǯõ¤cËP‡þzÄqË)8Ї‰?…K˜ÂèÐ2èáÿzø‚ºÕ‡/èÁ O™Â„ݨ8_G65SÕ,Na Õ‡Ê ¾ð…ƒcÀåg>š1ò×Úz86!þL>åh~ù£ð¿ø0`ˆà)´@ùð)–@à – üš!±¸ º®1°Ÿ20Œ.Ðèvê9p<`FKÐM° FÐF0KpO‡ _°IðcUMðqgp]Ðsph‡°P ƒÐ…° —°ƒÐ£P Ÿ° £P kPµ° ¹p ½0 Á°‡p ™° Ï Óð Ñ Õ0 Ùp ÝÐ Ûp ÿßÐã a­¶Þæß*-´Š*äoÙОÏä¾à0`Ù8 NA1@↠~OùaÙ¢Ïô ` 8î)ŠËѨ;”ï6чm1 àœà† ‚à fø  é¢ü—tiÙ¤ÖÏÂ`.åþÑãžÂRð ®mÙ‚@ùà€ÙÞÂÒÊê;–QP{¶ƒÄñÅ| ´ÄàMKmƒ8 h³â[æbs$ŒÑ° ‰p‰Ð[0“¥ûÑ2ò©° ÿÑ 2!òR "ù±+R"²"÷!ap"7ò!1R#ÿ-2#Ò#õ‘$Ò$ò"E2$[rÙQ-d`:-Ó’©öö,?LÄ¢«’œà žbŸBþžb>.ŸÂü0€š2.ô€Ð8`ý@Ÿm=慵≅òà–í¢b žOEQ ~ïþÈé ÂT€ïžÁ'OñüŠrµ*¦€eѧ  @ÑÈ‹K¬°.†ÉÊ%äöMÞSsÜѰ(Ä0#Š1ñâ*82!ò$)Ò ñ±$ÅP37ó #4ò3GS31S%;SK4Os4C“57Ó5_S4QÒ3U$QÓ2kó5g³7/“6kS7?’7ðœ¼ÙÉÛÿͪdëªü,—~ú€ÜOô(ϯ1༈‚à:¯s‡Òÿ ®ý€á’í-œr(½@*ŸB§m„M¦`>µàã P-› &i``Ò/±°³Äs<ËS;±³èà 8@-1€žï:¡’ÑFŽ…¼qÓI Þ´§y ",KèD£‹¢ºÑ”Rô)ÖQ±¢©8R6òFw3G‰sGSRyÔ ûq8;sHm³H…Ô4q4H•T ´I}ôôG¡t$mtIuôJ¥4J©4‡ÃúÉé&ý×.®£Åøà ‚à´@ úÌ3ÿÐ)ñÚº²Ïo(瓯²þto-“2*ço áãfà*g±?1 -Ï Ú|j“Øtýô*Ìs¬¯— ü¯É*UšÖƒ9‰T#s¢B ÊUʱ¼H-²ê¬/æñ)‚à¼o^Ä«HR5Wµ£r†;Æ6cð{°X7óX³ð}0Y»pYq°YíY»ÐY§5 «Õ £5Z‘P[©µ »õZ¿Õ[·uÁõY‰u\½•[Ó5\×5\É•YÙõ\aÐ\­ÕXÕµ\åÕ^¡p^õq8ª Wýp^làÌ´Š€ Tú¬¯]q(—M³1ôÀù€.½R¡aœ€ØEÿ³ˆc~‘c®âSt(SÐQ'b¹£;ì2L*®ÝÂ))úf€bYªÓanð'9V ø`Ù À76=u6f=4—â±[ NcEE„DõMVIF¡B ‚` 8fEuõC»j}u“³.j o°_Ñ•Z×–^ãÐmOPmãÐZ¯5nÓ–n³n_snñU\Û–o÷v4û¶]£pïv ·nWowp47p7r!wqóvþUc1@Ív/š'Ÿ“¡Q)×Ï¿`ô€”ºã*ù€Äó Ê o5* Í'Å3µá5Y²ˆPç3®Ó ºÃÿ€ºòAö R”T÷á¼;ù€h×€–7›‘2Fh1ú$‘ÿÐv9tûø2æÅ0ÇvU)d2Û,Èô«½Vê·êWÎÔɦì—ð—°âNµ`þhuŒF–}çÅ}s+䨺lª2{44[K³ÔJ)8‚!7O’K]ò‚-8ƒ™ôƒ'8„µ´HQ²„óñ„ExJ;øIYx…GJSXK7Ss5æWÏÌ­â tÏôLsòLΑ¼ ù¬±@Ae”ˆñJ=8·=¹ Ñ”˜§"„sý–Óš†“z±“B‰s) k™xš8׫ÂÛ±HrMj»o ¢ö†'M1õbjáÔÿУs;p®neyø`ɶc`òlà3kPI“©pa³ò‘ ù‚K3#˜ !Ù‘+™‘/y‘'!#Ù’‹““9‘y3“Cù“Ù“-Ù”)”;Y•Gy“_y•cù”c9•aÙ• ²•%ù‘mY—y¹‘iÙ5×>?§tmÏßn'½§.*îtÛ¤71ç$P/̳DJõ0QõâÜiõéµÀ踿M¢,ðr¼™Uc9ƒžãYžç™žëÙžïŸóYŸ÷™ŸûÙŸÿ '÷_°Qd`*t‘¡I—2ÀXEÄ HÑþÚ%¢¥EÀXD¶ñ¤ÒØ›ÿœ@jGôòJ¸X+¹B:€Dú¤Mz¤¿J¥Y¥« ¥Wºlsf+†ãk Ea’h?úâ\Ú¤;7 ƒZ¨‡š¨‹Ú¨©“Z©—ú5½tÛiEcº¥_ºio’‡•)­hšg¥šG§š·Ú«Kiš%2=èWÁ:œ)sKLÏj ó8ã%~·G¥[í¯›U¯·oûZYÿú®÷Únù°óš°û° {°Û¯›± [°[±%;²!;±+Û±)û²7û±3Û²;{²?[³A³CÛ³OÛ´û%·œ¥¶¬¶Cˆ«G¢¥“VjÛÛEm@Õ¹1s;­5És ÍŽá'§ÿåq¸åBm˜š¹›Û¹Ÿº£[º§[ºi¬µùâVÊ'yÏpO}£„¡‰Â{¼ÅÛ‰Èû¼Í›‰Ô{‰Ø½×›‰¤÷½Û»¼ë;½í¾ïû¼åû¼û{¼ýÀÿ[ÀœÀ•èÆÖ—B„ƒ¼Å{ÁMfÂÅ›Á%ÜÁÉ;Â-œÂ/|Â1œÃ7ÜÃ+üÃ5ÄA+D<¼×ú»ó,“(Ã[¼Ä[¼Ã+ü©›ÆkÜÆoÇs\ljšÅcüÄ{}õ¬öz¡ý(æ- %É#~+UjqŠû”Ê–IvÜʯ˳\Ë·ºI`…\»‹¼s”#MƒÛÌGDÜÀ«Œ4ÍÛ|1<Ô{ÿÜ\ÎçœÎëÜÎïÏó\Ï÷œÏË­5é Ã\»?ŒÎÜÐéÄ” øÐªÉA lÒ#]Ò'Ò+ý:ý)@бL ÝÒ?ý­á ÈAýDÈ­ÌIÕS]ÕWÕ•ª9Àª‰<«%ãfjÝÖo×s]×wÝeœüÏ[ÍqØ‡Ø‹ÝØÝ˜Ù¦L% †ü&©Ï£]ÚÏã»<Ù³™+PG¡®Û»ÝÛ¿Ôë¤;ýd}¡É‹¯´Cݳk.\•Çêê©Ȩê ö7¥Ý=ɪ›®«:xÝßÿàÞi=à Þàá^ážáÞáâ#^â'¾fCÓ7}Ó­ƒßÿÑ:Êqãm&ÝØÒ§äë&.JåS^åWžå[Þå_¾äûm`ã;ýUE¾ÛñÜwžç{Þç¾ÇøBçIdÉnÞ]ø@9h¾æŸè›ÞéŸê£^êk¥Dådº´]=~Ëèíb.~é™þ.†AN¦ŠB~}N†~êÓ^íמíg ´ª¾Îºƒ«äÞ¦à~DÚ+{¼åë—žæÁ"¶¾ ÌÿïŸðËÔðg¾ð•ÃðiÖÁâñÝ,ÜàñÀò)ò¿â+"Ÿòò)æ%ßóGó=:¿ôSŸôaýñG €_öc_ögŸökßöµ` n_÷wŸ÷{ß÷y¿Nûà÷‡Ÿøÿ‹ßøù“_ù—Ÿù›ßùŸú£_ú§úÝ/Š’Bq è€fNƒ ëÃïÇŸüËÿL¼^ÓÀòÓ_üÙŸ ºÞýÃ?þç_þåŸþÛÿñßëÍ¿Ü˽óY ¸ñcƒ LXð ‚‚ þ8èf"A+"xXÑ 5VüøãÚHàÈÆ 6ž”÷°åËš.mÞ„©Ó¤I6òx 5)AÂK /ƒúüáîBSwO:­Ó´Î«X£V}Jõª»:S½‚¥*õ+׫^Ë†í ¶éZwh©¶}›õíÚ¸h¿.ù:u«T²sÙ•›V¯\§[ c½PXíØªqÿjÍÿŠ5î`­kËV¦ŒW°ZÚ;¶ÜøìÜÑœ7_þ¼Ø´åÍ^Kgvš4ÙÉWC«†í÷iÞ¨cßÖ­ûµhÙ i‹=>ÜtñÚY‘·¾ ]8æäÔ—«–ž[9aÞ¶ƒ·­k˜<ùìXµX²ÄÀ)ð×/qºÀˆûøó/HqÄþüá·Ð}ÿá`~&¨à‚÷}Áàö=ˆ_IùE!‚ZˆŸ†rxá‡J¸ I°Œ÷QøQB5dQ‹±XÒC 9QC#aDãC©„@JÄ4‘I.ÉcK,Ùä†ð¤ lÜÓ TEåOGuR>Í„äãõUÇi¨mõÿÛTô}—×xOYF¦v¦YeÖfd¢XT€‰õ—X|:^gÝ•Å'ddNw™žéÕW9º¨a”ÒÜt_]Zh¦¢a*©q¿ij§›~ššf¢¢J꨻•š*W¯N+§­² ªªµâz+¬«êz*¯¹»«¬½ û+±Á";,­ËšJg]µÊI)byÒÙwN½7\¶ÈÖúG BŠ8¢„å&8`ºætŸ†2hŸîÊ« }f¯¹ü&x¤A?¹#C µ˜"AñxÑ…”‘C9’Ä‘‘aÄFÔĤ’!ýˆ%’'täKE¾ô“IT*õeR+ƒù¥<%—t'±ÛvÿæÍ|µgžgΉóÍ’ýXÏ`1ôxgfª4X‡D:mÒp2º´£~î,×XmÏRìu5Uw~-(£Vu*WÐlêœ)ÒkËÚöÔlßì¶ÜpÏÝsÝxC}·Þqï}v߀ÛxÞ n8áoó}¸âˆÓÍøã…7îwâ‘CNùåŽW®9æ“gÎùà–{.zç¤÷ÍóÙ§çü·êiC}: u¨W{´W¦ƒý‘{Ÿ@Š‹P‚È/ïý¿ï‚ú~˜<¼ðÿî†Ï3(èÚèÐEØÛxð‹ÅhpïøIãK\>F$™_»”äFJ‚<MIQIeN=­l’—ûååQ?HÃÿPZ´ÔÁ_H ê0…/Ô‚(P‡há @¤ê@œ‰°Å™è@‡›Àu€ õPÁžÉ€€ _x³ ži_¸Ùôp ¡ÑP‡@4 ¨@þPˆ>X&hk£¡-˜@=,a‰Qœb —hÄÎPŠJüâøÄ1z±Œ] "×xF6ª±p|£ÁG:ÎÑŒwL£÷ˆG>ê±€ü£ Å8H4ò†L¤ýˆÈE²‘u|dŘÄ?‚Qˆ†¤da µÔŽ/àR×íz‡ Üxõå)WÉÊ{_ʋރ˜wŸ0 èAOröþÿÙˆBãCÈÄ0R£‚¬è_ðÛ‘Ä8¿lŒGy&ÈÞw¿/¡Ì'ÿC™5‘B²–EÙ„ MJÂÄ/Ìà†7;DϤÎ:œƒMìáϹ L¡7ÌáÞy¦>чë|b;Ý)Ã02ñŸI4ç™ä©I/"´’}¨ÐÐC:xðͨF7ÊÑŽzô£ ©HGJÒ’šô¤(M©JWJÒI²T[g“›'®r Aü!åïÂå;ÿX¤•;¥‡â WFO_°tÞ,š šJÈD?’ˆ€ÄË rÏ"ãklDpµbQ4›ù#°þhIÎÄß5k¢Mú$'J±’7¿‰ÿ£ÌÕd¬ƒZP¡½†ïDà) H‡ œb ñ´Ê´€Ø~’i%¬ÃláÒ2öu†üë¿Y=8ñLÐÃèpš3"ôâ)úŠD ̵8@&'PÀ€Z¸è8ð+‚Ö³(<ˆð…)D* ¤Ã“ÈÏØQ°Ã-îZYˆú°º×µ®A·ëPî1»àõnDÇ«I슷¼Úí®z¿{^ó®—¼îeï{ÑÞùƾ镯~ñ[ßýÒ·½Ý5à^)‰I‰Nr{E𧻄°ç‡ªÜݸ²Uw±k\ ºð¹Œ†T6¨Å[ô’êTYºòÄ>)˜»‘„ ÿ“E5ÊÞ0³VÕøaGêØFœù0ø‰ 7Y5wä‰Ü„K-û‰—–ܲÿsKZ(à$î7[ínoF„~a _®dS¸„½NÁhzÐB?¿@ÝxÀz½Ù:á çC¨0qnânæÄ Döð`SÞ|³°p‰õ¹(™Ò\‡0œ3…gòs?ÈåžÉ‰{À9éðhxêU>œµÀB«ÈÐ š®§oFè<ÃÙÕ@kµ¨gÍjZÓúÕ²†u­ó|ëXÛZ×½Þ5®ëbûؼ¶²lf»ÙÈ~¶´} íjO[ØÔ¾v°·½ìhgûÛØ7· îq{[Üÿ¼~u¹Ájtg9¸ AÕ3\öAX݆oº›ˆ§¬ü©„šGËã‰zȳ—,iZb½Hað{ÀvÌ ,«SXú^T1¯öˆc[bqú’é™,)K?°’Oäj?ú©¼J5ùß]ç*ó0¹a¯ ß9g~îuµAР^µ@‡)á‚zeôÔ\IÕ=\[«q~ê^;¡¹ÍÝ«Pè„ NA¶ú$³®q>Äò<ÎB×k}†ŽXTŸ‰±zÕ`×Y8`øËN³-JM„ÈÚ :Gp3}Àû=Ø·ºâa=õ±;¾ñ_|â/ùYGžò˜Ÿ¼æ-_ù8_~óžïÿ<ÎEÿxÒžó™G=èGŸúзžõ«/ýëeûÓ»¾ö¦¿=çaŸû¯çfKЂ¼S{3so§¦D†K âæƒÈùCMjƒ¾ð‰¨yÚSXD"a}7ä{¹^¾Å:U éHb&“‰Qb²‘ð$äN:‰Úp’¢„Œ F ò6ï?ó–¥AÄQ²Jájï´W€g¨W8xë´²eSð\*%äð‡Eue¦W£÷gò 8z‡@w>—t§°W`&4˜C#¨€"U£f?Gw§SiWa ÏåN`wq÷v;hä}„¡wu.ˆCC;;¨vøÿ‚T¸„VX…Xx…Z˜…\¸…^Ø…`ø…b†d8†fX†hx†j˜†l¸†n؆pø†rH…`ØuWôvA3Àt–a/vo¿cS B#½³|ÎbB/Hõ|WpÕ§pÖ'"G#YÅbqq÷"Xåß§Ìô‰Ìíãc/a>Ã$?2?Ð- <¡2ò—-#WýgW+ãQNø§27çzõAà+„„s ht™ÆNP\€§@XJ¨S0TWx8w¾„4ˆJȄă@¸u@¸aFhۘ،Âè‚€ÖËXfDÐZ—‚SpŒ} Œ8'ŽCèÿŒµWaöi8z¨jävþ…’Uu¹„tèW8‚Ù ‘I‘éy©‘™‘É™!Ù#¹‘ ù‘"‰’$©’&™’©’.¹’/9“,Ù‘0)“8“-™“8¹“Xȉ†ê)Á'|A y–Æ|LârS)áo~xˆ¬Ôp G}JåT°”ž¹AÊ:*žGª˜Ez?Jš@@ƒIªÿ˜<º˜KêÀ™UÊ£QJ¥\ú£EŠ£Aê£`Ê¥a „cª¤MÚ¤gj¦i*¦iê¥h §hZ¦rʦtº¦uê¦_Ú¦vJ¦qЧkª§~ʦuš§}:§ú¦z¨Œ*¨ˆJ¨€Ê§…º¨“*©‘z§Šj©™Š©{Ê©ƒª¦›š¨*ªŸê¦ozšUz¨tª˜P[Š)j‹Yþñ¡-ÐÆt;2 ijŞS«4 ÍWbâmàaVéˆ!Ò!&æ• º;íG–Ú‰10à–b18$ÏzVFr=ò­%gd%2Y¢;q,j?3‡~Ù2íʃÙM5š˜@ø ·i¯Š‰¯ã‰ÿ¯g >ª¯ø°@X4(°NÀ¯‹‰°[¯¥i°˰«º° ›¯ »+±ÛùÈBú§˰‹£KšK±{²${š% ²)‹² «²0ë²&Û²4û²2˲6[³3›³<»³>‹³?+±: ´D+´=[´+k´A›´L³C«´Hë´G µTÛ´7[µRû±Zk²«¯«º¤Éj‹‰ €õ’S¾z Âs|ºú ÀÚ«‰ ÒBÀ•'}LKJe<’Sšøbú”º$>` VÏú0!Q—¢¸ccu¢î—V©H%Qb®äú¢+¯3ê®ïú2¶Xþú¹ º¢ºÏàÿ¯¥;º {ºÏÀ£¨ÛºDк@°º¢{º°[»£+»¶ »§»£ëNKк´[»e€ºÃ+ºÅºÇ ºÉû¹Ëë¯Í Ͻ£+½Æ;½Ö[½Ø‹¼×«½Ù«¼Ûë½Ý˼ß+¾áë¼ãk¾å ½ç«¾éK½Üû¾à ¿ä+¿èK¿ìk¿î¿ú;¿û[¿ý{¿°û¼|¼ ì¶8WºÚ¨úÆ«kÛ«o«  ˆ‡̬®¤•Ëz·Ö×!J™} c ¸ÖãqÈÄ>jÙ~>r?V—C2­h?X¢®'%Þú%´hÖ{ƒ)@@ ¯ÇàÃvå—OöÏê[ÀÃÛÄæ[ÿI\ºJ J<¼ÄìkÅXLÅR\ºP|Å`ÅWÌÅa<Ƭ¾`ÌÅd,»N\¼NÆhÅNÇU ½XÜÆk¼ÆiÜÄbìÅK,ÆdÇêűÆQÜLJlÈWŒÈ‹¬ÈÏÀÈìÈ<É’\ɉÉ—LÉ™lɌɬɟÌɘ Ê£,Ê—Ê›œÊ¨¼Ê¥¬Ê­ÌʧüʲË´Üɰl˳ŒËµìɹÌË»LÊ¿lʺ<Ì~|ɃŒË…\º„ü WQ¯þª£þ „S)am;.z|*a¾ªÍ·«8‡Øˆ úlM? ÝÐeÐÐÍÐÑðÐ-Ñ]Ñ}Ñ ÑT¬Ä ýÑÒ=Ñ&Ñ'MÑ ÑÍÒ*Ò-½Ò.-ÓíÑ6ÑÒ ­Ò<ÝÓ>ýÓ@ÔB=ÔD]ÔF}ÔHÔJ½ÔLÝÔNýÔPÕR=ÕK ¶Ý˜) + üoºª¶Û\<ØlþùÕ@Õ<|b ÜÁz! úaÑ=nÐ%ÐÓ ¸Z×d‰d©Óz‰Úú¬î'0(C—SdËP3¼5l%<Œ®Œ}®Í¡P%w%@²(@QIJ¸¹I$<}°*= -ÿÚ@Ú¤ÍЧ]Ú>-Ú§mÚ¨ÝÐÑ©ýÚªMÑ®ÝÓ³}Û¸ÍÐÁÛµÚ² Ô¹ÝÐöºÛ¿MÕÈÜʽÜÌÝÜÎýÜÐÝÒ=Ý M&IüÐ^Kܸ £vÕ¹Cá¬ÝD¢@A'f¼C9¤á3Ð>2”á}@¤C âÅUÚnã> á8žãÀâuã¬]ÛçÄã¬}ä6®ÚG¾äI.ÿÚ€\H~ãR®äL.åCîãRŽ@žåQÞåBþå`æb>æd^æf~æhžæj¾ælÞænþæpçr>çt^çv~çx>æð „-Ú@€S‚¶j{p»ŸþrK¹zÁq‹•#@%@=Ú•Hbä¬Ö#&KëC–G­Õ*LíG.ô=¢Œ«ß;†Š3 Ãè*ÐäêÏü—G!‹’ýi˜¸8WAÌC€™M£¾¯>¼?_žf¾~z áKì䯥á .Ò>Ëžá’•á4hæðeNícÎS`rÞ㾌yþåÝîCÀ*®á|ðåñžîô^ïö~ÿïøžïú¾ïüÞïþ^ïd2Úp°T|ãe@Þ^¥S×Ó}à ÞЪm€ŠÞðŃÞŸJÊŠÖËšñrûa/Á ê"?­‡Âò ØÓšÏ@Bꀽê0,àÎÃ@væ:R`æ:ÄMë}yþ¾ëx ‚yW? äî6>ïCà_0ïË.YìÞî­ÊC00ï8ñ>ã@0AãCpâñÎôL¯á_`îB¾õžìÖ®âMÔ[K‡ít 3€ã¼e÷to÷ï¬YãçîíÎáDÀåCÀ@žU]Ÿ÷3ï„oøðŽí‚í|`÷ÌxöŽùC ù›æœÿùžÿúò.úBú£ú¥Oú9nú©ú«¯ú‘ïú±ßú´ÿú²Ÿù°û·ßù»Ïú¶_û³ÿûÂüįûÀoüÃüÅÏûÇÏüÉïüËïûÑŸûПùîàTŽýÍãZMñ^½Í 胈ßP©´ÕýÂèæâÞlíñ§·Ï#éÒWÎCu‰ÜC–xíq7‰wò¥^®@à@l¼1Ð ‚„6,hÍDŠlZJRQc¨‰ÇØx`“Æcš‰$INô@Ò#¿Ažd#áÇÄ!|lò9¥Çæž|†ÔùR“Ï’/_úÜ dÆ'_€ðÑBd69œâ3e‰Mz¼*Ô§Ïÿ/7ÍŽ…*õKU>Tù 3–Ž´z– á Å¦†8±i¯–šulö9jӉΛzÜñ9$•´­Cª9E‡§“šŽq9+Ԁο¸êí£7ìN֭Ѿû¦l×´aÏÆ];÷mݽyÿ¶|·pßÄG^<ùqåÍ™?7}¹tçÔ¡OÇ^=ûuíݹû¬Ã¹ç üÖ´ùê“ÀüÜXF‚ñÃV@üF˜É@sÍ•p #$ ß]/Ýuó ñ?{üð?YÜ×CÊ0¡Z(… "¨¡)ÿBàÆ‚œdƒ#Š<ŠøGŠj¤ø¥Ž”„xÈ 3’€b؇³.`¬P›v`l(rRlŠ)œà€4¾Ðã‹U!øb‰Fù`Š `}TΩpþ".1ðTU ›èè´)›Ü™=¼TÌÊ ýâ‚!ùYeHƒâI¬:ðèRè«Íjj!@@ä²e­kÑK?Új$æ"Y qÿQò\£ P¼»Ô]¨]ž„€äÅ®y…”ž´¾ìŸ‚Hà^(*Q‰f"ì!.jÑDjd¼ä±AasÞD$&1"±! ñ13¢#"™äCž¹Œb~„$%#`61°˜¢ô!›ïË&Êè' ~! C*¨Z­ Uè…›EíÄ'¸DmfÓyiç(8&=XN˜‚ à@tEh_¾0"b ¡^À?½B:èÓ¢^! ;&ª"8Pf23 D)Ò‘z3Ÿ\ÂÍô@Bz -÷s ¸Ó—öÔ£<ý©O:T¡5¨G%*RšT¦.Õÿ©J…jS£úT©V•ªWjV­ªU¬nÕ«]+WÅúÕ±vµŸßÌÜqŠ»¨Ï&‡LÂ|æC9Gª'Z㢫å2w9½šÎtB]ëtÊØ‘”«›ë^!5ö•!2¦î8´¢Xòn–, Þ‹F0ƒ5o ¡ˆHóFÆæYŒ$ÞKKŒ„=do$ÆLI´Ç x€¶Oò‚0 ÛÝŽpžýÔ-oy{Vâ׸ÆýBo•{\þ¹í§Oú Ýlª¹2ÔfMÎ*Ýì:׸$¼nxÅ;^ò–×¼çEozÕ»^ö¶×½ï…o|å;_úÖ÷¸ÃÕ-Þö8Bˆë‘@~ðÈi1’ìÿùÁ7HWIåÕ¯l€¬º»ë“§3l(%´aÙ©r•øB‘‡2°Ë& ³¾ ^òR„‰ÙG¤­È07ö¼‰$áßhCª©1#UOB’f’žé$ñý@›Áí-’‘¼[%×ÉL†rn£üd)W™ÊÉò”µlå-SÙË]3—Åüå1‡™Ìg6sšË¼f4³YÍm†ó›åìf:ǹÎs¶sžñ¼ç;÷YÏ~æóŸhBÚÐg®r’ëP†nÓ&íš]ƒP‚ 3²‘£O{Ø€ƒÜG[˜†p¨EaØq¸Ô‰=,'E¹XUÏK²¬ ñ‡YÄJÛI¶ÄSÈB¦kÐjäx#+­ÿh'V#˜p$ 1(6ÖZ §!dHúqõ`«1‘Œ ¹Åv–Œm/ ÛÞîvnÁ=nq—;Üç&7ºË s«ÛÝ醷¹ãýny×›Þ÷žw¾í­o|ïÛßý8¿þïœà7x ¾p„3\á ‡øÃ%îpŠG¼â·xÆ1žð(?ã)HKoù`×íuˆÀ‹´Ö1‡€Jó¯+—‰-=êQ VÕ…Õp«Y]XSãî±´Q*æ;Þe–EGrQB&ZæE¤Åkq2w$íê}ã-àÈi+"f6»zÚ#Ä(âíÞ& YÈ2@¹“<èCšíow{ÜÛ>w¸Ó]îuÇûÝõÿnw¾ç½ï{÷{à?ø¿ßÙ ÔÕ­P˜Û‘s®À~ù§S.×Éõu=›£¹élŽ.Å®Úu97õ©3lX©²²³öùc‡¾z¢›8űe Ö#!s"ÁÖåÔ£~ÚgBϙ̖^3A½$ð#Ú!Ÿä€ÜÞw8…œï|u4ÿùן>öµŸ}îoßûÝÿ÷Å~òßüåGÿùÕŸ~ö¯ßýí‡ÿûåúÏßþõÇÿýõŸþïßÿýÀÿÀ$Àûó‚òª®ÙÈ›9•s¼P{¹ ¡¹h¹Pë¤NJ, k$5 AÑ+=Ǻƒ¥ˆµZk½„°¥†9\ÿ2˜p쥂0’áQ‰ð&c²aR’×Ò:"Áã;kz¦$Ї;à¶´ã¶èã¶)¤Â*´Â+ÄÂ,ÔÂ-äÂ.ôÂ/Ã0Ã1$Ã24Ã3DÃ4TÃ5dÃ6tÃ7„Ã8”Ã+D@óé‰Ò-k°À»œj‰¼¹²´Ê —Ì+! µ Ûa|Ê…JÑÑ%Ñ5ÑEÑUÑJ>ÿÐLh¼ƒhNóHÂc’$©¤‰pÏ•ÏRZÄ´¬Oøtȳ<µKœDþ”K‹<ÁÛ„ùÄØS:\ LÁ”ˆâc˜çɦۑ3Ìj;‰#™EXì±³6Ï”LÕÌœTÓ7…Ó8•Ó9¥Ó:µÓ;ÅÓ<ÕÓ=åÓ>õÓ?Ô@ÔA%ÔB5ÔCEÔDUÔEeÔFuÔ9ÝÎ:ÝNrI¤•‹À¹:0Ë“;È=¤9Á²9·ÄOû\ËR%=¬Y3Á£[ˆ £KØóÏÞˆâû»$:D#ñ€áa±\•‹ Ž &Š˜Œ@’×úÁ– º” 1ïA Ù*™‰ˆL5åPÏ\‚GÿÅÖlÕÖmåÖnõÖo×p×q%×r¥ÓHSœˆÑK­«ä+G:Ï‚<È+ ù<¥Rê¼ÖÁ×"%,#]ÈQ•¸|UMûË%ÅI‚1(:cXÙk˜à©‘-%ÅCæI%‰‘—l-ñq&“`!ù±í)‰"{Ók¥VsUÙ•eÙ–uÙ—…Ù˜•Ù™íV> Sœ>>D0ó Äõ+w%Ä dD RVã°EDÚSuÄÕqË|¡H¾1ÔÛÚÙ ÉYµK)åÜKaë‘áq˜PÐK0™Äœ±b Ôž¯SV]Ÿ4MÙ¸¥Ù¹¥ÛºµÛ»ÅÛ¼Õ[ºµY9} Íœ¡ÿ…œe€À˜¸´ËáGôѲ|!¨4}=£Ý9UxaZR‚¸ÜÏö¨DÞ©H¨:¢»,ˆeØ)ýéHѪ‘±=†#¬cÓ~H ŠÑªS- Yן'™Vk=Ù½ÞàÞá%Þâ5Þºí[8}‹ç³ÙS$Ã+MÕQXÁ]ÜUþø<ÈÕ†LKIJÜûTZÍU½þÜLER'ýO\C±hÁQÌ¥±5ˆŠBç‰:‹¡ºØZ¶0… f]B囈7­Ö5=Þ6àFàVà–ÌäUÓ¿½ƒ·XWÓÀA¬¤¼^ì R¥…Èv˽Ïð _Ô#_ÓSRß ±Xÿmß[²¥ÌÂÕ¯õ%Ϫ‘^Ö=‰á©]a%[0Õ_­›¶­³¶ñiB5]‚#Fb”eà%fâ&vâ'†âDuàþE‹’>ëµxåÔÚÊà÷¼9!ð–¤uTã@ž+UáSÍÏÖOK1ƒÕÈO|ÒvØã©U„謦A` ÓÑÒ­Ë:0uP6°Ž‰ èÝ(VäEfäFvd(žb†à ÖÙwõ«e¸‚.†ÄD|°0ðá‡DãËUãR¶Ü§…µ|qÎ=_‹ÄDH‚¼|ß›e#E‡±_§ ­`Â_Z¤°ÛÅ’!æñyäcFædVæe–ÙçóLÆ€è‹`JÖÑÿ ÈÊZMþ¼øße¡%ã×Q6årŽÈ¨•ÈÚÁÔd7`eÞ™¢ÓO¼¥xæ‡íé¬|aë%?>PüíÁ/Ój“VcfæƒFè„Vè…Ôä•d jöŸÕfÎcT‹OPú‚ÉÍ×ÑóWµ$ç&%A\Õkqe7Nߥ%†½%£ ’}~ˆ:ÞKÙëKÙëµ›îåúè“è‘$ÁX&”V7`è¡&ê¢6jfvf‹’L+v¾_üÙŠÖf 4cD´O#Mã>cs&áuÑ\=_@DÒ‰|ÕÓµÿŒã…ÁÌ2‘±Å`’_=˜øiÈ$âHä£Öë½æë¾.Þ)ÿžSN†ê³hHİ ß©æWñýh‘vlÃJçTfÒVÖÏ{Y‘Œ–PÎU…=1L­ˆÕØÜsb#蓈ւ¦ˆ607ø„mr®íÚvÛþ‚hÉm»ÂþÝÆmà¾íÝþíã>îöGãöÇÛîíÜ–=ígámê–mçåíéÖnÙænî&—æîîìïñ&ïò6ïóFïôVïõfoòÆì~oø®îçíQúvƒüVýæïý^þÇÇop/ðûŽÏíWðg—‡pÿoœ3pÑïuù ÇðåÅêQÞÃw©/hh8p€ÿ ñúÄjÑé«~ñ \ñ±ÜÇ®q¥ ia'ç/ØpsÆñ¢ÍàlV hë•$pÞÀ‹V—›cK1^qò¨Måu^Õz9$ÅlŽcÞioØËZýD‡Ø¥†èÚ3íÐNs_jk“‡hØf9ضóØÆó÷Ží¿ów^<ïï^îðÞóë.t>ïÚôëvMðÇ™€í’!oG÷Ç8oJܑׄmÀtÙ¶ôJtKÿôFwôÜùôN?õF·tGwtQoõVwƒUõFŸuXuOÇu\ÿô]õ[—uPçnX§tìôö6öcïî÷Žïõ^öøVvð6ïfo ÿI$Eoêö휨nn‡¬my€pp¯î yÞ‡Á†›“‡¤°ípÆPõ$t¯jâwœÃwîµFr04æè·ðKµz¯w6ìëEò÷<0Ds‰x ˆxcÈ}ÜÊ­w)çxÌ-e*D±ŽluÆÏ˜x^X†(kPÄ5ˆ‘ß饸žá‘¹Õ~Ì6_¾ñAyMàÇ7_ô>ßG;ßíØ~sFßs<·@?ô¦ßmÙ~ú§çîBOúªÇú¦÷ù`'vìb—uX×ôRguضtN'öbwƒ©¿uR§u_Ÿõ[ÿz´—õºû¸Ç{»×„Sçu^ÿŸõZ7ï_oûîu®GöÃ?|g‡võ^vh·îù^ügoî÷ÆïrœËlÏ|ý¶«Ê÷qp _ðx§z¿pR-øù @ñmVlnÆ÷ [µ£]x!á€rÏ+ãùlqoË„_l¶Ìý‰µØ6$W÷ …\‚Ÿ}ï-ç ol ×qÒKU°žÚeè4TvÚ¹Êrw޵ËZˆYZ£ söÅ%ÚÛ%•_ó!¾_»y›Ÿ ]š‰hú«ÿ™°CïsØŽí¢çî§7?º)èæ‹Á„þ0a‚òŒhÑ Å‹3ZÔdУ6 ‚DàF“Iynn,ÈR$K1WÒÿôˆR“Lš,wêìÉ“%Í ú¶çåÑA .½úaëzŒàîÝûˆ%Ø o¾{÷ïèË›gŸ>½õîÙÓ7Y¿ü 7Èç×ÿ?€çyl°’ îdž:©©´º+²¸¹ªÝ²×9;´ëI»Ëp'íyåaÛž¶ö½W_|ÿö•n|á²_ãÞ÷_ù)( €Æ»!Í!„ "á¾Zøƒ?hÂÀmˆD¶˜áC%Ú¸F/VTcŠ9¦¨RÅG$RF%¢¹&A@6eÔL „¦GMÜ”Sdà7½TÁ àè‚ ;'TšæA6IjíD‹<ä1§ªM kgé ¿"¨°­%Qa들ü·í%2‹² 9“·‚î8­"–a†•Ð…V‘T„iœæ|¸š%ñpÄBÕæZt¬/„£O\ÿU܇2nr¸:”¨ZäŽ(ØÆ¡p“›ª2s«2¢‘VlM`ôr9Ñ0k9˪!ó¨Ô=¢‡uIåV|’`­ö¤g>ˆ´í ÉžþHï’í*’P¼~È?ôôúÉJÊ«eÀõ¶/7¼•F¢D¥:Å^НaØ›Ø,Å'Ë„á¨!Ã,W†€r2„i¢˜årR¹(¨?šh`ÇÀ %øï'2ÑÏÏØMl:p›Öô,ÏxZ¢,PÕR*¸1}©%Ìà:s[ÏÒÓ hŸJ˜OzŠPwéš×ðd6»¼pPÈ=ÛA£›™1öSS‰éMxÃK5·‰ÖõèçÿâÓãæqgìélNÚ9&¦·‰¸Á(æ9½\18ãÝ¢ä"#0GCUί:gQ¾9@B ¯³N§`¢ž.Z>i¶šákÉgI}ªì°ê-AVõvW¹Æ°ƒH@\ùÉOËôH¡µ@"y&­dH#ÏïˆiJQž° :ßùþÊ…,"‚eJƒ‚‰K1é@¿œÉ‘nÙÌצ¡ œk2W²M-/ð&7Hƒ¹¼³ÕŠö´ß4­–;›Z6pJÌä,•$kAÜ¢SºuÓò΋4M…ÁE!\¾V6¯åP„bá_fhÜ*Qof„Ì ºCSfoþ¡•³ÿ^žâÔŒo¥4¥…õ9›>tÓíè}sõRPSNÕ»B¢±6 Fxô§‡ñгŽjG;ΑŽrD[(ì¦J8uxdªw0Ü-qexÃË$¼ØÓ¸£Äþ1}j†cýü^7ÐX‘Læ®´Œ­b¸C¢1Sâ5È䋘+ou.v$»­E(¸4“À¤%SjÀ‰’å™°AìNÄæ—<ÓÌz 6 ¸ÀˆG\Ë—øiÇlñÑÆ¹æ$'É&(Û§¨ßvöàWòµ©]-å¼ô ·VhD§í¸Í½¹¥txj˰ZŠ N¨DÇXDMcºÖíå4Ñÿ¦F'¦3˜‚Ð÷(ÿòÍ»KßhÓCšÝÞx1¿HOâÑ‘UEŸ¶èkl°i„`ë;þšÁEe»v„]laË}ÂÈŽwÈ“aB^xÙåÚðßoŸQ>2?ÝÆO·æŸøÜøïükÀ¸$ €µìÛ60ؾL¦I ³C¶$²môËì –Ç$Øçb×Âvä"!ïåË|Yã‘d™TmHh¯¿¡„áßN­™µÜ SœÌf.¾LÈåâûDùkŽ=OÞü|8“HcB皎4Î;ë™û)ËpåòJNÑdÑš¢#P­U…7Õ}K_ÐVt€Ö¼2™[hªí]Nqn™0©ŒZßtÚÖeÝI[|ä ÿGWÕ Ç§lרÀWÏù_§¡îÍÕéZ³ì”«(ÜñšÛ•vè² ÛR%› ÂÎw˜‡¹TÕß} ¹RV© {ÌX¸ H¸¸Øáý]‰ˆK·U’ºí‡à Çð›@ðøˆŒÙÄp^öÀÒõ ÒÄ\¥Sh_L¤ ›ÝO–lÖNxašéL¸r‰2UšóMi½¡jŸ55ÆŸRˆ\B@— ‰ÉRxÐÉ=…ԈП=ÍÕŸpý™Ë×ù5¢¡ŠoÈ¡½´À¢à$^‡~×u¡Åè¤yuרíߤ X**OÙ!XHõP­4Ô|µÿú\LuHQL=ÚàXÚÒM6K¦p`ƒ#ÛàÞѵ ›3Ö n˱MXßeKR±à5j˜º8 H¸ô`à%Þ/Äí|ˆ“E“’ J`ˆÉ$ÓM!½ÄHŒêÍȽÄŽqH(™÷< OÐÌP„ÙÍÐVL”¡™õÅåžÎ<ñ%$¶áòÉáJ¤¶–gmßÒ°Vô]äš‘‰õ•IɵޑŒ¤n} A ø×¤p…qe"]0nØb Æ ¡ßWHÀ EéŸCWÞ|ÆU˜âx£eW¬ÓaÙyÚ/Q†ŽÿÝÔK©"Ö‘ Áè¢H¥JUþdÿ²Í #zà®A‹ƒÕ‘Q¥`¤¥[V‡[fÇ[¢Ý›]Ö¥3JË씋 nØÞý’R=•`⎠ú †%ác¡IPVuÛŒÑ$¥ÌDxÆú`Å<Žx@û ÒõÔL|LD?2ŽÛÈÙ„vÕÅ jF–š­„ƒEÎæòidmÖálÒ¡– 9õ¦ë‰\ÆeÉÒHPmqßÊ‘_q­ßT¼“s5'NV×I®Zä_æG aÊ%FÚtD”Ïy]Ïéu~gÿ ÿñ"™åX¢×Bå)fÊzWfe¯AQ¥KyN¶TTZ‡ØWÖ½¢Xö2’ZòÚƒ­å¯õšÿ€5£[,±qGHPϲÍ]_fã%›U¦ìÞ_ ÞUeź[ˆÄÁpÌ·¡•¶¥ÁðˆB¤\"V8ÌXŒA¬U”&1IÀl Oƒ\ÜJ<’ðÄ´´c§–1HÐlV\*…Fd“’ÙÈT©¿åaBÄÓ•¾a›õfì5¾9…ö)Fâ=t¢×$—VÊp¥P?µ@Ì)Ö©Þ)ÎôÌ­Zeà ŒjM&FO¥ý)%ÙˆJPnŽÔ С¢)¶šQΆ ¸€/`ê¥n*§vê¦fê¥Z‚§‚ª§jª XàFiàüñã€Î«é ™'|êEÿ ðWM@Ãô§ì*®êÁ¨¤ ã~( ž%Zh2öš\Šà±ÂaÔe›°-ÈQ\œÇìÛ°ñ¥5¦\Á™ÄÞ=–6z¨†¡Ž™† IÍ`Ç0‹RDfZÄÐkAÀ¨,MŒÌàhÇä+!Ò1Bp¡ó-Ün ‘NO È‘¡&pæ”F,DZo²¡”Ê!Ç%éã´A&àÁ(\À˜L_8} Ê©<¨CLE æ™ÍÝÓÌuJ´¬!º$OîÅ 1×™Ú“À­Ð-Ñ­ÑÞÜA $ÊûålnU‹Ô@À@€¸ƒxŠÞÿxº'H þ†Ôç–F©Þ¦²­ ¸mÛÞ‚ÛÊíÛ^ªÜ²-ܾíÝ^ê+V Fa¥¥ùF£Eåx†ZØÍâ.¶EmÒ&-Ò"­xÁ°¥y5åÐçu<Ñ0«±•²v®\†`2ÊÝc0è3¶àA˜ ^¢ZÜ̽iAÁ 8Dü|Å‹m¨^bZàÁ!Ä€;ì€;@‘ö+9‚æ·¶ÁÒbŽæ¼R®R€ÐA´HÅ$ÍC¼¬õ^„%¯< Á!‚Òz¤g]É–QicáAS)ÅxEÆfÄ^\7MPº!ÅiB(LdmÙÊTY&@À3”ÿ3Ôƒ+p9¥oÁþ!Ij„ÔÁ!ü«>’iA'#‚¨´@ð8®;"U†U´Ao À!ôà…ÎV´A,çð,;,Á¸ÃÔ±çðÀØ‚À)‚´’ZŸødôr§à8nÐŽ°ß,ÚrŽwŠ{â'fPT0îE±Azö¨ŠB7ıñϱ(ÐñwÃÇÓñ×q7À©îÐ*^ÿ±šz—à.eà~ÔS*Ëâb@äN2%cÔAÓ£v¸°ÊIÍ@ðºƒÁ¬ ìÀ²6k´8ëÿ+CkçÂe¶r+éžÇ]Fã±YÅ´>³qõAí¾Åe\` Þaó§H@ @ÒbÀ\íð íàÁyȺJDü O¦œA\óã2®€ÍjDç5Åʤȑ]D§¸;dBÜÁ! Á@³ÐÂi¡oi凴@ 8A h“DN<œðѯ6Iä@[N¬!>¦’4ERIÉÃô °äÂ3˜Ã/°3œôI#0I#Í8_ôi‰‘çÔîI:ÉÉJf)Í‚ A3nx±!³<A#-XÃЀ${±;Xâ_ %€ÂÌ©hA€:ñÿñ3ñ\uÌÀ œÂ)˜Óêž,„--@€èsÑ:ÁŸr‚Å*©Á"+V]'D]*)TÇæ€àÂaÀaS.€a3vu.P@döcöæŽÃ-``xjQ+ ÙÎâ¾§W*²cÆü€x%¿6lc@À%cè#It±õ)DîÐbÀôÙk³~Ú=X‚’ ¯A˜n@£éBc·ÊN±yb8«$¤ŒíÞ‰û]„&ó7¿‰¸CÐÖA ÁpÀôÁ@³o”&‰F–À–Ap€-€ŸNÁÿÐAœBQC@ðF;L˼œ@xD ´´Á!xùövÑjñ!gÁ>“~ÐÄö8Ô@¤²ñ¶OÈE,Ev§@ /`øŽóB(¤€ÎøDòEœGc¸—AI30J/9“Ÿt=@ ` мaÙð:K¸<œÂ3ð’ÊçXt ðºƒË5”O à ¼Ä50w¹W—,AÒA ô)àÜ9HA Ä5Á ¡PŸLY—õ Œõ¡Xõ)4ƒ¢cu¢51—µY5(æÆ@YÊ€"صÑZƒŒðÑÖ+ Xa„H‡„‡¬vmÔÆÿ~ÈjÏ:«¿ú«c/W&ÆÚ-aÃådë°Ãåèd;€,6±û°“Bg¯ª,º"«åöÊ߆6|­Øu'a­$»väJr¸“»>c²¯Q¥vüÀ ¸]×uhL)éÁ®Ò²;ĵKAˆî,?7´†n²›Þõré>èéæru?5¡)§ÌÀ$'OyÛGXÅ€»ÐÔ:)‹ˆ@Àpz{ûBÄ;‡h }A@óÁbÁè³A€ÿ¹B\ƒhÆÂô`@ÍÐ 7Ñz¬Á­;Œ–KŸØP€iÿ ô{O­8„™FÃøÏ¤/ÄCœC*œl€ÔŸ@*œÃ5Äÿ8n2_hA3´’79à3¹986\òh%ß9ý;|ø»¤ÐÁ$´ÇnB&ìYI@ hÁA“:ÑÊv ÀÁ€3í<6ÀAé‹Ñrvblx äùˆü˜¼ðÁìÀÜy€‹S_¢ËÙ…8ñ6Cî¢Sâˆ1|ÖX[Ýš5çbv´­s§Î7_Üx— Á yÞÿ…xU>D6ê!rÊÀ’%ð˜A€'`õP8ï€ÓD½Ô“Çbx¦;€Âª;(¬Ð çÖ ã2ì ÃC2¼¸òÜ@ð6<¸ÁÄKD°DàZ°B> ¨Ãûêp B„  DMT,ÒÈ"[4±<ñ£‰T6ã ¯»nΉÀcTnÅ#U,F‹ffh&8êqFÍ5ÙlÓMsÔ,¢ /Ò(‘ȃ|Q@ –¸@=âÔ <耘!Î@!—EQ€FÀG%N'¾ªÂ«Êx†àc…YDx>,½C˜7Jy†;A-N@Ý 4 ‹ÿ殣]×à£ÊðÀ‚;–í B36Y=–èã">ˆ–ƒbøà¢-Ú˜6[:¢ý€ƒ/f¸€ Ž¥ì‡ñ-è‡6ÚÖRkœ¨Ã-‚˜¡šò B t¬´B†"k.ä‘G­®š°Ô‡'dXaR›qj Æ*c†µÚXa/ÞØ "hrÁB*—–(ç‘—aŽYŸ—Ëa–BÒf&¨£¬©§FøA †.Z‚0Šæ™¨›á ~öù ¡Ç3Úè’ké­¹–Ц/ ðÂ+®È.»+>:ubwt¨à· úb„v‚=~ÐkŠ:¾ò¢Æ ÞzzÿŠ)è˜" =ø"âÜÁã±Ç!‡{1Ç š±Ï4óLjÍ3ÓóÏ'3¶Ä ½JçŒ8ý:)8Ø.Ä×#vX y‚Sϲ?Ýhá¦VŒ! Ø`é†n!6XÒwhc†;ø Q=X%`ƒ@HGÐCÂS6¢C‹û  o‰:¬©CüSˆ‰ƒ«èpÕ a}8‚ˆa÷!¾p 4<Ãù·!Q)zÑ ÒÀ¢.) A šQ´0ƒ>Lp‚DÍ P‡!` mÐíT„078F<ØA†*­kƒ ]HÓÑ€ ìЗ‚D$0ibe‚BÎä&!NETÕÿ˜D= èKxÔ%X!™Å(r‚Q<£Šòâ ®)Hi9w(Ãßð8ÀAê`cœA‚4’ŠBbð…€a@‡bÄîF ;>´ÍAò¤#Ã.Ò…Ø!‚î0(Z$YÄÉÞˆ€b„«›ü@1~ñjq‚“›<@'9 (˜Ë’>sà bà§DÄßœà-ô!§pÇŽ:,á˜ê1Pˆ^XÂæòŒ³ñš^Ȱ)2l‚La\±&5Ïæ…C4Åhƒð†Nu®“íT§5ÖyÎso1Ê8¢2–é`úðç#þÿéO %_ÐAC"“¢ôÄ) ÝR˜s‰N”¢•BϲfLáhÆ2˜P"ZQ‘VCkI1éRzÆwˆh+s©ÂÒé… @&BÀÜÞ¶ àq}¹Ë¾ÂüqgpS\¾Ð—0î.aàÀ80–²L•eRÜcšÒ¹Ìaî2ŸûLg¼º™Ï€Âtª;]êÄ`'Ðás+Ø™ÐÜ.Y¡ Â. ða¢€@ð7<Á°kB@6ïüÀzáaC¤ŠC«;С?ZŸNÙ°y‚™=Åg)û…aÁå)ýv!èxÈþ ø[màt¼C¨@ÿªç8ÂfpÌ%¸£Å5®ØÒ‡C,Á @ÀCnIx¤i¢IO"] YCFN‡»0LE"À ¶(I*2PÌ…f aˆoRSßë 8‘à%Èíã÷( R„ê@&6!QhZ00i¸ÀPÐC«J œÿ”á ­€ƒ1Þ „ Ï“3æ2œ€ÄkQš1¬ŠüP–üÓð–6lF~Ý_"³«Èìn …%¸ôþpe yòhV¸¢U­j‰’ÉJfr’‘­¸CEW¬Ü‰ChBV¡ùÁŽ~Ç ÔáD¨Æ Pxª¹:@¨ÆOjÞÿ`hZQ€À•Žt CŸýìg@ZÐ…þ³¡û<zA >À^ù0—?s Ï€6t 'iMkšYÔ$™A0‚Ϩ $! À#`Q’r˜dÕ*›Ç#"QP˜„d;[¨RPêèƒüà‚õ«`­!Xᦠ=i è€k‡îúÁîu°«ãëa$£%ý‰²‡âºaL¨oܶ V†å a S•\MÅ™ThŽe Pƒ¢=ó¡Yu˜ò¦‡6èASÐC.P9ÈU•r8c° :hJM«\ÍœX-r…ä-R‘¥³øuK7 v ÃìÄp½ßÈ5<‰ñ¦‚#„ÿ Þ¯Åðò_o€¢k€¨‰…QŒAkf•éY- ³–µ÷÷ŠNtôä?¸}üÔƒ:¾þóŸì@¶ò:kM|‡$ñ¿¹&P´@/µ oöÂøl´ƒl! Y§[ŽNчœ"uËKÂb! ˆÒþº‹øÄ'>yzÅ5â ³ïpt0›'÷¶7¾òuÆ?8ˆ ;åÉEÓ“â4€ ]X­—ë]EiAf°4¦áH]L­  °ñ† ¿ ¡Fˆikõ#œ`™€ƒ»í;d÷U]ºkšíÐWá±P‘2D«sh¼(´á9ÔVÿº.é,(7Y”Üú@(¹åä%‡K•¬$ެ|òä?ã^HˆÀÈxŽ€Àð­NÁ´ ^9‚@j Ïø _†.2°—€_ˆN5_@3èàŒGÆ))ʉ8 /ŠêÇ}Êßfð.lðïâ Ná9Zà&|!#ZBp†#¾`ô!ª%ÊÁal& 7‚hÁØ|fÙp'Â`$ÊŽ`‚§×š­É@–bªŒåÚ¦* ºð iŽæÂ 7€ »ÆÚÊ"¥Žb¾ +XJ[ªš®‚§ÌÍ úšªÊ‚ oB$dæ´ T }ÿê.è`ŠM1Îmà crN(Îá¾j«@ëD±•>c`Kx¶ûdˆÅÀ¦ *`ÇBòpBÖÀ7\ÌUFàAê@€ ˜TnC$Šæî`ØÚæ4D¢B± €@Àƒ@k=ˆCBªŒpèf€éîj ìQú€Bþ¶È` ì   Àµ¼N€¼Ž™¢o4A„NDI „¾‚ôÞÁ¢ î$ª»°úÎ vI³f „Fˆ¼nÀ®¦£ñ6’ñO?’…È  ¾äNÄ/ ` @ ŠÀó:MÌa&‹`&=¾FeìôDI¦ÿÇ :`õtA†iõ6(7á(_ÏõZ²À¤a\ê ²dÌHºáÂBEŠo.eZË?„Bœ9ê@È*©’\l$,Â`V®¯zÇd(­JGaÀÀ ü* ,Œý,©‰Ô/\Ü/þÚ/þ Óý¢ – Ø€"V€æŦ¸–À ‚௜ ÙâÊàt¤åœÀZî`œ`òì*$À`Ü€RøàŠ+ƒê`fÓ .`|–@ḂTà®7c36 >š©Ñ ó VGÓ`p9_Ћªßâ8Kë¾ t :A¢ü &´³.Tæô¡fö‚ÿJ/@¢Ö®0k0ê'4j Ú°×k¸°×ès ‚%?ñà‚…?÷, ?® j~` †m>á €ð“@õ3?ý3@[`@¯ =·Æu^§aúf:fGÀI ±`ã ¨Œ©.&bU®blœ\ ÿ˜…’LÉàâOe³e S”T©Œ'<ªfyb-1`Oÿ3èŽ@˜ÂAG € ê vàgvê@i9À4Õ9‚2à~§>rä”ÖFêà$VIå·BÄ –€Tfʸêå¸êÀ+R0' 'GØ"Кsne'ÑÁ†š8À"&Áà;±So&pSbæáf„0q páÕ"p=B l Û®ðÖbÜðì`B8tÝ”sµ°t»ðtMw:×@tçRJsU®u9wvC—sQuS·s»0ûJ— `÷¤Æb;XjÛô°Û@”+:,Ƨ ÃDßæ ÜaÃà?>.vÜŠG¸ƒT‚à.ç bÀ ¬Jr ÿ°†ÃrÎ nsŽ´•ŒeH{ÁÀ¶¢à J J·à îJà ˆ ³âÖÀÝPª" J`¶È4b#v¢NଢCŽ $ÊÜ´LÅ”­n«ä å¼ãA¸g f€`¦NXïæ"è„•ÊÅ|d8ªæT "LäE N€¼ÎMËÊ 3¿®CÖqÄ^ÇéLÄY8h†®^òÀ @CìC²Oƒ ‹rÌönïp«+òìn š€„µWy5¶„'ÝxûR ¾ÄHÄd%W’:Oó¤Ž0 þ¸øÀ<Ì&gr2!O’Hô€:ÿà'ÅÕ è  tA\+(‘2)_õFAÀ® r¯Å"ìA†@à€´ T¥Bªn`3•š/DÚYÎPaC£­® B@LáTƒ…çÜA ìf‚ˆŒ9úÀ6 LCà ìhÖ"øÄYäÏe­¹eŸ kŠÓ ÿhÿª¸8 Nsi‹kÐÌþpÕ¹h•v– !G €T§gœ€šðci‡k˜. 8­wl­¢ŒêÅ*ìCl‰ëŸÝ6½¢Ñ|â8õ èÒÞ ¡Óß4únñV: ¢oSqEz¤÷Õ`Á#HZ¤GÕH¥UºnÁ¡Âk¼F-¥ OÿW¤tú-ƒQå|š™ztU@ç¤ù¦ã³¢’q§3x¢Ì¨?¨‡š lê¡FÀz?ÎCøÛ6ˆ€Š«GÑDéÀ^§Û,E#éë@B– /¾` Âq .GÕ·®ôrÚ7¯}¢sj—~I,°Oà~ñ`Ä{\ì€J¤äø*¤Ä9¦d Âà€Ý@Öå!·À@ÈTƒí ®¸9î€æ´P´7X`` X[ÄìN{î`ø .ˆ€2è>|Ä‚,ˆÒj»t{"7/€ú Ê.àx.¿F@B¼ ~ÉàírDlƒÀˆ¿îCZk™ÄNBUíÎÎ ððëÿ`Š—´í`Ö@ìÀ ˜ùZn J ^@ð´[‡À¤ç×aEù]øÄ $@ ÒÊa@"V4øBĬB´Eû4X€µòž‡Í£Rn€#€õÏLÓëe è ¶w»ìûÌ>8`­†`.àã èŒ^ÕÃè(S½Nž•ö.=~8S]ËÂîžk»É«²Õf Ð ¦êÍ{ñ7¸LÉ ³ ïú <ìÛV±àšÀ|¸ºe«ë<_Çk¨ ⡎ÏnxiYÙëY¡¤©Á%œ&k’‹ &ÍÄÍK8þ ¹(sar!Q’Õ5À¿(_ 0yf ®®,-å®BŒ¡†ü§g뫘»ÿð§,MÑ’¢ß~Â@ èŽ ¶@6` š–˜‰àÉó³þéßÈ ¦?K`²b€FŒ°dƇ 6üu Ò]BløŸ\|¼@8$a HƒI.¹ãÄI—¤Ø2`ËÖw^îÜñ‚álÞ±¶ÄVP[[ˆ©SÇ „;F¸é„ÏC§ \0pjÉ©!w0ðñÉ'eRk8½ðÐQ«Ú%´,áƒáÐÈ1†ð!¢Z"§œØ<¥gÊ”À„&¬'±âÄ_ ð¹+pÄ$¤|±  € ˜¿è{GW¤/_Ö\®hÌ¡G› í–›§ º‰Œÿ›¤nÜRhl°Fcµ54€/þ[xpã¿­ýþ}„Æ‘ Gœ;Ÿnmúƒ½“_®üûq1Æ¿7‡°áùuèϵK˜¢{n›ô½ ëz³æýš^ìúìJi‘‰D @âaZÖÀe–2h“YaaààNxáì0@Zaà€’F"%ž(à\#¢X[‹# `Œ.ÎH£S¶ÙxãŒIœBÊô˜J ´Š2 ¤ò x!F“kˆq8)Æ“V’ñÃl6ºñÃxa@QHE5À@*¨`2düć=Ñà> ³fš[”9¦bÔ1[ ‚ŽP–q0E@ÿÀZSÁ’FJˆ:hqS À^è!h©Pø´Á d¬z'«UN,qª®z«®n`“³Ýà°7¨&A@P‡IE¡€Î>k‡klÀ¦!(°ƒ͘°EQlA̰„ò¤1ì°ÁºÀ5M(³j¼òºŠk½óÞ;¯2Ù\ƺÂÞ0‚8A@1͘cŽ3  +ŒMÄ?S„9E”QDÆæ´bW–¥:‚¤ûB.g<ÓÁ3¹<4è³4ÒlBL6ÇŒÂePx‡_ÜVÛmBTÐÏÜñ W6Ñ--1íU[ÿ½†¬€ÂŠ6apZ-<^,qEy|›æš'аx´@uqEvã[¡Âžj‡áÅ3þá 9DC9~D;Ĺ@!Í)@8D@«øÖÔáNFÙ"Å2ÙRJ[Ä»-ÖØdML pʗİÃu`˜Q qŠ,¡,¦AøäE§ãzHÄ]ñä}œnV§(ú˜µ‰äØxMqJOÍÏ ©`ê+fØbî/Ö˜T-”äe'ê€K‰<âOk(f† â£!‘hND Z”7%iàn(<'<Ùàq*8œë Ç:Ï£Sÿ9 Ç!ˆ xˆSžïá!pB^ÃèÄ7Í¡Žu´#ë„@zÑHæ“þ1ˆ]Á ܱ„$ª$Ds)PФT ä§#59‹5žñ•;œvƒ]0€#R¥xa0Q‰|H"&¦hE,JãHjdÀ1Žsœ#Ð ² vô8Á@(ÀHʘÂÈ@%'µÊJTZƒ#³´%¡ááaø†¤°¶-Ô m*ð Z'eÌÁ&v@2<©*l jä0*§m6À´õ!%KH >ÕI S˜S0€ôð@`ST.l’wȽVe·ÿ¼Äo½t¥*;¨ê'ðÚ†à_­‹XÀBH`5wPAWÐJ…RA/XK0PrfYk )9E 0ƒ4x ]éÒD<šÀŽ[Ýkb0B“,ZQ1L-^'Hðåƒs¼ Áb¨&BÖŒ¨ EPÂþá•–á;«G¸‚±‹e,cÿ8ÚÜ   Î&¨³©Ô>’6„“m¢ ›ÈÅta3+جÄÐÅ(LÖ‘ÿøÄ ð‘ånó;JÑ'bXU*$•—ƒ¦g­GpäNVœ#;(Á!¢ÒÛˆ-Gn˜äð‡Ô` «t=âf£Ð-±Nkèð7=­íÿ KúƒSÄ \@q”ƒ\ä$B‰Tâ"£eH¼$hA {O¼PȱE}ð‚ƒ)TC RàíÌ·ƒØA·³E8l)ä®  간tÌà ‚-¶·¤súåuP©ÈU¼Ct„3а3¨ÄrØ cçAœvP=Ù¤Ðà×Ú‚P-ð“ ;PÀ†àÞöþ ]%uÿ®qxÙ‹^Zmxªvu‡©Iô£®ÂA6@ –[+Ø °0s`cg›)W,æŒ; Ãb Ë)6þAÈ£TDˆ0\ä"©Òx ¤º +ìƒMÕYOÞp·È šAÚÄhs› Qà8àP(ÔA£nV@!;”Šzg²¶=ÌËÐ&ó°I5mšîØK 8p´Žun5‚4¤)y‚®M´ä;àìEv!ÉEdò’ŸˆCÎ(!§ Á3ž(\àÌ|˜ŸbÛ%t×›ßmB`„¶èÇj'“8b»¶Ø­µ«ÿÁèöÒ .Iz‡"X»¼Ìû{ç¡S”¶3Bð1 †0*¿x²K ¾ñ©ïרŠ:`ÅLÄ$¦}Šù‚ûÝ€SH¥)™L‚I¤ƒ “Ìðÿ&üûãa$2·àCG&"VB°TcdÔ0ÀA¸b:Ah [0˜A66À±B4Pbâ¡c9´#dCXp£"s±Âd5è ²P‘6Ò%Nd"B0.ÐÁG_Hq[)±@à:a b`Há|åõAÀ`ÿ3gsöDjgu–g_ˆg06WI<Â#}h¦¦ Rÿ‡àOR%M2‡ŒäVU‚%8b#?à¶° % ý@x5°I¨VTppí`'¼rdPÊpˆ§V„'Õ ÀK04 “^–1ýÅìµ_ÄЂͤýU^öµ_·örT*²”E^0NãDRÐ Zaê@W°âDNå4ŒåÔ:ž£Në$Tï5K;0OkÒn¨Ônó¶«´¨à Ä J÷voå§pmð/‚ÙÀ>à*…ã4oHç4ÐŽPqªÒŽô¢* ÀYà/ÃT§RcÿÀõ€ 3Uwà ëgêc)F)ìÇœÍiïR"†`'2a$R0–Á$¢œ1ÀžKžp€‘!G:Š_°º XÑ1 ÖA»ï¹c2$déB衺Kÿ²+ ˆ0”ŸÓ‘Ÿ¿!BÔARpduíJ4Ø:×{œ51?¡j"É„™ìU<@›ã‚PQ&|{š$ÚZÀâ¾7jgò;£7º¡<Š¿zVËp†ç€†Dê# _hvX‡NºG - .‚^° Wð À Ñ`Á„ȱ*à‹XfÚG`À ÁÐ @ˆ¬À IK²¸%?pK7é>Ð~Bà~€ðÍù~ÈôŒ±=8w@‰ª c%N©€Äîv§i€Hð5Àm—ZŒ© ¦x À©ê$XaL@€i„µ&kRQÔBˆ ®ÿ% Jš”-!ÀoÈB›œXRÃrp‚v>@NíHN¿ê®G¬§ÇíÈÇz¬ 8€ )PÇêò}àÈŽŒ;Õ0Îð £E•ür8á­#÷Œ «°3'MNÁ ’ ÷dÔë37g__°€Ð¬Õ Ð ‡@ÖRŒ÷¤à6N7°P¢ À¢ m€ ¦ðh5ÿA¤–Ç{|È Êz/þâE>l ‰ ^Эsùr$À/‡užÜÉp wÐYT§à®^`HÛuN‰qÿ·4Æ©U^0IJ4‹„b®Ò*¬ò€m "à ÆP9ðQ°5 @HÉR´Cpd€ ò392p¸ ½ Â×\Â#ܲpXÅi²àL Ðé)«Q ÐÑðÝâÝÀ$!ni¢µ ô\ öë®Z• ˜ DÐ$pØð 9à~Ð`Ó"t°¶RÐBp —àp KñÑ# 0P 0`ÝP #íîÒf`—`rø•£:èÄC@æ_p!8q!ú@€èc)ðZ‡RLÀ>$ÔHMœ‡Ñ_ƒáÞιޗa¸Åw`•ñSmþ@@ÿW-ë¹F_PÕ‘p­‘ð© AdÝ"¬‹;Pôž÷¹‚m½B*Fds Éë‚Ññïaòh 9ßgíž|Ýc?¦/–"Õà "uœ_–·•\‘ÖdõýfrVg¤ÁšßU<œ½ZN00¸©’âÙ3` /z Êu…ô{õWŸ…mF± †?À7xP›Ç7wÏ7Að ìà¿~ß#L LLÂ$th‡|€ÀŽ„‡ ÷z¿^ÀÇÀ À Þ}túD!pÊ{w &y—Þ½p ˆw÷›— %€Ë ¤ñN¶ÔœÜÛÃÈÄÃî§epsÿ@¥Ñ3­_™¬xÐð'ànzœ þ @â oðâ DpÏŸÄÿ ^Pþã?ü©âúôòï_‘œ¹ÄæC+l³œÝ²bE˜ÿZ¹lçN xJ)¡”-'.Ñ£§NDèHô"¢x’Ž+6Ä5dԮݰ&ÄŸN›rä æƒ;]!øÒGÌ®^¼¬¹ä™ÿA2 âDL’$ ¸aŠ–­Aƒ >d-°õ.ôBÓ[Pz=ñ\/„pBØàˆB8âÎ;­©‚9U´Î#hˆB,9i¸SO<íÔSÐ<CQ?35tÏA5]ôÓI_drÕUу(0>†èã$:è±øˆ &ŠÁÍ f6Ø`…5vØ´8EØSPœˆ%´–Ž)”}0fOÚ% PV‹cö!ª3×ÜÎUw]uÓ=w„tá•w^x ÷ÞypCÞ6ÌI©¤JxóÎ1¸`VX™<¾ÐCÚ4ÁBŒ5(^ãbŒ1&Š€Ý¸1ŽI‹^$ãfˆ®Bpu;ÿL°;ްƒÐ^†nè hÓ‚)Ýœá"*œñœBH=€Ô#‘?„hú !€¬:ˆ%‚àá ŠþâŽÄض‘ ha>¼€€!NȈŠT¨ @qÔqF˜r¾ˆ"•TìHå …Ћ’ ' Š´¨‚j “É¢‘<˜ ‰&„2†ÈŒhæðbŽ`¢ÁDƒÉj¨ˆ!N风 g„† ú{öò*¢ R¹ˆ£…b¨¡ '© hf胈”àÀ›ÊÀ—Ê𛟀 Œ2ÌЍàxé²É†Â6<Ók"/¨1*ˆføâ, ¸íU*wÿþ ÿs¢µê\cƒ ˆhD'¼„7° xKЋÀ!pe ^C~Ð `1 ŽYɸñ‚Ê0ƒíØÌ„0ƒÑœF…¥¡‡ôÖ×àLg³¹ÃÏ€U‚:ð¦8¾ÙEqŒóÃJô°8=<Àrq a H€†¹˜@ "ƒA@¢·òTÍçƒ,P 8ÂÖ¨Ï%Â!ìÏþ¹Ävpˆ$È,I9ˆ@Á @˜Áé€>xaŠ•†à„%,Á @Lо°„¡zÑ–`–²,EàÑŽtÔÉ!…ÒH@*R°"HÑM.pA!pñJXÂ2ÿ`Še-c™¥WêC°%, 1‰NQ˜Ãd æÄ§Fm`ìSžhV(EJPZ”©˜Ù(HáMsRæ œ‰§O*SÎ䤼)Î#T3ƒŠ”6‰™”"ÒÕP<ÆJ’@Ћ^²F,b!+ Ä"‚²„£ ,K[ÚÒB­´ÀÇ)ôYÏ:…·ŒPU + öb×»Ö宎r_öÂWIñõyy¦)ùóØøÄ¢ƒÅa d@JuÂb»ØÒr1€-MîÀ@ŽQ²,à,‚Ø‚M¼˜Fž[ˆà\¥€¤fag³ñ‚lãÕ Ý¡D8…¼p °8L­=êÿ¡Óô@ªPà ã­ÝÁø ZàÀ A PÆ Šš¦"z8HÑ 0døÛaS¡;(ã/wp‚𠧸 Ô¡ !ÈF¢¡ÓÂÀsw@F0î€!$T£shm‚a[Ó™.s€–R ÷ð®#±Ýíî@ƒŒè… IHG”‚oBx‡hf õaAùǰ1”8ãB3Á LVð†¢ ¥­˜Ü1>Ï–¯|Šx$¢¡µï Zà (0…xJda›GÂ<ôÊ dàÈP12È@ Ð`A#¦ñ†FpÀ¸Êúà°CpežZø‚ÿê?> H*&²‘'ŒP\ˆ®Ñ,€ ¦9ÍFóÐŽ˰ÇÀä˜?'ðæ»PqˆÓC⑇?ôÍ>0@ 4èxFôP$ XãsrÅ,–K½²Æ}ÌðEû˜Ááhãx¾Áj8À>ã±@€€Ï> AøœuT[=¨Z±¤;ÐJwt¨C˜µö{hqÒøüg+É!LG8â‘ZEyjSiECPeX™Ä:ÖYŠu YOIÖ»¦u¬añˆH”£ºÞ5X‚¾à,q“:ð‚a±² "¡èp€ã1 .pYx±à­âè*Û'8áð¡#t²JXÿÂãø¡\p‚)à€ÇÊ7Ø2.{ƒ2¸wÀ¹ü© )4ò!ø3ਆ~¸„ûp€€!@#3€ˆ3Œ³K­Ð$'0`Ù£2(´êPQ#‚JS$C ka©wH$¨¨G„$(Æâ4`±!M°¿µR ’©AµR"%R:| ™„[ u6#‰„GÐê \(v6 €x„(’YT—q 7±! Fi±¹/¦aL·x›6ft·€:™ƒA‘&y·A‘Fs27`‰¶=éFSq&˜6uH)p£&v 7m|§~›€ãƒ5$Qƒ‹ÿ ج…F)h5‡³¡![Hp‰¸hµS¨aAlQ7Ñ‘+–`Ù¨b9ŽªÈv™’‚9Ž„Ïହ €©#žã¹…¡Â:,=ø#XੌyI2€»Ó;„¼¸^ð œéÁÀ °†`h‡ h£¸øÒʦp"0€ QØ¡eø¹˜R0qØмNØ*ðÉkˆ¨­¼IÑ£€=;8h¾à{Æé‡@†9ÿ£ ø½ßË-`-èƒS ¸lƒHˆçCƒ€MX뻃ڴÍã:4؈ÿq>Øl® ’8¾¦(†„| cè¢0‡éYUX…õj…˜…†!€‰è\¯Y¸Š#Né‚‚;ê0Ü ¡¯;ð2= ‚ˆ@O Š% (ð*¯‚­L W!ŠPPÀÄÀ( 8hø:p‚?°Ø`,È ª¨)øQ)Å‚l¤DÚSG´(ˆ[ €€_ù‰|â$Oê§±T ¥R*’SRChR'QÅs¶êx‡E¸Å/èÅuaÅê(‡G˜‡"‰uц[¸9°)ˆfc¶Ft6¦¸9Ñe¬&G¡¦tzFs$7š7_VaÝ€/e,;I&rSoct\§t‚FvJ'a-Ö)RU`ÁƒKA"¤xd|§H3ψØÂ&m8v]×7–h9–§xÿ–;¢–€,† SX–at¸’ )Ø•‹ŽÜÈŽ”€Ä¹#+ÁoعsÈ` )”¤©„±‘Œñ)1 w¸¦s:¦hÌCð‚ØI«»†x±#°‰ !YØ ˜}YY0Êh˜‘là§Ì‚x º#ÐŽáD¾L@SÂ;°Ì;ÀÂ/°> 5% K¥ Nk HZ>ð¿ù×l®µ ƒÝDÿÎ\É5ˆsøY’È<ðÏI]€?è) a 8˜]ax†ìi¿ì”Îï‚‘€Käk “¾IÒü£ =0€ˆÐ?J’Š«¸ ŸÛ¨Ú;*,``…hƒ6À# ð†70‡‡Yó·Òhø Á8›³¹ñYàLÙsA³1Ô±9 Ã/ÐAÌ=†RÛ8„Û(Bäà!䀲%¤²ßÐ>¨$@xð#ù€gˆ›“O5y†!Ð&|­š8S!0ƒ+€38«36‚~€ °RÞÀ4œKŠ:Ð#¤ƒ„Â(¤4ˆ3LK–)ÿ«I¤‹DDBbE‚üà`‰CÝEmšªùDGÅQÅê ÅT"THEuÉëЇw0—N¥ÅOÅNí O5—_”O›£¢IÕ‚CØc>–®&ýc¦p:iuÜU€V`-”D~ÆEØDV°ƒpVk=‚¨Õ- Hù6f=‚pŒFP–ÖK.”k%7L678Z×;ƒˆCZF›Çƒ ÔHÒ‰P×`l×) —¬±–ŠB«ذ`™héš¡×>ЦÉ -€È æ€È»Ȕ39•«È{AX„ÕȘ3ر¡"*rÞÓ –‡m‚s`çš‚oÈÿرؚ:9 ‹Q€=„5xÉ—”[¹Õ‚!P€cˆ«û  '0J™}è™mfx”Q€xkà^à,03äãcä[ÀÂ[«¢Í‘鹃 á$R;K¹ú]‰Ú¹=Ýò‰”¡^¾)ˆCøZºñK­Bqè¯íq¸¾!¬® œ=þh¹Å£Šâ'€*ÀÌÄ A²…(@볆Ð<Üø½© à (¨>xÞãoàˆÉõ\µ 2€kËmë¶Þ\»ÞÜßDƒ@kðÝÓE_ì:qˆN¢X/lpÄFlsÀÎÜ]õZ…ï¸\ê­ä€S> ˜ øÿ@ž¨Š“eáìôÐ#Ç•ÛãKŠÕ™^5ìÅÞ0(†6Ѓ b‚FÀ†3°¤fX‚ èâþZhÊ–® p/ùÍ‚kx±†Þ ³…/°€ "ø ˜‚é–=`Ñl¸n˜Ê^03=¾¹Æà å0ߢòþ¡_pàg`$xƒ7˜‹2#)>Èc;þ¢ÚKmJ³3 û€¾  =»öÃ1½(B@};( ‚ÕÑ£ƒ| !Ä´Œ[ boÙ:p÷ð85’§U›jI$ÕT°Š‘2€Dš©yéF=µPTµRüàJ]E\ÀÅGðs‘E6^E¸Eøµrÿ€9®Ž:.Æ4‘[hr'7€(ÆûÖ‚(ðäB®;Ø‚g4»EVd d./J†äa=ÇtŠòI ÀäBVG;€FLöÕ8å™asbÝÇ&o8ˆqRœ‘Z&×@=:©C?ôCš%Á² ‚;šfÈ2µZÁ´ù–¬A«SІdHˆ¹Äd–€XmÞæ“ëHTO)"˜U¸{ÞçŃuŽ©oƒQ ƒ+(ˆÓ"Á•~N‹#Ù¸­>À^à¸h¸ƒÈ—…h™5ʉ¦ <‡kÈhƒæPð‚>÷"Ó‚­)éD­Š ˆ•×-ƒ0¸ÿ‘Oê‘/;ÐA†¯¦­ß³-3Ã88„<èã<ºÝœÜ¸¶k£k0‡kœg°·V‹ÝôèÝ>.]<hx:àqP¿ìÄÝÜzÇŽÎU¤5€¬è;èÖ®)ø)ø‘LЃ?h„Sà¤@Òþâb#уC(¨¢ŸT'àƒ^8èàf@ƒI"µÿAdЃþîo=‚vÀÙ`^ ·w“)o%TBŽ2ôÆJÓc@÷~$ð€fPjäûî;Æ€- ‚ ƒ,ª3ˆa/7³/Š; 3¾€\YIµ¹õðC(²¯)¨- ûn9…8R½¤q‚^ë胳÷^pLóp¬ÿî¤T÷ÄEý‘OT_PL5Hh€prª„–C–n‘ Pa\p=r¨ð ® /6¤°¢ÃŠ¢Upä!-&c¸K™r‰»%Z¤|©eˆ#6oÎ9† ;øìb'ÑBì<2ÇŽR¦6ç ÐB0е§7¯ê„ÿ‘S)×9!¬æ¤r5'ÓœhŽØpH­Ì—A´Ì€pgîÜ!@ø Y3 œìÄ\ºwêŒLlr±– Afà!"ù1‘)DYB‡‘SA6_8Å™ ’g¼=5cæÅŽ[;²pÄÇÚ´kãV8‚ön½w÷8ïánZ”,qH9óCΕ;þv® õsÖY]Ñóeâ=?ô€ÿ"~á:‡B¬YCædš;Ä +^ñ²p{qí„lÌÚµ#‹€  3Ì<‘ÍÁÍ5YÄã/;ð¡\|râi§Ç¤M±Ùfzp„wx„‡"Ò͈àigÀx\øÿ%àuÌåÊüˆC*[ˆS$)Æà‰3ô1â@#)ADÂsñQã…%@1Nðá„ ŒYA0G E0°YÁ°‰Ìr"ƒÆ˜`À‡œ–8*ƒdJЃè‹.š¨£ÐÀ¨¢a('œó€…ÎÉð\ A@Æp i³üÓŠª«²Úª««¬°J+"”qG 5~3ða˜¯wp t9h1Dä9„5y±Ä!}héiŽ}Èx‡ yPaQ°àA‹x@SŒ8A<ƒÁâÌ€Átˆ7SÔ±Òâj€2ð’Å5/<áÿS„QpaXÀÅ\pCÐÑFÄ„ 3<è!/ T¸%N qÀ¿Tr@%•ìrrÊ)Ÿ\ É'orÛåð†£¼ñ AàNµËÑ×c†—½Ì%XÓ£0ØŽ5^ÌeW[`Á%—ÄK8áE AXø˜;NT‡†^ÔÁì{pŠI§,QÇuà]‡t|Èc]ç ÁæRI%a€_ðvÇa¼C9O¾Ýx§”„s¹€ÐG:èð,”³ÕV€)TÎ#þPdÑEãˆtL2Iq8I‡o®»sl¼M;mAO0lÑÓñBÁ€TÿO*|…26I‘»¶l |W\‰…ÕMg¡e 6M½S7•Sú#I1þÚ5Ä^Cð!Ö‘`îá«;Œðv0¡Œdˆà¤™„»"ø¶„%(pªá€YcÔ`Ð1oaÌ[ÞÂíàæ6¹álˆcÂâ ç7'ÜÍÈÆøX¨RøÔ7²Ñ4áy°Žudð„AáÑNw8@#Ø!=d›x„Mm).@à…â9¡ O8€ $ è@Oà0€kD ñàE/¼€¯?ÑHfÝ¡ßôð‡Æ}ˆz Ýfà!LaˆÐ ѽà„Lü‰ AÀCÿ ´@µ,Z‡: H…ˆfŒS¸Cx`ÁÄÁqСHL’È0|)'ΉA J@$.ONˆS‘¦` ƒ–4˜C-å4dä²vàƒ€@‡”¦Z%xÀ7N0¨JI Rô Á4i`ÍkRÓš‰Š”¥‚VjéVËy@Ú@"‰ÀU+hÅ:YµÎvÊj°jÅ,.à„Df»*̯梢)Pm.x^é/„)n§p‚8ð³å@Œ|ŸÈ1¬! Çš4 ñh¡n4À3èR‡Ñ¡@¨“ÜÅC,Ò.~ÈB&…0\T¸BfÀ°,Œ8%‚Zÿ0<øà /xMýÐÆ:h }Ù/va2‘Ìd$ÛW]v€g`à wpÂesН]ow£,9ŠÞÁ] E›lg;¸€­ Œs\ã´#„ÈÁ¶r–³´Ð—S8G “ðFV÷ްnr¨ûHFÈ£wPt!Å-xW#wÄ` 1ˆîtñ¥>˜À$5¹Éô”2”¡$vøîw¡g^Ÿ|÷g™^wÑçDAzÞK WØ{•î"C¼8¹/ùÔ¢»ÿ˜á}tñ‚ü ¼Ø%hsœà+¨âN&ÿmŒ“ ¸:2ªA::3ƒ@3œ Ñf*û–Õh€TÑGD¨Ž8ÂAá k\œX(w¹3-—„oP‡ÔÙáAp 9 Ø¡ >šžô¸çLd"{˜Å(Øèô©b"Єð`‹ÿ#™ ô„3cLQÈBã!ŽYHœñÁø°¡=Ñ 0©ÂCÇÊìw,Ͼ #Ä®ÒS¹ÒçÜ8vœƒTP†R‚I§BÊÈCˆf "¢Ƀ2ìУBÎâÔrêÀ!øµ¬@8j0k`²ÿ)Êh@æ°€9Ș¶ô´@‡>´A•ð3ú AÊQÙÄ&6@mm6ŠP™bÅ!Téí-q©, ˆŒ±ŽUµ³U²RU<[OX­b&ð®Ã>ð¨Ÿs9xøy4&¤m¬ÀFÌ;ü-ÎsþÔ"#„ÁsÑù…AƒàÃ.P/<㨃_êj™¼Þúb…þ }á 1W`€º0d40btBRyÀ4®±Œ*í§œ°&‰cO_°'¡1 LÐ811ú0 pâÍÐ3ra ,0ñ)í…ój'˜ækf8šÑÂp×K˜¡ÿ0Ǭ±GüÕ p·ë¼v¶;¸#k‰Ï ðæ„>¡0†ðAl¹#o™¥‚f€/,¡GsiÛB@öÍefq­e-l#'ÛÙÒ§Èß)vìŒr +À#`ñ¸Óà €\FâEÑ©.÷£ÝK¿cì ùwK~äå¼cø.åí=Ÿ’W¼ýnå&;^öuÂ]¨%wQˆ>õɇ–-”/|ÜeÊWìàé{߾엂ܢÂõØ0‚ýúÒ/ÚìÀƒÅ„îÈÍ9Fdâ¡FˆXí ¸ÍŸ,kxf6¼†Š-ÀXæ†ÇŒ Ç ÿªÐH€àÉPµìXî´QÇ ÙtìñБåÁ„MØx {PS¬ÇÏp <ØÇ]ƒÏ•Ù‚ŒtYB„ăýN¢9‡cd ¼M u‡Là yxô‹ZêA QˆÈ™§@T <¸äP¥B*P¥ ‰ ™2¤Â9”¸ÐÁ7(Y*P¸Ãç¥sˈ±ñôõ0ÍI ƒ®U@4Pý2Èž’eL"–-\&üP @¤\›5Yµåâ5)ŠäÁ7¼T|Ä@§´Ž”‡ˆ´)°›ªÈ“»±»5#;ÿÅÛ ÄJ+P¢-[+eBôAæéÛdyH¾ŠXCcÑMDVhåÉ4ÉŸ,Ò"åH&ä›a¸Ãä |A1èAå=ÃÇíE½ä´4à ÜSAÌ<îÅL]D†Dá €ÍÙ=À@ $,\ÌÏu™€Û#º€i èÁˆC\Öq d jÔÁ€˜@`@LBPPâïì@à5Û!`ÑàAJÐÁÑÛÁ`]-TCÖ˜ÖìÝ%˜ŽÍÀЕÀ œ|дˀ½h,‹IÀ\ž<ÜÀ]8Þî-Cù×*Ž1=5Néÿ™^¼LŽlÕëåÖëÁƒê€ÎaŽ,æaÎc‚.0fŒŽ?èdfÀ-hI]æ–sÔ%gÞÜSLßôŒOú üE lÁHßW„@ú1…<ŸhÂ_nª_lS”j†OPÁlzûyŸôU‹5†€õHÙÙ^èOt:ÞŒãaðýu¦õ`†“à“¤F´i¼EgÁ‡¸Äf„HI†ItPŠmšÄ>Šà|‚ ͘ ýÀ p8ÔfšVOþX°B` YÉ€u™}‡®ÇUÔfø”,~Þ;ÎGð‚ \ÿ„ÙNa;ŒÙ¢™Ï©ÿ ‚„ð…rˆÓt¤>ñ@xü'ÀH å†Ë’ÑèÙ6¦Úœù˜Dñ_DA°C¼(€!"Y Rb¦@(©!Õx^Öa&”©\„ Büš'Ó  à ƒ¯Õ‰†¸%¶Arér´|4=T.* ZÛ.bP+hвÝÊ¢ £eÂ˜Š‹„ÒºÉÓÐ!DÙØ)Lÿ9†P‚@<LÑ"Í@ ¯-ÈP}‚øù X¨Š\ºÂ”Ñ¡\|Á§™€'‰ °À PÀ 4ƒcð Œþåvˆ à¶ A–ViEÞ!@Ž8,=†Ý8À%¸Ý˜^Y@TZ@5µ(ƒ-Ò@.jÄqïâ4ù€“Þi—ÀŠ´H(uª3bê;¹›¦zª¦ÊÊ*¬C'x¡œµÒ½Í@uê›@€9‚ žŽ¨¥ô¹TV2ñsA&€o¬¯Tà#ðÊ)¹Dá †J<Î:†…—,’HÉ@¼€2HAA5øš·ˆ™‘~D€(€$oº–»²B˜€éÈÅÛÀl44xäB'”Ô­|mº®Ú"õ˜œc@¬L¬àÖX¬ÆVì%ÿH,ÁׄÍáì×f†Þ ÁKÿ@–èÁÁžÕÍ œ‚P€ØÏÔ,UΞíà%Ú¬ÖmЖ^¿NÄ_jA`”³ @=¸€6”Ct9Tfô@AtC,tCtE tôqA¦B—Cfú××"ŸÞp´æ2Øç©EiÅWàþ­Ü¾&ôÌfôt—læ-  æÚ²ôW¨@H¿¢â"np†@|WÛ¶íxµmJó&Ä´qÊ&MÞ×jAä†I``,ßO Mzniî!àÖÑrd¬\\}îH6†©2á¨zjܸFÉnµI”D|ònnG o ùÆ}ÿGÀãäÈÙh(å ¶ôJï9È,DÁØÄv=h„’аcôAذBÃt’\d‚T$ZiIE>ƒ`B*Clȉ%{ˆŠ+G–6à¥ëü¦k°ë[˜d(™ÀêA$ùÀ+„7`ƒ4¼A͈|À4dÉØByÙb†¨‰Aë9†aÅ*ó2oìËKÜÍ&oiAä¡ÝVàgáEQQÐÍð…ü”!e¹“ SÝ0TØnÏ Êê^ãì^§‹G§{º=o‡ MhvNB`D<Â<̤pÉqáB«À<èC¼ºBŒƒ×€?«Å®«Ä¯ÿºØZ¥Å×N³íP¨€NÇfÞÿ’×OîiŠ×PôôÚ†´DÁxí´O§42ôæâ§öf¯ûý-Oµ¶ï­Èíº?^Rìí HÁ D’ŠyD^KTg\–È]–ùs¿·Ši<½1jHFÁ|4í^ŸH‹ŠYuŇŸU·õîÆ5ŒÉØ áuñ–àà!ÙäÉ/Ãá®¶À,ø1ë3ð¾ü¬Ô!àÝð³RœñŸ 4á 9„Q¾@HZ娓Ý`aPå8xC˜À ˜À¸Í€7è+ôB“Q³r!ÉñÀ‡3N 2ðâÃCƒTìcƒ-AfØâdfÌX° ¥Z5ÿ $‰,áTŒ:uø`À31†‡v²¤Ž“>zè„™ÂAÏ”%§´lœ¡ç‹¨¦pœÑTËC D‹ÒÑc hć% 8qÀ—´kÙªe n\¹sãjqRgcÅI.HÍ-à﮹p   . sû3,—­Š“)— |¹rZ¤  ñù³ŠÏvTÀ°´èªAŸ†Aå32Ô¢O°m{jÝ £ô®á{K-Á‰ß{tˆ—/g>qÈéw†Lœd†Dˆô!RâTL^¦ßÙÑyóˆ›ZÅsJ#-LëœZ2ãT:–l'B‡»>8:e¦°šè”C8ÿ$Á‘âÁ ô8ŒÂ åa0ÄPC 9ÌÄ7İ ðÀ£¢PÔL3<,SÑ2î(:¦¸s "hìƒ;ï\ èó›tk͉&2À²6Ž ”¡B@°Ãk¼°ƒN1ð¢&/¼€à>ܹC' ”䉧œÜ, Ë8˜b†ÿ– ïQù°f^­±&T鼨Ã΢ iµÕ\UVÑC^ôÁhØ€zÐÈÿ#(¨P` *¢Èãøæ%›TöÜs‘}µ…/úœš0¨Ye…UZYáÞUf™åjöØ£“NL@B ÌzƉ7’Y’Yt)â`†:J…³œ¨¸¾ b¿ëðhjQ±œ} <†ðâœk^è’™vœ~j/ŸS,άƒ,±Ösb) øâ%$š1 ˆ:¾‚À›f*Æ`1Äyà7Þò>Õ"ö*Ò‚ƒñvˆ0w^ZBŠ · Ĩ‚2bÀ' õ:¼wúi¦%4>¦–ø| Î;ÿ=tø@_"«ð8?d&'¡¬çSî2«ÚÛ»½½ j×÷¼&ʉÉJ˜ä–¾ÊÁ%€Hüyçæú¢°Ãk;.éÁŸä#)€q$~²´°l|Þ_dq2)R›í8ÖvMµÓÖŸ2)NSÍ}Ô`aÑöÿ?ljj£µôhANå1KPh1…Tå©s àœˆ à”B{fà,ùáH®Ò-ìG#¨3Ð @8 iAËÉ |*ø±¡ÅB9¤Ë†:4¢ùÐC ÒÐʧ"ÁÈEH²Œ‰zÖù¨HQ$B‘¦È(r€C¢Œ¢Ø¤²C¹J"‰‘;¼ÿVDàXÒR—Ö&1E@2BFX¦,6}1QÑ]&8°ƒ;8a Q¹“DF>qìNQ9E©f€‡;‚Œ-{’fœ0>!G  ð)PyA | €p‡:¸‹ÁªpbÇ6Š=›iƒjD+'àj:£,œ0Žý‡u„$$›U‚(ˆ¡Z  |ð<šÐÄøPVÇG~n:D&¾>Ñ&h…¾ú寀u"H¸@PœðŒ:À ÆØ’L@òny‚p ˜å¨›Ÿtø€Ì;ЀWÉ´ˆ¼òn+s–ïp9:à!šÈ@v"Ÿÿ­"ÎRÔ+{òº”`2 Á5®Ä4/= LSã™0±/ în$ÈLh±gÀ3XÊF–P1 Á\/¿À¼a9X̤Q5Ý1Ÿ Ë ‚€!ìD º+ 'ÿi–—@ ; ä>0IhÁPÖy—ÞÅ@BôÊ׊ùÕk`€rŠó™H „åébk×ðÔ®•,ëðX øÎÅ@$ÑÙÎêƒ{rÞcü¢êÁ¥úЇg hã¾›Ì>¸w|î¶îЭOÀ„Îav.€ \2 d˜Ãq—»àn@¹ÌÕ$r©{\â¢aÿ0@Ÿýæ@Ýîw¹ÈÃ6@^2”wè=ïxÉÀ\;t¸ï}o¤pæ<®†Ñ¡Ù~ùÛß´>$tx³`‚ 7Ì`ýÉÏUœ …þÅTfð Sháq|dÈœ ÚpnÑáˆÈËèÄpo“ˆ¾$)£2jbÏd܇œÈ‰Nl¢¢rãL J‹²æ0µiR<  & ¸†•Òˆ¥,e)/ˆ@X/<Ã!ØD>™¥¨¼@wxF¦ •ý|“RÉÑD(,K'\–¨’*"JkX’yÎDY6 °nˆ‰4Óʆ¬IMøœ¤Zp§YM¡€ÿÂÀ~1P[ø’4d²äìJ'EZÊ4¢pã¨(\å*W½eW¿zY!Êþ &ìa0Þ`0 Œê0†7æYO†Æ ®®ŒóÊJ1Ãmì—WÁ`~úÀ£ÀË+RÒ5¹<̼•ï'åB¡šUîX¾£8Yv$'j‘[‰ ,mr×ȃ1YÉ Y§a¹NY²…i³k†ÀÖ20!:ž*ÃàÖ ápFô+%ïLÉ +Àëk[jAXÂ*)ªpEKt±e.‚Wv²ÓbÓëÅôZóŠV° Ä«ëpƺ™¸ƒ§@?åÐBW E·§¼ÿГ.t¡ÏI™í .zPõè"† aH+—é=oú¨ú;ô!ï¹x#2ÑíÚÙ~[$!I %@œP„¸oX@îr¯»Üï~÷#áÝw—{ªñj”Àð%+Ü÷ h ‚<«ÀŸ¨ò¨;Š ÿÇGï‡f8¢ßþžÞ¿xû¸Ç/ŽpÇbÕŠCöº @@ Æ+v0€>Ä —R áCV_Á r¸s<G¬ÃqD=ôÐôAô…t4FK<ß‹ 3B£üßñ‰PÄ!q5åM”6ÊJ–Ir3EC%´)[ ÿSæÆ9Žà…!ôgY–€ËPÿ'B'ÚƒOA”x‰)D†;æÃäê ; Ð pݰ©e6ÃG€À >EÏb€­ˆÀu)Eš%ÎÒ%=-õ !)â%Úæ£‰6BPÉÓÖÀ–i™6@ÈeÕDŠ‹V°“ÐÕ˜­ˆB>ÀâbøJ. žŠ þÀ›œÈ\² ºp"ºƒo¸j>@f;ÀIà¥;bÅý®JâºMËZf#ð@Nì ²l=PP’ðð í(ŒŒ,dÆ ì  XŠÇ„¥¬„ÿî`³‚ߥÿ‚H(8 VRä¤ÔÏDúÀv´ª@¦°b›âA†)´ †`ècŽ‘g^¬g:Èp𠑉šÑpžQ£‘§q­¢"®c#ˆ§/€Â¶‡.FKzƒ.Ê!L+á¶òBû²CAæqA>,Jxfˆ  ¾Éöñ›Â Oúñ›ÒúÄ÷£Š¸C!»cô*B$n„r é  ýÑ’"÷± ’#WäÅÌÇ'LõFÒ¢ì+ –€¶ e%Ñ£)ª ÉRèH®à†ø@ ¦cÜu!ÀðF,2Èø8'ĚĢOˆ|ÅFDŽèí¶O£6ƒ| äÅ *SÎÿE¦@2J*5J”Ä2†,‡F,'ƒüŒd ކŽ@¨ÀR,%Ö SžaÐR•EïrËî²_ç?fàކ¿>âx„'nk/s‚1–Úí&ƒ`v vÀDFŒPÈŽ0oÐÕÜ!X. ̬FÒpt‡)¶£ ˆ ”/•%ÐÅòÀR¾…· Y7a­eô€ø bÜáD ˜€ž Á89 2Áj›óƒXð:H#´ Úü¤d¸ –Ó±Šß0ßò,`ˆ ¯ê‹³ÇX?È}Õ¶²õ9;vIX'ËB®ÿ!« µ!¸lK]xùÐÆ·Vl´;p‘IX=Ó‚•å‚c@`'Búƒ5xË2„EX`?„“p!‚YAV/V`_Ó^Óuc•í¡º•c˜f¹õ†gX†Ó5âox]m8‡{6#ç”"Â;¨ˆ;6¡{èÖi‚®ŠƒŽ°Œvj%+PîeÌg³B# ´|¬t9¨ÓW›bƒBF@âL›·Œ«;@†Œ£„hŸUµô|ŠÈNaµlí”ôN—|×r—(ŽÇÇ\À|A‘9‘9‘},Á,y/.Y’-Ù’59’Ù’oŒ}róXµ£Œ»òÿpkq#l¯!!·"N)ÜöDYµyMªl‹(•»R|ÈøkqŠ„HFÓŠF³˜Y!IèpÃGå®r³‚vD(€E † ­ÄÄ6¾ÈÖ$w)ÕRb†4Õ]€wÄ„¤xMŒú>ä HuèUÑôC¥r|²âVõV·×V›bUšŽ»×Üz,' ,€îq²¥7Z ò@í`¶âÐW_›ÅÐ~qK¯^¢lz¶uÈÊ,ò1óWƒ×.£u‹¤¸²`W·¢l€Ï3sêcK:[Ø5A˜‚Kº¶¥Ÿ•R"èLú‚-x¨GØ3`BÀ øçƒ‰º¨“5ƒ‡š¨Oøÿ©5ض‚âlî.–àºúsÖ•ªGX¬_Ó3É/îï"é”uöX/x†ƒx¤­Z‡cà%æ:®ŸÓ}ç‡ûºY÷÷b.†v © ›°‰O‰ŽYµóùy7ãv "›~C§PšÍ×p(ì!ºv3ž÷y'êy­¶)‚Ž~5¢ALèîâ³Û£µ_»q-×hÙk¡šc»OG»µWyôn;·1£NQw¶µà“?9“‹;‘o!³–{¹oÁ¹»¹•›xˆº]Àr7"Qm+é´;Ý®N÷¦¶{GI¨µ¶q§km;¸o›kq»¶Ã wbûJwùEz½3Cr·6Jv§kÑŽw|2ÿsBƒTøtæ7"z¼kƒÆùŠÏˆ -ˆ@‚.` ž/D@Õ™RÛª2*é¬{¿÷+«7ŸgÕV‡+ð¹UµW¤ê@…\·7|=³¡gœÆ{c¢ÀÖi±ÉõÅ{¼EJ\aHè8G‚Û4óc¿µ `Ö]Ý7¢«Y]whzék*wÇÀq¿;w W¾;¼Ë›½~ÞÉǶc[âÉ÷³Á›¶yAô‹Q|.ð±*ËÖu‹@h¨W ÀÔ›_9^kWS%<.Øú2|){ˆTÎ*u»¥Ò QüuÐןÛè'ZI ß‡ž\5¸D½7J}8¢Àéi<ÿ}U\¤Šñêµjä&†¤ÂAb&4£ ðÒ=Ì;­ÉææÚ~©.¦Ê™N¨Ïœ»ÑÌÙ©æ(†b6úþ‰ÖË<Í_·lî€àñßËÑ|é–®Π„¡H@Ï÷<«KŠ=[«Ú©WÛ±Ö®ß÷ü±Xº§µÛËõ:†7Ÿ¨¹|í8I«Mؤ‘uX’6J ¡˜Žµ[%›Þé‡#ê™^ `7›¾ã¯V#N·AÖñfíàƒ°€N# à Äç²Oœ¾Ÿyy3NéYÙÿÀDz&ZÛM ;tGÛÃýtnës¦ÝÙÝ_ܹýJM*~çŸÛ¹=·Ø?ÿÿ¹ýK ´”¸ N‹–RJ)TWPK O2hðE‰3j9¥®TÇ„§‚\¸ð°„C-‡N 8”òÐJ—‡¤Ä<é°Ä€%î¶à̹gOw¶Üñä©S¨Î¢C—ݹå”IŽþÔ©´*OA‡ÝZU*Σ„X"H –fÅ>k2mÚCnÛ® ±æÉºcˆxÓ½N¹;e åM-KHŒ‘xIŒ»!jÌH9ãŒ)2kÞ̹³æ €!:4éÑ¢KøÇ¬ë²jÍž}öPíÂ&më¦Í’e”¿¼œ½Û"ñÚ2Y×}Èã<ÀcDÙ2½:õëQ²Šr(ÿ†ÐÞµkX^›%Jwu «Ô²òTÊÂ÷&,¸Îc‹ÆQæ·7ÊÂ;Ôá„;ì‚;8„‚@4¨ ƒ Qîì@aè ¥á†:VLJF¸ $>á‚ bÈáŠ, D ÄÒHc‹îx·¢Ž8nˆážáÄ3u<#Ì ^@ øL‰NÔq=¢Ä“P’ø¡ Fù£†>U™‹Ždâäˆhúõ—rQ$–C‡@a›X¶•Å›&åΔ¿egËÚÄþY]ŸRÄ€¡Ay2ªŸ@é-qõÓK¶§=aj™þõ†üUŠ'Em¡ZQ§ÿÔÑÓ_-!¬´V:kO;Õ1pòç+\™þ$©sºŠÓ{ …¬¥{+«s>áºÄSy!íµØ«"î$,²Ø:ƨH“näC Af:R¬4€§´+ÑXc}tnC#¹éh]°Iö¦£EõSP])åUE1&TV@5ÜÕÁ1Ö! `iUCË¢·Ì KlO[8œ)Àk­DïIÊ\—¾4Ôï¿nÂVB¼ À©`§\@qsKœ²Åî +N*SôÐX•e¤M30-„f_x&õf£¦G ?œ†šÖZCSVI5¥uÖ¯¹-W眲 ÄR»ÙmƒÛÒÁt–ÚI!–Låÿ1§7†Ùõm ÓŽ]ßypWayyÇd^L„±„ž{?º×R|„ý¥ØNð-ê~œãG· Æ úèˆ^:c)Øe‰:žŠ8â¥;–£’x‰µ«è{•+:¸û0#î/.xc±BÁžáóÎûÈd†N¥0Dé MÖ¤0RŽô!‰ËVù!šO h»–ܦØýa E¦zÖÛæ[¦b~ÆQ-cáOÙš¡ºYD(~#”ø'Ú";ÒùÍ!hä¹¹• s •šA©¿4ƒV„Ï_Üq’XqjƒZ€BòÓ(ºQ+`9¢•P,§›%†rñq§pU‡‰ìÿ§?¼ÂÕF`âžÊÁŠRú¢O­ö"9÷ ¦'i“A³„а %ñ*]àÜ–Å\Q_B|J¾Nv °l¶ˆÊtÞ¤ÑhëRÇD਎I5*7,³[ÌØ•ƒ9f ûcV¨¨“ ØBGAa Hb’=é‰B#iHïÒmÔKÒMr“ŒñJ(•b€µ¼WŒ¡Ÿ‡t˜ÊVªò/© Eò—»è‘,=±an‚³°¦Š™*â_£.S2‘BÒ03µ/èaj™ÙÚZ ÓpMk` ØÊrÇ<Íi6ú ·“L¶±“„R€ì@†œ@[Ør’#ÇxÇžÿß)Ž>›ãŽŽ…•Î ò†`!a/‡ˆk~T…Xó/éqb„SCÊ)F% ƒ•¤hEŠ(²%*™ÿH¸DëÄê…ŠUÅÃ)Å!B¼b›\ò6u®S!pÛ»XË2Çì…"9ÙF8Š´+'Æ]'<¢GŠ0d^+ëÉíf=z޹y9$ u²Hõ2æOT$P±(Ì×½‡ôË`é˜?9Ç;‡L)%Ùßùf ¥=‘o~ÅåÂYBJ@J‚¢” ñ5)@‚0‚ÆõE}Q‹>þû,¥€‰’–„ªŠ±…#MŽ&»áÅ!AX¢6µ§Aó4©ùAÖ¶†cÓ„Á5¯É+À‹´q;…édwTêvÒÀP6 Ð`‡ååH~drGÞÊ“ïpÇo%èxÐ>EÁŸöUèýÿ^Òж?,uÉEÈ’°Èj,)âìWbΕ¸Ï(±&cúš´“'ídtžš¡nõï¼æZ·†”*'oûJO0ƒf €€½¥¨G÷Ç ‘(§ºKõ‚v„áíÔÊÑãвÊ÷%  I[ÅuжZ‡%ä×¹ÈT›ÃÓÁZ#«Ö®Š•´ ¥AVngzó([-¢(¡çgvôÏDmÖáªÍ<¹I%ã³³œ(0' |›tˆ¨•²IÚ&©ß_V«S8›V#ë ²9øÁ:xtnô(J^Å_Ó 3¶¤Ž|v¸Cô9?ÁBín™5BxML%#çš·]*V¼§6È-âÿxÕ 808Á“p#là0 t‡ ƈJj"8ßCÔ‘‹ Š ˆ²ËѰBO$,‘cÎ'RÇ7I¡RÄŠúLjõ˜îZŒÀ€Dé!mÛ[d=ÁÒŠåNÜ›u=–@½‚ÄzP*…ß÷N”½ý˜RÔ»uã8Ñ$v3ITç¾¾«Žï}·.ÀÌQ–ÁŠ0Œx{xI¹9g*,+›KѹLhZ>5UëqiTsšôáh2SËnî–2Ý”‚çüK'0–ßáõ¯7äyeùÆ×à‰IâüòåÓ_g †bcðûFÎîà¾7ÉYh»³B,f6ϰ•ÈšŠÈg—8µÒþóâ8—`Mÿzߤ>IG×Iú¡ç~ÒF¿b &©V'öEàÚW˜—ü9q õkS[ÄÞÜ7ÔÿµA);cH)•Å)¸o£b€'$4ju^ Õhø;³Â_åvÂVÿ6d~æ8?åÞF)?24K44snÒÆ)]C+}á6þEƒ‚PÛa|‡G‹eTô!+$¤/Ä~8ám/t^ÎEwt.‘E WC§5Z§J—[,â•‘,É[+Dä2)QˆŒq*þóq=G\­{°'{mÔ]Fs FsJ'~x ¶Ð‡„áAG‡¯çsÿ!ßõ‡~()­UmxlVEtÂ)^‡`íU:‡`öDwZG?êÅ)ZG‚qø‰š˜‰m§ŠqGv÷DIO±‚e7îa-µwºø: òwB^zå(¦0”ãó¿”ìá3a ïax0Æ”7c—75¦yÖ„y›7@ÖBcÓzsÉq}’d˜dN¢£dàztèr7":ŽQOòƒ2‘|ŠÓ0hX}CP¥sõ¥R]ä7‡Iøè:ëq}N$9/A}Ô×ox…“µ8é÷g•*Ò1h(¥RKP~åçä’4Cs^Ç~˜¢‰4J.Hh–H?ÿá’³}áNúxeûÇ"n³l¦}8¹X€xB'Ô€°€K©£’”ûTd#væP·,d¥lÊ‚[k‚“eC7ÏrlÁ¤ŒA8•èAŠ)H1÷1Sßæ+ÑICgs÷“#:Ô!ÀQÝm*©XµB)…D184dÄ)ð\]iEøÁ+#f97/Œ…V¨5/˜ÉŒÁ¢_ÁÈ[áDRrm›¢Œ4Äq>¡"Å[–ÈZÁ%p§1ÐŽ†Ørs@hÌFâ•=áˆ~؈„hàŽu˜ˆ¶ð‡ qZŽr±;ÀhÖöq¥åaµ11:ôˆ+hj&ˆºŒ²1€ ¹9c• x”(xbG©”døº¡š,XÉ»y¶!UD\©Zjo„«É2QÛ>øJœòœ9‚E´òƒëlƒIÆh²¹^Îÿá.Ùë–Á!¢“­ï±A‡ χ¾ÏG@ÒPbÒj›I—5*®¨ÞF¨‹äí1uÍ2Zrv¤Éú\Lø€Šb,¸÷YµË‘C4Ñâ\Bt¿;ĘB Qñµ]‹®Êe2æ9¯2\ÌY~xœe3ƒ¢!àµ%EÔåEºÙZ0ÑË[Š£/'”F³C%{[™x-õ¤lq,íiÀ8Šñ…‰X˜Ã)EW6hÙɺ¯RÜÇQ¯³X¶›‚—?ÙG'y›1(™WØŸW:9Gt©ð›,3ÓHyñLKK5ªñ´ZppáM„fƒZ+A.Qh1 ,:ÁA\ãÿgRº›Àhö¼w£ëöÈŸ„— ÃÇsK‚1¼fö±šÐWgM´H°Å¸b˜YÎhtJSÿE¥ñqVWj?Š1}åk~LꤡW(4[°±~q¦¥Ó_’Ô‰’¤¸…’;Ëœzȇœ#ã7Æ,:ºËP¢ƒñ+ XY¯£¢K¹Øœ)ØËê烂Ñ!‡:ˆŽ ‘Ï'¶X¸·Û·ÎP—IÎeŒ^h+ƒñ††9L»µ9þóÇÂq3-ÑQ‰aÿ¬]¤p+12)éA™E@;¾ÍàÐOdCxD¡…›ãQ6i3ÂE™é,Ì–¼£5¬ý,ý˜;„)^ç)i$ϵÿ"48û*Ë‘{G&!KÊH3é'èDfm”¹Éš×›IÄt §ã6ðtRi¤²ì!Gó*Eñê&¹©’ÙÚ‚+Š–²ŠÃ6MW ÖÖA»_[‡±é©¹Fìul‰™‚ÖÖ™v˜•Õ¦ =ù«Êµ :ÅBÁÆÅ#L‹ø†Ï­—»DÁh\4ôÂÆIûÆpŒMÇ ÜôQÇ¡“ø÷­Àq:ýIº!@R2>X¢ÝÆÜì-Þ$ÂÜâ-!îMÞ¦ÝÚ=$ÔÍÛb=}WUõ™"à#%ë3àaÅ;^"’b! Bݬ#;Û%¼cßþ#6ܲ")vÞN°ÛØB>Ø%BÚ’?O¥>"%¾Í$’âÜR!îá¬c,¿ ÅÍᘲ۹ #ÁR)rãîS^Â$;.ãê#!¿ÝLÂ:BNÝÝÓÜ2"M®%²âÆ"¬#VÒ$2åZÒ$Ž%âÃça©v­v8¥‹{—¼²b•%€-;^=¸(aÅ“<ÇS b=.-ÊMTW¢ÝOò$‚ÿ~ÝPRa6aá=Þ‹NÞF߉~Ü^"rº¢‰ËºËÌ©È|[J²þÇ&´äHI»«LpÑMB½ÚY]šòa¥U´ˆ†Ñ3ó†sºäVÝZ:yLãÆŽ=¡\ó´¢Ñ0ì@DÐÅ~ìÆ¾ì-@}ÐìÆþìÒÞxPíÖ^ífa3~e ¡M<¤C¥Ä4­aíA€Ó>íDPîÔNíä>xàîå~íòNîóŽÔþy-ÐúžïúNMLcM£3À ¬ÒXÑ ,ÆÆ•1ŽE¾ÉAóâm…wB…Y‘€á‡ÿA97¯öü†_b~8¯ó²tµò_òsÿ¤òEÔ­Óõ•ZDÎ×À¥™YEäX ¿òüôåXCÏoCô}ô ŸðQòü¶ôtòwòñ?Ÿð'ÑóöÆòooM¿óóRñ ÏASÏóOðw2 ¯ðQðÏóK/]n‚s¯òL¯/Gãðq w€?€?ø„_ø€ßX!ô ð¥óÿõ†éi4Ñ4ï/ÿÍPðš¯õ*÷ø'w/ô‘ô¿ø†éó¨¿ô'øa?K6“ŸæÃCÚÛj4Lcñ¯Ž%ö3Ð4?¿Wê!rTgîÜòSØw!üšQ‘åõ‹ø‡ ò(ÿ¯ò… ó§¯ò#GöVÁÏ4Áïîå/üæþê?}°þÁÿîÁßË>ÿóÿy”Qþ»þù¯ÿðôïìÁÈ@‚ì3£ÏÂDú\HD!„.ìs0ã@=é’ÃH’Dè@©ç J–-]ŽøòÀˆ™5iÞœ9BO =}ö„$(¢E2äè¦CÖ}zd©b¼ÜÁzÇ 5GÖl€°Æ)>|†˜5 ¡éZ³LÛ±v¶ìYk|êÞµ[VïܸhÝú=û·,½æs˜ ^{IýæCÀú´p¸î Ôí²Ï¼#B1h PŒ¬°2b«5¸ƒ;‹M+Y{Ð0«&ÜpC1Œ¸0C ­YÃC10˜Q4‡Ã±¶ØfÛ¬4i+ÑGØ^s¶½Žì°°#—d²I·Ö‚’²&õ’K.&*J)¦Ô"JKµ  ¬)>¾|r­.ÍÄ2Í¡ˆ ¨6}rb=P"bN—îdI‚0F€ '?k¢C ÿÊxfP Ê4Q¢]T©.uÌ-Ã:¢Ò«.ÌÊ ª¼RÊ/À$ “-´¨œr.SI l®0ÛÂ`Ä ‹ì0Y?­V[mmVsµñVÐ@Ô5HÌN ¶5cƒDöØ\? n6YãQ6ËDìQZÓH‹¶¸òæs­´Ù¾E \kÅ%V>àÊk¿s™+W·vW“.ºîÐ]W^hyÛ¶Ùä\ã/¹Kÿí×>äo6÷àíÎ8ƶák©uâ;è¯@­´½¶áÕxäWái¤w½ötÖßùöW܌յ–3ùHñRLµÚÀ"üõW¥­uÙm^CfL½Ø`CMôu˜ËÀmŒXÿòZ»XY\{•z´œ ÍÖ#_e±R¿~ T+½>uÔ½R=Ô2˜Z»)2¡l›m¸åž{mDí.êî¼-£ïC%ˆg´8 €•ðlé 8×bE~œå67òx'·œrÈ)¿œ¾Î«ûÜ^Î5—ÜsÒC¯|ôÌWW½uQßüõÓgg]öÚ1wwÛs7ýöÞyvàEß½xÝÿÝøä‘Þ÷æ‡O]ùç¥'žyÑC¶¾ñ„Ó‹üqü"§—Àîµ×¯ûñÏOû«._xü*Vï`ó'®Ž}Ò¿×|7¬nŸ{å ÷¼sž÷ð`ùèŸ&0€  ÿÈ@JPÿŒ`ÿ4Ø@ >ƒáExAz°„¡ UˆÂ:…+ta ;øBÊpƒ¼!u˜Aæ‡8ì!­£šÒù~Ý ÙùêÓ„©ï<;Üéî'ĺΉ$]ø/î k}‹âe&žûLQ‰g4cѸF5¶‘otcá8G9Ö‘Žw´cñ¸G=ö‘ôc 9HA’Þ ãý²F&r~„OçÚWžø Ì~L#ì(çH!^²:õ‹cHDé4±^Ï¡—Á(FTžr•ôã^*±#ËXº2b¬|¥*o ËVâr—º‘-ƒéËaò2—³¦l’IË^ó—È$¦ÿ2£ÉÌcÖršËÄæ5µéÌbSšÜü¦7©ùLk‚sœÝ„¦9³©ÎmŠsîlg:áÉNzÎÓžòÄg9ï©Ï|6Ó›°Ì¢½:\BBÀÂ@‡2Œ@¨Ã" öìò_ô©„$å@*ê¤]Æ<¦` !Xc¥)]ÎUÜqDza§¸‚‚àŽÅ ç¥ƒ8‚Ê&•´±ËUörWÄâ7‰çÔCÒªUÅêUµšU®nÕ«]ëWÅV²ŽÕ¬eEë=yÅ;”a ߌ0×;Ð W˜øŒ: Á8C¨C>§ä,f¸ƒ„ÿàDÒafXác½Ç‡ Ìô•½@OŸã†Až•€ŠÆjïû«—V†p"ìÀ NØA ,ûpÀ¢dyNã øÕ=ô¢tØŠEØ ”‹_@“»Ü§*·¹Ìµ¤s£ ÝyI·ºÔ¥Ïp:Ýçv—»ß½®wà ÞìZ·¼Ø=®xÏ«Þô’·½ã…ïzÝ‹\öÒw¾©½¯ë‹ßø¾W¾ýµ/€ùû_û×ÀPŸjø lÀ<À,¸À¢;ˆ¡zB1½P½Þa/X)Cþ#?k”ÀŽÅJÂà[©j…w`†2bÌŒ'ÜNØ­0ÀSÔ2Æ‚ÖðXÿÇØ´}N4"|#ÃXG$ÜÚ:‡ ½„A‡ `/<ênLµ‹BNê÷z¸å€Õ•f3§ŽÍÛu3šåü»7×yÎϳ3ï|f=÷Ï{޳ŸùügAšÐ‡t¢ ­èÍåÑ‹†t£-éBSúÑ–fôš'­éJsúҞδp7-êN“úÓ¡ßsˆ°.<ÁÕ> ðæJ<>NȰeô‚šwBXƒœ`Õ\a t,3àêeß!²Ï)Ã0ëŽÀV»Ú™˜¦p1bXƒ€°L!¯Ï9­ülÚ‚äáRãpÁ"20€ða]t(O„! uôÿe Ìè°üÁç8÷è‹xØãO¢ á‹”!j%i® q@ qÅ1./wüâ ÅC¾qŠÜä#ùûD®r’‹,åClù~NÎò—g|æ0¯9Çons”ï\ç=:Í}^ò ã|è.?ºÌ‹Îs¡/ýçM‡ºÑNô¨3]êUúÕÕç*†bh‡èaLÁh@ÃØ© ‡ç`@ÄûƒŒ«ŽSÍnÇò X½Áééñ‹]Ídƒ6.­nhŠåL] ׺Q©V†Ü …ÛͰt”Ü!°ûQ8Â2P€Du@•uƒï;£ p˜¦ð > ƒÿ?íUX2xáBNzñœß_t,áÆ„Ÿž"´øÜ¨*ÿYJ.n½úÔ?ö¹£}æpßqX¹~|©ñƒ?ûâ??ùÓoþí£¿ýê?û»ïþùÿþòÿ>Ë6§믟ÿÞß¿òû?úË?4@ÿ;Àø@û+@t@LÀû[@ü À”Àl@´À ¼À ¬@ Á A$ÁÁ,ÁþÁ/" =Ø€¹Š5#ð'À'0‚Ѓê({©¹ƒ!x`“'(€;€‡w°€4:P¾†)€†)ÕÜÓ çó‚"HçsŽâŽåcŽOXÄ« #ø½à븋ƒ;"ª©Od¤P< PEQôDS|R<ÅRdÅUtÅTDEu‹Å‚{EYlEX¼E[¬EZÄÅ]\¢^F] F^Æb$ÆcüEcLFdŒ)_lÆa\Æh|FeœFfŒªk¬$l¬¢j\FÒƒ(t`M,€KèGÔàÃÖ£ƒ¢*ªØ+ C¼Šÿ1ÈuH8„£…¨ßÛIð/X…ß>งP`DâLÄ@âT¸ízùÁžì|/í 0îä/ïl3ð„3ñ$Ïí4Ïî<ÏïLÏð\ÏñlÏòDÏøTOùdOútOû„ÏùÔÏúÜÏûìÏüäÏõOÐ5ÐEÐ÷TPü\ÐÿlP}ÐPݘHÂ`¤jø"ˆ†¹%óŒ»ÌK+ …Œ<èÌzL‘Ò/gƒ1W{‚f£w (:˜ œ;È8’*q•:(çˆPèK织ID¸ÿä¼ „>­ Ó;pD/NzH8¾‰õ‚Š­ž¶+ɱË’%Ù“5Ù”EÙ•UÙ–eÙ—uÙ’:@KYCƒ`h€lP†µŒË¹D—gx<¥KŽ!ÐÃK€ePp 7 ‚†* ˆ¨Í*¤ƒSx­êCQ±q Çsކ\W;˜<‰,C4¬» ëŽÀÇu}×s°€†@I(a#:Óö¸†¬àƒ‚íË„ó‚uXDá«MÐXá»Iê,çDIT8°ÉE,>G\¹1³Õ]ÅUÌÕÕËåÜYíÜÌýÜÍõÜÑ]ÒÝÒEÝÓUÝ\e]ÍmÝÐ}]ÓÝÔÝÕuÝÛ…]ÿÜ•]ÍÕ0%´† 5Ð!¸‚ «>P²9 "ÒŠ¾j»%1 2°ƒ<*‹Çâ¤ÂgC šr›I) ʪ²ö8C¥½GXR;hÑ3ÄVt!MÝ0€(H{tQ<˜CDˆÛ8…>q°· Á±¬8àx¼,ÐOn¾uXSpXN޽ r€¡l`äKžTÊ«°`!úA¬Z˜5á˜=áFáVáfáváîŽðU`ý˜ Ö@˜ŒbB M Ô€š 108¨ 0€Ü®œ™0Áâ’Há²àZÔ¸k˜ Cö öãÿÙºLÇXÞaâƒ+`_2H˜Ct@„ (€fàÕSš¾Áã<~l€IýR%àXL «ïÑ3ŽÐeÐDvPE†PF–PGFäE–äFžäG®äH¦äL¶dMÆäMöäNåCeHåK.eN>åONeñ‚oL˳ÃYåY ƒ? ØB¬ø°_ÍKyq$–0º Ê™(Ô‹‘('¸¬ËЍf¬ËÂ5õs»˜m»æ„Ò6<è«Ë™ß‹AÂÁtÑXM9ֆ˔:@u@‚7P‡7€ç7l‡cÛ$ èIXÄPFÏM"£‚èúè˜*èƒ&è„6h…Fèÿ…v膆h†–臞舦苶茮èÆhŽÖèŽéi&é.é‘6é”Fé•>é–Vi—fé—^h•š‚Ø 1;À„/`(üq;è…¼ˆ*[­¸-ð+VdG'ˆÂ¦W Û¾·ˆºIŒé=€€Š×­‚ªF·„y(k¸„) ½ÿ=m0*§fkuZ˜†ëåá¹NjŒƒá»–á¼Æë½Öë¾æë¿ökn˜‚/0ì/˜‚Þ‚JÂ`æËZ\ÃÚ;€ˆf­$Ðy­ÌWôÉ2ʱ¤°›!ífœßèPŠ×‚(aÈb)ƒfví×v•ÆÆr»Ô°B-ÀÆíÀÎíÝÖíÞæíßöíàîán>"îã.näVîäfîåvîæ†îç–îÇ ;PKcKÖ-hCICI5Pictures/10000000000003EA00000276796ACF2790C00891.gifGIF89aêv÷‚„…„ÙÊ„<>„ŒZ[…¼ÄÅÄìâÅ4BLÂ¥«¦¤ˆ¢À¸HH$J„NgŠ¥ÂädedL|¼º¼$#$´‚„TŽL6g¤h„¨ÔÖÓ©´ÁÛãèàÄ424\¤rl%OŒÌª¬äâÜdˆd4v$tÈ`œüäÕºûédÙÉyм\ì×@\8}”´LKLYp‹$4N,ôÞ<ܾ¼”’Œ{—ôé‡mÌ»»´äíô<<.\r”ìêÜgùòOÎ,Ô±_ß®»÷ëß±xÿž¼øóèÓ«_¯~QzëះOKýEî룗Ͼ¿õà(^€ãgà€á%÷Ýv 6è u&rÏ÷›t"—Û…ÄéVœp¼õv›n¸Ñ6[m¯Á&ÁjŸ±øZj0’ãh4z†Yg8^ÆYd<ö˜Øaˆù#„ &Ø_Fò5˜’{)^NÚ%e\l™¥ZpµUåYe•µ•V`NXW)e•UM1efšK!eTR:e“™B TPuUMx†Ÿ~þùgŸ€Úç „&ªè¢Œ6ê(‰Bê¤}J ©¥—f:馜B¡©§V:i¦¤^:ª§¨¦ª*ª¶Š*«¬ºÿÊ“§±¾J«¬³â:«M¹ ů¬õë®uk§±sö”,ž8ÁyçMÍΙԴÒNÛ¬µÎb{-¶Ðjëí·ð”‰­¸Ö– ¹æ&µU¸áu.»æºën¼áš»î½OͲ•¾ZÕ›ï¿m]yeÀë›Ö–YbIYj 9â‰Îùãš3Îè ¤o~wç£ èâ”êyëš—.ú샛ž¨Ý¬‡~8î¢óîúÞ†fÞ¸æ•÷¾¹ïÆçŽ<ïÊÏžüñÎ3}óÔOo½ðѽäƒÓ§÷‰O¨÷²[îø‡ó}¨ç²cžýæ²?þïç£nxîˆKþùýðs^üꊞóB÷?†Ï€ÁÃÞx;Ó-Ð Œ]i7Á¾ï´'9ü pvú àå ÷»Òý-{DÞ=ˆ=úÕ3œçNwÂþÏr2D ïfX(ßmÐ}Žÿ÷B†|ÁTAJ¨:öµµÓì´÷¿ÜaƒöÞ ©xÀâI„lÝ s8CDÐ}$"ã"G¿šNB”ŸÞµ¼ð©PuUL¢ûú×@)êñ~ ¤ÙÇA²ˆä#ôÀ×½B!1x&D>Fâ1Pf´Ý_ÇAà9²~Ÿ£àŸÐ§½úQ’`ä\íXÊ<²²Ž=¼` )ØJ;ʲ–±|å-aDâ²—¢Ãb iù<0fòt¬Ôäû"¹aÂQ”oÔ'¥÷@Ê•øsc.C§¾)Æ’† Ÿ65YIñeî…8gU>Ýq¯”æÝ7¸Mu’‘}§«ç7ÿOÝ‘ñ’+ä&§¨M‚Vмa1mèKLâ-Š |¦DE8шRô¢Í( 7:ËŽ–Ò£wd"ýÂ÷ÏNr$)(ÅQã ê¥T%ýÄùMË‘’”€B_˜P:*Ò€~TçAƒL Uƒ<*PZÔ¡2uKuªS_èE£†˜hü`ñ¨:K1ÒÒ Ð&¿¹C“&R’OaÊOc23•¼Ã''ˆ>»Yò“m„¡’Q¾&㯀M3r(ObucEì8ùÁH¦Ï°„Í_*‹JXm¶3Ÿ´ŒlJ«>jõ³Y$*X³ªQ~¶¢ý¨jïÈÚÓb4µ­E­i‘øPÄÿý󶪓)aKç=ôYò‘táf+P .Ô‚¶õ‹_høÛ•z’¨Ÿ«c&­¸Ñ=J·º £nW³«ÈënwºÝÍxêÝZÆï˜³ì¥Ç™Þ¶^Q¸ød«O¯YÄÎnU{ãÅ­èê*AZ΂ȫmï _¦¦ô“|aºÀà;@`Fçj¨ÌÝÒ÷šÃ;e,#)W½qŽSŒ¯WáºÐ7ޕĆè0;ªÂû®ò Ä”¬N÷ÛÉÛµÆ8¡WZ»û8Çtr…LcÙuߨ…+jQ‹ ¸¢N®q¥ÜäâZ¹aˆ2•›å&s¡]æ²'Á™ÄÈ–3œæôS€ÐÀ`ÿŸžŸmÇœ8-WÀ–Í£g}Õ˜áNªUÏ|ö3 ûüç=zЂ6t¢]hFš¦òm( a÷bµFq§ËÍì…Ú:VÎsŒM#c}Y:¢·Ÿ–&ï[Ö9v ςءDµ9ïªÜ?qÁm¶dIãlRŽW€](˜½mœš¼ÝèÿN¹œWNò“«¼å(gyÉcó—ÏÜæ.—yÎÓ¬ÐlêPQ²;w²u˹cc» F-i¬…-ÓyrUÀ l\|+:ïÅœzãx#× ñîîPÀƒø#ç8#÷lN' ꮿÚÕ5múÚIþBþB“ˆU°Ûçz^ÍQ¼°¤dao¥MøíM¶íx+ç™æÅ£Ùiw¼ä#OùÆW^ñ—ßä-Ïẏ¯P胭“}Û: iø·+þo0ƒÁð¨@à ~\,t€AŒë )CyÊ`Ör Ìdâ>ò²¥“ò’×Üæ¿é¾ÊR>q{ÏeDÙ9˽Wò”«ÜûtÔߺÿã?þò§üç7?úׯþö§ÿý쇿ûãOÿÇCñçHܼç=¯÷¨Wýüi”G§N^…C$–Y…gt:ÅUøAósf•–eR¦{RVs×xÑo`¦>æuÐÇp dð \ð ßp ߀vG”€›õ\n×Tÿô?æGJ‘DƒÄwÎÕN÷_§P„ewÈsl7•fèl™”x‰C`%kÆ„N¸„P8RQØ„Sø„Rx…zE:®0 &PP€`è'Ðñ0(àoÀz#p( –`{à}W BpôÖB {Éð}®ð7ÙР{òvkueVFpg ÿg ÀfXPvˆ}ˆÄ•ñÐÙPBÀ³ö‡à'ˆ„øzµõPk(E…Xh…¬øŠ®‹U8‹­H‹°h‹²È\,åj¢V‹¾Èr§‹“jfl5fÅówÿ4~q¶uæÄqÍÃx†¢„xépÖ˜0rY¤f[°}Répât„"±ð © y`Kà Éð…-(qù¤uY87§WÈu:ýØlø8Œ®faû¸OÝÈf5„™ ]° Y©ƒˆè}%“äY£6z£8š£:º£ŽÒwñÅ£æx`M¸\?ºNŒÈʵw™i¡yàÔ˜%(Åš»W䨣íÙ °Ú¨šB:CBà PÀšÇÇ€ Eào@©¤Ïé˜)ö‚Ñ § Jæ¸Í‰§’Y¤Aš§|Ú§wê§vj¨ˆz¨Šš¨Œÿº¨~bŠƒ# z]Àžçrñ0rz æ Çå'N ¡9Y¾PùÀ`Цw{wŸôÆ 0pª¶†c¦Øg0r‚B«â ôæf´ZkXúfoj€pˆãª°êŸjl¦‚÷}^Ú¨Öê¨×š­Øº­ÚÚ­hàÊ­w*w‰Z¨ùèœDJ§vSèj™Ðy(âxgð*›úŽÙØ o¶ˆõ7a Kàw Åp¦Ç°ƒÀ¦ûʯ »° Û°û°±;±[±{±‹± ›±Û±û± ²"ë°ZǶ— (Žf¸²þöœê©ÓŸ8‰ ÿç}0‰¡)é 6p{`ÖpÙpª}€e´ZFk´‘ʯ¡j† ë«P6ˆX‡)y´jÀ#@oÙ¿w\ ʉB‹e`–ŠÀ¯Å £X6²j»¶lÛ¶nû¶p·r;·tÛ±ñª°w;±µ Ö¸ë Q P¢ð  ¶Pç³°i ·XF‰ó¸û a ¹ÃDZoæ°‘k¹0๔˯’;ºië· [º³²©k±¤{¹iûº“»™;»¡{º²«º—»°˜[·¼Û»s[ [i«® ˆ¥©«+›zàþFˆÇU” ¡ÅГ)ùf)+e à³Yv‡”3{ÿ°|Î@¡;{Ì¢¾â“ÆU ƒÈ  é”ÛÛ½B ee¨–Zæ}dÙ{¾û¿Àl»¹›ë°»Ë» »[Àk¹³+À¹µË°ŸË¯½·dL¦dL±oæ `¼ãÁ ±µ›­I–¹Û°–K¡J"š‰Îá§p *€ÜÀÂ0@À<ÌÖ»Âa`¹Á—eF fX&¶ÃÇÀ)ü oÄKüÃF¬°oÖÃJ‰XÌÃX<Å Å`æ¹ÛÅK¡+\Å›ÅhÌÂC±fÜÃnüÆplÅV¼Æmü°iëÀ¢{Åz,ÇXÜÇ{ìÇ|üǂȄ Ȇ<ȇ\Ȉÿ¼ÈŠÜȉüÈW sɉ – W̲ñp²›úow†“Ù¾uÈ`¸gµ –š¡9yŸ¬J‰ÔÛð`Å — @lv>ºw¹`v˺œË©É0—p\±<˵Üp_Pó{¢8¡­üʳÊ`}yÙˆg†{ìÈŒœÍܼÍÞ¬ÍàÜÍáüÍâ\Îä¼Çkœ¹X&Æë,ºk\ÆLÈ?œÆh\ÄPLÇÎçÆó¬Æí|ÏD¼ÄÿìÀu Åe,ÄHüfýœ¹Büº-ÏôÌÃTÜÎ Ç!|šOöf¸ëÀ®€Ñ®ðÑÑäÏ<ÜÑé~&-ÒG¼º¾WÅ€eB)0)jÿ°?@º  Ø  kàº.]? eB Ô@=ÔFMÔR†¸ˆ[&ˆÔEÔNýÓP}ÔC-ÕQ­Ô‡ÕZ½ÕIÔKÍÕ¾GÕV Ö--Öf=ÖYýÕd]F-ÔníÒoýÒp=×r]×q}×t×v×|½×~­×€Ý×ýׂ]ØÞS©} jP×.­†/í›HˆÅ`{ÿe {r-@–rý ñàÖa ¢ñp¿†ýÖPpŠl&/}Ú©½Ú`˜·=¾¡œ£Í`¥íÒ˜í`ðP ¯ ̓ܭ½Ü„ÝÜÊíÜÌýÜÒÝÔ ÝÖ×@M\ÝÔDý{gÿýÝS ÖàMÖK]Þ@ÝÔÜÔ¿×ÕX½ÖR ÞGÝÝîíd'}Ñ"½ÞNmÒpûÑê Õ&ýdN¶ßŽßh{æ}–k@ôpÓô`Ø@Å%e_6ßÞ{Ujgî}áŽák­á¾áná&Nâù}â#>â`½â*þâ(¾áN}á"ãÀÇâ žã:¾ã<Þã>þã@äB>äD^äF~äHžä@^á[MãHÝdåDîâS®|V~äRŽá8®Õ®`þåÀ7ã_þÑ^äPâN] eÎÖ^Ôj>æ.  ¾àõÐ Ã0 ÷0 x~ºçM^ä[žå\íá„n\_ÿf\»çeH­áTöã„.çONÔ‘ÎÕR^é…ná˜Îå2çVÆÔê»'ê >ê¦^ê¨Nêª~꫞ê¬þê®ë­>ë°Në²^ë¸~ëºn뼞뽾ë¾ìÀ>ì¿^ìÂnìÄ~ìÊžìÌŽìξìÏŽê®è€.éŒNâL®ãP^ík}é[Žá›Î’QMíŒnè>é™âRNåkýíó­è®ê í @µu øŽøŽóÞïþþïð?ðò>ð¯ÁK–ðßïNÒoðÿð-ñý.ñOðñ¿ñßñÿñ ò"?ò$_ò&ò(Ÿò*¿ò,ßò.ÿòoñ,ÿñ_ð4ó/ð¿ó­d ð7?òAó ïåDôHŸôJ¿ôLßôNÿôPõR?õT_õVõXŸõZoæ\_ægîõ`ï ä ödö_Òa>öh®ödælÿÑc?öe/÷jOhþålÿöFOöq÷|ÿ÷äÐ÷xözßöaö\æŠïõ`¾øKðör÷to÷bOùiOøf?ù‰ï÷{ø[ú¢?ú¤_ú¦ú/÷~_ùæe¿÷eÎöŸùoøeÎõ}ïøŒÿåûºßõ³ÿõÁïûf.ù¬_ûÈ÷ªß÷‚ïõµoü—ü€_ùuoüÉoø^^øÌoø²ÿÿúÒŸø½ K þã_þKpþèŸþèo÷ÿøhnýÍßóœÁL¶ôÿUVeº×õÐÃØÜÿQ†@ Âs0!„a:äƒĉܸy¸ÈÍF?=øÙRäÈ‘z@šD©GåJ–-õ$x© Ì™/kÎL3gQ Œñéó'P¢C½÷óÞ¬_I=5ò‹éÓ{O­^ÅšUëV®]½~VìX²eÍžE›VíZ¶mݾ…WîתV«Nm*õ—¦Q«þ5’ôèÑ Bƒí¹3&L=ðTæ´©ó±KÊ+ý¨¼œ™¤È ;üœ#ÆŠaJO|ءƒ­‹ „Q+öÿlÙkU¨•wnÞ½}çv\¸+rÄ‹wµ$9ñ%äš/]úôcKŽUǾzòéб[ï.ÝùòâÃ]Õ:^÷í Ý·F?õÉF_Ü Jf™•¿Üé0¡Œ’Ê/½òÂêƒÔPPÁa>Øçƒ÷¡°B4†Ù ÑèFCÑÀ&Dħ OD‚&°iZZĆc¤¥Fml‡–tÔñô‘Ÿø!²H@ŠÌ€Ÿ$3`²É&Èà(§<¢J+¯Ä2K-·ä²K/¿3L1Ç$³L3ÏD3M5×d³M7ß„3N9­Ì`Ê:Ä“I%‹ä³È!tGAiÉñFCÿc„Wl±E|TDÑÄG1Ä=FC 5¥ÃN#œð—üåƒR¯ªK¯¨fì§œƒ,V(*›Õ¤ýLÊO´úL›O>øÞk·Ý€C=óŠSî¹ð¼o:ž…6Zi§¥¶Zk¯Å6[m·å¶[o¿7\qÇ%·\sÏE7]u×e·]wß…7^y祷^{ïÅ7_mà·_ûíã_&¸`ƒ"`„ÿUxav˜a‚!ž8b‹)F˜bŒùÝØbîØã„?æ8ã‹I~Xd‡CVyä’[>˜e˜]~yf›+>Ye™o6e€Wxckþ燖¸`¤‹ÞÙg “~ºh©ÿSž¹ã¦E>jš †øjž_î:æ¯Ýy–æ€ûl°Í®íµ·®cµçvYã··Vûç¼évzd–ÝÖÛïµ—¦ûïÀû^šh¾Ù\kÁÓÜäÅ:q‰íö9ì’1?\j·»îËñvüqÓ'ï<ô¶á¶›óÕA?=õÈ#‡=ïÑ]ŸsÜ[ŸšdÜU'g¥Yï½ï©QW¼tÛsGÜqÍ}'~yÙgß\öÚ©'Þsãg¼ó½Ù¾z˽ÏÞå²¹_óƯ^^h¸‡=iéßwr¦µ/žëü)ô꩞éÐ÷¹ðvïŸÖ 7?Îií#èž÷=é5jÔ  äè':ÿÝù{¶ƒ ÷¬–²ç ƒØûßSgAš°p|aù‡´nÐ4|[ÇBBÍ~Ì“ uxBÊ zÚ«ùð÷¿Ê)ï 4] “ÇÀ#n­l%Láø ¸ºþõÎr8Dáö<6>#PŒÄŸÑ輞•ÐÁ#Ýw¿bQ~^ _D<²‘Ž×ƒ^ ˆ: ‚χ4!ämO‹»ÛbIÂÒpÁÓŸ!-©H”e Ž›ì"ìÊÇEN–RŒêÛcól¸DMbR€o”$(GÉI=*ì|DìäC>°—q´$9èËF±‰‡› 1‡?`6Ñ™ÌL 4‰9ÍŽÿð•×ŒÝ •YLaÆŽ›Ã|æ2…YMæõ˜LŸ+IÉDvB“oݧÁÉÎc¾ó›ö g7‰YOwbó™ú¬a6ï™@€FóŸÒ$ ?©9Í…Ê1‡ÞÔæ÷öÙN‡‚QœóT¦C:OxNô¢ß,›;t™°>ø"¢MœDUzÃ?´{•§=‹I͹³—1(LûiÓ‹òs‡$íçN‰Ê;zó¥=å"à”ŠR– •£å\©4uºÔ\žÍªÅ©BñÉÔ:•§0­ÜIÁú:xútsZŪ6“:¸f.ó©}ȧNyyÖ»¡®AýjT©ÚÑfTª7Õ+=úͱ¶Õ¢çó…T Ò½Ô±ÿ@0i?˯ÈN‰ilf×W×'6ŠxLlÃ*ÛÖµþ•³nM%^-Û°ÉZvx-¬c·zРšs¡™l¬måúÕ×–œ®=§iwë[â¢6—ªýlæ:{ÂÒ¶òvN-®ýv™=Ãö~2%ä¹ZÝP’°ˆŠ¥-vqjH‹·¥ÌÚÝÃõŽ XØ{)P¹ƒ"5Ý1’ч÷ެ½ó-~L_µy@ðÙÚ+_ú6ø®~Ü6Y˜À‹a@3Ü_Oô®(ƒOzÕÂuØÄê"¯ëÒ·Å.†ñ‹ecÏ¢3žqM³™á7˜ÅñAuLb B˜Æ$ÿò‹‰¼dóX£È£b’<å"ŸÎÉÖæ-›h‘£X0CÂ8Üd‘r9Zðœ~€ˆÔ‘pÔp ¸bñh²/-|âjQ ðpYÊå“t  €fà­Êv gƒÇ,üæg„aÍaÖp 9 f¨ðØð"&ìèñ®ôÉi5*ŽLeVû5ÏB^õ«e-ÖŸº£Ö´KAëðÞZ×7F«Å*B`7Ö'¤¯g‹LTû5ž´x¥Í6:yn³€(ŽtnÌ} °ƒû€íth›ñ¸ª;ô;7,Ü‚T›CpH ïr†áºï‘1ºÊ.ñ¶ÿ) ÜÈ$ìzçn€ÿ;`ðpEÎÆ€C÷‚ćëž'­àƒ×ÃÉ Xàñ³‘¾ü¹µ‘,eÃC ~û4ǽæ}3¹æHÆ9ÊnUžç|ç>·ò¿ýï KyèùFºÍ…^â¢_|éMwxÑ£®t#³ê)oõ«A>d§Ûœèÿy×Îô%[}ëcŸúГ<öžw½íUï±×Ÿö+—ýíw·6Üé.uªÏêrØù† NûM¾ü…ïzá x lW{Âf¡…‰”õ˜Å1\Q‡uËW ÐZМ$Ëo| †àÌð¸;<x,!}Èã+Pÿ‡>x Ÿß<Ê!oU @áÁ ž}æ+P‚t„Pˆ}Pïx•ë}òK8\gá DÃÎ}=6ûÚçƒÑ¸w…<à:ýÇ÷žöÇÀ‚*àúY€æ8Hš  ›ÃÒg<Çëƒ: ‡„À´cP½áSÂó4P[¿T=þr·Þsˆs¾V›²wâ:´+»©û@±ÃºÔ;ìÀ«Û:Œ«¾Ì»dÁ³·ó»´AIJ¤#»áA©ãü:¼ADÁ¤‹;£k» ;äÁBA·;A¼AÄ: ºŽÈ»«ÉÃ7Ä3,H (¸4À‚cЀ¤.¬9ÿw˜…08€ðx/ä¯B›AŸ ˜z8g¨¹€Ã^ C3ì!H  €0€ñS³z€ Ô€dh3X<g8ƒÁ*‹9’â0I‚Pƒ €æ 8Ã1,Ã3¬›·óN“€DŒ‡cH(‘"Ä/8D X4ìS00J«…{1¤€@ij0àEy!ˆ‡‚¹«1<5€@ûÃ4X„cˆ‡x€pfX>¤à7úâB…c2ðCè…/ÈFÿC38 þ;h„BÓ9¼ÛG<ôÇ~È%äÇ%¬B|TAƒÌÇYÃ2+dÈ‚”ÁK;²È!,±ÿ‰H…,BSSBKÈ› ÈIŒìÁº«¾’ÌÇ«×[:w0³g¹½Ã“¯€ìË8<0¸jÉg)DZ„«qܯÃ󽕛/!¸xÀ‚3”Išì=›T8w¨ƒZÈ8fH™´ó©„«u»ÂšŠ¹³JfX¯Þ븤Ü7п><–d ð2<€ è¾sÊZX¯«<c† Hƒ©œÉ´´IÐÅ>KtóÈëƒèÆ>ÐC²„wãF¥TË>(!èƒ ÈãÃ㽚ÊÉgµÉL:ÔKíãCûëH‘\ÍÖdMÖÂ&ŒÍŒA“|ÍÖ¤M+ë;׬H‡<ÿÛìCD°Ù4I³CÂÛDNâtÂ)œÍ†ÜJ,<¡¬9l3·3„IøbLi¹½à NÉË6«þ{°Ò£C(80žãÎ>¬ȇ ˜Ç쌖| ˜î8†E;OÆŒ=€+?8Ï>Ø<ÎôF(P8ÄÃO¸ª‡™Pù[ÌiÙÎíCNs‡ H`FZL˜t¨Oïȸÿôƒà8C¸‚Oh¹½óã¯cP<0…ôdË}ÓÌA<†EÐuÉ>`fˆÅXìxØN)ÜÂïÔ6l{Pí üÏ DOeÒ&uÒ'…Ò(•Ò)¥Ò*µR(ýG‹ÔÒüÈ,½Ò/ÓLÜÇÓ2%Ї„Aÿá¼;Ë;,íÒ7US/5Ó9R/µS8eS4}Èî‚,Œ¡Éºë|P’“0¢s@¿aL¸Z/ò”/ÙCÕܱbPýD¹zX 8€/¹]¯DµKP²t°o4>¯Ä‚¼€„¡KoÄ Ôw{Îkë4,Çz K‹3…KíM€ñKUpó€ÌÃÌ„aLS8P_µªdpÜhQË.à¯Nƒ+ùÒÏœ‚b¨P ƒdX3°B¿q9˜5JíÃv˸““>äÍäd×uu×v…×w•WÌAy]HßÔ:àŒ×}µ×~=B|Õ>NUÃ}Ô3XF+u¹>¤Ët€«C•Xÿ……„%Ë}›ÅØÃƒûì½óDX ¬9­…‹…Òâ«9$UÐÀåF̬RN눥rìØ´38—EX— ÙÿÜ·Ã(…X‘›@mÙà„ØY¸= ø<’ƒÒ‚í“åÆ: Qƒ=¹`5ØÔ¤Ó¯Û°Û±%Û²5Û³EÛ´UÛµeÛ¶uÛ·5S•Ð¥¼“=¹Ã“€%¨ƒ gpØ©…‡^ Á½·Y˜›…ˆ=<5˜…4@L'(ÀƒrðIpÜ[ ȇt¸ZÃd<¸ ƒÿd† dÐÀÐÝ7WÚ’-ÕiÝÚó¤Kšh­Z½åÛÍRìƒxhQÿnL´Î•WàXe4ÎÙ¼Í\g脜]ÌE8€4ÀƒÆ”R(8¨ÔZ¸ÂÛÕÜDëràÉô€)…Ù}ëJä½ÝåÊIÊU?¸uß÷…ßø•ßù¥ßúµßûÅßü½+?MOª•ØÃ«,`¼%PƒÈ]ié´x˜…%¨8轓£€b€%€RFt>(tͽ nÜATÃY­g8´‘eÞPRfhÝÝó$ÍA´^Ü«¾·©•Ö}£Y¸‚âáÕY>†R€«|¨a6àóÃ= ³Ý£ÒüQ‰5#öà/о‘ëƒ/€ÂÌݺ…«®¤a ‡Y°b |?ÿÖß4Vc)åÏ6î7†ã7–ã8¦ã9¶ã:Æã;Öã5æã>F[þ”c?ä·•ÛA6äCFäûEÑDfäFväG†äH–äIÞߥäKÆäLθ ÔäNöäOåPeC.äQ6å&uã=äàŒã@Þ·U^eîäT–åš‹e:½e3]dA†e(ÍåHŽå_þåKîå(¥e[Ff¸æ> =þZª>k–Vé§6ìÄFìÅ>ìöҒFç(½ê*%ì vRÀl¾fæiæ©îìWnÑ­¾æµ&mº6m³Þë¡VíÒFmÍfí¬ýìÉŽlÙ®ßÊ.Ów¾<”¶çÿ|ö¸ÝömÝîrþmáîÞ.nÞ6ë+]ç…¶R~þì~cçfn[¶mh¦ÒåVæ¤~îZÎåf–íÜVf©m'çímèžnË.ÛÏ6hTžlXNmÖNfefæúžoú^í»g;陿ïrþïÿFi˜ððû=ð§é vìOl’»‚€pŸ6nWOþ$9&ðv¶i–6…oéñ^,h 7j‘>ñ}Öh‹^q޾i¥è¯h¤ÞîOñïg×ñ¥Þq·ñçñ WÏ!oê¡e Ÿð•Ng$wpx^rŸ¦é'_ð 7e¸žr7òô´òà|rÿê gñ»îì\žiÿ'7ó-çr‚.q,÷o°®f k×è‚qñ#Çð&ŸjúiÏëìëe–Z‡¶ðþVò,ÇòDq…é˜öósŸñI÷ð1§óضôÇô:s‚q&r(Òu.sõnlÅ>uÆFõU¿nÅu—ÒRçr¢ŽîÐoYÏðð>ï7ïÐöõèæuxþõ`tb·ôc¿ódïÿfo8÷8ö~v[ö܆öiö`¯öl—vmÇöm÷önÇö6wéÜ~vgòsgðtïò!/óÆFñRoc¿õ`Wðr/gr§÷|Ç÷}gö~¿w·÷€×wsOr•6xÄqjw-·öóFvÿpïˆ'ðGi|7îf'vY×õ®Žÿ÷§veù_Çøj÷C/ðÎy’‹w…ÿø`çxwùpwîŽõxÏxÄ>x¿wi—÷]oygoxnúi'ù£7ú¤7ù¿g\è„NÀ…€ú§ú©·z§¿zª—z\H¬÷ú­§ú°Ïz¨ßú²'û³¯ú´7{µGûµw{´O¨{®—{¹çz¯û»ïú§—‡®—úNè{À÷{»§ú½o{Áï{¶'ü©wz¼{LJü¼—üÇŸ|¶|ÊÇüËoü°×üÊ÷üÌÿüÎýÑ}¼7ýØ|Æç|À'ûÍ—‡ÖŸú×zׇ}§—}ÔýÿÚgýÙÏ}Þwz ØüßþÐÏz¼—ýÕWýäOýå/~äg~ÓwþæWþ¬¿ýç_}Þ§üÓo|Ü?~Ò'þÈÿúíþéï|í×ýÒ'~ïÏ~Õ‡þé_òþ÷ß|àW}ú~é·~øwÿöGõïÿÿˆNp $8° ƒÓɲd ˆ'R¬hñ"ÆŒ7rìèñ£Å>E!iòãÉ’#A²léò%̘2gÒÄHrcÊ•*%æÜyÓçÄžBuÖÔø³(Ò™=3혲iÒŠO‹Njõ*Ö¬Z·Ê|¨³*دFÅ-Ö,Ù³g¹²„ê”-J¢pçÒ­k÷.Þ¼sÝêík—¯ßÀ‚íÿzµZu°á´r9®ÉW­b´eG^Ó²dÈ™+sÞì¹1b­š‡¦šóØÉG–y˜&êÏ­ÛÎŽ+™öά£»ŒmÚ!ÄÒ‡Z»wgßü־ׯÿý÷7Ÿ¿ðê<ˆqÍlŸêÅ b„¨àf£»w½s¡ºA/ ¼! äþvƒtÔaƒ ÐG[f<™aPƒ*`_—<íy*|y–»ä™ÌÝ<å:ýQ†¹3`÷貂u%1E=êÅ)J±ŠT¼¢³ˆÅ-j±‹\ü¢¥x“ ¾®_(ÂbÓE5Fqnl#Ù(Ç7Î1Žt|#£HÕ¡-+œÜþö…ÇÅ1ƒc\K×­Bª\á!Úãú#Á³QNw”ŒS½ù)Y2Xð‹´å"ñP Çz!<¬²•¬ÿd%&g@øÁ¶ô@,£W<Šé ɨƒ=ÎЇ>œa HFÙÞÆ¯_³$g8@9º¹1S˜8ƒ=¢É=ÐYO&ˆHÜ(FŠqöA… àyI2_ðÀT¤x€ v¨³¯Ê³à§ìiÎ$ΓÈK&A0ÌN ùp†3šP„*´¡ }èB#êP‰Bt¢­(F)QTPJ`7ˆ,&{XÄ*V)Ü*[‚Ðà›Žå%)xñ§Êb¶DœªÀú@ Y¸Ntº•­YAÐ×à:ÕSµÝjoÈ/Rd@sÅ%àüªÜàBuªëƒ<°0‚ar·»Þý.xÃ+Þñ’·¼Þ=N»¦î »‹Ø®yã+ßùÒ÷»#Go6Üé lGÂ8Iáƒ#ØÃ^}ÂfƒÛW2‡]JkœÐ(óàBö4=‹jQ7¢Bܲ÷ŸÔÅ-TCÿ¬ÎLr–›üåWæ>Y‡ˆä£ ¬ÀVìX€¡5 iÐŽ5pƒÔ£ x #7 €ä# ì¿Q‡!`à ëD6ª œÁ|àƒ²+²#æÝ”Ïp…Ãj ,Ðe¯p†~_asØ å²à l–éA c”á›þSçxA ÔúææŒ—;„æ¶,Ѓ.btQb€eàÐNþ£8}€‚dJÚ‘&n¢ÿ'izÕ_ÈT¦J-ÓäŽ,”#@5¦Tm²Oƒy_¾8)\0„!`À 2®Ñ€’ áø”gæ4î,MpŽ_#%âiKX‘:eI­›Aÿß6ÔÝñŒ× n&ÐêZÐb µ{C9Mñãþ L]Hò­ï7ôX­ôF'áS¬" XÅÜá"  à¤÷~‰˜ }Ã®ã Ø`‹ÏÀú(ë¿6ñ1³€20dÀ†äà O·Â&Μ¡äf.s¤pƒ-¼`!ÆPŽ2Tã\klIQNµÇ>¨Òaþo ¢°ÃÒ›ôµâBºRÏ­0õö¬÷ëšóEÕ1à›š½ëâ.±Ùa^|˜Ö˜ÊG@XëÐͽv¿Þ}—ìm ì.ø5¯àXÁ |ð€à‚ßÿ/yw¢E¦ýì½ $š÷©Q‰aö];#Ÿ?ýÏãžúÕ«¾õ¬'üë–¹þáÁ¦¹ ÀÈ*PSáçhÝ1£(F³Ú¹µ ø  pK[Bá o2YçéË£îuà²aå’Ÿ™çê ˜ûÂú}÷‘ _C ˆ€ Âߨþ™_Zà¾ÍÝOY Ôá´fw lBüCÑýÁ À´}£=Ô280ŒÅ@{¤ÛÙ¹Ž/Ì@ÕYlÖÃÅ–m¡ÎdÃÏiNøDà Ð}BJÞÄÝ‚ñÏÃÅÞŸ L=8ƒßý]¥8ÃÖP„j‰Ž)ð þÿ õ L 2 G})ؘ ø@ãÙ÷Ù¸À± !ÀÈC”…ÎçmDN„àAn¤„æ!•q”KSˆê}ÇF„„Áq´OKQ¥KP5ˆëá ëýáê½^ _ žì€øÕ]ôÀ0@§Äƒ<¼ïÝÔÁì[Ý©˜Ÿ)ƒ'~¢'(6ÜÏuáQÀ°øÆqßÊ­"°Á¤ÃÞ L/¤¢™•\öù‚¼eÉb:”½Ü¢œáß™¡ËIèC0v[ç xA¸TB”(´ÂÏàæœ Ø0X0˜9ŽS­£9Ž#0HÞ<ÒÖÝÿÏpÁ\…#;ªã8ÅS¶2à# €HÞ Ü5ËàÕÎ,€BDÔN~Qàö—T€ôàÊIàÁBv$ìí Fz€+Õ¸h EZ$Fj‰3¸B2dä˜àÝVEg LÂ5ôš”ÄdÀá  @ dá ŽÚ<:WB O,PŒáE”áeL„ÀƒS¦ÁD`+<Œ€VÔjÄ0ƒSº3ÄÃEHeD¼aT’Kæ<ÀÃ1ü”Güa-ú!_Òc¦^-ú¥Ïâ JŸ<$Cæ‚AÐb<˜Bx  ÒX蹑ߙaaÿ]èt"(*ƒ(†&)"댠Ï9‘/0À 䀴bÆé_ðÁaÜ !œkžœ÷­Ÿ•€0mr¦å&bÉ@ xßozŸ7ÌfmúÎf˜€T+\çu6‚4TÂ9„€9À!Ì5Z†| 84@¢0{^ƒm ²§{¢\zZA@ºHÄÞ¦/,iÂzªg{®g}Âçi¦ ÔçÚ§à' Â`ÞîWèÌÂ,tÂt‚<ÔNNt.(‰Abd2C œ3ÀƒLʉ3äÀà‚x€ì„Õ—¤-!½mÁyZlÄ^,~Nl¨º˜lƲ,)ÄÁ¨nΙ>Ü,0Cèx@>ÌÂ1`A˜å1Ì‚Z‚€,‚Î@Ø%™ò<äÝmÉ,`–,‹å%)¬©l‰ä,¤Öz@-@A d$”²ŽÀC³ôl]m³ÔAÓšèÓz 3ÄhDíÔºBÕô“zI2\md­–l­+tí׆íØ> M†Ž<Ȩ«†#kÃ0 =¸À8b€0ÿÂF§M†<˜%H¦©3@/ði0$3ÔCDà,]bUA>¸XºC쀔Àê:ƒÎ2­PQheTz¤A<2M„TCÎB[ÖîíŽDíº,ExÀm(ßO¨¥+¬XD2±îÎ&ïòFD=0ÃÚ.¦Þæ]òny´¨ûA1ŒoT:/î–DíÖBäתºêþ2`=+þïˆäÁÆ,ÿžæˆÞ aF)ßåB=”S0€ZšBôžŠ¨æ •ÑwM[Ø—ø?œ'¢•˜hf|Á”b‹Ë•kVa©ƒ0¬€ºzj”ªÀùå¼Êë¹Þp—ÿ*×Þaý°¼ÎÜð”çSÄø¿ÊÁ- Ã.4ÀÂ# Ã gjNҸ㱬Ÿ,šNDÅž±O(:…qKDÄ108ÑA8²ñÅF¨L¬Lƒb,7ž 4Gé§Ýà犨C ”CÁXzÀAYV€Ø@18C³À14‹Hj  ä–À ß-2‘•–`Á,| d @A0ÒhF..8IÀ]„A:Œ„Àx2ùa—ôìú)k‰)k 3ÔAô-—,K*7)+»2,Ë2-Ïht=JÙ:×à1°Ï!pÀ01 €ƒ0xÿÃ5ì¨þL)EÔ¬pr=|$œîj2ÄC „'+Ü “)È)¼$ðJ€P@<`Á¨%%—BD,Â'M'üîH@m–DäÃDhȃ#´B3´ZJLò³t‡¡fDñrïOà¯Dî.2îÊÃG‡´÷2Có´=tDsE,A>@Á1„ÁJwtN‹tDôB74H@-˜JDZ®>+V[Dó¯R=±W³ëǬX?qW@1`pƒ€<Ô™ŽŒE‘÷ïD U«]K„Yæ qJD'ŠbÝXŽ_ߦ\Ê("¢n ƒT–aÉ@¨ƒ¬@ çV3ÿ q®@r®¬Å5ðeç ûœq /¬ì•¡ög§h'¶Á+ˆ:ÜÂ.Ð <%ìÂ#Ü(,x¢).¬@¬â·q· êq·s[Âô'ê˜â Œ=<Àp;7wÀl‰µ 47w#·\Ì2ÀtÙfB.$è-¤úÂ=—€ëo#{€Í‚À`t'[/xJdÞ‘ƒ×j‰Hí–Ô–pÉ(÷˜–ÌB,-ó‹æCž-Ü3ÈÙ·ñøDzÀÔ ø–xÔ3h‰4x‚oÉ‚C탧ä¤à28Í,‹N=[®™ã±ÑqD4îzG\P;ð aC,«ÆO”@ÔÔA:XŠP‡ Ü€)ÐÕ7²"@h¢•eF‘õ›ÂªãA.GDRÅÊýzãIAHp¶ðŸ@I¨Pü¯"/¾ÿaq@0Фƒ ŒWÇ]R¤ÈÈ!ebÄê ,˜ ƒû ø³ËÄF äˆûãÎàF„¤x‘*Ø€”;pæÔ‰)kâ²3§'¤¼ócGƒºpü¹Qÿ‰ ;N†-ê3¡Ô‚VµîtââˆG—;eû ³®@<0¨ @WWxàÊR€<‚ujuÜX/Ÿ©.‡]•8ܞŋ€ÄW w±Œ9sgÏŸA‡öœ/jK  ¡Ëñ®T†[î³8ñâÆÉ\åÖͬsäÉ•/gÞ,šxñ.ù@x‚«ôZƒ„EÆÃ}úpØâBpSƒÌ9œÅ ÇúÄ@à â1`Ð^újŽ 9X€)ïq¥2­©tH£%H( ,¼JÆ™Z*0…?ÿ>â/@ï ªÃ R¯ƒX:¨– :&¸ðÚÈÁ *ècµ„îBÿѹŽÉç xÔøÈ>’ÉB ûkʃB4-¼îÌrÊH%‘dòȳ–PJ(gœ*I*]òŠÉîŠ)F9åYgiX&<„ÀdÌiÚÀåËŸ(@Nð ÓÎ:`àzºÀãH%û("!B€.4¨#ÏEà O-:@­7ݱá`|É”"à#S_€9à ç4ÃrHÕ€ñ&Õ‹DýóÏ7N}5NS 8±©?›4è™?LÑœqäèš `i)™ ¢Ã œ(ʨkz@Êç°Å¶( ª+ˆƒbzË´tºXëBH¹ÉÚnÚ–£iá­¶(èÙÖ;¨¦œÿ%G„âR€d Òmú¸¾FÈÐïúpf¶Ãf94]WÐõ Wð¥¶Ç€¨%cãH.¹3gÒå5 Ôó5ƒ•¬GâÌòQ㱊câ9ã†3*bâÎ6îøãÅBÙd“Q”ß/7"Å›„±C–¦®†ìàâ–žæh< ^&O=öLùòê(.3Ž!‘/?ªCïŒç 0œØŒ7û ”¹›âëï»b Ä€bÃôÃ>õJhû×)7È`m,GǽûÆ0ðÁ Û ¾|­’Ù-ßTT„”u§ ñÕ™ /ŸTˆŠfúé'b¨È¥b‚ïÿ§*üZò,¯ð@ô†ê1¥žz8˜ ÍMHÐB ‰^ƒé«¿Þí‘t <³ÌåŠ#ø0@ -ØÐ"þ#®À# eÌý>æG¿jõÀC øç¼–ôAØcëG¿êÏ?,–í6"‰’äZ‘%‘K&Ù)¶òR¬P…¸í:rÎp†öÂ)6Иh †ßiN÷hG‡váä(*¤¡ aøÈp†-t—HÁƒ$&ñÍqJ[Î ƒÌ" À——‚ðåyXê‚Ä#CKFJpfÀ#3h àŠÙ`! %èƒp†.˜'}8€Òÿ––ÈÏæ-+µq0$1E‚ $ã1oŒã;³É:Þ1{ìã9HòŠ,# „ÂÀ„á‚Ìc#}˜‡ªFŠpˆ0H€fˆG2JÑCJz`–‘Ç1 `†”‚p‡3 €5 Ìrð”'¦†bP@`œfK*i.3@òÈG_LcÑyž&›÷Ìç>ûùÏ€¾…¦éëNMŸgS Šð¦Q©@úÿÓœò”˜R*ÆâjJF4#dZ@(0ŠD‚cjC3¬‘Ó ö!z7ÐÓÀšŒd¸ãQS$H @µvõ«a%XYÍE~4BØ8pì•@ô‡p}-©ë]óºWôõ¯¬¼sX \A¯,¸cñVÁJ§gÅNL±Šzô`H‰ ÎWØ‚ÀZÙ)|€RdﳟU`m?[bÀ¤ØBWúÀZJª°6Bv{Ãìà;@õìr±“\©qÖ¦èJŸ¿hç t¤Ì8Æ1fá—„éE=â­ÃÀ°ˆcÄ3[Œ¦¾÷Íï{ûû_ xÀ>0hœ1©®3¨R«  „®É"lÀµBëX© ²ìÎxÞr6‚pb äÐî|¶]‚h× B8XAòÍ%Ì"INˆz·Ä lyËMïæ¤£Ç@èeLYo}ȘÑ|7Å1ίj³+˜ñ–ÁãA;F@™ „2Ÿ™D¦h0< %Â4Ãp82CÁÌq6ˆšÙL7º§Î-hqw:%P«VÔž6k¨Mê‚„!Œ@\F¦¡·§. ÿÓ€õõlMãÆÕ Ñ3_mYRVÕ.ì{j]D~ýÙ`û©¸@H˨-i°BHC°‡^¤c³µ)¤MmƒXÛuÐ6·ËÈS#›_è+^¿PîsoJÝ­õâq½zÜÀ`‡8LðŒQ—è%v^;”ŒvGêúZm€!ø¶¶a-°œýCh#œ ­²>%Ü¢pâth¸Vi'ÏRÕ7 a†vb™ÏÜ3(û´saNsïü8wö¤zhqoÔ€JàC €a‡p¸`….ÂÄÕ*ÎŽÎU·ú¯®žu­ßMC[÷ú×Á®õþÝœì.'ªË{ZöS; íŸÿ^5R§øjæá"×g»6äaëiL‘¨;Šž)Äøƒô)ígGV±Š)L!z¼X/—¢öa®g½)vê!Ô!*PT (Ð f`èž¼g3¿ùÎ>%½:±Ù$ר<<ÏЋžô½ ÷m1_3Ä#i0¾Ú¬[²Óz¬+»u([¬1{¥1ûO‡Ú®ë:´A{´EÛ§¡Æ¬ûëû°ÿºµYûµ;¶š° w±iû¶qÛOyͶ!;« 2 Sv¾p.;³Ëú¬‹¹5µ}¶ÙÀŽ´qºK[º¥;¯1„°Ø.·µ{»¹»»½û»Á»¶…»nR_{Û;|¸Aä´—›7“›¬-»½á»³ç«Û¹M­9®¡@.Ô5¦§ º§»´Û{½U[@ŠdÁûÁüÁÃ.¤][¶a{ÂÂ{v«§)Áÿ9$fáÎfÁ?ÒÀÎÀfáe¸lÅDz\ü¸ë[¹aü½i\¾}óæš§ãÁÄ]A ücJ\Áµ …Ü´cº¿ œÀA;¤½€  n„<˜»¹1üÊùP)|ËÿËÜÂ+<±œ¨Ý&¢ ÊW<͹ÌËœ<@¡JAô¬jÊ ä¼H <€:!8«¼­m<Ðg\Ðã{л³‹:²Ýú¦YM1“AJ³§µð¿ošÈeº¿•<ÉéÚu€€@-È"?ÔûϽüÔµ{²¯œ·Q½ª«\ÕsÛ«C&ã#Ja é0` R§C r ‡¢Ö‘*¬kÜÐÿ =ÙéûØ Ýª_ÝÔ½Cǽ¦‘LaŽÁà*ǰ Ä]¡’CÂ`ÍÜ"9ªý¼Öl2}´ƒš\2? ¢¿—  £ÈÝÜýC*!²©Y@<Ø… ¼ˆ›ËÃ\áÌÞ[ݳƒ.âû—­#¾©º)¶¸)’a ¬q1Òa Ø<< ²äBÇ;ˆ½¥‘}Ù Ýå[Þ¸•ýÏaÇs\¦µ°P~¦ÑÝ¿gÁÜ <` ¼©šL„ â!øF ‘ü J§Ò@h:§uÚ¦³ë³þÅ ¢-ââcíaô'z! ’I=¼ Þ Â$`ÏÿãÂȤÚP?Ršâõ~ïù¾ïý^·ñ»#j]@n}dB¾×›"–°@$Óé_$ ‚ÊÛ£egæeóc|ó™æ%<ð3~¿'\«iñ±  ~Àù›@@†Þà@¦— rbú * ç[PŸÒyÈ}ôßÒ…ÿ¿…ߦå5D° ßµ¡ßÕ/faš"æÝF€€r„aBDrîýtäï½hC$ü\üƒ°üÉÿüÇ?ýÍ_ýÑýÝ¿ýÛŸÎàŸýéÿýëþí?ÿñÿï¿ÿÝßê  ,ˆð Bƒ 6\è0"ĉ+ˆq`;z²q (ÿ“-9Ð%Ý’RC‚ÄXÏL¾0Ç(h´‘¯XMŒH¾üÈѣˌC[~,´#ÒŸJ:ú´)Ô©@2Zµ* [¹‚ÑÇ Çä"D \¹Kž­ \Õq`V…%Kl…²èïfBúÐÍØµk[Œ‰#¨xqÛÃ/b\ 3 xfY‚HÞZ| ÄS ä@ÖxýK(KÔ1åñ¢nŒ»2üÝ8ïᾃ'.¼8òãÊ›'ÎúòéΣ['n9«öíÜ»{ÿžÕ¡oðäË›?ž¼xñéÛ»÷¼cví#“n,µË’dI«ö £FP}Àà@=ÿ… U JÅà‚ZÕ „ö'a…^È”KKmR‡¶UO fÜ5™;‚€°E%!W[®0ÐÇΓ_g Y2ùÔRLX iÆFi$H™¤’M.I$%Ô3YUñhS‡ Sö'[yCÃF_ÐE·\ámõt à ÷+à .qk\ãêv¹Êm.p%ÛVœö•ÿשu¤cÝìbw»Õå.uÒÝð^W¼Ú%¯wË‹óª×¼ì¯{Ñ ßõ¼w½óm/|é{_ùæ·¾üݯ¿Å„¦Rœ±u'YlÖ¯"ØÀ knª²QÆÔác\A,Œá k8ÃÞ°‡;ÌáˆxÄ$.±‰Küáƒ8 tÙ¬GÌМ4®±oŒãëxÇ<î±i<ã yÈD.²‘yä#+yÉLn²9“ìä(KyÊ:†2•¯ÜdÈ´%¬%p+g Û0·²°l½g[TŒæ«9Åih³›ß ç8ÇyÍknË]Ë•XäË|îó±`Š.ôPÐ@=Td?+zÑKHÿÇFlGhC« ÆV^´¥¥|Œ4ô¡Ï‹ô¡)}éPc¹c¯)ô§A-êTÛ)#¨Ã"ëXú#ÈHbÛ”ÐnK×Fá5G|ý`÷«\ÂB±MìdÙËVv¯ýkh[ÚÃÞ{~Ó¬TÄiî6?|âp‹›ÄÞVq‹™ø"/ªn·‘=à  ÚÀf‘hwë[ÈK€ÇK5 p Þø“÷pzÌ8Á ^ÎJ'|â5žÅÅ^Co{ã;ß¿´G¾ b* n F6.3žøm9Ë_Þ_—ÇœåÜ)ˆ^í,Ùr{çrî¹ÏåÌsã<2.9hŒÿpˆ|¨©ãL7§¼àyCé@Vƒ.üDx|Aé(d24 †7=ÕÉp¡ÔóÑéˆ[ëÐ:×½v±ýÒ™ÖÝÙ—®ö« ë[ïz ¿ö¹[úˆ:Ôï^cO\= OœEßáxÁAxèDFô¡ÚÍ@œQh}¾I¤/½éOúÔ«~õ¬o½ë_ûØ«~T°¢k´„Ξ9Ä:ï=†Ç |qû^Ãç¦cFt:f¸Fò:<àŒ4¨aù°9DÂÈ@Þ€€ši—2_Ñ‚tÅ, /(È×Ïþ¶ßýï‡ü~NCž÷| œú¯±>öûòÿ~Üç}~¯!~ôwex aÀm}ÒǯqØ÷DKP}1€XCècW±íR8]±i›z”{Š1 ^v‚ ã0-ƒ.(ƒ1Hƒ3hƒ5ˆƒ7¨ƒ9ȃ;èƒ=„?(„5H4_‚Vc@áötæfAwa<÷sSøsPhav–PÆ÷yŠAëÇûötçw aà…'é€' }Ð %°O~1h_ˆeÇPp †d‡p†i¸†mø†O'‡|¶# wX†Õ·‡.Õ‡n¨,€ˆRækóbˆ<ù ˆà‡‡˜c!—78¤µiõÐ2ÔÿVŠ!-/1Gu‹±(‹³H‹µh‹·ˆ‹¹¨‹»È‹½è‹¿ŒÁ¸HÑj²k¯&u`‰!Ú&Y!Æm¦aÎàmÖaO˜fÁ§'6|#P|š¤nTŠ©öt“øâqP—ÿ1}æÈ3ŽRVùðæèX}êÈŽü÷ŽñHehgx÷ˆwùèë üþ¸dÎP†Ö`øX}a`)€ yc±] …Ã&îÀ}’õ°ßtt³ z«xS—Ç’—ç - “1)“3I“5i“7‰“9©“;É“=©“Ãè<"Ç7[Ñ&—5ö„Sæ;æä&ÎbävÿÒH…WÙsV8tzHÇn¹h€8d²q&Cõ– ” –CÆ‹PNcù•fùh©–/Å–n —qécaôR(ã;wY}g™–@°–ã—€idöh—eYN—j°—ÇЗ¯ñ—©‘¤øÀeÒ¦` }P’[h(Éų’1ù’>)›³I›µi›·y›3#€ Ir1‚% IX!¿ôŒVCÀ6 QhtÖø{Q¸×I•½÷9¥vIeÐ]ÐjbjßY}ov ððÐf· ~àùc@ž"IçIiê©ìÙÿvïÙpñ9ŸôÙca ›¶tú düéŸî™ðùuJ >f JcqvKç *Ÿr—î0Ù.xQi  ¤išzÔf6¬‰÷ôš0›¸I£5j£7Š£29ŒiyD)’¦PÀŒlµmvoP°aˆV†®Pä>apmÆ K ™%j•X©¥o…[i”7¡¡&¦cjiej¦Š†¦iêgkj¦V1Š#Ú% "¤ß„‚)y1Ú’3š£*¨ƒJ¨:Š£8¢L4‚)ŠQKF6 PFPi0P%°´Æ ß %³¿‡¥j…Û™ÿnŠá¦lze«ÊªS檯e±*«NF«à)Š#º."H%)ú¢{Ê0:“€“³à§…Š¬Éª¬4¹£¤HaÆ¢§8œZ˜Yf¶!–‚æ Hʤ00 iàøs B b`0Yº¥ëtv&]z}póJ¯õj¯÷Нùª¯ûʯýê¯ÿ °+°K°k°‹° «° ˰ ë° ±+±K±Ÿ š_œ¥i ⩚-š’®ù§a$²"[¬Çº¬'‹²„:3!¢psfÐ ‹¤‰Å:Ω6©FÖ(Åð­jpFX`4Fk¦j´Ú¹LèvêVeMë´8æ¦Q»ÿcR›c«JµP;µO{cV«µ6ƵUÛµ¨†µaËq[›µ`‹¶ik¶jëµg;¶o ·m˶k·b[·e+·sËqè›CZ YšyÚ±@0 w7£Äê’0é ®ÐGö ùÀ py³ ÌàP@)빟»“ÍJŠP¢%@š›¶,úL©ÒhaªôaQ°¤i€0 ½ƒÊ’¤º®¿Ë¥å¦YƒFwWK·w{pz»¼Ì›ŽÎû¼Ê½Ò›Ð[½ÔÛn›¼y»½vÛ½xë½Ü+¾áK¾Íû½æ{¾Ó;¾å«¾ì‹¾î›½dû¾à ¿dV±‘Û›¶ÿ±Aœ„û±ú§2©¸jðšÎ†Æ ðp¹0 YõºLÁ19Œ-;§kº+¤Ôº6[aÐy¤Ôi©Õxa=û³º;•“¥FëÂ:G7%Á´Ök¿Ú»¾ó«Ã;|½éÛ¾ôËÃ=œÃ? ÄDlÄG¿Ø{Ã6¼ÄJüµNŒÃõ‹¼>œÄT\ÅC,ÄV<ÅX|ÅõÛÄtû™‚#8‚&˜Xj ñŠ ›%{yïˆ]à®0]0 ùÀ’̧ÌÇ +ºÙ;A%›7­¢´• ÀmÖ˜³V9—zax0ª¸«»iP¥BPBê ¼[ºsš•…Ô¨[\ÄHüÅ\\ÿʦ,Ê£ÜŪ¼ÊA|ÊR,¿®œÊ¤üÄZŬ\˨Ë´¼ËYŒËHÖ˯üËL|µ¢hŒÆ¸É̱'ˆ)`¸ˆ;À#û’$Ë’¶qy#o,é÷d¬,)ÐÇáì¹Íz„1‚3k|õT¤$–‚$V ætÉ0Ðȹ X bÀ}äÀ .ÌÏtfatqgJQÃP̳ìËìÄÂÌËÌ }ФìЭ¼Ð mÐ=ÑVÑ]ÑÍÑ­Ñ ýÑÄÌÐ# š€ )­RàÒ2 0 !ÃÆÁÚ‰KÀ1iÀ×ì íryÌiÇBàÍÌ ÎG½¬‹”Š—‚û˨Ôzÿȉ¼ÉSMÕUÈf6¼P­º˰,Ò6ÜÕMÐMÒcmË_mÖgMÖ`ÝÐ\}˲ Ìl]Ö¦Òç„(ÝÒ.Ó2 + + 3r %7­§:ÝÆ0iÍîBÇ—×= à|yj°ÇHmÙ‚zÁ©0ºEÆ0³1ÖM ŒÈÖÙÏ¥mÚÙIªÿœ´ŠA.a:׺,×±ÑnýÚ¬\׳]ÛpÛMÛ² Û¾íŽ ܶ-Üjíx­×R Ëý× 3-gl¸kÌ’ŠÛŠë Îà¾ÐœgPˆ—[4"µ Á—Þ9úÇÉÚü»:å¬[aš\Õõ]ßg^šÿªQÜ¿­ÖiÜ»}ÑtÝß^ àÄ-à­à}Ûþýßžà Þààië(°Òy½×ý×ýMž†½ZÙ¸ÒLÍ-yð F3 ã9ÔP PPémã7ªÔÇkɬ̼K¢}㸉ªJʵzi‘`ägšä‹v«KndM˜&}×+Üê ˽€-؇«†=¶e²·ÙÍANæ4:Œ| Ò®á0بÚ«80†c„„c8GX8!x„ƒƒçt.çCyçsÞç€è©”3ìÿ åN.dH®è|–èÞcéq½äÇMåzÍ×®å/ â^~¸9£c^æ£Nÿ›º È­×VŽåZ®ºÍ¸R‚è}žç²ë´^ë¶>ë±¾ÚU‘X’>é9Æè¿.e¾.ìt]ìBFìñhé®Ü̽νå$bÓÓ-À8*ꤎí<¹H¾€ê/}å½Ï=¤áVuÎç|“ëz~î~~îv¾îƒ.ç{nîY-!î@œîÀù®ïû¾ï:&ÿð/ðþ.ðÿï;fðOð ð; ßð ñ‚ ñðð9†ñ_ñ¯ññßñ ò?ò$ÿñ"ò¿ò,Ÿò*cOñ-ñ1/ó4Ïñ¯A.Vá˜~å~½éƒžNÝÙnô<Œx­áÌý×ÞÐÿæ"Ø¢}ë±îîSoõWõ°ÐJۉŗöa/ö`Ï:¦;vö9–ö8¶öloöo¯ö÷qO÷n_÷v÷7Ööz?÷yoc{_c€ø}ÿ÷„_øwøˆ?øŠ¿ø~ßøŽOc‚ù†?ù”oN’_N˜Ÿù–¿ù¯±ìUþíY.PÊ ›Qæ²iÝGïú5¹íݾáàØðýçèÞî°žçò.è¾ÿçCùDÀbp# ûðn8ô¾ :õõcýeÏø•ù—öœšÿÚÿÁÎ÷Ø¿ýàÜ?þâOþÜþæýÓßùÕoýìŸýëïþñ¯þðOÿóÿÿßÿáoÿå_ÿx@¤%‚„RdÈP§n…:€š1³@ꀨÓÅãG!EŽt5ÒäI”)U®dÙÒåK˜(ëq¤`„ƒ!6\±""ƒŠ…‚ XÄÑlG•.eÚÔ)Ó¤O¥B­ ÍR¦:=à«"ƒ¤Bö:É%´iÕ¢eÀí[¸nÄ¥+·nܹwßæÕk·/¾zß|7Ò_Àˆÿ-L·1^ÅáJÞ1åÊŒ/[Öܹ/f¿Ÿ7í¹ôiÁœQ§6MX5ëÕ®[×å ¤OÆ› ¥4äéS¢ÀŽ™Ý¶cL“%‘/gÞÜùsç3Z1¨{¡Cÿo+¤*+”ø×£@¦FJéyåͧWª^*_Îguê¾½6ñ@Šf$.ÐL6Ü9k-Ûš6Ò`‹Í±eûë°Œp²TР¬PÂ9ÌÐC CQà 3ë²C;ÑÄUqDQLq±Ó„ò妜bh…ì"¨;w.‹¢ã Sn%€nI&›tò#él2(§…rÈ7°ê/#¢Âkʾ¥Ào«ö”:ŠcŽqF)ø®Rj?Žr¦˜>Èô¨ Ä¢; $P-[t‘Äc¤pFЀPP =”QÐ"}íEeÑÒA ½”ÒM5í´RN?}ÓLA µÑÿSQ%4UI=« Ýv³²'2°M¿<…ü±‹"Ÿ;R¥b”|rXb‹U)Êܲòʈ(âo(<ÅC¯Ì0«eoZlÉ£–©3ÔŒ' ,Ø´êZú°¨àŠkñ K/qͳ¿ÛœÈÏ?ÙÚÐSUñÍ×T|]”Ô}G=5ÑV!½—_„ø`QîwÒU#–8á†+ØaŠKÍøb1öØDïø˜RÙY!úmOÒµ8Žœsåe˜aN)Ick¶ÙXdGÖiVa¶ãS¬Šö³SL©ˆ~ª¼|´r¯M¬<ÀÕx˜êãªG°Ú6[ÎOÏ,ç­P†-.XбSý—Õ°9V[í²N»í‰?îxnÿºá~xF¶ÓÎûm½í–»nÒÜÙ2Yx£õdyXÙxu™$‘|‘ (J€!²ªe–! 4©E2€Pd˜N‚„M¤„“ø-k=ãλƒ¡Ù©>"ÜÖT|ç¦)EK8€+ÂuuÅ…]Fq׳êgèÙ ÿoÜ[y¨(ðµo}ã¢Û VD}ùð|#˜úŒHÄòA‘T{_ŽdÕÕ„O+ÛSþ˜Ó¿.ì®è\4àŠt€ÀõøÈ,p†Z‚sœ`”¨cEùîg@£yrw-õh =‚$µ²‘4lhJp F*¥V;€Õäчòì© [ƒÝp˜Cé qŠKÜžÞ²—D'¢‰è“¢öÄ–JVŠò‰£Üa[éJïѲFBAÎt䇸È?)SÜýXÖ+ä”$fÊ|ÙGFð«ZTÒ䈺 †08à  c7k–3 î¬7>{Ý–üã%¦SK‰‡·Fòdó uÿ}@À ­©NâÙžºøIè…—¹¨ñvÊ4–³,¨-uyK&’ò•°ü›BúCƒ®²¢nà·Ãqð†4‘€´¤Ÿl 3&`Üß3ARN<“›"9€ …™zS§M§uvÔ#@$hšÌO"K¸;Ý!U©gÀ~w pð8Š=ûࢥùYqú#¯çÒ¡ ÅeFû‚ÐR´zf}h[ªÑµªu¢G„hDåÚûZôQUô)ë‚y2>IÀ˜]T)LX_¬Ñ#} GW\Q‚“¨QX;¥ìsz*@€@O\wRЊ§I=jizZÞ‘µFãgÿxü¯‰µ–p«[ë‚Ö¸Ò¯ºÕk)g[×Ü·¶²,«D»ÇV²^T|¼ nxÃ,ÀæÊ¤j\a_rØ”4þ#`°†ôAЀ„P0À}¨l{›#Ô…ó—¬û¬?ƒ†ÎþqZÌo³åßÔê—wQá*€^w+”‡^õ¨*… 8Þâö¸wm"o1šWä:ض ÕpríªÛ ?¸·¡1çstèÈ“¶)i€b]—,3f"Â:„AXBœñ@lºuo‘crÙÂ]‰ƒ|ÚÒm@0ÚuFYÊS~O—<–Æ™… [ær—¹0‡YÌaV̘ÍÿL濜Y͈Q³™ÙÜf1Kpó›é;ß9Ïp.óñ¼ç6:Ðiö³ ×Lh=Ú͈Nt_üügFóYÑuŽ´¤]èI‹9Ï|MÈN"R– ¤¤!’‘M}j˜Ô¡&ñ=g]Í›ŸlÒ;¹¯Q È[ R×¹æ5®}½ë_’«®E0þtÅ$[ÙËfv³ýl9?[ÚÓ¦vµû‚lkg[ÛÛ¶6¶¹ýmp‡[/Þw¹³mNÂý˜Âü§@F­¥£ZÞó>IÎúêYŸd`#þ,°Qè £ô“ky:DÁ ~p„'\á gxÃþpˆG\âÏÄÄ-~qŒg\ãçxÇ=þqÿ‡\ä#'yÉM~r×Ä£V|.­2 òÀN·8ŽûwÍç ÎïD&{1õdei}É´ªM­Ð‹ŽZ¢OeØW¾ÕŠû@nsG]êОzÕ­®l¨_]ë[@Ö¹þõ©{ì[·ŽHv%“ÛÝ2ÇŒmþv^Ö›Õ,³ôí¼¡ByhC7º€O«ßÛ!L­ez¨"ö±'žÛÑV|ãŸxÇGþñ’§|¶!_yp[J±òôáF „wß&ÞÝ#Üß.>ˆ (öd-–Ø¡´¨„ô{VNB£m…¿Táê&ƒÒŸš€õò˜'¾aŠ|¬#_ùþòß|ç?;d¾D1P'BÌwÿÓ›¥7}Í‘,+Ïrpß íÏ“ñK&Àÿ½ïH§ý­Ñ¿Ñ[,‰;„—íÿûÿûçÿýÿ ”Ü? @ü{ ´?L@/[@Ü2|À¶@6 ä²|À LÀ Ô@·¨À Ô?Ü@A,A8\6NË ´c7>™A¯=:ÂÁ{ª… ÈA#û>Ÿhúÿ²/(#`۷ȧ!D-(p ñÀi‰¿ÂÓ‚C2Ô¿9ì (¬6&ˆMÜÄQü‹O|BNtÃR4E'DÅUôÄTüÂX”ÅW¼ &hEUìÄ8ÔEm ­të<ú¡‰=œ9´¬(¨A,2øJ7†`aÐŽB0¯¡ó;©è ŠEZŠ˜â©"\Š:(h ¦ˆDrŒŠèƤ[ºY›¹c«Åº8E^œÂYÜBQÅ}4ÃH{¤ |üB\¤EH}TÈ…|ƒìB†ÌÇd“C‰Ô sê%ù’ë3¼>˜A j»íC ftF-1»1ÄŸð9>ÊÆÛ{Šwÿt H‡ò(|P—3Ȫd8<8€d I¥Àv\Š€ œŠ8ùãĉH¸0(Ѐzˆ¡¨œJ·¨Jª”ʬ´JÀÊ«ÔʯäJ¯ìJ©‚«¼z0KSäı„´TKSìÇ%H†zèÈE²>(Ä€Â@¬‡zh!²¼¸Ô‹O<¼,¾üKWØKNÄSè‚%p‹ 8€>¨‡Å„EQE’Ä>èL2t¨Ì®ìL‚Á´EN4ÌÎDÌ.ðKÀ\Ë@¡ËÑìƒÒ±6é€H@R%eR']Ò&MR)R(¥Ò+}Ò)ÕR+ÝÒP/ØÜÒ*MÒpÜË~,,p‹0PRxP6¾„À³ä€Hu ?…MxxÇ5ŠÄ@Ôãd‚%€UX„YLXÓD¥ÔHŒLHN9mÄ> žt˜…SS!X‚7=†3`ÒW%TCET_=€á4N¸ðÔzhOó€Y`ÕzˆÄX6uÔ·¸UÈÕq+ÐióE]ˆÖa·adÐszPcÁAp†6‚ 肨6âÐ:Œt.ž!'òÓ’¯0° “nq†xø‚|0xÔ–™lŠ¢¼¦ã P %Pz(øIE½–¢œÄ \8£X=ÿƶp…3êX,Yr Ù«dÔ ƒl=†|ȱž =T¡åY¢Úc(Ú EZ¥=Z£MZ¦EÚŸÍÙíÙŸ}Ú©íJ5¾Y%PÅÔ·€‚­½Çó”Ó:¬ÍN­EÍEÛc=[ªe[m=Ïl ±eÛofPË` Û±½Í´} £[²mÛ=5[ ÜÛ<Ôtð€>€‹Á][²õW¸xÛÄ•\²]UâTÛnÜÖ»-Ü«€d`†cÝÑU\}ܺu ëÓ¾U N!°\¸`gx X¥\ºhÝÎ…‹chÜÇí]·Ð\î¬A‹¾mÒÅ<ÝUWi;Ж5ÆÉy%¬< ,ÿÀW˜… õf€ X@Iu{ˆŸÑÒFö@¤¦ðQ¦øF¦xÇœ<el-†8 ªlÀƒßL‡’•ئ˜J¨K£Bæi7q 5(Øuà^ˆ`ÔõÂn…ƒ4`†èVgÈà >€Ö`öàa&á6áþà.ᆠxà î@n= 6a–aÌ¥‹Ã€‡ˆ ìS0ÔÖÇ@Ô ø‚%èV ˆa½,â50…z€ƒ# ðÚÏ-ܹ…t` `-þÛ§$NX/IôK]…b >€&Öá9]ã-^\)¦b+6#,cQíØˆÜ8ö[Ôœ ÿxƒ/ØÉ+Îâ¦ánu fˆÝ¹MäNuÏdp‹ ‚INäYă5Nƒ.à[5‚%€¤d8d¯mªÐíâ/Ö€7ðZNVK÷ôËÛ‚>®Ûlè*vâmdFÞOæVI¾6ç•>¡0±³{WÀ"¦êuÐí“1¸×6*’‘ _ ú>`<_~³Ä…•ŠÂ5÷]Š™¤¢äÑmQQ,H ½ìƒxXräFr>Ù¦ðZ“–ÇmYb3§¦| !e}æg,¨Kàüa}ìÖc ^Õ‚>èHè@hƒnè…~h‡Vh†žhˆ®èˆ¦è‡þç:©.c‚–èŒVS€öèÛêÊÕ¥T°åè€ÿž\9]„:i fi“NÝp[9Å‚: é.cÜLxè‚$­M.鞦áEŠÄhÓÅ”Yfài²•é'nÒ àN£.Ü›>ÜÍ…êÛô½ôã>¨j®.ã j<8Vk²~Gh䟶êŽ>jN\‚Ð}ƒ| ëÅd€|Pë7¤j¸`!0mjá><(åœVÛ_… X-k êrýRáÔ¯®[X^¶f†t€‚”Áf¼>×|H×an6ÍûÅYÁæYÐ#×£×bÁÁìm#!ø ¥fÓÙA;„.§ -5ºÞy*p„GôpÑö àúp‡Ç> M=ååîQ⎊‚ vÿ9!…½®)RJ­‡$íîïfcNÜŸõ€º-ïó®óPõNïõôfï÷ŽoønoùNoH.÷Æoñ¢ã…‹¬†‹96b9 S˜oµð5 ð²eÓàUð¾†Õ÷ÖàüžU‚5 J2.còV[5`kL6?Ö0xð÷BgN6bëðçÄ GÌGqQ%^~ëü^䶦€]î…‹ ,Ì ‡ ,8ëw‹ˆ‚¸ðº¥ð·(r°VXq©ä×ÉæqþïuñßÌòæ-mf;PÖK»™S¹eö¢9²WíµP’¼&ðÅmÒ±7´»=-󳵬bßø%npÿN#õ(ʨ9UŠZ˜¡t‚4øç À$é>ÊIª$y0à:ùMÂã·|Öp<ƒ ž u=]?PR1íƒST_õVGõ&uõX‡uU§uY¯uVŸõ\ÇõF…ðOäu]ïõŶ(ËmSÏo&8VgxG`gãÂÄi·hve×ñ°€\PK_×?f¸dx%ˆÌ% Uñ¾Å¶xöd âj/q9¥örE—Ou‡vN¼ölgv¶†pNd‚Ev…HÕqh¯¿oàg!P ‚×öaOÅtw‹—9Ô¸kq'Õ¦FR|?×Ëeló´w!ØM‡íˆ\Sxä©zG×c÷¦*Ôÿ¿Ù‚'m2W6_4œ`D™͇Œ¨®ë5‰ÙÞÞ `€ª…¥s›Ñíò=Ä¡ !!dnwz!÷|죄ßð8€ìÌߥ¨_¥À‚%è…€ &g5B¦‡Ûxaàú#ƒ4˜v`ûißZWSN%ËzˆO»ÇûªÔ{©äû»K¿|Àü¼‹¹'Û¶Ø{Â÷lº'H¹¤Ë*6\¸8|ÄïË©iSÅgøÆ/ã¶(ñÖ¼|ÍGͶöêƒì„ ¸¥ü…L†þlOx¨Ë>¸xÖŸBÐì{·èÚÉß|ΗüóüühSÆ}ÕÍý•Ý}ÄŸªÔ_NËþÐGüûl /}µÿ­}DN¿,æÌ~ó´~/l Ý/2MýîÌË­ƒÊ4ÔæèSà€>mÒïÓW~Õ_‚0X~Ï7(~ú„€HD= ÌX’¬^=8aêõé#a>†%– ̨ñÆŽ?‚ )r$É’# ìÄ -"H‰)C†ºÞVÈ„ˆ;óå¢uº Mªt)Ó¦NŸ&uU€³¤³„H¨¥Ô®^¿‚ +vl×:;[”9S[œ€z¦Œ»DQŸ îf»«w/ˆPŽs¶WÆz¤Û›®c<½aÂà½ë ã¬z|0y |ùæì¹§Ï¦y–ÿrˆ‰É¬Y·Ž-{¶È×´;2‰û6BÛ¼øþüöpâ«÷Ž\ùnâÊ‘ŸÍä8ôç˯cÏ€£öîÞAžÒ2&yu4kºEé®èNgAwöT©`gɧ¯?ÿþeϺDžkÝä{á¡äiž}¶WhŸ= aƒ:Ø bv¡†žu×iC•MJÔñÝw+‚¤¢l¹5ç\ŒÒY—b´¹Ût3ÒÈã‹7ö¸\Ž&í($,"¹"wI2‰œP;õÁ‡Ki HÓ 5I¡J ˜ˆPP•ŸôÙ÷~c¢™¦š_™…Zž‡^N tà“t‰˜adz=ÿaŸ{!äÁ†zʧ¡‡º'šèƒ£‰ˆ`p¡„¢ŒMbjDÉ‘­í¶)I¡ —‘¨#‘j#G§¢jj©É9k¬Ÿ–ÄÚª¯Òš©®±-¹«¯"…÷fylÕ$LNð¥öåNtй&Xezu¦³ÓR;f›âi‘í”pøVjP&ˆš]’[®¹ç¢›®¹ Öe‰DÕ „;«1Q¯½÷⛯½ÀéÛ¯¿ÿ°Àúš:°¿òk0Á½)œoÁ ãû0ÄõJ<±­ [jÆ3œqÅÜðv[òÆ'£œ²Ê+³ r°’·Ö•ém™ì{(ÅWí³:óÜó´×´ÐC} ;â9ÿn¡¡1½gÓK;5ÔS?]µÔVO é·§QªÚ¯_ƒí)ØcëÚ+Ùg³h6Úkw§6Û™5”°1™×Ö Y.ks\aú\_ßNßµuÈ“F<ñh A<†#¾xŽâ‚ ^yRìFÞz]öqˆçŸƒºè£“^ºé§£žºê«§ž ë¯Ã»ì³Ó^»í·ãž»î»óÞ»ï¿?{x(l«VM7+¯]¡lÍÍV­åÓSß…YG×1‚á†'Ž8ã<žÚ» ¶{.†Bˆ¨žNèù‰ÂÿhÒá ÕµÛoã›ØùóÏÛýýp$ÿ ?2ÀbçeT’±ä¤¥ýäfð‚ÿ^à¤W½ þmpiHC÷ǸÅráQPžöT¨.Š}&ÔÐûÌg. ù‰/’ËÜ“ò¶’y!0‡!ÙŸ{ˆú°@ "ÿ†HÄØœ†%0S‹ f–“ú¥ X¨!ߪgA¥¨‚Üâ~'Åi`{ñø÷â>¹Èe~êZ££Ðרô­P}뚟ìwÄòðŽ4¢ÏÆÇ>’í€Ï»æÆ@b­@xCÉQžä¼õXï‚WLŠÒÁÅKúGƒ#ç8Öp†J“£ Ù÷4rÅÐB-L—)í".ú12^ó -kiË[â²–É%/{¹Ë^Ó–¿ &0‡IL_zê˜Á4¦2ÿoÉÌf !ÐÌå3§„‘Y—Õœæ6›ÙMoJ3›ºäˆ8£ €rê2œåü¦2ÙyLl¢óšê§;‰YÏkŽHJ/‰™•j’<¢DЦə1iPj]„Sœ'ÃØ8ÅÑNž©C ã¸JuÒ,\áù.ªÏ´«Ž©9„E“|¨â¶W‡®¹‹]u%)݇à ‚B¥3úÿ™EŽìÃÜ·Þu ÎU56׌¬d› TÊšd²Ë B$0›YËÒÔ³%ÑìKEK’ t³  -rH[ÚÖ¦¶µ«Å©iEâÚËn6¶¯Ý-oI‚F´PIfl9–J 'Д,O‹#k²ˆVh  ¨@=àj]¥x±®ž,#DAyLŽ|I†à‡˜åà ‡3Ô‰Y`¤1ær`œá‹½p†AéÒš&5ÒÚ†ä¶-p€g[Yƒ„³þˆ€i«Úw¤Á2Õ-ne aHXªÞ%…ü` ¶véˆZb·FZE$ÍPóUÓˆuzÌ5+Zó‘fàº:n“;ê°ÉÆÿN»iˆ¨¼¾¢qkæ@'ö‚ KÈÇ](‰œá L (°„òê¥C†å  ËíDžPÐ@=ð€5×C§ý)œÝ 8ËyÎ׬ó›Ùœç‘h–Ïwö³žÝæ>Çy´5´ñ w€+ •_te£¢×@S#OSx€Bj"~€‰ß:3ŸxÅ%^hˆ{¼ãÿøÆ)^òŒƒ|ä"ǸmrŽŸå%_yª_nr×|æ1W¶ÆC¾ó§Öæ4ϹÏq.ó¢üè*ÿ9ƒ*t¦G8è:7z¯ùtªóüêI¯zÏ—Žõ¦[}ê[uØ‘Îr®kýì`ï:Ì¿îͦ}ð€ŠËsžफ*éÚq‹É‚>…Æ]¸JRÔZnëj²q_è¤]ß°5ÓøäÚ|m#*¡o¾0YOiC>„™~;2rJp—È=̉%³G@z3ÛÉh×ÿô@=pŒ|Ôá!¶Ï‡ÞÌ€]Ó~÷¹¯ýí{çߟø¸×}ñ}_ààß~ø»7>ÿvÁ*_úÍ?þ±/|æóÞùÉÿ¾ò©oý{?úà7ÿó³¿~ñ_úË/?üãï~úsüêÇõÛOþé׆¥ßü`þ5üi_ø ú!àû- Þ_öŸþàöM ýýŸžf ^ îŸn 6 ÿ`O• ú_†àoÏ€˜Þ™ÇÑÉUe[ˆ(Wß̸‘[YåØá½•}'yÏC™‘Ï»)G½Öa¤C„Ø3ðgÜ_<†^œ…ÌÂ,pF¨žg0MÿÀŒ@Ž@=l¡],‚¸Ãò¤ÀÃ8C0C ÌÂHÀÜaºÔÖáæáöá Ú!ê!¢ž!þ!&â 2¢ö" â"âv„§X¢"b#jâ!Bâ%~"%þT'Jb&ž`%Ž¢'N¢#žb+¦"(®b,¢+ªb¡"&Ò¢.Ê"/šâ5íb)¢-F"0¢0þ"1†â#Þâ,š¢1’â+6£4âb/îÚ0Rc-*ã3"c5Z#4&£.ã6ú¢7~b¶×id•ÝÙͱ͵Ô"ì$å ÏÌØY ^0@A-TùXÍ•ÝUi¼‹»™ÿ~™ 9Ê" DÓdŸôÁÔ+€Y^|ÞÕ€@åPŽ%Yú$UŠ%Oš%[¢åR–%PVeZ `VÒe[ºå\ne\ª%XžeTþåOö¥`º^fWÞå[še]ÊåZ6¦^.&_†¥_&\æa2f^ZædB&gfæO!fe†¦hnæg.¤>—•  FÑ!Ë=öÌ¢VhÿWä@îÄB•QC5»Px‰—^ÀåJ…4Hþ]!¹$C•¥^^œ“µÞsÚEHE¥¸Ã5é xÖA0Àw†'îE£wÖžxšçx£zR„ô‰'y¶g{F£§Ôçz¢ç{–§~Êç~V#|²§¦gƧ}Žc~Æg*è|ògƒ(7è€.h‚ú'‚‚£€ž§{è„n(ƒ^(>hˆVh‡B(‡J艂èŠh†zè¢è®©èˆ²hÖݰØ?uÍ"ÐcÞÈ&Ï0—R„[nánnPãävY6äú<¤ÔüÕg üÜÅxîEGîÅ¿éEÜ–œêAÍÿEžáŒ€<ôAÂÁáJÈS,Ê̂ܽiœ:¢f¹)Ê)žŽã5Ý)œæ©ŸîéŸÆiŸÒi3Úéœ j0.¡&j 2*£ÖéO=*¢:*¢Bª¡Jª¥Rj€¦Ö¤êi‡ò©¦~ê**ž^ê –ªŸž*Ïy* j§Šª«’j¦šê¦Îj¨Öꨮ]«ê­&êª2¬æª¬²j¬öê®+y⪪jêVIù“kbl—QHÒ}ü(‘NϹ}PvOmMÜð×p†q …è…)H@2D™+Ì‚ˆDtŽ„F ,A \˜Ý…ÞÞu áxØd:Øèø¦ßF§{:m€ºñî>Ï1£t\•”™Föl/¹MuPÏúñÔº4“CTDEL×Ä~K¹•\Á›·y6ÌDÀù ä5Ë@h HàÝdCÈ@Èö}5»´7 ; tAÍ€°û‚—‡³¬Ã´7Øú¹§;­›;»£»º·{{_³0 º†7”çwù±ô r ao’I ¹dø"ÁÿÁ#|Â+üÂ3|Ã;üÃC|ÄKüÄS|ÄGBÅc|ÆküÆs|Ç{üǃ|È‹üÈ+|FüÉ£|Ê«üÊG<¶›ðÝåÝ“ÈcÜ>6³‚+¹jÓ7OóRt¾/d±ÏL²/EÿÔ'»Ô½Î€ÔÄìk6¸Tkì+ ŒýV“{2ƒ>8¿è?…/ò{¾ó3SWs½£›C‰Q÷ä;à†Wh,‚x”ˆOˆVö† –C:ú^€ ¹‹°à?~“~ükGäÓ?Htúà;þýw„ý‘ D)¥¨3¨nÅ €€44¢!"a¢¥„9v܈Ðã GrtÕåÉ”ÕùºÒEËÆ]ªö1[- lŠÌÁRhvô¥Å¦ºœD ÞL8“c— K†´zkÖ«I® T'bñÒÄ3kVY²uÞ@¬øÖb6 ƒà¡nÿÐlzëîÍû€|Ì: à¾AëP+Ù_(ˆAø= 2_Åuçyè6bŸˆº;„@jÕ«Y·vývlÙ³i×¶-;ÒmÝ»y÷öíûÐoáÉŸ|8jÔÆ™7ïÜytéDW´¢%‚À2d ô¦aCÒ ñà‰èŽA—Œ+¼yOšô{|‘ÂÔÉÿŸ}~üí…©ìâßö¼[ÁfŠ!`‰Áﮘ¡@Žjê"d°%A cªI¡.¤HÈÂùš:ñ=úRDQÅY|qÅéû¤¯Üi¨Ž4ÊRK­´Òªc¼†ª«„ÏæÊk?6[Ò¯¼H'¯òÿÁ€2»2¯dŽà€dÒiÉ«kŽ\².誣‹Îª«è¡ˆ–ƒBƒz¨€N;SËóN>÷¬³O@ÿÔOA %ÔÏCEÔÐDóbÏêtºÔr«ÓL‹ƒNÓN=µSß” ˆ>ú(TSQ= ÔSSu•UU_]µUZeÖZgÝW[s½U××Bý”ØØà;‚ ꤅€¸1ÈòàÄH#­¬½v#ÿPZÉ(¤"*¡+8Š…W ª žêP-Ò]ኜdˆ`ª£6!xÇ•¢Ü8˜!¡ÀÅ–à‚¯í黯’‡¬/Ž'­²Ò¨#ÎRá‚è"ºøº+(gÂÿè#¨|Èžx@ø“!Z‚¿ì²1ëªGf<`„¨[ºé§™vZé©¥Žºj¬¡¦z뫹¶:믵»ëªPS–. ÓK‹}n†›nLçÞmÔàYMo¾÷V­oÀÿN-pÂgúðÂ÷›qÁ7üqØî®›X!#BV»íºcÐY‡ä"ϼѨé¾ÒI?½>ÔMOõÕ¿söØc_ ½qw*u€ê6'ÐÒ¥%ï—wkÐxÝAàÝwudà€w6Àm]õì±ßÞuí»çžÁ„~V¬²4ðÑ|ˆãÿ´¢‹ êÌ ’‹ ÆÌ'Œâ‘ Œ nªÇ8Ó“‚2Y)/aèüP‡0,A ¼D¿”i.`j EÌ„±6¹åM jÂP#4á1¢ Â¶°„/t! gÃÚP†1¤¡q¸ÃÖˆ²øH- ’Å,†1¹hÌ.Àƒ+ê± £Aé¾<,ÌpÒ`€3ÿ¿ìE™1aJpÀ£2x˜ÒA™ºøì/}8ÀF°ËÔ#ô üà"šñ¸5³8ÒÀŒ(ÓÍ|æ¢éLhJóšÖ¤&6·©ÍjNó›Ù'7ÃÙÍqz“›pЀPU)·™ž¿qb<é)›yÚŠ@¨‡)$@ª}ö“Uÿô'? P}4 =¨AšP†*´¡ -èD*¹zzê-¾À\渣®½1ZB²QÇ@Þ1T‡»NÚR—¾ô+Õ©ƒ< yóùˆ}E‹Èû ¹—E& GJCk(S ¾XB œ¥¿”IeyiR0±°Tõ!KHL'l *ÿ¦! æÐˆY´Š!™8Fœ µ²µn]k[ßJ׹Ƶ®x½«\áÊW»ö5¯~Õ+`÷ؼñ¢‰­Í=«XÆÒŠbÌâd%[Y2~ñ²aÌì1kÏÆbŠ‘ A–² r4Ž¡Ïè^Z°”² ÙˆIki[[‚ 2G{XÄÖ¤v†hÀà ,x5mÌ<°Œ%hæeXŠ“ÜÑÀ h© 8ájêpKÌhæN«á`gŒšŠ‰„&@ = ^öº·íMÍ{ç_øÊw½ö­/~é›_þê׿÷ð~á‹ØÏ˜5E0<,›Èn–²¶lg5KaÎVÃÿÖ°°·ôØá(³N[’F$B¨Ž/’J¼Æ1–ñŒi\c¿7ÖñŽyÜcÿÈAî1Xp$›š%}?Z¤yçb$áâ%€ò€È1l ˜Æ0Ã!àb.ƒ@UÖ¬8ëu€ 1íR –é`^úÐËÈ£— Ú\ˆ¦Ó7d9}ðÓfA= Ïz泟-h@úІôŸ]hF#ºÑ‰~´¢!]iwv¸Ã Æ45ýšQEØÂ Î°¨5LjSO86ÞtlnTÌ)KzYAQ<ˆÔhêÙÖ®yÝk_ÿؽÖV°‰]lcÙÉVö²ƒMdwäˆGi@ÿ¤Ä(Ö¾Ðb ~O® 3è W$£%Pg3˜QöÅ#¨Z™À KèÅ^©™Zöì»§\’y°mmËó4‡RÁ .p‚Üà ÏSÁŽð†+¼N ¸Ã'nàU;öâŸUuk>êR{üÔy¨Çጙ“w@Ô98FDBh5ÙÄl›ÿzØ7×ùÎyÞs›™F†úÔ§dºÏÉà ú`\x»®È²_˜Q ÍÆ©A©åj¢šÊ+9c ǘEÍ@pSðå«LúK“ËÚaF$à'¿è;åÏ×½Sw_ͨðÞ½×Ýr¢Mã@ÖH¢ ´:H)>/Fÿ|®óœ7ò‘—üÏâ£´ðˆ·Šôw#áÉÍM1P8®–Í]@À€Þô?û .UÖ~ë=ŸëCÜûnFº×>‰Ç}‰Ã÷ÝG÷'ÿ- DL–×ÄåwBÌ_óÉ#ûñÏçuþ¤_ýƽ|3ߎpºä·ð4~MšøëÒ‡d@L ^ÆŸzò›¾ý ˜Ìw¯Ž¥&±}ó"„ûr~ÄÛ÷?n‚‰C÷øÿp7ðâRÖL <¢ Zù,†¤œÏú‚-ú.Ò¡ (€Û\¡.P‘ÍÙrëò.Ïa¨m<†d§:/~ÐD1<àðkÐo«¬ÞĘ ÂLÿ ‚P‡‹Ð “P — ›Ð —0žP § «Ð ¯ ³P · »Uà ÃP Ç Ëp Í$´^Íø¸#?\.=`×VËG0%d'vÈ»  J æ@0Ñ×°Oè4@bΑrJ§ðïLôíJ5#Q+‘/q3‘3H*ÿÞ®!}ãÿBñS@‘ðéÆ1ÕÈe Â4&ðYÒcéðñrnð€Ûh0Š¡˜!» J`[*`º`%À<À»À$ œ±ø%4QQû,O}Ð"‘ª­hDãõžgµQýÿ­:îÚÑßãQç‘ëÑïóQï1öÑÿ R ’ Ò !R!’!Ò!R áâ:²c eMz¡:”ind[tcËà¡N˜P¢‘g! ¾  ’¡žGfá êA \Á»‡ñ,n$ût+ÉÖg‘Ž3p)íOªl0þê¯õ°0è¬íB¨bf/áf¯R‰´’XV‘+Ëè+UÃíÔð^1W §åGÐ?ð0%zm°%€'Q¢é’1%Q"$gA¶eé2» «rr'{R±o¤Í,¾`Úz«}BÛÂj)'ÿóôà/)/*)ÓÕ.3È«íÞâh>1,=%+GÓïLSS¼5[C5¬5çD:Ç4èú€Ž:ò?d'7µej. \Á»ÀÒ#/» VÒùŠq´¥“xÒ0Gy‹:ÕGÝÇ3,‰3S¯5Ñ)?ïM¤4Bh6A£5WÓRÔ³RÒS=Ýó=QsæOå ïѲ!bnŽtM=ò-y­7QBÜ%<€8ŸÑ8“1@ ´–sךs[â!£S:+OÚxkèT0ÿÜ¡¯ôš2þP/<¹s2ET3óÂ3;14MCZÔE_FcTFg”FkÔFoGsTGo4vÿÔGHƒTH‡”H‹ÔHI“FUCI›ÔIŸJ£ôFÑÐb4ªø4Ç£îÓ è†i-EÐ?ÿ.Óë² îRÉ”.W’L‰±è²ì’œ:)Ôú~2èŽÌÏÂèŠi§’î2ŸrD3³õÄ3)‘<ýÔgOØS:JÓQå)RyO855,uRáS±Ðˆ´ ÖFC.nDÀB¦øSs.o$Óà Ô`P Æ­ ¼ 9·Å»@$ pµ.}AJ€Ò!ýìô»1}Ž5b®ób\2½ÓDƒbýžµY“rþ<ô;ëƒOH‚ä0uR‹R¿ÅÕ8‚¯Q½ÿ5R55±B Ä®tå6ç£(4ê Ko³?í0vRu[@*@†˜Šq/“ÓA€àÁø°ì0'‰õùS·ª³,q>ÿ4Û5(XïJ¶lcga ºjIê¢.2®DL®$íl0Eñ¬º•\Á5f7ef 8Ε\Õõ¢^sYdM!Îòåò³^Ï03bÖçJÐ1¯GÄ‘ÉÈ‘YŸRZA€«#º‚‚òARfZA@K¸¤²Î“–ßõ/øÍ+b?KÃR¥ânßVnëAâè–âìâð6nõvn îÒjV8t6,ÍuÜ\åpUWq÷qÿ—i ·q)wr%×q+s-7s/7r?Ws]ÅäF“gO$Üp^‰Ì˜Lõi_÷榓GzD-”õbõY¡€Û–#˜V–êÂcÕlLü‚fòâCvÆ–öâ2Ždjç üÆ1H,Umm8`m²w{@{±×{»÷{Ï&|Áw|¹×|ÅW}Ó—}É÷|Ë—|ÿpc~%u8p6äHnäF äúw³F7,I4Ȳ´|ÖY %u›/:]v8ÙŒÕÒ€11”-:±C¥Öf–Àd˜a–6–þ:¶ô¼‹ì¼"è"È/(èÞò‚cƒ"¼Tc¼^Éô¯!U¾Ph†RH‡tÿx…x¸ˆrˆw8ˆ{xˆXˆ˜ˆw˜R¦#\ë×¢œ˜7ÐR‡ŠÇŠ#§Š±øŠ‡‹!§‹dzLS"Ý•åÚðÌ Mp¤K[lØw޹¯èÔGóÔ6ðÀÏ¡@*£L$¨…¡J€æ€þ‚„W)\)xñ`Üî­I¾ªItÉ—Fà—‚éHê¬hBÕ­ÊI¾@›:ù“=yš@y”EY™Hù”MùPy•U™•_Ù•c9”Éâ Tly\ï‹úÀêÁƒ—}˜{ù— ˜‹ù˜‡Y˜™˜•™›™™—9™£ù™¥š§9™ø+/–€c­Y€¶»ÂBuãâKóÿß±4r+‘ÚYÚñ·€ë‘2ÈZ'g6i<ØjCØy-ȃi¬Š:°11VØ»6£3€À@€’!¢¼>ÌÝ¡Q•é®(®,Z›*:¯0zš4Ú£/z£Cú£3¤Gº˜—uCp¿RŠ½Ø¥Áø¥³ø‹e:¦·¸¦µ,I÷-Øt/T¸hÓ™¨I0,sŽ ©û:‘óøž£ë±0yI€Àº@»Ò@»Rã0®Ú€Ö¬.^858ˆ¬Ê4A£Qc(¿Ôڇ׾ØÚ…ܺ¾àš®ßÚ®çú®åZ¯H~Sš6Vš+[úãöw°õ×°ù—°IM›¹’gí³súÿà¬èõÛÎÜ‚E‡ý5ŠÝ¯uS=>ÅXmCLå:Šsj͘¦ÝKqó?Å@C2F²$OÒMUR[ò%cWiÒ&]w­*€ÝÛý¨wó±Õ1Öó– hPcèaÐ׋ “»UJ鉴G“žé›ÞéŸê£ÞE™Tê«Þê¯>G€››Ý±Ã²ƒÓ‰Mª¼úÚò#áR.ÛÄLÑ´8÷²/Qâ/]!0±ñac}æø¨#&/OCgjƒË5ð _ð Ÿ þ׫’áCÿQáSºñ0ò%ÙwšŒáUKÓñ4Þ^Ou7ag7wmA38‡³äõ²V½ÝA·B·…Ôàîñ¾È†rO Év¿ÏÉbÙèâ¡?ì ?"ƒ_ø ²‡ßøù“_ù—Ÿù›ßùŸ k´œ\Ö>µÁ^ãíÛó;^kn@wÍ@O?A•Ñùœqõõò廀ƒwU÷­G öi7Y;ûÚê½ß·Ól U1¦vÀEÔ/ €èÎL6}XȰ¡Ã‡#JœH±¢Å‹+FÊȱ£Ç A* I²¤É“G¢\ɲ%G•.c¶ˆ–¤è”!CÝŠêdÈÑ74ëÿtQÚ¥©Ó§P£J*Õ•S«M±>Å ©/Wšöq5¢ צ@ÀšíÚJ‰´õÄ’ Û…Ù,_TóêÝË·¯_¨uÖ‘§¡pšxñ4>¯NQ„4ûa„QË ²aÞÌ93fÍCƒí™3éͤS›þ¼º3Ê–i‘,°ò@˜2së>¹q·ïßqN¢ðâÈ‹OÎ\6@7uêTGÝç ¡D d`rW¦ÃSÕú”|ÓYàÁKsFͬ¦XÔ€èâL-z§Jt‘ !Û~µÌxp@aˆgàR˜@u¤‘†ˆÅÃX„i8¦s¯QÔe¨±fÙi¡ybˆ!ŽHâ‰ÿ¥}øa†b(ÐÚ¹³s4ÊÔ[8ê6cŽ<–´c@$rÎA—“t<ÉÔuCÕva2ÉÐTx èÊ•XbÕ}MOHÐG—ÌÀàVeqÙ…[]€ AðÔFXY^W•xæÉW`î1ØbJˆØau(%m“UÆ!Š*6Zš‰#Žæhg’6ZiŠ(fhÐ…³%u@‡"ꨤ–j*©œªêª¬¶êꫪ2+«l4몲Þjj®º–Êk¯¢þ l (4,ª ;ª°½2Ûl²Ê›ª²ÄBKíµØf«í¶Üê €;ˆ>tÕY'C}jx¡ftª.•zŠg^¼ÿôÖk/‚ ú9„€~a¶¹hT‹>ÊèÁ—RjéÁ$&Ì™ºœ$YW…J±ÕùQÆ{D¬­!q ’È#ËZr²!KÛqG$ol²Ë(ŸœjÉÆ¦³Æ5þˆ3KΡpÓ‘RðD0A5©î@PÒT¼÷î5oÓPG-u¾ƒA8a<þbÝØc@¤ Ùkо†ð­°  ½i£‰Æöõ@aqÊ+ïŒÆ%IÞ,ÏŒwß‚— 8GÜ=øÅ…»|xF|‡¬¸ázç\¹oEŽ;]u?a·Ý…oDÙµ†KIÍ×Ó¦§®z‚ù."€ëÄ»ë´ À5†Çƨ‰–uÀjÿ°Ù³@="rVG1Ô’ gl#Ú¿§[‹.2pPŸ“{ÜøåEòß„?~‘ø”/.¹ùçï=û¡ïøÅÝ¿~r:ßRæ@ÍÓ’žBÝ’&0muWA žÀHFNÁT†€ ƒ8Q°Y”ÃND½Ð ¤)A>ð€34 É8 bÑÛÌ ¶Iqf,êÂeAÀ/| ‚êAB‘ˆAb¸D%&‰Ftb¡ÈÄ' !ˆ7¨Ç)·*1‹[ä"ù–ŒzôÁÁ›MJ¿TU  õ¨Ç\Å„Q"|;€KðÆ8αÿÄ‚)º°„…Tà}¨'9˜­m}ˆdø,&D;1’Â#’Ç=öQŽ‹ddáÊxÉ>dr“áÛ!éŠOþ‘‹©šê¡f,D„ŒŸÅòAK ’—ð% ¡€Iäâiˆd )IÒ’®tÅÒÉ"â²X¥)\Le.‘ìƒ BÊß…Sð˜e-BÆzp4 çB€)̈äOMŒ$)”«sÈÒD·Ò1°<M¨B3ú3ëƒ)êa;í„k2«¡Â0s(ãÎA<’NÌ ¢òJÇÍx@¡‰ ظRËta²ÿ›ÜÜEÛý°èƒ0‚u¨E=*Q*Ô¥*5©M…*R™:Õ§R5xjP*ñ`I¬¨^u«b$V °°0{s#‚‡+r€m`ÅãÌF€VC®m$<à `3 ÀG¹ºz”`mƒœÅLWÄ2¤£z¥+C*p×¼³(çcÙ&JbV°Ç ,[Q™ÊTÁƒz®¨ÛøêW]b ­eÀ"`[Hõ² l!q[Þõl}0^:f!Z¼ a h=ÆŒÊÚ¿v°»í-rÙÌÖã›ØÄ,jU €,¢¬4lm`[‰ÜŸqŽ~†¤ž¨ƒhØé“ÿAhC@É,m¡]@~÷;µ†vA3 AH$MaŠŠFF6Ô(ïÎR¬åƒ£Õ“Ô;3Ãp& a€(„†%¨¡˜B Wšºí…é1X´SçÔX®Ð…€…“c÷…8 €0\÷ùÓ£ dÁÙÇF.ò1Ž„j©¡´^ˆz‘ñV›l€C˜qØ8cä%?9ÉA®ò”£œå/7yÌ[ó•ËÜæpÐÀÅ=Ž2‹ç:g#§Á xÜÀ!z¬‡);ôÒ¾Q@øÂ@. ó\p#Hw=àðt h`Ì£&ug‘ÿh€`tCª•¸‚Ø@ˆãm›îjª[­s»«‰ªu®wê_¿ºà„‚IãÐ<žÞð…v=ðt_»vÂŒZ×ùêÕ’e’±YdñtÆëÜÓÐ?Ë0Âx›ŒÇKPõØË®7Œ™ô[gÑHøIgC¢õPõPy£/ûô˜'çÍí™È†ŸíU’O8@‚ ЀøõvÔ`@p#°uÿ¥L|w4ø¶ûÔEã¦AÍ"¤£÷f>X©ÖÔC"u¦fØØ‡x,y¾s&Ö¾€Q¯i,¢.Ò/ÆB zX`F³ttuwÇ$wZÿ¸¨%À (‚Ø!ø%8‚(x‚&H‚cEõ`’r-¸‚b1HtP€iˆvK0(ƒ’W\‹P4‚7X¤vpvWXPG˜ƒblðÐCUxð„@3ufEG1Æ X¨gEHr ÑàL?ØhJ˜hŸ†¥•=†ifˆ†8˜…33…UˆÅÕ„nèjÇVy ÑZ}h2±GGo…H^ù0ˆ/³sÈKpYå…ë”s€­Ç„]Æ[ÏVgxV‰’Xl{ÅF“ÖZÆ6|Ì;è”È ‰ÈùÀ|Í·ú4з9Ô± Fc(Ùf}S’}U ÿaQPÐJjP Þ5ùBnuiq§U`·ãí¦Qøgïò'uo÷g1Ri°c¯gŽ6U=¥QD ¡bšÒbáB1>ôXõ0T¹• 'hwdðuó4I¹‰ Ù‰yq‘)x¡l ±† ¡wAxWa` Ùe©…KXVÄ6’7lI†‘‡2K 1s°Dj'y“Ve Ã'xÕ¢‘™f’> Î@Kq1|<¹‘7‰2+ÉGy’K‰2ÇÖ„(jQI,HØ C©q=ÉXpG5ÙX ‡O¹%ÑZMI–WD]ÿDi”]ÐAÙrŸ†‘)6pªÈ•ÐV‹(!¾`$@#4?Q4tCqÉðÙq@©S'Y‚@Ü׉ùéÀ aàÍx/âæP–Á PÌ0`µnî" †"ð&oœ!&•˜2CñÀ-…µS À@_Ž@}0=4Ä}Ðp#  b9؃!>µ57`<ÏT~@TˆÕ×9Ù¹Ý‰Ö žÚ)žÞžÜižßyžãyž-É7ë™žŽ…’~#V›fV@)‘P\Î@=ïÉsyT’D9|òY8¨8‡¹°E#‰1̰|ð0KPHKðY-™*ÓŸ«ÆtøÙƒÿA ZV¦@NÚž3c ·vWû‰Ÿvé ŒU•ý¸v¡(£z•‚“ Lw%‚uˆ¡Ÿå…B¥ŸÔÛÖz†ÚJ;:‹¨(iJŠžvilSõù °Xß7&£´è—&‘9ýäOîÕ9MÒ·S¢c_ÙÀ˜¦ó4ó2 xà™Bà%ÅP Àm¡M&fàùÑ%PùqHP¡Hw’™õ~åfK¡NÖx!•EñÐ`#€˜iQoÂQ°Lþ¶ú†X°½0PPR Qp÷wS„òÀb3¡~¡Bi°Î`ºÊ«Wæ YUZÿÄrDã4EÇj¬O”¬CĬõà¬Ðº¬ÒЬ !¬zV¬Í:­`­X6Fe´uºÜJ¬}Ô`VÊ*®ÃêjÄ”åz®êÊcÄ"cÒËpõ4®’ÉOßf4nÕº®•FIÙ { °ŽüÚ¯ú®fµ­ë°„ÆN Û ‹2X™¯¾±ñz­éDKÏF¯]`¯{°ÄÂK†õKqTØ”±«°c Wäc‘´iuH±Ð¦À}0‹$k²øª¯K@³6ûMáô qЦ´y!»N°÷­p€³›-›]q^^J‡b8Ñ^>1}FÓé’˜R‚} ¤ÿn»%| ê1DÌ0…k¢§]`¨³_ ™0 °õ jAŠª™þEš¤FèwØ6Û8oR›!…TR–1a˜Qp ›–Qª á …4 ãH=¦ "xBc:dQ_s;õƒ8îóµòã1äÃ8?%W»Ë»ºÛ7³K»½+¯¿[¼#¼S»_‹^»¼q‹‘‹b:4×PòEq% ˜]óõ¶Y±%X€…;aáx˧³ß GdÑ0M‘W²ƒ‰nþ~›ê¸£É)´aš…š%ÀöV0UÀeÓŽ¢Ñ´ê"×GÈÛ>Ã{9·Ë2¹«>óc¼ÿ¼>å³ÁœÁóÀì¼1Ѽ"¼lϧ9AS.†ù9‘½k˦Rcu’_W²L1}å:v·N¡·à‘i@†Ú&gÐ[P0õ/Ï8˜Q€Ž›HÆÀ§‰§¡T<{…)Vì(U¼ ÁYŒ)¥œ-&Àh7Ì®%\8il2 #3mÌÆ6£¼@”’S3p<ÇqÜ2ÞcÇÉ‹Ç0CÇkì$<È4tÂýÖam,,.¼˜Ý›@ß \2äðÐl²§a¡&n1GO1Ä¡œ I¬Ä}âxàšmQà"QÉ€0"Åÿk=´\˶l= h'1tcQ¡r-ÓÒ-ÿÂ<+Îâ-¶B-ÅLÌÖr,É +ÍìÌÆ‚ÌË<,Ïì*ÕlÍÓÜ,Ñ-Ù<ÌÞüÍàÎØrÈ4á3c»A@FS7.L÷Å@KàñÜólÃâÛ b¡ðÀäk?ü®pMa K€ÏO\@Ê¥œ'ù¢¹ ›!`Ù é»<¥Síg0])M6½ÑÒ -A–a(F.s!…lȺq#,Í#+ýÒ#,Ó@Ó% ½â’ÈcÚ‹g‹½Ú 1SR(B=ÔD]ÔF}ÔHÔJ½ÔLÝÔNýÔPÕR/}P!¯sÕ°#u€C ”ºÐñqØæ"® ¾ #‡Öj½ÖÿlÝÖnýÖp×r=×t]×v=×™p×z½×|Ý×~ý׀؂=Ø„]؆}؈؊½Ø~=md[˜žãgÚ JÃfÀ–Ù—}ÙšÝٽ٘ Ú ýÙ™íÙ¢mÙSÚ›Úœ}Ú¤ÝÚ¯ÚopÚfÀÚ©Ú¨MÛ¸]Ú¦½Û°­Ú¾ÜÀ Ûº]ÜÁÝC£(îfC}ÀW\©É#ÆVÌ;ïvuQ¼Ì *MÓ<âÒÜÍ6ýÝ'Þâm佼ޭ‹æN0î@Ú;ÑýÑô-Òõ=Ýž`*¢ß’¢ßùýßÿÍß™~üýPž `àL¬mBÝ·|"÷à Þ!ÿ¥I¹#ß´¼ÅblÀiáÌ=¹9”ÝJƒ«åM#Þ}âÃqÞ*NÈ-Ž?/þêÅ^;ñ?f›.ö@$ÎÀ>þã@~AA>äMäw(fÍS’Q€ë'äEnäPäýû5M>7¸#@¹L6Íýá“ËÜÎáâ1´!»1N)~æ¹ÁâjnlÞæñ浈ÓÒûO<]@-ÌãN>åÞç|þçTè{.è€þä…^è^ã"^³è¶ÚèQþèD^è®è”Êå\¬åÜå±jé³ÀVÞÀ]s…0ê¤^ê¦~ê¤Î¨¾ê¬®ê¬þê¥îê°þê²>ë­¾¶뵞릾ë¼ëÿ ñë¨îëÂ^ÒRì§Nì®ì¼ÎìÍìÈžê íÀÔžêÐNíΞëÛnëÇ~íÆžíÑÞí³NîÆžÞþS¶ŒŒå±ã‰>éð¾€ñ>ïÎÁèÎçHî焾ïúþäC.é’>Å—Þáâ]^Ý0¯±œÎqÆ¢ání¯êì ñïÆŽë/ññŸñòì!òOñ%oñ)?í(Ÿò,¯ñ*óßò5/ó1ß$Oó"/è®ÈæP¬ãzþéôåUïIô“ŽïLïü啾;TŒškRY̺e³é–Æ)r)¦Ëe =”=?ò7ŸòÿgökÆÞön poOuo÷i¯óy¯ó÷sow_ò_ÿñ}?ñƒO…/ó‰?‹¯ñ‡/ø~_ïó4˜4žîeÙÚ3:òÞï‡Îï£ÿôR Fú@ ú¬Ÿú®¿ú¯ßú°?û²ÿ<¦ûð¾ô]C\ÉS§A˜‘tDÎ 60 …º'â å 䇫Ë0 Ok{•Ïö”¿÷±ýß/÷ÝŸýþnïýçOþåùj?þ“ÿþÏþŒïþˆOÿ/ÿz¯þaþtþ2žèH‹‚ÕT·b… @@šá ûH¼(QÿãFŽ=~R¤FK9™ÒäJ”,U¶„ù²dFš#mÞÄ™sc͈ T–Z2›P¢AÍ SP<6ÔY’¯$…|œAzTÀ’–z€Ñ¡GK‚}˜ %Ç‹ º¸sX(꩘[÷î\¾}ùÊ•«O^»xý˜®ÝÁ‹÷"ö«X0áÇçJfLÙ°åË‘gv¼™3æzõІLÚtaÎ;^]Ù²jÍ­/ú\º¶mÚ¡m¿Î5âÞ§gݺnØ»•¿žì›7tÐÆŸw>šºnéÊ™G·~½y÷ÙÛ…7OÙt¼|´DˆPP†Œ„Þ6tèVbºtÿ:ýç¬ #-ˆŒ ü/Aü/À? °@Ž@€h%³.,+3您²H§,£œ"¨¨§¨zRª,Îr„²NlID³²)¦%Ÿ"òÈ µâš«8@ 8²HñLIÒH$‰4rÉ&œRJ(©¼R;¹˜¼òI%•ó .•ô2J-Åœ²L+ɬòÌ1l3µ×ÞÄòËј£SÍ5áÌÒÍ4ã$nÎ?û,oËAíL ÏCÍ,Í. ÔÐG ÔQ6)­4OH[NÒK•ÓS>AåTÐII-UÔ:’@‡Н uèKh¡ ¬ƒÇ‰*ru@]ýAaƒp#¸:ÿˆd—•ˆY ’‰Úg£¥vZk¥Å¶Úl¯¨]9rVÙfÇE–\qËE÷\uozУv×Ú±%²<¼P¨EJ4J©¬@H#Œ|D‹E ÂC(w(¡¤è(±Žj¬/^«Âa›õI"¹Â¨€cò©ƒcó"/äô ãCV™d“ËKyd–G.™®“Qnyæk†âæRc^Yä_†,€Yh—m†9g¥yö9²£nê¦e~šèŸ©¦Yë­±®Úk©‘Öy鞯:l¦%;ëµÙæzè·ÇŽÛì¨é»ë¹ñN[ï³áÎ[î¿ï[ð»û’«mµÿºp»qüqÈŸ™ÿ#X ’b¾ƒV˜? |ÜïG']$™\B%µdŒ)õÓK‡Ý]`eï(@ ²ñF³è0ß™š‹£N¼Á(‚:ƒÈYf91 ‡P¨> ~ëMIÞ¤:ºX«#ˆ4`–$ø‚™Ä'ß|±]ƒçgÒ0ýòÞqÚ?þñç_Ÿ}÷á?ßþÔW¿ËÜïúKýç£á€òàíç@ò€¯¡`Ø¿f‚ <\¨A JÐù#aC(B~ƒ¡ /( „å©ághÀÚð…4Œ¡/ÃêЄD| ˆÄ ª‡A4â ™˜Â*‡%”ÿ"‹8?ôYî=˜CH­"‘Œ9¤¼2VìÔ¸F6¶1vÉòÏ»H„xÍ«(2Ú—ŒÑ¡ @_êÃêà °à1`Eéc<ˆä œ(Ï»P÷|E‹{ßÒ²‘¹ˆïaÐß'͇S4¬(•'A@Q–€”¦De*ÐJU޲” 8e jÉÊU¾—±´ß.wéË\Æhœe/oYL©!³•Ħkœ©LXê2™¡¤æ/eIËkºr™Ñ”f7‡ùMkró™äÜæ*ÇYÍfг›Ð,§:߉Î`ºóœìl§9³ÉÌzêÓ–ø §?½ ЀÊóžÚL'6ÿ‰Ð|tŸà|Í4ÿÊÏ‚*”•®ò¬b•9ú¬À>c|ˆ®Ò!: ¹$Ç‚#éPª“•&¨¥&IJc 9ÞÎBõÂ)€¯ éBu8†‰P¼zІG%b|@ ‹¨fàD€¤uŒ«uààÆ¼ÚÕ¹€ì‡Ø*Y¿zÖ´Îl­;lk[_h´¸Ž¬CkYÝjV¸ÚU®xE«_íÖÀêõ¯KÌëW›ÅÂ*v°€­«^ Ù·"¶±jåë‹Ù»Z–²™eìg;»ÂÍîu´å-[+YÈ®¶²¤½¬iUkØÕzsR˜ÕæîCF]u¢Â—¹Â5\á×#ÄMr;¢ÿ\™W]á nrËÜéWºëz.[4â‹:Ò ßýnA€…Þõ4à XÂ"£¬((x‘NcÉ>ròÁFаb˜$^r,#äÂ0((À& búPàÌâÀ &¬\là Cx‡f°ƒ+ìà¿fÃæ°fÃôá_Ä'î0†)œáŸ¸Ä&T0‹_LZæ˜Å&¶1‚5ëa߯<^±Ža«bϘ85î±Cåb™ÉJNÕ“-¼c"k¸É‰ª2Š©,å‡0ÆAž²“s|€0ÌíyÏF5ǹÝÂ%ÀÔË$P3ÈyÎu¾³œé¬g<ï9Ïös û\ç=ÿ šÏ‡ô ]hE'zÑ„n´¡ÍhDKÚÒ‘Æt¥!ýg<Û™uõ§= ÜPõ'9­×N³âÓ’˜BÉxŠ+fq’§u@(Ëñðˆ®”à+A‘ÇTQ­ÓŠ¥G?Âwì³eóÅŒrMn˜]šàÙKÖË´«}íJe›2Û†v¥ýmg‡»3ãv ¸±Ýìt—»Ûìöö\¸åxÇÛÚæ&¶Ý}dtÛ{ÞRë7»ï½nj“[ÞøÞŽ¾Np…œSÊ.x»þîˆûÛÜÀ‘¸Å)ÞðÛ/àwøÃ?®î<äϸÀ;í”W\ºœ¬²aHÁsß3ão‘.d£ÿç?÷yÐ>t¡èG7zÒ‘¾t¥7éOwzÔ¡>u©Wé@鲞¡lt]ë·ÓH»@Ð]ôæÑ(Åð‹À@dìY¸K@K”Ú—G–D×@qÆŽá ¤< §¹CÉNÒ+e•ÑÌùM£¯øÅWªñQ~<§Ây€Så–g9æ1®ùÄ ^óŠá<è1/úÑ¿æóž/ý€?oúÔs~ó§W}ëW{Ë“¾5^Ü(Ge ÎñV"pæm„?|âßøÇG~ò•¿|æ7ßùχ~ô¥?ý¬:dB@ö³¿î  ·ÖÏr©zIyy÷(¹3IþxG;žCGKôÒï]:>ì!ÿ•ê)oûý³^öÿ½É›½Ðó¿Ú+ÀÈã?Ô¿þ£=$ÀDÀ|¼Nq½œ@ l< Ì@ ÌÀŒ@Ü@ ÁÅ#µ˜3ˆ™Û­üÐà˟˺üº¯Ë:üº¡€Á¤A´ÁäAôÁ $Â!4Â"DÂ#üA‰ø!x¤­ Š@ °é‰SC/±-Ü—¹ð€,L?.4¿-,‰‹0¤?ªZÐ$‹ðÀÅS=D*=:ì?;ì?£‘ÃéÀà ìC?ä@> Äé8„A|Ž?Ü@DL¼8\=EDBÜÃC4DípDAŒDJœÄò€ÄFÌÄ@©DKL<Ž@ÿ4“ŽJˆ1ºœàKE­»A¼ÁüÁ„Â#¤Å$ÄE%ÌÅ]ÔÅ^äÅ_” H‡ž3¶‹èƒ>0…Uì›*¿aƒÆh”ÆiÌ)”ˆ QEÜ(„mäÆnôÆoÜÆ¿ÇqGq$ÇsäFsDGrTÇu,G=tÇslÇxìÆy¤Çt¼Œ{üF{ÔG€D}ÜÇ|ÈzÈŒCƒÄÇÄ@H¹øÇ…äÇ{|ÈxŒH‰,HƒôG…tÈŠȉtGŽ Ç”2AÜ¢…[iÁß“‡L>ŒÁtÅ—\ɘ|A#œI˜Üº›”œô¹œäÉôIôIJ<ÒÁ¡ ÊžJ£4ÊTÿÊžÔI¦tJû‹•,Æcìƒz€6\—‹¸B ¯¯D¤° /±˱4˲D˰,¶ˆh—¶à‘Ãs½¸”˹¤Ë¹0šºÄ˼ÔKË(ĽôË¿¬Ë¾ÌÁ$LËÌÂDÌP܈¤Ýó†ÞSÁß#©ÂÓ:‘Å’€BjÔÌÍäÌÎôÌÏM‘ˆE Fc3c4¬dÆ ±W¤¾×„ÍØÔòó]9„ÛÄÍÜÔÍÝäÍÞôÍßÎàÎá$NáÌ„âDÎäTÎådÎætÎç„Îè”Îé¤Îê´ÎëÄÎìdÎv ÉÜRˆ¬?dÉ/•œÁÐ4ÏóDÏôTÏi̾’ðöpÔìƒEÿ0±«¿›ÂºýÌ)ôû;TóO;¯a³¤î 2êƒÃLÌeP»lÐeP…Ð õK ¥Ð ÅK ÅÐÂD3øYa3rб¾[3_๜‚‚BúÌ]Ï…ÑÆÑ,Mèè«LͬĤqÆùÓöË#ñ*O! ÒýO E‰ªòdÓÐ …RÌ»Ë(¥RÎ{Ò*ÅRÛ¸Ò,åRÈØÒ.•KÛ£‘¬9ÏÉ_XÅ”DM*ÏzH%¸·†Y¤jQ•Ñ;ÅÓ•÷$ÆN(4ІÐÑeD¶ûëÊgÜ—5»a+Ò!ÆÜA¿¡€ûãŸÈˆ/S0ÒLåÔÃÀÔNÅÿÒOÕ*ÕQm<î$E‚X3Ωω¸°HQ»ó€dd M-*œBÔ øU£V,4‹aÕÏbõUT3Vc%V]!Í¡‡„>(A]ïë‚bqˆu¿öCÌÒ$…F$ WôZRJ=>? P…vu×w}WÛ€×y×Ö Wzý{WyÕ×zmHèWwÍ×€mW~%Ø=X{%Ø‚UØ…5Ø€EXˆmX‰Ø~}XеŒ…U…ˆµØŠíXÎÐØõØ{åX}½ØÍX‡ Ü#lÕí‘ü"O”èiM‰E S˜…cp8†„ñ€|˜…%p…\!ƒ·cÿ††õ…:àQƒg,?ªVa= «56¬åÚ­õÚ¯Û›ÒÚ«%[,DÔ±uÖá3ø4z8ÍeĤ9jC“ WÐ$òCE]Ô½5‰üüUT… ÜÁ%\ÁYÍWyUÜÅE\{e\ÎØTÈ8ÜÆ¥ÜŒ}\ËuÜÌÕ\ÌÝ\ɽ\Ïí\Ę\Ð ÝÃ]ÑMÜÒõ‹ÓE]Õí Ö5ÝÏmÝÊ%]Ú]ÎµÝØÕ\8ê÷ȽùؽS¼9d4Јí™Á>ø˜ÖáÕYð€â-0hñ€%X  º!(zH‡0à; ÀÙŽ©ƒzH!x×éÛò] ôUßÖ‰ öM‰ôu÷=_ù…ÿ_÷­_™Ð÷̸@M¬\×ÙáÖ÷¯o½[0l¿zŠc˜ ç øBïº[9׸]Sd ÜÂÅ`Ø}ÝÔÍÝÕå`Ü­Ý.ÙÕÝÞ`×=aæ NaáváÛ}aFá&áŽaVa®a`aÞá¹øa¾a–á#Fbæ\–•9Ý*Éc °XÍ!? ZxX¬ð^‚Ž‹ðè^8: ¼Ùb8Iß7žß8†ã9–ã:¦ã;¶ã<Æã=Öã>žcáS >Íc¬û¤àmõÛn¥F½6½5ª/ 6Ò ùb¿ÅF]¹` &Ü!b"îÿáNæä"â߈Ü$Vâ6bÎáT>eTâ eQödXþ`WeYŽåO–åY^eVöåWîå[b^¶åY.ÁT娃Èüœl8–40ÞàIRȇ08†hZ.Vªî9cð<@SèY_h° X8-C.öÞ%P!pj>ßy†cz¶çöu |Æç8¾ç|~_æçûèÞçzÖˆgA4dSàM— àÃrÁ-Ëj>‹ŽÆ„™`í O‡ÈdM6Ü]Îå`f”>iË(eU.æ•6å_Néb&æ˜f›®iœ†i—Öi“ÆåZîéŸêaÞéVjÊÿÓ&#ÏY‡€fŒp îqbPƒÃ X˜9* ðv‚¢í¸ë„/8‚«6dp† ¨€c܉·¾¿¸.©¶„ë¹®kÂ#µ¼¦k¹Æë½¶k¾‚@. 4µJd\„Õ”ÛfåLFP0†‚cX¾; €ä~`g¦uäCíL&éMöi]j•&åЦåÎi£VíÕ¾é£FéÔ–iØnmžfí™~iÓ&íÑÎm¢ÖíÛÖÜé]dÞ½9]yêàó €xðÞ«V¤^0±Hwèj)Út@4 ‡8k¹ˆŽI†Ù¹˜ñ&ñ.oò6ïôFïõ>ïöVïólí“ÿïí£ï*dÍfÔ‰6`ýVÔxØ»xHƒ™lŠEðƒñª€z‘§š (‹¶ªi’.êÚ–mÛvmßþWÜÖð×®ðÙ¶pPîí 'ñ·ð Gqí?mÞfñÝ^âÅü"¥¦9›##dKö*6x€!è„tÀÀƒæ6ç©èåj.¾ˆ¢õï:p‡p;³¾j €ЀÁØ/ïærcìò/÷ò0ó1ó2'ó37ó4Gó5Ws/-€óø¢X™›kÃ_9Ôfl–Fɇ¶‘G ÆW¨;éѯê9€µíÛklR‰˜pMþp§t §íØžtEíLÏÿôçpœöôMñçt ¾ôJ·tL7uRõÿôSæ^aÌŽbU35îhVA©îg€¹ƒ¨²ê‹8ƒ­ J!‰*)ZWp…®>†c<ëéyl¨€:pël7Æm?Ín×voçöo÷p'wp7÷q?÷rG÷uW÷v÷v‰èN—û.µÖœäWHÍw²˜É. £ÒhRà‚)VøÝZ&­TÏþì’õïð‡á†oqouU¯øT·ø‰‡qš.õ‹GñPwxXÇø‘ÿøŽ‡ϽÜZjq °/øq‡¨®‰6ŸOw ãms6×ùœçù÷ùžúŸz7+ÿîùð¨û w‰ÈsEnäGÅ©~/VÊôlv…øÚµÃ(¤Iý–šÜ…gx×xˆùNniVy´{wu‰ßxP7ùµWû·gûŒ§ø´o{¤ÞˆQôPU5EðÄ*‹ÐÏõÂ6üÃ/Ð €(8üLJüÈ—üɧüÊ·üËÇüÌ×üʇ÷?AÝ’~¿b `ÎÛD½#$-Ë?¿V I^˜ˆÂü²ýbZ“@øp°Ÿ€N{ºÏ{È}õàçxy¹íã'û²~»þä÷}ãÿýåOácNy—5I ȉˆ‡—ßqŸ»üdp»c˜…4ØüóGÿôWÿõgÿË?Q*ÿE'ÄF¦Gý< ÿv†xøŠ0 õú€± ˆlÌÂlèÐ! €¼)ñbÄ>@Ìd»¨jÈ"Aª`ò$J“%S²°²åÉ—0]ÎD)æÍ–9Yîd©¦J Aö´)´¨Q¢G…ÒTºÔiM¤1ŸF¥ZêL©C¯ríŠÓjV°_±Ž%«SìY³€ßéÇÞ}þ—Ÿ;mq6—¡…¶B^$HØDÅF tqXfzø!ˆ!Š8âceƒ =˜—i –…ÑÖmÌ9d#¶Õ¸£Ž=6$a]ùbFANˆ]v"õÇŸªg }3ýTß’(à•OBÉ]•Yjé%`†‰%™e~iæ™ùY)f”lvéf“mªYÖEƒYWgt©¸Âg€\d€]äNaöa bˆš(£‹:ª(¤Fú¨¤•Rz餙Zª)¦›zÿÚ)¨œŠú騉E„žžíÉ" E^¤k9Ö¶œ¬³2wÛ­µâz£®½ÒZëD…¹ˆš_×%9Ò›hŽ9'œL 5%”r¦9í~[Æ™,³ÙR[m³ÑbËm·k*ë$¸ãJ»-¹Ëj[.ºéºÛj zæ „z]´ÚEbÄQŠ’ø/À <ðc¦l†â\uÉp× ¥µZ'ÂB7#Å[|1Æÿ8ÑjÃB ¨*!‹<2É%—Ì”É&•òÉD±<òÊ/‡ mV2‹³Ì8çì²Í(ÛÌåÏ:¿,tÊDÍóÎH­ôÒQmtËLíôÓT'muÓ5‡/Âr)̰½Õ!¤…^46i«ÿ½6Ûm»ý6ÜqË=7ÝuÛ}7ÞyëÍÀÁtV½¬º8F°Êøkl‰#¾xmŠ7θã‘C>ùãµI$1Ä÷ºxS{þ9è¡‹>:Í£›~:ꩇιꭻþºê¬Ã>;íµÏ$»í¹·>aß :(‹º¨ï½Ùlx<òÉ+¿<óÍ;ÿ<ôÑK?=õÕ[ý†½'¼'i€àK]Ĭa?>ùågÏñt¨Ú‘`‡¸ÿ>üñË??ýõÛ?þùë¿þ™ðÿ?(À°€< ¨À2°| è*_p&O€ãSð"‘ ¯:†1C(Â’°„dBUµ"½´Šp1ÜÄlÿŸYÍÈq5äÕ¯fÕYí 7)æ¨ó= àNwF<"é¨Ä%z®ˆL|"àÄ(R‰S¬"¹Æ q¯4g;a<êQ' ™°Œf<#Cx‘;åIO¢Á =V¸ÅPc>ôÑmvhÇ=âèGA$’F¬ãŽ+b±°+!ù:B*²‘£c¤##ù9HJrv„ Rå5Ð`0l©/ê1Í¥±”¦<%*O˜B=­Êará«:61æ°‡>ʘeXKâ°9“%ø†HÉJ³%ˆ,&2o—Ìee˜Ì,¦3Ÿ)ºÌÉK.¿«W^Äö¹#ŒE"c*Ã)ÎqbO{^ \Á¾ÿÃÝÑb¶Ô¥a€µÇvæpctlË`¬Ó‡hJÓ‘Çìg2ù ÐD t †,¨Akµ6N4}ÒÜED™¡† äƒ ™á Wœ=cßòô™ #®ÊúØ)›\Ú²v¤eKÂRw¾æ“r,ÞEšÐ(þs§‘Ô©O™Ô .q¨D‘ÜÒµ¡ÓOŒ(¢"²¾è Á\`F=œ… qE˜'„Y¸" Î訜WÀƒÇ«‡+(úѹŠ0"\ê× ä°¢&XBR©KiºËÁÞrž´¤QÄ:òJŒôAF=ªîz ÙB>v²µ«¬ei‡Ù¢U~ÛÞÂàè§ÿJ¢¤|^2*P‚30ZMÆñJ !€•yj¨CJ…YlÈPHG=°àЬv®¾ +rÕ¨ÔÏž34¢}Xj$¬<òrž½ÄcuièˇH˜BÜ\f#)ÙðBq³äÝyi^ƒòn¹¾kªð š¡åáÁ®Øjà!€ì¹"@€l»P‡0¿ÈÓ@m7Tf,®8.<„pzN?Jc@ž×H’ä6žŠ&ÿ±R'ùÉ‘aD{­ÆBƤGUâÂtR<Ì`¸ÇlbÆHÎ bšèåÈPæ°Œ*~äç„$+–dx9åSšÜí¤¦Ý8&¤Lfe8™áõ‰:KŸõ2bÌØš2Æ¡ÙÒA¶R‚d[FÚ[RZ\Ê%ÎC:T}RŒyVö¥)™ã!Ž ‘ÍFªè")þ$Láv1¦Exj[D@¥e1eRædaffÊáÐâªx’džTcù%i¢‘/ÒÝŠ”Æ©%XªÔ …]Yb¤¯XLb I¢]Û\…eî¡fUoú¦É‘›¹m^™0¾[i&g]Ù 5-LMB$uÎáÿh<~bP¾Æ< %|œ¨ž« FhþfPífЧO™çyž$îµÑ5u¨Ïh*§|*WÕb"ø€åˆ]ÞQYVd‹½&bµæê&z&yBáÔ‚2¨zþbݱȄ¬f[Ê|^èøL~æM†˜ûqŒk”X=ê¶#QöRlšlx'uH‡>榶Á(L4(@ÑhJ¥]¾× Ù"Ûí †.‚8"$ʆ¦WÆÜWÒ‘lŠbc"fp牾˜)ÎôŸJS‚6a–>S—z)gž&s¹„¤›^“8nˆWÁÀâ-O®i›ÀC˜Zù‚3°i[õÚãÿ)’2çކjŽÜˆµá ^bþäée×Xj ‹F¤‹N¦ŒÂÄ–à—.Ó¥bêƒjÁ†ÆÜÙ¤!>)ó$ƒÔAœ&pÕ†ª©\òÜVníVoýVp ׆ÀUšú©r­§ÑKŸHæF¨Î_b.f¢Vç‰B‡V\Gf*2U*:+4MêŒ'c"qªƒhý _µL&¿ÙØ€uvÁ¸Æƒ)ƒu”Ï¥`…1œ®‚s*ÌŽâ¤Å£“Ò#”«ØáýÝcCüèÌI*µ¦´  ´SÃ:¬,j-jÓÈÅ'òœ9™Ñ\ja™–!žªnìñ ™™Yÿ ™š±Ù­i½š7~& T„:ÁŸlbg–E†Ý:êN±e¢ÄÂþßÃJÒÐí¦Þe™YG¬…B©)­4¬!¿©ë©îÝ­I­®Õ›…õi˺ìrýMCaS¤¶Å„,;ÙPQÆ#À6ªCdgémtT©T%åÏžDÐÒ^Ñ:Rßúí@^aîÁ,Å›Î-OÔfO1èÈÎZÖfßá%<\q,ˆí½¬¶Úµ‰ØMdVd'¡«´Æ3rÓß*ÒÞÊ^ëTÞ¢Dì2Eg¥äm+G‚ª·ÊU¼™ßºÐu ÕÎÚ¿5B(ӆ씭,Øjîæÿ*Õ­J„´J)LÄõÒl°m€ælŠÒ&‰ÁõŠo…àíì¾.ìÕnÍ®á¨à²§A¬á)ÔBßAíÑÙZáMnªB®«&Oãõiäõ®á*ôŠ-îiV‡F„¨)'ëö–”ÖYúÈ<ʈ†|ÞᴤϞ/û¶/ûªïúnÛËEð§:5í†ßðõh@2ô—õQnø‚ó/äѰ __»vl`T.ø‰Ÿóp m <1GñgÅ Jjê“6fw/º­£Úí-šp¡oë‰1™ñ‡©Ä ™{Vïb%¸z@ºÕª ñï]ÈÿÖq F¥  Ú*H@1À`—0GoŽ@pß…¤ÁÄCHr´J2LÄ% ëÜfqŠâ»#ˈ^b2öVÈ¢1‘1Û¡ò±r+[+F ç9æ7Ú\¢PºŽ½&2 #_Hb iTæòr†ªn5²$³Ìs³‡.;r±Š:fö‰„ÜRé&RÚ°6›6{[7/´I\îž#Ÿ„ ¡ê·ºs½ž<Ôó$Á0×s=ãóEŒïøÿªm ýYl ´€ÖìE&ùÁ%¯%!ô;ôÙôMoj§‚Ì}¹.FûéÙ¤<ó$Û³HïçÄ$Fúäa†².õkL…CGu\3Ms³Vo5 cD}&Ì9"âU·p®µ_jô$t0³1«ã4ÿ võ+À²4<ÒÆ[ƒÏÙâôÉqõÏêµîØtDz¦§ŠMÅž³YËçP³5Gƒ4%¯fLg2“š¨d÷3(ë›®-5£Çôøvn²oBƒ›_ÛÎh“öIbD¶g£éa µØüò<×sl·52Ža (¡qr1.*]ÿPtü•;$sgõì–¶f5´ûj¨ï°ñ¦Éo¨ÿ¶¶k»C<õ#_G'õí„FóJͦdÝuRN¡mDA£íçF£óuÂ÷q×egâîž8 »¡† C·rj4÷¥u(O×€Â}WˆGŠz÷5r×åûö*Ÿ¨:…NôÀªnñVó„ lÑV­Ûn…û¬—p×.ûºóà·uï÷Q‹¸õ–²_yð”Fu±.{ûÐ×ít0xùb5„—ºŒî9zÙA" :„´qÜás+O}ÝWȪ)9D€…é±ÿ²kƒÿ=X~I˜¼®¬¡7zb§µl+¶÷™¥2Àk:éž^é*DŒ²U[ĺ½’Âë!ÂÃèÏó!¶¯‘&'åå”3Éß’5™ "O TÀª^Y–mÙÕ.®˜•왥Y¬Y›‘<¼C~³03GÓöžý¶¾«8?7µü±ü½éŒ: V»µ= ÖªŸmÅ‹ÚÓ*­áš»ZÕ]ÖG.ämm®••×öúØ?\‡ û¼ÇvøhD<ˆêû¿’"Øy²x×ãPj6ȹvz7Þc¹ÞóªÔÙÃ_8·’5ε³À!äE¥kð3LnÁ\ÂaîóF¾ò y¤¯õ<¿ü§ÿø\‡÷SË|ÎΈDä_pÃ8ë¼ê½ÐKeÃo¨fÐÄvòäÒ)¯ðºñ‚¼â{ö¡ÿ;ʼó‡K2cƒ´$5¹iòÌ3@d1„@‚,HPaC„ !>$Ø!@t±„cGŽu4és@I“'Q¦T¹’eK—/aÆ”ù2ÒL›7qæÔ©“äNŸ?uÙShQ£GmEºô¨G ¾i‰AJUWÕ©&PGv4¢KYŠ®Ò™5Ël–/µÙ<q¦Æ,”dj»hpÕ¯Z¶nË‚pEÁ,<eû¸Ò—qcÇ!G–<™reµëŒHs¼ÿÍžA×ùê1ÙÅRAŒEPaÄ…a·†=[¢ìÚ Y´¨šãi ¥ŸŽæ¨”iqãAkW¾<'qæÏ¡«tzôéÕ±‡Jµª”2V„ÿÞ•£™la9öɈ‹‡t}¤eæá€ûeóÍÒèd(%ÌòEƒÈIG²J`f-úìÓ ,5 8 <\¡¬zÈ!˲ 9ìÐÃÃ, 6Kã Ï4ˆ'E êË#ÝÂF×hÃm ƒp¼Í5‡n¤‘Ç×¢ÈFÔdkF Ü1#w®ÃÎI¦’{RJãšœÒÊŸª¼RËæ¶¤Î©>øª;)®’!«­È“IôÆêKj‚0Wÿ謳žt*¨§,<õ´Ë¬ê¤ó€.ê€Á¬@éÔg*¨ž»S ÄI)­ÔRÌä9qEAÛL4°Ð³è«ÕtäѶe;µÆUY15"ш,»¬•&[qʼnÖ\y5i×^{ýXÜéãíÆTü¸Ä§²qœÂBAªªËÌJkŽü µM²9ïÜs•?’GÜ–_ö”cßNc×féµ­nwãÝûÝÖæ¦w7Ý~»8¢g}¼KÃ}’ñàžø¢ŒgºØc+®JYñ.7Ûm¯×ûÜú뱿ì£p9-—ôxêxÃmf†{õºk—ïƒìíG|ûÖqï@ÚhhEJþøŸ€ßß:ÿ¥¤?òd€-q TšG&3ÿ©ÃуV¬L–= Nl˜ÑLÚ8ÏÄLf/ùj„¯öIäu¨ò™û`÷³ð&Tõ+Z«Ó?.n†P«¡ o85§ «;WËšÆ07½Ž|‚E4â¶–t¶µÌD(ßét‡š Ùmv´¡]†¤øíH~­«HýLÆ .I€9¼•—SF4²Dk\IFµ1U.<\YÒò¹#î‘ZY÷6c™‹c6ØêRE/¥0}'„W#{t;#ÑŒwptãIdxÉ XR“àd'? ¬åu„‡Î[–V€H4w|©z}tå+##"´}†SlÛß6Å.>2v­Ê™³|UÄÿ|B ºÖÉ¥dR™; ¥Ÿ M7~)LS±Ø›õ,c–'‚°ôæ71%®/¬mäpÖ%0Ê‘‰\/™ByÁè`QW¿@M42³™\êgñþy}âŠbcò6/×ü……ˆßt¨7eÙ='~&|n3¤.ßÉ/Öų^ÀÒ©ô&Q­sf% Z~¦T&Í¡K_:ÍNîš–‹ÞÐÁ‡îô•üL 1H"s¢羂i*Ž¢©)R¨*ÉRäH(0­¡U¯êÆQr¤”Rx³Ð„™m6”R ™¶HæŠnò”‚I Ú¼ç½[¦+Œª“S!ÙH-zô—òÿsçFX0°à/™TÝÉJ Û¬Âp±Œ•)óª¦@3eÓ+eËãZñR(Ô¢jpcªÕ 0{iŒàQ08c1]ð…3J Â\È€aëÿ&vf¨G˧¾]RQ¸Kµ$]õ·¡¹°w‰Õ b+èúsº7i¬• Z52 ˆ Ë*©'™d” `F²á?¨,ÉBLË5€«PÐOœ…tÔ ®ÐSê¡ÖÛîQ–pu"ŠêP?ð:…]çYÍå Oz‘Â=ê;‰7Íy뺄nu}⤈xÄkŒœ´0G„¦’cNñ^Þ'öš%Àõÿ U‡0,&´eÑ9øR–1†’‚‡5ÛÛvÀm ÝŠ€ú² õž5cg/-ì××6é3H={Åä“Ä2ù°ˆ;ì¿4«Y«]ãjŠ“µ,Êr3Tdíô „ Ê, Ú[>Ô£³ý^ôdB…1%¨EY0‹Å0­ 0f›l½“ˉl+$©À|Ü`ÞU[¬p_Gê ãnh @æšwfÚx´®õc9‚@kZ++ë5g2Á¤/é “þÛ °Åu”Y @á0e‘Â`!Ú29ÓÙû£”1¨"sº¹#E]]=J\äÆg•$Tÿjkßɺºò~œ½ïë7GÖ‡sV(2Y‰—ƒ1 8ƒy¡ ÃÙ:´Z¢ýfÐ¥,X€ÇÎð¦ _ºÛNþÖ[3HËQ¹®OðÉç†j•oÙ„qõFPww¼IøV½§kóÃé|çúS/æk;›M&€S H€³Éîq^€ì˜l0#é=ËŒá‡mw|‚>ÅàfÆI®ÞÒìUW©"y?㪛å¨aáýÈ\f˜à<º<—šÝïÞfÈÎñ;cñX[©‘Z»àµ¸Ë´ñ0³¬ÑñeÌ_ú<˜ÂT›ã\÷öö¤Ì²NÍ•¨&G{S‡D7¾Ž©VŒˆËq‡Kÿ`Vî-¡»sñδØË^ß@ØåV¬M¨¾Ø,íyO|îL ŒvÇw†‡kùC­gƒ@É@˺0dk3È>éUÃÅ'T¡­[{˜:Q ¹).øEí:ùp5ºö¶§ß©æ|Ùfo´×'6þ«¿ýkƒöý‡äQÏûÝNä¤ òÁ\! ˜AOødOòÄ?f PePtìPEQ$ åÙ*û4 IÎfS6¥D†J$<ÂŒê^>OÕÎîÔHËf£n¸ÉmÈ §õ\bþ ëþFwPßt ÷l*•ê²>æÙ´eÉ8ðzV¦ttËeFЃÌÏ‘DHýJm‘† hR¯câÎÿY©Š  ÃPïH)¾JèÒ$s*ð&ŬF¦d’°Í&\¾§–6H8È­ÜŒª—ò ‹Xð‹k¸œŠ…H0=>(=ÄpX¼PªXÑ}®šTl².gæ¶IFâ0µ%œ)¨`†cÜÌØ…¤R¯¢„¨vpf„^Ã"€ ‚:â ‡ ‹ÙÈoÑÄfŠßNɾ+à41+E–˜è vË\†Á<Ï ³,ôT±Qm©\ޤ¾ä¤jSBs…»Ñò°«‚.zh®è„ñ?$¢È ¨žˆkTïÝR‘ýR±£è±ËÌ Ñ#dÅmeYŠk 2ÿÌPÿÎ*‡ˆ Ñq!%#‰D‡3¾O¬Å2T„£•’$ *­D.çršÈíöj ¬†#rJ ³ò/ûâ¢,ÊžpAH(3R2ÝhãÝòñ˜bÑ)áòŸè2€œ²)uqïºã µÆXh34ËæIä6!ËmKÑUIÿ¹ÜÍý¢ÅQ2²2…ç2q³%Èíç"‹Ž^’"·F4C“3(ì>ñß& _P_Xs,2Û‹.2™r2ûi7±C;·“ ykæ &Ë8Ó­Äm¾.' ñ#3ô4ê,Ï’A¯"^N½Bp¸“:°³™òónS¦Ü /ye º\ Ó8 ÈÑЊNZ‹<)Åë‰ §L8ËÍE."ís1OH×Ç1«ó…Þò?™²?ý¤Òb®&<1ÔÎÃ\ÁûâáDë¼/„`µÊbQÂÀd‹ÆNB'…Ó†e< ,‹ŠsoðÆ5Í1‡äuPTÈmÿæ^Í6OÔD»43sM@% k~ÍÍQ2J`*€Fñ"´J@„ GÕb¾Ò ¾î+¿ö«¿þ ôHŸLƒšðBݱ…ŒÚŽ‘üÐC…rÝ`„("Þ¸T)Qô9&•RíR3­Æ ÿ®ƒ’1ðÀŽ< ÖT#ŠÁÊBÇÜÂF}Ìñ¤/ŠÌ-Ž,ÉhKAût2ˆÑ{¾®£°Œ'3Ê—¤T#³¸øE©®ôK¼â»*u9öS™šU9¢UZ#è°é%Q“›Øƒ>ôŒÏ˜!#Jµ ’! ­Ð”¯ñ­PíѺ Ò&­Ò¶ïVý(tÈéejé _Ä"ÏQ£3žD4rjZãÿYAÉK%U%1Õ«45 0ò¯,€âÂUÙÔ`ší\!NNûbÚªMÙ°MÛ¬Hå•CÌs\âáûÄm¡t2ÔXS£ÐgXQÍÔ s˜²Ìå~•P‘¶8V“v–)~h½³%õ’aAR-ŽÎdêaTËbb ÎÙ-ê¤nâz/BÎÈ5^GvC(ÊiÉí·(¢|‚RQ— #ßå_u ‘²g/)h‘Bnç@Ëpÿä,cºb•4ËbàðEAº€éZf¬Uíñª.0$¯,²®V»tæ= Œ¢„ÓXL,Ÿ³ãÓ eÖËF/Y½æ>Qê: %éV À±ÿÅ”ŽÈñõè,Öànà â¡„€/@ÀâüƒF#îñÚ"òf« #R"tr+C0íÊÆ-—ÎMù•6Pq>Oˆm‡RQ÷K6uoHŽ6SS3`k¬²/|>¶ Â5?ö£?lT@Ä@„p»`>êã>ºB$„B´ [˜×k·g‰4HW9ïmXJ©tJ9RËT-t]ƒt“/k³{¿÷‚18‡¨ è”År4ÆX0aL·iïâwÝQ$ÐPÊQüK#%Í"1–7€iÒl2äÂqI6µ=Û©C˜U´×|IômÁW Lì. z65Z®ÒCžnÿZ‡)£dKÄË…3* ªì XÉ2‹< ‚Ÿ±ÑØÂ¦q#”µ-›X(àVš¼7ƒÃw'‘ª2Ø>&dÞPdµ2¼®3vK¨(ÒÍ€øIÑvˆ9ÊÊÞsŽÒ‚‘2Ž7I7¶ ¿³ÿ0òÆ3“ÐëΓ‰X$[kz;>_³¸Ky›’$$#u’—˜‰«k$g×Ȧö’”gד¹n O’“SóuzÝ©z=´,{æ©ØÒmQrŽ×ˆ’«Ê’Átßâ <ÉQpüÖ—ÙéEìuIK—ǘˆ˜f7ò,egåZYõ?cYug£•Üt-W@o—õh¹Ùò–Ó:QÿÜBØ4Ëy‘×Α©Ø™µšÑHš±„šU4»Š*…°aû¹ãÔ±4;cä:‘IíœÕfϹ·i` Ú'ÚŒRÚ™$ÚŒÄw@59g³!‡3£5š^9 ìÖ†ƒº‘ÕÉ~” ¡;WQ©ó§‰®¥ŸkžiQ© è‰Ö¢uŠqº›+WW9ÁR5ùðŒIºôØ Gw-GÔ-•¸Žå™©(,¬€¦dÚE9Ymµª!ª&o²{•¡2ÔUf–¨ÏOe³…"¹DÑZšºÌˆül/ŠÁ³»^´ŠéÚ¡Ì«5è+'Xhˆ¦©PY¤]0ˆ•žˆ©Q:ž [­¹0ZcšL:ÿ !S±µ5²ŒwËÕ35ÍÃìü:vPQfûÚ#“ø™M»õ[Wì֚Ǜ§x ­Å #;¢<#"5_õД?—Õ®Qn˘¸ÍZ¸ ›–‡{ìùu{-¬@Xv线\\!#´F«´W-PKµ|Ôµ`KH—OaûGíZ·@0 nÀ§8 Zýú°cç_ÝL¡û¬í˜¼Ç{†V4S¥øYú²“ ˜¡Aî/¯½ÞKc„¾ì«,ð”¿b8dçÚ—K6+û€=B¹ÚŒ9{ÔöJ•»ÛvÈZ +˜°+œž_ZƒWÒ­%ëLö2„yÏ,bìаàbÍâÿÆr¬øžîÇíUÕ¢ÈcV_XÉj+À«üÉF‡tLKs'{2™9ªÇ‘™:Ö:‰\–/ÜÈ¡“§ra7F›=¼âòlÏî W 0’AÐÍÐ7/oûÂÑ MÒº€Ò, ºéI% ®¬;Y‡Õs5k6Èš6¯Q’ÓºÈñ|¢6è°•½ÕbØ`µšoÅ­Ù¤6cG/8Ö,®íAÀÜû*»Ø71,·û:ýøõˆé,¸º¼Ë¬¸­ë’÷­j8s¹·p# \á ~”ánч·1¬¶â..ã˜ÆÉ\À¯P Ø_[s)øÊvü³“]ÇÑ’í¼H‚;fÿKQ½´ïÜQ¯É%wùŸŸA›où¼zÇå×»Ùþ½üÊó9£%}gNžÂ¤MLZkáF`ˆàS]}5XaùÏp‰†–Zl)'X†f÷ÖtÕáõá†Ü™ÁU€/½Æ•@ñÕÇbE-¾˜ÑŠ0ÎxŒ4ÒhãÁô~7¡Æ“O@×x'–`ÿ’J.ɤTÖÁ›oBØ›„ˆu7T[ØA÷\t]v9Xˆ n·Ý—ej‰Ü…W*6PŽ:²˜Þ›räæœïÕi§{xæù‘YASi8©£Ó ýý›ˆÕd£Ž>J`W#@è oXj%á¹µ––u‰)b† nÉa¨wqª¦¦F·'Ÿ ÅéꌭÆê­:ÎjëA÷Ñ”¡©õ´¾´†Š‹l²TI\o_hmpu°é§@m%7&—dš ]¶ÞŽJ¦—Ûu—jQJëºó©ëncðÆÛÒ¼´ªê£M9êSÆ;ÔšH)KpÁÉê6eXñüV¦ˆYè)©¦Š.ÿ˜ÙŠ .w_™(«ôÂùq}ö†<ÒÈ$‹d2Ÿ» *j= )Þ•ÆLsÍK>)O³`¥1Vƒgܵ.§mÑâvK±ÑŸæe1¹úYGŠü^»Tw–òÕôi­^Öv%¯¦í§Î¡A™HÔ€6¯Í6n’&,•WØ)†GO¬!·x#-ªhƒG¬×\Sdõà” nxDˆ'Ñâ:n*P¾Rød°@D=P±H¶ÍyçZév)YÀIKlµBG,˜Þª‡Êí\®/ ÝuNsŒîwŽ3ÎPá¸Ë»;f·÷žÐï3ÇG cïd¨1_ÉèmP†Ì¸â ž_ßÔ‚_0ìÛ”έéÿÆg†»7ìH)]þ†‰–¨ª@ux üdºÇ’ðñÛ?ýPØ£ùµ|šÊ!JQÅÙœTêÁŒ T@ QB ”Bf„Á}xŠfáŠ08Ãz\qÆáA¥ÔÃÞ Ÿ4©±(ì7>#–ªNg7êÈÐhz›X Íw¾ÀÌevD1l&„¿ÞÍO(#"{ŒxDú­LPûÚ‰ÙŒ0Ĩ-*C>&eÀ¦@!J)„@Á§¨J%€Â,’â (¤£XpE=’2B_˜pŽ ‚–”¤0áéauKŸ©^7C‰1Í[zñ›k:¶$¢G‘, âîùHýáKl6¡°ˆ6˜d1)xðÿ€+Ø…|0ƒ)@(† ’R‡0È”KÑ@“R‚Q6…®#<„ W„° #,á=‡0m¯g"à‰f7¾0mk™èSæÅ˜É·hòpQmñÅÔ‰’!b3FÛ¬_7½I¿jIŽl+ðF°ÜÁ€(¢¥yJÁ‚„  ÀƒŠt$%aèC=*°Ë-2Å•D% œR‚Z$E³°`ÀÁ8þ{ ²”EóØÂL¾D|~ì(ñ*@vŒ8@P"¿ ”Q¥ðaiH 9Ÿ]IAP@ºäÙ&T@¦€ÀúTÊN+P‡3´ñ I‘€fá ¥´•¯„   ¥H€zaÿI8ÑësaÚYÃÞ0ž¦ uæäꊢŒuÉC)«]¦¹ÎÃ\Ó¥Ñ&]ÓÄåU¯’„ ´à¿±ñËr.,Ê»0¬*%®HjRàU®„Á%\ªR4@Ž‚>%Ì``R°…œý„c-³ L÷E‰…+Ì(Ç ™L­Cä“­Æê&°“Þ5#vÝ­f|ËMàbd¯î‘i¯hS“º&‹# GS`€©:öµ¨À“ÂÊË6Õ)ÌHA6’²Ó]vÑå¥bQÛ6œñ,ÑZï´2´±Æ0w9ks˜1ÎöhqÁÒq6¸ñ—k½n L‘sMÁçHÃÿD0<é¤/wÚS¥0ñã*ü€gx¶ –M A¡ÂŒYȼºT d“҇ꡗsoc-{]ëàö1o¶­omg›ß·nÌ5µƒ©V`ùdKfr_‰"9ÔœfÊS®æšâÎtôáúL‡+lP<¸1”g‚¢Fâ&Å(9Ò¡¤ÄRÃï„–’¢†Ð†ÙVå%9|9ãš!Œ«^ÎψCR¿Œþ¨ï–Vhî†Ì“k“C–d_úc›æ´þüÔ‡â±l?©Æ9+\é¦Àµ€Â.“WÀcž°nRÒakË–€z¼žgš^óú@pFj.ÿÂXÆ^[C-îo£#¯ =Z¶F³ÇZÂ-€W¥[»HÜŠ#w¹Íݸ'÷oÔ.£2&qÚÃMΦĪǟ›ílÕ®waÍ’–1_âŽk±ïÚÎÔÛu,ƺñÙ·¿”–bŠÈƒî‡dZ¸ŽWÅ-ÞW#“læDTaÓèy»ÂÒ£^Èñ­¬Š²ÖŽ Ÿ‘8jË6Ò2÷¨!¯ô¾pG\!îÅ×õs «;r”à¯`îå¢|éÈzoâñ,àìlÚÖ’¯£Kå—ƒCS‡Š®í¢õÖöAÎ8µ›ëÎy~v†ÝVkgûÐð×D˜PÂ@:À8ÆN¦ëýfî›øú½ÖðÿÑ;þVƒœ:?Ê·Ò:O»AzîÛ¶ÇJò“—¤Ÿ$gI¤§IfòÞ»ç ô6±ìŒß<;tx}u·6:¿Õ1kÍתãx[U?´ãÑ~{„PžO»çýÐÃ6j «æÝû¼ñTGàðÌ{\¥ºµ o>­wtÑ©çâ‡æb)ª÷v‚ün¹?'ð‡_ƒpÑkúÄ׬ü3;¾ûm³Õ}Þgÿ¦v…µt}éHúLjG¸ê£#{åBè´~â÷&ÞwWx+¹<·nùÑDÉ…HÅ÷~8*W)\Õr.TR°HYÇm„¤V{£˜V ×xއ€t¥€7Ò‚.øv˜‡\š÷qšd7ÿN·^;8VR-ÈTsÛ!}¦pÝÒz5§mÒç«b">$` x+èR/(+Px`JÔC¢6wÈCX•&8†WQc]egè…hx!˜>þ§!³gXð…RÈRT#tX‡–eõ#ÈõDxeaˆS£#%™Òna‚v“ 'sÏ1×qI#dÈ‘%ÅB‰@d… ‡*e‡-Ò‰žƒÆ£/¤fw¨&E'ˆ©˜"—#–-з†ÿG}~”iˆ1o€^¸}™¸‰(õ‰"“‰ŒQ~2ØÃwSJ‡±Fr2=祊‘2uB ³^^õ^¯ØBpiH„JÿsCµŽÜa @!F‚NOh…¿øMÅ(ð¡|Fƒ^˜wOáIäÀkâ¥EÊÖÛµB Aä Î0 tU+6ÔÈŠ£Gz†V:íƒ.duCj¸_³! §Ջ혉ò¨'Ãh’!S45ƒ20.å÷Çg`gxP¨Ø~ f] BP©c”etF]FkÔF×ÕK zú6]U%5XuÞ¸m´¸±ÃuÍD_54MÕRaÖ”’êáŽÝ4–çq–hùišòWz¨ÈÓqËsŠªÆjÙ•Æ0 l©d=ô†Yš5g³$c·”K»$QNé6îÓŠaÿ±= C)zô4i}È‘6t•¥Ò$‹pÈ€e¹Mi  š¡ø?§1e÷ÈyX¦Fñ4OJc}– àO…]=ibM•J¥P]ÀPQ¦¥“ˆù9úÖZÛsGÓ_Vy™«—•à8‚[§‹mVÿõm‚'šœá™ØtµR’¿a‚Å…ÿqwÈbÆBðŒE•bæ—B©SP%UTÕgæ‘ÂIcø˜•bˆt34v7¶u}_W}ØqsREÛ‰ÙÉHz Ú xø€{xt]˜šKÑ\Pb¹Q ”¥T¶Ù'ÕN³v«VPMiŸµ¡ƒ=S) SUÙŸ–Éœme„Ðÿ™pHã_ ðƒë˜.¾ØVè ‡3t¡Vt:¡Þ y/ú…J‘X'—XšÕÔekØ&–YPÁYÞÅb=I^¦UŸ)šƒŠyGqƒÎ—™ CHŽ•éh™ëC~2’qø£P¤“q§ÇX¤-‰(˜#“íǵ`žJ‘#Pb#Æ“åžw©b>ÕbY( ¦²±U©TpV·7ö¥¦[ùŸz&pU¨fv¹§ Št§±ª¬ê€D'wÇ$Uæ‡hY¶e=P¥X]à gF¥>¥ÉÀSqÖÙPgÐò]j0k{Ög‡Y©a:‘°øw osáȦÿ[R Õ2§Y§ تI?Æ%¡EÊ«Öj¯–“Jk×u¯iÖEÂæ ¾=ÁƯÄ&Å€lI©Õ:œ—³=u…H•@ø‘3ê­þɆ3Ä-¤Ê#E’®‹¤çŠ®Þ)ŠúQ(qieqÕŒUZo§…°[¡r–’GfxL’£‹6„Üv‹kª>Cf )˜v©ŠDÛH( ¡°z\*ž¦šSÍ8r%'++†ÕøtóÇBÛX0JV7z7ŸZ£HCŽÊ_hr'8!Öé£k¶g <=|H(îºyäé´îWc.ûбø°³HÚö­Z>j«<{v>kD@›„[¸ôX´nÿû¢€·Æ:.»ƒ¿QÓi$`Y‰Î´_°7£H[w¡·mz*×’%•Ëq$‰¶¹g¸(q§+¤H¡pÛ¸Ÿ§= £BSy†Ýj£{KHô.‘x!$Bo¸;'¸D´º&‘¼ÊK~—w~S¦ŒI÷‡³{|(”¬å^ŠBº¨±k_ :C‘ø¹2WêhªË›R©{{è»RëZ€«£X(}¨¤ùH½z—|.Kh¸Ë…çµß8s+£Bæ†(¨"ek§«ºˆ{™·D¢QŒ{¿Lw©6VzÜ+"šë­nÊc¾[º=Šº ¬¾ëËÀòË´ú°‡5Á,¦R7L˜ÿr‘2‹:̦ÿ[‹Ù&MÂ+¶ßQ®¨ªÀŽÇ¾/Õ¼yÈ25•¤L“/hƒVhT‚cWÒ1*‰ (±Z R$5EüÇ«?`Ìd\Æ |ÈÓ‡k¿NÜl5ö²,!…4wà{‹Ó'Ž’ø¦:k.A|{bL?f¼5'Ì8®kíöÀo;½n¼t:¹+Jš™V ƒ¡ÅŒøÁûLC³x‹bº„Ì[Cœv¢\î{"ZžÉ3@êô†Í=LËAŽìÏÖ g%2Y–¬ÀË‘4çŸÿ7‰ÞÖ€¬‚¤|v¦<\GÜ?ÿ$ÑËÈIë$$kþ¨E=A¥‰A ÿ™ÅöAâu°´œPÙ,×;Å1›—K}Ïé­™œzy.ŸW˜XÂkÈ¥LLÔ¶Àâ/ëœ9¶:IÉFcöºöEJ”F‰FjTÐL©²äLJ1¬£×0w[ÅW‹"Ï[¼µ®×L~{LÆÜ³È¼sʬ)<9§‰šÌÈôID˜ÁF¥tJ]J«ä¡ š¬²Ä´dK¸DÓÀ)ÑÙCœ<#%-ºŸˆVmÝÛœš ÀU‚bç`¨vºtšÏ'-´XˆÄ¯+aO4žÔÄîOòÄ›³PAe=ü4›…²<ýkº¹P Õjí¥E=Ñ K%ü6:Èi-Vù¿Ëyx»ÛÁ|±ËÿLÒkÒ‡Ò ÆÌD7Sí*T ¨ÖÎ ŸRuTìùÖêSðYT™MÔx­êE‘i`œüÛCÔ6™àj4ð®˜)"»¨*€óÅŒÏ&œÕƒƒmùºjL«Šñƒc¡M Z¢EZ“UYo}¥X*¢ŸZ£UZôIÚ¥Ýw”Â|¯¨­9ö×Vìˆ[k[¾œL‘Þ?F‰øÈ™B¼ÛèÖØѺ£á–+m´]±ŠÒœºáåbå%¥×¥¯LµÍLÑ]ß‘:^å5ÎE=h×Ûƒõ_­Ý‘OMØ‚ÍǃAÛêœ(¡ŒÛ ÜÞîÆ6¿Á­ÞûÍS&.^/öa‰ªT=àö¨,ÿ–â‘c³LÚÏæ˜Ù:ǹ ØÕ›lÞ”ùŸ‚ˆToëÈ‹ âJ®5îà¼I@ÐlŠøýY e\ÖyvÒJf\!¬¬möfȪ¬ÌЬw–åz&fÓzo×½ŠPrG¢3%>³•¬ÑÉR[؉‡µ®vÿå'ãyªIþáäöÞß©¼§pi9Jê¼Y—!TlÇ–lQ:¥ùªküêkÀÖü:f“^°®Él×̧¾!‹mmW± ¼zÛêx!ÒD8ŽÂ…nè*íÀ7ÚÄZAo¸aoÁéÆ:ø²‘ÛÝŽ‡¹|{_P­ÇèÓÅËsÕæŠëJ¶Õ¨¼n"ÿî®<*»"—ž¸ÄîÄøIíµãýËË Œ³]p¼ÁºXÀ0¹Š‡>nºÛøÞ;Nž‡ÎÌ§ËØÈnþK,Å ã×܈ÎÙœœç¡ôì'g!–¶NÄLnn‰.À·…“Ýý¤?ð1L·”‚cº¬»1G£Y³>H,€ld¯Ï׎í\¡úRS–ƒ9. òtdÎ^eÑT»Úûãœë½AH*¬7H9j‰d{Ï®ïPŸ¶Y¸§#ÞÊÖó!­t‹éÎ1'¾÷‚w„iÚ»CC̆u 2ŸÌŸëôÃï7otÁðšõµèÌB_õönAöXGá‚-ªâÿ-¡±l¯Õ4¯iûlý¼Æ%~÷xÏŠczËéüƒBqç<Ø4Úð?>.~L¼üô·õ¦?õýž¸“?ù4Fœ­µ÷.gµŠöX)±›Üɺô 9ç«øŒíöâ†ñÂò*<Ù›ùúZ•Ý+ÇoÝ÷Ï·îg \ËÉ<®£ó¥_ñŒOqm~PžŒ-íúËŸoî%°(µé|L;eôÍ´ˆ@¦1¾pVmï7ü¿ÿ!C.ž Âp¿.|qæ?x(¨W|1mB +Ô¨$yTS­%•T‚ÿ­¡å–›Ê6£† *KD ¸ƒ“ „Úà»ê ñȳ1°ênÔQºwô‘®2»!Ásg¹ƒ3 ±¨IƒlRè wnªŒ#5fi52ò£‰’¢/R£Ž4J€b–ˆœ"z°p¥žˆ ÍB<ó4J4[k‰%•þÔ Ž'£)ÆÝ–ò-8{ã­Ñ¦º8‘'I¡RÅæb«‰!R.È"CMKTRÛµTT·:5ÕTWeõ­ªP(lÉôdP‡½‚8Õ´ª‡*ÀƒZ (¡WFˆr4à "ª# üô£HrŒ¨f,¢ÀüàB"WìB õ4÷\‘Jÿ¡Ã•4ЀÝá›j¶ëµ·^UÑ(©t’­B]}5Ô6X+þ1a…}d¸á±Ì£5½&ƒR×-£‹78àbÓˆWêè"™ ú¨§q…¶Lgð¨„Z"`ü€A;Ñõùç ê“%w][­“²r6D÷ ÒEÚQãŠ+îR☦Š9NIBèaˆÉ+8lTÁ&[¼³_5;í­nòEIôÔ³u \*´ª™&"9Š ÀpE€ˆ$`fg$’v" `Æ(/ü³0Œ­3B 3×üX¡åq7ÐwWòP²M‚QÒ©&ÎÄ{SÌ­RÖU·´( ü•ÿt ÖfÛº±wRwߣ>øÀ†?ûȆàfÒIÆSŽ6O«ºr¢È©Hx\©E(ð8¶ît™qÇ/âR",à9àŒ_­íysøÑEmÃ@‰n)^CkíiᦆZj¢(vù:ŠÖvÕ„xªÆ#Þ^z×@1‚v‘àëRÁ†I,nŠÁ•{îv“^Id ±ÈAºP   SD'jYË"Ù`F ²12W€)"ððÞ¸0? æ C_EÒ! I 0‰pÓ:(>ÑjúbT¢¢2"éEFS´à[ØEðpŒlãýbƈÝDy‡QLcšçžN)ÍJ“jÿÁ·‹$£‚œÑ¥ˆ|ée2¬ÈáÊ%©pI’{_9!>­‹5Fƒ hºÚ-d'ŠÊÍÿ¨æIOZ_õ2 ˆâœ2¢±,_T¥uRÙJ±¼–a‘eª¬Ä‡Y!Fni•pÇ«;E HGÀ7 ”` ¨@Ó— ˜¬ /’áŠth"Ø’ˆR¢Ákޏü=ÏtM‹b=[tOªUÊj´SÈ%KâµÜͲ;¬(`jYPU!t;-òBôH¡bOržÝü©:NäWÁrP2<À?H3,ŒÈHé4¾.”à3+=@ž®ÿ•~†N@@1jý\.˜ëäiHæ×¡J®ä5S’ Mü…OPúO©“âß(›J”R.M”a(B ªP½Tµ ZÝ*V 1ZÉ¢XÎ/o’7Ó¼°Bäêi[}Ú¹  P–„Tè‰5{B¯¢dª>õ”~m­*I£‘W§sUÃ)±Â[,c±ªAÄ´‘=…^Æ(”™ÍTÈ3$tkg92¿#¢D¨H#I•8›£Jñ“K]m©ÈTJí*Q-]&©ÄÕY"¶±DÚ-_p;Ëß ²‡YÏ“ê6UلгËe®G0T?–°D´_ Ô®„zæU»´^—Ø‹Vf‹½å‹nÉ‹–àªÿ2½êõªC“¤)Ðj¢¡lÒL ¢Œ6W¿û¥C!ÿ7À°ÌŠÉÔ²6©®U°(_µ×²Ž¶ò´›×kFóž×,#‡;ìÕXi¾º\cŽûÁ† •¿+Þ/C$wÃÜ4DD¥°ˆîº]çxu=/|pçá.fXÃd²‹ld«qÄ‘ež0œg“S&¿,¦rgý+‘+*§}à€) L“ë2ĨWljkͼà3;­µœDÊ„R¥=gÈÔ™óë¬Ø;ÏåÈàq›’Âj+ãz0zÀ¬r¡­|ÂÅØ&[6…)G©J¥dÖqŽY;|¥Ç\û'Vò !º+ÿ{n ©KÝÞë®Q¢M¦l”1jhX÷ôÊ]Pô–»<ãØ„™i$Ù$ƒ}æ_wRͺ!ஓÃ+¯-PÔn õ²æl2B;Ú.'&VÃñ¢ú‹u·ébZƒà }ˆMLú`Šz ÆI‚+ýnØb(µ«`¯;iOKû,Ív¶©ƒçï'9yça²%Ûʱ&SövÃ6ëlH 6©G˜qn/»'Is"°=ŽæÿaM_ j»)¢ÊYßfá÷²¾»—Ã\àÍ%qmŒÝn§ç¹¹À])fTÀ®¸ø¹Ó=#%Š9Áò†wÓ§&»LzÛ?^9Ë«^–˜§-ëZGÿõÀ#Ú¤[­À­/Ã{~ö ÛQÌ@Ñýeye*uÆyƒ]æ5Ç[Ó§›Mˆ(CTe_},-õÖÉføÃÏo«y­Â~1„Ð˜Ðæ‚9d¦ÙÏ íçš5ë°eF§wIï±Óµ{éÖIøP'Oñx/Âñ›=íU/†yd·ìF( †0pk"Bø(3Zx”b«åþ,\a Í'ø zg7ïsDÓZŸ”}=!ù›J“R¹T݃mw½›_¶› éTþz°Ä>ϵWýë?ó>0þÚ%†¼mïÛú(!Wà€0©€8f€‡üÈ©”擈3I“ÿ5i?XŸE˜“ˆèƒ%عëK;DƒªY´-½º.,2½w )b³z³®š0€²?ƒ‘¿;£ÁÁÁì:š›˜ùê?W›ŠÀp(—.hšÉW8€eyƒ˜‘A"¼–l©ˆm‰–o‰ˆDò!ü@H:<èªá¾s+\ã41“»23¿³;‘{:¦ã±1›º\ÓAV±Á:ÓÃV¿Xº½Üã 7¢ð;¥ù&1¢ƒHƒ\Ð&Ó²><Ѐ(wSA\”­’낳ÿèñCTáÃ9ÆR!ÆbD‚c£Åp#Þ»ª#l²Nìb±œ.P,(œ,IœL¤ˆ/ˆ@Š€Éé  k4…LE!2­¨ø/°:÷0%œpÃóËÇ8„-Õa‘½r”Ÿ0¹\ã4÷3FQÆ!3ÈPQÈ…¼=+h <ȇ|p†j½VkÍVlÝVmíVnýVo WpWq-Wr=WsMWtýVègµG¿›Óï¬Sz Fѧ\m³8êÅÄüS/-Ö騀m¯šˆÏDˆ±Ó¶ª¸/5uÒü„Ty=Š­X‹½XŒÍXÝXŽíXýX Yc‚x†mÒKÊ[]Ù3LQ¥Ì7ýW™Y…®ÄÈPʪÏÏŒSÒ4<°Fu¤²r:ÁÑ4ªñ£K %8„Í;Á܉yRäøÝQu,«M2$É=þkF7 ³zÈB ZˇÿuQë„ÒÕ¬C§ÃÃ<6üZJô V¯ºÚâ!ÔbµÙôÚç$Ñå¨g[²å¯ÄáN[¤»z}Z8T­×,—½R «Zµ[ƒÂ[»®‡Œ }u «‰ Í&½¯fmÖ†[SÜ*3[þ¬ÕÔÉK*eM~Ä»½‹ÚΤº,¥Yô´ÜËíÑôÍ&;.³(X„ƒ(^ÓäNS\Õ¥2g Z©RNyíŸyϤ¥ÓBËòTŽ:ÏÜÍZð _„:T¬Ä¶‹‘’K² xàŠ%,0›€,8“MͰÜæe.ÖíL”³ìz\–u:ýÁœ ¨ï­\ÝÝ][U›(ÿÞ‹šxè„tH\¸ ä‚ú5Ý7³Ç›\ýÝ_Ïʇ!EÙé¥Þë]Ü«×áèN£*Êe`ñ¥ášU²ý R¾mˆY` 6^ _ Pƒ­hß>ÈW(úÍx8,¨xØÔ%aþêß'ÅN× ÌÓ`)²R+‘A˜Û†LÞ틼M5¬ä @³Š‹‚fø?!b ®_†ð& ˆ,X‚xàà%(å€c¸®åa+n+ÞÏÆÞUÜêE³©¡­0+È®Í3Þ‹KÆd‡„È[¡(„sµYàŠ| cú€R>ˆz€0­0öá#ÍßCÖ¯ÄÉÎÃ-ªìšÝÿ)õâ§-`ùÅJ6ã2f¬jVUccºñ Kª ¶`\èã9žc;‚ðŠQžf©áYn.,ÖÎÒ‰W_®¦ÃqžHv”ííƒeÍÃ`–ÊL¾‹w†çcµ¹d}N9S†€c ›æ žfmS¨ Àƒ5•åm^®D~Wyá¸(…Q^ç(c ÃÒ˜­ab¶èYâ´c¾9‰縉YP žß &é Nå:`7l®-m>hÏr|þæËÜâµ¼šÅíÇrvá§`MBMf纠[¬j<ÃhX"ßkëäBÔ¢,Òç†Øà Î’x¨šZ‚:ˆ‡NÈyèl–â[—.a’¸eÿxå£RY]¬'a{è¨cM¹.Š&c£D¢.j„²YdRÙiäâ>ðk\¨0b9ìYèc°;®ié°FdFÍ\ž"}D*®ì´ݛXÖÉM`þlÐ(NÛÜÎ-D(‹éâ$kí¬âÇFä³í[+ÙUJó.{Zk/†ªí̸®M¡V¨º†‹ßîy¾Ù ]T´MS'• Çníuz^GÞ6œl§²mÛ^a§UÚÕì³òS϶äavç̸ÅPX­Îÿ-k 0hæ^§n6M¡´W£]¶†èȦ1æíï¦kÌõÝ Ý dÍ€¿[öæºâYÔ,äöæ©|Àgÿž-Õ£«n;µì'‚a «H«Q¹Và¹æo¬Bê%1_ Œìg…Ö^ðG2[Õ–éš0ZiKsÎSûŽÝ§uh¨e=7ÎoÈìm„ nÞúp42%ˆÞdUæãFïGÐõƃ–RqGŠ<0q9ÅÇLÃ4¶­p›>ÜöeÙ ¬÷ëðÐïýV¥ªøÑƒõ†ò~HáÒ|p•‡Eˆ(¢x˜óô}nyZäéV3¶½U…NÜ­h/tC/(v{5ž›æðÐ=n&]rY¤ÖjíVgÈVL§VqÝVl WL·ÖJ¿ÖP¿ôtÕÖPuTuOWS÷ÖouU×tY‡ulŃ4@íÿäž'¥p ·Þkaí ”vîî‹s2¿á†È€ò½¹5Gˆ6ÿÚª ”Ÿ틈gÌvÔ>ˆ¨önïvlçöpÇöÐøöqw»v j—”kwow÷l÷g4÷m¯ötÇws×÷pë÷tç‰ô–Í[ï´^]®ïÙr]ms o ï*!½¼½ Y™6†þ‹3Nxè6p´ý_8OÞ%wóÔLoØ~S=Ÿépáu_wh`ÇÓÂäÕ‰ænBGvø1²Y@ »ÞÙÇN&oñ zo®NìDz Gù7Or6Pƒ/Jœ–zõëâ¨àEøàʆg‹‡¨­?£2G#ÿ«ÜèâFò¢/R¦wV¥OÍoú´½L%OÛ¸ùÐLa—¿ñLsdÙ‰°ÀÔS—xÀûz´èzà {‰oàÿÖ%¥B\ßì´ŸÕǧ’ÈGy>Ü0CJ "ÇrKs£Ônó,,cOvœÏù»V2‹€òMÈðh¶—|…»LÓšýϤ}’MÛo{ÑÔ}ø(pÒ…}Ðä}þþM1ZzÏcù©¯éòƒÑêvŠaïPJ}¦ü³°þë¿=‹Çw|Gx<`©*]Ïü}àïýŽýÓêÊó‡}á'ÿØwÇþÿkûö_ô—üÏ…óýõGMš¦l€‘ Á‚D(РÆÿBLÈP¡A êt±d#G }ÌdÜxÉ’&O¢L©r%Ë–._ÂŒé2’Ìš6oâÌ™s¤Îž>mÉ3(Ñ¢Fk=ªÔ¨ÇŽ‹ºtÉÖe!A@q4“m£»Ž00V,Ù°fË¢5{vmÚ²lߊ+×m[¸oíâ­—îZµzïÖµ»W0a²oêô ëÕ+ fªFŒLUòÁ†'#T˜Y¢ÃË52ÈØ¸iG£û$]ªz5Pš¬_ÃÆ™:6íÚ)gÛÎm·îÞ‹@ZucŸ>õúàhzqSÓ›f(]àôçÒ¯S‡Î¹:öé Z—]ûøòTßßN>ýóÉà×wWÏÿ^~õùõïOõb9Ç>Ä7î™|îUöÞ€í¥W e-hÑc£1§G¼õVáR®Y˜ájjØ¡Oz¢l"æÖ‘O)dQq+Ö“œG1·ŒÿÅX£7âhbŽ;òØ£?dþõ÷„‹5ö E ^¶ “žY¥{šqÖXc¦ÙŸ;ü¹"‰_Φ˜7y9¦™%•yæ™iª™ÓbOEUÑŠÆaeäb]ÁßbDòIã:’ög‘7ö (‘ƒ*d Ìº¨W…6jc¢1N ä¤üUj–KVI¥è(¥“SŽ¥ƒÃ ê„l¶ù%†­ÂJ«±z8+­ÚzkKî$Š"õÿ ×G+ÖéØV1ê©(£– š©¤ÊâèìžÐRK팩~%§¥2Ø­¨ ª‚áB–'ª‹1p,jºÂú*»fæúnnñÊ»[½>ýÜ%XäN2#ôÁA‹ÊeÙѵÄÍ™pÂÜ0à +Ì°Ä C¬p´c<±Æs<1Æ+>ºçÇwLñœ?|2ųœ°ŽÉ"©ä§V‘§4‹kóD5S„ ¦ç&z-½÷Âæ.Ñ"}ô†J‹™ô½oÆ ‚<ÉŒ< ôaŠ)u~´žE&ÛÇuà‡eŸm6Úe³Ý¶Úo§¶Ûlǽ6ÚuÈs(¤cÛ]7Üs8Ý}— ÞÒŠM¶ß‹ÿ Nxà~7þøá¨W È퀚ï .ç•i¤$s[Û%Ó®žN¢Ó©µ:ëD¹þ.ÔPt€#`µ).š[c²_ÔOpÃ_¼ñÇ#Ÿ|6ñÔpŒÀ Ÿ¼ôÓSU=B8ÏôRUß½÷Ý/ßü¡03&3DMÖÜ9zëëì9¸èC¶iŒB¿î¡Ñõë;þ:é¿ÿNþï*QÀ¡H'™†ê3IZiNÓ?Öä~8„Í w“úð%@„Õ£€•Ï ,k¼I0Ò<ÿ„0ŠÆË†ꑪ>@QŠQÌF.¬¸§,j1ŒÈ˼ػÍ0…¤âYú\èÆöÀÐJò‹Ðª‚hÚq)CÌãmøH›=¶i1pÈœL1°Ô¡`YƒÃ½GQyÃã^T$éÈKV²ŒŒc$1YÉRò“¡ì¤&¿Xt1l0•V­Ü3iLit9 ¼áÄ.^ÒuÕÈ©[vW2.†1Œ¿ë•ðæR~š÷}qÌdûâ;ßúÞ7¿ûíï<à7”·‘UXÌâuðȆ$c](„ñdƒÇÐ@œ‘h,£°^‚`Äù(íØp©Œàå”ävŸ9J©ÜÜìÁk< òÿàPßú À~6 àp<Îr— [=²éýÛœIGüÉòqÏ,8ŸpÕ\$ƒ+lœüU_ %á_ÓY6–¦4×ßE—ß‘à‘Ûß vYEv¥waÕi¼[_ý^z%^˜)WWØ UÝ “áàÖ î Þ`Þ›æ ”ù`J*^á6!>¡*aN¡*!^¡F!f!ú ~¡va"!.¡Rᢡ†¡ !¾¡¶áÂáÊaº¡æ!Va”ùž`UŒÀ“Gä‚#Àñe`ñ-Ú¦åÃ,Àá_#Jt–V’ ¥dÿ`6¼\%q‘Ì‘Õ@ĉÍùšŠ¢ 9Ø10CHÛ$žD%nÚƒÙš]qQ<0J!ÊÝ'@ ÌBt@Á!Râ#Ê]#æT¤ÔÂ,Á1tA&¢œ(º¢ItþÑbõš]ÄI ù‚•|ã7‚ã½Ø¸È8Ž£‰±X9Š`ŠáùRU}YªXž;HžÌ äáã˜)™˜!™õ#@R™?Þ›@fAê Av™BÎc@:ä@2d˜E$?BäCäDþ£E.¤F6äE~Í™™YÁQ–ÞÀ[6úŸ€HÀIÀAx€„3¬dKDžQ€ûÝ’àAA@ZMBÆ1$ƒAô_äü´ÿKæ$A¸Â>•@>CôAMöACàdAÈ$D Ó`DÌ‚ÕTJ¥K„3Ì‚ƒ¹$ƒŒ@=˜&öl XJF)‘½ý•€|Sé%S-ÂS=•B`ZA`òÁ`& fb"æbæ`& ÔAdJædRfeZæ^ @_f¦^âA8—»YŒI`æ^þ%` & d@cÂa¶&kflZÁjªæl:f`Zfnêænòfoúæogp çpgqçq"gr*çr2gs:çsBgtJgqòeiþ%Œµ(P·aQŠÞŒ€ÿê^ª¦fjžnª§vª N*¦Ž*§–*¨žª¨V*¥î©©®*©¾ª«¶*ªÆ*­Îêʃ ©›:iƒ•€hÀ¢™±HÙ»½~šÁÉ¥P¸$ÄE)†á޳¶\,ÄÃäÃÕàä’@PØF¨üä’åPvׄN¥E@Z“²œ€g:Ã0@¶nëüå¤E¨Á,Ôƒ)ˆ¹‚b[ýkA¥Exh/Ìk½j+·CaX(KòÜc|Á¡5†Z<”ÀOZ«ÂÞ+Š…¨ÁÌ¡ÌF|ÓeFÀʲl˺ì˾,²ÆÃÌÖìÍÚìÌ*©Î’f.OÖC€ÿ†/ ÑÒÉæZ€ÊÂlÓ:­ÓjAHÌâìÎÖìÎÒ,Öf­Ö^-Öv­Õj-Ï‚-׆í×*©Ùn­×–íÚ’mÛª­ÛŽíÛÊmÜÒíÙ²íÜÚ-Üæ-Þ¦mÝöíÞú­Øîàþmá ®á¢íá*nâ2îÝnãê-â:.á.îäJnäV.æ~-ÎVmÀ‰.ÏpÁÙÛËÜVtP.@·sß3?ç³?ïs=ë³<ÿ³@4At?ôB+tC´C'ôCKtDS4B[´=OôE4FW4GkôA{tHoôHƒ4I3tF‹tI«ôIw´ICôG³4L¿tJÇ´=?3Wsf˜ÁŠG6`…°Îÿé8 å+Žt«Wõz]e,\mRîHRÇ6ö“]þŒ•,Âe€6à',‚#3,02,°X›sGrZƒð=‹eWzOÄ6;†N¡ „d5CàÂ}ÄW£sYûµ˜õËÀ9G3Á4ÿ0'6/67¶?ö6cÇÃd;ve+6fS¶eC¶f_6gKvfƒvd“¶gwöh›vho¶h³öj»ög·6l¿öiÇ6m϶jËvnÛ¶nãönûvowi£öp×vp§¶p7rß¶ró6sÿ¶s7q/·;cp·5Ö„A63D±”.yÁ‘„SßHK.y³·iT×ÿ׃ª–z5ïÄW¦…·d¥‘EMD'ü$C€ö`KÁ`C€€¸`x€/ó3+84#q1iâ7˜B-ü'§Èõw „Ü7§TMCôw ÿ7‚¸ ø€€x‰‹øˆƒø_0u{0;O3Œ7³Œ¿øƒÏ¸×ø?Ó8ã8ëxïxùÿx‘ï³yŒù‘/¹’'ù?yŽ3y”ûø”[¹“_9”g¹”cy—k¹—sù—‹y˜“y•ƒ¹™9š—9’o¹š»9›Ÿ9œ§¹œ“yÍ>q5wµ)T3üw›W Ì7s¬ðIö[¦eQïÛ¡|ع·ÀÝ–a1Ç6j„XZÿĘ}Z…¸ pz§sú€Ë¨ƒº§“º0³Z£ú‹0ß9†[Iáy…žÜu¥ßNŠó¦“ú®‡:§#çóz°ö©7x3#¶±#{g+û/û±7{²3{´;»´Cû´[{µcû³k;µoûµw{¶s{¸{»¸ƒû¸›{¹£û·«;¹¯û¹·{º³{¼»»¼Ãû¼Û{½ãû»ë;³snß÷vµú«Oº²ôñ•x›P‰ÂcåÂ;<š=z8åk=|S0¼ÅW<Å7¼WdÚÓ1RÆ[NÈ_¼ÆcüÆ—|É«hȟЦxõ‘lu¡ôw§«ƒ Ì<͸:ÜüÍszÍ×ü°3ÿø‚?såþá_¾ãgþä~Açe‘=Ÿ;…HʶHHB%# ÉßX½>½ÝXùQµ¦¥“dÁ>îË~~y„SïI.¸¾î”ðÇþðkø~ÁÃ`GÔ÷ÒPqŒÀØQü"HÕϼõS=dÿöc÷«ƒ©§zª3{r¬H<„3€ÿ̉Äz<‚·]cÍä5XüÔ{ýk?Îsý׿©ƒ°pöÄ—4ñ4ĨA Aƒ<Øp!ƒ!>œhQ!F‡ /rÌèq£Ä"CVI±#I”#MªÔ¸²dÊ–3eÖdi3æM9yÂôùèÉ .…%z”æÎŸF“öÚt)RœQ¡>zðà"}ú‰†W±@1{mZ³]Ó2¡ö¬™·këÄë:ö.W yïîÕËw¯ß¾xœ†A=¸}êæõûø¯ãÈ%W¦¼7^ÅjÛ- ôgÑ„IÿmZlæÍ@äžeÛ¶ ·s倫žØ>d¬PçÍ·:áÿÉ7îM  xË 6Wèúó嵊­V7WÚoÝÎ]‹¶µÙêº9ÈË-V€ᾃ¯ð¦Žýú÷ñáχ/ÿ¾:Ê™Kþß¿PÀ <ÐÀ\PÁ|ÐÁ!œP )¼Ð 1ÜPÃ9üÐÃAt.žñ&;íàZqEwÌȆÅ:bó+:¾ µqÜÑ0{äKƒ:F0%°"û¨ñFC+MÉÓpüBH½Œ<ÒÆ&™üË%}Ôò. „HCJ·3 ¹ÞA€#ÓNŠÜ|Î8å”3¹ì\èÎ<ñÜs9ÚÔÌN€3ÍŒqF ÒìÃlë×EyƒÏ½7!ÔÍÿI«ôÍKÙóM˜êÜSÏPAUÔRI=ÕÔTQ]UÕVY}ÕÕXaUÖZi½ÕÖ\qÝU×^yýÕ×`VXQý\4EShc‘Y´ÄDëµðÖ’§<¬½ÛlµÝ–Ûn·¢óXìƒZoÍ=]ks w5ÎÊMÞxåe×Yï¾#1ߪLDý—ƒy[¡S‚Ý,áƒ6Øàý–{âˆ%ž8 |1ã€5Ƹ(eË{‹dÍ;~ýÅå”i³`†]næ7c^x‡QÄœqÞYçžyþÙç Z袉>Úè¤ìˆ”æªÆfGæ dŸuÍ”z´ŽG뮹ÿ¯½;l²ÅÞÚì´ë!’YDÁ>»ì·Õ[îºéÎͶ³FÛn¾ïöð¸ÿ¹„Š%ùã•Ožùåoú神úé­¯ûTi³ûzR÷ÌÈ{¡õE-i¡ÍÆóÃ_Ÿ­öïuŸý÷åŸ~øíŸÿþúñß_ÿþóÿŸ\Ÿ´^ÓîÄæLÀ"Ø@.€xA'(A ^Ђ¬àëÐA~„!áI¸¤Aqÿ è‹^„¼aá i8ÃÞ‡9Ôáy˜CþˆAâ‰XD#‰ITâ™ØD'>ŠQ”â©XE+^‹K¬áe8©¹F}f¹ZùDöE3žiTãÙØF7¾Q-2BÜ S2;ÞyÔãùØG?þQøjÝúäGC‘‰Tä"ÙHG>’‘”ä$)YIK^²/4Ë [è´¸ãYšÄä(IYJCŠé5EâΙÎô±V¾Ò•±„å,eYKZÞÒ–¹|¥âÞ ¸Ñ”Áæ0‰YLc™ÉTæ2ߨK2À Ðd€4©ÍjNÓšÙÄæ6¯ÙMmz“›ßÿg8É NsŽóœåDç:ÕÙÎt¾sé[´Ñ‡¹¤P—ùÄå>õÙO~β%€QÍRO´¼¡›T¨'šÐ†.Ô¡…èDZQ‰Z”¢ÕhF9ŠQnô£éHEZÒž”¤(5iJYºR—ª¦-éKeZSšÞt¦9µ©NqºSQ¦%% èY@¢©IUêR™ÚT§>ªQíãüÈdŠd(æžøúØV³ÊU­v¬_«WÉÖ²jµ¥¨‡/íç½Ü0®q•ë\éZW»Þ¯fÔdÿÙÏîó MhAчV´¡èF/ÚÑ‘†ô¤]é©‘Ó™Öô¦9ÝiOÔ¡õ¨I]jSŸÕ©¦&Y}–V/”¡±~µ¬]]kXÏ×¶¦õ­uk^ÿz×Áöµ°{]l`ÙÆ&ö±•lf?{ÙÑv¶´›]mhOÛÖ¦öµµmn{Ûáö¶¸»]npÝæ&÷¹Õnv¿{Ýñv·¼Û]oxûùÖ÷¾ùÝoÿàøÀ ^pƒá WøÂÞp‡ ?â—øÄ)^q‹_ã×øÆ9Þqä!ùÈ;PKcKswˆ}i8i85Pictures/1000000000000200000001803172F0E116A9319F.gifGIF89a€ç|µ¡+ g=E“qŠÈ±]]]\‰|Àáå\{g«”…J:1,†]O9ßÞÝ€”†¦Šyãíï"•q*vS½Çº[l^$(*§°<^Q55b††rg"G;…ª¡}p–”Ž åúüÊËÉH\[pmntzy͵¡ CCir†tSrÖ†‰¦ŸHfS\tc"<4=v]¦¸§„œŠI9 ‚cWGJaY—|ööô,SGn~z44^ΚËÕÔÖôøt†•gQC³¸µÐâ䋲ž—œe€†Ê˜~Pt^@00E@jmr¼ÚàHHBBh¢qgŠ””7RJ*#bt|–‰~DRV]t†t–œ,2Mf‚xTdj¼ÒÔ´}mMSFÒêïentrteOŽrˆœ›Rto>FF¬Ê²6*¦¹ºt€‡OTXš±².22\|xgˆvn‘(jK~€‚S\`r”ŠzŒ‚3``½ÉÊ.(H\‚zÅÀ½¹§¨–œHgb2&isyµÀ¿¯ÒÖëå䉢žÄëìOŠoDŠiLnh:EC;RZpuyšª¥Ž ¥t€y/fM††z†ƒ!þCreated with The GIMP,€þŸ<é×oà@U)RH¡á†#BìC± XÔȱ£®Œ CŠI²¤®>ºªÌ›'OÞN/9µ”·ržJ”}ªèÔIK4ÚÒ¥£G¬h4nH“:reÝ:GÜizªiªT§ëªjÕ*u«×hš¢K¶ì˜°šÌneR• Y¯p«žÕÄ–nݺZ™à›öìܾc·ž;†ð`j·ÄRC͵h·"K¾…Xr´J…'ߪ¤Ys´h]¹EâV”™6mâÂ…Û¡†—k× jx˜½cQ†i,0¹w‚ǪUfù'܇ã€÷7KQ'tèråú#=ºNƼ¤ºâ)]†¼jþ( J€ùó$˜Wo^](7õœ`20ÅD‡ òç¿·)JU `¤†šD±É '€°J‚ü™0]`âÄ4¦\P#6vÈa<€¢‡$–hâ‰%ôD!ýòÚ,ôD4FÔF8†„ÑFI?YeS&À¨pÒò1ó_sÍG:–’*0ã€@++*!4P J0~ySUΧª€E+‹÷™:…JƒxóK¤.U´9]°m|Ñ [š6•µ.nY ¤ ˜¹T*-Q˜ Ü4‘7¼ií3þD •2ÃÁÈN,AŒ«r¸H$ŽPdA §šÊ¹f6‹Èb . tŸÛWè–å…Y4ç9ÖA]':q oã@é‡ÔÀ­Ù)¡[wÌsçEÌ S¸Oðˆ'<äG^›hž ay%è88öÕ/C@Bn ض‡°îÏ“ò^ø&6±ôQG9:_FÔ·Å/#!ƒ%Hö¾!IVªBìg?üµì—ücÁŽÀ¡̰@%ÒP‰@¤`…41†ÅÄ ,P›à¤ExÅLëË`ä2†H•ÓƒñààÄrª±,&,}‚'YþÄ4·©0Qhþû‹^ÖÁ„® ¯@64”×ÎâM·•m/g¹ @5á ÀdFT±& g'¢%šˆÄY"ñ§8âKÙ«zÑãÀÔºŠclÂ’š†…î`(t2|x%Ã:±Y’¤d= JBØZŠ e>º. H@Üï &*(1Ì”£WH `à 23 ¬p¦=œðLRD“بÄéB²…-Nþ 1¸BÀtŠ1¢œ©!C½Ý)áœ'é–еå0 wÑ rÓÄ;E Œ²Ë6µ‚¼5ÍvNòÔnѪVmªUUÁ(FÇÔOV…ô©@o*F‘ŠuìbŽ )1Ð ƒ$È@ °Õjx1›ì.†©U¯*4CÐE^÷Hð ÜË~ð#¸0†1Ö¨wtâ Æh…7\F‹*Äh ñT§Zƒ„#Ò*ñœxUx‡¼‚¿`€HüO­<¤ à:!SÔA)€^‡LdP„¯9J%Hh™‘ˆ –±lr” {X"I —2 ‚–ËÚH\z3ÌPðÒ~›=àþAË H,¢p&-LË š ƒwj[BÇ—½jPo‘ o#cv¦sƒe ¥ …Áƒ"Ê?Ût a»ë ÐŒ ŒkóòZ» wQüŒíÔÂ;–îŽ!…Š„#8ÊŒ:%Á¯>F*fMkô®"½ëÝÅ à{ Òx¤÷Åï~ù»»6g ¡°–‰üsÔX^šÂQxáoxƒ1ò,§èI! 1€r—;Äè>÷æÈ‹p`âYåêZLoÄ!0+YÏ ü oxkeë v|I'¸ÁÇ"à^‘‡¬WiD'9‰aQæämä#/É”k ñˆûHUÂåþ¨€›ÜküXZÁòVLÖ~”¸Â)8‹Lf¤Ín^‚Ü 8 s6mj1w sžPÓuÑtB½&]E±“,‰ñT:?*kJÔ-âÔá¥ÂmÒ›j2 ÿ2–u,},Ÿ¦n[üjG`%Ô¥`V0жÇ=÷HEÞõ¾÷¼CÁÂõ¬GAøQ ÷ðG 7xÙp-' Z ¤}‹í~²(‹±¥ƒ™‹† q+A˜‡ù>Š‘IUBŒÄxŒ¶bbù5‡p æ ŠàI¥Öè 4G iðö°1 ©YŠ6`"К˜‡†ðñsþ¤ ¨•Žœñ[c±B-ˆ&ûÔB7HNV)Œ–AkQ6‚Na]LçMȵ4kòu¹üÔBQàvOªÜùâžâùª„žOˆ^9õªñ)žA°’ã™ ×€ +É^A@’+ù× afôSÆŠ ½Ú«Êê Ò /G?„ŒVTâ.9™­*¡™ [àm`²ÑGºsbJˆ…8€X•Q© T+Ðb,æ•öê ð’|›@c'ç.óVoq Vý6—TÞˆšC:—EÊp¡Ô!4° 4@y° ÛÐ K"ó5ñŠ}™ë±Qš¥X ~S ¥ƒi˜îãdW)þ™IÁ–Td¦/0‡ @ ÿðöï° `LÚ@rù59ê ¤6à!PЧªÙm8˜P‰ZbS.[ÉE)2Ø6rR)¥t—üÄÞt(Ù¤&˜šCíx/m2&`q6”fõjÞé^ëÐî‰kéYx¯:ž|ž†ÇžÉAx©ðS¸À¹j’³¸+y¬'aØ¡:¶F$‰ o`¹?u ®àFÔXfö9Väâa;¡Ð[`¨{º¦kl¥ë_³Á_•£úubº®µGn@"Ê®%š›|öê•Î0¼Ë ¯Âr¼*¶b€¯0&/pe°“'Bš¥hW þ[—F±û,wRÒ,á{I±›Û û}Yº¯ø± Ë 90˜²!¾91!G~8{AE‘hà »0 Þ°³.ðKB T âÀ¡‹@´ Öë!´) ¯y¦›õ€Ï4M’Aµq!jgë'ܨßÄ(ܶd{Â/ô¨jÇe2&X¡9X±`;èQ'à:¥ƒºÆ‹  ’†÷·…ן¹J¸ˆË^i’‡ Ÿ?µ¸Raô¬øy¬ÆmmšT‘«ö’ðy :oàr0cfö¥-áÝ2º»ó_á®Èæ-¹S;Jðºí¶ú5EZˆþºÈ寷GnSÙ»   ‹ Œèˆ/ú.ý2" òrò¦¢Ä}SÎö §)†é!—ÔÛ§ ¦|ʨœÊª¼Ê«Œ—¨l°üÙ €z°$T‚$ä»rK‡ð°ç«¾ìËœ ¨¾Ûpç ²ƒ™²7Œù™¸4¦~ø¿S4r´Å ­ïð.pZÀkœ_Yô… ¤¥ŒÊlùPâ(¨õ QK B³7ä 5’†6J“MÌÅ_wAk1¶Í4<ÊõvMÑQ¹ +Î逌:9Ñ«°}ÁIëΙ·s %@Ïœñüø4ùÜ‚jòÏ04^TKþ¡ Ü€Od;¶Êåh³ÐîåÐ;؃º† ¼ÁµªwÝx·UÈ‘P¸Pè«¿JÒ%¹’÷‰¸ö}Ÿ*= Ø6a)ÓÛ–Ò‘k 3­y`à1­T’ 7mo° L*3? Ô³{¯Á_¼òºãÚR¹c­¼Â ¬¡QýÕÜ"HÕ‚¬Õº{Õ»W a Hà>@Öΰ֛Hiðn)öÖï¼ïòÖ&0B€ ‹À†1`lä’xM½IK—‚åR>Ø}؈ þà ^À”`Y“Ù@F d.c±PË.3Jæ4 4ðûËìË>wd2X·TþããÍ1Ó Çìàì$&…Ûo˜§E«DÚÛI«šg¸y„MªE‚"¶-Ýpñ&f7,4&g^Ôí¶ÚjüôƒNÁ»æÐ­Zm fÑëÅë儇gÞéU·¼qžßÉž°ÚŸø¸ü}’k¸"} ½jFÁñøùÒ`\Ó:kDà~àI% ÛÆmÜÆày°àÈŽm>Æ n±üNR%,"â­±­¡+W¯áÔCíªQâ+"ã¶"T-#)nÕ+®{sÔYù±Pã4^ã, k™ã¬ðÁ³Ö)ʼo½ SpU `¶3.ä"½ÔËÛSò"’4þDZ Àu*§‰ Ër`VPæÙ;ç¿Ù./æe^ÙhNîäGeG&ëÑ-±¤yJêë$¸ÔÀùµ“æ1¤Pþב~gç¸@Q'Ð-tœÆBi#êÓ-ÝÅ'Ð Õ ¥ªw냼±žGßïÙž "ž=U„ék¹÷³&ÄU\xöéŸü‰¬'­¬ÙfFf¤Ò@õßí1oTÞí žíÆ°à ® žýýÈ^ ØÖí. ‚ž¾ê‹ œr¬MjPá&V9¬âþÔ"®"…0{¸´Úã¶þNȺ+ü »ˆòʈ>ÐH dþýÖ›¼ŒY„ iƒD¼šñáÔœ'ÿ½•BÚ)Èxo‘ÂùôÚ§? ÐU罿Hc“Gz‰¥|@" ˜`“) À$ƒE&Ä$&pf‚ Ô°ƒLÂE–ðÀ%NDñÄ6TlC€ &j©FoıF:ØÄ7p”QÆ#å°+–4 #Tæ=VÐC"\rI$ŒRTXÀŽ¢‰Æ“‚ƒÈ\ˆ]0Ò…Þ i¤*ªÐþŽŠúÙ%%BQ™ €"GÂùÉ 7êÁ“ `Œ[nQ*š¦´rä)&šÚT­¸iê¬PÍZ'’°25k´vau1ºNØ¥±U …‡QöúÇ› VÙ‹W\‚¸fÖ[÷Úõ/Ã[l¸ƒ,°Ut%N³Ì.­ZÒzSµjc‹­6Û4CM’×$éíµY@­¶kÈÅm7ra3áR;îšVZÉc›|óÝæéBiƒ´Ûn»'¼;¸Ÿp¾S£Ÿ†¿C˜;‚e0¨"Šî³ˆ4ÖX¾BTé/½'^€†+•UV@ÃMÀ(“EœXb‘-Ød 'xä‘ vþìÀ‚˜e^¢%8úè^ºŒÞSFüTP«¯¶É„)c @à '—Ä@ɲåx2"‰tÅ‹!•QK+¶ä’È)(É̇Ðä»ï„öFH—6 ¼ðyä¤S»”V2Q ñOq,ôŽ:j‰z ĨH'ÆÒªD¿T*PÃ,¨²ÊŠT×ÍJŒ‡ÆbMVYÇú2¬/Êþ¹†Xxl²Q8Ø¿‚@¾XÈ “0i$“Œ/(ÃÌѬ͸ÞzÓ>áJó~8Ï<ó4m¿£Ýï_N\rõÑ'µj‡óæšçô}ççô‡sžëÎÁ¨ðž'¬§OPþ½Óî´‡b ©X2AŠllcóÈú¡Š…Œ &£Rܘ€àe"ZD=êáLÀÒ‡v¤µÈ,O%ªAÓt¨C^,a 1PÂÑ™ÌkG´„0ALLáBX*[Q $'õLP880¤8ÀMnL2R±‚M” Úñ[ÕÈÁµ±pÐÅ<7§Ä%l¼hÜ‹$9Ø j6"T 4P‡Ÿ˜b+$Šç&E[hBt]± SAº²0aQÈÔ²ŽÛÅ%V¶Ì[’Å+eí2ÿ@ž4~%Í¿ÂñzG¼W^z¸J^aþ! T¯yA˜žfäþ5/ØÄ¦4oèM1‘©ï‡|ƨ×5懋k%S8ÜŠßndƒnå!~ÛiîE.8äúûu 96;Ø àÄÜ#OíH°ðlˆ.81YL>h Uñ’Á`WÁ °ø$-nbH&$ê„™IÔ@âÙ#8ð3BTB‹` /œ¶Ã¥G<ú¡‰8šL‰WûÄ4 LÜ!PÙ€)ž£lFPF ƒ$$p<KMbÚBðpÉ¡°AŸŸ5VuLn„#çÇ*¬ žðyÂÁƒGµA|ô£NUJwÀÜ$O@¢E‘Ô¤(Eþ•§ˆju¬sÄ.Öq{È®”±RV(Ã,e¥"V©˜•` Ã+äí…2A¸Œf^)ÌÍtÖ–“鬮‚ÙJTbö2õ Bý43¾ÒŒ†[×¼Ö¼À>bÆë8ËL&lfdzóÝî!Þ1\}p“[»it sˆCÀ!éÌá§‹wÞsN÷ `ââù@wÎéprœÇD,È1 ^Ì`a=à >B¬-nD*á& ‰ÎŒ…-ìšCyVT§j /¼Ã4 =È@ Q!ú)~TK_*()HaÙ¸è#B@¶$•­f3‚LèP!5§YÊ’ ŒŒx !rÔ ´Æþ1 !‚cãõyc6º1Žc»Úí´Ç;+¹#‰N >íÑÁN«Ntbƒ|ˆ€[J=èZ×D%Wñ”§P•)G4&-e†¬_³ ~ÜEÍœ\Ì]xð˜½äåVÀ”Lý&3­ãlæ\¶ÜŒ"ΕÙjifzãÃE+®¡«ú5Úv©ßm¥yÍÖlë¸Ì ç÷Rƒ®7ךޜ§eíü ÷äŠM8ó@c< W+˜û\æ:$†‹c¨KG^Ó‚Õõn¾;ì“io|` 1²'PრÒ 8à")@mM}*}%Š šâ×_û‡?Àáð# }‚A*`‘þžÇÀ k6A© ³O,ËS+b„i¨ ßè¦B6¦  "¡˜l瘛2`€Hቤb þÌAÚÞv¦J±ÀÙ8!6†cŽq\l…xÜÆmD9ʳ dð ŽÈç]HYĨA.rPn)¡ • \àê0…–@WÎ…· UZ§*TÁ*”¤"Ì*î«H0²kÌ­V1g~HýR‡ öbK`vö —‘æõpáâTKÃAŸqpáÌÎÝ©ð*¥QŒkäE×`ûp¬Îb¦š[Ü,n5sóšbÂ/ˆïæo›‡CPþ’¨<ªß…Ì ™÷Ò‚$àô&\Çþ±½F=åt8a·pmÂñD(hwʳÙΦ‚@È-^ ¨A5¡Ö´ÝmL¡k0Á&øáedAìæ†jº3°ƒ•¨¡Ý¼™³-@VdÀ õ°·ÔbRÄ> P.í÷.°'  v‘Œ€6$É0À„Ú!pPü¨Wên£¨z@°Ó5„98J9cô¸‘ë1”“#éb9ð²Qœ”@0 ÙEà jƒPP©™´:¿B¡²AªuÀ² Ó2{èœ[KA,MB¶P ÂJ ^YÄx ^ñ‚   ܱ‹ÈØ ðixžÈ /(Biª–zYþ ÒP—³# áP4Ï8»7¨/ ;W°;Èo(† †#ø;y‰×Žw(.Ü®îÉ0µÈ›È˃w Ã>®Ø`.Ê#÷¹<÷¹¦è¼Vp…7h…ГŽÑs“72 6ëêµïj½Ã N ‘ DÂ)ˆÈìH‚ÄI‚©r¶$H‡:ø·Q† ÅðX…1€ýc¢šC`‚M8/ðµá~à+ˆ¾¬>ìC°Z/¨ª¯”š ¿>‚2?*?ôÃF¸7`!œÙ„/˜¶!¡=H€EŠlp8¢R†80‚¨Çë"x(‰Ê'`?ŠþJ0íè*Øc@‚ŒÀ6‰À…„@”c#]/ c§OüÄaë*:’Vt¶‘‘>™û!%ˆ …!º9Û·ËÁœ-˜„z°‡¡8 „Šu~ØO,5k•¾ –ºÀ¾H–½8%jš…"¼?;»Ëh-,$Žáhå@­a:-oÃaºW JÀ[4T‹Ô:H“ÔÐø‘ÃN05p}DS›<àê–>4<à*Dæ¸¼Ë =Ixʧ„Jå`D¬ôЛŽPܪ¶‘0Lak=Äd=ÿa§êøDO|#…ô¸„ˆ ìš“’0‰Ûƒ¸~›-ò‡,0Z7}t)(¾þ%*>!h!ðšM·,@ð‚e¼‚’‘>•êCgãL€¨üû!ll”‰ãDÎ>*¿ Ëd0¤mû/Ý;(å[~ ‚%pƒç8 pðÎGˆ?eð‡ÛdM'Ȇi8$›Ñ¸ÈPtÏPŒ@ Ì*Á ²8ú®Æ”‡Ç,L9I:ÒH;ÉM‘–pƒp ’<Î}k+@1+ƒA X»:ŠJ€Š°GÀ¤µH–p¸˜¾°•à€Wú‡T°/ˆÂ»³ŒÕ˜;äiJÏPŽzŽãhÂH[´<›ž7hÄãðchDáȬ¤t…ÔrBox1¼­ô™C³ÄC´œßú€þ¼Z D}yŽ·—ãZŸnqqD-(†0 S/ACåÐoп¼—bøOÜ* 3È”ñ*ÃôŸ;=y°ŽŒxO9ê®9ÉÈõp6“9å»Åæ«GtøZŒ/°€‘(: '!àE0 åóEÈ‚, ÍXFÜ”>ê3©¢‚€~8‡bLø„%Il¤Õ˜¨Õã\Î#Ú˹€˜͹¯*ø¯¨SØCr‚†ÛN‡B¨¡›°úʆó”)r‚+h½P½[ƒƒ>}=­ÒÀaÓÓê@×ê`Lv‰p×*pWVL‚J·œñ!“ þÉ¡‰›`Á|ЀFP7€hàœJ`…±X ›¶€ŒXÀ¬¢\?s…æ…ÑÂÊQ¨—ËØ»ç±Ñ=CåHÃ"µ%å@%a2R µ–ÞXÄy©`i.\vYR<45³D¸d}É—B„Û'|ÁKáØË{ñ-ð†`Ó¦õT „©¥„)©ªô†àËG<€éDØ{Sút¹ £Ó;Hv͈áHƒ”À…D9Œ°®{âV“0 *H‚Uå=p¨Å@#@t°E-ú­1€K]"&ºÔÂMŠø‡lU/~¸‚ÛL*+ñè3 ΤVÝÇŠ‘„ã¤Uþ'»ƒÉƽ*ãUS0]‚C¢¨ ™†-¸€:¨ƒ,k¡ ™¨r¨ß}(0жXôLOÓZ¨y‰7ùˆŽ€Þˆ^èíWÁÌS³=NèÚ®õÚê`'y_yHTp×x­\ŽÌÜp¸×E(Ý×'Ë9¶bÁCŠƒµ+ ÍAL¡ÉYQ Y &/Œ=»»K-ÍŸç)Y娻QˆÑú)†5|žE;Ù±»-2üѸBÂÓγ­NÒÙ25rÒn©ËûQ®çxƒm(Ú{ÑËb8S4¥TÐF…ä(†VST8JZª•†4ÅÊ"n==P×Â|À6ªþOú´ÓuJÛ€ÁÀÁy#·Õ§\s9|J”0‰’ái‡YÀ©¿Ò*0„aM&¢T:H\0„MX…cÌEðWXT¸UÐt; i¤…ã)¹‚(Hƒ‘l›s²=¢YÍ·?‘)ËÜ]I,S” P”-P‡: È] Ó¿ûr”4€ªi}1móGôT¡z›h.ê•ÞÀå\Öeé…^†^ÒóÄtÕˆèÚÉ-‰ñßómæóÕHŽL°œø¡|‰’”°AÙ·ÝÍÉ_M¨º"ÌŠ(¸‡ai­\;¾à¥EC6ìºkB6Dž½»Xþ\´E+S`Ê­T%/Òyy¼ë1¼N nÙGl4-¸ᨠT{SWp…#6SÀhðEÛï‚='&[ûT[uíÄ7-†$ê,Þ5Ä|§.VÅ’A¨[ÔÛ¾\tˆƒY(!њ½TJ->7ÆÔ)ˆ‚b”M ’é’îcp¶«ÛK‚òMS/øèSd%ku0AÈ€F0AÛm„Ë å~Å9)£ßÌQ¾€•t]×u,+lȇ|P?×5^ô,åmãE†Ë?™*^ôœ @4èÚZËåþÀåmÒ6í(í]¦ÞŽx®Ñ›ŽèˆD¯UfñEyX(ß>–׳¦×ŽD©b2uØ£ÔUÝA± €A„]XG¸È…T¡X^âéæbÈ5\CÈPŽÄ gZ4'd;­Éˆ¦&ôJEC»qòÝ€ Üà&ãj Ú¨Ùš5Ù0åË$Zr± ~ÊbpZŒöoŒ>€r8€•>i”¦ZJà©%ëÎâ•Fér@…rhé>¾¾Ú /ñ’ñÝDžO±ý1Ÿ~Léâ„6ŠOtÛ»§Ã¼^«»M“¾EZ´‚ »ñ*‡z1Ô|c:¨VJ½TãûšN­Ç/Ï*éþc¼ÙÈU„W~ƒp…)91H !1Ð-îPØ‚-÷äÂåáæ‰cPÛ‡@è#ËQ‡ËÎMv)hsPnìK¸ 0ÞØ]!‹Â„ÿêÇiˆsCºEè-h.\žƒÓvôG‡tÔÖåÕ†Þæªeç=ëÐSTà„•†f¼ùO“èm ù( ɑܣ~-?Õ…P‡%¨AN–¶‘Mb`CØ…S,pÂb8‚éN…]ún^ò‚¤Œ4ºC»E[-¶‹&}>Žš]-Û¸&jŸl9hR Ÿ¼ìo`?‚޶oæËúðr(@w8…Pw §ð©•Ú’æcªþ}é—¦÷ /pª=_¼I€A> G…½Lé/ß哜ž.¶Ýi TÛ;][Q\ÀÉÔ§_K½S<‰UŒ‚Î 7½ÝÛÜ{Æ)hã7ò7Æä·/`T#’)1_¼A‰µN€ÇŸw 4¤àL·{õ1õñ¡zèdÅŽäHî UÏ*ËBìÜ}]<¯ôDVÜMz`„:@†dådEùUý³(HÉ¿Äö¡ HÞ8„˜ƒ9,à‚·ç‚v„¹§{A(€¹‡tG—ô]ÆåPmýÙ†è¢NЃN'ßþÄ’ÈÈÊŽ?®¡²æpƒ6ðd22B9”°‡J þG ipvo8¦Ûw¬S¸õ®TJ° )¼î²# =»h¯Ò&G¬Yµ#M.Üïý(‡áeŽÀ|ɃvÚb8s?wwÚw·aiØã=¦„S8ZÀ~Àþó-‡+x÷ŸÚzŸÜñŸ\Î,ÎDÿ}—×$ (pÖ”.pó}yÄW=bCq­‚â´åÿdÈÉ öaÐç`U2”áPÆ*I`\áçÅ߬5‚ãb“‰)0 ÉfÒä‚“ÙèÐ2ÅD‡Uþ²|1¢Œ =z®$H’„ŠÂz´äéTD¾N4¼Q:EŒÙ qQ¥ºäª‡«‹>Õ«þgÊÔ–°¡¶¨ Û¨Î"òå»cƈF¶¸™æä®“izM5’ðÖF¾:LI™&ÅMa½õîbY“a)aÝ,ÙñÄÓIæ`áÂ¥];AM B€ž ÔðP§nMº€ ¸È¦-{l,èœÂspÊ!O*y ”WéùÓ'ôŸT¨¼¨ž¡¦©VcpW×H€ )ÆÛH¡AÝ{•¸­KÄ‹—k¸Šír´nݱûîÓQÄ4ÿü³ª?¬òQH#š ©Í“šþK&l«üãJ+l£Ók†|k~XƒÅ/¿Tðk'yÂŽr3ÃÌSiÈÿB ,K &ÐvUÏ"ö@²ˆêá°\€[ÜÒ€Èâ†ya¢æš†.ð2vÕa ]îr²BF ŒêQb”C0>30„±°….$˜ÀHƒ€Ò0Œ4 ÅÄ*v±%‡!KTÈ|”蔬:Õi`Uêq•´a hD_ @b„»˜.:¡ˆNtÂB4Úð4Š#á=®ðB€ª†¡5æAzЉäµa­&šc1ÆÖ5;–èCšcA|´ ýðB:ä.®pŠpþƒpK‚' é‰L’K<¸Â%·ô8%Un"Q”Ø”¸Â=Î9M*Ü(ÙD8!úÄn,À\9fåœ!ŠÌM[NérÉ'Òñ uºø¥`'B„†*Dò„‡L§QyB²ˆ‘0þc«¸æ N`C€AyNÕ4œ'*æ­d è&`¼èaCÙ‰“e9-|@ƒE;ža‰g|Ã4hŹ -) HäWVÜN€$X!QVàOZÜ2 (l!õh`7G"„:Á [¸$ ®ºØÅ\ ÈËbœ€ ™Öc`1E¾^à‰#H"|ÂxF;š@dâþ4™0V“Ô2•…1œ¡ P±m'—¤[HîU«Áu’ 0˜NŒø‚ de‹ w¸Š6Ä` 7Fá\lQú胊¡¢ý#@úÇ„”Ö¡IMjUóFO[‘µ©ˆkeÓc1P6<–­,ÀŽÁ ¼‰Cšô¶HÂéˆ;*%7Z¤LI I¶ÉÈRr®b'?é¤((n"=ùaåh±¦5}¬VΜŽ'?ö¦æŒ®¹q*œ8†ºaRv„2¦ Å»<“»qÔÄ•hrc'àÁ ¢°‰(0¡›3Í b¤ _),€¾Í[‰K¦§)MÒLþ]¢<è‰|žá –°Ä/„ñIxCsšðxGÀ@8¨$J RT1 ·0Ä-À€¿¼£PG(b°@LLÁ"1€Fš—4B<¨à2ˆ—ße ‹P"X(³ˆ4ã×x‡„ñ K4á4N^!Rá‘Ô)¿p©Km¡“Y#þF8sºjtU Ñ'_…å,Ðù½ ;eµÊ+ fÔ,Æè:ô|ä"ÆðZ‡pñø  ­0F|–¶F;níAZ ld‹q„Í•csGð¦ÑT¶éìÓÑDR‹%B†q]Š›™—d7Fâ KQ¸Â«!ØVŽÖŸþ$åâÞ¶¸M  e—&Ë×rIªÂwyç(’U®IÍq’r–#º…̃—ófu‰iCA¤»ÕÙÝ·»+Žú‘õiðD4¸…1P# ¬xod.€Œyw£ÞȘïó\’*€ÃþÐÃdåœFøCˆðÿ¢‡ÈƒŒ½´(Þ8Á.¢…h0 ¬ɆY¡î{€Ä#±—)“âÊ8Á.<… s-ƸùJíÂA'˜k^N¨¹)T¼„¤!XÓG)„ÁKœa4No2 ^°RV¿:Ö¯ì¨J5x 3Ø¢*Ø.Qi¶™Ñ|æ ³¹~fåþU2ðð@ŠÈ‚>rR”ÂÁbð…ž¢£¹HÐØSÑ«ö!ÈFÓ–-Ç) ïé2ò‘?*¼«µQBҔב'¸ñ8Ÿ“F¢D©ñÆ7$ÉMÖÃì Z¤ÙÞöÖ»Îõ“H¹Ifw²µNêm<ÁÔ(‡hƒÚèÇú|p3{p^´•sœ6‘½ÃÔöõÅ^ˆB$¬õ[–X¿• @"öX–ün!¿wÃw ¼#âß FÔ»þݰo6N…N?à߆”¥q±€œQe4Á> ƒlƒ$l‰¼Áh‘¹‚4PBéÜEmX%8‚5­‚6MAþ`ÂÄ[ \…”\ؤŒ‘ÔU¨ÃÍ €:¤àGÉ\-Â4p‡YÑ5C.”Â/€Æ€F;xÆ3Uh0ÌhÌÔ!UÖeÝ ™Æ–I Bô.t¡Cô<…ŒWyÕ®¹ÞãxÕ…”Xaý1ì‚àÂäÝÞñßå]H…ÀQ‚˜‰„}ÍâE¥•ÃŽ 'Üȧݬ‰”°Nhž€ƒÚ4Å)DÒkE hÜj]â$ODÁïáÞn©V‘”– EÈÚíN˜äžkÕž64ÊÙ… *…’³õ.*“6$Ÿò)_8ôC8d¸½É@ÇÇ4Iþè`•!„¶Mcíh×È]Y¹Ý²€¹-K-B TÑý4Ð',AÊÕÁ+ØÀ>B ÄC<ì<úýÕŸ|-€ €8´Š+Ä :ŠBh B; $`>aÁ|€: tÂ;¼Ãt«ü?ðÀ:hp EUÂ.Á,tÄ*lS|S|Q HÉÏHìÜYјÀXÔH I4FfÅ'd3pC*HÒ‰Ó5Áhp å/4á>¡hF“!LZ”Hd% 5L×ÉCÄ~aõaUtÔbª"m¥áãTX™›W]4¸ÂC!ß•Âøþ øÙ‰Tˆ… +  `¢dmÎ@"Ž\–Žä74"’Ôˆ"%€”¬*œ eª&NÉ"A$½Þ&À?œ‘àÍï%NðV¬]I쥦–¨R–8I9 æïñšÈ8_mÑŠs$ ..Óîc8¨A8üæo^G?TÇÙÕèÈȲÉÀALãuÓîH…ý@TåOù•Àù‘UùùuBIÕ”¤Ü+@;@<‚yšg<¾B7 Ã8ÀüCdÁÈ‘x=PA0j-¤0€Âf‚rÁ ÌlÃ!<`Ѐ È>LdŹ?¤×t“Dyä?Ì‚"tD\¨CþÙN]EµèY)A(4‚:°Õ|T¸—HD†UÅ%€7ƒ ˆ‚> ,ᨢ0Ø“’%Ä€ÆÂ¬ÐTjÝj°ÁQÁÃd¡Ãå@ Sí|åöÁX.Jå¤%*Î^*¡!EP‚7<À¸@ZC)Xƒ|€ lƒÔHȉðѦe–ƒ¤MÚ¥ÙÈÜääȸ”R™¬@לé‰xƒ™ÔHÜȬ]Ò X –I–l ì…Rjž©Qª•@I•ˆÉ$zª,F‡*±‰ðñŽ1ö&/¨/„Ãg1ö2> råÈ ŠCŠ1Äs:ÄöA„T@”ÿXgwR'wþÏþ'P…ÐV@û‰À:ž'T«µZ«;¾£{Öc6€Á°Š2HÃP#ò%ÁlC`A“%\Œ(‚lÃ6äÁ;¸Ÿ½=.¬À ÜÃ…R+TÂ)àB(BÌÂ*t€!”à'ÈW j…YY•ㄊ¥X ì@c€AŒºÛJ~œÐOœB1¼A'”6ixÆ,äfÄìBÒlÌ©=!)ÀD¥RQ¥Á<ÙÏ"@Ó-a²=A!“¡tá<Ù[qùŽ™9É&$@ÕIg^ÉÖÂ^h­@ö䫸ð5|À;lÃ@àdO+œ7üe¬¬€;Qþ¦ÚHƒÚ|ÀÌé xÆNÝU"LÔ™†ÔE%€mÈ€*ôƒ*¨ÂöeéWv!²W¸–WmÒ“tfLªÜJ®Ü‚è‚®NdƒúœË6¬-Û’ˆN¸B?­ŠèA€¬€€ô#«?\ækÂOÉê¡JæÛ®ÿúo+@`+” ‘¨b6‰OIçÊí ð€${V‘T.âL.Kîç2.*Èí'{²åB²dJ¦å‰¥Â*üñ*¯rëÆÖnþ¦«º*¬æ®¬–q&¨ÉtïB?l÷Q@ñÊþ÷q_#Uü=uâÀCE ´ØÃV|õNðµ€EH«zn¯7g+=.&?øƒl"1Ÿ8ü¦6”C+Ѐ5,Y Â3`À$Øïƒ…šªi°Ãÿ®BXX%dè: p‡€ñ´×LÙ”¸”…ƆB(à”ŠqYLôø&¸¢”@›± &P5Ò-™ e;åBêÃ;< K‚LÏtOÍì Ü´“ ŒP*`BÎÁ!€ ôCî*Ÿ0;±n)—2˜øVm9ò&K²$.!ã„ D$ ¤1‰¬­áº1‰¸ñÛºñy+üƒüƒ?œ‘¼ñâ¢þ.\“®çòÜjž´-!7¨ÿ®­N ®é¡2? '{.?Èm'S5(?rç6v'Còa›Édª¡~î'îkqfK&àv‰tPìYÅj¬Þî1žvü&­g.SG¸©ªò #3Òó06Ë"PoõBÃ'ìØ'à@oÛƒ5G WÐEYð4BZ@77w¶ÆC½Ñ&X?Е7ŒÂ.pñ„×ìÀ¾äèôÊ8´‘$ âLÃpÌå3ì¬Qq¸Ó•FØ”¶+¤$ȃ6ì/ô¸oª/ÿ—6uq•¥o©Ö xqW5|ô#!oNlõìuâfOÿ!îáú›+ü›ð¤õ““õ_еNHfe“r!ÅJ%Þ5âŠñ”ã„ö´u;µ“$ö`Sõ¡ÎùÜêy™¯ò¤J5êv)ãyU«9ë9]#¶¢ƒr—Pñtp×u¤v-ß2jG:òUø•ú#§÷æ0*ñ§ãnwïµLÃLCMUCW|«Sop[sW\‹I……:x>¤s7÷7ǃ/lë4L÷ P\þ\CS A:¤ƒ¤g@ƒ2d>̰Ã7àå6DÖ+€´BQèÿ¾°"<€Tèº}\Á~d+pp€Ã¸)h€¤À­«…»‹ÀÜØ€/øÐYÀ ¸@äDO¼ÀNVxO! 7A&ÕæSùCÌ¾é ¸$¸$‚>ig|Fh`”ÆP“ÍøYhp‚iAd/x/Ô@Ón+u˜ýRµ‘SSÎD˜¡¦jí’·;µ1â¶uâV9 äAÐc¹W.âv¹9{áòü—›uÐóµ;• á~rÓ‡1^cù›Où•»±ÜÒ¹a‡ý×Ï-Ó÷£ü›Ù7½$‡þrc+ºÕ=OæžîØ—r™ß½;å½a;n±¸ö5®*pÆjj“Up’ÕàC“Xa#áOºØn«þ¸¨ó¸d…Š åO,À‚b`þþ@,Ô,d³Y Å»w³®oo¶úÂ{º&?C„ZȈ0²ÇÝ-ì‚Ѐèƒ0Ì@)ä%×\ 0Öп*Ñ…FÁ6qä}ãB~ï7Ãރɨź°#@Á[pÿ[ؘ¨4¤Á€BT;-0âx ³l†ÁÁÃÃhäS‹©]ú]Õp@Hègް_ÏžµSØ‚L ›’(茠v–,µ{6þhœÚÂyéWI5jú¡,ô„B—.çõ‰Y…&Í>U’äÌ™ I‚W~^¹‚jEQ~Eõ¸Jú@σ­œ> ªS¨®°>ðòÀ•V/^þýQ4ì ^ºÒˆêTO[·oõxóÖJ)W§4ð¾ûBc/Þ¨I•¶-:˜ðж^ôøSl÷/S=†‰RZAtÅ•¢–'¥lX°T¨à††ëXYRÁƒ…^‘“ •¯3ÄÎ.Ã"Ú±iߎý"Ë'½eÏ·ƒ×ð’ÅßA\d 7[ CW·…œ)ë¦&õpãÆÔvïß¡_h$AB P¤W¿ž½úxûö]¸0 SToÞ¹Ð÷ÆÛþ)Oôú g‘ÀˆbB¡|ðéDo  OX(¦˜VŒ¡!<ŒÉã7\Yå„(¨›J˜I%}rù&¸Ç²ùD DH!öv $(lH¡‘2ˆ—\H°ä—Z9€…®ÉÃaر¤ xBÀ"„úE˜9J!È1?¨˜#‚B}ü(å—ƒÚ¡ˆ¡†àiH¢&ðlâ KöDˆ£CÊQe‘j ©ÐxÙá¤~ú)¤Zzi]&§Š›dH¢’ B'Ÿ‚ ʲ£k+°§PEµ•VLûÊ/üõ+ÄþYŸ[AXå´P¦“NðšJV±¬XWèþ*–ª^i0‚9¾ˆÖ¯¿Ür…³$# 1¦¢Rf-j+¬0Ì(Ál3Ð8M4ÁkË)ôPæÕ¶j½L(`h͵×xà ·Ü„“­_ÞúÍ-œá=Ná’š‹a ui¤Ž:î˜ø‚:ä» <ì8v#†&yÎá‡ÉQÇöPæ1Ÿ;.X¢„(¤y#wl’zÄ©- ¢8eBðç !¥Feˆý¦>t©ÂRKg¿´ŠØ3ý4‰*@ý©œÊEгÇà .°VØUxǺu…N¸âV~þZ™/  ¶+S»JuXÀ¶Š¯½úÚË*¨àº¶TŽ÷6X”Q«©öÅE­(JP±¬ÍŒG·Ï-QñG[JsÀX!~¶ŠO`@ŒNµæûŠ &¦³ ô#6ýð p‚c›ƒ‡8 «Á c „P„B$°…%dà zxƒ$±¡VƒhøþMJ`MlPÌ*ø J°À9A-Ê!—VÈlU«òÂ(øÁƒM\ •ØÚ¼ö‡Åá&0@¦1E,!XÛ~tEDãè Aˆp†_ä-s8HÂi„KíàGæÐ&Æ}éeŠœ$>0¥„`Ž™pe&ØP'ˆ0OghÇž<)Œh ÃñÀ"v°„D-'Q¼PÃÂÁÁF=¡‘‚‰LæMKí®2  ïb÷;m/(å¢Ä77c˜k…K×»U­@péÝjWhgõ@°+e(‚/zQ «S-So4½r´ŒÐa­+\…qWS”Q¿úùeZ<Íþ`Ž‚™ÊT¦Cñæ7ù—™¢x€n9àX· †y¶ª Tƒ/ ´& üê—lnÃÁ ü†`Á‰mi†J$JˆAÄJ–‚|œ û€Âò±_0†LÅ¡ã†%,;Ð@yÎCÄ"ª'6AÔ±„ìb.2“D+$á$4hc7Z<Á*VáEð I@Ã]éO”Þ@ÕZ1—©àëÐÖì˜ cèã. 8&àG:|b•x= ‰¶åc öˆþ  ÀCX˜CA~!¸L!–Mð$Â%,p„M§%å†ô& )ÍAÏ]+a Öj DqþõtåjDp(P·és"DfN•¹*´äRÒ”‡4/ålò. ä-ïïxÂáa£¨à%ÌɃ[ÉלæÊ&…(hB‹Q¸•+pQ¿<ð/«ŸRŽ¥T¥~΋·Úõ–ü‰‹) m–êÇ–v!æ0â4ŠeRâŠ8£ƒ—ò╘Ç(°-ð*¨I…$_5n)¿Ö—¾Æƒ2õ×ppZÂÕ5§ ¡ØBD0T(Ä#`r<|ä#(ïÃûêW1¶X,¡ЀU?¦ò¤€ÌGE䂤F´Á/(G”†¶ oháò@ƒ žð h±‹G¬øþq… Ê`B08E_™¶ÆÃÿ]5h°¢‘‚1rñ )`‘‚œ …kð€‹ØB>´ÚžÄÀŽP;ˆÀ-Íö– B€0‚ÑF¶Xx4Âa(®M§Ã޽¦JòÖ·.®…ËÌMû ?ÀeâqzÔfÝ^Dm6qß&ÏýÀæMhÍï‚×&ÖŒÝîÊË»jj“êMZ9Nq…|_aBá¿û}ýFaÔ»õ6¡ß=[ ïö¡ûeyXq(dÞ{wIÃ_À°UÚòÏx˜¢˜ÁŒ»è·P«…[¦)G3–Û;x>Jñ$*þÎçu†€„©*èû¦Ô5¶ÀŽgêÒ'àØ¦ÁA˜tIâŸÆb¸ƒy pT(7™Éééz”³îÕ Ä` NX$ ÑmBÆ  긪ɜհ)HdÖ€Öì ° yèDöVŒœ¢ w¦Ÿ»¨˜³üƒ0 ‡6’à ~ËW.®˜ËqáQœ`c8,Ö"‘ }èCÓzÇ*:0….8a¹èÄı„F’G"€…8v¡gØÉ“¾õt -q oBÈk±0lb)”ÐG*Ýä[Lb‰ Õ¥,§ÜåN2åÐF 2 Ù€ü˜húLgºô¥·Æš4‘ÇûåÁ þNDÓ&»s÷xåýnš¨·Þ, 7À¢€ôËpà¢`¶h‹¢@àô‹¿À Òà,à N`‚ÀŒ¡C8ä BŽT^ÌVØ 3¤!+*Ãð‰½Ä(5þgD…2ˆ~œåQEÂ6Êx@ STf _‚(&Ê2Æ‚0^ÌÂÆP‚®2R£``ŒŽ‚*hÇ”î8è¥Bˆ˜F§ÔAl%Sc%á+)¼@^¸‚U>£B,ú§‚'kŽ€¤âiþ£Ã*ƒ“`5r¢S#'jˆ0„‚ ‹†®Æðåð(h¥ôE —6hJq£Û˜£b  ¦p$†^¡âR.åò^a L=l ÜÀ ¡n˜ ÒüèíB¨þð Ôa…Ô¡ÈÚ  j 8Ðà¶á\À$aê¬ OáˆÂLü¡Vƨ háI*Ï$A¦È–Fó¢À"M0í(Jr+8L ³a,á\ ÄÁ$ ÕÔ $ Ä¡A°`'…‹µD!–1çŽÑKJAÊsØŒOú€ KXëú\ þK¦ÍÚ2b’$˜áàPùEù“?_c_^# öE_2ÅñqòöÑRä&~çš® ÝX`X@úÏ'<ÁˆÆÀ$-"(Ò¢a 2"!’ ¬æónA0oAîFápŒáC¦f%wN`zø!¦g'ùí XrJ°X&ƒj.I•Ô'èO0ÅÛr®0dng¬)a èšRT„.?€òç3@,)íEÜ)¥ò_rBK»r‚¨_ÀÛRGêØ®-ë 겺ôøÔOù/÷!Ð üXÁ4a¸0]ƒÛÉ*3(³ ¦Î;Rþ(< Iä¡à ”aèìý`UøBðá䀼ʡÞ0ñ¼A ¢%Œ¡äbDqD+ nÁÒô¡¾Á7C€X± г ðö˜Ó9Ó°/=@àæÀ×Î`µ¢¸ ‚“ç–ÀõMŽ=át櫯5é=3ô¤ ŽS\ hAÁ ùs¥Ò`Ï óðÒà>õÓö5@[£SîQ´à¶AQþ*” rÿjÂR*ÔTQb•hlC£á>4dÇ` FTDrd¯æjnAX!2G1ÐpÁ ‚@¤áúà.Єîß®¹ágOaþv¾h–fË!}‡'xxp¢Ñë'ŠBPÓ £\€â'wÐ^®ri,_, Šî ¯@+eNkE…¢¤ò'zrÄ¢2µò¾¿º’+é6_” KÀü„9”@ ¦dDà*FO¥ p@ W .@ ø´òr¦õPí¨°îAÆ 3 2ƒ©§úV Dbª‚iœÀˆ#™ž€ *d3]àH5äá´`\ÀŠ`øàf hÀ*Ñ µàip•EÞA¸Àöëc+¡ÒV$Ó¾áÐ8ÀTÏ ²Aá`¯ $@³Ú R@”@"á>àÚ¡•¢ÍþNò$"â×ÂJðä}¹¤ŸO2§•´“±¤_ "¬m#>à"ná8KoÏúõ_ûµ[ª?Ž f 4¶v8á3ÔËBß/b¿ þ^÷H˜4í ¸!˜Á@–©ad%­C?”d÷Œ_˜STaF¥!Fx`‡aîaDª‡z,¥ôëgQ8 r4GÙ ThSz‚S”–5v¢å¥+°(z"IÙ¶L¹v5$_Îzz´2Þ–¢û'˜°¢†B(àøjÛ– ÛInkŒÆT(¢Ð5Xª?ûÅÛ–ÀêtàBZ3·!·åà¾á0@\€Cpá§£ÁD˜·þÆ7£9FT¯8#Dj ¦;ïNBú!$ÁRK‡ï´J© ¡«‘p²¯}‹ s¸Ñ•€o æ M¸"À•à5#IìóÀ¹2 ~ÂóKÀ›òÀœ‚/y0¡_7¡)‚…T9TäÁæ6œ¤=ƒƒ*x7SØH–@vƉ{d5X±²¦(í )Ð!o:§qZ§úäm§£€" p£¡!¹áÆwæwáüC!þÕtçõý©;åSlî àK(s3ˆ0ÂüòŒ%¬ØÄŠ+f’ ™d##¬qã:#ÁÙ=3Gp£•LQðµË^<4II”W49Ø^XÉtXid°È"N,RBQð£‡+<Њr~Õ$Så ÒJ+4Ðð…r|ñÎÊxáÍQ8cŒM4ƒ:†&ôiBÍþBURB¤aC†j¢Ñ:÷P´Q§L˜Ñ:iEIëœtRE$ÔH$E¡IO²R1“M= eåP-“N:Š)ö›aO­Õ¦“W8ò'K2Ùµ‚<»B]Q5õToA…­_~±u%¨D‹—]z]P» F˜L?Y€Ø ¼€ —].ÁËØ»„1lÁ¯ž6Zi¤…&D6ÙHqÁùäóZ(÷ŠÓ«QÚh#CnQ-ÇÛpRE«GÇÈ],Urw[Ž›9 <6®G&glÀ!àm3žø”2Ã7äòEƼáÅ(£œpÔ„Ÿ>¥|C:!€‚ ØtáÄ'¶‘þ`X×À‹6GHòÁ/gdbƒtÈ$yøÁ¶‰(žqF-®HDŒÖ±Á樣0"p‘’ÁP|yE ?Þ~«Ç ËEi^ñ€×¸KÊd+˜Œ&Mt½'*%ëd®·z<@ƒøÌn' ÊüódHÞBÍ‚:h¢Âó†} %ÔPï!êiF>jEšD‘hH=R4Qh&4±kA4ÕÄn0mµ$²,¹D¾–†­2íTPL^Ñ8KŽ\qB^^ü?–l+-ÙºVqŠC@ãìå.wŒ¬z—³.äšI» ¯Æì`¼XdæUþE,an˜Æ ö©4tÈÆÑ ´FêP½ÂŽÆôã Λ¢… Þ4GÛ˜Óœðí…r¨ „<p€DGD(Ü",Àá2 ü€ ˆâÖÈÅ;hð€7¸B<8#Æp´J8"È…(ú3 Ã]há4”È@r-BÅD)ØÑ„êgKLÔ¡¼Cpë‰PÔŽºÙ­E™ˆ@Ê$+n”…Bd„KüÂo Äãª"9péA«%¸ÈÀ€àÿÈËWVP˜Å”%` v1 i¼9å°U(±‚×ÁNæéСþWŒâŠ*£A j *x˜BT%b<ƒ „!·¦>Ò…[k)_zBQY¹å…i—»³J¦^‹pÌ"0á%' `S¡hP³)Ôá"€PC®ñ¢^;ÇrÃäxŒ9Q‘œh`„"Á.@£3ºÔ(æPA¨,G B;3ðä¡fÖ(ž¼#Oð†4N ª1Ü‚·HÚ~ñ‡§þ` ` Ã'àevý@ ®ñ pÖÚ¸€¢_üÂD¥`›JQŠ=c¶–8ˆ7²}Ò:VávT6,nhhE“Np¯Ü…czx+p‘Ƹbº•«Ü?Ä"p8 »ðBYØ•ðý…Å(†7š¸¦¿\¡Lt’Ã0€f`àrÈÂ,ø&(¶!àD¢¥_ýª! y¥nJ´3QÑ˧œ'ªçIÏ#§É©P%†äŸþBÂhøóÂȨˆ*‘†>4 Ä8 Nz‚˜°.M KJE~üƒx© ¹‚%¬§Pk¥9ɉq|¹À¾°þ } “i5*$&ñzLf§ ™wEô £ÃÀŒ*°)€&$ÜB#ê €F4B¡ÀšjY«¢!p’Ó”óDä€Çrë ŠPÖ ‚pI äž9` rµÑ‚tטå ÛpÁü`žœýá Ẽ"¼ ¡1ªx·XsÁŸ\äñ†0€e`Ø#¢E!çð ñ­´‚x|=ÛÙþbpkmlQìgd5ÚQo}Û#àî FMx†0ÞÑ _.·cÿpŸÊôeØNâ~€?þMî>kÝ^‡?üñ`þd&KŠÒ ¤Šbì%*®|Xåpžf4cþóíÄþ± êý ^ð>¬¨ ¯RV08…GOx¦*zœŠÞF6Œ©T‰äÂù“I®÷ÏüZ¯$"^ÇŸ$R‘H„Ø%Ì FÍÁ÷=,Õ„ð7FÂ]ì‚£ãÊG}yrí„ ¾ òJqB¿ß°.0üãGÒ÷2?3™]LfrLºn¾‹&Æ]\Ú ½îµq¼|`0„*†)È̤™Â ¦àjL”y êP‡Öù÷Y5 YÕƒ·Ñ ä°<‡ë f0kXcNg] Tâ4I}|`\˜Î\¤¡vc‹”>Ä_ûÌÀgô™1‚ÆnŽÁ ÷¡ã k…Y¬âþ­Î†¦‘qh ‘(¤D1Ž&-C:[;”ÝŽL>µ°…­(0ùüÙÒÙÕy¶à¾ïlŽCÛ(F´¼ý¿ÿ¡ß f:S{¿`„ Ñ®ÐÃuù“…þP†l‡›Pzq³„o¨° ‘S&®;ï5CÀ‡à£pa„b· pÔpŠ"<—=ÁcÉÃ;Γqfš’‚0§OúôO†*!rUa§²QP?'Ñ@ &:<‡s1Ñs ÅGx„W\ya%LöTð„RGd:dÂâʵIkòbÅd†Ñu.VQõ+áÐ%‘±’±þï á#›° ng&0p€‡y¸ `t@ ˜`Ðà° •aC1`CÚ@ p;tBÛ ZpZðE€ À‰Ï dEzP´PDô˜&[–ÐD`Xô20p œ‡ð.` 3p}ddFyF¸° DÃ(‹u šKÃqÀ¼G d6 ôà §`|Âð g7}ÃH‚ M Ï}uÓk¿0%"7)}³}«È9ò}€ð}à÷#™€[gпP’P]ônðv&®Ð fb&¶Ó^ÿ§ w›@ F`_€F£þcÍ2]®ð¸Þà Ê€úpüñÆpXÔÓ;áN„Ò=çaöa¶<æNËÃ<7a8Hr*˜“/Ø)–“:¸“2Hr#—*ëðsLÐ’ûd€¢=•$`sž0PÄЃ!Æå8ü“\C¾ÑtN'–ôãO ´9IW@ÆaˆQch T¦AtekøžÐ$šs ‡ @ƒ9˜p¨_ÔÀ %`±6ˆ¼ `C5ÀY2@gD;€6'•°‰u³"ªd yà kAÚÀ­_T ªUMdvµ¤G‹•æ¯5C°zpDoþà ü{Œrµ§ ‡¤ð{Ó ’à«iŠ”}Ú}›4}«uI™d7×ÙMàI#8€`žçé[#À7B’8ÂP\Åà üXg‚&ÒÕ1ÿnþ7MIn©± ì2p¸y'ÿ7nä&n!`ýØ1gò.ðÖ0pÃÀ|ð‰_€ ø¥ †ÒpÑЃÒpîô’˜4„B“&š(ó‘ðaŽ*ôt-x=<¹Ö“¨r‚‘*†r¢"r2rÝ£(.Ñ¡*•&æO-1P,‘p›ÂCA Ið„QètKWd†–´"›£CQÀ,[7†þ_ø…PX†8ôŽg0Ð?ü° ° «@˜ Ààð, Ùwz:8ÌÀ 
‹É „(’™P ETVð‡0‰ÛƒÀ®ù7ò¨J Å€ôàˆ­à#¢Z– ªžé7™ÐX²˜´xpp›&¢Xïà‹†E ˆÕ¡ × ß`¬GRC5&$ ï°šªH6?’!ÚˆZ¿–6èx½f­ä( ì ŠÀÝh@ðŽîèŽkp®é9~Û± Þ°í'nh„FgÒ Òõõ*nF`V`äÆcÀTAi€A£ ésòu".‘vb'JþŸP'!ÉÊC` Ê U((—b<-Y=, `ë`¤!Ç£LàO!£4*=¢”̳‚±)õdœò`×caþ´*¶aªòq¨‚)—¤ÙÓ=- (,סÜÀ Ž`•Q 9òAX….F…E¶–U(,[Q\iª¦p †q¹¥¿1—òâAĶO@ÜÀÞð?ïæ¼” éénîÆ¼´{ ‘À • á ¨iUT€° •:‰‡° ˜ Ôáhòø ¥ðÅà ÃËšM@7ôh Û¸"¢72#ò@i.àg¢ Û3oð¸ B§_þF ÷A¬¥@çY«° `ÀœÓ` ~@cCZ‹dZ¯:ŽX½¿Ðy‚@ã(ŽqS.¢½€SžèŠ®æjžÑæID0\ïÙ\áfDòJŸiRKe¢ º¯ýzgÑB.‹ N°õà˜@dòÊ °~`'Và°r0MyR'™V±Ã0 |0`pü ƒà¤’ŠE¢î”´&ú)1y¢ùa8h'(€B¢"F !V(Å*» 9Ûóƒ.¡%åó…:á…Á‚¥´¢„üÛ@¥WkQ(¶&Õ¿ñd‡Cä˜|þoËÒàt{nþÐ]sK·!0 Y`_³0 ¸€ A G¸ )â`S5Uáð¨4Ðx4“HiÛPqe¹;Bg på@ª,pÉ{[0b Ï—6<¤7¬k‹#2ª% ¥ ëQ¯,PA ¬4°K¹p €ø{R"ÊÇ[Öá|\€ãx"ÖK\ #²6@I¢ð «è"ðp!¾ç¾à'#Õ6zÞP à‰‘8¯ôʾøùÓDÀýŠnä‚\Rú=Å Rëo ë°Vð^@ϲ#Öð ¢ÀÀ Œ¡øð^À°"N†NZ="«¢ wþà q¢)“ïD¤2Šaö¤“æ`.¼Â÷° ½Ñ8‹=0WÃ?Ió„= 牒²FÄÙ“¤Æ 2 4׆e>PÆ.,IÂ?qQ`>i O¼¥K\…¿ÒáPUfW/€L»Àì÷n{Â~günŠÇŠ€MŠàÕŠð3¸àAp ×p»‚ËDZ6U@™¨;EÐgÝá’W*ãh±yÄÕ ,  ôÀy –7¦™°!°±ºE UÀ”Ö0¥<¿` ~À«­`XC§ )%@½KÈ)¼†à{Ó0 Ê›?²HÔª6s0Žk£ZÑ7Ñþi" JIì`[3#ÝWžÓ ¾âË©´’p^¯ãÍé{DëÛ1ðj'Яä6]u1„¿õ¿Çä Ð ï°°û^Ö€Ö0¡™0ÀèÑ ­aƒ"Þ„(@“À#q5 *3úÐ5ÊÁš æ³#lOü“&íÂÈ5 Ç@4,ÜཱིB‹£”(g;¹a-q´AÜ=?ˆ,&ab…RÓßS>CxQˆa¨.á [ÙÑ í,F]…HÍtL÷ý ALmvk(´2&Ê”~ÒÀK^@ÇÆàÕY Ð ÆÐäy@»¸PÖf (‡ ä,`™b×p¹þÛšÚhezÄU ´Php‡0½WdWXP©9@ó0}ÐhÐò0ÊÖ ×wÊ‚…Fð1¨šp ž ËÅ ²ì»vË3¢HÌë|Ú±°mIÊ&ç!Ò!’¥ l™ìhä¾Ô\Í=RØ©$ç‰G&î;ì¡Ü“¸¾ô)nËŸäæ•síB:@UÅÝMƒ;øPÏó5Þ©ÇìPÍ> Í ï-<‰B çp —ÐÕs*ÍÁ#¬²Þí™âqƲL`³›’ +Œ\ïîîŽXˆµƒº?;÷Ðîý7lO5˜²ÚžÃ"á”Ù(jþ•?(a‡s 6§âA—p ·+W¬åuRW¶NÜÅáñ‹C\’´–?,ÕÞ& Òpo©0 Þ`äIÞ úäÆàä’Àä y ó×x|¨±VUO†;ÖÀåp°È‚€¼¥ž¦µ‡ph0|k>Ï@€£#²)i,ç#}À ZÐx“]ÊŸ˜ :Ÿ^P W(aâËC@Ú&€AŸ@BÌg×ÓÚÚÌãØ!˜D\y0­õ!J“kÊ÷æåŠžßm×Ö–åõ é˸òªÜâ6Ÿ‘¸ŸÝÒ­fqñrñìo0'gd'ð5Þð¥zìð ÃþPŠîqÈ2²HÊã½ÿaq¡¢Á(zî3*– ’ü79*/‘ðø&ì—¨_þÖ\¼‹éJÚ®(cn±bEбkúJ‰"ô'Ä*`è|’2 Áex™á jrYP;,X ›c·aæø™ÓZŸ a\Úa3bÍí5€tïæ{LMž-¶b…«É({@ãA+ç4¤Ë¡!ç‹uéÙi(3bÅÈwîàõ\Ùc“ô0`PÒ£§yv9ø0`°öÃŒ|† «0n;Qr1Æ›u¢Ðd M4¡æ–1¨#š1´  a‚B&˜H0CÔ„‰H4üðÂu2\ÇÃu1a{J\çEMdÂ&`tÆTîѱÅY¼ç 2ÈïÙ%ÈÖ9AÇT–4²I%[þ\’Ek¬±DMN<1Á1DŒf5q$G4‰ÆC.Ç43š3Ù\ÓM6oa“n¸qd×á&b¨X( ôÒ3hЄ õ“¡†ÂÄ!LJxHœ4è¼â„(*%†ÎSøñÆcŒyÃI®uT™XzÃiʉ„q2'œ~¨H=¤+Š8à`,@ˆ¦rd6šøåI¬ .8¸j"§Æ„‹AàDž>(ÐÆ­BdG‹CŠf¼f˜ãƒwh@I ƒ•ì(!š ôE”oã`lHùd)X3Ζ‚i¹ø… ,žy¦g)­®ÖZãê h…$7aþ5Æm b‰8ãXo4ZÁ È£9å’k¥•æäÚ­‘Y:ehøngezæÎ êÚ[¼†^AoTÞ&»/ÞqÁ|¬‚_*è¯v¾ÉE‘QxðB ÚŒÐA #äA& éí3ÓÊ­t»F3ÔѸk¼'ï WœÑFG^ÜQGG–M8Í“™hê´³Ì=™©=@Bè ƒ‚Á‹z¯è!‡Í`QŠ^ˆÃf& ¸Ù…i®qåo¨?¢˜rо˜ ¼ñ†{Nñ¤’ "Ú!Öþžj¥¡ˆàªˆ|e ˆÛtgü„mÂÉj«Ùd"k(ÚakU ÚPE?ú¡ @y Ë ~q?¼ãxƒ+þÑ.M ^¬ˆDòð |éëÀ¦á.ì`J1ÂÖ¶ã ŸyÆ{ø‹ºˆâ– ‚m6¦1ÞlÌ~ 1ˆüå üðržóWxO­Øâ{ä00ÎGFØNÏB`e¸âgš5Èè¸Â ^0Ž+\áWÀ,9L›Y~ØÑŸq`MkàÇ.Ħ)B‰¤Ð‡y EˆDs‹Û…8TÉ•)E{L¹c¬#þ'’Ñ(aT¦ ®G6ÚÑ(7$Ã!ipMã†4 Znp6ÊÒ‹g¥ÏqnKc@¥éHÉ BnŠÐ™Ì´'b°Ž²CÒ X3›¼ï’†…„ó ˜x9áÕ¨E¯"ݤa*a§]ìBóÔÞ)há nxŸ»8ÅŽ@‰#ìÂ6yÕÂñ„$Èã'¸Š ÂU,(NáØm"`¬³,ð|,W@¿5è µæ!ƒBˆÃªÐFÀõ4aÜKøx_òàQŒBC"$E J¨Bäë1&0&þ%ÙÔ3D€ÐAœá2—iBpøŒ3œáª8þl"`Ä$"ñˆk‚SÛq–rDaŠÇуóhG¡Ç=:ûšÑŒùM:@™28‚+€Ý¡upÆ0‡90cls¶á?X¿`°6„R|£8Ñ"åD QÃÈÄÐÚy¦HÓm]“–4 $hK4ºQŒlô¢,qè’5¢ím/Ç¢!–ˆããðĸ{¸òÄ]œ“V¹KÁíC¸ÝÒ–ÐdÝCŠ’gr2ã„:fD¢u§[P4XG `s›ÝLƒA¬ÙÞlï%xAEJVÌ·œH§}™q 0T^éLC4¢°‹òà§àèñ`zŸ®Ëþ'1Ò!Žpô éÕQŒâ¾^)%Xös <Œ-°eÚ`„1nl,g=ĬâÀ¶T+.(EL˜A˜|Á ];‘Kp˜zÝ‹è˜Å1˜`:¨`1ìLUe8ÕËa)™à2Î`‰Î!Ì\¦(n’Vë(>3r4o´GÎÞCÅ |B«V(ã‹|¨^1 3æÐ療6=ûAf7ÃɸWç¼ç3ûF~®Æ>Xã ×h×&$I !rBÈ$5©ä! YrCk[‡f”Û•ˆG,2e'yi"Úšhº¾u,‘TËX'n;Ò‘|½Ü8î¸T²‘þßn„ Q7E‘ÈmŠÒ„LÔ‰®™ô."C§[„»ÖC5« ¨kV3›ïoèË üâw¾%pÔ" ‘G¹˜àoDÞ¹Žx:‚0HB:õ‚t0C=h:ú—X%!œðb¬áá^=Ë)»a"I…‘‡ !jèG‹çðŒz,84ùUrÜâC@Ö‚Â(a2 €)Üô&abJñ|2Eý—Öå°`SÍ<¸Ì†ƒe•\ÎØ¬ú™ã¸ib¸‡ЃQØ?ä,4=‡k÷Éõ<sð!¯c|€q`PN'ìÛÐÿÈÙuj¶hÀËÁÒÙFsþ ‹üè'ØÁ7:á2Aè ¢Få+ïé©nseã|#YÌ×¾úmeŠL䢥‚ {³5ê+ "-U—“Cnâ’ £dë2ÂM’l¹ Ê!—Ù±¦’ŽV¯!_^©Jœìdé‚yêf>h‘Ѹ…™2Oý8I?•w€+ñ.0 Þ徿{­i¼ü»üÕ¤·Cî=zó·õX‚2ÀŒÕ)šÚhUì‘qxfˆ&›¸0 ã^Ø0ŸXš÷ñ°ˆ(¨ $Zƒ ‚g(…ýÑ{m8€C˜˺aÉ„v€¢‡z à¨<À‡RX Qðƒ8„•yƒX…$aþ‚wé©Jø)Æøt*lˆ²@ªvàŒÏ –Aª:à2`º&ªLÛø˜úá%ª(àx¢ýI‚X«¶«3TTà‡3\;J8ø‚?@¹Ã A£´»;'X7ˆ%Àæ1»ê˜#+Ã?c4p>…?²šaùGŒh­É 7QOC¦ 951­S뜹q„.Ṥ^R>ù¤`›µq2ßâ%×B_."ie{‘#A®%i[ä¤q„YSœã[Ö»â 6æ“Ó‰9‘³±>ÑAš>ê 7q0Â!x#Œ40€J0ïþ·nL¿oÜÆF¹7H(~[hX‚ˆàq¸”Ka†À°pX„œpq ‚t`‡È0DZ‘£ƒ¢(‚ú9³‘´â?^ІrØŠg  $)Œ:„¨m@y§Á‡{ù…o°©¡›1ˆ„²ñ6jÕ[/KŒÐŒã|Nl¨v$H¨ÎêÖaµÎwù>è¼…4XVV0š\ÇEÁ„zØú3ÏPhƒPˆôqþà?÷|ϸOû ÷DÀy܉Y©•/º¸¢°†øaŠ83±À³8 cÐÀŒPݨÀ…ƒC‡*É“„¹pÁ{)…­ÙIHL a‚ç¡Ä{a‡Æ‡c ª.ÈÊ8¢üŒ³„ R.`Â*œ!{Š"µ:¨SÒ2sÊ'=+oPMð~8𣹣M±"e¨)ÀÛ íø9D#Ÿ¡C*(Ÿ‰x `»D¼?£ÓA”Cšé£!XÄqàƒo!gŒÈ´<A$Õ1ÌÄÌË[3A“OD5Ý:&GEÆâr®àÔ¥<ùÅ1ÙóE€ËÔ{àMÌY¥+yÍSܜ؃›þ¹‡éb>)¡Ë©ÛhH-h´Ä!écÎez‰ýNHÀH°Ñ…Ò%;p'V¨lØNï{Îè<2vlG(OhÛm%˜Gs‡ÿ˰÷D@ø4(ˆË àM@Y±Ëõ¡‹+PpH±Ú˜&I8…þ 488à¯ðW@Ðk!µ¨yÈ8h ššã‹7hÇ a%…[p‹½IÇ'#š!Å!,ø˜ ‹=vˆ@¦¸Œ*dÙÍh͘¬™±X³ñˆ‚0Ž*ò‚M©"9²¢ëü8K½(£3úxe(a  +8?ãqSWÐþ³™‘©¥á¨‰Ó!¨°š!èS\ðZÊsLТ>ÁÐ.OÒ10Û±QÕ¹<³![HM5C}Û]Ë’^26`»Û1ÍJeÕWd%fÛÔ_ê‘Þ‹5äC%4ö%¸›éÊ’bzMaTFâÃ’iD;^¦6ù.kdÊí\Ó ]h€†Oøh°Ð%VÂøU×°ï[]ÚFHÀ„‰@SP%ÀÝÜõ€%Ð tß-Wá}• ûäXI€ýœÜƒÐyE35; À0q@ƒbøíPŽ‹©°y8)oŠ9° ™òƒ–tÉVð‡a[jÀv<²T¸›ÄX… Ép‚"T:Иƒ<þЇ9¢ÿ%Ò«ËŒ«ûÌ@Θ‚Ù߈Šc9€)ú‡9‚#,¢,²£*z€/@¼!(L>èç?spð‡ð+˜pPLk T¸äIJ@ŽêÀ‡À <ÀL<«ÙÓoøo0¤è³€ÉC0©>Ìu¼ µER›îr¤ÏQU“Ü GU>aœÝ«E[Êb/f%¾íÍé½/޵^âLçóÐi[º)&G%1ù’Y¤½(Àœ¢Ž9Á>K¼jñ²Æ«5í›Øx!]@ä@¶‡Ð…„ÓelPäemäì0v݉Øä%P‚ÈdØhØÿóÖe lÁ^„þ~@¨+`Wüàƒ^(¢ç]<0 (Jþ“r„“K9±"«‘™ƒÉ*à„Cø€qÁ >Ñw„V oð‚UX‡[`faíÁkX ‘ÑPQ;p‚OXÚ!AÀ‚s¡‹‡9ÊÆNY`QR`)g«:ʪòª¦ø*à(AI(†)ÒƒÄJzv-mä09h†Œ6‡¸“SH»ø«M84+˜šØ+=¨³8šŽ ¨홨¹àshD|xÜc˜.Ý‚E-¶%»Í%c>WÍa¾(Nf[[Å19¦æ¶OŒþ„ÑtT.AM©6$^E\MN^ÅÆÏòq¸þ\{ d{ä@]žK]îrlxd Î凉 Þð€@ö€Iþ?ì¿WéWñdW‰ˆWqˆ8ä-‚ÄãKøzì , d9‚¢å­8ƒ‰23+.˜Á^.XNf»¸ v˜}hß7ø‡çá)ŒaíAI°ÉFÄí[è:èßs¶!,¨‹_ÀªÆNÊßPnr>ç¬:"Ð2Šî‹ÒŽ "äp«äp«8ó 8{;Øa>(oçXõ¶L ˜‚+à#Àa¨™ˆŽ/ð;¡x´2šŽ™ Lý`‡Þš9¤þ'éJ¼¼±ÆQä³qï ÉLj³pÄÕœV«-b›%a®<9`t’ޜ㡞ê<ñE›A%RÊ’ÏãœS£i~w>ŸjMˆ‚3‰Åâ̶FKl&YÕ¾kœX;V±ÝO]hÀe…ç7‘ÏNlH]xVGÉÇVѰ,GñÖúz‚DXùrs}žH÷ŠühÞ@€¢×7gý)†H@Žšƒ_Ø^a¢ÍÀ88Á>èƒòÕkª¹ RpCŸøm‘1x—0 Gxƒ5‡Æ R¸Ñ˜¾ ­‚‡‘ª©»º¦HÒ"E©zª©ã²þ¯"–¨ØsëæãÈ#÷HïÖ"T(†](Ãþs¨€~¶«@d軣ÖiX‚¼³~P†<Èç…(|á³,,í¨ŽÈ²Q¸Z>À¬/ $„ Êm ¡D–V›1ÛM<ÑÊý_›R‹F+Æ*qÅá‹.Ö£=] ÜwÆ·[ß’¿e%VÜœ¶iTÎ)w¶=¤µE“=yq4¹Uo»j‡Fìó6"†økÛØ>2FÏxÐ]GyIÝ&ÇÆ¶þUšì©uL€ X:féÄeÈPB!$…/^¤KGEÚ =é÷$a¸ ;n|A%*_ðY¨3€Œ$SæšDþ~°k¦ï-4å¶Í÷#š™3GÀÄ%œòúT™· Ž5,¢~aýåç]oÞÞ¬ZES4l¤HAªéZ.QC†ü‚«l*¦IA‚&}Ï´;ã7̆§`"2Â&B ™Î Ês Æ•®¸j¥§Õç õèY±%TzdÁÇgÆ ¶ÿÈÑs%Í¢%1.¨3cÑ‹+ÞŒ}c÷¬(Ú|ø˜{Nê4\È‘ƒáí°!ßþtú·kݘ[å©™·p‹š¡1Ñ E£Fm̘öc4™0Á„¾¦ûôÿ÷7Lh2 }ûñ§É:ë8rÏ:ÞÃÄ:LÜc‚þƒÞ“¡„>xB†žðà‡©d¸‹ƒ"Š˜Šˆ.¸`-z˜!‡(Fxb‹ë(8á‚ ö§IŽøxŸ#LD2 &‘Üw¤KŽÁM4KF“$}QºwK4WZiå•XFsË-šx¹¥–^zY‰—¬”À +¤Ø±æš¤¤Y +•˜Ùe™eÒ©¦š%¤Í.©qÄ)žÃÌ i”h ½@'´Ð’DI$AÅ õÃQB =ñ0¬ð€vü2Dì°ôu/|Á ßP‰wrÁ•©À!s(²òðà¢Ð¸РÏ(#8ßrÀ @…áÄ/–C¿#Zƒ+^ØÅ)¶Õ%l¼©š¸F)ر¼?ÌâfqÂ4LaŠ&4AŒ èe/ÄLP‚lÈ„ þ³†िø€7(±‚üÃ*4 i`„ê|á ïø‚uXèS›Á ÊP†Àáp/ÀÄ"šºâQ¢(Å fÇ €1»êl¬ñ9à#yÊ r¡ˆQˆE“S*¥ââÆó¤1®j}Ú¨´ñGLèÚ†ôC¡ imFŠ„#‹Hôµ¿®Cêš×ʆ6Â6v‡”ѹ !EâHþÙІ&$Iÿ8m“…#œ{H9Ê(=‰,]"Ü-gJSŽÒK`Ì™°!:W:޶xÚ“JÀŒ#ä¡€ß(… òÐ _VŠTHC:ˆqðãÞð vÑ»xd¼P/vàþÝi>! ”À…"rñ‡f47_àå)XàÞpB ‡ð>„ñ |¼ãÅ@ÅQ^Á³Užg;1‡CpBîåÄ!> gBZ¿†5\° cHÃ܈‚#º…&;´Vm!x8¡R0Å"Dæ£öJ FÚQ}Á:ØeVÚŠUxÁ>UÆMyjÓêTÖ°mÀÊÓ!ÙjvLvhZTvÑÂúZ#%M|œX„%«„|¸¯1¼ÑaúX=H;{”&F2Ú§ŒÔXR{ÇÅ÷¼•jKÒg×Ñ5µYˆE-ÒÕîá¡cÄhErœ4Ø[6þK+ŽþÿHYEJ²@l{$Žœæ#  JOòÏâ:Y8Ô^IµcºRã0G&1ÅÇJ—£-z´ÄŒPŠ®Kš«Bù$ŽHáÌ­,ÜË+x‚ TH`ÝxÁ ÿàA •íÖ 5¨/Ê=M*' èøÃ‚7衞@=´4ÐâoÀe.r!‡xƒ¿òåÂzåQz±Ï±r`Ïu~ ÂÆ/à÷ ká\yƒ+øç$×2¸4àÐ1 `ƒ¢,¾FSAß+1úÊDGš/Êø+VÂȯšÓŸ[§:Ê Á;ª³·Ø†§ ñGŒ  þ@°B3f@ƒ,ZçÌ \q?DÑ38ó’g ö0c %õ>0ì ººgÎSêO{4ƨå¹Ì?ìB´iÃØ LŒ(Bv 4ßì_+|ÀÆÌ à ˆ“?Â!H‚$B|€ œÙØYƒÌÁ ”‚>´B+¼V£ƒ”ǰEÂä!h:Ãà@E¡`ô…_À`½`Ðb48†cÌ࿼J¬ (B¡ÒN™Ä<>á¼A+T€ˆAVU@tÌÀè?€À&ÀÀ`‚LA<‚ІÔŒPþWj¼Pй mƒIøØ ••"ðÀ.ÌaDIžÍ‡!ØÇž‘‘žýÇ|À& ßÀQÞàEȃ(â(:b!AbÚŒÍ H¢0¦'^âÍÍ"ÎQ&:ˆ툒8^èáÍßYg)ÉéEBfÉ–¸bi¡î™&)ÍbèŒRiMâ°ÕêÉb4˜‰æ°ð­…ü1^ÏõÈÏ1N˜ÐÀµì7pÃs‰áõEÁ5J“x£Ôt*‘=¼€ÜÃ(ü.ƒ+P ÔÛ¥„W9x ¡"4Ÿ $@eXÕFqME  zþƒ (ãXV˜ ¼ƒ2¾ƒ7H¤1þÌ‚õq€‡‚¶Vø(Â7„À*€&L JIò_äK½Ä‹c`T»ðŒUFed‚%C'$ ‘¡ÊO aNµixC ÉA3€-Ìè(äÆ˜&dƒ`‚€€2äç\=~ÆÐÑ>äTu¥ Ù >”ÙsÀ…à|ž}­ÓüžÑGÞ= •PÉ-ÖÕ$äñÈ_vš#B¦M¢§É‘ã¥Í!Å©¤ýÑf2Ö)>žÚ”Ú#ERÚHçyÞ„XR„4“H ¬­VѸââP‰•¬UlíZîQ*ÐŒI'ÑV*i`:˜N T Çn*ÑõœÁô&þýˆ‚ì 4^AP%tÛ 4/8§tNgwaBš¤h pÃ)Š'0ÃFˆÃ $*ÀF|:¼[¼¹—{iÁbÀ à/©gx<à a˜YC.ä”qEdЀxM*‚"ÌÂ*œx‰çDBêÃäB„¦œÔÁÜÀ <ŒTaÐ <4Áä F‘ Âd&4Á3øAóÉ”´"áÏíÔÏÍcšÆЀ ,ÑË€ð¨?l‚S‚A PÔ4`ÂøùÃ`(`Áô$ ýÁ¶b@ͨÐ6%Ñ)ÙÌ|(·±eß= ÐàU‚$í}Ô%,‘¤R|þQ€DIâ=¬,‡|¢Ýä)âéU£‰È%ÎQ…” †Dbdæ©#r"Ÿ^ZÚÈé1¦¢2  æ‘ÉéùH‘Hße‰äPCäPÎkæ–­9å´f§Š žBÝf xB*4è8¬êª†(K:ÆÌÊ.Q‚'Ð=Cé&1XÊö9§szã7–@†ŒA J¥hÃ¥P-:˜W'ø*\¤°ÀxCÈ–BÚuB=€<´×èAÈ¢üÁz\°@üíyºB¼fAž˜¤Ò ›1èC€ƒDUT0‚0Œ±`Â*«þ€‡r®û’è¬Ô Œ?”¡I˜Dþ¾æ”ëÔ;È\im`@3ðA2ü8V¼À4¸Á”€üÃ|Ã8€B¸Pí¬ÎŒ]OZGÑm  «P1Œ ^îG]ö^Z}QöÝ~”bŸJ'þ•ØèiŸ.Öf ÛVÖŠ’ŽXÒ¢:bÜÞé¨9^$p^‘Dƒ0R©MÒ¡êÕ×rq’ì&«®êJBeDÀüÀ/àƒ­xB:äBô’=ʃõ¢B+(ƒlÓs|ƒ`'D1ør`K¼vBD”½¦’ê¥B*\Ã, @…®¯ˆ@IÅܾ,,_ØB6‹(YÂ/¸€1xÁÄ£¿eÁPåTvàƒÆd“Ùm\¥Xm$ `€Ó5Ìó,‚Ô$Ã( C)ðÁ„¹ Íó ÌðA…­[iò¼Å7„GõÇzPƒzÍ'5í^~¥i€˜@‚Ü0]±äm‚ã½ÈßmˆÚdˆ$Zš`žÈ Ig®ƒÚ‰DÚŒ#1¦…¤´K¨±#Øt_–%ù“…Q·4#¥þ‘‰ø®±—Ä^ ÍÞ,Îæ,Æ¥[§’xNo1C$ä(ðæüÀqPaD@0˜(!kC4k:Ó¢(Ä"$ï)£íh%¸‚2ØäŠºL ¾Ãöö[. ?X/{Îò*çÂv,O3 Ã?pÃ"C3øD+C1Ëë ÐfšÌRh¦Bˆ ‹4çƒÜÁû X[7Áü2[Û”çî¼~Áya@.t‚2ð :hÇpå’•ÁŽn!`@vdÓ9hwÄÁ#(€ =€®.B $?\Ì ‚5á<ŸC3`U2TÀ à,ôŠUYþsKƒX€µ¥Þp~ÄÔeôaG ¢í‡y,õ^áÈÖø)†¨-Ö¥Õ†dæƒ<Þœâ¤Q±¤ab›ñdzÖ¡‰gE’—ZfΩý*. œxf•QãÜp]•¦k¹Úå€Rk]Î.Ò&®ébm‚Î[1èæ8(‘ææ˜”ì%ˆ‚>Cûu„8ˆC0U‚ì¼ÀBPÁ&ìZÀv¬[3°Ã0Њ14c¤g8võÅ«"HÃ) A:àÛqà¿v.¤cÐB´§ñXÁy½is7`c³¦µy9¢ƒÉ@%d€=ØB”@AXÒ`…^€¤@nþ‰îÅü¸ÄÓo&ìdL,|wB:ö óL¼aÁ8T€0|@h›CVEÌÜ·Ý•MaÔYAƒ P—?z1Ѐ>ˆ] ᜃm0ðJ˜vlÇ0T@wÜW'ÈaÓ~©ÜíÇHŸ{4 É€äGß´Ñ]Í%ßÜœZ¡µˆäYø¦]ø#Î c1¨He*õžŠžjœvV‡ŒÍ§éÈ=œÞ_†&Rg–#ømÄZŽœ8SÃ)K›¦øÂfiENȇI•ÜšÔšWcI$y(’Ú&©Úq.ãºàÜŽF&òˆÃ3=Á¢¼n—{2-¤%jB¬‚2,þ÷6±Cñ Á ÷Ò¤Cµ ö4ž|g½ÑÃ)xC'ìk•ò.¤ƒ6È@° œ‚%úy•˜?ðC4d@SMÓ øÉ(Ì‚"Lú,¬C%ØÃ÷y4DS¤— X…æƒ Ø€ü‹e¸X?ý¶%ü_0°d0@†-|s@źøÛ Á0üÂø.(ƒ"È(Kj…Èž, @ÇBÇÌ¿ùCjl€AN@0pR¶ëDqäÁú;ŠtD ’ ƒViÕÔ+%I”¨‡´‡Ä™}ˆt{¬;‚èÇ]BÍ]ù•_õMh¥"~¸{!þ¥¨uš¤5<ÖlB$zÍ_5È ¨ˆÛ;%þŽÚ€PÖ"VøÞ~„¦uë­¸ŽÉºH 5iŠä¨!BMŽ¢iâ‘ “†2‰dСGMcHÞiL4•c¨‘Œ–2Ú­HÔb¦¼Så­›7UVŠæsgN›1ub«t”U‰¤ÌŽä5îÇ3gšÀË”)ÂkÖD béׇk2Ä…ËðD\µˆ1£B •+i«Nl:±*ÄŸfCØY:ócœ(oŠÑòDÌ 0¢\¹ÂƒÇ.ÌТ¹â­S.|ß¾ýQ㞸'Úh%ñ$-K.+ô*X¥’½%<ìgá?¸Œ)ú§©Ä"m”ÄPB;$H˜ê™ª“Ï@€Aþ`éÙ³_ÏüþmBk&"gžÍÐ÷½|rråڛ˟þŒ¡b«Ìž3Eä !A‚ 0@Áœ øC~6±LèÀŒM¼È¢“Nä°æƒVôðæ ­™áB9ä0‚DüКù¨€„*"cøab ¨Ñ)CRb©¥1F2¤ IÒ„ d‘”hŒ(4*2!„LxÒÇÆÈ‘"‰Ô¨Ê2Á/ï“ÌuÆ<Ì4Ó\g—2O@³ ÔÓK˜óN3ÍL¨H/ÍœÓ † ZH …òh މd£†*¨#ìôÒ£c´¤1’hP² %•޹iG–fŠd'þq$5¦H|І&œ@½©ÕJt: ©ĉä?~éN*ˆ`#«¸êŠˆv„Éã´í‰tÒa†-¤õ¤˜üá6Y%‹½øÇHøÅ<ŠÙ% µÔ…v±$`HB›t´¡g—ŒÑg3a<㇙²ž ‚™tðFtÐa ,xa‘ÙhÛ!(Fù‡ƒYfá{ iCuBù˜¶E>YÂ-îH!(R`#ÚÁî—íüòËðˆh»R¾è=}Úcï‹\:ÁåŸp™% t†±Å«3fÀg>@4 šáÃVØ L²™fœÀÄ‚(VQäQDñã90ˆšþ¸±váJtáƒ>äªÿ°V†ƒX Ò$CLbÕ¤ulÈÇ1L`Ü&¨Yr$’ s)ÃÜSK¡H#‰@ tÊ(7Ï|Î3ç<¦Ì1wyM:ÅÔO?eG(¡Ó[¿GN&ŠÒ à#r¢G‡|t"Œâ<øõ¨q”fr)q˜^JÜ$d Š'¡´ÿ©¦1²ç‰Vlı£„J"‘¤p¥š ¬„]c«®‚1öƒbªÐf^4¦ÂQØÅ.®Ì #×êüñ‡! AÛi‡vÊ¥…Sxâ•P‹_ð‚Jt0THÇ `@ / ¹øCŒx@Œ ì`áxA ^  þüƒ>Á(¢Á°Ùì ;È€î1ŠUÌ'À†=ÜÀ1t¬êhÃbP²FÜ „ ¬ƒgŒãì€Ê͈PF"F~0Ïð¡™<­ƈ¼` efãè¢`ðá<@"€”¡‡+,Ì õpƒ¦!…±aþÈÅ@!Ьè?æøä° =èáÛ Á;>TàEøHbæ^">i‚-‰%I $Æ ‰$«Ü<)ð.JšæB©ÌM)sZÚR¢…/™NN©£Ó=Nð'ÕQóM²‹ì²I¦ÏÉŽwÞž—bw†©˜A”F 2‘Pþ„QCjT1éYÞIÄR—‚žôN’’Lñ¤{0y•N2•T¹Š(_Ldõ“£˜¯ô‚SÜwK|'@ÀÃüè[XBïÐ-Ѐ†$P '¥ ÀƒPB°:âðˆlq`’¢øF)æ ,à’8 ’@Œ4¼€i( _ Ž, `ž8½B`°\ ƒÜHÇxÁ‹,b˜`+|ĦQì‚Á¡Í걄E” lºË=X tLyíX(¶Ð×-4B)À-F0Æì/eÏÀâ‡/(B_@‡ˆÒÆŽ\(ã^ÀEÁܳS|‰‚ìÐN‰êöW”èþ :$&¡H7ÄÀÓ¨&¢àt|ãR«€ †døÖEEÐ*P¡‡ýa,ª€ôáŠ]Ž–4¹ÅHnËÕÒqA.×(tDß•Òè¬9¥-ýr—Ã]•ºD¤Ò} t ¹g*þTßn–s›±‹š²YÎpÞÓLÕ¼ëôT»pÖ.PùˆB¬`‰PÎ!4‘'îÄTà{6$ÇÐBŽ¡‰cŒSÙ#@UR“ê.T''1U÷p„„rOV·0J ìp«\í**Sù°t ,gâ¿(E$QŽx"0ð„’“Z$`”x@'Ða„š‚ ¸íJá‡Ìþ9*èÁŒ£–àÌhêF3Â4pƒu¬ªÁV µÆÀKø*+„ R” G ‡pjSz|B¬¬`F‰Yñ‰l!¯h„¤=ö×:Ö,áÅq|\DØCû cÊéar¿Ñ‰ÎByÉ£%Öö†NXãC8ÖZá =øú“¨àÇ`` 0g‹\äl-0Š7ø¡—$;zûˆ¡Ö8@PÑ àcš\î Þá…]Œ„FAz‰² NGcH’Z™’$-iHOêÓ¥ÌyÏ(ÝcºK&HºhО}A4Ú7¾0 Ä:yF‹Êó[o&k¥5­+\±‚ ‚QXþXpÚº뻕{‡¬áürã(\ vãBm¹27¼KZ‰†˜\¼A$M¼›U/e/Õ)©u€8½„ ˜ø¤ÂÆd~©t4â»Âd˜‡ â ô¤á艚ʤMꋚ2NáÎä6a*ÀÒ¤MÚ$vDîOJpÀ¬P ‚O:,P8B|Î$B"J˜ LΤ¾DŽ Ža!@n Å!ºçèŒÎ z$'ˆ¢è2è&\L qDVh¥ЇRADá/Ë/~%+êG" š 0ü@Šxà Nà ¯ NÛʤ ÀL` L€B DaÈ„ŠHª¤¨þ€Ížà,2À©^€YÞ" *À n! aŽ`bcŠc’ãÀÀ  *!8&¯a¾*¬X0Á œài 8†ôÔaô^QD@RÀÀ¥Ô¼ƒÔ,JÁ ëöÚ£=¨ K` ²þ`øÆ¡ ¯ðÅŠ‘AùÀV€†Í,ÐaôlhˆŠÁá ’ @a¬A@¬Á´€ÎoÒo¾A¤!H¢Gà— áÝ~¤þÒ- ¡•ªg—¾«Jl0 @L#4çåÄ6¡wn #n°N`.šÐDOú¤wRà<ÒšNæ°©5rN6îvþz%.C§v%Q`Ö„#ï‰ËÄB¾x§Ãx ¢‡â_âzZ" ¨'{€¢\¬¡n"ÆÊ')Ðg}Úç/:Mê~ÅǶbšææà¼á\ è ùÁ )¸¤/íØn ¦``MJáÆpÌhAY±ƒqEã ^`¥`€I¡s©2à…†Ãms£.4@†Àê¶q ° AC/ÒA@>ó3O/‹4­Ó¾*` … nO=JAJVÈäè÷¼Àbf¡ ÕFßÀ$«=v¦HÄ•½ ‰maXÁ0%“¸¡ZÁÛ>dþŠ DDiPÁ õ ?–Ë~…‡&td»HâÝþQH'Ý„—ZIR<§Jœ„F$å»Ð Î÷¤QÐi0sÒ š2ò¿‚'æã"âˆç¿8ŽMî‰LPðÀf§A»ÉœHî%ý$JERºK%H¥ÿþÍá®L$zJ¢Äd‚ Õ­ÄÐUJE}ŽÂ)_tVhEé"ÁDÁrl¡ °b£¸"Èž!¤Šì¢ £1̰>É6d³Ö®ÆÀ¦` @@ q OJJ’ –%3 ôr4’àøÁIÀ )LÑúh#Ú  < Â+7æÃð€£a@1ˆþá è Á `ÁþŠô$3 uÒ$`g1:4­ ¦âF›pñð¡Bx†=J¡pírÁâcŒèVál³>4ãò@B ²xÆ ÆÐ=h@jÕ @`é¨:èž…ôàPa> Šh@ Œ,X .ä`†a†k€F‚ mDÞp‰—´«þÖs%¢Ë=©$ Äq(ržžÄK)7ÂH!w¾+w\‡ w›<2œ®ã¢éìiOô¤MÖd½dâøÀu&°Ñ©=e²QBG?s0!â$šòäÇàÃNPe':…{RÔ$6V{šð)þ"ƒ\ô¡h,}‚@Øá -¡Ú!~€ÀêF`+máDá’Õ<Á46A ÍR¼Á”¡²ÀøÁ  A àþ!.۶Ԥš, îÎÑ0‘áµbàMã”^øaàJsA6! ¼QÏ!˜Á„®eîÁpàÑFOÒ$`ô@ó>3h —Ôʨf,!0®ê ÔJ!×ø`fÐA²à\j¤!t]*fÁ\@h€³+uÑ# ² V¿ VÀ œ9E(¾ö Páò¶A àî`à Þ ?†¡@†ØÏþI`IþZb…¤r€dË•!»Ëy@g1ÐmK˜@"ƒ‰ ²d 6aáÖ„ž<ŽvlgœR’A T_Ixr0yGw.äŒHÞIOÚéåGÿª¤xÆõœ,A.%*çpZ®Þ@öèRL´'´ç ‰Î(–ò|l¬}¾Ã¢²P~zìGÅCÈò ì.wËŒˆÁx£€øa6+hr!ø0a¦áJ€šnÈ´àüJ#kÓ!L ³2 Lˆèh@àL ŠŒN=@¤A³F©rÑá*xa *o`5ÔÎVpþµô •p9SQ% q—‹Ì(k¾¡6#×¢æÓ†a!…üÀä¨hùA–V!Þ@ô¡7Œ¡7€q“×HhUvID®Ø ô`€` <N¡‚U”àà„—¨h\Á>†a¹D¡yÏ×GXE|fi$Þm[“™z¸íæÜ+P¶5=ãJ Rþ]©ãS ~)ÀÔ„Rxç&îM–NÆé_ÍDùµN "ND!®Hp$=¬Nl#A‚Qò³Qˆg$(ÖŸ·9øÄ#6e¡\¥ J¡¿§ƒ]¥˜Adgåd—RѧÖÇF_fev…·r+¿Bgþ«–表°Ö†w¼!¨Œ,À ^Ë >AÀæàÞ`¨œØx}¥¸ÄÁ0Ñ3HæãNÀm6ŠÃ82à®Á:Á íVÁØfã‡Ðਠ²`ÖÁ @OÒ÷¬=34õï`ÔHm~AÚC/HŒÆÁ”–k:ðÁÐ.$ŽîŽàÚ¨B!ަú H©Êj¯7hµVi`>üÁ¼€Ô°gû@ ¶¡¶A´‡ë Và&‰ø`ÈMÎFb°$ö1H¦y—Æ“qYH „!Ø7"ФtJ‡Ÿ­¤Qæ3RtL˜^½ þun~ 0Àú+ä…Q‚‡O0Bö"ñùC#L ! ¢˜îO|Px~§QZIÿúy}‹©º“yC *èêƒ ª¡;ØE#a„£Á(dì¡*¡„+!Þá~  ¤"fãÇf¯HqvÈŠ¡¤^ù†”z–v¡¾Ø¡†Á 8¦u Üê$!ˆÌ(¡•¥…Ø<Š3 ^Ƶt²^×ðÆ€8Ï¿±6è¡l ’¡m4aò¬6žà$LwÖá0óѶÀó¸pU®\êàö`Ô놀5Xc/BëÓH Zˆ ¹‚ósy€þ!p¡DþáVSx&¬!|æ±â¨nP­V•áŽÖ´ŠáN¡‰Í¯–?àX·¡Þà ô—¥Fð±HìþtD _»q¨×b0{©7»tÛ}ûJî³QªÄ\ir (¢"2tIˆÛ¼„)L$r?ý­~ÓD#‚Oì}M.O⤀Å9ýÏ zœÅž*ðAEt'áès$|'µwåÌ—qDb—F¶cebGJåE±¡¡q$Uì€(ŽÂ¡(º¢—Šreš š fÏàW6j£¼ð+¶îüиá èuÔð]´HÀH`ÀÁáÑBÁ 2W$ÁÀrŒ‡y`AÒÁÅa¨«þbè X@U¡“¡ÉÁ@˜¡ÌÄA6– |_Œ½y`ŒFF¾øUöÀ*THn“‡FãÖfðaWþaØo®[eŒ¡Ï·nQ3† ¤-h"½õML4É&Í„ôëÚ·a¯Ó´Î´ M¿™¬3Ñ[S”(²“ãžýZ¶pجc'Ÿ-›ÛëâÂM+‡ÍäÞº{Þµ›Ž4[úG°eoþþÞ1ðß{Ë7-|½ú瑘8ZÿÝ‘÷øä)×Ûi&„[$ü§I4É5—`v¼¸Z4ÑØ†Í-Ñ`xK$·ŒÑ!…¡QÑT‚M‰š˜a%!VRÉŠ,V +âØ‘NúüòC?XÒŽ%MdÁkŒA™41N)’°  =0p3Ð*^xAÐ0ÐC%4|S$˜ƒ?Ä N x þÎ)ÅPrDÜDaÁqÁðB8 ¥YC ðòP§z %©tä‰7¸¬Â5˜,âÄ ¨äA ­ð³‹'•¤‘3∣ -唳Ë»ÜC +|[…¦1ÄúÓ[(%…`å‚:R 1Ž-aòÑÌ7”¢U\|SJ.Ì–2ÃvA5[Wuµ+>C43ƒV¹DU'oàâW_AÃLúÀazÐðAÑà‚5ÍT0Î0•YcŒ4šÇœmã6† †”]y«½Ö\mÎqç]zö+[»­›i¥a¼ÚtÍ1ñ Þ†“t²9òwõm¶}ÓYÜ\ÆípÏ 2Ûþgr‚ëì·›„ùmfÿñ&‚Ýmæ]ÒÖ]Ñ''Ç oÂÝSôw¿-¨ ‡£á†vÈ5ˆfˆ!‹Ñ`óbŒ¡Ý#6l›ˆMKvˆ‰$¥üÚã3ÏœAD#¹FcÉ/ú\ƒ†6éxrÅ.<ðó+üð€%1é$ð@.CT`Ίðó±öù-hx‚FFi¤a ›DÁRB{zÀ'/5ìN8>éÉ)Äs :Ü3†˜<êÍ;„¹²Ë©§ƒäh”Nê)GDÁÍ.ÔTBŠª<ŰÄ"0óBÔãF n(Uk'ìßW3|l~±Ìvk,Tø£,>P-k¶ìþÈʘ…rýáÃÂ>’õ-W¼ÁèÄÊõ…,(‚0ÐC»h ‡"B‘© *0 d<‹Ã6öÔøf  N“š†aÌcMËÄ“´Òü¦bĘkjÃC‘d ê˜Õ4á%&g7CÏnäséT 6ù!O$@¦öCfía™Ã$!•É'>ÿ!OŲ“3+(aÙùzœ¦âüg@LjDE²Ð`íDe‹Ä…(„ ÝâDjÛÙ4$¶Ð¼¨D&2QKJŽ#äè ¶h‚%žÑŽ Áo:0,!Š<ý ‡'¢p…VR‚+àA„$pCÀþÖþðJP!¼H“Cú¡'¼&0yAÄ—E3M}‚fŸ‹phƒÄ`†7:‚MLNø+\‘‹Nøã›°€Œˆ± oðI8@+FÁ ì‚b@$Qô-" »àÇ*îL|bé3Ŷ€Žt"[ۆ°K?,«[¹ÐG.²B,þi[騲¶ò‡(ÂvA飂ŽâC€`ñ9¼C8• `&5©"t3¨[ÆQ|(b<¸Ç&†“0ƒ5Õ`³M sÈ„jb†£¡ \“žô((iƹ˜Ïœ³B†QaVC+ÇBÆB‹µ¬d¼‰¢þÉZö2§2(6ëxxޱ’©qjmN~tÃ×;òG°º™Ï€6³òŒÁg?»âyCµ{à²$ˆBÓǰ!’k_{Q×Ôæ¢´92m1’Q%âfO\£í°~€·Nf:(’‘"@[&Bׄ+¯0Ë—ž€Á*y c¸À.XWÆçÌT Œ¯J0@ +° ôWùõ^ÝÐ È0 0€ ÿ *‘«Ýá ~OP í¤A¸ Ñ`:¡*¬—pì`a¢òéõ©n0æàêÚëš®ì@ìÀ½¾âlq¯Ú^¯¥ q ·rìJr,§r`ñú°C€/ ;B|€þ@» ¢$:tC(hKÕ:[VT›!` #5jØ¡1P”SH†0†jW5‡è1‹²D]Ú¥P5†j19U}¹¦CcECÃ1rE[7!´y‰w†‡\ô4"5)4pi3Ld4ñ±tRJY|÷!›U´þ[6„…´i‰("Zc£¶¥7#% #¬£ö 9"z+k¿ÐDà¨ÀÁ€·z©àl‡¸’OÌ@pLÀÅý­o ƒÖ ­p2LÓ”¯ œ‚¼:ÎXœi0>݆LOðù'Ki°[PÝÀg 9î„%‰Kº/°Òp< ³pc =‡“‰‚`bV° ØàÓ` nàÓÐ’ ©®9¾ ÉÓ‹¶à`²®,W‘Ð" ãÀ‘Äâe¯ó#@rÁara ô›°Ôâr0“"@±;±&Jh›at8ñT«A Vê\… ãGzþv3‹„C¤C Œ‰³e¸ µá…OyéÑÎÂWÓ2ƒ•s7fí|´WÓ˜/L†Jéh°AA” 8´Ch¹4¼†=l ¤1§acikÈY Å'}§#­‰š¦˜.ò“VÌ « “éí ¹ö ¿ð A2Fâ¨{8D°$ïÐ z€ G¸œLéÀOзc;Op €"ø’µ}Õ·/€«õœ°LÄyÈÝ&}Òg;¶2€ <  ¬°¬R"`ñ°ûP+á J” © œI`]­LŰ <` ¥¼ ë ¤ öžfûz¾lòyP=0 –­®BþÖŸü¹ËöšÓëûi $ `R-»l ÈœËìšrÈQUÍ3P¿U!?PÃ0· ýË39“‰"±íцGe‚“8´ÐcP…œef6ûT*›¢DäVf÷ÏW†} 2Ó16üÂAœÂq–¦Iz1(ÓUCÒ‚ˆw,ªÜ@ëÑGzef0ºÁú‘´”U R#5çÜ…{(5ýH&í!íÌH"H+jŸ¶i¨å6‹yj-a8`Ì@7r›kí0\€l[#À™œ©·ƒS y ÆÏ&9XÖplL Œ¼ »ðr “Û Ið¸c}œÎ¨Œ’ö }Ûu]þ AM;ð¨À`žm ×PP [‹ðô&Ž%ÀlÜ€ Òà Þp 7¡ á% ©Ðjù èpì7 õ`Ù¦P‘õÛŸWq½§}/éJ e Àò®ÕËŸW1 j,Y±r)&‘#õ>6$À¡·ý,Ð š@ Lp«0 `[¢Cx„¶ §Y?ZvVëÜsC–7_V»¢uÔ€wmEµAÚAlÃCÝgˆM^IÞ9#4L”¦|Dµx%ïü4‘Pëígí!<³}Ýæ3½¤¦Ahý,¶iCZ0¦U"j3˜\“à,rþîwz6§Ó2ÍØ% Å¿ ¨£¤Ó7ýIkJ|ƒ$B6EmÏÖJ OÙôÆTÀ·£À!`Éò®@ éÐ™Ë €«[ðãÕQ™+; qmÕ$”ØK 6àä) Þ³â`ºo\~§P0 Þ ‘@ ¨­óŽ#¢ Ó%uwP³<ç§}çÃ@½Nñ ¾Ù¹ é<ȃ÷ò®½Ì¦½Ë^/ó³]ÌΡ`2ä'©ðÛ¾-„tF2s ø}G§¨aÁô0[åfœDÐÑ­¾ÓÑmÃ]„Ý6,0Ô0GFà þr—¢vý¼J›|Y”ðŒEÌñЭYèÍGPå…`³´uÔꜵv&@„«‘Ä€"lÚG!‰¤õYž§i‰Ä‰Žù“o³zªu {@Ï0¿` ™°€ [>­ÁÐs0âÅ ‚+¸X‰KÄ«L}Û•Ž! !ðN6î  œp¼ãòו¹{B}²ÓÔ÷IÌÑH‚ P ØH!¡‘‡EážP¡#I‰)ñ“¦OÑ?~š¢U*ñ 4H‘®•bg‰Ý7E÷ ØYPOŠ›-ìlÚ7lÎqìzŽ:ŽDPC‡µTôè¸G‹ êsþ˜Pv$t"ꛨ!ì*#懭 røñã¡©+V·Æœu"È*º'V¥:qìžÞM÷ü®»x“Ác41¬‰ “Më4)Ž2ÆÄâ1Q"#ÃD± ņ?μ˜0ÄŸ6-ZiÃŽW'ŽvxLìÓÖäø1éÓªKŽ„8Zp҆ώíy¤Õ m?~ýtjÕԄߺ•œõõìÙc³–­95·Í×­3á7=é[•*EÃn}ö˜à˜±«ÆŽ­Ò-lÛïÇn?øöëo?÷\ › ±ÇžHÞø¥‰Lˆ8ã™_žAˆÖà°ÃˆçƒX(Æ8ð ~®°€ fþ^H‚ ’xQœpÉÀÀQ¤\®`&ƒj r‡`° E$_g^žô€—(¥ŒÒ"=˜2*(² „EbhDƒJHuÂQq^x!6ÓI¢W¤q!—YþYgŒµ ©{¢‘ä—±~°Ádši`qÃQØE”_|ÂÉ’qÌáI(¡†Éd¥€ú!šÒtT¥H%ª(Lu +všáj¨LB~èŠ ¶°¹ÅÅüÖ¯†=!ؿӌ‰(H‹M4Òxs¤32ãl;Ì4SL“eCà ºhM{M¶ÙN› 4Õh£ Ú(CÌ:øÆÏ#ƒeCXá×FcâžÅàîcì¶cl"qï¿=P?“+Ñ@lXY‹;ì°§„#r'˜ ÛdvˆØ9Ä£ a$a–vTpø‰qžÈà‰tˆ™ˆŠ2È  LØdv¡G'=h #7± `H#ƒpx!²†'ŸÜ¡É³éæ; VXá ¿H…$  ^žÐFkªûy<qXPÄ \4Âå„1°!?íI皃+V1À‰Oê©§ÑR¶*ERvv¢´§LDZԒ°HH ÷݇Jª¨›~hÊþ(âQª‚!²jæ›åA•|¼°k•{4Ñ••— ›.À Ϻݘ˜ ØMLà̱É.Û ´M¤ÛM²é0ëÖ‚â@›Œ7úa ×8ç ŽÎ¹T#1q%&7”ŽvæE¿áÌgÙØaäãÀùÀ+· Ïx®…/‚5°a‘H˜¸îE ‡•f5áƒ`ÂvŸ‡9 1ùaY| f· Le0üÄéð@ØËJ`Eã$Mˆ@&~ðŒApá ™Z‡¡ƒžÐƒ2B#(€›ˆ[“ÔÐ0#FZ{AÀ€>ËXÀlCªA”üÆ6·Á`ksk@ڬċp”à%àÚ"è¶þÇ $€ÊP @ð‚/©£¡ˆ”°ƒ'há¨H@¨ðª…Óžè„"Fñ†Yp`L)pàH@"A„l!süáXå'œ |ࣱ“Ô/&u“œL…(IIÊñFU¼O]ŠvI)TŠ'RaE+ßÀ¦ó¾‚#Xï<(Ö-¸G LpÂ*q€ R‚-¬ †!ä™?Þ 03ð’¿àÅ­ÃbƒØò ¬Ã0‚y&a3tàkÆA„T:ˆI–nî'/2t©i˜rfœH¬ë9¶YMGUSì`û2Xr¾30̬¦<øÎB9†²|‘ç…‰6xÅŸþר0@ï!P{tCþG?GuÏPõóN{à ‘ÈÃ3ˆ°‡LœáÂÀ¢Ø¡´cÅ ÅÉE„Q`Æ"œô¤pdàhLC¨ñ5´Dã;ÀR=¶µˆm[sÒ•jÐ#Á` mì•xQH=!0á7Ä`¯/‡6´`?„@W %@…~ì hØFå(ñ¸¬ã¬èœÚ’ ?ô®è8A AÎÕ™b+ˆÔMžqâæ¤w£ ñL¥Ì§…˜É,JS~P:¥ +CÈEv³û‡GÍŠàAØ5ØNÖ çýDz¥Þi¬î­Ü­;Á`€hþ€Áòñ'bòk  3ôg¦5 ´¿ùìV~ŸUçØ“~š(OuTCŒÆ+]¿ÉÌqˆ¯ú4ðõÁLpÄ¥B˜2Ð6Ì©r†ù$Ç#ó2¾&Èš"ìîy„2òÔ°=BíÏ}”S(©úaÉô3 ¹G-{Í !Ž ”™ˆž! a´#xتÐöð ÑÂþ@$"Á·&Ý­’Ôh{øOéÀ+‘žô‚°Áo{&žT7»-›Á&:° dJ|„ä°<#€Àt8ï ô@T Â¿àƒBà…(ã”HÂЀV(þB”ü8¢Ûεe AЇ0Á’¤’œ hÔ0âÜÅv>áñÄ2˰0ó¸ÍŠQxͦXªUXù:²JtàCVÈ‚1øqž(ØåÔà&Ö©‚ó.@QÓÂ4Ü SÐ{¦0Å`Qôž“0@% a€ÿÚÔÏn™«uÄ'ÁþêOZõÒoLƒàyá×a$œO ÜŽÆ;Æ  F) a—¦T8õˆkŒ30æìÁ)só@üt ÄññMÂ:Æ1¢¢ŒƒHÞéÎ[Æ2(ÿT¨,kr“ªT¤¿“-³3®! [D MØò/ÎÀ†5MŠkÀ~ñŽ$þW· ; ÒÍxË[ *‘†J\Á³ÐDÂG%0„ ›8ì¡-°5º Öð~Aâ¿hLà•­T¸ fÐ p°“µ€5Ø‘‹wæ°‚2üáXk(£I8@+¼á cxa×3À‚Z)w“”âBÒ›Å=øC 'ÈÛ Îõ‰J„b sÛØ–•-l1¨Ò‘j)ƾÔPšbŽdR·ø­ú:Ðщí+BûÚÏÂFüb™¿ œœæÍå»gBo|_Àýïß‚).Pïið›•îd Áo¾S ½"0Ä诂(†Á¨Bë¨*{ú)!J ÚŸø¡—ø±™þ¹ä@1sÉ@…‰©ï€1‚—‘b ŽA—Ê ¡ ú©ó˜2¢R2$C–‰Á#»fà•92í‘­˜a{ð¨‡L`ƒ°„«Êª0„8ƒ£)»$H€H€4x‚¹á…@7s„ \˜GÀ3+±’p؄؄ˆ£» ,¾á#*ðpH´ X„(1­' J #àÉ¢ƒlÈ ø1ø}(‚ø+ð/0‚å‘T`-e†w˜Xj '{x/H¨„HvP®fP„c@7¨Spƒ%8¾dƒq8¦]l ±8ê"s0cþ"ÆhÆŸ`&¨H cÒ‰!È>}@‡è„PR„»k½U(–uØË €#….h§rrøEö“rx?÷«ƒw|GøÃ7Zl/À?`0¨0ø¿¹B8þR8ó¸ÌÈ <¡ ë/Œû˜:! ª—æ@©uA vá0&à(ª™‹ ŽÍ@¹Žà¨Èn19ù°xi©šóksaÀ¤©|1™ã¡D:œÌI;H²&û!˜Ñž` ¡ôq8‚R@¢,k.û™ á§3K˜-`*˜ˆ«Ôš~ð¤/äÅÂ^X„°‡rð5 ,9ê³?c!)<ó›þHµÓ8ôC»éOpbØ=Ø„ÉZw+?øBø‚<Èð‡+Ø=À€À=˜‡m°†…<è¦uH¥ó" ÚÓ‡vÒ‚X0ȆO ÅzÀcKFi’®è:[رŠWÁ&QÀ¥H ›˜®§ˆ®Q¹®!h+0¥QÀ…TЇÀ\0Öº†a‰ ò¿wj'ƒYb¶§ÀbëjR®Q‘%"X¾éЦq@‡YÐc‚kiHN\èc؈ ð‚NxÛfm›ø|:jø°?`…{1xJêq|“·ît?F¨ƒðÏ|(W(ȇt5‚°sòMÏù3…úC;h§ø8l¸W{åGª¡1¸/©¯€Ô9™z j`–9Ð}YÐ衊d¡šà˜Púp •–¢¤—Ûþ›3PåàH}Y!!Ë“íõ˜£ÊŽþÖžì!Bª¥ËI–™•±q(¤üÑg(….Ë„¡åpÊÈ2Ó‚rX4 à‡`’µªÚ¬Ð®ï %oË…jìïëµÆVøÊ|¼mÃV`tKxR[»40shæ+pVp…(wŒ¿:Oså^ïíæåfîx„熂€F;ˆGõœ7˜˜N|Äòøî{ÉkŒC©îPèChM †Š1˜¼—”L±sŽq™Ÿf9‰ËÈéð°„ÁúUAßÙúM¢» a“%2—I²€²:þªj:§³Y{X©­žeBa˜/Z#­é5`ƒgp@4XpP#°ð‡6eb'Ö³«££.<3],Å<XË!É#Ã㣠€<À¹BM²BH=(£7€,&À„lX€lÀxÕÀ9’p¼,‰„((c†¸Vø„Ê‚†§’„RxK‚?Ƚtë=÷•j+Õh‚Ö%eOf][e°…=§lÍ]fƒìé2åWÝ®?øƒ_¢Æ\lvø.cЇNÐE %h­f=&XpË)jØÕžKèà[ÐLHLh†2(ƒVØRðtðâ–?þð…}ø^(HWo†nç„xv(ƒàõ|ì?ÌuöÅ?˜áGû?³ŽûÜçýxA†­¸ {¡XŠA©sy ƒ‘ŠïÈŽ…ó뉉ïÍ\PÛ±˜ew•ñh¡²É„Ù#ÃAŽ&ºʧóœ)»aš@€_(…ïY¢‰€%šLø- …'c/‡GPCsêPL2õÒÁÂÒ hê,z€-*ÔÛ†V „4n`¼»½ÛiàÑað‡Và‡$`?¼-çqð††?X…QÀLU‚Xðhx¥þR8" ‚\<›^SØ‚ äAY¦R–®A †=ìV®P¾lÖåûÉf¶A‡sÐ>í‡oX‰\è¥Âÿƒ\¨}ЇϾ“°žò>˜¶0„-º;0€P÷HÀU0ü<¨C¨<ˆ€]¨+(@ø…-øcø† ØìÝ‚-¸ïÝt (€îçöçþÞ/WwEßÐ%{ ×€ËGÿk÷Œb!Œ£_C°1¡ œhø ƒÉŽ*¨ã°°í@2I c)Æ‚)šä`÷À)òl`ñ¤Ûÿ/*–;•° ¬T‰Õ@„¬XÙ)aÇþ4hÌÞ<Ë´fDa~„!ÐÅlF¬ÁsfÎmý´%¹²b=`¼ÇëæÍ:yÕàÕ€g‚6Úó&•—i^\IPÓgР¼ÂQñH#< ×ï‰4x¤©·dÉ–-Œuëf* \ÿ¼I£ÃB’z3ðEsˆÃ®\³F­C Ò471 Ù£UêG„2îÄœgÈÎ4S¦Ü|"AÂÒÐ$~4ù!æèÐD‚±ÞcË–[«[³LLm1§M¿>[ÌtŠŒ¹VJT.}ìØåB‡N_.|ßš7G—Åß¿Q'4ÝcðÖ‰üX‘2Ž&H]À)ˆæÓ*#þA›È%ê¬.CðèÈã\€4±Ä$£”’ ,ù\àÆwذ„H(a<0á…ÄSá„ûø’#wÔQÇi¹áF=8²¢`s Œ0Ž Œ4Þ2ÆÔèh3ÔÜ8#w7ÞM48ÎHd4ÔàÉ26IM%šD#e‘H9†&šI$Ž?ZÙ¥‘c0Éd˜?rפ]Öx 4ª‰æ•Äh£ECÐ-ØØxËwDÐ0âi¡¤+Ø`³$ŒÙs„gD C&–ÌáÇ3D¬±Hd’I¡>“ ýxõÄ TÀ°* ÄdŽM>á$«QA eëQCíPÕ&XþÐë ;@¥ÓO‹$0Á#XaE0d /jha ãÅ Ž"@±O<Öá†8žpC %+”ÛTTPñBåèÃÁÅÌÄ:·°É'ˆ0&3yX²ÇP¶Š™™òI6˜X2Úh¡…ÖÛDqkׯšÁák¶üÚkD¼Æ°g„ä2>¿ Â,ú3Ë,¸àrÍÆä¢¸Ë(:¿1JÑÍ:ÿÌrÏBšÌ²JzØ„G%NØ‚&LS! üc)„ðÍÐ|òÇx”bJî2B¬2D)%äsÇn\äH<r˜¡†ò-¸Þûä“"þ^ ,õ|²")Ø€cw`èxyŽ>î¹e—HvM$JRS¤‘YJ)æ-£ã:ŒLIæŒini%èXÒx:’\i$›´GÃÌžDöN¹Ðs¾È'Š/gŒ•Í|%ÌT(ŸšB‹Þ«¯8×cÑDü2G)íXôÑ¡²D&?SŒ6j@«†© ú«ÂBû“¬üóOxáà$WM`p d@X>)JPvµ«(à pV D J BÚ 1XB¨@ T¬ …” Ä®ƒ ¢¸7ŠÁ³héaÅ-"á½q±!0)>QH¬þŸ‡%Rš&ØÂa§‘ÍÅ:æ±€eŒ‹ÁØj1‰ø;Æñ‡g4fo˜™1Œñ†käÁeúЇÌxŠT¼!Y ‘þщN8¢•¸‡2ÖAC„À¤p)&‚‚}¢ 8AfºÐHH ¹è„=¶0 1Dà“è‚@r„:ŒaìØÅ±XlÁz aß$¸¾0— „‚y8Å1¤°) °E)JG0Ò‘ó’Ô;Þ­NH7ÒÒ’Ž4}Ìá@xq€ãœÁ§°é¬zì@h ¹¥F‡‘[šã"óÉ¿R2˜¬œDEËZÎq8Á›@¹ õ@$ ØÀ{ƒBß5 €ý+÷cF<‘€7ì‚.ÈÅ*á0ૌa…#®¡ˆRðúfÿ0 Æ`L ‹b´ÍkÐÅÁlÓ{ÈÄ¥#à×ìbžæ˜Å`C5êã$€™$îè‡<”Â’(Å/¾Q |è#£Øãƒ` Î+ÿ ëÅØ! GDcìø 2‹!ü¡˜ÀFþŒ`Ûi˜ ‚)HHaq€€H4t` uø8Òâ„€%ÃÜÁ¨×*ü@&Hƒ 0B=ÂØ@<žßñxœ†l·TH„è €H ×hÆ4TƒÔÐU} Šˆ}ǚȓ~5XÌyI•tœ8YÜ-hBÇe TS}¡(„CD„=D‚>œÁÓE€¥¸À tH€ÄŒÃxFp€€è‘ ¦žÅÔÆÆTš`…Š;`Zí±Þ`eŒê‘Q`}Œn˜Ñˆ!t‚øtÄ‘0üsœÑ/äÏAqØ ¯È)‚(ˆB¬C*Û8¼Á-ŒÂØÂ/€+xÁ0ð|&€À$¹Á4@X›)L²L2\€ à Ē@ÀLB>˜=ò@ƒ0Á÷ CÔ |„ ˆ6ŒC°C#äƒ,Ä\ȶ„Wxm À•ä/Ž/ÜZ œL,¨ˆ„Ø JÜæÈ3‰œŒxÎÆ•xþÈ…ÉéŒIÉÍ“ðüìd艠óÄÎ9„=<ÄCD¥=D¥\¥BÜŸ<ô`aA$ŠA‘Us=Ê74¬´Ã|@E¼Ø¦¼e&Ã5hƒÍaØ}¬ˆƒ6¤3¨ÊªÌLLÐ èâPAAE”!""æDQ ‹(T¦ÞE¢\¦(ÁYØg†Ã6 ƒ˜¼ÁvÐyà€1=øËL œ€ÀŸã@B§#•¦½æìÉ^/¾^pVkdšL.ª^§éÞ7t”çéÃ؇"ˆc*èÐcüÁ:Áœtúš1¤.üÁ/ˆÂ5þ¤:‘DÂ:üAhøA%¬Ãì%€ÜÃ0üÀ:LÃ'l‚À€)HÁ'LØX’Œ( #˜Â@À'ÌøC*xÀ>àÀc=4Ô°Û4Â4 ACÀ”€&Lƒà@H.YˆHšdÀí0íÃ+øBŽH#”ˆK."˜Uˆue PáœÏ‘˜Î2“I6qÓ‘ i“˜Ü< Ÿ\)‘(%šÐSSêÜT",x@5À™z€¾TeTfe‡ ÐÉIÐeáAÄdv-A%HBEèÀŒiD‹HXÔGì0A¬Ü%×qØM…8$*¿Ð1À@ÄÐþ ðC M*æ 0Y¦AP”)Á!º§Þ ®Ô€(Á#†ªV¦ªªCì»äÅÜéXŽIÂ7˜À'$j¡,Ä#-\÷L”-Àʘ˜Â@&`‚€Œl„QÀäbëõ¢ìù¦ëц_QZÅôl܆m¨^l,;  ! ‡(„À(A*‡>|:\ƒ DÖÉ|ã7Ì˺"Gý.8Â,|ß/\C{jŒ 8O3dÚ.Ô|Ã<À‰€€À¶MC<Â'Ô2@ JA„š‚ÁMB>ØÀ0›Ü4.ü ˜€ÚŒ€8ÜA” >Ž=)0þH挚d¿•änˆŒàŠ@>ìè»é L6„ˆµ ‘ÆH“pG79‰9ÑH8‘Ž–Hɘp‡PšœO:ÕIQ¶ ‘ÔSC@Ds…©Úz,Ä"°íÛBVö=ÑÓ‹ BA•@£À4DÂcXŠ>ˆBDŸn ú € DÂÊ¡¬‚]'òe_21pCìÂð?pÀ xn¥‚À¤‚“ÝÅ^‹–Õ]dö„¼]P1"O ©š*/¬ƒ=„é,ÂYÁÈ\ABCA'ˆB3üAÌf=œH]áÀ4°dLkþ\ÀLÚìõfo§ùÌ0RLÅÔ^aé†o :Çr (|Ã*\CÔZôq€$€VËràÂ傜§7Š‚¾¦B.°ÃЉç8ØÂ3ìB4„@0DÀ/:”A¼AŠüA0tBf`‚?„€”ÈþaÂ?:ÜÀÌÍ (Àà(¶u@2˜€?T‚ƒPÃ7X‚H@5Läø‚-èĸÁDèÍáìƒßXˆ†tà†t`yù·ð ŽàÜÔÁ„‚Kª2ñóôÜ;M)›0˜ïXí’Ü•”Žp“&aì ¡¼ŽŒ(!ÐS ؃¾°m ¬­Ú.ÁÚ2†þˆÃÐT¡}y¥ÐaB-T0hJ»­¦8úèâ~|-äå×Y'î%_¦C$\îíçòÃ?x+È„Lj ÅÐðªË ï¡¶NTÌJO Å­ÜJë²€5|A-Â"`‚XA$ `€2è%$©hC1¼@B=˜B(œ…=”Àä Úälç5ÌK¡†8A²MC–_UÚ¥¹obZ/çìAk´¶³ŠQÇDZê½byÆgx:ô¯ÿšÚ prÔkràÂôñ.¤‚"¤Ñ¿¦>@Õ9B*(×\C%ŒDE$àB0àÁ; È*ˆþ%@ÂÔÃ?X,p€!\zu@oåƒ/dC,Ü€/Â,ƒ3˜B Ø@pLBéD¼­!2e·­"—)"¤éñÌûIÞúÉ¢ðmsAC%èƒ%A6ÁZ Z”¬âêÀøA9¤ƒ)ëe8ÈìB* ; 0à Á@ƒ& y,‚)X@ÄDÁ‚0ð2ÜÁN@ 3B@@6äÃ>Ã,#B>LA,`‚… Í*,0Â=|Ã3ð€-¨’øC€XB-9œTàñwiàþ¡ä[OH>¤Àá$N‰ô€paLÆ$ÉœléšhIÆ… —„ÎÇUB$lö—œ\îœÜÇ J%ˆD(òSµmÛ¾:"Súwx%>ñuA|C,ì€'ø-lJ&¬ØüøékWT§Œƒ>\7¯8<Áh=x‚'(ÐæJê,{2x³yܲ¤.7›­‹©€âÄJùXÅ<Á{¯Ë«ØDJáDhZøLN, è€;ðV` ðAÐ@9°@ÌÀ7(B°BB|‚œˆ1Åç5<ðrH#l‚ Ð&9Ä’D†‡lLëëE†ìEÆùŒ…GþÚÆÀ¼É놲ŠÁ¥•Ñ0°Ãh”‘ò=ÃpÀ1¤‚0‡}$‡eî8„@ºƒ>HBÓG)\ƒrÑ\C'€†-¬g.dpÁ:|C¨ÌAüA¨¸$”ÀàxBGŽC”Â\+ ƒ2˜#Ô!L€à(ÇNA>ÄCš÷Â\ˆ@À ˆäƒ<äð'T/>4œ§ŒƒàÀ¿ëÀ.€Á=@‚ \ˆ/°µ¿}—¿œ„àMßñ¸d5 ÂU>ÜMBOQÞWé–ÌÈa÷Ž›ˆ á}ÁIóT+DvÚ²!³-óGľx˜>¥Îcÿ 3±Â*2+HÂ/þÀIƒ0ä¸úŒjs ¿7ðC«$Þ£fû-7³·Ôò¤ÆP°Y¤C/óÅãþDT@x¨Á«F¼²Øf†žzPQ ‡ð ÂpJ¼€Œ„–ˆó+W6Éá炜œü ñg•0S d›fÊM h%¢]û•)Â1æB€ÀæäB ùZ&‚[¶ˆ+z5X°=_¿frÁÝÔ2cÁbÝÓÕØ=™¾zýj«+][Ä7lœÌ¼$†ýÑw/ÒafÍÒ§ÏX'EúJ¡[•*È5IׂÁõær?ìÆ±“¤¨ï_׌ýèúl—1­{þ$UJEˆ¥#\GUÂ:kül™†Îݳzuœ„øƒIDLÀì ÄèÆ„ âMƒ0%_7zMhÁ#[]…OTº@L¬ÁSâ΀*Ô¹ÃÊߨ-€"(,ÐÀì.†§î¨£‘-&ìÀ†l°©ÄÃ;¼%š[HŒfŒ1n‰äM"9QDQ\Å£©äÅ[*y¼%ÆqdÅh ñD–€%I"™„fH =ôGoÙ‘D)+é°Vì€f hèÑç‡ß€h§}æh"@Ø\c„ߨÄã8¼)ÆTxà‡Ÿ¼påPFPþ=]J®H $`@ƒŠ' Õæ‰p(EÈR„à¥ÈÒƒj8¨*à#¬À`9G vx" y®¸âƒ–@¸iŠ)6á2¬˜"+¬ƒ¡ä €ˆøg“1 1€Hê©¶žEJâ—5×pG +ŽÉæiÎ,wÖú«¢ºZÖ­~¥j,©ÐÝ£Þ`hË­=¬ê _óã*ÌéK 1~ÈëÍò€ŒY(ëd1}ÞÐ'R‰$•T®¡ì \0«ÌRJÉÃ|ú²D\Æ¡‹c®aç«&RÙ…ÊøE¶a2A@{FÙC"håtøÅ7Ñ!þ‚tÙ‚ƒ ¼Š->º Ál&ÈfAF–q³éeŠ»1„O €Â Eþx#ŸI†ÀRl e@Ö`S˜‚ÆË‡pG<ž@‡"¡jDX,,ÁŽ 5Ì’C¯Ü1ÆÇ1lB/Gg]Ä)U4QÄh€ä±H ÁÁÈ&q·ÇÞ*±#J¥ì±G Ya{`qòˆ9Úb„~ù`.àYƒM¾GXÃz¾-y§BÁÀOñÿ,t®€!‰$¨Ð†m´éGœpä§45vPCK-Í” Kae©<Áæàƒ8`>8 #/à…@ÂÑŠ9Ì@Ö˜þ”± LdcÙÀÄ ¬Á¼T¸*Pq€$ÐâgÆñ/œ€ `)HH¥-SœPè):8W\‚A°è«(öÚƒY ØÄµÀe-_©—‚q—|]Å*W9˜-Æ/æ¿°Ä8s3éCÄb‚ŠS¤BŠ LfÞà±<\5¥Fô®!Kü@Æ`‡‰à‚Qä"eÈD¢!Š2à¡ Ž¸Å7"ÀaT¢7ËÄ;ìQ 1‚ âhD4ö60‚ƒ)‘.¬qXFö1:8#ºÀ–Q‡ñ|bæx ±%äc{+ƒ=þêð6Cw¨:pñŸ (q‰ëvƃÆ1Nù˜… ‰cC$ÂÆèv´#½®Fcx'ìJ×#Õ™ÎJcˆÄ;K‡"jÉrCÒ“t ;@bCQò]ˆ„·:+e)K¤ ÒÄKDð8ƒ0ô!ŒvD`{|ÓžõÖg|…”pé å WèaˆºÂú¨ð‚'ˆ#° Ú Ôx±?ýõCªÐŸ& ¤î`G¥*R=ÐÈ!üHƒ¾àwðá –zADA‚¬õ|°²!… 8aTH }Љ'd`¯ý DŽQx!!XÅ Öþ1£ÐyèoìÄ,ŽIä²@ š¤Tp 1àËT¬×"ZЂ6´T)ƒùåÕ~¥‰^¹Wj½¸Y0²e±% †0BÌ"Œ™…1f±? #3×ÀEeð˜‹Nt"K.ò‡RÌ¡¹GDt%‘‹_§Ñ‡àò ::@*ˆ†1l"Ä µD1J`Ÿ5àCwßÄòк‘PNÒK)€Àù€ „0)θA.!x ŒèÀ`Á8;Ì¢ŰÁ0 œ|‚[žÄ$v1‹J.–wXP7 ôMÓA‘ëÁ$ªQ qÈFýÐê„7þº ¯FVò”£áM ¢œƒ’¯ä¡h°ÂC„ÇQá;ס¼ƒHï‘8F$¶Ü!(ÛaHШD'ž‘ 6Â(õ3ذæì] XЂ¢%Åh*PAxžT8¨šT„þ\Uhä~ Oh£‰ž‡<8‘Tp‚ò`õàPŒ£%o@ÅÊ‹p¼€„‹0À0 j$¡/(A%¸Q˜ktâúÀ‡ €Œ;l!õØ‚¨`I{ÀJˆÚ %Ô @7r$af!+îaRaN` @ |Apâ-ª,Š‚*@KÚæe,>k-®ÂÚÐÅ*ˆâ+¬âÛö@‰Øâ¶¬‚`̆@ƒΤ¾¡®1$ÁüàÞK N¾¡raó 2®á È› 5nÞÁƯ~Á0#š`À®a&)$!Æþt âˆ$¡<ÄøÆ~‚îËv€F)Ä!-!l þ€ì!–œà,€@òa :à:à— ; À€Á:À`a~¡þf®æ¸A¶@H ò!=N ÇC A `ÑÌÀ @€Dîàfá ` Æ ëtÀêÃz,á €B@*Q@î*†È díÆ#Ô®m  È`aÁ2dñv1ð<Äw¢„s\$vò©G‚Gx°¤Fj„¢HdFï?Y’ÄŠ¡¸  œg¢kˆ@5ÏÑCÙDžA €ª dàQ AR(ªªJ©¤ö€%Vb0`´àr "8…E¬ UþÀ ŒàÞ¼ÒáQ&媞€"µ`¨4}áï† XÁl 9$þ Ü`Z¡ 0 ^`Š„&@4 MoRÔ¡ÿv@<¡2fÖ!8àH -Ì‚å]B g´gª’´ÀB,ó‹ìE+÷¥-ú¥-è‚_ÊÀˆÒmÛòb&Cc†€dJAHrÁêm1:&3Ž¡·ð¡‚ ’0ºÞÁdò`:á Rõßâ²:Áþ`f ô~!ŽÀDAó,áHNtŽà ¸å ˜áÖ,A‚Àn2Á¶€I‰¶1"¡Žà>ÆAòᆀ.œ€À`AöÁ:Àé`†®èQ<¨³þ:– pA®Aê HJlö‚àÄÖÁ"PÇÅØöAÆ*«Al m ¤È!ªAT Cª¤?­,xôÈŽ tBÇDÏttDt†ìw"Š¢Œy¾,~@{à¡„á\@ˆàz°gFo öà¡ò{´ …ÊÐ@´AúaÐ(el-äÀøE&f€tTø‚TøîLQød†Ò‡X€:"(n“àõ(EXà´ 1óäò FaÖaD0ál Ú´0J €`¾€’&aAlrMßTrBÁH¤JP—¢áˆÁ#oa„Èþd¡@Ûh³2]0Ëvñ ‰ÐB+ÜA_ȵæå´Ö¢ÜìBµl¡*máúB­ôæ/Æ¡`D•r¡ce³Ka¾Œ­¹ðÈV}õcrÁ0¿Áh@ ÑAq­á€Òäà¾àfÀ¤¡¾aîôaYˆ€/‡!NŠÁÆM" ¢Áؤ Jü æ”У~A Øä|3!ÒÃÄ@R .`a<±—Æ#9â`œs&€œÎçf !XÁÈpÅС¡bqA @b©Ä9» >‘¸qD@È¡6?/çrô{þ¬ïè‰GbçJtJꎢv¤Çx„ñ„ÄK0ª>²ç 6ôܸͤ¥àÁj³vJ·¡Zaô RèX€dàkÑ€ª€ä!^ öÈÒø€Œ¯ (yVPáh€V œô¨ J ’éf@nU ’n©À§¤ê ¨@b[v—BãL‚ ¶ tY@ Ä¡àáÁ{®€Á@·&•YB¡ š¹ÿè!tgHbAŠŽqàåWB‹OË,6ŠÌâÚ°(þ/œò)GëÛ¸Bm±h¶ìe`†an«`†A]`ÐÆ¡ÝÔ’Dá.߀3þôÁ„†(3Š¡Z¡VMæc€«‡€ø QUqÿà ÁXäà10€Dá*@¼áp¡€ „Áïc „¾á>Á°‘[òÀ®!!ŠÁŽ`MØà &¬§6m€„!4 *À„ 9ã€ÄQ˜q¦€\0Áœ@îà: ÃÀ Vá ‚` î ½V3.¡„ŒÁ¼ç˜ø7Cö@¶ÙAD@&ᰫኯl?ñ˜Ë€§DvÖ?ôg¶Œ§‘“ rìÁÔš  ž!ÞAÎÀyDO{’¦¾6þ X@Hµ ÜvÜ–±ö†…R¨®À®“¿ÀXeÑ̶PAÀ à@`à!'mÒ¡~áˆà,A ¢Gå!p'¢Òè”ðaYpZ>"à²IØTÔÁèaBï¼ÙÁüaJÀb ô»™÷» ü;îoJ`‡†d ²Ùq¤´25wI‹^ÈYQ·2ÜÈm³ÖÛªÛ5‹RË)!•_Z˜÷ŸUƒÝ^»£W&BÃTÍh­ØAЏ¸*ƒ3ÓdŒÁC”•tœ/öÊh€ß÷ôÁ0à ¾ÀÈñÁr‚¼pa~¡NA–þ¥Ša€:¨}’W3* Ï "!ëá‚ía€Ùõ&áܤD` øÐ#¾!vÁ—š[˜A :€ŠŽ–è¨sœ!…¶˜\¬©G¡*!a× AìF áÄ<#Èå&áÅH6° Äd£¸«AîÄa?%OòòNJ{‹4GžJ€ÕµD³…!ø¦ ¢Ë~AÍPÊMj¡èRzo}þ˜÷˜J¥}n)rXAÓ ¡§Òa~`´ÀaÄ}&&`Ò`Òx!´@¸@šà ~’·ªÀ8Eª2à8ÃþÌH+jŽ A ^ÚÀ˜a"§Kâ…8€7<üÛ™9¿c  ú/”ŠgZ&ATqœ dP·Í´²­(UœM.ÀÍÃ@‰.5‹î¢ÜÈ_˜¨QÏâÃÅ`dІ`/p¼Ÿe"a~€zû9ÿ@‚ÀRáZ7£2òd¼A ÷­¾á:|ƒøBþAr”¡£1@ŒŒiì‹oò ܼ$z:ÚDJ@Öäv *¡ä,AæR¡ Ö ¿D`î£$ ÌþÃm8Àĺ@8&àþ^@œ ˆn<1;•njüÓïä" ;¥ ~ÀÅ áz‰ó‰Eq§K#¤ó3CŠgf™¬wH"ûJ”Õ§‘KÇINaæ`šç“òÀ´Ù`ô°¶GD[a“ÀQíQZïø„ôÙòî ,œ Z–@ª0%©ž€â5RNœtq¦à?OÂi;4(@,X”ë'#–“ìðr‰‡]ƘÙ+!ÎS±<®ÁR' f(˜¼È™QáG°`Ê [­D {ÐjÀjÓ&F›PLc¼°À )L°ê¤€bCD¾@”)ƒ§'ž¯c¿–Ù³§§Y³hþØÚã Z´ÁlÙr+Æn]»oݺµÌ[´îÒötç@ 1̱6dÜÉ¢Æ#¹Ù·Ê–›C—«>}Aütšu$Ï/E»NÚu䚟<»"E³íÈØ7|GŒ¡ûæâ1k¹Þ(š/Ï :)bNã>kyZÉ¡ÞÉšµéÂü\ÛÕéY& Ï<9²hÍ™tG"dI\$1ïKŰ7$Sa'ÇB ŽKø·F1)Lò Ál@#þ ˆ ¨³ t%S@ÑÎ8Ñ&8sAWuL@M‰àÀ1‘rG.¬Á“Ј>äƒ :‘ÜÑU>[uEd‘Fþyd `•ÏuL²"öØÁ 6•TŠWVr‹•vDÓ%6·Ü••”y%+¬T"T vØ 4öaÉk°1Èyè# k¤·Æjg¿H‚Ê”$À(-I$!ƒ6T<¡ ´ÐÂ*‰&D:¼…!]`‚ $‹ì /áðÂËá¤&NÔ3M=&„z”C‹\"H  á„#'éQÅm(ÃKSÁ*ŸÀC¶“xàìRL…C=›p8Ê„€ÎÍä²Ê1÷¬£É-•ìm(H!u_¬”@ªVi )RØÐUj}µÇ[g©Á_õÔð_€þÉ5\s9€V_ ïdW\ïáŽÁ_¹C2\bˆñ $˜3Œe„”"Ê7ì˜c‰dß(r™Ê$¤<Ä~Ü.äòÍ| PÁΔÍ)ypÁE1âè£Cz×”ðÍŸ#Í5xD1•|ƒÇ–ÀrG4{¬@ ±ø @Q€ø‘•#$ˆb ,2BaÀÓÙÁutuÁSp@à@° Ô@mõŒ³8.Œ88@N¹TÂU û ‰döÚ«ŽUVþwL "ˆhieùåÛa¾™b^Y>–ûÚ³D ФTÎð¬‘I׸ÀN‚¾G¨?¥g\8D+´¨rà \A+ˆ@È€ h@=žðqìü°Æ0¤AOPE?N¸ƒd ¤r©ÀÐU¬`®™5 ÀC0Hár°Žx@ ßZ7ØÁH˜Â“ØB#ê %HQ Ïj„­@0L`ˆa al`ƒ÷˜E$ ±o1E ¼À„šXAŠiÔA)°â4Ñ•Â@,a(“KOöp2ž”ÁgÙÃN#¹’0 ëa½ôå-$[ËÈÎb•þc$`Ç7J1ŽfÄ,2–a;H`™aœr³Ä;:‘Š# í oB*®qSD‚G-;ñ…wè£o šÖ¾Ð4c¸ ø>Æ&‡Rç&ÁÁªi/¸Be³†tà[$#¶Àƒ¶ÁƒQPâ´ˆ3ꇅ9°‡ï9C RŒ÷üB>îÄ –‹Ràa¿X4¾¡ƒLDB[ð Fà‰Äà€ÈD vÄ1dABw0fFtÀ¯èŠ)& "" èŠ LpƒIpåëP&,D„ËéPøÆ{l! ³¨FWa‚mo©Dâ  ‚ˆþ ä€Ò”ìÁ qØAK\e_%ÌT ; ÅÀ¶ Q "à!\˜Ã¡$QŠvÌh‚²]í€â4Øå‰PÂØCX2A„Ah $+H…¡ê…vûU:À´`eQÿ…1„!´˜^§,Óv/Swã°q“£’` Có –€JC ¸.@5×°'© C5QƒKp;4 Û Æðë˜y|;þà`€è` © K*P¸þh30+`iWàËX ƒh€) t žº kÎÔ žp{Úð‘zà’à íz EðÅà{‘ íà7'ÐOy`ï0(’ % ekð“P ¶À´× °p«# >E`uð|`K¢ $\‘ÀnЯÐS iu° À;Ri¼3 &€@‘` ¢0 ~ú ›f k š :ˆ°ØÈ–¨:DBU!òD" @T ~ð Ùl@€m<0…€AT¨Ð 4ðÛ€ ãöþI0¹'  ®ð ¿h íjð®¬R  *á ®T ›Põ` 1@Æm,pEð¢0 »€' p   %Â@Ãð!àcì†` °2ÀœB -N Ò²öP »0˜'žöÒ‰?×ïéž7‹³ t~) !À^‰¬3;ÃÈ*DPS 2F{„a`j¡æD™ü´ ‰¹ø‹“ _ñÈ8æÐvìPJì@w7ߣ¦!m߀ÀBS Ñæ¶Cã¸ðsû¢¸Ô£2³Ð  qÌúð¡€kMƒûŽ{¸Pþ£w°‰dfZ` ð­ àÅ@ 4º Wþ04à ´€Ì@B¯K¨ ÃÄàà ­« ŠûÅàN©|¹@ •à§™À&iD  1 †Ã Ð “Å “æä“•à¶ 6 è! 3• $ ¸³ &€ª ì» RÙ; ÕFÕÀ!wpúÀ¬ :€Àèe`TP€‘P ¼#$œ$P Ò wÐ" Ð¡Pô`£â1(™Ðƒr's íz,'”™² .@z ®’Ÿ"{Å ãÞÀ âÀ®«Â*¬þâ O°Í`PZ0à– gPÏ­ðƒàÒ Þ Rì¼4ð:¸x $àkð53 -Ó ¤°áð(l<²õ@ŸÏ .s¹ö'J±Çör/÷"Û¡È Èƒœt¤—Œ¬2fûÙ:“2ìÕ‹cÊ"³Éœü´:ðœÌ ÿåGS1$ƒá‰Š±Iu‡Ê¦T:4¢ ¿À3þp#6ìÐ4··¤±³”£×·A°°2†íŠLÖcÎd_úˆ ¸_ÀÖ¬ $p$ÀF  á<0ÞŠ ” )Űzð®P¥3”ÏDþY ´@/²Þp;Xp°þ࣠ôà ©ñ l€y 0ïñsÒO¢°%€#–`Ä€kp O” ’[€S:°AðT·8Šf„S–6 `¼“  J$]SA² Ë i"ÕY Ò3“°8€ çǰ´Ã€^ùPÑ`•MUkJb6 ä ÕyÙÛêp³mV €mÖ¦\­ü«Ô®®ä­ Ö­Pð–pÅÐOÁ`àà4 ¨Û®|½×ß©*£5ZiÂÛà ,À§€­åà é@,À !‘Tp#<?À²ê(‚¢Và—Éþ†oíñéœêPÏéq …š-Tô,÷2E10D؉7+w 0QU"´š$u‰ ´ÆMyQ `vûe`dÑÉK;ùîÉ¡ Œ¶ÈGø5Ébà3ƒJ)ú 2s)êú ~ – ã€zÛK7£ô³`Kp ·G ë`·CÓ ã Æœ Š` !`yÆððzbCÍ0Mê¸4à ±éî`Ny 3  PÛÐ Ž Òà ®à zÀüzpá @I°c`ÏÚ€ Ö° -NQ ‘@  w^ð~€ö~P *Q‚ ã´`•§ ¥0(ˆþs ?¾»ÐöÀa ?ég°ÐCà rÏðP%L@$Ø¡jS`i° Bà ¸Ó ]¾€` ¦¤$Ï0kè°´¹À“€ ¬Ð«Ùc“0 [‘Tº–" Gðl:Ž˜ˆÕ‚ð A`éÇ‚éâðh€Ö_° ”ðÇZÅð²¹` `FðÏP Å@Ö;Ð*é?Ù|½áÐþ3œéК[Ö®“Í›`00¹üà ¾Ì¡#t"HpÏ{K<(Yá›-]Pk${õ&©kãPI %!=ì°—¡D‰E‹–4þܲE $6R×Ò–1$Æ#Ì–­`9u’øakO°`ìÙã.‚»=e¤J0Uª}èð}Ë…|F0ÌCcµŸVš5;‡…91e*UÄ ozô¸zãJÙ*~ÊVÓXqêÊ.IôXžÍk.ZJ’D¾¤)Ë5„¨s_Šå餧•0,\iÑ&îÔœ_~Jˆ³EЖ¸J~ è{&1† LìÙ¢“þtxf(X‰`w$¤„ùa ¶PŸ@¨# p€| ™¢Ž} 0!B€g„ˆçÄ&X@ÆL å XKÐàŽ`&Hvðp‡‰£”2l€¢Ž;N ‘Ê*E© <ðã™v2Yƒ gž™„‰$œHÚÎpúyâ mhA¥ähpÄyG ó„°âþÖ'^â ‡8#4ÎÁ4NÕ˜³Ÿ~Ä'N^FZ¤„4*¹…šh4áF“h"9,ÎÈ$‚L€ø!šzbØ"uB‘(†šZ2¥ À€š@ZȃH3‡ *’€áþZ Ò8I%7Üp(7Všf‰ Î²D ŸÄ(Š([~( (¤”b**«²Â£+©¼²wß2¼*ª–ZJ¬›p"‚©Ÿl±ËÐ#(‘kBJ¥“ÃüÇœ?.ãáo¼9¢˜V®)ædÆ‚@,• ZV9cbž¥šÉ%}:ÉŸ\äX-×ø°æ|fÚçÚlSú#@™¡ˆmpÅ›ùâqÊ ÈI9`¸"<¡Ä7-P¡Å»¡õH fx•7ÜWøÉœ ² Ç›w¬åïÞ(ÕzêK§˜9„)ÆžTÎDh¢!‚ ?ÔÁÊ5¸@¬"¹#\‰þ@ŸF Ø5" äBÔY9Ñ”,Ð2XN åF¦Yf(pFŠ( X†œ- 0‘|Ž ¢[ÆÎq ¨C mP¥è†î€ lØ‚Òð‚ ,)YB=âuL]EþIJº‚A„Ÿ%)i SªÒ/~QE+øÒ ý啪@*cI˜YV0s¸ëaã@;ÁŽbì@G\ð‹¹(.0†$Þ€‹b\ù ™$ CÉ<¼1£Ì5`Ö cÌB¡±™5rV´\|¡hÔ±†Ñh`>(͵ȥ2¦ ‡À!<á¡Áþ µ‚$Ó ”ÐÃ`ðk ”H0[¡J$á  Á41ˆ\X@ ¸€)0ÑŒ!ð#+ ßœÆopcމÒQŸ £ x†'ìQ ‚耰èÄ@"@:Tb¢cÆ a "D "Ø‚%Ö@ @Ü¡kˆþÀ‚¤ ÕáDŸ@dä„L#J¤XNt@dœ(&¸A–j`¾À$úb DPoJB½i D ëAÁ{6ˆÁ2ˆÁâ(„‘ŠQQ*R“šSÄŽ ô# ¨èÓxP L|b u`2º )H‘ø€>*áÀphãT3‚À~¬ ­ØÆ6d˜-@ƒhÁW1µU© ·XÕ-\x NÄP ­`†jð‘Pk&êXÂ'0‘ )˜b á‚…êÀ%x ÕJ@¬•*¼ xÁ Ò­4¤!NpK¡'bhsËb°¤ÈK)ÓmŠþSòG«H…^vô׿Üñ•=úd`ã½Is¹1vˆBC` D1 s ã¸ÐG{-±v ¡'Ȥþ@Êb!¹HÅòðŽ9 A’ˆyƒ"Œa™UvB–±ÌÅ7¬ñ9ðæÃ h`„é+ep@2 00$`ÒD6õð€‚ 0„ Î1=”`®x€fÍ+°Ö¸1(¡ ·QÁƒXqF¼‚NðG.¼°ƒSèøàƒ9’ñeŽ}A¨ðcN‘Ž ä¡­ð„8ìA ÂöP耠gعoÀ ˆP‚I¤":ø, €ƒ 墘 þ! ¤æC€‚ `ƒu Z2À\ˆ)L§7íÀ öq"Ft€6Í)nUÖÐ@#l€½Õ‰À ܘC& ²<ÃL†8´Á©@!{NŽS´Qàâ ìøÆ?>a d0¢¯rÜ {¸™„”ŠÄ6\Ð +´ µ@Z³CV òÖBlÈ‚$<€§ Ä 9ƒ\¡3ÐC㯠‡2ØbÍñ¢@Gµøn-€¡€s a_0ò.Ž Ok\Ÿ_µ_8ÒÁ\½©(ˆ–‰É=zÐpô£×‰oüàuÈÇ(±†TÜÚêÄ­Ý$\œ(cøðPd$Œ¸AdTþ‡  a„)è‘’5´Øž Qªî©ƒz`…Ї©*ˆL?}` ò j¾¯!8ÙT(~°61À\€¸r‚O€X€c!^è‡çHh@„lXð½w3¬zÓ, f˜(ƒ=øºFJqx‚rØ,Ã*hˆ­‡ ­`AC0€Äs‚iX+Ðuð€%ØÆK6L€,Ú…pˆ`ùˆX ˆX@î‘‘„Y®x ',—6:Š›‹§è¹:ª—ž±&œŠØ.8*:˜µø‰£ø ¯Ûs‚?CújãDQÐHú¡ ¨þÓÄ7pR…kX¯QÈ$C Iè„<(…oèxcpœé„Rà9( p›w8=˜°ÀLHƒfŠC¿F¨„T¸Xø',È|<Ð¥¢>@ˆ†Õ!…=XH8‘;ð‡°©-èLˆSè€Oˆd@¼XC@þ¡ê¥Zª*ùž¼M…7ø…>#"pT †t ‡Hˆ„k„<„S m–ܽá†q8“sXALß=QØ‚;8Þq0¤b……š(0…$Q„ɇ\Àt(Àt˜…¨ü^¨µ6X‚”ð­4¸¯á/Jà]àT†´<IØo(†hB#(%h‰%ø+@þ\8Z@z`†ÃF¸ƒ@؇ª–2d¨‡[p„N‚ýðƒ7`8â$ÎKÉ 2V6n¸†SÎ-X‚Àh(êДpH‚x݆&ÎØúˆ‘ð„®´„KØ'"à€•€Ë"6_{°€¹†ˆãÄ„ƒ.¨8S`(–b°ÈXò4c°ϧmótªðN­ØƒÒÖ—2.Ù¢Óbôœ.ŸXc²Ð‰þt€!ÈE Ex:jÓ‡7Ø$¬3a؉»ø‡›A¤ÙûÌqPê<Å 5”5°<Èxè› ƒH¬ eXà˜ñ†L`éEˆÓûw”wû#ø/ðþúv…Ô»=èîfêO`z Ü"† QepáŽÍr€ƒVP8Å¥}K‡+ðpà€8xLÇT+@˜cȰ€ªyÖ°€Òó;W †S æHÈÆ#Ѓ",p4x‚S°†987+>†]ˆCeG˜„:[ƒhDȾY€‚;w;X{¨ lè3t˜„Œ¬°)M=iíéÔPÈ€4ðšÔ;ÀÚ1cø©š#hKzH‡t9ø?ø„;ȇ}¸LX Ðg‚„–ý€‰‡}pƒq±‡{²AëHIÃ8oð}ÀMþ€Ÿ ptâtˆ–¨ƒ:Ø‚E®4`H0ê8‘‡¼Nö¬n8%âq(I(…&`WtÀ4L L)¹‹@•zh‰äÜ‚¨‡`ƒÊÕMNµ4˜—ôÄÎ/Ö9Ô&Ù-¯©hB’Emîò¹©íó,<'ÄצN»¸À¯oøEv÷oàŒ\ÀYtHIÈ…f°÷Ê…Ej†E‚ øº:ž˜ôÚ €ÚPz;fóRødç?8½ˆ‡¢Ä€ 0 ¹ àã9¸†i:wó‚Á…e|øŽnÊÆl¼Õt`…°"¯IÇVx€vz»b’fJ`&>ùÐ{¢Ìt°€°ðþ8¸ðD±E UØ„ÒsK‚šÏQkè¼s±)JØ…SØo ïç$(‡}Þ†\}tqHŒH…qˆ[€„%‚(H¨G0¨[°Dè³2À|¨ƒk†gP*É…5Ð;¨‡;¨­Aü“ޏF€‚ bñ %° fˆiÓ“nØùyƒ`<8‚{šÂëð0„+pÀ%>À8x‡ÐÖxü|ØÕrhÁ¨h©R¡ô‘ØOø…LÈ„P„1ŠëOð"7ØFØ‚zH•hˆ‚U¯C^ÈTxõk¾n˜€«e³‡ð€wÍþ””°¹‚[0rõ–Ø‚ `«|xv€°@„e"ìÙc°L< #¸s‘!ÅŠe$2ÄèîbÂñ€ÔÒ"ň{Üíqp2!Ë„^Ú3Ž sþ|S$JÔvã•Âw-ˆ$}©$•ÂUêO)vC¾uúæs¦¹a=ÙýA‡NÔ0Eú:åéôNÔ |¹DYûbm†59kÛ*ã`DN#ÍöèU¢ÞqW¤y!¡1î!TÆÜ ~hÐx G¿+0<1‹‚KΟ\+,0Kc!%T¨V¬ÐÙ­œÈ“Qé±öJ’r0¢œxGo+ |+xdˆŒhð‘“þÕeÖ0À¸ò†Æ #Ì(ÃŽŠ’7.fø$Á»".Zy·H\{˜1ÍÞ›`#Æ!‚f 1‰juR!f "6T‚—-“2I¶ŒM>|“Ø,@b(¾0Ò #wH¢x°/;,’i+È¡ 1ÌxÂÍ)§QL1ï葎8ìõ#N+üc„Ê€€Úv.ü&nÔ‘†Oæ³…)1,aÏŽá˜È‹–4 %/5ðâ/‹\CÄk”ñ‡ SŒ1o²B‡n˜âÆ4%\ Ä N %f€Ê6ƒjñ– Šèˆ"J0⢴ñç“"*Î;®Dƒ ÷þ”Àä¡ÄàF ¡¨S‡"¤‚@FE 9ÑI8°I%a¤ÃA-ä¯#½zJ­´‡- +kJØb‹æÌDV¢XB‚Ã’Ë7;éS :Ž‘G.èƒÏæ–"ÊL?˜£H'¹ £>¢˜ÕÉ/CäâÂ;~|5Öä‚0~Èá[ø´øÅ|(3„ˆ•aÁ"¼$¡‡æ –Ì#ÙdÓ‰¹Óšd°¡r%”$@Œ&à±bŒó /PÝWLöZiªµ…3 ÿÂ%+LŽ!8 Ñé¡Lc\ÑŠ2@W5 ÈwÒü“3d3€R*þIxÓJ+Þ}ðN+§”`ÏVî ΋•,bO)¬QÊ$%€:°ÔuäÃÄSèL,#&$w@Qy…P¤ðJ7 Ü@ÇR˜²Em(3:¦“NŒCÏC:ôУ =h”# FÀPB,²C8»SñÍTŸNŸlQÇwØðä…6¸ÁW‘HI–^~YC ]véÁ"Ö$Èt`šS †€`ÄYhÂÊœu4¢Ä"/$ Å Û "Ή&ªO‘4@@ ˆbàÀ%x€ö¨‡œ  ~@ ¸€¨ŽFh@U6„…"¬‰¤%{€°nþ•B”\%hHC€åƒ°DV(1HBhˆ’„4Ë4ùÁ†hŽž áVÉ…1ð¡ˆTc¸ˆÄ;®¡?üb[ß(EOHðƒ!Ì¢)Yp·¼‡<E3È¿\à}¸¥rÃÁä0¤/ÈÁ þEkð. üø ’a…ÏuR ÃÃÁ=Üì ž¸ÌÓ! ”xÀÊoàÂÞÐöAPÌ BC…7ºù†äáøÀ‡7(ÁþŒE@Ã{X*|*a¸ «˜+ö€˜YÜÄ7˜—Š=ÄÀEChƒhàRèF7â±W ãm€†x!m`TuÜðÄ.l‡+Èv¯;…7èhWPÂiÞîú±;öìèK0h圀;8Á ŸHƒ1°ðqhLbâ—¾¤¥ ¼#‰9ùÈg>lb QÅÇ‚Œ ¬¢[A ’€ -èaü{B˜ˆ¨F4âƒQ(H×ÀFÊöXBèÜPD¦¸C#¶ƒI”JXU =B‘^1D…†­Fnx‘¦°‡4„UER¢B–´ª†8ŒLÄ Äþª°ƒE¤‰¾‚T\£×xG)ñ†kˆKìʸ¶5“ft¢)ßÐǸ¼ñ‚á"o >\ ùKlÁnb„(ìB¿Åš`¶$Œg!0Gè°P),`bÐ ¼pÊœ½¨Hv=¡"XB[?ˆb‚Áf$ü˜o&ËðƒNìb<0Žs0à3|Ì€xHŒ®Üá€d @&‚XÁ€†üP†90@ €ƒ®€i¨‰ hÂkÁ\ñÚ¬ÍÐ;§D…4§™fzçAG˜Nä»C B¿¨Äfá²5¬£ÑX0 Žq‡-°# ˆùA:2àþ†h‘ Gh†6£!¿Ÿ&‰ð4Äþ£áX~l èË5T;ðà"D ^êRPÁÔ0í =:í9¡Èdèã´Ë¹nŽU o¨ÖX×›*dàuKG$þq‚]D$@©8J£@hC«¥¢@Ã"Љ)LÉ8&, ²=Ù@C lŠlÁ´ye…›¸mH@F¸P«xÛ•à­l„bÍÊ­[F D0ØB0¤Ä¼‰Á»ñV¼ôÄ0Ô;(ÂäÁ7 ¿½V1ÁHÁ­K0p—ÆAE¿]ƒH´ÂD\8áƒ>L.äÂXÅ × Ã}Á?x(6Ñ{%ÁÓ<Í&¸þTF˜Œið!l<€ ¬Å/pAÎ>(¸ð7D5ìU•Ab¬ÁhÂu Æ `Í DAs€ÀìÆ9  <"bðLàÀ ðœXAø Á <€4PÂìœ)™ƒ0-èÜ$l¨ L— xM7áBá=€"C4™5}Á Hƒ8ÄX+CäyÂhC+ÌAœB{ì‚%Œƒ1|‚)œ“q^$ðÀ$Á8Š:„¸ÁäÍEñY?`Ô•üŽK=A:àÌÁÀîdÀ Ìb Á B4”Â#êÀ,$Ÿ84Þò)–…ì ä< ¬£'@1hÃôAþZ£aøAÃ'PÐ0‚/ìÃ>ø‚æ$xeÃ(È8:`‚È@TÁýQÁža‰‰dÀ (ÃXüA0@Ü4LB#8 `Á3ÃäÁ5ÀÍ"ÔÃ"8`èÄ€­Â €C#@ƒ8ÁàÂ?ŒÂ ¬Â*p Ö­X›C” ˆÄ«lÛ°ÔcÙeF´„;ùEDA$VI¸D0ˆgíàµÌ‚2Ck¹@µŒÃ8ü0à:¤Â)”C,á ìĬ €a'tÂ(ƒ$´B1\Ãj¶ÂjQ8ùÌT€9X &!X2Ì‘[`XBuµ! \Á ð?lÂ&þô\ÐM$ B+‡Éa´¡ÉÍ  tÂt‚"(ƒ7œr¬QÚ tBŠÝLpß§€€L Ü@,Ã2LÀ9ˆ€)ÖC ¬€" XðCr¨brÀF1 Bvœ1Ð@<À”%Ø.†^“5èÜ ?dÁ AM4CŒ?x8YC+d ´‚ Bx$A8PB¸€$=xƒ0¼Ã.”@ÞpC)ü@#~C \™$HF¨U[‘N Lßò]”6ü¤\Ù:¡ˆ8 sà?äŸ8xƒCd2(O#à€=C`TðÙ(A(8 ¤¤*:çþ/¢B90C._8¨/¨A—¨é‰ðB•‚)\€/pÙ¡:K¾Â+\@ØÝÃŒƒRB3`ÂøäõhÉÿDƒ0áÑ-ígnr‘Æé\ƒ @ Aü€"°&ȸ&ðƒ`Àd+à+Á/d¬°ê0e‰`CÈʸ ‹E8Ve%Dôå ÝaŒ °˜„µ ]˲‘;Ñl…Ñl}ÃdÎD½ñ@œ-H‚$\C)Œщˆ’a3€a¾µ‚ôÞµ‚7láp‘QÎÀ0ðÁ/pÇýAMœ”ÇQ´á¼!(È?Éx*îaX¹€É@þA´¡Ç–\|€¾tç|Á;(?%üüÀ8˜Ëüƒ#ôÔq*Ò€r8AÏ ÁHÕñÔC=@B\Á.XÖè Øê)½ÝÉ” ðð*ð€ÝQÂPè.`¨5ð͉aèALð€H§5Ð@°( Á ˜Í ì¸%À@Xƒ ”Àþ1=DC«Ž›* 4ÆxÁ´Á¬)[5ŸaÔУ"ô‘D;œ€‰ì=À><@„=\C&ˆÁ&hP|=È@šBd8|I¯í€€BLÐ\Šz ”jƒO.Ÿ—Â-ÄG8@ÃIþÖÁ@¢"ê>0ÂlÁ$L‚ ”Ƀ LL¦fª‰0^(C÷ ˆA-$C2ÌB ¤4Ì<°À—>܃ð.À4Ô¬Ü+ðª%HÄfµë¯k\òŠœéŠ´qDci–E`ÖfÉ`³nDAüK0‹B8€YKi™ƒ(>|ÃMü‚U; ÃÎÁ3ø \f!;pÀp‘K.¤B1xƒjN\XÃ;äÉÊVÚ) l‚!˜@ÄÁq@¿üÁsÌQ2 4C3 À‰Á ÉY'(xl€‡5ˆì@df' åHlxÑþX‚Ú.#?$" p¯†n‚ÈÁ `Â48pL /À'°B¢`B%œí(CÐjÌ PB9ÌHº²—2ðÁ †4 ׎ÂÉHí ¸Â P‚+<ãy‚ü€ƒ`˜F+È x•5é¬-%ÃÏ|Á<À¾\ÁîÈ=Ô@¯)A1¿”o2Ô‚€Áõ¨ïà£6¨/@ƒ#0b|ÃÒC9è±5\3T àBÝàè±Ãì®8¨ÁžE3ö|è@&Ð DЀ6Ðè.;»n4‹ƒªŽéƒÄ¸$O Ù†äC\@ZmA è+@ƒ—ìþ44¬YIÔaÍÒ$CmzÖ0xAê ŒÀ™ŒÀD@0ŒÃÄ”!P˜N-n,DÂTbà-x›C«¯,°B8õ]–«D_Bp)˹ý%BhB°`#rÖK,fbŠ"˜ ;èý̂ºŒ;ØK¶ÌDZE¿I‚%(±ƒ((‚ØHÚ æÑ€çPËøCù¬ 4CÚyAÎÊ0Wù– e’çB& ÁÌaHòièÁx †HüÁ*(Ýbþ@|ÍɸB)pƒ=øä.  ,Ã0Ô$‚9¬A îV °@ʧÑB3p-Ü_D8/ÞqJƒ?غ<@J¥C*D¾óò·twÔ,ÂìÁ œ'´ü•ìÀ5Œ„À tJò0cH äÃy(`cÚÃPõ˜8¼Ÿ‚'X@°‚€€ðAul‚T3 Á´<°AK0y…Àt&¤Ÿ,¡>ï˜ù‘Ã$9tì”HøÊ^†ÄHpî% zµía5ë® „_²ÄK(Ä©D Q:@bÒD»°2ŠB3àÂAÀƒTþÜU (|>tO fÚõ]_ƒ1¼æ¸ìµ¼XC)pM¿\æjp ¥Ý£À­Ü0a[˜f»@oÊÁ¸­›ËsTC2˜]†l7ùà ·sD(*ÈAÓ'õ0 ™"D'nÜ,ZäfÉ’ 0’lš!GkÖh´r…Ë›—W,~уŠÒ)åNÑ:åÉÓ)™§vñ ´kו+'†ì)s!1xðüàñ"ƒÆ§®¬(jT@îЭÒCc†+n”RQòö`F Ú¨$øs£Û+_k­Ò±Ç­r,N¡aAëî‹EKQã0‹5HŸ IIÚþ?üÿãçÍÕƒ<ï$I:¥M›8qáú…Û.•+À`râä †  Í 6œ~€ªc˜¶ÔÑ @páú#BDuê}úÓ‚zÓêMÚÒèŽ|ò"=ÜÙÃ'´PslQDhÑ@Ük¤qw1Ęò‡ßƒ!aœ†Àåˆk~aG‘(ÙaJ%w¤²vf)EŸk¶ñF3Á|ã:™,NôùBŸD]_R#Œ ! ø@sPþ 1Þ/ÂÐF•RœÓ;\P(+˜C€H†¤À°n,ÀÉÀP1šPWx 2LL¡›XƲ)¸¡aÎ"2° Р)ÖpA+¾’Ñ€À|ƒWÞà oHC”à‡´nB™p[  ÈfŠ ‚#»H€'Ѐ†$èað7` ‡©8¡Œ`2 A _±†2`JŒÊ°``/FF~ Š#h ´$-‰1ºTë%Û*$!Ñ@/$eH†-*åŽ\¬£\9ÂZ‰Sxƒ0Ð1’  ” ØIG:¨@‹L£þÞÈÃ/ÖL8Ø€,¤@Ž @b0Ø€@Ä׺6{ ¡‘ˆ "a{˜-+ÀÄ–à%DœdûL*5£fx"yú(Å3ÆÁQˆ"Š˜Å*¨á„Ô£¬0) q8aÓ09ê€LÀnt Ò…ʰP îBž ]† ô:ØYÈ@zЃB4"ÅwÁ`Qf·[ˆaw'U©ïfD¥q˜ƒ!˜™$Øù(ñh°i3¾‘ tÌBúx‡>:1cl L­_Œq&º`¨rÈ…ü0'?àÃjš ”ÑÕøUà³ øà¾BÉþšÁ£62§/°QVàCˆp„Ü (¨€6¡e)hÊ62¨* €€ €ÕAè ‚¼` mPÂXakŒ„E(š¼á„ (àƒ9¬ƒ<2®ð‚7þñ q;â·’@P€ (*’˜\X™Á¢@  ¡ &èF>^‘Fpà)÷x(á 5Á€§x£Ð ƒ0# ÌOM‰*ž—b‹ÄK!g"Oà¥%ž(… &°dÈ"ÀWÞ«-Bžâ£X>`¤”T@¥8ž`Êph#žØ  2Œc‚Ø ÅiÈá"ìÓþ¸9LaŠ-\ B¦€#‚F,A’hG„Á…vášö@*JÀÍæü¸9Ïé¦Èfr¦ÃdÒŒD4X‘Šžv¢?@+GŒAq¬ºÏ4ÈÁˆãdî¢Ý…4: mô¡½è†Vä¢(E¬»]IKDg“Þn¬bhé8ô¬gµ”J?̓Œ¡£Ao9U'.®‘Šb䡹0Ædðá£u¯{o˜ôdõV¸ÀWŇVµz¨;­É¬r(Tª™5ƒ´ 0«£Vª%e#X!´æèT2øÀ+¸B"ш0+ªX Ê061…)Ü` ›!ÄSP(a W@þW69²ã](£|èT-’AîÒ~…†ÞP÷½ÁÙÇ‘ÅàÁhl{[PA „„Á¼½ lkÌ€Äp Nà¾U0‡ØC0ô€™²èÁˆ¯ð=(Qø.˜AŒ‘ò¼ ¯¢'"AȘÀ¤äT4ÌÇa’Š5à¡ ¯h.s @VLÀ @ V6¨D®À– ” 2K'\@³PÂFk¬`ð 8뇊³^‹µ¤aÝ8ë\A¬ÁÞî àHBl¡ÌaøÀÒ€n2 ®à@þ\,¬¨À·¼â Ž``FåðÁ Ò€ `"ÞkšÉbÉ.†‘ £‘ª30 ‚ÀÊ ºÀ„ ÁŒ D3è!ˆá BàÎáÈ-Ì!èøá ¸…4£XA &ada.`ÜàŸXa~ ë>¡*¢˜!Ÿgq ¼®lA*á‚ÀAô2n l¢Ãò.b@²Ú  ~,`a Bl*ÁÁèÐñºnFápaVaÖ ¨êL¯ÌD'tDOô8'Mv"`t2dö.ÊDZ¯D<ŠEþ‚wFŠFLêw~@¥Zä¤xoŽJžÐŠ$~a$-ºçò@K:áÐ!,¾Á$ã Êg|ÐääÔHNî«^­­N RÚYþ%áoÔb 0 NÊÏ}¸Jµ¼€DbôÀ”ÁV@."#ŠÀDeB’Ê €ÎÜ!**àJ`w 4+PáÊ!h€BÀ¡–¦n!ŠaÇŠ¤³Öò‡¤ÁþÁ 2bƒš5pò *%*ö ý ;¶ƒ ® í v+¦òâf@, ®€ârMÚH%ú‹JN½Ö«þ.&äÎPúA@q† ÆìŒá½ªhd Œ,,€j!!ð~*À¶A2þí¢ÀLA L!ÈîPlnA~à’X¡<éRÁ9•L¤©òID!‰*!®RhÂA<@@<±Ìš€± B!rq• W.@^ÌJ€¸á並 A9ágÊŒÖÁ¸ÑóêÇŒ¢ÐÌtÈÑB4*Ì"TsB¤ \$o'MÊFjDÏàñõdD¥Nj"sÁ¦rŽêô¡NJ¡®áJa§ráŒêD"Ǹ'òà|  }DmNàþo#êå%K²$™…*€^Å€ÿÀŠ@Ô@R%ÛÿìϳˆåXüa#”ጠ8H6^RMÝá!©à¶aààà$ªEðÀ¨æ&i’À„(“CÒR-Ùmÿ"ƒXh@ëÊÊ~tMeð`•Ò`•<.®QoK³’àP¡\Á." ®`Þ2‚ðá bB&4ä¼Ð.©¿¨HåÌ3´CÒ¡ÄávaœSå‰d3Œ ü&`ºaÖbΡF`Ѝ€vaqêáì¶€[·€ìºõÈ*á”,‚]¯]þƒÀ9SaÊ5‚€ö`¡Ê€‚` ˜a\ÁÄaJÀ@à @¬¬@6¡ÆÆ”`¯Aüà" !Ô¡Ôa –`0¥až !T€?§ón¨aRafÁ¼±óAMÇóŠË C*Ä¢,dE(T¤gcoöZ§BygFX„¥l!£ò±÷–®AÐAðÒôáxTÒJÁvÄþ šoÒ\@¾á|Àðˆªû6«¾€dj€âˆYZþì3ŽÐO~®t8äAàÞ®*Ôì³üÖǾ ÿNÅþ¸«H7(‰ÅøÁÄ þ¡ M –@ AŠ PA>às)aŠ¢€\á  O²ABÀ†ëX°ÝÔm^ ˆÚÍâ2"#ZÁq•0à€Á~†W"Ãü ~‹ô ‡ˆàÐs{+Tƒ-ON`PpkNá@%`µŠɼI YàV7S®#3ʉ}Ï8;^À & ºÁ^aöá~¢ ÄÁï´£7ZÌì. . [MŒ[ã"š³ŠdKŠD‚Ùõ\×µe!ôavÁFÁ$ðk `F˜`…× îac`á…a²NøhÐa§Ÿ¡¢Áòo˜þ ”3¢3–ìrøegöEPôM¡bŠŠÌÐqg]§£Ø‘ub¤u´xÎ0t¬`¯v‚!Nj’„lÏ`p!¨:!ÊáÞÀt„xŠïp!*¼Aú /ÁðÞŠD~akI G†À àY\òÄÏnå‡r?„ešÁ ¬ dŒp±JMDMÖàʬòOÙ0 ”Q‹€Kur‡Õ¯+`‹çwfM¡’QNb4ë ŠÈ’‚†@ ßÜGSÝ|Hݼ`µøÏ‡V 2tW@äà¶*ª¹šÏÁ âÀâ¾€ø´ ‹ôøhô`ºþ¶"$&‚ùA`”Êa“æVe€bɼFN óYåè˜á}ÏP 1£ΰÒ¡ÁÒ!„'` À¡  T/•ž`;ân D™0 Œ)î`[ xcÓ¡œSK¶Ä¤OZ]ѵeU:ìØ9õø&¢ À !``š7! Á  ^8cxÐá2±¢ÀÜÄþaÆ€ †XšR!œóRÁA™8‰'j šøf*gU¡øYÇ-4wÖº¤0Ô­çÑà@ÚLCÇʈoJš†@º×HŠF›Aj¿á lùv”iÈh¨oG]à ¬áþDáy¢D" yþ­Zòü\èV³À'‚Á :ÀÙ¦àÄàCš!šß¯píSþàJQK1…#†š•! eXZ*ìà®Á ,`xnÙhx×>àƒX€"€¦—ubŠä!#$Œy™‘9µ”ùt—¬ jdܪy´y h"ÃʸøA‚!Ï€Œ)ÞˆÚ6 ¸×+üj#¡`fð¢ bõ¼æB‰“f• C5Ñ(f µÁ3å&dÒ À`xÒô€  Ì_¡A$àj’ Á\l Ô¡Ò¡2‚àOZP:‚Uúfþa]¯AŠdx@'@ B@€È‹&©²€ŒŒ Ú#ëá«`Bà4! 4aùaNÀ#ê"aVöªSátૹ:ÚåÇ ø`–ô†'Ökô“«Ê¦JäÕßJÕVý…Ät¾ QÌá)Ä&jäpe9”€Â!*?€°xwƒä€\­°í=±×mD•ˆPÞŠávYЇ´›ÿ‚ \yÑ3P† Átܘ(Äv¡ºâš+T+þ) aĈ#îyJp„¥+Q6ñ9wÅÓ©S´N[áÝŸQGŠ8²“ ZhhùÞ¸P .úHSL1Þ¼ÑÊ5Þþä‘K'âÓ‰1³d‘ ;ãŒóC¡ácãøÈ¡ãr` £Ž¡ñÁÇ0)$¹ä‚56Ú(G.:B e'_TYe3ÈAƒÖhIà x,DÝsbîÁÁ"J´Š;¼ð@^µÒÊ­(cEÉäIÂCü‘…7€êŠÞHc(¡†®0fÿ*Í Òx£Ç¤“f´ 0V ‘Ë¥0DÁ%üXã¤þxÄQ!p`+ž”ôáD!TÂ/åzÊ.ŸÂþ8ÂB9DíÄ ‘ Å §”#PK1…TÑú =Å|ð΃®°‚I+€%î ¨´²œ”x‚Ö_â” ‰"þ¢üÁ™|±‚¨PÁ.`ÅDa³HÂ"d?VY”,™d«±ŠD 8q€ãÅ*£ðÊ5¿´ƒ@&™!¦¶ Â1cØæ„8èÆJ%ÑDCÜÌÇsD$Ü9u;OgvØá±Æsç…ç]y97Ç;tGß|öÙŸÔôÉ'ý (µÿh‹{âè‡(C°3Ì(åœ2ì†"I'×øûFNÅðS %~èÞH’G'ï¼ã‚ J~3Ã3Ï 3CŽ?æØ¤Jâ³Õr|ùã6Zƒ£˜C.¥•F|aD^ZS 4¸ÒŒBx àÌ2   ¶”ЀJÔÁþEȱ ¥¨b Fž(( Àì$3Ä?Ȩ7 Fꨇ޸" %†J$îLÞ®`&Ÿ,0,Ó8ÁÊ*ëX`?4Xó?Š Œb˜ƒÂ9؆Æ)ØóÃçàÃ*®P“ìbW»ÂHšâĄɢ -ˆE,¢ÀäÐ’Ö´¢-4$á8‰IP!,t$W8Á®Àƒ„‘7P†Ø¡ ¾äà|àžø [ˆ“ŠÇ0æ0‹yLd¶0Ã(Ì8A…WñUP±aƒ¢>Jñ‹gX‚®Ä~0t¬Â¤°& Á2;” •¸ÅÌŽADâ¬cLDSÈþìx–GëT';Ísºƒ4£E`…,Ô ÖŸ=´§k÷A䙞÷äç?ó£×6ɵa4ãß`;š!Ša£´8 ò–“w”BÆ(Ñ)?t„œx#n­ Fô†Nä"p.ð>¾QŠ?äB<üÑ\À9Æ=éIV¢ÜÞѸ%5ÓI‘KÒ3å@M9Ì`£+Pç+ˆÁ½X€¤°€$c!x¸B8P^P§ÓÜ\ñTðC憄°€Ða$p `@ ç=ORÒƒ+\Q=°ÜÍC”àF[0`"Ù‚)¤àHHÂŽ8É?0` =PBˆ€˜þ‡?`‚épI1PÁeðÁ f9EIŽPŽ¡îâQÊh†Rñ’Ÿ(ÉB–³ÒVŽªVõÉŠ–S¢¥”+Ð@H‚'¸ñ€ ¸cv:ØP)±‹+$Àh ƳÈJ¼Á)4á‚"¸`WhK%ˆ#Ç0f† Ø {°„YF2EtŒ£˜ŠQTÖ²P4†>rQŠW²Ã¶ Â8¾¡ˆ hÂ6˜ÀAjÓ˜˜ÍìfÂYÇpˆ¦3êðÑÖ)ÃuÎÈA*²iF[šÕÀ£È§õ'?´…€(Éœ«ñÇ=Ð&I6`0GŸJ1Ä#1ÂÂ(bè}(¢o(Å7ÆþÛ #¢€›œF¢V¼!ÆÈ¯1:A Q™Ô3uÔM)åHJÜü‘’ªÉ¹Èásrf`-Y£Â]уA~`ŽDÐA7P€B„<¡;ÈÀ ŠP=h[uÅ?hð‡e, 8îÆ †ðÃÏ#ÔC½á@aPòÆ(غ‹]Di(jC‡iLà õ(A®peXC&9Á*r11ìa #˜A O˜ä$Vh†2vQ@J¡YwæŠñüáA ²|‚†* ‚?±j-‹z¡>K)¤‚äp…4ˆã ˜ÁŒ¬°Œ ( !¶ðLNÁþ ¤°%鈂"B° PØ`+P¡…FÓ‚â@J`ŠxÄ#"¶1e"ch㬢²ÆIÅ –l(a³P„>6›‹?˜«+l³›4–p”Í„#ÞJ‡h¶]ˆýH[ ñ–Fó-wšž¨9 “Æe¤|ÒS\úØb>ÿáÚ× ; °i—?øZw¹ûb¼ã oÅ7þ‘‡k䯯æ0„UàùCê‰xé\¾áú0ÆŒA*.p0ç!Ìg. 9.JÈd¦ ‰Ì?[JÊÜÑ&œ¥"Xc§C2ü‚Ð Pö€àíIHCðùUþ‚pPüЃ"8p:´VPÞ?€ è jÈ€"”õ)Œòƒ­eÅ&@° !¬¬[Ø$¸…+(ÃáºÂ-VFl#¹XoˆÁ¿]üoAtuçª¡ÉØSD§:‰ceZ?J$ªš·ÖUmIÙ-<ƒ-Á  ða…)H¡¯Ð±9tðƒ³Å@a‹8þ!S”A „0^ÓA¶ˆ#Ì ,¯“Ä` ûû ŒcŒƒÙdŸ ‹ÉÂ1pq \@{ü£¸G4nëÝ@Âpd†ÌèhÇHh:Ù€<3€>Ã3$€¤4ßÑÄå|“Tå!IêIþ÷ö4êQp5‡ôóñî!D?_Cæ}ìð5\c]¹p µÔy°^åP . ¹å_^P nó7ß  qÆ)‡ ­ð7rðo@óT2MïP%4…Æàu,8ÐsÔ¤M¹` Cð ãPì#Ôt?2|à#\òMøÐ4`Êþà`¡ ðMrP(”°ezÐC ¤^÷1 ñP7à`ßw…2d%(ƒR(ÂQ>'1p`[`T+ðp»À ¬ð "ee ``À Ì+;u!ÀFpwºò,¹ÂVÅ0þD€$P q#h`N¥hE¥0ñ!PzÌ’60ZbyÑ rpRð û°Ý –` ÒÀô°ž@ •€ 25SÔ1šðøÚ@XþÒkÄÆ YLÄ~O$Yâ7Ç`ÙlÍ–EL”lë0·À %v`pG‘ ná Ž€e°;c[>€ €èA£Íá|¸€º¥Hó†HM³oõq\d5')I"ˆ‚ʵI6æ#ã@?p]@¸ 0wV Åd òDs2'8™ƒòÿÐ=áÅO&(×àEwÒ3QD"§þá2 ¯ÿ±ei+p° 0@ % lô ŸPÀiéÀ üÆw†®`:Øh/A0WÛf« Ð1Âp „ÖÃRU×0º5Sî0ÆPKÝŠ| p›ü@éðéð0 À÷cZòÅà mÚ@ ·`Çðèp|¢÷qh9aD’€XêDÿ2~ãEΆ0Ž‘0“èw IGɶ¡–…~ñ`8@¢$* 3r ÿ€}ô3Ú[2ª[EH$y£*‰H裊¤.É4ëQ¤Öå“ÇIÖÕ¤Oº è ·þ”~À'|òŠp´ ¯ô À]fÓ'h³~sÐ72¤ÆKmj_o „A˜åM¯T¨ÏÀ¢p‡’„€§àK`úY–P—–—Z±`ø@tF‡„æp"¹Ge@n¨4 ¦ B¨Cçò˜­à¸P˜²‡”‡üôu~( ™K§wošo0Q†" }†`Ä#ð€@¬ºù§²BÊŠ ™b]@ ˜°õ`ô TìÃ%PxC[h€˜’:*oÞ1HüöV‹HUKµòþÑ’Î5 ¶@]$0pÖ5Ÿ4 ¢Ð Ï,¸"ûJ}" .À@¶s#ƒ¢ðAèBï… 2¨"T91_ö%CÄ<_"R(½L¥À¹5_p Øã¦€ÊÊ’Œ_š% ^_(²…ø $G×—)Í äQ ±Ð À §¼(°op›ª{:^Ѧ³Ý ¶€V ­” B³(½[rÆš¯ê¦cñmg(° À*F «  ÐVÐÛ '‘B™‹àÀºÍc°âà #ax ˆ&AE%T/‘gŽ0 L‡° ÷p •PÌph„|¨ðÖÐc`  þžÀ,§`›.ð»ùâÄð’k   @ l1-HaÞÎ £Šàц¥Ð §°Àò˜«$ ÿ²Ò)‰aD•á}e#œ¡Æ.œ¡5 ¬€Õ` “@@“ä`ÔЀÔEë|:£3FÛ3Ì‘€Áõè£DºåXÍ1Iê Öå\cŸ´×œõt=JoK!ïð $Ð ì§¶,PK<‘×À„/! . i“ì ”tS‘Ò^Æ­7ˆ}ܹ$ ×Ðr(·sOøÒ“øu_AéLØ [T '²sƒÓLÖ@t]B9žëæ° B@t0-0;bþ­ÐdñE° ZÀ·’bæ@4e` (€•š   ~º»ûÄ·¶ w&ÇOQØÉr0$—úV P é°BÅš:xC*øð 3  °Â NÆVð!4Tôj¾ï} ÿð ÑŒî}³€ßÙAÖ2{æ W.pB &  ®.äVQ¨Fñâ %`š¸ ÿðÖG€°åˆŒæMy¿p¿àé¥Íí yÇj1ô/ñÁËÒ2¡–qó‹%ÂE¡‘µ¡-Ülå·©°·°Päwp" PG®“@Ô×Q’çÖG´õ®4ŠFþ#£:ª4àñÕäq’”ôåø´ëÄ%_cZë>¹'Š“$ªœ ^ „ äq# ÂÀ¹°”Í¢ƒjC 1"{. Yè1(0”@ &QK Ò^Š^ ZðøhzKˆ.CʽØ/'yÈû%Lå›®‘¾Yƒ“$KfêÍ`]çà ÀP A0'¨ó½˱ Qr e Àß àÚÉ€ÆÞ å§~Ê·²Êˆ€’~` üÓìV0žVfæ¯ °FÐCøò!ü  ZBîDk0ÑÀ?”p!^€ ƒ6/ÑÞŸ· ' M¼Кqþ£XE¢uª\$´ÊbqÊS0®ðÐóïÁ4¤),—€ +xB“.]%V¬H‘Âá¤thèiÓFÏ&=Ož"“4§”Ÿ\¿àÒËœ9I‚*)HTIƨFuM«Ö¬Y¯6È×±[ÇŠE6ØTmÛÞs{¬íºH·ì¨0uáN¾@û‚bƈ;ué@¬žÄŠ7FÌâɉË\.³§ Ì/k.£83æ=¥÷8pa;w¥Ygv}¹õ[$† c® ÞÍÐéûö1c¢Éã"—¢w¸‚è«0,Ë‘S’®KEK{±#y~± A]{9?úvþYÌ[1öí´g¿¾X+õõ½Ý_ïíš$üú½µjå<Þ)¢”R„)Å…<:éDŸ\rÁçÁ\\ð|J± ð¡Á øà£‚ †8GB’ÁÃ?”y€ehãkhпV°¢wP¸A )º‘âXK†°•ÿð{?WžÌï€ÿ”ÃE=ä¨À–?: CŠ„8Ç=þˆ†+‹ Qšþñ§Í#•"‚LþØe®XÁˆõЃJ¸+Ç¡SŽ ¤NOn9BÆCÎgfI'’H(§Ê9â!ôÐKà O¯à~(è”]håÈ+$ꉙ1L0Ál°iþ‰•tB#ztêéZˆ)!šHv9â aÚiG˜¦˜úà*If!®ª«f‰j¿­®™¥¬°´Ò6-oÓr+\q#YgŒJH¦r $Þ}·ÝvmˆL±Å‹ _ÈömŒ3Ìüõ÷_ÏîÌ4ƒK‹ µÖT»,‚2ÜqÀ–܆ç¶!†1g˜ošagˆYޏƵ2æš7N~£”qþøóIü"ZŽ8B˜qÐ 9íøÛT!ô(-æ=IŽ8àøÞƒ¯¾öò[>-æÓO’<ü B?†Ò§A ýàZBår±&l ñ1ÂC .æ£+þ@ÁœfŒ éH’::’ÏûøQæÃs¹A!nþH˜dçîV6B²Wôpå?%—ÄO=׃Ÿ+”±†²ùÈ Hȃ+¢€QŽVj áìfþ([#¬ÐJFA…WäCTØÓ”O¢ùˆ],ÃCŽa•GЙEf´é3ÍTú:wùt—BMµþ„õ¸‚nˆqÄtÐ @¸gŒh˜Á5W4Ðð„„N!~]+Ñäˆ ¸cU¶â,«LË:_A Y¸ž-kA YÔ"®p­ãua…ê1‰½¸ ^„We쥯ÇðK„:˜LeîÅ™€­p3[ŒgV1™ÆepØj –1ˆÁ¶ÂðÁŽþq°ã¹0†ˆhcá Æð.Œ@“uM¤w|E‹K¹`ÍØE9¦Fô$ä! H1ô„é­”ªTÐ’–4ùÈç:êiTÞ¡¡¨xQ"D?¸@9_ÃĆ9”íhF#_×È/ÐÀˆkQÜ\1Ÿ')C¹Ç&Ð ÄÁ (ÑŽt8’läHi\ã¼àÆÝG7âÇ ðt9pÀSðÛÀ"9äR3ò†”Qˆ ƒu!˜¤?RA QD_ÐC{ĉAeªv»ˆÂư ÃذƒnņHozm$”ŸäY(š¢Px"‰7vÁ Oþpcø8ƒÃÜ!B ƒ‘ð‰vÊE4&¤'>ñ1èPI"þ›ŠµfÑ «ZÖŠµÌr­o‚%u [ HÁH¤â‘Ã-J X㾈u*ÂÅ<†„”A!P…š|mf…Guá ;“°ÓÔ5? †ÁPS‰ù0$ðÇü0„”"8¹`GþàUtü4+H¦f üdJ¡-FP²à³bh§~•z B‹bäá ™BOô¢´7Æ1iHƒÏÓ4µw¼C2Ð r±Ç\øAʑà ‰HküÁr°Xg…ó}Á´_P„%ßp:Æerq+àÓâüñexþ¡Mþpʶ¸Åé!“ohe‹ò€¤<©··Ìå ’{‚\ž`Ï]?Œ /à wºó@÷@#tV †  #º¸£*v(L‚=4+Ô=ø‘¼äqà·€„=ˆÁÅH¼“:qg¥wÖ³j¨’.OÁOMÌâDÂ$œ‰!t~óÓC’½"4W퉤D¼–ý@å£ ©V8R¯H¥bq1[LJA¸¤b©Ô-*ahÔôÔéƒ ™{™pÈŠI¡@ˆÊ¤ÞK†N– l‚Œ§£‡>¤¡-@åˆEL ÍXE*:a‰fø#‰¹øÆþQ väÂþÌ×8Å5v(IàCYÓ‡1Rá²ël*ÒÐNÑ,ÚŸJ;›jo¥ªG4šM¯…=@¤å8GöLͯ ªìºfH®•§±€Ü섎 Z9|ˆ7$0ÇþpMKâ¢IÿP.%rù$iœ•·„íô`[€Ãð‚$—Ì'—‡#n‹0ù¤ŒHN¹<8” ‚{ ¸ÒŒZŠXã ?°‚à£)XbøÃ (¡‡Ò=àhïåΟŠA àŠAr! |œ ‘¢Þôë³A•£À*(‘'9d¡ÖèaÿV‚f ãM°ÄàŒ„,Ô{U(;;lWO0ƒþ¹j)‰EzÀ¬P¤×Z`XŠaÒ?PÆ3WK/¸a±ˆ˜9òá‹ ƒpÈ=]ᑇjä|mƧœyúe†™^Y b ~@eÚDLËUÍúxó` ñþ¡DÅ7Øq7óÀh×Í$!ŠYäAADÇàì+ô£ãFóÕ^ÙÉEô°€Œ,ÈÃ5¨‘êIoàî¤^¤%-iö\c­zC'\PŠ=2ˆy Á;hH@6V9p „sìA_xp‡xå oüc'À}îyÀh_ÁvÚ=?’‹ë]ïz£Æ¾!Üm¤F‡C6â<\W—¹>µ9€ÛéæNÜþþ øðˆltÃüÙ€À¹›Á+øÖÀf6Ûž–Qâ ŽE3;€€Rhb¿ÔË”è&È8àyˆxÛ~ø‚ÜQ7áaV¸M€•c8à9C(”¸°ùñ°·²ß±+ßÙq¨„txIa )’ÉŠl±ýP‹››¹´¸†µh œ£ ¸1Mˆ–ÀXà ¾(:![²|Áƒ5P:š ˆ%d²ê)#„²Í‡¹!¯ãÈB[ *¯£¡:5Šù°û\¸Q;Ú‹«æ(À‡„}3"E8„Ð0KI+Ë»¨ [(†*£„숈RA4´¢¡”€þ3oX­ª8cÀ¼ñ+y")½w} ;ì!p€(ª`†/ø~¸‡uXM`E&Ø„(8(X‡(p„(Àì‘5á>åR·˜ °„`È" KÀ‡7¸%Æñ†xWrO¢­¨-ÆYW𤙛ÌRip‘ƒ¥Ç@Àe Q%úJ+i€GoÀ…,Àaø†vaÀ1F+𬧇¨žžÈr¸“ƒàb¹‚h°€10jxHj •[_‘” Ì ù¹0”Ð4ð4`q{°;‡l©\Áj©‚Š© î‹‹þ“¢¹ j‹#ãÉÛ1{¨)rð(Bx!²zE%²Ê`Ê%„£¡ÈPª¥2‰©˜a q‡­Ë2-£²°chŠÑ:1‚ãȼRˆŽÞx}˜¥²P<”¹"“ žþ‚³êQ¨r¸†è8û‘‘Û"@Dš¼*¼r(ÄBs§kÕ²4c¸¼©¹†û°ÄϽwø‚ÆÒ¬w˜¬\¨×Ó—%܃ø¸X&'j§(`EMˆ‚hÐnˆ‚(O¹‚:¡7/øK‚hBÈkˆ»uK&ZÂ…Ù¤ät¥ù#X@¸9’Æ ¿a#à‡à#ø °þÛ*µƒTJ iÈk˜¥QÈ9ÐhqAüEd4¼ª§ÿ¬CÔž+€#p…BÙ'WìMhHM0`…Jð À²OЉ]Iµ‰ùщŒ‡°D@„j@’¬‹•D1iiAn‘ ±ÀŽ˜D‹™»ÁÔIžl‹–"¬tê1›² Â~a2Æ0ªÄH2%;2 ¨û){±—©äŒš 0Ë­´²s3 §úº P½4«€qÛÈ‚kÀ‡ºKQX™è„áb+GÔWH…JŠNšbðcذKÙ"LñÈ\鰈ా4,ö(.ºJÑ+½RˆÅ.vÌ7þ„“i…§‘ÌDÆúP»,åÀ‡ ˆ€ˆÂφqøÒ,—1 jƒ[Õ[¸ `ÅpâÁhˆ†ÙœMGø½]c˜3 ‚Xƒ&„ðí‘ÇćoÀ€\P†ZòWxߢ-0­¸y%(Q†øÕ¨€spÀVpÈ·PÈ 8Hùx:Ò'RcÈ+h¤uÀ†TÃãGLi<‚ÈM•× Àž(à}û‚M0VЄ °“u¸‚à‹Š„ÝøÁ qÀ‰tБ‡S‚IhƒIØ 5ÉMI¸¤j)±“ ©PÑT˜Á›Ä9ÌÉ–Í9» þIa‰€† ›"Ê¢€})2¤RåÙ!ÝQ|ÚâŒ*ÜÕˆRB ˜ú!ÓÐ2ˆ[@#Ø…C‡/J"Q˜,Ð*ðc†Í›»…?ð¢ð—±†Q˜"J´"Ù&…òHLiˆŽÓ" ã/í`÷è3† Ž,ºŽ#à[éQLÌkÄrœ;*-Ð ½/0¤Ë4¤ y‡J L[0B`Ú! „XÓ,P00ÝÓEÝhˆ@eÕ1`E ˆÙäE°†+eÐp×ö¸†§‰ÌkÈ…gÈßœŒ2¨}H+s§¢Q´ö8Âó•øõ±eà/hWøÙƒëƒa"FºkÐ3¨Îƒ/…õpJˆÌq¢ᨠ(×N8‚Vĸƒê“áîAá°k_XûñH-ï¸SÈ‹ÒÉ0„.À'0{H 0 '`…„â[Â3£7R’\X¬Ð»sÓ{‡VηG˜õ9†tÔ'ã1üMöäÊ>]ÏU0UQUCp|‰ ÕÓ$tU^…_ã€ø1ÈÕ5È„86dMN9¶û€Ç] †JèRè:Ȇl°˜¯`"¨tp…ÿ™¿)JoP4sRÕ ‚6 ‚EìÛ¬<°ú"(þœM"£„'h$òö‚ñö‡¥î™ºäS1•]Øh›owÇÎùÚÅìüW ÷h@—- ŒÁÐàFØ€6Ø€jàG“qâ˜1‹dðà‘#ÅŠ) RÌaTGRKeñH¤T3ZÜh°3;âìA«¦däFäÈ5ªsG„6tФ‰§&ΚxvêØyS 8yæÔéóh™¤x’:°%†Ä[RŸþ¶§ÌwO‡ «*& t:uÂÕJ˜Åòä)Vî%GN1ôöæÁ®b­òF“ && m7Æ6`ÀŒ1dˆ50Ô°¥ƒ Ì-öìo¡6fL4jë˜ð?ÆÝ8DÁŽ1ÿH£‡®¸¢Ç >ð`_”ÅO˜˜‚Ì+¯tƒ 2 ¨@‡!!ÌPÁ3ø“ % qÀŠ 9VŒ1ø 1 5Ö8D.×$TÙ´”s€mzøJ&lDA0Á ðÃ Š¸UÎ) Dq…2FÐÀ?®(³ %§xYÛ)Gì²Ë)»$À?øŽ2ÊøÃÁ ðÃÏ u:÷?þÎÑi+*lpG :(¡‚L"HÐH#Lòh5ˆl€ˆ=•Š$N%šIBuÑE‰ªQGErÌA‰T©‘ÂË£“¨CNÜQQEéªëO6ñZÆNJù”°KíáÀSŒ•S_Ù²G{ØBB3¢XòƒðÇÞ\# %×¼ÃO9ÒìrM1]# Cżî—GP‚ËÞ¬ëa‡¡ %d“%´Ð)ýN‰l›]&‰$‹áˆ&Di d#Z6¤IA‡•x2Yl“±@[cX+ÐGoÛ¼ÑIqr¸àòÈe±fs sÏ=ÚY7ÝtëHÇŸwßgßþuå™7´zò­‡ ÓØÜ‚zOÁÄ þ%7K*÷ìÂ×s®ðÏ?>ðÅ  à³J%ÓÜ‘O0-ëÕÔ€ˆö\ªM$ÜojF*êF¦nzK$•ˆ#RööPZlÐÆ*áÚë®5²P6á¯Cz“¥ø„&źÉRˆµ‡d™Ãrþ? Á°õ«hG¢¨Š-†¡ˆ\|ᔘËr o”#rÙØ\Òå%np&LyЃŠä„„´â~™áf"C‹‡ƒE›áX¿0²C‚qj'P ÄL³ˆ¡f ¥ÁD6HA04°à2óCÈDoøÆ\ÜF~#à¼CBYGñ€à8Ëvx¶‰{¬c›XGv¼Ã´öL§:L¸!Þô@žÇ·¨D|Üô[0’†àvÖ¡ &ì' –´ä=N0§4áã¿Â?H1 d ÏmnóÅ>A VÜ"¬ó’[æâ9JP¢\d³D&F°†5DÀÀ…#Âô1ÛØæ”þЃÊÆ+Là(,ñ Ø”¸‚?¬¤Œ8Ñ A¨Øëá‰1ÁÎ ²óÇ8à…uzaNW¸ä®ƒ)mrsÚ0Q røyÊSó€¼€Â"¸ƒÈ«H!¢¡–‰ú˜¡©M™#åKª>‰‚0SÉ^ûHòªäoW?ÉÕþrò?¢°€ V’¢ˆá)P1‡2Þ²X£ î@–Ç`à¥ÇD1t¸`£P—Bfé‰b–c–²dÝ5$1Â<äE!dš ã"0ƒp¬‡GÐLe§˜ØñŽ0„¤ 1%šæat Ã\°1Ù¤•tyþ‡"À:Jìåd’Ð$ò‹âÄì FÈBüp¬Ñ9vÄYt|æ3tàÇ ‚† óp‡gçq$ ©ZôR<•`|âó4ûPƒ‘ø‰Æ}˜ ‰(˜`»¸¾ðX¢¼@>üI¨·ÕÁõ('Œ)ËbÖ&!c×/&Ç ÁÍÀšçXô£¾A4°†5”qƒl ãbÀ‚5hà /QBt_hÓ ôÐ&=ð@°¡Ë’+ü`W<`ÀÓ xðÎ(pã’Q˜ç”Д'~hÂN˜rÿ©áúóPˆRT#Ô1 ùÁ¢РH/ÅÑï±xS=H%Ò‰¨¯«rþ"ô—“þ•”&<6 ¯Nzÿ•ÁW¹Š‘‘5„?ä¢?È‚7òÐ tâÏÊà0€gT GÂ7¾‘ ²àc„t©W`ê5I|0`ÅÈ›»Þ…Íxâï0](‚/Ï‘Õ C«;– Ð!®Óˆj&ö°l”&*¸Å\`³7ÿe°ÅÐÃh@Ip±‰-c'Ó‰,@¶vllã=:èÌqŽ8ë,ù³žñ<²·Óù#zÌóG@:jð xœöëE¾GhðA~&¹Ÿqà ¹˜… 0Q)\€ýŒG¡lp‡-Ô£]K˜ÂÔæÕqC'˜ÅØ1Žuâ˜EBþ€y{Ç|€›@pƒ pÙ ¯pMóAzÉÀß]¬ÀÞhì…¯ÙSÁ †7ÐÀ Op£ãŸ'„çiL|bwðņS¾áæ*z‹ ñ$èW™ã¸RÚ[ŸAã·x瑈ÆF+!ô@¾*Êó—tœ$ý(N7JL‘Œ•¦,ÐC0q‘Q cR!9þð QŒÃß`ÇÕÑa ¾xC ÉC)Œ±‚ÚìÂvoLÀbcwÎØ}ïqͤ‚®Šõ‡D|ÍkˆxŠh|bq¥k6P#~ á®síÂ.ŽÄAÉsòY'øÂi„±¥ô£õÌLþýœ:áìf'€u^³Ð:r´“4h¬s@–'´æÃ-R+žà·'>KcÓ*ážñ­•×Ñ„ÏF±Šu`ƒÒž†)¶PF¼Âû€òÑܸ‚e ©¥[¼4p2ƒvÀ6˜À ¢þsȃ‹æ}~{¯ ÿWè]ï¬:éÁ( ?øƒ¦<ˆ¬*èÁÃ9H‚4à pM<1XÇq\ßÙ]$ƒÝmœ`EƒT$`Xr ¦  ® ¶ ”@T>D9@#<ŠüDʉÙÜÍÙAÎ СúðÜÏ}„ÐÙùÿø"ÝŽõ˜ÐK±8@La…´LþµdA)Ì€ºÃ0ðÁ²<WTÀü˜¡C|ƒ?´‚]˜E”ÂBÜ…#pŒk k\‘'ЃÝiÆj r†D,„Û)g4ÎA¼ÆT‰ ¸ãÉ•ÑAåM塆$fƒø™z g”C—4`¼§¹¡§½Á**BÌdÑ ¬ëÝÃÁZguÀÍHGvl‡‚éÌ:˜‡#™GñGy¤V!AÍy Íò!Ÿ°‚4#x4_4àÖ$…°)@Â'|Â4`ߘÂ\2l·iB`0¼¸tм„1TH=ô€È‚ ØƒÌ ºà†[*ðŸ×\þA=é4<-­À胘=醸á Hƒ4p͘ŒI0­P$Øv¤'ÃÆ}䯥A ”9œ  ¦¤Jª$ËÅ LHO£Ä܈m@‰9ŠÙNâ¤ÐaƒÐá¦0C%èØO¤Eÿ%P˜”J!9°`…<‹‘ETå´ ;ŒÝXÂ8 pY‹@Å04C.üÁ ä‚"P‚7¼C*Ø‹½ÐEºüa*âÒ1"= ž¦$ FBU=D§džu†7x‚˜B\u^-Ñ$ŠÆ¾ Ái˜† ââ—0DŠ˜"¶Â5´Â°…1œ¢1ÌÂ,œs¬,ÖÉ-¾Ñþ©m‚ï¥Vuìã#ý$UGy¤‡#ÕÇj¡Ç°=#x›3._lÝÇ}¤6f#8|B=t#öMÃ`Ìp@ºÅ‘ 1´$L› æ£]oˆ"bø#‹I<À(?  % Â›QÂ. l“é$H~=@+4 ?\d˜hQ˜°Ž_­Îö1C$pCƒv”=,Áܬ$†fh†ÊK"£(”ˆmÀI ‚PŠö\ŠÚPFÂ~&LcRPR.áŒÆhJŨPÜOO4%=eRÔT$Å é6EUBØÍÀ ü5”; Õ`‹S ƒäBþ)p‹?ôÆ;¸e5­ÈB°%d`tÍgl$C Aäe: 6襛ò%§¼HBLÆ)xB f\ÉUcòÛcî¿Ñ•yŠaü‹—x¢4xƒ+p&ÉèFhÒ@**iÎÂr¼â*€€,V¥fáÏ/R§R2~*.’V®Í#!gí}GxÀVk9#+(Ÿz¢Ä8æÃðé¾õB ìp,t5¬º ËÙÆ¿pÑBpѼƒ• ƒ(”B.d1øþ.ॢ&ëÁb&iê­õÑï‘àÑßò¦yPÇ­ùÞÑîÔˆªh‰‡{ãy¼òñ¤ ±5¼Öx°ñ{(Ÿ3 ]¤ÁÜÃLqÞFÁ.7<(7ìÂ?4ˆ¬Â=Ô1ð@öC¸‚|A7µK»ŒWm°ˆçÐEð“ñ˜Îƒx¨½¹Ž—däXÑ)õÒÚëFF=0C:„Éý«øö²/7¼$LÞàLÂBCaωژ®F@ýE3ëÏѨâ¨ÿì(O)'E0HÅF¥M=‹¶H- KM‘ÀX†w¶p‹³uB+CЏ%.H‚4jÀhô^=ìþ3œÂ ååkhÃÒ²) 4 »)=lä¼¦ã™ÆãE^åqí¾™A  @ ø@/ šx G§-1¹º¸m)ˆÂ/T;”‚Ú‘¦àjZqjÆžgmÐTàöæÔÐ4kñbà’1iýâMæRãúZ%Pn° 3Ûx0Rð-5#-Û ìÂ:8‚#”›Çqƒ#ØE¨Ý×,ä‚0Ì \CÇñ ÄL7ÙËBTU‹Ô†Zo1Œ‚4`ñœìtS‚T€A'Ì€2àÂ;xÁ\4†”uIë4†æ1„æÕékœBtâ•ð 7mÓJâ1Ã>3ƒ=ÄÀì$ä©\A¢h˜A˜×ÞÀ%ø€ìp ÄB/L@ò€4ø…a°K뜋ñÊø(Ý8 ZΟ&,ZqC¦®Zvü‘±nžo $e‡&¨Vyèž Ró¢njBí=£"±ê{´Çk-S‡8}M} ~C48Â.xÁ”ù胕>à ÌA'˜‰è\òé,D*ˆW¼uJŠÈËñ_•í´ ¾)ïxÃ7¹++ÃëþÀpà¼Ú+=8h4„g%ä2¿Šco¹ø²œ—Ë„A!T¨ƒˆQö«p6gw¶R3Ó9ó¨TOK°™LíAüÉŠAæØBTˆA3DP9Ó ŒÓHTšÃ0pØå äÅ;´™mÁ»ÔF»lÌCEí)äe§,m$Ã97=´6Œ/\£ÔA\À@bCO ˜|w"Pt Ô‚y£÷°£½ZƒcôaHÂ;Œô“ŽÃ3,Ùhr@üCKKßg’mB,[ç¨î#²õ–vìšWÇt å2Ÿ¸wj2º¬jnÓ4 »‹8j©G®=ͱM4DþÁ(C'ä‹ëC) ÂWëC*\Á™Z›•çU•ÂPðrïì0²–¨ë7A +Cï)üÐÀ„ä>ä-31$@C 4‚÷r¹Ê‡oóÄ Aôˆ@¼90¡ýJóQêŠþÞ(®ðïÇÆÔOÕÈ=T@T^åV:²ü"àÂ(K”ªöS ƒWAÀÀ7]äŽlÌ—lL5Yúð3 ^ÃrËFÜòÒ’:,¨ƒñÜÁ¨ºÜ‹cd.Ñ ,€¬ƒ- yï0F;|¥{ð)ÐÈü zâÃ7¼ì3$»0 Oñ*p´¯‚ô€#£šKxOót!#þ.Ðsqºk¸…Wh°µjë‹oªàZÀ¨¶*óÅS_Ç:œÀG꾻΢ ¾iZ½°‹&ÿc /SBïùì¨ ÄU`['hôþ5ë(´öïaÈãr:Œ÷úëÊ?ù7OÌ+áÍçü4ßo›³9œ ý×õyŒóV|Ã3ƒ¶„À?´B.Ô @ûa뇂CŒœàÁíH±SÅv:pêÔ5c§hÑ*wêˆ'4h<Ñ:rŠ­HôÐhCécÊ–,#©t©Í¬FêÜÉY‡çŸu.Hrƒ(Ñ0aZ$UÚ"֥ˎíJà‰jUª)+vàZ«<¥J‰bþÇNÔ·?èfÍâðoU[¶«F­:ÁïÞ½ îÛtÏC Ø“ÁÔþ"lè–¦1&üò_lØX±Â†ØDçMëL$ƒÍ€V¦/cÛêÑÔ`ƒYMmóèÑ—[ƒ©tëÁcÖ­³›jTAFñXñಭPiÕZ®X¹#Z?BéÈö]ü”Y1bDYyezôxqu^Ï )Ò‚ŸÛ©Ü¸YTM:fÌÒÇ7.È'LPÁlÐÁ!ŒP tC /ÜPC@@ÔpÃ?Ì0ÄQìÃ2ÊØÃÜÙCF1HCŒ ~pÀ[nlþæ‹rÜ$áãŸkÞèD˜qH†Ì© —]<±è oF*‡:‡F’O"a¡!IŽ@ã”ZRI¥S>’鈘Äá–Pp‰œFȹ`’=÷ô d¤Xà3̸ ¤–j $Âp¦~Þ ¬ha!¬8Òêš<ÞñC˜oJ1KEfÁÅ8ãÞjkN8F®N¨ 4Ãþb²Ðpý0 ì·ÅÆPì±Èv•ÍØ¿ã ²ÁdÆ”ÒTSÍl mZÛní502ÀJpã•Wj~ÕÄ0&‚[g.=\aÎo¤‹·˜î¶‰#J(Ya…ñŒ°¢<òÎÇ\Ñc”ˆìþ=%*½4)£Œö³Ê#”´ÑFq<€¥¤ÐãAYBuÀƒE<ܹ°DAÌC=tfG¼° wp–QFwn$Áö°åg[†øƒND©`sBÈãk„ÑG?ž©àQ,yÒ o<5âˆ<¼Håˆ<9¥œVйôKùXH¥*zè©ø#“ZjSœ=a™D;'!‡œ½¹ ð-¶˜ÄS¶ðéd0ƒ !WʇÉ}8‰XVI…’]ò éᑊ¹¦˜ ¼¹ÆI:É|JÉ%EŒñg-â:®-VAÅ®cXÕ 4Ș872¿†=ìk«¬ÚÉ ­ÚÖ4ã5°Îþ: zÒRÛì2Ùh»­ÙÑ®Å3hY¹·ãC“h¢¡FMváAoæ§_^éªw¤#v‰ß ~É”XôÀJÌ#‰FÖ&±º¡AÚ¨ 8‘%¨CPÙAB á„&»Š`Vš­ðe.ãŠ^XBF€E,Ú™Ðd¤#ƒ8€Á;,ñƒfÈ¡Æpżð®V„x ø° ~#‰~è„æŸŒl„nj# -VF—¤©bÐ0c(öÄ<©cØBžòõdq€ZÀQ §2´`Œ"C,@Ð a^òIÅè4u $½‘œ’š>Ìþ’…YáAXÅ?8и´åØ «`«u˜‹ æê‹)·,Øô†3ƒLó€…˜ÑÜ"7Ø8^ó‚g½Ôœ{²©V÷zi€ÖPËÏ&öÈ·=[žï–°¡F4Ä{ðã’ð‚W1Þ5¿Cj_åØE–(qeðkœæQÆÀ”¡ž l# ÜÂ’IÕÔF?ðŽpðB “€EP‚p5C™ ]È"¶f! kV²2˜ìf-ÂY‹vd‹`­F?C3Ðñ 9à_ÀGÆؽáyb‡0e¡<¸Æ;Œà…b|éRžËÈ5‚ Q|¤_úHLdRþ1q@1˜ÄMÖ˜'u¸±à Pá“;XõO  CÈ@†Ê%eaEŠœ1 ± 2tŠ”„"‰‹$£:ôRÉî’nY‹&ã«c„²yé˘MD¡x¡Œ+‰˜à3€qæöL†ãY‹YÓ*Íi2sÌËL«WÞÊÍjZSšf “µ¸ÑL¸–É›Uòš‹ß(”¸Hc¸KÅàÎHúwJð`œãyD9 ‡ºÂ ||Ž а‚kCCÚTˆ{æ“jà…” ˆ 5ïy#¤Âµh£2c!CIäÞ÷¾°¢5Äè`£ ÑȉÁp€Õþ‹þNüâXÇ00 Wa<ÑI52G3¤A‰ê´Â+ÂÀGhºS-ÙG:yBY"–̤f´G 6з½Y5OŠƒ…UïÀˆ:la«ŠŠ¤0…0 ¡¬|äãQÂÚ‹ ’óÊŸ"C÷c裮yE‡^Ó‚‹Tò’–Ô¤&; «Þ`Ÿ¡^ð;˜¾Pï1LxM4'ó F™˜Ùžô³+Òdæ2§ñ–jÅ=ÛÆS Öm’ ­Ñ¨f˜´¤Ænx#›Þ¬Æ\ŽàA*¼ñøÁ•¶†¾àið"Á½Â ¨sžóœs…+ e/LQ·RaÁ«Á(ƒ ö#;à/jPþ€· ÇÐla+ÈdøuÀDÕÛPˆ¾wf%£™ íëŽ[‡ø¥‘ "Fh].¾Ð MsJì80Ž~ sp`y…ÙpÓ•ŽñÉÈØ”DBÅ€›L*XämOhœDâׯ«^@'w ‡qeÕO^]XÃZÖŒ'â÷€®V¢û¦#©ÉwU„ì¼PÉT±%U·E(뢬Qš 1Œdƒ×—W2Ï•ÈòUµöüYÕ`kК) ôXë=^µÆÞ´i›>è;¿v—šaÅ-Ž©Y[r‹Ï· Á¼ãE ´5fö?á¾õô0ÀqBþÀŽVŠ/´½ï`Ç0<„ˆá^ÈÃ."Ö³µ"î’#ö‘‰\*é°4`§¼oäHxâL‰: #': 9L1cSXÕ'y2E –¡q³†©PØ7éuŠ]`J+ðB’1¾€Žt" ¤ÂÅ•ãB“ZîF¡:®°îal… 6ælå7L4#—ªE0È–†…²FÃêè,{6ã³*´ì ™Z£Àg´nþ¡é6ÃϢΗpƒÏVk˜Pƒ–v£|À€B«|4¼Áhàh@äˆÖn B¸V@h`ÊI”œÃô€(º4‚ºN!ðOäahA¯Ú  BNÔá&$@8¦c(ï EÈ jE>¡2Oó6¤I¦„­†Ž hrhvÄF:*häÌašÁÞ@z¯$aôá~ÀIÑ ¢l$Á<¡®#¼¡쥨¶%<";NÂùª oúGpÚÂÏûêÀo.Àüp¬á.`ü¶ ¦A Laè 2îP 8Öê‰iþ¬ã]p®:á B@²qü!åââ¯L“XeöBæ"z+0 CMÀ1zΣç|%4üB6NC˜@kÐL£4º´L#3Œ®—*Á¿0VcZ®…4xi¡‡–š IH¡"INÀšÃ9šC¬à0À ¬À¬®€änÔ=Ðcˆ#¤ëÕ"a#XàlÒ Y@ÖúaÀ«ñàñ|MR Üòƒö ô`HCHh¢Xè¡ží½¢lhg‘Úv(䇞¤h¾0ÍtBgÀžèzè¤#Ú)$à¥RÍl0‚?êLîÆ›jB!{âþªrÂOzqLÁ >á0ad¬áî z&Anà(0 aH'µb­Š!¢ñ¤AÉ:Aë ²``T.±ŒU6a°øâl¥æ‚§ËÈì}‚‡6}…\~YŠ'0h3èìò   ž…ê¸åèLë5v%ê ò/°E5ÊZö5lê°ŽHœ œ*axà¼À@ :`€A<âÀváÓ–Ð ëÎ<¨p e>D"ð &åá&硞`Ÿ”  ~R TD@"¯(²A=&)9d*S¤†d¨Cô°ó"Êó"t*/j¢bDgtf…Fhvþ$õšd0à+“è\à~Æ¡†Ájá=<Ñ#ªâ$Á ¾)"N!R¡`âM˜áH¡X¶Onqo(xÂûÁp¤  L  Lá¤àªîàKmüz€œ¬.§Ž¡;æÅÈ)zë]ÞÅt”,ÜôoÿB€Ks¾±ý^nËbåð°Ê¬/µÃ\r3X^©ç†Å©Áè>+8÷;M£EP7LR\n‰1–Ç)Zøñ4ž…Ï4"qÃ*Ò Xõœ€4a.@€Êó) `=AÀ®àÓ6R%•ë<¨° }4&Y@KÊ¡?Ëá8¡Yþs2@= ÒÐ@t(ÍA±õc"àóNˆ„"J½ ­B½Õ è ¡š² h¨«ÒErFg~fG2ª‰„¤þ@ÁfÁJØJArr! Fbª‚ŠurÁiSø,¦`ÆÀ.`áNº¯'úF~(ÎÏ HЉ‡áî@¾”/¹o 6`Ž¡b z¡¢!òç›Ö´þ‚`‘Þ é ¯¾À²ÑàV^Vì¢U6Vê¢/ÖAÌË0¢V0Þ'š k |#š, éc1£7€S8ï±TI¡  ¥—æ \Z£Xœ‰¶zåÍÈGU+•4p 5£þMU³“U§a0¨aø6Á“6aÐSB ½€Pa ™P%Í©`\2a¶pº–5Ym2˜•’àÁ–t¼† l  à@4[Y—A`H\!Š[Ã5E,´„t`¢j×d¤*oD}WÚ,G‘†`¾AÀDA,ðáä*urÁGf`yô*ŠAá6ñ›pÁ B(°!-üa¬JsJ™O¬Êp¦ažÅ óªA^AA'î$OØ÷)z œa è(¢#<"?hlFIò`ɘ¬ôªBÀþie%8J) ‚#æœöio£IPþ²¶v àÑ•V£±þâ:åö³|³4ŠóYJÕ6 ë¸g3¨A¶V yþ"oNŸ¥ ú±Î¨3ˆS; } À ®`pAà‰'Aâ ˆ\!%çS¹ô ¹Úã%áCK޵&m’@  ä¡ ž ¤µ„uQ·BZ·Ž!ľêv½•¢òpq× ,T¢lF\ñ¸†¤ D§ÍweÄ£ âFÌ"Àrðá ¤!ža¾aÐòÆaFLv®€:©á²ª¦aôo 1ùa«€BOêA ÜÀUÝ «¾t~9e§p&¡°a L ãþ"‚92=ÖÉr7¢ŽÕ&˵€ä 2@tmZuwú¾DgÊ b—¢ö8\Uäuǵ¨M¨ùxkhg>Ôw…·£|¬ \à+®é²æ$òþ@Œ öã–áΚPÒzî¡fA0žÊK½4LgÙc¥ÀÆÀLó¡Æ¿¯pt|´Á9Â>PnÐMÈl¶¤+âj·ü¡Ôþa¢În±Ó"I¤|Ê«<´R5n´sƒyº–7½vµT¡-užõv…ÚXÒÐxeÑTãx\c ŽÉÌa˜8íÊUCmË–oql!ሉ›ô%=˜‹¹Úc9ƃ À ›\`ªð HHÅ„mØ{sÑ8¦Ã!à8uñ;ÔDFŠ " ¨-/(”wÿøvªÿ›[]=ô 9‘]„EÜ©ŸÄ ̲h¡0ÀœæJ,Ùþ†Á@®žaNàx`LœPÂàÌ N` ƯÆkœÎáp"Jyü “ûÀ˜ïàÆ¿”Áo Ü `!*¦Ç{œê]næ²ï´‚º¢~ÜTŠN F;Ê!0 U@\œ´á1J ¥·»¼„CØÙL8ÍÖRí™H£z k‰éœ©éxÃÿ95z˜Ïþ+2¡¿Å¸IoÇ–^€`(ò…¢)ú»ç§]š€€• ]¡raRaúN-3Ý¥ ¾Ÿ`Ä+òD]Ô÷Àò<4)mFhø[†\ýdô¨íõØþvgý d¤w+J‘uÈFhdø`šayå€9É’‡á¼!¤¡ÞÁ¸a@ LÍ2/af HÁ Z¼ûj\ÝÉAò7JSv1ÿ¯áÆï·`(„`ªá¦a Ä¡ÇãF´K&ð=%„|RäÃ&C§Þ¥¤AÚƒk~0롪¡}™º™€±}]µ;-Þ"%2´| 6äñ—hZÊܸ]Ø4pp:©¥ü±G{ª¥7rƒ•d~8é\UX‰3Ru>!…Ñ êJÀ¸_‚ÒŠ”øéáçMZÂz”9TfÄÈC‡àüùÓãÏ¿#Oq¤uþŠE$åX˜<€%'yU¨„ãÕF‚@jÚ¼‰3§Î<{úü ôçž`{Š V[¶Ê$Åã¥P“긪V©Sºs:U*UªaËèHê´Œ»=i‹®uà ¨[bHŒ#ñÝo¾(zãÍÛµ_üykuäÔ©b»vqXæìR˜K—œM°³Êɤ uêÜñ|'´èÑ"Dƒþ¼å²;Œî”fÔ:_ë]%2“hŽOдùþ \áÂѧeòÈb×ZãH‰Ò(T<¢D±P©&Lœ8ù4mš)¦Ê›?oJÊ$)=Ü„Ÿ¦¢Þ''8èC‚„‰)V €¡Æþ† Ø`ÃJ‚$ÈJ îGŠƒ¬DÈ Øø²!Ô`CÍ-Øx`€^Ø_¤,¸ „+Nx!+•–Ve8°hZv«åN\¶@BCÐL.ø”ò‹ïäB)üá*‰1wÍ GèÑê 7,ÓþŸà`Êí zh䄆kk¼†Všù#ä {nf˜!„ ¾Éàɳ¿Q[\µå,gäÜp³ 7QxE4·°¢¹ùŠçF¼ª­ÆlŒ¼ÒºhݨK޼åMb ,îåKßvý*h‚0>8¡ƒûMH#6+¦Oà€õƒh "VìðÃé/Ø ðASß„Hað'5'K™'<™Í,I©8RÍVà(=Égx€2V04~ðcÚJLbhBZŒ$Š)Ô ´ä T³šÒäµê°kFaËYò†§=D@,da[ŸÊv6=!êP\ùWˆèF±-‹z‹®È·¾¼þ¡œjÆÆ1 #(B!ÞÀ…BZá Jè!–»Ü¦1‰-LbøœkBwÖ4¦;®ZÃb]o°SÖ²>!Žá@K‘‹¤Vµºt ”(fx”ŒF4,p‹ìLˆ;ßù,nDu­6«ÛG>ö±(øb•"À#:³® £<=Bx¡/'ØA?¼„„ø¾.h,E):Ј"&1Ș#ш.Æ1þP(€ú‘cT#'Ôcé1Å4 !bТåP1#ÁL¨@…ÍV  8Džñ‡84/üƒh+E*vÁ´#() IHBÎ’È0 TÈ@8< „¦@þM;¬¨E}£”(S\‹UÈR6'†¥PHTÊHÅâD©h¥+‹*ÊÝÜâI]qà0Æ †ñ}ˆbæÈÅÞð†Ãñƒ0‹Ž–q¹˜ s[@Äç$€ÇÑŒu¸@YƒUÖ c†œnì݇ÃQ¤##’Ĝžˆ%‰Á fT" ºOwž½ò¨«€,% °@V°¨Ü‡/dC:XªË<÷Úæ|p°/Rܧ— Šf/7–¢QC™·¸ÅF$10ôÇD SÑ‚8&À~íÇ‹feõã|¢N`…vÁ$J‰Y1®d$~ ¤J?{"Â3/xþ¸§pEȃ2-)ä’AK’P“$Adò@$š(\t¼äÀà’Ѩ,*.M<©Ýø–øêˆEü¢LZ—®eŠsËèèÂ1˜£$ÆÐñ‹qXÁþ(F+$á7ø!ŒñGn0#8စ=ÈaǨ&t°ô #t•«b-À dhqf—ˆ.„•‘¾AÃÞ@à”µZ(œ®'ˆdf¤!i˜óXÁI¹§›ëâk)O …ÁÆ#Zl”ÿê‹W´Æ3ï’×zÆÓži²ü¿6v° Ó˜ Ý¬ˆFä°ôèC"¦~Tt@ÔZ–A”æh7ot"¥þ(>rŽN(ã ^HH’ôŠ– D¸ ÐÃ#‡!þ¨H§û6 KSa$ˆÂÓi.4 -¨Ð^(!ÀD)ZÞ\{m-e‹ñß`“”¥O)[±›hÒ­ä©P_ñµçä[ 7Ú?àÛöòÅa|Ãÿà‘"ì cã §ðÇ :€Ž¨«ˆ€®BGÖî3Ÿ³ã–=ƒb×qµÅ.6Cn0ŠHˆUà¼Ûqµå¾…b±Õ–Fí·Qü=o´£]ü y1Ç7÷‡1*ä‚¡A·8ÐXá¸C# ˆ=†Æw ½Té}ס{¼ÂUˆIGŽÜ€ßdƒñÍ`‚°îNw5v$-ŽÃÖ…3#éˆk‘K@×H–“çÊk,Y“q(GY°ñJ â±q’÷^à3…ÞÿIùlnsÛ±Ãþ.÷âJ?w€ B ò“ c° oyàƒÐg€˜€ Û¸lð¢Ð X”pWÐu`‚Á3 ÐiÊ \U£¦vÃs Üà øè ,À Å4($-/¡ßÕƒ|g3!„ ÙQÄ(-EdžD‚ò'Q_QÅ&‘Wñ(j7yEqñ(üUEç`b ˜Â|SV=Õ r   |Àmv@ˆ{~˜+ñ6Ubä 䀆þ {‚ø+¿ÒŸ¡K v@·.f|Î@ ÌW‘`Òâ|hÀV?F}š8}§IÌÃI»ä!=œQ=«eõq‚å&U†~¦”eZ–X‹Õ~a†/¸Èrù‘ŒÀT0Ä4Zuö"¢gxYð“>ëp úà~Àtí¸ÛÈ™Ûgð o@ Šq»æ+F`Fñš4A³OÒ€vi mÇ4“•ˆBž0&;P)µ¦{÷ƒv©Ë'ƒ7’†¢‘xR‘Tô^ʆ'Sˆ‘IDâ(QÑë…"y$9$†)É…6ì°8¹ð |ñžìð þÿ0 þnp+Mµ“à“¢U¹ç‡“`bàÉ ÜÔ.UÕ”uTPG[ •ô%@±s•üf|7 |Íw¾Q ,°;20‰#ÊVbÉ W}Eö3RuuóQŸDR°W¬¡:ùà u~ç§C;Je¨dØSr±4/ö2›Ó»x@'0ýqssŒ¨e€Áh€"™.0sð ÕØ™_ºDÀÀašó‚«ÉŽ!®© ñú´Ò@ £æ¥9IÃ#ƒ¾I 0œôk5Pœ@¨ÈùƒÇœ‰z7xW7.¥ü%J¤Á (‰(isþWèlë5QÄR Ñf|3 $ Ú¶¥0œ§ƒ3þ3ŠñKŸ4GC):¤3 зðæõà–ꈞñ+ê0GÚcÚvˆ,F-àbËàˆøˆh ¢g5‰cIj}š8#iP-ºwyµïò98š£¨8XWMïC ·po ø 퀙›ù¥Éã ¼¥< \é+û@cOUÂ[§»à£F³µV•x‰/5¨zÇw?¨£øš¨Aþ86RÔR“êC€°l©©UA7w“xT¸'ʪ‚Ç(è%ªss´G_˜ªÃ: `T†f  r  ¹õ` =0 °P=°~ø”¢³{° Ó ÕPK=R@©a ÊÚê`â  Œ ­Ë È¢ˆØÚbf@ âà¸\Ù|Ž$®(*WiºF¦}vu¤á‘© ÔHùðWty¯D[Q4Q~®«#oÛÃ=ç‘rböXNðrhF0ò°@'?.2!{ K÷ ÏÐë¥Ë™` ø§PN‰"4ÁŽO¢ Lâ³Z7j<0 ü° gÆK„ÙK¨u@vp@¼d· “I8íЙÀ ½Ñ+²tz &»-V²šO¢iVð¦á zà z uŠÁ«° BÓþiBcÉìëÜ p°³vC÷;~õª¿ YyuãÀfÁRyNË&‘g3µéùkç%EL16Ž‚yu±’^X`ðÊp  Ÿï™hþ€ Üd+îg qÔ/ü¯w‹îGqœ¬àâ­Á!¡ rÄW|ËÀ š»|œ+–?&¡(ZdéЉžŠß±M5,=íBJù`©e!‡¨°«kS¨Ô¯±ˆê"Gr”ïA>,§KpŒŒÆË »XM÷p ïp™«™¼0ú ‰QN¦Ù2ü ¦ÑšOòuQb3it²< 4à@Ó5­É«°QàÉÌP‹w÷‹¿þwÊ é_mgá„ì’Ú„cqR©^P½‘lÁ¬7bà_ÿõËæÀ7]Ý7ófÛ Æ¹ðŠàt°Íæq·²¤äPͧQÆ/³XïÇM·bÞüˆ›c '¹ÆG¹aÛÊ•’è íÌVÄ€éP gy®TŒû¢M5L£ÒÓ:8ÚÏ®{¯CíÅ"ç 6°:Ö£Xä>õâ·õ óaƒ9Yv|Yõ ¬°A sÀ¼™9ëÑ™0¦Å`¦@²†üàM½Þë4+ØO»°¾—<Ó Ý0š »d<»[^áee5¡œž­k½†´OáHEþS]7È6lLEŠWP=xLsÁËcsy–Þ÷Í7Æ7æðbô‚#r€ aíÌW†Û9…Û=OÉWŸÁ„[ëM°` Úz°™ép ]àoêb†°¡ê,–+žØbI ‰¢æzdHö¢—WðÚW¡mJÈ0KÓàåRôÅEKЀe»[ÆDjî±Æl\. ´?N c`ÛL‡]ú¼­Dð ÆP*¤y*+àšÖ½¬9vɬŒQÉ«p r¾ Ëç ° '°ÌÀ³µ´ùÝá-Ðä}QèÕ-Å(î ÁSäRGR#Eþ(€r(pãœêõRî ¥Z2EvrÁÖÕà€“ UGh¹p8¡ÖéÒàÞ³.ºç«›Ð—ÝMǺ”p= éP Ìð,ô0â7`|×jÄ7ð,…‰ÔB‰ÍÄ‹ýâÄ@P ºèú‰}.3špy0 „`žæ@$å Ä|`!p¤p<ÚónônïýÌϦ„ïõŽïýzXùð 6@РJ²t3¼d³˜ÆR >1š/c6*åwv³ [z[îÑxð߀ ÏÁ¥¹ Vâhnr`­éA4%à ‘ü[k8 «€ç­Ò*ÇPç`ç p›þ ÙaCÇi¨ukW†èº¶_ŠîR‘Îèì½Q…é (`¡R»b0xkSúÁ\’ÀŒECÐ’fmFÐ ÀÌ¡C`“þÐyÝ9 -÷²TÆM¹Qpëæ!¸äQ¸­·{V áâ¬0%ÞµÐbÚŠÄŒÄìÐ÷ì?æ Ö÷p£{WÝW'· æ` çp vP Õ ˆ° ¥ÿùú*€úˆÐÇíÎC^{@µoû·û¹¯ûº â5»€CÀûvؼã ŸT Ó€ªívûÂ`º½îPûÂû$ðÑ"{ ¥23å0ò^0¬Í@þå¯þðäAa3z óˆ²'q`ý·ÿ7€óp÷`=½´fkz$H!AƒP`ØÐáCˆ%N¤XÑbÄ2{8ØÓÑc™ŒÝíÉÏÉ“eÜ•ÁSFÊ” u¸„äM’e”ÄÙÑÖw¶*°UÔ–I$­0Ìœ9ÃH,5wΟ4Jތͅî›CÓ¤˜º@öÂY³Î^¨ƒìÎÛ:[¢kÊÍXS[ØÖ9;©N#Xá´iS5øÉàt… C¦E 2f¢¥,nðåËh´¡¡‡ÆÓgO´h}†A†bÌÒ¤aU¢&HN>Õ«‡×8„ ©¨Ö{Æþj¼©P¨wµ Ã{7޼¹‡æŽç]mxuçÕ¯OOÞ{{ï| aÿݼ#¸kM­wc×›jÌ÷NÛ/x#Örœ¸ï ìÐ@‚BŸ Š9‚’#¤dÜámš ¦ù¤ši¦ðGe\y@W¤Ñ£JNe•™%9ㆻ¡ƒ@è`MҰǃ6HÔ Å”¶²‚R€"‹’TrI&%j$¢T)'—¨l馓P.YºI¦+mº2§+UúÒ#(m!A ŽJæ1Ì‚q’²³‚!†©`œ ÌùCcJiæQŒÀå œX²ô*k½³øþº™:àâ ’zêjo,rÈ9«‘ T¸` ,³¬ŸÊÒ!eŠÅ«…Œ0¨±L›Y1ÃŒ34r-´S<áæW`-°€ÕZƒäØÙ¦™Æ”1r³ƒ7â®#.Zë‘vZí¤•å¡a®Ö8h±e.8oǵ–¸ð¯\öÙ'xÑ{k­². Ç1ž®EYâ±#ý´\Dp˜6-mùƘ#d’QxXÁˆd†3ÛøñçCWôÐÃ=æŽc·o7ˆÆ@Ø$švˆ!%h$†%–˜Æ‰zœPv‹:$HÁ$›4úh¤â(‘ÜÙI¥Xz©% @"©£+¹Ü©þc⥗X²éK«q J˜Š£;›AçRØIJ ¤†ân©†!—oð)囲Pf!–ÕKH´`k-I»±ô‚O¸Ë¶I-k rêPTi½Lqºh•ŒZ|ã†Zm½µ³\A–Sb=n8 0Vk ¶Ùê ÁcöÎ:;Š'xøjŠØ?ä•ßÖ¡a‚+^¸æ–›Þ:ìˆ×7¸ãˆgD¼ãŠÇÜ}‰'(Ò‡7ôêàËw¦ ¯¸ß♤6ö#äU0¾ @àÁßÀ…‚vTHcß°‚ôžh, þè˜+¼áodð”àÁ‰Ü±=ÞÈâ0šþÑ&ÆÀŠE,!`a<à',3̆ÏÈ"´…$M‡;¬HQ¢Ô/¹D&3¹šJİ.iÉL\›‰×ZÒ.•éK+•B Ňq"ÛС\ˆB pbJ3ðñ‹¨Èé×pA':áQ„`X€,Ç´ÐË}‘ºC¥ê0 R8a,‹[Ï$>5ª¿L‚—¡=´‘q”€Udp d–Q‚Êh£s™ÙÌfr…Z€24,€]N± ÙEÁ§±@\ƒ‰E8ɰ9BÕà~ý‚Õ»Øȇ=ŒC×hƒŽ°‹]Hà b0A¨TÐÌI(þð˜[ñ€7´â ®?Ð1ŸìTƒÕQî± ”` 1…:$ ŽœÉ``©0aà h`hPàaMmÊŽpÄÀÃJ4Â4$öt$S¢ÛOÌä.%µ§4 bMÄT¶"†$$î ›Š§! ã ÆpA)D'¤¨1øÅP†!‡UŒ^xƒ0Ž(¼”-È`ÜYè*)Îp$p>ñÁ¦ñæûœ ä:" Ä¢ùÚNàCø²—M YôÆ8à%¬qðƒ…CGH%°¢Öþ!(À’Ÿ/å!‹[ðÃ÷Zy‡5~ñüg°C °FÎl=u‚ðã¾ü¸  çgN˜¡*,ô¶g ™)ˆþ~Šp$g»ÉJ|ZbŸHœÅ@ìÒÆ³Å“ˆ¢´8‹{")‰+Úˆ‘P“8±‚/(2vðE(…™Ë…ø‚Rø|ø¹A¹"C‡<À V0‚0'¸€±@†»::0Û£IÁ£¤‡YX³èVè)¬;P‹F ^èœÉ¢•Ir,È:qP…?Ë ]¥Ø)‡¶Ó½ ·P´(p4؃cà5à`®à ‡_ˇ£{ x‹I€„. Úcpb„nþ <Í«ˆY¼æ2Žá1lê»Õ²уˆÿá­çH¶xZ6sb«>™+ q˜ö¼;¨Ú›/ÕªL¨¨bx „¾gà"°[ _°~ðeP†¸ H¡6x°PP‚%¨• ƒ!¸h¿À+ø Fœr@Û)Žø!€ž˜1t±¯ñ’®é#›À1PÀ28Š»ùtÈ…a(«?ð}P„7ø‚\HG|+4’“oD¥Ø9o ›Ëá‹>*3JዸÀ£»šf)•-øM07°?"‡FèØ:SVø:LjŒÈê³þ³ó¤O¥xd¯b(† j… r…)¼à†o .ü-T®|˜„ÊÙ‚Fp (3SØ™•2XÈ>°ƒI؇2ë†Wp—}È<‰˜C쑦êÃCਞÿèC‡0Is¦î±|Ø®C\¶þ@ÿ@„U@Ý;~(†Š’†YY«ì=†+óƒø.x†gh,\Ž‹‰‡(ð‚/øƒøkÈà©XT‡-ˆiX"?š‹0™²KÀÆ`¢düˆª¹¢)é ùû˜ *’(@!B‰!Àùc8‘K›` *’†fÀ›f1Л”s7ú‡7ЇN˜þ…R¨€A‘ˆÚ!O Ë肤—}•>ú‹-€H3¶˜—J0)(:S¨—j3¤#‡6¬­£•JÀ†K¨¤eP{8OÉRÖ%4 48´üoxƒx\ Iˆ‚]ø úp çà´Ipˆ¼Ø‚P’-pò£Xe09ø9ƒà€M˜L¨#)èF`„¢ÀBÀÀ„! ƒÐ™ÒÓð€8 ­&)3¾¸«‹È!xŠ!ø+¨Z`¼ˆ´aF«¡*«"xÍ´) ŽH‰š@ÕôÛ2é’+ª1 °?ù†=! `‡fPà¤oȃo°² º†7èªoø+ØGàO óÄ_­« d—¸ˆ{H]3¦ƒ!0 S€VV…üþ †„ÁðœH"g£lVŒ¬\ÑÈ\aB34“Í WЯþ|oà‡=Øžmêm™hÈ™‘r×pƒzÀ„4Ø„P ‚©°"°…¨>øƒ€]ýQì‚}_:„ÊIÃÃìñ­jˆ[†¨àYŽå´jp}° ðXD$î‘…Qi8Ù&([h¶êyʇURYtœv¨KØͨ}ˆ?†_x†3@"€6`<ƒsà€f[5Z›D0€  €0­ÕÚPœ1+°‚s˜b*FPà‰xw b)Ž嚈i [°˜–éþ˜‚Y0ï‘[§‰š)Úƒ…Ó‰dÜAµ£8žŠ  ˆF ››è’­!’ [3qH°‚8°ßRž‚y¦ü Ø{¶‚,¬i*`UlÒžWŽòÒ;‡ãÑ»ó¹€z¸cø"˜è×Ãພi ײô½ðù .og"WÀeø‚3‡& (pD𘃟µ„3 6r1.ñ —îA¦.h&V‚E TЃNˆpɸƒ^ <öŽèõŸõn)p+Зã—éÁ–硆›¿¨¡*c„ŽPÔª’8ùS@ 2@)/d9 †Ã¸mœ"5 %ÓÐ/œNðˆþyp„<OÎ oP9Eà‡Ðõ„t ‡ôœè‚OÈç]+÷ÉÇF •8§‡t°Ú1ë#ÈY! ï\”Ìé#OÁ:ËxÙÅe¨$20qÐ ÏQ4Í*‡Îò=q“(Ex€<ЯMà QàèØE0nX‚Xß7L°z½×#òØ™PÜf0‚ ˜‘ìÎîyÞjï¶$<_p—ˆyJ®à½Y˜ê¸Ä~aï;èlX…R ` ö®Øó¨´IÓèp ·UPÙ8X¦)x5ƒ:r¸þ\¹_¸ÙL8ƒ‚wF(wðƒ¾a"È„qoŽÙŠö]ú­‡}–þIà‘PØH=0†YPIuò °£­µLô¼† ‡d`ÊPr‡èw°jxWø}¿ÄêHW"ÇÛBµš:Ôl$9û1[ÔÎ\kI?·Þƒ¢Zr©Š¢ú "w@ФÐÔ»î„HÆ…)¼†‡×Ù…V0†/PWˆQf*H0èÐ0B¢Ý ˜ÎQ™ÃJ‡tx€”²çÕzàèNË¡+O!)0¨„YI‡J`xŒ0ƒ‹¤•df¤Íø ؉G&ÕÏhê}ø¢;\­}€…Wß^àY÷€X7_±‚!ww؃d@+x„e¸M¸)¸Ù×þî°?l 0"Ý4‚-X5Ñegöå"ÒÕ⦆0­ëP†„|ØHˆ}øQüö.( /X{Ê ì†dEp½-C8†Ú£Y /ð8#Kh‡°âЇ#ø€9¨á¡E6P¬/úI5ß’&€@„hƦ$(Yƒ’žŠšÙ©VM…À e9Y¢îŽ )R@@ ³(ª°¨Â€–./8¸¡¢A•iά9Q "–.¶,³gh™2îÜ u0tR¡{܉c‹)S¥K§R-Zô(¡Šî1ºÇÙ§Kñàùª£«Ž2h»…J Br)CçOÚ‰#þ”(á:Å[¹]ÜŽ»ÖÊÕ:Ü<1£ÇÌ!t>]¸`êBÎÈ8ßé|!,qôÒQ÷¢^fήÝð±@ ¹ÖTXv¶¬µâ´¥Kw+Q‹Z-ÈÜøý[óæÚÐ@‡îiú©råþÓÓÊ›·opå"„ˆb5;ˆz”(C†Eî—ðZ"Q†M+Œ` á@ þþý·e‹9VÄ1Á2tB nÒÁ &Ü0Å„ØÑƒD©0Ó4ŒÌ6›J1›)RpöJ #"QDèÕ´OKv¸SaMÌä¢KÔQÍ-A”2#üdv¤„žDã‘"’¨HƒKŒ7S†ÈÌKþ5Vf8zHcL.¢pñLáP z²ØÐÊ;Â<ÓD Ì,7,ätóÊ+ÈÈ‚R58¨0‰E¨SCI\á?Æè‡EÍèN”°„ê4"@G)Ø ’)P-‘p "ÍH£ äÔ!KA3f¹A<£ºäXZiµTRK•1RC•eU45ÔQ[íÑ•[ë@¿æš,\e¬åV\{ˆAÂ\!óM.Y8äÅPb˜#Ô"X*.à"MžCL:Äh2Et˜Ù4¬ÖLgÿnƒ=Á¥CjŸlæ¯h[HG6ŽH‡!Ô‚Ân&Ü"Žr•S\ -˜þM:ÚhÜsÌÑóžÐBË) œò%Ü=ЊÍoˆÂL™7(«O<Á^8‹ìPô"˜XÀ2ðñCABÝ«9ç(ÎWOË(¸ ƒÒA“LräDÈd“vÚtÉ``@Lc #û¤¨‚y¾ê¢)îc&MFú2ëwô@Š#ÆôHDk¬5 Çà0è$²T3ž’JþƒË7)"’¹vÄsNAe×iÇÿðãM'øó §¢º9“Ç ‚òfDÌb¤,…·tâ‰ôÉ3,’CŽP‘À Þ(c !F†®w… Àð&òmŠš¦ð‰9˜ód9£šþ`Žö n{<†Ç#Ñ«<­JkKº–P¶"ÅøÕR¬òHE)J!`UÌb:+¶(J±¦b\ ƒZqÅP+äbrè„"Œáð \†Œ'ÃSƒ;< =NÃuÄm™AÆ.€Œ;\ 4i9b qLôxÁ"LÑÃi†F˜‚¦ÁŠP¬µHÄn Q‰thìÇ ÃÇŽsŒhŒ9ËqNt¦3—Ŭ¨àNwŒ!‰aN%+"#–€†%¾ ìYD ¨/Èa$Ø$矴À x%±]2k 8†9ì0¨O"b¦°Œ„ !þ­qþàÀ*6A L bæ('gT}0ÂÇØ[MTÐQÅ#¦€F%‚ ˆRü¶ÈDF¹þ¬Á *0RÙh" %yCÿPÄ8fAUƒæ8(ËÄ ŒúÀ‡%BÀ³šøÂÅÈà Ú!ˆv<£?‚,º1«}lÐð€ø4%‚Àé-–ö“E(v0¯Sðà³øFìdziÊÂðž{bñ5"ÇØÀ@,b¹d0Þà—žY¤%¯ÀFz‹J@ OÖkÙâWV‰`Rˆ%Àªå(U †®Œõ+²ˆá§´ TÅ[媃sùñ¨oþ Á'HW1^ø˜ºñ…£Ø…#ˆqb0# p‰êÏØµwhÄf$‡d/(A=Hä/ nc Å ÐZ$£b\ì€ °‘0VÂa(#Â0)Ç9)£‡t<‘®êÄ 1ÚñF+ÞðKâBù¦ ê@Š#T°@¨ð \áFÀGˆð4Gö§-ÉâGLà¹X›îÕÌQÑ( ÄšRÐ °øXá͘0`„Yœ N0Av©p’à4ºP†Ö7ª@ˆ€õ€D$Œ‰Q°c$øˆ0”`ŒS%±Ú16÷e8ß$)9T0Äþж¤ˆÂ.Fñ†NDCŠG:N!‰9p!Å¿Xq.X2‰JDŒˆAƧ)cˆXÁ*hÄ20/nìB³@‡{ç+\¡{ì)šGc°Ò”,”}¦Ë1¤`:’˜®"C;S JÂ+Ÿ:åYMy QÉÒ,FXDjš™ú”`<0*GeJ°„ÅÁªÞꀶÐÖš‘ #t"ïЇ sŠ+°p0´xL¼^6Ó0^ĸ&tèÛükaGÓá›ö˜¢6zýŒ)0¡‚h1ÕÎ@P„¨Q acŒ#œ ’Õp£]™'ü² JœÂ/sŒávp!‰ˆíB7Ñ[7¸Á%Tìâþ €µ¯°e$²¶ÀrýS†d|PP†sñÜJRׯ‘U5ÀO3袭ŒƒèÄ(Æ0Ë›\„øÃ‘²G$ÿ[X$`\(b` ð8ơ̱ÊÕ wô0‹'A9t=:ÐA$³MäëÐÄ=F¡ì,tÕE>Òá I|@ƒÏy‰k\ã̇=< „‚ŽוÒèªqôø»]G*Ρq# ÒÖí –ìTP('¡û%PH”ξ!9^ìC§Ä” ¬m‘GÒŠW4ÕáÝÝøÏ5 ±HÅáM…³8…©Y'ZÅQL…œ¥ÙX8Sñݽ Ø%&^šâ0 Á0 ƒx.°Ö?DÁaPÂ`P‚Á AÔ.À1À‹d8Â.X3”@ÝØÆÃë…F#L‚qÁ‡8<am†IÁ  Àïµ  @,,C„˜`þÃÐqÌfG„ |Q`ÕI-° õí¹pöÙÌ5H‚ÙAJÒ#¼Aäw¸–+ $ûáà üœu[r¹ƒ9`€@€(ùé_tAÀÿq¤Ù} ª@ˆL€œ$ÃT  ¬ÅHà8ˆ‚"ØB‘‘m\{ „} ÜÁ¸!¥ÃaAÝ5¨à Fœ>(üÈÜxÈÂ(xÃ6‘@"º¡ ÈBšûàø‘C4Dƒ#p€Mìƒ@ƒ=0?¾Ã;øC)”‚C*DÑ!B ta À50ÌÑ„ÌA:(Ô-B8ØC Ø;-¡D`&PÛ¾Àþ¼3ØÀ1%„„H6(@”\üă äCh¢Hƒ(¢ýÌ]RØJÙB0ˆšÕ®ÈšU%fâX&6 E…(¢ÙžÍ…¶@ÅU ØÂd ¸â :ÃüÃ?Ì"[™`xÃçu˜iE EÚ¤•3¼$`Æ2ºm,Øp Ñ4GxnÆ6 |ã7G-ôÂ8JHˆŒƒ:®#6|Ñ=‡y¯±LuÈL ÛÍ ÛL,›” ÇÑ@ÐÀ¤1Ð@'ÈXB3¬8€Ã,€¨ˆ‚C*h%IÒEnäFšG:—sA `JøÉL8¢ÀþIRË3AKâ>ØBæðD”d‰”t –!9 "hî•ìWd:%Ab\ƒP¦à,%!€Š–ÍÖ¸‚„@Œ,!"tƒdÁðÁÛÍ–”l\¤ÓD„‘n¸0\$Ã@º[Va)èƒ$¤1Ý@)At¡^Òà?BÁø¦`ºÇI8è?†3$ÁúÖ ¸€4!i5¼‚ p fâ‚©¬©–©G^ÝA>"#ü—Òh—ÕŠ±,…Rñ]T­™ ÕáÑY&rbš•Y rÐoÒ™pšÃ8 ƒ+ºâ°Ã²Žƒ²²ƒ(¼ >øA(‚7\ƒ1´ ?x^$´ÐYÁ=xB´þ•4ÜÃ0B2~&$Œ]eÆ„FflÁ$ÐÞÈTc§Uc ` @@/ ø+ qô D6Ü€ë‰C¬ÍÚq$Â1ƒ6Dld€ëÊø"na߃°V+H‚$ŒCð%í˜G7tBZfh'Ð |A'|üÁˆêèI”|¤öйÛFräsñl„€s™Ã.ÊRJA6, ŽÊ_ŒXÂ@‰èŒŽ–ùB¤Ò¬@dÈÔpm#˜ÂPJ%8Â8¥PâÂ5à‚•å0Lm\ˆxÁÅd¬ Â>D|>€øœx>$CJˆœМ)˜‚Ø+¤Äþéƒ[Z¡ ä$\kãX¾-«Âx°ÛÉ©€ ØXx”x4°B"‰öØh =&Ѓ-¨)yÌi¦|D§|ÃÙeêv lÂî2 Œ5PÃ:ˆÜñÌ+ÐÊã‰ER…›mb' 5K)PUÌ* ˆÁ +ææž™C ²§9,§ ¾ [⃠vÂ@v‚xÃ;xA—ìÌ€ÞY…\MGwrC0JF\a)ÔÆ]1#÷Õ$”5V£Æ´g:4H/ôB,8pg)_ Ü@L6tÁô‚!0C:0ÃrÖ2ˆLp ¡žÑÌTGöÅx¬$<5ô¥IIJ¼Áþ;¸@ZæÁè°ÈàCTÒDÆà…°È‚€ƒ‹>þߊ6q€šºá…4C$µ ×DÀ<ƒ|SͶ—/T˜•TN¨¼ÖéѤÀ@ qÇ,âŸ-–^ÃÜa_º—Äí˜ÀUC<(ƒ°ì9„Šý¨@™(ƒ XÁ‘IÙÁ+LBºb¹\ãòÜ[º@)4Á˜CêĄ• É¢ÚX(„èΘ;!²)ÃÂ4Ð{<ÁˆªÜ„’†B#t„ ØÀ"°[yÄò1ó1`Ã!‡12ЊùÏóîª KQåf%N/l궈¢éþfõ*g3,ë²·|ÃùrÕäB.t‚QƒSzÃ_ðÀ-Þ¢ £ÕoéÅK¤ †´Ð`}‰üïÔÃ4Äž]Å«C­§ƒV:¤5L´€ A,0p/tÖÛ‹!XÁ2hL%x°Ç ¼# §ÃhºìB9hìÆzƒHÂ!ˆ‚©¯ý CÜpZ¦e˾,ÌZÂ*ŒrMÈ”åÄ`ÂtAWRO€‹vdEI¤Ž’9$ƒ;,­ä4í8€1Iy JøŸ)MèX(¹Á×:&¤ÀÀ ð?üƒ7Ì¢ã–ÎB\£C5TSöØŽ?(B©|`}]À w‚>üÛlÍ—,ÌB)þMãD BACœ€—¸å/ˆ2ÕŸ(ÃîÚlÜÙuæ ² €:¨C(ÄÀ(´Ûl™ÉÈ‚{°‡8”‚£ÀO†ø‚:,ð²ˆÀ†Š‘)e¬,¤Ì„MUƒ3Jl)Ò¦6c³7ë*¬îÊSð”'¾fôZbTX¯94Ã74>äB)¨³>äÂ7°Ã7 ƒ>˜7wÏõ( “4øxƒ1 ¹ F¼Ì7};Â`ŒéIF2&Ì@³kLB¼6\:¼Z½pTÂ@@,Á%˜3˜Á%КAt6L€3x:`C/|ŒqŒ4éGô‘– ³@u ‚>²LûÁ,òŠ þ9xø@Nïô€w.ŒC"fí ü£ª9dCÖ\M&]MRG&C-æqrÛCêèGöüøÂ˜‚,D„«èDN8Á4”u €D?¬À?p.à ?øƒ1¼Á,ìà ÔèdÁܤ &2èpDD¨$²í¤B)¸Ã{1e>`8+ŒB'”‚0ˆÂŠý8ÀÛiI)åMh`M=Š dÊøŒ:¦¨ƒ€åŸ‰ý¸`fÀJÉLƃ=ØÃÄÀ$4B# Á{e‰«œænëÄ!— Nþ¬"Eô®.PôÒY%Rųoó&VùêPEPßYï8œþØ7£0Š[þ@s¢ƒ"t‚( C;¿Á;wXœÀ.àéìì IZ¼˜Ö¹xƒ\\¡5]9Ñ2Іf8Á9î/Á*`!Ñ ¤ 8C"Dx„“A,ørTxÂ18Ÿ8€´„“QÙÚˆop¤¹Ñ)˜Vu°´Æ²pLK‚!£/ÙÎ|ß𠳬çÂ0d‘°öŒ‡TŽídƒ×$È%=uA—GÚµ…Ì–ÀTWµäè@&T¹Þ€ußh¹)ôxAü£ t&`+”ù&œ[Ë¢?(C›?€2<€?x?Ì0'ýNœJ„€¤¶îÃ&°, áCàÌVÓõÀ-ˆ{þÝÄètƒ)`$Â:tÂüB>åS°×'üÃ('”‘\~>ÌXŒ¶:„6©Ÿ-ÕÄåL‚èî@$€å» 9ˆ@%”@ @‚=@C5ü[èþÌ¡ÎLä~Maˆ0›ÇPÐQDõ' Ëœ5û®,PSíêU¨âkN÷Xôf¶Œ!„@ÚC•A*H‚ ¢Ã:{'tÂ,¼Á?Hƒ»¬Â AÔcÜ7[Ù;¼´&h !¼¨ëHA6Äuê˜"eÀ@¥t ŠkØ0MºJ&n$2s)L2±ø0#¤K—)L:¬Ì 2-V"¹Á^̘h<Õ¤EëT¹bþŠÓ¢E’$BÕ6TÃa§Z¢=°qñáÃ;©4:u2‚.×± *6óªBÑj*ìàèÑuÁ”k;Üè𶈠r'Ô5ggCÞ­E«-0Ì Áƒ ÖAdœDvêÝ€È×–-¦¶p]ZM,YtÀXØt…?¼ø3ýÀ´?eÊTûû£U©ØÅ*šYÙpQÞ}ÊB(£ñû\XÌGo« 1‹kQƾXU‚„-•‹_ížU'bŽhrDdM*|¬Þ'U»S¢${Ð<Äh3I:f]4“ǼÄÃQZ‹æU±’TNð„u˜0'7ÌÊrì1ÌŒÂë¬Ûë¨jÈ $4þÔp=Üq§Cwl±Å÷pàD[‚ ÆCwJ|ÆMôðEE,QŒmƒG1HÔÑÇÅ Ásþ@gE:A—kf™Å}rÉåHtŒ™…‡#~Ée\ŠáÁ‘H¸á& nv1“n¢I“O¸yÀ‹(IƒfÒpB SLˆO²A!…zÈ!fì´à†e,º„ 2h‰0n0  lRHlœ1›F/i‰D*aFmdBƒ˜6=¹éÊ9à-bêÇJP…ÅŠ(¨¤ú¢E²0« 5Œ¤D$A)¤˜ZµÔZË­¸:8æ˜ Ìéb+°ÄªæY[Ê(Œ\ÁþF@Ì¢ÂzÌÛWÚˆÞIÂÊ5A̘ƀMô4À§µÕXXEÐÙn¢dÉm˜cÀZ—œ V£a5E†ø¶š„{Ø£‹ÕGlpÀæšR¸xæävÊ,¾ÆªFrñ…æ)°ÉX6f/¸&ˆT¬¤{Öó–YìåËÛ v°Ç¼2K–xÞПo¬Æç10^‘˜ë`¤Ž;¼’¹rÄ› ¯ò Š 7Dq@„qÄ;üÄQ4qoáże¬qÄ sÜ›n‰l#CèÄÉ(;)E‘k¤ü#EŒe”Œ‘¦9¹I`—]F)sLnÒŒ"Õ6¹9Åþv±€Ì4 Ùó‚ˆ#vVC¦ô†˜IÇ¡A_¸¥-‹4Š¥¥GSÉâºÅ™c°iá’cX"RÓ)•4è©©&haáXyúI‹9˜XvBͪù`Wú]pá׫ÐA'„ýGÇNsPX1 )B˜‚¡uµÀå-æ¸YYÀC08å"ˆÀ`&WáÁA5|ŠPl!“a̺àW '˜€+ÐLÀ l5ó!c+œ‰,v˜P5º‰)ã`Ç8DÇ2²¸ƒ&X Á¿àÂ/~A„h&7CTA74´¯LbcÈØ„ƒ”I|£þSê„1®‘ŠHÏ_dVxZ&‹aÔ 2ñ‹g4DÈD0šàŽ î²€ÛŒ¥!JVP€B%ë67hDŸÜöp8ÄuÈn¨%‰h# 9ÀG‰’âñ‡!ü!JèP.pѳY¸€˜³Ò’ô1 ð€ÿàGŽ@‰/Á vŽˆB4ް‹i:ÂM» „™bÇŒ|ÂYR¸€!ôbRÐ2@s¤Ç’¼ É3C£Zà– #døHHA¨JXo dH„ö2b‚â™*Ì8•MhQŽSìd}AAG—5~ì £pÁ€å¿?|´ß8‡-,ì!‚ë€ þLࣥŠã.c¡RÀò,ŒKƒ„aÃ<¸G†¥%„×P{ umÇV˜Ø¿F“Þ !èM²…aˆ'3ÂQÀv¸²°x0¡4®x€+\‘•±x „çHÂ^á‘}‚©Ð‡0„1ˆA¬ ,¹a— |€IT"ŽØE*ØÁáìu¦øÁb-1vˆ³cÔ8@ä¥ö`‡V†Ã•xЀ@ÁÖ@˜.¬<`™,&AŽFHàЀ$ :ÀVwA l\òob܈l‘"Õè“&ÊÛ‹B ¢P¾Ho{øŽ["¿…rºæi3þ 9ÌL—P*þ…(¾ñÑ\èCIŠX…#¼‘‡UŒb‚õ™ÌdMGŽް€é°y…hxÂÌ(Á4¦±)d#À@–ñ;@]ª$í¬„*Â(¬Ã,ñA/Ñ…4T"†ºÅ?!€NeËßSHL:ò¢Uêó P¾VÙ(£EðÃŽý ôÛB3HÊ,Š&…ÈÈF6è@&3¹É+e !¸…3uq âÊ©a"` Q3˜]W O8ÔL£¤CÔ Y@àWÔʈso6Ueäb¸¢¨ 1»UèÁ ®´4\„…Y9Dáj5âq”OLÃŽxÃJ!Œ_À?Y•¤þŽp„Tì‚©ÔÜ Œ‘V:Aˆ` v”BuT¢´<‘(ì’#ˆ0 :Œ¢˜E„)ê‚Ðv¶É–­˜‚h²’pc®ÞàÆJ•ÙveÝdô#Q:ÀE>¥´Åð!ñÈÛCÇñPéHÝU”p¡}`.è’1ø±‹#HÃo^Å5ÞÀƒÈÉËÊt\Èi0H•ÀÞ±F €a†hu!!é ÇðR‚°B˘'ìYO{:Š ½è+H^©¸XâÈìþè7†9|LI—ì +ŽÄ Psø¡(a‚þ x€þmvÁVáFÁvA´)š¢uÈ$ ÔÂ2JÐ%nÀw €ì„E"XÂay0¬åð‰ÃÀ€Ä¡$ÄAFE"¢ *á à@lè´0|‡&Ž–V|Bü ~ŽÂøn¥£¬ gÀ ‡€*`Äp†¡iR‹,ì`”ìì– íÌÝPèàÆølL0l!t §|/žálaCˆ¶ƒ< =ÌÌÜÀ À¬p^¦ 5L#·Lc gÒpò@ 4Fñ©AÓ4hÈÑáâ.Ñ’¢Aöáîa@ÖVþ×Át¶*;fM1# ÈÂæì!ä*ríV˜…z¡`Œð-Ù3&a+œ`ËÁ÷Æ”Å;æV{`‚`;5ˆæ°”bd áúÈóÏó<}«0“öó=åÏÊ@ºÜ\dþîÓÚˆë=Šܘ+^wDqâGlÁ ’ ¿õðí¼°âA—Dß4ÇgaüAxÀ p! ü¡#9‡x`Bc& –AQ." .!–a%aTãÐ P¢\ðäÔB'YŽ'}À— à I‘T“th‹–yð  ²I¡ d "!J]VrÀ'¦;"$êŒÂþø@¡ú”L# n2a‚¡ æmeAºaTêMßÐìÐnèÔ2UÌ&DœÀ šaü4F`´3 ÕžAô¢&Á;ªt02 „&ruF(Wît¼2,pÀ¬Á g¬A<‡@Bà~Š]n£?"&V£@Ce5L8OA\iBÏœ¬ë ¶€7#!þ€Ar/z"‹áÊàToE/†cZ©51WÁu+ª{ jÚa´¦µ;ÃB¾EŽÁ®¯¶¾‘·RfA Ì0 ôü|„FAÄ>iÄ_–_ãy`ÅM`÷“ w„H†`˜ÝÁôõBÀ!R—Œ¡`º„p£qÁ˜FA¤!™Dxœá0"#6ÂQ€%Â@bÔ/A&Ó¡N" Ògi‡{Ò€r .…äˆ.h+aèjn!ŽÐ(‰®I¹*™8¦ôhAÆ´ dþ™å„Ä#B6V¬ Èþ 8àWŒjm€Zn@ÙîM—¬N•"SmE€T—¡-a±éÎÀÕÕò@k¾9/z@î€|’@|f¢ =ÁèCŽåX]L kÛžf€tåäàÐëªÖª,4÷, ¢€ 4AµU;L"!n¦B Ûe⦠œR Á"ár OO<°a¬ƒ‘+!Y”!ˆäîÄ69b£9ǃ[y € ¶7§À1\7SõÊš±%f[5ß“ä™DàOEâóC¨ Û<„^GpÐïC°ëþâ¹p„ÄpÐí¹¼þM¡sDA†ÁÙmuiޤ`(£q‰f¡Bàpa¡.Á2B#NøÂ.¬ž6†Q‡c‡2UŦ`žvÖ倲z8I¢&¿ÇPH…ïÈÛ©ÆKå{” ˜¡©«Ò|žPÆ$A *tÏeXˆ^èZ¯R„ÂH²a­×BØÚmç²N‹©úC¤ î:Ȇa,ÍI~aJÁôá láVqºÆà&Üé<}N¡-o<¶â~€ ¯+àF7Þ£:!âÀ:3†/ºÆ4AšÖA, T›"aŒf,„m]6 L` ÁþÀ => an®fa+Ôi²Ê2ÖÔËMS]ìNƒSÖ£irC!‹®;¶Yƒ‰…Lª?¾<¯ÎØËý9‰•Ü‘GhdD‚ÁFýb„^ÑOoü&HÒ­¿{$ìQ Îý¿™‹GÌòaE¶¼Êkbña(úJ¢D¦$ fA† K.o `Ãà€áÃyZÃ8‚…7ŽÄAf+!U$.À` –¡XÔbü¦%¡l¼¨ E©˜!P‰•z©›š*oâ| xV$¡¡,|È[Tp ^ì…zÞÈÀ%–¡-®˵<ζ±ÊAÂÜ@ŒÀþ–ø`ø`Ù>;$AkpF¦F¨€ꉟÆ”µÁ¬w¾çÁ"€ øø Æá­AæÈÞà—­÷A²3VW{ Æ ¢!"!ù î(„#ÉL€ñM` nJ`i2àæ‚@˜±É¯ñ¹êfƒ+âg žA£çq†&Á,íÎ@‘þ–›ƒ¾÷AIŒÄ#Œ@ÈBÜ× Ý1ÛçÜÊü¦CØ‘”g^CDFD$@¯k¿Ë½ùzÛF„†á` ÜjžÝ œJ"˜!g!’DI¦Ä ð(œ þe9‚ãXZÃ.ì„Y²KPHÑi %U* –ázþ‡wúÂ> À¼HÇ,¸t&Ô¦YA‡ÄD(N†hÐ0ÌÈ‘ Z´ˆú„‡3ÎÑ > ÑÂ’KúK dÄ¥½ô 0±(˜7Ä8d7˜‹h6é¤37¤‘3ÄSI$TgC iI$ô T A¥ÓC‚2Ñdä‘Gz …£&qÁ+²\TP=e–SO/Ù4O6m€ Q uT¨.uþìNAˆ>Õd™PRt0AFXÁ73 ñcú õ†ZbüT¦¢#Í\ÌÖÅì\Ò\3†¥7Å”-kŒ –<#L.3 .¯ZŸrñŒ±Î:šhBÌhÜhI)]XëR¦û˜BkQ0ñ¥œsJ1y”"œ§§õTY5ä²O@ù&ØL¤~x'Ê3ãüÐÄxDD„Ë™°G¨/µu,¨™Åd_~÷íñŸ… jLƒ{DÀ ‚NèŽ;ýãÒ.È_ˆ%&#bˆfàÕ:€5 `›##!Þ"Š(„°ã"Yú óǹ|3;Þþ¨@TI± °ä9-ƒQJÙË%yo¹eQ'l²Î.Ñ€ILS$b%’- ¹æ&¤A1ôÀéAÌèÙgé£[Ä =ôЩÍm ±Ž=ÚÌ^;´DâQ$,4J’$&”N>¾s]Kƒýd™L7Á'œ,ȼBL`ý¥¢ÚÁ¾I%5…V°.\ ,/À•43Äú¢|SŠ.¤å7ÅcóJ1ÕQ ýÏö?ýÞ€fZÂ’ LÂxAˆ@„qˆ\¸¸.ŒaˆLÙÄ*+ɇ#<îhÄɃ܈„#‚€Põà‚ÃyVq ×lâKÜðèðQ ï°ã‹áQÎÐŽ_`cŒÅu:VDÂÈÂÓãÙ}ö#†¡‘hk%JZŒ¶ ¥‰È?RSÒHt¡;rYÃZ"³ö1 È(;Ì1 _±ˆ,,ú:†@B¸-7¢ÑÎ0„!gòA-’Q ¿ù •¨ì‘œ-9{8Á:¸¹(D#6&XF/4§¹XÈ’s0!=@Ǻf®.tô@Ã3WWÐ1#ê´)ÍC) $½ÃËHL²m¼#Ñ0E<âñ r¨13ž’‰žþGŽnÀ1ŽŒX&ðˆ~òózØã^kR%9âÇ èS߆Q °ãÂ(…>h`ŒVxã×°‡A‹¶âû#ɳ¼áQSl?rÀ,ÁŽR(AÂ*RqRSp°]¢ Í»"± Gb£Óà@p‚Ü£§§ˆ„'bx…V¸`?°Å=âQü`#p¦¸N_Èbã ÂÎÐ-Q”*`Äôâ±v"eD`Ã6 „Ld¢ eF°Y‰”€%ø³®1.c(®?úQ'^×.¾H½"¦àû8ÌÀ¶~*ÇÐj(C%r¬€:;!<ø :ÐéÙÿÐqjYCä?¢e›Cæ0Ç8£Ú’¥Eë[è9†pt‚”Î8!ˆ ÜV6 XB¥âZª\¡cþ°ò?8à~pã üè€3ŽDLsüˆÂ‰á‰H03w­Ëx3Ù˧óþjšÒ žôäMް@w½+IˆLÎ<¼#ÀÂøŽ%,1Ž!h’G³ÐÑ7Ìñƒý$#EVPÀ„ã €GléÂÈå·†‹²½íÝJV@$I[0Ý„0¬á‚s¾ÃsžŠv<¢~@ ‘KRd•óo~Þx€~q†ò$Q‰êIÌžñ EüãÊWNEQ×µ.~QpDh˜¡S^:âÎ<¸²4øAçUÄYΔ.vq„Sìâz¦@ñç2àA€ÐAö`úÕÃ?G~ñ åAoÀE'ìª|ˆbu÷4@Æ_8Zy¸Fç#qŠr¡ÅbïšW¼ÞþÕG> –>$sT¤bO‘¨„8ì`@#“¸€D lbóL´¨vhëØY§I–޶xý„Ä´ÎþDZ‚!Û6 wä!Þ– ˆ¤ma3 ãn*’6„ I”d_”6$€J(ð[~s>Ðç€oÀ@%‹s+·²!`!°#!ÿà^€ ¸Pg¥r —Jh ÎÐ0z°T§&ž C{„Ì~¬“(­„­³:Ò$_‡²'$׸ó,Àû}Ásy`^V CS x0†c¸z¶@(ð(8aÊPaq  Èuaÿd=¥B‡VÐ æP†ÂÇ-³'þ sP~  –Ðð€+õ Öð1Æ?lgd@FRï Ï€@0w‡w# hãð è@gƒw»°÷@xÑìrf:f&B»@ ”ðÿÀ¼hy¾¨y<°yw‹·¨ }öÁ †§§̨x°zЦb´.Æ 1…Q„W'Ó–ÐfX~p{Ap»`‹©à dWÝq6õPgS Õ—sòx Aà}{• ~%`ç7 êÐ"P¥lÜÖh€N³5ÿwl b!tD€„THbmE5Þ6n)rr³>ì0 ìð ¸ ë0 ð-þ\~³$H€%À°\·t‡F`)Ø )¸‚è ³` þà‚»x K6xƒ° W‰Ç !Ä »CK~ç I¥T§T{B ‰’(†Â'‘`:%‡;¸£;´P¾ã(%a.÷%# ¿ð âU™0!H†fˆ"ÍtFp7`  xóvarJ§\yˆ$Ð2:- ˆÐd÷ ƒð ¿°ˆ™ö‰›Æðп0P‰üs $ñv¸°‰Ï@h…wÎ1‰á@ŠÀ» K«èŠL‹b†S9å ä Ÿ· ©@ 7feFuÑ5 ü0 <€‹GÀ| 4`þ  ùÇz˘z©çz?P Q¹ 1å}ÞwÆð–š X¥?jQ GÀ  G Þðvå{à|*³2Œæ@¤’@õø}[ ‘ÀKà ) lÉ3”e€z†\sl&Âm‚äYZ”emymé¢ZŽn)I)B$€ë` ¥ðÔ0]€ üt­´Å…%[BKq€=àFð8o“>=©YÐ#-8 ÒÀ€ƒÎÐp±€=WÀ® Œ»p¥w•”àyòBÌ7„ g•ZYqˆ"M‰ÒMà—¦‰B…á|!A€QYøu\ôáÑVW—hþÐ b`(`}€¨q@t‹ú†‡þ”\w¨ uÉð4§w1kµŠÑ-eLjšŠÙÂiðp¿Ž­°výs ûós'® а© 4n§x ¹ÉìrS°¨« !;õ”ò‰‹Ë2yÍ9 EŒ;6ŒÎw‹ |PQ!îðŒÍ茜ú|0ÖvAP Îw G G èI2%#`#s{¬JŽâJŸyàzzäÁ @¸-)ÖRàS{ò«Ìkjüê  Âfî7G ‚HûG*€¨ÕIÓ wd‘Že!ÛH]€ê5£u¢$€€æ@Zãþpp †pІ  :y „Ã Ø µ´\`qКT7=y#!Š F0..èÊ ²„I“Æô+à ¸ð»À‘<à;ÖyžçyÅzd[¶§P•àוnŠ(‰B ¸ã¶ Á; qu±_Zp 2–yà%3ì€2–pti—{à4ƒjj($¹¨‡pH˜†ia’{aº’|И{€°‰‡‘• ‰ð°i¡¸Dc Â@‰$õQ¬ªªÞ°·q‰š6º3›¢€1¸»ùKíÒ.¬¸†×Ÿq ¡ÁKÄà<yÅÀ”À‹Z{ÁÈ7>²#^` ‡oÎ 8s%Uº+ð^ ÞÞ cG¥€»°cÎG < ®© G0 ŸzÑI  wr¹Ó¶fùf‰_rN}sc3æþr%ãEì0$ ¸,CÁ@Z(p€ q†I¹kt©Êu( ¢¹³ª‡ð@Ÿ˜VJ”- ¥ð¥ó³ªõˉøÉx‡1{×w·›»¢c «®¿ ¤á”Nù®Ï‚‹ÊŒÏI½wĸz@€| V“ RÌèl°§½3À­gñc zÌçÍÑé}u ï˪©ÐyåèGà _À‰u ,еJú0 ©©–j¬Z¶ÀÐàè' ɰù»!ý‘€I58HO¢Ê†÷‡ÐÕm ¦…5È‘$ЀH>° èþp†° ç 6w²æ°’A§oÓnV°#£4ÍpÓøn0#°¤Š` sÆ+)KÀÐJø–% ‹/h.^à ÿ` .€£À£pc×à Ï÷|ðY®Ç`­Æf™T¹·‹òÑé|tÊ_û#c3öïÐÞ¡™ãF(öiÓ> ŒŒ˜s(‡ÌO”[¹QÇuT²ûÊÑ/#«³Š@ š° 1FdAö?.çΙ&ªJ¤@c$ øÐ 1Èc c0`öK¸»Aë ‘Ð.D÷ÍâÊÕ7F U- w±¬]}·xzðÌÌÄ­½?p©ò½ÉÐP À­þ.Fô¸|eûÆäzÎÅ`®sÌ—_ìúÀôúš™¼DÛRŠŠ‘`Àúœ¦–â`;Ð \ ly!‹GbÂÒßþç3HlÑœ‘&ú495¹H 6„бp ý” 0;pþZàH4rÓA|Ó6—>A\´³^À H`%8Xò†Ê³†GËÿà Æ@WoàV| ó¿WSôƒÅs‘ Ù½ÕåPÛpu¡Ö´€xa…Ñù,ä|"£·_— \’#Y²÷Ñ0 „ I‹,TC•a†=’ÊÈÿØ„ QW¶`zãMþºœ›Ø¯<à-ï° ­èª }ö9¯«Ž­Vlµw$(YÚ¦­Ú¼Ë ëÀËŽç'@ŽÎËy W¸hœ7ÆGpÛ© ¼Ð‰Ì¸h½4`ÍÌ(@Ü`ɯ÷ÚKÜÜ*ñC?`›¶t<¦` ÝœÆ<µg¥Ðšh¥ç¯ÙãðŠpÏØPj¥Æ %ÀÞïmöà° ÿHßÝ~|¢Þö5|†ãNÑýŒKc4K#‘ÔYZ£Ñ ˆ›†d€'Ì!&{È à")‡V oè€écÓ„[ÃPI6ý6Í@# ´+¸â>‚-8V ‘‘‚7‚ÿÒWþdÆà @Ž ƒã<Îxì?\ÍÕþ£rWˆÇWô4»÷{%7|03ð _D’@üE‡=ËG1THŸôHP’*ØDw|`ÉepçÐÏã-›M0pN€Þ © @"“ p¹ˆðÀŸŒk‹!DúpÞºT麬 Ÿ±A»É.rÿ8Ï+ HnÒé|ðÉ,fŒ‹]Öw¡¼¨0ū޽­NÜÑÚPŒo Ýê… Ý,·¹SŽÞ|r²Éû%Û‘Cà‘S÷HëSId¾"eq¤A‹[7 €“­doX"t¯v[_Q{>b _ðè‘‘dò¿}»'ÿÕAäœò*SrSD`I¯] rM’¤7ƾ蓃÷!ßf|cLJÝ7ŽßDyüöçOˆ «Žu@™rJ);Lx B¦Ì jNP¦ŸdðTèP¢E‰®aƒT‘‡mÛÖªU1ªoò¼ó#왥&D2±M¦L?Ú±UJ߬ ©Ö9Ц)Ú\Gš49Z÷¶®¦u©Rñ80ÕbG¨8u„áb<S¢t¤\¹#GvAF¥þç FäXÁ3f`°†Oλw4òH+|Jv¤S´dË>’øTªS‘rïÚuÊÑ©]ÞÞýjdQæ€"aWJ‘[l•X‰«T)]%q%ì}‡æVŒIêÈI¸#Aƒ1bH˜ûáÞVûùíIpo¿½[ýûóoïöØÃwöpÀÿðpAü´e@ÿ›Ï¿ýòÃðÂúîãнó{ð‡d8¼Ï¾û̆fTd‘ÅsÐùà t¬PZ¨%ÇZPÈPÆc$Òc ÁˆCHrF+”´"+b”‘I+C˜E‘YBPt¸ÔGŸ\Æé›RJF”!ئ‚qþ*xfˆJQmLtùã|þØS¤?¾ŒƒƒUn0¡ƒ)n˜âPCopi¥”dZf¦ 8¨I§ ÄØC‡æ6å€Pj">øà©m$Ñ"°kÞèŸRDÙª+²2!‚ˆ3,ù%-}Œ¹f”¼äŠë®»¸ÑË®·øI¥˜ Š9H!†¤º¦ؤŒ«L²#(§˜r(a•Vx@Î:ûLu­AM5ZË#0àNáf6ݲ-Æ/¿ãa^àxx@Pb„å:jÊbç¶nÉŽ»ˆ±ç;{ f¼ò&i¤ã:.™¾ãû0d÷s ˜Üã?Åp ?õ‹¿ú4¼ùÂþ™gþáÁõc°äý>$ñDÍAq¤Í!…¦ÍAj¤k© ‚dFL¦‚ZHÀÚ¾dö«Ðf›ýëϳ4›@ S>ûì`R&Á¸3 †ˆ`ƹFŸ_raŽÔüp•ÎR&úFÉ1÷’ÉY@8ÆD…<òDe´ƒ*w‰¦8h¦ÊÐaÑ…Zx)€©àÈãÔ¨$É#Ð…qƱ䌚°Ä’qÐ:SŸ7®I/MưK“(¢ÙK/¼vI6obè*ÖÞ‰]’VÞL°Á¨Ê¶œSP¹óÉ-—3sè¬}9hø‚†ÞУ˜àìÅÙê;áÌcpÁ…7FÁ~þHCy°Æ3ÀƒkˆÆñéD¢Ø`w¶ÃqØÁbƒF `Šòt dAC|zV¢ŸuÈD–øAÊ! ©Mf(³ÌÌÖèŒ7ËÙÏ<¤3 ˆ3{ˆŠÆ¡Kµçk ‹Ï~â󵍰Р³E0‚A¶˜iñl4lÛ€¼˜2-ÚÂnDø«¸FV±w¸Ç3Æñ cìBÖèÄöü×c(ÉK_ÂÈ” 9|)à˜ÅN9!LÁBx¤ÀÐHHîqS°\æÀa)LýÄ£ûÔé°P€¥jìdç?ˆB{‹ãínÇŽ\‰"»ÂÅ(v±Žh0þ#·˜ _˜çbñeÐE²bÌa~p¦ÞÕ ìu"vÙk…7°›r”¯|äÒÌÄy.rÊïÙ,Fd‚S/ßÁVé„ XY k¤Æ.øBüŒá…|Á¿8< v0„)ÌV¶lK$2È †f0;â€èÅ£±Ilá>*\"~ÆQ´(æÌC·‹ám·˜é‡?%¥ #䲡eˆD.…)èÂq‰æ¸hWxŸVÀUãCÕ„ TvTB} †Zv€â¨ojReYE¥•{så ~ÁTvÐ’– I“(„QŠNà+Æ >¬‘‹/äâ¿8Eø0 ØIþIZ@`$ª ‘B`1!ØÀ’kä¡0ɨ „—Úƒ'?‰°Àãt eVlƒ.çÒ´·_°ãÏ e®~¼]oc€0—`Ò6ÇtŒ_¦—h‚ Ï í/! âŽu¥ðÃ\pªbÀ[“± f(±=h¦ºáçŒ1¿ÀHÃ2§ð½d3Ší…v¬3«(f ÞR¨«Y˜Ý/ÚÑ6° @ÈDÆ¡–TD"•X(wZ‚xð;ˆ°‡x< %­C$ÇN‘83[¼Ç·#A[ÆÒ†­¥.ËÒ|Æ!œftÄ'Œ¢‰\èÑ ‘hþ%~0O‡È f4ì’Ãh0 ¶vBKÈE00„fùàS=§VkPdr’(ru¦Ô³J¶†0æt¦ÀÑ ~8àXi hfY˵+mW]É‘?äâKàð‡^Q’¨FBRƒ ,ôLLðÙ°…BbÕ(À | A0"ºÉnªt@„ –’ÙÐ@¹¤z&šH;GZºÒ•gºåزKˆ±ÂÔÙaè\â—Uó ÆôO€" ¾kþ hs z†gˆB×8†B: ¢à"–°„ülôŠ6}ÏF;D2¹çÂ&jPÈ‚¡b³ðÄ<¸ÀM\4œªÐ¤ Ÿ0‰I¼Qœ¢Èá÷ñ錛q8#¨F]Vø‚Tþ%#0) YA”ä'‘|ÆÍ…¤ŸFÃ'|¨õgBî—‘;ÏžsèÈ óX~æWnU–\­ˆHZž×–¬„‘…Ý󞳑 :lëtȳa!×8úRÁÀCº]”ÒÁ@]ê4{ÊdE«¥•ãíP»f¥‡Élq‹&nÁ R”ÀÔ¬À+*q f0Þ—qÙÅx0 \è£ò=ƒ¹Ù°y²ÔŠnGþ@ÚñŒ^û!Ú‹ %ʱ‹ÉPâ Æ>_u½! Á&2·Á_1ZñŽ" i½ß.-(ÆÑP¶Mkú‚Å`j']é’‚+wĿ̰ ö±JØ¡ƒßñ "0ÆÓ†ó£ïÆ…© ñž™èÅïè «øŸž#ýìh¸ÄI|4ü†a˜¸—º!ûð8ò#6©´˜+5É$“/AePWxWŒQ/øô/˜˜S¹D‡1±7s³Ì“ü9Ž(39:03 ûˆŽ0“o .Ú)®¦Ã;Yêß±„a˜«f‰7›€ª#ĺ=[€­{B¯þ£ƒ'Ü3¬Ã¤ 0‚sàK ‚=ˆ€µc…±,xÀ,Ì Í•" ®Aø…â Bß™£5»¥Nà•¶p j |±ô©"²„ {1Û¹¥¸"BšˆëKH¡ö˰þX¿5I¿û†ˆÛ¨qXÛ±÷ð?QÆ [¢z™±ø´0“[ú;\øAù‡þUXà‡…U€ä\Uà‡}ô‚…ô‡YhÈÌ‚÷REøt(¤B:Á)É? ‰Žœ£;“±+O{¥Ú1IO«%WJ­®Ê;¹¢ð¦Šº'QàB³É!,­ƒÂ'ŒÂ(”B°Ã$)i>ˆ!ŸÐÅRtKÊ¡PÓ‰´2̬" J-kà èÐ#¸•8,…\ȃ7·˜‹[ ;p‚OÀhàÃ=,H ¼ScGp„T˜}…qh‚L`D¦d»O ½g„Rp<6Q”ŒS ŒSEÅDÌʸŸÞ°Hð„H „Vȃ@«äƒ¼[£\«>àƒ9Áþ€|¥X©¾Œ€çcÊFd4j‡_«µH¨HÈ>yÓ>‡âïãM{6é*g,± Îß ÇhdK ?âdÇjܨ:‘õû!sh†!¸ß4GtdB@á|¿jüMv|±jäýÂ㩮ú†9ü»Y˜ ØG\…¸‡M°ÏàG„ÜO\HWÀ……œõE0¥Cÿ1†Nð’Ã!?Á‡è9„A±òˆL¯®ò*¯*-Ò®¼»å\£ø [¨¢7áƒfø†' G —¸$:˳®ãÉ)\Ÿ¼Q)4€à)£$‚XM¦lÍGtDt ÃP„Ë2CRþ¢Ê"XÅÓÒZÙƒÎã8¼%\‚¼(KàÃO@„i?hÀ2ÝC>„ËJˆ†]c¸<úÊEuƒDx˜ÄA˜ƒwnÊQ„®lQÌÕýÚè O° Ùð†Ì³ßÛª 83BµP ¥‹·ŸÃWú…­Ø[˜•`D xMÞ™2}脈7Û FìSU‡b¨ì`à ¤ ήÂ0s`©ô³Õ[¥Uuü͆ @hÄ)Yʰúûvp«_°?B `[Nã À!ÖuL?kµÕp´°ûPNYú!øt`P-Ñ’…ýÈ<ðÇuÝ„(àUø~p…… þQÃÿñåWÿé„XmÐ1é¹=‰Ðƒ=3IŽXX”ÔPÔêP¯’£Šõ +Ö± ªz“@Š#ˆƒ¼JB—ÐÉ&tB'„ÂlÈQ¡ìps ÖP™LXMGôÔͨE:ß~}ôU„ m³Ã): “A4ÑÁð4¥ß‰£];-ÜÑøh‚Š!»)£­€@²9P€CJ‘M ʹ!˜à°»®ã:ŸTY•Õ3LZ…@‡ê@3êÂ.ôÛÅ57ËÒÙF$Ò§4ÓaÒ2<ÃRÂP˜/"`ƒš…Ä؃n·?è„ 8Á35R(Ói0Sþ¸€I0&î7S‹a…[H…7ÀvHû`ƒI¬Äpª4Êx Þy†«µ1iÞ\”L3Yj‡9’Mµ U„H…SU(T¥\ʽ\ÜÌ Ö-Ý@"„W‘d5Q“5!„LŽºÜÈLΓd³KM]=IÞ6ó1q•ŸË…Rh³6ÃÁfeÖM&„5ÑdfýuÁÉß0×;iß8Ð, Ð}œW~œÏUðøÀUð{Å…ù ßíW¥æÅf5†ØQR턇¸%1!Xù-ºÀ©ß† «!H3e5­Òú8y£ÞY#þ1Ø¢ºÉ"•±è$‘‹ˆƒ8°‰$l‰¾œC©`“Í:®ûº.è‚BqÙ<¬¬¢­ÜÐk‚H[Ò^Äþ”HŒažJ,À®X H;¥„ º‘Ç_b/Ø…1RøÒ©Uâ:¸€ Ø‚-HâIpX ÓÜ Ða‡°Õâ‚Zv3ÛèÍ:@3à€-è6Bßq*Ôáï%Uá~á%-2”Ê&¥aP°„[da‚B·çXÚR@X0`©­‡ipƒI¨ƒ:¸Fàð ÇéIðéïܼ…3` F+h;=I8€/Œn)ãܸ—Q<Ú [Ûð¬f–«¨;µ2 £šè+þ·è9WÿÙíÝ•´žÈæµ<ä&U¹ËH诺Îk»^dÛ0bðdqveW Â]³ø}@åÒVÁßôc”s …åùì?˜eÐ&<çN[ž1+ÝMf³|st3qÕíçUtíÚ§‚Q€ôQOÛÆÔ®ækØàîíLôÝæ†`M—òãn^³6u³î²ÚÅ]’tÝg€“­Ø ÄÕ¢º™õ¸áaÖ"ªÞs #’8€€óž€Hq‰Lº ~o±K”B¡o&)“r”Ô6.„Q¬þ†aŸ½¬ŸÚ€xÒ£R"°„Ð\˜p´¤i%f„þ|€÷|¸¸ƒ;h„œqlˆ„7p€b ¦Ü.n‚²…ƒCÐ-h®ÃøÄÂЖ܈„à [Ùˆx¹­wb®VîRÐ*P€É3°ªøÊ\8íö_\¸-¶pOÿчӓkDÖ.—ù™·Í7OeqVk1yå§9P¯ @ìÙiïî½Àuð×±€„k±o¿fÄž`–؉B‡k6HÓ`m©s'_ ` @‘O[Ä=âDr>œzíYx!†ì½OXÌÇ!!J¢Å!ZŒ(É5×xãÍ?£tŒ§ìrþÊ)´œÂÍ)žÐâH1×àò^u=‡Á|ðñË CaôE'4(ó‹«Œ2e*'¤²ÎAëD’Ê1\D*`:¤PDešÙ’ 5QQ …ÄÒI2ÔLOC´§(1é4ÓKÃŒcÓLCÜ´gœ<Ù ™š¥ä²¨S‡%e—RO95): £:!@ÂZPcÌWZý3ê?e•å©jõÕX³Dõ)U¯~úi'ƒ½é­Ú…×®nÕú×_µ ×`v!öcE•"Š0‘EVÙ3Ñjv†g¢Epmedx”¶‡¶` çœc0±1›2 (Anñò‚oÀrà„À\s‹úþ[Q.m½“Ç;ïÀq0Ø}×v ƒ—Ýu“wF™°¡Þz¾Ç†-?°óM.^ÜÓ˜‚ # ¸òÊæÓÈ 2CK>ƒg¸³…#bˆÛ-I+¼ñÕV^¸òO*GD=ã)‘ÜØÐ.»á .ÆÙIÁ¹X£l)~¸ ÇZÆlõ%£ðpÄ Xîr‚#Ž`éP*[êÍeC 94F™dæwB‘ÜÉGEÖÌc$ÝÙL/é¤Ó2é“ä5E.ç=q´‘(•ò‡]’:g¦g5åÀèLä”TLu V³hÅ.ü„”SNùÏ5¥vËcͪú¬°þÂk^·ºà‡s@/vUOWµÎš‡1y¼áµaÆ.ª(c‹-+L³’eÆ™DàN¶¦u‹ÇÞâ®-ÉT€ç`€.l€±.Ú¸ ˜@n¨› §¾Y†÷eŠ4C#ŠÉÅ¥Ðá½0…}'báÑNî“°Gg@@&Ò³Í0™h‚%~Q }Ü Â$aƒ±¬ˆ°Á&ƒE¢’Æ3šp1žQQC@€GЀ°Dï ieXå+ÒÆ*RÁƒ]8G´à†#`T o\ã J Ò¥s)&} +šÒבµº9"kl´þÛ™"¡ Ej"€+Óà G¸½…¤%¢€ç"7@±cš´ÜæF’’;eî%ß ]T”–YLŠ_”B‹¦&ÅJ}Pƒ’jЦ\¥~1' T .HõTýc£ZÅ*‚@*®l…,`™ 4?õ½À„OÔóC²²Y¶Gaï{Âz8ß qIWˆ‘ŽbJa¾d©Ïg°®Ušùѳ[eˆ’A.  €Tßõ®x-7»‰Œ0A ˆÄN¢ä>*¢/|Êà”Ä!6,€;Üa˜xö0 ƒàByCÎp†#ˆ~0QüAÿX+œ‹:ø‚ˆE4¢þ D8(’ðà UC>ƒwTˆ°À!„.¸ª¾ ‡,øÒ*®pš4Fq„5ÒÂjW;ÂS$Mæ¹eV¸pEĺÆBÒu["ס¥EF£¯}à[D‚°…ká"‰¼Åä1Îr¨C/·§NúéOžŒÜ(#£¦ŽØ©±#éÉD,’œ’¡ˆiöº?Lªt“ZJa‡)Ø)¢«RñÂ,9 )ྛ?F!Ìaza¸ÿà@œ –²ÐŠ`.°fbó¬Ì2Kòž×Â9Îí’3Hºªž¿ž³NQüB3?p·ºU?°—½ÙrG0V³? ãéŠMºþ ›*¼¼rÓ.Ø4t¨À8žñÍâƒ.Š€’7œH°œ” ‚¸0†VB`(š Ò¦gõƒ)CÇÃTDƒŸ˜DöñÓÀäh4ÄÁŒ#\ãPDÀŘÚÔöJK` »˜fA+Á ~e„Q6´eœägS4Nc,[Þ-XÁôq«ÅDƼíÃV=u0?wì!äâŸÿê{ߨĆ6P¦ Þ¯Gø6ç ÌÁÎXB3ãøEdC—­¬¨’ð10 U¨"àÂfXÄŠPa ôƒ!Øf‚g OÀ‚°Ž[@¢“¸hlDÔ!Dó5òPŠ_´g²{Š 1-r¸Ö¸ù&h„àà€?ŠÉ°ò`4ŠD¬£#HcŽÞ½aåkHÃ.Z#µÌ 8Âñ W[s$ˆv†Ô¹į̀36"‘þvÃFd’ Ylž4+]ga®±ÎJÉ È«w½‹Ž(Œ/FÄ;º‰¸É_®›ˆiÏ‘žœã”§Ôˆë"_N;ESkÑ%Z°¢ˆ)ûcà€nWq‚U z½õí”^LÞ)s·º-¦ðºö)HaóÐÚÌr†Í$X‡¥˜÷®ÑŠ)›øÄ—„$fqQq:[n_ž6ÓôÆÏ~ßêöjPÐŒsˆÛ ô¥ï?Ém…X¬‹¿î:¿~›‚aà?€'<°K<ÃNÖx®1¢.‰wlÔ<ðø?àÀ`†ÍÜÁüÂ3´Åx†ÅTÐ;ìÐ,°+Ø,\ȉËþ‚l@Ž¥C$•ÍLHÎY½Ç}‡]G`Á Xà `€Àƾ„ÀÏéN1¡‘4]ÖàŽtÙÛC1¸H*HC0]Ž%dÝÖqC$x‚Já.lÝš11ÐÃÙuáÍY%4ÛA„b%VÞX×süb@†ŒæIäÉ`À7¤“6X¥(B^üKD}ÎçPÄ9 áYÚ˜Vi âiQÞ¦qŠ¦Ô–«ÔŽ3.¨Þ«ž%"“oé–ëIIïøŽ”ðN©¤…7 d0 g €g¤bà° ƒ¼ƒ8 _+ Ÿ$ôŠ.ÖQ˜…^äÂPDßûÃgX‹¶\Ÿ-ˆìþÿàWý3Æ3Άùé—È2îÁg£güÀôÞ êÃ÷ÐQ¸ÀI¤ã©ã  ‚BvÁuÌAbüÂfˆ˜JA|£ŠƒÆUB @ƒCz €@Á¨ƒ8ÈA@ˆ@QÅÈÌ­A:ÂCÁ…T„‡ÂÍ@ bäœA€Ã#€€Þ•©QV -P!Œ]ÛÃPBÔðŒ7x1x‚OJ!Q!PFƒO†œÑYÚA$TB6¥™(Ö– Nâ4dDF‘ÌÄU$Ú‘ð(ä]¤-FDE”V„bàÈåiV¦ÕR¸%±ÖëþP ¿lÊì WaÅU\ZêùNpíÖoýVp­šoW©ÔѬƲ”—%@àÄEœ |£¹@\ƒa|¦¦H\ÃhŠ&ñ½Á,ð Zæ‰fp<Cj„F|¨ ÌWø1ã¸1£lÀ†~ÑFl @¼‘€8€µ`‹N (à›¢Ð”‰0ü:²c:úŒ‰ùL;à…(œÂ%`…5 ;é^½)§>\CÞ°$@Ã$4‚„B‚`#Lƒ„áƒH‚5­\ÁC  B• ndÄÌ@x$HŠ$”…nœdJzÞ¨¨Ú\m]ÕaÖœÙXÕä™9‚ÕhCðdþ$ PnÝ%10Þ]%t!3ÜS:}BRTJ’08šâTŽ‘€B¢±C\FrvåWÆhùœex-ÊQŒe\Š\ £0 é°V\Fž,b¦Ä í¬Ríð¥î€`ªÞ”œÞ=té ÜÃéõ„io݃ÛærÉ…/Š‚f4°AT§‰¥£e¶Ã3¸"¥Hgz&iz¦Ÿþi„ ß(úâŸuÒ8´Ÿû‰-8l†ËjŒËö‰5R#å&õ&oú™ƒ¢C¶ÐÏKEt£%$g)8ƒ>ˆ‚R•˜‰½Ç µ—Ì©f'( BP= à Øc¶î%˜Š½Á5ìlB4T$,Á$\€ $(¤PÍç–¤ˆõ<§Ã½iÎT‘uþŸ Ò\ÂÈ£Í(H:ãl¬}žç%“4¤‚!IaQV —’Œh‰#\'L!=l!=„]O†¨†å¾¢¨‰¦èRF‚R¶Þa*8B@;PKcKÍ+ô ‚‚5Pictures/100000000000004C0000004C51CE250538658B6F.gifGIF87aLLðÿÿÿ,LLþ„©Ëí£œ´Ú‹sؼû†·|f—œj¤¢ži ‰V\Ò=êOÁÁ| q”g£Îä"Bs/äóeöªÎêÌ;Œr¥×qÀùư=1ª°MÑ×­zý¦»Óð3Ý Ç·‡'W–ç4X—·È&¸˜è×7ו$ó—Ù·Y¤¸GõRØD6*ùg9%ZCºj ¶êùCF¨Êw+‚KSXK[{¦k‡9Ìû›a kÈzÌŒ*–Ä\á\¼,l¥uêK4ùö8 îª|—‰=žšË܈辻.Ô.<Ϩo{ù‰ïÀ|Ï-1HÍm•âùCØm›À{ãqˆïŸ.þuµ ³8§±A9Y­ËbL~D¨©e@…\Œó¥Dš2=–üy0¦Êm>Å%¹RÖH£‰&Ê›å䡎ÉXî£JŸ‰Çs­™êüç6ÓÙ·ÔŸ@(AŠÐŸíQ¡A«„D+Q´‰JÔh ¨C ŠÎ… ”œM(G?ªÑ:ÓŒítg­2%ODÖÓ—jÔ§LeÊOд£ ©HoJRš´¡Í©P‡ŠÓ¢î¡Å(E/:´‹2•¨G-)‚ÚSŸþÔªT*VÆN†Ù’r-=/IÖ²Æq¦h•cM òБjÕ¨o…ëU¡תÊuªnÅ+OëÊW½"­hR‰öÔ’fµ¯~Ýj^;×»6S–^}'XwyV8¬qZZ7{ŵJ¢­{m¬]»Ø¼&–®¢-b{ZÒ6£¯þl`…VXŸ²–±¬m­jWZÝ~²’0$g‡KÜÎÁSSý”*nM»ÜÞ‚¶¡¾M-oC›U§Î–¶K½.ЬkXæ–¶·Ñ ¯xŸ«\®0…gü*K‹ËÞöï¸ÉK®bê]êÖ·¼öuîwÏ™ÔÁF¶¯ÕînÇ{ßùÒW¿Ð}ìyM&\÷:8­ž%¯QKàü&Á¾°…ñËáîbØÃÐ ïm?ÌMñ•| ¢ŠWÌâ»øÅ0ޱŒgLãÛøÆ8Ö¡gÿÈã»Q¢Ç?0m‘&d yj(ÔaÈÄä&;ùÉPöÑŽLå¨ýÈEÞ.‘«Ìe©wÉQ³˜ÇLf'O¹Ëh&Úþ•{œå o9Íp.Ú—Õ¦2ÛùÎxÎ3„<+Ä àÏ€ôú|4AzÐH;t  m4E/:ÑŽFt¡M I7:ÒŒ.Z¤ÿœi¢mºÍ€ý4¤Ýé¡mÚÒšÆô¨I½êC—Zh§~uÐ6Mè9K6Szε®w=f>#NÖ?v°‘&l»ØÈ&öÑ’]´3»hφ¶²1úfj/ûÚØ6Z´‡¶mnO[ÚÙ·¶±më•Ö™×èN÷…€¦îùúpÇþ¶¸çííp­ÛAÃ÷Ïœ-ïzÛÞþ&lµ+Úo¡éh7vÁ ¾p„7ÜáÏ·yBÀ&ÞúÜí~2»0 ¢©‡ÝÿÙ‚þŠÖñ HhBùÉEÎq•§¼åyËKr™Ç\æ§9ÌoÞ w.Þ—xЇ=t¢ÿ›Þ¿‹žp…3ýáFGºÐ.õ©ßêN§zÒ·Îð§ âèE˜3Þd–‹¼ä:ûÙÑ>r˜³}íªyÚáŽvÓ=äsÏ»Ýyžw¶ã}ïxß3|ßgbw èZçºÕñÄw½êÚÒù«=ë–§|åùÌC>êœï|èÿyÑ?Þòåž®ÉÎ䵫ýæ¯ß9ƒÌþv¾ëç´|íäú˜÷^÷}üïën{ùp¤÷¼ò9ßô„|òŸo>ÔAM}¨Kßëš=ó±þîü‰'¤âé½øAXßúâãwç=ßÓOü—û=ýð‡½ïÍo{¸¿^ýì÷x˜6&Ãs-ù£g}Ü'€C}Ë·xXtÕw4 €§w€¸yX8Ú't©÷;äG$ñ§{,çw³·~Å×~·|îwò|(|÷§‚rç Ç÷7ˆ¦‡×—}Ïwƒ؃>˜¸€Ö¦ƒˆ}¥×}—‡„x\8$ñ'w!È~+7…·‚ï7ê×wçG'¨…\(‚=7xtþ·55øƒ<„j¸†i˜†;ˆ„Ù׆Â&„g„ˆ†gȆpx„¸„”Ó„Bò*Ø‚ Bw[¨rþú'ˆ»W…Yøw¸‡…ƒ†:r3˜7y(‡‡{x‡¸}I8}'pv˜€Dø‰£xxHnçeqæ6~€$/¨ˆR˜‚Á÷‚‹x…Œ‚nç…º˜‹¹8|2(†5Ô¿fŠšhŒ|xŒÍ†‰ÊØŒ¢8„uXŠÎx‡Ì8¨¨‡}¸Šá׊ñЏwPˆ~³¨ss74äHr&r±çr4ƒógŽêXàøŽR‰xs‰9HÕ}׉טÔžhÿX„Ò˜Œ¥è‡«ç Ùdfwƒ©iƒÀæ88‘©‘‰üˆŒ ’ž¨çyf4&‰gž,Ù’.ù’0þ“1)l2é’ÅV“-I“87¹“:‰“ ;É“G3”= ” ¸“Ôç“EÉ”M‰”Fc”H#•Qé”U •EÓ’$éŠ)Ù•^ù#g8^¦U–f‰PkF–!–WtøŒRu–k—riUI3–[i9–—z¹—|Ù—~ù—€Ù3K„Y˜†y˜™D ˆ¹˜•T žä˜™Œ9™”Y™¡t—’𕚹™8–€3–sI—jšp•–¤9`J³GmÙTp)š£éš§‰Xu©4˜É™¶y›‚G9ñu‰šoÙš6›[CF¦ù›±ÙW«9d¯œÀyWÂY5¾ù›µ‰›ÔYâ™Ìþ¹œÎÙœ»Uœ°ž>•œå²ižÒµ4ÚÙd9Öùž· ‘?sjôYŸöyŸø™ŸôY†žÛiœÇ)^ÏI5ëÉžz ÿ)Ú(vtÆ•ðù _)Ÿm8 SS ¨‰žlèVþi â™ ú¡Š¡zž* _÷}awc¡,j’ÊŸÊ¡¢—§¡©É5#šžä©eÜI£š£&Z¢v¹ *ڠ݈›7‰±WŽmgŽì8‰+gvó9‡ŽWsGéxŽJ*¥Oª /Ú59 ¤czx8j4ê£3:`;êf=J¢?*¦g:§Hãžœ)¥½ˆ‹mg‚RŽê(‚±H{¹·…þ¼è‹ ‰í—{a¨›„' —H¡RC¦tZ50JWi §kŠœ¡Èšošž7:œr ª“j4vª™„Z…²·§ƒZ‚ŠzªÀ(¨»xˆí¨§§z‹°*‰ ¦£©¡ f*ªjö©¾º«åÉ€›*£Èš¬˜š©Aº–¥ú•²H1Xˆ$H­zJ…À‰z¥³J¨Õ:ˆ_¥é¨«ÀJ ½j®ÿG¬û&¬èZ®œ nɬ’ꮪ®P3¤`ÇŠªW’¦ú…¿·‹ bˆ¬ °PZŽ$ƒ+°U ‰½ww.·¥´XÂø;*¢çZ¯éJ¯@s©žŠ¡áÕ¦€e±öÊ®íZ²&+gDYܘ™¶ùþ„ö7sãÈ‚µªˆ¸Š‚ [­± ±!¸§u׈¹ÉdX£"«±÷ú«Ã¬5óz´L‹±D«žË«#»D)\Fʲw®´³`xˆé˜­ ë‚ßj« k…d›§,¨¥gG®M+µOK²SS©¥ ·Jµu;µ[¦xÛ©{¢~ *~GÚ²eë³\¶gÛ­È­€:¶¶ø¸ˆº¤‰›¶Æ7±ÇU±|»´'+5rût[´# ² ¦·o›´wÛ¶n{4ÏÚ¯ëøˆ^°Xz¥â³±»¥;çºò礳ûµYº°­[»%˜«–K9˜§{[¢ËWÛ¬Ìú±ÇZ¬Æ[ºy{¼ÎZµ+þÚ¢ØûŠl»¹ +½|;¡{µ¼¤‹º< ¯ï£j*¯vÛ½ä+4«›½øðf+‰•íû¹ìë´U3”ü+“”пÀ\“• ”<ÀœÀ ¼À ÜÀü¾óÁ¼†y3¾Ü µÔ«Sâ›Áãù¼å‹¾Ë ¢!¬¬}ÛžÖ{µ™Â*¼Â,ÜÂ.,˜Ã«<–9Ã4L™ŠYî$™›¤ÃšÄÃ8üÃ@ÜJ,ÁDœgŒ7¬¿J¼Ä§+yøûÄP<½Þ›¹ë‹ÁÞ;ÄEœÅÃaÒ›,Â%½NlºV|¿d\ÆLÜÄiœ¿©{ÁAƒÅZÇPvÄw“Äm|ÇxÌÆÅß«šì¦þbìÆgÌÇBJ›',¸X+ÇŠÜk\|úùÈÉ’kC;Æ•ìÆ¢{ÉkLȼÉT›¯Û¸¯ºÈ¤üdê5v¬ÆyŒ†© <Å •ÉTüÅé ÆÌ+šp\ʯ谼¼¦ÜÈ…‡8­ŒÆ«Ì†­üÊf|ƲÜÉÅ<ÈÎÜdž Ê»²0軼›»MŠrOºÍ»K¥\j¥º›»‰¨ß,»ðȵ;…/[³9µ§\Åœ žZlÇÏ¶ì¼ÆšÏ̬ÊüÜÏÄÜÌÞ÷·)ª²¢<¸Ž¹=‚|¼~ÚŽë\{n·ª…š¸® ¹‰j¶òГÛ#î ÌŽ*Ì´\˨IÏöŠÌ‚¬Ìþ²³ ËÍ;Ì|l§3+­³x«5ÛªVhÑŽ¸Ð^˜ª1§ÿѾì ÓÔšªj± òÎ!Æò,^$ý´&íÉÏ\È,­¾K}ËÌ ÓẤÓê³”k‚¸JÔÚúwÜ xŒ8¶î§µë¶¸†Ôf­9g°”èÑÉûÏzìÏPüÔíÕ­É}MÕÉì×xýÉ(ª¯HˆgK°<‹Ø`]°Þ,×T˜Îi½ˆ +ÀëÕÙÌË[›Ð í‹¢ÔUMÂLMaz}Á|=Ø(­ÏÑØÔš+Õ‚}×î{ÈÔŒØì…A-³7Ñ6ëËM֓ݺ“ͳ;Ù72Ôœ½Ø•}Û`J× Ú¢íG¥½Æ§þ Ûv È«¯¶ÜÚ½ÏÔMØmØLHÛ[­Üˆû»Çݵ]ÞœMÔ8 ¶Ê-Ôl½Ñ†«Öâ:׌:†Á|8.=ÕRÝ«<ÝÕàËÌÚðÌß¾·¥¨óý êíÓ¶ˆÞˆŠÞÝÞ¹]¸b«#7»¸1ÛÓÚ Ø‚ìßþ àöŒZnÕÎ=Â"­âçù¬×ü²¯;‚É=»å<ãiGŽ’Ý¥·«ãj‹ˆ8Nr]!ò;«8»¯;äâá' Í¥+â°MâÞÁªÝÏ]àRüáÕ+ÍEŠÈºÜåM¦ä® âžìäÕ åWNåÐ{ÝÙmåLŽå ªå}Ø ä^.Ç`¾Ý-=µœÀþÿ»ç~þç€è‚>è„îÀ¹\çˆÞáíÅ)ÎâX]åËå¢ýèŽN飽æW­ÝDƒ™/Üéžþé êƒĤ^ê£tænJ>ŒI«~I­žê°ë•tè‰^ë{ßÃÈ›Ííæ(Îës+é+®©S~¾½¾äbŽç¸,ÛȶÞìBÇd³ß¯àdlæmŽæŒí—ìÛ^éÒnÂpnµ\îìä®è¸þ;ŒîëÞèÑeíÇžæÚ®ÒÜMígæY^Ø¡,çå¾ïÁxîÇ•îÆ>ïJ3É”FðÿÈ• jþîêîíWm¢´ÎïäícóíŸ4uÝî%Îíøl¾ÊyñÓ¾ñŸ4/þñ€ˆÎCBñ¨üð_z6 ì#O©lþîÝ óÝÞâÊ®ï>’¤ãŒÍE­ÍëØTŠˆSz»&ÎrMôò{ô<ä.û·´ðö~àfXÒ"óZŸñ–Þõ]¯é5o–%!xJ«º­Î9Û¤)ˆ~k/Ó:ÝÖ^¨f}Ñ×JÜ;¯Ü*?óMýõFkÚYïõ~¼ððŽéìöô.ö9Þw?á2ÍÛ@ýÕ6-÷f{«ÎÓ¹Íø½HÓ° ßôxÔŒ} yŸézß¼Oœoøò®æoõ ¯õ|à‰ÿ‡?­ÚÕc]Ó+ˆpÔÃ]û×â üH½ùðù)gsö-õ’@õÈNø2þÕ§Ï'îüŸçìñ±¿sÞˆÿÊμ?°Ž ‹¸AÞ³ ^þŽô_m­ÅïÙú…?ú÷\úhý¡›Ò£ËòúýøŠïÓ¼ì1Ià@‚ ÀA… *œ´"‡ +&´81¢Å‚7Rüˆ±£Ä‘C6ô‘#ÃŒ$ z)&B5QƤ(IgI:}þ”ÄÓ'J¢E%JéÒ†J™2uúôhT©FTŠ”’TªX›z5Ú•h%¦d—šE*Ö«Úµ`“º} W![¬tQõÂÞ6–Úüõ)T'NÂ/WŠ4Œ8&L›2‹:VRqÊÃ%OÄÌÑòfÍ+g‚þüœ²hš{î<õP¹Uí>} »5€ØL¯¶¦»U6îÙ´Ï–¾´vÚÞóÎ6¶¸TÕ’ôòõ xõàÂÕGgf™"ãΣOb×îPòøË-s>Þ²w¡Kn4ϾzàÔªKê½[nrå¼gßÞO+®[®5ô/A¸ø+ŠA”|9Õžª¯¿Ú Ï'ë6¼ >ÊTo»ò°D‰F$*¡1²é±›HôÐ(™V„qÅÅR¼ñDCÜ0Ãæ‚J-?¨$A‹,J·!\ð¿„Ò-¿bRJ ñ¢ð' ¥Rà ¿3L1Ç$³L3ÏD3&›»OHál²J°´þò(%ß”³-¤Ð:ŠO£ülÎ:£4Î<‰j.KŸ¶Äp:IÒ„)H'¥´RK-]Ó¾ Ý<ŽP°¦ôm©F%µÔQéüT@ý õ´!@Ç25ÖJb¥µV[oÅ5W]wåµW_½5ѽ*Œ®Ñ.©»4Ye—e¶YLÕ”5N=Ô5AS=ôNâªpÏà¼Å³Õº®ÕS\kŸº ×´¤]wß…7^y祷^{ïÅ7_}÷å·_ÿ8àaesÓiã2·Û„ `¸a‡†8b‰'¦db‹/Æ8c®äâŽ-þxc‘G&¹d“OFYät‰]×Qg_†9f™eί6F˜U±åvI£´Cítgžÿü¶OŸ….éq{>©•µ,vÍ™§¦ºj«Á¬¨›q¦2áU UZá$Å»l”^=»èþ¼nzè°¿6»¨§} ;PKcK:ñü,,5Pictures/10000000000000C50000010032EB602B04E5DFB3.gifGIF87aÅ÷   ! "!!##"$$#%%$&&%'&&('&)('))(**)++*,,+-,+/.-110665==;>>=Dd¬GFDJJHONLSRPedbgfchgdkjhrqnwvsyxu{yw}|y}€}…„‡…‚‡†ƒˆ‡„‰ˆ…Љ†Œ‰‚ŒŠ‡”“™—”žš‘ ž›¡ œ¦¤ §¥¡¨§£¬ª¦­¬¨®­©³±­µ´¯¸¶²º¹´¼º¶¾¼¸ÂÀ¼Ä½ÅþÊÈÃËÉÄÌÌÌÌÍËÇÎÌÈÑÏÊÒÐËÓÑÍÔÒÍÕÓÎ×ÕÐØÖÑÙ×ÒÚØÓÛÙÔÜÚÕõõõûûúÿÿÿq øxÆÆ""k€@ÅA"ÐÞ| a7# ;ÈÄ#"hÎ* "|p |ØØÅÅ""¬â[ aa*ÀpØ Å|"ô$ìÞ| naà"`(øSÆÄn""HD¬Æâ" a½O«vehrwrit+xewÆ "exiªstli¤pn g| fHiÆl"e ô'/mpw/|s½g«grhou.gõi f'?`Æ*"|k€Ñ*ì|JÀq>å %Y8XÑÆÅì""¬·ÚâéM -aaY€ÿÚÿMÿ-ÿp |#$hÎn,Åþ¿H° Áƒ*\Ȱ¡Ã‡#Jœø0ˆ dÜ@q`€Ž CŠIR$"_¸,!ù±¤Ë—0cNDÀ¤`K%0¨ 0@‹ x¼Á¡B†"=ºhp!…̧P£Ž\q€Ä -I¿„¨ñÅFË7¾ q Š@#¿´,ðä‹©pãÊØ£n1‘ÀÈ`"«*_®|ÍòÅËB>L¸pX­À"t`c·²å˘3kÞ̹³çÏ CÆKWŒé‚Sø,8ëž_ üU '>|1Í»·ïßÀƒ N¼¸ñãÈ“¿KùÀ^¾yDXµÂN°òEí.N¾þ@90·¼y‘ΦÿR B²&±…×°i(àÀöÇ-\ Á çhàCë­§Ñí ÛFèR‚¤1T„hp„„vH…†("L Žhâ‰Vø…‚(¶èâA%~ÀŒ4Öhã8æ¨ãŽ<öèã@)ä=–Ö\…H¡ä’L6éä“PF)å”TViå•Xf©¥”饌[†)æ˜d–iæ™Rt©žŠé%‰æ›pÆ)çœKª¹"›H*ycnÒé矀¾igŒ}¦Y¨¡&ªè¢VŠç@…ÎÈ褔VÚ¤£GBʤ¤›ö))§†‚j騤R‰é—‘ êžœŠZê«þ°¦ùåšòy©§6"ªk¬¼’zêšµê©*®5†Jc¯ÈZú+­¥z+ŸÅºšì´‹.Ûf§Ï ­›ÒRë­œÖæi+¶Â–kì·èún°é¶›ìºÍº+/²ð‚9ï½¯Ö Àüöëï¿,ðÀlðÁ'¬ð ¬oÃG,ñÄWlñ_¬ñÆwìq¿,òÈ$—ìoÈ&§¬òÊ£ÌòË0WlZ¿3#,†Ë1ç¬sÂ5ÐsÁ¦á¼óÐDÿÛóÏ=k›E7­soþ-¿S'}óÒH:­5Ë5KMóÔ?ÿæóÕÀ¢ºõÙ&#MuÕc« °Òeǽ/Útì¶ÔnM6þ³r×í7Çw³=sؾ-ô߈7ÜµàŒ¯mõá‰GÎ3oQ7N5ÐK®ùÊ™oî9Éú*'ú褗núé¨+§/¬·îúë°Ç.ûì´×nûí¸ç®ûî¼Ó¾zïÀ/üðÄoüïÆ'¯üòÌ7/;òÎG/ýôÔ?5¤Õg¯ýöÉCÏý÷à‡»÷â—o~ö䟯þúʧÏþûðóî~üô×o}Ü|`ÿþü}³ý `ÿæ'Àš€Là÷¨ÀVŒ ó (Á vï2J7ÈÁz09´ …špw%<¡ m—ÂºÐøkÓ g¼ßE Q¸¡q¸Cî0vþ9d]™7ÄÜqv9Lâ ¿çC:1ˆ=ü¡ï0¨¿'ö‡OÄâa7Ä#&Ï‹¶£ìƽ&F1‹Pd![§D6&Ñdäa‰¸EÜÅñuw¤^…øF>æ‘uÐó¢ ëÈE(.qJ$$ûÈG×íQއÈÒ–ºô¥ÈAiJO(әް¦6µ Ns*ÁÚ/@å©. Õ: •yFöŽ*TîR†`8*S'U¥VoªMuÝ諸<®^ÕªY}ÝV­Ô¤‚5©¬3ëì°ªÖ´Õ­pmëZÁÖÖ5®dU*W½ ;¶æ5ªÝë_çZW±T°xM,`eWÖÆ*Ö±‹åk_éZX0Ü5²U«d]‡XÎfö±”}VëzYÈB¶¨ƒ¬bQ Úź–±¡ þkiõúYÌÂ5ve­mw;ZÏVÖ®lUßêV¯ö¶¸©E-S5‹VÚ·©ó{®ø¤ëÛßZ6¸ª…u=[¡®¦à ¯x;èSëæ­zÓ¿õ²÷}îM¯˜7ßÚÅW¶Ud~íºßçÍ›Øì¯S‰úÞàý—¿b=ðìþ«`Ë ¸ÁC} \Ãý6¸F F°ƒµú`c»öïo¤ßg¸Äî°ïfâŸXÁVñ‚1¬_o¸Æ4rð}ih㣘Ã+.1ƒe<ã»XÃ'þ1’ÇWÅ!ûxÉÎÔ„lâ*+ùÊ0n²þH dxÇ3üò’m á,+™Ìæ/þ˜ÃœckÙÍmfr™‰,g#S9w=^^žµjç;ß®¾í£q<ŸŠ¤ñúЈŽiŸý\À53šzŽ~´ô"-é .ºÒ)Þ³½àKK:Æ õŠÑl_JÏTÔ(þršSÝ_MÓÈÓ˜ó›9íc1wYİf4ª“ˆS\~×õÀ‰Wð(£ŠÊýž±•þ à$û7ã9 ¹C]ê'“Ø(·©Êc^ÃûåÜF··)` #|á˜ÏüKñ?£½óÓã<èMàÑ·÷ó.¦<ÇÏç©_\ï'óÈõízŠ×»ßI÷ÞQoÞ]Ó:ïìž½¼kÿèúryëBw³ðÝÌ{ž’ö£»•åÞü”Û=øD±Ú·þ>üÃcúùØŸ¶ö7Ì}æ_ãqБ=뎃}È¢W øÅïö››½ÆÕ—ùïw§g÷ñ—@*'y›¦Fç—xÆz›y'7š÷€ÈAhz†u€x>xg(>ÈC\Xq &]ÍÕU øz#Ø]®µ]»³Yç=Ïå‚Ã#ƒßƒ*(X Ø\r•]ʵ\Ä…ƒ,(l)HX¼E[­…[”ÕY¦e„¯EZ-v\JÈ„K[µ‚Rx…VˆtCH…E(\oEƒ¹u[SHƒÎ·…HØZ~u[ÙuZbˆ…d˜rf¸†nX[PX[º5†É%[q8YÃåƒÆuƒ?Z%È\'è„ç„þjÈ>ˆxjÁUˆ¶³ˆÙ‰&õ]X‰–Bù‚ÇšÈ=¨Ÿx¡X@¨‚ÔˆŽ(ZIhŠÅƒ©è<£%‰tXy¨Š¶(=u˜ˆ¸(ˆ¬>³å\«8=¹Ø„»ÈƒðE‹|HWi؃ÈuV9øŒ¯èWÐ8XõŠºU]ðsYw茷˜…Q赨‹ßøDˆÇèzËèƒÝ¨\YØ„ä¨Z_H‡s¨‹æXê£mx‰èX|å‡ñHù˜ŽóHŒëˆŒ](ŽÜ˜ùX]ÃȆàx„\h÷ˆS¨Û‘]†vòŒÆÈ>8õ8U„èÌØŒs傃ˆV;x†¹þ>‘&‹ß„±Ø‹"ȉÊC“܃ˆ¥¨^Tt‰B9”Ã1Цg”£‡” §”Ç”(¨“(PP•–‰T9yVy•ž”•Zi€Þו Ä•`ip_9–%–fùaS™–dtDò–p—r9—tY—†#/’—z‰—zÙ—(—~˜!˜‚Y˜B˜†™˜ç˜ŠÙ˜q#9™’9™”Y™–y™˜™™š¹™œÙ™žù™ šš”ÆDéRЬٚ®ùš°›²9›´éš§Išgš Ѩé˜Á›µœÂ9œ³©"0¸Ùuº©¼iœ¾ÉÀIœÒ9´éœÁ›É ™Îþi'+қω «Iâ9žM "Ü©ÈYšÆixÝi߉ÑIžò9œæyžØ©žqníùžŸóùŸÅ™ŸìyŸ¹‰$úÙœüÙþ   j›z—éY ÚÞ™ Ìž š¡¬YŸÜI Ê¹žZ¡ Ÿª¡ ZŸ×¡j!êž#Šž&ª¡æiª»)¢/š¢1š¡.ŠžÙiyË™š£Ç¹£'z£?*e_`šš¢ñ¤P¥OZ¢F*Ÿ”Á* ™v¹¥\:—U  ?’¤_dZ¦fz¦hš¦jº¦lÚ¦nú¦p§r:§tê¦D¤xŒ™§| #–×§€*¤¨„ª¤+"¥ˆš¨Šº¨ŒÚ¨‰ª"©©’:…Z©;PKcKš»í í 5Pictures/10000002000002580000005CD474168E30D0D026.gifGIF89aX\€ü!ÿ NETSCAPE2.0!ù€P,X\þ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇòL‹ÁçúÎ÷þ ‡Ä¢ñˆL*—̦ó J§Ôªõ¹j·Ü®÷ ‹Çä²9™=«×ì¶û Ëç¸4ýŽÏë÷ü¾ÿh÷'8HXhxˆ˜ÈØèø9µXSiy‰™©¹ÉÙÙ²Cé):JZjzŠšÊ ¡£ú +;K[‹Àúàj»ËÛëû ¬ë l|Œœ¬<:ÜP¼ -=MÍѼšS­½ÍÝ}½ðì=N^nN ® ~ÎÞîþŽ’ž°_oOL¯žïÿð¼[ý<ˆPÚÀû:|ÖB #Z¼ˆÓDþ3nÛ8¢ŽužDN.ä ”óXÛØÑc56nH0ɰ¤M .o©”Ñ“bP_0 ²0êl§O†x!*ÿ èZŠNµ—žq ÒGäƒ]8d‹AîXæuLâ(¤Ž[V˜fqxXMoÊæ$GP~(%‰`UÉfj)#—Õy9¢lai•Ÿ9"y&œRÎy¤›76h\™FZ™¦©Ýi'˜1ˆäa¤û…¨‹¥Ri^¢tŠê›V²ò¡˜IAº&{–úêšYæê©¯ ;þ,h:Æ™i@ÎÊ ‚´áYª_Áöª«èÕ9j¯­~Z(´4Ù*­·àjŠ+¯‡q ,´›¾xé“«Šû£ŸÑ2Û¦³.æ nºÓV먆î¾'o»‡Ú¶%¡Èe9W­+ź!q‹þ(™ˆåŠÙdwÀBLñkáêÊœ¹ûv˧Å÷Vlãßúû0Àοý® ²·²Ûã³éÛoÏr,h‡»‰òÊ,cü¡Ç(ÍU‰ 3š,È$¯reP·¨òY[;õËj1m4¨f.]Ö«eOªÒëh ³Ln¤$UE–­Ä/—‡æ†ŠÖ§ñ5l¿ 8FqNxá†_0øáŠ/θ£³åÙxä’;þ”øä–_N9µ]cÎyçíTîy袟ú覟>“æ[£Îzëµ”îzì²Ûûì¶ßލËãÎ{ï¤v½»ïÂ/7ð.|ò\7¼òÎ?/ŒêmCO}õ7Io}öÚgPûöÞïx(àOþÝâG~í]´á3$£H&M’"KÎ$/ÙD’aÄúUHž‰_‰ÔÕ¥fB½lGgQŒ£+·•<Âò‹³¬ŸüZiÁà Rpf졚”ÅIýt1¨4äÝÅ¡¬¡m™XÊ‘,¹M†%*JÔœž.=Ù¸ôøÐ\ë ¦š†Ùš>s-*U3ÏMd*°ié\4ñÅÌJ›Ùô%³:øÎKNû˜(•˜³Sns k h…eOcZn—¼Ôá»þðùËhýçZÆÚ™ !¤MV&” ŸÊ觹ш²žõ¬ŽùÚâ­0Á'c#S`a#²ø}‹‚`ë£ÂöR”¥mQ¶Ìå5uçS^šÔo2¥xú–4'¹ô¦UƒÓܰÓÓšFМL¥åpŽšIkþÔx€,ŸW‡ÇЯŠuva«YYWÖ³ªõ$]«[o—Ö·Êuž@íê\ïºÐ¶âu¯¡‹+_ÿê6¿v°,a›¹º®±Œ…ˆa Ù|<6²”…‡x$ÙÌjv³œÄ": ÚЊv´¤µÂgK‹ÚÔªvµ¨=-k_ ÛØÊv®­mo‹ÛÜŽ¡¶ºí­o \@Tv¸Ä-®q£Q!ù€P,X\€üþ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇòL×öçúÎ÷þ ‡Ä¢ñˆL*—̦ó J§ÔªõŠÍj·Ü®÷ ‹Çä²ùŒN«×ì¶û ËçôºýŽÏë÷ü¾ÿ(8HXhxˆ˜¨¸ÈØèø)9IYiy‰™©¹ÉÙéù *:JZjzz º ÃáŠð+!«`‚Ûz«‹ê[»ªÚ*üJ;k\»ÐëÁÜœŒ\ ýLË F½â½,› žCž í¼až²®9 ±~rÝ ]ŸÕ-?¿ <Þ¯>èD $q’¾ÿt%±ðÂC* Y¼hì¼þ^ï xÓØ ¢=X"AŽl× G\&[’ì²#Ìs ÒréP¦­ŒÛøˆ<72V@„;‡†+S1¥Íœ/{&¸—Ó•TWò¬z’'Jq,‹.íÚl=œaê¼yVèK¬3ûÄC+µdQ}\ÕögöcNª™õ3¨àŸX‹ ­Úvlúƒ½ >ü8ãŸz!GTlyßeÇ” ªlŒØñŸ·QŸ¾»šÕj䶦%3å•ùäê©Co.Œ›áÞÆ•usÌYôçu}CC>:¹ƒÒăŸ {¸s壙ÏõÌ72ïäÍÉ•F¾xî"½é†µkøk×£ºí½ýø,møß??'Ìþ9ÐÖÜþwƒŸnÞDpÀÅvïiGWË9U_aá)¨Dy×iåWzV­Ý‚î)_j6wŸöAˆ™tòסvБhR ®È•߆ÈÚˆèÙ¸"}-Ñrâø#^Îüsâ{z6އíuäx­M·Ÿ’Љ(¥9ªñ¢hB._–¡Õèd^A6™Õ•7ô$Ž%Ž·¥fëI[z)©™˜AÉ^•Lþ¢“*Òg›u’écLÑ5˜£p~šéB^zQ(VYhÍøc~æ©e䤒^´â¨áS“oêç †ZXi)Π}ò·Ñ¡"–Jê¢Ñà(:~µQ¨ºª6eêkLœ"êþ+~1‚¹ÔÔÍö)Xªª¦ÍŽÙåo¤¹ùè´¿ÊFO\©þBn!¹^ ¬Ràîø­¸¦Wl_‰½Un½öÞ‹o¾úîËo¿þþ pÀLpÁŒp /ÌpÃ? qÄOLqÅ_ŒqÆoÌqÇ rÈ"LrÉ&ŸŒrÊ*¯Ì²ÅÌrÀ5Ôþe ÌŒ]ì·ç¢«3m8ó|Z¸ôˆål»-cé³:OÉ $Íãf n»PúsÕ=+o– ´µG³¡l3ëYh(ÙDuÉ–u¯êY+Šv¾½6ž_Ÿv¨ÅÚžÙ#¨+×nl³ØvœNèÜfl™)Úªvž«ªÙE4¯£þË.äIQù_—kîUqÀÈ–xèhöéeÒ†søbŠ[©ºÕ|Où‡Ã:[¹z××zžùAºƒþ{Î –ÎèéQ$ØŸx‹—©$Ôv:"œGAŠyÐÖk}Ô¢8áuEÿ.óÆ>ºæ%hΧ‰¬ßr?iõÙwÿ!ý¾ƒ~þ^SŽíãw­¸ÙjCô£Îèz†­óÅEkÐóœ9ÁºÜ^ÛÁ„W¾âý¯ ÜòˆÄ=RPLé*Ü»¬×ÀV0ƒ,\žTVˆÁÜ\p]1Üàþ'K)Ê€Áh¥@Øtˆ„ ‚ÆVD·±n6ÔM, §2>lU ôL?(n$LŸ¸D,6€i ¦¼3¶«y«T7ƒÕ˜5ùPÊuû»švö³\5ŽŽãlÃ.ÏehŽ44Ú±äG».éd)í8¦¬]Êv]+–/‰ÉLjr“œì¤'? ÊPŠr”¤,¥)O‰ÊTªr•¬l¥+_ ËXÊr–´¬¥-o‰Ë\êr—¼ì¥/ Ì` s˜Ä,¦1¹É;PKcKFÞ²¾ææ5Pictures/100000000000019100000119D9E03096E1309A93.gifGIF87a‘÷(,(@@@@DH@DX@d¨H@@HD@HDHHHPHLpPD@PLPXX`X\XX``Xp˜`TH``X`````h`d``dh`hh`lxh``hdXhdhhh`hhhhlhhpph€ hˆ¸pLHpp`pppptxpx€p xLHxl`xphx”¸€XH€ˆ€°Ðˆˆˆˆ ÀlX¨È˜Œ€˜˜˜˜¸Ð˜ÐØ |` €h ÈØ ÔØ¨Œx¨ÀذÈиÄÐÀˆxÀ¤ˆÀ°ÀÄÀÀÜàȤˆÈÌÈÈØàд Ð¸ÐÀ˜ÐààØÀ ØäààܸàÜÀàÜÐààÈààààäØàäàðôðøüø ÿ¿@ Qu¼2±Æ@@@èÖHŒ @ò¶ÿ¿xóÉÿ¿‰0Êêò”ÿ¿@0;¶@Ä -g @ˆÄhó-ñÿÿ¿@¿Þ@îòéÿ¿- i€AÈ¡ó¯ÿ¿@Ä-@ŒþA 0÷;ÿ¿Øxóòÿÿ¿¿n ´ @ 0 ™;gˆ I<ˆBñÿ¿$UØ@0 ;i ÷ÿ¿˜ òÚÿ¿@¾LÀÁ2&k ™g ØÄ¨ó-ôбÿuŒ@ 2@‘€ALu±@ HiB,ÄÀô-ñ0Èôò4ô‚ÿ8àô@ €÷AØLóÿ¿ÎÀ»ñ ÿ@¿,‘þ§H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱã”CŠI²¤É“(Sv$2¡ƒ H ²¦Í›8sêÜ©qÁO*ÒäI´¨Ñ£H“*ÂTˆ@'Œ¤¹„ìaÊ@dˆã‚›ª]˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ÙR)(„ŠaPfDÀÀc, ScŠ)QJž2tA‚†C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¸C&<Ø`c(‰<–8/.sx$EJ£KŸN½úÒÞwô!ÐÉPš"lþ$Áºœø&R6e2Å pëðãËŸŸR{vìST<¨0ÆX$ €€@q’Ý€A 1„PÞp°}F(á„Ù—~ 5¡…vèá‡×ñÖPdPˆ(¦¨â|NÑâŠ0Æ(£u-¾8ã8æˆSØáã@)äDiä‘H&©ä’L6éä“PF)å”TViå•DÞ'¢@Xvéå—`†)æ˜d–iæ”Zdß™l¶éæ›pÆ)§œiÖ9çxæ©çž|’Yç…õ)è „j蜺Øã’pè£F*i¡‰®éc£˜bd£“vêé§ †Yé¢Epjª£¡¦ªêª¬*9j þ—:zê™ÆZª¬¨ÆÊi«¼öê뛯r¹i®ÃÒŠë­¶"ûë²Ì6ke°S¹«´¹Î:«±Îf«í¶FBK-‘ÓZ‹k¦Órkî¹Ìz[ìá{-ºðÆû«º@–[oµî¢º«¦òöëï¤ôêJì­äŠ«o­ÿ&¬0¡/ìðÃÍ6 ñÄ«*qÅg )´tìñÇ ‡,òÈ$—lòÉ(§¬òÊ,·ìòË0Ç,óÌ4×lóÈ߬óÎ<÷ìóÏ@-ôÐ1çLôÑH'­ôÒL7½´ÑNG-õÔTWmµÏP_­õÖ\wíµÒY-öØ(WavŸý²Úd·-sØnÇ·Ù ÓÝ2ÝvË­7þÊpïí7×ywxÊyþ÷áôøâCŸ6Ún7Û&9ã‡+Žùæ;O¸ä_¹ãžÎùßšŸ®zÌŸ‹ºá%[¾ºÞ©Ïn»Ê°›ž6åe_žûí\×üð#ÿ^èÇ‹.8éËN¼ØÂ?/ýòºS¿»õ½'?ý×Ñoÿ<é£;¾|óÆ×]¾÷QwþúìK¯~ûðÇúûò×oÿÞÐ2¯ÿþü÷ïÿÿ  HÀð€L ÈÀ:PÐÊ'HÁ Zð‚Ì 7ˆÁrðƒ ¡GHš°4<¡ WÈÂºð…”š°ÃÚð†8Ìá S¨Ãúð‡þ@ ¢ix(Ä"ñˆH!“ÈÄ&:ñ‰®Y"§HÅ*"QŠVÌ¢·øB,rñ‹` £½(Æ2šñŒ±!#×ÈÆ6F†ur£çØF5ÒñŽx|¢óÈÇ>q~ ¤ kÈAò%,$"ÉÈ æïŒ¤$'IÉJZò’˜ÌdÙÈNzò6œü¤(GÙšP’ò”¨)SÉJR®²•°ìä+ø1Úxì5‹%,¥XÓô²4¿LÍ-©PKæÒ–ÁdÍ1{˜LÑ434ÏÔ剨Ëj:“˜Ø„&6£9še.sƒßŒM8U3ÎZ3™ç¼¦5¥ùÁ%Ó™ã|'j†éÍwÞRž§þ©%:ŸYLhÞÓ0ÇÄ'iBæÏj´ŸýgBÃIPrÆó¡Üd§Ý Ñ–Ó¢¿Í¬þ ð –Æolö”Q^ã“ç&ä,ÍÈcNóªÜ>Ë͹ÎwÎóžûü’3¯¹Ð'ô¡Ý6E?ºÒÓ8ð¥;½‹MºÔU˜tTîzÔÚ–oÄÞ`†{â_ï:ØÝXõS»Ü׺ ×.oK»ÔoqÜ»Îu'–½À¼>{j ýk„ß;ÜÆÞw¿WiñÞüÅ,Ç/´ãÝpW×=ðO´ä!?x0Þ}”z;ÂÏùÿ*˜ò€¶è=z3^^”™ïr¼ÇÝñ“þõ⎽àCÆÓÓÙÆ‹ß|¯;¿÷ÒÏ~ò¾¼Ë…uš§þÎ'ç;»)üÊö¿>mïÉÔ£ºÓ¸ßôêCþ=ww_Ïp?Ú¿H}F‚<û[Wø·?hô‡}ýš‡¿ünùâ/]úö­;ÊËoõÂgæ5ÇS÷tÃõsx€˜€ È\ö7€ØN ø€hs \@”¼5”säƒ`8ŠIy‘£ø~Õ¨”´1‰$Ž ‰’2ê&o „NéŒ&ö}c؈·|¹‹Òx¤æ„°X‹ð8`Zi]ˆø”½x…®7ŒiçmÙÏgŒK™‚I©|˘F F¶˜„ÔhîøŠSø{rx‰—n}™o«—˜‘I…p iølʨ‰ñ8„|øfdI„m9™Kvš%¦óˆi؇•èÿØ‘[)†ž –­ÈiŒÉ•Ž9x·…¤ø‚ª‰˜•Ùq¿yfõ›±™ŽˆWi}X›¾È…ŸÙ˜Âç|» ­œŒ’ßþÈ—fH˜q9[—I†ÏIm,I•ì8ŽÜˆ—~ }’‰|I™´‡œç¦™É™ç)žï‰ïÙv²Øž«9ÇXš¬™Ÿ•Šo‰Ž[RŸÌé†É„Ýi‚‰ÙkB¸‘£ ¡ÜF‘0‘h/hƒ±È‘ÊÎ%ƒ"i%š“ß©Y$J‚&Ç¢BW˜_„•DI!*5y£8š£:ª\0:£nÕ£>JS@¤ì4¤DªKFz¤»”¢JÊIÚ¤©ô¤PzJR:¥£T¥VúIXš¥²Ä¤\ê€[ú¥‹¦bzHdZ¦ƒt¦hHjº¦}Ô¦nšGp§w4§t:Gvz§dç¥zú¢|Ú§4—§€ŠFþ‚:¨¦÷§† c…š¨a´¨ŒJ~ˆú¨Û娒jx²Y©NG©˜ZEšº©ÄGŸžªtªv©¤\£zªI”ªªzD¬ÚªÔeª°Š[¯:«@T«¶Š]²š«?º«¼*¤¾ú«E¬ÂФÄZ¬K ªÈ:’Ǻ¬QÚ¬ÎJ¥Ð­W:­Ôª¥Öz­]ª¬ÚŠªÙÚ­cú­àj¦â:®iZ®æÊ¦èš®oº®ì*§îú®u¯òЧôZ¯{Ê­ø ¬úº¯ÃÚ¯þj¬°Éz©+M¸z°4š  ‹°÷Ú°ú° ©;±ÕZ±‹­›±Ûj°ëJû±œ²"û©[²ž”°(K*»þ²!H². ]0³W4³4kD-{³ ʰ:®Û³ðJŸ:2´D[´!Ñ‘F›´J»´R£Lû´PµHµT[µ:2µV›µZ›"X»µ^ûµÒ‘0¶d[¶f{¶h›¶j»¶lÛ¶nû¶p·r;·t[·v{·x›·z»·|›¶Ðâ¸;:¸„[¸4)¸þã[ Q€ ¶¹Ḍ«Ž»¸û¸’»¹œ”›¹˜[@ŸÛ¹ÔAº¡º¦{¥+£[—;pš;p»R»­›4P¹SÀº¿ë»»K¯{»±›»¡ »¸›»Â;¼EÑ»«;• ½Î[¯Ú;ÆKºŠK»¾k¼Ç-º[½;A½Á;½Í+¾9q½Þ‹¼ÜKÙ˼èËä;¿ç¿7¡¾ËË%ÛKŸáû¾à[¿ö‹ô»ºÀ*Q¼ù«¿Ék»Ú[ÀüÀF«¾1»üëÀÿ Áü´×{,¶¼ÁÂ:²»¿Œ$€«1*¼ÂX’ÂGbÂNÛ·2<Ã4\Ã6|Ã8œÃ:¼Ãx -"üÃöÛµ@<Ä­+ÄD|Ä’kÄH¼Ä^[#ñÄPÅR<ÅT\ÅV|ÅXœÅj!@+­LüÅ`Æb<Æd\ÆJ;PKcK§´;Ú;Ú5Pictures/100000000000028A00000273928E004F9825EB8B.gifGIF87aŠs÷D†LŒ.¼‚D$Jl¤ÎäT *<¤âô\ÂäTF4ôæ¥ "t,h°tФÔâð„¼ªl„F%<‚Ä,",œfDìÆdÔòì$ FDžØ,597´¢¼|ÚìôòäDÔÞìLNQ”R$¬j,ìòú̆<¤ÖìÔ¶\4ºw44>Œ\ªÜ˜âôÌ–l &$TNTôî´-jäîüL‚Ô4.$ìÔ„946LD:9lv„<<>ðØ¬ªÛô>¬<4@Ô¢|¬š\¼Â¼´îøäæä”rDäòì455´¶œüúÝ\‚Ô„RL亃:ŒLz¼ ìÎŒüœšœL†„tvtTj¬D*‚´Ì¢¼|v´$R­Ü¾Ä̾¬tR<œ~´D>LÌ~4T–”¤^T|®ÜÌÎÌTv¼Ái,L4¬M¤r\äÖÔT"4|ÀìÜ®L,J„d¦ìôîül™ÙDŽÔTŽÜ„ZH<&L4DdŒÖìÌâì|7lªÜ¼®Ä”ÀçÜ®„ìÆ„ÌŽ\ÌÞì”G0LJT$5xLrÄ,„ìØÈÌÆÌœv\PšÐLV|˜ÖôDj´\ŽÔ´ÎÔ¼šTlÄą̀hT¢Ü´Òääº[Ìðü¼†ddB4´Þô,nÄd¦ÜôîÜ.4&TJ6>`„¼ìÊ”t¦Üd²ãN”„~´ä¾”äúüLGFB¼L~ÏìҠܪdÜöüüöÕDJTôêÜœÎìLf¬Ô—d<-(>|Œ^TTVU¼êô,.Tì΄$Ô’H$&+üîÁ\vÌ, L¢Ü„ÞôôþüÄðøT†Ïœv<¬ãô\B4Ôöü4:LLR\´f,,ŠsþåH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠ9€œz(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“Þ$dòƒŽ­©)5‹éª™6›é³ü9ÍìÕöÕ#µÕ"£´u·žm¦˜Ë²löÙh“'ë”óæ‰ÇÎæ›!­ý‚ Ýàˆâþ±Œ"\é²%Ÿ¸ßlžZÂßÞ0?üèš‹.2›“?*9™Ê—öæœw.]…TÉ!ó@L-ï@6W9°¯·þº\°Ë +ÇÞ¦myp˜€M9º«al²©PK»Öç&&ÙÂ[)µRÿm&¨F[­uîžWoýõ¼­½'ÜôêI«¯Àº‹:Ü¿þ+PˆzwY,—‘.ÿ,Ò4†’³Çk>9ã»)ùýøßo_È‚SÃ$õ¿þñÏ€ØK ˜,|ñ‰ty’Ãöžô:ˆÈNSòYÏ€6;õ ­oìÑZ‚¨ÆÀšÐsk›UŸêƒAƒjm¡CR¡¢‚¨ô ‰L‹£ÊNÈê¬þ„ „„HD¨áˆj P‹Ä!:QWBDb“øÄ» kmpŠרó0zñ‹¯š Ç(FÓq{‚ ú Æ6ºñp<Ïb·¶ÐáŽxÌ£÷ÈÇ>úñ€ ¤ IÈBòˆL¤"ÉÈF:ò‘Œ¤$'IÉJZò’˜ô£Ýð +<àÑŽ ¤C(G)ÊR’ò”¦L%*W©ÊV²ò•®Œ%,g)ËZÒò–¶Ì%.w©Ë^òò—¾ &0‡)Ìbó˜ÆL&2—©Ìf2ó•? ÏJ™ÉjZóšØÌ¦6·ÉÍnzó›à g6K@C yò“ÎLç3ÕÉÎuº³ð|§<ãIÏyÚ³žøþ¼§>óÉO;B0oy@)å@ Jô M(BªÐ†2ô¡(D'*ÑŠRô¢Í(F7ªÑŽrô£ )HG*Ò’’ô¤&M)JWªÒ–²ô¥.)Lg*Ó†æ!3ÉêòH‰<$̧Zê„JÔ„ Õ¨E *R—ªÔ¦Õ©I}ªT£JU¦NÕªU…*V·ªÕ®^Õ«YýªXÃJV®ŽÕ¬e+ZתֶžÕ­i}«\ãJW¶ÎÕ®u…+^÷ª×¾ÞÕ¯i­G)ðÏ:–’:„bËØÆ:ö±¬d'KÙÊZö²˜Í¬f7ËÙÎzö³  ­hGKÚÒšö´¨M­jSÛÓO–S`ÊÉþãI¡’øè§:ˆOnQ²[Üêö·¼®oƒKÜá··Ènr‹»Üã*÷¹Ì…®s£KÝéZ·¹Ø•nv«»Ýëj÷»Ü¯wÃKÞñš·»èozË»Þóª÷½ì…¯{ãKßùÚ·½½…Ob)QPFóAÀ &ñÄѧ?þÉšm¼±3ØÁ Vp„,a[¸Â¦°†'Ìá oØÃÎpˆ?,b›¸Ä(&±ŠGÌâ¯ØÅ-NqŒ_,cÛ¸Æ8¦±ŽgÌãÓ¸‚8‰lÏgÎOöT?Õµv£6™ÉNŽ2”§Üd)W™ÊO¾²–³Ìe+wË^3˜Ç¼e1—™Ì_>³þšÓÌf3·ÍnŽ3œç¼f9×™Îo¾³žóÌg;÷Ï~4 ½gAšÐ>ôž ìž#|@­e4$Ð;ζŒ®KêãèéM¯Ó .pÃBêOúÔ¥vtªEíiUŸÚÔ­f5©_íêX¯úÖ´–5ªsk[óú×¾ö¬…½kbÃzØÈ.v²­ìf3ûÙµ^v´=mhëÚÚ½–öµ«Íím{;ÛÔþ6°µ nl;ÜåîvºÅMl£êÀ¨ÖS·ÈFÕÏO›ü%å[ÕÄ3*£ÿ=ð€\àÿþtÀNð„¼á ¸Á~p†O<â—8Â1NñŽsüãùÅþE¾q’[¼ä#O9ÊW~ò–kÜå¹ÇMþòšËä*‡ùÌsnó³¼ç8ÿùÍi>tž]è>w¹Ã?ýäGówÈtH¥é ‡#xzœõ»³îî&]çA;Ñ“ô±‡½ìF'û×ÑŽô³¯ýíj»Ûånöº§}îx·{Ûõ.ö»óí}ß»ßtF¼âŒ²%MdØ>åŽvp¾ë³§Û"<%?|æ7ÏpÍwžó÷|èA/úÒ“þôŸOýèUozÖ£~õ°o}ì_/ûÚÓþö®Ïýìuo{Þã~÷Àï}ð/üâÿø¾W½|j®ñ'Ò7…üŸ`;RÝê˜N§›þö&ï ØBpu° É E)F±tÀ»îy'|àçÿ~ºË¿þñ¼þéÿ¿÷ÿþÿ·øçö'€Èˆ€Awp¢wrZgu¸ oxt(E†GöÚ§j§i‡yT€ õ`A€€aÊg€ 8€¸‚È‚*˜ H€2ƒ3Ø‚5ø‚:è‚<˜ƒ=Hƒ@¨r Ø~CpŽi‚eG„u%M1þ…}òÁW¨5ùÐ}v0Tœ¶…ï–|Ãç…Æ†È÷…d†e8†f˜†h¸†b؆gè†j‡lø†t‡u8‡)Ø€Í'p@F 0dÞ¡SQÁSøÖ…ctþ]èh˜g (‚ŠX U„1H‰7X‰8h‰6¸‰;胞¨‰Š?˜‰¤ˆ‰¦x‰—˜qyr‡„¦4}ñ„æu¶UÆhª@ÜP pâ 5poð‹°‡Šœ8ЧxŒŸXŠÆŠÌ¨Œ¢¸ŒÉèŒÓˆŒÍhИ‚BH„Š'XÒ×x’ dçSGµ[ùÆtÄNqrøŽwv8sHòXøxúühý˜ÿ¸fèr«8r­ØZwDoL(;w}W'qïV`@·}7‰Ú˜Õ(×ȑّђÏH 9’ØH’™’ýW„{(vžoÔTþoQa}t0`×eZ¶|Çu§Š)’?i’‰’Dy’F9”G ”%”L¹”Æè€?—‘ÄóAætðS%rÐU7‹Ÿ§k(7FP)éfY–hI–jly–ké–m™–qù–¯GÅØ’¡çŠx„7»B“’·|î¸{š¶þ˜zè”*™”B©”‰‰”ŽÉ˜Eù˜‹9™MÙ˜@È’˜9s}¯¸DâèÙg—1G…üŒ=ye@„ 7„®Ùš°™š²‰p¯9›¦›´‰›·i›®¦›½É›¢æ›Á œ{X›¹IœÆ¹›Ç¹œÊÙœ¿ÉœÏéœÃ Ó)Å)œ×‰œØþ™œÑÙÕéÙIáiܹ¤•'èZàØ„ˆdPYt\gˆ/w ™ŠY™‘‰Ÿ’©Ÿù‰˜ûI™úŸ–™‰, rzØ€N—Ö§Q‹Òguzz”ç$–Çp^Àš) êŸý9 Ú¡ ÊŸ$Ê¡ê¡$Zžî§pU ˆ5FŽô·pì¨ÚÇ$Fuå~CÕ P6àh@ ° ·ùH:žàÉIʤJÚ¤Û¥Ú9¥âé¤V*¥UХ䩥KÊ¥PJ¥[ ¦]*¦_š¥dú¤hª¢:wׇIx•YÉA¡)š“X¦gšÁ©ih\PÚ Šp@0‚þõ@0Ti˜z¢#j¢‹ú¨!ʨ":©’Z©ÊŠ4§pušd§—–ÖxövGÉv×oˆH£MÖ…^…ú pŽÖXðIeŽ©—š«%Š¢¼ú«¾¬*¬”ª¡ G‘ ‡¬· uP!Pþ$¡zw§KvšgÀ¯PЀ©õp‚ï– —ä*—åJ—è:—êz®ëj®îš®ì¯?•¨èY`´8q¸šo-º— :ïi+çy^³éhä0H¡GPpà0ä—•@‘Ū«۫Ú±‹± ¬k©>H‹2ç“EèS»åŠŒç¬rPi%pþd£¦¨ŠTáÊoí˜oUè5‰We÷°»J¬ ˱?ë±ë³=û±EÛ¡ßéœ'7‘Gøt߈œä¯Ög“ §œš—ª§jµ§}AE< °ðú®í¶d;¶f+¯e‹¶g+¶j+{c‰—šg¯‰‡„šÓ÷¬ê•U{z:[s W`}Ú£}ÓŸ-Ú¬½Ú®ÚŸ½»;{Âw=ÔÿìOàè„Ò«KíËídš‡y‡­ØÄíØj}ÜmmÜÉʽ·.Ùq } þjÙ´K[ÂØÛ¼“Ä#ÌíÜrÍØàÜß-Þ’ ɒݺzè©t@Ð+}´5×N—ˆØoÛÓÔú¡~¿€Ïô|ÏþÏý àü=àÿà\x ¨x7¥„°ÈÆ‘—Xƒü×tŽ&Çü ¼ð ½Ü佨^Üáíá$¾±…]‰³¬Þ|9»H=½Øœ¹/·ÂGEÇú¦˜âÞÝÝ#>Þ%®ã8~æ ¶¬{‘‹²•À[)iµû•›·˜Ê’ÛwqWx[‘áNà^àX~åZÞåYþåxÈÍàqÍ À[Ò;Ö™º¢œW£Í‡yú‘ ÃxÀ ÞãuÎãxîãv.âþ&­Ô¿\ªžÆ™_í¬À@“<ä强<¸mºÎL6wª Û’nÚ©]Ú‘Né­=é—¾é–Þé¨éP|ÐŽ<›7‘‰Ú1™ÛwXðÍ©û«¤c‰½íj÷¹ãzžçw~뺞ë¿;b>„hÂžŠ•H.`‰•ÝnÒ–ÌËÏ™™¶Îë|¾ç9íÓí]ë>G‘‰ iЭ¼ê-®æ<7£ '–0Ô[žî^Îå`®îí¾îîþ{BŽîÃweßœ²Z ­TßOèó§-a‘È.íÏní»nðÔ^ðÞmÆ©¬ÕŸÖ¼ ù¼}¹ÛŠî›ógšìhª— tt;t«Ið?>ò"_þò¸Žð5Èðäv¯›êzN‘'£wÙšjYwó'ð’=„:ßyö ï@ÿîBÏîDïF/Ê_xÉN<«|ägîÞç‡]Æk^„ê}nNÉbþ¹Îr'pðÕö ?ö$òüÌ¿ÏÕ”í >ÌÆ–¶ÈÐ÷C¬rÛÇÞgTõñœð¤@5`õ pa` GP Ë GÀ å°k }È@žà}ÿ÷õð K =/öeödoòž?òôNõdÍ¢‹wGì½6 i“4oÒª¸Â·Õo8‹ˆù  PP õ0¨õ` LpYGpÅ  I“^ð€þZßÀGÀ§G¡Cô×ôE¯ýØ¿ý×=ßI/äÙòw´„I’7a½—K>áA~€{qTe`¼P–ðª±êhV U€iM ñ%‰/öê9 ^=/G,"C;õNĈðÈ9f<ø±ãÆ‘!K’‰r¤H'Yj|i2eL•-gºÄySçÊœ|䈄òq3u¡EŸ<óÔàByÂåþ;B…JŠN¾Œð —W¥7õZ•ë`©²c/m›vÖݹq߆ÝxíßÂëF^ÿÜ3P?ÏAÝm¬*}QÈéü¢$½èHE.<¾32IòÜ2OQLK±‘ÒA!Î€Ô ¤ËbóE’T"ËGœµVYoí1WZqÝUW[}åõ×^‡¶Ø`M1ÈPaKÖJ±²;’S¹–ÌÔÉIûú«ÊßõCÈR1.ÑúV±›º¢r:uµ]·]vßu7^xç•·^zïµ7_|÷Õ·_~ÿõ7`€¸`€iâ¶[FîŒ:¥Šlk¯,ÅôMõŠÔSPãI¤nÙ} 1‘ëkT”H×Yd‰]ÙX`_ff—c¦yf›[ÆYæœkÞ¹\FsþL8݃²Ëã-¸¦e/£±eW±†¡Z¬ÌF•‚/¾÷’jêhr8Hžuûk±o›ì±w6;m´×.{åfAŽ—£;† ÚíèèN.LËKb:Œô´¨²œ6·(ÂcMI¡Ê²4•k³Û¨œñ0Qt Æœ`Í3ç|sÏ;ýsÑC'}tÓ1wÜ:“S=¶©ü2שּţ¶É¼ÞbU¹3TX]røÈÔÂzÊú%ªœÒàþñ³Û†þyéÕŽžúéÙ¾¾zì­o=°Ôš_½#©Kö½#¢'­Toð’ô»Ó}¥ÆhaŸYñ·­LÏ¢,œÚQ‡¹ß^µ7Àì€< þ8¬0¥„cÿ ÊÛU¼óhç-q™Ëúä’ ÜEé{2âVø%¸Ž,¯0I ÷ 6„à K`BL…<d"8 Êq…åáÊšÿ5'BqˆuêS¡’hD%ꈆjb‘èÄ(>q‰¿9HI"·Ë¥Kn•óÖÉìÆïÔÅbNº[§Xg8õ8®%öSGàCÔƒ ¨¨‡‚ƒ4äCì8# /È«Wë¦dE*2Ñ‘S”")IH22’W¤d&1¹ÉFVò5s“L–u“ŸÁ¯|˜Ñ0H»°¯ƒ "³œÇ’Æ•°&Ë€6²¼|p„†$»ˆTþàÃ\djŠ´Ìž(è5 ±yË £üœ‰5üEÓyͬæ3«Ù,if“š];æ5u÷MTqSœÝÄf:ËÙEãmq›¯R“©¢‘Q}ÕºÝ^ܶûOd‡iI/`<®C ÑLEŸBa5­ ‰1ÁÈL”Œr”á¤(:Ç9MŽz³£êÔhHÏ9ÒŒ’Ôš%EéIUjΔ²t¥})4Õ)ÏE¶™ÌŽT‰´Lõí•ðr#—¶Ÿª94õàÆïÀ6Ià Ñ !B.‹) Á˜ vÔ’Š‹c—ß;…XS¦¬¦² +8ÇJN²Žð¬o5k\½ˆVºÂu®vk]åÚþ•¨9êS0%߽ʩˆáb”9užîhYß«äè þ•$¡ŠIêè·øI6¦ï”)L]:ZÑ–6´§mjÁ‰ÚÕªv¬}­kµÙZÚÆ¶¶³…UZÃøÑq–¨HE+Oï—'実l¤WLP¨Yr‘äƒJ‘Z_m[Y1U¯wÝ«fñªÝì–»ßÍëv½Þ¼3/x¹«Þñ®—¼ØÅí…Ã^önˆË¥;©¿§¶‘'Z8ƨÔ¯´ñTÑseÙ¢tVW4UY-7áÇQXÂÆð…5LM s8ÃÞ°_?,âGÄ'&q{ÅéœÀöëv ®’4ˆ‡þ¥å![*eTÂ~öO€vñUYÑ"ŸÆUÏ®˜N‘Õ ’}¢d›0ºÄq²(¡<å#SÙ7Q®¨•oƒåæ^YË_ár2«Ø¶°X‰§Ž¥Ò-é“q+ų´(ÅM^•I/ã´T˜Ðªy1’ó&(=úÞ0{r’œ¼d'5©k\[Ò×Uö­y=ì\§WC…ƒ0iM–s½X;“:lO!g5"ZF"ðz„׸ZÊ7e?ÜÃjà„Âñƒ‹LiXƒmkvþïºØ¿ö»×ínx·»×óÆ$2”m,2pÑǦ§ìðR;K‘=.2'F釘á ÚkмÈêñn+z+ç§¥ÓáwÜÄßøˆ?>ò—¸ä(&yE~r«Üä.G9ËSK¹qÌ”-š¦ýG2h¡/Úá‘KûükjcïfÛéé±WØÂ+¨£ a¨ó‘‹dà¯XB6„·€¨øä4‰¬Á,Aª¨›Íî¬ÙÕΜµ§íow{ÜåÔö¹Ã½îrÏ Ýón÷½;‹]²66µZ„é; u=òkpŒ—Èì6q «eˆ2Ö‘ y BJCq4Ô\h¨ƒ~0— þJðCxêsôðM· ìÇ…}e—xÚÏÞö»­=îoû×Ë^÷¿çý |ö¶–U,<Ô}ˈÏMõWcÀÿSX s„¡¹<Åùú8³"ùÀZñßâÃWÓ}Ndú“«~¢·ßºë‡¿û'Èþ÷ËŸ³öïýë¿ÿùÇŸÿú÷:áK1Ëɹ/Ê)Äc%¾É'(¥þ3¾mâ1è‰|¸ŒË3(6€„r£ºˆ‡*'Ø‚ô@¿¯k¤Þc½nº)4ü7tÁYjA|Á”Á¤Á\AÌAd°X©¹›³‘V‹¾’ˆ¬Çk”7{6ú' “þÚ'–1B§x«¡šƒHþ*¸^P §‚*¨ë£#€ ±ø‚/ 5™=yÛ+Ó#¾6Ô­7¼®÷’C÷¢Ã,?¶ÂõÒCsÃ8¬C¿ ;±q) ~C9ªÀ9®íH‚#®»1.ß›¢±ÀÏÊ4a¶U‰Èi 6Y6¹ŸØ;=Ö[=Ó’-r­TDÅUä-‘j)S¼-Vœ52)e;ÅV‘X"W|2ÃA¡À8$¬Ÿ½Á 'd¬´Å§ž–—ã %©‘ 135» "²~³FôâÆ;ÜCµâC8¯¢³Ã< G?,ÇoìÃqìFC 0aǃ ÿ;¿Â³ iI¼$).¿À=|¼åþ F>Þqšs‹/! "¼F†¼6‡\H|H‰ŒÈ´È¤HÄÈ‹œHެÈI‘®_dAKó³Î(H`‘.–s¶zÐ$)Æý*ÿ‚,C$@ŠÀêC6„\kSE®È6^$-p$ÊuÝBêÃÓÉÒN¨£;:=‚:_Ú%qPÒø<ý±Œa€Á{Fsä"3Y«í»»£ÔIµT×á;LÅ;M­TN½Ô²ËTPÝTQíTR¤ò„0ÇáÍYÓ=üÈDl ŸõyÄ<ãGRü·£XN0[*ŒŠø#’‰:ælìC¤«yP­Â–@MrÕx«7zÃ7b‹Ö{ƒÖiUC{ƒGx Æ0 Ÿ,J˜±Òw¡LFŒI|rÂÍ”CÇdŠœ  <‚Ê@ ô†òÀƒØ#þƒ}JR»“ »˜»´QÅ ½óÔ„5U…=ØPmXƒMÍO}ØRX‰X†½Ø8ÑÊC‰ŽÆEFÚRø<@á µáËRÃUBÜ@ÛÄxZž+Dƒ@ª.DžÍ˃.¨ª†8 è‡;høÜ»Á¬FJDNè Y0UZ3-Ó¦%ͧÅÕ¨U½)•̤eZ¨Ú¿²¸¤eZCoÅÆàOËÄÌ&¤ÓwÓ°•`5´Ýa Ë@ˆËB°Îú¢D WwÄC)=?‘Ô§ŒÐ9LǤtÊ¢UJÂ\ÁÊ;¼ÉWÉdC!4ASÒ O㔸 ÎZe@Ë4•‰Æ©/"D®,ã‰ÔbÍþµ¡gj”<i°êŠ[»­O·vþïUñL®ZŸäpŠVYUù^®’ò…Tn´ò*w—+Q*×ò.çòwñòGNÖ:žr=í´=s±M>˜<ÞE>Û_ss£<çM²…HÊPLû±&çÝgÞXÆ—û¦jºdgDfƒ+oÁ|ô­ŒôCWîDÏåŽ:àcômuK¯¬Üú…îd_5d€œqÍíüq¯»]u9.ÑÐÎÕŽœe†NYœu[_ñÅÌu½¾u]¯u_×t§ÜôoþÅ8NbT­ û‚sw>Tt©¥¾t¸D¦@×µ#IG®ñð…ê:þà€iu«”ão7n@woWo=ápóh†t1¶ŒyTVÆþ€1}²\ZõqB&õeCË M”sÙàgóîõácwþ½‚_XL~d†OÕm}øåÕ_‡Ÿøm-ã®…rÄþAV‡xk.Åõ­åó1á%œSÕÎàkKÒ ,Æ™ÄÉ|•rX4Cø»-SXoâ»þWÑElŒæáœîñüyÄÔyïh¢éÛX‡\ë%Áò–f7sBŸ¿ù#A¼5Î}ö©•¼ -ŒÈl­Ž@j¢€/ЂÇÍ^;Y#GW]ì û!Koª„{%ïC(jÕž{ÂA_»¿êÖÎû»§í¿ï{óË]q?H7âèL§ù©7xŽ;'ìÿüOûÞì‘ÍçcN3–ø!þpAr‰nVKÏÑïaSDb¢eò=müÞÖŒoÕGým?}ß–Ï¥}õ˜}ûfz^9uL‡>Øñ_—嬨噮bô·ã†óú’¡¥ëÑínÊ„ð„Ú!\Ð%âîù5¿,Fórüð>–jß#<ôoRõ§ò_³æqÿ§_§ø·ö4>öm*ó%Dd—x w1u‚(é cð9xSOÄéÈ9"¨^žzG>ÑèqcÇ5r<’äÉ”#ÀX¯%Ç–(?@P ª#f‚hlyÄKGâhÞœ÷Óc¸:æ>r\9SdJ¦!?¢¬:êʦP©bÝþêÕ)ȬQ¿^«•«U°R¥ª%‹vìÙ«iåz}úVìݲc×î­–îܼl«$l¶c&ñnM¼Ø°^»‘ý®\˜ëHÇ—3R¾üw-çÀ…¶+¨"‰!ªi¨C¡ƒ)ÕtD1æÉosöé@Tà/UÔ£¹1ŸF /ëÕ;QÏ‹Š#'ngüæ›ni·Ú³g·*Ú{_ðܵóåËø{_Ò“»o_¯»½ù÷¢Ç—‡O>ýýó…M 6©˜~„I&^gìiDÝ\öWßnø5Ø`[»ÕFI=ÑB =ÑD R’zñ¡g%šh"Wùpd*õ¬#sèÀ‡O>uþ¯ø´Ñ:`' \=$oD Þ ž‘H29¤“JBé`“?9å•KNÙ–”F*"HÑg"¾ÇØm ’ézb–Ùq•¦Y\. Tj ÉÑšC°ÉFmy ä—€1·Ü¡XåÓ7†€PƒIðE4Ê©øS]L„-B?â¸×æŽF˜©Žª˜fÎמ›Vzë€öÑúÙªêÝj¦®]©ê®¶úŠ«eúÕWh–Yv‰,T½ê*›OŽ•æ¡ÉJ­µU}0P=B$C}rh‡HÆe´ZRKyÛQ¢eÄb¸ÉÅY°Ð2hRº~©ú¬•š1ˆïþª.ɪߛ‘jÙ¯þ²ªp¿ çz&“­É,Âoé0´uF[æ»ë+ß’ ›éìIt6Km„§u›E ‰àšŸ0ªì‘%×åpöæV­T)¡Ì‘Ïšs—XVÙßJ,sŒt³öz¼ ÔIç<—Õìå++ÈSs]õ Ç !ÅÅB¼ðÙ!푵¢ZðØT6|`œ¥r7P…¥òm¸Ê¡E¼¯Ö$gÖÓ{Ç_C ¥°ÿÎ:láiïËʃÜõÓ›O.6èwþùècºÈ£&°Îñ¹mòšczÞñÄN¢¤æ²[Ý ój{jXólµ‰N6áSx<É·7-ûÚf«þÛó£ºU§bmt­h+­ýÒÃwŸúöÞ+ þ÷ª7ùjÏn8ûIÂý:bTçîªä-;daBŠûw‡‚£-gíN"“CňsaÜ ,À^ñª|8cÐå.ö¾ŠEFe[ƒÜ­¼†AÊQ07ì Æp¥Aü|Yfc ÐÌU6 æåt“›Þ×`§‘º=PeÔ+ÐÛH­‰ôŽO¯IÈŸB^81špt&4»”€£Kä H%²Ísè!䍯½ÌAv¨›à½ø4湌+4cu5Š©Ñma Pñp—3j­°xPšÞ`V õí[€ó½ÔH<’Ä'ËÙÈu$F/’¼þ(hÄÀ0Hqìy’ˆrk&”ÕìM!}Ej3?W&‹%<£ŠØµ‡P°!WØ@4‚œŸ'WðD=^q‡l´ä x@‡RÑÀhZLs[#}XΓV³u'f(ë˜J˜ÎT¦§¼áMÍ©¥ø}Ív}qÜÜœfIj­OþïÊ&N{ ­¸Œ‡zò!ðU›âÜ'‚ÙàF^2˜Ï&,ªÇN:r)å%À1>àD¢ðEô~”S÷…†>ýˆÓع¦ÿ¨6eé_ýšTÁr“°á4l*K¢wIM›Ò›¢ÝŽÆE»B“ƒµ²&Ø·C‰\ÈŸ¿( ‰Ù°éYË"1mLzbD"Ž¢ˆrŽ°Ñœ`àÕšÁ³”BŠÈ‚ž,çí®™<,vO‹Ò¢ëp±¹SäZ•ÍeîN=ö˜~1@ö)wKOùÉT–pÙa‡Xó; ªæf÷D§Ðp“‘ã(8ùê‹Ì%#¥#'øŽtT%PCþ `€wßhº•IðLá7sØIRq›°+¡:ëàoóœnð/ü® Ãê[¢RÊÊê²Ð±%fZw+NæäQ"{ôìþTS ª¹YÓ‹àUÀxäRÜ(Çî ªzLªR­JØÁ©z¼ $XCˆkTVB÷Æ3TÓ LPMn9§ð³ñ<ïšØäŽÌvŒ.*U8ÍíVU§”-jKy$Ö™´pMÈSiLƒJ±q]óeC¦’¬#W»Üùn÷¿“Ýî‚ϻРÏö¤Ãýìq‡;Þ/ù¸þî*Ÿ{ã·®y·¯|è>?zÕŸø ïÝè4}Ø©ÞuÕ¯<MÍDf&‡òÏyD0Z^ôË¿ » ;ïuov°€ ¹ðçž|Ê_þìCÿýÔ—/|çëùc¯~ç¯|Ç7ùÜ¿~ÑýÎß÷ÑǼʃ?~Ý£>ùÖ_úÊw¡}ðs>ýðwÿòßïyò#Aüô·zËíßöå Ÿªœÿ!Ýú ö!` ŸþÍßý]^ÿÅßùàýéÕßåUùAúñŸøÁœÌþÉÿI_Âô ý½ÿ½Ü ª ‚Z]xÑAg ¯éABÔ .  J îµ K° æ]Ðe ò5áÊÅþYžéýÞÿYßç¡à>àJ¡ôu! ¡&].ß~  ®_÷U!F¡f!Þ ¾!þÑ¡Ê!ºáúþaaÖa "ýyà®×Í¢!¦`òy *]äá"]ðé jÀžÈ^=äQ¶äž"ú¡ ^!ò!ßÙÀVñL$&b*b߬œØÁŒ7ðá]˜ –]å Í… û]ânž]ܵ_, #þØÁ * õu4:£ÞÜ8œ]/jß1Æ¡é\62"7Jcb£6ú¢"Ñ…#Ê¡£é©cÔ±ã6*_7a3&`3ža7*÷‘^Ø5c>ÖŸß•` Ÿ ^¢/¤#"ÝAzcC*`¾£ù) ëQˆ·@Ä?ÉÁ“Þ ²Í¤ýe_õ5"Ó‰¼„щž;¾ "Ÿ ÙÑc:¶#> ò½>á/zà0¾â z##îâG6`QÆáÙ ÷å öâF$NÖ$ ¾a#†¤2V%ö]åTB.n¥>öä þÎq%TRe –eXN IÂ!Zžå"Êà#N%=þÂþ%å½ä1’`4 â÷q^ü±åÝ©!î¤DVcI"&æ¹$„½)D(ŽâøÅ` î%öÝåI‹!Á„îåA+tÀ6ÄB"À\=ÀÜ,"ÁD0hlC*A=à,Â5îââÕcêi ØeZ¾#%¥>Ú!S’áe^",>$ΣMò][âcn:'`BgÛQ&?º_tæåtbgu‚ßuB`vR¦=†!V¡ø% aÞ¤Dš!wN# .^_>â)ŽžïÕà þc"öcQÂ\E¾LjˆÜ|ËFúZm !y¾g"& ¶ËrÄDòÕC" ÁøA8¬\jÆ$Ôƒ5¨¦„Ò¤†þö@/\Ànþc fb¦p¢" :z¾bЙàNΧI~Þ)®'x¢aÌÕhV #Wâ(r&¥TƧŽ&fÞ`p åŽ~¤êæžå¶¥ Ò!Fisª§6îb– bÓí#Ëýè%æ¦rf—’iI¦%n è¹!sÚ`“ $‚êÞb’œÌhˆžŽ¾‘é_Và"ŽÞAné&RP¼ãl"AŒôBjj æÊÅ䡪¦Ì "´Ü}Þ(øAžÓQàRòf1¶#¦né1Nb¦*§“‚*b_ÊÅb\b“¢ÛåõÉ\qRã]­â§ÒêdêêrBa7žª5æê@]Cޤ1 'þ²ši>^wfK~jN¾%®Z [Î*´Ž¥ÆåjjÍõ§&„Fò¾¥(°®(—VkËí\‰Àá,6@:8L@3`(ÜC¡jLÃlC¡**¢êªÖ.©’®¨e†!ïñ¨[ºgŠN_n£oî(âŸI"§oÞ¨6 ¦Ú¡úA麂ì?VéȾ¤šìÇ¢ì¦g‚rl[’£Z#ËÕ£¨b¢Ž®l=n«Ó™¬ºÞfÕm¡BV V£¬¶Ÿði¢¼•k/Ñ dæ›@ä¦j«ôÁêÌ _¡&ÓªÄÂhÌù°‚ à+L"ÁØ.hèÜB´ädÞ™ŠþãPzªÝ¢_)ê*ÄZ#ÄzåØª%^êMr£Ê=¤ß¢¨46¤Ð1gðµ Z¶é⊤›m}B®ÛI®R.ô)îåž0Úhår.Ða.p>àC&éDÞg³in~^rkãzã/Þ¤GÞÇÎ_O^k‘²çD eHò'ÈDþôy‘‹EÄÁøòCì[ó2ï4oòJïóö[ò2¯òbïó\óv/ÀUoÀ=/øò›ø:o0\¯ùj/öœ÷.oøf¯÷BïúÆoúžoöþÛõ"ïó¢ïúîÿÚo¿U¯ôâ¯ù‚ï¯ïõþo/0ùò/õ2ðøú[ô¾oÿF0ùZ¯ÏïS°ÿþfpùÖï¿ïoýfpÿž¯;o§ï§ï[°°úʯ×° ß/ûš¯kï›p pþN/Ïðð ‹oþ‚°ÜùšxÍÞ·Ñí1GF˜‹¹¸ÄT±KlñkqbÌ‹Kä d„[1L›K§1Oš[q{13«1×q=Œ1W1£qëqË1£ñ¼¸ËL›Ë¤ÍËÇ1!3Çëq"¯±#Gò³q'Ê#׃³ñ _ò&sq!‡±&Ÿ2#]1“q$#2gÕÃr"Û±»2Ër*ϲ)Û±-«™ãò*‡²'‹r.óþÏñ²"ûñ¯±2ë²rë1+[q)ï2K³)s1$#²3£±7Gò5s3²724‹s3Ÿ2kñ,o m¨FgéÏ/id‡L‡ÆMEh¸Ëà ¼ô1U‹ñÈ è3‘Ä•„”²I0gÌ‹ QE?#bÈ-ù33똵B¤é˜GJGO¤AZG?ôàTÑ?ID'òGL´DÏôT8´IKˆM;2Ng‹B3Z@ÓqOÓ4¢í´P/’OWQD¯4R+ïóG+5?5HK34T ´HU$rC+5L“4H3ô༴ESñ¡ÅÏ"-Ò±ÉKWÏþ1I/äÙÈq$^õq¡u´fºkÀ”5MÎ~ ½LZB³4õèXã•?»KÊì†^+µV`tEÇtULôI¡Xëug44ŽUURS†?ËXó³¥±MD×EôŒ‚Œ6ô kO5W«6„x4T¬öPhãÕg`6_›`—A6\ŒX;gT´agñt5Ho´ÑTôaÄb5‹ÑÌÌ3ñÚ³ñ~#U˜8aŽ-ýGñ ƒÑq Í_7 ù©0F±%ÈH$[+†º´’GÄwXpŤ›uŸDõ´‘ªY±Pá^p†Û…}§5r_J,¸n[²AxÙPV…þ§T±éw‡…„B;Æ[Px«ÕYh s(†bX¸Á”DUc­8€GF†/´ÅÓXØ÷ÑA?ùŽCè ï˜w…X »¹Ï aD9¨Å ‡+UÐ0›HÜ5Y8ÚY “X¶ eÆtU³ ÐÉ6•ŸÎÔÕaÿÔ§ñ‹s¯¹£ñ6œMKƒÏÚí¤Ïc‡Igo›–ñK+VM“ÎàyÓöhgù™˜v‹‘ ŒmÌ!V¸……of!%¥¿9éE¤Á”C0H\׈͸az× ‰ˆ?[}ˆ ÑÏU@–¶É™·‘J%©„w`yYÌG®K }ãzTèzþUÚHøb´ú”K©]¦ßz ‰ Êè÷lgO¹-ÏVŒÄ.ýç¿Dü¸ðÐÒ¨/7 Ÿ¹|½DJQ³€¦AP?ÔA©¹Jd_‹—#¶Î›kÙ|ØalE¹%Õ°ëy´ñû=!ÕÁ|Añ•:ý»skÅ­Ù¸³Ú Y—_t™–ÿúÏŒ˜íäx?Ñ3llä Ž_»Iuk! K”ÈGÀBqƒC©C”ÕÃD9R>XFiGÕà 0Ô3(Ò-‘\h™ÅO²1غ›Ðc×`Aù„šˆ QPÕ ‰‰f xÜÌy]gÌÓH`ÓÁ:Ú¸·h‚ÈÓþ5·ÇF¾MÕ=¹zó°8V•{¡UEMÔÃW™dÄX…8˜Õ/4G=ÜÀ3”Â3(hÚr }ýÅ/|˜µ°”«é»¸g™+ ÄÆTVèc×”Éú¸sŽç·Pr|jgX€ïLZcŽ×£wqì`n·‹N­S`sŒU VPü>FÀjYÇ‘¿á6PT<C=ƒ¼·¹^ÍúUÅ”ºí……ƒšÓ’‚Q?•s‰~1WKi}¯{µ; oµ’Å$øÄ{ù˜(4ª×wÓ´õ€8ºº€Ä›SÅžÓÊ@¤¢3R=AG>©‡PaÃ…õò_1}ù©Š/û~ñþÛ­üã’¨/¶ÄJ¼ÉLJ¿»Øª¨Àzú›-¯¨ÔL‡:“ã45H«'49<#È Ùþ›ÍA ŽB杻nʃ.Cº ¡‡ì‚ÆKTq¼íü,Aïâ Ï>á“èÄþ|KÇüh{F!ytr½óüN(&û“2¾$§Ô’ȱË/­ÓºªÔ‹K ͺ¬¯É)-5:BÃc´Ò4”cÎիˉŠt¨Æ“l°²Žô'…ìj/J*¿|ÒÇ2”42õ*0*×4LH") U>ˆ…oB´*åñ½ú^ãÒ¾U{È09µÊ@ LS¬=•ÊÏÆXÕ+R¡Ò¬ SþùÃÒNÂ’•M¡À§3oT(*ü^cò;W„õT[ÁÝq#nÝR®_|ôÓ&G=·=I!3WK2Ç㕼|í¯2i#²\M'µ—Ä‚ÏJwSÿÌRM¹ ¢äƒÎªóNC¨bÖ ¬´ÝW? 9¼Œˆ­ AóŠ^îuVxîÑ)ÙNÞ`“{ÝÏã@ÇE•1Ÿwvø¢akN³»x)ÅÈzÞ×[?¾ùQ]ÕmfSaÄ—`YÃ3Ô%M‡:ç„6V…¡vè¦Ü\sÉ+@UdÏÜ©ƒÞÙê­y¶ê_øÐíX¼…³öñÔr]Úæ´·Âmrëþ–ÞÃU¦ši¤þW<׫.XÜT·û«4Ë#Äd5¼8O éd LÎUf5¹ ¹ yOk™óÖ…¥¤N|ýZ¿Sü-ŽQ |×’²â"­ô®UX‰àÁèF©½%Ok‡ëÙîŒÇ½úT€”‘ ô g<°xÍ3 M‡N‡¡Ò´æ`œàån"²Bm™“ˆL0p#¼‚ T!ö˜½Ã\Ïj‚yþüˆ'¸îKxPüá˜Îö=¨´'`y»Ø®Ðz[ô¡|ž¸9¼…2㢛rWÀ™d5¨k–Äö!¸/9«E—à†#Q[#BÁ†€ ,Po”sÉLä€G¸A9®pz£ ˜}g¾}©Ê޼‹Ú¥J3 PŠFÙ[vjv¦ÆP—™ÚËò‚ >n*Á¢ãDP)56ÊrZ$áñg _^ŠýÂ"Q@·ŠÙP¦; êv(˜V¯<-Âìd$»6¡$G0C³™|âÐÁq¨0LvÁèà ñv´j&my€‹ùú8îedN„þBa$LêÅ%šá"Ë—AëT¤dÕ¬#9­)?ZRp˜r¤`*)¯¥/4€ÄûÊf6J‘@C´DÔÆ;Ôã.I&_’ýyAõØŸ¶À“NxFL#F=E8²¸h—l"`.—9R©Ö‚ýRœôØÂåM«P%&â<¨P§^0p)õ^ÇÅIesb5ü7µ±>aÑ¡:+JÈ>•ä”ä$ð¤'K’ƒI™ÐÄ&õ°ƒBP Š<šu`šÛâ@¯QÃ4”¢ciߊGÊñò¢Md8¾ ¼Œ¯éz^GXÒ§æí³j _*g ÍñÄéX©©Ó²Æ†š½ÏŒ¾WÛþÒiÜÔƒ†ŽpêAãp!ûƒÅ°¿2Üá #hêw™*Wƒ^å–œ+¯ß²* ŠXѵÍ,Œ/½äÅ«Ýëxêí”°Ôâ˲¶·˜z4^Ñ,;>cju¤(Ûž{ÌÕ©EìX!j^5–ºÖ“¦SeL‹ªô˜‡¸Æ6qÍj;§J‚¾Q äãlÏöûL†vu-É,lgY[ŒÎ2¡n1amJåV’¦ðUÞB«ã^ùD‡ÊVŒ£ 0‚ײR:N€Äj(­WöU~ŒäN¦à+»T0µšoZŠ˜ú«çEKŽ Kf¢6XˆÂm"Qj°+×\>˘oK_=³N¤!©™þèÊ‹8¼V´c²É™åéNÈ¡^‡FY>»ev"ž‚gùÆ‘Î?CcüpÙE†˜qTt ½LãBó ´ƒ)íãghº±²Í2´t}ÓHM@¡ÑM~íXw d\ñöka“CpÛG)¿(Ì `ARä@OZ€µý(€km¨KwšÅ]ín9ÍÖ_çìq_}à¥8wîöª»Å mm‘ÙÍ·ª ›¬B&ï!7ÍcðrµLJ&p˜1ªîg[íñ_Ù†\Êi¯ŽßuqÏêҵĻ¢G~ã¢LÊË—UУVÂë4¼@*Ù€_‹í‘ìij}fðtœçUbMÆRÑL]+þšõ¨#®I•Y-†Œ„E î"ˆÌðËÊ48TD[ëï<êÝžó§\Lr«#EqÔºš¡®-ì¸Â\·—ë2 á*™¬“ÔËìÆeëã*™<7]h@1>ýJ×Z_Ëì 5DÀ=J&:åB€°+œ‚Ѳ¸C:L¿ù—Ó ·G|Yû9®6ÆõÅòôâVV„„®z¾^mnSyÜ—z·Ç^H9y†ÉÀ%Û³dÊúC%ˆ½Î™(dÀ„<ê!„&‚Š'wªŸ_ò|Móù%”ù ¬b¹æ¬w…sFÝú¶bβh¿úÈåž[rËœÄÛߺBÎþÒ\yW ÁC|kŸžÃ‘öÀ $é *é’ä‰#2á <¡^ ²¡PŽ t" f :<®ìúìÈ"Û”Á"#ÇÒïúÜï˜Ð ò¾o+NŒLÏfÌÃPm1ÖÏDºŒÖPÍ¯Ò ³`Å}mÝ`DpáB<lt®CxÎçr/ò\.§Tâ~Öæ_Ž€ Lâê¨ê©ðÉ$dâEâ±è)I@®ù¬*ßèíóX0¢vpì‚ã&ßÐ.ãÅÍlí,l ³¯êög,ì´(qæMßFoã¼®ƒi²©·–ÌbèÏþ$lu^.ø #0Œ.\vª§â)“>€7òþ@& .Nà"Bñ0Àêá8à]Dn¥­×PÕbðõØKúšÍ ŸÀDÍ ÏoÚšíí"Q ¶œ-¥‹œß-¾œÍïlÑ,ˆ¥ä`}MÙ bíM½XÚ>EŽ€ %–PZ¢ ‹ nÀm¶4 ùAe±>˜N÷n‹=Ç]V(ÝToòD+Bb+çHó& m°Ռ‘¬ ûXÍdvöÎjÀì‘GÌÌëž"þìꆞ,Ùø„T|ìÚÞãd‹ÃNf{£žk8Šã8¾ñ™Ã9b v! °€NáZm =ohV1ÀJ«ï’â'•‡2jñþeóšâÎpÎ(lëHo¶HÒtpüî 'dÌT èxÐi> üdÃBÀé4œllN# …ÃN.\¬è,C@.B$BFü¦F6pÃ""›²©Ì ü³Žfõ,Ž NšÊ0*“/ 3šRêòŽ’™¤­XKÌxñ×Ð ‘Ýh"ƒ,C0¦¢¬8,- ñ"n¢+9¬à²ÅEØ+6Œ$Q¶…§,‹œÆër"ž'["óL* S*Ì#qLå$ïƒÌãÕh30O¾øQ Õ,¢*u1õ˜Q /‡w8«]èN}pè4BÄ[£íD]c$ìZ„!iD1‚)éBþ¬j MÚm•çÛbî-˜N ÃJ÷:°Ëbm!Ãï?O¥ë80ãp+%39kNêØ+ƪ+ƒVNA E3+R›.à2rO (©L/¸Ñ¦ôЖ@,!Ök6jðŽ t2 'âè°ÔîKú ¥'¿¨wó:„²u.p=rTËæe:Û/óþÓ_¯Œ“>›“Ü4O£§4]­æ˜6cy&b-çöC"v#¡¯fÃÀuS?¬qरÞi! !êIF¸ b ««ï3 50ÿ$ÔòÖ4"“0L=6óJQ½¬8ÉÌ7UwHsPã• »DÉ„ðYñ䛤5" ÔH Ã%æ§_©« 5!~*k]c¨KtEר2Q‡–g•Ó{ •òtxaön™Om tþ*^ˆoåÕúò-ueÓoãslg®|É5ÑBD74—cŠ•/"Bô,k ái%Zs±ZDN lóqÛøT!#3aÓîüóÆÒ5•q™ÏÚþÖ8?îEÝ4=¶nvbi·êÄ£Q5Ž6OÌR¦hö½ÍAn£K¹l ‚@)8Prº61&Žàº²+!BI&@\Ø}×2©LU{U m3£t—E-KhcØF¶Ü0˜u¿èlW˜|S4-·ŠY,3 ¢ØæoCn¯ú–"'Bœ0l Rs@â-™tY£ïŒ§XpiÑÕ*oƒÕ‚ÑÁX`ƒuAŠv´‘Ëþw¼àí¬š6Œ÷Œw‡‘5úhѪÔC¼3Ê®q¾~ìl®Õyt“QŽÓ:àKÓàÖLU‡í×Þ0CHÏwu;KŠU0=ŠùfA=—tSZvÛŽùß“‚õÑBÛP¬0®Yéà$UŽõJ}•#GÅ<1 ß\…]–qQpSxÕ1U=v–ÓRÿ±7]5ÏýbfU~Ó˜1y w0|9¸•¸NÔ°ìüökQèù)Ré@Œ i#ÖlDvfÅj¡mæ*£™M,‹÷Œ2–ªŒÓÝ?™˜‘r3™‹Ô8òJÜ*Ë€’ânš­øRµ¸‹gCnØ×¦ Zs Cþ.@±™N®±MQ‰¡Ä£Ks£Òv•mÕvY¶vÒm'X]m7©µŽ¦±û¿`öò‚¢Ä^–è”u.° Ø”‰¹ä¸™Ìd5ž…µËnŽb:”ó䡯ѥÓÚyËsè`SD ‘p!FÕ‘¤–Ó6·,yÕ|Ö£•âH„Ù·å]A:BUÚdÀyŸY õtßÒ[´ºÇ4ŽN8§E³Å³/³â1ĆúW"lï~6²‡î¦4—“ßb ïöÊÁ „sé@ØŽñ2„/›…×Êñ9ïÍUuë¤ù°Ë£G£®GéµaÔMa&Þ:G¯ž¼bZã» »XiHªÅ4xÔ›ƒjVLÇm6¬(³EáIrS°G(l„, ¢¶wf’ GÜPÎ ~p‚¬`ÜñB8Æ;‘NF¹åcë©BGÏðœG'Ýç—}…þ”Ñ”æÛ¯ÐH›$«³Hr4uˆDŸÍ´œëmE´Á|>GµWOZÔ”$ÈÚ³5x¬É%”¿r»Ð†Çmøap €@=T r„A”@Ú~€8õpKÅ?7w Œnÿ«š¹ê•º¢+aùÑØ•4ó̪£HÜÖ&)´LN¨S×½þ@¦/4/¡MŠ¥±š°‰52ÎòZçAˆ«Fla¿KÙ°äŸÓA«véršDHu¥.ÊQuÞà’g·˜ Mºm~⦊Lq: Ά¾·’<Õƒåh™æê!/DCf@„Å º@­aõ îЊÔͱƒàkc¯¾Bf­U·C ÿ¢•±ÑK1üŒ*Q×E¶Á%l\t§´2¢¢Šyè©ãîP•J‡éo=QT`øš¨•—¡b剱xr½þ*ì‰Ï+Ò b>ç Eq…L AÜõK¨ÝqQeË%Ý9¯ó¼0vïlåf6X!ÖrhkÏÁ]ÎsU<Êí #ur³kZòÝßu@6¦h §<‚®w±ì+£3™‰Ç’7Hù¯Nâ ‰ñÄ„¥"!0¦„(OGRVÛ™`¤j)Sƒê³¥û¬çñåEÔ,%¦äÑ*¿hÏ¥Í1¤bL&žæ¥ Tœ¥~Èô½Õ„o³Éfàf§6Â} Z •ŠDˆ6Ð:³ŸíBj@Afª:Ï9,\×T7ÊE5ŒT¼]FÚù|‚1ne¤<áö¬…¦d§$[EïÙÒþ ÅAÙ¼˜®©B@È¡=ž´fh²¨T0eEçC™yÓ½Öªp-¨ôˆ<¼Ï®¥àOa¥ˆ`í¬‰íaKy¥°Þ6®Àu m{T®ék¬í(O¸z1¯â†³ÝlË!ƒ#â±hlRU[±XÌÞÖC¬oz^ñdÉ¥¨‰¨Z Å—UžQæ3µ[Ýø>¶— ­*.eKW·±Ö¾%U€M@æAmuæŠ<Ô¡#N¶D*Aa;ÜBê¾ðMjMà B…òÔk¼mXÍ7^Ö%*NšŠ¹+Á16“Ä ôîoûJJuús¸¹²­W\–ãX¯b~„nOjã AŒþÕ­ì•ÉB¾ ëær:sረ\¿nÅ+]N)ÿ_ñÑ2¶14ï§ljÞÝñ³Y%ã€Ý[ãÿª4µ•ê–á\X¤FTËlgI$R`$c,MÈÒ,ƒû›åVnˆ†ÃñZŸŒX¿<4ƒ%!óæK•F‡ej€mæ&»ÏUUKu·"X§ S¼G+ˆõìWã¹³^ça9Ü+V/Xzt. t1Ÿ°pY²ó© rÈ5¥ ( 7 Ñ² Ć”Ì…PW,!Edˆp“–·Õù,ZiG,fq×—›Š%¬Ólßé9Ö—?ÎŽœüY3Ç‘ýrSÙÏOÇYþÓò…÷­ýèj4…~3tqqíQëpˆ„YãpXÉMÛ}0Óœo Àú…N +ÐÅâc,B5:@­âÁa$Ë‹tà`3ª»ïïb¿)çLæné ˜=Óô¿ï qÏß ë·Ò{¸µò·«¿Ãk£p'ÜCòÞÙÛáédjü¡ŽðZÎ ÔîÐü Í”;lÀ P_¥>•‘7²Îž3f÷y– #»{:ÓÃãw™ü^ÿ½ÂЄ8Ÿ3,_ü¾¼àƆqzáýʶVïøVÈY“Qía³bÞ{¸”¦¤Ï‚V†Áø:‚³ÇC""³„ăæo1·„ÿ’)¸÷¹•þX™y¢[|‘LÛÝðúåÞç­t¢#ñ]>.îÜ­XØf=¯®¬·Dÿî»Å$o{»f°“u7%ã¶Ö•!±2wÐÜ"9IÊì@·Ž(øÃ…ᆪkO*pÂsÌ7p¾7_€á(¡OZ„^Ä´cM¦|y6;L·Nî„cÿFyèoއh²–RŒ';Õe[ã Ñ\,4h w=ÅJ›æ:Æ5NÐP”Q-zBN,f“ª(&œHZ%Ff-Ô€¢öæs{" Gƒf QaUxôÅw:ùr¡EeVOÉ‹b4E“÷‚¶÷‹·Ø“§‚‡÷Ôf~&Œî¨Ã‡þ—voü”mÆ$ø(Œüh0¡ HfY„Öp)¾h…óBRÛ%ƒSåJõ( îðZàw,-ב@zĽsŒ9™{¦I©tÊēƆZæ(c†ˆ—ùåa‰F)(™‹¶Æˆq4"áþÕ…ËÄevx‚g²UÞ'u,‚›Zh™¢·hDq-¸7BhGv™ˆ’Ñ^·šÙÉ—÷€1”F¬¹‡ÁóxÁéc)ž?8}¹‰“¶É‘êfž”$Œ©clTV¨LFI, ÷‰Ù1›%‹¸x‘INNQ>)³2kà20c?”S5s39SDÈ üœuÙdé(ˆÉÅW6”˜¡R´W{éVhÙ‡F§_šWšŒŠÈbúV¢…P¿©aMS޾…ÆÖ”Bxàl2!˜8‘A>…Á8Žã79G!:™a 'rö“áPPX H{N‰aè†&Y#S(|þéØZA¨^õ¨‹'ù„Ìi}îäO½tKø÷ùOVô0ÒwV§Îç| ‡=šçŸÞ“¦):2‘?ç“>ëc'‚ò>_{2sõÐ ¦LT%ez˜ŒË•tcä¢_Bx¡w—ßo¡T¼!t¥9sE'ž!Y›$JOKE“,ç…ù‚´˜›û¨'ª‘ ¾æ£ÀvdÃ6€‰s°õ!Üh8aC§q¢zL1v®‡'F$aë°D±B¨Šx’uc—nKÑ–?øš4Zª,æ¦ÞYŒB˜§¦#u8g8®Í÷5‚·™³¹–*ªc6&ÂÒ|ä çQkªxç÷=l8Ví³H†þ5ðHðw9Ô–]pI’š´ Gà ÊÍc¢É§›7Y4u¨¡I—v8’ãY²aa¯oŒ/ªŒ¶W6—1“<ö¦Ú«pÙ—(ëtñ)”3¥x<Š‚Ãº1H8ïØ¦JqÆŠZ—º°äJžU{A¬¶'h9QøêP³„¨F] [\^éA€¥ƒr¹ž¨E¤ã+lj)j™„§Jp2Kp©¶s´êyÜÙ`©úFIœü Šœ  ªž_ô˜zR{SÆ3`sÉê·M»:+ùtrˆ„Ø¡¯¶²aõ›ÛÙŒCE¹ù؇XA•´un¬§úØ·Dê“Ð!–“¨“ dæTB…yBHþ›YÆŠwäFˆx",f¤±!õ¸os«ºæá—n)<ššZydɯ‡vÔšrwn]Û[!Z§p;²y¹ŽhU¢Jw»z*ì*»3JŠDé¶BžØU§éj¦¤GšvT®Ï3Š¿ºûºà¡{²ºk;[¯ºÑbâZO˜±¹5›n¹fq›³g:¦ÈX¤—&eçÔxòö5”gЛÁPd9±þ™d7§•˱ue±ä8[èHˆ¥;Nr–3,Žu;bdk—¸;áy¹tqI¦;¼³ü§7º¾’K E´|(¢Ä'p®k”ƒš&iøŸCy9Љö+0«©‡a"þ+YÉ·dÙê’Šåb—h»¾›¿m(¢wˆ£zûa<9K¢VR«Q˜"ù½\,kÈZy À.¦Ç7l´Ä©»k¢´Jv‹tŠXÉF<8†Ñ3’ÛàeA뫇!›ÉÔªc Å}L¼y¸k;.زž‡:"¦½¼‰½º^·éR?ÇŽò)¾¦ší´^Ú«F7¬®„¥G°G ¿Š©Àæºa ”Š´÷SÈä{€¬£MܯJ…Wôʼn̴l顦¶¼:[b, ’_ûì‹â–¨3šµÖÃÅ·©*“4yJø´:‘¡šø&ÂÔt†Äª r°`Û•§ØìOäãgܸþÒP`8¤@5`QpÌpEP õ ò°2W° w²N0¢óÁz yÄÈ«M¸.ô·GwŽàEÀ`#‰™íì­NyÀ‰!_U±Ó$ ¦U)Z¦"ƒj"Õ³Ú—M)Ø7Óy»EU)]–XA ‰]U rŸS Þ‚zôS J"‘@ yð8NjqIA͇{|U8„Ç›/6šÍ< 1¥é„jú0ç¹ÁJ¼´µ4°J²žº{E5`,I®DXƒg¡×³»FK¿¦&ÂÖ1.1Ìu\»÷ÕÂI•Yâê£-ÿp W M _aàwòuaG­Ûþ¢¾´;´4íš Ê:—žñùªè8Ø@ø$ïxÓv<"‰(SÇ–Ö7ËL“º×ç sŠ:L/ÀÚÔ ‡`Y5Œü&^O'3h­` ¦ã$3`— P¦'ce¿(ªY˽þZ“ɹ±‰È»ÍÿÖÓXjp\ŸòœßìL²÷«§w*V«ë*g&TÈž–',ÂjdÈ9¤*zË4Z‚ýb!(,Aõ'3u° 0 Æmi õ[PO0ë×~ÓFi ° šŒ‹Éj$\û×㻌œ1n™m² ®·øùº¾íÃE~Úœ¹C-A ŽSºüàŽñ*Ýñ²þY‘pûI¨‰™Åüˆ«î“å)q‘qA߃LÀAµbRµ!ñ½ùj¢N˜½ˆÎ~íÖ«Ê00íØF7Üüš¯++Ô»<‰wN›º½±ûÇØ˜^f4ú/–GMÙß§,؈;ü½A"~Pàt§¨(y(å¸(õW¾¼à÷â(Í-ÍKŒDÝäzkZ¯¬€‚…¶^kR¤‹¦±yÀÈMkv k,;ò ¹ŒH³In½Gœ)g~/Í ¸›`Š ´S<¢F!Þ"ÍìZ{vÂ*k,††ûÝð8š"eKž¿ˆ§ý{µbÈJtÆnléΔEüÆ3=ÎßʪŠPsLÊ)ÎäᎯËàÈ®éL³r}}ÊŒaHjA ‡”Fö7ÚòùH6[ÇÙÔÜ D;ó‹‘.7¿»SH<ãt->ãÆFýsÒÑü›¬>³Zì¬Á Œ°!“ó.$[b‰Ž”>Êm·kN8Æô4R" JsÃÎŒKs¯ö:ƒ‹W’뤷œ[`‚.‰à™z¨@¥žuÒËg 'ˆ³ =ý¿=»åDo9-DÃ"¬õ¢l1Um[A¿ÈÒüÎåS\ÕX,7Å=ãó4P>OSÎßúÍ\vÕÕÅ!äK£zj Ç’NµGAD;˜Ö{¹â·ÈÃþ"Ê£‹)¨îˆ:6Á„‚jHchêÉb‹zž˜€›r@¸Cç„à‹/Üáu^uñ¥“_y!ÓÃ× …wé úi3¦×-'ÿ5úQ€­hj¦;ZR„c5ì¸Ç0¾zÔ¼–ni³í£ì%Só@•ŽnÔ­$Üvü-¸zF­5\LÓÔ·¸4k"±,².³¬ïw'(q·ÿ”·lƒzS°1ÿ›§te¥wsJµu÷i×0t:_¬WÝiÓQ/ê|“C„ ~]tP<2ƒš±áßBÕÞæfIÑ/Ž«<åœóÄö‚iICgçÚóH)ûÏ—iÛU=ìÌu¯5þìÓ7×üí)2tN¿agè}ÁHû»?|²5µáTÙU!qUKÖF>¢¤pâÓ˜ºp%*`®~ðûÚüâgÁ fP‚ÜݴּБ`¨_ÖDØ´þQ°DããšèXs¢ï‘/jñ¡ÜàfhBåÝ0" S‰ª ¦ƒVÕæxÐÙÿ²7«çŒIÄAÌ¿Âxqp-¥B_òh·ÁAint1t!¸døÅ³Y1Šnš\j²xDÀ……"¤ðW¥aqQ²RßÑò·¿–+T‘ K4ё۬ o!y€G(‘áXB»Èóbø$ºÏtà{¤å2µ¢¶{UŒâõ¼¹õi/þ—ä¢%³E.=¡)ÕH;zMò”J£"ÛÕ¾ ª’„`ûm:ò°‘Ȉ¸©Ññ¨W¿2('Z´Z“JÄÉ)Z,•kü AˆÃ¯¡-ƒP,Ló§Lö-ï€)¤ß7Mù:m(Ž’¤Þ&qÙ'©eì†Êà O§¨šÏ9³q• M’‰•DÒ«ek¤yœH~oW™š“ ¥ÃÊ͉¡F,bí̸Ê.š¥PýsݬUIÈá‘‘£<"䢸ºw]ŽT†Z#Dt¢ îÒ†³«h÷ÈYÇuéñŠÁÙnÌz<¬˜²¹‹üê¤Òœ|"FJ×í¢Èq–T•àÔÚMCiIóM4žþ"hG«ºÒ\v°¥÷ô“Jψ.* M—ìéadÙÅÞÑ–å|篹ÂQöx¨ÊÛÝxƒ‡B¦äxp+¨×îªÀq5µ0AÊBòAŠRŒB=¤(‡d-SqŠ1{­›ììùÕšÆ80-2{÷ÎJ:JrñÄO+;jÎùÍå¡+:h€ð§UÆÌöj»5«>¥8ӯʳv¼Z/kóS’ SÅlÉ+éSÖ[2¯¨\lÎs,€6„…IÙA­XKÒÐ2DiÑ¥åK{ÌÓxSµá ]ÕLØÉÓNS³Ÿq¥Z@©Å]BÓ­ðM£½ Ê@wV.™$Å)9=«Ÿ>Ê­#Б_OX!r¸uþTMû8¬&Ç¡=itÐa‚rŠ¢RÄãÛ@™ÑÒJÕAäB—càûJYRî° )e:}ËL‡$P”¼µ h cT£su)Ö¬Ú®0¶0hÆír#FL•OIÜ k§ K®H'ÓZÀv’Óå£*Uq(Ä*oëf{½KaâñU=ÅÒ­’ïœV,£ç³S*Gt"F¶ÔûäÙ»´ö6¶FÕdš?)惴3›þúŸJêæÏ¼Ax°gMÝò ´@Ð=H'|ÀÞ õxÔ1r-Vëú[V’RmC¶i¤p ͶáîÀy¦ñEÛªÓðäg(.ïúêLb:U8³}+ìÌ+b,;5BÓþi'õ †i¢6ÂM0•ÛCJ5ºI®—tèÏÜŠIï«­£íI"IQóœò5kcˆ²Ù_µ)|Õ+ÞæÝû~¸ëv}«LÏ€ýWÕ8nšEî¬0ç‚÷£ŸŒwQ¯¹Þúùî=ìëå0m5÷»ÇM®,(LË!ŠîJMUØêo'“,·ÂÅåì…_¨só-s›dÒ=otÙ~Nx¯¤j5βQᇵ“…Ÿ©ò¥^kuÇê;aÑÈ7Ôþa;2ĸš¶ÊL.‡g7ÅzuÕáòA¯kÊ*Rlò¼æBæ]±Wç熗0À½¦o¨Mx õägYÝÛmA—ÐþÞfáþm<þ%<\pƒ->í 6§=Çò•õ´ÀÈr€¿*€ÐÎÑįîµÄ߃=G¡#y®¼64H‘Zi ޾àïE3Êß;¤[Ô¦0_ºy÷´ð±f8ý„XP¡|uÙø¸À•*S?+ØðGu:q.Âuÿ»xÕºË_ð£žè'L=®Ë¥o¢ß[Yÿ©’ÄîBsJíK‡ë»ã<~Ò ð«HnN»Ú [éº"ù?UCF¸b31DÛ%9ª±K ?Jë/í›R?ѸÂ+£¢£Êp»oѹ»[KºÍѹ¾«½{)5; Àü³ÑSá@r²k‹2 þ1T’@{A„À¬¥µ#”>a6D‹‰L‚¡SlÄÁcÊ4-ŽëÃþöá8õ8Äl4ÈkëHÁò‘r„™7Û0‹H¨–9!]@½øã3Zæzk=ØØÂžTÅz< nSBؤ€¤H8Â'0BÓëG¡ûÉfܤٜ©Å„ƈôÉgÌ4ÔȬ´8q¨ZdM§Ñ0™‹Ø5¦ƒÊ‡|¸{ò*Òý ×»Gò[ÀÄ#µ·R4òÃp :nš0À¼Äž|#Ú«0¦ÌDÆ”BaÁëÛ6Èè¥  ²:Š!¢ Ó³áÚ´Ÿ)ÂT»È8Hã”›TM„Ì)Ù4ëÔK C;à̽J)8»ÏHÄŠ¯÷ŒÆz©?þ‚F¢¬À®‰I4þ?Á,¿}=ü›¸4ŒN9Ç­Œ˜, ÞÞíC„朩Íãü„ÍUZ/8¯¾½¾›ˆ›¹Q•Q¤‹+U¾ÙÝò!Ä¢±¼T²4 ¼ÖùèZÕdfèå³Tjî\ðÌN ’pc“Í=‚–áyé(}<©ù3Ã1» jVÚÕôÕä«DgæJ¤lg6îFæU8ÑÀݶ;¥zâÇäé|ÝcseÎjωµXN>VãDcxÉ5µÑþ8f²Ý@$ÝáŒÉ uÂÃI0n\ÛXAŽþ[5ÊoJ x¦Ÿ_î·a(ÅBëA•Ù†»Õ¹VL êÿ¢ÆôeÜyMº‹f;æ@§Ì\]NZ–þÀÍ<Úëi5Ó3fr¦`" VŠñOtçÇð“FÅã€.Ir@þøáûÍ;%{idîEÃÔ±Q¶=»4ëµfŠ~ZNë&f”N`µkÿe¿Lµ‰ÏU[ܨåþ#G¥e¢oƒ$2Sïôú àe"\K^ÜÕ”QÉvKèÕ]fnMëšf_$ÄܱEV1•;ÓNÚ„NeƒNÔ.ÊHØÆááÈ95&×[-âªjX»[›xÅ4Åð‡7ЇG®p|FfÌ5A0žo—þDn×ÿÖ㙞>Èækß]BÝâ»öîp]P”>ú׫ ¨®Lñ©bštDÖz(†ÄɃa€Âzߨ\^|EÔu-ìõÄogRÎîa8Tz¦dJm5Fi†æïÿN[ãn‹LèŒðTçÕÜ—-l"9ô«>'±”ô?qâa6a~Kh*Õß.ô1å…n.ÊeÛ¶rvëÛ‰ä$Ïd/yQÖB^47ÖÞ5ê !b´¬ô+‰ñ¥WiiÃ$ ½€>öä Á¨´¼‹8‚0à*½î„áæH—¯ïžZ£Ûq$÷ì•Ó*N÷Û'îKfööâòÔòhö¿þàOš3Ü+Œ¶Ùt®mLÙwùÌüXVl×*f™‚@6Éç(Ì‹5«];=W—ôoâEåyQéÇÝlîÍïûhÀmnlÎÐÙÃÀcFYDÄkQ¼L—`ôV"X÷o“ Ë8’yF5gæyvmT0½D&îP¬¼YûÛ®‡y3;È.ù;%ë7üµ?ylÍÝ»“‡I±õòUݛȿ& ã?6 Û±ÿ—ĶM{6þyç_•‡BМ¯îcO±e7´WÛû£ž9¦À¼éÁü‰þz½]œù$ÙMÑ–«N¡úUû°Þªƒ2£ÿäýTòS·ƒY‹Ó¶Àã6e7dóƒ—ëö¾8îõ¿½EŽ…Ô É¾ª_ÚŸ^”£T?ö-ûµßz„³¤ƒ«S¯´ ØÆÍèÀÆ8ÿS2å.À¨dX ¹Î? ¤¶·Åßo°®\V‡Zî¹,þïw×b=“Ó5@­Oâ¬X ~.€8òሎ#Gê Lˆp!AƒŒˆp Ê)JÌ81ã@Œ7Z¬—¡ 9õè ¤ƒGŽ5L®”C§JJõþÔ¨s£G…9î<À'ÈŸ‡öì¹ÑgR£N‹.%ú4¨È J¥Z¼Ú4äT¨T2¼öëØ¬:ÅNEËtíX‚9µþtë•«Ù²]ÁÞk/B¶ ãF„XtkÞ„áÚ%|oZÀ òäkèâÅ^Ñv¼xÓfÊ,ñzY¥œT)åTϲ_»—Ï2à«AÙ+¾²=³d‘Cd­—µð§y Nž ò¸C£Ìo?W|—¸Ôʽ~ ÛÚ`u¼Ù¾Å{÷ÁèÓR,Y¯ßæ\}'ÿŠxüù¶ÚšÏLþk½ê릆ÚL(‘æ’:|†M6 B_zÝ%RëVþmð Ô Äç•\Ûõw›c–7ÜNá-…}ÀAäT‹„µákÅ(R´õõß^äYÔPˆÒÉ8â{…éx£~虥CNE’¸z+6æ›u)ºGŽOÞ'^m–GJ%|šIr¬”& BÑ’VI!Bº‘èsÒ g\ÁÌA pF›} F!TIr6ÆùUsšEâvÑ6ß&"tè•Gê¨&r4vé “^JˆOò"y.‡eaS:¨*§2æW¡°¡Ü«'nZ^I'ѤKŽÆM Þ´š«¤^'ã…Þi$[=Ï;=DTGÄSœuU65è¬þu÷þWA[ÊzeÌ®Éc‡õ5î‘JªSŒ šl|¥¶ûŠ‘ªš)³}—%VÆ n¼µš+Qºü®ÁܶÙI(yÆ’˜£•yZj å꯺?Âù°…UA¦P ¸J^l°ËvÜ$¾š–L)”…J®­ÿâØq¾Çz¬°¥=eÐÐÈU¥ÍLü£ˆ#̤r?[öm»bÊp¹23;0F¹z{¶ë*%.¼¸’/!È’iÄ60›P~ ÀØP 5nO*F>åakoÔD-Fi.d¡:‚l¶’÷|Nk0×Öö×¹ìÙËG„ ɾú‚º6…r³_ÂF¨ªZJÜ“Þâ»þŒí{Õàt°÷ÏñÌ„éë^¹.7Cyï è_=z&‹‰&w½:ÓÆ¦'"í+xˆƒ“X¸r49J`äÓܨ8Õ#ÖøìŠâ"]ì&².ºiaç*žùþ¥?/–°ù»‹3W«5}ʉc_ýâX>íÐÐrÊ)Ét&µ±4¢ƒ‚æHZá?²ÞB&$ÉrÉMrÏÃd›æD Âf-J[“ËøÂöUR¨ó×)Ëâ<;nñ!«ÝƒÀ̰j{)Ý iÄ*¸8n‡fL¥Ë(:­t)%©¸]Wb¥&;%¢Û±®R% ¥"jœ 5‚G‰àP{¥ ÉàtÙdž ŽBNÌš “ÆIMžêJ¹ çrF5f­kêyëžx8`ú1uš„”ÓóMrÍ'kú $/eÔ?,²@Id‰!ä ‹ÒY õ)KþP}ìQ‘GYþØFxŽŽ„Th$¯—P¼1‡£ƒŸwÎt’‚ÑÓ:=²/Úì¥-´)‘اAOú”iÕ,j; N"vf% yÉrg&Ô¨RÜ©ãõÀ÷Ù<§R¹ì¦E|öR‡œñ•ä^XQió¤bïââN:ªÈào* äï³`öÌ#JšÂÚ•‹„•©Œ˜ÓêŽ/hÁ‹BUaW1èA¹ŽÅ7ÜcaÊڛʮ¨RãìmíÔNj¦·žý=°Vî\M'oÒcõë… ]Õó*ºêýeü|{¼'AßÓ?ÃʠϢòL =Àa11«vg{Á;¼yÂa³Mžl3½B°'ºÜn/W××#÷„îþZ« dŽÜ”h¶½¥xç.»}ÃË>÷þ†^sèØ/ §Ã2Ž gF<³VºRL%ˆ„ÿXzA^¢œËþ¡T?AÆ ÉT V(õ”VÙ½ßÙ÷ÉÜém_ËaîiÞó‰‹ç!œÊÖ±=%|@DY™vU”„m7UϙŲÔ@Õ¹šÎ5Þß ¶^ÍNµUµq‘±]ЙÏùØËÁ™0ÙWÃĉ]1Ù×Qù™Åb^ï9ÆÈÁ5’(©È­ßù<ž¬ ÅóSµ{Eß¾±^ÞÅ‹Ìz`€IàbáŽ!èÉ’SÑÏcµIõàèÑ*âòÝáä‡ÄPØ FßäàaŽ ‡eâŒåA#l:¨Ú†â"š`½I IE ¢iSÀ%—þkøá’)öE YÂÇ¢äá°Ü|ñYü¡œù±_ºiB–ùÊá=Ü"YÔƒñ›Ð` YÈ}ýƒ(#Êê ^4•èÑÞþŒÓ©yØQUa—©ccÌQLcÀi˜Þ®Æ# Ú5¤ÉAí03M¢2‚ÉÆì#¾ž faZ€Øœ0ĈéÉà ˆ@* â–Ý(V8µ^YÌâŠÉÀ½ãÆ…ãàí£bÐ×–t ,þE#.—H&ä|¤InÓíE#]›EðÞ!ÉÁÚŒIÆ(NxTß)‹7vØ˜Ä ƒ|À0Ø‚M  ÍÒûmS=áÚþŸK½[ =ÆÚœrÌc,šä'£®é¡œL¥KX»‰b@Å%E gØM"ðMÝÜè •L£ŽÌ§áQ¨=\À³äìi¥]°Ñ†X !‹ ã÷![î鄽Õ/ª¢Jßåí’ _Þ—Á…eÚKNašãhŽ IIV•1ãý%# \ Ð`ˆä AEA„à |€PC=,€tW–b[N Â|¥Aø[ˆâ¯½ß“4æE]jŽdú¹&_Kv%]±¹e1òj`L-ËÑ•U$J\€Ói—^6àyæ\äA6ŽmdÇ]ò¼À´ÁÝþýÖE"'|ÄOx¾– º^NÊ” ™§åä*‚#ƒÎhEWÉVZnØæ‘8î¡RÄÙKµ[..æ=ÈkÒ&T˜Zšf©RxãÃXœÌY\‡¬‰s‘™®'ûE§ÖŒŽJhÑ–IŰÅYN梨i¾%uF`1ãkÄc“èPæ¶d’ V¶áì$$º§ï‘†|¦ ‘ÖçΕ×zä¦$áGè•Ç/J¡£YipQD-ÂdkÆ%Y^Rå­äd¸âÆÚí˜Ñ¥bk±”ø jÎ ihè÷Éi0¢šƒ®XåEÿ¤ M°¨ýåÎ3ÑfƒØã4¹"! b<Gé”à-¨¨* þ”%ßöéÝ:æ ‹T¥E˜òíQ®ÝQ€… :ê#Wšbd@Á‘erÅjÚ‡€ÙâøØfìaI]NÌ?Jâ]ÕÆ\¥dÄ ÷IE¶ ~n©ß9à@œÉ‘$_˜¢Ö¡ˆZ*‡}mG-ªó}éÀh&Ê g–%`ú+îß7‚©2hg©¦—†Ý¿n‡ŠžI*ÑeK¨–ãr†NÊ }°æ¹<sþ îªYR’²#WBè6zØŸ^/ÂjŒJå%‚l“+ÙI'ÚY¾…¶«TÞd£²I{2|NⵞéÚ숖êxH‘‘ç¨OBÈëX,GÒ+½2JdŽ Ÿ¥þš\vdy‚໎,UÌäZª¾ŽžÓf‚'r†è~éy–ÂNZÃÂMÌžmªtÚV#OùÂø‚/hƒJHhU¨f$"ÛzŽR^)bé’&ÚÖ>μòèÚÊ¡‘~釤%zåZ¦lãS‰’Å’ˆ)µNÕÏîÎ .¬àEðPí°ýåæ„ø¿.«Ú¡&çv&ü@F¡6à¹ÂR‡zàÁÂjVV(úi¢~`ƒºã£5f®f>",wFZÊN¶(Ü~j"–œªëàÈBúŸCJ„14€ŸïtV¤¡F-”+®~„Ö>i]bñºÍnÐv~&×$oÐꦱ‘,þE¬ÆžmÒ,´ÚÛ¡ÁHÔe Þåè§nYWúªNä¦÷8˘½=CXäAxdÞÞ„¾!À® ‚Ó_è/ºr¨ûŠU–ff÷]iÖzèŠÌb9 ^ôjÍõ Íÿ¾YÒŒûÊžbÎ,äBc€LŒÔu¡T½hËM°GfbæURB)EæBüƒ0&·©í žã¶(í,5Øí!õÔc#B(Á–fB²q6æaüV&e^±ÉM °”¸/Êài*ç䂤@…ný90iD]%öÇÖ0-v”ñVÒBøŒ ÔÃ;äÃ@|Š«?íqî¯FÊðÆ1©Ó››Ý›å±ð”† /Á+þä®l}´UuRÎ/—ÞïÎ+ï)ÖÆ2*cL‹UE\w1XN§Fž¦¡°Â¬A$ÏA˜ £âÕÒaΖ±»Š§ùv'ËjÔ3çøt-ɾÚÍ€å‹ýÑÕªœíÍÙüJ&w¬a…ÏVÌ [–Ôa+•f÷]ëvN›ŠÔHo³j'§m³’`‘²d¥¾¯Ÿ ñÀoÉŠ+)Þ#,mus\¬å)N0Nêjø-§^Ø/ƒªuA`Øø†·vo²j{©àî«ØV´* Qš°“øúÊqëD§,‰ Ÿf²¦XDÇŸjÊîñZÓ8w%N\+2™´JZµ’ 0˜þé+Ÿ$dÞëXíÖdu¿ÁïUñ—_Qk4We-³oš,)¶qùè°5ý4L/G¤Þ¬ä걚"{¥1,«5;sëd61õ2lHeE‚ŠáðÅö.bËF)Ù?ÏrI¦o]ss¢¶,Çzˆ«f­m’朂Òô\O'»eY‹2EK­uzY)Ó´‹¥;/Äf0pÏBµ´Ífm–Bç ¾JkE¶ISs`è)ÊlžoàÑn䯲¨è0a·si“¶QŠEžÎ#GÂÈzÌˆÞæ0Â,•"jy®Ÿ³fgrŒDá!qlZU¯<ãK‡$]duzø_u¤$] ÷Pš«ÔôôJËôP×uþî.[c6̶Žóª‡gÃ4ç)5•!êà7-ª÷Ý´¼qñåJê§85JòÓ=ABˆî†QÜ`€U 6A\A ŒZ}E&8ÛðSö4+©ªZ¨)Òž,·ŽµÁj…žõ®6»u;…¬–2£2žÕ¡k++[è2$±`_o/ñwž¡›€–ˆ?A3Œ›Ö±Ö÷±Té¬üh#Úæ˜ãôÎà\WÉ(²ÜW•®r|¤jË8>î’Ô¤¾öN¿Ü·Ï(’ ¯·v¾sÿøãÉ3ÔMÛ™âãsqÔWÕêW-äFT@?€À*Ôà 0Ôžè·ÍÔ¸°U'•äxøþ[×꣭Wï VýðÂ8Î2ë)sc®úç’ÝZ³¥©µáRܵ¦¾†d=Sõå§ÂiðbŇ·Æ?‹GL‹ÜÀ3”Â3(C• 3ùøwsTwn4)»ìBp¸öyÚâs’Óï†bIé¡åA„;v¦ÀyÍ— µËEô;"®…î{Îö&º×;F»Æy¥xD€÷R„+ L(ÁØCÄÁ–'¿*¦ íp£»Ú%.ü ¹ƒ.µqó¯°Â´s¶ˆp—0’J¤~¨È /÷Õ@•& ƒy{z»ú WcÆz¹…è Q<‹$×=¤C$Ï@¸¸°Ç»|¸þù€§êi÷éhïÚžC×Ý­¯RÕ)ít0Ó¹‹«óRp™Î’p»Àάš< WÝDuxÖg2eY(‘ÀLoîDý³Òû*äL5«\q()ýÜìµc¡¬ôÙëô 5³i ô²Xñ>ÝôRÁ}²Á@m-KÏü”äìÕr7MµTtëôÝ=çÑÍ©î¼Ê«ß<Äê;å89è <÷Göu–Ùo—$•ßí•«»<Õw@€kå–M|±Õxº“ýœ Mc[…xcNû÷@PYŽ´5‹¡½·Y{ƒú8ç}õÕÖZŒµ-C«äÌj«®¼v¬)W®WVdß…€¬µ~®ˆ ꄘz8§”QŒUçs!CµÕggÖÙmþšq&õêSÛyè¢Sþ×ÈB[¬{Ôm­„Mî|Gp6,Ó5—<‘óöw!©òØuNƒƒCXa†“CY^¶AªNhŠ’Û#"¡… xy'Ÿ¹‘úØo´9ßöØI}Öûñž‰Þ›÷ÛaÓ"F§Ôó¾}þÁ,c6ôxæ³uíã–%{êîÝ«¿L*þJŽƒû jÛÈ üzXU$>§$óH¿ ð 9Å®1ï†x:vª Ç4mýO‚½MIj·3>Ée´L¸ŠPóR ËG±ˆ©kj,Sœ«øÓ¥é4*¹Ë`H‚! íF8–Nœ®Â°xE‹Ja èD½‹þh$—ˆÀ3RWápl2Ì€¼Å3Û/ƒ¹kˆ ›g4€u‹nÅ2YZnb@ò­²‰Û·æÂĸ]lQ»Ûr†Ø¶¡x‘dKŸý¥7ibC_AÓ>ÙwQš™N&Ö¢ Y$ [¨Çb ¶l¼A㻞ÿtD¼9r„;3CH>›‰0ŠŒ$—¼s?Æ!I†3"òÔš Žª"UtW98S’Òz«Š`ßt§¥ÉA…X!N º+ñ ËYsjsa†‚–¤¤QÙȉv£Ò ÷¼þÍ 5DÍ_yÉf>ïwŒëÝëbåLNưfá gðâó:1:þNeŒÄ †Ž@9¦yè+! ÷–¿PžäE•”ÙHF'J¢Õ _`¥6á†&Ä(ïmæ|¤AÙ'M âç¢ ÝŽ6(8–¬0ôËßǘG2mœ -‹R¾‰F4/¹š\ˆz“Ëá„(C‚)J5Õ>p ’a”ÚÌ8& •¢ÑŒQ ‚F˜­2–}âHÚ‰?‚iyÝDê R­¢„©™|)%aJÊ„nS%Ñ#iJÇ ì«W\ù>ÇB:g23'[Ó+:ã©A–òíÎ;[:£ÚL‚Ð&ÊÔ$a­*»V©ÐéäkâRµ"*¶'¬eÓ Åeõî‚¡-Í) Ô¾¾jþX‹Såê¤K;.L§¿œ(fÖ2ºÑs§D ë:¹)IõØJxÕÜèaÑSN×Ár–t îSÓ¸#¨¥0ÔRO‘ëJqb™àÚ$+*YL2Ô^LTc<§zÀ¨,ÌžÝóÕÓÄÂO•6- 9Ÿ1$¶‹šåÈ#4z?•S¯Ï _ôµ5R92 m‹\Ðb´«¦mÐ|k!•hP‘m”"wKÚª%Sˆ2Qžh¥õàIn`¬=˜¦Ø^·Ÿð¥íEž³ˆîÏ!'ÈžÓˆ €-#æœaÕ™&¿•u[–ÑÙÉÒ&U¹ï4«GÌÜ*N¡Ò›­«Ø*Oàý³³þÙ¤•‡ÊÎÿé­Ä‰ëåð>š7‹i\Ë^ R‡€"«ñ‚C¼@èâºJÕnd2lEHby«ænyÿfàßRñª%Žìfü8+Ç\Z“55ÊdóFµ¥U´Ž<¹e¡@v3¨>šäBÄ«‚måÂi1/‰<`‘T§¶bËF°‡Pp @ ˜µg±eâ ž¨Ç+î ×ãâ9h ‚tÔ×Ñ{ô%eåUÁ®>ø³JºqŒk]éÁ(òš–nP)ü¿ª*Ù¤DUhYeUfxrDËI¦Ò_Wf@9o&÷:ä´6·—X!n„ì«'‘¤¶yE@= àƒz˜!Åþ†x"UD…yaÏ16x ‚aØâ~§}ð§“«ííêû²¢œ"·i.Û©-pÔùJU¡•r¦ ÖÁÍí°— n­ÞûœžÕ¹Í©5ZÝÑ%WpBá«W=š &·º $d'‰”Žù^„Îw‡ÔrC÷ì øn×8Í$zÝš§äWñz¬#ãbSä—=×ã \xÅ|­jø ½$y»ä&o›Ëš*·`ýXR8ÑG•pº½É3Ý?yò²Åþ´rŒÞ|ä#÷ñ•q#ó ¯–ê—QæbëΣx ¶-èSêѺzp£ ¸ƒ8"/D£ÏÆ$ÈžaÁ$äv! °€Ö  îÊùÈŠªÂ*.üí0–ËÌ‚oúxj•*ðd¦ˆù*IŠp†çÑŒÏÐòl°§­àc· p¾ ú²Jß61Î*®N¾ÂŽö 9JiË0AXâÌ4¶ ¥cˆ&ÄêåüxT‰<ÎLÀúkÈœ0Î$-ñ$Š>¶÷VBÔöoGЦIû`ïvä_¦~*OY0WÝ,"µ¤îR¨µ†cC4§ÐÆl¬T‡f}tâÆ$M´‚þæ'h(, éîYiÞ-ï¹.@RWÇÌ÷ ˆø$ºPDȼ‹á2‘ñHªŠPã6”fN n®îÄ8rPé@­퇄̫Ô<ÍÔ’ 1è³¢’f°2#OMÆ%õnÑ>’³ìðïÍçhd É)ÿÒ¸î1íÐ\rêp)oðž0Ññ" Q¸D²y*3OÊ ]ÒÒò²ò3+/F õ1ŸŽð0 æ”è÷T#±!±®+cÓ‹ñî §"0/,ï©,ÝL. K>Œ ÷Á@3%Œðt±o³)Orþ1™ò'kn)q$ #ízóZ„¨#¡ìÊøC—Î,;yÑ4D +ùÒpR 7tC&édÅXèêR9]ÊëñL2"E#çv2ŒÊ“"É1ç†2ßMÕñ.{"Ë—öÓ/Zf7Wð5(9MÔn¬QÒ’^0|ó–L‘óî(áHRݲ;‡NöPvL£-÷qÁ4ûü’ù¯$ôý1\þ "‰ñ™à61óΙ Ó@?Oú2"1![ê >í‰>ÅÏ>5§ï@”;sS+A쬫9k4±+:1±E‘ÑAŸ1BYðiq}Ô9YΩôs;m”Q ÑFïþ«(Ã09튴ZR “`Ô+C~áTî2ÏT7û”èpS3C³qBéd¼ú²s¬R›23‡Œç–3=KIR/u6öôM9m.”ð…œ1ÿÔh¤ë0çSGµ#Ó¦²4¶ˆ¯0k?‘µU²Niô[þßE\ùÑMÏ¿hT`-ÓcÄëKï2¥¥YÑÂI¹DZ›AMðHZ›O_ÃõüZ’Md07J‘ŽNYX?³@ûÑ@q­´°‰–ªa»Ì6Q¶c0Ñ6ÇèºÔ"Y4xº¬`OB0ºA)¶Óºq]ÞrGvñ&EÇ7]M2ësW•5²]¡6$DZ§’\+±$õÈ]9Ó#u-»°g%‘ùÐ@ÚRáòó3×9ÅôUÚ-'¡2%{RHF1 å` ËòóDlÛó9?Vl³k톇«iu°<%_SvÝu·ëUT%/Mw©–lÑÔ'…”y(Wa•“4£Xƒb«B&ëVþüàJsÞKsËôEGq©Wf¦f96XýÒE“uz¥ v´gµlYÓá2%l­7a­¾¨GDÿ“ùÕ]ÃhÑU “Ö,ÇÂHO²}ϳfÙÒ2)/û×Ü‚²^wRg˜Ó^JJ7ÕY§%X+l×3a-˜×M2„àðHio9”]äVWäW z‘#d­³\O0p7 "“Ó.Åf8q ‡¿v5©ÕÛ¤óUa×X[Ö4‰W”VÈ}3òeûõ†íõƒ“u„£(Óµ,Y¨®êu7û6<ãR=3ønD ù¶S‘¸TƒL7J¹"^‹˜8lw$+wZYþDyÿr àðx_÷ù°Q¿)êîd>i²*rJ*y3wíTj÷.öQëXoÍ–&êtÏP@±U]~&‡³}yv“™Êîî´ƒM–š èæØu§ˆI´WÈò ’XXñÐÔ‹•{Ö2"H·B5’—TcÖ€ ›« ·THì”Õ’v¸¢ˆ°KòB;•gcaò„¡Ð˜ÛâªÂÕ®T8(Ss 'íÑ%aÊ“ßÑ?[ÔS³6‘BÃcÓÔYB©ˆTýëd)Ð(Ët‡µŽ%د)¾Š‡‰Øª²öIú‹±>†*^ 8?d—Rñ|E³4‡”OS‰EþÑr9F§Är‡“‹ã9u§åšN¹øHƒ‰ñ™„]õŸ0n ã)¤gu€¨ù‹)Fddygñ“.SkrpÕœ±BŸrê“Þ•hÍ„}/xVNÓ]‘p‹Ù»ø¹‘±÷›y-i•”]è|Âß„¬-lãE!$OÍ"”ÙïÀ³2ÞÚ}Ï_ÀR uóäEkNr‡øœ”Ôi™†AÖ<ÍÍoJͯaÓŽGuÕS®A¢ˆTMI“GšÝÓXýTŒ¬TŸï{o׌ÀÙ[)HbUx&ãPc™8Õæß.{†½WwO¯Z ƒ¸XYÚW›K{x·ÿÕT¤$¨õVò´ KWšôþ1A{0°j•´-+$?$tëá y«y—øφ [»0—:—»œ„ùõ´ ·ªAu}ü8Pc¶»£²x›pÞWw{ÛUt¶£·1M°'BÛÖš»&ÁÏyídW y“x¬ [Ž'­†ÊaÛ‚ç·cÑ×°ãÌü]97¢Ÿ‰Gõ$vdYˆ¥‹8¯·€‘[Â{"º¯ðeì­)À’nMtüPB9zLëyk꼋zÃzÁ÷Á—b%ÿØ£¶¹RE©?WNv¹ÒŒñ‹®Ôa/±‘­½y·%šÔ0mKTw®8Wu)Áˆu«Næ÷®3À}ƒèqóöi¯þÈÅIv5“é©&ƾy9¨ª ²Û"Nê°3ÏÑ8;méWh\º‹¤ZLæ¦P½çm|F¥·‰hªéX•©¸謵òN·¨HºÛ¶{§ )±É¡ñû<»¹Ï=×½\ª7wÈ]¼‹Ø)Š›Çõ—3.·Ûwì“/ |êÌùÞñä82]m_¾p)ƒaEB†u™3SÕ¯ †ÃÔÔž¦§=Iúð+84üÛtÕU£ªm#ŠIŸÛÉ ·íüMC¢ºïIÜÆë>ó¯ÜÓsÔèªå{]¤iæ¿Åžƒ£¼˜X3]gµµã‹r=á;¹À]þMKz!³SH›ŠˆÚµ[/ˆ¿ÁOïÍR‘É÷ Œûù.ªÛÙÐ÷ Ée¨ÿm[Þx’Ÿ?­ùÔ®§|b·º¯¹wÍtÍ©Š ¾’D)‚–5 ä¤C¥z‚êQxDÇ‘‡ŽDT¨pâB‰)b´h±âň3bô¨ÑãC’#?ªÔØñbÇyXŠä8s寇e¢ŒHsgÍ’1OÚ,i³çM¢-uŠ$ŠôçÒ”>•2ú4iQ¨X¢TÚRkV§S­65•ªQ¯-ûµ^ЮUÁR-»uîÓ¦V½rmkìA5L%!rêÉÁ#§ÇrŽ¢Éþ·.Z»d±JŬ¹¯Eˆ–ïvž2¬è³Nõ¦ÌË™µë«¡e²6-Û.Ͼ±qÇÝÌ–nåÕ_á’ž-šwg#ó8L-ryîËe‰G‡ |ïôÍÂu£”˜N*‚å¨A¬Xàw‚¥,þ{ªûߨŸ3Ç~|¾}Òå¾ï}4øi›jÉg]urAujÇWvöW}ÆG\|*QèÖuÀ…$F¥éf „ b¸á†¾ñ—TQ’GAt0fb„Gd’Õƒ!}4¡vb{î¨VxŸâwÕ‡»Õ4áC/ý·ß]oØš~SÒædˆ*u˜`n$)'…·IÈTB¸ÖOîÈþ%iÖd‘ ºX=3ÒÞxrè°Xc¥g˜qÚ&%™>²(\¯*èš ©ZZ:DÙTÌ¡öR£qº%¥Fjªä˜®ùÙr£š¤R ‚Ù×Kj¢Y)•žŠˆ §öYx`G)æávXb2>f§d#žÊ&­ ÚšK¨ê¡ºß™”9×Ù¢º$íB^j,’Žz[ì›ÊÔá³´×d¸ü}Y«¸åv+ê•O*Ú꟰.Ä1&y{îjB³æ÷‰XÖË#˜*ì0½eÎz°hç"(i¶øî官÷ëi¢Ü2©o'ik šëf¾ã~ *ª¤ÆmµQ¢þëlÁïR4§°½ ôkyrœ7lBÊzFäJÝæw¨Ä S]ÒÕA-+^™V ¢V‹©pËäÊ â‰òF;µM¤Îì-™m²…º=Q[È?ö¨Ê/Ëܺì¡-ö±2íèöØl3-úæ§]jm©Ýu\Ч;¤Ö5¥ºB‰ æ]x?‡'pd Aûzì¾ü6UËÙ›µ¦Ï®¹SÑc[´u^6/}¹®n:QØäz/¥U.>}Ŭg®¶ûÈH}üïã¸ä߇ÛÑê‘›MµFZþÊÃÎÎã/l1,JÏöž·8ø• C—ÊRÿTs´ÚŒR¹ÓÛÖžÒ$¾­¬v\û઒S¿ˆ!¬'¡–·ŠîQΣ›A22J='W›ùžä»dU%¹*HÏäð« äÂB^ó Õ1LìZM“è.C85YQ˞Ƅ³½|.tàÃ"¯ÇpaLwʳ^ù®v½)Šdró"“Ô¯ iQjÂÛ ó¥³îôK ÌSaˆüñÑ…ñkb¾¸è“ Æ1k$™‚)‘å™TUì"–¾(;Ì}ï†)3ÕÿWA.Š1жÃYŽ(öÉÞåä5DŽÈØÇ¡Læo&;sþÌ‹‡`kh6ã*ÇvÉ1ZÑy-{–Ûšå?ˆMÌZ,¼£Ž”³6Ö•O[4Y(Ò•¨”·+f$5ɸcb" à -›(8¾±Dü+!`>À"nÂRàÙ\6ÊT2sš’¤ü2¦‘BÓÉY*Äí³e¡4;çxHƒ–ŽœüSÚ5¿É¹!p‘…úgŦbE°•ùËAxæ«ò <5c9¹;™šÍkÉÑb3I©HRê/‡1´ÚGçåÄæ1„Ÿ)Ú-;Z½pšò¡˘ »ö¤“Žôè;I¸JNe_,ºy\DHõÌ´ê µZ»¶®‡TuþöRÉÔšŽ®ºh'Ãç±3n%-4NªŠÒlEp­Mê×·B$œ¬æ-êÆ»~ ˆºtQñŽ˜DbMs6x\Ú1¥ IÒq|2\àAJ?4ºö–­sKö4ZTRö'³=£Qð;QnrÅ) 3˜W½%ޝâä ä¦#RµÆ5Eü@ð¤˜Áõ !ŠÚÌD‰úZˆa1L€­![NŠÌ©¢UŤ\ÝÊQ ú¹Ü(åšê2w.-„Y¥ïyqJK9¾I‰õ'‰éZcV&&`uL Z ,(xhÌ´"M+ʾ>©l—±/CãV×ažO¯öp{E Nð}ó”#f£9þ%ëÕœžd¹Í pŠ/)XîÚx(€í{+؉ømxÓEŒà^:0³÷¢¦¦›¦QoB%ž->eu{ÑØúö‰™LîS-IIÚ*¯½Íp’9lÓÅ^ȦªMòÊžVÍΈJW´+í<%PÑdÆ‚G÷¶²p¾œ å `gV)´ˆ\¢zÛ»c2KÆÆº¢yÑëÜøy}dDšN}([&qY¿üü°Â˜ÜCµ„ëß‚Œ‡òà!:0«!sg©ÞÖ6ÔÙ¥2}axK w.×£­ò–Ý\\sUªK-e² »Ãј2û$JóêáûþðV‡´v=zjbÿÈ×F€9®þ¼^Êá—J¼Ì²KüÜ+o2Ú7©ñ‘“)ÔjZÙÊ7&mõ´iJ³˜»n”÷йLa’®0˜é´ß®#²z»ùÉÛL¸ný™ r ùÄ.*ï*qÚ¶4^*EC:ÑF¬5Óšþ²›±ýtj®iãÏ–XU‘ݶKl~c@sLPj¥`¿oˆÒy„Ü/cÓÉèºÏ§F³ÈÍl ÷ÕÑ vÛrkàü:°¦…fx\}s ’––R¶·w fp-kôœÍq¹# uTß%E:¨“X|î]ù Þ²äê ÍGCNÖØqƒí«¤:v—,Æ…µäK›‘ýŽäu»¼]7ÿþH•sÜ«U}8ï$‡òJ›ÄçYÿ3`V4Çhé«‘á™÷nŸµËad«®yõÌ[)j§©¤ÿÌ­ù%θY÷rã“r±.º»òI6òß»WÏ+Tí%q»¡Ï<:íÊžBz6|ÜO_NeÎðõ‹å3æV¦ÕÕôÎÒÉ[±T,uù(sè•FbS¶9Ö#b7umH`1{úFUÏgjûñc=“tÕÅ'4²gf÷uZ6zmuÎG}.¶7ä_–€Y”P§uHc&\'rÐæ~s)‡^17RÝfÞö~pÓ{:h9¢'‚=ìC>Œ”Qŧ/‘n§'7~þêá{Apugƒù–W‹xÿE%Ô€?G£3x€ç^S§cÙtX†óRP`t…í·{ÈZ‰'l“òJlH`…;ÔbŽ7G«wtv0¡D¼×uFiUˆ¾¶ršFj¨×x7£ˆ †e¾P£† ExÖ×l‡˜G)HuëerAõWôÇ áXï7}s¥yWgK,Žá'PÈxfQœ–{˜s¦8ºxrù‡xhÅAC—i(†{ èˆî6Sk³ X€Y²úz6¤Ufd7/è9™s/5·2)]B¤Y{M—Œ*6†±ñŒýçTîWuºˆ… ¥pçHb™zÒ—þŠÕ(Äuk†,…'?NVXÕBk}¥ŒD‡‹ÛbAâÊÁt&]ÿ’þB83\(Q8i6‡T×uÕaÑeøO¶ÈXu„RèuVmƒÅs&ƒÈPí³ó÷[ иc¾xŠIo{ôø‡‹ÁtÀ”nv¢öX w‡'\Âx~ºWŒþ'æ“õ×’ƒH…MC\鉌Fl°a„. vÁèu×uíÃg:“vw{at®X‘LxnçteÄ4 )2„¥{·È•„–É7ƒ*ƒ"”g޹HeU‡Š5ˆyŽ×|­EPðÖ€qÈ…ÚH|ÁljoÀ…v<þØsröcHgnH)ˆba–î”f´W8¸˜Õ’Îx^´Y9È8ivŒ)›·È”óÃ;÷Ö”÷”Ãøm4ø€–Ö¦7ƒBY. F‘Ôu‘yiHO¤}’³K9Üdf!çK¢‘|ùe—zþÖq©Bò—vx7áÙl}Y9Ü™›pHœ7)^µx-؉»ÉŒu'âØ`xpš5r^¿YjSXŠ„)>«Ò‰mHŠ[IQšy•.“e:>oÉZ×<!oÆ.PÖnXÄ[Å9NPù ê²]ðr8ô‰Ã©|kGÜqJX‘@ƒ‘Oˆ‡iwk-º¡dš×”ÈvŽýèš7hu(óxLÑþk´2py€Z9€ðE.‰¸&ñÙ È(%Â÷îT~FÂæøk¥ADXD{ršØõƒøÅŠ“¿Ö“•h¥Wu„F–²B¡üˆa#Ýš\j _:iPʧ#É’–Ó¤µ©nLR šèWDøšÏ‡uÒ&¡îy6ÔuyOáw‡U# ™¼ÓAô¨+ gl¢ н9Ë$žÝù[…r—˜™Â”’ ¢hˆ–‡˜£óê‰c„§¡oJ’”9颎«Fá!4ȳŸ^²:êè‚Z– ¢GÀX~Ò5Y*oÌÔoÖyŸ–Gi{”¯ÌGþ;q—ë*u2'šÀt{Wd•—È9“£¯d¦A68«™)ž–ji¨“BŸï›nH«—ùroú’ºšÚÉ\´:©µn˜Häu˜& ˜Ô0*]ðŸ5ˆŒÍH²›¸ž¢µ§ó¹“¨¬‰}9(Ÿ–Y§ †ýw¬ œÆf´´8«Š¡]bpwh¿F‚IK–Ê÷œvòŠ–—j²ö(‡ç:°—ÖƒEµ°g|3‡®rc9yŸWƒæÚŽ®Ô`ø˜å•®^‰Ç›SŒ»ÊWbÔ‡dú‡ÖUŽ+ˆb‰¡aê= ¬EšRåÙbív¶‰ê9Ù–%¸r·š–øª-þjžgiK>h{„^Æ‹ø˜¡©fm;š”ЊÐéRV8èù¢FlR®È¹£ñWúÙ•öj¹k²ˆØ‘˜)˜mxRY°ÿ‘fãz¨ê5‹^Û9C{º¾ÊŽú²RËj¦æá²D£ Š«È—£Ú“ªÑ¹×´nžJvfû©·ÉF‘Õ®•KSÙ&.:§ÓK|&˜ Lú*Ÿ;8¤˶ꔥݧwXûj×edŸ!BEu¬"y¯ØH…­ú³ì¡ÁÍ»´rʳƒ:¢1æ»_K»ýtìÛœ[4¹ö›«Ì»{ ;ÂK1gAå6Žr€DxY;§´8µt µ‘Ë«bຌþ¹{³]œSó¨Á¶Ari¤;¢J;oÈY›ž ³š… ‰Â×ëº-‚µxé„Gë°P|Œwj±½3²‹7Ÿ&\­sGaRùÄ=¿ÙøElHsUQùÉ~5¹¶õW±}À窜 g/"܆£‚`~Ä+‚[ÃÕ½½h1 z¿h{[ïáÆtjœ‡ÛÄÛ'¤[&r«¹"®1˜a“œ«&!¢ רïÃkû«É¡b’k§Ä?ŒÌ‚Ty:ñcWK£âgôƒ¶u&©zrÍYª·L)öyµºfƒÌàku!J¼ÇÙœÅv{— _\³f¾uºœ’;ºTºÇW*f¿ë*(Êi}¨`®ˆþ]Ô¸@Ù#wtºµ¦Ê•|+Jïy‰DX~ú i˜^ÙX¶íKrÙz¹ë˜‡q¤ª¨Ãó¨Ôт֋ϼª(••Yy‚€ y·jvÙ¬ mv¯æÂ¿Ç·´BhY¦ –'{%[Ïç©l” Ñû¦4-m䌴 ùª™hÒ+½Wõ-³Ý<À íZ«§ ±ªñc2̬‹—ËäùyŸ‘V=y¥­|9^B¡‹£ØJË­±!,©d“P#¢—h¿:Šd¼µIªÒÌÍë )`Ü61ïi¼Öœ"ô”©4,0”ðÁ´kLoÃô«+¼×Çõl9LQxš¸µ¦ÖþŒ¥ä\ÐÇùʪmÿ§ÂÔ›Óƒ¤6¹ûɘ¡¥g¦¢ØI¼¹këŸ3Ìwx¦Or}Ög­Œ:ÔU ¯°œã™…ïÈœz¸º¨û½su|ÇÍXí™ÂœÅ8TÄŸsªIê˜5 P9f-§lwлŸªöº‰@¨q ØÌÎ[1阞œ§$lÐü)¹~ËÁ›‡5Ï b[¡¦‡|ô;ÚmHj˜sv<¹]JÍËמ†•[Xà©+“Ãì\Û@ƒ”¸-Èì§£ñ½Ö¼Ð™ Õ.±\ÈšÌKýÖ”ìÃÿ¨Öt½<@Lßô,C|ü.vߊ-´ÜÅ1ܯ{‚näçÛ®¼Ãþ ¢ìKÊ/G™OºÁï+¶|lBä~9¼’¢¤S¢¼÷h‚E¤gň{á‘É•.ÚQ™˜d®–àèŠTMd~ÎBžŽ=rŒE˜[½c†ÅѼ„xÞMÚ¦½ºM>j¸Û(Ý`®ªakånb³ŠS¸Õœf…øXáMn!=¸vbÞÝ ´*ÙÉ¢˜‡2ÙéÈBåwÑ1½ºFÞÁ ~÷\ÙY.ÐOÎêÂmS-ÜÅ-~²Ì’8¹pËc di»Á\Ü.¼d«îÓØæcL¾bÖÚå®Í2x¡®îÙý è{^Ï!hÝ&UI¦–\­ƒž…}[¢¢‰w¿~‡þÀN⯢Hþ˰;× œ$‡5ßA‹ÄÀ«ï^9 %(Ð|éù® y½‡0m½&‘ŸÕÞ¨+ͬ,Ûò á½Kã ö¬ü‡ÖzŽÊÉìâJÜÏü¸sìĊλƛ§ «ñëÌVÓKóÙ§=\Lî×¶ŠÍ®3­Ö=ä9.šúˆŒH®VV1©ñ]ýÀçî‘òð¥{¹ò8 û¿Õ ÜFÜÀ»±¦ÃÊÂáY¥¤äs%² 晴û卯óâ;4cë 9Æ)•KA<.eÃÀ$ó8oL»#LèsüÞtgĩͻ|¾¢ö×ÞľÝº×n󶉭a?S+J&1¾ 8þ©aŽñc-1ºãç¯äÝî;gÙ4™ÐkÊ«Iv¡ô§ç­ÁA¬èZ ªL&ö3n쟞ð½Ê?×´øÌÒà.ð@~Tª”Ð¥¸¾“_øTŠ:ëL,L—gÄçÊh½‘,IqŒ;¦fËgÖ¼Åwc½ƒ •ë«ÆÆ×Ô¯ß÷sŽ™ÛnÜ<ü‰±é©ž¾Ét¿› _Öw£3­Vß㜚²Qïȇ<"ðˆŽ< |˜ÐàĈ%ZtxQbÅbLآƈ =’Ô2"GŽ Užt92ãL™0k®D'M‚6YæLyóäÎ#&3©3èG L‘ùôþ'Ó¤"“ }©´eTŸA‰þœjÓ©×¥r¥:²(Á–0~D©tåÈÁC€œzw夢c÷ˆ 4 lÛÖ"ǵ@Ã~Œµ¦R:ŠŽÍØø0e²›Ë¦M«øsÓÑ»†î|º«è«‰‹ND=Ó*lÄ!-O®™ömΑÇÞö-96PÞ´wæ)Î35gåaqjî(z*òË/ ’s$0T~ÕìÕqÏv:r1·y6ëjãe#¿'}u½EèÒ«žß~ñPþ­G~½@Ïz[N?üøsM7åÐCÏ$ÜœëŠ6ÿÆ"ªº‡f“%õ$TË@„\O@ÁK²Â.·oC+!¶þê‰+ºO/¾ð’cF:²¤G2H!‡$²H#D2I%—d²I'Ÿ„2J)§¤²J+¯Ä2K-·ä²K.ùÚ®ïÀ£¯»È£$M9ÔÄ…’5Ý„sÍ7å„—6át³M:ñœ“M>õŒSOAãü³Ð>çôÐ@ õ³Ï< •3Q5%ôQG#µ”OM/MPHÍtQL/mÔS9ÝóTK%õÓT7…QFU¥³ÖO E5×MQ%ôNYi5ÕÔIi¥„×_…}UÔJ‰}ÕÖVíŒuÒP‰5¶×i¥%6Zf±ÅVXMq]6Sg%­Ï#êâ®Æ½úÂCŽºêBî zæ¥÷ ©ª7_þyõå—ß”üý¨ß|˜Þ¥ FØÞ€þW`‚®÷á}Ž_†+¦á†5¸´‰ÿ½×áŠCMb€ >yÞ”ʘb“Q¾¨à?^Xåz¬Røà~gv™*–[øß—nYb£s–×ä¡o&¯]9¾“#¼3C—jò4ÑñòÞÕ±j¬«Ö‘¬Ã&/Ì­­.;mtÁ&ݱÙ6;í³ã¾ºm:´–{»·ÕF[o«Ùö:l°¿Î»îµûF\l²ån»».œï²G›pÈñ>œqÉñF›kÅŸÜoÏ;/ÛòÅWüôÌ3OÛr·÷|o³«>ì[tt=0ÓétÄ?]vÐeOþnâï{wÝï}ùÆC@ÝÛå|yëç>ñ±¯7{lï¹÷^ëðS¯;õíåþÞ|ñÅ·þüóË·¾.MØGŸìôó~?¿Koþá7œù(Àýq€ãÛÞüÈw¿ú.}ú#ëÈ×:«1ð}àûÛÿhÀò]‚œ`Cؼ¹MPl`9?u¬ïXHBPyò`þb8¦¨ù%ƒZC`×AºU sâë¢5¼†lN„âv8G;æIqoTdb`œÈ³UŠž“ ϶ıqî‚\{óPưq.‰Xä"ûöÅÙeMŠ\\#uÅ<¢Í‰²"ó¶ØþÄ;Æ±ŠµKaÙ²è9­òzgœãْȼ4¶QsŠT#åx83r±xb”£ï(ù?2î„‘\]­vD.:ÒƒÝ#!å¶Å ¾Š°´¢37I/60¼4dÅ„±Ë]‘+ááhIQ™3àdX—e¢.o” cóF7£-ÎÒl¤&ߺéÉß]™¬“¥6å6챓œÖTÝ3íÆµ@:òšy;¢=}·MÞ…³ˆåtœ;ièÏwžv¡#¨¹Iºt&®¡%ü&ä,yP0Ê“•Ìô$غyK†6“†åäa=œfÈMJÓ u:¡)ÑXöS•ê\iE5Ï’Þ¡2Ô\J!JÇþ ®4¦æ”©AÃXÑyŽÑ¨`Û&"“ Ï›òÓ§:}h(QwK:Ö©?}èK3ˆÓl:¢>+XG'Õ¯zsŸ,½¤R;úTsš”©&íêܺCÌu‰GžB%GÉ Oµþ³œe=©CùMaÔ¦DÛXØ’5ªaåhbûѲF{0Eä`O:Ô¢Þ4¯’Óê[êQ~•ª‚Í,d=;MÍU±‘SëUïúW©ÊVš5…ëVÃJ§AMj9Ším%ªWœ’ÔªÖDlj»TÇ·©»U%OÑZÕtzµ°b¥éK­{Zë²Õ´Þ.[·ªÒãæ”¥¥]zݪ[ôJ׫*Å&`«û8®þ†»U…í=q«ßã–Ô¶m%n~E ·%JϘí9ý ÝâF°¬Õ¬ywÊX¬ÚTÀ|]o…|Uox´Ýïl)›Mʶ´µŒ•m|ÍÚaÝ¢¶ÄåhzWËÞ 2žpMûZ8ÿ&ø™©¬­[ƒ+d ï–‡¿EÓ°´å*nÝÊY“†“¹¥([…«ÊkŠr••¼e5eYÊxúò“Åäo% ÌZ&•’©Üd0ŸùËKó­ÂÅä=Ñ™[^~S›ãZ­s-ìU¿c¹æu³¡ík\»Ú2C޳=kißl^Ǿٰ½´oçzÛ[5Êö3\ÛÌÝ·÷»•ííZÏ[ÙÖ6¶mÖn’…ûÕ÷æ6Ò¢=ï`ÇKÞ±fˆÜmooÚåž·®ÏqŠ/ßå7Á">îW_üßíN·² þðV¿;Ý9«ö·Å­m…<ÛÓ†¸Å9^iLeòËå"bž÷Üç?:&ƒ>ô¡ÇèGGzÒ•N£/ÝéO_zÓ¡>uªWꔑIÝ.«a•©D¥sG;ä ãöþ„@®Ü‹öÅv4”™•­Á>då®ý¬loÑŽØ~ί:/äÈ«wÌJ–î…}ûYó.ø»cwñ4v­ƒƒÊxñâð—oüwŸÛWžñ˜ÿ|Ù)!jtÙ‡TÛ9Ø“)¹¸‚¸çã$qA%ëãÝZV¾ºÝ¨h}œâËâuÂ=ÝLWùw ·uÁòŒÄ8p;6;´µGœ—•cÄH„D@DÄBÄDÄÄJìÄBô6;$DŽ+E9 ECôÙ“Ä=ôDPT¹LŒCJ¼DJTÅWÅŽ£Å> Äq‹7]ÌÅCt¶VôÃOþÜÄ`Æ:|ERLÅP<Å]4D^·b´ÅEÄÅ—cÅatÆLdF ñ˺t¡«Á Îí t˜ ª“:kG«ƒG‹"ºwtÇÈ¡Çx|¦{,¤ s£©ÓÇ*?|ä¹wlÇêùG§;H¹IHÜÇ¡@`XÇÀè-ð8½6̺ ¹Ø»²óH ½ÉC< K<’Éô¼à"<—J¼½¼• ½Ù§±£I9R»•l¯"[¼I 2É«I“ì/Õ JÀÛ#”Ä<•¬=ÈÊ 4ÊQºÉQÉ£¼,©¤J¤¼.Z© tljž»(&á0© 8l° {¯ ë.ãó(Œz1þ›Ê½ð³½³Ü®Ù²½¹,¾·±¨T°íã>õbKÖ£0ÇÛË€ ¿˰çÛ±#ºµÌ/¼„Gâê®­œ0ÙºbÃò˜H =«Ê¥R­žMšd0ÂL­¦­ª\½ærÉ”,2¼±Øü°‘=¦ 1æº/ÖŠ/¾D,·Ã1ÖT§Ð¬M«ü'¾¤Ë'jÊÛJ”1â$N·ô¬T ÌÀH=»Ë½ø±¼Lޤu<ËŸk(Â’®Â<Éû¯¾ OË0ûrÏõLÏßܬèsÌÇdÊ{ÏùêͳOåc>õLO´$EIþóÒx2Õ%}Ð`€Òòǹ:¿é‘ƒ±ÔŽºÈRCUж³Ï ýÒŸDÔ÷¬1A]S§ªO“ÄËŽœÑBUÐåBO²5:©v½Ê\¥§lÅÏ?¥WPÕÓÎÑâ|Ó¶#*7å¯}…ªÐ²WpÅ/_¥ÌFõNÞªPrÌ‘ÁP:€CßdÒ:uÎäÄ­]½KÒý¼UéäÏ`EÌ<õO@¾5¾L5xÝŽ0‡ÈQPU:XˆÛR~-Î-Ñ íU]5Ï’íXbõ=˜*þœSI5Ö“°òàJëœÈ¯|ÖíL¿+¥Öu´ÖmP|-Õú2ÙÍ>Íó¹’”S‹eP£åÙ ×þME1OíVt€ ¸ƒ;èÀAº€W–m1гÔùtQ»t½‚-VÂÛ¢òÔ¾çB)ø¤M‹ÅÍY[°%ÙÊüFŒÔG}Ø6<'šX¥½MJÕÙ·Ú/±ý½Â]Ê3Ú“ÅV”ýOu]Ý©¢0ÐÕ){×´i†ÀȇºhWκ֋e[ÖeÑ®=ÑȵÕõ="VãRàÔMèä×Ùm»‡?Q£š­‹ÖËDÇTØHÃÜÕ­½Oà-ÐbÝÍØ WÈUZ‚ ]á…¾ý,ÐS=SÉ}[½©*ˆƒgК½õÐ\ÝQÅ]>ôeÌðEÌõ£ñU]’ÍÔø^ÝL\¨³Q=`àJ…½þ܆E2.ŠX³Ö[•ÝßÖX Io%àÞÚSå¯ñ•^þÚÐe±_ ŒUÝ€Æà:@›€º@Ó‘Ü\Í®ÏZáÍÚ 6âü\Wî{ÓñTMèEáäÕ-êR›ÇÛ‰¤Ï„aÁ}]ÓõßZý^ÑlRMWÏÕª²uÌ#ußÈ£ØEÝ5QL•=Ú,I¡YÂÅÕŸMמÅW >ϾÊÔ%ÓßEÐu[Ê…ØÏÜ‘†5“ñGtÑ`ÑäàçßèÅd}M[+ïKb/.ã(Ná6áOõÙÆ*cÏ£¾À¤®ÓÔdÓÍX!†eV4faåÝÄÕO‘•×âþeK.­ÎˆØ RÍÌÞFEG´ÞÒ5äqíZßRvP—r^]Ù´¤c6æã@¾XlFä{Ͷ$»¤lßhFâ;¥×ÖõeSäÆuËÑåå}à:.ÓXÆÓ®‹Pëdä2?4‰T‰•Òay&äð}æÔÈ‚Lö Z¾ä~ue×ëÏSFå¶,ähf`ržeo†ImbsŽcžÚç[Wå°e(ÖÚµ¥‹`fR»‹$bT.^Í.àÁ$ÞÁiBäôMgä]áÞÙ0æfxØÆc–,ªc5ãZþèÙÒ„ÃÕéµNˆžg“Q÷MâºëcOÎY9’j‘F“e%K±`þ!9G8T³?Û48´4㓸î´G#3G«ë4¡ë8ë³Mk4Bë´À¶´¼¦´G‹²¼–“Þ@óëÀvìf¡´D{ìÈ&ìIëëÉFì¶Ö³h‘lCK4LlÇì½ö´Ls“î´7sëBíÖm¼nkÖ3X±²Ö63×&l%#í:ó´Å¾k/ÃmCÓ4B™`δâg5“cjCï„Â.| Aç–îœnçÁê¶nìîÂëÖîî†î¼?ï~noîæn/Ìnñ~îÜÂò¦nënn+Lïø¶ÂTïèÖîðNï$Ünï&oþ¾oùVoýpôžî0Dðövïû&pénðêþï0„p2äÁð Ço wp2|ÂïoëÖÞ ~ôû‹ñ[G'"$¸¡%wŠ¢ž &‰Ú¢(’q…jñ°é¦&GZqOÚñÌY¦¥ '§_±´Ñ§×q³âqò$o¥…Zrwò%ßñ%Ϩ&÷©$—ro*ò¢´r ¾¯ò—¥yí)'2gò0os' 6Ïq0—j:7« `ò-wó/7+8Çr+ïs…²<t÷ó+æbvX«±Ì‰&ßap]ÏÀ„tÊØš†]v êTfÈ›:w:âÛk§£ ÓÕK&¦ºP‡t¢§ûá¯>`Ru…Òb4ñªÚ(þí+ÞóàñZ\^ç®xv_W¼¹kaeõ¥¼´M«Æ ^¶#1c»Ù»®WVvdGW&Ji‡¯áäUn/vY;;ݼ`/`hwO¿.ZURãkI–"˜.ëü4»ÞìÁV´ÈN–á4ÈÞw¹þëÔ®lΞ4F{³:»´ØNí~o2H›²‡/ìÌN3H³k‡máþì×nxÊ®xŠç÷‚øˆŸí7x‰ßw?[ø”·x'••×x“ù“ç3×^3¹vë|§í‹Ïìëlä[_CH¾›^ÌD£ÄüÈQdÇ“! ²L‰’äÊ.c†,ÙRæË‡*YŽä¨s¥ÊŸ8}Þ,šè˘;“ÖligS£3a2 UæÉ¬Sg>%Js©G°\¿Z]´¨W©G©NÝéÖ)ܵb…24yS«Q¼[‡&Å3QÍEåÔM˳0V¾LG.FüÖ0ãÃZ7t¬4'bš.çj®{¸³g¾DÁF›¹òèÐ'gN¹çVØC—Ö+÷*m̵s£”}y·áÜÑö† ¼1kЫ[[eÛø®Ý⟧{|0±âÅŒ5ú<Øo÷íܯ{ÿnþ|øî齯7}yðþñÉ¿Ÿ/ž½{üúÕçç¿]>€ýW}  æWà€÷‘÷ ø!_}(^}Ê7…ÿYØá† N8ž†(â}ü˜âƒΧbƒ.ãz!ʸà„9Èáˆ+ꨣ…=òø"ƒö¡ƒ,n˜$“VXa‹IBÙ$,JY%•Yj‰å–zÙä”]Š9ä‰L†)æ’Yfh¥‰jŽù&†f¶'˜Qʉå™g²y'œ}úùåŸ[ê¹çœPb‡EÀ¼g# &FHæ£O^i¤T*H&¡•î×⥚vih£N~Ø) ƒN*)¥£ŠªŸk®Ê©›Ê:ë§Q.zª¥“Ò9窷Î÷ˆ$’iÚJ¢£°{é­%bªlöEª¥€UDˆÔV+‚µÕª±-!Ørëm·Öf{-!ár{®¶Ûz«­¹ß–»n¶ë’»í¼ä†Û®¸îÎk.¾Ø†+/¾èfÛ.½Ô‚+/½îb»0¿SÛp¼ÿ¾;qÂù¦;0ÃúÞë0ij oÂä‚|±¿#c,.Çë:¬o½öš,pÅ/»RxAï}þt²´§I¾J_~€‰ÑK™Lqrœ»ýûøó'?¿ŠLƒZH0Ìev-ÄÂzxÀÁ úUhá…Pñq 5¡† †(¢vNQâA|A #¶èâ‹3•x"Œ4ÖhcK2rxãŽ<öøQŽ!äDiä‘H&©ä’L6éä“PF)å”TViå•Xf©å–Hö§ã†Ar)æ˜d–iæ™h¦©æšVz9\˜lÆ)çœtÖiçuºù‡xöé矀*hšzÞ ˆ&ªè¢ŒâYh¡P@£”Vj饋> ¦@CJê©§EJŠé¨¤–jª™ššÈ§¢¶:é©þ°Æ*ë¬N¦z(«“ºÚ)¨Eè*ꮿÒ*ì°ÄÎiëªD꫽æê,®Ð+í´Ôjy,œ»"¬¯Ïf[í·à†›äµœ.«-³Ü6û©²â¶ë®´äNa$»Þ6k¯®ïæ«/¼›Šl½æB‹ï¯¼îkðÁ—Æ»,»ë~z/Á#,ñÄŠ*LñŃkqÆwLëÆ‡,2¦ñ`òÉ(§¬òÊ,·ìòË0Ç,óÌ4×lóÍ8ç¬óÎ<÷ìóÏ,— ôÐDmôÑH'­ôÒLë,tÓPG-õÔTWm5ÕO_­õÖ\wíõ×Gg öØd—möÙS‹ÍrlWrÛhÇ-wÏpÏm÷Îj·ÌvþÊ{ßí÷ßk»Ý7à„¿œwà|»]øâv>8ã vÛ‚¿­øÉ}×ùæ\;~9ç…gùã°wé §Ž4åu{®zèýŠùç¤nºæ¯çµëºûý4ê–'|ïÄÍ{ñrÿn{âÌüó1³>úìÐÇ-úåµ3{õÜó|úòÝ=9峓»â¸‡¯¾Ìé¯ïõáîÇ/?÷ðÏoÿý¯×ÿþüîꛑžHÀð€L ÈÀ:ðŒ 'HÁ ZP‚ñŽ7ÈÁzðƒ ¡G ’ð„(L¡ WȺ5&|¡ gHÃÚð†%Œ]¿pÈÃúð‡þ@|a ƒHÄ"ñˆHlÍ“ÈÄ&:ñ‰*\"§HÅ*Z±6R¼¢·ÈÅ'f±‹` £oøÅ1šñŒhaÓÈÆ6º7k|£çHGÇèð©£÷HÇ8òñ€´¢IÈB"q†L¤"yˆÈE:ò‘-l$$'IÉÆë‚˜Ì¤&7ÉÉNzò“  %ïžJšò”)”$*WÉJ,’’C­Œ¥,y£ÊYÚR–µ¼¥.Q™Ë$¢l7'³Év©Ë, 5ÇdM2aL*ü’„Ãæ2gM"N35×DM6‰9Â%ó›Øt¦8µ)Îmª¦šÕa:q³ÎØ´“‡àœf<à NnžPŠÍþÄf;óùšf¢3ŸÁä§k~)Ïl>S›mL4º•!ô› =¨B:Ñu:Ôų̂9íéA|j´¡ïi2#:ч–´Ÿ#M§ESŠÐŠ–4¤ U&LÿéRg²ô¤6• Cw SŽrЛä ê8*ÔÆ¢úÄiDŸ©Ò‚&µ¥M­èFcJUdÞô¥NÍim–)Ï¢rÕ§Ý|å@P8L¤FU«h•)JŸŠU«öôœÛÔ¨?㺲‡¾¬Dìen–šV’âT­FekNCZÖ© ¶¥lõ+\ujX¼Q¯ìLéMiúWÀöõšŠ¥¬b׊ִ֕³“ÍlcëCÈ s®vM­De Дés¥s•þ,cÿyЀҶ©­]-ihÚÝú6½ý­pÅÜáw‹—¥r—ËÜæ:÷¹Ð}nqK]*N·ºØmâu³Ë]#n·»àýáwÃK^2Š5²‘Tk>µõÒ†½ªqocà[ÞÔ4 5ô¯§Ú+_Øä— ÿuÍ}ñÛ_ï÷ƒÎ "¬_þ2x½€p„ã;áú˜¿ ÎpÕëÞk¸Âž°‡3La_ØÄ^—~Ul_X¾ «pl,ãCx6ðƒÃ›àŸÆ ±dûøÄ6&1’lä"É(Ž2l–È^!ÿ7Ç5–²’í«å.—·ÇCÆp“ÇŒb&GÙÌ]Fóþ’‹|æ0kyÃlžñy§ä'cùÆ%.1œÓœåãÆøÅff0šÜæçwÐôUó“ÛLæKYͯ‰áž· å$Çf¿0¦´£»g[šÑ &´¨;MäJ¸Å‰ö´£á`×HºÏ”޵—YsdB›Ú𮱡Ùh7úÖ¿Îs¨y k%CÚÕs¾µ¬ïœÞ0ÿùÓÕ}¶°¡ æR¸Ñîs°-Ýkkã™ÌrÆ£¿ÆºfoϺÚyF7´ëkëGÚÃÄöv°'Íänc»Üo–ñ±•˜lTïz×^´ ½b]›Çv&øˆS èÈ:V¸ÃbOÜßð¶ø”û½›M#øà¸ænoþ[ýq‡¼ºã=¹ÊI˜Üèºüå0¹ÌgÞÉ”¯üæ´9Îw®Aóüç´ä8ЇNCŸýè³É"˜Y­m£šÂ&Ç5Áu[½êX³•že€»;êðÖúÏÃ~á=›]ß>»—ŽÆFîXݯtÔ¿ïkÛ½ÌuÇ;µ§F*Oýí]¼°½>ö¼ÏÛð¾N<—ç>E®‹ýÅ´<· ~ògÛ[ïw?¼¼ìtA ÝÔo|³+Íx„oþÞ™W<¨O=k.:~Ú°oýäcóËk>õ¨Ç|é½øù\ Xòþ³¬ÁkyÄçþö˜Ç»ÆûÞ{>§ø O;ôyNö«½ìhw·öþÞöÏxéxÓ›~ô¿³=ëGÿŠ#¿{í6ÿÛ)l?Òñêv¾—¼óóÿ­ÑóÏÕ´œæ€8€è\û×x€È ¸€ó×€xtC÷jø×lpwiæçoG~øb·pðõ}'E't&øx)vX6}Ñ&} ˜|íFu˦køf{©¦q˜¶‚§b1†C”‚´'{ëvqC8\r—}^6qÀvp8¸eâWn¶mÛ¶qâV(uÖƒéGƒÌ¶n9æ|Ü•„ðGzÚ§‚{—{&†hǧzûC(ƒ§glïæ‚Õ—†.ˆWÅGzs¨~uhqu…Q¸}ÙkÝFyhGþW¸C€öiUØ…Á‡¬—Ô%†fÈzøelk‰r(‡Q؃ûÖkLHA(~ö‡ŽwÎæfʆ„†¢wwƒ§ŠeÈ}kHˆñfˆ¶1Š«‡a„w„ÏWp'\yˆ¾è‰´˜|ùf‹dž(ƒ²˜toˆmhw‡®hn¾Çiš¸‰bvŒÎ¨ÖX†ÝhwTøŒ²aëŒêÇg‡6~׋ÙU‚Sè‡|·Ž¡˜kLÇ?Àd÷µ|V$èÕq͇H4rìˆB$g¼ô~8¶ )sV€Y‘y‘i@‘8·‘¹rù‘'’"‰k$Y’õEcF+‚öGw¯Hþ{ÜØ„1Y„3©Œfx“‘æC~ï5‡,I|úƒ+uág”HI”W6”‹¨”LYŽº¨¢:\ŽZªÞª¨zªºª‹tª®úX­«S:«´j¥¶z«Yš«ºÊ¥¼Ú«_ú«À*¦¤:¬%*¬ÆŠ¦Èš¬kº¬Ìê¦Åú¬¶«ÒêBÔZ­,t­ØEκ­~ڭި஄­äzJÚz®j4®êZEéÚ®9Ç®ð Eï:¯?%¯öê~暯¯Š¯üzHþú¯©º¯[Hñâ#›° ûº°û°Û°;±{#[±›±!r±Û±kû±";²MÑ©p²(›²*»²,Ûþ².û²0³2;³4[³6{³8›³:»³<Û³>û³@Û²ñâD´ýy´H›´i´äC[ QDK²T[µ!µP«Rû´Q;µVûµ`‹XÛµ\[@c¶DAÁ¶á¶j;i+g[[;g^;°·A’·qû4µS·ƒ+¸ s»·uÛ·eK·|Û·†{¸1¸o;YK¹’s;Š‹¶N‹·‚«¸‹+/~›¹.¹…{¹‘kº,±¹¢Ë¸ K ¹¬û¨{»«[»(áºË)Ÿ‹§¥;»¤›»º;¸û¶Ä[¼%‘¸½ë»«·ž›¼Ê;½5âº}q·À+½ÃK½ÜÛ#›{Øk²Úû½Ý[¾.B¾vû»âË$D;2îû¾\Ò¾K¢¾_"nA{¿ø›¿ú»¿üÛ¿þû¿Ì³k¾¶![À,²œÀ œ± ÜÀ ±2‚\Á|ÁœÁ¼ÁÜÁõ[°™Á$\Â&|Â#;PKcKyAÏýÃèÃè5Pictures/10000000000002EE000001AB4DDB7D54D46C4B2B.gifGIF87aî«÷‚¼‚ „>,B„ÊÜEDDÙÄwÄ9VQgD '5Êâ䇎•ÂKOz’©Šj„bI¥×$"tÄÆÄTe˜Ë©RdB4„F,„–h-.,åãÌ0 «Çªmdd§¦¨DŽÄDZ/ɤ‡üõÍ279¼×ÁÈÚÅ$B|jƒªãÕ»TF?©‹|tvt 1ß×¢ªN´j0ªÆÜD20Œ¢Äϳo„’¤‰U3DFNx¦t215äæä¨´¬Äˆ\ëõö,l¸\zTgUTnlm3ÜöüWKT$<ðÖ¨«Ì¤‚l|xx”~lÜËK=0¤¾¤h¬Ò¼½¼Š¼Ù‡[P\^\w›i4Dd<>D´ÐàÔ’<´V$ÌÎÌlœÈ\r–:ŒT^œÔ’L,î«þïÀ»#àÀ‚*4È0aÃ…#Bœø°¢D‹/jÌÈ£Ç;‚)²dÈ“$QšLÉr¥K•0[Æ|)³&Í›3sÚÔ‰s§Ïž@y†pg9F‘MÊt©S¥P›F}*µ*Õ«S³ZÕŠu«×®`¹Šý:6,Ù³fÓ–]‹–­Ú¶pßÊuK7nݹvóâÝ{·¯^¿|ÿ LpT*L‰€7‡ ãƒ7Œ,òäË)kÆl93gÉžCw štåÒ¨O«Þ,:5kÓ¯]^=;6íÖ·a×ÞÛ¶oÞº{—-¼xðãÄ‘çNÎ|¹ó߯›CW>]úðç׫;÷Ùƒâ;Tîþ¸σÀñãÅ“7=AôåÏ«Wï.~ûùðÙ»§o~ùéýw_€ëø^XŸ~ø!蟃 .h  (a‚N(àƒrØ_„Z¢‚#fˆá† VH¢Š&zÈ"Š"¾aŒθb¦ˆc‰0Þx¢-êøcŽ4É#=Y¤‹;ÊH¤Léä‘O* ¥Ž ”_yð Ä%<.Õ˜—-Df™f&Ô%Cgv™¦BkÔfœdÂù¦Atʉçh²©&Ÿnúi§ {Ú§žƒ"Z¨¢‡Ö¹¨£ê需æI©¡2š)¤›JÚ饚Zú'¦¢&Êi©zŠê¤£†Zé«þ¤Âêj¬´Îj멲âZ«®·ªš«¯»Ûë¥kÖI&wy·ØãÁ“Á³ÐF+í´ÔVkíµØf«í¶Üvëí·à†+î¸ä–kî¹è¦«îºì¶ëî»ðÆ+¯¼ÜITxâÍ«ï¾üöëï¿,ðÀlðÁg{Ðwsx™ðÃG,ñÄWlñÅëKÅÆwÌñTàñȃ À³$lò³]zæ@”ñÌ4×lóÍ8ç¬3ÍT@šdæÝfc?;t˜(û\ôGŸœ— sm TSMm ÕzŒ2Él ­×^wMÅÖ-oØ;§­öÚl·í6µ siÞÜ)F4xç7þAŠ=7wt³Ç·Óe¾Þ@ÒVmõÔYÏ-ÈÑ"-b(;Þµå”_®±åñfþöç ‡.úèã륛!fxèízy}wmÞ¨Ó®,ËܽÜ0wÓ*Žõ³¿O ¹µÃû=vñÃ'?vÇd7Ï<·^ÿ¼Øhm¶Ø[£ýõ¤wïý÷à‡_íî^²Wï@vw¹X™ee¯ßȃ7A´ „t)OÌ]^­xÁ›–ç¨5@Ä °k•C™æ29ÏQ.sÅÃÖh9 OZt—§ÁŠïƒ ¡mv8Ô+Y°À¸³Àqi}÷£‚–¢·ÞKº“šÿ°@á™mzþ äÈ<¹"r/ˆTÞµ¥D%xÇ3¥xÄZñŠXÌ¢¿ðÕ¬òjuê““›Z»1ÉÉv #úÄä°jñpqäåXÀNÎŽ™ûØíx¹’ˆ œ ¿æÁæQŽD¤ÉÈF:ò[TˆÓ…,?¨i-ä&ÃIЧ†©‹‰ö€ÿƒ÷ªAé ‘Š Dbå®WÈl5±Š³Œ#-¨ÄGúò—ÀôeÃLX¬ó ¥”êêó”±X´“_3»tÃ¥ Wƒ–ïGÈ;z3–‰Œe9—G\Ʊ\Þ›w9rbŽƒè ¦<çIOñ™Îu™þTÖݾä¥Å¼Ov,\_@9é4/ΔÚL\*}¶È½rr°”e£ø5iì€Ø2¢ñ<7Ä]N΢OL¢9ëIÒ’šôfäçœVP|’Ñiü+ÓùÊ;2¬L‰Û!OÊÓžúô§+áéˆ)ž¡‹}uZ$5™:¦ÞÐ~¤D(P§JÕªZ•`Tp ˆ „­v•[Õªb²ÊU¯šµ¬e« üV°¢Uʺfÿ®J׺Úõ®èr©^÷ª×gñŸ,ƒ*c„×Âö°ˆ}à¾cº6p hd%ÙÉZ¶²˜¥¬f/»ÙÌrö³ž mgG ZÒŠ¶´¨=­jMËÚÔ¶vµ®þ-lgûÚÚÊÖ¶´½­nsË[Üúv·¿í-p‡+Üâ÷¸ÄE®q“ËÜÙ&ƒ²É€lt+ÝêR÷ºÓÍ.t¡k]íB6©r½C2z0Þòr€¼ç…,z׫Þö¦÷½ì…¯{ãKßùÚW¾ø­o~ï«ßþò÷¿û ° à¸À&°‚¼à3øÁŽpƒ' a K¸Â¾°†-Ìá wxÃñ{Þ×Äã=±ŠSÌb»˜Ä)^ñ‹SüX›.&fÜ‘n‰Ë{bû¸Ç@þ±ƒLä!¹ÈH>²’“Ìä%;¹ÉP~²”£Lå)[¹ÊX¾²–³Ìå-{¹Ë`þ²˜ÃLæ1›¹Ìh>óþ‘üX»¹ÍpoœÝ܆;VÎxv3ÁkÆ·ÙÍ(>¯Šÿ¼ÞAÇX½†6q¡i|hA3Zш~t _LèH›¸Ò޾t£)½éDOÚÓ‹Ö4¤3 èP—ÚÒ§&5¦9=jVZÒ¦^5¨Q-kXÓºÓ¶V5®Eýj^Çzשvõ¯[=k];×¾õ±}­ì^»ØÉ6¶³kÍli{ÚÀ¦ö³‘ íns»ÎŸ®s{{ nrW²æN7º×gpó¸ÜèÆsl žI–[Ñè6w‰ëœoÊÚ9Ýúþw¿ÇÍïûûÜ?8¹Np†ïÛá7xÃþpŠGÜÄ /8Æ'.ñŠwüâG¸ÅþEþq’oÜã'yÆ!nò/|ä//yÌSÞò•Ã\ã.ǹÍe®sŽÓ|æ9g9Ðwþóž£<è7ºÑUîs¤ó\éPOºÔŸ>õ¢Gê2—îÂÎã?ƒ[Ñ`»Øý,é뙼Éá@ä]è¯ûXÐnï1Ü!-wŒÓݼvw1Þ®÷¶ßÝï}GtÜ÷>xÀyîGüáó¾x¾7¾ð‚ÿ{äÏø·W¾îŽ·|æ1yÅk¾ó—'¼ä=ÏùчÞðŸ7ýæEOùÕ£¾ô­½ë'ÿxÕËþö¶Ï}ìu_ûÝû¾÷ÀOýï…Odö®÷Þ$ìv¥»ü6ýÞuVþÖI<ïîYZ²¸áþ|xÑ›×ûè¿Ö#ÿ}¿—Ÿüá7úÑ?þ¹Ÿßýë‡ûíþ~úÇßþóŸ~þ˽¹‹¿Íì€ò'€øG€úg€ü‡€þ§~ýWøÈ€ è€ hˆ¨(X‚(‚H‚h‚8‚*8wîhGnøb*6ƒ‡¦gÈclV^¡;qwï%d‚vƒuo‹w~Ç÷o–g„êE„I¸~GÈuu§„çÅ„Qè„Kˆ„U8~O¨Ƨ…W…x'…ÓÇ]ƒ_È…ãæ…Sˆ…ah…k†ehyT؆j8†Eè†vØ„u8‡q8„l؇xLJih†oˆ†;Fˆþy˜…ˆ(ˆ‡(‡8ˆŽ‡è‡’؈”hˆ ˆh‰šX‰™_8ÈoÓw„¢(ŠÒ÷r2ÖbÛg|äŒeB¦(c7^ÞPƒ¢ˆƒö%cvÇçð‚Öb»dõ¥‹¨ˆ‹ðå Äx‹~Ö…2¨Œ,&_ÉÈ…ÃŒÅH^pbsFÎ8ii،Ҙ‹ÚøÐŽdØȸp18ƒÛ8ÞXŽàØŽÂøŽê(ŽÌ8î8ŽðhŒõcë(üHÝhñˆ©ù÷¸ø;–Ëx ™ŒÙIv÷×bZ·}¡˜}ZéÈ‘k&Œa^xb°<À& L@^€þbn÷‹‘ÕzÒ< ’  m“mÀ"‡Š ˆ^î–@}À¥¸€D9c1”å×”*Vg*™’,ÙOI“-øŒÕè‘5‰’Wpi2–Ø“ã6ƒ]©•3„xF ! ] À[9iΨ–²“[—•ؘ d™€™~R©wùŒuIŠL9Y}‡˜Q©˜™–†¹˜W8”ŽI˜8˜ËX˜v˜“™˜_i™”ù™™y™•9š¡É™kxš’™šž‰š¹™«YÆG“Ø(w¢8jÀˆh¬ønÿÆ…ó680S¾ˆgŠäVœpׂfxj|ç—ß—b|é—™iË™ 90 ϵÓþÅŠ0ț↜ôÕ—Ú'žÅ)ŒƒÑ†ð%ž¼‰7 0^£Pž_7•å”Ðõfìùˆ@v…b €‚ù‹á™gÞ)wò‰•ÏX^åyvIbùÙnz·ž*ž[)¡g¡QH?æ|jËÉ¡êbŠp!ú tÖ¡–6¢Í9 z¢%:¡†šƒ+:_& ¢2*¢J¢9z£<Ê¢*Z¡ç& ½©‘>ø£]i‡«¨‘s†vã‘CÜá„ßÉ^O‰œàÀÀ ÏÕwénw–~à9^İlPž1Y¦{P›?0 M áW XÊ  °‡“¼P Äp&Àu¸ þ)P|mÈ¡ ênU*í` Œj U &pZº††šhÉ刻=pÑm`§x “àP Î)SÀWš¥zjª8`&@ y›KúX ð ÉÀý —m §bÀ mx0Élʘ˜•Ò©ªs:^UZ çP ‚ɦrF^à&}ui¤]ªi·¹¦]‡­ÞZ£©è [ cßj­æš­[º­\*®èJ®Ü ¯Úxïz®õz©×Нíj¯lF¯ýª¯ë:®îú¯ü𮏍¦ìаåÚ­ñZ°áz®Yƒ¶h/Ø”ƒÇ¡µ*˜´z„y']iœqo@°Ê½€ º Ñþ ã`K*ƒÆ)g&û§Hp¬€•0 ­óÊo%& ãðˆ`nÐ,ÛãðÏu^9­Èp¬½`^ªà‰Š4ù‚ˆv È <ɵmPœ,ë²/0•‚÷gé8^/° Î ÔP@ùX@–XÉ“~©æ ,Ë0Pú´X© $* Y¤=€»ê €ðX` HË·1 ÆP†ΰ”uøV¹’‹‹´c«²P0PŸÕè¥êJ€Cúh5H ûf¶8H£Ǻ4Èž«‹ºgºÝ)j©kƒv»¹k»_zv\Ú†¿›Ž®;»¸[»ÂË»Èk|ÃÛº]—¼´¼Ì«¼ÒûºÑþ»¶‹…÷™‰%¦»¹iƒ¼yn¼‰vUña^¦èœáç“tY `l`óÇ|B¹b1)® ª³Ò¹¿Ì¾Ô~É í»Þ`Ș[0d©¾€éu¿õ‰¨2Û…>©—û[¥Éà¾là òë‚ÂØo[§´9p×àœ UŠ’ €à¾ÞðŠ+g$Ðe £è•q8L@Âféœ ÆÐÔ  V° ‚ pa×bÒ'ßÙÌÁœÂ ú¿›®(qkÅ{‡Åá§Å¦–oô«œ[¼qY¼¢WLÆ]lÆc pa¬£_œ ^Œj`œ¯ªûbs°uL¶e,Æo¼Çn,Çþp¬Æ}œÆ|,Ç+Æ„ Ù‚Kéx¨H¸Y¨n.w?û„‘åŠ÷R&“¨¿(¶µÉ`k°½PHs¨-Ö`1·<{vM ‡º@^ÄÚÉŸ¼É’Õ´ú›) u¿X[ŒÝKœZg¦«\œžL†Kƈz^JK uÐΙÐÀ¶\Ÿ@ V ÅÜcOI^É@ùrDªŠzÇÌA  =`ZÐIûÉð ÂÚ Ð5‹vÁÄ<Ë ºË¹ÚŸܘŸ¨Š\Ü‚[’z¼¢=³h Ð ÚË gÇN8Š <• }‹µýÏ ­…=Ñ¢lÐ Ñ-Ñ»Ñ}Ð]Ñ$íÑ&ÝþÑÍÑñ·öÐÁ(„Y~îæ|á,h¾ü¼ºØ†e"bâg»Éã†Áð}°Á!-„t÷& “´ð"pŹ¿\¦PˆÈvÉbÀb@­mð`À•±ÀÜ ¾èp*¹³:›ž 8}ˆz¿QÅ‘ÖbMÐp- î¦´Æxà—dg€Ö‚½³™ðÉx}úXpÀ<`ÕA­±ËØ(]¢pÔ:Y Ðm€ýy®óؘ1üÀ‘µÙñ¨0ip(j®¢Li¤ûh5i¹ÝÛ}Tì˱[~·ÍÛ¹û‘K³‰'gÃÍogÜõ{–ºýÛ·˜ÛɽÛÏþÝÛéçÜ0ÜpvÜÌÝÖMÜÍ­Ýн€ÝÜâ±y–‚›7Œ8›[:¸ÜX¿éÚÍB’13’oýH<Ñ ZŠÎç¼vc¹­ŒÐ¾Ú7nˆÑLºÓ7l±-ʤƙnÀ×>]Ô:®}9ármŸz·×‚‰gKk±ˆèÈ+¦„&Á.ž.Þ¡|Ìd _ÆÜÊ4Wˆ¾=áó5ãç]r6^Ý8.ãÍýã[xãvœãA^ä@ÎÝB~†DãCîãHþä0Îㆸã5ކ£8žVž½ß;¸¤[Žå&Ðê„ÅgŽÕ¨f¤ûê»2–ÐnÜâôËu1xµjú¿4xˆʰ5ÍwþþV—ìúÒ øçwé±™° Ñ{®º‹ü~íÝC&»>ЧèÞ´y“vl©©(Á N‡kIÚ ¹Ó§H îé9êÏWê¹꟞꤮¦¾®Îê§ë>ëËøêøçlœë¦¶ë¢.ë°ž—éKÉú„ýÝé¼ ×=~Ž…‘ÆgÉõ¶v^gì|ž¥}áÎÛ¤þFŒy¦¼áœéžŸ3ÖÈÊž˜×ÍÊ(>ÐÚ¡åpíÆJÍá4=ÁÁ>í£Ìí'j„·‹‰FjÌâ:é:Zîëh *¥!}ÜN¢Š\¿ Ïç‘Ìð¿¢ñ ¿Èÿ𯅤‹Ä·yñŸyèyð¯ñ"Ÿþñ!/ñ#òßÈðZÔÈwž›ß$›ßò®éZ>îã5’l¥r>Òí-¢ˆY…98Ÿå5“é»ñFŠ…5£ø©Ä&/±PÞœë}Õt‡x“x–†l‡Ú{‡ÌËá÷†M/¸“Í•1”¿â|Ý_«xç䣿<í Nðûƒ i“n÷s_Æq½÷iÜ÷gK÷‰.Ó¯–÷ñë†ß~ˆ_÷‡ëô ø‹?øúŽ÷Œ¯øŽŸø„ÿÅýóx¯oák»·Ä¹}™«Øƒ¥hÉûS_ªÓÝ>¡ wèxÞÛûßÅîÏ]ù,îæ,Ý÷Ö¤óï¡Ô•–Œ¨¹/Òq v½<ütþ¦æÄ»ìûLˆKýºÛæ&JÉÇuð,Ò÷ŒÉÌ­+ér.þhùûåoãþùMÆfÇþ êþ`ÿÕŠßÁžï„fÿ/þêþ‰ÿÑ£M²{lSð ‚ “1<( A„ {@táĈ-b,¨Q¢ÅŠA6ôøÐ`Bºè…j5ìûœ¿Ã¼¶Šæýí}õà·Uy‡G•l9³öªÕýû‹ßþ¤?ûíœÿþò—À t`ˆ@ ¦Ì{1aÉk.ç«í]ð]&{ ïs-´ÀÃwÐØèc¢åjz‹ÈN˜µ8˜\-Y¿kVw:ÕøqdÃFž½€$dXÛܺ6ºÕøŒW šì`§ÀTEFbéQ®È‚Ê­mÊMòXV½·•„4A‹Ž‹¶ä˜‹'Þó 'õÆšÄÑss ‘#G¡å±Ž{¼ci÷GܸÑ^äðI=Dƒläl ÉÍ8r‘z´äÏYÉÞlnnKƒX(3g¹ô…íl­ û^¨Ùn=7ÔÚTH½l1ÏWilNu@ÓH¦YKUÌB¦Ú<(+‡Ë—7;üPR*nz%kkcžh»â]b4Ãß-AÏõ]‡žo™gñäiO}ÖÓ5÷ô?·…O>3 ÿì'A:ЃÒ,¡Ýrå&ÃNe•…ƒPƒ ²S5’ [§Ê`[’‘±¡)wHÆ2Ò!‹e°Ô¥éX†JeÊR™ÆT0]©Me SšÞ´¥?½©KcÊÓ¡ÆÔ¦0ý)Qg:Sœ©,ÍiN…ŠÔ¥Bõ¨UEêS™úÒž¶4«Bõ©V›šÔŸÕ©I•Å<ø0¶²u­ouëðÈBÆâHFšO»™CÛ5þ2öaT4qb)ËÉÑÌaówT㛳·E«WþC˜®\7eÁÊ~‘½Ø³œe®ÚAÖ[’Õ,f-ëÙÊ>ö7ŸÍ¬q6 ZÕŠ6tË·€Õ?&†’h·Ñh–i±mæh–¹hLõÊ%Cs@nr•K…åιÎU.t™û\äN·ºÉ¥ns¯Këj׺ÏÍ®t·{]»Ùí.tÕ^ì’W½îunzÁ;^ì†7óÐntç0мvœÙ›Uºb'*Ö„²%qdåiäÂ-£…ÐvÛ¡§€9E9Ëö[DT­¼4c1Ɔ˜öÓð‡ýbeê†ÄÎɉ¥C—¸Ãʱ‰[ŒbþÃØÅº›Ø‹æX ˜œ ¤žÂNr*Y‰n˜¦4I!¤C¼@0/wé+ÞæJ¹¼ã¥.{é;_ýž÷½Ñ•ï—Û;e)§Ëå5sš¿^(·÷¹÷¥cÌ3g:냿 Ñ[`•øÅ‘0+˜Âó«ò³ÊêôPp0ë¬ ü:Ѝ™.§6™SKOþWÈ:¥¥'­ÉR^jlœ~­§q j'^šÒM“í¦3jÔœ:sÉj5©5ëUÃzl¾û™\›õÑþ R¢d‘0.ö˜ÚAÓÑ:i|”Ò1§ôÀÉú…6{Ûl^0ÏaÚɽö´Ûü]kwÙÍÎvx¹íj3wÛk†6r¡,nuþ÷Ý×vw¸» Ýk3· ø…ŒXôý}ðÁÏèS 0ž½Š/Ç©ö/«K2˜eö¹v—×.2=ÞçÒ\/ä’ãÜñøµ:"€«DÆ9 ºÆÜ1”åÇ6¨\¾¶rqÁœ+/Ÿùͱ¦òÚ¡ÐÃÄí¼Ô=R}Øœ• (=;o"JNSÚ° kÀÜ̵ºs0t½ëTð:u°õngÙÚæÖzÙÏ]²ÏíÚÆv{×­v·Ó»ënßzÛáþÜ6Ïãæ;yÿ¾öùÞïÖ•w᥻ŒyÄù&§±3yÚð„yÄbl¨qŠ7QpNdÇY#Ýx³žðþsÖÜKØ ËóážðÂ|×*؃õ±ðÃFæ,xÆ`àÍêÉÁ;DÂaŸYn½sà g Ç<b€•¿,ÈÌJÒ¼61•AgþþÜ(ÞFxË_c7çHþÉæÕ÷àO¿øw­ù7ŽRôdôHù»ëÅ„öuᢰ®ùP§¨äÚ:ðj»¬;¬c»y#»Àã¶çš@1Ûº¹«@z£¶ Ô@õj; äº D» $/³ã¶÷JÁä@/K¯eàƒ9º>ø”6è·x…(à¬Íê¨c‘¢’žÚjºÝ¢Y¢n biê+RÐÏ:í1¿×—Àþ¼ºQoðo°y™¦Þ{y(Ç  c°^bh`-TêK0d˜$tõ(¶3t)Â¥9¬¿~0›&=Ô-€éCgÙ­‹ùÁw¢r&($ºØS‹R!œç°]±®ø¬‘2¡šƒFi'»¸Á\@åºÀ¬ó:¼;­Ë;¬#»±³º ;²“ET¬®Täº LÅXDÅWTÀÌ;<Á`ì@£¶bô²õ¢²¼.(»¯9¨š èƒ àˆÈ³ƒP„&8ˆrø"˜‡{Hm$‚3˜ƒðm ~0G,h*á’ qÇ9 ‰?É“¡†˜‚`óèbþ¨‡ø"øhƒ# ?h‚X?ø€V€ ¡8‚¸Â˜X‡çk… 6€„ü€3 GF ‡$ ‰ƒƒ8„èÇ‚€6dÂSðƒ3pƒ6(rÉäè ÐGy°hˆrà‡„ÐÂŽì"°H°ˆ2ñ”ì9ú»#1,›$ºpªÔ5îÓ³£y£­šè¨­M £Ø‹–þ[%wJ¢Ž*=œHÁ€&ÁŠB¬á™¥ùŽt‡M<¡8.®›»,;½Óºm[Å´‹@YüE®cÌ[œ¶Y([ÌÉlLÊœÅdÌO\ÅÌÀaD;d4;Ь»À$Á3KÁ9¸·þ9à>ƒ €F¢ €yàú;† kH¹dàeøÆèJP›|–¼‡°‡âÔB¾ø»8 ælÎç\N*ø»é”ÎçdÎè¤Îè¼ÎêÄNîÊÎêÜNçtÎ褀8ë pN‚ð†3ø€yðƒqT ÐMþ$Qÿ¬‹ˆ3§›¨Éc¨‚‚ñ¹5ÒCß»ŽïéŒB\ëùþ¯Ó0€`ù0òYÂB%HDº aÉ"ˆQ2úpŠdx6 ERD;[”ÌOìÅ[äÅ6õºWœ®VDE EëêÌXüº[´À¬«L¬ÓÌ4ÆD¼3ûÀa¤;ÒLÆ`d.83 hMI•Ô‚ˆ¼ò̈õˆ*ÍO{P½Æ`BoPOõŒŒjZ‰J3ÄjBœÚ"ÒHûŠVE-ÉCO@QžèǬ h€…dhà€Þû- ‚a¦±˜ÕÙ Pˆ¸B†Öa-¹dxÂvPCì轨V×0Qd… 6ìr¸Qêã€nƒy¨kUC<3žP!†€‡|œ•è‚€|C‚è=€IÐŒŠòþì¥Å ùa±ú0‡£(ô9Ÿ"Ê–ƒ­£…k „E%xb؆1¸š³€v2&×€ à"hŒ]&žý!Å™ʈq”aŠi²Â\¯_\·¤¯¼»ÙÌ\ÌAµÀäº@¶ûÄA­ERTAÀŒÀ¡…L_lÌscAϤ6F…Úcü@Ò„AdiÌÚˆMdU‰b؃®ØMáìÝLvx†Ãµm s©ÄRØ ê'åëc í;‚Ÿhɶ ¾6Oàìê³ °‡Q¡‚@Q‹àB…(\´è=^ˆÐ‰Wp%°‡˜Õ¼ Иh‡‚‡'ØR³qÐþ6xK€Û³À[~a ˆ -ˆÊÝK…È\óë E”¸Ó; U=C;œÒ½Ó¿ §‰Ñ襒ÂσKo&€†‚… ÀØàe ‡ØX‘±µæX°Ühžb¸¦ð€¢‚£ðgÆëÅÔyë6^ìESÄ̯³_SÔ±Æü…@ÿ%TÊÁæEÅœ/.3AvTEU`µ+Í7Ã/¢™›KMI‹„+(‡XàF=øF ž¶V¥×)4ŽR³—”ý/4šú²¤)O}Ü\‹™´ƒ'‡n0Øb•ÄûHÉûØ\–„ ÖƒW¸ÉžÝëþâ¢p<~dÏyx†ˆðÔ8"ˆHøFr`OU ÅÝÛ6˜U•WË«¥W`BOM†]pS­‰ ]ÄÊ@#àÚJÝ3§»™3ê´¶ÔœþÒ¢Ù²k/ê3@ Ä@dˆxMHcˆ†ÍoØ€C`‡RèÅ€wà€J0 `›ÐdNæ ë-ˆìyh[pe[xp`RÎXß¹erAºðeƒ”£˜Y>•E ÜYaÅÊìÓ[dLü¥Å;íLZdEVE m@\tÀjÞLÄ”ÌT/§U;oV<Ñ4ÔFEFèJÍ;,ŒL\ØkÄÙ9˜T5ÂÜ‘š*V«Ñ¨¿þé'Í…bD¤•¶PQ3hDâW¯ý=Î å+ˆw²ÐÍ]gp™K—늅¦Už|¨\£çzâ.ãšûÃØs[ße´Ð)DžQ(ÏÈ;L½b2‘«A´ü3ÙyMp†dð…ÀX}ÃØddÈäM0‡6Ø„hhƒqxUN¨ÈéU6jØi¦N† ÎÏXH,X"sÄ )Ž9©”ú¶¾Ó¯sëæbtàrãÀ` L±–»'C·¸KT¡U®q>ÔÞ2µ.Ͱö@ä‚ÔÝ£ˆK¥hµ@ Ñ#¢!²([Iá¯ù™Øê¨Rš:nè¶ý­‰ø‡ÜÈ™QËu.Ï x® ѹŠÎ\þº•¥>¦Â–)ˆ õZAJË\Â?Äjè¶q.µTC,DV´ç1, ý¦šSžÙ¹ãRZ$ßÂåÁ)Â)|6ȸN†DØ‚y`剀QP¨…`o`Bë½”î=ëoóØØëfÕä"Ôë5¢„(À_¾ƒ&ûÌtƒ2x«;P”ßèªoü–_ûÞï·î6ÿÖïy;ëoÌv+go.çæfÑLð¨ý6çºZ} p §}¸ð ç¯2Þå)m‡âŒ) Óºd^9ž+mùž~5ì‰ ½M×b‰(Žl­Uˆ¢ O«™[м¥ãØ~Ÿƒé…ÃÜ ^\úõK®þ( †é×zFDg˜g'Ñ !,ê#÷q¬_¹¾Ò¡®¡‰xd †:hîd_ÍLV0+ Xƒr!ÙÔÈ^ñfs4O&h9:cº9Ö*°«Óq‡ :¶pß»þVôÿFðüö;1[ô¯ŽtH¿ôEot¸6Æv‹kOgà©/©½/µ2õ¶BuµÒVS‡«So«V_«S‡u·"Y—u¸Šu·bu]çõ;³õYßõXöVbÅ3^v[veÇõ ßÛbÏõWwu]Oöd_v!ÖGž”öfGönö]×ÜÓPW¯vrÿuog«Œ6`Š¢<»Üuò ù:Òþɬ.,—CÖAçT}-Is›)•17ÀƒNN(‚3àn`îLN†LXƒd…>(^¨±^±oƒ7ø6˜øŠW%½q¦ÄاôåM4 öåtfðCk t3N×ôæÚï.kŒô_p¨ õ›¯DuAj“@pe„2é3ÑÌ/5+ç`”¾6À/v‹¶©ÿ2Kü¢zJG/÷¢ÙèYUú1K·±3>àôlñc_Ƭ_k1“M?v-ëtwû2¤w¼ZUú2ó¶Ð³ì2û†Æ uÁ¸îº0¥!EßÂ"ü‹ÄGÕ:„ -'qxÿq0?Œ9“¿õ(åH˜þÞ‘çºÅåß½RQµ6Èj“’:ªÓÅÆä»V<ŪKÅTœ»»çe®ÌöUÆOÏÅfAXTëÀ¼Üu»õOï®à?³FÍ®¼¦3<ã7gçü¢³„¦³æÿœ3<³T>¨ug¬~<Ë>ëÏ>°P óˆ¼è‚ê/ÿõð/t¥Æ‰b¨Ÿƒð‡ó‹ðÇ|ü_ÿd¸Ôÿ*mæQIÆÁ`²„&d¨°á†úø$£„C;çÍièñ`„!#’ô˜pbÅ8=2nìx0"Äd#†L؆aD}óRbDØãM!{lCT&Ò7‡E*4©Ì¦+‚4jTéK‘‡‚”þ t¥Ó¡LE‚-;t«Ò£iÛtíYöªW§2WV©¤PŒj¥Š…:Õ.Û¹açr¼·mT°mÍJ\ìxw\¸3GòdéæÌÀ s¨|Ý™óiÏŸWfÝš4lÔTTö,ú5îÜ´[ß¾Mº5ïÕ±Ï]ü8näÄ/ÿÛ÷èÍE/ã3ç%Ñ‘Gu&Ó˜Œ£W¢T³ct+vü܃: ¯w+öŸðûŽœ’#y·úÉ‹5¿5™NmXd”wøÁw ]åñ÷Óv|°$SsœE×Cá¥Ç†´¡ÓƒZß{ˆiW˜W/q¨ÑA´d˜‚]õ7ŸaDQ0€@Lè×_þÿ­Ôƒ: uÖWw5&bŒp1ÆÔZŠ%Y\_ÁÅ—V;"¹Ø`9*#‹4ù¥aZhY¥–`*fZçýu¦`W5õ•rÁãÁDT6ÇîÜÁÁfÁFžñYÛo¢@Ú œÍÚ¡ªŸ³uÚi ék j)k~JZ›¦†r&ÚrÌy*j¨±‰š©ž*‡ª©£UÞ„ÎÈS{ Ý8!^qÝÊà¹èŽZÞ¯í[–°.>¥w*¤Ñ@ýZ˜]HËw(Ò*­]e¹%}2HJQÑkGg%e/ž…’E!¡hY["‰£šâî¤"Ué%¶T—â%Vfþ–Sy5$Ž?9f’_ÊUí½æaU^ûû¥²ë&%¢™]rIX¿j=üðyu±ùT®¯™TPÿ¾«‹áÂ#ewÙ›9ºÚmšö¬Úm§íÜ3j«©Ö¨¦ŽÎ¶s§¦¡vik~ ºiÓ¶±zuqÒ‡*פAꩦêémËÄðÊë9k ”ÿÉ«ckٗ̇c¸¦X"Ÿ5cHÖefQe9øL³’»R„Xö}W…ÒŒ8ÛÃÚé–Lc{‰‰Ø¬ÞIÇws|©Ý—¥O˜¹zóH~уl‰ìc7æ¹w÷Rh%_€Ù¾n¬í²ÌTMênavs5yyæeÜðéfZ¬þ×Ê­<:ÅcòËCÞªæŽx»­¤ãf:œT‹wúrZ†s2Ë|æµ¢ží]mOª'j}¨թ-¿Ÿ,E¨?õé}ï;Úÿ X¨‰MU£ ØLÁOqm‚^3ý$ˆ5ÎÈÂWŽIÊŒÚ`³^IËb+ÙÀÄ Â2hîr©3xtÅôaePaTlE-lÑ(tK‰‘Èê20Ç鋞+йŒW&<ã¨VV°“–l $#9›®ðBŸe-k%ÍJ¢Eze£z%(‹ºÒ€vR»ÃÕ*-Û‘Hز<¤4+ï±ÒÄÔ²;À%&+WÑP”–„FÑg‡Öóö„òÇ‘%þ‰,)#ÃüR>1u+dH ØS†–ßÁ.1d²ÞR¬B¥iÑ’²Sͨð¦ÌÈ¢~Ÿù¦œ#¿û¹’hBë šv@àLŠ—³ìå/i3(aÒï9À± ØRÕœ­!ƒ]»Ú1ç,R2u­K×LŒ"á^ðÁ2bQºz Ý 9PC,à ^¨‚8É G·œDu¡#Ä„ç6O¦h_å #¬²Ù&Ø K`ÂÆ )û@뚃|áÊ'ÚÄ¡/#̱.锆‘%‘¾|§·61´¢[9žB„že¤cË…K[ÚÒ—²4¦.…)Le Óšît¦-Å)K{ÊÓ›þ´þ¨1Í)O:T¥útJTæòØÈQ²^1;)à^g#ñÑ’C={dŒº1ª;fÔG§™µÏ€Ì é7L 0j„º+ÔvWÿé jżÔoæÚ×ÀPQÊtf—Y*¸Fs±ŠÕØL5M—À rûº½~Ä1Ìà Ðh)@@᪠JH¸1™”!ž­>DKZq‘³RíY,€®ä‰ʸXç̦"¸A6ä ß6ŽZi쎴J…ÓÊηËòK!§âÞe]Ùm%GôÜÉ!Q$1ssÅ«Çf]¤zÞrJæ~'‹6´a õ¥/}í{_ýê¿þýåï}Ü_üx¿þ%pLà/˜¾ËxcÌòæ=Ûòe¤pT–2ê‘JQâ½Ðs$!Ò󽔌;j„UâÉ•ø“Mü(¥Û_þ5jš‚ÔҒƿڲ¤T¢"õ¿Ÿ&™Ž…l1/øØÄ^MkÁQòÕÒA/ Ïd=‰CV\@%,qˆCAôy0aIUžÇ}$„,Dh™ËÉ3èÄLæn½k'èüJhôa]Á0΄…S]í"tžd0¹Kø,˜²Ñ}x$|Óˆ¼62]øZ8  Ÿ—(ÄQᶤ‹”¶ôQ:¸q©D@*Q€š#†^€ X´³Ñ‡ÍC8ˆÞ®}Kþ(lœ#$—¸þµ¯{­ë^ûÚ9Ã>ÕdQ%ïq)y9ä?£j¤Ái‘‹#ó2m–Q’5ÚZ%¤Ž™Ö9Eš1àØ€½Á§»™»&¶1/XLúMÐAUþåÈ®;™Ði,’‹W;v¨®Ê„ §’³õ‹³[ q;ÂÃ}Œ¸(¢Úª b0€ø` ‰‹Ü ¸ƒÅóõ“ÛRÓ »õxs‹‚ÝÖÅœ—Mѹj…”2Ø!(-<ôA%Z-` .F"˜—UPoPn¥¯”@N °2²œÞç-t_Ò®è $K?«ZŒ ¼*š=Á9Ï`ZþF‚MWcSÐkt—7]ýÍ|ï;7@àwop“Ž;¶Úe¥V·žú!B,<Üëd’~¥I<Æú©WºdS&9>œ¥’Å:ƒÔ׊) Èó¾wÑFOA՞رA}¯a¯zÑ;ð™ ÛûåÃYàÕI×ã£båN'¥ ^è²Ø&ž ”ŠÏ½'ZŒ3˜fàŒ5ø 3,¡$–ƒî Äæ ÚmÙƒ¸PÙ q@ [ªÛÀóäêã±¥€¼O2¤XÅÊc £ß R Àœò¬‰mÑH¼‘L™VN ÌaUïÈDäNE\6y[ sISpH1ÚôþŒõpA¤C„Þë1«h X½‘ 4-SîÇ2„¸àÍöÄÊ$)ãRÜŒY]$^óHÝHé…™L[´Á*©ÕÌd†ûøZ½Å^¾Mßmá¼å¼^àe ½Þšár‘áî-îiPïÕRÁ«HHô EÔ…>$ƒÄñ’Ä­Äð¢9—>(Q8 qùaðu0‡õq@!"K õVLàP ŸÍXŸ×HÎ…€$—‰™hÁœ€"xµ…>\‚¹¢å‘Ià'‚⮌"å´„ÉRð¢,΢ñPÎ}GuþX£,Z¼”ËZÅXUÅÛ„Üu!“…Jª|c‚# 2Ù3µF:ì“1›ôàÑдiNÈ\ÕˆL‹ uÛá=†ã„L N=àõd„dAe¬œà ¿•Šê¥[ê½Û¡^CŽ£–£À­¡ º Á1– ¦!bI¤1%™¾åÆüuʼn¬Xˆ´˜5‡òµA:¤—SÌM%Jª¤õÑõ¥ \׆„~ÌTƒùAå @AB ÀМ£Z]Y2è€ĘxAxª°AzY–UT„DB QžåQeS*I?…%„\ªYOY¢Zž¥Z>þ" Ÿn׎•Y%`BÁ]žÌ†x:"‹>" }(Ûí=V Öž®áºÉeÎ`²‰'Å´‘˜Êà]Þå ‹µÌ“b:Ld&Bd^g‚ÏxÑuRÔ <ÔÌZ™ÛêVÀá†aýí]M¡T¤©–Øì&’9Ùž|dcœþ 9ÖÛAbd“½!gL:Fv„PˆÀ€7xƒw€°-Y#ø¥™S0Á–}Yr€!ÂÔ•U±¼_Y¼x¡Ÿìç~ºƒø§@ö{¥fY\B,ÁÌd%<¤Ã-D‡Jô@¼Ÿ,@H|QŠð%†ú'ò'€þÎç\(ÎE‹Fqh~(ˆz€@ºÚÍe º`›A´A‡ªh²èÖ¹E"†e!õ‹TÛ_Ä6'é]3gí©áíÉ  Âü&Q‹ùŒgâˆE]ñÖþµÍ•(Òµí‘é´‰dÀƒú¨RA~^ÔpM±ñ¯ÖañÌ®õ “>æ+ñšîÅ©i\dt®ÊEº¡ÞMÓtÑ£eA×aÜÉ—…'x²Áx‚ÎxAÌ¥=a'X°ç›QAŒ†ÄM\r¡€\\µœG°É™_p€Q~¨‡îg30—QP„¬HO„Á3P5ÏÃŽÎÛl’X5ç‘[åÉý Ð@Š`aJjŒìnچɚì¡0MŒEŠͦ€ É–£¬ÈÊ,Õ,‘&çbJ½)éռʤ¥cO؇tqÜ‚Q|Y –Á—%èT(ÄPÎNô€žbJr€À‚ÄýÝ—Q—U((¥V Ì‚€ŒÁì@ÜÎþíÜî€ÐùQ SÀPŽ_:€Àh¼Ù„ D:”Á|¾¿XÑÆAÅÚÊmÝÂ-ÝÞmB—@„%|ˆЭä­äZîò„¶ð G˜¦¥}î䊮èÞ-ódš÷L®ÈD:ŒCtÄÌÁ&DrBæGÞ`6ÓsÚž4eÞ·VâQÊD„Ú8¨‚ 4Téu¥£ aR;ÊNTðN|Á ô OŠ ¤çq Žé¬ÍaÉX¤8Mj< pTÒTMÌÖ¢ä•+ÉoJüÍðÊ›¾úédâ©Ùô¥Êèe@YÚ<,RL­JD(—Q€ ë–Êäþ2A'ƒ˜AO­°ÀèƒXWaêtåÖ´(À‚Ì0 ×°îS ˆXZK …­‚ZxÂp¬ä-0Þ …á´²ö‡Ê° Ûð„Èjë­VÄðCñÖifIÎ*:%g1 [.b”‡ÒðB)#x ÃwÉC;ØÂÌqH0,4pF¨¼2A‰‚ ÀÂ;Ä xƒ L„ °7ð+7ÊaÀJg JæoÈBs1š×ó6OÞD Q5BdB4ÈeÛÙMj^ž f•’ðèԘŒÛú°Õm§n9Š 8ÊÈþËæÛ\MÍ£óÉòþ\yÊoºo-½Ø0a  °`õ•\µ ÃáÞÀMd5ãø0®éÜJ0èW®â2l±¬ì åxA„0 è€Aè€|'œóVÕG¥.Zxn‹F ‹qƒIvU1Ä(€ v„{’ÆxBaOÕH†Æ(=ưÔpFÓpÏxý“ÀÊuaô oôF AGwWv¹%v’Uñ§ôzùF€ ˜L¥!C2$À/$ÂL€2œbQo± JÔ–mFèj(ð–@!ÌA’ºáª('t6PDžFo÷xز  Ö\¸uEÈDàÀþÀ È‘QàÀMÓ‚†T‚ l+p@7œÃMGX£Õceåóo5šÅf*UØ +¹Ø\Vý<öü Gý¼ï¤Ü/ÌJ¶õ1dór¥ü/fïi§0¾º©5“a¼]3ýPg,Ó‘¹BŸÚ²h¡€éáÁCÌ"Þfšõ°ÁÇ}§Øx‚§n老íMÖNYM@äâÔAF,\7vÃÂbm«0‚‰ÊbÄ ø^>`O+3¡ÚÖÁ [wd·vÃÖR´Gµ4}[š{£4,Äw_÷y3·[ÞwºDáKó·|Ï7Tæêp(’(7@C2ŒƒoU8‡JÅ|þñ±—À $S7¨‚ìPÂ|§̆‡ŠêkªLпæ)ؤÃ;OÜ8ìÛ%ÙQr(4#Tä@+ôÄïrÀ8¼@O¿ƒK?Dñä7aRWŒ‡!-¯•¢[£ Ö£ðr`%.MsÈÐ]¹2S £À—SÐ¥”,˜óU4ùýjnÚéŸ/iª))Æ€2âP›h}Öý‰K)^qÖ¥4%i´D+Äõ .zÔ]ú1š{iWÀÊÁ<¸ c:(šÝx)ñY±†YZ­·ºªGþ–Ë [šL$À4$1uµ³Åò.H‚!ÔhpP1ôCÑ$À;Ðy#oF‚;×€u¸)!aOŒ[pØÀ¼‘tÅq@[÷\» ´CˆC2ÔÂ8²XÚ0ˆH‰m©bŠ®˜NÑI©`t¬F¤ïü¤¹ýhù0 °p€ý³l˜G|ÿ`|fß›1/ ÓŠ¤ Êÿ–¬Ïv$Ÿf5 ~c]ÇÃt…¬ú xó@;ÁƒÌŒÈ‚XЉYü… ð€,ä<ÎÃÃÎ÷ü¥yo…„-‡¾0^6E wôh~PçLšE0£Ì¹Ãª~¨@Ž<4Ávƒš‘·::xÃþBJ ËV„^„s}¸ý‡¯“®ÛßCÁšÒýcnÁ‚å^½fæ­GE p‡:l€ǃƒ[Zã#T†Ë«*Ôk5$S;|çpÆ(þõaƒ#ôàÞŠ·xœo¸søŠ õ¼æÁ·ò­@†ø5„@)GC_$Ä Ô&¬X$-TÕæX¡Œ*|àXÅz¬¹åIZ拵i2ñÒ‹ƒ¤óï«jó¼9GôמG.$öw£%?S^¤kQNA}R€lCKWî–nÙˉN¯ƒ†7¸@K¹€ €¨ù?@pè‘l` óÚô˜7'!‚ªÌa‡°Hþ°b‚úøŒã•6 )öØ€ÂCKw.[6@EŸ§‰= VìÑFÂ;TRÂeÇ‚ &Ã8QàN§왬$ÁŸÉ"uJê@#˜âLØ£ÔyTMöøyrNʤ‘^»‘®GºS…VL©µàÑ­¹RL×f9…¦rØðâ9Ž'nü˜2åÅ—-GÆœ™ódĘ{¾\E,ξ=Žý›”î_¨¨z, ¸lŒ£Á¦4ÕL°1‘„à“>l¼q8r®Ø|׬WïÓÀ:wÂæª÷œ-©ÙcÍÄsJ¦'‡øh 0ˆæŠN©› ëèÆ«Ô¢"™“R !˜l’I°âÐ…özËÆyŠ´ÊÈy€êŠ«œ¼"1.킚‡ƒ;†¢j( ¯³.̤T‹®Ì3Ì’KÚìŠ*LÚ¶ª 3‰”ÍKÆì*'kÁͤb²Í u03Ç"³G¥L¿ejË­>ßêJ+ŠfôB­ÔÓJéàn¹4RGíÙÇê8*¼;æ€Çƒ;8HÇ\›õòþÓÝZYdžZLkðÜÌA›ÝÆ&Ô<³ -­¬t²#̼²erl;ú†ÜrZSõ4¥¶1½×VÄJÇŸývkÕÀx÷éƒp¼d’{Æ}m±zjC¨„žpêFLã9Zú--…ç›6Øf5>©ƒ¬'wíï†O“.;JMŒ’’üé¤P #ÈAÔ„üõ©mÔqE–ÐŽ‚B—鬠qQ.Sžs]: È*Pñ­M¼Š“ÌÐÖ6–¥Ê"‚ÒNôØ÷)£Y$ã“U¡t‡ªOÕmŠ»ƒ°à‘8ò$Y®SÐä*×:Ö} ?éòZ%´Ä'qƒWKþâÁÅ5°¹î‚ ª†ˆÈëèCTÉ<Òä%·…Êo^9ÉvU=¬øÏ/µ*lðF*áDarYÀTèÀñ]ÉŒA9#ö¦¤‰ØkÄ{[í¤æ¡:M6Ž$œ›z@³„ü„(5cÍÊ.Ù*;n$hØ‹Ãu¶·À•L…2«^I~C6^Ya8˜D'²î‰»lçx©t˜Š`”Ü ¦AIíKÈ|¯Z•Ê·Lš‚»4ÿæ@n‡mÉðÎ6îŠV¤bæºèžHEhu˜“â:á9Å`fJuU„¢.1X ­-c^ÈâŠÙ‚Ò¿ôÉVŸBᛀg&áÅÐrƒ&þHu–-D¹e›VH ”ñz6£hÃCºµ½ÞÿØ´*L’ W´! Bò¢¦…¦*…µ¤—C ¿˜V…¢Ël©Ü"7ã™T«tSŠØ6&YuZ£b¥œOtN0PåŒ,êØ2º¥°mª1U«Nˆ”²Ñ(®òÔAmÅ«¨Á-Ÿ`7U Í ùPXˆë<ÂøT{–kŠéÔ+>} EMÕ2€ug>¶sf±‰œ™ƒ,ŠBªÆÝŽbñR ’úÖšñS+í¤ Y§ê€v*DAä6cÆÂ–¬vècW½_Õ : ¡IäÙ¶:Å(.Ó_Åæg€‘©!#¼h½þ*B3ŠHR”7­×1OÅšW¦;ʤUPõ׃e¤£ Ûín:–Qîn7¼Þ5ïxÑû]õž÷»é=oyÝ ÞïÂw½òe/yõZTrm#¥¦ž°“Ô·Š¿6måQÒ]5Ì‘ÓËÎô’qWð¸#q‹3O³Æ×)bÑ©[œ§±¶ÔyЃ æë‰)ˆO`JÊœ†ñf âÏ~ -w²µNܣ̩ÌTP#lnWUȼôùE¨žÂ16Ëô¿”}¨¥ÜáúPx¥,dK“dãièÖë0ï*Õ‘¡ ×¦Ïé'AJìJµ'ï¥6[£1ÁÊÂPy¤)ØA«ÒLƒç2LYúñ:G5(ã–ÎŽ}îÆÈ êxÔ0öîoاïŠG¥|¤¸äª}ÞÌTŠËÑXjCŽ€àÆ#¯lÅ~)9 ÕPu<óoƒJ­#÷êžë䈋Æf`bfüö'“â¥i¬¤÷iHå&q²÷Â!Z5pR'/*(m’Uþç'›ke‚)õb”R(“dJ‚$ÒD)æy|Ò(­d)¥2-Èî qÏ'}' §)sñ*rR,£²'©%ë&K*Mª¢,·2'É2,2&Õ¤˜Üš–ªžÒÑræQ0¿ORü*Y†ŽùBò0@h6„J›’ïJîi¦Ç* Á@ªnŒé÷\$«îÇõZiÒÜ­3 gåîêÂL kÞIÕ¶¯æ@’æ8×.#l†Žú0²Öѯ%‰`GGÃ%9‚'¥NÒ0µÐ†þ¬šš)˘9é¢'Án#¶ªnþŒ9S¢:ì9-ÂíÎÌR : -ø°“Hˆ„ S¨ ›Ó 6â¤PÆ B¥þ,áXƒH†QšØj;M¸éLÄQ‡jd´ÃA¶¨Š˜¯?ƒ632°üt–AËŒ‰Ñà‚­,“!7“ȪYj 7·®N2Ghb:“eè*<&’"µk0Oòç0ŸASò"}Î6é#‹Ä†—\´$ùðsh2Ñ4`0,p¿ñeñ‹T "eQôH/‘ ¸ÑI”IoqÝ.¦Iƒ‘‡ÔOÆb8II™‰´/ÐC¬QJÏTJ+ñüZ(´TKÑ4N»³ÁŽ“•– ç¬OèÒ‘èžOŠ€ŽÄ„~ªº€Œ›žIßjh:3 Ê C,&B鲫ΰ Ei¶ÎÎ þâ›gî æÃ±S#?ì5Ë$1 OmŽd-FÑ# ²€svªbЗØQlò Kn†@e° ¤Ä.C¡EäˆÐ£Aô£C¼‘¸ZT=°¤>³§X5H/Pïzr$kZ³e8ÈvÄÕX»oçBb}êÉŒL0ª¦èñ"·&ž“TÓ¥Aw Ÿ“¥f¯ï­d­4*?Ù¦¥vêÊÏÈÄŽÆöbcD%’"ñªˆvôUktUë10¹FOï•è ëœps\Q¬5«¯B&ɺB¹P‚+ïr)ÕÒ.©´b–-m÷h–+Iz–Uþ‚ò*oRh•ëJÛ)‡Vf—6,ƒ&a)fu’+Ÿò)›V*g’$ÆMfÇ’i•v,—¦ÚM0f'§V-»–+ÙÒV#ÖRÕ0Qqdw35GV7»FÕX´r3ëæ&DÖB U6`pûàÙ2ËÞ¤éëT‚`xÀ’ ,u†|PâD³ÛÊ"wHÑ$l復qNöTW³èJ6°þ4dS̓ÚI#õpn§ª$ T±æ 7‘ë-˜N{œ³:%+>‰†z@ˆ•ÜÎ0¿°ó þLÈ:ÑÎ9ŸËšÚŒl¨¶Œ”LІ¼äh¯âè˜óz¯ó:}÷:#±Nè‡:›óz}7;_vþ&Ïõf’s#ÜÓzs0¯mx`Š ¿¼*‚CX® .À fŠòv¯æ‚tu7v˜õÍnÏ3_%ò`  a Haø¶V¸ê!@…D7 _›î>ïæS~EqêjÆãåÅrn”cqT?RTk3‡WSu±ïA ˜ÃD,‡Ç5ü ^0i¡,â 6Qw ÆüÖE2”d¢Í7‹iñM †}©ŒëžÆ,«Ø Á-~¶³iZ乜x}ž§”<Š&EhŠÛR`ŸVÜJNšl]Êü`‰V€¤5Œé/3Ð $`6!ƒ¡JçtEdóvUþ«1áíºªmÛÞ :¶‡„•JÁaD™À 6ÀBÚ!’Á6ö :4Â#nä¡•ß lAj*Á6€¶˜¸†oai‹Qçðp¨àsÝYóT5c çì–_9ÈždSE…Õ$UtUO÷°ôÃ0z3Þ<âOÞxP^H!_Oì”Í%õSo%í´ykf¥ö o^ãJÌxl›ÎšBD#€/¿H¸dj^ªÃ¸î3zv¢vˆñCèLÀ,ÎÊfâ²rÄ€"ÔàV ^_‰w†TŽ`76‚ r"@+Â`r@ 怘 0&:À=4 ¼á¼Á¦a`Àþ¼ ¸™û¨H±>Ö‰K¶(s7Bj*ØPIð€@ j¼B’!‘{ á"â¡ ø™D4fG®_°z"´z^@÷ôsµÄêm²îøìª"kxOu›¯¨Ox#ç6$«]3Añ:×ÖõRFƒÉó »´l©"x Ä@ A|¼ÁI¢™øK¬÷4ë9¶~â :ÇJ;¹‚¨p cøb+˜àîa:;À b87 ¿¬-{!a#HåR~Žî!=N= …º³|Ke®yËÂVkd`’ !âàÖ0J`ªaL æÈ`bZ2r@(C ¹þ aÑU {°UçéÔ~˜•*Î.:j¹`žš"jaÃb _¼¢Ž\›)ö_’ῑ¯rìܰWW%åÂI™S3Ú Aí)TQr¯ qA¥*’´cS֜ԑŸÚMa+ËNèÈ:—@À |ÀbÊ`Œý.¶PD UNy‡o¡ç ×H8ݬ*Ð Ñ8€ ì€ –€ 2YË*KɶŒp #mL¤Œ;yª~Öù¢)ºFnd—ì]úFí¬†˜ç¤ÚB”øÙÐÌ&4d໩ Tš^»7Àw6àºX  X (a¼Át€ @¥Kþr@VïºÄf—¡(¬úK–d&d@ ôa ºÁ+Ú ¨dΩdÖ@–A9,^$0N=¶”",`Õý3g¼Î‚ päšSéš$K<’ذ•’S2_ÿ05éV%ù*‚kNV¹­³lpØB æÁÔo ÔïnÁ ˜ ÎÆð³'MÌg]Ð@NÜ 'n‚`ÆÛܘl‡ 'Dàâ€'–áÝ…‚Tפ¶W(DÐí`»¸ì"©ÊÊ5À:÷ïiWF^„·•8bÝwÅ·‚áÿfšû¹£à– XúºçÀ¾[91bš? ƒ¥©Àú2@ ê‡‡Úc{5÷ÔPþ…©¹ð ʲ·€ Ôaø¡–¹‚DžàÏ `'¨$‚ b™·f™¿†„«ž’Þ–¾ØˆÙm¬«ã4ë˜IÑU¯Š¸‚úÚç6Ü®ëuÓ¾ìß>E›*Ö ôSûƒ,$íÖwœO\€–` 8 â`(ôæAÊÇ)„¼PæwŠf·ì.x…ÏJ~Ç…²[x&a`Š|m‡’˜à€` æOro0Ò®ѧ·¥sà ?×Ý‚¨ˆ1vPÿo j!¡BöÇù:rEc¦¾ë"Ê\gλØ€âa'Dº!Hz £T! Ø[Â;>Úá§Ka1¾ `ÁæÎ!þ8â~æÕuç©8%bé9ŒjŒ‹V€5ÍÞºxæë´<Ì(zââ„ nb"‡6wày àΜ;à%[6‡Êœˆ%Z¬8ñ¢Æ9@0nì¸Q¢Ç‘;RI2åFŠ,Crl™QåK—"WÒŒYçHŽËæÍ˜¬G C9è㓌>Û-3 ©X] Ï“¡=8p¨o^²dMråÚ¦€q‚rp´GÚ¢AÃŽõI4í[¡É@i»Wn[mùʵ{‡Ê[¥L—ÆM&ÂNúôQ À¬0ZÃr‹"Vœ”J¼_ÏæPEóã®AëÎã8­ÒÑsœ åº7mZþÔ€ÍÂíœì(l*Acã ÜzàWÞD[›îñùyó¡Î«/ksqâD”&µsÇóäΛ.aº4I~¢,ß^z%Úùí\³gç.z6mPÝÈ;µÿ[€¬m¶ßY¦µœú½GWWõýF`ÝáBB@ÀϤ#LÝ•^N9™"FèÅ$“‡Úe7bz'ŠX"‰,½Hb‹à¡d#ˆsT1hÕÜ<ÇÇœ•á =Xd€ÅG2 0qßcˆÅA‘½÷ÞZ¡&†-×PW ¤eƒqí=…@„ øVXÃGiC•!YúÜ¡<úø@%~É©yÔÅÑFþ{1è_xàf|ÎÑuTR@È¥T£s èpoMZi„ºA'cŠö¸&|kªE©jt•él§Î){E-ƒÂKÛ±¤]‡Ù­H¬N5¢hcJ‚—¬DépVæ\é'Ô|m0ø£¯ny)®^Zà¸5ˆÜ[ Šm~·­VÚ·½eÐ)ÄC¹˜Ž2Á8“Né["‹ýö ð‰ÊФïMù+žÀ61ËR:Ž~ûÞ™Œ•õ–D胓ÞDDE=,±•ÎíemÓéçe(.+AGaýVZÇ f΃9!f\bö£ÅŽ]ì#H¶„>KÀC>^€p:ƒ¹Z©ŠÌþyþ´YSƒé<Ÿ ®]ˆœT dqhP_O*¶¬åšMܪŸ–)Ø×a )µ¨†F&¹j{]LúvD£‰Áv‡’Œ‡§˜ÞyŠS±L^r9çÞ«§öè´®>Êî}Ôr[-_÷%¸Ú‚ÔúÝmé{%·-¨U^>†Ï¶o(#Œ9Æè»¿¾?ùðÂã[Œ#lìÃß0²Š3»Lšê¶fgbdq-” ,ÇEÞ`•hÉò&¶W¾Ud`óµ ;ñ‡bÁ›‘uæöÎ@X'sì­P}©ÐL׃ðAQ=ÐZ2Ò” ø:‚¢Ó|Ð/Œ„ bšO_“þ˜¡Üa)iBŽ_ pªp€¯Õúf¶ùDA8ƒ‚ S(ÀÊ…A¯{¡ÈÚ@4´°Ì†),"t*¸¬o„Á»’¸¡%ï`æIØHh$95+`)YÆ„Ø%È6«»Mƒ÷Ÿ¶‹.Ò*ж®-mµÇ+cD£±)C±&^óÂîàŽpèFãXô@ä°c bYä×Hˆ=.z…܉ÁÒS<‘H¬6 ÒKP„ÆâìEhC€`€ñ¯IlˆRà!¦Òu&e¤!Âá²ùå2›Ì…b—P¾n0pGØŒyÌf0½áŠÅ@s6Ú°ì#+ˆÓàá þpDd=8e2ÐçÆ¿E³[[Ý¨Ž‰NdÆ s†©™ö†ÊéÀ Å [1•ÎYŠ%„€;Ϋà†LcŸÓú ݦãFý”Q(…kœŽ²ãP`‰d`Ä{ä!g$ICŠ(³K#çÂ8 Îí'\$“HKÞh¥4¤|1‹W3Ò‚†Š† -ÐèÎb» Ñë¼ ^E§°Nzˆªô°H¢Ä=L©…,Ï%›Zɇ5'<ú 1 ÉÐHûa‚† Ä†T¦2¬­l ¼Ð–Ñ-F,ž Î4ð‡¸ÊU ì8Õ—”×è¯3 @íYOw4£-?‹¥o²W7íùäuaxt¼`Aþ4 Wé(°¼®N Ô^ { ¥þ@ê ì`¹DPjj{ê‹; Øc¦œUÔz„.×Ú³´²- µ8;umÖŒ"m¯ö%<¤Ft©Cý"§(Õì<ëŒôaLKóÒ®¨UTÞzÎàHg ØmîŽm­¶Pwºp.ÈR¯ô€¼pçÇ =äW6Ѝ¹èS¨®dy„,ªó wßü>7£µâç 1%h@W"%Ê¡0ÁC _øÂ %‘-a à,ïߘbÕë@«\C‘‰ž¥+Hw)Z_fá„Ǹ2ŽqF&§µtªÕš§öGÍ‚xÁ éÐæ¦DfÜþ  2Ã^ª†¶5÷á¬p­\c+ÃÂ~\1ÛR†aW©¥dž±™mŒc—vùÉ‹Y iV*cùÊ5¾q“ל”ÿ•†A™ó`d±Œe¤cUt¡}èCZЄNG¢ýhGzÒˆ–4¢)iK+º é°t£5­iF_窛©€Ÿt½N¡ò›mNg›ßÔ¥ý \SM±ý€n@Ù*<„…¸CCéxÞ5z싪ÙTüi}¡«“IE¦$…ÊìŠV“×ÊgXÛšÌc p«¸¹a}è@³²Îë[X¥.–Á5LpU‚ àg³¬¯­’‚€þ p\þu 쀽.owvSv#SnÐ ÝÀ19eÿ®¬á#-×`€‹à[V£»ß©X#!°/#ø¿ÓÜ®“sœHÜöMÈ[>ð4¯z­š—BŸ3+ºäq¦å2c\ìC\:o¢¡½)¤‡”Žtä kVÝm›Fh(ÞWé¬{¿–q.JG—,;Gº¹°NZ¬:Ðc×™aÃC§Tø£½ˆÊEŒ2rýªäžýß½?.'×Fîë÷¨*[G›$ÊpýÄfV™+LðB–°C6°¡ —OÚ2d…»èÏÔ­1aPâ/Ù”A™RÙ^ào!|à/¸P`lÇÿ-1þ‹‰C<€K$‚ÆN2Â2¯¹é[tK ï›ÂRDàß³øì ®Ú Åbh3Ž(/%}êË^äWóµ\8xúó,á¿õÇ_þ8B‡Ãi#´fçuþ–l›á5kÄØ6jB»–9²{–-+•:äRÛr?j'æâ¢ÃkøXRØÕ*²$ ¹Gá²9îÑ54ô2wÁ–!Ä–<\TmŽÔlË9Í=ù•H[dH–\ÈæwŒ„² Ü€'÷`3ôÀR±a—wy(°Ôš%.c‘(öDÀ&8ð%ç²Yõ@@N cH†‡c¬¹÷þ~ÒY‰µ5Ð Ð àÚ¡7ùô+é@¸uSô©¹–pþ˜ {ø¢"”öãø:úÚ”š¥{ŠH^Ñ“¤æ7¥–[î ‹÷y¨+“–‚±h€oGº ¼à çP o± &@‡P‹Ù…¯~“¥­£.¥Æ®þ–¸e²¾v–¶óg5˃½Ãw>{QRõTDƒÿŽqù³Ø˜³Úh7Õk½AbˆµË%dW° &Ю™ž¢tN«}a?ýé…D˜p§È-^'óD›‚‘ŸB¯Í¾:#¢i:»*E#€vù©qçjw3uâÕ.Þ2ʹ)ó bìTžtŒø y Ô‰¦óRéBC]é‰ùÆôj7•-"(‚“;‚÷ Ÿ|±ÂŠËNßùxg7’ èmÉ—˜ ãðæÅ½z$”ˆŠøêx­C[•ùqÂŒm@q‹T0ËÒ¼ IˆQø•m8‹xUlEH½‘`uþÂV3¸CH¤bÖˆØgÀdÉ!zxÑj•ZG#èHñ{Z×°˜zRŠJ“Á™'_{»Õ¥›}QrXW3Të¸Õq· 9¤Ýâ€$£èw6½‰Ïáj¦r°VC¢ÑÉþé:Zç§ ºX§^p”})¹tí{°F©Ç#Õ7¥¬rD§»+ŒòÔ¨0ðûa  ‚&`´à•`À É€ç€ÌÂÈjsxkœ1°±©Á6!žŠIË‹³mvù<ѵÅÇË0s‰‚Ði§¹¡²>£'Áž˜q%¥‰³a7åbžœÜCœ¯g7ÊÝm÷Âk\!þ*NÐ$Ès.í@¡5”l׊)™ÂO\¥A=Ãc„Ô<¦ðak´–¹‡Òv¯HÈ Œ3ÍjÝã·<ÔR@gyÀœpcA LÐàÔ"ŠÕb¤þ?§ŽlvNu!ü²ó²3 B{`Eå8x7ÅE+çe×Ô¶0§ qYƒ6ë‚tN›´ÿýßbàdsË5hɶ-}¸mF( –œ³àûœ“V𻳥fµÔ§Æ]änÑ|ŠR$ýùQ·Ljd¦6ÚÖe¹œ¬G\?Héƒ F ǧÉNžÔ‘ù‡“¿¨‹A÷É›¶?ù¹­cºÆ=¦ˆ}RJ™¬¡¨|ŒÔ² e€eÀ&à€ªy&°™( }VÐ|}`H䢸€ëº>Þ»l#´;é€8Ðæ³{®çë}  šßǶï:8=‘äÅn>×u ´Ûöþ™þÝ\¢Ð=°LºøÒ&K+b¶¼[¬A! ¯A¾Õ]×EkØK¸ÐGÃzòïAZÅ)ÛŠZÀxʵ9Ùo¸Û´EQ(ÔK4sÿ\â>îNf[Ëê/S‚ó×¥l”Fÿ±7Ÿó,Эm°Ÿ>±ýg= ÙnAâÿí„ù±`ûÓÕüE9]ÞŽœäg!wœªæª ×£j³ô<]¬xsn¡û®Å&ÎqnƒúRUì±"êm~ bŠøú¡ŠÏŽˆïø…íí¸¡ê¡jùŒOù´DÏŽ™ùœßø±M4‰ù‹oúžÏ¡©Ró ¦ø•/ù¥ÿù®þ¿Á5·›ú¤ÿú­ïø•‘éN1ú•úÁoú‰ï¦x«î´ÞB±È‹ŽæâÒØè…9^ɯ- < òŽ ºÓ]>)?üQ¶AŠ (DýÚÉtÖ©¯b‚:u!iÉ!ςų,æü¼{I¼mþ‚ø^ªÏƳwËæQéÑ#‡d "Ô7¯  ÉæÍÛ2q‹'bĸQcÇ R̨1dG&=ªLÖFAF1Wr4‰QAÇŠîé¡“ŠÄ›07v Z²¦ÇŽÉ(Ä1±GE£*-Ò<ŠÒd;?9@l³±(R°B§Ž·¬?…¦\Õ*ȇLöhSð Ý‚þ ¶A«m²½ëÆ{°îàž„ïæµ[7ï]À‘ þµ[Ùn_½“ñê|ørfÈ…98žÜùqßÈsMkVL¹e` ÿ¢E¼÷ äπ窞«¹2dʈ…sþ[w®gÇ·ïÀó@À9wîxè‘nÎ*صk¢=û÷íà½__þzwóÙÃo゙ûxøèÉÏo/^}}øêíÏ_/ŽüôþO¿óæ3ï½9Ò™gŽÐP+ˆ‚y”¢¢Ûº­¥Èn3H!9,­4 51Ä/¤ÐB3¤ð GLíB×’°¬Ã8Ü0¼pCÕx”¡¥þÒqÅ„tä-CÕ`LÈ)¥ÎJÈ®"{þ”,¡‹lÑÊ´[jé´òH•äÒ'“r4ÐÒ¤k±ã63íÍÂÖ\ȶ4ùzÓ¸ÕNÜ0Nû°6Åû-9?‡ËÌÍ=+³ÐÄ#tÊ6+kS·@• ÏÌí-PB›´Gx–sá9*<€¬¿Y5>þ<ð>[}•@Ô5;WyµVÍËuÖ_÷ À](MÅÚhh«;(  Zj§•öZk£•V[m­ÍvÛk¹ýÖ[r«w\qË ÷Ûj»m·Z'Ù×\jÅ•ÎÛvçý©‡mÓí[yÿõw[­èUwàuþwÚ ± àv·\‚^üŒ8Ñ {”ÒŒþ9fÍMŒ‘³,6É"dÚ>öË/Ó05s³ž@^-µ?3½lQ‹›ì3ÒÌ„óÑ>…Ífšõ ¯ÁŽÎ éåš#u¹;’YæWÿõ•ØcƒåoX]“•5>÷¸Æz<±ÙKv½UóSYWÔ®Š)ÐGî¹ëÖçî-8‚нûæûï8€(¿ãø»ðÃßÛp* ÷ûqÄO¼qÊ)|pÆ%?ÜqË/hñÎ%gÜñÁ÷ Å)Gèo¾Koíz’cütc<Ÿª=Ý<Ô—1e`µ¸ÉE¾u¤¯©#÷ŠÈ\BŠ«,] $«NÅš³ÛìJÛêI• ÕSŒšDUId‚•P”T+»Ú=¨Bv3}M7?ošV¬õKsîàœ† e•gý¼¹Ï–]*·nýPPñWØfÒå–žnЊœM 4¯ÜcÖ>ë´´1´!-el%•Mž…ïcŸD.9©§NÞúSP…j¢bæœ×|t%å=©Û§R–Ï¿Ý'1+Ô÷Bqd”h6«TÞL¹HºÓþê&ÏwÉqJtRö;.}}`åÞ¦|g5%œøºÇJ5thàÝž_,Û–f1‘’gƒqÖ¦ çu“§ºOKYªROBK HGÙ\Q¶µ 4Ο(™zÕ—ófÜ-$m—fÕÕÌ¢ Ŭгøä¿VR™7~MdP:>…ªz}‘ 9TšIó I «*_ƒYÁ>ê”mÆsõàZ´”AòȆŠ-WSYaž²5je)0ï Ïï6v’Cq™íšd.'yN§¦™gÛY˜]l±[¦”\¯â:ÿ‘œF±]‰ü=LŸU¦Í½qf±*è>×Ñ·®ŒN¨žt(ëY¦•rb‘jTÎv×49Îpþi* iê9Ò¹•Lg¤ŽãPàঢhvò/ßë™öò ºåÛž(L½ú)Z¯¥ è=)2Ûmefk)o÷m˜¦àÛhvÏHï“¥ŒÉ¬ô`ÑÞ=•OzWÞv6 |NZ³[MÈ)ôôœkâ÷ÅȆé‹ÿ7¿‰JsµoUî5\æü63ž’ÔªË6Ûð[·NªN%„çüx´±+ æñyœÁ f¨MhÙç·*eJ%5ôô¬W—{Êžšþâ.”qp¼Ã ¹ÀÃ5àÆ3£à»¦²hçŽÚœ}­ªppübP©¨{|ij&>¿w€‚Íe—KWi7Ý÷þþvæÜ¤íLòÎ"Íù|=È{X²mWËuÛôʲ»µ˜±¯Å‚&3rõ}´e&×Ýä‹R›1^í¬ƒ>k¨D2œÍ &¹ÐHãÏÞÄò€Ï‰N,£m@£}ÿ41){` ÉPîsùÞ›-esx8à›Œ"JÑxÀ±†‡ÞÞøBÅ6ÞŽz7¨I^x^"»¿‚&.˳gÑC‚·O.ÿŠe\ÿžâµ6tÒÏ>Žé‘3®ñ9¥uÛ £Û7‹;Ð3²:« ãb+.2°L½eÛ·ðS0ÿÃ`½Åð¼a+1zã/¹j->‰8H£ªÑ¸‘Š8 ‘¿æj>Fá­‡£Àk‹þ.šáú‹l1y°hð ä;‚Ÿcƒ0€ ~H†OprÀƒ@ºdІ387(m‡u©|y˜{ñ.äÂj!C/C†ù/±–d€HE°hv؃'$H«kƒqð‡dø" ‡V0+ÄB-ìÂh1C ÃqaD/Ì—2\DtáHœ—sÉE¬FtÄiyD…±DEÌ.üG¬Ä|Á—å E1üBJ´Ä‡aE4l—QôDSLÄ/œDX¤ÅƒAEi™E‘DH´y™–QœENŒEkáÄJDCtéDKŒÄr¡—-|ÆKTFb¼DvaÄ€™EpáÆH´a4ÅmþñÆa|d ÇflÆT—\LC„h¥œó©ƒ€âI†qhpðƒ ¤ãÐËûÀ}þO,5B;/zÑ ÝÏ µÑO2EC‹H xÌ »ŸåÔBÀäKH^P†#°Í Â€D>0È*å‘q@ºt2?§‡ë“(Ó‹¬¸'¼8S½°˜ìÓ>€l ƒL\h†RH0…‘±Ç"%©b®p¯ê ·|+‹»ª².cc®?Õ¯Eõ÷ƒ0·rTI¥@ô:7„Ò™êb+NUÃ93¶ Tû³¸ó™Ôý©Sµ8UKÕ4;8f 92Å'›¾e’ª8ËT‚Ú°Ny³/°Dí'½C$¸«”l@‹Ó ˜ÀÐAМÑŒ"å‰Ãpyˆ…y¨$L†n0,ÐR¤þ+È8?°QP‚Œðƒ3€Dñ¿ÃSþ;UFK³H)ÒSûž-q °‡aŒ¬Kqm€'PȾ~혇ïL†8ƒ`W¤²ú¹žÄ‹¬Ñš'Ûû¦;C@ÄÂÿ˶ô:‘9«‘-/’Ú¬”Š5’ë69Ù.T⤼““‘½À;ÐZ)K¯¹¬™=ÖÙÃAYµE»½ì!­© fú²N22Ké$%Û-UÂ¥b]Á®:»š=1­êYxb°O+ÔH‹.õ’>Úó™Û{¹«Bš-¡‹#¥‚$¥­È¿Ò‡¸ŸW]´³˜BÒ˜ÁÆ:“uc©d¥U iDe$"á þêIÜÄB{6cÊLƒ¯2‰­ùJ&Ñ"°É —ò<ŽËÚt4÷ú÷aU°«¬þ«ª”U3 »5 ¬PZÛ8AUͲXÖ£[º Ÿä‚-3§nj“Ó%¼U“»U*£·ÞmŒ!.×ú‘ÕØKõÜ.³Ôô¸àµèJQÜ\8 «sÛ@ñé¨yÇτߚŒ´]¤”ñ"ˆ…VÐÜÔ;A¥M,»¥)Ã{_S-5=¨"] V3N£ó3Ý\‹ò.ÒϽ@)&ʧ)ú=ø•Z¤=|_N¶÷39öŠZ׊¬ºBš»:&·â¶v]²? ¸ Ä6Ñ0² ¬Üµ{³Ø¨ÙFuטªþþ0X“ÀtšÝÛÛÕ³S\IË)^:“’‘ã°¿êOåŢВY ´Ù-Ö~²¼PSVbàú±S¹À}¿ T/þLÞ…š¼ØÕ-½ÍDå³n ’ ÕB*8ŸÑP\RÒ·láŒ]©Â¿¿Ë$£ñ[úÕ¶émTÚp>&/ÊÕÛo+Pçú<‹Tb½ÕˆR.¼[¬þ.US:»ë¼×B~ê8GÞb$¶1øQ1Î Z;#ÕT*Ù8{0K+Ó*“Øu dÛp:ƒãØàà§}ŠT±•^ ¸½…K±V‘¬X¨á)º3Õ "V½C¦Ý”!±èâ³3›í’µŒc¥}Q'ÓþÈßÊk4O›,¾M]I¼ŽÝ Ùzê3Ä­‰+T¢:£R¦Ç‹ØM=%]¨OS,I£.C1Ÿ˜MŸ?b(–!1±CQJ¶1QF©ÄÂ)*¬@£*œ*¿”{µÇ°fßD䓺XߪË´ˆ]¶šyÁI2>•‚;*+]èqþ:@N ªš[½,1ˆ]‹Gw."­~¹¹¡ ®› öi¢þé¢j»‘¤¾¢fê¦öé¡fj£žê¦jd]ã;ÁaŒì¯þj°k±k².k³>k´Nkµ>ë®öjíë Xk¹žkº®k»>ë·öjõ€ë»îk¿þkÀ€½Ökþì ë¸lÄNlÅëÂìÆëÃ^캞¼ŒÍã d’à1c–ލi 8Œ§¦»9jªmªvj©Nm¡†‚Ô¦Ö^ê§mÙFj£ÖÇØ‰® 5mƒ xlÉþmàVkýpk*ßöêÈnå^î±.ìÂîêã€äfnê^îç.nè.nÈ®nîfî·În¾îî²–ÚŒsÙÈ\º¸éÊé;0<ˆÙm(mÔvjúvêùNêÐnmûFíü¦€¨Ö®m}øïúfj,ÆjCNÀ˜€¶oOì¶îêÿê¸ÂÖnÇÖðïp³†î9pìíÆð ÿêïðp/ëë0î_þqÈ&ñÏðŸqgqã.nkÏë/qå†(Æ%®™RãÁ(æf YrÛȰï/pývíÕž›×þé&7í×öé+—m(rú¦ê)×r.GV¦àÜšæíè¦q4'ëÆ^ñèÞñwëÇñ8Oówqçæpälwî9§óñ;ëgs9¿q?pð&tAlEWôàÞ¤® ª@‰Ó8S„¸éWM¥ˆƒ¹¯êþ>j0Wm¢Îo§Sí/‡mQ/õ.¯,> eKÖ¹ØñC¿u°vqñïÞÇuDsÏq ßð_öîcv°îmò0öfWvñ›dþöë`ö½®ðGG±ˆlwõ¸Žé÷Îìâ= 3_ž`ˆÑÞò-Ÿ¯Ž÷wÿrx_uÓNí)¯r,grÔ†wgj1wQ-䉖€vj?ô5Çq<—î¯æ\gø„gîDïógx_x‰Ÿxåæó=ox‡€ö ö@çxïžó3?ì‘wö’îë ±’q>ð#Kï-Ñt%*ð) 1øžÖ²p €SgêT¿|¯oS/ð¨¾oW?ê£Gú þé/ày4Íÿ0y·ùlv­îññÏø°?ó±Gì¼vlgëqó´ùµ—ð7Ïv²Žû ¿{µOìɈþƒ@‹×jˆÐHÛ)Þ½žòµ¦x[ŸžwÇ€©×ï¥ÎwOïw(üR—ê¿ò¦×w»Éò»! xu ¾ùé®{e?}ÔÇuÕ_ý[o}×§sØïN£‹1ÙÁ üõÙmxý逇ÛîL¦öê¡/~¹ky'zâŸw¦Gþ|—ïç?íÓvòÊu¤ÎoÖîte½Xä4ˆÙ}ÿ~ðOqñ/ópôgnt“ˆ·-1 }àƒ) \ñEü^CæºØ Ú þäz€Ð§ @¨P_Á )@9(p E‰'N¤€Q¢F‰#j¼ØQ#ÉÉ8Üb²G–+{Ü¡’Œå„š6þoâÌ©s'Ïž> *¨–¡F"MªTi¡¥NŸBJT*ÕªV½Š´‡™]MΛ³²Í†²'Mê›g’C˜2MÞ瀔w<À;™ŒÂÛ6$I1b`À"N8±aE(':æ¨/2äg”ìñ`Û½T¾ºäš¬ ß–É&L­:5êÕ®[»^ ;vÁÙ´mߦ­÷kݬ}ÿÎ[6ðÚŇï.ypßÌ›ë~¾ü8õêέ_Ž=;÷èÛsk/ÞûxòÝÁ—w=ÓåÌ6ód²í³Ă>kõñ™ÙžBÑqï¸P×qÁ³RJ¢ æA‘ĘBAÛ_—´‘þGUtÙd%ÈàE­ÄßZ-™ÖVL'µ!ŠÊ­˜^l-ž÷"‹ßõF#q.ÖcŽ:ÞÈcr8öhžCÊdè¹c’Gi¤qN>é#tK¦V¢WÉ„e}e•%Zó°E"_úÁsÇtÁ3‡;f¶ÁVi3IVe†u”C‡)&XG”E6Òd–iöe~Z¤áœm´ybgkí×ßL0Rù£”QN:”ÒYZ)¦")¥‚ªd“žfª©LŠšê¨¡¢Úª«S®Êª¤¤–*+¬±®våXaéµA¯z¥•Œ~(}vÒkÓú‰hfy$Œ‚E-´w.8af ¶áfÝ^˜þ!‡Ed +µ–[m¥xê­ªÎjë»ñâúê¼÷~*o­õÚ»/¼ôþ›oÀþÌ©¾ì®À+¼0Àýü°ÄÀ–~¢ñ1ǰÂêå,˜¡)šL™g —.È–@‘©æ§nwb«`j€þ¹Ñœš]4'Í>ûEzQ„Åèš«ÂM±ÃøFÌtÓKCuÒJOÍtÕOcõÕZ7,uÛ~=ã¥b›ªp{¢µÅëРÁ9°EÃUf²Tà•WWÍî%.f™éÉ­ßšiËá³ò}H|‹Táʆè([êšøÖiaS^)×cWNëÕ`cÞ9©[oNöçÊ]^¶çú–®yæž¾þ¤Ÿ{s”Ø:~ÍÓW¤©4»ÉtÝ1Çȶýƒ•Õl¡ñÄc4è¶{úÙÍ„x͘Ý{b ýèê C™:÷§óKuסoÏp÷äƒ?°×é›o9ú¦«î[Çh¿w‚d˜)p±gmÌôßÜxÝa-)ˆ6Ô<Á$‚ˈ⠷-qAp\‹Óиú6Áõ(Šh(ëËûFw¾ò! „ýÅÇ>¥y/|VëZ Û?Ôuð{ñÓÍzJäžỹ8Ô!q¸…yã,'Á›\H¦,¹˜«3sX"æÐÄ&:‘‰Q|¢©Å9AŠQÌâ—ÈE/jŠ\´b˸D3~‹eZþZò•¯xæ+˜"ëhÇ;â1„È#ûèÇ?öqŽ€$! ):C"2‘ŠTß"WãåŠgL#кà ðPšÌäÑm-Tˆ€@…Rž²”¤<%+M¹JTÂ’”¥tå,SÙÊYᕦÄå.{ K^ær–º”%+Õƒà]Äj éÌggМ&5íØÌjbó™×Ì&7¹ÍEnÌ% ÐØhô"¬®ì¥vìr‹~vW ˜é¤‚i¨`ÏQÚ3÷Ì'>wYLVâÓž%på=õ „â¡U¨@ šP‚2Ô”÷Ü%B©ÀЯÀÃz+±˜ˆø÷Ín‚ôÒ )I¡þùÑ’¢´Ž'M)K-7M!¢-c]A§Åf¬¯¦X=(Ó&´¦¼´d€£$ó@£q§²âÂÆ¶ô «W}(oW¹U‡âS·SݪRQ©OÞî–¸õgUJÜ­n°†D#1A€ëb7»×DqL›þï¼à owËkÞ½ž×7âM¯nÖ œñºW½Ê‰o{çËÞØÀ÷¾®Éï{õ»_ÿª†¿òí/€¿[`˜†ŒrIXܨ«ÎÜt-¥K\’5 2}eL] ¨C{y\ã*u¹ÿtîˆ%zÜwª®TM1SÓÊS6W¢=Ëà8»Û…’%ÖÕ.¹›à¹¾&ï…ŒÞ"Ó†¾I¶/’ÿ;d%/¹É«°‘«leü™ÈA޲”œe(;¹ËÞ2—¯œ+¶u%,CKæÕ²žd Ðð€'^Õ¥:Õ¢ͪCõ9Pâ5©Ž(¡‹âTäÃTH´ž_ŒT…š 4DÛ_YyÜãþ/?™Édó¦W3R3sºÌ¢u¨±œi1Ô^>u§§ÌêV§šÔ¥žµ«_-ëZú T¾uA’¹Ö>¸Døã1ÉS ÿç+1eWªÊàzժ媉_<Ô~ÚòÑÕBAZªt¸0>e˜ÆÄžÇ«/;¶4v}œk]Ûš×ðFõ¼ün-«:ÖòÆ÷¾ùmê{ƒ×ï¸À÷½ëç[ß´^5½ Îð„ûáòf£Ôt©O]ÁkÆÒWÙ† ·¡ oþOØ—c›”meEŸ­rZŠx©]1Jéâ]~»«‰îvR¹í}¢,w/1 &ÜŸ`Ø•<ОuM_~ÈIçz×Áîõ¯+¼óžýÖ9úÑ“ô¥÷ºÖUïúƒ³óa:À¬LeICK~„ØxøˆÌFôx^"÷“óyÄ~®åT“ï[~VĻԧÍkN\šõå¶T1,G©lz¾™mÜ1å-t¥S=õ­ïæ?¯uØ«_ö¦_}üéýzËÏ>óµo¸ücŸþÓ£ÀüèÇ{tL‰þÚ1KÄMOõNݘ¢p€Œñ“ô9VÑ]ÜÁsÙ’ó)£!ÕÀU±Ø¡)×TIRœ„©„Žý\»áßü¹ÞýÙûÅ ÿñ_ þŸÒ`îí!úù`Ê` ÝÒ­Ó°dÌFáϹMM™[ÐÈÛ,ÛLD_¸½Øq=ómaò šòݶWõÕœáuXlè“ÎÆõ=™ä™ß Öß ¡½áÒÂ_î!Ò¡Îàûõ_¡ûé¡ÞaÂ…_g4ØXœ…áÇ%ŲUX]Й°a2äSŸ‘XÚ V p…ØB¹ÍRà‰à*¢"ôAUþ+qêÇÙ°“ ²å_¢öaj´_ê)"/&b/Ú!1£ ®_12c2â`¢Zh(¡XÀºðÚ}_{Ð–ï” Ð´`nm ³‰ãÞT8?Ý]1¡>­ß©õÑ\jœ£ ²à…ß^TbN»í"":£!."m£ £?â3¤2¢ þâb3$@"cD2$p #ÂÎFéJã©“W\!J\bš@àLˆÈIp ô‘"(žV5÷%ßD](ZWõ“)¢AÁÍ✺ñXùmW ¢/.$0¥C6dA"äDêE:$R¤12åCþcEê`4ŠK¨þØþÎ5n¥[˜^ÌÅ;U!KL'6¶i!A-∥¥Z†¡ZÉ}"9~Ge$AÒöÀ`À_f`æx faþ%x¦a"fb&a2&`djeX˜]†Áa»p顪F•"jyzé¢NS£:ª3Aj] ½‡¤ IªSÍ„\Äh<ýæãtÕ¨V ^›n^[vb¶Áþ¸‡ý(,¢c÷aÛ~@)o¾ÄMj¤*’¢ò*{þ*—îj°Ò°Ú‘ºxÅëÜã¢ÐÎ#Ý¢¦©O•I›àãJ´Æ¥rÑ%ˆý‡ÜM†X~«¬),ªB}‰àKÀÙ¹< cõUxÁë¼Òk½RVjØ+Z½Õå«]D¿6¾¬^lÀþk¿¾j,Á¬Àæ+Ã"¬Ã>ìt4ìÁìÅblÆjìÆr×›…é¹ÄŽƒÓ¶S± ^ÌÍp*œ%)rØÊiaÞñ©U xkr.Wu¦ªrÒ¤­îžjÅÄwöcq×xq©^í’íQÒþÓâšÓ>m!-%ì þÔ2ÖÖ›Ön­ÔN×N-±&’±ÖÚØÎë +wš)IŽ&Ñ€¬‰í­IHÕKž«ÊÜ ½c‚ DQÛ@íퟡ;öž¡j>’1­ÓL…Ü -­Øz×~!P.¼]î[].ym®æú‘L@çZ­|eîèÖWç†îçš®äÒÙÒQ¥ ðI#„ñÛ”¥™x@²ÁÈÈgIr:Ò$®‡a ös•`¸ª%¢.ªº˜ñ‚›'ÞêGBÒošDŠ<.éDuoÍ ÷~›ø†/ørïøš/ùžoùÚ×[­ïû’ï”Yîy®k¬/é*ÇýNnA¨oüâïjþXQw¥îùpjø/ææï#0ÿ.Zã¯þ~¯ׯkˆ¯Ø÷/ø’nð¡¯nÜo/p(pqpp c)4eêZ,ázh$K˜iÑèN´öβp_ªd:®$à¾"Ÿªâ‡¡áÉyë(UAi_@ÉÜŽBš³2Õˆ”Uø¢ïŒï·ÕWÀI±c1S±g1w±1‡ñ›1k±c™Œ1Ã1‡×üèÅ/øº¯Çñ.Y×Ü˱æRQ3(rx òp’…n/š¯qøRñ!û1!O2/0q$kðäŽqCò%ãqùVpñï%»Øþw5ò7p§r¿ñG2Ÿð'r,—1uo!Ûq+²%»4QÜW<âEºDZ¨ëºô²`b1)K|bDžûÝj¨Ø·¥e·9+¦â¦·rV¸š’É–k•äøXM±×$?2+orãó>Ë3ÿ¾ó#Ûs@»3QÊò$»2ù¢ò[ñs=4–òAk0B3œøÎòƒoBŸrÍé±?/Ù=£2E34GÃÛCës?gñª™tHŸtGGtJK´áó)3püb´Gç³HsM4EËsL3°k4*µ"k4C¯1Dëóùú´ UãíŠXœ­Sþ˜\ÌŒšVáÝgKr áÉ£+vߟ%9..Ÿ ^óžá8Ÿ¡Z³äLèFî‡N¹MO²ëµïµ÷õ_óu`ûµ`6“`ö`Ÿïݱ)“ò×\raKpO¶c³/)G¶ßµcß²ÏÕ#3^´Wqb°B{öj+¶øæ±Ÿ6i6µs÷BviÿòeÛ2hgôkö¿rfò 'òiËôc0rSv÷µm[4 G 5yìZÌàš™i6Æ €`"Yï†mŸª²¢áus©ºâqæ6×íÈÉ#6Ç7k³ŒÅwL¶W€Åylȸ[pþ«ôJc™M¸@/t€—´Q÷tO_ô;#õ>'8Aôƒ«tM#x„ÿ³j,õK×O8{YƒZxƒÿ·ISô5L·´QtC“×þ´Š»Ú€_tDwxŠ·øPã´B§¸O õDwrEŸxLówH_¸+µ‚úøM¯ÓÊ49«id ®¾íÄNŸéçP«¹£·ú[³cß¡<*Úq%ZŒùpá2Z<o®yÿ¬Ë g¹ öåø–2'_që9ãònû¹ïyA¿²CúA‹r¢2ts³Ïö&9&:‹¹2 Cº–é¶¢z£ëµqw²— ÷Ž·¿¶szþ¦–n³Xžÿyg/r^›6lÿñ¡»úªgz­…:_3·`ƒñ­ç:j¿úsbïz¯Ï2#©0wök½'™ú&YÂ!œi’…9óê[b++î(6§¡7¯¤{ï¨:~[8Osòžw7°âùîì*óã)²Õ¸Q‘ËûLÏ{=_2fã{pc¶aÿŽßû­wº®Ío¼+hF—°jÃoÀÿWÁ[¶ò‘Kr£0ÂK<; °dÛ¸…ïøŠÓvç¯ÂOðˆ“ŽçroeüÂû§—‘&ãWêv|f÷ޏA³¼½{ü)Ó6‰“ñ¿çòË7¼‘§<½Û»(CwÖ0ùƒaÉ„‰j ÚEþKÈÙšVÏJ4Âãñ+VVgñŠyË©ùv[Uýp,²ä3_ ãeãúQä².çÒïüªnéŠnÝnêÎ=ý®n¿ë=êÒýÛ’ë’ŽÇæ¦äØãJ 3Å5H:àî'µsÅÈ¥*)ð‡ím7Ϥk8›*ÒÒå»5·W³«jëmåÒ3±|²}¹=ëN0Õʽ×þ}ÞË>Õâ=ì÷ýìSíÞïWíçQëþ ¾r,} e¥“‚œ›gÜ„e k’˜TâL¤Üó•âôíh´Y_9þ·êðSäò¶õÌòY6[ÇäØidï_é>z†mïÀÒzmSrå®?Í¿U­üþó mþ_­×¢Æþ4xaB… 6tøâˆ)"LÖ#Œ’Í›sqc6=8rÐ7/cŒâ¨lsç<ÜÍçáNÆd¨€ŒCå'P*C”DhÒ¤A™5ø©Ð I£B…*µèÒ¡W R9 Õ¨P¤wöt©£Ê;TF¶™0n\¹séÊXo^½{ùö¥KP ß¼ Œ°áÃs/þ[Ð1cÈ‘á”H9nc̃4Sîìy2fËŠAÞ|ujÕ«ñHûº#‘*ɦM¦ík9&‹é€µ1s®l™Ñkr©^ƒ"u¶(R°Î½R¿þº\ºòªC“}ž=yçSoo©‘7YŽ.}³)±b|ùóéׇXØ~~ýûù#„ßÀ|è¿ <0ÀtH§ÙFò¨Á‘Öé¤9Xë¢ á¹c&xæð`Ã’(B£d昃 O\ñÄ]TÆW”ñÅU”ñÆsÌÇuܱFOL CØÖã`DŽÜš€É&|Ê(¥œ’Ê*­¼Ë,«,„-½üÌ0ÅS‹1Í<Í4¯,DÍ6Ý|Î8£i$æ‘-ÃÚf;!7v£dnº#¸µ6t‡¶7úñýÎ+£¼;йI¡‹ô(è$Å4ºN;Ūñ2¥4;êþ:ut½ôHº¨ÎÝÌâ@Áe•"üh½W†bÍ•×\wíØåu#?{à㣠ÛÚè$ /biÕ˜dn˜àI ZŒÄj®„­ªû,ªº%U¬ò€¢4Ôo%ªÔŸšÊj]±Âr—º¡@Z«Õ‘^[+Ðaƒý7@[x@ >¸>ƒ^˜"…imµXÐÒM_ æÑ­Hßn  ˆk+ɋ Òäæ%J]IÍóV)ªXæ6ª¨ºƒ®äèÎuÙ] R5+ßÙðUÉa†…fH࡞(裕(é¥nA:iãàN S" 7eyZoÃiï° §øÍÈf›GO¹œË=WSðÄ;Ùæþ«Æ“·T·oŽÙ[³IQ¦f5d·Øì³È wìðÃW€ÂN[Ü/È#­4Ò à2Â)¿Ü´ÊßqÌ-½sÏ5/ôÑCÏ\4Ðs­Nê„p¶Ú2j£Â³î‚Õß Ãxà!+Imë¦;¢Næm¹1M]oÉÛe±ÒövS몳È6®^•'V'HL¾ÄÈÏüúÒŸo}öHý‚Χ¨ýòå_ ù'Mÿý璘~  ÿç>‰ôï!¤_í—?2}¢C`!X‘¥¥ ØY0R¡#ñË{ÖšÉp`’’Ý¥å*0cÊâæ¨ W ’B¯þ$nZ OAºå®®ªmöB‰`C›ÝQpö!È!²Äü81~LL !¤è(>°Š ¹"•8¾'ÂO‰`äb³Èx1Š_,ãB¶h¿5*äŒoLHãSDŽ@¨D²‹Ýmrc›¾i 8ÔêY@ØœÌdÞÑ —ƒCE:’‘?1¹>e32r‡ÈYóÀ…-÷ÔnBáÈ]TRZ~§€*Uy'²E¦ŒåS9ËUÚÒŒµ¤‚,w)VÄT¼e/‡ÉK8êÒ˜¨$,‰ùËû-Ó–Ì<&4›‰K6’2šÙ$¦+‘éKmN³˜ÞÜ&»Nsr“šÉ<'0±YÍq‚þSšâ„ç7åIËtÖS‹åŒ'BâhÎ}¢ÓŸô,fžls'Ý€$-$’{“RáîÈ zðÄéäp;_©ÞE­wCM2O,¾l ¥w½£¼Ð£9£a½lè´ZêyÍKÜÓh –'Âi3§™¢ât?Õi4ŸéÓœõ¨?õeQ‘ºË¡òÔžFujSªÔUÊŠR­jR‰ê@hõ©¦ì)UÃÖ¥z¬d¥êYá÷UµZõù_Z…ºÖ«¢õ­\…j[éÚU~¤¯S…+SëZX¿Æ1°bj^{XÀ2v«{]bbÙŠÎÄšõ®™+d1KÌÉr–± Ü²B’’ØYLþ¦âˆï¨õ±•0”yvCJX„bId¶ëŠä"Ûâ†×‰$&‘‚ÒCFg¡b•Ïz‚ 5¨F ª@¦KKèÞ²ªÒ-Huáw]íj—ºÀÜjt‘Z]îrÓ»åÅ®NÃ[¤7»êm¯áË^œ’³¾ä­ê|»«ÞïÊ÷¾÷Ëïvñë_ï7Àô=°NÁ›àþÆÁçï€ÌÝç.X¿öµðx×kÞC˜ÁÞ0…E
å{ßœçXÊÏq¶ó_ýÜg6zÎ…¦3 ýçA£×ЋFt )ÍèH·Ҕγ¥5-èS&ú͘žp¤7=éF‡ÚÔ—~ô¨;­çY‚ºÕœ>u C‚‘‘ö{ëyÖÅôÅx4÷%D7T§˜R?¡mõ69ã åÊT˜W s íÞžË:ÝÁ¤q‹ e•UG: /ÄЛʘ¿Üô©ŒCŒb®;Æ/~·‹±›nñ»ÅõvpaðÝîvó÷ܶ÷ýúMoŸ»ìÖ/ ®o ÜàwpÀó}ð‰'\âþŸw‡9nñ 7ݹ¼ÿ:r3<â'yʾq…;üÞ)ÿ÷Ê;o—Hƒ4’‰wœÝ8‚IN2"J¨´\Ñi6Þ¨¼J•Š\Õ¨G•“·)£´éqƒzÉšbWùII‰”s9œÔÊ¢W½zEð6/Y·Û—íeìÙY\Ö·Vö½ioìÜ3û`»+Öºz{uã~]µÃ½îwï;Ú_ØÊ¶ýïfï;äW7^ò…üß/÷µ8ò|×<æEŸxÇ/Þô‡'|ê÷þy“~ð´ÓÖ±:áÆv¢ v wÑ;”èØ+[[ÌàfFV“j˺ô°.®G^{¥ÙIþ~B²3å²çë*Œ*UDÁ{îÔ¼(÷=.~ñ~¿ûÊ4gúÁGa’?ü¥-ÙŸKô—_þådýÏ¿~óñ¶ ÿ托öïÿ¼Êÿ4nüèoí)Pþºð¯î/þ3ÐáÏûp#Ð5°=°ý>¾ì"E=*#Š$T…8F¨ZbBÜ4¢lP¦)Z*T *vkɪ¬9ˆKêª"¸¸-¥\F‘~pÅjHÂU”Æ(Ȉ •H˜ªP ³Ð}äÈ•¢P Ý ¿}¼ Ãp Ͱ|Ȱ éã îˆöôÅ6J7l #TKPp‚c€§Ø^+-¢ÇlTþR¸,RŒ°ép,⯭)p ;’o9’BB~¦vüho’A ˆ  1ñ‰®p Å7‘~.1?ñ Eq3ñ™ÔˆM‘}HqTQ RB¹hGö %ŒHQ.Bx8$èl&ÄÚÁ n’ÇQŒ±:pèã%T˜¬\Þ…zXŠM%oJQt#$~&‰ȼQŒ( èݧ0dQš¨‚¨ÅQùÆ‘åÑÚ1‚ì‘€Ñqë‘ÕH÷±>&‘UîD×þ†Br£$z cVeP Åc" -¶†l\æfZ ‘–¢d&©¤ºC)ŒŒen°¶ºÍ‘JR\þ‰-ޤÆ\¥NapZuRçsf’ql’qçtTç&y²'kÒ''‡uLG&ƒ²/$ç(]‡q†’&w(Rs˜²))ãÓB×hÇAÐb$r‡xJZdpVË,’áyŒLoþð·bnþ0‡žçlFˆÌ%ߥT’Äx†b¾Ž# Æi¦hú0™&0Ó ø’0Æ0D_¼‡$2¨¢–K'tlBÊ­w„­÷bâ^¨`=bdF83HXdF†H„äGnä3u„FxäGR5[³+'$+aªå„6kN¡LlS7wLØ„78­$7ƒ“8‹s|Ó8äm¬U®Ir‘1aþè<$ȘË'° ÛhæÅQ’$åÆ;æ’’ªÃ¶0jmœGnÀ:üæ„t®Aì01XþR>&>ë“Wî?oE?ûc¦\BbZrYøh6V‚ w¯P¨ ,ÿd=d†¶8 ;¯",&tTf¦Ú†‚¶Š’ %£–Go¦M(Ç=Ž„Nx¢Nús?e…>StaP”EÄE_´`f¹b¤¦Axî½è¾Æ÷v&Cè¥B­±l6…TäÒÉÖ%.á:–ÎB3òn@rÈpljº'Fe4`´th²”KûÃK¿T?”>®æ*ñD´ˆçbü$|VK؈ق÷vF¨«Ez–¨ z º— š¡º¡¢Ú¡qÆ=ïˆÈw%æŸp|ŸÖ&þn[΃,­­Û¨ö‘;V’£Õ·fø—e4ykOª·¢G¥˜:"ñ“ S%4YùYŸZ@ü™x÷6YŸ•¨ÂLA™3%pi£r/Ó ˜ …–›iú\¢u­ãsqt{ÐéÐR*j°Æ™ùU¨åcŸßiä@Œš®“š!Ø1K«´tl{»¤osw‚¤óé’ <º-^¢¢\“ÎÉræAç&W—‚¸J…¶Œm, ’2÷ò¨éZ âÚ³¯ï6Zû1ƒG[!XP#rŽ ¬Òa¥vµztbiP-˜Ð‡;yt(^A—««l;:Jd5jVË’kMvV³Ã„Îöþq›v”bÒSŸ»S#º§›º«Ûº¯[.»·»S]Cç0B'6rgÈÉ2gpxÒMEk?ņb‰×òR§OÌ·œô’ñ;)ÖC÷¬23%µy´C{˜ |L Ü>Ü"”%#ðƒüØb FU*NqbgÚ¢5UÓ3;³Gl¤Ã3œ4=ÜG„DÄ5¼4Ϲ¦ÎâvbjI’ÓÅu“K^\ÆgœÆkÜÆoÇyÓ¿i[ tO‚vyæi=F‘_K'lµ’8´<'…^CÅQ¼CRTæQŽ´m˜T£Žy¾](e€›‹§|/¼>\Ì ³Ì¡õÌåCÁ‚TÝpÜ&ÑakÐ7zþl~¯è ¹È”ˆ¦QP»%dgFy”X•‡£®X;´;Â-ÔˆÖ:[,1ÍãƒÌÓ|ͶÒûõÒ¢u#¼WE´ø6ýi‰mx t\‰0£úü¾·Ü¨¢$0 jŸnvîgÖîå~\™×çzïùÞù™ØÛ"ªFY6}²G¡9j -dÞù°S*Іž ÛŽÊ­Ö¬›íç{‹¶L7ê@R'Ža³Ïv×ë‹·XõSŸõ»ŒWïû^eŸZÕØp ÷o_÷sŸ÷EÍ…—iY6Tü^qgþMÑ"cF8î’19…Ði:³{«³L:¦¢édþˆMÚ¾­9z8ù]N&3»wBT…òLÙmSynÏ_•é A’Á—^L7XzÃkþ‘·zëŸzéÿþ÷_ÿûßþý æH°à„‚*\ȰáÀd= r€˜lÞœ6É&öˆq¢>>!¶¡§GwîÀsàÎxîh¼C¥c*@€” rÈMœsä d žH@z´§ÑN—öTZ@‰¦F‡23ð'ׄ79Ò„¸± G³c#:0‡ [·mßÊK®Ý¹wëâÝ«·oÞ¿|ï:<˜áÈ+^̸ñÁÆ#Kžþù±äµmã¾ÕœÙífφþ,š gÓ Q—>Í:uëÕžZ¦,¹,ÇøÌ!+òv2}ó6šìA3b2•ˆ€÷<Š4Í&É3'u¤_±8êù(wU¿_åiÔ:Sœã¿n7JÅíQöèÃS÷Y{ij”Žbq³k™¶”@s$`²e *˜ ‚6!ƒJha…F˜ m Æá‡ †¨Øl"–h¢‰$6 @ Ø"‹CÁ¸aŒ¹Hã‹5ÊhãŒ<î裌²¨XFgAdQHý%Éó$#JT J,ÝLwY\Fíý¤ÓyUEETW]ÖGfObƇþNbVEÞRa2åæM?%ÕSGD9‘d5fÒE \ƒ:(è\…"x袄"ê(£†6ª— i饕aªé¦‰¥È !H¨¢ÉHªƒ£šªj¨«¦Êê«®Æê§œÄ‘&ÍSo¾ý6ÏDø%C%ãLʹ¤ÒsùQ!Ýšq˜÷|Ôngg{ð}×ÝT^¶‡{à&Ô¶Ö*…ÐQÒ‘dÛmhíÚÃZÆ–Ù¨6λ½0Ú»¾üÞëï¾ÿê[ %VZëÁÓŠð–*ŒØŠ.¢Æ¢Ä1Fl/ÅñN|ñÆw¬±ÇLpBsÚ[o™eÖpfyÒmÑmäÜ,1þçNJZîÊÁuu‚÷¦Tg§RjÒI&SCMåæœf0ÑtÖÇf{}:Û‘ÊÃY©òð2ìµ¥-¶ˆ%m6de¶V×g6¦Ã;‘E9¹gDÀ±;ìDmLyG²T¤Ä¬°VO§4ãfÅžw›]´ßžÛ%™>«·ÝÓE]{Ü­yÔLQjDèqÝöé“…úê²îúbo7´öë Çn©H|ö ®u—ÜIå ݱU¾¤RG~NÇÔNÚ.í¸œ`jÕ¼uQ{·Õ|ã– ¹õJi~^—Y»Û‘Ü›d:íèw˜þú ÙÎ~Ûî'Ô5Ûï ¿‰q×}¤q‘ß$ù%þ™ˆJþÖ ÜáX颂Fæ3µÊÁ§[׊OæÔ¦ôpN{eò™}¨0žÆqn<žÝÊ(r«½A„kƒH¡ WȺð…0Œ¡ gHÃÚP†„¸¡wÈÃúð‡@ ¢‡HÄ"®°kFL¢—ÈÄAI¼ÑUÿÈ‚¼5ItÃâÈ”waÉý+àÁ¸ÀAÛYôÉñ “ë,a“aÚ'!ÎjùJõr˜7½i¯b_ƒç¨ôqöþ€Ú-ÝŽ‘'ÁúOvÓ›‘(ð„®U€s ¢ó˜d?^®ÙÒ*ÚÝ‰Ž¬üùHÿx©Å)ofb¹q䪴~†8ŽÐ,QT©] Ëœou,È<•$$øÉ.J€ y ;~ódÜ,g:Ù΃-ƒoCÖÑùŠŠI…i’ÚßË$dïNóIå2}¯Ž+Þ©£!ø< Vî¯flJ±òÄŸd,±y*œÁ6j–zÀ§FÑ÷Ó]…äÓ^ìEjˆ|žw¸YˆÏù”Ìùdoy-i_«ØÃú“¢«w§vñæÓf=Ιý›êŹÚ#ÂöVµý!<;„]Å¢›I!þééä Ii¡pLNk@•„¤|S†#¦íz_~b'Ž–Þ-^G¼ïgÌ×Ñ tnÌhW±›ˆ·s|mnfá9†x%®“…õ"zD§¬Wf’ü¶a€BÀõñ´;á Ò÷¼½iöžÆèDÓµØ]³˜;¼åóhɰ=ÐYYò› Šÿ·áŸUÐ9äóç½ š É‘ú'\JþïÝ¡;Î;­”k™š$ÝŽo|ESc´Òç0Ög¤ çÞô„cZ³æd)"$ ®´ÝóÅ{Ý=3í8ÞÖsH‘|ÔÒóÅbõY#n/½då~z‚H_²×çêÝoõÙÝyú"SìÁG¸›îú¡€Xzkålôd9óø>;¾Ñ{å}ÙÑxåžNiõO6ÐæS}È%€Œ‘}ÚG€Î•z˜$Z1ø~*“7¢µ%(q3à58<÷a5çWŠV4bç7¡r?Elÿ¤oÐBô4ˆä¶s½„c˜Ô'€¨U5HUy'ZÀâj~–$¿¡,ŒEaS8nuXS]rraT4þ‘öe,—=.÷a–÷a3·F3w}+³2²> ƒˆ1ƒÕwƒ8(†ˆ±}äÔ€Âá”ÄÂqXБ…7@´ö‚äµr„=ÐSl»%i÷µ|)&ˆÃu ”…]‡Me×õ[Rf†E†§‰E‰•wÿº„ª·€÷IzÂ0±Ë17Q&ÞX\ç=6Göi²ePP¡h'ç=Ã'…ãrsrãw|dXÔ††!‰£g‰—(Œg6:¸z$Ô;fÁ$·¢a)530•kPUˆ&F#fÄu+Öhõ'sÐCb»y5×Zàñ4‹e5=à‹¡v=‡Œ…!BG aþŒ†”ƒüRDd½£d½‘=0ŠO6ru0GܘbdVbmdb²%5ÈiÄ<òæ~7¡2pÕ‚Íòzø8HÄz9H#Y?Û‡5¡ xñ?‹5m/µ@ I!±%9‡8ÉiôˆêUX„¨TY'=yˆ „P÷–FŠ(‡ýÓ˰2Yƒö¨!9w%i’QIwCÖ;üˆqøq7Úõ+i•'.åd"Ç,Ö2,—l……[bD‹¹bý¶„&vwäZä-9ãM÷qVŒWIS9tUù>ƒ¹>˜¸`m°?½³¦EÞE‡-8S¢‘x¸T¶”öÑ<fÁF™™[þv|È^#BÃñ`$×…yQ d­‰«‰>jhaN͘V•Ä1óqÄSŠ1‘%ލŠýpœÃôÕ„·HAò•yí7y¯ˆ^rPZø‹á‹Çy±I;tÙI;Ýé:w7B¢³t]øY6>É3@€33âÕÞâa=ób9µWmtl5Å>yb—‡r‰F7}RÖ`3ÕX¯YÛépß žj}«FÃ!VäÔ2™ŠùOêG'8vˆ8‹)hršùV[æ‡]‡<«Õ;AQ º:Êm-º:1ªQÊHB̈#T,¾¢7¡óqSÂnò„{%§Äv”,Ç–Eéþ x^½Ç3?ÕhúÉ-›FOqÃ'µöv gY 3J£Yšƒ%Õ€6Š£P5kwfÄћʒá“x9b¶™JxiÂFœ\Vˆ™§uQèZÃUwC¡~Ùš/ªm]ZY_Z£ã37 $QÑXIuÔhaºfh‘bn¤Oï55|È-zˆw•“4œ>#y÷ŸQ—p=ø[gÆ…j6ƒŠm­zY[šƒ+ÉwD¦ëäH6ya]än|´~'¨[L¸‡a§-tÕFmÉPRHs-gœ ¤iBºGì„[úªÕ«n3«Êˆ5Ìx7¶]ü%h?ZŠî^ŽX©ýª*P’vWÄVSëUoˉþ|:ùœ>“3¼¢Y醭_c­©Æ¯_°µÓ q¨;èDrVóð­8Ç«‘™ZÔÉ%óUoöÕaDA‚T(vµ¥ÅP¡ù¦CWQ†5Ü %[S­Úš² :›O"¦¢•£*¥G~Ò7ãª,0UÆbÁVªòÉæWÍ ¢Ûè„H‘Iy–**„x(°¦²+ë´^ƒ°;]Tû;Ÿµ«jj@ÎÑžøa^¤©©ÊÊœoi!K¬ ùx”F¢¯è‚SÔ•r€Yꯧƴ‡µ ó²­V ¶'K£\ê‰kÇÒ|¬u-F‚xåSyz8ôY”ƪœ†k¤Ô-PGdͨPY r[jtþ;Y‡ª€ªW]äT,Š{«•É~[û«*#¢¢‰”cG”³¨®Ç¦¿—©î×9µ‹_ØØH›ú—›;j{0ÅË)´Š$‰Éz–»€°÷?+ÃIcIŠk*SÁ9Bû„Jˆ±ÞHŽ=ù¤Â_ù‰‹"öÀjcÒq¼›2¼u¶¥\j· Óú“¢>hED3R—º4A“ÑÊ%è(—³•ˆó9G›IiŒgeY'ŽšÉe•;(† ê¾oƾ›bÁU£™¸tÑè?ÿ—<ÎA½Æãfe“ñê—Š|È÷¡)¬9Y‚‡¸@Y=ÌwXm˵ƪ(û¹<\ 9x«*:ýƒVmº¢þY;%¨xX+ƒ‹ÏS—D»¹‹eû%š)Fî²q4ˆ×ƒX™£ÎF q+¿‰Á—r˜6JR¼ã—$ú©Êr3邇×~j¤b ÈÛr9Ãöz=»Š¸u"$ÄuÃsdLj=ìÃb|0q3B®¦ƒÃÑ’KævKhæ €m€œì'…UÖ®B¹F÷7¹Å9Çh+ÊžZsHÁ‹¼Â ¼WIÁw¿‡ljb¯§+rc£V \³†78Ž:U±ÜˆT•ŽôŠA(W;¹TW,Ãø‰QÆjd¡ª1Ë'Ë?†Í¨–È Ã]aN Ƙ A¦XK½T@“øá§ÊÖÇÑ þ¶ Õa%vÅìÊÀrâW{¼=—Ç<8 oDò$Y·¼ÈQÉÍ%B«û¨’Œ›~›Š¥U³’)SH˜ÝèŸ55…—7¶„µÇûÖ̆X¶z:iFIk%Ñi&jaìÍ­iÐÛVËûˆ¶y¿_™°Â‚¦Ë¿Y5K »xÕ–»œ±§gûFM¬¤ñ'Êàs½1>¼,mmmOÝcYÉ'sÃz*C¿-IÚÕ_nL3„É“h"­»ô¹³,|šù©GjPËÜu¥:pEr7 4բͺIZû6 óÁ¸UqíQKÍS{èawcÎAð[˜xà ÈÍjy»bs)»p±›Iª˜fXP"•ñŸè/³ÉW·Z‹Œ1i3æªVõ´¸½½©YÛ úÛõÛû,ªò,Ÿ¤©´JÂ+ÿó‹ôfø Hôß|¿[EF³ÀBaRþ&8U8Çó‹8Zy\&GF -–Å]FŸ–æÑlÏ€ê/Þ_Š/ƒøNƒ¯" v£º$7•títòñt³_\¸½§î{l׸ôÆÇñÑ{e;´¼þäVóõñ¾'ê¢pá±_ŒY醶êHa~EðþR‡ÎÇ‚Ší’„‹‘û÷³[÷‰iöçŠvzâÊêÐ|K¡žM㌿ñe¯)¯Él~aùãÑã•d’Ýç€;sà!,˜ŒB=’Qc ãPùØ#•‘%CrIòãIqZnìøRcÊ–K¾d “&Gm,R â3™E¢úl3ÀR¦M>…UþêTªU­^ÅZ•PV®]½~ ViX²eÍž­:íZ¶m³ªuË•h¡=øÌi3”n¢Cõñ1ØÃhP‹wº`H去;DýH3eä™'A)q¥ÈŽ(%Ï”9¤NÌ 3»Ü¬RfJŒ•-r˜HÔçÞ¡#›[7Û­»}ÿ&‹øpâT…Gžüxr²_'›7g(ÒçtõÍÓ[› A„ ÎAx§Q |Û¨Éåh›cN†Ÿ1õJè?לlcNÉ9#•ˆŠ"âk(l³èæL®7üm9'\KB / ËÂâÌ.:,™ë¨;ˆ ¢‚1xæ`¬±¡þ(p¨Ñvº,½ÓXí&’B«/$ü,Ë1=’ì ‰½Ô€-Á"h®‚è p@ 1¤2+«Äò«)³ä2ª-»s©/Ën@îÒk¶ìz »×˜,¨î(<¡ä@#ŽØ«Œ&Ó^‚‰?ÐF¢Ì>Î--?!ÿ´)ȃ‘¡Ó F¢Æ “Ë+3åÔ)L;­òSP/5·7;Ä‹ÒÀºîÉ ;è°ïºãÉ;´¨µàc/¾B]Úq?^ûÛµ3øü”ŒFú2ÑŒm®Ù|‚‡°¤FÅ€M³ ³Tnôö[å.ìëµ6<<Õ<¾Nà£\Û¸Kh!x€ðà¡d´3P&þýþdm¦^òlPBaroÏ}×3áöLB6P¾l’Ò½Úˆ­ pÅ-n[Œ±¼xãá:öØ7ÑzRÍæ¡Bb(».0£” EÄBÑVe´O§"ƒ]iµ÷P“Ð$wŒ =fŧ]{ÍÑ&‹(.63£´häsÓøj ­ÖÚ-®»®\'F·ÀÙ^ksM "šó»Åjý)(ƒÞ™áD©˜/>BeBø³e6o“ôûh³¾g(/¾œdæ¾û¬¬#_rÊ˲ür±.4@ƒ¢£Neۥe½E´' G÷©P×u\˜ïΔnÍ2ùúÝìèØ·“HÉ'¥kþmº2×ܫɓ'yæ¹rþù«¢çª.5=”xRçYU åŒ×퇄Š4W`{-mµ)ã)XÛgMý‡ôñ²Ø]#Hc\|ìࣞô¨²<î&€”ÊøZE/«âÊŠÒ¹ý…‚ŠUŠ“ZUäV¯)”³tu;÷L„MØÝdg$ ¬hùk Â>¢— Å'f2Þµ˜±§=?F®º¨lkšÎu Ä—ÇÀË; A<ôó)jF(,~tžßím„ Òu… )Æ ‘“*Æö€BDK{(ÇÒ1*ÓIã¹R•¦4r`DxDœPþ60『‚õ¯þün…[TMÀnÄaíoÈrÖïD‘ب,/°ÁU2ìXÀ7ÂÑ,£, *¥§Ê¦¤±sÑé‹èÒ–Æw$|P„‡™x³ìh ƒá¯ÉEH6*%}«ßüšÖÅ‘$0L-5V2¯”¦ 6E¦MÝTs)H´š@äœíb'Bb㘈ÅÏ‹«’H34cÎ4"a#Å(Ï¢u„(Ñ*â’wÍÛÛ;ÕÚ}KðØK0-ÕçàþFØ×ª}Ùõ«Ÿ€éN_ î‘’1Pâ>T ‰H Û]¡vf­ ¦s)ÐU~õ’\Å&7½´@á™!!òDºH‹!±|MB­j’¶%iJ{4LŒ ˆ¨é*H ž¥€WvåYzy¨Ä¶—×Ú±Iœ‡š`S>a3ÉtÀÒs£"TÛy”WA ‡z˜?ïK@Z@l@¦h5WBÏÁ#¢‘U!-È¥; þ* ®×È«¼Ûôâ ûӋ°×‰-ç{§ú©"‰éÀ Šp—&¥dŠïéðÛ ¢ü‘8%ÿúYГб%˜‡X v Ãb>b™4~Y-Ž;©ô/JB¬œ”,’4óè·XÚ2ᓽÔA›âÁ IÃI.„šs•ÓŽÀ@y)·ê¢8¢XºÂª>åó1’0l–ÕRħʸŸÞù Æbœ±é03tH Ë»rÑ#}€L ÐÉ„ÌÊl¸Œj¿\z¿ñ‘ÉÀh&"œ5Û‘Ôx3~²JM“„EÜÆ2™XJƒXLßøJnšÍmË ¡9J™>èÍyNàÜáìÍp£È\rKòHºÐ‘º9Äú±Õ{Ÿ+L!yëKм‰.¢®òœt «J¬MmºMJÌñŸÎš ˜ƒõLÏõ¤‚9xÏw„º °y‰¢—Šúc-¾»$-Š4,2¸C–ÿ ½Ö,ˆÙÄNºÃlÀðĦñì¦òd’I#qB²ˆ þ(àž4AH4­3 ´AÒtº4;:üDÿ³-¦ìCðMe o$žÂ¼ ð”ЄP„š9ÿñQ8?j—àJÜ „p½!ҌŲB³J≂ĿÓä»Ô@˜Ù¨i© RqÌMżQæÐ¯ñH8Ñi•v4ØH·¹/à7ìË“Ôcͧ´1¿1DŽòk€”yèÉ@Ú@;l‘Zä‹1›´*”ø°Re2»‘¡ý$AÚ¢¾ÝÚ¶1”3Dm C…#Wm Y ²ŒIìéƒ ]ÝI -àc§þþjË%T퀌¾*MBäÂô“õÙêë'çÄ­Ú»[Qª*K-$£ÕÉ ÓñëÖ³X+ICBkƒ @Wt…J+ìëê"JøSœØÄ.ºcÅý„R¾2¬€yŸÄ×aÉ1üq0H Šî,k W³€U!JXÍRÔ ]ÕWKtù#~;· Ö£ZÎ@e°½s*ÅÚG»c-gÍ­ƒÖ1’ Ljš TBĖÅÑoEŽ7y޳4ˆ ˜ ´1 â ¼Ï<,¤RÜ‚$ø0œl­EAZ„§¥\]³.8Ü¥K±QšMÀ†Í&²*èŽU¹—ÀøU z jy!HŒþ£ª®QCÒ…a¡K°bÉλÄj¥§™ÆÚ"R…$´I5<ËZ0µÙÛ;839—n3:s/AúPääÎMÝW÷¦üГ£2D両1³–TÁ!Т5âÚø:\ÄmÝáðÑå2§{’3Õ Ë+ŒO¤ÍCªâÁ¾óÈw !`ò—¤Ûi¦žÑ[fí'4³×ý‰Ùˆ–@”h+Ü\Ý y]àXíA™Ê¤ÌÉŒL ¢¥D‹•yt›O[á³Ü“„JêtV_qRbÊaY¦Nk…áTà9Š±Ñž0”ÙÝ^ÆË^-Ù,"<™ß NßNn¸öŠQÛ¡þ´¼XšÔÂ¥UÖÔt³¥ô`1Ê8zâ\ %€j®meÐ\X *`ÖÚäx“Oâ¼ÀPÛÔ…™dPÆP„c ÷ÀNÀT6Ó«N,¹k&»¦¦kÊ<·7ìÞ៸V<+®)²< ¬²5$…ë  \BÆôí ÉϤDI¾BYÝØ‚Q•µª$ÞKÑ`Æv„.ÃÔâËáîëc¬H(˜…½¯­ºÝ¼•;ªµ«™]Šˆ0~äGè†Vh‡f臖è‚>²苆茞hÆèö莞á>iŽ&é.é‘6é”éBé–>é—Vi˜v阦é™iÿ‰5ÁÝgUéÜô½()Ê(²ÍdzÞg«í± »-Ó¯¢¾ä›#êžT® Ãlª+"ô£ uÁ#—Úê­-Fõê°f/°ÖÒþ®æê¯ë´&k´v,ž’ç±>kµ.ëµ6k¹Æk¶žë¶¦k·¶ë;äzþëº&l¿.ì¾Fl¾Vì½fì¼¾ëoll½vìÁ6ìÊNìÈ~ì̦ìËžìÃ^ìÎvk>¢3|®çKîPÆÚu2ÖîŒë®È­ÞD$çÀ^ê¬6j1ìj¢ÞÄ$sœÆ"DÒRž¦j‚¾ä|v%ãîâ^±înäfnånîåÆYè.jÝžçžîã–nâÖîèönêînðNîðÖn¯^™Æ­èŠæîñfïç&ïöÎnø^o÷–oìžïéT§¶ïýÞnþþî÷¦ïo¿ï÷oñ&ð/ou¡ŽF4›qÞþêÊýiŽŸŒzk´Œpë>dÈÞ7}†g-5´mófœ·7ó  4zçq®@´6Fe¯wŽgq«…q¯qoq³¦qqþjƒmçÇñò"çq#¿ñ#Wò$OjÿBñx¶q!_r)Oò*§ò+ßq+Ïr,ò-gí„$ò)÷ò.'s/óGó0×ò3Ws.7ó7—nå  íOZn2®[òÀu¦â #$»9¶z:ci ºðˆx6!׊gÅy6AkhižêDó&š#'QtŸœí?笅Ût#ëôQõ˜õR÷tv,q}Öi ÿrÛFëRuÜÎpö’õÙžõ\þÏ€>eLÌ#SÿtMöPvNGuR'öT/öfgög/qÀލS_veGöjOölÇöm¿ön§vo?öo÷p'wU_8ÁƒòF‘yÑ Æ0-»ò¶‘è``ßtàzÿM{W`|ß÷Î÷^†tX†€_Y(x‚Gx7xOƒø‡?xYN×w.²‡ÉmG멊ÿw~÷xï÷ÿøƒWx‚_øƒ7ù”Où’_y”/y–y—'ùˆø†x˜xŸy›?yƒ÷ùœ§y‡/ùŸOy¢z™ÿy¡z Oz¦§ù¢Gú™oy‚çy†—ú…ïy•y¥Ïú–çz­Ÿù¯Çùþ®ßz§{°'û°zozYÐy›—z¸?ù€wø¹—û„¯{¼x»Ïû·ïûœÿ{ºß{½ûÀ¿{¿|Ä/üÄ|Æü‚ÿ÷~×w>¢êŸs½&ÞFµÅ¥eä‹pŒŽ÷dOødÏøýÓ'ýÔ/}Ô'ýy  ¸Ø—ýاý×}ÙÇ}ØGÝ×ýèPýÓO>@œ7dí5¢ ßg}÷œä}Ñ_ýßO}ç_ýy¨ýÜ¿ýÚ¯~ìÇ}í¿þÙß~ïï~íÿܧxóÿî·}ï7ÿó_ÿÚoíöÙŸø¯ÿØ¿ûÏÿñ×ÿï ð(¼CÁ`Áƒ T¨Ð þÄ…%FœX1âE‹bä¨Q#ÂŽ!?ŠIòdG“*K®D9±eJ–2]fŒIÓáÁ;óæð¤Âó'Ðyz$ã¬M¢=2%jÔ©ÓdI‹R "µ ¼;ð\€äŽÖ6EïPAÊag²´j¦å Ïœ£iÅÊ%*un[µzÝòk"`‹#1΢÷0Q}ó®VUjön²J¥Î³Zôðeņ/s^›wïgºEßBü÷tÉÔ¨Wö«c`צE¦® Ò6íÛº_o„Í:§lÞÂ/Nü¸ñä9wÏnî;7tçqK]}yôç³#îËV´Ø·{üÇ?ÿûÌÖO?þ9 ÖçRòÎ; ‹î2mJ} r‘ã䮣håjéÒ •ì.þsSá\dä]&qE!^š`·ÊùÇ)v;Ý]R'®.wéà’!6@e†L&ã×½zà¸ÿ¤M@/L ûî'ÄüqˆF,"ýލD$"Gþ$%¬[Ø08õ¥Ç<Ý‚ÜR:&OE&>ó¹XžR. íN¦«áÛ”’6ò=®Dàò0‡-ÿ‘È(oQÊÓÓ”MTQ¹`½ÊX¨ >ŽiëÐ!QÔ&;∉Ž\"$)ÉHÚo’–<â½ç˜ÔmJ‘‹„Êš8æ¡»X+ð˜CõÃBÿhêO4*›Ís T…ÒR}¹¨®‚1éPb¡’šœjD:‹nc JO Iõ4E.ˆ—|&%¡)Íh&‰šÓ|d.ûÇ Ñ,æ—/òNÔ‰*LUçú"î§Œqw9¬Ñ,í•ÀB!`MÛ3UV¡¹n=Ýô?Íã°wÅ¥Žþ{éLE*†0 pò˜Ò¬)ÑkN´¢½¨E3 S±UÂJÏs¶¦@Ô)¾LF)éƒÊ<L|p1K¥6奉ŠuìÐS$‡³l†ðkÜ2 cjNñuí˜6²eò8®ñøÐ¡!*´4:©b´ªT½ªUÛW™òÀ”&¥M&šÎÒžwÚ/'¾ëW1“-áb*•cJVz:u¬´|x ñC7 ,/ÓþË[.ðA6ÍàLíY*no~χ{VùÊyþ0¥bè:›¾VtÈA.åd]fSÍ&‰œäS©:S¯>uŽS}ëV¯Ôȳv‘Çëaoøx ÎtŒK|äàôÎÙÀÍpLÕI¥ñn‹Ãú–u1ÇUwÑ9ÈK x¦õ“å†j7¹ø£ž=~—ІùÌ«þªµS~èF÷æÈ UËšÖ€ÿøC[¢‡ê<Ýo'=OŸúñ¨žõ¬g¦Ñ]¾èbk”eõã=z,jöc»S®ØºúÞÝÞ}Òm_òÃAmÝVŸý¿zSi1FÓÇ—ô}_}=j_õQ3íöÃêÔðßà„Ÿ|ëþŠ}Ø~Ò™€–/ià oüÌÇ+ñÉl—mé°V‘ß~²§‚¼þý_ÏZ”žÎÓRøÒ÷©Óí›óIMØ–¦°?áZ2S Ð7ᕇـ‹ð¸Éõ‰ŸÓŒ‡(AŸÜñÍž¥ˆÒ [€ÑÁ`[˜ß FÝøEñ ìúµÐqÕS á” ð|_ž•¸T@…`2áÂæ½ÒÏr\=MjNšanœ­õÚùmáþ%Í.ó…¡­AÚ·ðœê¸G ÒÞ¾‘ ú-•‡½–V(…GüÊ„TËH‡®ÜGØ„B ÄE„D<„â%Sd@„"Z þoÔŠ_üC b‘ÜF` Ä$îHEˆÎjü¡&ŒA|¢µHÉ@Ä—¬"*ºLI¬âHÈâ)D-^b)FÈrìâ"â„./JIJìŒ.JÉ0Âb%b¢1V"B¼bBTS3ž4„3š¢–"6–â!>ã`0-RÄ&B¡´VxÀÍÁý)ÄÁ:R<º#;Êc;Ö£=Ò£;Ö#;î#<òã:òã<Þ£> d@ò#=d<¾£?Ê£;æcÓAf$läB*dB6$HRäEj$HN$@öã@¦$;f¤G®ä@N$JÂdI²äIÞ¤M¤IædL‚þ¤A&ä>þdHÞd=Š$BÊd?æãQ’dOîãL6åNZ$Gþ£O%LndT*$Oê$SþdJbdQâ$M*¤RV%RêäL:¥J~¥X¾$K–%[z%T²¥QB¥[JeM’e?¶$=2åU&dEâV¤ <¬UˆìŽÞ±-&˜Zï1.¦òÙÓîm“ÉPYù\À­ [TX¦·ÅÝß®9¦Á_ÅýÀ$à¥Uæg6¦µ¹™b^`¡ID±æ)–jQ‘ejZö)ÓnNñçèÝ`cže”Vð5çÔgª&¸fS§8)ÛqBfs¾Ðl6gÅ1˜M&lŽçeŠŸlþºÙd®‰›ñ܉ < ž¸Ð&iÚa~u&ÅzN§X=çC­zúç蕦ç=Üc”&˜Ô P9ž#XÄVÚÁ¹ÜúÛ½œ¢ÜÿM`Í1fŠæX}]fžØAÞ'5Ðñæï‰œÓE^òhnÝ>ŒyàÚ¥¨æ¥–º›7uõI Žè2_Ï•Gˆšg‰šßaa^åA¡ ªßàvhÒ\^“ú]Œ8×yÓž±_¾zæ\êA§Ûa ßUbyÝð±Û &¡ðqÞ†R©›šÝÓ%ЃÚÉWdEƒìÝy²h"S}^áœÚ•*iç5iH‘]â\þïù¨j1áp®øÁ©M-êÞ IáõÙìõ^Žú(jF…úð&tN«©*ì¥IÕõÄÇ-Óæ jMí§÷™¤Açøyí™ê«„”×­ç¢Ú^-9¡Øk­_8˦Q‘2 ŽÓõDŸò=xÎj°5”²¾I "ç¡"§¦.S ¡)XIá÷ˆ|Ž™†•5*Ô ëú5¨J©UY ä+l=(lõë¾þ«¾ê+áëÀækÁìÀ&,Ál¿ò+¾úkÀìÃî+Ýk® Æ6l¼­ ÃÞk¼ý+ǬÀ2,Éz,ÄF¬ÈV¬Àz¬ÄJ¬È,È~샬ʂ,ÇZìÌnþ,ʶ¬É†ìÎæì̪l±ìËNlÇíÏ:lÌn¬É,ƶ¬Õ(,Å>mÓ:íÉNìÐRíÇZmÔúlÔ’lÇjìÈVìÍíÂîlÑŠmÌf­Õ’-ÐvmÕ†mÍ6íÅê,ÚÚ,År-ÒíÙÊ,šíÛf­ÅfõìëYÙë}¬ËYÑ —!nã.îý•ãƒâ‡äªSåRnâVnæ–#lÝ_âfnæBîåN®âr,ånçÆä¦.çZ®ëƇ:}.—y.í²®ì–.éŽnVˆîæ†néÞ®åòîìJ.ñZ®ãÎνzîñâ®ì¦îç"®ëŠîïïî&oçænìrYðr®Å.nåj-æ†oõþ‚nã^/÷>¯ñ¾nëæ®õ"ïö¦V¯ûÞŸô¢/ýÆ/þ¾ïéN®Õ .õþ/énï÷:oí/ò^îÇÒnO/ë®®ûBo­®îü~¯ÿ².âpgïøÚësp¯òJ¯ëîã†ðøšc½fðÖ¾n¾*/ã‚ìâÆ0 sðÃÂnìž xoÏ0ùðî>,áðnëÂp×,ìBð ì /ñ¿l/ñ ·0ìz®û+n71 ³0Áâ0 1¾Šqk±ózp¿â‰É^±óŽoì¯#mõ¢î¹1žÄGï°ÐVq c1“qÿVì [ÿ0ó0Þælþ÷± ßñ".Ѫ•!¿1žô+ÇñG±³±÷Î0Ã1 ·®«“"31!7Pí"qc1ómívð¾ÆG&gð)«î(_r*·ñ ì'‹­Ÿ/ Û ¸@1»€ ø2³3ó1;³1734»5/ó5;³2Kó13ó3/ó773637‹34gó4§s7³7·38Ws1_ó6w³<ƒ³:_ó9Ûs5só8ïs>dz:÷3;[³>t5S3B³sB´?ó<´@?ô?#s@¯3?'3EÏ3>ó³9¿3EÓó3›s6¯3Có3Ië³H;óF»³Eç³J—39GsK;42o޳FKóMßt1+s>ÛtMÓt:?tAË´A¿ôNÛ³PÃ3:ÏôG£´QKóEG³Pë´G³N7³D/4L'uTw4HÏ´VGõGg3UKsJ[´V7ôIS3´µ[¿5\ǵ\Ï5]×µ]ß5^çµ^ï5_÷µ_ÿ5`¶`6a¶a6b'¶b/6c7¶c?6dGv];PKcKzͽ+[+[5Pictures/100000000000030D0000005E8DDE14430AAC5E90.gifGIF87a ^÷j„b¼‚ |&1BL«ÆªÄâä<$$b¤T²Ô '6ŒfØÃx¤„|EDCvn¤Z$GOqìæ¼la_x‡”+ ©×ß1z§¦¨Btn`ÜϹDZ/üôÍȤL337{£Îʤ„QgD†¯„Te—|ÂÜÄÆÄdB4<ŽÄ@11wA!DFNˆn`"B€$$%ÜÓ˜”>äæäÀÔ¼‚°ÒH Ø_>1 $‘“—¨´¬ts|ɵlĆ4¬ÂÜôöô’œ¥Ô²t\zT=<;äÞ¿+--ˆ\TOcwwOFKLOÂÝäÚß t\`\d|•È4;Têíêòûüœ¦¬$Z,Úäâvj\^\\s”—»Ö´µ´ddh ¤‚l°Ë¯L]q6œ|phŒž¼Ä²”4-,5E_TF.ÜÝ܉R)TLXṲ̈ôîü¤’TŒ~LLJ4,:|pop´^$Ć\8~¼”†L‚YJV $LoÆß¿—·o1 bLŒž|Ô— ”R$Œj4á·Ql‘ÁÌIŒŠŒÜöüÄŠ|D*$l9!´’< &\üîÁDR\ئ, ¼Ž\lм¼êôd²ÜäÖ´<6,„¶Ô, ^þgPHp Á‚*LÈp¡Ã†JŒHq¢ÅŠ/jÌÈq£ÇŽ ?Š Ir¤É’(OªLÉr¥Ë–0_ÊŒIs¦Í˜â朱³§ÎŸ<ú Jt¨Q¡H‹&=ª´)Ó§K£:• uªÕªX©j½º5+ׯ^Ãv –¬Ø²hϪ5Ë6mÛµnãÂû¶®\»tÝŠ›Q'Gß:ÿú <¸0`Ä+ṈãÅCž,¹räË”1[μX›ÏŸ­„­MàN‚§¢¸zFëתc…=[vêÚ¸oëfm›wnß»]÷þ›xpÚLJ#ÎÜxóåΣCŸ®¼zqê×­'ÏÎ}»÷çÚÁþwÿ]zxóãÑo'˜£œûrQÜÇ¿þ|ûøïëÏÏ¿ÿþþ'`€h`è_VÌ'`V¤¶“Aš¦P…T`¨á…´¡‡R¢… –(¢‰$ž¨bŠ,f8¢‹(¸¢Œ-~8£5¾ˆ#<î裎@Æø£AÞXdŽD&i¤’H.éd“Pöx¤”LJ9añýe9?¸×e—\†)&˜dziæ˜g–‰æšj¶™æ›lÂéfœtÎi§œxÖÉ`{¥Øg5ÚPHP:¾Jœ¡ƒªè¡‹&Ê裎F:¢“6Z)¤—J:¥›ZÚ)¦ŸjÊ騞’ ª©¢–ªê©«¦Êê«þ®Æšé¬¡ÒŠª­­â «®²Öêë­¿æì®Ãö ì±¾™&N]Ò`³an í—õQ+mµÑ†9m¶Öj‹í¶à~+îµäz[n·èr«n¸çªE—94H¢iQQÄñ¶é¬ÖïOÿpNóëïÁ#,°Â3lpÂ/qÃ?,ñÅclqÆ„î+·\ðÈ“\±Éî»CÆüޱC6£œñÌ"—lóÉ7Çœ3Í2׌óÏ:ÍóÎ>môÐBtÊôÞ1ƒÓaYZÊ@˜DÀÖ[ÿÀõ}^ƒ´ñeí}T­¶ØlŸí¶Öfg™µÙdg»eÛw¿m÷þÞu÷½ö{Q0øƒOg(Pw€¡…hCÔäøM2 ±¸I(9C’[¡…ƒRæÚ AÅ@,à×2g Vq(0m ’¸Îõƒ çVK…!4ò ¦(FÄqÎv H0þŒ†ðÓ4žm†NØŒP³2ì`NÌðÈœ ¡¶0ʉ\íj×(” Š'ä¡ 7ø ›ÿÐç^<7‚c‰3 ,`u‹‚ttwèízÓË^˜4ÐqøC¨d âD÷X±l!íRÚgE*šíŠ_£Ûܸ6=¯• ŒSÓoH¡‡µ¯qQx.›‚çfÓ¼m«yrdjRÁ—a¢âgo.ÇžöÒÇ©RÕ5Ôí¾ ñYði­{ñ€ÉLʆ§©×èvlïXÇ>2…ücÙÈ=ò@t›ÕÑåd–õšAhA;”vt‡ 8ˆ3b£}Ú±+aú¶Î4[„þšRº!€• Ì”aŽò\Ë’œ¸l(ŠghÃ3°ƒ|#( ©˜¼ÇÎÜ8ó«¥û_” 2fÉ·€{š¥ï°éN7ÍÓòãô§GjPgÚÔOCµ¨KMêS·:Õ¯^µ«YMëYÛÖµÆõ­e­ë^¯øŸ"ð¿S„تÞÈ€"á TØBÇæE-ë]ÛƒÞIMJ-øôÔÛnŒ‚M­F“’ûl5ýéNÍý®htÝ:í^÷>ì,Õ¨V½÷Æï{G!^QÍÉúFW„zµoÌÉÇjYsÖ%$ƒ²cņk!ͺèÈo/§WÆ-½qóäãÿ8ÇþEîñŒ‡|Bçí¾º[hZ6v¶XBãxÐÏò´É”gN²côó žsÆ:]ä¹—«´99,½€)#Àc»Q&‚9‘°ÎjBûR:tCË“ëj6Òܳ?ÝêÖåd'o|9*œÓœ÷Òl¿ BÞN÷¹Û]îx7ïÝõž÷¸óýï~<Ü_÷¾~ï‚/<à/÷„z¾ÃˆP„ ®y{ÞsBy‹¡çåŸ@@ZÒ+N¯‹¥§Ïí{<ÿj ŒWs½ÏMaÿJ˜Œp ©õË{W‹UãVÛ uG¦ê»nüf—|ê ‚¬F9ÑÉ °jç!€¦4z¸¦|þ!=øÒ‘âî\ã¹ó®œvN.H‰‚~I·Ÿý=>ÿú'ÿ„d«*ö-ú² 7PÀú` I °ÓMà€ð)X7•¦u²¤ àX x®àÞwMŒÅX™æ!‡µd\å[g  M aCZpÏ@PÙçX ‘"ä•3¢aÊ@~Ùu{6Fà•#¡u;¡i¬Ái-¨géå„䱄êÁ„JØ„Pø„Rh>˜!0 @ 0 Äö ààºÀpí0Ƨ H dœ·í 0!˜w`vð…†aņ #Ð÷D\3R±×z@5ˆþ[tˆi{j4Sf”_üÕ,\Ã_&UP“  TÀßP‡9á¶Ày’ T /@Ì9Vò%ÈVœç TÜGl’0 âðÂèRS5U#nÚÂ6Y²\Ò6ër|³’æâþ%öæ60 .†FûÑmJµ“o’“ÔSŠK5>öñTçKF}\µ‹…Cr=X"LqŽ!Ù•I_!9V‰äUiŸ×•ûrnMÕvuäØ ¨s^©/My)`&#J7áÀuTY+a†!©g÷·[I)i Ñ/NC–u~a UÐfþ‡qHq{1}Ò ÏKrPq½q83@½ÐwrA±”¤¡¦Hq¹[ˆe¾BŽ&wvëË)FZÍp‰r‡)•…Ö>/¿E‰½éKºùdÀë(”rÄÊ'É¥½é«,´ˆÀ Œ”4B_ˆ»),R!œÂz‡Lh©Ëv"L®$¼¡¦‹Â3¤Â'¬) lÂäÃ%¼–ìç+1lÃ#Hþ" ¿ Z j‹£Ë-OÍÊu1|º@j½1ÓÕ¦ŸT €›ŒFø¢n§¯F‹ÖJ®G=/I=(KíƒM=)O]Ô Ñ¹HmÔ]™PQÍÁ7-Y›¦ÁP)Ãߪ®Oª¹‰|)¨Û!F8z½7Åü¥Å€3‰â܉bÔ´/5S.•nÈsˆ‡h¶x½×YÓSxíˆhl&G%³,{Ø2» “DE”8ZÈZfÞÊÛœ,©ÑŠZKºá˜Ó2zvÕ <ÈKdÌ߸AôrUg }ïÈ[£=Ì£9ÑŠa ——ŒÐŠ\Ô6}®88¸MÑY £)®Wµu¿(Çùš,±!¡©{ܯ(È©þÌ·0 Ž«hÄ‹¸z¤C ³1¸3ÊŸòºË?Ú?9–Ý%¢ŽÜ}1Þ}Þ—«Ýš¹0tÃÿ£ŽâøV7‘¥+Í!l0l쑉³§Å܆_Þ¼=ÿeàZT`¶×Fø5ˆkt¾§m.Ά¨û†Åg¬§‰j|¦xoa,bVPÖ¤)–Ûš@U0 0ðÑB¾¡L"ýò}Ôâ/®—†Üë³”ªQx²Ò«ªÜ/º@pfz—3ÄÓ¸ÊÑe¦ÜMº¥;Ç}h(î'!w‚;¾<ûJê|/jß—öÚ =­hg0Â)X™Õè8‘ùË=]Ñ!I*έ  ¯•,þw®ånLçªÒ瀔"¯àúÁ‚y®Ð|æÊ•¢‹ˆY­€—¤ÇSæRˆ±g`ëT“„(n5uרGáY<.uz?µzR$‰ÅËasŠÅ¿‹áf>Õ).ðÙÏ÷­Ȫ\u:À —ÌÙø’ÇmîG€ ÄnìȾåÿHQ[˜›;èZÉáD¿èã[€PÐ [Àè[Û<ëíMF½‹çƒ·áŒ†·Pžè~_ã˜/îëÈlwôíÓüiÜ›v±ü¹Ü¦›1 ωa~ñð ÿ@  ñ9ДÖÌBFœßJÂbñ*äÓáZ¸†÷þÂ¥çéX^*Ä-Ì?Ê?ùΗnn2UàW´`ílÎ%9᫇Rº[á¶—`ÏÓF´«{8¯{qT³MUÆ›Ï* Æg<Š]‚>ÎgæíÉí)È0`Y@ŸðyR[ðUÛ"Üz·õ]ÿž_öçþßܽQ "ƒÕIÄ‚„Á 8÷#î$€äpÕi˜¸öƒz¿¿×ؘhJ¢›¼ïzéªbÞçDHœ—F¢#íHמ ýèoüqâªLš+§š¯ 5upwð w«ÿúªÏú¬û³?û°Oû±û®Ÿû­¯ú¾/û¼_û¸?üÂÿûu€ÓnwÝ>Œò’nu'þmi¼(dËr¯AŠºûúækŽßƒ»üáèÜs)ÍX"Ørí`^‰qcÏ &<’¸‰7ÅÎQÜþùaFô¿<ŠSò¡Æ1 ³k<“c¼§Q.J9”«c%Ê * Å9lH¥šq'~PQ(.¢ÆK;NT»CÊrâªE³²eC‡,gı2Cœ•r 5ÊèÄ«W"IšD¹%"ˈµ1T(s%?hpIE#Ó]©q¢¸h?4Zœ¡­fÖ†[Ð@¹óñ„P¬R‡Þ‘i”Ê ( »bŒòPjÔé"RÊצDŠ`©ÜMÚ.•«7õR½¹˜åM†ç^œ Æš”úþ "\Çn-ÓõÌ—áÕ†q].ÖXçUA‚Ä]07îÝQzß&X›¶îÜwëFþ[yÀCÝÎXìW£äÁ«eÂ}ݶeuçXSwý™(kÖÛ!ZgU¯jÉ©ÓïÅ>ÔýÒ›ï‰>Œ?<Ã:ð.ç‡4¨ ƒèÀã~ Ài3ÁŠBäDpÁÜ,Ð@ Ä09‡{ðÂ#̰@ÛVÑ #°±öÂÊ!Ë댥K´©æ• ð!÷¸#„ª¢j´iÈŠ^ƒGÐ&!óÐ& ŒÜ¢4², k¬½ª* *Ïx*IÐBªŒI‹¤BìÉçH þà‡jvЦš7Ì4&N»¨¢‹hêŽÍè‚Ï4Z¯µ¬8 3ºfpÒµÙ Žª\K’1©«.A1’Ó¼úÄAÊ–Z‰º%3{Ҽ眣 ¶ÖÊ᎑NÄ 7T±W=´¶ãXD¶Ããd¿–Ú»u%ú°*o(Ðö–Uèžmi[½´‰Úî°ò¬ÓVï;O2м]ï>î Ó+µkûʶ^qeª# › ζ“-.8ã¨ò—EÿEÆm«0XávÅMááLXÂ`w5–×€_ôðØ‹N¨?Ã{5œA‚(Œ,zA(6àË[ËÛ ¯¸4 #šq’H"K‚xþö#‰bŽV²G5¢©>¦f(s)¿ Òt£µ‚tÒË8«/ 4Èá)ÏhNÐA%oYŠ/®£­¶Hœ½|è&ègÓÖX%­!Ž:¡¤« E÷¹Þ.³Që<ÛÊd»+^ù˜§ÌÁ¬’索½Š¨n§Ñcw2›êˆG8nÑsb9†pa= áÒ1ž° èw#Ŷ¶’ŒŒîÕº³×\«Úª6Þè´C¯¾òâ‹—¥yÉN]ÚaoTð²[—? ED±uS¶B3>cˆ3xXÔÁG]áƒ6ØDÇ_=cÔ—-ö Fœ|NMÂ.S»³†Â8C5Ä$Öý .¯Ð†Pþæ¥&… [axF5ÒѳïñŒ TÕ­n&m,Ä1PIÔsª‡2QÅ„€¡ ¨Þ4ƒ8µ´€Oîô‘h`@ E8¡ gµ@}j3ÑŽ éÐ…¸å…Öê!W%'ÁýnE4"­Œ2ƒ¾©RÍñÖÛˆhDÑøm+wQJvdÇ*,F¤wà^¯<ö½eí†}il#ö:æ+^½NƒÞ*Ïv¢Ç¼rñN:ê¡«–g»²fy|Ñ_»¢uª2Þ:ØRd ±8¯hÕËY’AžTr Æ`½OŽsÖ¯ú•ÆÓ‰oa“ŸÆâGÇõÉoWÙÛžÄÂ':S¶rA A#ò*ÝŠ¸ÃHZþù2*Ü!P ×.c™ü2˜>“P´á‡Ä£›¢äÑlv+PÂq ZÄIƒ8P 4ˆÅ¦Bq˜ì!&Ú9Y‹œäN_Ó=²@ ™q‘ ÚW¼,ÂMœ]ˆB»P€t¶&>*¬ËÞò2»mMeUhBšÁmU¦jPÐHWúçÖÔ=hB5šÎŽzjIW[çîÎ3Y•T6èŸö@×>W>LXsÜ)ù8i¬:0ŠVÍsäìÞ’>½K©Í³$ï4—Ÿ¾¹k[à!KE«S6àL«IrÈð¤6ÆéI+_å8!*sÚ õý4šh}ÇøÊ…ÒbíÐR´þWO²Aü,á×Ö»âT¨É‘‘ÿÈ—ÓÔåŠÙÂN^æpP–²CpH_ 3½Å$šI©¨@‚hÄC˜Ü#f‘䦩€)#"¤‚ãPuÎ,´·…Æm…A½¼J ¤Z ¼0ƒÍæIÑôõ£]ä˜~Ûß›F…?Á Šµ ÇBs›Ûì–‘õ<Šá*Ò¤|—)×]¨v ÀÝÝr§"“kˆQp^7»áXo~»ÛYV=Š…:Wu´Ê—Rá¦ã³ëÆ(F˦ï°ÉjÝ+‰%!æL«Œ¹ëX]c+ï0¯¥íÙº É- ÷¥F">DPìP«fkyŸÙ¡òþ¬ÊÎYæìƒpóŸ+«§†[V°ÕÕ•z]‘Ä€,#ÇuÂp,òOEIdÁnOu¢ôä„p™;ûLž¯ÕHd}RYpT³CØÌ+² ÎYi“oa>ÁJ (!>)jÞT§^E±hPhZ¨`ÛÛê÷¶¸Õ®6Þ™,Ä-‚D²p‚æ`t6à ¼Àf™Ä!¼¥‹Í¸<ƒ"Ø—»Ü-4¢ÕÃÎ7]Æ}‚A< ŽSúÐPiËDþ{¸x–æEµ¡m]Uk0º@ÈP„'´˜yÐrçÒ8€”èWýÜŠJ%¯²D ëkO›$ËÁ¥<–N&eÅZÅþùÉx2Œ‡ÁSLmQT2cµv¨#]#(oîäŠ%Ëb©Û늚DâÁ¥¬¬w›­xã‘õæºV»÷=Æâ˘Œ‚›ÁäFîo•ø8ž †øÓœmÓðß5/Ûá¸È&ÔW]#Îdˆ£õ6—?ÃK.œŽ3Ù8û—¿ú+¹ý{9©«¤ ÿ«$ÀùkÀÛ+¹}ñ¿ô1(Ë)Nº=Ó@Üó)ãH¬l锳!¯¼ˆ‹-°‚W‡‡À»Ù ¬«`³kÙ³×bDAH‚—Á;(p€$¨†T§²ñ¯mrˆ…ö€Y‚%dÂ&‚µ»1@Y Ä ÁGËþ¦t8«&) …Õº Pé È›(FJB'DCØ[Ñ5‘‚Î0¦PB4lB5\µ¡ùr79¤Ã:ĵÀ€ ·[º‡vX‚€ƒ†#ð](;x4°Ùˆ‚ …(Øx˜EPppÀ5ð‡(‡°5°¼º¹Vú=Öù™»À(ª±r–w›•ré0xS*€Øh¿;ªl)+a´’28û°]ú›ê‡0P*0{p UÙÅê2€;ƕؤT¸—C¹¼B@Û€¸ÛË8ˆi$˸ˆ#Ç´Z8À‚+ÿÀ(#G’;¡z”8ú;GŠ«GþÓ½Ò*%Œ È*+‡ûù9ëë9¸»È‚;X·‡W¸ƒW8 à¯ûàºòr Ð;pð ’¬¬Œä/ŠÜŸÐòºih/T™Ã>TCsr1¼Ÿ«áz‚Ùð y §J"Ác¾"œI:4=¬Ð¼OY¢çˆ¾3ìÃ'ÜÈøJ½8Ù¿XÊ'lBÓ“š­.ø5X†S@[Hn0jd©_HKÕãÎA+lcð…‚è„5ˆ‚È€(0DÝ;Ly£+ª«0J¢–a1“L=Zªy#5 ¢v+0ë+«è«ªÌ9”FI i‡þÀ·!pIlˆ[(5`Š‚œÓ‹þØ?&G&[@¸ª+kßüÇuôþ+Ç+μJuÎå$Îü“¿ÝDÀâä¶€4% Wl˜€Ù2ýpœÜ¦ÇPƒ ‹´ÈqÀÈh€ ÜŽ!LŒàRƒj 3¸HËøä4—ð4¤p´à‚É âC!à€Y‡)˜…\ë­ðz%)¢` Yã¢8‚Õj ˆz;ò²3’* ˜@PUÑ?t óü/›Y¬u¢Ê]ÐUª‡Dêº;ºÆMQ]Që (d›• € dªŠA„ F½ÀDMÄþÕ3€'(EPÊJ´":ÈYJLƒ¥^1¬rÈEj §;F+@Ò°ä5ed­j!£jÁÓçÙª¢¾Àø'* kPqaà-P§&}ø¦Ð€b4Ãÿ äNǹ:G|T8éÜ?t¹tÎOU9Ns<9N­¿UE+R ÇxœG•‹£Æ4%Uò$+ã$Zì³ÅqÆrÉÒm8cýAµˆ†h‡•l”Žd¢¿H‚cUOµ8,hVŠTŽ¬Â‡(¼öŠ‹$5ä"›üø’¨äy›ìʨ.H§ƒ¸)` è2 m•Q™DRJþå¢%%ø¢"µÌ›9Cr"Áé¡­”Ó3¶‚íW¿¹ƒ† ”W˜z“Ò‹R³µíºµ(J0”—J·óÈŽŠX‚e¼¬’L‰õ!Jñ ñFË–¤£¬‹µQ ×]äÉx¤ÞšwóSâ+¦Øè)óe߈—YÅ$ÓTfá:ˆÃna= ¤7-ZMNž¢ NYžµÐø.ïè£V‚ ‚ø‚ˆ(‚‚+Ø a&f–03Qfh–t$[10Æ\‰Û«TêNUŸ1béf'S¥"¾Àû=[BŸà«]å)X,y¨ÏˆÿþiËÈ×ÛÁÂ,¾‰0È Pq &šŠz€ êp³*§*°CNÁBiqSÕ…”»h§&6c™¤É?Ó/ÜÊ¥K½‹_õ×娭h솼Øçè5)\+±ûQþ‰¼ µÞ¹¹ÁJ%:Þ»ƒ‹64 Ã"²)j^…vþž7ú$Vô@µ$tÁ¤ñj<õ’Ú±j\v‰Ô°T¡>^Ñô°œm"æI¦'ÎE§ZŠ{è™›oôáâÀ2!N£2Ï0á ©\Uç˜%9R¡bLvOýÍ-ƒ—ؤ[yJt¯åý 3À!¶ãV²qëê½`Ê>"™p-èýþb>¦8?6NØ^2)%YÒ  €4fXF9í“ÑÅæ˜ ÞÁý'*²m䫤ÜÞ!ã V …Êó,¸Sñׂ£ÈÆb7©™Èz³ÉÈ•ŽkFyÎ[ùé1qî1]åä©´eú²`Íœª®¯bë0OÙ9ös5™©È^l[ºi7ëkË4Æ{îhÛn"†pÖ@Ö¼Ýî!öawnjRÊÕ+ÛNþ7ðžŸ¡Òæ(ø@–Ø$Ø”®ÃÕh¦¸†€Œ]: f¯N]7q6• 5ªêem5륈â-éÁëÑÝ2¢"€¬uì‹öŠçµÔÞ9Èþ#W±×=Ã>»æcÌïö(W‹>ãñ–ª®8=Nbs‰ë[ªü‘6»ºnž¢#Ƥëcy#‚tÙbÑp?7k¿¦š÷®®†•òãÛSô~ªk`¬ðïFém)W`1Š  ÚkfÅÓY̡ʲ™ã@ƒñN^-bxvgçÀI÷áÃFñœ|1ó|,‡ú®› -èàÖ_6ô¢Wç¯Ï.kcÜj÷² Î Q¼Àå$\nÔ• n߆ÊFk7©újalHPûíõ€LðȰx©iÁCë^q˜¶‘‚iÈäp4š%ƒÅ¶¬áhó Œp‡é6Üh–šÕ·¬þÂ"›=Ú="o ÷É4káUél—Y±Åâj`½Y{«w¯’¢=$£:ØUÂö)wÎÛ/ì£á8âô휰Àjç*;ìîÎá wêîÌBSÖ€ Xyµ=nw9q½ ÏU—Ÿn”7Š Âæ[øF ¨ %ÜZ>èäY5-W4«¹‹_ed$·—2Ò¼• \æ¶T%_t¢Èçwz’|¥·ÿ^7é¾^þåyÃw>£ïy0½aö ªK/åˆÇxƒ¨09-©˜²_¼ìøe +«íP?=â0H*ï¯Va³& ªž_±>F-qÊ€kp£øºnŸß½ÿÅ@½>¶ëþNê)¾>ð WgWsÓ>޹Ÿ‰‚ˆþØ ßú!Õ7˹0ç° —Ùž1£²zH)hýÀ0àÞ`tn›Ž‚D'm1ŒyyJd¼vQ>ÝÞúV4ŒFTo=êÛL¥òòBÐe¾B×ÌEÉ< \Jõyú âôg„ô¯ƒõg÷Ï:hÿ:‡ù—‡õÿùgùwøOÿüFuäÕ©#PžÀ:9 *,Øð C„æ7ƒŠ8*7nÔhQ£Æ;3θH2dIŒ3Dz™Î$•—;šä2åÇ”+aÎÈøñ$I˜>kö¼™îfL¤AAžìØôhI–KuŠ™Qæ ¨ëD)þçµk¹®`”#+ökزhÏžM ¶«Y·^ãÂMK6-^ºv×Ê}Û­Z¿zãÆ[÷.â¹råÞ=«w¬b²u¬DÑ9#G9‘OXî+åŠBeùr£f«if¬¦ #å©;‘â¤ms猱uÞìˆ5¦S¦›­P9zF4ÐÚÊmÙ|#IÕ8gÄ!žübrq±‘B-Z¸R¤®g|Þ Z´Q¥6M_Ä ½zq(æg,o9{öÉßy/~\ciÓ©ä{i†Ñjâ å“s>åTQ bÄ „QX!ƒÞýÔSOB7“J$%ÝP,íÔ”‰4Ù"oTÝFÅ¿Ý'Î<5u[{þÕ¨"j¬±¸SKÉ$cx.>WdKu”åØ^mÅ¥Ö^P¦[Šf_‡a™X]WªõdcWÖå”~™Ie–‹iy&–RþÕUè}¤$‚UCœqÚçTp<öV§8wj´\t6ˆQL èšF”ñTZNFõáF‚ž nçU6ˆ9YVçw3X š8Æ…¶)‹ê±ÕRY*É…öâ¶Ÿ­ÎUÚ™©¥BZ97‰()¥()ꚯ4ñD›VŸòW§ª¸òÖê©NÛ¢µ}Ú&œ}ÚÒd"mòtÇ~)"  3IUÒTZEZSŽj†UM ª­©-+ÓT²‘8~FQÚ]þª\yåe•Œ½ù_`.|eb‹=ÙV•AŒV˜w9q™MZ™X˜¯ù—^ÅùƒI˜)5ž¬è=›Óñ #o¹+.ˆXz‘t0 J_°6¡˜ÒÌ¡¶„ìgµ4J;·$ˆà–ÚÙgU½\æ·ì·:å–'yç]hÓÛZîFœÅ š@ƒ§âÙ\û˜Ò¨òâ;$Üw´PC -ô÷Þ>¸à~x߈Þ÷á…žxá (#I¬Ò<7öíØ­Ô Ûl¼Mû.×áÂ],Š Øµç¥gMí‹AÖ‰Ù˜Ùf˜{ì±îK¦yfíF&›·™p—ºCV%ò 3‰þð–“¡LÕà«ôEQM5'p‚÷áw?¾÷ã›/>÷ÄiO>ûâ»~ûéö=ûßÇÿ~ùïãyœ©Vü`?þпüÙo<—êIËè÷¾€ú[›Fú÷?Þ¯‚ÜŸFÈÀøY€‚Jš¤ÌåŽÔáw0áâq‡¦…&Tá+`Ôªp…(¬á sXCÞ°…¯Ø¡Y¸CÒÐ…9D!õf+JmŽ]ÜZÝ£8G©ÛüË;äÚˆå¼S§A…`²U³žÓ#>A]4é¢ê”µÅ¬ðˆ„bÂØ–º8’¬a脞 w;Ètì{Á#HÏÂ9„+?É^æ2’Ìñ”§Ù)PwúSE!¨þ§F5êO‡zÔÌ õ$LªRŸšÔ¥ú'‚ls*U}Š”§ •©¦‚fQuzÔ¨Š.ª=õ•Uƒ:U¤nõ¬[=&©XÖ¶ªu«Ùé•uFu9%á\©á"X»ÔŽ,†ì %ÅÞÎy)ÇÊR­N%)Z—pDr”aeÅ>Ý© ´˜8©͆`X?%Õ,k­V'œ½ÏJ„Ó#´‰ðPʺƒµ¨7H”z©dXÚc=ßGèetœ méoõÒŽv)¤.u“`TJ&ÉìF#6íHn’6ÂqHB®ý®êÚÝñZh»äå†øÃ¡™@¨¼é*¯‚ yLL ¾ðÝ®…pVd†Í¼þ÷]Ðm‚b!IÈ8Ø¡U‚º5^hÁW=†+¥Ä˜^1¾·ªßÙ,lÓ5ƒ:Ääîq·;;Ž´žòD“s›o)ôZOÜS…+¼!I‹M¹Š?×X¨‰¨¡+"’к•”eqVÃ9ûÎT0£&…½qJ…ýmÑ\¾ìŽ±Ñ…2K#ëÛÚ]9¥zŒg£›åÅœl#˜iNÝZ K5W’—¥¼6‹yM7·’8¶¬3/³¹ÌbVµTça3.Ý,hKZøR¡‰³œÛ<çQBÐχ޳žëLF›*>‡–3óÌg¹šn'ô¾üä”.oÉLb¬t­åâæî+“íM¼:»’Q”s¡þmåL';?=ˆY¶…ÝŠøƒÛôÆÜÌÖ°…ü.•¶UɈÁZÝj2­:aNN“¨I*Hz69Ê1}cˆÝdênoû+ÒŒÅì2™(X3jd™¦Ä"ï(лÞa‘·[ØRï΋Þ÷®·bëíïÏ[àôÖœ>ï{3ßö6x½_#+ÿ$³áø¿žï{wFVò¥ŒÅé­pƒç»ào›¥Aþp}÷ßÿ÷z Wí@\á!7±Ë£€ðëè—SÅæðµ§¼QYiÔpl5Ñ ™…ùeÅ|]£Üæµ*€µ8ÈDsfh”ºO9[2Ž{]ÒÆ·½¨hë㋪Ex)‹vŽþ.Ñ/Æ0Ȉì¥Kñ™”;ôROÜ¥vÒ¸³]bBâQépr”g™ò*šWÈ$CAÐãK¡žJO‘‡<ƒ;„d3Âg»qPˆ´¦µéTˆ w ›Ò4Õøa¾»¢| 0èhÿå÷'!ªÉ䇢“WaD‚îµ½íq?!È¥n³g÷aocÇOˆCÆ·íg×>»; Ø,Çpiݱ æj¿]ÊLï-š®—!ÔIµí)Ò‡r­#Zk(\Ñ{âeí® ´³Ä(þ‹€(”˜¨Y}² Ô@ÁPÁ”ѬNM]Ç”1—ß<}_ñV]Ç<“Õ“âE&Ý~ß[þLÆØ¨ŠÚôOeTËt ™®i Ü© ŽäŠû1ÕèÓ`Km`Ë»Dà9˜ÇÍð ÑôI¥ ¬$zK‹GvMÏÒH¾¼HYÑ„0R§ý y=•8ÀÇ ÃI|@€>²´ 8ÝÅ-ø?€BX°„E!øDBY,žCtÀ 8PÂâ :Öb Š ]ÆF9Tħ@TFˆŸèWh›z M±Žú“è<^g™"\€XD5ØØM\QLì¶ÀŸ¸bŽH ·DJ»Þ’m ˜=µ˜pY›‡u™ˆ•."KO˜Å]ptÆ"±Ûþ‹•DöT×‘Ô ŸEåmì€b«Ð‹é½†ö_ÔY7™Õv´ŸÕUˉJ9ª ì¨Wæe;­Ð^¢¸àÚ Ë†T‡£e °Lc%Ò"ÀpDÝŒ,âÖûÝËeüXt@ˆ… üá0Öt+D/Ø@HÂüÀFF:ŒBópYFáÜÈ !¥…ø¥Ö¬Q]®½ ŽÙVÀÈZÌœŽ½<]T<…mU‘N"áèPÁ; ·ÀE¥8À=´Ã (e;P¨€F€+ØÁ PÁ@܇+’ÄW€øƒ.8Y^DTN¥Ö ŠÙ2.r•u”#¶å-Fþàð$bJ£rõ]Ù]ŠáÅL†ÀDºÍ½Þ,jËxÌ`bz‹òAË鉃Œ†ùá£è ˆEÄÄESÒˆÆÜdÀ"󱞊¨Mv¬ Íõ Ú±J F gÈ!‘$BÑ£äÉlž fʾPH7úJsI, ÁÀAFàtp”$ÁìDþÛ&à€XhCtFAìC9T§v’BTgb1ø.„Å"¨8¸r!Wdùbp‘…ÓYÑÚñLI¨H×½”¶x‹ˆÐ\¢ÔÈæ€LR%€-ˆ¦-P$d%3dÀQšÂ‚–„‚Âi^è‚úBRúBSþB¨„R¨e›ÞÝ¥òcÐ Rà˜YŒJj߉ª(«åJÁ(I)dhà &T¥¼†;Ö&˜! ©0”U‘]£3>G¿tZm0Šç9#*Xo8”Fä`¯šÿÜæ lDÃWåƒP¯ÇÕ‹@f>ÑIdÕœ#e=ch. qT4Ñž®ü&7þ`ìYØl|%‚ P1°‚sh„_­E\XÔáW¬{ŠÅ¢FPBY¥Zj`ª[0èÔa¸À<|›Êݹ[¼ê «ªŠ¬qЬÍMNâW%âc²MÇj¥iPjHåRÀ"q.(Hç @€€Ã°@þUV¥hþ †hˆ «°‚ 88@NeN´EÙIŽàq•äöõ~Ù2ƧG…¹ Òóô¥IöÝßißá1ÇŠä×éehâLBdL „Á¼ Glná# ”‚Uœ¡Êæµ^fªG "˜ ö`Fl:@A7lA­nã•"\ÕÌž¼Þ#giã¼Rþ Èr)B£³|M\i ÜtJÉG¤ *ŠQ%2ÐH†‚¨F’… Ð[¬„ ¦VxVg9(mxâ@™pjD–ƒ1˜ À•G`vÅ=yôÝÖÕ±H‘õfa޳léü„&ÆËid¦ŠP"hþB6”Ä14k1((R ë xÀDŠ‚ºÀQ–͆êíà†¨ßÊVI(½'ø±I …×Êè÷iYŽj¶I.Æ]ɬ¤·åe9H¬a!ñh†h„0¨‚pëFøÆ.ÑM0ÊjZÖ·,kð…NÇÂYÁ؆rÄhŽf®ÊÄÐ9v  9ÜA5ÔA˜ú&OŸñG7¡ ,"ìÚaéq´Ìô4lMfçð„bн²›•zÊ³ÊÆì–cPª RA-d€ma„_™tg˜… „$€EÞï&†aÎàÐ|ïõ:K­U^}L^Q¦ ÀÐ@ÎÇú’rX&ƒX,ÜAø¨qëX¢ÍÂÕ©À ˆfÏ>2ÆÇfÔâýàoŒæ¼aË¢†þ.f*!Dä8rRü„sv;¨˜BW€8'@ ,˲)\ä À ¢0[ªþ`9êÔú²Êo™dd=ÌßÕ‹mÝØEbIÐÕ§êˆ ÚØÆËàLÖiNŒé”$2Õ†U°íË"”Ñdkm( ·%ã—”ä~›I6Ï2Fð;Ïaå%0®¤#~YÄÝÝ׬ûDš™/I\‚6TÃ+ÌÀLtYüÀ¯DƒlŒGíb&A˜–QhucIøG¬!tAk„+€+‚JRru• P9¼Â ¼B4TÄ©wX°¨hC?2!0Âó†-9RAyÌ^4aouR·ØRg©|8Êi¹Ç°"õhP÷#æßeRõ)9™˜‰œÅeœJÍÅÀ½þe1Îó‹ÆQKZFÌð}ZÎoLÝšú±]´ÈZ’ _t*ö`o¢Ìöæ}èm4‹V¢æíŸ8¸©R1ŠNÛ"Ü9Vº9q“èóÑ-݈y6×Ò|Ú¢Z 殪DnØ+ÓdDì´D“…8ÀD[4`ÀŒck‡ÔGÏAðF2iý¶n0,·,(T„³Qº4® ·nN,H„r÷€Ï è€F«±ÁGvÜiïJrJ;·ÑlÈ×,¡ØÀXØw†Ê$‚yƒ"S¨|ÿ˜Öˆ7©°àN ùÎ=Æ<’{úŽ?óevÇTÄþ“±å˜XÓ¢ëÜà¹ílþñ KŒŽ}¢Ý:òFb`{ê\ŽýIP±Ö’›·']nŸ•™”0¦Ú‰×€?.²Ú1ŠkÛb,RlKÝÔñE„ÁTPt9\kE×Ò$FC$Y„I«ŽH ÷`ÃPC&„´Ÿ@i•¯Dq7€s?•Qª4S¥ žüÊÇ-)ä¼Dïô ¸®|À˜ ¯Œ¤ï­Ñžf˜yG¶›žÇôÈÌ‚ú Ÿ9iˆô^õÀñž7ú†’NAÞÇÙ–pO”÷E ¼>`¸×µáåy«a´$8ÚîOnzz<¡¤Äd¬R¶KRXð‰õzQXúms½\!5Ž_M7þ >ËOL>'¸2v[ò3“àÁ%1.´‡za¤ÇX ©† |o‹¡¦ê™ `Àñ\\«DþÊ+8¯o`pÓÔ‡€̼Ë{ ÌAD2‰(l##ˆ[tIÄÐ@.h¬hR‚K›ðo·ÍVÆEp‚ˆJ4xOt7=dÁÆEÁVRJÄÎWÅÐ@Ð@¼À|Á+ÔIÀ[ïÑ ‘ƒHÈ|É—üÀüwkXzl-Uœ«È›<Í4TFIsÚ4çÖ+cnäF®—`.®ÓÈ ÞŒÃÝAÇÎÖýسü†{ô_6£Ͱ©Ùh"?ñZÖ0›ŽÜþçÊÈùÙ§Ó$ÔHŸD̬‹Ûmm¹}®²ãsŬ8"8¶Ï3—6L%x¹ôÇ>‹KOØÊĨt4@4ˆÄ\«å;À8@I¼B8$5›Ãʬƒ–g¹¼—¾Lõ¤4¦Ë nÍ¿þÀ= »4æ&¬ôš.¨Ì€NƒOD`€<Í€|@häÀ³Ú‰P4E)Ù4%4 :ìÇþ™Ÿ–I$Q DÿôSÿï¢Äé}Õ®ýöKÿô˾ÔA’…©„Îô$’Ú©¶5ö=ÖÇu`‚ ‹V½=}½•;¬™@P™AEœÀ‚g$¼#!ÂtgÜIHРÁâVœ8þãàCŽ©<<(УƌQRL‰påB–7" É#È޼i“Jrå~ü ´\”¢?5zTéѤG‰:…Úô)Ñ¥C«}zjUªH¥Åʬծa…žÕzÖì×µ[‘65{4‡•r CÊœqЏp?¨Ø¥¹å(P€—˜1ÇWY”x‘J5+µÝeY €@‡†„­)´LÐJÊâA+MvÙ¶¡áŠ J bä;ã/ÁPĵN…ÊYNDÃcÑסœðybÁÕ'~$,.øãG´g×¾=[w^¼«£ý(>°æƒÏËF·þî”5÷²‚Šã/9×F*(¿ôl[/·Ólò®¯øîkH¯ÔÊᎷÒ"k©¬ÀK­¨¸ZË­²N QEËŠ¢-é>‰`’è  QÊ‘¦pz @Wzi2÷6«H„€œ( ij(AeÜ1'#©°qGš†ühIšL(³à"ËC[D«Ä1?lKų¾‹E®FtsLë:ä(8åZ ­¨ÆÊ“M¤êÐ&Šš\î;ä¬ï ¤Xò°:Pì0…ªÉ!²ƒ€ä‹5×TªÈ³F ´92áŽ$š4!³ûX—WaõÕYLs52¿“o@ÀÝ/öÊ"€À (fþ@ö:Ð!áRT¥†‡Èþ¶dÙ²‚ÈSp!8ïÜs!Ð !Nƒ‘/qÂ×nʘCõhr*(öˆ ÈAÚ2×ùxµÏÓÏ;˜/O}<› øÏÑ=²²h‘ÕW0ÅQ~ùÎiÅQÂâˆÃB Ê2¸–[züàÎ_Nõo\zÊîܱhà–¶¨|í§<ŸËÊýÕkÈÊGR¹tdK_•tô¾N)e/™[–r¦£ ðH:Ñ˽xd­I&5/ÙÒ¶´/M¥L$„ˉX$&F…-o’ ö¢´•ÍNXKSš´v&?QM*zÂÚ–¨A¡ÆJYW»xžŠ¸@¯XHAÔ0„t8QpuxþVyT# Uè^žÙ Ð lp‹nR§ð³ Ή`Á.€iŽ §šÁºôEùô*'¿ñŠr$ë:@¹ªpE†à±8ªŽ:€6 ƒc§J¢©8‰2\$'YIJ^’gÉ•qÕ+ ’’“%·8ˆ/}áL~T FžÔ¥¨1ÍI1ó‘Y†ÅNY 7J×…r9³š±,™%ÑNx‰¡„lšR`wfòŸ`f3Jþ» 6'“´ˆ˜Hþ²c}˘4Ä_â¨\à9âð‡hË yxO|ÊPO_›‹ŸÔ>©iOý4[™¼’6ƒú°u)Çþ-ò¼Ákz €?ªñ ÞÁ‰\Šð&µËŒ™6M£ 4b—º ¾7Èà`K5µiç8püÌQ¤”±Œ#‘˜»1¤ ôx=²€È-µþÉ ÷.c =ÖI桤MkŠ=—SBÅH¸VuÌÎ\«8…PÑ>².âD>Ê©ˆ‚ÈzSÎå­¨‰CT½G¤t-ÉÆìk—˜I>\Æ,f0[‰Ñ0è´g†šïƒYcç¦W´–S%(!&/K$V¶—ÿâ¬e;ûY]Þ§ªb5`‘‚QÊðk3uô œ\X¶;¡iNqZáÔÈÔ51ýð†+¼šo{xЀþVM½=[BþÁT‡DiÄ#5ÑÔ_’žÔ Ñ8Á ª]ìF#à¸ã¢V¡†pg2y:Q SUóŽZ\îD–ºT6’’ r¤ã1ëFpMϼ^È‚±~pÄ!4(0 lS…-têPÓJb§_ÈÍw«ï P ´¸^JØ4>&†Nù.OâˆÃð°FˆGwél鄿6/ëÀ‘|Ê„f)äWˆÎ›PúäiÉÙ3±ÖU%tI—lÞR¹š*-€‚¦d % Hâ”ØeÊH°•“æÞIP¶­ðO²‚ˆúÔB}eN.Ä-‰Êl\´ýDóÜ'ˆÐFÛµÔÅ5ŒÒåÚþŠÆt uV4„¥ƒÀrϤÈåêƒ#ÆZ”„àŽNæs™ú ³Ž5qó,ÊÒ%ħ— [í–Kaâ PPjº Ü$²;j¥W•CjŠìÚÓ" ÕüœfkÀL•<Üe? Ë "ät’ž )Ù^7Ó49”ge"ž|Ë7ã´4elÐ:IDþ¦iµŒVFv#=­MKsÈNšÙ@øõ²nÛ=2 mUa†,i‚ßf`!²ÍŒPÎ÷Êö«e©­ªN¢\JwP%•{,8+[eøiþ?¿Âû÷?B²Ç·#gqRÄ)ó\‚v giïÝ“ŠŸˆÍC‘øno/gz·äÀõgïµ–æƳ t¹AǼçÖN»Ìw¾×É“ÎHX%aÍ{:ª¶ÌÛ âA —4|aî.ކïVk‚ÈœbDÛ€FŽô4C‘þ類p Éà­ß ÞBõ¦iÉË<Å¥üj22Í/”h¿ÐHõ¦ûüгTŒ­(jPŒä“hîg8¨Ô‚ÊeZ ƒÄ)±ÔI³~)y‚š Ë—ÌÎ=(h³î°ZŒÅ¬…‚8ȰÂí£©²¼‰Þ¨§ó®‰µˆ¤Fƒð¢€FK"‹z(KÂL –‚ÌÚ„+†ÏâjO ƒk DŽ†ÞÆ÷ÔÌÍÌl†Ò¤jþ) ‘+P¬À ´¡ Ͱ ÏP qm\ ‡3àÐSÎ ¤ G ðì8)˜ˆ Zü5V#º~Œ"é"–ªÓš.V®~ŠäZ@”«*é’"¿Þ%çBpƒ ±qþâ”öQ†h•4ñw0ÄÚJ3šk´ ±›¦E@Â¥ðÔ)Ñ*õ´Éhl"ɸ_PúΉŠ,B†Ðî´ò­‚Bríþ×é².+¿ÈÅÇžF)¯õnÌÕÑ=Rƒ.¥Iˆ#¶R_ÐßNK‚à††µ>‰Ëí˜pQ×Èó뚦¤¨€ê2 ¾ê¨ ä’ΪڲŒ-+±ê k>N‡òìáêD†0Žâògk¶ªâ.ŽKh1­ãl¢äÀB¹tågìª/æÎ'!‰‹@ ®$4Å“þ‚¢Íì¶H@á^B­ä.‰ ÂVRA@M&TlØö«üîÍNðì0qR'ÐD‘ß„‰½LI@º'&©À¤Ðò³R£,ŸÓ«Xì˜ïÅ숴²If榹IlñÉ:È_ŒŒ,Ÿ(þ˜¼-G³8÷EÝÞÒ°$M"œé¥®SfÀ2Û¶ìH /#Äp@2’ |?X !8 4IÀìà>@ Ø`_f³"ÂL3;n ‹K 1ÎO¸M” ÊΪ0ã‘1’ i‹)E3öMè.Cí0I¯#Çç®0ÃFGÅfs-t:Sj’QœbIî 'qèÛÇGmwôHU„4€ÞG+‰è{ jWæYVå"4/éfðñƒs¯Æ²>ƒ)ØS‰¨2Ül,wžÒHŠ(I2Põæm™žò*ýl#$ ѳsÇ(ÑmòüÒ#kÒËâ“•ôT ÂBo~<þ!0*".à#^áìASÙ€uà:£ \  òñÄéKb‹â S*·:D3³PŸ¢ ¡0÷à¬E­ã~• ñÌÓB.”KJiÒÿT“wæí˜é³Ôj‹N¥ÄfïÂÀy\0ËÚ‘´Ôª8‚ªW’I˜¤k“]¤åg@v²ÝN"å¸ÈÑîÙøóî„R%Š@ö7·M<ë3MA"ÄÄ->‹‘hú4°N-kr)¿í³"µG/uué:ÈOHÜDÒƒ„;ŸÌ#qÌ›ˆ 8Ì®¤)µî@€³. ø2"0±z®%!BÀ`@¯ib Ç,kî¬1þ¿÷°ð0ññ ÙlŸèøê‘hwuD]4 ƒ n§ Š!` mI׉[Le4eûšæá 'Òä“Ì”2 Õ[Äé†ruJ0„œ§|läIÁ#&1½rP%õt©MIO&’Œ?u¢n BãšÌ–3Í‘P '(Û`,S«'± N5S %RAˆã-`aÄ*?vJÁk$͉Þ³nò*â!à ß(Wc9šÔî`!ˆà@‚2@p—IDê7òr|7ïòµó|Bl†6)zumœPik¨Vcu ˆkãf4 më ß,ùFÎhõ,jT Šè/}éþ'U©a™¬f¨ 'Ñ­fR/PiâepSÐcâÚúÿ®ÑT×^3_ÜEqƒ‰ÿÒ™NÅ6uêø¨È´ LÄ#Žè[ KÃb¬€î쨀ï¼3ÞÎ)mwdy¶[K+Õ”53–SŽcót#p±€ÆÇ’qHÉ˸/k@áó/Lá ¬êhŠ@j€ „a>À:ãˆëÈ#¸BT@ ü¡ ,u;1ÌXô 'î'^ÎB®h÷±Í³D-NÎjË…D$ çBE³7ïÉ¡("}éïÑØE'ÃÇÇp†'CNƒO·Œ¯*ÖKÓmmtO3ÂËæ•2‚2åþƒ:GÊÊØ7M ^vEK‡PÔ/5y@ÈwøNu°'L“0¨“']°b¯T]‡ v‰ñ†EñülrñàÙk½r-×/ŠÈ!ô0´¼öa—™†É­QaOIy‚¯ÖÒ–R°lñ3e/r‘9 oÛœ’!SŽŸ—ãŒÖŒ_HlºpÏxŒÇ˜‡¸—)b”NÀ÷*ì¡Ä7ŒOn\¨€þø €Tí'»š ›ï ¯ù ÚŒ–» ú¡Ú¡#ÚùV!ú¢z¢ÚëÆõ0š¢3º Ú áö]„ ¤/ú£%ú¡ç[Vî¡az¢eZ¡9Z(—O¥¥SÚ;Óbþ7–ˆ1…œ/NW¯¨ëô‚»ÄÝR™?Ù§çf×v/7©Ó’î¬õbÝ5JIw È(/w4ŒPÿµKl°J]ly£æµ*SCž«0Œo ãÉäÐyXÕ,3­7øð‘œåXDð˜|ŠÀI࣒հ°Ó  ×p±û 1§±;±û°{ Ù00;³-Û°+; 7J¥E² Û²7{²Û²ƒJz<›²;›µK›³©à$Ç£³I[´i[´÷îÿF›³#{µÏð·5Ûë8Ђµñ§ÿÒs•æ¤hRy×i+­Ss10tývPßGÛ‹¹{Y…¹´I‹9™€‘OyP².óˆØþò`ÌNí)ylônä”VNê8AN(6.z*†â,hÁðž$Ó2قѸø¦ö(â†NëH¬ 8/üØüÁ|%;­S¢¦Â©ÄÂ!N ®þ+Òýº¬‹Ò-]Ò!ýº2}Ò/Ó7½Ò/=Ó­ Ô%=:"½ÒE½ÔIÝÔKÓY]Óc@V}ÒA=ÕKÝÖiÓ¥Ó5½Õ{ýÕgý×M½ÇMÕ½ÕAÝØO=Ò!](„ÓoÙýÓ}]Ò‘e©Ÿº»Ûbe“99@óâàÔ¼;'tq?èaÃÚÏšYËg×—.oa¿TÈ–$Þܰ“c¡Q²zY=õt" ±cÇKÔOŽïXжØYžkuFÅbO. V|C.ÍÔ¬À»Æâµ—i*úxm‘ç: ;D~äM HåQÞäY~åY^ä]ÞåG^æEåKæI>Àþl>åaÞæwžç,!pþç[;~~åe~毣ŽN¾åUžæsÞç‹;bêq~æwé¯>çEž ”þëu~ê‘þÌÂ>ëÏÌë}²K†+O*á—¹Àª°½¯Úiþ½P¿öœÄÛì˜ô^ç½:§ ¹!웿r¼kr*«ˆ—“eñHoÈÚIöòF3®ŽÁWÐa¨U4+ô鸪P3‘oMî;1ÕØóõ:,j´â`¤ Zõµ¨Ãã0G+Z[sÂc_ÆAü#QþpŸÁËG°|_Ãy¿5ï§Á‹ßöymƒ”ŸÁQ£öyŸqÕÇö•Qö«tú§ù™$¼ƒ–ÃíMöèþ–Èv¡u<»ƒ-Ø©™Äï~“>%tñÐ\þ±ñßÿ¾º{Tà‹[ˆo9b•tÅÝ™ŠÀ‚ ÅQqHpàB…tØP¡DŠBœX1¡Àˆ#æ¨Ã¨Ê:òRÖ9ÉÒåÉ”òVÎTysåË\qîßÇŠ-ƒlì˜bäÁŸ÷">ºrHËy²Ž¬·udÃwç¦Cì±ãþ;­kžq°5âÛ”^™âqÜMwF¾8öŒÛ$9ŽΚ3æÅ ‰ _h|¡w„ÁÝBÇ\$ñ;ÙÏŸ6Ÿ>ukâœ×µ®÷àæq!ï¦^¹õõ_®1÷—€ zÄ`úe˜]-h—Gîe¡8¶%W[:7¡†¦%˜Øb:7bƒ æ`&¦2æUXGÚM&]{…Ýõ^~ß ôuŽeöYo1ŽH$]׸w9*)~ 1¢‹TRöbl/6™Ÿ`R¢v˜—¤ÑÕØ‡½ÑE¦tº…§yȽ©&_l–´Ý\Ë…„fdÁU÷ EDÛlüá ’µ–^~$õÉPþyƒ††Þ˜%9*Òrú¹Ñtóù)§|Îí9Ñ¢ˆÍI™”5v&lœI蛉`®Ê#¤]F`~LbW£x66¹Ÿv[Æùê{õ½ ›eæ}™`qöŠã}öÕ˜l“+æI+ž±™¯Zî&®xfW­¶à–˜feJÙb¯B©ì³UBÙ¡¤åZ+ÝE)#¾êÑš¦¦—%¦kB$Á "xû®Š™wn•çi‘ÿFç¯g ÑG¥=’wbµ#§*ªÇÖçм¹Éžo7R¬êÈTމߥ¨&™-«Ö¶(¤¹WNXe©ïé°ËÂn¬e³>{˜«Òz,¶Ûš#ÌT°ü\G]&1h½h-ÍŒ¾ `‰Œnœ¤½öYaÅ4[ml°~—qÏd’Md«ª êY ˜6ì¤jsj4ðÝ!oGpz‰žtl$A}ãj "*¨ /F©Ô•Ú‡"gwFJïsë…ʹá3s 8߀¦ñ‰F;PKcK×ön§n§5Pictures/100000000000032A0000029B50A046E60062C89D.gifGIF87a*›÷‚¼‚ „>,,BLÄÂVF>„ÊÜÛÆŸUÄ‹8 &5îçºTjD‡Ž•LbDÂ$"t!B’©Šj„bH¦ÔÉ¥L„C!,*„–hèÄTe˜Ëâä¼ÚÌäå×. $[.§¦¨335ɤ‡«ÇªFÄÈÊÈmddüõÏDCDdRh±eTªÆÜUSTkƒ§JPy52DDFN¬P ÈÚÅ 2D21©‹|‘§ÉtvtÔ²vx¦t„’¤’kSÏ´cÔÔÔĈ\‰U3¥»§äæäìóôzT2.A;<ÅÝä$<¢|b^[dLbt<*\¤‚ldb\|xxdx¤ì΄lŒ¼",4¤r\,n¼|ŽÄÔ»~$Gg<%IR‘”~l¤Òì—œ|>,dJL”m\¼ÞåJ=1,*›þs‘É%àÀ‚*4È0aÃ…#Bœø°¢D‹/jÌÈ£Ç;‚)²dÈ“$QšLÉr¥K•0[Æ|)³&Í›3sÚÔ‰s§Ïž@y ý9T!€\e’*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­[±:Ž–)A°®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#KžL¹²å˘3/.áDî@2%@‹Mz´éÒ¨O«NÍzµëÖ°_ËŽM{¶íÚ¸oëÎÍ{·ïÞÀ N|¸ñâÈ+OÎ|¹óæÐŸKN}úoq‘Ò-ø™»÷îà¿þ‹O~¼ùòèÏ«OÏ~½ûöðßËO¾ýúøïëÏÏ¿ÿþþ'`€h`¨`‚ .h`.Ù•QPVhá…f¨á†vèᇠ†(âˆ$–hâ‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æh"h¹t†A%è(äDiä‘H&©ä’L6éä“PêXP„Då•Xf©å–\véå—`†É¡UI¡™ð裄‰éæ›pÆ)çœtÖigІ–‹ž|›}î9Phq)衚&vrd¡ Bš¡ >ÕaRbš¦šÞéé§ †*ꨤÎ(¡H Àª¬²ºggþ†¢ …•¡žF*é£vz"§eœl©Äkì±È&Ûå\ƒ6‹hª{¶*­Ÿ³nªçªÍ®újµt‘±ægêJ)…ãf:ì¦Ã‹îºê®Ë®RÂV¬¯ÊÖkï½øæ{lQ«*yGõX-¿a›‹Ád(Jµ?†6©®”k®¼éVün°œÆ»©»˜vÚ±Åú†,òÈ$—ežÎêY´yP Pk¨Ê­6«h]Ðx¶§†‘F졯sŒ1ÈAÓ«n»ôš¬ôÒL7í´ˆ§2ôY·¶–ÚQS ]°nš5ÚÄYµ¹T¡@dlHiÏcžû®Ðp¿=ïÑ/õôÝxç­·þÈÌZ—Bóžh,³µ µÊ­ $ÏCÜ«ÛE[ÜnܗëñÞœwîùçwŒP•<‚–êÕÝfÛøÀÝi öÖ«S¸ÝÙ OZ¡¸“W òÛîb¾»æqƒ.üðį$ÊÒNП)Ÿ8hŠjpóƒ3NDvF<žk®’chôïCožyÐgêž´ñ觯þú¿”À*Z±ŠX¼¢³ÈÅ-z±‹`ü¢ÃHÆ1š±Œh<£ÓÈÆ5º±p|£ãHÇ9Ú±Žx¼£óÈÇ=ú±€ü£ IÈA²y¬FY(Ò‘‹äC#«1IIB²’Z|¤&# I*N©Qq¤('9ÊR’ò”¦L%*W©ÊV²ò•®Œ%,g)ËZÒò–¶Ì%.w©Ë^òò—¾ &0‡)Ìbó˜ÆL&2—©Ìf2ó™ÎŒ&4—ÙHQ~ÀšÕ¬&6¯iMUfóšßÜæÊb5išsšçL':שÎv²óîŒ'<ç)ÏzÒóžöþÌ'>Ùù"Tßè?ÐÔŸýeúIP‚ t”Ÿ,¿èBIG.ôŸÍ(F7zÑŽjÔ£ý¨HCJRšt¤'-)JWªÒ–¦ô¥,…©KcJÓ™ÚT¦8­iNoªÓžòô§; ªO… Ô¡µ¨H%ªRºÔ¤2õ©NjS_ŠP’*ôªÿ\ä(;ÚP‘^T¡"sñQ€ZÔ¬å(Z‹°Ö¶ªõ­uk\ázVº¦u®x­k^ïª×¾òõ¯lµk`÷:X¿°r5lb+ØÅö±Žlc'KXÉV–²ŠÅ,c/ËÙÌvv³ž -hG YÍ–ö³§mjIkYÕ¶–µ¦}þíjg»Ö­f”lÅ­Cq{VÜ·Ehm%ù[¶VÕ‘© ‰V†~µ¹Ðݨs*Ýè>·ºØ½®v©»]æf—»àõnw§+Þð’÷¼Ö5ozËË^ô~·½ëuïxãKß÷ÊW½ö­ï|óËßýú¿ÿ…oL`ø¾.0‚¬_78Áfð€#ü` ¸ÂÂ%¨Eu[Õ…þvÃÔÝpn³ÚQ3’h-„ÆzÊâ6’úñ$],ã“xÆ1¾±i¬ãóøÇ9r‡ƒLä!ÇGÞq‘‘Ìd%'ÙÇKvr“¡üd!OÙÊRÎ2•¯å-kË^3˜ÇÜe2W¹Ìh>³þ𹼿/§™Ípvs›Åüf9Ç™Îs6sœ‹ë[ïöóÃ5hŒ{ÕÔ·'æíAr–ÄPÔ¢ânnã*éâö–Ò˜¾´¦iNozÒŸ¶´§G jR‹ºÔ¨>µª+ÍêN§ºÕ¡†µ©eýjW¯ÚÖ´¾u¬qÍë]ûzÖ½ö¯k=l] ûØÄF¶±“Íìe;;×Ðv³£]lj+ÛÚÓ–ö³yÍÜA?òÿ%(oÛ[*–Ã$¶1‰ýYOjg />µ¤ãcH›»Þ½7ˆóMd{÷›ßCöwÀŽo„þÛàGxÁé½o…7œáYøÂõq‚?œâ€vxÅ5žqˆwã‹äxÈþ=>rKüâ'ùÉ7®r‹³Üä.ÿxÊa.ò•Ë<á-¯yÌK>óžãœæ9:Їîó‰å??úË•~s£'=ÃPwn¾=<ãxø¡„–´¤A,܈†v¹¸+G±KÞIGÓg7;{Õ^öâ¦Ýík‡{Ûûˆ¼ÅÛ£“6¼_•¼Áû¼Ì«oþv¯'ؼכ‘Õ«¼Ç›½Ö ~Ðk[ÞK½à[¾ØÛÚ+¾Ý;½éK¼á»¼çë¾Ü;¿Æk¾‰RE ©²¸[H€y~uIbºWbáÇãônKøÅµ”þ(«`’Tu,š˜òöˆÂn°Éš!U|+Hc¼% þdªÕÁ5Ùµ¯ZŸ”ý ëÙ¤Uiçb§“ìì|:¶˜ñXÍ:!€}+¹¨Äš ôð°ÃfÕŽT ÀP¯`:X‘iR¿…0IUØ«”DI›z @ ð McäÆ\²Š’'lηµWH<9XÒÕgðw|bj[UŒ…yŒ·{ŒÇþ;ëÇÒËÇL¸wP}lÈëˆÈ…<„‡ühLu<‘<]jHÉ&&È“œ–Ñ+É‹ É™¬È—ÌÉz<ȀʎüɘÜ\©<ʉÜÊ£HÊš|µˆæÃ€´ô×»z‚Hƽ “°À÷‹n*!qWïV¶ÕP ð`¹ŽjÀîh…à°Ÿà` B0`ðµ|Ô¶XÙbõg€ŸÍüÌÉ7€aP ú`ð0*«ì¼I~+n_Ë¡îY > Î…È¢²'¦…[ ÎØàžs@ÞðÎî ¶¡àÆÎ ÍL;… ›¶ÌÒÛc` ·ñêà¸ðþˆÀ¡À“XµË&{š«úºñ I€x¸ûr…n^9oÔ%)Ô?uÞfÔ‰Ô¦Ô(V”MM¦G ÕÞåÔ0IÕ eÕDÔR½ÔXíOZÍÔUÝÕOcmÁe®`MÖWmÖYÍÖ[ÕhÝÖjíÑÌ)ÖoÎí»7h/IÇôx¢e¥i¨ömšÄuFË| Ì&db‘jˆjµ}Í'Ô»JìvPŒä\³‰h0j\šaâìŽÂk¥Ö‡uwÅÊÎöŠÕ¬×¯XLƒ]ucK~c»JÕÄ5y¦vœõ ’z9¢2›ªZ¿›ÜY»Ü©ÜVÅ܆þÝÏÝÜÔ½ŠO™Rb:—Ú-Ý#IÞmÏUÝÓ~á}ãÝÐmÞäýÝÕÕÞâ½öhÝì­ÞÖݤµ¼VTÍ”ñÖ‚§ÚM¸ÖM߇\ Ó7˜‡ÈÊhømÏùŸ„+¨¨d¦g9Ã炎ýU ”g%U-Ãz™½‡áx[]CÍÞÀËÃ]W”!Îà”–‡ÖûÂûáĽմڞh…5oÏ%bËL€ö>N\”©â»cA+ÍŽXâ†Â>¶äIåH®˜J^å {åOŠ?&åVNå[Øê „\~äaÞäcÍh~ãj®å€å]ŽåpnæoÎv]õŸÍ9ˆ îÃþM±ñxµè7´ó-j@ÒdÀØ8h|&ÚMIßÄ8À"lv‚+»øý\µ8ÍEˆ½Ì·n¹íc뻌¦ükÀv¼³<ˆÆœuR÷PV÷Û5ŒÐ^Ç(¥„ªØ»{Gâ{Õv Î?&ãj¼–näL¾ÝùìJûÞYH–ŽxêçX¼óäï§þÖ­Õ†VÞqýb†ØðD+ñú}½àFÛÌÈäSWj ߦéÖÚÇý¤Ö—ç4‰jÃô‹~ÁîHôûlôU‡ô.[ì3\é?èô÷¾|QŸìOUÿ}SôJiLŸõCõBì_?öG/ö]õToöKöjzöXÏöü}ÆsRùØŒÉ{Gò‡=É%ÕgDmà+&|Ëãf’‹gn½à3ïÉfhШ>ØäVZ¸íäWø•ídJnj鹇ßӶ׎ì¢Ózæ7»?jñû|c“o˜½îqôöø×ÛŽLøÏm¦×ÛmÔeÇ5ÀMHò^³ÝƒF»êœÆ”Îð¨üÚþüï8üÈßüüü˜nüËïcÿë|ÜýØoýÅïüÝýâOüÉ_ýãþèoþÔo€éþþ]d/É‚LÚ·_ëàÍê«>§½×ùòíOA¦r•!“+ׇjEŠðqØá‡‡E(6´‘a‘j r¹qãËù˜d±cCˆ'1~dÉ‘¢ÊŠ IÆôRåĆ1+â‰3&ÆŠ%wväè2¢I‹Õv¶´‰´#Ìœ"1®$é°%Qž5J\™sjH°MÍRÜÈr¢ÍŠÍÒÌXVé×¢>¢+2¢Ì¥t6…ª±§K½Hï½IÕ,_Aµþ-}–ñdÐN-_% ²ÄÙŸßîÛ¸çcš‘U›ÔµpÓ»;“¾Z;íYœ0oRüK)Û'kRÕ~ñ£Õ¿M%j^a 'Ë ÌÕQá|ú OÔ·ÿ>~þúçïßï?ÿ$0—óC0ÀéS°@ ¬ïÀ,°ÁþÄðB /„C 9ô°¿ 3ìÂKÄOìpÂI$ðEa\1BmQÅÔQÃùãÄe¼1ÈsI"YdðÇ—ÒI“¬qJ$MqÇ+­´(¡\ :H!2Fr¨L3Ù*Ó­2·;³Í6‰Š®L2×ÄþÎ+¶Ø´‰¼ÅÞth¤9÷|lÍ;ÝÌÌM8%±@U”(7Õ4QFu”ÎJû’óÌKí$ ÒIÅϲ4¥”З>ESÎMIÔÎD7ý³U>]5ÕÍXgÕSYͼ•Õ\Q…uU3W=õÓ`­•Ö]UEvY[7OMÉÄÊW3uå W^e(—„Ú S¡°° 3¬ÆBº»z"í©Œt2/«dÒÈ]Âhª—ÞÇ&Â%ÏΉ_óì¥K©| 3Œ'±fßͼã#áteKßz'–Š<‡!æKª‹ÚꫪæÍ˜d¦È} eÛBæØÜ®Z–¬:}3êd˜ïÂÙá…[Šùd¦þóNå˜ï²·çšcº¤š³›9'˜Þ %Šs†7]ž×Å*©…fÚjy§>*jµÀž­æ¢³&;i²Í%ÚâwU³Î#v¿W¬Ó$+O°§+°wb¸íˆ9òL„bJµí6Ëã›êÊM»@‡[+½¹=¾Þ}‡sfóöüqŸì²#«J[¸ñ¼ûìNPò¦S}¸ÇgÞ+ºÄçŽãÅoY÷Qk?Ow_>]¨Ìº‚=÷ÙËVœj½O] lŸÓCOõ©Íƒ~0ÕõÞ ¯É—2½Zôªç¾8åŠÅ-ü‘Æß>^ó½¯)ý>Åoœ|÷ɂߺë»RÜþµÞßbªÅ?öM§|ø  ïþ˜b”<Ån}ˆIÍà°"–øÅ/¡ Jiè×›ð©G à*ƒ·â£ÁÑØævKyøh²Œý¦c«ZV*†¹ÒÀ 3IY ÇŒ:ep‚´s˜\xÛ°QldÔÁ^ê vª­ga›É¨)17T<Ø bÎ¥‰3r ލŸMm-e´Í»d1 ʦ…ô3á ¡¢F½ 0*³)˜KV“Àa0zѹ!ïôÈÀñ@q/ÞwŽ–š±ÒŒ‡\\"»³H9òÑv$Þ–J:ò‡˜”¤V(i¼Ä‘%Ddh¸6´ÒÌiI9žgôÅÑG6¢ª[dCªÙ¨jT¯šU«jU«\êU±ÚÕ±~U¬[õ*YÉúÕ´–Õª\UkT«ŠU¹nõ­d­ê\Ízþ ­º•¯V¥ë]ûÊÕ¼âU°€k]ÇzU­¾ÀŽuìc½1ÙȾÀ_|Sæ3*2‡–çrcä´4>‡3n!í2‡“9¤jóNdRÊX\ƒ°w1¡@9T<%G[ÔÀ ^S¥ Š5 í·š;ŸpSFÜ×iÈ…ʺf@ײ36­‘ßpÃVÜ·wtÑ=!Ô¸kÝÐ&·›ùŒËW9…1F`ŠáíÐLÆÿõ–¤Z|hk«‘ "|É=^êH6Ê0`ØÀFp‚¼`7ØÁ†p„%<áëÃö†aXMX^Ç`¶[ÞÎ5?”®‘qJwÔe°ˆn ‰¢Kbmð˜ÎþØüeµ'Ä)h+‘,>3lózÝÌŒ+Njw•öµ[w‰ü?#—1Èè2u˜œÜ#»1É ”²ËJŒ³'_(ÅëÙ–Œd• š0¦§j^¦¹ º®–üàãbK—dRæ;r®Ì`ÊÙT÷”À[P¥p =hBÚЇ&p6P†‡åΉ_¢ÃÂs2[t‘í¸j›¸œ„ÊÁl3¥ Mc^m7†äl'ÊÃÏ ¾kî¬Íh. /"@ëlÜèl>ÀDÓÖ°4I®¹kÎ$g¼ö)»iJ5R§Ö:¼µQ—­M;KCö|1]Jj7›Ö¾†v²›GÇD”{ìu¯ã’{MEþ•´[‹¢ÇmZÔÉ'!†á> `D÷ÛßÿxÀ œ ê2&aÛЭë•͖ΑTñj7ãÞϲÌðÂò³ï FÎmt`ˆi@'8e¨mDsÀ†Xup‚,À'h9’%¹+ax¬\0 ãû¾†¨†SpþXÇ(@4ø‡†8'ˆ<È 1‡¸G,\Œƒ\<à'Xy@€u@hCHðˆ7úhÈxÈ,d*˜6ì|@h¨ƒ"ÈH@ƒ·`’†dªùà?èr0‰ðH,‚ás‚˜'H‚y Š ±É~*ºÿs5Xª%š.C½O2Ú‘Ê ’¯ª\›$‹ÊëÑJªL8®®®ì³”C9›ƒ’ Œ:(ìSÄ+£´è‰AÔሠ¬»ÒÀ <¼œEÌ\ôÅ^ ÌW<ÌÅTÌÆ<ÆÃìEc„ÌdD<¼ €ÌÄ™@8z4#hˆiXr°W°˜Œþ"˜ƒÓD€ÔÄB-JlÊ}ùL#(ÛüÌÛ¬ÍݼMÝôÍݬÍÞÄÍá NÞNá4Nâ¬MztHÜ$Çì=¾,t-¨†5¨f§àǑ΃€ÏlÈjø‡t1ÐÎj¸ƒÔ,‚”œ1Šá ÜdÎ"OŽ(H†¸ƒ$À>Ž0eзjxOÍùà¼ÍhHütNõ¼…U€8><€È ¾jHIóPN# GA¤ü›DT2;C= Q@Ñt‚§12Q Q×ÑG*QQú§AÔ¿°cQ"* ‹à¼8‘'*Bá‚@°$µl; 5Ãb"MB¶zš;§jÅ}{þÅ)¥Ò*=FÄ,F´EÂ$AÈÌÒ]<^FYdL\ÀNÓ”†‚¤[ÀØ zlzÄÔ ø ?-P;ýÓæOý‰%ü?PŠ ÖŽ¸+t1×¥Á[>ÐZ–PõÌB,Ô7ìLÚjuܳ€ ¼Õ³ÿ#(%Û¶—½¤»6¬y§Æ ÑK8þÏ}6ØÒÜÑåÜÒͺÐé›MÓ¦„ò¨ãƒ)˜‚“àT؇%¸&”)ŽØÝlJÝ©ÏéÜ3LñÀ)ᨷ=ŸýRˆ‚ ƒò†à·+-Á$Ì”õ;ïMÌÇŒLïß)õÒÇjm.æÜY–ÉsøÈ>€À„"˜†h¨>ù!Î @˜,4¨½ ü¾5ðˆvþ?˜ý¡JmÑéIRHÍÜøÂ6Fj‹jaœ0Ëa»/¤ñâ„ã{BË Š6òŸê®j°Z¨€j0VØX5Ø‹~Pá­†!X‚;p…$À€:`pU8ßEŠåðƒ؆9 äŽ(äC–§c &ç›ÏÐKŽsÄv{¸„ ‚‚(ÃñËY¼E[´R_üÅïSXÖÅ FZÓXF*ÝÒ–µRõ-´e”.©èLÐL‹X+·£<Š>Ô´¹P¼žcÒAÑUìhÖîI"~YO$’:Š`[õ)hZ­|L'lâÌU[(4^…ù¾ór fN•`ê²WœþZ;˜gq+&«Q’AãØÍœ;[5`)ñ`Œüº­«3­„!Ø Lè1”Ýâ©­XR2Ê *©° °‚jÀ…ð]6 Ž€Ó¬ ….¨R`…o<„Ž(i¡Ø]’&i-ˆdéX–VO8jòÙ±¹Ùí¨cËŸ›ÌÊ%)æ¦&<§8Ët¿¬Í0žˆ?š²êÊQ¦€Ò¤æp¢N·¯»!•!šžg^=Ë´Ðá‰ì¸Ü>õk–‰Ê4ØÕþ[hü oÕVpvVu[5ÐZ7{’ÓÉ‹!ã[œÎ /þš¼§ÛËJ©´ÁÈ~fjž›ÊÞÈž³bÊ5þô)\›ã ˆd(‡“îÙ-@€dŠ€pƒØ…H‚È>×> ׆×öíïóÝÚ¾í@M6ùºCl7v3#ãù1#œÊ™|S}ûX¨¶îKßë¦05=îöîïîno`P±¾¡Q¶Üá$ÅŽ¤å¦®;|B‹ŽL³6ÖÑZüü¨,Ò»ŽÆæž ÷½ïj8?¨3{~±þÄuÎ…û.ŽB¯P¡Ã$»Ï}nBæy¹øbÐô-tC™›ªšÆx¤ÑÒލw^®‹ûël‹ Ïǹ$7硈C¯f2hÕªðˆ±j‡@„“þ€ è>‚Dî  ‡/ Žnþd£qdš>i'X%7T)òAÌàµ.³‰…æ1þJj\ꯆÈ^í&ó2G4‚“¬4§¬Éz¬¬­Çs˜ßù},8÷:¬4—s5o9¯,6<Ÿ_:—¬>ïˆ5ÇóA÷s6WóôùaK­†5gôÊjôDw,;?t8ß/geÎ>ÇôCsIÿtÇzôƒˆtCõOGô;§sA/uf\uD·ôE§õ5߯Kõ%òrqüC:j!è 'ä µÛ¹ãF7`G:ãIJîu†Iê,pãX öB)‚wøÕ@ƒ0¨„'‡éj`+ø€‡Û&òÙÐmÕ.‚Ý…÷Ž@÷$þðOœ@ ô­ç"j zØ&Ýléõ¯pYe3'ø‚´[¸°ó†ô€[ø†¸àˆ„ÿ7ñç<€³xcV[Š÷·saŒwøMï·^Kì&CÔ¨Š"Œt©ùÚ±ØY‚i/iJ¶™ÿŒN¼Ú—§\<ôCé¡ ñªŒ«^‰ˆfž˜9¤$šÏ±~¯×O£š§oçò朚 jê¡“à7ÀÛÒ0%F1FÃß•U°_œ°ì6xBSSŸÒT¯jF‹<‰Sfy[½•¨¼BgF†¨›Õ;WeH+¸ï»ûqùû{_Éc΂sæÇ·{#Z|p¦{šüÃgvYü“0õþ‚ |o2ç ¿÷åôzt|»—?ý3g½Ÿ{‘K±0’o¡¸ è:Ÿq +ºX²n½3tw!`¾žH¡ Í>œ©帥ÐÝFjéi¦y¦åï"f-¬_òž'¥F’‰õp*qÉ@ÇTYÀ|å _$4¶o{A[Fýn~i\øŽg´ø7zû £7„køHÿñoÕzû@Ðà@„ üpâŇj/Ê|øP$âÅj1r¬VÄ#ÈŠ?ž8÷!—(–ù(òeÄ—5ÆŒ™1≂(ùYé"Ìš9Ú¬i´ZΓFŠôLùÓbH¡A]i ÄKùheþ)UèÇ‹6‡’½HRgJŒÕxrÌX„§Æ°ÙÆåù6ì[Œt]†íèr&½Lë† œ÷íH¸{ã–Us­`—pûÚåix¨Ý™7Ýræ£yèß¾|Ïå8Ù¯ÚÁwÇþ},÷Ã^Ç¢éZôkØ3ßÏwI[Ä}7ã»kñZ Y¸êˆdr‘Ñ W™åd4f+SÀuëÚ±kÏn;÷ï°?þ{vòçÁ›/ž=xôê·“ïnÿ>þüú÷óïïß¾>OõÕXNHaP!çVj –u–FOUcUkÅ9fULˆ HæUmqudQZYÝyˆÚfŒA5˜C؇¹­¨`YþÁÅX ŠÒCE˜£™½HÛGVjFS“±%\fÂÁÆÔ‡g&ˆqei–bªÁ5&•š•Ú–¯UÖeilù6_’Ùx“b¾é§ZVÞ¹ ! ú&p`º¥ [•½ˆ—]®6¨‹‰vÙ§‚¼i” ¨ÎAj.é#_yïÅwݪÛÙW_z±z+­¯¢'ª¸²ú¯½úúë~Ùüôá€)åÕHšù•cœ7%ÅÒ@0"™":‰SA,‹ã¤Ì&[V'ýq‘O)KÖx¡ýI!R¡Dn‚æÉä´΋TA'üq¢S ¾Ö·!éæþI+9Ô/Fôª«&ÀØ*•%ˆ–µ†è\³÷bU²iš´»uiSl•JÊp[íUXd\þ6"•6ýËY‘‚ÉX˜y üqh‹&ú¥`WØ››B–lÊÈq™ooVÌg]¥Uh3T˜&<s%8ñ\%,7auÞ¹Ú{³Úúž×±®ªÞy»ŽmžØl³ ,ÜqË_€ N=i‰¹¤fà€ƒgœá¤"èš—#ÀørXŠ×E6ôSÖ ZšD‰"”3u÷ßäYŸI¢Œ¡”¢¿#¥¦É1kTà»'Q$¡Ë%gœYšÑ^O«SÎ÷˜Å—©WÂR ´z³ÁMVþ±Ì _^Ø`•ÊNåb +ÜgHSûaöÎÜ Ç&o¼ÎM/ég²c&1õTŠÉ)¦~²¿)»1… [b6Öîš=Ì|N.€JÞ—Ìç¨HGTÑunõµ ÞÊ=b“®ÎV6 ^PV°Â ç&Âú'0×£“áQda@‚²A2«ŽÔž$o¬Æ#G … S Á†=¼pb y(}@ûÍ_¢´“žÄË\š‚Œ„)<ŠN-ZḨX#÷ÕfPd„žÍÎò°¦@‹h^TŒÌ.cœl)Išˆm Xš¥l&Æê œT–Àâ‰ïE·È†>²HE"þò‹td#yH}L2•Ld"-©ÈLr’‘™td"A©ÉEZ2”›$e%A‰½<òejˆ9^Ÿ'ÔtÈJ¹MÎ0÷¾D‘q~ïÉ÷>·%§ë{zÂ–Τ³ŒÜÆgʺ J æBkéÚ³éµVUPWõ©•;ØMonsV!$!:Ó©aµy‰ÊÛKsoá'‚=sዤÀe“Pp’y.çžùÜg?+FÉMÈsv)é0Æ”ˆ¢ Pð¤>—tB‹@Ðé 8¦;áË@ü:\ûNóJMf›zˆI¹r &z†K@ŸD¥å™ Em™å"j#Ë@åþwZJcÀH©d|pêS£*U§R•Q…êU¥jÕ¬Vuª\õjU¡ÚÕ±fõªÙ0Ÿ™RøJ›²)hsaŸÜ—ÆÌiê5ÕÚÿ脱úýÓ2™Â Ϻ豱4éu 䫺 (W’Љ9¹€Ö«‘S™³=–å`{ÒZq–>÷¹,ÙÞ¶ ª³´#¼Å°ä¤( ¸ añˆt`O á¶­Èà .n/&Æ‚Ö9ÈÒ'ܰ­žªÛ)P«-ábÝMª(àtÒeéh.´Â”ˆ‘‰ Áâ¸bO.Þ«c³C‹JúE@! %]DrÐv™²ºŒ‡z£ÞÚÃ?†±\þ½“#þƃ×#ºŒ‘"ÓM5?Þ|@|0-„E˜»‰´¯êz^l\ç´F=¨MøCž“.ƒW¿ŠKÎsP[NÖ¤òo¨-àƒdSL½ìѾçzÌr¦YP›p;g„ƒ,ä!ÿ‡ÿK<39œãžE0BwŒ°¯\¬` '6îÞr†œ`3xÁ*¬³ŠÌ`¹ø‡••ú–à( þº éJ Ô¹ !µ0F~WÿÚ$‘Ðb>Oàœ¥Q(FµJï÷&P·rq¥Ýx4ÓÊ25Œž³Yæ¥Öðä4MQ³|ᇴ#~ç+ñÖ{­Uç=ܰƑLhÖ$¬Il·ké¿õLí!ÇàÈYÓ%v-´ö²ÞÛ£ cßO2/Éçh-``iD@ ”d5X÷% ™‘ÍcH\W0Q¤€ðÁž}Hl€üؽÅËEP úÛ}þüÛ[ÜBH!FQ}`GÀ Ü}ý”@ @ NH ðv„±¼ ÉK5Ì€0H ìI‡~$ÁçEzý`KFœ\ N¡ –€ˆÃ¼‹Li 0õÎ Îà’L|9á{}ÄR¡âTM…©-Ev­—܃8Ø2 šèŒô°_d4£<hœ±Uý­‰ vŠËèÒú±ÔŒ#XŸ4ˆÁ•QŒ[™ÉlÍ©N5e›ZS5`SªôùG)âÇ)ž¢)ª“*v_ÝL IùÝÞ¼E ä‚Á ä¢.þCünN¦`òÕ"O` v”YPÑèÞþæ-MœE”ÃM! –X#ÌYŒÐHç¼ C¨Ä˜BuHS\`5  ²ß|ÙͯAVã5A6Ê Ió¼#`XðÍ`5Òã=ö’Íêµ²Æ<Ò`=$þø]}=Îûù_ƒ%ÝBØ„]0Ÿï™øÇÌ § ˜š$¥(P !‘ɲ%Ÿvä+ÖãËD]Ï@Û‹åÆB,‡©HP+ÊMPrÐØÄÍPòÊQÚ;ˆ²ô ïÁÈØâ&.æ"U†Wní Ú)piDT×d ”aå2öN ²D„t½ KÁÃä5Zc@Þ£plÎlþ¡@@HIމ€>A %°ae…A‡›ñ<C6f5f#ÈœWÐ%‰¼HË,¦\ÒcfB&ŽØ%¹ ŒÕ]&cff\Ò dbNÚ€€C3x‰ÑQ˜ˆØa¨€¬À5,ÃE¢ÓY¥QážÏ•Ì­¥ÜÐfÀ™àÞ\ÀBáÈù  'Ç(н_ùQˆ+mI԰ƲQdû(¢À494MÝ¥·ygmVf Ù°Jf…z¾JÚÌ}šShÁG®ÌçnvGݬ¤˜@Zyˆ@E\ 2&è¸T8Eí׿ÙDòÄÌ@‚ üÁ¬ë9hú±YCþ(YE€.xÁx@À¨hвhŠ6K†žu£U|cO»éƒ”ÁX>ðèƒ0#„¬ôqžfÀ°èжè’ò@ÜYï\t è¦ )“º(“>饜—IѨXéŠ.iŠ6©–òÒ‘”3ôÈRŽ4•uÐ@”A)tAެ$Ì”Ÿ\øi¤ëÌOÊA3°OŒÁ¨€ÄDÔ j ð"¼C AXB¢N` ¤ÀlÂÜ@4ƒ?ð„¶WàØÜ/‚ª\µ˜Ú©ä°ñ ÷\ ƒ4ݮْ2õEO>ÖäØd©J7…6Õ§8i“««7¹‡Ûp“þ±†SÙØggÕ©u˜P ÕŒWdÄxƒS¥mÕ–/>Õ Ìa¦F”HD‚ä[¶× lmuë¬Á à“¸¦ÆÁ¥å„h)ÄAô«¿þk<âùQkQœË 8Øx8@·i‚–/´Áƒzàñ™øì+Àfl/ ÞkØœÒXF`lÆþëÆÊU>> ^¢òëÈúëÆ ¶pštQ ðƒ* À ü úÁ?H€ÜÀ6hƒ}€u€(”A*Ø€}ÔB3ÄÁXÇ@ˆAPÁ À @ë:±H3áÏaÌ$µ(‹õ0úñLîÑØ@DÜA:Am ^øþCÜÁ!T X\@8ŒC|@(°BF\PT5à‚ Tƒ.xÒkáˆØÖ©YÑibÚ¡ÌÑ€ÄÝŽ™§¡ÊheP±~ ¸éJe•D•Ó+zž®Á§éåE²½äÙòLZq@ÕFDÄSáS6<¨µlˆ@}äî†ÎÀTĺæâ ˜‚6ò„†@„›ñNŒ‚ËVAôëööëËÂÈ™$ï=ñ‚AÀ_¶ÄjÇG¥@Äìî±Néd†Èv/À ì„Ù9Žj«žþe„ôTÀŒ#[ç¬éÔ (+ÂFõj©Hìk¬ðµÏó±Ð•œ\®¡uð/X²qé>0‚) Ænìa_Œ;.ÅY[&ò«fÛ^1Íè”Ù)œhSŸjíÈ»HD]p5üÀË#ÞvLÐ& äœÒé}¤Â”ÁXAw¼(<´uÜ)RÍRL®†-™Ÿÿ<b<ºèUCøÍj’CuAóÁ|`P B`€€|À+a‘ί·„Þ6$4'Þ£ˆxî»Éñü¶ê·cÉ].Dê‚Ûhég[‚ïÊ|È'ƒÓg«(ø³¶îzˆ8íæRþB žd¡íÞ•tC6ô¤ˆÁ-ÀCy(3S< åðG@°>äjOÂÂ-œÁ‰ÏŸŠ÷:©VJW”lþæ¯õ¡ÅED BÞ×hjf6ZG. Cõ‰$¿‘ßS@àïLèífÈóÇ “˜ °•«eqx`@á%ò¸À‚ù‘Ï,c ž4 AÈ€ÜÞ90m¦‚$A=8´v$ «‚u<¬Àƒ%Œ@<4ÓÍ¡Ô™Ž¥¸m ‘&æä~0OA5¬íc€@ç}„ «· „ãx:Çôáš@dÂ&Ä­jÌ6Ûâ"|€«ãéPÁ!¨å4°-÷ Ö gþRc]˜d ïtÄrX Öh-"`¯42rG»¢ö_L„˜ãÁ è@è€9ꀌÇu‰»s—”’Àìxt»>èƒ(!é@Tp€¨F0^^ i™.»Ø2·l¬ÎñÅ8yf–@’Ÿ€/PT¥;°AZvsÞWÉ® rt¶üª Ðý<¼©µ_”œžO»I×Ëϸ6ðØpi°†ú‡›JûÜ|_¬ÒÉØ*]_Eé ·ØŒ^'A TÃDpðÜAÎÇ@0ÈA\Að¼Ï3…lÂLtê§úƒF(á?ÄœÁœ‹AÝÆBÔÃv A«A¨&ÀlÅh¹#Õ~×þ[^nhûG€Jsì*¨\ÓŒ"Ëç½IkÎTŲÐwZüèY…i …ÝÍ“vL~ºÐÆpG—{"ÆäÍO²-'ðýº 0Hì #¾ßÑ6»];9—aÏSj-]>ÍWëJ|ì¥T0 %š3ÛQ ëF+͘FÜB5è}Üd$¢ôáp^î‡ù!Å/ì+–…@!ÔÔÔ¤_ÝM¸ÆGLHü¸k¨â•—Õ)Œ‰qynŒüØqO Ñ\5iM¯¿üç]†ũ؄S¦%û<vJ—l2@¨ö¡Hµ"'^ôVf`Á FŒHð!'à|èþ­Ú Ž>t˜1cÄ"|Fš,x²ˆHÕryóà †«ˆS¥JŸ!|hIãʆ(;r=ndèí°þݵ™a3 êã (^нÒ8#M3ÚË/&»ÜzJ¯ˆtª‚¤ á9#"”øÈl  Ðöœ2-Àà¬:µN8çƒ ½B‘¯Ð¤"M¥C4ÄÖ+¯¿¨.³Î>ë(Á¥`[îÆ¹zq°nQL¼+±Ì.ªÒ:m¸ÓNš*Çà–[n0ÿ\,S4#M»*ªâ B4–›KÅ0 ãRD¤Êòr*7‘ÜlM:5ëS¶«é9¦+º\BÔ'ËI)­ÔÒK+Ë,‚$M’ ¶ÊàcÓ)A\P5 Ñ€Ì^z ´¬tDM@'T}HÆV7}01[ä’%PC¤©¼ÜtH¢Ðìþšm*„f” . Ë*DÒø45O¶8ª°)h¡4*8×ò¡ƒœ–!4§…òK@G;([™€Ó,,¼ŒµšÄ0Í7<Ì4{°!jY;Τ8u,®ÉÐðKÏÊ”rÁj¢„ÐвØDaäæRËOªî“xÊX;+µ–:VÖ¹È`”:"ry;}aŽYæ™Ó§<ìæÒg3fÍõ77¾\¬ÈØ«òC‘=7!†³¿y+)Bo òàhç* GœH4EØ’ÌèøâS­—–"(È·ælr´„ñ|ˆÙþ0ûD¹4ÇÕÞ£MÂ?´òß! “˳Ù×u¥è}¬¤ÙñDz¹3GþÓت7õº[¬Éñž¶¬¬d+UE±Aó¯ãæ޳ÔXeíï¡¿8ÙÌ-÷°ÌQg®5Á‘‚)—¤£ºë/Þøã-Ëæ2,.»Ï¶*Û¦ŸñÔýHÜ\Çõ&´Ü”³µ"ëRê#°â;s×OmܲŸ%ö làÙ’jVn »ÍÝà¿cýôÝ–z†®Ù‰TàJ ÙÊæÐPó:Ÿœ€¥4€Ym`Ɉ>²¡.d0¦à 1hŠŽ0Äà9hÂ~0…-da_ØÁ‚P†¬¡ oñ¤7YÐ`–³›‹d7&ÜUë5x‘Vr\'@Öô 0uŠÉ0¶´þÐk6«Qþ€JF˜; çO VÎGçä‚Q%p”u‡<5®yÙ8GŠ‚3¢½ËhÓ WmÈ‚4oe\Õ Ô –= N¿Q‚üx®ë…NmIŒà~T#¹¸‰’´CÒX`w ¼ F5j#gÃÄÿ¸O…3WÕ‚È»ïíküY'™§’"!ÇL§9 ¡ÖT²H^€YÚ´Bó™¯)îkÃ,&1“…“¯%Ë?Ç\fK2#La“˜Å”f5§¸L°tyÄåHÌÑE©j·¹˜ƒvä-#îχL£æºgœõ(d°; ›×™ÎòuM4Œ¯Ø9“çÏQ(sšÐ˜Ù *Tz‹þT@å*Ö, B–d¥»Rþœƒ=|G8ÊVCF!=G·â* ÆnŸ¤<Fݬ¯ÀÑI-•ÝT‚ƒ@³…Ê}ÉŒnf‡\v„)n)‚M>sÉ3óžvAQ¿vJµx®9À¡jÞê7!>ˆ9×{MÀ”¤Dy*N˱ƚ6;‘u˜IÔDâV·zJO¥šç*#²^IuĹÐÃ(Ú@{i 7N" ¿G®¶¨’¤\»*ÈÏæJP¬VÁ2FF‘ጹ žBAÚ,1T$’2ßÂ1u6ò°u©ßÖØ:×àxʘ#âÈÖÎÄȪIå’­lVK–[(…R¨„T ‚þì畚¤ˆ~žëáÂ#W–ëDäóVÛ‚ºÍî¹mº' ®û”¥E)Õ¦Ÿ‡ôŠo®úE@eƒƒ¼{ßËAöÊ—¾6t/{í‹_ýÖW¾ùíï|m¸_ý˜¿ü êVÑn^EŸF±Z¦z8¯ô?‚µê›Þ°ˆõ2ðZ©#m·®ŽŽT`àmD $2¯Qº haãîhê&ç¹`iHô”ì˜Ç=öñÌãñ•!ÈE6r‡|d%9[7¡É—e$+·}D–²”ÿ7#§,äÊX† uuÜå%ó§lvÚÕíüùÆñlv³›Û „6ÙÎtžsœß|g>¼yÏzÎsŸíþ h=ã¹Î~ÆŒ{Êzª!5xHz² ‘â Û®‰cæEF/®-õ¯âëDÔÃ:õËOAd'¿Ù¥‹VC³b*cYÏ:2Êc9m #NVèÞðu¯}ýë`{ØÄv±]ì‡ûØÃvv³ýì`/ÛÙɶµŸìcÃ(nž¼ö·… mfC;—%ò¶¸¥]mu_Fæ^ϸ±½ntG›Øí`\²Mnm‡›ÞÁ®Qq”ùW'^´ÖW6©^×À.7R y)¹ùu©‘NZøÝØ~ÞõP JšgÀ玼œ[¼Ú ò ØÒðáQuñ^fp™ËšÆbzÞ\üþé±î<®rÕùÏß*×·Šõ­÷ØÎ%ô£C­D'kоóójùuo¥‹Ï‡Žu¬ÇÔ~PºÒ¿žô¬w…&q½ÏÓ½Þó§ÿœ&_Ö9Ï‘.Vµg=QFO®š^c$¤àkæ–:tÈ.ǰGçVg:bàH¦†›o*GAš¼²’R`º%ýÄôÃǃîìÕÓj+ŸšŒe1,SYg_ÜwÕ‡–<м׭qLæÙ¦bÃtm'¨cêþ™E²¦5oG‘ßl³,ÝîÁÇ5å‚o×,æ¡yXøwù'>^‡JgBó64ᓲ{!ß—Ü¼Ó„Ú ¾eÂGcÆ^øŸ?!þU׆‰°¢RãV%„wën4ÓV“¯E2)Á˜H€"8,L P¼ºê7.FÓn$Í(.»¦oµl MʯzÄi±¥–£åZ e>+ÿHPjÎ ná&è]@BÛö ÞòÞ2ŠÙö-Ýèm܈M!Œ Ûhßn0Ü8©Ì*¤ßzðyð°ÍíÚ‡}PÞÀÍØ¶E¹Ü^Pؘ0Ú‚^ž¬×Špç ­)€©[ÔäኀqJK0}TNýjÃ¥ÔFP:†GH§7"f“šhNOäÁè„PÈDâ6dέЬ…·D•ªƒŒZì9¾FRҰǦç ßBGÞþ¦º0…?P„2Œ`1F± J‘2@q!.…aiÛÍmþ +㳣܀ÄWñË(d?,e»KÁ†áâªÁÃ#rL%·ÄFG ËZ4Ð|LÍx¥ °ð(ÐuÖ¤²Š c–júŒèa¼‘ÿô\ª‡€(K:XÌ-PƳ4Ñåf*Ñ #çÀB‹ Qé®éèâ©ð‡îÞ)Qèâêz.QZ…nô1èöîè'kì'û‘ Åk!1ï©ÐoBäb!½Ž.’î²ÉPbÂêÆB"öq)¹N©òê 2²¸ËíòŽtÈÐyðoµcÿîJv6fI ŠJ­_ÑŸþX¢®`à–±Á0Çð† À ÀAªa Žòºj+¨®ÆNr”î$© ˆÒã9R¦QÆhuò-'ÅÖÈR+–ÄišhË™¬érŠfSvÛDœ’éµR+›î²¶dó&B=B…\l$˜„oòðÒ0¹‹ÊÜÂF¢2U$1¹Ï÷r –ÖϘn2áÊ0È Î2ÓùˆÏ$òü¤#à*¥10Ѱ ü` F@ Ã.K~*ç[Pïè¹T²ºÁ :` €€+¿irì¦5€EVem,¡’rzé›F‰òàð;Yë‡~ݱ:R8ÙóS‹þÔ(]9ÆqEä')2 ޏiÓ⤛B{.Ǭ„*q#çÜŽ|Îц°¬B§´$Ñ©ñ9‡ªB”K!MWøsAâXR"«IL;•D C#(’¯<ã6—¡ Tà7]4@ =kækÌddFM7HÌã|ƒ•>çýA˜PB#®3'\ATøÀ’êÀ ÀþAªá`¬"~xüà¶aÀt œJë+}Iwx(-¸ÇÁ)þS$ªc-Ý¢-aŽFñ´;ZÏcVò»ÞÂüô¤¬‚êiôãüsú¤„»ôcA3†ÍJ–NྯDÒoX5#®þ«?Ë*k&¶ìSDÑlv gºFr˘gò$Ìu¯#ÎaêΦ™Øf­DoE€«Üö0'Dnà` f dã6#¦`1˜f´1¦ÀÖ`¨”£š!–@õ¶dWDGYà0»j“Ã4´ ë3àÊê:‹ÀH­AJÓ•X¡¦á*B Ì¢ ŽOV)V%'´€Àò‚]«á¾à›¤ó—Ìðªg¸þ%iH,óLã9ÚÑQª#Öò´b3%W6T>ç*-”Î@Î BåGºò“Qk3_$+ÒºPÉH|EC#FºNªæ¦àr!_Žý "ç.ô\Fö8þ·d ¦Þ¢%»è‡0NV‚g“$eI5.Æd)ÇìE ªA]ÿÂ@ Ê€ò  ’•1Ƶ Ôv1‚òïÐ(ŠÊ+ø>­ª¬(˜$†C©HH#&/Ì‚ "D4b V`ÂH«B÷xCJ!×,÷ 7 ·?,@Y òP:½Ö×D-O¯†',öt/ÃR½²—ëÑ>À* È@|ÁARI+@1ÓdAxÔgð†E2§\g§6I¹&µuÉq À€` vëLb“ìêÞS–~Êýv‡œdö•ÎÆ‹ 2‰¬E,ÔƒºŒÆÓD.þMzÈmvÍÜ$â:+â9%”„• †a1`ê# ZT¸ е ¢àÎ`¬5œze3sG‰Þ© 뤞À¥Gº¡ ÈÁ ¤aq«Ž4;qµ,À âŠ^!÷\­…K+‚^IØ´á3•­;'¬0*í+ëøåQ6« ƈbQ÷‡ÃÖN%4Önø@Ðv v,D`€³þ“#Š`T\k*t¶ò> @EmAx£«6Ä$f’}¤êL¦  LapQŒZ Â@˘vÊ'' òìÒ‰d¹Ž×˜Ë’¸äq¹uH–Œe©ÔærøµÙÔ©”‚)\‡7ø k«Á¡eïþÅJ4€ãlc€F‡u€gn Ï2\Ÿ(ÜtâÆë6˜–äNnb` Â4!_¿E}WpU¸€ìø\±¸„»4Qj.·ý° Ÿ ÁÆwMŒû/ X­ôʈ‡ êõ€x›Ë@Þè‹ ¹ütNÎ@vì>þàŒ€ÍÈÀR`¸¸¤/™‹^v<0B{‘†åŠs"_uä7¡ ;Ë‚gJ¤SÛãtR þàûv X-rwlë·`Iò&jqå÷_ DQ«/}ƒŠi,ºY'«f$%/•ú9\È—Pc‚^èø!¢ ’ ð@JÑ¢JôdÏ 14¹m€“þÃr“@TOgSu…°¨S”ÎŽ6&fVã%›UNæ/&qÂî.Gñê$W㥉vŒxsUSÉ×PuF ÃåJ—¹ù‡OÐneº E$áNб1Œ`sᤷtP éQNî (&­cîqÈVª,  ÍRrKàqçèíç›})"Áj ‰O€QÛ;óùŸe’àI`€ ™ ù( wJ¥øJBsµUíGñ8TšÅh(I¯Nû¢[gŠ·ÅñÄøX¼eqr’­ƒ²tÔ¦a†CŠëf­ããV š¯.ð9](Ji¤YF'·/¼®kà0oP&M‰>íÑŠ2þ³ ãô ƒ Ür­-¶ÙeYZ55ñDÈÀ®#q#«A´²y‚7j`¶€°`Cfõ´iz(â’àdÁ\Çâ:#{A#)|ãJ2[Îrá:œ¤×©Û¶¼b$írñ¶ J ÂÕbÄâsºnqk(®MsbÅí§ÖJ¤ëÄ›JpEÅ#ÜÇÕ‘U%úw¿JýˆÑ½‰zUIi÷ê…m/ÊÉóG“º…ÖsŸ;¬7ãÁ.¬äâc ;Nóì†åÉðìS#bÅ¢£ÅXƇݻb…øǦɖ‹0RÀ Ú¬1—Sb¶ ¯ÅE±3o°ï  ~  {dl+?)þrC¸¼ (è8²ÈgõX-þ@΀ ÃO€ |¨RÒS{Ž¢ð”ÈÕ3¢(EE#xÅðgÐÕU<ÖqGEÇ¥íʸdpÖ+]C!‰)YÁj‰ï¸9rHîñˆs[½º…—pïµ9·ScÊ_¶`ŒÌYz4Nç–þiµHf!Á¥P`{[Ï mãOoŒZB­ã¼boáŽÏ3P Ž> DŠàõÛã†ôáqõ&Ïå Ñ  ¨ÑÁž*xU>>"j `]ú:'–¡Â§¤×)õUeˆ €€ vL-€³K¯Ñjýô‘0 l 2Þæþ…=ÄiFd$#y1”Ìâæs¾`}ÅC<âÎw—k»r‚èmÞèwÞ`„±gg›­Ü‰[É놞×'}·s&ïü0¯‰Æ•QiU)Íáp®xd4ÀqÃ(p [CGN#bg&κQH—½ïtÞ-–ÆþFWÖg¦`c N€Ô9qW ÷V  B]gÕç#J–à>Ñ , Ññˆ‹5øèaŽž"|r1½‡^3š¾% P¾:NrƒÞ.Ô¹ÀŸÓƒµ•+-×Oßô7^Ö™#¢t@õKú¡_Ø‹¢^Y K„|æùùm-¶[ö`/]ƒr {:ë Þyê^\xp¢ ]Œuk³u+¶>ðƒ¾j;Ë›?O3›^ëYfÕë¼,Ý räè° íöá Þg8TDs±ÆŸsöqç|)tw=ØZwïM FÚg! ®fP…Šù· €µhR.NŒTR.N} z.¾cŒ2ÎXF6”!Ñ}U Iàe!"è•FPUÆ„H”7õ¶Úhh±¥V–X„Rk…5åO ‹^pc¦™hªÙK\eЦH1ä£O"@É&‘A†>"”š’Ÿà€O6T„œFERþdf7¤™&7krœt…•è¢-jgxE:©¥gžÊfu)J'¨bnT©g®‰ê™mØËÕ¡—9."€ÙÜ¢ÙècŠ>Ù«l²Ù8›,´ÍNû¬²Æ›Í²ÙZ‹-³ÚrËm·â† î·æ^«ÏCáú°¿ŽÆÞWϱç_°Qd›ð™žE 1øP5 2èn~¾~EW½Å;” ñ».DK¼p„M¼ßBd”@†H$åBD.(ÑHrÉ&ŸŒ^6çH–߯ÈAFCS< ºüÕÕ0yÂÅ1ˆÝXb ÈÐ^iÅ…–"?üðäŽÚGdVÑ@VWMþµÕ™îG‡¾GšXŽæ(GXf²,ñ H ÜBv-÷s>VgÍ7Õ·:Ä+iÙÕŽ£í¥÷ÞXó½õjüÎÚeÌù+PÞ{_yC –Ø‹ Üò„Áú»Ðuêbö骫^ººº.‘ˆ¯wxíYŽúíöª.í»ëvÀ×Õ<Àü¶§Ñ€üµÛ²|)ÖßF Nˆ:€Ç{8ÔCÞw}ðUz}B_qX1õ9Î+”WYøžò縉‹Ç)ŠÌ"Êößÿý=½z¼BŒíJ¥ÚL@¨Ù®Â‡ÖàÙè‡%¥±l.ïA‹aÀ,üÌi\H÷2þˉ° ! B¸A¹y£SŒ*ìô<<5æX@HTVÈBS­Óœ>õÞÌ'V‰¡ÕJ8½jôPJsêÑO„x<Ë-N„H\ÀXuš ¾JTR4" y9ýäyš‹½Øu0/BjÍé8ðMf2E ˜ðä¨DUWqãùžÔ­±AˆJ⺲0åË= ú£†DçÀÎiøªè.¦¡ô ±zps¤õ22Ÿ$N(”úž~$ò"Èc¹PWJòËXʲ<Ù€!ªT»I- '8A™Ä&3ðHÌá‚ì,‡Š‹"4èGÖ€Å(QÛðþl>à{ûÛ^¸à5°Ýæ4Ù«t 4‰+Aš;K@KÞˆ’K&÷R…lns›WkÓá&t‚s$‡l¡‚>±©MnúíPúP.ó ]ç7TÓ'?­æOÙ}…1¹ _•¸×²8Š3#rüÏòúõQ‹‰BÿÔèuð³¹Ñbê )¿êeÅõ@o”þ×)-¶Ÿ‰ <ë[Þ\.TÆ^)‘&¯'ʇ쇑‡eóDŠ>÷ð®G*:RD%¶h–d-«YY²?„ HŒ¼'^‹^ž råÓ à„HzeT•ÚoJñˆâäè:`jk‡ÜéNnV!'ôÚz¦éÄþ–Ax"ße@a³œý‹¦¡ÒŒqNBŒÏ €)@±l^wD Qï´îTíj¿ˆ°é……=r•T%‚Ú¸°6§Ì‘®<¥=÷°/W­×«Ô?_™Ñ’Í-ªqÌâFOAyÍžrfP;r®ak,¥òú—\w9ò’pÔPSâ\êÙkºWÍ‘ÓÔj0§‰è]ýZ~ i ‚9§BÍËŒHJP†Ño¬gm°ƒïg#É wœæ”çYÀ¡>퉷8Ò¨ä$“¨ó‚*~ð†ÂW…)¨‹V´ÕÞ lU±rjsNô=ðp‚>£G6;¬^ð©…øþH5‰|±“eŒWãî¡õ\JHü›xS‘WÜnõ=ŽHÊ¥[Oͦ9ÐH‚/{‹žðŠÇHîÔ·>IÞƒ‡G¨õ–“rÇ«gçUW»‚ÄÞÁ&9¯•ŠŠtÏëV‘Iã0Î"jLê8§ZRBBÕôoÇwR £²&B‘ŠÈÀ?xÕ¬ŽQ-Ë ×XËš‰mλâ’v(KjˆË^ÞÖP®½º* Ñ¥ÙòH‹ºM¶\¯QŒåt•—04ƒ Ì,^3À§t¬¢gŠçÓþí·Ì}™§HË28Æ:ëVójXŇ9­ìʯ+ݳ[;¯‹¸»þª#¢*ûfÈA 2¼JiSíl<Ñíø§ L)ߥ^`Ýcêo<ˆýŠºÎí4T#6°GÖ9t;î!Á“Ÿµoäƒ\dr³«F^-QÌÍÑG:fj¬ÕD/zynáxcéKW:Ó“ž“Ž™ît£ %—Q3f Mßip„¯ÍR7c«"¶ÉÂý2I xÀƒšø†å×Í.!‡nI¯Ž'5MþÌÇÈrÊÞÐÀ'u”QèáK‹¨¥úšË(½ XPc߬òù£1‡xzeš Ÿè»‘¿îG”_r»»[æGÃxyGäè+¥šma>»eþz~àáfÐ ±]Âáó¥¥ÓÛ‘j¦ëS‘JÔ$!1uÈ¢j£kû0‰0M¤@[Ó´€À1ù(í5©PòÌbPmÙço”ì8!yWùvU˜GÅ”O…5Þ¤W?o$r{‘!PÂ+46 h=%5ªRg ÂV½¥EÇh øw#"¹ôIòfq¤xdÄe§s">:‚‚áÕ_”³i·tÿÅ77X¾1ƒ.˜[¡Ä0÷dp&…^ëÕGY±Í€ eIËåF=UIm=-‡^lö€ûÕƒ 'KÕG§&?™áJÜG†e¸¯Öy„eþ¹5Â× œ×^ #›²u8ÂS’†“'|15¡‚]ýâGfñPQk>%NTçNš#vÊ18U†#÷D>!×h‡8önÖ+¶‡g0¨s¤¡‰åTk3RCu^Â)Ž1:ÆhÁi £^ƒ”iê3J©7aDue(ØI%v>¢=¢[•G!$&jÍ&]ÔUpòÇnç#].5yP À ¼h|%(!¹åz…ØŒ„¶2gi¾ˆ:Ïñús™q"$AjaUÙg†ñØjûs;«Cn´ÖVä“<Ÿ8€†²QD%Oˆ‚BN&Ã&=è¸bß¡få&>È_0öþoÑ$8—§.úfkÆ“xQŒa~ï–€è‚f¤Víqf[ðö@4Œ øOóQ3RX8r°â.¢4%ù\ì7"å)¸;짃×õI!i”^¨“1%ƒr”’Ôƒ´”äZðw`2#ư®P|ö0#ð.q£FáÕqAÙ‚!R wfÆØg‘6> ?¦vâ!It¯VGwɆ¶¤‹zˆ’7(a£är G‰w‡ÅÈgö\÷±wIÑwxxm馇|H=‡¨c]Ç=ZÕ_qän1'x±;üV—Hé+ï1p›ù‘•kù8Lô9 1¡þ4{\ˆ¸Wg0g›Â#gæŒL(s ó@©ç_Âø‚VD^ßAJx©=€§“ÎÙf¼§I^!|°A§…­A Õx_P °ϸ|.yIðò“ȉUEˆC¥L'Y™¶?ë8?º€  d•V@«’Ìö@úáfÐ7[¡AªR€ôiÎIô·‘©_9¹RXT'y/ŸF!ª‚SYŠ\XqÚ„ÚÃQ.”‰hÁ¸ì§(Y!Ò÷Tì%=Ø[F…‚öR‰§¤9é…ÂI^L8£÷‚2ŠIƸbêuSÐÅk‰I¸ˆ˜Áé³0ÇÓ;UF ¿P T`CþÿÐïP »°W±{ñ Ýh|ÝŽ’DFïizs4zÝSIÍS"«Ô—¯ …JV–ðÀ¨rã9e3^Uˆ|e1ŒIƒñ¹R5Ù/˜Ê¤ ’ ÓI§*”IÆšçØ¥È)ŒËY¢UmÌF/÷…T9ש^öx¯ò[Ũ‚/‰f|G…ƒ¢ñÉýµ>m95uŽ¥©©zä< ÚyŸZ•4õ!`T˜UP”3/ã8[F™;Qå‹-õ<͸rÄÙ”Èã`E ¬`{Õ0 SÀ  òÆ™ú¡… ­\êpTƒNÕG3Jsö%àUó“j†Ê°²„†êÒþ¨ŠZ @!Zh1.H©‹·/&Îè£Ð,Ë…¡”<µÉ{ÒSxæ&e1‚3ùœçC›h±KʲO™˜—JkJfmÆAÏÈ.2Ê*XZg”Î×…áC.Z›M7.™iºÈéeiräŠ#e‰ûr‰0ìµ­4™{ +Ôúf—\ü8 ¡#JòA“Iu7„þpfà•I  áð Õ€ö#pšÂ)¥Ì¥<áãZ¤$¤$«i{Ìwq`e°1¨V ÿÙ°•K2H7F ±ÂQIÁš¿8­7Yr^‚© wg8õH÷Å#Õd¤3•‹ØÃ†G1’ñ†q”¶|ãÕ«˜þgNã£0S«’4'ðŒ²(¬¹x_Ú^UKg"¸™ÂU¨º<2ǹٱ Ý¥ªÚr 5aÃêŠHú]c§Ä6Ž…4¨¸¡‰Ö…Ñç˜<{¶õy…ˆÂ9ú8^Š”z3õ€1ØoBÕ–å{²œq„»hŠø‘k4_즃;I']Å—ôC¨–ëÀ$ó°áãSx>!kŒÁoV^øÑSþT;¶ŸXµå¸–2hP¿{¼(Z3‘+?ðƒ}LÇ4’Vœ ©ÅtN÷tP÷tNÇÇütc±ÇMgÈ~ÜLj¬ÈIGȉ,ȉÈ…lÈYà ȇ¼ÈŽÉ” –ìÈ}ÌÇ—ìÈ_[’ Êlʧü)ÕV ‘üÈ®,ÊŸ\ª2ZiÊÛsù%/û…ºÚ¥¾ÖS=LŸY¿ä•1Vô@#ÌA\ƒ§wÀJõ½EÕ½\ºÆº‡ÇÍc±h“娃Y*OZ,­9{5ø§xd´—¸å¨Ö×J“[Çí #†¤„• g–†J4SökÏù\4öL~üìdmôÏiÐj”†!÷¼ÏЪéþB@cøüÐECÏÍÏ6lÃþ¼Ï-Ðý_Jtfs’íѽÐm¿>Yù|Ð&Ò,­Ïþ<'ØYzŒgqƒešÕ/Pl™%…ªŽ“½ÎÓŠ®Å»òtJQÉÄ…¤\avröÀë ªh;zQ„3I¢r³¹ç!! ¸ov˜pôË W‚.›[*¢JAGYÑÀîÌÖ:¡2“Hpƒf*rqE×vm×u­×yWu×{í×€Íׂí×ð³×ƒÍ×؇ ?‰}ׂ€ˆMØ’­Øˆm×FPN­ÙMÙŒÝK—ý“-Ú=Ù¤×JÒ†ÝÙŽmÙ…íÚ¨{·Õb Sþ§‡½y—ɳċ7¬Ôž¥I—åKsphÕ÷)_CÊËÄšU»è˜>ùw¥t_£š]¡ª¯`³ËA%Ü ˆ­Q[¥ùOw´‚ƒ·£é¨À#tõÓÖéûÂRb$ïYï-ßóMßF Fßð]$õÍ߀’ߟÁßøàIß>ßÿ}àžà ¾à^ßcôà Îà~àº1á>à>ß@¡áNáô$ù߸Ìښܤ¤¬Å6ºwÓp5ÓŠ6»_—)|›º€‡Ì¡Ý÷ (U\êTvH²=G©;TØhƒøµ?ÚÍ2-¤ÈÀ1ZÛÇ(I>Gð†“jÊ‚,Çb \îåþ[æ]æ_.æeNæg>æinæjŽækîæmçlÞ,Ûò,tÞåØrçÊRçxnç|>ç~žçÙb#‡ËKç:®Ó:‡®è‹;«sèáÁè‘.é¯Ã艮è ¦sèõ¸è2韾蘾èröè“® .é´ƒêŠÎé«n!«ëŠ~ê,W·!§éuZü‹5gÀ7©|æc‹ÂGgö¥f4IqÒÌÓÀ¹œiäÃ\|9`Þ ƒá‹ß‘sÆ”º‘¬dÌÍ<è±\íÛÅ,ݪ$¥—üY"nëëÎîíîîïŽêefù+ïôÎ:óŽï–.ïÿeÒþlƒeGhä|i\„߂îþy`L`óVl¿¶Ý\ð/ñ4x;•&ðÎ Æa;ñü—EÈ_âµ£™””–zÍ"eð¿0×_àMŒÜÕ»¶1¸}eUJ<ØÅ²yj¶ j)º^rÉ¡Éxs9G_ÈÙ¤+ Þ™’/µfœÝÙZíd‹¥;~Œ0·â¹Ô>½èÖ™ båA'2‹˜Ïa/öcOöeoögöi¯ök?öõ 8Úyïe–:•Gë•'ïzæé=·Ær¿È ܶž˜\V»Û?Uë”ßÎÜK/"?ôk ÍŽt¸±:Ÿ·KÛºM/³ª 7Uá ¿žÖ¥½ï›x=žÕ Cgw®A{@¹sJ|¶+ªÜWþ<ìxiÍÄZ³xÏFÆ.Ì8ýÍ´¼ëš¦QtºpS•0QNô ×Äxê=î¥ÌvÌ%õ†VÛ»ŸÔn…%Ÿ#¹¿Û;Ýo:ºãýàÿýáOþãoþâþåŸþç¯þí?þV;°Û¥ˆ)®"SŽ9r†v1¦%!EŸW Eø)RíƒA‚ V+xP`Aˆ?dÈgâD†F8q`ÇAV„ãÅ":tXí#‘ G6Ӥȉ ?n”Q$A„ a~Ø)‘¡Ç™1ÎL‰p(HŸ9f܉t*͇'M†Dy”ëC™K³’$ ”àÉ«`GJ-»P+²J~¤iµcȳþ$ mš¤Ò— u¦ì “ãG‡2; l¸+X­+5&6‹´åRÊ—û^œP¬T™’#-(Ó&× {ûLèÁ\¹J8« ™ØYF­Ù«îÞÁyNü÷ñÅ•#÷9Ö¾pã4Ú|iPÓ7+_U:–iv³Ñû¾Æú2âRÃØ¡Âuš¶bwó,kZtÍw#ÑŠª]–þîw3wüZ‰°Íêi¿°ÈÒË#Þ ê¦œJ/¾¼³è* ä ª µëî8ûú ­®áVñº»äO®µøÓ.EñË˼ûzÃK5C£Ì½¶®ÛM>µ&ð»ýö‹±$‡ðbK4§óO¢þ"ò\Jò¢ÔÐã®),¹lL¨*¹¬Î+ý>À j+C62àãê%Ê胓$9‹ÐÁĬæ„ì!' $­C?ùÆ> ´ÎÑ̃’µýÚ Ï {tŠ2Cs<­L /Œ«*Ѫª‘#”ž*ÓÀ­LrÊïZ'˼ªìEùKÀ²Þ<‹ÊÁ0$/Iœt3­KŠÜÔ 0ÿv(’<$s°O=ˆF¾è[ðªÉ@ÍR°™D½,?©È#•LÒ’{Ö¯IÓ{Ë*Iô->°* 9jw· +Ì«ÈÆ¥7YwKú²ç"Crª“̯]¾€´QÆ•Ìá׊R² ØrIÓ¶\p p£"þHðoÐ h ÆÊ/£øõQA³6äÕä—].Yæ–3›Ùfæîâõz_õ­ª1ÜH‰Ÿ%šäqÇSØ[c[æ¨É´¢å’?õ˜šªÞÖŒKȧqö-i±R+G‹kI±2©’Î?‰õjÂsÕô¼©dKW!í:ðn·ws²Å9ÛÆ¨¨œ#‘,ïR í„NF+YÓ½µôzãd ×Ù3·|J8otò˹ÿ Ñ,ÅXD¼C¯œVÄÖ²nm·ÎuLü¾Ã6[/똻”‹ŒgS362:§l r¸%¸]ZáqØë‹[úØÞúêuº^ûìq„ºë(#ûòl‚y§þ`f°Å 6 Ö-û'¬1ø0C µ-ÿêê˜ï°_ü”$>Õ"Ÿ\ ¶žNå¯)C׺þ&¥êmªruÉθöò“j±lYº¢T“ÂÇšHqŽBØZ»†¸Ô|K@³;˜©¶“.º%1ûb˪¶¶ÂæÕ‹Hµ*ŽaCªn}‹rø²—£ž&-Ê•ESœ]üð¢Ö%+~ª!’%::Ň@²ÛSTĺ°Tå³Øðˆ ¤T ÕÂ;€`‰¤, ç@A²" Õ8…PÐŽ;DhpBR±¨‘‹Td.›G*2’‘Tã$éHFJ2“›Äd%3II#ÆKþQc5¨p$Ã+àFÑÇhÀàAûÀ$Á|8!x(ˆ9YR~ғÄd#)IIb>™Ë¼$'iLh3šŒDf'5)Íifó™×äf5/éÍf‚3™áü¦0Í©Ml–Sé§4ÛÉÌfZSžñ$'7»iOb>Ó›âÜg>çùÏy*3žà$¨?*OKÞ3­d(R‚ØÐc¹J.ŒP#4ä/€†0’2Wä£k(È?†Q„„dEHYÖàžä¢F )F1JSœâÔ¦9åéNyªÓ™þ´¦AªO‹JT¤&õ¦=5‚m±"؆¦1@†@?ƒÇþPÉè1 >#;…Kb0—Êe©Cek[ºV¸Î4®LÍéZåzW 5¨;µé†:פþõ§7]ª^‰êÓÂâ5¯Lå+R ›XÂ*¯‘µkcõ YÇu°BÝ+céÙÅV¨£­fK+ÚÎŽ–´‚E¬gC[×Ųը„õ«dmÛXØ¢Ö­’}lOÿ@YÏÆõ²¹%.`»ÛÍÂö§ /V†3¶©"'ȨJx‹äy+èÀVpìz·ÐþqǃÐçÈJRr”ľ~‘ï{éKßùÆ×¾1Õ/Ïâr_þþ—(¶|éà‰X”=|ŠjuS2‰pÜ£Ïþ…+ªADâ¼Õ0@5XÀ!P #6ˆzÙ úÀ°udà[7¾÷Ë/­z2ãý†Š@,¶ ajœ_‰ð·N¡š±{ûK+üödÅ6^q‘S Ã%÷xÀ)fr‘…ü^ÿØÇÞo—û{ãûj™¿bÎ1™ò’ÁŒã&¿ð=J}ýûf/¿8Ç<¦òÅ|d«Ø¿okqŠp<`#ÃØÈ‚ð›ƒüçûòùÔ5‹lr!Ñ5å&¦Ì5Œ2 r‡–‚ÔÒH‚v?ê]—¬´¥»Ã5´£Â©%W²þ©fmë æ%{tIRxˆÅà‘Ä6 \Ȱ!òˆãÀ¸†þ-Xj’}àÜPE5~àl©°ÚÕOŒI²P÷m^ßê×F ·3µ•ûQm->äf¾Ý$¨®îÕã¶ ±b*¡m'ºæTxzF`3Ø?ðžÃ46eNŠ¿†Šÿä&i1**»'/RhÞ§ÜƒÄ ÕŠCñVz8°\’ŒÏ/ßÞ†˜(3t+ü~á»·ÅS‡-ÙÑnß b¯eN¬+ p;3 8;˜A¥„¹!nžK<‘X4/€ð†7Ö1 SKc 0XzGZ s@#>xÇš‘’u8 ˜PR¯¼³­¶ÿ _=„Ud(jï[´’û`¢d©Ï°5K?0þ’€ €¹b `{?ÎG…$ü¢ 8X4œB¢š9°`ÀF®êEBøÁ’áäó?_í/0º™ÝŸÊÅÈá$ç ¯Óæâ¥¹ÐpÛw“šSýÎEâ²Ü\·oÍ0ì+ó àÿ²²næMªHá™o:¨çØþFÂ]ßG¿±“YÇíc)àSZWýDãaM~È¢(²¦Š–ÃWŒHo¹I°4çïLòß5º –Ë1ŠÚsæ*¶ˆR“À MIÀè(½†¸ƒ¨‘·ˆ@ùà! „ y)–)xÁc¹>±ˆ‹ º÷Xº+j0Ñá8Ê5â¾±‰éã·š‰þ@«Iº§y‹ëµ ‘½ !’±Îûµa0ñ Ðë.bœèC² ø‹ Ù™ÝAˆË9šÂRÁ½ <q;1™\éŽ A ì@ó•"|™êèŸ]yæAœúøÐ¶{> T›¾a¢Ã+šJa7ªt)ˆÞØ9(¬¾d! ù6raD¦aʺ† ƒ|.Üȧ ´°˜;€†uÀƒ’©ÁK‹b1’_DI³ 1 „狵Š®i>%™©s»€@¥P¦á¢±)™ÜѨ"©ñ½Ì@\)Ä–²©ƒQ§)‚Û!–q’²±ˆVLDiþŒcq\°"G ‚»ï©ŒedçX¾%`èЗay¢éH—X¡"则ÇQÆwG+œýóžË¡ß;<”,ü!Ï+z‹Ú)ÆsŸe‰F1±Ô@‹*$‘Ì?µ¹"Vô‹„ §žŒa‰¥›;ò›²Ò¹ž8@i¬–™§ÉÇCÙŸ©yBÿÈ·|_iˆaC ¾06jéHý‘L²` J”ÇSK¤òkJË–©œ=%úüI“ÁüÁ¢½Yž‡Ù¾¤`ÈÚ³Œ A¢Yi·) G&™<ÑÀÿÛÌ`¢j\ ÇðH·è—Ÿ¸J²½ôšþj¬–­H¿å0Á‘1阳ARʆK™ z´‘ Ádl¢xC9õ»=˜œ7x—~ÃA‹D7D,‰À£ÙÀ4MôD‡èEˆI¾€Œ•…Ô DÐŒÀà{ú» ›è›ß‰‚SÅœX:ÌI0#pØQý™8½$—l9ÃwÁ™~Áµó!“ 0âØY™UYL×x>#ô< ”GZEÅ) ÉiÃö¸/°´`s· " ƒqt› AF©Oä³½¿<ÇBäùœ©‰•t–r´Î°©ÒI÷8ÍqøÌÀ×x齄\ *£ ÇQ’ü=ÕÒ˜ i–HœEOþP”3¡fùÅ2X‰3y:‰Îê$ˆR"-R#=R$MR%]R&mR'}R(R"ÍLd‰— .(ƒ2.íR/ýR0 S1S2-S3=S4MS5]S6mS7}SÐÒ.ÕÒ-õÒ€S<ÍS=ÝS>íS?íS:S9ýÒ;ýSC=T1Í¢\QD”Î1ÚÄái@a«®jRK½TLÍTMÕTÂÅ×Q°‚ˆ€AETR-US=UTES:­S9U(ÔTUYUZÍÓVÝÒ[%ÔZÝÕ3-ÆåSZùݬÜŒÁî€À!‚€‚`ÖgmÖhuVhVk…ÖjeVj]ViÅÖhþõÖmVq½VnÝVs×jERpE×#]Wr-Ò£ ¼!ÝR/d#þã!îR”uà¹Ýb(p×á Ù6Ù+fà$mä’¥`%m ¤Ë¨*Œ`ã6åÌeQ.e«%eSöRï9ˆsðd‘€ÌÐá ¼hº2² ˆ"ƒŒ¥Ô# ä¸åRŽýc.Õâ@öeš}ä ¾duUdéýXg…Y&VRhNà˜ät­VãeÖèþÜÑ'Y #Šgqgr.gs>gtNgu^gvngw~gxŽgyžgz~çC¨g|Îg}Þg~îgþgvn€h‚ç.u£@ÝÀ€38À‹a á1ÛN|Š—¤[_>Ù@†a@éCö[G^fJePb•µ`(ÒI.ÒI¶äD&Y„€À¤‘NTFÓœÖé<Ýé3õé2ê îi¢†S¡&Ó£Ó¤Vê¢6j<]ê0…j0•ê~Sª®j7½êÏ}ê¦îœ£˜ßœhhxÀX6Y®in.ˆÙõß5º^E¤d&^_þèÓ)Vd˜Ff›ÝbÞÔ$^æc~äþÚ•> ¼ìåjÅvêÅÎꦶêÇnS­æÒÉžl¤mì.]Í^„ŸöÒÍÖlž6ÓÏŽj6ýlζlÓæì5åÔ6Ó£Þl¬NSØmÌ€Ñîl.EΦPèkx²‡‚ÐáÁS[¢€]–ÄÍà" k‘†ÛÝeV»Þè#Uéd6é+^nY—înï®fï†à—îâÕàšVÛ£RnNlÆnoÈ®íÕŽlÉ–ïø†o5µlüSØví/mÚê2õoÕŽm4ðCèiÚð4%åçï3ððmS‡ïÿvðvÈ"¸aƒpèƒÀêeÝ$Aì1:£þE[<r¥î‘&änþñvVD†`-–[ðþnÜÍë¿ÎTñÞë¹uÞtEIJÕ Å݋ʦïúvïù¶ïû6ògòÐFò$SÎVð1EãÛ¶ð1­ð©–ð)_Ë>„+_ò0 ó*/p*§l75múÖr¤îÒbTh˜Dqo°Rêb ‹TÜüEãÖ]DÞÖ1mqD¾kßÔ»µäF–é_Rå]ô'}éÂýXõ6ÁéÂÞ"Wò&·t܆r6ÍoM?rÇÆôL÷l2'mQ·í3'u2eó_SGðSòþ~uTð0§ê ×tUgj.EȬõä=‰³¦˜ê<\ÿõQé‚ëá&^ÀVôçloiLFâ)žæDgÒþwR’5Þ‹ÐY²@ìJït1wXÿtq÷MwòP'÷÷ŽuSÇòvÏu—ò.ŸuÙîò/¿õK—÷|§õvßêÒžw —õ-çÒ»á™ùÍ‘¬è<¡´¦èIJ]·p*³Î['.o%oe§äOWG·`-†VGoéDWâkïÀöÛ/no®NÆuwòuWw™‡ù™÷ôš÷˜ŸùÙ†w4ÏìQ×uZu¨VsÔVs›çÒŸ§÷Tßïžÿ÷~‡ò¤øÖ‚@]&W–?¤ØˆÝÛÀØ8?ŠŒ·Ylîñ,Ö`åuÞ&ïÜeée?ùêÖxH'Šž½; U—ðrO÷sßûþ6| Ïù¿ïû—/ü›ÇùÄßwš_|¿gÓ&@÷L7›¬ÕZË¿|¯ýP… žíaôV]Ñ}Ò/}Ó?}ÔO}Õ_}Õ­¨ ¥Ê”LeÙŸ} íƒ7ø47TÜ—pÝïý>Ý}<~0½Jƒ˜_ÓÇßý`J3éúH=ö¯Üz­»*­É¢+ÎR­Àê,-Íþ䲫ÔòþÕJ­â²©cJAlÚOõ¿WÛÏ}?~VÿSøWÓù—í÷/Õúßunìu€9ˆ…p €8á­Ú‡"s)ø¡Z®†Nä*“‹L.‚ÕŠ ,XÍÇŽeŒ|ì(r¤È%9~4™$Ë•(Y¶„IÒcÌ•!þoÆ„‰³ŒÍ—:_º4É’ Æ?Eˆò1H4cRNŸB*u*ÕªV¯bͪu+×®^¿‚ +v,Ù²Sû„]dªÚµOÛº…×í[ºré:½«•èÅ…E¼•Y(ØbµÂ-Íx±Å#R¬hc™¤Œ¨™3ÊÍe6c™ù#èÒMsN­z¦gÐQÏŒ-{6íÙ’f,’tq‘Þ{W@È)â„wz<¹ðåO+Gþ\ztêÍ™C¿>Ýzöîܽcÿ^üôðãÍ—O_}töÍÉ·ßî¼|õÚ㯷O??þëþ €Ø¸‚ 2¨ ƒè „B !þ…Zxaƒ>˜!‡.xÜqQùµÛB€)•â+Å ºÄÇ Fu[CdèQ%P„˜bE¼¤‚PBÑä“L*9d’> ¹’MùiS†Ve“›])¥•Z^Ie–„5ÖÈAñQpÄWsn>•Ü›ÌYgœl²igžwÒy§ž}ÎÙ瞃ÊçŸp*§Ÿ‹&Šg¡z¨ ‚J*餈>š©¢2Ji§n~x ¡zj€¥š ª©®Êjª¶úa¬¯V8aTD‘Y `|¥Ø×a~‰©Ñ¹‘KŽÝXnc^V¤fAûÚiѪÚg±¹FÓµÒiT>=þÛP¹$UHßÊv-A2Á×m½ùÖîBkrJ¨¦—âËܽ•B…©¿ùö p½ÿ«oÁŸNº/ œ©Â?qÄ/'­ÿ*ëÅΪñƪ~|jÈ ‡Ü±«JUf™»ú¬F'œã2B–1äŽ U´TBIqF•·Rë”·3™UG@4HSi)ôHB;=›ÓQÿ,ÕUŽfnIÕ¨³FôNœ0Å=vØžÝiÚö–ÝðÚ·Í0¿l7lvÜj—½qÆ#óݷ߸ßR¹ `%•¦¯-„[`‹Md¬ŽÅ’ëoÁ$tÒpµçœ‡Ûµá¢45çŸþùÑþ}úµª_ûf¦§v5hš&Rî5ÎÜu˜ËêöÁpÏM°ÛwÓ]<¦o/<Üu=ÚÎ3/¶ôx_Ÿü§z Þ½÷߃~ÈR)Û›™°¬ÔïGÖÛB'%XcIÔâÃv”HªWºÿþ#‰&P;]ÿúÇ?þýou \ Lø?(ËuºËšoòW"=®ÃãÕÁ„P_ aTDH€¡0…#¡ YXÂÂðƒ.Œá iXCÞP†R™¡mÈÞx¯Ú›†°À7#1‰J?ÖD¿=ñ@SYLËt•AQñ/ðË™hd‘ÈK"ÅVï.3;Ð=€´cÍ´þè”3.ð€jäo7Çý0ZT3·ö(•ÌÀ!Ù ¼|ó‡A¢ŠTäAÄö0’’|$$)IÉF^Ò†™Äá&qØÈúP“Ÿ¥/FÄ ™ •}K%…XÙÊUŽÌ•šÕaÔ²”¡WÀQŠ@ÌWAšáŒ~8óòt5Iiýƒ’‘DS5ÍUMHk4 A˜¨@hÒ¤£P°T:J“›ãVl’¤¬‹2Ù`%AéIR¾““£”g(éÏvˆóÄç>'‰É~: î”¡)M%Kñí J(,K8Z’1»Ù•ú,õ_­ëGŒÉ…cnÖ£Él­uCéÿ þI-kÐt×üÙëR‡.< u¨#NH¤h.ð&(õ¢˜|Ù—‹ˆ ‘õäçPõYÔ€u íÜaR™zO£>©QͧTýéT«&µ ¤b(WÚU¯~L¡¯dÐÃôÓà r—Ñ"¯fÔ>Ü(Œ<Ê…â(CiÉ1Žy\Rí”–×¥¹ôã„i™é™¨¹&™œ#)êøÈ¢ÜÆ– ©LAØ  Ša–lÙ{žò¬×Y¹e¶y›ígV¼êÖx©}Ûĸª(^ ¶±]bÈdK+Ûš ·Óíeo<[R´Dfý€@„{ÎD&Œ‘!SïªaG½®îŒ™AìLþú×”ÊÔ™cÔ6çþª‘”º¸›M yªÞôt^¤žóHZϾwµì-|UkÚøÞbí­/k÷+ßK¹Öc`ðÆÄº Ã*–…PD»v\¦UX‹,—/’¡£™k]s¤Æi™ ÝÏ8@ŸaFiÙ$éªVÓÃqÄÈÜx ˆµ,i-!0šLš‚u°Í·´øÕž}‡ÌY#£6¿ýÝl’ìÞ",Àâ›2•«leÁî]gÍ`ZaT Œ&¦2À‰ëÍR¢Õ¨[µ¡MPÔ\››º™$W#¶Ö\’ç6$Gé)b“Þà ONm£o¤œì¨ýÚP†N4ž„ì)ã1úÑÕ‹ô¦öõ±þS^9ÓšÞ4§D" š(}\l™[ögä–@rdcEÌ©c>˜Ä°± ­ÛXÝÁkš!’¬AÌÞƙL"Mj²µ:êb-$¥¬ÊxÇ,zÉi?ï™|¦­Ÿj‹ˆÚÔÆ6·¹½mm_ÛÛá7îcn?Ù¾ö·Ù}éÜÒÖ‰ñÞmßxË!{¿J·"b'~:+&ŽÇÀ!î@bäãÄP(AýÈ ‘ž„œÝºibã’›ûã;õ‰3s—-Ï´ùÍoyÊ/2Ÿ9Íknó›ã<çb¹.°¨%szVxž•E}-A· ’n–¥þ?½é4GºW”uÁôyy0ÅÝó©“[æœdgEà ÙËnö³£=íj_;ÛÛîö·Ã=îeWÖŒ¸¨K–W#zß;ßûî÷¿>ð‚<á oøÃ#>ñŠ_<ãïøÇC>òïÃ!ôKH^ï—ϼæ›Àùlžó¡Ïüè!_úÏ/Âó† o,S\jÄÏ»9 _Ф”È)<"”³pšƒb-ѵÄ&:õÈȵq¢¹FI<1ö¶RÒü–d«'<© J¥?ƒä"~Há±[ç¥óïƒ?üâ?ùk.ôCüü+PºÓ­r­P}èLo?YÖ_©Ï<þ\y—„QäúàùÊ‹”ÏÀU†…Ñ0þ½KDhij°Êqœ¸”ĬéZ—ÐbS3ÁÙêÚ›I\9…™–í™elMù™à ¢` ª`Î ]¤ŸWØßýÑUÌàTèûÍ_â`þÕ Uð_°Ì ÕžÙ°Ó™LÄN™75ÐBaÆGüÁ¶ÈI\Mœ@¡NüI|aaò5 ·xSðÀ×ÕÕÊá ÂaÊáÒ¡S´à vE Ž…Ò üõ ÐáŸÒâ–>ÝREË„ZøÛ`¼7ì»üÔüÜL±Xþ, Ç¡ÆÉi¢šåÚÇ}`–ÄüDô¥•”"®¥\M‘D)[bþ×E؅ɾ!‡€Øâ€Øâ-H.â¢/È.ê"0þ‡0þb¶#2öâ¾ #3.£3>£2#1N£4V£5B5f#5c4òb0jc8r£8Bã5.G2~£9"£ˆÈ:ž£;Þ"æã9òã?úc@¾ã@Æ#AÒ£$/Bd?JdEFäE2G:‘ ìÕ[FÑ"ïP„r5Ä RATË)¶Ñó¡áÄUg„œ)Ž!µÈ†±ÕYžÄn—Ä}!P ’ïÜåðA§eQåQ"¥€`ZR2eS:¥†<ÅÃa.©ÌOz]ÎBþ“ޤšÃ}‘˜}ØO¨":Ë* (jINÆZ‘| JMá~`ÈÄþšXMýÝéØþšÄSf` æ`>ÈRbÈW…bXC%&à°ë•E¤¿Íž7†ãôØFi˜DPÄŽ)F³”]ɳ ÉGÐ%ÅM‹ißN‚Ø·LN„Kvq`lþL‹Õ&è˜TG\!]öÉ Í0׫æpgq&¥a"-¦‚)æÅ X‚,…SAZÞ%)Ι›µ„ˆ% ³É¢_( •éŸj .X‘©¡žL’.ç’^drÍD=ŽEQ¨…:›B0ÄHêExå/E|Òo„h†¦Jr†¨Âå‰BašÁNþé´ÔKך†]ŽWKM ÙyÅ‹Z½‹!™ k°þ)¡&˜¢*é±"ë¢*+c2˜S Ü[Q”Zý[qQéŽD†åý¤Z«-‹_|ÜnrœšŽª°y¸Ö¨g°)¹ªÔ¸iIzÂdÁT«º«“€(gÆgöJšDQ뿬qkÀlqB¦—Zeæm,N:¡¥‚Q¦.¡OÓ‡…©°yjK^]ŠjǪªª:Ë`QÓ›. ‘´è1-ÖÈöÏJˆרŒüßoðÁPlÍÚ¬QìÍê,SN§þ„ýŽ©}Y…íYVÖL¶Þ Œ0 ‰ÎåNìx¢ërâ¨~þ×鬨©NÖZ!ÊÁQ°è|Ò)eè…äìåΪíÚ†OÎHƒRÜÆí‚æ‚ÖVàÀíÁF&Š ×yIé,rgRP"d”$H1ËiZ¡ª‚ji®jš‚ªÇ­å¬Þç‹1 Ól 2¥g™РËSk‚†^J¼¤ šÍ,Û¢nêúÛr ¢”ënì itÚJ“fA ˆpYåÖY)ŸÙH–Yåðé…Y¬‘ta¹Jí(f!Éfº&o(®Ù'2‰Q¯ZJK¥Ž`¯2„ŽUƒêzï÷Ñëë²:'³&ë¡:f£B¨ƒË’“²U_æÏ™‹\}TØÅzzm㪧ÆÍ¥3þ‰æn’«ÿŸÈÑ$òÝfT°fó1Ÿèl‹ÿ’DŽí™T†$ÍH`p Hkðspx0È0 ‡0—°Èƒð £ð ›0 w° Ïð«0 ¿° ß°×0°p ç0±ǰ·°ñ#± '±ñÃ0€ôÁçpSq8ˆÛ°ÿGg°‚xñ ‡q ñ,‚£1§qçðo1¿1Ç1gñϱÃq…X±ó1÷ñ¯ñûñ r!2!{1sËýp¤û¸Aô’‰¬áÙ̪% êh:ïxþ/¸~)ˆ ð˜ðM)˜j ¨~Iþ”d 3Y\'6 ôNï]²Dž¶aùôTSÔa.ëò.ó²[ðœÏ¥EÏÍ…Ña1_Å"s! ó03]2‹…Z8³ÒEóUh$Pån5$ã ÒqyÃENËd¥Ü‰ó8“s9›³9S¬ûÜîŸ}^;»ó;Ãs<Ëó<Ós<£ãÒq^>·3?ï³>ÿs?täùó;tá±pÐÌ®ìé#SØÃW»(¶ “Òo&¶Š6Éô9faOüH§(ŠÒ™KL ãJ‰H§%”l4ÉI1…¿ÏgörMÛôMã4TÜaXœŸ[ôtV¼_VD@P¯ÅO5µY5Y,5] uÕÍâbþN®@ô¯”×ÃE,²P8‹™MPJÂò½æäW—(ˆÚ$´ÈŽ6Ó[\섬Zõð‚ZŒšENãu^ëµ î4X´ O¢U âSèS6SöXüµR'¶R6áÜîà…>*/is¼ÐLd<„%—drï—Ö(jÖ%©JËK¶Q]B°ˆò¹vS+b‰þb K[íj°&H˜Óür]ã0EìuoûöoÛ\_«_câcwTÜ 2÷Vb0/7V4wý=7„ ׈šƒ%E©QQŸ&±äÃeئUÄEmäªF™Fk;ÓNÔd+–õXsËðÁ·ñ°]æYh–WRÔ•ëþa( 5Úº9¤qPG€øºÑ t¸sø+8€;8‚?¸t$ø€G¸›T¸€Kø…/ø„[xƒC¸‡g8ˆG›ˆ3xˆS8‰s8†w¸‰¯øˆ›ør GŒgãŒÇ¸/žcì"Œó£ŒÇ"¬ã<òx<ã+HEʸ>f[£ƒ¹?&¤Ž$røx’—c“çø¾IÈ•Ã8”'y5N¹’Ïx1Ò8ï8!L9>Bä–+ä•yÓx6~D[‘Fè·ú|YÁ½ËÊOC`äk`ð N–hȉ6P ¥½–iÇÉeLŽv²‘õ[²òžö·úfði ït5´µI£ãG>å?¾­g~ᔀ$;¨ˆ ÊL<è/¬ Tš>É,»Ô7ªéïºBбóúç÷zëg}T`‘RXçóEûn™h¨¶ú¹* c…-`1Ðzº¼ÝËè3É<½Z“v1PwiŽ©jSÏpÓ‘œl,ç%öazUn ¿}Râg•åûSå;þå£ÿRµ?Uq¾û¯?VÍ¿üC>ýþß¿ýk¾'iøú•TûP¤Ÿ"_”)ò¡ÚC… žðfOÄ\FÌõQ€\e>’ù ðÃÆ…Œ)cD Ì–3cª€  eÌ™.y¶´ùò&Mœ9q ´)t'Ñ ;uXÆfM¥ÊPEÚ“àP«7_¾Ìª³ã‰?O"Œøá„‘‡ÕpëBÖ¸ ÌXWn^ºvà%È`¿Î:X á¿‡Ö;qàljO–¼x¯åÆw7_vœógÑœ5[Ž\BݺR·^ÍvêÕúĶýºunÛ±áî~­z¶ëܸag­ºø[ÞȇëÞ]üytÙ½K‡þîÜ·õ㿯s.8uèÄyk¯ÞõWù@\ëÍ¡ÁˆòÍž8çþ Ê޹ˆär"’¤èÛè "˜ÈœÊ )w: ¨ƒRPª˜tºÊÁ ¤òj(Ÿ.¼¨£|RŠ©¯Jj§—ÊRÉ •Îâƒ@…)í/¾Ò ²uÄѳÄ:ûñGÍ‚äñÆÑz<²ÈDÆ%‡t²I%}ŒI Í3¯¶+ŸÃBË.!àÒK-Á S»1É´ÎÌ3£KSÍØØlsMóÔ«f¾µŠh¨£„؃­‹Rh$ùR @2J0)¢"TjoD “úp¨ G4ª­–âêÒ˜  *BH|é(M1‘'þ9•ðÀ–ÔR[Jt¤‰d]HQµš‘H¹l|rJÂx ìW&s%2X]©vI!5vX(›•ØewtNÖ²ú&ʦÅþ^ +_ŽVÚ·„FúèßÕ2HÕLˆªÃƒu‘Tƒ _œàŽçI*¤@¼é'W'1r„3ni¢E÷\Pµ å¸ì2ý³¹TwìtÏV¿¬õØSgvÊZwwÙsÔ=lÛg÷øÞa¯]xÔw'Þøâ•LžyÜsGÞyÞ›¿]zp•sllÕýzûìµßソMïÛÕ“Ïjà{¢[‚È"ô6â¬|÷ýo¤C-¹@Ç¿’˜ >áPĪ“2üÏaEA H8 !èb"‚ ª.D± ¥)ëPOØ’µh%´ÚO&B:èQïxÁkÞðž§ÂåµPy0œÞï”'½þÚ….´¡ yÈÃâz> bõºu½ñïMÚJ"œ–ÈDð}i{Mì–mV÷L¤ ™D²QAY„>)±›A • ½•a_ÿ*ТX²97ns­â`RäÇŒEÈ¢šãLðG7nê—cÕNØ“–Χs¢«† a·º¾®†¿ƒä SI ñ’@Ìä ‡ÈÉMê°“ ü¤%c¨ÉR"/:L[lŒ¸Ê؈¯kÖ)—*«æ5/Ñr]à#ßÙ¢ó´£áu¶0¯&K­¡ ‡äSÛ:ÒE;UÃ"|JHZPb?~ííPWBü˜ >"Er éø >Î$CæDç‚*¸°A¢þªŽ¨ò£8Ø“o¶Ä] D ²á7>1Ru„¨éJˆ€41%è@£Ð„"´¡ …€C'ÊЈ"´¢¥¨C/ºPJ”£õèH;úО”¤%©JCºQ¾¢+•©KcJS’®”¥0MéL jPŸN¨?íé@+j­¡*Ô§ jF T‘ U©JuêR¥ŠTÖ ÔªD…MO¯ÚU­2ªWm*W‡›¨‚õ¨RE+Y±ÊT§"«gõjQà V±Þõ®qjZÙT¡N4+aÏBÖ‘.º­r«“ÉRÆ3î‹ "ÜÈ|À‰ÇM•{ãƒ\B*ͪÊ&š=Êg{B*ŒñÑþ³œ}geS”1S‘Ê=QÈ|›.D=¹ÕínyÛ[ßþ¸Áîp‰[\ã¹ÉU®r/€KôÁ¸pîr"Ýæúöº½½„t© ëv×»Óíîw—K^ð d»Ã5 ~Ô÷>}”áOý„Ÿ7ä:ù R£FHx2üÀð€ \`Á Vð‚Ü`#$%ð]IßÂDÃÖð†9ÜaÄ!ñˆI\bŸÅ)VñŠYÜb¿¸Ã}8„Š1cc¸Æ7Îð""`cçXÇ²Ž‡üâ"YÈ=&ñ@&¶=³¶‰½H‹ò%áˆ8¶PÙD ‹X‚YÔò1Eþ¦­ªYf¶¶³`îÊ™-+¢5»¤+fŽ3› ¸æ9Gc6`Â^¢'6¾wmh¡nÏ[hCщVô¢}\éºÅ]Dx©;iîöö¿å1x-ÍiJWúÓÉí´¡7-\Šˆ0‹Ùg”¡9·Êöƒ÷ë—¾êBM*C™õò:ýˆçÍ¥³››ÍuR€ æÍ[ ö9÷c·"Ä+‘eiô´©]mk_Û‰–n"MÜQ/÷Û¼½4okìéq+7Üè5rÓÝÝr —d§f¦a­|0V¾gÁòHúÓ·“’Q;gžÃ|ΖPÅÍ£ ÜOŽkt–6ÌÄþµÃC‹1…{³œáþ|8ªødH·eƒOúYd¶I^r“Ÿå‹Þv·‡Ûîãº\=çÖm©A-sv¯[Ô87.ÌÑmsÞ¾«~Oþ ÍzÁÊÕLc~K"M ˓ׯ…zÔË)fƒçy×çuiCª]ÛÓØðt£gåèkŸDFv›íaÂj†¯q—ûÜé^w»ßïy×ûÞùÞw¿ÿð|Aû0÷§bu\Eëâû*ÐÄ·5«†?êãáù²êÕñn•»XçžxÎÓݯ˜'å/ú¬Òuôiåüá5wÒ¯µ§LvŸðT Gäô’f•×V’Ç (¶&»5ªL{GRõ‘à®Õó±+N™}ãÄþû×Óœfw*޹—|œ¹¢¿} 3)ÿøÉ_~’¯|G® lˆi:ë-[Óüs .ÀrþÙå•ôÏþ÷ÿŸ\Úk|ä\˜&·®È^„޶â£Oš Ö B_ò@Eb$V‚ƒv­ùæ(>KŽ*®øˆ¯U*.úDë´.BН€H°*HÐŽ\¥Ž`Ë#n«jë,ô)üÌOw{0º¼‹ånDý.ÁÿÔ/•lƒ‹I ! íO›&ÿžH•Ú ¡P]|…lšfNÜ%! ¢°$‚Õîíé 댚ŽVÐØÜls,eêTŽZ…ú2€H=ApÂ×Øé‚ (·êþ)ã$„E¾¤é^ "}P‘{ðÑ‚PuŽ5äÏ–²aƒ/Qý2±[R†þþï ¹†—,Q+±=q_à…Ên¯ ãGV<s¡˜îPÄÙNPáäPì޳ºâ„mÙ‚‘p®ÂSf‚Ü©1G—â`äÐ ÕN`fk!²a¶b!±·‘»ñÚÐhˆ þаK1[šÐÍñ FKž0jöoþ¾¥ ÕoÒ¶ÇW P Óf‹Ø&^Ü'QæCnMŸŠÀ ûe_^$-0â%¨Â*fã€b+\ðÍŽÂ*60žFDÌçbG(T ")¥Sg€˜Q&tÂRrÍþÆP„øé}j"ø@½Q&g’&© {…É‘K‘K8±Õq\‹I5ñ˜Â'o‰“0B"I‹> ÊÚã!ÀH^j¥šø&$È@¿ÚC#ì¦&ù¨,]â~"-‹%.êVP)6H#5FUβ€8Fq"…/K' äcTÀÏÆ¨ˆ®íD§b²&“1s·nòeÔoLæ1'}r'yrñ¯˜úï ×ÏG1)ëqÙo ë‹°òí\$šªaËT³ö…ΨôåÕl¥R«ì¢QBr+.F޶ÂÎ'€‰œž"#'’(–QCœ±(0eþê’éºÐ™Vb~æC1“;»³&1ý€Òý~24™ðs2(Ù‘ÿˆÒ=s"¿Ò?bäÖ> B²rð¬,%ôù&…,OËQŒóq2èâ îaæ:ˆ.-’*¬2P "ßò„@Nb;½SEWt!SÅ“2ÕÑ2R}´›2Õ#O¨±öòíæk^&ëƒú#¿j“ ¨LŸ|-ß,E Ô,!Nì.R.ã g(èBÿËÒTÍ´.ßÈ&üÆH©2^ÜNçWsõ0«@FVÊH¦nЇ ö…6õå%å¶X"´P$?ÒU¤ލ$ÿ–TÂÕ×nùþƒ¾B.â.‹´·œ$"!B5!÷oø .sŸ²i7—s–WÃ6 tMGtåñrwCt™FtGV÷!@tWvg7bccu†lCvY#vŸcue÷þvww¡ðt°ÿŠ÷Jzwt©Fjg·þwU×yãÂui ye÷wm™êovíó|âíjtÜc-°í¶‰Nøf@äƒÔÍÔ’Žð2×ÒSùÖòfϵe•žØð´NgÝÒeGŸÂÒQ?àî¢s˜Á 2…kÒ²KÝ|î+$x·Á‚s.ƒonƒ_N¼&øÐ0x¸¦NöÕÜ# IF?oÎPnÏ"rŸÍÁf˜†k؆o؆!l…â:Sâ@É‚Xˆ‡˜ˆ‹Øˆ‰_ ÒTìx,ÈxÌÇ~¬ t¬‰‘¬ŠƒìŠoìȨ؉—L K>ζèÐÇè¨L+CNÖòç _ÒíŠóÌ0®ëŒ-Žÿ‹ÎŠ“S‡þí;Pëܸ؂¶ØèX€â˜ëZëͼ¯,lÏ‹bËʘ‘¹¸8¸&­ ÜMçÔ#Ó|‹æÀ .Ô8Y“=ùæ(XÔ@Ù·_ö‹D+_ÓE … ~ïR!Ì€Ã.^{h#TµÖО×pÇì²Z6ùæù"Eª³½è6ÁÒ‘›Ù™Åís½­’%mš³B” "“A˜’¯¹åª‚½ùå¸ù+Nø!ðÄ^Àr|_@^²~¸r/tÊâ ±-Q€%$ŸY #ó7GËë¶NS³ú´€Íw1äJ´ñE%â™#Z¢«+š‡kÛÆ œ)Ú·zÌ3:¸.£þÅù·@ºÐ0l„.5ë?fK ùGOd–ÅWRÇRu™´ÐwÖö+Âfë}׌ H~SP—ɵêðWS7Î"Û—o z:OßXBÇh$æÖ5ÉBŸš±’‹ç¤™ª5 «5-ª%;²1y²Éí²#¹²­èc¿—ÃWOÖV¦û‹…·´ì0Ýå¯zãrÖžmµ?²˜µTµæPµ¤Î\{­â¼Lga»ìfâX„Bh~Ì"±›s›þ²·Yª1y³1û¹/8³¡»æBx³…cÛkHó~\-ä¾/6MvÖbÙ#ÔB!^6-eökÖê‚Íf³î,kf/ìvQŸ-«e3Ô{šÝ /Û²Ù€Ž} ¹ |i•Û²£;·› Dúݪ›¹#\› m&Y¸vÏ=Äús*¢^¢M‡á@úM¦£t .\yâ7×Õ+E89(C?Ux3ãÜ0#Cë ŽMðUJf‹N-,×ÂÀƒ\WŸÚ±%šÛÜ’ÜÈCÙº‡ å£!Ì¢ZãæèJf-òE@ÇSIBaü~mv‰³žåÌ?ÕeýùµAUÇï×Ë8•˜Õ»fgÖ%:þ‡´³›"BÈó\N¼·ü›É—<ç|Á§»Ð Ü®›,´•g/"®•€g oÒ7œnŒ‰8UëA©Ï·3½¦}BÌÒ~T¶á)Å»‰ ÷ú.Ž—9H^Ü?ÈõÜÖ½“Ï©Â{ËÁý+üüÏ•|ÂÏ+›K™¸édÞB(´¡`nöIô•'p¡”OÖRfEý®4fÏõeÕìSÛ§/BiÎÿÛ}¯ïëFÝ,ÇÕ&¼Zׯ¿õÖçÝ1sý1 =·¸Z·¨š”‘Kßýßó=à­yà³ßy íBȳ=#Ö+~¶ÈÖìG÷†ÖþSO2kD𶾿¯þeöÅÅ4Kk;A´¦¾I-½ÅOÜ~[ö?ÓÕè–™éæi’È-ºà|ªGÚ× ¾çuþçâß¡:è¿¢ªƒ+ZÃ8‘O-*ëèã]­±©k!N gK~žìYÜË|UñŽÝrÕyfï5Ìc<ëqV8Rfó @›>팻æç¾í}ær~ €Ý£‹É½ï‡Ó6[|±HŒ×9Юµ=D&ù£I¹Õ$hý$Úüoy“Å.{Ó~[\âðv]TíÁÌR4‹¶O²åñZãMËgÿæ^Rù‹”šî_¿íþÐý>æ [Ø5¹èïu?÷±ùºñe™”ùÉÓ¹Zzþ!¦^¿Ô†nÏÂë¥OÔÓ›˜¡ß·ovÌ×½Ü%úËfÕ}Û=Íì oߺ½Ëþ(òÉcËb0ÿö×ße_=ô~¹7ZÓ~çvÿþìŸ÷wØé_·¶[!À øùPíƒÀ"'¼U+R°H.# ’É•K€\eÈ” ó C#«©0ò§Œ#&M¢<ÈpàÂ^ˆK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»xó’àPŸº‹ðÕ ð`¶‡×.Jœ×0a±ŽGn,þøqÙÅr?d- ·2 ~í åEV9Ô˜ËÉÅ2¹&~ýðPsµ¤;ÿ ÔMt&ÔÝ.⮩B8Ðã3yCÕ‰\8ÒåTuGõíü¨ð¡Ò«Ã jýÏP”1è‘|mΖӫ_Ͼ½û÷ð×óð—îdÊŒÓæG‹YreÿûÙuß]J Z tP5ŸyT^gyãÑ@‰æÐDa”ËF¦6Ðn:=ÅSUR%×[KJ!U’QQ}·ÒQ?ÔÔŠ$îDÓ‹BÉXcsQÝøÜJ¿A´ÐC_…dX|Tß’L6éä“P:9_}s(àˆ¹ÕaV^y }XâÕec_¢Emg~Vþä@›tÂ9knåE­]dDl¹4ÄÇ  ”£L@:‡Œ9&U 6éÄÞýÖ]Jº5(T". ©S9*eœr 6Ú[|hvžžŠ7P”¨¦ªêª¬B9e]ó=k[eŽÁ!–ÍJ˜®zñz—¯²â©5ha’š1”…¡©¶ёD~xÔKØ"ãt*e‹ÓR@Âô· †‹)UHÝè£QÜŠ.‹@wÕ·F°™Zh]q–Ë)Ùê¿,ðÀgñå¬aâ,ZµŠAÃp-l—ÄCLk²Z¡'%›Úƒ¥!ÚÖ¨§®úêú F¥\fÇ»ÃZ~ ¶Ú€á¾vÙºh;Þ¡»ÜÕ$ÔÙBÄòʱ٬Ÿ“Ž­´áA_éôþ¹v<úÎ.Ö|ét†ÂÔF :?¤Þ°.ÿüô ÜõÙ¶«5{ïc-",—üþ“]Ჿ¶vÿ{KÇ67i!h*šÀr&ÀE‹5œP¤­ÎQOq‹*öz”¾ÜTe^‹Â¦¤·´ QŠf?š×âÂcºÓ¬éea©ŸwÈÃøìuÌ_Zö76!q€o9 ‘x;#‚íwJÐÇBÆP)K!ëCXã7ØÈÆ ÍªÒÇÂå|pD!ô™q ·"ôqk{&Œcõ†“=ž|§|ÝA£¼B¨™—%k!F czHÈBòW®ËÍBÄÚYF‰M|$3IÚŽTiÍ™ÈÓ’)Mì;“Ê^S‚æ}ÅCEè™혹¥€¯\®ÔLå¢ó…Ë:³LþWânB#r¥(D¬ìÖ6'$ ºl4£ó×!—ÉÌfŠ-‘»ãÄŠ(ÉE2²’”´fÿ°éȸÉ# *ĪؕâI¨tª©\C/æI” Ò ÷N$(m-r$œeóyéèÒ\Ù Ò+ãU¨óÅèPþ´Q£‚T7>ä<Ï IÑŠò~r¡Ø\4º·Ü*WÜl6;:ÒÊ”Ô,VÈB¥¦prj%KPVЬg1/púªWAb/*Š|ßB¡2¯~ 3޽\áövV2}›KªÍØ{é”n.ãÓé,ÊÕ®²î‡“Õ§yR“‚´¬XHÅ“…óH ¼¢þK)TCªaˆ” UA$š4ëGŸIãÜõeω}ßë¥oZ”ËÅq 7Sý‘¼d2Ù>5kxœIÒeùàÕÎzk "€<ÚM–’Ù4-Û.™Ùãµt“åôdC)‘ uO¬W¨zR®ÄÑkRÜÉÜRó /¦ÂR•8z\çfDæv*„lŒ\ŠNyUÍÆCÊü¬v·›ªÐp­×œfi¥YÍò’w=mk‹ çö1ˆÞМòãœbc‘vR¤¥KÖb'Ç-ÈÑQŸÀ$cB“Ó :ç{墬@ªJ=׿*´ây⛲xN”»Îð’¼›Dð^f¬ZJ ~Ì«ÚóªÇr9–Èþ„W·"äÔJu-€¸ÓŠ{Òéz£”JI¯Fr<Ü¡¢rb9íJ¬d[Y¾¢Ê•3yCsÚ½fÑtѰ–·,Ÿ¾ñ»'m¤Oëᓹ¤¨¯ÛØ42¹¹x6ðíŸèÆ·Û–²cQ󤺧KHáR¡Rl¢Úgëm+ºOl‚õ|KCG©#YŸ…!*iÛpùÒ˜F$}9Ú‹™Ä&uÚÊJ–ô²…ti)§¡·ñ¡6!YÞkbÃB°¿¶ÜÖžmiÇ9š ʈ“^oÌtª§E9®oÃ7lïÑp‚¬ÞJ–3Míj_lÓѱ§Ÿjm—ØÛé1õZ,þôÀ¹¸}Å3 ÇHVÃÕ”²¾°¡ž- U*eŸØi°?my3ï1Vro\!c}˹§jo°þ D©ÛÖBPe茵'Nñgb{£e¶ˆi%b…e\ãhýxZaÕq¶¸—3EPµŠÝôɽÁl¯)M)ªz}È–­Tè± n8£ÒŒEþ5tyôâæZ>Âeù,gôÐåMÏiH*Nõ‰ƒ•.#KÖÉzÖ®‹µ¤YßèïØ‘·BÚËʯWhü7y74y$yŠRÝë‚ò ¹?2¬ÐŒ&÷º´AgzGxP8îd3£[5âÅyªª;ÓÖÒÇ ³qnwúÛ¢öÒjSLþéŽLœRÈÝo¤ AkÖ±‘iÔ6ø[ #š ðúe.)çF>|%¾]Ü“‰­óý–ÔåX•­ª×ÇË‘_b˜+¯˜3w[LOó§½i¤ÉÍe"³Ñ™²‰tq#¹°¢:á¾hŸ©1°Š]c_ÏgÔêz'ç?ðÞ…pú_ýJåB+aÆC›®"s|ˆaÉI˜§cSršwy™Çi襀27™$Fb$£‡<4Jm— Â>œ!Y~¥p ÔW.#R•89Gx2td6T7#]ŠâøVBÚ÷Ãw,Z5m¸ƒuuøÃ€¨fÐç|@¸€'ÆZÂãpÚ‡Eþ ’ƒµÕ7³Æ!¨Q/‘h×Y÷wˆåB’sXú7O†W‚NÃ_y×_½çoøiÊórxS…}ărØU˜ZØ:Ów‡£ö|x„™12ÖW'0ˆ„Xˆƒ(!×3¡"k".¥Uœá\K‡B+FQ| ›½øx0ºè¶Aضߥq ·á—«IÂ8ŒÅ¨¾ÞÐZ/32|I›I›cúå3Ý“tfdLC"‚B>×)ùW‘i À”±°wŠá3(ar$ ꨽¬i_†º5[07¾Þ+¾쨩H<Ù/!<¨³ùžò&¯KÛ"Ád¬÷mD™G¥”Ä™wVA²íŠ9P©#y4: (Dw*{¥t’þ:8ÁHL¬i fü«àk¡ÅÝ›¡rAvÃS—t2Î3N&Zgdº»uƒÃú¿MÆk㣛ØÓ¼5j•Oi¼"ès ½2:²-!8Œw¥Wv&I¼ÇjŤJ̯¥»)…ÿJȆ,®+=I<Ù×I2Õ!±ˆŠ¸—G‹à72Dr2s…7l¢Vt—(*}$ÊB‹r›k}äRw™Ê(gÅžlÊñɨ|—¤ÜÉ›*¤ÜV ʦ Ë\Êv+2úòÇâbØÕ/ÈܬÊ<ÂÌœÌͼÌÎÍÐ<ÍÏ\ÍÒlÍÔ|ÍÚœÍÜŒÍÞ¼ÍßÜÍà<Îâ\Îá|ÎäŒÎ=)Fæ,ÍI²þÎé Îí<ϧÎÕLÏéŒÏåüÎöìÎð¬ÏÞ|<áŒUŽüM€ôf©ÝÓ@ÍÓBýÓCÔD}ÔFÔE½ÔHÍÔJÝÔPýÔRíÔTÕUÝÓÅV½Ê[mÔwYÕîCÔlÖÕ:ýÕd}Óf=ÕG ÊWÍÔl}ÖIíVGÝ>äÒBi(=~)k6Ÿ:7‘\e›«'wÓ‘ [,[N^AÑ€(Ìpõ Ö Øå´Šwzr)ÔtþCEÂl½:=5p¥üb½`DCsÙ8ÌIÈɧ}óڮ­Ú°ÝÚ±Ú²]Û´}Û¨Û¬Û»­Û¯mÛ¾=ÛÁ ܽ]Ü¿ÍÛÇ=ÜÈ-ÜÆÍÜÉÝÜÄ}Ü­Y$ <»ÜÑÝbT”Úg‡ÇÏ-~ØÞÀÓZÐ-Þ+¥Ý8†Þê­x2•Þ»½Þ§}·ýÞôíÞömÝ$ýÚ”FiŠ}$!Ö+*”¶•¢zåGQç>Ãç¬o¸¡Â ÉäD*ø’/°õpçØÓ®Ò uŠGÄu¥zò§ýGž3[’&5ÞØ*ŽÐQÄâ—ýâÓâ2ãÇCã+>ã1nã.žã<^ã=~ã:Žãþ>>ä@þã;NäG^äH.äJÞäIžäî{r1Ó\}ôêäýØÞ5åÙçáGŽâFÎäŠ]}Anãý-Sh®ØiŽæ‹ŽjþælÞÝ¥ çt¾æ&þR/åPWÊÈ’™)-±n¨ñÆÁÇÈ:! }ƒ•°þ§¡ge » „×Uvr´ ¦¢ !Væ –Í„9mC"n½z;’½YÃ×Úä]¤¨¾êªÞê©þê¬ë®ë´>ë¶.ë¸^ë¹~ëºÞë¼þë»ì¾.ìÀ>ìÆÎÝ{à„npƒ“¡§xÐnÙ–]$q.∞°\AéǾàØÞí×~í½èì™âáþRl¦Øš>îêþþMoNîî¾î˜á§îÝ~ Fjê"Þé]LìäNñ9Au]êŸüéŒ&˾ؽånïp&´“îÓlÂ!³&ùÂÙÂGé×ïƒSïȸçW~Ù?å2ò$?ò&ò'/ò(¿ò*ßò%Ïò/ïò)ó4?ó6ó7/ó8¿ó:ßóŸNÞíØÝÈøÒV~ôôêårÎ&Т è(~$óŽ 7âîòžô\¿r¢YBKÑréådïR1–Ù‘íõY¿öÿ=5 ö .F-Æà}NnšU´{¹ac¦ç PHŒé ŒÂøƒ?Œ…¯¾¿˜øÃxÁ˜øŒø/ðøoøçþ¾…ùÁXùÞp· žßùÙ žúž/úÙÐù¢/ú¨?ú¤?úú`ø€/ø²ÿv^ÿtìû–û²¿ûì›û¼ïû½¯ûÁÿûÂüÆ_üÈOüÊ?üÌüËïüÍŸüÑÿüÒýÖ_ýØOýÚøº¯øŠÏû¸¯ù”ù“øåù™Ï¾Üþ‡/ûþÃþ¿ûòßý‚þ÷oþë/ÿ“ïøúÏÿáí…7çD8à ƒ "LH`C‰->´HñaÄ… 5TÒ[‘jEøùP„äÊ%OVKiRåK•Nü1Ù2™\:ä*³3Ìj|rIÉÇ[¦M6}ñTþêTªU­^ÅêÔ[.®¹NtVìW±a—bõVòÃѤ$ÛVzòåÙ«t³ÞÅ›Wï^¾}ýþXð`Â… FœXñbÆUí:†¹’Odš'[Î$š2³Q¤%áæ"â(Ï¡5OYµÑÕ«/CYÚ’èÊÙµißöL»åîܽu{æíÖwI(/¾’íJö¸WæË“sU})ëà«Ox»|ôåÛ”l«¾œ™èõ2âyŸ7ŸýzõíÙ¿wþ|ùõéß·Ÿÿ~ýýùÿ¯7áxc ·ðN<{㯵ÖdK@ Óû À\Ð@Û†ËCi+p¸ðÐ{еÕ:\>ÚÈð·ëþ\ºL³”v“Ì-•j,騚ª!͉ŸÊ('>²C ¥ØÜšÑFQЬI3Û-J˜>R¥¥¤ÒÉ&™”‘J¯c®9èÀBnL1ÃŒ.*›ñÅîÊÐŒ¥•tœ±šØœÔÅ8/[“I+ýì“Ï-tÐ’=T­D÷\”¥D eÔÊH•”RDÿtRC1mTÑJ=µtÓKCÕTSHI õTPE]5Ε*œrÊ5cŒK$C4K]±ô­O(©DÉFqå3ÎÚª¼íU)=îÜÖ~›é5Q† ž´¯[÷ܤ<Ž)·!MâX8Ðrñ‘Œ ˆ*»2,³82pàÑ·%=—Îôè ?ÈÎ’¾,õÙüÝ2×ÈSb䢳Í®îüàs“ÛLË$‘Ï}UþÇíÀ[Éwµô´‘&Êp$t;tý”ž¦Ëª§{Oµ§¾ùì½ßüüñß:úëÅ_ßüöÑ_}ÝŸþúåG×þüåO]&}Úr®Îµ%ê@„ŠÖߦ¶)Ø©ka7‹Œ¯òÁàÜ-BÚªÚØÞv3pËWô[ÙnC¶×103|[Y«P¨.à0ŸÛÓ‹d¾:‘D.èSBŸ”`^dh‹í¤:”€Îpn!Ï aw:ÁuMû@y> )–MƒCZ••À1èávÏÙIîtw¤ÂÃdÖyeŒ7“ó¼«%düÀ W$Öm۱̡äò²íܯ2Ñ^üþ¸þGò ò\„䎹¿AÒÐcTäl9AF.’•”$& ™ÉKvR“. `5&E*šï$9ɉÚT)™D®ï€rÞˆ H=1®–€Â¢+QrJ,Jï„mc#*oùšlPY²å§‚(r­Nv# Ù¸'Ì'ÉIAǪåÝD‡¯Âa t$9Á ªéËýÉ2X‡Ò“ºâ# tÅ5E0ÞðU„3øŽO£sKeò¹£¶Ì*”©+ƒJRg¬¤ôÓy»D(ohG¦ÚñL]”X.æY €³K‹NŠÁSÂ51êœ7A·"nâ²Sûì¨Èy6k&l¥ü›nf2ªÊt ª)®nú¯þ˜êô¥;j)GiÚS—5¨1ùiÙ:SQå´¨TÔ @a2P™þGÓ{ƒfœÇñ¨0áe»²JÌ®-,€$ÞY'#¶y «í`œ¬VÝTf7xT&›‡MÀ-P®wÜçóÈš©ê9.ƒ“ÒåYe²8”ðK-…a¹2z©SR¦md¥ë»x”‹È sd Ìi<GÐÍѱý ßôÚÕ)q 0)eŒŠy¬³vy[Ó ¼–/–IŒ_!c «(Úä£=I:±8Ñáf‰y¼T[eQÛ<̦2}{ÔŒ^­kHËØOzåî9µ ^Ev·(ßõöÌ;Þôzo½è-_[Þ«Çöþ>o¾lŒ/Z³ ßë.Ö%…|"X¨ÂhŸ¬\ .eë(éþæc-roÈ™µÎ²,f_é_Ô¶¥½,©l÷ú´ÚJI•ú„«]ï¨ÓEùF»y[`XÓÕ’îN¯|;J¢[ŒØ¸ëØ¿†Üø*ìQ. …óÊLØÒÕpé…ðØÍ’œDNº–Ž$ýƒÉ-Ê£-˨ÁÝ•®-«¹Å‡5”bfÖmD-G \³ˆãX_»Ó+Ýéb »­YL_&R™®üï"¬µÆµ£z%ôù€sèš¶7BtBíx`ë&ú}‹†t£MéHvÒt´¤) êJ‹:–n½T[BUQþ4š(­ŸW5í½À’uzÊj°Þî(Ö_/Ñù+æ¡—,0KJô ûhke+˜Öª Ÿ…6Wa1î¬w•È„¼Gâ½J2¸B¤‚\ØæškS¹ùSŸ4gÌÆëG\­»P“’’áql…b¯r8Ä…šá§qIìmÓ¡ÓsÀøE’íÊ ÞZ:VáÇ9•k>”i´®a¾5Á…îÛÙ®æ) ®r6 3¦9Q0•“<åZùÖÌö¨Ó!¬åV”ùÍkŽ'ûÐ_ýî9©ÇU>ÊõUa.¸m-ÕÑש[ÈhÍ$Ê-ìàÂ"H8§ÞîÉŸç_¯ž¼²_k }%ëµÁ=Gw«bî ¤&ó?²QÜ£ñA—Úš¡ƒ©§Îɶ“ c«)µí¢µØþ y! ¡“jh½cª,æ9Èñ´‚z”ÅÒ¶U¦`Ê?âá/½k/ =L3ÎÃAÝ‹†s«Ù§˜X# s£!B&ÍH¢ò/¦:±â#„?êR)#¨´®Qs°¢;6h;¹u :.¹+ü£YÒº+/'„9/Ü ‘AÊøÂ 9%hr X¢;8¼5;°¥ùº™û1?“c¸k«¶²  œ„Y+§û£úZýZ¶ƒ" G:Uò0[™—À¤¡íêžu£¶Xê£|ɺ+ú¾;6ªI§– ƒè‰‘E ŠŒwYŠÐÅ]äE]ÌÅ^Æ`Æa$Æbþ4F_Ü<3«Áˆr˜åøEbÌ(¸H½DL¼Ëˆ c|ÆcÔÆmäÆnôÆoÇpÇq$Çr4ÇsDÇtTÇudÇvtÇwÆlŒÇ¬ŽÆq òŒ¸¸ ž y ? ÁŠH‰èˆTˆ$HŽHH‚<È‚lÈ‚dH…<ÈȆ[ȆŠÄÈ‹ÌH´HôÈ‹ìH¼HˆˆH‚œ ‘)¡`Ù@;Yȇˆ0H„$É’|HšŒÉ„¬I™ ‰’¼IŽhH—„È$I „¡üIœ J‡äI¥dÊ£´É¦\J‰dJˆœJ¨,Ê–œÊœtÊ…ÌJ¬¬Êš4J«´I‘Ë¡|J­|Ê™ÌI¤DH¢ŒJþ¯ˤœI¶¼J\J§œH¹,Ès€É¶ÈI<:̰µB+8«uz7ΚC êhðsÌ a !±LI!AÆ º™òª=’‹!á6ÑdÖ˜ŒÆ¤‹c@Ôc6ÌTMÙ qLÊ´Ìö¸ÌÌ” ÌÜÌÜÔLÚœLöNà„á,Nâ,9Îá´MɬÍáTÎaNÜ\Îå¤Né´Ná´MÙÍÉ\6ÏtÈ´ÍÛ4ÎÇŒÕÏÈŒMÚtCÜOíäÌæ|ÎÞ$OõœûœÌúDÏÊä„NÿÎüäÍÚÐMõüOõн© µrÅÔ›ä‰ÙÐŽ´©/QhÒþšzT /áÐ uC/ºmq¹Æ©=2 ­º‘e¶˜ Ql‘›Z!´ÓX>m“¸äп±:|ÑQ±áQ¢9 Ó• íP´R”ˆ°%MRz&–hÒHѵ=‰RzÒ ÅR)µD(ÍR+eš uÒ/­Ò©ÙÑØA(}<¾¹Q$5›E ®‘›â"MI9ãÒ²ò–?áÒµYA"=€S$}7UÂC¬&±3Ò"Uª$!ŠÒ&AåQµÑ›J½ ²ÙIÔ3E·tI1TÑ´ ”eÉ¢¢A·½Á×d± {D7'D±¹#¹EC¡rú‚¼sJØN=&É#X¦Ñ’=‘ž~]“Ç‘?/û¶ö©¬ ä‰Âû~\,{YW™ òò1D›=àKW l¤Ym ýÓ?!I:Ø`å“$ÂyïøA¹~ÕÚë¶Ÿº0ÃRÁ„ZBó{¹²²Ù¥½Yc9ZmÚ¨eZ×sÚ˂ڜ“Z«¥Ú§Í:!Z?L°%*ÙaµšcUÅÂGþ_«@QôãSN!6ýÉ5Ü0mM/¸’¯HC ýµ¿í×Ò»ÕbeXq} ۫µ¡2H“[·«ÓH%x“YL2x*“²ÀÜ̽\„ã­ƒË\†ÝÏ ÏÝÒÝ\Ó¥³÷ÝÐ-ÝÖ=3Ì=]×}]ÎÕ\Ù…]Û-‹Ø•]Ýu]Þm]ß5]Ü]ÝÜÞâý\à-^äý]ãe^åe^áý"ÖíÜÝÞÛeÝØuÞç­^âµÝ¯H= Ùˆ# _#(ó%ßóU_ôEßõeßó-ßö-ßõu_ö_ú}_ûMßùÝ_üÅßø½_ùõ_îß&àF lžÿ•_þ%à†`ŽàýÍþßnà†_†ßúÍ_÷ý_Þàþ`ý aa.àî` >aÎàVavàva~á¶àÖáÆà `` ®a¶_a >`õýƒ#žáNb'Þa&~á–ána–à ¦à-F`+Žb(¶`þå`!vâò•œX4<®,*é.²*¶‚¾$IŒ…cÖÚ%9Î ³sc9ÆØ¾;±‚ÑmARŒýãB&äCž½!$µ5¬šÛm’@Ö6;&Í=®dTÂcJö%¸=Î <îä`™c¤Md„jc$å„ÒcT,QždQfåS¬UVdXžå8Že[~åQ¾e>þ6eX®e_,<&¦‚º!M6d™9æÑ¹Å®I†ã^¶ekcN&fUåL¦fLæfBÎd7Ve´‚æ[&MTN;;.f6½f:&åSöfo6åk&fc&æ6NçH†æEÎgýråtÞ–ofåõð ¹›uU–u¤ ²»µJY¦VDè~ ÕBt †-ÄŽ²ÇékŒ&à³Mc#ÛK·h[¦Ž¾‘˜0Äh›¼©P<Ó½ù2˜:i–骩»LQn;ÑJBh´Òi FhŸFéN,ê€;jZKêcè­kj=}jŠîi½i Bi”6ÙIɽˆiXêúéLs+°žÃþc“‹ï6}B±M’N¨C¥•>Á•ëaê¬iœ¦é±«ŒŽ6akžÞ¯æ·ï‹ Ðd©³h–vì±6kžnhèI•Òd’X¤œÄ­:Iks2,` Òÿ¢v©Œ– ?YºÝCŸýAùó>[DZÞ[D˜›?¤›Ñ óµ†6ÑÝÎ$°ZVÞ›¼)³µSNü«Œ¬ë£¸ ûíTÔÐêŠn¹Cmè¾4åFm澺éÆn;Òî妺îÆ&Ä?j–$àÖíD\ÂrNÑ.íoCÁæ«m×noÑvœ„5'vÁÃ#eoºãnëNÄðSà°“îÚ¶? œ¬UÖÔ–þ&AðH,ܽú;D\œY†¥êömÔ¾¬EL®ù¡ð,5©½jB¯ biëÁ÷8·’1䣶WÒ7ë¶gÂb©i Ô®œ¢ÃÞ³Õ•jÂYrñEŒÛнŸ3U¬l]âà D›ÖÓûù“¥¼B,T(?é(gœÀÉ%.ç)‹ÆòÔs– > Ýišó£•­6€›Á¢ù#p±² —™ŸûÌŠÛÒ ëè&o¯ƒ­´ ÕÙ’ÛòŽ^]B(\í¢1›R׃Âн*Äe/•b©=?:A· ðÊ£ÏÈìvÚ ±6:ñÞ7Ï6!mä›±:èk«$½‘¾BÂG‚ºFÖ:´kÂD_ñ9öŸ³¹6T¬ˆÇ+%ª>ã¶ðVUpÏy¹¶Ö6öÂG» 'ö„Á°¸2n­ ó÷–/VÏö%̤ RhõÂþ¯-yŒR2 V¨U#"-³mëbGÔ" £CÆUº ªÀRüpcÂ÷Á«{òˆ|ŠTX„àÁj‹ðQhðCþˆ„8P!Eƒ øAáÄŽ 3*¼¸ñ GŽ$j„á@† )ÎüH“bÅ‚%mb4XåL‡?#:,I´âE‹@%~d:ñ©Äˆq&EX-%Î…9aŽŒX‘L®\:ä*6—̓<ÕöÄsªNœ3eº4÷¨Mž||ÚÜk—gߣ _úµ:5ðS¹Jen]Û·éJ¹4%V…zr®Û­‹-|Tþ‘rÎFÇ»ó¯G˜«º6î6öA„M9Gµˆ‘«Ñ¡Iã¦Å:8óB•þïÕf'ÞÕþÃÌ w£.ºÖ?K\¥æVù•g×u–x±Yô`[ rÖßhBmgo^ˆžp…Í·l3­‡aG]'PfL=—S.d”àd˜ED.:%%’J½1…’‰-5ˆ>½åUTW –—xâTdc?Ýeq€ …MîýVYy+U"„®idz%9•W ñH"E¤É†¥H·8¢“!‡˜uR59]Œ…T§ˆDE•ág:¹„THK®ôI”•ŸùMÆ•{x.™Øaz"ÅUZrzyàJ¸SœS²´ž“lFe”“ò(è–ÿ¨˜’¹a…ãd)í¨{¤¥‰×as¦þÇæHsùeë¨Å úhIéÝÚ§–…v™Ÿêæ§€$ÖÆ¨Ÿ¿šZXbPBÝö„S`¿m÷ìOHÞåXP &›ä|…É{Ócò‰É›º/µWâ’ÄÆ TtÁå© jmÄWT¥P2™xÂÆ's ¶'àI¾Jø¨iW™÷e™ÚùVn}àE ÜBæý‰ÚÊ’vW¦äQZi!òw’vf­¹çÁpd¯­Š^iÙŠ·–:/ˆæ–ü—‚j½ dWÖkgpÚ«Å›IÆš‰á½öçÅÓ®[ó̈žgÚ|9x¯ZMSöæ—C¢¨˜ªÈ¹˜ Œe•Ðâx›Ü,®ÖÜ’C"þ«_w?KÈÔœµR ×Ð%È1“ì®ê¥Ø;nmÜdB‰©`bJ2j«}êQ+'ËÇ–ûq¤>>Õñxs¨j’S^wìÏ·Oû¸ž’z¦¨ì龘³´ ¹ ¾å=ééÃmþfÒ{²¬È‹Jû[†rF9`ku,í=ÊL-ÜU÷©YCÞ}Ý$wx"™!‚køáyb½|,› –Þƒ¸ÙÉv»Í‚⹘m%AÌëQ‹¼U–Ž.+P£vRó%ý˜ím,!ݹr7›ŽÏMÙ:Tö&D¾s-n4ûŠhx“Y•ª<©_\Ö¶ xqÈ…Ú"Ðå.õ=Õe‰„ß¡ÊÖc(â1hþc½ €j’Àm Of"Sjø#šó]ñgS£ÒŤ5"ãÍg¡{IöF­•@,Šœ£Ÿóç1t ÍŠ•cb‘†ä™ª™éw b\•FR°˜Õ%t§9Ïà¾WHÔ•gŽ¥Þ÷ö÷¯“\­4N!’m¥8f qPRâY`$£°á\³º©27C!JtJ‰‰£Ž&¦¤µO*ÓŠ¶eËð ©ÿ[¥º'•>%fŠôr $; …|9,šèÜÔ™Ï+ç¡ã˜,l[ÒÐ3EÌm‡¬Z äP¡d§Ì)²“ŸËè8;gUΕ­t[dã"f§g’*%°œËÆüZ3–‰I`$g;6¼ÖȆ¤´æð#Óž™SZaLZGË3þï±¢¬S”®€Œ/RþŒàXü–iêfàšJš‚ªíµ5â`YÙË•©Î`AZšwš‘^ö”8mE)W”CÕ’S¬LéÀ†z²!^D˜ƒ»R¿˜H°µìAW:¡EÙ§Aë…1]b³k!ëê'–Ö|Ày¯FÕU>xVv1îÉæü„æÕrk“éiiu·Ë­Ìƒâ©ì/:¬Cu­d† žå“JŠ]Ùli è?ˆžY8æÒ ™Thnlˆ†TU7õ£»*!!"H‹^D³´(E1¦™:§Y?*)¥í5_ÄÓÿúÐÁô o´zÚ-ã‰1 ›rø”ûSþÈmcbiØ#“ÔÁÏÚþ‘Æ"¤¯v=X­¸áOñþh¿ºÉca¦iߗυᘎÚʦ!2,Çô2Qkx×ú]²†¶óÔ´…VÿZ¦ìæ•É"yi>có%©º/‘–:V𞫞äšJ0lþ%ÁEb>]l€‹Úo¾.ÜkÇð”Áer.<Ó:9ºsïäæwq5àéQÙ¾ f¦Ï¨¸ÝU]6©]Êèé´kÖ+n{·àÝÓ*)¶«x¿ïÈÌD_8Ù½R9¯u1Êä`+{ûÏnÆQ€7ræ¡°pÃq žÅÉÁƒ¹¯}ÓtÖ̘ÊêpŽ7Y 7VÐVC(  r1Á3Cùjn“þgÝŒ,VM™Ù>´W£NTgñ›÷ž²3r@Û6]Ÿ]Ë}á=¤Éί‰ùñ’…áM›Ó´/É}3Ëp‹>%®@ä”S:‚¦Üë+PØt—Aú3KJÔ-KdK/2|ê3Ì‚ÓBa,Œƒg4édñôsjeÝÞ÷²U§>,„@¶ÄÏ ®+xfõHªÄ™“éry{#wïæT€ç (¯;לáÙ¯àlЇ6‹¯‘<¶& Î팪Ðl^K½*ŸÙ¾jëµÙG‚¶UvúªS–V߇WyÞÿ(Ì+:¯dn´Êí矻3TóçŸ÷Ë©O]ÜéÖ³iŠ–"#à@ÂþdP) bšÛäó#à°Hý'ªöå¦I0€ƒÀ8¬Ô‹…˜M¸ßYM˜»T úÑŸ þ! LÍ™ËõÀ&€'¸ŸEI„ÂŒÏaPÉøÎƒ è„ ÂúR®-Ñ/ѯ¹_L(àE ÄÚLXEÓä%=¶h‘NñV ¥Žø—PŽt5M»œ ÖÌL¸ÉŸ‰~1£À›šag‰ï$ ÏEÛ¼KËÍš™©Ïà›ÍÌ ]Óñ‹­QÏÑY» ÕUZ³˜[V½–Š!¬\¥m_cDNN1Z58Û’åM!]Õ@KD*TÁ¥Ç þ#Ú!ÿå¦hÈ0DøƒBL)R~„¾PkUDbÅØœ‚ÐËÕ‹¤1İŸ@ ‚þÉT"¹ÅUjYÞø…!H$9ØZʨ•™ ßU#E)šHÒ§à…ÀPŠ`~ÅÁ‘XÚœ¶iÉ}t‡•£íJl 1^yÏy™W±’n©U©PÝo\–õ„3•áç9’`Ä5¹NµÕÎä»0_‘]ÑxHIFC‰—Õdœ1ï°Ó“}È)z\A9ˆÕÅÖÕÈ¿Ñ3–™z +$ÔõaÚ1„Ú=\Á œd5Ôä(d *1JS þƒ&`ƒ¾¤äJ~@ $€B?¨BØÃ$ARÆH€´ñW›† ~€€üÃ6ÌW„P²d+uUê(„ ÐBTƒ!°‚ûµÀ €RjåR–ä,ÌJ²¤.å ÁSƒ>éD[n VŠå^òAhVB5$·YÄx % ÄX&¥#ú=PC6H P¯ìR†éåÜ9 Û ÅIe¸àëñžôÏyŽk~Ì4ÙÛÉô‘c š²å ÞÕ¨™TıŒ;e˱Ù̓m—+uŠiåá½[+yÓÃ…Š¬ iº!°Ž2 äÑIØéÈ,þ…³|ÖÞ<ÛY(Ë’håSŽ10£#~)°B5Ü PMþ˜)Ž€ŒÀ=Læh¥#:≸UÂDD øA#@TÃ}æç~Î)ZÃ$€(äÔD#ßé)>E%€5|(dºß„êçI]Uƒ X€T.#î…V^(D)ð¬è!èh5 =åaĆlÂàB ŒèŠÚÀÐ@ü@t0hƒIÉÐØ0cýÕŸŠâç4iIjåP \ŽÌ‹³0¡ÊmÙÒéœoá‰i¹0Z›€–f—o’•2Bâ¥}]Ü”e…ÑïI–”d þ€Î> Rþ*TƒyòÕ+ ¤ÕZîDE[»ØXŽXR™h< ëѦ{®šÝ„—¼¨ôPב^Ž¡}D("¤M`æŽ&e5ìÂ$Á <DAáZÙ C@C4ãVœBi†é$Ãüj°k5Ãxƒþ-¦VúÃ[œd‡ÍüŲ6ëb2ã«°>¥†Ô5ÙÀ‡z@9”$¶¢Á¶Ò &€¤k° +%‚ üC#¼ÃeÔãx]ÄL¼š‰û©ë Ì@58Ã&Œƒ5|)° Ùh¡ÛðjÃV+±nåŽÒ^a®¹ÁáÓiä [Ý ‰˜«ÙF»†êÆ_±ÈN\9 âþ«˜ŒÔ?íLððfÖJ[Ý׺D&›Á^>!É=­ÁԢƣÉì–NÑbÛŘnr^™DA´x÷iH‰ˆX¥ €Ep)i]Qèb}–¤hƒJ5E)¸ÁL àBÙý¸…JAÜûÕmZ@|@h†ÃQœ¤v"–R5#)(}J`5(î¾…L¢ñŒVÃ8„"Ð'ãèæ2#=|9x.þÛ4H)€Þ|@éÊCÅ0"ìRè%|-ª«Kû©„Mrn™úÀ?^*1ÜŽDš:ü‚]€7q™r.#XÁüðÇ:ÄSª&Ü96*[€`„ûUƒûë¼Áé*™ ¼A”.rk?ÞbJà TÕþætSÏÆ×” Šá,-leØøØ¢î‡7^JÙ ÍÁ¾#ÚH°zø)Ìü”®¶EKø&¤QÈESáÙnÆì–~ê5bÏ#òä©ÓðhÓ\ÔÚ£¬Ù´qOC‹OÝÛBÒGEN-kaE\réÛÔœwÝ/s¸HM-@!#*êZétÐo“¤ðA‰Ü}­“pä„_ìGÌÓGèž”è‘~êÀ1gõ"Æi’VÞºó@Ò ÝªIYjKÙVż³@\°›H$²Ò:)IL þÄ©´yˆªªòtt;zÛžæDÙó9á$Þ&ÙšU.õ”C–Ëu´ìýžL /NîIÞÜíTÉYŠšeþÙ!‰œÌ(âúœA$Õ¾b¼U›…1¤å„OؘÝiБaØ%Û ÷ŠS9]ÞÎ µVátºÝt&>E!²í!†ÅS´8²SÀ@Ñ™èO:a™“Ÿ» sà…'»ÄCdb6.Ò¶uÜO’ÎŒ—9©)«UÍú©+13¦J\¶¬TAœ[YÅG_+Ôe¢­°,jŸÎ¡ ÄÝuÆ9–§ôo«Í`Œ‘šÖR<¤`9ÕY-Ôã¬Ô­,Ïš!*;3‰¤MK:5õœ&7ñxò™$#—ê•–! þØ“éX­“y†Ì1ÝÌÊ^VQŠhÈQcoj[Î9ûµP€…’MXþ8×–Ä]xcob« õC²unmŠöúš¨Úúô„² ‰£»Á&(kSǽiŽ×HXDÖ2w†Ð73¢Ø6}Ù6_^&^ìÑmâ­[uÅ…ÚW¡—:ÿ£XåЫTnIäøê’HŸ´Ü\”,›Ý%õUñuz½öµ)5õUgí6?§Ùئ•_af­øe}![H2!*b#É®)¹Ðpžï‘!̼—DwŠ÷_öT_óÑT1ñ9=’ŨҲ—`_§a}]PËàµQ…w4çŽåuôæŒFê!”ZPi‰¶m¬^GÇWÓ[»ÖÖ>R-ÃÁoþ^;¡ëucmθ°ù]mšÁjI5se÷fa h§ S°œ—jpíþ06¬ìam—󘧒,Yá~ð‹T”‰ÓÓZ»$m“1¡¢å×^•µa?±U ‘4Ö ÚÁ׈–øâw+ç+‹foБe) ðLƒµ±7÷*¡MrÎ6ÒYáIߤ-µ ‰.Ú£ó’M˹äúöÒÍm‘'^ëEkb!5Z2J†®C™Ÿi':ñ{ÛD 9FbËÎ6ï‰NûÔŠÙ\iW®l­xÕ‘Õt›Ï¯Ë0…™9«žsŸ”yæ¹¼ƒÉ´ó×…Û‡¿,4j‹§¼—uøEþŠœ½iK—uËüê“¥]§^cp˜4—ÙÊG WS¤¸&‡7šP”Gñ_ ó"“©EŽÑ [ ÑÞðDɨ"Nk œ‚—3K šT#î]ês?Ô{ÑïX¥¼z/§§zý³4K0aýÚIJ ¤‰eß)ÐŽ:T¯–u0GŒJ+ÓÌû6Û’;j{þ§å~Ü×9êলåz;¦*!|•ÈÕ4ÑeÍŠs) aÉ™QF¢}<1†jTj4{Y€E)ÁY„Å ü>ðÿ~ð ñ ?ò'.ÿòŸó¿ó#ÿó7?ñ+ÿóO?õWôþCÿðwö{?÷'ÿô_ø¿ùoù§?ø+?û£ÿø[ûÿûÃ?ý·¿ùc¿ýçÿ÷3?ÿ£¿úû?@ä(ðÄ@ƒ L¨ð B‡ æŠØP"DŠ RŒ81#ÆŽ=äȤG’/žœ¸Ñ¤Å.E¢Œ “%È“2?δ¹³$N˜¹>T#S"—¹ÊÍUíC§N›>…*µšÔ©V±fuÊç)ÓªE¾feêt,U¬\¥¢µÚ4êV±mÉšµª6lÙ²dávÕ ë]¾T£mTkØ®y¥"«x¯X½s ïµ ×kaƆ%[õÛ˜³æ§„ÇÝW²b̤å†F=Zo[µZþo>¬úéëÓE(¾ÝWñkÜ»Ûå üïêßiCŸ¾+{vbÈY}‹ívoô³ÆïeÌzøöâ‹s‘É¥ãhñdsåZM}‘õëÝ ®ú>ýb¯ø0U/_þÖ¦íé ­õs/¾ªæ#¬¾ôæ³o±¹JOÂTP? „ÀÇÚB>þ;DG4ÐÀ ADpÄ lðD[LC¾tkAã#‘°±x̱½ú.DÐÄŒ±Á û‹Ã$©›‘I"C”°Aüô[ðGQ1ÄÊ2<’FÜÔÃ1B¹Ô²ÅY¬¬Ãß<œ±L÷ª<2ÉúÚcÏG1̳©ùs@ “Cþ ¥4òÄ•x½ÄK­K¥=Wiªü’ÓUYŽ·Q°Ä+AÖ2Â#å{ÕÓ¿®õŠÕN—4m˜Aë´–ÝŒŠáÿìíuÌǺtS¹Q¦ó/;{ÄQY¶j†Êïã°æ5Z¼^™òG·~döîv\g!Eþ;o5ÏDº,.“×»W‡²Ü—×ÌÞ£^üpÇo…ú[|ÝÐâô˜Û´õi€{Dr+œ9v0™Ýj ºy†mmØÉº.¾oúçG~˜ôÊ€úB'N:.9‡ÐËQ“%tyã'±¶­¯¼ÉÊS¿mȧW©£éG d RJ ˜A¨Z\ØäŠD-¥µ©dAYþƒÜ41¼ NZK‹h:fÁy¦s’jG3úËK[³Xª"&·|[kSíS­ ë…—óÔ”¤$b Q6rÙÌÔR'µq„=•вu¬ µgUþ”ÎuÅ€EêiÛÕ×ÐVAvíPˆô#Ëè´ö% vnZ\Dâù‚ÖŸF0DC³¨Ü×8$Y°ƒBSb†ÔÇ?>RK_~ú¸ÍåiW¤—Á^f¡¶ýGTÐ+škàD¯r¡j+]ë—ð~žÐ<aJ6ô‘ Tfã«Tå*[éÊT¦•±L¥-YéÊ\ÎR•­¤å*YË^¾ò–¯Ô%-‘ KYS•Åt¥/þ›Miòҙɬ¦4qÉKa*S™É”æ ¼á pŠ3œà|Á9Àù¼1  sÕÄòw+§±iui›ÓÜÊÏ”E«s¹ãÝ0èCNbŒtýªWñ@¸7£ñ,’ÛºèúÉÐ-áLž<$Ùø4È.I~2U±£×˜ù]1i¡ý¯ Ú:žÅOi>ëaÌú%>‹ùª`ÓxTDïYr{š7Ê=ï¹ëˆS¢PkÃ:ò©È\+›§Û·°X•'KùÀ-ÊU­n•«]õêWÁV±Ž•¬e5ëYÑšÖ±êÃdõF5¦èÔZ©GþÔÝ•ê²ËÁîn!åAoTF] zÑ+Ý þx¦ÍQpÝì.(σñyØ«wS©¡Y¨5´††P“zªš~˜W2ïQˆ’ŸZÒ–°òë¾Ú("ÿIXqMô†k2×ÜðÒÉIk‹:Sž¥ªÏâ󤈄íÇH÷·÷>¿c"Ä3žò0(ÙPëwÁ^ñŽ—¼åÕj6Úê.ˆÀÕÅÑcÙ™Ôwùâ"R$GBÚ¶ „|Rœ&g8,„5_2õÙÕðö^¨ž^ÁRÙ} ²4ÍÆ^/K~‡Ä%Õªëžë'Ô¦ã½ÿ¥ „TC߇¦>Ø­|F×ò\+ÂL7¹/~1‹&w³Avë£"™\í×þ¯ªmYjÔ“ i[œDmê^(–ý2÷c¦ ¥(Û5åôa^-o™Ë]örWÙZ†›2%(ìMžc‡=Ü6H­ìL?Ë.?:øpBü­3‹­Éð ƒÜ—%;IÑ”å:à\|Í-A˜‘|RR€¨§¾ßz¶Õ ƒüѲ(BJXL"iç:­0áZ²Œ#Ö’F¬)¸ttgÇÕfÛ­ÏrËr¢í*¨êîII¦Y³““;cöe ‚üàš5ôÁ7ÛN¡Cì5ýªí"…á9eÀÕl€ÛÜÆv·³Õp—uÜ^-÷—·êítcÝí+zËpØ\áù J+Âþ¬ ¤Ýcgî×®~[EG:g‹7<†"˱‚Y7ÐàUÌ¢6Ÿ¥ÔÒtÖ¼$ !âN¼ò³‚Šæˆ×I[Öñ‚N h ï‚Òi§Üw‘À(€8WV ´à†@€ëq3¿†I8z­u)™¿ËæõÆvæwƒ]..Mg4j™£±É&´¤+nÊ[¬Q×gS™õw}CÄâŒÆ.s”M€.fãb Y_eª³ºr–Ïw­êݬçÖ¶»×ÝÕmžð\ 3¯ÀA03¶~P‚!ï㤼Á·ot²GAÌ1©_ŽÄÁ¥«ç¸’¯LcCµã9ö¸mýCÆ-Ú·Åö kåþ&* ¢òƒ*Fªöz”ö¬ÊÈÁ¡×_öõ3¨_å3êª×MŠ2”q ¯e×c WuŠ\"aq!–Â(H|Ûtï•G}5rÑ·.m}Ù¤w:Ö=iÔJ¾ wÃ¡æ« 7ô1L…mlÜ­†wÙMÜþnï°ÛÄMݾ-ÐÛò.Üð÷nÜPpð°ðÚ-  ÀÊ ^à Â+˜bPÀ Ð@ø€]P‚bÔÁ ²àÛAj¢"R¢'~'nÂ]šâ‹@ôÀ‚b NÁ P Š j®öªœ ðàqª “ YðþÖŠÀ V` ÐÀb !²ÀE2 ‹Àqn,¨`B,ÌãÄ Ö° ëc&Œð"(†à|Ž0àð²à Ï0 æÁ (Ñ-.â„h¥â¦ûš¬ú*ªìFÆéÑ>'¸ˆ® lsÆDÓ,'GÖi¹r8´@o¿zǦ˜Çê_Ò‡á` oŠGÕZ먎-Âú䥔«ŽÆDpø €Èr!®-­ñ±qð+P°Ü0/pÙM½Ñ1p5ðËàm,Îà7ØëËÀŒÀ)¦aü!(æ`>î¡æÀøš0 ¡þV@ Š`ßà%R"ïñ"+r"5#1R#-r#+ò"ÿ9Ò#Iò$+òò1Ú4²)Îæ Á@Eä\!ªa Š`Fø ª %Uò/2(NÐ@ t²îÀ'‹àŠÀÄ ]’ W`C$2+',X,îàõ r ”A?æ *¦Pƒò%r+ná AÞP >,«"K¯2@r"‘¢í8í¡®NÿœQ‘<é‚ Ë°œºŒåƒDºðDEÈ•¨iΡtq¯”-S–ëÁ–åõ꺚ïê6‹ÏvLþòÔ…b”.bl ¡ÀB”HIÚp#ˬþ ðÛ´± Pµ-wóÁ ‰óÓ18ױ˲á<ð@0¡,Nàî0qãÊAX=j¯*?àš¡¹bçÒaÎÇÔ€ÆÔ çtÎg]^ÅÞܳ‹?¾LZ‹-°?‚ò7b/(àŠt Zn: .ù@(Á ´~ðÓ:±²Eº2(TA@W ø7DN¤®S%âASÄ3© Þ0(èÎ!n2øÍÔ°²*<4P¾ÈSäŠà$±<›²X~¦:ëÄù¤#„NÏ>tŠÁ\HuÐD~ŒŠdÚçPÔe1ªC¢٠ Æ~mIÇÌÈT*z.6þ!E8ì/( €ü¬`ÀAŠ L]e“xÇ-ª”Ș/ú)ŸôÆ’ …ˆêŽlLéÿp37oPË‘•Pý.QƒÓ6/ð€óP‘39·Œ Òë;áá;«ÃÌòÓ=‚÷¢Â¬! ›ð1\’)®aU3,h.¨(^ðìi˜E±¦£d¸ÃÁ´:!ôçêóõÖàøÁ ö~ÀÜibò“%u% {åTÐZö­,"sŽJL$?ù`?«¢+ïÀñˆA”Ò)³³‡Z)¸âS™b,?à+ï®Zî!ãµ.åMØ5÷‚gU¯¥®.Õ®e V@ ¶,ÀT¡Ät–€æ Àau€TH´w,Ê”|ýà¶aì—=Òê@zˆŠ|×yäêc$É÷R†m¦Œ(Œ‚ J (•Pus pyóg!°#°‹“‚78ƒµP‘–¼ÂŒ}ÄSQ0IèX¥¦{ìE¹äv©ÁÄGÇ´e©)„2Mü¬]ªšpii±:ð_ŒVfáˆè+>õSWL Ɖ¤æ)šø„ëÌû-‹Vþ <Äl‚âó¤ØuX¸rJS2SÎøG£fDfŠSèbwŒÍB,’äncÞÉz®& æÃ,@ø`Ü@cS$š¬)ÀxáHøàl7 YpB‘¹TÀ>@{ù‘/vŠ¥¨ƒè8¤¸Ø€N[‡MA¤`»Ç ¼Í ˜›¹×[º·»â™к—›¼Ó{¼¿»ºãÛ™‰¸¼ïÛ½Ù»œö;ÀÏ)À¹à›¿Ñ»½üºÑ‰:Ý:» <½Á©À<¼Ééâ6©+Œ\±â¤¼oVziª}K9Iyo÷l1ÊPJc„™K‹÷¡ô†É.Ö`!µw  ÈwO46TÛà¡¥ÁWµ6yGP|›ÈQ SAJÍL6 e%ù´©>®dâ'1·ÈæVÒl‹nDºØÇÌ稖V׬JÕå>ÄÜʬ ‘“ï΂£„g9¼¨½ÚÇË:?P˜)LøàãMFÉlìës|ZV¾/>âÃ}1ºžÙ~,  íÍ]4Õ©r¥ëÓ¥ÿÜ>¨À½œñ¥›U]/•f‡ìñþí¿ÓSãí¬ç¾î¹>pÂgîÐþ¬‰áÍŽì…gÄ?Ï÷d§&e†iȦ'¯.,+§ZVþ²åíôPJÒök„׾¸wûMÄžìõ¡B‰r=bn®lHµ\c®TŽHÓe·¡ŒúhZf†y<Å>‚”΃)hóéo3}Ù‰ó8-0™Ýµ_)øê±>¼n!Η#]è=ÞÚªœŸúøø%—ùàRñ Œ›?KÍŒÎwÖ%kõatÛ"—‘E~ðV¦H‘Õ6dHáÂ"Õ>lHQâ o*4ˆÐâ‹'V̈²¢D†?œøC0W™jOÚœX²dEŒ'W6ÜXp`Á2‰ò\™Ó§B‰(-žxÑÑH>8©6ä9R¡U‡S!N5©5kש'»V´J0eƆ|˜þîüzu"Ú¯¨:”¸µ-I‰q©zÕ»–kàióÊM ±ÚÖ’íÚ «´gYÅ…}¦åÚ—ñEÇaãÒ[ÖïÉ­^÷>\ˆ-a¶%U{uHm."¹œY"W.†ÙÊ”ð€p߇ÿ&ü¸oâË™']ùséÔ›Owî|úóäÍ»{ÿ>¼øñäË/ÏòªHÞªœ™ÕmÖ·ˆ›VÛX1½E‘7-×?ÙMFù7_뙆ŸGÍTEgÓ#¥ÅR{õÁ 3%¶ß|"ý·V‚R¹7PzwéÄ¡füu("Eï©§Ö[–Eˆ"~'ÅÖi€¹µŸh¡X]qí‡cd5þ†šZ±-¥#Cv±ö–bѸ$^Bybl‰ÄÙ[>fö•I©¶–HJÙF|L†¢cgVŸ¥ý5Ø–:åTV]'²–Úi~†9Iyøºép[†’Q‘>ÌY×ÝvÕ-Ç]qÊawt–çÝuÇiGé¥Ü™Gj©¦žú>5yWK2 e™#ÀŽgœ1gŒ.q$à]CV3+¶Êç‡6µTÄð‰uÓ\¤•PÕ+MñM.Àe\¶tãB™È•ýÝT¦BOaÈǰ–IR±a–ÒS.I¬uS¿Yò媫©[zúû¬žc-fS[­•ÓVžþÉ)%™Lv(_ZIè£ÃL0k‰}æ¡_9«–Â$I1V„=+XX²ÖZgv2Ü-È}‰ï¹ÝÊLò„«çžn¶É¤ÛnÕôv飡BÚtuÑ…:5¨FêtÕ¢nj×^ýzF‰å•ˆu"E€£C6°^#r@,²UøMe´:!°˜²Žrìqˆ/4t΀k–Uj=›`m½xæTStbSÀÉx O‘ƒ ¨Íy½"GáFUÔ¾wYU¸zœ©föP­ËÞx’‹K¼q6 Åí“Â(Z‡·d“>É/¯üòÙß¼òÇ#ï¼òÍO}õÔ_¼ôþÜG|öÏ3?¾õÕ£HóŸVþš;Ï5{h¤_Ž«ù¯dz*|Ý «L'b0bõ.)¥xíCÒã7ˆ Ow¡J€(Üä‚Q`ÚÔ>Eµ§JjÔ‰N¦:è´GU „ØáØNˆBSeCYsÒHNpŽUËc8Ã9ˆp‚!‡¹ðŦP.ÐìŠ!ñß¼‹îð¹ÁRð'ål>) ä…Mì‰ÊBÜ ¥s|‚>@4;iˆ7¢Š@ªU,Ól+^zAKÀ*Æ„H)bª†#Ä>6ÁÓÐûЄ"4újK<±—Gät@)±i[€À‡Lþf“eÜd'9 ÊN~Ò“£$%&OYÊP†2•¢%'5 „lˆ¥c¡!Fú÷±0L±»cÖÔB¬àl'0›#¨ æt"‹Ø|læ¿y L ¼ˆžô‘ŒL°6 ƒ¢tÃGIÇ8Á©97hÎOJR’BÎÕcÎ ²3„)¬§=}#¶xaÆl ÒI#œ C (ļ1:Œ"Ÿ+BƒXÓt 9ÁASขáç]v€ ðGþ@h4pÂã |7ÐõÓ*—Ë\OÐ’ÖŒ)µ“ ÞöU9«@HgFú‰…„B¹:Ñl§î÷«ËLì©[î8˜8•&w¿D 6ç¥Ð£dÌ5)ñQ…—îòLÂskS¼%Wfq©L¹(U‚2膂ìÚ» ÙÈJö„úÐQ{å±Crð†‹`„æá|ÈE€¥ÌòÊD‘à N„¼`¾ÙÂ*¶°ÓQxâHëÖ€?”@‘f@ ¶µÏqäB65ä[R —!'@TðÒʨ¬îEÌëCDbÅ™ÂI§eË2U5áE.XÈ4D抎`sò#Hóº‰ìCLyÒ“îdšllu²&•,¡dÀŠ12þ>îsP1 ˆ%’QŒqjâWºø'Í’vˆd$ÍÙw™µ° u‹Ltýðûúª±j<ðhŠ5,oÜi*rxÆ4®1>WEÆð>‘€PïŒö"Ø\‚ÕÕ¼eÅÇ5Ø‚“·à›<¹E~ëV6º*ˆ q¸ôA£xéËš•6©ecæ¦ËÄˆŠ¯‰2ψ+Æ.éÞ 1pU*ý¼Š],RgE6óGëš*†׬KêJí–É—JéšñѪ/Ýœ¯"˜,gH³¹Æ1WÂïY ·a^XW&ž›Lm›õe­ê «Ð4,±IÓ.VÙfk¨FazØþÄ.vwT5 E2Tu+¢]R€L†Ö;øƒb¶ÜUˆˆ 銢͇h¨;Nþ^Dne—ÛgÚÖp‹[ ( ׊Åùó}–‹¯ÍR‘ ­©ËD@ôi–íÅv5>†ÙIç]ð@E•]y< EtZƒ@œÞ”¹È©µªâ©çáNd4;¢™l4•[ß,mlgceL:‡ „â•¥2B•¦_cå%´Ò‹†_ù’Nx»'ºp‹>&ëoï(ã­yýWâBû4û.b(nz3imaZÌ¿vÉŠ 6º#ÈŽ “ðáÓöjÎØ¯ ågC I;U¤ìÄa*pþ§õÝpLwס‚á«Qð+‰!?€h†Ì@.¸¡`áoz' Z$Ë¥ºçßö$,u–·áKpúÅÃIî ªŒö]Ó£õòV½BPâøQ1™Y̸é_ÕóïÑÑô—ër²‡ÀÙp9ÍÐ(þpd×…zúøÇr¸*SWÜêùaÀFÔ~¦ð‡€Äé-V2ÀtÍî~Þ‘ÙüÚ°¹v9ûü›GÿàáÔN娀1‡lHA?÷Í…6‘¹°vF°(Ið0aPÛb€Cô. Ñ€øÕfndðGŸ¡¬åGË`g~ôò†zD q%à‚þUÐy;!-øÂ] èPÓµX¹ ¾P£¥l÷0G&0âBεF~”q³ç‚0ƒ0‚êC¬r w{zñp/ø‚1Øy€qoXxƒ¹hO(oQ(…2¨lûE/¡1S’äyzQ ·0`ËY37K>º”®313²EÁÔ;Ý‚;žF<ÙÇ{{ÑséçKƒ@„;˜Åh$u ¨ÏH#‘u¿–u/Æ55€PÓ`3Š¥rŠÄ¶BtXfgYV Sà€Õ&q˜ qÄ”Ÿs; !‹ÕÀvÝAPÕVF"˜h÷6wp¢E\†Õà…§†%À Šd7Ú•R hþÍ ÷±(" @@ŒFp”Àxav^Ù(gDSð„R(/XÃ÷TDa"rïø…^8ÿ9qV4W îØð¨qó¸"Ž÷ Hà ijT£‡0§°° xXOš&qLaˆˆ`Q—>ÞÒWž§°`- ¶°3‡è]?S *‰‡A:ßg0Æi~"~˜$âgäçBó±M,–4ö7B&Ä)UcšB)èOQéNí´”‘Ò”Jù”ã•My•çtA‰O‰C2>¡gïR vÀvZRñ;F’zèGikÀ–ePmNvIrÙShHÀþ^ '‰™˜< ˜Œ  €‘„Y\”Pd °ð "àÂZ3ÑrÀx©cS¡o܌阎¹˜GŽ$0ÔbH^‘Eº°š¹ÙšŠ ™Ù´&»¦¹p¦–šº©˜¹™˜É'ˆ!~ôN‡2t“1·de€ P¥Ð`‰BæLf¡17sséÒ1ùEž§Ͱ-S1I0`ÌðGê¹Ì@àðE0I `À€)S° wðIÐ ä°&œ÷ 7vP w #p åR'=yk~5?1)‘‰\Mdóg( hE"¤•òdBZ“A!Ä”þ$$c#t•¤5D5V#c`Y€§æS £^ ÞQmoYmÕpI'°£¹#wã\Àø™´[0¤ ˆ[5€¤çH–íáP¬ø©)ƒ~UP ¦eZ¦½0š;*_T„ð | =àuAØ–"Ð瘡pùPí¦f ¨UðJº¹gS°ˆð§z¦hØÈ®&ŠÊ¨fЦrÀª€7H0 çÿ° ¥º б9ÊW e 6еР+°¾áq0áPÀ ·È™æ›ìØjVVG–k‘Ør92!µ&w` qé¡þH àzR­(rá0&P À 'RŒ·&ã0E ¬ð›(ãt`eT Æ9+ÉGAçWir0L²MÐ(‹B¢5:0º5Iy£(ZNk)I™5¡¨°k¢ K°ôÄ‘ùÔ„/”€øÈcˆ×Mœôœg±I' iŠ'öÒ+‰Ñ±[°*[Qz‹"k„µo ƒY´¨eJ¦b:¨0b^Á™/Ed`ŽÇeiÂØf”ñ:†­'–å28[©<;ƒ‰1™7ø‡û§;»³T«;ŸWoy/²Àµ¨][¦={ š~äžj@ ~d ÕáP ôpû¦p:·#ørþæQôZ°âÀ e ‡P ÁÚ3wpÿåytÂ2G'&ã§¡C‚ö[€Z a` ZįPÂàJ [p¿ À Õ¿P À­gé0íе{»Ñ*0ö  Õ0#0ÆÐ@«†M_2¯2Õ‡´”Z5—˜(¹Q/×°£B°Û4Þ[°%„AO¾+z¾äËAVS¾ÿ‡‡9*o¦Rc“EIP¨t¤LèjL»²Œûö+3PF3€‹¹€x!Lº€g³çH© ð!Ì¿'÷PÍ{%dF@耥VgCÁQþ¥¦¨dÚ LŒÁô¡¦hóÏé8R[-lÁqðŠt&¿©’³R+³Â9lÁ!³Ñ"]J/ŒðœP|–U<¬êª°:ݱ³Pœ°8¿ñªŽ{!óÉ'6XÖòt9µT—f  À&À  S Á Å` ` ÀdÇ;qåÐp*Åpêp‰µ ~´ÈXú  ›°*Ò}ð}sÑ_áù'uIâ¢,¶(ÑX%Ô¢(:±âûÊ'ÊÊâK¾´ ±åk£ã‹•`™OIÒhe ‹Y´ ºñR/5A ZV B ^[@ÌÅÌD¦åþÃ$¹ÌzÔ¬ —EôaþFQÁâ~·—EBRsËÄûlVÎ¾Õ sU¯B–¾>µT9/]:)6žgså·8@óUb?D6ox¹N1x#q8b2:,}]°ö?¾’4¶áMŸxí¤Ïü˜&6|ñí£qvVUj2>NöòŽø’M]ŠýXj/E !E’Ù—"CI†ª±+²Â%ðP½Åc¨IÕ?‡qa%éðº­h…Uk1a´ÞŠœ0ò¡H®2^$¬V„ÆÕ>Hä#±a‘‰16|8ñ„·j¹ :4ø°ÈÆ“#þ‰¨Ñ!Ë[|Ê̤YÓæMœ9uîäÙS§¾:64Hñ$Q‰,•¾¬Ö’ãÆ¢J“&}©1£R“SQªÌxÑâQ”¹^¬Z‘)Ê©B¥ž„Z5)Ÿ®KUžµºö¢J®,]ÞmË•+™dt@8—Äl>/fÜØñcÈ‘%çÔç­ŒÞÄ{?|ü€PáeµRMÂ}ê9Šnö6Ñ2F¥«u<;ötjƒ,?²|m1ïW¯QÅîå,Ò Èj ±N¬ ‹ãª-]íÄ‹ƒ# ~°Ü·Þê(IÕý¢³‰È_ÏþÖ%I·«‹T_&©ÕðPKgÕË™ Ý¸¤¯$´‚Ò§šÉTp±þlÖ‹-¤R2jºß˜R‹º’d*%ðFË0B½ÆKI¬Ýñ"ü^‚Å¡šk6´Øª®·¶ºŠ4Øjt¸Úb ‰Œ\C(—\ȘHŸ“TrI&›ì)›*âû0ºå¢ëÎã®JWã0@ƒ€nª$ê.£¬¢¢MÇÄlJ­2·¤*Ä4]ÄÊÇ­Ãn»ƒ:3¶‰Ü4(EÍ,ξóŠXˆÀ¥j$q4ïtk ¡‡Œû“D¾ˆzñN¤Ê4®Ï-¥"ÓÐÆ*Ñ ëB ®­0MFðÜšR&'k ¨«¨šÀ¯ 4 CY÷:‰×Y²“ªÕV²RkÔ‹¿µâzP6:ƒ;êþª£h«¨¨_Íj%þØk‰N¹†M“Üj€,Á ÂÊò°³u^zëµw¦[ιl\$7*“ j,£Öŧ´zU:®8 ˜!°p”6Ö®‚:*Ë…c}1´¯¬:W¢ùNªo5Û,<µªFÿýÃcôÎä(ÃF ¼oeŽ #€ætT­Ít I˨4e†ˆ}¬^•t3#p,ÀqQl)} Î† ¨M‘šê¨±¶ZŸ­§¾úk®ÁöZê®Ë&[l³³®Zìlî‚9ÙŒ‘Ú¯H›hSSsä–S‘A̸%“À»p¿ÕäuЂ]²âcÓD/ ‡˜GÈ"R°v ›HÞ{;÷üóDz¹þ´šÄÀ›ONb]VQ@]=iá§_ÝË–9ŠÙLDã›=ÏeKÉ8UQ5ֺϚP%Oéós_Ùš7JGY'þQKM+VÝÿö2ÕNÖr!ïˆ]œY‡oÿtdVo4ÓªBÉj[.Ê•ÂÖ£@™EVwÉÈnf†´ŠÁˆ@BÔÌŠDåôd§b4þRÑoR´+ˆ°FK|¨Ãʈ'A„CâšOCRU'Etµ²0øTo²+T„È´CF$:,Q$üD…” P€Àá_ÄVB·¨ÀÈ)âÙ©HV.º½dS䥈™©º$“TÉÞÆ&¤ÀÍy_ZšWÂbËXr“´H‘Ö2¼ð✠yLzA‰y™)Qò„W¬^]‹\¤*s‘ õ(7~CÕëTÆ(65.u’ ‰Ï´ô§M2ŠwâB\–Œó½*}+{o¼ŠpÊ“ã¤;i׌ŠeFä„OõA˫̨»ƒ93Z}CܰHµ¨ÝBjÙ˜(D)jѨQTjåþèE=ZÑft¢)H-ªÑŽvTj¹*Uß:éÁmñ3ÓY~XÆ—\Å%˜2å4娫´0p)g™ãýr-öñŠUs±Û\¦ 8Ÿ²Hƒ)Á ‹d dfU«Lʆ¾ ‚$Ü¢?=[Ø ÌzV´¦U­k=kkÊÊV¸Æµ­®)ƒ\íÊÖIeŸ¹k_Ñ*3½âÓ2~%lkþƒÏ…Ö¯çHTg|6XÅÞÕ°½ž4žlð|àìf=ÛY΂6´ ý¬fE»YÓ¦µ«5ígÀZ׊v´¥E­j5›Y<Ïžáñ§8±ÔY¬„ ôÐÒâ‚.jÁ¦‚SÔXÆ"H#4¥hHÍQþnEAêt%MÙ`rÁ®!©)ÅÜjyÍÛ¬tæÓ§7Üû‚÷Æ×ð¯|Ý[ßûæW"ôÅï}ù›_üÒ÷¿þ5S~ÿ;`þ ØÀñ5Ï@ýä_û&xÁîï|­£¼€À Öð†íµNoÔ °*þÄëqåÔ,BDáS>ól{ 0˜ o.6÷r¬—7ÍÉÌËÀ¨(“8ì60cÁ^áËWÂÆN†íûö¿ÂçètÍÄ.w¹¯Ý½øÌÎÙE¬ö»»XK>l±‡Ÿöù2vfb\páñŽöú&º¹rvš>Pã¬+©AäÛ•óæ!SŠÅØ%|Õàê½Ý³OB§2X½±Ý•±¾¨ŠÑÒoÉú†’Ž:^*Næ! S"åÎ|ñi˜nÒUIެ žecžxS'Ð H¶dêOæwôѧ“^PÎô,¯Ißwøõ™$Pî›IÓ#ÔóN´Ì?A1ßÝЄu85z$^´£‹þåá©›Ê ­Ð ‘ãÊŠ®¢K²Nj Ÿú7;Ù&Q®íRð2"3ùë@ÏÙ:þ‘"0q5æŠíê?Ls¢}Á4E²´G"4ëp+ð©³ü´F:´†€‚ ,ä¨Ad¤VµFË3ÿøƒ|‚LC½8ËÁ;ëƳ<Á&µ%¬#Çú!tAEG³Âl°“©?ë ‹ø› iH’4<³±²›z•@ê'ZÀßò¤ù¹#8ƒ€$;¤¼¢c¢‹pp@¨†)¨=ž» dÑ%/–Äy™²´½—ŠËq¡/#7üD{A>‰‹ÝØð©$þ8Öና3©§¸ÕH.ÿᙆ˜~뢖àŸÂ …ò \¬Åë‰E’ÆäÙ«Eñ7û¸¥È7rÆ„H=Üû…»Æ ðŸ,ИŽ\¼e¤Ÿet¦ˆ8DCðRÉ,šxŽ™ˆ‚ˆ5¨ƒ2`ƒPƒJ˜ {ÄG}¼Ç|,wìG~,8ƒ3°cŠHÑ£M¢¶Mâëa ]ú<”è+ ‡‰˜†¡i‘g‰£¿9 à耶l*”H,¼•£B¤’%ƒC0AŠ/s¡ ’«Eœ¬e’=‹¨£×h‰#‘ ¤«$ê3F™3*‚¢Ì"q²–Ó+þÝ`¬ÿ8,’¥…¼?CÂÂ;êPŠÊˆœ7+òAôŸá¡ %àp'îƒfD½Ú @©K¶€Ÿ”&qÙ[£‰ ˜‰X†2PC  ø‚š(ÌÃ4Ì™èËÄœ‰)Ȫ9®5)ʼn·é§Z“¥‚ Ý£¤jcªl–WP…"0MUøWH{¨ƒ†ø (‚$€QðèØˆl?¸m˜ƒØ‰hMp˜Ñs(½YN»½¼Ü˜^Óµ¢²ï ·w¾œÌN®²Z+ md© Ÿ†pEëY2¢›¦É óä<›Z¨´ÌgâÏ8ÅK" 7ÎSþÇïŒB*šœx{©¶ÐÆ‹ë>–jgË%ê«PžÏ“‘a4á¸)Éj@KH¡XD½8Ã2`LF¨¨…%˜‰P ‰@‚‰Ñ­‰ Ø‚NÌš˜‚xˆƒmÐGXu…t:§2¶X 6m2˜ Ÿ-¸žÝTÔ´†Šk¨R`…j¸(M1àÕh¤l—I-mh.e>¸ƒCGJ%¿‘²H,¨c“¥¡»Œ˜Év¹ÔNBM[Ø'FT£<.‰ØCpƒ3çY%tI ‚:WéHq«<¢¼‡Oý›ÁD‰Bôþ´ˆ)ø†\Éår(âÀŽI³¸×hžl"!Ù,ü} ½Ù©=¹ðμ²# ²xÓ¹fÁ6,ÝäƒMz8„F1ˆ+éљ؀b°‡&ðšx+¨ måÖmuL›èÖ™ø€O`›ÐR‚\L-˜—\{ œ –ðpßZÐüµjùLQÓÒÌèàƒ]X€$X(M‰¨R ðèÍ2XØ¥ÙLb•£cÙ"i{˜Êâ¹=B5 7ÍI¾BÙÈP&–Û¦2Eå[Bt X0…uI•¹³H9‘Ê£Ö겊öTÀÍ¡“£ú”ê‘Ã"˜‚N0 XÄþ-Ó$‘£|žp :‰\P=iЩÍ#aªžj¨–p¦s šØaº°,º¢e˜ˆ(Ó6造É QÆ4(ƒdLš€sÝÛż ½%Ì¿ÍÛ¾-ƒ(ˆx˜…Z9Ò' ¨<—’À¦Ç]%žâ +c‹nhl0iˆÍj 5]Û‰°+´Ôœˆ à\þ€ÛÔäÜÕ]]Ñý‰c¶zŠÈw¥5á"¥y+.ƒ˜:ºÎË#Yàu }Зš²Ÿ -*982H«\-˜‚ßr¨J9Ñ¡ (ºÂ%jÙÍø1¡#À¢ É©jHNøÍÒ‡ÑÔ2xËðû¡¯Í¥»\UéPþÔ0B-tœÅ±ˆd-¨Ùý:6*ß·d½öÕÕNÉ«ï-Їjø9ÍŒÛŬÛT°2€>Àà .ƒ ž èûàÁí`ž wÀ[šxÌ¥‰TPá&i–Ëv „zœ¹$Á„F€‡3ˆŒ`‚È†Õ õpXƒ%M>jÐïmŽÒœb3ý€%6Z3 i›ÄÝÙØ ²S‘I ¡I ¹ÉàMã'AÔô,Oô{¦†0+ (‚?0‚‚8\xhŸµ>•!*É"»œåÚQô_BF 0(èMùxcú,}I¥eÚ³Q»I'³øÅî»Ï²þI mÉ›žÝŒuÄ6eŒ¹Ùï3ÚOv¾EAá­¨Ð}¥ˆ(@‚$1Àˆ»D {ŽGh„^ƒ2¸€fH‚a˜‰ Hg†æf~f€€b.\ €i.pX°¾eLiNUH܈±Y„)C¸):i¥¢õ F{V/dTÑKª¾Ñ)Áyã9ѰZœ!".ÃLwf. T›Y5nèœ8T)ùÆÕ«ôJ‰o8 ø€ìËà¤É…M8ê!ù]“LmŽ;8àª]‘Ý(éÛm“GÞ×?(Ež A½Â¢}ÒˆˆL‚\8Áp¶@ò7CØhþÔ. dVá£P¼¶´h¦æÉÙÔÁ;Úxvžæhê`)®cEº¸œˆ½t蚈LîmDC ¢^O^‘žª®ŽØ¡TŸÂYP󥯋É-YëëL%*d{ÏMBÐÕË¥M ³\¾ßEkȦ Sˆæb\då% @™Xá“åb¸hO•Ô ¸,_ UO’øÙÁ€?¶æj é»‘žài>†ù9ðé× ê x‹L‹_LˆEÄ€àÝ´‡üÎrúŒÖy$`.Úž²ÒÃeâÎÙ¹.çÞn²Þ ò[•ccUÜQÈVÈÁ‘®‚f¥y þe-*Û„ÝÕÛyª%ã‘2ýÈ wUšb« €j˜Øa¨”›eZÕ˜Jåt™*ç¶*bŠl Ï—ˆV–žÌ+>°ƒHuجì#Ø™øƒ?˜èM“ˆ`AZåMÕÆÿPðÞ MqNU[ÖfíÛö‚`–bšn67;åF^€õÕè Öc€†B¼qÕÅ®èkâM&wîÐñÛ“ŽŽàŠ©êæ˜r(¨ò2Ì—jAB6Vd&ÿr+™¬(Ž“yÈa%–ˆV /ƒ¶™.¸¨¹¬Î¿ ¡Šê?åïä2ºgƒ×ÝY".çÝq:ÂŽgw)Úä2â9bõÌÎŒpëÄÇ®s‡þAƒ&“7Hàƒ;¦ Ï`$äöÍ)hDey‰Ôvq*pq„QÖÓ† ½5‚Ÿøò*wÚÔ,‚ÇOž ‚8r ¦›¸Íj!Ðcž_(Øöm¯aöÑA­åFûÓvn‡o/u÷§å¿ä^˜4wnO÷uowRöî£Ûb^aÇ:ϵ*KO6ç²è2¶PzIbC2:ÆùÔŸZ6Ý#@ ¤9 ‰Á€‡»øguD%d:bå•ÅFˆa²:†æt5N/€§ˆ›†r›¾c‚}ùý$êÞ”ôÂÒ|[wqCÀ‚Z'…‡å$é1ʵ½mþu/"8zu§í@YÜ(¬µƒ"êËÉ…oðU?‰;þØMŸ%s•÷‘æPz¤7ûív²ÓÑò@ö_³Oz¥§m½ wÚFãXâ¡ò£‡û£Oû–Õ+Òx öFë¶Y²(Š]oá¿åzï¦tž-¥¬ø5SɽҘTáÊd‰tÄ•IŸL åÔ‘‹Õ6LJ—šäÄ"T’Oc“í± P5SD«#q‚%€8X%Ö,2Xd¦€í PEãWqÀgÈÏ+›AÜ™ ¨³{¤×ñæø€¿\®î垈fЇx_¸ À>#8JhræƒeëÎþT`&¸çû³'ì‡6è×ß±}xu§€ R‚ˆÕ>T+’ðà oÕNüQ˜ËHoeò)‚ð"–)’ A…5>|QdâI“Of<˜ñä}|ÊàÌ©s'Ïž> *thN}L*,R$æFŒJ3¢\êòäÁ„TÎ<•©R©H¹nŒZ êRšR¶¬ S©Ó² ½ò9ÊçmØ„Híju™”î\¯Rûfe{T+T™I³E˜+r•Yœë >¢–/cάy3çΜo+“ôCL— ?@®fq#Ÿ)"âþ1"ûß #"â@ÓÁN«¾ˆut5!O®þK((å&=¡²Ú áèâæÅ‹víÛ·s‹œ‚eQžž¨qbpÁЭ$C–)e(F4R@9¼‰K÷E+Q´ÚBÇwà}žxg™”žG±d‘U. `ƒÜ5q]ø7¨M(`pV¡˜á‚jÈx¾EèÍJeÌTØ`[±•U6Ùp¡Ùèc Ù$¦d’E"ɤ="É£’?*é$•Wy%Cnù$—_ú˜MU¡ØU`UÖR\p=§‘WcEÅZ™¥Ñ9\bcF„kJ•ØLz™…çSÐõ9&ˆ™UãhÏ©&ŽW•V螌åâÄc‘1ÙÙþxÖ©§Ÿ‚ª¨edcaZ¤±ÕÐCFœÈÖ/±ÑmI$ÑX@œ°EI\¥t¾hœ"ã ûÃ%!…žCüZœ.U4P´ÒF+m/0AQõ›J,ÈìE¾`c=˜¢“l÷[Vv© njâÓR+­¾×¾{g¼¡v‘gqtoµÕê[¿J‘fU¼ÂUX†£EØ‹¯ÅÑò»–Bÿv[g¿xµéæAlT²É#“Œ2É+§|'M$3ÌòÊZÁ¬‘É]Ñ”×Q6ÇóÈ…ú–Sm±…ã[xBÕ—a‡½ ]X¿ia_éuè[JCM0qW!ýÔ¢ -FvQmè£þH5¥çF‹•`)dd,Fre£Ò]·Ýww¦ÏÀ¨2ÌÐ óaÑs­‘ÄLÐJZn'dÃm² ÉHÄL»UœØ ÀrÜÆÄp‚›D^£WñbqÚ–ÔÒi'PÄë­Æ+yS5è²üçVPüý:‰KŒVq¤ë­ékAN RìÑ›3Èç+ž ƒ­‰­6u<õÖòæ”Z²îõÖÒlüÖ#«Õ~oU¹‹ »ï† ¿BðÇ¿×x6Š‚{u«LcÒÓ]æT¥É+-É™Øî¤'³¥UôKÛšú'2†ýi‚ÆÌšÀ•§h)†aàVN6 êP¥‘ °àþÖ˜K•€1 áÞjhÃÖ0MÃLÒ—"pÌT¡K N>qqd€·œU‰K€0*·Æ£*8îcPb‚ð€xñú A³µ-˜ „cáú•I®áÝ!'Äšc 2ÀßÈH^«ŽX42½0~adlÔ]È7¡j@†x ä´ÀøE1J‹Œa©“t9¡)N6ûã#¿8FƒÐ¬h@tKÔÒ4>¥_aÛËw–—ºŒgû›È`4EM¥€ÝšÊ,…B©P„zQ[_R#ññ ™³ÓÈ–'¾uÌ|ÅÄš]:Ç(­…°4šäJ¤²™ÊÄŒf…I3ß3«Iþ5Tš„mn‹ Ü(ƒÃwÂ3žŸ MRúÖ·Õ±ªYÀ SÄž€1IøO7ò9ဘû¬ ,ðç|L)uËçØ€dì:¨kš„Ö³GÑ ” ƒ}îc@!¥5HiH¼0ñIˆBùñ*J,1f:žË#À"¦S…Øt ÀiøU•†8o<Ô_PpÑŒ‰%+15ó˜—©%m’w©‹¤4y´°øÎcbŽaVtòéOg CH³B°–Esó€eUlká¥=ý‚5ó9*O°¬šQÝ446“Pî# ]¼iÖ±%S/„ŒdâBCyb6³šÍI©Æ%“þýáÑ’¨Ž3÷ ŽlÈ'µD¸ÅÚµË-k`èËÙ`ð3pÎk~Kiïb?§Ò•fl"öHI#¥BNÐ~p€‘ˆ$$¼ÓÃ2™(ÚÕ~îr*T…ùJ5²¤·‹EÐ>1 J§ùOU¬#Mx­ƒªî!h¨ÁU¦VÔ;!¥±µ‚Ä& ‹L³¡QRÚŒ%kB¦5lg{ÅU¦Ö›¬&k­ÆôÅÊU°ŽReKà…°Z¶6¥ Þ…p[{× iä¯DëÁÚR§ŸÞH•¤”c S‚vÖd³:Þ1õV€ùŸ»®àÒ¶O$A@ÒÁÆCÅñ6BãÞ¸‰!Cþ ëŽ"BˆlÙ—2\ ÅáÂÓ{É´= –]3„a¸“zº!!7R‡Tõl¯Èæ,ÙÈ`=¹\Ðx$Ñó Tô» §~Ë]Ó§'¡å•8pkâ(„\–ÇÚÞ6¨tèo¿àÛà÷·-y¢º^§¢j‘C#œ\ÈØOR€6,~p„Üún”¾W°­âd`q„ .ÍÃr]Òº²¶ð4¡Š]þ¬ ’ŒÎ‹×^Áž*!ÿ~¥0Ñ£’õΨ="Dà.7¾§zŠH´ÈÊ™Žbr_ŽÏ¸ã$$›È‚;)s-dUlÂvA«ÌéÀ@¥NÊaרí—™\€eĹWØ@büoÜY¤= u°•ÚÔôt×: Le ºåÒ{±\ð©\Ä ÉÓ ›, ŠšÑËÈ5S›XÀ=ŒÎÅyèÉ©ÿØÈ¨½’]1E7qZu•®QÎVt°}ÕV!^ÚD”¼LaÚüEŠñŸÆ€“)ñÁ8äA5(+ ÐLQþ°ý’Ø‘ÕãxMUaÓ X±]MûðUâUÛQe-ÆAdÛ:¢#êy™UüÆ™½“‰e 8Ú” ΂é£hU©Ê¹QZ¹É*ŽZ¡œ`šE‰ñü€qÕˆàôLŽÖ@²›AíéqصÕõÅÕ-Zæ5‹«aÜQùØJŒœ˜S…Ý¡ aè”ΙӦ…ÔìRU)õM*õ‰•ñâÄô Ö£[!–áÜÞÏ›(`ÃLƒ †ÀCi¸B`@|€4ØÃ¨Áÿá“cm]öm¢ìÙñÑÕB`c9}€ Õ¦äÝ=âGþ`gŠX‘ptÕ~™Ø‘á Öa£}ÙÑD€Ý †¡LØØ—bHÌÀðÊ…™G8ŽU׌Œ– JãŽPÂV¦ BÙÅÉ›ì¤QÒdY•úä¨Ü^màW0˜ó%[Æ¡$1*“~\A!‚EYÌI9P‡¹•wh!˜ÞÈ9RNÿ´¡Z™£~_qtÀu4Jà‚Þ Aƒ¯ýáY =Á„ü¤6™¥÷±ƒ…+U…d¬ÓbFÌ HšfÝeÃUb€IÀƒAáâGE.mF€hž9b¥rÚ»@^5š<ÊÐI¤-ÅëðQ…µš×þ5½¢2 Geî_0åá€M•.ÊØÙMf3{8§&q#J¢ˆ¥ÑˆCâU«‡[JØ8‘¡fzLV••ªbXfЪ%J=qš›¸_2eáô‰áú¤çp¼ä¬1¡K€À/0¦[À?ÈÁ;|À.,À $Á ‡? =†\É'ÐYUMˆ¢ÔXž5 ¨÷1F l¤d0âiÂè¶%à€<`@ÞhB”$‹-Sˆ¢˜±$Ú¬eX6ÖY°¤õ±gNžNÆàÊm(N–](ù€ð¤¸˜å#Xy“¾%’UÒ”5bia¢ÃÈ\ÀXiaEʯ1[_¨²ñb~•z–þ;B[[Ð’ÚÒ«ñ+%ìœÐ€V÷•JzŸ!ФévÚ¯E“\à‚ È!Ò0Ø@5X€¼Kç!©gÊ0Ý$ß|ІçT–[fWjä¥HÆè«j–HÄÂÙ(âÂÕÁþ þáÅz×)Ž „h:†µ9ð ùH”èw~ó7‘ô÷~ûw€ø€ÿw ¸ø+x‚38‚ç÷ìH–üÈŽ„‰„g‰@8‘@¸…o8„oÉ<Çp«ŒÉÈÌʌ̜øŠÿ %²L‰ËŒÍ¼øŠÓx³¸ÃÌáÐx\àxŒÃ Œe¯¸Œ«1Žó§#y£°L”Ñ8Œ£ø’Ÿ¸ŒóÌw~•E~“æzL€2Ýçšn2­Öl&ZÕZ"ÿP„B2îN+þÝÚu/}"#ì5&ì¬j†uãnåäç3hVf¾¥±ƒ­ÑIðÛ±ô’+ú¢3z£;ú£ßøä¬‰«Œ—QzËœ ¦O:)ò²°†³•Ó£™Û-ik—ã±›©ÿž§Ö1š³RúÜ©‡£ÿp(~žúCm:´ñéÒÞ:!ö¡öµñ¯Sr¿«ñùT gyÃy ®Ú³¯o\#¬ÿdŸ¢qU_Ÿ¢¸R‰#ع±_V¤4æ:!ÑO¹×SŽ]lÒñý²íð5_ñ¹ºwO·8ƒ°ö"É]h.âó¿|À üÀ|ÁüÁ#<+ObÊ•3“ò)·ÌoF|•þmÌt*þ)nƒåŸv­^F7²Py3€ª!Ÿ'²¼¡1› P®Ù¤=}ÐzÕtÚàÝ0z§ûGsÂÒÒa™uç(`À•¡Z™]Knä¥:<]뽬¨Ÿác%!¾û/9ÐP|,!F>c7ƒ•[ªq°MM Õ¿§™”1ŠÝ࿲¥úî—ωÕ5YUÈ?ÓȯÅ.eÒí^Ðwµ•A ¦’Oybþß ¾Š>á~á#þá+¾á3~â7þâ;±i“»;©Áõû…k‘ l[asaÕ-™çЗ|çÇõÒŠ`~éôå­Ÿªüžd¢á³­Ã>ÐÆ÷Ú_Fö(dþ}_7ëWÎæ³aw;†nÝ¢)[/jýYë‡ý ”=Ø9Û²}{ºÚO»Y“¨³¯%ŠÊ&iÑ2¤Èxåê_2·¶ÖÕ7Ok”"VùV˜¼fd m¤{µä;l1FµþW9ÿD‘jª HÐàÀ‚ 2\xð¡Â„ !NŒH‘àƒá³± FŒ–T(’$ÂŒ?Vä“ñàG‰ ~”©±%G„|XÖü “æÏ"AY†ôh”¡Á’GwiJ¥Ó‚/{:¥ ”fÒ›µÈÓ+BšN·–¼IÔ$LŸS½JÊ1¬Íšs•mɧD›$C:L{d`©VÁfUÚ(þUcS.ü¨’í`•1+f+“ªO«lòE¬séI“C›ö ë±4hÄ|ßræºñ(ÙÓ¨ëZöЏ"Þ‰–#¦M\ñ)Ð×$¿¾<ôìë¥wm't%Údr‘Ñ W™\DrQ|Œ[èMðr¿"×!4(yôß-o\¶xøá)§o_>íß©MïE]½ò"Pª—ÆÚÊ@åÎZ 2˜À"hÀÅk‹"‰Ø2 )´‹m>×‚ë ®„„ƒÌ-Û>3î!²ˆ‹.²×RiÁç6‹®³æä"ÑAÉxê¡Òæ)/Û| )F"/l §†Hä­¸ k*:òšÓ‰¤ÿ6+ñ¡Ç”KÉÑ;pþ°»TƒË4;ÒI­„.ËʈœQF*I«Ê@¬Nä.¡ÔJŽÄ›ìr,Ãü/HsÄ«#Ù+.—FÀN»êzŠˆ„uа´ 5,ª‹L‚Vð‹µMCõ4RG³°ÔÜREõT%3Ô.´®l ÅŒøÚ‚\Y¢ I~™)®¿€ v®1O"°¼m}¶77Šêð̹©$(/œÖ;—ä”¶#AµL‘MØ‚ìJ>·eа”L/—H#lJtuƒN^a$MÌ2Ÿ=lÚ?LÍký >DMlñUskáz#$4Ûm“ÒK5,ñ‘3ºäx·ÌªŒµBÞ4´ŠÖßNvþRà•ëÊ0°ÞÝ©êJx4;êrñKÏ5Èù #ðVÌjødeïhE›´/éõÐEzi¨ŸVú¶Éþ-.±•pT G”¨†Šlh•ËÂ*µ¬_kÒb£eksÛã|¤);Ô³0×àŶMˆ|»iyOV“6…´”ÙØ­Ý>M¬b®gb[8€£5LßÁCìMov«TìMm¯ µD³$swë…ám+3”\¿ûÕ¶–=à­ý]³-k-MöÞè6ÝY¹¯y_(ã|îl«¬Öи/2 &ž2Û¡F­ƒ´êm4—ô£“ŸK¢ˆ(Îq" Oqp"‹jNq…v4úô|Ðþp¢¸?¡Qþ¹ÿßþû_ÿ8À p€4àؽp” ÷Ê`1¡ü¯TˆA5á‰ð £x_4`P \Uã’àƒý¢˜ ШƒF"h@>ÐÄáþtØ@úP=ü¡wÈÃ"ÖІG|à ¨Ä 6±L “XE(ˆ Äb¯8Ä vÑ‹CÌ¡HE$–ñŒ`$ã±hF5¢±‹S´"¿ÈÀ0ÞQŒnD£$¤³ëdÇzlÉ…©‘ààÐAfP Wh¡k(H\PtæE«†&  Œ“”¡%(A)ÊQ¡”¦$$)UJV¶þ•±„å+UIKY¦R–«å þà  ”1@†à?CPˆ$é1Š#Ìp&6ø¸à)¥-¹™Ko~Ó•º ç8YùÊræÒ–§ §9ʼnËtvSÛüf:× Îvš2•ìl%.ïéNtâS—ïœ'@ùyÎsªSœõ4(BoÙPx&ô ò¨C zJ}’³¡=h=9ÐXÒÒŸµèG+JÒz“žMèJC PŠö“¤Føƒ< S‰Jt'©ÎÍ Å=Ådg1:E#‹P´t “óHÑHІHüC ô£ƒΑƒ$a+›ÊÉV•G›¬bÕ«`M’SÄÖ®Žõ«þg% ZÕúÕAæ®'ÙIÐ$Âq"<ƒsà$œzI> “|`%œPXÐUM”ž¸ú’lrõ«ÙªcµzV‘P[/±IfÃSVÈnõ²ôkZÙ*Z²eµ,YY;ÚÖêé¬úÉd»ÚÌʵ²•mjõ“VÙbõ³ ÕËH«¥ÜιŽåìeÙ:»¶¶–²Æu’g×ÚÚÊÂö·]U”sÑÓܶ2·«uBëU¯úZ²rv³–=X³»Ûß–u·À}®|9ëUÜöV¬âµ/Þ¼ V¹JÅ=åŽXÞJeäšü”+¬òUc‘$ý$YT†Ü¡‘b1Í\pS- ©Æ(þyP©‚t%³Ù++ê™×œb6–A&i*$yñA~ðcT×°E$RáWpCEøª¡;\ã)Èé_¦¡&1‘aqKæ5•Å LJrAqfÒ˜²f^#ÙbTvåAÙ)aR ëÜ&¥  Ê¢S:§“:«Ó:¯;³S;·“;»Ó;¿<ÃS<Ç“<à9¥ó9¡s:# <ÛÓ=ß>ãS>ç“>ëÓ>ïs<ñLï2ý.+vêQÈ@;¨C%Ší8‹TA”A”7_° ²O$€ª "à<ñC3TC7”C±3=ÕóuX×ÓWÍÓ`5XVa–aßt5¤ÂðTbŸór§$1ÑQ°G{8";¤BL‡t]£³KéUU98ATK•IS–U»uS£TeÅ]eK¹ôJV£"A> «¡_hƒÖ:–WItWÖWVh—–i›öX!²^ ‚e!€À@Ò?eb `"þà ró:wSd«^a¶KI\gveÝu7Q&µd_VJávSt\ã5LmömÔLÕtÜt6«AiÖp…Ub–:Ö`wUOr#Wr£³þxª!b;%#â^ :Îô'¬'ïr!{ª¨BlàD6:YVIÓuJÏ57Õ–JÓ8)•7…ÔdKÕnM•m;•vss!J·‹’D'×x¶xWy—×i-(bÃQ'Nàjç„Bã-Q¯•6_,ÂTuQWdt:‰´{Su¯t:ƒtU{—wcw7e·8¡TwÝUSkÖe¿w”†À6r ¢À|–yÿwX“€˜€‰µðžw#àÁ]¤7y4ïˆdgsØî5Vy”lË—7¿—|7¸l¿Wƒq“T¿ÔIuÓ}Ý78WÕ\o—]s—TM¸oA8H;";’g!5n‡sX‡w˜‡{þ؇ˆƒXˆ‡˜ˆ‹Øˆ‰“X‰‹ø–؉ŸŠ£XЧ˜Šo¸€YÔE¥V'àà!z¯V'„—g­Uc»Ã*Î4RÛUdóvƒqs|Ç÷teö7éõ7[†ÕõdUç6fÓwŽç·wïU[¹e(v‘_ÛS€Å3‘Ãs‘Á³‘½ó‘!Ù=#¹;)y;-ù’y’7Y“Ë“µó“³3”±s”¯˜C#ñr ¢‹Á¡‹9Bz“‚— "Q4‚7B5"ƒËHÅu}™ƒ½×:ïØlï¶IKøŽ3…}ÔÛW8mvJíîïQÔŠ­”«ó𱙓=¹“¹¹›É3› ö›y›ÁÙ:þ;“7ѹ’¹³­óšÛYÃy:éYM‹w¯ ž÷À‹nŒmbFÕFõ.{Â@Kõƒ“4:}ô…ùmk—~£ƒSmá¶fÓwKW™óøŽù˜7™Ì¶DóמG´œÇs¥YÚ›cڜǙ‘[º¦iú¦«3×™:ÝÙ3Y;}:ŸW<…ú¥à~z¨õ9E/C!.W 0!º9W)ê ciY‚%¢Þfv_Vƒ'ÚËW:ÑÖ…ó¬íX¤Ý–nGxfã–Ž]m×Ú{HÒ6gó^ú¨÷Ú¦¹¯ý§¿“¯eÚ¥ÿZ—š”{z§y:¨›¨ÃSþ¨a’㙩W´*Ÿ/ÆcÁø ¨uks†6‘Ã?5¢Ëº´‡¹{Éú|I¸uÏö¬3Z8AÕU™y®Y›®…Ó„Ï8Bkr_õú¯û·ß9°{¸…›°sz¦è¨¥S¨;;ú:³Ù¨Ý3©»²OTP?@jk’ ppùt±§:¼ö 5¶´­aÖvÙw­Õ:£á[I‹¹Ž{S¾5º®1ñËcu |»¸;¹ ;À¡{ÀɹÀA9¸ܹ»»Á—ûÁ!;Ÿ[›!ÛÁ%‘-<»OY‹ÀŸkò•Ãx·­·Bwcùw÷¶^¿Õç¶dÙ8™ÕÛ½/u8_Û¾ïþXme—,ü.Oê \¹{È%9ÁüÈ;ɧ{Á <:wz±•üÉ)»¹£[º)¼;™û¨ñ¹ÃQ4, "b…³b³Õp"8RTrBW…×ÜHÛšÙšuÑÚ¶yÓ…CZvéõ¾uÜA¥ù?LMórÙ‹ÜÈÁ‘›À ÝÉ Á|Ñ]щÜÑ!ýлù#bU}zeØc–t@Ñ\ÅI#£Tj¡ôi£ø –ÆÉž²]¤ £´=Ú¹ýžP ÙþÑhŠRØÏÝ£S×>ƒ½¨Û=Ý5zŸw!ªÁÞï=RÀ0zvŒñŽw¦Ç×Ú­ýÚWª–FjÚ5 •؉”^Úÿi ~áa*¦¨]MíÚÍ[ ª!Þ;žÒ×ýÝçÓÝ!Þ=þ>=³c5së±Nà&ãbÍ<% ”>"”T”T€t>çU çwèË@çÞ†Þ”ŒÞè ¾à—–Œ¾çG)é™^êU)›ú[dl‡%‹!:! ë ¼>:Á^ì·žì¥óìÇ>ìÑ~íÕ¾í;ìÓîÙþíåÞîëþîãïõ~ïÙ^ïùþïý^ðÝ>ðÕ¾ðÍ¾ï Ÿî?þïðç^ñ ÿñ_ò#î!ó3_ó7Ÿó9¿:ô9BŸôKôKõ;ÿôSŸõ!`õÁþíM¾=[î¸d bs%£cc3{°w‚U<$\Ê¡xþçÃ=£Ìiè%Šø‰~ù‹•–_èƒú“ÿæÞú£ßùû§_úŸ¿0Þ.RÂ×8žë@ì1ßü¥ÓëËþüÕ?ý»þýÓŸýáþçßþÝ?þ×ßýïŸþù_þ÷ „0P ‚ &<Ȱ`C† ”è0âCŠ':̨PãÅ-‚ÔÒcÉŽ(ž„¡¥Ë—0cÆì#³fÌE6sêÄ©³§Lž>ƒBúÒ Ñþ£H“*]Ê´©Ó§P£J]Z­Hµ|ŠXõVæCU«E¼†­vÂج¹ŒTËZ-™\:ä*S"W®«açzý`DE#€÷lä¯`„#&¼¸ðaÀ†!;žì8rdÉFÿ5(8²ßÉ™+#5úïeÉX‹¤ýP„íXÖ«« D²vJޏ1bÌ=ò¶îÞ¸y¯Üý{øCᶃONxsã+‘§|θôƒBuÒÌþ’(w›Þ¿× /fø©èÓ«_Ͼ½A±VS¿(soU±ÊÚWm„õÕ·%8!Wo‘áYñ˜RF$%Yƒ5ø`•q”cH–á‚j@b Dag„þE¡`&&v¢Š„Åw‚Zcµ¦ZFŒ5[uÑ-7Ýq:^w]?Z×#C 霑ÐUdŽG2™¤oΕ7“”TViå•2¹§å–\vùTkbÕÇX`Êè•~{ñ§•Wv‘×\vÝ…WZc¡ø!‡xæy"gŠ=èáy¦h¢ €Fø™‰‡úá_Ÿ)fሮX£+.öÙ¥ýµ¶š™U}µé´MÔŽJ6™\N’ å“Ê™ºªª­²JÝŽ ¡zê’·º+sXn‡å¯À›“—Äkìz_eWûu*Ö /°¦llV½×€d”` Œ›1˜¤ƒ*ª§¡~~¢¸¢Khd²‹.‡þˆv"i‹6æádò6g¦õ™ÉÇ‹VñªGoTðq×jpÂG)Ìp©G¼°ÂSÜðÅlqÆsܱÄkŒÔÆ"{Lò‹j¥¯ßa!¬Ë/Ç\Ô±4×lóQ¯ÝW Wþ¥†Yfuªæ^n8`›x©™fp¡z–;)hM¿î½à*é¸Z§xØ£vòÙ¨×f:t|ñUÕ-!´ÝöɧrÉt×-÷Üwß ·Þó ²ß Ã]±É} ^¸ÉW²ÌyU2Þ¸°ÞÝ,ùäÄÚ—ÚÎôx[ùyƒlý±Õæ›eaW¿±}à®×†¶âˆSÇ[bÕ# ´ØÕéF])þ‡µ×[®ì¬+úôö’(-Àk•™ k Œ÷àý߆SO¸õÓ 8ÊÕkß½Ý{·øÐkœ¸”Ž£/ìPÃDùûð#+#XÌGÒ_A;kV“íµprËçôÒš©…hR›— X'»Çd­0íZ‘¡ÀÖ:DÑëA&¢ e(U)yEêuß²`ˆf6°|¥-eàkœ·½çI|#»ž÷dÈ=ŽÏ†ås!c˜½öð†?ÌaÂÎWžôq}FOäâÇÄ&6År`a–W”• «è',V™ çÜ’ h`ët`I ®â.¬­ B°“×bx¡¢1w[ƒ½ Ö§:fpj°»£þÿ­(m/UQáЪá<—ÀÊV¯¢U®dÅ#]Í ‘ŠŒ¤$‰¤+H>W°¢äpz%%˜Ë“Ÿ”ÙÌœHÊR‚)^á™ûUŸ+Þ'-:³é´• ^e.uÂñp·@u݉Q ò%׆‰§D!OŒ µf§Ækù TżôG6Ãä$‘”ÉF2²VÚ¼d%ÃéÍn‚sœŽ,ç6ÏùÍRm’ˆJlŸÖÑ4ˆÉ SøH¨p /˜ZsfØ8“G>™Ëw*BŒ‹jt2©­F^¹Ñ:ÝiN–®´¥‰„¤%þÕ)Sr²ó6uiMÓyÓépr}@ ê•îITøáeŒaá³Îò³üD+F¹Hè^¬% 2”!¦«6ÅyõkŒé̾úU:*¬³«#cNƒ˜â©ˆ­LÓÌ`8(-®Æ'AÓÌŠJ2*ãðÔ$0UI`ù:Øó¯)l:+Ø—6v¦Mú•â„JÙÊú¤¨˜½~Ò¦ÊýÔshÓ¢VÚb—¸”€@` Ë‹¾2ØƵrM ‘R!·ÆV¶,2LïDÔÚ5>T3¾•muɺÇüå>«íÙYÔd•½„„Xt¥;]ƒTW ×Mt­›Ýîn»ßÕnx½K]êŽ÷¼åå.z¹þ›^ð®¼ío|É«Þùž÷½Úµ/~éë^ûê׿’í¤(C,OB7¼™MpådTŸ0‹Š3 š¸uM¬`5šK] $P~½¶/À” ¦Ž9ÜËõR!ñ·ÎjV²RÆhML[SÖö©®™r |6U ûøÇ@òä.€Kôa=‹(r—’Lä§4Ù)‹ˆ€—˜,ä*»ÇrÊšOÏœÕ)4½²Fñ‰SAßrÔ%¨ hN³š×Ìæ6»ùÍp޳œçLç:Û9Íž3Úô/µx%€´ MèBúЈN´¢ÍèF;úÑŽ´¤'MéJ[úÒ„>D&eLºÓž4¨==þj)[ùÔRA›ÎÆÔ/A"÷©Ó‚›LWÕ« P,<6 ‰týaÝV†ñ‹gòåë_Í¿>&ˆ‡}™F!ûغ†¶±'#ìÂD[2†ñ÷âš“J Õà·¸­,åY=I>Ä’ î§´ÊïÞRºÇMo¥ü³5U™þÄbKW²©+ ’%Nk­¯|€NPdJ Ûá^æ4ºW‰ñøUËÈQÄqûV²FS­€YµîgMÕûä(O¹äÊ}îô$ÙÔòÌ›2s¦DyÊ2WùÉ·<ž’~.:|ò“P«ÃÚpš¨µâ£ØOÁVöŠU<5|‘˜Æuœ±Z[üâþØ5[êT!ÈÅ.»Ô œŸÍÔtÎö¶»==,Grιôr¨Ô|)7_÷Ýß.äŸÓoLirUЄÔÔ![n:™) ¦…›8¤±•l©îbàVýžuàä+Äñ¯›8­`òlBN©©yŽ.LR¯ú—°¾õ.a}L^¿zÙ×>õ·?ðìqŸûéö~÷¼½í]?ü–Ðþ÷½‡½ñƒ/|æCàøÄ×}òïûèK¿ù×Ç~õ—ïüçwÿõ¾?0M¤Oþð›_õåGõ×ßzö ÿýˇ¿÷åïþøÛßûêG0ßü³ž—Á¤Ò²вYt2\TPvaKªÑZVælQBSMþ"Ô(b'z·uV·;8W[çk¶•/öL 7M¯tÝbY*¸‚,Ø‚.ø‚0X“ƒ4h%ûWeGÅY™Óm«tE¸:ÿ‘ F'‹:Éó-žÇ"×pŽ‘y‡+ÖV'Öøa6…¹åV8…1#/ÂoËÕgSƒdX†fx†hHY3Iômè†ó4*7d Ö3ZÆT§Ô9Ô´Zè³ôc:þ‘u±eSÈk0vqXxyUÇ Å!MƒˆrÅFÒFX5Uc¥‰ABóc9m¡vi8ФXЦhŠkèo˜«ÈŠqè0s˜Y¬äR”6&5a4Ò3’a¨•þ wRI%‰ÔF"W( Ø„ ÈH5f$.ÎÄ‹‘q—w.òK•'RXˆ€k'¨€ùqM|pŠâ8ŽäXŽ@•Š=JX¢ŽëøŠ±d{¶,ô6œÒ9Bsp$Å&~x4Úbpå-“hbÅs…žc¾eqšØunDGt´Œ“ÂÌ´L p ˆBýD?¹ØæØ‘ù‘ )踯ˆ%­êøŽ?EùÆ€œósd-ö!ZÕRZŠw?˜ UWŒhu¡'ئˆ}‚@©ÒLd'Í8uUÇkŵ; õAôÒFË#¶t ‘!¹•\Ù•i8’9q’ªˆD þFMþ—O:£ZfQ&wKÙ‹q’4ç-º5VO¸ŒDY›/@‰„œØZ›H‘Iø(TAPslbu6§a‰UˆÕðñ’T ^™™š¹™*–àQ’W"–=±Df)‹—³>ç/iãeiH7¦C?G'*„q”Gù[„©öÒ¹Y†”TFé——q¹5Ä;ä4RsyÖO`ÈÄ™ÖyØI%ž™ÀRš &¬±ó¨9=ãJ%ÿ#— H4 ÆØ—beœÈI‘ dœ‘Gyyö‰5͹”„Hq’Òä‚;Є˜&ò‹¥,÷…ZÉú þºZ%Þ)‹XˆE ej9?˜TyPo1f¾˜? u€©yù—~lÈ)Ÿ|¹“‚Y¶9é! Åœ¿/ý Go´—,â"E†_VZ¤Fš™ìh%Kʤ‹êDÒbp˜/ižƒtt¼HK ÆUšñ›™"qŠhŸÅöZE¹Qµ!S (.J"¡áˆ|âQ|Ù˜}1#ÌSh‘B^q¤~ú§™¤æšV"š$9JQjO³Ø’ä‰EVä9€ô€x¥-;&kÃ8)* ”j4ÒØ"$-Z£  •GVXŒ§êU™g/%º€Õô­Ù €Z«¶ú•êþ,†z¨ôä>‰zOÉ¢ƒx¸þQ©‘vUt€`U\Tf–ÐÊ”9Ĉ¦k”Ÿó”`vŠ9W·S÷t¨bô¢÷©m×ôŠIð®ðê®ðú®11¯ôúöõ:¯ûʯò¯ÿ °.‘¯ý*°-A°«¯ «°øê¯ ë°k¯{¯+± ;± ±«± û°[±ë±#û±² ë}À°Û²,<á²+²«±8°8{¯9«°»:û³< ´5Û>‹¨¿êD 6?µ(4ôão &»x4`tK5R›Áõk¹Im›h£Z<4Ö›"¦¢ þ9¶˜·ªªJ26Œ2*€~Æ`~ôr´r;·ïCdF&wO¦%TædP±y«·JF·¦äjii&yèOÒ¢%jaû'¦³tfsg’;¹”[¹–k¹IeWSjajjžû¹ º¢;º¤[º¦[h}p’¶ªj¬û¹¯ëº­ h‚‹O&&]Ñj·(“aö¢¢ram2?Ì£ gŠm™7m>ym¦Á¼¼†ˆÑ¶Fµåxئ[®…f QšaÒ”×”#UzI3Hµ[¾æ»%R¦iëQn]¾îfw{Çî{¾ð“3iÙ¨XôKSUꉓTžÄu‘™ª«c”ueêqþ×ÀøœkEèú‹—Ã-)Ô\ô›Áüq§ó«%Ìñ‹´Û¾s·Á’ƒeaq‡Íž„—EíÙÀ«aä…U« ¶%…dš2ŠŒd§…ÂÕu!ؽ–×[TXÄÓ›Àú)…ÙXGŒç¶kr(<ÅTÜÁ.w€;ÂG¡ÅF‘wt‡ÅT|,~×)¬¦š­ä ÊUw'µf- Ø-V'Œ¡'”õÉq]÷qíçËñ§{Ã|{<~ÐÌ}Ö|~ÑÅÌÖÆÆÂ’–9¶˜¸ÐrBOÛ)ö‡#Zr& £3*‰²“µ[矧ª¬úZœ¶ÔûÃhzÚúx0YÑOU9Z‰,‡¿ÑXŒ$ÑÝÄX„åX Yí”XmX‹µÑuX ѺQØ¡'-¡'M´AÁ¼ÚW… ÓÙ±ÒÝä\,1‚¡jzgŒJŠ{[%„ê)›ÚƧv¹µce‘bÛ”Ô'æšbþÄRýLb‰M-5`3cA;£þÅciFÒ¤RABÑÛdÖe=Ò=ÑjmÑk]Ñm׊%×>Op¨«d‰×¾zÓ]robx‚Wºÿ(ÃÔ‹QÅIákŒí£d‰ˆI£˜Å–"„ÙX8[”M Á©£‡ÈžIû–d]$h­ÚÍÖsýÚíÖ²M× Ûµ]×+“«½J¨TRO|Í%쌻?žHUº/@ÍÆIGfÇ#M×È£PÃ'wÉŒó"Ò}.[ãQü9Lœ§"Á‘”-bx$¬§ aíCäÓ0ñ­$ó-*;Dß÷mßA$ßù=õíßýˆã>Y’`IÓþ£Ò†.ýÒ6}Dâ±à.Aš¿½%›“¸˜&ó#€jÁW©¬$›a†©ºäŸ{ÔHL{R)~/äQ"…&N.!–".~â΄3ZµÌu —,$8ïDA>ÿ-àûßG®ß0„äK®ä:ää-´ÞOàINåæ“Û·Š%Þ%šs¿1ÂJXZÈéÉ89«Õ ”Ì„(¸c\Rã}1 U“VŽ‚Ýº¥L•Azt‰‹¢””ÝFáI-®!H\Å6nSpƒèF¡è?Äèáèxé-$éâCé6dé^ä˜n7›éšþ鈃èˆÞ¢£ocê©xê¦Nê:‘ê0qþê¢>ê¥^ê­Žê®îê²î6/ñ6´®ë=Áê6½å€÷a?ÿ”ƒö€Å{x{Ud°-üƒH)Ý.ž Ô½·¹í÷¢Q+þÙ±…Ý~>âÞîÀÁƒ57š[ä Œ`x oùãˆÃäÏ3äóàRåE~ïîmïùÞïüþïc×ÜѤTBðÿ¤Ä¾%øv?K]ö12M•-('‚¨Ø,.çý)yiú@¤Lɤ@º5:|¢óâÝnz"]-Á­ñ…±ZÞÅ ï/ïzCï5ðMnåSnä9Ïó;¯ïðó?ïïåñ¤×Hÿ+žðÈRÞœs¹Û¨ƒ&4IZ‰7ˆ÷‹§þg¼Yãík.ÞŒ‘’mçe£QéG …q£à¾Ø m mBþ±‘Cßç$ï@?óPäBï}¿ïUîó~øyOä/ßÞà6qàY¢à1–6àlXÎÒFËôéáÂ-# ¢Z„ŽRAˆtDxXä¥éÞK(n(^ÓÝkNòzâæÙÝçá}GŽîÖøFdOû¹õƒÜFÙ\Ùt$«Mü­ ×¶-ÒÉÿÑËïÚ±MÛÊÛU"¨5ôJ_’˜Ïÿ”¸;]ٻƽáÖDõÏD Œ ÈçŒÝ!—h¦¸ï:kjQo_AtöTC<6šãìï:á;º/Q„O‘"þÕòùP$—‘Õ> @"'V”ˆQ£E‹;RüxqcF$5޼R¥É“%Sš ÙRæJ‘4=ÂdiÓåÍš8_þDÉSèNŽ>‡Êœi”¨È¡œ>…UjÔ>S­J]tUëV,[½ZíúU¬Ó°P3žE›VíZ¶mݾ…Wîܶ lè­L‘† ³•Øð„·†wòuH&W.'æRìPà †”1’YófΚU`îœYEæ2ŒŒý94éΠW_6"ñôjר5—¶½y´kݰe£]Ûˆ@…e:hÐ`®½ !Ö,³hR Ó§•®”zÐ¥:™v×¾|Ïêâ¿þ›Ï^Þ;úðÞ×ë´ZÑ«|UÅÒ'{¤×¬fÇjí?ý¦êÏ,ºD0AdP"äøÂK/ƒúK9¾Nx¯ÀÃ+"rÑÁ±2r)Œã>X(¡zÛ¬ Û\dí¶ÜØB ¸Örí59;k¶Ëpä-8Ïnc1ÆaÛì×ìZ!¼Š¸Â& zn#B®éJB8Âr"-³ì‚/½Ü’Ì2Å sÌŠÆDóL6ÕlL7ÓìrM:çÄ“Ë;åäÓÌ>ã´³Ì@ÿ|³N@-TPD÷ÔÏFU4Q,·¤TLK)ÕK4ê#ÓL/ÝòÒ6¿´4ÎJ5 µTQSý2ÔI'ݪOKÅþTÖOkÕ©V;j°W_¶- «IN¯Ò§¹ «ì®å†C¨šÅq12&Th8‡|„-· ‡$R5cíÛÑl<³¹m1ÇÑWÈYwÜÝÜEŒ¹ÂÝË¡ù 6`&¸`ƒFxàK¸¤#`Xˆ†‹â·"°Ø×‰æ¸ã€û‚Ð! ‹ø«¯( L²ôU2ET, K¨ ›oÆ9gwæ¹gŸ:h¡‡&úf>8á‚ *Ù l â#©§¦ºj«¯Æ:k­·æºk¯¿;l±Ç&»l³ÏF;m«éƒìCQ{ê·ã–nºç¦Úc½÷>p âþªF¾ J±”Ÿœ²!©eÎZS46×@·ÞÏ(²\Ï0«·Ó&ç\rÑ¿ý¼]ÎCŸœ5ÏQ]s×ųã ÿ Â„V6Î!¾wç½wßâNpšÖøCâZ.¸ƒ5yà§ßð'Ïý ¿žÄðƒÂ²½EÅBdŽŒrùžÃ[\É{ÛmHÎ&Ç×n”ßþ×lËm7ã÷QæŠd§f e à’vê5Є`%"<â!ÈxûÕã‚Á·ÉXÄ*Ya‚!É$ä_L ÈW†ó™H2ª¼Ø™½EI”×d@$ P‰Þš#å¿"JHšQkˆ3%‚!Y…¡Y5xO•Ò”§De*U¹JV¶Ò•¯„e,e9KZÖÒ–·Äe*;•JSMj³*å¨^õ*4ýV»Z¥0 aÌVÝJ™µòTV2µFj²åvjÈ š£Âjdã8ƒ‘ãÓúCaD‘éPöH“Iv±ˆ„”äýžÈ¿vÉ;,ë"é#zþ‚‹[”S¢»f—;„Î | L G9Êj6Ô¡5ØI‘ø<¥@Š F3jQD`>uJþs‰ˆ¢Uα&42‡P IÙ5S”—íqZ’ÉV`nÃÎ ‚ë^CäÌOƒ(ÔÅó\õ ½ øÄ$ 'ˆ™Ó¡S3óG#øm{u\ˆrzR®vÕ« ‚ÛÎ┉TÔ)—xŠFÓº¡•­ …€[GJR}uá\Ú³½ä€qÃÁ‹bJ C>*&ZÅ) »vc€ÒF©Gœ_d ©ºµÄ&-CÊHlŒ˜µ\&³–½ì‘€ÃNÎù-”¹«¡´“­ÚÕµ¯}­DËZÖ©ÐþÇ£dÕŠZ× •Ûæ®½kmë [->ˆXyA ql‡:"±€³–MóWús©#j;øÔ"5‡š‘ g ^ð5²É,çLc¤ñ’ײçmox-›Tn¡FJ YÉ X>´–¸ÿ05e+ÚJ…>õm‚!¹’®" nF`ÒKÐ.!+‚6UôɆ0ÔÍׇBdÎÅ”`_ ˆÕÛÏ|É©¥éMêbì¾ùºW¾á½q{G ã2äX¼ñ²fåËãuЦeÆI”šƒPü~À¿†r”8`²êöÀ»5«ƒCÚQ¸jyÁŽÏ„ $åVø Ù'Ê\o¬þ|‚LˆJpÎ\&[biUWÉÓ°sˆzÆŒžUÉïn½ á”þ­ Í"–‡Ói-fÄ#ZŒ™íX™"´®‘¦A ¡/.wáFâ^oŒsÞmŸÆÇÚŽñØAãíÏDÈ•fô¶KÎõ™¦4Ð]mf~tÂ>#8GµÐW½jVg¸=÷ùÐi=fÃ,WÖqž„´6kžvE0ßÂ0çÐ{ êäz]hGg{]™´xi&·Þ}º·Æoym_¤·ÛÝöáýg‚4b³p§ÇoÑÂÐÊ7¿æ¥+¼ ü¹.ßgúô±/ù*KØùþ;h‡±çB•=½Í]¡Ë„À÷%’ëÝxpxjö³ÃØFïçq&½¥¤ÊbZ5= ú9Ló¶Ý3¤{©¡1ˆ[ ¨˜s²åû¾|>2µî˲޲>sŠÇ :k°¡Ë9 $˜ïIŽ¥{©')A*?} ,««–Ũ¡œâ‹ j´Ñ9‘Û®h[=Œ‘à;6 >J’¬Õˆ=y2BýÙ®{%Àà ƒ>Êø4Á)5Äk5,ëÀÈûÀ,Œ<î³~£B_I©\C­¿é°ÁHÁ¤q–<¶ÁT9"“¿'úÁû³ÁüƒH2—¢Á><¶Øxâ¡Í*2%ú)"·~9‘bþ €FtDæ ÃH„-+tŠx K¬K¼¨F” L„ K¼DŠEǃKÅRDEVëDžƒ°S¬ÄTŒ P<Å’šEIÔ mZš'9´‹s Ÿi±)È81Jˆ¤’½ñ³³;¤JFžB"°ÓÁs4¢ª#Ô8Eʶ%Ò ý›FhqÀ чMšºj°Ås”2è+žˆA£¸È˜¶`€wlã‘GtL s윃8à iˆ•!7iùa˺¾(¶¢AÈ„TÈ…dH†d®s)P"7º¡ÈŠ´È‹ÄÈŒÔÈäHªi©i²1#ŠI’Œ€Œ›’”{\­–€;¬e‰©¥ ¥þ„sAæøké$éºxR±Ñ±}b9ÑQàÊ¢Do±¤DJ«$ Ê¡4J‰\>P¡­C –äÊI¤@0£v„‹3r Ë®Lç Œñ §µ,pJ)Êøµi!È:3H®ó©Ä'!ìCFÚ¾4BÝ¢lsÐÀœ L͸„b〹™*´”Ì®0º#_¹L·H#¶0#è Ëɤ‹3smú·_»Î3-®6±©)F¼ /ùÉFÅš£ò¡Û¬M¤Z¹Ý"ÖÛËz‰$ÿAÌFËÍj¬*© Œä²@Íæl(uDᑘÏÔÌ ÚL‘N甋»8‘"`þ©]\ËÃ釓ŨKœº#”ª¢ÚËv1$½ÌÜL»ÍâF¥¢ :B‚ö$%”#D‘ÀÓÎå¢Ê¼9êlì¼ët7%е(?Ó«:²îQÆä‹Ð“.™OØÌÁª/ÓhŒÏ=#ó'§¤ödû*Ñö¡ª ŒB>ÀyЕ •‹ÌœG]‹ëT ³ÄL ÕÑŒ0Õ:Áä@8ÜÅ&¡:a‘±K仲CFi뮲ÓÒyQ¯â¼Ãh#ÎÚû¡eãÏÑËùÔÏÈê§Ñ ÇÔâNE‹Îü ?ÕQëù]Ü<¨þ9Í Ð_T "Ø£˜YN&üÖö[ œ$i,ÑA;6ï2ÌÚ«§mÆv²C¨TSt‹9¥.ç°ÓVíè<eY Ò2ÔXÕÓ#¿¾0&Sfyp2 3£Ë)…Œ¢h›Ãm‘?X,ûkÖdüÒi„V¿ä.f¨øÔ!l—1ÓüÓ–ÍÇáÛ$EtÕsåeUžÌò;¡ƒ bðQŽ˜ÙÐåˆãM|fJÎV/ƶ‘³i'ªd|êe/n$Ä„Q˜æLÚÉpuôˆ®j)ÓF‚pØP%á+~kÐH…üÙg/.ZxQa[¬h þQpeÚ~†¬¹þRƒdBÑ%6®sí×Þf9.R§.˱ýQ¨îJ\Tàä*A3dlÎó!#pD5 ÑÒñ­½Î–ÚÙ_ Öì|â)›~§.&ßDðûºG&Ô¼&¬eÎñe¥&àÚþk:þásÅ‹ ]Ùh’aÆ=–b…ì*U-»@*ŸV=isaøQë‹äu¢g¡Z cÖi× ÎŽk³‹"»îõsâ¼y¹¾—lǬJà míŠ÷ßX—ò\—uô¦èŸ0§ooëI ÃãÔ¢åNúö(] ª÷» óhÆßÊW¶{úÆÑ~k³6Ñ5-Dwa³£sa µ³Ú©V:ÈA^¥W^¦ÿSª|¨çÌ[_)PŽåõ£ùU¤yŽý—†¬a„g–عf—)^v&â ™Ï÷gL¤Œ]v;Зœ-n_: ¨Ù°ÊÝž™¤÷{É÷’ýxÄoY"%[ÁWwÍœVlóÛGŸÔ%‘kñêÈQZÞxƒ–qeM{žÅqúcþ¶·l¦RXå ž{DÖŒr5!~´Òˆý¿¿ø 7ôZ-ôóžÞ¾èvÁ1Ã,¿m½FÝû&vÉ>cfòåTbŽÑÏØ›ˆ2FþTaD ‘„ ˆð`Bƒ N4QáC„¨h¨qâB+:4ò¡H‘\&‹TûвZ>) ¬à&Μ:wòìéó'РB‡-jô(Ò¤J—2mê4gú(]$õéM«Q…n º¨ëS­XÇ’-kö&L™5?¼(³fÌ".Oxk©6W™.s‘)áÞ\‚«µœy²ÈÁ?b\œ¸Œbˆ!;6ÙâÂŽ7^,x±rbˆIfþ†h‘²Dÿ`>íX!fÊ¡O~Pw-ËÚ+mžííû7ðà‡‡*•jR±X•ûsÑ!²Ì‹S¯~Ôen™Õ¼•y)—L˜N¼À­ò$Ÿdøê\¦_ñ|N_Ròk„®9FN]ZaH A¦Qg¢TÚC ‘ÖQF÷9’€Ÿ `c˜ñ§ZC,Í”›]nØ’u!Š8"‰%šÕ!È!•sL±8T‹=EãR/šxcˆi½Åzb7W]rÁd[x}åÒe¬—KzC®Ä‡~E&e—I)šž Èš„Š¡–Ù„[†æÙ˜ÿme”¡Yd¡f›)æÚC~pÒy(©Õ!^þMâ¸'Ÿ}úùçM,ªx”O ;ÍHÖ¡€:úTa‘~Àx’jG—wó™äRmëAã^ ëýXç)ˆaA#m¤š„™Ú –÷}éjš±]t ƒ´R´`n¶+®ÁF“L¶5™J²ô(³Í:ûìŠÇUuÕrÔ67ÔWÒY -·Bõˆ]myw›xä}Kä^‚µX|'U“'K œoXecV^ùÑhmæ§Yl\òZ!ÀšÍZà—¬þúÐaxk×K¤v;1Å÷)è´‰"5ÝOç¶[ m¦¹ñ×Kմë*)§3µôg‹YäQi¹–4!I‘éŸþc") ô„ÃHÚk‹ÅIáƒ9oÒš ½tÂp‹Òx&62Øa‹ýŠƒÅ1Shˈ­Ègo;v·rH©†jéU ]àjš`¹ü…W¨¹ÀU[Øñl!†Ÿ‰æt­> húƪ¸ÒNGÎ8•PS~šH‰äšeªBzuj““´Á½:ë­…qro§-ûÚBe;–Ú®;ZXz&.ixraZóyÚõ-³`d訒^•+¼ù”÷Þ;Òk¢C˜™­%Yöß©T¨ªèø)Îùª¯«0×ôÅ…]aºi§;üñ·ûÆ´g #Û!Ë߬vv²ÄÝ (À°<ÚÑÍZrA¿¹'þð9–Ã`’/ ÌW¦Ážd"³¸í­Iq™ÛÏj¶—4 žÉ{cºžÕÔ³~-æà1»zÁ쯆6œýŽ’»ØµÍ~;î|xÃï$/ð˜Ä%"±01¡§Þ¥.÷a=â™Ió×´’„/jŒϤg 4AŽA£×°:X¹Ê‘O{&ô™®Ê¨dGGýÃÛj2Ä=òÑOeSJ£\$Dãp¥‡¯d«ƒž‡q§ Ž|$$é ¹‘ê]ëùÛ{ø.ÛÄDJ ]š'>6]$`´¡6ÂдÉVŸÖkØ4§­Êr!ÁŽÃä¶È:Ò0‘¾üeurh”@Ö‘þ‚‘!ñ—L`ú&x.l ¥‚'M¼Õe—ÄbÉzJ ³%y‡T±ê¢kE9ì]Ïgˆ{•½Fs&ËõŠLÓKšÐ.¨¹¹s4¡S}ÔÂ>”ØÆ%Ìü'@Ï"Ì¢ì°~=ìáíªµÌ€’¥f•âÑœRÖ¾áÁ¥Ÿ-á Ù¥<Ú +…¶\õ.÷8SÊÆyêüU,ý¥BVâg2«Ò”Ò §wz/.ðêñL"†ò´§I(Q ªCcˆ õ)utÄ>ºµO¢ÃËMYr<÷,0*«”„…ða.rý‰çdħ4YÞ'ž˜{ãÇ7Ví‰4¤æDcB*º•õ“¼A*^óª(¤è~GåþJþ‚¸P½&E.us ZŽð€#7@xA”åBf´ É# > KÁ2…Uq©xÜÓF¢ÆÏ‚VŽøÊ`™R «¦õjqüRª&—¼ì…&J]ÞïzIØÝ"¨Ø"êoØ¿ò¶7˜õÐvºSx`€¹à`nK0©Àü-ÊašäBJÍ©¹ÏÅÀÕ ‹,"Iu˜t Fõ$q&L± KÈ*1lB¦ÜžWe#B’ˆ 4šk ,ÇU‰—^kYþ]i‚’óø—þõŠ"Tœ 4:‚í1Y0 —–´…}àh®ÊžZ¬¹aIÈø¸®Ð|¤\Lwa©Æ|•æTQ3aÓ©U¡Wt&†%B ÛÏõMøžwE2žkøÇŸ¹cD=(}BÌ<#Å…þC¬[róxüˆšì뚤XÙ¾µ/‚ˆY§;/(4£ùj?0ž ¼(R¯1·q‚íÜl掶钪xœ†ŽªŽlªÓ"ºÖñû1¢ú,è?#“Qº¶5NÂóh+ZRO /Õ*™-Py²¶OÓVmæ”–q^‹“yQœ¦´>BÓF©§#¾P¢”–:VVïR¦¬;»ÝaÃuþÍ“!sÀús7R ÛTºÝi}ÔLËì+Õõ O0œ5KÍ9Ù‚’Ì+e—XxÚñÖ«Kä.·©ý=±zM7Fî ñ-ò‘ÁÛ'ô*¯mgdâŽ|(ÒQ“Õ=.sÖãSà•­*W®™Wã¥N±Ò8ýÞ6ŠÜ^bkz3s ö¶½jȧ‡•]Ûí;ùew˳ά=ôÈ€µ·×µg¾€<û$ƒÇI—, “›®À=)Û§‘70ýtÒÎy^9ƪ–i I¦¯¨Ÿ¥a3>c<¹àÅNbü£JÞ““`g9äyÂ)µü‰žW¢7@_M½DU=S L¨4þÌ©V-Í-»¨Ê]Í>X˜æ2=q/F…ÝŘ‘5²ôž”dM¿™?>Ž$?ï_/_À^‘wó‘ßrEÑ%J¶>KÀã'UÊHIF8g¸†)|°ª¸:;wÖÁŸpáûI˜öuÁ½„ž^ã©ö$ ]1—X—>R‡òýó ó ÙÊ…EÚšwšÌ ÿEÔœÔ éŽñ\ 𱄶©U·µ— m5]Œ¹É*½Õg˜ÐÁƬ؊ YÏ¬ØØÇåFÞ up¡, q`Ç@ß^a­-™ÜðŸ¾Ý×[ØŒôÍ…-PN9`LÌIïp ׸ÐÊÅ"aáþaDaNàaX!&‹ÒF²Ô\z@à‚¡aUárMÒªaMÖÞ†jáê…@ÊøˆË¼ ZŸ *Y â ""¢""#&b#.¢#F"$Nâ#V¢$Z"%^¢&f"'b¢'nâ'v"(jbxŒâ!Vxˆb&F*†¢+š¢%¢",΢*¾b-Ò¢-梺M!NmŸÊl^ÂP6mÓ`è_²¤b²ØQöãaÑaÝðNújGÿ”!vlޤ…ʼÄÖôˆÆ…LôÛ7†ã· Ë5J#8Î!éåQû ß”õa£µL<Îc¥Èc=Ò£=æ#>îã=ö£>ú#?þ£@þ$A¤AäA$B.¤B6dB>$CB$§¡CÊãJdBzáCFTDv$A^¤GbdHŽdE–¤Hšä}…£:ÚÉ·,™K‹}íÅ%Š&…u-ÙqÈa4 æäN_4B£uH*Þ‘ÕÅPr^ÝD °IKÊÍð9eÕéd6VÿùŸ^TwôH‡¬OÕ9 ðÚWŽ¥X–¥WšeXž¥Z¦%[ZÝZºe[‚%\Î¥\Ö%Y¾¥]¢%]Þe\òå^êe^â¥_f_æ`ú%ê Œ¡æQF%Ž9#cÊ%ÙÑYZj£b¦aædêaa ffz&hv¦hþeh’æhÖe=SúÛþÚ™²‘1’Áú KSe!U^fR£3ò0î¢=ÒÚ 4 ‰J^#mÜÖq.¥°A¦Ütåà8ÑWn9Ž‹é¸åö5'v^§vîÓvJw~§w†çj6åxf'x–gw¢çy’'{š§x¶gzÂçzº§z¾'}ʧ}Æç}îgw‚Ë92å£i'×(•b6e€h=r&vbcd駃Îç9êÍ|>h~N¨…V(†Ö§†âç†.(nlͱÜMj ûX—ecê ã¡&²´h+*PΡÊ@¥FŽ‹T%²”Ì9"§9.'*>fxôŽp&á”ÍhXËô$“ú[“ÞÍ“> “N)”R©þ”V)–^©–Rà–B#—~©—†i”‚阊©•’陚i–¢éšªi—–)œ¦iœf©Ž¦ÌTÞ)ŠçmÜIƒ6h¿‘§be¥Ì雦é€.ã>E›j›ê¢>ª›Bª£Fª™¾œrúOŽÖœtÊd.| àÄÇw¨Ïð±æ6.%W¢ÇÑ(w¦[XJ öŒ¢ ~\É W¢ŽKÕeãcÖÌ66š…= ?íŽ-žc&¦Ö«²zȱ6ë²&+³>«H+²Nk´^+´f«µjkµv«³b붆«·Rë·rk¹Šë¹Ž+¸ª«¹’«»*'pÞVË‹.h.' > y®ZÊwdþë©êjº¬´6‰~¿i»®+Á2ì».,Ä¢ëÃJì¥)õqarî"û¼ãÂ’ÌŒÎ1Þ\…Þ瑬ɒ¬QÊšìƒÊ2èµìÊžì½l¹¬ç-΢¬7à¬>dÃ-dÃÏ-Ð m6íÏ&-ÒmÐþ¬ÑmÍ–,Αx`Õ¿V—[tÈÉÚ,ÏF­×v-Ør­Øn-ÙÆlÙ–¬Ù¦-Ú®í׎­Ú¶íÙÂíÛ†mÜÒíܺ-ÛÚmÞâ­ÜîmÝò­ÞJíÌîÔÂlÏÎlÎnÍî¬Ìêìà’,ã2‘áFîÚžÏZîËb.ä^®àvîårmà†.àŽîß–îÝš®ßþÎíÖ*^>crVãÝDðl@ œèF¥a4R$õ.ïö.ð¯ð/ñ¯ï Æ ôMß$ïò*oó>¯ò&o[ï9ØnañÔÄï ïö¯÷~/ø†¯øŽ/ù–¯ùž/ú¦¯ú®/û¶¯û¾/üƯüÎ/ðvoýÆš6U2毾 kfÓ……ŠøÑ—¸øbÊÐEw8å4q'UÚ¨–¢’1¥;(]0o.$¯_pôj°g0ó~0SU_x<°î7J•Ž•ÝVJT!0 ¿°Ç0 ϰ ×0 ß° ç0ï°÷0ÿ°1±1KÔmJ”ë0a̰€>1€*°þ¾ð‹p;0°³ Nq±‡1±»° ?)N)§>iM`TÎ-qÇorÃáÍä1êq<60y‚¤¯>àèk q ]@/?¯7ï+/;”NÒEnhW‹–ˬ!¯>çÊ$ÖNþä¼Vò¡â†‡€ (òP†r)“ò)›²'«r+ÃE*Ãò*»ò²r-Óò(Ëò+'ã.‹²&û2*ϲ.ßò0ç2/ó130Ï+=Þê/òq¤ aû@rV^¤N$4¨5ßL&¯6ßG~³8ç± ÷ã5‹‡fsÇr2ÿ2;/3.»³0·s0÷2;ßñàìèxxþƒîS¦ªñ ïºÌ®`|߉2Iuݱ£Mr4íhÖ#rIéf²dƒw`4R.ž/ê3²r#/r#'²+²/488Ô>—ð"é«Ù§Ð0Z¹Èt4G³êó eÿê´”iOÏOCtN 5$ãô¸õM?ó’Ök¯æhS7àRCµK:5O5Œ5SWµT?õ ru õè¸unèüÞ#n€5DK4RV£«N5[Ç58×5]Ïc>fª^KôN¡°Æu!›óU'uVËuP¶W¶U‹5a/6QSÓV²Äb5ËŒ(—z4²’¡0:P{Ü.emÒ+—x0<þÉ!$ßj^gtd“5\èCnÕk>Þ55A/#/n“tHç¶`p2i×2@Öä){ˆE¡DÌqÊo‰[¨´?öuKõõ*uÆ#tó5>^wZg÷OG7w;÷v?wwc·xƒ÷’–7u˶3˶z“]aW÷Kdƒru É·½R·JÛjx×µ;öoRo·G§¦W«6wg*J¶·]?³Œz'!?gNgƒkó¸@¸G¸4çƒ#ñ…û÷>çÖo· yÜë¼Þ‘ˆ&&W¾cÄ̤FÁ^4™rcÀdÄ Kw€gq¶»dÎÄ„|ÓêPCésW0#ãöHw0‘çömÛ4Œ3vH2þÌ7*VŸÕ&×.y 3X¬§RõO¿-¦P~ —Ë(‚ùRúȘŸe¬É‡–zi˜›ùš“yšå—£9½zù©Òy—Ÿy«Ö¹ž[]œÛy îyžçu³„Žo%lçažd¯Šh®Ö\–;8TïuŸV2œh [1o:ù¤KwSóiRŸ8êRžNbÚrŠ(ª*k†)³Z«ªe¢Ú1ÝœiÿEù9RÒ•uoá»Ð–TÈ>áÿˆö“A—i?òéhùž>%‘º„|Ÿµ#I;”Cû¡-ãˆúÈ!—ôHo0’#/yß`y4Wsi¦¼ã¨ÆZ°&׋+;s;7ˆN·þ(¾ûc˜—ÌuÆã¾÷( ì¢Ofëòk¾çã¿W%Á <¿ü¶7üÂ?<ÀG|¼¿–6Âv|;Lz”kÍÇ%&—ü€¯ºO‡hvä)8Zå¾!:º?—¸ÌøSâ/ª¦ã>9úª5W"ª3š8oòä±Ì¹õ³ˆýÊ =ÂB4ÊG'WÓAKäÍ&hö¥¶eFùÎn_¸ÑLsòrÁøcùƆ7#—}ŸDÃÄ-NÅ6gT¿umóön#r¸y“åsAXD±ŒÇé['ߤ\ˆ‹a9—®Ë´RÞ´ŸWi4_,ww¬ƒ²næ7ªŸråÓ5äg£ã#)0gþFþc*æ#ªæ‹zä[¾èÿ$èCôæ£LçOþè»t风óxd¿=c3£Kß»NFcN Ÿ°uyZgKOt\_¼²f[³:óÛ58/çŽòïîãcö¾êïtëF´›[½°bgÊÓ:z¿s–£ò»pM8XÙc–ˆ²©þ©<¢K§ ã;"šKÂ8œAM˜¿ˆ#©ç·4@|à“­Lµ"ô,RàB> ~¨ö¡ÈC‰% \HÑbÄÞrå:r$É&KŠTI’̉–'Gz+³°xà n<ñ‚b‘\Fhò¹øÐ'Љ er4h§Äe2Nœøp*㵚Ñ!DŠ þ»õhµŽ_³Ž½ÈÕ¬W¬aµ®-{ö-Fµçºk·"Y°t÷Ší+÷¯Þ´ƒñæ8n⮋wtÛrX©}¥6”¨¹HB«4‡F}Ku+ŸœB1k-ûÙ!Ç"ŸߥiU²TÆãýw]‹A±&mÚ5fŒ³ûþþšòéÙfE«F앨EÒG% xWãÆ±p#šFÜýòuªrŸJg“üNدc×ÎÚ—æÏ·%B:« ~2¶+©ªªÁÀ¶ô.Jí¼ï.¹ üM#Û€;ï±ç”J룕Jê×\òC_(, 2"ê#©øCÁ¢\«F&ÜNÌ©šô˜3î<¢€KþÐ;ëê1§—ÛKÈ׈ìñ¹éün°%%kH#e“²H(Y+OI™LR-,}ÔòK.£ôòI2Yãê*%ªM#òfk,8­¢‘¾Õˆb“¦ª*r®AêÖÔ*5ÐøÄΫ²›ï²Ë®’ÒPðä¤q5<¹ê 8Ý&°ÉµŒ 4¢Ûs/¹àíÒ5'›3µ§¢jêªÝ­®JE¥,@¢È #ö+#]‡<Á¨f5'§”r£<¿ ï ñÌÉ£´ÐÎ<_köµ Wú0D“Nêö[˜BJ Uï`-ªTUÕÅkÆXíbµ*N9É"²Á<ñ%µ¼}ï5¶ÎÐpãWàHùþj«5B¯«…uCØ^ˆóý·à€–`Šý%øaè2–4aë€$°âº.vM°ßlk-ÝìO)ç¼vPhC>ŽY'«¬yºáBm³Ú·´åË­>ƒÙÎËhUJS¾H›’i§~¸Ôró+¹Ó¤“ê)ú\ Ö"MÎ;m{²o¡jB*A?þN‹+*ñA¬‹@Pa8±ã+®ZpB¶„uG?àv¤_òV\r»©D­Í›§…¤¼«çL¶ºµp4üÔQ1v˜d¾^ÆwågᣗâÕ»Ón´Û G}öÈX·ý/ÚO—}wÜcwdÓs÷ýõ¸>èvâƒW~¯å3yÀþ~tÎSÙxc0ê@ÇCÜÓÁ‡ìNÕëDµé±Ä{”ÔëædvGÚ]ŽZ™Tzª‘ÄŠ4´ÿqÐDÁ7­À p-ì+Ÿ[\¤79Qå#‹¹ët¤Qå!tŠ®ÈÀ+¸!\±ÏDdrŽ„" a Q˜B®…-t¡ÏÁ’q=N†#z\LÊàBoLEX®ŒÚÄrB ñ…E4⑘D%.‘‰Mtâ¡E)N‘ŠU´â±˜E-ªˆ\´‘„ðw?$%(qÃb[H4è«_In2òÆ_ðFoÄqŽo|€åHÇ:Â|ôãÈ>ê„d½‘lÜb‘T$#þ©HIF2’t¤> ™GDFäƒÜHæ˜#HDzãŽz$ä)ýˆÊQ"’ކ4ä*÷èJXR¯\e+i9ËTæR—¸Ì¤.wùK`úR“ÀŒ%/géËWªÒ˜Á„¥-G©JSÒ’˜Óüã5±©La²™Å„f4“YÌ@S”Á”å8½™Nqªs™ád5ñø€sÆó‚éʼî$—÷±Ís"C 2Ø+v°>ý„ˆi¤Ò2‰$t¡Q©†Bч64¡-«¨D!úP.Ô4Ä‘ ’ª¶ŠôÆR¥ÌB#Ú¦‰æä'¨éSwÔ–‘¨ ¡•”EŠ›”®¥(µ©D)ÚÓŸnt¥;-êP)jþÔ‹Ú4©A%êPÊÓ§"µ¨N=êO›*Õ«2µªZ]êS³*T¨†•¨(õÎCkšÔ£ªÔ£iýªPÅjU©6¨«jªEz6œ¾µ¢Qñ©_¿ ÕÀBÔª€íjY1zX©ê5£7Í+a+XÀ6§gmìA7¤ªI&F±X~•‹·©ñ?Gám t®ùyENªr µ6Ò“ç¥vi©}mÏ!Úêv"Cû(èÓ“1®+G4²m ØòþÈén ÜfuÝʼ,¶jªÙuç$]×n··Õ.÷ÕÝÞJ¼Øõ®nË›Ûóî¶¼âÕîvå^í¦µë…oxw;_DÅ7¿ä˜qE!þÔ~Qì•ivÑ;àü^…½(³-âb«Ú¯L¸º¦â-•P5^ÏVÃÊSð{›õ^iy8Ã2ÍV…÷{àíâv5®®‚÷[_ã’דKšíƒYañˆtpÖRp+X†<$ºÊ…òZZÜ|1·~ÌUšÏª§-塿:NRÓžÌÇ5C‰Ç‡`ÓÈêæ5©ô¢æ'SnTLã‹å.ÁBXŽŠ#,§WZ×Á÷ê¬æ»í7Ïø£³Íüãžz΂Žs§îÌgB;èÏ 4|û¶OFBP¸…ă) ××!v°‡Ëëc¸Ìþu¯—½ìco{Úáîö¸“þýêçÊÚç.ö¼Ïí{×ûÛáÞw¿Ÿði¼ß¿÷Äç}ñ|Wûà ¯x°·½ðg|åùÌã=î”7üãéz½‡óˆ×üé×ùÊ—~òªß<Ú)oýsW ƒ¯8H##ì¾ Fèýï}üÝó^øÁï½ð?|ã¿øÀ>ð}åŸúÈ'~ò­ýåKûÕ×~öÿàû?ðÞ¼ÿƒôµÿýî?ýÌw¾÷»ŸýçO¿ýògþüÙýù+¿þèß?þ—Ïþà/ÿpÐÿîOÿœ põ/×ï pëO#ðý°ý*Ðú.°§ÿÜO)ðÿ ûà1þ0ù4ðCåûVPýH0ÿdб-íï-?°Uà*0ˆWJ@ŽìI ŽÊ8-"êœð8˜Pg H·$Äæ¼ìoPã¸Ð+ ß-Œ®pB I& 1K9þæY(Ì8ˆ ‘Ðæ²0éÞÄ ¿B9dË"³XG ƒËïжxc ÷º²pu¦8º° QA…1q‘¾ì³…%ñ¥p Ñ3ñq;‘ñ0)ñ Ïð SK 'Ì ÙP(`ñe1 ÉÐcñañ±P¹P! ¹P(|ñ O±7ZqK1Ï •‘:Q ›QBþ~q¥§ñe‚Ñ •‘GѶ±'ÄâŒD«WBKu*Q€ò§8ƈGžH† èèã3&8ê±dô1GH*~9,d+àìA 9,ƒH(ä Aå{”çÄîæ!ób ÃGÜqÐNŒo† áŒçLæñXr‡Ñ<Ò!A#OL#ã$$‘£"7R%ç-r;’%SÒ$G28J[2¸†ä"áLa°…‚NÌ9`-âàÄ}ò'z2K¸Xf¡Ò!YuÐg‚ºb{dK¤`ft^$jŠF:jrã‘'éT22%3F*Ñ¿lZ ñEî-)MjhêÑ+ÿ%-Rád¥þ'½²tÅÙøc ¢ƒjnNnÒ‚Üb.¼C(%¨-úæf‚BR:fɈƒ|¤"6<ÆIÈÇ0EÆ.ìIUŠC;:ÓÉ(¨MšòÇŠ:Í4Ó Ìg¦ô j¶í2cÓ5±6[³k–6s“gv“5EÃ6Ó1ƒS7SpˆçZp³8ä5Ò4…†8aè16ËÁö$;eÞš3¡cQD£;½7ÇÐ×ʇÞ<óž4¦+Ûm;/…ÉRsQ ˆ;Y®zÈgB’²csx¬“.¿(E¾èç¢ÃÎDÆ1e~rn;fn~%²N‚òíÜ~N-r× e|³åPsµÞ'Cb‡IÂvþ†hö‹³¨Å–Å7ÝÌB‘FSˆ.<ÈTÆ#ÍìTÔgPêÑ7!SBh>ësG;¥³t”Gx4çÅH‡´GÉñGûŒH…Hs4JŸ4³f ÑDP’G=E>rÔXšËØÅGã„O"H;µ"QÅMà'³´KïF:Ât7÷¬ËÈçHe7P“l¦#SJ´}zäBã^*1!-RÕ€2êê34Äm`lÎRÄ;š­È¸N>‰ u´Så£27ÅîÊm](N1¢g/Š FS@¦4›K{Fô8¤0S “êL ä^|ä,¹’¦ÄN 1³GÏæ5GÌÅPôW‘T2…•ÍĬXá3Oþ uWe•àŒn5‡ôDgKÍh¥ãb&Jv&8ãÔPŽIîB€æÛ NÉž2ÅÌ•;Aóµ~&P±èTƒe®«3S~|..^4Tv·ÜÒ”DR^äÖÌ ¼êôtJDä”üóÉJž´fTüþü a \" $24¬z\R’¾Ô¹‡225tvt´p43>E¤Þô\’ÔDdœäÚ¬Ô’L”R$$"<(6™v\œšœDDDl:d|j\³]$:Œ‰áôÔ²|L¼‹l\j|”Éà\>4Lz¼L44äÚ¤ÜÞÜìʔܾ”d²áœÎÜ4Dd#tDJdÜÒÄ´žtŒ^T dÆä¾ÞäœZ$ÜÎŒt>ìÕ„VL däÞ½Ô–d<7/Œ¾ÔL¢×”ÒÜ48?DN” #ˆL6<äÖ¤LN[ìÆ„Ü¶”¬Úì>|ÄŠ\dfl<>©¡•Q9â†9×aŸ"ÒGd !–xÙp˜}¸¡‘„vä§ ZÙ?¢Øà :Â4ÁEÊd§jê„`€äÕ„Ûœt¾g§†D×á þÚ*| ÌZ«¤WæºegDŽÈè ˜ÉZ°ò5ùå¤zå%P™ŒYàŠÒQŠ›«EãŽnu¦*†›1*(Qöj¤·àfk‡âªèž‘~†(?­Âë'q妛ٺØeÅ‹Ÿê š:Š·f‚qâ¸ìŽ1q¶-{œ…˜g®F¨·†K,¼¸{™°÷ «•Hloa¶õàM† (­›s¡©&\lÒh•µbD“{?úøºÎ¡+/¾òZÆèÃG ­§ÑéòüÈO­¨ÏJwyt½Òäb³²Å)A›B(ô@lÊdc©×bÔš…=2ÜqÄà WôÆ9r¯ì>ªqÃÀ]¬þÜzòG·Ý†ÚwÓÕ31{õØÒ…ù_^ZvÛŽ¹e¨Ù…«j7ZÆ–gΖ³?±hBjzŠ—Md×,c澑‹zæ.ˆáºëĈûëbP@”¼ûî²÷-íÀëNöf ´º}˜ÝáÌ7ϼeÎ_íøÁƒ(®üõØg¿›©’O>Ç€/~øäo~ù蟯~úì¯ï~ûð¿/üôÏoýø¾ø÷»×Uˆò¡„ð€L ÈÀ:ðŒ 'HÁ Zð‚ùPñ¼GÀýyP äßEš°„($¡ O¸Â²ð….Œa gC¦ð{8Ì¡w˜C%C þ7ÑÑH@^ðˆHL¢—ÈÄ n£€OTB§Å*Jq€JÀ€¥ÅAnbƒøbÁ(Æ2’ñŒcL£ÕˆÆ5º±pd£ß8Ç8ÒñŽvÌc÷ˆG5Žñ‹€ ¤ É‘zšêb>6±Föê‘æŠ¤#% ÉIZ²’˜¤¤&/¹ÉLrò“ž e'G ÊQ' t[Ió‘#„¢€?Ü„ ŒHËÖ‹¸¼¥.mÉË\ör—¾ &0‡ùËb Ó˜Ä<¦2“IÌ"b±ƒùØø|øÃcTóšÔ”¥3·8U2r€Õô¡8§N"–sœç4§8ÃIÎu‚ÓêøÀ N*Pæza øÈ‡+þ c, ¤çÍîb±kÙ ZU&Þ,dbµ›[⦵ˆhÃX@æ*¡E@-s½qŒ-Xs€[`®j…@ä<7µ‘@E>Ð0 ë 2jÁqŒ>,B¼¨Mðj?AcŒa-fìm£ÛÕcÄ”ˆ&®þw°ºH~L·¦i…³˜sK>Ì€À¨=…k‘Ú|l!ì€B |µœÄ tädSCŠxös4‰pŒC`€¬rÆî[7ÊHC¶4‘'é‹ÁêbÄn—Õ=Æ+£ÙçÔ v8²ÿ¼=K9Àϵ±Ÿñ Ì”´=>…Ÿ­„>ðËÏýó1ÑdW½|…³y_ëÝï=N²ÞÃâ ~{íò’Y§o«i»šÐÊcxfî`_+a(Á52éq¶6Ó}¶€<-ä{ç{ßý–°<*€g׿ÃXe[êà²x¬%È\iÑoV¼Õ w5¬þ¹ûLC>¡ÉX'šCÎæw:•ͦW­±ÁZܶí陿kUˆ×ÌZ³ºñ êXýÅÝ C=XQqXCôèyÉ ÊˆEÈÛ$¥3Z»ÍJhou%âÆNö²›ýìhO»Ú×Îö¶»ýíp»ÜçNw³ƒ3ã M¤3-û†gœâfÆà7q ¿^ðf.üßoøÀþñŒ_<á¿ ÄWò—?ÆyË{óœw¼è3?yÉ[>ô„Oýç#?xÔŸžò®ï¼ìÿñ2¢Üô¹¸ƒ~Œ7c#©äHðCB·â—Äø’l$r4‚|å7¿#Í>óAò|éÄúП~ò£þŸ‘7PµÛǯދ¨êö^§Ì[«PITž2 .X¼à±ø«ÿþñgú÷_ŒÉþó×~È€ˆówJö·~í·úç~ð€(Ø€¾—UÏÔR4ë&KTå{4‚‘D‚þW‚'(7(ØHé§‚.x‚ ˆ‚/8ƒ)(€4¨‚5ø‚6˜ƒ+ˆƒ>hI-ȃ7XµçEü€fßæ{§b½w ø„èA(H…R…Aˆ~X¸…UXƒPØ…C8ƒ-8…_(„ex€Dâ{„w˜‚0á> Õ{džBX/hv˜‡wH‚7ȇux‡0H‡{˜7;Hˆx(€þyø‡„È€ŠˆüP„‹dW<Yã—Pä•ç§….8……Xƒ'؃š8}V˜€9ȉœ¨‚éw…`è|(˜ŠŽÄ~:;€Ÿ(7eHƒØf'u“1©Æ{¾‡1ÇA‹öƒÅø€†È€Ž˜‡®RŒŸÈ$„ƒ¸ˆ^HƒÇˆ€zxô7€òGÎˆŠ ˆ‡Cx­â}p¨bßó?݃e·g~¿Ç"µ` åÀa¨ÙÀ_7€|®RI ÿׂÿÈ~Å€œhˆª¨}ùФˆŠ’t€Z˜ðr  €ÿ˜~ÿÈ‚Y‹™‹ÞõCç†?§P˜ø ½r}°ü€þ Úž0î—“Žþøƒ¶ø@Ùùç“Y”¨´“ËÇ“")ŽæÒ“‘´€;Ù“Åw”Ýh.ñg”T|Pù€HÙIŽÝG~A7@Ix†Ômop ÂÈÀÃxÌqq)•Xi”t‰JNÙ“A‰—zy•ùבù——ä—ü€‘˜TI—§tWI˜~)•èד)•{ ’ù˜•©ƒtJj¨[éH=2‚fqè{öç’EÖDr  CÉ—–i™ÇØ‘zé.`›è~º™›–©~tÙ—v‰™Ž™“Äi™ɘ²y›¾©œÆé›MI•˜ Á‰œÿg‡Ò‰•þá‚Dt’á%–b÷ŽYPô`ÂM­©ž0Åy›Ô9Aiñ¹˜TÙœz™—øùóÉœ:y›ÂÉœˆ¹Ÿ³©Ÿ*›õ¹˜ï·œ¼ù—ÕY™¶9¡Ù“ŸYjß53ÕS¿‚Ï zé­)7Õé˜ ª›E›jŠ© Æ ”Zœº¢\i |9”z”šù—ª›7š ryœ:j£DÊŸ„X„@·^W‰‘XDÁ(.ª8Œš(Ÿ6”C £ÊŸ¾)ùץÉ™(¤ ê¥&ºœ( ¤ò9‹ˆŸ0š òÙ‘>ZŸñYŸú~mŠ~J^&)WnØ¡à#‚ÙÓ£þ¸™CP¨÷É~‡J¥'jlJ™Õé¢C:§z¥WÊ£üYœÒ¸¨T:¤¸É‹Z¢j£-Ú¢÷ù‘(–«T–(&–+õ1U—)¢Óy™Ã©¦ûg¥zy¨yy¨Ú©»*¤-ê¨o:›²Y§ÿ¸¨‡)«óé«r*™òǘ™—ÏÚ«ÒI•Ÿ9nã¤A2â§rh.t™7A*—Ÿè——ùg‡%º€€I¢CÊ«Íi§=Š™œš¢†Z¨È«µê¦,H¤Û鮞Z£”I›õZ«Ž9˜Ýy‰&Ö†C$–XTw[±{±›±‹vD”qŠjF4nhfM$[²àSMãcM)K>%Ëþ²"Ô²ïÓ²,«²4{²2K³7;³3«?:›³$»²2˳>û³C{³6ë³G ³*›P2õ]Kì8U7¥n9gP5…KC×KOw@†„µ¼äL4XO·J.K™…P9uL`ûCTK!WQâ$rIÚA[DãÔmå&Pý´OÄUN›…SzŲ±ÖN?E>¸•Tò$uµµO%sŒËjgã‰h&~5±woH4HœÛ¹pä¹ Hl$H£Kºš+ºœ[º©›¹gÔº›º°kº²»¨‹¡tjÝDUË˥Ë׌бSúÄ+¼½+‘ÈQ€Ä»(‹½+‹¿k‘°¸Ð«¼Åþ¼Ø»|Û)¨©h¼Ùû~ð²ª'nhv]4…e( MüCUûcP;Ô¾ü³JðëTÛE¶XFKâEUTõsVëC=D¿fK@Ò4Q9´?8ÄBú³N)·ÀûBñ{¿Fe¹º't@Ve¶l«Tm¶X»µ‹X{˶ӤÁ!gD×eKX·½´Áüµ¾TT+¼ÂQebÄÓ-Grö›µB>æ•r-W¾¯&TÅ^Ñ]cõjlK[URóÄ¿Žûqú¤¾ë†X{J‰f™µ3õD uuÂA¸¸ÙÖQ^¬¿’kDcuk«ÃPwqJªfÝÄr:µj8wWH,b„õÅ¢Æ>\QDŒTþw|u^üÇDgT{*°Un`ks«VÈeÜÈ{[µçVteuTzÅÅN§ÈÉá—wW%ÇL¼·ÀÕ·S·ÅçMkõÁ§\ÊÙ•·“{VtŒÅ"wT§FwL\P¹gËSe¬ËdÅÆ;bÑ´ËEôÁbŒÃÀ<ËèæVUeÅ“…EftºÑüG›Kͳ[»ÒÍÓ|ÍÜܺÛìÍ£[º¯ûºÙüͲ[GØìºµ‹Î©›ÛêÉͱ¸» š»û¼ÏAÏ ÉÏÌÛ»ËññÒ€ :¶È|ເÔK½xø•ÊWÏÅÑ‚ÊÈÐý̈©½ ¸JµüPä—Ò"=Ò$]Òsg»‡dþʼnoP~àÒ0ýÒ2Ó4=Ó6]Ó2}Ó:]Ó<­Ó~ðÓ?Ó9-Ô=]Ô;}ÔB Ô.Ô9­ÔLmÔPÍÔ9 «cÉPpܪYõ~À\ÝÕ^ýÕ`ÖbÍ%ðãfjeév-Í{f<Ãe[¾…U¸oV@\LåËÏTÇp[K(…¶p†fÛVÌs†R›à°ê°IH¢KܹÕ~­ÉE×U<ÙxìÄn¼Ê|ýSƒ Ë,vË…½ eÒ väÇÖ%àÖ¬ÉzœÌ§¬Å©ÌWÈÌÈcüŦ,Ûî{ذڴ¡I<0ñÌßÃHZ=–·¸Éj‹„Øå×Ûä KØÖÌ‹ ZÖp¶–c„• þI¶d³`<lžÂÏ=è>Éà}Ù:ÞUÔ­UßÙsoD¸ÝÔÓ Sµ&d:¶ iv ‹æhi¨ÕÙÌÝßr\èŠÞå½ã¬¾£}‰|ÕŠ$Ü­cp½àCÐp4^oP¹ÖpŸ  )'[4^æ†>à6'̬ÉÝÜ®¢ «7°ií‹E,K--Q?$:°òÂögPNZì`ôfcÇ€× mËŽêÐf†îã ÎÉ‹>¹ìý[ÍŒ³–ÕGŽÆì«¿3…Ê L];|è;>ïf­þê/ÖèØ^3%ó‹p^ÄX+æ«Ìñ˜ Úû=æcb­ÎþìÓ~»£ÍÛ4¼G~}„³UÈœè.fêŠîÝÔeóc¦ó™¬ñѽð3¯Þ@UíÎR^Ì› ßrûì©æ7ÿÈ_¾Çšýß æBÿ}jNÜ‚Èb9ÜOÌéFqÊüÝU/È´MòŸï5^à±”õhíÛÚ>^m­ÍÕŒÍä¬ÎÚüÍìÌºÞ ÎvoÎuŸ¹ªkÎyø€/ÍÖ|ø®ë•{ÝÑØÔnä0]“Où/Mù•_ù3ùœ¯ù–ßù ßù›/úžù™oú¡ïùŸŸú«Ïù£ßú£û®?û ú°ù¦oûoí(suÅçøÛ;ü¹®² ›°ÅßÞ»üÆþǼڻüÒ/¼Ó˜Ö_ÑïÇïüÝOýðÉÖ¶{È®TW¯Ðý|ÏÆ¨Œ¬ŽÙƒù¬‰ñ¦Ç8ÐÝþézÐt“‘"j•‰¨ÿá"Kü,˜…ŸÁ„ .tHpáA…J´hbÂ7ƒø)9¦$ß ’bxœ@¤ÈMüÞhTȯaE˜5i*œ‰Ó¦Í0oNú3æÏqöŒ¹p¦L¤‰^ ZTcT  kBt:•*S­;—ºÜä"ŸÈ‘†&˜ôHrб±#³¼ôis©N¡ ¥þ,(ÓnѺFk „ùub¦4£b´ø/߸u #ÍyShá¢ß´ R-Z~ƒR¶þUÒòMCÀG7Ò]l¯éÒWÿêäšðì×UUJ“°FÀZ¡öFÍšµÒÔ¾“Â&Í;wlÝI/ó ™o¤gÎj¥ƒ½WïФ ½+F¬÷vï­v›èC ä§bÔkõ{̹Êo¼tþò¹õÇ«£,2›Î´²0k•ò ®¬†ƒê?½ÞkÂnÈC¬.޶ƒ˜‹¶¬Z«ê0ÞTÓP·øjkm¶î¸Â­5'TÎE•“é¹S¤:’®cÐ¥„n(E ÂðH ‡äp>ÿ&ˆÃ&Ñ›HIÕ¨2ŠÈ÷ˆ|(£ gü2Ê"¥´‰Ë 5ÔÐ)ǬòËäBøhºþL¬¶Ô"æ$~xlëÑàŒòÈ0{*ÍÊ0o0(I)ÍÐ…%o;4PI›ÔÍ1m*ÑîÜÔÑHÇ44R¦¢ ôRAIµÐ0=5tÉ4ͱ¥¶¦ëQO’&r·˜Ü˜,ö¸áQ. ½è¢AÅ\Ò©K¿TôHOËã’ SÔSi¯íôA)Y%uÙ‹†“C ‡ÀhUWµ2EŠ+rÙmáp,¶<«5­WÊŽ+Vàg_L9e¶Q„Ð¥Ö¢cÃ4TF3d*IP'•ôáC=•[IT6à.O“’TˆImV\¹ý–P°>ºÓz;û,3]_ª(E(=þXäiß­øÜSîÛƒþÞyÐiÉ%ŒÑ… Y䙌6d ŸöQÅÔ>°ÄZ Ï“n°.3ÑÆ|S/rµ$Wàh=nV ±mî™Óh‹¸[§Û¸ì ‹în¤›îR³°Ê ëžšZŠ× ˜çJŸ›•Çê>“7ßžV” cÀÒ>×X£F›o™NìuÌ%!Ð TV•ÍJ4VòD JF\ qYØ‚y&‡$Ÿå$Y#3[£ z©ŽFëÒÅ 4rïfŠ‚Ò²ðè%À$yJ äXâ’sm!IKàà $‹, ôK[ð•Oƒq>ðAJGtp3^ lœ[g¸$ÅÒÊn…”šGÕ:k5¯y©L¦·ÝKc\UážµÞef[ ž‚Bâþ'IJf¬Hâ -ª ¨‚4ã¡‚¸ðÃF¡§ËÜ)®T¹É¨µ4„Cpr²a'²ËP‡QfŠt…³lÛø³ËdaVÀ„ TöÏásI¶˜F˜b€¡|ÃUi ¶° °ÀúI–à(o£Ç*©V±ŠRÝ!…†¹¤ÏN—Ë…é0Víåô(¸:µŽôH ´È:Eè2ê }Ýa²K8*RaJßž§½9Bêac[éÎdÃ6ÑÁ‰—®,Y;ÛÄÊÙU\6$›[úo%é—"9I ”W ô oŒh›‚ˆÇ€<âéáá¬TÏj•Sžp)Á¦å)þ~¼³­SZ%÷Z©¢rru­›åsI-ƱweôB¡‡·ú.Qµ6t©”Àꩼ©SûjÑ6»œI9½ÏE——>æåF®û2¸úgD׉¯µù؆t´x[u_»«:#Æ<>3­L†bH«â*’'j_Ê2²:wHp‚Iz„b ÆÌ ¨C†’ضBˆÅ;õó‘ÿÄpƒXµvÆ"|åÅXêÖLK-Í‹ò›“1«4T¦YÌæ³eK 6Ê 60—­ °)FÓ ·×^Ë’ÿè‚dè©ÕJVÕ*æÍbýñ_xta ºäY©Úrà ?d>£:Èà¶5MB6×+þ£î-ºZ†}ê|øÉ%sܯB¤™…}?1i¹^Ã:ú6ÎQ̆ý‹Vª|==+ÑrRôa'G±¬†7Óå\éÙ]_nµdqœ­Z6–—J9¨1Ê˵kéN\»ªŽ,î§— … —|ã§F+ºý¸©ËïŽCågy œ’lI#Ý™{%Û¶ü@†0Üá}åj@ÂmÔ°|ƒìÀ×jDæi,vn¯‡ÛƒkG±+N®CØá„òjaʨê KzÖÕ^«E´È–$lÁŽK”Õ‡Ü&Jå` j,áòBš»˜B/ÎY7sF6Êæ9»Ç0-3EAPi0?k”v‡hìzþ'5¤µ'bî3$°e™‚†_ƒÛ‘f¿úƒu}pÙ»§dÕuèíUÌfÇq»NtyÅ'Æç1*·Ç¿ì¹2ï ~ÀqÒÚÎyÞô É×.”<Àåý2E(>¥ív ŠÎ·eiY´Ç„nµ–ð;ý¼òB’¬ž„Á´QÁ¸uqµ?ƒ??ò”µé” ØC²;¯06ƒ ¨º~¹4X‡W‹«Vi°Èb)Ÿ©9½1˜Wâ¯PÉé£6Ñ;)D’i˜O ²UC³cá b»•ï#¦³šz¢°Ò3T³.*›̪u[Áò6E뿜k®bÁ Kž÷þˆrþ!-Ÿ¹2Òˆ ›¾Ûš[I2ž’Œ•о,q¿±3ýÂ!¡ó–¶ù<ˆY½µQ›T²´Ó£5)¤þ» ›èY+‰èè´#Ó© Éc£* Áþñ:㑹¿Hù¦"ʱñ"½ÒУ- •š¡1éBû[«“î*Ä+;)! µ¤U£¹KŒð¹¼Ëûb麻ûRM¾‘Ù/KÙ6Ëy%V´¸êÂTs¢&d;¨ «¤Ë •¡³œ¢­òA¼9z1©i¿OºBq[¼‡#½N=‡Ø¼™»Bª¡Ð‘8£°–o˼‘9B/"rµ™À‘þâ𢕾›­$ë«H¼p؈¹%¥p8˜…© 84,Æ$DàкJ‘û{²S5y¶F¹AÒ, ¶¢»êÉXÁš0ÌF¦C6Q!úc–²I…x+ ‚p8£H¬…Hh›/nÉGR¢#QQ–ÀIc±Ä¹ÃsÆC½µJ+Wú(¼© ¼",y+C„>”s¢Tˆ(-ØÃð„Wˆ€ ÉÉR›”×ÂtÉ'%!FMI0êÊ8éÒ‰’¢›,ã5/ÅB<7A Œô½ÈÓÆ»·ƒˆ:2X~ˆ¦Zà‡œÄ4)È‚6˜€h‡)P @€þ¸Ì‚‰b<Ëbµ–3%vƒ§JÓ˜¨´¼"¥çcÁ¼Ø3i >ÏY¼5‹Çœ(¿"‘¦ñ<*'b„òƒ€Â‚ˆ6˳ö “è þ3÷,Ï,”2A’G! ;u´²“JQÛÒN²Kæ3%Û” “³¥S Àc]Aˆ ÀpˆXÐ̉̂%wÀ…Dz2èu  ÕdM¸-tú®Þ#Ñß,+>»G„YQwdÑþ2—JÍÌkGÞ¤,Š85• "CÎ}¯IjX¡²4y,°‚àL(e1é ‡ñÏ´›L§aE3kµëºE œZ£ËÉ¢O,u›‚Ó‘°©˜dNÉôÁžéRŸðÄ«` SrF:Aüܳ¢1æI-¯»Uo¬™š»U.,«TB¤ìM…¹ºBÎ ó§Qu¢¹¬H!§þû˜³!,ÄWwIÇWœ§!IÜ)–L3§X­ÔÒJþb9ˆ•“Èü4ßñ°níRq« N/2Q´ŽÁ´©¹±£)ˆ!#§Ùøp©Di'@@Ý\LÒ8ÖÙ¬®ôœ›%= AÓßINKÅ.Ðy.l­¾Eå@’TGíéRK¸L Ff<ÓbLì)’Y‹©cl³)»Rô®C¦eÓ?y €s8LD;-ìr‘pÁrñ¼Ö¤Ãb·=‚«zä£RüôÂA¤m Vd—C»Y¥]Qº•á“YlÄ ™@ËF€ƒn8DÙIq±^Xf¸½Í¤HxbÂþƒI8Óè¥Ô½¶%[­sûúªnƒ9U¡1”¹O FTjšPœbºmdÄ…qò$+H‚¼pÐ(a„oข(ÔòäÄŸñ l£Û?ÃÖœ;­Ïçî‰B“Ñ´ýÞ; ¦Å™‡¡U}zIªñŒëH¡gÍž\Í/ñƒ0˜§Ø‚‹®¸½ÇR¸Õ¾óýC¶ã”,k°qå£$42‹®¦ ]{R³µ!ª¥2@y<«eœNƒ×ß kD.Ù7ÖÌU`,Š$™P9…®æ!D†C¯@Íú²5«Áãû Ô¸9º%7ûVÙ¤xœ¸G›¬f,ò4z‘WŒþҜԗ(ñLÀð_ÇšÜІZò‰â[Ÿ-ÆÄ†3¾= A—{ÚZ$ÆOª5¶#8ÉøÔ¾l£Ál9β`Ö¿«­g5[ƒ@Ë!¸Oà€ÏÙ$f9hÞ+0;•§DÊ%µ §€»"²³[Ïå[#‡Ÿ<Ó±aÄáİ* U:ÝùB̈L‰$(¨Ò‰¼\‡¸&Ì8Ê4ò„?dÊ´ ˆ€¸ÀéÀ„)b׸ú,2SÉŒr"mÞªä¶>‚?fž› ¤ÃšzÛÁ¼?%K)Qȯ½’S[ˆV%Ï#Fs»ac ¶RÁ8rÊÐR¢ñå8b£*ëÀëþ +ÔË2Æø²ÃiˆåàÇ¡7¾Z!s—ì5G­D¡ÝCcm¸Bl´¿Ù±«p5äPp埔ÕMjŽ]\zµ]‚`Fî# ´3§ ¯’Ï~õûO¥èf<«sæT)ªu˜®?Öé2Q„©üif+…«Jµ­œ®ÌÛ‰(²àßå‘è è;Ú)=Ì)Y©¨dÚ¡î–U àóÄíí£œN¥sZÒMà­´—ÍOÖ]ž©Î’NS^#$O'U‘§Å# #°«´‰i¬ î½`•âl Å5„.ý”1‘ü¹¥€n@59{ëæ,@.p\=x*µÍËıþw8^ìYOìùŸ¿9›Ò.»Ø=X­ÊU…ådާî5+í‹?zž¸{V)¸.¶^Ó,•Ö/aP~ØI½&*`? tÈ=´4²%uÑ"*]ŽÕ]™U¢ÉrÜŠ4>’ç7Vž—-„=>‰Zä·Rʯ(AK~ðL†aË2{Kñ„[¥q©øT0þe½I㋌©/Þ2«åR€éË(3E•%clsŠì>³à"z Þk‘&¬slpkºàOh†ú͵ÄÐMÒ4Í,ˆ…Ô¤Ü:šÃ:Ç,Ý nêê{YÉë5¸yQ<ÀÇ»£%›ÕûÆE'"i­x[bH"þh8[P¼_0dãÍ‚€(NP€ñ<’@ ÐÎOȃ Ü~`Ò¨NûÆÒ±q ©)ÁUÌ'ÿ,ÚÄñ Ø6c¸]ì¥WflÒEÓb‹É”@¶Ð¨I€(~Xª¦B.‡8 Adµdÿ%ˆÉÅÐ ÍP^†¼U<'Á•ç=ì‹‚Ñí8-[ÕӜ寲:Q“‚ÏPõYßn:Ëf°õk:p¢ÅÛe.!ñƒ8R~HR˜ˆK~`eq¢YÆKÜ¥Opí*xz”fZJNÅJ"˜ L§›Ós˜|ƒA¤c$Kòµ¸c ‘& ä7è‚ãZkþàp‡<%*„ºe@-¤ T ãM×ÝÈ•ÃñŽäB²=˜Mš;º8÷G8¯?Wr1̓Œ4–ìé`ÖS^ïË–˜€]¨`®V!çÚ™×è5Ò’ëâ³¢¦šydŽ„K°ëº“£Ep-3¸ÉÊíÃÑ’CÚfñc©¹`Øâh±É¶¼ÑsmÐ+¤L >JFÆ^¸lWvù/‘ìbs\Ï@åIêeá d»n(òh€4èöÔzwrÂg.´ã±'4¬ê 3¸‚SÕfwHç¢%…`íÖ+÷4­ã¹v püLJüÈ—üɧüÊ·üËÇüÌ×üÍçüþÎ÷üϯ|Y·ØÇ­·9¿®ÀŠÔWýÕgýÖß çÖO ×W} ‘ýاýÜŸýÜçý×ï}Ö€:é>5=inîˆ(Î0@þ‚k[‰tþ3r’кz_”þè·~')8êoþë—~êÇþð¿þÐr®òGŠàç´Ä+ -eI)­Í\> ßx‡åæ¤pn¢ÌÿDñ†~Yø $8°`Á,7.L¸P!È!"<8pbC‹%>ìÈ1bÅEz$hÒÅI~(WªlÉò%?o6eɧ$ß±A:ÅÄoЄAùlæÛÄï ƒ7\(Ì’ÀÀ$S4UˆbƒS§7¬¼Šþp#Ë,­Y˜Š%ëeU´_«Š=+°lÖµc/ºMû¶)ÓµkÑÂíË–¬Þ¬|å¶›u®a§M2n¼ñ¢L£Çn*jˆ§Oƒ(= u-€hl Áp lÓ-LùmÉÒfB JS˜JPÁ©T³ É2lú5oÚ³»~qïD•¾5þö·XãyïˆØÅׂd±+kœûôè…“7œ=² Ê4cva¨ÍÉF‘*¿  „üfDýÝ:!_¸ÀDü¤± ?m|5KoæEaͱØaŽÕ`U²µsZÈ¡Zå}¸†#nØÖvoaç‹+¢µL>ÅWP˜ý¤QþÇlâ}€} f•B`)|@~!ÄB|‰+>è›” mW!„V Æ¡–r—Y€ý¥¥p[ÆÔd‚Ya'v)ž^$õgL3ÕtS>:]ÖÓOA uÓ&7ôøURHXü|EÕ‹Œ(sZ0vjr¹ærб˜¦˜²xØŠ{A'¡…Å9(^[ýfá¨d Ñ‹V©•YåÙ*WdüLfSPƒØ¨e:z¦\Lúô°L…ÐÃOXYð€;¸Ü0?žXâNê(æšBPÎ…ÜšµÉ¡C¶~™)–ãmy"¸š.õ`vºMÉ&]¬"桼ï꛿ÄÕ¹#QyÖÈ'þPBµã O½õÌl+–I½èÂIXú§Áeõê¬.ÞÅ1Æá5oÆrqJ*˜îf‰ê…gQòƒ|%Ö`¦K¡\ÆÈgz¶7È{ê((Eí‚ÑI+½4ÓM;ý4ÔQK=5ÕU[}5ÖKÛ™#{=Ý Ù®JÌçÙ‘}¶cf›6ÛmŸ½¶ÛŒi´QÜt³ wÝj£½öÜsÛ}”dxü«Ÿ7éȣįvåuS2¾¸¿Kþ¸ã•7Nìä–CN싚?kå-ež9çQÎ9q©‹¾9;ö|ïÅÿN<ðÕÎòÙi”þ¡ñÈ$}oÇGo|ð·û|Hå†ô†ŒJ“ç{„ e8ÂÕ?—î˜Q²oUÝ¥z¯û‰Éÿ—„ÕjúÌŸRøí¶ÄD?3)¦VmÊYêœ(ÑŽì“åÊø¡Z]H–ž´š6¶&~ÀSšY¹Ÿ`ø©.èô3•ý×ÉóÈZI ÚRšãÄ|zR%¿$Ÿ¯V8› " oŒXNv!•HÈT&CÌ«²ÏU‰Y‘é(DÒ’(d*, SVŠ?qy̘‡ÕË0´TâKþƒØNEn7³™¸`Fš!†:g4š­ë.BQ(ã²¾„D®‰ ÔÈ#Ïê,‡W ¡­â—º‚.$¢Ú“"åБ%p‹•’E™^µç=<âô†€Ò\ î˜Â—ÉŠ…xiÐ]â:ÃÞ­¦C¬™ó¬dÓ-.ï«sñ ] Ê¥è®)lµÈ&M§”€¥£»XF3”$e¦ð¬,q sVnj'!tˆ¨º”U¶<ÙÌ’™;Ä §(c`oùLý¥NCÍU«‡Ø3CLàW²ÔQä:ÒÉ /qÜfðéIýÝEf'J.‹,¤"¦¥¤ÊlÉy­Ù¡ ÝvNþê*+]@©À¿h(‚èÜ Ÿ.9™Ã½áv `íв,勹oR*­yÝÁ¯7çÂêxP&%FæL…à¹E<áR½¬r%&S¹¶F ­Sl´ë曄øÌZ2:ò’l‹«YHªkœqt‰9"'t]{\bH¹JKzÞ® nq†$ùº=U“‚RNo%Z£>r•/(ЏÎ?îŒ,Œ¬™ OtM ezáÍñ|2gªÇ@¤Õ[³sQ¾&X'aËä4‡«Ð7³¤ŽÆß™+æ4m„ÅÐk®†Æ©„F4´@µW2Sb»ÿ–‡±?U‹x“§ª3‰‚J+=˜ÛžÔ ^þ$š—ÃÃ;·x,#u#J3K 4s(PW&?ž¶ ÙWþé?[w§¡T²`ìÌGmŠ»pVÕ˜¤-q\eš¾O­t)Ë JÜœ¹Rîoñ:=l¸ ˜±9…&/ôæL™óµ(_TÑǣ̶‰_Òlt·u?-ê²\…™³r`ÊÊÚ«Ó¡\au—;ÿòoÙ L¥½´U{Âkš$¤S"øºîjÔ`àmpçè\³ˆl›þܰˆ1³Ü*µ0WÕmˬ«ZÐêÑãGïa/Å"Õ~IL‘-¥É“Rï¤z‚„ hìêg§AòRôþ9äÌU˜sŸ†Vé.¤fïº ;þÕ§¶úãëî/x˜eËcŠ[]”;ãïzN^§-0–âk†>˜GCT\QZŽ€ Ùê¦îS¢x‹Þ¾ÕB‹KÕ2“®4mÐITñ´÷šÌ;ºÿ©eJ ‰ñAØÈö­b*![Â4£ýV'î’Î3­èºt=/Ó—ü‘%–¨EjÕé¿'Фéâ=•`¨/•…мv Þð¿ÈÇóù-RàÝK\ò‚È/!»§í,õø¾9ŸW­®G=X.µ²ä"so3Í©jØBU¶ëÌé ýÞ.)šÄXžñåN¿HÑ¢qSß©Iú)Ý\ôÝÓ–0’âÁ•ô-ú-­ž]Tµ}¶þ•,ùZæÝ[L]"éW-±Û¥ŒÆ™eÌ”ˆT”¬^!ÉÕYåIÞ7¡ Ô™l_4)„áɿŖáM@ñÍyÓ³Á•;A_‹”X®Æ[=ˆÅm„K=S¹Þ…K±W-ß©ø8)œoôš5‰›§´Ž­ÚŒùÉì¼Ab•H*‰=Í^ñš,- =º´—ú¡T¸Ì mà¶ÕË6 çØú‘P*ñØçyÒP5E¿Q¹‡NlÝu Å)FKX\5UUOÓÑßÇ\tl!,•ÕuÅ¡ƒ]ZóMØhùË.†Ó-)Ù¢MÈáÝÈ `€øØØG¢rÍŸþ bÙh1™ð\©±XdqŠAðXi¹ 7fâCÍïàŽW5mÈú”Ý«É À¨—õÉÿ¥™õS®ÛžIa4eaâ„݆]“ ‰VEñÌõ^h}ÞZ ®Ýâ?õ“òè¿ØÎz}KáÆ–1b_x]ZL±ÌaŒS퀔hÐ`yXZ$>d_à”N‘‘U±e¢Èt]ÊœBÞúˆ tT°¤“O\’À5Xïé¡7þÐjÅEeœ~‘Öò)Y.uåš|qÒçО#žŸ|¡Ž6EÛN­‹\} †Î9©Q1ÒQˆ $“åe˜Ì¬›xAÞ¯ýÓðyþ^ÿüEG6Ù9OÑ!:Èj…£>™JyIÈõÐý!&EÀИwmÆëmä˜M –¢2ßnìe ÙKÂÝS­Åb¹SãŒK}Ȥ8!šÍ]uŒb^NdyIXS%#lÙHPL@À(&zÕLUVÌ©u0æ¥`ã5¢Š‰i 5­XaBEÉ5"Û‘ý˜… ^êS ~…$=æµÚëV@ª]îä^Z™È¸4”#N¤jاýV©…!ab!…Y£yßO™"3±ÉØ¡YÚ¦N¤%|Üá¬`c7>ݦؖ™(ßLåe_äœlšp¬”c•‰]âÇqž)e&ŽuÌG6("þqÕ8YIRÛÕYŽ å9ÜiR„ÁõÚÕ§o½É‹•¥P²áÓÛ†yöÞ‹U'ŠÌÓüèš™¦Ý”$Æ‹iWõé%œMd_BU£ÔbÕÜ”ö(»„RÈÖ4^`ŠIÆHä1Y &æÌÉ'…顎qG¹'žh€ ÍÍ‹IÄX\œD_Ümé=±Ò{}ؼçY¦TZ¦@ ó)Ç.]zÕAJåvj¡*RŸ¬G®S ’ŠHêI"¾-bWΊÉà»aÚÆx3N‘׉ÇK†ÎŸ•½áƒâÏ¡ÇÐ –ĘÕq™'J¦øÀæµØ¾=ÄìÑL[-§þG6’#ŠNúAŽlÖNÝ‘ƒŸ|µ–}–´2”]‰äu‰ÊíŠõãŸ`›!‰"R/‘g6j™tš :£ ÖM}̈‘ö\Zih…ˆ Ý1Ð[X  5™–YÝ ô<&ãÐh_ˆ%?އI©]½ö¥JªÝA™¤FHe•ÞœA˜÷™j ]YU>cbrN©jÞkà1ºÑQغÖÅiž8b‘¹ H=”)=‡K‡½mšÑ—¬`ܨ}ŠÓÁ…¢ *¹dè ñ;òC|äÉwú&Aa¶–Ü(ÝÎiÅÚˆ×!+€áèDŠÕ²±¨9úP®ç‘D>ÛÈzÑÈ<þ`“ÅâÈ.NÕ­À]ßzᾕܭÒë7†ÛI.7ÔOÅåIYU’ßá‚ÎeN)ÑV‘iè¥P#vÔZ²ZGq°6,|Šmù©Ʋgu«ÅÞ…aqÚåœ0‡2’‘j Ô–â !’s] DžJ~©I`˜%×T-¹öíD™ ô¬Ï†¦$þ˜td®*U&žj«þWv)Ô5Fa‚£OÕ ù¡i²‰íjhÊv„«Þb¤‚ëÀ]ÑRÊ'‰Qñ‘V ï@`fÞ™ä„9k1* j­Ií¬ˆ„hš)¨¸¢¬e­d‘J‰Þ¦0é&Ì.£5má~9‹ÁoÔe+é†K¨U¬Ieþ)ö–‚Îß‹z(ø)׊p̪ŠûÁ¯a˜SÏ…Âj†—qXB­®².®yã·€™#"ÕëÖb@Qàâè£`Eª F‘+*¯§Ë,-ñçoØIËÊ©¾á:Ⱦj›Œ¨ ÚM•>Q…žšïAÌã%¨ºFNo0ó­ašª›­¡–‘}$„ðêEþÌ{<áGýï%ªçÀòïka˜}åvRÜVð¡EÙ)©©&ã] <éoÿÜh±Ù/\-.[r’€º¶m[5=žÁjqå½*IšœÐþüyféØqqæ¬ý¦"y¡]|6ùS¥)Æêݱ×(þ(®Ÿð]ÄœÑé9ã|ãl"éçà»®DüÝ麓§@ß*IW3ê.SÖâæäW1šÏZ¾Ñ‡x ƒ|‘V…¹‡%RÓ©áx¬KZÑæ! åZ¨éµ×jEÝ,ž"î")¾ˆ‡D‰ÒÈ;ʰŠNsAÊgy-29iÓ¹˜¢¾Ô…MW>]`)êÞe§bV~³è£eCĘZ1(OÕØ·}to‹NE"åâuÚêEû”ÐJ•‘%»u¤}íR6ú¬Ç„ RS‡TdœÞ¯2,ìíó]‡%n)é¹ý"­ikŸñé5òb¿-Aæ ÿz­ýpf9Òþ¬ü1$8ïùbjC“ Lg±êŠ¡je—ýFÎ•Ž”OïYçüÝSR¢ò¿ ;ˆžö²åÅ*ˆä^Å.ksl"G¹4SˆéXÖÜÇV“ü*˜âݽaÙÏùÜòü3ÃÅYA_G%$ZvSFÞ£áÍ'§ó½eX·Ð²°Ø!hÍÍ5CðÓ†ÕG{Õ÷[EJ7û ÆaÒ9Î*c à4Uœb¤µ å #%÷°™­ )ÑÐ@_.aÎîŽ5Ym`z¶à&ŽCÞ¨?kHËQ¨wgäõy‚4Ì~¾n­° ©@Ö×uû3êR8JÙ³Òþñ5TR(¨ÀŸr%3§@õdSP¦(;VC‚pTúÝ?¢ÎAQà½}^]•ðÜú)D#§†‹tCAӂ웤„tA±ê4¦à«CGi[®6;®Ðõ¨îk@¡›ˆÂJR¹ Ô õèU/O¹¥1KZ¬Ê0 çoBHÒþxËY$Ê"‡B=Ú%ÏJàL:‰”Žr¶á² q«€å}ÛLï6uI‡¢÷Çq%èiáJˆ`ëAi Êm#TÞ› psÕ êàÓéR¥Ï±¡&¦[‚œi *‹e¢qÞ\ù%V³ŸI,tµ]1ƒ­¸ï©'ÕÞúêêø ÛžúCXáÃd«þk/S˜ìrGñ§á”³1žªkJ^ÍaNpWdZ1iSpY©3‰o·y𣕫K±£Ík a¹›é4îþé©JÈ%/—lwœ`¶[íC/š<³iŽŒ=[r˜s9n-—žz6#ÆXeáÂÔÞ?éóÿÚº;ó$Ÿô¾÷@ïàýJE)íèu•âå‚·µ¿`©èzR£ž°­1L®pÝzÌŽÕ`»r$ôþ5ª a—‹KóʉöÊ®4ì‡Gü2['N¿Ë-Åí}ãpE\k@›Ü@m ïåOo&?ÛÊš#AO97um:¦;Ff¹ÂôŸé’ü|uH!õ‡Úßöê4 éþ’½6(3Í 6Írù¹Ûªãû¿÷2)E^§˜“SÉ)Pè1óÖÑÒ“ýY„yœ¢š³Ìî¢J-nI×gQG8Š´j |gZ&¾¢§]> Ž´¯yû–uEhü)8ñ ú›(&ùÙ0øýÊ3§vÓ!"‚Zú㶯òYºâBufƒ7Ž,Xö•v¢¢v©{Ö¦ ûÑœóµ’Ãu9´¢RÎ z}gçç¿ ½Æhçysìpô`avNdªo/£Ïôj„ÎÔ¨‘*˜’³ŽÞ`6U, ‘I$çžHé§ÖY°c@d¹‘…_1XßA‚Y² )èbà@ˆ!f´¸þ1Ë›Mü”ä 9h!1¹0DRd¾c›\¼)(0£Â‡!òk8ÓbF7i^¤ÉñÆO¡C3´9ШEž å™ÑàÑ:r„øaέA1.$تW¦BŽeHsçQ_R4Ø“`L˜!CN yr?’ƒŽµüøÆ¢Ü«ê‹“¦a±RU˜5bUª•6ývlT‡g‹bŒÌv+SÑ3&.MµpW¤©s–…¨*Ó©%Ê zÙâdoˆ<¦„ä¾~õâ}yã eËD/’uM÷pÏŠ¥ÞTX4jYëWCuüöòkò— T¬õ§Í‡=G_ÍÞv-ؤXë?Gº¡þÇ,-ó!É$”ü")°6éˆ蜃k+Ôì;ï,¡šâê1ÛëÍ2´Þši5Ž$*ì5Œ‹.ûk>±íµ¶*Ü­µýŒrÎÅ7Éb8‘þ:n½ò¦7ôêÃý8Û,2÷8ûN§²Rôé½ý {+¬!ÜÍ­ÅêRr³ª¾;Ñ-ø’š’£öîë’C­Ö²ë¿Ž)É8ÿp0¡£J³šæ²Ï!¿| »×l,KÝhdíE¥fk ³‘Êó(¹–L+#,4ÝÎäÓ²ÏòÈ…–ˆÛ‹N …dn´I«-®)­¢ò!ÇÂÚ(²ÈÒ#q6Ÿ®‚Ê=#«ï°è´,VF¡èþã°ÏÑ(}•;Ðjð:L3óˆŸãüÑÇ•„SâθDlRQCw]U3Ú4-2R5Uº›8¥*Z„,¤‹²É"4«UƒÝIrcÝÍÃÝ•5<ß䱤ãôD¹!‹=±§íäír­g¶Ü¡(ãL4oˆv×ÌfÍÆq1†ÖcC“°^Þvrßó(V²VÿlØÇíä§9š$‚lBìöeð¶·ZÜ2Âë¾Û({=öXP#3:Ð_Çí¼–)”rY$+Ôà­Ý±Ô9ûúëaæ&š k]“”XF£¦ŠÏYu~™-iQÖ¨jL7««?AÞÚ­_]·i=oÂ+)fî.‘þ0ÐGTìH¾ VwhWóM#|a.qhdc$­²™Ë]¼àÈ«¶;jÙ¬Û·«‹¬y²Ó¶Q¬¬pä§ÛQr¡$‡…ŒI3i¢­6ÍBÞpX)ÉœŠ»_ißÏ55¡Ú¾¨ü ¯RKî§»^£°&W7Ê®ƒp{‘•êâŽÄ+@CÐ.0Á|&ÔÂ1ã'7ø<©OyÂΦœ’$¾Á XH[ôÄç"eýÍ)²ÍNÞ•Ùd'm™y.•5»\+$2UÚ’“*˜ÅYt œÉÈ$.¿¥ÉUÑ[ß‘6f®ÆHPjjZÍhu+u†`aB_â䣧)jXÛ™™ä\ œâlkAÊþÜÏ|ç@Žip¼êؾ86Ùu®nR£•Å&&N§‹¤#ÔLW¬?Ñk`i‘ž@€3¼…¨aJÎKb‘®dð2ÿ"ßÝÀS3Н<×[¹ò·¯ÉE+ûÞÛR–f½j~UÉžÐöÆ2ÊtP*nÂKåNX  ê[Ë;’\€(7t 'YDÓEÉ\ €#”½2V&}5²‡CÄ4¾Àl(ÁóãHô²³* bÓ›g²ÿ¹ÈBŒ¡W3öÍ*œ^DÓ ½9žN ‹(ÍcâÍ$ÉñÄ…ÄáÚ­ëòŽLó•צ&x’a{¢Öúç”3s“¿ QW+ùpƒYYOÓîÚæÒ\ìˆÞ)9^KI¤qr“ë2Kfc…™ˆûêŽZöÆ*O ÀY†ýwâÖÇŠi¬ß¼VòT®R;THyYKÑ*ÑÿÚa i7›¨áëH–]œ‡=»ÉuArì?éo6¦{Ï¡É2uHžÜÊs®ŒǾâ¹OM#Og!Îw¢Mòº“ïÍÕQ Û^yÁ¨ ÖpvàFC<øbò©ÐM×ÚÌA•dþ Í~é㌶l•L7M²pQ2œgˆ~„ç™& èþ [Côú&qª"–¯<ÌçK´‰½Bwš.{¾£Ð"éÀf&ÑFk˜®h`&:â蜤-”>аhLTæ-•ê$ ®Ä£Ï»GMÞCJ¿v„òLÑWhœŠP`4Ê2:ò¬Ê_0®¡pê§ÄÌX ‘«1f` µ"j$,©Ê ‹¬ +ï è¤´¥ÞœH2±3˜$ÓÐnkþkä60­tÎb+‚l'}ùbrø¼&ሤÀŽîÉŒÆeøÚ§{F@üŠ*^ÎæM±r 5«qÔG‚òS–𛈠àÖ±ÑêÁØÊ¼\ÚÊþF0EæÉJÑ —C&ðäæ²‘†ô.Š-2Œ3üm}Â*=ŒZ¶2Œpñq2l~~›XF»®o†šÔ¾/ñ‡Š˜q…(ä¨ã(ôÍJô¯!çˆ&‰¸ +tÄnó´zÍ=ˆë‚Ú„g‹Ûä0êvê&êFœë™JÑ@~òdñJv 'Òg#°3;XG7ëÛÒk¨¬må÷”¥W’fˆ\h ‘Z6DþÇì±õÊq 7¢´„Cù¡a,¯<ç«Öçº>Ò27çdΓÅÀ‹µœÑ·æC²€î…äÏ †34Â*Kkn ‚G,÷(¥&`m€r‘Êp>oL¶†‘ÛÓÅp-Hn@ë‘12m!É“†‰4ûD¾)Ûâ“. Ë›8­C6ÉÉZ#§ëŠ$±¬nŠœ”+‰Ž¥¡êˆä0Ê£Hm+ uÅ }‰;ÓÄ>J†J'^ ñA ïÆèC?b”ÍŸ’#ÅžÍÖæpû ¯:Ê…ôä‡ ±âi!‘Q¶>’l«ª/£$îL(-Ä‚¨Òwj³än”Ò^sj–î!§6i?Šf¾S$b®èTìÌY,÷а^bVñ”ø´Ï½æ'ŒuÈâÆS%ɾ> ŸÎðpØ3—ocÂ`û¨×ô#”vRª6´òöUAJ'/TZ¶Î‚ #òÏŽŒacSAÝU*¸Q{®¬e†Ç8)ð |‘qN5^¤ð0KÍ[’.skt…„Úi—.)ùŒÕ§à‡4:‰6Ùw”Jnu‹þ…šX6µ`3Í,=uo¢J5ýÉ@DV DoN²q“U¸`ï2V"³O‚+BÒSkœ6Gªã¯=¥a%…*Lp8¨÷a|f †±^ÿ—K×#ŸäHDœÈð¦. Ž€ ùÂí]©ô2qfòN9VEßÚ3ñø2X[Wuͧð–Ú¦(ð?Uö†”tÈ-„**ÀˆÑßÂ'×€65KeQÿÕ eç‘¶Ñþ€Yù‚ŠÃrÊʈ:ë°_ŒEƒ:‡«':´Dm®5ÖÕÍDuˆgOUk¶¥ Éá'‰ãÌ7¤˜!P3·3‘èB̺CøCïìUmúG¾x¥Æ5¢^‡YY¶7ª±G I s7z¼'Ä‹ñ½ÊM±²U øOóIwQs&¸K#“‹@ýtêzëR:¨-Z·¢uBH§Sy[=)4S³äˆsîZïnVi¨³¦žaÌ”qþîæ99Ë k^,ÏßIùOe©›XBd@‚mHòμkö{{Œ˜(©†Z[ЃøŽÑùõí5Ás18óûŠ*%ç:JY7œ‚7þ:|ý¾î/©dG<²ep\=0“²¸†ÎÔÎlø«apV#É5ñ PÌ“qJxa}ÍÈJŠãÃg§£—¬{G3­LØ.Ί§Ô@bï÷Í¿¥ežo“µÇÐZJH£Enmt_BolËm·Þ~ n¸âŽKn¹æž‹nºê®Ëî¸ Ñ_µÍÕ©› rï½øî›/¿þFÔ¯¾¢AÀþŒ0À/œð½+ì¯ûN qà _lqÆkÌ1Æ ¬V§lÆøb]ÇH%™SJöY’)‡„òÊ(ååI"¥lsŸ7{‰ó”vx³Ì1#–óÐ9S³Ñ-4”I³X×\·Å˜Ñõ¾ þßn&omŸCX×kØÒvöØÒŽ-ª´oŠš6mj›ýõZW{ ö›v¿-6ÙrŸmŸÞd·M·Ù]Ûm·ß‚Ÿ÷àð½ꌉó}¸ánK÷ÛláíÛ‡7¤Dç”~¸Ù‘þøæ–o:袋ýx>†'ßÔ½˜6ë{»=wÞ•ÛÞúäðaŽ5Û¿ç>üï¾ãN¼â¾_­{òÅÇ=÷ò»ÿüÖqG4ÉnZºíÒGÏ=ôÕ‹ÿ}çÞs_>î“?þé¬oÃ~똫>ôð»?|>n5^{øÒÿ>ü}Ôã׿G@ù‰Oj»éW@à å«__D í9N‚tñ,øþÀ~m"lŸ+Ø>.p‚ ¬ È> 0Ždôz¼¸–ÀBP…üàÕ§<€(Lß…x>q…ê›À\ps­öõpŠFä!軉GL⯸Ã.±rWtž mª ˜,_›`cÝØF|Åñs¤cí(Ç<¾QŽ{¼cëÈG>úñld yÇCR„dä" G72R‘Ä—šä6ÃÙÑ…6 QUžäª”x%”7ó cžÊ–°ç#?a*EÉ3W‘²*¦d%ZéIbÕR–£ì%.kÉíÒ””%(‡i•]Šh–Yܧ4¸›»hMTªfþö¶›þ‡Ô ›Äû!ëî¶MæКýãœ8­™;ª3kèÌÚ8=t¦›×Œ&?ˆ=¸¸€ZkäÇܨwººpÏsõ CHP% 4‹—Ú ‘Á1ކäÜå²hQ€Nn!ÕÜÉB5*µl±€ìëŸI»ˆÒ0~ó ^4èHGÚ:„ÆO‚“çJ (¶ÙÐ("œÝör—ºø¡D*QK`T£u©H=êQ•ÚÔ§65zQe*S¡ZU§Z5«IåžR¿*U«b¬ZMêUÃ:À|lU«Ym*YÍÊ9‹ÔE†iœ=;UT¾²•0«å^ùꕽf¡ËËë_ûWÀÂŒ4‹õk  —WÄþê5°”å«eKKŶ’°Æ3ìa5ËÄšò±qÉFæÓAœÍ=oÊk68>×]óƒ -îJ ¦yšoœ$¬¦loØÐzmÂÅóCBBº3½5ço;ŸMöj¸Ý­6µÖNkZWºœŒVmžHà vDZ¸¥(m··èN×dyÅ"ï:>õÕ–{í…'Iê9Î)×nÃ…¬?»FP†¢Žšu‘îFX»ÓAô”niQPÒÞ™z±Œx®õÔ-Åe§ò³w­g\æn8…ÓéKÕK=?„Ìdï­ƒ‰ÛwyÍ£šÔHHñ*ÒˆBÔŠ±-|TÜCº ¡5ý‡azÂþ”¦Öbm!{ÉzÁVÃÃ;r¶œ)/ÛÁǨ.N¡›»ûÑÏÂb+o©øNÞlj+Ô&\Bù·Ç…]q‹ø¾¯‘™7.€¡9*ïºö¡p^ °fภúË<$ãóŽüµEƒYŒpp)K+üع…øm%Þ“9bgÔÊe“¥¥MˆÅü PƒÇ!ÌÜV[úmw¯¦r«Å¼FÎR÷’´‚¤!ˆ€…(ýt¤MË<øÚ×à¸Ú.­gÛrÔkÔ²kHë’ä†("ø²B;µáúÇÔòŒg–΀u‰~[¶¥€†ÃÜStµÓÍ]ÃgГ‹÷uñÖxcšþ“QžV]¡I£uÙ´´y‚0 Ú@ýp„«wÀGlãÝx+Rˆù˜G=Ü!ð†›¥¸Õð«]m¬Ã!š`A7àÁ\Ž{~ $ø' Ìðé2?€8ì|$ƒÑùÇó±…TÜÞXî „y°Áæ9w‡Ç']ëuùÍjxçŒ@|á ®VÊ0·ùÕŸÔ~fÓf/AÓ½!sA>ÚPWbÞ®.Âf Tä W¼qŒa PGô¸òn¶ÐûñÇ·¶`m&~ñ³x%ÎîË«µàR¶ˆ° %D"íÛˆxá±îx§-Üþ}XD] Ƴ›ÍHÞ;|`ó ˆ#$x„."pãîü¹§Èäƒp öÙ!›~HºP ä¢2wÒP¸ƒ•¶wÛ·p Ç«ˆnNœ¹#}‡„` kðE>æp|À~Ð×z`§o­e|ç:mÐÇ€|°~ ro“äxÔ9È~c¶^´afýö;©ö }@v®3mAc2‚-ãÕyu?-pç†{ñoÖö¦ƒŸð|õ"páxvðj4ò˜Çzèx ±lqnæ°n>x5Ò—rê…-Ø–c@ØóÀ§ …Ç—ÖPzáÇùÐ<@þ_h;Ÿ69™çxµ³ ˜€ €zKèaÄW}°fwY`¡6Ñ)ݧ­à5а®aà ŠÈˆù`òmWy`wt=p’ö&/—tžWîPÁ‰òÐ|`‚A—wëÕZgþ–Õ€ ‰“p §o;0ÄPgý~q‹pà¹SxPBPkÀù ©@‰…p CW^#Mu—=5MQÖ^ Åbx˜ŠäTŽí'™ö6³vM'å\x=†kj•…$=UH8Ú”Pÿ7Dç6@¶<×EM¯5M¡‡0¸™Ä`ºñ&‚ˆ„ 4lgþ:Í£6¼¡‡jãe_´_L–oÊHwßó=E¨>“På?Ô§‘I¨B½%@÷±*—…!;¹a5–cüÖEëÄj=’'¤ce„¬c\%”C°F"V<íV/’öB&Ô_³‚—eº‘9ݘÝÇ‘²ÅEâ3-Û¨8 ]B¹EV¶o¼¦c<¹Pûu?+gj÷>'T1Égâ"vwnrc˜g}ié—KÄ”äµb#ômøVa0ö;N©E†ÉhUv€y”;•ÕWMùTû4[¶b*†Gv”HžItdH®ˆyY@Iž©HTH©oo©šôGŠdHŸÉFGh´)ItG19-3þypwh÷³TP5Tc%UÆYœeåTmÆVÉIœaµVÍÉVWƒU•œk…UÊ©l%Ô©Ù àyÇÉ9+¨?<…pp2˜×Åž™MìYíŸÚô=íiŸïyŸó Ÿôù<øiŸFŸê[÷éžòÙŸ꟮óŸíy•¾Y•6æîÁiRfNÅÓ‘Úd¶s?Š¡>´¡…©9º[Õó;%JŽë³–U92Õdj]>„•±Ó&âeg§³EVFiU÷•V<ŠC÷&gf9„Y@,š£BDa¼seob™³C/÷šŽ”š4¥¡ š Y¥©Y¥¯‰š°‰›§éHƒÔ™¹›^Z¦þ€„HGWwòâ&SL¸$X£$XObLrJ~õYÇ”L¿´§¬„4Êd!¶§}ÊK„LªñW™5§Ïâ*,ãK¶T…Z¨O²8˜FóTNí´\ìT¢þ(7äD ÚõžúMØÅšfR´õO_cŸéø;,ZOádB×ó›2b˜"™Cx³¡Š@u’…7å3PÕ”\8ê?æƒBެ¾:Sc$Fxv—5IYh%F«È™v «¹sEXd£„FbjyCÞ «´Ad⚤¹êLßx/bPj¹N@i‘ôŠ87iö¤@ù­O9gURàêª-Hk°ë›°k «°/þ± û"n!± ë°›°;±˱k±«± ±K±#+±!{°(ë± ;²+kw˜)²³&Û²5[³%˱‹³.»°˳3Û²>ë²4 ´6 ´=k³*‹´+»³8û2’s±RëDS{±TKµ,{°R+µØãµôѵÔòµUûµcÛµXû"a‹¶¶d;¶¶±¶p±kK±m+¶fkµe{·b›µjÛ²] b Ä ¸…+¸„k¸…‹¸†»¸‰ë¸ŽÛ¸Šû¸‰¹Ë¸[¹ƒ{¹“˹™Ë¹Ÿ º“ë¹£»¹¡û¹„ ©«º«Ëº­ëº¯ »±+»³K»µk»·‹»¹«»»[»;PKcK}Æóñãã5Pictures/100000000000041C000002BD6703B60CEF55120B.gifGIF87a½÷‚”†L¤Â¤üÔ– B„‚ƒÔâÔŒ¦„DBCÜÂtLbD¤¢Ÿ$"#Œ’”ìòó¼Ò¼dbc¤¶¤DV<ÄÂÁÌÆÄÂÜâ䜒ŒÌÖÌd‚\$"t„¢´trttšd,2<´²¯äêß„ ¬ÂÌ„’ŸÄ¢LTRTÜÖÔt†”¬Ê¬LJL¤ª¬Ä¾¼„Ž”„²„,*,ljk´º¼$„ž´Ä®t\VTDf¬ôúü¼Î·”®¼tz|äêììæäÌÞÌdŽd<64¤ºÇÌÎÌäâ᜚™|𬤒T´Æ°´¦œÄÒÜÔÖÔœ¢¬ÜÞÜTNR”ŽŒ4.,¼ºº”šŸ\^\ Œf4BLìæ¹”ªŒLFKTrT¬¦¤Œž|ôòôÄÚÄlfeܦ,´Ê²´®¬ŒŠŠœ²œ$.8tnlÔ²T¼ÊÔt~ŒìêìtŽl¤žœ¬ÆªŒ†„¤¦¬$&,”’“ÄÖ½DZ,ÄÆÌ|vt|ª|424¼¶´ìêä´ÊÔ”–œL^r|ŽœDN\¬ªªþü‚„Œ~L¼‚ 4>LTf|ìÖ„<<Œ®„„†„DFD¤¦¤$&$dfdÄÆÄÌÊÉÜæÜœ–”tvt´¶´äîäÜÚÙLNL,.,lnl´¾ÄIJl\Z\äîô<:<äæäœžœ|ž®ÔÚܼ¾¼”ž¤  4FTôöô´Î³ŒŽŒÔ¶\ìîì”–”¬®¬´–D\r„´ÆÔŒ¶Œüþü|~|ÔÒѤƤ¼Ö¼ÌÚÌ,6´ÎÌösäÈ'¯üò̶ÕX»9òAá–ûü@©žû±{Ï|Z£ÚôŽ« Ï·ÜþNw«{ß{>Ý5¿¿Á ó.÷Ürÿ¼¯Ýé7ïÿÿ  /Թ̎[”ÛX¹.F®‘™l{#ØZ‡¨÷´Lxº“ìzu¤cÝŽXÊbJo¦ŸÖÕmvEk AX³Ö-…ƲßgHÃÚð†` —·°Ä-ídsþržǺG.ä{7bÙºÆ7ÜÅNXê“ý†»„ÙLXÁ›áÚ§?¥äOXGëâqHÆ2šñŒTËÁºå±mmŒEüš«Du#,ÝI ´•Ù†:4úñ€ ¤ _”ƒ³Ý(TÉAº«8åpk 9"È âŒt­m˜Ì¤&7ÉIžŸt(ñÉPzÆ ¤†(=p†V’2•œKe*M)ÊO†.V*ë¤.wÉË^ú²>p ¦0ƒéža²‘{mÒÓ%ÉÌf:ó™Ðž²DÄÂ×Ì&6·©Ínró›Þ '8Ç)Îr’óœæL':שÎv²óîŒ'<ç)ÏzÒóžöþÌ'>÷©Ï~òóŸþ (@*Ђô M(BªÐ†2ô¡(D'*QyŠKÊÔ+€ÅÑŽzô£ ©HGJÒ’šô¤(M©JWÊÒ–ºô¥0©LgJÓšÚô¦8Í©NwÊÓžúô§@ ªP‡JÔ¢µ£zˆ­´$‚qX“¢P­hT§*ÕªRõªVÍ*V·ªÕ®rõ«^ +XÇ*Ö²’õ¬f­j|€QµéÁzˆ«\çJ׺Úõ®xÍ«^÷Ê×¾úõ¯€ ¬`KØÂö°ˆM¬bËØÆ:ö±¬d'KÙÊZö²˜Í¬f7ËÙ¸ú Å%SÇ‘T´š6­§M-jW«ÚÖ²öµ®þ-lg+ÛÚÒö¶¶¥hR×*ÉŒºC>è¬p‡KÜâ÷¸ÈM®r—ËÜæ:÷¹Ð®tÜφ–tÕdE,J‹ÛîæÖ»àý®xÃKÞñš·¼è=¯zÓËÞƒZs·JmS­ò Vè!¸Óͯ~÷Ëßþú÷¿°€Làkv»ÕM‚Ε6ƒ#À}j;ñ «¡½†§ œa‡:¡Âë q‡EL⛸Ä(>qxï›Tø¦ ]*\<×&ØøÆPxFô0öÆ7Ž]EЄgèx°!0Æ*šÐa„ ±>h“ äÛáȵq æë•Ϙ¬ 4A×ËŽmBþj¼æºŠ ^6°œçLç:ÛùÎx&°"œ`=´Õ zÈ‹·›Íp´ˆ¾¦Æàƒ„c á(¢/<Îp„ é¸fàÏàK Â2Ðñ ÿÓšMH‡©Ý‰èH'ú™†j8HPާ~cÖí´´UŸedó$Ц+jhm†cáÔC:š â;»ÙÐ~¶´£Míi“ÏŽEâ c¦²‚Ï,ÖCÚ w»=.7aIЀ`xÖø•kBán=9Ì}M |Po=¸;Þ‚­.˜{nq·ÛÜ‘%Á0Œqî3 £ ¿k‘'+‚iØÁ³Eп#¾X5Ë•ÈmžkpþŸA‚<›üä(O¹ÊWÎr¾œÐ÷U0ƒÓ5ƒ·æ±G®a87úѱ‚&úŒrÈSçÚˆp¹cáM`³N‚3¨Óšðð–ðÞ?cD¯u, ôÖ Çú‘eÃ$@¼IÐc ílqp½t^'5˜†7Ê‘Ž~xcÖzØåÙ„b4aðv@9‘T²›í9_ût=Œb$~èE¿f8ŠÁvg ÃÞ@‡<Œ³ zžƒz£G¡ÖN 3®‰ úºóØÆnÃ5Ÿ1ôÔÚÑØ¼&H` zX»Úоô£Oýé[¿ zG¸¶}þ@Išºº×9øcá÷ëág׃¼¡ ¿Ò]ïÛE?ÚÅ=¿‹;ÀÍkþµÁ…~4adÀåýÐ "°~ c°ÁP \M°31 )àTM0 \áà{U]Àõ~Ûû&nš  ï° Tð À> êÇ~}å$`ýðzûgÛµ€ ø€â&Àö o@f1˜~ë×~$°ß7(¿p} ¯ kž&€¼&…Jئ 7  ° g àY{EdUÆnz@€hM€&WMÛà1 ×r|؇~ø‡€ˆ%‚/sוGþß cïsQM0kà&øs>Ð Þyð È@ñôˆžR Ûà ×ä–æw9÷ „vNz\Ûp Þ° Ç Š`–‰›aDp ” M° ÁÐá0{6ŒM€ö–jéts÷Ewù·l¨¶f\@XÓ m@yÏ0 Åw¼hÉ  "@Űl÷\±Ð̦:'ÁPЦàŠR–‰Ühƒäö U§ Á°ˆëÄbà‡å ÀÕc>P—hÅÐÈ ÀÒø €MÜuN¦Ø¿àDp‘ÖˆÏÓð¼†MÅØïà«X}*y},¹’.Ù’0™þ^ï5Œù7ŒÛ–&Ï€D¡¤~ç֋ØTå×"P$pöp758n5éŽÅ€ ÁEdéàwQöd{W5YZÈÈ Åà Hy×À”å0 öð'¥†¦Œl9‚cW>©ÛpŽV9oÁ`ŽÁ€_–‘@HrxU]á ¨ « [(P× ”eé°g(Ž{ö$@Ii @dôöfˆà õ àW˜-V¤8 ÍP‚”–yÛáð ȰûÐÒÐ §©½xs@ ›c™sÈŽ¥¦Íp‚Y)ˆÌÙœÎùœÐ‰g„n„¶VKUMîÀˆùþ׎A9‰Èw Þàöv_ï4‚¾8“ŽI×äiÏ`"À–) NÊXp> š"âYn>P$ð "€ŠR ›g[ Ÿì夌Ö‹ýè°‹Eöfê©P žã‰ŽçÄgM`>€ û` ±àsHÐþ錼Xj6x 1ÀÛž[Vn#¨¢ðö àþ˜l4 Þ‘¿p_ žù9žÈ0fz@ T° \·gí4nÿÆŽŸ¿PnÚÐh³'eÀõÕŸ/Ù¥1ù¥^¦`:¦Ø‡`Ø”Ÿ¥T±¢'f_„h—/7”ç7@zC°]t©EoðvMCÐÍ þ’ù Ž\«p—Yé“Ï c±`špØD§š¦àh!°`pƒÆ o1À°h#ˆ•M0—wU—{·f%qâ–ʶcŽù•D@§àK° êfW4iƒJ $’¸oŽö ) jƒøegsù tj§xÊ‹•©• ï •áÆ«Ê Mp±\~­7 w:" £·—Þ°縜5†xÚ ÂçÓpÑ ˜:‰â6‹ÊàlЛÑ9°[°{°Ôõ®gzsÖ)Z˜óV8Çb†¦Ÿ÷åwŽfo¯ K6 k†Nz÷‰žèŸñˆ ÛÀ–>'ïz«F‘8·þ 7ÞÐÈ Sê» ÞÛà7³Ç0 ™jIeo· Æ`oéÐÞ´ˆp¹s@ºŽq¹yÁEÀ5ë 1ð™ä¤ *¯ÐNðŸ”GT°\  ­—´OFzþy³Z{ ̪~š‹š°¬+Ësu©Ž³¸gpVnX»±Ÿ™^èNà g`oèNì~âç ¨§³$·gŽH- o9J¦œ+¦žÛ¹ û¹+é´½ niúgñ`u¹]îxsùǺ{¦¸¯»«t5øM³ ç&î¸gº[Wªª•I%£±»t-Æ»¾›ãioý(»"8ž·•>)½ »Çþ[]É[pµ‹p4Ù g*£ ŠpJ×¼æn4®¥»‡…ˆ¾ÔYZ¶Ë•ÅK“zµ¾z0¯¥ØbpyœŒ¸­Û¿þû¿À{EcéÛŠÁ°f×9Џ¿±;¯oš¾Ô)ŸÚ)¿½jo[‰¼È«Mر¶K½fJ“¥ø½Lz_zûT ¬ (œ¾,Â$Œ»aÎ{¦fú±«§ü”*ÌMÙ7~Õ;h­”+¼¸Ц><•lœ×dn›+º¡ÛÄLüÄNÅ·UÄ,¬§I ½å*ß§}Ô9»LŸÀ«Ä_ÜbUzsô¹«…8½ÌÁ)Ãl½AùºÜ;ÇcüÅØ&WÜÃ% ÄžE½o¼þÃkÇÖ+Wãgº,ÜÁ< s…)Ç ,ÂåVT¸»+À”\É–|É~xÆkü®Ÿ™À‰ø[#|¾b\½ ˤ:LÃU̽r̲Ú÷Çü®s<Á",Ë"±¨,ȳœÈ®¬ÉO9ÃóÙ¾<,ÈÙ4Ÿ)ü½´<“Ú7N¥¬°A|Çû‹sRÍP<ÍÒ\ÍÔ¬P[ÙÌ|üYÜ—Ln5DÌÇì+È,rª<Æ¢Œ¾ÙwÃ`L΄ÆÈÄŒÎhXÁ꼈ìÈâÜÇá Ìí+Ê«KÌÇLÏó\Äb Ì><Á®Ëq ûÎhŠÏÙ<ǘÑ=Ñý_iœÊçZž¬ˆuLÊu,a(¬Í Æé Ëmº;ÜþÊ"M¿ ÊÅŒËo|ŽÚ©Í»LÐÌT,ϼÒ=¬ÆÒ»²5}Æ+½Ð jÍF}ÍGÔHÔ(ÍÓv“xdI»•T]ÕUÝVÕZ}Õ[ÝÕ]ÕTÕ`cMÖZ=ÖeíÕY-ÖfÖ_­ÖpÖq=×r­Ön]×fM×`}×qÍ×tÝ×o}Ö=Ø„]؆}؈؊½ØŒÝØŽýØÙ’=Ù”]Ù–}Ù˜Ùš½Ùs½×uí×uÍV«ÀÜ”MÚ Ú ¦M«­ÚÛ¤»íÔÚ¯ýÚ÷…ÚÁ…Ú×Û:lÛ¸ÝÚ²=ÌÿÜ©ÍÚÄ ÜUjÚ¿=Nü6Ü®ÝܾÍÚÞd¾¥þýM°ݳÝMÉ-ݽ]Üæ´ÝÏíÜÜÞÍíoÌýÚåÛäôÝɽÔJÝÞìýÞî ¦µ \¨íoçVÜÔý^碓FÈs¬nö¬ÊËચ» ÃæÀÂûÏNÇ]pJ¼ììÇ)ÍÃKà±<Ê>•ú|ŽË ½t¬¼ NáGÌáŽÓŽ_Á¥ààwáË)~âü[Ñ4^ã6~ã•eÄãi¿n"èÉ÷í´)ÒDîÂDnËï:Ì‹ËÌšËÆUšmEþîÌÀ»¼Ì7Í•HžåJìË/¬äó©M.Ýå¿æ­ÈˆZžÇgþÒB~Ñ%œæn^‘ðçñ-çt>çêõ^öKÒ=Ÿþ’„3òÁ-ãÿ\á‚n=mè~<Ò¾Íñ<æðÌÐ}å1þÇö¬¼”>WyüÏÿœéNâMèŽÒGÌ΂^êðŠã¨žêª¾êaÇ%þà爺ßPº¶|ÂZ¾éG^å´^½\ÞÆHÌ«üé÷,á.Ô¹ŽÊ½~Ò L‘ôûÌRÎÒ« ålŒëonë5=ÓÇžíu¾ívÎíÞÞígEºŽ¼Ó7÷bôç\íÕ mÕl½îì.Øyïh ×|íÙy=ïiÍÖ€ ïò^ØníîIÀÅQ9À ààÞÎ&-ì链ð>ÓœþðuÉêñ_Ñ?ÝÑ’Œp@Þ¬P!_ð3þòH1ò(_ã0òî°Q.Ÿò$ó&?ò3#ò'/ò3Óò3oò+¯ò3ïó*ßò6Ï Dó-/ôHQB(L_óLôãô,¿ó<¯òVOROóïò%ïôNî(£ŠËs;IçÒÃîè%.í!Næ·ŽÃÝÐoîæàþív_÷x÷þTäãþéÛµß4 IpI‘4cøˆøŠÏŠŸøŽOø¿,‡oø‘ßø–ÿø…ƒ;ˆÿ‡ÿ˜ù ïDŸŸø“ÿ;ßQ‡?¯ð§Ï ¢ȯLÏŒüúïé÷ mû¦>ãßû¾ÿû;ñ]á‡HM <ø”?ú¡¿üÊÿøÌþßüÌýÐ?ý—Oý˜ïüÏÏ6iöe^лÄ0NÊüýÚîÑøÌÌåŸåy¿þzÏþîßþ~oþŒ±²®m9…ÿ4ã$Ýb¨ú@w DxÐàÀ„ sH¨ÐáD‰)Rhñ!Ä…/jüq¢CV"|艥礓"‚5`R¥L–5[Ú\9§ÌX7oªÔé³&МE‰Ý™TèQ£M™êUêTªU­^ÅšµêI­]½~•kX²eÍžE›VíZ¶mݾ…Wî\ºuí^M™²¨Ð¥CsÆú6ã5ßrþæ#ÉÃ2v7n`ãÉ+>©ó僙=ƒþ=ysBãH›ýydj‚?c5Ñ+BOÚPÞv2L“nÝybÛüÝ—¯R¥yoGŽtør–ɇK·&êÒ¦ˆˆå#ûvíݹ÷|vêå55/^ü°oéÝ{Ÿ®)#zÚ]hzŸ_=÷oÉŒi2&)Èk¯»oðóác¨Ð¯Áýt0B'”°B /´0C 7Ô°C?ô0DG±DO41Å JŽ8¾ôR 1 ûæ™öÛŒ±Çr§ ˆ|Ôh4Ö„$M5ÖŒtÈ£ 5CòH' *i¨pšç6`²(Ùdc‘_”[ɵã˜#Ó¯§š*³Ì3×4j˜tTJa,þ‹.MÆè*®ÒÄ…³Üôá—o€‰dO'ü„‹cиŇ%©@†ATÒ_üŒ%.NÒó.O?5TQG%Õ*¾,5UUW•ªE¢Òô«%˜ÁÁÃQ¢0+Í …–DH Ç„í(#wˆõQXÔBvX‚ÝhXc£-ö×`­µ Hm³}²Û„‚iiJqg¢Í¶æ¬á¾$ sÍvÓ|®EXÉŒ7ºè#/49%/œ4ì&Ô䛹3©Ïƒ9ÔC“²!cŠÉîßô|B"Œ«©`p»[‰=ò\XXE“-Fùd•Sfye—I 'œ¸›&œüPjb]ˆ¹ç˜Ïþ˜ œ–‡~¹h¢Ã{JÞwÏM)Áf<ÌÆXrMR³Îx–1Ê"Úµ ûš2ÎÄv¶²®ÉözW°Õ&[Øm% [%›¤û6q©¤R%˜N‚‘oìñ@¦WÎ0æ 2‚ñaŸxƒ%M‰„…\`‘1æMŠÍW—VÓ)ÏT¥%†ÉC„nÐ"@ z…*"!] ÀxBS°d»¨¨f¯ =¨ð =×ÂjX2&Â!+w–ôx'=îƒ H´Æ÷áÏ(þŒ°e$…0‘OÇM˜§ž‚ÝŠÞ2êd5~ùç§ŸÕ&š('ªoîÇj¥&B(KŚМäxª_þå÷œ½p®(HxZa#=4àXºÊf$Ó˜‹Àí‚Ç"VÙ„¥¶iZe#ȵH3ÂgñŠW`û e67­ÑÍ[­qJJ‚Q®$ô0 ã `Œ˜$×(†àqƒøàI\ ò§‰d !Æp<ŒßäÀ‡_cÅ8F2–1Œ HÑøE Φ‡Œ…B€W€”´cˆ€ÒØFJŒñ ‰CCÐĸ3qjkGÃæ¨/‰"¯HdÃH {8c >0…J4qi‹L㱓ʔÄM²II4‘.MèašXF,~€ìPÀ“DP¤wXþÉUBRy†&ÀP'|l”Ϩ€)©§|%ìÁŽ¿ÙCGÍhßôf8Á9Nq‚(Ã0ÆvΠ ¡¥'›¯˜… ‹p´Á9å$g>ñ)ž5) sRÌhe«ÀìP2UóÈA­õ‘a¥Mk_Re|”6ŠlM†ÙÚ`Ü`¸6®-ô¢Ûz[d¦eÃ&ñÍ^'ÉÔÆ‘ƒHšÄç±M,*0Œ™éa ‘øMSb½I=Ã9ÍÎ1n`R—°Ô¨+EêQ•šT¦.Õ©M…êQÝÁŠ©zmŒÌJ³Ò“ðfÒp†øüåƒ< ã˜ÃX B0c¸ .¸AÆ"–þP%I jKy£þ€a€AlýF*‰LÊšeÕ€Kž§ éR„Š"“wÜ•ª¬Ô0th–z€‡1Êñ  ”.¡J0&IÅD¦$þJ‡+Œ¡…Q³™ýÆ}X2 )@¥O9‘T]Y«@â׸ÇÝJ`ÑÒúÀP T o £’j‘e½ÏYךַþŽJÂa~¼AÁûA;ÇX£( Ç>fð „€—ކ7Ð!‚ > Á4fÐLmtGá(,KB=„CÊp†7ðŠþì#bÒ¦¶µq=o[7(KFñ'ç¾ÐÞjjÑ2ñÛŠ%ŒœÐàXa². ð‚/\ ¯Änac)4mgƒ´"q‰''M)eo£‡m Ã6Éi}DP ܧˆ>`yÃ*.¤D¨Ð!°ae/¥iz½Ss‡K,(‚-ÉÙ¤>@d©÷ M|)šÈCŒª-­D‡Co­Iæ/•Óxæ•/•¿œtsóÒƒf5ÄÚkOZ)-²Òˆ„ûÜ›BĿцd_$à—ø¯ß}„¨_ûç÷•CäfáŽécDc‹íª hâ ) , xƒXHHƒ¿)À¸óÒJs³J ¼àй ÍÁ ®;4Ù°2´{šHöHbø»pŸWðg†NrЀWцÉë@ p˜ßhAgøÔ€XЂ7‰… †%¸””87Q:;tɺÙx±–†$A¹0ÈþêÑ °žn‹„3Ѐ_è­¾1 »šš(™ž78•_PA;HkÚ³œRBABt)4I‰5zÓÃzÛÃ>äñ ·oè 6í€Mx*'œ‰‚Y:‰7 {`€°‡cÀ¶9ª‰ìÀ™6‰q;‰pð©t 7(˜(†I´KÌ?tE[{§~bÌŒ¨ZŒgP°«A’^äÅΉ‰†@ÕX cL¡!©ús’rÆgÜÅÛ„ÿ†jÔ¬XÐjÐÃÉŽld'("Ð$ žXà{Ø@ TÇ ¬—žØ@IY;­ º¨pžh 0{ȃdžc`cþ,mˆ;˜-RA–0CÊ22‡1©MKg`-¸ê¬~i9ƒ®ZÂ>y¾„̪–P€Ý¥&:‰œüÇd ¤-8ž1AȬrBÄ9Éw°cP x'À-ßr“G=hcð£:Ê[¾¤TÊ¥ì•  d 6=P†px…Xà=ló®øÊ‚`„žàh¨H‰pЙ‘“ pË Þ{9ªJ=(dHoø’ ‚¦4.Ê 0vy>};° 2˜Åh¿&éñ“?’ªft0'ñ÷SL#ѾðVxˆÌ*›H²’1˜çÙ’Ÿx ̹ÒÌœÏÙ þNô´»2´”€¥Í¡²Ï„¥_Є¬<²åX ֜Ż Ÿp5¢sMp…t1;\2zÍ”Ø4Í»ñé´ÜÜ,SKÐMÜÃ4댕+‰’wzÅîüCïOY³’§j‡i{†Ó#ÅH0he†f3‰p<ð†u‰…(¸úHe(7Ÿâ ¾  ÓûÏX¨ÊXƒS †°‡"JSò—ï¤Ðpr>|ÛÍ4™•Z±‘©eTL·ùEa$FÆQóÅÈ4Ñ̈¬ç¡ŠÛÎ ÎæŠÁ#01ÍåÌ É ºµ "ôM™@‰WHŒ_`tT‰šÈ k»ÌÄÑìþM8º)] ·[Í&Õ¾Ñ +‘ÍÍÍ«‰²ó1°3õ‰Â,.ÕË6uÓÿŸp0…`x…møHÐð†(8M ËœÑ<]46Òz…HX…&˜†møÏ£ ¶Ü½p0‰fÓƒ10Pác vóoˆLÔ7M ¾¼ Ò¥ŒÀ¬¾ª!€Ó0i™!ïË‘BÌ#ÑXULÍ ’'¹UM±›Ó¿6²@•à˜P­Ñ}‘Q]GuDVŸ0»R0VVŽ1¢.u*ÐDð€W :›È@+[Œ×\ÇØøËXL ¬ûV&AÏÜÍ-EŠ ª¬+kN"ý“J“ýcšðÄ× Õ×|þý—›øêd3®È¦sñˆÁC³œ‰™PW.­ÒèÍŸ;¼}•Øá9Y”Ö¥™óP¬é>¶ ŽY%Q­ÉU&ñ•*«IQ„cÆ’ÕUÐð96›Š+€£W °ƒÔÙ¾LV%ÕãR¬3< Š.å×\ “GÒ\&„I+Õ5]Úv½X¾“…u ÊzRÜC á04mR‘sÇNõÔ²5[UñM¤Í’¼8È.íQ®›×±ýZ˜&ä2£8ÛùaØP°eE¹ÂÅÀ(4n¡°ò°’–ÎxÕg¹!•µˆ…«UbL—]QàZ~Ú¡_Õõ3ªêÜËŠ ï+L‚èÜþËŒŒÑM]ÒUÝeqÝcI Ô}]Ö*ÖµÝÕõÜcQŒ(±+õ³LÖ5eÝ˺ÝÙm±V*ÃHÂÝÙ]^„È+çÍÝâ 8³«æ­*Ùu°ÎÞÜ­ªÚh%Ý Þq]Ñå Îm]ݵ²ˆå׉eßõu_NœWetmŽÀ;Så°õÚÑ»§öõ_ á[¿ÄЪu§Œ~Û7 Y…’!®‰¨„°¸d)já¸eTƒ3¸bÕ)[åÂ๩\Õ°Ç©²˜øÖ­:#sÇÛ“2%£² ”˜Ç¶a*»áè\2,Û=xBxÔaëÄá!Öáç‰Õâ0}м¥ã:¦ ¦ý8ž `.eÛÝÛ†u ×1¼µãTaÔ`¿5 :`±wåe8Çà ]Yn8ïûXò‘K~!Í ?Æ5›Ëh–µ¹¨ŒØäK~Y#Q±ð z±<ÍŠÝÄ„©rÑhUdâW_Ý´ ÓL6+;6æ‘CÚ–€åÂs‡`eaN >öÛ#¶ v`»]ÞÙùä”à¡HºÃŒYá$ªûŸ+­YUrWÉ:Èà92}ÍpÖªÚp3ž{ßzþß{þÞCbeÇqÝ‹aíË`e úý8QØã°çƒ~«Mäæ#àáS a´›Šd®0 ‰›”)ŽVÕdш:¨ˆú•²F^e3)æ3 ,:`>½Óƒ Ø éøÂé&ˆ¯×À¶ž>=ŘáX¨fÓ¹£Y”ˆÑ < sqZ›@œûQ»Ê*¦>æ†h¥ÈÜÝ-Ã’À¬ ìÚb[Û(j¨–GÉò¥FØk{º6W®¦W@¦ÑŸ0ÚHg§(ä¼Ök³k3RÎ㿼7m&ÕÍùê£ØëPñkDögEÞP‚ÂÓ “Ö‚–c¹dJþ²QåHe‡b–þÍ~?Â%±É8\Êæ0Ê]i‡@—LÓ Ú8ÃÓ Ö0©—¤ ©©\ÖÑv= \Nj‚Euuç*;Þ×â‚ ûí¦Íy‰l#©¾jæhjåêCÓ®&æ{SW=>d_Õjë~1¦Xnààç–€ÑëD„Vo|fï¡Qj?Žî¹ëº h¦¥_znïööË€fìe5`Â\]\ -ú›hŒš†Œ€û¨»`mÉ(Ž-†ºŒŽÖ‘ž°_mиÙWy .>]§¬Q¨m ÀîáHÖ¯н9]¿†fFµÀ£¦,É‹$ï‹ã{t Ø[7CqlÎÎu5Ž8άe»j^1}Æþ·÷†i¶‹Æ©®Ø±ÅZâ ÝlàJ 3Òò-çò.÷r2Jl¦äÙΑn€.ï¹ík¹¾r² ó¹Õ?¦å3¿ F¦¾#LÈ¥` vÆÎÍè£dX]Õb¡8Vu BÿPBÜøË8µ!Õaý%X”çßç(˜d@†~@IÍÓƒíÍÅN¡˜†LßôN—_œÀåOk[n[‡åqoöñQî*e¨Y%g޽Ag5ÎÑøMäd6j¾æ| WWWïê&qbl¦mn{%× EÚxÆkÇöl×ömçönßönÊïõ&šgò}Nuz!w-•ßþwÿu>þžß†Æ €þ²EöPÉ 8_ALÔ¿†ÃèŠÈìÑîl…xöó•ÌæóÄLF–:¿h ~‡ôU®hÕ›s:™.Öiˆjh€ H‡m X…¾ºÓ`æ‹R?ƒŽ)H†~y«.yÙ°ñf‘yùpwÕª¬ªùÀ¦'?ð šø »6¼$ÞíYvê&Ï‘®Wë7õ3ޤ£ŒÑ8q¾ÈÜh”[ÄN ˜ Ì°û±'û²7û³G{Êôa6osÿbèrWw3-óx§oªÕœ¶—‹²Ø…&kdÁ<4}/ÆaÙ‰0¿ø;’·ˆ•üÆ_üø£ÅßpÏxsÁ«rUÒå t*˜€þe‚WS¨€,`FìÒPd±Mûm“@*xSXÐ7 }r³j_öᑉ¢ø\·oeçfž¿âññ?€€n€‡)ÈmþBkquô}üeBe‡ U :“è_Xr‘g™ì]ì<žˆþ¾æu(—¡ê‘õgÿöwÿ÷‡ÿø—ÿù§ö'¡®ßp×ÿ~ýZŸ=÷b"8PO,„z|,4X Â‡ Rœè#ÖÅŒ7jìÈñ£Ç GŠ,Iò¤É”(1¬˜¡Ëˆ gœØð¡Áoßfœð-Ç·gßb%q—è;¤9Ž2Uj4Ç8§M›J­:UéÕ¬Y­rþº•é×®RÃ’[v*+›/#& §;i}(ØÏÙ2x)˜‰ðrŽÈ+)TÂͤè°¬*ìGmÙ±ÎQ,˜ðK‡#Œ[S¦^À-Cœû(а¨w2 ‡3-š²eÊ©Ö\0˜Ö®‰æ–£7r„§iúfÎPøqâzÆÑt~ðåéÔÎGLT6Ñq±ÇŒåpyꃪۊHB}­vízæÓ¯oÿþ[î¢.íïÿ?€ 8 ¸TTQé±Cø9ø „J8!…Zx!†÷Õdr¾y(Qf…ø¡LŠxSsñU—!‹-ºøâ…©_uåUסþBÍ@ 3¸3ÃNz¸·•XfY–‘G*YäYJ6ù¤“žmGP[D-¶XˆýÜ`ŠD@ÀÊ8`Žs.h±4Ñ 1è7Ì¡€1‘H¦ÒSÁ0¼EäP[Ú,8ÐÈ€ð0Ú|hP î-$)u7Íä ÀcÊ+» áL›(âh¬0”Dz¤úhoèÐ(«‰Þi¥p§‡¬IääÀZЈ¸¶+ ¡:M*ÖÔë¯-‰Ú^£Çª¥–J%±IURÙj»-·Ýzû-¸á†;UlU»Ò¹é¢»®ºí²ûnº²Îø¬‰¬þy¢‰÷ÆZSo6š /Àî 0þÁ*M«ëÁ7–¦ë‡@òÔã:wÚiXE eV§yeVåñ‘d12Æ]‘|1ÊÇMtBÐÇP8õ#E—9°Â˜^@£Í1U¦^~Š‘×OH# Ò•´ž±zŒq†,¿…ª],…Š‘Ø£Ý \¯¥êNL"ÔâÇmCT`Š ¦¤S×¾‡}=ܱÇÅ _¸Áµjú‚Ý&lÁÀ&e|,g­7i ?œ[t—jzF={§È2ãß­¬‹{u è¡‹>ºSrÍ#ê©«¾:ŒQÃäúÝRã€7gøàÄ ý4Á‚)ô’ç{ß#â«°|¬üêœcM|Â…÷¶þÓ7<þÔ7BvÜßÉ—¬}”îd/Õ÷Û'uTø)U¾øg4‘¦šj0 y“Œ¿|Éß~¬@ 3ÑPPÅZB˜@!Ë!« ß/†–£1#öˆ‡ßª¤*\¥ÌXA³E޽Q¬ƒ™R´Š%$ê@®0P4R N-£R`‚ ¦ÑAŠ o âuZó8 Ær+@ ihS%Æ="xË•œ¥8=øˆA UA@h¥S½‡22á~øÄPpX¥ ÂÑ„p„ ¹˜°ÀŸq fÛã(Ç9ŽÏ)± B¦Ç‚ñq~ìãG蕬ØáÄÓLD‚rüþ",0†Ö—¯&‡’ sÉ3 HM ,WÍûä¼§èI(@ ~Η>óìbã@ßùX9XnO?«,Ùåò·öTQ„ñ7±=|©)aÚ_ÿšš¨ýM RJ ‘‚Ø )aÊA$Œ¡nL!Ëgî¨Ð*qà t@Ž _˜ß6ã–°éðe9È&BуWÌ`uÐÉ3^ °ôgˆ:Ñß¾cžºÕ o_@§Ä@Žˆ’cð\ÙC8^©D–:D%QX4q i¦¤4çòœ‡!¨DKº<6 )-j*‚ˆàƒ+f(5ˆAJ2öeÄãþ'£;*RA‡?œ ªAÈ{*T£Š¡à ‘"†úÑ€…`DÀ‰E3š°/}Mx›cžTÓªÖúœ•s4Z^LœGRB HßСÇÈG>¯;Åôê×ÀrEH!ì_IÖÁ½*–bK=,_=æWð¶²’YdÿŠÙÓ<ö–f±¢¼ ­ J€ÊèÆ9 ` M¬Ö«U4ˆÐÄÃQIH´!Á÷Ì„@1ÁdÍq@à ¤-ÂŒEš7Ä‚‡”W 7¸AÔuÃNÑ(¶Kƒsú ‚NU@BÇÏ+=œcÌÃvÂÖTªnë#kKåéZ÷ºþnØi"'Z+Ù„ñCåôË_êZ7»ÛÕŽnG»RŦ¢RHÞ,†þR×Á¶½‰w$¥‡p4à%åi  *”âf7ˆc,ã8~E.-áä&sŒãl ’dÌmÍZ¯„#GœÏÈdŒÈÈðF? €+) £1(B, ox’Í¡¤/Éã1ë¸Ìϲ‘äJüú€®Ó›Á3xÙAU.E²OQìȰ§ÙëÙòzUyežëŒ•ËÖùz…îsøòÊç¼&ZÏŠVãemyçW2ºcw–%.w‘M€ó‰GrŽa ‚Ô¯Õ„0T= ™Z e8˜ãþÓ1ý¢',ÕSBÌy›rb0ÓˆÅP]ì^W@8hËŠ¨2IÙ­ Ú¸B*d±Œg(ãÇHÅpâ~£ЖQˆÁS7 ÒØ_Я²Üag·ÉC^Ó¡@P5žàMãÝHˆ7³üìi¥ûª®Éáï|Ðïë*»áOÜu†u,5µ¡DMxƒÆ åU8À iB3¢° (ŒÁZHÒ‘Ÿ£ñŽî(G?üÊSx#MèTL1 xKÑ€1âM$µèýá ²Ö²Ö¥3Ýx ù2ìÊ2d  °ˆA?Ú€‘‹ü¢o‘H  =üBzHA?š!‚°WÀ1þF | Ï£Êk:ÞY×7·2ÍUˆ›M‰ú^6*3ô3âñœ”Ë.~¯Üó³÷ Xy/±SüT(ÏøÊƒï(•?|¤»yÆÓNú1Ý%^ÅšT¿`e¼¿è̸*„B|2@Xá&­= áâŽIzŠÆàë(†*65@ž SÀ w°¾õ‰qýNtb žTwm¸Cß„W¨F?Bޏ"€†¾„TÔ"÷™‘xQu+ƒ Þ (Åõ`ö]Ÿöy¿DéuðÒþ©Æÿ `j÷uß÷¥þ‘­¬Ê®@`_VŸõ©ÂxŸ|þ±‰nLj5@zÐ>Ì=LC2”28ƒ/i‚2ð€70À+Ü@ D ˜äÀ1P^¼Àƒ;¨—l4\,A<ÀÃ8ôƒ4T˜̘ÖÑV8߆–YîQiìŠU™¡„ø@9¬Â/‘°ÑZ¼ œ2Äl „@<Ã4 „Ã+lUUÒ%Y„.âöX¿LKšÙÝÂàW ¨7±Ï„!оM\¬r¬c<¾£;J$(Ð#%éb\0ä¾yD¶£ÄÙxØÃ ØÃ1 š0Ä— Y[¡•Z>&…$ßñ]\ýX¢O˜RõÀžižèybâu @Úa}æ1Þåå™gbžRtæhfŒjz^è¡&ãñÙk‚¢é}›ÙPQƒ(„TA(D £6Ä8¯-A´A«Äî Š9*„pFƒk=Òqjkƒ2 † à J¥h:‚¬"¬äD¶#=j´œà|Àŵй}¤‚äÀû ˜t:Ô‚mÉKC¸°$QC¡''yTÉÄ%AG ˜µ!hE²k´Š£. ‡Må£áh+zº#´â«Ia¨B¥ ¿¼h,¸€Aþͤ®è@¬‚7høŽW$ˆplƒ(ƒ1p îœþ«¿("×pyÒ#VfŸÖÈ D%FÄÅP  W´ædU"ñ*)q' ”01Ux’ÔQg .R@ÝjÌSCzZAL BO(ÈÁ­ž†ëD[BäPu€AÏ€Œqã*ÿ!+©¦$:zßAl+z†è¶þ1æ´EM½Ù¸Cšå u‰²]€…,‚HŠ 9ÆkCÞ B¬£ÿ±6Ȉoœà`ëßíq7Š&'/|[¼b« Û&“òë©yhGÁÑEÅÉH$R0(ƒxƒPÊ©Ü4AB”ÃêIþ(xŽQ°Q8¬Â(+,Á>„C<ÔÃ7Hƒ4#C:ä@4i<°Àç¨ì€˜…zÖž3TaMÔ¹%"&Ùl8‡b‚gçN-f–2ç ócn‰L&×Bâ]&¿Ù]qY¼íA‹ +Ý¢ÏíX<Ç04”¥Àk±ò´€h‚+ C8Ã>œ†FŸ†®¬É°L' Ûip´GSƒ&ˆ´‰ -`§nò Ðã‘͈Àk}QGïÍD ü¼1Û ½%!/ÔÖ;„ûÄ\ø@qX2Në4}Ð!wø­ ©ÊúLp¢äôvÑGš¼î Ƶò„µU#OËþto>JEЇXÑzÍÄÝ(ÙÞmR¤ì'p·<É­È—Ú°a?0»àp³³½læè %%DSçRÜÌð‰!öaë$zŸ´ŸÞ„ìDOôw4‰éÉRC§¶'1‘Hô‘Ü1NèjØ0ˆ/BØHS åjC?ôCvØD8Îß¶HË oóM´9Ë€F@ïˆhôNmDs‡ºò!§çG²'œ)¨8Žˆ×hä¡tY©tbhD»E’µªÔ:K„s|¼¦ŠtX˜¿ˆrysÄïœ*xx6c–jY¬“´vD‹³8É%¬Ë곂·HYk-“ÈZ<6EOí”Ø!á³Âþ,xÞµU?ÿ3e&‹uÌ@ FLAW±kŸ¸j«6Š3th­GhJß„&ëAò@Põ¶˜ôv1°âòMÛx=4M˜î{w[Ö® Ð‡‹+`éZ#®u¬¨Àƒ­óôK=É·•h$y6´ÈnxÓôÝt÷ ½š´ÍµaøŽ5Oƒ9­¼5\m¶džŽ^¯86kɾE)µ`6 g6º|¹Ì2öxWx¾™‰öwe×i:¤£šq6@ïðœg†N<̛řA§8žº§‡ú“88ï"ý’u¬W‚H›ñ¾† ºÎË‘q2hØAHëoKŽ&¯·{çwz£êÂ8kþÀ>Q=ôÃݤ°¼ƒ³½F(æpÚ„UòÌ‚xä€ß[¨[q`.FEÝ£H„le*Kcc°Ý×U%™¹§;º¯;®¤;pÞ—e;ºy´;»Ÿ;½Ó;};¦†ïû„ÄòG…òƒSxš•¿W{À§›ó{Ó­õÞyø?‡{CäÈN”ÒN ª€:Æ‹ºÆgüUœûÞy(G¢‰%lfØ8o Êî1™+zaàDÉ'okÇIÿfzõbãËA„¹y^¢zºò¶º3X³É©wCùùM’ðÊë|ž!sˆRˆ1Ⱥ1<‰¼¹jÇxZG\ÖÈ«1ýØ;´ØïR°‚5%…Ù§½U®þ½Ú·=Û“}Éd=Ëv¤×½a{í$ü¡ÏË¡/ºÞ‡™e ºàD"æ0ˆ[:Þû€Ãô&‰&v:Ço¼äGþ‰Sš I!s1ÿûgùKxGËòsµË—Fè.%Ý=é¥è'ܳÇäEø+ˆ´·Õ'„£wy†¼ÚØÞ«Å¸³ /‰Í‚8=‡ ‘ê囲ó>Ýa«ÀëIZocTÄç|HöÓM?]?f¿õS¿¼'¢;ÿz¹³ôC¿Õ*¼ùkˆ$¾÷ßbâ÷>¯¿$ÞÝùGUÕv8ß?<µ7D؉õL¾ÿS>@¸Ë!à@ƒT˜áB‡ õˆð!‘¢=“ˆ•þ„•žŽ±.Š ÒâD“õLy‘e8=-Ž‹xr"I‘!K¢¤Y1£6îXZT9råΜ&CÂL2N„ž¬b¹3ªSm)®$ªRDϧÁD4p,GÑŠgK j6ëF«Ir{)3.Z»4ƒÞíª‘£D¸dg®µ‰4íÔ“J™¾IT1a¶ƒQB>ª—¦J¡k cÖ|Ùd,><ƒþ:ræ­ZE{Všõj×­a¿–›ölÛµqßÖ šmEœ”7öÍ8¯ð˃{¿«•ù鑹¡ï–úôÕgÿ>™ý8óÌÝA~›ñ€îÆKÙØýC÷íá¿—Ÿþ|ûõñß×ïxþ°|Y!‹Âщ¥XÐbëÀ¢þK‰¿¬KA¼@ú/&ïÔš © Ï Æ‡ÿÖ!˜$€02­¤p3œ$±)¸ôP; ©ªÆå@„1ăë‘& ÿêª,Ok+¥þ>@ÈÆ0ÓkÄ’HÊ(¥¤²Ê+¯œÒÊ-¹¤RK/» ³Ë/Å$3Ê0üN5ÙlÓÍ7áŒSÎ9é¬ÓÎ;ñ”ó¨æ|ìÓ8Á|ÌðDå]QÍ<MTÑEßÄë»åÔ´L°æ<¾ÉÁÒ¹òët¿O= ÔQE-Õ °C,FT›ˆ¥ÕW}€•f}ÕUWcÕ­«œÊ&î(ÅH#=\°;Ãzþ‹HUm–ZÕ·´¸ŽR’2ÚH¦obÂlï’K©²|XJ„^ýô±'a¬kRgÜ饷êRN2ž¨×Þ{ñÍWß}ùí×߯·£É²³®ºƒ Ná…móÎÀcË%;µæ5RE‰…+xZ†9VØãêŽv'`5-(KËËÔÒHmÙÔ—]Žæ™šé.fùâÇG5|X;§°ÈÄmÕtì( ÇÅвå*Nr½ u¦l³WÜfÇéãv)’è?!Sr‘\Œ%\É?ýŠb ýüÏ¿ƒkw¥ÿr¨ÛîX¹Ûî¼ëæ[ï¿ß;ðÁ /\o¿íáÚ45cÔñÇ!\ÏâþN\šì­%­¸ì‹#fÚÐ%]ô: óYkÓÕŒdP6½ožyIæÙi®öÛm(¹Š€dŠ,ÅÜÊá«ürØq‚“øå±´JäÁŒÞÌ2© š‹9Š x+‰O>yxÁJ×ûñƒ×ò-™œrG{òÙ¯2èfÃRßí§'ß|fÇî±âwrÇÿƒü÷?‚ $€4à ˆ@.`c´¦Ò¬cüØ-ÅÈ3»œÒ¸Æ¹ …0bÓ2ás0˜Â ~lƒ¿ –]H,Õ±äâ9¦45!åw=äá}è†+g±Øñ5$.1hUaâ»r-¸øà‰O|þ[SÄâÄ*>q=a“Ê¢}ŒÿZ’ŸBH7Œ#!uc£AòFÃÙí™ã WG8æ`PÊVPg‘Ñ ’…´Ü欓™ÍŒ¥_ ò¨Ó™Õd¦Ežâ¦xÆšÝìåEÄõ¡qӛ݋I“@a£ßÓÀ.äò´'é9O ÈÄdTá?WЄ-H•»Î±ŠpôCcPåþN!$„#M¨hEí‚Y%rd'Ü@A*ÐÖ'&Üd´2Yº“´Ne5Ü¡)aŠJ™Æ4žŠñPŽø‘D5…§:mŠOôÓ;õ”¨:mÜšzÚ¦¤æIŒ$‰Q ‰Í?r©”TêˆÊò66 5t#qêK¤RÕÑýt)é< ÐÚ£ŸÂµS!xtëÝrŸÈ0’Vµë]éd4©‘­á°Ã+|`r$aˆGúS…R "‰|æ3áhÃhœ0ŽR-’™Áëeóú°A5 <†B 7äÉ×Í€S4éiMS™ Ê.ïb–LØ8<º#¶´µml ⲑ¡D`Š*|C DX†ÐF½Õ§¼y¬OK&IÌ®:ª›e4‰#ˆp(CCzÇ3@rkWI ÁÁ…ohÂÈ€BJš° i z Þ뛫„£ByFhÕŒi¬¢cèG?Ú’a ü\ZXn êõ’Zc\e z#Ñ‚r.;Öñ½íÊÒä\q) O}"‚€<0¢18i°é¼²Ø$"Àã‰ó¦BVùI%Âp¡\&"Hö¸ÍTµVø`áHu¸À~r•§œåa9ßšš•ÞŽÏü&5ÿ¸Íiþþñ~‡Ï'ÁùÏot=à,\MÆšY.t çœ%ý¦hš â}§h/‘í£‰Žhœ#¥ð®="1MÔ Ñç} |Ïýü¤h Þ Šážb„)ˆ1ž#fU÷‰Üš@ψÕ4f‹pìc¯ðF3D`к 1HÂ3Hà=4!t:JBЄ½kÂÎX^qƒ ˆà«@¼â•!a¾]î­_·¶C1‡9jõtuXÆ“²ß߽Ϸï’³ýøÍ¢ $sŒ*Tz‰(™‰ñ“ߦ’À$F#´˜‚®Â™Éè/2¢ø¹Á_"v[ñzI³’ô[dýç/ŒŸ»H$þκ_ýè/i•ɲ»˜ýöGJûM‚øö„@ª%,ÀV¡ÎÀ3H +Iˆ¨Àr@¬‚Ê¡Üá*­ì‚NaâúËLa¼áðBX ª@¢Ô'?žgZŽOÔ-gOI„â&  ˆ€rbÅiÅ“í"’-¶Áž!B`ÈÀUÐáá(ÏÖ&€¤be¬ Ûš D` Âáô ¦AŠÀB ž!ÈàÕàͲtЮ Êg,ÉîÂïgŽ rÏuèm)€ï÷1ÈÝVéºÔ¥öJbâŒ/›H}žoÁq4RC+ªÅ#žR JP¾þ%|ÞL³`,ü¼†cÄö‡ÅJj^T1^„.Pe%®B2ènF@¢Z²Gv"hÅÎO­ï,vnƒö®ž¨!^a\ÁÒ!±L"#d‹ ÀÎÁJòÆþk V!¾+Ôb,¼àâ¾0– 4À ¼A¼q (íèSC“Ü+\/ã.6„/Ã&¬"¸  \ ÅtÍÖp­ ŒžAÈ€n€®ÁŽ!V*Ï8ÌUB@Ph¥ 0oV@,#Ó!& ¦!òì%a¯îÑŸöQocö&¦³^M!ƒ1jhn蓾ÁÆHd’òZ(§þ.ÎhVä©” `"i Å°&E)…%,¤ú"ã‰A”]†„&ƒâ!5ƒø† È"„h6‘hÈòCÔ¦F8(¥AĜڒÝô.y®H¥¢Ž%ò€R`"x-AÔÈ ‚b @ Xá?‚`òÆ  â– ¶Ž!*à* È`âJAe®@‹ÿÖbU3OjÍI¬(baìAuš` ôàÒ s ׸€~aC²)8,V&à)sSâÚ„×2$ÌиÀœÀ§íj5 I³Øå‘E,k-'h v¾¡è‚²<…2ÇdŒßH1@Nháþ=û°‚52¤'ž§)î86n¤¢'޲Ñ’] Fd0@q%âa,Ð&‹¢ß^äÍ\ÈW~ã&mœÀ§+zŽ""t&5´]Ø,NõboDéVl E¢\$2€z##bšÀ šk¢ô¥bŒ!Ar âÁ(Àì¡È®Blíze]:ôÄ`ò%÷öIjþqãÊ¡ ¨àR@Þ#}`ÞጡE€ï ò3¦áèÁRÀ(Ù$ËÂÍ’BŒ%4j"rs 4¯ KÒbNõ`N™„AQÈJ«t58i&5ÂjBAB ú'þ.ÎÓ<9õ”Ô§åbûˆÅ’.b¢À`B` ’áÛ Jöæ8èg^õ7Î$²Æƒø¤$ä’?®n#üÀ f!ò0-rä#º/=³’8ô®‘n]:blîêÎò¬àoYᄆbø¶rh „ÚšÂò SxMC ÓúÁ¢â!‚ "áìõÀ²Q!Î!VÁãFm+ 䃻<%@>‚[?;v*-FKa )ôàŒÁš ¨@òD€H ¾á 2ŠSBc£ ˆS +Ïc3€¤¨m$®í"H ‚!6ê9}`n`>– ñÐ;þYâaC)KF;7çXÓ„uúPef iS¥¶S{($*FUÐç446"í†À\@ÙDR5RÇ>ùI&GbXž£ƒúÒk*†e'îe2p±#L4¶ÃütAm'õ]ŠnMæòß"êþšHÁÎRp T¼ Q9â¶Câ\ø .Ž’µ%‚&Æ$e/^+¾("f-‚¢ |`bÀô`~aT ¾!_wk Π¼ÀâÓþÔöU}¤€ÞÁ¼Ë¤á'b!rÀ4Á  !SÌ.íZ&ÁˆðŬQ5 °Ô#V^ mÊ”ò©ìÑ$>ãDÀ§©g0Ìj/bþ4B ÔWQ¯·QÍ9úI}5pƒ(ò ¤ ¸m’+‹FdZ $€8qhXÆÍ¬Òs¸^´P;¶o'ä‚Ú,BD”¼Á¨ÁC8¬As x bp¨`¿¶áŒs4  Xa ö!âa*€ˆ@¡ ú!Æ!4!âÜíLeTQd"<5åhUóp]³PÎZ/þâ4Ùfê.I?©[mä./YiqБgE¤;5Œ]*++;©†toS˜€aY€?Åf0%(†ÃnÀ4 ¼ oÆÁ à\`âC/q`ì·" œ‡1@‰ËZ°ù3Œ«ªoïao—¾avÁBÁ%Äò*zjHŠWVà¬ÐМ lζíØO°ÏÚYa}µ/€µrd‘±•XMÈ2PTdB^ׇØXTz+fîS{V”uP§¯µ;ÑÈ”-YKi„öLƒ¥S[³óд…T7޳8ʳP™i/ÅiÇs)Šz¸‰?TéC™âq%¨aˆ²ÑŒAªÏ¢AŒ5BýS™k¢(šù,á ›[ÌþlÍb_¶¹±šÔzènBp³©Íê‚(@  a®5Àê`fà’aô…;êœ68öe;r‘Å+°Çßfn+|Á'\:¶b&œ½cÏ«®ëi1':{€hvæ/;¼zGzŧCãeºÄfè°~†R–§Ë…¦Y\ ¨·[ŸÕ¬D†}à§qhe~²¸‰;Éb`ôhÒÇ))ÂŽ!ç4aºYaªcÁ ¦ ,ïÏÉ£‚C ¥™Ã¼Í ’ëY¸)¼/%Ø  bæaV@þ¡U† A­käÇ”5@r*-6ô`¾¡¿g@B¡Îão4þas3H—™"€"`Ó#ÀÎïü6ʦZÄWÉ ·`ÈAÓ9] >&EBUÌžF*$ÓUÓ|>`EŸ½’†#/µlØ#¢|«Ø‰ýØ•ÝØ™=Ù·LDNèá}Ú—ÝÙy X ‹²RÓ¶Y­ɬ$™ziübÞ-uRÙ‡Ÿü¸O²ÂQ{µu¶}Û_'vQÉñÉ "8ô9f­ìUºÞ4a – vÝÎ>™œ&ÀÄ;â#ÞNಳÌ>ëÛƒ`Ü ãÝ@>þãÏZ‰úü™“âåÒ'*bú@Òù–!*`€ aMÎaþ´á,î4(æ`±šàÎ;~ ãåA8|9p‘šû¢áφÞã?~ê•>q‹ãç• ³Bê‰Þã‡~®Þ¥Ý™púƒ¨¥¢/zíë¨íÝéí-ú=ܾzw·ìÞ»ðž­(î tu:¤kzÇcrmìn²Â]q ›Ü;ËÇMжõ?ƒ@ºŸ †H$pï·kLHò½óõýÕ(—W¢ à Á 4áÊU_4A0f ¹¾ÃmUˆ­  €p¿á ^î"Id\÷ÄþèÞ Ž^¬‚ÏÕÚ2Ü¢‰×C«ÍB® dÁ½ðè¶š+þ ¾¡ð3È[ˆóAù“?ì«,þGÞgª„ƒ™Ãý•Ÿù~bÀy€ð¡'– õ4+IÁ’¸ –ƒ¡Æ…"´ÈçF ÈÜ4+¡„Ft—r£LŽ3Ƥ(BOÎ:{òä©’£Ï¡?{%ª'!ДLU¦, •!ÒœAm:¥‰•åÊ­I»zý 6¬Ø±dËš=;V¡ÖšYWf}Ë6.܆rëÒm«QåZ·{ûÎݬæÖ¾ƒ £=Œ8±X™… ³ü ¹._¸+‘ÌøF À w—gãâÎ]ѤG›.ú´êÔ¬W»n ûµìØ´gÛ®û¶nþÑW& -É8=9‚Ñ­Ò€=çÆAФéÜ9hDº½zkJ—z†·M ÀJñàdép½BkÓÊ#ø2¸€Øÿ÷Hþü¸èP†AV!ô›£‡pÄ Æ}h£Ì y„2E ¬@ 4>@À &ܳ^S)¹w CñÅW¸Ô·Ÿ~.ÚçßM3¹×+—Ccn©È¢~ÿà‚Ÿ‹1NfàA ŠÐ€;"(É.ÙbY ‚ìÙŘŒ1Åb“q™—w}¹Ò–réCLe®™æVhÒÕØBf¦é%˜[² æ€qÊ%"\þég €*h¡„jh¢ˆ.ªhþ›V5e—qXFFé¤vÉH™ˆNmª)¦lé4S§œrÚ(£¦–Šê©"`*ª¨–V*‘Y=óÍ gðMßÐ*‚D»ýš[°À+l±Äk,jã’EKb)` M†çh¢€†Ì¤ Á2Æ€WÏ ¦Gâýx‰X‘¬Ì¶›QC•±(öÖ ¾[øçQ påC)9ð¸XisE*±T0ÃS”æÎýwœ,5›c¯'ö üà›ï½÷ú'+C=TQŽ—ѨmrÌú’ü˜ÉÍ2©à8Yêñ²È2çK²¦ï¾äi¥W6”_I%×UzZu¥QŒé©&Ò£ÊhþUXc­Ô£°î¥XØböÓ%ö«jÓt´`j:¦cÍ 7adß}÷˜ÇÍàÚXž½Q­˜iÆY­ "‹x²‰/®xãŒÿ*é\UŽ#Š4ÅJ4KÁŒ6ÐaM7ð˜Ò¸l=Äål™ Ü„4rÈ”žØ¨ …Ï1ƒÂ¯ø»ÞF¿Ed£Æ±°Ò¶ƒ¸:K¸ÃŒŽÃÊ|`úª›Nž‚ÅõÌ»ƒÌoÑR‘˜ãáÄgøöþ 4prT Þ9Ë$Û ¹²Ïü¾·–^i8m3Ö¤=¾M/› à—Ø¢¦2Ð14ASž&µ¼ÈmRLI•OþŠpQ œŸßÒ†Â"0.Wk¡ #Ó@íµêj#¬ao訢Í|)ÔàD …Ëd&W‚{Éã‡Ä#*1‰L¼M¦Vò^å(^‰G6L hn Kà<”ñ dT¬&Ã#Žd<.4À¦#’CÀeF•x„ ð„}ቑµ«_[ÈžFP'‘î¹£vyIIµÄáh¼à¦¡˜#Wðv­¥H/Yþ ó²:Þ1ñãá–¤îMT›z™'ðhG„Ì?{‹ÉÍD‰‘BÊ °ã&ñÅÊGéåfzS›ÒLè&¥ÙN T‹Õ’B7b¦SlKUô×µú+x«¦5Ŧ•þ·õP…Ûüš41X·¾­f|ƒÛ5Ïi–Zm†žÜfg"¸Ìl¦3 Gï¹Ä|âsŸÃzg÷€s ŒÉÒ¨À7–aŠ!˜ÂupÁ Æúuµ£Ôz<ÒvU‹ŒëùžMéHOì+x¾Þ{nB¢áh8ùÓ ô @ä€Ò@ÈAŽyD`+pÃÂ1*@z'Iyçí@ú‘òë›ÃKŠj»l"5©¼“_ÝÂ=M1rRªR­º— 0VÜtéM$È ª5˜…¼ƒ µ'ºXp2k}á ;ˆÃ¼Úp¯zÕ”.ËÚMÀÊ…«Odç¨^5?ÃvНŒí«YÝÎvþªÐ¨ ɤ ÏÂ}Èüì¬>?ëY|"Ïm¾W ©(GßEa A â7B!1þG›&WK¿Ã39ÆãG#V†¶ Vk¸¾cÀR ‰»>Þäd±ˆ E@Åujà Ôp†)ž†Ä !‘öó›‚UG´Úp‰ ãB„Rï2ò*ÙÒ·\ð"$¹L95UIÌRR|çW®r7—ÁT ›;HÉz­%d«ƒWHYh8›][gRròWpºQ±‡¥&:? â°ŠS°-±¥4γœ,±‹ÿŠÛ’xgvÙÕàˆH«•‚vǡ屋•„ yÈ HÂC‚³ÕœHþð?šp:Š@ Mü³%Ú¥º'~”m‹mlôî1¿ûÔ¸Ò…Ô¨¨xñ]ê1 À ÙnIJr’v1¥©(Á’Ia1“Ô.)MJ’| P‹)SÐ^àärâÔÊ)yO]OùÀI¿±J3m“0xÕ©y“n-“ÙêZ2¦OŽmucÛa»šxÖ2ÙF8,j8ÀgH¡ [èË­ýºU¯vu%œj¸)xšítíuuÎþxÚ=®6µs0Õl÷Á¡/H»Ü~üG–. 5k ÂYA]å~M4¹]’F&Š`Š\2.©‡ú‰Q¸þ~÷Ý ã•³¿XÞ0t¥iUéÿrJ^ÿ±šÕ ÊKÄ0)0©xVålþß+Ûô4‡‰òhN¸•ͤu£/¼Á»k²Zq±Íñæ—‹ÏØåRyE n­‡`8c¯ˆE8½À/8ÙªÖÑÍ«)KOþz粬± GO‰X{ë׿zsö°‹]4Zií>}“—K/HÆ>B^Úje9EŠX·6äâžîLúâƒV‰#g4@ą̈OùhiKO¨²ªa[¡¥¸>®dнaú4x¸ŠØÀ9éù<" SG ¡|y4VÂ’˜Á¬vÔ–=j¾¼P›²î!«‹{c+jØþ¦ú6…&T M«8†©UßpÞÞÆ>äðíuý@é°¼¤Þ<Ï#ìl¬c³Zïº÷½þ}Ä‘e;×L,̘»Å#C¯2ù)bnLV|.Ìe“ ¬ežØâå‚H›[†Tñ0RG34ÎUr‰ÆB„6ÌÕ_°Ô2Ôg^6õç\å_Æ4ßQH<çi‚qÓK&·tšwUš×L&X}O炉‘b,‚¯, ·¦ c)p¶£΀ ÞÐ@30 ýåÀÀ«ÐÒP7H·aMgN/˜h%y~u} O¸¢+´r8á~c(†À"CW…zHönþ.*9tm'nZ‘w H)w×B†e~8›Ri Â=Ãf€Ö«Âø?²òhfG‡ ÈV”"xõT£t†¤†jM‡Ú°f r"IGi‚˜èÓ{ÝtVn1Š®òÈWVqå@#¦?¶ç¹‹Ñ÷'Ê'ƒ¾g):àà· EаýÐ9d$`"ð KàNÐè Êà HàÈ ðàÊ9ZÈlSè|¤"‹¯æ`˧#Ë·tr‘WGDÑÖ}dÈŽeØŽ¬¡Rãˆq/K(árÙa3 ·åK}o á9‡[kÁ€ÌUIâ_™²‚PƒF+èpRdy,£þph)øÖ+Ã_+æ*£Hij†Ê+3‚#H¶‘æ5/É4çaVH“`ƒ,9ca2 Í@WM@>Þð ñ $p Eà Ï Ï0 oÀM° G‘t¾&u7ét5YŠ;³r¶(M–18ó´}ZõŽî¨–ii±ò6_’A5¹…Rëñ^µøM‘wñaŠ`Ém=‘ˆ™—jÂfkw•—yßCYŸö*iHƒhKã‘âTŠ£Âg9‘$ýȉ4)Uò=ä¸6£˜V¤È{8ÙJ´b¤Õ•ù­™{´š(.@áжo° M@ þÑß0!€M°y Åà ‘pöpøð¼é&!k'Æ'°é±XC§Nc¾çIÙ‡cÜ—–ã¹–bhq ò.‰Y‘aɘå&ÿx`I:wž1woq£DZU'\%TAM•>I²$‹iL'ô.âq%("­X7€<£åBåÈKx¹žøh6œ)›¡vžÓ‰bMlj\)¢Ziš€… Èø )ÚR CÑ ¿pkYá¿ ýàÞà>‘ÆH¬¨b•G…[)¢aá•Û{8ùC]˜ŽÀ)ä ¥åÉu r›·Y›M VHˆ0¤K®RFÞŠ;w6}1v4þz PÅq8ã¢zU‚"ÈÜ#’ññM©x™if9ž²L¤ Aq'˜ ·™µˆU›Üɘhl² M€¤wÑ"ø|Øéšye‡Ê¨3!›zk1 g ”ÓÀ%ñ é&Œ€ 7@z¦0,° ¿0“X›¶š¯X©#äqXš_‰B*•©ú\w©šø¨…¨q9{Ê F¹qš|ófѤ¡%ê4-“Y²7Q˜r5W¤VH¢úZ¢VC+!þ| ¡ư ûœÝ ¦  Þ° šð a 7à„1Ð"`ÆÐ«€ô©¤ ‹ k“ ¬Õ7ƒ€C–™u߀–Êš¬=«D’²Wú‰Íu"Cf´GKdF¦´EVdB–î ´Q‹´S{´EÆ´3T;µL‹´MdF ƒ”AæµZ+µf;dijÞƒ¶mk¶M P”30ýè¶d+de›´_›fiµy[·y ·j8³±×z]zX™ªL4f‘-©4´«›*—:¸ »3]ÆO¡Z²&ïAš**b¢(™«xE©‘+c“ë– æ#µr+éø ½â³³Ë³Œ“M €þÙÆ»½;U á»Áë» !¼Åû»ê^¾c¼Ë‹Tý¥fJ¼ыT iœ'½Æû‚Ô1×[¼s«º’Q¸úž5«§kµŸCJav³6ç²ß›©þ”' 9…Q§Š[ˆ¾Dš°‘Ű*Xg3èmÒ(µK»L,‰5…æjÇÀ ÌÀ |wÜÀ,áÀlÁ¼\Á¬Ák§ ¡‘ÜÁ#ìÀ–ôT(BÂ)|Á¾¡‘Ê%)ÌÁ"¬vÌ3Vrhú§Â Á4ìTî+—))‹J¹½¤’”AsgHº«Ä‚"¹Ó‰¸ˆj>mCšÔ¨O ©M\º Tš¨;š˜êVðäºð þ…âAÀglÀÅ’¾Á\ñ·o ¸pܶ\+ÇhÛ´8SÇrÜ´-l·yüÆMÛ2xëÇ]k·QK;ÈT ÈaÚ¿üšrGZ¿[ ýZ¯ns«`³¾!v¿,kÅà»˜çÆ­.ù¾¬•ëƒ^Ì¿—Œz@+3ðl‚³RiŒÆ³\ Úá¬0bÇ˽ìË¿A—‚Ò+­ÒìãÒ9ÑÒl¬FÑÒ)mÓ,}Ó'ª¢4Ó9M5t&½ñ°0Ô?ÓK-Ôìƒ;½©P½Ó( UMÕWmÕYÕRV :ÝÔ?}Ô']ÓO¹JöÔaÍÔJýÒ\ÐãÉ,×S3“™\MÔJ…s]ŽézÓÐپ˕Z‰Ê㛊ðÀ‚#E ýÑíÆëy¶ó“¹•­=ž›4”-GÁ¤›êÙŸ Ú¡ž×VAAÙÚsÙOQ-*OÁ›*ž‡Ú§MÛ–þMÙmBÚs!Ú»ÍÛ¢[OD—¶-ÜBñÑxmæ(Á=ÛÃ]Û©½&zX‡ûÖÓ=IÑÛ«ÖIÝÛx¾ÖÊ^,…£ ÑK<ª}ª‡˜ÊТ8L myÀÆDÍÕN-ßðýÔõ=ßñMß÷mßùÍßøíßûýßú-àý à>àÿ}Á\Bl(/J@ ž.r—{o+Ánáî%¯çàá2G[HC.á%@û^¢â+Îâ-îâ^rwfÊž[pjÄ•Ç64®ã$NND¼ÝBÊÉ?>Ýum×cC×$ Ý{Í|† ØO,¾÷K“@¾§2Ù²HÓ…féE­åR‘4‘Ýåþ˜ sZΞëåIQæ<3aÜÁC\îdækÞåiÞƒ_~'lŽ)cîLR!unæqã/û<ÁŸÚÈá-7t%¹OÃ1Éf«zêÉUgq>tB½mé¡í4»äÀ š‡>éºàÍ’}™ä?nÝä‹1tÐ¥®ä yšMîÐâ½XäýC‰Þ½ºzqå…3Q&¶¬s©LNG.¿®-â’Ù%ÇTÚ6ìäêõ²;óKÃŽãöÉ…’& ªŠðFù·° Ȉ~™š«eŸ.Å¢þâé®îå ‘ùélÜnîQŒ‚’¼èq-ä.ë&èE^6S޾¬®bƒÉ&‡ëT¾þɆá‚r9ŽûkØþìì­Øé'š©»é]ñ]ì‘>þ—´×`³—A(þîæ«hpº¡Â§M`A¯èÌìØzï1¿ä§â4ÿ잎ó¯ré=ßòF|îòéJ®óþÔúíÒ-ð\šð«6Þ×]l¥ÝK?ðû‰l°nÅû>©®I)¶®¯é X)ÑÊÍëô a´E|M˜ð6ÉŠÛz©Ù7?ZÉå¾lšøÎmõɸ…Ò¡¦V&öäÊ&yâο¢ìö¿a&¦î‹Ïâm߯žÈ‚ê¦ÌÊŸ“ïTÏÆb)Øþ~,›×ùïVoöÉ7äx½°ì»ÅÞ]ŽÍ×Wþ?ùÀ~ãö‰u Ä#&Qoس߂~ùö߂1ËŸL~÷'±`?Ñ‘é‹ë‰|}j¾ßC>ßÛ=qne:š.oš¬¢èÜ㢞¤yü¢¯ÛÞùô¨îj¶Šò2¦ùUïîÐnúüÐÄÆõ¨ïz‡ºûT§­}3>ôÄØ$œA"ô!B ÁtƼ‘è$D‰M¼ ›àb¡Bg EèФȓ)Q>$IÐ¥+U:l9SæM›-u¾ŒiÓd0Ÿ8Y¾Œå£h¬“${ŽŒ9°š¤Qq¡ÇÅ0˜0ƒªèBÁ¦a³ŠE*4)س:Í> ªT­Î3d\BÑTTÄ/Mþ¿¶š æÃoß¿~},˜°Ý›jÓÕºvoN°oy*NÌó±cÌ;5u»ôògÌ •‚¾K'L…£t“s‡UÖPB]ýºõÏk'ÑtÓgÝÓWÊPÊgª;c⊿ùÆM$­Ô'.úib˜7–Њ ÂQ ˜ §¶Zº€‡í˜ö, \ê·þ`H"‰Üñ!i†‘  'ÚiÚhH‹gôÐä†gT`: šDÐ iˆà*±x…&^qé±b}¤àÕWA fð‚Ü`=XAV”m,ì[Ÿ;b!ƒbøÀÍxÆ0–@¡‡¸z@‡4‚‘Ž'À¤ðÁ/Xp·! c |…~á„XHðƒêcâú:øA(FQŠS¤b­xÅ(^ð‰Xäb½hÁ/†QŒcc­¸E2¦QŠhtâ«ÈF5º1ŽdlâÏhÇ ²Â$ÜaÔv¬ã”gyk™›7VQЇøài«ðF:"³½'±Ìa˜C‰$‰°ýnf ÓJ’À ód+þ!x‡øŒo CyЄHŒ‘‡X( Ñ„ ¼äƒˆ(•óÑD9†°¸$Ž#Â4Ï8Š)bS™ÉL&(‘¹Lò€šÌœæ2“0Ž …NŸ%LÐA= ÂDÐ Žqï% ¸‹1¤ ‡wÈÁé¨å7*‰(«ChŠ1ýiLg²B -f5©yPƒ&¡ UhCúP‡Ft¡âq&D*M‹JT£¥&E‹YQ~T¤åÉhLzR”¦T¥+eiK]Jó`ô™ ­¨G7zSŽâT™6e&O—éÓ‰ 4§CU(PuŠPe&U˜J5éR*žò”'¤$%éQ:S«.ôšŸþ2Þ †G1ëô3цÂ1 ùãÒƒX€ŒÆ  šìëöŪm…¯|¼ÃäC’ƒÅ¥Ó Ôˆ„”!¢cƒ$¯ÔÃ0<$Çú€ Éà3Té^-íH€WPÓ¸ÓÁXœF[ÚÓ6( m`I›ZÖ‚¶q}],h»G£=¡!2pÆ;à.HÀÎQ,ÞÁˆXhAÁ؆1œ1\W<#.XÜRÚÏn (ª-­^KZÏ‚—µ([le[ôžW½§/lÍkZñ®7Hñíîwá[ßûÂHà]­|Ó»¸ÕÞ׳ú%°x|š£ÖÀ ö¬wuIJØ6$Âç%þïyIË^ “WÃæp†;¼a‡Ää%ˆlûûß#åÄþeñ[üâÿîWGãu0…kìbÆmÇ0æqŽg^Ô\XÃCr‘ƒ,âsøS%Y±„{\á»VÆQîñlÝA‹õ‘;ækÙº à ÏyéËh$ììê=—éêÌRʤ›¶9Ž\q+±± ž‘¤`F"¨eji¢R—XÉÕ/Š AÁ,‘ÑJ€äè”àè7^òZþê`â\“Ò>0átDB¯HEVç÷`hHŒ˜EZZÒƒ¿i\;¹Ö8š1Zμ£ÑD:8fÞõ‘(½)HK¸ÄÉ®4þi6Ý8f;9ÚÐ6ɳ­ëjGº¬'9ÊNÔ$:Æ5:Û=Ò†ŽÊ-‚s§ÛÜëF7»ÕÝnx¿[ÞŽ³£Ÿôè¢d¥Ùhþ5¿ýý™Z'Nà'8ÁéÝ”²"VjrL±wl»jš |$žÅ†ò°ÅL épþ‹gl¼ãÿ‹ë\Õüo”‹+åT:Ub–¾+ŸÆÅpA4ÞgXåVxÂ’ñJÈöÍ.Hå7¢QŒa¼ ·J-E€Žž/g‰„Ô\DÃ’L`ÜKg¤†¼K”TËÀ,ñL§4<¾Ì˃TKþ’Ð4k”7¼m´ËžH4IÌ•SÌ4+wÉGت߫ÉoÓHÒÂŒ4ÃÁüI­4ÌÛ\Nñ„ŒÍˆEHì:âûξB¶z ˲Œ ÄÌ–¨FKô.@ÌͬƒC’t³˜´A£OKšIõ$Ï·ŒEÞÌLLÐ|´NòI̾|Ðs,’mN µÉÂLűÔzl—£ O›ùʯ6,žÐÝ\H­PÝÌþ|NÖlŠ5tSX†!˜þQ]†ÅÑÍÑÕQ ¥ÑQ%RR$½Q%MR&]R'mÒ˜àG%цŒñ,ÍR-ÝR.íR/ýR0 S1S2-S3=S4MS5]S6mS35,5ˆÓóÐRpS<ÍS=ÝS>íS?ýS@íÒ“¢Ó9ÅR9ÝÒ; T0MÑpáGE¹ŽìÀFXÔ–ñ¬Tá‹B}•`ˆÀ÷hÒ!uÒ"ýÔ$µÑ'%ÕeðÔREUUMÕ- Ú’:J4!˜à“RT[½U\ÍU]ÝÕ65©:€: Ö9ýUHT^=VdMVe]V6­UaÖaV;MÖ¼DϘˆHLƒl3SÎþýÖVÙ˰‹K ÑU=×EWueÕumWÒØ·¬Ð´à€ò`V|ÍW}Ý×]%,õW€uðW,5ÖÔƒ-Ô„åW†mX‡}ØZØ9•ØiýW„EØ…ÍÓrC˦¸´á©8ãaPHµTñÄÔõ”EX¹&‘`W˜uW™YšUÕ!øJ= {U؇ýY  Z†&‹=X£­Õ‚%Ô,uÖ‰•V¡}Z¨Z6ýU¦5Zb-VC%Öª­Z<ʼn¨‚)I‘Ó{½DY¥žÜŽài Wèµ-&V‰¿‰÷åaE^d}MdF~dHæUGÆUœ˜ba ýÕ ~¼Æo´¸¦¿Z`wHåR>eIIeòPeñ]eWneXfeY~åYŽeZ¾e[ÎåZÞe\æe]våÕ¬ Ù¶½[*Lt³¿•Q ¦c9¾à9ÎÒuæhî`-íã$ÝcþfÞ(Å&¡ -‚˜äHgrîSq.gtNç5=gE%]•¨”5Iݲ‚W!ɲHåŽxÎP.eR6eFe€þgh‚hƒ.h„>h….e“ÈIÊKDý=äÙÔ)Æc­cSàcÅèhîhŒFÞŽVÞeP‚!i&é“¶ãåEi‘fé•V鑆i—Žé%uÕû ÇŒØižîiŸþi j¡j¢.j£>j¤Nj¥^j¦nj§~j¨Žj©žjª®j«¾j¬Îj­Þj®îjŸ®ßû-ˆp$5|b-‰µ¥ÈbTÖ˜…~넎k¸žk¹®kºöç†nijhã++‘²rã­à îàþi–ãf~fÄîh iPµÑ=Þ`Â.i Îc%…ì}ìÉRx5Q­# vNÓÏFÓÐ>ÓÑ&ms>m>-m3Um2eí1um1…í0•m0¥íÚFí=µm/ÕíÝÆíÜöíEÅ&îÆƒ yŽç¸­•*&ÑžÈbSn»Žî»–nêžnë¶k8#ˆ°ˆ³‰ˆf…1dJf&UŒ†éj¾èÄvf.]^no“Öcö¾ìø®àøvoúÆã÷¾oÊNR4nÈÈiÞæÒGTàÎÓ¯ØßNm?=pVpOpp/p7eð—ð ð0…Õô âîFÈdMg`ä3n}f`胾ƒXþñë~ñêŽqŸñ‚Ί`™Xq‡ØTðoåÓ ~ä`h¶häµàôNìŒÎèlŽìý¦lÌÆïÊvì&·h'Çf”–0@´ ÚšU oS o\ Ïp ¯ðïr6ýr47ó3Ws5Ms6í2ó/Uâ‘°d…±-˜ç®qàì\î°Êç}v‡HÛÝuë  qE—qF_t…v‰áVˆå)k—ÝÅ®4^>6róFï8öh@ïåÍÒl®lö.éù^òMwìS'õMoY;ŠjÔé7íY§u9'ó[Çõ1÷òZ_í^÷õ\_ó`ö]çõa×ÒU´d¬L]"Ù* àdä ¶VžñPà~þÞ˜&øGotnßvo'¬˜bnLóëñBžNN•r-U÷ VïŒÞRS omfr ¾l)ßQ&¿ã|ol*ïfy ñ)vób_ç8ø6ÿõ2x=Ux1_ø‚wøc‡s„í‡ox0]<’XMˆ,ëyŽU“ØÉlen“pn˜‚î6ùhB„& gp‡ˆo@†w0&È‚a H€†oßùnïyÎn뫌h÷ÙÅó»_'wSOr¦7Õ$Ç`•rmžò{/Õ©—lt…o;N¸j¬_ŸøØû°x[7øƒ'{ÓF{`7{‰gû´wû·‡xµOx2ýA=`â…‰RÕ=‰,‡öîè^yÂÏ—”p¨€Ý‚3"˜†b0|dx˜†dàyÌ÷yÍ?!Áû,wœô ‚€`fá ÖæSMýS]^Ö×Q‹®÷ÀžwÙÿà«Ïl˜µ÷e˜g)U Ò·^±¿í¹§ûà§øá'~¸þãoíßþä7~¹oþ±/þÙ&ÓélˆqX£ýO×Î{ž)ð.JÔçI1ùc2|±ÍVh‚ Èe +Ír@A?ô‡Ø|üÏ|ow°œ• ïŠh€ÈáCÄÀ‚õkàŽ ˆe¦†˜rQb‡MÕÁøp#Dˆf¤(1"É‘IjøxòdÊ•%Mµ$9¤¢—+þ‡ÄÒ+ÉBz|ÕÉ“`,Ž"Mªt)Ó£F›BêT*U¦O«bšëÕ­R»z… 6lÓ±d•š=‹4­ZlÕ¾=WnÛ²u­Þ]:—ì^¯}ýæE‹õ`ÐXYƒú:ðÛŒoÔÌp×x†mBs$ÉáN3‰Íž9ÞLÂEŽtáý¶‚êãϯ?ÿþþÿ €ðYÆ^N¬ä ‚ *€6 §“Œ9Àþ79P(ab˜%èZl¡óál£å L8±äÀ ȬVfÅD!œŒÃÍX#7Ú˜ãm@¹Ó@?éc>6@èEwÐzGþ yOB¥”SjwB„)gO>i3 —_‚)Õ}a’Y¦™g¢™¦šk6…%"è§œsêQär>ef…]H!rÌ“™g$4A¨¡…"øÙ*¥¸ÃJ°K ï¬&Å8N …Ž›âØ)§Ÿzz›zzd¥†Ñ)—œ>PÙª«¯FIAÕ%9rGÂi›»òÖ˜½¬°Ã[l~J˜z±øÀ¬³Íâ ÀŸóÓžb8ƒÊ턈®;þÎmd¬²;K³J?®ˆ « S¨ó†J¯½õz†žO)2¸ ‚9)ÐI&äŽNNš°Â /iy uÜOPÈQ_p1Å€1Rw¼±Æp rÈ$\²È'sÌrÊ/» 3È3¯3Í(ÇlóÊ7·Ì3Ì‚Ôì³Î8­2Î& -tÑ2½³ÓG7 µÔF÷ü4Õ0/uÖJ'mõÇ^kÝõÔ_6Ø\Ÿ öÖj‹}5Óe#¶Ôe©GÊѧ ðp·:‰pmd“E—™ :Š«ˆMT8¾÷Bþ¸ä:ŽŠdÞpÂY$“£JguÈ-ºèSá“{uÓ­yþ`€ÅpûQ²ÃŽí·Ïž{íºã¾{ï¾ó<ðÂ÷þ{ñÄë>üñÃ+<c¶¼üòÍSO{õÎG½ó×sÏýôÒo>õÞ‡¯ýøâo~úä3¾ðì¯ïþîð¿/¿õöe „Ö­­³?5Ç2@ÉLœ|0™3`‹B1ÜähÓ„o40rŒ g£/=,¤Iþó´šÃ“iÕÊTÍ Çs@ÚA¡ £‹½U‡[€H0bÈ,Ö¹N}ÉÃßüx˜=úõP‡íâýˆ¸C!BÏvF "ÈÃ&ŠK,¢¥èÄ%ZQ‰Uô¡ŸÈÅ)FÑ‹`ãÙ‡º8]Ð't2´þ’¥˜À5†OÙúFá8$Áˆ ‚zœ DJBs‚ÓOФºSIçs#ÄβÓHF:2’œ$YII^’’–Ü$&9™qä`; ì$&³S:œ9;¤pø:ùe‘Œ]ÄâciKù%Q–º¼åy¹Å^Ö2˜Àæ/‹)FcÒ’˜Ç”߃l%¡üÑVÐbHs äœä!Ž‘Ì7žáFoMÐq}çËœ8ÅÂ…V³„b$‰uNKÓJhÏð¸ÛÉ>ÇcÉ&†Yª• ‰àÊd"ˆ¾\&Bʽ\.´¡U¨0 ËŠ:ô¢Êœ¨F-*ĈRt£ì{XPzþ1t3¤ŽÀ|€mö©1Y2œjjÓ›â4§:‡N{êÓŸ5¨B*Q‹jÔŸÞí@¨’ašÓÆÓJ‘Zä=G‡ êÚå Ýh p<§Ä"©‰ž‰µî•Å(G×*ÒŽfÔyekH=Ê>µ­w¥k^ë×½¾Õ­v^Í'ÀdéI~³¦ƒ–³“…äD ŒAààºùÍÁ5Õ,g3ëÙÎvÖ³žÍ74ûÙÍ¢´§U-kWëÚÖÂöµ²-mgkÛÚvön>q˜’ %!͹:Òqã<ëYUÑq5AýÄ?·“O$ˆ;X…?µŠƒ%™t¸}¡AÓªþWÂòU°o`©7×ò’w°æ+,`ÕÛ½ð¶w¼ë…ozåû^ôÎw‰ÃHO°„ª"‘”I>™LçØTÌä”6UpM Ô ÕÁ^0…\a#LØÂÆð…3Ìá {8Ä1ˆIüáç@æRÓ3@çðv¿ÔQŽ:h„2;Ñýd޳CÝŒJ¥«+ BÓ©­9ôëwóëÞïá÷¾ì;ï“ËWåóEÊWŽ_“¥l_-ÙÊaÆò–ë·Dö$hŽN «%n²ÛœŒy˜Ó#Óþæy®éžÐg=ó¹¦90­Ÿ]h ÷9ц>4£èG7zÑŽŽ4¤'miþIcºÒ™>tRíæâd„oyB• ºOf2Õ¨^5)5Ùê{§¹Ú‘MŸôÂf—`=(“{Ý×_‹·Ë`6•ÇÌe_Ùñ¶˜™Mfc›¹ÌC”6¡=mù%IP¨AêÔ·Â,'Ï`Œ)¤$Ã9x¨6B8já.ÀÛ]?…@&Žjï{ã;ßú¶)Òéää„:Î n­fzV„Ù8aÔW}ìUX_üò8jÍ,"Ch`‰9k+½«ìú:ûØÀ^öÇ…WìGÛÚÕFùµY¾ò’{Ùåa”9U>s˜›}ÈJó¨Ö\攚ãLà ò ¡ÌpáÏ„^ºNMK‚~þå ¨ºrp ÑbéT×zÖmÊõ¯{=ì[{×Çnö²£ëUOO0t‹XÄ·àëaNŠ}`\K&¼U²ÆÁ8ZÈÜå27Ç9ð{xäI7º½€±èî’Grœ7òÏfùÉ%/òd;ÞÉ6¯9͢ù˜[>åŸeè[^zކ!mGÌ~«Ò (Žª,e$t¤$ý¦Z'tMÃÑ¡‘@÷8ÍÁšnüœò>÷ʧºð‘|œ&ŸùËÇzó¡/vóUYŒk…¥Ì@Gy_Å Pº¦ŸçÐLàkfmžø ËŸô—3^Õ‘rŒÛ PLÑÑ›a–N©€PiVgÌÆfHN]ÂÈuß%È6@ƒÔÔ`U½åÔæ òàú Né ö þàM¡ú”@À‰ÆS{¼STÑЕPÕøQá”´“¢ - ã©ÕzaB æÞý_‚Þr^¦!zžæŸîö’Ž‘*¥ÙüÍßø ­,†6ÑžpÍî¡ ¤›¡iñžïJ¡tF8TÜMA@ Z&pÃ$Á%X&^7x¢M!(!¡(–bM…"*Ž¢)a+’""rCþŠéD¸i\át2‡Ãˆß©µšªõ"«¹Z0VáÅ}bý‰b´ÅÀ2rÌ2@32ãQ8ã3Jc4€3B#5^#6V£6rã6zã7Š£5Ž#9šc8¢#:fã:v£:v#;‚£;‚c6ŽÉ4Âc9f£<âc;Þã9æc?êã>Îã;ò#AäAÚ£A dB"¤?dC¤CBä?*¤D2äBžcD¤FV¤EzäGn$@†dGŽäDdT9Œ s¸õ[,|¹ÝFL7èàÓå‹kßM i Ú%”ñí@&@C ÐBèCà”'†¢S6%NFåSJåMA¥UVå‚eþeƒm%†uåUj%U¦"NILbÕâÈÊ"\F Þ×’¤QÝt —è…`$ÅX€Å^âe^ö¥V¬Å]úå`æ_º…aê%bæa&`:æcòeRüJaR&d fe2&ff¦e6&gbfbvfd†¦b’æg^¦g>æfª¦hšæh–&jÂ&kÆæbʦl®ækÎfgÞ¦kò&lîfk¢¤’´rI©™”àpeÜJ €"ƒé !ª"*¦›ïÑFOê` @€Må@& %üÀ'ü€%f ÞÕÁâ+¢'+¦gtº¢zº'{®'"®"|B§Èb:•ݰäsxßÏ)Öth€ è€þhèaUÅA@ß 5èƒN„6( Th…:hª°˜þäÄæø€hˆŠèˆ’h‰šè‰¢hŠªèŠ²h‹ºè‹ÂhŒ†¨ ÈhÚèâhŽêèŽòhúèi é)0K­°X¶KZÓ²èÁRVrf[f`Öº•NÖF Ú”<e,%PæTÌ4üTWbX*šiš¢éš&›6¥›ZåXþY,TÉ]Jy(©E C(hƒNuêŸ j ê j¡"êŸ&(ƒž_ÅIè‚.è£>*¤B*„Fav¡ÎéÄiþfkzê§vjnjfmÒ&n‚&¨ž*lN¦¨¦&þ©ê¦«Žª©r*¬¢j©ö¦j†ªmÒ*®îjªæê¬â毾ª¬k¬Þª¯îª°k­~[ç˜@ §Ø @±Ôr\‹öOàž*ؤA§|úÙ¡ˆ+Öu@ 7§%BÃ'(7t"Ú ¡}ë¢Ý”•2Z½ê”½êk¾òkNí«¿úTžÕ(VÁ „SÑ¢ŒŽ8h¥:¬¤>lÄBìÄJìÃ>¨£2hÅRìÆB€‹ùaϹÇë°ëÈ‚ª²¶j±2ë²²jË®*ÊòªÊ¶,²k¯š¬oÚ¬ÌÒì­ÂìΞlΖ,É®ìÐÆlÐmÊíÌÅÎ1DŒ!’;eÛvÅÉÐU–7 þÐ8ؤ¾)¢ôÁPB€¸CñuÀ'€4dÂ%0(1ƒyök{Âç{‚«ÛÆm|ŽeÝΧ&_U`jNK‘ ©ÓÞhìàrlá®Äž_£®áJ¨YA bhj—ÈlÏÞl¨R®ÎV®®N,ЭÏâìæŠnÒ^nÒ‚®åz®ÒbîêšnæÚ*Ñ–îçºî` EëÛÝÑÙ鵘­Ð”fÍ«hñÞX"_·îñ ¯ÜÚí)Î-Ü.¯òÎ'Õa ÕnA´™,* ”²,n÷2®÷ZlÅ)î÷.5¹‡ÆÐ@œ ÅpÀTÌû¯Ç…ÈÌ/ÊÔoÆÔ¯ý† þîïaÒ¯ËþܯÿêïÿÊïúÆï#p+ð3p/0Ð0ðO0ÿJ°_°c0W°{pþnð÷/‹p“p£ð° ›ð ·°wp ÃpË0Ó0 Ûp ǰ ïð ëð Gpçp ñ ±Ó0Åp’ âá-G59YÁ¤LÆ”ÑÝŠ;´Áó5ØS>gj½©ôE_Pám™¾m7¯?/ÝF/òöÔôÚiTyÛ–ô笌€/ùÞ±÷6*®<¡YÝœN—¼NÇ´ooòoÆrí"¦ì,²"×N"'2$3ò#Kr#çÎ#·lìªnÒNæ%[2&O2(G²(c2%£2þ);r)‡r++W2+¿²,Çr-g2-§ò)«r.kò.ï2/ãò(›2,£20Û²0ó/ûò0Ïò13ó*;31ó4O³2?³1C«Aì­ßDqã³)>§‚â}JLõîgŒyßæÄBŸæñÄ…Ä&ÅÃ6ô¤J¨‚ÆR@4TêCs¬p1‰ ©’ ‘Ê B!ƒê4윴IGÏI£ôJ»´í°´JÃôKÏNL³t²¦.'ÃìªÊtMÓtK'EOµOÏtP§ôQÿôP+µP õR#uQCµS'þ5S?5QG5UOuUKµQÿ4VsõUkõV[µR‹uY—µWƒuWÛ´Zg5[GõY‡5Zo5I5m*G›Y“Béœ1Æ7eÔý˜rõK`C  va?]a+öÄ)6a+ˆc6ƒ@6cK6`[ö`_ö‚Lv¿ì·…PÀ@aÄ î9…¤š6FWjjŸöáB@C7ì„"„¢Pko¬•T G ˜6¸oR Œ‚Ȧ\Ë5\·uZ¿µJ3ÈQ7$7s'Èm6ÈS<·Q4ˆ[TwdN÷ÍYu Âsµp¯µq5q·V7x÷wǵy¯·[7z—·{“5|¿7{§7y‹·YÓ÷|þÛw|çwSï7€÷7Q§ ©%âU†·e3­ì ïRHµà‰-ö„Sx…'v…cx†kø†sx‡vý%–üÙõnó%YBŸiSìQ¤øEGìk@‹olD_4lC(S¬Ç4ä&é çŽf0÷8 À€E€‡·zß÷~·43¹;9s;ùa2ùvG7Àfpú¹•o†sC9•g·f€˜'Șyƒù߇wyËà7Ë·€Çù‘¿ù›ËùÓ¹’·ùW#¹÷y}Ϲ›ï9ž'ù€ÿ¹~úº¢“÷.G‰+)ËezèÕ&§_ÿÞ‚l†‚lºlxºbF¦oúg$öþ¨ÿ^§3ªsz¦z§»úª³ú«Ç:¬·:­Ëú§Ãº©÷K¾NÂÖbnTÕP’*4ù²6F@ƒ.ÅjÛ¶Ã6»²ÇƒÃÂø‹#{²;;Foì84Œpîá•T†×(]9À(7®ºùü$Oº«û¹³ûR´{P+Ź£{—#E—'NP7Àh0ù8\=E—s½kE—Óû–{Â_yÂwùs7ü¦Ÿö}ü»kQÅ[<ºc¼¼Süº»{¼{<¼üÅo<ǃüÅg|È«ûÉ—|ÊüÈ«¼ÈwüÊ¿<Ì˼ƣüÌ“<Í×üÍÛüÎË<λ|Ëß<Ð<>“v!–7P9xcœþ‡xÆm„†ÔG½âØÆoˆÈn¸CÕs½Ö[}ןà×ýÔ‹ýÖ—=×}Øo½ÙkýÚÛÆA\ÏÍÊ-ÎñÇÊøÃ6Rœ«öEßýƒ²¸„âø‚64޾jß8¶þ²ÃÕÊbäâ‘‚{Æ4¹s»¹û¼Îk>ÎýÏ· À+w‚P·“[ù—»¿{c¹t;y–ˆST÷l(·7¹wO9”'Åí?¸o~ÐóüÐ ½çÿ¾ðg>Ë¿É?ò¿ñ?Æw¾ò7Ï÷~ÌOÿòs~ò3õG?ð[¿ôç¼î4aÁ:q´lß5=©œÑÝ09Ɉ òFo°¿9ǩÿnHÈ@þs›ëÒ×%œ,ô´Ĺq€0°àÁ Ï\xð`C „8`B‡"œx1#HŽ#Ç Œ¥'Vw'}èñ!âeËîôèѨ`Î ÜåÃgAŸrê, `gѤF.-èiÓ£Q•J­j•g¢9{íš3Ç8]ZpëÙ±>ÕìúUhÏž9àfµ[Q²‚ì>Åê÷j`ÀL ¦jêáÁ‹3†úx*dÁK6\ù/eËŽ#gÞÌyrâÏŸ1‡îlzriħW§Y5hÔ­c´íÎvL”¶ƒ5[O’.õ|›ñ€o9Œ³2‡pºÓåR·þ^ûuíÙ{6ÙNw›ƒ}Ü¿“7_ýyõé×Ë%Ìåð–/O²t™ÀÌ`¹ûH2N˜@¢h@bè¢,È"Š$„Bç@²P!ŠÆ™ï¿šêC Ä$X‰Åpªê,ºÀÊ‹5Ù‹ FIKª­³Æq秸~bËÆaK«wL GyÜñ'oD’È$‘LGS4+J¾Îr1Æ×\ó 6-/óòE05ãrËÙÂ$óK4Ï4sL6ES³ÍÖÒt³EëÓÎ2åLkc…?ÝX¯ÏúT:I„ãf8C9æfÈÃOá„k/½JÍ#áÛBý··“Ư¶”pÛOŠã’[®9S%}í¼#oš€Å&²†„H I²õ_ÏmX1Z7¨r‰oT¢½¢¥¤u£[D2’“‡4ðn%ÁD¦ò b¤(*Н4>d>3)š²8„4—H.'”sJëz½™Qx0láé\w¹þªî†8¤áyhCÒ…/3 òœ½"¾pˆÓK¢]Ã%"qxBŒ¢ ‰ØD)JoŠJÌb™HÅ'ê΋\Ì–Ú^Ò?®êCþéÔÕœJjûsß›€©é4á¬GxL#ùd)³¹Ê>)É H‘DID"8À%NqÑÛ®2‰ J^(‚ É~‚Ó?Ç! P'AaATØÃÑí„(;eTf)K%¥–Q‰¥.iyK¿ì2—Áô%/—ºҘ><¦2uˆÌñ—½¦/sILk s—פæ6³‰Mi~—ܧ5µ9MsRÅ›¶ñ©Ï~òžùh7úςԟð4 #ß(+%ô¢%5E¡jmÑ)dØöx#b‡ÏèÎ1rÀ Xôc£)%$ØúgF?EŠUHk¤¡â&+IÞÔƒ³ÊÕ5ôÁjè’>-V(B¹Eô¥$NK´!¹@`šù²'6’ï8oŒPTê©õm‡Ëq \@—xc¥½Mî¨öãƒ4w„ÔƒoôÛûä@n"¸éO;ÉÝîzr»’ÞzâÀ €¯’èT’™ºf2“u7lï{éKßù¶÷¾òÍ!~ÍeÚ—½úu%€Ìß ø¿N°Œ`f*øÁ ްƒÝ+á S8¾Î<°†Ìá {øÂ ÎðY¨ í=׺V{è²:t’Û: R4ÅšrÛcGîìQj{üÆÀÈ0 /÷Çܹ pR@üth¦¨!C¥ž ·g%È¢É) •½XpËYÖò–¹Üe/Ìþaó˜É\f3ŸÍiβ ÔÜf7¿Îq–óœé\g;ßÏyÖóžùÌÖÖ€²ýMm–Š6ZÔ8UsäŒl)°â;^ëŽH€ (4:Ș¶N€œ{=*?SN¯²ôãî†÷Ô©FõªzŽªµm„Ë ;š`C8Ä$Þ/†m­ë ûºÃÀþ°°à_øR×#>ö¯—ìfûÙ¹Ž¶²qì^OûÚÕ¶0µ-lm^3[Ûßñ®Ç €42Ð0!m‹>äÑ30ßn3}VØX}_«ã*A†zkúÇ/ † •Fê˜ÎGºUÖ†ÜTÝpV?Ü᩸p‚qF•ô©©âþ&v~ËÝqh‡ÛãØw{íísÙÛÎv·U®qiƒ|ã+O¹ËMó‘Ï<ä5¹³a.r„ÿɺ'A#‹×(¾6>-ã¿/éõàÑé—z³ èçÀ´º,‰µ$qˆÝëa§¹€ØŠÖ/‘ùÍoÝò“¯Ø:—»…Kîv›óœå4·ûÎ?ž÷œï}îzüßwÿÜï‡÷¶õ€èqÏ|ÓÃ3ŒSÑ©%ZÆL´£‹«yÏï@>ˆ…KO¥‡U‰HngáKÀÞz±¿þ¦¶ql!×Ô Ä÷¹×ýîsŸVÞÿøÁŸê\#ÛWáùÀ÷}ò™ßü¶.ßùÑ—þ>ô¥_ýäSßúÌ7÷¨ýô>ôÙ+ŽÑqëœ2úóÃ¥T°'°©¿?¥rÓCMU¶¹CPé-¥m¼{ÿ»/Bö†ƒÊî£YbA1ïå<¬šz¾üë%ÐqÎð*0ð0îÏ5Ž£­m.¶Ð-èÖÍP)íòf£®&ýæå·ÔÃýrÐ-e%ʈÈÐFÐP/€rTE»ÈzÅVœ° -ˆ¨˜X ÈWž@PÅidM £Ìp#0 -ìs. ÄŒ­ Ç ÏððÖÐ E0q KpÍØêPO ß°rÚþÐËMë/ÉücЖFü^Ì´p·àoó~—ËCð¯?ÒÆhîOëÑ9­ÕÇn°°V ¢“xêÔrÂ"€%”öfVQ8ŽÊÓ¦ ÿPâvâ`Ò¢, F+p‘Efkă‚xQ^®$‰QuNë‹î`gGrñmyÑ,~±‡,†B‹·ñ÷Žbn1qQ¯Ñ©E™Ä‰±`†1(1[jÑtäñÏñ`n‘mM-¶ñ(î].§Qé1 ²- µÑÙQ¯iq #R ±Ñ )ÒÝ-Ö±å#PPL{ŒÆ7¬'ŒPò€ü`,Rþ4ÊÉcWÒ%ë-Êô`’€&k²&€& èÈT2ê%æF’@QÈ!d(¡PA6â‚2"’ŽÅ{’Š7 &ÐHìâ,ÈâHÂ"£„^¸r+‚^|¢+„d,ÅÒ'Èò,Í’1ÇäÝò`à2.Û’.ßÒâ.çÒ.ù1 a+­R-¡,¿R+¥¤+'û-Ó.s1’·¤å/ÿÒ0 ó0„HÜE1Õr1‰b3û­å*å2)Ó++s4‹1+äòr>³,¯/Bó"“]Ä45•df+\3-íÂ3Ë4ÒZ&³*o³0OS9q“3›³1óÏ‚NþÝÀ©– &ÀèâÍCí%¯ß"<ÉU‚…Ai“8Ènjo*äoì&¨ÌK&X!é,ñCÒNh1JÔI¤AéÂH’¤ATH 4J²’B´Bån'XGrÄ6T,=”'Sµ ƒe &Ž·î>ÜF 0{õ-ØB,°r-†äWUóWïB-õXíTç¢4›•ïÑr…q:‚âZãÂ`æâðfÔ6\"]„•\ÕX“]‘U]‰Ô-à40ÓU+ß%/ð%]®R+ìU]u1—ð¨Y{¢û8³U],’7ë%(:aå%Fñ•]³"`Ó*¥%^8€^bñUYsc×R*ðdá5XdXþË¢X56];¶+ˆPUdJiìÃ7Ð3@ô`Nr¯ ý^òѶãµ;!U=b ^h‹–h—!S‰Ö”'­&ô–0’6(û†Ai÷³’„#-é0iì`¢ì~Ž?ªËªO…”A¡D5×–d×´BçTm7´_W48[“n'bCÇ4tZ”o3roWTG´´(üv½õN‘´O—”mÙv_ÊôIçöO3wnÛ6H”´!—·$—s³´nåvI³E†o²HŠôN9e7ße`ü…!o)*7qåÖm‡„O¯ƒuá¶FwFC7my÷v‡·GRä^#×výô,îm¬îþ ‘yÓ†$ñQæM%~6Z|¶'hh±—Rnh/µR“v^ÁX¡Ð °7hBU:1 eU$<1"T•W4ÄW\uU_uX:èƒ"Ïn$Ýãü5d}•dË•XÍr,°ô] ø[‘„H_·/‡rXÑ..8/êB‚Ý‚`<Ø+>øp;Cb øJKV+Ê_ÜE]M8\c——`8d‡`O˜+Xø-¸W –'x˜YØ8WØX)v#!öuÓ¥]mK)„,–øag¸„ßÕ†SØ\s˜ZvøR‹a¸Ú¸§…ǸX_×…·X-_ëeAdUb+}ijÎk&½—.¾“Ž»þ7T²‹Rv,àLÁ|_aÜâp5&DT¹K#¦CŠpä—>ƒr*ä³=9‚‚å ΋ë%4)ö¥7gXow“"•¸bå•J€±_ôå+|¤•W¶ëµby+aó…u—óÅ– †Ly9_Fx†@Y\S”§#RyM¹'’ÙŠ„SÐb•]Y•3˜8gÓ–ÏR”‰•»™©¥rÅuévšÅy–Ot$”­#”át`fø”[”JÆ_²Õ_–„åõsÑv†[¹™›ã™™sÀ™uœ‹¤sYyJñ9¡r”Û¢µu™K™¢'Zš_£U9nÞ†¡¢Ë¡ú„þ› Ž1oQ¯·Q¿Ã0ÅÂa~š€ôàŽc:;Ü&2À- ‹ÖÍwS“%áŠf&@D‘Eq)M•¨#¨~eµT§pk…Uõw~S“¼`hŠ„ˆã$j ãP ¹š ÿЫq)L Á:™ñ),9­ûpךÜÚZ®ßÚ¬ÇÚ­»:ëZÓZÃÔøìm{†ÃÐléG:•ŽÜg:”kö¨à!d@¦'ÛZ"Êwú¢c\‘„Ôm'’næ3V'Ù´-’'Ùj#ä´ãSpøw=WÌ?PLÿÓh¶ú¬åð®¿z…Äz¯{û™œq®ñÚ®ýð·ÃZþ¹w›õš­y»¸}[¸—û¸é:¹™—m]0Ðð#Z¬8¾á,OQè|è¸ >ÊýRz¤XÁ¤Pв'UlZ³‰–³ýX£‰“¥}ÅË" à’Fâ¿K#à×(ç!DÁ'¨’úk |áÖ7ÖêCU´úº«Û¸ƒ;‡)ß»Ãû«*²éÃÙ»,5ºSÂNÜóÅWœÃ]¼Å;™X<®UÜÀ¸oàÒM&mÐ˨÷R2g=ÏŽå¢go„¸Œ ¹ðøŽ‹&2û¦‰v³ÿ˜ 71@pê" D¨:è ‰êË›rÌBp ÙÌ¢hH²ô´¡C"çö²Oίþ/³æÜÎqøëÎ÷¼÷êœÏÿÜ­°Ð]Ï ÝЋ¯÷ zkÃyùc$]@ Y(oQàíòž«—Î{¹†g½ãÞ* ,zÌÉ!1ÊjzÊušÊ‰–SɈ7‚ú$¼K¼ÊË(ûSÁi%Õ>I$Š*_±ÊXîúŽÆo|ÄñnØIœ™êޝKœº_\ƉýÙ‘ÝÙÝØ›}Æ­Ú©]ر}‡ÖØe‡°O|#Ö`}üÞ­ürƒÓ}ÐÓ¹£gë8r ,-¾u>2`Õ- Ê§Ü³·ó”‰86Wkš,¹:¥C-¥„ª¦?ü%úŒáÞážÍ^â'žâ+Þâ/ã3^ãÛŒDþúÃ#“ MÏiÖ8ÆÇQ¤À¼é {ïÍ<Ú}¥I€ßÈ`Þeú³÷chS³ÿ¸³U"©–å)S%îÿg»n="ªZÊ’ :b"ØOÛžÛ«Ù§>Ù›þÚ©~Ú£~Û±þê1<Ú¥Þ럾¹>ÛµêɾÛ]åÑh¶ª³èÞ-Þš ‹|%wV=š ó~æÓÏ6è{Õyz§-àʱºþd"&û/Ã+ñÓ|蟼 ®¿pÙÃÞìÇžòÑìSGÙ§ó·þò??ë;ÿìA¿ëCŸôË^ô-ßôW¿ôKŒ“ç´%ÒéY$Š¢5»F’S½wÒCÇJ]¾Qâ²Ù3{þÕ[½çµðL¯ñs}ñ›ßƒz]õpÃ&¬Þú¥½õQÿô±_û5ÿú3?û¹_üÁ¿ûßüÇßóY¿ü×ýG_ýÛ_õY¨ô•û~²í„¼ãõ ìþ r¸(p›‚"\¨°!Ç#Bœ(±"Å‹îDøÐ“ÁÂ+S¯^y)òUŽ$ãôèÙKOË–>PŠ˜9BÍ›6sâÜ©³'ÏŸ?} :ŽèУ;7ÆÌL£Sõ$aåÀ…@X³jÝʵ«×¯`Ê»õȪ]˶mXAZÍ¢uK·®]²rÓÞÝË÷nÞ¾€«ý+¸°á²gõ^ÔÇQS> þ5‰c—.Qb΃D 5ßr|›!E¥X(“`\m±µÀp®c³ž-»6íÛ©B…R²÷Çß&Uc†¹r¥á‘*7ÊÂòçÍ£=7î¥pʘ¸k©Í*€ï‰Á‡VüøïåÉ›O¯^<ûóð῟/>¯YôëóëoÏÿ~ÿýÅGŸ{æ R_b÷É÷€ *¸à€: {öM¸ „ ¾‡á†BèZ z(àƒŠ(b‡ÿU˜a‰$Ø¢…/®žŠ(ÆÈ¡‰úAÆ’éL €ÙFȉðÍ3ß|6ƒ;3Œö”jªá&¥EMLi¥mX^©¥BMùH%äQ˜î¨LqÁdþ¦±…xC‰rîôÝœ5ÝyS9ñIÔ8JiÓS+M…™w0Fˆ£‹ŒÊ¨¨ï]ÀA‚56Zi¢Žb ŸõMj鉋>ú)‹£Z*)¥¡j *¤æ] ß©¥Šªj«©Žkƒ°Îʪ¥®jXk¤žêzë»j3\q) ªcf jL‰ G“3œšhMe–Ü^Te·àn)n¸©Ka†4是Œ“DFÇŒvÒúÐu'¾Òí‹“xÒå©'¾Î \¿H#d,Çå`¡ kæƒ6˜•ÃÅå]œCƧqb£2#|–É ¬òÅÂâl¦¶¶ óªÃrþ:£§s¼±Ç“̲È?ûœÈA¯<ôÉ,#}tÊI÷j^®=çÌóÎB=4ÐWƒ×±Ñè¡Ì³Ò2kqÔ=·²Æ[ý3ÚW{í×3/5ÕR ­³Õx§—öÒps vܦâL6݃ç]5ÖxÿÍ4ßI§¼šzˆŒÃ>²Tèejöhd“Ÿ…6Ú7Ä¥6î•$;ºé¨oUGêö摘e¦¹åR%«uÊÜg¾ãèN”ï€{s|êéûwÃUœj”Eµ”´±Xìɽ D=ÉÓçP}ö3ô@xøâ“ÿýÐ,[Ÿ>÷ØûܾÓz¯±üó³Mýh߯½ýlïŸ?ÿÿþs›¦löS#{Û»žúˆ±òuï|რݧ>ô±¯‚ïûÕÓ&å=wŒCdlŸöDøÀñ•|S‹  )xÁé°z\€  mg ßôÐã@’o‡_«`ÒÖÇBºìü ÈÀ:Qg>D_ ‰øÂ"ÂïfH¬¡Ƚ(z±‡$¢§Ø»x©ÄaÍSŠ‚ä¬ÌHÆÔ²–çHSh½ët¸Ç· taÅm™ºB"äq±à pB¦1‘Çb‰j6¢‡ç|G`¼ƒî.‰/`ò& ó¤¾Dù¯Lþ‹`K¥NB¹œêdF7ËL|0¶²l îÃþå-?¨K^¢Ï—Ôã.‡y¾ӘżâŒ<¹Ãï5s|ÏtÇÝá¸ïPÓzã«f6±9=\Žo…ßôf7¶4°€¹”¢-‹¹KaþÒÁì%¢SšJlšã~&P} Gó&z¤Y΄ëDúŒ(;GJP€sŸý§AíÙ¶„zs¡º¥:uIR•¾Sž8e©KuŠËÙ¹DsËbXL@(zAåsJbÒhº$•“\̲i ¤Ú„pP•!ᨠ҄oئ«P=ì¼D ˆ)$"BìL95¡Ñ–žþ¿l²'á Œ:sí]}‚<;™Ò&w2˜œøjÊVÙÕ8šÁNel'=fﱎõY5Â4ìU–²âS_ ‹8F|jHzÄ5…6Z´l mCíi׿Arª{C|-BdvNïh6²·Í¡f/{M ª0·S . =Û*}–²·ÅÞ8â¶ù6³Ô„îY¨W ޏÄe¨@¼—1>‡­®›;ÚöñV¹K«~FˆÞ°WkÇÅm3=È\Ø"ͲÐý­ ©ë± 2}ÊDgn‘K`Éîv}¼Õïp­»Ym`–•c–±ÔËÅ2áøvû20î¦WÁÓõo¦¸J£8oø’Ò¶a¨áOb;Hu-Ÿ#-’“\XzD] ¦w¬Ð$Pý€ÁÞ þ ß  È€° K"ÅÀ ±Ð® Û%á@AǬ@3`ùø Ó¥mibéh%°Ä:ìBhåT–S{²ÄÃId(¹’Av|*IJÉ7J—t@fd÷V{b´¨-ˆ„‹Ó˜ŒÐèƒ×8,ÙØŒ5#ŒÕèŒ@)3Çø“Jù”ÐØ”ظ”¾h¨2•P™”Q9”šR”‹‚a> $!Kæ2ŽË ¹Ç±‰wÇUr¹M°ÆÀ ôÞ@À—éàT zÐD . Þ°¦À Ûb„ôÚFß —|é—r€ \åUpÙ-]¢Hñz¿þaVe-µŽæ2^ °ˆ;°øŠOöd¬ioðÖd¯¸dGñšÈ‡›²id­‰|¦‘XËR–î >‰•AI•—B#NyœY 3¤œÆ©•ÒiDÐI”ȹœ-S]yÑI2F ž©¢0ã•-bv6Æ„Ís9fg‹Q!Êw¦4¶‘Qm Ùz”ÓP $à‡4ýPÒÐç ˜‰Ñ@—^¥G3 šSà  ×fŸ·áb_â­3&49;r–¨Ñ#º×J:±8‰o@a¡t“CW@ác)©¢=!IRöç˜PÑWÁ@Ú„¤Dºp‘CZ¤þJºIº¤NMú¤RÊQ:¥VUz¥jATµøSÁf9A2…š3ŽW8Ͷ…›¹VEUbØŽ é¦ÐK2û@ N€†ý° ¥ðޱPT1àAӀѠš™brÊ Ó <‚§?Ç ‘ÀmÊ-ßö¡g5n£9$b™…ˆÔ‰1 Jºy/Bá¢1z›EÖ›HªÊ‚&Çq‹ÍžU9«ØY«Ìy”Êè+¶Ú´ú«· ¬¾¬Ä:¬Æj½Š¬¹*žÇ #èY´H(C¥#ÀGä˜-ÖñHiªï¨whÈQÜšmãP„™¿À{éÔ° ‚Ä Ý0 Þ°þ š ™)Àóšy(–¨K öÐÞ0 cÀ˜ý€ ¥¡Ûº,Á:”8n046’“q{éF.ÜKàJˆd(ûF P²&{²(›²*»²,Û².û²0³2;³4[³6k²‚p³:»³<Û³>û³@´B;´D[´F{´H›´p–j­1/à(IwTñù9¡SŸ ‹ZÒ†Zµ— ‘ Îp±ÑAïe ®{¶YË«³ ¾a‰!1šgÒ„ÊÂoN1ªx’·ƒ·£J“Ñ(ã=°J$º¡´Ò¬åÉÊʬ‹‹«t¸Ë긒+¬K¹Û™¬—¹–›¸˜þ˹š[¬• º0B{˜á´N!Í2$Õúv×ZR‹¦—zH(¶%±@®±¶†ô¼ñzâÆH¬@/Æ´N{’£·È0|›¼ ãJ%Šc#9I"ÐK,Ÿ‹¸Ö˸™û¸» ¹Úë¹ß›½“+ºà;¾ØK3ዾæºçK*é›#³#li4$A2$ ãbÔ’TÔÂTt»÷i:Ëðb ."æ¿ãòm ë»"Q&…Kº‹eŽËÁª)Áœ¢€I΃Ma¸Õ«¾›+¾ìÁä»)Þ»¾ÛkÂåÂî‹Â <Â"ܾ¼¢¸'¬Â1ÜÁ+\#ÃË&Æaº’”º±&Ó2΀aJ5þ–ÚjÀd¨»LÌ…:æ‘ãæ¡ûoj4/î€Ì[Á-ªÅY¬I7†bÉ“Òâ£ZZÆXšfü¤GŠYšÆEÚÆn¤pÇŒ1Çt|v|ÇXÁ¥869_š…Q+9Fµ9Ir­ÌöÃNÕij«ÄŠülY‰¾ñ°±VNáÀSa’]ÌÅ{›É™¸DpöÛ„ÚÅɾ¦<Ããù,üÂ§Ü Ï©Ê4,+«œ"°ìÂ7lËBž- òœœµÌË bž·¢Ë¬ŒÊç‰ÁO¨#gbf'°Ÿ…$΃°D¦EÌTZØÈøYÍØ¬:..hűGÉi¢-°”šÌQŠI†J˱/² <¿SoŸøW«XÓ€+¸];76„“Ôwƒ8L}8U£8}c2By•]Ã×k)ÿ,8JBSc86hƒQÝ8p3Õ_]7f­6Ø4`-Öó5‹Ó5¥Œ½¨g ö{S)kÃÖN×'×Á28PÔÕM=2kÍ8•׆MŒ?Ø\íÔ%ƒÖ‰óÖPÍÖÆÑ¤¹ÑÌþ¬ºëßp$pWŽ.&:мwv÷˜(­zLȰÜ|VSl9µ(½;¶{.¹É³m“žTd<-“™´’4ºçðÅ]š§ñ.Qe½VhbtQ4YÊL…6AÐ]L$”„?Ö}ÝþƒÝú“Ý VÝÝ-@ÎyÇMR TMÜ„ù÷ÜÒ½Þ+4ÝVùTJ4ÞKÄÜæM7ÿ¤Þ+„¡ݤƔÁ"k†]6ÖWÞ¦u?á±ßìZôsIæ×-„òMàËm=ç=}øÝÞÞ ¾• ß®6á îÜžàGâž44L{cÉ 1RXGïj‰- Ó–£©Ä_XUlšŽ}÷ §xÚã";þçÒ Nåo#)Kw›Óv'~…WÆ#XÂ3J„¥/8嬘Û8ñ›—ý,ÅÁo]t;7æF—_f¾Yd'\?ïè1ÐäæÒçÍ$Lsç$CçƒçßÄMïY{þLö§]c._øå[µ5†æc§æ[§Oàõ>=·[fnèãår'ƒ[ŒîŒ÷1E­…½äæ dè qZ’uè.D;Wƒm”ŽB._eNé‰nr…]´æW7è˜õ\¼Ž_Š~rEäÀz€vfÔ*ä1>¥±ôyGÜŽ!–w¦G^%P ™):©-nùN%¢ÒZ(¬×¾XùBŠÃ/L†þ|µí’îž/ììäÂgÎ)©cƒœâÏ»aµäá©Æk‡A¸ÆSßß¾ˆÔ;£µž.5Z«4Î…Ø ïZôñŒÚUSŒfhÎ ðD~6ð³öt ‚B…¦iå‘‚}öN2%L½Ã}¡vâa¦C}Íêxf)?ƒ7PàçB…–ð˜P<_Œ‚&òÉTR x5'ŸñYÆñWÓòtP-ë?ó7õï|¦ñ¾æñ(>¸<²Ñ"ËÇ•Ü"M-gúG±»Gfow`u@r äPe“ØÒfõ¡ª,:Ü2±¬¨ÛÓaJ/:|~Ÿr ÿê¥_úSºŽ\“YñhOìižAšÞqŽMjSè”ïúeëõG¾ô Å~œõû\;^dA˜¦ÜIÄqÅo^ì%ü¶ï긟ֺOY&¶±_sÀÏú´Ÿù«r+×úü³ŸÃ!ŸªÌ™íV]b­Ë¦-ΖµÕVÿÑå€ ßPy«à§ˆñÍ]Ž&›”ŠäÂÀWÆ4Å á"ÇÀ&3^œ˜ãF9~ôäH±ôÄÊðÊ‚Ê!+_½2õòUŽ$9|èñ!"çÍ›±jæÔaœP¢CBÀ¸sG‡"]JþjÓ¢ç’:j5ªS¬W¡õêÕ¨Ö¢BÇ=+Ô¤Ow:ÝòÄùS¶ ȑî޼{ñê½›—Càƒù¾;pð¸¿~ûv øpRJ)[PÙ²fËuÝ1ÎÜ8tßÑz)ß=m:3êÕªí‚NúÙ²l¥´•r¾¼³ Ììú:ï»î*î8ëÂ;ï.ÍÊ=öÖóß*Lp<Á.1ÄÌó°DìîÚé-XÁIÅþõh“r ¦¶ô᛾¡€orÐñ›at§&’Ž)ÉÂq‡„&Âi‚w ”2£&ö1š(Î`ʼn(Š!H 0§Œ" šâd¶¡HÌ&D2N%申NoÊÀ¥˜`R©OSŠÌA„“ZÜ)®‚Ñ©,¬†Jê«E“¢ 6" ÒGP4ÓÞ0­ÒIjÔ¨M…‰ȵÁ$Ý*pÅ®zu©X3MB¼l¥µ2Z3sÕ4z¥ X^Y»p@}ãÀ8 óZ6WfMóµh¡ÝuÚ¤ž½vWlÿbíØb•â­3êêU³ra½îV½te3ÿ8›ˆ]_…ýµzç%6Cþ÷Mê‚qóÊH¯s;º¶]ukÍ!wÝ‘—2€ss53fžïÛ/F¶@YÿŠ·×Xamxâ€ZW©‰Ô•Ð?¾.`oõÅØß &YÖë\ÎHáƒåÕäƒ%&Í\w€hÕ,~Y\rc=×fÍrÝ9j¨w½7X{éõÇsbED·~+ zÒC$ÆôÏðȤh1˜³“¨“N»1j¢×¼)òx"Òq§´qµdš”¨É Æiâ˜X!a†tH`ÅïÄ·ènÍëæœNWcñ >Wr©ôWÆ¡{Æ·õ)ƒÉ´+L…Š©P¿¢Ýö­ª ,NË‚ÀQ²jçýþ÷§‚ž*“¸Õ›ävÇ$mÜã7ic‘n{˜1Ö^éë··žûÞº¯>ücÃ%pÜï5éöÁ'?fõ«w?þcßgßþèd^¿|ýÇß^ý¸=þÑ~Ìý§@ùi ý“æ"¯Ù„‚…ŠÑZWª õÈ";šÁ ôÀ@m΄$i‚•T¸$‰”¢ •sÇ6¼1¦1‘@L1œ•ÜdÃö°s?ÌH‹RÒ§—èI&4AÛ ¶f(eQEQЧ>•ÛE6Pœ¢¨0ƒÅØYÆwRÔ팂Q¹ÅF§R]N˜×êEp¼ßÿ$ˆ´ºc¼£áôõk~vŒã¸þÇAÐXuÄ# HHAò‰LdöÉÈê!Ò~‘,¤"3™HKJ““Ì6”è–¶€-Er[Ø%€mÔO|‚:Öò"UÚ.uèe„#1œârð ,® ‹kÒ ¶A9×EÄJ™b4mI§AAÁt1!]ŸP=籎nnyâQ‚Ç”ã‰sœR!'òÆ"F© ¯,”Š:¥ϬôΜOÙ óJÅ“·4À‚>h#$õhH‚4|u©ŒÆ.9PM&Ž}Dh ʆ¾Ñ ¸‰¨B=ÉÐORòb½è&'êÑŠ~44…cGCêЕöë¤-…i ©ÁAýsuÒƒTT“þAu°mAR¥‘¦ùC*E)JP‚á.ÇŒƒÓx‡;¼QSH# aò€€&dá‘(æ3¥9Ö¡ŠdF]ò’˜üéleK£Nâ‚6“„³(\Q”]Ór/re¯±« ZòF¥Ðó¯ãpËÙ…Æ}3'¾ Dd%;YÊVÖ²—Ålf5»YÎR6¢mhE;ZÍ b²Ÿ%mjU»Z΢–µ¯…íj][ÚÖv³³µmnuYÜîV·©,ÔMÐvÁA‰M”3â)N@Ø£é(rmÝÊúCW1ÎU¬Øˆ«ÂêŽ%HÃÈpFåÊA‚(˜¢ ˆóÛ7ÆQ„U Ã…™Æ*ÂáUþü€¬÷îóD·§=µ„ˆÛ”ëA'—Xè°g< ÛõÀÀ;g<Òº)qŸ'ažôDz@’ª´¤2©‡El¿>~X’æhŠ):â«Å-†ñ‹ebÓ8Æ6žé(sRJâú ƒ¥ò ‹@çSXÎQ†*~X¥ge7N}ûv“Ê2w(yº¶L•2°Œ>est¯(bs×›Ô$8±rÒ¬æ:ɵ¬8ó˜-üÖ“pÀÎwÆsžõ¼g>÷ÙÏt =hBÚЇ¾³ ½hF7Úцt¤%=iJWÚÒ—Æt¦5Ímðs'«4¥NPI6ÐÙ®ü鎼I“+Gþ“IIsG ¬‘ÏÄÚÖž+•èV²§/Ä–ÁUQÚÂÊ#¸Ø™:¶±•Îc/Ïu ƒ Έ“ ³ôÃ,žñµk¬m –Û87·³-Ћ;Üä÷HÏ­ns·ÝëF`OTÄãPçt”<òŽ˜ë¶oê&6Jr«7÷ê[_„$/øÝÜ’§"vY&+Ôײ¼µ 7ÙGð²5^le'¶kÎóx‹ªmQw³ûÝ%ßh¹ÍçímŸÜå&‡yÊÓ-sx§´å1·¹ÊqnÐo£|}¢$õŠ.6=Uf.ª›»#·È– Gä N§©WÖkI ¯÷´ë—ØtGÙ`·q²¯þìgg¶)Œ¶P—Ú‚ÓÓ9Í}Îó›ËýåÛcyÜs>ó½×œîzÿ;ßïw@öüî}Ÿ{áë¾¾“¸‚mwóØ”èØéE! nõ\NáŸçü yÂp/c³OH\¬Žu¢Xmˆíg=Æ‹`¹Ödè¥.@/à[ÞÛ¶·½~gM+Ùßßø-þñ•Ùä/ßù§ Íó¥ÏüèOµEo‘êèMATùW:¿e9·Ð„q Gù5‡]¬k½á21MJ¹Ïºî&²ýSòÿxkañ&nšÚ9Å<;©Ä3ÃCˆz)\$Â;¨<¼Á“@˜YÀ Dþ@ÁS@ <À\¼‚ÚÀœÀ†"µš2¥A¥i¼ã1ŸZº~Ë'$J?»I!õÓÁˆR!=‡ó0{+ÆJ3K•Ã"¬,Òã9°¾â¢e#'d+z°R±‰ ."a#´;ä°˜ê$Äã@ì6 y$/´¶1¤£3ìÂ6Cû C TÃ/ü°8ì@ Æ€&gæìÁÔƒò 6“‘¸ùÛÊã‘ò 0G´åI½%Žhp@‡ÊéÄŠÚó ¨Ê¡þ* +V°‡3°eÆ‘!ú2®³·J¢Qå S#áÜ9‡à©¢Ùa§­,a†P¾žN™Š¦w:§¹0B¹0ÙB$CÉ^C.äÃËvF¼Ãg<¤Ã9t$ËÎl̾CíÑölh„Ãf4ígÌ£‚,íÉæìéÉ,Û>°1É3 ³Ï`›¥Ëƒó´e‚ó]j“qP†&ø¥S>P†a*&ƹ!eb&=¸*V8hë‚c;”ð²µú¯Ÿ°îd‹Æ30U¤Bó清[±ˆÐ²`â½–BdNaÁ.}:ÉÆ“› (Ö± ülÊîlÿ^LÕ†mGm ²Ã?íÖ6hÏþCÿ>±‹~íïÃÕVpð OšnòÉÛÓ‰ó¿´<̳B@_š|’'Áj‡ih*"ˆ‡~( @„¬Îªph€s°‡bÒ€&h€X0òMµ2¡L+Óã嘈¸›_ź‰k§tB¶s'ªˆ0ÀVìÁ~"yb 0ªóÄ ÄOláþæp í L¨ØNð6ç£êxswp87©:oðÿÞsŒÁ5ßp9×À?ô4”p:—(@7tj½,ÌÙ¶«ä¹”<°¼Ôoò³åêê䨮nð.ðb…Sö†(X†pˆç~Vè‚~p¯‚à‚p€Ïn»ÏîÖDÒéÄþI`öšd˸1š=­ JöõEAB&Žrú¿j†.Ö)I„,ë“vÞª¾i_¾á£öʰvio¾m¾n÷vÞ÷pß­q'÷ÈÂmÖº4‰€{³ œ@‚JwÔ›p_ô¬Ä á÷‰À.X«5pS¾.Xc…‚Gòé’+´z? œ _vö»Î`þûòeë?ý£òºÕøvJ6žx3¯ ï ”‘»s;çóC§¨ 7ù¼ðE/ô8í˜Çð—/ù>'yGy”¾y6—yœG ]®IþJ]ž13Bò|†õœˆ®YoiʈYƒ^ލŸ®d8þò$¶ %þ[þ¨#Ó8ýÎohÓÕíÞ´·‡û¸‡{E“ûº·û»Çû¼×û½çû¾_´P«m1I´”V¢÷ !›¹zf«#){XÃz%½¢Œk!d»n‚Á¡øÍß¿²Ã8{‡á,T•°3‰7}—ïyžŸùÔôêayDŒÉJ$É”%Ek@OÈIrˆÔóìÛ j¾åÀù-e¬$îfºËQô¨Ñ¤H—*mÊô©R¬œR…jµ*Ö«Z³rÝêµjÍ ^½2U–ìX´COú@Y²f’qzHBW÷®Ý¼x÷êíË÷¯ßÀ€ .L¸î9=0“œ ¹²äÌ`$R¬L9£GŽšn¦È93èÏ¡-Mz³iÌ¢StùãéΪ=Çf {ökÙ¥k×¶=:÷ïݸ…ß&®5oÕ¾—/ïÜxpäÃ¥§~Üc[Ç)Y±TéÝGÚj‚Ï!¦O3ÜÍÀù6®Ð®þò¿>×d>~úù÷ëïßÕ],,AfeÖ8BøVL‹¹“’a&!…ZXa`$é1S[ ¤Gê¡ r"Š)ª¸"‹-ºø"Œ1ʨâ Íx#Ž9ê£ )ÖXÐŽA 9äŒ?@$’I"i¤’M:y#“OJ9%6Ryå‰h¸R09<¦Ò‡.e·wm¥·SOí5Qü¹i þÉù&sÚ©T[Úˆ5Ä+i¥eVŸCÉõ¡cä5Àd^¸¨¢2JXLB‰ ]‡"1æX‰Õ…ÖœrÏYhFÖêjžnjj©Ó äÚ@¢^—ª¦°¾J›ªŸ¹J*­±æ:+pœ¶þÚШ¾êÚi­»âjЭÂò ²Çv”,ªÍëëx Žôà—o'^MAÉ5é78&Ny|XÞLuªëŽ}ëâ7Õñº«•\! xVZ}êûJ‚’§a€Áp“„ æ…ù%УéeÐ^ OØa\ݺ˜—#fºì°ÌF‹*Epl³Òöúq­¬¶:rÇ-ŸZìɵŠL2Ê.;ûi³3Ûl2ÌËÌ2ÇAËz³Ð!M4ÒÓ>Wè˜^~w±KÖ*(Ò™ëµ7ƒb#Á7/$4á5 á4ñ5»òÂéB,xÓ&H¸c6×ñjh+o5ÎÛHPñ¹`ŠP1I tN` C°¨áxþAŒá@„C`8Ãz=€ã…)¶ä‘7Ó\±\Pc¡#z£‹.é ¥^Ðê´ž:A°s ;í¡ÍÎBól³Òª©,Τ›^:ê§»n;ëÈŸƒêÊË~üDµ3»íIã~tõÂOü@§·^|ò̇¿=òÒG_ýîÀ³¬}q¯;¯<ô³“.~DÏ'{ú%b?=û샿þÍzÓ“ßñ²ëÎxýsà›G?÷%°z<_Q´H&[p@‡H·X|ã&êaNÅ&¸ù§ xÃ[ÙÂÁBª°‚pÇÆ1jLoqû¡~Ê$‚Ætg.0éNx¦ö˜s…HþC:‡ÃøEèqTôË䬹ÉÙ%ŠÀáR¯‹aÎ15* ôÐh;52Ï(®ÇìÜñÆ8ÎÑ9€ã™7æ¡qè#õHë! ¡ÛãüI:E.r~wt$# ÉI&’’LÙøÇ6ÒvvÄ£ïHGQ~R~›|#©8H?ò”ùËO™G衎]tÜãèlYÊY¦Òa«ü¥+XÈ hry‘lc(AYÇdÎ.–¦dõX)¾J“+U,5YL×éRޏ¬¥2I9È^ªò”Õ¬æ+G¦MNÊ™Ë|')™9Ës³•Ú:"¶¾“’–\N…îøÐ™xâ“`À%þmš¡Wâd©,¡N!ÚÞ6Žoxˆ¥OwÊ4"˜Tj<. ј¬E&MhpãÈ] —”žt‹-=Ç_\Z™v1‹]ãKûBÓ¿tN‰šk HaºP•›Fµ#Q9àG£(™Må¦RCéNOJõ¨S=`Ï€º¡îrtW»ú6Ôq`¬®+ëWKgVµ~µ¨4ê[Ý×´"íwÀ;jQ‘ŠW¨vÏOeêRýŠ·øÁÕŽWµª5V½2–®¢£*ëŽ÷WÁVõnü«ªé›¿Õr¯kÅëdÂÔΊVŽq¼¬AôšÙÍŽjªyu+'M9ÚØ6ªÐ³lgáGUZ S«þÝkcC[ÛáV¶¸·5nƒ õ­l¥$<•Ï84t“ŒËj)Œ”A/Úæ †Gá.RšPd|#X…N1•&|£(ìuGJ oP (¯0†&ñÞÎЮC·"DRJ%Iãs5Ä!–<‘a&M©Ä¸8E¼Lñ`TŒØ…¿ÈEÓ´ÂVØ8Ëń% öAÛ©b4ªŽl,klY\:^Ž³Æ§”qbï:¿‚åt=&Þ 8ÍÕеÌ^|Yô¡Ê®™š%”m,J Æ’•ñ3é—Jsy¬M#;× f+‹s“d†c®£5Ä#þ£.ÒÝMJê=FxŒ‡Þ™I{è„@Í€¹`Wài!RxWSPdxµW4»A Ôбý‚ ÙG{ÙÇ L7à 4ì—QlÃ*lá¶¥D>ù‚! tˆK Ì‚l‰H„HÀ¬þá†ÝÔ8xX½QîÝ^†AØ_ÌNMØO%¼éb(«[Pø‹pVÉHœVf•úÐL­lÖVÆŠ]åÒ€%WRâÑdåYš¥Í¥ZîLX [ÖŒîÄ%ÒÌåWÚ¥¯è“Èò5?…ç ÇB€uaE$éåØ|ÍFEŒ+LƒŒLÃ;ä@?à B  ΀À1èA$L^°4X¡D’^·­DêA…GˆtPߌ„À¸C[ˆ@Áà¡KAÌêáÊ!q²”Æâ¼!ñMßL5—¶ˆð&L`%]–¥^¢ ^Æ [Ö%& \®åvþŒWþzgy¢çYvç«|§v®gZfç[‚g[Æg^’gÏTKêßOÍÅAnÎí`{¨A½&TÔ » ¡á±¹ÃHƒ7 ƒ3°+À‚7ìÃ2ahº:ô2¤ƒjÂÚC_¨à5†8Í[„ƒ[€ÈÞÄdAþÍYbØE¼ÝžáhPÚ(QÒ!Žê›^Øݨ ©Qö…ãÜ(èfUJHÌÀ¨(vÞçxViÐ@ •Ò§–’Êï`©zZé{ºŒ—¶gz’)WŽ)©¸ç| š2G™¦i¡µ©sàgÇä&L hN>Ñ`ú€€Âš¥ÈšKvåí‡R°Â mÅÎ-(&š¨jˆþ}‰ˆ•¡wç´…‘FH`h*†=gQá|*^Nãl*^(Ø·XKs-W‰`‰«6I”¼ª¬âH H¬Î*®âÈ­æ*¯ÂÈ®ö*°®È¯+±°ëä˜ J-Ñêd\MuõÝ߭Р6…®¹Éº8êꦊ>MHÜ$o‚‰` ‘£8JRf*¨«a,JŽb‘^¸žN2ÈÔnéšæ«|îk–riÌ|)¾ò+À†iÀö«¾¬Àš)˜ìÀ2¬ÂlÃ>Ç_ŠÀëÙ``ªý©êe×µ†WÇ6êÇ"ÔyP¬©m¥®Àñ¤HlÛS } ^WhÈ¡‘[ŒÜ,Îæþ¬Îî,Ïö¬Ïþ,ЭÐ-Ñ­Ñ-Ò⬠$-Ó6­Ó>-ÔF­ÔN-ÕV­Õ^-Öf­Ön-ÄÂs­,A1—ÖäÝb,—´’‹Cž‹rëS(Û†,€ù@H$HÔ­ÝÞmÜdÆJrØHœë£$%எZˆnV ©9¦Ü+Á6®ÃÂ)ã>®h8Ù›ºiä&,ä.,æZ®æ"¬çFìç>¬ãnîœvnq0WL¢žcDÍG>ñÝÕ(†L$ÜêÜÛÞîK¶…în“¶h¥b,ˆ*ᆩï£ä†Hgçä† J,ü+Î.±˜®èJné¾ å^nèf.ÄV¯ôú 膯÷þn/çv/÷Ž.ù^/ú‡~6Èr‘kÀP·TLHäAa6$ Þî/ÿö¯ÿþ/°0°07@Þ.°70×-µ.)‘ñJˆà/#i…xA˜Ÿ·ô¾ õž¯õN¯ù–¯¿žeïˆ/ oô¦¯ ¯ïø²0 —0øÎ0·0 ßppÌ«b|kH±¸ÉÀøæaâæ197±?1C1"-qW±_1g±?’'Ö ¢ºCÝàMƒ±ÎmÔ=•u/»fð„T0W\Ô]nʬ;tP«"++»j­žˆïñ¬þ1 ¿ª 2–²!S "'rþ–´ï‡¤n‚‘aûFIH¸fßÉ®'KÆ\xr',(²(—ò'›r(ë4€ò)·r*¿2)»r,Ã2*ϲ-×2.ËòÈÒ¦ªÉîy|ˆwh²‡ŒPtð¾12»q‡™ü —HŠÆœg×° ‡ °œ°úÚð@té5˰ÓplÈi k³_i7“óР³Dˆ3Sók;¿08_„ÇB¤Ò,¸i 4‹À Üï«ñ­bü[@Ä\tJôÈ´B'4C#´CkLJlTHô EO´~FôE[tDkôDs´&KôGg´bˆ4HcôFôI—tH$´ÅœÚÅÈmKë¤6JJ¬þqùÆrÖ!rÆaçLå4`$†¥D×K§Ä¡Œ‰Hó7Os6s§}Îs;7µï¤"6s5‹{.µV»s¬d5W3µU›çõV׆WK5Tk„#·E¤Ösxh‡·Ô%ãïÁ´ØÚà]çuÉj üÖõÝq_6`ö¼ va6©6ê5+¹þõ¿Ä´‡ŒØÜòÞºVˆJ}˜¢ çPJŽ»)æœKAJŠò}Îò jo­öøŒal¿6Z*5Y×6ZoÆX®áãn³6µ6Éö ·Ág°o'·oSÐj ÝUt_Ý5öö¤¶#AE|ÏýDS‘*þÙ\îOu÷o—7s»6Ô™l?ã%÷ð,w¡·z·üv[#ß¶´è¥ÚNœP{<Bóµ^8^8\Ÿá8Ê&8ƒ˜ªŽÄƒ¤ƒ78‚O¸…û®Åh$„÷ @;«ó Žòôf¸RÚô‡!eK9§‰#iÖøÛ_õ‡  &ÓQÕ¸dIÓS¢ŽWÍQÙ¥#E‘3q‘W’'ù!YÒ’ƒw _Ó`Qà'ݸUíxéôx£ù¸Ã—ÒÍ#и㔇¹TY9™cù¤Å™ÙýxÄw”㸔Û8Èy# ^·Ž/;éÕBP#ÈͶ)R¹˜çx–º™UžÍ9w9þ›Ã¹¢³œa•¹ ó¸¦Å]š3O¥ÂĸÖu˜pKͅƸ§¸§û®a7+ó2vbŸº3+6ª›zª¯z©·h‰™úÓ 6do¬†3’þ^ä‡ÝÔQ%PbXL±¡®çz‹jhSgP°Úò­  B £¹_†µÛ˜$®eøbXÕg™UµUÇ};•…»+ÉÑ–•»+a•XªŸ³¯ ‹M;¼sšµÛB„œ1 »‹Ö»Ë;¿_¢¨í™½§ øñ9õQ’Õ»øXö»”%YìÈ’Ãß» VßÂÇ_¼[ü¤ÍûC<¶·;ÅGûÅï{µÿû)aú}Kð¶èdP‘?û„Ý}:̃þºÌwø§ãÍv˜‡Ix¡„N²»tèPø‚_øÐW¸Ñ\„ɆÓ<‡ÏqyHFð–ådöŠïºIQ}Æ¡¶'ºÍá½1á „Êvx¡”=Ê\Ê1ÜÚµS¤«yUÙ\Ù„1*cøLÓÁûÜÆ•6*à#<š»Çž¥Ý˜#Â->Üsù%ãܧ º8¾a£ÛÝTáxTõËi–ÀKy‹~£“V)&æ'Ä åÖ¢—ºëNŠ5~åW9i¹ÜÛo>Ñ­¾ê@þœíLÚ#~•+>Ûi¾ëºÉÑ„¿/_‡+¤Àh”´|{Ä<õÏüÌ;=^?òóþZº¼D,sô´YgÑ™G‰ÎÀA`S¦M—B*•¥R¦V‹FUºt«P§]·f–ìK¨OJE+PTU‡½ ÔhÐAzýiÝ¥7Çšö¬Z·p]&æ»'SÀzñ… Sq̸:Íú,pífÏoÞ\«T4Tw㞊îÚ4ê°wþ§úTŒ:0gÃ…qCEœC1M¹Iƒúæ*9/]ÞÇ-ûÆÜ´¯çÎÏÿ–Néò½4!Oî»8€’±ô€/éNÉòçKúH üÉ$ã‹ø6ã53ÜѦ'zÿæüOÀ Ð@’N*À“Òf¤ÀÁX ¡ÁòBñÂK°=ñÐë@CAðL Ñ} Ø¼xEÈ—Eˆ=ü¸ÄI<Ѥ‡QåÑËò¤sDh¢"e–H!¨j¬9f'äQ*‰€^Hg‰~Å$È[P=wÒ+•þ7Ú(ƒúéf_rl&««¦,ëã8{ºëÓ¾Öñ/°ÇÕ³ „º¹±E[›&Ò¸~Û¬˜Hsin»—Ìí²smK7¸äiY©O£:*®±>üj­Ãn'2«öšïh;C»Ô–ÄŽIjÁ7sêÎAû)µ•r ò±ÅWuËM/]ðÖ‡RrË£ ñxD›n±S‹=uèr­pæ2o­wa?®ðн6Ï;ÝÌß;)Ë£n–p·nÞûîÍšÞqñ¹¢·CðôàwAñÖ1˜,?’>û.xÆ’FYÿü?<ßWÖ"¦ç?&) ‰²ö(­€ Ñþ ˜@y€> þ+Îã˜i"<ºQ”D' ÉH<ãÙ9DØA±¥I!¡F8B‘q¤ç=º|D@¡Ë©Ž\Ö›åªç®nx@Ì͆Ä#±3~»^ø&&qŠK b®°gÄh)q‹Uì⣕Å(öŒ£â¢½8*1žqŒT,£ß(¼¦±V ÞmØ"wô‡ ðN‡ô’óHa~÷qÇ3¾ñ üAŒTÊäÉ“ðcÿ[äÈNT1G6’“úsØ'#IăéÙ‘,â3àLfñ*mä–ƒ¤2–‰B!ŽrƳ(E GK&‘¦¡9¾‘d¼£µ¨F(²±˜BŒ£3þÙ'’j™tlæ3‘YÇ'3šÉTÝ5»IDnzœÞb9ßRMbÒј愦;ÿ6Î(¢óšš,Ï/!F%ö¤ç^¥”_}F0úp“í¤Åò'ÁæQ”|àB у>” ÂX Ã¥ ÂpC‚ÙFâ6iI6ŠaÎ6 R‡¨”ƒ1ãHGû¥>4Kß <ÃyNv¾S› aÊ嬹Sl~1œÓdÉOqšT8æ”§g<êM™)T¦fÓ©Qê:‡ªÔvöô©W '=¥ªU;!µ§eݪ=v®_"Âh, 0Cêç|I°ë]ñšW½î•¯}õë_›×Øu°Iìa þ›ØÀ.–±uìc횥…'˜#9åB.ÛQƒl6G³lJg5šYÌ)´7û,i7{´%’ÅÐ[ÙΖ¶µµímq›[Ýî–·´}jo\áW·‚˜ío‰›\å.—·Èeîs¡»\çF—ºÕÝít­›]íÆ»ÛÕn/O¦Ö¹¼ß©¬ F?,= `ÅŸàÛùÆ—¾óµo}ñ{_ýæ—¿ûåÍ{ÝÁŠÿ˜À¬pìß/XÁ f0}÷ÅÇV)£í…7jÒ ¢ÃéÙG3̤sÄ´J $åyšªÓ¬š5ÅXê‹Ñ¸b6N“Å+>kPeÖÃx©JkŽÌþã YÇCöq‘…j¯“¬õ€ë…áŠHûàç_æAšò°¬-g™Ë[ör—Áüe1‡¹5°#ó˜Ñ|f5§ùËì™›_²/„™ì^IKœñ¼æ<ï9ÌxÖeñÙ¿~–'0ô¡hE/šÑvô£!iIOšÒ•¶ô¥-LošÓöô§AjQšÔ¥6õ©QjUs¡Ápí#ýx"¤u(½-zöEžþLi×ñãõÁ|ì^ØÄþõ±…]le#ÛØ¾ÏGx f/;ÙÓ¶vµ±ÝlmS»}#ÉA0¤íõd €Ô×8ÎÓá ¯ûÃêv7»Ù=âs/rÞ ò‘ï]Vþ#ëÉo¤ñ¾£šï€Yà8&øÁñp~ÜÅ wøÂ®Äz‰ Ðj+ûàSDʵ~ô©k0ˆ0‘Ÿgä)9°MNr•§œå(wùÉEÞ!LždJVrÐÊ_Žs˜ëœç-ß¹ÏU =ø‘×üâ¹Ðýˆ4I²è^F¼ß}á¨CꙜAVgðh£ÅT5øÃö¯CÜ›ÿîwÄÇv²¯]ímOûÛÎv¸õìb»Û¯X &›ì} ‘œ#Vk*ÏGè%É¿&.QÅO´d'ÁØÅ¸xÉO4FzóŠÆ½÷ a— ³1a)Äfˆ?‘¡¨äÕàÂ7¨ÃVxÅL`5&Å37s.^BPf‚4G“(LsǨÉ24‡5å‹5ÿÄ5cÓ2f³þ5aÓ5_“6es7CÒß,ò235³39Óx>³8=5•³(R35¡8C4á4‰ó8­s9K“(ÊÌ,œS(‡.NR;3cj®Ó)®s'j“OÔ&9º"¿3:ÅóWs>Ë3;™S;Og Ã;¡S8ýÓR¨Ó8C34±ó4ïó@Ëm^Œ±ê²=ª$ð ©ã¾¡ðŠð—ÆÀ¼¡ ¼a&ÀB€$*ÂAdÚò& KT.ëÊòbarH‚LÉõ:O´HÈmÆ…”áÑ„0ñf<ÈfÄæÙq£ÎC”¬õqWRå[œVŒ¥L¢Y¤ôSÞN:E5I ,4ZþQdL¿44zLË”LÝÁLÓt,žåTZ¢MŸ%&‹JRž´Z¦EJÙeJõÔJùKÏ…ž˜ÔNµLL-ŽeOýTU¬fYîDƘTqš4N‹%Oñ†J¯âV0õ/"•VxŒ\µNAÕP uY,uV²TQãôSuSAµIK5O)5Qû4N–.}ú#ñ‰EßPã ÏÖè£c ñR€Þa ‚aŠ ‚Á Æ`¢ž¡ P-)E©u¼^¤Û|ÀÎèŒüÔ¶5b@Âèô g¦¤&q•1=ËH3hPÉ1/qg4ñúeÐ* <Þ‡<¨/p¦ƒ1|Â5ˆc`C:¹Ã/þvUYóR_#í&r’5wrbµænôo*V©þÍ_ƒS:Ÿ§8Ö%–ã`ÅuVN}¬TÈÄvce/•8Ÿ'f“§;®&?_V3Ь*b!mC:E“pÇnôB`aX2V?¥ƒ9‚ÒQ…e³Âeåj§(gd»£dcÒd±BÈ8>ýÂx@;ªÃ`i¶l“ñ|(¢6eê$šñ_ÄËc @”údnñ>”Då’¡.©Z©uEIñü‡ dt‚ IEàÂpd11±•~tHKÈ\/B†n„…rÔG[(†¢CJ¬¢;eõMg{6&›ò)½‚3ÀPÈ"u0Ç4ܘl46:Âø_q‡h¯ã:º¸WÀ¸;¾8y/³/È6j…âŽ1ö'ø‹ÇdÍ7eý³Ž½W&<3']w"Ã(yt(3udk!ù`9‘/Ù8s‘mÂ598Ù,Àózë8Œ·8dñb•½68áÒP˜I0‡®Ìñ:äŒôšcÈ<úášI f¤ ÒAÊaà lš§$04 òÀ (Zs[ÏÉÊ7eü%ƱVÕC\Ùí´p”u¼HŠÔ}üquT‰Ý± G+´ö)˜ìZ—»oñÉûÛ›ö›õðû¾UþǼåé½{‘Ê᛽ó;½ù;Ц<Æ&RËÑË­|ËÉ|½³üË¡œo„Vk!Æ oœÖØgA ¢ùl°µS@d»ô ö›ÓAÂá|@Ð;;ÎcY“ÂÝÙÏ[|ÓÓ/¦_@=Ôõ€ €û^ßiÒmÝdÈ£" AŠÕ= ÄX úyr]ÖÙ•‰a½ |xp?®$¸®ÍÓ̹¼ ¯°ÊÃÜÌ¡ðzŽ}¾‹Ø!Å ¡½ÇýQ¤ýÍ•=ÊÁ°ÙÕœÚ=Ú¹}ÚoìŠü#é-™ëþiÕ‚”ÜèB ¼9,@nà„¡uXÏ@†¸ ´þŸaCšC ’¡ ,`œ}@ÆÀAÞî‡ÅU|âµO_XÔ[g$ã/fãïåž 7’t Ù­FH ³ “¤œ¸Ã€¤´x¡ ºå#óÎq›ôôqÿ,ðæ¹«q~0ç™bço¾…~èù¯è~»>écKWYD±Iô$ü(^ôEÿ%úôÜäšNK|À€a¼!~!½_Š …·¡’ ÑŸ¡$Âa |€š`¸@¶-`VÁ4!{Ó)>üжïÚƒ_E]ÔqŠ¥ø—cáÕ"j×=êf}rSkWd_†ëHqرÝ͵=ÛÑ{Ù;uõJþôE?õYŸô]õ_ôU_ö[ömŸöc7\dÉê;ôÉ÷9Jâp½pLޱ=ä`~áÂA¦Õ² Èå²[ð©_Za„9>û'qä¿m$ø,ü³LüÅÌÏðŒ†Ð­ gjÕØ¿ýÝ¿ý5íýåþé¿þíÿþñ?ÿõÓ´Ád|@BD,=}èñ!¢mõˆHÂ*–Ágßfœð-GÅ< &qçn`Gƒš´'V *Q 6,)¡Ì˜g–<3§M]šth̪3ƒvM95ê×­MË–=¶nÖ§s×þí8îÛ«y/~|wpãÈñÚÄÙTæKIØlàŠß¨˜ánFŧ±#S:I=!‚¬ê'ÍΫ$“ú‰ô¨þüü÷ûïߟG tžDú` CÕ5À Më­‡]Cç´E!\Vˆá…ke8MZCTçDsÍ)·Üp'Ú¶"o)÷bl-ðÙŒ**wXŒ,âX¢ŽÂÁ˜œ‹Aö6dŽEöþ8¤DÚˆäŒJÉd”;þ(%bW]ÕàNô)DŸˆqç]FÜqŒˆÙ]‰UšŠâH Å’œÏàvÖ‰çzŽTBzlePTèù@•;VaÅ&D9q¨!£Ž6ª!¤MÕTše’Ú4)#U.éi¨B~ú$§¢Õ(*¨T¦ eª¥~Úꪲªj┵Žêê‘°šzk¯7Îú*«¼æö NYÒäRIÕMGA`~^EÁh§U¦Å^ë`¶êÙ×Szy~«'¸â†[—5e‚ò ƒ¾„v úé£öÖ‹/Xæ¤(¶>xIBpÁŒp /ÌpÃ?|ðþALqÅ_ܰ K¼Æ 2ÄrÉ&—<òÉ*¯LqÊ,¿ sÄÇL3Á u¬ttþ{³Lô,xâÍà‚Õ¾i)¢sŽË&Óä: õÓKóÜ+ðBuS¡hÊS¿]å ö½b»%©GVo푵çJª®Âæ5²Ä¾ûëÜŸ¢ºö^r+쬱ÚWÜÀºí7Ý« xá».xc{'Ixâ´úˆ8ß‘¿ T09Ü7© Y¥WÏŠ)žKf&‘D¨¯ÎúꪧÞzì²Ç®úë³ßŽ{îºïÎ{ï¾ï®zÏ9ä”î» ZíoBÖ^˜×Z|AúäêKÞ·ûõ;yyÿŸÒ?üù¯|£Äúˆ :<ÙYuB’Ðdh!Þ¤Æhpƒì ?Šp„$,! sr&x™„MZSZNÊ„¼¯µÕ3Ëôh€ Ý0,|aTó¼rÃz‡¿¶‚¶¬lE>¸€ÄrE¿@1RŒ"^¦Ø,îE‹à"óE„qŒPTÜ xÀ¦}‚à«HżX±‹eÜb阃,Þ‘ŒycõØ—/怑yãçèÅ=*2U äÅøH::²ƒ<ßËxÉ>þzd$'íèÉâŒã’~ì£Í84Nf“¬\d'_ÙÈRN²0dä܈È\Æñ“¼L¤'ù8KY‚ÑZHÛ\·²€+}$'A‹Ö rj2“ÔÌ;ª‰Íl^’Úì¦7¿ ÎpŠsœäÌÁ±"â­=¤]È›ÎL¼ {ø ^&ļz–‡ø,âqhO}Žåž*Zèº÷¯óÄä‰îèâ8ºØÐ<Ôš…(90J\£yÜhF=ÚÑ/ÉÁ¼Ø>a°@zȃx¤ñ`𚬉k_ËZŸÂv¶´¥­5­YÛÜêv·¼í­o \àš3'1Ô™RP®Ì)tlºÐ9ð2ŽçB—ˆÅa­ é¦eº<( Äër÷+Ú½Ð\H»5»hê‰!•¤SËøÞŽõ½ói}ʧ귽û½lÇz9‰=¶‹mkG \`¼¸CþŒm]0E5Ê`GX£—¥ðXzá ›rFí[|EÚÞ+Õ½÷•h~í{büþ—¿íÝË…C`õ”ñ­°‚Kç–¶C'hßð +T-ñ—t‹\ó×tV‰‘(‰Ruç¤u81Èe(qBÍåOà]Ó5^i§€h!]b—v¢x]¥HO‚áÊ‚^–Ò/Ú`o3öm³g‹÷o%Ç‹»¨m¤q FpgÅqæchÃdmÞVmšt[‡tXÍ(TÝöGÙÆmwyCÂSïsþV ÷pXÔŒ»Žºq¿HŽ«×RÂXŒR%…‹#¦h¶øL§eAfŽ&FŒH¥|¥h¿§qVµÅ·Js”áøâèm·•ŠŒš¤|wD@ùx¹¸H5‘ñ[àXüˆV×” ©‘éÈPíÈ׋âXЈŽä˜’Ô‡é„,ñ9Ô‘B1¨õ ±‰¸ˆÖt¦pM¦àׯÊ·“ò·G‰”’f·5/˜ÖiÒ±iBáiQ€Dõ„€üwó$ªæ€qvXÙjZ©j©VwvÓò/€/Ô!>id@k4?ªd?jt—À‘ûƒ"4—CBHr)˜tþ)9I˜‡™—…i—üs?ˆ9#†™˜Ž Aá”™¶NÊ4">@A…ø XñŽx[߀ƒÑZ¼šŒ8‰©©š«éˆä×i^G}—9ر(V©Š×e]•ᵊr׊»Ij½Ù]Ðu¹y§H¨œ4äYq6Iƒ)±)| iæ—ŠI½b){‰—ŒùÊ™àù—ä‰áYש$ãÙ—Üižë¹˜í‰ž&ò ´ó²9‰DÛÁ~©…9I”Ž8õ ަMKY”B™” Ê ßT”DéÄ.òR^ãÎej‡–CD^Jk¬v–f–i±¡Å)¢_©¡':·–™þmYh%—’™žî¹•™7úžÝYoŽSžòÙ£¿a£9*¤>š8AJ¤2ª„c¤3:ŸËÑ7Kš¤4Ú „9DlI“D-d:) —QW[§y𫉦iJ‰Eé'›ã’Ȥ(Ði6µ96Ë©/œmg§RXÙ3aá8:[“(j305£¨'ã2‹ê¨£1Ó¨J©3©•Š© s©™Ê©³© ªð©¡J1›U“"›÷ñ9žy,££áØuÀñPš9”Gà¡ °À CEM *¬ J¬Å:E uÓ z'¡<£k.ê–E6ú(**þ )d³O’ò­ C†Ã8ȧž8z¤æz*âj+Hê¤å:¤Lú£QÚ¤uîôŠ®ò¯í*¥øj7Úöy¥€˜PÍiˆ5‰©õ ˜ˆt ±À K«N5d°¿J¦Ãбjª±k[Âêz~oÊBÈ‹{§(d¦›²ŽÈˆ+Ût.‹[.;)¡ã¯>Ñ/±À9«³;˳=ë³? ´A+´CK´Ek´G‹´I«´:+Kë´O µQ+µSKµUkµW‹µY«µ[˵]Ë}ˆ™¨LÑ¡Í4hÝšhšUM± ³Ãj¬u‹”+y¶3<á=í’þå=˜6­u:¸…›!ü²s@O> ®äº¯ú:¯@ò¸‡Ñaîz®ïʯõ*¹‘Û)ùj¯˜ ¹ž»¹¢Û¹ƒy¯¹A¥"`¥;ѷ둤µ¥Ë2ÉtÍÜÄZZFÓ°*뻊ȱÁ›¦2KÅõš0©‰Iˆ †ë¼„ ½Z´i\_š)›2¹£kº û¹—ë½é:®ô渜»®§Û½ðº½ß›¹æ«½š[ºî[¾Üû§ê÷1½|æ!€ÂŸÝQˆD↦¶l{M¢IQ-Ðïð» l· ¬”š UŸµ-Ç­ ! ñ¼½u*f£&/ñ=+¾#¼ä‹+¤›þ•›½ï˾,,¿.¬¾¡›¾è ¿'<ÃëûÂñÃçk" ä-«ûš4꥛Yt™w·Å ¬ÐÀEìÏpY߀ñs‹Å«œ8·9aLEÑB^÷Bê%ClÆ\/²Õ«^Œ›¨¤Jª£ ÇŠ©#Çsü¨wŒÇ‹ªÇ{\3}ìÇ1Èl3œ¦9Fa~7ñ/1䪳ë3w[Ñ  ñÆ«ed@NÅ0ËÀŸ<kÓ"İH°áE7ïäˆ, ŒÎ[¬Îk ³1¤Í|[(FA½e¼]ã5œÞe›ö|v:Ô›€JŠpAnº4èÆ&ŒËÈ|ìIÃÌ|О±Vµl̟̽ П=ÑÒ ÃÀ¡Ð8ÌѽÜ+Í ;Ó©Ê1±ªrÒÆ,YŠÎœÀ1Ê7}¬Ü4 ‚;•Ij z•2j´Övp‘øTÔaA–l‘L¡P{k²PìµK­”Õ®J°ÄIÂI¦L#LÒÝÑ íË©„ÕpÄÖ‡ôK\ÝKÏ'ÖrLV…Gm}HpäÕ¾þÁÖ~mKÿŸ›TH¹|ÝÕ¨1ÖMÖÚ¨K`¶Õo-Ù^{t ÖM@kíÖxØq=Ù—mÙÔ¬•©¸Q ‹O Ë¥CŸ9Ó¯=·ë,ÛºEÓõ+²\—ª²h5žÈiCâ%œk¡]û”Ôõ\Cªø§øœD¶÷I›ë…}ˆg|?¥nü(|Ô½eJ¥«—¥ÝÚ]I9…Sá-ÞwEÞeSà=E7IlToç“}k–XÖmØÝíÕÝößÖ—Ùï½Wø&ßÿ]Ýb”ÛíT÷ÍÝ‹W—X ßn-Ý.à[5lûøE^àŽü­XþàÎáNáB˜ßŽ·ßÒÍeþQõàô-|!âÎâõù{fU0í~MÓ7®À8­ã¯ ¡jÒ â¤ü "âôì<úôCÕcjJk«¦m—Ô¢¦›H>k^YP±¸Ýâ% Qn\èrDHsÇÖ…ÄöXsx‚™År¿zE F` ±ænÞEùe`r~EtçpWö`yžçÆÞ;úr^®†dÎoa^æ{˜l+—{_žW„ala„bNróÖHtHÂ]Îèùfç`el‘¾ƒ–^é&År@ØryÍÎožžêU%p¡žèfè_.é†^ègŽè(•ºA½´Xâ Þ_aæ}…·_nzá‡frhHò'dV$¥„mZDm:EnÔÈy€Îî$þeðî}º¨}óîðú ,{!¶{I{§'ŽgÖb~~ñÛ HŸ'EÊÖŒ 'F{6àÕH-}7Fc”´Qydb†ñÉñföbéëÝWbÁEñÞð>?g¨l-<1/YaÚÑD¶4®Ÿ°MõX¬ã Û 1Õß ä=-¨ šÜP~=Æ)=ÊjÛ*=aÉÔXIöfy–`í^c³Ç‚é±þn„ë–‡0Ç„¶~„fØ-(ø/xn6Lzqn!§ø‰Ÿø7™.è{ï`’¯n~oé†e{”çº:ò1˜ê5ƒ}(%àyõ÷rØV[XUŽ…–Ñé ÿU.§W$7é™ÿK›?Jú¯OpPK¤ú‰ŽùX(è‘Oly?ùU…—oR5ËÆ;Ëççë»Gì™Uý±­ì[LÓ>E~xvÉ›iB)pR•mñϺÏOœ¦¨Ï}Ú]pG]ö¼í_±§x§)˜^Y¢îüýÞÝräàà.ƒÇ t(3bÔx±£Ç.ôh£É‡ªþ<ÈRcÁ–Ý‘”IsdÇ™9¾ÔùQÐG"+6ŒH”bQ˜ “\:NáQ¨‡NDÙqçÆž!J-ª1!Äx9œ ;6GÙ¤39®œ:®ëÔ© yZÍÚQè[¼[‰6å Q,L´+.l”+E’Wåb¥«Õ¯á˜_Éþl6pC§2[¶Í{¸ê\ÐŒíR…LšôR‚CÓ¦^è¹4܃"|Ȧ,ÇlÜ´}艥§Þzv'É!\Ï·ߨø–ù7Ù“¸5X=‡uì×µgç¾Ý{wðÞŽ'_ÞüyôéÕ¯g>üûë½}ä&B¾pÝz’hÀ ?nãzKÂ¿ÙÆÀ@T$þ2:'Áq tÁŽ\pÂÌ(C A$ÉB E ñ£ikÀûvsÑ7… €q¾¢ÑÆ ÊH»’:ÉG€äñ¢7*’È•88r1&S삾Šì‹Ç)}h%êZÊ2£-iòÊ–ÀÜñË!E3“ÉŸìâ@¤9j“K© ò éœ3ž:LòH%÷\©ÉºÎ„òïàÔq<ƒÀüŠÊ,õÑ­ëÜêk¥BûlÉÒÐmL£AƒÌìFAåˆGE=KÉí~l­ºÄ 5Ò$WÏt2РÖ,TT†´+5OTåÒ™úÒ:$/]rÖM]Wfßœ³G;å”ÖOc©Õ³þ7ùhsG7n]ÜOüb!®>’›á fpÇÜÝb8øâýn^yëuç^|óÕw_~ûõ÷_€Η^‚¹›MâÚåÛ`~#Nal£óáa‚áÃs6lÆ3æXB7î˜KŒINpÃ!yU6ùÀ–Tyfg fÀƒÃgb *YMF6Ó ejh£Õœ1i¢‘.ši¨£V,MN—ÍÔé§±vZkZîôjZ³{ë±»¦õk©6h±Ù&h´Ûzí¹ë¶;ê¸ß¾ûi¹s‘[VºÎ݆Pxââ*~n¹æž“Þ‚#¯WrʳkïrÌ3ל¼Éëo>=$þþ¶ýVüÜ8ˆ§ ]‹!ÔèÄCYÄ×K$1v”Cl½#_ç0w#ŒPCÒÇ!¸‡'t~ÛmºÏì›É韴:íèùÖ[úí :£¼³¯^í½_éòɾéìÍïÞú¥§??}èé¯:þîç_?jýkÅ_ü÷©{àÊÖl—†î[mÌ….u%çKBç*wA rG`ä`=x/ L[ÝÒ™p–8ˆ¡®‚Ái]† `¡Êìb03Ê3Ò,A·K™ Ã’}Œ†3«!nV$±Áñ¦‚½Ñ†ó°g?îµO€} F––¿J±~ûóÞh¬ÈE÷iŠÔþË"ø1Šm<ããÆ1êÏhÜ[ÿÎW@Ú„òùM U×›Å1Ç9ÉyÑtB˜ÁG†ps“¤äæ É@2yïâ;8›-O8-„Pð8IJ•òBµ[ðHÙ1WªÒuáá "ðq¢ôÙñK`S˜Ã$f1yLd&S™Âtã2ùLhF™‚f3¥yMlfS™ÖÔf7½™Mn~SœãLf8ÉyNtþÒœéD§áHÁH\—·Š#s-'‚ßx†Î wÉH<$hA9Ðy ’@ùq—@1yªE{eÊRYÑÖÒ@}þ%FkèC‹ÖL‰‚Œ¨¸bÔ¼8ú±Œvd_W*G2fï{0Å#KmS—¦ô¥*ÕiOsúÓ›ò¨0jPwšEMŠ€¤ •Ž;w掅%²qÉy\Fä ΘFs²Ã g Ô°Nâ¡V¼£ sh%ÝúVÎ!´;ŸËAÅÙTÓÝU\þ ]çÚ Â¿>°’Ã¥ñÞù¢µ‹‹elcûXÈFV²“¥le-{YÌfV³›å,cÑYІV´£%miM{ZÔ¦Vµ«emk]ûZhC—óù gó›z*qy»yr ¸.ä´ë]”KG,b\w0 Èü\ŒXŒC]ñéþ^q @$°ånw»Ý&ð>…ƒhíÙ3Ö]ô¢e¯zÛû^Žã©HÌÍÍ<)›)rm¨ò;ªOêߨʹ¨Díï~áhà4"¸þ¯‚¹8`þ8ÂNÚlE°- ãf? NqÜ%ÕEBÇžðÀ3 V\Ç%ÎÎ8⑎[ÇèÀ â³®;ÖÜv·“ÉÑýM@ j(ý¡x¨‚w(ƒ8€˜eN RÎÂY"”üLéüÌqX"¾›˜ô*,Oï¢Ü!™þ™Âõ ¢‚Œ±B+ìN˜ùBš±›9$Á±/¹‹-¥Ï½x Ô8ÛúS1ýÏ [HP•Ä!­Û˜[¼ý¼hÝP.=IQD[¤HÛ±Œ …[ \ÓhÒ5ÖáÓÀ%\<4\ª`;I\5ÅÌ@\\„QuIñ FŒQ I>„×"í Æ- Ç“¿ˆÜ¼°Ê­ËÕR¿%Û“4[ÕØÝØ=\å°ÁÉ€4ÁÏ4…ÏÚÄ5Ý‹º?c¤¼û.ž-TÊÔÌ‘^Va·XÈ‘%Y6 Ù4ÈÒ4®œð› /ÐÂÝ¡ÔHµÚÙ²ÈU’HÚ1ŠäÔø-þ¥X‚€Õáã™ ?+ëùôÖ³”ˆQÐ{UæXÆU« X”0J`Œàt} “| ¾[ ¾‘Žèàæ[ àæØFWT l5W¦ØÄ¤Jˆý¥”Êq}ˆW‹EáŒ-àª\LtÝU¾¬áÇxÉ‹}E·PamõJ©Œy}Å”ZÕ¤ â‚5à„5×V­Ö n`oõᙄàÆÕ¶Øfa‡-á\õXÑÞãN %YÒd7)ƒF=è­saY~ ûŠ^=Î ˜=þ4Ÿuc‘ ÁÏÈlô¨ªÍ¿;¢ú BóÌZ¦¥_I†Z¥Å!÷úÉ䑉ä0á9þFä•Ë=á8Ãdý”®<åj!ieV¶Ãœ ÖÄð:Y¾)ë!cÖcµ1aJ!JiVaæeeÅPRLeO©VT>LƒØáW†–_Œåf¶’Xž€UË5™ffeQê{Mä±hæ³kÖ )¡e|½Êdöå¸ ægƈ$QágÉDéSf]>Áæ ÐfUfgª¼Ü¯lÊ9br¦e~.gÊî¡Dµèçuöfˆž–yFhŠFgƒ˜­ì-Þíý@ µ±'İã`^ŒmøÆ?¶Þé¥Þô@iìÀ5æh4UÓá½.Õ)¡ŒÈ=Ú8ß«­ÈòÛòž†ß™TŒq™† ¡†_þšñ¡úxÙÑɈPb'2@ ¤À³A@Л@ª@ôÉÀ@Üê«Æ?­Ä–º)?„@°þê…Æjÿ«ê´Î”³Vë¬ÖÛY …i ýÌ£•ŽœSæU·Üø§“ìêã~!lÃÏŒéá½k 0…¡…SÔaA™Þx¿ÙÑ— ÏâlÎÖä¤ýì¨íîA÷ÓΞáÉì—ÁA<^cûvn ›"`ÎŒ•aYB} ö÷pðN‹ßf|£`†;Ä3ÇÂè.Çdw‹+SfðÀ3ÌžsÀ0™J1Ο'ÇZ@«A¶çÌÛD”oŸÆ­;7oÝ9~.|øïÞÆw#?Ž9þØÝ ~",8Д»$‚µiôv™ûh)ÞåøòäÏ›GyWÄN¼·c¿Èj&§ÛãÞÇj~ýÛùï×€æ7 h ‚ù…e_‚ö÷`RH …ÿE¸à„ù Â`\jx!†Šh „%fXáˆ6ˆ"‰.Âã‰2†X߇4¦øâŒ+ò¸ãŽ5¶ØcBªˆàCþ¨bIydŽ8ÑLƒíõœt~”L0%1_DŽq™cÅôÙe·±2™iÉ fH‘œ1è0ÄdñˆàÎ8Ëà(Çf ¼¹S¨¡‡"Ѝ ‹Êèmz4wå• ´P8¹§Í]þai0 Ý·Òv(Š^~#•šÞvåGÒ©ãáL—ƒÁ„ÝLíõd#”::Ù¤¯¿Êx2É+°»öXìv28¬±:*kä±Ò>+¢°ÄöZ-‘Ó"™m×jK-²ÛÊ­àŽkî“ä&ëíè²+n¼&ºË™˜F”Át~!Ý+9Ù¬zsXb|“ƒÁ"Hig—iKšãXÆXè„ +é CqhovFÙ™èhb™9HƒÌ2"hRNm;Úh ÄÑ œÌ1ã|Ú]z=]B€åðÝzîÍÔ©C!mwŽI­²zŸª@àªÓèsŸÒŒŠ5Ôi}µJQFÄ…`ÙmŠS—þ ëqSÀñÇövnÛö[\ÀÍ-7Ttß-÷Stï­7|ÿ­·ºÍb;íàáv;-³÷ ÷Û ÅCÛvG^7h“[þà›ûÍ÷áÛ5þÛä’ç§7ÞÂå}ùã™÷ yாúçõ9ë¸è÷Ý!Þ•§n$ç°û½n´¡“ù€¦Û:ï«÷Þºæ÷¼E?ºõ«¾»ö”ÿþ<ðÀK©DPøû—•îôDæN‰¦˜ßiÞçmûhUÍMù‹S¡& ‡¤ÀD&£ Å ÌŸrfAå$*ƒ‡º 5‘|ä9üòKÐ2²)7±‚L‘™N<þrŽTDk1„¡xhÈ­=-U«’¡Ô\¢4¼0Ä"ÁÈA &hÃ)j’ÛAÓDÛX&ãø[§(2)RÑ6Vt"hÆÁExP]übÕ4;a Ç‹ÁQ#pØØÆ4ÂqÃq£ãøÆØ…kq ÖW¥¦'^ÑŠUÌ"¥¨¦À‰Œd\d"Ëè:nõçZOì#—8HÁÒŠ0ë[#©&GÆe“gä#häVœ)ÆMO¯û µ˜IDNÆ«òä;‰IHn’¥„\%KyI^¾Ò—cb-?IËPš±^‘$¥ôt)½@ó’¿ì$5IÍ{Ð9€ˆÏ*…©œÌ "SL†þ“ÈÀ¬2x@– 'u†Ìш‡&(P(Ð` 5j ¡Æ¡‰m¨i­‘€1ÒÑxt†"\ègj6œ›A4gcãY7Í÷/£aª6˜²Ž"‚´­MíjICÕÖ´RÚ°#6L)ÔtxR¯©0=É`8 “<‰à&11¡ÖÅŸB1¨Wü)ÂH™¢ú©P,j}ù̦ Õ©ÑK—SÒô6@YÆ6X½j¡ÞÆ®Úæ«Y•XÉšU *¨iÙZÇ:=Eȧj•*P‡ªÔ£Õm³ SŸêWSBõŠD\\…ZW·u©0»\^÷úö¯R¦Z•ÉÒe5nº]YïªWþÜé²zíjdK«:éQ˜¸ôPb«ÕÖ†v2ŒMêÛø ÙÉF5·«ìjgØßÂV±Im,qk\ÉÕVÙу¾°ä¯~ñô.ýÒaÈ©°äVó«LÕ¦ÝT€¿Ñ–±IªI¼D4E„È€,pÆ@†ŸÄÑûîFƒŠÂ/“s4w„“ºhC¾©®p=.ÕH¥F*0‚ Œ/,é8&l ÷ÐÁ;äÓB‚aGˆ#[êT,îb°­"Ilæ.ILO±‰_ÝåŒÅË/þÇ:Näìl¨È–tAò銜<#Cî6I–mmMÇä·ÞG c1•_¼ÄþÓøÊü9¤•wœãD~¹Çkûâ‹»ìJ-ky;\öòŽ™ 9PŠù>ª”sñl¬EîŠÃt¢&éfÍm2µšÓ*”“5f“yÇXDs)Qég3ù¢„³eY›hDƒ¹Ñ5Œs|ãLƒ:Ò ¡Õz‚A¾:÷gÿ"ZK<Î÷=F#à ZÐw<,ž!@Æ>"¡NÑäï»9±_¨ŒqTj“D<Æa“t24Ú-N´û{)eà ¨aAXÁÑ™¬GS0Ù x>š5’>Øk^©L—Ön’DM$P눣Æn˜F-ß aNŠU˜¾q»/r nk“ XDÕ”’+xnÛð¬VþÚ·l…ŠÇ‰¡Šï-³YÔœÆÙZ[Ì‚´½€”}|X/¾Éá 78mQËp•7²q&øOQŽò¥‚áŸuy]q s(Ú<Ψ U)v7µÎ o*!ëXÇâ¦j3?¬amnלœy/9]ƒñ)Ó¸,_êÁÞtäþ\nÝšöÂÍçò«Àêû Üǘ15ÌLˆ‰ÇÞD@ô£ó<†ž¢²ÊĈ÷¬“; g°šˆD˜¡gk3T¿˜ß<šÈtjm“„ÙÒ 5"+V(¸#놰H&ü`x7xÁ¬÷ð†CBÒzƒ8÷´§pGbãûŽ8Ä;)ĸeu©»(±þÅÎ,3Y³ì|žù˜^þ`© (©ç CÁäŸÒýÿ§û×ÏOáå,u5Ÿ¿Ð$/,%AÍüM7?XTóå¢iêc:Îø§3Œw«Ù;ÍŸŸÙßô)ßmYõ©Ÿµým*}Ÿ§™RŒUÍd|Õ*ŸU™ªŸ‰$_•ñ’ûYÑã̘ü9Ú! þ}Ùn û "üÁ §` JŸš°¦|žªYÔ¥LÀÌ«•b ÀÑcA88; C%©¦EŒ^®(g¼D§wÚ’@çvލâxT€Hu'ˆ*‹ˆªèq®h‹Þ‹–(Œž¥‹r%‰¾(²àèrÆh¯è&¶ ÜŤB¸‡àŠ`"†bhäcŒ˜,Òg|JioL)KÎD–Ï6U‡`Ü üLT‚ö^˜š„JÜfI”m–©ýžH¸[Ja¸CÀ€›þüØ!NÔ]à)Z°EžòéT`EPìiŸ êTê jRê¡**Q$ê¢:j 4ê£JwЊçÍásI‡Ü™ êÁ„,éû|ƒ”\D•Fi©&‡©ZÛ½¤thè½ÂBØzèInÊI¤רj =è„Þj„’¯ºÄ8@„ñuǧ|ЉÙèwÖ(³î(>뎔œŽæèFk³Bkµ.k¶úè¶r§·bë·:«¶Ž«‹” d8‡€õBð`Ãpª¬ç3|¢*©Úk½ZÛ¦+LîåE‰æ7¡ÞM D@[e@¡äKzPÌŒ6ØC NyÇDq@ÅZìÅblÆjìÆrþlÇzìÇ‚lÈŠìÈ’lÉš¬Å Âɪìʲl˺ìËÂlÌÊìÌÒlÍÚìÍâlÎrf¢Í–ªÍ¡hê~`F˜hd¨j(¾ÞkÓ2íÍäeEeiÐÄ*^lǦð§PM¯â*¼mí¯~myZ-ŠÉDDOâ€ëµ²-¹r«‡"gÚ¶m·–+ÜZ«ÛŠëÛúµÒ­ÞªmÝîíÝömÞ2 ¾|ùèç…PÑ"ë–¬'bl‰X‡ÓRîÓV.›Db¶Y‰s Ä–FbÙ„§Ðl×’.›–nJ„íy`­Fn±&©ÜB ßÚíÚâm¸Ún‘L«àÎ.àþ­ßɇîíÖîÜî®ïþÆ®î.ín¯ø§})ÐúÅðU俊€¼ÎÒ6üÌåZn÷r/e †fÂYJé±O¬DœnêJ(ûæêúšiÃd„­°ña ìŠð ïòoòònä®òoðöoïðð"0ÿ&ðï/ðïÊ®ÿ/LI­ƒ^Dyõ&C¬Çãæˆ}¯÷’°ÓÎÄ}š¥PG•ͬÍØ„‡û¯ ›. —„G¢´Æ`8,ëÞ©¤q¤1žþ)Pñ÷é#qž*ñÓE;ñ[@q…]œ“}òE¿èàD2GMqiÝ-¬áŨ–pð”æ%`$®Z Ñ4ÄþMžçèÚðÏp'hÞÐÏCTåÿ¯ÏH:ðK°´žèo6p!'2Ìè+ð#³‹ +òÿ16ò"C0ò22ŠúqþZ–nF-è•ç¿ä0’Æ*æ›ñ*[æ¦`0y¶ªÐ Mäò¦MéH¹é!" ²D‡ù!/‹J#¦I³íÑÀ’ hF†—ôñ£%  u²c2\Áe'?36¿KvV³'k2õp3%{34ƒs‡Nò4g2vš35‹óˆ4/DhÓºrf¦¬ óãf—üz†)œ+û³*[P(ãç<_Ttá„6Ð/F¤žîéì!¥©ÌÛ.omk"%ì%eI¼þÐêry`&јqbîÀÍöd÷˜ô6:OJ¿Î¸œK8£s%;óúÁåH‹tM—ôMgNó¬´JwÏ[2NíäŽì5å I³ÎN#uìÜ’: î„ôS'ˆò¼ÍÑ,ˆUËŽZ‚ôñ| àõIçtåð4ô<ÒR;'P?õõ,Q÷ŽN÷4R§ÞK¾ t?ÇñáĨâEFfo¬q µ©IÂTÆ9D‚7ÄÃ0ü€bÒcæ@8Ã46r4Àj´Æ/P@8TA˜#0!@ÿó ¸2yÂÝ~ô¹zEz !rM않jË&/Ó"R´"2â®~œ¡¿™ 2\Õ’Pù6Óþ9’RQàpƒ’i=œ_’ÑQsÏ‘±tG·Q÷MU¼$'d·wT·ä7}7Úqo©³v;ufÝã)­â;Ów7r§>²ô2]@ÁÍÙo õ7âUf©•÷8U€Ð·V¢·-¦w*¹7}ß|·Ïq]ùxu·~ ·x‡·=xr#wø„Ï©õ«ª ­n~GDð5Þ!kb†<€@€4 CÁ書”F$G,ôÀeA°Ì+XÞg{¶£È) K ª•AFNìÄBcØ0ׯîP¨˜”ìO¥«tù•'¥ëë°z0ýF.:EÄŠÕ þ òÙ¦aÙ™iš¨…›ñ˜W ¤[•ÕViXé[õùYmÜŸ«Y†:äúU}ea½ÿÕà›/ZœKúœSºœÏÜíy’ñ˜ŸÑŸ÷Mz¤sz¥à¦Û9ùñRvzÙUjeÏõ±z“¹¢‹=Ùn‘c\-ò¦‡º ~ú›ç™¨sú2Úº ¢ ¤»›×˜œ+ûÍu^†Ð^¾Ýª‰Áë§á7 áEì™|Æ6È_n|ŒG®ÉgÌ ãmažäŸ¼Œ‘³ûn¸ò—iƒ(CJ%Ê1ÛGyMÓà²Òä»Ô=¨j³[—§Ÿ¯êòiæ‡ÒhD ŸùîÔ` ÕÜÂþUÙ ]‘7rMÑEÎgÙLê “½úÈëã’9ÙÉ›¼Æ™èe¹–fÓÙ•Å —Øq8nM]n%"‰ÜÓ5ÖÁåÕÜHÃ1öx©OõfíœÛļ:õ•è$!A8ÈE y[Ãå|}Ï^9ÕÝ=T ½ö©ü°‡ÝÄ7ΡýÏÏwr‡'¾Ø’?{ÕJnFP×õš{Òw´Œnm<@¸ Ç´F”$&hˆÂQhô¸;Ã4XË<+œä‘·{nÄ hðz°“çņ’¦j^´Rvm¾sëq¹R2(êâC/(„ê[l”XGϾik{šwàšSš]§þ=¤Ñy˜•:9ÿ#= 0ÿ~ˆßò ó\Éå~’©Ž3ñþï7ßÿµà²Sºþ`o0óø>ö»/}™ÂÕM}_⎣u:£Yˆ*™I§« ø©`Ô–õé’÷j…?§µ"îr ,˜ã`A °ÐáÈ#BŒxÁ Â5flÈ‘ ‡†9p$i2GÉ„Anté± 2iƒòꕜ¦pêÔù*‡=±†&qGóÛŒoÔ|Ë‘ô›L=>’Œ#xÀ32ûr\ÍáÅ™®šŒyé'¥+"Ó>»:A»%Þ~ Áªâë €Õ®ƒ½&|ØpþbÄ‹7füØqdÈ"ôˆÈðŠgÏœ›uæH’£òLÑSeV =ꈩY£¶  µjØ®SŸ¡ujçh»¾Ý;·lݳ!üÞÝûwìqËkë)ÊŠ´hD©æ&ãHwÓjïhUäö®"º#Ïмwõ幋gOÑ¡Eòá;Ì^P¢Õù·çïÿpüƒã3Ð!ýü¿ˆŒo"úèd"îCÃìZ¿ðÐ;o<í@t/Cö8L«¾%¬ðBr÷ƒ(­sˆ'ÄòF,±½ gŒQÅ…œ£Ž,ï;Ç3¤×HrhI’r¤ƒ¤¤±¿+ò¢¡dÐþů ÇôtTOIÅûÑE-!Ü’ÈO$¼îÌüPÄ9åTm†ús¦ –Ñì§Ìx²N*`…¦<”bÊ©¤¤ø3£ œ ‚a¸j‰x4‰¤+»b¹Ê.·ºbÅq‚h€£!’À˜tú‰Ç- ЃŒWÉ|íØ_…ºX|¸‰3œ0S¨Ï¤{¶¨£f¢í¶ä\³-0ÖŠ#ŽÚ[øq° ŽÜ ³H¶ÞÀeÍÜå¨K‚ÑѨ‹–2mŠ,ËqòÅR¡]%ì_Žø¡Rç3¸àVVx?8ß|X  Tx0…*N¸!8Ò?„6ö¸c¶dÌøâ] Òa(¼þˆƒìZ]ˆ ÁdÔwä€ûx`ýMøµðzFØgˆQZb—ivˆaÖ0f„cRgœwŽ™b†ÃëX°†Ül˜è–3x0Ùâ—ã—A†/$Zf{~¿­‡ŽØk|#Jz  Ÿvºis¾ycª-¶š`¦ê7å¹-¬ûå™÷­ùo›%œç…¶zœx§Šî&2K¶³ÐDÆY™x€ÜQj†Í«»tš}¼b XLLÂRg¥Ô†¨ð'ÀÀX@fÀ‚}~Øè¡Ÿ^ú«¤ê|'Ðýìºgi¢jœÐZ»mÛàŽ7ä`+¿[ÞÌç}uq#ÿµùþpß·ûiÃÿôIƒ•:‰’ ‡b¡ÄÉMq”›¹Ä5.®Hdà(Á Ò'Y™}¼&´ z°‚Lœ»A‚‚Tá QÈA.°B0¡ …vÂ-…5¤ámˆÁÞ°ƒœ! yøCˆ‰ÊÀO|¬¸C:z€U÷¤€ºH)…R–ò ŽÑF ÆA(L:bG*ŽœÊ`ªBÎÑF(ƒßŒUZwèªzÔÓcù¨G¡Äâ2$æ4Mh6“—Ö¤æm‰M\nÓ›ZZ¥ëô€½ey®‰ñ’I¥ H=E)ó‚Õ¥f€„xLÀ¯À6ˆ‹_h¨XBŽÁäLu]y†ºâŽX¹ãMpFøŒ!F0}Ôè9ºQë e‰N$gÜaD>ë3”ÁµÒç¾Üô/}0iKQÓ×àO[ý“_¸tZþ…ËZ>ýé9œ£ªPf^ã<êLZÎkÚP™Ú„FÁFÕ©Cìå/©ÚÔ«ó™Z•ª«:Ö¬êœþQíªU… V³J3¬“[“éÖ³fó®k5+V‡© š$ñ&#]Vö,pH¡˜Ô¬;CSà9©?j`ßpÂá„mL$ï°AÊA†Ȉ‡@Ⱪx8¥UGXaŠ}TT€†;ˆ`v··•^0†RS4ñ';ñLPNšEÐø ½á©kF©Q¦&\×Zr™³ÜPF8Ó½.k+­èÔ„€Ú°P È[^óž½éUïzÙÛ^÷¾÷¼]…ï|é[_û¶Wæ•ï}ùÛ_ÿ¾w¿ÿð€ý`Áî5p‚Ü`ò.ØÁ À÷6gÍj3@‘N0`…Ô©Žußþ«ŠaJåà±d‰9Þ‰ƒ˜„Å&¾(r[cÝÚ¸WRÉÀ ¥,Á–4Hýî*Mª/‹§6Í©’­[SrÕ¦É/M2p˜ü-Ú„Æ4ID) ˜V»òõËaöò˜·úÔ¯’y¯bŽë[ÍÜV4ßÎpM󛡪æ9¯9Îm®ë4ý@¢êœ„Ü ¢D¯FYžßÈ¢¯2ê˜xTáÖª`GßÓ—n(‘ÅÄdafܲTØI”`@OÒÕKŒªQ,š|Æu®T¼´Á[ß×¹Öõ®yÝk_ÿØÁö°‰]lcûÖ‚@ö²™Ýlg?ÚÑ–ö´©]mk_ÛÙÖþ6æ5/sŽÔs¯U"‰ëƒÓ-…±P‘§CŸ™Ô>z/Öt¦émãU†t°ŸË +R ¨“š¦2Q8’ nÝ‚|à ‡@÷úÀÑ•t>3žÁ,q7Sü‡¿Ì38å çŠcÜâ{ùÈï\rÛùä!¿åÇM.Â?žRø.†A#bBWÝWtl)£ç˜^Õèózb¬‚Ä@‚Ž3Cµ;.k£ü áQWøÔ¥^u…;gÖܰ*»Lò”{½Î*÷&˽©q²‡ìo¹Ú¿¾ö‹»]äp_9ÊÑ.÷±Ó]†‰²Fú[B–»(Až‰;S·º¤tO#n·¤y5tÇò\>Vþ†™%XÏ„Ïß(‡TpJuÏ[ôŸç韨eš,êOzFkÚßÞv××ýõr3;Þ[{Û³ýöµÇýîußû¸ÇÞ÷s»âÎ.Ã>Ç:¤Á ·çÜøê„F±…gü¤¨žÃ;2üö1]ôÑ!k3~Ÿ¹!µNî™è!ôé½úÙO"Cgœ( õÇaû#Â÷×?|ó[Þüïáëÿ×k õK" pп&ìåŒ.3Â-ÃtÂŽ<,çÍæ†ÅÝOûFûjÌ9,c*Y,Àï.RF{d¢ýfpýj0ê.|¦#óOsš*÷~ï]I¯€yþ/q¸j®ìŽøho—†0ïnø¶Æ PøX¯ “«P ¥ Ÿp ùŒœ@*Ã+Ã0È6o&¥%eÑZM1~®IP÷h*)ü4ãsš…ébM^`mtI“² ~´+Êd“@¯‘(i½¥ÉÊ(’ PJ­€I ³ ñ¬›¼™4Qƒˆ$ˆ8Q¬,Qq2‘ /q +ˆƒÏEQnR±Uñ 1ñK1µénùðpY@‰¯ÜÎ)@,)\§*lL2âçPztlPšHY°¤0Ïô ­æÐ/:o8¬…|ΧÉè?©àÂ}¶~¶‘£úNËþÄ4„âþî#%à&5bç_´†ïñf2†<âÆ †ÿ«\±AqõnIãpèphäIè‘!÷"õQ"ÒÒ" œ²!R$"R"Á¦"Gò`ø±#6Î…JæbBìÑ#E²$I²áL#ëq#]anB2)r&ƒòÙì˜TÒ(92eR)“ò'ûQ( ãosMù.¬°È)}ç‚Ñð¾¡?ã¶àP“‘,#ãð Ã>gé • mZj#¨ö'j[n\¨,. N»i.-i¹x#•¼k•V†Â^`1Q"Cô¥;S<“!ó%Ħ (30&óþ%²æp8³3¤35$4AópHÓ3?s4S5ÿ1ã<ñ6W¢1=DCh2kó#*33Â2-S3_s%b“;dÆ6E‚8g37/“7wÓ$Úæ7SmR@Ô¦3æ2÷%9{Ó%D&«ó9ƒ<‡³j"Ó8Ç7™S7—Ó#œÓ®ŠF8“S=nS>‹3;ÑS99Â@n±·<­Ç6ccat:lðížAш ËRAÇR1tŒÇë1#±Pˆ1}`|fÃ! Ì™‹‘xcC_ƒ[ò²~Ô§\؇}¸q8Î16Îð¯üt4Çe|„FíäC ÆFnTGôCOz4nÒ #XþåE¢?6¢H‰ôEJ¢H•4IªIûcM”&F¢t bäGË,NlTK£ÔNrtIvtGI$»ÃDÊ%í£F³„FÇDG®äK<’"|4`ˆ²KlnrÆJñdM¼Ô<¦„$È”G¶tHíôËf”P×CøKàIzrL•DL¤PÓ”R»G/5L÷$P!µO°œò-Ð2à ©Ï-E`+¥ï¼r(AÔUÇ2ëèîÐÓB ðÆ)0i¢[:t“‘8êò.á2…U±.¿18ÖE9iUK'þ^-||à0áó%’³9UB#°õ$\âÚFLœêµFe“þKÏÄrñ„gmÔ8WrS½dpõVCUkpÔQ#s?B÷`DTO8ö`¿$Aâ‘pƒ‡-öTD2j^wßCJð ƒðv1EW!H×HL÷_Dts{wÙ#)Îw5yûörÿ´r;—CªœøŽò‚Ëàos .ú„q¡R 1Ë+4!ª`\à1ÒÜáœaP 1X! (Üá(  â!LF‹j·*ÃÂ|ìÉTïþÈÿ¨[úRX«l.yUº†5“¢«WQ”/1X™k”Pc&8̰ô®Rjî0ß³ZS¸gû`—&…s–eOrR­F†kx^±u>4‡BcóþænDÔ‡‘ˆé•E`¸dU˜…y¶…7$=q…QÖ€ ³`çÕeo¤6)– iKu&Ö1+w5/I”#¢óT4¢Î\☵±BäÖnÕI:Þ%|ˆ¢H" ]ÆØoªYj®YfÛ¦@²™›—׬$ÆpÇ?ä ]þÆœ/óc ‡×¹‡[³(¥yW¢™š±pîYrZ9x»y>Ø3#½Fžƒža—:ý4[¥¡úR.e›ã¦møÆ@Ú³nžäpDFž§9Ål&ޤOY“5_Œc¤Mþ#šš¥¹¢¡&x©“ÝÒf‹Z›ši"š¤il or¬9jvÚ¡ù@²¹æ¤2°zb-'$o*Žj(RuKg€!Kaª0Üaª€1Le‹Ð"1Œ@VnDZeHàŽôù•Óú1ŠåSCUY<ÇV¡e0Eøk…ãX»¯ƒ•ËÖ‚••‘žŒ}Æå®#XmùÇ}«Ü(ÌnAƒþ(q þ¯lˆ ›7Qö\Ó ²²QqaѲ=›³»&!û›dQ´?ûSû–&{´7NHR.É'ùÃ@g€i•"Q>ƒžÜA`ÅXá ¨!Ð!bÒy¶ã 8B ï¸5a;ÂZaD@Ê•«V­£çz²÷q‚ßíE™Y|()¿19öÒ8Œù—'"C‘̽½1˜©«º$P ‘ˆVK|е’C;³)´#"!;[µ¼ÁG‘Á5;Á \²#ÜÁ%üÁ[ÑÂ[{Â#û‡Xµ1…ŽoœdBIŠœþ{©“b±®(Úp‹¾¡öX…Ì׸ þb´@U@k«W.r ¼ BBö¢/º¼Ê¥'„3@U0'”Î(Šk0ýp‘hÃ¥°Ñ° {ÄÅÉ*°é5XÔÉ^êýšÌÑÄ1}ê›þÒ­žê‡¤Bn9Ý?Ûrõ ·¹’uxËn‡Z "0X¡ªÀ*Èh"+n]º½Â ÚÈ6”a*6âaÄkØ‹ä?Ê2fn¶%TþÉ)•6o(ZzèVíÒ„Eò#ZÃý IcÛ:ßó?ßó• ôGŸôKßôOõS_õWÙŒ…å—¨ï('¸÷°¤ÑàQµuúLª âì)º"XöA’Ǿ!â¡ ´`¸:¤`¶¬â¡ œAøT˜Á¶ Ÿûã,”1 'Ö’{{}À£ìÉÒ_[Žæi#ç‘+Ë¡%W»NÑÝé“>ÿñÿê'Dê à ° Á‚ í´Éeg‡¿UR\È·à†+î¸ä–kî¹è¦«®¸$´î»þðÆ+/º‚„Û.Aóæ«ï¾ëÞ ¿ °¿lð»¬ðÂìºËðÃ߀f¦ÁÊædl¯°ÂÝvÞ•*‹§¦z›Y½–¬ë®(›¬rÊA²’¤JI›SNRe&²™5%wÏö|œÏÒU'žc¨±tÛèÒ“**¿íZŠhONOªçÓ Emh Žþù(ÔMsg¡ÿ-u×d*¶Òi`ÕgK7ÛJÏmwÚ?ýªÝ’4wêšC€ŠænUj‹c³¦¬®ì8ËGùä›m×á2;)"mã,›[‰$c§qM's§O‹Pr©‹Ùú8«û–Çn›i¶XýZ·þÝp÷¾v·h½u×¾SxõÓÁ3Íûïp_|ØÄ3ÿ»ó¿-}ô]S¯üðÛ¨=ôÝç§V¹éá¡æ~?•ÃÆ&vNÔ7\}ÖX"h¸åøK®þüiÕRVTÆ!£Ïå fXñœì2ÓœÙ-Ñ:rB-à”΂€^§ADÐs7#Q`V4hãíÊ ¢Â°p…iaBdHÀ†2H9°ÃªpRùÞò°>”x)„á •ØÂ²¥†?„â—8E²E‡?Äây˜Åæ%¯‰#gÅV±ŒV„H¹¸Åzñ-ìâ’Ef‡eœ#þzv8µJiOŒ#§8G)’±kÔ#âÆé}‘‰t¡ÏHÉCZR‹Œ\cG¥·˜õ }°AZš²²Ã…Œ+;KÿV¹¿V²ÙaÒ°:%ÎÙÆ€Za+r³ÀfýŒƒ°+ˆ/M—Á_`˜Ñ™]ê€)d6gCµ™w´a»6&°KË ³yMn.‘h€ZÀÉ–q†Óœåd˵¹ÎkªÓ7lŒÑÒBzÖ3ŽØÄg>ãhOösŸüÄç?G»‘zŒÙf<ÊNo®ðœ.„(9ÅÑtΑï¼(<µùÆ„† ]èCÓINµèv褨F—¸3Š4£oä(CþT(O–¾´Ÿ'¥èDÑiRjR†í(‚ÐnⳆÝ|éN+jR¢´¢*m'Kƒ)U©v4©!ͪ;—ÊU‰Bt¥UÍè?÷¹ `îb}sŠ) Çë`'ð›ÈPõgÍ•x}e^÷:¤U JP"`¨p6²Üõ&8çðà9¨Xá$v±d`AÛØ BtÅœàb1‹Aã$6³Ï‡’v¦·íŒiIŒªEØÓrŽƒ=}mla«NÙZÔ¤¸½­nUÚ»v%ô†â”g9…\¸ƒ‡ò<.G•›\ä—·1©8¡ËÛ-/"©m­j·»Únӻ؜©mUš[òî¶¼½#n£þ«ÎÕº¼¯5.!¿[ò6º=ˆt™ç[V0±º¼!s¿+ÝÌV¾6éWíkÑô²v¸Üm¯8Ç^‹—! NˆtË«_ëö)»Ö®ˆ)Lbøz7Ã(¶(¦¬ô×¾AI”÷[–7¿®¬jGzÍ1_wüÊ_yÈŲ ²”ÆqKL•¥€FYàfYwL%K0˜¿yrpš©*‡™|Ýê˜|åˆü†;ÊY•xãkŠôšh>ó7Ù©Üwr1že3XÅJç»a7žŒ‘âq©¸ç‚"7Škyb u¸˜+:žu¬‘€9ê§#*MÎN3F›¤R›q–t1úR;UÍûD*¨]Èþf6ÆÔÁ¦€ ¹ÐN×0˜Æ*[ÂùÃpÚôϧFË}×’ján´¦éѪùaPÓSÔ&5šQÍìRž¢vµB=3GÔ[-u;ß\iZkºÓœÖæøts›ó66 Ê–Yˆ\ɵ-tµk,"#Û[Çø~\çŽ,×@É5R¬ÑîgÚ^–² Ý ‰³ØÊúÆáˆ¦=+ÙÌJÐáŸEŽ7.œÓVipH>a„Õb’®Ó…­/ÊKnÞ–g8½ûå-Ab^`ï.¤æ8¿"‚ë«óû¼Ñw1ˬӓs;¾kºËÏÛ`þ޼¥Jç:ãËêDv‘Ãzä°ÎsþŠ¢¦ áíl§þÂ7Ø¥Dy±£þT’½¶e‡¢uŽõ,j½çNW:ÑÓNêöªüïQgúvWìcPBÅþ†ñ”¶£‡TÉÏEd1­*ïMù|[>W±|ÊÅd6ÞàòWaöÁQÚe‚6ãLvf0¿dzÌN¹É]NŽ–„3Ž_¹UåÃ;L›ÚpÿzŽyÖ¶›·VpÿÞªNOäo ²üÌÔt¢ ±u°u}û·Ö§ °þéâûø®t©i Õï{ÿ÷ëFëüe¯Ú©ß$ÿJ£]Ux:xÕ`¶ïãÜw8—ÿÞ§~+•~£6gÎGi{¶Pð7R•Qô'€ÄÖ4½w|þì~mæ÷i¨f¸TKñIè6ì“@†ÓÇ0r%—·‚•ׂ@Bd0þ@A&XŸw4Ùád ÷pôY Yq<ÈzÑYUŸep¥s#t3¸1BÁ€de&`T—UØ]‹6C»¶…U´_VÈH-EhÁ„\°æHœAh€¦hfh¼ÆRl(]4ehІhr˜h[w]ÕöEXˆg¦v…]ø‡hØ]·â…aH†`8†_HmÈcM¶U#}hj€èT5¢kkk‚†Ø4‰†HQš¡ˆH¤‰†ÆõlïÄk0ˆ‘˜‰þ¤c؉hè|‰øF|È’ćYhi'5‰a‰bèþlš˜ˆj኎ĈH…¨…‘ˆhÈxˆÌØ‹VO¸ýö$@†4$äŠW&o©¢8G.Ž,8ŽkQn£yÂ%¤…-m5*^àz›eV†Xdq˜¥zX–çPwq°'V7qÁfDÆ>zSG±;Ü>i7BôCTDqPÏS‘I‘~2‘ÖCDé=É‘i‘~4’%’j“=(¹’&iU¢"@ž²{Ót-Û!ÛXc‘wŸa ç@ŽB)Ž{ÅK13èÅBX ·{0„‘„…aYÍ4Y ·@ÇQ„wpRé ·ƒ·Ð!£µ>ƒþ#TÂ&Õã’*™(Ãø’nr=â‘ké– ©‘Ù’v —v’—uI5rÙ–=á‘l‰—$I!„¹—‚‰!O˜›"´ä$ìv'2B4yÚaÑ" Ñ §ñ+yà Ó¤Ññ þõ ÐU°P+ˆ6”¶¹2"€øoO¢ŽÆÂŽ ç>"àX×,ÇqühÅI]æL™œÌœ^iò–ÔɄڒêfëÃ-Y)Å×"a6‡©˜†™ÇCž)yž…ù&êÙžëYž<ñžæ)Ÿà¹6ô ˜wiŸä‘Ÿ÷¹Ÿñ¡!ê&Gébiõ îÀ>dö1ÜÈÈRoþgˆš› ýQ2° îà P ¢A¡Ž¡AP¬pÎÐîÀ ^G”·™2ÁÀo´D“Å¢—&ëã±°Ó1{ÎA{²·•À4–c⣴—•¤ÂÑ„f9B8Ó1j 1RZ0 3¥V /õ.Uz¥\ /[Ú¥`Š._¦d:.cZ¦hgš¦ï 3Ó(3#8hi™;‰™Dƒca è0¢¢‹±¡{J~ ¨ñ ia áIƒc.©C’›>p”SÁ)h… ;c@#ˆËòŽÔ"4Ç©ýXAˆ?#&ÜÉ>¤&I ð«õŸ´*«ÙGçþ˜ì9«¶úŸâ)7ü—°Ê«ÄªŸ¿ )ÁÚ—û! Ó!œ‚”Âb“ —£zàn,RcypW¬Ø"šPiQÆÀCÀ ]šÈÀ š&%¼ä®Ÿ©Ò¦ û€—Ñ¢/*©E²!­¡V´Ô79…%„B¹°B‚4•)M£…"ÚÀ[±{±›±»±Û±û± ²";²$[²+&›²*»²,Û².û²0³2;³4[³6{³8˦õ„dŸò r£bJt¥*mmñûô° D;¬™Ù` ^ÐîÚñ…|ê î°Þð °þ3®ë¢Y iñ¨ýº¶˜'£³™¦@9à9#3MÛ²£¦š·¢ª·|ëعn2FxÝ1X¸Š7ƺ˜¹:¬‡»«·Š6…«¬µZ¬¾Š¸Âz¬^ø“‹¹‰k¹†›¹ÉÊ't’{Fé³½)¬-»ƒ>À <©­¼VM@îÀ A° &ãÀ KPš@Á(1g¸µ.3Ùз›T éÐñ?â¯lK$Iѳ³$36ج;{?E¡ª··ÞÛ·à[¢5JäS¾Qh“¯Ê¹ ºš[¹” ¹4áhºú¹À¹‹K¿Èj¿ž«¿›û¾ì‹¿— ÀÛ¿gc%¸an5óoÖhþ¤D*wJ?Áù0 û°¡¦/°š ¢MYkR§b…90 ч1Æ€ Ž ‹Ñ ½¦K˜Ó$ÐªŽ yƒëvKFú½<¾àû·ÑdÀÛ¡ ·çë;6Gœ¿½JÀœÄyâÄì¾í ¿’ËÄü+ÅMì¸ZŒÄ[Gi1¥û Ú™&“y™\‘䡼V ýðþåçpÇÌé@ÁÒÀkÊk[»wŒÇÀ ßiÑñ°¯/ÜÈ©ñ?2órªŽw°1¶>ÜÚìÃLZZl&kÒ-l:Êjê0¤Ü¥Yú-kzÊWºÊ¬<¥®üÊ˲Ìþ0´\Ë#Bó3p %q["‹÷>ÛxJ3 :$³™R  0þµ¡âêàß Up &…ÍŒŠaWìjRC^@ÔÀ Ð0 Ò$. ÃŽü±”Àþ&qëyFœÙѽ™|Ï›¬ªÛ1%”šåcVáWLÅ÷[6Yã¿õ»Ä‘ž=Åÿ;ÐãÙÐYÌÅM7n£Ð½¿âŸVŒÑ½Ñ Ñ ýöÓ¬fEºOñ»„ƒ9ùÀ6vZ›y*ÅÐN0¨l¡y±9Ðñǃ!š†Á¨Ù‰ ™‘Q$ –ñ¼ë¬Î‘²$É“ŒÆNÈ”ŒC%£YÉ”pA„þ'q[=zbÝ£e£ sE¡–êûŲˆÐJ\Å MTzYÐ=Òƒ9× ×m‰I×zýÑâÑ×yíׄ}’ßÙÑm¢ë‘Ì›é–JCëÒdq´¢Ñ#Ù‘’íº“ó*ïpJŒ`+¢ÚVhK™¤ë×[ZÙ d£4Œ•¦*qøAIªX_Í•ž5¾—<Ï£”í¢wî%R¯ÕP”VäÝôf fQ_ÕäMÇ’å%å÷4åUnå>…åePr}B¾]FæIæL^æ*åä2—Þ_®]bþ]mŽщ_¥Šdæj7)ÎsT#7uMEæAæuäŠ%T?7Œk.am^o^‹r¾Z‚nç†çÁsè`…än>æcéˆ|æf^·J"K‘9,N)yTâH0ÌE›JÊ2«h!þê¸"þ:'íbï *òüy'òYýz¯WLÍãÔyA® Öû˜•øhzÈ4ÒM¨=Ïžgm’íg–iÔîmà´æWgéå21T\ÀE¨ß.\°%îàŽräž\­–fÓµ\­é•âhÐŽmØVínfí¥Xv±&ï×Ömõþïp\ɦ…Ãviîn(íâ_ %OÈVS˜fïjhí^§F¾FG¿&}É'íý¾löð•&ðßFÐæRû¾ñóÞñpñ˜í % U,MÂ) *U‚Ç¢“^Ñ ò6J"ëMm£• XsÊW·„…òâʾpJè•–[Iª9ޤG8ÛüXY!ãeþ9 Zê æv|G`~—r¹¥ä‚—bi^lïMQ0T#’äöZäßî=÷uX÷‹f÷\Þ}CxbÿMdorg/x3'àèvÛÄ÷fŠÊhba_–_–w•8aLäŠ*xpw`ÙowmHt‡ö‰Ï…Ïèæ‚_—ùÄóõ{·[a7ö²ÿvKWûå¥ËšâËœG¦uÙÁÆ66­>ßóêLÚfœV¶¾oј¹Þ¹eT/;—:>¸ƒKÿzÎÉ:õøë÷ˆeÃôœ7­o%fG±3Hï&O|ˆköm,ÿ}ûžÍ7ÿÏÇhΆ®úoñü'ðÎïá@þæèŽC„6TÈðà‚!LˆÑàÂq<àðÑcH‘$?šüx!£Á]ZLøp¢D‡ãrī鎡;›AbÔ(cI‘?‰©rL—[ ô(‘ƒÍ˜OeÖ$¸¨Ë‹Z¢4z²(X*_Š<Ë5&ÍWÚÄùV'ÁžCJ 2‡Ó‘cý"M¹ÒgZ¦!º½Ú6mWÆ+jÓKÉz2Xx•3æWœ_å&‚²¶¬"ëyömÆ3ÜÍøöìt¬$YuÞ¶÷nݽyÿöøpáʼn7žùðÓP6g6¥9sæµ}ˆ®|2í”}Œƒ^$xòáÏþy,?îÜ8ñÊ{\Þ=úå÷ÇÏ>ÿÒc¯@ð® ¦w°ó;ÚÜ‘L•tˆB‰,DC4ä0öxª°!C$/°Nü+)@üÉį€‰Â‘dŒ¡môˆÅùZ‘Gû,,)ª¬E<²ÄÚPÄ&'¢P§ ;ºI “”ˆ*ƒD±¨ ‘¼°£+;<òɽÌǤ(‘ IÆ+µ´±K±‚4²J%{üˆÂ'yZ(ªobrܳ͟¡BÊ1ΜSÅ+ÃÄrÉ?Ë´0ÍJÕ”tPßDRHOå lL+G…ÒI2¥ÑNU3¥AÑDŠW¢‹þnºè0[fÁíôH‚ìTû†¾ÉXkS.Ùå”evYg›…öÙgƒ™LÖ[;ÃöÚê@{U2o'Kb=Dˆe/ÂóoÀüàÛ¯½ÿ>Šõü«¾>íéýþ½}óƒ ûí©§ozòˇ ^Ñhá磟ÌÈÌ1¿Ÿg²ôŸÿ7/Üýüdzö"ñYJ¬–?N€ 5·@¶EÐ `É $2NôÔ-˜AªQP„Da ýwÂ6¬‚áþ.xïÌFΑά ƒ­î8( ºÒCí†U,þØkxG$•˜D&ê&”‘•-p-ä5ÏA©Â"#¯}ä]"ù—«·//r±_Ê„†T!"û˜@’…,Tä#©@JR0¼¤3 G‚’€Ü$(y²Jzr’‰Ä * 7ÊP~°•Ú`30„×aë9Ÿ vJ+H6Â"–jò0Þ-јMDæ1•‰Ó\ç2È«%­“:8г<^˜Ìƒ"ã*köÐ|´$+õ‰É}þª$$.4e+÷©I2ÒŸ| è@?)P’ ™\è@#)A‡ªR¢¢´hF…TÑBb´£ %hF9šO.ôбMm™<ÖñUÁèÕ«„x;ÕØ‘WKfN—¹S"“\7Ô!4³õ wÔ&—6ÔŽÂ$CöÔ§]¢—}žŠ½vBµ]೪SéÅF{•G`>Øå®¾•0nÝó@kZÕºV¶¶Õ­o…k\å:×µ”®wÅk^õWA¨Õ®{l`;׿Ö°‡la»XÆÊU±…ldÑúXÉF‘Ÿ3§˜¼kq&~Û¸Dƒ;Ö6Äì)OU›ZÖ&‹2Á`ÝòvÔWŒþ£6Ϋ¡·n«‡`dóªêDço}K¾à®S¸Ýî}We,·óLZ µV¾B­ñ\¬ÔÔ0\Qs&`1nlãvGª V¤cÃèmƒ¸&èЄ@ži c":Ö-±w÷~µSé°7KáÙ©î`·¥ÌÀËÞUå |ù¿}•‚žÇu-²û¬•Å>c)›}îÓµ¯iþÝ~÷ÅO×ðßüo-ÿùÕïן¬ßýèoÿû{Y¤Z&¨T´%ê¼.™~™¦²Y»¨ù†bØVpw0MˆcЃq`…}Ðp€h눠Ó)X w˜€¥Ko „€‡¥€p(‚À€¨ó½4&Óà­•{Dà ÛÚ:Å»©qé­æ{¾áÒÁ«ÚÁ«j.ÔQ;´Ó|<ë⻩#$5¿£8ù§ÂCB'L¡%ü»+$¼ð²Â, 9Ãc¨-D¼Á ÃC/¤B¶‰%o±:hj¼W@:è!ÂȘ<Õ@‚Q¨)‡&XžÈ =˜ 8À%¨MD Á€µq=w0ÀqþЄm Ù“cH‡~ˆ‡hc·©ÃDÖ*4+›­ü*ªq²P” é[*}Ÿ5:Å/JÅ«â*.»4jÅ1ZE{±Ò˜¾ìè´=*%,C&œšNâE3”B°/`äB_t¥2Æ^ Æ)Ô¨eF1ŒF‚Fg”Fk¤FBÆìB¹ç²?–³•ÎÐ?p±°É˜©0“‚y‚)Þ€i‚Þ@‡*¸}€e ¤¡› w0…")‡%:w€c@VHADÈcBÖ1… »2E6)ã­ƒÓƒlJª²wY.ì'UT¾2êó±ÈŒ¼—Óp.µC6]ñ 0‹¹¡¹A© ›‘Éþ¬¡É8±É–ÁIÉÉòªÆ&Ɔ«;Rò˜4JÁ¹É¤¼‹šäIiÊÄ‘ë Äi‰˜´J¥œÉ¥<?ÑɾØ©èI©ÔÆ¿ J¿°I­4™œÄ°|Ê‘KšJ—œÁI¬<ˬ¬Ê®¤I a˨„K«)ËÀtÉ»$L¦Tš¶ÔˇÀIý EjÈlyŽ\«š§9L ùQgk~`³Ü€‚pXŠt˜†}ˆ9DyÝ8‡Õ<eÈeÈ—q„xê©LÄM&òC GÏp9£ EÕÑ.XÉ8—ö(.‘t—œÅêÙHñQ—.ZÅy®ÊÐ"®«Œ°³(*éþΕðΉ  )϶(ϩȵPÏÂ0/NBϬYËÉÉùœÏ¾™Ïø´Oø¬Ïü¤Oý¼Ïù4¯bšž€›¦OÇ@Ï29ÏMO‹`š`OŸÐïôŒˆðdUPÁšTa Á*¹ mɽ ›‰iŠúÔ‹BIPˆÏÅðPÇ Q–Ë ­ÐåŠ5O=OŠQÇÑ„RýK¥Ð%½PÕPòÒÍ mÒj’2a+6bƒW¡È™+-"úèù¡Àù$ˆ‡ qCdH†½è‡ è†*8 ÁÇÕ» Ù`ºD¤;‡& V€c(Mfh·Ü4Tàþù,*k¼[Ú VPàLÚh&Ÿ6âHñ¡ª6ªÔ{!Évâ‘ô¸KÝJ;Ò-Óˆ ¹Q©K14‘UA¡Õ©Õ$I¯ ‰ŠŠ éU^ÍŠV–ˆ¨(ÖÁUÝ”dÅUE)¨"q¡3iU+Õ ÕX½ÕŠq[‘\%‘¨(PV©Ö3¹”KA”[mœLAñV;áU¸É_µVsMa%×! tM£àòjI\µÖVוÕsåVMqËuíÖíúWW]•¹ÖyÅÖƒÍÖƒ•H5ªZÚ !D¶ø0ÿ ³Hpy6× p‚X…xð†d€wàþ ˆbð€ÔËdø³xˆ‡”3–AºqX†}¨‚p hp‡¼Í„dÚßÁŽàÇè(ªØ6“Åë8Îîq£0âȹõØZ~AÅ3j§t9E0Úª³-’õÈΗ»EʸN] {5Œµ8 -ŒÆXÏQ(î\ ­Tº\M›•™ ½H\Š  ‹Q¼ÈŠÇ… bµh-ÜÁÀÜ™¨Ä€Ð]Œ¡˜)uÖ’’ÛÁqºµ¦éÄÐ[µÐ&ýÜv… ¬ˆ£ì\½EË´ #õJ§P‹‡pŠ»à †[Š±Ðº ”ÉÛ®€‰×ÕѽmOhEÝéíÑ—àÜå¥[¾eþÏ”«¡5ìÄépêã/= ­š‹ 1å ºà‰ÝÐSÞà¼XÈ ß8ŽÛ8ÈCµß۰˨· ƒÈàdG è$Éó¡*Pï¹Hrª4YÎLàQU'oÒ”‚©:J¹ãÓ†‰” vU)a 3™”@!•ŠUX\%Þ~EaE¡‘'¹‘“Xa؆a¦\é×tÖ2ù`2aɘM¡ØÑE¯/iíàV Sq’Ü™6e×V”½HÜx”&Á x…ØKa „-á|]ñÖ+¹aæP Ùá%Æ&>Ì'¦â…õW3ÎaVâR±c;!aAA)‹,mŒåXIå¥9þ,¢¤*°â(Ž*¨F° Du‡w¨‚¸¸ßI^ŽÅË!D³7àŒHG{•¬EWÄT‘ì²€àòÔýÎë[®%«:‡Ñ†ú´ì,=ø×¾¥Ò,9V‡èÜ^Ö^Ñ­ÑÙc›Ÿ(æ(f²‰ÊÆUæ“`f‡É…fȩʵ `V‹Àµ^_ÆÛ`]læ¿Í ãæÀÅÝm>Œ§˜Û×íÐâ%^\†‰ÝÜÛ]âÃ8‹¡àJõlŒvѪÈe„0g{žçtÝ{Σ Œèõp.ç]¾[^¶ç_þç¹Ý•c[CL~ŽðÅEPœ®sÄÕ!3ã@Ž¥ý ¤ä“Ž«µ •°þϸ-H£Ôëi'~—`›.|iŸÖi>`kj&TE6UeU#íPx¥‹UšŒê§^Ìॠ·ѪVhZ›ÃU\°¬âœ©™°¶Èýê²Æ‹%%•P¦æ®QÝ·NÞ©×¹H¬fÜî"ʦ¾›ÔëÆ‘äÕ®ìßý˜Á¼¹Ñ—dc»aܨQÝ–9 »(âlÜ¥œ ˆ`ë‹ùk¸fÁ>›¹ÌÓÞ$Uj!]j§ìÑ‘j«¦ê«Ñ¥„éã ŠÁäù,”š¦X äK*”î¦^š¥ü¢­ßü¬ª½ŽPó®UNÁT5â8¢þNVÆnû(7ªîR~#ïÎ& ã?o„Û}3ÂfÊk䙟Êm¯E"Ê LFú¾÷®oö~ïLÂonìBl¡þŽïÿ^oÌ>CŸ¡ª• ïÅíÎ@ºXziðh1ã4âî _–)c)¡šÁÝRpXù!ù"Km£.ñóÁ¯T.ŠéaE±9Yd§U4ñX»4$¦¢®]ó('°ëHu §#ôrò7< µÌz™f8þYwuïêt•oyRÿ®”ÇtKÿô™õ—ouœGõ•—ùš÷yšú›·yO'Z§ Có ß|ªç–Õ`ÿËñ‡wø ŸÔ€o¹²"fÙØQ–áhß¯× ûJ΢¢Æ¹‹ö'cû¶wû¶÷±·—û¹§ûº·û»Çû¼×ûÃ"Y9,{{:{<šf#¢:døª§úÅ·°Ð¸ +6Ü®°¾‡žŒ÷Á´—ä|ð8yÑâ:ìP"L 'z¡ÿyÔ7}êùÕ‡ygù¡wyÙ}ÚÏyÛßyØo}ÕçýÓ÷ý£€Œˆœ%À—üP,o߆zóMGSeüæöéªÜnþ9­Ûc¿¦ë¸ßÒüíï|K³¦TuŒÝ'ÿÙOý߯ýó7O±»(GÿÛWÿôw}øŸÿÜÇýØúïýõßùï zb Ôã#V†W¦^½²Ð¡Ã…9|ˆ+‰;‚>¾ÍøF À·ßž}Ó¨§;w9T²\é²%Ì—2cÒœi³&Λ:sòÜé³'П/5Ba¸Ð¡C†Ý%§§ A°LÄ8Y·jíÊÕ+X®bÃ’k¶,Ú³jÑ^õÑ*\mo¨k—ƒÝºxóîå›@_½ ökøî_ÀƒFÜXñcÈŽ'~LørbÌefLYògÍŸA“þÚsåÓ–;¯Žlº4kÕ£_¿†ÝúvjÒ¶eóÞÝ»6mÔ¹ƒ 'ŽÛ÷ðâuMZÔ“aÙC£Ñº«XQÏÜXßòÌø’ã7ƒV“Ì4u.(z¡é׫oÏþ½û›N)fHšÔhÄWã02O1X¬è¡i¸‚*˜ ƒ>uQI(EüÀh¸!‡zø!ˆ!Š8"‰%vxb&ª¸"‹-Ž(‡(âå"5Úh¢ŒÜ¸#;æØ#Aªø£EybŠG*©!Íi„ÐCGE·Ð+A…Ñuà}4ƒ;ÍЖÊ’L¬8CBÔà@<Œä‡3Ó„TShÀJþ¿PNA˜ÂH<Ä¡ƒJ¨uHÙ•Ñå@žxRQDQS" 4Nƒ™.¸©¦:Xy–FåvNÑ…âo±%çšr¬Xލ"GجÂÕêjoœÙkª­övël¾¦ÆëªÁ¾ª*°½RFl²Å:û,p‚ƬqÊæÖ,­ÕN«˜¬Úb‹,qR(a})¥ÐCT7.UWiÇÑpé倡4æœ.¹‚L,䱤Ä@1äqS,ýP¥;AÁ Îxã3zñ¡c“EåJgîCæÐ–×]”‘A ÚÅ©yU—¦.ƒsW2#U€Qh2y“bx¬´Ñ=tþnp k³ßm«¶ºîz4ÑÐ2½4ÕŸ´·Úf[µµ¤]µÒQoõ×]‡ÝõØ]—-5׺i]\Q…nºQ¾‚2Îëê¡%™àYçÖL<ÓÒ8ñ¤“ÒN`À’;‚×d : ¡R<"¨´ 0ÎÆ{Þù{×%„TÝTšÂT„ÖI ª©±Œs‚u±¼–ì3¯Ü`íaÙ{WÔÅ»ZM4E£ „RA ˜ó{1ŸƒóÍ×õ¼bÔãe½ ÌW¯=`ÔwÏ=Þ‡Ï}ö9Øå}ùç“¿vÒo·ö³N×õõóÑC?½ôé_¯ýþæ÷¿½ù¾Àñ P|è; ù@ A-{þ}ÉŸÕþáo‚þ«àö¾ìipã» ù>¨—õA­~곟ý$Ó¼çIÏz,ôŸ7ˆ+¶= U¼áý*= òp‡üáþ:B†°ˆ ¤_þLX¾þ¯‰úKŸG¾Žk\åÊϹ⎠•J"ÐNG¼#’HáJã’&`Ñ%ès9`Eª °t ƒãØJð)¸„Lp4†ùà±cLÃ"ÐÄX‹}®‘ säOðV®FQ‰tûY×u&ežUSi9‡ìXáŽ)àý þAÞ¸œÏæâú8¸•L@îX‚7~qG pN$`S1V‹Í=²³ô¬;(47Ò­õtoÕêÈÓ(”·3%)_+[”%•^!åVB <­ÐÖ¶¹ÀnÍ2Žë¨¶d£‚TE–WÌå Š¹È\.¦¹’èÓÔmnt‹YÝ®rW{ÈÜ®wµÛÜîzžÅ'¨ô¢7%Óã€{_õB/¾õU/s-6^ý“¿øÝo~,(]•÷|Î=ðx§+]ë.øº ïw Þ K¸ÂŽðüN¨aü=°qÎóðô@<ÞkP½×3ñ~O BõÖtÅ.ÞU‚Y Áý†øz”©þÿ¦Y™ç’·¦…pãÜËãþæ·Àäð†Gâ Š8˜$®Šû«b(¿¸Å#d±2ak²âB§vngo¦3ÉæwÒ&xò&nvçmê¦yrço®§ö§fæP[v&hΧ|v¦ÿfh’¦NHä-CQNIþÍI ŒÄUÁ䵄¼äÀ4A4ä@,hBLÃäÀ;ØCC• ÄdÀ¨2 ›8AÄÜXÔääÀ2ìC„ƒ@+TLP¥Œ–I¢TÞt„Œ…Ä!#¢Œx®½žWº–nÁÖêµ’Yô¡‘ÚÚ«’Tò­•’T¾Î"žÌ±%$þ'ù€½ÑÚ€‹´œÍPûˆ —n†6–ž)ü´OÛ°OÖ´—z)›vi˜néû”)ÖÈ©›Î)šÚ)˜æ)Õ@ä¤@ ݨYRÝ`„E˜Ý…Çú„yò„âìMÌ„Oö¦Jhƨ¦Î(K$J%áà}(S˜ŠRjDv8¥î)pQåkÑšWþVp%Fèyèi…'žU"ëUˆS„ÈÅÈTD–ªiŸ«Ú˜)±šž6 øÅéq¼é²ê©³þJ´ú)Ù k›ë™Â)¶â©¶&ë™Në³@+Õœ™I\‘R¬•º[Rê„u‚2¢z NNÄC¼N¤ÇÄÃnþ*Àr*ÙÃ$1Ä$…”쇡ÖR…èM‚¬ïiJìW*é«öN”bìY°–ìå!­^lrÅ9—•ŒË¨ „¥`ê>kµ~kµP‹·*«µæÊÓq‹ÌºlÌj)̲ìÌnëœî,µö,¸& ÐŽkËÞ¬µ-r+ÐÄ’É®¡ÝØ¡Òk,)ªß4ªP4Ò ,ךa¢¬™t ,ê¸ÙéL¥P„â!¢”ÚÎ絪­¢ªÜÆmYàZV¢u ¬¯î +$†, à ‘.ᮌlÈà®â®Hâ.®ãŽHã>®äzHäN®åBå^®Š˜Y¤‹×Užºñø`¼rD’Pþl {,ëÎè¤@­”¨Ù%a^P)EˆX|,ÜzìY¤íÆjÊT®êCJj!ꀌ©± ­Ï m¶2ïо.móâ,ÏZoÐb¯Ñ:oÎFo÷>oõB/øzïõöJsP”äG£ÐMê4¬uXmGdêþD¥®îzt-þ~V‚Ì 2Ä£ªñš-Y hÉæMp­½þÄ&9…€²Ëí‰D°O0W°_0g°o0w°0‡°K° Œ° Ÿ0 §° ¯0 ·° ¿0 ǰ Ï0 ×0ÄÂÎh„Çj”„Ößœ–p‡GôÍ ä¬ý¶®7Þ%ØšÎFEþï(Aô(î2HÛ^ñìÈ‚,¢ lîÑÒ¡ZÉfqoù†/“oöНpL¯¯q¯/Ÿ±o¯ö.-õÞ±¿1³qkdÞYõoÔZÀSJÉ"¼ÊÕEJÈÚ¡áÖ.±$ƒV¢,ƒšíÝOYNÊ©j±'o±'gŠíY…€&›j «÷q Ã1†¯òÔÈò ½ò,·òÇq»òÛq/óò.ç²-Æ %›Ý¨ÿŠnˆŠÌ^ ažaþN³sžÌ º幘Â%ùêñ:,(‡ó'kqî™eu$o*³².ûr0«2.“F,Ç3;óò¶30»³>çþ3? ó/ûó;×ó?Ã3>¯ BFEB¤+CšK„˜\Á+Ê/ëN2EçoÚùÀòpRŒêSœ/] Ex8ô8“tYŒ¥3¥°‚Ïdˆæ¾tæ¾4ஆĴL®Mß´Nï´’ä4O‰Oÿ4“ˆÕÇó,IUˆIÌ@¼0òéÊ(5OuÀZJäaQ¨5Ätó&C³DštI‡5IÃ-]©#"[ò®l?´=‹Í4[4,×,^tK@ß2\›†Ò ô]ײ\ãu[» ×ì5`ÿµ_ aö>ôÎ4ñÇ2[ÙR#Rüa…L4UgvP„(й, ºptçž[þ00¶ÌîØí¦àjê1k»êž6Ztô)«tQİö=6aˆk\÷õnK/ŸÒsawÑtëbÿvróõrws?†o3÷ZK÷³D·sO7cµ&NÝD-&Q ûéž›ªTW4zsjÇ sì"%ÞJÞXGƒøšÛ:)ZÔŽUÞíöÚ“òwïØ÷Ëü;¢U€q.A])‘‚Sö48ƒËqC7rc·bS¸]4k %‘†o \>x‡øžÖéÓex‚Ϙ`;xзq 6-«øs[̈́Ƃ§x^_wu“8 áO‰ƒ¸¡xˆ¯ÎAHŠšBˆ¥Î ¸ÒKA<òJ˜‚þ yVzG9P¦s`5€V‰&KŠî„H»öUF%U¢È邸Zn%ÈÂYlÒ!;âd‹ï™c>%X92`A]µÝyA1í±úT;ñÔ::o²ö´x]`ø8Ÿœï?ÔýžCž[ÓkËÕ(zc• 7Ϥ3RP½Ÿ×x…ô‹7‚oœ85úwõÏýú z„Ãx¢3úœ×º_]§ç9¥ÿiW{L{›‹Þ¬ôûBô¢òL4›Ï¿,Á_dŽM@¾ºÃ3ÄÉ¿´+dÁ¬„ž4A<ø  dªf»PÄhÑÍFqWÝSC™ÿ!¬Á–«ZåSâÚX$iÈÒ÷V þ©Z<È›ã#Þž²uâ?òÕí7Z"Õ%§¨Š@ß3Ñ{­W|•~e™Ä#\–Ñx`ã"ÔüÈ9œ³<Èc[¥wéÆo•}=üÀ¼ Z|a¼n_ËÈ—:‹›MÉO"ÀCÔ´SÃSüŇzÒÔ¼ATʇ|Á‹<՘ēx¶bÓkÚÑ32ÉÌ/K8ŽK°‚)d½)ƒ&Ô0ƒJPAÁ\a4ÇÂ*Ø ž8 Ä8C?@¨·K9ÜãWù¶hŸ¯ü’%V,»‹ž–mÍ*V~9¬ŠEÈQ,­Å*áwå°éæñû[Dœ³ß *Sð© ˜-˜Ï{‹rqNÿ`¦jþ²ºÁ»ÿ°Ýæ·qbL> Ò˜“5˜ðɧæÇü¯°~ñMWùxXƒÁ~é£>퓺…Ãü:Û óM™ŠŸ˜…æŠM“飘¡ë†íS¾=ð•_æo—û¶è¨•+J—±_íŽJ翼+(R,×W¡ùðãô&ä@ÚˆŠÀ™B8aÜçN¯/$•p5@ÄÒãC„=c%qwP„q!>”èð!X„hñaF‹&Ž«£HŽÏ…„!cI%Gbd9Sä8ƒ ÝXg°$¬ƺÀ]9Œ=šÔ(R¢L98EÊAéÔª9¨65Êá£E®]¿~ þ+¶+€±fËž0T)Ú¶\ß>ÛÖ,ݬs’›–o_½- *»V®Ó«…ó.­«õnŽq±>;Ù/`´{1we«±\·‰!7~l—îeË”+›öšZukÔ™WÃní:µÚ×±-Ž»›³Ò¢QA“ž˜¶lÛµYoV|˜9T©‘_…\ü´E±zByeê•…WÛ»‡•CÏu…<¿ÍøF À wêg0ô‘d\QûíÝi‚Ūhwö\Épba%dêVü3ê™ûИqЀAiYF„ pƒ£ìk0ÄE,‘ÄMLÅUl‘Å]A í¼«‘»ð¼Ë>=’þO§ùÆé1%—TÒh"#_ªI£!%²ˆÉˆœTIJ‡(¼èÈ‹\BR¢qTÒ©wò‘ /òa(©ÜQÌ?5Ótª¾¨Út8çô¯Î4o£®:ã;3/®D+P@ÓôjÐ+QC‰Ë3O=[¬,?AdÓR‹ÖäàÐxìDSÓ¦äDÒGMÎRQ©P³6íÔOm9ÙFe­TZoÍ-WÜöìõ£3ÛUMaÝ 5XX§Z”UYùÄuÖÜ(]SÔizSÚP_õTÔ]/ÓF>†hü®ÆïÀ³ '‚ ú]øÎÀ>ƒJ©Û#cþês oÎ)j- pàA c¡7BV&þÐ#‡h¼!¨!ŠÒƒÂ)Æ¿aÌØÅ5î˜ã=¾)ðH.y<…ÂD—!œ°khÊ"­Ü(f$» i$)o&Ò¥œŠ2K’zì¡›~ê^žæsÇ m†ñ1LÝyÚé¯D«j®®q+­y­õٮϺ +¥àtªì­Ìk^µ«^ª­µ}…Ôë$ý•`¥ö/僧®Ï1P·¾šS²¹ž»kÃ[oªKÛ,ÇÍ<ð«ÞnñãšÕõëÙ¸Å!Aó¹Átn…¯kaæº6:ºÐY0äÜæêf†®†3´!©hh·¦ñPs?|¡‘xC#ñp,dbâî¶D)6ñ‰»ÓL“hÅ)vËGñ¹Æu#îé€dô»ÜõgM!%À4ö1¢m4¡_zÓ–á7¬jŠš;L12 `1á!­é/dä#ëþ'I†ë;Á žŽˆ'¦•Ç ”YÍVò‘‡Œ„$¢”Ì@4TÍ#©¤ˆ¹ËŒ'*ƒWPP¦m¤ˆTÜ¢“6,öR‰Ytâs¸–a"˜ÄâwÈÌcóˆÎ¬¦4«8MkÊ&šÜjæ7µÙÍÍ“†šôA¸3ïl\™D'EÐ<å1O=*E ~“4죈A  Ô`4Œ! Ej4£¥%­#EƒäƒsªSÛG7…ŽÎÅô· ž7ÿçÏ_p‚ãK¯í].'Î\üÎÿ½÷¥ÿý¹+^çÚÿý÷ÿÿ0°ºøo ° »à¸DfïŽ< æî¾dÀt.Ðâ£ðÖæú4°ú8ÐcÊÓpôíúmhi'æþLâÐoÓ‰„áʃüöë€B xé÷¶®÷*c¬†/{°+rˆoO÷‚÷~°ˆŽÐ—’°˜†ÐW„S ã ‹øfEö«£Öiïô®;ÂïÇ”í‚ù6ð ;0 _D'~‡æ6M鬤°ƒÇ޶\‰ î="?‚§ú0¸Xée^M‹—æ«Ð›˜Ä‰sOöˆ)™¥P Ñ/Ñ q)1¹i™< 3Qt@ñ…o›²pà~gÿ‹Ÿì‚¦`†%þHc¦#8ˆHöhÏÌèGªÎŒ.ÀO°S¦BÃq)ÇlÌÑjÐ)þ¤öHѨBÑ+$1ŠØ‘jÆÑññùQûìLçqÌ8ñ2ö±õQýQ ãŠÀq%’kÖñ"Ûq‰äŒ¤D |qµ@Ò†@ÊzóâùÖ#ÖèÛt±%q‘¥L~'µM鈇o)!nr¶ŠL¸’„‡«ƒN¢Èdæ”öÐ…ì¼`'¬N¨ G¹”Ã0zƒ3¤å1ªNŽÂ*ÛÄ*™ mHlØ)%,Ç’ËÒ,ÃòoÈ2-Ïrkt'ånšc9¨r+±Òt®2/»rþíR;±/ò! ò/¿8²3ÂÒ"Ý„,ï’+Íæ0½2ng.¥òT´2+33+Ó‰H/LÚ€¶ÐÛŒÇÕBÓ nI^\r5_rèx£„GŒº“(ïyˆq>DÏ’L¸ªä“b{ó¶’Ñwë7«‘¥ªÄ‚*¨Èª.7°ônX*åZ¦3Nè$Qì;åD;5%X"ó놂?0…( %)Ê“<1…*ÊS=ÓÓ{Úó<ùR6ºL:©³>­3;_…;õÓ;ã“0ýÓ !0£Ð›Âó<©sj,â>°ò(ENžO"TÌôQèó>1´:tC÷S1ìàhDÓî£"þÌH ß㤯çZ³EYsÞÐeæØI<Àï Ñx\‹à˜g†rc"·Ñ(T%HiJzÔ$Xi0¬dýÚ¯x°cý–ÎLèrJ+³*F#:°ô)æ„pÞZÌ1 .îñ)“ÇL mÌô;aoR¨´+«´)®t)BÃ7°b3ݱ@ TòÊ*40÷ôpÀ1+ó(@â+(mTG4ÅP5#—P-(…2»ÒJë4Kg/i'6M€ìL4qyR’¯h‘ô¾ÄEUõE%òŒNÛ>j€î[B¯Ï•MîdaÛµZih#ßÊ¿@rFM¯ðL òªTé©¡ÔDL¡ŽX5dWõcÊ#ÚŒ¶cï0éF;S!b7ƒIe"Wy&"jvKtæ‚böG#‚·Rb¾íýt)*áôhãRéÔN©"QÝ2RÍ5jVÃ)Ôqj‡/°Ö+¤–\“h>;ƒR“V:Ä*¤á• û´^ÿTO r@ÛÖB‰¢JÄtXäBl«dþ1–6)æ”K¡ÖMÁ–R•Ö*ÈÖi­hÎ^Í#s̃¤ £ôÀRÒkÓðDd¯Jä(  ª`ëD Ú-œa–E BÄr1WsÙ  idEvE^shDiÔß@­‰êV{+WÓs•7yww«‘X¥DK”Ô!,¶áRñ'|@ šÆoõ78Bz¹k'k°7.ÎV˜ƒlà8¼·m¥-Æ7/Ê—#,ÇZÛTˆæ'zËzm'wä×zuG}ýò^ßPó—mÿÓm%3*ôÈ}ËFk®näw^8MÆÒ~ß±}§÷}©7{q‡~å׊„¶£d—ÓˆL!ÜæçuØDHèœhÛr„ÏH Æx„u‹‚tëówË‚8•ÑxsY} Jˆf…¶IEïŒãusþö¸Ã_ëÑŽ÷·™£9™§måUmé•k)ôŠ ™¥Ù›c(㘎‹buÇfôñ¼ð¸pNLs¤¯¸Ühy‚ŠBbÀô`Ð᪠`„(DòÅ(¤ jF·ŒÁ(4àž§AC‚ÆZ—”-º|x¢ õM6Oæ {¬ô^!àWgbHbj§dvÈrj”¦d¥kÊŠ«q%V hEè ³0—¼¸o±y§ ƒ©tZ›'Õjۘə™©œ­ù˜³y›Óʧ‰ú›Ç6¨©±™V£ˆ8<üÎ'œ¬StFrïcÊ!ŽD¡s-&?ŒÁ úá Ó„þ~®Äì#aÜV¡@n8­×:Úš¢Kù¢Gä5ÿ« ñ¬•×ÇDˆ$怫8Ñ·N–n+²ƒ†71b'Lr‹o-0´÷-D[õ¯¹°´U{µY»µí‹´]S;¶ bî–dT•·ƒ$ã¥ùPržšgúè H ¤Á}f8‹{Š‚`Ë®Ë'jX!¶AÑàÁ?¨ ¹ßçA|˜°û&MvD[Ñ;à°ø^L”ØuÆ%FzJ ±½a¢#†,¾o‹ ñ:žr Ù©š‹©—Z>ûÜÀ:Á\Á¥Ú¨üÁüÀ |›šMQÃI÷7ú;jþ!&;Þ™ K2zàÈ>~œÀXücë> ŠKÜ¡ä-¦!¤¡j&ËAHD¡ÊXá@Â?ô|´Àû¢;üdG;¨À„ª'>\w?¯½‡¬]·Ê„˜U;|Bi ¢¿-œÁ“zª#Õé‘ÂyÚ¿aýÔ!<Õ|Õg}À•Áo]×m½×i5ô[Ô=ŠûH&xþDµhP ¬á#r ­=”!&ÀÎ< HB+` ²¾'|ìcÜí†sÀ HÀ³ AD+Æ~|°Ù°;¸4IÏ|Œ!.ûôÀ¾;·î½ÓK‚hH󵡳MÀ}×Uý×Y}쾸ÂÞàwÝÕÿÛ`~ày=â)žàk½â¿bwBbç*Œx»ôBÜ|cG¡(÷ šXAŪ€¨ÞÁŠ¢H@a éÃB,FÌ(ÜÃoº(Xž€áž;ÝIYˆéŠÓøƒýGpbÀZ°·Ü›Ó£Þf“õ&ïŽ!p:à!Þâ%\á»á:ÖÞëY}â;áÁ>á_]Ö%Þþá·™S} Î„gÍå­Z!B\‘M¤|ÚÝ|ü{Ƈ~ÿü£Ç]ݵ°îmÄ ƒŠôît³êñ]8Óò#¢¡\eˆª˜¡ënh{þf;ôÑë´¼FŸôË õa[õé/õ]ß»XŸ+b¾fj߶Ť#ŽÝ0öK]>€žI °ú>³ÒfEÖŸ@&ðýÞäÍèK™bA£yÀòƒÝ1Óe‚êõ}"Šëyñ¤v)>"Ä9íß>›«ºšÑí…Ú§ãÿýÛ~šxðþ1ÿ ,(aB„*lHâB‡ >Dx!aÆŒ3F¼þÒbÅ!IŠ<‰r¢É•lÔ˜R¢Ê™eÖ,¹PO,=>DøÐ™á•…W¦†šz…t¨w=›&a¥SÄ·ߨ˜áŽê Ÿ"b%ç.GرbË–uG6íÙµjÛ² ö­Û¹rëÒ½k7/Þ½r}êÉ ©ÐÁD_K’ƒ'צ<õ4pÌ'„q“+S¾ ¡åÉš1{ÞÜÙ2ÁÍŸ/‡¦|:sAÒ¬#ûxìz±â§Š*ˆƒÇ•3iâ´ù§ï‘3/è&~38r…Ãc2OžRB㻩/Wî;oà×SZ'ø}ûsí½¡‹'ožåñìÝÏ·oÎÞ=øõ.é×ÿ~zý8ÇϟÞ~þ‚¤bŒA‘”`õJ‹‰ð•DøàO?=Æ¢–]0ΚjºófÂkÊnX³¹è¢ªÎIž­ÅéVÃo2,ÖLJüe„u›’ÆirXs*Ÿ':1Ë ×œÐš8/ÊA‹I1ì¾<]¢ ²›$Û|²¬7‹‰òÊ“~ÌîЬÂ\ ×ì³ÔRýpÏ?§ì»AkLtŸ¯ÖÌ5»Rã,vÓpwíòÙV“©öÌ5/Ü0ÏtûüpÅ_<õu Ü‚ ˜íQÃ2Ö¹‘IA•±Î þEcÂê5mçÕ~îyèÑ‚ÅbP…5®àŒ‰¼8ÒkÙ9}fï쪠.î“É®;‘½'ù;eÀcV{ð¼Ã>Î8V>î‹:Ñæƒƒ'rÝPC½5.£rÙÚC=Î÷Mã~=ÚW3ǥ˩Oû'‡o'üà«ù~C.ŸwA2<Ýøu3ü¿ú± -=`øH¿ö•ï~ÃFú·¾A¡E~ƒšˆÏz6¿º…o{žßÝ*u&„laojßý¶wÀìi~ ô`óÇ¿v¬„hi“¤NæŽ6L|ÜSáË÷ÁPÉ„K.ñØüçæéÐ{(䡘ZV¸ìä*WAÙV¶3\yþ…\=)ÖU²2×8FtdˈÆYËØâÕ``d w fCTâ Àô€<àñk2ð*ž»ŠÔÇÒ´Ë3ùJÞjX3HÑÄËm q×lÆ1EÄýk"ÐÉôЏ´6yï†bYXՖƸLJ”š¡…³›LíÐN²êT—„f²NÆ2‡+k•¦ö„¾þer—IÓaDʱälU`q[mùÀd®²„N+ÛÔ¼Kæì~&‹ŸÈŽi>JJP´d¦@:&Kåp–¡šÐ<–MSRïp¡e˜Ü)͆̓9&ÕJ‰±÷¤M™ÔË$Õäô1Oª—¤ fªBvJ®1?Ù• àˆqþ’zð …,t9 -/=£G;:Òeq„IÝa€e ͱ’yT$„ø®4¼£bŠÈEî._Aêée¬”Ä9OXM¹dF88¾í€`ÓÞØ”ŠA#ªsŸ1̧]i¿gJžafYÙ„ªsëäRÏz=§¤k´^V9ÅZ90†tšÏºšÔVî}âû’ûÈ’0lbÓ#Sß@ââ=ŠÅ‰blꇘ*ÖÈö†ˆGÝêøÂײ²¯Uª õ9ײR­7\¡bÕʽ´zÖ}fb]0÷ÆýJBË#Vå0ЬÆ|壼io;­ÆìŠA§#®DÇ€yK2þïÒ£ïHs#|¶§—Ä3Þ¦{oh¦ õ/²= Iãè—­hBS©Ð±0§¹wʾ­2•›UºØZ‘(‡Yr«´R<6×¥ØõíêuæØ¥¹¹5unN1ÜéZ‰‹šËU‡~¢ £ö q1(Ëò1@¯%Ðeþ‹H\þ‹h‰PGbêc £%¸UÄ&p™«4UMÖQ!–edñó3ÿ'h²Ls«–¶q¨FUÙorМŸnµ@âè…Yö³¡ºô¥µi¼”Ї´¬'²ê°¦XšvË¡kékXƒúφ… ¢/=ª=Ïe›5¡Y½lc»µ’¼Ö®[YkΊñ"V´BÇe]ÙÊì^÷GæP_f(r„dr©¡ŒY_{„)¼bªÓD²ºÿ†óºYHEî±§ÙLc`Óñþä+· n`uË©†Ú¯õÆ?ŽË¼Í‡K¥z6ȉm4Ъøä†ÈŸÊ´ò˜£üU$‡¹Æe.YT«üæ•þò‡+˜Ô …’ ¥¸N¾1«œ{*Qn·ÓÝýôgõäµ§Ê·Úå$³nŽzF™<™Þ.w7sAÊn¤ß1Ç3ÇÛ.wúöj‰ŒÄ ´è¾¬S丒¬ÍQßyd8Û^™ìÚ«ánÛ£ðŒ»ù4ùÐ78tI#0€ õá\ÞmÓqÞ`¾ñÚiÉn ògæ/bG8/øøÿ·ýíüþäå¿áú§¿ó’·ýabý‡~æñï€u´Õ+oG!G—3P!K7!lQd‘ûšð uUðîð Î0 ҬРîð Ðñ¦ÀñÐ4´7{¿UQ· QáÎI®ƒÁ±°oÉóv¤Á„|ä„;µnׄïR…|t…©QÊó<‰Á"Íw;¡ ¶e¨wfˆ†i¨†kȆmè†o‡qX†-!‡uh‡wˆ‡o(hH‡Ð‡yˆ(ˆj؇8ˆ‡ˆˆhˆ‰Èˆ˜†…˜Ž(‰“‰1‰“U7ÄÕ ´þw‚zÕ:ø i1 å  sTP pŠo «Ð{AP¬ÎÐ9 צƒÅX-\1,uv„Ž×ÁçA¥KxÌ'/°s4eK}ÚØRÙgoË8qÔ‘÷‡Žø`ø‡€`™§Ž‘׎—ó(~õ¸Žéhå¡~çþ¸ásŒo¾² L‘dòÏÐd¸5y`giÁ.*˜¬0ŒÐàð?Ðì ¢&ra èCñp{¬` áàÌ@Œ;hŒÓÒ}PAw)åEH.t4EÂÂ%r&2U¶"Å“àT< þ ”KÉ”Mé”O •Q)•SI•Ui•W‰•Y©•[¹”‚À•_ –a)–cI–ei–g‰–i©–kÉ–mé– uSz[æ+^†#!8‚9H t`4þ¢»%jX¡ °À pO\€á ¬ÈÐ1°hµÈ0X‘èЊ%Ò€ Ë A€ã0†0IšÅt‹Ñ͸F: ŽåÜ(›Ø8›µÙRNf”š¯éæx€ùø¿)À¹ïØÂ Ä©œÃÉœÉÙœÈ ûÇŽËéœÕ%7&CÖ° Ò+A“á˜ä(·e9hßP ûÀ ¬ ð‘þèû àµŸ )î0·—Þ@b)$áP b!Ÿ¥é ¢3“÷¦RE¸dБ\q›¶©¡Ê¡cv~1G_†wwœÒ©Ôy67ëç›Ái¢.ŠÙ¢2ê_X£*z¢Ïù¢4ªN6J£ç¡[òf (fÌ3ŠòƒÊ’kPM pÑÎàV± î HôŠ¢F™¤ W*&&™` éÐñpŠÃø mÚ9§éáÐrJ§ÒŒP+Œ10’#ê§ ¨jGÅ:JV%3Š£7Êw9j;Š¢3aœüÇ£’壣–š¨“šhˆªþ£—Ú©™Š©‹ª¨"¡ À§»’-U§Ì£dÉBÏà_„nË3hÓ°dQÈ€ ÛðE9  ° ‡ö‘€’]¥’ÌQK°Ÿ` Èàò“nJ-S‡R;A§sº!«i„uFn¨ßú§ášGS‡—_†#FH†f¨s‰—è®x¸ˆï*¯w¸‡fX‰d¯óª¯ox¯ûê¯qدÿ*°ìj‰~Ø®ù:°ò°›°i˜‰zŠ#àC*n¥‡§åY©zà8h-Ð%¸¦Pçàé`«‘h’é2ÏÀçಲ£ 9  @Ò{€€;c˜kÒ­{QI"ð8ŠQ§ÙÇš±ñyþBtJ(®I ®K‹¶7%¬£ Ëåß§wÔc€ü(©¡Šú§©ã÷ì¸b•ú©¢Db{~œÚ¨ž hK%ʶòá¶\«¶)j¶å¶y{µd»¶2EÒF©ªeÈŽ• HG™9´ ’H!P‘º(Ùà ߰Up .3¬+;Ï’h1¦îpM@ ¬ Æ€².¹³:["äØ˜‘DUr—*Z”?¡ΗSkv;:…$b‡vÍ•Å;…°C[F¨‰xywSµ÷¶Y[¶Þ~Ž:½÷r•§½Ð‹½ÒÛ·‹ºxÝ»¢ß½Ü x=Z·Ö{j›—5w{½þX›sì{¾”š¾É‘dšc:‹su12n#ª 9}‰nÙ§Xñ$à9@ ñ`º½÷ö€°Ð·÷н‡ 8ñÀ½ h&9˰UT€‘ò™³­‹Â}!!t–§~˜wú E»\ÓX|ù¢$G/þö»¼û\÷$ó"< ÷â©}[Ç M‘%a°Ü;LJƒbû÷Äq+*ë‘)*ƒ**ƒ1´ÒÄ›ê_™&¿ÇaÅW¼Å7Q(~³* zxáÛ%YŶ*Ÿò)h|Žj\©œÂƳ&m\£…·½í{ÅwrÇrÆ1Èå«y†ÇÄ‚ÈqÅŒœ>^P° 1òF?k¨G×þK÷ _ˆlqÂ9›{ºrñ“ šƒ®›ÂA =š6éÚŠK®Ìs›¾;<ÈÓvòâ»7¥.·ì»B¼É ,6‚”¦.å53pòDÄ^LÅ&m38r"1a#ÇøAÐ?Ö+åóK‡UÓÜ(ž…,*r~œ5Ä5µCJ57?4>P¤¾ö‡j S_ÍŒAsrWžR>ð ÏR\r£¢3÷ì%Îì)Ù“ÏøÕUóÞ\ÍSŒÈçì&“XmÐá|=€ƒ'ÏÝÇÆ¡Ì&@ýÌp‚3ÃÎz|¿YtÛ"n_˜#t–¤ YtUUÀÍ’"`ñU l¨ìÓsQ%±þ,¡ÊÃæª,Ýg.c&pPØ|Œ¤/‹$ÄK}]Û¥/Ý(ÕÀÜ´>!µ²ñƒ )ÈÌ?¹gCúeb!L¾'5„ÏèEBŽ\¿¨´Yl-×pQ8óDÖjÍi@· `ÆOÝÓKd}ו4–2n½ÇýApbP9hØ3D9†Øè«Ø$ÖÔÖf=OÕÙ'VØ=ã`î[k~]U›DÖä$ØgMa"SB|³ÑûaÚÔ#Ö%$ØšÄÙBƒPiÚ/ÖÖÃ1Âe½"#«Š8Q I]¸F Ë¸ftÂÕ’Ê?ý¹·Ó˜ÙÝÙÍÝÜ­­Ã,¢^1Ì^硾Ë;ñ"$¹<þmÆvkÆÞ•qÞ/eïhx,¾Ï¶Qóaôn¥@ q?íD^Kxü½bë4Ї5?þkqã=ñ°m.àvkÈ.`OÄÙ{µT‡õÚÞU¤Öh@ÔÐØ‰ce¡È àòT8Ìæ6HÕÏ5×ü”âoòVœõá¸óâÎvàŽàð«à._þíj.^ÐþÎàÓäá“,2—Út¯P¡þ À–3H€8‚IÝÓÍæoQqgÎX¨wTË8Ì]™¡fÇHÒÅ»Ûļ«ÃMM}Ð'%Ém®OQ0RîÚ&fA63Á´V 0¢Fþ¾â·W‹Ž$aÆL³dáøÑ׊ÎJèå4ÆDÖŸ^cš>Ú'>Xºãæ…`ÖU‡ýM4nê­žàý‡c…PªRë „U ®c΄ڮ_ŠnÔÙëµY“cr*&néÊbúÕèåôè’Í^âí¬å·zúC1D*G§7nË-«ß°¸ÏÓÝñ.ïóNïõnï÷Žïù®ïûÎïýîïø¾ÝŸOðR¨ƒÚƒu~.i¦Î÷ÞhY´âHE1m’@^ò-®Íã¹DäS.U(s’þdò§…TQåJÂå¼®KîìW9kiÝáäòH_Ùô{ÙfEà…ôÍ1?)OÿYDÏ·µ2Û˜ÄÍ«ÒDèìD^h…õä_ŸaT!ïJÝXë\ò~H•`˜eÅ=¤KáÒS¢1½ÉŠÁ5$­Ì‡ø…&£øøù‘/ù‘Ïømù]ù˜ù™Ïù”?Ðî{í ú¡Oú£oèsN¨> ðòÍ/á|RÍoܘ.^Õ𢓢©OÌ×ïÑ’VJ&-)âd¨~à|%äg¢(^Åj|fW±æ0Æþ!d¿ê÷áÅ&©¥kßþk¾vOªf£òXÐþ hÖM_ãLæ¤mÄdXÉoÈ-J¤>“þa¬v1ÎtOgaü (`Áƒ \ˆðàB”8bw9`Ôˆ!G…=æ™q£I’Qæçn\ކ!Ƥ93!ʼns²T9n Ç)Eº;ÉQ¥QŸ29‚tÈp 6=±ôø˜ª'ƒ…WY³šÒŠõUŽª>D4pLD¬oßfœð-‡ÚoT¥ê1«GDÝ»"ìÚÅÛWo^¾\Ø/áÆÿ&f¼Ø1âÇz¡áÕ3Y°å½˜%SÖ\¹1⨡¥Žõ¯XÔ"Ä‹š¬^ãbÏ–]{ö@ÚÊÆÍþÝ¿kŸÛ{q¶}ç.Þ;¸rÚÈs§~N¶\×vQ‡öá#‰;©Ú"H§ÅóM¬É>¡ÌõñÕÏo/NûõóÛtÏéKH›ÒÃï¾ôàûoAtÐAýlèÀ%ôOÀ !ÌPÃ-Ì©"Aô°Á˜8lÐD ?T=KŒ0BcŒ1B LÐÅ a|‘?©¨J ŠW°2H"_1ÅÔ¼s*=žQ‹fpgµÂA¯¹T;MKî°ÔC¨æÊ2µ.÷òR;Áô óË¹Ö Ì7ÛŒóK7å“Î9á¼S,4ùÔÒO2ÿÜP.«óË4} kQE{4É$Æþ :Jߣí Ûz#èR¬ãÓÚœ uÓQAåÔ¸qRµÍ,ïÀrÔdz’`e*Æ+ÏÆßÛ±Ã7ÜÕ¾ %Ñ׉í0&ÂuÅùzåUØSlvÂeísÖZhq<ÖX™öÚaŸ-¶ÃA V×q±MwÚu,×[mÃÝvÞÔÍ€+#µÂWHw44¸ ”’ÊoFû“V¹’T a„î1ªí^U͇X`¸»Š¶Xã†MÒÊí6öø`‘A†Øá3Nø`•O–kªŠ)®êáŠ[&ífÑ4~Ô_°¢¢Ô8ê ðÔ6à†î8ÙŽŽM:è‚ÎÍh¢©‹ZêèDMhÛØtmcVþõ +<[2¯"‰1^i¿…\˾O^¸Õn—íd- I"·ñ¾[ÝyùŽ›íxó~Ûl¿ÓF›mÀѵ›pÁÙíÛñ¿³}hoÁ—ûqùÍ|"Ê;'òÍ1o4cÉ€È!±âŠ«"Þ:ª€ÛzËIíXKÒIænw…¿Œxw½J“8w±ˆ?«Ëâ‘?~xå‰g³öuþ8úß÷¢þËŽÕÞx…³£Ê  )M5üŸkƒÎTóÇ/Ÿ6UQU?S«Í§ma×Ì" *‚‘5´ññlÿ¹í$` x@&P D ø@FP‚ÄxÁLPƒäà1(†P„üþ`ÿFxBZ0ƒ(a ]ˆÂ²p…/!š«è++^ñJ¿¶“©Än`i‰ÅÎ"fDè™Æb3sÌJsCŠy,{%£â­8½+>Q‰¶3˜Â^VÄß­Ì‹ªcqÖEè±LVZZ_Ã48Bm6r\ŸÒ†“´¦Ñh«! ÇR#‚׉§]‡[›ä©9ÄRtˆŒPÝâFȹ)ò‘Š‹Ü!-Y¸D^r’š¼Ü‰$:Ðer‘œ„$æ€2úÈB‘x¸ÃWŒã‹Ù)bìÜ——1—;“صH³E‘ŽVÏÃY½n×Ëã) ™ËŠ…ó¤g=íyO|æSŸûäg?ýùO€T %(=QP„&T¡ ehCúPˆFT¢¥hE-zQhC™9äŠê`ɺ®yGRS¡ÒZ¢4¥o<ƒš^ŒæJý8•$4 3)Mg*S›ÖT§9åéNmŠÓœõ§=*M‹ÚSŸ"U©KêRêÔ$0jgú›•XÜxÕ7âq:XåjV½Z>2¾sª¯‹%ÓvÊQb²œDë&Ó:G‚²“gýd[åZJO²µ®{Õk_ßzW³Š²’µka ɲ©œ®HDêhVz6šïäÅ–o¡R^þ™Vñ²™=JÂ{<ûYІV´£%miM{ZÔ¦–g¼Ý6}ðUضQ|±¥mW±Ê¯§¥õSM`uä×ÁW®†nÚâJ\Âò5¹Åìp•+ÜæFw­Ë¥.t§kÝHZrM°‚‚W[$®èÖG‘Ò’¨$0”>Nº4b}ù0>Š„$ó¥o}í{_üæW¿ûåoýû_X’ºæ£ögÕÚ&X«D³­‚¬œ°" ‰}“o™Ýê:—¹×Õ0æŽûÜc×” –.†Eœ× —xÄ6qˆ]¬b‡‹cE Æé¾ëÔ!I4‘Ëdá‚ØË"¾3fg1RN$'YÉKfr“þüd(GYÊS¦r•«<«~±RãÀÒû|ÕÙ~ùÁÍ¿.+«™Ð à HC83ðÍq¦3+ø¿ưÎ{&`žÝº€~¡ MèþÍÙÐtFt› ½h`MöZxwØJ#‰¦\†ZØrËHÁ½-eé…Ù£À% p«]ýjXÇZÖùå2··cñй«cÖ5¯g3^°”ú;TyÄvžÊíÍ­Ë,ç>cº²¸CŽL6ã<÷6f#nÕ~·s•b ÖÛƒÃv³ÿŠWi{ÜÙ&±°Ô}íoŸC¼‹JaéQ"é²â"JgÐ5îµ›Î|™‘Óiþe„'\á gxì‡×sQd‘ Ò²Š>æU_ü‡q“Ê«¬úׄYq¼°§Z!"¥…Wü×s½\Þ2‚V\ßÕ-œ³[Ú º9Ësnng¸çÒö‹¡5ô•]évEº¹Ttgáï`¬Ä7êv¨i‘²)¥ß€¨¿¡;öê2gKôAª»9k´§]íkpKbáÃíiI9`•—áø «¸á¸Æ×ÇwçÞïÀ)N±Äc X0¶ØœþøúJn¾†›ü\cóŸhD¾‰¼|áÃt¾òíÎÍWþ®Éï(õè"‰€Zoy~å$¡ }Çzú¢›æÅmú ;Ÿ¡þ—¤~ô.ç¹ìïùúÐÞ?­Ç½æ›¿úÂ>C½gÑï‡5üca߈@êJ¾`9}·Æ;ïIK*<åý ù«¦•pÖÙ–Åáó§ýí_eŒèáäÉ;5˜h©=Rޤ£ƒÀSi£O <áè¸Nq£Ðp-Ý!¯¨h<»aŠ ùj=ûâ€àÓˆÐó VûÀÌ{=$ Ý‹½ øÀ…Š‘ð ô@ȃH $Š‚x UÁ›Ó;¾œ£ˆ–‰$‰"„ ̈"Ì<— ÂÉK‰¤HÁé3¾™/γÂ!ÌA¢ =4Â'üB”BqÁ@9BäÀè»A‚¨/'Ô<þh”>r¡BB/̽\„ÎØÂ>< Uó 1:  dà C–ØA–¨¼è @4ˆíÒ’«¸±|é(¸£ ×*)¶"õ¢Šph‚P Årx†pЃ‡R»—*»'¶‹EYœEXˈ“kVÔ™¡ ¬bæÀ;½ ŽäXšÂ˸óFÃ;ÙX@d$ÆÁû™ñª*3¿‰±Àr»@ÎV`>“p 5L('4 ‚èÆq$Gr ¥µ©ˆrº½ŸØAH4‰øÇŽpǼ½¥Ps„ºFz¹F€”ˆ =t‚Ü 0ǃ4‰pÔd 2•Qƒå‰àɘ ¾è=FÚ™TÐW$S6Õ¡<7³B:6-ŠŽì&òíÃ/Ô(üZ¦ðÞç%CÈ‹ÔÙ…£@^¤eÉ‚È߯UZw)Ä œÞôÅÞÛÍ]süRöÝä´!Þ1Ê`ï{]ÈâÊò¢ðQáa8ËMV…6h‚ȃg˜†bÐh2êø{\qÍaf¸s WÙWÙ´¿àªø9ÂÓ8ÁË8ÃŒ×vµ MiÌ„W£qšÚÌË=W_M¹±á_à]ºO¼h·‹‘äâŸþëØïdð%:ÞŒ1_/îÁËSà§kã0Ž›5®c9nüÙ´u¥¬ÜW!î´è:ÊV¨ÛF9Ö½Õƒ¾õ2 °‡¸,pd³„"E§ÉídOÎ/v‚8‚”?©€­÷8FÁ Æ`ô Unå õÔMˆÐŸöá ì¸âÕ­b»èeã=¾0ÌãÝã4îGeùå¤Cc7Vc:þG;.fá‚cf¾c¹Êchæ1ÄãgîâSR"Z±Jï³´|y,ñë‘`Í‹º%cM‡´ô0Ëð'°xÎäóVÞa~îg&ãä~i["#tåÜ Q@¥9O±£Äœšw=Žþ#=è«‘h'~F#VÎ’°óiÔbdƒ7öõfI²œp+é1FæÅé6¶œj–fPz7k{¶–þ­ê‚ékŒfšÞ¶•é kÞ±i½‘iœæ©£4ÆÊÊ ÉÄÜ’‹oÈ“òD8Qä™1E8ÖXX…mèŽi¸hˆ…0…{¾‹tø0òšó}ÜONkÉEë~™•lJ’>Ú\®²;Œ0C[¾å¯¢k½–åg<ÒnÍÖ½‹ïb3*4Eƒ4ZlƆ´;s´Dû3Å´Ç~¡FKl5»ì:ËlÎÆlÊžìÊ~´ÏN¡ÌvlÆ’Q y%|)^&l·ÖƒtVv>EwVþ F fWˆ„Uh‚(ØG~¨ˆg„¹a€>2nî^îŒða©ò"4û_³‡^šì¶­‹ŽèØ:Þ*°]¬mV«“>ïcFïfFéž6:õ¶fhséøÎi÷Noû^ï÷–o“¾oøÞïÿ€P±à(«Ã®F± ÖÐPO“µ-ªžB‰! ¥]´Vk —E¶Æ0å-Â,ñ£• qèÆaè>ñqZnª(åÖŠxŠŒŠqŸq?(¿qÏqßqïqÿq„ò£»à¾ÅÚUðø“ïн5$@¯’Jð³e–âhª @²p€vn-ŸK…ªh[]þŸ^+s82s3×±ïØ?=@à™füæoýÎï8éòÆÚ:§súžo9ïo;ÿó=ŸsBt>ô>ß•l¢º­X,|1p@’©hp'¯’0‘žÿ%RãÇEñ¥ÈpP¯ÅŸ•Ù¦ðh׆ë^õºFs^“L\ü"X A2æBtC¿õDôƒø°<XýÅs[ÏubÇucßõCßæúÖuDovew–éÖUKSˆuT׺òóºÓtøÚv±{R¸ôô-÷†wÁÆ:!w[>auvwu3××̺¡ …ó¡~vÿ.vdgö^Gà`ioo?·w^7ïd'x}7x|wv„?vþ…ÐùãÆÂ1¶=tíJoËΞ€ #}öôPÿøÿ"q• Qß"ª vOyw'³»ˆ'."«ÍFl=CíÒ† š¯ù8‹lÍ–lžßùžÇùòì›úzË&ú:íz¤7 ¥4¦§!Õþ äKÌ YÂ5,é·''² ;̵WmÈ({À` ´§ µO{¶_{·o{¸{¹{ºŸ{»¯{¼W{Å0û̺\Ý ™ •ü•Ç*8ÉÐ ÜW&ž&é×sýpü‚‡ü†jÛé˜Æ6É?xÊßf Né³y|`§¤Ï'·ÐŸüÑw6•Îü Ö|e ø…|Ì_}×þ¶{çíª i—ø* i7ßP“tÿp–q©#jóUÍžh~æ?;þúùnòû0¢F¹ö*Ðí»(®hÒå7 ¹z¹õÑš¶u˜–ï— k¼-Â!æ|Oø9Œ7ùýÊ/c÷‡Þè…ýÎ/8†€ P ‡ DxÐ … 2tØáÄ8\°ˆQcFŽ?>I0"É’!GŠp±£ÊWzŒ‰òdÅ”oRÄi“!Ì—.[²ìé“eÍ™Fê|(‡¦±ôÄÊ`á•©WS«Nµú*‡ž¥"‚%aõUÄ·ߨø–£ì7¯>D<ÛjS·Ké>}«×-Þ®þ~½v}XÄà¿z#N¬x1ãÆŽCŽ,yòa–é¬9á¼v™êÕÓÀ`ãL£>­Úô9çVa6ìÔ¶eßøÚvmܲOû`ÂoÞ¶9‹vç94Ó°^/2(èO¡@ÇåÈžÃ$€ìݵçÀ©½!øðØÇ'EÊógÍìéQz_p|Ñúïís h=õþ2‚ä^~øA„^yÒ$QQB1ÈLÚ!¡@~·xñU8}ò èPƒþý—”€ù͇aÞ!¨žAÊd݃#R¸PyZ˜¡‚¦ÄâPÿ­tŠ'y7#I‚Çv}æ+Jº““Mº%ÚÐ%BþãfÖ g0ƒ;ZîÚ\Ì}vhe2W—>ÄâThmBåTSp>%‚wâ™§ž{òÙ§Ÿh Å9oºÉW˜wÅâXb½U›¤³ [kŒ3é¤Å­F¦ÆÕ†Zq•zÚ›pš¢XXjö‹s>hÝŠ+Vç FMTÞv•âŠk¥àÓÝû#½Ö¸SŽù;Å6 yãàê£…Ò »®8Ò”b}ûÑ "€;j$dvÏFH°åY[¬;Äf«l‚9…Û¢­àê]¾Ún$¿Ö’÷nî«o²ó¦´`­â¨µá9l…5:o“[|°Š4é8®Ç@íûþÏê:²¶$W<ìÀìí{w ò®ÙJË+¿µ+¬ÀÐ䤙x)çh__5@^Mæ[h©ÅV™r-º(ÔhzåbË1ÊêSt­Ùµ×_ƒ¶Øc“]¶ÙgŸÝ&Ô\¦Á¨YuÜoê¡Í•Ê[lì¦n~ÿ¦à º§¦ ®Ú9¦žÚá“Ò5ÚÚbJÞ”¬ñ”yæNbW”ÝMØÀ$7ô9ĺcd“ËíQ*¡.ñ„ç»7”µ®rê&¿«ºÈ®×ç2CàÎZ<æÆcÎJ¿{7ß袛|ì»ÝI?¡‘»6D-ŠÀߨùñßc®»Aⓟº”îa'ºBNúþn"ÂÝJDìÈ¿ý°µ4âíë¬þùæ LcÂó^ýè'?؉/ï2ÝøÂcºë©Zþ à»%¿ °~œ£Ýôvկѥ¯zÔS êL49=°"nc¢K 'Üí)R0 ÓÖ2ƒ<ðåhQËᘨöB·è0kbÒá\eÄ#"1‰J´Sb†7ÎÐM<ŒÛ\寠j5—²CNSªK¥f‹¼£âH¥EœÇŒ¬Q#E>šU91.I MÝ.W@ðÍoVÈ"–€ f²èaK ÛªBžµ±Cp;²‹ïN›d ryyäD´‡ÈûxxÄ ý`·GABl{"Ë‘âã¤þøì‘{ô2`x3ÑÉŽZ²;W±,é<Šm‹X¹”×ëâ—ÁfD”Ÿd$¦@w,ìMr[Ëå2¼<Þ1šÐÔà+áÅÇÓ,6ÇŒOéFż\É+^È›áøf¸ÙxjáMãjÚ7ÔÐ&5^´in‚ ¸Ÿâ§§áŒ«°´P"Æô)vœ¦9Á¤é9;¾jÞ°F2°™þ°u—P0W‡=j%Sd§D×ì²÷Áë­‚­#Q‡èjMJ³ªÓDàó~å<¯N/`= lÿFô;»Âï—­,+ôòׯÇ6°°©KŸaÃ*VUæG¯Àlì_»Š©PB)Xé#eS§»õõ±åTl'ÛÕ¹vµn ‰e¹ú<̲2·È»*`µŠ=÷xv>{C-B¨äP§¦i/-¤’^’(j‰K^ÒRÛŠP2]׺PÑ.>ºÂ¿,1¼â/Ÿür1½pn u)K êÜ®ƒ¦¹©Ík€ó)ûþÔ¾’"£Póv85–ñTBÍT¦LC*g…z±bSbÅZ<"”üÑ„AyÌ‚åþ ›ÅšÄŒ¥Ú೚+™:eÉæ¹3•î/õƒÎKÓ•£ddÈicdêkÃÄ-Ç`\¿ùQüºðÊÜ$ž’ÇGÑì‹ Y OØ’$ä‘-¦Í¿X·1N'dýõGÜÍl«VæŸ!Ç9Vë5 Ù@òea*gxe”X‚Ó{E9É%/EÛK0’Ö•6Í,UK¡ mèC#:ÑŠ^4£Ý€FC:Ò’ž4¥#ýèK#úÑ…Ö´¦ ÝéO¹S¼a仚ž"NTD5O‰êÓ,up„0óX=9¦°¡-m€=§J”˜­D;“]k­%(ìÏB)~­7=æ?,úÛ‹ÞÞ§3 0>ýÌq¢pÝ ÚèÎEs.Ç;4A¨µþðÏE8<ƒá°šÔÛaþÔÅÔ(véb™$¡š.²ö\Ï51X@7SM„C3'W'á{}«"æú.ti”öpc—0¶`€°ávóyE <ÒÍ£<%J±6k n/X˜ÔéRühœü6o·oq#÷p÷çvoë¶›(·q?·pK·s÷önGws7vWwqO7s[·w_7twwrwv‡7Jq·v›÷z§wt»·xË·z“7{Ãw}¿·qÇ·y7ç÷~£÷vã÷|ß7uÛ·~¸ ¸çwx{'øƒ/·‚›·A­Ðù-†Ô¨¡D—ó–Å ­ÒQF œÁ?eûb¯@"5;þú>slƒaÛ8}khÀ¢D«vïøêA8´Áš(Cìêó3„ƒz]Æf ÏN/Ç‚h¾”¢¸oßjz0šku¹Ô ·—.G"&ÛØÍ@M±Vkz᳚c)›¯9_¬ùñÆyhÌyš×ù]ܹµæ9Sì9S´¹Ûüye¼¹œ¿9º:ž'ºž/:Ÿ7ºŸ?: ÷y #:`ú¤:¦:¦_z›vz›~ú…º3:§+º§Ÿ:¨§º¨¯:©·º©C:ª;ºªÏ:«×º«ß:¬çº¬Sz¤[ú«»¹­ÿ:­K:±o:®»®z¦û^—1y«Í¨ÙõÔ X+€úþç7x5 ƒäFnbC®6L¹Ðg¶Ñxjÿ0Ž÷`/JWPå>¨l£ ´Ú@A€;™„ pv–› 溊…þŒ5’1— sW®j;skËM˜P(¢þ2ioc±V™<öéi¿7|^x¼Ôôpȇ»–29Õ€0É/¼É7sÊŸü¹|ËüË?ÍÌË<ËcÌç¼Íï<Îg¬Îÿ<ϽÏg#нÐ=Ñg—Ñ/=Ò7½ÒK!ÓG½ÓO=Ô#Ö¨<:§vµTæf‰Ñi%¶óv)´^œX@8„€S4:  HC ÄBÛƒ7°=øÀ7 C? , 4€14þø“12´ø‹×Œ¿ ¾ÿ}H DÂS¸2xC?@Á«jßg¾¾2Pö‰K¼>9­¶Êº3Å;ÄÀãÍÀÞÇ< d€&Àý(9a¼A‰#:t…Ã* |Eës~™˜osp…ͦaò7ùko9ûj9“ol\d¹“s6Wì› |™S®C¼…??Í{¿ÃC×_?{eaøŸÿz!¹úk=ú·?Ãcv“ÃóË¿ø[<ùóµù¿?ûÛÿA„"$xРõÄZ˜!†'|¢E‹3bdȱ"ÃŽ#†)$G‘In¼xRaÊ’01–TI3¦Í—,þy’ӇÛ“¸;ømÆ7j¾å@ú-Å$9ô¤zY=š€1 £™ dô| Ø/oèôX ¡,V“Iž5qáÄA¹ªáž M@›Iw2 6ÙLD¸(Çòpa!œ© )b©m¦G™·o"šLûö+Üõü ¼ÑBÕ}4iæÃIƒUzEüº×L„[e>HÄØ&VBº& CP.Ö/˜¶Ò([Ðã¤ÛÌßôD, ˜àT“¬K›È*‡»qîÂÏJ<wà׋w·¾_L‘E]ÐÄ gDŠ züÑÇ 3È"‰RH"\òH ‘d’É!{”ÒG(›¼òÉ+£LòG+½DRË0©¤Š/­ÌÒÌ,ÉLsË0·œRI7åDSN8í¬²N1ÉÌsÌ8Ù<’Î/÷ܳÇã`¨„&ªªÕ…p <’Zª©§D,–©ÒÃ;ƒBèG ð&¦&¦Fˆ 7=Þégoòxæ™iÈh Ckƒ„MùR€•be¦‰Âi€ Z%aŒ!š Æ‚XF‹õ™Ymål›†šÁ£`HpQ W¨&þHh" ¨Î‡"¼ aÖȈ Äéç™^õˆê—HÐã˜&†XHwá­µ˜Œ¾©(™Í”ª†Œª1Š#Ôƒ lhãXü¸bÛô ªúØâ‰ºùãB®.å½€*ÉÕã[¿ŒR-"ow¦¨æ_žyb¡Df9æ]æf¡‘>:æE¡žÚivEfZæ§«žZê­·^Ú㦵f£½~l”½þÖ”W,hÛ‚W܆ÛíWèžï·ëŽÛ‚!øn;o¸¯;o¿ë¾[ïÄéæÛp½<îÂù¶›pÅóÞ»qÀ-ß\îħ<òÍw;óÎç\òÃ+?}ô¾ÿ6rþÄáþ\vÈ1=öËS»vÎÇ]tÝ=Ÿ¼÷ÓoÇ;÷Äaw]õÐYßôæÛÎakŠqN%W‹I؃4%‰I˜Á¤f¨hªŠ©¿˜sÃ1·‡ø"oÊz†~oÞ Á*ì±' ¼yÆ@Â1†7 £\ÜrÈÂ0²¾ü„mH·|nMˆBD@ÜÀ _¢Ò„tXÍ"¦a ARÃÕDPZÃ0ÆDóE®s)Š–aÞiAD…c‹ìš‰Gµ¿ö$¬•H¢EÀ‘& ŽU¬°þ¤¥(’q$. It•#B*Vyhõl+-ׯZ6Õ.5«ŠeV«zÖ–mõe©˜ÙEýe¯peë”Iº]Ò­˜¯´§t½‰Oi{yÔ½&²i‰Ì[³sо\²y¹lkŸóÙÇF¯€©=Þ{–—›ÚV·£ 8fŸ›·é7pÉííf£;–ê¦öq»ýKsçÒÙòÖܾÕÛîjß;Þù6¦=•ÇJÀMV!½IŸkëYIsÚŽa¨R˜â”Há# 4k(`„ü‚(‹¹bð–†Ã-¯Î+"ᘣ5'lÍô…~ £ Û¢Hκ(²˜²0mØhÂ, aÞÐÓþE@óU ÛhMG¡¬¶$œ"—W5cDÁ!C¸Íc€sty(Áp´±öipAh‹1lÎii`í7_ªÎúÚÔÒÜ5Ÿ¦Èû˜oeœ²-,Òe“Â&ä[.‹Ä v‰®®±‚®‡<¾â Þf ë¿Î¶õ®n}åkbjSóš0´=¬oÿ‘3ž1•Å¥&r¬ÍóBS–Äœ.zýÍðd2ùîoåà»LãטÉçòñkýdß½Ëe¶}«_üï¯7úÕ?õGg~êƒßºÊ·nû£{þñ¦_üÜ/ýßþð;SÿèO·üM–¼+nøJ~8O¯þ@{&ïòz®â)–¡bdp¦…!tÍ“¶E±c€‰e©ÕN†µ2 $D`gm´Néb fz ‘<"ÓHbzí!i ‡Þ¦«‹Mû°IÚÚæÚˆ-äKýÒéÛqÀ¬iø‘ºz‰§­ñšÄO½‰õà>1‘rFѺJq·ôÉÍIÉ©OžþjQ9‘Qú`I«ÉÑÝn ph£ÞçUÈÙ°j":ÍÌç :ÎR\&õ€XŒ7ª£ c+¢ñÞðÔD†è6"ã Ë oB®>bk¯ªhjâ®±â"¯'ŒÊðÅ)¢&²GÇ1® ÑR£A ]ÐE$2oâö!uo'®ç©œÐôâ[0Eä.Ë{HcV°5ÐðÐöJjþŠjâ<&!_O$²#‹n$ «$mM$QÒ }"òÖÒfÊ•ŽKÙî)úþIÙ„½Øïý‚± 0šúùž²¼vR)»oܺ )u’(£²úšàrÒù¦’þÈqª²» rþ(¿ò¿ ‘+ƒráþ++}²ÒË2·Î²›‘Ÿ¾2¡Ç¦Râf†³Ç ·g !Œã$l3 ‚ -ñ  R !ÊA1Cò —‘ÓÀå&>í÷NpÕN+« vìa3Ñ –ÀÕ<‹´)©,;*L èÊÑä ½ðè sŒ^Ò6«pÔÏôtÌÏ6;R‹b %7ÛÐóð7go$—Ó2Ki _Ò9¡s£Ói‹õLó€M؇,ušîF<±žÒ’—Í(·I› q+·i¿ŽÞƳ·ˆR)+Q-Õó&ù ›èó=i´=·<4? N@£Ç,;C)òT ]  ¬óŽ˜Ñ­%å/=äæÓ²ÑNÆ%LXPòÔ*"ÁL‰ô; o%l$Æ‘5®,&w4#Tf5¹‡4k3#´ŠB:!®bf6T&SÒJÙÑ­p{Ž0S~毾gS’Ð oK=°qŒÂ‘"©¥MìŒþð6at/ã”4çtMg´·„Òg1)ùóù–Ë»møu@ÙP]ÑP ÎOÛó¼îBÕ++4R¿iR•- ðRÿ”')õ*!û$µ-‹ Q-uT1µTAõQû/U=õ–þ º,T¾"g²¸”FiªJõ2 j6} |8®Ï'Š6 H‘³ K ÷t”:áŠ3+ GF%Õt9áÐK¥!«S;UÏ}-³v­òÞ D»£QêÒÒT" ­FÒ®Ô]më8Ëb®°c\õ2}b}¶0 ù*g­]Wè[Ý`[°[‘ô6¶]—ñ] “ Q·Šò·ø ý-.és*_§½õ>7•Q‹b¥ÏbcÃRwâÿ.VM¶áP6bU6ã/dëkA'4fɯeq6eIvee¶¿8>ƒöfwÒ•² º^š"F5. ^Ÿ5`‹µ fd6ŽË)"êgÊñþNt% N÷Òð¾¥1’[ÇnYíp¿ðGËu[yÐD«m1â/8FSš®®BrÁ ²Á va6KY”ŠÞêKyâÁ ¢hìöñÌqÐ2ñ”•3Û!Gë5 r]Br/oZgæ'“òžè­›Ï+™rV…²#QMœ ôÛT·t3¶uÓst—I(Y7Ÿ\ál)YV¼tÞx7ú|W¾€·vìve7wi×ûºkx]VvkéyuË^ª4Bl_­ò.¯(ü’R<.0Ss"Æ! Ê×|Ï}ÓW}×—}Ë·ÎwÇ’‘|ß÷}Õ·~ÛÙ÷~Vbè7}ï7Ø}“þ@€Í·€ó·|ã÷^õ0}âVá¶üÕo3r#^ öa{…""‚JÅ0ÑrOs›•Ôv:D+7GQ8náð„Sï´®cj’<÷æ¿–ò<‘×›äiÿbõ+µO‡_qA+5Au6ˆ{¶‡eõ‡7¼X•¸ú€¸‰c6‰Ù³u²º¨ø‰­XÿHWq‹Ôˆ§˜åò>µòÿ↢‚M½'~i3n¿µ5'â"‡ÕCïJ€ûØÿYy‘ùL‘Ù‘Ù& öèÁʀݗ@˜“;Ù“õW“Y!“õ—© FÅ4 x”X²þΓÛ×Uù“99–ÿw–o9“1ù•q”w9€ hØB›/·(ɘ'—Oyô˜¥oú¢øc{=k5›’9Ǹœ.Q­±ùeÅËÚ¸9¥8›Á¹šq¸P™¸œ©yûÐ9š¹kdÙùà¤@A·Ü¾X•æw•Ñ·FM’ríTdªq¥q b/EZ¡š¡Ú¡¢Š¡%X¢#Ú¢/ú¡}@¡)Z£º£1:£AZ¤C%ŠÚhêÈÀ Y¥Wš¥[ºãhƒSHР¥kÚ¦o§sZ§oZ@Ð#<Ü<~Ú@öã=Jd=8$($©ëc?X=äã=–ú©å#<~úþ©Ú©Ïc©ñc«ß£©Ÿú§Q¤=¢šª‰š©³>”ú?¾š¬£š>ȺªÍ«‘Z­™ú¨ÁÚ«¥:¯Ëz¬çZ«ëڨﺭÅzªãÚª‹Ú«Ñ:¨ó£«Û©[¯áª¯Ú±ÿš±×Z°¡š°÷:®ûº²Óú²íÚ©ñګǃ=Èú±:FHä<»‘3‰`¡V–1ba % ä¢bP¨*zÛ·¸ƒ[¸‡»*PFöhkcˆ[¹—û·Q¦:s"¹{Û¸™»¹a†º©›g¬(Õ0ð!*:¤G¼Ã[¼Áû×Èö²Py Æ[¼?Ú»Õ;¢ÙÛ½ã¾ã[½ç{¼IfŠŽ†d„†#jNþ¦j*Fjü[·e¦kl†Qüb¨&k¦Ècœit›cø;Á'|Á¼c8ÂÃFÂ=†ÂUÆÂUÃü”&<ÂÜz*ÜÃ/iÜh6ÜÀÍÁA|ÅE¼Å3üÁMœÃQüjTü¿“¦Á\Çc<Ä{œÆœÁ÷ÇKÜÃÃÅb¼ezil<½/ºoÛ&èòzXMKŠTBZÂ<(Æ\ÌËœÌÏÜÌÓÍGC9ÑQÍß|Íá\ÍÉôRbÍãÏÍ<Ï÷üÍÃ… o-;´vº}{ЯÛÐÑ=%¾\YÚ"ýлÐ!=¸'Ò!ÝÒ/Ñ3ýº[&Ìo “ k )"´ fÃNþ-BµLk!1M!J½AP]R!VÖ9ÉÕYÝÔc·UCÕåêÖK&×a}Ög½Á~½µZ½Xˆ]ÖQýØkØwuÔ_}…ŠÝÙÙ'"ر*¶˜ýÔ{] ²ý)oÚu×ÏýÙ©Ý”Â×AIØ;‰`i¸/&;SXn¥Ð¶í˜ ©Ã/\™—ÿÝ– Øß÷à;Y€kY– žŸ¾}›Ps;¸ ðœÏ'^Î)Þâ+¾âK¢n=R;Tòâ?^ÌÏä?~ä1~äKåçÜäáüÅ1‡ôzAr#`†yÔle^'O¿}Yéç"r§0Mc³PÂ#]Æ M‹~æƒÞa§µ%™>þç7⩾çóTêž$…žæ—Þl§žçwë~è¹¶ŒúlW¸aC#n|Ab’šL;î“Úîïïó^ï÷^ï݃î:îM{î×#îŃïñí¨ ?ûDîË#ï ?ñ»šî“ºî3ó7?4¿ó1_<Æ£ðEXÓ^0º ¸“[õ¥›õ‹»õ­öWßõg?ö__ökö¦{ {l54¹Oÿôõ‰Ÿø‡ßø;ø7fÌsëÁ1GÏ–s/ó³r˧hk?²%Šåú·ÿlÁUÔ‹ôÖ¶Cò(·Ü»ŸW¿ß¯ üS/yToë4ûûöâÒ´\K˜üÓŸ!òþŸ$âñÑ… |ˆKOÁƒõô¡°!Ç&§Çà·gߨø–ãÛŒoEèL¤ÉŠÁPªÔ“’åÊ–0_ÊtYð¤A’"G–ÉÓdL—@ }y2NžFwqÔ'Ê“Cƒ&<)2ªU™9k6,¸0a¬$`ÊK6I³aϪM‹ö,صnÛ¢}+—îZ»s寅ËöîXŠ z·¬áÈçU̸±ãÇ#Kžìx/ÛÅtÇö›²[ËzÉr¾Œù3áΙGã-[˜µhÔ¦Aó úòfÔ´1¯~¸unÛycÿ®útéݧ}ãæmüvÝÜwMã–~XyõÞ”³ƒuþ—ÐcF3Ü}œ!áÈ…\™–Y³=û÷ëã»—ÿ~+C®HŠäš~¤6¦ÿ‰à€( Úœ‡Ÿ@A”`,]-Å € Žtà…ž§Pêuèᇠ´`z÷é÷P9Œ“âŠã´èâ‹.æà+¬´8#4ÚˆcŽã܈£Ž;ùc;ÖHdGé#KÖèÎ85ʘCI…åŒ*f™"Œ\véå—\Êæ˜d–iæ™h¦©æše®xã‘D¾É"–sF§“p>Ùc‹,ö©âŒr¾é ZþÉ Zæøä“n²"£„2jè…¢H¨Ÿbbj(ž€Ò(i¤t Ú©D–Úè£YFªþ%–Vú¨¤}ÂZ© wšª­ƒ^©è¨?²j磨¦¨j£”öùj¥"Û(§‡zz뢡îÚ,©¾®ê(¢˜Úª©Ÿ¬òim–]ö‰g”¿*k.Š a4ÃuôQD&TeD vU¯`÷2”¯ûæ+‰ n%ðB>,D oE%âgTW÷IØà¿&&œ°y÷¬ÐCoì±×{“‰òÊËÔNФdÒÊöTÑQ:œN0Ó¼SÌ5—”³Ì/ë|³Í3û4Ï6Õ4ïÃ>QÅ2S-3íôÒP7M•ËQ?-õÕVW­5Ö[g]5×`{ö×]wÝÓNFG3ÕJõÌÓMTî7µÒMWþ”ÔÉ#“4²ÊvßD•ÎT÷]SKw³íÕÜ)¥=uÛˆ; 7Ï^Å|väwWµ´à:ÙÝÔä!ž·ËŒ³íxå7#´¹ÞUÎÒå‘ëý¸áÃ>÷ê']ИŸžøá€+U´ä³Ÿ^ûÙ6ýM·ãÁ£Ìwð.§,·wqäB ™B’ ðöÚw?1C¼æ©Sn~ùéìpøì/¸Ôzè—LýùôÇ_ü$‹Ï`öã/áýÔIöî>&„€ä×õS@&s Ñó= I,€Ubžýç?ô¼Œƒ !G(Â’ð„&L¡Úc½ šÈ$,Y~/Y°‚ I‰þD¦ˆ)mÑFÁJÔéÐ c˜Àú㯠I0ƒ´—Ç’ ÆASYHܪW¢#>(‰ câ ˜=(Šdøš"ƒªhA aÑhÙ¢µ¢¯€al‰ lâIÊxÃ3J1ATãø®ØþiÑ…|Œa"ûX%²P+=b _6!3Zòˆz»¤7),¬Š%ÓŸõFɽ®8ò†ì³¤Á,¦0VB¤”¡˜,ËçJ‡Ò‡µÌ%þÆH‰Bâ’?TBQlÔŸ/ÉL¶˜¦dd({ ²`Z³šØæ5µ™Ík†r›àì¦8¹IÎp–sœæL':×yÎvªSî´$2¯þ(M žQ`n¤&Åx“dno|ëë[çGÐ0Þ²žR¦))ÙË`ÈBûœæÑž¹¾WöÓ–ÇäB)¶Â>:´ž _F)*K^" ¡C¤çD;šÁf4¤uáI/™L„Ž1•À”')iªO’ŒG#áÏGžñ) u¨ßø†Q/âu)©EE*S¥êÔ¥:õªÞ‘ÂS§ÊÕ­u` «XÇJV°2U©\Õ*Fž U¯&u©ZëE„*V®ª ªG-«^¥ªÖ·­XÅëYךÔxg°m½êxìÚÔÆ&Ö±Œ}¬d Ø·RÖªuëd ËÙÃö³­g;»V¢&u´¨­jCËþÚÔ¶vµ®-lgûÚÚÆÖ¶´¬nïª[¹:•³k•FL;Ùªnµ¯|m+\{Öåʵ¯h]*[›;WLºMkvjÖìº5ºÕ]¬qãúW蕯á½î`![Õíz§»ý®o«Üè–·¹ð¬P{»Þëºw¿ÞÅ,x‰ Ùó·©âeoVá{ßßj–©A®_w«`ú~‡“ï}¯`ágØÃ þ°ˆ-ÌU“ø´(N±ŠQ<îZwÄ06k‹_¼XÇXÄ+Î1]÷;ã‡x¸­‡oìc"¹È†u±ŒŒä÷"«Pnl”ŸœZ SùÊ%΃”·Œe+C˜Ë_î2c§æþ2{ùÌcv¬˜É¬ä#ǘ·=vòh›Üfúú¸ÍÜí±žK_$7ùÏœíp‡áüfÚ¿õ³››ãAÓ¸Ð2>t†Md@3ÚÄ“~t‘ݼèÚ˘æq§==wÁX«–õ¨S½ã½îõƪ²—liW‡5Ã~/–ÊêXûº×À†ñ¯‡l;ëš×£Þu±‰Íìe;»ÙÐõ³£­ë97ÚÈÔ¦5‘•m!/úÒѶ4·7íí?ƒûÙÚF·¦¯­n@gz¡ÆäMïyÛ›õÎ÷½÷­ï~óûßþ–7Àžogœá GøÁÎð…ßÛô†ø¼Np~K\ß§x¿/®ðŽÏ3¼ß¯÷Á5NðŒÏ›ã!¯8ÉW®ò–³ß.?ùË^ðšÓüæ)¸È-^pœÜçÔ@¹Ðmžs™}èG'ºÑ‹t¥;éLyÀ/NuŠ£\ê×øÕ›Îs{ÿ|êõ®zÖ¥¾õ}cýá.ºÒÅr²“üìOûÒÎq¶ó{æ\§¸ÛÉ>w—ýåPïûß±®qþðˆO¼âÏøÆ;þñ¼ä'OùÊ[þò˜Ï¼æ7ÏùÎ{þó ½èGOúÒ›þô¨O½êWÏúÖ»þõ°½å;PKcK·FÒ4ß4ß5Pictures/10000000000002CA0000029B3D4CEDFC1CEA29C5.gifGIF87aÊ›÷L†„„*,BL¼‚DD ¤ÎÜ &4ÄâäL®Ì|B$*d̪T„4rD<" ÔÂ|œB, |¦ÌD24<6$ŒfD<šÌF„¤ºÄ„®Ì 4äÖ¬Ô¶\äâĤN¬š\\ŠÄ42D$Z,¤ÒÌdfdl2|ÂÜ $d 2|,:<”ÂÜ,f´,.,„R4 <JœäÞ¼Tv¬|ÎÜ:”4*$„VLDB<<–Ä,d\^\424´Z$Ä–Dd–Ä´Öäd>,<:4T,dªÌ$*L̪t \´z4T:,üÄŠ<$"lÜÊ|4äÚ¬Ô¾\”ÊÜL:¼Â¼Ìâß&|œšœDR\4>\tR=DªÌ´fT¬Úä$2lBœŒÎÜL’Ä´~TÌÖä$$”nTäÚ¤$Fd$¼ÞäŒZ<Œ^T4:T|ÊÜ "L¤ÖäTv¼ÜÆl$ÄŠ\,n¼œJÔ¾tL>/Œ.d†¼ÜâÜlÂÔÌš¤l’ÄœÎÜT®Ô$"(Df¬¬ÎÜäâÔ4:4ÄŽ8Ü΄¼Žd<69*„F¤ÜæälÆÜÌ®TœF|ªÌÔº\T \žÌÜÆœ´^$´Úä,N„ŒÒÜ äÖ´äâ̤N$dfl ,,.4úa¢’Ÿ19¡‰9J¹¤@T>8Õy)®GÆ—_¾G†{*X¦‡eº„äšl¶éæ›p·ÞBP¡ÀxâÉ#96•zæE5a{`†ÉÞ˜dê`¦¢h2ºÞ™qF*餔VÊ¡MNxÕUu‚–ç§TýÙ¦SÝ)P©(mƧ–~ 6§{þ…"Ú€¬ì±”ãJ·Žêh­Šžië­>Úë°¾2šæ°ÂêÊ«¥Ì6ëì³ÐÖ7ç@šª$Ja+ê´¦úÑm««ÚÙTb:k|ÅæŠk°Ê®k,²ÊòÚ’ºïêŠì±»²í¾üöë/‘JªF-jS=)Pª›f€Ò"&ìQ¥@žê9e¸žq™^¹cÒšh®íÖ»lÇôî*/ÇÇÒkr¼(ÿ«òÊ,·ÜáœU•GPt"¸}üížêM(áÅbÎjè{邜r¼øâ ìÆ$Ã[²ÑêëòÔTWmõ~4á–7–Jð©Þò<êhÞJŒ¥Ã;:yâ«AÇ _ÑO³›®Ôö¶u½sãíñþÑW÷í÷ßV£'sµ{ÚIxتæŒêÁØâÌjäÂꥹ+/Ò÷Æí´ÞÉ‚ì®É–‹ øè¤—-©e繩Á ì©Øsv»xâi[üã¡„Rn÷»yw®ùÝw§ü«çknúñÈ'gì ZËø§Ýn»éô3‡ª @«§±öºK+ºòà‡/þøvvÅ]+ÄuŽåÉìãÄ€î‰böÒMþýøç8"ü›€ˆÿþãŸo$@þï€ÌQ(À†+ŠŠd?ýYð‚tôö½Þ‰ƒTC˜6¥¤KL¡ WÈB‰+`µˆ¡ gHÃÚð†8Ì¡wÈÃúð‡þ@ ¢‡HÄ"ñˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅZpjm©´H‡.zñ‹` £ÇHÆ2šñŒhL£×ÈÆ6ºñpŒ£çHÇ:ÚñŽxÌ£÷ÈÇ>úñ|´âžÆå-²ŠˆL¤"ÉÈFQŽL"$ƒø„HZò’˜Ì¤&k1ZáT¶#‚7D)Ê~С¦Då)SÉÊUºR•°le,_)ËZÒò–³Ì¥-u‰Ë]ú²—Àä¥09Ì`ó˜ÆLf1…É:Ì™ªäÂ2SƒSîA™ýXÂ5¬1e¸RIˆÂ4€±JBTã ´He3§‰M:ìÒìö0o´“øþ„¦>ï¹Ï|òóŸþ h?ŠÊ‚ô M¨BzP{ÚÓgØ+ä('J„MZô¢½(œP‹uüp£Bôh#ào`C 3,€2j± Ȱ,)H›(ÒÎÔ=eFwÊÓžî´“%Ä\•Å-ö£Gí‡7ÊÔ¦:õ©PªT§JÕªZõªXÍ*C½‘‡BXªðÆJ!‹HPCé@å ‹DpµøF?Ò:ÂÓ˜*× Ìãbõ†9(…ì¢ϰÃPPoHÞØG ê)ON„"°RëY‹4¤@©]­Å]óÚ` aØ„!ªQC¨•¬fEþ«ZÙêÖkzc´zí)X` ;5±_Ý"nQ¹ÛÞTu˜+ ´ÊÜæ:÷¹Ð®t§‹Ð¥:t‹ ŒŠj ™T¤rÒ§à ¯xT(ÃvQ‹õÖb1@ @1†Z` p‚7† Œ+ ´¥ñ]C-¼O¸(¨E,¢Q‹h¢½µH‚5z€?Ô‚>ª7ò!‡DÞœ¨3°0Jóæá¿.­Å °€£Æ°ñe¯{áÛÞùÖ×£·@ñ‹3ÃNÞ—Ë ¼‘c–¦¸<¦a~÷+Œñ:ùÉP–!P¿Ô^eÀ¢¬')­KÝ.{ùË`³˜•Jo˜a‹c8ªþmmËØ÷z£½F0Œ¡‹?<Âç8€5ä!5AÍJ½&ŒÃuô 4¬K„VdÁ쀇wç¡QaA˜(=´ {Ö µ°‚žù¬Tpàµhƒ LÐ5—yÍõ2°oˆšÏò%’ðƒIlQ΃Ʃ­€k]ózÝ¢(ðˆ7ùÙÐŽ¶´§ÝX2_׊\;¡@¸Ëí-v2Êà·&ƒª uo†/Ð=ÏQ·A(·7¼ñ¸  XÀR½ _wºÁ( B,\Іeä À¤„…ˆàß/â (Ò0o<Ü›èb-Van¬ËÞ0FþB€ œZHòºG©røfƒÁðõxˆ]\ vÔ—ãµ€&žQà|O”æ6áÃk {‡XÜHOz$ƒJeC–‹€aw§®Å¥RûêXϺ֙Zf¥ZA>AÞ;àúøÍÇ4ZðõŠž%ð'ä°g5r¢¼&ì!ƒx´  `Å!ð>Ñ}Èâ¦ÅPmxâv˜@{ë€XÞ’»7,ð‚cT£C`D-A  ÀÎ`ÃÙɾú´¯õœ?Æ=–ZkT ¶^†7\ƒÁ˽ó³ïGíoTœÂoÆDŸ¹õæ;ÿùÒv¨µŠÝAÎ)†Tïî·•þÎýî71¨ÞèƒwßlÔn“ý¨â÷´³µ¸å,OÔ[–²7àíÝ£VôÍí0öIQ¦_”E~3DJÜÖ]t€nœµEeæP¢Tf[D} ~!÷~JÕ€ê§e¥€‡ä}ØE4eL‡ŸÄ5(2íç XO]},Ø‚.˜U\V™àlîWƒ(¸z 0ƒõw‚<¸|ˆJµgâPÞE=øgEèP5Ð †T~å—T[–‚¨rHT~÷—ƒMx„:e€EH„Jõ‚b8†d¸P\&}žæbV&8Іnø†p‡r8‡tX‡vx‡x˜‡z¸‡|؇~ø‡€ˆ‚؇~0ˆ†xˆþˆ˜ˆŠ¸ˆŒØˆŽøˆ‰~x&uW昘‰˜d]šØ‰žø‰QfôðBåA:`ЍxŠª˜Š¬¸Š®ØŠ°øŠ²‹´8‹¶X‹¸x‹º˜‹¼¸‹¾Ø‹Àø‹ÂŒÄ8ŒÆXŒÈxŒÊ˜ŒÌ¸ŒÎØŒÐøŒÒÔ8ÖX¼HÚ¸ÜØ5?‰â8ŽäXŽæxŽè˜Žê¸ŽìØŽîøŽðò8ôXöxø˜ú¸üØþø9Y: 5AÙ•BÐ+‘*!‘: ‘9‘Y‘y‘Ù‘i‘lÀ‡’#)’$y’&™’%¹’(É’*’¹þ‘2“4ù‘3i“5y“:™“<‰“>¹“?Ù“;™‘-A‘F‘HIGéJA‘F”P ”R)”T•U9•V™•X¹•WÙ•Zé•3‚`е@heCfi~  a1áÈ”8’r9—tY—vy—xI .ppÙ—~ —NÉ‘;ñ•8é„É•‡Ù•`©˜Ù˜Žù˜ Š1TQÆP —i™8@Õá:'9š,q#Baš¦¹!I «ÙšlÀš¯éš°Éš:°š*!›¸›F‘š3q#¼™x²Á)œ6RšwRšÂ)š‘ùK9šÍ)N¹œÒ9ÔYÖ ™ý –dþé€×åP›™]ਓ™š¿Y”IéœçÙœNišy¬ùž± ŸòŸ°©´9’ó™Ÿõ™žüI”ÏéŸHÉ›êÉŸäš+ñN¡‰ Š‘Ç ‘©‰  Ú72  ŠžúŸKšÊzžD¢¤9¢J%J¢0A¡º¢*Ú¢ýÉ¢/ꢣ4:£6 £7*£8º£:úœ“¹žT /Àtt°–åñ3~ ㉜¡9¡Mª¨y#{` $¡PªSzœ:œª©îÙžÄÐĦÄà¥9¦|)¦fz›bJ¦fÚ¦|é¥l€‘ ”œÂ9¥J¥Oj ýP¥PЧÄé›{:¨þ¨Wz¥z¨5‘¨yÚ¨ÄÙ˜…6!˜jž•j©’Š¢— ¢šÊ©'ú¡…)¢ŸÊ©×Yª¦zª;¡:r/ЪH5J›Ù™Šâ騂º¥ˆš§Ç©¥¼‰š{z«åY›e:¦s:¬e:§öy¬ÉªÄÀ—¯¹¬È:¦µiŸ|éŠ«Ø ¬¿š­yª ¸Ê«ºÚ­¥ºÊ¨4Á¨Œ*‘ÁJVÉœƒ™Šªò:¯ôZ¯L ‘?ºª[ÔªrЪ¢T ßy= )Jš§Ú¤¼ê«Z êš«Ëž©›¯é¬Âj¦¶é¬´ù¬îY›|Y¦î9§+’×z«Š® ‹°äŠœ$ë›Ã©þ¥ÆY® ±P¡#[³L*˜=Z£#j¯<ë—9›£:û³<´D ´F;´G+´J[´;+žc¹ªÞЪRÛ¯ž„‚(ó“K¨/!¨'[² ˵Žz›Í*¬ K­Ó:±i[¶ÄpöY¬g‹¦i«›ŠJ²¶ê°ßÚµ*³c«¨ëi¥%¯[·Ä9®ê©¤ ¯¤º”Œ»©‚ÛŸ» ‘k¡“©IY¹—›¸=»¹œ{¯+‘¯[$¤2ôÆðfA'4 ™¨a›·Oj®­Ë­-q±[±|éžë¥ej»«¬k»5ÛºÚ ®Ã{¨»²& ¶bË·6‘¨‡v­}+¢ÒÛ´™¯šþ[¡3a½ãò£Íµ„0B '¤0B°šLc¼™‡CoˆøÐ›ZÈó#ƒE>Óa‘Ш ­½øþ{îA?âî5ÔŒ‘=‘î1a+Á¹Î"ÐEe‹G#-\21żo#îŠ,F*sœr@,¥Ôò·,£„ÒIÚ¼Ã)DÏü(¤LØÃ¨ÎÖÛ Çú*¤þ»¨.ô‘NÇüƒñ®*‡d?#íªqDz¬+t¬ÓtQA=…4RI!ÜîÉê2ÜM45+ÏCÛ,o´ªÒ®²*ËPú€ô­ÇTg<Ž1T›rÖÿ|QP>iSRW¦HÕ1JBëÌÑËTÕËX¡*VYF™4Ù0'‰L#tÒ©'lé 14¢I½‹µË<©%ÖA:a]2Q¸ÊEöÑQ«Ó Ï>µ›TÝâäKRØ-§ öJcþÒÒ0ÿ,ØJs&×à”¬[ï¦l1óiÄNQ\D(ÞUÈÀ\Ýó]^^1cet]}Svt`&M»—äë98VóÅ9gwÖÓÞf1þ´ 'ŠÅS³D¢Ð{SÔŸ—¦hØvW¦ùTH¡¹å…t:WŸ½YÚcÏT^>Q˜c€„k]­f{m·¯{{:¸} {1¥ÑAÓ;ä©O5÷ë­z•×ùì3ùd°ûSÌRiÝÉkÎ37w#œð×¾³rÏON¼Uÿ:ýsÒOwÏT¹» :<Šu"TŠ ΔÏvYugÙÅ X—Ý\aü¨öSFJCn\Ý^uŸ),æG>@˜ëŽ^p”­¿ýzí³ç~{ê_˰²¡}"Ñ<7ES*t‘UžþwUû…ú{è¿ü?ÍÝš@w‰¯ÞrïßçY®Vµ¸„é‹.¼YõþþG7&_ýCÙJÈž‰]†[TÝÛ-ðjËkŸÙÐÅ0Ç1.x”ßüTHªÕ/HÝkTüV8Õ l}„Rþnø«ö˜L=Ü!mÖ;Ñíé~ ú¤‚Þ(Ÿfw¾oóz+}¤¿HIŸ’q£¡Iñ‰ÎdÞ³IŒ­ˆÉ¯q–±¤õꬴ꣬ru«bš'`¼vL§(Ñ¡g²X‰\™¢ÐLÑ„ d’væ6Ôµ®‡°+ðšþW¾Öµ—NrÁ^opWº‚®vÝk_›×Å"¶¯w}¬_isØÈ>6±‰¬^)Ë×Å6¶²lp'BêX6Ö°z-­g!ûYÖjÖµ%¥ZëZÕªv¶ŒÝ,_?’ÑÚ±…míi}û[Ô²V¸ÁnSûéE¶´4|¨¦rz4o®'q@v5’] Ÿ á.A Pˆtw»ÚÍîDKФ¯î ,{Ù•=@½â½o{u@ ÉÊV¯òE-iÂ×ø.„®~¯{õ«6‡hW‡@°c \ZÉÚ•¿wðg BŒûWŸáµˆ~Yë^CØ¿œÍpe,ß°DÄ‘eo‡u+[þë@À 0lqì‘ñºwÅ þï‰'übËÆé0Û»àÏØÃæ…iõXÅŠdÈuƒ]PŒ6Hô¡L»¼qðI‘ãà0sÿ!3”<Ó*y!‡¸ðŽ{æ³Y²&no묃\D²ƒ…3›5bW6»à6QÉ3“eK bΊf¯ Ò_¯ùÄv ’èIóW¾´¤s¼;YÎË…ˆ‰ñ:jKçÙÔ>nµ¤]-[RÇùÁVÈ—a½WYךёŽu°õ,ß^ß:¯ŽHŸý\áöv7QW­ªsíø§šŠ‡|£R$Ã](Û·ÛÜ®¯ì+ÞoC9×Ý oºÑ«nrþ¯Üè®/ºËMp“ûÌI³¸»»dOäÂK&t¥eæñâ™ 64­m k¿[¶Y2©#þpcXàq·¾ïkpb@ Çñ’=¾èSÏw/žbk¿F…à8À=lp…«´vM¸ªSîè‰ó—æ9Êøxc¾ëÑÂ:ç7WpÉqîfó<Èý%vÃmð˜sxè³Nx{³ŽdI«|á '1hMLY÷ŽÜâAÖ44¥íß¡&Chbbˆúf¢¿…ŠÛòÖwÞ×÷ä[Óø:Þ÷>xó¾\ï‚Ç;ßOî¾ ýÕy&ÆÉÿÛO3ÊÁØ5/Àá j^ú#¨åüÄu®ð‰³þ™¿ ¦4\ÒÝx®ûÔ;{±üë~TØô´>xÂbk¼^K~ß7‰õ¼jZS^Òº76êžóF<È»göcÔw­Gþó§‡ý®g¿};Ÿ×ç}£WÂm£[Ÿçæ÷>’õ»jã×¼õGç¹ök^yâ§¼ò½g}þc Õ9áæ¯ÐÕ¹ 5pIt·Å#<ÅK³cÃ[À,¼oSÀÄc<ý»Àk¯ÈÛ@`4”««Ê£4<¡3˜3=,5…»0–ëÀý:¬•ƒ8ˆ+4F;¸‘3 Ms0ãÀÙ«±•Á £A»°;9<6‘¾ý‚¸;;¸a+ ºb4ƒ=&c4¥cþ4¼  ¾Á•³¹Ø;ƒ0B<¹„«<ö2¿çÛ 4½öR6[»Â‰ðºY=ù­ùR8Ñ’9×;=ÔµtB¥H 'õ)³ @‹‘((D¼ dÀ t-tÄ|ÄIL1IB~­ö#¬”S:/üµ`+FPË9†CA0‘D<<¸:ôÅâû7;Ü5PË,]5k°sH…ä;…|È»‹Èüˆñ’Hy€ ,Fbcˆ44±2[ˆŒä63d¿ «±ŽDÃ%0= ¸â#1ˆ=¸/ðÂÈ»S5ñ«µ Â4?¼Ð=”û:×û¹z; ˆt¼ýrƒCÁ~«5äs ýÊ”¬Æ•K¸´k¼—Ë”,¡”³&\9óÈz¬ÉÔH3´8¥l–£Êõ‹Ã<$Eª”8¸,Ë8Ç=Å3³ª§ù%šÒïX%mAˆ"AŠXŠ)a¯Ò1° A8#­þê/†TœÈ¬F «LÜ«sô¹ÔÚÌâ"Í´0¹|LþÈˆÌ {´jœÇ®*4Í˲ºÍ|´W<ˆ34/ÔèÈÑÔ«üÌÏD¬ÐdƒXAÎ2ÍÕúÉ@ë;È”/¼‚ÎÐ|ÅÊdÊÖ„MÖä0Ïô¹ë|±Ô4ŒÞ”ÍäÌ«s¬&ä+°<Îß,1×½jä@ídJÆz=8ëskÎÝš&ïÒ¥Yˆ@ ¼©…‡Š;"Ø&êJš¶@):Â(¹j§A;Í&<½uÏÄÊ»ùPN÷´°(\A ÅÐÍ=½Í‹Ï(¼+Sÿ‚¿Øá`>âÙý^(&¡¯:*¸ÍÛ7eÚ—Êéi•aCâa"êb¸KlŒY’=³ô ¼çu`}œÅÄ(A ĸoÛ8%CǬ¹õ,»k´J;„°˜Åj6Ù¤ 8¿ò4šÃ³‘ë “µ3¿¬KCýŠÚƒU]n5]^veÌcþŒÝ‹ZÝ3f_=F\q¾Ùm=*m‰‚Îß¹;‘W¥¨LlDJ|ã·¸<ýûÕEÌŒèÌn½-ƶ¤4þõÄ4÷‹µMJ»?ŒÕã»±³>³Æ­û4Î[¾Ûs>¹–I{¦fŠc{Óè7õmÞîí·­¦~æÝ-6¡@”ŸM ê‡@¡˜EfHTÞy•¦§æ1ìÖ?‹ˆê®ëI–“Áä FFdzÅѦƒagn=’>1±Ô “BÙ+˧‹C5L—Àeš¶µDÑ^ª*ºÞo½î‹íåôEß9î¥ÝWãÆ#ƒ`(bî D¼ÓÐX„®µîȾD D í./ gÓȨlƒk:ìE~㾈c?U,q™'í–r2B¦MÝì•ò!¶²áý Ĭð. –`±p@)u¹XMåÎ MÉ ÁÍ"ÃòtQP£<ýÂRD{ÎâšQù$®élÍTÓNþDNÀQn*tZd F"î`Lnš=‚ô]úç¢ý«áéè£Å¤…j•»-@-õÃkMáI‹N4Ò*ÕÒ]ßR!ýÒ ÅQÝþ~ åìQ*íR =ÓMÓ|·Íjü;Ï-¥ßmå'ö¥‰ªQ—ôsG("—[$o»C[ƒ§be®Pa ²)­ý› O™¶^’xõÅ¥HÔà ҽìÒ}Ò0õÒÓΖoùMFNèDQ(ÏôàŽôcϧlÝž¤ a‘Ï"–¹)6r$^òoð…?)'è•ðØ‘înÒ6Y½õf)tÆl ûòÆ»7¦H/RƒÙSS¤óZGIð”Ê׬¿Ÿô@÷öf‹1ô¥V§ÊÝ{+4.xÆ)w*º• æl?w Gø!¶vI-ì"¿Þ¥r»Ì†Š»¸c×µ $·Z®ó*z›àínDþ°Å@ªK6X³¿×3Ç•3}KÓ3+ýý ;¦t1oô³hüѵ]Ã!n=¶YxVª!z6Ä¯ç ¦¥KŸ}›ŽbØíý&®ª¬ñïÛ“a~òùXÅÙçÕ»¤ö¶±ÖHQ׊§ÎˆÈ®I;Ç;C«=vô4kÜqo-OƒEÌjVÌhFŸžž5zœì–nöfgîýt$Hp Á„",¨ÐaÇ'Jl±"ÅŒ)^ÜhТLJC^Œ8Ra TtÔ¢S«ß˘tèø¡âç&"~td¸)(¥ :´(Ò£C~©±¨C¨L&%*•©Ã‚B¡²!þȆ ±„`Á $Öµ_X‡ÒªMÛUmY¯Ó®5ø•à!¯ß®}{×îØ²]¡",¼ð°a’‡'žÌºøqHÈ‘1fìÒãÉÆM!›\¬™ãæÏ‘E‹žlú4CÉ¥WoN-9kiÏŠ_;fLuÂ~¨bé&ð—ÞpØì™3ƒŽ›;B­ê\©ÕÛ¹^ÅJ}+vëÕ nµë•X^¸:À†7;Ñ…\Äö¦÷Û~î×·l šWë¼Yùèq;E\Ù?j–µvh²XÒtýiD k Æfƒ£ÍF[„¶)h`ƒ® [kv¸à‡BØ fz8 …"n˜UJ+y37DÄøbŒµ§\Nþ;ùÑÌ-õSU¹”tíAdtµqTW5”Ýx^‘¥Ã~kÑ•_x7àµe”]òÅå—pýÕW^h½u1a™iV}S*y¢„“%ÖšX'ž™ˆà}¾™â˜…xZfyÖÉ` }&*(‡†:¡D²RK1Áô›‚Ü”AŽÉí¨C Øe—T“PvGÛDEQ%*VOþx{ŒDjx`£¥”‹¦Þ[ã³ßxQ©ÐZ¸»ÐXõŸXlÖšWuΙ …‹Rû¨¡#‘F튉9ˆ-Š×). qr6hlÞ¢º®†#r‹çetþIn‰ì~.œ*NÖ¢2úK£Œ4Ù„“þN<ÝÔãFÛÉ™°Â„…äkgùšæ!c}•ŸÅ³¡1™fõµñÆ»pqš!_lëÉñõqÊõ”£äR¦.œˆhÍÕ:¬g€ööW¨ˆ æ»0Ï~²{³¢ø2꡵žHsÌNÏ\$†IJéŒÿ|cO&°ˆ§È¢”óÚ[¡ÔfË,ÊàÙZqÉiº7›u“l«Üoçg7ß}ñ]·ß»Í†“¸mxÔ;Í4¤ü=(oŠEC"Ÿà’èhÓŽ/mô¸kç‰4…î&ª½e}:6ìG§‹ DëN{¯ÐP;f»Î%[²Åy³™,ð¿÷Þ6Ëø‘L1ïE÷Ÿ 7¿þñÈ΃¬r|S¯ñóÔ_?²öw~ôБ/]ïåæþ¹å1W>ùm8Ȫ‡¿Ëùâ 6æ>í¢—öûž_í[¥‚ãhŠ`ÈÙé&»$ÑîT ¼ˆ»³*YuèT‰éòð·ð|ì;S¯~G7+­/.[Vì^Ó‘^uOXlh`^èVÌ 0dÛô\¬ûo6‚Ÿø—¶F-p\+JŸþ²¥´Ÿ1‘hç Úè9"Ž®6M»¿´v:ÕmªS=©ÉØ™†¥ŠHeSJ•‘†•IXôI“]–… ´¤Å"æAÈ”Ü"G8*¯5|éÕwÀ&>z)=µdÇÈ¡}þ¦râóÖƒØ3³É¯ŠŽTáÚ"¹¹(Vq‰‡Ú;d-ÐQ1”œã!¨&ÅÔe8®c]Á˜’îÐR)¢ª%“ÊV¨êl'"°2#ÄS* Ê,{ÉK Ëdº’<ò™K çrÈ~ìʘ·!UPަ¿üñ…éÙÏ]8)y3XÞ¤f¯àƆ½H,~ Ä¤$}ؾ{áΔiC[=Õ'y¡­‰Œª¤¹“¹ñm ßÛß%iÃ/c°2`5é § öÊ¥ñUKV¤Â¾VEgU q u8zè…/.óÕ{ÄH¿M\ªKWvõb —L™axÃÇv)<ûqe=ÆÔþWSºKà Ï>j®©ùãdøæÕ-{*‘ PÝßA§&PÊ!nŠÒBŸÏ ·›ÞÐR-ÎêŽ6PU”m ©txL4Z4*s½(FËÓ¦qÖ nÊjSzèó•Z¡ð¤RcI¿SBùÔê/‹}ˆ|~WžÞ‘>ÚÜRð!GWr•›ßÁçWŽ‘©D€…A<¦i?&Îæ¬"b^)³Ö/`‚B£z%§%TOys×Ú—¿TíHßøÒ\ëÓ§Ôg¾ i¶[µºTcäÖ^ù“H–â@²x`áH¢¯; qR<­™“*.–Ü„W7ául°ÝœÊ0æÂœ)ŸÞ1áóÈ4Ý–QÏnCôtõŒ±ƒÔ§Ïî„§'OPüÆvs“ÛV}ñE>É©VÀ`örg}V["Ïwž¡F‰*à’ÜžõF;R«,ªa 7Ù´øþ"h(¶;Z)YêÜ5Þ‚'ÂÝ‘Çx}«ŸØ©1ºáÍw"ä[ʈ=çC eiîd• ¿¯RÚµÃôÓF[ë VÒÏér¢”Í%ÚGbÎrç&¿f#­©î‹¿ãÍ  ¨ÂÖÔÛþrúd p-›Ö“\â»MÕD›^›|r­¹=pƒ[ÒÛýr—õ¥6ˆ/õŸ‡tæbSಠÐÕ¾eƒC©ÉÕ¥æS¿ŸÊÏóù¹³1ßlËqq¯nyÜ>Oœ§ý鯱ÔV&e’þß‹3òç¥}oÑ“›xkñ_5颙ýð“íÉ©A÷:%É=Ú¯ƒÝ6¨(û ™´¡Û–ã‹Cþ:Ιúð¬FYçû©Qû'µ±sF/åÊ3TsQjd䬾qì €ö„t3¿êàw§~ÒR:B?};(¾^]ö´RG]ð#ß½‡d·;ÝŽäÓ3yâ9Ï4ëoÃ/³ · ö”Öa·t;…KïÊ›¯Í¾\yyB=êâv:îþ¾Ï§×¯žëFw»5ÞzIÒ–ðì~SÚ­|üke¾O}/æuÎ÷Í?ªÀ¬„Q½{k‚=ì$®K k‡ßm×3ÿúÒ?8Ósvß(nZî¡Íì£ø^¸qåYýmŸ€ÅžåõÓ(…F¢ž¾%ïß'Q]C‘Á0X ŒÂ- å UQ_Æ ßëþEÒø ßó‘Ð8ŸçEAY¦åŸñ‘Þè¥ îÞ`ô –žþ –ùVÁ›*ÕÉPâÝÄúÐM$PÆS÷ ¡Â5€1UºÒÝüµËëUšV_çQáä ž=)íTÂya‘ÞßaÏua` !j¤Do0Ô¼m‘«ÝDõˆ¬!ªaVáF‘!×=`ýÁ—ê ‘üp––a‚Z ZQñ]açÑ ‘5\×Á¡¢üYœ ê]­í¥Ÿ¬ƒ-‡Ó)ÙÎqb®âÆI(IœÿQb!bØ™ Æ`"–‚š-¶^ø]"÷ ÝlÔ$ ÖbÝÙŸþ»á€àV)^ÊÕe ,BOlÝ3~à-.ŠFô´qöX8š£8¦£:æÐõ,Ò–Ež|aÜ "ÜLÂâ2#¶Å-Îàç±l bb!n„ùÉHúKžâ0¡*Jaø|˜†=Å«˜‘6ÝKN‰£AhL FQÏ ½L •ã 唈KN ãô]Aõ‘6âNÈ»="jŸLJá œÛédjaô¥aÎaBÑŒΡ‡ˆYÕyƒíÝÛÖ £º¡Èƒ ÅIÔ’v Icб¤Ô!©^¸¤B0SO‰åGŽdKL{(Á e®`§U(â×=â·qþÜéá$Z¢Ì,¢RºKÿq£`^Ò¢ØB$dC%Ø«¡ÜrSXä(E‡åH]¤S —•ÑR4Ö³ K!y&ópÉw°“x€“XpPJXp9­$/Nßî^‚b=º!eÒ!?ŠÛºá¤Oª¡Tr•¦UÚÍá¢V¦[ÆãiØ¡0TSb öÖO8&0-‰-e““a¤0M'IeäEvDUTIe‹vy^„ŒWTI`™ÓG¸G—Ä ¡¦J…5yL®ÐÚÐ=a}"0rrÚzÜòŸ ò$QÞš,æßoòåÚq!Ë!pÎdEìÖ4'×ÀØ([•Mf^X01àfÈ•kþÜRR D/q¨x@×x±g˜Ôǯ™&KV|¼gK}9¹Šî Oíà©õò›]" M¶`0èTÕèµ"#Z¡þý§`ÆbM)1ÖŽtÄ)^J¥(æs⛆jgH¥eâÕU×r}©g¢É}ÔÅgþ”{nÉ”À§ŠÒXy¥˜¨ y•ü˜~ú> d²á_Âdnæà&Z_äÙ¦!Þ¦AéÙá&3æ÷õ¨ŸFJNcK¸ZDi é8&‡²ŠU\'YØ-‰q!IáPçPLV³ìØ`Ù…J¶§g&«ª¤xyGC¸}ÎT Á‘ÂàS>n¡èáàzß+öb3ꨀ֤þĽÜ;e jq6ßïež7ædA(§å¡À(ÞN¼’6*¢”~*æHÐF°;bÉÉTÌǨ«±+˜©•dÇÜ µ±ã²­ ‰‰˜£u[=îãðŒ9 W¶¬> IV srO÷ØH)þVDÖN?2›ŒòKfñ.^š ê¥3‚O+SÄì^K8'T:X8Û´H7FÛ0Nßtfö=·…x…²u3!5g‡ãî6¿ÔN¿µ˜N6ŽŠ0¿mE' =› Ž’_Ö>«v?ïEÞD“I¥/CÏólã˜I­å=Cv]9ô@°®—¨kK±èS0?—Ô1‘ås%ôJ†^VÈã $’Ò¥´ì¤~ÛX­R¶"˜M`#¬5á,ÁL§néÌ4ƒ˜ö‚i:›Šˆ>Ì®^°QEW WF>‡{®ÄQa…~Sçv2ËjGVÓ[xM?Ì™ÒÆR'¸-m˜Em…??Dõ:p‚þg˜§Ztd“;FÄZÿ…‚'0…¸Ûh­ìLjËr‰O ˆ›+G'ÕAfñjw“J1ç¯uë£À^Ë`—âQ·^#0J›‘Äøâ üšLµÑwàÆí¦ëÙ6Ow¡QHy"Ák‹99£IÌ]}Æ”— à’‰Hf9jÜ.ǰ š°”]ƒnFÐЭ ºN‰wQ…ÿMùš_̲µn”§¹…™ž­yJ°y kþü+±Fê¯ö#¢#€$lÅ>-Lìa§ÈRPæu´.hÏ¢/ÝðZܰ²ŒkÄà›ËîÍjvô™_±¬×šñGõÈ™:}º¨‡ù‰ØÊÞ ïª×ø¬ûŽþ°a ëöêºè:Êþ ¬«zBÝíîøMßÈì\‘^güål:\0&ìÅU»˜-äŒ` Ô~‘æ“hÕzV@jíÍáÑPí®îÆ}Û¬¿NØÆ¬dÍ»OQ¯5¾ækÎÔìú°…:ƒ®ûG zÙ®làJ »|ÆÈYÄ6†™"ªÇÍÁS.´Ìv¢‡Öo£Ç^ú%£óuáACæÄ…¦œDÂyÖŠÆèÂùìòr ZȻܸ{Á%9\&>cP;Ed^„ÐÃ.!íš}°xLŒ•À BÀvÂ|Ø\¥“Ëì®`!zv2}{‚:@ƒõ£°JbÔQ¼kHÞÉ’‹E=þ½Û„Òï§ýê'LV·ÜÛÝßþ‘Z±©r2'+ñÖÉ¥"ÂÔ}èÚÆSÄK£Æ©=ÙQ›ÎGi µŽÍÅ­¡;|jFZ´¹\°¶¡ßI’?×B—Ø7c>\ED–ìåW6ä3~]ÜjF‹'<åö\éÕX–ÌpùI÷^þÝOÆÉ.ïýv#(P.+Èm*QJ•ZlC~ñ56˜tVç,ƒªÛ56Hˆõ¾jÅ„¹1wæqÑо˜ïRð‚sR챬®µùÏZð¦MÅ~¿î}èîyªñ„%/AÃq‰í>@è`3P‡b. &,€!€…öôÓÑÐáD†×±)HþŒØ¡ÛˆPáË+ž4i‘˜DblD ÔÑ£Æ~K¢L ±äņ5 è$Ì‚l<ælÑ➇QêX·.éË–o zˆ¤Äœ½ÎL–ìלa¿¢MkölIµm– –.[»w;—ï^¼fßæ ¤ƒŠ:Þˆx›‡˜1?TüDFÀŽ ‘©r¸9¡ÊŸŸêl÷¤WÏ¡ž6ûó)ϧ&n}©0¤ìºQ[£>}QvPßAÆ Ë:õNÝ?·Mòªr…Ä}n–[¦Ð˜ÕœÉQ©jžÑ©ËŽé[9ÒÛЧSìŒûì„/•»îýøzÞí¯['žþþÊðÛqj¯<‘TúË@·Öb+°¸Dð¶Tp,»\½ګB³¤°Zjé§:B,±¨¸Ìö¨,² tÐL½× ‚ µ {ºª·(:é¢ÀÔÆ¯Òަì`J*ÀùÀóQÇ“Šäè˜$šÒ·¤rlòFÕtP²£‚²2'óøÒ©8œÄn£1a‚ï(›ê rºõè4(86@:êK1¿’óL.ƒ’RMöœ-Cꄬñµ"ÇÔSÉ ²LOÒ:ëÍ*°œ°LýÊ GM7µp4å²°SP#lPÔ¿Võj°ÂHQÖkA12?&«lÌ›QQ.U­½ TôÁ_uþT«Gdí‹íÍñô‰&HË\VËÿt¸a¶øÜ[-k'5Ó&«EòM¶Àï¿i¥…¯£ñ¨4½×Ô#Ú.¹›6Xÿ4ÎY\0Š&üD×Ocë}v;‚ñÝÍ~±…É7=C5ØCo[5c /¶XB‡…up®S?=pÃMäTÕêðCÆ‹1y1WË"ë§×‰l\–º’Õ•¨Ç9‡«¯ÏY::Í´½0÷t2i©µdz£=ŸMŠ+z‘Þ-7«Å$&LB÷Ä "¡»~RR°±&»Ð ¨6îç¥+…Tâýjô½P*Òé»×äzj£‹c;^‰‹ 3nÿp‹ŽªÀÉJr$cþþTcŽI­ÜòûÒ/Œ;np0A 3ÑtÇ “Œ2nÍLsÑàZ‹8NY»¼AH]èh æ–ƒTÇ’í†IîôìÌóêÜFŠÜöŒgõ.»wO’x}:R$­Ìî:2yöúè%î½yU¿º>ååsî÷Oál“9âî^e‘÷%™óM?·öû=­«T¸l2•)€üVA\¦ƒ™NVÞ°Õe&£Åè€˜ËŸÈ ˜ªþñ/'HQžû¬b%˜ ¤Xìà”DÈ‘óEÏ#%¼ß[¬¤;ŽP†$\û<ˆ¸6ÏM¥Ù ÅPˆ8rD["¤œ=« N„¬‘¨@÷• òp‰,<þâ¨<ö>ºK„>¬Ÿ 14À0Îos ²ßñ4øC3b‘"Œ`G"Ô*u¸ZŠ\*ÿÑ™ÙAÖ)ŒUt¹«‰Ä´×¦ì iwAtdòHÌ**¼[v07ÈñBšüã'£Ø9yRSû‹]ÿ®²N¦!Z äBˆ]Ë^¢‰Hþ4"0…O|Ëq“PÕ¦‚±•ª#Å hAÕÐÔ²•å©9éG„þsŒòÜîh ºÏìþò•I½¬v=›VÑyH œ‰”YÇÉ,g•‘zpë³ Rs­ÜÌ›ÚV3©k1ª‘0¥Íš*ùW06L†=dr/®Œ´ë]¬zKKÔ¥v˜Œ$¶ gû[~^˜'Ëê>O•YTiV¤¦lcz÷×Ðê>¨µÈ‰– Áfúa 5PÊ^'­I<)ñV¥ÞÊF B’šÜ “Á䘺e\Õ^¢3¯(ýâ^4_ö³7Ž%èv@8Ó“Æ•K1z¯ê棺9 þ¬š þj*™8 ¹V1Ig_dÚ*2&€/#žùkhÍ*#èª[ûðkHLòצ«SÉ„ UÊTöœ[©¹ Ï%-L–uSÛb×xƦ½j›óÌÔYWõÒ6^펚k0ŽXĵf³x?|^^·ö0UŒ76ªºÙ~4¤ß¥¬ŒÑÚY°ÌN]¸•"X¹ÈÖ&†AìÅ6ÎÝYÒ}έžcÓ ba¯øÚ»Þ0¡a‰omŸ™dúþ˜¯¥j^b{—Ïu¦µa|i}ò:­[Ef¬¾ÚèõWÒ.±½-¾Ç´¡F-ë^â–‡'D!VònïÚò»¤W›FO¸Ê&ø/]ÌoC“Ù~6¯œ jþçœÃœÅ:ß.oýMo©º\áƒF"À…zZßYÒ°ò1ˆmÇÙÖv0ìÀY¬t]¿·ÐÀÆ1/©ùbdcœëdV¸ ¾õ”Ý©VE;Í.ën’©=¿÷xÓnæ²ÃûØG/I«E§HâÜUÅ˘cmÏû½mìœuÝX¼ÇZñ“_8+±Ms„Ë»ëy;yÁ.ö~ò¶íœÓ˜{3ë„ßëª;™Î1‹ ~V?~ Gï#güõ_¼,}ÉØ^b霷;ŸèâØ>«og¯ê)ûfÍïœ×±Çj¼yké“ùÙÇþÜåëyžp«´7]ÄW4ñ[UœøÝe>xïdþñƒVø¾ºç­ÿ1¿û>?-ÙnïÂ.¢D¯½°+Ù -óÆNÇÆOÿ0Íô.úïà°®é¨öJÈô+÷¨ŽîúoÖ°-ϧH‹ðýð¯'Kù.OèXpsM¢ºàNúî/»múTÐsÐÊ`0íb«âh1bf™hk¿X'2oèJOñ,Ðö” èF°÷Ôn9ÏÏðó&°ëdPÇkÏ^.ô\°ñ^iþìoþB‰0/åïçvLGƒÙN‡V¢N¬ˆl÷ü® =ШְÌÔpk°©îÿè€Ðí>N SÐ ±ô¼P±°è@ïÆjnýþ¯íXПðmAˆ0£¼ŠðÂêіп¸¯ ½0ùQ wù¯»–ü .¨Jï p˜Îì¼±ÿ˜®þ6ïø|­ò0ëûÑñX†»ñpí‚/!zLð¨Ñn/ Wg.ÃÈz1 çgóϯ / È)qƒÍ+pÉP¾lg%ërÞ®Íñ p½¬Ïî-F‘1Œpf6pÚšP§ôv‘½¯Ï ‘íYq{Ñ!1¾tòš/“˜1Ääî"am!ÙÈê¾"/—ñ×øN+%U¯øtæíÇèN±2T„1$(`À§'}ò'’šˆ+‚Òóþx2(‘2)Ï­‘Ò©‰”’…fJ޲'=’"WQÅàÐuÉï‘ÖÎÐì„1ëîq"?Ñål0îÍÄÎ’-þ‘éÈ£XD‚˜0¤ÎH]˜â{|RIúŠ:¨¥ ººäM‚"`Òð7»Dî¬:”$º°#wS¦n€{¬¹¦' oÖ§,RÉä1íâl Qs%_Q©Lr%],Í¢¸ÉÒþضr#ëQ S²ÛRŽòpÈü 4|%KP"šǬXãQ’â1 b?–Ó<àƒ$1 ô¦®D­N‚@÷êAgŠ8I"S¨ÄË.T Â;£‹°ðjwÖ$B'â­Ì3íM$ï òÈÓ*±ð;92;²r°+]qE¯RÏÒÑvZËÙd&Ú2@£Wt«@ŠæZÆ'^£8}'*lPÔ)’bbkæ\<‚DS1Ã3ÃSÞ”¯=°,î3HóS.aä™Òäl,7žþ·rÄÁ´§L3…–<(Ì–ÓitçQšÃ0åe8ñÅ^,T¦ÀÌJôY‰8¥J>"Ô^";ñdU'çŠn5ÃѲlÎç-3QS+!y/ßñ=ÅËYañ8ý¯=»³rf/&3ðöfS<ÊÈü¤„2íL–tSUu¥fÊ‰Ì ¦ŽK9´ÆÊfÂU·ƒx¨3Š „AEµJÝUU›sOÚµ\aªQ®´C“ë^TP^ШµNä — T¢§zïfä@èT(‘º×’†¨ä@hä¶l‡¶Wf»MþûÒžúôC—u}/èȳøè3Þêr3ÉîÏ6VP{Ž´¸°›Å!Úö…”H¹Q!ÅSí$ÙB{ª)E‚™hzÝ%åjƒo+iy—|Mp¼Ó™r/¡òÜ’÷ˆR*%s0©s§ú2)‡2*õ—/Žò…#‰…YU£o“(ƒ²‰ÖìS¦Ò‡Á'…‹8G‰ê(‰†—ä³ì)ÓjÛt/Yx(Ÿd.Âá0PVò“ )Ig´;HÖÁ Phʘ.Òø¶ç|µT+“PÐ"I¤'g•K@¤WJâÅiKZvvCbÄø-óMx’1…Ó`P4ÛÄzœ6Šy_jÇ?:þ.Ž›Ò’ƒbA¸Mhy¢Bø‰mv–b}SK# “ï‚Û&™.¾çQÎ 1Õ)Xôg—i·wâQ vˆmœB.NY/ÁG|,„!îRDÑ59+s*ù‡Bd²ø€”1à¶&q¦ÈBJ¸R/±Ž,eŠ%ŨiH™-ÂD[vÓ9;4J“S9óõ]ê"^ˆ'†¢‹]ó|¨?W8£K>x3’éuj¤$’#?Ì•Ÿ¡KT‚kN;@Ô_á¸KfySÔ&ÃŒ ÓÉ¡ñb¡A£›ëQ2t¢SÓ¹3º1use<Ú…@ÚK®ãŸ›øhÔÅ¥:A©EKvŒ3Z¦þÑ”‘^ ¢›³$îò'Ïüdòw#(%-m@O*jùDO”o|yp,íH+5M†„5bœÌ£8CÔ ©¥€ƒCûUhÓú(ˆ¢°PùmÈheåæeiu£¡ËKv• š•¢––Ù„S Å[‚EŸðZKc59yyTr·zÌ*šŠ+¯uÓÂv‹§"ü±)fC£Ç^ò{¡¥£n~SÄd?öšÉ@ÃTÉ KZ¯1{«s‹³õîÓ:°õ <`™8Ÿ‹D‡Z¦;IO¢µ^ 1b uå2l+Ê€K«W‚ohÚÉ®II?Éêã"Ë…³8¡Ç=ºL¶ÜÆ¥0iþ`ªã¯bZ…˜g•º¤d⸴‡£Ö.¾+EMóå‚ñ†§¥ÆÒœÔ\àØ+À”K bÄ妖gIœ÷¿eǹ̈́A‡‡Á S·\e<ËP®`Â%ù½YÖ!¾tËèf=¢¦>FHöæ_r‡ÀqLs•Ããš5ür.>ˆ¹È'T¢=Mw[¬‹—pR«†jê„ÅlºUöÓ¸æÀÈYØ#µeÕV!ÌÖÍÊÖÍJÛd±áÕ:¾úoKÔ%&cò{jg ¬mVLã…Gæ„É<Ì3,œœÖPp—¡™…9Ã_Œ(lP›¥×fjn•oõ¤(f ™|}¡ÄÐq"Ü¢åÏ3þ\\kD<Ý/Û¤(ªÉ'ÞÊ£õuÆ#š.ÂLŒœŒRðã7‚v‰öʽQ£`3¬9r¶¡UõL'ÄWŒ;12 µ›ñHF$IÌDÉÉUYÂÅ?¿Uº¬"ú!šŒ]…`ËÅ9»¬_å_Û¥¼½<9%&´e<¸HD|í£žù;ÔkiÔœPöœL v§CÙ­{Ê÷œ{ã¾C|\Ï}Ë™kÞ©‡–šDpþ…‰Ú{Þ…SžÌhŸ¥<´[ò*¡Ü÷\Wc[‡éäÝï#Üý½a¼ÍùcB„˺åÐóšS³¬;æÊáÌâF#ƒ¿Œ”?›¼p§!\ö2ùEN´:ª¬Òþ7aȺfMmC#ùh'k–d ZCÄ’Ó…ôFiP"hËéN2,° BÙ¤éoÞÔ‘Ó:»¢ŸÚW½!\Tó·áf} S¢`©Éì«í7îk V!Æ„Íî÷æk\=“KÍ=zV¬>U±%´^!ôØQ–Ùã ì·öž/D‘è[¸–Æ^ÅÆhŤ±?LDåG»J£´UêX§6E·ôŸÃ,NYq…G|× )¢r±'ݰ‡J·'Q¨Š27‡bÚw²yèØƒ2;xR­r³gzäãÕp$x.7WÝ¥7MC‘·7ù6…:@hÌç†7¸6 s|*ÇnB®þú—'~ºgu_Jê‹÷ág§ ì@¶õû6““¿ÐÌG©q•ˆp/÷/Lþ¢*~ "àGGÁ„t8|1¢Ä‰:úQ”hÑaÆ‹'n|ø±bG6$];yò1’(Y²$¦ò$™(WÚ´9ó&J•3{êÄÙ2§ÏClˆ’ÔÅ"9’4J3'Ϩ‡LBª´£F­*oÀÌÙ²¦Ì—l°j ‘)ɵBÇFIt¥Ù­g/ë“,N¸pçbŒ’éݼ4ãºÅë·)ÓÀù†íùòkѵ‰Ñþu V/б,¯&­Ë8"Û¨aßBöË4âʵ_7ƒ ™æ^Àt-6¤¢£V?þݼwÓ©…CPÁ f(((Ðàå“™;Ÿ¼öù`¶e×¾n½)vº–3¦Öž½®xî?nü^~)yïäÇs ¿ýeîèå³O‹=íüîïg¯ßQ}ß-Æß|ò—º Gúm·ƒÚÝg^„F8…é- e"nµxC„7óh"‰-tP ¤C .”±§_¹°`ßNgè Æ_å¾?æ¶‹>>£©Ov©[nPt"”yƒz{™ðbÔ®rí\óÚQºÌ.¹dd(гȨ ‡þ0öotý{éüg±üÉ `'äûø»õ‘0†0ôØü쇻ÒÐuL«á«†uCk€-DOC¡ƒ”ÝMQ,^B†3©MÇp.) Nxâ’©¬&'ÑHGE¯ú…¶C[ É(F–O~"ü˜×æ×6æ€ÿCRÓ”¬nn#œ•œäˆC3ŽŒ|‚" Q•:5ðw¾é͵’-¸h!1‚ÍMðBš”%6{Ñ k.µÈe/‘/,¥ÙÀÌé‘”¨ÛX–FiÈ3r¬kÛIX­°‡?úùÏV:l#ù–ÖÇ+µ±•“‹%ë:D_Xµùð³ »fÅŒÆÊ ]h‘xCTpüÍ'ˆRÖ¡VÖA$‹¬ÃAIQJG7BÁ Õ(T" ¬:*‹ÞÌ‚l^äÕÏŒ¨T‚Û iY”D]Î-žj›f*𑘴|“:»z&³~nôš1Ñ÷Ó¤þ3ŸÁt¡¿£;c44Q‹b‘4‘CчttTkS2:‘¡0g—r DŒÂV­€Ð¬sbkÎBµ¡ÚÔ©E1n=5 Í¤g~3—U]©‹Y¯ Ÿ]©ãÌ"yÒ‚ö#Á«]Réô5feaÙììZ{b„†_*Ÿj?˲Ç ¨éjñš雕ÿëëÖžø¹t}í—ÇJï ®¸g‘®u+ãà–þ߆.ô(X8PÁYgàBµ‡ðí\UÇ»q/3ÎD`°’²?´¡dÕë^¶Ñ·ÐhäaQ?+íYš/½S tÖ(+H÷Ôl˜¡îN†@1Qx{KˆðüËmñ€Q<" ¡Ãa]‹µæ–ɆŸ²éý)°+©al²#ªÓeèà>yŸ-^^[˜3†¶£Í[sŽÇx±<&£'›ã#KnÐumCØÄhNòÝj÷C×-Êf“§É2S-µI±¸F2ð%¸¶ä9._sʃ\öAòrä•6–ÈAn9fö󘽱׫½Ïƒ&ûJ¦W/bm¼ÇcbÉ!Ìm~ÙýU kjþêsÛî§Gš ÿ’±g=^áB ¯DÇ’f½û£bKZ1,L½!ÏöF{ûqÃü{©ýñ!›—î< éc®ú£}ã—f“}×H)G[uQXE 7‡qij¡Ž&ŒAfÖ9±AºÅIaaÇuc.(áj;ñ4r.ãG/'äo"4á2#hõ|xx*ÇlÑV^—‡J‘6m#hvÊ6LüòvÖ×wÎö>­w4hwXÛF%µ×L·'N) !Agr•fûwj•Q†uBrãòw9ájby%Æu3"lÑ!±k}v] ´Aø€·Å„FØg~ä¦Pþ ({×uáu/A–z—hÖô'€¦l|ô{žcˆd8–}Ðö,"¢iP¶"ÂÓ"/bµ–qí!oHJ«µft6\ú4޳!ËÕˆ(•Æ`m…W¼Æœ¨Tø\hZxAòâxÜ'‡~HU<¶:KåcFÖXë%s»Èd6˜yRZˆ,èzš³4ŽåT„ÆG¤ð·iL4Ÿæ_§8Sý p^¦fC8tE[J8ŠÓãRDˆ èZŽ]gnÆQÈ!×ø…¿ÆˆÝˆk'Á…Ë9‡Óöh›%~ª_Áøc*¸‚ºv·‹ @óU u8¶ ‹äŒê6ûUþe‹XoדV׈S8‰fÊCf èo 4%ChQCƒ‰ÉW8T¤#¥è‰Ex’«†[,Qf™¸g85wlçSd·TóÅ]ÄsÝV}õ“4ÞFd,”¹néiNù]¿w4¶†¸¸9º³iêö¸çs@8o‰!„¾fyÚˆ„(éjbÖ`A£|JøføAg&‰Rņ|ÕÓ`У„Ës÷–÷v<ëØ…°&*„E•ágƒwøm%ô}S¹v'8B“ƒÞw} ƒ†è‚fÇ~2ˆ‚ÃHD¥”v§@(Ói{³wö§—òö•g†Gp©¥Šû–Ž>ÒAWk÷–fõ‘¢!Uqfˆ¨þ©š{ ­©[Q8³‘~v iŒÊyŒëG™ …~»èE–y4˜OÚg™Ù†wôºe¼ñ+ãUÆá‹jÚy„ERtŒÃV”te¸„TtÓES‘ufH,"a\„Ži©uge‚ù“>irÚCØÈyKýh|o˜™Uùuƒ©~¸„z!W,¯ƒ¡F‹z,N¦nZ9‘åù(Ã#¿¸ õÔ[ä?Ñž7Åu‘å#PQž´pe ‰¢¬¡x£Q)%˜%¡…io´DÚ‚Ý÷mÕÙ†MInŽyz&::0êy•y¤ÊəꥃŸ‰"]åiÛòsç)7ùS‹\â$:*|þy–gm&ƒåÙAÊ—¢ÔW•Ü)%F—|Œ3tO‡ö˜›g¥HºzhD”y4s‡)æÇ9*Ô§Äø‚—£Yù˜K1Eï÷Œº{£ 8^¦“DF ¨׈€MR(eJÈõ²©Ötº¶b)áE’ntŠ’pyõ36ó¢o¸vrÂOŸEd('v0¸‚æ0׋ ·¨Gr!Ø+è§;tWZnöÕP(#ž"Õta†ç£BƒfSø.踟oU£ìˆÍõŠl†ŽË“A¡28ye:Úˆ.®êNÈ\ˆqʨTvÄ=¤FÖv‘E~—'zÀ(B9Õ¤Kvz¶¨r.—þd-÷° Ê« ³ŒÐR …Èôs&°…Z¸€"ëb'S fú¦[2Á’ô($/¹¦y`ë]Fq8ÇC€æ³ØaŠ3‰4 •¸’>‘p/&‹ÛS±%¤UÊ{rç…Ëê…¸(µôtcH : “ Q#°z˜˜Õ‡• žÀQŸFMðfoŽ[ðH–|lX7€÷ÚExA]è'p‰`æè¨|æê`Cbz{b:‹Ž5Y=~j¦#•= H­¶4w¨…Ê´MORš‡E:¬‹i}=†µ©Z ¨Cziõá¡YÙ;—zZW¦ÞJ²©†¬Êf¢Ø€w–[¡£°þ«Š«(’Faª;Sy¬“‰aj7{¯·.¹^|™K ºÙz”«˜ ½iµœ+©ˆ9¹úع±’”j˜nh‡"qs;ÈUÔs")Uš09¼©fjtu\ÑãfÇ—¼]³—Û—2“tÃ=·«+í«·¶|å=#‰Üˆº¸”' ¤Sµ¤‹°‡sOå¤ZKQj•=©š÷´† ¼L‹_yI¥ˆ1â›`ø•²ûŸ¬Jp—)Èo§oÊ;›øWp¶+6åoš(›9,»ÙQ­©’¸¥Š{Öˆ4(¬Å÷ra‹¬H±Ó˼‚Ô^ßÛ¸jè´kXŸû¼ʬª4þ̨U¶Úš{ç‰)¥ž>S£)êFáEAâ©îñRoœ§Zät´ªØûRRáVÕ3tžŠŒÚËtS<±K»]Ù[;k<˜Æš¨œ§h LUc©dÊÀg§°rÇ&™nº!e‘än‹XÉÖ6Åã$x\$y*ê¢ÿ8Áí$‹÷IrÁÂÝÓ³,y¬Ñ³Çöl8º¦¤7r(gJæµ'd½”Å;º;fÈ‘û«‡J‹ª~…uTé~ö‘¿“­(¼“â{L9½Ç„oQP‡|jšchÓ¦A¡¢W4|҆çáqÎs¹:‰Ì¨,KDY~†Ü½Š,É`,ÁÍZÉ}—Ï™¼¨þž™syÓƒz÷ƒ¤œ‘Çšäè£ôöV¶j.qÜ…›GÈ›u¶Rˆ€}›³:{ã1Só™(Q€/Üy¦—:*ºÞÖ~Ò»Ð,Æè ¾†õ9Ì;‡|vj¬½Ò,{¯µ}R¾¶'ž]JžþÅ%µz„’XÇú 7rI×·Xx®Ó³0*eÕãzaˆYøš¨¢hýžè®ö8O‘ÛÓr$Ôé%°@ÐDý°Ïz˜%˜Ôš×Ô GÔ;µÑÊÅм¡;dwJd \™Â QoÇ\j¥Õ"R'ûŽÓ;"]!–‰=kEu‡-û—¸kÒs)fô³½UÚý‰¦ªÚÔþ…\SÇZ”ý̹ì§{}Øã«Å ÆØ'ŒË¬¬7ˆÌš‹ÔIëÁ¿ÍXù¼óPh ²“2¸i–\‰›Ý‘CÃjÃÆÚ\4x™&ù[–¶6€[¤tnÌjâŽ%&´úkŽR/A“t&VPÔºÜÆMÜ–FÉM ÿ½¡ØUÆ””þ ‡>¶Þ+ÍÛëÜ:É×ÑØ)b(Ðä±.Âs¬[pöñö¾W–%}·6’¹Ú£áÚáÝÝ8R1fx«DLµ .m¦k­¶÷L'Ì_^)íÖÆv¹|Ÿ”âbŸÉ¹b±u†4!¶t­L^ôN8ì:½ü¾½¾\Ì58Kµçx Ržþ~ˆL¨k¼ßž2¡™ˆ$„[«Ìˆ-’‘¦Ì‡ñ²95‘I‰×ICBÈy2N„Á]ñ­k„½í•;Ü„©ÔýjͶlÉ}Üÿlóˆ|†|™Ð[ðü“UøÕZ®íÙfÓDd&kIx)ÊI}™ ªk‚—æ~xK1nÓ$U¯ÊªŒÒPiOF*@E.ºk¥~¢^LÐDÝã}xóK>vŒŠàâð(òØy7¢ï–Ѽ¬jњ긚—H®²Šæ2Å›ªÚÒOè²Ä„!5-ˆš¸i—¤šW=šÕR…mm÷ô3(ókÑÙÅÔÞ˜ ‹ à|ôï9tìÁ¾Kdïò‰þÉt!ÝŸ|é\š¾?3©Î>Yö÷)ê‚Ó®ètaÍaõ!J¼yá…ƒsçìøò±K%Ìo.tÛbZÇÑ]tóWÿ܌ܧ_ìiÿÏk•;dñÿiKIH}(xçU“ô7 !pôæ© þ‹k²iÅ¥[ :tcCP 1êè·PˆF”¨cćˆ5$HðÐA‚lØ€ü80¡C”ìiq¢Ë‡3ŽìGŒXÉ‘E Ü™1åO ¢”áÏ¢ “"UJÔèÓ”K ¥ ÕjT¬W‡•êëÔ¦W½Ž»ðkV´L¡v 4éÛ¶fËV[—m]µþG«J½K—,Ê@:¨èðF¤ðaÃDjá â'Ã"DüèðSYP ˜>1î½XQsÅÍŸn¦È“aÇÓ Éä2ÕK½£OJ¿°¤µÖR«t²Ï¹H-Ë×]¿c³×îlu0u¨1oæi¶0Æ2¨Ì„=¡LZ0+íC‡2õs4AË´6JòM¡žº‰µ“dBÉÛoÉM± PJQ§uM±[aêWS`»)'P}ëɳ˜T2@*¡dxV5^•Ø2uåõÔ‹a5u¿°þ>X\­ô8/þæóuÑ’Afuã‰÷⸬7•ePNéðÆÆ*»“²Ê¨ÌÉ6‹&Poð(¤uŽÅ¥©cù'‚w;Dé‚€‹M8p]Þ’àªE*èÜè„~(VŒÕS˜l[…}•c•3.ûé»Ú†Øíƒm¹@‹ïÞ5MåNsÉcÉ^{Ç¡LYÜ%¢Ni#Ë@‡EË6W /=8C¢ñëͽnÉ[ÃCÚµŽ\ûºëª? íW1‘¶º£©Fè]±_þ›Ë‡e½å³á#«Í³Ó†ØÌ+Å#~X’_yî½—›òYƒ¯X¿‘™´Ø¼˜”ÓA:'ÔùBiq¤áóÈOkÑþ¾I‡=¤ÝŒ¦ºR-ùVêô×ën·ª×ú=®N·éþÍÁ®?ôÀ“;Ê}‰yƒ _ÞV¼ˆ•ÌnÍ+`I¥Û=W(Ó òˆ¼,Ñ fÉZVb˜E‡:-";«Ìã~Æ/¡Ý%3ÙP:£’…p ]„”Bòå;‹¬‡)áÚÿ µ¡‹`zÊ s¨$Òè‡;‰¡È.¼ nçv “žAhA2‹f› ô&æÁ ’ ÜÓ ¨—ç­'W„f!šá,|,´Ì å´iê(µãѾ ã›çÜ‹iŸÓÑžš~ÈduC9¤‹jâ•H9'8¬ûãŽY£ÄHþ1ãò:F±©Äñe&»Uõ¸Júˆ¦üK“f Kåõ-„þ‘Ïß\©ENŒ­Œ°Ð(K8þÄp2Ã#Q˜³ àqŽÑŸ„H;¨%£r”Oˆ¤ÈÓäP:¹e¼Ö£€©HHªiÈÔTd®“Ä¥‰0¹!èz´œ£^,B‘8¥S>1º1yh+£*ÉèÅýÄ­Œ¦—ÆÐAt¡…à/_u2z'fwÜ^„Ó¸ EΗ1Žçé™JœÔo†“áä$”GJVŽ“ÒGéÀH”Ts𥥤ŸQi§€ÔØêG€ŒhüÚÐð8°lº|ªEÃtLÜ=´œþK[/5ÖÆºýnMo”¨-·Ê5~•¡Yf -hî,|“Û– ¥Rש”v/)‘¤ #)s­È&Ú¹éJC$‚Š5VË‘<Ã%ÈÂÆ(H=ɧ¹JrMWé*­Ø¡*ÿt—YT"—`½^ËF[S˜ü¢fÁ‹¶öЬ…êþR’=ŽÎi1Þ[á…*³=ñ5›tñŸ¤£×oQ*Q~]¬ÁžÈ ŠŸšDMMrÓ¥Z¥¸—QYök!Ê`VhÞ¦z•µEÞfµúÞ]f1b,/EUÅFU)t”oÓ{¥@P¡ŽÚk¦ƒêô=Ì<£ Ô´º Ó*U#—’ÇGxæŸN7ùA´(m=ŒâžõÌ:îZÕäÖf¾Òúϳ†óô°s@’ŽŒØtªQ·ˆš‘ÀÖ:#™”oÎEô“>8íš2‘@ö;Þ“—³U·z¿ÅÄ_dj>ÈgÖ˜„§ø>ïâ`ltz‡mu¡_ÿ¬9>o©°';ê6ÛVŽ«oûèÄã¥ûG’tÃ+w·ó™²”3Ù5äòšx7³=tŽÃ½:ÀÒXŽ%ÂKé‡L²”!2ð¿„›<{žì#(Ûú¼²"-5Šd6ûÂ:€{­­³1¤Kö‰–iéþ6Ö‹Úë Š ½¥Ú«!bÀZûø±œÐ1,’k©wš‘¥Èßè ¼ÊÀͨ,Ö Ú0‰£˜ÐkAtºg´ñë2Ïë¼¢3´.2º†:¿Îüo¢êI:¼Y¼×j?.¡# ²)óm³û®B§Þ˦ä¿ä¯á€>¦aŽñš%iBïú©KZ$å Žš"›íÚ— TDçÃ9澨ê²bc<ŠS6iň£:fC­0Œº.½Ã»C7¤>|Á©R¯ÒÚ‘;>L I=°jÊ–“±c$Žë®íJ§Ùñ)ºè‰gÄ,xé?MY1±®A”-䦦8FD$ªþ‰'I1>+$ýa²X·È2X4Á3ÒÅ‚›¨Þ)?7œÃ± ¿]”EŒ[U˘q“4Ì{G±ˆcx«*»2ãñiÅGÒ®yŽ|+µqbš7Ó ¢I„H$ì)R:ÃOq@Ï©ÈÕ›/ã5< (D{£ôKIî³>3ü7†»¥ZtIPË%4„Ã\éÀ‡3£–T:³ ½_ôԩlj’•C{aµ{ëÒÉ5$á±¾¨Ÿ[ûš¤Rš„@»,©Ê9{7ØÑ ¹˜$¶aɈR4ï›Çê¸À!¶¥[A ä3qSÉ;´Å1\(T¼EɃI³¼=|;ª™ÝÄÉŸ‰Ãs%úÚŸþ~à|[Ÿ®A¢L|8áHŽ$J¤q8ÄL´BǤËëÉ~ŒIôZ8(ÛËj{4C+@¨È®DÍgÛ³>››Ö¬:ô™¾ÕrM;ÔËŒ£‚Ã1½Ä+aü¸¤Ä¦«p‰¢¨¡Ÿ0¹Õ‰¡h5GL"ŽÐµwÙ–¨ñ¡›“LŠã &'‚¢BÂ#'¦ÚKUR¶šü5cqOÒ ¸©Ó¾Ì[Êø„lj+Å­ºËY,Áû<-Øb˜ʄܶ…Ì“N.dB/K1žkÀÒQ—Ÿ²È4$IB˜¡È;Qb@G,G7èN ˜,‡ÈÁó vëMÎcLõÈÅǬ¾ñ»Í-rþÇ|LIU{OÄC«Á4ÃÅÄÏW\Í Ê·B=?ȲiR0kZ©¥¨BÝ&@⌨‘¸«µ}ÚFËŠù½[9øÉR9r¬©§ÂÒ”½ Åωµnü²öRzÔMÙÄÅÿ\KÓ,´T¤L4ì/û„•? 8Í:¸ÌÉ:5+ý =DÈÂøCÇ࣑Z0í„ÀeŒ‘»ó¿œpPÌÒPL$ êŽH,*åÀ.DZD™»PdŠ¡"›® -ÇåB®Û*E»:j»Óut¶€¼ÑCãÕ'sH©c?aÝ1_ T÷ó³õV»<Íl!!Á¤mã¶ÂŒº"Ä•XÐȲF!ÌŒæ#B)þ1F $Ñ@.Äê ¯ W»À.&¬C!Ѥ’Â}òF%kª.šUŸl6|Ѻ ÖCµÕýÕ]ÉceJ}IµÔ!Å}%´'1ÈÒ;!…ô>ÊŸá0êMÔVäâwñÂtv®é ¥vÊÂJÌ7„ŠM ÕI\®F˜}±SºäM˜¿ý,¿ºLK{E¯¶$ÈØ4¶Ýɲ ÅÙ*25„º®0Ò_dMcHcüBG;)áª+¢!@uÙ§gt—‘Û¿‹ˆÀ *rúÄ|9˜ìL&¬å+€ìZ7ý®Ô¦Ô\¸–Ú:MÁÖÒQŸ]ÖtTÑd?þ-'ý$X;­U9ÅS\½-ø#°ÀÌ…”A Ðä„È£X3Ws–]À±á’¨‰L×Ù("˜“\¢ñ¥IÕ:« SØv”O\LTߴɺÉKÄ}I'ãÙUTMàU¸ å¢·ÜÏÈ\} °Û¸ñ†LƒÔÉñǸ„šW ït]YcÜÛ˜¬³°T³‘àJ¹ 5ú)}BÂÉ4_CMVÈÍ]õÓ€K\‹ZyLÜâ…¯ï[X}•SìkÁÇ«M~…Š;îÁ¤”«>B¾ÝõÏŒC©˜3üáȨ,ܱjM}5tC·Tz㉩9„ áêàáÐ/æu¤aaò%ßÝyþ&á‘T3ÞÀ‚U~a6²¢ afáXÓÖÆäa$ÎU‡b"nâ Éfƒ(¾$®bÝâ[\U$`þ,Íž|<¿ù1dñÅ#ÅAŠ•&ªí´µY]t ‚Q-U,ŒÙ9âN® ÑPB·Ï̤™ë¹%![ªp‘SS³2kŠx[»U" K—ÉÜ• ¤F~a%ê*Œ%"%b5F—xB#>ž®¾›³ªd䵊8;åfâÔ=·tåE†FØäÕ5ÖëLÍMÞm<Ó"Ò¥Š˜aTŘޒ³ó_eü7ß#Ï#Ƥ KáU®,l¤N•"Su#hnLnœ®qþ/–]̪ÛL^,3º¦[¬ëê;q>_)g,Ñsmç§QPm1‰LgAƒ‘¤>ôçesB9gr|ÀsF Cù”’È;C†g6VÇvK™Tb”|èWÑ8ŽÖ$¥–Ó®¥Ææ?ÙEfUXÄz>ÞØ·güF4"rɈ!9>-MépÉNc;€‰‰>*îˆÜ»+ —–†ˆœÆÛLJ—¢ˆæ”0¾lj‘8 ¤–[{Z ¦î»”Õ œ(âQäß»ˆ¬>PÉje0š†¬ Íêyùˆ¢.âÙÐ9‰è ²…‰ÉQ‚$ü.saWU³¼ó) sÛ<\ÂýÂþ«ÝB-`D]•ìaTú#L Ù²’%.îÊ+³eæ´ÆIäfKüT QÌÕ|WJÙ¤=±l©FÀæÒ‹tÕ)µÂÈîDëZ¢Ê—MîìÚƒYÐ>Wl¶.±¶íqE1‰8‰WÉLuæÓ¦ËÕ½&m«[¡x9ä>n—îØaPĽð(Ùã(îpÕ¤c—йsn-5×ÜË.@¹l¡å*!-CZ ØùRжA©U½ªÚ߆Àüžêlêh¦ÎS5˜’°éleiwu©»W­¶Ö‹û”^¢äûí.uUÍ·L¹‘<änƒa.ð~¬üF.ËÊT-ÄÛ»ÔŸ®¢þ‰ç[píFĬþç¢Ö㽊q)¼‚¨mzn.Ï1Âw~×7×¶½¬µ«CB-\ ÞÖÝ[~MÊóНë¨îql‘ò™’}½Én»K–ÀG‰mƒv.¡‚RÊö®CAÕDy®²ÝïN,˜0×ç0ÙX–²p ¬®ð<ê*œó°.]¤ÓÀî5/ðœÒÔEüÄOŠ‹•Då€ ™Ý‘ ¹-gF~Š©h.ÂGôH „p{ûá®t¿ ŽI¾‘/Jô ׋\ÛåÓ0lÚæMSÔ¨=¡Ž«Øªõ¿ÿR’RVu0t¢ÛèS)„±²þiG#Y¢ÝCqAQ¾!" :݃1ftöÛþ†ˆ»ö¡˜6ò­•ê.ˆhÿÌìÂN^wv£°-¤$g)sç?pO÷4Kçf—î³jÞKŠ §v§°ÚÊfqKg@PÆw ³[?~çó”» ÝšåKÖ|Üd ì`J =„Þ6Ð3.LÈ^ñ%lc#ÝUnÙŽš¦y•"j ‰\n^è§ùõõTšÍÛXlݤÁL:S]’W"î=—tQy0ë\ƪHM½È2:壹šsáù 3ªypñi޵vs]„p9ûù™g,§Äp„øÊ8Sø¬:Ã&¦àíâ‡_ï÷ Z7qVFÒ©½oIý-—®Þ"Ö7í=W÷•Ó ÌÜqQ4Úþ%5RIu+¹·ŸÛœ!æB1fä×ù9á[—¼¿Ç/7¤1yÆgh"šyË?µH$Hó)¬‡üBÎ|~Ç•º×7¶àVsL.·Ø3‰ìûîÞ5¿-`žü»å[Ûá7?Š÷(j"»-kxV­VÞ4F·(Bá¤abê¿b)ò î`Ï̺­˜~Öœ¯Ô|Ãþé/ ¾z"¦aïÜî7a×%á÷ù1Caú‰~ó¯â=÷]ulòÔR¿~õ]€è§cà@: $xP!A„ &lÑ!ÄŠ'Z̘Ñ!E?b|ØqáÆ  ¢¢£–7"-_º$‚ƒŠŸšˆþøÑ‘¡f¿@U8RäG 2 ip)á:’*Üã4#›‚ĈUȆØ!¬^Ù€ ë‚`Ø²ÄÆÜJRGU…\ B«êÏ£:ä^=D«U®[·êUX¬Ü|Ó¾Ú–-±ˆ™fÄ‹5ìd‚Š÷6˜ñb6…ÙKv¬]¢Ž/> ²Äµ…Ânmò4ê„UÇnZûãÈÔ«eï–í÷ÚÞ&ç&®û5HŸ*kÑ©ÕO:õè8ÕÌp3gM?T|Ö­™"k„AƒZD¯\|xõ¥M»†kX-Û´ 7“µ±-ë÷óß \]¦ÃU$9¥Cü‰¦C`VÔ~{!Öàþb u•Õ¼YÄà‚ÿI8Ѓ8Ð "¢XŸ'Þ%XeŒýdÑTë—ðÅW£Œ7¾6ÔpìÙ¨Zy< ÜŒ:‰œ‘ð)p(=ÝtSR7Sw7e Cv:ød”]tíÔOwT˜_E—zLyY—Tu•™¦œhêp&AèáÙ&g–1þÃb[o!f؉\¹¡ƒU¶Õd âw¡‡\›AA U`†¥_[,r(¥Y}jŸA„öç`Zzå5ŸGq’iW£V˜j©2:_WóYØ©›Øh`˜2çÑm´uô#Ê©#‘É)©Q“Íæ¨ÜTÑií³ÔþÆ¡s+y3þÏKâºD‡w~d°Èv:Õ$H e’/]±Êo¬O…¼ç9¯žõÞKg¾òÖ»ïQüxÐz5ˆØw]Ø0cÒ§W€j] ’‚èµåÂW 7LŸfš"ž’Åø±gÀƒl±ˆj ‰žV|Ø¢¨Švâ_el¯Ð–»-ÑÅÑf4‚%)•­´;=íqE3‹mѹÛlÖË]mZ˸A¹’”ÕIç•5™€“–5qi0Tmæ ïÐ 2ävžîÑ™§B÷Y°ßñJ2ôçÎ]šâ¨†ÏÚ¨_£u³sÛ8¡*šáVhAZ«aZé÷h⢅ހvØ Žgþþ²øâà…÷:ðÑÆ:=›Ò?&™´ïÎB=y|Óf-¼Ò8rÝ-q_#_íÓHô-Lã¶TËL;ù±î";}g0DIýkïétgú÷Cà£/~ßêßù·÷Ÿ `üñƒ8Ǫ‹( _òÌ´½å›ì0*‘Š–? Ùgv4™£vå ‡!e}AaPýTD¸ªRÑ8 °ftËÖÔµäMÍyÍã Çs¼>Ïyäž³¬vBâA­…¸ [- C¶éÐálÚ@–j².ÑkNJôÛœà„&¨PÄKJL"ÁšH/'ö©}w뛬æC¨å§#_ÌÊ;s˜VÁ…f ùÉ›þÎ'E>Åp™qKg.r¹J)pf‹)ÌÏ…–5íMMK‹á,Ã"²¤ 4*¤Â63G-UÃJP®Ã1z¸ñ YÈ#N2GY3ô_&[³5IMjK»¤&oô-êP ˆÖÄ"l¢6칋•º<žÀl÷¹ np’RÙ_2(L°,î+^UY24ÄéŒRw R‡0#L5ó+αú¬²Š­•-(Õ2ûÕ«1T—›õ_C:ŽM–ý0MÐFĵå<Ým@#ÃŒŠòŸ\]ë ­ -IJV´íi3 ½ÀÚ¬£ÕäY‘ûBUNîkMJ­?=‰þQj7yj]¬oÆKJ«Jo®.!—õj›=µÕR¯à©n*µ–ÜÕÎt”ø½Q}/‹»Ã––²¿ÝVB‡4SÃ6Ö·“ílX³‹YÍZ·»ÛݪxI›¬ÿ6˜·Zýì'ˆª&×A×{s‚½‹·³Ìmp—ÃW€bØ¿œÝ0~àýjôÀº+ï€LV /˜¿Åp½ÊO?˜„ã ¯•ÄÝéžD*1]_b.÷V]{2—=ëÝÁ‚™Â‰mšh†ãßná]3j1kIÄ2™ºœ}³š[‰œ}¶ØÂPFku Lã:Çx…ŸLrsR®—‹¢·­enaHgìºÉÝõnŸkÜþä2X°2ìíwa¬c@kx•²tÅüô àtio'¹Äw¶?ÝÕT«ÛÞAJí“#Îçf·¹µAö2h!^kosyÂ6ú[ðg×üâmM¹€YkcŠ[Ü í~wuÎöÞ"þ²-ä^w¨O悾˜Õn%ó̽\mA3¼ëý¾]žÙŠð?û¼Ñ53x§›ÉÍr—¨i÷ú·1nêNÜתƙneïį5ùNΚ¸„&ñŠ_|3Ïø¶ì3QŽ<åÃBÏÇ3Ó˜’õ½®ìm˘wz·ûÜ+œv¹ãÝç{·¹ £çÖßý¸&W(éqQ¦Ï#U¢Â]箋üR÷»›˜Ó™ÁdÞs4 "ï‚ã…ƒ¬Uâg–(êŸÅ‘•‡>"ûm‚¯}ÏvÇ1ÏŽîKVÝ ÅÞ:ªõ}mjw~Óž÷7Î WT¯ç¸7Ú{%ßûÁÈ¥ÙÖùàŒëþ„ŒÈ¸NŠ,HÄ€M‰Èg4ÔƒH ÊÄýTÓ5 `„®(µÜ!”›yŸÉ™„)[ÕàU¹^’•%£¹]ý™Ûð¤ÌA–ù9ÍkšÍÓYMìDÚÑN ‘ …‰¹L{ðKHà͘l¯ˆ_}%¿y›è1ä}a#òàÙ?!™zæ`À…ßÂÅÞùU¤‚QeF:WÐÝ&GÆßkÎ'DÀ–t0IâþA]–ÔÀͳ˜1ýÔN9ÓN9UO‘T;=N¥‰Q1¨KEUuþTáÔ„JÊ6“Leä~E[|rˉ®æüM%hJ%2£§™à6Ú`ÌÝ Ê§lЧ 6¢\õ$R‡o–»x‡Ô™¦YÚÁYÑ­èjfCZ×™ùœF£Š¦¨ Òà™Wö}¢Ä­eV*5Š%‹Êèé±gšêgFÜÞJô•𚤠wüÞ’e¶dBFͲ½êýNŸ:”~‘`5Bäyvi¾ñg{YjéGâaårf bCšæèÑÞ{&⥦åŸF”á_Çé_¸ü8æD%Ûxòé~6œþÙ™)ÀqªÀ©¨4"Ûi†§ÊÝgýA*j]}ê)˜V2â'ZŽ%E¢^´ ùà²öƒ•ì–hÉ]Êœµ‰› +“nµ9–Ž‚^ùU寢¦yvM£–'¨±ß–Š Aµ\¡º&k¹r+Ò±Y™žéµ Å+ÅÙHâv‡†)«z”¢æŠMªGîÆrÉ v¤ÚÙ' kZ˜”ÚªÁ–h»Îh ¬ÍI䕞k¦,n–ybe»­—ˆÑÄöàU-¢ÂÝŒv*2º*iògHʬ°vª¨ÍX þ+ Ñk™Ñê—í*ŽÖëÍÚ&¶¶]°6éÍÕž“&*¼zÙ· Z©ÖåÚÈÑ þ"ÇʨÜA—¸ªÝ :œÅŠélþ,¶yš6b¬¥"bÎíl²íÜ­'×íĺgÒÎŒÖgù‘ëžqÉNO#Ô5ÚT†e×ymºî,–î)²åiÍ~¬TÒíÆ6WÞ‚ìÂg~ ]Ï^Áu›ÈN«V-.Ó2n¸®íé@\UYLøæùZÚ)·_Ú~©"~klòªá’íËÙ¬ªö*G ì4æ.Ú"}.ázlû×о.´5ìœ5-ðž%ÃýglÁïM"½]ÛîfØèö'3š¦äΟ¬Ò®m:*ÚÙáÃ&íê]-ÙÙúbš‹®jh&oÎæm¥™¥E@-õÌÕ•‘àÉW±6nÇþÆfÙyåÆj»ú¯æoùÆ.—Š•·RšCð˜*ê šÎ90"­ã~]ßîàÆ¢rIžîD á{½5IR€ ™´QDÌK¼ªœÝŽm¤ð¤‰e4Žf©]jýz°ÇŠ.§ÊoÏ9mjbnmÚkï¨÷+&„n.«u|ÜâR½M‰VÕ’z.節ï.äó,Šâiyö,ŒR#ý)œjf[?Üáñû*U> U.È"««Òæël)à¡÷Df^.„ íåP²0Bšœ0ç’1ù±1ñ./ìæýÊm§Ø _/ÎÆ°kÚ­Š­Ú°²ï Ö(9DIö1þtÞor^Ö¤÷2,× Õ$ƒððÆñ –f'éð›`û5jÜÚq­®¥(ƒ0h ³[-ÜÛ2XŒñ§òʱϘÈržèñÐ\I4+õÊ©ïh,»¾¸O9¥—´p{¶ìðVcç"ìÏÆ,;‡1±9qJ,¸¦Û1Ö™ŸÚ2öÒ-¦6ó÷Zä1¦&Ô+° ^‘òÍ+¿âC›³Ü°÷NäïVp被ùfð«¾kÈ:3À-ó¡®®é&ðÿZ«E´ãnmÛ~t§òqÓ%ÚìÔQ—¤Ï>rœä¥Ol4CÍÎíeÕ|¦çÑpsq1Oj//°ñ2þuÉ]røÂî3ÆOk÷r2îR]²„6—êÿªÈµ®™æ²&Os!µÓïñB2µ‚´U«ô4OµÕ1Åþ¡hÊ®"íû1Ü'ß²?#ó3ð_WDLË–ÿ=+¢ ·±;Ÿ\œ0‚1"øÎ1b7)VÓµ¶©µ¢3v¶›«ûQµ³ÙÂ’vQÏn5 ¾Â’¾NñBç’¦ÙvaÝöãžNéS2¥V4='ª‰¶6Ë6­•æà¶âê¸ÎmZgv?g¯._%/­¤†ðsD©ú­ ìmY/G£çK“AOÛÿBlÒ8²f‡ô–ò]ÃÞÝ…`Ìn´]“ïw{3lÆs¸þa«rGòy3ãCêÁ•M-‰§—†V‘}p@+š%ü}vVs`øS'qUÇ(rë ªíûjå?SœñŠx‰7xíViC´å[ŽðvÛ(} ê.÷Õs¿4¾ð;ø«yŸ1û“qßø¾5ïd4V µ<‡­ù–`án¥iæï,3í23C}Kt`9Ù06ž‘".U··•²u–†nü*ó«šWïòx¥¶oró–·só2d¥ï±)ìØ]s”æ*xõ`+vl;ÝMœp>/x«w†G7#3¹hKðïšyx‹tIkØTö’O®ac°’û6¬îh‘ƒ¤+Áv¾JqþvhO—glª[·t+äYq8Û³Ïó¡ß8¨òf»`CNò›±1ìo[º/0Ùª¶îv®W¶.Ç^»I¹ºw:k3¹ø¹/œÛp«>8°“yƒòRÃ/'¯ða:{$Ͻ5ÖŽ´Ë‚.ˆ_;¬›¸ÓÜ_ÔÖ•ÊÛên¹»õo;¶C9j+ð±êaØÕùhËõ×Ê9­;sû7»4ñÝ:£’æ„{Ä©›Ä ;ÌZ”ütÐVwÌ)Õ¢DÆ÷‘Gz§ —4²œgó5‰çrÃw4§ÿõ Ç*XŽmšËëjo¸Å¼¶‡¸ƒc65×Fzáï®yó©³î 1g/÷¤×àüîþù»ã ¬I#z®÷X9w­ï³__îÕ'iÀÿ3WÓ]²ƒ%ߪ×GkàÞüª¯| 6š–­Àç×Ö3|W ñE>Y¨³6Ÿ¦#°ßwð¹_2’%3u{õìÒ«¿k=Ùû³€kübK1£eÙѧü{¿ü0‡3³¤Cù\£;Gþz{þ¯wõ‡c8ú™#ü¯?úJ8Ò¼å&©Òõ ôNIǃܼIëÒc4»s¾É˺ðJ¹GïçS{· ¿ûzãǹè:ͦ´ëß½ˆ¯±ôsS)Ôç¨}Ã4¨Ú~uœËo¶Kë–)ãÃ7 »<ÒS¼ÕözÎüßcº¡»½ #Þö|&þ?? ªúÝê©ïãxö„ö+x Aƒ 6tˆPLJû¢"HG-oD6väH• ~ü˜A‡Ÿ‘:AœøR"˜_Fl(qfÍ› âtISgP¡sÚ:±¨Ã¤IÕ3§O C‹2í™PêÔ¨A¡6õúµiÖ`*-KvjÚ±haª5ëVaM¦mÓ¶¤¢ƒN­~zùî­’¤Dü¤$)¨å[¬p¹Ê »Vëâ£[ÏέÊSrÜÇ/GÆ ¹ëg΢ŸU,–´i²5;T4eÓ3iÓÛ4nÈFyÛVÜÛ3ïÚl3·f}ûe Aw5rtî‡ ’VþY¸%êÒj‘¿†íšxq¶ÚoÇM>|øîßS§7/¾5|´¡…^mß)~öt…Ët?¸õÌëNÀú¼ÛM½à³K‡çô†?¨¬:9,1÷Œóʾ ÷ã¯Cü4ªÀ§àCA]’mÄÛZœÏ;I³¬¬¥bÓO7ùVûjÄÊ`äîÀÝ’Q5ï˯¼þŽ,²,å˜óJ&i0”®ci¿¬z¼ñ7}TQCþVœmÉ™$’CÁóG#K|o2/{£OÇ •\‹Î-wD’Ç6ÓBQC-É ³K0›j £ZòÊk¯½òŠŽB ó1CLs»7…¼ÈÔÔÃÿä„“Ï:þ“DóCKÔTBSd²Ï?;-“Öï@¯C:÷ÌLÐB7íU '3b´/¾S©Â+34DR»D>4C\µT1/õŒÀeeOÏøºÕô¸}JWnG0ZRK̳Õk‹ÓØ$«UòV6ÝÝÝm9u–&½i´ØG©¸P0I ®ôÕx}cöWWý\O¬zËýÓ0YS^ˆc½tZQ3µ“8Ö^uøáQÇåu@’7«5Øå2zð9H‘•t$ì.vµcý\9âv5ëc•õm³\]ó-è¢+æ—<‘×ÌxãG«êÌö瑃V•*\µ}ÏiLÅbæŽ"œ¤dU¢bY.á²½þ¥ÂúTX7–;·! Má•…Žúdñæwgq¹þôo°Ÿ“ÜÀg îæöPýqÝíî×åæ ü0*i& KŸ//œpÒKZÍ3»NüÚt­•mÖS.Ýdy‘DØz?CÛÔÇä³i­&EÝåÃ=kk¿ò·l"þB»`ëÖÎNÜ ñ$ZO›]:ÔÉMï–vªçí‘ëá˯ÛmäG÷V|îÝO^qǯ_vÞgï™Ä„çø,akQ´X{ñ†Ì¨s .C®{×O¼7¿Êïw¢cÜîºG¿2M‚éÄ2Öé¦ÔšWà·2u…/û² ÅÚ5±ÔDî* _èp¶Hþ¦f³Øõ´;…ëƒ[Ÿ¹”§"vé àù0‰PŒ¢jÔ?XU1=þÛœ7汑ΕDRa ød²á°jn²3³¹ÖOŽ ”`Y¸« Î1… bú°ÇÁŠí} s˜ñ,%E¿QÑpA”Œ1FŽ<ï†:IØf«{ÙÎz‰bõðÅ&p½Ao"¹¨2UаpleyØ8µ¡Árv E¬XB«Ø›`¤5›­ì>ÒQ·ðU°z ùi!ç ß©^df­kÎÕú{ÛÔ¡`ëù—ðÖ60ˆþ1t®þoU\Õ¾¦]=ýSÃxãš-ôfWÎ0T9Ùp·: LWÃo§Ýë['BiÙBm´ÒJˆ½lcoMÎ?R™õM¨qÊ;qtû¦Ìå*¦hc3DM eƒ¼êgo¯Wø¦ãÌ^ëøl+5†²Ûpšrî»U*hKnb’—vÄ 1©•[ïªe÷"¸ížó]]›µFæ”}AO›×èf.æIûÒî5'‹è»º¶¿Íêm)±F…ª\‡ø¥·\—@t5—Äêg-yä°{Š]ªõpï¶„bw¦æJREïxºñÙ7¹”cÿú‡õÎSó2ž•‘ßþ©´µÌÎ1óòô¡¦[§cÞhsWÖyxj|³d^ZY*ö6d‘X÷dó=®tW´‰A¯á}¿ÞÞ§óû{U^ø"ŽŠíŸXÎÑôÈPfà–¯‡Èí¬Ês€oŸºÎg˜j³Lïó¨)ÀŒÆŽ/ïhlÃø¦±ØúˆLϘˆ¿Úk×”ŽÞ˜/¢æúº¬³ò¨éÊ/JhË$|,ý0*ÐÞ®ÈúªéìeÿXðÞþ.à oçâ¯Ï4o|¦lê–kb²niŒVðÿ|+²ÐëòÍ Í#ª`FÍjë`„¯ïèˤéߌ‚`lúpøZºìÇýRÎòoƒ(.âJF N %þ«SÅÜÈJ1F"ºk†ÀËÝ h‡Ëä,ðèÚnu^Žê<)ElqŠª£O2lŽœôo=»¨/iNaŽýï%'¾0ð U±Ì°bâf¨†€ ãØN[Á¦h—ê 0ä\—@ŽªO»61¬Ž¡Pù<¬|J §ï¨LŽ„xùøÈÂ9‚ª#Ÿ0¯¥V‘ž. “/«ð¹Œ )çÙ¨P…ln¡ÒQO­¸‘ùˆÑé,1ìqÛ–+áª-Xt€9x™D"Ø&E‡b' Ñ¥kóbñÿ±‹¬• P-Æ–q!óÃL‡ÈÊäáä/•8ïþ0ìºþPr×È ‘he.R†®¥Ü„ÊòL"= p+’ û°§é`ªñöq'ÏÑëmÐL±Ûð$‘¬Á†…-îžÖ.ø,r¬¬­°Ö 0Yr"Á ! ¹ž’öäîéRR,K‡†HÜñ(ÛÑÑà¯'Õ²;^²¡C§,ïÄr£ -M2û’0ÀÂF.í˪l+‘ò"}Ò¦ r!Ér2ʸì?HêOÛèãìØMB.ä÷’z,rq«‘²š‘… ¯+2U«#k26¥ÌãlRö†qÑm 1,¹¤6kó$o FQÈ «Ï«¢j.õþÅžHú®«îÀ¯ÿPé ©ÐÏ`Žë„°W<“ÙˆpíÑØ¤nϨÝâü­g¾pª6" Y*!O1›qr³:%-ç¯ËôMºÓ‘èÑU³ …6ûè[ˆË]ÔPÙ\ñ2 ô6‡â%ÃÒ@3/BŒðäl~ÒÃTp6YsagüŠÒ 㠇̑*üÄ®Üþ@æ’k‹G'á“~ÎLÇêÓ*'ЕœË‹S6­‹:Gp5“T½¬ýî!Q0 NÓ8pý“ßHékHum_ÞÎö6êB½ÁTŠ$LB&ýr ¡KAÿ’( ÇHc‡0ÛÐÖ:ÈøÚ³}g8•þ4‘ât•˜R;¹mF7ÐO¡K£â4,f‘XÅlÑ>èI“G;ïäx5çrÿÀEÑN +Cë¢V¯0ÙTJTIÃÓá`”F߯w¼´A|.¶Ê¨Ý"жf2äRSDÙ1›*Ó#'U·´ÔûÎ…Ép®TéÎwÛ߸ÀÑ~î²Ý@3}Í­ QQâ‹e½ü¡ ¬È­}sqš¢Uwå™×7­vÌ䞊I>ð—š<#ú±ëø‰‡œ—E þãéZÝMmeÄÝñLñë‘·¡ÙeÛÒùÒ\òEøÖxÇÒg_Å7rŸ+µ|5î~öc¹úÈúOß“ÖWôrÇÂÞ€¦ì7uó·;û¸óó:½ƒXÁ úéHp @ƒêP¸°`Ä:Œ8±¢ÅŠ 3^¤(‘ãÃAФ¨°¤Ç‘ZT‰Q¤I”-a²¼xðeȘ)aÞœ)SgÇ‚ é ¢ÃZýÖ:JÇ›*~¢"àGG?‹ µ‰Ó#Ï®¿ŽüÊÕ'ÍžfsþÔ©RìX¯'Ê ›¶î\µ;ãÚE ·#ϲ÷šm‹ÓíM¼`k^˱,JÀz3žÈþÕ1ݵ†D´oŸ?Ïí Ô«S«ú¹ªCèÙįÉêé¶¶ßÉ—ßRƼwnÉ„ïδì3³à¼qÿÞí­V2òÁ/¯kü7IÁÃsC—¾¹wîÕµ/¶K¯I¡DC“Vo ‡ ¨~R뀯õ1x´6³ÏÿPvìˆqçR€ûyç\w~'ž€ Ò&ÞÔ=È\~ä-¸Ò}‡…w˜ƒ³Q¨‡?E—Üq¶Æ™µ¬§"¦a•ÁT‹XUkÂ}xÝk šW`q*—q>úÆßh£‚Öõõœc") ‡·M—ãˆRF‰d‡ÖÈÖŽDÚ7™bSi“ %ˆƬHþO]Uó­FE ¶Ef¤DcV%‡åYÈcW`zyå\• 9$„âèd˜ Z)b“9²iHri©ŸVF˜ {"Yât*èmÖÙQI¥ºTiPI@:,2£kŒbš¥¨~j(§}z¢£júÜ“Döùé°¶‚Z+X!Þº!¢Ç˜Y¥Ìxl°è[‰’&¹hµ ¡W”zäÖÒâjò]•ÁœŽj‰œXÑ6ú«¨ád§:6;¤`z©¶ÎNÊÛÀ L)lJúú­tAjÊ)c ‰­½õÚë·XqcB d*Šj†fš›òÁGã²bÎ[ ~ÂbËèÃÙâ¹2ÊU²þ .À4o‰o;×èµMêÊ© ¬¢ðÆœ²„(S+îRP«ÚÔSQ-"ß"WÕGåë¬ñ̆ö»µÀIß¹°ÌÞ}ð‚kwôÚ€*ª¯Âøz-4ÝÔ–¥Â“vKwÎÂ^Œ3Áþ øqÔJ©Ú"j¯ÆYàÞ›e× ýï¢@{ëµ—§}ö¾ÉÊ-oL~ùöK¥;û¹Ûª_Îíàç‹”©£=téœg»kLO«*µ¹­¾Y•›ìb¦ÞûR»7Ã*ŸT]žgqУ/wº»¸þœè‘«gÚ9Û¡{^7Ñ<çþlë^«žqåvNÚh¢ycî{謴~sÑÿÙ¾=ìÜþ+X¥ )zŽvrãY²âE´Aenn ªúœ>K^Ñ\Ç7žÂMébÏûIïÇ6¯dQ©ÏÝDÇAëA¬/‚» ÷b3þí¯{Ä ÎœªìuŠzCEÂ2í{2¡¶æ© o{|;f¢Î¼ïŠtXÜ›`µšÇÍÐl/‹ Ë@'1#ÎÍ|Së@„F0–§†ékc÷¸Á zIŠLlÙ¿ê•>ꩉÒ1“PEÂZ¯jWK!­†áÎ{~¤¢-§¶åµO”ìÎî·Czò‹–´•ûVA'Ö aZRžÁÎwÊ} ‡”k+Á@ñ޾›þßýJÆšü5MiJRe7ÇaД¡ä$²€Ø?eF2vâû$”ìØJj0wr$ö´7ÌKV³edò¢\&å(çžã´6AG:ó˜ „›î8OÙÍp…ÙlÎwx¸FbJ’†a„$‰Ò–O_ePߌ#·Õ¥>jpJDG4®‹'“›™7ö êm ¨(7ʲõíóˆclO‚tü\%7gN™V2C“4ôêQ”.°KOcJâVE5WUEV~`gï¨DM–²XÔ`Æ‚#Ëf>ua5]åC™ÙÃWbr‚VåiΤ¸—Bñ’dýê3{ÖSÚ‚ gB\þ.µ˜®YI£­'<é¹Qbµ¯ÐDÚ•É̽zK†\‚ã'áöÆ“Æ 7fíd0)c²°6|lC¯Vƈ˜JÉ"ýÔy¿âY ÝÔ<¯iOÀâñ™}"_9{©ÈîÏ0”{'ÏÚ®‚ug¨|ì1 Ì¥éT3'’ëP[„µ©pqV¨ ©aI>hýÖŠÖÚU¢Î‡?•©¯[½m¦6‰ õI!;[ÞzT–ëÍ©ñW9˜íV'OóÆhà·¦¢ªÓM*tW8§iDÅê–¶Ÿ3©§›L¥áv¡ðD KÁ©Ç ”¼áýßZí„·Þ,XŠÜìx{—[*—ý (iþ¡{àæÝ¬†®äª*bdz³¸båËJ-IãZÞ4@ñÍaÍ+ÎMNèv#9\!/U\¸ê!ë7<9-rÈFì}½Z^†BXg.ò›³ [*¯JX4UkºjƸG ëpŒ`ß’ÒIH>š}SŠÜÎ Ujîsw2dÚײ·ÓgT¼eõI¶Å¬]t7£·æab“Ë|Ö1Ž{|àkVÆŠí’¶Ó‚’\*2!"ᄵ¤n¥Â \0®.<¬’y±™ÒŽÑ×dj130c]Fkƒ]:Ó€Ô®`õçë¦R¶˜ C³˜ëbbÐÒÕ~,&2}+mÜ wZs•t'x9þœëYºù²6-ë?}KâbÖÛÐS6SÿdfœFð†-==FNo€'„€}ù[[Ólšzð½ÑëeLÃÛÇ#m]žÛ A:Ú”ÓaCèñ\W·cWOÜãà•àˆätcÜ©>9œrSèú=÷qZn##qí°:~yÚín´Ï4 Ê“CÜ£ºpˆÕÌ<éB¼ŸFFôiå‹ôžQÒ Wšø«U5VW1íUËçÌ g3ŠpÆ2uqœdÚrµ½o.{'6_L)݆bcøƒ;K÷èÚ­Z²f–¨ß=òò$¢!S±EU³šB/ÛÒ°Ži¹W÷]…çèluàÖ—xtv'‚{²-ÞŒþlH#ó›µûd5Núe†þÇi‘zÈä—κ>rÞû‘!ŸÊ_þÜŸÏi©¶’ËS¯ïz<˜]ióF16_zÈoc‡‡NÔRÍTeÞ×Õ³ˆ n2Ábt?ÃcWšLסµ,ÿGã§5ä­½çí›þÏšöšýšî\á~}Ø8·_Œ¶'zì178®ûuÿâb'æGx¯çd¦¹59©CÀ'd;yb6w*õsÍ÷vùÇ?šGÅÇQɤ^ê6ëÖ^Ìvp·r8¥"×ö\ø³vé6fºVvû±^hMyf HyEG~Çj‡J#–c8‚ž'%y‡o™—F0hdöNþµf3!.¨Æ-÷_Q1'šÇ„ötÊg!¨[U¥7Ö•+ &o ³I˜vW(LAvçåP7×sÆÇk å~Žç‚Xg“\ÖÇ\/‚m-¨veÖeht~¤sÈ5$lâׇ~Ù³gUyd§„ȲZw˜‡8·{È÷Bœd>OWª7…FÑ&W‡TJ,¡øbúG_C÷ˆ^&aaXgxkr‡°Ô|¼§Š|Cn‡)u~¢ç‚§×en7]a&\)w"F T焬ÅE½Td\¸V ×{íôh¨GR˜h‡·HˆH| ˆs U~ ôWr'{OˆŽ´GŽ“†YÒ6så§‹‡þ˜‚ðsHŒc€©˜Gƒh½¸|}u ç…~‡‹Ïfœèhoø? ¹ƒ–8y£ÖmH(Dq¨<{§…ÜHb¦–\PCHLÑz—mÃhŒ÷ƒ9¦‰ö÷5+TJHki•8a涃Yu“¥†lõF‹Våq·†|wfPÕ…1B¹„Nô󇄷.°W‘ÄH‚³ •LöEsG4ù~ÅH‰Y[1l€–O%oÄÆqö¦’àg”U u’xŒF©xeôw|¨ A’°‚TÞŒèFaãK4g‘>xw|éR˜€Áz= L騖­õZû·yEy“ãæ{³‘Çe‚”&¤¨j`5%þéj’ç‹Yš™–^)„Â7”Q‰“|¥QÞCU]GP³&{Ü¥FA˜i ĕީ›:(vl&;Éø{2ñVVÔ™é4x„æîÖ›‰å‹@tØcY•5z¹x[µÇ‘UYD¹çˆi1ŒæšÍöúfŽyÔ€6XŒ†ø‰ G#g"T"iH*VWNy(H‚Yè`4‰€ÎÙ•d(‘L—Ÿ‰Ç{YöÙÿ§J£t’ñ˜a¶g˜ù‚Wbœ c—×·KÀ}v•„÷(ž0È’ 8‹BiFAé ·v5艋¡ÉW‹ºsÊ›'qÐI‡EH™D86“yg!„”¡5îT®÷3h¢ æŸòè•þœf3 ÚŸf›œÓ]Ϲ‰: Až+];IK4hŒ 7™³W¤c™™³¹ €§£‘E­ò‡/WhLªŸèÇyFGžê“£ù¦VjPÐæ¥ª§¶§b¹§¨ÇˆƒêW X“‡É–xúb±™«gB$ÃjYGp f§d3¥åöRàè¢Ó),ú|LÈþRPÙE‘K3T~ºiG•sx=•i^#f†”G¨| š"È<ÊÙ}¯6•çvk»÷©‘ùm2ØM36|z§õç‘·zk€Z\ ø}¹ŸïH%8Fjn^·'‚äŒ?:eVx€ÌŠ˜„yãEºõÈ 'ÚBQŽ×ªþ úcÒÖ¬—HjæºnÉø–Ž8‡©)¨á‘«j?Æ8ˆúg•¦š{_¯7bp_é H^[§RÉ|ù“ÑJ±W‚£6Z¬v—Uj˜aŠ·R…Å‹qjê_‰$šÐg$›’$;¯[v†õˆ¥²µ ˆƒÀø…`œŽ˜¢¿Ùš ‚Ñú³pzÕö£M¡EÊé&†7“l©¥Š~‡z´ms²µ9V*-5FX>5ŽÆ5œDé]䂪­Ëcø*™e‹ç:)ù¨"ûH’M©u—‡´Ãöa7=ƒ¥êŠoG(OÛÖ¢Äz]f´î—tê„ßs¯Ëm}zšúªUùgþº"Uèz4²µµd³JŠ"UziÖ›lø¥Ëª¹âx«qh˃MÈš¨K«s Ib›,[­WªDNœ©&VÇ”qRŸÄ§³J˜2ú¸› ª»µ»m•ýwž6:‹éI@ë·]Ã’zå±r !Ú%f©¼%ÛOsVEJ¼x+X±—‰ªxhžç ­Ž‹©±Úy[q]™½¿»‹D ¶m;It¹é¯¹š>$±÷Kmä’C¥”²b¼7GÐzº™Û…)§_‰ž—»´#,f‰¨Gد!›±•“šª˜cy¸Mjš+Ìwæ‹`¼™0€GuwY€Ç ¿uG\›$[…º¦ko÷k™þÚ"Â.f“ë7 ±èSd«ßèJ‹k‚÷˜¸Wë^vê| —¯4’/{ i€¦åŠ‘»x \AÍÙTþ«/Ù— 9¦¶ß©–p„dÆ=Ò+_#<‘]µÆ“æ†kC¸µB—DÑŒ+µyYx'‰z¸¬Á°ÛÁ¦”­ƒù 8›sÛ¨š‹V× ‰jÉR™¾€V ܶíØbZ)—šÑo)À©U&³ª{z?l¨‡Änœt[|e3ÃâÌǤ¼¹¹¨f;É…zº…è»ð*ÄÙkÄwvÆäA}(®Ïx.Æk2”šÁ…Ûºæzã‰k/éµ®{Äß{£ l©B<~wèÁfÜþÆÄÀ¹ûŸø»°ïl­_ A>ú;Ÿ[’Yqeyj¬ßdL©³ÁYŒ‘œl„fV~ÓǶ ¬òš›çz³ÏІÑÖRÙ©Žt»¼‘¬¿©•0ñ´sµ¦ƒ¦Í$¼£`žå™kÔ)»M Îl§|PœÉN*Ãzh¢º·¯ÌÌ{C³ªÇK|ÉÛÊsGNhšj0+©´ÌºfìUÞKƘºÇC›§C­ÐGÛ»•w¤íJɢǮ ­h±¾°(ÀáGrŒ‹ÌüImuɾØWQØæEåêlcýÁ ]l9èÇ™ÏÖz©j+˜X‰¤ŽUÊ{b>hÄøúËÍl 5GÀ=(rç•®¦¦gb}â:¤ÛÜVÛþÛ?Mo[\‚ˆ /íÍ—¹À5MÖW,ÊG§Ë[=·XËÔøqS¢«ÚrˆtݲÉeÍJ!xмœÝÑÊÖëÛi›Å3}c²½ËM%ÚÉõŠR0–ñÛÕÀ›¨r ±ãüØHdØ¥eZI]eÈû¬Ô{û+ÍmÓÆLiîÈØâm±_fÅsÆ z¯û“,ŒxQœÓ¥ìF:HÎP¨™kÃ××j(×Týn™m˜V­G³[ºï”ò¤‰ÁüB‹l›£‰XÂØÁýsSìÚ=Ú‰T?zÍ£u5Yó«ò<Û>6áÌˡ齠ݞã]¥)¬· ;È#›üÜf“þטVN•<묜 ÖKf Y%Ò‰ƒÈlÊÛ¬=ÝJ¬Ño(ՌUÌ@˜¦ÉÕ5žåC Ó­à;ݱÓ[v]aMœ¿€Ý}N¦8®D ßšœÜ¿εú®äûˆÚ}ÁJ7ØX6UË‚»ZÇ÷§Ó½mænÞ7çé¼(¨_WDj*o]µÿù©xMÛ{â2$ºa~»2¾¥–k•;¾ÑóÆêH˜Æ#‹P¥šç-£.ÛTÂ3uËùEŠüh…ÿŒš‘6ÄfëiugЬ˜ëžŒˆ êT\ÓïÍñÜÁéˆfù©®2—ÝA ÓZÆJcbñ p‚–¡RŽÜr¬ZÜÂÃÞþßgù§öÔÍ [ëÜ뛊N~«¨¨[ɧǯúì Ñ·Ï?Úr¬H¦ZßÉŽÂ"…À \¸¼<ÑyÓì.¦0la˜ø{A¼äÞÎÊö\Ä)‰ßÎ3ÅJ© ¨;~éíkÒ~MÑÛnh"OÚKÏ¥딋׹Õáè[Î.Ÿµï臞ÄÿZóæÜâÞQN+¼_¼aŒu¢9¦Otˆk[_µ]G‚œÖÚˆ¹Ø„jßp)¹Ê>ÜpçðD-òÙ>І•‡åýi Mâ•ö1†eQË«›~ÙCïï«É|M³ëxZR­÷{ÏÞ6žSx”áÌîöí.À¼ ÅÆžª2n{ºîæSt·þËWWÁ Û}‰™êŽ0ÈNvÏMøt|îšð•¼Ðc^]Z(—·ç«ïì(û‚-ÑÆf*eç„Í%m’ù6ëŸâÕ»ÚÞ¢º é$ÚÛízï•K¦nÓÇzáÌÅ@çÈ*èVìèÓ…üoó#¤%Þ<%üõìÎyUí ý‰êãz®úZY†˜“®+ ðCÍ|2yúÐ øgñW½°ÑOÇ@‚uHµ¼yqÞCTüøÉ€€9"ˆð`È"Š4hÐdJ”#KDÙò%É™.Y¦T‰gL˜:}žô´'M<ƒÊ4*TéR›H‡}Ê”þ¨T¥@kRšsêÕ©+¡2•‰lV±_mž-kµìV¯.[:Õ:4lZ®Kà )H‡±ˆýz£ã‡J†‹9.",äܵv“ÅÊX¨d©V)ïl|yf[´Ž×j~lö*cηŠ- ×ôdª”5sNz¶ôcЕ‰Ö¶]74fÈGÍºŽª:á†tjõ;^Ëx?o=š¡ãE {³®‰ûnoíUo‹Fû;oñÙ¯Çýüt®WµÛfûüoÞôwÃÛº¾üô£iÎ6oµØÆ[/@þ¼›Áμ$†ú’è¡Zœ+l#óC±÷6;Í7ÿnêÏ-Ý8ÌM? Eô<£K.Úþê oÃ#QÆYì°©qd+¸û<òÇ[lK¾Ë ÄñJ!†ú+JÁÈæû(4$w+OÅÕ’\ñH!mL²½ÿÀ»QȽDMI0,/®Ô`l1ÀñB,Çü>ÔÑÎ!74’+Òv|óL:Ërp/ÿ Ì¢ 9"l ÕҲä ÔÃ-ÝëJIÉŠ$ÑÍAÕÔT=ByTíR­ø3ÓMCÇ<ÕÔû¶ôÏ?Ù+V2_¥ôÇ<÷¤µÐ%Ù „ ½”C9ãèhÎÑŒXËêÈ3°MÏ5Íîtõ‘Û4mýöKܳDOÁõVÕ:űVsã´‘M[)…7V]³e÷Ûþ`] ×Ý J4Bˆ&"bÂÁ½ð" _ì7GNt\Y;µ÷Ðýæ]•ZÅ´ôNŠõ QFØtëνõ3³ƒÝ÷Z9?® Åm9¶6_±œlhѾ(\D#é<šb‘ùDw×Y_M×ß‹]öU¿ãrGuO-9iR¡Î4xë%÷Ú×:N0ê>çuXC]·ÞòEv¹¶½ì¢gK̺‰[Ûl^±¶M&O–;2®b¡—N9ð§1ÕcmÃnœk›%6<ï¿'ÿÕÚÌFÚäÃ%.ÙäC®" ¯:™©~ùs•]ö$kóÊ]Þ¼l¦ ÕX°)¸ÜÛWzþòÖ¿lõÞÄ?/¼o΋rÍ0 b›ôÑ‘¥ÐJ 1¤Âî«a•üwq ¹kWV¼]³ñîVøç GOÞàýnždç‡ßýÎí‘ö×ÕŽóFö´uPmÅ:–Û¬Wºƒ-Â{øF‚f'|ÍïqÅC[íÀ×>û îoá»þV6Âþ±Ž[U›˜ ïg<¯Íh€ÿÚÊøµ«©Éoƒ®êßÒ§”D)ðzò궆±+N6´ûx6¿Íî„Ä+” ý;Q±¨~îËàX¸-‡ I¬ØÍÀ^çk¸Ú†ó$o¬;;˜È‘*MÐbb\Üi®84Ó¼pX ZÝôn4þ'úa1zlÜóðÔE¨IÏ}lâ"Ö²ÿ]Œ,¤dÓÎÇ­DE B ¢…1Ä–ð\D+c‡„Gߥrj²SðøH KN±|.œ!«dX9~zܤñ²õJþ!2˜³¤`&ǦƬàÌËú¡Á0ôÀŸÆŽÀ¡0Ë.­‰Oo;¬Ô/ã…Ìm¢ìˆ†ë2± ¸–u}"DáWlYIsJM‡a#7˜øÐz@D˜G&U3Yžq*ìc¸ÎxO§/€‰S"W˜Ìcæ†fMÔ˜!gÅ`ƒóÓèñƔ΄V‹¢àTç a˜œ‰nÒ¼È;bMï™tc ]ÞFëYÐþè´½½¿ϺäMtô [®oGKû½<ͱk© Zù%ºµZ$øÍ¿äLhr•Yö6/¾ÙûWŽ>Ü×ËmCgn¨üÖ…æšp ½çXç7ןÝ××qjjlA·þŒ§çU›®ëVM°Ìv ?ý™Pû0É~x6‘«9œŸå†v}½eŠ‹¸êªµy*CÛYÏ¢}•'ë;ù-Ü¥“ûG-{é¨Óè<öš“Œ:h¹¬øåÂ’#eäÉ ÏM£ò)K2ˆ÷önw˜Ã0Ã)­Ns½ K¯ˆãÝ«™Hê:m»¬tr0ÝšÍ+> ;¾«£þ“ð9»œó³¿ [’Ùzº¿‚¾Ç˾ðS>Ë3O“±õz@Ѫ?–³:¾ú;k“®Šz;ê Ìëªg©&ÈJÀ’’±¥ê¾±³ÁÕJµvAØ A× $©ò˜ØS8[7w¢—ü[8'l¤Íb‚[¢Ü›†“9%´Bï¾h´€ú-©›ÁÄŽ˜{6ü³±äÃÃ-²µ€ƒ9ì;3Û¿Ð3¦/ó@ÑËB2”ÁÔë÷›·ÅÚ¼Ž£¿ ÊÃñ‰1ä¹ô¾t“ÀÔà W{´:ÁEÊA*Œ¾J¼¾Ó—¦Š@Û[>ýk>1û=L<¼Þ7ŸÈ8O‚Þš0¼»!Š3»$ÅÈ›ÃVþŒ²~c4>32KÆqBÆê:Ä]rÀ1â”cŒ"y µAdEvË·Ôµ²qD1Æò‚ ϳ›0#CÖ⽺8îì(ü¥H*›ÙúC?ŒC¿r·YÜÄ3BO\6<£ÃXÜF)ìCßû·ä'¾ÐEo¨»ùóÅaĵh,1¶».$ÌÆŠ['> ©ðÉ{ì0ê⺲{¤è³F<ªÁ[ÁTÌ¥•,E¶ÊH’£ ÌhBºMË’þ+IKäÉ{L‘~ü#èFD̰±D¼ÁÖ«Ãú#•+¢»EWZ©‚º¡ê¨nºF 6ð5ÞHìÅ7CD\2—ôB³Ä¨ÓÄÒ²2üaJþ‡šuìÉk»yd:ÄifŒ¼"+Ä~É¡W42LŸ¾¤–ê1eAº!´£½3¼ll•¾,ª^æ3ÀÉ[Æ»4¢bD’ì4^‚"g$ƳT½Ð”¥»Cc´±;Æ™ÜJ— ²;ãûI½EªÜ=Á$3PŒË'ý8Â|«ÚDí[Ũ”HºlÁ`„˲ Hb¾û©Å:,B I¯ÌMCÇR ÌΙF¬TIÔ[¼3°˜9r¯‹ÓNÙ#7ÎRBCd'åú°Ý£¼¥=Ÿ EN”(“X© ŒÈtÅïy-¾\1±+Äos¾=òŽ$ÉNäFjs>u"Kó#Í0œþÀb¼1ù¤³îtN€ôA6ª4z£!ÌÎ<³Ç-lŧ ´¼lNw< Ĥ¾ç}T¦cÐnýP¡Ñ? Ïû*Zj½ ‚åP…BkKZ4t/a…¿½·;WFÝÓûC"ÓãµÒóÔÊ3Hìã¢DõÇï HþuäÌ—eÉÛB§ MVmÝ·JeS«‰Ü¾t57|3¼É'ÍÚZ[TUÜß{5Ï<ÃÖëÛˆÕÚ–E1D(éóDoUIkeÝŸEØ‚ÅÇÑK"¤4Ù×Ã#ŽYÜvPûc¥®$¹ktUWNµÙudX¾Ybda%þ^Q+ÏŠ“KRÛ44(ȼ×à4TßEµªDÅúºŠb…Ê.a&ôcÝ4^*Qz#ÑäUÌ ÌÓ_½(°%ãýËX?Þàk¥Ä)Îß-Õ‘»^YW­kd±ÏLDÝîZâüpʺÀTOÚbÙ<[ɳ/\;´Mäà ÐòEYØI¼ee0ãc¯Ë\”þ¬BM`"^ZËÜœ%±½»aoÇ8ÂÎcå`ì…Ü(öÆf½ÏÊýU}®mmå,k_-HWæR¢,^ÔôÎ;cÜéÕcQí8]DÁ5D~ªÉ·‰¯úOèìfâÚyFàzK"ÙÉ^Îàá=͵ÐiÖ`¬äVpÍàæ¬U€†œÁˆ–艎h‹8¶Ce7~7QT·Ë7¹íM^Æ§é¥ØÃ=è®™>ý½æ ]ÍIÎ^㺫˜tç¤D»3F)4ý¬3ô 1AîiA^ %ßZ^û¥×†EðœÖ­fÕSiN-Æ»X&îFp/LnU„>ÕsÎ;s¦Ì°%i¼JS&¥°þÄÝœ|ã²N5}f—Å˦ãxìãåt8ßµ¥åþzÕ^Ê™[Uó$Á;Iæe©ÖL×ÄVìZŒMÕ ÜëaNÝ>&P‡½îYM^çL²jÜ<»Øõ®|P“eÂfšÎJ]=w…enkÀÜÌýرÄÞ­·Y_g–JóëÁ_›lM@+Áeß«ŽämöKäm& \J.cÀ.Ã÷ñI·þ“b–ƒ&ŽsÒt\k:¾çêJ!þh§~nEÝêîLÐæ¸&ßÔècê¬ÄmK¦ÆÈngÃÅïÐ/cxäèoæhC¾¦ÑþäÝ&f&E m"åê6NÛþÈþê¥á©µT›I.LiØeÁá¾%ˈ,´™ÌQC+’`›ZxGq9¾ÆÆˆš%¢žúaÄÍon9Ë¢YÓèp=Kà>oö>YðýdåNÕé¶lmh³ýÒmÙ]~ š|9@ñZ€ˆÛÝÈíÚpf¸CýåôFÛ'fí°Æ¿G&ÊY¶o96N:FÛ+›²q–¡¸:JkM¾H׆þÆGé™u]^ÛR<HKÕYŽ4w¥ºü–d‰Äi+|á¤Íæ¥{^³ŒôP6ódmm¨f?&7Ä8E_‡Äóë&GI¬òó®b‚?I¿Ü»þX ¿qƒþ`Ï>)ïEË)fsÍfnæ4`©þþð~vÝò¾µ~¨ÀáSŽˆHeÈ&&¿MŽãT'åïÖ¹•ÚÁEã_e,’þZ•æÃ·¦ñ¤T5ÇQ¤6!R«pO†ä{r¿,.¶8ÊÚžepfǪ¥^»,t‹…Ú~ÅñÖ=ÀèäÓ CO\ï@ çßÝ ¾ÜgÇ®`÷$íæsÅ„‡‡øˆ—ø‰§øŠ·ø‹ÇøŒ×øçøŽ÷øùù‘'ù’7ù“Gù”Wù•gù–wù—‡ù˜yâ èš¿É„á†Ð‹×ž÷ùžúŸ× ú¢z 'úŸ'ú¥Gú¢Oz£‡ú§gú£§ú­¬zžŸz¨?ú§Wz­÷ú«ÿú°úþ¦û­'{§?û²÷z®û¶Wû·wû¶g{µÏz¶Ïú±Çú´{¼?û¹ßû¿‡{¾ç{¿|À_û¨GüÂ{ÂO|½§{¹ïy –üŸîiŒØsßÊðƒ‰Þüˆî|Í—èÏÿ|Ï}ÑýÓ¯y?ØÓ/ýÕ×|×WýÍ}Ïw}Ò·}ÐoýΗý×gýÑ¿ýݧýÞçýáÇýâ×}âÿýÚ7~Ô/~Úç|Ûgýæ/ýÜg~ß7ýÙŸ}ÒÇþåÇýè~ÙW~îŸþî¯~æ‡þóÿÑ÷þò?ÿìþß×~Ø—ÿëŸÿà?}ðýxõ§þÝwÿã~pX @„24èP!þă ýìx8âÂŒ#2ì¨Q¢ÂŠ/î)#BŽE¦lxeA–Kª|)ÓeÇœ*ýð4±'ƒŽE<Ûy«e´–·¢H•*Ez4)£t’R­5µèU«Ieú´èV­F§ŽUšÕéÒ®L£Vµª•*Û§]¹¾U–Þµmɺ ›¶ïݦ^ÑkØ[T©\·&üõéÕ¶ŽÕ&N‹+Ò¸™ÍR54ÙÀþRÁÆ~¯Ø-O?ˆøÑ‘' 8 x ‚ *¸ ƒ :ø „J8!…Zx!†j¸!‡zø!ˆ!Š8"‰üý·_ù ‹-ºø"Œ1Ê8#5Úx#Ž9ê¸#=úø#A 9$‘Ey$’I*¹$“M:é$<¡è€:A–Yj¹%—]zù%˜aŠ9&™ešy&šiª¹&›mºù&œqÊ9'uÚy'–8D™Á~‹èà‡P+ƒ™7Djh_ˆ²¥(RŒz(¤‰Fºè¤Vú¨¤™Rª©¥œbº)¨†ú©¨¥’zª£©^ªª§¬Žêª©°¢º*­­Öúê­±æ:«­½âþê«®Àòú+±Á;¬±É"»¬¬ÍîꬰЋh-zþ§Tú±b-†zûè·á‚;®¸å’{®¹é¢»®ºí²û®»ñÂ;¯¼õÒ{¯½ù⻯¾ýòû¯¿<°À|°Á #¼°Â ëÉÓ"û¥¢ [ÜðÅc¼±Æsü±Ç!ƒ<²È%“|²É)£,nµ{NéÇܺÕÏ̵Ð|³Í9ã¼³Î=óü³ÏA=´ÐE}´ÑI#½´ÒM3ý´ÓQC=µÔUS}µÕYc½µÖ]sýµ×aƒ=¶Øe“tT4?,e¶Ÿm6ÜoË7ÝsÛ]7Þw-Íw8ÍwÞë-8áƒ^8âhþ·ÌŸÙ^+óá‘'>¹ä•S~9Ðáøs>xCÍKðB/˜ô60î襟z?«¯¬2í³Û^;î·‹;7¼/ÎöÄVl(ïÄç~¼îÈ+Ÿ<óëÒAò2JÚU˾.4§Ž3æf9ø–‹>ùãsUTgqÛ1ëÐíòñ7?¿üõÏNCtœáDQ©ÓAÈ1¦1ZÐ íèÁjá†?x =Û¢AÖ=PuÞ0X¾ šƒì øÖæÀO³ é§Â²Ð_Øà,Ž`¨^A ÞØGèðBŒƒ7H ¸Ç|T¡ ÞÝx·ºZl/þgb¨=:Ôð†Aø A˜Å-jk-»Ö”÷¾šU¯‹\<£Ó¸Eô-!;`fèsÀÖà›êÁ‡á R—§B&Z%‚„ŒyÈÕÑÑŽò(##©ÆIJòrkkÜĪTIJrr“žœ7ø@‚W¸%u XA채LÁŠ G*ŠB3rÏ_èžéÄœMe‰¦DåT:)ÌOs˜oá”á¾Z¯w-|æ £ Íúï HEÚX ÄãÕ@ |Q l\1ŽE¡eÎpi Ñ‚ßB§ö,¸ÍnÞãQͼ§=ói¼}:“Ÿøô§>û)Ð4 þ=¨A Ð…”¡u¨B*чN4¢½¨E3 Ñ6T}ØJQ•¤)ÒiŽ´¤Ó4 Î.3•´!*ÅA ÑÌÙÒNá ’5 IsjÒê4d¿û¨¶¸ÕSžu¨F5XñŒv{̓¥ùlæ· 4›†Ž—S½*ϨªU¬öl«YåêM¿*Ö®‚Õªc +YÏjÖ´²­n]ë[iæÕ¶Âµ®r-ë]ÕŠ¾Å)SbªÒQ[ÔÁ ö^õüìU´¹³˜Žm,d³f-¶õG™Û#U#«ÙÇr¶“Õû¬]mö/¨4ª¥=-?M»»s‘6µ¨¨jÇÕZؾv¶¶e-nW«[Ùæ–·»þ-pkÛÛຶ¸´5îm+\å6™mÓäf£ÛÙéJWq{ec«šÝ¼Ò•»q­ªwC»]ð’w¼æÅkyÑ{^µ†·½éeï{»ßïf’Õû]ãú#Æ–ð·¿þý/€,à¸À>0‚¬à3¸Á~0„#,á S¸Â¾0†3¬á û7JØÊä¶J$⓸Ä&>1ŠS¬â³¸Å.~ñ†„’ß \+?6¾1Žs¬ãó¸Ç>þ1ƒ,ä!¹ÈF>2’“¬ä%3¹ÉN~2”£,å)S¹ÊV¾r~ÀøÜ,Ëf]^̼f0ÿ‡Ìb.ó—Ó:Є>´¡ èEÿ¹Ñ…fô£hHOZÒŠ¶4¥/éMWšÓšî4¨?-êL“ӦƳÃf,³ºÕ®~5¬c-ëYÓºÖ¶¾5®sídË’Oˆøµ €-lD{ØÅ.6±ýëd3ÙÇv³¡ýlfG›ÚÓv¶²³íjW{ÛÓîö²¯îlƒ[Ûãæ¶¸Í­îr³;Ýí&·»ã ïy£›Þß–w½ó}o{K›ßÖö··û­oï{àÿ6xÀ^ð…¼á wxÂ#~n†?¼â_w°¾ls¼ãÿ8ÈC.ò‘“¼ä&gP@;PKcK styles.xmlí=Û’ã6vïù –\N%”DÝÕq{Ëžìx·vÆëlã‡Tj‹"!‰Š`ñÒêöc~*Ÿ•_X\I(”Ôên®«vZÄppn8çàöÝž¾ñ¢ØƒÁýÀŽèzÁî~ðë—æjð‡ïÿé;¸Ýz¸s¡“@˜qòìƒØ@•ƒøŽÞÒ(¸ƒvìÅw}ñ]âÜÁ¼Ò}Gº¢_HcºÕ °X;O‰ne [¨koô{&Àbm7²º•1,¢©X} u+?ž¹…¦¡x%,ž|/øz?Ø'Ix7Çáq:„Ñnd­×ë)Ív2¸0|å:#àÜY<²†ÖˆÃ@bëâ‡aE”‚ô°‘6iìÄ®p5~ÜiKÄãNAgoGÚ²A€‹ìºúìºb݃ì£BòŸ?å²tû°R9‘j“B‹õ!„ª¸UP‚îd<žèoúX ~Œ¼D¸S îØ¾“QdDCpÖA˜à‹)‡Žð •-ÏGa”dˆlõ ¢Î$S¯}rðÕê…K9è.r])(Bg:Bª†Ý|ôÀñ›AÁrÖ3`]b1C§ª ÑNÕV°Æ# “© bInT£]fö·0 Ð ÐTÁžBy¸ÈöIµ»B ¢”ù°E“l®Z(Pø\C³!I›Ð<Ħ Á„áP»`-âxšÈØ÷åo#\fâÙÙGÖ0iNßór Ñ층`ºÀñãï¿£–-ûlÐßÉûÁCbGχ D"„¬‡:xþs©0o›© <ŸÌ˜–ŽNtB ,Yghý‹½‡[ÒxV VÆEæˆ5È*ÄG/Ž»uÿ)u<×Ží – 0/=ÕΘFˆd°¢Ú‘  ¢àT'?zIœDÀ>ÿ "Ûx@xŸa'’^ÿÙaüoª´Tƒ¸-1’Ñ¡1F¡—8hÜzOÀm‹È%(ØÕÕ\:HJÇΟÁQIæòÔPñaz9™>#ªä\-âvä‘ ·!hT[}Baèî86±Ö`vèâ³8{™êfg¥`W–¥,Bó–T!º ©/i ,mF ÓPÐw¯?ýiJc«`xö1vPMýfƲ3Njo¯ê‹]œ©rÐÄþièTÚ6íØ³eDãN80íŠÑ›õÆË@ÆiÖ-/uŽsÕ>xRzÛ¤Ó HÚmVZí8+B]ç¼*ØÃ1wP+¥ˆÐûçp’Â3}ÛEѤIp!Jï{/C_S˜Ã4p’”6ˆÆý`Ædò´´s)5]i}€;gëÉ‘´ûSCâE%ƒR#“ûJm“Å4Kª%7X °ÚhMIáj ÷0`š'ÝØ Ê0ñ‘--4'S3öé`Ç ò¤°‡Î¯5däÁ]³½LÜ—j©tl @Oíùs‘pgX()ådÌ‚òíèd²)÷SP$kþm¡ÖâÅòº¹Ü+jg¤~£¹üb4Ü&óe&ÂÒ5%ÚÃýa"¬5wŸÙHÑ—È®×4²‹’êÉřޢù\mÆ-Šép¶˜,rW%yÚÀÛwTU_ QÀ?)W'ÎÑÅü”6It¾;*ž÷.:y͘¬4Œ¥‰¿`cHû—ؾç¨Ì¸4[Sâ±RIåÎ:Xc²ä¸då }%ŽÐ?˜ó„do£lF'`FæìFŽÊZM@£ §ó˸Gš=£ÉѦ¯c© ÕðÐK¾U‘ÇÊèêÓ¶ZŽõ£ÊñéxòB†dÑÜYY”t·™³¢¨ÝÒYÉdBáÃSihåÁ”ôV¤@Ÿ0¾Ÿ"_˜äoyfFCy„ZF¯IïJ“T£Ò¬ª¨¼5kîk×9˃k~VW9€ B1„bd®¿ê%í–xuÓãûíìÑT”g캦·‡ãÕd©ÎòÐ2õ%º+Ç÷vA–cã9JÞöQ' Ì#²ÎOΘ!?Çs­y€M­¯V¯U'oYQ»¥·ün’”ýSÞJuY‹Ücy¥ŽW{”¬ì1](¬ýMê×þ&×b0‰DÒÐ%[µÄ-qŠ¥ÀII2N®øQ&Ù—œm>æî¡r7rýFÛk¬×Õv¾î"|Ü9ßAh1å¯Jw>³½åÕF©6rKÚ,ÑTG›Ù_=>Ÿ…t|Z¯ãÓké¸B•§MUù”°²™æ­¯êg[;(T7…é¦ÿ‘„äêZ-{!†eiºát=]Êsu’¢3å_.™hì̬ÞÎÌ^ØÎÌ^™y?æ¤Ë´½*mþ9ë¬-oür“vh#cq.WEu"0†^ô¥Ð„ëî(oŸ@aî‘wËOe=äÖÆ²3õG†dÇ×4ã½Ií&SáHoE= ù8ý£½¼žê §öþÔ æEážp×ù ‡dNÈýi²‡§7¡Eœ‡õ¦¦Éê4^êP ´úè÷I€s‹oÏò¶ÏÛßíÖó=[kç^[~UwsÂU>²ø{~¬xdñÃÏ·"S¼»À9½äÖÑ(êlЋF¦ë6Æ“I﵄¹ -zü©>ênu×ZñómhKůՇk5©­ß½Ö‰ýoCOÿž±¶J+”uüVT¹±g/hÓz<ÑÊ.œÐÊVF$ñ]ãsš¿TŒhõ¨f¦KÂè<œÎky{±Ï–l›"ûË‹çŠd£`†£y†áÚÒ>ÏçJ×ÿ•Î^f®Gt‡ÓåØjuNWgŽ,¯QßèlXF³”3º™°„ÜvlW®²ÄË/|Ÿë43AaÏܨõøÛ×”qíů9Û¡p¬º×‹Kê…}õ@`z*rG@Ã@6KwYƒ;ïž¡2Ùãt£CùXâ×2º#–Ãyó]@¬Ò gVÍUýÖû€ú„Š;\8ÂÓ—¸œ#³ueªsTß[æËXæ-„IÅÊ2Ì…áxFC[Ýhcf©÷ÕNÆ­Â ¸×Rr¨a¬­k¤ÊÊgnT©Ý“bÕS·¡‡›Ô÷É”øÂmE%¤0†ßñº MuÖà:«ñP/]Õx3Ì\N5¾fÞ†f'}iz›YçZ÷è4 ð,KiõXþå”Õk“— ‹ºçÎJHC3¹Æ×Ý©->ØÄtœÎ&_vgÇt¶hˆ#ö³S oد»é=¯ÅÓûÂ=½°îÆf”aΰuSã>œÆÇäõFþ3©Âf zÕ½bð¤QË.tõ—þ˜MãµýP°ÚN´·"Н•÷j¿D&[:Uùƒò6K>amÇ*ï^¡[R<2ݪÇäÇ%ƒScSX%mpSH¢€;uø-O™(p(CÑ’„-¾t:¿Ö•‡&€)ò§"z/<þˆ ô=WB‡óÍöRÖ¥þ[ŸŸ‘]Ã4ðøýÏÖrj`Xƒ(]‚Ô§éN¤âº%Û¾¤ÒÏa%8n¦ÍêçÔôöŸñ55•¨yñ­~rnkûÓÒEƒÑóÒéèö¸7>*Ýhmý“½$Óº”+Tc,[é’$ Îì‰jïø‰Cµw‰x¬PR·¨³€"‹«ÌœâlÓçfòúJױɲrzdÅjŠ”AÚ‰â®\l*Wì4±gÂ$œ½=T3QŸz…¨éÛÑEqJ7§K圮–:eñ­ =–œ(¥oIgW¦”íš&sr²`ºÛç ™_mS¢×U`„ˆþ[óe]qïrÝÅ u¿ñ…o]ù5o¥ÔÐ~!1aÍŸ)j!ùг«¹äWN¯¶³µÏjéA]ß,(ÜåÄ©¹kGœ•ävD["Úª©-möúÎkš„È…±erh¼õFÔ߯™¯ˆ™z1Uó¸»{â{×ÐßÏ•Ld¶â¶\[ò\¾¤ˆ/»U „¼&+£xÓ7¡0b¾2³„. kfxDzü¢š8; Ó¨´úÅŸpÃ3 V "œ®ÍóNìR^–?G[(îfJUÍlÅkÓ†ãyF~3ú¸ƒÄáŸÔµã'ÊóJ²èR²!rLôšÒ¹#}õ ô×O|÷´!£á Ñ’A ¬d0pšh-=þ€4Ô¤×Ò ëd%‹V-Óó€- ¶ì…×Ü,¾`¤ê\­Ém¢5½M´f·‰Öü6ÑZÜ&ZËÛDku›h­o-k|u¼ŠE"²ù>„ ñÛo?§‡ù@d‹oåI‚üd5‰I<ê0[M©ÿ%~ŒÓ-ùøß2úX:‹XBô—¬ž¾MHVÇñKö²fK ¬mòq }‘{ºy¦oÊ$öf tž½_ZÙ"!Ý3—»ß¥=Òs®*˜Ó€u†o ˦LX^• ÓwÀ«¬k’öÈßÔYW6DówÁ„¦<¸* ï‚ çëÊsÁò0aÒˆ“k’õÈßt.˜\y.X¿ &4åÁUYP Tß,N“óLB±nÈ~q&ôAvd÷Avd¿<^M=UÙìaƒöA6gîÿÿïÿ±z´IrÉ/ýüZ<ΚF~3-ÓBÒfíõÒä>,+¿h@Á½>`ïö[cB°÷{°÷û‹³ Ø_œ }ÀÞì}ÀÞì/σ› Øñsž1¾ÄvëíÒˆ¼2ed&{º©üîg‘º"ªÕ!kèÈä6ud.×K® ö±D9…Çk”ƒ|y.§ìgŒÿ“A0C>]Ê 7v\x[s!Úu0J7Ïàx5UR|Eý¨4ƒ< x,]g/Ô”g¯~ nÝdÞ£Ó°ã‹› iCùt\YÁÁ޳6²ÞØGÜRAq˯cŠ8K¦?ŠóUÂêšžêYi<úþ§/ùÍ~Æt85È?¶ÿü;ò³AD߉ŸRÏ«D›tØS¢´Œ’èŸÇÀNBÆr?pÒ("žò‚ù”8w3Ã’Ë~ T9E¨0À׿ת%ÕDô˜JœàŸ¹OÉ þPKLÉV ,<çPKcK settings.xml½Z]sÚ:}¿¿"ã÷”&MÂ$t€”––Ófnß„½€.²Ö#Éþ}W2¤)6ÅÖ}"±å]yuÎîYÉ×ïW‰8y¥9Ê› ö¦œ€Œ0ærv|wO/ƒ÷Í®q:å4bŒ²¤9Õ` Ñ'ô¸ÔüöM)Ù@¦¹nH–€n˜¨)Èícç£ÎY~e%¸\ÜscÒF¥²\.ß,ß¾A5«Ô®®®*îîvh„rÊg¯u•~î ŸÙòÉ8gõjõ¬’ÿœl&ù,4õ ¹Ãöõ›×ùÏ)7ØØœl.Û©Ýä²ñÈaùµ`ßs¿>óÆ·°1¦ÁöŽY§tG œÍêu奉כíÃÔø°ûÀc3ßkø¬zQ¯3þ øl¾ÚµóË‹‹ã¬‡s\Ž &ŒAgÎä ôއ ¢&ƒæ” Ç9éɶ¥†;Œ¡ó§ KO¹ŒañËhíG˜{†¸¡Ö¯‹y/Þ™ª6ŠÛh[0×_˃à«Õjg0rˆ+gµ‹óúÛËc k>P>aœÙÒéí¬Žò„XX»*d»Æ`r„çÇÿŽ˜ŒÉÔ.àæ¨L¡¤ÔgkÌLE–È]b—e½¸(Ø/ãÒe‘Aµîµê‘³ïéD⮢ GL}ÏÅç æÐíMÎÚ?€ äëKj~!SÌPþ›Ú:¤,f† uJð°hξMCö›jbTVÄþGÅÒ9|™·So³h1S˜ÉÝ:P–“VPøz‡–”h:ö°³ù}—f}®q—­î_’sS…+¯^ÉTWa‚Év«MipÃÊ ‹`Ž"†ÝlU†›VšŠõ)6³È¿cjÑE•03Æû,™€‹‰§—mà Ø³É€ŒÓë̸ô`ÿ…&îÏ|¨Ú0S.=ØÅ U &„??‘]¯[Å–.Û—ï¬#xšB<ä‘É”—f +ÃHLÝcâÞ‡—¯rB=Ó¹Ù懰p­é†/œmH2¸ô–¿lœ|åñB/à3N¼Ð’®ÃR=‘ø¢zôî]ù/BZø¤fÝ!,ËwsÇ̼Í4Øv¼%øLÚÍÕ$Î…ï`:%åè¥å×}6q»Ùò\P…$ 36Ô}ªpâ_"Ö>«io&QA—+múäµG½€4=éÓå×4f¬þC’ úÛÉÛ¤~3 µõ¸üàC¹C|˨,û A*_dš±nɘ¢"š”š]ïQ&œ"÷±Ò"Þâh¾‡»£B[yTЍçW$sÔE~`²Gø(pžpá ZzvUaŒ9%˧ÈHó]ùLë4ëoÏ.ÏÏÜ5ú¥‘û¾r¬«y¿môŠö5„]eÉç)7}âÄnieºŸRjµ€KQB´Lh˜ò£®-Q­Ì`žÖËw'ŸiO¸<¨µ9¹ˆ(v0I©‹±gX¥ï¯Úõ-?ÈŽ@ícÔ¾‰ñ¹â›‚aŸ=?´™Öíê8û˜óÙü”"Š"³uìXmø”liÎä0“Ôhz¬‰v—Ô`òåÈ!jn=yC6ÁÁðˆ ÏÚ:Ì&Æâ»+Ö$2"B1Ä-÷_ùøØðuCÕ1:âÚȯ+£d¢,ö“2¥ä[©gCÌTt¼àk j̨Åí0ÁÁM "4EC¶höÉ+Sý©:¤?í]*^ù[l7äRO=•\‘Ÿ¾ƒBÂë ZL›¶ÜIJ.KÉéÓ°îÉ>×>ôÌæc€ à([~õ®"λ³6—L­_·é3d…seÅüSì£l¢$Åý I€Ò¿x‘£âîR8y_«W«WçGžé‡f-@ßã-LY&|,µí©r]qø„èÈÉ»Í+Âoh0Ý–Ýò‹÷h>gÚðéÚ"I?p3¿c2c¢mw=Ä̹UvËÅ–1ʶ÷¤˜íÞ‡$ÿZ¯HÐ&LÆ{ĬÜ‘R¶,QC)^p½¬˜uXjOlú'.ê´åÿ°b‡ˆ öžþe´G+-ýÔ›l•Ûƒ¢¡ŠÔ›SǤ¨ƒßT^|°W9ô)cóPKÒEa“ )PKcKmeta.xml”[‹Û0…ßû+Œº¯¶$ÛñEÄ^(¥´°¥ M¡oA‘G­#Y^§ÿ¾ò•$ìC}æ;3GÃàíóå\{o´R«àO(¦¹TU~í¾øx.?lõñ(™ \³î,”õÏÂRÏYUK¦R:£ˆ¦­l‰¢gÑˈn„Z,äš&ã I¹ÔRý-ÀÉÚ†@Ø÷}ÐG6ÄyžÃ±º œ­\Ó™z¤8ƒ¢ÄâÃ…>j`¯#i­×A>…Ç…Åpú^èÊp^¿÷ÇFÐ%¤–úoRô7?ÿjá!(—í1Êí¦Jjµ)_äÁˆ#7 ’ |z‘ª»ìgÉ>‰½+`ßýG0 zúÔÉšûáÞõ›ú3#¨u |N”.hâ£ØÓŽIˆJgß-·åŒÌœú(óq¶ 1Ùäm‚$LÓãØYlš%¸´îœ|öÕ¢-£<Ÿ›ßniÞ™qrù~Þáìkò=LÞWf²®×ÙZ'·V2oÔ-=ÔÂgºS¶0‰òL«U U†ý-2šÕæ Å›|U ­ mNK)Š“l®õÚðUNãlÑÙÉ™˜f§I„çªr‹îOÒŠ¶¡ÌM¼‡qžäq àüÞ®u%.ŽR >7pG^€oê¨=ü>†Eac6xsÎð½_GùPKÀgt–öxPKcK manifest.rdfÍ“Ánƒ0 †ïyäÛ&Ú¸®¯^Úój‹•¯j~ š*!–eI—‡Ü^äeYЬE‘xE‚«%yL,Ƽ‰ ­FåÌD~ûªåÌTs¤uИz÷ =‹itP90;¥¿‡v 0‰˜´ Ó- è{£´ÈÓBŒš¤€®_ƒõÎ š‹€!®8~c»+Ñô¾[Pó¨-ý‘ÇbV$>KGç³øÎ-<üj#–<^¸Æ?E¼ÈËm„—;Þ;qO'ï#wjùj¢OPKŠñ²ÿƒPKcKConfigurations2/statusbar/PKcKConfigurations2/toolbar/PKcKConfigurations2/progressbar/PKcKConfigurations2/popupmenu/PKcKConfigurations2/images/Bitmaps/PKcKConfigurations2/toolpanel/PKcK'Configurations2/accelerator/current.xmlPKPKcKConfigurations2/floater/PKcKConfigurations2/menubar/PKcKMETA-INF/manifest.xml½XÛŽâ8}Ÿ¯hñº"qù5=òõyf?  ”Kkøû5„t3ZÑ4¬A¢âÄ©:TŸŠóüõçnûôÚ®Þ7Ëdhöšj¿ª›ÍröÏ7?³¯/_žweS¯C×/¦ƒ§x_Ó½—³¡mû²«»ESîB·è«ÅþšÕ¾v¡é¿Î_œ#½®àÙË—§xëzæñþöø1{=l·óCÙ¿.gù-'§waU—óþxËYy8lëªìã´ü­YegÀÙ5ά?ûY~†o¯Ãî{SÖÛ.ï§ÃìÐln`¨wå&ä§ëwEÙ–ÇýÐÏ«²z ¿ñï¾×MÙï ñw]õCº£ø!æl€(¶…`’L ‡bXZ-³îmwËŸDÄÎh1…Á„òBÜ3‹°gúñ‘]}@¹ÑZÂ5 <¥V)ųM½þ´²§ë€€¬½@Ѱ.<ñÞ[‹tÌhÆ– f½•àŒÔç÷ žŽYpÊ)ä””ZI¤±8Y ¿X Ä€/ÀzŽ•÷ԧʸq 4QØ ¯,åÚ*©²€¥¿Ð$(d°äÄKG$˜ìÇáó,ü8„ÇÁÊ )<§TãXä¤ÂÌ%«!nZ•LFfQ2Ê¥ª `U8ÇFZgÅ&×â™Ee®ŒÇELBB¦ãã´4"P`ÒÒ'j&ËÀ8Ì#‚3¡y2ØŠñ€Ç•åZ[i¡ Q¥l:ydc!NŒtš#¬uq]jòÿCY€Ù% ÌXZÐØ*A6~q²nEq´ ­tˆ ÉÄßÈÈd\Ó¢$‹(SÔKµQ . xÊõœX `ˆ”ÜŠdÒ„Ý»@Skua­ÒP“eἑŽNXë€R‚”2ÌÉd="ö†1R3¤å.>Ãpl„L§ vz`°ÜZϼAq£¤‘É:%Œµå"Q›ŒóŒFɸ·JS!ˆ¥ÆYob«PXöxÕ¾éO[Ø¸Õ¾áø´¹ÍO—ïòÛõÇmèï6ô}ÝlïxúòñN/ç²vu«l×ûï8믻c˜}³®7C{vÑἬª° q¸oójhÛÏ‹ûg±~óI74'ÙPgÕµ‡Sðçü?¯‰^þPKÊTŽXaPKcK content.xmlì½ÛvãF–(ø>_É:]+³-R¼SL—³G©‹­©L;;%ÛUÕ«W-IT‚‹$暇ú‡yíó2ŸV_2ûH€¤dUŸãq‹ˆ;öýò§ÿxœÙÚ½éù–ë|÷ªYo¼ÒLgä–3ùîÕÏw×µ³Wÿñîÿø“;[#ó­áŽÂ™éµ‘ëð¯o;þ[¾ûÝ«ÐsÞººoùo}fúoƒÑ[wn:ò­·êÓoi,¾â ;óëô°úv`>Y_ÆgïêÃì#ÓÃêÛ†§?d}Ÿ ª¯Ý¬/?úvmìÔgs=°–fñh[Ηï^Mƒ`þöôôáá¡þЮ»Þä´9 Nén4áQôÜ<ôlzÊš¶‰ƒù§ÍzóT>;3=ëüðYuJN8š^fÐè¾²«þý$3FÜOÖ€f4ս̸A'··mdßÞ¶¡¾;Óƒéš=9;ý7é??ĸàÍ²Ž…Ï&@5ò¬yæeòÓêû®ëFSÅø€Òt[Fç”+O?l|üÁ³ÓSm||¤Û£âî, hð\󞨙÷ˆ¦â# ü5/´Nùvô°o¬ýô_>~¸MÍ™?lm¸f9~ ;1d<Ü„µ+ížzæÜõ‚0ãìv«ÍmÌìõÇïÊG'ža¤> ÓiŸÂчƒW»·Ì‡?¼JPòÍ1XB"‹Û^¡‡Tº¹ñ…f㟉Ž1 HLä½IćÆnèÀ"€w šsÓ³ð–nÓko_P±Þvwø¤à]ÊÝ2mI1¢%¥~Æuk3Š;«¼äÞì1Ûçðp¸Æxù‹K„bäûí î>Ÿâ½²G`b$E,h½z'e¦þita ²@m¬ÌšaŽlÿÝŸ˜–G—5þóþîÕm {·‹ÙÐ$º-ŸšYöbéfü$̾ ¬ù|÷tË ôT3m„¾~§O]$+n¨/ã­ÚÄt`·€ú–ïþC8² Ý×?mñÝmß¹pCÏ2½´ˆ[W2s Ós¶ òÞ üÀ3õ™ö‹ééÚ-ÌKûè:n+eÔ?ês×ÿvÝ|7pwœQrÏhn#`ûcëÑ4vH›µëTc|(€)×~4Ö‚Fy¦zh¬Û‡vu8]âTsáùz¿×=‹XzÎÀªÆÙ…OŸƒB7ÌC|´œÑ4íèF7J…`Q.c™|+õ@™dvL[3KÝp=‡SÀµý/!;›Ê°„Ï+3,} \ý|IJðœÖK{«²X囚NòпÌz‡=[nùöÌ_ø9+DÏnµµ$'=±—ùÜZ³ÛÐIC"y£ÒÑ SÓv'þô<·^“$$}K–žÛËÆüj94§+õ^Ñ9œ®S6Åu= `Í5ªÑw"-”þ»¤¾Á'›Ñxb®lŸoѯÚ4iÓ ,*_~° ´êµë­f«kÁFŒÝ·3Ý›XNÍ6Ç Ã5êF£Ÿ¼¸s¸‘¼6tƒM]t™ÍʺmM@ÕÆïȹ¡! ÀWCyîxµ`H PV¶m™õóÔ…ÖF®Μ¥õòÅÕe‹ëbõú 7èXN/}*Íz›7"ïT.ª€J»ÑÛa*é˜Xó܇¥yÀ•ÕIÌ™ðÆÔ´&SBÀf¯'ð‹iÎý&f0Ec¼n?è ??­™áÈ´íePÁ¥Õ9Þ㯑n׊Ï,Ã@[ Ìp¨¾L<´¸!˜]˜äÆô?º;× $ñÙêËC'ïxrÕ«·ÇN^Lœ;ßõ@Œhuçæ»¶ehhàÿšêSb0ÇuLõ2´åÝhà´ç$hX3}bÆ;• Þ¼8ÿì÷ñ àm•|Ž[ð¿5çX]ÎSœ>¹gÇîZÇÃîZÇÃîZÇÃîZÇÎîZ/ìîY°»Ö »«¼GÍîÚ¿v×>v×>v×>v×>vv×~awςݵ_Ø]µà=jv×ù}°»Nì®Yoæ¦ê L³ÞØ…×uŽÁt^̳`0S-xšÁt ¦{$ ¦{< ¦{ì ¦ûÂ`žƒé¾0˜jÁ{¬ æÓʶÏuOŸxú|*oÀÌ9¤5~ëÚu1ÇH~6zE9Ì ó$:˜N@øÐ¬ñ¢æÃ^Á'`w¾{5ÖmßÌ1ï€f™÷¥9ÖC;ø{«ñ÷;˜[ zœhrîéâ[_á­Vc±¹èrM÷-ÝYwóálóQÜξªÓi‘UeÙ?н ÛÆ¨VÔîª@^{‡p¸»q­ü–¼þn)oGÐûÙaµ"A>I´zÂÐ;4²:®7Óí]¡µîíìð_ȱþ³DÙ'· gûÞ†‘éqFSñ}8ÛÀRïE°:ËÅŽû;áÍÖ†5¥ßŒE·sH‡'~ ÷ «Dé"°Ê,Sg‡T.»¿\¡rÍÛ» •­£5üNèô“G Rm#Y€¥<:°C¶å˜rɼæ°A^Ôô'„ ›F¤¿‹z& ¹ÁZ{t„6;›Œi©7cŒêä[Ö“7%ìVûTù;ù)ÑòbóQ¢5oïL‰ž¼²ÿäwàEÍÏÌ÷Ÿü^¿(ø‡Ÿ<­jÿ‚@Qµjåûžo„æp80Ξ ’íݼ°™`›¡hól7mÛ…Üfžö‹™áûÓC£}:Çml(WÓlWjlPf¹±zñ³ôa´ŸžÁã÷½_¥]žÌ~ ¢ö⛊¡TƒÒö¬¬½Ù ô9àz´f¢½Ä'ö×.ÕÈS&P3£z‘¸ßöÑš(*AÔýÀ´ÒpúÝ–¿Ïܶ£U„ËF©§nŸìì=èÿ ;•uO i™§È¿Ó¨3Ó³T~:Ï@Y͵COHë<Å4nŽ÷<ÏaUF¥çÞxwÉYmÌY]÷~ð>CÍñÙïÙauÈ-àÍ Æ(åA©zd:öã¢È±æcö¼f-®Qª²¶3ê¶²Q†-ÉŒ…$™²«–TêÇ+°OŽävïÌ; …©û T˜cé3Ð<²ƒô «ˆÝJõTÀä˜\¥µ’2SýUØþ$ÁîqÃk@°1쯥w†í}is`Š€£wGms Å3ûàa½,ù8ìší­§üÌ^Ø;Ñ—ƒºW0‡ ŸÏŒ±yv¶€â™ýð°¢zn¶ýÁh¼€ò™ý°TilF˜Ö·€â™ý°ÒÃ*8ìô‡ÛÈÏì€O/ï°è®ù¨“þÑšç nÏþ"û{â‹‚â ‡ÓöVâþ½oÌÑò¨bcž\Ês/9(åÐèçŸ&Ý?Ú¨¦¼»¨@ä%e´´Ózv´é=‡À'+PŸíÖ;Ïš„žY¶cî;©»×üƒ8ÂMÿàËØIå,¶Œò#HϪ×Ìø–lh1U¥óh£Ñ8³ þh¶ÅtEí¬¹¦5êrÏÓM­P—/Ê 4ëÍæ<Ð 7xþpÖÀÿËý¨fYÛ$Û.|í-¡×cêvÍŸë#àÞk=’dÎö¢•Õ—*[™öt/ªÜìiVxìEw:xáU|¶eêélÏÆ¼Õ½ìÈ`/êË¡w$)öÔ­A³*Ù¾Þ[êKø.-˜˜?A\ÙIGBADyï ü÷–¶çeö‡2kR¯÷ƒ3;é¦OgžÖÎì¤n?û92‰i°“9á6ÐC÷Œ—}©l_ž”‰âðÎüçï(ü.Ì+ë1"+˜v²X¬´'™ 8ØÉ:‘™˜ï²Ÿ<Ÿw1ôçá¤ìd>)ïì<×ê ÍÆNVü€b¿ö£ù°"ú¶§ùmlÃ1X‚ ŽÃD¹µ¶ƒ\ô¬ÙØÉ"°A4¬ -ìùlÇNÊöV4Î…<“ÜIïÜ:Éjw¯Ø¶”£ÃåZñò:;éM‡Û}[w&!H¸ò– 5#7to!oü|["vR%vÒš¸®2±…f˜µò|^@U£LdTº¾¹Gðå $Î Ý}:SÙœ¾¤Ò kº¼º«ÂJïYŽSã×жPKÜü])EO=Ž½ÙØI’&ì¡k,JÇÎX–ÑŠ&ÉäD̃à‚`@ÌzŽ…¿7wÒ¤žâ– ÄwÒÁ>X>AüSôì¤Ó¿_M¯Y…[µ@þn³_ï–™ÁÛlòN&èÈS:Ë;iŠ»®úé0•”F•lŠ »nà¸AuqúOÏvR0#€ŽÜùÓ<^;©‹éË~Á¡´Ãqè‰[*š;©*eCëY›+Z;©çC?ðôÑŽÅ‚r[¿[;Ië?˜:""&t÷5Ñ$LamüLJS˜ûSd­$Ðó0˜ºÞ¾öh'qñÏæy¿¯Iî$¼å×O÷°ùlÈÖNàw嘩ÅN¢å9ÌÞ¶t´ïë4î$µe™gIÚ6!ŒîïÞ‰¸Ù*C# ôpüúëál=oΓ|X¥/A±Ù.%ÁhØ?4IžIXY³]JÍÁµ{ÔzÙ£ö¨”š†k÷¨ýt{v7Û¥Ô*\ šNŒj©£—ZðáIÆ57ÛÇÑ3GEq£×ØZQœŸÙw’Ç»@s-“hÒ|Š*x{'¡úÆ1ÌGÉ&¾“?È£_oug±[2XÌa8ò}FÀ¯2¨#3Øv’ñol;DS®¡÷Æb&[²{m<“ý§x&;;Éó ¡j=CBÕ)jÕ-(ʃÕ'ÜÍì$'v`›’R(í­ÙÙIHU&Ø©ªI_s·.óÊÔÖ+Yt±|Í‹© »ukO,õR¯¢²g»ê³³“8×a8½À ì¨ ßL÷p ‘iß¹‡™šÆ[’¼…/†³!ä`Z™3Iº\ƒînÆÇT¸’uúœÌºÑúl=ôÊŒL$7×ÝnwM†s„³]²œ³'‘á›®7Ÿ‚jùÝ+Î{þè>D¿¦‹ùÔtHZ®Ùº")ÅN¡m§f[3+X i¬5@ôÝÖ¸ÓøÆƒ’´3©Í\6ÀYx¸KÈz½Ýo49n½‚èòê)œº (x{¡¹²3ž9ÓqFS=ÚžÕ훇þté‘<p'5!÷,ñ˜UˆºGãº;äèî¤- CÛ6É.†Ø°3²Ê^G%qtwÒ—ïþÄ,’~Y#u†§?¼[¶- “nZJdcæYÞ­lx°É⻾ŽÌv—g‘".w+ Ì=ͧ›Ou·¢¡îyñ…vnE‡Í3ùgá#¼[Ñm ƒ`ªùÝŠš{ò{™æŠ&ºã4÷džÛ LV4ÐL0Y‹c)40û\V„ñÒçR"Á]M–Ü8[eàDPb3Ïùñú!»|¬:ÃBÄ”„{;-$¹s=¹ßÆËéõej_&„òñóìZ–WYØÞÝjb\¾µ¤Ç¬ä?oÍ8þ16ßݺ0Š‘‹&åcª9æp°˜»Õì¨J×”‘ª[j>ž[`©ûóVs‰²Éy ðçnGõ8ÙÈ1ÕàƒQ±Õ\Š'\5¯&îì2ß, k¶ulÐYSw¦Tµu5A(0¶-:ÿtvÔDsMg» ˜cÂ;ê¤É W!îæXCAv)›cä± ×ZiÇq =h5¿"Ã:öc}ȱˆÝøß·•°&[«ù9LA­Ô¹ÍméõWv,°r·3ŸÇµ?9z5º~ÇyîÉà–Ï‚Z.¨ Ù÷ªý¥]9ÿ)-yö»hÆ|5Šóh·ÿM;kü[žQwaÆkF-¬­Fa·¼äq+4Ñ®OUÉ1‡|Ü1¥pÇh˜zžóñ¶”õ晑#Æïn5·¶ÃBŽó1©”Íñ Gˆíæc"iùÒƒQ«“gÄ|¼am†væÇÞ 1òrJ@éµÿD“J‰‘,¾°¡7÷ÃÉž°|³P¬‘n#FÀÜùÊ Ï´SBe§®g}…ƒ(ßL–Tî.¿>V[Ü&ºÛÆ1¡YÁ¿B¡Ÿ8øÇž;«í¾ô:ÎzÏÛ°ÂOJ؆cørk÷A^£ðf¾Ts1+(X ù%!dì­ð¤Ò Éèg,à¥øsœìSÃ{sÓ¨E0ðÕÌŒÃïÆªðxºã30^­–Ç"YkLÿ+k%ØaœpæH‰þ”ÉÍWʵ‰>:wœ®Û¯ìȲ"H”†,^dm ŸLQÑ÷L†~yœ¤F)tNÚþçæ(/Ø‘Š+B_ɤäX¶ÿP¤zEÄ-¾¸JÛ6íZýNãŠzò"&Õþ¬ØñŽ\›ÈÄ¡Ÿ¦´Wšj²ší°_é9‚¿:~ºš(R‰|‘N€Þ®fÓlßíïù ÿˆy"?0³<Ïvah[sL'¯„'Zâ?oÄ&˜-GwFhøÿ7q ÑÓý@¹ä™†òk♦£ü²ã º­ÏfºØoùEÀªš…h|²a‹ tÓša $š¨¯q_Ö¦Îsºw°eÙïƒóØÂ½mÄ&;úÅ_*›TüÎðZ¸äº±|Ìóàý½ìtngÆôûÚÏ<ûµƒQí÷A§ŽQ¼üáq™tióà®ò׋¿/<ȼϷ°òµÊ‡‹j_ñ{uMââÂË]ÊwVVGʳ¡º…´VÂÕÈ’oJú+Ïãw¯Ú­~¯ÿïô6µ•H6†«&èѵz³Õm©Ü7}ö,õ³ò+ßN^,4ÇF`À„Rí*±Ô%~À6ïa¦L(¸˜Æ7ñ:!ýT)Éû¨Þ‡Üùâ~ªŸ}÷ê_ÿüÿ"x+)»Ëß…ScF•0eÕ8º5Cv«c8Š»Ù»pÝéSwÆÌ›œ­=ƒã¸¡ÑÞ34úÇ ŽÎ^ÁÑרvÖÁ”:¶*­Z³E>OÖºÚIN™<÷‹¹’Xš¸€sÒ=S¯)+O¶\]z.°xjf†mnÌZÈe¿8Ÿ5î>k¸j¬=2™?PW¶÷”+ÎQë^8ɰ[tÃ÷'qcè‹èB›kè›5߃’†³Â|ñEwéèi$ÄîÍ”ÏÝQè+Íåñæ|n/j†éÃÆ‰MŠ‘ ‡ùãµaŽl?í"Oʰü¹­/jnPE`Aî$µcĽ±í0šZ§ãcw¾_ü+ðgá\õ.ükjÈSÝTàÏWùÇ¥9ÖC›L´žwâ“©ðòÜÇOs¦5]–ô„“x¤N GŽ~-XÌÍdFÍýäí#©Ñz.ày©w½¶¼ xH·Þn·»òâT”ý$¦CC¥¼üœœ.BíÀóåíÔ3Çß½údˆÚl(ÿk‰›gv³ßºn\5›½óA»9¸®O¬ñ+ñ ž¾oaIPyÍŸb ™ ¬Ë—t‚Ú³»ÎWçcCOîÄ<;ðO_]ÿèÀn¼ûþîÏ¿ê÷¦Ö®·5úãÜÑíÅW•~öMï:Öo}íûÐ2ÌíðélÓˆŸúÍÍ·[o7Çz;Ô?5AHܲÍA´WYž> ¬žì6¿ýîç¹ÌÐþ$E}'åàuÏ^½;'Àµæ™ä/ðè»­Õhn~µÿê]_}¥ž ÞÝM-_›éN¨ÛšÎç®îÅg¿¾uسŽ:®â£6N„B$Múç² †î|A×ÚëÑ­9œÕ¶‚¥·íýíMFÈìÈ Ù8t­Qo4;=…Eã…æ‡F>Þì/sèøj’Mw›yùt£s!ÿí6/®ZÝF·}Öëž½ï„OÜ? "Öhî8BDÐa´•íì°ý?–v s5m?0-§®eœÔÖèé^ Mr> ñôw˜ÏŸM,íʶ-7´kÛ„Ÿ“̇×ÓG¦†ÊË|ãÌvÔ¥ üÞÐÞëvf=Áï¾ÿáW"X-7ˆÊ÷?ßlœ[w‡¹Ýyê©Ú÷+×6²Î%wRþlÐ׿k·ºe›^Ö¹\=‚–Žð¹t.7Îh"wFy ]9PdÈl¥}?þur× Ýø[i:÷¬…®ý` =È:…ë¤ßlî0þ_uÇ/¡Ç³$V$éÌp왦†ºþ©ºdð§ïná2ÿÐ7PQ&ÎÓ ˜¿==8aÝõ&§)æÇ4ê8ìzÆÅ#÷–oX‘¨÷ð _Ã'Õ·>à[ïÄHu1šˆþ­ ÚÌJk9l¸D³ ü¿`­ÄžOõ¡É–$b:µ™î}©Qv;ÏËòß|„‹ÍN£ ÛÕnõÏ5¤ }¦[NÍä>3d9}÷ý?kßú }o:¦âS8´­‘öÁ™ŽonØZ³yØÓwR ÑZu8ª¦G»öãOì—§;Áâ[Íq t}‡ ðñêóÅç?Þ¿¿ùps÷W .]ßÜýxu{«]ÿôY;×>¾»¹øùÃùgíÓÏŸ?ýt{URÁä ·ô0WÃ…3€ÎÛ‡ÿ0GkWMu˜<Ú(Ý0ÀEÄ,>©~gãíVû)Üž®ÞþÁ¤~-x*¤=eÉæÓß |Æé†Ñº›çÒAk)~H¢IÿH²8¿èÃØÐ„¤lÛwø>Ð@s4JÁ_ÚÒ%é“@Ëä«è¦øFHó`uàÕ»:ñ½ä|¶ãX«¿eùQL‰ðƒŒÐ£~úîp­gg“DÂ] Ò)•9NEÅó(4›i¢álnÙ”«n µ6ý”:¿’‚Ë%†²¢¡^½k67-·ŠÝÿÙ±iÀ¶ÂGí§¹‰&i˜Úí÷Ù¡0aôG}6ÿÖÒB˜Þ6°dÅ‚f?­‘ç¢`¡ý Ï}ð7C¡¤•=ðX°¸ö®{¾nAçs|€¾à4¹þt/Ë™é#XJ§ún$í°R±<ש2O‰ °”Ï ºû>€RÂý ¤§{Ë|8Л_p®˜Æ6P=t¿Nhß–Ôõ?JÜÑøtˆe¬š½²OÖ¯S=Ðnüjf­£à ³>«ðIlC¸FZËX•ÉÛ$…¬d#ó®ð0ø …–VÓÄmP¨RºC¥ì#肯iÇÔK™õ•™´³Š+¿s]{(xÕ":¬*ˆÆ‚Ü*•¡ãRn­ Z°nÃ!ƒ®ªeø4ŽÜžÖÎÜ|Ý:ˆôT¾ ü+ZC©,×ð£~oMØn€bóm ¡¯}ÒÓ.qAN½øê]§U:ãµfY™˜:¡ÀÂîC2ÄÈdˆïiê,™jf¥üêD™"ÂyêìlþYº_–L:gÄ&˜NéÈõƒiÏw˜Î^{õ®»³Ä‘Á2ñŸ¡5ú‚â´—õ0fá¿Á¦v÷nT¿ÕÑõ¬]R(ù´îß|$ 4‘m (J@?èÀ‘¦ÕøJh¶VR:q»ähtœ>βÊ^€+(]­–æ<Œ#ËÔŬ#Ã@ÄaÊ_ÂHvðíE•«˜Â ñJ%õ$Ác€J…Ó(¦²éK,B9%»2Á*&á((Ü!}.ÝFóI0§Ê͘‹!¢ý(Ý×pn[ºÏ;A–¦ó ЙÊ^E!m–¯û¾9ÚÙåž,ËÔih¹=¥ !—æ0œLp%ñtë†Þ£NÒù†!zõ®·3ßÈ »œÏç¦cXÚù[XÇl&üé¦öÓœ#l?ËAËÜ$9èV·³2¼«ˆ#4Ò 7ñÚUOËf(•rÆ~к•ì jºüyXEévSøl >_ÕÌÅça楛PMüv…@—ßõ®_º5Uš–«š{lºîï]Á±ƒÖ œw ç?šÌ6H¥8P…È(>«(="(rT5wÅ/Qþìñpª¤_6f ÷KUk”™·*žz æ^ºåŠHã×J¡Ÿ‡™—._ÞS®Oe7=¸ ó.ŸO­”¾ˆÏÃÌKçÓðévPòÔ…?+OûÓ™eŒôÊ]~æ¾3Ÿœ­•I+…»ü>̽ˆÝmcðuõêý[­.¤}o¤ý¢{Ö½¨X»Š5 op( šy¡oÑ ¹˜@Qź`-ƒ)ï®rã/,?ˆ–¥Ýbýs²8´9B FNʓڟª½«ètÓ®œU 8„Ч™bBü¯¨¬} cÀSC+H…A™ëòi( ‡ÊººÒ B;°ö² Y4’²žòÛLÝöE %¾V½,/Ч1VºQº8pm¡eõG70}Ìɬœ Séà…–”È/»Ó#ÆsùVûð—;²:k×´€*mà2÷n²¤…yúìÈ©»Þd•_ó”¶‚¤°—–Ë­µO.ÅR•ê3P×Ök´µ¹¯Ð¾gYØ¥ ‡ÉZ‰Æ*smí¥µñ¸¼ý@;Ë Sçó÷Ï LíüÓÍ1 wG‰&åiúÓA6§‡åÀïÌrôÕ[índKŸL%(…]6.æLYÌÆ ìv_½»V!ùvûó7‚ ï¢ÁX»¾½[E™rá5ÆŒÇ"ŠÇöLÅPryó¥Îו »”Eè€øŒ¾?ôÌßB Ù^­p+aîÅwK{-¾‘µ\± ¾ì³d&ðJ÷†ª¯Eunµf½HѪ?j¯Ûð,,·0£ª¡¦ñæ„6°ÀVôg½VgýVlf×€ÎÀÕñ*GÛaçÄTpç°p^”W P™Z£©6‚9À0ÜÇvuÐwãÚæ¡¾Û¶´Râåô¡™ ™‡Çy·m =ÝÃfð××hqUNÜ*¾|…)”²ÓQ-Å7„¾ðÙá×V¡µî´:k~µæ­²Ð§B‹2‰g6¢›,l q~cu Ö5ÁCÍÒœN¢œåù¥€ñ‘kP…IÝÝÉXÀË#;4b…HÒyøÊ>z¢MÝ ÷Ý”¢ø#õíáå±f»#,!¾„{Åö Ón­ßƒOw·EÀŠ_?}WªØN@çu_¤±èµ•v‰*e×ß ¨—A¼õ;ÔÁÆž&4ÃÂ4®·P Œþ6Ö* µV½ø9lm¢Ëƒ 2ㆂ;€†~6ýÐ*ïñUž+¬äT…˜{ |2•Í*·Ó¥¿¨û|%؉IÅ1¦¹‘¸Ä2|q¢‘Å4²¥ï äÏN Ä$@%# ÝßœU",ŇY6¾J¯X‚ÃçcDVÃåÄË?gîÝ/&'aLmÐLb̓TÜâ³pCÀVªž ¦edGÚ ’*ºl¸!¢·¡Ã µÚfZ~öê0ϱõ˜8Œ¬÷ãhôiü?¬}×3Ò¯•ù^Ã)3)³ôŸ—s¢pú\Éb‹Î?xõ®~äVã©}‡Pç—ó¸¦ÝîkjoOƒÙüTrÕÚu œßnžfr–yÍÜÛ5žŸÅ6fØ:4Ò$6.ÚŽ±­Op|Óò +²ŽËFæ ºv·˜ãÁ³'hó-ƒL";¡Í c æAÓ®PÒ^µvÞ«™þ¥‚MúU·˜³BE†ðF¯¯?MH –&˜З€æ†pªÎ=•)@†u'$éøEKo#Ä ™Ú.‹Óá’v¹½ó.ûaÎ=î´Öƽ|Ò}„ ãm–öΫwÿå¹nð¡„hO]?ÐÓÿï?dBQI0ó/c›Ý5ª’,§¡êM 'd‰N±ü†•lU:û‘•?b'ñuóÆÓ±Xº@¯,ȱe¸[E¡ŒóÚI”× Ò ¥mã>$õàðÞ’Y‹µ•:¸Äâ-`õ„1>2I2‰ÝCËY#r%¯ ,/óÌá¯cöÖšw·*‘ÈÖOi?“\Ätâ•åøÈé0©œl˜ÿ~8†Ë%þ‰<ߣ|G&Àg>!ôG ¤ ¡¿­ŸQ¢¤™MiòÛÔËHt*êÕ­n+¥'QGŽŒ_ª ÝGlù‰íl£~ƒõv—ºn˜ÿYsûüÛéý˜ZÖ@æR;¦Fãl©S¼Jü­7äIÕFŠraÊÃòžèb®À*Ú¥¬ý›ÚWçÜo±ßëzç×­þ qó4ËïßÄ­/%‹¾—Ë ð?—Ú6“/¡ZÚ:ŒãºoùÖ7Í5“erŠðÝÛȄⅎƒZ ɉf)gå4u¹[Qõ7)ÛŸšm.– ÍbÛ½7²Šû6CÚ«LUæKµ²e‹%8¬¡cã\,&2o€XsŒoh‚0ò /cÀ™ˆÎŸ ¹¯; 5+OóS¼ªTµd±{ÔÊÈ:ÔWVúÓm+X  E&-a/ŧPŒ8eB6ßA“ M‚4£ßßô褙êŽpŠS¡Fà¥ÈÅû ÖoÛÈ=§ÒìAJ%Š—$½ˆúÒZâÈä ~6ÕÄ•rŠÝÒ ìW©ØA>½/CŠ"CP­VÍÄŸlS÷)†Â;uâßRÛ§)‹(ü=-š(=J"ÜZÐ"W°g§Îˆ?xÊÖÂIÍ1ƒS Óªä êÓ`fïÇó“kJ±h?ÆÜ–óý¯´ ¡¯ýrñÍ7´5?òñyÇÇ2³´/Ê@enHžÆ\´à šÚéÔHÒ9%x‚M0†ë˜I³|%LjAa:÷–ç:ˆÕ%'˜5¨àè˜qµ™…5‚%iò¹2Á¼ÆádF8Ì’Qid’ªlèÓ™re |_=­ô:R"•Zä ¦UºŽáP„º xT‚GxªûärèÚ¯áï!%íùh©FÄ…È3BN£ä6Ú;BX`šµf½•å¼l·çß°Å7}fùVª“›ÿRèæVår|©±¥7©¡²=ýOh%ѵ1ªã;~}U*ºK!E™¤†·]÷‹f[äK°‚²&N9á,v¾Dõí"ñyæÖØÂéF04¦;.Þ–`Æë½z÷‡ÿuñSšÅIJ9ð ?gµÿÒþø[èßþ¯&ÿ«}÷¸R«ÙÖÐWÿ;Û€+æè\G‡N×MÐoµÚ‡Ó)œ¯Óábäèg¦ÕìÉè þ×ø‚¾Xü 1n©øÓÿ†–¼ïÉGa—B\ürB ºÔ‰PÞ¦^ƹùŒ^’²0*Yüý¹9` “¹N,çïzòç~Î|f£ÂçÚ8çÀkö×ù§ãÆ? @ulí…Fäµ8$Ó¨UÈkf33áøÛÆî‘~1¿©Ý$ðÞ÷F§ˆÄ©×ƒ/ßàÖß3ÖÞ“ 90B¡Q] Kõ¡VÔ.`ŒêZNãwI¬´Uod`¥íÍë$³å&¦†yVh¸$m3d³ªî,Òçü¹9²@×4©%r´›9Ýæ1ÿ2Iá[g‡;Ái¦M´`ÝéÓùÝ ò^T IJ‚äÑý„„’xM@†"#Š˜»±bna—_µßäQË né¤ GÕú×V˜n\Š“EϰU""qSÜý~mI(µS,tV©–É^%¨ckâ÷ÛB±ä“0;š ÛýÓí_ @‘¾ P<­R„íÆ0çøyq«²ÈsPQ’¶J—=…Ä#Oþñæ/‘2†dÚ3}j³Íæ xt÷=Íß_þùh0)¬¬ ±Bû—fSÕÆk¬ôÿÂË_K ¯­ºY?ÉàõtçðzšÁèt&¶þ”ø˜øuä• -sJÙ]x`ä6 ¹qóHpôß}ã¸l6µo~ã5&¢?QÃ$+/§< K¾æú55Š‚q}7vwŸÄÉc;¥&6.ȤÌêØ¤6‘‘EüWØc°Ùqüj-hÄá·Ñ— @Q§Èƒ©û€ŒØvJÊ]ÛÁ{Û-Á{ÛÚæ½íÖ;ý³Êœ·Íƒ9oåº2ûnÛy}·éÃm÷¯®zïïÏ.®.ÚÖÅ¡}·Í’|·Q€~컽4g®ÃÕPuQ)‚O9ox‘Ÿjÿ©žüâ®ÝLjE"üUzš• 0v76.ƒ)—“qðqIôÑ6‡°ç˜Â0òDyË^0χ>ÁÃ$³†`°Å•¿º~P›a>í ÏÕG8%Ï 'SY #v®U²õF8›ãfDEö^-VvC_“_ùcìIrˆsºÈl,mû8³iø£ßj¶›ƒÞ Ýèõúý„^Š1ïCDüðšÀÞ4^Ü´xG][‹@úmAŒØHÍÑíÐÔ.85ê6°8^Æâs Áê[XKDO," ¦NLÍd\f†Aêòp‹“åz"JÃgË89`-G»¹ººª5Û½NʨäIUÃÌÕ1SFõãgßqTÒÀ1â*|„f3ñß[$“^ÅÔa phÁ ž|]·éÎpm_ž @çœ"ô:OR5—÷=wÈOôÂp0´·Ëœ}± ±ƒ99€ÜÖˆèYT… ÅKˆ…3%ðPŽg¾“=f`Géáh*4­Îëõ­)yT¦"bxycñìµµºÓÊ‹!=%A0Ç v-ß]Õµ&ž©c¤èáH FœŽ$€«&`ûJ¨ºfcÚõ‰6^;®SSØÇZ+h•#SÙ"?$Æ “Io†y”#ˆýÍF-é$¬Ø‘6 Z‰õ52V‰¾iUÄB4†ûøIL€d–½eè>D1\²8Eˆý /|ä†$„›ã±5²9Ç”c ËõxXø²)üX9NwXW`fJÈ‹ÇmnâÙO$Ƀá9º“¦"‡ y¬†‹Õa¶éò”@îxì›,6%‡/0AˆNnÂcÁñ= Ø|1GÀ…¼ˆ…ϧ ¨`ù#|3à`U´+;!%¶J þíÍÇóÏçÏÿþþüöª„ÀºåJU[]ÌEÝlyu=%èv‘Å,¯ûîJ.ŸHæ œ”¡3u#ôÌc¡i›­—…Ëá³Û¼l_@ScjPUªKˆÈYlˆSxi†¡‰è&ó‘2—N¢Q¨Æ1V<‰]ÇV/ǽë×(¶ß‚€ ZCaN¶mÃ×ZàtÄ.Hà¦J“È»H·à°+RæÉCFÁÌž2üò©ÛoO$à“ bEQ—_:" ¿DõèÝ.wî/0ÝûV•"r¬9ÏÒ¿"¼õæ( J`ª»ÇŸaÔðýÜ Vҥƞúï\§—“kþeס·µ¨,Î)½âÆ·°ÍÕ(ÍüF+Š)Ë7J¼4ŽùŠRlkîRoŒ¥x­ƒêGæ××GîË'¾úÁfçkýø‰Cýcln­ÙaôF¼©ìq™Zhh¥¦p¾3šãúØmDêëÛË÷Gn³V%«Ká….Õfý9¶ÇÊÓ$Ž¢m/Ôha±ŒYÁ"@‘-Ǿ1,ó˜ µp™íÍF©LË¢@IJÖ%mÓÞïUPÌYê·áè lG“ ûdØOÁÌŽñ£ä ]r‰j´æ[3ËÖ‰'–&«nB ³~k=üøÌ–«ÈæT=h0@g<öhË”¤Y8]º’œ,eyWaÓê7𭿆6†„â,˜ =’\H†€î'”Œñ¸¡Ozü…½Äþ£œ4‡5¡%r[/´l¢¶œ÷ ºÿ…’ (È2jÚFQ†£©5'4Œ>Ä x¶ t8 ¢ì%†>ŒÇ”üç™s0f&£7áYϨa(ÍB޹äoâ’z½–ÁÑF¶©;2.›ûÉÈjš"ǰ™DV ƒp8J’“êB‡'%Æü@É¡Ô5?ŒÂJã0Û¥ˆË¥žB‰h Žç€™aH%JPaq‘ý‘HÃ\Älj€]XŽ]ƒ‰Ù†\srL½Žc<á]Õ7G=MqOìÅ›ˆ,Äã«CNuJ²4#ßo«WW›.*Bâ±ú¸°‰sÉEh OãÇiÛ•\P-àR85ô£b§f "²€“r¡UÈþüQÚô-,`ÁD˜¤)¢ƒ\•¤'QÜ£O™OT@ßd·\×íâ`/¡Ö|¾û •A캃AŠ2›'ùé˜Ëw5u‰…0œžù ácC*£êI6á3á\€†(4Vê!MŒ$Q œ#,£0MM¯Ä´¦&‚óÀ\— jqµWW„¦ÄDíÚ¨Q®:/ëïK—ø"AfÙf#¾ãséÆÊôÒòøŽ~oMxâá€w£çö‚ß½§Hf¦7Ø'?ƒÁØ&†V C'ªU†ËSø*xÅKÂê[¥ó‚‰úŒÈÎâ#;c1KE9l•8E á‚dI’¤0ôà¹Ä9RD†¡ÂØ0+áäеqHÀñLJs-…Y×1ÙÔ/õöÀƒÉ}D<þºñóðàæ–¢\½8ÕJzŒ\ÛæÒÊ+*KQ‰ê'ž…ìIу+b¸ÝÑ>ûÀßn÷–¯3Ì ¹T­!ÉÈç6“€DG§„ñU7 ‹“———"x&Ët„1H¶EaQýF¢†^Ô~´Q ~KŸÅ©WXæ„h3 k $ ýB[âÜNYpþž˜tÜ)Ъû¨Å¡n£Ý6-É¨î ‚&y©I™Ê7q˜iÄÄHäØuñÑAõ߆9Eëmè¾­XÄ:ôq¢xDOJÈýjzRÌã¬}k†UÎã]òàR!^ëëJluó!Ø€®+_ tÛ4ao“´Ã»ÜÃÚ°&ØÙœvõD ©•1R¢XkßÍø šÐÙ˜JeÍÅ@ ÌQR9.Ç©Gÿúçÿ°DáG©Â 2Pœ Šl:…-T sv—ŠxálÎââØâ(u- p¨ðP}rýà–ªR”¡X³´n5ü`å“ú—eä#›FsÏCÖb¦˜^ }6¹y{YäÝH3e†ªÙ^d»c ËŒDX”¼ÔÞ‰$5E &~ßvMÒé(á­Âa½²Pn¼1B„]å@Û£ÅV§¦¦¨´Ž* ³Š²B|A¨JÊtA!±]:² æ#˜ Jä§Ê¢% ºw©Pô##AD9å’ÒјK/ÆÌ·¡LYÌ<›ÚG<T‘·KÈãÄÔZ®|˜*V˜«te¤ÄÒðIÄŒ$·bNæpÚRdvɲo[,?GRf¦X™íLBK©]‚a³œ‡6Æ0³gY²%´´š¬M/=Ÿ¥ð0Õ:7J¹–ï³5ùÑ´d[ˆâ‚G9Ý î”¶å)§¬â¾¬ôéT.Qêžl¿sRŒãnè´JèSØJ-u™½Má ÝOVºì¤¬±ß4åÅxýN#eå¹+W¶ÛWôoóü}wиè] ºƒA·Ók6ʯ\¹œíUtét2ÂRc àxÖl®Àñ¬ßí­BlkUTÄ•mUQ[ñJågŠÔì”T´fg{µf§Jÿb_f=Î~w®ˆÓ"Ï“;271¾ ™Bõ¯þSLÿ_ÿüßQþî:r(ˆ+ÕÓg:êin/è)ìzzM—寨,É8´I‡Á°Ønhj½ˆrA ëÃ& 1£~ÌJ•Ÿ|å5õØ *ÖB–ʧÅÉP¢³Ïu¹*œü¤Ìs[_`¥^†RÄ…Ú"糓eP¬ÜxbélGµŠÅ×Òv ± ÷k‰QîœË­J£™ É …ey…¯Ë*>™´Ïz&óGªãÀ\™ô âÁUÙa'YôÉ¥ T(»P9ôÊqZvÑLma{ž©•KèË$>i²~áhJZÄ…óÛ7•ÚC”Ó¦>Üë/æB”d À1Әĥ„ÕQ lñܶÿnX÷#ûKrŸ‹…”mÒ®ÏÙ ÊáEbÉ΄±ly]™öûñYÃÎgÜNY[bô¬¨3F ÇRPØÏ]˜„Å–÷¨¿šÆ=ŽDˆûÒé_ÌÈÙ)¬6TlÀÔ} É:k2¹Õ¶f–ߢšËp[z•£rh¼ü…ŬäÖѬK2Âü*„Þ¸›,†B°ÔÈoèâ„Y¶ê“¤üË’gäˆÜîT®.V…{ bQÅKÏ-”¡ÄÁµ%褥œ:éQˆ¸a’ɃD áeßZÂÃòè’K"⊞ v­ù£åøÑGYƒ*I J)çŸEAØ¢âdhÅÞk¶+«æßήƕމ]¬+s5ÿÜÅü›܈ýýe¯ßh¿ï5.®®»Ýf«ñþÐÅüÛ%)tÅ@µþpÈY’P—Zµy@biäÔq}rØGÜ—ËÄ™Á«q !_mÓJõû9®EZ?¨šÉjéDN³•%ŠLiÝM=k¦Oò5Çí¹~´?Ë:‹üô%þÀMd©{®à‡'"Þ‰ãNA*Á×0Ɖð¹è/¬wèÐT$Ï׸"f=gâu¿$»"ÙaäC¬XZP˽`¾¹ô­Eò$M¥Í>›7Ó–f˜sKJÝ ö-ĺ«UÔPe%LqBDlŸâp"!»r9XøÎõí]I$¹“b—êg£hÍz·5$ S­Æ²±¡Sov;í”,½íÖ†FoÐÞH¶Å±ßJ¹;é}X²n±ŒV½Õc+“J[õ^·—¶¸~^JÛ¸ð¿××½NçüââªÛ½¼>ou¯®ësgrHJÛ)‰ÒvW)­,çŸ :)؈b£ÃµG£ÌËígv{uè¦ÀAvÊRXg"–öÛ\«Þn÷ZU¸½²Z@m[½U×h¦×{ÍÜî¢'þmvÚÍë~óòº×:¿¾îœÀuK"p½‡Á¾X*WòmoöKè’!Ÿš„í‹»  Õ”ºpñ$Þiã ý¸=Pý_–ëÐÉÐ[§…… jzj×Âfž*5Êîzª0è¢Ц#.“oßœþD_ŠA}‚vͱõȦ0öœzæ„¢NÍǨÊ(©0hç„eùXõ—$ÉbÞ˜üýÍÍ7E`*R¹©ìœ3ƒBèÛE¶³¾¹ùi÷ÉŠ«“=åXâsnu7¹oŠM¿-¦\Îd{›æ~ó¡Ðd{Ü*—ÚñG~ó 뛓⨳öæ7ï M¿-&> Ñ=&æ]’îÖK\Îò.­›–”—³í‚K¿Y­f–Å×kfƒfUpétÒÖ6ȯ˜± ¬qõ¾uÙ9¥ìrÐl6¯.ï-·ôJ’[úë3d8äÌ]â—ÕÉ,kÌKYZöÅíf:·Þ¹®Í!VÚ“+Ž.ˆÞÄÌ'6Y˜žoF-M—Å¡vú.ôÍ¿Ç ý»å”¶NÍÅe*@Þ<ì¹G3 ТÑd|X$…ñ×Gƒuv6õXšr’=–Ù•£QX3®ƒ>6¹Î\ûSùêËðTÈ)åäè4E§(n$ƒ¡‡@8D„žÒ%–6Éß9KI‹;Ê¢D Çà,éàèVc¸Î½nŠB¹Ý‰ÓtûÅ8é §•««t¿ß_17å@«äºr[ƒk…Ö4Ï­A¯}=¸jšõÌÊoú%ñ›³í.î8E¦ó˜nZK1ãå0œëȳñ0ua|*O#eáÙF<.[üUz"‹)'}<®ãYÝ[äò¦Ó ª+-µÇÅ:âò Ñx)¼cÈ•Š†¦Òçn¸J„L&&ËR>»d—¤°ÎOÍNo ËÌÈÊØP…Ë€ßp˜½+×½…ôSH\þÈÊF½Ù,{o[õ^»ßY%[ê6Ȱ[ƒpÛ»ø×s¹8ÚÍfŠÌÜlŸþV} mÎ¥ 4ºiNš^Ëé6òÛ0»L›±½ýÕû^£õ¾Ñ¹•à}ûÐîð³’hó`•6‹SêËS*ZÚŽ@޲‘‘¤âí››$ç`n¹>凼ö¦§î”èËhJ\’hŠLƒD& ¶Ò5ê‡ÕœD}¡¸GŽˆ¢-Ñå¡­;_8FqÙ-ëbŸtFk¾Ž»Õ/ Ò&…{ÎeO*4^MÉmDt }+T·;¶daç_|#äÐ #±Å'Ïâ>%fÿè:µµgºãˆÄÿ÷OcÞ8QIXÅë’#È–›>V<3ÖÇÍW)´PW”Í'£g(Å>Nù{#Ûå"ªí“A±Ü3Å– ŠXeE[ªH¡Ñ8ÒȽŒûuí5–Èž]£¥ré ßÄšeqüÕ Y‚‚£o”½Ph“í ]Xý,:«1åp–Hì¦.±# ××[ÔàTÔ(èx¥glD‘k Þl,UîR ãcŽ®R™Õã.ç€K†Añ=²äD¾\ÁG<ª{&EõØ ˜¥LQAI¥M)>†´®Ît'¤¸Ý™{/šÕ²ºlù<R)Ä0ØY6 s¨„U2Ø—Ò£¹BB2ÜWÁ¦’²-6‹g«ÒSvÕ7N²!á°{Öë­´šibHéªÙèlÓ|· ‡ƒÕåõ2/¯ÛNf ©¾âh}A?--ƒü¬ß»©âcÆ=¬­®rí3ÄfFkÊ›ÙÌíQoøg³9¸\5ÚAïª ÿ=\”$®Pεâ¨ã&H!ÅOïÃä{™"èå£Jî­¶ÓŽg5DÞˆÝv#KáŠ|#¹} Øö½§¢ù•±"<‚’5ÓxQBªa*¼k7Ž‘qÇ¢PÌ3¢n-$ߘ5ƒUñzV÷A°d+ðáº3 ¦ëJT)ŒDð2Šª¹r<¤ä+Xo-‘Œ¢tê®Pr•eŽ8޵K5j1º… Ãªy'B$F"”¹0wÄ'ùü;’Ω¬”$Ïô` j ¼Ê ão¬²’Œ1£0ÙO²ÊF'ÎüUXeZÔQ3C†ªˆW*Æ+S²µ³8V¯LXÁ¯4ÛÝN /aö°´ÂvfÙ¥$èJ˜eV‰ i kp€oêú²ñÊ®ÈëÎÈ+;ùyeKòÊÎu¯}ù¾Ù¼hƒBsyvqh^Ùl”Å,—IûZfIùÀwØ~¬d×úe²ÉbßsŸ“ ‹P©¦iiJíÅ}såäÄmJ 6oYh°Ü?HÀ'¨ŠFÌ.¨^pJ»,BŒ>FJ¶ úɦç“l­ŒícÖXæižÄ~ÇêÄ•f ˜Ö6À$“Ù¨(p`#¨ž–³VEr†p$­}1(Ò`ÝO¸WaåíÔôÿÁé #b'SvZ¤ïS±ÛuÉð¤+Ù~œ‹ê}€åQÃ8êõ*’vdô*:¯©@Ôß >3†ò5eŸªUÆr2쮣„ ÎHJeDZ¬œ@5ê³zGºZ@a¼œê÷–ë½I´ë™èža#T$2RaÕ¸D5Ž”ünš8Œg~Ò+‡ŸÎðˆ Α}Í:%ÙT’FÐU8×9–‹i¦=® S•Yioi9Â9’}ß+¤Œ‚%YmeDµ “²bÄT÷î±?æã'ì×Òÿ–Ýß/´©kGú/ÏVø§¹Žâ½¼ÇkPJcy)`%$«Òá­T w:«›‰¶ÂT¯‚…û P©lãDýž v}ÎmªãJ±‡¼ûŽ©|“ÀxÜ=Ãr,é |”îÓWŠüGf;rî¡ç Ÿí–Ü:½2ÍÓw£šX*Pé5æÜDÙÛW¡¯uËô7¬ò³s¬†ËÒ”#P¡™:tâŸè‚ñkíE2Ê^y$ùý5ÎíÜf-·Ä†®Â7Õ1¢ë„sBéYΠA)FrøY šv‰PyÍ*‰Û\éȆï¥3Iԇ׈†=çJ?+3ÁKbQW†P»²¼1ÑÀ4‘è ©Å–-ÐqdRKªÕ<?2vŒ°õCœDAåödQ£ò8×Û•€žâGƒcáIÇ6ÿwéè+‚;®†¶3Š5ô)IÛYk$e )úæL"6òeë_aÌH uûA_ø¢“ºñÄzDI’8L2®PãQI&îu–vÕpGöAM›÷T\QN—Ú "jh‘*Eàr)³V2 ý½D4UXk%c°þ…JQ•²8Pª02í%Ô*%š4Kbez0iwÉÄÔ­7Z<¯õFÂV¿YÜ¡–mÙr2¥_ ú©·†Â¶êg¥„¦×3ÉhÉÍVÏ$^d6; ¯+³0wtmóJúÌÎÞ·Ï[×g×ç—ÞûËóvóàvÀfYvÀe›É»·Ú¹¬šˆXâruKÑ—¥i%¿Ž>$Ñ{k¹‡(XÏ5xeÁ ¥-';5PÐc£ƒ(¸¸n:îVõrÅpX‘}ªÛ§–ëJ*ö©¥õÇÑ ©Fþ3è/CÐ÷V~ÄÇ.ªe‡!_æ†~d\ù JòéŒÙBsÒè vÊJ) —:¬ˆÃQš(’Á2f$較 †Œ–4GŠïG•Sq¼ÄRû+X e#žUp j}ÅÇR‘ž¬-CòÚŠ :ˆÝT²Žšç-™7yŲ8œ|øêˆ„ãÒ;Ô«hq¢¹#÷D›šºaŽ€DÂèêUw{qs“>´ƒÂšq"ŠJ­ì_ÿü”î1ØŸþjz.}®ƒz-/ƒzMáx_ñÂë™e¶)’6áê#]e_q¬üª™ŒRçSWT‡A Gb¬ƒàŠ¡ñaÀ›%G®ízË‘œ©ÑIBV $ H ——¤ >úóûb®ÃñödS \Wé÷ÆgËÁ2ƆÍQ5J‰†l2ÀÁY-ó#Šc˹¢Í+~1Q³J|L €kÀb±Xoµ,$ˆ[Q{œ¸ZST¢ðmÕö„ ̓%¹ï#û` Þkò°T-\žy&Š~#â2%ñ˜T› c=¤mû1Éj­'Q¥à C`+ŒAºK̦¬¢s_ÃvfA,j6ZŠ;0%/ h¬É@v®)¶ƒƒÖ¦B '43u¤¥”Pdq$Ø4©¥~o,µQãª*»|€¡5ßz,ˆN½Mµ\mаå‚ÅÁ¥•sEñâÅ ÙF ~ÿÄ é2$: ’щŸ"+#ç‚`s œ’v)7N¦²å¢€ê(.cÈõ?`ž(™ÉfKD÷â"áEH%ФîQi±nr‡T[¶<ïQ÷³•§4ÙÚKJÅb;Ëqml>g¥zåd…²€‚;a(IThE¹ô’}uÝ¥9hïG<äâ- ÿzhH™§e0 …k»ñÈ[ÝmóßÙsš=E$S'¹È žÓh]Y=§­Üµ/Z—güGïª=h\^¼¿\6û‹æõåÁ=§e5‰[ñæ¡çÔÑÌG.ö€M21Ïû=fºQÏns¢‹Ÿª¸)š1•éTueÔ†ÓZv£^Õ01@1#¬`Áá>r&ÔY5l$ ø¬Œpvdà2Œ¨04’^ü®lŠŸNi¥õ /Øù9·ab€E®Jwj°¢R‡åcÇ&êýè@Ʊ>r„REý(@µ‚y4{‚C‹ŠÕŠGÔš¹x\С‹n‹áíŒ/RÄ'÷mý¤;¦]‚Aº´V»Nrš¢½,æÁFá\–ÄCî(THµ.Ø?¸Þ–ÄVÙ…·BΛµ½O’žâ^*ÓM WjmíÐÚ¨Ÿu¶¦ÇïÆts”VB~t–®ÔÚš“ óç•0ÝeÙ˜îYÖp¥h]™™nþ–´Kþ£{uvyyÕìtÚóó‹îÕ ‚–´9™nY ˜V,%¢à&²Vr¤*?ÞJd' Ô©´nS9½c…Œ»E"ªµÈ{ÝÁxoßÌóî 6BYálNm¥˜“Ç=\+d| ˆæKÅY–öÚ1Ð3ÉÏ"t"Ê”-D Uµ–qÔ² ¤”¹é鱑v R’Ͼ".n@A6 ÖùX¯fQ¢ëæo(ùáÉ_„‚èyœ>¡NcotÝ«Ô"$ʱƄG[÷}nVQºYÀu¢ö¸ÜgMÞrƒÕ8@±Ñ'O;ˆ‚ãù¤rB ”ΰ‹0'ÐEæü%_HúXs[ õ2Täa9Q%ìmÿ¾ø°ÿ[ˆûŸ²È´„HÜâkÀ›¸°ôu›!%œJ’‘q­˜~Ƀs>ÖGb¦,Sî¡dFŒ4¦¯‘¿‘•!HÙƒ4ÎUhi,kÖ±©Ñ¢Fy©m•W\&ž‰S¢>ש­œ4qâYS#üé¡JbΈóX‘›wÓÓy‡XAŽpWfš"Ìgh$ãpDzŸQJ¼I0XEyÎ1Ô}iÕ)=…^§é²¶J¦rÂq h#TÅcH©ƒtöåú ÷[¼½ÐH´YxPëà‘/¦9ç"3˜gËYË‘¡Z)¨±§UG†~¢°äZž ª¤·VFãFÓjO²Q;ÞUõ}ÑÎ,ù9ËWè㒃nœ}TpF´D¬™èÆÄ” šQûåmbÝ‹£*»/'5~¼C©HÑN¼Û.—ª¡Èˆ7'"ÚT"¢(†GÅÔ‰º3²²‚j&Ï8Ý1R8¥^3!Â`åSÙy9%n6çñ¥qn¼8l¹ˆ#%m§#[‰4Ú`,õkCíO‹ª‡ÈÏÚE$Ë"`ׯáá–‹àÜ;€´Li\¨P¡ ø”¤l};=¥`D\¼„¬©Î™}½dN:í¤ˆû0ÔÞÆKÇs%J™šŒ“O;ŒSZ¡lÑ @OM ´½6ë“ú‰æ"ÍáÿAHL¤TŽÇ°üKc”ák3@!“Ñ-P=#BŸ,äñ[· kj Q:Ìb"Þ†IÅÇ„MEù.-mÝg˜¨ßEÌâïð„6~…&#×ÉÑž+ŸIL‡‘au"òÂõ¶²&u.åíÕG ´;$<6ȶRª3î^û”Ü Àl`$•,›"«¡ç”žï†p>k†îOµ× Ž(ࣄ_F²åÇ Kʅ膼e;Ù÷©¤þ'X©§ÂZ~²4Šôæ¢0fzjf>ª(æÄ¢ 51¦Z^)þô}W¨K­~\†¸¾÷ðCËaZÆÞA«‰è¾âñ7lŽY%NäOOðè cg ÓØTBÐŒ;fQT¡ÀŠRL˜”DÏ-G—Ü“uIMäsCôå G6¹JÏ@š¢e U÷¬³Åœ‚h %D—YJ9l,g"ñ,aӨĔgÇ4¦„Ü–øâ(´‘û¯¢q –#*RÀ(¶ðU(¦½Ç¨­æËiœÑš8QîaÅÃ%¢?G —EÀ©Ùˆ;[òM`ãôk¸z¤erì†NTô >‰y=2ÙY LÞà^JQD_ßü)åxy}¬p*ÜYmŸëhä¾Ãô“ÛÛ»Ôê”0{²xdŸ>¾qV­Ô:˜eìfk{·(éÐGƒ¾×½,gŠ@ðØeâ›h³íÇŠj<Éßj×ä-ÂòH'Ú-5T>¡C~"81`Þ/–ùÀ¥L{¾Ü(F( Qu?<Ï÷–µ ¬Àdÿ‚©D)pl<M&¥úÑ÷w¦Ú/ŽëøÛ‰ªî|-YT†–ÍîÕ»vW€6ñv¦î÷7¼5Øtû’k#bÍ‘lñ8­ôxœ 8À¡BMÝL?ï`ܨâ„3CÈÍf+Uu|©ìÊ{.ô¼á{—&*fÈ aÜý³¤ÈS?dÁ"«³éW+â¹TK1ÈT6©rüÙ‰–”¦ø„ûæÈÅJ^ò*Ó…3šÂ¬­¯X€m© œiYÕÖSw:9Úºõ°ºvJ[·Vg[àN·>蔸ÓK Üiå >ê4V»uëÝ´€ªnî(›Ö¹h½ù¾Û8otzW À÷ZgƒÃ‡¶vÊŠ²é¦DÙˆsŒ tN¡{ˆ`tàVOV¶Èš[¤1…ûŸm £Xú+F¢dêþâ­t;Zνû¥Rá[`ÃýTËGìë„K&7žÜ½V@L~£tÝ›„”þN¾’N¤Ø ¡‚½ô0Ä_à"TÑrœ%Â)0¬Tqñ9|ë°š^¿þR÷õ{ímH¿†ø+1‘íàÝ"#´z­W#ÂU¸Ïë¥C/°‡è¡Åg?ß}xOïGˆÛ‚ÿg¯ÞE“Ûˆ6­Þ«wJÄmÛ`º6ç»êÚZæs[–(.4•Ä9ß:šÜUôšDpÕÈô,Û€ÆzØýÐ5D“d.h<änæÔã†h†:“{ò¨dXª2üÄt0bãB²ÔêÎÏ'%-{$K;t^4²×Ù4"n½M¢P Ù¶`!jÛÎæ 58hhÃ*½%*÷+¡+)~ ­ÑªŽÇyœà£xÒ«*%(´â#lõ)V€°ŽY¬Õz™ß¡esšÏÉšÑ*L[Ùç‘H”KÚBARñE›uô|´ÕÖCPSÎåœü8cðjDY,¢­šaÎA}‘îîëàSR¾ ¼Cé|ØRpÔÊá·fó ^ÞPà 8è¿Õn"OÝ%tQÉ>f¤û0Zâ¬Ú©bêoT‡µ—tG˜IË.¹±$š0Öc“=J#: ž±uQQ£:öóÑâ53×íBáòR x:|D¸ÐgLY†ˆè¥LÝFAÔz¡¾.ÛœŒÿúçÿü×Ç›ÛÛ›¿ÿï‚a"ìb,Ó¥¬;dÌeO-—‘B{'ÄMɧ°Ã–èUXUÅ#ú-Û@ð¶&ùIqâF8—çC”žÜØ{í¬¬6îf(éñFYès§-[ˆV?&Zgk|-XÊSa¨:•PÓŰbìô~o&XWµ´ &ÛM-*¼ŠÉ£€"JVÁ`(³U e$€#°Ë8ÉÔÝ ç=d,`~ˆØ3ã.þŒ(+b§Ð&p‚ýM—Ü•\ FmO1³»á8®)BÐDµ?¬… Ï{zìꈫâÞ›hªõÓÂØDéÎ^Ž'–Xù9™OÚ‰è"ªÍAç¥i'ˆ‚/Ek›Ô ò2ƒÇã˜*^ÑÜõ9V–›§ðô¦9§ü¥¸ïK‚ !ûej"C)c‡’0FêÕÿTÅÚR–u¬·ûíƒNm‡däVŽd×îRÃîþ ¹’ìz6HkHÞÚÚ€ Sï•”içh Ð«÷ûi=T[ýmóïÕ»íf =TÓ3’›¥vPˆW™!%9ZXæ”ä³Üu@΄³¤ßvÕht®g­îÕû³÷w–tËr–ôÒS’cöi—Lyˆ(oùmŠÓß¹òi`;{)¤fÜvYtšî,7‘Øï¥”jm-%Ô¯·ÎzÕÐÀ|¥ºi¥œÚí4(ÅYe4°ìZH²kx(–•¶›¹iàEä0n_v.®.¯/šWç­ÁE÷à4°W ì§t“Îjï9â÷””Loâ:.([¬ü`eŸ«èÒ]ÊçT:@}£m-¶ÂÀÔj‰Þq…[þý+ý.â8m2T4Úθ~¦Fx2Ù_ívljD”ÀJa«´›§T›êŽÁvFOäºF%¹¢r\œá=r=¬~írH}&+äW¡Æmc%•ѳ朌›!^0‹¡"¥Õ»–$ù Hc|ö8³iïðG«Ùê´­nç¬ÝkvzN[b–ú‰ÑÑÂwjh”Û4{NÙåîÍÿúçÿËE7¿Iî"Ö¡UÈTê9ü€Y‘ëÆ ç¥Féçñêª[ ­ªªåPÙŒ‡Æ8·ƒJ7ŠÆú) Ö ¶qYñ…‚^ Ðs¤í&1:Ú¦^³\Ña*ÊðÐÉæhE."¨ŠgÎMäÐökÄcŸ¤@fëƥÈ7¹z¶3&&Bhú£úü…ø3×¥¯p À½VâÛÂN’VÒW…[¶ñ¸Ob¼…“ÁÊäW/ºì^JÜáóò§ºçÞbX¼°Î»hµ2æR+¥%‡Ú«ÜĤ™ìI~}ršÊ_+½EÂa;Qló·—Ø‰"®šõ|:Q Gùï¸EoÐíZ{ 4 »+i9q}I,*“©¯*üŒúQ!„îMüKûåâ2õ;T×~¥ø®”S'V@.:_Æf_ÖÕ ¹”Œø3Ô¦áŒÆüÀƒgz=]*“ÍÃb}”™èÃ!ÊëX ôùnØg®F" Û SGWJ{' ŸˆZs2RÀ£Ò™J)BXç.èC[jed'‰©iåÜȆ«4ŒØâp•Íxk¬Ž‰^oàÈó¹ë¾˜i²œÞk«nÖO”âƒr("n1úÜÀ¢–3©@-_žêÔ"Øœ¹ÞâÍ>°hÃV_=âêjÇ^ƒÓùÕC³M‡ÎS2†I/dáž%ƒJk¦hލ½b _†#Só« ‹:•ºZa˜;-Šú@qLaÕfY*Û3Dë“cÍI’ž¶Æ±&to óZT!Øçpg²Äa¸¡ød£šØ²óeœ8†}ˆXÒä–JHqDª‘Š´Dp™3ͺòËøh”/ãÎ÷B2Ÿ²øËÝÑ!»C³zÁöl/Ûïn>¶W©–ÞYè`:”]|-ä3–Ìz`Í–Ež´S¹áDf:uMäæDåôðÈ-%êÄ[VJ/DU?©¦÷ûPìÙÑåÄ–kñþ w¹y°°¤qX ‚žúýã•È·aÉÖÃsÞÉ’ÒÎ%&Y³™i`r$ZÀïû 1T”Œ)a {FÂo­ >I²hfð#š§ñ˜¡[Ô0¨,Ph@ȱ%ék|APŽ{-üôgÄ…ßB+xÆ{÷ -SÚ«)ö²ö0&zµBòˆ¡a3gJ'Ã|*ŒeQtÍëO·¸¥o®¿Õ>˜pB½í¼s‚×>˜Ýþ–“ÈðËóo¿©kç´ãÉô,ù=ëAçìK”x-¦÷Ãõ$©GžZ‹gŽq¬$ŽªÙBŸ“}4%=¬kϳ¾÷àŒVXy¸iÇDpjb…ǧ¿/Aj`°JK:‡âO`«JˆP‰Jâ+c0”œËÕv£–•âÊÎq|K&ÚbÇ6¬¸ã1ËÌÀqêhôâ…pÓê‰4Ÿ›:Ù/禗©…ÜÁÎÙæÊ`Ó ía]âI“[Z@n]U96Ë„ÑsüѸóÇj å<‘œŒ~דÆÇXžå<¹ hIzëUšaoã²}…uc)xô©_HŽVöô“Ýý¨zÚÉfºC9‹Ô!táú#÷ˆu½¤ÂuŠasj‹_dZ‹X?nÜÑ’•lI¼[?J=-S––0<¨ËψÀâJ03òBg™¬©ÑpL{,#%°å Ãñ‰'rÔzYAk݆VP²•.a…Ïò—9©~[„ìj©mº¼%pÖ4,Ü/lIS^à,~- œ•}èe6ŸÂwÈÉ˅ði®¸'Ãk+Ä‹0°lìmEJ—°ï~ˆBÁio¦zè£)%²Y¾îûæ «WBÕâ|l€„'Mu.`'žÎ-Ú6s.6û¦Ž€U‹5¤õ­:F¹H` RŽ*—Ø©ý¨´Ä[8_A´Á:R%k‰¾)K²\Æcmi<‘gŒ%ç(B_Œ7‚8eÉèAÉ®÷ÅçÐ]_Ð'º+Ò–DÎHeÕMüÕ’Õ¤ÂvÂMRl"Ï£ pqX4bÃŒ´Òp²y ÎEƒˆè©’,¹}‡{ÌÑÓŒƒRðâ©G5ÍÄÜo¹£ÝmK} DY7›û¤¨–pôÓ{$±¡ûÕK.Ç­«¦YáÜ›‡Þ›½’ Ïém¢†š²à33˜º>#à 8ž: 4`Žœ ÑM·a¯|ámÃÕ?çSñÙÄZ÷‰cq΋>ºƒq®è‚lÆHÃÞZÞQP¡׋b=,,ªcM,Ô󗵕s?BÀ‰$¾Â _ ‹ñ”üëCD¡ñŒ‘ä",["b˜ù %u»HE 'Ç}Û´ávH´¨gH$¦B؇p<6É]¯a†º§}ÂmJHeÓ/°5Ë S -JötñÜ+6RMY ˆyÎíÎ%ïôÈ[%nô)|o‘o·ñ…]¶[ꨃx n:Á®ä]Ÿã7ýäN¯;³i»®M<7œ¯KíØ \óˆ:."ùp¾Éè#Ɖ\V9Ë=ÜŸzƒÃîí%5¯94ñ†¿GºgÐþnœr§õê]"Ë;Š·ÓUâ@ÿÌÇöùžÚ«G¸g”¼³†Ind&NÚËn9–GV^¸C8D(úsâ#_˜°ƒóP `8,'éɲ1qŒï:µv“â‚CDÒ\蘅%•$¤'Qeg…wk7«ÂôM3ä€3xð)w†bj”tÎ)wÆ"GŒ!šwSÿ$¡1k¿&Ÿ^i°$ÒJ¹ NâcüT´P›Q—ÀëŠX®&Ô'JûB‰bÑ I£Ë;ò|Ñÿ 1pü2®Y\žÄ¢ÛØ!jˈ¹ Õ'gˆú£|û ]þã~ñF_ \ ›¯@Q" tÝõùŸ?‚ý<Jè%ð é Ú zK`¿DŸü5Ç••Å^/0«q@&jgêhUYÆæÙ¦ã‡žpÌÆ¦;i±ü 8¦Wx²(•tð©©ù¨‹zÁ¸^ö8Mj'=á}~Ùãmsºbo–-¿ïi‹uÖìÙé…Ò÷Ëvo›Ó{ÊzšÛ-‚„p/;¼¾Èà(xÒ$ÛÅù¿ìïzÿñíÅÍÍÞ_šÿËþn Ðç~6Ÿô!þlÆgxmEJÅ‹”^‡­U²«¹h@Npw,"¥}ë«T#Ë®/˜Â 6¥&îØw.âT¹Ø´uàÚOÎ’=?ö­q»Z0†åAkÍ‹–4|Ö ¬Àóc\$̨ėxH (0s)6ʸ­¹gÖÆ–M0nJ{x‹¬ÕJr7–Ë^h—2ós½íxÔ`€èCS÷b_áƒÒ˜KV^qÌ3úÈu|XcˆQ|{³ÚfÂm’]<“b¼pTiÓ ge” D!Ê‚ÁÛŠ"Î]b/0ÏO]‰8?‘o©ÂöùJ*n]CM¦Q³%zgxt ùÄ]ÂKÄXB«!Åa¬të€ZEGƒV6‚?z¼=àîéœØ¶ßýƒÆÇéÙìäNàÎFƒ–öŒ1“+ßíÙä¯-«Gz( DÚU5–ŠAÜ'ÅvšÃÉæ°Cã¡(+x˜ój—‹fjB%*òɯîéåÔ·ÃåÆã5w‘«U +È8 ˆ¶Ââ³é[_ÔÔn¹È z(* 9‡£ÚEU?;2*ÑKQû¤):5Ùäœj­qrKá…´Åœ¦®-‹±=XVî hZØÕçàÒú2ÏabOÂõŽz:—aĆ_0²uíµU7ë\‡ÇM'.êð#ÏNH› ÷æˆ"ŽÅ3þ™Œõ×(PeÍF%ÒÚ^rnEWÕ¡°BÔ<úxûž:%Ã?ðÚŒ‹0p r×5ªÌž¨Ñ‰xÉÁX²rèÌò}Y»çÐçý)`SÓ×ÊE§'ƒM?9fdúV“•Zg®ÔÙ¹lÈ*[6¼·Ì|K$ÊÄ=e¨­¬<ÌÀ3úÎòCøµã Á<T&r àó’8_eŒ”Ï‘Z8Ä#ÌeÅe²40élŒ59*Eîvê>Ô.¸ß Š7JYÞ’÷FKFk¦î/´™ :3jwCQ˜\È<EÒźUÔw¨þF;“;hSô=9ñL]ôä¡ô¡ïڀë‰r±J…Òn—fH£ô9«Jô­™>q¬ Äzð¬½Ù¦3A}k¬¼]×âd¬±?¢zú>†"xs9qc@Å©•²7ÜG»¸ûüKœzúdÂ6X.] ã¤+˜<—q@­–â&L÷–¢a[}Ú pœÒÿ?{ïºÝ6’­ ¾ ÚU}–tR¢Hêîšt,ÙNuÙi·¥´ódM-Iƒ uñôôªG˜¿³VÏßy°z’Ù—ˆ@€IH´ÓyêdŠ·@\vìûþ6ö*K‹½ ðîãF&"Ô­&̧î ÚI›¤ê÷;ök_ÜφNÔbͪñ¶[uvÇ!·‹§2–ŒNµa,.§çyqä›ÞÔ²¡ä/Ñm}lMîðZlM!#[S,.Žæp¹Ç6x×P¿+¦×DšdˆÕ,XÓC®£Ü/ü8ôöâÎ £×Kpµ¸ ©UtÛ}»÷U¿ Üü’ ‘òn¦˜\F¹“ —Ju,$>ñ8)[¾BM¥æU]µ4X¬§é…1i ñ¤ÓñÂÀûÌŠ”$€&èȰ-ÆÃ(닜¿á“9'¸‘“ñhèÔÔP²/ùØFî=Þ¦Ù»dˆì¡”©ÆS4„º€š狱< m½;ïÅ@ÜÕ}=Nš¥B$üòÂÖëX«4›;“ÖL–~ MAËÓ0dL4hH¼{{uùkÉtì퉴E>/I“#!ò»ï%&qÀ¢÷S€æ-ßqµ#á+q#X&­þ5D–ʦÛ\²\| KySíȲàß’ZÉ=wÅ(Sl6™tkã§S–O Ì4ÅþNÆF²Õ”ë…ß¼Bgò…ƶנåßÝŸ©§~©Ùü\îï˜v¸ùTæCî{ž÷‰f_~ëF<ü¥ví1ö–XíÖ¹›ŠË(Ý^mÙºWH7¡5zn*6r7É~¸âÇ&`œÃ‚#¤³ˆ&#£ž3vÂI!™ë~‘ìŽâQ}~gûî°»è<ßî?îJ§Ç>C‰Þ4ç§|™•¶ý@Ïc8ûñOÜ?¯‘ŠÂÁMƒHì†0“ðÇ']u,‰è P¬'#tž¶ÛÛtz.VΧpˆ<×6;GTÝ%ûM„«ÚOºR„ñÇAŒ_¼E ßï¹Þgú[7V'Á;1lM"Ül›KAÌhìe¿ép¢š?º»sH®ÛŒû?§"“Y¯òNe$d ·'ADͼ‹m=± zŽ·¸!ÖKØ0þk[«r[ÓyøÖòix¤Å'ζzÖu\|’:µT® %wáâÞçüç9n¢Þ•yMH;£ØG@’†ìÔ¦X7†q‹iïÉX/d)ßõòa°¸ÞCŸ¢¢iJææï»Š:QÐòm•› ù75W‡Cw¶DkÐÚqïƒ)0öÂØûŒ»bŒÁ%ÈÛS}Äxi &_à—óz0Üä9À} }½u)¢yÃ~G÷zóD…»uS*›pþ÷ÇÌ )ø9Ò2ÒÙ U¨o\eñØøM,-ÐIŒ‚LŸ,Uuk.‘§à8[½‰$j›ÅŽ ÎªN¬?ØÞdØ6M‹Ë䥴®Õ‡¶<·Îõ}¡¥“A$KY) W\‰!Ò8c–à\ô‘Ê Á¯Ó1L×¢AU¦7‰|¬è¨A/Ù’íéÚ»±–öuÜÞèÎâöö¦A¡?"Á?ꂪW[¾Þu“íXapÖÄI!Âà³P]37™Öz.×°ð8’*yųŒ§¿”û¹ùñWQW‹ûíÒÇÙ$‹U›Úš)£d# '•ü!‹5¦q"€6òfÚ-çÊ|©ã,JUó1EÓ7x±œcE쯫¢ÖVM£ìwЏÓ)q¾ÑNuÛ–j9ìØª½û–L0*‘´Ì "+@’3¹³E>†x–9MÔ¥1CóTnÄv Ðs$¤­còf¦1(å2å¸:©ìwN#øÒyŽœZ4 ¬Ew í;’ `e÷(Ó;ƒØ`™¨Œ1S |É=|¹Iî:?ÿòúµV‚d2"ðŒþrZŽ/W¡«0u^]ÿå#²D bpJ¼,ÙÈÚ‹ÌbS>ZíSsl9”›í3r†¿ƒ©Ë·\ôìÌ.yæî4´vG]d|—°Ð¨¢3¡°–qWVsžžYO€µŒ€¼o–Ï7äk¿vó]å’ÃàrªÕ»‹hRI½œÒ÷9› í«ï.— J¿V$na¶£²ïça ¿ÿÔEž!÷pámýýïùœK¾rø*ž”G¥éËP:žê+5ŒôñçYwý•fóZοƒŽ"%­Ñ©C– PéìtáE~¹gž?}q¸ž.A(ÜÚX6!€»1𲩵±LD£dÆŸµ±žËŠöH`ZŽp¤¹»½S(ªÉ+×pÙý«5p=¤Òž“Ô%K™EÈNÀ(ð'(a3|¬O†âÞ ™@°cfü<ŒS~‚’ ½1Ù‘4þŒRž˜¯$á—ò*TøOMrJÅ È%,gü¨˜Û* ¯`/‹¡PåÆÀ¶¥K¶Þ;Oe2@܉ªQ“÷¾p¼DñEÇ,âÌf(ÔDi|…(ŽÃêó=ýaêHPË‘»/kÒ¨qåŒÀ0|ð;÷¹sAþ‰*vûŒõ:m‡]é8mŠ8¸ìÇ…™U-œ¶=ñK_»ÔY@Ko›ÿʃ[Y3Ùà=—lΑiÈD7 02Wí)Þ©Ü W×S%´:*Ƚ¸¸¼~û¾Ž<(† x3g Ž€ÓûÛJ77(å#BÒü–=Ý&9^Fð¬( Ü)RïúÃRäÙ¬sèrZºyNK£©?(V—fçàɳkø^áÜìs„9GGÖB2?Õþt2FÇS¦² rÿ·Ìb{?útÏ—¾ãq]enï;7‚SçkU›³•‚3½;ð—3õVŸÀi~|‚ߢ?”óògò#Ò'ϺÇr[ Ã>«â_²[u±ß Ð¾Žš°¿Ë)ˆo §ketªˆ:¸¿íÈ*Ò€óÜ­;?wæH\ÚkòêS w¶ ;âƒü<l‘‰ñ6&òÆ·--‘ZÐÔi"è´[mãü”¡ GØ…¹J€¶ö²ØäÇH² "ôKÈÚŠ¾‹¬ÞÊœÀªDn vÈÉ ôp“¢#Åk*9RìnÄRßN²ykõEõµþ2Þø•¾œLW¸06Pªã`=j ³ª$8´ÜT½„X Î}•9ô”¬sQçÕ$bš*/ &a\S )¡` #v\fzJ¸Ÿ˜7³jÉPðlåsܨ—Aö l'Ðr侮Í(ð18#5Ü&sÁà^¡qaŸÚ¬x7J@7ÀFÖvòK ºÆ òó9®`8–L»­Kކ}ÕÉ °VFéyü=˜ò­žô¯)œ"Œ¶s^œ(Zß9Ë´Ï`¥`©\á®Ì“ÿ9¥á¡"7D)|Ó<·~SVó"ò×] ÚF¬â—Èç­ÑÃÔôÇð’XÄXÇžÖp0³øM;vùøBŒ7Y³¶íp-²ÚŠˆ*#(^aIªùP¡4çýïã‰fÃf”Êû,Ïö>.g 'Q:Û¢\ýî´]ý¦ýwÞc1U‘˜¥ÞÍ^‰b9 9)vŠÛÃz‚)¤¦Aœ¤ÄŸ®â1j# ã§ V)"œß.Õrγ$üʼ9t`³T¿`¸®ýããX°à"zœ«ôÎÔå¨mú&Q¯¦›„cµ¾ª+„µÞ ªeßÔ šÝ8ë«cÆB ~³›#•åÒBw¨®!ª-\}¡°FnŒ%øzªRäÔæ9ÁÜÔ¹„:G!sØ|y0 З^Ê*àw®±›ïïL¯3{neôS‰ ÕX\ cHJÏ"#AÁòv cj€€¸|N­±ÙŒZõâ»4ÕeDÅ€øˆ‰ë*A 0ëQ ô`!r "B’™Èæ é‚Α6f'CWxv6SmŒ©k”9•Ñ$ÍÉ/{ÿ–†I£4ËËÊqñE»ôÀ¡ûy»doŸÙ_Å[qbµæ¯$ÛþMì‹6dä~ʪÂL v¸ •Tì:=G°$›ã·äãÝý”àwV%w°ÂÙJcݱ,ͨٚR7Â÷oáœÝ~?ðÀ4$E˜ÝGéR)èÄ[Ê5,­Gmï<‡-2¡J»b/³X!LWHmúéŸÇã{G‰ÍÝdrž+ñiO^F|Ë•ÔD•ëÜ1œVª ®H:ÉÞ³œ ,–z!EN;F}´Ðs9›$äƒï÷Éæ’á÷oI)¡•µø¨ïàg¹yÕ»ß| èeçr•¹À÷QÐzå‹êÎÇL†Øq> 1NçùÂe¯r—û‚ߦƒ*³æ¥Í.)àL|Ò˜Û b@eæsýd:Šãlš­—Îd ¿‰ø1qò‘^ÿEvbƒéiˆ6ÊÝRã´uZÇ×{ìKEÀ…tè¼i]-‘sâ§gàÀ›pÑ =ÒtZÈT¼ó”û@àѤ øÒ/1¢u(Â1:v|Ž®Ú5†¢ÌO'çÒŒîc–ßT™vV·¢žo˜Î {ÎA„ƒzÄ9oÀ(O?´»MÙC7™ÑŸÀh> [R ‰âñ,‹ÍÑÅYÔÇÙ—ƒ R5Ó‹Š{œRþŒøíÎW—ʨir/ÔFÑ>”e§Ù% Áäp“+ÆæÞëLËkâMÎ&óì¾$‰È«»-šd¢È1ñ6À²~ˆr‰¸æEd_ÍÃì†ß›ŒEŽÓ»¼}ŸF —OÌ—ñÓóD¥ApQn«G2å–\»k¨¼|v˜ˆð5v×CoÜ»]™~ðÀ¡Ji4I¨ UµaT=ïÂÃ''~3T´ªðûeì»Y“×v–¨VéPÌtKŽ<À¥±°½»/[‰·L©Iâ™jº.¥².ˆIy0 ‘€ôI£œ†¼#õޱ–6\¼*œIª¨dwsóºáKÔQ¥°ëá4¡ó6P,tü²̶ž –ȆýTƒƒz8ÆL´ÄÁUJ‹Tgü“ Ø®›"ús Õ–î­óó¯=—rì>pC¸Ú‹.]lMOc#‘E©´hˆñRVƒw8 cêE½Mj¶ ZÎE£k[ÆÝÓ¡›Œ-W6Å¥Ûø““Í^ŠM¾ –r‘TÈWvw­ë¨ýå{PH釓t˜·31Ö¥¸+¸¾áý/ÄÜíX‘ÜbÔ'°E`ü÷6üÌ¿·C!ìÈwñm§í\En]=êuó2ee[*”ç>¦ÒÜé¼x랙Ӕ#m:„õ2á(¬«LÝb.bÕ˜4*D lpB·t›Ð‡¹Ï\%)Qe¼Vý(%DÂEu*Ÿg§=­«à˜ZbðÅ1%]»l_ d¡KtÚmîžô ÓÓ;43çÃù…£¼·¥ðÛ5P—Q ) Ÿ tÀþDUŸb_H¥Ü¥YõI?Çâ¿.ÖA"|Ë݃æÍ,nS‡C'bÔ#U?—o÷Xðb8ïáiýœüX°3YÖ`œX³­iôXd`ãàû;)ðYNVÊ­ëJ™W¹ßÁªàדDù\6Ï‹(ä²JŒ(cªÈê]Á¢¬yÑ¢±€r‚ا’/HT¥Ù_€5õâ…ˆ‡i¥ç+S`; V}Ù/25<ÙhĈ\Eþ•ñíÒç{BÆÐ U› N¾ -˜KeQÒ³'Ë·•£—D…n=†ãåì"šê¯JçËxæ©V×(Z.ÓÆ¿áSÃ&[çq×í²/1š¸ù:: )#ŽÁפåæëÝ·¬Aá<]ï3íÏÇaP»½ÒQôônq %‡‚6OAçë쯔VæOFãô[>´+xšn®ç\À¿¢ú­¥³xêüGj¡ô®”²ÄH-óÕÌ0Ž¥v™Vß¼§À½ÂbL]dîrd½Æ¼ë?Ý­³¾bºÉªË!,䯝qb¹FŒgmú#«5Fn´ùK[-qx›¿Ä¾Õçøûb”饻òïõ¯×Î9!OœÇ# —âžüV»ºïOPµÚ–×$%DìÜG@¸Ê RáÉipGYœž,øDÃë³g–ù~ÆahÁñЦ¶ÃÖD0Ç #™CÀ&(¤#7â,_=ê&aecZ(<é'øO}08Úlïg>f@Z lrfó.Î8–Bšeø•qwä¨+D|T«£Žoú-a¸„ü(êºf+'Úh؇¾ Cèl5Žøk`5ÓòÉ)g›©7€ÈU꺉¿Æ©*7ŸFB}“ÔM>p²£é½žË˜GÒ”£ç~ }ê8òLÙ5Ÿúî=°E}¼òÂ÷†3œ~±¼Ã5äGPˆQ™;TB:X\@x¼ðãîbHÓ‡úx±4è”KƒÎriðì—ðß'Ø…Ål«¸H,+±Ý¦eÝ?Ru©;‡TéC8}õˆ½K3‹mÎ}ïÂDSžîtI?H(µç^GþãIâ A-Èý=†NtÍaâ}v`m¼ÏûcWÉ{|§g3d@zçâÅ¢v$÷cLi’E*} ¹éò}„¹µnÌ=¬zíààɳNÛyº7ŒGb¯wß]do}F°”ÝýV»Õ•±ÛÙSgHÈ™ gzúäY”çƒÎË'Š3Éb,éƒ}¬ø}?¹½ÃÿíÞ©9ñ½Ÿìò»/hæC̛󊑃öé‘s6Nœý¶Ó9xÚé:UvZOhwî„Nl'Ô=uºÝ§íC§UuF»É-ýow·tF5f„2£srlNè/N ¬…Ufµ[ë¬ÎŽOO‹e^šGØ+œÕÑÉI»cÎêˆgõ¥tÉ»Nw9îSÖ?EÛ\ÍÉÒ`„ X“ŒH³;9ž0 d$ùáíQœÙÈ 0 ¾ØÁ®*”=ÀŒ­Ä¹ò¥ç&“T­¥v¬êÈ;¢ŸŸf÷cØ=êk žÈ÷† J|2̲ñÓ½½ÛÛÛV@“hÙ¼÷dvë E%$Ïñ÷ò+7A€m°k~õ¿‡ß4õõ¬ô’0ÜgÛ;Εí‚W½ ÀR¾¿—ÆE^¿›nr¡Ùºqþ ~ú'ú—ã¶@]Yƒÿ#é¡©û”¢#”˜Bc{ÔC7’q{<©„;ZÇ*Q˜…®šGA…y<¶‚¿Û?8:<8éhAµÿtÿtjš–˜¬’±Èα’¿ä|%A-±ÁnÜ ÄÌ’œÇˆ»q±Éû2µæK±÷ç$E¹qÉϧ#Ú÷ceoÚ½Åv‘¤åÂü‘y}øíúõÛ³ 瀮²ßuú®„ 8‹ 8ES¿¿&õ‹Ý· {§OAZv;+óq¬Éù9„`|¿ýËÊÃüµý7GJ‘`TŸkúçÇ탿Q¶ÛZ?¯òƒî\È—|Þ\˘ñ,ÛΞÓûÎ异 ;èÖËÂþÐ ,ðŒfpÔoÐ 9n«žûA?»—­ÄB7¨ì;üìŒvDÁÿ0œ€Íú Ž%éÇû.:ÙÏj uTá(Æ âaêVºþe'ÚÙ‰©„£Âþi™y¨*áÒÉCiÂR"lÜbãÎIè“l¹Å2Iàö˜ØÍá\‘›×ÔäC÷dÛI ,F¨žÃ8|~…†‚}ƒ²ÅÕ ï·Ô®~Ö<¡ÝJŠSc¯…îà ȬØÁNâ¶Zcˆ%1”ÅΣG H„î$ò†0<îµú[‰×zâ± §÷š8¤Òfšª¨ |×z[Ój› \©seêÕÝ JçYȈ;mà¢q÷r {ª¶dù YÉ f?nß|ß4’R ·Só¿©=@ÿvn)8ÿúçÿ¢ô|ç_ÿü™!éÌ«%.к¨59±Y«„ØmKþÔÙÝ,»Ú X 3¬¢,,›¹ÚUɾÿ‚šØ~k¿Õ91T±N»>Uìå•rJ™ràTÅQžO‚0s:Ý“c™ÅÎ ìƒC`†XhkŽI%Ò§toÈð,•4ôâˆW` ZXAüo˜Íÿ”kéOóýdÿ ¿Ë¯_â×ö÷åusA ÅÉ.ÇÆnâRk¡'Nz3xz÷ã“vñßp;­ÎaçH½qøÙÔÇÖÉɽIøÂ×ÔÑ®š>f·ß=û €Ý¡ÀÂøŸ´ºûÇðË‹;Ù_º¸NÉâ*,NÏÿøèx¿dþûËæ¿ß:9ìž,™gùü‹§#;;¥ÓŠÔj·óC¹ç7Ú'3§¤VI%Ü•uÚíÿÊßY˜ñeõYЉ³3{u VŒ0Ó /½ <¬¯J÷à9ù?Ý/迳çÏ/.ŽÎžwŸ·AÿÉ‚¨ú*~|"F=á«·¨î>ƒoÆÑëØõñºìå›þì%áü)N̨pÂQº›<ø‹¿×9~bêpü¦| }>“Ð…ÅñíSþ臎ڧh2Úe¯%ãtNÓ–|öÔ¹žF™CÏk¿,ר(Ã>Xé:ZÞæ|b¯@”Å•VûÖe6ÌÕp`’;º 9%–¡ FÉ|YÿèÒápÇ­êΚÝbyEF2š6vöL1· OTæü¹iîð "lR‰¸‘â(Œ°0/•ZyÂÌœ]DÛ¥ž÷x#í_/è#.äv†ÛçJc‘ =wÕ߸wϵ›JNšçF6Wd¬$gëf"$"!¹æóPS§Ô[‡õuÔI5ž¹ &—gºÑ›j'K5jé ’hp"«:H·Ë§nNØCº˜P’nJåØÑÔµÙ…{¢¯Ž4{ÍãÛOæß«£'ê&vŽŸ‚`Ì­h7ŠâŒŒìÞ}>±©ÛƒO~†Ô/¸ú¬ðë‹g¥³o ÚA‡(–ÂiE"GŒx|>5A’í,9P{/*EhJóÕ™Āͳ´áyyÊöGÝ­Îäºq"s«Ù×J¤, /¹oZuÄÜÛAœÜïÂ]Ý¥Xãr<É/ÉéÃ\xâáAÙ£L6‰IÝ«ˆ¸¯Kx'¡Š•óËzëþŽëJìqŽzôÐ[vˆP6¦8bŠ‹Kî’§PÈÑAĵד”¹=a詌Üh"ñTôlQŒxbœ·¡Æ&Ô –ž¬ý;,Ƹ>Ÿþb ç»ÔþgضO`£}BGGš{s¤‘¶pÐ.[ÒôKŠõÈõqä©“ÎÏuÕ£.™è“g/’$Nž:ïÕÊ«‰gI šrN…ÇýØÍ |ÜDXµ"•‰çr·i³­Ü§öÁ|·S± ñµ¾S€ž„‘$7òu5OÁbf¼_ÎŒ—Û9eFÜa5a¿uzÐîm„îéé”Ðm•YB‡Ë,¡ÃÖÑþQ·K%×mtŽKæ´|þpúûMYrÝv–\¾Ê –œ^XeKîxUK®ýò€-¹g/ÎÚ/ÎNOŸŸîžž_tÝ’;©Ë’›ÅÒ’cdAçŠñB¶1€!јâl…XA‰l;ïk¬ÓŽ[¦½)Ô“]Ýñ™f£ÕºîèÓÎ_maOl<Ò§ËY®[VH¾6º^óaåER˜81Îп-?’íEѵôÛ/ܨã»·W—¿:³äh/í´ §Ýk5Ž‹BdŽŠv?P„n¡JA)¹ahN‡ lýk»]ØIì N{Äw6{)Û‚1$ý= úÁMà3z$hMÀ›²`lv Â/ëúc­¥(³hš ¾d³d(ÝA?à“¶-ì?ZW÷éS»ˆ`çpa~¤Þ’a?Ã~V‡|px°h’Wˆ½ì[0o=Ë£ãÃìÃn'åè8G$,»Ý<Ù_$¬7‡/ðŸcIÁž«b®ã³CÁÀ™Q3škxÏ E!F2³G¿&wŒ‘LdJôÄLzTþ’ô&Ô.u‹Ù_Ÿ¶ÿ¶½ƒÂ„Ö­ÞouvTé6|'b„U^Ô„,)x“?À¡á5o.¾—< ¼ 3–‡ù}qâ+ØÛ à•Ýr}?Ñ_E¬ØV?â‹À÷ÿz´˘y(&0Î?~}ö‹õ7Óõ2zÄÐMe* 6š3ºom—ºVò¦ßäË‘ñ@q\£}§ä˜$3 cÏe–y0¶ÛTKðšò¼7g㱨ãÞHG´/S\•8QrŽG™êaG–6ð#lØe”boì7lf³\Š„nš9C0¢B4¤ôÇ_妽pÞž)ìZÂÕì±£91™ÖKÈÕÏ4öÄÆ:aŽ«™÷­ƒNç¤hÞï̘÷§ìª™2ÌO–;1Ú]r Ø9aº%+<©ìÀ88Ü/®°³?»Âý.G—§Vxº:?;=?}t7ÍiMnšn»ÜMó“ŽÍJOMƒÞ˜F¸tuG†¡s7ÏôÂíÙ|}î˜<`>ã‘'1ØÂXgBö­RNò_PøIªß@«Z¹ª'ºÄ Áºnde€n¸ªÌRý•Þc²k¦Xd4ÉDRšÚŒiÄzC~Jvn%‰uF¦¹ùæËT±MχAè'ÔqÃfAÒDU ¢6œ…¦))kö˜ 2 ? üåøµâŠßâAÇ׿¦vu›‘H  ¤!KÚòEË4Kßàb˜<[?l£Å3†[XQû"¶‹à‘{ p»(5Æ-YìŽã…ˆ„w›œÁ5‘öïôäŠ#Ü7áP-Ó:õ|±£ æØjÁí]M*ˆ5)òWº×wî• ¾U/Kâ–æ˜(Þçy lî8lð3Aªñ²óèÑV0ÛÀ®vòvã`gCÎ5 )ŒO'Ûà™ø”¦EK³?ò2ôr›G`<¹¹†¦¿t™Û€ØÚÄ à‡F³ê]!€9Œr@낃7¤¶‚Fíâàä8í¿Ê¤oë¾hSª[¾^ÍÂ8ç¹°`ôb¨ù01Gl¨áú‘ªE¹_d*P½%#mv+óG0–Ó ¸,c¯¹Þ‰xY¤ó%ÀdM\}!CÅÒ02D'Ê Êb|P–)p 9$¿´­í\¦i6ÈjBç×ÝZFóoÖÖ›=³žOëÌRBåmwJs. L+^- ³yGQú²ߺºïK·óäÙáqytÆñ( XÔ¹J俔ɡ4r"¦§Ü#Ñ”þº2µÚ\é|Ïæ2Þ­ûbÃ[~S{bB/öß,ì¸ëû§ ÛÞÁ…~¾(L‘uØÿ¼h.?Å(ÿ\·{I‘džN¥†©rwªELVjØ)¤á”¡÷ˆËöñˆPü©™xj¨yƒ(}ØÐº·DkÐÚaMza¡Fð–‰ µÇíÊõ«»õ+Ö_u[öñaÑ|Òé̸ƒ;enýƒN·þÑ~#UrUòswvéô+ù4V#×íÖì²—I²•<ö«TÈì¯î°¿PrÏ;Ý“ÎÑÉËý—/_^<ï?¶Ã^'´Z;ì;Uò*I£jÆe_‡Ö÷h/©©Yþq Έ}9ò÷7ùãGp , ¬žÅ¬ª½R#Ýß{i…)¢ã u§§¬ò—óJSƒÉûܯ\±Á7ïéã"ÌZO{Ð Ø–«)‹E¼Q¯"#Aut<¤‚#ôrºï‘dÕíHÍÆ{I”>6‰yò1Á.úœ­³Ô 7\éó⡤§ QŒ{Ã*¹ŸF¸šùÀ¨¥ÎÎ:NòÅ–¤h+È7¬ºµûjô¼C>t‰ •iSçÎnVNyN>çÎ-*f.3¾f½’ )c,¾ ©ñ9Åô>£B;ÃI!ä4å$–ÜàQ×}^fú¼SÜp7qê‰Åu™y 4©ÒrTÉ‘(]×f}œLybŽ)I¨S=¬–]1]‹Ø¤†+&7iÁ9çÎ_#‡0”s†¯zWr?  ò5P?0E lL2¨3ž>• ûZSÒÞÊçÁ HÇSÕ|ÇÝ)kæ %SЦ ‘ƒåg÷x™Å¶ž½YÅZÓ³?8>í”Li-âAëäèà¨1‹³*lN%‹3_e%“S.¬²Íy´ªÍÙ9“¨,ûGÏïu^\œ=ºÍÙ©Ëæœ{6ç<>S§½‰ÏaÆD¥ñ‚c§Rʦä^‘“×5‹Ñ@Bä”nÜ"ßï\Ìvõ:ðbE)®5C„|µa¥ºâG±lf¯õ>¤ Ð|D@¡{©¹p8øR})NL ý¦ÌM)8ïyTEã¨Z!ªU6Bƒ‘¦Â’jˆà}¢|ø„Õ>¡!N)ÑŽ‡æJ¸d¡éÅz+ý —Æá$ ]Þ>#Y‡&oŽ`Çoj÷¾ššê-ÆSIË•wùž¸lZওî¥-âÂÒ¼´+*µ¡ôÖëë8Ë-j´ƒ¢ˆ‘<Õ…›Îøã-¢Þ0øÕÛ™&²s‘V*†Š¥K¬ ¾ð©,i›ºwÅ`‡FˆwQù ’z0k4I3‡Ûؾ Ò0­sµ‘Ôô¡€iH7Îgý YóÍJ‚EÔž“ž3zPMîºÒgYæ2pî v¤nš‚ÆФ Ñ3‘®s‡‰ò×1+\ ‚Âü¤¡V:J »L†ÌRÉø+BMU5·•_*å¼ÓÏ!ÄU¤4¶xw³x _/N€"Ç1ì!Kkƒæ!±‹rëZ®†HÌ*ëõ×8&+ó¨ï±˜'HXd^¡‰ŒÃõ‚ÈMîwœ!Œå ôÊp‡ÓBC&PbH|”[™—×ø-k” ʲ/šG®qG§£ÍšêìF|N¥ØŒc–êŠU¤ßß_H 'mžŒy¶ ª0Ž?s84rήÎ//õW5TXnÖòWiÆs°Þú@;í3··÷ìUFœú §uq®c•žlöÏm·K?¬Ô”fê‡ç [qxkü¶Óv®²x\å‡GÅv@eJE•­Yâ{GTòq \Á(ŽvApe‚[pnHŠy'\°Š§¢ »±ãF¶ ‘Dzˆ’DYn4`€œa†L™¸%KçõàÆËÚašÙ„}Æ0g}Óy²÷Lùe‰dˆ¾H+òÀ.€9"—‘”Îl‰Š¼«PHýlwÈùª>[zª‘º”õù§ëy-9 -.qê(žo"³V›%lfÉx´UÄðþ)Ñ%-\GÆâ«\î cw¶ŸTídÁûFÀ›Ø3†'ªt »۠ýÙ.bQ_`K˜—Ä‹èõuâF)5F|Ɉ›>yqbìç¬W|Úþ6\V_ ‡`‚´êo¶7% ¹)~£â‡Ûr¶Ó¿g²«Ïåh»Zû®U¨¥ß r™DŠ`*RÿšƒÚX¯ß_ÜÑÆ~~{ýâ©zDÁ!’R؈“ÞÑæÍj,’pTñM:è<@XiÍKæ[rt9ÙŠ …¿ÄBÍŒ¸+¨]<…Ì8ÚÁïSæt€z7!zTæc„OZ~äê&¡æ0“Äx6“ÙJܱêcMz*52WfdÿhneÁTì%2+-ØuÌg;ýIÄñLØÃó We,j…¯šRæN§-üÃMÞ6nIœÿwxq³½ú<ÌÁÿO»ŸƒÀ ÅÖ鋸¿Eĵm9ŸÒ&Ç–“,“¶°7éÿµÓîþ Ûô»ü÷ŸìžÖÀ\qší¿9?:m˹•ŽÞOá&ËãÛqþí“8ûÓMù¿´/ÛM<5èoñ²¶+ÜÆ•F'—Åú$3E\ú,¼—ûº7‰†Nùl`§ôÉÜ©“¡¿Ã»ÚO‡<{Ÿ|7}‚ïî8m0°›zÚ ý-E{ÿGdP_·™Göûá$n±,kæÿW×f1×;¬!lµm÷¦Þ“\ÎÝS¤ºN’ܧõr QHâ6H+ô?–¸ÇÔc²±KZu: ­à¼ð€ë‚h ªvj£|%Õ§ hþwÍv¤ÓV#åÉç`é»A¸D½—zê° q¨ï†áw»q–°V0­wÚSÇÌ.+6k$Ò×To”v÷\ï3Öc•R“â²ÀÄK£:ª¾ô Ñ ½‚DP2zEGȼÔ>¸_;9ºé$¡ù±›‘›ìýYvME¥Þõ8â‘Jã0­8Ñûçs×Ùóp"þ¤÷‘WaTúÐêŸï`òI{‡þWõw!È"lãùçðö‹“twÚ[Éq㪠¹½74öTçDàn“A¯åihºŽFs°ŒáÄz“Ê©¯y…¤][Fîq—­{擱Ý]Ü ë…L²@¸ ¡À7t<ô*é‡ÛpCˆBÜa{Ë“¾{¸"çñ¨‡ºÇbªl½¹ËNK’½n\9xá}dtñõ¾è²ptôc“dœ™uBUeÍóì­j¿žëýòdÛñqÆ •ãë ugÚRW˜ä7¸½Î2G—¹+ÊÙ5íãùó°uL Ãü`Yº¯ýW51©?Êà-á_‰ö]§{àµOOœ?ЍŠBVéFÂÇ®ôcJTÁì?§3J×zì(ˆ>Q”§½ÞÏÝ;þùþÁÉi÷xí1RñÈé¬ôsn 2u2ÈÈ:Ï–Ï…Ÿ·Ö:€ LYƒQÖa2æ…¬òøjÞ²fµsGpu˜t•ÆÞøý?T•£=•Jêtª]õ‹tw•¡;Øè´âÐËÿþùÿÕ3ÐøBU^G§½Â*¦ø Ùµ¸W+Æ HÑçM_Q \ƒ¿wX>Âo áE¦Q)_‘y?Ë™2–îëŒ,î$àWNàÇØB0R Ö ÿ(N_M… J¶Tœâª¦šU&d“f?|BÕñ$›åñ—ÖÛˆ¼o‡ 0[aÜ`YÄ` IbPÖm¾)\z¡“Z!¬Oé6ÅÓðÜ(ŽîGñ$elp'ÀcUœ3ϨRKÑÑ3»;œ»¾èC2„%Eê9L¦ÑdÔC+ˆN˜r}Põè£g)§]0 :ep…®*á“ERRjEMn©¢¢D§¼d¾¡t1¨5’}9ÁSZGÝ6Þéø/Z8¾sQlWG蜵Oœ?û`2ôИ\Á–|sÖ9¥__Áo(]ºòSONŽªÎqŽ^þæ9ràü<9ϱt©²°–?üó qï»nTÿáq§sTu{Îñëݶó“Ÿ8Õ„óçñ$šÜ_mrûÇÝJmω¶àíÊßE:<“ õ׉[9ÍlB$¥èZ§Ý§ÍþKe=†Tªª«A0ÖäÕFáB¢3ÕÍ*ˆC¸ªgîH¦^¡óDYlÃ8 ¾ ^kˆÜù µp“ª†êk0Ÿ¥qÉ"“ü†ž£åŠN(“i¦ÎÙîoUÀç]”xô†‚¼ €„]õA¦ÆÉA}—d¦äŸL1·+>ƒÖÄ£’ÂgÎ-¨ åô$Zó1ª$4Ò¢´ŒèÝëI¨¶¸jš:2Spq°w¥¥<§üwä~ÖÞÃÙ›~l楽ôB7úL ljâ3ÊÐb|Ö«K=R;+ʪ‘´o+FTpàÕ%*ý{°è÷,šOaßÃEßÃEßÃEu†‹Ö0ÈÞÕ¡ ^œ=ÅÐßu4`œ·cöÊë¢ú ĸx×~úЗ0߸ŒR뇇³ºVb.YìÑ“g¯®ÿòñìË­Îl‡ÀÎ1Á~iø–ht|àì®ÒïæcU xø²¹ý|öæEµ‘žMÏç8ß'Ø»A:qÃà ¯Q ˆ¹|8¿Øq^ÿzÍèÏ~»æZ†z&õ?_ŸýZÃôÿÊÐkµZÎ_/~yóîååësþz[-ÿ|NÔ3ñ‹Wçï/ß]_¾ýÙböÅ-× µdïá_ÝÜ}>†W?}409‚ «4­Iºk1#¬yÇ.4¾›ø&*†édá¨Y ‡S3_u—y'Wœ"Ð~AøLúº3æNÂx–ø¥êDýnß̘¤ÆH…”„d,öX…ë#ŽA|øéâµÅLeisîõÅô i`óƒp·Q;w >¡ä¼ôÜd’Û)›¾š«³9õ¡(ca\˜³ñä4Îÿ¦²hBÿg5üÆó»á]†l!!øU_rC‹êÔ^r‰¡†[irq6ê<`‚àÔ¹ÐG_%& &Ï's*L_\W ÔÎ=_ÌwÇ5®4Á $Ÿÿ-#‘@2D%=vaÐsE7¹¥›­ÁÉA“¶:göú(e-£™ $†ŽLclævÈVååó7΋‹3’©È*)køæ[b™WkØvvw£Ø çßÂìOyG5üZäkŽÝÁ”,lÆ#swÄò Ý_ÓN”®­k#V‹KSžÛE]?¼¸U¼„U4é‘pÓ ë.í= 6»ªØø^.K¹AážPdhQ®\ª`ë¯_"ÝLw%G¢BC› Ú ‚+aŸ Õ`ßbù„ɦ…)¿ÑgŸ‹ $Yý*—žú­À`ºëK𳦩‰J[ïî=Z÷åóÖ‰ ‹"¶$Z–„a±™·,‘Þ…„f#{¬¡¼í!– PÀML­&•fLí ô1Ò¿®¦@sÀ5m›º“yTµŠ›}éãâSeæj´þJS×’Ò8£ÆÃ:Ä8òVÝüc*WùiÓ…˜³NÐ0MœTÁô˜;{>HãY0yn7Á 5TÂNdRn3ÂN>à /t¹ÝfjÓt“Îõ-E"/ߢ[ªš~ZQšyhŒD|áXy¢1¼I¦ Fó¦so 4¬ÕæP^:Ã&2Ô=ƒ>"‹0˜µŒ2™˜MýMJÛØ,rØìŽÍ~«1ha/¯®§åCö0Àñßù·Pçï§YeçÆœ“7Te°ƒÐ™s—›Ô2‚P޽²1½™ »Ô`<ëžÛ=®k¼ÓÆÉ^‘ E,D]ˆ´ˆ7ɸÕjÁë`nìHŒ@§¶™Ë$5°.‘ËI@»rƒ¼È>0Š/Ïl¾Ó¢ÿ”¨ 6s¤Ú½ „ÛäuwœÝ]ù}Pu(ó¹,‚Qs­>L™þ$tÒI¿ÜIði_¤Ÿ13í¾Ätµ™ úú[¨hïkÁT°)1¨)”y²])ÁcÝ-=Ã-E^„@!¿é¯Xjøgi:1š'Ë”T?@Š“ÊÀ§ Z¢µc?žZm5U¬p¶‘-—ÊÓîóŸ•·û™ž—žÀ­IG +\1,QAK]¿!IBe¨Æ¡/%c!z‰ÍÅf–=1to‚¸RÆnm’킜°nøÄd Ú¹.KASîcï“,üJA7áÅZ+‰ Z>ÙƒÈMÊJÜ@ꉚÄÀ á;¨Øb)ZÚ¤Ú•IG)Ö*ÖV§R§Õu%^ ÷ŸWŠ×¥lmúU^x×ocñ{tïq¯!”Üëï» 4¸é6çP÷–ÓºÔ†—ìJ“kʈòxã,¤ÅÔÃ“Æ Û m¼™êF áåšé^ÌY*ØövÞ0í¤ ÝIäIdg•Ùˆi Cޱs‰Ä¯ÈŸ™– •Ž‚ÈÒ•É­3´$Ïn›nÒy]1qwÝ;âÁñƺ! -ÀŸi]D* ùÎßýb&Qà¡`“¬0˜|Õ3µÞxl(8ÜgÀJ%Fƒyì‚k‹‘aÜ+­YŒ-‹]Іÿlœ—ôÅ·#{*³Ù[Yzaé¨5S®Ÿº‘;0uê>5jL3ÙÄiUxJa²óp8#A%nëܯ2‚²¹u˜|ßZñ½éÐ:ªË˜~4UŸ¸h ò®¾D°:™j€iÇ{ië›äoj#dìMUC6…-³Ý¯OËXÍxL4ÁÊÕ)‰Yn–`03éÀ wÀøêçB>C•º÷®nƒÅ·ãq(2Ë„K#t$.ò2\î½EN Zùm]4d³„NeÀ·qòÙMTÕŠp“MmÙ3#ïVwþÕõ_~˜—yè6`á ±'ìüö $…Èöà¯wá»´x“”3ô¸úÌ*˜®é›¼W;š•5¡ï^{¡#‡Gw«\V´î’ÞcCŒ[âvດK[­/PZŠH‚ؼ‡Yí;^-?´¡Õú[IÃ-²¤D¢ÅÎÙ-õëxËs#ò§Ö¢˜zQñÖ Tª ”>l·›Ü×kØ×Ì ?= ef{sÂY¡8—û/ÑÏœ'1çÏ:²”o»»·ˆ &H›wüã?ÐfÊ\;^ÜXs&°š .`Ckޤߓ¿™—Þ³òíaãAfr2ò…_a7ï¤7ü×Ë‹ª4{üx ˜e ðì¯áfÞFSRÚŒ›aµ‚ÅÞÒWÙgT,V¡fÅŠ¨ ÂÜÓËLºÇb¶B1‹tަÃA7ÊsŠd’«¶³7AÑ 1qOÒ?§µäTZ0ìÙ.éNÜ1ÀÝš¤2x+m5К̪äÄa½@øi9£^a“ i› ciªt35DOO ;‰š2£©ÉNFi¥üIM,ó§AF=Üg»]Wc3Å8ÂØ‚³åŠ"¸k3Ô…¡Ó𦶂ê듲‘Ð ¡Œ(a0{2©ËŸ7g·S‹=wéÉØ l*5Ôý@ÙóþÝ9K«L*%~h´“Š‘ 0™zNkŸ *ˆyKù{Ï>–”kàÂw´-âç7"á[`¥œN(SªL9efsÝû²¨LrÏ5Œæ²Ý A”f£÷‚cšlBCœ›Î¢"ÊG!=ä®n1†`HV;ôBèÀFß­Þ=šª  r_yœÕUÌS×ÜgÛüO{‰†»5 |ϵ‰4äÉóçÁ¡+^dn6j °Na`jbQ O…öîÔ€~Àš# «*_m¥À‘DÒh¥Àk¬Ç׳ª”Ÿâ¿F{àtOBNGlP-âhþ^ƒÅx©¤id%{\êc–#÷—d'¥¸K,„BXÖ*û- `  ŒŸ®÷´XÐv”bo 4”5~z±e%0LŸ ÷Ç& î—ÐäMŠjyà‹Ñ‹s¥v0’?‡Hܼ_ LÑÏÐá‘#üÆ6ã‡[qªò–ˆ«Ú€Í„(ʉ€³£Åâ&!Sƒúù—Äײ+cV±Jêa÷„wXÜ•:®»„!,Ëë˜?޳ò¬ç†y,î°¦`u)ïå;Ô*ùq¶ð¾‘Ÿ$jŒ¼!òø¸.K ¶l†ÿç^ŽJRÏŒ^üzöæÝ¤®9ÞO~(¸·p[Gª•+cµßý`RðS»€Ì'Ð*:Jš»=g²â,¸A|ÕõÈÎ>.Eú$¬jÚÀâô ‚1kn©ò ·j¨\REO˜,jßµÛ #Ûíýz½{é¨rÍZ”ޱ š~5—:µ½X›ÌEvb p“H¸d—}A÷+Æu]l­úÜvMgAP€Mz´ä˜Ĺ<5xWôª0½ÈÞÇûcÏ™èÜ”/ü.q%É»|Ö+t§3cêà ûKÉGëd6•Œ[ÈlÂ"Ì›Z)ƒhùÚKWÏOÓªä_]¶&@°ZðLåƒôº*>a­…Üø]&"‰i±–#ÐÛñXŒñ˜J ½•R”Ø”Ž°7œ™Ò»ÉL".¦CõÌÆE|!êî¼ ÿ¥îà‰ÑW Ën#«ijhN_ô&2 »Þ“yá£4ŽÇø&-טÕoð²Oåé6“A¹j ^1n°&Õ­’,4o¶ÉBËg½J¦ÊœEVÏTin£•€Ó¬Þ°ÙókÙZÔhxM{àâg|j•B+ØsÖ_·ýWA'YÁþ›3é¼w¨Š»Ô¦ÙUµW»³Ÿ¬¡iÎu-TøõBz£¬Å&ìÖŽ¤€œV¶vòì-çz¬ ›.½µ“´ÖŽÜiÓÚÉõrî,»Ôo†Í£æ[°y`Ædól¸õS¾±›cóÈ2”Æl­ðÁFìÙ;hŸ_<·w‡ØMEr™ïj@ªµœÉÉ>.çãë—63áAL幂i#­:õÖ»¼~?îMWËrš«ÇM%Hů¹ÌL†âTÊIâqBÝ ô›¤@êW^Õ¬y“ÛŒMA]ŒÈc#‚u¡UÖ4=Â/1mÀ7¸k¤˜ÅÊ Q‚eåöWÓŠh.¹£áü‚Oû{?w ^ÿvP';Õ§¹S¸j ”p¨:¿†p­ÍôƵØá- 2S­ød1±žÎƒ5zÙ0±ºiV±ÖC«‰6B™¸ÞðK Ä)i2oÐÄäf¶܂Ŕi±c’˜‘†eý¿5K~_ ·Iä7‡Uâ4W`G1 PîÊWsâÔTO¢×x§â5Cè JÍïÞ»©lù$ž ŒºÛÁ—À(ü©Vô9w/Ã8 \×ù”(‰Úµ0¹8aã¿DZT3PN% šy³Š#ÁÕ³E$ÜE\U [ÆØ«R¤N€MêJc Õî°&u„ÈAIÈ&91Èfæs{•¥c÷Öìºe'Á±Øï.)4*“4ì,ˆ&‚sñQSUmµÂàbðÅýóÿ¶ÕóéÄÕ3SÕ?9§#'‡ÜÑ®ó©4Îê=\aÞÅ8u®A¢]-±Îò"Ìn•Ô›N{Š…°ú]ÕÊ$çeIA~ä/ÒFDvÔN›¡…„~±!±=ãBpç…ŠîldLGK¯e@ê%)¬½€õ Δ¢bmj0dF®Ñ*RÎñQ)ö„F78µ ñÑ£KÜ `9²¼Wžl:‡K±û®˜WÌWçtzù¢"þß<Ò!bÿžËÔ\.SNYéê•,úÍye0Õk[æÍ´ \?hÖ+ÈÝÖœ¤«õ¢GPçÍ•[Uã³4Y©}»‘z–Š”TaÉú#TWê÷SìQ£vÏõÇËŸ±æÉ~©¥Rÿ'1£¡AÕýø ~0Å]î%-þ®A©aÕ9l}=µkU­£9µ€ ’H}EÀ]>&î8uFòì5âƒìÓ•rëp…PS he;®‰½}(^Eˆ› ¨£C…0ø†4œâD¿#¿Ò­¯ÆvE t^ýùÂ`;ð>ò†IQGf­pà‰$5`Œ €\‹)1x]†šQÀ³5!8=(úfs¸Š‚µQÚi™%VêÞ8?è×ݧ]útÍ`Ÿüm\¤ †—gD"*CÁ˜&wšËK“(\Õ6d3v$ƒïòŽÔLöúòÍåõYewÊWÍrÁpgØŸWÙç+²úöà¯wádàŒ&UéˆF½öÙ­@ºšu3S).©‡ "xnàÕ'X4äŽâI$ñœ&c*"ÛT†÷N€ÝmæAáíÑhaŒŒà)úðùh'À“ Ø cbo§j POèx™×·öÓß!N†ßM'^ A‹U­ä„ë eN¯›ª>Ãê¦Á¿là(š—²×³ÐCï/BŒ)g$@ Í»¹›X¡Òxe.¯d[ѯ4g¦´ ’ø¸zÔ%è«H×döÄн âD!Øè½Ê¡q­}°ö›±÷\ï3^5?H??åìô97½^õý܃á¦FÌ–`õ«ÞÔ&ú6€Q[AK´æ‘ð¢# Òè_ÿü2Ç ãH6й>íò?&„fCˆ”tIÓâ,ïà=p1 ÍùïàÂ_œ-ÄýûµÖì3Beºx¸£„ÅTÞÑ«ŽèYøjîôâlX°\G6ª¬W®ÿ¾¡n E…¢÷KðXö›5jkõ{TØ­Å›•;›¾|˜¹ÞCtƒhÉvÓß5xâ–ûÑ:‡ËuÓ_¯»o.~ñ¾ÔW…Gt¡Þ/0ƒxPv2}Ók#<@z·áhö#ž=f Ã\«b›ñ¨TIäÊ—Pˆ˜ãô+GÌÊ_´ajˆ´Åž”,Õ¼Ú£”J 2H²œ,0Li¢¨ XÌLçCpÄŒ²:û“l’ „"68© n… ù¼†.þãªÓ•k¢á Í¢}ØÖv hc¸:äzV‚Íõ8$Ü @#KUóc~‘ÔV/ˆÜä~‡Z%í8Œv^k*]ìeÜ5±T³±°±DRHIE/ößèQŠ´U{HªƒdÚFîÐ&°a]\³t#ØDüNŠ&‹Í–šM”³$×£Ç.,='hÇù¬hKîd3GÝM¶œžì»i¸ÏïAëWDy7kÇèf3xžá𠘽c  —‚— o¨† Ò@^3D &»=^Jªî¤àÜ@‹$F<–ͱxß“4ã hÕ\ާ§º¼ÁçØpȘ†iyOõ»Î¸ç~GŠÏÜD.ö°¢$‡Mï̶VbÕƒ„$rNË[|ËaQÑmÄünÅÆzkõBjs3ô6f¤±‘ ëe¹œž‰ë%ˆÔ<1ƒ,`ÅÌÆ)…^vrÒ³0)òÐã ”/Yó_öTQø†Ym®¶ëö$d{ÕMCi—97™¯vÂÕD@õ8ÿs* /Ú£ÔàLTÑæ–î2ÉoY½ p9kì‘Ȧ‹Æ°)5z×ÍÆ%*™ˆÞGó¼|Á³w†QÏËÖJÎL#nuðΚE½LåÎ÷vt«ŠHW"ÎY½“/8öEøwÚÆwó%£K0Uj2U‹¢2òÚuבIrò$¹½#‹S êòŽÍñAl†ÓŒËIä_›ä0[„‰Üà–Ô©ØïJyIL¾ÊqäMչ伛 3JMu=×ÍÃ8êfK[Ê|usð›ó¯åéÿìzIÄe"ý08¤µô&ÏcyfÅ QòÓ(+-ޤÏ#ˆ©—C¿²yŠÔžˆ9x»e›Å†3ڨ䃲EóCU‡·c ÷>pC¹7ìÊu¶Øò¶Ê*˜ŒU7(ÐjH™•!÷mÞ<êü³|³l¤ò”å96µÔ®ÑJ–ëçAÇí1Ve3¤~pÇÞL,HTŸplOc'7Ç$Ü„,5Ũtå¼açѨy÷!Í*ªÑQ1õDìJ´o+9¾8Ð:‹ÚZˆnfE£¼àÓfÕò"ý‹]àR^±Ýä@`²ŽÅöéŒ*67fƒ¥Pã³$ÈdÀ _j™ýÝ ²2ƒÌ:yYÒcØ;Ö~ëè`ö³£UuÈý…ÓÉ?µ3w*ºwУoVó¡»Ü|xýúùû·¯^”ݶÔò© ¤´G1~Ãc#Ôs½G°wgÜùqˆ#EÈ×úPò" ÂxàütñÚá.ǵ¼³s/†A/Á•/Ò`­€ºûA¾;T~€ý7Õ0¨zxZˆà)æ¾<ã8 n7ýB“Å l˜"îM0à¬Zå¸#ç¶\ȽR/ÉCÙ»w¼0ð>âlüÉ æ¢­Ä[–̺óA®RƒzˆÂ•Bxœ›ÀÇ–ªÄ˜ÌŠ+ª·URGôâ}ºŒÒÀ/ä3 óî8©¿@ÊïQìO05BÅìÜ`‹-#÷~ƒ™tµçû“ÏEK©ìXðÓÆGS°u~⬼ÛjJl;¡Ê„ÀB QCêΰS¶»¹Adüª­kœŒÒ¼ëN‘U‚ªÊÄNa4è¦Ú1æ×o<†%Ù{¯s#î¾Ô&ΕâÕ×qŸýbã$!ó碧\bضà¸Êwßb#s ØÜpo@¿teÌŸnéd,Cí: (§vDÍ.wI\ÖÕ–~–!Ÿcîò0¡PÍ3r¸?üvm¼zyuÍ•bg/®»Æ†¾„@7Ü¡¶Ð뇧óÎWpOFJ’žàEš!)ýÍrþ2ñbk™[alHZY+¡Ï™AÑ·`?wœW?}Ü&oÒ$Ê)‚0­N==ß½ åÊ™VÌl (‚”ëÊz$Ÿ2ì|NC¯®ÿbê ú»íʯ÷5©Ö_Mª5Iš7Ëa¡´‚šlëWãDÜñ$ åÒ™©{«–J¼ªxoóæ¤î* Þy°]¼I$à@BcKîiWRë—ðpRV¹"«¸·©Oeì;¢-ÑH×sW¾X«}Q~d+ºØ!Å}ªÕmº†6„Î Bt ú§Ë±ƒyyö”ªÛIpý—Û¤Ò!ûÆ#¿°V8ÈýúÝ%fãÓ}Ÿ«`§{RþيΚÅaÿüÓ¯/Rú-õÏÒ1\Û™%]ÃŒå7åÞá÷–,¢&š Î<„=u­™\€Å›]o.€î€2½ ÕÎŒW¹ÎFIsÛ™Q«Q,ôѯ€äï&yxìjŸÒE}Í`Šò¯¼Ðg“|ƒ³I‹à0—DA‰Œrðg;{K=ÐÈíñ}^œb bÛ,næÐ¹a°ÊiÎ[Žh1Cs.ißâ\îEæBŽo(øïš- Ô:ërg×P¢Œ Èà§žê­‰Íbø• &d~ÁÐýÐÕY¨ªÛK’ïìÅ]¿€tÁ±HЦܘyHºÑšLo ö*3?sæAHvÑøM'=* ÀqÃAœ€10ÊÝæmËÝ?>6þ08q£ëu/³e2ŒóxsÁ\-´‚*|Â!â´ô3³ùµ›ÿ ‡GÞçü_ß¾7¨Ê؆Œä4lCæÈˆtÏò/4ò\GÏI¢†\®³žDYu´n* c£J½T¤#,Ÿ• ÖÞÄ3›s)¥cû`lëB2w]׉ºÞ%ÈÚ%÷ç^óô©ŠL¦Œ{ièv¤»nP‚æ(îЃd´X8Ü,!¸- êÀ^ï Ÿb&-¦Q2ØòjqÏ•1sU®]ê d†ð—¨À µZÚÂf?ÕÚª­¹0–ª6ëúˆ åçÔ)röÉŒ;~¦L¸ã’:öcE1A£ŒcÒЉh"µb.ïæŽ3™ Càn|™"eÓ¢ªêJïö™”‹V.6¼Ïìq‡Sï}é:[=8øî6’=‹É\ç`Ji’&üÀ£^x¾c]+›ÅÉ4÷7ø_QòÀ~“ª5®â9NH kÈ {AFiVv<† 1 º®£z‰;|qB$@wÓH:ÄH<ùU9OM¤s‚îiŠƒÀ:1–3ŠQãDñ¶9ÁÜý ÑÆsUsªHwUüqX?^‰"ȸTulñõË»ûq¬•QGI'¿qëÒÕl’D”îq.—Âæ;,P FÂ’3—æÔp¬˜´h3—ü*™ÏðbŸQ)K8i ]±·8Šeð0¥´EÌy!S©ÅܼÙE(uBmón EH#·.‚øõb9&5˜Cž"nDTlà÷Íz¸OyѧÕ ¨Æê-•¡j$«.žZMõ[Õ}¶ÝR§í‰­Óv# ¸Žs§mwü¶Ý¹nÛMd*ŸqxiÖ_»‘>Ú9[»9>Ä›Ý]ØaJçkåhÍÎ@ \`‹ a±@J-–˜ëåW]îz¦bT‰qV;¦Ó½ÓnµNj>lZ£ô°Gv€Góå y̪»AâF‰ÂUë"£É¨Z&©ñ#Rò ¦Ü9¬°Î 8ô+'å󦹑»ßE7Wš‰q]Ü¡tK{°¥t“êßM–Œõ-µs?:møÿ¸ß7“•>ª\Tã¹+ÆÊÏ)îý%]¿,½|Ó.0`3욆¸Y6OÎ-lÈ1É”‚£ª–Ø2”{'t“Xb¥)ƒxUÔ…%jÁ¬h½û¸V 7ÌûÄØû§ŽyÜ]¤Ü ½I÷>‚š …t=7t7ÈÕ©Ÿal£?ǵÜ6y C5XÊŽ{ÂgÃ.œÎú ä4KàÅeˆArÛó:ƒ7#fp¯f‘æ6{¬l¾«yV×yÂWÑÔqs¯R1>u”¾ÓiïtNºÖNW½K©ÈfC6äB•î”.¬þŽq£ì²*:¯žoÌÞêy÷ðÈ*ã‚kG<*SÇ´­Pú2B‚ã°’Uê,7 $A;Bòk›.|,dJØÛW€™ÀP ­ÍEélêB¿ã!¬ä§³OþÞ ü7ÄC8˜Ó%u5—ìÑ’ Y8ª¾å¨ÃÍ—ì‰î·kÁ.j9|ø­¡<ñ9¨Ï­ ¿pÌÎÝ;ý£ƒÝÎééáæ„ö†Ó¬bT´\/“@Fè³{3o›â`^³ÓÇoÚÌà>òsgkŒ4”74Œm†É䓚^abZ/ÇD_e”ÍU›ÍõXЮï6·ÖåÁ€Ä×Ý©t w?Öû‹LPR1¶Oÿ»/ú è_ÿ@· ϲÁÉüÀÏû¦dµ¥»ˆ òü ùþßö&Ÿù`ó0Œbè…¼› 8c7«Úo|­u„A^þ ìZ€áൂ¢µPÔƒWADq½h¥t>NÜÁÈuê8ZÃVzÅãô>ÝA­3…8Û‘pØÛÔSØóÄá~øÁ®íÞ©Ø„—¡ÛÁ ;Éœ8—¥a¢Û½b-šßñ¢ôK\]þj ]ÔæwS¥F@­œñD÷BkõõU³™è%¬ì67€n™Ä£<ñLj©¨&y·1˜e°á“$…ý ëŠü×ÑQ`XèR¡Z|Çê#V¼lGÿ‹êßÀçÞ­²pÔ—,f¤øxN¡tîN’¥n&µ!×_0ŸìÔÐ1Iœoƒa e|î„Ì>(¤ŽIx3Þ+‹™ÉXÞU…˜öõ`¶kLoËéWñHaÁ>Ë}è%0žØl¤GαK]oYJɳI‡Ëoø*` _!‰¡[§I?ÛÞz~ýßÛgçG:p»ôÛ¹Ýà€hk9J£‚¿¤NßÞ½øåúõóOo'™M#àþnæþ؆ñ>}z÷öýõÙë«OÒ7ðéÓwÿ«Å¤u•Ç‚ào·:­OëÑŠž´%ŽÖÎÂ6•ÍxZ«ºCÙ®ÚˆƒV>Ä‚{V÷µv*ÔUü¦:Œ6PW±9øû¿­ÐGõ\ÁL…º •ñ/[´?ˆ—ÆÞ;,²^ ýCWXLm±|@¡uº¾‘®^êhµƒÅ`V __osµZÕZºŸn{ž6Ê;®–×Êp[­·ù÷8~ƒ­Í˜þ£Uõ–t9?\U:-Öi6Ú¨8~U»_2PÏEÂ,‹þ´·ÎkÓ/ß\þüâ}©‚‰‡u¡ú& aé¼ ¢²žíŒÇ™µ)Zm5Í}ÄsÇß›V«fZ,ŒÝÀrØ7äwÑ72wFû2 9ÿ6ð¸oƒ,a@òŠ¥Šë9©»¶CššJ…X£¬^È&Ô¶ ŒÝºà¯jˆëSU¨º^MU¹rH@ç¡6^ jOÝ‹(çYËB ™tÍ#ŠÚâR˜8c7ܳG¦&6TºØ;J»¿kb©0¬ëà ÄU7–Hþrª¶q'Yœw¯éQó'«´]Ê3#%_U’vêâ‘¥›Á&âwR,q²´¨ËÖu©c!š«ë¨´*çX®G³™ßxözŒ©4˜*„½Ž%Ï²ŠŸÁ‡UvJ‡ó5‚Ïï?f­Áíɹ›‰êdxžLOÚt‰…n,“¯ˆ;U|Q‹Ú™x`ƒ%@v)ëxó?q`k[ƒ[è‡|s”\l8èì€ð‘¸ ˜WN›•†qå` ïœzBb(§ƒB“ì&(ÌØ¶Vƒ55BØÀ‰‰1Áƒê¡k¶ñ%ÐI‰+™ˆT7êq0ù’R“‚­Òg`è(ŽvI¡Ê/7Ö×ÚàwjÝ?Fjõ~«Ý:™ýè`e jIöË’Ú_[ÊË#½ŸêÄõçÊFº1†§¨ž4³üŸ½¼ª-i¦0TôEzÅ¡Ê%R*½k³y30YÉjë™*Ûà–“-Éœy2¤|=Ó4,r›¹NåÎàf,ðšrg¬¶siòLM[*³glæº8}fÝ‘ ù3xDSù35­¿tAshjXÊÚ4M.·4…¦¦Å®—Ccõð…I4Mîc!‹Æj •/c5ɺfVœD¥„£uiš$™LšfIdÍT«I=t.Õd9™¦ÉWÙ4v¼t:¦¦+Ov-ZŸËðÎlBMƒ{\SFÍ&Ô”Rc3…•sjj:Ãß\ Í‘okfÕØLéÓjìm…œ½ZæÕØLÅH¬©‰Â¤ïÍfR«8ßê²§¥÷ÍfÚ*ÕL%Ôèè0²kðe1»¦®­¯”^ÿ7Ça·¢GeINÆ’¢%¼;^œ¾Ó=݈û;å¾ÆÎŠà ’N¯†úàùS§¥?p>H¨@ç½²‚»nIJÍ: R¥Ûµ”Lž9~ЗGø1ˆ|„\gÅß½EEX0#É ÕV“*&‘‘ÁOjЛŽA]žYÇu·ûäY~"rûñ»5ø^ÙƒåŽPhéˆaƒe V©L¯ Ìe.™S•hJBrb.ˆ–OUàP™1ÞöáÅûó­Ãô¾‘pGý`0‘ØV/èãì÷Õˆ‘9–³‰]gþb6$7ŒÑ뇭—Þ_ˆ¯›{¢®¨Y"A£œ’)k²c´[Cá[ÏŸ "l5´QÚE¢ÏqûÁÌÜ3Ó†(à¬Ò9ÇOf×NÏŸ‘cK‘ÙP*éÙâ3&@áLJ©3ŒGb5&[wÅï:÷¸A¡ð­a "9ÇŒ˜·q(ž€N€8±-…eç ÷«IÄ8t=ü(oÊ8g ê¹Ø¥¹ýø~81çæ|ˆq[vþ¾•þÜD‹Ü´u&«\)Û˜_³Ò 3§üWÔ›ð-ƒ)`jÔX"#éS°y6Jsé}”¹wÓÜ/5poó‹,>àX¶¢I®›KCs 7’Šq´@ýW)ÿ &BGdbÔ`¶¦ýMDsöiˆä“/Â`$²:0?ê+7/öã’—ÍÒ3—Àµñý€hOîÿÔšìÊŽ ‡= dÜLkÎø4[Nûp~ÑrÞœt–¥­ìØ[¤{S^Ö”ôÒ¹QÖròü»Ì¾ßf„Q, GRSF¼tè® ñU&*lXqx# ›SÈôûVs`åÃŽô\<ò©Ék÷1£Neħ¡›9W@ÎÆŠò9šNÈUþxã&Ü÷ùô#4WlR w¸ ~Â=Þ$Î÷u )±W^ºÍ„3ú¢ÇȲñÏØÿ˜ÀnÀ½JqÉQn3àüÔñeˆ­N„‹ƒgµƒŒõ„°½£~áÇ+ÆeãE§Y¹¹pž%á´.›)‰ãQ!b¸W(Dq’a&Û‚Û…×1Æ1ÁÝÐQ§›¤@ƒì~êLÆ'§j.–”0Rfà òTÖ¢"š¦¸ôÎ犤•œòÐæëù 1doJi3›~Ö“,VÈÇ›tÒg?Ž£/"1¬Vræq¼œÑäk*0M3IÅ›$pj2fʼnÆãv‹‚&R³¦¼ç, °C#Èth s"ÊÙÕ+ Ä­]RgðÆT'ƒæ@WGLtׯƒ^»幓B+ÕÎ7Óä¾5¸û 2ƒÝáÉl^ˆ9d[«ã.N©Á}ÇÜ'Š4b*«6Ù¬®#ÆÇ|êiŽhÀtºgŽâ(Ò¦(¶õRpªe¸öXv‰¹?±ƒ…=qXÏ4ý1 ¿ŒÆ™‚ˆÇ¨›Š&Öá‘?Úp{Ü ƒq/vÿ9dм}J([xJ 4`=qSo˜>f-½[ eóãUþ¯¡ìª3v#)eRÅD¨Bå‡85UÔý¹s¡B 2«sdûLÜ+—ëØnZ˜#ý4—¼E„‰DQEýš;7•÷Šo:L&`Í;ŽÈ¼9£‡qò©]+ªCƒ#/‰CS«A#šo7¾‡úöÐX?Ï¾Óøì{®÷¹¾àhöaÓðÍO?ùŒiõõ- <“ÖâyH Ù\!B×C¥Î]vàÇ×ÐØuࡹ9g|2[‘µw„Àïí}ëÚFC‘,0Û¹® JpÇ––bW„»¿Læn“´ïb KaÒcÞ·|2ýh‰¥‘Z*¥L©zDÉæ7Z)1雺“‘¤ƒsk¤Ô¨R)ꃈWÊaPª`7U²ä2Ô]úǶ’}FRJ(hîXû2MjTzK-¤…½>%NÛŒ‚G’c„…§G¡=™¨’)n³ Õ•[¨Ž³]o!–jO·xr·2W¬†spÌW»c>¬´WÒ¹Ûf~>{ŽÈ=¨ŸÉzI¡pÉ#Ë–«´wøÒÄ:·¯à¢£[gç%›9W©’ZG‰À‡ÖÞ(-jšíuLv¬š£G´a%Éj÷×»¶jMt±%,¨Y-Ù ÌUhØkº[ ¤Q0ð׊ŒÝFÁ}•°‘‘¾Ìò”¦w_›9áÜGÍ™¼.£PÀ–òAÿ¸ÕrñÌ`Zê±V¾;ݽ2ñ¡6aên¥ò0 ¾‰C* $ug¸+ ªTm¡…Ĥáx2…ãÈ –ü>ÇzvÁQ¦‰ËB©ù–š{º“jDM°æTA(Ï'-^Ķò À!p£{UÅTܸÖ¿Å$™Z„%CÑ °ˆÆ¯`u<"I)I·éGnJTV–N¦œ•9Pâš–RåŽhI}š² +9´ÆÐPþ[.4¿¡&AÉÁ0€~i¡¹hæ•PxÚª©m1"¾ÁØ¡iÏLATØ„˜·g‘ꤹe½ì‡1¯‘ +4Z†µ''‡-ë»pÉ€ø¯0®ˆîöËJ²b¢.¾ŠgªC¹0îôÎ:˜X_üÛÈú·ˆ?k©G4¡üù?N>ÄWô/É»UM‘&¦¶eCo9.Øw—?·Ò™bâÅgg€ý«öo#…±âÓ!E{QdCF>âê¿’(J2cëÎN©[V¼\©*̂՟̩ß6„ÕHNIxãT8†Âzw%ˆd%Aé€ –õÎäE‡áP‹º Ó™þ>Qo˜ø²YýÉ×W*§n,"KA .^½½úî½é95+êr m¬ý LàÇ-?‚½J²Ÿw‰ªñ@qL°cLH)-J›áSy0¶£x îf÷1/’e)G89z•¯— aTjÁ¡øË\Dqs·å +§|rD*î²IÎOȪ²ž&/§žc¾U"ªÕ{ ‰q+žW™|bUž&Éœ•H„b.((ã©ësý±.ó]¤µÂ0 ó¡t1ÆŽ]sò°é|]Ëî“t8á…ÜŽP;³“šãJ¹ÒEéªEÇIT’)šLݹ@S7 ÕTÔR@õT×&qQ‰q¥ïTüo."—§/†„œÂš§‚çõÏÌ5QG Y6ÑôÜX¡Ìb^p%F0h*4u?§U8Š?®(ÛwíJ'O8OJòB©C¶«´C3[ÄOýed}²Áª˜ÔB5r¨”hîË£U+#¶‹HuSç´Â§`çVò d¸Reéà¤b½YLhßÕ·Öqwçñq˜µFO’ýÛ­hÈr»-¿qR4ç¿)ßôãPË!à.¢ =?§oTÊõcR˜äúŒAÄn^0!Í¡Aö'òb$ej1J¹ŒdÙŸÌý4¨rüît*¥sÁ¼0oa±³[7ºFq‰'*^ZNXí`ÈÃAjý<8µÓJ[¥[ÖøìÙ, ÀVÄŸÕj¡¯Yá€ßᇑð, ›ÜT†“Ê´f8°Ù$õ¼¹ ''«˜É²–2LÅøÄGÏmYñ†§C£RšËk4U §-`0à‘j%GÍNÓ-a¹”Ý'äÞ¨<t! ¯ªŠ J¯ ­`IÁÏUXyãAq­¶÷<›£*à/NQnlÁ-ÒC‡ƒõ†v³ Bý”²ÁòÅh›ùõâº\ö0ÕÉd2å8ÚÕæ8X4Òõa`NkÈ™“ú£, ­J{û *Š˜r"Ì{f O¶8Ó`lP3Ø&•~4§ÈÞ&rkPvé¡õ¢R…·ªŠÆai抗•›QS×6AßAU¹†ª}ƒ¼šøx¹dN¿$Ð[ë Òݺ#,ä‹kÿõÕŸº‡}Úªyc°Þ*WËe6äÝn³”'¦C1å Šp~$ˆOɇ*>[?õ6®X(<ŠQØSF‘JÐŬŒ; &š±ø: æ“k¦Gøóm‚qÕ¡%e Ë7HK2¢Ô$E‘8éù)ÿc-,l_ÍóRõ¥ÓŽï¤l£õ/‹û1HRÒ>Sɾ&eDëp0uvÌEÌÆ9¬9ö¬’^¾©D,xÙ€l©Ìlß¼¾£™n\9¶ ´˜¬‚Úñ%L*)TÖSžå‹‚t¼s§ó)ìŒY\ Ú|!m¯òi%º:¯:ùC±¶,†'=¨j 4I¾VÕ¼’YÕ¼¶“BÎf2.ËÀÄA€ƒªvùÆ1d01pâ®Mª,]4ƒóÙi 6_°1÷–6ÄŽѨ“—¦’ÚÁ‰î-7p²¥i+[{º–pH˜ë ·Og UµGïr¼°†n[™8A%ð ‘MÒC«d·ÏAKfo*Ï­:óÕ5ê>«…!•>¤ôQ± ŒJ§G¤W€Èýãïÿ£BÇJHÆtz˵9¥Þß`^€EGb0ËüÝë?ÛŒX¢) ."=I'%T Ÿ1Jê&þÁIüi€}Œh.­ñÜwøÚX§¾¢ÙŠÙH•P°`ÝHŒÒ $݉¢ùIÆ"õ20·r\® sçðã€ÒÀØ!¼TðÖj· *IŸ·ce´tP“aŸ+8ÄT0Pèç©m²çŠÃj™ « :AUŒ ‡^äþj‚a\^^->¹ƒaŒ¨×¾XI¤å© ZµÌGWÆ’èŸÜÙ,õpµz kÕ4ì½rz‰TO³Ž…»¨ºV\~ƒVÚ›*b¹AçÞŠÍ-·—ÞÞ Ën£¸vè0çW0cÇÖßC•äŒ}³zL‹ÚI ÝHëq;JÏ&ˆå˜©^ͨuÝ)U•ñÛñ™¹h8w®P–$ž«^íøM’¨K¼Þ!¡¼`-E…T™ŽUøòëÞªf÷W»nÝ’”íÀ7Uw´"#¤Ðöù6aÄèa5u*ô¥¢³e‘^Ÿº­1…û‘ÞsJ1§ØSòå]“ç¥J#y £i$Á’凉"ʞάQ7£˜¦9xX7IͦEmbÙ]‹¿Ì§5à¸X2# „:;¢J7_ªƒŽÅ!Ôý`u9uãÀÁj»àÜ6Z²æyt ¦æÖØôÎr‚ QdP±Ûu%ÿÖz–爤ۭ{R«™Ú>Ⱥ:ÒJÓÜ‹:lEP†c%çØþþшækA·òÓ?Dòï_$ß?&‘|ÿ‡Hþ=‹ä³“{ > 1Üý: :_¸^4æä*P{ Âc‚Ð ôˆ¬Í9×bºÈhòK/¤¥ý´cº¸Éz”¹xÚÕ@—#(ó’èyM¥F,)úÑËø=Òàú–…{ ʇ­>”àÅDƒ?Ï£ØߣO¡Qbw%·¥êªß(WB¯Œ­¢Áx»ô­Ž¼ÏÔAÊUrjY‹Xvñ„ª÷ˆ«ɪȎǼêÝÅÇ œOþ¤~m’ʉ±Uï~¾²ö0¸~èîëXS$<âL<wâ0Ó_e´é"¿PTq©µC1™{vøt&B7¦—Q6¨ž`‰ýt×âÄ<îïü€ÃÀ«q40°í!¸¢1ó‡ÒôT¬U{šÄ¡7[WÊu7 8¥JߩìŒ×—¯^˜FÁáòÜjÃsŸbœ3˜¤‚ÊTùÒb*q¼&>Ioƒð•üŸZ𔯶ãP*!—8¶™… ]F/¤áÕ|:ûÑñçeíŒu›aˆNÙÁȽq£Jè•;ˆ/Œœ0ÀnS*§‚\ˆ´Ó™ÆÑ3l~Ï„,¢whí­]¡-MÃõG-.4„CLÃÐ÷-i€£’fuÛ†`JUð0†ÐyzWËMÆög{;™-çÅ|¯ÀG¦Üƒ]âæ¨äš¡#]kâÞ òštym{cº0"^Öb‚OŒ(ajMÿÚ}ÚÛO ”:R¹@’À”4uÓ.7uù'ÂÛ6MRõiE.'¦±¯=JJŠYTÂ_Î'‚šk¶Ð\1ÿQ,UÀOÏ>Jʧ2ôh4ª®S€Ñ¢µ¨ý¬"¾yÑíú^v#qd±ý”Б*wšú­¬ ŠdÞšˆÓM»Ë”ûta†Àp<Ѽ]Ÿ:Áóʪ‘/Gú™'Ø ³UCF-®TqKåG˜áXkÍ^ÓjœT`<Åp4¹&DZºvZdÕBo>Ê%B%~'atMÞ†Cï˜$^$ää¾Îç<>®tr7Ýp_~FÐfùPb€V šÔ°ºß)|éŒMî˜w6f€íh*Ò¯oliËšƒ’Ú²Æ-kÖB ˆ¨2›¬¯Yü;Ia=§²ð&â‹qîWJF3kVÿË"‘«_”¦–lK:Á8ÿsIìTؾòÀ¥è®Û5‰¥³ìQÔ+ /àí`hGbÝO‡A³ÐŒ²™¬Zþ¹Qezc‹Øfq5^µ*n07tâ\‹;[UÿÞc7ÚgüÏ~ËBÄ¿ð^}þoús4['N^ùWùU e ,ŽCë;Œ»uÙ…{¯1Óƒ©×ãhÛ¦·˜±é ™ ™ÐfŒã¤xI"“ ²Ú_»¦á›/ª•IêY”îäÒ+™Ê„ÆÙPFSRoæÙÑõ@Êè&‰¼«yèsZ߼ɔEyqOdË f\-?þúêO?á}üÔ®vKäóU›ïóý‘„>{ð5ž¡ÜX¤0L…UÎêÚcÜ ÆT¨1ëpyDDž€Am߸pD˜–¼Ö•Âì¦Búþpj°Ô˜pÍö–K†Ÿ{Þ4nÇmšG|ˆEšÊ“0?ξ¼õ¸½–¼Ÿ\&áÅ`d!“Ré犗zE¤¾´ÌÆ(GQ´™ i°”õ\»?M58Á@Ó<Á=-Õ]äÍ©}'/lhW5I‡® jHÝ|+—mÂ9A•Z,ž™g ¦Ô.ätÑJž¥y¦êŒªÊúƒ½¹Œö³Ò;7)<.V‹*ÑÄ—Éq0™ ò£Ô4ÓÒÄÐM(š”ÊyE $¿cß|cgŠ» ^ ºiÖäÔ<ã]€Èú 422j9òȼD`-ôYGzCëK*,fÜÁ(ð« Ñ…J3§k£v°`ˆ‡k=¢¼‹¥ôÌö'AóØàüƒ‰vlϵѽH„J«nAÂ÷SР‰réÆS›?ôGkX7EɵΠKJ—cϵ¬+\\r0{c–K…1 ‰ïîÒGMŸÉD8•Æ×ëÁ=8L£°˜[®’²\•œ¶¦ò¡êØêAà{ SWâm£éв¢k¬Æ t H¸¬¢²çءɿ™¾˜Á”#n7´2Õ&]hjûî X‘¢ç+Eþi'‘Ye@¯¯…ë›Û¦Òl8ƒ”ZiûëZv™#šgn?µÓ¬Gµ]–Ë<Ë`Œ o`GÍ‚O¨É˜’4FKÝ0øzxVUfÝ$ c„Eïý2µ»sSqt%Úˆ…%›xA, ¯¦ —L¿¦2îj}Õã¹ã¹Î§j÷[ˆÚDíl4Œ¥ñﮩ´Š!Ê8ÉÚäb#{%þ„wÏÌ=@Þuý;覕Nœ7+SÔ~¾Ä—¨»9«çñ² ¢">Àñp Š^“8eÕ]—ª¤ÅÁ=êÏë§•nbSö¤*yÏÒN!óz“+8Ø#Bɾ¤¾º’ÞB8"‰0•¯aæŽàÛôX>¦œüŒ×œ¤ êTÅ\x'ìÔfdqÈß^¡FÂ'V:ÙI—•KR^fbGÞ‹ lÁ;U¯íJLgË(_Ì­ºÿÔ(oí ÌsG´I$YmdǶÉÒÖ?O•Ek ’º–¬Ã醻 Jk"Ñæ¾Å<‰Y¹ü“Ee^ÒYüU•GsSÑÄÇ×F9è·´ßÑ`¤üùÄÔ 1—Ú»ÏÄßÔ d¯¶Rm¼b‹ðø[v`H'»xdÁ&%#^Õã)Y&Û·w—¶êʱΓ‹˜/¼ƒ-ªgª+cÍ*‚\¬ÄgÝËûhJU´R9{ÑÌöÓ…ÎF25tÉfÞƒKiþãËWO__^m‚, p)…Sµ¾ËÈ [&Ò jwJ Å‚¸)ìÁQÊ6± ðʦ Q[ô¥TffɈb!¹)iédH@¦öf† 8vd„ë+á-Tb¬G$ClÃò¹HÉcž à ¨Rà­þR2+ ‰å¢ÇCò0ƒ•‚ÁÆk¿bcÑöYµè—Je0,tVd³=Æ)T†æµOpê`ùšu%š#Ë`ŠJàöÁ™E:F4 |ÉjÒ‚‰»ìXs¿öÉ„â=ØÔ ´Â‚¢}ó×´Ê´‘A/ä®ùÐl×à½ÉÎJ9¨'AEî]’L—Åbs„f—Œ+öÝ`l@¥4¡iÞ[sT‡*!D*/=ÜÂ10Æ[›¤¸ñ-.íši Žœ]îVbÎf®×¨jîåø–ÈÆü[k"|ZÍÌR é©ÐPŽÅtF}@WeŸVòc—Íf-)®ðJ} c‚š$þìLðƒ‚6I˜†÷Ö(´'Ì$S@¥b …Aiî1]œcx`°¢‚Y¦GÕ&9· ÚÕI]‰{¾–ªn[Ž ‚)ŒUçÄ&‰D™†‰˜l)É/8X‹pÇÈš±ž¥¹TÕÎáQ*x° möa;•XÐm.d±\⇰cµÊåCR•0ãA'c´€þ¹¤ÆB݆–X•}Ð5.•̻谒#°0cZ­2û›ç‘:¶fvX±\ ¨¹¨aí¹¾Š)•$Ø'X..`)ë÷ÀXúfíÿåL@ò^ÕHÙm*´­*¹žaއ|!`ÜvڃȷŽž¸N"µÌ¿à’ÔZ—@­…©½2’.}ñ^²hÉ2cCåíáÂÖ…#qþÃÕ›ïÞ_nH®ú¹_þ½õâ~(@ âtéÇ瓈a—{‡N0-?ý«h¾¼¸°Îß]~Wha¿×Ù¯iÓ“í²‹kïT¯üWxŠ ç?^¼¹wT† îÑR‚NN–~Ý=kÄ××ù¯ß‚štÛƒŽ<#‚y Æ 8 hGØ j9CAwüŽÈ n ³sý‘{g9Ȣꗗ*¥b+®FÆïÑ R‹©]8NýbÁ(%ã\/cÕ匼ì[)Ípm®à»å«|Tr•»Å«Ü]•­ö@á!‹X{±˜Üã’¼s£X/ŠuÓëM킦KLw¿³tšz§O¾Ò7Ä„+à·!8£/¯¥ BÏ–IÀ2$ìJ §˜†"£wòä«)Œaìr­„iRÌ`+ŠM|õÓ;ÃË©ã°9gix¯g !ÿJÂôzO¾d¶?[ýø¼Ÿ}T³ïsPÂá˜kà· ÞIwj}îç%ß\;sÙÓ80œ`“6\*Û6Ž*÷/<1lHÄß6x©&aˆ;Ï€všÁ6Ï=tÕi?ùJORŠO~EíÝÚ÷‘¥ ew€ãc3Zëµ¼Ú»¡¹;ZF¹ä%Ýf{ ḶU¾ d$LGh%¡qxºÔ“oõ9[#B06Á8¿voT ŸQ0z Œ9ñ}‹?O6µô¦Ùʰ¢ä¡IÜTñpº}d70ämÊCû¾kkñÌ ×¦Zѯë9²î‘oôáJRü!U߆·ï«'²¤¼Å%I!ê%”gÒ™J­bŽV]*Ióͺœ€«IPÎRìB[xÊwxHéöÒÙ)îàr~ú&k&yLñb8#§”£DCÝseÄœ=f€µ¤E1wdlš(06“ZI ú3&98p†l©!‰`¼';Ý/æ'ÜБ¥+`ñÉ+g¶Úxʘ‰½åö 0bDÌY¸ÝŒž…¼­°•H¤Øé`;ªÖÅÿà·^|>²•g-HîÇצኧ3aU‹ëÂs‡5ø+ Ð ™=dõ^˜Àq‹÷È8BSœÈ’?ÉL†"‚³Š.ém+²o( Z¥°3>$æ~’ù±ñ”ŽÜ‘GtꘙNB)lðÌ'13 ‹_”jîŽïUÊ39¶äfS:’^yp(“SÍ;]^vïêzµ(£Œâ*x(ö0F˜üiô¦{Ã Š¸Ú¥Ú^ÅúË\DªÄv2Ãý"‘ÊÁó:[IDÓ©Œ[-H‡Øe}ÜŠÞ0ÁÒ‚¤7× —°:W$“-É@uyê:Ÿ\N”“†BF×{àžÅ=- Ð@KQ¯DÛ”ÉÆ.Xa ÚG–„Å‘è÷e§N+¥Êtã}%êdPWJe·2®³íz‘êÓÀ6EtV Ü¥ _¹«©aßF…‰÷e±v)Iç¾´–Œ8ÕÅÃÞƒvÑ÷?Wz©eÎ È)Ðñ@p1°¨)Á]©ýyÄ¥æØçÑœ¼h«,F¥‚K,/(xQÎ^ŒTÎÄÓ¼}ÜÂ*.„£ñÜÐÚ“›ç~ßÜd1gº^–>ËK:LxÔÄàŽ¢bú­‘0šÝsÇ0ƒ3‚Å‹C‹†¡àÂÝ2QˆÛÉyɲ‚S*2TDd4[üs•½ìÀA CN’¹å€;sžVÜâl£Ô~|óêÝÓEèbºEºÚ»¹:`ŒNèËågu—{6±ØvèŸ">€‡É“„møû…oú ×pIe[+áŽê.Ÿ?Ü6çÈYIôujÝ)Ógo/ØçÇýƒ!=` M°Ê Y­ H'±_ÈÁF6î8êik)­W¹ÂÌ£™ežG…)¤<¡­È9ðÿÚi·Ûü£q@žGì#i4(L›Rž—¶ªÛ…5¾]‰¯[l€9ûÕíãPtȽ  æIÅÅ,€(usË8àÔv¹‹rÒ “梀ӿa\¦É“‹B4qd$GÞ‡Ò¨!&â% …Ç*N¨nJî¦2™¥ÿýoc™•‡ƒ6¶ß%}JS±ñ–.n¹ž}™´fÆHÐ`Ã×!kžð'ˆHË+kn?à¤=ÂÇÇË>ü¯»ÿWÚ7P Їú¼³Ÿ˜3©ÚÍh»Íÿ¦›êïÿ5tn°‘ARtãHÙ¡PçVbÂd0¸w­O³lUœXÌÌŒRÎ&e•–”Y-‹f¦öÀÂ:Œô íݸÁ†b"¤³&¯uZV¯eµ¬“–u¿Âïø S&^`óÛŠíä505¸Î°Ô†Ö8µ›ˆNÛ›!|<͸ߊ×Lm 0É^ 9 ÌA~y£bÕªÇg¯ÝÉ5qÄõlÐмVGå‚nYdó“±=|š¾>»ùÒøæéSêÆâZÁºâÖç3?6›N÷‚6¬ë³#B^•ìløT¥roÏ¿‹AžÞ`üþw²¿Á–1›Í f?›ÜÒ®jóó=˜Ú/¾Øê÷nþ÷_¶ïNÆû›Ü®êêOðÍîˆW5ý·­7rbf®¬¿Zí»Óv½·¿$$ˆteÞȹSÐe§A´Âļ$øxÌÞÖžiLï³g®àÎUjz–= n¤¿>žã{ý–ŹþU@œ;Ф7Õ×Ê»]&Ì¡ÌAº×Ot~˜Ü½Ž¡êkÊAW¼ë”PµÊtx¾Ä&Qþn‰5Iæ‹4¢ æˆ:ëþþíSÒ32Fä7úíÓÂvë1N¿aÕHÈ㶬EªÍ³Ü5ëŽ{xüã9Ž6å{Ñ)Oî³sÕNÅÈeŽº<¦ƒ>lâ¢!õ¹´ˆÙ¦ð“?¤j{b#2®áA­–#õÍïÎ*èB*Q/¥Š¶þ¥CÊ(ÿz˜r–% «°"¤Ô¢ëÙ{9ë-S?ƒâiI°RÂ?×—xúŽ·‹Ü?'í™îÖt‚јB£°a–ê³²fvk–ªœÜ_Í|º=[•¯k3Ç ñuç—_´;X™ L©±ƒñ( âäuœ‰¹‰m£o}X$±ÐÀfù;¤ÿqƒ‰oßõºÖ5\þ÷Yñ.ÿÐûØZðM÷ãf}wÛªo5Ñ‹úî.컽aßcè»H¶“±(ÁÌ·qxÖ1RÇï7èkÿ¡^&/à¤À”!l³0¸¡„aÛê>ëp|…ˆ1 ±È(•°ç ç’q»Xòû×[0b ›gõ ÂD«Ï.yÉ7Ö^ŠZ¯Gy¹R7»R \8ÜJšÛ-ËÇì@®¯n'Zžeª(¡8Pj•r*b ˜ŒïÉP?:¿|ùöm¢ü((7uÀ^fýx‰|ìvú£3)"•ö\ ·{2ï@Fö@Ùï¢Æßëà_}ýÓþuµµ(KÍ »R+Ó[‚ŠG¾û(žÝŸwÆkú #°Ú‚•OlYcç¥[®gÏ] oŽVŠð_Ìx’$MŽ‘˜Tj€Œ*FT| ¿eÆD8ˆ‘£==R-F7u1sE¡Sô=ÌyÃãËØHçúUÐmé¢õnê‘v¿tûÇ““öÑQ¯ßîuº½Ó“Ó'ùæÞõž ¸±˜.™D0ž|u  % ./œ[0ʱ+oïqF=AÆÑÜÏáã§î8¾'²BàCáQˆR"`Ò]»1}oqxâ“n-›ª]bkþ …GÂ3aWžºü$$·§I9n€2Ã{ÃTA„nPê£*±×—E ò²ÄC3-ŠøfþÚöø±§MrT2¸Š5²¸Î¼µ'—4Í|¢´¡Tßø®RÔÉÚð¨ÂÒS%cê“C÷&{>Ïÿ~jWR؉L€¬6ç5–¬!_>Ýø\ÓæÆïípbÆØr9nÊ3 S‰;ûÇßÿŽ_aOUÕ…$bÌFÇ¿#ꛓ!bÄóé›+ÆÞB1”D#Êëb©(§î§Cš ?ÂØ<òuȈ@$GÚ*í¼xúÉfi0FdtÁ0Êh¢8ž§’|°Lþ÷—Êÿ“ɯ§ËO)y;úzGɯ#Ýá‚;Xä;ûêY*ijº3káàJšÞý|e½F¦}M¾¸òdÕžY;*©´,_úŠ_÷kR ·¸˜åytÂüçÝÅ`ÓØSv$Ó‚óoë-Oak5ðHU=5g•à‘_‡B°ÂêN¢jiÔÃv€yØ£³ïˆc×?Ç ±)–ÿ ëï'Àõ©«ígê¬ñ3@6ùOì:êÞýLŒx1œæ<²Æ^À®H:ßøn=t1 ^»-¤óK…‡(ƒŽ67ðõ½¨z˜¯­v¯}–ØC1q¹Êx*kdÕ$aÛø§×n?³~þyáÿ…uzlu†Ö¸mϬnÇ‚1hUýPýññ¯) ž;é@'ý6Ù…úÿ}°ÕÏ]«?Ä¿õ·f-¼×½ü‰þ^ÔI:i÷Tj²¯~…ÏÁ.=J:<…oÓ#ùÓaògQ'=ìD7y‚ÿ_¾3«-S—Iõv¶Íž`Oâm³ à¹aß:8Hý?ÏKã~MYw¥À‘Ö–Jg0×'¥RúxÉË¥þÚr)r§s.£g‘é­jZZŒƒÌ'×,Òuv‘ŽNF# E÷¤Xz]É).µƒšká|©L¥ĵ«à3\©<ÚîÒGEæk!™ôªR7Pu·€‹¬¹ÿÉ7zŒt ÂÕXø„á¯:•E¾Ð¢õà?ìí)Ø9ûÚ)5ŸÎPí±×ñ¯ï1zK´o^÷ÿ¡‘T*»‘"(³¶.Eú»³Z¶åR{dB¥WP)%í¥²$¹5!$YXÜ[Ø¡FòO.%v³ÃQíHç篱´Ï“õÄÝ–%Pz;lQíÎÅÿÈäQ·¢<2®®s"©ó¢@$Ñ5³ÚÚÝ¢Dçe¥áJз"lç:VfØØ?› Ú•¿cºGwG[¿á>ðÇ->:ÅÔäåÆñR¹'pÒiQñÏdæìJEÙ®‰@‚ ³#Að¸îÆš ø<ÞH0¤c/iWwpWK\×(Q!ó–ÍÈËß÷öݶRÝÞÙÉúˆïžz%© :Ë' qV7 ÜÃ&!Ï-ŽÆ•úrj û„ðÁé!Ø1Æ>jGÞkÀ3ã…iàqàËâg#á`,ˆQo*{EC«39• Cq'>e×shàHĶ멡ë|vl•/ƒ‘ºš…•¶ˆŒ˜è:^ZÁÈ“áäü†ýÛafô„ih®nžÌÔäO2¢#NƒÀ*à¦5Æä7,›‚Ø(TùNe”ÂBÍ\kO"í¦Ð·@@JŽÎ<Ö™¡xtè`Â[Ä¡t ‡r(³ðhå±ìnÜD’PÊŽTB) ¹’}äÙÍÕø’B]lN:‹Ò#NMSñ:ê5QWT !ðÀ‚é°s¨/L‹‘çƒ(€c䎊ý–™ZÉ5¿ÌlÄk;½–t¤Èó8N èçZ†;ʼÏdhp*{$%“UaˆF° ÓLðÅ9cËB8-<"o9WUWcËœÁ VÐîôïûv,îæ­1˜Úѧ§ŸÿÖn¥þ÷·/óT¼îFŸjÆýÒýâ‹¢õ]n fõöm]=uŽJ®=ˆ#û3ŒìÏ<²?Ž,½Õ+Ù=[gÿƒûñùs^ÅþX¦Ò\ËtCšB º*ÚÈÅ/Ò—¥Ÿ.³ŸhØe¤5(»C žûÛF.ˆ^¯Ps[ª½/7‹5Çf%U6+k¬´²…dNë§1¢\ 3UÑæ_ô!œdE§uxfjÇœdÍêBõÝË:ê ð—†å]ZüPGôçÑ­=Tçãk§Ç¢ó¥`£PKÐÐl8ÃA_À㺎ÈÆ)×Þ;ý\®Æïö÷•_Z ÙÖüh*¦Îì~OÑÒxÔ²N‹Ú.%j—ÖáÈï…µÁ%êZÐ,™PsâI­JZj-QYYÿ„ñܰ”HÑL/–éùZî4è; Š%̲ùBÛðäÙâÄà;Øg§b§Ý5;íb§½ŠbÁ:ö¨ÓãJöÖ‘ØiŸ:í?œ1t”3xryµõ[;xI8õxŨðOdYZNÁÅèS +°R¹K°ÊËLq7 |ÁµlkhGâ˜_§ú*L(º!u}'¤K8*<`ÚÒúpMXK)0»tw5L£T|g9ao-4ÂÞifÐØcà¢Cë‡tÊ3R·|Ûäç-ë Óå2'®“|ˆ(-Ö¹ÏWÃ\íAN=¼uŠ®Š/:ÝšØYâhYÃyL^ Žž…X-Á‘ Å6ÿŒç_5G~|@“¿÷¬š¯nÿ6héµ_i¾´ûE4æªÂ\F>óc ª¬ kâIÇÂÇ¢îÂ)xÓ &sÂwõ7‚}†Ê€M”b7Ti®®(ú¹‰·ÀÌŒ­Ïa°¸ž‰ë&8«þùÔ; fCD„²ÖoaŸÒòmÉÜ»0)Г@ÎVg)Ë£»Áú@ÿc÷Ž_Lû2À°zÞnY`[=?>:ê!B’e˜«gV¢ÿh>.ìµ´¡žð\ƒ#*KÙñìk‘R§=9T®2¦­¨aàöwy­£Ô£í¦ùí,› —=Ŷ8’Îè1äXŽdÛc8îXÇŽuÒ¶ŽOñçD?5è)XqQ¬v{Û8ar*¶ž„“€óàXÇGÛÎß‘CÚú^;>³Ž{¸®'}úyŒiÆÏ@Âúº uºhûŒÿ{`÷W÷¤‹S‘ÊÝì¤~5÷ù+ëÈ'xxg¦Ž“`¡í§‚Ú¥ƒóÞ g>»§º“d›¤¾²Çº ¦FGÿ~)ÕŒ,-ûMsäšC/ÖžLëëž5˜@Ë“^“%GPLð-NÒNU~A+.E¯HŸ°ÔÎÀHR‡~ÉA i䪣Õk/”|=;*Ü#Ń’/Œ*y§ú¨@% ‹ÕOu²hPüvvLrË_)UêÅìØâ[áéÀã²ÃC@¼*XʉýÎBNä׳ÄM»€ù…üð’W²ãJ í”Õ±õ……ÿEý…ud=·ºgI%Áéyí»N¹Û¾eŠæ“‰ˆbóžÉ$$;\(&·‘]Æv„TsHåûèØtòkØQv„<¸Ì~¸e*ÔZ)0å¿ïè䎼 _ÎøÝšÇ‰Ós¨|¡®Ã;7FÓÚ¼ˆ<´.Ð=Dy)ÐDÈò£(™dY9J³›­ázñ™ÕN€•މCëùƒcÖB‰ÜyÖæ˜„„.L_IߪѨ`}72ë“G½ÔÜý«. n36$á’]9ÎÜDZCµ+9‰«p"ÊPÀ¸Æ)(.¼Ûƒ†ù0ü¢¨´ƒ¢R§ÑpùQ¿I£Þ6{ö¤~oE®Õ´²¢\;MI0 /üÇ7ƒ×ƒo¯.sSÅó+K‡Po¿½ºøúâ}êÅFâE-9ÕŽx÷‰ã¥DàWècš)ŠÒc#'t‡(€³Ãò€ìޱÓ2•?Ò±ð¦„,/J‡Ö¥‹2(ogZpx‰ÊbO•Üjéò²2^UI½D ê º÷-!ç·?',I(µÔ1t–"[¥Ђ8 C†XØFF”p<ŠŒmä>ul$)1ó“¤ "U%Öºqq繿ªŒ…ÀÓÏÙÖ-¢UܸâÍ[º=›‰¹x ŸÕw-XkЍ­Ï  xÚ`:…ócÀås(ºs «1ãne>´¬ ÉßF­’°ÍÕÇj¹AË! duÿÉW/yÖ ã ´:øÃZ—U™‡aðIø²Âèm°4bèÆkû Œ¬GÏú -…t$R¾éyN¹ïûÉ ½º˜_IëŠeÍx®ç‘f<Ú˜æEW$‰ö9“…‰î=k'DKO-ˆÚ}@z‰»¥‚gîµ=W§BfÍC„»1ͪa }ƶD80I@j˹ý_$c‘¤­Å©ëŸbÀ¡•@&ÑÉ€Åê °¤JçNü@±ÇD´DœÇ?'.¤»6E#y ,uø•έ¢ßQÚ9vT2\¢œõÞ6í]ƒþo~|7èZ(Xžö¦µG‘ó°Ðøâ~ö¼£Ùü¸)%Tl3Ù]ÒèÙ¦ö4Êùq·×§cê«mÚMn:ws´N7¿lÜÍñ:Ýü¼q7'ëtófãnN×鿇»9[§›Ÿ6îæ|nÞmÜÍ‹uº9ظ›— ºq¼Àù¤¯‹ð´:|”³UË'ú¦½¾*ßk·¾^/Ê÷Ú«¯××å{í—ïÕüDꎑu×;¸{Á—*SûÚŒ~ĶNOûOÏ@‹#k*“ÏHzì®Ggì]Ÿïcl?y2²Ú˜eõ¿·÷ ³™lÆ{Y£>«ZùŒ`„b:Ý 5;=ÍQ¨ÁðÆÕ—9žDÇ$œÛøh`A¸¬«±WÀ4ÕÐÂ’R‚‘wˆ£(«n"² ª®éÆñä{´šñ³#ørÕcÍ¡”Ú¥”wÖH’û¬ÕÊPbx¤ÃEÙ‘xáhý-ÒEV:r¹àF†vÇøÄæKD¶d%$vaO„4@5ªUÆ÷¬^P¹ÅjòyŠ×š¢N}S”DCggŠÂÒqÓŸ÷‹g°¿~6}2Á?« N¼¦™¹”Yñ`BQt½NŒoYíNËê´¹µNg½yì¦çÑ4aMpÑ‘!gH …¾žªÜ,žÏÖYðV•è.*$=ÛA~Yg²A°¾<¸{­²$Ì ÉhÛ"1®òðS™ÂðOØ? Æ3KûÙ5JZÓÑ® äTic+¹D2Ö ì颟ÑQ$sO´;)J»›Ìevêqº«ba­Ô¬rÈçä6M“Iá 8ÅÂI T“TiøéÄeµÊp˜(Bä˜1È“¬2áR„O ÈœF_:P1˜E¹`„-ºâ_Ñiùù™K¸â±¯eÇÜ»­“`6#Ä ÓòH6K+ž¾¹È`$ÇöDCXÚYöf Í"´ /¯ªºv[úÀ©ßÑO®}—®VAÑýÈÔ7J‡¤èI[§ƒÕ ÚÊä3«ÓÃBt½ÂÚÅ5¦«u¦NOÝSw*¤w“bÔî$áCð´SûcŒ ,žÎˆHêà‹1Ï¥‡Ç¥t38v-Ÿ( m*þÿt¡Ýö«‹‹Cë ž~YE&åV ï;¿GצúŠ[EØàÕŽëÏ ß?v½ìdÂéd³Í8Î| ëN5Z³ÂÕ–ÛBܹQ,Oj½¯,[”¯])²©ÜzÜZ/ùNsµÔº„“bd‡£…!2®„~‹þ¦Ëh”u¿è–B{Ù.‘å1#«Û²z-Toe œ„µΗa¿ßç#=ËÔŽ…X”Ϭ )~xDvŽONNº#ŽçÓþ²åVúaÊdMꩇ( ýÖ(¸õµ „` »•a郥3‹ùq†Õ øRžˆ¬=¤~É-2só«ÄYRC°N<%0ײ³léöÁ]7qJ¶Ø ÑÒFÍÙü;Nðæ7Š ®A²ªS>›lö²¼ãM]@†iJ¦¥Y0bÆGÒ›¡*[¥c}uDK©rÀt¸S×#ÐKikÓÉpê>ŠG½¹ˆrÓ”Æh,!ã4Ü<=žƒé6b¬2ÅiøîDv­Bß(»¨¦C߯5à—CK‚lIxé0Ü0’+I/“/Ó•?#W+¡úáßmFŒ[œ¡ÎgþŸü§-©ÞëÓPͺÀGêéz´¾±äg -»Š™UÎjFÂë½t^†VWˆŠÈ‘ê—†w”€= \eïÅ>Ip,6c©Ù©}çNçÓÌ[‰+˜¼—¤xaDô_æŒQS£©™-¼ÂW”+Íõ<8‘ByýôLxÀ0aµ´ä &X©×ç~ûð13Ÿ£’Í¡/|qC¦ÂY²½ Êœ{ÇË`¸dnõVÎ2'¢ …(s!Ó\3ͱ̾ØeÉI‰§n^àÛ¬j4 ÕˆVêCXqølqá—ïkàÙÁôÆ£6Àèqý=rÊqQ›Ï£NËJý^”dU€Óè^þYF·.€ÝoJUPÆž¾·‡o|¾uŠàß¡+ã‘nÑ#$Œ÷öàELúz}pú‹>žÄ_Lô~yÿrÏôñº/‹Ÿ_öçzª·pï× ÌO+ŒxPL6L3=ÂY‹°èÏ:Eõ°f¥ž¨‡‹jÑ£ð]¹RM²r@xS\8 ߃¤Q.ݬò¨å úï<"†Ù“®Üî,b7\>:(šúü'ê€Þc1ÁÛˆ€ú¤˜ [–)ù[–,Ô£ÙoJ§Âê°‡ó¤Ó–nïÿõ¯{Ãe>Üæ6–ó×þÒzú¹e#¼O‘…€Ÿ?­sóIÞÎÉyr>V)›±E]ù½´âÏ=Õdé$ãÿ;0ó¿·£ºR L ÌŒcfE8„·Aø‰"uˆÉ(ðÅ¡õÂŽd7©Ø÷Áœë£bœ} À;µ—»K¦TÄ»©G4ñ—n»sÔõO:^û´wö$?¢wý'Fx¼ä6°ƒ2ä½JΑh”Ù£îrèîaµÞS&+‰Ui˜) EŠÀ:‹MÞøqrB”¥C'NÙE#qwHëÏút$’Öä%žL¥K´~ΣÔJÃSa"…ÐLy¾Í›¹§…“[z²ß{Æ}Ú½«£(è$˜M©^“§qZ©†¼†è˜©B£œOStJ/kI*ùJ® ¢¯Ä‘q}!?ß#ÕYšÞÓÝC_T¼i3¯‹€/Ô .‡™%ex¯/ÍJ÷¾ÎõQêZ{誢¥õ-‡¼Úa?!æPB'|˳z‰d±Ëã€Lr#â+`ǽýÃ%¤&ì>Y·,ß¾Z/Y¥z9È9…ôÊT™÷Hi¬:ÎD.\*Q ÔTû€†«sb…k‘Ú‹`Ÿ=lìã“£n­E°û²<5o-`ä'|›Tt?ÿþmaÃ˪^6»|äK‹]Ó¸ŸÖ“XnF>ȣʎYJ#¹2ZB—ªÇ &œ:9OYG°+슈’ss|Q¥Ù$¥£æ8 #ÿPd|%£¡eJV¶>‡ŸµAú;¸Š>¿ûe»´/2?Ie €¥#3F›Ý†J²±  ò0ñ.\ „Ÿ¿ýáÝ;kqŽçÜCëÜz;¶’_e,ƒìDG&dÃcQσ¦X¥|†…ƒY3RùÀÈ™P, )EôcÍñ*®h"|Ê"§˜‰ö}½’x[,G¦/´ëx ·î0`#Y Tr7“2†”çøŽ¯à- €‹#MBŠãS&n#C9ÃA,›e(#”g„¨gÍ%â_>£XÆÿ…òbb6àì®,%‡Ê¥ 2ì ¡ÚÞ nW¡2éyRï@6d.8&0ä+é7 ü)•IÁj´¬’WU$2ŽwO8Ÿ1P"ôƒäž„öÔrB;º' ݈µ æµ½Hcàö ïàåæAâ+†û´r9ºŸ3ÿ8°G£¢m£|Ò‰ÌnYéèàNKr“GCþÁS?n\ý/çdàÐîȈTTñq)ËwÝ"sØ:dÏÿNx¼¦Í© 0m ò™)X;Û)´Cá_F)œþṵ̀'ÂiL9èÀŽ™DW©\‰˜ÓÎ ƒùqûòmSËÄp¢ìºg;^þ|v´ôë^§_/ÌîGfwÔ´•ŸÆ •sõËÅ3ëÊñ,…º{yïÇö]aƒ‹Â¦E©øæï»Ë§¡â×ý&‡·/šàÝF”/M€Í÷B`ÌJ$±vp+× cìáÏI¶bXîž8œ¶¬Iü +)={öô5ˆÕ§ÿ}îb*& 9U8n¬¦5c¹ôzP✆$·ol×£ÎP–ÀgîÌLçá MeäÇY{ùO·ºÄp–\r´Ãë0˜¾“¼ú?Ã*ÒQR®óŒ”¨gË'äl•0·>Ë;- ìïµýùtÀøtfÈÏWü¸#²/¢yçW®o”ã}êŸZæ’$å±<”¯ò±÷èøˆDÚ©¡¥îZ-%àµ+6Ž^IX8±j%?cÂJMÌv7Ý5i±…}Ç '[O×½“âHEC(ÛG>Nf «˜aS] >âý!#ù>Û%U’_˜tE·ÑJYE,¥=íl³ó`SLR¸õíøÓ܆þ'ÙÃgÝMöpéjøF~ë;Þõ¶WsB’Dz··UŠ’ÚÔªlgHÕ†òV8& ƒÕi_ß'QŒrËïj—¯BRÿæ/X»?äÁÏôS¸‰¸(ZÒ]JþQ¿¿X‚`bÀ·ðÝÅh"*H ê„5ïÞå ú~b§K¬ žÅH"‹_»“k3Xj‚g¬1Ç5ÓMAæòšsõ@RÓ¢§/{8ñ¦ˆƒÙ!ðØZ;„¢mñŽœ=cUŽûd6•S+iõ™õYòKyê¶¿¾ÅM]{`Ün]ç±o5Yÿt›`­×½ N¶» ‚ÐßÁa{ ñm0ªe'P£œUÏU–¡mÐöFB)p¼pÖ%cva×f>4§¶’Ò-ߎ­9¨¡ÊQy“؇éSt!ÀYñÜØï8(j4P¹¡¹v° ì¯k KSÞ2 »žžM“5³ù’ƒ‚PñJ!”QÑb:‹ïåEC+4­rçÌð“¤gj1Â1J?_^^aÓœBªƒ!³a”röm_t$û%ËPÉÈ8²zDÇ{…ÈÀ;k­Ã$Á€ÃK¬1!+´‚€hÝ(Ÿ,ÉêÈ—>À–qñ‰¿u å“•k¶N)œ¹ÂDêšO¢p¥É‰‡‡o^]:³ùº§gùÙAó4ºuc ÖÉ€±ãñàgØÿGë· ûêóJüfÈõ Ü{Ïhi$C’/:Aæ Ö=õ· öÇ—¬4YîðÖæî§A_ñΧ3º¸ÝˆŠÆpЏ¶õÛ¦cë>IP›{C1ñy8¹©Ã…’¤J“MpÚád®°-0íV˜‰ûD¶äçÄߢ*á=\#D>A ÂÑ  IÎ\ZâYo#ßRmJRFûŒkŠÍy‡?òÀ7¤¨×¡®™êˆ|ºNº”çPv© PcÃ‚Š¸œÉ’›«ô¦é¬L_–=UË»ãЕró•Í<û^¨«°-ÉP/Áò‘J´wOš¸ûz´#Å Ï­Ô{p½% ƒÙ˜ëãºÊP½:ÝÙæ¯Ã§fû ’¦¯@SÂPŒo¡Ãºe)*`8jà6Þ£v†ß5F„2]¤‰°A²ëoÌÑÎc,“nrÂm'{¸;Ÿ¾ÆOËÞTÃèj,·7Ííhê ëÀm°_”e%ãÀžTŒ£¬5i àiÝ}¤<³>£‰ZË ¶Å­¶r½ùÊsj•=¹²çô¦%Ó‰¦Ñ6â³÷~|ùªe}O¿ûùŠþ궬¯ßüÔ²~üåª((¸Š¯g[ãP4” |¹}èMÜÌM\wxù&†%¤³´ž=¬¢7Ëïa½eÕ¡«ƒÍ‰Ot~ªî‘-ë>å‰^?0 鎿‘’ˆ,:èåÚñ×L~ɻꆊäßÕÝjÿÍúí3×ÂÒ$rWYð f*[îß*9å„.™Oè·,ÅE˜j´ 2AvV>.ªó¤”Ãmû–áëÀßP•Ô:mB® ‚w(\€•r¢ø† GÖœ»U$r ‰ÌpŠž˜<”k#/kû 7ÈôÃkã ü°n»/Á!Pg‘¼ úÇßÿ;}ö¿ÿ—5 îšqsG+TQI¿ûì«9zH¶¬‡¸Sêf“zõÆá7öÝ;¼¾~0KVö¤›ÝlEO:mý|êÅ:I;àx$}€%¼( ÃXæ$? ã×F^–õuà ’ÆïÄ8þ_)íóþÒTñçdrÓT•†éÓ–EÅÛÑΑ¼“—y™Yz@款,wÊ–t¡ñ.@¸¡¸¢8§·&îÒ©+7»d£UÊÓú‰H|䉟å…dÖˆOØðéIβ®lµAbu‡·Ä³Ð…æîÕ%±*¸×n]Ùª'éAOúHËŸòºÑÉRP\®ÜzåèBŽôì(6­±õåèÙŠ*ruqæ]ñÚÓT=°Z‘°"Ýs·,¹ZFº~E–,/$9ÕµOîHZº~áÒó\=$OV',Ç“²É‰ITAF•ïò¢6jìÑ]œš‘ž&é‚(}Û§Kð{Ï­óƒ_0ÄÞ>øµz€9Ðóß‘: ot¶Àãù"ÕÂw‚9Ö(J°p'vðê÷^ ½ûãÂþ”X¤+{X«?-½Á€u âís½ ¹C4æ˜祮-µÀÕ°ÉN«HìB–Æv‘Añßß»w‹~ðÝxKv¡þŒúÁŠîX»'nVûìnž•céyy@Ñ_mYu[m˜¼„¡m+8¢< Ü–Cª†üšÓñ€¬‡4ÖA]–ùT» ƒ—±˜F5p`¡Œ°ñuXp7~/"k1š3òLˆtÔB_Ž UË „(Ð_Á>ÖK¨[²÷+ð•βwñPŽciÆäVܬd°I Mž¬¹©;Ô§¾ñ©üDê:ê‰Èx"WÜoŒT©©Ð\ y:Íw©zÀ}¤:וiËç A« ’Ë8¢_Dl× ‡ÜH¥Ž5·Jö¯í¬»"©Kа¨ö2^hJDn‚¡â™#q­±Ÿ»ÔR*m'ñHv‘L-Åò|-¤eY^7Ú¤c ØyhäUмÀÈ8(Œ<”³³nT÷@íò麫ELªF›$ƒØöÐ;‚ÚBí^ä[7]]Ô ë(GÆÐß#•›¤!7ˆaIw–‡Í©{@™ 4ÂW§.Ï®Øn“d*ŽåµgO±ì-6\·| Ky¤ïö"˜]™0?ÆÞeÎy"Þh ¿2}VÈOS½VŽÒvX·,½íõ8NÃϸm8›!hSƒÚ†b‹¬»5˜‡ÕËO¾É­¦›àaÁJð-þb)ŽDtø©s÷¡ó¬úño›‰bê¯|ÂZo'¢‡¸5IL«¬«<×À±’o Åñzc„¯Á¦œ‘š­ÆàrÔv6ãÚ†¹ˆi`—NxÞÐß·?ûÔ,‡#Õ”Ä{…)Ó‰‹Ž9Ye[ƒÀ "]ü]àcsBøÍq°ñðDXNT<Ãé{–ÔÖG'2ùs4åš–7M}¦žË°è­ oæ¹OpŠ  ³frbn~ˆÙgìƒÆð¹9®»˜É‹ç±1býÆ]ƒèîfÒýÆmšlÏozv–·3iŠÇ ÛjÔ½õºŒMЬ¼xHžÎ&H-¡7Q¼»Õï¿¡‡9ªÓKIqç¨>ßÉ-H9>/˜Fм.Ë73"zù®)ýùæ›§ÓäÍ£¢­8öªvs5qr'—ñ+Gasþóxv—á‡ô¼< €¯‡¶¬ÇV¤§üèFîÐ[¹rIxÐüì{)ýº9(>Xꆧ¡øf%;G¶“ Ý܈¸’F#ôÖ ù ¹2ØT¡°”IÒGM0í·Ð`p‹·ÙgÜ5©+uJæçô¶*YYyy»KŒ©•âó“;Нë¶ân±ÑʸyIÈôæWš&ç!ùﶈÿÊS•c¿ÛF‰@≠´üfzÊ.l ɣ©ÙyH9\›²ŠF‰AÏ%¶²$I^Ãy‘¨\ÅzŽ’s¸8›Ð–ãÈFáâü˜¼µcãü -£óšÞ 7b•ë¸É,äÃdf2Îv\ª\ˆí¸)ÒpQñÊ:d¢n;2‘¯1õÝ €\?‰ú¦2ª UcD$šÖfqTƒýüg®“½À&ßuùl³>öºË·ËšØËw&•ª÷<Ìè‚ÿâz€Wd£œ|‡aÚ“tt±›Ýv Š(ÄÍœ;ö,µF ò¢”ÒÁÙ"ør(’ªÃÜxåÎë9a泑á„Ü4¯ܲ 'YYB׌âT^±¤ù¦(@rh߇S™Õµ¤Y}ÍŠ(úƒÛ&JfºáÜnº;n?ë?ùÊÝ¢dç¡]…¶mA²Çخ͕ÿ`ýGÓÞpÞ7)ý݈z¬í†GX^³(6Š¥v|qk5>K/§r˜ëñòEž¥ˆKªd"úóˆÌêà‡¥!¨¯¯þda?–3´8uajÞx# ýÃÛF\–éõÂéxP†)IÀv™B¦¡³ç¯™íFBÕŽžH ×ù„ç³ œ{#á:ý‘åÖQë¾FIOÎC0ËËs ·ËM¡x·s(|Q}tN¾µl;hÞ±dÌÁƒŠ—õèØ._DÛ¨g®ÙZ7`TÄg¶šùÞAG«×nÜŒL½X¹ 2°p–ò”uº§à¨—, H÷@ݸµ¼–€IÍOÖÉñ :Íxî³ñg§Q¬úgߟ ]˜÷DIB{lñ} ´9ÖCßnÝø:±Sª›È[ñrZçh À äñPÝÈòƒ˜FТ±Â@ç^,‹›¸\„Ÿ…o¡5Fé‘v•‡mÈrÙ°mÝä vñ¿dÑ/FÍ1ƒi ©‹«EÌh‰‡ºµÀÄå¥cÅÔf œ@2S×¥S–+n¦ù£$4¿ì<rc|ûêÝÅF­¿Îü)lýÅ—ÿ±Që½2´wõæâýfSÓéöúGÇ'§gç/^¾º(&þÍÅÏ—WçW›MO'ó§°¶EÏ=Ïê¬Wm¸<ã“ üÓ´Y`õÒ¿Ê‚ÖzÌ(OJ¸ýç;Y™pOy4ª¶4µ‡Oýõ×ÃønÓhÛ¦oJ¼ÐØñ¦T—{âN8s`!Oì7l“Öró÷H7)Žý¡7é÷Íšƒà½ \ö;Ý»ôÃn7°¼Ç{T›¹Ö‹ÍǶ›5<ô–Þ„äßÛ®µ¤zÚ{×äêæb'› rÔ%DuÚ%ëo™S¶Pî™Å±YÛÙ±I˜Ô7…R†?‚&[œ=n÷dë'þÈ| .±-'nVÌ5Rn¶úÕP(Wß:d`Vš~é°…ËDõ« Ãv{ɰ’_¾µk-ÐHLƒÄk€ߨ³~ÝGRC^&øÙ¨ƒ3p Þ3±l3રW~Ybm›L—<×<æ3æV*ÓfÖæa”¼ETž[ýv[êe²I‹¾·øò¡í4âô¾²‡çtÍ^«ž'oî”¶Ç•䬽öáaRí Ó<ŽÕÂüÚÈ™ á£úª ,²šVU µAã,EÒqS$ FG¿QáÒµ>ÙrXCÈÏdÏE3á`ô™Âwl÷OÄpd8J¶ü¨\Djw3bIs ±&òâAþ;µ ¬Çº€sõì$°ueÝ„V…3çxŸêbätãÔðnXºœ$®}:t'ÐÓd53>•/À2ÂbÃc˜-V¡µmoÍó(Íiê‡?ñ‹©ì4ãü¯9$a7k” 9GV}™ÁX5þüŠÐË Úœµm@>xâFx™8å:†nÔ<3%‹ã‘@’<8fI+ç¨Þr¥ˆ¨n -êL”4¬øÈŽmkÏ=‡-ë:¸µœ`ŠÁüxƒèÆÈtˆ×Â!÷._óXÍìH FœË ªzpHÑ{ÛŸäúz£”%H%K²û(bµj ë½]c%FƒëÐßÝFp—Aˆ0«Û9i›aÜ©kÖ^{¿e9«‘Z{øq Ïíu›'ÐJisÖ,ˆ\ôÉ—\ômèm»ñí­0‰Û^^ãf¨ ÝHÜ 8ÃÛžq‡:‰´hã®#¬ÇÀplïÙ½,ÑŽø¸Y …Ùù’£–0ÝòÔA1,úO×"ÖRº1 Ý'ÑmÉÄÀ¸U§A¨áöÆÀ„Á­ëOJæ ¬"r%y9Í•I¤ˆCöFblϽØj—’%u¥Ð&S$Á‡‚<˜/‰ÀšÀ̼´3:§¶.TC4Âïît>=`É}Œ˜ºÈ˜Ä»“1ÿÙ•#7LM$lð[;ýuh;Ÿð‡„8ùM=”­"ü ù]¥|)™d[WŽÇa°%ŠÓÊóž§OòL÷·`Š®nDï€T6僌ʶ¢˜6Õ–‚ð-1Å÷VÜ ƒ¨”ÓLÔ4Ú«@ºÚa\J(EÂëÖ†cM}¬;–šÚTø x×ßx×ÃŽ]ùjVÌJ®13ÙBA ¦Ts°þªÎ…äeÉ<‡%RV­Ù9baŽ=׉a–ã[ÁA5C“øTÑÂQÞ0;‚Eýž3($Õ Èühý¶žg…¿už?A‚ÄWnºTLm9t[<³>KF ¿Ü$·A+\öb¾”JuXøÚ£ZAÂûãKoç‹b8ZFEÉÖ·îh"ä.å8$ tý¨fñ;ÐÚ¶|Øò¨`1¢’Â#$ŠÙ$þ÷¹JEhOëžÁDH+}É3nll ûÅùb×8D®Ô‰Á¯âíF^ŸzL3üžDè ÐÇýÝð¨FS4&Uªœ(0qúÍØXz_ÊùHüe.|§®»¿]Nð…_»­8½Øá£ŸÜË ×Mñºg7¢–é%)&ÆðÍô‘G5Mèm¿¡ÔÎ…¨‡èÚ€¶ñ0Ÿ‚nìFž1À}Ý# ÂC9­]#oú7Á'àL!= F‹p¢¹9!üvLN'iˆ´[Iµhå Cu¨â$FÖè–ÇîÝ?®u @/“i­X+Ûâm‚¹8‚Z}mä]Bí5ˆ•&1»ø˜ …V‘¶è‘Ð4aM6²ˆC#Ô–Òç›Ï ©õâe–ü,ª!Ù'=ÙcÏŽcÔ¶­k”ÈйÆ6SNŸËË+˜^èÔ#í€ä<‚=•™È ²<2Ê zt³xI^«†Ì¢v¡=ºYt'¯‚ùÐ/=×ù´MÇ­ ÄàùQŸvš *F<’±=É„?Æy݃.œRÅ‚j2¸I_süƒív–ç~vžGº­ÙÜP¨&s]ÏL®ŒAôá4äø4™øÂN]­¢5 æÚ<5/ÆËYØSuuöä+¼Îeí1´~»±Cš;œD«n6ŸA[Ö¿¶1XŒÛ„«†¯Ép Õâ­­Myuú¿%OÈ× é¨#ð,=¥¾yûùçŸ[ïß÷þ™Õø9ÆKoWXèÖvŽÅ‘šsZ^6ºÈ[¿YŸAkÏŸ[mkóå9åìÝ,ZÆR½±? >Æaªû2z„JnöÂ7©4¿&EÊ’+A“ztª¶3¬N• ™ÜÁ4ªã²MêÑL£RLË̤zv“i(så(kÔ”6T9ê*On]gfr ]ܹtMÇ*п”§ð¸JÆC§¢^ÅX„xÃ’SrùY!uבּÖ‚8Þ£#PìÔÓ¯Ÿ¥,ߢ®‡ñĶÒÜ¡‰‹ñØu\LÓúFÄ×Áˆ´^¹]‚?©Rg/%üæ”Q¬•ä"zKLE;qk*Ã"÷Ô%|Ñybvs?^òãO–µÞí¡¶ £óï­÷CáyehêÂòœnläÈúÆuÂÀz%n\£ÛÞúNm˜Û@œi¿eµv™ôéÌÛLîáÈýw{::t‚iÉ.—±¾œê§æ\—™ùnjæå¬w–OûÊÌ€.ÌÎM '6õÿ¿Ð8Ñœ9eÎ ”÷¢™Q¹¿&h"¡àhBÜÊ- XTòÕ^^ÀE¶IöÖ•ü‚ôÎ Xm¡ÊÖWOE÷Q,¦Ð×t†]FœLˆÂbXÎVëtûO¾ú“¸¿ ÂQƒûQ„®L¾´~|ùêKÕÏ—šœ/Mâ3ÍS$ýÝÔ#k9=:;:==îô{'ÇýÓ^§{vô$OÂO?};ŸêÕÂ÷@jOåïáÛßwzÇÅaÛº•a|*Wƒ÷bÜ;9éw;'ÀO¿z Vx0šËdÞÍŽì›IØõÓ,åÉËf¾3o/z6L~fñ¯m,æè÷±¯)Œ mxÚ£¹®Ò]»ã˜¯6d3ð…b”©¹v‚!ùò÷„çÒ&tOP#è, tÀ¿fœ­åÍf†0zAÝ[ÌÜXæprز¾ù¾×²Î¯ÞŸ¿lYï…íÏGnÀÙ‚ø¼‡Õb2¯œ¿Ã‡¿ùþâëƒ>ürÙ²^Ã'ûlË4ŽUƒrº"¶ %…ƒ¬(˜‡‚:É)È¥8çÿœNI3h®‡ÉidçQÖ*Åè]olUêS«`¢mac¿óÙUEõ 1M<ÇÒšË i¹±%w¤w=2…LcæK]‘?œ~$ØœÐæO«cëfŒ”««ÄóQ©  ’JW ;$^žÙÀ}V$`РDéÊ¿ÄH)eÁNV—0H!P¡7™uü*¦°}QÂÄÀ ÓˆãÎmJ±¹ÀœG¹=ÌǸÍí8£ùÌcT!f,H.¦nÌ®z"@­®%\â#™—D .–,µx.Ð]ÜàÞŦ|Ö2¦0Fñ—¹ be2ÓœãœRÒíµOú½£nï¤ÝïIEÏ:ן ‰ð‹'=óÛÖW@´²xc~­E©82\ÚùØB}N²êùåË·opöGf×9í`¡6ªÐBBgŒÖÄŽè4VŒÇS ïp_ûU W§•Bcx× õûè™uÍRÈØÀ-¾‰H}’C·*·î§½SÐCÏŽNúu¯»±.¥X¢ß^˜yø†gàm2Þ’\QeÞäfT6½í™jDœÜ'™«ÀPZ€›à¬J$(å¢8°W“Û<¥Ü´RµZø€#¢ä^>9éœuú§íNƒ×ô[äà®è·™=cd¦Àn ]ƬˆПŸÎgô/H dz9n1’[LúÙÌo v({ ]æ›Wûßfø ûTÄ÷ðמ‘63MÍ}à¿À” paJáÄ\ÏÛ wðt²IË„ä°0 ÐèºÜ)Ü[áè£ß¦p~’‰ÖßâPZ¤;2§ÓXǨ¡ú‘*M§žO‡¦BÈ­#=asõyøØ|ŒÕçLVذù„øEôÂ*¸xÊcØi8ÀNÊ¿ cei›_úo?ùêmåž9šOÍh5Ó ŠM}ÑðH8?k|b¬EùÍz´’z3tÿ,XÄCöà¬ÏÐ1Ä tøRšÕµ¾%´{Âо_ªË?}òä«5Ú†1€-H9Hc&†Mˆ¡Œ— ˆî<[¹rÒMÃn,¥õôÉWÿßÿñ?S/”Á®!Zº+h9{òØ?ÞÌ‚Ô߬Kýÿ›¦~ù+El2ñ==ØÔeEýÃùŸå_È·Pên˜Ôßp@kl›³Ê¼¸Wçü9pü¥ž?ëï[_X½2 Ý4iG‚ žÂ¸ÊŽèxÃU\Ø5Ûÿ¢<_Ÿl0 3‡³HZ-9ݹ‘bÇgíãÓ“þI¯ôÙ"ùt‘‚\|uxŠnm¿¤ÃG²ô èƒSZùxÔgÎÉdX›êÆe4;J*HŽq¢@˜0<·d¾ÊÄ4©¥tðÔ„ßÐVZäÒkÓ=Ó›.=j"â^PÏÐÅŒ×îd!q^Ûdo»ÓYIÄúÕLv9Yñm ñ†gÊ7LÖ–MUßÌY·eú‘ôÉË$Qi`1h™¢ûé0ð¬gÓp„ü&3ÛUô¥à´GPe5™ŠåÀvç¾û—y†”ŽPf;‰»™P2::$ÐÏŠ3rmG×ty_Ï¡{ m=8oÝFs™h?ä¤À¸èðÎ]†¯bí  5Èô⮥³e´ï¨ü˨X&ðª‡ëªþò[×R;â•[€÷³6Sˆ‘HáÞ¥BKòBË”4WoU½Çý?uÁÔkª\³ä\í¦zÚ*-»õ¢´ÆßÛŠÆ¿ÆjµŸ|õÿóÿىƿ©‚¼[]ïs<(¿(¡(WÑÛ¬^©Z•täÝj”kìÀMTäM5JöÆöàO§úä†ÞØ5•Í3ãh*¥@J]s±Jº+ s“ꨢóÎ4†„to#tÉôB'&æXÄxm“«X•›NáöËK›´fhãe¬Ã59¦î¯ÿ{ïÞÜ6’å ~¬æn‡}›” ðí^׆,Y¶gì*¥rÕ­‡$Am` ž;ývÿؘûï~°þ${™@&@J ’hwÍTuÙ$q“'Ïów„ߟêaH9¡ßªlŽÁ‡:´ä bíy#®èöå"ÒØø SCo°;cusƒ.ŠÉ¬½÷‚§ Æ~÷Sù‹=XŸ\O~¸AUf©äÏußMª*’âE hŽñ ÎÝ]¹ËÏ#ì/ Ú"``Ïl¦`'‘ˆ7‹&hyÑ‘Ð5`DÅÈ13rE_¬Õr«½ª¶vŠ[´-oPõWts¼fl.Cá8¦”ˆ½áø)iáxhe¬ÜmKˆÉØb[Ç`*á¯?õ"²K‰6aµ©7Vš VÅ¿ÂPŠ,úbI}ExvÍ3pS‘wvONV˜&– û­–I!¶Mñî˜ZFwcŽn*‚édkÿãïÿŹ*°i´§JÆsØJk±Â\7ÊðAgÐÓ5§á‰JdñDDÅàE›ˆÚ# ´[dÂj-+vÛ$Ð(‡%FœªôÆš > ò¶$¹Í¶]¯oô†üO«×ïõ üÉmaâG‰«Éuríî+lª†¬½Ôe"åï+j3‘‚ˆ};x=‹G(2§æ{aJ ò4=)ztÎ(·’ãLÀØìNžþÈ7ä ¬OP`0®ë®ÄçyrB©a•ºEé™ÔØ£Ê;i#.x#j¼PKÔ}À“o*k¨" 3L}-šýpò[Dÿ…RXènJ±ˆW>À®F>yª§ADÅ&§íI(TTÐ@4©ßdrÌ*O d¨eÿú ð'ï?½kvž‚ý‘ 7]u/YÆÁÃ2qÞJêÙ ª>$OóÞq.·Ô„¿÷:ÕòvYJŠËFÛHœ]ýGµ·vQóÜæP4dw–JÖE»!·êÄ<0ì´Sm¡²ë."4a¸OCÓ€²])"{£HJ©…nY" ýÐ}(†$SMØÌ'ÐDT¬[ òL9ÓØE=Ì‹åêXÝí÷X]’Ì FZ"L5`ôÆÔïv#d˜^çÆ¨X„yéÅ”³˜=ôé _ݑjã¬"®=ò¬,‘Y¯€9~D™¬¤®Â"­„+£˜x¤ ¯! Ôí1BSÕÌål>Y´HÁ…ÎeK3©žk —¥äøsö°c÷~§¤(?tÊó»ì³Ž„ÅKÎŽJæ *ŽW©©j¼åuz& #YcSØJØDQþ`±–€¼…]6Š'´€™7§òAÜÉ5™Ìݸ®k«;±˜ø÷»ÜxF:Ÿ©ˆQ lN¢¼%c|)\¶¤«Ê³Ü é5ÿІ)(Çê瘽„!ò’z ß†øÎ†£“ö6á%£ß2fS‘:9XпV¨VRø%^…”Ö¬‰®œYòb]šÐ»¤çFN]Œ˜rõamÜDŒ¿[%ÞtˆÞ™sâV$Uñ*mN1…}ØÍ‰¸7ëÊ¿R6´©Âˆ|D:içѺ¸’ˆhR¨{(CØ.¼°îG—}KSä☨ܾRòÔYüløéxŽÝvýCïýDá¬J¬nûkXZœd ,«¾[=ßÕÒ1ù|×Ö=¶?×›b9_’*Ô¹X¹ü ïm6ñ×è ÀP^˜¬b/OÍ>Œ”ƒ)êmᑵÞòöv±¼8æKŸÓe®d7ÚL/€/A.á0Ѭ{ª½äŠM>Ty)+R…‹Ï[,ƒè†ÅŽ(ë.TŠó­‘Ë3Ҍ䖫çô3Á»¢c“Ëm“Ô[’s«S쌉ì)(ç \D>Îçã«£³Ÿ~¼øøÓÙÿøñøMŽ¢,·7#vO¢&dYŒÌj3Æ¥¼\ª7Ö ÿD»“d çUyÊ.йžkeVz-#×gµ> '…ü.)’nx_Cî®És´$9Ü&j¨”Dì^ç¸ Iäe‰*ëåúZø’{²çw¬{éúA.“—h¤”Š•(VˆNmñPÑñ®QwTNyÞz]m.!²[ [7>¡›ÛšEn°X”’Š>i õ:D^öЛBÑU*ŠEüó‚Q³Ö¯ÊIc_Öà¯(NÃ]ˆß”Ydg|=ß›ÕxõúC8éíîp°Ç5^§xCæ'êž½û°·¯é¾â˜)m,+¡!R«yéŽWe´Š…9®ílCxYòîÚ$&ñ:R›@ÔFkß§Þ#ï& ËŒ1dVû. …lÊMÓeÓvá.É×,ýÖ`œóÁZÁÛD¹F¶²ŠˆáTdà…ýÞÔæ›ú£$…žZ©ìô-jÙFY³pw†=³Äiñ –áor "=DþŽM,Qìvq–o4l0Gn9[¯Ø[8—p WËH ¥Òf’KÏõï.RZºµé„Yn]–ë+®RêÙû`.sQ™{®0˜ëk>2Ξ˜Rêw’j¨djØÕ ™¼í-¢øFKÆË&ñq-•Y§Œi”-.ïERÚ†œ£õDó V…–W÷À[ø¬¾Pg7Ù³¿ÒÆ’æ4÷}g—˜Ì:_wœR øý»D]Ò>d`£‘!‹e£’J­¼¸i}S7ô‹ýÁs”FÍÄR²ÂJ-Ü0D/%±u6ÉŒ­%×+õ¡0®¥û{¥:>It^§5´\)»Eô3µ®‡œµYÅ–´Šœ”¬2x9Dï[§_Páá›ÉÔÇJ‡²Î\ëøD[~¯=è?ú…¯b¤¦ÞxNõÃ|UäØs™ìféi ‹ëÖîüª0Š1Cç>øÌfG ÖŒ÷Õü*yðnØÒ á"L¦ŸŒW¬v§Ýí:ƒ¾½ÏVû۔˥·>øQÓŸÁŒpÇ~àSlª¢D!yå$eô96Æd»É*égÀ7²íÎ õØ©˜Æ':>s6„Ñì) cÿˆ¿W¡¾@A8Äw¢^T½¢õ‹ 9ªO¢Âß’Óo©ëZ–U9…é•?ÉÝ£›Ô(ƒòp¿û­j©ýÙ’ÙŒÇ.³µI]“¾æüuÜUŒT’‚èï¨LìÕ56QÍã ˆì›Ì1bJZ7ªÜ¤hrp>F‘å) òŠO¨ÃÊ´`.ÍÀÿâ)óä7?"¹.­K²&‘Òš{å—ù iÍ®ºD?ŠñM2]æ+|`=‘BmöÕ_>•™!©$üŸ5 >"Æ—ˆ±fÑÕ†,+ð¶ˆ&}“(h4 <¨6PÌš¤h'‘KºÁô@ÍVX‡{3é²ú›â¥Ì¹ç9Se0™Ãƒöa6¡âÃUUŽ#üTìDB76éWÀ}CC0dl[±4rÖè“’b¬!Â÷†Ö, ‹uCS+Åã4•å7 èÂõáJt1LG«àÎð믥ӣbOs ¬ÙMn7'”ÔP ¯_Ez6T/a å¯p z‡^¥¾ •GØ6Z0‚;ïÑÖ%¸8˜—'N¡o„K:´ñ\¾‡þ雤2õy¤•7^±ã2e„cÏýâ%:ø6]1¦;{; Æî¾/_ÔÃ^»cwúƒa»3h·ºÝVÓmܯTþÜ– ämÛ~ÿÿ ß4,Õžt»Üë:Z_÷›<ýïùbÞ~óâ£Ï™sùÏâªÂ?c}¦]büöhs«E¸ñׇG´ªxYõãâŒ@Û„“‘è_àYÙH¦41œç›¦+Q5ás²Bš¨¹¾8àÚ‘Û;W8ù–GZ±záå?Ot½x‚wdòtGc;ÞÉØdtÓz"º¼ß>¼g…}/|REœb»wð‰Ð¦ýèüÑÅÕî6»Ýh·ûÎ4œC»[qó÷x‹;û±Å°½n£ÝßÇm»ÅÝö÷³ÅÃýØb§á´{øï~lqû°}ûÂ|#{|íXO°’“fwuin·ÕN»1pºAg°[Ý:tnÈ·¶Óä%Ù­Á=hõvçö+ñá¶ú;;Ô¼Õì¼Ú+Ìn´àÂÜq²îÂnµ*î»úÉ­ÛÑ=øá¿[Á.ܬø¬w•ÞY‡Ò™qó¸Ê¨É¡-øvû²Np~ZR¬ìÚê÷Z2šÜ>l½~óÕ:ŽbÏ9Yeø*˜‡N¬Ák²Ê?½ß•»â‡y}­LQÀH¥ñ“iâÁòG7²˜ÀŸqc7lìB]SòfZ#Ìw)ÙEé''¢È"æÍj:]HD|ã_mçsþ4s®¨ b dyÄH)Àœ=*¡Ú’CíHUq¦úëBz¤m¹7“IX`‡ŽÝ؉d¿¯°lFXEúP¹åˆ,T”î[žc‚Q˲Éj,_E †§4[ÕIÚ ÷fX6²v—‚ÅbÎÂ_I+Ï) ª# v-õCYlÃ¥;äÐÄ@óØ ò…r gU“IËà¯"¿A¥·¡õÅó–¾ìP‡I@rE#,ËÉ…Œ½8”TNÝ×O…Æš˜"Dé`/ 4h½Êd‹;.ÌNºÒ;CHˆH4«Ë“nÞ°dÓ"'2·f.«™Ø?[”¥µÛŸ ÎI@WsU|XÞGóXÍîîÓÔ +ò†."Þw¯àÆd˜Uð¶S†©OíÊI ßEû‘a¿l7üKëO³ô/ø¯Õºó†Çnر×ý-þä.–±Z×ýÓ§Öÿ„ÿŒy§.šñÞöyØ×V_ê0ë=B 4ÊØ“ÃPû,éj½a ÌÇ”@•‹ ‡Eôå’®V^ys/y]r_ŒB}QšÉ×O²z¨xí·ú½äêbÁºä?Vœ-hý_½‰,•mÖD‚xE%)QÃþ¢M·4N)S}¤hÚ¬ÓÓ£ÝïÞíyß‘uX…„9¿8_Ô­½1fõ6¬¹wífQ'nÔ¤wew6FÙK®®[càNÕ(»S5Êîì&ÊîTв;[†µOxCwâÛv,orÛÑx¶ «gæø;æïŸ%¿-ƒèWôåÕäŒ*ÞÝmvÃ9r»«ò!FA¾ò] cK—}UÇí^nén¼ò[o鮆±å–Þ>ŒoeKÝä›l»©ª’ÿˆ›zÇ0¾™MÝMÀjÛMì‡ð´¬ïä°¶÷ãR8û±¯Î÷²¯½öàöT¬‡ÚÙöéé~âÓSë;‘Ű·»I?Üvo;­=Q†A7"¹×í¶w“´íöžîÑÑ…Z÷”[úðÛ»›TÎm·×níÙñ½]¨m‘ŠÔºÛ§{¤D•ª,Æoc`× ñ‚ªÜf|Ä)‰{Ií–`,pE'D†‰[F Ã'±£WÏ'¢~Kz£ñx‹ìΤ)Ôdî&ƒ{°Hë3ðÚµ–îM¹t¶2Ü-&½\ùL«ˆ°tŽp£sÿ _¾eEWM†7Q 'Æ-8i&KÉ0{¨vmîO »’kÊGìg‡6N¦NpC!†ž.zxá""±ÀÞ$*Yck?Ìò4‡;ë¯ÈE¸ ‰†‘u ‰ÜBAv»Têß3$´Q8 sAÉË(Ùpñ¨SM6úR‚o6¡dàSÖaƒZÎðR$ž˜K"5á³NØ‹å['½¾1o·ÐàÖ;N w/oTXk¬£¸-«€Ò“«KpËÜ-Ý»¡þèÔŽ#ðÓÙÇ* ô3í-Õ!vÏ麶sW˜¯”»U vT݈VëŽ$°’ËÙó›-?<°è×_›ØáøúÅAÏŸ¨¯›Å¸×ôñ4v±—þ‘¿ûˆ½»bor6w—^²öaIÔÔ§Ñux0TÐñâ }ØSG…Î=6OñÓ–ÓêÊO¯Å¸•9ˆ±ù <™×À]_žÏco /ðÇX{‘yú¿ÿ¿\2…|½ óÏ„¨†JA ÷ü.ÔÛé8ýΠ7hõálmTÐÛ•.ûnë®s;õÚÃ*Ýø¦ï>ÏÛÑzî8gX€$ëË.ú¹£Áƒwáé€÷K˜U¸ryò*Wjb«†ü„V,¾õó^ÐÌÝÔ@€›N®–E©£ ¹ŸAË‘F¬€¨˜×ëf|òPÇ_™×ÏKa·ÓÐ,?nCëŽã(¡›1g*½Úš„ q$]Ÿ¢jß0“¦.–„RÛTl[ÈÕëÔ_&X×ûd0ûâÏ(M²jeIˆ– °R<.y)ùtÅ¥éhâä®<_´cÉ2ðÇÈb Û>6y¤M;Ç8žÃòWÜ4êÒ-ÄN¥c‘/ë.kµÓÁΊZ©ÂŸ8õ^J#$¦W^Ò—¨ÅШÄ<±o5çE"/ ±ßˆ_?Ķ*(dK%"Îhî1ëˆ>̾lQM ®=ô”‰ÙÜAª¨;ØrÑ ìÑó{‰nò/>ô`d=ØQs9l"3ñÜ#/½òÊCzéýì5!³ê‘Õë~í¿"¯ºÐxìФ–7Ü ún‡ª\¸Í¯LüTÔ7ð”ø:–®Ô©©xæ;ÖÜ‘*œ®JãS¡2’꼯Bbè–¯(ï‡[+!ß vMÆCCüƒ,"ù™å°³–KÓÁÕ€[bDn¡…(€$<Ì êoÍД€5ûõÜÑÖ³ÙܰæÑv“nýªœx HCØT¥2tgÒÕòìaþÀHÏ2Óh[å‚Bè+U»'ÖÃÞU¬¢þÇRŽ–¶ÒÆ€[yÐ%†U{Úq_bUX^ä¶šN½¸âÈîôý§r¤^áö5…A¥.y8ݦg¡>õCô[Á]4õ½`’°NÍ®»Ì¤Ïlù¢™—ÿH|I ©ËÄ”Zò]úìx}‘=ºð¢aÂ’§ªµbìå¶ía§mßåå.¹ÃÅËMú7;¹µƒ°GÎí£¤è;J¬™zäè”G/Ù‹)1”þ“Ü`} åBhfãU£}À˘<÷cö³hçH@$Áâ)—ŸDÞBe-žºc^'éw›ø3?…SK†?]¡Š9ÑÈ4<8íÓ rñ"h²½, Žá¼‚H榌Â$õc¾€•‘Â7Ÿ¼ØWè“û ë\Íw›qBY•Ñø‚fá]»x‘‹’;¯…ÂïÐz]W>¼„ ;N³nåÍ8vôK‚i]xOA]IbãÙ›0a}À*ýûqyŸF±vœ“Úõv@o̱' ’nˆ˜Síìúš.^2L‚$†› ¯˜Gñ•̬$cøÖä( 3ZDÈ`Rº¸¸ìŒ‹ØÀp5ün$ÒÈdKJú„ ÷è|"þ`e‘t±}Ð`^üO°h°­ná¼òÅ…ž6‡¥b_6ذ(û—ǵd…´SRo­ãp¡>ËtÈB¬¡ÚÌ‘ÉeÈ«ŸåÂgž9mrÇH&ÄhŒ$U°7ÃED°ø PÓ bÓåÞ(DD/-Óuj<ÕtÖÄc‹Žõç°Þÿb†Â¿<²^€Aùÿ´`±LyÉØù»ê€ªQïV{•éþ‹c<ö:+Ӿǭº=åï–4¨;5ÆiªÝ³V»Å¬N±lâ/®d/ëŽõ„ÜòòèòÈÍË–ÿW/Žžfú݃èu<8 ¼¸1ºŸmf‡;¾á¦å6ð$\>ÐZ ‚pè=¯*5p 1wê¹Õj­ý§‘9Ú’¢_µN·%#±;[q`$ö«ÚDlÛ˜Ñ7óÂÛº·Ú]›• ¾rÕ7WôH'Öm;¤—›N?¡ŒYyêÿ«'cnB)ý¦óúåÓtk¾MŠüótLšh3^¹haŒ¸·w‡äëÚòȚ˰®ƒO•ƒçàmÞ¢¢G‡ƒyX õÛd•´Jê?ÕVÌ^³\»¡»VÛÁûÜ8»âÆÙ…µ½¯U*ob­<¹§á9Õ7ñþÏ`»ò,\Ž»Ôø1º"LÁb3ùýå÷÷(±·eãû’E(*÷Ž«^%ö½Ë"u«-WÿA._ç…0H‰JSVø}»¶êÙYNùW±)îtwÞ™øÓ>¨ž9¥6ª2²ê¡?2|'ÃgMêÕ&Ÿ°¸'…Ù¦¹¾k9Žž[ÿÑjXvÃj]Û§ «óŸÆQxÒ–OVÛèÉÖp^ÒTfûdU7Xs¯kZ ypâQu¯PMÖ.'f<ü‰^ÃW¤[%2µ™=fÚɑΠ,hTO¯¹Z”¦" JGyÁ¶dc°ýËÈŸ€ê–ïwtéÅ’¬Ñ¤­×µ½þÀv†ÅÜ-®Oþyq€í—î?cËÞ˜±u c‚o¬i°Jæ{žE¥íSÅnŒXºqÇ‹ï¨PoŒõ³øUå¢ñšu6=h2›œPÜoÓó©ÊçJ®å"i†‹^í)¿Íʰ !ˆ=M2¢È æ>Ï"xÖNûÙ鶨é2^HÙ5®‹Ä ×ûI€:z°.¦˜ã‚ƒK”€ ¨r­ÙB?ÁÞgNMMe')֦޹ª÷jîc¥7•Ÿ. ¬¿2\Ò«|·ºÈV0"íýƒéÚƒþ`{‘ö1£‰´Né¿ýA·ßv‡ƒWÎñQמ¼î%ŒH¿Õë8Cû]qŠx#¥¬:ŒÈ1ætßGKO–¤çø pëi¶M›Ïa¶w_dnö¡-±á]gJ*ÀNîøÊ×wýõ—ðƒÝ;Ž=*Q{…™º ÑACZ[§k,êœ>è­æ¿F}/Wr­…û7, ˜ «Oly3”†2”£>¡¡ÔF¼ÍpÌTèͰX©5£LÌ€žvG>µëEupŒ·çÏÕŒe’,‘>Ï3‹‰E•’[n‚ÅI Ù‡T€w:\¯á†ØùVºXME­•{6Hˆþ ×ë;ÝA‰ÿïQ³}x®žz ð F/AÁòŸ‰%KpÇüâQ¬‘R‚þœAQ&êR–$‚¶‚–‘®¢(áÏ»ŽUóc•­Ì¿P‡Êh†Õ¢Ò×Eà§ ›[»T⿺ 9‰_èl,1»M,HÎÑJ9EìÁýÖOG;Ú…"ƒJQAPÑ9_"ÞÎ:¾wÔP3e/Ç>܈`ÉÅý£éÎ\ëK©”쇋@Ñò«(þ"K¢)%l¨ü¨µÀÅÔœÂ-*–`!A¶ä²ƒ-’4ÙÅWûýÊ‹?¬eWš¼@|!sákàØ” æåÔ¢Õ¹ZRªŽIKG¿sIPX?·ÞýÖ!¶‹ù'Ô íAiÏëOnQ‚¸È‚È“èj-ðÏžJÑv§Ûéw»ƒïTŠ Ni°„hĤÌ?VɳêPtw+¯¿“HÖßå é¡Üè#¬QA vSð ªþ.kî^±®^1ÑUO'o1Þ9!~â 6a€þƒ¸Y)žrÅ¿K& d¢,×MÆ%gßí.È‚‡ñΑßQ(ÌÅÅø’̃;`êd¬½žâ.ø}å¿`1–¨.ýV$Í í€ÚvK`®ß‡¤9óf±7Ë ]É€å»`O~áçø‰‹×ÑKÐKLZ“È’…gkІrSƒR¶B× 0±ç.3Ef=p °b%¼«Kå19¤”ÔŠjª‡§ÅÃÒÙoJå;Ð=™7çÔOdÖ(Ì+äP$¹B·¾OÊ(øÈøE¬f–e‹ž@ÈËæM2+Šž b™²™âùËy÷°`ÏR\Ê/§a ’éq)Xi ¥Ýë!fû¢äOIœŽ½1å&®„(bƙÅqzˆ…Ú-NÜdm¤áQÄÊ]0Ú&ÎÓÃóI¸ ©³ËLë¹@ʲw8™g«×%>LÀô¼ÍÝ&#ý‘·yŸ 0ämþ“çmîäž8šfßÀ[Sº[!‘á̤GÌL*ݵ.u;ÐoܽÈKº“á;`’Èò_2Ó.ǧI©Œ.CKUüÆeðø–ç¢>é‰(~jþpë乨z"ªº«Me¢ÙO¸zg¤á¿°l†’Ê )ƒJ°=Ö¦™$䫉4IœÈš«;PŠÞÔ¿ö&MŠzƒ‰qƒmA_”,½1Öke€*À§M¶OP¶`v¸u«ðˆ$‹Á,/{ÿé]³“wÊá5‚#,ï÷•$œ7Á`ò›>¹V>qØYŸ~U>m×K¶ÕOlø`ضõ§ ý þk9Oÿg >…iêEд5š6Ó4Fk(œA³µnœFe”&RêmjD>÷OoNÞ ‰‹@F¿&Îxû„Y¨w{(-{`ß–ýëoo~þå]ØØ¨9Ñù>Ÿ¯’²ôÌ*Ù`¤pa¸ í„úD’>,V;ü0sCäØ ™9w”QÖ]ƒ5 y­V×2ãgC>Ù)À-¢î L,„¢^z©OСú|dc‰tÁbhÑñ1Ï1r9÷gs?à¨ä¼=pSjîKãÎiª A©qðø*0¬´ÁEêÐ"møßüýÿÛÕê}Ê â1yoy£Wå"ZNÍzB—•7ÖPÑ\ ~ ‹«!,]:>|Jj¶ðÜÄGýŽs$L‰qWa7FôÍð‡sÌT]ñ^¼ó2ÑÊœ"‘üXK—#•Ü%ãzéïÚ„Qp*ͳLŒ(od&ÒÖ ´ЀéäÃ:Re2~º›±±OVŠ6?‘ñ…Mw tJW³FóÏaïç|“%(ê¸é~ñùmðY¶Ãé„‘…îÊÅ#6¼4°ˆÝ E/-¼æ—Ö´J>Aº+ÕAó̇V¦J˜y ½¹F‰j`&.FÆ⢒ˆ“J9Š/žqX²YìÑ›`¡§þ„¸HÆI8ƒUß`êÍ"ÂvÁ5éŠk—þØk’X‹¨Ómq®^aE"»â‰V%ªÔÁýøõ§r£)ÕNÆ”ðE+zʦW€ýÉJ’T­‹dL{¶ÝÏé »v»ÓéÚ½ï3žsœå¬ñØ?Lž…`Õ‡µp͔Ź®kñï~ë¨];X2üµ÷¹‘‰òTt(¡‚×< »ìèíiß[Qß«hÅñÒ o¼a-àjôé(“’þLSÞ!ÀýÓaYò-©Sê a«ÜpâCÇ™øÉ6dž7‘¢AK@(õ¤ü3‚qqÄ­´ÐÁYâdNVÓ)-ቇ'–¤ó9ƒïEaÈ Â'O¥Á2mtob)w&ƒ8í^oØv†ßi2ȉ7Ya—™ü¡>À /Vé„i|#ïáÌ'F­_Däã9ú keƒ7¹û Üï UrÈ6®Yâ*¹X¡ÊZDHc†úÀPž7d“¸X®õ¯«É ûá|t?[|}gþ…¬™¨ çëÒk¦Qsƒ¡pEÅ›šE„<ú¯^øS,æn2RXZ€T pµÚ¯&ÚRe%I€ò¿hæ–u¤ÉÇšcæ‹t”‘Ök ¼€œI‚2*Ïû#¹ØÿŒéb(œ/¼X ’·¿…kWЗxN¨Ó<¥4:í+ÎÓÜ|<±aV§XdN:L•Œ^…+½ÇRëä5xlÕȆn'WÙ#ãÉï¥ÿ6WÝ7=¬6tY§è SE`"e¶Cî•Ò^¬c ‹ôö„G¨³°>.,(ý5¥Xî'ÏQRÍîü€švŠwj|¶Uõ(¸Š3«vÚD!uåWí +!ª¸¶NØEZÀ¶nņ(Og A‡Ïsé½¥¹5ÉAñL¬™ í§Tw1ssÏÊS­O(úm˜ZëEÔÃ'œ`®Fv~4hü5ÍyrÛò”Fkð€ÜkÆÍ˳Ó+0Åâán %%“Ë125¢ô½+~ñ`[^ö{ï ]¢¹ë›z>Éêxåâ™®bé Ê¡DkVáÝ55ÔYqMFø=–唪rÔ¦tŠÎþ¦˜ÚÛM<µ»’l ’r@hª7×ûH”õ‹t8O KÒïpvHîŽ4kçŽ}G~à;rry­k±ZTÛš­E‹Òõ”\!åÃÉŽºìÙ¢~æ-qåêK¥yÚ2J|ò¸gìþ’ÝT0=PÉD öš¿¯`é¹Ë&UP61'7æk¨À2ž –ŸÎ¸›J_®ZNPŠ&šgP?ˆš#›¶R T¹•|ϘŠÍEKI‚™F¢r4®ª¿€™ú¼œl=ǵžN'Âõ–Vžø|g;Ë<·Æ<ªÊsÒX–}²ð\Bœ¥t÷9H4=R {ã¯EÂù*”»$( –]™Íî †éûšàP ç¹è$ñ‹=4±ÎŸN% æ'|ä}Å›wÝ„oE”‚²‡è%ˆÜ!×N®Làa‘@èSÒµŸ5'.N\ÿ(Íßs3^)Ò¦;ã][äö`S]8¼¸>š–9Šó%ß4$TdH§$×ÁeD~kÔS–1_¬ßŒ÷·7:ÝVÛn÷ÿ .Qî,ø`èù<Çl—þмW»·ðY.9‘8L¹™ðl)z•:eJw ì°¨3îwž°)ò#¸”ðPQÞOçÎÆºÃK4àÀk&¬ÕÆaù˜>®OÀ­0ASRá‡DÕǺ\–G>t/yÈî%&Ù2çk.¡;œ=ÅER°!ç9ñ† ÓüQB€y¾P‹v²KÿÖlŸßJ®Ò¼ë¹OáXNBÀ 'ºCœ õ¦T*% ë,]%‘¥fYZŠ™Ô \Äò¸ÜŽÛâKWˆGñ®_ÂYž ÷&뜔Êódÿ5vTs¸Õ¸È8§Ø4—ø\æ’ø¤c7ZÊ“ã…8'À·ÌóDW Œ/iQÐ¥2½J¤®à²{Iª½™îFé oW¨yPzLµy$32ß\^®cioM½ñ<ô_iyr¨‘é±³Áç{ðôìÞ ÕïœïS…9E e¢‡1ÿSKtÞ~(± » Š4Ô  W6DùòZL§BØWŒa]µld„îõ'š×33YÔ¤nè‘— ¢ràT{‹Å—ˆÿÃoÖ4hª:S²oÇ7ã#ÒC«vþì‰ÆR@ä,+smírö è4~PÒâþ)8:­¡ã8-û!œªv“>Æ5ÕVzKºåuŒƒR‘ƈ2µƒ«•ÂI <Þ9(Én<žß ­]=N#O1ŽO§l¾“Ò¡œ·©fêHxÆ«ºô¹ß2fžF1&óNý@¦O^áM?–îvãyzŸè·aæèjäl¾b˜ùœ£cQ¬¢”Ç—lH¹•òötóê.Zqŵ­¼ûX¹Õßóê R€@®¼:ô­û™H7ñ“ñŠÆ"Œ—À½~ÛvÚ°=;>dkOR»·þ$•W×0CŸúKË4ùÄð,Ý®¬«+MíöÈ}‹Á=ùŽK\Eä@Ncÿ7ìÓñ‰`'½±Òȃ[£pé¤QX—„ %Ò‹§¤‹¢&Óù,ZvÐoÆg ¿z"ß쇲EÇS:ÎÚl'zñ}ë¢^Yz¡Ý*¾ñr9)ÿÌùœß9Ù/¯‚iù—ÝÏ…é‚qNøƒ³¯þ²ôsztì ‹9",Í|Ï»%ÆrmóÕ(&!oÈHìözí¡Óiß:è´»ív»×ëlâã~%ÐöPç+ÐìÃîë—ødœ'Ý~Ûv`]S7Š 30pVhÃrZ§Ç ì:Uêogw$öœãÆüg!cñÏ8AúL“¾üöhtŠÕ"ÜøëÃ#I‰%ø}ÒDÓ …*;Û+‘<.>0'ÿs3Ž®ý‹176‘±‹3ñдqöú®ý±÷œ´$ü˵*·í²ãä»Åêî^þðÃ1@²ì ùžîhlÇ;k§OD—™Ü1¶g…M/|R?œâ»wðÉÀ¦ýèÌ0×A»Ñ N¿ûè ãq‡ƒAÅíßãMîìÇ&wÛ¡c7:j ÷GÜäöð°ûÊ|S›<ÜMvº®Ókt3Œ”GÞäöà°í|ó»<8ø!ÓÀßýÖÙÕµ¹Å^ßÙÃÆ°×i íÞão5vúÛ?ÏÃÂN[Ë`•X{#ÇÁÚ°m8áƒF»µÛŽÃ¶o—}ß¶«½&{r†Ýé4ÚösŽÓ>|‡[½gG¼GGÜÉÞéíÊ<Ørß;‡ÛGò-ìû]xwØWEýk|ÔÕ0÷béu^ë­Èk}»Ñkµg?x ´ˆÞwaú‘Ww‡KÊ_ —ú5šÈC!ºÓnÙœÚ;‚honè§²›Ör5N&D[ŒtLV§ócù½Žç™ÁèÆ8pWŒ”7{xõó»#Õ?»qID¥}3ÿæÙ·µíUo”µþ^Ö¢I¥Þc“³ð]¯Ã?þþ‰•øƒ=xY8ÂôO¿°C¶WÁôŸ~žÔOn›†ýÎTź]·–v[j°ôp•¬Þ2mí<\ÚÝ.íV —vw.íî&\Ú­.íîW¸tWùpi÷û—v+ Çm6d×áÒmÆ‚A »ÑnÛnkÿÞÛx–À ú‡{ò½?Æ6ïÆ ·ý6;=§Ñnµ­;•µÍ¶Ó9´ï)šöû¼›˜éö¹;h ‡½†½/û܂ަÿ6ú^¦[m7°^»Ûh úAw7A•­öý¯½CçÛßéû›nµí§„#Þê‚HßMŠÓVÛÃé÷û÷Sy¤¾»°éÖ'¼ÕèœÆp°'Ünµ·sÝ7¹×{vÆq¥{ ÖFÿŽhåÃm¼}Ø¿=Kã[Ûx’íbš»÷ƒAÃi }gä;^ëÝïaëwÇìþÇÜÆýÛ¾·‘‰ÇX‹}Œc>Æ:|qÌ^–ý‹c>ÊüÁûÇ|”Øç8f×t‡ðo©x¹PþYªr.E4wVÆ|…cX°\Þ®xùC3ñgXk]¹—Ôn&Gõp}ZA¸@wÆ%αûì]"ðpä1 ²DfAÁ¿â&UTÚî]/½0!0øà&Aœoc'‡q¢ÌS× Dƒ¤;dá¥ó(«-öË º‘˜¹‰·ÄÀ­—¬Ê%<?œø—þdŨgž»…ûc£4ÔÁ¹(e÷3ÐÔJLÛ™ ‘sƒlË(¨"‘Z·çßÈ@¡7|,ñÏ Æf.”·¦ŽÊ›yv*ŵŽÁ»&Ì3,Q_8²;žÃæI8}앯µ‹H›7&hj`G=²|D"ŽS³ê3èÙ­¡Ý/ÕP?4À銀ﮢøËNÎÎY"%àìnè&¸¥nŸe_ê $b³ |f䥩lTz |ÿî7øùð3· S:/»§v²Mˆ;¹„‚ãH#q>¸Ëö3c¼"˜E1¼D= î*à 0£Š>"Ȳ[ •ïƒXÏÐ:G<Ù©Óúä b0áÌ€þ¶ ¹{ -Á_mX«1A=-céÓ ÄbÔ\z¢ã¢8J„˜)ä’@êïÛW¯^5ûÝŽ5]*¥KŒAÀW³”A|TÞYüñI}éÿMŒ5ë ÃáÞ°x•ÖSJ:lnÈ«ˆþ†èˆÛEÝf28^¤¢41IJ½eò¡up—–Iâbç°ö9öúcÔ=øá£ì—£Àg¬?ÿm»ßô8ý-§—¤3ìn:äÝJ?Ø®·Ö:¦‹f}Á•Þ`Ýÿ¢oÎRXf7æ¿g7 vFü D³üýÿþ9d þ~q…ÇàÄC¡×°Î¸0;¬ÀŸ’ŸXï`«VÀi D€sZ­aÃZ.­nßiv‡Žfí¯›ñìÎnÂh™Ü$ ëm8>¤i}òc8ÖÏ L÷õ ®!ëÎaGާÍãi÷‡Í޽Ãñ»Ü«×I,¨::Ú'ŸF£ ´ 8¤i6ÐÁ¡SX8à&†«ïuá¼xâßZÑ…+ƒÜù7þ ˜%õ‘Çø×ŒïÅl±Öv·ÓnÚÝîpw“xRØöuì.ç !Áb bž„ýûÊK@h½}O«M€øïÝU‘·¨’¼9[QÃ:òOÏŽN?Áa™¦Äõr_ìÖak"§eó´zÀB½áýîÌO hY§g'/­_•¬¸²M{Ð{ |¤Ô¦ò:;\W‡Ön%_\ì` ×1âÈú1B¤Ä# Ń;v"´ñ_¤6®d8Ò(Î>4OŽŽÊ©ïÛN³oww7à£Ã‡Öi'Á*œˆ±‚EeFO8YŒ£Ë`ŽYo6 tîf8š ø\)ó+‹ü×h…H[x3~@Í O,B€’ù½ I1ýú„^›¤ŸyK ƒíá°ËÓvúMg‡‡ïèÐzy3ã‘&üúüßp Xªñ[Ã$;|ýÿ8„­/¥×_;Ï­W×)ê4 ¡vh¯Sé”Añ \ë.î/Ï…MNÚÍølöÏ‹ƒyš.Ÿ?{†â‡³(šÞ!¨uÏ–Ïà¥ÏÖ\ÔoÉ8ôÒ §udÄO% TƦúÓOüþR}ê>õíïËçþ°»=9„-}³šNAŒ &~ÏÆŽìF5c‹ôá÷~ˆ]lšE›§ñ üÔyZd2™½ éjÇñ-œ“W‡:wvì†4m»µÃËøä—£§pV³··![³8úSú]ZçÑ„ Èt ÉH-1üðw¸Ê±á˜ÙƒÝÍDË›ˆ¬cÚ’Þ*A—šŠF§4–“øÐ:‰F#ºå„ÈhXG«Ù Î?!úíf‡²XîÄ;OÁà¡1RÓÆ·p}Σ¥. Zr¯›{wCxy(›LòÉ£nx¸yÊ+اÂtJnY+`ËC”—}É‘ý¦ ˜mw3wxÃãIûÅ &Érƒ…Bã>Ç®FØÄýGs7¶À(Å*ÙD`¾©€ó…ß%â¦ûùÌê÷œV¿×³^Ú Uyl:;˰Œ?Ùy‚ÝËðfÀájí”ißø÷Æå˃} k£ˆ@×i&ÀØn5C:m±çM6‡Uèf„x—õ/ô=_£xö7Iþ2£ÛCõ🛧Šå+û ¾vqþ üÔQ­×5~äN{Ðí9N«.¦nsþm¼à ³"öR%úºu‘ïZ™u/ƒwÝðþ˜_oïqжïëNöí÷ËF‰F>ßà†É|¢Yóâ&¦"¨¬IíRЧÿ-xjÖèöµºõÛoê®:—çð]öS?àŽf»µIã¹ýLù“’ûQ; Bd(´,šS¶å×1'›K»ÍÄû}E+ÅOýØ~ÃúŒç#ßC¤S?…Á#$p@¼K²M K-x ÿ võà‡òTÄö¬{Áæ9R{ð:±õ I:×é³uŸ»£&u?$ÒBðÇØÖú@|pQЮö‡ëˆbY—I ;gtËy{µ¢ÉMyŸLdø΢½º%€¹Åg‚Wåm¢¼M¸ûȪ–ýÜ’Öh¼ ©X'`lî!ýzöƒZüaDÚy÷‚¬ ÒW0T‘µœ&w³˜ 9èß»cë§³_­gÖ¿c̯ê›;ßÜ~naTKNlýή`m¢+•ê°"ÕSU¨ñȱ}5p!µê=;;W^á5oQ^Ñ}.ýÉ–YŽ‘,º_Â@÷‚GÕ÷ØßÓƒ÷¼9yg=ÁëkøÓÓû}_?Ÿ×Ûg?1„3½E±7½«*Û ÊÛ´Êå4z´JSÁñÔk/kW|Ùð9Xt3j‚µ©L‘Œc°CGnÌÀõ!ªÎ¨,£ò‹Ü¥€ #¨ÊëØÃhýÂ6¸’º¤¸Ü ;ð¦Ô§…„íV¯µ7½–^ñ7T IøGH"Q_Ø­úB'GÈ5ä(¼ô½«¼C.v‡”ƒPßÑ«úGpš¯]´A¨“Q„q2ÑSt”•)á¯hã$sJMwq'µ)ö«¾^H˜ÝKƇ‚B©›®ëƒzÁVäAºœÃ" ™ºä¶Ay)(¶Ô²~Fî_^Öª‚Óîñ¼>ž¿{‰Y·ô'õy“ÉÒ‹ÚUÅŒ r挵4êì† ß(qbt“¿]}CUáb¯‘.ÄõÈ(Eµ ô‰ì?ïrsRDåW^Ü­*hì!¿Xœ¹3× !ùg«„Œw·  ¯žZQíL@Æ©¯­ẕ/¾6ß%ñæµÔ«žiÇ^7©óØóÖÓ¯zž‡éÀ¤œ8¼uìýõº«€›”ÆÛÌÈÛmåk7XÎÝ‘GéÛZ4G ­‚ES~fÑÀD±×»‰§û ¢8mfDÔn¸ÎÇÖ4zˆèõ‹/¤¨=a|óâà糊VNIã-Oçn«fÍ<×Y5ãWd~EñZÏ’×Yö£}0vîœèV bß¶ûaíÝï8·-€óO°ëòN³h+ °ñ‡;µ÷×ÈÝ;í}siWÙ¾ïüàŽÇšº80»œÅ“Y Gê&¤jLæd&¾×“SЃÞù‰jo؆Ö7Ð9zuî¨Oš)ýÎj¤'{ˆ}x[‹ô¢9Y§…µéšiäÙóø ð€®x^°ÛhÖ«KJN,©2!Áz_Õç;fê1nv^ ábâ`éºUÖ2WsÏ . ¿«$*Ì„SH<ë$d½× uÌ ëF3õQ3oNöè‹Ð˜‚K.bo»WÉyAjU½%¡¶yÕÍ=zq9žÐöÖ}½fûºóøí™Ã›ÌºWè ¬%ŽÎŽßªg½=0D-üñÅ%Èü(Nj­˜˜Oõ‰›$Þbx-ó㎹ÕãÈÉ£õN»aUØ…˜C˜‘àµ:Ãv-Qª°H2i\ôh—ñﬧÊÀÆ‚ gŠ·^®Â‰N¤Ú$ñï£óù½ÄÊŒs Š i5OŽ1/b=ªhÜ#V=ŽNo¹ŽX²R76Á–}¡Wa?K¿ Ìy–q4â~Ÿ[ß ”ÇéÂr0‹Á¢N@»¬%?6X$cñ† –ê«â¶Žºy_Àc2_º.@'ºÀd®¤‘ãh©]/Æ:>h}ˆý¶Gnþi–þÅz¹Õ §ŽÊÖë8Z©'Âܼ9^Å”j¸åõ=d„v£²£±pI_$¡«Ne`lN¯Òz{r3K¼X¿4lãKž¾òÃZR)]ìá¡–utx¨©Ì­ž }âµê©.ï>¶îV—Ñü?ñ¦(™‰‘>®Êÿ¿h÷„ñVžPsðZÓàG³3¶ÅÙâå;ñô¬%•ÕÈ2è¤6u`$ŒØÖ:»h¹ÕvázÎy×:}°(.ÖÜ’Õ)y‹ezs1[ù[QY«V¦‚Ù©¿¬·4'~2íTeBãS5‰.|DXrƒ‹¯ Ý_Lý´Þ@¿¦˜ûI©âÕi5,ÃŒ R¹rcí®1V`ðišD:‘7‚IÝ©\Y±Áù8XrZt`˜+.¸Û+Ú“ÕbYÔÃlsÉÉØÖG/)x)Íϰ !øT¥a|y Á0t%Õ|s¼‰{QïÑŽ¦§_xן•Ad6©unCgÅþ׋YìO¶¡‚NF”‹˜/±T\·ÌjQÏló‹h¬¾¶oüð«k¼æê9ß_]/]Í¿k®l°H¦î­'¿N>P¥ŠB‘Ôq"@IÔ3o,1TBõƒTʹê õŒÕO®Q5>ªøèÒ©õð©—Žçµ.C±ŠU]²AÃêñÞ¢,Íãu´úmr8öûð¯ùŠøAp!±€jO €>¼4²ÑÄŸÞPàyã]‡¹•QŒö[r_t‡0{ãkÔôÉðÕ«ÉLã:óRø{—õ)œú×pãr™×¦ªgÜ|Ñ£0%ïuÍ ihÖ]á|Îd;"ÈuIÄcV4Gn¼ ,ÒÇD³õð`•íVqýÓYÎï]ýÞµÅ6¢ h¢8Ûœ’ɨpOU¥ððk~ëÉsxšAD5 ~ÃT  ðñÕÑÉ«oN>žmKãÝÛ—uiœ×\Æ´°=ã͇g~¨›jƺÂé*¬¬–´–Ûá5ÜSuäÆ7ÓÌKâÙ¥vÞŒ2<üR„¿J6H52`i.÷Æ“ù)õ Aƒ·$ZF[9‡k¶6Sw¼ÕNA*¿ñ ¶aÝ… G‹W˜xU›&¿w¯ßaêYm"ï¼iú¯Typ[›Ô§…3/IK«Z…Æ5Ö9éñës¿ðúJÏûáVÏ“±¿Í6XHzµ–Mêmµ8wGõŸÿZUüúii…Œuc s:ÌÚÃ_‰"^mMçq‚ðE}¿2•ß¼8ªO *Ë€jϧn€»[Ì›²Í}oH? Üù9r7´J›T™RØÑ¨Îd…ÙÇèêC¶#G$Ž„ØZ?Dcíf#ÍÒÖ%©ˆ§­éJIÀr¡6•ÁA^Ë¿Ua)ÖšûØØû"HüâOÒy} TÛô*œ”ddu*g©—em:˜²w†î3­@K\kééø Á¥ ¸ªø¥Ös³À×=@ývÃꃥ×4¬A«a Ïøë¶^xg½öÀlpAÿçïü1\šÏÑxpˆªNËXá|»#ë<¢äiÕa¾žçÿVïÅé—f·š.ðìY4þâ¥õž–å•ãhéq‰ BÇ<é}zuqüæäíGm$`þ›§ô º_ž?(• t©©ªB]Õ¶¹BU$‡Â¯˜iQ“§Kæ- sk‚¯âX— ms†Ï©dÆgM¶&Ⱦ¨µËV‡Ü¿¯üôCÍbw±5­:Î_z³BòF}Z¯ÂíŒ+¢Ïáw[“Âk)þàÅ~´ý°„þ»[l2›”·v±+ÞCè1ãx;!V FÕ'uFÀá»!åÏGíóhwEr·ü9LÊôÌõxÞNˆºKMujÜ3HãÙ1ƒð%Ï>z\v—<ùá3ñíUÉû¡–ùb<Ź€£bÒÔóD¿ÑŒ$óÈëÜŸx‰–*54Öe6–ZU$A³¥žÄP‘—_xÉØ]ê!jtîõEPpþ™“(¨ê•1Gdåx˜ ®*ÅÆ ZNá£7ó®ëåšÎ%Š’•@1ª¬k^^X?•[¥"#·Z~„±@È(Ý’,hnÒÍášñ. 8óÅy;vãU"Q‰Ô!€2Ý5'sòk-©!Ž ¦º ayÁ“‰ê ±Ñ)äYU ´À¾ €ª*»¹…ÇéµX.W6›—.Ê„@¦qÁ þ£{E*LJЄT©?4>ÜE"…­ªKçf'Dêæ-èz:´ñ&ñ£–(˜e¯B“—\ÙæÙÝ‚äËÀ ¿lCà˜«`j‘ð± #ÐÇqJ +šŒ4,ÛD‰‡ƒ´êÖÈ¡ ÀøÖC´|¹L¬mœ:AÐk.™õªcÛÊ~…,Öü¨;‡Õ±ø較 sby¿+"R[)ÿÌX±zܳ¤©@àR?`æÉ?_ývnhË:C=ÍÆš LÆ)¦Yõo]|º n¾»¿uÔ‹ú÷îÛ¼%ZÐÏx¾ð4jÝI­‡AßAþ¢Ê> \8`« @cÕé="+þR¬—žñ ëX)æè¢È7Ý®Ð󽛎ç^R¬ö¯°ž×˜iy‘ÆžWïFØnFÁõxKÍô1WgA^Y(åüõÅÃŽW±· @'¢ZñHš{áÞûã8BENlybý´ô\´è§©˜Æ#ö'Ò›” cáøÞ_ÿbyá¥GaÁ0Í{Ÿñ´@µXà´ŒožÅ"iŽütê{Á¤Þš¼—5~p<–>pçy÷¢…P‹ùYÅFš@¥Ûï˜ó9µåvÁÀV BÉ©™üþÓ»¡zRŒ%ÆNáv^áyQ'a*Þ`Ù„Z5b…0Œ®µr«¥gþþŸÆiÍBkê¢÷£weé_óFFàAóÖ§q†aûZìÍ3Èj®§mMê-ÃEøn}jgšÛã:•r¨?™cwìF¼Ô´s*(‹bléy(‚9ñ˜Òlð7µt¶Ÿ€1×R?¸Z™Žy½Ô l žhÉæWõ7F?YŸ²Ê3ž,LÖW‡d,Ò6Ra­àÍi.ͯþ²h#÷…ô7Ñ Œ™e)0œ¸sÐEZ]§abK#™ããs­XÄØ(Xúš1OaY«YSËÀ0ä~|]ËÚþ-Ça=ŸÓ2ZÊæEÐBs"~:{û«5-Þ=æá<&PH×6}NÝ ˜i¢$=#‘§r€ñ¥&@LÊæùºe8â®ÝbOZ»×°¹;]†4¬>üȼRîCŒ•‡Û$ë-‘B]ÌÆe‚aáKo W‚*XÏMÝN2ô¨VZo>ãØw½–ÑGOâR` ¥s«¥yY¥L‘Œ]L<¾tëáwaŸõn GÀòŠú|Ç$è nIDö­¡Jm¦œG›XK޽‰æ!°aÔØ`YpRž%®dgèZç5öÞ­ó^‹üÞ J™€’kÂ< ròÚ¯³ô‘ýµ5ü4Š5uÖx=˜µ&„xÖ*²œù¤)+Â>ÛSØ*pDPñ9][Ž5h û±®ƒŒñe#Ú×EsÑ49s3 €þ¼¬õxÂM¤<›Pû•§¯†³±d~k]á™ùÙJ† Ðã VT™–ùuÏQŒû­1½9n“§“½.'È™û’Ï<¼&rµ$(õ®YzÔŠ»àà6HÉ­eÔæûæ¥âÎ öZxU@ÎÙŽZýkd 1Ì~Ø1úC‘¢¹H6”KW¢pK¥s%:e¨ô8Ń·¤qîŽŽŠ© )”ëN [‡‰ç1³#Ó:ÖÖ>nI׉bBÛѼµä³¹[ ó*ÑY_˜W™Ù,8¤&™¹K‰Üþý­ª!÷Í%#YZÞdæÕÓRŠ=æDz²©;æÌ+xùé7‘liüx2_ø“±–Ë€¾ƒ^¯a ÌU‚¹æÏ0×SñA‹ ñÏn£¨¦‚¸Á¸!â¯u$8óè=ý~ 0fETû—‰ƒZt s(jIi•Ìõ#¢RÆ3×fàéæñœ¼ ˆà®˜iµ *½S?NÒRq|DŸSiì¸Vl²hÉ\ÛfÐ:6Ûu…ÖœE ßåêhÝî²Á¢ô©htã5ÑÚ4Ö²†õFÙ¼êi×­rÁEMBXBCk‹ûA’ù…#®'!Ñ_=#–Và…³tnáúÌtϘ–žÄa> Ìçü€=V\cA‹@.D“šÍù”ç-ÙW¡Ô\ϼ»’û(ÈQÐ¥¨ÚT›‘*à™3öŽ‘Ÿ^€æ]$«Q9¿Ùœÿ‘ eüÅ—ÞÃùéÅ<æÜ»Žuæ«Mî[l¦|A{Wz¨BÈ™jZ‰y¹>h^æ¡ñ¬Z!د4è˯ڋÍy„š(ÁU4)²™ù ¿ùÔ–©~[“K/^h©$}ckËÉý±X#”ŠA¡æÆ¼Â'?Y¹ÁñŸÿ¬é¥[Z;Ÿ Šîo1ó à鬵 ý˜óQE€™Š’¥Ô;£Ÿ>hWD¥—Ëb#¢ bô·z àD+^ÍÇûµÜÑÀ˜©k8p\Î Ô§Í+ÁééwpŽk_XDCú… £Š$V£’{ÖÜWF$>mÑ w„:[W$òð­…ºÊØdþåÝiíãrLk—_êç{ÿB®Ò QàHS׎©l—-] QJE2çoßï`B¨ÍmEe Ÿþ¯Z‰y~(‚ç[JúýOSµ(Ú\0} | ëÖ®rÿáõÛý¦Gï̳ ©¸ìhQ;+‘ž©·‰«øô‡èÊnYgz_ds7µÜ,4ª3—`ôôØ ¿jÏ‹ÈáÖ.<ñ‡Æ˜ˆ,q‹ý¥Íi䵜êmnWó}ÿMBÍ¿:y{þ“Š5¯ eþƒn›æ(šÜÈOÜ`9wGY˜Múú–÷9]`–Iì^=ŸbO<‹þ¨þb·øSþ;µÎëô˜–ŽçQÜÄЋƒ¥»³Ø]άäröüúÅAëÐñCþÛ ý­5È òÅAï°ëôéWô’¯<â¾¾&xmM£ç`§4çSøâÀ>´»-$wËôí;§gw´ùÑüqâ˜L1›ƒÓ•Ó’£k»ƒöšy 䈦óÔö/ÏçpÔa¸þ8]ÝüÌnÑÿ9ü¿Ýÿµ{|ÒéwìÞàU»uÿïôgþô@à&>–™ÈÏ0îÅ·yù‘ ¯pSøeb¹ØÁ3`›|~PØK[üM¿º±t4úcÈäÜ*þ6‰Æ+L6hަú‡ÿPKlCÀÌR°€n PKcK^Æ2 ''mimetypePKcKðb,b,MThumbnails/thumbnail.pngPKcK!a#;µ å,layout-cachePKcKö>éú8¦¾5Z2Pictures/200003C2000013AF00001785709598E2CA529DB9.svmPKcK_UÂÓfBT5õNPictures/20000105000011470000108C23467976F5D02F5B.svmPKcKûÿŽX¤X¤5¾aPictures/10000000000001AE000001D36B511361F44DAAA6.gifPKcKÜ׺…hshs5iPictures/10000000000000DD000001ABB128168F3FFFDB27.gifPKcK“È–]$&$&5$zPictures/10000000000000DC000000EB2D485DFD9111EC9B.pngPKcK~¡2•2•5› Pictures/10000000000000F4000001EAEA0EA99BA9359CD2.gifPKcKìa·â%â%5 6Pictures/10000000000000C6000000C143C1F71DF62AFF4F.pngPKcK3é…Ÿ&Ÿ&5U\Pictures/10000000000001E100000118B3A2F8FAD46BDA31.gifPKcKûSÑ–((5GƒPictures/100000000000029F000001A191A0C2963F9E391C.jpgPKcK¶SÈe5e55‘Pictures/10000000000000D9000000FF644ACCE55DFA25EF.pngPKcKAuw°··5zÇPictures/100000000000033E000001AB590C68E959954610.gifPKcKµWP'P'5„ßPictures/10000000000004000000032A7EE6CB0B8CEC342C.gifPKcKÖ-hCICI5' Pictures/10000000000003EA00000276796ACF2790C00891.gifPKcKswˆ}i8i85½P Pictures/1000000000000200000001803172F0E116A9319F.gifPKcKÍ+ô ‚‚5y‰ Pictures/100000000000004C0000004C51CE250538658B6F.gifPKcKðÎèžFF5NŒ Pictures/10000000000002D80000006E390DCBD9D174C1FD.gifPKcK:ñü,,5ç§ Pictures/10000000000000C50000010032EB602B04E5DFB3.gifPKcKš»í í 5f¸ Pictures/10000002000002580000005CD474168E30D0D026.gifPKcKFÞ²¾ææ5¦Å Pictures/100000000000019100000119D9E03096E1309A93.gifPKcK§´;Ú;Ú5ߨ Pictures/100000000000028A00000273928E004F9825EB8B.gifPKcKИ¡I‰‰5m³ Pictures/1000000000000192000001194F63DB11C3996D8C.gifPKcKyAÏýÃèÃè5IÆ Pictures/10000000000002EE000001AB4DDB7D54D46C4B2B.gifPKcKzͽ+[+[5_¯Pictures/100000000000030D0000005E8DDE14430AAC5E90.gifPKcK×ön§n§5Ý Pictures/100000000000032A0000029B50A046E60062C89D.gifPKcKmÛPþf¾f5ž²Pictures/10000000000000DF000001AD6DDF5FC0606CA9C9.gifPKcK}Æóñãã5¯Pictures/100000000000041C000002BD6703B60CEF55120B.gifPKcK·FÒ4ß4ß5å"Pictures/10000000000002CA0000029B3D4CEDFC1CEA29C5.gifPKcKLÉV ,<ç lstyles.xmlPKcKÒEa“ ) Ðsettings.xmlPKcKÀgt–öx meta.xmlPKcKŠñ²ÿƒ L manifest.rdfPKcK‰!Configurations2/statusbar/PKcKÁ!Configurations2/toolbar/PKcK÷!Configurations2/progressbar/PKcK1"Configurations2/popupmenu/PKcKi"Configurations2/images/Bitmaps/PKcK¦"Configurations2/toolpanel/PKcK'Þ"Configurations2/accelerator/current.xmlPKcK5#Configurations2/floater/PKcKk#Configurations2/menubar/PKcKÊTŽXa¡#META-INF/manifest.xmlPKcKlCÀÌR°€n <'content.xmlPK--Ç×gtkwave-3.3.86/doc/Makefile.in0000664000175000017500000003521613166335473015425 0ustar bybellbybell# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = doc DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(dist_pkgdata_DATA) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgdatadir)" DATA = $(dist_pkgdata_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AET2_CFLAGS = @AET2_CFLAGS@ AET2_LDADD = @AET2_LDADD@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COCOA_GTK_CFLAGS = @COCOA_GTK_CFLAGS@ COCOA_GTK_LDADD = @COCOA_GTK_LDADD@ COCOA_GTK_LDFLAGS = @COCOA_GTK_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ EXTDEBUG = @EXTDEBUG@ EXTDEBUG2 = @EXTDEBUG2@ EXTDEBUG3 = @EXTDEBUG3@ EXTDEBUG4 = @EXTDEBUG4@ EXTLOAD_CFLAGS = @EXTLOAD_CFLAGS@ FASTTREE_CFLAGS = @FASTTREE_CFLAGS@ FSDB_CFLAGS = @FSDB_CFLAGS@ FSDB_LDADD = @FSDB_LDADD@ GCONF_CFLAGS = @GCONF_CFLAGS@ GCONF_LIBS = @GCONF_LIBS@ GEDITTEST = @GEDITTEST@ GEDIT_CFLAGS = @GEDIT_CFLAGS@ GPERF = @GPERF@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_CFLAGS = @GTK_MAC_CFLAGS@ GTK_MAC_LIBS = @GTK_MAC_LIBS@ GTK_UNIX_PRINT_CFLAGS = @GTK_UNIX_PRINT_CFLAGS@ GTK_UNIX_PRINT_LIBS = @GTK_UNIX_PRINT_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBBZ2_CFLAGS = @LIBBZ2_CFLAGS@ LIBBZ2_DIR = @LIBBZ2_DIR@ LIBBZ2_LDADD = @LIBBZ2_LDADD@ LIBJUDY_CFLAGS = @LIBJUDY_CFLAGS@ LIBJUDY_LDADD = @LIBJUDY_LDADD@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBXZ_CFLAGS = @LIBXZ_CFLAGS@ LIBXZ_LDADD = @LIBXZ_LDADD@ LIBZ_CFLAGS = @LIBZ_CFLAGS@ LIBZ_DIR = @LIBZ_DIR@ LIBZ_LDADD = @LIBZ_LDADD@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MINGW_LDADD = @MINGW_LDADD@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ STRUCT_PACK = @STRUCT_PACK@ TCL_DEFADD = @TCL_DEFADD@ TCL_INCLUDE_SPEC = @TCL_INCLUDE_SPEC@ TCL_LDADD = @TCL_LDADD@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_MAJOR_VERSION = @TCL_MAJOR_VERSION@ TCL_MINOR_VERSION = @TCL_MINOR_VERSION@ TK_INCLUDE_SPEC = @TK_INCLUDE_SPEC@ TK_LDADD = @TK_LDADD@ TK_LIB_SPEC = @TK_LIB_SPEC@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ VERSION = @VERSION@ XDGDATADIR = @XDGDATADIR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ dist_pkgdata_DATA = gtkwave.odt all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-dist_pkgdataDATA: $(dist_pkgdata_DATA) @$(NORMAL_INSTALL) @list='$(dist_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \ done uninstall-dist_pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(dist_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(pkgdatadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dist_pkgdataDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_pkgdataDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dist_pkgdataDATA install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-dist_pkgdataDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gtkwave-3.3.86/INSTALL0000664000175000017500000003660513166335473013647 0ustar bybellbybellInstallation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2012 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `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 `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-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 `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 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. Running `configure' might take a while. 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, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `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. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note 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 can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer 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. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' 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. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX `make' updates targets which have the same time stamps as their prerequisites, which makes it generally unusable when shipped generated files such as `configure' are involved. Use GNU `make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `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, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--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' 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 `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `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'. `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 `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 `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 `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf limitation. Until the limitation is lifted, you can use this workaround: CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--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. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-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). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. gtkwave-3.3.86/wave_locale.h0000664000175000017500000000164113166335473015240 0ustar bybellbybell#ifndef __WAVE_LOCALE_H__ #define __WAVE_LOCALE_H__ #include "config.h" #ifdef __MINGW32__ #include "locale.h" #define WAVE_LOCALE_FIX {setlocale(LC_ALL, "C"); } #else #if HAVE_SETENV && HAVE_UNSETENV #define WAVE_LOCALE_FIX \ { \ char *wlve = getenv("LANG"); \ if(wlve) \ { \ if(strcmp(wlve, "C")) \ { \ setenv("LC_NUMERIC", "C", 1); \ setenv("LC_COLLATE", "C", 1); \ setenv("LC_CTYPE", "C", 1); \ } \ } \ wlve = getenv("LC_ALL"); \ if(wlve) \ { \ if(strcmp(wlve, "C")) \ { \ unsetenv("LC_ALL"); \ } \ } \ } #else #define WAVE_LOCALE_FIX \ { \ putenv(strdup("LANG=C")); \ putenv(strdup("LC_NUMERIC=C")); \ putenv(strdup("LC_COLLATE=C")); \ putenv(strdup("LC_CTYPE=C")); \ putenv(strdup("LC_ALL=C")); \ } #endif #endif #endif /* __WAVE_LOCALE_H__*/ gtkwave-3.3.86/COPYING0000664000175000017500000004325513166335473013650 0ustar bybellbybell GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser 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. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. 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. 1. 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. 2. 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: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) 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. c) 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. 3. 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: a) 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, b) 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, c) 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. 4. 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. 5. 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. 6. 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. 7. 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. 8. 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. 9. 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. 10. 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 11. 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. 12. 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 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. Copyright (C) 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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) year 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. , 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 Lesser General Public License instead of this License. gtkwave-3.3.86/missing0000775000175000017500000001533113166335473014206 0ustar bybellbybell#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2012-06-26.16; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # 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, 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'automa4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: gtkwave-3.3.86/Makefile.am0000664000175000017500000000025513166335473014642 0ustar bybellbybell## -*- makefile -*- ## SUBDIRS= doc examples man src contrib share EXTRA_DIST= ChangeLog COPYING INSTALL LICENSE.TXT README NEWS AUTHORS \ autogen.sh wave_locale.h tcl.m4